diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5176033 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +ROPSTEN_PRIVATE_KEY= +INFURA_API_KEY= +NEXT_PUBLIC_CONTRACT_ADDRESS= \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5068c71..bd2f675 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ typechain/ artifacts/ coverage* .env +.next +.github +.vscode \ No newline at end of file diff --git a/.next/build-manifest.json b/.next/build-manifest.json new file mode 100644 index 0000000..901f188 --- /dev/null +++ b/.next/build-manifest.json @@ -0,0 +1,34 @@ +{ + "polyfillFiles": [ + "static/chunks/polyfills.js" + ], + "devFiles": [ + "static/chunks/react-refresh.js" + ], + "ampDevFiles": [ + "static/chunks/webpack.js", + "static/chunks/amp.js" + ], + "lowPriorityFiles": [ + "static/development/_buildManifest.js", + "static/development/_ssgManifest.js" + ], + "pages": { + "/": [ + "static/chunks/webpack.js", + "static/chunks/main.js", + "static/chunks/pages/index.js" + ], + "/_app": [ + "static/chunks/webpack.js", + "static/chunks/main.js", + "static/chunks/pages/_app.js" + ], + "/_error": [ + "static/chunks/webpack.js", + "static/chunks/main.js", + "static/chunks/pages/_error.js" + ] + }, + "ampFirstPages": [] +} \ No newline at end of file diff --git a/.next/react-loadable-manifest.json b/.next/react-loadable-manifest.json new file mode 100644 index 0000000..2bd0f1e --- /dev/null +++ b/.next/react-loadable-manifest.json @@ -0,0 +1,8 @@ +{ + "./dev/noop": [ + { + "id": "./node_modules/next/dist/client/dev/noop.js", + "file": "static/chunks/0.js" + } + ] +} \ No newline at end of file diff --git a/.next/server/init-server.js.js b/.next/server/init-server.js.js new file mode 100644 index 0000000..6a622a2 --- /dev/null +++ b/.next/server/init-server.js.js @@ -0,0 +1,116 @@ +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 +/******/ var threw = true; +/******/ try { +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // 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 = "./node_modules/next/dist/build/webpack/loaders/next-plugin-loader.js?middleware=on-init-server!./"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/next/dist/build/webpack/loaders/next-plugin-loader.js?middleware=on-init-server!./": +/*!******************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-plugin-loader.js?middleware=on-init-server ***! + \******************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); + + + + /* harmony default export */ __webpack_exports__["default"] = (function (ctx) { + return Promise.all([]) + }); + + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1wbHVnaW4tbG9hZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxJQUFJO1FBQ0o7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckZBLElBQW1CO0FBQ25CO0FBQ0EsS0FBSyIsImZpbGUiOiJpbml0LXNlcnZlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdHZhciB0aHJldyA9IHRydWU7XG4gXHRcdHRyeSB7XG4gXHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbiBcdFx0fSBmaW5hbGx5IHtcbiBcdFx0XHRpZih0aHJldykgZGVsZXRlIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHR9XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LXBsdWdpbi1sb2FkZXIuanM/bWlkZGxld2FyZT1vbi1pbml0LXNlcnZlciEuL1wiKTtcbiIsIlxuICAgIFxuXG4gICAgZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGN0eCkge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtdKVxuICAgIH1cbiAgIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.next/server/on-error-server.js.js b/.next/server/on-error-server.js.js new file mode 100644 index 0000000..2b10b25 --- /dev/null +++ b/.next/server/on-error-server.js.js @@ -0,0 +1,116 @@ +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 +/******/ var threw = true; +/******/ try { +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // 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 = "./node_modules/next/dist/build/webpack/loaders/next-plugin-loader.js?middleware=on-error-server!./"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/next/dist/build/webpack/loaders/next-plugin-loader.js?middleware=on-error-server!./": +/*!*******************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-plugin-loader.js?middleware=on-error-server ***! + \*******************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); + + + + /* harmony default export */ __webpack_exports__["default"] = (function (ctx) { + return Promise.all([]) + }); + + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1wbHVnaW4tbG9hZGVyLmpzP2YzOWMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyRkEsSUFBbUI7QUFDbkI7QUFDQSxLQUFLIiwiZmlsZSI6Im9uLWVycm9yLXNlcnZlci5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdHZhciB0aHJldyA9IHRydWU7XG4gXHRcdHRyeSB7XG4gXHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbiBcdFx0fSBmaW5hbGx5IHtcbiBcdFx0XHRpZih0aHJldykgZGVsZXRlIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHR9XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LXBsdWdpbi1sb2FkZXIuanM/bWlkZGxld2FyZT1vbi1lcnJvci1zZXJ2ZXIhLi9cIik7XG4iLCJcbiAgICBcblxuICAgIGV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChjdHgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXSlcbiAgICB9XG4gICJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/server/pages-manifest.json b/.next/server/pages-manifest.json new file mode 100644 index 0000000..55d8ed9 --- /dev/null +++ b/.next/server/pages-manifest.json @@ -0,0 +1,6 @@ +{ + "/_app": "pages/_app.js", + "/_error": "pages/_error.js", + "/_document": "pages/_document.js", + "/": "pages/index.js" +} \ No newline at end of file diff --git a/.next/server/pages/_app.js b/.next/server/pages/_app.js new file mode 100644 index 0000000..b3c2db5 --- /dev/null +++ b/.next/server/pages/_app.js @@ -0,0 +1,213 @@ +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = require('../ssr-module-cache.js'); +/******/ +/******/ // 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 +/******/ var threw = true; +/******/ try { +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // 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 = 0); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./node_modules/semantic-ui-css/semantic.min.css": +/*!*******************************************************!*\ + !*** ./node_modules/semantic-ui-css/semantic.min.css ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + + + +/***/ }), + +/***/ "./src/pages/_app.tsx": +/*!****************************!*\ + !*** ./src/pages/_app.tsx ***! + \****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "react/jsx-dev-runtime"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/head */ "next/head"); +/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_head__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var semantic_ui_css_semantic_min_css__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! semantic-ui-css/semantic.min.css */ "./node_modules/semantic-ui-css/semantic.min.css"); +/* harmony import */ var semantic_ui_css_semantic_min_css__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(semantic_ui_css_semantic_min_css__WEBPACK_IMPORTED_MODULE_3__); + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\_app.tsx"; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + + + + + +function MyApp({ + Component, + pageProps +}) { + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["Fragment"], { + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(next_head__WEBPACK_IMPORTED_MODULE_2___default.a, { + children: /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("title", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 10, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 9, + columnNumber: 7 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(Component, _objectSpread({}, pageProps), void 0, false, { + fileName: _jsxFileName, + lineNumber: 12, + columnNumber: 7 + }, this)] + }, void 0, true); +} + +/* harmony default export */ __webpack_exports__["default"] = (MyApp); + +/***/ }), + +/***/ 0: +/*!*****************************************!*\ + !*** multi private-next-pages/_app.tsx ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! private-next-pages/_app.tsx */"./src/pages/_app.tsx"); + + +/***/ }), + +/***/ "next/head": +/*!****************************!*\ + !*** external "next/head" ***! + \****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/head"); + +/***/ }), + +/***/ "react": +/*!************************!*\ + !*** external "react" ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("react"); + +/***/ }), + +/***/ "react/jsx-dev-runtime": +/*!****************************************!*\ + !*** external "react/jsx-dev-runtime" ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("react/jsx-dev-runtime"); + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL19hcHAudHN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcIm5leHQvaGVhZFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicmVhY3QvanN4LWRldi1ydW50aW1lXCIiXSwibmFtZXMiOlsiTXlBcHAiLCJDb21wb25lbnQiLCJwYWdlUHJvcHMiXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxJQUFJO1FBQ0o7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RkE7QUFFQTtBQUNBOztBQUVBLFNBQVNBLEtBQVQsQ0FBZTtBQUFFQyxXQUFGO0FBQWFDO0FBQWIsQ0FBZixFQUFvRTtBQUNsRSxzQkFDRTtBQUFBLDRCQUNFLHFFQUFDLGdEQUFEO0FBQUEsNkJBQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFERjtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBREYsZUFJRSxxRUFBQyxTQUFELG9CQUFlQSxTQUFmO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFKRjtBQUFBLGtCQURGO0FBUUQ7O0FBRWNGLG9FQUFmLEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaEJBLHNDOzs7Ozs7Ozs7OztBQ0FBLGtDOzs7Ozs7Ozs7OztBQ0FBLGtEIiwiZmlsZSI6InBhZ2VzL19hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHJlcXVpcmUoJy4uL3Nzci1tb2R1bGUtY2FjaGUuanMnKTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0dmFyIHRocmV3ID0gdHJ1ZTtcbiBcdFx0dHJ5IHtcbiBcdFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbiBcdFx0XHR0aHJldyA9IGZhbHNlO1xuIFx0XHR9IGZpbmFsbHkge1xuIFx0XHRcdGlmKHRocmV3KSBkZWxldGUgaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdH1cblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IEFwcFByb3BzIH0gZnJvbSAnbmV4dC9hcHAnO1xyXG5pbXBvcnQgSGVhZCBmcm9tICduZXh0L2hlYWQnO1xyXG5pbXBvcnQgJ3NlbWFudGljLXVpLWNzcy9zZW1hbnRpYy5taW4uY3NzJ1xyXG5cclxuZnVuY3Rpb24gTXlBcHAoeyBDb21wb25lbnQsIHBhZ2VQcm9wcyB9OiBBcHBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxIZWFkPlxyXG4gICAgICAgIDx0aXRsZT5Sb3BzdGVuIEZhdWNldDwvdGl0bGU+XHJcbiAgICAgIDwvSGVhZD5cclxuICAgICAgPENvbXBvbmVudCB7Li4ucGFnZVByb3BzfSAvPlxyXG4gICAgPC8+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTXlBcHA7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5leHQvaGVhZFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFjdC9qc3gtZGV2LXJ1bnRpbWVcIik7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.next/server/pages/_document.js b/.next/server/pages/_document.js new file mode 100644 index 0000000..1a262b7 --- /dev/null +++ b/.next/server/pages/_document.js @@ -0,0 +1,1479 @@ +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = require('../ssr-module-cache.js'); +/******/ +/******/ // 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 +/******/ var threw = true; +/******/ try { +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // 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 = 2); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../next-server/lib/constants": +/*!*********************************************************!*\ + !*** external "next/dist/next-server/lib/constants.js" ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/lib/constants.js"); + +/***/ }), + +/***/ "../next-server/lib/document-context": +/*!****************************************************************!*\ + !*** external "next/dist/next-server/lib/document-context.js" ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/lib/document-context.js"); + +/***/ }), + +/***/ "../next-server/lib/head-manager-context": +/*!********************************************************************!*\ + !*** external "next/dist/next-server/lib/head-manager-context.js" ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/lib/head-manager-context.js"); + +/***/ }), + +/***/ "../next-server/lib/utils": +/*!*****************************************************!*\ + !*** external "next/dist/next-server/lib/utils.js" ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/lib/utils.js"); + +/***/ }), + +/***/ "../next-server/server/get-page-files": +/*!*****************************************************************!*\ + !*** external "next/dist/next-server/server/get-page-files.js" ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/server/get-page-files.js"); + +/***/ }), + +/***/ "../next-server/server/utils": +/*!********************************************************!*\ + !*** external "next/dist/next-server/server/utils.js" ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/server/utils.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/extends.js": +/*!********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/extends.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _extends() { + module.exports = _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); +} + +module.exports = _extends; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireWildcard.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +module.exports = _interopRequireWildcard; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js ***! + \*****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +module.exports = _objectWithoutPropertiesLoose; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/typeof.js": +/*!*******************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +module.exports = _typeof; + +/***/ }), + +/***/ "./node_modules/next/dist/client/experimental-script.js": +/*!**************************************************************!*\ + !*** ./node_modules/next/dist/client/experimental-script.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.initScriptLoader = initScriptLoader; +exports.default = void 0; + +var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/extends.js")); + +var _objectWithoutPropertiesLoose2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js")); + +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); + +var _headManagerContext = __webpack_require__(/*! ../next-server/lib/head-manager-context */ "../next-server/lib/head-manager-context"); + +var _headManager = __webpack_require__(/*! ./head-manager */ "./node_modules/next/dist/client/head-manager.js"); + +var _requestIdleCallback = __webpack_require__(/*! ./request-idle-callback */ "./node_modules/next/dist/client/request-idle-callback.js"); + +const ScriptCache = new Map(); +const LoadCache = new Set(); +const ignoreProps = ['onLoad', 'dangerouslySetInnerHTML', 'children', 'onError', 'strategy', 'preload']; + +const loadScript = props => { + const { + src, + id, + onLoad = () => {}, + dangerouslySetInnerHTML, + children = '', + onError + } = props; + const cacheKey = id || src; + + if (ScriptCache.has(src)) { + if (!LoadCache.has(cacheKey)) { + LoadCache.add(cacheKey); // Execute onLoad since the script loading has begun + + ScriptCache.get(src).then(onLoad, onError); + } + + return; + } + + const el = document.createElement('script'); + const loadPromise = new Promise((resolve, reject) => { + el.addEventListener('load', function () { + resolve(); + + if (onLoad) { + onLoad.call(this); + } + }); + el.addEventListener('error', function () { + reject(); + + if (onError) { + onError(); + } + }); + }); + + if (src) { + ScriptCache.set(src, loadPromise); + LoadCache.add(cacheKey); + } + + if (dangerouslySetInnerHTML) { + el.innerHTML = dangerouslySetInnerHTML.__html || ''; + } else if (children) { + el.textContent = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : ''; + } else if (src) { + el.src = src; + } + + for (const [k, value] of Object.entries(props)) { + if (value === undefined || ignoreProps.includes(k)) { + continue; + } + + const attr = _headManager.DOMAttributeNames[k] || k.toLowerCase(); + el.setAttribute(attr, value); + } + + document.body.appendChild(el); +}; + +function handleClientScriptLoad(props) { + const { + strategy = 'defer' + } = props; + + if (strategy === 'defer') { + loadScript(props); + } else if (strategy === 'lazy') { + window.addEventListener('load', () => { + (0, _requestIdleCallback.requestIdleCallback)(() => loadScript(props)); + }); + } +} + +function loadLazyScript(props) { + if (document.readyState === 'complete') { + (0, _requestIdleCallback.requestIdleCallback)(() => loadScript(props)); + } else { + window.addEventListener('load', () => { + (0, _requestIdleCallback.requestIdleCallback)(() => loadScript(props)); + }); + } +} + +function initScriptLoader(scriptLoaderItems) { + scriptLoaderItems.forEach(handleClientScriptLoad); +} + +function Script(props) { + const { + src = '', + onLoad = () => {}, + dangerouslySetInnerHTML, + children = '', + strategy = 'defer', + onError, + preload = false + } = props, + restProps = (0, _objectWithoutPropertiesLoose2.default)(props, ["src", "onLoad", "dangerouslySetInnerHTML", "children", "strategy", "onError", "preload"]); // Context is available only during SSR + + const { + updateScripts, + scripts + } = (0, _react.useContext)(_headManagerContext.HeadManagerContext); + (0, _react.useEffect)(() => { + if (strategy === 'defer') { + loadScript(props); + } else if (strategy === 'lazy') { + loadLazyScript(props); + } + }, [props, strategy]); + + if (true) { + return null; + } + + if (strategy === 'dangerouslyBlockRendering') { + const syncProps = (0, _extends2.default)({}, restProps); + + for (const [k, value] of Object.entries({ + src, + onLoad, + onError, + dangerouslySetInnerHTML, + children + })) { + if (!value) { + continue; + } + + if (k === 'children') { + syncProps.dangerouslySetInnerHTML = { + __html: typeof value === 'string' ? value : Array.isArray(value) ? value.join('') : '' + }; + } else { + ; + syncProps[k] = value; + } + } + + return /*#__PURE__*/_react.default.createElement("script", syncProps); + } else if (strategy === 'defer') { + if (updateScripts && preload) { + scripts.defer = (scripts.defer || []).concat([src]); + updateScripts(scripts); + } + } else if (strategy === 'eager') { + if (updateScripts) { + scripts.eager = (scripts.eager || []).concat([(0, _extends2.default)({ + src, + onLoad, + onError + }, restProps)]); + updateScripts(scripts); + } + } + + return null; +} + +var _default = Script; +exports.default = _default; + +/***/ }), + +/***/ "./node_modules/next/dist/client/head-manager.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/client/head-manager.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; +exports.default = initHeadManager; +exports.DOMAttributeNames = void 0; +const DOMAttributeNames = { + acceptCharset: 'accept-charset', + className: 'class', + htmlFor: 'for', + httpEquiv: 'http-equiv', + noModule: 'noModule' +}; +exports.DOMAttributeNames = DOMAttributeNames; + +function reactElementToDOM({ + type, + props +}) { + const el = document.createElement(type); + + for (const p in props) { + if (!props.hasOwnProperty(p)) continue; + if (p === 'children' || p === 'dangerouslySetInnerHTML') continue; // we don't render undefined props to the DOM + + if (props[p] === undefined) continue; + const attr = DOMAttributeNames[p] || p.toLowerCase(); + + if (type === 'script' && (attr === 'async' || attr === 'defer' || attr === 'noModule')) { + ; + el[attr] = !!props[p]; + } else { + el.setAttribute(attr, props[p]); + } + } + + const { + children, + dangerouslySetInnerHTML + } = props; + + if (dangerouslySetInnerHTML) { + el.innerHTML = dangerouslySetInnerHTML.__html || ''; + } else if (children) { + el.textContent = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : ''; + } + + return el; +} + +function updateElements(type, components) { + const headEl = document.getElementsByTagName('head')[0]; + const headCountEl = headEl.querySelector('meta[name=next-head-count]'); + + if (true) { + if (!headCountEl) { + console.error('Warning: next-head-count is missing. https://nextjs.org/docs/messages/next-head-count-missing'); + return; + } + } + + const headCount = Number(headCountEl.content); + const oldTags = []; + + for (let i = 0, j = headCountEl.previousElementSibling; i < headCount; i++, j = j.previousElementSibling) { + if (j.tagName.toLowerCase() === type) { + oldTags.push(j); + } + } + + const newTags = components.map(reactElementToDOM).filter(newTag => { + for (let k = 0, len = oldTags.length; k < len; k++) { + const oldTag = oldTags[k]; + + if (oldTag.isEqualNode(newTag)) { + oldTags.splice(k, 1); + return false; + } + } + + return true; + }); + oldTags.forEach(t => t.parentNode.removeChild(t)); + newTags.forEach(t => headEl.insertBefore(t, headCountEl)); + headCountEl.content = (headCount - oldTags.length + newTags.length).toString(); +} + +function initHeadManager() { + let updatePromise = null; + return { + mountedInstances: new Set(), + updateHead: head => { + const promise = updatePromise = Promise.resolve().then(() => { + if (promise !== updatePromise) return; + updatePromise = null; + const tags = {}; + head.forEach(h => { + const components = tags[h.type] || []; + components.push(h); + tags[h.type] = components; + }); + const titleComponent = tags.title ? tags.title[0] : null; + let title = ''; + + if (titleComponent) { + const { + children + } = titleComponent.props; + title = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : ''; + } + + if (title !== document.title) document.title = title; + ['meta', 'base', 'link', 'style', 'script'].forEach(type => { + updateElements(type, tags[type] || []); + }); + }); + } + }; +} + +/***/ }), + +/***/ "./node_modules/next/dist/client/request-idle-callback.js": +/*!****************************************************************!*\ + !*** ./node_modules/next/dist/client/request-idle-callback.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; +exports.cancelIdleCallback = exports.requestIdleCallback = void 0; + +const requestIdleCallback = typeof self !== 'undefined' && self.requestIdleCallback || function (cb) { + let start = Date.now(); + return setTimeout(function () { + cb({ + didTimeout: false, + timeRemaining: function () { + return Math.max(0, 50 - (Date.now() - start)); + } + }); + }, 1); +}; + +exports.requestIdleCallback = requestIdleCallback; + +const cancelIdleCallback = typeof self !== 'undefined' && self.cancelIdleCallback || function (id) { + return clearTimeout(id); +}; + +exports.cancelIdleCallback = cancelIdleCallback; + +/***/ }), + +/***/ "./node_modules/next/dist/pages/_document.js": +/*!***************************************************!*\ + !*** ./node_modules/next/dist/pages/_document.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } + +function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +exports.__esModule = true; +exports.Html = Html; +exports.Main = Main; +exports.NextScript = exports.Head = exports.default = void 0; + +var _propTypes = _interopRequireDefault(__webpack_require__(/*! prop-types */ "prop-types")); + +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react")); + +var _server = _interopRequireDefault(__webpack_require__(/*! styled-jsx/server */ "styled-jsx/server")); + +var _constants = __webpack_require__(/*! ../next-server/lib/constants */ "../next-server/lib/constants"); + +var _documentContext = __webpack_require__(/*! ../next-server/lib/document-context */ "../next-server/lib/document-context"); + +var _utils = __webpack_require__(/*! ../next-server/lib/utils */ "../next-server/lib/utils"); + +exports.DocumentContext = _utils.DocumentContext; +exports.DocumentInitialProps = _utils.DocumentInitialProps; +exports.DocumentProps = _utils.DocumentProps; + +var _getPageFiles = __webpack_require__(/*! ../next-server/server/get-page-files */ "../next-server/server/get-page-files"); + +var _utils2 = __webpack_require__(/*! ../next-server/server/utils */ "../next-server/server/utils"); + +var _htmlescape = __webpack_require__(/*! ../server/htmlescape */ "./node_modules/next/dist/server/htmlescape.js"); + +var _experimentalScript = _interopRequireDefault(__webpack_require__(/*! ../client/experimental-script */ "./node_modules/next/dist/client/experimental-script.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +} + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function () { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || typeof obj !== "object" && typeof obj !== "function") { + return { + default: obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj.default = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +function dedupe(bundles) { + const files = new Set(); + const kept = []; + + for (const bundle of bundles) { + if (files.has(bundle.file)) continue; + files.add(bundle.file); + kept.push(bundle); + } + + return kept; +} + +function getDocumentFiles(buildManifest, pathname, inAmpMode) { + const sharedFiles = (0, _getPageFiles.getPageFiles)(buildManifest, '/_app'); + const pageFiles = inAmpMode ? [] : (0, _getPageFiles.getPageFiles)(buildManifest, pathname); + return { + sharedFiles, + pageFiles, + allFiles: [...new Set([...sharedFiles, ...pageFiles])] + }; +} +/** +* `Document` component handles the initial `document` markup and renders only on the server side. +* Commonly used for implementing server side rendering for `css-in-js` libraries. +*/ + + +class Document extends _react.Component { + /** + * `getInitialProps` hook returns the context object with the addition of `renderPage`. + * `renderPage` callback executes `React` rendering logic synchronously to support server-rendering wrappers + */ + static async getInitialProps(ctx) { + const enhanceApp = App => { + return props => /*#__PURE__*/_react.default.createElement(App, props); + }; + + const { + html, + head + } = await ctx.renderPage({ + enhanceApp + }); + const styles = [...(0, _server.default)()]; + return { + html, + head, + styles + }; + } + + static renderDocument(DocumentComponent, props) { + return /*#__PURE__*/_react.default.createElement(_documentContext.DocumentContext.Provider, { + value: props + }, /*#__PURE__*/_react.default.createElement(DocumentComponent, props)); + } + + render() { + return /*#__PURE__*/_react.default.createElement(Html, null, /*#__PURE__*/_react.default.createElement(Head, null), /*#__PURE__*/_react.default.createElement("body", null, /*#__PURE__*/_react.default.createElement(Main, null), /*#__PURE__*/_react.default.createElement(NextScript, null))); + } + +} + +exports.default = Document; +Document.headTagsMiddleware = false ? undefined : () => []; + +function Html(props) { + const { + inAmpMode, + docComponentsRendered, + locale + } = (0, _react.useContext)(_documentContext.DocumentContext); + docComponentsRendered.Html = true; + return /*#__PURE__*/_react.default.createElement("html", Object.assign({}, props, { + lang: props.lang || locale || undefined, + amp: inAmpMode ? '' : undefined, + "data-ampdevmode": inAmpMode && true ? '' : undefined + })); +} + +class Head extends _react.Component { + constructor(...args) { + super(...args); + this.context = void 0; + } + + getCssLinks(files) { + const { + assetPrefix, + devOnlyCacheBusterQueryString, + dynamicImports + } = this.context; + const cssFiles = files.allFiles.filter(f => f.endsWith('.css')); + const sharedFiles = new Set(files.sharedFiles); // Unmanaged files are CSS files that will be handled directly by the + // webpack runtime (`mini-css-extract-plugin`). + + let unmangedFiles = new Set([]); + let dynamicCssFiles = dedupe(dynamicImports.filter(f => f.file.endsWith('.css'))).map(f => f.file); + + if (dynamicCssFiles.length) { + const existing = new Set(cssFiles); + dynamicCssFiles = dynamicCssFiles.filter(f => !(existing.has(f) || sharedFiles.has(f))); + unmangedFiles = new Set(dynamicCssFiles); + cssFiles.push(...dynamicCssFiles); + } + + let cssLinkElements = []; + cssFiles.forEach(file => { + const isSharedFile = sharedFiles.has(file); + + if (true) { + cssLinkElements.push( /*#__PURE__*/_react.default.createElement("link", { + key: `${file}-preload`, + nonce: this.props.nonce, + rel: "preload", + href: `${assetPrefix}/_next/${encodeURI(file)}${devOnlyCacheBusterQueryString}`, + as: "style", + crossOrigin: this.props.crossOrigin || undefined + })); + } + + const isUnmanagedFile = unmangedFiles.has(file); + cssLinkElements.push( /*#__PURE__*/_react.default.createElement("link", { + key: file, + nonce: this.props.nonce, + rel: "stylesheet", + href: `${assetPrefix}/_next/${encodeURI(file)}${devOnlyCacheBusterQueryString}`, + crossOrigin: this.props.crossOrigin || undefined, + "data-n-g": isUnmanagedFile ? undefined : isSharedFile ? '' : undefined, + "data-n-p": isUnmanagedFile ? undefined : isSharedFile ? undefined : '' + })); + }); + + if (false) {} + + return cssLinkElements.length === 0 ? null : cssLinkElements; + } + + getPreloadDynamicChunks() { + const { + dynamicImports, + assetPrefix, + devOnlyCacheBusterQueryString + } = this.context; + return dedupe(dynamicImports).map(bundle => { + if (!bundle.file.endsWith('.js')) { + return null; + } + + return /*#__PURE__*/_react.default.createElement("link", { + rel: "preload", + key: bundle.file, + href: `${assetPrefix}/_next/${encodeURI(bundle.file)}${devOnlyCacheBusterQueryString}`, + as: "script", + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined + }); + }) // Filter out nulled scripts + .filter(Boolean); + } + + getPreloadMainLinks(files) { + const { + assetPrefix, + devOnlyCacheBusterQueryString, + scriptLoader + } = this.context; + const preloadFiles = files.allFiles.filter(file => { + return file.endsWith('.js'); + }); + return [...(scriptLoader.eager || []).map(file => /*#__PURE__*/_react.default.createElement("link", { + key: file.src, + nonce: this.props.nonce, + rel: "preload", + href: file.src, + as: "script", + crossOrigin: this.props.crossOrigin || undefined + })), ...preloadFiles.map(file => /*#__PURE__*/_react.default.createElement("link", { + key: file, + nonce: this.props.nonce, + rel: "preload", + href: `${assetPrefix}/_next/${encodeURI(file)}${devOnlyCacheBusterQueryString}`, + as: "script", + crossOrigin: this.props.crossOrigin || undefined + })), ...(scriptLoader.defer || []).map(file => /*#__PURE__*/_react.default.createElement("link", { + key: file, + nonce: this.props.nonce, + rel: "preload", + href: file, + as: "script", + crossOrigin: this.props.crossOrigin || undefined + }))]; + } + + handleDocumentScriptLoaderItems(children) { + const { + scriptLoader + } = this.context; + const scriptLoaderItems = []; + const filteredChildren = []; + + _react.default.Children.forEach(children, child => { + if (child.type === _experimentalScript.default) { + if (child.props.strategy === 'eager') { + scriptLoader.eager = (scriptLoader.eager || []).concat([_objectSpread({}, child.props)]); + return; + } else if (['lazy', 'defer'].includes(child.props.strategy)) { + scriptLoaderItems.push(child.props); + return; + } + } + + filteredChildren.push(child); + }); + + this.context.__NEXT_DATA__.scriptLoader = scriptLoaderItems; + return filteredChildren; + } + + makeStylesheetInert(node) { + return _react.default.Children.map(node, c => { + if (c.type === 'link' && c.props['href'] && _constants.OPTIMIZED_FONT_PROVIDERS.some(url => c.props['href'].startsWith(url))) { + const newProps = _objectSpread({}, c.props || {}); + + newProps['data-href'] = newProps['href']; + newProps['href'] = undefined; + return /*#__PURE__*/_react.default.cloneElement(c, newProps); + } else if (c.props && c.props['children']) { + c.props['children'] = this.makeStylesheetInert(c.props['children']); + } + + return c; + }); + } + + render() { + var _this$props$nonce, _this$props$nonce2; + + const { + styles, + ampPath, + inAmpMode, + hybridAmp, + canonicalBase, + __NEXT_DATA__, + dangerousAsPath, + headTags, + unstable_runtimeJS, + unstable_JsPreload + } = this.context; + const disableRuntimeJS = unstable_runtimeJS === false; + const disableJsPreload = unstable_JsPreload === false; + this.context.docComponentsRendered.Head = true; + let { + head + } = this.context; + let cssPreloads = []; + let otherHeadElements = []; + + if (head) { + head.forEach(c => { + if (c && c.type === 'link' && c.props['rel'] === 'preload' && c.props['as'] === 'style') { + cssPreloads.push(c); + } else { + c && otherHeadElements.push(c); + } + }); + head = cssPreloads.concat(otherHeadElements); + } + + let children = this.props.children; // show a warning if Head contains (only in development) + + if (true) { + children = _react.default.Children.map(children, child => { + var _child$props; + + const isReactHelmet = child == null ? void 0 : (_child$props = child.props) == null ? void 0 : _child$props['data-react-helmet']; + + if (!isReactHelmet) { + var _child$props2; + + if ((child == null ? void 0 : child.type) === 'title') { + console.warn("Warning: <title> should not be used in _document.js's <Head>. https://nextjs.org/docs/messages/no-document-title"); + } else if ((child == null ? void 0 : child.type) === 'meta' && (child == null ? void 0 : (_child$props2 = child.props) == null ? void 0 : _child$props2.name) === 'viewport') { + console.warn("Warning: viewport meta tags should not be used in _document.js's <Head>. https://nextjs.org/docs/messages/no-document-viewport-meta"); + } + } + + return child; + }); + if (this.props.crossOrigin) console.warn('Warning: `Head` attribute `crossOrigin` is deprecated. https://nextjs.org/docs/messages/doc-crossorigin-deprecated'); + } + + if (false) {} + + if (false) {} + + let hasAmphtmlRel = false; + let hasCanonicalRel = false; // show warning and remove conflicting amp head tags + + head = _react.default.Children.map(head || [], child => { + if (!child) return child; + const { + type, + props + } = child; + + if (inAmpMode) { + let badProp = ''; + + if (type === 'meta' && props.name === 'viewport') { + badProp = 'name="viewport"'; + } else if (type === 'link' && props.rel === 'canonical') { + hasCanonicalRel = true; + } else if (type === 'script') { + // only block if + // 1. it has a src and isn't pointing to ampproject's CDN + // 2. it is using dangerouslySetInnerHTML without a type or + // a type of text/javascript + if (props.src && props.src.indexOf('ampproject') < -1 || props.dangerouslySetInnerHTML && (!props.type || props.type === 'text/javascript')) { + badProp = '<script'; + Object.keys(props).forEach(prop => { + badProp += ` ${prop}="${props[prop]}"`; + }); + badProp += '/>'; + } + } + + if (badProp) { + console.warn(`Found conflicting amp tag "${child.type}" with conflicting prop ${badProp} in ${__NEXT_DATA__.page}. https://nextjs.org/docs/messages/conflicting-amp-tag`); + return null; + } + } else { + // non-amp mode + if (type === 'link' && props.rel === 'amphtml') { + hasAmphtmlRel = true; + } + } + + return child; + }); // try to parse styles from fragment for backwards compat + + const curStyles = Array.isArray(styles) ? styles : []; + + if (inAmpMode && styles && // @ts-ignore Property 'props' does not exist on type ReactElement + styles.props && // @ts-ignore Property 'props' does not exist on type ReactElement + Array.isArray(styles.props.children)) { + const hasStyles = el => { + var _el$props, _el$props$dangerously; + + return el == null ? void 0 : (_el$props = el.props) == null ? void 0 : (_el$props$dangerously = _el$props.dangerouslySetInnerHTML) == null ? void 0 : _el$props$dangerously.__html; + }; // @ts-ignore Property 'props' does not exist on type ReactElement + + + styles.props.children.forEach(child => { + if (Array.isArray(child)) { + child.forEach(el => hasStyles(el) && curStyles.push(el)); + } else if (hasStyles(child)) { + curStyles.push(child); + } + }); + } + + const files = getDocumentFiles(this.context.buildManifest, this.context.__NEXT_DATA__.page, inAmpMode); + return /*#__PURE__*/_react.default.createElement("head", this.props, this.context.isDevelopment && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("style", { + "data-next-hide-fouc": true, + "data-ampdevmode": inAmpMode ? 'true' : undefined, + dangerouslySetInnerHTML: { + __html: `body{display:none}` + } + }), /*#__PURE__*/_react.default.createElement("noscript", { + "data-next-hide-fouc": true, + "data-ampdevmode": inAmpMode ? 'true' : undefined + }, /*#__PURE__*/_react.default.createElement("style", { + dangerouslySetInnerHTML: { + __html: `body{display:block}` + } + }))), children, head, /*#__PURE__*/_react.default.createElement("meta", { + name: "next-head-count", + content: _react.default.Children.count(head || []).toString() + }), inAmpMode && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("meta", { + name: "viewport", + content: "width=device-width,minimum-scale=1,initial-scale=1" + }), !hasCanonicalRel && /*#__PURE__*/_react.default.createElement("link", { + rel: "canonical", + href: canonicalBase + (0, _utils2.cleanAmpPath)(dangerousAsPath) + }), /*#__PURE__*/_react.default.createElement("link", { + rel: "preload", + as: "script", + href: "https://cdn.ampproject.org/v0.js" + }), styles && /*#__PURE__*/_react.default.createElement("style", { + "amp-custom": "", + dangerouslySetInnerHTML: { + __html: curStyles.map(style => style.props.dangerouslySetInnerHTML.__html).join('').replace(/\/\*# sourceMappingURL=.*\*\//g, '').replace(/\/\*@ sourceURL=.*?\*\//g, '') + } + }), /*#__PURE__*/_react.default.createElement("style", { + "amp-boilerplate": "", + dangerouslySetInnerHTML: { + __html: `body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}` + } + }), /*#__PURE__*/_react.default.createElement("noscript", null, /*#__PURE__*/_react.default.createElement("style", { + "amp-boilerplate": "", + dangerouslySetInnerHTML: { + __html: `body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}` + } + })), /*#__PURE__*/_react.default.createElement("script", { + async: true, + src: "https://cdn.ampproject.org/v0.js" + })), !inAmpMode && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !hasAmphtmlRel && hybridAmp && /*#__PURE__*/_react.default.createElement("link", { + rel: "amphtml", + href: canonicalBase + getAmpPath(ampPath, dangerousAsPath) + }), true && this.getCssLinks(files), true && /*#__PURE__*/_react.default.createElement("noscript", { + "data-n-css": (_this$props$nonce = this.props.nonce) != null ? _this$props$nonce : '' + }), !disableRuntimeJS && !disableJsPreload && this.getPreloadDynamicChunks(), !disableRuntimeJS && !disableJsPreload && this.getPreloadMainLinks(files), false && false, false && /*#__PURE__*/false, this.context.isDevelopment && + /*#__PURE__*/ + // this element is used to mount development styles so the + // ordering matches production + // (by default, style-loader injects at the bottom of <head />) + _react.default.createElement("noscript", { + id: "__next_css__DO_NOT_USE__" + }), styles || null), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {}, ...(headTags || []))); + } + +} + +exports.Head = Head; +Head.contextType = _documentContext.DocumentContext; +Head.propTypes = { + nonce: _propTypes.default.string, + crossOrigin: _propTypes.default.string +}; + +function Main() { + const { + inAmpMode, + html, + docComponentsRendered + } = (0, _react.useContext)(_documentContext.DocumentContext); + docComponentsRendered.Main = true; + if (inAmpMode) return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, _constants.AMP_RENDER_TARGET); + return /*#__PURE__*/_react.default.createElement("div", { + id: "__next", + dangerouslySetInnerHTML: { + __html: html + } + }); +} + +class NextScript extends _react.Component { + constructor(...args) { + super(...args); + this.context = void 0; + } + + getDynamicChunks(files) { + const { + dynamicImports, + assetPrefix, + isDevelopment, + devOnlyCacheBusterQueryString + } = this.context; + return dedupe(dynamicImports).map(bundle => { + if (!bundle.file.endsWith('.js') || files.allFiles.includes(bundle.file)) return null; + return /*#__PURE__*/_react.default.createElement("script", { + async: !isDevelopment, + key: bundle.file, + src: `${assetPrefix}/_next/${encodeURI(bundle.file)}${devOnlyCacheBusterQueryString}`, + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined + }); + }); + } + + getPreNextScripts() { + const { + scriptLoader + } = this.context; + return (scriptLoader.eager || []).map(file => { + const { + strategy + } = file, + props = _objectWithoutProperties(file, ["strategy"]); + + return /*#__PURE__*/_react.default.createElement("script", Object.assign({}, props, { + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined + })); + }); + } + + getScripts(files) { + var _buildManifest$lowPri; + + const { + assetPrefix, + buildManifest, + isDevelopment, + devOnlyCacheBusterQueryString + } = this.context; + const normalScripts = files.allFiles.filter(file => file.endsWith('.js')); + const lowPriorityScripts = (_buildManifest$lowPri = buildManifest.lowPriorityFiles) == null ? void 0 : _buildManifest$lowPri.filter(file => file.endsWith('.js')); + return [...normalScripts, ...lowPriorityScripts].map(file => { + return /*#__PURE__*/_react.default.createElement("script", { + key: file, + src: `${assetPrefix}/_next/${encodeURI(file)}${devOnlyCacheBusterQueryString}`, + nonce: this.props.nonce, + async: !isDevelopment, + crossOrigin: this.props.crossOrigin || undefined + }); + }); + } + + getPolyfillScripts() { + // polyfills.js has to be rendered as nomodule without async + // It also has to be the first script to load + const { + assetPrefix, + buildManifest, + devOnlyCacheBusterQueryString + } = this.context; + return buildManifest.polyfillFiles.filter(polyfill => polyfill.endsWith('.js') && !polyfill.endsWith('.module.js')).map(polyfill => /*#__PURE__*/_react.default.createElement("script", { + key: polyfill, + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined, + noModule: true, + src: `${assetPrefix}/_next/${polyfill}${devOnlyCacheBusterQueryString}` + })); + } + + static getInlineScriptSource(documentProps) { + const { + __NEXT_DATA__ + } = documentProps; + + try { + const data = JSON.stringify(__NEXT_DATA__); + return (0, _htmlescape.htmlEscapeJsonString)(data); + } catch (err) { + if (err.message.indexOf('circular structure')) { + throw new Error(`Circular structure in "getInitialProps" result of page "${__NEXT_DATA__.page}". https://nextjs.org/docs/messages/circular-structure`); + } + + throw err; + } + } + + render() { + const { + assetPrefix, + inAmpMode, + buildManifest, + unstable_runtimeJS, + docComponentsRendered, + devOnlyCacheBusterQueryString + } = this.context; + const disableRuntimeJS = unstable_runtimeJS === false; + docComponentsRendered.NextScript = true; + + if (inAmpMode) { + if (false) {} + + const ampDevFiles = [...buildManifest.devFiles, ...buildManifest.polyfillFiles, ...buildManifest.ampDevFiles]; + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, disableRuntimeJS ? null : /*#__PURE__*/_react.default.createElement("script", { + id: "__NEXT_DATA__", + type: "application/json", + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined, + dangerouslySetInnerHTML: { + __html: NextScript.getInlineScriptSource(this.context) + }, + "data-ampdevmode": true + }), ampDevFiles.map(file => /*#__PURE__*/_react.default.createElement("script", { + key: file, + src: `${assetPrefix}/_next/${file}${devOnlyCacheBusterQueryString}`, + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined, + "data-ampdevmode": true + }))); + } + + if (true) { + if (this.props.crossOrigin) console.warn('Warning: `NextScript` attribute `crossOrigin` is deprecated. https://nextjs.org/docs/messages/doc-crossorigin-deprecated'); + } + + const files = getDocumentFiles(this.context.buildManifest, this.context.__NEXT_DATA__.page, inAmpMode); + return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !disableRuntimeJS && buildManifest.devFiles ? buildManifest.devFiles.map(file => /*#__PURE__*/_react.default.createElement("script", { + key: file, + src: `${assetPrefix}/_next/${encodeURI(file)}${devOnlyCacheBusterQueryString}`, + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined + })) : null, disableRuntimeJS ? null : /*#__PURE__*/_react.default.createElement("script", { + id: "__NEXT_DATA__", + type: "application/json", + nonce: this.props.nonce, + crossOrigin: this.props.crossOrigin || undefined, + dangerouslySetInnerHTML: { + __html: NextScript.getInlineScriptSource(this.context) + } + }), !disableRuntimeJS && this.getPolyfillScripts(), !disableRuntimeJS && this.getPreNextScripts(), disableRuntimeJS ? null : this.getDynamicChunks(files), disableRuntimeJS ? null : this.getScripts(files)); + } + +} + +exports.NextScript = NextScript; +NextScript.contextType = _documentContext.DocumentContext; +NextScript.propTypes = { + nonce: _propTypes.default.string, + crossOrigin: _propTypes.default.string +}; +NextScript.safariNomoduleFix = '!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();'; + +function getAmpPath(ampPath, asPath) { + return ampPath || `${asPath}${asPath.includes('?') ? '&' : '?'}amp=1`; +} + +/***/ }), + +/***/ "./node_modules/next/dist/server/htmlescape.js": +/*!*****************************************************!*\ + !*** ./node_modules/next/dist/server/htmlescape.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +exports.__esModule=true;exports.htmlEscapeJsonString=htmlEscapeJsonString;// This utility is based on https://github.com/zertosh/htmlescape +// License: https://github.com/zertosh/htmlescape/blob/0527ca7156a524d256101bb310a9f970f63078ad/LICENSE +const ESCAPE_LOOKUP={'&':'\\u0026','>':'\\u003e','<':'\\u003c','\u2028':'\\u2028','\u2029':'\\u2029'};const ESCAPE_REGEX=/[&><\u2028\u2029]/g;function htmlEscapeJsonString(str){return str.replace(ESCAPE_REGEX,match=>ESCAPE_LOOKUP[match]);} +//# sourceMappingURL=htmlescape.js.map + +/***/ }), + +/***/ 2: +/*!***************************************!*\ + !*** multi next/dist/pages/_document ***! + \***************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! next/dist/pages/_document */"./node_modules/next/dist/pages/_document.js"); + + +/***/ }), + +/***/ "prop-types": +/*!*****************************!*\ + !*** external "prop-types" ***! + \*****************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("prop-types"); + +/***/ }), + +/***/ "react": +/*!************************!*\ + !*** external "react" ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("react"); + +/***/ }), + +/***/ "styled-jsx/server": +/*!************************************!*\ + !*** external "styled-jsx/server" ***! + \************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("styled-jsx/server"); + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibmV4dC9kaXN0L25leHQtc2VydmVyL2xpYi9jb25zdGFudHMuanNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJuZXh0L2Rpc3QvbmV4dC1zZXJ2ZXIvbGliL2RvY3VtZW50LWNvbnRleHQuanNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJuZXh0L2Rpc3QvbmV4dC1zZXJ2ZXIvbGliL2hlYWQtbWFuYWdlci1jb250ZXh0LmpzXCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibmV4dC9kaXN0L25leHQtc2VydmVyL2xpYi91dGlscy5qc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcIm5leHQvZGlzdC9uZXh0LXNlcnZlci9zZXJ2ZXIvZ2V0LXBhZ2UtZmlsZXMuanNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJuZXh0L2Rpc3QvbmV4dC1zZXJ2ZXIvc2VydmVyL3V0aWxzLmpzXCIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZC5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlLmpzIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly8vLi4vLi4vY2xpZW50L2V4cGVyaW1lbnRhbC1zY3JpcHQudHN4Iiwid2VicGFjazovLy8uLi8uLi9jbGllbnQvaGVhZC1tYW5hZ2VyLnRzIiwid2VicGFjazovLy8uLi8uLi9jbGllbnQvcmVxdWVzdC1pZGxlLWNhbGxiYWNrLnRzIiwid2VicGFjazovLy8uLi8uLi9wYWdlcy9fZG9jdW1lbnQudHN4Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2VydmVyL2h0bWxlc2NhcGUuanMiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwicHJvcC10eXBlc1wiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwic3R5bGVkLWpzeC9zZXJ2ZXJcIiJdLCJuYW1lcyI6WyJTY3JpcHRDYWNoZSIsIkxvYWRDYWNoZSIsImlnbm9yZVByb3BzIiwibG9hZFNjcmlwdCIsInByb3BzIiwib25Mb2FkIiwiY2hpbGRyZW4iLCJjYWNoZUtleSIsImlkIiwiZWwiLCJkb2N1bWVudCIsImxvYWRQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uRXJyb3IiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIkFycmF5IiwiT2JqZWN0IiwidmFsdWUiLCJhdHRyIiwiRE9NQXR0cmlidXRlTmFtZXMiLCJrIiwic3RyYXRlZ3kiLCJ3aW5kb3ciLCJzY3JpcHRMb2FkZXJJdGVtcyIsInNyYyIsInByZWxvYWQiLCJyZXN0UHJvcHMiLCJIZWFkTWFuYWdlckNvbnRleHQiLCJsb2FkTGF6eVNjcmlwdCIsInN5bmNQcm9wcyIsIl9faHRtbCIsInVwZGF0ZVNjcmlwdHMiLCJzY3JpcHRzIiwiU2NyaXB0IiwiYWNjZXB0Q2hhcnNldCIsImNsYXNzTmFtZSIsImh0bWxGb3IiLCJodHRwRXF1aXYiLCJub01vZHVsZSIsInAiLCJ0eXBlIiwiaGVhZEVsIiwiaGVhZENvdW50RWwiLCJjb25zb2xlIiwiaGVhZENvdW50IiwiTnVtYmVyIiwib2xkVGFncyIsImkiLCJqIiwibmV3VGFncyIsImNvbXBvbmVudHMiLCJuZXdUYWciLCJsZW4iLCJvbGRUYWciLCJ0IiwidXBkYXRlUHJvbWlzZSIsIm1vdW50ZWRJbnN0YW5jZXMiLCJ1cGRhdGVIZWFkIiwiaGVhZCIsInByb21pc2UiLCJQcm9taXNlIiwidGFncyIsImgiLCJ0aXRsZUNvbXBvbmVudCIsInRpdGxlIiwidXBkYXRlRWxlbWVudHMiLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwic2VsZiIsInN0YXJ0IiwiRGF0ZSIsInNldFRpbWVvdXQiLCJjYiIsImRpZFRpbWVvdXQiLCJ0aW1lUmVtYWluaW5nIiwiTWF0aCIsImNhbmNlbElkbGVDYWxsYmFjayIsImNsZWFyVGltZW91dCIsImZpbGVzIiwia2VwdCIsImJ1bmRsZSIsInNoYXJlZEZpbGVzIiwicGFnZUZpbGVzIiwiaW5BbXBNb2RlIiwiYWxsRmlsZXMiLCJDb21wb25lbnQiLCJlbmhhbmNlQXBwIiwiQXBwIiwiY3R4Iiwic3R5bGVzIiwicmVuZGVyIiwiRG9jdW1lbnQiLCJoZWFkVGFnc01pZGRsZXdhcmUiLCJwcm9jZXNzIiwiRG9jdW1lbnRDb21wb25lbnRDb250ZXh0IiwiZG9jQ29tcG9uZW50c1JlbmRlcmVkIiwiZ2V0Q3NzTGlua3MiLCJjc3NGaWxlcyIsImYiLCJ1bm1hbmdlZEZpbGVzIiwiZHluYW1pY0Nzc0ZpbGVzIiwiZGVkdXBlIiwiZHluYW1pY0ltcG9ydHMiLCJleGlzdGluZyIsImNzc0xpbmtFbGVtZW50cyIsImZpbGUiLCJpc1NoYXJlZEZpbGUiLCJhc3NldFByZWZpeCIsImVuY29kZVVSSSIsImRldk9ubHlDYWNoZUJ1c3RlclF1ZXJ5U3RyaW5nIiwiaXNVbm1hbmFnZWRGaWxlIiwiZ2V0UHJlbG9hZER5bmFtaWNDaHVua3MiLCJnZXRQcmVsb2FkTWFpbkxpbmtzIiwicHJlbG9hZEZpbGVzIiwic2NyaXB0TG9hZGVyIiwiaGFuZGxlRG9jdW1lbnRTY3JpcHRMb2FkZXJJdGVtcyIsImZpbHRlcmVkQ2hpbGRyZW4iLCJSZWFjdCIsImNoaWxkIiwibWFrZVN0eWxlc2hlZXRJbmVydCIsImMiLCJPUFRJTUlaRURfRk9OVF9QUk9WSURFUlMiLCJ1cmwiLCJuZXdQcm9wcyIsImRpc2FibGVSdW50aW1lSlMiLCJ1bnN0YWJsZV9ydW50aW1lSlMiLCJkaXNhYmxlSnNQcmVsb2FkIiwidW5zdGFibGVfSnNQcmVsb2FkIiwiY3NzUHJlbG9hZHMiLCJvdGhlckhlYWRFbGVtZW50cyIsImlzUmVhY3RIZWxtZXQiLCJoYXNBbXBodG1sUmVsIiwiaGFzQ2Fub25pY2FsUmVsIiwiYmFkUHJvcCIsInByb3AiLCJfX05FWFRfREFUQV9fIiwicGFnZSIsImN1clN0eWxlcyIsImhhc1N0eWxlcyIsImdldERvY3VtZW50RmlsZXMiLCJjYW5vbmljYWxCYXNlIiwic3R5bGUiLCJnZXRBbXBQYXRoIiwiaGVhZFRhZ3MiLCJIZWFkIiwiY29udGV4dFR5cGUiLCJwcm9wVHlwZXMiLCJub25jZSIsIlByb3BUeXBlcyIsImNyb3NzT3JpZ2luIiwiQU1QX1JFTkRFUl9UQVJHRVQiLCJnZXREeW5hbWljQ2h1bmtzIiwiZ2V0UHJlTmV4dFNjcmlwdHMiLCJnZXRTY3JpcHRzIiwibm9ybWFsU2NyaXB0cyIsImxvd1ByaW9yaXR5U2NyaXB0cyIsImJ1aWxkTWFuaWZlc3QiLCJnZXRQb2x5ZmlsbFNjcmlwdHMiLCJwb2x5ZmlsbCIsImRhdGEiLCJKU09OIiwiZXJyIiwiYW1wRGV2RmlsZXMiLCJOZXh0U2NyaXB0Iiwic2FmYXJpTm9tb2R1bGVGaXgiLCJhbXBQYXRoIiwiYXNQYXRoIl0sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztR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QSxxQkFBcUIsaUZBQWlGLHdDQUF3QyxtQ0FBbUM7QUFDakwsc0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSEEsdUM7Ozs7Ozs7Ozs7O0FDQUEsa0M7Ozs7Ozs7Ozs7O0FDQUEsOEMiLCJmaWxlIjoicGFnZXMvX2RvY3VtZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSByZXF1aXJlKCcuLi9zc3ItbW9kdWxlLWNhY2hlLmpzJyk7XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdHZhciB0aHJldyA9IHRydWU7XG4gXHRcdHRyeSB7XG4gXHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbiBcdFx0fSBmaW5hbGx5IHtcbiBcdFx0XHRpZih0aHJldykgZGVsZXRlIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHR9XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDIpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibmV4dC9kaXN0L25leHQtc2VydmVyL2xpYi9jb25zdGFudHMuanNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibmV4dC9kaXN0L25leHQtc2VydmVyL2xpYi9kb2N1bWVudC1jb250ZXh0LmpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5leHQvZGlzdC9uZXh0LXNlcnZlci9saWIvaGVhZC1tYW5hZ2VyLWNvbnRleHQuanNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibmV4dC9kaXN0L25leHQtc2VydmVyL2xpYi91dGlscy5qc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXh0L2Rpc3QvbmV4dC1zZXJ2ZXIvc2VydmVyL2dldC1wYWdlLWZpbGVzLmpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5leHQvZGlzdC9uZXh0LXNlcnZlci9zZXJ2ZXIvdXRpbHMuanNcIik7IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzOyIsImZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgXCJkZWZhdWx0XCI6IG9ialxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQ7IiwidmFyIF90eXBlb2YgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90eXBlb2ZcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHtcbiAgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsO1xuICB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuXG4gIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHtcbiAgICByZXR1cm4gY2FjaGU7XG4gIH07XG5cbiAgcmV0dXJuIGNhY2hlO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHtcbiAgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAob2JqID09PSBudWxsIHx8IF90eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJkZWZhdWx0XCI6IG9ialxuICAgIH07XG4gIH1cblxuICB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTtcblxuICBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KG9iaik7XG4gIH1cblxuICB2YXIgbmV3T2JqID0ge307XG4gIHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsO1xuXG4gICAgICBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5ld09ialtcImRlZmF1bHRcIl0gPSBvYmo7XG5cbiAgaWYgKGNhY2hlKSB7XG4gICAgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTtcbiAgfVxuXG4gIHJldHVybiBuZXdPYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQ7IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2U7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mOyIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNjcmlwdEhUTUxBdHRyaWJ1dGVzIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBIZWFkTWFuYWdlckNvbnRleHQgfSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvaGVhZC1tYW5hZ2VyLWNvbnRleHQnXG5pbXBvcnQgeyBET01BdHRyaWJ1dGVOYW1lcyB9IGZyb20gJy4vaGVhZC1tYW5hZ2VyJ1xuaW1wb3J0IHsgcmVxdWVzdElkbGVDYWxsYmFjayB9IGZyb20gJy4vcmVxdWVzdC1pZGxlLWNhbGxiYWNrJ1xuXG5jb25zdCBTY3JpcHRDYWNoZSA9IG5ldyBNYXAoKVxuY29uc3QgTG9hZENhY2hlID0gbmV3IFNldCgpXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcHMgZXh0ZW5kcyBTY3JpcHRIVE1MQXR0cmlidXRlczxIVE1MU2NyaXB0RWxlbWVudD4ge1xuICBzdHJhdGVneT86ICdkZWZlcicgfCAnbGF6eScgfCAnZGFuZ2Vyb3VzbHlCbG9ja1JlbmRlcmluZycgfCAnZWFnZXInXG4gIGlkPzogc3RyaW5nXG4gIG9uTG9hZD86ICgpID0+IHZvaWRcbiAgb25FcnJvcj86ICgpID0+IHZvaWRcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgcHJlbG9hZD86IGJvb2xlYW5cbn1cblxuY29uc3QgaWdub3JlUHJvcHMgPSBbXG4gICdvbkxvYWQnLFxuICAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnLFxuICAnY2hpbGRyZW4nLFxuICAnb25FcnJvcicsXG4gICdzdHJhdGVneScsXG4gICdwcmVsb2FkJyxcbl1cblxuY29uc3QgbG9hZFNjcmlwdCA9IChwcm9wczogUHJvcHMpOiB2b2lkID0+IHtcbiAgY29uc3Qge1xuICAgIHNyYyxcbiAgICBpZCxcbiAgICBvbkxvYWQgPSAoKSA9PiB7fSxcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTCxcbiAgICBjaGlsZHJlbiA9ICcnLFxuICAgIG9uRXJyb3IsXG4gIH0gPSBwcm9wc1xuXG4gIGNvbnN0IGNhY2hlS2V5ID0gaWQgfHwgc3JjXG4gIGlmIChTY3JpcHRDYWNoZS5oYXMoc3JjKSkge1xuICAgIGlmICghTG9hZENhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIExvYWRDYWNoZS5hZGQoY2FjaGVLZXkpXG4gICAgICAvLyBFeGVjdXRlIG9uTG9hZCBzaW5jZSB0aGUgc2NyaXB0IGxvYWRpbmcgaGFzIGJlZ3VuXG4gICAgICBTY3JpcHRDYWNoZS5nZXQoc3JjKS50aGVuKG9uTG9hZCwgb25FcnJvcilcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG5cbiAgY29uc3QgbG9hZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlc29sdmUoKVxuICAgICAgaWYgKG9uTG9hZCkge1xuICAgICAgICBvbkxvYWQuY2FsbCh0aGlzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QoKVxuICAgICAgaWYgKG9uRXJyb3IpIHtcbiAgICAgICAgb25FcnJvcigpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcblxuICBpZiAoc3JjKSB7XG4gICAgU2NyaXB0Q2FjaGUuc2V0KHNyYywgbG9hZFByb21pc2UpXG4gICAgTG9hZENhY2hlLmFkZChjYWNoZUtleSlcbiAgfVxuXG4gIGlmIChkYW5nZXJvdXNseVNldElubmVySFRNTCkge1xuICAgIGVsLmlubmVySFRNTCA9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCB8fCAnJ1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgZWwudGV4dENvbnRlbnQgPVxuICAgICAgdHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNoaWxkcmVuXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgICAgPyBjaGlsZHJlbi5qb2luKCcnKVxuICAgICAgICA6ICcnXG4gIH0gZWxzZSBpZiAoc3JjKSB7XG4gICAgZWwuc3JjID0gc3JjXG4gIH1cblxuICBmb3IgKGNvbnN0IFtrLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocHJvcHMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgaWdub3JlUHJvcHMuaW5jbHVkZXMoaykpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgYXR0ciA9IERPTUF0dHJpYnV0ZU5hbWVzW2tdIHx8IGsudG9Mb3dlckNhc2UoKVxuICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSlcbiAgfVxuXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWwpXG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNsaWVudFNjcmlwdExvYWQocHJvcHM6IFByb3BzKSB7XG4gIGNvbnN0IHsgc3RyYXRlZ3kgPSAnZGVmZXInIH0gPSBwcm9wc1xuICBpZiAoc3RyYXRlZ3kgPT09ICdkZWZlcicpIHtcbiAgICBsb2FkU2NyaXB0KHByb3BzKVxuICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSAnbGF6eScpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgIHJlcXVlc3RJZGxlQ2FsbGJhY2soKCkgPT4gbG9hZFNjcmlwdChwcm9wcykpXG4gICAgfSlcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2FkTGF6eVNjcmlwdChwcm9wczogUHJvcHMpIHtcbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICByZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+IGxvYWRTY3JpcHQocHJvcHMpKVxuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgICAgcmVxdWVzdElkbGVDYWxsYmFjaygoKSA9PiBsb2FkU2NyaXB0KHByb3BzKSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0U2NyaXB0TG9hZGVyKHNjcmlwdExvYWRlckl0ZW1zOiBQcm9wc1tdKSB7XG4gIHNjcmlwdExvYWRlckl0ZW1zLmZvckVhY2goaGFuZGxlQ2xpZW50U2NyaXB0TG9hZClcbn1cblxuZnVuY3Rpb24gU2NyaXB0KHByb3BzOiBQcm9wcyk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IHtcbiAgICBzcmMgPSAnJyxcbiAgICBvbkxvYWQgPSAoKSA9PiB7fSxcbiAgICBkYW5nZXJvdXNseVNldElubmVySFRNTCxcbiAgICBjaGlsZHJlbiA9ICcnLFxuICAgIHN0cmF0ZWd5ID0gJ2RlZmVyJyxcbiAgICBvbkVycm9yLFxuICAgIHByZWxvYWQgPSBmYWxzZSxcbiAgICAuLi5yZXN0UHJvcHNcbiAgfSA9IHByb3BzXG5cbiAgLy8gQ29udGV4dCBpcyBhdmFpbGFibGUgb25seSBkdXJpbmcgU1NSXG4gIGNvbnN0IHsgdXBkYXRlU2NyaXB0cywgc2NyaXB0cyB9ID0gdXNlQ29udGV4dChIZWFkTWFuYWdlckNvbnRleHQpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoc3RyYXRlZ3kgPT09ICdkZWZlcicpIHtcbiAgICAgIGxvYWRTY3JpcHQocHJvcHMpXG4gICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gJ2xhenknKSB7XG4gICAgICBsb2FkTGF6eVNjcmlwdChwcm9wcylcbiAgICB9XG4gIH0sIFtwcm9wcywgc3RyYXRlZ3ldKVxuXG4gIGlmICghcHJvY2Vzcy5lbnYuX19ORVhUX1NDUklQVF9MT0FERVIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgaWYgKHN0cmF0ZWd5ID09PSAnZGFuZ2Vyb3VzbHlCbG9ja1JlbmRlcmluZycpIHtcbiAgICBjb25zdCBzeW5jUHJvcHM6IFByb3BzID0geyAuLi5yZXN0UHJvcHMgfVxuXG4gICAgZm9yIChjb25zdCBbaywgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHtcbiAgICAgIHNyYyxcbiAgICAgIG9uTG9hZCxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTCxcbiAgICAgIGNoaWxkcmVuLFxuICAgIH0pKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoayA9PT0gJ2NoaWxkcmVuJykge1xuICAgICAgICBzeW5jUHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPSB7XG4gICAgICAgICAgX19odG1sOlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICAgICAgPyB2YWx1ZS5qb2luKCcnKVxuICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICA7KHN5bmNQcm9wcyBhcyBhbnkpW2tdID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gPHNjcmlwdCB7Li4uc3luY1Byb3BzfSAvPlxuICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSAnZGVmZXInKSB7XG4gICAgaWYgKHVwZGF0ZVNjcmlwdHMgJiYgcHJlbG9hZCkge1xuICAgICAgc2NyaXB0cy5kZWZlciA9IChzY3JpcHRzLmRlZmVyIHx8IFtdKS5jb25jYXQoW3NyY10pXG4gICAgICB1cGRhdGVTY3JpcHRzKHNjcmlwdHMpXG4gICAgfVxuICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSAnZWFnZXInKSB7XG4gICAgaWYgKHVwZGF0ZVNjcmlwdHMpIHtcbiAgICAgIHNjcmlwdHMuZWFnZXIgPSAoc2NyaXB0cy5lYWdlciB8fCBbXSkuY29uY2F0KFtcbiAgICAgICAge1xuICAgICAgICAgIHNyYyxcbiAgICAgICAgICBvbkxvYWQsXG4gICAgICAgICAgb25FcnJvcixcbiAgICAgICAgICAuLi5yZXN0UHJvcHMsXG4gICAgICAgIH0sXG4gICAgICBdKVxuICAgICAgdXBkYXRlU2NyaXB0cyhzY3JpcHRzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjcmlwdFxuIiwiZXhwb3J0IGNvbnN0IERPTUF0dHJpYnV0ZU5hbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBhY2NlcHRDaGFyc2V0OiAnYWNjZXB0LWNoYXJzZXQnLFxuICBjbGFzc05hbWU6ICdjbGFzcycsXG4gIGh0bWxGb3I6ICdmb3InLFxuICBodHRwRXF1aXY6ICdodHRwLWVxdWl2JyxcbiAgbm9Nb2R1bGU6ICdub01vZHVsZScsXG59XG5cbmZ1bmN0aW9uIHJlYWN0RWxlbWVudFRvRE9NKHsgdHlwZSwgcHJvcHMgfTogSlNYLkVsZW1lbnQpOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IGVsOiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSlcbiAgZm9yIChjb25zdCBwIGluIHByb3BzKSB7XG4gICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShwKSkgY29udGludWVcbiAgICBpZiAocCA9PT0gJ2NoaWxkcmVuJyB8fCBwID09PSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnKSBjb250aW51ZVxuXG4gICAgLy8gd2UgZG9uJ3QgcmVuZGVyIHVuZGVmaW5lZCBwcm9wcyB0byB0aGUgRE9NXG4gICAgaWYgKHByb3BzW3BdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBhdHRyID0gRE9NQXR0cmlidXRlTmFtZXNbcF0gfHwgcC50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKFxuICAgICAgdHlwZSA9PT0gJ3NjcmlwdCcgJiZcbiAgICAgIChhdHRyID09PSAnYXN5bmMnIHx8IGF0dHIgPT09ICdkZWZlcicgfHwgYXR0ciA9PT0gJ25vTW9kdWxlJylcbiAgICApIHtcbiAgICAgIDsoZWwgYXMgSFRNTFNjcmlwdEVsZW1lbnQpW2F0dHJdID0gISFwcm9wc1twXVxuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoYXR0ciwgcHJvcHNbcF0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgeyBjaGlsZHJlbiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgfSA9IHByb3BzXG4gIGlmIChkYW5nZXJvdXNseVNldElubmVySFRNTCkge1xuICAgIGVsLmlubmVySFRNTCA9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCB8fCAnJ1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuKSB7XG4gICAgZWwudGV4dENvbnRlbnQgPVxuICAgICAgdHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGNoaWxkcmVuXG4gICAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgICAgPyBjaGlsZHJlbi5qb2luKCcnKVxuICAgICAgICA6ICcnXG4gIH1cbiAgcmV0dXJuIGVsXG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVsZW1lbnRzKHR5cGU6IHN0cmluZywgY29tcG9uZW50czogSlNYLkVsZW1lbnRbXSk6IHZvaWQge1xuICBjb25zdCBoZWFkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIGNvbnN0IGhlYWRDb3VudEVsOiBIVE1MTWV0YUVsZW1lbnQgPSBoZWFkRWwucXVlcnlTZWxlY3RvcihcbiAgICAnbWV0YVtuYW1lPW5leHQtaGVhZC1jb3VudF0nXG4gICkgYXMgSFRNTE1ldGFFbGVtZW50XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCFoZWFkQ291bnRFbCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ1dhcm5pbmc6IG5leHQtaGVhZC1jb3VudCBpcyBtaXNzaW5nLiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9uZXh0LWhlYWQtY291bnQtbWlzc2luZydcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhlYWRDb3VudCA9IE51bWJlcihoZWFkQ291bnRFbC5jb250ZW50KVxuICBjb25zdCBvbGRUYWdzOiBFbGVtZW50W10gPSBbXVxuXG4gIGZvciAoXG4gICAgbGV0IGkgPSAwLCBqID0gaGVhZENvdW50RWwucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICBpIDwgaGVhZENvdW50O1xuICAgIGkrKywgaiA9IGohLnByZXZpb3VzRWxlbWVudFNpYmxpbmdcbiAgKSB7XG4gICAgaWYgKGohLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdHlwZSkge1xuICAgICAgb2xkVGFncy5wdXNoKGohKVxuICAgIH1cbiAgfVxuICBjb25zdCBuZXdUYWdzID0gKGNvbXBvbmVudHMubWFwKHJlYWN0RWxlbWVudFRvRE9NKSBhcyBIVE1MRWxlbWVudFtdKS5maWx0ZXIoXG4gICAgKG5ld1RhZykgPT4ge1xuICAgICAgZm9yIChsZXQgayA9IDAsIGxlbiA9IG9sZFRhZ3MubGVuZ3RoOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgICAgY29uc3Qgb2xkVGFnID0gb2xkVGFnc1trXVxuICAgICAgICBpZiAob2xkVGFnLmlzRXF1YWxOb2RlKG5ld1RhZykpIHtcbiAgICAgICAgICBvbGRUYWdzLnNwbGljZShrLCAxKVxuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgKVxuXG4gIG9sZFRhZ3MuZm9yRWFjaCgodCkgPT4gdC5wYXJlbnROb2RlIS5yZW1vdmVDaGlsZCh0KSlcbiAgbmV3VGFncy5mb3JFYWNoKCh0KSA9PiBoZWFkRWwuaW5zZXJ0QmVmb3JlKHQsIGhlYWRDb3VudEVsKSlcbiAgaGVhZENvdW50RWwuY29udGVudCA9IChoZWFkQ291bnQgLSBvbGRUYWdzLmxlbmd0aCArIG5ld1RhZ3MubGVuZ3RoKS50b1N0cmluZygpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGluaXRIZWFkTWFuYWdlcigpOiB7XG4gIG1vdW50ZWRJbnN0YW5jZXM6IFNldDx1bmtub3duPlxuICB1cGRhdGVIZWFkOiAoaGVhZDogSlNYLkVsZW1lbnRbXSkgPT4gdm9pZFxufSB7XG4gIGxldCB1cGRhdGVQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGxcblxuICByZXR1cm4ge1xuICAgIG1vdW50ZWRJbnN0YW5jZXM6IG5ldyBTZXQoKSxcbiAgICB1cGRhdGVIZWFkOiAoaGVhZDogSlNYLkVsZW1lbnRbXSkgPT4ge1xuICAgICAgY29uc3QgcHJvbWlzZSA9ICh1cGRhdGVQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChwcm9taXNlICE9PSB1cGRhdGVQcm9taXNlKSByZXR1cm5cblxuICAgICAgICB1cGRhdGVQcm9taXNlID0gbnVsbFxuICAgICAgICBjb25zdCB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBKU1guRWxlbWVudFtdPiA9IHt9XG5cbiAgICAgICAgaGVhZC5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRhZ3NbaC50eXBlXSB8fCBbXVxuICAgICAgICAgIGNvbXBvbmVudHMucHVzaChoKVxuICAgICAgICAgIHRhZ3NbaC50eXBlXSA9IGNvbXBvbmVudHNcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCB0aXRsZUNvbXBvbmVudCA9IHRhZ3MudGl0bGUgPyB0YWdzLnRpdGxlWzBdIDogbnVsbFxuICAgICAgICBsZXQgdGl0bGUgPSAnJ1xuICAgICAgICBpZiAodGl0bGVDb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zdCB7IGNoaWxkcmVuIH0gPSB0aXRsZUNvbXBvbmVudC5wcm9wc1xuICAgICAgICAgIHRpdGxlID1cbiAgICAgICAgICAgIHR5cGVvZiBjaGlsZHJlbiA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgPyBjaGlsZHJlblxuICAgICAgICAgICAgICA6IEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pXG4gICAgICAgICAgICAgID8gY2hpbGRyZW4uam9pbignJylcbiAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSAhPT0gZG9jdW1lbnQudGl0bGUpIGRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgICAgO1snbWV0YScsICdiYXNlJywgJ2xpbmsnLCAnc3R5bGUnLCAnc2NyaXB0J10uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICAgIHVwZGF0ZUVsZW1lbnRzKHR5cGUsIHRhZ3NbdHlwZV0gfHwgW10pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICB9LFxuICB9XG59XG4iLCJ0eXBlIFJlcXVlc3RJZGxlQ2FsbGJhY2tIYW5kbGUgPSBhbnlcbnR5cGUgUmVxdWVzdElkbGVDYWxsYmFja09wdGlvbnMgPSB7XG4gIHRpbWVvdXQ6IG51bWJlclxufVxudHlwZSBSZXF1ZXN0SWRsZUNhbGxiYWNrRGVhZGxpbmUgPSB7XG4gIHJlYWRvbmx5IGRpZFRpbWVvdXQ6IGJvb2xlYW5cbiAgdGltZVJlbWFpbmluZzogKCkgPT4gbnVtYmVyXG59XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgcmVxdWVzdElkbGVDYWxsYmFjazogKFxuICAgICAgY2FsbGJhY2s6IChkZWFkbGluZTogUmVxdWVzdElkbGVDYWxsYmFja0RlYWRsaW5lKSA9PiB2b2lkLFxuICAgICAgb3B0cz86IFJlcXVlc3RJZGxlQ2FsbGJhY2tPcHRpb25zXG4gICAgKSA9PiBSZXF1ZXN0SWRsZUNhbGxiYWNrSGFuZGxlXG4gICAgY2FuY2VsSWRsZUNhbGxiYWNrOiAoaWQ6IFJlcXVlc3RJZGxlQ2FsbGJhY2tIYW5kbGUpID0+IHZvaWRcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgcmVxdWVzdElkbGVDYWxsYmFjayA9XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5yZXF1ZXN0SWRsZUNhbGxiYWNrKSB8fFxuICBmdW5jdGlvbiAoXG4gICAgY2I6IChkZWFkbGluZTogUmVxdWVzdElkbGVDYWxsYmFja0RlYWRsaW5lKSA9PiB2b2lkXG4gICk6IE5vZGVKUy5UaW1lb3V0IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpXG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2Ioe1xuICAgICAgICBkaWRUaW1lb3V0OiBmYWxzZSxcbiAgICAgICAgdGltZVJlbWFpbmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCA1MCAtIChEYXRlLm5vdygpIC0gc3RhcnQpKVxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9LCAxKVxuICB9XG5cbmV4cG9ydCBjb25zdCBjYW5jZWxJZGxlQ2FsbGJhY2sgPVxuICAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY2FuY2VsSWRsZUNhbGxiYWNrKSB8fFxuICBmdW5jdGlvbiAoaWQ6IFJlcXVlc3RJZGxlQ2FsbGJhY2tIYW5kbGUpIHtcbiAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKVxuICB9XG4iLCJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBSZWFjdEVsZW1lbnQsIFJlYWN0Tm9kZSwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGZsdXNoIGZyb20gJ3N0eWxlZC1qc3gvc2VydmVyJ1xuaW1wb3J0IHtcbiAgQU1QX1JFTkRFUl9UQVJHRVQsXG4gIE9QVElNSVpFRF9GT05UX1BST1ZJREVSUyxcbn0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL2NvbnN0YW50cydcbmltcG9ydCB7IERvY3VtZW50Q29udGV4dCBhcyBEb2N1bWVudENvbXBvbmVudENvbnRleHQgfSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvZG9jdW1lbnQtY29udGV4dCdcbmltcG9ydCB7XG4gIERvY3VtZW50Q29udGV4dCxcbiAgRG9jdW1lbnRJbml0aWFsUHJvcHMsXG4gIERvY3VtZW50UHJvcHMsXG59IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi91dGlscydcbmltcG9ydCB7XG4gIEJ1aWxkTWFuaWZlc3QsXG4gIGdldFBhZ2VGaWxlcyxcbn0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvc2VydmVyL2dldC1wYWdlLWZpbGVzJ1xuaW1wb3J0IHsgY2xlYW5BbXBQYXRoIH0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvc2VydmVyL3V0aWxzJ1xuaW1wb3J0IHsgaHRtbEVzY2FwZUpzb25TdHJpbmcgfSBmcm9tICcuLi9zZXJ2ZXIvaHRtbGVzY2FwZSdcbmltcG9ydCBTY3JpcHQsIHtcbiAgUHJvcHMgYXMgU2NyaXB0TG9hZGVyUHJvcHMsXG59IGZyb20gJy4uL2NsaWVudC9leHBlcmltZW50YWwtc2NyaXB0J1xuXG5leHBvcnQgeyBEb2N1bWVudENvbnRleHQsIERvY3VtZW50SW5pdGlhbFByb3BzLCBEb2N1bWVudFByb3BzIH1cblxuZXhwb3J0IHR5cGUgT3JpZ2luUHJvcHMgPSB7XG4gIG5vbmNlPzogc3RyaW5nXG4gIGNyb3NzT3JpZ2luPzogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGRlZHVwZTxUIGV4dGVuZHMgeyBmaWxlOiBzdHJpbmcgfT4oYnVuZGxlczogVFtdKTogVFtdIHtcbiAgY29uc3QgZmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBrZXB0OiBUW10gPSBbXVxuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGJ1bmRsZXMpIHtcbiAgICBpZiAoZmlsZXMuaGFzKGJ1bmRsZS5maWxlKSkgY29udGludWVcbiAgICBmaWxlcy5hZGQoYnVuZGxlLmZpbGUpXG4gICAga2VwdC5wdXNoKGJ1bmRsZSlcbiAgfVxuICByZXR1cm4ga2VwdFxufVxuXG50eXBlIERvY3VtZW50RmlsZXMgPSB7XG4gIHNoYXJlZEZpbGVzOiByZWFkb25seSBzdHJpbmdbXVxuICBwYWdlRmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4gIGFsbEZpbGVzOiByZWFkb25seSBzdHJpbmdbXVxufVxuXG5mdW5jdGlvbiBnZXREb2N1bWVudEZpbGVzKFxuICBidWlsZE1hbmlmZXN0OiBCdWlsZE1hbmlmZXN0LFxuICBwYXRobmFtZTogc3RyaW5nLFxuICBpbkFtcE1vZGU6IGJvb2xlYW5cbik6IERvY3VtZW50RmlsZXMge1xuICBjb25zdCBzaGFyZWRGaWxlczogcmVhZG9ubHkgc3RyaW5nW10gPSBnZXRQYWdlRmlsZXMoYnVpbGRNYW5pZmVzdCwgJy9fYXBwJylcbiAgY29uc3QgcGFnZUZpbGVzOiByZWFkb25seSBzdHJpbmdbXSA9IGluQW1wTW9kZVxuICAgID8gW11cbiAgICA6IGdldFBhZ2VGaWxlcyhidWlsZE1hbmlmZXN0LCBwYXRobmFtZSlcblxuICByZXR1cm4ge1xuICAgIHNoYXJlZEZpbGVzLFxuICAgIHBhZ2VGaWxlcyxcbiAgICBhbGxGaWxlczogWy4uLm5ldyBTZXQoWy4uLnNoYXJlZEZpbGVzLCAuLi5wYWdlRmlsZXNdKV0sXG4gIH1cbn1cblxuLyoqXG4gKiBgRG9jdW1lbnRgIGNvbXBvbmVudCBoYW5kbGVzIHRoZSBpbml0aWFsIGBkb2N1bWVudGAgbWFya3VwIGFuZCByZW5kZXJzIG9ubHkgb24gdGhlIHNlcnZlciBzaWRlLlxuICogQ29tbW9ubHkgdXNlZCBmb3IgaW1wbGVtZW50aW5nIHNlcnZlciBzaWRlIHJlbmRlcmluZyBmb3IgYGNzcy1pbi1qc2AgbGlicmFyaWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb2N1bWVudDxQID0ge30+IGV4dGVuZHMgQ29tcG9uZW50PERvY3VtZW50UHJvcHMgJiBQPiB7XG4gIHN0YXRpYyBoZWFkVGFnc01pZGRsZXdhcmUgPSBwcm9jZXNzLmVudi5fX05FWFRfUExVR0lOU1xuICAgID8gaW1wb3J0KFxuICAgICAgICAvLyBAdHMtaWdub3JlIGxvYWRlciBzeW50YXhcbiAgICAgICAgJ25leHQtcGx1Z2luLWxvYWRlcj9taWRkbGV3YXJlPWRvY3VtZW50LWhlYWQtdGFncy1zZXJ2ZXIhJ1xuICAgICAgKVxuICAgIDogKCkgPT4gW11cblxuICAvKipcbiAgICogYGdldEluaXRpYWxQcm9wc2AgaG9vayByZXR1cm5zIHRoZSBjb250ZXh0IG9iamVjdCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBgcmVuZGVyUGFnZWAuXG4gICAqIGByZW5kZXJQYWdlYCBjYWxsYmFjayBleGVjdXRlcyBgUmVhY3RgIHJlbmRlcmluZyBsb2dpYyBzeW5jaHJvbm91c2x5IHRvIHN1cHBvcnQgc2VydmVyLXJlbmRlcmluZyB3cmFwcGVyc1xuICAgKi9cbiAgc3RhdGljIGFzeW5jIGdldEluaXRpYWxQcm9wcyhcbiAgICBjdHg6IERvY3VtZW50Q29udGV4dFxuICApOiBQcm9taXNlPERvY3VtZW50SW5pdGlhbFByb3BzPiB7XG4gICAgY29uc3QgZW5oYW5jZUFwcCA9IChBcHA6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIChwcm9wczogYW55KSA9PiA8QXBwIHsuLi5wcm9wc30gLz5cbiAgICB9XG5cbiAgICBjb25zdCB7IGh0bWwsIGhlYWQgfSA9IGF3YWl0IGN0eC5yZW5kZXJQYWdlKHsgZW5oYW5jZUFwcCB9KVxuICAgIGNvbnN0IHN0eWxlcyA9IFsuLi5mbHVzaCgpXVxuICAgIHJldHVybiB7IGh0bWwsIGhlYWQsIHN0eWxlcyB9XG4gIH1cblxuICBzdGF0aWMgcmVuZGVyRG9jdW1lbnQ8UD4oXG4gICAgRG9jdW1lbnRDb21wb25lbnQ6IG5ldyAoKSA9PiBEb2N1bWVudDxQPixcbiAgICBwcm9wczogRG9jdW1lbnRQcm9wcyAmIFBcbiAgKTogUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgICByZXR1cm4gKFxuICAgICAgPERvY3VtZW50Q29tcG9uZW50Q29udGV4dC5Qcm92aWRlciB2YWx1ZT17cHJvcHN9PlxuICAgICAgICA8RG9jdW1lbnRDb21wb25lbnQgey4uLnByb3BzfSAvPlxuICAgICAgPC9Eb2N1bWVudENvbXBvbmVudENvbnRleHQuUHJvdmlkZXI+XG4gICAgKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8SHRtbD5cbiAgICAgICAgPEhlYWQgLz5cbiAgICAgICAgPGJvZHk+XG4gICAgICAgICAgPE1haW4gLz5cbiAgICAgICAgICA8TmV4dFNjcmlwdCAvPlxuICAgICAgICA8L2JvZHk+XG4gICAgICA8L0h0bWw+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBIdG1sKFxuICBwcm9wczogUmVhY3QuRGV0YWlsZWRIVE1MUHJvcHM8XG4gICAgUmVhY3QuSHRtbEhUTUxBdHRyaWJ1dGVzPEhUTUxIdG1sRWxlbWVudD4sXG4gICAgSFRNTEh0bWxFbGVtZW50XG4gID5cbikge1xuICBjb25zdCB7IGluQW1wTW9kZSwgZG9jQ29tcG9uZW50c1JlbmRlcmVkLCBsb2NhbGUgfSA9IHVzZUNvbnRleHQoXG4gICAgRG9jdW1lbnRDb21wb25lbnRDb250ZXh0XG4gIClcblxuICBkb2NDb21wb25lbnRzUmVuZGVyZWQuSHRtbCA9IHRydWVcblxuICByZXR1cm4gKFxuICAgIDxodG1sXG4gICAgICB7Li4ucHJvcHN9XG4gICAgICBsYW5nPXtwcm9wcy5sYW5nIHx8IGxvY2FsZSB8fCB1bmRlZmluZWR9XG4gICAgICBhbXA9e2luQW1wTW9kZSA/ICcnIDogdW5kZWZpbmVkfVxuICAgICAgZGF0YS1hbXBkZXZtb2RlPXtcbiAgICAgICAgaW5BbXBNb2RlICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAnJyA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IGNsYXNzIEhlYWQgZXh0ZW5kcyBDb21wb25lbnQ8XG4gIE9yaWdpblByb3BzICZcbiAgICBSZWFjdC5EZXRhaWxlZEhUTUxQcm9wczxcbiAgICAgIFJlYWN0LkhUTUxBdHRyaWJ1dGVzPEhUTUxIZWFkRWxlbWVudD4sXG4gICAgICBIVE1MSGVhZEVsZW1lbnRcbiAgICA+XG4+IHtcbiAgc3RhdGljIGNvbnRleHRUeXBlID0gRG9jdW1lbnRDb21wb25lbnRDb250ZXh0XG5cbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBub25jZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjcm9zc09yaWdpbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgfVxuXG4gIGNvbnRleHQhOiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgRG9jdW1lbnRDb21wb25lbnRDb250ZXh0PlxuXG4gIGdldENzc0xpbmtzKGZpbGVzOiBEb2N1bWVudEZpbGVzKTogSlNYLkVsZW1lbnRbXSB8IG51bGwge1xuICAgIGNvbnN0IHtcbiAgICAgIGFzc2V0UHJlZml4LFxuICAgICAgZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmcsXG4gICAgICBkeW5hbWljSW1wb3J0cyxcbiAgICB9ID0gdGhpcy5jb250ZXh0XG4gICAgY29uc3QgY3NzRmlsZXMgPSBmaWxlcy5hbGxGaWxlcy5maWx0ZXIoKGYpID0+IGYuZW5kc1dpdGgoJy5jc3MnKSlcbiAgICBjb25zdCBzaGFyZWRGaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KGZpbGVzLnNoYXJlZEZpbGVzKVxuXG4gICAgLy8gVW5tYW5hZ2VkIGZpbGVzIGFyZSBDU1MgZmlsZXMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgZGlyZWN0bHkgYnkgdGhlXG4gICAgLy8gd2VicGFjayBydW50aW1lIChgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gKS5cbiAgICBsZXQgdW5tYW5nZWRGaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KFtdKVxuICAgIGxldCBkeW5hbWljQ3NzRmlsZXMgPSBkZWR1cGUoXG4gICAgICBkeW5hbWljSW1wb3J0cy5maWx0ZXIoKGYpID0+IGYuZmlsZS5lbmRzV2l0aCgnLmNzcycpKVxuICAgICkubWFwKChmKSA9PiBmLmZpbGUpXG4gICAgaWYgKGR5bmFtaWNDc3NGaWxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3IFNldChjc3NGaWxlcylcbiAgICAgIGR5bmFtaWNDc3NGaWxlcyA9IGR5bmFtaWNDc3NGaWxlcy5maWx0ZXIoXG4gICAgICAgIChmKSA9PiAhKGV4aXN0aW5nLmhhcyhmKSB8fCBzaGFyZWRGaWxlcy5oYXMoZikpXG4gICAgICApXG4gICAgICB1bm1hbmdlZEZpbGVzID0gbmV3IFNldChkeW5hbWljQ3NzRmlsZXMpXG4gICAgICBjc3NGaWxlcy5wdXNoKC4uLmR5bmFtaWNDc3NGaWxlcylcbiAgICB9XG5cbiAgICBsZXQgY3NzTGlua0VsZW1lbnRzOiBKU1guRWxlbWVudFtdID0gW11cbiAgICBjc3NGaWxlcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICBjb25zdCBpc1NoYXJlZEZpbGUgPSBzaGFyZWRGaWxlcy5oYXMoZmlsZSlcblxuICAgICAgaWYgKCFwcm9jZXNzLmVudi5fX05FWFRfT1BUSU1JWkVfQ1NTKSB7XG4gICAgICAgIGNzc0xpbmtFbGVtZW50cy5wdXNoKFxuICAgICAgICAgIDxsaW5rXG4gICAgICAgICAgICBrZXk9e2Ake2ZpbGV9LXByZWxvYWRgfVxuICAgICAgICAgICAgbm9uY2U9e3RoaXMucHJvcHMubm9uY2V9XG4gICAgICAgICAgICByZWw9XCJwcmVsb2FkXCJcbiAgICAgICAgICAgIGhyZWY9e2Ake2Fzc2V0UHJlZml4fS9fbmV4dC8ke2VuY29kZVVSSShcbiAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgKX0ke2Rldk9ubHlDYWNoZUJ1c3RlclF1ZXJ5U3RyaW5nfWB9XG4gICAgICAgICAgICBhcz1cInN0eWxlXCJcbiAgICAgICAgICAgIGNyb3NzT3JpZ2luPXtcbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy5jcm9zc09yaWdpbiB8fCBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1VubWFuYWdlZEZpbGUgPSB1bm1hbmdlZEZpbGVzLmhhcyhmaWxlKVxuICAgICAgY3NzTGlua0VsZW1lbnRzLnB1c2goXG4gICAgICAgIDxsaW5rXG4gICAgICAgICAga2V5PXtmaWxlfVxuICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgIGhyZWY9e2Ake2Fzc2V0UHJlZml4fS9fbmV4dC8ke2VuY29kZVVSSShcbiAgICAgICAgICAgIGZpbGVcbiAgICAgICAgICApfSR7ZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmd9YH1cbiAgICAgICAgICBjcm9zc09yaWdpbj17XG4gICAgICAgICAgICB0aGlzLnByb3BzLmNyb3NzT3JpZ2luIHx8IHByb2Nlc3MuZW52Ll9fTkVYVF9DUk9TU19PUklHSU5cbiAgICAgICAgICB9XG4gICAgICAgICAgZGF0YS1uLWc9e2lzVW5tYW5hZ2VkRmlsZSA/IHVuZGVmaW5lZCA6IGlzU2hhcmVkRmlsZSA/ICcnIDogdW5kZWZpbmVkfVxuICAgICAgICAgIGRhdGEtbi1wPXtpc1VubWFuYWdlZEZpbGUgPyB1bmRlZmluZWQgOiBpc1NoYXJlZEZpbGUgPyB1bmRlZmluZWQgOiAnJ31cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICB9KVxuXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgIHByb2Nlc3MuZW52Ll9fTkVYVF9PUFRJTUlaRV9GT05UU1xuICAgICkge1xuICAgICAgY3NzTGlua0VsZW1lbnRzID0gdGhpcy5tYWtlU3R5bGVzaGVldEluZXJ0KFxuICAgICAgICBjc3NMaW5rRWxlbWVudHNcbiAgICAgICkgYXMgUmVhY3RFbGVtZW50W11cbiAgICB9XG5cbiAgICByZXR1cm4gY3NzTGlua0VsZW1lbnRzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiBjc3NMaW5rRWxlbWVudHNcbiAgfVxuXG4gIGdldFByZWxvYWREeW5hbWljQ2h1bmtzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGR5bmFtaWNJbXBvcnRzLFxuICAgICAgYXNzZXRQcmVmaXgsXG4gICAgICBkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZyxcbiAgICB9ID0gdGhpcy5jb250ZXh0XG5cbiAgICByZXR1cm4gKFxuICAgICAgZGVkdXBlKGR5bmFtaWNJbXBvcnRzKVxuICAgICAgICAubWFwKChidW5kbGUpID0+IHtcbiAgICAgICAgICBpZiAoIWJ1bmRsZS5maWxlLmVuZHNXaXRoKCcuanMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpbmtcbiAgICAgICAgICAgICAgcmVsPVwicHJlbG9hZFwiXG4gICAgICAgICAgICAgIGtleT17YnVuZGxlLmZpbGV9XG4gICAgICAgICAgICAgIGhyZWY9e2Ake2Fzc2V0UHJlZml4fS9fbmV4dC8ke2VuY29kZVVSSShcbiAgICAgICAgICAgICAgICBidW5kbGUuZmlsZVxuICAgICAgICAgICAgICApfSR7ZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmd9YH1cbiAgICAgICAgICAgICAgYXM9XCJzY3JpcHRcIlxuICAgICAgICAgICAgICBub25jZT17dGhpcy5wcm9wcy5ub25jZX1cbiAgICAgICAgICAgICAgY3Jvc3NPcmlnaW49e1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuY3Jvc3NPcmlnaW4gfHwgcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgICAgLy8gRmlsdGVyIG91dCBudWxsZWQgc2NyaXB0c1xuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgKVxuICB9XG5cbiAgZ2V0UHJlbG9hZE1haW5MaW5rcyhmaWxlczogRG9jdW1lbnRGaWxlcyk6IEpTWC5FbGVtZW50W10gfCBudWxsIHtcbiAgICBjb25zdCB7XG4gICAgICBhc3NldFByZWZpeCxcbiAgICAgIGRldk9ubHlDYWNoZUJ1c3RlclF1ZXJ5U3RyaW5nLFxuICAgICAgc2NyaXB0TG9hZGVyLFxuICAgIH0gPSB0aGlzLmNvbnRleHRcbiAgICBjb25zdCBwcmVsb2FkRmlsZXMgPSBmaWxlcy5hbGxGaWxlcy5maWx0ZXIoKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGZpbGUuZW5kc1dpdGgoJy5qcycpXG4gICAgfSlcblxuICAgIHJldHVybiBbXG4gICAgICAuLi4oc2NyaXB0TG9hZGVyLmVhZ2VyIHx8IFtdKS5tYXAoKGZpbGUpID0+IChcbiAgICAgICAgPGxpbmtcbiAgICAgICAgICBrZXk9e2ZpbGUuc3JjfVxuICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgIHJlbD1cInByZWxvYWRcIlxuICAgICAgICAgIGhyZWY9e2ZpbGUuc3JjfVxuICAgICAgICAgIGFzPVwic2NyaXB0XCJcbiAgICAgICAgICBjcm9zc09yaWdpbj17XG4gICAgICAgICAgICB0aGlzLnByb3BzLmNyb3NzT3JpZ2luIHx8IHByb2Nlc3MuZW52Ll9fTkVYVF9DUk9TU19PUklHSU5cbiAgICAgICAgICB9XG4gICAgICAgIC8+XG4gICAgICApKSxcbiAgICAgIC4uLnByZWxvYWRGaWxlcy5tYXAoKGZpbGU6IHN0cmluZykgPT4gKFxuICAgICAgICA8bGlua1xuICAgICAgICAgIGtleT17ZmlsZX1cbiAgICAgICAgICBub25jZT17dGhpcy5wcm9wcy5ub25jZX1cbiAgICAgICAgICByZWw9XCJwcmVsb2FkXCJcbiAgICAgICAgICBocmVmPXtgJHthc3NldFByZWZpeH0vX25leHQvJHtlbmNvZGVVUkkoXG4gICAgICAgICAgICBmaWxlXG4gICAgICAgICAgKX0ke2Rldk9ubHlDYWNoZUJ1c3RlclF1ZXJ5U3RyaW5nfWB9XG4gICAgICAgICAgYXM9XCJzY3JpcHRcIlxuICAgICAgICAgIGNyb3NzT3JpZ2luPXtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY3Jvc3NPcmlnaW4gfHwgcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgICkpLFxuICAgICAgLi4uKHNjcmlwdExvYWRlci5kZWZlciB8fCBbXSkubWFwKChmaWxlOiBzdHJpbmcpID0+IChcbiAgICAgICAgPGxpbmtcbiAgICAgICAgICBrZXk9e2ZpbGV9XG4gICAgICAgICAgbm9uY2U9e3RoaXMucHJvcHMubm9uY2V9XG4gICAgICAgICAgcmVsPVwicHJlbG9hZFwiXG4gICAgICAgICAgaHJlZj17ZmlsZX1cbiAgICAgICAgICBhcz1cInNjcmlwdFwiXG4gICAgICAgICAgY3Jvc3NPcmlnaW49e1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5jcm9zc09yaWdpbiB8fCBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgKSksXG4gICAgXVxuICB9XG5cbiAgaGFuZGxlRG9jdW1lbnRTY3JpcHRMb2FkZXJJdGVtcyhjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlKTogUmVhY3ROb2RlW10ge1xuICAgIGNvbnN0IHsgc2NyaXB0TG9hZGVyIH0gPSB0aGlzLmNvbnRleHRcbiAgICBjb25zdCBzY3JpcHRMb2FkZXJJdGVtczogU2NyaXB0TG9hZGVyUHJvcHNbXSA9IFtdXG4gICAgY29uc3QgZmlsdGVyZWRDaGlsZHJlbjogUmVhY3ROb2RlW10gPSBbXVxuXG4gICAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlID09PSBTY3JpcHQpIHtcbiAgICAgICAgaWYgKGNoaWxkLnByb3BzLnN0cmF0ZWd5ID09PSAnZWFnZXInKSB7XG4gICAgICAgICAgc2NyaXB0TG9hZGVyLmVhZ2VyID0gKHNjcmlwdExvYWRlci5lYWdlciB8fCBbXSkuY29uY2F0KFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLi4uY2hpbGQucHJvcHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH0gZWxzZSBpZiAoWydsYXp5JywgJ2RlZmVyJ10uaW5jbHVkZXMoY2hpbGQucHJvcHMuc3RyYXRlZ3kpKSB7XG4gICAgICAgICAgc2NyaXB0TG9hZGVySXRlbXMucHVzaChjaGlsZC5wcm9wcylcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmaWx0ZXJlZENoaWxkcmVuLnB1c2goY2hpbGQpXG4gICAgfSlcblxuICAgIHRoaXMuY29udGV4dC5fX05FWFRfREFUQV9fLnNjcmlwdExvYWRlciA9IHNjcmlwdExvYWRlckl0ZW1zXG5cbiAgICByZXR1cm4gZmlsdGVyZWRDaGlsZHJlblxuICB9XG5cbiAgbWFrZVN0eWxlc2hlZXRJbmVydChub2RlOiBSZWFjdE5vZGUpOiBSZWFjdE5vZGVbXSB7XG4gICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm1hcChub2RlLCAoYzogYW55KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGMudHlwZSA9PT0gJ2xpbmsnICYmXG4gICAgICAgIGMucHJvcHNbJ2hyZWYnXSAmJlxuICAgICAgICBPUFRJTUlaRURfRk9OVF9QUk9WSURFUlMuc29tZSgodXJsKSA9PiBjLnByb3BzWydocmVmJ10uc3RhcnRzV2l0aCh1cmwpKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG5ld1Byb3BzID0geyAuLi4oYy5wcm9wcyB8fCB7fSkgfVxuICAgICAgICBuZXdQcm9wc1snZGF0YS1ocmVmJ10gPSBuZXdQcm9wc1snaHJlZiddXG4gICAgICAgIG5ld1Byb3BzWydocmVmJ10gPSB1bmRlZmluZWRcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNsb25lRWxlbWVudChjLCBuZXdQcm9wcylcbiAgICAgIH0gZWxzZSBpZiAoYy5wcm9wcyAmJiBjLnByb3BzWydjaGlsZHJlbiddKSB7XG4gICAgICAgIGMucHJvcHNbJ2NoaWxkcmVuJ10gPSB0aGlzLm1ha2VTdHlsZXNoZWV0SW5lcnQoYy5wcm9wc1snY2hpbGRyZW4nXSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBjXG4gICAgfSlcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZXMsXG4gICAgICBhbXBQYXRoLFxuICAgICAgaW5BbXBNb2RlLFxuICAgICAgaHlicmlkQW1wLFxuICAgICAgY2Fub25pY2FsQmFzZSxcbiAgICAgIF9fTkVYVF9EQVRBX18sXG4gICAgICBkYW5nZXJvdXNBc1BhdGgsXG4gICAgICBoZWFkVGFncyxcbiAgICAgIHVuc3RhYmxlX3J1bnRpbWVKUyxcbiAgICAgIHVuc3RhYmxlX0pzUHJlbG9hZCxcbiAgICB9ID0gdGhpcy5jb250ZXh0XG4gICAgY29uc3QgZGlzYWJsZVJ1bnRpbWVKUyA9IHVuc3RhYmxlX3J1bnRpbWVKUyA9PT0gZmFsc2VcbiAgICBjb25zdCBkaXNhYmxlSnNQcmVsb2FkID0gdW5zdGFibGVfSnNQcmVsb2FkID09PSBmYWxzZVxuXG4gICAgdGhpcy5jb250ZXh0LmRvY0NvbXBvbmVudHNSZW5kZXJlZC5IZWFkID0gdHJ1ZVxuXG4gICAgbGV0IHsgaGVhZCB9ID0gdGhpcy5jb250ZXh0XG4gICAgbGV0IGNzc1ByZWxvYWRzOiBBcnJheTxKU1guRWxlbWVudD4gPSBbXVxuICAgIGxldCBvdGhlckhlYWRFbGVtZW50czogQXJyYXk8SlNYLkVsZW1lbnQ+ID0gW11cbiAgICBpZiAoaGVhZCkge1xuICAgICAgaGVhZC5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjICYmXG4gICAgICAgICAgYy50eXBlID09PSAnbGluaycgJiZcbiAgICAgICAgICBjLnByb3BzWydyZWwnXSA9PT0gJ3ByZWxvYWQnICYmXG4gICAgICAgICAgYy5wcm9wc1snYXMnXSA9PT0gJ3N0eWxlJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjc3NQcmVsb2Fkcy5wdXNoKGMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYyAmJiBvdGhlckhlYWRFbGVtZW50cy5wdXNoKGMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBoZWFkID0gY3NzUHJlbG9hZHMuY29uY2F0KG90aGVySGVhZEVsZW1lbnRzKVxuICAgIH1cbiAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuXG4gICAgLy8gc2hvdyBhIHdhcm5pbmcgaWYgSGVhZCBjb250YWlucyA8dGl0bGU+IChvbmx5IGluIGRldmVsb3BtZW50KVxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGlsZHJlbiA9IFJlYWN0LkNoaWxkcmVuLm1hcChjaGlsZHJlbiwgKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaXNSZWFjdEhlbG1ldCA9IGNoaWxkPy5wcm9wcz8uWydkYXRhLXJlYWN0LWhlbG1ldCddXG4gICAgICAgIGlmICghaXNSZWFjdEhlbG1ldCkge1xuICAgICAgICAgIGlmIChjaGlsZD8udHlwZSA9PT0gJ3RpdGxlJykge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICBcIldhcm5pbmc6IDx0aXRsZT4gc2hvdWxkIG5vdCBiZSB1c2VkIGluIF9kb2N1bWVudC5qcydzIDxIZWFkPi4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvbm8tZG9jdW1lbnQtdGl0bGVcIlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBjaGlsZD8udHlwZSA9PT0gJ21ldGEnICYmXG4gICAgICAgICAgICBjaGlsZD8ucHJvcHM/Lm5hbWUgPT09ICd2aWV3cG9ydCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgXCJXYXJuaW5nOiB2aWV3cG9ydCBtZXRhIHRhZ3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluIF9kb2N1bWVudC5qcydzIDxIZWFkPi4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvbm8tZG9jdW1lbnQtdmlld3BvcnQtbWV0YVwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGlsZFxuICAgICAgfSlcbiAgICAgIGlmICh0aGlzLnByb3BzLmNyb3NzT3JpZ2luKVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1dhcm5pbmc6IGBIZWFkYCBhdHRyaWJ1dGUgYGNyb3NzT3JpZ2luYCBpcyBkZXByZWNhdGVkLiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9kb2MtY3Jvc3NvcmlnaW4tZGVwcmVjYXRlZCdcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAnZGV2ZWxvcG1lbnQnICYmXG4gICAgICBwcm9jZXNzLmVudi5fX05FWFRfT1BUSU1JWkVfRk9OVFMgJiZcbiAgICAgICFpbkFtcE1vZGVcbiAgICApIHtcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5tYWtlU3R5bGVzaGVldEluZXJ0KGNoaWxkcmVuKVxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfU0NSSVBUX0xPQURFUikge1xuICAgICAgY2hpbGRyZW4gPSB0aGlzLmhhbmRsZURvY3VtZW50U2NyaXB0TG9hZGVySXRlbXMoY2hpbGRyZW4pXG4gICAgfVxuXG4gICAgbGV0IGhhc0FtcGh0bWxSZWwgPSBmYWxzZVxuICAgIGxldCBoYXNDYW5vbmljYWxSZWwgPSBmYWxzZVxuXG4gICAgLy8gc2hvdyB3YXJuaW5nIGFuZCByZW1vdmUgY29uZmxpY3RpbmcgYW1wIGhlYWQgdGFnc1xuICAgIGhlYWQgPSBSZWFjdC5DaGlsZHJlbi5tYXAoaGVhZCB8fCBbXSwgKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoIWNoaWxkKSByZXR1cm4gY2hpbGRcbiAgICAgIGNvbnN0IHsgdHlwZSwgcHJvcHMgfSA9IGNoaWxkXG4gICAgICBpZiAoaW5BbXBNb2RlKSB7XG4gICAgICAgIGxldCBiYWRQcm9wOiBzdHJpbmcgPSAnJ1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnbWV0YScgJiYgcHJvcHMubmFtZSA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgICAgICAgIGJhZFByb3AgPSAnbmFtZT1cInZpZXdwb3J0XCInXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmsnICYmIHByb3BzLnJlbCA9PT0gJ2Nhbm9uaWNhbCcpIHtcbiAgICAgICAgICBoYXNDYW5vbmljYWxSZWwgPSB0cnVlXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgICAvLyBvbmx5IGJsb2NrIGlmXG4gICAgICAgICAgLy8gMS4gaXQgaGFzIGEgc3JjIGFuZCBpc24ndCBwb2ludGluZyB0byBhbXBwcm9qZWN0J3MgQ0ROXG4gICAgICAgICAgLy8gMi4gaXQgaXMgdXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgd2l0aG91dCBhIHR5cGUgb3JcbiAgICAgICAgICAvLyBhIHR5cGUgb2YgdGV4dC9qYXZhc2NyaXB0XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHByb3BzLnNyYyAmJiBwcm9wcy5zcmMuaW5kZXhPZignYW1wcHJvamVjdCcpIDwgLTEpIHx8XG4gICAgICAgICAgICAocHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgJiZcbiAgICAgICAgICAgICAgKCFwcm9wcy50eXBlIHx8IHByb3BzLnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGJhZFByb3AgPSAnPHNjcmlwdCdcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3BzKS5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICAgIGJhZFByb3AgKz0gYCAke3Byb3B9PVwiJHtwcm9wc1twcm9wXX1cImBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBiYWRQcm9wICs9ICcvPidcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFkUHJvcCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBGb3VuZCBjb25mbGljdGluZyBhbXAgdGFnIFwiJHtjaGlsZC50eXBlfVwiIHdpdGggY29uZmxpY3RpbmcgcHJvcCAke2JhZFByb3B9IGluICR7X19ORVhUX0RBVEFfXy5wYWdlfS4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvY29uZmxpY3RpbmctYW1wLXRhZ2BcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm9uLWFtcCBtb2RlXG4gICAgICAgIGlmICh0eXBlID09PSAnbGluaycgJiYgcHJvcHMucmVsID09PSAnYW1waHRtbCcpIHtcbiAgICAgICAgICBoYXNBbXBodG1sUmVsID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hpbGRcbiAgICB9KVxuXG4gICAgLy8gdHJ5IHRvIHBhcnNlIHN0eWxlcyBmcm9tIGZyYWdtZW50IGZvciBiYWNrd2FyZHMgY29tcGF0XG4gICAgY29uc3QgY3VyU3R5bGVzOiBSZWFjdC5SZWFjdEVsZW1lbnRbXSA9IEFycmF5LmlzQXJyYXkoc3R5bGVzKVxuICAgICAgPyAoc3R5bGVzIGFzIFJlYWN0LlJlYWN0RWxlbWVudFtdKVxuICAgICAgOiBbXVxuICAgIGlmIChcbiAgICAgIGluQW1wTW9kZSAmJlxuICAgICAgc3R5bGVzICYmXG4gICAgICAvLyBAdHMtaWdub3JlIFByb3BlcnR5ICdwcm9wcycgZG9lcyBub3QgZXhpc3Qgb24gdHlwZSBSZWFjdEVsZW1lbnRcbiAgICAgIHN0eWxlcy5wcm9wcyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSBQcm9wZXJ0eSAncHJvcHMnIGRvZXMgbm90IGV4aXN0IG9uIHR5cGUgUmVhY3RFbGVtZW50XG4gICAgICBBcnJheS5pc0FycmF5KHN0eWxlcy5wcm9wcy5jaGlsZHJlbilcbiAgICApIHtcbiAgICAgIGNvbnN0IGhhc1N0eWxlcyA9IChlbDogUmVhY3QuUmVhY3RFbGVtZW50KSA9PlxuICAgICAgICBlbD8ucHJvcHM/LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPy5fX2h0bWxcbiAgICAgIC8vIEB0cy1pZ25vcmUgUHJvcGVydHkgJ3Byb3BzJyBkb2VzIG5vdCBleGlzdCBvbiB0eXBlIFJlYWN0RWxlbWVudFxuICAgICAgc3R5bGVzLnByb3BzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBSZWFjdC5SZWFjdEVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGQpKSB7XG4gICAgICAgICAgY2hpbGQuZm9yRWFjaCgoZWwpID0+IGhhc1N0eWxlcyhlbCkgJiYgY3VyU3R5bGVzLnB1c2goZWwpKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc1N0eWxlcyhjaGlsZCkpIHtcbiAgICAgICAgICBjdXJTdHlsZXMucHVzaChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlczogRG9jdW1lbnRGaWxlcyA9IGdldERvY3VtZW50RmlsZXMoXG4gICAgICB0aGlzLmNvbnRleHQuYnVpbGRNYW5pZmVzdCxcbiAgICAgIHRoaXMuY29udGV4dC5fX05FWFRfREFUQV9fLnBhZ2UsXG4gICAgICBpbkFtcE1vZGVcbiAgICApXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGhlYWQgey4uLnRoaXMucHJvcHN9PlxuICAgICAgICB7dGhpcy5jb250ZXh0LmlzRGV2ZWxvcG1lbnQgJiYgKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8c3R5bGVcbiAgICAgICAgICAgICAgZGF0YS1uZXh0LWhpZGUtZm91Y1xuICAgICAgICAgICAgICBkYXRhLWFtcGRldm1vZGU9e2luQW1wTW9kZSA/ICd0cnVlJyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICBfX2h0bWw6IGBib2R5e2Rpc3BsYXk6bm9uZX1gLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxub3NjcmlwdFxuICAgICAgICAgICAgICBkYXRhLW5leHQtaGlkZS1mb3VjXG4gICAgICAgICAgICAgIGRhdGEtYW1wZGV2bW9kZT17aW5BbXBNb2RlID8gJ3RydWUnIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3R5bGVcbiAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgICAgICAgX19odG1sOiBgYm9keXtkaXNwbGF5OmJsb2NrfWAsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbm9zY3JpcHQ+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAge2hlYWR9XG4gICAgICAgIDxtZXRhXG4gICAgICAgICAgbmFtZT1cIm5leHQtaGVhZC1jb3VudFwiXG4gICAgICAgICAgY29udGVudD17UmVhY3QuQ2hpbGRyZW4uY291bnQoaGVhZCB8fCBbXSkudG9TdHJpbmcoKX1cbiAgICAgICAgLz5cbiAgICAgICAge2luQW1wTW9kZSAmJiAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxtZXRhXG4gICAgICAgICAgICAgIG5hbWU9XCJ2aWV3cG9ydFwiXG4gICAgICAgICAgICAgIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsbWluaW11bS1zY2FsZT0xLGluaXRpYWwtc2NhbGU9MVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgeyFoYXNDYW5vbmljYWxSZWwgJiYgKFxuICAgICAgICAgICAgICA8bGlua1xuICAgICAgICAgICAgICAgIHJlbD1cImNhbm9uaWNhbFwiXG4gICAgICAgICAgICAgICAgaHJlZj17Y2Fub25pY2FsQmFzZSArIGNsZWFuQW1wUGF0aChkYW5nZXJvdXNBc1BhdGgpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHsvKiBodHRwczovL3d3dy5hbXBwcm9qZWN0Lm9yZy9kb2NzL2Z1bmRhbWVudGFscy9vcHRpbWl6ZV9hbXAjb3B0aW1pemUtdGhlLWFtcC1ydW50aW1lLWxvYWRpbmcgKi99XG4gICAgICAgICAgICA8bGlua1xuICAgICAgICAgICAgICByZWw9XCJwcmVsb2FkXCJcbiAgICAgICAgICAgICAgYXM9XCJzY3JpcHRcIlxuICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9jZG4uYW1wcHJvamVjdC5vcmcvdjAuanNcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIHsvKiBBZGQgY3VzdG9tIHN0eWxlcyBiZWZvcmUgQU1QIHN0eWxlcyB0byBwcmV2ZW50IGFjY2lkZW50YWwgb3ZlcnJpZGVzICovfVxuICAgICAgICAgICAge3N0eWxlcyAmJiAoXG4gICAgICAgICAgICAgIDxzdHlsZVxuICAgICAgICAgICAgICAgIGFtcC1jdXN0b209XCJcIlxuICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICAgICAgICBfX2h0bWw6IGN1clN0eWxlc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChzdHlsZSkgPT4gc3R5bGUucHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcL1xcKiMgc291cmNlTWFwcGluZ1VSTD0uKlxcKlxcLy9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcL1xcKkAgc291cmNlVVJMPS4qP1xcKlxcLy9nLCAnJyksXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8c3R5bGVcbiAgICAgICAgICAgICAgYW1wLWJvaWxlcnBsYXRlPVwiXCJcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICBfX2h0bWw6IGBib2R5ey13ZWJraXQtYW5pbWF0aW9uOi1hbXAtc3RhcnQgOHMgc3RlcHMoMSxlbmQpIDBzIDEgbm9ybWFsIGJvdGg7LW1vei1hbmltYXRpb246LWFtcC1zdGFydCA4cyBzdGVwcygxLGVuZCkgMHMgMSBub3JtYWwgYm90aDstbXMtYW5pbWF0aW9uOi1hbXAtc3RhcnQgOHMgc3RlcHMoMSxlbmQpIDBzIDEgbm9ybWFsIGJvdGg7YW5pbWF0aW9uOi1hbXAtc3RhcnQgOHMgc3RlcHMoMSxlbmQpIDBzIDEgbm9ybWFsIGJvdGh9QC13ZWJraXQta2V5ZnJhbWVzIC1hbXAtc3RhcnR7ZnJvbXt2aXNpYmlsaXR5OmhpZGRlbn10b3t2aXNpYmlsaXR5OnZpc2libGV9fUAtbW96LWtleWZyYW1lcyAtYW1wLXN0YXJ0e2Zyb217dmlzaWJpbGl0eTpoaWRkZW59dG97dmlzaWJpbGl0eTp2aXNpYmxlfX1ALW1zLWtleWZyYW1lcyAtYW1wLXN0YXJ0e2Zyb217dmlzaWJpbGl0eTpoaWRkZW59dG97dmlzaWJpbGl0eTp2aXNpYmxlfX1ALW8ta2V5ZnJhbWVzIC1hbXAtc3RhcnR7ZnJvbXt2aXNpYmlsaXR5OmhpZGRlbn10b3t2aXNpYmlsaXR5OnZpc2libGV9fUBrZXlmcmFtZXMgLWFtcC1zdGFydHtmcm9te3Zpc2liaWxpdHk6aGlkZGVufXRve3Zpc2liaWxpdHk6dmlzaWJsZX19YCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8bm9zY3JpcHQ+XG4gICAgICAgICAgICAgIDxzdHlsZVxuICAgICAgICAgICAgICAgIGFtcC1ib2lsZXJwbGF0ZT1cIlwiXG4gICAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICAgIF9faHRtbDogYGJvZHl7LXdlYmtpdC1hbmltYXRpb246bm9uZTstbW96LWFuaW1hdGlvbjpub25lOy1tcy1hbmltYXRpb246bm9uZTthbmltYXRpb246bm9uZX1gLFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L25vc2NyaXB0PlxuICAgICAgICAgICAgPHNjcmlwdCBhc3luYyBzcmM9XCJodHRwczovL2Nkbi5hbXBwcm9qZWN0Lm9yZy92MC5qc1wiIC8+XG4gICAgICAgICAgPC8+XG4gICAgICAgICl9XG4gICAgICAgIHshaW5BbXBNb2RlICYmIChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgeyFoYXNBbXBodG1sUmVsICYmIGh5YnJpZEFtcCAmJiAoXG4gICAgICAgICAgICAgIDxsaW5rXG4gICAgICAgICAgICAgICAgcmVsPVwiYW1waHRtbFwiXG4gICAgICAgICAgICAgICAgaHJlZj17Y2Fub25pY2FsQmFzZSArIGdldEFtcFBhdGgoYW1wUGF0aCwgZGFuZ2Vyb3VzQXNQYXRoKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7IXByb2Nlc3MuZW52Ll9fTkVYVF9PUFRJTUlaRV9DU1MgJiYgdGhpcy5nZXRDc3NMaW5rcyhmaWxlcyl9XG4gICAgICAgICAgICB7IXByb2Nlc3MuZW52Ll9fTkVYVF9PUFRJTUlaRV9DU1MgJiYgKFxuICAgICAgICAgICAgICA8bm9zY3JpcHQgZGF0YS1uLWNzcz17dGhpcy5wcm9wcy5ub25jZSA/PyAnJ30gLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7IWRpc2FibGVSdW50aW1lSlMgJiZcbiAgICAgICAgICAgICAgIWRpc2FibGVKc1ByZWxvYWQgJiZcbiAgICAgICAgICAgICAgdGhpcy5nZXRQcmVsb2FkRHluYW1pY0NodW5rcygpfVxuICAgICAgICAgICAgeyFkaXNhYmxlUnVudGltZUpTICYmXG4gICAgICAgICAgICAgICFkaXNhYmxlSnNQcmVsb2FkICYmXG4gICAgICAgICAgICAgIHRoaXMuZ2V0UHJlbG9hZE1haW5MaW5rcyhmaWxlcyl9XG4gICAgICAgICAgICB7cHJvY2Vzcy5lbnYuX19ORVhUX09QVElNSVpFX0NTUyAmJiB0aGlzLmdldENzc0xpbmtzKGZpbGVzKX1cbiAgICAgICAgICAgIHtwcm9jZXNzLmVudi5fX05FWFRfT1BUSU1JWkVfQ1NTICYmIChcbiAgICAgICAgICAgICAgPG5vc2NyaXB0IGRhdGEtbi1jc3M9e3RoaXMucHJvcHMubm9uY2UgPz8gJyd9IC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3RoaXMuY29udGV4dC5pc0RldmVsb3BtZW50ICYmIChcbiAgICAgICAgICAgICAgLy8gdGhpcyBlbGVtZW50IGlzIHVzZWQgdG8gbW91bnQgZGV2ZWxvcG1lbnQgc3R5bGVzIHNvIHRoZVxuICAgICAgICAgICAgICAvLyBvcmRlcmluZyBtYXRjaGVzIHByb2R1Y3Rpb25cbiAgICAgICAgICAgICAgLy8gKGJ5IGRlZmF1bHQsIHN0eWxlLWxvYWRlciBpbmplY3RzIGF0IHRoZSBib3R0b20gb2YgPGhlYWQgLz4pXG4gICAgICAgICAgICAgIDxub3NjcmlwdCBpZD1cIl9fbmV4dF9jc3NfX0RPX05PVF9VU0VfX1wiIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge3N0eWxlcyB8fCBudWxsfVxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwge30sIC4uLihoZWFkVGFncyB8fCBbXSkpfVxuICAgICAgPC9oZWFkPlxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTWFpbigpIHtcbiAgY29uc3QgeyBpbkFtcE1vZGUsIGh0bWwsIGRvY0NvbXBvbmVudHNSZW5kZXJlZCB9ID0gdXNlQ29udGV4dChcbiAgICBEb2N1bWVudENvbXBvbmVudENvbnRleHRcbiAgKVxuXG4gIGRvY0NvbXBvbmVudHNSZW5kZXJlZC5NYWluID0gdHJ1ZVxuXG4gIGlmIChpbkFtcE1vZGUpIHJldHVybiA8PntBTVBfUkVOREVSX1RBUkdFVH08Lz5cbiAgcmV0dXJuIDxkaXYgaWQ9XCJfX25leHRcIiBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6IGh0bWwgfX0gLz5cbn1cblxuZXhwb3J0IGNsYXNzIE5leHRTY3JpcHQgZXh0ZW5kcyBDb21wb25lbnQ8T3JpZ2luUHJvcHM+IHtcbiAgc3RhdGljIGNvbnRleHRUeXBlID0gRG9jdW1lbnRDb21wb25lbnRDb250ZXh0XG5cbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBub25jZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjcm9zc09yaWdpbjogUHJvcFR5cGVzLnN0cmluZyxcbiAgfVxuXG4gIGNvbnRleHQhOiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgRG9jdW1lbnRDb21wb25lbnRDb250ZXh0PlxuXG4gIC8vIFNvdXJjZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2FtdGhvci82NGIxMTRlNGE0ZjUzOTkxNWE5NWI5MWZmZDM0MGFjY1xuICBzdGF0aWMgc2FmYXJpTm9tb2R1bGVGaXggPVxuICAgICchZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudCx0PWUuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtpZighKFwibm9Nb2R1bGVcImluIHQpJiZcIm9uYmVmb3JlbG9hZFwiaW4gdCl7dmFyIG49ITE7ZS5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JlbG9hZFwiLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0PT09dCluPSEwO2Vsc2UgaWYoIWUudGFyZ2V0Lmhhc0F0dHJpYnV0ZShcIm5vbW9kdWxlXCIpfHwhbilyZXR1cm47ZS5wcmV2ZW50RGVmYXVsdCgpfSwhMCksdC50eXBlPVwibW9kdWxlXCIsdC5zcmM9XCIuXCIsZS5oZWFkLmFwcGVuZENoaWxkKHQpLHQucmVtb3ZlKCl9fSgpOydcblxuICBnZXREeW5hbWljQ2h1bmtzKGZpbGVzOiBEb2N1bWVudEZpbGVzKSB7XG4gICAgY29uc3Qge1xuICAgICAgZHluYW1pY0ltcG9ydHMsXG4gICAgICBhc3NldFByZWZpeCxcbiAgICAgIGlzRGV2ZWxvcG1lbnQsXG4gICAgICBkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZyxcbiAgICB9ID0gdGhpcy5jb250ZXh0XG5cbiAgICByZXR1cm4gZGVkdXBlKGR5bmFtaWNJbXBvcnRzKS5tYXAoKGJ1bmRsZSkgPT4ge1xuICAgICAgaWYgKCFidW5kbGUuZmlsZS5lbmRzV2l0aCgnLmpzJykgfHwgZmlsZXMuYWxsRmlsZXMuaW5jbHVkZXMoYnVuZGxlLmZpbGUpKVxuICAgICAgICByZXR1cm4gbnVsbFxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgYXN5bmM9eyFpc0RldmVsb3BtZW50fVxuICAgICAgICAgIGtleT17YnVuZGxlLmZpbGV9XG4gICAgICAgICAgc3JjPXtgJHthc3NldFByZWZpeH0vX25leHQvJHtlbmNvZGVVUkkoXG4gICAgICAgICAgICBidW5kbGUuZmlsZVxuICAgICAgICAgICl9JHtkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZ31gfVxuICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgIGNyb3NzT3JpZ2luPXtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY3Jvc3NPcmlnaW4gfHwgcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgZ2V0UHJlTmV4dFNjcmlwdHMoKSB7XG4gICAgY29uc3QgeyBzY3JpcHRMb2FkZXIgfSA9IHRoaXMuY29udGV4dFxuXG4gICAgcmV0dXJuIChzY3JpcHRMb2FkZXIuZWFnZXIgfHwgW10pLm1hcCgoZmlsZTogU2NyaXB0TG9hZGVyUHJvcHMpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyYXRlZ3ksIC4uLnByb3BzIH0gPSBmaWxlXG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgey4uLnByb3BzfVxuICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgIGNyb3NzT3JpZ2luPXtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY3Jvc3NPcmlnaW4gfHwgcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTlxuICAgICAgICAgIH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgZ2V0U2NyaXB0cyhmaWxlczogRG9jdW1lbnRGaWxlcykge1xuICAgIGNvbnN0IHtcbiAgICAgIGFzc2V0UHJlZml4LFxuICAgICAgYnVpbGRNYW5pZmVzdCxcbiAgICAgIGlzRGV2ZWxvcG1lbnQsXG4gICAgICBkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZyxcbiAgICB9ID0gdGhpcy5jb250ZXh0XG5cbiAgICBjb25zdCBub3JtYWxTY3JpcHRzID0gZmlsZXMuYWxsRmlsZXMuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcuanMnKSlcbiAgICBjb25zdCBsb3dQcmlvcml0eVNjcmlwdHMgPSBidWlsZE1hbmlmZXN0Lmxvd1ByaW9yaXR5RmlsZXM/LmZpbHRlcigoZmlsZSkgPT5cbiAgICAgIGZpbGUuZW5kc1dpdGgoJy5qcycpXG4gICAgKVxuXG4gICAgcmV0dXJuIFsuLi5ub3JtYWxTY3JpcHRzLCAuLi5sb3dQcmlvcml0eVNjcmlwdHNdLm1hcCgoZmlsZSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGtleT17ZmlsZX1cbiAgICAgICAgICBzcmM9e2Ake2Fzc2V0UHJlZml4fS9fbmV4dC8ke2VuY29kZVVSSShcbiAgICAgICAgICAgIGZpbGVcbiAgICAgICAgICApfSR7ZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmd9YH1cbiAgICAgICAgICBub25jZT17dGhpcy5wcm9wcy5ub25jZX1cbiAgICAgICAgICBhc3luYz17IWlzRGV2ZWxvcG1lbnR9XG4gICAgICAgICAgY3Jvc3NPcmlnaW49e1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5jcm9zc09yaWdpbiB8fCBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOXG4gICAgICAgICAgfVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICBnZXRQb2x5ZmlsbFNjcmlwdHMoKSB7XG4gICAgLy8gcG9seWZpbGxzLmpzIGhhcyB0byBiZSByZW5kZXJlZCBhcyBub21vZHVsZSB3aXRob3V0IGFzeW5jXG4gICAgLy8gSXQgYWxzbyBoYXMgdG8gYmUgdGhlIGZpcnN0IHNjcmlwdCB0byBsb2FkXG4gICAgY29uc3Qge1xuICAgICAgYXNzZXRQcmVmaXgsXG4gICAgICBidWlsZE1hbmlmZXN0LFxuICAgICAgZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmcsXG4gICAgfSA9IHRoaXMuY29udGV4dFxuXG4gICAgcmV0dXJuIGJ1aWxkTWFuaWZlc3QucG9seWZpbGxGaWxlc1xuICAgICAgLmZpbHRlcihcbiAgICAgICAgKHBvbHlmaWxsKSA9PlxuICAgICAgICAgIHBvbHlmaWxsLmVuZHNXaXRoKCcuanMnKSAmJiAhcG9seWZpbGwuZW5kc1dpdGgoJy5tb2R1bGUuanMnKVxuICAgICAgKVxuICAgICAgLm1hcCgocG9seWZpbGwpID0+IChcbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGtleT17cG9seWZpbGx9XG4gICAgICAgICAgbm9uY2U9e3RoaXMucHJvcHMubm9uY2V9XG4gICAgICAgICAgY3Jvc3NPcmlnaW49e1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5jcm9zc09yaWdpbiB8fCBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOXG4gICAgICAgICAgfVxuICAgICAgICAgIG5vTW9kdWxlPXt0cnVlfVxuICAgICAgICAgIHNyYz17YCR7YXNzZXRQcmVmaXh9L19uZXh0LyR7cG9seWZpbGx9JHtkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZ31gfVxuICAgICAgICAvPlxuICAgICAgKSlcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbmxpbmVTY3JpcHRTb3VyY2UoZG9jdW1lbnRQcm9wczogUmVhZG9ubHk8RG9jdW1lbnRQcm9wcz4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgX19ORVhUX0RBVEFfXyB9ID0gZG9jdW1lbnRQcm9wc1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoX19ORVhUX0RBVEFfXylcbiAgICAgIHJldHVybiBodG1sRXNjYXBlSnNvblN0cmluZyhkYXRhKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5tZXNzYWdlLmluZGV4T2YoJ2NpcmN1bGFyIHN0cnVjdHVyZScpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2lyY3VsYXIgc3RydWN0dXJlIGluIFwiZ2V0SW5pdGlhbFByb3BzXCIgcmVzdWx0IG9mIHBhZ2UgXCIke19fTkVYVF9EQVRBX18ucGFnZX1cIi4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvY2lyY3VsYXItc3RydWN0dXJlYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXNzZXRQcmVmaXgsXG4gICAgICBpbkFtcE1vZGUsXG4gICAgICBidWlsZE1hbmlmZXN0LFxuICAgICAgdW5zdGFibGVfcnVudGltZUpTLFxuICAgICAgZG9jQ29tcG9uZW50c1JlbmRlcmVkLFxuICAgICAgZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmcsXG4gICAgfSA9IHRoaXMuY29udGV4dFxuICAgIGNvbnN0IGRpc2FibGVSdW50aW1lSlMgPSB1bnN0YWJsZV9ydW50aW1lSlMgPT09IGZhbHNlXG5cbiAgICBkb2NDb21wb25lbnRzUmVuZGVyZWQuTmV4dFNjcmlwdCA9IHRydWVcblxuICAgIGlmIChpbkFtcE1vZGUpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFtcERldkZpbGVzID0gW1xuICAgICAgICAuLi5idWlsZE1hbmlmZXN0LmRldkZpbGVzLFxuICAgICAgICAuLi5idWlsZE1hbmlmZXN0LnBvbHlmaWxsRmlsZXMsXG4gICAgICAgIC4uLmJ1aWxkTWFuaWZlc3QuYW1wRGV2RmlsZXMsXG4gICAgICBdXG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAge2Rpc2FibGVSdW50aW1lSlMgPyBudWxsIDogKFxuICAgICAgICAgICAgPHNjcmlwdFxuICAgICAgICAgICAgICBpZD1cIl9fTkVYVF9EQVRBX19cIlxuICAgICAgICAgICAgICB0eXBlPVwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgICAgICBjcm9zc09yaWdpbj17XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5jcm9zc09yaWdpbiB8fCBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICBfX2h0bWw6IE5leHRTY3JpcHQuZ2V0SW5saW5lU2NyaXB0U291cmNlKHRoaXMuY29udGV4dCksXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGRhdGEtYW1wZGV2bW9kZVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICAgIHthbXBEZXZGaWxlcy5tYXAoKGZpbGUpID0+IChcbiAgICAgICAgICAgIDxzY3JpcHRcbiAgICAgICAgICAgICAga2V5PXtmaWxlfVxuICAgICAgICAgICAgICBzcmM9e2Ake2Fzc2V0UHJlZml4fS9fbmV4dC8ke2ZpbGV9JHtkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZ31gfVxuICAgICAgICAgICAgICBub25jZT17dGhpcy5wcm9wcy5ub25jZX1cbiAgICAgICAgICAgICAgY3Jvc3NPcmlnaW49e1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuY3Jvc3NPcmlnaW4gfHwgcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRhdGEtYW1wZGV2bW9kZVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC8+XG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmNyb3NzT3JpZ2luKVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1dhcm5pbmc6IGBOZXh0U2NyaXB0YCBhdHRyaWJ1dGUgYGNyb3NzT3JpZ2luYCBpcyBkZXByZWNhdGVkLiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9kb2MtY3Jvc3NvcmlnaW4tZGVwcmVjYXRlZCdcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzOiBEb2N1bWVudEZpbGVzID0gZ2V0RG9jdW1lbnRGaWxlcyhcbiAgICAgIHRoaXMuY29udGV4dC5idWlsZE1hbmlmZXN0LFxuICAgICAgdGhpcy5jb250ZXh0Ll9fTkVYVF9EQVRBX18ucGFnZSxcbiAgICAgIGluQW1wTW9kZVxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICB7IWRpc2FibGVSdW50aW1lSlMgJiYgYnVpbGRNYW5pZmVzdC5kZXZGaWxlc1xuICAgICAgICAgID8gYnVpbGRNYW5pZmVzdC5kZXZGaWxlcy5tYXAoKGZpbGU6IHN0cmluZykgPT4gKFxuICAgICAgICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgICAgICAga2V5PXtmaWxlfVxuICAgICAgICAgICAgICAgIHNyYz17YCR7YXNzZXRQcmVmaXh9L19uZXh0LyR7ZW5jb2RlVVJJKFxuICAgICAgICAgICAgICAgICAgZmlsZVxuICAgICAgICAgICAgICAgICl9JHtkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZ31gfVxuICAgICAgICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luPXtcbiAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuY3Jvc3NPcmlnaW4gfHwgcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgOiBudWxsfVxuICAgICAgICB7ZGlzYWJsZVJ1bnRpbWVKUyA/IG51bGwgOiAoXG4gICAgICAgICAgPHNjcmlwdFxuICAgICAgICAgICAgaWQ9XCJfX05FWFRfREFUQV9fXCJcbiAgICAgICAgICAgIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIG5vbmNlPXt0aGlzLnByb3BzLm5vbmNlfVxuICAgICAgICAgICAgY3Jvc3NPcmlnaW49e1xuICAgICAgICAgICAgICB0aGlzLnByb3BzLmNyb3NzT3JpZ2luIHx8IHByb2Nlc3MuZW52Ll9fTkVYVF9DUk9TU19PUklHSU5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICAgIF9faHRtbDogTmV4dFNjcmlwdC5nZXRJbmxpbmVTY3JpcHRTb3VyY2UodGhpcy5jb250ZXh0KSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgeyFkaXNhYmxlUnVudGltZUpTICYmIHRoaXMuZ2V0UG9seWZpbGxTY3JpcHRzKCl9XG4gICAgICAgIHshZGlzYWJsZVJ1bnRpbWVKUyAmJiB0aGlzLmdldFByZU5leHRTY3JpcHRzKCl9XG4gICAgICAgIHtkaXNhYmxlUnVudGltZUpTID8gbnVsbCA6IHRoaXMuZ2V0RHluYW1pY0NodW5rcyhmaWxlcyl9XG4gICAgICAgIHtkaXNhYmxlUnVudGltZUpTID8gbnVsbCA6IHRoaXMuZ2V0U2NyaXB0cyhmaWxlcyl9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QW1wUGF0aChhbXBQYXRoOiBzdHJpbmcsIGFzUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFtcFBhdGggfHwgYCR7YXNQYXRofSR7YXNQYXRoLmluY2x1ZGVzKCc/JykgPyAnJicgOiAnPyd9YW1wPTFgXG59XG4iLCJcInVzZSBzdHJpY3RcIjtleHBvcnRzLl9fZXNNb2R1bGU9dHJ1ZTtleHBvcnRzLmh0bWxFc2NhcGVKc29uU3RyaW5nPWh0bWxFc2NhcGVKc29uU3RyaW5nOy8vIFRoaXMgdXRpbGl0eSBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vemVydG9zaC9odG1sZXNjYXBlXG4vLyBMaWNlbnNlOiBodHRwczovL2dpdGh1Yi5jb20vemVydG9zaC9odG1sZXNjYXBlL2Jsb2IvMDUyN2NhNzE1NmE1MjRkMjU2MTAxYmIzMTBhOWY5NzBmNjMwNzhhZC9MSUNFTlNFXG5jb25zdCBFU0NBUEVfTE9PS1VQPXsnJic6J1xcXFx1MDAyNicsJz4nOidcXFxcdTAwM2UnLCc8JzonXFxcXHUwMDNjJywnXFx1MjAyOCc6J1xcXFx1MjAyOCcsJ1xcdTIwMjknOidcXFxcdTIwMjknfTtjb25zdCBFU0NBUEVfUkVHRVg9L1smPjxcXHUyMDI4XFx1MjAyOV0vZztmdW5jdGlvbiBodG1sRXNjYXBlSnNvblN0cmluZyhzdHIpe3JldHVybiBzdHIucmVwbGFjZShFU0NBUEVfUkVHRVgsbWF0Y2g9PkVTQ0FQRV9MT09LVVBbbWF0Y2hdKTt9XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odG1sZXNjYXBlLmpzLm1hcCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInByb3AtdHlwZXNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3R5bGVkLWpzeC9zZXJ2ZXJcIik7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.next/server/pages/_error.js b/.next/server/pages/_error.js new file mode 100644 index 0000000..6afabfc --- /dev/null +++ b/.next/server/pages/_error.js @@ -0,0 +1,255 @@ +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = require('../ssr-module-cache.js'); +/******/ +/******/ // 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 +/******/ var threw = true; +/******/ try { +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // 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 = 1); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "../next-server/lib/head": +/*!****************************************************!*\ + !*** external "next/dist/next-server/lib/head.js" ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("next/dist/next-server/lib/head.js"); + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/next/dist/pages/_error.js": +/*!************************************************!*\ + !*** ./node_modules/next/dist/pages/_error.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.default = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react")); + +var _head = _interopRequireDefault(__webpack_require__(/*! ../next-server/lib/head */ "../next-server/lib/head")); + +const statusCodes = { + 400: 'Bad Request', + 404: 'This page could not be found', + 405: 'Method Not Allowed', + 500: 'Internal Server Error' +}; + +function _getInitialProps({ + res, + err +}) { + const statusCode = res && res.statusCode ? res.statusCode : err ? err.statusCode : 404; + return { + statusCode + }; +} +/** +* `Error` component used for handling errors. +*/ + + +class Error extends _react.default.Component { + render() { + const { + statusCode + } = this.props; + const title = this.props.title || statusCodes[statusCode] || 'An unexpected error has occurred'; + return /*#__PURE__*/_react.default.createElement("div", { + style: styles.error + }, /*#__PURE__*/_react.default.createElement(_head.default, null, /*#__PURE__*/_react.default.createElement("title", null, statusCode, ": ", title)), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("style", { + dangerouslySetInnerHTML: { + __html: 'body { margin: 0 }' + } + }), statusCode ? /*#__PURE__*/_react.default.createElement("h1", { + style: styles.h1 + }, statusCode) : null, /*#__PURE__*/_react.default.createElement("div", { + style: styles.desc + }, /*#__PURE__*/_react.default.createElement("h2", { + style: styles.h2 + }, title, ".")))); + } + +} + +exports.default = Error; +Error.displayName = 'ErrorPage'; +Error.getInitialProps = _getInitialProps; +Error.origGetInitialProps = _getInitialProps; +const styles = { + error: { + color: '#000', + background: '#fff', + fontFamily: '-apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif', + height: '100vh', + textAlign: 'center', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center' + }, + desc: { + display: 'inline-block', + textAlign: 'left', + lineHeight: '49px', + height: '49px', + verticalAlign: 'middle' + }, + h1: { + display: 'inline-block', + borderRight: '1px solid rgba(0, 0, 0,.3)', + margin: 0, + marginRight: '20px', + padding: '10px 23px 10px 0', + fontSize: '24px', + fontWeight: 500, + verticalAlign: 'top' + }, + h2: { + fontSize: '14px', + fontWeight: 'normal', + lineHeight: 'inherit', + margin: 0, + padding: 0 + } +}; + +/***/ }), + +/***/ 1: +/*!************************************!*\ + !*** multi next/dist/pages/_error ***! + \************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! next/dist/pages/_error */"./node_modules/next/dist/pages/_error.js"); + + +/***/ }), + +/***/ "react": +/*!************************!*\ + !*** external "react" ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("react"); + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibmV4dC9kaXN0L25leHQtc2VydmVyL2xpYi9oZWFkLmpzXCIiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwid2VicGFjazovLy8uLi8uLi9wYWdlcy9fZXJyb3IudHN4Iiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0XCIiXSwibmFtZXMiOlsic3RhdHVzQ29kZXMiLCJzdGF0dXNDb2RlIiwicmVzIiwiZXJyIiwiUmVhY3QiLCJDb21wb25lbnQiLCJyZW5kZXIiLCJ0aXRsZSIsInN0eWxlcyIsIl9faHRtbCIsIkVycm9yIiwiZGlzcGxheU5hbWUiLCJnZXRJbml0aWFsUHJvcHMiLCJfZ2V0SW5pdGlhbFByb3BzIiwib3JpZ0dldEluaXRpYWxQcm9wcyIsImVycm9yIiwiY29sb3IiLCJiYWNrZ3JvdW5kIiwiZm9udEZhbWlseSIsImhlaWdodCIsInRleHRBbGlnbiIsImRpc3BsYXkiLCJmbGV4RGlyZWN0aW9uIiwiYWxpZ25JdGVtcyIsImp1c3RpZnlDb250ZW50IiwiZGVzYyIsImxpbmVIZWlnaHQiLCJ2ZXJ0aWNhbEFsaWduIiwiaDEiLCJib3JkZXJSaWdodCIsIm1hcmdpbiIsIm1hcmdpblJpZ2h0IiwicGFkZGluZyIsImZvbnRTaXplIiwiZm9udFdlaWdodCIsImgyIl0sIm1hcHBpbmdzIjoiOztRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FB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RSxXQUFPLEVBdENYO0FBaUNNO0FBakMrQyxDQUFyRCxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVEQSxrQyIsImZpbGUiOiJwYWdlcy9fZXJyb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHJlcXVpcmUoJy4uL3Nzci1tb2R1bGUtY2FjaGUuanMnKTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0dmFyIHRocmV3ID0gdHJ1ZTtcbiBcdFx0dHJ5IHtcbiBcdFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbiBcdFx0XHR0aHJldyA9IGZhbHNlO1xuIFx0XHR9IGZpbmFsbHkge1xuIFx0XHRcdGlmKHRocmV3KSBkZWxldGUgaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdH1cblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMSk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJuZXh0L2Rpc3QvbmV4dC1zZXJ2ZXIvbGliL2hlYWQuanNcIik7IiwiZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBcImRlZmF1bHRcIjogb2JqXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdDsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgSGVhZCBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvaGVhZCdcbmltcG9ydCB7IE5leHRQYWdlQ29udGV4dCB9IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi91dGlscydcblxuY29uc3Qgc3RhdHVzQ29kZXM6IHsgW2NvZGU6IG51bWJlcl06IHN0cmluZyB9ID0ge1xuICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gIDQwNDogJ1RoaXMgcGFnZSBjb3VsZCBub3QgYmUgZm91bmQnLFxuICA0MDU6ICdNZXRob2QgTm90IEFsbG93ZWQnLFxuICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxufVxuXG5leHBvcnQgdHlwZSBFcnJvclByb3BzID0ge1xuICBzdGF0dXNDb2RlOiBudW1iZXJcbiAgdGl0bGU/OiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gX2dldEluaXRpYWxQcm9wcyh7XG4gIHJlcyxcbiAgZXJyLFxufTogTmV4dFBhZ2VDb250ZXh0KTogUHJvbWlzZTxFcnJvclByb3BzPiB8IEVycm9yUHJvcHMge1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICByZXMgJiYgcmVzLnN0YXR1c0NvZGUgPyByZXMuc3RhdHVzQ29kZSA6IGVyciA/IGVyci5zdGF0dXNDb2RlISA6IDQwNFxuICByZXR1cm4geyBzdGF0dXNDb2RlIH1cbn1cblxuLyoqXG4gKiBgRXJyb3JgIGNvbXBvbmVudCB1c2VkIGZvciBoYW5kbGluZyBlcnJvcnMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVycm9yPFAgPSB7fT4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8UCAmIEVycm9yUHJvcHM+IHtcbiAgc3RhdGljIGRpc3BsYXlOYW1lID0gJ0Vycm9yUGFnZSdcblxuICBzdGF0aWMgZ2V0SW5pdGlhbFByb3BzID0gX2dldEluaXRpYWxQcm9wc1xuICBzdGF0aWMgb3JpZ0dldEluaXRpYWxQcm9wcyA9IF9nZXRJbml0aWFsUHJvcHNcblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBzdGF0dXNDb2RlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgdGl0bGUgPVxuICAgICAgdGhpcy5wcm9wcy50aXRsZSB8fFxuICAgICAgc3RhdHVzQ29kZXNbc3RhdHVzQ29kZV0gfHxcbiAgICAgICdBbiB1bmV4cGVjdGVkIGVycm9yIGhhcyBvY2N1cnJlZCdcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IHN0eWxlPXtzdHlsZXMuZXJyb3J9PlxuICAgICAgICA8SGVhZD5cbiAgICAgICAgICA8dGl0bGU+XG4gICAgICAgICAgICB7c3RhdHVzQ29kZX06IHt0aXRsZX1cbiAgICAgICAgICA8L3RpdGxlPlxuICAgICAgICA8L0hlYWQ+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHN0eWxlIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogJ2JvZHkgeyBtYXJnaW46IDAgfScgfX0gLz5cbiAgICAgICAgICB7c3RhdHVzQ29kZSA/IDxoMSBzdHlsZT17c3R5bGVzLmgxfT57c3RhdHVzQ29kZX08L2gxPiA6IG51bGx9XG4gICAgICAgICAgPGRpdiBzdHlsZT17c3R5bGVzLmRlc2N9PlxuICAgICAgICAgICAgPGgyIHN0eWxlPXtzdHlsZXMuaDJ9Pnt0aXRsZX0uPC9oMj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuY29uc3Qgc3R5bGVzOiB7IFtrOiBzdHJpbmddOiBSZWFjdC5DU1NQcm9wZXJ0aWVzIH0gPSB7XG4gIGVycm9yOiB7XG4gICAgY29sb3I6ICcjMDAwJyxcbiAgICBiYWNrZ3JvdW5kOiAnI2ZmZicsXG4gICAgZm9udEZhbWlseTpcbiAgICAgICctYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFJvYm90bywgXCJTZWdvZSBVSVwiLCBcIkZpcmEgU2Fuc1wiLCBBdmVuaXIsIFwiSGVsdmV0aWNhIE5ldWVcIiwgXCJMdWNpZGEgR3JhbmRlXCIsIHNhbnMtc2VyaWYnLFxuICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gIH0sXG5cbiAgZGVzYzoge1xuICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgIGxpbmVIZWlnaHQ6ICc0OXB4JyxcbiAgICBoZWlnaHQ6ICc0OXB4JyxcbiAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgfSxcblxuICBoMToge1xuICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgIGJvcmRlclJpZ2h0OiAnMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwuMyknLFxuICAgIG1hcmdpbjogMCxcbiAgICBtYXJnaW5SaWdodDogJzIwcHgnLFxuICAgIHBhZGRpbmc6ICcxMHB4IDIzcHggMTBweCAwJyxcbiAgICBmb250U2l6ZTogJzI0cHgnLFxuICAgIGZvbnRXZWlnaHQ6IDUwMCxcbiAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJyxcbiAgfSxcblxuICBoMjoge1xuICAgIGZvbnRTaXplOiAnMTRweCcsXG4gICAgZm9udFdlaWdodDogJ25vcm1hbCcsXG4gICAgbGluZUhlaWdodDogJ2luaGVyaXQnLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICB9LFxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhY3RcIik7Il0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.next/server/pages/index.js b/.next/server/pages/index.js new file mode 100644 index 0000000..c2e0121 --- /dev/null +++ b/.next/server/pages/index.js @@ -0,0 +1,328 @@ +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = require('../ssr-module-cache.js'); +/******/ +/******/ // 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 +/******/ var threw = true; +/******/ try { +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // 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/pages/index.tsx"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./src/artifacts/contracts/Faucet.sol/Faucet.json": +/*!********************************************************!*\ + !*** ./src/artifacts/contracts/Faucet.sol/Faucet.json ***! + \********************************************************/ +/*! exports provided: _format, contractName, sourceName, abi, bytecode, deployedBytecode, linkReferences, deployedLinkReferences, default */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"_format\":\"hh-sol-artifact-1\",\"contractName\":\"Faucet\",\"sourceName\":\"contracts/Faucet.sol\",\"abi\":[{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"recepient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"bytecode\":\"0x608060405234801561001057600080fd5b5060fe8061001f6000396000f3fe608060405260043610601f5760003560e01c806351cff8d914602a576025565b36602557005b600080fd5b348015603557600080fd5b50607560048036036020811015604a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506077565b005b8073ffffffffffffffffffffffffffffffffffffffff166108fc67016345785d8a00009081150290604051600060405180830381858888f1935050505015801560c4573d6000803e3d6000fd5b505056fea2646970667358221220d13e149a03fc196c6871d0f03538a44db9e463071b6a9ca5535a4551274dd8ea64736f6c63430007060033\",\"deployedBytecode\":\"0x608060405260043610601f5760003560e01c806351cff8d914602a576025565b36602557005b600080fd5b348015603557600080fd5b50607560048036036020811015604a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506077565b005b8073ffffffffffffffffffffffffffffffffffffffff166108fc67016345785d8a00009081150290604051600060405180830381858888f1935050505015801560c4573d6000803e3d6000fd5b505056fea2646970667358221220d13e149a03fc196c6871d0f03538a44db9e463071b6a9ca5535a4551274dd8ea64736f6c63430007060033\",\"linkReferences\":{},\"deployedLinkReferences\":{}}"); + +/***/ }), + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: getStaticProps, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStaticProps", function() { return getStaticProps; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "react/jsx-dev-runtime"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! semantic-ui-react */ "semantic-ui-react"); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_4___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ethers */ "ethers"); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(ethers__WEBPACK_IMPORTED_MODULE_5__); + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx"; + + + + + + +function Home({ + contractAddress +}) { + const { + 0: value, + 1: setValue + } = Object(react__WEBPACK_IMPORTED_MODULE_1__["useState"])(''); + const { + 0: touched, + 1: setTouched + } = Object(react__WEBPACK_IMPORTED_MODULE_1__["useState"])(false); + const { + 0: isValid, + 1: setIsValid + } = Object(react__WEBPACK_IMPORTED_MODULE_1__["useState"])(false); + const { + 0: contractBalance, + 1: setContractBalance + } = Object(react__WEBPACK_IMPORTED_MODULE_1__["useState"])(); + Object(react__WEBPACK_IMPORTED_MODULE_1__["useEffect"])(() => { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_3__["verifyEthAddress"])(value)); + }, [value]); + + const onSubmit = async e => { + e.preventDefault(); + await requestFunds(); + }; + + const getContractBalance = async () => { + if (typeof window.ethereum !== 'undefined') { + const provider = new ethers__WEBPACK_IMPORTED_MODULE_5__["ethers"].providers.Web3Provider(window.ethereum); + const contractBalance = await provider.getBalance(contractAddress); + return contractBalance.toString(); + } + }; + + const requestFunds = async () => { + if (typeof window.ethereum !== 'undefined') { + await window.ethereum.request({ + method: 'eth_requestAccounts' + }); + const provider = new ethers__WEBPACK_IMPORTED_MODULE_5__["ethers"].providers.Web3Provider(window.ethereum); + const signer = provider.getSigner(); + const contract = new ethers__WEBPACK_IMPORTED_MODULE_5__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_4__.abi, signer); + + try { + await contract.withdraw(value); + console.log('Successfully withdrawed funds'); + } catch (err) { + console.log('Error: ', err); + } + } + }; + + Object(react__WEBPACK_IMPORTED_MODULE_1__["useEffect"])(() => { + if (window.ethereum !== undefined) { + getContractBalance().then(bal => setContractBalance(bal)); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__["Container"], { + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 66, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__["Input"], { + type: "text", + value: value, + onChange: e => setValue(e.target.value) + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_2__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 75, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 65, + columnNumber: 7 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("span", { + children: ["Contract balance - ", parseInt(contractBalance || '') / Math.pow(10, 18), ' ', "ether"] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 77, + columnNumber: 7 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 64, + columnNumber: 5 + }, this); +} + +async function getStaticProps() { + return { + props: { + contractAddress: "0xEccA7BF722455A94b9e759247aB86E2e1559c871" + } + }; +} +/* harmony default export */ __webpack_exports__["default"] = (Home); + +/***/ }), + +/***/ "./src/util/index.ts": +/*!***************************!*\ + !*** ./src/util/index.ts ***! + \***************************/ +/*! exports provided: verifyEthAddress */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "verifyEthAddress", function() { return verifyEthAddress; }); +const verifyEthAddress = address => { + const regex = /^0x[a-fA-F0-9]{40}$/; + return regex.test(address); +}; + +/***/ }), + +/***/ "ethers": +/*!*************************!*\ + !*** external "ethers" ***! + \*************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("ethers"); + +/***/ }), + +/***/ "react": +/*!************************!*\ + !*** external "react" ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("react"); + +/***/ }), + +/***/ "react/jsx-dev-runtime": +/*!****************************************!*\ + !*** external "react/jsx-dev-runtime" ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("react/jsx-dev-runtime"); + +/***/ }), + +/***/ "semantic-ui-react": +/*!************************************!*\ + !*** external "semantic-ui-react" ***! + \************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = require("semantic-ui-react"); + +/***/ }) + +/******/ }); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3BhZ2VzL2luZGV4LnRzeCIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbC9pbmRleC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJldGhlcnNcIiIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJyZWFjdFwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInJlYWN0L2pzeC1kZXYtcnVudGltZVwiIiwid2VicGFjazovLy9leHRlcm5hbCBcInNlbWFudGljLXVpLXJlYWN0XCIiXSwibmFtZXMiOlsiSG9tZSIsImNvbnRyYWN0QWRkcmVzcyIsInZhbHVlIiwic2V0VmFsdWUiLCJ1c2VTdGF0ZSIsInRvdWNoZWQiLCJzZXRUb3VjaGVkIiwiaXNWYWxpZCIsInNldElzVmFsaWQiLCJjb250cmFjdEJhbGFuY2UiLCJzZXRDb250cmFjdEJhbGFuY2UiLCJ1c2VFZmZlY3QiLCJ2ZXJpZnlFdGhBZGRyZXNzIiwib25TdWJtaXQiLCJlIiwicHJldmVudERlZmF1bHQiLCJyZXF1ZXN0RnVuZHMiLCJnZXRDb250cmFjdEJhbGFuY2UiLCJ3aW5kb3ciLCJldGhlcmV1bSIsInByb3ZpZGVyIiwiZXRoZXJzIiwicHJvdmlkZXJzIiwiV2ViM1Byb3ZpZGVyIiwiZ2V0QmFsYW5jZSIsInRvU3RyaW5nIiwicmVxdWVzdCIsIm1ldGhvZCIsInNpZ25lciIsImdldFNpZ25lciIsImNvbnRyYWN0IiwiQ29udHJhY3QiLCJGYXVjZXQiLCJhYmkiLCJ3aXRoZHJhdyIsImNvbnNvbGUiLCJsb2ciLCJlcnIiLCJ1bmRlZmluZWQiLCJ0aGVuIiwiYmFsIiwidGFyZ2V0IiwicGFyc2VJbnQiLCJNYXRoIiwicG93IiwiZ2V0U3RhdGljUHJvcHMiLCJwcm9wcyIsInByb2Nlc3MiLCJORVhUX1BVQkxJQ19DT05UUkFDVF9BRERSRVNTIiwiYWRkcmVzcyIsInJlZ2V4IiwidGVzdCJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtR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QUNzQndDLFFBQVEsQ0FBQ2pDLGVBQWUsSUFBSSxFQUFwQixDQUFSLEdBQWtDa0MsSUFBSSxDQUFDQyxHQUFMLENBQVMsRUFBVCxFQUFhLEVBQWIsQ0FEeEQsRUFDMEUsR0FEMUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBYkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBREY7QUFvQkQ7O0FBRU0sZUFBZUMsY0FBZixHQUFnQztBQUNyQyxTQUFPO0FBQ0xDLFNBQUssRUFBRTtBQUNMN0MscUJBQWUsRUFBRThDLDRDQUF3Q0M7QUFEcEQ7QUFERixHQUFQO0FBS0Q7QUFFY2hELG1FQUFmLEU7Ozs7Ozs7Ozs7OztBQzVGQTtBQUFBO0FBQU8sTUFBTVksZ0JBQWdCLEdBQUlxQyxPQUFELElBQThCO0FBQzVELFFBQU1DLEtBQUssR0FBRyxxQkFBZDtBQUNBLFNBQU9BLEtBQUssQ0FBQ0MsSUFBTixDQUFXRixPQUFYLENBQVA7QUFDRCxDQUhNLEM7Ozs7Ozs7Ozs7O0FDQVAsbUM7Ozs7Ozs7Ozs7O0FDQUEsa0M7Ozs7Ozs7Ozs7O0FDQUEsa0Q7Ozs7Ozs7Ozs7O0FDQUEsOEMiLCJmaWxlIjoicGFnZXMvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHJlcXVpcmUoJy4uL3Nzci1tb2R1bGUtY2FjaGUuanMnKTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0dmFyIHRocmV3ID0gdHJ1ZTtcbiBcdFx0dHJ5IHtcbiBcdFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbiBcdFx0XHR0aHJldyA9IGZhbHNlO1xuIFx0XHR9IGZpbmFsbHkge1xuIFx0XHRcdGlmKHRocmV3KSBkZWxldGUgaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdH1cblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9wYWdlcy9pbmRleC50c3hcIik7XG4iLCJpbXBvcnQgeyBGb3JtRXZlbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEJ1dHRvbiwgQ29udGFpbmVyLCBGb3JtLCBJbnB1dCB9IGZyb20gJ3NlbWFudGljLXVpLXJlYWN0JztcclxuaW1wb3J0IHsgdmVyaWZ5RXRoQWRkcmVzcyB9IGZyb20gJy4uL3V0aWwnO1xyXG5pbXBvcnQgRmF1Y2V0IGZyb20gJy4uL2FydGlmYWN0cy9jb250cmFjdHMvRmF1Y2V0LnNvbC9GYXVjZXQuanNvbic7XHJcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xyXG5cclxudHlwZSBQcm9wcyA9IHtcclxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcclxufTtcclxuXHJcbmZ1bmN0aW9uIEhvbWUoeyBjb250cmFjdEFkZHJlc3MgfTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xyXG4gIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xyXG4gIGNvbnN0IFt0b3VjaGVkLCBzZXRUb3VjaGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNWYWxpZCwgc2V0SXNWYWxpZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XHJcbiAgY29uc3QgW2NvbnRyYWN0QmFsYW5jZSwgc2V0Q29udHJhY3RCYWxhbmNlXSA9IHVzZVN0YXRlPHN0cmluZz4oKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBzZXRUb3VjaGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzVmFsaWQodmVyaWZ5RXRoQWRkcmVzcyh2YWx1ZSkpO1xyXG4gIH0sIFt2YWx1ZV0pO1xyXG5cclxuICBjb25zdCBvblN1Ym1pdCA9IGFzeW5jIChlOiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgYXdhaXQgcmVxdWVzdEZ1bmRzKCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0Q29udHJhY3RCYWxhbmNlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZXRoZXJldW0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGV0aGVycy5wcm92aWRlcnMuV2ViM1Byb3ZpZGVyKHdpbmRvdy5ldGhlcmV1bSk7XHJcbiAgICAgIGNvbnN0IGNvbnRyYWN0QmFsYW5jZSA9IGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UoY29udHJhY3RBZGRyZXNzKTtcclxuICAgICAgcmV0dXJuIGNvbnRyYWN0QmFsYW5jZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHJlcXVlc3RGdW5kcyA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmV0aGVyZXVtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBhd2FpdCB3aW5kb3cuZXRoZXJldW0ucmVxdWVzdCh7XHJcbiAgICAgICAgbWV0aG9kOiAnZXRoX3JlcXVlc3RBY2NvdW50cycsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBldGhlcnMucHJvdmlkZXJzLldlYjNQcm92aWRlcih3aW5kb3cuZXRoZXJldW0pO1xyXG4gICAgICBjb25zdCBzaWduZXIgPSBwcm92aWRlci5nZXRTaWduZXIoKTtcclxuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXcgZXRoZXJzLkNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcywgRmF1Y2V0LmFiaSwgc2lnbmVyKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBjb250cmFjdC53aXRoZHJhdyh2YWx1ZSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3NmdWxseSB3aXRoZHJhd2VkIGZ1bmRzJyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvcjogJywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAod2luZG93LmV0aGVyZXVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZ2V0Q29udHJhY3RCYWxhbmNlKCkudGhlbigoYmFsKSA9PiBzZXRDb250cmFjdEJhbGFuY2UoYmFsKSk7XHJcbiAgICB9XHJcbiAgfSwgW10pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPENvbnRhaW5lcj5cclxuICAgICAgPEZvcm0gb25TdWJtaXQ9e29uU3VibWl0fT5cclxuICAgICAgICA8aDE+Um9wc3RlbiBGYXVjZXQ8L2gxPlxyXG4gICAgICAgIDxGb3JtLkZpZWxkIGVycm9yPXt0b3VjaGVkICYmICFpc1ZhbGlkfT5cclxuICAgICAgICAgIDxsYWJlbD5Zb3VyIFJvcHN0ZW4gd2FsbGV0IGFkZHJlc3M8L2xhYmVsPlxyXG4gICAgICAgICAgPElucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFZhbHVlKGUudGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9Gb3JtLkZpZWxkPlxyXG4gICAgICAgIDxCdXR0b24gcHJpbWFyeT5SZXF1ZXN0IEV0aGVyPC9CdXR0b24+XHJcbiAgICAgIDwvRm9ybT5cclxuICAgICAgPHNwYW4+XHJcbiAgICAgICAgQ29udHJhY3QgYmFsYW5jZSAtIHtwYXJzZUludChjb250cmFjdEJhbGFuY2UgfHwgJycpIC8gTWF0aC5wb3coMTAsIDE4KX17JyAnfVxyXG4gICAgICAgIGV0aGVyXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvQ29udGFpbmVyPlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTdGF0aWNQcm9wcygpIHtcclxuICByZXR1cm4ge1xyXG4gICAgcHJvcHM6IHtcclxuICAgICAgY29udHJhY3RBZGRyZXNzOiBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19DT05UUkFDVF9BRERSRVNTLFxyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIb21lO1xyXG4iLCJleHBvcnQgY29uc3QgdmVyaWZ5RXRoQWRkcmVzcyA9IChhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBjb25zdCByZWdleCA9IC9eMHhbYS1mQS1GMC05XXs0MH0kLztcclxuICByZXR1cm4gcmVnZXgudGVzdChhZGRyZXNzKTtcclxufTtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXRoZXJzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0L2pzeC1kZXYtcnVudGltZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzZW1hbnRpYy11aS1yZWFjdFwiKTsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/.next/server/ssr-module-cache.js b/.next/server/ssr-module-cache.js new file mode 100644 index 0000000..6ded665 --- /dev/null +++ b/.next/server/ssr-module-cache.js @@ -0,0 +1,4 @@ + + /* This cache is used by webpack for instantiated modules */ + module.exports = {} + \ No newline at end of file diff --git a/.next/static/chunks/0.js b/.next/static/chunks/0.js new file mode 100644 index 0000000..9b4f092 --- /dev/null +++ b/.next/static/chunks/0.js @@ -0,0 +1,73 @@ +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([[0],{ + +/***/ "./node_modules/next/dist/client/dev/noop.js": +/*!***************************************************!*\ + !*** ./node_modules/next/dist/client/dev/noop.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }) + +}]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJzdGF0aWMvY2h1bmtzLzAuanMiLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/static/chunks/amp.js b/.next/static/chunks/amp.js new file mode 100644 index 0000000..a3c705b --- /dev/null +++ b/.next/static/chunks/amp.js @@ -0,0 +1,2522 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["amp"],{ + +/***/ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/asyncToGenerator.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + + _next(undefined); + }); + }; +} + +module.exports = _asyncToGenerator; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/regenerator/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/regenerator/index.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js"); + + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/amp-dev.js": +/*!******************************************************!*\ + !*** ./node_modules/next/dist/client/dev/amp-dev.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +var _eventSourcePolyfill = _interopRequireDefault(__webpack_require__(/*! ./event-source-polyfill */ "./node_modules/next/dist/client/dev/event-source-polyfill.js")); + +var _eventsource = __webpack_require__(/*! ./error-overlay/eventsource */ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js"); + +var _onDemandEntriesUtils = __webpack_require__(/*! ./on-demand-entries-utils */ "./node_modules/next/dist/client/dev/on-demand-entries-utils.js"); + +var _fouc = __webpack_require__(/*! ./fouc */ "./node_modules/next/dist/client/dev/fouc.js"); +/* globals __webpack_hash__ */ + + +if (!window.EventSource) { + window.EventSource = _eventSourcePolyfill["default"]; +} + +var data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent); +var assetPrefix = data.assetPrefix, + page = data.page; +assetPrefix = assetPrefix || ''; +var mostRecentHash = null; +/* eslint-disable-next-line */ + +var curHash = __webpack_require__.h(); +var hotUpdatePath = assetPrefix + (assetPrefix.endsWith('/') ? '' : '/') + '_next/static/webpack/'; // Is there a newer version of this code available? + +function isUpdateAvailable() { + // __webpack_hash__ is the hash of the current compilation. + // It's a global variable injected by Webpack. + + /* eslint-disable-next-line */ + return mostRecentHash !== __webpack_require__.h(); +} // Webpack disallows updates in other states. + + +function canApplyUpdates() { + return module.hot.status() === 'idle'; +} // This function reads code updates on the fly and hard +// reloads the page when it has changed. + + +function tryApplyUpdates() { + return _tryApplyUpdates.apply(this, arguments); +} + +function _tryApplyUpdates() { + _tryApplyUpdates = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { + var res, jsonData, curPage, pageUpdated; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!(!isUpdateAvailable() || !canApplyUpdates())) { + _context.next = 2; + break; + } + + return _context.abrupt("return"); + + case 2: + _context.prev = 2; + _context.next = 5; + return fetch("".concat(hotUpdatePath).concat(curHash, ".hot-update.json")); + + case 5: + res = _context.sent; + _context.next = 8; + return res.json(); + + case 8: + jsonData = _context.sent; + curPage = page === '/' ? 'index' : page; // webpack 5 uses an array instead + + pageUpdated = (Array.isArray(jsonData.c) ? jsonData.c : Object.keys(jsonData.c)).some(function (mod) { + return mod.indexOf("pages".concat(curPage.substr(0, 1) === '/' ? curPage : "/".concat(curPage))) !== -1 || mod.indexOf("pages".concat(curPage.substr(0, 1) === '/' ? curPage : "/".concat(curPage)).replace(/\//g, '\\')) !== -1; + }); + + if (pageUpdated) { + document.location.reload(true); + } else { + curHash = mostRecentHash; + } + + _context.next = 18; + break; + + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](2); + console.error('Error occurred checking for update', _context.t0); + document.location.reload(true); + + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[2, 14]]); + })); + return _tryApplyUpdates.apply(this, arguments); +} + +(0, _eventsource.getEventSourceWrapper)({ + path: "".concat(assetPrefix, "/_next/webpack-hmr") +}).addMessageListener(function (event) { + if (event.data === "\uD83D\uDC93") { + return; + } + + try { + var message = JSON.parse(event.data); + + if (message.action === 'sync' || message.action === 'built') { + if (!message.hash) { + return; + } + + mostRecentHash = message.hash; + tryApplyUpdates(); + } else if (message.action === 'reloadPage') { + document.location.reload(true); + } + } catch (ex) { + console.warn('Invalid HMR message: ' + event.data + '\n' + ex); + } +}); +(0, _onDemandEntriesUtils.setupPing)(assetPrefix, function () { + return page; +}); +(0, _fouc.displayContent)(); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js": +/*!************************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/error-overlay/eventsource.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.getEventSourceWrapper = getEventSourceWrapper; +var eventCallbacks = []; + +function EventSourceWrapper(options) { + var source; + var lastActivity = new Date(); + var listeners = []; + + if (!options.timeout) { + options.timeout = 20 * 1000; + } + + init(); + var timer = setInterval(function () { + if (new Date() - lastActivity > options.timeout) { + handleDisconnect(); + } + }, options.timeout / 2); + + function init() { + source = new window.EventSource(options.path); + source.onopen = handleOnline; + source.onerror = handleDisconnect; + source.onmessage = handleMessage; + } + + function handleOnline() { + if (options.log) console.log('[HMR] connected'); + lastActivity = new Date(); + } + + function handleMessage(event) { + lastActivity = new Date(); + + for (var i = 0; i < listeners.length; i++) { + listeners[i](event); + } + + eventCallbacks.forEach(function (cb) { + if (!cb.unfiltered && event.data.indexOf('action') === -1) return; + cb(event); + }); + } + + function handleDisconnect() { + clearInterval(timer); + source.close(); + setTimeout(init, options.timeout); + } + + return { + close: function close() { + clearInterval(timer); + source.close(); + }, + addMessageListener: function addMessageListener(fn) { + listeners.push(fn); + } + }; +} + +_c = EventSourceWrapper; + +function getEventSourceWrapper(options) { + if (!options.ondemand) { + return { + addMessageListener: function addMessageListener(cb) { + eventCallbacks.push(cb); + } + }; + } + + return EventSourceWrapper(options); +} + +var _c; + +$RefreshReg$(_c, "EventSourceWrapper"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/event-source-polyfill.js": +/*!********************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/event-source-polyfill.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = void 0; +/* eslint-disable */ +// Improved version of https://github.com/Yaffle/EventSource/ +// Available under MIT License (MIT) +// Only tries to support IE11 and nothing below + +var document = window.document; +var Response = window.Response; +var TextDecoder = window.TextDecoder; +var TextEncoder = window.TextEncoder; +var AbortController = window.AbortController; + +if (AbortController == undefined) { + AbortController = function AbortController() { + this.signal = null; + + this.abort = function () {}; + }; +} + +function TextDecoderPolyfill() { + this.bitsNeeded = 0; + this.codePoint = 0; +} + +_c = TextDecoderPolyfill; + +TextDecoderPolyfill.prototype.decode = function (octets) { + function valid(codePoint, shift, octetsCount) { + if (octetsCount === 1) { + return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07ff; + } + + if (octetsCount === 2) { + return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xd7ff || codePoint >= 0xe000 >> shift && codePoint << shift <= 0xffff; + } + + if (octetsCount === 3) { + return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10ffff; + } + + throw new Error(); + } + + function octetsCount(bitsNeeded, codePoint) { + if (bitsNeeded === 6 * 1) { + return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1; + } + + if (bitsNeeded === 6 * 2) { + return codePoint > 15 ? 3 : 2; + } + + if (bitsNeeded === 6 * 3) { + return 3; + } + + throw new Error(); + } + + var REPLACER = 0xfffd; + var string = ''; + var bitsNeeded = this.bitsNeeded; + var codePoint = this.codePoint; + + for (var i = 0; i < octets.length; i += 1) { + var octet = octets[i]; + + if (bitsNeeded !== 0) { + if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) { + bitsNeeded = 0; + codePoint = REPLACER; + string += String.fromCharCode(codePoint); + } + } + + if (bitsNeeded === 0) { + if (octet >= 0 && octet <= 127) { + bitsNeeded = 0; + codePoint = octet; + } else if (octet >= 192 && octet <= 223) { + bitsNeeded = 6 * 1; + codePoint = octet & 31; + } else if (octet >= 224 && octet <= 239) { + bitsNeeded = 6 * 2; + codePoint = octet & 15; + } else if (octet >= 240 && octet <= 247) { + bitsNeeded = 6 * 3; + codePoint = octet & 7; + } else { + bitsNeeded = 0; + codePoint = REPLACER; + } + + if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) { + bitsNeeded = 0; + codePoint = REPLACER; + } + } else { + bitsNeeded -= 6; + codePoint = codePoint << 6 | octet & 63; + } + + if (bitsNeeded === 0) { + if (codePoint <= 0xffff) { + string += String.fromCharCode(codePoint); + } else { + string += String.fromCharCode(0xd800 + (codePoint - 0xffff - 1 >> 10)); + string += String.fromCharCode(0xdc00 + (codePoint - 0xffff - 1 & 0x3ff)); + } + } + } + + this.bitsNeeded = bitsNeeded; + this.codePoint = codePoint; + return string; +}; // Firefox < 38 throws an error with stream option + + +var supportsStreamOption = function supportsStreamOption() { + try { + return new TextDecoder().decode(new TextEncoder().encode('test'), { + stream: true + }) === 'test'; + } catch (error) { + console.log(error); + } + + return false; +}; // IE, Edge + + +if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) { + TextDecoder = TextDecoderPolyfill; +} + +var k = function k() {}; + +function XHRWrapper(xhr) { + this.withCredentials = false; + this.responseType = ''; + this.readyState = 0; + this.status = 0; + this.statusText = ''; + this.responseText = ''; + this.onprogress = k; + this.onreadystatechange = k; + this._contentType = ''; + this._xhr = xhr; + this._sendTimeout = 0; + this._abort = k; +} + +_c2 = XHRWrapper; + +XHRWrapper.prototype.open = function (method, url) { + this._abort(true); + + var that = this; + var xhr = this._xhr; + var state = 1; + var timeout = 0; + + this._abort = function (silent) { + if (that._sendTimeout !== 0) { + clearTimeout(that._sendTimeout); + that._sendTimeout = 0; + } + + if (state === 1 || state === 2 || state === 3) { + state = 4; + xhr.onload = k; + xhr.onerror = k; + xhr.onabort = k; + xhr.onprogress = k; + xhr.onreadystatechange = k; // IE 8 - 9: XDomainRequest#abort() does not fire any event + // Opera < 10: XMLHttpRequest#abort() does not fire any event + + xhr.abort(); + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + if (!silent) { + that.readyState = 4; + that.onreadystatechange(); + } + } + + state = 0; + }; + + var onStart = function onStart() { + if (state === 1) { + // state = 2; + var status = 0; + var statusText = ''; + var contentType = undefined; + + if (!('contentType' in xhr)) { + try { + status = xhr.status; + statusText = xhr.statusText; + contentType = xhr.getResponseHeader('Content-Type'); + } catch (error) { + // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3 + // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2 + // https://bugs.webkit.org/show_bug.cgi?id=29121 + status = 0; + statusText = ''; + contentType = undefined; // Firefox < 14, Chrome ?, Safari ? + // https://bugs.webkit.org/show_bug.cgi?id=29658 + // https://bugs.webkit.org/show_bug.cgi?id=77854 + } + } else { + status = 200; + statusText = 'OK'; + contentType = xhr.contentType; + } + + if (status !== 0) { + state = 2; + that.readyState = 2; + that.status = status; + that.statusText = statusText; + that._contentType = contentType; + that.onreadystatechange(); + } + } + }; + + var onProgress = function onProgress() { + onStart(); + + if (state === 2 || state === 3) { + state = 3; + var responseText = ''; + + try { + responseText = xhr.responseText; + } catch (error) {// IE 8 - 9 with XMLHttpRequest + } + + that.readyState = 3; + that.responseText = responseText; + that.onprogress(); + } + }; + + var onFinish = function onFinish() { + // Firefox 52 fires "readystatechange" (xhr.readyState === 4) without final "readystatechange" (xhr.readyState === 3) + // IE 8 fires "onload" without "onprogress" + onProgress(); + + if (state === 1 || state === 2 || state === 3) { + state = 4; + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + that.readyState = 4; + that.onreadystatechange(); + } + }; + + var onReadyStateChange = function onReadyStateChange() { + if (xhr != undefined) { + // Opera 12 + if (xhr.readyState === 4) { + onFinish(); + } else if (xhr.readyState === 3) { + onProgress(); + } else if (xhr.readyState === 2) { + onStart(); + } + } + }; + + var onTimeout = function onTimeout() { + timeout = setTimeout(function () { + onTimeout(); + }, 500); + + if (xhr.readyState === 3) { + onProgress(); + } + }; // XDomainRequest#abort removes onprogress, onerror, onload + + + xhr.onload = onFinish; + xhr.onerror = onFinish; // improper fix to match Firefox behavior, but it is better than just ignore abort + // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596 + // https://bugzilla.mozilla.org/show_bug.cgi?id=880200 + // https://code.google.com/p/chromium/issues/detail?id=153570 + // IE 8 fires "onload" without "onprogress + + xhr.onabort = onFinish; // https://bugzilla.mozilla.org/show_bug.cgi?id=736723 + + if (!('sendAsBinary' in XMLHttpRequest.prototype) && !('mozAnon' in XMLHttpRequest.prototype)) { + xhr.onprogress = onProgress; + } // IE 8 - 9 (XMLHTTPRequest) + // Opera < 12 + // Firefox < 3.5 + // Firefox 3.5 - 3.6 - ? < 9.0 + // onprogress is not fired sometimes or delayed + // see also #64 + + + xhr.onreadystatechange = onReadyStateChange; + + if ('contentType' in xhr) { + url += (url.indexOf('?') === -1 ? '?' : '&') + 'padding=true'; + } + + xhr.open(method, url, true); + + if ('readyState' in xhr) { + // workaround for Opera 12 issue with "progress" events + // #91 + timeout = setTimeout(function () { + onTimeout(); + }, 0); + } +}; + +XHRWrapper.prototype.abort = function () { + this._abort(false); +}; + +XHRWrapper.prototype.getResponseHeader = function (name) { + return this._contentType; +}; + +XHRWrapper.prototype.setRequestHeader = function (name, value) { + var xhr = this._xhr; + + if ('setRequestHeader' in xhr) { + xhr.setRequestHeader(name, value); + } +}; + +XHRWrapper.prototype.getAllResponseHeaders = function () { + return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() : ''; +}; + +XHRWrapper.prototype.send = function () { + // loading indicator in Safari < ? (6), Chrome < 14, Firefox + if (!('ontimeout' in XMLHttpRequest.prototype) && document != undefined && document.readyState != undefined && document.readyState !== 'complete') { + var that = this; + that._sendTimeout = setTimeout(function () { + that._sendTimeout = 0; + that.send(); + }, 4); + return; + } + + var xhr = this._xhr; // withCredentials should be set after "open" for Safari and Chrome (< 19 ?) + + xhr.withCredentials = this.withCredentials; + xhr.responseType = this.responseType; + + try { + // xhr.send(); throws "Not enough arguments" in Firefox 3.0 + xhr.send(undefined); + } catch (error1) { + // Safari 5.1.7, Opera 12 + throw error1; + } +}; + +function toLowerCase(name) { + return name.replace(/[A-Z]/g, function (c) { + return String.fromCharCode(c.charCodeAt(0) + 0x20); + }); +} + +function HeadersPolyfill(all) { + // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example + var map = Object.create(null); + var array = all.split('\r\n'); + + for (var i = 0; i < array.length; i += 1) { + var line = array[i]; + var parts = line.split(': '); + var name = parts.shift(); + var value = parts.join(': '); + map[toLowerCase(name)] = value; + } + + this._map = map; +} + +_c3 = HeadersPolyfill; + +HeadersPolyfill.prototype.get = function (name) { + return this._map[toLowerCase(name)]; +}; + +function XHRTransport() {} + +_c4 = XHRTransport; + +XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) { + xhr.open('GET', url); + var offset = 0; + + xhr.onprogress = function () { + var responseText = xhr.responseText; + var chunk = responseText.slice(offset); + offset += chunk.length; + onProgressCallback(chunk); + }; + + xhr.onreadystatechange = function () { + if (xhr.readyState === 2) { + var status = xhr.status; + var statusText = xhr.statusText; + var contentType = xhr.getResponseHeader('Content-Type'); + var headers = xhr.getAllResponseHeaders(); + onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers), function () { + xhr.abort(); + }); + } else if (xhr.readyState === 4) { + onFinishCallback(); + } + }; + + xhr.withCredentials = withCredentials; + xhr.responseType = 'text'; + + for (var name in headers) { + if (Object.prototype.hasOwnProperty.call(headers, name)) { + xhr.setRequestHeader(name, headers[name]); + } + } + + xhr.send(); +}; + +function HeadersWrapper(headers) { + this._headers = headers; +} + +_c5 = HeadersWrapper; + +HeadersWrapper.prototype.get = function (name) { + return this._headers.get(name); +}; + +function FetchTransport() {} + +_c6 = FetchTransport; + +FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) { + var controller = new AbortController(); + var signal = controller.signal; // see #120 + + var textDecoder = new TextDecoder(); + fetch(url, { + headers: headers, + credentials: withCredentials ? 'include' : 'same-origin', + signal: signal, + cache: 'no-store' + }).then(function (response) { + var reader = response.body.getReader(); + onStartCallback(response.status, response.statusText, response.headers.get('Content-Type'), new HeadersWrapper(response.headers), function () { + controller.abort(); + reader.cancel(); + }); + return new Promise(function (resolve, reject) { + var readNextChunk = function readNextChunk() { + reader.read().then(function (result) { + if (result.done) { + // Note: bytes in textDecoder are ignored + resolve(undefined); + } else { + var chunk = textDecoder.decode(result.value, { + stream: true + }); + onProgressCallback(chunk); + readNextChunk(); + } + })['catch'](function (error) { + reject(error); + }); + }; + + readNextChunk(); + }); + }).then(function (result) { + onFinishCallback(); + return result; + }, function (error) { + onFinishCallback(); + return Promise.reject(error); + }); +}; + +function EventTarget() { + this._listeners = Object.create(null); +} + +_c7 = EventTarget; + +function throwError(e) { + setTimeout(function () { + throw e; + }, 0); +} + +EventTarget.prototype.dispatchEvent = function (event) { + event.target = this; + var typeListeners = this._listeners[event.type]; + + if (typeListeners != undefined) { + var length = typeListeners.length; + + for (var i = 0; i < length; i += 1) { + var listener = typeListeners[i]; + + try { + if (typeof listener.handleEvent === 'function') { + listener.handleEvent(event); + } else { + listener.call(this, event); + } + } catch (e) { + throwError(e); + } + } + } +}; + +EventTarget.prototype.addEventListener = function (type, listener) { + type = String(type); + var listeners = this._listeners; + var typeListeners = listeners[type]; + + if (typeListeners == undefined) { + typeListeners = []; + listeners[type] = typeListeners; + } + + var found = false; + + for (var i = 0; i < typeListeners.length; i += 1) { + if (typeListeners[i] === listener) { + found = true; + } + } + + if (!found) { + typeListeners.push(listener); + } +}; + +EventTarget.prototype.removeEventListener = function (type, listener) { + type = String(type); + var listeners = this._listeners; + var typeListeners = listeners[type]; + + if (typeListeners != undefined) { + var filtered = []; + + for (var i = 0; i < typeListeners.length; i += 1) { + if (typeListeners[i] !== listener) { + filtered.push(typeListeners[i]); + } + } + + if (filtered.length === 0) { + delete listeners[type]; + } else { + listeners[type] = filtered; + } + } +}; + +function Event(type) { + this.type = type; + this.target = undefined; +} + +_c8 = Event; + +function MessageEvent(type, options) { + Event.call(this, type); + this.data = options.data; + this.lastEventId = options.lastEventId; +} + +_c9 = MessageEvent; +MessageEvent.prototype = Object.create(Event.prototype); + +function ConnectionEvent(type, options) { + Event.call(this, type); + this.status = options.status; + this.statusText = options.statusText; + this.headers = options.headers; +} + +_c10 = ConnectionEvent; +ConnectionEvent.prototype = Object.create(Event.prototype); +var WAITING = -1; +var CONNECTING = 0; +var OPEN = 1; +var CLOSED = 2; +var AFTER_CR = -1; +var FIELD_START = 0; +var FIELD = 1; +var VALUE_START = 2; +var VALUE = 3; +var contentTypeRegExp = /^text\/event\-stream;?(\s*charset\=utf\-8)?$/i; +var MINIMUM_DURATION = 1000; +var MAXIMUM_DURATION = 18000000; + +var parseDuration = function parseDuration(value, def) { + var n = parseInt(value, 10); + + if (n !== n) { + n = def; + } + + return clampDuration(n); +}; + +var clampDuration = function clampDuration(n) { + return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION); +}; + +var fire = function fire(that, f, event) { + try { + if (typeof f === 'function') { + f.call(that, event); + } + } catch (e) { + throwError(e); + } +}; + +function EventSourcePolyfill(url, options) { + EventTarget.call(this); + this.onopen = undefined; + this.onmessage = undefined; + this.onerror = undefined; + this.url = undefined; + this.readyState = undefined; + this.withCredentials = undefined; + this._close = undefined; + start(this, url, options); +} + +_c11 = EventSourcePolyfill; +var isFetchSupported = fetch != undefined && Response != undefined && 'body' in Response.prototype; + +function start(es, url, options) { + url = String(url); + var withCredentials = options != undefined && Boolean(options.withCredentials); + var initialRetry = clampDuration(1000); + var heartbeatTimeout = options != undefined && options.heartbeatTimeout != undefined ? parseDuration(options.heartbeatTimeout, 45000) : clampDuration(45000); + var lastEventId = ''; + var retry = initialRetry; + var wasActivity = false; + var headers = options != undefined && options.headers != undefined ? JSON.parse(JSON.stringify(options.headers)) : undefined; + var CurrentTransport = options != undefined && options.Transport != undefined ? options.Transport : XMLHttpRequest; + var xhr = isFetchSupported && !(options != undefined && options.Transport != undefined) ? undefined : new XHRWrapper(new CurrentTransport()); + var transport = xhr == undefined ? new FetchTransport() : new XHRTransport(); + var cancelFunction = undefined; + var timeout = 0; + var currentState = WAITING; + var dataBuffer = ''; + var lastEventIdBuffer = ''; + var eventTypeBuffer = ''; + var textBuffer = ''; + var state = FIELD_START; + var fieldStart = 0; + var valueStart = 0; + + var onStart = function onStart(status, statusText, contentType, headers, cancel) { + if (currentState === CONNECTING) { + cancelFunction = cancel; + + if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) { + currentState = OPEN; + wasActivity = true; + retry = initialRetry; + es.readyState = OPEN; + var event = new ConnectionEvent('open', { + status: status, + statusText: statusText, + headers: headers + }); + es.dispatchEvent(event); + fire(es, es.onopen, event); + } else { + var message = ''; + + if (status !== 200) { + if (statusText) { + statusText = statusText.replace(/\s+/g, ' '); + } + + message = "EventSource's response has a status " + status + ' ' + statusText + ' that is not 200. Aborting the connection.'; + } else { + message = "EventSource's response has a Content-Type specifying an unsupported type: " + (contentType == undefined ? '-' : contentType.replace(/\s+/g, ' ')) + '. Aborting the connection.'; + } + + throwError(new Error(message)); + close(); + var event = new ConnectionEvent('error', { + status: status, + statusText: statusText, + headers: headers + }); + es.dispatchEvent(event); + fire(es, es.onerror, event); + } + } + }; + + var onProgress = function onProgress(textChunk) { + if (currentState === OPEN) { + var n = -1; + + for (var i = 0; i < textChunk.length; i += 1) { + var c = textChunk.charCodeAt(i); + + if (c === '\n'.charCodeAt(0) || c === '\r'.charCodeAt(0)) { + n = i; + } + } + + var chunk = (n !== -1 ? textBuffer : '') + textChunk.slice(0, n + 1); + textBuffer = (n === -1 ? textBuffer : '') + textChunk.slice(n + 1); + + if (chunk !== '') { + wasActivity = true; + } + + for (var position = 0; position < chunk.length; position += 1) { + var c = chunk.charCodeAt(position); + + if (state === AFTER_CR && c === '\n'.charCodeAt(0)) { + state = FIELD_START; + } else { + if (state === AFTER_CR) { + state = FIELD_START; + } + + if (c === '\r'.charCodeAt(0) || c === '\n'.charCodeAt(0)) { + if (state !== FIELD_START) { + if (state === FIELD) { + valueStart = position + 1; + } + + var field = chunk.slice(fieldStart, valueStart - 1); + var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === ' '.charCodeAt(0) ? 1 : 0), position); + + if (field === 'data') { + dataBuffer += '\n'; + dataBuffer += value; + } else if (field === 'id') { + lastEventIdBuffer = value; + } else if (field === 'event') { + eventTypeBuffer = value; + } else if (field === 'retry') { + initialRetry = parseDuration(value, initialRetry); + retry = initialRetry; + } else if (field === 'heartbeatTimeout') { + heartbeatTimeout = parseDuration(value, heartbeatTimeout); + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = setTimeout(function () { + onTimeout(); + }, heartbeatTimeout); + } + } + } + + if (state === FIELD_START) { + if (dataBuffer !== '') { + lastEventId = lastEventIdBuffer; + + if (eventTypeBuffer === '') { + eventTypeBuffer = 'message'; + } + + var event = new MessageEvent(eventTypeBuffer, { + data: dataBuffer.slice(1), + lastEventId: lastEventIdBuffer + }); + es.dispatchEvent(event); + + if (eventTypeBuffer === 'message') { + fire(es, es.onmessage, event); + } + + if (currentState === CLOSED) { + return; + } + } + + dataBuffer = ''; + eventTypeBuffer = ''; + } + + state = c === '\r'.charCodeAt(0) ? AFTER_CR : FIELD_START; + } else { + if (state === FIELD_START) { + fieldStart = position; + state = FIELD; + } + + if (state === FIELD) { + if (c === ':'.charCodeAt(0)) { + valueStart = position + 1; + state = VALUE_START; + } + } else if (state === VALUE_START) { + state = VALUE; + } + } + } + } + } + }; + + var onFinish = function onFinish() { + if (currentState === OPEN || currentState === CONNECTING) { + currentState = WAITING; + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + timeout = setTimeout(function () { + onTimeout(); + }, retry); + retry = clampDuration(Math.min(initialRetry * 16, retry * 2)); + es.readyState = CONNECTING; + var event = new Event('error'); + es.dispatchEvent(event); + fire(es, es.onerror, event); + } + }; + + var close = function close() { + currentState = CLOSED; + + if (cancelFunction != undefined) { + cancelFunction(); + cancelFunction = undefined; + } + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + es.readyState = CLOSED; + }; + + var onTimeout = function onTimeout() { + timeout = 0; + + if (currentState !== WAITING) { + if (!wasActivity && cancelFunction != undefined) { + throwError(new Error('No activity within ' + heartbeatTimeout + ' milliseconds. Reconnecting.')); + cancelFunction(); + cancelFunction = undefined; + } else { + wasActivity = false; + timeout = setTimeout(function () { + onTimeout(); + }, heartbeatTimeout); + } + + return; + } + + wasActivity = false; + timeout = setTimeout(function () { + onTimeout(); + }, heartbeatTimeout); + currentState = CONNECTING; + dataBuffer = ''; + eventTypeBuffer = ''; + lastEventIdBuffer = lastEventId; + textBuffer = ''; + fieldStart = 0; + valueStart = 0; + state = FIELD_START; // https://bugzilla.mozilla.org/show_bug.cgi?id=428916 + // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers. + + var requestURL = url; + + if (url.slice(0, 5) !== 'data:' && url.slice(0, 5) !== 'blob:') { + if (lastEventId !== '') { + requestURL += (url.indexOf('?') === -1 ? '?' : '&') + 'lastEventId=' + encodeURIComponent(lastEventId); + } + } + + var requestHeaders = {}; + requestHeaders['Accept'] = 'text/event-stream'; + + if (headers != undefined) { + for (var name in headers) { + if (Object.prototype.hasOwnProperty.call(headers, name)) { + requestHeaders[name] = headers[name]; + } + } + } + + try { + transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders); + } catch (error) { + close(); + throw error; + } + }; + + es.url = url; + es.readyState = CONNECTING; + es.withCredentials = withCredentials; + es._close = close; + onTimeout(); +} + +EventSourcePolyfill.prototype = Object.create(EventTarget.prototype); +EventSourcePolyfill.prototype.CONNECTING = CONNECTING; +EventSourcePolyfill.prototype.OPEN = OPEN; +EventSourcePolyfill.prototype.CLOSED = CLOSED; + +EventSourcePolyfill.prototype.close = function () { + this._close(); +}; + +EventSourcePolyfill.CONNECTING = CONNECTING; +EventSourcePolyfill.OPEN = OPEN; +EventSourcePolyfill.CLOSED = CLOSED; +EventSourcePolyfill.prototype.withCredentials = undefined; +var _default = EventSourcePolyfill; +exports["default"] = _default; + +var _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11; + +$RefreshReg$(_c, "TextDecoderPolyfill"); +$RefreshReg$(_c2, "XHRWrapper"); +$RefreshReg$(_c3, "HeadersPolyfill"); +$RefreshReg$(_c4, "XHRTransport"); +$RefreshReg$(_c5, "HeadersWrapper"); +$RefreshReg$(_c6, "FetchTransport"); +$RefreshReg$(_c7, "EventTarget"); +$RefreshReg$(_c8, "Event"); +$RefreshReg$(_c9, "MessageEvent"); +$RefreshReg$(_c10, "ConnectionEvent"); +$RefreshReg$(_c11, "EventSourcePolyfill"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/fouc.js": +/*!***************************************************!*\ + !*** ./node_modules/next/dist/client/dev/fouc.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.displayContent = displayContent; // This function is used to remove Next.js' no-FOUC styles workaround for using +// `style-loader` in development. It must be called before hydration, or else +// rendering won't have the correct computed values in effects. + +function displayContent(callback) { + ; + (window.requestAnimationFrame || setTimeout)(function () { + for (var x = document.querySelectorAll('[data-next-hide-fouc]'), i = x.length; i--;) { + x[i].parentNode.removeChild(x[i]); + } + + if (callback) { + callback(); + } + }); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/on-demand-entries-utils.js": +/*!**********************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/on-demand-entries-utils.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.closePing = closePing; +exports.setupPing = setupPing; +exports.currentPage = void 0; + +var _eventsource = __webpack_require__(/*! ./error-overlay/eventsource */ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js"); +/* global location */ + + +var evtSource; +var currentPage; +exports.currentPage = currentPage; + +function closePing() { + if (evtSource) evtSource.close(); + evtSource = null; +} + +function setupPing(assetPrefix, pathnameFn, retry) { + var pathname = pathnameFn(); // Make sure to only create new EventSource request if page has changed + + if (pathname === currentPage && !retry) return; + exports.currentPage = currentPage = pathname; // close current EventSource connection + + closePing(); + var url = "".concat(assetPrefix, "/_next/webpack-hmr?page=").concat(currentPage); + evtSource = (0, _eventsource.getEventSourceWrapper)({ + path: url, + timeout: 5000, + ondemand: 1 + }); + evtSource.addMessageListener(function (event) { + if (event.data.indexOf('{') === -1) return; + + try { + var payload = JSON.parse(event.data); + + if (payload.invalid) { + // Payload can be invalid even if the page does not exist. + // So, we need to make sure it exists before reloading. + fetch(location.href, { + credentials: 'same-origin' + }).then(function (pageRes) { + if (pageRes.status === 200) { + location.reload(); + } + }); + } + } catch (err) { + console.error('on-demand-entries failed to parse response', err); + } + }); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/module.js": +/*!***********************************!*\ + !*** (webpack)/webpack/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 880: +/***/ (function(module) { + +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(880); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/regenerator-runtime/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/regenerator-runtime/runtime.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var runtime = (function (exports) { + "use strict"; + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + function define(obj, key, value) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + return obj[key]; + } + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects. + define({}, ""); + } catch (err) { + define = function(obj, key, value) { + return obj[key] = value; + }; + } + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + exports.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = define( + GeneratorFunctionPrototype, + toStringTagSymbol, + "GeneratorFunction" + ); + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + define(prototype, method, function(arg) { + return this._invoke(method, arg); + }); + }); + } + + exports.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + exports.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + define(genFun, toStringTagSymbol, "GeneratorFunction"); + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + exports.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return PromiseImpl.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return PromiseImpl.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function(error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + exports.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { + if (PromiseImpl === void 0) PromiseImpl = Promise; + + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList), + PromiseImpl + ); + + return exports.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + define(Gp, toStringTagSymbol, "Generator"); + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + exports.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + exports.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; + + // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + return exports; + +}( + // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + true ? module.exports : undefined +)); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + Function("r", "regeneratorRuntime = r")(runtime); +} + + +/***/ }) + +},[["./node_modules/next/dist/client/dev/amp-dev.js","webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvZGV2L2FtcC1kZXYuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi9jbGllbnQvZGV2L2Vycm9yLW92ZXJsYXkvZXZlbnRzb3VyY2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvZGV2L2V2ZW50LXNvdXJjZS1wb2x5ZmlsbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvZm91Yy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvb24tZGVtYW5kLWVudHJpZXMtdXRpbHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8od2VicGFjaykvd2VicGFjay9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiXSwibmFtZXMiOlsid2luZG93IiwiRXZlbnRTb3VyY2VQb2x5ZmlsbCIsImRhdGEiLCJKU09OIiwiZG9jdW1lbnQiLCJhc3NldFByZWZpeCIsIm1vc3RSZWNlbnRIYXNoIiwiY3VySGFzaCIsImhvdFVwZGF0ZVBhdGgiLCJtb2R1bGUiLCJpc1VwZGF0ZUF2YWlsYWJsZSIsImNhbkFwcGx5VXBkYXRlcyIsImZldGNoIiwicmVzIiwianNvbkRhdGEiLCJjdXJQYWdlIiwicGFnZSIsInBhZ2VVcGRhdGVkIiwiQXJyYXkiLCJPYmplY3QiLCJtb2QiLCJjb25zb2xlIiwicGF0aCIsImV2ZW50IiwibWVzc2FnZSIsInRyeUFwcGx5VXBkYXRlcyIsImV2ZW50Q2FsbGJhY2tzIiwibGFzdEFjdGl2aXR5IiwibGlzdGVuZXJzIiwib3B0aW9ucyIsImluaXQiLCJ0aW1lciIsInNldEludGVydmFsIiwiaGFuZGxlRGlzY29ubmVjdCIsInNvdXJjZSIsImkiLCJjYiIsImNsZWFySW50ZXJ2YWwiLCJzZXRUaW1lb3V0IiwiY2xvc2UiLCJhZGRNZXNzYWdlTGlzdGVuZXIiLCJFdmVudFNvdXJjZVdyYXBwZXIiLCJSZXNwb25zZSIsIlRleHREZWNvZGVyIiwiVGV4dEVuY29kZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJUZXh0RGVjb2RlclBvbHlmaWxsIiwib2N0ZXRzQ291bnQiLCJjb2RlUG9pbnQiLCJiaXRzTmVlZGVkIiwiUkVQTEFDRVIiLCJzdHJpbmciLCJvY3RldHMiLCJvY3RldCIsInZhbGlkIiwiU3RyaW5nIiwic3VwcG9ydHNTdHJlYW1PcHRpb24iLCJzdHJlYW0iLCJrIiwidGhhdCIsInhociIsInN0YXRlIiwidGltZW91dCIsImNsZWFyVGltZW91dCIsIm9uU3RhcnQiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwiY29udGVudFR5cGUiLCJvblByb2dyZXNzIiwicmVzcG9uc2VUZXh0Iiwib25GaW5pc2giLCJvblJlYWR5U3RhdGVDaGFuZ2UiLCJvblRpbWVvdXQiLCJYTUxIdHRwUmVxdWVzdCIsInVybCIsIlhIUldyYXBwZXIiLCJuYW1lIiwiYyIsIm1hcCIsImFycmF5IiwiYWxsIiwibGluZSIsInBhcnRzIiwidmFsdWUiLCJ0b0xvd2VyQ2FzZSIsIkhlYWRlcnNQb2x5ZmlsbCIsIlhIUlRyYW5zcG9ydCIsIm9mZnNldCIsImNodW5rIiwib25Qcm9ncmVzc0NhbGxiYWNrIiwiaGVhZGVycyIsIm9uU3RhcnRDYWxsYmFjayIsIm9uRmluaXNoQ2FsbGJhY2siLCJIZWFkZXJzV3JhcHBlciIsImNvbnRyb2xsZXIiLCJzaWduYWwiLCJ0ZXh0RGVjb2RlciIsImNyZWRlbnRpYWxzIiwid2l0aENyZWRlbnRpYWxzIiwiY2FjaGUiLCJyZWFkZXIiLCJyZXNwb25zZSIsInJlYWROZXh0Q2h1bmsiLCJyZXN1bHQiLCJyZXNvbHZlIiwicmVqZWN0IiwiUHJvbWlzZSIsIkV2ZW50VGFyZ2V0IiwidHlwZUxpc3RlbmVycyIsImxlbmd0aCIsImxpc3RlbmVyIiwidGhyb3dFcnJvciIsInR5cGUiLCJmb3VuZCIsImZpbHRlcmVkIiwiRXZlbnQiLCJNZXNzYWdlRXZlbnQiLCJDb25uZWN0aW9uRXZlbnQiLCJXQUlUSU5HIiwiQ09OTkVDVElORyIsIk9QRU4iLCJDTE9TRUQiLCJBRlRFUl9DUiIsIkZJRUxEX1NUQVJUIiwiRklFTEQiLCJWQUxVRV9TVEFSVCIsIlZBTFVFIiwiY29udGVudFR5cGVSZWdFeHAiLCJNSU5JTVVNX0RVUkFUSU9OIiwiTUFYSU1VTV9EVVJBVElPTiIsInBhcnNlRHVyYXRpb24iLCJuIiwicGFyc2VJbnQiLCJjbGFtcER1cmF0aW9uIiwiTWF0aCIsImZpcmUiLCJmIiwic3RhcnQiLCJpc0ZldGNoU3VwcG9ydGVkIiwiQm9vbGVhbiIsImluaXRpYWxSZXRyeSIsImhlYXJ0YmVhdFRpbWVvdXQiLCJsYXN0RXZlbnRJZCIsInJldHJ5Iiwid2FzQWN0aXZpdHkiLCJDdXJyZW50VHJhbnNwb3J0IiwidHJhbnNwb3J0IiwiY2FuY2VsRnVuY3Rpb24iLCJjdXJyZW50U3RhdGUiLCJkYXRhQnVmZmVyIiwibGFzdEV2ZW50SWRCdWZmZXIiLCJldmVudFR5cGVCdWZmZXIiLCJ0ZXh0QnVmZmVyIiwiZmllbGRTdGFydCIsInZhbHVlU3RhcnQiLCJlcyIsInRleHRDaHVuayIsInBvc2l0aW9uIiwiZmllbGQiLCJyZXF1ZXN0VVJMIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVxdWVzdEhlYWRlcnMiLCJ4IiwiY2FsbGJhY2siLCJldnRTb3VyY2UiLCJwYXRobmFtZSIsInBhdGhuYW1lRm4iLCJjbG9zZVBpbmciLCJvbmRlbWFuZCIsInBheWxvYWQiLCJsb2NhdGlvbiIsInBhZ2VSZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxtQzs7Ozs7Ozs7Ozs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Qzs7Ozs7Ozs7Ozs7QUNOQSxpQkFBaUIsbUJBQU8sQ0FBQywwRUFBcUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0M5Qzs7QUFDQTs7QUFDQTs7QUFDQTtBQUpBOzs7QUFNQSxJQUFJLENBQUNBLE1BQU0sQ0FBWCxhQUF5QjtBQUN2QkEsUUFBTSxDQUFOQSxjQUFxQkMsb0JBQXJCRDtBQUdGOztBQUFBLElBQU1FLElBQUksR0FBR0MsSUFBSSxDQUFKQSxNQUFXQyxRQUFRLENBQVJBLGdDQUF4QixXQUFhRCxDQUFiO0lBQ0ksVyxHQUFKLEksQ0FBSSxXO0lBQUEsSSxHQUFKLEksQ0FBSSxJO0FBQ0pFLFdBQVcsR0FBR0EsV0FBVyxJQUF6QkE7QUFDQSxJQUFJQyxjQUFjLEdBQWxCO0FBQ0E7O0FBQ0EsSUFBSUMsT0FBTyxHQUFYO0FBQ0EsSUFBTUMsYUFBYSxHQUNqQkgsV0FBVyxJQUFJQSxXQUFXLENBQVhBLHFCQUFmQSxHQUFXLENBQVhBLEdBREYsd0IsQ0FHQTs7QUFDQSw2QkFBNkI7QUFDM0I7QUFDQTs7QUFDQTtBQUNBLFNBQU9DLGNBQWMsS0FBckI7QUFHRixDLENBQUE7OztBQUNBLDJCQUEyQjtBQUN6QixTQUFPRyxNQUFNLENBQU5BLGlCQUFQO0FBR0YsQyxDQUFBO0FBQ0E7OztTQUNBLGU7Ozs7OzhFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGtCQUNNLENBQUNDLGlCQUFELE1BQXdCLENBQUNDLGVBQTdCLEVBREY7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBS3NCQyxLQUFLLFdBQUlKLGFBQUosU0FBdkIsT0FBdUIsc0JBTDNCOztBQUFBO0FBS1VLLGVBTFY7QUFBQTtBQUFBLG1CQU0yQkEsR0FBRyxDQUExQixJQUF1QkEsRUFOM0I7O0FBQUE7QUFNVUMsb0JBTlY7QUFPVUMsbUJBUFYsR0FPb0JDLElBQUksS0FBSkEsZ0JBQWhCLElBUEosRUFRSTs7QUFDTUMsdUJBVFYsR0FTd0IsQ0FBQ0MsS0FBSyxDQUFMQSxRQUFjSixRQUFRLENBQXRCSSxLQUNqQkosUUFBUSxDQURTSSxJQUVqQkMsTUFBTSxDQUFOQSxLQUFZTCxRQUFRLENBRkosQ0FFaEJLLENBRmdCLE9BR1pDLGFBQUQsRUFBUztBQUNkLHFCQUNFQSxHQUFHLENBQUhBLHVCQUNVTCxPQUFPLENBQVBBLDRDQURWSyxPQUNVTCxDQURWSyxPQUVNLENBRk5BLEtBR0FBLEdBQUcsQ0FBSEEsUUFDRyxlQUNDTCxPQUFPLENBQVBBLDRDQURGLE9BQ0VBLENBREQsRUFBRCxPQUFDLENBQUQsS0FBQyxFQURISyxJQUNHLENBREhBLE1BSU0sQ0FSUjtBQUpGLGFBQW9CLENBVHhCOztBQXlCSSw2QkFBaUI7QUFDZmhCLHNCQUFRLENBQVJBO0FBREYsbUJBRU87QUFDTEcscUJBQU8sR0FBUEE7QUFFSDs7QUE5Qkg7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUErQkljLG1CQUFPLENBQVBBO0FBQ0FqQixvQkFBUSxDQUFSQTs7QUFoQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRzs7OztBQW9DQSx3Q0FBc0I7QUFDcEJrQixNQUFJLFlBRE4sV0FDTTtBQURnQixDQUF0QixxQkFFdUJDLGVBQUQsRUFBVztBQUMvQixNQUFJQSxLQUFLLENBQUxBLFNBQUosZ0JBQW1DO0FBQ2pDO0FBR0Y7O0FBQUEsTUFBSTtBQUNGLFFBQU1DLE9BQU8sR0FBR3JCLElBQUksQ0FBSkEsTUFBV29CLEtBQUssQ0FBaEMsSUFBZ0JwQixDQUFoQjs7QUFFQSxRQUFJcUIsT0FBTyxDQUFQQSxxQkFBNkJBLE9BQU8sQ0FBUEEsV0FBakMsU0FBNkQ7QUFDM0QsVUFBSSxDQUFDQSxPQUFPLENBQVosTUFBbUI7QUFDakI7QUFFRmxCOztBQUFBQSxvQkFBYyxHQUFHa0IsT0FBTyxDQUF4QmxCO0FBQ0FtQixxQkFBZTtBQUxqQixXQU1PLElBQUlELE9BQU8sQ0FBUEEsV0FBSixjQUFxQztBQUMxQ3BCLGNBQVEsQ0FBUkE7QUFFSDtBQUFDLEdBWkYsQ0FZRSxXQUFXO0FBQ1hpQixXQUFPLENBQVBBLEtBQWEsMEJBQTBCRSxLQUFLLENBQS9CLGNBQWJGO0FBRUg7QUF0QkQ7QUF3QkEsa0RBQXVCO0FBQUEsU0FBdkIsSUFBdUI7QUFBQSxDQUF2QjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0ZBLElBQU1LLGNBQWMsR0FBcEI7O0FBRUEscUNBQXFDO0FBQ25DO0FBQ0EsTUFBSUMsWUFBWSxHQUFHLElBQW5CLElBQW1CLEVBQW5CO0FBQ0EsTUFBSUMsU0FBUyxHQUFiOztBQUVBLE1BQUksQ0FBQ0MsT0FBTyxDQUFaLFNBQXNCO0FBQ3BCQSxXQUFPLENBQVBBLFVBQWtCLEtBQWxCQTtBQUdGQzs7QUFBQUEsTUFBSTtBQUNKLE1BQUlDLEtBQUssR0FBR0MsV0FBVyxDQUFDLFlBQVk7QUFDbEMsUUFBSSw0QkFBNEJILE9BQU8sQ0FBdkMsU0FBaUQ7QUFDL0NJLHNCQUFnQjtBQUVuQjtBQUpzQixLQUlwQkosT0FBTyxDQUFQQSxVQUpILENBQXVCLENBQXZCOztBQU1BLGtCQUFnQjtBQUNkSyxVQUFNLEdBQUcsSUFBSWxDLE1BQU0sQ0FBVixZQUF1QjZCLE9BQU8sQ0FBdkNLLElBQVMsQ0FBVEE7QUFDQUEsVUFBTSxDQUFOQTtBQUNBQSxVQUFNLENBQU5BO0FBQ0FBLFVBQU0sQ0FBTkE7QUFHRjs7QUFBQSwwQkFBd0I7QUFDdEIsUUFBSUwsT0FBTyxDQUFYLEtBQWlCUixPQUFPLENBQVBBO0FBQ2pCTSxnQkFBWSxHQUFHLElBQWZBLElBQWUsRUFBZkE7QUFHRjs7QUFBQSxnQ0FBOEI7QUFDNUJBLGdCQUFZLEdBQUcsSUFBZkEsSUFBZSxFQUFmQTs7QUFDQSxTQUFLLElBQUlRLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFHUCxTQUFTLENBQTdCLFFBQXNDTyxDQUF0QyxJQUEyQztBQUN6Q1AsZUFBUyxDQUFUQSxDQUFTLENBQVRBO0FBR0ZGOztBQUFBQSxrQkFBYyxDQUFkQSxRQUF3QlUsWUFBRCxFQUFRO0FBQzdCLFVBQUksQ0FBQ0EsRUFBRSxDQUFILGNBQWtCYixLQUFLLENBQUxBLDJCQUFpQyxDQUF2RCxHQUEyRDtBQUMzRGEsUUFBRSxDQUFGQSxLQUFFLENBQUZBO0FBRkZWO0FBTUY7O0FBQUEsOEJBQTRCO0FBQzFCVyxpQkFBYSxDQUFiQSxLQUFhLENBQWJBO0FBQ0FILFVBQU0sQ0FBTkE7QUFDQUksY0FBVSxPQUFPVCxPQUFPLENBQXhCUyxPQUFVLENBQVZBO0FBR0Y7O0FBQUEsU0FBTztBQUNMQyxTQUFLLEVBQUUsaUJBQU07QUFDWEYsbUJBQWEsQ0FBYkEsS0FBYSxDQUFiQTtBQUNBSCxZQUFNLENBQU5BO0FBSEc7QUFLTE0sc0JBQWtCLEVBQUUsZ0NBQWM7QUFDaENaLGVBQVMsQ0FBVEE7QUFOSjtBQUFPLEdBQVA7QUFXSzs7S0F6RFAsa0I7O0FBeURPLHdDQUF3QztBQUM3QyxNQUFJLENBQUNDLE9BQU8sQ0FBWixVQUF1QjtBQUNyQixXQUFPO0FBQ0xXLHdCQUFrQixFQUFHSiw4QkFBRCxFQUFRO0FBQzFCVixzQkFBYyxDQUFkQTtBQUZKO0FBQU8sS0FBUDtBQU1GOztBQUFBLFNBQU9lLGtCQUFrQixDQUF6QixPQUF5QixDQUF6QjtBQUNEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BFRDtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxJQUFJckMsUUFBUSxHQUFHSixNQUFNLENBQXJCO0FBQ0EsSUFBSTBDLFFBQVEsR0FBRzFDLE1BQU0sQ0FBckI7QUFDQSxJQUFJMkMsV0FBVyxHQUFHM0MsTUFBTSxDQUF4QjtBQUNBLElBQUk0QyxXQUFXLEdBQUc1QyxNQUFNLENBQXhCO0FBQ0EsSUFBSTZDLGVBQWUsR0FBRzdDLE1BQU0sQ0FBNUI7O0FBRUEsSUFBSTZDLGVBQWUsSUFBbkIsV0FBa0M7QUFDaENBLGlCQUFlLEdBQUcsMkJBQVk7QUFDNUI7O0FBQ0EsaUJBQWEsWUFBWSxDQUF6QjtBQUZGQTtBQU1GOztBQUFBLCtCQUErQjtBQUM3QjtBQUNBO0FBR0ZDOztLQUxBLG1COztBQUtBQSxtQkFBbUIsQ0FBbkJBLG1CQUF1QyxrQkFBa0I7QUFDdkQsZ0RBQThDO0FBQzVDLFFBQUlDLFdBQVcsS0FBZixHQUF1QjtBQUNyQixhQUFPQyxTQUFTLElBQUksVUFBYkEsU0FBZ0NBLFNBQVMsSUFBVEEsU0FBdkM7QUFFRjs7QUFBQSxRQUFJRCxXQUFXLEtBQWYsR0FBdUI7QUFDckIsYUFDR0MsU0FBUyxJQUFJLFVBQWJBLFNBQWdDQSxTQUFTLElBQVRBLFNBQWpDLE1BQUNBLElBQ0FBLFNBQVMsSUFBSSxVQUFiQSxTQUFnQ0EsU0FBUyxJQUFUQSxTQUZuQztBQUtGOztBQUFBLFFBQUlELFdBQVcsS0FBZixHQUF1QjtBQUNyQixhQUFPQyxTQUFTLElBQUksWUFBYkEsU0FBa0NBLFNBQVMsSUFBVEEsU0FBekM7QUFFRjs7QUFBQSxVQUFNLElBQU4sS0FBTSxFQUFOO0FBRUY7O0FBQUEsOENBQTRDO0FBQzFDLFFBQUlDLFVBQVUsS0FBSyxJQUFuQixHQUEwQjtBQUN4QixhQUFPRCxTQUFTLElBQVRBLGFBQTBCQSxTQUFTLEdBQVRBLFNBQWpDO0FBRUY7O0FBQUEsUUFBSUMsVUFBVSxLQUFLLElBQW5CLEdBQTBCO0FBQ3hCLGFBQU9ELFNBQVMsR0FBVEEsU0FBUDtBQUVGOztBQUFBLFFBQUlDLFVBQVUsS0FBSyxJQUFuQixHQUEwQjtBQUN4QjtBQUVGOztBQUFBLFVBQU0sSUFBTixLQUFNLEVBQU47QUFFRjs7QUFBQSxNQUFJQyxRQUFRLEdBQVo7QUFDQSxNQUFJQyxNQUFNLEdBQVY7QUFDQSxNQUFJRixVQUFVLEdBQUcsS0FBakI7QUFDQSxNQUFJRCxTQUFTLEdBQUcsS0FBaEI7O0FBQ0EsT0FBSyxJQUFJYixDQUFDLEdBQVYsR0FBZ0JBLENBQUMsR0FBR2lCLE1BQU0sQ0FBMUIsUUFBbUNqQixDQUFDLElBQXBDLEdBQTJDO0FBQ3pDLFFBQUlrQixLQUFLLEdBQUdELE1BQU0sQ0FBbEIsQ0FBa0IsQ0FBbEI7O0FBQ0EsUUFBSUgsVUFBVSxLQUFkLEdBQXNCO0FBQ3BCLFVBQ0VJLEtBQUssR0FBTEEsT0FDQUEsS0FBSyxHQURMQSxPQUVBLENBQUNDLEtBQUssQ0FDSE4sU0FBUyxJQUFWLENBQUNBLEdBQW1CSyxLQUFLLEdBRHJCLElBRUpKLFVBQVUsR0FGTixHQUdKRixXQUFXLGFBTmYsU0FNZSxDQUhQLENBSFIsRUFRRTtBQUNBRSxrQkFBVSxHQUFWQTtBQUNBRCxpQkFBUyxHQUFUQTtBQUNBRyxjQUFNLElBQUlJLE1BQU0sQ0FBTkEsYUFBVkosU0FBVUksQ0FBVko7QUFFSDtBQUNEOztBQUFBLFFBQUlGLFVBQVUsS0FBZCxHQUFzQjtBQUNwQixVQUFJSSxLQUFLLElBQUxBLEtBQWNBLEtBQUssSUFBdkIsS0FBZ0M7QUFDOUJKLGtCQUFVLEdBQVZBO0FBQ0FELGlCQUFTLEdBQVRBO0FBRkYsYUFHTyxJQUFJSyxLQUFLLElBQUxBLE9BQWdCQSxLQUFLLElBQXpCLEtBQWtDO0FBQ3ZDSixrQkFBVSxHQUFHLElBQWJBO0FBQ0FELGlCQUFTLEdBQUdLLEtBQUssR0FBakJMO0FBRkssYUFHQSxJQUFJSyxLQUFLLElBQUxBLE9BQWdCQSxLQUFLLElBQXpCLEtBQWtDO0FBQ3ZDSixrQkFBVSxHQUFHLElBQWJBO0FBQ0FELGlCQUFTLEdBQUdLLEtBQUssR0FBakJMO0FBRkssYUFHQSxJQUFJSyxLQUFLLElBQUxBLE9BQWdCQSxLQUFLLElBQXpCLEtBQWtDO0FBQ3ZDSixrQkFBVSxHQUFHLElBQWJBO0FBQ0FELGlCQUFTLEdBQUdLLEtBQUssR0FBakJMO0FBRkssYUFHQTtBQUNMQyxrQkFBVSxHQUFWQTtBQUNBRCxpQkFBUyxHQUFUQTtBQUVGOztBQUFBLFVBQ0VDLFVBQVUsS0FBVkEsS0FDQSxDQUFDSyxLQUFLLHdCQUF3QlAsV0FBVyxhQUYzQyxTQUUyQyxDQUFuQyxDQUZSLEVBR0U7QUFDQUUsa0JBQVUsR0FBVkE7QUFDQUQsaUJBQVMsR0FBVEE7QUFFSDtBQXhCRCxXQXdCTztBQUNMQyxnQkFBVSxJQUFWQTtBQUNBRCxlQUFTLEdBQUlBLFNBQVMsSUFBVixDQUFDQSxHQUFtQkssS0FBSyxHQUFyQ0w7QUFFRjs7QUFBQSxRQUFJQyxVQUFVLEtBQWQsR0FBc0I7QUFDcEIsVUFBSUQsU0FBUyxJQUFiLFFBQXlCO0FBQ3ZCRyxjQUFNLElBQUlJLE1BQU0sQ0FBTkEsYUFBVkosU0FBVUksQ0FBVko7QUFERixhQUVPO0FBQ0xBLGNBQU0sSUFBSUksTUFBTSxDQUFOQSxhQUFvQixVQUFXUCxTQUFTLEdBQVRBLFNBQUQsQ0FBQ0EsSUFBekNHLEVBQThCLENBQXBCSSxDQUFWSjtBQUNBQSxjQUFNLElBQUlJLE1BQU0sQ0FBTkEsYUFDUixVQUFXUCxTQUFTLEdBQVRBLFNBQUQsQ0FBQ0EsR0FEYkcsS0FDRSxDQURRSSxDQUFWSjtBQUlIO0FBQ0Y7QUFDRDs7QUFBQTtBQUNBO0FBQ0E7QUExRkZMLEUsQ0E2RkE7OztBQUNBLElBQUlVLG9CQUFvQixHQUFwQkEsZ0NBQW1DO0FBQ3JDLE1BQUk7QUFDRixXQUNFLHlCQUF5Qix5QkFBekIsTUFBeUIsQ0FBekIsRUFBMkQ7QUFDekRDLFlBQU0sRUFEUjtBQUEyRCxLQUEzRCxNQURGO0FBS0EsR0FORixDQU1FLGNBQWM7QUFDZHBDLFdBQU8sQ0FBUEE7QUFFRjs7QUFBQTtBQVZGLEUsQ0FhQTs7O0FBQ0EsSUFDRXNCLFdBQVcsSUFBWEEsYUFDQUMsV0FBVyxJQURYRCxhQUVBLENBQUNhLG9CQUhILElBSUU7QUFDQWIsYUFBVyxHQUFYQTtBQUdGOztBQUFBLElBQUllLENBQUMsR0FBREEsYUFBZ0IsQ0FBcEI7O0FBRUEseUJBQXlCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdGOztNQWZBLFU7O0FBZUEsVUFBVSxDQUFWLGlCQUE0Qix1QkFBdUI7QUFDakQ7O0FBRUEsTUFBSUMsSUFBSSxHQUFSO0FBQ0EsTUFBSUMsR0FBRyxHQUFHLEtBQVY7QUFDQSxNQUFJQyxLQUFLLEdBQVQ7QUFDQSxNQUFJQyxPQUFPLEdBQVg7O0FBRUEsZ0JBQWMsa0JBQWtCO0FBQzlCLFFBQUlILElBQUksQ0FBSkEsaUJBQUosR0FBNkI7QUFDM0JJLGtCQUFZLENBQUNKLElBQUksQ0FBakJJLFlBQVksQ0FBWkE7QUFDQUosVUFBSSxDQUFKQTtBQUVGOztBQUFBLFFBQUlFLEtBQUssS0FBTEEsS0FBZUEsS0FBSyxLQUFwQkEsS0FBOEJBLEtBQUssS0FBdkMsR0FBK0M7QUFDN0NBLFdBQUssR0FBTEE7QUFDQUQsU0FBRyxDQUFIQTtBQUNBQSxTQUFHLENBQUhBO0FBQ0FBLFNBQUcsQ0FBSEE7QUFDQUEsU0FBRyxDQUFIQTtBQUNBQSxTQUFHLENBQUhBLHVCQU42QyxDQU83QztBQUNBOztBQUNBQSxTQUFHLENBQUhBOztBQUNBLFVBQUlFLE9BQU8sS0FBWCxHQUFtQjtBQUNqQkMsb0JBQVksQ0FBWkEsT0FBWSxDQUFaQTtBQUNBRCxlQUFPLEdBQVBBO0FBRUY7O0FBQUEsVUFBSSxDQUFKLFFBQWE7QUFDWEgsWUFBSSxDQUFKQTtBQUNBQSxZQUFJLENBQUpBO0FBRUg7QUFDREU7O0FBQUFBLFNBQUssR0FBTEE7QUF4QkY7O0FBMkJBLE1BQUlHLE9BQU8sR0FBUEEsbUJBQXNCO0FBQ3hCLFFBQUlILEtBQUssS0FBVCxHQUFpQjtBQUNmO0FBQ0EsVUFBSUksTUFBTSxHQUFWO0FBQ0EsVUFBSUMsVUFBVSxHQUFkO0FBQ0EsVUFBSUMsV0FBVyxHQUFmOztBQUNBLFVBQUksRUFBRSxpQkFBTixHQUFJLENBQUosRUFBNkI7QUFDM0IsWUFBSTtBQUNGRixnQkFBTSxHQUFHTCxHQUFHLENBQVpLO0FBQ0FDLG9CQUFVLEdBQUdOLEdBQUcsQ0FBaEJNO0FBQ0FDLHFCQUFXLEdBQUdQLEdBQUcsQ0FBSEEsa0JBQWRPLGNBQWNQLENBQWRPO0FBQ0EsU0FKRixDQUlFLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQUYsZ0JBQU0sR0FBTkE7QUFDQUMsb0JBQVUsR0FBVkE7QUFDQUMscUJBQVcsR0FBWEEsVUFOYyxDQU9kO0FBQ0E7QUFDQTtBQUVIO0FBaEJELGFBZ0JPO0FBQ0xGLGNBQU0sR0FBTkE7QUFDQUMsa0JBQVUsR0FBVkE7QUFDQUMsbUJBQVcsR0FBR1AsR0FBRyxDQUFqQk87QUFFRjs7QUFBQSxVQUFJRixNQUFNLEtBQVYsR0FBa0I7QUFDaEJKLGFBQUssR0FBTEE7QUFDQUYsWUFBSSxDQUFKQTtBQUNBQSxZQUFJLENBQUpBO0FBQ0FBLFlBQUksQ0FBSkE7QUFDQUEsWUFBSSxDQUFKQTtBQUNBQSxZQUFJLENBQUpBO0FBRUg7QUFDRjtBQXBDRDs7QUFxQ0EsTUFBSVMsVUFBVSxHQUFWQSxzQkFBeUI7QUFDM0JKLFdBQU87O0FBQ1AsUUFBSUgsS0FBSyxLQUFMQSxLQUFlQSxLQUFLLEtBQXhCLEdBQWdDO0FBQzlCQSxXQUFLLEdBQUxBO0FBQ0EsVUFBSVEsWUFBWSxHQUFoQjs7QUFDQSxVQUFJO0FBQ0ZBLG9CQUFZLEdBQUdULEdBQUcsQ0FBbEJTO0FBQ0EsT0FGRixDQUVFLGNBQWMsQ0FDZDtBQUVGVjs7QUFBQUEsVUFBSSxDQUFKQTtBQUNBQSxVQUFJLENBQUpBO0FBQ0FBLFVBQUksQ0FBSkE7QUFFSDtBQWREOztBQWVBLE1BQUlXLFFBQVEsR0FBUkEsb0JBQXVCO0FBQ3pCO0FBQ0E7QUFDQUYsY0FBVTs7QUFDVixRQUFJUCxLQUFLLEtBQUxBLEtBQWVBLEtBQUssS0FBcEJBLEtBQThCQSxLQUFLLEtBQXZDLEdBQStDO0FBQzdDQSxXQUFLLEdBQUxBOztBQUNBLFVBQUlDLE9BQU8sS0FBWCxHQUFtQjtBQUNqQkMsb0JBQVksQ0FBWkEsT0FBWSxDQUFaQTtBQUNBRCxlQUFPLEdBQVBBO0FBRUZIOztBQUFBQSxVQUFJLENBQUpBO0FBQ0FBLFVBQUksQ0FBSkE7QUFFSDtBQWJEOztBQWNBLE1BQUlZLGtCQUFrQixHQUFsQkEsOEJBQWlDO0FBQ25DLFFBQUlYLEdBQUcsSUFBUCxXQUFzQjtBQUNwQjtBQUNBLFVBQUlBLEdBQUcsQ0FBSEEsZUFBSixHQUEwQjtBQUN4QlUsZ0JBQVE7QUFEVixhQUVPLElBQUlWLEdBQUcsQ0FBSEEsZUFBSixHQUEwQjtBQUMvQlEsa0JBQVU7QUFETCxhQUVBLElBQUlSLEdBQUcsQ0FBSEEsZUFBSixHQUEwQjtBQUMvQkksZUFBTztBQUVWO0FBQ0Y7QUFYRDs7QUFZQSxNQUFJUSxTQUFTLEdBQVRBLHFCQUF3QjtBQUMxQlYsV0FBTyxHQUFHeEIsVUFBVSxDQUFDLFlBQVk7QUFDL0JrQyxlQUFTO0FBRFMsT0FBcEJWLEdBQW9CLENBQXBCQTs7QUFHQSxRQUFJRixHQUFHLENBQUhBLGVBQUosR0FBMEI7QUFDeEJRLGdCQUFVO0FBRWI7QUFQRCxJQWpIaUQsQ0EwSGpEOzs7QUFDQVIsS0FBRyxDQUFIQTtBQUNBQSxLQUFHLENBQUhBLG1CQTVIaUQsQ0E2SGpEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0FBLEtBQUcsQ0FBSEEsbUJBbElpRCxDQW9JakQ7O0FBQ0EsTUFDRSxFQUFFLGtCQUFrQmEsY0FBYyxDQUFsQyxjQUNBLEVBQUUsYUFBYUEsY0FBYyxDQUYvQixTQUVFLENBRkYsRUFHRTtBQUNBYixPQUFHLENBQUhBO0FBR0YsR0E1SWlELENBNElqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBQSxLQUFHLENBQUhBOztBQUVBLE1BQUksaUJBQUosS0FBMEI7QUFDeEJjLE9BQUcsSUFBSSxDQUFDQSxHQUFHLENBQUhBLGlCQUFxQixDQUFyQkEsVUFBRCxPQUFQQTtBQUVGZDs7QUFBQUEsS0FBRyxDQUFIQTs7QUFFQSxNQUFJLGdCQUFKLEtBQXlCO0FBQ3ZCO0FBQ0E7QUFDQUUsV0FBTyxHQUFHeEIsVUFBVSxDQUFDLFlBQVk7QUFDL0JrQyxlQUFTO0FBRFMsT0FBcEJWLENBQW9CLENBQXBCQTtBQUlIO0FBaEtEOztBQWlLQWEsVUFBVSxDQUFWQSxrQkFBNkIsWUFBWTtBQUN2QztBQURGQTs7QUFHQUEsVUFBVSxDQUFWQSw4QkFBeUMsZ0JBQWdCO0FBQ3ZELFNBQU8sS0FBUDtBQURGQTs7QUFHQUEsVUFBVSxDQUFWQSw2QkFBd0MsdUJBQXVCO0FBQzdELE1BQUlmLEdBQUcsR0FBRyxLQUFWOztBQUNBLE1BQUksc0JBQUosS0FBK0I7QUFDN0JBLE9BQUcsQ0FBSEE7QUFFSDtBQUxEZTs7QUFNQUEsVUFBVSxDQUFWQSxrQ0FBNkMsWUFBWTtBQUN2RCxTQUFPLCtDQUNILFVBREcscUJBQ0gsRUFERyxHQUFQO0FBREZBOztBQUtBLFVBQVUsQ0FBVixpQkFBNEIsWUFBWTtBQUN0QztBQUNBLE1BQ0UsRUFBRSxlQUFlRixjQUFjLENBQS9CLGNBQ0FyRSxRQUFRLElBRFIsYUFFQUEsUUFBUSxDQUFSQSxjQUZBLGFBR0FBLFFBQVEsQ0FBUkEsZUFKRixZQUtFO0FBQ0EsUUFBSXVELElBQUksR0FBUjtBQUNBQSxRQUFJLENBQUpBLGVBQW9CckIsVUFBVSxDQUFDLFlBQVk7QUFDekNxQixVQUFJLENBQUpBO0FBQ0FBLFVBQUksQ0FBSkE7QUFGNEIsT0FBOUJBLENBQThCLENBQTlCQTtBQUlBO0FBR0Y7O0FBQUEsTUFBSUMsR0FBRyxHQUFHLEtBQVYsS0FoQnNDLENBaUJ0Qzs7QUFDQUEsS0FBRyxDQUFIQSxrQkFBc0IsS0FBdEJBO0FBQ0FBLEtBQUcsQ0FBSEEsZUFBbUIsS0FBbkJBOztBQUNBLE1BQUk7QUFDRjtBQUNBQSxPQUFHLENBQUhBO0FBQ0EsR0FIRixDQUdFLGVBQWU7QUFDZjtBQUNBO0FBRUg7QUEzQkQ7O0FBNkJBLDJCQUEyQjtBQUN6QixTQUFPZ0IsSUFBSSxDQUFKQSxrQkFBdUIsYUFBYTtBQUN6QyxXQUFPckIsTUFBTSxDQUFOQSxhQUFvQnNCLENBQUMsQ0FBREEsZ0JBQTNCLElBQU90QixDQUFQO0FBREYsR0FBT3FCLENBQVA7QUFLRjs7QUFBQSw4QkFBOEI7QUFDNUI7QUFDQSxNQUFJRSxHQUFHLEdBQUczRCxNQUFNLENBQU5BLE9BQVYsSUFBVUEsQ0FBVjtBQUNBLE1BQUk0RCxLQUFLLEdBQUdDLEdBQUcsQ0FBSEEsTUFBWixNQUFZQSxDQUFaOztBQUNBLE9BQUssSUFBSTdDLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFHNEMsS0FBSyxDQUF6QixRQUFrQzVDLENBQUMsSUFBbkMsR0FBMEM7QUFDeEMsUUFBSThDLElBQUksR0FBR0YsS0FBSyxDQUFoQixDQUFnQixDQUFoQjtBQUNBLFFBQUlHLEtBQUssR0FBR0QsSUFBSSxDQUFKQSxNQUFaLElBQVlBLENBQVo7QUFDQSxRQUFJTCxJQUFJLEdBQUdNLEtBQUssQ0FBaEIsS0FBV0EsRUFBWDtBQUNBLFFBQUlDLEtBQUssR0FBR0QsS0FBSyxDQUFMQSxLQUFaLElBQVlBLENBQVo7QUFDQUosT0FBRyxDQUFDTSxXQUFXLENBQWZOLElBQWUsQ0FBWixDQUFIQTtBQUVGOztBQUFBO0FBRUZPOztNQWJBLGU7O0FBYUFBLGVBQWUsQ0FBZkEsZ0JBQWdDLGdCQUFnQjtBQUM5QyxTQUFPLFVBQVVELFdBQVcsQ0FBNUIsSUFBNEIsQ0FBckIsQ0FBUDtBQURGQzs7QUFJQSx3QkFBd0IsQ0FFeEJDOztNQUZBLFk7O0FBRUFBLFlBQVksQ0FBWkEsaUJBQThCLHFHQVE1QjtBQUNBMUIsS0FBRyxDQUFIQTtBQUNBLE1BQUkyQixNQUFNLEdBQVY7O0FBQ0EzQixLQUFHLENBQUhBLGFBQWlCLFlBQVk7QUFDM0IsUUFBSVMsWUFBWSxHQUFHVCxHQUFHLENBQXRCO0FBQ0EsUUFBSTRCLEtBQUssR0FBR25CLFlBQVksQ0FBWkEsTUFBWixNQUFZQSxDQUFaO0FBQ0FrQixVQUFNLElBQUlDLEtBQUssQ0FBZkQ7QUFDQUUsc0JBQWtCLENBQWxCQSxLQUFrQixDQUFsQkE7QUFKRjdCOztBQU1BQSxLQUFHLENBQUhBLHFCQUF5QixZQUFZO0FBQ25DLFFBQUlBLEdBQUcsQ0FBSEEsZUFBSixHQUEwQjtBQUN4QixVQUFJSyxNQUFNLEdBQUdMLEdBQUcsQ0FBaEI7QUFDQSxVQUFJTSxVQUFVLEdBQUdOLEdBQUcsQ0FBcEI7QUFDQSxVQUFJTyxXQUFXLEdBQUdQLEdBQUcsQ0FBSEEsa0JBQWxCLGNBQWtCQSxDQUFsQjtBQUNBLFVBQUk4QixPQUFPLEdBQUc5QixHQUFHLENBQWpCLHFCQUFjQSxFQUFkO0FBQ0ErQixxQkFBZSxrQ0FJYixvQkFKYSxPQUliLENBSmEsRUFLYixZQUFZO0FBQ1YvQixXQUFHLENBQUhBO0FBTkorQixPQUFlLENBQWZBO0FBTEYsV0FjTyxJQUFJL0IsR0FBRyxDQUFIQSxlQUFKLEdBQTBCO0FBQy9CZ0Msc0JBQWdCO0FBRW5CO0FBbEJEaEM7O0FBbUJBQSxLQUFHLENBQUhBO0FBQ0FBLEtBQUcsQ0FBSEE7O0FBQ0EsT0FBSyxJQUFMLGlCQUEwQjtBQUN4QixRQUFJekMsTUFBTSxDQUFOQSx1Q0FBSixJQUFJQSxDQUFKLEVBQXlEO0FBQ3ZEeUMsU0FBRyxDQUFIQSx1QkFBMkI4QixPQUFPLENBQWxDOUIsSUFBa0MsQ0FBbENBO0FBRUg7QUFDREE7O0FBQUFBLEtBQUcsQ0FBSEE7QUEzQ0YwQjs7QUE4Q0EsaUNBQWlDO0FBQy9CO0FBRUZPOztNQUhBLGM7O0FBR0FBLGNBQWMsQ0FBZEEsZ0JBQStCLGdCQUFnQjtBQUM3QyxTQUFPLGtCQUFQLElBQU8sQ0FBUDtBQURGQTs7QUFJQSwwQkFBMEIsQ0FFMUI7O01BRkEsYzs7QUFFQSxjQUFjLENBQWQsaUJBQWdDLHFHQVE5QjtBQUNBLE1BQUlDLFVBQVUsR0FBRyxJQUFqQixlQUFpQixFQUFqQjtBQUNBLE1BQUlDLE1BQU0sR0FBR0QsVUFBVSxDQUF2QixPQUZBLENBRStCOztBQUMvQixNQUFJRSxXQUFXLEdBQUcsSUFBbEIsV0FBa0IsRUFBbEI7QUFDQXBGLE9BQUssTUFBTTtBQUNUOEUsV0FBTyxFQURFO0FBRVRPLGVBQVcsRUFBRUMsZUFBZSxlQUZuQjtBQUdUSCxVQUFNLEVBSEc7QUFJVEksU0FBSyxFQUpQdkY7QUFBVyxHQUFOLENBQUxBLE1BTVEsb0JBQW9CO0FBQ3hCLFFBQUl3RixNQUFNLEdBQUdDLFFBQVEsQ0FBUkEsS0FBYixTQUFhQSxFQUFiO0FBQ0FWLG1CQUFlLENBQ2JVLFFBQVEsQ0FESyxRQUViQSxRQUFRLENBRkssWUFHYkEsUUFBUSxDQUFSQSxZQUhhLGNBR2JBLENBSGEsRUFJYixtQkFBbUJBLFFBQVEsQ0FKZCxPQUliLENBSmEsRUFLYixZQUFZO0FBQ1ZQLGdCQUFVLENBQVZBO0FBQ0FNLFlBQU0sQ0FBTkE7QUFQSlQsS0FBZSxDQUFmQTtBQVVBLFdBQU8sWUFBWSwyQkFBMkI7QUFDNUMsVUFBSVcsYUFBYSxHQUFiQSx5QkFBNEI7QUFDOUIsY0FBTSxDQUFOLFlBRVEsa0JBQWtCO0FBQ3RCLGNBQUlDLE1BQU0sQ0FBVixNQUFpQjtBQUNmO0FBQ0FDLG1CQUFPLENBQVBBLFNBQU8sQ0FBUEE7QUFGRixpQkFHTztBQUNMLGdCQUFJaEIsS0FBSyxHQUFHUSxXQUFXLENBQVhBLE9BQW1CTyxNQUFNLENBQXpCUCxPQUFpQztBQUFFdkMsb0JBQU0sRUFBckQ7QUFBNkMsYUFBakN1QyxDQUFaO0FBQ0FQLDhCQUFrQixDQUFsQkEsS0FBa0IsQ0FBbEJBO0FBQ0FhLHlCQUFhO0FBRWhCO0FBWEgsb0JBWVksaUJBQWlCO0FBQ3pCRyxnQkFBTSxDQUFOQSxLQUFNLENBQU5BO0FBYko7QUFERjs7QUFpQkFILG1CQUFhO0FBbEJmLEtBQU8sQ0FBUDtBQWxCSjFGLFVBd0NJLGtCQUFrQjtBQUNoQmdGLG9CQUFnQjtBQUNoQjtBQTFDTmhGLEtBNENJLGlCQUFpQjtBQUNmZ0Ysb0JBQWdCO0FBQ2hCLFdBQU9jLE9BQU8sQ0FBUEEsT0FBUCxLQUFPQSxDQUFQO0FBOUNOOUY7QUFaRjs7QUErREEsdUJBQXVCO0FBQ3JCLG9CQUFrQk8sTUFBTSxDQUFOQSxPQUFsQixJQUFrQkEsQ0FBbEI7QUFHRjs7TUFKQSxXOztBQUlBLHVCQUF1QjtBQUNyQm1CLFlBQVUsQ0FBQyxZQUFZO0FBQ3JCO0FBRFEsS0FBVkEsQ0FBVSxDQUFWQTtBQUtGcUU7O0FBQUFBLFdBQVcsQ0FBWEEsMEJBQXNDLGlCQUFpQjtBQUNyRHBGLE9BQUssQ0FBTEE7QUFDQSxNQUFJcUYsYUFBYSxHQUFHLGdCQUFnQnJGLEtBQUssQ0FBekMsSUFBb0IsQ0FBcEI7O0FBQ0EsTUFBSXFGLGFBQWEsSUFBakIsV0FBZ0M7QUFDOUIsUUFBSUMsTUFBTSxHQUFHRCxhQUFhLENBQTFCOztBQUNBLFNBQUssSUFBSXpFLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFqQixRQUE0QkEsQ0FBQyxJQUE3QixHQUFvQztBQUNsQyxVQUFJMkUsUUFBUSxHQUFHRixhQUFhLENBQTVCLENBQTRCLENBQTVCOztBQUNBLFVBQUk7QUFDRixZQUFJLE9BQU9FLFFBQVEsQ0FBZixnQkFBSixZQUFnRDtBQUM5Q0Esa0JBQVEsQ0FBUkE7QUFERixlQUVPO0FBQ0xBLGtCQUFRLENBQVJBO0FBRUg7QUFBQyxPQU5GLENBTUUsVUFBVTtBQUNWQyxrQkFBVSxDQUFWQSxDQUFVLENBQVZBO0FBRUg7QUFDRjtBQUNGO0FBbEJESjs7QUFtQkFBLFdBQVcsQ0FBWEEsNkJBQXlDLDBCQUEwQjtBQUNqRUssTUFBSSxHQUFHekQsTUFBTSxDQUFieUQsSUFBYSxDQUFiQTtBQUNBLE1BQUlwRixTQUFTLEdBQUcsS0FBaEI7QUFDQSxNQUFJZ0YsYUFBYSxHQUFHaEYsU0FBUyxDQUE3QixJQUE2QixDQUE3Qjs7QUFDQSxNQUFJZ0YsYUFBYSxJQUFqQixXQUFnQztBQUM5QkEsaUJBQWEsR0FBYkE7QUFDQWhGLGFBQVMsQ0FBVEEsSUFBUyxDQUFUQTtBQUVGOztBQUFBLE1BQUlxRixLQUFLLEdBQVQ7O0FBQ0EsT0FBSyxJQUFJOUUsQ0FBQyxHQUFWLEdBQWdCQSxDQUFDLEdBQUd5RSxhQUFhLENBQWpDLFFBQTBDekUsQ0FBQyxJQUEzQyxHQUFrRDtBQUNoRCxRQUFJeUUsYUFBYSxDQUFiQSxDQUFhLENBQWJBLEtBQUosVUFBbUM7QUFDakNLLFdBQUssR0FBTEE7QUFFSDtBQUNEOztBQUFBLE1BQUksQ0FBSixPQUFZO0FBQ1ZMLGlCQUFhLENBQWJBO0FBRUg7QUFqQkREOztBQWtCQUEsV0FBVyxDQUFYQSxnQ0FBNEMsMEJBQTBCO0FBQ3BFSyxNQUFJLEdBQUd6RCxNQUFNLENBQWJ5RCxJQUFhLENBQWJBO0FBQ0EsTUFBSXBGLFNBQVMsR0FBRyxLQUFoQjtBQUNBLE1BQUlnRixhQUFhLEdBQUdoRixTQUFTLENBQTdCLElBQTZCLENBQTdCOztBQUNBLE1BQUlnRixhQUFhLElBQWpCLFdBQWdDO0FBQzlCLFFBQUlNLFFBQVEsR0FBWjs7QUFDQSxTQUFLLElBQUkvRSxDQUFDLEdBQVYsR0FBZ0JBLENBQUMsR0FBR3lFLGFBQWEsQ0FBakMsUUFBMEN6RSxDQUFDLElBQTNDLEdBQWtEO0FBQ2hELFVBQUl5RSxhQUFhLENBQWJBLENBQWEsQ0FBYkEsS0FBSixVQUFtQztBQUNqQ00sZ0JBQVEsQ0FBUkEsS0FBY04sYUFBYSxDQUEzQk0sQ0FBMkIsQ0FBM0JBO0FBRUg7QUFDRDs7QUFBQSxRQUFJQSxRQUFRLENBQVJBLFdBQUosR0FBMkI7QUFDekIsYUFBT3RGLFNBQVMsQ0FBaEIsSUFBZ0IsQ0FBaEI7QUFERixXQUVPO0FBQ0xBLGVBQVMsQ0FBVEEsSUFBUyxDQUFUQTtBQUVIO0FBQ0Y7QUFqQkQrRTs7QUFtQkEscUJBQXFCO0FBQ25CO0FBQ0E7QUFHRjs7TUFMQSxLOztBQUtBLHFDQUFxQztBQUNuQ1EsT0FBSyxDQUFMQTtBQUNBLGNBQVl0RixPQUFPLENBQW5CO0FBQ0EscUJBQW1CQSxPQUFPLENBQTFCO0FBR0Z1Rjs7TUFOQSxZO0FBTUFBLFlBQVksQ0FBWkEsWUFBeUJqRyxNQUFNLENBQU5BLE9BQWNnRyxLQUFLLENBQTVDQyxTQUF5QmpHLENBQXpCaUc7O0FBRUEsd0NBQXdDO0FBQ3RDRCxPQUFLLENBQUxBO0FBQ0EsZ0JBQWN0RixPQUFPLENBQXJCO0FBQ0Esb0JBQWtCQSxPQUFPLENBQXpCO0FBQ0EsaUJBQWVBLE9BQU8sQ0FBdEI7QUFHRndGOztPQVBBLGU7QUFPQUEsZUFBZSxDQUFmQSxZQUE0QmxHLE1BQU0sQ0FBTkEsT0FBY2dHLEtBQUssQ0FBL0NFLFNBQTRCbEcsQ0FBNUJrRztBQUVBLElBQUlDLE9BQU8sR0FBRyxDQUFkO0FBQ0EsSUFBSUMsVUFBVSxHQUFkO0FBQ0EsSUFBSUMsSUFBSSxHQUFSO0FBQ0EsSUFBSUMsTUFBTSxHQUFWO0FBRUEsSUFBSUMsUUFBUSxHQUFHLENBQWY7QUFDQSxJQUFJQyxXQUFXLEdBQWY7QUFDQSxJQUFJQyxLQUFLLEdBQVQ7QUFDQSxJQUFJQyxXQUFXLEdBQWY7QUFDQSxJQUFJQyxLQUFLLEdBQVQ7QUFFQSxJQUFJQyxpQkFBaUIsR0FBckI7QUFFQSxJQUFJQyxnQkFBZ0IsR0FBcEI7QUFDQSxJQUFJQyxnQkFBZ0IsR0FBcEI7O0FBRUEsSUFBSUMsYUFBYSxHQUFiQSx1QkFBZ0IsS0FBaEJBLEVBQWdCLEdBQWhCQSxFQUFzQztBQUN4QyxNQUFJQyxDQUFDLEdBQUdDLFFBQVEsUUFBaEIsRUFBZ0IsQ0FBaEI7O0FBQ0EsTUFBSUQsQ0FBQyxLQUFMLEdBQWE7QUFDWEEsS0FBQyxHQUFEQTtBQUVGOztBQUFBLFNBQU9FLGFBQWEsQ0FBcEIsQ0FBb0IsQ0FBcEI7QUFMRjs7QUFPQSxJQUFJQSxhQUFhLEdBQWJBLHVCQUFnQixDQUFoQkEsRUFBNkI7QUFDL0IsU0FBT0MsSUFBSSxDQUFKQSxJQUFTQSxJQUFJLENBQUpBLE9BQVRBLGdCQUFTQSxDQUFUQSxFQUFQLGdCQUFPQSxDQUFQO0FBREY7O0FBSUEsSUFBSUMsSUFBSSxHQUFKQSxjQUFPLElBQVBBLEVBQU8sQ0FBUEEsRUFBTyxLQUFQQSxFQUFpQztBQUNuQyxNQUFJO0FBQ0YsUUFBSSxhQUFKLFlBQTZCO0FBQzNCQyxPQUFDLENBQURBO0FBRUg7QUFBQyxHQUpGLENBSUUsVUFBVTtBQUNWekIsY0FBVSxDQUFWQSxDQUFVLENBQVZBO0FBRUg7QUFSRDs7QUFVQSwyQ0FBMkM7QUFDekNKLGFBQVcsQ0FBWEE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOEIsT0FBSyxZQUFMQSxPQUFLLENBQUxBO0FBR0Y7O09BaEJBLG1CO0FBZ0JBLElBQUlDLGdCQUFnQixHQUNsQjlILEtBQUssSUFBTEEsYUFBc0I4QixRQUFRLElBQTlCOUIsYUFBK0MsVUFBVThCLFFBQVEsQ0FEbkU7O0FBR0EsaUNBQWlDO0FBQy9CZ0MsS0FBRyxHQUFHbkIsTUFBTSxDQUFabUIsR0FBWSxDQUFaQTtBQUNBLE1BQUl3QixlQUFlLEdBQUdyRSxPQUFPLElBQVBBLGFBQXdCOEcsT0FBTyxDQUFDOUcsT0FBTyxDQUE3RCxlQUFxRCxDQUFyRDtBQUVBLE1BQUkrRyxZQUFZLEdBQUdQLGFBQWEsQ0FBaEMsSUFBZ0MsQ0FBaEM7QUFDQSxNQUFJUSxnQkFBZ0IsR0FDbEJoSCxPQUFPLElBQVBBLGFBQXdCQSxPQUFPLENBQVBBLG9CQUF4QkEsWUFDSXFHLGFBQWEsQ0FBQ3JHLE9BQU8sQ0FBUixrQkFEakJBLEtBQ2lCLENBRGpCQSxHQUVJd0csYUFBYSxDQUhuQixLQUdtQixDQUhuQjtBQUtBLE1BQUlTLFdBQVcsR0FBZjtBQUNBLE1BQUlDLEtBQUssR0FBVDtBQUNBLE1BQUlDLFdBQVcsR0FBZjtBQUNBLE1BQUl0RCxPQUFPLEdBQ1Q3RCxPQUFPLElBQVBBLGFBQXdCQSxPQUFPLENBQVBBLFdBQXhCQSxZQUNJMUIsSUFBSSxDQUFKQSxNQUFXQSxJQUFJLENBQUpBLFVBQWUwQixPQUFPLENBRHJDQSxPQUNlMUIsQ0FBWEEsQ0FESjBCLEdBREY7QUFJQSxNQUFJb0gsZ0JBQWdCLEdBQ2xCcEgsT0FBTyxJQUFQQSxhQUF3QkEsT0FBTyxDQUFQQSxhQUF4QkEsWUFDSUEsT0FBTyxDQURYQSxZQURGO0FBSUEsTUFBSStCLEdBQUcsR0FDTDhFLGdCQUFnQixJQUNoQixFQUFFN0csT0FBTyxJQUFQQSxhQUF3QkEsT0FBTyxDQUFQQSxhQUQxQjZHLFNBQ0EsQ0FEQUEsZUFHSSxlQUFlLElBSnJCLGdCQUlxQixFQUFmLENBSk47QUFLQSxNQUFJUSxTQUFTLEdBQUd0RixHQUFHLElBQUhBLFlBQW1CLElBQW5CQSxjQUFtQixFQUFuQkEsR0FBMEMsSUFBMUQsWUFBMEQsRUFBMUQ7QUFDQSxNQUFJdUYsY0FBYyxHQUFsQjtBQUNBLE1BQUlyRixPQUFPLEdBQVg7QUFDQSxNQUFJc0YsWUFBWSxHQUFoQjtBQUNBLE1BQUlDLFVBQVUsR0FBZDtBQUNBLE1BQUlDLGlCQUFpQixHQUFyQjtBQUNBLE1BQUlDLGVBQWUsR0FBbkI7QUFFQSxNQUFJQyxVQUFVLEdBQWQ7QUFDQSxNQUFJM0YsS0FBSyxHQUFUO0FBQ0EsTUFBSTRGLFVBQVUsR0FBZDtBQUNBLE1BQUlDLFVBQVUsR0FBZDs7QUFFQSxNQUFJMUYsT0FBTyxHQUFQQSxpQkFBVSxNQUFWQSxFQUFVLFVBQVZBLEVBQVUsV0FBVkEsRUFBVSxPQUFWQSxFQUFVLE1BQVZBLEVBQXNFO0FBQ3hFLFFBQUlvRixZQUFZLEtBQWhCLFlBQWlDO0FBQy9CRCxvQkFBYyxHQUFkQTs7QUFDQSxVQUNFbEYsTUFBTSxLQUFOQSxPQUNBRSxXQUFXLElBRFhGLGFBRUE4RCxpQkFBaUIsQ0FBakJBLEtBSEYsV0FHRUEsQ0FIRixFQUlFO0FBQ0FxQixvQkFBWSxHQUFaQTtBQUNBSixtQkFBVyxHQUFYQTtBQUNBRCxhQUFLLEdBQUxBO0FBQ0FZLFVBQUUsQ0FBRkE7QUFDQSxZQUFJcEksS0FBSyxHQUFHLDRCQUE0QjtBQUN0QzBDLGdCQUFNLEVBRGdDO0FBRXRDQyxvQkFBVSxFQUY0QjtBQUd0Q3dCLGlCQUFPLEVBSFQ7QUFBd0MsU0FBNUIsQ0FBWjtBQUtBaUUsVUFBRSxDQUFGQTtBQUNBcEIsWUFBSSxLQUFLb0IsRUFBRSxDQUFQLFFBQUpwQixLQUFJLENBQUpBO0FBZkYsYUFnQk87QUFDTCxZQUFJL0csT0FBTyxHQUFYOztBQUNBLFlBQUl5QyxNQUFNLEtBQVYsS0FBb0I7QUFDbEIsMEJBQWdCO0FBQ2RDLHNCQUFVLEdBQUdBLFVBQVUsQ0FBVkEsZ0JBQWJBLEdBQWFBLENBQWJBO0FBRUYxQzs7QUFBQUEsaUJBQU8sR0FDTCxxRUFERkE7QUFKRixlQVVPO0FBQ0xBLGlCQUFPLEdBQ0wsZ0ZBQ0MyQyxXQUFXLElBQVhBLGtCQUVHQSxXQUFXLENBQVhBLGdCQUhKLEdBR0lBLENBSEosSUFERjNDO0FBT0Z1Rjs7QUFBQUEsa0JBQVUsQ0FBQyxVQUFYQSxPQUFXLENBQUQsQ0FBVkE7QUFDQXhFLGFBQUs7QUFDTCxZQUFJaEIsS0FBSyxHQUFHLDZCQUE2QjtBQUN2QzBDLGdCQUFNLEVBRGlDO0FBRXZDQyxvQkFBVSxFQUY2QjtBQUd2Q3dCLGlCQUFPLEVBSFQ7QUFBeUMsU0FBN0IsQ0FBWjtBQUtBaUUsVUFBRSxDQUFGQTtBQUNBcEIsWUFBSSxLQUFLb0IsRUFBRSxDQUFQLFNBQUpwQixLQUFJLENBQUpBO0FBRUg7QUFDRjtBQWxERDs7QUFvREEsTUFBSW5FLFVBQVUsR0FBVkEsb0JBQWEsU0FBYkEsRUFBa0M7QUFDcEMsUUFBSWdGLFlBQVksS0FBaEIsTUFBMkI7QUFDekIsVUFBSWpCLENBQUMsR0FBRyxDQUFSOztBQUNBLFdBQUssSUFBSWhHLENBQUMsR0FBVixHQUFnQkEsQ0FBQyxHQUFHeUgsU0FBUyxDQUE3QixRQUFzQ3pILENBQUMsSUFBdkMsR0FBOEM7QUFDNUMsWUFBSTBDLENBQUMsR0FBRytFLFNBQVMsQ0FBVEEsV0FBUixDQUFRQSxDQUFSOztBQUNBLFlBQUkvRSxDQUFDLEtBQUssZ0JBQU5BLENBQU0sQ0FBTkEsSUFBNEJBLENBQUMsS0FBSyxnQkFBdEMsQ0FBc0MsQ0FBdEMsRUFBMEQ7QUFDeERzRCxXQUFDLEdBQURBO0FBRUg7QUFDRDs7QUFBQSxVQUFJM0MsS0FBSyxHQUFHLENBQUMyQyxDQUFDLEtBQUssQ0FBTkEsaUJBQUQsTUFBK0J5QixTQUFTLENBQVRBLFNBQW1CekIsQ0FBQyxHQUEvRCxDQUEyQ3lCLENBQTNDO0FBQ0FKLGdCQUFVLEdBQUcsQ0FBQ3JCLENBQUMsS0FBSyxDQUFOQSxpQkFBRCxNQUErQnlCLFNBQVMsQ0FBVEEsTUFBZ0J6QixDQUFDLEdBQTdEcUIsQ0FBNENJLENBQTVDSjs7QUFDQSxVQUFJaEUsS0FBSyxLQUFULElBQWtCO0FBQ2hCd0QsbUJBQVcsR0FBWEE7QUFFRjs7QUFBQSxXQUFLLElBQUlhLFFBQVEsR0FBakIsR0FBdUJBLFFBQVEsR0FBR3JFLEtBQUssQ0FBdkMsUUFBZ0RxRSxRQUFRLElBQXhELEdBQStEO0FBQzdELFlBQUloRixDQUFDLEdBQUdXLEtBQUssQ0FBTEEsV0FBUixRQUFRQSxDQUFSOztBQUNBLFlBQUkzQixLQUFLLEtBQUxBLFlBQXNCZ0IsQ0FBQyxLQUFLLGdCQUFoQyxDQUFnQyxDQUFoQyxFQUFvRDtBQUNsRGhCLGVBQUssR0FBTEE7QUFERixlQUVPO0FBQ0wsY0FBSUEsS0FBSyxLQUFULFVBQXdCO0FBQ3RCQSxpQkFBSyxHQUFMQTtBQUVGOztBQUFBLGNBQUlnQixDQUFDLEtBQUssZ0JBQU5BLENBQU0sQ0FBTkEsSUFBNEJBLENBQUMsS0FBSyxnQkFBdEMsQ0FBc0MsQ0FBdEMsRUFBMEQ7QUFDeEQsZ0JBQUloQixLQUFLLEtBQVQsYUFBMkI7QUFDekIsa0JBQUlBLEtBQUssS0FBVCxPQUFxQjtBQUNuQjZGLDBCQUFVLEdBQUdHLFFBQVEsR0FBckJIO0FBRUY7O0FBQUEsa0JBQUlJLEtBQUssR0FBR3RFLEtBQUssQ0FBTEEsa0JBQXdCa0UsVUFBVSxHQUE5QyxDQUFZbEUsQ0FBWjtBQUNBLGtCQUFJTCxLQUFLLEdBQUdLLEtBQUssQ0FBTEEsTUFDVmtFLFVBQVUsSUFDUEEsVUFBVSxHQUFWQSxZQUNEbEUsS0FBSyxDQUFMQSwyQkFBaUMsZUFEaENrRSxDQUNnQyxDQURoQ0EsT0FGT2xFLENBQ0EsQ0FEQUEsRUFBWixRQUFZQSxDQUFaOztBQVFBLGtCQUFJc0UsS0FBSyxLQUFULFFBQXNCO0FBQ3BCVCwwQkFBVSxJQUFWQTtBQUNBQSwwQkFBVSxJQUFWQTtBQUZGLHFCQUdPLElBQUlTLEtBQUssS0FBVCxNQUFvQjtBQUN6QlIsaUNBQWlCLEdBQWpCQTtBQURLLHFCQUVBLElBQUlRLEtBQUssS0FBVCxTQUF1QjtBQUM1QlAsK0JBQWUsR0FBZkE7QUFESyxxQkFFQSxJQUFJTyxLQUFLLEtBQVQsU0FBdUI7QUFDNUJsQiw0QkFBWSxHQUFHVixhQUFhLFFBQTVCVSxZQUE0QixDQUE1QkE7QUFDQUcscUJBQUssR0FBTEE7QUFGSyxxQkFHQSxJQUFJZSxLQUFLLEtBQVQsb0JBQWtDO0FBQ3ZDakIsZ0NBQWdCLEdBQUdYLGFBQWEsUUFBaENXLGdCQUFnQyxDQUFoQ0E7O0FBQ0Esb0JBQUkvRSxPQUFPLEtBQVgsR0FBbUI7QUFDakJDLDhCQUFZLENBQVpBLE9BQVksQ0FBWkE7QUFDQUQseUJBQU8sR0FBR3hCLFVBQVUsQ0FBQyxZQUFZO0FBQy9Ca0MsNkJBQVM7QUFEUyxxQkFBcEJWLGdCQUFvQixDQUFwQkE7QUFJSDtBQUNGO0FBQ0Q7O0FBQUEsZ0JBQUlELEtBQUssS0FBVCxhQUEyQjtBQUN6QixrQkFBSXdGLFVBQVUsS0FBZCxJQUF1QjtBQUNyQlAsMkJBQVcsR0FBWEE7O0FBQ0Esb0JBQUlTLGVBQWUsS0FBbkIsSUFBNEI7QUFDMUJBLGlDQUFlLEdBQWZBO0FBRUY7O0FBQUEsb0JBQUloSSxLQUFLLEdBQUcsa0NBQWtDO0FBQzVDckIsc0JBQUksRUFBRW1KLFVBQVUsQ0FBVkEsTUFEc0MsQ0FDdENBLENBRHNDO0FBRTVDUCw2QkFBVyxFQUZiO0FBQThDLGlCQUFsQyxDQUFaO0FBSUFhLGtCQUFFLENBQUZBOztBQUNBLG9CQUFJSixlQUFlLEtBQW5CLFdBQW1DO0FBQ2pDaEIsc0JBQUksS0FBS29CLEVBQUUsQ0FBUCxXQUFKcEIsS0FBSSxDQUFKQTtBQUVGOztBQUFBLG9CQUFJYSxZQUFZLEtBQWhCLFFBQTZCO0FBQzNCO0FBRUg7QUFDREM7O0FBQUFBLHdCQUFVLEdBQVZBO0FBQ0FFLDZCQUFlLEdBQWZBO0FBRUYxRjs7QUFBQUEsaUJBQUssR0FBR2dCLENBQUMsS0FBSyxnQkFBTkEsQ0FBTSxDQUFOQSxjQUFSaEI7QUF2REYsaUJBd0RPO0FBQ0wsZ0JBQUlBLEtBQUssS0FBVCxhQUEyQjtBQUN6QjRGLHdCQUFVLEdBQVZBO0FBQ0E1RixtQkFBSyxHQUFMQTtBQUVGOztBQUFBLGdCQUFJQSxLQUFLLEtBQVQsT0FBcUI7QUFDbkIsa0JBQUlnQixDQUFDLEtBQUssZUFBVixDQUFVLENBQVYsRUFBNkI7QUFDM0I2RSwwQkFBVSxHQUFHRyxRQUFRLEdBQXJCSDtBQUNBN0YscUJBQUssR0FBTEE7QUFFSDtBQUxELG1CQUtPLElBQUlBLEtBQUssS0FBVCxhQUEyQjtBQUNoQ0EsbUJBQUssR0FBTEE7QUFFSDtBQUNGO0FBQ0Y7QUFDRjtBQUNGO0FBL0ZEOztBQWlHQSxNQUFJUyxRQUFRLEdBQVJBLG9CQUF1QjtBQUN6QixRQUFJOEUsWUFBWSxLQUFaQSxRQUF5QkEsWUFBWSxLQUF6QyxZQUEwRDtBQUN4REEsa0JBQVksR0FBWkE7O0FBQ0EsVUFBSXRGLE9BQU8sS0FBWCxHQUFtQjtBQUNqQkMsb0JBQVksQ0FBWkEsT0FBWSxDQUFaQTtBQUNBRCxlQUFPLEdBQVBBO0FBRUZBOztBQUFBQSxhQUFPLEdBQUd4QixVQUFVLENBQUMsWUFBWTtBQUMvQmtDLGlCQUFTO0FBRFMsU0FBcEJWLEtBQW9CLENBQXBCQTtBQUdBaUYsV0FBSyxHQUFHVixhQUFhLENBQUNDLElBQUksQ0FBSkEsSUFBU00sWUFBWSxHQUFyQk4sSUFBNEJTLEtBQUssR0FBdkRBLENBQXNCVCxDQUFELENBQXJCUztBQUVBWSxRQUFFLENBQUZBO0FBQ0EsVUFBSXBJLEtBQUssR0FBRyxVQUFaLE9BQVksQ0FBWjtBQUNBb0ksUUFBRSxDQUFGQTtBQUNBcEIsVUFBSSxLQUFLb0IsRUFBRSxDQUFQLFNBQUpwQixLQUFJLENBQUpBO0FBRUg7QUFqQkQ7O0FBbUJBLE1BQUloRyxLQUFLLEdBQUxBLGlCQUFvQjtBQUN0QjZHLGdCQUFZLEdBQVpBOztBQUNBLFFBQUlELGNBQWMsSUFBbEIsV0FBaUM7QUFDL0JBLG9CQUFjO0FBQ2RBLG9CQUFjLEdBQWRBO0FBRUY7O0FBQUEsUUFBSXJGLE9BQU8sS0FBWCxHQUFtQjtBQUNqQkMsa0JBQVksQ0FBWkEsT0FBWSxDQUFaQTtBQUNBRCxhQUFPLEdBQVBBO0FBRUY2Rjs7QUFBQUEsTUFBRSxDQUFGQTtBQVZGOztBQWFBLE1BQUluRixTQUFTLEdBQVRBLHFCQUF3QjtBQUMxQlYsV0FBTyxHQUFQQTs7QUFFQSxRQUFJc0YsWUFBWSxLQUFoQixTQUE4QjtBQUM1QixVQUFJLGdCQUFnQkQsY0FBYyxJQUFsQyxXQUFpRDtBQUMvQ3BDLGtCQUFVLENBQ1IsVUFDRSwyQ0FGSkEsOEJBQ0UsQ0FEUSxDQUFWQTtBQU9Bb0Msc0JBQWM7QUFDZEEsc0JBQWMsR0FBZEE7QUFURixhQVVPO0FBQ0xILG1CQUFXLEdBQVhBO0FBQ0FsRixlQUFPLEdBQUd4QixVQUFVLENBQUMsWUFBWTtBQUMvQmtDLG1CQUFTO0FBRFMsV0FBcEJWLGdCQUFvQixDQUFwQkE7QUFJRjs7QUFBQTtBQUdGa0Y7O0FBQUFBLGVBQVcsR0FBWEE7QUFDQWxGLFdBQU8sR0FBR3hCLFVBQVUsQ0FBQyxZQUFZO0FBQy9Ca0MsZUFBUztBQURTLE9BQXBCVixnQkFBb0IsQ0FBcEJBO0FBSUFzRixnQkFBWSxHQUFaQTtBQUNBQyxjQUFVLEdBQVZBO0FBQ0FFLG1CQUFlLEdBQWZBO0FBQ0FELHFCQUFpQixHQUFqQkE7QUFDQUUsY0FBVSxHQUFWQTtBQUNBQyxjQUFVLEdBQVZBO0FBQ0FDLGNBQVUsR0FBVkE7QUFDQTdGLFNBQUssR0FBTEEsWUFuQzBCLENBcUMxQjtBQUNBOztBQUNBLFFBQUlrRyxVQUFVLEdBQWQ7O0FBQ0EsUUFBSXJGLEdBQUcsQ0FBSEEsMkJBQStCQSxHQUFHLENBQUhBLGdCQUFuQyxTQUFnRTtBQUM5RCxVQUFJb0UsV0FBVyxLQUFmLElBQXdCO0FBQ3RCaUIsa0JBQVUsSUFDUixDQUFDckYsR0FBRyxDQUFIQSxpQkFBcUIsQ0FBckJBLFVBQUQsd0JBRUFzRixrQkFBa0IsQ0FIcEJELFdBR29CLENBSHBCQTtBQUtIO0FBQ0Q7O0FBQUEsUUFBSUUsY0FBYyxHQUFsQjtBQUNBQSxrQkFBYyxDQUFkQSxRQUFjLENBQWRBOztBQUNBLFFBQUl2RSxPQUFPLElBQVgsV0FBMEI7QUFDeEIsV0FBSyxJQUFMLGlCQUEwQjtBQUN4QixZQUFJdkUsTUFBTSxDQUFOQSx1Q0FBSixJQUFJQSxDQUFKLEVBQXlEO0FBQ3ZEOEksd0JBQWMsQ0FBZEEsSUFBYyxDQUFkQSxHQUF1QnZFLE9BQU8sQ0FBOUJ1RSxJQUE4QixDQUE5QkE7QUFFSDtBQUNGO0FBQ0Q7O0FBQUEsUUFBSTtBQUNGZixlQUFTLENBQVRBO0FBU0EsS0FWRixDQVVFLGNBQWM7QUFDZDNHLFdBQUs7QUFDTDtBQUVIO0FBdkVEOztBQXlFQW9ILElBQUUsQ0FBRkE7QUFDQUEsSUFBRSxDQUFGQTtBQUNBQSxJQUFFLENBQUZBO0FBQ0FBLElBQUUsQ0FBRkE7QUFFQW5GLFdBQVM7QUFHWHZFOztBQUFBQSxtQkFBbUIsQ0FBbkJBLFlBQWdDa0IsTUFBTSxDQUFOQSxPQUFjd0YsV0FBVyxDQUF6RDFHLFNBQWdDa0IsQ0FBaENsQjtBQUNBQSxtQkFBbUIsQ0FBbkJBO0FBQ0FBLG1CQUFtQixDQUFuQkE7QUFDQUEsbUJBQW1CLENBQW5CQTs7QUFDQUEsbUJBQW1CLENBQW5CQSxrQkFBc0MsWUFBWTtBQUNoRDtBQURGQTs7QUFJQUEsbUJBQW1CLENBQW5CQTtBQUNBQSxtQkFBbUIsQ0FBbkJBO0FBQ0FBLG1CQUFtQixDQUFuQkE7QUFDQUEsbUJBQW1CLENBQW5CQTtlQUVlQSxtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O3lDQ244QmY7QUFDQTtBQUNBOztBQUNPLGtDQUFrQztBQUN2QztBQUFDLEdBQUNELE1BQU0sQ0FBTkEseUJBQUQsWUFBNkMsWUFBWTtBQUN4RCxTQUNFLElBQUlrSyxDQUFDLEdBQUc5SixRQUFRLENBQVJBLGlCQUFSLHVCQUFRQSxDQUFSLEVBQTREK0IsQ0FBQyxHQUFHK0gsQ0FBQyxDQURuRSxRQUVFL0gsQ0FGRixLQUlFO0FBQ0ErSCxPQUFDLENBQURBLENBQUMsQ0FBREEsd0JBQTRCQSxDQUFDLENBQTdCQSxDQUE2QixDQUE3QkE7QUFFRjs7QUFBQSxrQkFBYztBQUNaQyxjQUFRO0FBRVg7QUFYQTtBQVlGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDZkQ7QUFEQTs7O0FBR0E7QUFDTzs7O0FBRUEscUJBQXFCO0FBQzFCLGlCQUFlQyxTQUFTLENBQVRBO0FBQ2ZBLFdBQVMsR0FBVEE7QUFHSzs7QUFBQSxtREFBbUQ7QUFDeEQsTUFBTUMsUUFBUSxHQUFHQyxVQUFqQixHQUR3RCxDQUd4RDs7QUFDQSxNQUFJRCxRQUFRLEtBQVJBLGVBQTRCLENBQWhDLE9BQXdDO0FBQ3hDLG1DQUFXLEdBQVgsU0FMd0QsQ0FNeEQ7O0FBQ0FFLFdBQVM7QUFFVCxNQUFNN0YsR0FBRyxhQUFNckUsV0FBTixxQ0FBVCxXQUFTLENBQVQ7QUFDQStKLFdBQVMsR0FBRyx3Q0FBc0I7QUFBRTlJLFFBQUksRUFBTjtBQUFhd0MsV0FBTyxFQUFwQjtBQUE0QjBHLFlBQVEsRUFBdEVKO0FBQWtDLEdBQXRCLENBQVpBO0FBRUFBLFdBQVMsQ0FBVEEsbUJBQThCN0ksZUFBRCxFQUFXO0FBQ3RDLFFBQUlBLEtBQUssQ0FBTEEsc0JBQTRCLENBQWhDLEdBQW9DOztBQUNwQyxRQUFJO0FBQ0YsVUFBTWtKLE9BQU8sR0FBR3RLLElBQUksQ0FBSkEsTUFBV29CLEtBQUssQ0FBaEMsSUFBZ0JwQixDQUFoQjs7QUFDQSxVQUFJc0ssT0FBTyxDQUFYLFNBQXFCO0FBQ25CO0FBQ0E7QUFDQTdKLGFBQUssQ0FBQzhKLFFBQVEsQ0FBVCxNQUFnQjtBQUNuQnpFLHFCQUFXLEVBRGJyRjtBQUFxQixTQUFoQixDQUFMQSxNQUVTK0osaUJBQUQsRUFBYTtBQUNuQixjQUFJQSxPQUFPLENBQVBBLFdBQUosS0FBNEI7QUFDMUJELG9CQUFRLENBQVJBO0FBRUg7QUFORDlKO0FBUUg7QUFBQyxLQWJGLENBYUUsWUFBWTtBQUNaUyxhQUFPLENBQVBBO0FBRUg7QUFsQkQrSTtBQW1CRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxQ0Q7QUFDQSxzQkFBc0I7QUFDdEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7OztBQUdBLE9BQU87O0FBRVAsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLEM7Ozs7Ozs7Ozs7OztBQ3pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxLQUFLO0FBQ0wsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUNBQWlDLGtCQUFrQjtBQUNuRDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUJBQWlCOztBQUVqQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7O0FBRUE7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLDhDQUE4QyxRQUFRO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxLQUEwQixvQkFBb0IsU0FBRTtBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoic3RhdGljL2NodW5rcy9hbXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXN5bmNUb0dlbmVyYXRvcjsiLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgIFwiZGVmYXVsdFwiOiBvYmpcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCIvKiBnbG9iYWxzIF9fd2VicGFja19oYXNoX18gKi9cbmltcG9ydCBFdmVudFNvdXJjZVBvbHlmaWxsIGZyb20gJy4vZXZlbnQtc291cmNlLXBvbHlmaWxsJ1xuaW1wb3J0IHsgZ2V0RXZlbnRTb3VyY2VXcmFwcGVyIH0gZnJvbSAnLi9lcnJvci1vdmVybGF5L2V2ZW50c291cmNlJ1xuaW1wb3J0IHsgc2V0dXBQaW5nIH0gZnJvbSAnLi9vbi1kZW1hbmQtZW50cmllcy11dGlscydcbmltcG9ydCB7IGRpc3BsYXlDb250ZW50IH0gZnJvbSAnLi9mb3VjJ1xuXG5pZiAoIXdpbmRvdy5FdmVudFNvdXJjZSkge1xuICB3aW5kb3cuRXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZVBvbHlmaWxsXG59XG5cbmNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdfX05FWFRfREFUQV9fJykudGV4dENvbnRlbnQpXG5sZXQgeyBhc3NldFByZWZpeCwgcGFnZSB9ID0gZGF0YVxuYXNzZXRQcmVmaXggPSBhc3NldFByZWZpeCB8fCAnJ1xubGV0IG1vc3RSZWNlbnRIYXNoID0gbnVsbFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG5sZXQgY3VySGFzaCA9IF9fd2VicGFja19oYXNoX19cbmNvbnN0IGhvdFVwZGF0ZVBhdGggPVxuICBhc3NldFByZWZpeCArIChhc3NldFByZWZpeC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICsgJ19uZXh0L3N0YXRpYy93ZWJwYWNrLydcblxuLy8gSXMgdGhlcmUgYSBuZXdlciB2ZXJzaW9uIG9mIHRoaXMgY29kZSBhdmFpbGFibGU/XG5mdW5jdGlvbiBpc1VwZGF0ZUF2YWlsYWJsZSgpIHtcbiAgLy8gX193ZWJwYWNrX2hhc2hfXyBpcyB0aGUgaGFzaCBvZiB0aGUgY3VycmVudCBjb21waWxhdGlvbi5cbiAgLy8gSXQncyBhIGdsb2JhbCB2YXJpYWJsZSBpbmplY3RlZCBieSBXZWJwYWNrLlxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcmV0dXJuIG1vc3RSZWNlbnRIYXNoICE9PSBfX3dlYnBhY2tfaGFzaF9fXG59XG5cbi8vIFdlYnBhY2sgZGlzYWxsb3dzIHVwZGF0ZXMgaW4gb3RoZXIgc3RhdGVzLlxuZnVuY3Rpb24gY2FuQXBwbHlVcGRhdGVzKCkge1xuICByZXR1cm4gbW9kdWxlLmhvdC5zdGF0dXMoKSA9PT0gJ2lkbGUnXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gcmVhZHMgY29kZSB1cGRhdGVzIG9uIHRoZSBmbHkgYW5kIGhhcmRcbi8vIHJlbG9hZHMgdGhlIHBhZ2Ugd2hlbiBpdCBoYXMgY2hhbmdlZC5cbmFzeW5jIGZ1bmN0aW9uIHRyeUFwcGx5VXBkYXRlcygpIHtcbiAgaWYgKCFpc1VwZGF0ZUF2YWlsYWJsZSgpIHx8ICFjYW5BcHBseVVwZGF0ZXMoKSkge1xuICAgIHJldHVyblxuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7aG90VXBkYXRlUGF0aH0ke2N1ckhhc2h9LmhvdC11cGRhdGUuanNvbmApXG4gICAgY29uc3QganNvbkRhdGEgPSBhd2FpdCByZXMuanNvbigpXG4gICAgY29uc3QgY3VyUGFnZSA9IHBhZ2UgPT09ICcvJyA/ICdpbmRleCcgOiBwYWdlXG4gICAgLy8gd2VicGFjayA1IHVzZXMgYW4gYXJyYXkgaW5zdGVhZFxuICAgIGNvbnN0IHBhZ2VVcGRhdGVkID0gKEFycmF5LmlzQXJyYXkoanNvbkRhdGEuYylcbiAgICAgID8ganNvbkRhdGEuY1xuICAgICAgOiBPYmplY3Qua2V5cyhqc29uRGF0YS5jKVxuICAgICkuc29tZSgobW9kKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBtb2QuaW5kZXhPZihcbiAgICAgICAgICBgcGFnZXMke2N1clBhZ2Uuc3Vic3RyKDAsIDEpID09PSAnLycgPyBjdXJQYWdlIDogYC8ke2N1clBhZ2V9YH1gXG4gICAgICAgICkgIT09IC0xIHx8XG4gICAgICAgIG1vZC5pbmRleE9mKFxuICAgICAgICAgIGBwYWdlcyR7XG4gICAgICAgICAgICBjdXJQYWdlLnN1YnN0cigwLCAxKSA9PT0gJy8nID8gY3VyUGFnZSA6IGAvJHtjdXJQYWdlfWBcbiAgICAgICAgICB9YC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwnKVxuICAgICAgICApICE9PSAtMVxuICAgICAgKVxuICAgIH0pXG5cbiAgICBpZiAocGFnZVVwZGF0ZWQpIHtcbiAgICAgIGRvY3VtZW50LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjdXJIYXNoID0gbW9zdFJlY2VudEhhc2hcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIG9jY3VycmVkIGNoZWNraW5nIGZvciB1cGRhdGUnLCBlcnIpXG4gICAgZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gIH1cbn1cblxuZ2V0RXZlbnRTb3VyY2VXcmFwcGVyKHtcbiAgcGF0aDogYCR7YXNzZXRQcmVmaXh9L19uZXh0L3dlYnBhY2staG1yYCxcbn0pLmFkZE1lc3NhZ2VMaXN0ZW5lcigoZXZlbnQpID0+IHtcbiAgaWYgKGV2ZW50LmRhdGEgPT09ICdcXHVEODNEXFx1REM5MycpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlcblxuICAgIGlmIChtZXNzYWdlLmFjdGlvbiA9PT0gJ3N5bmMnIHx8IG1lc3NhZ2UuYWN0aW9uID09PSAnYnVpbHQnKSB7XG4gICAgICBpZiAoIW1lc3NhZ2UuaGFzaCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIG1vc3RSZWNlbnRIYXNoID0gbWVzc2FnZS5oYXNoXG4gICAgICB0cnlBcHBseVVwZGF0ZXMoKVxuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5hY3Rpb24gPT09ICdyZWxvYWRQYWdlJykge1xuICAgICAgZG9jdW1lbnQubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgfVxuICB9IGNhdGNoIChleCkge1xuICAgIGNvbnNvbGUud2FybignSW52YWxpZCBITVIgbWVzc2FnZTogJyArIGV2ZW50LmRhdGEgKyAnXFxuJyArIGV4KVxuICB9XG59KVxuXG5zZXR1cFBpbmcoYXNzZXRQcmVmaXgsICgpID0+IHBhZ2UpXG5kaXNwbGF5Q29udGVudCgpXG4iLCJjb25zdCBldmVudENhbGxiYWNrcyA9IFtdXG5cbmZ1bmN0aW9uIEV2ZW50U291cmNlV3JhcHBlcihvcHRpb25zKSB7XG4gIHZhciBzb3VyY2VcbiAgdmFyIGxhc3RBY3Rpdml0eSA9IG5ldyBEYXRlKClcbiAgdmFyIGxpc3RlbmVycyA9IFtdXG5cbiAgaWYgKCFvcHRpb25zLnRpbWVvdXQpIHtcbiAgICBvcHRpb25zLnRpbWVvdXQgPSAyMCAqIDEwMDBcbiAgfVxuXG4gIGluaXQoKVxuICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG5ldyBEYXRlKCkgLSBsYXN0QWN0aXZpdHkgPiBvcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgIGhhbmRsZURpc2Nvbm5lY3QoKVxuICAgIH1cbiAgfSwgb3B0aW9ucy50aW1lb3V0IC8gMilcblxuICBmdW5jdGlvbiBpbml0KCkge1xuICAgIHNvdXJjZSA9IG5ldyB3aW5kb3cuRXZlbnRTb3VyY2Uob3B0aW9ucy5wYXRoKVxuICAgIHNvdXJjZS5vbm9wZW4gPSBoYW5kbGVPbmxpbmVcbiAgICBzb3VyY2Uub25lcnJvciA9IGhhbmRsZURpc2Nvbm5lY3RcbiAgICBzb3VyY2Uub25tZXNzYWdlID0gaGFuZGxlTWVzc2FnZVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlT25saW5lKCkge1xuICAgIGlmIChvcHRpb25zLmxvZykgY29uc29sZS5sb2coJ1tITVJdIGNvbm5lY3RlZCcpXG4gICAgbGFzdEFjdGl2aXR5ID0gbmV3IERhdGUoKVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShldmVudCkge1xuICAgIGxhc3RBY3Rpdml0eSA9IG5ldyBEYXRlKClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGlzdGVuZXJzW2ldKGV2ZW50KVxuICAgIH1cblxuICAgIGV2ZW50Q2FsbGJhY2tzLmZvckVhY2goKGNiKSA9PiB7XG4gICAgICBpZiAoIWNiLnVuZmlsdGVyZWQgJiYgZXZlbnQuZGF0YS5pbmRleE9mKCdhY3Rpb24nKSA9PT0gLTEpIHJldHVyblxuICAgICAgY2IoZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZURpc2Nvbm5lY3QoKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh0aW1lcilcbiAgICBzb3VyY2UuY2xvc2UoKVxuICAgIHNldFRpbWVvdXQoaW5pdCwgb3B0aW9ucy50aW1lb3V0KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcilcbiAgICAgIHNvdXJjZS5jbG9zZSgpXG4gICAgfSxcbiAgICBhZGRNZXNzYWdlTGlzdGVuZXI6IGZ1bmN0aW9uIChmbikge1xuICAgICAgbGlzdGVuZXJzLnB1c2goZm4pXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnRTb3VyY2VXcmFwcGVyKG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLm9uZGVtYW5kKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZE1lc3NhZ2VMaXN0ZW5lcjogKGNiKSA9PiB7XG4gICAgICAgIGV2ZW50Q2FsbGJhY2tzLnB1c2goY2IpXG4gICAgICB9LFxuICAgIH1cbiAgfVxuICByZXR1cm4gRXZlbnRTb3VyY2VXcmFwcGVyKG9wdGlvbnMpXG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gSW1wcm92ZWQgdmVyc2lvbiBvZiBodHRwczovL2dpdGh1Yi5jb20vWWFmZmxlL0V2ZW50U291cmNlL1xuLy8gQXZhaWxhYmxlIHVuZGVyIE1JVCBMaWNlbnNlIChNSVQpXG4vLyBPbmx5IHRyaWVzIHRvIHN1cHBvcnQgSUUxMSBhbmQgbm90aGluZyBiZWxvd1xudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50XG52YXIgUmVzcG9uc2UgPSB3aW5kb3cuUmVzcG9uc2VcbnZhciBUZXh0RGVjb2RlciA9IHdpbmRvdy5UZXh0RGVjb2RlclxudmFyIFRleHRFbmNvZGVyID0gd2luZG93LlRleHRFbmNvZGVyXG52YXIgQWJvcnRDb250cm9sbGVyID0gd2luZG93LkFib3J0Q29udHJvbGxlclxuXG5pZiAoQWJvcnRDb250cm9sbGVyID09IHVuZGVmaW5lZCkge1xuICBBYm9ydENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zaWduYWwgPSBudWxsXG4gICAgdGhpcy5hYm9ydCA9IGZ1bmN0aW9uICgpIHt9XG4gIH1cbn1cblxuZnVuY3Rpb24gVGV4dERlY29kZXJQb2x5ZmlsbCgpIHtcbiAgdGhpcy5iaXRzTmVlZGVkID0gMFxuICB0aGlzLmNvZGVQb2ludCA9IDBcbn1cblxuVGV4dERlY29kZXJQb2x5ZmlsbC5wcm90b3R5cGUuZGVjb2RlID0gZnVuY3Rpb24gKG9jdGV0cykge1xuICBmdW5jdGlvbiB2YWxpZChjb2RlUG9pbnQsIHNoaWZ0LCBvY3RldHNDb3VudCkge1xuICAgIGlmIChvY3RldHNDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweDAwODAgPj4gc2hpZnQgJiYgY29kZVBvaW50IDw8IHNoaWZ0IDw9IDB4MDdmZlxuICAgIH1cbiAgICBpZiAob2N0ZXRzQ291bnQgPT09IDIpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb2RlUG9pbnQgPj0gMHgwODAwID4+IHNoaWZ0ICYmIGNvZGVQb2ludCA8PCBzaGlmdCA8PSAweGQ3ZmYpIHx8XG4gICAgICAgIChjb2RlUG9pbnQgPj0gMHhlMDAwID4+IHNoaWZ0ICYmIGNvZGVQb2ludCA8PCBzaGlmdCA8PSAweGZmZmYpXG4gICAgICApXG4gICAgfVxuICAgIGlmIChvY3RldHNDb3VudCA9PT0gMykge1xuICAgICAgcmV0dXJuIGNvZGVQb2ludCA+PSAweDAxMDAwMCA+PiBzaGlmdCAmJiBjb2RlUG9pbnQgPDwgc2hpZnQgPD0gMHgxMGZmZmZcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKClcbiAgfVxuICBmdW5jdGlvbiBvY3RldHNDb3VudChiaXRzTmVlZGVkLCBjb2RlUG9pbnQpIHtcbiAgICBpZiAoYml0c05lZWRlZCA9PT0gNiAqIDEpIHtcbiAgICAgIHJldHVybiBjb2RlUG9pbnQgPj4gNiA+IDE1ID8gMyA6IGNvZGVQb2ludCA+IDMxID8gMiA6IDFcbiAgICB9XG4gICAgaWYgKGJpdHNOZWVkZWQgPT09IDYgKiAyKSB7XG4gICAgICByZXR1cm4gY29kZVBvaW50ID4gMTUgPyAzIDogMlxuICAgIH1cbiAgICBpZiAoYml0c05lZWRlZCA9PT0gNiAqIDMpIHtcbiAgICAgIHJldHVybiAzXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cbiAgdmFyIFJFUExBQ0VSID0gMHhmZmZkXG4gIHZhciBzdHJpbmcgPSAnJ1xuICB2YXIgYml0c05lZWRlZCA9IHRoaXMuYml0c05lZWRlZFxuICB2YXIgY29kZVBvaW50ID0gdGhpcy5jb2RlUG9pbnRcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvY3RldHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgb2N0ZXQgPSBvY3RldHNbaV1cbiAgICBpZiAoYml0c05lZWRlZCAhPT0gMCkge1xuICAgICAgaWYgKFxuICAgICAgICBvY3RldCA8IDEyOCB8fFxuICAgICAgICBvY3RldCA+IDE5MSB8fFxuICAgICAgICAhdmFsaWQoXG4gICAgICAgICAgKGNvZGVQb2ludCA8PCA2KSB8IChvY3RldCAmIDYzKSxcbiAgICAgICAgICBiaXRzTmVlZGVkIC0gNixcbiAgICAgICAgICBvY3RldHNDb3VudChiaXRzTmVlZGVkLCBjb2RlUG9pbnQpXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBiaXRzTmVlZGVkID0gMFxuICAgICAgICBjb2RlUG9pbnQgPSBSRVBMQUNFUlxuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiaXRzTmVlZGVkID09PSAwKSB7XG4gICAgICBpZiAob2N0ZXQgPj0gMCAmJiBvY3RldCA8PSAxMjcpIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDBcbiAgICAgICAgY29kZVBvaW50ID0gb2N0ZXRcbiAgICAgIH0gZWxzZSBpZiAob2N0ZXQgPj0gMTkyICYmIG9jdGV0IDw9IDIyMykge1xuICAgICAgICBiaXRzTmVlZGVkID0gNiAqIDFcbiAgICAgICAgY29kZVBvaW50ID0gb2N0ZXQgJiAzMVxuICAgICAgfSBlbHNlIGlmIChvY3RldCA+PSAyMjQgJiYgb2N0ZXQgPD0gMjM5KSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSA2ICogMlxuICAgICAgICBjb2RlUG9pbnQgPSBvY3RldCAmIDE1XG4gICAgICB9IGVsc2UgaWYgKG9jdGV0ID49IDI0MCAmJiBvY3RldCA8PSAyNDcpIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDYgKiAzXG4gICAgICAgIGNvZGVQb2ludCA9IG9jdGV0ICYgN1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDBcbiAgICAgICAgY29kZVBvaW50ID0gUkVQTEFDRVJcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgYml0c05lZWRlZCAhPT0gMCAmJlxuICAgICAgICAhdmFsaWQoY29kZVBvaW50LCBiaXRzTmVlZGVkLCBvY3RldHNDb3VudChiaXRzTmVlZGVkLCBjb2RlUG9pbnQpKVxuICAgICAgKSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSAwXG4gICAgICAgIGNvZGVQb2ludCA9IFJFUExBQ0VSXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGJpdHNOZWVkZWQgLT0gNlxuICAgICAgY29kZVBvaW50ID0gKGNvZGVQb2ludCA8PCA2KSB8IChvY3RldCAmIDYzKVxuICAgIH1cbiAgICBpZiAoYml0c05lZWRlZCA9PT0gMCkge1xuICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhkODAwICsgKChjb2RlUG9pbnQgLSAweGZmZmYgLSAxKSA+PiAxMCkpXG4gICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgICAgIDB4ZGMwMCArICgoY29kZVBvaW50IC0gMHhmZmZmIC0gMSkgJiAweDNmZilcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB0aGlzLmJpdHNOZWVkZWQgPSBiaXRzTmVlZGVkXG4gIHRoaXMuY29kZVBvaW50ID0gY29kZVBvaW50XG4gIHJldHVybiBzdHJpbmdcbn1cblxuLy8gRmlyZWZveCA8IDM4IHRocm93cyBhbiBlcnJvciB3aXRoIHN0cmVhbSBvcHRpb25cbnZhciBzdXBwb3J0c1N0cmVhbU9wdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKFxuICAgICAgbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgndGVzdCcpLCB7XG4gICAgICAgIHN0cmVhbTogdHJ1ZSxcbiAgICAgIH0pID09PSAndGVzdCdcbiAgICApXG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8vIElFLCBFZGdlXG5pZiAoXG4gIFRleHREZWNvZGVyID09IHVuZGVmaW5lZCB8fFxuICBUZXh0RW5jb2RlciA9PSB1bmRlZmluZWQgfHxcbiAgIXN1cHBvcnRzU3RyZWFtT3B0aW9uKClcbikge1xuICBUZXh0RGVjb2RlciA9IFRleHREZWNvZGVyUG9seWZpbGxcbn1cblxudmFyIGsgPSBmdW5jdGlvbiAoKSB7fVxuXG5mdW5jdGlvbiBYSFJXcmFwcGVyKHhocikge1xuICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlXG4gIHRoaXMucmVzcG9uc2VUeXBlID0gJydcbiAgdGhpcy5yZWFkeVN0YXRlID0gMFxuICB0aGlzLnN0YXR1cyA9IDBcbiAgdGhpcy5zdGF0dXNUZXh0ID0gJydcbiAgdGhpcy5yZXNwb25zZVRleHQgPSAnJ1xuICB0aGlzLm9ucHJvZ3Jlc3MgPSBrXG4gIHRoaXMub25yZWFkeXN0YXRlY2hhbmdlID0ga1xuICB0aGlzLl9jb250ZW50VHlwZSA9ICcnXG4gIHRoaXMuX3hociA9IHhoclxuICB0aGlzLl9zZW5kVGltZW91dCA9IDBcbiAgdGhpcy5fYWJvcnQgPSBrXG59XG5cblhIUldyYXBwZXIucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcbiAgdGhpcy5fYWJvcnQodHJ1ZSlcblxuICB2YXIgdGhhdCA9IHRoaXNcbiAgdmFyIHhociA9IHRoaXMuX3hoclxuICB2YXIgc3RhdGUgPSAxXG4gIHZhciB0aW1lb3V0ID0gMFxuXG4gIHRoaXMuX2Fib3J0ID0gZnVuY3Rpb24gKHNpbGVudCkge1xuICAgIGlmICh0aGF0Ll9zZW5kVGltZW91dCAhPT0gMCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoYXQuX3NlbmRUaW1lb3V0KVxuICAgICAgdGhhdC5fc2VuZFRpbWVvdXQgPSAwXG4gICAgfVxuICAgIGlmIChzdGF0ZSA9PT0gMSB8fCBzdGF0ZSA9PT0gMiB8fCBzdGF0ZSA9PT0gMykge1xuICAgICAgc3RhdGUgPSA0XG4gICAgICB4aHIub25sb2FkID0ga1xuICAgICAgeGhyLm9uZXJyb3IgPSBrXG4gICAgICB4aHIub25hYm9ydCA9IGtcbiAgICAgIHhoci5vbnByb2dyZXNzID0ga1xuICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGtcbiAgICAgIC8vIElFIDggLSA5OiBYRG9tYWluUmVxdWVzdCNhYm9ydCgpIGRvZXMgbm90IGZpcmUgYW55IGV2ZW50XG4gICAgICAvLyBPcGVyYSA8IDEwOiBYTUxIdHRwUmVxdWVzdCNhYm9ydCgpIGRvZXMgbm90IGZpcmUgYW55IGV2ZW50XG4gICAgICB4aHIuYWJvcnQoKVxuICAgICAgaWYgKHRpbWVvdXQgIT09IDApIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgIHRpbWVvdXQgPSAwXG4gICAgICB9XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICB0aGF0LnJlYWR5U3RhdGUgPSA0XG4gICAgICAgIHRoYXQub25yZWFkeXN0YXRlY2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG4gICAgc3RhdGUgPSAwXG4gIH1cblxuICB2YXIgb25TdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoc3RhdGUgPT09IDEpIHtcbiAgICAgIC8vIHN0YXRlID0gMjtcbiAgICAgIHZhciBzdGF0dXMgPSAwXG4gICAgICB2YXIgc3RhdHVzVGV4dCA9ICcnXG4gICAgICB2YXIgY29udGVudFR5cGUgPSB1bmRlZmluZWRcbiAgICAgIGlmICghKCdjb250ZW50VHlwZScgaW4geGhyKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXR1cyA9IHhoci5zdGF0dXNcbiAgICAgICAgICBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHRcbiAgICAgICAgICBjb250ZW50VHlwZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1UeXBlJylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBJRSA8IDEwIHRocm93cyBleGNlcHRpb24gZm9yIGB4aHIuc3RhdHVzYCB3aGVuIHhoci5yZWFkeVN0YXRlID09PSAyIHx8IHhoci5yZWFkeVN0YXRlID09PSAzXG4gICAgICAgICAgLy8gT3BlcmEgPCAxMSB0aHJvd3MgZXhjZXB0aW9uIGZvciBgeGhyLnN0YXR1c2Agd2hlbiB4aHIucmVhZHlTdGF0ZSA9PT0gMlxuICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTEyMVxuICAgICAgICAgIHN0YXR1cyA9IDBcbiAgICAgICAgICBzdGF0dXNUZXh0ID0gJydcbiAgICAgICAgICBjb250ZW50VHlwZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIC8vIEZpcmVmb3ggPCAxNCwgQ2hyb21lID8sIFNhZmFyaSA/XG4gICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5NjU4XG4gICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc3ODU0XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDIwMFxuICAgICAgICBzdGF0dXNUZXh0ID0gJ09LJ1xuICAgICAgICBjb250ZW50VHlwZSA9IHhoci5jb250ZW50VHlwZVxuICAgICAgfVxuICAgICAgaWYgKHN0YXR1cyAhPT0gMCkge1xuICAgICAgICBzdGF0ZSA9IDJcbiAgICAgICAgdGhhdC5yZWFkeVN0YXRlID0gMlxuICAgICAgICB0aGF0LnN0YXR1cyA9IHN0YXR1c1xuICAgICAgICB0aGF0LnN0YXR1c1RleHQgPSBzdGF0dXNUZXh0XG4gICAgICAgIHRoYXQuX2NvbnRlbnRUeXBlID0gY29udGVudFR5cGVcbiAgICAgICAgdGhhdC5vbnJlYWR5c3RhdGVjaGFuZ2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB2YXIgb25Qcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBvblN0YXJ0KClcbiAgICBpZiAoc3RhdGUgPT09IDIgfHwgc3RhdGUgPT09IDMpIHtcbiAgICAgIHN0YXRlID0gM1xuICAgICAgdmFyIHJlc3BvbnNlVGV4dCA9ICcnXG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJRSA4IC0gOSB3aXRoIFhNTEh0dHBSZXF1ZXN0XG4gICAgICB9XG4gICAgICB0aGF0LnJlYWR5U3RhdGUgPSAzXG4gICAgICB0aGF0LnJlc3BvbnNlVGV4dCA9IHJlc3BvbnNlVGV4dFxuICAgICAgdGhhdC5vbnByb2dyZXNzKClcbiAgICB9XG4gIH1cbiAgdmFyIG9uRmluaXNoID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIEZpcmVmb3ggNTIgZmlyZXMgXCJyZWFkeXN0YXRlY2hhbmdlXCIgKHhoci5yZWFkeVN0YXRlID09PSA0KSB3aXRob3V0IGZpbmFsIFwicmVhZHlzdGF0ZWNoYW5nZVwiICh4aHIucmVhZHlTdGF0ZSA9PT0gMylcbiAgICAvLyBJRSA4IGZpcmVzIFwib25sb2FkXCIgd2l0aG91dCBcIm9ucHJvZ3Jlc3NcIlxuICAgIG9uUHJvZ3Jlc3MoKVxuICAgIGlmIChzdGF0ZSA9PT0gMSB8fCBzdGF0ZSA9PT0gMiB8fCBzdGF0ZSA9PT0gMykge1xuICAgICAgc3RhdGUgPSA0XG4gICAgICBpZiAodGltZW91dCAhPT0gMCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgdGltZW91dCA9IDBcbiAgICAgIH1cbiAgICAgIHRoYXQucmVhZHlTdGF0ZSA9IDRcbiAgICAgIHRoYXQub25yZWFkeXN0YXRlY2hhbmdlKClcbiAgICB9XG4gIH1cbiAgdmFyIG9uUmVhZHlTdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoeGhyICE9IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT3BlcmEgMTJcbiAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICBvbkZpbmlzaCgpXG4gICAgICB9IGVsc2UgaWYgKHhoci5yZWFkeVN0YXRlID09PSAzKSB7XG4gICAgICAgIG9uUHJvZ3Jlc3MoKVxuICAgICAgfSBlbHNlIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMikge1xuICAgICAgICBvblN0YXJ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIG9uVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBvblRpbWVvdXQoKVxuICAgIH0sIDUwMClcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDMpIHtcbiAgICAgIG9uUHJvZ3Jlc3MoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFhEb21haW5SZXF1ZXN0I2Fib3J0IHJlbW92ZXMgb25wcm9ncmVzcywgb25lcnJvciwgb25sb2FkXG4gIHhoci5vbmxvYWQgPSBvbkZpbmlzaFxuICB4aHIub25lcnJvciA9IG9uRmluaXNoXG4gIC8vIGltcHJvcGVyIGZpeCB0byBtYXRjaCBGaXJlZm94IGJlaGF2aW9yLCBidXQgaXQgaXMgYmV0dGVyIHRoYW4ganVzdCBpZ25vcmUgYWJvcnRcbiAgLy8gc2VlIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc2ODU5NlxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD04ODAyMDBcbiAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE1MzU3MFxuICAvLyBJRSA4IGZpcmVzIFwib25sb2FkXCIgd2l0aG91dCBcIm9ucHJvZ3Jlc3NcbiAgeGhyLm9uYWJvcnQgPSBvbkZpbmlzaFxuXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTczNjcyM1xuICBpZiAoXG4gICAgISgnc2VuZEFzQmluYXJ5JyBpbiBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUpICYmXG4gICAgISgnbW96QW5vbicgaW4gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlKVxuICApIHtcbiAgICB4aHIub25wcm9ncmVzcyA9IG9uUHJvZ3Jlc3NcbiAgfVxuXG4gIC8vIElFIDggLSA5IChYTUxIVFRQUmVxdWVzdClcbiAgLy8gT3BlcmEgPCAxMlxuICAvLyBGaXJlZm94IDwgMy41XG4gIC8vIEZpcmVmb3ggMy41IC0gMy42IC0gPyA8IDkuMFxuICAvLyBvbnByb2dyZXNzIGlzIG5vdCBmaXJlZCBzb21ldGltZXMgb3IgZGVsYXllZFxuICAvLyBzZWUgYWxzbyAjNjRcbiAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9uUmVhZHlTdGF0ZUNoYW5nZVxuXG4gIGlmICgnY29udGVudFR5cGUnIGluIHhocikge1xuICAgIHVybCArPSAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgJ3BhZGRpbmc9dHJ1ZSdcbiAgfVxuICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSlcblxuICBpZiAoJ3JlYWR5U3RhdGUnIGluIHhocikge1xuICAgIC8vIHdvcmthcm91bmQgZm9yIE9wZXJhIDEyIGlzc3VlIHdpdGggXCJwcm9ncmVzc1wiIGV2ZW50c1xuICAgIC8vICM5MVxuICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIG9uVGltZW91dCgpXG4gICAgfSwgMClcbiAgfVxufVxuWEhSV3JhcHBlci5wcm90b3R5cGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2Fib3J0KGZhbHNlKVxufVxuWEhSV3JhcHBlci5wcm90b3R5cGUuZ2V0UmVzcG9uc2VIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy5fY29udGVudFR5cGVcbn1cblhIUldyYXBwZXIucHJvdG90eXBlLnNldFJlcXVlc3RIZWFkZXIgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgdmFyIHhociA9IHRoaXMuX3hoclxuICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHhocikge1xuICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKVxuICB9XG59XG5YSFJXcmFwcGVyLnByb3RvdHlwZS5nZXRBbGxSZXNwb25zZUhlYWRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl94aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzICE9IHVuZGVmaW5lZFxuICAgID8gdGhpcy5feGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgOiAnJ1xufVxuWEhSV3JhcHBlci5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gbG9hZGluZyBpbmRpY2F0b3IgaW4gU2FmYXJpIDwgPyAoNiksIENocm9tZSA8IDE0LCBGaXJlZm94XG4gIGlmIChcbiAgICAhKCdvbnRpbWVvdXQnIGluIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSkgJiZcbiAgICBkb2N1bWVudCAhPSB1bmRlZmluZWQgJiZcbiAgICBkb2N1bWVudC5yZWFkeVN0YXRlICE9IHVuZGVmaW5lZCAmJlxuICAgIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09ICdjb21wbGV0ZSdcbiAgKSB7XG4gICAgdmFyIHRoYXQgPSB0aGlzXG4gICAgdGhhdC5fc2VuZFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoYXQuX3NlbmRUaW1lb3V0ID0gMFxuICAgICAgdGhhdC5zZW5kKClcbiAgICB9LCA0KVxuICAgIHJldHVyblxuICB9XG5cbiAgdmFyIHhociA9IHRoaXMuX3hoclxuICAvLyB3aXRoQ3JlZGVudGlhbHMgc2hvdWxkIGJlIHNldCBhZnRlciBcIm9wZW5cIiBmb3IgU2FmYXJpIGFuZCBDaHJvbWUgKDwgMTkgPylcbiAgeGhyLndpdGhDcmVkZW50aWFscyA9IHRoaXMud2l0aENyZWRlbnRpYWxzXG4gIHhoci5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZVxuICB0cnkge1xuICAgIC8vIHhoci5zZW5kKCk7IHRocm93cyBcIk5vdCBlbm91Z2ggYXJndW1lbnRzXCIgaW4gRmlyZWZveCAzLjBcbiAgICB4aHIuc2VuZCh1bmRlZmluZWQpXG4gIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgIC8vIFNhZmFyaSA1LjEuNywgT3BlcmEgMTJcbiAgICB0aHJvdyBlcnJvcjFcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0xvd2VyQ2FzZShuYW1lKSB7XG4gIHJldHVybiBuYW1lLnJlcGxhY2UoL1tBLVpdL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYy5jaGFyQ29kZUF0KDApICsgMHgyMClcbiAgfSlcbn1cblxuZnVuY3Rpb24gSGVhZGVyc1BvbHlmaWxsKGFsbCkge1xuICAvLyBHZXQgaGVhZGVyczogaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIG1vemlsbGEncyBleGFtcGxlIGNvZGU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9YTUxIdHRwUmVxdWVzdC9nZXRBbGxSZXNwb25zZUhlYWRlcnMjRXhhbXBsZVxuICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB2YXIgYXJyYXkgPSBhbGwuc3BsaXQoJ1xcclxcbicpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgbGluZSA9IGFycmF5W2ldXG4gICAgdmFyIHBhcnRzID0gbGluZS5zcGxpdCgnOiAnKVxuICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKVxuICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzogJylcbiAgICBtYXBbdG9Mb3dlckNhc2UobmFtZSldID0gdmFsdWVcbiAgfVxuICB0aGlzLl9tYXAgPSBtYXBcbn1cbkhlYWRlcnNQb2x5ZmlsbC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX21hcFt0b0xvd2VyQ2FzZShuYW1lKV1cbn1cblxuZnVuY3Rpb24gWEhSVHJhbnNwb3J0KCkge31cblxuWEhSVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKFxuICB4aHIsXG4gIG9uU3RhcnRDYWxsYmFjayxcbiAgb25Qcm9ncmVzc0NhbGxiYWNrLFxuICBvbkZpbmlzaENhbGxiYWNrLFxuICB1cmwsXG4gIHdpdGhDcmVkZW50aWFscyxcbiAgaGVhZGVyc1xuKSB7XG4gIHhoci5vcGVuKCdHRVQnLCB1cmwpXG4gIHZhciBvZmZzZXQgPSAwXG4gIHhoci5vbnByb2dyZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0XG4gICAgdmFyIGNodW5rID0gcmVzcG9uc2VUZXh0LnNsaWNlKG9mZnNldClcbiAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoXG4gICAgb25Qcm9ncmVzc0NhbGxiYWNrKGNodW5rKVxuICB9XG4gIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAyKSB7XG4gICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1c1xuICAgICAgdmFyIHN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dFxuICAgICAgdmFyIGNvbnRlbnRUeXBlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdDb250ZW50LVR5cGUnKVxuICAgICAgdmFyIGhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgIG9uU3RhcnRDYWxsYmFjayhcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0LFxuICAgICAgICBjb250ZW50VHlwZSxcbiAgICAgICAgbmV3IEhlYWRlcnNQb2x5ZmlsbChoZWFkZXJzKSxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHhoci5hYm9ydCgpXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICBvbkZpbmlzaENhbGxiYWNrKClcbiAgICB9XG4gIH1cbiAgeGhyLndpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFsc1xuICB4aHIucmVzcG9uc2VUeXBlID0gJ3RleHQnXG4gIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaGVhZGVycywgbmFtZSkpIHtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pXG4gICAgfVxuICB9XG4gIHhoci5zZW5kKClcbn1cblxuZnVuY3Rpb24gSGVhZGVyc1dyYXBwZXIoaGVhZGVycykge1xuICB0aGlzLl9oZWFkZXJzID0gaGVhZGVyc1xufVxuSGVhZGVyc1dyYXBwZXIucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB0aGlzLl9oZWFkZXJzLmdldChuYW1lKVxufVxuXG5mdW5jdGlvbiBGZXRjaFRyYW5zcG9ydCgpIHt9XG5cbkZldGNoVHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKFxuICB4aHIsXG4gIG9uU3RhcnRDYWxsYmFjayxcbiAgb25Qcm9ncmVzc0NhbGxiYWNrLFxuICBvbkZpbmlzaENhbGxiYWNrLFxuICB1cmwsXG4gIHdpdGhDcmVkZW50aWFscyxcbiAgaGVhZGVyc1xuKSB7XG4gIHZhciBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpXG4gIHZhciBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbCAvLyBzZWUgIzEyMFxuICB2YXIgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKVxuICBmZXRjaCh1cmwsIHtcbiAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgIGNyZWRlbnRpYWxzOiB3aXRoQ3JlZGVudGlhbHMgPyAnaW5jbHVkZScgOiAnc2FtZS1vcmlnaW4nLFxuICAgIHNpZ25hbDogc2lnbmFsLFxuICAgIGNhY2hlOiAnbm8tc3RvcmUnLFxuICB9KVxuICAgIC50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgdmFyIHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKClcbiAgICAgIG9uU3RhcnRDYWxsYmFjayhcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyksXG4gICAgICAgIG5ldyBIZWFkZXJzV3JhcHBlcihyZXNwb25zZS5oZWFkZXJzKSxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKVxuICAgICAgICAgIHJlYWRlci5jYW5jZWwoKVxuICAgICAgICB9XG4gICAgICApXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgcmVhZE5leHRDaHVuayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZWFkZXJcbiAgICAgICAgICAgIC5yZWFkKClcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90ZTogYnl0ZXMgaW4gdGV4dERlY29kZXIgYXJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgY2h1bmsgPSB0ZXh0RGVjb2Rlci5kZWNvZGUocmVzdWx0LnZhbHVlLCB7IHN0cmVhbTogdHJ1ZSB9KVxuICAgICAgICAgICAgICAgIG9uUHJvZ3Jlc3NDYWxsYmFjayhjaHVuaylcbiAgICAgICAgICAgICAgICByZWFkTmV4dENodW5rKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFsnY2F0Y2gnXShmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZWFkTmV4dENodW5rKClcbiAgICAgIH0pXG4gICAgfSlcbiAgICAudGhlbihcbiAgICAgIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgb25GaW5pc2hDYWxsYmFjaygpXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgb25GaW5pc2hDYWxsYmFjaygpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcilcbiAgICAgIH1cbiAgICApXG59XG5cbmZ1bmN0aW9uIEV2ZW50VGFyZ2V0KCkge1xuICB0aGlzLl9saXN0ZW5lcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpXG59XG5cbmZ1bmN0aW9uIHRocm93RXJyb3IoZSkge1xuICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICB0aHJvdyBlXG4gIH0sIDApXG59XG5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGV2ZW50LnRhcmdldCA9IHRoaXNcbiAgdmFyIHR5cGVMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnQudHlwZV1cbiAgaWYgKHR5cGVMaXN0ZW5lcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGxlbmd0aCA9IHR5cGVMaXN0ZW5lcnMubGVuZ3RoXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIGxpc3RlbmVyID0gdHlwZUxpc3RlbmVyc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lci5oYW5kbGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuRXZlbnRUYXJnZXQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgdHlwZSA9IFN0cmluZyh0eXBlKVxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzXG4gIHZhciB0eXBlTGlzdGVuZXJzID0gbGlzdGVuZXJzW3R5cGVdXG4gIGlmICh0eXBlTGlzdGVuZXJzID09IHVuZGVmaW5lZCkge1xuICAgIHR5cGVMaXN0ZW5lcnMgPSBbXVxuICAgIGxpc3RlbmVyc1t0eXBlXSA9IHR5cGVMaXN0ZW5lcnNcbiAgfVxuICB2YXIgZm91bmQgPSBmYWxzZVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVMaXN0ZW5lcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAodHlwZUxpc3RlbmVyc1tpXSA9PT0gbGlzdGVuZXIpIHtcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH1cbiAgfVxuICBpZiAoIWZvdW5kKSB7XG4gICAgdHlwZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKVxuICB9XG59XG5FdmVudFRhcmdldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuICB0eXBlID0gU3RyaW5nKHR5cGUpXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNcbiAgdmFyIHR5cGVMaXN0ZW5lcnMgPSBsaXN0ZW5lcnNbdHlwZV1cbiAgaWYgKHR5cGVMaXN0ZW5lcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbHRlcmVkID0gW11cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVMaXN0ZW5lcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICh0eXBlTGlzdGVuZXJzW2ldICE9PSBsaXN0ZW5lcikge1xuICAgICAgICBmaWx0ZXJlZC5wdXNoKHR5cGVMaXN0ZW5lcnNbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBsaXN0ZW5lcnNbdHlwZV1cbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdGVuZXJzW3R5cGVdID0gZmlsdGVyZWRcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gRXZlbnQodHlwZSkge1xuICB0aGlzLnR5cGUgPSB0eXBlXG4gIHRoaXMudGFyZ2V0ID0gdW5kZWZpbmVkXG59XG5cbmZ1bmN0aW9uIE1lc3NhZ2VFdmVudCh0eXBlLCBvcHRpb25zKSB7XG4gIEV2ZW50LmNhbGwodGhpcywgdHlwZSlcbiAgdGhpcy5kYXRhID0gb3B0aW9ucy5kYXRhXG4gIHRoaXMubGFzdEV2ZW50SWQgPSBvcHRpb25zLmxhc3RFdmVudElkXG59XG5cbk1lc3NhZ2VFdmVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50LnByb3RvdHlwZSlcblxuZnVuY3Rpb24gQ29ubmVjdGlvbkV2ZW50KHR5cGUsIG9wdGlvbnMpIHtcbiAgRXZlbnQuY2FsbCh0aGlzLCB0eXBlKVxuICB0aGlzLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzXG4gIHRoaXMuc3RhdHVzVGV4dCA9IG9wdGlvbnMuc3RhdHVzVGV4dFxuICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnNcbn1cblxuQ29ubmVjdGlvbkV2ZW50LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnQucHJvdG90eXBlKVxuXG52YXIgV0FJVElORyA9IC0xXG52YXIgQ09OTkVDVElORyA9IDBcbnZhciBPUEVOID0gMVxudmFyIENMT1NFRCA9IDJcblxudmFyIEFGVEVSX0NSID0gLTFcbnZhciBGSUVMRF9TVEFSVCA9IDBcbnZhciBGSUVMRCA9IDFcbnZhciBWQUxVRV9TVEFSVCA9IDJcbnZhciBWQUxVRSA9IDNcblxudmFyIGNvbnRlbnRUeXBlUmVnRXhwID0gL150ZXh0XFwvZXZlbnRcXC1zdHJlYW07PyhcXHMqY2hhcnNldFxcPXV0ZlxcLTgpPyQvaVxuXG52YXIgTUlOSU1VTV9EVVJBVElPTiA9IDEwMDBcbnZhciBNQVhJTVVNX0RVUkFUSU9OID0gMTgwMDAwMDBcblxudmFyIHBhcnNlRHVyYXRpb24gPSBmdW5jdGlvbiAodmFsdWUsIGRlZikge1xuICB2YXIgbiA9IHBhcnNlSW50KHZhbHVlLCAxMClcbiAgaWYgKG4gIT09IG4pIHtcbiAgICBuID0gZGVmXG4gIH1cbiAgcmV0dXJuIGNsYW1wRHVyYXRpb24obilcbn1cbnZhciBjbGFtcER1cmF0aW9uID0gZnVuY3Rpb24gKG4pIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KG4sIE1JTklNVU1fRFVSQVRJT04pLCBNQVhJTVVNX0RVUkFUSU9OKVxufVxuXG52YXIgZmlyZSA9IGZ1bmN0aW9uICh0aGF0LCBmLCBldmVudCkge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZi5jYWxsKHRoYXQsIGV2ZW50KVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93RXJyb3IoZSlcbiAgfVxufVxuXG5mdW5jdGlvbiBFdmVudFNvdXJjZVBvbHlmaWxsKHVybCwgb3B0aW9ucykge1xuICBFdmVudFRhcmdldC5jYWxsKHRoaXMpXG5cbiAgdGhpcy5vbm9wZW4gPSB1bmRlZmluZWRcbiAgdGhpcy5vbm1lc3NhZ2UgPSB1bmRlZmluZWRcbiAgdGhpcy5vbmVycm9yID0gdW5kZWZpbmVkXG5cbiAgdGhpcy51cmwgPSB1bmRlZmluZWRcbiAgdGhpcy5yZWFkeVN0YXRlID0gdW5kZWZpbmVkXG4gIHRoaXMud2l0aENyZWRlbnRpYWxzID0gdW5kZWZpbmVkXG5cbiAgdGhpcy5fY2xvc2UgPSB1bmRlZmluZWRcblxuICBzdGFydCh0aGlzLCB1cmwsIG9wdGlvbnMpXG59XG5cbnZhciBpc0ZldGNoU3VwcG9ydGVkID1cbiAgZmV0Y2ggIT0gdW5kZWZpbmVkICYmIFJlc3BvbnNlICE9IHVuZGVmaW5lZCAmJiAnYm9keScgaW4gUmVzcG9uc2UucHJvdG90eXBlXG5cbmZ1bmN0aW9uIHN0YXJ0KGVzLCB1cmwsIG9wdGlvbnMpIHtcbiAgdXJsID0gU3RyaW5nKHVybClcbiAgdmFyIHdpdGhDcmVkZW50aWFscyA9IG9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIEJvb2xlYW4ob3B0aW9ucy53aXRoQ3JlZGVudGlhbHMpXG5cbiAgdmFyIGluaXRpYWxSZXRyeSA9IGNsYW1wRHVyYXRpb24oMTAwMClcbiAgdmFyIGhlYXJ0YmVhdFRpbWVvdXQgPVxuICAgIG9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuaGVhcnRiZWF0VGltZW91dCAhPSB1bmRlZmluZWRcbiAgICAgID8gcGFyc2VEdXJhdGlvbihvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQsIDQ1MDAwKVxuICAgICAgOiBjbGFtcER1cmF0aW9uKDQ1MDAwKVxuXG4gIHZhciBsYXN0RXZlbnRJZCA9ICcnXG4gIHZhciByZXRyeSA9IGluaXRpYWxSZXRyeVxuICB2YXIgd2FzQWN0aXZpdHkgPSBmYWxzZVxuICB2YXIgaGVhZGVycyA9XG4gICAgb3B0aW9ucyAhPSB1bmRlZmluZWQgJiYgb3B0aW9ucy5oZWFkZXJzICE9IHVuZGVmaW5lZFxuICAgICAgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuaGVhZGVycykpXG4gICAgICA6IHVuZGVmaW5lZFxuICB2YXIgQ3VycmVudFRyYW5zcG9ydCA9XG4gICAgb3B0aW9ucyAhPSB1bmRlZmluZWQgJiYgb3B0aW9ucy5UcmFuc3BvcnQgIT0gdW5kZWZpbmVkXG4gICAgICA/IG9wdGlvbnMuVHJhbnNwb3J0XG4gICAgICA6IFhNTEh0dHBSZXF1ZXN0XG4gIHZhciB4aHIgPVxuICAgIGlzRmV0Y2hTdXBwb3J0ZWQgJiZcbiAgICAhKG9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuVHJhbnNwb3J0ICE9IHVuZGVmaW5lZClcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IG5ldyBYSFJXcmFwcGVyKG5ldyBDdXJyZW50VHJhbnNwb3J0KCkpXG4gIHZhciB0cmFuc3BvcnQgPSB4aHIgPT0gdW5kZWZpbmVkID8gbmV3IEZldGNoVHJhbnNwb3J0KCkgOiBuZXcgWEhSVHJhbnNwb3J0KClcbiAgdmFyIGNhbmNlbEZ1bmN0aW9uID0gdW5kZWZpbmVkXG4gIHZhciB0aW1lb3V0ID0gMFxuICB2YXIgY3VycmVudFN0YXRlID0gV0FJVElOR1xuICB2YXIgZGF0YUJ1ZmZlciA9ICcnXG4gIHZhciBsYXN0RXZlbnRJZEJ1ZmZlciA9ICcnXG4gIHZhciBldmVudFR5cGVCdWZmZXIgPSAnJ1xuXG4gIHZhciB0ZXh0QnVmZmVyID0gJydcbiAgdmFyIHN0YXRlID0gRklFTERfU1RBUlRcbiAgdmFyIGZpZWxkU3RhcnQgPSAwXG4gIHZhciB2YWx1ZVN0YXJ0ID0gMFxuXG4gIHZhciBvblN0YXJ0ID0gZnVuY3Rpb24gKHN0YXR1cywgc3RhdHVzVGV4dCwgY29udGVudFR5cGUsIGhlYWRlcnMsIGNhbmNlbCkge1xuICAgIGlmIChjdXJyZW50U3RhdGUgPT09IENPTk5FQ1RJTkcpIHtcbiAgICAgIGNhbmNlbEZ1bmN0aW9uID0gY2FuY2VsXG4gICAgICBpZiAoXG4gICAgICAgIHN0YXR1cyA9PT0gMjAwICYmXG4gICAgICAgIGNvbnRlbnRUeXBlICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICBjb250ZW50VHlwZVJlZ0V4cC50ZXN0KGNvbnRlbnRUeXBlKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRTdGF0ZSA9IE9QRU5cbiAgICAgICAgd2FzQWN0aXZpdHkgPSB0cnVlXG4gICAgICAgIHJldHJ5ID0gaW5pdGlhbFJldHJ5XG4gICAgICAgIGVzLnJlYWR5U3RhdGUgPSBPUEVOXG4gICAgICAgIHZhciBldmVudCA9IG5ldyBDb25uZWN0aW9uRXZlbnQoJ29wZW4nLCB7XG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICB9KVxuICAgICAgICBlcy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgICAgICBmaXJlKGVzLCBlcy5vbm9wZW4sIGV2ZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSAnJ1xuICAgICAgICBpZiAoc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICBpZiAoc3RhdHVzVGV4dCkge1xuICAgICAgICAgICAgc3RhdHVzVGV4dCA9IHN0YXR1c1RleHQucmVwbGFjZSgvXFxzKy9nLCAnICcpXG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgXCJFdmVudFNvdXJjZSdzIHJlc3BvbnNlIGhhcyBhIHN0YXR1cyBcIiArXG4gICAgICAgICAgICBzdGF0dXMgK1xuICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgIHN0YXR1c1RleHQgK1xuICAgICAgICAgICAgJyB0aGF0IGlzIG5vdCAyMDAuIEFib3J0aW5nIHRoZSBjb25uZWN0aW9uLidcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgIFwiRXZlbnRTb3VyY2UncyByZXNwb25zZSBoYXMgYSBDb250ZW50LVR5cGUgc3BlY2lmeWluZyBhbiB1bnN1cHBvcnRlZCB0eXBlOiBcIiArXG4gICAgICAgICAgICAoY29udGVudFR5cGUgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gJy0nXG4gICAgICAgICAgICAgIDogY29udGVudFR5cGUucmVwbGFjZSgvXFxzKy9nLCAnICcpKSArXG4gICAgICAgICAgICAnLiBBYm9ydGluZyB0aGUgY29ubmVjdGlvbi4nXG4gICAgICAgIH1cbiAgICAgICAgdGhyb3dFcnJvcihuZXcgRXJyb3IobWVzc2FnZSkpXG4gICAgICAgIGNsb3NlKClcbiAgICAgICAgdmFyIGV2ZW50ID0gbmV3IENvbm5lY3Rpb25FdmVudCgnZXJyb3InLCB7XG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICB9KVxuICAgICAgICBlcy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgICAgICBmaXJlKGVzLCBlcy5vbmVycm9yLCBldmVudClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgb25Qcm9ncmVzcyA9IGZ1bmN0aW9uICh0ZXh0Q2h1bmspIHtcbiAgICBpZiAoY3VycmVudFN0YXRlID09PSBPUEVOKSB7XG4gICAgICB2YXIgbiA9IC0xXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRDaHVuay5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgYyA9IHRleHRDaHVuay5jaGFyQ29kZUF0KGkpXG4gICAgICAgIGlmIChjID09PSAnXFxuJy5jaGFyQ29kZUF0KDApIHx8IGMgPT09ICdcXHInLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgICAgICBuID0gaVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2h1bmsgPSAobiAhPT0gLTEgPyB0ZXh0QnVmZmVyIDogJycpICsgdGV4dENodW5rLnNsaWNlKDAsIG4gKyAxKVxuICAgICAgdGV4dEJ1ZmZlciA9IChuID09PSAtMSA/IHRleHRCdWZmZXIgOiAnJykgKyB0ZXh0Q2h1bmsuc2xpY2UobiArIDEpXG4gICAgICBpZiAoY2h1bmsgIT09ICcnKSB7XG4gICAgICAgIHdhc0FjdGl2aXR5ID0gdHJ1ZVxuICAgICAgfVxuICAgICAgZm9yICh2YXIgcG9zaXRpb24gPSAwOyBwb3NpdGlvbiA8IGNodW5rLmxlbmd0aDsgcG9zaXRpb24gKz0gMSkge1xuICAgICAgICB2YXIgYyA9IGNodW5rLmNoYXJDb2RlQXQocG9zaXRpb24pXG4gICAgICAgIGlmIChzdGF0ZSA9PT0gQUZURVJfQ1IgJiYgYyA9PT0gJ1xcbicuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICAgIHN0YXRlID0gRklFTERfU1RBUlRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEFGVEVSX0NSKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEZJRUxEX1NUQVJUXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjID09PSAnXFxyJy5jaGFyQ29kZUF0KDApIHx8IGMgPT09ICdcXG4nLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gRklFTERfU1RBUlQpIHtcbiAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBGSUVMRCkge1xuICAgICAgICAgICAgICAgIHZhbHVlU3RhcnQgPSBwb3NpdGlvbiArIDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgZmllbGQgPSBjaHVuay5zbGljZShmaWVsZFN0YXJ0LCB2YWx1ZVN0YXJ0IC0gMSlcbiAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY2h1bmsuc2xpY2UoXG4gICAgICAgICAgICAgICAgdmFsdWVTdGFydCArXG4gICAgICAgICAgICAgICAgICAodmFsdWVTdGFydCA8IHBvc2l0aW9uICYmXG4gICAgICAgICAgICAgICAgICBjaHVuay5jaGFyQ29kZUF0KHZhbHVlU3RhcnQpID09PSAnICcuY2hhckNvZGVBdCgwKVxuICAgICAgICAgICAgICAgICAgICA/IDFcbiAgICAgICAgICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChmaWVsZCA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICAgICAgZGF0YUJ1ZmZlciArPSAnXFxuJ1xuICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIgKz0gdmFsdWVcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ2lkJykge1xuICAgICAgICAgICAgICAgIGxhc3RFdmVudElkQnVmZmVyID0gdmFsdWVcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ2V2ZW50Jykge1xuICAgICAgICAgICAgICAgIGV2ZW50VHlwZUJ1ZmZlciA9IHZhbHVlXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdyZXRyeScpIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsUmV0cnkgPSBwYXJzZUR1cmF0aW9uKHZhbHVlLCBpbml0aWFsUmV0cnkpXG4gICAgICAgICAgICAgICAgcmV0cnkgPSBpbml0aWFsUmV0cnlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PT0gJ2hlYXJ0YmVhdFRpbWVvdXQnKSB7XG4gICAgICAgICAgICAgICAgaGVhcnRiZWF0VGltZW91dCA9IHBhcnNlRHVyYXRpb24odmFsdWUsIGhlYXJ0YmVhdFRpbWVvdXQpXG4gICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBvblRpbWVvdXQoKVxuICAgICAgICAgICAgICAgICAgfSwgaGVhcnRiZWF0VGltZW91dClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gRklFTERfU1RBUlQpIHtcbiAgICAgICAgICAgICAgaWYgKGRhdGFCdWZmZXIgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgbGFzdEV2ZW50SWQgPSBsYXN0RXZlbnRJZEJ1ZmZlclxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGVCdWZmZXIgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICBldmVudFR5cGVCdWZmZXIgPSAnbWVzc2FnZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gbmV3IE1lc3NhZ2VFdmVudChldmVudFR5cGVCdWZmZXIsIHtcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFCdWZmZXIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgICBsYXN0RXZlbnRJZDogbGFzdEV2ZW50SWRCdWZmZXIsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBlcy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgICAgICAgICAgICAgIGlmIChldmVudFR5cGVCdWZmZXIgPT09ICdtZXNzYWdlJykge1xuICAgICAgICAgICAgICAgICAgZmlyZShlcywgZXMub25tZXNzYWdlLCBldmVudClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gQ0xPU0VEKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGF0YUJ1ZmZlciA9ICcnXG4gICAgICAgICAgICAgIGV2ZW50VHlwZUJ1ZmZlciA9ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZSA9IGMgPT09ICdcXHInLmNoYXJDb2RlQXQoMCkgPyBBRlRFUl9DUiA6IEZJRUxEX1NUQVJUXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gRklFTERfU1RBUlQpIHtcbiAgICAgICAgICAgICAgZmllbGRTdGFydCA9IHBvc2l0aW9uXG4gICAgICAgICAgICAgIHN0YXRlID0gRklFTERcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gRklFTEQpIHtcbiAgICAgICAgICAgICAgaWYgKGMgPT09ICc6Jy5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgICAgICAgICAgdmFsdWVTdGFydCA9IHBvc2l0aW9uICsgMVxuICAgICAgICAgICAgICAgIHN0YXRlID0gVkFMVUVfU1RBUlRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gVkFMVUVfU1RBUlQpIHtcbiAgICAgICAgICAgICAgc3RhdGUgPSBWQUxVRVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBvbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY3VycmVudFN0YXRlID09PSBPUEVOIHx8IGN1cnJlbnRTdGF0ZSA9PT0gQ09OTkVDVElORykge1xuICAgICAgY3VycmVudFN0YXRlID0gV0FJVElOR1xuICAgICAgaWYgKHRpbWVvdXQgIT09IDApIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgIHRpbWVvdXQgPSAwXG4gICAgICB9XG4gICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIG9uVGltZW91dCgpXG4gICAgICB9LCByZXRyeSlcbiAgICAgIHJldHJ5ID0gY2xhbXBEdXJhdGlvbihNYXRoLm1pbihpbml0aWFsUmV0cnkgKiAxNiwgcmV0cnkgKiAyKSlcblxuICAgICAgZXMucmVhZHlTdGF0ZSA9IENPTk5FQ1RJTkdcbiAgICAgIHZhciBldmVudCA9IG5ldyBFdmVudCgnZXJyb3InKVxuICAgICAgZXMuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICAgIGZpcmUoZXMsIGVzLm9uZXJyb3IsIGV2ZW50KVxuICAgIH1cbiAgfVxuXG4gIHZhciBjbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjdXJyZW50U3RhdGUgPSBDTE9TRURcbiAgICBpZiAoY2FuY2VsRnVuY3Rpb24gIT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYW5jZWxGdW5jdGlvbigpXG4gICAgICBjYW5jZWxGdW5jdGlvbiA9IHVuZGVmaW5lZFxuICAgIH1cbiAgICBpZiAodGltZW91dCAhPT0gMCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICB0aW1lb3V0ID0gMFxuICAgIH1cbiAgICBlcy5yZWFkeVN0YXRlID0gQ0xPU0VEXG4gIH1cblxuICB2YXIgb25UaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRpbWVvdXQgPSAwXG5cbiAgICBpZiAoY3VycmVudFN0YXRlICE9PSBXQUlUSU5HKSB7XG4gICAgICBpZiAoIXdhc0FjdGl2aXR5ICYmIGNhbmNlbEZ1bmN0aW9uICE9IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvd0Vycm9yKFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICdObyBhY3Rpdml0eSB3aXRoaW4gJyArXG4gICAgICAgICAgICAgIGhlYXJ0YmVhdFRpbWVvdXQgK1xuICAgICAgICAgICAgICAnIG1pbGxpc2Vjb25kcy4gUmVjb25uZWN0aW5nLidcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY2FuY2VsRnVuY3Rpb24oKVxuICAgICAgICBjYW5jZWxGdW5jdGlvbiA9IHVuZGVmaW5lZFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FzQWN0aXZpdHkgPSBmYWxzZVxuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgb25UaW1lb3V0KClcbiAgICAgICAgfSwgaGVhcnRiZWF0VGltZW91dClcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHdhc0FjdGl2aXR5ID0gZmFsc2VcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBvblRpbWVvdXQoKVxuICAgIH0sIGhlYXJ0YmVhdFRpbWVvdXQpXG5cbiAgICBjdXJyZW50U3RhdGUgPSBDT05ORUNUSU5HXG4gICAgZGF0YUJ1ZmZlciA9ICcnXG4gICAgZXZlbnRUeXBlQnVmZmVyID0gJydcbiAgICBsYXN0RXZlbnRJZEJ1ZmZlciA9IGxhc3RFdmVudElkXG4gICAgdGV4dEJ1ZmZlciA9ICcnXG4gICAgZmllbGRTdGFydCA9IDBcbiAgICB2YWx1ZVN0YXJ0ID0gMFxuICAgIHN0YXRlID0gRklFTERfU1RBUlRcblxuICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTQyODkxNlxuICAgIC8vIFJlcXVlc3QgaGVhZGVyIGZpZWxkIExhc3QtRXZlbnQtSUQgaXMgbm90IGFsbG93ZWQgYnkgQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycy5cbiAgICB2YXIgcmVxdWVzdFVSTCA9IHVybFxuICAgIGlmICh1cmwuc2xpY2UoMCwgNSkgIT09ICdkYXRhOicgJiYgdXJsLnNsaWNlKDAsIDUpICE9PSAnYmxvYjonKSB7XG4gICAgICBpZiAobGFzdEV2ZW50SWQgIT09ICcnKSB7XG4gICAgICAgIHJlcXVlc3RVUkwgKz1cbiAgICAgICAgICAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICtcbiAgICAgICAgICAnbGFzdEV2ZW50SWQ9JyArXG4gICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGxhc3RFdmVudElkKVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgcmVxdWVzdEhlYWRlcnMgPSB7fVxuICAgIHJlcXVlc3RIZWFkZXJzWydBY2NlcHQnXSA9ICd0ZXh0L2V2ZW50LXN0cmVhbSdcbiAgICBpZiAoaGVhZGVycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsIG5hbWUpKSB7XG4gICAgICAgICAgcmVxdWVzdEhlYWRlcnNbbmFtZV0gPSBoZWFkZXJzW25hbWVdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zcG9ydC5vcGVuKFxuICAgICAgICB4aHIsXG4gICAgICAgIG9uU3RhcnQsXG4gICAgICAgIG9uUHJvZ3Jlc3MsXG4gICAgICAgIG9uRmluaXNoLFxuICAgICAgICByZXF1ZXN0VVJMLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgIHJlcXVlc3RIZWFkZXJzXG4gICAgICApXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNsb3NlKClcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgZXMudXJsID0gdXJsXG4gIGVzLnJlYWR5U3RhdGUgPSBDT05ORUNUSU5HXG4gIGVzLndpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFsc1xuICBlcy5fY2xvc2UgPSBjbG9zZVxuXG4gIG9uVGltZW91dCgpXG59XG5cbkV2ZW50U291cmNlUG9seWZpbGwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudFRhcmdldC5wcm90b3R5cGUpXG5FdmVudFNvdXJjZVBvbHlmaWxsLnByb3RvdHlwZS5DT05ORUNUSU5HID0gQ09OTkVDVElOR1xuRXZlbnRTb3VyY2VQb2x5ZmlsbC5wcm90b3R5cGUuT1BFTiA9IE9QRU5cbkV2ZW50U291cmNlUG9seWZpbGwucHJvdG90eXBlLkNMT1NFRCA9IENMT1NFRFxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuX2Nsb3NlKClcbn1cblxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5DT05ORUNUSU5HID0gQ09OTkVDVElOR1xuRXZlbnRTb3VyY2VQb2x5ZmlsbC5PUEVOID0gT1BFTlxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5DTE9TRUQgPSBDTE9TRURcbkV2ZW50U291cmNlUG9seWZpbGwucHJvdG90eXBlLndpdGhDcmVkZW50aWFscyA9IHVuZGVmaW5lZFxuXG5leHBvcnQgZGVmYXVsdCBFdmVudFNvdXJjZVBvbHlmaWxsXG4iLCIvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIE5leHQuanMnIG5vLUZPVUMgc3R5bGVzIHdvcmthcm91bmQgZm9yIHVzaW5nXG4vLyBgc3R5bGUtbG9hZGVyYCBpbiBkZXZlbG9wbWVudC4gSXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGh5ZHJhdGlvbiwgb3IgZWxzZVxuLy8gcmVuZGVyaW5nIHdvbid0IGhhdmUgdGhlIGNvcnJlY3QgY29tcHV0ZWQgdmFsdWVzIGluIGVmZmVjdHMuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGxheUNvbnRlbnQoY2FsbGJhY2spIHtcbiAgOyh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHNldFRpbWVvdXQpKGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKFxuICAgICAgdmFyIHggPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1uZXh0LWhpZGUtZm91Y10nKSwgaSA9IHgubGVuZ3RoO1xuICAgICAgaS0tO1xuXG4gICAgKSB7XG4gICAgICB4W2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeFtpXSlcbiAgICB9XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgfVxuICB9KVxufVxuIiwiLyogZ2xvYmFsIGxvY2F0aW9uICovXG5pbXBvcnQgeyBnZXRFdmVudFNvdXJjZVdyYXBwZXIgfSBmcm9tICcuL2Vycm9yLW92ZXJsYXkvZXZlbnRzb3VyY2UnXG5cbmxldCBldnRTb3VyY2VcbmV4cG9ydCBsZXQgY3VycmVudFBhZ2VcblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlUGluZygpIHtcbiAgaWYgKGV2dFNvdXJjZSkgZXZ0U291cmNlLmNsb3NlKClcbiAgZXZ0U291cmNlID0gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQaW5nKGFzc2V0UHJlZml4LCBwYXRobmFtZUZuLCByZXRyeSkge1xuICBjb25zdCBwYXRobmFtZSA9IHBhdGhuYW1lRm4oKVxuXG4gIC8vIE1ha2Ugc3VyZSB0byBvbmx5IGNyZWF0ZSBuZXcgRXZlbnRTb3VyY2UgcmVxdWVzdCBpZiBwYWdlIGhhcyBjaGFuZ2VkXG4gIGlmIChwYXRobmFtZSA9PT0gY3VycmVudFBhZ2UgJiYgIXJldHJ5KSByZXR1cm5cbiAgY3VycmVudFBhZ2UgPSBwYXRobmFtZVxuICAvLyBjbG9zZSBjdXJyZW50IEV2ZW50U291cmNlIGNvbm5lY3Rpb25cbiAgY2xvc2VQaW5nKClcblxuICBjb25zdCB1cmwgPSBgJHthc3NldFByZWZpeH0vX25leHQvd2VicGFjay1obXI/cGFnZT0ke2N1cnJlbnRQYWdlfWBcbiAgZXZ0U291cmNlID0gZ2V0RXZlbnRTb3VyY2VXcmFwcGVyKHsgcGF0aDogdXJsLCB0aW1lb3V0OiA1MDAwLCBvbmRlbWFuZDogMSB9KVxuXG4gIGV2dFNvdXJjZS5hZGRNZXNzYWdlTGlzdGVuZXIoKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmRhdGEuaW5kZXhPZigneycpID09PSAtMSkgcmV0dXJuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpXG4gICAgICBpZiAocGF5bG9hZC5pbnZhbGlkKSB7XG4gICAgICAgIC8vIFBheWxvYWQgY2FuIGJlIGludmFsaWQgZXZlbiBpZiB0aGUgcGFnZSBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgLy8gU28sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGV4aXN0cyBiZWZvcmUgcmVsb2FkaW5nLlxuICAgICAgICBmZXRjaChsb2NhdGlvbi5ocmVmLCB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgIH0pLnRoZW4oKHBhZ2VSZXMpID0+IHtcbiAgICAgICAgICBpZiAocGFnZVJlcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdvbi1kZW1hbmQtZW50cmllcyBmYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UnLCBlcnIpXG4gICAgfVxuICB9KVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gODgwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG5cblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX19uY2N3cGNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHR2YXIgdGhyZXcgPSB0cnVlO1xuLyoqKioqKi8gXHRcdHRyeSB7XG4vKioqKioqLyBcdFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX25jY3dwY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovIFx0XHRcdHRocmV3ID0gZmFsc2U7XG4vKioqKioqLyBcdFx0fSBmaW5hbGx5IHtcbi8qKioqKiovIFx0XHRcdGlmKHRocmV3KSBkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCAqL1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0X19uY2N3cGNrX3JlcXVpcmVfXy5hYiA9IF9fZGlybmFtZSArIFwiL1wiOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX25jY3dwY2tfcmVxdWlyZV9fKDg4MCk7XG4vKioqKioqLyB9KSgpXG47IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgcnVudGltZSA9IChmdW5jdGlvbiAoZXhwb3J0cykge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIGZ1bmN0aW9uIGRlZmluZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfVxuICB0cnkge1xuICAgIC8vIElFIDggaGFzIGEgYnJva2VuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0aGF0IG9ubHkgd29ya3Mgb24gRE9NIG9iamVjdHMuXG4gICAgZGVmaW5lKHt9LCBcIlwiKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgZGVmaW5lID0gZnVuY3Rpb24ob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqW2tleV0gPSB2YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgZXhwb3J0cy53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBkZWZpbmUoXG4gICAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUsXG4gICAgdG9TdHJpbmdUYWdTeW1ib2wsXG4gICAgXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICk7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgZGVmaW5lKHByb3RvdHlwZSwgbWV0aG9kLCBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIGV4cG9ydHMubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgZGVmaW5lKGdlbkZ1biwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yRnVuY3Rpb25cIik7XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIGV4cG9ydHMuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvciwgUHJvbWlzZUltcGwpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZUltcGwoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZXhwb3J0cy5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgZXhwb3J0cy5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0LCBQcm9taXNlSW1wbCkge1xuICAgIGlmIChQcm9taXNlSW1wbCA9PT0gdm9pZCAwKSBQcm9taXNlSW1wbCA9IFByb21pc2U7XG5cbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCksXG4gICAgICBQcm9taXNlSW1wbFxuICAgICk7XG5cbiAgICByZXR1cm4gZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgLy8gTm90ZTogW1wicmV0dXJuXCJdIG11c3QgYmUgdXNlZCBmb3IgRVMzIHBhcnNpbmcgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yW1wicmV0dXJuXCJdKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgZGVmaW5lKEdwLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JcIik7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgZXhwb3J0cy5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIGV4cG9ydHMudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG5cbiAgLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZVxuICAvLyBvciBub3QsIHJldHVybiB0aGUgcnVudGltZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGUgdmFyaWFibGVcbiAgLy8gcmVnZW5lcmF0b3JSdW50aW1lIGluIHRoZSBvdXRlciBzY29wZSwgd2hpY2ggYWxsb3dzIHRoaXMgbW9kdWxlIHRvIGJlXG4gIC8vIGluamVjdGVkIGVhc2lseSBieSBgYmluL3JlZ2VuZXJhdG9yIC0taW5jbHVkZS1ydW50aW1lIHNjcmlwdC5qc2AuXG4gIHJldHVybiBleHBvcnRzO1xuXG59KFxuICAvLyBJZiB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGUsIHVzZSBtb2R1bGUuZXhwb3J0c1xuICAvLyBhcyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIG5hbWVzcGFjZS4gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBlbXB0eVxuICAvLyBvYmplY3QuIEVpdGhlciB3YXksIHRoZSByZXN1bHRpbmcgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplXG4gIC8vIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgdmFyaWFibGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUuZXhwb3J0cyA6IHt9XG4pKTtcblxudHJ5IHtcbiAgcmVnZW5lcmF0b3JSdW50aW1lID0gcnVudGltZTtcbn0gY2F0Y2ggKGFjY2lkZW50YWxTdHJpY3RNb2RlKSB7XG4gIC8vIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgcnVubmluZyBpbiBzdHJpY3QgbW9kZSwgc28gdGhlIGFib3ZlXG4gIC8vIGFzc2lnbm1lbnQgc2hvdWxkIGFsd2F5cyB3b3JrIHVubGVzcyBzb21ldGhpbmcgaXMgbWlzY29uZmlndXJlZC4gSnVzdFxuICAvLyBpbiBjYXNlIHJ1bnRpbWUuanMgYWNjaWRlbnRhbGx5IHJ1bnMgaW4gc3RyaWN0IG1vZGUsIHdlIGNhbiBlc2NhcGVcbiAgLy8gc3RyaWN0IG1vZGUgdXNpbmcgYSBnbG9iYWwgRnVuY3Rpb24gY2FsbC4gVGhpcyBjb3VsZCBjb25jZWl2YWJseSBmYWlsXG4gIC8vIGlmIGEgQ29udGVudCBTZWN1cml0eSBQb2xpY3kgZm9yYmlkcyB1c2luZyBGdW5jdGlvbiwgYnV0IGluIHRoYXQgY2FzZVxuICAvLyB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGUgYWNjaWRlbnRhbCBzdHJpY3QgbW9kZSBwcm9ibGVtLiBJZlxuICAvLyB5b3UndmUgbWlzY29uZmlndXJlZCB5b3VyIGJ1bmRsZXIgdG8gZm9yY2Ugc3RyaWN0IG1vZGUgYW5kIGFwcGxpZWQgYVxuICAvLyBDU1AgdG8gZm9yYmlkIEZ1bmN0aW9uLCBhbmQgeW91J3JlIG5vdCB3aWxsaW5nIHRvIGZpeCBlaXRoZXIgb2YgdGhvc2VcbiAgLy8gcHJvYmxlbXMsIHBsZWFzZSBkZXRhaWwgeW91ciB1bmlxdWUgcHJlZGljYW1lbnQgaW4gYSBHaXRIdWIgaXNzdWUuXG4gIEZ1bmN0aW9uKFwiclwiLCBcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikocnVudGltZSk7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/.next/static/chunks/main.js b/.next/static/chunks/main.js new file mode 100644 index 0000000..236338f --- /dev/null +++ b/.next/static/chunks/main.js @@ -0,0 +1,47362 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["main"],{ + +/***/ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayLikeToArray.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +module.exports = _arrayLikeToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/arrayWithHoles.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayWithHoles.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +module.exports = _arrayWithHoles; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js"); + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); +} + +module.exports = _arrayWithoutHoles; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/assertThisInitialized.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +module.exports = _assertThisInitialized; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/asyncToGenerator.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + + _next(undefined); + }); + }; +} + +module.exports = _asyncToGenerator; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +module.exports = _classCallCheck; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/construct.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/construct.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); + +var isNativeReflectConstruct = __webpack_require__(/*! ./isNativeReflectConstruct */ "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js"); + +function _construct(Parent, args, Class) { + if (isNativeReflectConstruct()) { + module.exports = _construct = Reflect.construct; + } else { + module.exports = _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); +} + +module.exports = _construct; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/createClass.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/createClass.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +module.exports = _createClass; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/extends.js": +/*!********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/extends.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _extends() { + module.exports = _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); +} + +module.exports = _extends; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/getPrototypeOf.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _getPrototypeOf(o) { + module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +module.exports = _getPrototypeOf; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/inherits.js": +/*!*********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/inherits.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) setPrototypeOf(subClass, superClass); +} + +module.exports = _inherits; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireWildcard.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +module.exports = _interopRequireWildcard; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js ***! + \*************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); + return true; + } catch (e) { + return false; + } +} + +module.exports = _isNativeReflectConstruct; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/iterableToArray.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/iterableToArray.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); +} + +module.exports = _iterableToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; +} + +module.exports = _iterableToArrayLimit; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/nonIterableRest.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/nonIterableRest.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +module.exports = _nonIterableRest; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/nonIterableSpread.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/nonIterableSpread.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +module.exports = _nonIterableSpread; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); + +var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + + return assertThisInitialized(self); +} + +module.exports = _possibleConstructorReturn; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _setPrototypeOf(o, p) { + module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +module.exports = _setPrototypeOf; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/slicedToArray.js": +/*!**************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/slicedToArray.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayWithHoles = __webpack_require__(/*! ./arrayWithHoles */ "./node_modules/@babel/runtime/helpers/arrayWithHoles.js"); + +var iterableToArrayLimit = __webpack_require__(/*! ./iterableToArrayLimit */ "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js"); + +var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray */ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js"); + +var nonIterableRest = __webpack_require__(/*! ./nonIterableRest */ "./node_modules/@babel/runtime/helpers/nonIterableRest.js"); + +function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); +} + +module.exports = _slicedToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/toConsumableArray.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/toConsumableArray.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js"); + +var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "./node_modules/@babel/runtime/helpers/iterableToArray.js"); + +var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray */ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js"); + +var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "./node_modules/@babel/runtime/helpers/nonIterableSpread.js"); + +function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); +} + +module.exports = _toConsumableArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/typeof.js": +/*!*******************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +module.exports = _typeof; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js"); + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); +} + +module.exports = _unsupportedIterableToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/regenerator/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/regenerator/index.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js"); + + +/***/ }), + +/***/ "./node_modules/@next/polyfill-module/dist/polyfill-module.js": +/*!********************************************************************!*\ + !*** ./node_modules/@next/polyfill-module/dist/polyfill-module.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +"trimStart"in String.prototype||(String.prototype.trimStart=String.prototype.trimLeft),"trimEnd"in String.prototype||(String.prototype.trimEnd=String.prototype.trimRight),"description"in Symbol.prototype||Object.defineProperty(Symbol.prototype,"description",{configurable:!0,get:function(){var t=/\((.*)\)/.exec(this.toString());return t?t[1]:void 0}}),Array.prototype.flat||(Array.prototype.flat=function(t,r){return r=this.concat.apply([],this),t>1&&r.some(Array.isArray)?r.flat(t-1):r},Array.prototype.flatMap=function(t,r){return this.map(t,r).flat()}),Promise.prototype.finally||(Promise.prototype.finally=function(t){if("function"!=typeof t)return this.then(t,t);var r=this.constructor||Promise;return this.then(function(o){return r.resolve(t()).then(function(){return o})},function(o){return r.resolve(t()).then(function(){throw o})})}); + + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/client.js": +/*!************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/client.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var Bus = __importStar(__webpack_require__(/*! ./internal/bus */ "./node_modules/@next/react-dev-overlay/lib/internal/bus.js")); +var parseStack_1 = __webpack_require__(/*! ./internal/helpers/parseStack */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/parseStack.js"); +var isRegistered = false; +var stackTraceLimit = undefined; +function onUnhandledError(ev) { + var error = ev === null || ev === void 0 ? void 0 : ev.error; + if (!error || !(error instanceof Error) || typeof error.stack !== 'string') { + // A non-error was thrown, we don't have anything to show. :-( + return; + } + var e = error; + Bus.emit({ + type: Bus.TYPE_UNHANDLED_ERROR, + reason: error, + frames: parseStack_1.parseStack(e.stack) + }); +} +function onUnhandledRejection(ev) { + var reason = ev === null || ev === void 0 ? void 0 : ev.reason; + if (!reason || + !(reason instanceof Error) || + typeof reason.stack !== 'string') { + // A non-error was thrown, we don't have anything to show. :-( + return; + } + var e = reason; + Bus.emit({ + type: Bus.TYPE_UNHANDLED_REJECTION, + reason: reason, + frames: parseStack_1.parseStack(e.stack) + }); +} +function register() { + if (isRegistered) { + return; + } + isRegistered = true; + try { + var limit = Error.stackTraceLimit; + Error.stackTraceLimit = 50; + stackTraceLimit = limit; + } + catch (_a) { } + window.addEventListener('error', onUnhandledError); + window.addEventListener('unhandledrejection', onUnhandledRejection); +} +exports.register = register; +function unregister() { + if (!isRegistered) { + return; + } + isRegistered = false; + if (stackTraceLimit !== undefined) { + try { + Error.stackTraceLimit = stackTraceLimit; + } + catch (_a) { } + stackTraceLimit = undefined; + } + window.removeEventListener('error', onUnhandledError); + window.removeEventListener('unhandledrejection', onUnhandledRejection); +} +exports.unregister = unregister; +function onBuildOk() { + Bus.emit({ type: Bus.TYPE_BUILD_OK }); +} +exports.onBuildOk = onBuildOk; +function onBuildError(message) { + Bus.emit({ type: Bus.TYPE_BUILD_ERROR, message: message }); +} +exports.onBuildError = onBuildError; +function onRefresh() { + Bus.emit({ type: Bus.TYPE_REFFRESH }); +} +exports.onRefresh = onRefresh; +var nodeStackFrames_1 = __webpack_require__(/*! ./internal/helpers/nodeStackFrames */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/nodeStackFrames.js"); +exports.getNodeError = nodeStackFrames_1.getNodeError; +var ReactDevOverlay_1 = __webpack_require__(/*! ./internal/ReactDevOverlay */ "./node_modules/@next/react-dev-overlay/lib/internal/ReactDevOverlay.js"); +exports.ReactDevOverlay = ReactDevOverlay_1["default"]; +//# sourceMappingURL=client.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/ErrorBoundary.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/ErrorBoundary.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +exports.__esModule = true; +var react_1 = __importDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var ErrorBoundary = /** @class */ (function (_super) { + __extends(ErrorBoundary, _super); + function ErrorBoundary() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.state = { error: null }; + return _this; + } + ErrorBoundary.prototype.componentDidCatch = function (error, + // Loosely typed because it depends on the React version and was + // accidentally excluded in some versions. + errorInfo) { + this.props.onError(error, (errorInfo === null || errorInfo === void 0 ? void 0 : errorInfo.componentStack) || null); + this.setState({ error: error }); + }; + ErrorBoundary.prototype.render = function () { + return this.state.error + ? // The component has to be unmounted or else it would continue to error + null + : this.props.children; + }; + return ErrorBoundary; +}(react_1["default"].PureComponent)); +exports.ErrorBoundary = ErrorBoundary; +//# sourceMappingURL=ErrorBoundary.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/ReactDevOverlay.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/ReactDevOverlay.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __spread = (this && this.__spread) || function () { + for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); + return ar; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var Bus = __importStar(__webpack_require__(/*! ./bus */ "./node_modules/@next/react-dev-overlay/lib/internal/bus.js")); +var ShadowPortal_1 = __webpack_require__(/*! ./components/ShadowPortal */ "./node_modules/@next/react-dev-overlay/lib/internal/components/ShadowPortal.js"); +var Errors_1 = __webpack_require__(/*! ./container/Errors */ "./node_modules/@next/react-dev-overlay/lib/internal/container/Errors.js"); +var BuildError_1 = __webpack_require__(/*! ./container/BuildError */ "./node_modules/@next/react-dev-overlay/lib/internal/container/BuildError.js"); +var ErrorBoundary_1 = __webpack_require__(/*! ./ErrorBoundary */ "./node_modules/@next/react-dev-overlay/lib/internal/ErrorBoundary.js"); +var Base_1 = __webpack_require__(/*! ./styles/Base */ "./node_modules/@next/react-dev-overlay/lib/internal/styles/Base.js"); +var ComponentStyles_1 = __webpack_require__(/*! ./styles/ComponentStyles */ "./node_modules/@next/react-dev-overlay/lib/internal/styles/ComponentStyles.js"); +var CssReset_1 = __webpack_require__(/*! ./styles/CssReset */ "./node_modules/@next/react-dev-overlay/lib/internal/styles/CssReset.js"); +function reducer(state, ev) { + switch (ev.type) { + case Bus.TYPE_BUILD_OK: { + return __assign(__assign({}, state), { buildError: null }); + } + case Bus.TYPE_BUILD_ERROR: { + return __assign(__assign({}, state), { buildError: ev.message }); + } + case Bus.TYPE_REFFRESH: { + return __assign(__assign({}, state), { buildError: null, errors: [] }); + } + case Bus.TYPE_UNHANDLED_ERROR: + case Bus.TYPE_UNHANDLED_REJECTION: { + return __assign(__assign({}, state), { nextId: state.nextId + 1, errors: __spread(state.errors, [{ id: state.nextId, event: ev }]) }); + } + default: { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var _1 = ev; + return state; + } + } +} +var ReactDevOverlay = function ReactDevOverlay(_a) { + var children = _a.children; + var _b = __read(React.useReducer(reducer, { nextId: 1, buildError: null, errors: [] }), 2), state = _b[0], dispatch = _b[1]; + React.useEffect(function () { + Bus.on(dispatch); + return function () { + Bus.off(dispatch); + }; + }, [dispatch]); + var onComponentError = React.useCallback(function (_error, _componentStack) { + // TODO: special handling + }, []); + var hasBuildError = state.buildError != null; + var hasRuntimeErrors = Boolean(state.errors.length); + var isMounted = hasBuildError || hasRuntimeErrors; + return (React.createElement(React.Fragment, null, + React.createElement(ErrorBoundary_1.ErrorBoundary, { onError: onComponentError }, children !== null && children !== void 0 ? children : null), + isMounted ? (React.createElement(ShadowPortal_1.ShadowPortal, null, + React.createElement(CssReset_1.CssReset, null), + React.createElement(Base_1.Base, null), + React.createElement(ComponentStyles_1.ComponentStyles, null), + hasBuildError ? (React.createElement(BuildError_1.BuildError, { message: state.buildError })) : hasRuntimeErrors ? (React.createElement(Errors_1.Errors, { errors: state.errors })) : undefined)) : undefined)); +}; +exports["default"] = ReactDevOverlay; +//# sourceMappingURL=ReactDevOverlay.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/bus.js": +/*!******************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/bus.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +exports.TYPE_BUILD_OK = 'build-ok'; +exports.TYPE_BUILD_ERROR = 'build-error'; +exports.TYPE_REFFRESH = 'fast-refresh'; +exports.TYPE_UNHANDLED_ERROR = 'unhandled-error'; +exports.TYPE_UNHANDLED_REJECTION = 'unhandled-rejection'; +var handlers = new Set(); +var queue = []; +function drain() { + // Draining should never happen synchronously in case multiple handlers are + // registered. + setTimeout(function () { + var _loop_1 = function () { + var ev = queue.shift(); + handlers.forEach(function (handler) { return handler(ev); }); + }; + while ( + // Until we are out of events: + Boolean(queue.length) && + // Or, if all handlers removed themselves as a result of handling the + // event(s) + Boolean(handlers.size)) { + _loop_1(); + } + }, 1); +} +function emit(ev) { + queue.push(Object.freeze(__assign({}, ev))); + drain(); +} +exports.emit = emit; +function on(fn) { + if (handlers.has(fn)) { + return false; + } + handlers.add(fn); + drain(); + return true; +} +exports.on = on; +function off(fn) { + if (handlers.has(fn)) { + handlers["delete"](fn); + return true; + } + return false; +} +exports.off = off; +//# sourceMappingURL=bus.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/CodeFrame.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/CodeFrame.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var anser_1 = __importDefault(__webpack_require__(/*! anser */ "./node_modules/anser/lib/index.js")); +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var strip_ansi_1 = __importDefault(__webpack_require__(/*! strip-ansi */ "./node_modules/@next/react-dev-overlay/node_modules/strip-ansi/index.js")); +var stack_frame_1 = __webpack_require__(/*! ../../helpers/stack-frame */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/stack-frame.js"); +exports.CodeFrame = function CodeFrame(_a) { + var stackFrame = _a.stackFrame, codeFrame = _a.codeFrame; + // Strip leading spaces out of the code frame: + var formattedFrame = React.useMemo(function () { + var lines = codeFrame.split(/\r?\n/g); + var prefixLength = lines + .map(function (line) { return /^>? +\d+ +\| ( *)/.exec(strip_ansi_1["default"](line)); }) + .filter(Boolean) + .map(function (v) { return v.pop(); }) + .reduce(function (c, n) { return (isNaN(c) ? n.length : Math.min(c, n.length)); }, NaN); + if (prefixLength > 1) { + var p_1 = ' '.repeat(prefixLength); + return lines + .map(function (line, a) { + return ~(a = line.indexOf('|')) + ? line.substring(0, a) + line.substring(a).replace(p_1, '') + : line; + }) + .join('\n'); + } + return lines.join('\n'); + }, [codeFrame]); + var decoded = React.useMemo(function () { + return anser_1["default"].ansiToJson(formattedFrame, { + json: true, + use_classes: true, + remove_empty: true + }); + }, [formattedFrame]); + var open = React.useCallback(function () { + var _a; + var params = new URLSearchParams(); + for (var key in stackFrame) { + params.append(key, ((_a = stackFrame[key]) !== null && _a !== void 0 ? _a : '').toString()); + } + self + .fetch(( false || '') + "/__nextjs_launch-editor?" + params.toString()) + .then(function () { }, function () { + // TODO: report error + }); + }, [stackFrame]); + // TODO: make the caret absolute + return (React.createElement("div", { "data-nextjs-codeframe": true }, + React.createElement("p", { role: "link", onClick: open, tabIndex: 1, title: "Click to open in your editor" }, + React.createElement("span", null, + stack_frame_1.getFrameSource(stackFrame), + " @ ", + stackFrame.methodName), + React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, + React.createElement("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }), + React.createElement("polyline", { points: "15 3 21 3 21 9" }), + React.createElement("line", { x1: "10", y1: "14", x2: "21", y2: "3" }))), + React.createElement("hr", null), + React.createElement("pre", null, decoded.map(function (entry, index) { return (React.createElement("span", { key: "frame-" + index, style: __assign({ color: entry.fg ? "var(--color-" + entry.fg + ")" : undefined }, (entry.decoration === 'bold' + ? { fontWeight: 800 } + : entry.decoration === 'italic' + ? { fontStyle: 'italic' } + : undefined)) }, entry.content)); })))); +}; +//# sourceMappingURL=CodeFrame.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/index.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/index.js ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var CodeFrame_1 = __webpack_require__(/*! ./CodeFrame */ "./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/CodeFrame.js"); +exports.CodeFrame = CodeFrame_1.CodeFrame; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/styles.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/styles.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +exports.__esModule = true; +var noop_template_1 = __webpack_require__(/*! ../../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n [data-nextjs-codeframe] {\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-codeframe]::selection,\n [data-nextjs-codeframe] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-codeframe] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n\n [data-nextjs-codeframe] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n [data-nextjs-codeframe] > hr {\n margin: 0;\n padding: 0;\n\n border: none;\n border-style: solid;\n border-width: 0;\n border-bottom-width: 1px;\n border-color: var(--color-ansi-bright-black);\n }\n\n [data-nextjs-codeframe] > p {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n }\n [data-nextjs-codeframe] > p:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-codeframe] > p > svg {\n width: auto;\n height: 1em;\n margin-left: 8px;\n }\n"], ["\n [data-nextjs-codeframe] {\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-codeframe]::selection,\n [data-nextjs-codeframe] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-codeframe] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n\n [data-nextjs-codeframe] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n [data-nextjs-codeframe] > hr {\n margin: 0;\n padding: 0;\n\n border: none;\n border-style: solid;\n border-width: 0;\n border-bottom-width: 1px;\n border-color: var(--color-ansi-bright-black);\n }\n\n [data-nextjs-codeframe] > p {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n }\n [data-nextjs-codeframe] > p:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-codeframe] > p > svg {\n width: auto;\n height: 1em;\n margin-left: 8px;\n }\n"]))); +exports.styles = styles; +var templateObject_1; +//# sourceMappingURL=styles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/Dialog.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/Dialog.js ***! + \***************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var use_on_click_outside_1 = __webpack_require__(/*! ../../hooks/use-on-click-outside */ "./node_modules/@next/react-dev-overlay/lib/internal/hooks/use-on-click-outside.js"); +var Dialog = function Dialog(_a) { + var children = _a.children, type = _a.type, onClose = _a.onClose, props = __rest(_a, ["children", "type", "onClose"]); + var _b = __read(React.useState(null), 2), dialog = _b[0], setDialog = _b[1]; + var onDialog = React.useCallback(function (node) { + setDialog(node); + }, []); + use_on_click_outside_1.useOnClickOutside(dialog, onClose); + // Make HTMLElements with `role=link` accessible to be triggered by the + // keyboard, i.e. [Enter]. + React.useEffect(function () { + if (dialog == null) { + return; + } + var root = dialog.getRootNode(); + // Always true, but we do this for TypeScript: + if (!(root instanceof ShadowRoot)) { + return; + } + var shadowRoot = root; + function handler(e) { + var el = shadowRoot.activeElement; + if (e.key === 'Enter' && + el instanceof HTMLElement && + el.getAttribute('role') === 'link') { + e.preventDefault(); + e.stopPropagation(); + el.click(); + } + } + shadowRoot.addEventListener('keydown', handler); + return function () { + return shadowRoot.removeEventListener('keydown', handler); + }; + }, [dialog]); + return (React.createElement("div", { ref: onDialog, "data-nextjs-dialog": true, tabIndex: -1, role: "dialog", "aria-labelledby": props['aria-labelledby'], "aria-describedby": props['aria-describedby'], "aria-modal": "true" }, + React.createElement("div", { "data-nextjs-dialog-banner": true, className: "banner-" + type }), + children)); +}; +exports.Dialog = Dialog; +//# sourceMappingURL=Dialog.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogBody.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogBody.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var DialogBody = function DialogBody(_a) { + var children = _a.children, className = _a.className; + return (React.createElement("div", { "data-nextjs-dialog-body": true, className: className }, children)); +}; +exports.DialogBody = DialogBody; +//# sourceMappingURL=DialogBody.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogContent.js": +/*!**********************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogContent.js ***! + \**********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var DialogContent = function DialogContent(_a) { + var children = _a.children, className = _a.className; + return (React.createElement("div", { "data-nextjs-dialog-content": true, className: className }, children)); +}; +exports.DialogContent = DialogContent; +//# sourceMappingURL=DialogContent.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogHeader.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogHeader.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var DialogHeader = function DialogHeader(_a) { + var children = _a.children, className = _a.className; + return (React.createElement("div", { "data-nextjs-dialog-header": true, className: className }, children)); +}; +exports.DialogHeader = DialogHeader; +//# sourceMappingURL=DialogHeader.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/index.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/index.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var Dialog_1 = __webpack_require__(/*! ./Dialog */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/Dialog.js"); +exports.Dialog = Dialog_1.Dialog; +var DialogBody_1 = __webpack_require__(/*! ./DialogBody */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogBody.js"); +exports.DialogBody = DialogBody_1.DialogBody; +var DialogContent_1 = __webpack_require__(/*! ./DialogContent */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogContent.js"); +exports.DialogContent = DialogContent_1.DialogContent; +var DialogHeader_1 = __webpack_require__(/*! ./DialogHeader */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/DialogHeader.js"); +exports.DialogHeader = DialogHeader_1.DialogHeader; +var styles_1 = __webpack_require__(/*! ./styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/styles.js"); +exports.styles = styles_1.styles; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/styles.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/styles.js ***! + \***************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +exports.__esModule = true; +var noop_template_1 = __webpack_require__(/*! ../../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n [data-nextjs-dialog] {\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n outline: none;\n background: white;\n border-radius: var(--size-gap);\n box-shadow: 0 var(--size-gap-half) var(--size-gap-double)\n rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 56px);\n overflow-y: hidden;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n max-height: calc(100% - 15px);\n }\n }\n\n @media (min-width: 576px) {\n [data-nextjs-dialog] {\n max-width: 540px;\n box-shadow: 0 var(--size-gap) var(--size-gap-quad) rgba(0, 0, 0, 0.25);\n }\n }\n\n @media (min-width: 768px) {\n [data-nextjs-dialog] {\n max-width: 720px;\n }\n }\n\n @media (min-width: 992px) {\n [data-nextjs-dialog] {\n max-width: 960px;\n }\n }\n\n [data-nextjs-dialog-banner] {\n position: relative;\n }\n [data-nextjs-dialog-banner].banner-warning {\n border-color: var(--color-ansi-yellow);\n }\n [data-nextjs-dialog-banner].banner-error {\n border-color: var(--color-ansi-red);\n }\n\n [data-nextjs-dialog-banner]::after {\n z-index: 2;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n /* banner width: */\n border-top-width: var(--size-gap-half);\n border-bottom-width: 0;\n border-top-style: solid;\n border-bottom-style: solid;\n border-top-color: inherit;\n border-bottom-color: transparent;\n }\n\n [data-nextjs-dialog-content] {\n overflow-y: auto;\n border: none;\n margin: 0;\n /* calc(padding + banner width offset) */\n padding: calc(var(--size-gap-double) + var(--size-gap-half))\n var(--size-gap-double);\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-header] {\n flex-shrink: 0;\n margin-bottom: var(--size-gap-double);\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-body] {\n position: relative;\n flex: 1 1 auto;\n }\n"], ["\n [data-nextjs-dialog] {\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n outline: none;\n background: white;\n border-radius: var(--size-gap);\n box-shadow: 0 var(--size-gap-half) var(--size-gap-double)\n rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 56px);\n overflow-y: hidden;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n max-height: calc(100% - 15px);\n }\n }\n\n @media (min-width: 576px) {\n [data-nextjs-dialog] {\n max-width: 540px;\n box-shadow: 0 var(--size-gap) var(--size-gap-quad) rgba(0, 0, 0, 0.25);\n }\n }\n\n @media (min-width: 768px) {\n [data-nextjs-dialog] {\n max-width: 720px;\n }\n }\n\n @media (min-width: 992px) {\n [data-nextjs-dialog] {\n max-width: 960px;\n }\n }\n\n [data-nextjs-dialog-banner] {\n position: relative;\n }\n [data-nextjs-dialog-banner].banner-warning {\n border-color: var(--color-ansi-yellow);\n }\n [data-nextjs-dialog-banner].banner-error {\n border-color: var(--color-ansi-red);\n }\n\n [data-nextjs-dialog-banner]::after {\n z-index: 2;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n /* banner width: */\n border-top-width: var(--size-gap-half);\n border-bottom-width: 0;\n border-top-style: solid;\n border-bottom-style: solid;\n border-top-color: inherit;\n border-bottom-color: transparent;\n }\n\n [data-nextjs-dialog-content] {\n overflow-y: auto;\n border: none;\n margin: 0;\n /* calc(padding + banner width offset) */\n padding: calc(var(--size-gap-double) + var(--size-gap-half))\n var(--size-gap-double);\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-header] {\n flex-shrink: 0;\n margin-bottom: var(--size-gap-double);\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-body] {\n position: relative;\n flex: 1 1 auto;\n }\n"]))); +exports.styles = styles; +var templateObject_1; +//# sourceMappingURL=styles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/LeftRightDialogHeader.js": +/*!*********************************************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/LeftRightDialogHeader.js ***! + \*********************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var LeftRightDialogHeader = function LeftRightDialogHeader(_a) { + var children = _a.children, className = _a.className, previous = _a.previous, next = _a.next, close = _a.close; + var buttonLeft = React.useRef(null); + var buttonRight = React.useRef(null); + var buttonClose = React.useRef(null); + var _b = __read(React.useState(null), 2), nav = _b[0], setNav = _b[1]; + var onNav = React.useCallback(function (el) { + setNav(el); + }, []); + React.useEffect(function () { + if (nav == null) { + return; + } + var root = nav.getRootNode(); + var d = self.document; + function handler(e) { + if (e.key === 'ArrowLeft') { + e.stopPropagation(); + if (buttonLeft.current) { + buttonLeft.current.focus(); + } + previous && previous(); + } + else if (e.key === 'ArrowRight') { + e.stopPropagation(); + if (buttonRight.current) { + buttonRight.current.focus(); + } + next && next(); + } + else if (e.key === 'Escape') { + e.stopPropagation(); + if (root instanceof ShadowRoot) { + var a = root.activeElement; + if (a && a !== buttonClose.current && a instanceof HTMLElement) { + a.blur(); + return; + } + } + if (close) { + close(); + } + } + } + root.addEventListener('keydown', handler); + if (root !== d) { + d.addEventListener('keydown', handler); + } + return function () { + root.removeEventListener('keydown', handler); + if (root !== d) { + d.removeEventListener('keydown', handler); + } + }; + }, [close, nav, next, previous]); + // Unlock focus for browsers like Firefox, that break all user focus if the + // currently focused item becomes disabled. + React.useEffect(function () { + if (nav == null) { + return; + } + var root = nav.getRootNode(); + // Always true, but we do this for TypeScript: + if (root instanceof ShadowRoot) { + var a = root.activeElement; + if (previous == null) { + if (buttonLeft.current && a === buttonLeft.current) { + buttonLeft.current.blur(); + } + } + else if (next == null) { + if (buttonRight.current && a === buttonRight.current) { + buttonRight.current.blur(); + } + } + } + }, [nav, next, previous]); + return (React.createElement("div", { "data-nextjs-dialog-left-right": true, className: className }, + React.createElement("nav", { ref: onNav }, + React.createElement("button", { ref: buttonLeft, type: "button", disabled: previous == null ? true : undefined, "aria-disabled": previous == null ? true : undefined, onClick: previous !== null && previous !== void 0 ? previous : undefined }, + React.createElement("svg", { viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, + React.createElement("path", { d: "M6.99996 1.16666L1.16663 6.99999L6.99996 12.8333M12.8333 6.99999H1.99996H12.8333Z", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }))), + React.createElement("button", { ref: buttonRight, type: "button", disabled: next == null ? true : undefined, "aria-disabled": next == null ? true : undefined, onClick: next !== null && next !== void 0 ? next : undefined }, + React.createElement("svg", { viewBox: "0 0 14 14", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, + React.createElement("path", { d: "M6.99996 1.16666L12.8333 6.99999L6.99996 12.8333M1.16663 6.99999H12H1.16663Z", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }))), + "\u00A0", + children), + close ? (React.createElement("button", { ref: buttonClose, type: "button", onClick: close, "aria-label": "Close" }, + React.createElement("span", { "aria-hidden": "true" }, + React.createElement("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, + React.createElement("path", { d: "M18 6L6 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }), + React.createElement("path", { d: "M6 6L18 18", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }))))) : null)); +}; +exports.LeftRightDialogHeader = LeftRightDialogHeader; +//# sourceMappingURL=LeftRightDialogHeader.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/index.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/index.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var LeftRightDialogHeader_1 = __webpack_require__(/*! ./LeftRightDialogHeader */ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/LeftRightDialogHeader.js"); +exports.LeftRightDialogHeader = LeftRightDialogHeader_1.LeftRightDialogHeader; +var styles_1 = __webpack_require__(/*! ./styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/styles.js"); +exports.styles = styles_1.styles; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/styles.js": +/*!******************************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/styles.js ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +exports.__esModule = true; +var noop_template_1 = __webpack_require__(/*! ../../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n [data-nextjs-dialog-left-right] {\n display: flex;\n flex-direction: row;\n align-content: center;\n align-items: center;\n justify-content: space-between;\n }\n [data-nextjs-dialog-left-right] > nav > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: calc(var(--size-gap-double) + var(--size-gap));\n height: calc(var(--size-gap-double) + var(--size-gap));\n font-size: 0;\n border: none;\n background-color: rgba(255, 85, 85, 0.1);\n color: var(--color-ansi-red);\n cursor: pointer;\n transition: background-color 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > nav > button > svg {\n width: auto;\n height: calc(var(--size-gap) + var(--size-gap-half));\n }\n [data-nextjs-dialog-left-right] > nav > button:hover {\n background-color: rgba(255, 85, 85, 0.2);\n }\n [data-nextjs-dialog-left-right] > nav > button:disabled {\n background-color: rgba(255, 85, 85, 0.1);\n color: rgba(255, 85, 85, 0.4);\n cursor: not-allowed;\n }\n\n [data-nextjs-dialog-left-right] > nav > button:first-of-type {\n border-radius: var(--size-gap-half) 0 0 var(--size-gap-half);\n margin-right: 1px;\n }\n [data-nextjs-dialog-left-right] > nav > button:last-of-type {\n border-radius: 0 var(--size-gap-half) var(--size-gap-half) 0;\n }\n\n [data-nextjs-dialog-left-right] > button:last-of-type {\n border: 0;\n padding: 0;\n\n background-color: transparent;\n appearance: none;\n\n opacity: 0.4;\n transition: opacity 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > button:last-of-type:hover {\n opacity: 0.7;\n }\n"], ["\n [data-nextjs-dialog-left-right] {\n display: flex;\n flex-direction: row;\n align-content: center;\n align-items: center;\n justify-content: space-between;\n }\n [data-nextjs-dialog-left-right] > nav > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: calc(var(--size-gap-double) + var(--size-gap));\n height: calc(var(--size-gap-double) + var(--size-gap));\n font-size: 0;\n border: none;\n background-color: rgba(255, 85, 85, 0.1);\n color: var(--color-ansi-red);\n cursor: pointer;\n transition: background-color 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > nav > button > svg {\n width: auto;\n height: calc(var(--size-gap) + var(--size-gap-half));\n }\n [data-nextjs-dialog-left-right] > nav > button:hover {\n background-color: rgba(255, 85, 85, 0.2);\n }\n [data-nextjs-dialog-left-right] > nav > button:disabled {\n background-color: rgba(255, 85, 85, 0.1);\n color: rgba(255, 85, 85, 0.4);\n cursor: not-allowed;\n }\n\n [data-nextjs-dialog-left-right] > nav > button:first-of-type {\n border-radius: var(--size-gap-half) 0 0 var(--size-gap-half);\n margin-right: 1px;\n }\n [data-nextjs-dialog-left-right] > nav > button:last-of-type {\n border-radius: 0 var(--size-gap-half) var(--size-gap-half) 0;\n }\n\n [data-nextjs-dialog-left-right] > button:last-of-type {\n border: 0;\n padding: 0;\n\n background-color: transparent;\n appearance: none;\n\n opacity: 0.4;\n transition: opacity 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > button:last-of-type:hover {\n opacity: 0.7;\n }\n"]))); +exports.styles = styles; +var templateObject_1; +//# sourceMappingURL=styles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/Overlay.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/Overlay.js ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +// @ts-ignore +var maintain__tab_focus_1 = __importDefault(__webpack_require__(/*! ./maintain--tab-focus */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/maintain--tab-focus.js")); +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var body_locker_1 = __webpack_require__(/*! ./body-locker */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/body-locker.js"); +var Overlay = function Overlay(_a) { + var className = _a.className, children = _a.children, fixed = _a.fixed; + React.useEffect(function () { + body_locker_1.lock(); + return function () { + body_locker_1.unlock(); + }; + }, []); + var _b = __read(React.useState(null), 2), overlay = _b[0], setOverlay = _b[1]; + var onOverlay = React.useCallback(function (el) { + setOverlay(el); + }, []); + React.useEffect(function () { + if (overlay == null) { + return; + } + var handle2 = maintain__tab_focus_1["default"]({ context: overlay }); + return function () { + handle2.disengage(); + }; + }, [overlay]); + return (React.createElement("div", { "data-nextjs-dialog-overlay": true, className: className, ref: onOverlay }, + React.createElement("div", { "data-nextjs-dialog-backdrop": true, "data-nextjs-dialog-backdrop-fixed": fixed ? true : undefined }), + children)); +}; +exports.Overlay = Overlay; +//# sourceMappingURL=Overlay.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/body-locker.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/body-locker.js ***! + \*********************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var previousBodyPaddingRight; +var previousBodyOverflowSetting; +var activeLocks = 0; +function lock() { + setTimeout(function () { + if (activeLocks++ > 0) { + return; + } + var scrollBarGap = window.innerWidth - document.documentElement.clientWidth; + if (scrollBarGap > 0) { + previousBodyPaddingRight = document.body.style.paddingRight; + document.body.style.paddingRight = scrollBarGap + "px"; + } + previousBodyOverflowSetting = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + }); +} +exports.lock = lock; +function unlock() { + setTimeout(function () { + if (activeLocks === 0 || --activeLocks !== 0) { + return; + } + if (previousBodyPaddingRight !== undefined) { + document.body.style.paddingRight = previousBodyPaddingRight; + previousBodyPaddingRight = undefined; + } + if (previousBodyOverflowSetting !== undefined) { + document.body.style.overflow = previousBodyOverflowSetting; + previousBodyOverflowSetting = undefined; + } + }); +} +exports.unlock = unlock; +//# sourceMappingURL=body-locker.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/index.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/index.js ***! + \***************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var Overlay_1 = __webpack_require__(/*! ./Overlay */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/Overlay.js"); +exports.Overlay = Overlay_1.Overlay; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/maintain--tab-focus.js": +/*!*****************************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/maintain--tab-focus.js ***! + \*****************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +// @ts-nocheck +// Copied from https://github.com/medialize/ally.js +// License: MIT +// Copyright (c) 2015 Rodney Rehm +// +// Entrypoint: ally.js/maintain/tab-focus +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +exports.__esModule = true; +var platform_1 = __importDefault(__webpack_require__(/*! platform */ "./node_modules/platform/platform.js")); +var css_escape_1 = __importDefault(__webpack_require__(/*! css.escape */ "./node_modules/css.escape/css.escape.js")); +// input may be undefined, selector-tring, Node, NodeList, HTMLCollection, array of Nodes +// yes, to some extent this is a bad replica of jQuery's constructor function +function nodeArray(input) { + if (!input) { + return []; + } + if (Array.isArray(input)) { + return input; + } + // instanceof Node - does not work with iframes + if (input.nodeType !== undefined) { + return [input]; + } + if (typeof input === 'string') { + input = document.querySelectorAll(input); + } + if (input.length !== undefined) { + return [].slice.call(input, 0); + } + throw new TypeError('unexpected input ' + String(input)); +} +function contextToElement(_ref) { + var context = _ref.context, _ref$label = _ref.label, label = _ref$label === undefined ? 'context-to-element' : _ref$label, resolveDocument = _ref.resolveDocument, defaultToDocument = _ref.defaultToDocument; + var element = nodeArray(context)[0]; + if (resolveDocument && element && element.nodeType === Node.DOCUMENT_NODE) { + element = element.documentElement; + } + if (!element && defaultToDocument) { + return document.documentElement; + } + if (!element) { + throw new TypeError(label + ' requires valid options.context'); + } + if (element.nodeType !== Node.ELEMENT_NODE && + element.nodeType !== Node.DOCUMENT_FRAGMENT_NODE) { + throw new TypeError(label + ' requires options.context to be an Element'); + } + return element; +} +function getShadowHost() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context; + var element = contextToElement({ + label: 'get/shadow-host', + context: context + }); + // walk up to the root + var container = null; + while (element) { + container = element; + element = element.parentNode; + } + // https://developer.mozilla.org/en-US/docs/Web/API/Node.nodeType + // NOTE: Firefox 34 does not expose ShadowRoot.host (but 37 does) + if (container.nodeType === container.DOCUMENT_FRAGMENT_NODE && + container.host) { + // the root is attached to a fragment node that has a host + return container.host; + } + return null; +} +function getDocument(node) { + if (!node) { + return document; + } + if (node.nodeType === Node.DOCUMENT_NODE) { + return node; + } + return node.ownerDocument || document; +} +function isActiveElement(context) { + var element = contextToElement({ + label: 'is/active-element', + resolveDocument: true, + context: context + }); + var _document = getDocument(element); + if (_document.activeElement === element) { + return true; + } + var shadowHost = getShadowHost({ context: element }); + if (shadowHost && shadowHost.shadowRoot.activeElement === element) { + return true; + } + return false; +} +// [elem, elem.parent, elem.parent.parent, …, html] +// will not contain the shadowRoot (DOCUMENT_FRAGMENT_NODE) and shadowHost +function getParents() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context; + var list = []; + var element = contextToElement({ + label: 'get/parents', + context: context + }); + while (element) { + list.push(element); + // IE does know support parentElement on SVGElement + element = element.parentNode; + if (element && element.nodeType !== Node.ELEMENT_NODE) { + element = null; + } + } + return list; +} +// Element.prototype.matches may be available at a different name +// https://developer.mozilla.org/en/docs/Web/API/Element/matches +var names = [ + 'matches', + 'webkitMatchesSelector', + 'mozMatchesSelector', + 'msMatchesSelector', +]; +var name = null; +function findMethodName(element) { + names.some(function (_name) { + if (!element[_name]) { + return false; + } + name = _name; + return true; + }); +} +function elementMatches(element, selector) { + if (!name) { + findMethodName(element); + } + return element[name](selector); +} +// deep clone of original platform +var platform = JSON.parse(JSON.stringify(platform_1["default"])); +// operating system +var os = platform.os.family || ''; +var ANDROID = os === 'Android'; +var WINDOWS = os.slice(0, 7) === 'Windows'; +var OSX = os === 'OS X'; +var IOS = os === 'iOS'; +// layout +var BLINK = platform.layout === 'Blink'; +var GECKO = platform.layout === 'Gecko'; +var TRIDENT = platform.layout === 'Trident'; +var EDGE = platform.layout === 'EdgeHTML'; +var WEBKIT = platform.layout === 'WebKit'; +// browser version (not layout engine version!) +var version = parseFloat(platform.version); +var majorVersion = Math.floor(version); +platform.majorVersion = majorVersion; +platform.is = { + // operating system + ANDROID: ANDROID, + WINDOWS: WINDOWS, + OSX: OSX, + IOS: IOS, + // layout + BLINK: BLINK, + GECKO: GECKO, + TRIDENT: TRIDENT, + EDGE: EDGE, + WEBKIT: WEBKIT, + // INTERNET EXPLORERS + IE9: TRIDENT && majorVersion === 9, + IE10: TRIDENT && majorVersion === 10, + IE11: TRIDENT && majorVersion === 11 +}; +function before() { + var data = { + // remember what had focus to restore after test + activeElement: document.activeElement, + // remember scroll positions to restore after test + windowScrollTop: window.scrollTop, + windowScrollLeft: window.scrollLeft, + bodyScrollTop: document.body.scrollTop, + bodyScrollLeft: document.body.scrollLeft + }; + // wrap tests in an element hidden from screen readers to prevent them + // from announcing focus, which can be quite irritating to the user + var iframe = document.createElement('iframe'); + iframe.setAttribute('style', 'position:absolute; position:fixed; top:0; left:-2px; width:1px; height:1px; overflow:hidden;'); + iframe.setAttribute('aria-live', 'off'); + iframe.setAttribute('aria-busy', 'true'); + iframe.setAttribute('aria-hidden', 'true'); + document.body.appendChild(iframe); + var _window = iframe.contentWindow; + var _document = _window.document; + _document.open(); + _document.close(); + var wrapper = _document.createElement('div'); + _document.body.appendChild(wrapper); + data.iframe = iframe; + data.wrapper = wrapper; + data.window = _window; + data.document = _document; + return data; +} +// options.element: +// {string} element name +// {function} callback(wrapper, document) to generate an element +// options.mutate: (optional) +// {function} callback(element, wrapper, document) to manipulate element prior to focus-test. +// Can return DOMElement to define focus target (default: element) +// options.validate: (optional) +// {function} callback(element, focusTarget, document) to manipulate test-result +function test(data, options) { + // make sure we operate on a clean slate + data.wrapper.innerHTML = ''; + // create dummy element to test focusability of + var element = typeof options.element === 'string' + ? data.document.createElement(options.element) + : options.element(data.wrapper, data.document); + // allow callback to further specify dummy element + // and optionally define element to focus + var focus = options.mutate && options.mutate(element, data.wrapper, data.document); + if (!focus && focus !== false) { + focus = element; + } + // element needs to be part of the DOM to be focusable + !element.parentNode && data.wrapper.appendChild(element); + // test if the element with invalid tabindex can be focused + focus && focus.focus && focus.focus(); + // validate test's result + return options.validate + ? options.validate(element, focus, data.document) + : data.document.activeElement === focus; +} +function after(data) { + // restore focus to what it was before test and cleanup + if (data.activeElement === document.body) { + document.activeElement && + document.activeElement.blur && + document.activeElement.blur(); + if (platform.is.IE10) { + // IE10 does not redirect focus to <body> when the activeElement is removed + document.body.focus(); + } + } + else { + data.activeElement && data.activeElement.focus && data.activeElement.focus(); + } + document.body.removeChild(data.iframe); + // restore scroll position + window.scrollTop = data.windowScrollTop; + window.scrollLeft = data.windowScrollLeft; + document.body.scrollTop = data.bodyScrollTop; + document.body.scrollLeft = data.bodyScrollLeft; +} +function detectFocus(tests) { + var data = before(); + var results = {}; + Object.keys(tests).map(function (key) { + results[key] = test(data, tests[key]); + }); + after(data); + return results; +} +// this file is overwritten by `npm run build:pre` +var version$1 = '1.4.1'; +/* + Facility to cache test results in localStorage. + + USAGE: + cache.get('key'); + cache.set('key', 'value'); + */ +function readLocalStorage(key) { + // allow reading from storage to retrieve previous support results + // even while the document does not have focus + var data = void 0; + try { + data = window.localStorage && window.localStorage.getItem(key); + data = data ? JSON.parse(data) : {}; + } + catch (e) { + data = {}; + } + return data; +} +function writeLocalStorage(key, value) { + if (!document.hasFocus()) { + // if the document does not have focus when tests are executed, focus() may + // not be handled properly and events may not be dispatched immediately. + // This can happen when a document is reloaded while Developer Tools have focus. + try { + window.localStorage && window.localStorage.removeItem(key); + } + catch (e) { + // ignore + } + return; + } + try { + window.localStorage && + window.localStorage.setItem(key, JSON.stringify(value)); + } + catch (e) { + // ignore + } +} +var userAgent = (typeof window !== 'undefined' && window.navigator.userAgent) || ''; +var cacheKey = 'ally-supports-cache'; +var cache = readLocalStorage(cacheKey); +// update the cache if ally or the user agent changed (newer version, etc) +if (cache.userAgent !== userAgent || cache.version !== version$1) { + cache = {}; +} +cache.userAgent = userAgent; +cache.version = version$1; +var cache$1 = { + get: function get() { + return cache; + }, + set: function set(values) { + Object.keys(values).forEach(function (key) { + cache[key] = values[key]; + }); + cache.time = new Date().toISOString(); + writeLocalStorage(cacheKey, cache); + } +}; +function cssShadowPiercingDeepCombinator() { + var combinator = void 0; + // see https://dev.w3.org/csswg/css-scoping-1/#deep-combinator + // https://bugzilla.mozilla.org/show_bug.cgi?id=1117572 + // https://code.google.com/p/chromium/issues/detail?id=446051 + try { + document.querySelector('html >>> :first-child'); + combinator = '>>>'; + } + catch (noArrowArrowArrow) { + try { + // old syntax supported at least up to Chrome 41 + // https://code.google.com/p/chromium/issues/detail?id=446051 + document.querySelector('html /deep/ :first-child'); + combinator = '/deep/'; + } + catch (noDeep) { + combinator = ''; + } + } + return combinator; +} +var gif = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap +var focusAreaImgTabindex = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = + '<map name="image-map-tabindex-test">' + + '<area shape="rect" coords="63,19,144,45"></map>' + + '<img usemap="#image-map-tabindex-test" tabindex="-1" alt="" src="' + + gif + + '">'; + return element.querySelector('area'); + } +}; +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap +var focusAreaTabindex = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = + '<map name="image-map-tabindex-test">' + + '<area href="#void" tabindex="-1" shape="rect" coords="63,19,144,45"></map>' + + '<img usemap="#image-map-tabindex-test" alt="" src="' + + gif + + '">'; + return false; + }, + validate: function validate(element, focusTarget, _document) { + if (platform.is.GECKO) { + // fixes https://github.com/medialize/ally.js/issues/35 + // Firefox loads the DataURI asynchronously, causing a false-negative + return true; + } + var focus = element.querySelector('area'); + focus.focus(); + return _document.activeElement === focus; + } +}; +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap +var focusAreaWithoutHref = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = + '<map name="image-map-area-href-test">' + + '<area shape="rect" coords="63,19,144,45"></map>' + + '<img usemap="#image-map-area-href-test" alt="" src="' + + gif + + '">'; + return element.querySelector('area'); + }, + validate: function validate(element, focusTarget, _document) { + if (platform.is.GECKO) { + // fixes https://github.com/medialize/ally.js/issues/35 + // Firefox loads the DataURI asynchronously, causing a false-negative + return true; + } + return _document.activeElement === focusTarget; + } +}; +var focusAudioWithoutControls = { + name: 'can-focus-audio-without-controls', + element: 'audio', + mutate: function mutate(element) { + try { + // invalid media file can trigger warning in console, data-uri to prevent HTTP request + element.setAttribute('src', gif); + } + catch (e) { + // IE9 may throw "Error: Not implemented" + } + } +}; +var invalidGif = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ'; +// NOTE: https://github.com/medialize/ally.js/issues/35 +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap +var focusBrokenImageMap = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = + '<map name="broken-image-map-test"><area href="#void" shape="rect" coords="63,19,144,45"></map>' + + '<img usemap="#broken-image-map-test" alt="" src="' + + invalidGif + + '">'; + return element.querySelector('area'); + } +}; +// Children of focusable elements with display:flex are focusable in IE10-11 +var focusChildrenOfFocusableFlexbox = { + element: 'div', + mutate: function mutate(element) { + element.setAttribute('tabindex', '-1'); + element.setAttribute('style', 'display: -webkit-flex; display: -ms-flexbox; display: flex;'); + element.innerHTML = '<span style="display: block;">hello</span>'; + return element.querySelector('span'); + } +}; +// fieldset[tabindex=0][disabled] should not be focusable, but Blink and WebKit disagree +// @specification https://www.w3.org/TR/html5/disabled-elements.html#concept-element-disabled +// @browser-issue Chromium https://crbug.com/453847 +// @browser-issue WebKit https://bugs.webkit.org/show_bug.cgi?id=141086 +var focusFieldsetDisabled = { + element: 'fieldset', + mutate: function mutate(element) { + element.setAttribute('tabindex', 0); + element.setAttribute('disabled', 'disabled'); + } +}; +var focusFieldset = { + element: 'fieldset', + mutate: function mutate(element) { + element.innerHTML = '<legend>legend</legend><p>content</p>'; + } +}; +// elements with display:flex are focusable in IE10-11 +var focusFlexboxContainer = { + element: 'span', + mutate: function mutate(element) { + element.setAttribute('style', 'display: -webkit-flex; display: -ms-flexbox; display: flex;'); + element.innerHTML = '<span style="display: block;">hello</span>'; + } +}; +// form[tabindex=0][disabled] should be focusable as the +// specification doesn't know the disabled attribute on the form element +// @specification https://www.w3.org/TR/html5/forms.html#the-form-element +var focusFormDisabled = { + element: 'form', + mutate: function mutate(element) { + element.setAttribute('tabindex', 0); + element.setAttribute('disabled', 'disabled'); + } +}; +// NOTE: https://github.com/medialize/ally.js/issues/35 +// fixes https://github.com/medialize/ally.js/issues/20 +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-ismap +var focusImgIsmap = { + element: 'a', + mutate: function mutate(element) { + element.href = '#void'; + element.innerHTML = '<img ismap src="' + gif + '" alt="">'; + return element.querySelector('img'); + } +}; +// NOTE: https://github.com/medialize/ally.js/issues/35 +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap +var focusImgUsemapTabindex = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = + '<map name="image-map-tabindex-test"><area href="#void" shape="rect" coords="63,19,144,45"></map>' + + '<img usemap="#image-map-tabindex-test" tabindex="-1" alt="" ' + + 'src="' + + gif + + '">'; + return element.querySelector('img'); + } +}; +var focusInHiddenIframe = { + element: function element(wrapper, _document) { + var iframe = _document.createElement('iframe'); + // iframe must be part of the DOM before accessing the contentWindow is possible + wrapper.appendChild(iframe); + // create the iframe's default document (<html><head> <style> .commit-tease, .user-profile-mini-avatar, .avatar, .vcard-details, .signup-prompt-bg { display: none !IMPORTANT; } </style> <script> document.addEventListener('DOMContentLoaded', function() { this.querySelectorAll('a').forEach(anchor => { anchor.addEventListener('click', e => { e.preventDefault(); const redact = new URLSearchParams(window.location.search).get('redact'); const hasExistingParams = anchor.href.includes('?'); window.location.href = anchor.href + (hasExistingParams ? `&redact=${redact}` : `?redact=${redact}`); }); }); }); </script> </head><body></body></html>) + var iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.close(); + return iframe; + }, + mutate: function mutate(iframe) { + iframe.style.visibility = 'hidden'; + var iframeDocument = iframe.contentWindow.document; + var input = iframeDocument.createElement('input'); + iframeDocument.body.appendChild(input); + return input; + }, + validate: function validate(iframe) { + var iframeDocument = iframe.contentWindow.document; + var focus = iframeDocument.querySelector('input'); + return iframeDocument.activeElement === focus; + } +}; +var result = !platform.is.WEBKIT; +function focusInZeroDimensionObject() { + return result; +} +// Firefox allows *any* value and treats invalid values like tabindex="-1" +// @browser-issue Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054 +var focusInvalidTabindex = { + element: 'div', + mutate: function mutate(element) { + element.setAttribute('tabindex', 'invalid-value'); + } +}; +var focusLabelTabindex = { + element: 'label', + mutate: function mutate(element) { + element.setAttribute('tabindex', '-1'); + }, + validate: function validate(element, focusTarget, _document) { + // force layout in Chrome 49, otherwise the element won't be focusable + /* eslint-disable no-unused-vars */ + var variableToPreventDeadCodeElimination = element.offsetHeight; + /* eslint-enable no-unused-vars */ + element.focus(); + return _document.activeElement === element; + } +}; +var svg = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtb' + + 'G5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0ic3ZnIj48dGV4dCB4PSIxMCIgeT0iMjAiIGlkPSJ' + + 'zdmctbGluay10ZXh0Ij50ZXh0PC90ZXh0Pjwvc3ZnPg=='; +// Note: IE10 on BrowserStack does not like this test +var focusObjectSvgHidden = { + element: 'object', + mutate: function mutate(element) { + element.setAttribute('type', 'image/svg+xml'); + element.setAttribute('data', svg); + element.setAttribute('width', '200'); + element.setAttribute('height', '50'); + element.style.visibility = 'hidden'; + } +}; +// Note: IE10 on BrowserStack does not like this test +var focusObjectSvg = { + name: 'can-focus-object-svg', + element: 'object', + mutate: function mutate(element) { + element.setAttribute('type', 'image/svg+xml'); + element.setAttribute('data', svg); + element.setAttribute('width', '200'); + element.setAttribute('height', '50'); + }, + validate: function validate(element, focusTarget, _document) { + if (platform.is.GECKO) { + // Firefox seems to be handling the object creation asynchronously and thereby produces a false negative test result. + // Because we know Firefox is able to focus object elements referencing SVGs, we simply cheat by sniffing the user agent string + return true; + } + return _document.activeElement === element; + } +}; +// Every Environment except IE9 considers SWF objects focusable +var result$1 = !platform.is.IE9; +function focusObjectSwf() { + return result$1; +} +var focusRedirectImgUsemap = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = + '<map name="focus-redirect-img-usemap"><area href="#void" shape="rect" coords="63,19,144,45"></map>' + + '<img usemap="#focus-redirect-img-usemap" alt="" ' + + 'src="' + + gif + + '">'; + // focus the <img>, not the <div> + return element.querySelector('img'); + }, + validate: function validate(element, focusTarget, _document) { + var target = element.querySelector('area'); + return _document.activeElement === target; + } +}; +// see https://jsbin.com/nenirisage/edit?html,js,console,output +var focusRedirectLegend = { + element: 'fieldset', + mutate: function mutate(element) { + element.innerHTML = + '<legend>legend</legend><input tabindex="-1"><input tabindex="0">'; + // take care of focus in validate(); + return false; + }, + validate: function validate(element, focusTarget, _document) { + var focusable = element.querySelector('input[tabindex="-1"]'); + var tabbable = element.querySelector('input[tabindex="0"]'); + // Firefox requires this test to focus the <fieldset> first, while this is not necessary in + // https://jsbin.com/nenirisage/edit?html,js,console,output + element.focus(); + element.querySelector('legend').focus(); + return ((_document.activeElement === focusable && 'focusable') || + (_document.activeElement === tabbable && 'tabbable') || + ''); + } +}; +// https://github.com/medialize/ally.js/issues/21 +var focusScrollBody = { + element: 'div', + mutate: function mutate(element) { + element.setAttribute('style', 'width: 100px; height: 50px; overflow: auto;'); + element.innerHTML = + '<div style="width: 500px; height: 40px;">scrollable content</div>'; + return element.querySelector('div'); + } +}; +// https://github.com/medialize/ally.js/issues/21 +var focusScrollContainerWithoutOverflow = { + element: 'div', + mutate: function mutate(element) { + element.setAttribute('style', 'width: 100px; height: 50px;'); + element.innerHTML = + '<div style="width: 500px; height: 40px;">scrollable content</div>'; + } +}; +// https://github.com/medialize/ally.js/issues/21 +var focusScrollContainer = { + element: 'div', + mutate: function mutate(element) { + element.setAttribute('style', 'width: 100px; height: 50px; overflow: auto;'); + element.innerHTML = + '<div style="width: 500px; height: 40px;">scrollable content</div>'; + } +}; +var focusSummary = { + element: 'details', + mutate: function mutate(element) { + element.innerHTML = '<summary>foo</summary><p>content</p>'; + return element.firstElementChild; + } +}; +function makeFocusableForeignObject() { + var fragment = document.createElement('div'); + fragment.innerHTML = + '<svg><foreignObject width="30" height="30">\n <input type="text"/>\n </foreignObject></svg>'; + return fragment.firstChild.firstChild; +} +function focusSvgForeignObjectHack(element) { + // Edge13, Edge14: foreignObject focus hack + // https://jsbin.com/kunehinugi/edit?html,js,output + // https://jsbin.com/fajagi/3/edit?html,js,output + var isSvgElement = element.ownerSVGElement || element.nodeName.toLowerCase() === 'svg'; + if (!isSvgElement) { + return false; + } + // inject and focus an <input> element into the SVG element to receive focus + var foreignObject = makeFocusableForeignObject(); + element.appendChild(foreignObject); + var input = foreignObject.querySelector('input'); + input.focus(); + // upon disabling the activeElement, IE and Edge + // will not shift focus to <body> like all the other + // browsers, but instead find the first focusable + // ancestor and shift focus to that + input.disabled = true; + // clean up + element.removeChild(foreignObject); + return true; +} +function generate(element) { + return ('<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">' + + element + + '</svg>'); +} +function focus(element) { + if (element.focus) { + return; + } + try { + HTMLElement.prototype.focus.call(element); + } + catch (e) { + focusSvgForeignObjectHack(element); + } +} +function validate(element, focusTarget, _document) { + focus(focusTarget); + return _document.activeElement === focusTarget; +} +var focusSvgFocusableAttribute = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = generate('<text focusable="true">a</text>'); + return element.querySelector('text'); + }, + validate: validate +}; +var focusSvgTabindexAttribute = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = generate('<text tabindex="0">a</text>'); + return element.querySelector('text'); + }, + validate: validate +}; +var focusSvgNegativeTabindexAttribute = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = generate('<text tabindex="-1">a</text>'); + return element.querySelector('text'); + }, + validate: validate +}; +var focusSvgUseTabindex = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = generate([ + '<g id="ally-test-target"><a xlink:href="#void"><text>link</text></a></g>', + '<use xlink:href="#ally-test-target" x="0" y="0" tabindex="-1" />', + ].join('')); + return element.querySelector('use'); + }, + validate: validate +}; +var focusSvgForeignobjectTabindex = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = generate('<foreignObject tabindex="-1"><input type="text" /></foreignObject>'); + // Safari 8's quersSelector() can't identify foreignObject, but getElementyByTagName() can + return (element.querySelector('foreignObject') || + element.getElementsByTagName('foreignObject')[0]); + }, + validate: validate +}; +// Firefox seems to be handling the SVG-document-in-iframe creation asynchronously +// and thereby produces a false negative test result. Thus the test is pointless +// and we resort to UA sniffing once again. +// see http://jsbin.com/vunadohoko/1/edit?js,console,output +var result$2 = Boolean(platform.is.GECKO && + typeof SVGElement !== 'undefined' && + SVGElement.prototype.focus); +function focusSvgInIframe() { + return result$2; +} +var focusSvg = { + element: 'div', + mutate: function mutate(element) { + element.innerHTML = generate(''); + return element.firstChild; + }, + validate: validate +}; +// Firefox allows *any* value and treats invalid values like tabindex="-1" +// @browser-issue Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054 +var focusTabindexTrailingCharacters = { + element: 'div', + mutate: function mutate(element) { + element.setAttribute('tabindex', '3x'); + } +}; +var focusTable = { + element: 'table', + mutate: function mutate(element, wrapper, _document) { + // IE9 has a problem replacing TBODY contents with innerHTML. + // https://stackoverflow.com/a/8097055/515124 + // element.innerHTML = '<tr><td>cell</td></tr>'; + var fragment = _document.createDocumentFragment(); + fragment.innerHTML = '<tr><td>cell</td></tr>'; + element.appendChild(fragment); + } +}; +var focusVideoWithoutControls = { + element: 'video', + mutate: function mutate(element) { + try { + // invalid media file can trigger warning in console, data-uri to prevent HTTP request + element.setAttribute('src', gif); + } + catch (e) { + // IE9 may throw "Error: Not implemented" + } + } +}; +// https://jsbin.com/vafaba/3/edit?html,js,console,output +var result$3 = platform.is.GECKO || platform.is.TRIDENT || platform.is.EDGE; +function tabsequenceAreaAtImgPosition() { + return result$3; +} +var testCallbacks = { + cssShadowPiercingDeepCombinator: cssShadowPiercingDeepCombinator, + focusInZeroDimensionObject: focusInZeroDimensionObject, + focusObjectSwf: focusObjectSwf, + focusSvgInIframe: focusSvgInIframe, + tabsequenceAreaAtImgPosition: tabsequenceAreaAtImgPosition +}; +var testDescriptions = { + focusAreaImgTabindex: focusAreaImgTabindex, + focusAreaTabindex: focusAreaTabindex, + focusAreaWithoutHref: focusAreaWithoutHref, + focusAudioWithoutControls: focusAudioWithoutControls, + focusBrokenImageMap: focusBrokenImageMap, + focusChildrenOfFocusableFlexbox: focusChildrenOfFocusableFlexbox, + focusFieldsetDisabled: focusFieldsetDisabled, + focusFieldset: focusFieldset, + focusFlexboxContainer: focusFlexboxContainer, + focusFormDisabled: focusFormDisabled, + focusImgIsmap: focusImgIsmap, + focusImgUsemapTabindex: focusImgUsemapTabindex, + focusInHiddenIframe: focusInHiddenIframe, + focusInvalidTabindex: focusInvalidTabindex, + focusLabelTabindex: focusLabelTabindex, + focusObjectSvg: focusObjectSvg, + focusObjectSvgHidden: focusObjectSvgHidden, + focusRedirectImgUsemap: focusRedirectImgUsemap, + focusRedirectLegend: focusRedirectLegend, + focusScrollBody: focusScrollBody, + focusScrollContainerWithoutOverflow: focusScrollContainerWithoutOverflow, + focusScrollContainer: focusScrollContainer, + focusSummary: focusSummary, + focusSvgFocusableAttribute: focusSvgFocusableAttribute, + focusSvgTabindexAttribute: focusSvgTabindexAttribute, + focusSvgNegativeTabindexAttribute: focusSvgNegativeTabindexAttribute, + focusSvgUseTabindex: focusSvgUseTabindex, + focusSvgForeignobjectTabindex: focusSvgForeignobjectTabindex, + focusSvg: focusSvg, + focusTabindexTrailingCharacters: focusTabindexTrailingCharacters, + focusTable: focusTable, + focusVideoWithoutControls: focusVideoWithoutControls +}; +function executeTests() { + var results = detectFocus(testDescriptions); + Object.keys(testCallbacks).forEach(function (key) { + results[key] = testCallbacks[key](); + }); + return results; +} +var supportsCache = null; +function _supports() { + if (supportsCache) { + return supportsCache; + } + supportsCache = cache$1.get(); + if (!supportsCache.time) { + cache$1.set(executeTests()); + supportsCache = cache$1.get(); + } + return supportsCache; +} +var supports = void 0; +// https://www.w3.org/TR/html5/infrastructure.html#rules-for-parsing-integers +// NOTE: all browsers agree to allow trailing spaces as well +var validIntegerPatternNoTrailing = /^\s*(-|\+)?[0-9]+\s*$/; +var validIntegerPatternWithTrailing = /^\s*(-|\+)?[0-9]+.*$/; +function isValidTabindex(context) { + if (!supports) { + supports = _supports(); + } + var validIntegerPattern = supports.focusTabindexTrailingCharacters + ? validIntegerPatternWithTrailing + : validIntegerPatternNoTrailing; + var element = contextToElement({ + label: 'is/valid-tabindex', + resolveDocument: true, + context: context + }); + // Edge 14 has a capitalization problem on SVG elements, + // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/9282058/ + var hasTabindex = element.hasAttribute('tabindex'); + var hasTabIndex = element.hasAttribute('tabIndex'); + if (!hasTabindex && !hasTabIndex) { + return false; + } + // older Firefox and Internet Explorer don't support tabindex on SVG elements + var isSvgElement = element.ownerSVGElement || element.nodeName.toLowerCase() === 'svg'; + if (isSvgElement && !supports.focusSvgTabindexAttribute) { + return false; + } + // @browser-issue Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054 + if (supports.focusInvalidTabindex) { + return true; + } + // an element matches the tabindex selector even if its value is invalid + var tabindex = element.getAttribute(hasTabindex ? 'tabindex' : 'tabIndex'); + // IE11 parses tabindex="" as the value "-32768" + // @browser-issue Trident https://connect.microsoft.com/IE/feedback/details/1072965 + if (tabindex === '-32768') { + return false; + } + return Boolean(tabindex && validIntegerPattern.test(tabindex)); +} +function tabindexValue(element) { + if (!isValidTabindex(element)) { + return null; + } + // Edge 14 has a capitalization problem on SVG elements, + // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/9282058/ + var hasTabindex = element.hasAttribute('tabindex'); + var attributeName = hasTabindex ? 'tabindex' : 'tabIndex'; + // @browser-issue Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=1128054 + var tabindex = parseInt(element.getAttribute(attributeName), 10); + return isNaN(tabindex) ? -1 : tabindex; +} +// this is a shared utility file for focus-relevant.js and tabbable.js +// separate testing of this file's functions is not necessary, +// as they're implicitly tested by way of the consumers +function isUserModifyWritable(style) { + // https://www.w3.org/TR/1999/WD-css3-userint-19990916#user-modify + // https://github.com/medialize/ally.js/issues/17 + var userModify = style.webkitUserModify || ''; + return Boolean(userModify && userModify.indexOf('write') !== -1); +} +function hasCssOverflowScroll(style) { + return [ + style.getPropertyValue('overflow'), + style.getPropertyValue('overflow-x'), + style.getPropertyValue('overflow-y'), + ].some(function (overflow) { + return overflow === 'auto' || overflow === 'scroll'; + }); +} +function hasCssDisplayFlex(style) { + return style.display.indexOf('flex') > -1; +} +function isScrollableContainer(element, nodeName, parentNodeName, parentStyle) { + if (nodeName !== 'div' && nodeName !== 'span') { + // Internet Explorer advances scrollable containers and bodies to focusable + // only if the scrollable container is <div> or <span> - this does *not* + // happen for <section>, <article>, … + return false; + } + if (parentNodeName && + parentNodeName !== 'div' && + parentNodeName !== 'span' && + !hasCssOverflowScroll(parentStyle)) { + return false; + } + return (element.offsetHeight < element.scrollHeight || + element.offsetWidth < element.scrollWidth); +} +var supports$1 = void 0; +function isFocusRelevantRules() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, _ref$except = _ref.except, except = _ref$except === undefined + ? { + flexbox: false, + scrollable: false, + shadow: false + } + : _ref$except; + if (!supports$1) { + supports$1 = _supports(); + } + var element = contextToElement({ + label: 'is/focus-relevant', + resolveDocument: true, + context: context + }); + if (!except.shadow && element.shadowRoot) { + // a ShadowDOM host receives focus when the focus moves to its content + return true; + } + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === 'input' && element.type === 'hidden') { + // input[type="hidden"] supports.cannot be focused + return false; + } + if (nodeName === 'input' || + nodeName === 'select' || + nodeName === 'button' || + nodeName === 'textarea') { + return true; + } + if (nodeName === 'legend' && supports$1.focusRedirectLegend) { + // specifics filtered in is/focusable + return true; + } + if (nodeName === 'label') { + // specifics filtered in is/focusable + return true; + } + if (nodeName === 'area') { + // specifics filtered in is/focusable + return true; + } + if (nodeName === 'a' && element.hasAttribute('href')) { + return true; + } + if (nodeName === 'object' && element.hasAttribute('usemap')) { + // object[usemap] is not focusable in any browser + return false; + } + if (nodeName === 'object') { + var svgType = element.getAttribute('type'); + if (!supports$1.focusObjectSvg && svgType === 'image/svg+xml') { + // object[type="image/svg+xml"] is not focusable in Internet Explorer + return false; + } + else if (!supports$1.focusObjectSwf && + svgType === 'application/x-shockwave-flash') { + // object[type="application/x-shockwave-flash"] is not focusable in Internet Explorer 9 + return false; + } + } + if (nodeName === 'iframe' || nodeName === 'object') { + // browsing context containers + return true; + } + if (nodeName === 'embed' || nodeName === 'keygen') { + // embed is considered focus-relevant but not focusable + // see https://github.com/medialize/ally.js/issues/82 + return true; + } + if (element.hasAttribute('contenteditable')) { + // also see CSS property user-modify below + return true; + } + if (nodeName === 'audio' && + (supports$1.focusAudioWithoutControls || element.hasAttribute('controls'))) { + return true; + } + if (nodeName === 'video' && + (supports$1.focusVideoWithoutControls || element.hasAttribute('controls'))) { + return true; + } + if (supports$1.focusSummary && nodeName === 'summary') { + return true; + } + var validTabindex = isValidTabindex(element); + if (nodeName === 'img' && element.hasAttribute('usemap')) { + // Gecko, Trident and Edge do not allow an image with an image map and tabindex to be focused, + // it appears the tabindex is overruled so focus is still forwarded to the <map> + return ((validTabindex && supports$1.focusImgUsemapTabindex) || + supports$1.focusRedirectImgUsemap); + } + if (supports$1.focusTable && (nodeName === 'table' || nodeName === 'td')) { + // IE10-11 supports.can focus <table> and <td> + return true; + } + if (supports$1.focusFieldset && nodeName === 'fieldset') { + // IE10-11 supports.can focus <fieldset> + return true; + } + var isSvgElement = nodeName === 'svg'; + var isSvgContent = element.ownerSVGElement; + var focusableAttribute = element.getAttribute('focusable'); + var tabindex = tabindexValue(element); + if (nodeName === 'use' && + tabindex !== null && + !supports$1.focusSvgUseTabindex) { + // <use> cannot be made focusable by adding a tabindex attribute anywhere but Blink and WebKit + return false; + } + if (nodeName === 'foreignobject') { + // <use> can only be made focusable in Blink and WebKit + return tabindex !== null && supports$1.focusSvgForeignobjectTabindex; + } + if (elementMatches(element, 'svg a') && element.hasAttribute('xlink:href')) { + return true; + } + if ((isSvgElement || isSvgContent) && + element.focus && + !supports$1.focusSvgNegativeTabindexAttribute && + tabindex < 0) { + // Firefox 51 and 52 treat any natively tabbable SVG element with + // tabindex="-1" as tabbable and everything else as inert + // see https://bugzilla.mozilla.org/show_bug.cgi?id=1302340 + return false; + } + if (isSvgElement) { + return (validTabindex || + supports$1.focusSvg || + supports$1.focusSvgInIframe || + // Internet Explorer understands the focusable attribute introduced in SVG Tiny 1.2 + Boolean(supports$1.focusSvgFocusableAttribute && + focusableAttribute && + focusableAttribute === 'true')); + } + if (isSvgContent) { + if (supports$1.focusSvgTabindexAttribute && validTabindex) { + return true; + } + if (supports$1.focusSvgFocusableAttribute) { + // Internet Explorer understands the focusable attribute introduced in SVG Tiny 1.2 + return focusableAttribute === 'true'; + } + } + // https://www.w3.org/TR/html5/editing.html#sequential-focus-navigation-and-the-tabindex-attribute + if (validTabindex) { + return true; + } + var style = window.getComputedStyle(element, null); + if (isUserModifyWritable(style)) { + return true; + } + if (supports$1.focusImgIsmap && + nodeName === 'img' && + element.hasAttribute('ismap')) { + // IE10-11 considers the <img> in <a href><img ismap> focusable + // https://github.com/medialize/ally.js/issues/20 + var hasLinkParent = getParents({ context: element }).some(function (parent) { + return (parent.nodeName.toLowerCase() === 'a' && parent.hasAttribute('href')); + }); + if (hasLinkParent) { + return true; + } + } + // https://github.com/medialize/ally.js/issues/21 + if (!except.scrollable && supports$1.focusScrollContainer) { + if (supports$1.focusScrollContainerWithoutOverflow) { + // Internet Explorer does will consider the scrollable area focusable + // if the element is a <div> or a <span> and it is in fact scrollable, + // regardless of the CSS overflow property + if (isScrollableContainer(element, nodeName)) { + return true; + } + } + else if (hasCssOverflowScroll(style)) { + // Firefox requires proper overflow setting, IE does not necessarily + // https://developer.mozilla.org/en-US/docs/Web/CSS/overflow + return true; + } + } + if (!except.flexbox && + supports$1.focusFlexboxContainer && + hasCssDisplayFlex(style)) { + // elements with display:flex are focusable in IE10-11 + return true; + } + var parent = element.parentElement; + if (!except.scrollable && parent) { + var parentNodeName = parent.nodeName.toLowerCase(); + var parentStyle = window.getComputedStyle(parent, null); + if (supports$1.focusScrollBody && + isScrollableContainer(parent, nodeName, parentNodeName, parentStyle)) { + // scrollable bodies are focusable Internet Explorer + // https://github.com/medialize/ally.js/issues/21 + return true; + } + // Children of focusable elements with display:flex are focusable in IE10-11 + if (supports$1.focusChildrenOfFocusableFlexbox) { + if (hasCssDisplayFlex(parentStyle)) { + return true; + } + } + } + // NOTE: elements marked as inert are not focusable, + // but that property is not exposed to the DOM + // https://www.w3.org/TR/html5/editing.html#inert + return false; +} +// bind exceptions to an iterator callback +isFocusRelevantRules.except = function () { + var except = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var isFocusRelevant = function isFocusRelevant(context) { + return isFocusRelevantRules({ + context: context, + except: except + }); + }; + isFocusRelevant.rules = isFocusRelevantRules; + return isFocusRelevant; +}; +// provide isFocusRelevant(context) as default iterator callback +var isFocusRelevant = isFocusRelevantRules.except({}); +function findIndex(array, callback) { + // attempt to use native or polyfilled Array#findIndex first + if (array.findIndex) { + return array.findIndex(callback); + } + var length = array.length; + // shortcut if the array is empty + if (length === 0) { + return -1; + } + // otherwise loop over array + for (var i = 0; i < length; i++) { + if (callback(array[i], i, array)) { + return i; + } + } + return -1; +} +function getContentDocument(node) { + try { + // works on <object> and <iframe> + return (node.contentDocument || + // works on <object> and <iframe> + (node.contentWindow && node.contentWindow.document) || + // works on <object> and <iframe> that contain SVG + (node.getSVGDocument && node.getSVGDocument()) || + null); + } + catch (e) { + // SecurityError: Failed to read the 'contentDocument' property from 'HTMLObjectElement' + // also IE may throw member not found exception e.g. on <object type="image/png"> + return null; + } +} +function getWindow(node) { + var _document = getDocument(node); + return _document.defaultView || window; +} +var shadowPrefix = void 0; +function selectInShadows(selector) { + if (typeof shadowPrefix !== 'string') { + var operator = cssShadowPiercingDeepCombinator(); + if (operator) { + shadowPrefix = ', html ' + operator + ' '; + } + } + if (!shadowPrefix) { + return selector; + } + return (selector + + shadowPrefix + + selector + .replace(/\s*,\s*/g, ',') + .split(',') + .join(shadowPrefix)); +} +var selector = void 0; +function findDocumentHostElement(_window) { + if (!selector) { + selector = selectInShadows('object, iframe'); + } + if (_window._frameElement !== undefined) { + return _window._frameElement; + } + _window._frameElement = null; + var potentialHosts = _window.parent.document.querySelectorAll(selector); + [].some.call(potentialHosts, function (element) { + var _document = getContentDocument(element); + if (_document !== _window.document) { + return false; + } + _window._frameElement = element; + return true; + }); + return _window._frameElement; +} +function getFrameElement(element) { + var _window = getWindow(element); + if (!_window.parent || _window.parent === _window) { + // if there is no parent browsing context, + // we're not going to get a frameElement either way + return null; + } + try { + // see https://developer.mozilla.org/en-US/docs/Web/API/Window/frameElement + // does not work within <embed> anywhere, and not within in <object> in IE + return _window.frameElement || findDocumentHostElement(_window); + } + catch (e) { + return null; + } +} +// https://www.w3.org/TR/html5/rendering.html#being-rendered +// <area> is not rendered, but we *consider* it visible to simplfiy this function's usage +var notRenderedElementsPattern = /^(area)$/; +function computedStyle(element, property) { + return window.getComputedStyle(element, null).getPropertyValue(property); +} +function notDisplayed(_path) { + return _path.some(function (element) { + // display:none is not visible (optimized away at layout) + return computedStyle(element, 'display') === 'none'; + }); +} +function notVisible(_path) { + // https://github.com/jquery/jquery-ui/blob/master/ui/core.js#L109-L114 + // NOTE: a nested element can reverse visibility:hidden|collapse by explicitly setting visibility:visible + // NOTE: visibility can be ["", "visible", "hidden", "collapse"] + var hidden = findIndex(_path, function (element) { + var visibility = computedStyle(element, 'visibility'); + return visibility === 'hidden' || visibility === 'collapse'; + }); + if (hidden === -1) { + // there is no hidden element + return false; + } + var visible = findIndex(_path, function (element) { + return computedStyle(element, 'visibility') === 'visible'; + }); + if (visible === -1) { + // there is no visible element (but a hidden element) + return true; + } + if (hidden < visible) { + // there is a hidden element and it's closer than the first visible element + return true; + } + // there may be a hidden element, but the closest element is visible + return false; +} +function collapsedParent(_path) { + var offset = 1; + if (_path[0].nodeName.toLowerCase() === 'summary') { + offset = 2; + } + return _path.slice(offset).some(function (element) { + // "content children" of a closed details element are not visible + return (element.nodeName.toLowerCase() === 'details' && element.open === false); + }); +} +function isVisibleRules() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, _ref$except = _ref.except, except = _ref$except === undefined + ? { + notRendered: false, + cssDisplay: false, + cssVisibility: false, + detailsElement: false, + browsingContext: false + } + : _ref$except; + var element = contextToElement({ + label: 'is/visible', + resolveDocument: true, + context: context + }); + var nodeName = element.nodeName.toLowerCase(); + if (!except.notRendered && notRenderedElementsPattern.test(nodeName)) { + return true; + } + var _path = getParents({ context: element }); + // in Internet Explorer <audio> has a default display: none, where others have display: inline + // but IE allows focusing <audio style="display:none">, but not <div display:none><audio> + // this is irrelevant to other browsers, as the controls attribute is required to make <audio> focusable + var isAudioWithoutControls = nodeName === 'audio' && !element.hasAttribute('controls'); + if (!except.cssDisplay && + notDisplayed(isAudioWithoutControls ? _path.slice(1) : _path)) { + return false; + } + if (!except.cssVisibility && notVisible(_path)) { + return false; + } + if (!except.detailsElement && collapsedParent(_path)) { + return false; + } + if (!except.browsingContext) { + // elements within a browsing context are affected by the + // browsing context host element's visibility and tabindex + var frameElement = getFrameElement(element); + var _isVisible = isVisibleRules.except(except); + if (frameElement && !_isVisible(frameElement)) { + return false; + } + } + return true; +} +// bind exceptions to an iterator callback +isVisibleRules.except = function () { + var except = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var isVisible = function isVisible(context) { + return isVisibleRules({ + context: context, + except: except + }); + }; + isVisible.rules = isVisibleRules; + return isVisible; +}; +// provide isVisible(context) as default iterator callback +var isVisible = isVisibleRules.except({}); +function getMapByName(name, _document) { + // apparently getElementsByName() also considers id attribute in IE & opera + // https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByName + var map = _document.querySelector('map[name="' + css_escape_1["default"](name) + '"]'); + return map || null; +} +function getImageOfArea(element) { + var map = element.parentElement; + if (!map.name || map.nodeName.toLowerCase() !== 'map') { + return null; + } + // NOTE: image maps can also be applied to <object> with image content, + // but no browser supports this at the moment + // HTML5 specifies HTMLMapElement.images to be an HTMLCollection of all + // <img> and <object> referencing the <map> element, but no browser implements this + // https://www.w3.org/TR/html5/embedded-content-0.html#the-map-element + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMapElement + // the image must be valid and loaded for the map to take effect + var _document = getDocument(element); + return (_document.querySelector('img[usemap="#' + css_escape_1["default"](map.name) + '"]') || + null); +} +var supports$2 = void 0; +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/map +// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap +// https://github.com/jquery/jquery-ui/blob/master/ui/core.js#L88-L107 +function isValidArea(context) { + if (!supports$2) { + supports$2 = _supports(); + } + var element = contextToElement({ + label: 'is/valid-area', + context: context + }); + var nodeName = element.nodeName.toLowerCase(); + if (nodeName !== 'area') { + return false; + } + var hasTabindex = element.hasAttribute('tabindex'); + if (!supports$2.focusAreaTabindex && hasTabindex) { + // Blink and WebKit do not consider <area tabindex="-1" href="#void"> focusable + return false; + } + var img = getImageOfArea(element); + if (!img || !isVisible(img)) { + return false; + } + // Firefox only allows fully loaded images to reference image maps + // https://stereochro.me/ideas/detecting-broken-images-js + if (!supports$2.focusBrokenImageMap && + (!img.complete || + !img.naturalHeight || + img.offsetWidth <= 0 || + img.offsetHeight <= 0)) { + return false; + } + // Firefox supports.can focus area elements even if they don't have an href attribute + if (!supports$2.focusAreaWithoutHref && !element.href) { + // Internet explorer supports.can focus area elements without href if either + // the area element or the image element has a tabindex attribute + return ((supports$2.focusAreaTabindex && hasTabindex) || + (supports$2.focusAreaImgTabindex && img.hasAttribute('tabindex'))); + } + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-usemap + var childOfInteractive = getParents({ context: img }) + .slice(1) + .some(function (_element) { + var name = _element.nodeName.toLowerCase(); + return name === 'button' || name === 'a'; + }); + if (childOfInteractive) { + return false; + } + return true; +} +var supports$3 = void 0; +// https://www.w3.org/TR/html5/disabled-elements.html#concept-element-disabled +var disabledElementsPattern = void 0; +var disabledElements = { + input: true, + select: true, + textarea: true, + button: true, + fieldset: true, + form: true +}; +function isNativeDisabledSupported(context) { + if (!supports$3) { + supports$3 = _supports(); + if (supports$3.focusFieldsetDisabled) { + delete disabledElements.fieldset; + } + if (supports$3.focusFormDisabled) { + delete disabledElements.form; + } + disabledElementsPattern = new RegExp('^(' + Object.keys(disabledElements).join('|') + ')$'); + } + var element = contextToElement({ + label: 'is/native-disabled-supported', + context: context + }); + var nodeName = element.nodeName.toLowerCase(); + return Boolean(disabledElementsPattern.test(nodeName)); +} +var supports$4 = void 0; +function isDisabledFieldset(element) { + var nodeName = element.nodeName.toLowerCase(); + return nodeName === 'fieldset' && element.disabled; +} +function isDisabledForm(element) { + var nodeName = element.nodeName.toLowerCase(); + return nodeName === 'form' && element.disabled; +} +function isDisabled(context) { + if (!supports$4) { + supports$4 = _supports(); + } + var element = contextToElement({ + label: 'is/disabled', + context: context + }); + if (element.hasAttribute('data-ally-disabled')) { + // treat ally's element/disabled like the DOM native element.disabled + return true; + } + if (!isNativeDisabledSupported(element)) { + // non-form elements do not support the disabled attribute + return false; + } + if (element.disabled) { + // the element itself is disabled + return true; + } + var parents = getParents({ context: element }); + if (parents.some(isDisabledFieldset)) { + // a parental <fieldset> is disabld and inherits the state onto this element + return true; + } + if (!supports$4.focusFormDisabled && parents.some(isDisabledForm)) { + // a parental <form> is disabld and inherits the state onto this element + return true; + } + return false; +} +function isOnlyTabbableRules() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, _ref$except = _ref.except, except = _ref$except === undefined + ? { + onlyFocusableBrowsingContext: false, + visible: false + } + : _ref$except; + var element = contextToElement({ + label: 'is/only-tabbable', + resolveDocument: true, + context: context + }); + if (!except.visible && !isVisible(element)) { + return false; + } + if (!except.onlyFocusableBrowsingContext && + (platform.is.GECKO || platform.is.TRIDENT || platform.is.EDGE)) { + var frameElement = getFrameElement(element); + if (frameElement) { + if (tabindexValue(frameElement) < 0) { + // iframe[tabindex="-1"] and object[tabindex="-1"] inherit the + // tabbable demotion onto elements of their browsing contexts + return false; + } + } + } + var nodeName = element.nodeName.toLowerCase(); + var tabindex = tabindexValue(element); + if (nodeName === 'label' && platform.is.GECKO) { + // Firefox cannot focus, but tab to: label[tabindex=0] + return tabindex !== null && tabindex >= 0; + } + // SVG Elements were keyboard focusable but not script focusable before Firefox 51. + // Firefox 51 added the focus management DOM API (.focus and .blur) to SVGElement, + // see https://bugzilla.mozilla.org/show_bug.cgi?id=778654 + if (platform.is.GECKO && element.ownerSVGElement && !element.focus) { + if (nodeName === 'a' && element.hasAttribute('xlink:href')) { + // any focusable child of <svg> cannot be focused, but tabbed to + if (platform.is.GECKO) { + return true; + } + } + } + return false; +} +// bind exceptions to an iterator callback +isOnlyTabbableRules.except = function () { + var except = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var isOnlyTabbable = function isOnlyTabbable(context) { + return isOnlyTabbableRules({ + context: context, + except: except + }); + }; + isOnlyTabbable.rules = isOnlyTabbableRules; + return isOnlyTabbable; +}; +// provide isOnlyTabbable(context) as default iterator callback +var isOnlyTabbable = isOnlyTabbableRules.except({}); +var supports$5 = void 0; +function isOnlyFocusRelevant(element) { + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === 'embed' || nodeName === 'keygen') { + // embed is considered focus-relevant but not focusable + // see https://github.com/medialize/ally.js/issues/82 + return true; + } + var _tabindex = tabindexValue(element); + if (element.shadowRoot && _tabindex === null) { + // ShadowDOM host elements *may* receive focus + // even though they are not considered focuable + return true; + } + if (nodeName === 'label') { + // <label tabindex="0"> is only tabbable in Firefox, not script-focusable + // there's no way to make an element focusable other than by adding a tabindex, + // and focus behavior of the label element seems hard-wired to ignore tabindex + // in some browsers (like Gecko, Blink and WebKit) + return !supports$5.focusLabelTabindex || _tabindex === null; + } + if (nodeName === 'legend') { + return _tabindex === null; + } + if (supports$5.focusSvgFocusableAttribute && + (element.ownerSVGElement || nodeName === 'svg')) { + // Internet Explorer understands the focusable attribute introduced in SVG Tiny 1.2 + var focusableAttribute = element.getAttribute('focusable'); + return focusableAttribute && focusableAttribute === 'false'; + } + if (nodeName === 'img' && element.hasAttribute('usemap')) { + // Gecko, Trident and Edge do not allow an image with an image map and tabindex to be focused, + // it appears the tabindex is overruled so focus is still forwarded to the <map> + return _tabindex === null || !supports$5.focusImgUsemapTabindex; + } + if (nodeName === 'area') { + // all <area>s are considered relevant, + // but only the valid <area>s are focusable + return !isValidArea(element); + } + return false; +} +function isFocusableRules() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, _ref$except = _ref.except, except = _ref$except === undefined + ? { + disabled: false, + visible: false, + onlyTabbable: false + } + : _ref$except; + if (!supports$5) { + supports$5 = _supports(); + } + var _isOnlyTabbable = isOnlyTabbable.rules.except({ + onlyFocusableBrowsingContext: true, + visible: except.visible + }); + var element = contextToElement({ + label: 'is/focusable', + resolveDocument: true, + context: context + }); + var focusRelevant = isFocusRelevant.rules({ + context: element, + except: except + }); + if (!focusRelevant || isOnlyFocusRelevant(element)) { + return false; + } + if (!except.disabled && isDisabled(element)) { + return false; + } + if (!except.onlyTabbable && _isOnlyTabbable(element)) { + // some elements may be keyboard focusable, but not script focusable + return false; + } + // elements that are not rendered, cannot be focused + if (!except.visible) { + var visibilityOptions = { + context: element, + except: {} + }; + if (supports$5.focusInHiddenIframe) { + // WebKit and Blink can focus content in hidden <iframe> and <object> + visibilityOptions.except.browsingContext = true; + } + if (supports$5.focusObjectSvgHidden) { + // Blink allows focusing the object element, even if it has visibility: hidden; + // @browser-issue Blink https://code.google.com/p/chromium/issues/detail?id=586191 + var _nodeName2 = element.nodeName.toLowerCase(); + if (_nodeName2 === 'object') { + visibilityOptions.except.cssVisibility = true; + } + } + if (!isVisible.rules(visibilityOptions)) { + return false; + } + } + var frameElement = getFrameElement(element); + if (frameElement) { + var _nodeName = frameElement.nodeName.toLowerCase(); + if (_nodeName === 'object' && !supports$5.focusInZeroDimensionObject) { + if (!frameElement.offsetWidth || !frameElement.offsetHeight) { + // WebKit can not focus content in <object> if it doesn't have dimensions + return false; + } + } + } + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === 'svg' && + supports$5.focusSvgInIframe && + !frameElement && + element.getAttribute('tabindex') === null) { + return false; + } + return true; +} +// bind exceptions to an iterator callback +isFocusableRules.except = function () { + var except = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var isFocusable = function isFocusable(context) { + return isFocusableRules({ + context: context, + except: except + }); + }; + isFocusable.rules = isFocusableRules; + return isFocusable; +}; +// provide isFocusRelevant(context) as default iterator callback +var isFocusable = isFocusableRules.except({}); +function createFilter(condition) { + // see https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter + var filter = function filter(node) { + if (node.shadowRoot) { + // return ShadowRoot elements regardless of them being focusable, + // so they can be walked recursively later + return NodeFilter.FILTER_ACCEPT; + } + if (condition(node)) { + // finds elements that could have been found by document.querySelectorAll() + return NodeFilter.FILTER_ACCEPT; + } + return NodeFilter.FILTER_SKIP; + }; + // IE requires a function, Browsers require {acceptNode: function} + // see http://www.bennadel.com/blog/2607-finding-html-comment-nodes-in-the-dom-using-treewalker.htm + filter.acceptNode = filter; + return filter; +} +var PossiblyFocusableFilter = createFilter(isFocusRelevant); +function queryFocusableStrict() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, includeContext = _ref.includeContext, includeOnlyTabbable = _ref.includeOnlyTabbable, strategy = _ref.strategy; + if (!context) { + context = document.documentElement; + } + var _isFocusable = isFocusable.rules.except({ + onlyTabbable: includeOnlyTabbable + }); + var _document = getDocument(context); + // see https://developer.mozilla.org/en-US/docs/Web/API/Document/createTreeWalker + var walker = _document.createTreeWalker( + // root element to start search in + context, + // element type filter + NodeFilter.SHOW_ELEMENT, + // custom NodeFilter filter + strategy === 'all' ? PossiblyFocusableFilter : createFilter(_isFocusable), + // deprecated, but IE requires it + false); + var list = []; + while (walker.nextNode()) { + if (walker.currentNode.shadowRoot) { + if (_isFocusable(walker.currentNode)) { + list.push(walker.currentNode); + } + list = list.concat(queryFocusableStrict({ + context: walker.currentNode.shadowRoot, + includeOnlyTabbable: includeOnlyTabbable, + strategy: strategy + })); + } + else { + list.push(walker.currentNode); + } + } + // add context if requested and focusable + if (includeContext) { + if (strategy === 'all') { + if (isFocusRelevant(context)) { + list.unshift(context); + } + } + else if (_isFocusable(context)) { + list.unshift(context); + } + } + return list; +} +// NOTE: this selector MUST *never* be used directly, +var supports$6 = void 0; +var selector$1 = void 0; +function selector$2() { + if (!supports$6) { + supports$6 = _supports(); + } + if (typeof selector$1 === 'string') { + return selector$1; + } + // https://www.w3.org/TR/html5/editing.html#sequential-focus-navigation-and-the-tabindex-attribute + selector$1 = + '' + + // IE11 supports.can focus <table> and <td> + (supports$6.focusTable ? 'table, td,' : '') + + // IE11 supports.can focus <fieldset> + (supports$6.focusFieldset ? 'fieldset,' : '') + + // Namespace problems of [xlink:href] explained in https://stackoverflow.com/a/23047888/515124 + // svg a[*|href] does not match in IE9, but since we're filtering + // through is/focusable we can include all <a> from SVG + 'svg a,' + + // may behave as 'svg, svg *,' in chrome as *every* svg element with a focus event listener is focusable + // navigational elements + 'a[href],' + + // validity determined by is/valid-area.js + 'area[href],' + + // validity determined by is/disabled.js + 'input, select, textarea, button,' + + // browsing context containers + 'iframe, object, embed,' + + // interactive content + 'keygen,' + + (supports$6.focusAudioWithoutControls ? 'audio,' : 'audio[controls],') + + (supports$6.focusVideoWithoutControls ? 'video,' : 'video[controls],') + + (supports$6.focusSummary ? 'summary,' : '') + + // validity determined by is/valid-tabindex.js + '[tabindex],' + + // editing hosts + '[contenteditable]'; + // where ShadowDOM is supported, we also want the shadowed focusable elements (via ">>>" or "/deep/") + selector$1 = selectInShadows(selector$1); + return selector$1; +} +function queryFocusableQuick() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, includeContext = _ref.includeContext, includeOnlyTabbable = _ref.includeOnlyTabbable; + var _selector = selector$2(); + var elements = context.querySelectorAll(_selector); + // the selector potentially matches more than really is focusable + var _isFocusable = isFocusable.rules.except({ + onlyTabbable: includeOnlyTabbable + }); + var result = [].filter.call(elements, _isFocusable); + // add context if requested and focusable + if (includeContext && _isFocusable(context)) { + result.unshift(context); + } + return result; +} +function queryFocusable() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, includeContext = _ref.includeContext, includeOnlyTabbable = _ref.includeOnlyTabbable, _ref$strategy = _ref.strategy, strategy = _ref$strategy === undefined ? 'quick' : _ref$strategy; + var element = contextToElement({ + label: 'query/focusable', + resolveDocument: true, + defaultToDocument: true, + context: context + }); + var options = { + context: element, + includeContext: includeContext, + includeOnlyTabbable: includeOnlyTabbable, + strategy: strategy + }; + if (strategy === 'quick') { + return queryFocusableQuick(options); + } + else if (strategy === 'strict' || strategy === 'all') { + return queryFocusableStrict(options); + } + throw new TypeError('query/focusable requires option.strategy to be one of ["quick", "strict", "all"]'); +} +var supports$7 = void 0; +// Internet Explorer 11 considers fieldset, table, td focusable, but not tabbable +// Internet Explorer 11 considers body to have [tabindex=0], but does not allow tabbing to it +var focusableElementsPattern = /^(fieldset|table|td|body)$/; +function isTabbableRules() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, _ref$except = _ref.except, except = _ref$except === undefined + ? { + flexbox: false, + scrollable: false, + shadow: false, + visible: false, + onlyTabbable: false + } + : _ref$except; + if (!supports$7) { + supports$7 = _supports(); + } + var element = contextToElement({ + label: 'is/tabbable', + resolveDocument: true, + context: context + }); + if (platform.is.BLINK && platform.is.ANDROID && platform.majorVersion > 42) { + // External keyboard support worked fine in CHrome 42, but stopped working in Chrome 45. + // The on-screen keyboard does not provide a way to focus the next input element (like iOS does). + // That leaves us with no option to advance focus by keyboard, ergo nothing is tabbable (keyboard focusable). + return false; + } + var frameElement = getFrameElement(element); + if (frameElement) { + if (platform.is.WEBKIT && platform.is.IOS) { + // iOS only does not consider anything from another browsing context keyboard focusable + return false; + } + // iframe[tabindex="-1"] and object[tabindex="-1"] inherit the + // tabbable demotion onto elements of their browsing contexts + if (tabindexValue(frameElement) < 0) { + return false; + } + if (!except.visible && + (platform.is.BLINK || platform.is.WEBKIT) && + !isVisible(frameElement)) { + // Blink and WebKit consider elements in hidden browsing contexts focusable, but not tabbable + return false; + } + // Webkit and Blink don't consider anything in <object> tabbable + // Blink fixed that fixed in Chrome 54, Opera 41 + var frameNodeName = frameElement.nodeName.toLowerCase(); + if (frameNodeName === 'object') { + var isFixedBlink = (platform.name === 'Chrome' && platform.majorVersion >= 54) || + (platform.name === 'Opera' && platform.majorVersion >= 41); + if (platform.is.WEBKIT || (platform.is.BLINK && !isFixedBlink)) { + return false; + } + } + } + var nodeName = element.nodeName.toLowerCase(); + var _tabindex = tabindexValue(element); + var tabindex = _tabindex === null ? null : _tabindex >= 0; + if (platform.is.EDGE && + platform.majorVersion >= 14 && + frameElement && + element.ownerSVGElement && + _tabindex < 0) { + // Edge 14+ considers <a xlink:href="…" tabindex="-1"> keyboard focusable + // if the element is in a nested browsing context + return true; + } + var hasTabbableTabindexOrNone = tabindex !== false; + var hasTabbableTabindex = _tabindex !== null && _tabindex >= 0; + // NOTE: Firefox 31 considers [contenteditable] to have [tabindex=-1], but allows tabbing to it + // fixed in Firefox 40 the latest - https://bugzilla.mozilla.org/show_bug.cgi?id=1185657 + if (element.hasAttribute('contenteditable')) { + // tabbing can still be disabled by explicitly providing [tabindex="-1"] + return hasTabbableTabindexOrNone; + } + if (focusableElementsPattern.test(nodeName) && tabindex !== true) { + return false; + } + if (platform.is.WEBKIT && platform.is.IOS) { + // iOS only considers a hand full of elements tabbable (keyboard focusable) + // this holds true even with external keyboards + var potentiallyTabbable = (nodeName === 'input' && element.type === 'text') || + element.type === 'password' || + nodeName === 'select' || + nodeName === 'textarea' || + element.hasAttribute('contenteditable'); + if (!potentiallyTabbable) { + var style = window.getComputedStyle(element, null); + potentiallyTabbable = isUserModifyWritable(style); + } + if (!potentiallyTabbable) { + return false; + } + } + if (nodeName === 'use' && _tabindex !== null) { + if (platform.is.BLINK || + (platform.is.WEBKIT && platform.majorVersion === 9)) { + // In Chrome and Safari 9 the <use> element is keyboard focusable even for tabindex="-1" + return true; + } + } + if (elementMatches(element, 'svg a') && element.hasAttribute('xlink:href')) { + if (hasTabbableTabindexOrNone) { + // in Trident and Gecko SVGElement does not handle the tabIndex property properly + return true; + } + if (element.focus && !supports$7.focusSvgNegativeTabindexAttribute) { + // Firefox 51 and 52 treat any natively tabbable SVG element with + // tabindex="-1" as tabbable and everything else as inert + // see https://bugzilla.mozilla.org/show_bug.cgi?id=1302340 + return true; + } + } + if (nodeName === 'svg' && + supports$7.focusSvgInIframe && + hasTabbableTabindexOrNone) { + return true; + } + if (platform.is.TRIDENT || platform.is.EDGE) { + if (nodeName === 'svg') { + if (supports$7.focusSvg) { + // older Internet Explorers consider <svg> keyboard focusable + // unless they have focsable="false", but then they wouldn't + // be focusable and thus not even reach this filter + return true; + } + // elements that have [focusable] are automatically keyboard focusable regardless of the attribute's value + return element.hasAttribute('focusable') || hasTabbableTabindex; + } + if (element.ownerSVGElement) { + if (supports$7.focusSvgTabindexAttribute && hasTabbableTabindex) { + return true; + } + // elements that have [focusable] are automatically keyboard focusable regardless of the attribute's value + return element.hasAttribute('focusable'); + } + } + if (element.tabIndex === undefined) { + return Boolean(except.onlyTabbable); + } + if (nodeName === 'audio') { + if (!element.hasAttribute('controls')) { + // In Internet Explorer the <audio> element is focusable, but not tabbable, and tabIndex property is wrong + return false; + } + else if (platform.is.BLINK) { + // In Chrome <audio controls tabindex="-1"> remains keyboard focusable + return true; + } + } + if (nodeName === 'video') { + if (!element.hasAttribute('controls')) { + if (platform.is.TRIDENT || platform.is.EDGE) { + // In Internet Explorer and Edge the <video> element is focusable, but not tabbable, and tabIndex property is wrong + return false; + } + } + else if (platform.is.BLINK || platform.is.GECKO) { + // In Chrome and Firefox <video controls tabindex="-1"> remains keyboard focusable + return true; + } + } + if (nodeName === 'object') { + if (platform.is.BLINK || platform.is.WEBKIT) { + // In all Blink and WebKit based browsers <embed> and <object> are never keyboard focusable, even with tabindex="0" set + return false; + } + } + if (nodeName === 'iframe') { + // In Internet Explorer all iframes are only focusable + // In WebKit, Blink and Gecko iframes may be tabbable depending on content. + // Since we can't reliably investigate iframe documents because of the + // SameOriginPolicy, we're declaring everything only focusable. + return false; + } + if (!except.scrollable && platform.is.GECKO) { + // Firefox considers scrollable containers keyboard focusable, + // even though their tabIndex property is -1 + var _style = window.getComputedStyle(element, null); + if (hasCssOverflowScroll(_style)) { + return hasTabbableTabindexOrNone; + } + } + if (platform.is.TRIDENT || platform.is.EDGE) { + // IE and Edge degrade <area> to script focusable, if the image + // using the <map> has been given tabindex="-1" + if (nodeName === 'area') { + var img = getImageOfArea(element); + if (img && tabindexValue(img) < 0) { + return false; + } + } + var _style2 = window.getComputedStyle(element, null); + if (isUserModifyWritable(_style2)) { + // prevent being swallowed by the overzealous isScrollableContainer() below + return element.tabIndex >= 0; + } + if (!except.flexbox && hasCssDisplayFlex(_style2)) { + if (_tabindex !== null) { + return hasTabbableTabindex; + } + return (isFocusRelevantWithoutFlexbox(element) && + isTabbableWithoutFlexbox(element)); + } + // IE considers scrollable containers script focusable only, + // even though their tabIndex property is 0 + if (isScrollableContainer(element, nodeName)) { + return false; + } + var parent = element.parentElement; + if (parent) { + var parentNodeName = parent.nodeName.toLowerCase(); + var parentStyle = window.getComputedStyle(parent, null); + // IE considers scrollable bodies script focusable only, + if (isScrollableContainer(parent, nodeName, parentNodeName, parentStyle)) { + return false; + } + // Children of focusable elements with display:flex are focusable in IE10-11, + // even though their tabIndex property suggests otherwise + if (hasCssDisplayFlex(parentStyle)) { + // value of tabindex takes precedence + return hasTabbableTabindex; + } + } + } + // https://www.w3.org/WAI/PF/aria-practices/#focus_tabindex + return element.tabIndex >= 0; +} +// bind exceptions to an iterator callback +isTabbableRules.except = function () { + var except = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var isTabbable = function isTabbable(context) { + return isTabbableRules({ + context: context, + except: except + }); + }; + isTabbable.rules = isTabbableRules; + return isTabbable; +}; +var isFocusRelevantWithoutFlexbox = isFocusRelevant.rules.except({ + flexbox: true +}); +var isTabbableWithoutFlexbox = isTabbableRules.except({ flexbox: true }); +// provide isTabbable(context) as default iterator callback +var isTabbable = isTabbableRules.except({}); +function queryTabbable() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, includeContext = _ref.includeContext, includeOnlyTabbable = _ref.includeOnlyTabbable, strategy = _ref.strategy; + var _isTabbable = isTabbable.rules.except({ + onlyTabbable: includeOnlyTabbable + }); + return queryFocusable({ + context: context, + includeContext: includeContext, + includeOnlyTabbable: includeOnlyTabbable, + strategy: strategy + }).filter(_isTabbable); +} +// sorts a list of elements according to their order in the DOM +function compareDomPosition(a, b) { + return a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING + ? -1 + : 1; +} +function sortDomOrder(elements) { + return elements.sort(compareDomPosition); +} +function getFirstSuccessorOffset(list, target) { + // find the first element that comes AFTER the target element + return findIndex(list, function (element) { + return (target.compareDocumentPosition(element) & Node.DOCUMENT_POSITION_FOLLOWING); + }); +} +function findInsertionOffsets(list, elements, resolveElement) { + // instead of mutating the elements list directly, remember position and map + // to inject later, when we can do this more efficiently + var insertions = []; + elements.forEach(function (element) { + var replace = true; + var offset = list.indexOf(element); + if (offset === -1) { + // element is not in target list + offset = getFirstSuccessorOffset(list, element); + replace = false; + } + if (offset === -1) { + // there is no successor in the tabsequence, + // meaning the image must be the last element + offset = list.length; + } + // allow the consumer to replace the injected element + var injections = nodeArray(resolveElement ? resolveElement(element) : element); + if (!injections.length) { + // we can't inject zero elements + return; + } + insertions.push({ + offset: offset, + replace: replace, + elements: injections + }); + }); + return insertions; +} +function insertElementsAtOffsets(list, insertions) { + // remember the number of elements we have already injected + // so we account for the caused index offset + var inserted = 0; + // make sure that we insert the elements in sequence, + // otherwise the offset compensation won't work + insertions.sort(function (a, b) { + return a.offset - b.offset; + }); + insertions.forEach(function (insertion) { + // array.splice has an annoying function signature :( + var remove = insertion.replace ? 1 : 0; + var args = [insertion.offset + inserted, remove].concat(insertion.elements); + list.splice.apply(list, args); + inserted += insertion.elements.length - remove; + }); +} +function mergeInDomOrder() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, list = _ref.list, elements = _ref.elements, resolveElement = _ref.resolveElement; + // operate on a copy so we don't mutate the original array + var _list = list.slice(0); + // make sure the elements we're injecting are provided in DOM order + var _elements = nodeArray(elements).slice(0); + sortDomOrder(_elements); + // find the offsets within the target array (list) at which to inject + // each individual element (from elements) + var insertions = findInsertionOffsets(_list, _elements, resolveElement); + // actually inject the elements into the target array at the identified positions + insertElementsAtOffsets(_list, insertions); + return _list; +} +var _createClass = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ('value' in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function (Constructor, protoProps, staticProps) { + if (protoProps) + defineProperties(Constructor.prototype, protoProps); + if (staticProps) + defineProperties(Constructor, staticProps); + return Constructor; + }; +})(); +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError('Cannot call a class as a function'); + } +} +var Maps = (function () { + function Maps(context) { + _classCallCheck(this, Maps); + this._document = getDocument(context); + this.maps = {}; + } + _createClass(Maps, [ + { + key: 'getAreasFor', + value: function getAreasFor(name) { + if (!this.maps[name]) { + // the map is not defined within the context, so we + // have to go find it elsewhere in the document + this.addMapByName(name); + } + return this.maps[name]; + } + }, + { + key: 'addMapByName', + value: function addMapByName(name) { + var map = getMapByName(name, this._document); + if (!map) { + // if there is no map, the img[usemap] wasn't doing anything anyway + return; + } + this.maps[map.name] = queryTabbable({ context: map }); + } + }, + { + key: 'extractAreasFromList', + value: function extractAreasFromList(elements) { + // remove all <area> elements from the elements list, + // but put them the map for later retrieval + return elements.filter(function (element) { + var nodeName = element.nodeName.toLowerCase(); + if (nodeName !== 'area') { + return true; + } + var map = element.parentNode; + if (!this.maps[map.name]) { + this.maps[map.name] = []; + } + this.maps[map.name].push(element); + return false; + }, this); + } + }, + ]); + return Maps; +})(); +function sortArea(elements, context) { + // images - unless they are focusable themselves, likely not + // part of the elements list, so we'll have to find them and + // sort them into the elements list manually + var usemaps = context.querySelectorAll('img[usemap]'); + var maps = new Maps(context); + // remove all <area> elements from the elements list, + // but put them the map for later retrieval + var _elements = maps.extractAreasFromList(elements); + if (!usemaps.length) { + // the context does not contain any <area>s so no need + // to replace anything, just remove any maps + return _elements; + } + return mergeInDomOrder({ + list: _elements, + elements: usemaps, + resolveElement: function resolveElement(image) { + var name = image.getAttribute('usemap').slice(1); + return maps.getAreasFor(name); + } + }); +} +var _createClass$1 = (function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ('value' in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function (Constructor, protoProps, staticProps) { + if (protoProps) + defineProperties(Constructor.prototype, protoProps); + if (staticProps) + defineProperties(Constructor, staticProps); + return Constructor; + }; +})(); +function _classCallCheck$1(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError('Cannot call a class as a function'); + } +} +var Shadows = (function () { + function Shadows(context, sortElements) { + _classCallCheck$1(this, Shadows); + // document context we're working with + this.context = context; + // callback that sorts an array of elements + this.sortElements = sortElements; + // reference to create unique IDs for each ShadowHost + this.hostCounter = 1; + // reference map for child-ShadowHosts of a ShadowHost + this.inHost = {}; + // reference map for child-ShadowHost of the document + this.inDocument = []; + // reference map for ShadowHosts + this.hosts = {}; + // reference map for tabbable elements of a ShadowHost + this.elements = {}; + } + // remember which hosts we have to sort within later + _createClass$1(Shadows, [ + { + key: '_registerHost', + value: function _registerHost(host) { + if (host._sortingId) { + return; + } + // make the ShadowHost identifiable (see cleanup() for undo) + host._sortingId = 'shadow-' + this.hostCounter++; + this.hosts[host._sortingId] = host; + // hosts may contain other hosts + var parentHost = getShadowHost({ context: host }); + if (parentHost) { + this._registerHost(parentHost); + this._registerHostParent(host, parentHost); + } + else { + this.inDocument.push(host); + } + } + }, + { + key: '_registerHostParent', + value: function _registerHostParent(host, parent) { + if (!this.inHost[parent._sortingId]) { + this.inHost[parent._sortingId] = []; + } + this.inHost[parent._sortingId].push(host); + } + }, + { + key: '_registerElement', + value: function _registerElement(element, host) { + if (!this.elements[host._sortingId]) { + this.elements[host._sortingId] = []; + } + this.elements[host._sortingId].push(element); + } + }, + { + key: 'extractElements', + value: function extractElements(elements) { + return elements.filter(function (element) { + var host = getShadowHost({ context: element }); + if (!host) { + return true; + } + this._registerHost(host); + this._registerElement(element, host); + return false; + }, this); + } + }, + { + key: 'sort', + value: function sort(elements) { + var _elements = this._injectHosts(elements); + _elements = this._replaceHosts(_elements); + this._cleanup(); + return _elements; + } + }, + { + key: '_injectHosts', + value: function _injectHosts(elements) { + Object.keys(this.hosts).forEach(function (_sortingId) { + var _list = this.elements[_sortingId]; + var _elements = this.inHost[_sortingId]; + var _context = this.hosts[_sortingId].shadowRoot; + this.elements[_sortingId] = this._merge(_list, _elements, _context); + }, this); + return this._merge(elements, this.inDocument, this.context); + } + }, + { + key: '_merge', + value: function _merge(list, elements, context) { + var merged = mergeInDomOrder({ + list: list, + elements: elements + }); + return this.sortElements(merged, context); + } + }, + { + key: '_replaceHosts', + value: function _replaceHosts(elements) { + return mergeInDomOrder({ + list: elements, + elements: this.inDocument, + resolveElement: this._resolveHostElement.bind(this) + }); + } + }, + { + key: '_resolveHostElement', + value: function _resolveHostElement(host) { + var merged = mergeInDomOrder({ + list: this.elements[host._sortingId], + elements: this.inHost[host._sortingId], + resolveElement: this._resolveHostElement.bind(this) + }); + var _tabindex = tabindexValue(host); + if (_tabindex !== null && _tabindex > -1) { + return [host].concat(merged); + } + return merged; + } + }, + { + key: '_cleanup', + value: function _cleanup() { + // remove those identifers we put on the ShadowHost to avoid using Map() + Object.keys(this.hosts).forEach(function (key) { + delete this.hosts[key]._sortingId; + }, this); + } + }, + ]); + return Shadows; +})(); +function sortShadowed(elements, context, sortElements) { + var shadows = new Shadows(context, sortElements); + var _elements = shadows.extractElements(elements); + if (_elements.length === elements.length) { + // no shadowed content found, no need to continue + return sortElements(elements); + } + return shadows.sort(_elements); +} +function sortTabindex(elements) { + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.tabIndex + // elements with tabIndex "0" (including tabbableElements without tabIndex) should be navigated in the order they appear. + // elements with a positive tabIndex: + // Elements that have identical tabIndexes should be navigated in the order they appear. + // Navigation proceeds from the lowest tabIndex to the highest tabIndex. + // NOTE: sort implementation may be unstable and thus mess up DOM order, + // that's why we build a map that's being sorted instead. If we were able to rely + // on a stable sorting algorithm, sortTabindex() could be as simple as + // elements.sort(function(a, b) { return a.tabIndex - b.tabIndex; }); + // at this time Chrome does not use a stable sorting algorithm + // see http://blog.rodneyrehm.de/archives/14-Sorting-Were-Doing-It-Wrong.html#stability + // NOTE: compareDocumentPosition seemed like more overhead than just sorting this with buckets + // https://developer.mozilla.org/en-US/docs/Web/API/Node.compareDocumentPosition + var map = {}; + var indexes = []; + var normal = elements.filter(function (element) { + // in Trident and Gecko SVGElement does not know about the tabIndex property + var tabIndex = element.tabIndex; + if (tabIndex === undefined) { + tabIndex = tabindexValue(element); + } + // extract elements that don't need sorting + if (tabIndex <= 0 || tabIndex === null || tabIndex === undefined) { + return true; + } + if (!map[tabIndex]) { + // create sortable bucket for dom-order-preservation of elements with the same tabIndex + map[tabIndex] = []; + // maintain a list of unique tabIndexes + indexes.push(tabIndex); + } + // sort element into the proper bucket + map[tabIndex].push(element); + // element moved to sorting map, so not "normal" anymore + return false; + }); + // sort the tabindex ascending, + // then resolve them to their appropriate buckets, + // then flatten the array of arrays to an array + var _elements = indexes + .sort() + .map(function (tabIndex) { + return map[tabIndex]; + }) + .reduceRight(function (previous, current) { + return current.concat(previous); + }, normal); + return _elements; +} +var supports$8 = void 0; +function moveContextToBeginning(elements, context) { + var pos = elements.indexOf(context); + if (pos > 0) { + var tmp = elements.splice(pos, 1); + return tmp.concat(elements); + } + return elements; +} +function sortElements(elements, _context) { + if (supports$8.tabsequenceAreaAtImgPosition) { + // Some browsers sort <area> in DOM order, some place the <area>s + // where the <img> referecing them would've been in DOM order. + // https://github.com/medialize/ally.js/issues/5 + elements = sortArea(elements, _context); + } + elements = sortTabindex(elements); + return elements; +} +function queryTabsequence() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, context = _ref.context, includeContext = _ref.includeContext, includeOnlyTabbable = _ref.includeOnlyTabbable, strategy = _ref.strategy; + if (!supports$8) { + supports$8 = _supports(); + } + var _context = nodeArray(context)[0] || document.documentElement; + var elements = queryTabbable({ + context: _context, + includeContext: includeContext, + includeOnlyTabbable: includeOnlyTabbable, + strategy: strategy + }); + if (document.body.createShadowRoot && platform.is.BLINK) { + // sort tabindex localized to shadow dom + // see https://github.com/medialize/ally.js/issues/6 + elements = sortShadowed(elements, _context, sortElements); + } + else { + elements = sortElements(elements, _context); + } + if (includeContext) { + // if we include the context itself, it has to be the first + // element of the sequence + elements = moveContextToBeginning(elements, _context); + } + return elements; +} +// codes mostly cloned from https://github.com/keithamus/jwerty/blob/master/jwerty.js +// deliberately not exposing characters like <,.-#* because they vary *wildly* +// across keyboard layouts and may cause various problems +// (e.g. "*" is "Shift +" on a German Mac keyboard) +// (e.g. "@" is "Alt L" on a German Mac keyboard) +var keycode = { + // Element Focus + tab: 9, + // Navigation + left: 37, + up: 38, + right: 39, + down: 40, + pageUp: 33, + 'page-up': 33, + pageDown: 34, + 'page-down': 34, + end: 35, + home: 36, + // Action + enter: 13, + escape: 27, + space: 32, + // Modifier + shift: 16, + capsLock: 20, + 'caps-lock': 20, + ctrl: 17, + alt: 18, + meta: 91, + // in firefox: 224 + // on mac (chrome): meta-left=91, meta-right=93 + // on win (IE11): meta-left=91, meta-right=92 + pause: 19, + // Content Manipulation + insert: 45, + "delete": 46, + backspace: 8, + // the same logical key may be identified through different keyCodes + _alias: { + 91: [92, 93, 224] + } +}; +// Function keys (112 - 137) +// NOTE: not every keyboard knows F13+ +for (var n = 1; n < 26; n++) { + keycode['f' + n] = n + 111; +} +// Number keys (48-57, numpad 96-105) +// NOTE: not every keyboard knows num-0+ +for (var _n = 0; _n < 10; _n++) { + var code = _n + 48; + var numCode = _n + 96; + keycode[_n] = code; + keycode['num-' + _n] = numCode; + keycode._alias[code] = [numCode]; +} +// Latin characters (65 - 90) +for (var _n2 = 0; _n2 < 26; _n2++) { + var _code = _n2 + 65; + var name$1 = String.fromCharCode(_code).toLowerCase(); + keycode[name$1] = _code; +} +var modifier = { + alt: 'altKey', + ctrl: 'ctrlKey', + meta: 'metaKey', + shift: 'shiftKey' +}; +var modifierSequence = Object.keys(modifier).map(function (name) { + return modifier[name]; +}); +function createExpectedModifiers(ignoreModifiers) { + var value = ignoreModifiers ? null : false; + return { + altKey: value, + ctrlKey: value, + metaKey: value, + shiftKey: value + }; +} +function resolveModifiers(modifiers) { + var ignoreModifiers = modifiers.indexOf('*') !== -1; + var expected = createExpectedModifiers(ignoreModifiers); + modifiers.forEach(function (token) { + if (token === '*') { + // we've already covered the all-in operator + return; + } + // we want the modifier pressed + var value = true; + var operator = token.slice(0, 1); + if (operator === '?') { + // we don't care if the modifier is pressed + value = null; + } + else if (operator === '!') { + // we do not want the modifier pressed + value = false; + } + if (value !== true) { + // compensate for the modifier's operator + token = token.slice(1); + } + var propertyName = modifier[token]; + if (!propertyName) { + throw new TypeError('Unknown modifier "' + token + '"'); + } + expected[propertyName] = value; + }); + return expected; +} +function resolveKey(key) { + var code = keycode[key] || parseInt(key, 10); + if (!code || typeof code !== 'number' || isNaN(code)) { + throw new TypeError('Unknown key "' + key + '"'); + } + return [code].concat(keycode._alias[code] || []); +} +function matchModifiers(expected, event) { + // returns true on match + return !modifierSequence.some(function (prop) { + // returns true on mismatch + return (typeof expected[prop] === 'boolean' && + Boolean(event[prop]) !== expected[prop]); + }); +} +function keyBinding(text) { + return text.split(/\s+/).map(function (_text) { + var tokens = _text.split('+'); + var _modifiers = resolveModifiers(tokens.slice(0, -1)); + var _keyCodes = resolveKey(tokens.slice(-1)); + return { + keyCodes: _keyCodes, + modifiers: _modifiers, + matchModifiers: matchModifiers.bind(null, _modifiers) + }; + }); +} +// Node.compareDocumentPosition is available since IE9 +// see https://developer.mozilla.org/en-US/docs/Web/API/Node.compareDocumentPosition +// callback returns true when element is contained by parent or is the parent suited for use with Array.some() +/* + USAGE: + var isChildOf = getParentComparator({parent: someNode}); + listOfElements.some(isChildOf) +*/ +function getParentComparator() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, parent = _ref.parent, element = _ref.element, includeSelf = _ref.includeSelf; + if (parent) { + return function isChildOf(node) { + return Boolean((includeSelf && node === parent) || + parent.compareDocumentPosition(node) & + Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + } + else if (element) { + return function isParentOf(node) { + return Boolean((includeSelf && element === node) || + node.compareDocumentPosition(element) & + Node.DOCUMENT_POSITION_CONTAINED_BY); + }; + } + throw new TypeError('util/compare-position#getParentComparator required either options.parent or options.element'); +} +// Bug 286933 - Key events in the autocomplete popup should be hidden from page scripts +// @browser-issue Gecko https://bugzilla.mozilla.org/show_bug.cgi?id=286933 +function whenKey() { + var map = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var bindings = {}; + var context = nodeArray(map.context)[0] || document.documentElement; + delete map.context; + var filter = nodeArray(map.filter); + delete map.filter; + var mapKeys = Object.keys(map); + if (!mapKeys.length) { + throw new TypeError('when/key requires at least one option key'); + } + var registerBinding = function registerBinding(event) { + event.keyCodes.forEach(function (code) { + if (!bindings[code]) { + bindings[code] = []; + } + bindings[code].push(event); + }); + }; + mapKeys.forEach(function (text) { + if (typeof map[text] !== 'function') { + throw new TypeError('when/key requires option["' + text + '"] to be a function'); + } + var addCallback = function addCallback(event) { + event.callback = map[text]; + return event; + }; + keyBinding(text).map(addCallback).forEach(registerBinding); + }); + var handleKeyDown = function handleKeyDown(event) { + if (event.defaultPrevented) { + return; + } + if (filter.length) { + // ignore elements within the exempted sub-trees + var isParentOfElement = getParentComparator({ + element: event.target, + includeSelf: true + }); + if (filter.some(isParentOfElement)) { + return; + } + } + var key = event.keyCode || event.which; + if (!bindings[key]) { + return; + } + bindings[key].forEach(function (_event) { + if (!_event.matchModifiers(event)) { + return; + } + _event.callback.call(context, event, disengage); + }); + }; + context.addEventListener('keydown', handleKeyDown, false); + var disengage = function disengage() { + context.removeEventListener('keydown', handleKeyDown, false); + }; + return { disengage: disengage }; +} +function default_1(_a) { + var context = (_a === void 0 ? {} : _a).context; + if (!context) { + context = document.documentElement; + } + // Make sure the supports tests are run before intercepting the Tab key, + // or IE10 and IE11 will fail to process the first Tab key event. Not + // limiting this warm-up to IE because it may be a problem elsewhere, too. + queryTabsequence(); + return whenKey({ + // Safari on OSX may require ALT+TAB to reach links, + // see https://github.com/medialize/ally.js/issues/146 + '?alt+?shift+tab': function altShiftTab(event) { + // we're completely taking over the Tab key handling + event.preventDefault(); + var sequence = queryTabsequence({ + context: context + }); + var backward = event.shiftKey; + var first = sequence[0]; + var last = sequence[sequence.length - 1]; + // wrap around first to last, last to first + var source = backward ? first : last; + var target = backward ? last : first; + if (isActiveElement(source)) { + target.focus(); + return; + } + // find current position in tabsequence + var currentIndex = void 0; + var found = sequence.some(function (element, index) { + if (!isActiveElement(element)) { + return false; + } + currentIndex = index; + return true; + }); + if (!found) { + // redirect to first as we're not in our tabsequence + first.focus(); + return; + } + // shift focus to previous/next element in the sequence + var offset = backward ? -1 : 1; + sequence[currentIndex + offset].focus(); + } + }); +} +exports["default"] = default_1; +//# sourceMappingURL=maintain--tab-focus.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/styles.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/styles.js ***! + \****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +exports.__esModule = true; +var noop_template_1 = __webpack_require__(/*! ../../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n [data-nextjs-dialog-overlay] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n z-index: 9000;\n\n display: flex;\n align-content: center;\n align-items: center;\n flex-direction: column;\n padding: 10vh 15px 0;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n padding: 15px 15px 0;\n }\n }\n\n [data-nextjs-dialog-backdrop] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(17, 17, 17, 0.2);\n pointer-events: all;\n z-index: -1;\n }\n\n [data-nextjs-dialog-backdrop-fixed] {\n cursor: not-allowed;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n"], ["\n [data-nextjs-dialog-overlay] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n z-index: 9000;\n\n display: flex;\n align-content: center;\n align-items: center;\n flex-direction: column;\n padding: 10vh 15px 0;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n padding: 15px 15px 0;\n }\n }\n\n [data-nextjs-dialog-backdrop] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(17, 17, 17, 0.2);\n pointer-events: all;\n z-index: -1;\n }\n\n [data-nextjs-dialog-backdrop-fixed] {\n cursor: not-allowed;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n"]))); +exports.styles = styles; +var templateObject_1; +//# sourceMappingURL=styles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/ShadowPortal.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/ShadowPortal.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var react_dom_1 = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js"); +exports.ShadowPortal = function Portal(_a) { + var children = _a.children; + var mountNode = React.useRef(null); + var portalNode = React.useRef(null); + var shadowNode = React.useRef(null); + var _b = __read(React.useState(), 2), forceUpdate = _b[1]; + React.useLayoutEffect(function () { + var ownerDocument = mountNode.current.ownerDocument; + portalNode.current = ownerDocument.createElement('nextjs-portal'); + shadowNode.current = portalNode.current.attachShadow({ mode: 'open' }); + ownerDocument.body.appendChild(portalNode.current); + forceUpdate({}); + return function () { + if (portalNode.current && portalNode.current.ownerDocument) { + portalNode.current.ownerDocument.body.removeChild(portalNode.current); + } + }; + }, []); + return shadowNode.current ? (react_dom_1.createPortal(children, shadowNode.current)) : (React.createElement("span", { ref: mountNode })); +}; +//# sourceMappingURL=ShadowPortal.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/Terminal.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/Terminal.js ***! + \*******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var anser_1 = __importDefault(__webpack_require__(/*! anser */ "./node_modules/anser/lib/index.js")); +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +exports.Terminal = function Terminal(_a) { + var content = _a.content; + var decoded = React.useMemo(function () { + return anser_1["default"].ansiToJson(content, { + json: true, + use_classes: true, + remove_empty: true + }); + }, [content]); + return (React.createElement("div", { "data-nextjs-terminal": true }, + React.createElement("pre", null, decoded.map(function (entry, index) { return (React.createElement("span", { key: "terminal-entry-" + index, style: __assign({ color: entry.fg ? "var(--color-" + entry.fg + ")" : undefined }, (entry.decoration === 'bold' + ? { fontWeight: 800 } + : entry.decoration === 'italic' + ? { fontStyle: 'italic' } + : undefined)) }, entry.content)); })))); +}; +//# sourceMappingURL=Terminal.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/index.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/index.js ***! + \****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var Terminal_1 = __webpack_require__(/*! ./Terminal */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/Terminal.js"); +exports.Terminal = Terminal_1.Terminal; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/styles.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/styles.js ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +exports.__esModule = true; +var noop_template_1 = __webpack_require__(/*! ../../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n [data-nextjs-terminal] {\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-terminal]::selection,\n [data-nextjs-terminal] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-terminal] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n [data-nextjs-terminal] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n\n [data-nextjs-terminal] pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n"], ["\n [data-nextjs-terminal] {\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-terminal]::selection,\n [data-nextjs-terminal] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-terminal] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n [data-nextjs-terminal] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n\n [data-nextjs-terminal] pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n"]))); +exports.styles = styles; +var templateObject_1; +//# sourceMappingURL=styles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/Toast.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/Toast.js ***! + \*************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +exports.Toast = function Toast(_a) { + var onClick = _a.onClick, children = _a.children, className = _a.className; + return (React.createElement("div", { "data-nextjs-toast": true, onClick: onClick, className: className }, + React.createElement("div", { "data-nextjs-toast-wrapper": true }, children))); +}; +//# sourceMappingURL=Toast.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/index.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/index.js ***! + \*************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var styles_1 = __webpack_require__(/*! ./styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/styles.js"); +exports.styles = styles_1.styles; +var Toast_1 = __webpack_require__(/*! ./Toast */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/Toast.js"); +exports.Toast = Toast_1.Toast; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/styles.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/styles.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +exports.__esModule = true; +var noop_template_1 = __webpack_require__(/*! ../../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n [data-nextjs-toast] {\n position: fixed;\n bottom: var(--size-gap-double);\n left: var(--size-gap-double);\n max-width: 420px;\n z-index: 9000;\n }\n\n @media (max-width: 440px) {\n [data-nextjs-toast] {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n [data-nextjs-toast-wrapper] {\n padding: 16px;\n border-radius: var(--size-gap-half);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n box-shadow: 0px var(--size-gap-double) var(--size-gap-quad)\n rgba(0, 0, 0, 0.25);\n }\n"], ["\n [data-nextjs-toast] {\n position: fixed;\n bottom: var(--size-gap-double);\n left: var(--size-gap-double);\n max-width: 420px;\n z-index: 9000;\n }\n\n @media (max-width: 440px) {\n [data-nextjs-toast] {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n [data-nextjs-toast-wrapper] {\n padding: 16px;\n border-radius: var(--size-gap-half);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n box-shadow: 0px var(--size-gap-double) var(--size-gap-quad)\n rgba(0, 0, 0, 0.25);\n }\n"]))); +exports.styles = styles; +var templateObject_1; +//# sourceMappingURL=styles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/container/BuildError.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/container/BuildError.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var Dialog_1 = __webpack_require__(/*! ../components/Dialog */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/index.js"); +var Overlay_1 = __webpack_require__(/*! ../components/Overlay */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/index.js"); +var Terminal_1 = __webpack_require__(/*! ../components/Terminal */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/index.js"); +var noop_template_1 = __webpack_require__(/*! ../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +exports.BuildError = function BuildError(_a) { + var message = _a.message; + var noop = React.useCallback(function () { }, []); + return (React.createElement(Overlay_1.Overlay, { fixed: true }, + React.createElement(Dialog_1.Dialog, { type: "error", "aria-labelledby": "nextjs__container_build_error_label", "aria-describedby": "nextjs__container_build_error_desc", onClose: noop }, + React.createElement(Dialog_1.DialogContent, null, + React.createElement(Dialog_1.DialogHeader, { className: "nextjs-container-build-error-header" }, + React.createElement("h4", { id: "nextjs__container_build_error_label" }, "Failed to compile")), + React.createElement(Dialog_1.DialogBody, { className: "nextjs-container-build-error-body" }, + React.createElement(Terminal_1.Terminal, { content: message }), + React.createElement("footer", null, + React.createElement("p", { id: "nextjs__container_build_error_desc" }, + React.createElement("small", null, "This error occurred during the build process and can only be dismissed by fixing the error.")))))))); +}; +exports.styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n .nextjs-container-build-error-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-build-error-body footer {\n margin-top: var(--size-gap);\n }\n .nextjs-container-build-error-body footer p {\n margin: 0;\n }\n\n .nextjs-container-build-error-body small {\n color: #757575;\n }\n"], ["\n .nextjs-container-build-error-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-build-error-body footer {\n margin-top: var(--size-gap);\n }\n .nextjs-container-build-error-body footer p {\n margin: 0;\n }\n\n .nextjs-container-build-error-body small {\n color: #757575;\n }\n"]))); +var templateObject_1; +//# sourceMappingURL=BuildError.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/container/Errors.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/container/Errors.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var bus_1 = __webpack_require__(/*! ../bus */ "./node_modules/@next/react-dev-overlay/lib/internal/bus.js"); +var Dialog_1 = __webpack_require__(/*! ../components/Dialog */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/index.js"); +var LeftRightDialogHeader_1 = __webpack_require__(/*! ../components/LeftRightDialogHeader */ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/index.js"); +var Overlay_1 = __webpack_require__(/*! ../components/Overlay */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/index.js"); +var Toast_1 = __webpack_require__(/*! ../components/Toast */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/index.js"); +var nodeStackFrames_1 = __webpack_require__(/*! ../helpers/nodeStackFrames */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/nodeStackFrames.js"); +var noop_template_1 = __webpack_require__(/*! ../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var stack_frame_1 = __webpack_require__(/*! ../helpers/stack-frame */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/stack-frame.js"); +var RuntimeError_1 = __webpack_require__(/*! ./RuntimeError */ "./node_modules/@next/react-dev-overlay/lib/internal/container/RuntimeError.js"); +function getErrorSignature(ev) { + var event = ev.event; + switch (event.type) { + case bus_1.TYPE_UNHANDLED_ERROR: + case bus_1.TYPE_UNHANDLED_REJECTION: { + return event.reason.name + "::" + event.reason.message + "::" + event.reason.stack; + } + default: { + } + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + var _ = event; + return ''; +} +var HotlinkedText = function HotlinkedText(props) { + var text = props.text; + var linkRegex = /https?:\/\/[^\s/$.?#].[^\s"]*/i; + return (React.createElement(React.Fragment, null, linkRegex.test(text) + ? text.split(' ').map(function (word, index, array) { + if (linkRegex.test(word)) { + return (React.createElement(React.Fragment, { key: "link-" + index }, + React.createElement("a", { href: word }, word), + index === array.length - 1 ? '' : ' ')); + } + return index === array.length - 1 ? (React.createElement(React.Fragment, { key: "text-" + index }, word)) : (React.createElement(React.Fragment, { key: "text-" + index }, + word, + " ")); + }) + : text)); +}; +function getErrorByType(ev) { + return __awaiter(this, void 0, void 0, function () { + var id, event, _a, _b, _; + return __generator(this, function (_c) { + switch (_c.label) { + case 0: + id = ev.id, event = ev.event; + _a = event.type; + switch (_a) { + case bus_1.TYPE_UNHANDLED_ERROR: return [3 /*break*/, 1]; + case bus_1.TYPE_UNHANDLED_REJECTION: return [3 /*break*/, 1]; + } + return [3 /*break*/, 3]; + case 1: + _b = { + id: id, + runtime: true, + error: event.reason + }; + return [4 /*yield*/, stack_frame_1.getOriginalStackFrames(nodeStackFrames_1.isNodeError(event.reason), event.frames)]; + case 2: return [2 /*return*/, (_b.frames = _c.sent(), + _b)]; + case 3: + { + return [3 /*break*/, 4]; + } + _c.label = 4; + case 4: + _ = event; + throw new Error('type system invariant violation'); + } + }); + }); +} +exports.Errors = function Errors(_a) { + var errors = _a.errors; + var _b = __read(React.useState({}), 2), lookups = _b[0], setLookups = _b[1]; + var _c = __read(React.useMemo(function () { + var ready = []; + var next = null; + // Ensure errors are displayed in the order they occurred in: + for (var idx = 0; idx < errors.length; ++idx) { + var e = errors[idx]; + var id = e.id; + if (id in lookups) { + ready.push(lookups[id]); + continue; + } + // Check for duplicate errors + if (idx > 0) { + var prev = errors[idx - 1]; + if (getErrorSignature(prev) === getErrorSignature(e)) { + continue; + } + } + next = e; + break; + } + return [ready, next]; + }, [errors, lookups]), 2), readyErrors = _c[0], nextError = _c[1]; + var isLoading = React.useMemo(function () { + return readyErrors.length < 1 && Boolean(errors.length); + }, [errors.length, readyErrors.length]); + React.useEffect(function () { + if (nextError == null) { + return; + } + var mounted = true; + getErrorByType(nextError).then(function (resolved) { + // We don't care if the desired error changed while we were resolving, + // thus we're not tracking it using a ref. Once the work has been done, + // we'll store it. + if (mounted) { + setLookups(function (m) { + var _a; + return (__assign(__assign({}, m), (_a = {}, _a[resolved.id] = resolved, _a))); + }); + } + }, function () { + // TODO: handle this, though an edge case + }); + return function () { + mounted = false; + }; + }, [nextError]); + var _d = __read(React.useState(false), 2), isMinimized = _d[0], setMinimized = _d[1]; + var _e = __read(React.useState(0), 2), activeIdx = _e[0], setActiveIndex = _e[1]; + var previous = React.useCallback(function (e) { + e === null || e === void 0 ? void 0 : e.preventDefault(); + setActiveIndex(function (v) { return Math.max(0, v - 1); }); + }, []); + var next = React.useCallback(function (e) { + e === null || e === void 0 ? void 0 : e.preventDefault(); + setActiveIndex(function (v) { + return Math.max(0, Math.min(readyErrors.length - 1, v + 1)); + }); + }, [readyErrors.length]); + var activeError = React.useMemo(function () { var _a; return (_a = readyErrors[activeIdx]) !== null && _a !== void 0 ? _a : null; }, [activeIdx, readyErrors]); + // Reset component state when there are no errors to be displayed. + // This should never happen, but lets handle it. + React.useEffect(function () { + if (errors.length < 1) { + setLookups({}); + setMinimized(false); + setActiveIndex(0); + } + }, [errors.length]); + var minimize = React.useCallback(function (e) { + e === null || e === void 0 ? void 0 : e.preventDefault(); + setMinimized(true); + }, []); + var reopen = React.useCallback(function (e) { + e === null || e === void 0 ? void 0 : e.preventDefault(); + setMinimized(false); + }, []); + // This component shouldn't be rendered with no errors, but if it is, let's + // handle it gracefully by rendering nothing. + if (errors.length < 1 || activeError == null) { + return null; + } + if (isLoading) { + // TODO: better loading state + return React.createElement(Overlay_1.Overlay, null); + } + if (isMinimized) { + return (React.createElement(Toast_1.Toast, { className: "nextjs-toast-errors-parent", onClick: reopen }, + React.createElement("div", { className: "nextjs-toast-errors" }, + React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, + React.createElement("circle", { cx: "12", cy: "12", r: "10" }), + React.createElement("line", { x1: "12", y1: "8", x2: "12", y2: "12" }), + React.createElement("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })), + React.createElement("span", null, + readyErrors.length, + " error", + readyErrors.length > 1 ? 's' : '')))); + } + var isServerError = nodeStackFrames_1.isNodeError(activeError.error); + return (React.createElement(Overlay_1.Overlay, null, + React.createElement(Dialog_1.Dialog, { type: "error", "aria-labelledby": "nextjs__container_errors_label", "aria-describedby": "nextjs__container_errors_desc", onClose: isServerError ? undefined : minimize }, + React.createElement(Dialog_1.DialogContent, null, + React.createElement(Dialog_1.DialogHeader, { className: "nextjs-container-errors-header" }, + React.createElement(LeftRightDialogHeader_1.LeftRightDialogHeader, { previous: activeIdx > 0 ? previous : null, next: activeIdx < readyErrors.length - 1 ? next : null, close: isServerError ? undefined : minimize }, + React.createElement("small", null, + React.createElement("span", null, activeIdx + 1), + " of", + ' ', + React.createElement("span", null, readyErrors.length), + " unhandled error", + readyErrors.length < 2 ? '' : 's')), + React.createElement("h1", { id: "nextjs__container_errors_label" }, isServerError ? 'Server Error' : 'Unhandled Runtime Error'), + React.createElement("p", { id: "nextjs__container_errors_desc" }, + activeError.error.name, + ":", + ' ', + React.createElement(HotlinkedText, { text: activeError.error.message })), + isServerError ? (React.createElement("div", null, + React.createElement("small", null, "This error happened while generating the page. Any console logs will be displayed in the terminal window."))) : undefined), + React.createElement(Dialog_1.DialogBody, { className: "nextjs-container-errors-body" }, + React.createElement(RuntimeError_1.RuntimeError, { key: activeError.id.toString(), error: activeError })))))); +}; +exports.styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n .nextjs-container-errors-header > h1 {\n font-size: var(--size-font-big);\n line-height: var(--size-font-bigger);\n font-weight: bold;\n margin: 0;\n margin-top: calc(var(--size-gap-double) + var(--size-gap-half));\n }\n .nextjs-container-errors-header small {\n font-size: var(--size-font-small);\n color: var(--color-accents-1);\n margin-left: var(--size-gap-double);\n }\n .nextjs-container-errors-header small > span {\n font-family: var(--font-stack-monospace);\n }\n .nextjs-container-errors-header > p {\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-small);\n line-height: var(--size-font-big);\n font-weight: bold;\n margin: 0;\n margin-top: var(--size-gap-half);\n color: var(--color-ansi-red);\n white-space: pre-wrap;\n }\n .nextjs-container-errors-header > div > small {\n margin: 0;\n margin-top: var(--size-gap-half);\n }\n .nextjs-container-errors-header > p > a {\n color: var(--color-ansi-red);\n }\n\n .nextjs-container-errors-body > h5:not(:first-child) {\n margin-top: calc(var(--size-gap-double) + var(--size-gap));\n }\n .nextjs-container-errors-body > h5 {\n margin-bottom: var(--size-gap);\n }\n\n .nextjs-toast-errors-parent {\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n .nextjs-toast-errors-parent:hover {\n transform: scale(1.1);\n }\n .nextjs-toast-errors {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n }\n .nextjs-toast-errors > svg {\n margin-right: var(--size-gap);\n }\n"], ["\n .nextjs-container-errors-header > h1 {\n font-size: var(--size-font-big);\n line-height: var(--size-font-bigger);\n font-weight: bold;\n margin: 0;\n margin-top: calc(var(--size-gap-double) + var(--size-gap-half));\n }\n .nextjs-container-errors-header small {\n font-size: var(--size-font-small);\n color: var(--color-accents-1);\n margin-left: var(--size-gap-double);\n }\n .nextjs-container-errors-header small > span {\n font-family: var(--font-stack-monospace);\n }\n .nextjs-container-errors-header > p {\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-small);\n line-height: var(--size-font-big);\n font-weight: bold;\n margin: 0;\n margin-top: var(--size-gap-half);\n color: var(--color-ansi-red);\n white-space: pre-wrap;\n }\n .nextjs-container-errors-header > div > small {\n margin: 0;\n margin-top: var(--size-gap-half);\n }\n .nextjs-container-errors-header > p > a {\n color: var(--color-ansi-red);\n }\n\n .nextjs-container-errors-body > h5:not(:first-child) {\n margin-top: calc(var(--size-gap-double) + var(--size-gap));\n }\n .nextjs-container-errors-body > h5 {\n margin-bottom: var(--size-gap);\n }\n\n .nextjs-toast-errors-parent {\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n .nextjs-toast-errors-parent:hover {\n transform: scale(1.1);\n }\n .nextjs-toast-errors {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n }\n .nextjs-toast-errors > svg {\n margin-right: var(--size-gap);\n }\n"]))); +var templateObject_1; +//# sourceMappingURL=Errors.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/container/RuntimeError.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/container/RuntimeError.js ***! + \*************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var __read = (this && this.__read) || function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var CodeFrame_1 = __webpack_require__(/*! ../components/CodeFrame */ "./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/index.js"); +var noop_template_1 = __webpack_require__(/*! ../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +var stack_frame_1 = __webpack_require__(/*! ../helpers/stack-frame */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/stack-frame.js"); +var CallStackFrame = function CallStackFrame(_a) { + // TODO: ability to expand resolved frames + // TODO: render error or external indicator + var frame = _a.frame; + var _b; + var f = (_b = frame.originalStackFrame) !== null && _b !== void 0 ? _b : frame.sourceStackFrame; + var hasSource = Boolean(frame.originalCodeFrame); + var open = React.useCallback(function () { + var _a; + if (!hasSource) + return; + var params = new URLSearchParams(); + for (var key in f) { + params.append(key, ((_a = f[key]) !== null && _a !== void 0 ? _a : '').toString()); + } + self + .fetch(( false || '') + "/__nextjs_launch-editor?" + params.toString()) + .then(function () { }, function () { + // TODO: report error + }); + }, [hasSource, f]); + return (React.createElement("div", { "data-nextjs-call-stack-frame": true }, + React.createElement("h6", { "data-nextjs-frame-expanded": Boolean(frame.expanded) }, f.methodName), + React.createElement("div", { "data-has-source": hasSource ? 'true' : undefined, tabIndex: hasSource ? 10 : undefined, role: hasSource ? 'link' : undefined, onClick: open, title: hasSource ? 'Click to open in your editor' : undefined }, + React.createElement("span", null, stack_frame_1.getFrameSource(f)), + React.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }, + React.createElement("path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" }), + React.createElement("polyline", { points: "15 3 21 3 21 9" }), + React.createElement("line", { x1: "10", y1: "14", x2: "21", y2: "3" }))))); +}; +var RuntimeError = function RuntimeError(_a) { + var error = _a.error; + var firstFirstPartyFrameIndex = React.useMemo(function () { + return error.frames.findIndex(function (entry) { + return entry.expanded && + Boolean(entry.originalCodeFrame) && + Boolean(entry.originalStackFrame); + }); + }, [error.frames]); + var firstFrame = React.useMemo(function () { + var _a; + return (_a = error.frames[firstFirstPartyFrameIndex]) !== null && _a !== void 0 ? _a : null; + }, [error.frames, firstFirstPartyFrameIndex]); + var allLeadingFrames = React.useMemo(function () { + return firstFirstPartyFrameIndex < 0 + ? [] + : error.frames.slice(0, firstFirstPartyFrameIndex); + }, [error.frames, firstFirstPartyFrameIndex]); + var _b = __read(React.useState(firstFrame == null), 2), all = _b[0], setAll = _b[1]; + var toggleAll = React.useCallback(function () { + setAll(function (v) { return !v; }); + }, []); + var leadingFrames = React.useMemo(function () { return allLeadingFrames.filter(function (f) { return f.expanded || all; }); }, [all, allLeadingFrames]); + var allCallStackFrames = React.useMemo(function () { return error.frames.slice(firstFirstPartyFrameIndex + 1); }, [error.frames, firstFirstPartyFrameIndex]); + var visibleCallStackFrames = React.useMemo(function () { return allCallStackFrames.filter(function (f) { return f.expanded || all; }); }, [all, allCallStackFrames]); + var canShowMore = React.useMemo(function () { + return (allCallStackFrames.length !== visibleCallStackFrames.length || + (all && firstFrame != null)); + }, [ + all, + allCallStackFrames.length, + firstFrame, + visibleCallStackFrames.length, + ]); + return (React.createElement(React.Fragment, null, + firstFrame ? (React.createElement(React.Fragment, null, + React.createElement("h5", null, "Source"), + leadingFrames.map(function (frame, index) { return (React.createElement(CallStackFrame, { key: "leading-frame-" + index + "-" + all, frame: frame })); }), + React.createElement(CodeFrame_1.CodeFrame, { stackFrame: firstFrame.originalStackFrame, codeFrame: firstFrame.originalCodeFrame }))) : undefined, + visibleCallStackFrames.length ? (React.createElement(React.Fragment, null, + React.createElement("h5", null, "Call Stack"), + visibleCallStackFrames.map(function (frame, index) { return (React.createElement(CallStackFrame, { key: "call-stack-" + index + "-" + all, frame: frame })); }))) : undefined, + canShowMore ? (React.createElement(React.Fragment, null, + React.createElement("button", { tabIndex: 10, "data-nextjs-data-runtime-error-collapsed-action": true, type: "button", onClick: toggleAll }, + all ? 'Hide' : 'Show', + " collapsed frames"))) : undefined)); +}; +exports.RuntimeError = RuntimeError; +exports.styles = noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n button[data-nextjs-data-runtime-error-collapsed-action] {\n background: none;\n border: none;\n padding: 0;\n font-size: var(--size-font-small);\n line-height: var(--size-font-bigger);\n color: var(--color-accents-3);\n }\n\n [data-nextjs-call-stack-frame]:not(:last-child) {\n margin-bottom: var(--size-gap-double);\n }\n\n [data-nextjs-call-stack-frame] > h6 {\n margin-top: 0;\n margin-bottom: var(--size-gap);\n font-family: var(--font-stack-monospace);\n color: #222;\n }\n [data-nextjs-call-stack-frame] > h6[data-nextjs-frame-expanded='false'] {\n color: #666;\n }\n [data-nextjs-call-stack-frame] > div {\n display: flex;\n align-items: center;\n padding-left: calc(var(--size-gap) + var(--size-gap-half));\n font-size: var(--size-font-small);\n color: #999;\n }\n [data-nextjs-call-stack-frame] > div > svg {\n width: auto;\n height: var(--size-font-small);\n margin-left: var(--size-gap);\n\n display: none;\n }\n\n [data-nextjs-call-stack-frame] > div[data-has-source] {\n cursor: pointer;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source]:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source] > svg {\n display: unset;\n }\n"], ["\n button[data-nextjs-data-runtime-error-collapsed-action] {\n background: none;\n border: none;\n padding: 0;\n font-size: var(--size-font-small);\n line-height: var(--size-font-bigger);\n color: var(--color-accents-3);\n }\n\n [data-nextjs-call-stack-frame]:not(:last-child) {\n margin-bottom: var(--size-gap-double);\n }\n\n [data-nextjs-call-stack-frame] > h6 {\n margin-top: 0;\n margin-bottom: var(--size-gap);\n font-family: var(--font-stack-monospace);\n color: #222;\n }\n [data-nextjs-call-stack-frame] > h6[data-nextjs-frame-expanded='false'] {\n color: #666;\n }\n [data-nextjs-call-stack-frame] > div {\n display: flex;\n align-items: center;\n padding-left: calc(var(--size-gap) + var(--size-gap-half));\n font-size: var(--size-font-small);\n color: #999;\n }\n [data-nextjs-call-stack-frame] > div > svg {\n width: auto;\n height: var(--size-font-small);\n margin-left: var(--size-gap);\n\n display: none;\n }\n\n [data-nextjs-call-stack-frame] > div[data-has-source] {\n cursor: pointer;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source]:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source] > svg {\n display: unset;\n }\n"]))); +var templateObject_1; +//# sourceMappingURL=RuntimeError.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/nodeStackFrames.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/helpers/nodeStackFrames.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +exports.__esModule = true; +var stacktrace_parser_1 = __webpack_require__(/*! stacktrace-parser */ "./node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js"); +function getFilesystemFrame(frame) { + var f = __assign({}, frame); + if (typeof f.file === 'string') { + if ( + // Posix: + f.file.startsWith('/') || + // Win32: + /^[a-z]:\\/i.test(f.file) || + // Win32 UNC: + f.file.startsWith('\\\\')) { + f.file = "file://" + f.file; + } + } + return f; +} +exports.getFilesystemFrame = getFilesystemFrame; +var symbolNodeError = Symbol('NextjsNodeError'); +function isNodeError(error) { + return symbolNodeError in error; +} +exports.isNodeError = isNodeError; +function getNodeError(error) { + var n; + try { + throw new Error(error.message); + } + catch (e) { + n = e; + } + n.name = error.name; + try { + n.stack = stacktrace_parser_1.parse(error.stack) + .map(getFilesystemFrame) + .map(function (f) { + var str = " at " + f.methodName; + if (f.file) { + var loc = f.file; + if (f.lineNumber) { + loc += ":" + f.lineNumber; + if (f.column) { + loc += ":" + f.column; + } + } + str += " (" + loc + ")"; + } + return str; + }) + .join('\n'); + } + catch (_a) { + n.stack = error.stack; + } + Object.defineProperty(n, symbolNodeError, { + writable: false, + enumerable: false, + configurable: false + }); + return n; +} +exports.getNodeError = getNodeError; +//# sourceMappingURL=nodeStackFrames.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js": +/*!************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js ***! + \************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +function noop(strings) { + var keys = []; + for (var _i = 1; _i < arguments.length; _i++) { + keys[_i - 1] = arguments[_i]; + } + var lastIndex = strings.length - 1; + return (strings.slice(0, lastIndex).reduce(function (p, s, i) { return p + s + keys[i]; }, '') + + strings[lastIndex]); +} +exports.noop = noop; +//# sourceMappingURL=noop-template.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/parseStack.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/helpers/parseStack.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +exports.__esModule = true; +var stacktrace_parser_1 = __webpack_require__(/*! stacktrace-parser */ "./node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js"); +var regexNextStatic = /\/_next(\/static\/.+)/g; +function parseStack(stack) { + var frames = stacktrace_parser_1.parse(stack); + return frames.map(function (frame) { + var _a, _b; + try { + var url = new URL(frame.file); + var res = regexNextStatic.exec(url.pathname); + if (res) { + var distDir = (_b = (_a = "G:\\typescript-solidity-dev-starter-kit\\.next") === null || _a === void 0 ? void 0 : _a.replace(/\\/g, '/')) === null || _b === void 0 ? void 0 : _b.replace(/\/$/, ''); + if (distDir) { + frame.file = 'file://' + distDir.concat(res.pop()); + } + } + } + catch (_c) { } + return frame; + }); +} +exports.parseStack = parseStack; +//# sourceMappingURL=parseStack.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/stack-frame.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/helpers/stack-frame.js ***! + \**********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +exports.__esModule = true; +function getOriginalStackFrames(isServerSide, frames) { + return Promise.all(frames.map(function (frame) { return getOriginalStackFrame(isServerSide, frame); })); +} +exports.getOriginalStackFrames = getOriginalStackFrames; +function getOriginalStackFrame(isServerSide, source) { + var _a, _b; + function _getOriginalStackFrame() { + var _a, _b, _c, _d, _e; + return __awaiter(this, void 0, void 0, function () { + var params, key, controller, tm, res, _f, _g, _h, body; + return __generator(this, function (_j) { + switch (_j.label) { + case 0: + params = new URLSearchParams(); + params.append('isServerSide', String(isServerSide)); + for (key in source) { + params.append(key, ((_a = source[key]) !== null && _a !== void 0 ? _a : '').toString()); + } + controller = new AbortController(); + tm = setTimeout(function () { return controller.abort(); }, 3000); + return [4 /*yield*/, self + .fetch(( false || '') + "/__nextjs_original-stack-frame?" + params.toString(), { + signal: controller.signal + })["finally"](function () { + clearTimeout(tm); + })]; + case 1: + res = _j.sent(); + if (!(!res.ok || res.status === 204)) return [3 /*break*/, 3]; + _g = (_f = Promise).reject; + _h = Error.bind; + return [4 /*yield*/, res.text()]; + case 2: return [2 /*return*/, _g.apply(_f, [new (_h.apply(Error, [void 0, _j.sent()]))()])]; + case 3: return [4 /*yield*/, res.json()]; + case 4: + body = _j.sent(); + return [2 /*return*/, { + error: false, + reason: null, + external: false, + expanded: !Boolean((_e = + /* collapsed */ + (((_b = source.file) === null || _b === void 0 ? void 0 : _b.includes('node_modules')) || ((_d = (_c = body.originalStackFrame) === null || _c === void 0 ? void 0 : _c.file) === null || _d === void 0 ? void 0 : _d.includes('node_modules')))) !== null && _e !== void 0 ? _e : true), + sourceStackFrame: source, + originalStackFrame: body.originalStackFrame, + originalCodeFrame: body.originalCodeFrame || null + }]; + } + }); + }); + } + if (!(((_a = source.file) === null || _a === void 0 ? void 0 : _a.startsWith('webpack-internal:')) || ((_b = source.file) === null || _b === void 0 ? void 0 : _b.startsWith('file:')))) { + return Promise.resolve({ + error: false, + reason: null, + external: true, + expanded: false, + sourceStackFrame: source, + originalStackFrame: null, + originalCodeFrame: null + }); + } + return _getOriginalStackFrame()["catch"](function (err) { + var _a, _b; + return ({ + error: true, + reason: (_b = (_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err === null || err === void 0 ? void 0 : err.toString()) !== null && _b !== void 0 ? _b : 'Unknown Error', + external: false, + expanded: false, + sourceStackFrame: source, + originalStackFrame: null, + originalCodeFrame: null + }); + }); +} +exports.getOriginalStackFrame = getOriginalStackFrame; +function getFrameSource(frame) { + var _a; + var str = ''; + try { + var u = new URL(frame.file); + // Strip the origin for same-origin scripts. + if (typeof globalThis !== 'undefined' && + ((_a = globalThis.location) === null || _a === void 0 ? void 0 : _a.origin) !== u.origin) { + // URLs can be valid without an `origin`, so long as they have a + // `protocol`. However, `origin` is preferred. + if (u.origin === 'null') { + str += u.protocol; + } + else { + str += u.origin; + } + } + // Strip query string information as it's typically too verbose to be + // meaningful. + str += u.pathname; + str += ' '; + } + catch (_b) { + str += (frame.file || '(unknown)') + ' '; + } + if (frame.lineNumber != null) { + if (frame.column != null) { + str += "(" + frame.lineNumber + ":" + frame.column + ") "; + } + else { + str += "(" + frame.lineNumber + ") "; + } + } + return str.slice(0, -1); +} +exports.getFrameSource = getFrameSource; +//# sourceMappingURL=stack-frame.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/hooks/use-on-click-outside.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/hooks/use-on-click-outside.js ***! + \*****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +function useOnClickOutside(el, handler) { + React.useEffect(function () { + if (el == null || handler == null) { + return; + } + var listener = function (e) { + // Do nothing if clicking ref's element or descendent elements + if (!el || el.contains(e.target)) { + return; + } + handler(e); + }; + var root = el.getRootNode(); + root.addEventListener('mousedown', listener); + root.addEventListener('touchstart', listener); + return function () { + root.removeEventListener('mousedown', listener); + root.removeEventListener('touchstart', listener); + }; + }, [handler, el]); +} +exports.useOnClickOutside = useOnClickOutside; +//# sourceMappingURL=use-on-click-outside.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/styles/Base.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/styles/Base.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var noop_template_1 = __webpack_require__(/*! ../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +function Base() { + return (React.createElement("style", { dangerouslySetInnerHTML: { + __html: noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n :host {\n --size-gap-half: 4px;\n --size-gap: 8px;\n --size-gap-double: 16px;\n --size-gap-quad: 32px;\n\n --size-font-small: 14px;\n --size-font: 16px;\n --size-font-big: 20px;\n --size-font-bigger: 24px;\n\n --color-accents-1: #808080;\n --color-accents-2: #222222;\n --color-accents-3: #404040;\n\n --font-stack-monospace: 'SFMono-Regular', Consolas,\n 'Liberation Mono', Menlo, Courier, monospace;\n\n --color-ansi-selection: rgba(95, 126, 151, 0.48);\n --color-ansi-bg: #111111;\n --color-ansi-fg: #cccccc;\n\n --color-ansi-white: #777777;\n --color-ansi-black: #141414;\n --color-ansi-blue: #00aaff;\n --color-ansi-cyan: #88ddff;\n --color-ansi-green: #98ec65;\n --color-ansi-magenta: #aa88ff;\n --color-ansi-red: #ff5555;\n --color-ansi-yellow: #ffcc33;\n --color-ansi-bright-white: #ffffff;\n --color-ansi-bright-black: #777777;\n --color-ansi-bright-blue: #33bbff;\n --color-ansi-bright-cyan: #bbecff;\n --color-ansi-bright-green: #b6f292;\n --color-ansi-bright-magenta: #cebbff;\n --color-ansi-bright-red: #ff8888;\n --color-ansi-bright-yellow: #ffd966;\n }\n\n .mono {\n font-family: var(--font-stack-monospace);\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-bottom: var(--size-gap);\n font-weight: 500;\n line-height: 1.5;\n }\n\n h1 {\n font-size: 40px;\n }\n h2 {\n font-size: 32px;\n }\n h3 {\n font-size: 28px;\n }\n h4 {\n font-size: 24px;\n }\n h5 {\n font-size: 20px;\n }\n h6 {\n font-size: 16px;\n }\n "], ["\n :host {\n --size-gap-half: 4px;\n --size-gap: 8px;\n --size-gap-double: 16px;\n --size-gap-quad: 32px;\n\n --size-font-small: 14px;\n --size-font: 16px;\n --size-font-big: 20px;\n --size-font-bigger: 24px;\n\n --color-accents-1: #808080;\n --color-accents-2: #222222;\n --color-accents-3: #404040;\n\n --font-stack-monospace: 'SFMono-Regular', Consolas,\n 'Liberation Mono', Menlo, Courier, monospace;\n\n --color-ansi-selection: rgba(95, 126, 151, 0.48);\n --color-ansi-bg: #111111;\n --color-ansi-fg: #cccccc;\n\n --color-ansi-white: #777777;\n --color-ansi-black: #141414;\n --color-ansi-blue: #00aaff;\n --color-ansi-cyan: #88ddff;\n --color-ansi-green: #98ec65;\n --color-ansi-magenta: #aa88ff;\n --color-ansi-red: #ff5555;\n --color-ansi-yellow: #ffcc33;\n --color-ansi-bright-white: #ffffff;\n --color-ansi-bright-black: #777777;\n --color-ansi-bright-blue: #33bbff;\n --color-ansi-bright-cyan: #bbecff;\n --color-ansi-bright-green: #b6f292;\n --color-ansi-bright-magenta: #cebbff;\n --color-ansi-bright-red: #ff8888;\n --color-ansi-bright-yellow: #ffd966;\n }\n\n .mono {\n font-family: var(--font-stack-monospace);\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-bottom: var(--size-gap);\n font-weight: 500;\n line-height: 1.5;\n }\n\n h1 {\n font-size: 40px;\n }\n h2 {\n font-size: 32px;\n }\n h3 {\n font-size: 28px;\n }\n h4 {\n font-size: 24px;\n }\n h5 {\n font-size: 20px;\n }\n h6 {\n font-size: 16px;\n }\n "]))) + } })); +} +exports.Base = Base; +var templateObject_1; +//# sourceMappingURL=Base.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/styles/ComponentStyles.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/styles/ComponentStyles.js ***! + \*************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var styles_1 = __webpack_require__(/*! ../components/CodeFrame/styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/CodeFrame/styles.js"); +var Dialog_1 = __webpack_require__(/*! ../components/Dialog */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Dialog/index.js"); +var styles_2 = __webpack_require__(/*! ../components/LeftRightDialogHeader/styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/LeftRightDialogHeader/styles.js"); +var styles_3 = __webpack_require__(/*! ../components/Overlay/styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Overlay/styles.js"); +var styles_4 = __webpack_require__(/*! ../components/Terminal/styles */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Terminal/styles.js"); +var Toast_1 = __webpack_require__(/*! ../components/Toast */ "./node_modules/@next/react-dev-overlay/lib/internal/components/Toast/index.js"); +var BuildError_1 = __webpack_require__(/*! ../container/BuildError */ "./node_modules/@next/react-dev-overlay/lib/internal/container/BuildError.js"); +var Errors_1 = __webpack_require__(/*! ../container/Errors */ "./node_modules/@next/react-dev-overlay/lib/internal/container/Errors.js"); +var RuntimeError_1 = __webpack_require__(/*! ../container/RuntimeError */ "./node_modules/@next/react-dev-overlay/lib/internal/container/RuntimeError.js"); +var noop_template_1 = __webpack_require__(/*! ../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +function ComponentStyles() { + return (React.createElement("style", { dangerouslySetInnerHTML: { + __html: noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n\n ", "\n ", "\n ", "\n "], ["\n ", "\n ", "\n ", "\n ", "\n ", "\n ", "\n\n ", "\n ", "\n ", "\n "])), styles_3.styles, Toast_1.styles, Dialog_1.styles, styles_2.styles, styles_1.styles, styles_4.styles, BuildError_1.styles, Errors_1.styles, RuntimeError_1.styles) + } })); +} +exports.ComponentStyles = ComponentStyles; +var templateObject_1; +//# sourceMappingURL=ComponentStyles.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/lib/internal/styles/CssReset.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/lib/internal/styles/CssReset.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +exports.__esModule = true; +var React = __importStar(__webpack_require__(/*! react */ "./node_modules/react/index.js")); +var noop_template_1 = __webpack_require__(/*! ../helpers/noop-template */ "./node_modules/@next/react-dev-overlay/lib/internal/helpers/noop-template.js"); +function CssReset() { + return (React.createElement("style", { dangerouslySetInnerHTML: { + __html: noop_template_1.noop(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n :host {\n all: initial;\n\n /* the direction property is not reset by 'all' */\n direction: ltr;\n }\n\n /*!\n * Bootstrap Reboot v4.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n }\n\n article,\n aside,\n figcaption,\n figure,\n footer,\n header,\n hgroup,\n main,\n nav,\n section {\n display: block;\n }\n\n :host {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,\n 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n 'Noto Color Emoji';\n font-size: 16px;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n }\n\n [tabindex='-1']:focus:not(:focus-visible) {\n outline: 0 !important;\n }\n\n hr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n p {\n margin-top: 0;\n margin-bottom: 16px;\n }\n\n abbr[title],\n abbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n }\n\n address {\n margin-bottom: 16px;\n font-style: normal;\n line-height: inherit;\n }\n\n ol,\n ul,\n dl {\n margin-top: 0;\n margin-bottom: 16px;\n }\n\n ol ol,\n ul ul,\n ol ul,\n ul ol {\n margin-bottom: 0;\n }\n\n dt {\n font-weight: 700;\n }\n\n dd {\n margin-bottom: 8px;\n margin-left: 0;\n }\n\n blockquote {\n margin: 0 0 16px;\n }\n\n b,\n strong {\n font-weight: bolder;\n }\n\n small {\n font-size: 80%;\n }\n\n sub,\n sup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n a {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n }\n\n a:hover {\n color: #0056b3;\n text-decoration: underline;\n }\n\n a:not([href]) {\n color: inherit;\n text-decoration: none;\n }\n\n a:not([href]):hover {\n color: inherit;\n text-decoration: none;\n }\n\n pre,\n code,\n kbd,\n samp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas,\n 'Liberation Mono', 'Courier New', monospace;\n font-size: 1em;\n }\n\n pre {\n margin-top: 0;\n margin-bottom: 16px;\n overflow: auto;\n }\n\n figure {\n margin: 0 0 16px;\n }\n\n img {\n vertical-align: middle;\n border-style: none;\n }\n\n svg {\n overflow: hidden;\n vertical-align: middle;\n }\n\n table {\n border-collapse: collapse;\n }\n\n caption {\n padding-top: 12px;\n padding-bottom: 12px;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n }\n\n th {\n text-align: inherit;\n }\n\n label {\n display: inline-block;\n margin-bottom: 8px;\n }\n\n button {\n border-radius: 0;\n }\n\n button:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n }\n\n input,\n button,\n select,\n optgroup,\n textarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n\n button,\n input {\n overflow: visible;\n }\n\n button,\n select {\n text-transform: none;\n }\n\n select {\n word-wrap: normal;\n }\n\n button,\n [type='button'],\n [type='reset'],\n [type='submit'] {\n -webkit-appearance: button;\n }\n\n button:not(:disabled),\n [type='button']:not(:disabled),\n [type='reset']:not(:disabled),\n [type='submit']:not(:disabled) {\n cursor: pointer;\n }\n\n button::-moz-focus-inner,\n [type='button']::-moz-focus-inner,\n [type='reset']::-moz-focus-inner,\n [type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n }\n\n input[type='radio'],\n input[type='checkbox'] {\n box-sizing: border-box;\n padding: 0;\n }\n\n input[type='date'],\n input[type='time'],\n input[type='datetime-local'],\n input[type='month'] {\n -webkit-appearance: listbox;\n }\n\n textarea {\n overflow: auto;\n resize: vertical;\n }\n\n fieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n }\n\n legend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: 8px;\n font-size: 24px;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n }\n\n progress {\n vertical-align: baseline;\n }\n\n [type='number']::-webkit-inner-spin-button,\n [type='number']::-webkit-outer-spin-button {\n height: auto;\n }\n\n [type='search'] {\n outline-offset: -2px;\n -webkit-appearance: none;\n }\n\n [type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n ::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n }\n\n output {\n display: inline-block;\n }\n\n summary {\n display: list-item;\n cursor: pointer;\n }\n\n template {\n display: none;\n }\n\n [hidden] {\n display: none !important;\n }\n "], ["\n :host {\n all: initial;\n\n /* the direction property is not reset by 'all' */\n direction: ltr;\n }\n\n /*!\n * Bootstrap Reboot v4.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n :host {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n }\n\n article,\n aside,\n figcaption,\n figure,\n footer,\n header,\n hgroup,\n main,\n nav,\n section {\n display: block;\n }\n\n :host {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,\n 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,\n 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n 'Noto Color Emoji';\n font-size: 16px;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n }\n\n [tabindex='-1']:focus:not(:focus-visible) {\n outline: 0 !important;\n }\n\n hr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 0;\n margin-bottom: 8px;\n }\n\n p {\n margin-top: 0;\n margin-bottom: 16px;\n }\n\n abbr[title],\n abbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n }\n\n address {\n margin-bottom: 16px;\n font-style: normal;\n line-height: inherit;\n }\n\n ol,\n ul,\n dl {\n margin-top: 0;\n margin-bottom: 16px;\n }\n\n ol ol,\n ul ul,\n ol ul,\n ul ol {\n margin-bottom: 0;\n }\n\n dt {\n font-weight: 700;\n }\n\n dd {\n margin-bottom: 8px;\n margin-left: 0;\n }\n\n blockquote {\n margin: 0 0 16px;\n }\n\n b,\n strong {\n font-weight: bolder;\n }\n\n small {\n font-size: 80%;\n }\n\n sub,\n sup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n }\n\n sub {\n bottom: -0.25em;\n }\n\n sup {\n top: -0.5em;\n }\n\n a {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n }\n\n a:hover {\n color: #0056b3;\n text-decoration: underline;\n }\n\n a:not([href]) {\n color: inherit;\n text-decoration: none;\n }\n\n a:not([href]):hover {\n color: inherit;\n text-decoration: none;\n }\n\n pre,\n code,\n kbd,\n samp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas,\n 'Liberation Mono', 'Courier New', monospace;\n font-size: 1em;\n }\n\n pre {\n margin-top: 0;\n margin-bottom: 16px;\n overflow: auto;\n }\n\n figure {\n margin: 0 0 16px;\n }\n\n img {\n vertical-align: middle;\n border-style: none;\n }\n\n svg {\n overflow: hidden;\n vertical-align: middle;\n }\n\n table {\n border-collapse: collapse;\n }\n\n caption {\n padding-top: 12px;\n padding-bottom: 12px;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n }\n\n th {\n text-align: inherit;\n }\n\n label {\n display: inline-block;\n margin-bottom: 8px;\n }\n\n button {\n border-radius: 0;\n }\n\n button:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n }\n\n input,\n button,\n select,\n optgroup,\n textarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n }\n\n button,\n input {\n overflow: visible;\n }\n\n button,\n select {\n text-transform: none;\n }\n\n select {\n word-wrap: normal;\n }\n\n button,\n [type='button'],\n [type='reset'],\n [type='submit'] {\n -webkit-appearance: button;\n }\n\n button:not(:disabled),\n [type='button']:not(:disabled),\n [type='reset']:not(:disabled),\n [type='submit']:not(:disabled) {\n cursor: pointer;\n }\n\n button::-moz-focus-inner,\n [type='button']::-moz-focus-inner,\n [type='reset']::-moz-focus-inner,\n [type='submit']::-moz-focus-inner {\n padding: 0;\n border-style: none;\n }\n\n input[type='radio'],\n input[type='checkbox'] {\n box-sizing: border-box;\n padding: 0;\n }\n\n input[type='date'],\n input[type='time'],\n input[type='datetime-local'],\n input[type='month'] {\n -webkit-appearance: listbox;\n }\n\n textarea {\n overflow: auto;\n resize: vertical;\n }\n\n fieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n }\n\n legend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: 8px;\n font-size: 24px;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n }\n\n progress {\n vertical-align: baseline;\n }\n\n [type='number']::-webkit-inner-spin-button,\n [type='number']::-webkit-outer-spin-button {\n height: auto;\n }\n\n [type='search'] {\n outline-offset: -2px;\n -webkit-appearance: none;\n }\n\n [type='search']::-webkit-search-decoration {\n -webkit-appearance: none;\n }\n\n ::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n }\n\n output {\n display: inline-block;\n }\n\n summary {\n display: list-item;\n cursor: pointer;\n }\n\n template {\n display: none;\n }\n\n [hidden] {\n display: none !important;\n }\n "]))) + } })); +} +exports.CssReset = CssReset; +var templateObject_1; +//# sourceMappingURL=CssReset.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/node_modules/ansi-regex/index.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/node_modules/ansi-regex/index.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +module.exports = function () { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$onlyFirst = _ref.onlyFirst, + onlyFirst = _ref$onlyFirst === void 0 ? false : _ref$onlyFirst; + + var pattern = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))'].join('|'); + return new RegExp(pattern, onlyFirst ? undefined : 'g'); +}; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../next/dist/compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/@next/react-dev-overlay/node_modules/strip-ansi/index.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@next/react-dev-overlay/node_modules/strip-ansi/index.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var ansiRegex = __webpack_require__(/*! ansi-regex */ "./node_modules/@next/react-dev-overlay/node_modules/ansi-regex/index.js"); + +module.exports = function (string) { + return typeof string === 'string' ? string.replace(ansiRegex(), '') : string; +}; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../next/dist/compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/anser/lib/index.js": +/*!*****************************************!*\ + !*** ./node_modules/anser/lib/index.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +// This file was originally written by @drudru (https://github.com/drudru/ansi_up), MIT, 2011 + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var ANSI_COLORS = [[{ color: "0, 0, 0", "class": "ansi-black" }, { color: "187, 0, 0", "class": "ansi-red" }, { color: "0, 187, 0", "class": "ansi-green" }, { color: "187, 187, 0", "class": "ansi-yellow" }, { color: "0, 0, 187", "class": "ansi-blue" }, { color: "187, 0, 187", "class": "ansi-magenta" }, { color: "0, 187, 187", "class": "ansi-cyan" }, { color: "255,255,255", "class": "ansi-white" }], [{ color: "85, 85, 85", "class": "ansi-bright-black" }, { color: "255, 85, 85", "class": "ansi-bright-red" }, { color: "0, 255, 0", "class": "ansi-bright-green" }, { color: "255, 255, 85", "class": "ansi-bright-yellow" }, { color: "85, 85, 255", "class": "ansi-bright-blue" }, { color: "255, 85, 255", "class": "ansi-bright-magenta" }, { color: "85, 255, 255", "class": "ansi-bright-cyan" }, { color: "255, 255, 255", "class": "ansi-bright-white" }]]; + +var Anser = function () { + _createClass(Anser, null, [{ + key: "escapeForHtml", + + + /** + * Anser.escapeForHtml + * Escape the input HTML. + * + * This does the minimum escaping of text to make it compliant with HTML. + * In particular, the '&','<', and '>' characters are escaped. This should + * be run prior to `ansiToHtml`. + * + * @name Anser.escapeForHtml + * @function + * @param {String} txt The input text (containing the ANSI snippets). + * @returns {String} The escaped html. + */ + value: function escapeForHtml(txt) { + return new Anser().escapeForHtml(txt); + } + + /** + * Anser.linkify + * Adds the links in the HTML. + * + * This replaces any links in the text with anchor tags that display the + * link. The links should have at least one whitespace character + * surrounding it. Also, you should apply this after you have run + * `ansiToHtml` on the text. + * + * @name Anser.linkify + * @function + * @param {String} txt The input text. + * @returns {String} The HTML containing the <a> tags (unescaped). + */ + + }, { + key: "linkify", + value: function linkify(txt) { + return new Anser().linkify(txt); + } + + /** + * Anser.ansiToHtml + * This replaces ANSI terminal escape codes with SPAN tags that wrap the + * content. + * + * This function only interprets ANSI SGR (Select Graphic Rendition) codes + * that can be represented in HTML. + * For example, cursor movement codes are ignored and hidden from output. + * The default style uses colors that are very close to the prescribed + * standard. The standard assumes that the text will have a black + * background. These colors are set as inline styles on the SPAN tags. + * + * Another option is to set `use_classes: true` in the options argument. + * This will instead set classes on the spans so the colors can be set via + * CSS. The class names used are of the format `ansi-*-fg/bg` and + * `ansi-bright-*-fg/bg` where `*` is the color name, + * i.e black/red/green/yellow/blue/magenta/cyan/white. + * + * @name Anser.ansiToHtml + * @function + * @param {String} txt The input text. + * @param {Object} options The options passed to the ansiToHTML method. + * @returns {String} The HTML output. + */ + + }, { + key: "ansiToHtml", + value: function ansiToHtml(txt, options) { + return new Anser().ansiToHtml(txt, options); + } + + /** + * Anser.ansiToJson + * Converts ANSI input into JSON output. + * + * @name Anser.ansiToJson + * @function + * @param {String} txt The input text. + * @param {Object} options The options passed to the ansiToHTML method. + * @returns {String} The HTML output. + */ + + }, { + key: "ansiToJson", + value: function ansiToJson(txt, options) { + return new Anser().ansiToJson(txt, options); + } + + /** + * Anser.ansiToText + * Converts ANSI input into text output. + * + * @name Anser.ansiToText + * @function + * @param {String} txt The input text. + * @returns {String} The text output. + */ + + }, { + key: "ansiToText", + value: function ansiToText(txt) { + return new Anser().ansiToText(txt); + } + + /** + * Anser + * The `Anser` class. + * + * @name Anser + * @function + * @returns {Anser} + */ + + }]); + + function Anser() { + _classCallCheck(this, Anser); + + this.fg = this.bg = this.fg_truecolor = this.bg_truecolor = null; + this.bright = 0; + } + + /** + * setupPalette + * Sets up the palette. + * + * @name setupPalette + * @function + */ + + + _createClass(Anser, [{ + key: "setupPalette", + value: function setupPalette() { + this.PALETTE_COLORS = []; + + // Index 0..15 : System color + for (var i = 0; i < 2; ++i) { + for (var j = 0; j < 8; ++j) { + this.PALETTE_COLORS.push(ANSI_COLORS[i][j].color); + } + } + + // Index 16..231 : RGB 6x6x6 + // https://gist.github.com/jasonm23/2868981#file-xterm-256color-yaml + var levels = [0, 95, 135, 175, 215, 255]; + var format = function format(r, g, b) { + return levels[r] + ", " + levels[g] + ", " + levels[b]; + }; + var r = void 0, + g = void 0, + b = void 0; + for (var _r = 0; _r < 6; ++_r) { + for (var _g = 0; _g < 6; ++_g) { + for (var _b = 0; _b < 6; ++_b) { + this.PALETTE_COLORS.push(format(_r, _g, _b)); + } + } + } + + // Index 232..255 : Grayscale + var level = 8; + for (var _i = 0; _i < 24; ++_i, level += 10) { + this.PALETTE_COLORS.push(format(level, level, level)); + } + } + + /** + * escapeForHtml + * Escapes the input text. + * + * @name escapeForHtml + * @function + * @param {String} txt The input text. + * @returns {String} The escpaed HTML output. + */ + + }, { + key: "escapeForHtml", + value: function escapeForHtml(txt) { + return txt.replace(/[&<>]/gm, function (str) { + return str == "&" ? "&" : str == "<" ? "<" : str == ">" ? ">" : ""; + }); + } + + /** + * linkify + * Adds HTML link elements. + * + * @name linkify + * @function + * @param {String} txt The input text. + * @returns {String} The HTML output containing link elements. + */ + + }, { + key: "linkify", + value: function linkify(txt) { + return txt.replace(/(https?:\/\/[^\s]+)/gm, function (str) { + return "<a href=\"" + str + "\">" + str + "</a>"; + }); + } + + /** + * ansiToHtml + * Converts ANSI input into HTML output. + * + * @name ansiToHtml + * @function + * @param {String} txt The input text. + * @param {Object} options The options passed ot the `process` method. + * @returns {String} The HTML output. + */ + + }, { + key: "ansiToHtml", + value: function ansiToHtml(txt, options) { + return this.process(txt, options, true); + } + + /** + * ansiToJson + * Converts ANSI input into HTML output. + * + * @name ansiToJson + * @function + * @param {String} txt The input text. + * @param {Object} options The options passed ot the `process` method. + * @returns {String} The JSON output. + */ + + }, { + key: "ansiToJson", + value: function ansiToJson(txt, options) { + options = options || {}; + options.json = true; + options.clearLine = false; + return this.process(txt, options, true); + } + + /** + * ansiToText + * Converts ANSI input into HTML output. + * + * @name ansiToText + * @function + * @param {String} txt The input text. + * @returns {String} The text output. + */ + + }, { + key: "ansiToText", + value: function ansiToText(txt) { + return this.process(txt, {}, false); + } + + /** + * process + * Processes the input. + * + * @name process + * @function + * @param {String} txt The input text. + * @param {Object} options An object passed to `processChunk` method, extended with: + * + * - `json` (Boolean): If `true`, the result will be an object. + * - `use_classes` (Boolean): If `true`, HTML classes will be appended to the HTML output. + * + * @param {Boolean} markup + */ + + }, { + key: "process", + value: function process(txt, options, markup) { + var _this = this; + + var self = this; + var raw_text_chunks = txt.split(/\033\[/); + var first_chunk = raw_text_chunks.shift(); // the first chunk is not the result of the split + + if (options === undefined || options === null) { + options = {}; + } + options.clearLine = /\r/.test(txt); // check for Carriage Return + var color_chunks = raw_text_chunks.map(function (chunk) { + return _this.processChunk(chunk, options, markup); + }); + + if (options && options.json) { + var first = self.processChunkJson(""); + first.content = first_chunk; + first.clearLine = options.clearLine; + color_chunks.unshift(first); + if (options.remove_empty) { + color_chunks = color_chunks.filter(function (c) { + return !c.isEmpty(); + }); + } + return color_chunks; + } else { + color_chunks.unshift(first_chunk); + } + + return color_chunks.join(""); + } + + /** + * processChunkJson + * Processes the current chunk into json output. + * + * @name processChunkJson + * @function + * @param {String} text The input text. + * @param {Object} options An object containing the following fields: + * + * - `json` (Boolean): If `true`, the result will be an object. + * - `use_classes` (Boolean): If `true`, HTML classes will be appended to the HTML output. + * + * @param {Boolean} markup If false, the colors will not be parsed. + * @return {Object} The result object: + * + * - `content` (String): The text. + * - `fg` (String|null): The foreground color. + * - `bg` (String|null): The background color. + * - `fg_truecolor` (String|null): The foreground true color (if 16m color is enabled). + * - `bg_truecolor` (String|null): The background true color (if 16m color is enabled). + * - `clearLine` (Boolean): `true` if a carriageReturn \r was fount at end of line. + * - `was_processed` (Bolean): `true` if the colors were processed, `false` otherwise. + * - `isEmpty` (Function): A function returning `true` if the content is empty, or `false` otherwise. + * + */ + + }, { + key: "processChunkJson", + value: function processChunkJson(text, options, markup) { + + // Are we using classes or styles? + options = typeof options == "undefined" ? {} : options; + var use_classes = options.use_classes = typeof options.use_classes != "undefined" && options.use_classes; + var key = options.key = use_classes ? "class" : "color"; + + var result = { + content: text, + fg: null, + bg: null, + fg_truecolor: null, + bg_truecolor: null, + clearLine: options.clearLine, + decoration: null, + was_processed: false, + isEmpty: function isEmpty() { + return !result.content; + } + }; + + // Each "chunk" is the text after the CSI (ESC + "[") and before the next CSI/EOF. + // + // This regex matches four groups within a chunk. + // + // The first and third groups match code type. + // We supported only SGR command. It has empty first group and "m" in third. + // + // The second group matches all of the number+semicolon command sequences + // before the "m" (or other trailing) character. + // These are the graphics or SGR commands. + // + // The last group is the text (including newlines) that is colored by + // the other group"s commands. + var matches = text.match(/^([!\x3c-\x3f]*)([\d;]*)([\x20-\x2c]*[\x40-\x7e])([\s\S]*)/m); + + if (!matches) return result; + + var orig_txt = result.content = matches[4]; + var nums = matches[2].split(";"); + + // We currently support only "SGR" (Select Graphic Rendition) + // Simply ignore if not a SGR command. + if (matches[1] !== "" || matches[3] !== "m") { + return result; + } + + if (!markup) { + return result; + } + + var self = this; + + self.decoration = null; + + while (nums.length > 0) { + var num_str = nums.shift(); + var num = parseInt(num_str); + + if (isNaN(num) || num === 0) { + self.fg = self.bg = self.decoration = null; + } else if (num === 1) { + self.decoration = "bold"; + } else if (num === 2) { + self.decoration = "dim"; + // Enable code 2 to get string + } else if (num == 3) { + self.decoration = "italic"; + } else if (num == 4) { + self.decoration = "underline"; + } else if (num == 5) { + self.decoration = "blink"; + } else if (num === 7) { + self.decoration = "reverse"; + } else if (num === 8) { + self.decoration = "hidden"; + // Enable code 9 to get strikethrough + } else if (num === 9) { + self.decoration = "strikethrough"; + } else if (num == 39) { + self.fg = null; + } else if (num == 49) { + self.bg = null; + // Foreground color + } else if (num >= 30 && num < 38) { + self.fg = ANSI_COLORS[0][num % 10][key]; + // Foreground bright color + } else if (num >= 90 && num < 98) { + self.fg = ANSI_COLORS[1][num % 10][key]; + // Background color + } else if (num >= 40 && num < 48) { + self.bg = ANSI_COLORS[0][num % 10][key]; + // Background bright color + } else if (num >= 100 && num < 108) { + self.bg = ANSI_COLORS[1][num % 10][key]; + } else if (num === 38 || num === 48) { + // extend color (38=fg, 48=bg) + var is_foreground = num === 38; + if (nums.length >= 1) { + var mode = nums.shift(); + if (mode === "5" && nums.length >= 1) { + // palette color + var palette_index = parseInt(nums.shift()); + if (palette_index >= 0 && palette_index <= 255) { + if (!use_classes) { + if (!this.PALETTE_COLORS) { + self.setupPalette(); + } + if (is_foreground) { + self.fg = this.PALETTE_COLORS[palette_index]; + } else { + self.bg = this.PALETTE_COLORS[palette_index]; + } + } else { + var klass = palette_index >= 16 ? "ansi-palette-" + palette_index : ANSI_COLORS[palette_index > 7 ? 1 : 0][palette_index % 8]["class"]; + if (is_foreground) { + self.fg = klass; + } else { + self.bg = klass; + } + } + } + } else if (mode === "2" && nums.length >= 3) { + // true color + var r = parseInt(nums.shift()); + var g = parseInt(nums.shift()); + var b = parseInt(nums.shift()); + if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255) { + var color = r + ", " + g + ", " + b; + if (!use_classes) { + if (is_foreground) { + self.fg = color; + } else { + self.bg = color; + } + } else { + if (is_foreground) { + self.fg = "ansi-truecolor"; + self.fg_truecolor = color; + } else { + self.bg = "ansi-truecolor"; + self.bg_truecolor = color; + } + } + } + } + } + } + } + + if (self.fg === null && self.bg === null && self.decoration === null) { + return result; + } else { + var styles = []; + var classes = []; + var data = {}; + + result.fg = self.fg; + result.bg = self.bg; + result.fg_truecolor = self.fg_truecolor; + result.bg_truecolor = self.bg_truecolor; + result.decoration = self.decoration; + result.was_processed = true; + + return result; + } + } + + /** + * processChunk + * Processes the current chunk of text. + * + * @name processChunk + * @function + * @param {String} text The input text. + * @param {Object} options An object containing the following fields: + * + * - `json` (Boolean): If `true`, the result will be an object. + * - `use_classes` (Boolean): If `true`, HTML classes will be appended to the HTML output. + * + * @param {Boolean} markup If false, the colors will not be parsed. + * @return {Object|String} The result (object if `json` is wanted back or string otherwise). + */ + + }, { + key: "processChunk", + value: function processChunk(text, options, markup) { + var _this2 = this; + + var self = this; + options = options || {}; + var jsonChunk = this.processChunkJson(text, options, markup); + + if (options.json) { + return jsonChunk; + } + if (jsonChunk.isEmpty()) { + return ""; + } + if (!jsonChunk.was_processed) { + return jsonChunk.content; + } + + var use_classes = options.use_classes; + + var styles = []; + var classes = []; + var data = {}; + var render_data = function render_data(data) { + var fragments = []; + var key = void 0; + for (key in data) { + if (data.hasOwnProperty(key)) { + fragments.push("data-" + key + "=\"" + _this2.escapeForHtml(data[key]) + "\""); + } + } + return fragments.length > 0 ? " " + fragments.join(" ") : ""; + }; + + if (jsonChunk.fg) { + if (use_classes) { + classes.push(jsonChunk.fg + "-fg"); + if (jsonChunk.fg_truecolor !== null) { + data["ansi-truecolor-fg"] = jsonChunk.fg_truecolor; + jsonChunk.fg_truecolor = null; + } + } else { + styles.push("color:rgb(" + jsonChunk.fg + ")"); + } + } + + if (jsonChunk.bg) { + if (use_classes) { + classes.push(jsonChunk.bg + "-bg"); + if (jsonChunk.bg_truecolor !== null) { + data["ansi-truecolor-bg"] = jsonChunk.bg_truecolor; + jsonChunk.bg_truecolor = null; + } + } else { + styles.push("background-color:rgb(" + jsonChunk.bg + ")"); + } + } + + if (jsonChunk.decoration) { + if (use_classes) { + classes.push("ansi-" + jsonChunk.decoration); + } else if (jsonChunk.decoration === "bold") { + styles.push("font-weight:bold"); + } else if (jsonChunk.decoration === "dim") { + styles.push("opacity:0.5"); + } else if (jsonChunk.decoration === "italic") { + styles.push("font-style:italic"); + // underline and blink are treated bellow + } else if (jsonChunk.decoration === "reverse") { + styles.push("filter:invert(100%)"); + } else if (jsonChunk.decoration === "hidden") { + styles.push("visibility:hidden"); + } else if (jsonChunk.decoration === "strikethrough") { + styles.push("text-decoration:line-through"); + } else { + styles.push("text-decoration:" + jsonChunk.decoration); + } + } + + if (use_classes) { + return "<span class=\"" + classes.join(" ") + "\"" + render_data(data) + ">" + jsonChunk.content + "</span>"; + } else { + return "<span style=\"" + styles.join(";") + "\"" + render_data(data) + ">" + jsonChunk.content + "</span>"; + } + } + }]); + + return Anser; +}(); + +; + +module.exports = Anser; + +/***/ }), + +/***/ "./node_modules/css.escape/css.escape.js": +/*!***********************************************!*\ + !*** ./node_modules/css.escape/css.escape.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */ +;(function(root, factory) { + // https://github.com/umdjs/umd/blob/master/returnExports.js + if (true) { + // For Node.js. + module.exports = factory(root); + } else {} +}(typeof global != 'undefined' ? global : this, function(root) { + + if (root.CSS && root.CSS.escape) { + return root.CSS.escape; + } + + // https://drafts.csswg.org/cssom/#serialize-an-identifier + var cssEscape = function(value) { + if (arguments.length == 0) { + throw new TypeError('`CSS.escape` requires an argument.'); + } + var string = String(value); + var length = string.length; + var index = -1; + var codeUnit; + var result = ''; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + // Note: there’s no need to special-case astral symbols, surrogate + // pairs, or lone surrogates. + + // If the character is NULL (U+0000), then the REPLACEMENT CHARACTER + // (U+FFFD). + if (codeUnit == 0x0000) { + result += '\uFFFD'; + continue; + } + + if ( + // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is + // U+007F, […] + (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || + // If the character is the first character and is in the range [0-9] + // (U+0030 to U+0039), […] + (index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + // If the character is the second character and is in the range [0-9] + // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] + ( + index == 1 && + codeUnit >= 0x0030 && codeUnit <= 0x0039 && + firstCodeUnit == 0x002D + ) + ) { + // https://drafts.csswg.org/cssom/#escape-a-character-as-code-point + result += '\\' + codeUnit.toString(16) + ' '; + continue; + } + + if ( + // If the character is the first character and is a `-` (U+002D), and + // there is no second character, […] + index == 0 && + length == 1 && + codeUnit == 0x002D + ) { + result += '\\' + string.charAt(index); + continue; + } + + // If the character is not handled by one of the above rules and is + // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or + // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to + // U+005A), or [a-z] (U+0061 to U+007A), […] + if ( + codeUnit >= 0x0080 || + codeUnit == 0x002D || + codeUnit == 0x005F || + codeUnit >= 0x0030 && codeUnit <= 0x0039 || + codeUnit >= 0x0041 && codeUnit <= 0x005A || + codeUnit >= 0x0061 && codeUnit <= 0x007A + ) { + // the character itself + result += string.charAt(index); + continue; + } + + // Otherwise, the escaped character. + // https://drafts.csswg.org/cssom/#escape-a-character + result += '\\' + string.charAt(index); + + } + return result; + }; + + if (!root.CSS) { + root.CSS = {}; + } + + root.CSS.escape = cssEscape; + return cssEscape; + +})); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../next/dist/compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/next/dist/build/polyfills/object-assign.js": +/*!*****************************************************************!*\ + !*** ./node_modules/next/dist/build/polyfills/object-assign.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +var assign=Object.assign.bind(Object);module.exports=assign;module.exports.default=module.exports; +//# sourceMappingURL=object-assign.js.map + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/dev-build-watcher.js": +/*!****************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/dev-build-watcher.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = initializeBuildWatcher; + +var _eventsource = __webpack_require__(/*! ./error-overlay/eventsource */ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js"); + +function initializeBuildWatcher(toggleCallback) { + var shadowHost = document.createElement('div'); + shadowHost.id = '__next-build-watcher'; // Make sure container is fixed and on a high zIndex so it shows + + shadowHost.style.position = 'fixed'; + shadowHost.style.bottom = '10px'; + shadowHost.style.right = '20px'; + shadowHost.style.width = 0; + shadowHost.style.height = 0; + shadowHost.style.zIndex = 99999; + document.body.appendChild(shadowHost); + var shadowRoot; + var prefix = ''; + + if (shadowHost.attachShadow) { + shadowRoot = shadowHost.attachShadow({ + mode: 'open' + }); + } else { + // If attachShadow is undefined then the browser does not support + // the Shadow DOM, we need to prefix all the names so there + // will be no conflicts + shadowRoot = shadowHost; + prefix = '__next-build-watcher-'; + } // Container + + + var container = createContainer(prefix); + shadowRoot.appendChild(container); // CSS + + var css = createCss(prefix); + shadowRoot.appendChild(css); // State + + var isVisible = false; + var isBuilding = false; + var timeoutId = null; // Handle events + + var evtSource = (0, _eventsource.getEventSourceWrapper)({ + path: '/_next/webpack-hmr' + }); + evtSource.addMessageListener(function (event) { + // This is the heartbeat event + if (event.data === "\uD83D\uDC93") { + return; + } + + try { + handleMessage(event); + } catch (_unused) {} + }); + + function handleMessage(event) { + var obj = typeof event === 'string' ? { + action: event + } : JSON.parse(event.data); // eslint-disable-next-line default-case + + switch (obj.action) { + case 'building': + timeoutId && clearTimeout(timeoutId); + isVisible = true; + isBuilding = true; + updateContainer(); + break; + + case 'built': + case 'sync': + isBuilding = false; // Wait for the fade out transtion to complete + + timeoutId = setTimeout(function () { + isVisible = false; + updateContainer(); + }, 100); + updateContainer(); + break; + } + } + + toggleCallback(handleMessage); + + function updateContainer() { + if (isBuilding) { + container.classList.add("".concat(prefix, "building")); + } else { + container.classList.remove("".concat(prefix, "building")); + } + + if (isVisible) { + container.classList.add("".concat(prefix, "visible")); + } else { + container.classList.remove("".concat(prefix, "visible")); + } + } +} + +function createContainer(prefix) { + var container = document.createElement('div'); + container.id = "".concat(prefix, "container"); + container.innerHTML = "\n <div id=\"".concat(prefix, "icon-wrapper\">\n <svg viewBox=\"0 0 226 200\">\n <defs>\n <linearGradient\n x1=\"114.720775%\"\n y1=\"181.283245%\"\n x2=\"39.5399306%\"\n y2=\"100%\"\n id=\"").concat(prefix, "linear-gradient\"\n >\n <stop stop-color=\"#000000\" offset=\"0%\" />\n <stop stop-color=\"#FFFFFF\" offset=\"100%\" />\n </linearGradient>\n </defs>\n <g id=\"").concat(prefix, "icon-group\" fill=\"none\" stroke=\"url(#").concat(prefix, "linear-gradient)\" stroke-width=\"18\">\n <path d=\"M113,5.08219117 L4.28393801,197.5 L221.716062,197.5 L113,5.08219117 Z\" />\n </g>\n </svg>\n </div>\n "); + return container; +} + +function createCss(prefix) { + var css = document.createElement('style'); + css.textContent = "\n #".concat(prefix, "container {\n position: absolute;\n bottom: 10px;\n right: 30px;\n\n border-radius: 3px;\n background: #000;\n color: #fff;\n font: initial;\n cursor: initial;\n letter-spacing: initial;\n text-shadow: initial;\n text-transform: initial;\n visibility: initial;\n\n padding: 7px 10px 8px 10px;\n align-items: center;\n box-shadow: 0 11px 40px 0 rgba(0, 0, 0, 0.25), 0 2px 10px 0 rgba(0, 0, 0, 0.12);\n\n display: none;\n opacity: 0;\n transition: opacity 0.1s ease, bottom 0.1s ease;\n animation: ").concat(prefix, "fade-in 0.1s ease-in-out;\n }\n\n #").concat(prefix, "container.").concat(prefix, "visible {\n display: flex;\n }\n\n #").concat(prefix, "container.").concat(prefix, "building {\n bottom: 20px;\n opacity: 1;\n }\n\n #").concat(prefix, "icon-wrapper {\n width: 16px;\n height: 16px;\n }\n\n #").concat(prefix, "icon-wrapper > svg {\n width: 100%;\n height: 100%;\n }\n\n #").concat(prefix, "icon-group {\n animation: ").concat(prefix, "strokedash 1s ease-in-out both infinite;\n }\n\n @keyframes ").concat(prefix, "fade-in {\n from {\n bottom: 10px;\n opacity: 0;\n }\n to {\n bottom: 20px;\n opacity: 1;\n }\n }\n\n @keyframes ").concat(prefix, "strokedash {\n 0% {\n stroke-dasharray: 0 226;\n }\n 80%,\n 100% {\n stroke-dasharray: 659 226;\n }\n }\n "); + return css; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js": +/*!************************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/error-overlay/eventsource.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.getEventSourceWrapper = getEventSourceWrapper; +var eventCallbacks = []; + +function EventSourceWrapper(options) { + var source; + var lastActivity = new Date(); + var listeners = []; + + if (!options.timeout) { + options.timeout = 20 * 1000; + } + + init(); + var timer = setInterval(function () { + if (new Date() - lastActivity > options.timeout) { + handleDisconnect(); + } + }, options.timeout / 2); + + function init() { + source = new window.EventSource(options.path); + source.onopen = handleOnline; + source.onerror = handleDisconnect; + source.onmessage = handleMessage; + } + + function handleOnline() { + if (options.log) console.log('[HMR] connected'); + lastActivity = new Date(); + } + + function handleMessage(event) { + lastActivity = new Date(); + + for (var i = 0; i < listeners.length; i++) { + listeners[i](event); + } + + eventCallbacks.forEach(function (cb) { + if (!cb.unfiltered && event.data.indexOf('action') === -1) return; + cb(event); + }); + } + + function handleDisconnect() { + clearInterval(timer); + source.close(); + setTimeout(init, options.timeout); + } + + return { + close: function close() { + clearInterval(timer); + source.close(); + }, + addMessageListener: function addMessageListener(fn) { + listeners.push(fn); + } + }; +} + +_c = EventSourceWrapper; + +function getEventSourceWrapper(options) { + if (!options.ondemand) { + return { + addMessageListener: function addMessageListener(cb) { + eventCallbacks.push(cb); + } + }; + } + + return EventSourceWrapper(options); +} + +var _c; + +$RefreshReg$(_c, "EventSourceWrapper"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/error-overlay/format-webpack-messages.js": +/*!************************************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/error-overlay/format-webpack-messages.js ***! + \************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +/** +MIT License +Copyright (c) 2015-present, Facebook, Inc. +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. +*/ +// This file is based on https://github.com/facebook/create-react-app/blob/7b1a32be6ec9f99a6c9a3c66813f3ac09c4736b9/packages/react-dev-utils/formatWebpackMessages.js +// It's been edited to remove chalk and CRA-specific logic + +var _toConsumableArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/toConsumableArray.js"); + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var friendlySyntaxErrorLabel = 'Syntax error:'; + +function isLikelyASyntaxError(message) { + return message.indexOf(friendlySyntaxErrorLabel) !== -1; +} // Cleans up webpack error messages. + + +function formatMessage(message) { + // TODO: Replace this once webpack 5 is stable + if (typeof message === 'object' && message.message) { + message = (message.moduleName ? message.moduleName + '\n' : '') + (message.file ? message.file + '\n' : '') + message.message; + } + + var lines = message.split('\n'); // Strip Webpack-added headers off errors/warnings + // https://github.com/webpack/webpack/blob/master/lib/ModuleError.js + + lines = lines.filter(function (line) { + return !/Module [A-z ]+\(from/.test(line); + }); // Transform parsing error into syntax error + // TODO: move this to our ESLint formatter? + + lines = lines.map(function (line) { + var parsingError = /Line (\d+):(?:(\d+):)?\s*Parsing error: (.+)$/.exec(line); + + if (!parsingError) { + return line; + } + + var _parsingError = _slicedToArray(parsingError, 4), + errorLine = _parsingError[1], + errorColumn = _parsingError[2], + errorMessage = _parsingError[3]; + + return "".concat(friendlySyntaxErrorLabel, " ").concat(errorMessage, " (").concat(errorLine, ":").concat(errorColumn, ")"); + }); + message = lines.join('\n'); // Smoosh syntax errors (commonly found in CSS) + + message = message.replace(/SyntaxError\s+\((\d+):(\d+)\)\s*(.+?)\n/g, "".concat(friendlySyntaxErrorLabel, " $3 ($1:$2)\n")); // Clean up export errors + + message = message.replace(/^.*export '(.+?)' was not found in '(.+?)'.*$/gm, "Attempted import error: '$1' is not exported from '$2'."); + message = message.replace(/^.*export 'default' \(imported as '(.+?)'\) was not found in '(.+?)'.*$/gm, "Attempted import error: '$2' does not contain a default export (imported as '$1')."); + message = message.replace(/^.*export '(.+?)' \(imported as '(.+?)'\) was not found in '(.+?)'.*$/gm, "Attempted import error: '$1' is not exported from '$3' (imported as '$2')."); + lines = message.split('\n'); // Remove leading newline + + if (lines.length > 2 && lines[1].trim() === '') { + lines.splice(1, 1); + } // Clean up file name + + + lines[0] = lines[0].replace(/^(.*) \d+:\d+-\d+$/, '$1'); // Cleans up verbose "module not found" messages for files and packages. + + if (lines[1] && lines[1].indexOf('Module not found: ') === 0) { + lines = [lines[0], lines[1].replace('Error: ', '').replace('Module not found: Cannot find file:', 'Cannot find file:')].concat(_toConsumableArray(lines.slice(2).filter(function (line) { + return line.indexOf(' @ ') !== 0; + }))); + } // Add helpful message for users trying to use Sass for the first time + + + if (lines[1] && lines[1].match(/Cannot find module.+node-sass/)) { + // ./file.module.scss (<<loader info>>) => ./file.module.scss + lines[0] = lines[0].replace(/(.+) \(.+?(?=\?\?).+?\)/, '$1'); + lines[1] = "To use Next.js' built-in Sass support, you first need to install `sass`.\n"; + lines[1] += 'Run `npm i sass` or `yarn add sass` inside your workspace.\n'; + lines[1] += '\nLearn more: https://nextjs.org/docs/messages/install-sass'; + } + + message = lines.join('\n'); // Internal stacks are generally useless so we strip them... with the + // exception of stacks containing `webpack:` because they're normally + // from user code generated by Webpack. For more information see + // https://github.com/facebook/create-react-app/pull/1050 + + message = message.replace(/^\s*at\s((?!webpack:).)*:\d+:\d+[\s)]*(\n|$)/gm, ''); // at ... ...:x:y + + message = message.replace(/^\s*at\s<anonymous>(\n|$)/gm, ''); // at <anonymous> + + lines = message.split('\n'); // Remove duplicated newlines + + lines = lines.filter(function (line, index, arr) { + return index === 0 || line.trim() !== '' || line.trim() !== arr[index - 1].trim(); + }); // Reassemble the message + + message = lines.join('\n'); + return message.trim(); +} + +function formatWebpackMessages(json) { + var formattedErrors = json.errors.map(function (message) { + return formatMessage(message, true); + }); + var formattedWarnings = json.warnings.map(function (message) { + return formatMessage(message, false); + }); + var result = { + errors: formattedErrors, + warnings: formattedWarnings + }; + + if (result.errors.some(isLikelyASyntaxError)) { + // If there are any syntax errors, show just them. + result.errors = result.errors.filter(isLikelyASyntaxError); + } + + return result; +} + +module.exports = formatWebpackMessages; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/error-overlay/hot-dev-client.js": +/*!***************************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/error-overlay/hot-dev-client.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +exports.__esModule = true; +exports["default"] = connect; + +var DevOverlay = _interopRequireWildcard(__webpack_require__(/*! @next/react-dev-overlay/lib/client */ "./node_modules/@next/react-dev-overlay/lib/client.js")); + +var _stripAnsi = _interopRequireDefault(__webpack_require__(/*! next/dist/compiled/strip-ansi */ "./node_modules/next/dist/compiled/strip-ansi/index.js")); + +var _eventsource = __webpack_require__(/*! ./eventsource */ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js"); + +var _formatWebpackMessages = _interopRequireDefault(__webpack_require__(/*! ./format-webpack-messages */ "./node_modules/next/dist/client/dev/error-overlay/format-webpack-messages.js")); +/** +* MIT License +* +* Copyright (c) 2013-present, Facebook, Inc. +* +* 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. +*/ +// This file is a modified version of the Create React App HMR dev client that +// can be found here: +// https://github.com/facebook/create-react-app/blob/v3.4.1/packages/react-dev-utils/webpackHotDevClient.js +// This alternative WebpackDevServer combines the functionality of: +// https://github.com/webpack/webpack-dev-server/blob/webpack-1/client/index.js +// https://github.com/webpack/webpack/blob/webpack-1/hot/dev-server.js +// It only supports their simplest configuration (hot updates on same server). +// It makes some opinionated choices on top, like adding a syntax error overlay +// that looks similar to our console output. The error overlay is inspired by: +// https://github.com/glenjamin/webpack-hot-middleware + + +var hadRuntimeError = false; +var customHmrEventHandler; + +function connect(options) { + DevOverlay.register(); + (0, _eventsource.getEventSourceWrapper)(options).addMessageListener(function (event) { + // This is the heartbeat event + if (event.data === "\uD83D\uDC93") { + return; + } + + try { + processMessage(event); + } catch (ex) { + console.warn('Invalid HMR message: ' + event.data + '\n' + ex); + } + }); + return { + subscribeToHmrEvent: function subscribeToHmrEvent(handler) { + customHmrEventHandler = handler; + }, + onUnrecoverableError: function onUnrecoverableError() { + hadRuntimeError = true; + } + }; +} // Remember some state related to hot module replacement. + + +var isFirstCompilation = true; +var mostRecentCompilationHash = null; +var hasCompileErrors = false; + +function clearOutdatedErrors() { + // Clean up outdated compile errors, if any. + if (typeof console !== 'undefined' && typeof console.clear === 'function') { + if (hasCompileErrors) { + console.clear(); + } + } +} // Successful compilation. + + +function handleSuccess() { + clearOutdatedErrors(); + var isHotUpdate = !isFirstCompilation; + isFirstCompilation = false; + hasCompileErrors = false; // Attempt to apply hot updates or reload. + + if (isHotUpdate) { + tryApplyUpdates(function onSuccessfulHotUpdate(hasUpdates) { + // Only dismiss it when we're sure it's a hot update. + // Otherwise it would flicker right before the reload. + onFastRefresh(hasUpdates); + }); + } +} // Compilation with warnings (e.g. ESLint). + + +function handleWarnings(warnings) { + clearOutdatedErrors(); + var isHotUpdate = !isFirstCompilation; + isFirstCompilation = false; + hasCompileErrors = false; + + function printWarnings() { + // Print warnings to the console. + var formatted = (0, _formatWebpackMessages["default"])({ + warnings: warnings, + errors: [] + }); + + if (typeof console !== 'undefined' && typeof console.warn === 'function') { + for (var i = 0; i < formatted.warnings.length; i++) { + if (i === 5) { + console.warn('There were more warnings in other files.\n' + 'You can find a complete log in the terminal.'); + break; + } + + console.warn((0, _stripAnsi["default"])(formatted.warnings[i])); + } + } + } + + printWarnings(); // Attempt to apply hot updates or reload. + + if (isHotUpdate) { + tryApplyUpdates(function onSuccessfulHotUpdate(hasUpdates) { + // Only dismiss it when we're sure it's a hot update. + // Otherwise it would flicker right before the reload. + onFastRefresh(hasUpdates); + }); + } +} // Compilation with errors (e.g. syntax error or missing modules). + + +function handleErrors(errors) { + clearOutdatedErrors(); + isFirstCompilation = false; + hasCompileErrors = true; // "Massage" webpack messages. + + var formatted = (0, _formatWebpackMessages["default"])({ + errors: errors, + warnings: [] + }); // Only show the first error. + + DevOverlay.onBuildError(formatted.errors[0]); // Also log them to the console. + + if (typeof console !== 'undefined' && typeof console.error === 'function') { + for (var i = 0; i < formatted.errors.length; i++) { + console.error((0, _stripAnsi["default"])(formatted.errors[i])); + } + } // Do not attempt to reload now. + // We will reload on next success instead. + + + if (undefined) { + if (self.__NEXT_HMR_CB) { + self.__NEXT_HMR_CB(formatted.errors[0]); + + self.__NEXT_HMR_CB = null; + } + } +} + +function onFastRefresh(hasUpdates) { + DevOverlay.onBuildOk(); + + if (hasUpdates) { + DevOverlay.onRefresh(); + } + + console.log('[Fast Refresh] done'); +} // There is a newer version of the code available. + + +function handleAvailableHash(hash) { + // Update last known compilation hash. + mostRecentCompilationHash = hash; +} // Handle messages from the server. + + +function processMessage(e) { + var obj = JSON.parse(e.data); + + switch (obj.action) { + case 'building': + { + console.log('[Fast Refresh] rebuilding'); + break; + } + + case 'built': + case 'sync': + { + if (obj.hash) { + handleAvailableHash(obj.hash); + } + + var errors = obj.errors, + warnings = obj.warnings; + var hasErrors = Boolean(errors && errors.length); + + if (hasErrors) { + return handleErrors(errors); + } + + var hasWarnings = Boolean(warnings && warnings.length); + + if (hasWarnings) { + return handleWarnings(warnings); + } + + return handleSuccess(); + } + + default: + { + if (customHmrEventHandler) { + customHmrEventHandler(obj); + break; + } + + break; + } + } +} // Is there a newer version of this code available? + + +function isUpdateAvailable() { + /* globals __webpack_hash__ */ + // __webpack_hash__ is the hash of the current compilation. + // It's a global variable injected by Webpack. + return mostRecentCompilationHash !== __webpack_require__.h(); +} // Webpack disallows updates in other states. + + +function canApplyUpdates() { + return module.hot.status() === 'idle'; +} + +function afterApplyUpdates(fn) { + if (canApplyUpdates()) { + fn(); + } else { + var handler = function handler(status) { + if (status === 'idle') { + module.hot.removeStatusHandler(handler); + fn(); + } + }; + + module.hot.addStatusHandler(handler); + } +} // Attempt to update code on the fly, fall back to a hard reload. + + +function tryApplyUpdates(onHotUpdateSuccess) { + if (false) {} + + if (!isUpdateAvailable() || !canApplyUpdates()) { + return; + } + + function handleApplyUpdates(err, updatedModules) { + if (err || hadRuntimeError || !updatedModules) { + if (err) { + console.warn('[Fast Refresh] performing full reload\n\n' + "Fast Refresh will perform a full reload when you edit a file that's imported by modules outside of the React rendering tree.\n" + 'You might have a file which exports a React component but also exports a value that is imported by a non-React component file.\n' + 'Consider migrating the non-React component export to a separate file and importing it into both files.\n\n' + 'It is also possible the parent component of the component you edited is a class component, which disables Fast Refresh.\n' + 'Fast Refresh requires at least one parent function component in your React tree.'); + } else if (hadRuntimeError) { + console.warn('[Fast Refresh] performing full reload because your application had an unrecoverable error'); + } + + window.location.reload(); + return; + } + + var hasUpdates = Boolean(updatedModules.length); + + if (typeof onHotUpdateSuccess === 'function') { + // Maybe we want to do something. + onHotUpdateSuccess(hasUpdates); + } + + if (isUpdateAvailable()) { + // While we were updating, there was a new update! Do it again. + tryApplyUpdates(hasUpdates ? undefined : onHotUpdateSuccess); + } else { + if (undefined) { + afterApplyUpdates(function () { + if (self.__NEXT_HMR_CB) { + self.__NEXT_HMR_CB(); + + self.__NEXT_HMR_CB = null; + } + }); + } + } + } // https://webpack.js.org/api/hot-module-replacement/#check + + + module.hot.check( + /* autoApply */ + true).then(function (updatedModules) { + handleApplyUpdates(null, updatedModules); + }, function (err) { + handleApplyUpdates(err, null); + }); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/event-source-polyfill.js": +/*!********************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/event-source-polyfill.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = void 0; +/* eslint-disable */ +// Improved version of https://github.com/Yaffle/EventSource/ +// Available under MIT License (MIT) +// Only tries to support IE11 and nothing below + +var document = window.document; +var Response = window.Response; +var TextDecoder = window.TextDecoder; +var TextEncoder = window.TextEncoder; +var AbortController = window.AbortController; + +if (AbortController == undefined) { + AbortController = function AbortController() { + this.signal = null; + + this.abort = function () {}; + }; +} + +function TextDecoderPolyfill() { + this.bitsNeeded = 0; + this.codePoint = 0; +} + +_c = TextDecoderPolyfill; + +TextDecoderPolyfill.prototype.decode = function (octets) { + function valid(codePoint, shift, octetsCount) { + if (octetsCount === 1) { + return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07ff; + } + + if (octetsCount === 2) { + return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xd7ff || codePoint >= 0xe000 >> shift && codePoint << shift <= 0xffff; + } + + if (octetsCount === 3) { + return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10ffff; + } + + throw new Error(); + } + + function octetsCount(bitsNeeded, codePoint) { + if (bitsNeeded === 6 * 1) { + return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1; + } + + if (bitsNeeded === 6 * 2) { + return codePoint > 15 ? 3 : 2; + } + + if (bitsNeeded === 6 * 3) { + return 3; + } + + throw new Error(); + } + + var REPLACER = 0xfffd; + var string = ''; + var bitsNeeded = this.bitsNeeded; + var codePoint = this.codePoint; + + for (var i = 0; i < octets.length; i += 1) { + var octet = octets[i]; + + if (bitsNeeded !== 0) { + if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) { + bitsNeeded = 0; + codePoint = REPLACER; + string += String.fromCharCode(codePoint); + } + } + + if (bitsNeeded === 0) { + if (octet >= 0 && octet <= 127) { + bitsNeeded = 0; + codePoint = octet; + } else if (octet >= 192 && octet <= 223) { + bitsNeeded = 6 * 1; + codePoint = octet & 31; + } else if (octet >= 224 && octet <= 239) { + bitsNeeded = 6 * 2; + codePoint = octet & 15; + } else if (octet >= 240 && octet <= 247) { + bitsNeeded = 6 * 3; + codePoint = octet & 7; + } else { + bitsNeeded = 0; + codePoint = REPLACER; + } + + if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) { + bitsNeeded = 0; + codePoint = REPLACER; + } + } else { + bitsNeeded -= 6; + codePoint = codePoint << 6 | octet & 63; + } + + if (bitsNeeded === 0) { + if (codePoint <= 0xffff) { + string += String.fromCharCode(codePoint); + } else { + string += String.fromCharCode(0xd800 + (codePoint - 0xffff - 1 >> 10)); + string += String.fromCharCode(0xdc00 + (codePoint - 0xffff - 1 & 0x3ff)); + } + } + } + + this.bitsNeeded = bitsNeeded; + this.codePoint = codePoint; + return string; +}; // Firefox < 38 throws an error with stream option + + +var supportsStreamOption = function supportsStreamOption() { + try { + return new TextDecoder().decode(new TextEncoder().encode('test'), { + stream: true + }) === 'test'; + } catch (error) { + console.log(error); + } + + return false; +}; // IE, Edge + + +if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) { + TextDecoder = TextDecoderPolyfill; +} + +var k = function k() {}; + +function XHRWrapper(xhr) { + this.withCredentials = false; + this.responseType = ''; + this.readyState = 0; + this.status = 0; + this.statusText = ''; + this.responseText = ''; + this.onprogress = k; + this.onreadystatechange = k; + this._contentType = ''; + this._xhr = xhr; + this._sendTimeout = 0; + this._abort = k; +} + +_c2 = XHRWrapper; + +XHRWrapper.prototype.open = function (method, url) { + this._abort(true); + + var that = this; + var xhr = this._xhr; + var state = 1; + var timeout = 0; + + this._abort = function (silent) { + if (that._sendTimeout !== 0) { + clearTimeout(that._sendTimeout); + that._sendTimeout = 0; + } + + if (state === 1 || state === 2 || state === 3) { + state = 4; + xhr.onload = k; + xhr.onerror = k; + xhr.onabort = k; + xhr.onprogress = k; + xhr.onreadystatechange = k; // IE 8 - 9: XDomainRequest#abort() does not fire any event + // Opera < 10: XMLHttpRequest#abort() does not fire any event + + xhr.abort(); + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + if (!silent) { + that.readyState = 4; + that.onreadystatechange(); + } + } + + state = 0; + }; + + var onStart = function onStart() { + if (state === 1) { + // state = 2; + var status = 0; + var statusText = ''; + var contentType = undefined; + + if (!('contentType' in xhr)) { + try { + status = xhr.status; + statusText = xhr.statusText; + contentType = xhr.getResponseHeader('Content-Type'); + } catch (error) { + // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3 + // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2 + // https://bugs.webkit.org/show_bug.cgi?id=29121 + status = 0; + statusText = ''; + contentType = undefined; // Firefox < 14, Chrome ?, Safari ? + // https://bugs.webkit.org/show_bug.cgi?id=29658 + // https://bugs.webkit.org/show_bug.cgi?id=77854 + } + } else { + status = 200; + statusText = 'OK'; + contentType = xhr.contentType; + } + + if (status !== 0) { + state = 2; + that.readyState = 2; + that.status = status; + that.statusText = statusText; + that._contentType = contentType; + that.onreadystatechange(); + } + } + }; + + var onProgress = function onProgress() { + onStart(); + + if (state === 2 || state === 3) { + state = 3; + var responseText = ''; + + try { + responseText = xhr.responseText; + } catch (error) {// IE 8 - 9 with XMLHttpRequest + } + + that.readyState = 3; + that.responseText = responseText; + that.onprogress(); + } + }; + + var onFinish = function onFinish() { + // Firefox 52 fires "readystatechange" (xhr.readyState === 4) without final "readystatechange" (xhr.readyState === 3) + // IE 8 fires "onload" without "onprogress" + onProgress(); + + if (state === 1 || state === 2 || state === 3) { + state = 4; + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + that.readyState = 4; + that.onreadystatechange(); + } + }; + + var onReadyStateChange = function onReadyStateChange() { + if (xhr != undefined) { + // Opera 12 + if (xhr.readyState === 4) { + onFinish(); + } else if (xhr.readyState === 3) { + onProgress(); + } else if (xhr.readyState === 2) { + onStart(); + } + } + }; + + var onTimeout = function onTimeout() { + timeout = setTimeout(function () { + onTimeout(); + }, 500); + + if (xhr.readyState === 3) { + onProgress(); + } + }; // XDomainRequest#abort removes onprogress, onerror, onload + + + xhr.onload = onFinish; + xhr.onerror = onFinish; // improper fix to match Firefox behavior, but it is better than just ignore abort + // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596 + // https://bugzilla.mozilla.org/show_bug.cgi?id=880200 + // https://code.google.com/p/chromium/issues/detail?id=153570 + // IE 8 fires "onload" without "onprogress + + xhr.onabort = onFinish; // https://bugzilla.mozilla.org/show_bug.cgi?id=736723 + + if (!('sendAsBinary' in XMLHttpRequest.prototype) && !('mozAnon' in XMLHttpRequest.prototype)) { + xhr.onprogress = onProgress; + } // IE 8 - 9 (XMLHTTPRequest) + // Opera < 12 + // Firefox < 3.5 + // Firefox 3.5 - 3.6 - ? < 9.0 + // onprogress is not fired sometimes or delayed + // see also #64 + + + xhr.onreadystatechange = onReadyStateChange; + + if ('contentType' in xhr) { + url += (url.indexOf('?') === -1 ? '?' : '&') + 'padding=true'; + } + + xhr.open(method, url, true); + + if ('readyState' in xhr) { + // workaround for Opera 12 issue with "progress" events + // #91 + timeout = setTimeout(function () { + onTimeout(); + }, 0); + } +}; + +XHRWrapper.prototype.abort = function () { + this._abort(false); +}; + +XHRWrapper.prototype.getResponseHeader = function (name) { + return this._contentType; +}; + +XHRWrapper.prototype.setRequestHeader = function (name, value) { + var xhr = this._xhr; + + if ('setRequestHeader' in xhr) { + xhr.setRequestHeader(name, value); + } +}; + +XHRWrapper.prototype.getAllResponseHeaders = function () { + return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() : ''; +}; + +XHRWrapper.prototype.send = function () { + // loading indicator in Safari < ? (6), Chrome < 14, Firefox + if (!('ontimeout' in XMLHttpRequest.prototype) && document != undefined && document.readyState != undefined && document.readyState !== 'complete') { + var that = this; + that._sendTimeout = setTimeout(function () { + that._sendTimeout = 0; + that.send(); + }, 4); + return; + } + + var xhr = this._xhr; // withCredentials should be set after "open" for Safari and Chrome (< 19 ?) + + xhr.withCredentials = this.withCredentials; + xhr.responseType = this.responseType; + + try { + // xhr.send(); throws "Not enough arguments" in Firefox 3.0 + xhr.send(undefined); + } catch (error1) { + // Safari 5.1.7, Opera 12 + throw error1; + } +}; + +function toLowerCase(name) { + return name.replace(/[A-Z]/g, function (c) { + return String.fromCharCode(c.charCodeAt(0) + 0x20); + }); +} + +function HeadersPolyfill(all) { + // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example + var map = Object.create(null); + var array = all.split('\r\n'); + + for (var i = 0; i < array.length; i += 1) { + var line = array[i]; + var parts = line.split(': '); + var name = parts.shift(); + var value = parts.join(': '); + map[toLowerCase(name)] = value; + } + + this._map = map; +} + +_c3 = HeadersPolyfill; + +HeadersPolyfill.prototype.get = function (name) { + return this._map[toLowerCase(name)]; +}; + +function XHRTransport() {} + +_c4 = XHRTransport; + +XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) { + xhr.open('GET', url); + var offset = 0; + + xhr.onprogress = function () { + var responseText = xhr.responseText; + var chunk = responseText.slice(offset); + offset += chunk.length; + onProgressCallback(chunk); + }; + + xhr.onreadystatechange = function () { + if (xhr.readyState === 2) { + var status = xhr.status; + var statusText = xhr.statusText; + var contentType = xhr.getResponseHeader('Content-Type'); + var headers = xhr.getAllResponseHeaders(); + onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers), function () { + xhr.abort(); + }); + } else if (xhr.readyState === 4) { + onFinishCallback(); + } + }; + + xhr.withCredentials = withCredentials; + xhr.responseType = 'text'; + + for (var name in headers) { + if (Object.prototype.hasOwnProperty.call(headers, name)) { + xhr.setRequestHeader(name, headers[name]); + } + } + + xhr.send(); +}; + +function HeadersWrapper(headers) { + this._headers = headers; +} + +_c5 = HeadersWrapper; + +HeadersWrapper.prototype.get = function (name) { + return this._headers.get(name); +}; + +function FetchTransport() {} + +_c6 = FetchTransport; + +FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) { + var controller = new AbortController(); + var signal = controller.signal; // see #120 + + var textDecoder = new TextDecoder(); + fetch(url, { + headers: headers, + credentials: withCredentials ? 'include' : 'same-origin', + signal: signal, + cache: 'no-store' + }).then(function (response) { + var reader = response.body.getReader(); + onStartCallback(response.status, response.statusText, response.headers.get('Content-Type'), new HeadersWrapper(response.headers), function () { + controller.abort(); + reader.cancel(); + }); + return new Promise(function (resolve, reject) { + var readNextChunk = function readNextChunk() { + reader.read().then(function (result) { + if (result.done) { + // Note: bytes in textDecoder are ignored + resolve(undefined); + } else { + var chunk = textDecoder.decode(result.value, { + stream: true + }); + onProgressCallback(chunk); + readNextChunk(); + } + })['catch'](function (error) { + reject(error); + }); + }; + + readNextChunk(); + }); + }).then(function (result) { + onFinishCallback(); + return result; + }, function (error) { + onFinishCallback(); + return Promise.reject(error); + }); +}; + +function EventTarget() { + this._listeners = Object.create(null); +} + +_c7 = EventTarget; + +function throwError(e) { + setTimeout(function () { + throw e; + }, 0); +} + +EventTarget.prototype.dispatchEvent = function (event) { + event.target = this; + var typeListeners = this._listeners[event.type]; + + if (typeListeners != undefined) { + var length = typeListeners.length; + + for (var i = 0; i < length; i += 1) { + var listener = typeListeners[i]; + + try { + if (typeof listener.handleEvent === 'function') { + listener.handleEvent(event); + } else { + listener.call(this, event); + } + } catch (e) { + throwError(e); + } + } + } +}; + +EventTarget.prototype.addEventListener = function (type, listener) { + type = String(type); + var listeners = this._listeners; + var typeListeners = listeners[type]; + + if (typeListeners == undefined) { + typeListeners = []; + listeners[type] = typeListeners; + } + + var found = false; + + for (var i = 0; i < typeListeners.length; i += 1) { + if (typeListeners[i] === listener) { + found = true; + } + } + + if (!found) { + typeListeners.push(listener); + } +}; + +EventTarget.prototype.removeEventListener = function (type, listener) { + type = String(type); + var listeners = this._listeners; + var typeListeners = listeners[type]; + + if (typeListeners != undefined) { + var filtered = []; + + for (var i = 0; i < typeListeners.length; i += 1) { + if (typeListeners[i] !== listener) { + filtered.push(typeListeners[i]); + } + } + + if (filtered.length === 0) { + delete listeners[type]; + } else { + listeners[type] = filtered; + } + } +}; + +function Event(type) { + this.type = type; + this.target = undefined; +} + +_c8 = Event; + +function MessageEvent(type, options) { + Event.call(this, type); + this.data = options.data; + this.lastEventId = options.lastEventId; +} + +_c9 = MessageEvent; +MessageEvent.prototype = Object.create(Event.prototype); + +function ConnectionEvent(type, options) { + Event.call(this, type); + this.status = options.status; + this.statusText = options.statusText; + this.headers = options.headers; +} + +_c10 = ConnectionEvent; +ConnectionEvent.prototype = Object.create(Event.prototype); +var WAITING = -1; +var CONNECTING = 0; +var OPEN = 1; +var CLOSED = 2; +var AFTER_CR = -1; +var FIELD_START = 0; +var FIELD = 1; +var VALUE_START = 2; +var VALUE = 3; +var contentTypeRegExp = /^text\/event\-stream;?(\s*charset\=utf\-8)?$/i; +var MINIMUM_DURATION = 1000; +var MAXIMUM_DURATION = 18000000; + +var parseDuration = function parseDuration(value, def) { + var n = parseInt(value, 10); + + if (n !== n) { + n = def; + } + + return clampDuration(n); +}; + +var clampDuration = function clampDuration(n) { + return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION); +}; + +var fire = function fire(that, f, event) { + try { + if (typeof f === 'function') { + f.call(that, event); + } + } catch (e) { + throwError(e); + } +}; + +function EventSourcePolyfill(url, options) { + EventTarget.call(this); + this.onopen = undefined; + this.onmessage = undefined; + this.onerror = undefined; + this.url = undefined; + this.readyState = undefined; + this.withCredentials = undefined; + this._close = undefined; + start(this, url, options); +} + +_c11 = EventSourcePolyfill; +var isFetchSupported = fetch != undefined && Response != undefined && 'body' in Response.prototype; + +function start(es, url, options) { + url = String(url); + var withCredentials = options != undefined && Boolean(options.withCredentials); + var initialRetry = clampDuration(1000); + var heartbeatTimeout = options != undefined && options.heartbeatTimeout != undefined ? parseDuration(options.heartbeatTimeout, 45000) : clampDuration(45000); + var lastEventId = ''; + var retry = initialRetry; + var wasActivity = false; + var headers = options != undefined && options.headers != undefined ? JSON.parse(JSON.stringify(options.headers)) : undefined; + var CurrentTransport = options != undefined && options.Transport != undefined ? options.Transport : XMLHttpRequest; + var xhr = isFetchSupported && !(options != undefined && options.Transport != undefined) ? undefined : new XHRWrapper(new CurrentTransport()); + var transport = xhr == undefined ? new FetchTransport() : new XHRTransport(); + var cancelFunction = undefined; + var timeout = 0; + var currentState = WAITING; + var dataBuffer = ''; + var lastEventIdBuffer = ''; + var eventTypeBuffer = ''; + var textBuffer = ''; + var state = FIELD_START; + var fieldStart = 0; + var valueStart = 0; + + var onStart = function onStart(status, statusText, contentType, headers, cancel) { + if (currentState === CONNECTING) { + cancelFunction = cancel; + + if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) { + currentState = OPEN; + wasActivity = true; + retry = initialRetry; + es.readyState = OPEN; + var event = new ConnectionEvent('open', { + status: status, + statusText: statusText, + headers: headers + }); + es.dispatchEvent(event); + fire(es, es.onopen, event); + } else { + var message = ''; + + if (status !== 200) { + if (statusText) { + statusText = statusText.replace(/\s+/g, ' '); + } + + message = "EventSource's response has a status " + status + ' ' + statusText + ' that is not 200. Aborting the connection.'; + } else { + message = "EventSource's response has a Content-Type specifying an unsupported type: " + (contentType == undefined ? '-' : contentType.replace(/\s+/g, ' ')) + '. Aborting the connection.'; + } + + throwError(new Error(message)); + close(); + var event = new ConnectionEvent('error', { + status: status, + statusText: statusText, + headers: headers + }); + es.dispatchEvent(event); + fire(es, es.onerror, event); + } + } + }; + + var onProgress = function onProgress(textChunk) { + if (currentState === OPEN) { + var n = -1; + + for (var i = 0; i < textChunk.length; i += 1) { + var c = textChunk.charCodeAt(i); + + if (c === '\n'.charCodeAt(0) || c === '\r'.charCodeAt(0)) { + n = i; + } + } + + var chunk = (n !== -1 ? textBuffer : '') + textChunk.slice(0, n + 1); + textBuffer = (n === -1 ? textBuffer : '') + textChunk.slice(n + 1); + + if (chunk !== '') { + wasActivity = true; + } + + for (var position = 0; position < chunk.length; position += 1) { + var c = chunk.charCodeAt(position); + + if (state === AFTER_CR && c === '\n'.charCodeAt(0)) { + state = FIELD_START; + } else { + if (state === AFTER_CR) { + state = FIELD_START; + } + + if (c === '\r'.charCodeAt(0) || c === '\n'.charCodeAt(0)) { + if (state !== FIELD_START) { + if (state === FIELD) { + valueStart = position + 1; + } + + var field = chunk.slice(fieldStart, valueStart - 1); + var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === ' '.charCodeAt(0) ? 1 : 0), position); + + if (field === 'data') { + dataBuffer += '\n'; + dataBuffer += value; + } else if (field === 'id') { + lastEventIdBuffer = value; + } else if (field === 'event') { + eventTypeBuffer = value; + } else if (field === 'retry') { + initialRetry = parseDuration(value, initialRetry); + retry = initialRetry; + } else if (field === 'heartbeatTimeout') { + heartbeatTimeout = parseDuration(value, heartbeatTimeout); + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = setTimeout(function () { + onTimeout(); + }, heartbeatTimeout); + } + } + } + + if (state === FIELD_START) { + if (dataBuffer !== '') { + lastEventId = lastEventIdBuffer; + + if (eventTypeBuffer === '') { + eventTypeBuffer = 'message'; + } + + var event = new MessageEvent(eventTypeBuffer, { + data: dataBuffer.slice(1), + lastEventId: lastEventIdBuffer + }); + es.dispatchEvent(event); + + if (eventTypeBuffer === 'message') { + fire(es, es.onmessage, event); + } + + if (currentState === CLOSED) { + return; + } + } + + dataBuffer = ''; + eventTypeBuffer = ''; + } + + state = c === '\r'.charCodeAt(0) ? AFTER_CR : FIELD_START; + } else { + if (state === FIELD_START) { + fieldStart = position; + state = FIELD; + } + + if (state === FIELD) { + if (c === ':'.charCodeAt(0)) { + valueStart = position + 1; + state = VALUE_START; + } + } else if (state === VALUE_START) { + state = VALUE; + } + } + } + } + } + }; + + var onFinish = function onFinish() { + if (currentState === OPEN || currentState === CONNECTING) { + currentState = WAITING; + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + timeout = setTimeout(function () { + onTimeout(); + }, retry); + retry = clampDuration(Math.min(initialRetry * 16, retry * 2)); + es.readyState = CONNECTING; + var event = new Event('error'); + es.dispatchEvent(event); + fire(es, es.onerror, event); + } + }; + + var close = function close() { + currentState = CLOSED; + + if (cancelFunction != undefined) { + cancelFunction(); + cancelFunction = undefined; + } + + if (timeout !== 0) { + clearTimeout(timeout); + timeout = 0; + } + + es.readyState = CLOSED; + }; + + var onTimeout = function onTimeout() { + timeout = 0; + + if (currentState !== WAITING) { + if (!wasActivity && cancelFunction != undefined) { + throwError(new Error('No activity within ' + heartbeatTimeout + ' milliseconds. Reconnecting.')); + cancelFunction(); + cancelFunction = undefined; + } else { + wasActivity = false; + timeout = setTimeout(function () { + onTimeout(); + }, heartbeatTimeout); + } + + return; + } + + wasActivity = false; + timeout = setTimeout(function () { + onTimeout(); + }, heartbeatTimeout); + currentState = CONNECTING; + dataBuffer = ''; + eventTypeBuffer = ''; + lastEventIdBuffer = lastEventId; + textBuffer = ''; + fieldStart = 0; + valueStart = 0; + state = FIELD_START; // https://bugzilla.mozilla.org/show_bug.cgi?id=428916 + // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers. + + var requestURL = url; + + if (url.slice(0, 5) !== 'data:' && url.slice(0, 5) !== 'blob:') { + if (lastEventId !== '') { + requestURL += (url.indexOf('?') === -1 ? '?' : '&') + 'lastEventId=' + encodeURIComponent(lastEventId); + } + } + + var requestHeaders = {}; + requestHeaders['Accept'] = 'text/event-stream'; + + if (headers != undefined) { + for (var name in headers) { + if (Object.prototype.hasOwnProperty.call(headers, name)) { + requestHeaders[name] = headers[name]; + } + } + } + + try { + transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders); + } catch (error) { + close(); + throw error; + } + }; + + es.url = url; + es.readyState = CONNECTING; + es.withCredentials = withCredentials; + es._close = close; + onTimeout(); +} + +EventSourcePolyfill.prototype = Object.create(EventTarget.prototype); +EventSourcePolyfill.prototype.CONNECTING = CONNECTING; +EventSourcePolyfill.prototype.OPEN = OPEN; +EventSourcePolyfill.prototype.CLOSED = CLOSED; + +EventSourcePolyfill.prototype.close = function () { + this._close(); +}; + +EventSourcePolyfill.CONNECTING = CONNECTING; +EventSourcePolyfill.OPEN = OPEN; +EventSourcePolyfill.CLOSED = CLOSED; +EventSourcePolyfill.prototype.withCredentials = undefined; +var _default = EventSourcePolyfill; +exports["default"] = _default; + +var _c, _c2, _c3, _c4, _c5, _c6, _c7, _c8, _c9, _c10, _c11; + +$RefreshReg$(_c, "TextDecoderPolyfill"); +$RefreshReg$(_c2, "XHRWrapper"); +$RefreshReg$(_c3, "HeadersPolyfill"); +$RefreshReg$(_c4, "XHRTransport"); +$RefreshReg$(_c5, "HeadersWrapper"); +$RefreshReg$(_c6, "FetchTransport"); +$RefreshReg$(_c7, "EventTarget"); +$RefreshReg$(_c8, "Event"); +$RefreshReg$(_c9, "MessageEvent"); +$RefreshReg$(_c10, "ConnectionEvent"); +$RefreshReg$(_c11, "EventSourcePolyfill"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/fouc.js": +/*!***************************************************!*\ + !*** ./node_modules/next/dist/client/dev/fouc.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.displayContent = displayContent; // This function is used to remove Next.js' no-FOUC styles workaround for using +// `style-loader` in development. It must be called before hydration, or else +// rendering won't have the correct computed values in effects. + +function displayContent(callback) { + ; + (window.requestAnimationFrame || setTimeout)(function () { + for (var x = document.querySelectorAll('[data-next-hide-fouc]'), i = x.length; i--;) { + x[i].parentNode.removeChild(x[i]); + } + + if (callback) { + callback(); + } + }); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/on-demand-entries-client.js": +/*!***********************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/on-demand-entries-client.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports["default"] = void 0; + +var _router = _interopRequireDefault(__webpack_require__(/*! next/router */ "./node_modules/next/router.js")); + +var _onDemandEntriesUtils = __webpack_require__(/*! ./on-demand-entries-utils */ "./node_modules/next/dist/client/dev/on-demand-entries-utils.js"); + +var _default = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(_ref) { + var assetPrefix; + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + assetPrefix = _ref.assetPrefix; + + _router["default"].ready(function () { + _router["default"].events.on('routeChangeComplete', _onDemandEntriesUtils.setupPing.bind(void 0, assetPrefix, function () { + return _router["default"].pathname; + })); + }); + + (0, _onDemandEntriesUtils.setupPing)(assetPrefix, function () { + return _router["default"].pathname; + }, _onDemandEntriesUtils.currentPage); // prevent HMR connection from being closed when running tests + + if (!undefined) { + document.addEventListener('visibilitychange', function (_event) { + var state = document.visibilityState; + + if (state === 'visible') { + (0, _onDemandEntriesUtils.setupPing)(assetPrefix, function () { + return _router["default"].pathname; + }, true); + } else { + (0, _onDemandEntriesUtils.closePing)(); + } + }); + window.addEventListener('beforeunload', function () { + (0, _onDemandEntriesUtils.closePing)(); + }); + } + + case 4: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function _default(_x) { + return _ref2.apply(this, arguments); + }; +}(); + +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/on-demand-entries-utils.js": +/*!**********************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/on-demand-entries-utils.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.closePing = closePing; +exports.setupPing = setupPing; +exports.currentPage = void 0; + +var _eventsource = __webpack_require__(/*! ./error-overlay/eventsource */ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js"); +/* global location */ + + +var evtSource; +var currentPage; +exports.currentPage = currentPage; + +function closePing() { + if (evtSource) evtSource.close(); + evtSource = null; +} + +function setupPing(assetPrefix, pathnameFn, retry) { + var pathname = pathnameFn(); // Make sure to only create new EventSource request if page has changed + + if (pathname === currentPage && !retry) return; + exports.currentPage = currentPage = pathname; // close current EventSource connection + + closePing(); + var url = "".concat(assetPrefix, "/_next/webpack-hmr?page=").concat(currentPage); + evtSource = (0, _eventsource.getEventSourceWrapper)({ + path: url, + timeout: 5000, + ondemand: 1 + }); + evtSource.addMessageListener(function (event) { + if (event.data.indexOf('{') === -1) return; + + try { + var payload = JSON.parse(event.data); + + if (payload.invalid) { + // Payload can be invalid even if the page does not exist. + // So, we need to make sure it exists before reloading. + fetch(location.href, { + credentials: 'same-origin' + }).then(function (pageRes) { + if (pageRes.status === 200) { + location.reload(); + } + }); + } + } catch (err) { + console.error('on-demand-entries failed to parse response', err); + } + }); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/dev/webpack-hot-middleware-client.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/client/dev/webpack-hot-middleware-client.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports["default"] = void 0; + +var _hotDevClient = _interopRequireDefault(__webpack_require__(/*! ./error-overlay/hot-dev-client */ "./node_modules/next/dist/client/dev/error-overlay/hot-dev-client.js")); + +var _default = function _default(_ref) { + var assetPrefix = _ref.assetPrefix; + var options = { + path: "".concat(assetPrefix, "/_next/webpack-hmr") + }; + var devClient = (0, _hotDevClient["default"])(options); + devClient.subscribeToHmrEvent(function (obj) { + if (obj.action === 'reloadPage') { + return window.location.reload(); + } + + if (obj.action === 'removedPage') { + var _obj$data = _slicedToArray(obj.data, 1), + page = _obj$data[0]; + + if (page === window.next.router.pathname) { + return window.location.reload(); + } + + return; + } + + if (obj.action === 'addedPage') { + var _obj$data2 = _slicedToArray(obj.data, 1), + _page = _obj$data2[0]; + + if (_page === window.next.router.pathname && typeof window.next.router.components[_page] === 'undefined') { + return window.location.reload(); + } + + return; + } + + throw new Error('Unexpected action ' + obj.action); + }); + return devClient; +}; + +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/head-manager.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/client/head-manager.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = initHeadManager; +exports.DOMAttributeNames = void 0; +var DOMAttributeNames = { + acceptCharset: 'accept-charset', + className: 'class', + htmlFor: 'for', + httpEquiv: 'http-equiv', + noModule: 'noModule' +}; +exports.DOMAttributeNames = DOMAttributeNames; + +function reactElementToDOM(_ref) { + var type = _ref.type, + props = _ref.props; + var el = document.createElement(type); + + for (var p in props) { + if (!props.hasOwnProperty(p)) continue; + if (p === 'children' || p === 'dangerouslySetInnerHTML') continue; // we don't render undefined props to the DOM + + if (props[p] === undefined) continue; + var attr = DOMAttributeNames[p] || p.toLowerCase(); + + if (type === 'script' && (attr === 'async' || attr === 'defer' || attr === 'noModule')) { + ; + el[attr] = !!props[p]; + } else { + el.setAttribute(attr, props[p]); + } + } + + var children = props.children, + dangerouslySetInnerHTML = props.dangerouslySetInnerHTML; + + if (dangerouslySetInnerHTML) { + el.innerHTML = dangerouslySetInnerHTML.__html || ''; + } else if (children) { + el.textContent = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : ''; + } + + return el; +} + +function updateElements(type, components) { + var headEl = document.getElementsByTagName('head')[0]; + var headCountEl = headEl.querySelector('meta[name=next-head-count]'); + + if (true) { + if (!headCountEl) { + console.error('Warning: next-head-count is missing. https://nextjs.org/docs/messages/next-head-count-missing'); + return; + } + } + + var headCount = Number(headCountEl.content); + var oldTags = []; + + for (var i = 0, j = headCountEl.previousElementSibling; i < headCount; i++, j = j.previousElementSibling) { + if (j.tagName.toLowerCase() === type) { + oldTags.push(j); + } + } + + var newTags = components.map(reactElementToDOM).filter(function (newTag) { + for (var k = 0, len = oldTags.length; k < len; k++) { + var oldTag = oldTags[k]; + + if (oldTag.isEqualNode(newTag)) { + oldTags.splice(k, 1); + return false; + } + } + + return true; + }); + oldTags.forEach(function (t) { + return t.parentNode.removeChild(t); + }); + newTags.forEach(function (t) { + return headEl.insertBefore(t, headCountEl); + }); + headCountEl.content = (headCount - oldTags.length + newTags.length).toString(); +} + +function initHeadManager() { + var updatePromise = null; + return { + mountedInstances: new Set(), + updateHead: function updateHead(head) { + var promise = updatePromise = Promise.resolve().then(function () { + if (promise !== updatePromise) return; + updatePromise = null; + var tags = {}; + head.forEach(function (h) { + var components = tags[h.type] || []; + components.push(h); + tags[h.type] = components; + }); + var titleComponent = tags.title ? tags.title[0] : null; + var title = ''; + + if (titleComponent) { + var children = titleComponent.props.children; + title = typeof children === 'string' ? children : Array.isArray(children) ? children.join('') : ''; + } + + if (title !== document.title) document.title = title; + ['meta', 'base', 'link', 'style', 'script'].forEach(function (type) { + updateElements(type, tags[type] || []); + }); + }); + } + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/index.js": +/*!************************************************!*\ + !*** ./node_modules/next/dist/client/index.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _inherits = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); + +var _possibleConstructorReturn = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); + +var _getPrototypeOf = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var _s = $RefreshSig$(), + _s2 = $RefreshSig$(); + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +var _interopRequireWildcard3 = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.render = render; +exports.renderError = renderError; +exports["default"] = exports.emitter = exports.router = exports.version = void 0; + +var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "./node_modules/@babel/runtime/helpers/extends.js")); + +var _interopRequireWildcard2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js")); + +__webpack_require__(/*! @next/polyfill-module */ "./node_modules/@next/polyfill-module/dist/polyfill-module.js"); + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _reactDom = _interopRequireDefault(__webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js")); + +var _headManagerContext = __webpack_require__(/*! ../next-server/lib/head-manager-context */ "./node_modules/next/dist/next-server/lib/head-manager-context.js"); + +var _mitt = _interopRequireDefault(__webpack_require__(/*! ../next-server/lib/mitt */ "./node_modules/next/dist/next-server/lib/mitt.js")); + +var _routerContext = __webpack_require__(/*! ../next-server/lib/router-context */ "./node_modules/next/dist/next-server/lib/router-context.js"); + +var _router = __webpack_require__(/*! ../next-server/lib/router/router */ "./node_modules/next/dist/next-server/lib/router/router.js"); + +var _isDynamic = __webpack_require__(/*! ../next-server/lib/router/utils/is-dynamic */ "./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js"); + +var querystring = _interopRequireWildcard3(__webpack_require__(/*! ../next-server/lib/router/utils/querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js")); + +var envConfig = _interopRequireWildcard3(__webpack_require__(/*! ../next-server/lib/runtime-config */ "./node_modules/next/dist/next-server/lib/runtime-config.js")); + +var _utils = __webpack_require__(/*! ../next-server/lib/utils */ "./node_modules/next/dist/next-server/lib/utils.js"); + +var _portal = __webpack_require__(/*! ./portal */ "./node_modules/next/dist/client/portal/index.js"); + +var _headManager = _interopRequireDefault(__webpack_require__(/*! ./head-manager */ "./node_modules/next/dist/client/head-manager.js")); + +var _pageLoader = _interopRequireDefault(__webpack_require__(/*! ./page-loader */ "./node_modules/next/dist/client/page-loader.js")); + +var _performanceRelayer = _interopRequireDefault(__webpack_require__(/*! ./performance-relayer */ "./node_modules/next/dist/client/performance-relayer.js")); + +var _routeAnnouncer = __webpack_require__(/*! ./route-announcer */ "./node_modules/next/dist/client/route-announcer.js"); + +var _router2 = __webpack_require__(/*! ./router */ "./node_modules/next/dist/client/router.js"); +/* global location */ + + +var data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent); +window.__NEXT_DATA__ = data; +var version = "10.1.3"; +exports.version = version; + +var looseToArray = function looseToArray(input) { + return [].slice.call(input); +}; + +var hydrateProps = data.props, + hydrateErr = data.err, + page = data.page, + query = data.query, + buildId = data.buildId, + assetPrefix = data.assetPrefix, + runtimeConfig = data.runtimeConfig, + dynamicIds = data.dynamicIds, + isFallback = data.isFallback, + locale = data.locale, + locales = data.locales, + domainLocales = data.domainLocales, + isPreview = data.isPreview; +var defaultLocale = data.defaultLocale; +var prefix = assetPrefix || ''; // With dynamic assetPrefix it's no longer possible to set assetPrefix at the build time +// So, this is how we do it in the client side at runtime + +__webpack_require__.p = "".concat(prefix, "/_next/"); //eslint-disable-line +// Initialize next/config with the environment configuration + +envConfig.setConfig({ + serverRuntimeConfig: {}, + publicRuntimeConfig: runtimeConfig || {} +}); +var asPath = (0, _utils.getURL)(); // make sure not to attempt stripping basePath for 404s + +if ((0, _router.hasBasePath)(asPath)) { + asPath = (0, _router.delBasePath)(asPath); +} + +if (false) { var detectedDomain, localePathResult, parsedAs, _require4, formatUrl, _require3, parseRelativeUrl, _require2, detectDomainLocale, _require, normalizeLocalePath; } + +if (false) { var _require5, initScriptLoader; } + +var pageLoader = new _pageLoader["default"](buildId, prefix); + +var register = function register(_ref) { + var _ref2 = _slicedToArray(_ref, 2), + r = _ref2[0], + f = _ref2[1]; + + return pageLoader.routeLoader.onEntrypoint(r, f); +}; + +if (window.__NEXT_P) { + // Defer page registration for another tick. This will increase the overall + // latency in hydrating the page, but reduce the total blocking time. + window.__NEXT_P.map(function (p) { + return setTimeout(function () { + return register(p); + }, 0); + }); +} + +window.__NEXT_P = []; +window.__NEXT_P.push = register; +var headManager = (0, _headManager["default"])(); +var appElement = document.getElementById('__next'); + +var _lastRenderReject; + +var webpackHMR; +var router; +exports.router = router; +var CachedApp, onPerfEntry; + +var Container = /*#__PURE__*/function (_react$default$Compon) { + _inherits(Container, _react$default$Compon); + + var _super = _createSuper(Container); + + function Container() { + _classCallCheck(this, Container); + + return _super.apply(this, arguments); + } + + _createClass(Container, [{ + key: "componentDidCatch", + value: function componentDidCatch(componentErr, info) { + this.props.fn(componentErr, info); + } + }, { + key: "componentDidMount", + value: function componentDidMount() { + this.scrollToHash(); // We need to replace the router state if: + // - the page was (auto) exported and has a query string or search (hash) + // - it was auto exported and is a dynamic route (to provide params) + // - if it is a client-side skeleton (fallback render) + + if (router.isSsr && (isFallback || data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search) || hydrateProps && hydrateProps.__N_SSG && location.search)) { + // update query on mount for exported pages + router.replace(router.pathname + '?' + String(querystring.assign(querystring.urlQueryToSearchParams(router.query), new URLSearchParams(location.search))), asPath, { + // @ts-ignore + // WARNING: `_h` is an internal option for handing Next.js + // client-side hydration. Your app should _never_ use this property. + // It may change at any time without notice. + _h: 1, + // Fallback pages must trigger the data fetch, so the transition is + // not shallow. + // Other pages (strictly updating query) happens shallowly, as data + // requirements would already be present. + shallow: !isFallback + }); + } + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate() { + this.scrollToHash(); + } + }, { + key: "scrollToHash", + value: function scrollToHash() { + var _location = location, + hash = _location.hash; + hash = hash && hash.substring(1); + if (!hash) return; + var el = document.getElementById(hash); + if (!el) return; // If we call scrollIntoView() in here without a setTimeout + // it won't scroll properly. + + setTimeout(function () { + return el.scrollIntoView(); + }, 0); + } + }, { + key: "render", + value: function render() { + if (false) {} else { + var _require6 = __webpack_require__(/*! @next/react-dev-overlay/lib/client */ "./node_modules/@next/react-dev-overlay/lib/client.js"), + ReactDevOverlay = _require6.ReactDevOverlay; + + return /*#__PURE__*/_react["default"].createElement(ReactDevOverlay, null, this.props.children); + } + } + }]); + + return Container; +}(_react["default"].Component); + +var emitter = (0, _mitt["default"])(); +exports.emitter = emitter; +var CachedComponent; + +var _default = /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { + var opts, + appEntrypoint, + app, + mod, + initialErr, + pageEntrypoint, + _require7, + isValidElementType, + _require8, + getNodeError, + renderCtx, + _args = arguments; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + opts = _args.length > 0 && _args[0] !== undefined ? _args[0] : {}; + + // This makes sure this specific lines are removed in production + if (true) { + webpackHMR = opts.webpackHMR; + } + + _context.next = 4; + return pageLoader.routeLoader.whenEntrypoint('/_app'); + + case 4: + appEntrypoint = _context.sent; + + if (!('error' in appEntrypoint)) { + _context.next = 7; + break; + } + + throw appEntrypoint.error; + + case 7: + app = appEntrypoint.component, mod = appEntrypoint.exports; + CachedApp = app; + + if (mod && mod.reportWebVitals) { + onPerfEntry = function onPerfEntry(_ref4) { + var id = _ref4.id, + name = _ref4.name, + startTime = _ref4.startTime, + value = _ref4.value, + duration = _ref4.duration, + entryType = _ref4.entryType, + entries = _ref4.entries; + // Combines timestamp with random number for unique ID + var uniqueID = "".concat(Date.now(), "-").concat(Math.floor(Math.random() * (9e12 - 1)) + 1e12); + var perfStartEntry; + + if (entries && entries.length) { + perfStartEntry = entries[0].startTime; + } + + mod.reportWebVitals({ + id: id || uniqueID, + name: name, + startTime: startTime || perfStartEntry, + value: value == null ? duration : value, + label: entryType === 'mark' || entryType === 'measure' ? 'custom' : 'web-vital' + }); + }; + } + + initialErr = hydrateErr; + _context.prev = 11; + + if (!( true && hydrateErr)) { + _context.next = 16; + break; + } + + _context.t0 = { + error: hydrateErr + }; + _context.next = 19; + break; + + case 16: + _context.next = 18; + return pageLoader.routeLoader.whenEntrypoint(page); + + case 18: + _context.t0 = _context.sent; + + case 19: + pageEntrypoint = _context.t0; + + if (!('error' in pageEntrypoint)) { + _context.next = 22; + break; + } + + throw pageEntrypoint.error; + + case 22: + CachedComponent = pageEntrypoint.component; + + if (false) {} + + _require7 = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"), isValidElementType = _require7.isValidElementType; + + if (isValidElementType(CachedComponent)) { + _context.next = 27; + break; + } + + throw new Error("The default export is not a React Component in page: \"".concat(page, "\"")); + + case 27: + _context.next = 32; + break; + + case 29: + _context.prev = 29; + _context.t1 = _context["catch"](11); + // This catches errors like throwing in the top level of a module + initialErr = _context.t1; + + case 32: + if (true) { + _require8 = __webpack_require__(/*! @next/react-dev-overlay/lib/client */ "./node_modules/@next/react-dev-overlay/lib/client.js"), getNodeError = _require8.getNodeError; // Server-side runtime errors need to be re-thrown on the client-side so + // that the overlay is rendered. + + if (initialErr) { + if (initialErr === hydrateErr) { + setTimeout(function () { + var error; + + try { + // Generate a new error object. We `throw` it because some browsers + // will set the `stack` when thrown, and we want to ensure ours is + // not overridden when we re-throw it below. + throw new Error(initialErr.message); + } catch (e) { + error = e; + } + + error.name = initialErr.name; + error.stack = initialErr.stack; + var node = getNodeError(error); + throw node; + }); + } // We replaced the server-side error with a client-side error, and should + // no longer rewrite the stack trace to a Node error. + else { + setTimeout(function () { + throw initialErr; + }); + } + } + } + + if (!window.__NEXT_PRELOADREADY) { + _context.next = 36; + break; + } + + _context.next = 36; + return window.__NEXT_PRELOADREADY(dynamicIds); + + case 36: + exports.router = router = (0, _router2.createRouter)(page, query, asPath, { + initialProps: hydrateProps, + pageLoader: pageLoader, + App: CachedApp, + Component: CachedComponent, + wrapApp: wrapApp, + err: initialErr, + isFallback: Boolean(isFallback), + subscription: function subscription(info, App, scroll) { + return render(Object.assign({}, info, { + App: App, + scroll: scroll + })); + }, + locale: locale, + locales: locales, + defaultLocale: defaultLocale, + domainLocales: domainLocales, + isPreview: isPreview + }); // call init-client middleware + + if (false) {} + + renderCtx = { + App: CachedApp, + initial: true, + Component: CachedComponent, + props: hydrateProps, + err: initialErr + }; + + if (true) { + _context.next = 44; + break; + } + + render(renderCtx); + return _context.abrupt("return", emitter); + + case 44: + return _context.abrupt("return", { + emitter: emitter, + render: render, + renderCtx: renderCtx + }); + + case 45: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[11, 29]]); + })); + + return function _default() { + return _ref3.apply(this, arguments); + }; +}(); + +exports["default"] = _default; + +function render(_x) { + return _render.apply(this, arguments); +} // This method handles all runtime and debug errors. +// 404 and 500 errors are special kind of errors +// and they are still handle via the main render method. + + +function _render() { + _render = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(renderingProps) { + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!renderingProps.err) { + _context2.next = 4; + break; + } + + _context2.next = 3; + return renderError(renderingProps); + + case 3: + return _context2.abrupt("return"); + + case 4: + _context2.prev = 4; + _context2.next = 7; + return doRender(renderingProps); + + case 7: + _context2.next = 16; + break; + + case 9: + _context2.prev = 9; + _context2.t0 = _context2["catch"](4); + + if (!_context2.t0.cancelled) { + _context2.next = 13; + break; + } + + throw _context2.t0; + + case 13: + if (true) { + // Ensure this error is displayed in the overlay in development + setTimeout(function () { + throw _context2.t0; + }); + } + + _context2.next = 16; + return renderError((0, _extends2["default"])({}, renderingProps, { + err: _context2.t0 + })); + + case 16: + case "end": + return _context2.stop(); + } + } + }, _callee2, null, [[4, 9]]); + })); + return _render.apply(this, arguments); +} + +function renderError(renderErrorProps) { + var App = renderErrorProps.App, + err = renderErrorProps.err; // In development runtime errors are caught by our overlay + // In production we catch runtime errors using componentDidCatch which will trigger renderError + + if (true) { + // A Next.js rendering runtime error is always unrecoverable + // FIXME: let's make this recoverable (error in GIP client-transition) + webpackHMR.onUnrecoverableError(); // We need to render an empty <App> so that the `<ReactDevOverlay>` can + // render itself. + + return doRender({ + App: function App() { + return null; + }, + props: {}, + Component: function Component() { + return null; + }, + styleSheets: [] + }); + } + + if (false) {} // Make sure we log the error to the console, otherwise users can't track down issues. + + + console.error(err); + return pageLoader.loadPage('/_error').then(function (_ref5) { + var ErrorComponent = _ref5.page, + styleSheets = _ref5.styleSheets; + // In production we do a normal render with the `ErrorComponent` as component. + // If we've gotten here upon initial render, we can use the props from the server. + // Otherwise, we need to call `getInitialProps` on `App` before mounting. + var AppTree = wrapApp(App); + var appCtx = { + Component: ErrorComponent, + AppTree: AppTree, + router: router, + ctx: { + err: err, + pathname: page, + query: query, + asPath: asPath, + AppTree: AppTree + } + }; + return Promise.resolve(renderErrorProps.props ? renderErrorProps.props : (0, _utils.loadGetInitialProps)(App, appCtx)).then(function (initProps) { + return doRender((0, _extends2["default"])({}, renderErrorProps, { + err: err, + Component: ErrorComponent, + styleSheets: styleSheets, + props: initProps + })); + }); + }); +} + +var reactRoot = null; +var shouldUseHydrate = typeof _reactDom["default"].hydrate === 'function'; + +function renderReactElement(reactEl, domEl) { + if (false) { var opts; } else { + // mark start of hydrate/render + if (_utils.ST) { + performance.mark('beforeRender'); + } // The check for `.hydrate` is there to support React alternatives like preact + + + if (shouldUseHydrate) { + _reactDom["default"].hydrate(reactEl, domEl, markHydrateComplete); + + shouldUseHydrate = false; + } else { + _reactDom["default"].render(reactEl, domEl, markRenderComplete); + } + } +} + +function markHydrateComplete() { + if (!_utils.ST) return; + performance.mark('afterHydrate'); // mark end of hydration + + performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender'); + performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate'); + + if (onPerfEntry) { + performance.getEntriesByName('Next.js-hydration').forEach(onPerfEntry); + } + + clearMarks(); +} + +function markRenderComplete() { + if (!_utils.ST) return; + performance.mark('afterRender'); // mark end of render + + var navStartEntries = performance.getEntriesByName('routeChange', 'mark'); + if (!navStartEntries.length) return; + performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender'); + performance.measure('Next.js-render', 'beforeRender', 'afterRender'); + + if (onPerfEntry) { + performance.getEntriesByName('Next.js-render').forEach(onPerfEntry); + performance.getEntriesByName('Next.js-route-change-to-render').forEach(onPerfEntry); + } + + clearMarks(); + ['Next.js-route-change-to-render', 'Next.js-render'].forEach(function (measure) { + return performance.clearMeasures(measure); + }); +} + +function clearMarks() { + ; + ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(function (mark) { + return performance.clearMarks(mark); + }); +} + +function AppContainer(_ref6) { + var children = _ref6.children; + return /*#__PURE__*/_react["default"].createElement(Container, { + fn: function fn(error) { + return renderError({ + App: CachedApp, + err: error + })["catch"](function (err) { + return console.error('Error rendering page: ', err); + }); + } + }, /*#__PURE__*/_react["default"].createElement(_routerContext.RouterContext.Provider, { + value: (0, _router2.makePublicRouterInstance)(router) + }, /*#__PURE__*/_react["default"].createElement(_headManagerContext.HeadManagerContext.Provider, { + value: headManager + }, children))); +} + +_c = AppContainer; + +var wrapApp = function wrapApp(App) { + return function (wrappedAppProps) { + var appProps = (0, _extends2["default"])({}, wrappedAppProps, { + Component: CachedComponent, + err: hydrateErr, + router: router + }); + return /*#__PURE__*/_react["default"].createElement(AppContainer, null, /*#__PURE__*/_react["default"].createElement(App, appProps)); + }; +}; + +var lastAppProps; + +function doRender(input) { + var App = input.App, + Component = input.Component, + props = input.props, + err = input.err; + var styleSheets = 'initial' in input ? undefined : input.styleSheets; + Component = Component || lastAppProps.Component; + props = props || lastAppProps.props; + var appProps = (0, _extends2["default"])({}, props, { + Component: Component, + err: err, + router: router + }); // lastAppProps has to be set before ReactDom.render to account for ReactDom throwing an error. + + lastAppProps = appProps; + var canceled = false; + var resolvePromise; + var renderPromise = new Promise(function (resolve, reject) { + if (_lastRenderReject) { + _lastRenderReject(); + } + + resolvePromise = function resolvePromise() { + _lastRenderReject = null; + resolve(); + }; + + _lastRenderReject = function lastRenderReject() { + canceled = true; + _lastRenderReject = null; + var error = new Error('Cancel rendering route'); + error.cancelled = true; + reject(error); + }; + }); // This function has a return type to ensure it doesn't start returning a + // Promise. It should remain synchronous. + + function onStart() { + if (!styleSheets || // We use `style-loader` in development, so we don't need to do anything + // unless we're in production: + true) { + return false; + } + + var currentStyleTags = looseToArray(document.querySelectorAll('style[data-n-href]')); + var currentHrefs = new Set(currentStyleTags.map(function (tag) { + return tag.getAttribute('data-n-href'); + })); + var noscript = document.querySelector('noscript[data-n-css]'); + var nonce = noscript == null ? void 0 : noscript.getAttribute('data-n-css'); + styleSheets.forEach(function (_ref7) { + var href = _ref7.href, + text = _ref7.text; + + if (!currentHrefs.has(href)) { + var styleTag = document.createElement('style'); + styleTag.setAttribute('data-n-href', href); + styleTag.setAttribute('media', 'x'); + + if (nonce) { + styleTag.setAttribute('nonce', nonce); + } + + document.head.appendChild(styleTag); + styleTag.appendChild(document.createTextNode(text)); + } + }); + return true; + } + + function onHeadCommit() { + if ( // We use `style-loader` in development, so we don't need to do anything + // unless we're in production: + false) { var referenceNode, idx, currentHrefs, currentStyleTags, desiredHrefs; } + + if (input.scroll) { + window.scrollTo(input.scroll.x, input.scroll.y); + } + } + + function onRootCommit() { + resolvePromise(); + } + + var elem = /*#__PURE__*/_react["default"].createElement(Root, { + callback: onRootCommit + }, /*#__PURE__*/_react["default"].createElement(Head, { + callback: onHeadCommit + }), /*#__PURE__*/_react["default"].createElement(AppContainer, null, /*#__PURE__*/_react["default"].createElement(App, appProps), /*#__PURE__*/_react["default"].createElement(_portal.Portal, { + type: "next-route-announcer" + }, /*#__PURE__*/_react["default"].createElement(_routeAnnouncer.RouteAnnouncer, null)))); + + onStart(); // We catch runtime errors using componentDidCatch which will trigger renderError + + renderReactElement( false ? /*#__PURE__*/undefined : elem, appElement); + return renderPromise; +} + +function Root(_ref9) { + _s(); + + var callback = _ref9.callback, + children = _ref9.children; + + // We use `useLayoutEffect` to guarantee the callback is executed + // as soon as React flushes the update. + _react["default"].useLayoutEffect(function () { + return callback(); + }, [callback]); + + if (undefined) { + // eslint-disable-next-line react-hooks/rules-of-hooks + _react["default"].useEffect(function () { + window.__NEXT_HYDRATED = true; + + if (window.__NEXT_HYDRATED_CB) { + window.__NEXT_HYDRATED_CB(); + } + }, []); + } // We should ask to measure the Web Vitals after rendering completes so we + // don't cause any hydration delay: + + + _react["default"].useEffect(function () { + (0, _performanceRelayer["default"])(onPerfEntry); + }, []); + + return children; +} // Dummy component that we render as a child of Root so that we can +// toggle the correct styles before the page is rendered. + + +_s(Root, "KDoBXdlwSU+O+uFsByO25XxhKDU="); + +_c2 = Root; + +function Head(_ref10) { + _s2(); + + var callback = _ref10.callback; + + // We use `useLayoutEffect` to guarantee the callback is executed + // as soon as React flushes the update. + _react["default"].useLayoutEffect(function () { + return callback(); + }, [callback]); + + return null; +} + +_s2(Head, "n7/vCynhJvM+pLkyL2DMQUF0odM="); + +_c3 = Head; + +var _c, _c2, _c3; + +$RefreshReg$(_c, "AppContainer"); +$RefreshReg$(_c2, "Root"); +$RefreshReg$(_c3, "Head"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/next-dev.js": +/*!***************************************************!*\ + !*** ./node_modules/next/dist/client/next-dev.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +var next = _interopRequireWildcard(__webpack_require__(/*! ./ */ "./node_modules/next/dist/client/index.js")); + +var _eventSourcePolyfill = _interopRequireDefault(__webpack_require__(/*! ./dev/event-source-polyfill */ "./node_modules/next/dist/client/dev/event-source-polyfill.js")); + +var _onDemandEntriesClient = _interopRequireDefault(__webpack_require__(/*! ./dev/on-demand-entries-client */ "./node_modules/next/dist/client/dev/on-demand-entries-client.js")); + +var _webpackHotMiddlewareClient = _interopRequireDefault(__webpack_require__(/*! ./dev/webpack-hot-middleware-client */ "./node_modules/next/dist/client/dev/webpack-hot-middleware-client.js")); + +var _devBuildWatcher = _interopRequireDefault(__webpack_require__(/*! ./dev/dev-build-watcher */ "./node_modules/next/dist/client/dev/dev-build-watcher.js")); + +var _fouc = __webpack_require__(/*! ./dev/fouc */ "./node_modules/next/dist/client/dev/fouc.js"); + +var _eventsource = __webpack_require__(/*! ./dev/error-overlay/eventsource */ "./node_modules/next/dist/client/dev/error-overlay/eventsource.js"); + +var querystring = _interopRequireWildcard(__webpack_require__(/*! ../next-server/lib/router/utils/querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js")); +/* globals import('./dev/noop'); */ +// Temporary workaround for the issue described here: +// https://github.com/vercel/next.js/issues/3775#issuecomment-407438123 +// The runtimeChunk doesn't have dynamic import handling code when there hasn't been a dynamic import +// The runtimeChunk can't hot reload itself currently to correct it when adding pages using on-demand-entries +// eslint-disable-next-line no-unused-expressions + + +__webpack_require__.e(/*! import() */ 0).then(__webpack_require__.t.bind(null, /*! ./dev/noop */ "./node_modules/next/dist/client/dev/noop.js", 7)); +; // Support EventSource on Internet Explorer 11 + +if (!window.EventSource) { + window.EventSource = _eventSourcePolyfill["default"]; +} + +var _window = window, + assetPrefix = _window.__NEXT_DATA__.assetPrefix; +var prefix = assetPrefix || ''; +var webpackHMR = (0, _webpackHotMiddlewareClient["default"])({ + assetPrefix: prefix +}); +window.next = next; +(0, next["default"])({ + webpackHMR: webpackHMR +}).then(function (_ref) { + var renderCtx = _ref.renderCtx, + render = _ref.render; + (0, _onDemandEntriesClient["default"])({ + assetPrefix: prefix + }); + + var buildIndicatorHandler = function buildIndicatorHandler() {}; + + function devPagesManifestListener(event) { + if (event.data.indexOf('devPagesManifest') !== -1) { + fetch("".concat(prefix, "/_next/static/development/_devPagesManifest.json")).then(function (res) { + return res.json(); + }).then(function (manifest) { + window.__DEV_PAGES_MANIFEST = manifest; + })["catch"](function (err) { + console.log("Failed to fetch devPagesManifest", err); + }); + } else if (event.data.indexOf('serverOnlyChanges') !== -1) { + var _JSON$parse = JSON.parse(event.data), + pages = _JSON$parse.pages; + + var router = window.next.router; + + if (pages.includes(router.pathname)) { + console.log('Refreshing page data due to server-side change'); + buildIndicatorHandler('building'); + + var clearIndicator = function clearIndicator() { + return buildIndicatorHandler('built'); + }; + + router.replace(router.pathname + '?' + String(querystring.assign(querystring.urlQueryToSearchParams(router.query), new URLSearchParams(location.search))), router.asPath)["finally"](clearIndicator); + } + } + } + + devPagesManifestListener.unfiltered = true; + (0, _eventsource.getEventSourceWrapper)({}).addMessageListener(devPagesManifestListener); + + if (true) { + (0, _devBuildWatcher["default"])(function (handler) { + buildIndicatorHandler = handler; + }); + } // delay rendering until after styles have been applied in development + + + (0, _fouc.displayContent)(function () { + render(renderCtx); + }); +})["catch"](function (err) { + console.error('Error was not caught', err); +}); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/normalize-trailing-slash.js": +/*!*******************************************************************!*\ + !*** ./node_modules/next/dist/client/normalize-trailing-slash.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.removePathTrailingSlash = removePathTrailingSlash; +exports.normalizePathTrailingSlash = void 0; +/** +* Removes the trailing slash of a path if there is one. Preserves the root path `/`. +*/ + +function removePathTrailingSlash(path) { + return path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path; +} +/** +* Normalizes the trailing slash of a path according to the `trailingSlash` option +* in `next.config.js`. +*/ + + +var normalizePathTrailingSlash = false ? undefined : removePathTrailingSlash; +exports.normalizePathTrailingSlash = normalizePathTrailingSlash; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/page-loader.js": +/*!******************************************************!*\ + !*** ./node_modules/next/dist/client/page-loader.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports["default"] = void 0; + +var _router = __webpack_require__(/*! ../next-server/lib/router/router */ "./node_modules/next/dist/next-server/lib/router/router.js"); + +var _getAssetPathFromRoute = _interopRequireDefault(__webpack_require__(/*! ../next-server/lib/router/utils/get-asset-path-from-route */ "./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js")); + +var _isDynamic = __webpack_require__(/*! ../next-server/lib/router/utils/is-dynamic */ "./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js"); + +var _parseRelativeUrl = __webpack_require__(/*! ../next-server/lib/router/utils/parse-relative-url */ "./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js"); + +var _normalizeTrailingSlash = __webpack_require__(/*! ./normalize-trailing-slash */ "./node_modules/next/dist/client/normalize-trailing-slash.js"); + +var _routeLoader = _interopRequireWildcard(__webpack_require__(/*! ./route-loader */ "./node_modules/next/dist/client/route-loader.js")); + +function normalizeRoute(route) { + if (route[0] !== '/') { + throw new Error("Route name should start with a \"/\", got \"".concat(route, "\"")); + } + + if (route === '/') return route; + return route.replace(/\/$/, ''); +} + +var PageLoader = /*#__PURE__*/function () { + function PageLoader(buildId, assetPrefix) { + _classCallCheck(this, PageLoader); + + this.buildId = void 0; + this.assetPrefix = void 0; + this.promisedSsgManifest = void 0; + this.promisedDevPagesManifest = void 0; + this.routeLoader = void 0; + this.routeLoader = (0, _routeLoader["default"])(assetPrefix); + this.buildId = buildId; + this.assetPrefix = assetPrefix; + /** @type {Promise<Set<string>>} */ + + this.promisedSsgManifest = new Promise(function (resolve) { + if (window.__SSG_MANIFEST) { + resolve(window.__SSG_MANIFEST); + } else { + ; + + window.__SSG_MANIFEST_CB = function () { + resolve(window.__SSG_MANIFEST); + }; + } + }); + } + + _createClass(PageLoader, [{ + key: "getPageList", + value: function getPageList() { + if (false) {} else { + if (window.__DEV_PAGES_MANIFEST) { + return window.__DEV_PAGES_MANIFEST.pages; + } else { + if (!this.promisedDevPagesManifest) { + this.promisedDevPagesManifest = fetch("".concat(this.assetPrefix, "/_next/static/development/_devPagesManifest.json")).then(function (res) { + return res.json(); + }).then(function (manifest) { + ; + window.__DEV_PAGES_MANIFEST = manifest; + return manifest.pages; + })["catch"](function (err) { + console.log("Failed to fetch devPagesManifest", err); + }); + } + + return this.promisedDevPagesManifest; + } + } + } + /** + * @param {string} href the route href (file-system path) + * @param {string} asPath the URL as shown in browser (virtual path); used for dynamic routes + * @returns {string} + */ + + }, { + key: "getDataHref", + value: function getDataHref(href, asPath, ssg, locale) { + var _this = this; + + var _ref = (0, _parseRelativeUrl.parseRelativeUrl)(href), + hrefPathname = _ref.pathname, + query = _ref.query, + search = _ref.search; + + var _ref2 = (0, _parseRelativeUrl.parseRelativeUrl)(asPath), + asPathname = _ref2.pathname; + + var route = normalizeRoute(hrefPathname); + + var getHrefForSlug = function getHrefForSlug(path) { + var dataRoute = (0, _getAssetPathFromRoute["default"])((0, _normalizeTrailingSlash.removePathTrailingSlash)((0, _router.addLocale)(path, locale)), '.json'); + return (0, _router.addBasePath)("/_next/data/".concat(_this.buildId).concat(dataRoute).concat(ssg ? '' : search)); + }; + + var isDynamic = (0, _isDynamic.isDynamicRoute)(route); + var interpolatedRoute = isDynamic ? (0, _router.interpolateAs)(hrefPathname, asPathname, query).result : ''; + return isDynamic ? interpolatedRoute && getHrefForSlug(interpolatedRoute) : getHrefForSlug(route); + } + /** + * @param {string} route - the route (file-system path) + */ + + }, { + key: "_isSsg", + value: function _isSsg(route) { + return this.promisedSsgManifest.then(function (s) { + return s.has(route); + }); + } + }, { + key: "loadPage", + value: function loadPage(route) { + return this.routeLoader.loadRoute(route).then(function (res) { + if ('component' in res) { + return { + page: res.component, + mod: res.exports, + styleSheets: res.styles.map(function (o) { + return { + href: o.href, + text: o.content + }; + }) + }; + } + + throw res.error; + }); + } + }, { + key: "prefetch", + value: function prefetch(route) { + return this.routeLoader.prefetch(route); + } + }]); + + return PageLoader; +}(); + +exports["default"] = PageLoader; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/performance-relayer.js": +/*!**************************************************************!*\ + !*** ./node_modules/next/dist/client/performance-relayer.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = void 0; + +var _webVitals = __webpack_require__(/*! next/dist/compiled/web-vitals */ "./node_modules/next/dist/compiled/web-vitals/web-vitals.es5.umd.min.js"); + +var initialHref = location.href; +var isRegistered = false; +var userReportHandler; + +function onReport(metric) { + if (userReportHandler) { + userReportHandler(metric); + } // This code is not shipped, executed, or present in the client-side + // JavaScript bundle unless explicitly enabled in your application. + // + // When this feature is enabled, we'll make it very clear by printing a + // message during the build (`next build`). + + + if (false) { var vitalsUrl, blob, body; } +} + +var _default = function _default(onPerfEntry) { + // Update function if it changes: + userReportHandler = onPerfEntry; // Only register listeners once: + + if (isRegistered) { + return; + } + + isRegistered = true; + (0, _webVitals.getCLS)(onReport); + (0, _webVitals.getFID)(onReport); + (0, _webVitals.getFCP)(onReport); + (0, _webVitals.getLCP)(onReport); + (0, _webVitals.getTTFB)(onReport); +}; + +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/portal/index.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/client/portal/index.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var _s = $RefreshSig$(); + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +exports.__esModule = true; +exports.Portal = void 0; + +var React = _interopRequireWildcard(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _reactDom = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js"); + +var Portal = function Portal(_ref) { + _s(); + + var children = _ref.children, + type = _ref.type; + var portalNode = React.useRef(null); + + var _React$useState = React.useState(), + _React$useState2 = _slicedToArray(_React$useState, 2), + forceUpdate = _React$useState2[1]; + + React.useEffect(function () { + portalNode.current = document.createElement(type); + document.body.appendChild(portalNode.current); + forceUpdate({}); + return function () { + if (portalNode.current) { + document.body.removeChild(portalNode.current); + } + }; + }, [type]); + return portalNode.current ? /*#__PURE__*/(0, _reactDom.createPortal)(children, portalNode.current) : null; +}; + +_s(Portal, "H9Jq/p5GRHpyHVgd55qLy9aYECA="); + +_c = Portal; +exports.Portal = Portal; + +var _c; + +$RefreshReg$(_c, "Portal"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/request-idle-callback.js": +/*!****************************************************************!*\ + !*** ./node_modules/next/dist/client/request-idle-callback.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.cancelIdleCallback = exports.requestIdleCallback = void 0; + +var requestIdleCallback = typeof self !== 'undefined' && self.requestIdleCallback || function (cb) { + var start = Date.now(); + return setTimeout(function () { + cb({ + didTimeout: false, + timeRemaining: function timeRemaining() { + return Math.max(0, 50 - (Date.now() - start)); + } + }); + }, 1); +}; + +exports.requestIdleCallback = requestIdleCallback; + +var cancelIdleCallback = typeof self !== 'undefined' && self.cancelIdleCallback || function (id) { + return clearTimeout(id); +}; + +exports.cancelIdleCallback = cancelIdleCallback; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/route-announcer.js": +/*!**********************************************************!*\ + !*** ./node_modules/next/dist/client/route-announcer.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +exports.__esModule = true; +exports.RouteAnnouncer = RouteAnnouncer; +exports["default"] = void 0; + +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _router = __webpack_require__(/*! ./router */ "./node_modules/next/dist/client/router.js"); + +function RouteAnnouncer() { + var _ref = (0, _router.useRouter)(), + asPath = _ref.asPath; + + var _ref2 = (0, _react.useState)(''), + _ref3 = _slicedToArray(_ref2, 2), + routeAnnouncement = _ref3[0], + setRouteAnnouncement = _ref3[1]; // Only announce the path change, but not for the first load because screen reader will do that automatically. + + + var initialPathLoaded = (0, _react.useRef)(false); // Every time the path changes, announce the route change. The announcement will be prioritized by h1, then title + // (from metadata), and finally if those don't exist, then the pathName that is in the URL. This methodology is + // inspired by Marcy Sutton's accessible client routing user testing. More information can be found here: + // https://www.gatsbyjs.com/blog/2019-07-11-user-testing-accessible-client-routing/ + + (0, _react.useEffect)(function () { + if (!initialPathLoaded.current) { + initialPathLoaded.current = true; + return; + } + + var newRouteAnnouncement; + var pageHeader = document.querySelector('h1'); + + if (pageHeader) { + newRouteAnnouncement = pageHeader.innerText || pageHeader.textContent; + } + + if (!newRouteAnnouncement) { + if (document.title) { + newRouteAnnouncement = document.title; + } else { + newRouteAnnouncement = asPath; + } + } + + setRouteAnnouncement(newRouteAnnouncement); + }, // TODO: switch to pathname + query object of dynamic route requirements + [asPath]); + return /*#__PURE__*/_react["default"].createElement("p", { + "aria-live": "assertive" // Make the announcement immediately. + , + id: "__next-route-announcer__", + role: "alert", + style: { + border: 0, + clip: 'rect(0 0 0 0)', + height: '1px', + margin: '-1px', + overflow: 'hidden', + padding: 0, + position: 'absolute', + width: '1px', + // https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe + whiteSpace: 'nowrap', + wordWrap: 'normal' + } + }, routeAnnouncement); +} + +_c = RouteAnnouncer; +var _default = RouteAnnouncer; +exports["default"] = _default; + +var _c; + +$RefreshReg$(_c, "RouteAnnouncer"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/route-loader.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/client/route-loader.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.markAssetError = markAssetError; +exports.isAssetError = isAssetError; +exports.getClientBuildManifest = getClientBuildManifest; +exports["default"] = void 0; + +var _getAssetPathFromRoute = _interopRequireDefault(__webpack_require__(/*! ../next-server/lib/router/utils/get-asset-path-from-route */ "./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js")); + +var _requestIdleCallback = __webpack_require__(/*! ./request-idle-callback */ "./node_modules/next/dist/client/request-idle-callback.js"); // 3.8s was arbitrarily chosen as it's what https://web.dev/interactive +// considers as "Good" time-to-interactive. We must assume something went +// wrong beyond this point, and then fall-back to a full page transition to +// show the user something of value. + + +var MS_MAX_IDLE_DELAY = 3800; + +function withFuture(key, map, generator) { + var entry = map.get(key); + + if (entry) { + if ('future' in entry) { + return entry.future; + } + + return Promise.resolve(entry); + } + + var resolver; + var prom = new Promise(function (resolve) { + resolver = resolve; + }); + map.set(key, entry = { + resolve: resolver, + future: prom + }); + return generator ? // eslint-disable-next-line no-sequences + generator().then(function (value) { + return resolver(value), value; + }) : prom; +} + +function hasPrefetch(link) { + try { + link = document.createElement('link'); + return (// detect IE11 since it supports prefetch but isn't detected + // with relList.support + !!window.MSInputMethodContext && !!document.documentMode || link.relList.supports('prefetch') + ); + } catch (_unused) { + return false; + } +} + +var canPrefetch = hasPrefetch(); + +function prefetchViaDom(href, as, link) { + return new Promise(function (res, rej) { + if (document.querySelector("link[rel=\"prefetch\"][href^=\"".concat(href, "\"]"))) { + return res(); + } + + link = document.createElement('link'); // The order of property assignment here is intentional: + + if (as) link.as = as; + link.rel = "prefetch"; + link.crossOrigin = undefined; + link.onload = res; + link.onerror = rej; // `href` should always be last: + + link.href = href; + document.head.appendChild(link); + }); +} + +var ASSET_LOAD_ERROR = Symbol('ASSET_LOAD_ERROR'); // TODO: unexport + +function markAssetError(err) { + return Object.defineProperty(err, ASSET_LOAD_ERROR, {}); +} + +function isAssetError(err) { + return err && ASSET_LOAD_ERROR in err; +} + +function appendScript(src, script) { + return new Promise(function (resolve, reject) { + script = document.createElement('script'); // The order of property assignment here is intentional. + // 1. Setup success/failure hooks in case the browser synchronously + // executes when `src` is set. + + script.onload = resolve; + + script.onerror = function () { + return reject(markAssetError(new Error("Failed to load script: ".concat(src)))); + }; // 2. Configure the cross-origin attribute before setting `src` in case the + // browser begins to fetch. + + + script.crossOrigin = undefined; // 3. Finally, set the source and inject into the DOM in case the child + // must be appended for fetching to start. + + script.src = src; + document.body.appendChild(script); + }); +} // Resolve a promise that times out after given amount of milliseconds. + + +function resolvePromiseWithTimeout(p, ms, err) { + return new Promise(function (resolve, reject) { + var cancelled = false; + p.then(function (r) { + // Resolved, cancel the timeout + cancelled = true; + resolve(r); + })["catch"](reject); + (0, _requestIdleCallback.requestIdleCallback)(function () { + return setTimeout(function () { + if (!cancelled) { + reject(err); + } + }, ms); + }); + }); +} // TODO: stop exporting or cache the failure +// It'd be best to stop exporting this. It's an implementation detail. We're +// only exporting it for backwards compatibilty with the `page-loader`. +// Only cache this response as a last resort if we cannot eliminate all other +// code branches that use the Build Manifest Callback and push them through +// the Route Loader interface. + + +function getClientBuildManifest() { + if (self.__BUILD_MANIFEST) { + return Promise.resolve(self.__BUILD_MANIFEST); + } + + var onBuildManifest = new Promise(function (resolve) { + // Mandatory because this is not concurrent safe: + var cb = self.__BUILD_MANIFEST_CB; + + self.__BUILD_MANIFEST_CB = function () { + resolve(self.__BUILD_MANIFEST); + cb && cb(); + }; + }); + return resolvePromiseWithTimeout(onBuildManifest, MS_MAX_IDLE_DELAY, markAssetError(new Error('Failed to load client build manifest'))); +} + +function getFilesForRoute(assetPrefix, route) { + if (true) { + return Promise.resolve({ + scripts: [assetPrefix + '/_next/static/chunks/pages' + encodeURI((0, _getAssetPathFromRoute["default"])(route, '.js'))], + // Styles are handled by `style-loader` in development: + css: [] + }); + } + + return getClientBuildManifest().then(function (manifest) { + if (!(route in manifest)) { + throw markAssetError(new Error("Failed to lookup route: ".concat(route))); + } + + var allFiles = manifest[route].map(function (entry) { + return assetPrefix + '/_next/' + encodeURI(entry); + }); + return { + scripts: allFiles.filter(function (v) { + return v.endsWith('.js'); + }), + css: allFiles.filter(function (v) { + return v.endsWith('.css'); + }) + }; + }); +} + +function createRouteLoader(assetPrefix) { + var entrypoints = new Map(); + var loadedScripts = new Map(); + var styleSheets = new Map(); + var routes = new Map(); + + function maybeExecuteScript(src) { + var prom = loadedScripts.get(src); + + if (prom) { + return prom; + } // Skip executing script if it's already in the DOM: + + + if (document.querySelector("script[src^=\"".concat(src, "\"]"))) { + return Promise.resolve(); + } + + loadedScripts.set(src, prom = appendScript(src)); + return prom; + } + + function fetchStyleSheet(href) { + var prom = styleSheets.get(href); + + if (prom) { + return prom; + } + + styleSheets.set(href, prom = fetch(href).then(function (res) { + if (!res.ok) { + throw new Error("Failed to load stylesheet: ".concat(href)); + } + + return res.text().then(function (text) { + return { + href: href, + content: text + }; + }); + })["catch"](function (err) { + throw markAssetError(err); + })); + return prom; + } + + return { + whenEntrypoint: function whenEntrypoint(route) { + return withFuture(route, entrypoints); + }, + onEntrypoint: function onEntrypoint(route, execute) { + Promise.resolve(execute).then(function (fn) { + return fn(); + }).then(function (exports) { + return { + component: exports && exports["default"] || exports, + exports: exports + }; + }, function (err) { + return { + error: err + }; + }).then(function (input) { + var old = entrypoints.get(route); + entrypoints.set(route, input); + if (old && 'resolve' in old) old.resolve(input); + }); + }, + loadRoute: function loadRoute(route) { + var _this = this; + + return withFuture(route, routes, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { + var _yield$getFilesForRou, scripts, css, _yield$Promise$all, _yield$Promise$all2, styles, entrypoint, res; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return getFilesForRoute(assetPrefix, route); + + case 3: + _yield$getFilesForRou = _context.sent; + scripts = _yield$getFilesForRou.scripts; + css = _yield$getFilesForRou.css; + _context.next = 8; + return Promise.all([entrypoints.has(route) ? [] : Promise.all(scripts.map(maybeExecuteScript)), Promise.all(css.map(fetchStyleSheet))]); + + case 8: + _yield$Promise$all = _context.sent; + _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2); + styles = _yield$Promise$all2[1]; + _context.next = 13; + return resolvePromiseWithTimeout(_this.whenEntrypoint(route), MS_MAX_IDLE_DELAY, markAssetError(new Error("Route did not complete loading: ".concat(route)))); + + case 13: + entrypoint = _context.sent; + res = Object.assign({ + styles: styles + }, entrypoint); + return _context.abrupt("return", 'error' in entrypoint ? entrypoint : res); + + case 18: + _context.prev = 18; + _context.t0 = _context["catch"](0); + return _context.abrupt("return", { + error: _context.t0 + }); + + case 21: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 18]]); + }))); + }, + prefetch: function prefetch(route) { + var _this2 = this; + + // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118 + // License: Apache 2.0 + var cn; + + if (cn = navigator.connection) { + // Don't prefetch if using 2G or if Save-Data is enabled. + if (cn.saveData || /2g/.test(cn.effectiveType)) return Promise.resolve(); + } + + return getFilesForRoute(assetPrefix, route).then(function (output) { + return Promise.all(canPrefetch ? output.scripts.map(function (script) { + return prefetchViaDom(script, 'script'); + }) : []); + }).then(function () { + (0, _requestIdleCallback.requestIdleCallback)(function () { + return _this2.loadRoute(route); + }); + })["catch"]( // swallow prefetch errors + function () {}); + } + }; +} + +var _default = createRouteLoader; +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/router.js": +/*!*************************************************!*\ + !*** ./node_modules/next/dist/client/router.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _construct = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/construct */ "./node_modules/@babel/runtime/helpers/construct.js"); + +var _s = $RefreshSig$(); + +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.useRouter = useRouter; +exports.makePublicRouterInstance = makePublicRouterInstance; +exports.createRouter = exports.withRouter = exports["default"] = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _router2 = _interopRequireWildcard(__webpack_require__(/*! ../next-server/lib/router/router */ "./node_modules/next/dist/next-server/lib/router/router.js")); + +exports.Router = _router2["default"]; +exports.NextRouter = _router2.NextRouter; + +var _routerContext = __webpack_require__(/*! ../next-server/lib/router-context */ "./node_modules/next/dist/next-server/lib/router-context.js"); + +var _withRouter = _interopRequireDefault(__webpack_require__(/*! ./with-router */ "./node_modules/next/dist/client/with-router.js")); + +exports.withRouter = _withRouter["default"]; +/* global window */ + +var singletonRouter = { + router: null, + // holds the actual router instance + readyCallbacks: [], + ready: function ready(cb) { + if (this.router) return cb(); + + if (true) { + this.readyCallbacks.push(cb); + } + } +}; // Create public properties and methods of the router in the singletonRouter + +var urlPropertyFields = ['pathname', 'route', 'query', 'asPath', 'components', 'isFallback', 'basePath', 'locale', 'locales', 'defaultLocale', 'isReady', 'isPreview', 'isLocaleDomain']; +var routerEvents = ['routeChangeStart', 'beforeHistoryChange', 'routeChangeComplete', 'routeChangeError', 'hashChangeStart', 'hashChangeComplete']; +var coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'beforePopState']; // Events is a static property on the router, the router doesn't have to be initialized to use it + +Object.defineProperty(singletonRouter, 'events', { + get: function get() { + return _router2["default"].events; + } +}); +urlPropertyFields.forEach(function (field) { + // Here we need to use Object.defineProperty because, we need to return + // the property assigned to the actual router + // The value might get changed as we change routes and this is the + // proper way to access it + Object.defineProperty(singletonRouter, field, { + get: function get() { + var router = getRouter(); + return router[field]; + } + }); +}); +coreMethodFields.forEach(function (field) { + // We don't really know the types here, so we add them later instead + ; + + singletonRouter[field] = function () { + var router = getRouter(); + return router[field].apply(router, arguments); + }; +}); +routerEvents.forEach(function (event) { + singletonRouter.ready(function () { + _router2["default"].events.on(event, function () { + var eventField = "on".concat(event.charAt(0).toUpperCase()).concat(event.substring(1)); + var _singletonRouter = singletonRouter; + + if (_singletonRouter[eventField]) { + try { + _singletonRouter[eventField].apply(_singletonRouter, arguments); + } catch (err) { + console.error("Error when running the Router event: ".concat(eventField)); + console.error("".concat(err.message, "\n").concat(err.stack)); + } + } + }); + }); +}); + +function getRouter() { + if (!singletonRouter.router) { + var message = 'No router instance found.\n' + 'You should only use "next/router" inside the client side of your app.\n'; + throw new Error(message); + } + + return singletonRouter.router; +} // Export the singletonRouter and this is the public API. + + +var _default = singletonRouter; // Reexport the withRoute HOC + +exports["default"] = _default; + +function useRouter() { + _s(); + + return _react["default"].useContext(_routerContext.RouterContext); +} // INTERNAL APIS +// ------------- +// (do not use following exports inside the app) +// Create a router and assign it as the singleton instance. +// This is used in client side when we are initilizing the app. +// This should **not** use inside the server. + + +_s(useRouter, "gDsCjeeItUuvgOWf1v4qoK9RF6k="); + +var createRouter = function createRouter() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + singletonRouter.router = _construct(_router2["default"], args); + singletonRouter.readyCallbacks.forEach(function (cb) { + return cb(); + }); + singletonRouter.readyCallbacks = []; + return singletonRouter.router; +}; // This function is used to create the `withRouter` router instance + + +exports.createRouter = createRouter; + +function makePublicRouterInstance(router) { + var _router = router; + var instance = {}; + + var _iterator = _createForOfIteratorHelper(urlPropertyFields), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var property = _step.value; + + if (typeof _router[property] === 'object') { + instance[property] = Object.assign(Array.isArray(_router[property]) ? [] : {}, _router[property]); // makes sure query is not stateful + + continue; + } + + instance[property] = _router[property]; + } // Events is a static property on the router, the router doesn't have to be initialized to use it + + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + instance.events = _router2["default"].events; + coreMethodFields.forEach(function (field) { + instance[field] = function () { + return _router[field].apply(_router, arguments); + }; + }); + return instance; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/with-router.js": +/*!******************************************************!*\ + !*** ./node_modules/next/dist/client/with-router.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports["default"] = withRouter; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _router = __webpack_require__(/*! ./router */ "./node_modules/next/dist/client/router.js"); + +function withRouter(ComposedComponent) { + function WithRouterWrapper(props) { + return /*#__PURE__*/_react["default"].createElement(ComposedComponent, Object.assign({ + router: (0, _router.useRouter)() + }, props)); + } + + WithRouterWrapper.getInitialProps = ComposedComponent.getInitialProps // This is needed to allow checking for custom getInitialProps in _app + ; + WithRouterWrapper.origGetInitialProps = ComposedComponent.origGetInitialProps; + + if (true) { + var name = ComposedComponent.displayName || ComposedComponent.name || 'Unknown'; + WithRouterWrapper.displayName = "withRouter(".concat(name, ")"); + } + + return WithRouterWrapper; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/strip-ansi/index.js": +/*!*************************************!*\ + !*** (webpack)/strip-ansi/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(__dirname, module) {module.exports = function () { + "use strict"; + + var e = { + 161: function _(e) { + e.exports = function () { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$onlyFirst = _ref.onlyFirst, + e = _ref$onlyFirst === void 0 ? false : _ref$onlyFirst; + + var r = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|"); + return new RegExp(r, e ? undefined : "g"); + }; + }, + 301: function _(e, r, t) { + var _ = t(161); + + e.exports = function (e) { + return typeof e === "string" ? e.replace(_(), "") : e; + }; + } + }; + var r = {}; + + function __nccwpck_require__(t) { + if (r[t]) { + return r[t].exports; + } + + var _ = r[t] = { + exports: {} + }; + + var n = true; + + try { + e[t](_, _.exports, __nccwpck_require__); + n = false; + } finally { + if (n) delete r[t]; + } + + return _.exports; + } + + __nccwpck_require__.ab = __dirname + "/"; + return __nccwpck_require__(301); +}(); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, "/", __webpack_require__(/*! ./../webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/web-vitals/web-vitals.es5.umd.min.js": +/*!******************************************************!*\ + !*** (webpack)/web-vitals/web-vitals.es5.umd.min.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports=function(){var t={599:function(t,e){!function(t,n){true?n(e):undefined}(this,function(t){"use strict";var e,n,i=function(){return"".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)},a=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;return{name:t,value:e,delta:0,entries:[],id:i(),isFinal:!1}},r=function(t,e){try{if(PerformanceObserver.supportedEntryTypes.includes(t)){var n=new PerformanceObserver(function(t){return t.getEntries().map(e)});return n.observe({type:t,buffered:!0}),n}}catch(t){}},o=!1,u=!1,s=function(t){o=!t.persisted},c=function(){addEventListener("pagehide",s),addEventListener("beforeunload",function(){})},p=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];u||(c(),u=!0),addEventListener("visibilitychange",function(e){var n=e.timeStamp;"hidden"===document.visibilityState&&t({timeStamp:n,isUnloading:o})},{capture:!0,once:e})},l=function(t,e,n,i){var a;return function(){n&&e.isFinal&&n.disconnect(),e.value>=0&&(i||e.isFinal||"hidden"===document.visibilityState)&&(e.delta=e.value-(a||0),(e.delta||e.isFinal||void 0===a)&&(t(e),a=e.value))}},f=function(){return void 0===e&&(e="hidden"===document.visibilityState?0:1/0,p(function(t){var n=t.timeStamp;return e=n},!0)),{get timeStamp(){return e}}},d=function(){return n||(n=new Promise(function(t){return["scroll","keydown","pointerdown"].map(function(e){addEventListener(e,t,{once:!0,passive:!0,capture:!0})})})),n};t.getCLS=function(t){var e,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=a("CLS",0),o=function(t){t.hadRecentInput||(i.value+=t.value,i.entries.push(t),e())},u=r("layout-shift",o);u&&(e=l(t,i,u,n),p(function(t){var n=t.isUnloading;u.takeRecords().map(o),n&&(i.isFinal=!0),e()}))},t.getFCP=function(t){var e,n=a("FCP"),i=f(),o=r("paint",function(t){"first-contentful-paint"===t.name&&t.startTime<i.timeStamp&&(n.value=t.startTime,n.isFinal=!0,n.entries.push(t),e())});o&&(e=l(t,n,o))},t.getFID=function(t){var e=a("FID"),n=f(),i=function(t){t.startTime<n.timeStamp&&(e.value=t.processingStart-t.startTime,e.entries.push(t),e.isFinal=!0,u())},o=r("first-input",i),u=l(t,e,o);o?p(function(){o.takeRecords().map(i),o.disconnect()},!0):window.perfMetrics&&window.perfMetrics.onFirstInputDelay&&window.perfMetrics.onFirstInputDelay(function(t,i){i.timeStamp<n.timeStamp&&(e.value=t,e.isFinal=!0,e.entries=[{entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+t}],u())})},t.getLCP=function(t){var e,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=a("LCP"),o=f(),u=function(t){var n=t.startTime;n<o.timeStamp?(i.value=n,i.entries.push(t)):i.isFinal=!0,e()},s=r("largest-contentful-paint",u);if(s){e=l(t,i,s,n);var c=function(){i.isFinal||(s.takeRecords().map(u),i.isFinal=!0,e())};d().then(c),p(c,!0)}},t.getTTFB=function(t){var e,n=a("TTFB");e=function(){try{var e=performance.getEntriesByType("navigation")[0]||function(){var t=performance.timing,e={entryType:"navigation",startTime:0};for(var n in t)"navigationStart"!==n&&"toJSON"!==n&&(e[n]=Math.max(t[n]-t.navigationStart,0));return e}();n.value=n.delta=e.responseStart,n.entries=[e],n.isFinal=!0,t(n)}catch(t){}},"complete"===document.readyState?setTimeout(e,0):addEventListener("pageshow",e)},Object.defineProperty(t,"__esModule",{value:!0})})}};var e={};function __nccwpck_require__(n){if(e[n]){return e[n].exports}var i=e[n]={exports:{}};var a=true;try{t[n].call(i.exports,i,i.exports,__nccwpck_require__);a=false}finally{if(a)delete e[n]}return i.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(599)}(); +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/global.js": +/*!***********************************!*\ + !*** (webpack)/webpack/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 149: +/***/ (function(module) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(149); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/module.js": +/*!***********************************!*\ + !*** (webpack)/webpack/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 880: +/***/ (function(module) { + +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(880); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/head-manager-context.js": +/*!************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/head-manager-context.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.HeadManagerContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var HeadManagerContext = /*#__PURE__*/_react["default"].createContext({}); + +exports.HeadManagerContext = HeadManagerContext; + +if (true) { + HeadManagerContext.displayName = 'HeadManagerContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/i18n/normalize-locale-path.js": +/*!******************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/i18n/normalize-locale-path.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.normalizeLocalePath = normalizeLocalePath; + +function normalizeLocalePath(pathname, locales) { + var detectedLocale; // first item will be empty string from splitting at first char + + var pathnameParts = pathname.split('/'); + (locales || []).some(function (locale) { + if (pathnameParts[1].toLowerCase() === locale.toLowerCase()) { + detectedLocale = locale; + pathnameParts.splice(1, 1); + pathname = pathnameParts.join('/') || '/'; + return true; + } + + return false; + }); + return { + pathname: pathname, + detectedLocale: detectedLocale + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/mitt.js": +/*!********************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/mitt.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = mitt; +/* +MIT License +Copyright (c) Jason Miller (https://jasonformat.com/) +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. +*/ +// This file is based on https://github.com/developit/mitt/blob/v1.1.3/src/index.js +// It's been edited for the needs of this script +// See the LICENSE at the top of the file + +function mitt() { + var all = Object.create(null); + return { + on: function on(type, handler) { + ; + (all[type] || (all[type] = [])).push(handler); + }, + off: function off(type, handler) { + if (all[type]) { + all[type].splice(all[type].indexOf(handler) >>> 0, 1); + } + }, + emit: function emit(type) { + for (var _len = arguments.length, evts = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + evts[_key - 1] = arguments[_key]; + } + + // eslint-disable-next-line array-callback-return + ; + (all[type] || []).slice().map(function (handler) { + handler.apply(void 0, evts); + }); + } + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router-context.js": +/*!******************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router-context.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.RouterContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var RouterContext = /*#__PURE__*/_react["default"].createContext(null); + +exports.RouterContext = RouterContext; + +if (true) { + RouterContext.displayName = 'RouterContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/router.js": +/*!*****************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/router.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +exports.__esModule = true; +exports.getDomainLocale = getDomainLocale; +exports.addLocale = addLocale; +exports.delLocale = delLocale; +exports.hasBasePath = hasBasePath; +exports.addBasePath = addBasePath; +exports.delBasePath = delBasePath; +exports.isLocalURL = isLocalURL; +exports.interpolateAs = interpolateAs; +exports.resolveHref = resolveHref; +exports["default"] = void 0; + +var _normalizeTrailingSlash = __webpack_require__(/*! ../../../client/normalize-trailing-slash */ "./node_modules/next/dist/client/normalize-trailing-slash.js"); + +var _routeLoader = __webpack_require__(/*! ../../../client/route-loader */ "./node_modules/next/dist/client/route-loader.js"); + +var _denormalizePagePath = __webpack_require__(/*! ../../server/denormalize-page-path */ "./node_modules/next/dist/next-server/server/denormalize-page-path.js"); + +var _normalizeLocalePath = __webpack_require__(/*! ../i18n/normalize-locale-path */ "./node_modules/next/dist/next-server/lib/i18n/normalize-locale-path.js"); + +var _mitt = _interopRequireDefault(__webpack_require__(/*! ../mitt */ "./node_modules/next/dist/next-server/lib/mitt.js")); + +var _utils = __webpack_require__(/*! ../utils */ "./node_modules/next/dist/next-server/lib/utils.js"); + +var _isDynamic = __webpack_require__(/*! ./utils/is-dynamic */ "./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js"); + +var _parseRelativeUrl = __webpack_require__(/*! ./utils/parse-relative-url */ "./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js"); + +var _querystring = __webpack_require__(/*! ./utils/querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js"); + +var _resolveRewrites = _interopRequireDefault(__webpack_require__(/*! ./utils/resolve-rewrites */ "./node_modules/next/dist/next-server/lib/router/utils/resolve-rewrites-noop.js")); + +var _routeMatcher = __webpack_require__(/*! ./utils/route-matcher */ "./node_modules/next/dist/next-server/lib/router/utils/route-matcher.js"); + +var _routeRegex = __webpack_require__(/*! ./utils/route-regex */ "./node_modules/next/dist/next-server/lib/router/utils/route-regex.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} +/* global __NEXT_DATA__ */ +// tslint:disable:no-console + + +var detectDomainLocale; + +if (false) {} + +var basePath = false || ''; + +function buildCancellationError() { + return Object.assign(new Error('Route Cancelled'), { + cancelled: true + }); +} + +function addPathPrefix(path, prefix) { + return prefix && path.startsWith('/') ? path === '/' ? (0, _normalizeTrailingSlash.normalizePathTrailingSlash)(prefix) : "".concat(prefix).concat(pathNoQueryHash(path) === '/' ? path.substring(1) : path) : path; +} + +function getDomainLocale(path, locale, locales, domainLocales) { + if (false) { var detectedDomain; } + + return false; +} + +function addLocale(path, locale, defaultLocale) { + if (false) {} + + return path; +} + +function delLocale(path, locale) { + if (false) {} + + return path; +} + +function pathNoQueryHash(path) { + var queryIndex = path.indexOf('?'); + var hashIndex = path.indexOf('#'); + + if (queryIndex > -1 || hashIndex > -1) { + path = path.substring(0, queryIndex > -1 ? queryIndex : hashIndex); + } + + return path; +} + +function hasBasePath(path) { + path = pathNoQueryHash(path); + return path === basePath || path.startsWith(basePath + '/'); +} + +function addBasePath(path) { + // we only add the basepath on relative urls + return addPathPrefix(path, basePath); +} + +function delBasePath(path) { + path = path.slice(basePath.length); + if (!path.startsWith('/')) path = "/".concat(path); + return path; +} +/** +* Detects whether a given url is routable by the Next.js router (browser only). +*/ + + +function isLocalURL(url) { + // prevent a hydration mismatch on href for url with anchor refs + if (url.startsWith('/') || url.startsWith('#')) return true; + + try { + // absolute urls can be local if they are on the same origin + var locationOrigin = (0, _utils.getLocationOrigin)(); + var resolved = new URL(url, locationOrigin); + return resolved.origin === locationOrigin && hasBasePath(resolved.pathname); + } catch (_) { + return false; + } +} + +function interpolateAs(route, asPathname, query) { + var interpolatedRoute = ''; + var dynamicRegex = (0, _routeRegex.getRouteRegex)(route); + var dynamicGroups = dynamicRegex.groups; + var dynamicMatches = // Try to match the dynamic route against the asPath + (asPathname !== route ? (0, _routeMatcher.getRouteMatcher)(dynamicRegex)(asPathname) : '') || // Fall back to reading the values from the href + // TODO: should this take priority; also need to change in the router. + query; + interpolatedRoute = route; + var params = Object.keys(dynamicGroups); + + if (!params.every(function (param) { + var value = dynamicMatches[param] || ''; + var _dynamicGroups$param = dynamicGroups[param], + repeat = _dynamicGroups$param.repeat, + optional = _dynamicGroups$param.optional; // support single-level catch-all + // TODO: more robust handling for user-error (passing `/`) + + var replaced = "[".concat(repeat ? '...' : '').concat(param, "]"); + + if (optional) { + replaced = "".concat(!value ? '/' : '', "[").concat(replaced, "]"); + } + + if (repeat && !Array.isArray(value)) value = [value]; + return (optional || param in dynamicMatches) && ( // Interpolate group into data URL if present + interpolatedRoute = interpolatedRoute.replace(replaced, repeat ? value.map( // these values should be fully encoded instead of just + // path delimiter escaped since they are being inserted + // into the URL and we expect URL encoded segments + // when parsing dynamic route params + function (segment) { + return encodeURIComponent(segment); + }).join('/') : encodeURIComponent(value)) || '/'); + })) { + interpolatedRoute = ''; // did not satisfy all requirements + // n.b. We ignore this error because we handle warning for this case in + // development in the `<Link>` component directly. + } + + return { + params: params, + result: interpolatedRoute + }; +} + +function omitParmsFromQuery(query, params) { + var filteredQuery = {}; + Object.keys(query).forEach(function (key) { + if (!params.includes(key)) { + filteredQuery[key] = query[key]; + } + }); + return filteredQuery; +} +/** +* Resolves a given hyperlink with a certain router state (basePath not included). +* Preserves absolute urls. +*/ + + +function resolveHref(currentPath, href, resolveAs) { + // we use a dummy base url for relative urls + var base = new URL(currentPath, 'http://n'); + var urlAsString = typeof href === 'string' ? href : (0, _utils.formatWithValidation)(href); // Return because it cannot be routed by the Next.js router + + if (!isLocalURL(urlAsString)) { + return resolveAs ? [urlAsString] : urlAsString; + } + + try { + var finalUrl = new URL(urlAsString, base); + finalUrl.pathname = (0, _normalizeTrailingSlash.normalizePathTrailingSlash)(finalUrl.pathname); + var interpolatedAs = ''; + + if ((0, _isDynamic.isDynamicRoute)(finalUrl.pathname) && finalUrl.searchParams && resolveAs) { + var query = (0, _querystring.searchParamsToUrlQuery)(finalUrl.searchParams); + + var _interpolateAs = interpolateAs(finalUrl.pathname, finalUrl.pathname, query), + result = _interpolateAs.result, + params = _interpolateAs.params; + + if (result) { + interpolatedAs = (0, _utils.formatWithValidation)({ + pathname: result, + hash: finalUrl.hash, + query: omitParmsFromQuery(query, params) + }); + } + } // if the origin didn't change, it means we received a relative href + + + var resolvedHref = finalUrl.origin === base.origin ? finalUrl.href.slice(finalUrl.origin.length) : finalUrl.href; + return resolveAs ? [resolvedHref, interpolatedAs || resolvedHref] : resolvedHref; + } catch (_) { + return resolveAs ? [urlAsString] : urlAsString; + } +} + +function stripOrigin(url) { + var origin = (0, _utils.getLocationOrigin)(); + return url.startsWith(origin) ? url.substring(origin.length) : url; +} + +function prepareUrlAs(router, url, as) { + // If url and as provided as an object representation, + // we'll format them into the string version here. + var _resolveHref = resolveHref(router.pathname, url, true), + _resolveHref2 = _slicedToArray(_resolveHref, 2), + resolvedHref = _resolveHref2[0], + resolvedAs = _resolveHref2[1]; + + var origin = (0, _utils.getLocationOrigin)(); + var hrefHadOrigin = resolvedHref.startsWith(origin); + var asHadOrigin = resolvedAs && resolvedAs.startsWith(origin); + resolvedHref = stripOrigin(resolvedHref); + resolvedAs = resolvedAs ? stripOrigin(resolvedAs) : resolvedAs; + var preparedUrl = hrefHadOrigin ? resolvedHref : addBasePath(resolvedHref); + var preparedAs = as ? stripOrigin(resolveHref(router.pathname, as)) : resolvedAs || resolvedHref; + return { + url: preparedUrl, + as: asHadOrigin ? preparedAs : addBasePath(preparedAs) + }; +} + +function resolveDynamicRoute(pathname, pages) { + var cleanPathname = (0, _normalizeTrailingSlash.removePathTrailingSlash)((0, _denormalizePagePath.denormalizePagePath)(pathname)); + + if (cleanPathname === '/404' || cleanPathname === '/_error') { + return pathname; + } // handle resolving href for dynamic routes + + + if (!pages.includes(cleanPathname)) { + // eslint-disable-next-line array-callback-return + pages.some(function (page) { + if ((0, _isDynamic.isDynamicRoute)(page) && (0, _routeRegex.getRouteRegex)(page).re.test(cleanPathname)) { + pathname = page; + return true; + } + }); + } + + return (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname); +} + +var manualScrollRestoration = false && false; +var SSG_DATA_NOT_FOUND = Symbol('SSG_DATA_NOT_FOUND'); + +function fetchRetry(url, attempts) { + return fetch(url, { + // Cookies are required to be present for Next.js' SSG "Preview Mode". + // Cookies may also be required for `getServerSideProps`. + // + // > `fetch` won’t send cookies, unless you set the credentials init + // > option. + // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch + // + // > For maximum browser compatibility when it comes to sending & + // > receiving cookies, always supply the `credentials: 'same-origin'` + // > option instead of relying on the default. + // https://github.com/github/fetch#caveats + credentials: 'same-origin' + }).then(function (res) { + if (!res.ok) { + if (attempts > 1 && res.status >= 500) { + return fetchRetry(url, attempts - 1); + } + + if (res.status === 404) { + return res.json().then(function (data) { + if (data.notFound) { + return { + notFound: SSG_DATA_NOT_FOUND + }; + } + + throw new Error("Failed to load static props"); + }); + } + + throw new Error("Failed to load static props"); + } + + return res.json(); + }); +} + +function fetchNextData(dataHref, isServerRender) { + return fetchRetry(dataHref, isServerRender ? 3 : 1)["catch"](function (err) { + // We should only trigger a server-side transition if this was caused + // on a client-side transition. Otherwise, we'd get into an infinite + // loop. + if (!isServerRender) { + (0, _routeLoader.markAssetError)(err); + } + + throw err; + }); +} + +var Router = /*#__PURE__*/function () { + /** + * Map of all components loaded in `Router` + */ + // Static Data Cache + // In-flight Server Data Requests, for deduping + function Router(_pathname, _query, _as, _ref) { + var _this = this; + + var initialProps = _ref.initialProps, + pageLoader = _ref.pageLoader, + App = _ref.App, + wrapApp = _ref.wrapApp, + Component = _ref.Component, + err = _ref.err, + subscription = _ref.subscription, + isFallback = _ref.isFallback, + locale = _ref.locale, + locales = _ref.locales, + defaultLocale = _ref.defaultLocale, + domainLocales = _ref.domainLocales, + isPreview = _ref.isPreview; + + _classCallCheck(this, Router); + + this.route = void 0; + this.pathname = void 0; + this.query = void 0; + this.asPath = void 0; + this.basePath = void 0; + this.components = void 0; + this.sdc = {}; + this.sdr = {}; + this.sub = void 0; + this.clc = void 0; + this.pageLoader = void 0; + this._bps = void 0; + this.events = void 0; + this._wrapApp = void 0; + this.isSsr = void 0; + this.isFallback = void 0; + this._inFlightRoute = void 0; + this._shallow = void 0; + this.locale = void 0; + this.locales = void 0; + this.defaultLocale = void 0; + this.domainLocales = void 0; + this.isReady = void 0; + this.isPreview = void 0; + this.isLocaleDomain = void 0; + this._idx = 0; + + this.onPopState = function (e) { + var state = e.state; + + if (!state) { + // We get state as undefined for two reasons. + // 1. With older safari (< 8) and older chrome (< 34) + // 2. When the URL changed with # + // + // In the both cases, we don't need to proceed and change the route. + // (as it's already changed) + // But we can simply replace the state with the new changes. + // Actually, for (1) we don't need to nothing. But it's hard to detect that event. + // So, doing the following for (1) does no harm. + var _pathname2 = _this.pathname, + query = _this.query; + + _this.changeState('replaceState', (0, _utils.formatWithValidation)({ + pathname: addBasePath(_pathname2), + query: query + }), (0, _utils.getURL)()); + + return; + } + + if (!state.__N) { + return; + } + + var forcedScroll; + var url = state.url, + as = state.as, + options = state.options, + idx = state.idx; + + if (false) { var v; } + + _this._idx = idx; + + var _ref2 = (0, _parseRelativeUrl.parseRelativeUrl)(url), + pathname = _ref2.pathname; // Make sure we don't re-render on initial load, + // can be caused by navigating back from an external site + + + if (_this.isSsr && as === _this.asPath && pathname === _this.pathname) { + return; + } // If the downstream application returns falsy, return. + // They will then be responsible for handling the event. + + + if (_this._bps && !_this._bps(state)) { + return; + } + + _this.change('replaceState', url, as, Object.assign({}, options, { + shallow: options.shallow && _this._shallow, + locale: options.locale || _this.defaultLocale + }), forcedScroll); + }; // represents the current component key + + + this.route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(_pathname); // set up the component cache (by route keys) + + this.components = {}; // We should not keep the cache, if there's an error + // Otherwise, this cause issues when when going back and + // come again to the errored page. + + if (_pathname !== '/_error') { + this.components[this.route] = { + Component: Component, + initial: true, + props: initialProps, + err: err, + __N_SSG: initialProps && initialProps.__N_SSG, + __N_SSP: initialProps && initialProps.__N_SSP + }; + } + + this.components['/_app'] = { + Component: App, + styleSheets: [ + /* /_app does not need its stylesheets managed */ + ] + }; // Backwards compat for Router.router.events + // TODO: Should be remove the following major version as it was never documented + + this.events = Router.events; + this.pageLoader = pageLoader; + this.pathname = _pathname; + this.query = _query; // if auto prerendered and dynamic route wait to update asPath + // until after mount to prevent hydration mismatch + + var autoExportDynamic = (0, _isDynamic.isDynamicRoute)(_pathname) && self.__NEXT_DATA__.autoExport; + + this.asPath = autoExportDynamic ? _pathname : _as; + this.basePath = basePath; + this.sub = subscription; + this.clc = null; + this._wrapApp = wrapApp; // make sure to ignore extra popState in safari on navigating + // back from external site + + this.isSsr = true; + this.isFallback = isFallback; + this.isReady = !!(self.__NEXT_DATA__.gssp || self.__NEXT_DATA__.gip || !autoExportDynamic && !self.location.search); + this.isPreview = !!isPreview; + this.isLocaleDomain = false; + + if (false) {} + + if (true) { + // make sure "as" doesn't start with double slashes or else it can + // throw an error as it's considered invalid + if (_as.substr(0, 2) !== '//') { + // in order for `e.state` to work on the `onpopstate` event + // we have to register the initial route upon initialization + this.changeState('replaceState', (0, _utils.formatWithValidation)({ + pathname: addBasePath(_pathname), + query: _query + }), (0, _utils.getURL)(), { + locale: locale + }); + } + + window.addEventListener('popstate', this.onPopState); // enable custom scroll restoration handling when available + // otherwise fallback to browser's default handling + + if (false) {} + } + } + + _createClass(Router, [{ + key: "reload", + value: function reload() { + window.location.reload(); + } + /** + * Go back in history + */ + + }, { + key: "back", + value: function back() { + window.history.back(); + } + /** + * Performs a `pushState` with arguments + * @param url of the route + * @param as masks `url` for the browser + * @param options object you can define `shallow` and other options + */ + + }, { + key: "push", + value: function push(url, as) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (false) {} + + ; + + var _prepareUrlAs = prepareUrlAs(this, url, as); + + url = _prepareUrlAs.url; + as = _prepareUrlAs.as; + return this.change('pushState', url, as, options); + } + /** + * Performs a `replaceState` with arguments + * @param url of the route + * @param as masks `url` for the browser + * @param options object you can define `shallow` and other options + */ + + }, { + key: "replace", + value: function replace(url, as) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + ; + + var _prepareUrlAs2 = prepareUrlAs(this, url, as); + + url = _prepareUrlAs2.url; + as = _prepareUrlAs2.as; + return this.change('replaceState', url, as, options); + } + }, { + key: "change", + value: function () { + var _change = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, url, as, options, forcedScroll) { + var _options$scroll, localeChange, parsedAs, localePathResult, didNavigate, _this$locales, detectedDomain, asNoBasePath, _options$shallow, shallow, routeProps, cleanedAs, parsed, pathname, query, pages, rewrites, _yield, resolvedAs, rewritesResult, route, _parsedAs, asPathname, routeRegex, routeMatch, shouldInterpolate, interpolatedAs, missingParams, _self$__NEXT_DATA__$p, _self$__NEXT_DATA__$p2, routeInfo, _routeInfo, error, props, __N_SSG, __N_SSP, destination, parsedHref, _prepareUrlAs3, newUrl, newAs, notFoundRoute, appComp, isValidShallowRoute; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (isLocalURL(url)) { + _context.next = 3; + break; + } + + window.location.href = url; + return _context.abrupt("return", false); + + case 3: + // for static pages with query params in the URL we delay + // marking the router ready until after the query is updated + if (options._h) { + this.isReady = true; + } // Default to scroll reset behavior unless explicitly specified to be + // `false`! This makes the behavior between using `Router#push` and a + // `<Link />` consistent. + + + options.scroll = !!((_options$scroll = options.scroll) != null ? _options$scroll : true); + localeChange = options.locale !== this.locale; + + if (true) { + _context.next = 18; + break; + } + + this.locale = options.locale === false ? this.defaultLocale : options.locale || this.locale; + + if (typeof options.locale === 'undefined') { + options.locale = this.locale; + } + + parsedAs = (0, _parseRelativeUrl.parseRelativeUrl)(hasBasePath(as) ? delBasePath(as) : as); + localePathResult = (0, _normalizeLocalePath.normalizeLocalePath)(parsedAs.pathname, this.locales); + + if (localePathResult.detectedLocale) { + this.locale = localePathResult.detectedLocale; + parsedAs.pathname = addBasePath(parsedAs.pathname); + as = (0, _utils.formatWithValidation)(parsedAs); + url = addBasePath((0, _normalizeLocalePath.normalizeLocalePath)(hasBasePath(url) ? delBasePath(url) : url, this.locales).pathname); + } + + didNavigate = false; // we need to wrap this in the env check again since regenerator runtime + // moves this on its own due to the return + + if (false) {} + + detectedDomain = detectDomainLocale(this.domainLocales, undefined, this.locale); // we need to wrap this in the env check again since regenerator runtime + // moves this on its own due to the return + + if (false) {} + + if (!didNavigate) { + _context.next = 18; + break; + } + + return _context.abrupt("return", new Promise(function () {})); + + case 18: + if (!options._h) { + this.isSsr = false; + } // marking route changes as a navigation start entry + + + if (_utils.ST) { + performance.mark('routeChange'); + } + + _options$shallow = options.shallow, shallow = _options$shallow === void 0 ? false : _options$shallow; + routeProps = { + shallow: shallow + }; + + if (this._inFlightRoute) { + this.abortComponentLoad(this._inFlightRoute, routeProps); + } + + as = addBasePath(addLocale(hasBasePath(as) ? delBasePath(as) : as, options.locale, this.defaultLocale)); + cleanedAs = delLocale(hasBasePath(as) ? delBasePath(as) : as, this.locale); + this._inFlightRoute = as; // If the url change is only related to a hash change + // We should not proceed. We should only change the state. + // WARNING: `_h` is an internal option for handing Next.js client-side + // hydration. Your app should _never_ use this property. It may change at + // any time without notice. + + if (!(!options._h && this.onlyAHashChange(cleanedAs))) { + _context.next = 34; + break; + } + + this.asPath = cleanedAs; + Router.events.emit('hashChangeStart', as, routeProps); // TODO: do we need the resolved href when only a hash change? + + this.changeState(method, url, as, options); + this.scrollToHash(cleanedAs); + this.notify(this.components[this.route], null); + Router.events.emit('hashChangeComplete', as, routeProps); + return _context.abrupt("return", true); + + case 34: + parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url); + pathname = parsed.pathname, query = parsed.query; // The build manifest needs to be loaded before auto-static dynamic pages + // get their query parameters to allow ensuring they can be parsed properly + // when rewritten to + + _context.prev = 36; + _context.next = 39; + return this.pageLoader.getPageList(); + + case 39: + pages = _context.sent; + _context.next = 42; + return (0, _routeLoader.getClientBuildManifest)(); + + case 42: + _yield = _context.sent; + rewrites = _yield.__rewrites; + _context.next = 50; + break; + + case 46: + _context.prev = 46; + _context.t0 = _context["catch"](36); + // If we fail to resolve the page list or client-build manifest, we must + // do a server-side transition: + window.location.href = as; + return _context.abrupt("return", false); + + case 50: + // If asked to change the current URL we should reload the current page + // (not location.reload() but reload getInitialProps and other Next.js stuffs) + // We also need to set the method = replaceState always + // as this should not go into the history (That's how browsers work) + // We should compare the new asPath to the current asPath, not the url + if (!this.urlIsNew(cleanedAs) && !localeChange) { + method = 'replaceState'; + } // we need to resolve the as value using rewrites for dynamic SSG + // pages to allow building the data URL correctly + + + resolvedAs = as; // url and as should always be prefixed with basePath by this + // point by either next/link or router.push/replace so strip the + // basePath from the pathname to match the pages dir 1-to-1 + + pathname = pathname ? (0, _normalizeTrailingSlash.removePathTrailingSlash)(delBasePath(pathname)) : pathname; + + if (pathname !== '/_error') { + if (false) {} else { + parsed.pathname = resolveDynamicRoute(pathname, pages); + + if (parsed.pathname !== pathname) { + pathname = parsed.pathname; + url = (0, _utils.formatWithValidation)(parsed); + } + } + } + + route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname); + + if (isLocalURL(as)) { + _context.next = 60; + break; + } + + if (false) {} + + throw new Error("Invalid href: \"".concat(url, "\" and as: \"").concat(as, "\", received relative href and external as") + "\nSee more info: https://nextjs.org/docs/messages/invalid-relative-url-external-as"); + + case 58: + window.location.href = as; + return _context.abrupt("return", false); + + case 60: + resolvedAs = delLocale(delBasePath(resolvedAs), this.locale); + + if (!(0, _isDynamic.isDynamicRoute)(route)) { + _context.next = 76; + break; + } + + _parsedAs = (0, _parseRelativeUrl.parseRelativeUrl)(resolvedAs); + asPathname = _parsedAs.pathname; + routeRegex = (0, _routeRegex.getRouteRegex)(route); + routeMatch = (0, _routeMatcher.getRouteMatcher)(routeRegex)(asPathname); + shouldInterpolate = route === asPathname; + interpolatedAs = shouldInterpolate ? interpolateAs(route, asPathname, query) : {}; + + if (!(!routeMatch || shouldInterpolate && !interpolatedAs.result)) { + _context.next = 75; + break; + } + + missingParams = Object.keys(routeRegex.groups).filter(function (param) { + return !query[param]; + }); + + if (!(missingParams.length > 0)) { + _context.next = 73; + break; + } + + if (true) { + console.warn("".concat(shouldInterpolate ? "Interpolating href" : "Mismatching `as` and `href`", " failed to manually provide ") + "the params: ".concat(missingParams.join(', '), " in the `href`'s `query`")); + } + + throw new Error((shouldInterpolate ? "The provided `href` (".concat(url, ") value is missing query values (").concat(missingParams.join(', '), ") to be interpolated properly. ") : "The provided `as` value (".concat(asPathname, ") is incompatible with the `href` value (").concat(route, "). ")) + "Read more: https://nextjs.org/docs/messages/".concat(shouldInterpolate ? 'href-interpolation-failed' : 'incompatible-href-as')); + + case 73: + _context.next = 76; + break; + + case 75: + if (shouldInterpolate) { + as = (0, _utils.formatWithValidation)(Object.assign({}, _parsedAs, { + pathname: interpolatedAs.result, + query: omitParmsFromQuery(query, interpolatedAs.params) + })); + } else { + // Merge params into `query`, overwriting any specified in search + Object.assign(query, routeMatch); + } + + case 76: + Router.events.emit('routeChangeStart', as, routeProps); + _context.prev = 77; + _context.next = 80; + return this.getRouteInfo(route, pathname, query, as, resolvedAs, routeProps); + + case 80: + routeInfo = _context.sent; + _routeInfo = routeInfo, error = _routeInfo.error, props = _routeInfo.props, __N_SSG = _routeInfo.__N_SSG, __N_SSP = _routeInfo.__N_SSP; // handle redirect on client-transition + + if (!((__N_SSG || __N_SSP) && props)) { + _context.next = 107; + break; + } + + if (!(props.pageProps && props.pageProps.__N_REDIRECT)) { + _context.next = 93; + break; + } + + destination = props.pageProps.__N_REDIRECT; // check if destination is internal (resolves to a page) and attempt + // client-navigation if it is falling back to hard navigation if + // it's not + + if (!destination.startsWith('/')) { + _context.next = 91; + break; + } + + parsedHref = (0, _parseRelativeUrl.parseRelativeUrl)(destination); + parsedHref.pathname = resolveDynamicRoute(parsedHref.pathname, pages); + + if (!pages.includes(parsedHref.pathname)) { + _context.next = 91; + break; + } + + _prepareUrlAs3 = prepareUrlAs(this, destination, destination), newUrl = _prepareUrlAs3.url, newAs = _prepareUrlAs3.as; + return _context.abrupt("return", this.change(method, newUrl, newAs, options)); + + case 91: + window.location.href = destination; + return _context.abrupt("return", new Promise(function () {})); + + case 93: + this.isPreview = !!props.__N_PREVIEW; // handle SSG data 404 + + if (!(props.notFound === SSG_DATA_NOT_FOUND)) { + _context.next = 107; + break; + } + + _context.prev = 95; + _context.next = 98; + return this.fetchComponent('/404'); + + case 98: + notFoundRoute = '/404'; + _context.next = 104; + break; + + case 101: + _context.prev = 101; + _context.t1 = _context["catch"](95); + notFoundRoute = '/_error'; + + case 104: + _context.next = 106; + return this.getRouteInfo(notFoundRoute, notFoundRoute, query, as, resolvedAs, { + shallow: false + }); + + case 106: + routeInfo = _context.sent; + + case 107: + Router.events.emit('beforeHistoryChange', as, routeProps); + this.changeState(method, url, as, options); + + if (true) { + appComp = this.components['/_app'].Component; + window.next.isPrerendered = appComp.getInitialProps === appComp.origGetInitialProps && !routeInfo.Component.getInitialProps; + } // shallow routing is only allowed for same page URL changes. + + + isValidShallowRoute = options.shallow && this.route === route; + + if (options._h && pathname === '/_error' && ((_self$__NEXT_DATA__$p = self.__NEXT_DATA__.props) == null ? void 0 : (_self$__NEXT_DATA__$p2 = _self$__NEXT_DATA__$p.pageProps) == null ? void 0 : _self$__NEXT_DATA__$p2.statusCode) === 500 && props != null && props.pageProps) { + // ensure statusCode is still correct for static 500 page + // when updating query information + props.pageProps.statusCode = 500; + } + + _context.next = 114; + return this.set(route, pathname, query, cleanedAs, routeInfo, forcedScroll || (isValidShallowRoute || !options.scroll ? null : { + x: 0, + y: 0 + }))["catch"](function (e) { + if (e.cancelled) error = error || e;else throw e; + }); + + case 114: + if (!error) { + _context.next = 117; + break; + } + + Router.events.emit('routeChangeError', error, cleanedAs, routeProps); + throw error; + + case 117: + if (false) {} + + Router.events.emit('routeChangeComplete', as, routeProps); + return _context.abrupt("return", true); + + case 122: + _context.prev = 122; + _context.t2 = _context["catch"](77); + + if (!_context.t2.cancelled) { + _context.next = 126; + break; + } + + return _context.abrupt("return", false); + + case 126: + throw _context.t2; + + case 127: + case "end": + return _context.stop(); + } + } + }, _callee, this, [[36, 46], [77, 122], [95, 101]]); + })); + + function change(_x, _x2, _x3, _x4, _x5) { + return _change.apply(this, arguments); + } + + return change; + }() + }, { + key: "changeState", + value: function changeState(method, url, as) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (true) { + if (typeof window.history === 'undefined') { + console.error("Warning: window.history is not available."); + return; + } + + if (typeof window.history[method] === 'undefined') { + console.error("Warning: window.history.".concat(method, " is not available")); + return; + } + } + + if (method !== 'pushState' || (0, _utils.getURL)() !== as) { + this._shallow = options.shallow; + window.history[method]({ + url: url, + as: as, + options: options, + __N: true, + idx: this._idx = method !== 'pushState' ? this._idx : this._idx + 1 + }, // Most browsers currently ignores this parameter, although they may use it in the future. + // Passing the empty string here should be safe against future changes to the method. + // https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState + '', as); + } + } + }, { + key: "handleRouteInfoError", + value: function () { + var _handleRouteInfoError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(err, pathname, query, as, routeProps, loadErrorFail) { + var Component, styleSheets, props, _yield$this$fetchComp, routeInfo; + + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!err.cancelled) { + _context2.next = 2; + break; + } + + throw err; + + case 2: + if (!((0, _routeLoader.isAssetError)(err) || loadErrorFail)) { + _context2.next = 6; + break; + } + + Router.events.emit('routeChangeError', err, as, routeProps); // If we can't load the page it could be one of following reasons + // 1. Page doesn't exists + // 2. Page does exist in a different zone + // 3. Internal error while loading the page + // So, doing a hard reload is the proper way to deal with this. + + window.location.href = as; // Changing the URL doesn't block executing the current code path. + // So let's throw a cancellation error stop the routing logic. + + throw buildCancellationError(); + + case 6: + _context2.prev = 6; + + if (!(typeof Component === 'undefined' || typeof styleSheets === 'undefined')) { + _context2.next = 14; + break; + } + + ; + _context2.next = 11; + return this.fetchComponent('/_error'); + + case 11: + _yield$this$fetchComp = _context2.sent; + Component = _yield$this$fetchComp.page; + styleSheets = _yield$this$fetchComp.styleSheets; + + case 14: + routeInfo = { + props: props, + Component: Component, + styleSheets: styleSheets, + err: err, + error: err + }; + + if (routeInfo.props) { + _context2.next = 26; + break; + } + + _context2.prev = 16; + _context2.next = 19; + return this.getInitialProps(Component, { + err: err, + pathname: pathname, + query: query + }); + + case 19: + routeInfo.props = _context2.sent; + _context2.next = 26; + break; + + case 22: + _context2.prev = 22; + _context2.t0 = _context2["catch"](16); + console.error('Error in error page `getInitialProps`: ', _context2.t0); + routeInfo.props = {}; + + case 26: + return _context2.abrupt("return", routeInfo); + + case 29: + _context2.prev = 29; + _context2.t1 = _context2["catch"](6); + return _context2.abrupt("return", this.handleRouteInfoError(_context2.t1, pathname, query, as, routeProps, true)); + + case 32: + case "end": + return _context2.stop(); + } + } + }, _callee2, this, [[6, 29], [16, 22]]); + })); + + function handleRouteInfoError(_x6, _x7, _x8, _x9, _x10, _x11) { + return _handleRouteInfoError.apply(this, arguments); + } + + return handleRouteInfoError; + }() + }, { + key: "getRouteInfo", + value: function () { + var _getRouteInfo = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(route, pathname, query, as, resolvedAs, routeProps) { + var _this2 = this; + + var existingRouteInfo, cachedRouteInfo, routeInfo, Component, __N_SSG, __N_SSP, _require, isValidElementType, dataHref, props; + + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.prev = 0; + existingRouteInfo = this.components[route]; + + if (!(routeProps.shallow && existingRouteInfo && this.route === route)) { + _context3.next = 4; + break; + } + + return _context3.abrupt("return", existingRouteInfo); + + case 4: + cachedRouteInfo = existingRouteInfo && 'initial' in existingRouteInfo ? undefined : existingRouteInfo; + + if (!cachedRouteInfo) { + _context3.next = 9; + break; + } + + _context3.t0 = cachedRouteInfo; + _context3.next = 12; + break; + + case 9: + _context3.next = 11; + return this.fetchComponent(route).then(function (res) { + return { + Component: res.page, + styleSheets: res.styleSheets, + __N_SSG: res.mod.__N_SSG, + __N_SSP: res.mod.__N_SSP + }; + }); + + case 11: + _context3.t0 = _context3.sent; + + case 12: + routeInfo = _context3.t0; + Component = routeInfo.Component, __N_SSG = routeInfo.__N_SSG, __N_SSP = routeInfo.__N_SSP; + + if (false) {} + + _require = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"), isValidElementType = _require.isValidElementType; + + if (isValidElementType(Component)) { + _context3.next = 18; + break; + } + + throw new Error("The default export is not a React Component in page: \"".concat(pathname, "\"")); + + case 18: + if (__N_SSG || __N_SSP) { + dataHref = this.pageLoader.getDataHref((0, _utils.formatWithValidation)({ + pathname: pathname, + query: query + }), resolvedAs, __N_SSG, this.locale); + } + + _context3.next = 21; + return this._getData(function () { + return __N_SSG ? _this2._getStaticData(dataHref) : __N_SSP ? _this2._getServerData(dataHref) : _this2.getInitialProps(Component, // we provide AppTree later so this needs to be `any` + { + pathname: pathname, + query: query, + asPath: as + }); + }); + + case 21: + props = _context3.sent; + routeInfo.props = props; + this.components[route] = routeInfo; + return _context3.abrupt("return", routeInfo); + + case 27: + _context3.prev = 27; + _context3.t1 = _context3["catch"](0); + return _context3.abrupt("return", this.handleRouteInfoError(_context3.t1, pathname, query, as, routeProps)); + + case 30: + case "end": + return _context3.stop(); + } + } + }, _callee3, this, [[0, 27]]); + })); + + function getRouteInfo(_x12, _x13, _x14, _x15, _x16, _x17) { + return _getRouteInfo.apply(this, arguments); + } + + return getRouteInfo; + }() + }, { + key: "set", + value: function set(route, pathname, query, as, data, resetScroll) { + this.isFallback = false; + this.route = route; + this.pathname = pathname; + this.query = query; + this.asPath = as; + return this.notify(data, resetScroll); + } + /** + * Callback to execute before replacing router state + * @param cb callback to be executed + */ + + }, { + key: "beforePopState", + value: function beforePopState(cb) { + this._bps = cb; + } + }, { + key: "onlyAHashChange", + value: function onlyAHashChange(as) { + if (!this.asPath) return false; + + var _this$asPath$split = this.asPath.split('#'), + _this$asPath$split2 = _slicedToArray(_this$asPath$split, 2), + oldUrlNoHash = _this$asPath$split2[0], + oldHash = _this$asPath$split2[1]; + + var _as$split = as.split('#'), + _as$split2 = _slicedToArray(_as$split, 2), + newUrlNoHash = _as$split2[0], + newHash = _as$split2[1]; // Makes sure we scroll to the provided hash if the url/hash are the same + + + if (newHash && oldUrlNoHash === newUrlNoHash && oldHash === newHash) { + return true; + } // If the urls are change, there's more than a hash change + + + if (oldUrlNoHash !== newUrlNoHash) { + return false; + } // If the hash has changed, then it's a hash only change. + // This check is necessary to handle both the enter and + // leave hash === '' cases. The identity case falls through + // and is treated as a next reload. + + + return oldHash !== newHash; + } + }, { + key: "scrollToHash", + value: function scrollToHash(as) { + var _as$split3 = as.split('#'), + _as$split4 = _slicedToArray(_as$split3, 2), + hash = _as$split4[1]; // Scroll to top if the hash is just `#` with no value or `#top` + // To mirror browsers + + + if (hash === '' || hash === 'top') { + window.scrollTo(0, 0); + return; + } // First we check if the element by id is found + + + var idEl = document.getElementById(hash); + + if (idEl) { + idEl.scrollIntoView(); + return; + } // If there's no element with the id, we check the `name` property + // To mirror browsers + + + var nameEl = document.getElementsByName(hash)[0]; + + if (nameEl) { + nameEl.scrollIntoView(); + } + } + }, { + key: "urlIsNew", + value: function urlIsNew(asPath) { + return this.asPath !== asPath; + } + /** + * Prefetch page code, you may wait for the data during page rendering. + * This feature only works in production! + * @param url the href of prefetched page + * @param asPath the as path of the prefetched page + */ + + }, { + key: "prefetch", + value: function () { + var _prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(url) { + var _this3 = this; + + var asPath, + options, + parsed, + pathname, + parsedAs, + localePathResult, + pages, + resolvedAs, + rewrites, + _yield2, + rewritesResult, + route, + _args4 = arguments; + + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + asPath = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : url; + options = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : {}; + parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url); + pathname = parsed.pathname; + + if (false) {} + + _context4.next = 7; + return this.pageLoader.getPageList(); + + case 7: + pages = _context4.sent; + resolvedAs = asPath; + + if (true) { + _context4.next = 19; + break; + } + + _context4.next = 12; + return (0, _routeLoader.getClientBuildManifest)(); + + case 12: + _yield2 = _context4.sent; + rewrites = _yield2.__rewrites; + rewritesResult = (0, _resolveRewrites["default"])(addBasePath(addLocale(asPath, this.locale)), pages, rewrites, parsed.query, function (p) { + return resolveDynamicRoute(p, pages); + }, this.locales); + resolvedAs = delLocale(delBasePath(rewritesResult.asPath), this.locale); + + if (rewritesResult.matchedPage && rewritesResult.resolvedHref) { + // if this directly matches a page we need to update the href to + // allow the correct page chunk to be loaded + pathname = rewritesResult.resolvedHref; + parsed.pathname = pathname; + url = (0, _utils.formatWithValidation)(parsed); + } + + _context4.next = 21; + break; + + case 19: + parsed.pathname = resolveDynamicRoute(parsed.pathname, pages); + + if (parsed.pathname !== pathname) { + pathname = parsed.pathname; + url = (0, _utils.formatWithValidation)(parsed); + } + + case 21: + route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname); // Prefetch is not supported in development mode because it would trigger on-demand-entries + + if (false) {} + + return _context4.abrupt("return"); + + case 24: + _context4.next = 26; + return Promise.all([this.pageLoader._isSsg(route).then(function (isSsg) { + return isSsg ? _this3._getStaticData(_this3.pageLoader.getDataHref(url, resolvedAs, true, typeof options.locale !== 'undefined' ? options.locale : _this3.locale)) : false; + }), this.pageLoader[options.priority ? 'loadPage' : 'prefetch'](route)]); + + case 26: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function prefetch(_x18) { + return _prefetch.apply(this, arguments); + } + + return prefetch; + }() + }, { + key: "fetchComponent", + value: function () { + var _fetchComponent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(route) { + var cancelled, cancel, componentResult, error; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + cancelled = false; + + cancel = this.clc = function () { + cancelled = true; + }; + + _context5.next = 4; + return this.pageLoader.loadPage(route); + + case 4: + componentResult = _context5.sent; + + if (!cancelled) { + _context5.next = 9; + break; + } + + error = new Error("Abort fetching component for route: \"".concat(route, "\"")); + error.cancelled = true; + throw error; + + case 9: + if (cancel === this.clc) { + this.clc = null; + } + + return _context5.abrupt("return", componentResult); + + case 11: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function fetchComponent(_x19) { + return _fetchComponent.apply(this, arguments); + } + + return fetchComponent; + }() + }, { + key: "_getData", + value: function _getData(fn) { + var _this4 = this; + + var cancelled = false; + + var cancel = function cancel() { + cancelled = true; + }; + + this.clc = cancel; + return fn().then(function (data) { + if (cancel === _this4.clc) { + _this4.clc = null; + } + + if (cancelled) { + var err = new Error('Loading initial props cancelled'); + err.cancelled = true; + throw err; + } + + return data; + }); + } + }, { + key: "_getStaticData", + value: function _getStaticData(dataHref) { + var _this5 = this; + + var _URL = new URL(dataHref, window.location.href), + cacheKey = _URL.href; + + if (false) {} + + return fetchNextData(dataHref, this.isSsr).then(function (data) { + _this5.sdc[cacheKey] = data; + return data; + }); + } + }, { + key: "_getServerData", + value: function _getServerData(dataHref) { + var _this6 = this; + + var _URL2 = new URL(dataHref, window.location.href), + resourceKey = _URL2.href; + + if (this.sdr[resourceKey]) { + return this.sdr[resourceKey]; + } + + return this.sdr[resourceKey] = fetchNextData(dataHref, this.isSsr).then(function (data) { + delete _this6.sdr[resourceKey]; + return data; + })["catch"](function (err) { + delete _this6.sdr[resourceKey]; + throw err; + }); + } + }, { + key: "getInitialProps", + value: function getInitialProps(Component, ctx) { + var App = this.components['/_app'].Component; + + var AppTree = this._wrapApp(App); + + ctx.AppTree = AppTree; + return (0, _utils.loadGetInitialProps)(App, { + AppTree: AppTree, + Component: Component, + router: this, + ctx: ctx + }); + } + }, { + key: "abortComponentLoad", + value: function abortComponentLoad(as, routeProps) { + if (this.clc) { + Router.events.emit('routeChangeError', buildCancellationError(), as, routeProps); + this.clc(); + this.clc = null; + } + } + }, { + key: "notify", + value: function notify(data, resetScroll) { + return this.sub(data, this.components['/_app'].Component, resetScroll); + } + }]); + + return Router; +}(); + +exports["default"] = Router; +Router.events = (0, _mitt["default"])(); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/format-url.js": +/*!***************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/format-url.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.formatUrl = formatUrl; + +var querystring = _interopRequireWildcard(__webpack_require__(/*! ./querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js")); + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || typeof obj !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} // Format function modified from nodejs +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + + +var slashedProtocols = /https?|ftp|gopher|file/; + +function formatUrl(urlObj) { + var auth = urlObj.auth, + hostname = urlObj.hostname; + var protocol = urlObj.protocol || ''; + var pathname = urlObj.pathname || ''; + var hash = urlObj.hash || ''; + var query = urlObj.query || ''; + var host = false; + auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : ''; + + if (urlObj.host) { + host = auth + urlObj.host; + } else if (hostname) { + host = auth + (~hostname.indexOf(':') ? "[".concat(hostname, "]") : hostname); + + if (urlObj.port) { + host += ':' + urlObj.port; + } + } + + if (query && typeof query === 'object') { + query = String(querystring.urlQueryToSearchParams(query)); + } + + var search = urlObj.search || query && "?".concat(query) || ''; + if (protocol && protocol.substr(-1) !== ':') protocol += ':'; + + if (urlObj.slashes || (!protocol || slashedProtocols.test(protocol)) && host !== false) { + host = '//' + (host || ''); + if (pathname && pathname[0] !== '/') pathname = '/' + pathname; + } else if (!host) { + host = ''; + } + + if (hash && hash[0] !== '#') hash = '#' + hash; + if (search && search[0] !== '?') search = '?' + search; + pathname = pathname.replace(/[?#]/g, encodeURIComponent); + search = search.replace('#', '%23'); + return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = getAssetPathFromRoute; // Translates a logical route into its pages asset path (relative from a common prefix) +// "asset path" being its javascript file, data file, prerendered html,... + +function getAssetPathFromRoute(route) { + var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var path = route === '/' ? '/index' : /^\/index(\/|$)/.test(route) ? "/index".concat(route) : "".concat(route); + return path + ext; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js": +/*!***************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.isDynamicRoute = isDynamicRoute; // Identify /[param]/ in route string + +var TEST_ROUTE = /\/\[[^/]+?\](?=\/|$)/; + +function isDynamicRoute(route) { + return TEST_ROUTE.test(route); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.parseRelativeUrl = parseRelativeUrl; + +var _utils = __webpack_require__(/*! ../../utils */ "./node_modules/next/dist/next-server/lib/utils.js"); + +var _querystring = __webpack_require__(/*! ./querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js"); +/** +* Parses path-relative urls (e.g. `/hello/world?foo=bar`). If url isn't path-relative +* (e.g. `./hello`) then at least base must be. +* Absolute urls are rejected with one exception, in the browser, absolute urls that are on +* the current origin will be parsed as relative +*/ + + +function parseRelativeUrl(url, base) { + var globalBase = new URL(false ? undefined : (0, _utils.getLocationOrigin)()); + var resolvedBase = base ? new URL(base, globalBase) : globalBase; + + var _URL = new URL(url, resolvedBase), + pathname = _URL.pathname, + searchParams = _URL.searchParams, + search = _URL.search, + hash = _URL.hash, + href = _URL.href, + origin = _URL.origin; + + if (origin !== globalBase.origin) { + throw new Error("invariant: invalid relative URL, router received ".concat(url)); + } + + return { + pathname: pathname, + query: (0, _querystring.searchParamsToUrlQuery)(searchParams), + search: search, + hash: hash, + href: href.slice(globalBase.origin.length) + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/querystring.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +exports.__esModule = true; +exports.searchParamsToUrlQuery = searchParamsToUrlQuery; +exports.urlQueryToSearchParams = urlQueryToSearchParams; +exports.assign = assign; + +function searchParamsToUrlQuery(searchParams) { + var query = {}; + searchParams.forEach(function (value, key) { + if (typeof query[key] === 'undefined') { + query[key] = value; + } else if (Array.isArray(query[key])) { + ; + query[key].push(value); + } else { + query[key] = [query[key], value]; + } + }); + return query; +} + +function stringifyUrlQueryParam(param) { + if (typeof param === 'string' || typeof param === 'number' && !isNaN(param) || typeof param === 'boolean') { + return String(param); + } else { + return ''; + } +} + +function urlQueryToSearchParams(urlQuery) { + var result = new URLSearchParams(); + Object.entries(urlQuery).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + if (Array.isArray(value)) { + value.forEach(function (item) { + return result.append(key, stringifyUrlQueryParam(item)); + }); + } else { + result.set(key, stringifyUrlQueryParam(value)); + } + }); + return result; +} + +function assign(target) { + for (var _len = arguments.length, searchParamsList = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + searchParamsList[_key - 1] = arguments[_key]; + } + + searchParamsList.forEach(function (searchParams) { + Array.from(searchParams.keys()).forEach(function (key) { + return target["delete"](key); + }); + searchParams.forEach(function (value, key) { + return target.append(key, value); + }); + }); + return target; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/resolve-rewrites-noop.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/resolve-rewrites-noop.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = resolveRewrites; + +function resolveRewrites() {} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/route-matcher.js": +/*!******************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/route-matcher.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.getRouteMatcher = getRouteMatcher; + +function getRouteMatcher(routeRegex) { + var re = routeRegex.re, + groups = routeRegex.groups; + return function (pathname) { + var routeMatch = re.exec(pathname); + + if (!routeMatch) { + return false; + } + + var decode = function decode(param) { + try { + return decodeURIComponent(param); + } catch (_) { + var err = new Error('failed to decode param'); + err.code = 'DECODE_FAILED'; + throw err; + } + }; + + var params = {}; + Object.keys(groups).forEach(function (slugName) { + var g = groups[slugName]; + var m = routeMatch[g.pos]; + + if (m !== undefined) { + params[slugName] = ~m.indexOf('/') ? m.split('/').map(function (entry) { + return decode(entry); + }) : g.repeat ? [decode(m)] : decode(m); + } + }); + return params; + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/route-regex.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/route-regex.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.getRouteRegex = getRouteRegex; // this isn't importing the escape-string-regex module +// to reduce bytes + +function escapeRegex(str) { + return str.replace(/[|\\{}()[\]^$+*?.-]/g, '\\$&'); +} + +function parseParameter(param) { + var optional = param.startsWith('[') && param.endsWith(']'); + + if (optional) { + param = param.slice(1, -1); + } + + var repeat = param.startsWith('...'); + + if (repeat) { + param = param.slice(3); + } + + return { + key: param, + repeat: repeat, + optional: optional + }; +} + +function getRouteRegex(normalizedRoute) { + var segments = (normalizedRoute.replace(/\/$/, '') || '/').slice(1).split('/'); + var groups = {}; + var groupIndex = 1; + var parameterizedRoute = segments.map(function (segment) { + if (segment.startsWith('[') && segment.endsWith(']')) { + var _parseParameter = parseParameter(segment.slice(1, -1)), + key = _parseParameter.key, + optional = _parseParameter.optional, + repeat = _parseParameter.repeat; + + groups[key] = { + pos: groupIndex++, + repeat: repeat, + optional: optional + }; + return repeat ? optional ? '(?:/(.+?))?' : '/(.+?)' : '/([^/]+?)'; + } else { + return "/".concat(escapeRegex(segment)); + } + }).join(''); // dead code eliminate for browser since it's only needed + // while generating routes-manifest + + if (false) { var namedParameterizedRoute, routeKeys, getSafeRouteKey, routeKeyCharLength, routeKeyCharCode; } + + return { + re: new RegExp("^".concat(parameterizedRoute, "(?:/)?$")), + groups: groups + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/runtime-config.js": +/*!******************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/runtime-config.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.setConfig = setConfig; +exports["default"] = void 0; +var runtimeConfig; + +var _default = function _default() { + return runtimeConfig; +}; + +exports["default"] = _default; + +function setConfig(configValue) { + runtimeConfig = configValue; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/utils.js": +/*!*********************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/utils.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +exports.__esModule = true; +exports.execOnce = execOnce; +exports.getLocationOrigin = getLocationOrigin; +exports.getURL = getURL; +exports.getDisplayName = getDisplayName; +exports.isResSent = isResSent; +exports.loadGetInitialProps = loadGetInitialProps; +exports.formatWithValidation = formatWithValidation; +exports.ST = exports.SP = exports.urlObjectKeys = void 0; + +var _formatUrl = __webpack_require__(/*! ./router/utils/format-url */ "./node_modules/next/dist/next-server/lib/router/utils/format-url.js"); +/** +* Utils +*/ + + +function execOnce(fn) { + var used = false; + var result; + return function () { + if (!used) { + used = true; + result = fn.apply(void 0, arguments); + } + + return result; + }; +} + +function getLocationOrigin() { + var _window$location = window.location, + protocol = _window$location.protocol, + hostname = _window$location.hostname, + port = _window$location.port; + return "".concat(protocol, "//").concat(hostname).concat(port ? ':' + port : ''); +} + +function getURL() { + var href = window.location.href; + var origin = getLocationOrigin(); + return href.substring(origin.length); +} + +function getDisplayName(Component) { + return typeof Component === 'string' ? Component : Component.displayName || Component.name || 'Unknown'; +} + +function isResSent(res) { + return res.finished || res.headersSent; +} + +function loadGetInitialProps(_x, _x2) { + return _loadGetInitialProps.apply(this, arguments); +} + +function _loadGetInitialProps() { + _loadGetInitialProps = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(App, ctx) { + var _App$prototype, message, res, props, _message; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (false) {} + + if (!((_App$prototype = App.prototype) != null && _App$prototype.getInitialProps)) { + _context.next = 4; + break; + } + + message = "\"".concat(getDisplayName(App), ".getInitialProps()\" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information."); + throw new Error(message); + + case 4: + // when called from _app `ctx` is nested in `ctx` + res = ctx.res || ctx.ctx && ctx.ctx.res; + + if (App.getInitialProps) { + _context.next = 12; + break; + } + + if (!(ctx.ctx && ctx.Component)) { + _context.next = 11; + break; + } + + _context.next = 9; + return loadGetInitialProps(ctx.Component, ctx.ctx); + + case 9: + _context.t0 = _context.sent; + return _context.abrupt("return", { + pageProps: _context.t0 + }); + + case 11: + return _context.abrupt("return", {}); + + case 12: + _context.next = 14; + return App.getInitialProps(ctx); + + case 14: + props = _context.sent; + + if (!(res && isResSent(res))) { + _context.next = 17; + break; + } + + return _context.abrupt("return", props); + + case 17: + if (props) { + _context.next = 20; + break; + } + + _message = "\"".concat(getDisplayName(App), ".getInitialProps()\" should resolve to an object. But found \"").concat(props, "\" instead."); + throw new Error(_message); + + case 20: + if (true) { + if (Object.keys(props).length === 0 && !ctx.ctx) { + console.warn("".concat(getDisplayName(App), " returned an empty object from `getInitialProps`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps")); + } + } + + return _context.abrupt("return", props); + + case 22: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + return _loadGetInitialProps.apply(this, arguments); +} + +var urlObjectKeys = ['auth', 'hash', 'host', 'hostname', 'href', 'path', 'pathname', 'port', 'protocol', 'query', 'search', 'slashes']; +exports.urlObjectKeys = urlObjectKeys; + +function formatWithValidation(url) { + if (true) { + if (url !== null && typeof url === 'object') { + Object.keys(url).forEach(function (key) { + if (urlObjectKeys.indexOf(key) === -1) { + console.warn("Unknown key passed via urlObject into url.format: ".concat(key)); + } + }); + } + } + + return (0, _formatUrl.formatUrl)(url); +} + +var SP = typeof performance !== 'undefined'; +exports.SP = SP; +var ST = SP && typeof performance.mark === 'function' && typeof performance.measure === 'function'; +exports.ST = ST; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/server/denormalize-page-path.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/server/denormalize-page-path.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +exports.__esModule=true;exports.normalizePathSep=normalizePathSep;exports.denormalizePagePath=denormalizePagePath;function normalizePathSep(path){return path.replace(/\\/g,'/');}function denormalizePagePath(page){page=normalizePathSep(page);if(page.startsWith('/index/')){page=page.slice(6);}else if(page==='/index'){page='/';}return page;} +//# sourceMappingURL=denormalize-page-path.js.map + +/***/ }), + +/***/ "./node_modules/next/router.js": +/*!*************************************!*\ + !*** ./node_modules/next/router.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./dist/client/router */ "./node_modules/next/dist/client/router.js") + + +/***/ }), + +/***/ "./node_modules/platform/platform.js": +/*!*******************************************!*\ + !*** ./node_modules/platform/platform.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! + * Platform.js v1.3.6 + * Copyright 2014-2020 Benjamin Tan + * Copyright 2011-2013 John-David Dalton + * Available under MIT license + */ +;(function() { + 'use strict'; + + /** Used to determine if values are of the language type `Object`. */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used as a reference to the global object. */ + var root = (objectTypes[typeof window] && window) || this; + + /** Backup possible global object. */ + var oldRoot = root; + + /** Detect free variable `exports`. */ + var freeExports = objectTypes[typeof exports] && exports; + + /** Detect free variable `module`. */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { + root = freeGlobal; + } + + /** + * Used as the maximum length of an array-like object. + * See the [ES6 spec](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength) + * for more details. + */ + var maxSafeInteger = Math.pow(2, 53) - 1; + + /** Regular expression to detect Opera. */ + var reOpera = /\bOpera/; + + /** Possible global object. */ + var thisBinding = this; + + /** Used for native method references. */ + var objectProto = Object.prototype; + + /** Used to check for own properties of an object. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to resolve the internal `[[Class]]` of values. */ + var toString = objectProto.toString; + + /*--------------------------------------------------------------------------*/ + + /** + * Capitalizes a string value. + * + * @private + * @param {string} string The string to capitalize. + * @returns {string} The capitalized string. + */ + function capitalize(string) { + string = String(string); + return string.charAt(0).toUpperCase() + string.slice(1); + } + + /** + * A utility function to clean up the OS name. + * + * @private + * @param {string} os The OS name to clean up. + * @param {string} [pattern] A `RegExp` pattern matching the OS name. + * @param {string} [label] A label for the OS. + */ + function cleanupOS(os, pattern, label) { + // Platform tokens are defined at: + // http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx + // http://web.archive.org/web/20081122053950/http://msdn.microsoft.com/en-us/library/ms537503(VS.85).aspx + var data = { + '10.0': '10', + '6.4': '10 Technical Preview', + '6.3': '8.1', + '6.2': '8', + '6.1': 'Server 2008 R2 / 7', + '6.0': 'Server 2008 / Vista', + '5.2': 'Server 2003 / XP 64-bit', + '5.1': 'XP', + '5.01': '2000 SP1', + '5.0': '2000', + '4.0': 'NT', + '4.90': 'ME' + }; + // Detect Windows version from platform tokens. + if (pattern && label && /^Win/i.test(os) && !/^Windows Phone /i.test(os) && + (data = data[/[\d.]+$/.exec(os)])) { + os = 'Windows ' + data; + } + // Correct character case and cleanup string. + os = String(os); + + if (pattern && label) { + os = os.replace(RegExp(pattern, 'i'), label); + } + + os = format( + os.replace(/ ce$/i, ' CE') + .replace(/\bhpw/i, 'web') + .replace(/\bMacintosh\b/, 'Mac OS') + .replace(/_PowerPC\b/i, ' OS') + .replace(/\b(OS X) [^ \d]+/i, '$1') + .replace(/\bMac (OS X)\b/, '$1') + .replace(/\/(\d)/, ' $1') + .replace(/_/g, '.') + .replace(/(?: BePC|[ .]*fc[ \d.]+)$/i, '') + .replace(/\bx86\.64\b/gi, 'x86_64') + .replace(/\b(Windows Phone) OS\b/, '$1') + .replace(/\b(Chrome OS \w+) [\d.]+\b/, '$1') + .split(' on ')[0] + ); + + return os; + } + + /** + * An iteration utility for arrays and objects. + * + * @private + * @param {Array|Object} object The object to iterate over. + * @param {Function} callback The function called per iteration. + */ + function each(object, callback) { + var index = -1, + length = object ? object.length : 0; + + if (typeof length == 'number' && length > -1 && length <= maxSafeInteger) { + while (++index < length) { + callback(object[index], index, object); + } + } else { + forOwn(object, callback); + } + } + + /** + * Trim and conditionally capitalize string values. + * + * @private + * @param {string} string The string to format. + * @returns {string} The formatted string. + */ + function format(string) { + string = trim(string); + return /^(?:webOS|i(?:OS|P))/.test(string) + ? string + : capitalize(string); + } + + /** + * Iterates over an object's own properties, executing the `callback` for each. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} callback The function executed per own property. + */ + function forOwn(object, callback) { + for (var key in object) { + if (hasOwnProperty.call(object, key)) { + callback(object[key], key, object); + } + } + } + + /** + * Gets the internal `[[Class]]` of a value. + * + * @private + * @param {*} value The value. + * @returns {string} The `[[Class]]`. + */ + function getClassOf(value) { + return value == null + ? capitalize(value) + : toString.call(value).slice(8, -1); + } + + /** + * Host objects can return type values that are different from their actual + * data type. The objects we are concerned with usually return non-primitive + * types of "object", "function", or "unknown". + * + * @private + * @param {*} object The owner of the property. + * @param {string} property The property to check. + * @returns {boolean} Returns `true` if the property value is a non-primitive, else `false`. + */ + function isHostType(object, property) { + var type = object != null ? typeof object[property] : 'number'; + return !/^(?:boolean|number|string|undefined)$/.test(type) && + (type == 'object' ? !!object[property] : true); + } + + /** + * Prepares a string for use in a `RegExp` by making hyphens and spaces optional. + * + * @private + * @param {string} string The string to qualify. + * @returns {string} The qualified string. + */ + function qualify(string) { + return String(string).replace(/([ -])(?!$)/g, '$1?'); + } + + /** + * A bare-bones `Array#reduce` like utility function. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function called per iteration. + * @returns {*} The accumulated result. + */ + function reduce(array, callback) { + var accumulator = null; + each(array, function(value, index) { + accumulator = callback(accumulator, value, index, array); + }); + return accumulator; + } + + /** + * Removes leading and trailing whitespace from a string. + * + * @private + * @param {string} string The string to trim. + * @returns {string} The trimmed string. + */ + function trim(string) { + return String(string).replace(/^ +| +$/g, ''); + } + + /*--------------------------------------------------------------------------*/ + + /** + * Creates a new platform object. + * + * @memberOf platform + * @param {Object|string} [ua=navigator.userAgent] The user agent string or + * context object. + * @returns {Object} A platform object. + */ + function parse(ua) { + + /** The environment context object. */ + var context = root; + + /** Used to flag when a custom context is provided. */ + var isCustomContext = ua && typeof ua == 'object' && getClassOf(ua) != 'String'; + + // Juggle arguments. + if (isCustomContext) { + context = ua; + ua = null; + } + + /** Browser navigator object. */ + var nav = context.navigator || {}; + + /** Browser user agent string. */ + var userAgent = nav.userAgent || ''; + + ua || (ua = userAgent); + + /** Used to flag when `thisBinding` is the [ModuleScope]. */ + var isModuleScope = isCustomContext || thisBinding == oldRoot; + + /** Used to detect if browser is like Chrome. */ + var likeChrome = isCustomContext + ? !!nav.likeChrome + : /\bChrome\b/.test(ua) && !/internal|\n/i.test(toString.toString()); + + /** Internal `[[Class]]` value shortcuts. */ + var objectClass = 'Object', + airRuntimeClass = isCustomContext ? objectClass : 'ScriptBridgingProxyObject', + enviroClass = isCustomContext ? objectClass : 'Environment', + javaClass = (isCustomContext && context.java) ? 'JavaPackage' : getClassOf(context.java), + phantomClass = isCustomContext ? objectClass : 'RuntimeObject'; + + /** Detect Java environments. */ + var java = /\bJava/.test(javaClass) && context.java; + + /** Detect Rhino. */ + var rhino = java && getClassOf(context.environment) == enviroClass; + + /** A character to represent alpha. */ + var alpha = java ? 'a' : '\u03b1'; + + /** A character to represent beta. */ + var beta = java ? 'b' : '\u03b2'; + + /** Browser document object. */ + var doc = context.document || {}; + + /** + * Detect Opera browser (Presto-based). + * http://www.howtocreate.co.uk/operaStuff/operaObject.html + * http://dev.opera.com/articles/view/opera-mini-web-content-authoring-guidelines/#operamini + */ + var opera = context.operamini || context.opera; + + /** Opera `[[Class]]`. */ + var operaClass = reOpera.test(operaClass = (isCustomContext && opera) ? opera['[[Class]]'] : getClassOf(opera)) + ? operaClass + : (opera = null); + + /*------------------------------------------------------------------------*/ + + /** Temporary variable used over the script's lifetime. */ + var data; + + /** The CPU architecture. */ + var arch = ua; + + /** Platform description array. */ + var description = []; + + /** Platform alpha/beta indicator. */ + var prerelease = null; + + /** A flag to indicate that environment features should be used to resolve the platform. */ + var useFeatures = ua == userAgent; + + /** The browser/environment version. */ + var version = useFeatures && opera && typeof opera.version == 'function' && opera.version(); + + /** A flag to indicate if the OS ends with "/ Version" */ + var isSpecialCasedOS; + + /* Detectable layout engines (order is important). */ + var layout = getLayout([ + { 'label': 'EdgeHTML', 'pattern': 'Edge' }, + 'Trident', + { 'label': 'WebKit', 'pattern': 'AppleWebKit' }, + 'iCab', + 'Presto', + 'NetFront', + 'Tasman', + 'KHTML', + 'Gecko' + ]); + + /* Detectable browser names (order is important). */ + var name = getName([ + 'Adobe AIR', + 'Arora', + 'Avant Browser', + 'Breach', + 'Camino', + 'Electron', + 'Epiphany', + 'Fennec', + 'Flock', + 'Galeon', + 'GreenBrowser', + 'iCab', + 'Iceweasel', + 'K-Meleon', + 'Konqueror', + 'Lunascape', + 'Maxthon', + { 'label': 'Microsoft Edge', 'pattern': '(?:Edge|Edg|EdgA|EdgiOS)' }, + 'Midori', + 'Nook Browser', + 'PaleMoon', + 'PhantomJS', + 'Raven', + 'Rekonq', + 'RockMelt', + { 'label': 'Samsung Internet', 'pattern': 'SamsungBrowser' }, + 'SeaMonkey', + { 'label': 'Silk', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, + 'Sleipnir', + 'SlimBrowser', + { 'label': 'SRWare Iron', 'pattern': 'Iron' }, + 'Sunrise', + 'Swiftfox', + 'Vivaldi', + 'Waterfox', + 'WebPositive', + { 'label': 'Yandex Browser', 'pattern': 'YaBrowser' }, + { 'label': 'UC Browser', 'pattern': 'UCBrowser' }, + 'Opera Mini', + { 'label': 'Opera Mini', 'pattern': 'OPiOS' }, + 'Opera', + { 'label': 'Opera', 'pattern': 'OPR' }, + 'Chromium', + 'Chrome', + { 'label': 'Chrome', 'pattern': '(?:HeadlessChrome)' }, + { 'label': 'Chrome Mobile', 'pattern': '(?:CriOS|CrMo)' }, + { 'label': 'Firefox', 'pattern': '(?:Firefox|Minefield)' }, + { 'label': 'Firefox for iOS', 'pattern': 'FxiOS' }, + { 'label': 'IE', 'pattern': 'IEMobile' }, + { 'label': 'IE', 'pattern': 'MSIE' }, + 'Safari' + ]); + + /* Detectable products (order is important). */ + var product = getProduct([ + { 'label': 'BlackBerry', 'pattern': 'BB10' }, + 'BlackBerry', + { 'label': 'Galaxy S', 'pattern': 'GT-I9000' }, + { 'label': 'Galaxy S2', 'pattern': 'GT-I9100' }, + { 'label': 'Galaxy S3', 'pattern': 'GT-I9300' }, + { 'label': 'Galaxy S4', 'pattern': 'GT-I9500' }, + { 'label': 'Galaxy S5', 'pattern': 'SM-G900' }, + { 'label': 'Galaxy S6', 'pattern': 'SM-G920' }, + { 'label': 'Galaxy S6 Edge', 'pattern': 'SM-G925' }, + { 'label': 'Galaxy S7', 'pattern': 'SM-G930' }, + { 'label': 'Galaxy S7 Edge', 'pattern': 'SM-G935' }, + 'Google TV', + 'Lumia', + 'iPad', + 'iPod', + 'iPhone', + 'Kindle', + { 'label': 'Kindle Fire', 'pattern': '(?:Cloud9|Silk-Accelerated)' }, + 'Nexus', + 'Nook', + 'PlayBook', + 'PlayStation Vita', + 'PlayStation', + 'TouchPad', + 'Transformer', + { 'label': 'Wii U', 'pattern': 'WiiU' }, + 'Wii', + 'Xbox One', + { 'label': 'Xbox 360', 'pattern': 'Xbox' }, + 'Xoom' + ]); + + /* Detectable manufacturers. */ + var manufacturer = getManufacturer({ + 'Apple': { 'iPad': 1, 'iPhone': 1, 'iPod': 1 }, + 'Alcatel': {}, + 'Archos': {}, + 'Amazon': { 'Kindle': 1, 'Kindle Fire': 1 }, + 'Asus': { 'Transformer': 1 }, + 'Barnes & Noble': { 'Nook': 1 }, + 'BlackBerry': { 'PlayBook': 1 }, + 'Google': { 'Google TV': 1, 'Nexus': 1 }, + 'HP': { 'TouchPad': 1 }, + 'HTC': {}, + 'Huawei': {}, + 'Lenovo': {}, + 'LG': {}, + 'Microsoft': { 'Xbox': 1, 'Xbox One': 1 }, + 'Motorola': { 'Xoom': 1 }, + 'Nintendo': { 'Wii U': 1, 'Wii': 1 }, + 'Nokia': { 'Lumia': 1 }, + 'Oppo': {}, + 'Samsung': { 'Galaxy S': 1, 'Galaxy S2': 1, 'Galaxy S3': 1, 'Galaxy S4': 1 }, + 'Sony': { 'PlayStation': 1, 'PlayStation Vita': 1 }, + 'Xiaomi': { 'Mi': 1, 'Redmi': 1 } + }); + + /* Detectable operating systems (order is important). */ + var os = getOS([ + 'Windows Phone', + 'KaiOS', + 'Android', + 'CentOS', + { 'label': 'Chrome OS', 'pattern': 'CrOS' }, + 'Debian', + { 'label': 'DragonFly BSD', 'pattern': 'DragonFly' }, + 'Fedora', + 'FreeBSD', + 'Gentoo', + 'Haiku', + 'Kubuntu', + 'Linux Mint', + 'OpenBSD', + 'Red Hat', + 'SuSE', + 'Ubuntu', + 'Xubuntu', + 'Cygwin', + 'Symbian OS', + 'hpwOS', + 'webOS ', + 'webOS', + 'Tablet OS', + 'Tizen', + 'Linux', + 'Mac OS X', + 'Macintosh', + 'Mac', + 'Windows 98;', + 'Windows ' + ]); + + /*------------------------------------------------------------------------*/ + + /** + * Picks the layout engine from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected layout engine. + */ + function getLayout(guesses) { + return reduce(guesses, function(result, guess) { + return result || RegExp('\\b' + ( + guess.pattern || qualify(guess) + ) + '\\b', 'i').exec(ua) && (guess.label || guess); + }); + } + + /** + * Picks the manufacturer from an array of guesses. + * + * @private + * @param {Array} guesses An object of guesses. + * @returns {null|string} The detected manufacturer. + */ + function getManufacturer(guesses) { + return reduce(guesses, function(result, value, key) { + // Lookup the manufacturer by product or scan the UA for the manufacturer. + return result || ( + value[product] || + value[/^[a-z]+(?: +[a-z]+\b)*/i.exec(product)] || + RegExp('\\b' + qualify(key) + '(?:\\b|\\w*\\d)', 'i').exec(ua) + ) && key; + }); + } + + /** + * Picks the browser name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected browser name. + */ + function getName(guesses) { + return reduce(guesses, function(result, guess) { + return result || RegExp('\\b' + ( + guess.pattern || qualify(guess) + ) + '\\b', 'i').exec(ua) && (guess.label || guess); + }); + } + + /** + * Picks the OS name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected OS name. + */ + function getOS(guesses) { + return reduce(guesses, function(result, guess) { + var pattern = guess.pattern || qualify(guess); + if (!result && (result = + RegExp('\\b' + pattern + '(?:/[\\d.]+|[ \\w.]*)', 'i').exec(ua) + )) { + result = cleanupOS(result, pattern, guess.label || guess); + } + return result; + }); + } + + /** + * Picks the product name from an array of guesses. + * + * @private + * @param {Array} guesses An array of guesses. + * @returns {null|string} The detected product name. + */ + function getProduct(guesses) { + return reduce(guesses, function(result, guess) { + var pattern = guess.pattern || qualify(guess); + if (!result && (result = + RegExp('\\b' + pattern + ' *\\d+[.\\w_]*', 'i').exec(ua) || + RegExp('\\b' + pattern + ' *\\w+-[\\w]*', 'i').exec(ua) || + RegExp('\\b' + pattern + '(?:; *(?:[a-z]+[_-])?[a-z]+\\d+|[^ ();-]*)', 'i').exec(ua) + )) { + // Split by forward slash and append product version if needed. + if ((result = String((guess.label && !RegExp(pattern, 'i').test(guess.label)) ? guess.label : result).split('/'))[1] && !/[\d.]+/.test(result[0])) { + result[0] += ' ' + result[1]; + } + // Correct character case and cleanup string. + guess = guess.label || guess; + result = format(result[0] + .replace(RegExp(pattern, 'i'), guess) + .replace(RegExp('; *(?:' + guess + '[_-])?', 'i'), ' ') + .replace(RegExp('(' + guess + ')[-_.]?(\\w)', 'i'), '$1 $2')); + } + return result; + }); + } + + /** + * Resolves the version using an array of UA patterns. + * + * @private + * @param {Array} patterns An array of UA patterns. + * @returns {null|string} The detected version. + */ + function getVersion(patterns) { + return reduce(patterns, function(result, pattern) { + return result || (RegExp(pattern + + '(?:-[\\d.]+/|(?: for [\\w-]+)?[ /-])([\\d.]+[^ ();/_-]*)', 'i').exec(ua) || 0)[1] || null; + }); + } + + /** + * Returns `platform.description` when the platform object is coerced to a string. + * + * @name toString + * @memberOf platform + * @returns {string} Returns `platform.description` if available, else an empty string. + */ + function toStringPlatform() { + return this.description || ''; + } + + /*------------------------------------------------------------------------*/ + + // Convert layout to an array so we can add extra details. + layout && (layout = [layout]); + + // Detect Android products. + // Browsers on Android devices typically provide their product IDS after "Android;" + // up to "Build" or ") AppleWebKit". + // Example: + // "Mozilla/5.0 (Linux; Android 8.1.0; Moto G (5) Plus) AppleWebKit/537.36 + // (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36" + if (/\bAndroid\b/.test(os) && !product && + (data = /\bAndroid[^;]*;(.*?)(?:Build|\) AppleWebKit)\b/i.exec(ua))) { + product = trim(data[1]) + // Replace any language codes (eg. "en-US"). + .replace(/^[a-z]{2}-[a-z]{2};\s*/i, '') + || null; + } + // Detect product names that contain their manufacturer's name. + if (manufacturer && !product) { + product = getProduct([manufacturer]); + } else if (manufacturer && product) { + product = product + .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.\\s]', 'i'), manufacturer + ' ') + .replace(RegExp('^(' + qualify(manufacturer) + ')[-_.]?(\\w)', 'i'), manufacturer + ' $2'); + } + // Clean up Google TV. + if ((data = /\bGoogle TV\b/.exec(product))) { + product = data[0]; + } + // Detect simulators. + if (/\bSimulator\b/i.test(ua)) { + product = (product ? product + ' ' : '') + 'Simulator'; + } + // Detect Opera Mini 8+ running in Turbo/Uncompressed mode on iOS. + if (name == 'Opera Mini' && /\bOPiOS\b/.test(ua)) { + description.push('running in Turbo/Uncompressed mode'); + } + // Detect IE Mobile 11. + if (name == 'IE' && /\blike iPhone OS\b/.test(ua)) { + data = parse(ua.replace(/like iPhone OS/, '')); + manufacturer = data.manufacturer; + product = data.product; + } + // Detect iOS. + else if (/^iP/.test(product)) { + name || (name = 'Safari'); + os = 'iOS' + ((data = / OS ([\d_]+)/i.exec(ua)) + ? ' ' + data[1].replace(/_/g, '.') + : ''); + } + // Detect Kubuntu. + else if (name == 'Konqueror' && /^Linux\b/i.test(os)) { + os = 'Kubuntu'; + } + // Detect Android browsers. + else if ((manufacturer && manufacturer != 'Google' && + ((/Chrome/.test(name) && !/\bMobile Safari\b/i.test(ua)) || /\bVita\b/.test(product))) || + (/\bAndroid\b/.test(os) && /^Chrome/.test(name) && /\bVersion\//i.test(ua))) { + name = 'Android Browser'; + os = /\bAndroid\b/.test(os) ? os : 'Android'; + } + // Detect Silk desktop/accelerated modes. + else if (name == 'Silk') { + if (!/\bMobi/i.test(ua)) { + os = 'Android'; + description.unshift('desktop mode'); + } + if (/Accelerated *= *true/i.test(ua)) { + description.unshift('accelerated'); + } + } + // Detect UC Browser speed mode. + else if (name == 'UC Browser' && /\bUCWEB\b/.test(ua)) { + description.push('speed mode'); + } + // Detect PaleMoon identifying as Firefox. + else if (name == 'PaleMoon' && (data = /\bFirefox\/([\d.]+)\b/.exec(ua))) { + description.push('identifying as Firefox ' + data[1]); + } + // Detect Firefox OS and products running Firefox. + else if (name == 'Firefox' && (data = /\b(Mobile|Tablet|TV)\b/i.exec(ua))) { + os || (os = 'Firefox OS'); + product || (product = data[1]); + } + // Detect false positives for Firefox/Safari. + else if (!name || (data = !/\bMinefield\b/i.test(ua) && /\b(?:Firefox|Safari)\b/.exec(name))) { + // Escape the `/` for Firefox 1. + if (name && !product && /[\/,]|^[^(]+?\)/.test(ua.slice(ua.indexOf(data + '/') + 8))) { + // Clear name of false positives. + name = null; + } + // Reassign a generic name. + if ((data = product || manufacturer || os) && + (product || manufacturer || /\b(?:Android|Symbian OS|Tablet OS|webOS)\b/.test(os))) { + name = /[a-z]+(?: Hat)?/i.exec(/\bAndroid\b/.test(os) ? os : data) + ' Browser'; + } + } + // Add Chrome version to description for Electron. + else if (name == 'Electron' && (data = (/\bChrome\/([\d.]+)\b/.exec(ua) || 0)[1])) { + description.push('Chromium ' + data); + } + // Detect non-Opera (Presto-based) versions (order is important). + if (!version) { + version = getVersion([ + '(?:Cloud9|CriOS|CrMo|Edge|Edg|EdgA|EdgiOS|FxiOS|HeadlessChrome|IEMobile|Iron|Opera ?Mini|OPiOS|OPR|Raven|SamsungBrowser|Silk(?!/[\\d.]+$)|UCBrowser|YaBrowser)', + 'Version', + qualify(name), + '(?:Firefox|Minefield|NetFront)' + ]); + } + // Detect stubborn layout engines. + if ((data = + layout == 'iCab' && parseFloat(version) > 3 && 'WebKit' || + /\bOpera\b/.test(name) && (/\bOPR\b/.test(ua) ? 'Blink' : 'Presto') || + /\b(?:Midori|Nook|Safari)\b/i.test(ua) && !/^(?:Trident|EdgeHTML)$/.test(layout) && 'WebKit' || + !layout && /\bMSIE\b/i.test(ua) && (os == 'Mac OS' ? 'Tasman' : 'Trident') || + layout == 'WebKit' && /\bPlayStation\b(?! Vita\b)/i.test(name) && 'NetFront' + )) { + layout = [data]; + } + // Detect Windows Phone 7 desktop mode. + if (name == 'IE' && (data = (/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(ua) || 0)[1])) { + name += ' Mobile'; + os = 'Windows Phone ' + (/\+$/.test(data) ? data : data + '.x'); + description.unshift('desktop mode'); + } + // Detect Windows Phone 8.x desktop mode. + else if (/\bWPDesktop\b/i.test(ua)) { + name = 'IE Mobile'; + os = 'Windows Phone 8.x'; + description.unshift('desktop mode'); + version || (version = (/\brv:([\d.]+)/.exec(ua) || 0)[1]); + } + // Detect IE 11 identifying as other browsers. + else if (name != 'IE' && layout == 'Trident' && (data = /\brv:([\d.]+)/.exec(ua))) { + if (name) { + description.push('identifying as ' + name + (version ? ' ' + version : '')); + } + name = 'IE'; + version = data[1]; + } + // Leverage environment features. + if (useFeatures) { + // Detect server-side environments. + // Rhino has a global function while others have a global object. + if (isHostType(context, 'global')) { + if (java) { + data = java.lang.System; + arch = data.getProperty('os.arch'); + os = os || data.getProperty('os.name') + ' ' + data.getProperty('os.version'); + } + if (rhino) { + try { + version = context.require('ringo/engine').version.join('.'); + name = 'RingoJS'; + } catch(e) { + if ((data = context.system) && data.global.system == context.system) { + name = 'Narwhal'; + os || (os = data[0].os || null); + } + } + if (!name) { + name = 'Rhino'; + } + } + else if ( + typeof context.process == 'object' && !context.process.browser && + (data = context.process) + ) { + if (typeof data.versions == 'object') { + if (typeof data.versions.electron == 'string') { + description.push('Node ' + data.versions.node); + name = 'Electron'; + version = data.versions.electron; + } else if (typeof data.versions.nw == 'string') { + description.push('Chromium ' + version, 'Node ' + data.versions.node); + name = 'NW.js'; + version = data.versions.nw; + } + } + if (!name) { + name = 'Node.js'; + arch = data.arch; + os = data.platform; + version = /[\d.]+/.exec(data.version); + version = version ? version[0] : null; + } + } + } + // Detect Adobe AIR. + else if (getClassOf((data = context.runtime)) == airRuntimeClass) { + name = 'Adobe AIR'; + os = data.flash.system.Capabilities.os; + } + // Detect PhantomJS. + else if (getClassOf((data = context.phantom)) == phantomClass) { + name = 'PhantomJS'; + version = (data = data.version || null) && (data.major + '.' + data.minor + '.' + data.patch); + } + // Detect IE compatibility modes. + else if (typeof doc.documentMode == 'number' && (data = /\bTrident\/(\d+)/i.exec(ua))) { + // We're in compatibility mode when the Trident version + 4 doesn't + // equal the document mode. + version = [version, doc.documentMode]; + if ((data = +data[1] + 4) != version[1]) { + description.push('IE ' + version[1] + ' mode'); + layout && (layout[1] = ''); + version[1] = data; + } + version = name == 'IE' ? String(version[1].toFixed(1)) : version[0]; + } + // Detect IE 11 masking as other browsers. + else if (typeof doc.documentMode == 'number' && /^(?:Chrome|Firefox)\b/.test(name)) { + description.push('masking as ' + name + ' ' + version); + name = 'IE'; + version = '11.0'; + layout = ['Trident']; + os = 'Windows'; + } + os = os && format(os); + } + // Detect prerelease phases. + if (version && (data = + /(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(version) || + /(?:alpha|beta)(?: ?\d)?/i.exec(ua + ';' + (useFeatures && nav.appMinorVersion)) || + /\bMinefield\b/i.test(ua) && 'a' + )) { + prerelease = /b/i.test(data) ? 'beta' : 'alpha'; + version = version.replace(RegExp(data + '\\+?$'), '') + + (prerelease == 'beta' ? beta : alpha) + (/\d+\+?/.exec(data) || ''); + } + // Detect Firefox Mobile. + if (name == 'Fennec' || name == 'Firefox' && /\b(?:Android|Firefox OS|KaiOS)\b/.test(os)) { + name = 'Firefox Mobile'; + } + // Obscure Maxthon's unreliable version. + else if (name == 'Maxthon' && version) { + version = version.replace(/\.[\d.]+/, '.x'); + } + // Detect Xbox 360 and Xbox One. + else if (/\bXbox\b/i.test(product)) { + if (product == 'Xbox 360') { + os = null; + } + if (product == 'Xbox 360' && /\bIEMobile\b/.test(ua)) { + description.unshift('mobile mode'); + } + } + // Add mobile postfix. + else if ((/^(?:Chrome|IE|Opera)$/.test(name) || name && !product && !/Browser|Mobi/.test(name)) && + (os == 'Windows CE' || /Mobi/i.test(ua))) { + name += ' Mobile'; + } + // Detect IE platform preview. + else if (name == 'IE' && useFeatures) { + try { + if (context.external === null) { + description.unshift('platform preview'); + } + } catch(e) { + description.unshift('embedded'); + } + } + // Detect BlackBerry OS version. + // http://docs.blackberry.com/en/developers/deliverables/18169/HTTP_headers_sent_by_BB_Browser_1234911_11.jsp + else if ((/\bBlackBerry\b/.test(product) || /\bBB10\b/.test(ua)) && (data = + (RegExp(product.replace(/ +/g, ' *') + '/([.\\d]+)', 'i').exec(ua) || 0)[1] || + version + )) { + data = [data, /BB10/.test(ua)]; + os = (data[1] ? (product = null, manufacturer = 'BlackBerry') : 'Device Software') + ' ' + data[0]; + version = null; + } + // Detect Opera identifying/masking itself as another browser. + // http://www.opera.com/support/kb/view/843/ + else if (this != forOwn && product != 'Wii' && ( + (useFeatures && opera) || + (/Opera/.test(name) && /\b(?:MSIE|Firefox)\b/i.test(ua)) || + (name == 'Firefox' && /\bOS X (?:\d+\.){2,}/.test(os)) || + (name == 'IE' && ( + (os && !/^Win/.test(os) && version > 5.5) || + /\bWindows XP\b/.test(os) && version > 8 || + version == 8 && !/\bTrident\b/.test(ua) + )) + ) && !reOpera.test((data = parse.call(forOwn, ua.replace(reOpera, '') + ';'))) && data.name) { + // When "identifying", the UA contains both Opera and the other browser's name. + data = 'ing as ' + data.name + ((data = data.version) ? ' ' + data : ''); + if (reOpera.test(name)) { + if (/\bIE\b/.test(data) && os == 'Mac OS') { + os = null; + } + data = 'identify' + data; + } + // When "masking", the UA contains only the other browser's name. + else { + data = 'mask' + data; + if (operaClass) { + name = format(operaClass.replace(/([a-z])([A-Z])/g, '$1 $2')); + } else { + name = 'Opera'; + } + if (/\bIE\b/.test(data)) { + os = null; + } + if (!useFeatures) { + version = null; + } + } + layout = ['Presto']; + description.push(data); + } + // Detect WebKit Nightly and approximate Chrome/Safari versions. + if ((data = (/\bAppleWebKit\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { + // Correct build number for numeric comparison. + // (e.g. "532.5" becomes "532.05") + data = [parseFloat(data.replace(/\.(\d)$/, '.0$1')), data]; + // Nightly builds are postfixed with a "+". + if (name == 'Safari' && data[1].slice(-1) == '+') { + name = 'WebKit Nightly'; + prerelease = 'alpha'; + version = data[1].slice(0, -1); + } + // Clear incorrect browser versions. + else if (version == data[1] || + version == (data[2] = (/\bSafari\/([\d.]+\+?)/i.exec(ua) || 0)[1])) { + version = null; + } + // Use the full Chrome version when available. + data[1] = (/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(ua) || 0)[1]; + // Detect Blink layout engine. + if (data[0] == 537.36 && data[2] == 537.36 && parseFloat(data[1]) >= 28 && layout == 'WebKit') { + layout = ['Blink']; + } + // Detect JavaScriptCore. + // http://stackoverflow.com/questions/6768474/how-can-i-detect-which-javascript-engine-v8-or-jsc-is-used-at-runtime-in-androi + if (!useFeatures || (!likeChrome && !data[1])) { + layout && (layout[1] = 'like Safari'); + data = (data = data[0], data < 400 ? 1 : data < 500 ? 2 : data < 526 ? 3 : data < 533 ? 4 : data < 534 ? '4+' : data < 535 ? 5 : data < 537 ? 6 : data < 538 ? 7 : data < 601 ? 8 : data < 602 ? 9 : data < 604 ? 10 : data < 606 ? 11 : data < 608 ? 12 : '12'); + } else { + layout && (layout[1] = 'like Chrome'); + data = data[1] || (data = data[0], data < 530 ? 1 : data < 532 ? 2 : data < 532.05 ? 3 : data < 533 ? 4 : data < 534.03 ? 5 : data < 534.07 ? 6 : data < 534.10 ? 7 : data < 534.13 ? 8 : data < 534.16 ? 9 : data < 534.24 ? 10 : data < 534.30 ? 11 : data < 535.01 ? 12 : data < 535.02 ? '13+' : data < 535.07 ? 15 : data < 535.11 ? 16 : data < 535.19 ? 17 : data < 536.05 ? 18 : data < 536.10 ? 19 : data < 537.01 ? 20 : data < 537.11 ? '21+' : data < 537.13 ? 23 : data < 537.18 ? 24 : data < 537.24 ? 25 : data < 537.36 ? 26 : layout != 'Blink' ? '27' : '28'); + } + // Add the postfix of ".x" or "+" for approximate versions. + layout && (layout[1] += ' ' + (data += typeof data == 'number' ? '.x' : /[.+]/.test(data) ? '' : '+')); + // Obscure version for some Safari 1-2 releases. + if (name == 'Safari' && (!version || parseInt(version) > 45)) { + version = data; + } else if (name == 'Chrome' && /\bHeadlessChrome/i.test(ua)) { + description.unshift('headless'); + } + } + // Detect Opera desktop modes. + if (name == 'Opera' && (data = /\bzbov|zvav$/.exec(os))) { + name += ' '; + description.unshift('desktop mode'); + if (data == 'zvav') { + name += 'Mini'; + version = null; + } else { + name += 'Mobile'; + } + os = os.replace(RegExp(' *' + data + '$'), ''); + } + // Detect Chrome desktop mode. + else if (name == 'Safari' && /\bChrome\b/.exec(layout && layout[1])) { + description.unshift('desktop mode'); + name = 'Chrome Mobile'; + version = null; + + if (/\bOS X\b/.test(os)) { + manufacturer = 'Apple'; + os = 'iOS 4.3+'; + } else { + os = null; + } + } + // Newer versions of SRWare Iron uses the Chrome tag to indicate its version number. + else if (/\bSRWare Iron\b/.test(name) && !version) { + version = getVersion('Chrome'); + } + // Strip incorrect OS versions. + if (version && version.indexOf((data = /[\d.]+$/.exec(os))) == 0 && + ua.indexOf('/' + data + '-') > -1) { + os = trim(os.replace(data, '')); + } + // Ensure OS does not include the browser name. + if (os && os.indexOf(name) != -1 && !RegExp(name + ' OS').test(os)) { + os = os.replace(RegExp(' *' + qualify(name) + ' *'), ''); + } + // Add layout engine. + if (layout && !/\b(?:Avant|Nook)\b/.test(name) && ( + /Browser|Lunascape|Maxthon/.test(name) || + name != 'Safari' && /^iOS/.test(os) && /\bSafari\b/.test(layout[1]) || + /^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(name) && layout[1])) { + // Don't add layout details to description if they are falsey. + (data = layout[layout.length - 1]) && description.push(data); + } + // Combine contextual information. + if (description.length) { + description = ['(' + description.join('; ') + ')']; + } + // Append manufacturer to description. + if (manufacturer && product && product.indexOf(manufacturer) < 0) { + description.push('on ' + manufacturer); + } + // Append product to description. + if (product) { + description.push((/^on /.test(description[description.length - 1]) ? '' : 'on ') + product); + } + // Parse the OS into an object. + if (os) { + data = / ([\d.+]+)$/.exec(os); + isSpecialCasedOS = data && os.charAt(os.length - data[0].length - 1) == '/'; + os = { + 'architecture': 32, + 'family': (data && !isSpecialCasedOS) ? os.replace(data[0], '') : os, + 'version': data ? data[1] : null, + 'toString': function() { + var version = this.version; + return this.family + ((version && !isSpecialCasedOS) ? ' ' + version : '') + (this.architecture == 64 ? ' 64-bit' : ''); + } + }; + } + // Add browser/OS architecture. + if ((data = /\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(arch)) && !/\bi686\b/i.test(arch)) { + if (os) { + os.architecture = 64; + os.family = os.family.replace(RegExp(' *' + data), ''); + } + if ( + name && (/\bWOW64\b/i.test(ua) || + (useFeatures && /\w(?:86|32)$/.test(nav.cpuClass || nav.platform) && !/\bWin64; x64\b/i.test(ua))) + ) { + description.unshift('32-bit'); + } + } + // Chrome 39 and above on OS X is always 64-bit. + else if ( + os && /^OS X/.test(os.family) && + name == 'Chrome' && parseFloat(version) >= 39 + ) { + os.architecture = 64; + } + + ua || (ua = null); + + /*------------------------------------------------------------------------*/ + + /** + * The platform object. + * + * @name platform + * @type Object + */ + var platform = {}; + + /** + * The platform description. + * + * @memberOf platform + * @type string|null + */ + platform.description = ua; + + /** + * The name of the browser's layout engine. + * + * The list of common layout engines include: + * "Blink", "EdgeHTML", "Gecko", "Trident" and "WebKit" + * + * @memberOf platform + * @type string|null + */ + platform.layout = layout && layout[0]; + + /** + * The name of the product's manufacturer. + * + * The list of manufacturers include: + * "Apple", "Archos", "Amazon", "Asus", "Barnes & Noble", "BlackBerry", + * "Google", "HP", "HTC", "LG", "Microsoft", "Motorola", "Nintendo", + * "Nokia", "Samsung" and "Sony" + * + * @memberOf platform + * @type string|null + */ + platform.manufacturer = manufacturer; + + /** + * The name of the browser/environment. + * + * The list of common browser names include: + * "Chrome", "Electron", "Firefox", "Firefox for iOS", "IE", + * "Microsoft Edge", "PhantomJS", "Safari", "SeaMonkey", "Silk", + * "Opera Mini" and "Opera" + * + * Mobile versions of some browsers have "Mobile" appended to their name: + * eg. "Chrome Mobile", "Firefox Mobile", "IE Mobile" and "Opera Mobile" + * + * @memberOf platform + * @type string|null + */ + platform.name = name; + + /** + * The alpha/beta release indicator. + * + * @memberOf platform + * @type string|null + */ + platform.prerelease = prerelease; + + /** + * The name of the product hosting the browser. + * + * The list of common products include: + * + * "BlackBerry", "Galaxy S4", "Lumia", "iPad", "iPod", "iPhone", "Kindle", + * "Kindle Fire", "Nexus", "Nook", "PlayBook", "TouchPad" and "Transformer" + * + * @memberOf platform + * @type string|null + */ + platform.product = product; + + /** + * The browser's user agent string. + * + * @memberOf platform + * @type string|null + */ + platform.ua = ua; + + /** + * The browser/environment version. + * + * @memberOf platform + * @type string|null + */ + platform.version = name && version; + + /** + * The name of the operating system. + * + * @memberOf platform + * @type Object + */ + platform.os = os || { + + /** + * The CPU architecture the OS is built for. + * + * @memberOf platform.os + * @type number|null + */ + 'architecture': null, + + /** + * The family of the OS. + * + * Common values include: + * "Windows", "Windows Server 2008 R2 / 7", "Windows Server 2008 / Vista", + * "Windows XP", "OS X", "Linux", "Ubuntu", "Debian", "Fedora", "Red Hat", + * "SuSE", "Android", "iOS" and "Windows Phone" + * + * @memberOf platform.os + * @type string|null + */ + 'family': null, + + /** + * The version of the OS. + * + * @memberOf platform.os + * @type string|null + */ + 'version': null, + + /** + * Returns the OS string. + * + * @memberOf platform.os + * @returns {string} The OS string. + */ + 'toString': function() { return 'null'; } + }; + + platform.parse = parse; + platform.toString = toStringPlatform; + + if (platform.version) { + description.unshift(version); + } + if (platform.name) { + description.unshift(name); + } + if (os && name && !(os == String(os).split(' ')[0] && (os == name.split(' ')[0] || product))) { + description.push(product ? '(' + os + ')' : 'on ' + os); + } + if (description.length) { + platform.description = description.join(' '); + } + return platform; + } + + /*--------------------------------------------------------------------------*/ + + // Export platform. + var platform = parse(); + + // Some AMD build optimizers, like r.js, check for condition patterns like the following: + if (true) { + // Expose platform on the global object to prevent errors when platform is + // loaded by a script tag in the presence of an AMD loader. + // See http://requirejs.org/docs/errors.html#mismatch for more details. + root.platform = platform; + + // Define as an anonymous module so platform can be aliased through path mapping. + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { + return platform; + }).call(exports, __webpack_require__, exports, module), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } + // Check for `exports` after `define` in case a build optimizer adds an `exports` object. + else {} +}.call(this)); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../next/dist/compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module), __webpack_require__(/*! ./../next/dist/compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/react-dom/cjs/react-dom.development.js": +/*!*************************************************************!*\ + !*** ./node_modules/react-dom/cjs/react-dom.development.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react-dom.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var React = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); +var Scheduler = __webpack_require__(/*! scheduler */ "./node_modules/scheduler/index.js"); +var tracing = __webpack_require__(/*! scheduler/tracing */ "./node_modules/scheduler/tracing.js"); + +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } +} +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +if (!React) { + { + throw Error( "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM." ); + } +} + +var FunctionComponent = 0; +var ClassComponent = 1; +var IndeterminateComponent = 2; // Before we know whether it is function or class + +var HostRoot = 3; // Root of a host tree. Could be nested inside another node. + +var HostPortal = 4; // A subtree. Could be an entry point to a different renderer. + +var HostComponent = 5; +var HostText = 6; +var Fragment = 7; +var Mode = 8; +var ContextConsumer = 9; +var ContextProvider = 10; +var ForwardRef = 11; +var Profiler = 12; +var SuspenseComponent = 13; +var MemoComponent = 14; +var SimpleMemoComponent = 15; +var LazyComponent = 16; +var IncompleteClassComponent = 17; +var DehydratedFragment = 18; +var SuspenseListComponent = 19; +var FundamentalComponent = 20; +var ScopeComponent = 21; +var Block = 22; +var OffscreenComponent = 23; +var LegacyHiddenComponent = 24; + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableProfilerTimer = true; // Record durations for commit and passive effects phases. + +var enableFundamentalAPI = false; // Experimental Scope support. +var enableNewReconciler = false; // Errors that are thrown while unmounting (or after in the case of passive effects) +var warnAboutStringRefs = false; + +var allNativeEvents = new Set(); +/** + * Mapping from registration name to event name + */ + + +var registrationNameDependencies = {}; +/** + * Mapping from lowercase registration names to the properly cased version, + * used to warn in the case of missing event handlers. Available + * only in true. + * @type {Object} + */ + +var possibleRegistrationNames = {} ; // Trust the developer to only use possibleRegistrationNames in true + +function registerTwoPhaseEvent(registrationName, dependencies) { + registerDirectEvent(registrationName, dependencies); + registerDirectEvent(registrationName + 'Capture', dependencies); +} +function registerDirectEvent(registrationName, dependencies) { + { + if (registrationNameDependencies[registrationName]) { + error('EventRegistry: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName); + } + } + + registrationNameDependencies[registrationName] = dependencies; + + { + var lowerCasedName = registrationName.toLowerCase(); + possibleRegistrationNames[lowerCasedName] = registrationName; + + if (registrationName === 'onDoubleClick') { + possibleRegistrationNames.ondblclick = registrationName; + } + } + + for (var i = 0; i < dependencies.length; i++) { + allNativeEvents.add(dependencies[i]); + } +} + +var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); + +// A reserved attribute. +// It is handled by React separately and shouldn't be written to the DOM. +var RESERVED = 0; // A simple string attribute. +// Attributes that aren't in the filter are presumed to have this type. + +var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called +// "enumerated" attributes with "true" and "false" as possible values. +// When true, it should be set to a "true" string. +// When false, it should be set to a "false" string. + +var BOOLEANISH_STRING = 2; // A real boolean attribute. +// When true, it should be present (set either to an empty string or its name). +// When false, it should be omitted. + +var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. +// When true, it should be present (set either to an empty string or its name). +// When false, it should be omitted. +// For any other value, should be present with that value. + +var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. +// When falsy, it should be removed. + +var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. +// When falsy, it should be removed. + +var POSITIVE_NUMERIC = 6; + +/* eslint-disable max-len */ +var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; +/* eslint-enable max-len */ + +var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; +var ROOT_ATTRIBUTE_NAME = 'data-reactroot'; +var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); +var hasOwnProperty = Object.prototype.hasOwnProperty; +var illegalAttributeNameCache = {}; +var validatedAttributeNameCache = {}; +function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { + return true; + } + + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { + return false; + } + + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + + illegalAttributeNameCache[attributeName] = true; + + { + error('Invalid attribute name: `%s`', attributeName); + } + + return false; +} +function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null) { + return propertyInfo.type === RESERVED; + } + + if (isCustomComponentTag) { + return false; + } + + if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) { + return true; + } + + return false; +} +function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null && propertyInfo.type === RESERVED) { + return false; + } + + switch (typeof value) { + case 'function': // $FlowIssue symbol is perfectly valid here + + case 'symbol': + // eslint-disable-line + return true; + + case 'boolean': + { + if (isCustomComponentTag) { + return false; + } + + if (propertyInfo !== null) { + return !propertyInfo.acceptsBooleans; + } else { + var prefix = name.toLowerCase().slice(0, 5); + return prefix !== 'data-' && prefix !== 'aria-'; + } + } + + default: + return false; + } +} +function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { + if (value === null || typeof value === 'undefined') { + return true; + } + + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { + return true; + } + + if (isCustomComponentTag) { + return false; + } + + if (propertyInfo !== null) { + + switch (propertyInfo.type) { + case BOOLEAN: + return !value; + + case OVERLOADED_BOOLEAN: + return value === false; + + case NUMERIC: + return isNaN(value); + + case POSITIVE_NUMERIC: + return isNaN(value) || value < 1; + } + } + + return false; +} +function getPropertyInfo(name) { + return properties.hasOwnProperty(name) ? properties[name] : null; +} + +function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) { + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; + this.attributeName = attributeName; + this.attributeNamespace = attributeNamespace; + this.mustUseProperty = mustUseProperty; + this.propertyName = name; + this.type = type; + this.sanitizeURL = sanitizeURL; + this.removeEmptyString = removeEmptyString; +} // When adding attributes to this list, be sure to also add them to +// the `possibleStandardNames` module to ensure casing and incorrect +// name warnings. + + +var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. + +var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular +// elements (not just inputs). Now that ReactDOMInput assigns to the +// defaultValue property -- do we need this? +'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style']; +reservedProps.forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // A few React string attributes have a different name. +// This is a mapping from React prop names to the attribute names. + +[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { + var name = _ref[0], + attributeName = _ref[1]; + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are "enumerated" HTML attributes that accept "true" and "false". +// In React, we let users pass `true` and `false` even though technically +// these aren't boolean attributes (they are coerced to strings). + +['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are "enumerated" SVG attributes that accept "true" and "false". +// In React, we let users pass `true` and `false` even though technically +// these aren't boolean attributes (they are coerced to strings). +// Since these are SVG attributes, their attribute names are case-sensitive. + +['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML boolean attributes. + +['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM +// on the client side because the browsers are inconsistent. Instead we call focus(). +'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata +'itemScope'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are the few React props that we set as DOM properties +// rather than attributes. These are all booleans. + +['checked', // Note: `option.selected` is not updated if `select.multiple` is +// disabled with `removeAttribute`. We have special logic for handling this. +'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that are "overloaded booleans": they behave like +// booleans, but can also accept a string value. + +['capture', 'download' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that must be positive numbers. + +['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that must be numbers. + +['rowSpan', 'start'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); +var CAMELIZE = /[\-\:]([a-z])/g; + +var capitalize = function (token) { + return token[1].toUpperCase(); +}; // This is a list of all SVG attributes that need special casing, namespacing, +// or boolean value assignment. Regular attributes that just accept strings +// and have the same names are omitted, just like in the HTML attribute filter. +// Some of these attributes can be hard to find. This list was created by +// scraping the MDN documentation. + + +['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, null, // attributeNamespace + false, // sanitizeURL + false); +}); // String SVG attributes with the xlink namespace. + +['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL + false); +}); // String SVG attributes with the xml namespace. + +['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL + false); +}); // These attribute exists both in HTML and SVG. +// The attribute name is case-sensitive in SVG so we can't just use +// the React name like we do for attributes that exist only in HTML. + +['tabIndex', 'crossOrigin'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These attributes accept URLs. These must not allow javascript: URLS. +// These will also need to accept Trusted Types object in the future. + +var xlinkHref = 'xlinkHref'; +properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty +'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL +false); +['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + true, // sanitizeURL + true); +}); + +// and any newline or tab are filtered out as if they're not part of the URL. +// https://url.spec.whatwg.org/#url-parsing +// Tab or newline are defined as \r\n\t: +// https://infra.spec.whatwg.org/#ascii-tab-or-newline +// A C0 control is a code point in the range \u0000 NULL to \u001F +// INFORMATION SEPARATOR ONE, inclusive: +// https://infra.spec.whatwg.org/#c0-control-or-space + +/* eslint-disable max-len */ + +var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; +var didWarn = false; + +function sanitizeURL(url) { + { + if (!didWarn && isJavaScriptProtocol.test(url)) { + didWarn = true; + + error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url)); + } + } +} + +/** + * Get the value for a property on a node. Only used in DEV for SSR validation. + * The "expected" argument is used as a hint of what the expected value is. + * Some properties have multiple equivalent values. + */ +function getValueForProperty(node, name, expected, propertyInfo) { + { + if (propertyInfo.mustUseProperty) { + var propertyName = propertyInfo.propertyName; + return node[propertyName]; + } else { + if ( propertyInfo.sanitizeURL) { + // If we haven't fully disabled javascript: URLs, and if + // the hydration is successful of a javascript: URL, we + // still want to warn on the client. + sanitizeURL('' + expected); + } + + var attributeName = propertyInfo.attributeName; + var stringValue = null; + + if (propertyInfo.type === OVERLOADED_BOOLEAN) { + if (node.hasAttribute(attributeName)) { + var value = node.getAttribute(attributeName); + + if (value === '') { + return true; + } + + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return value; + } + + if (value === '' + expected) { + return expected; + } + + return value; + } + } else if (node.hasAttribute(attributeName)) { + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + // We had an attribute but shouldn't have had one, so read it + // for the error message. + return node.getAttribute(attributeName); + } + + if (propertyInfo.type === BOOLEAN) { + // If this was a boolean, it doesn't matter what the value is + // the fact that we have it is the same as the expected. + return expected; + } // Even if this property uses a namespace we use getAttribute + // because we assume its namespaced name is the same as our config. + // To use getAttributeNS we need the local name which we don't have + // in our config atm. + + + stringValue = node.getAttribute(attributeName); + } + + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return stringValue === null ? expected : stringValue; + } else if (stringValue === '' + expected) { + return expected; + } else { + return stringValue; + } + } + } +} +/** + * Get the value for a attribute on a node. Only used in DEV for SSR validation. + * The third argument is used as a hint of what the expected value is. Some + * attributes have multiple equivalent values. + */ + +function getValueForAttribute(node, name, expected) { + { + if (!isAttributeNameSafe(name)) { + return; + } // If the object is an opaque reference ID, it's expected that + // the next prop is different than the server value, so just return + // expected + + + if (isOpaqueHydratingObject(expected)) { + return expected; + } + + if (!node.hasAttribute(name)) { + return expected === undefined ? undefined : null; + } + + var value = node.getAttribute(name); + + if (value === '' + expected) { + return expected; + } + + return value; + } +} +/** + * Sets the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + * @param {*} value + */ + +function setValueForProperty(node, name, value, isCustomComponentTag) { + var propertyInfo = getPropertyInfo(name); + + if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { + return; + } + + if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) { + value = null; + } // If the prop isn't in the special list, treat it as a simple attribute. + + + if (isCustomComponentTag || propertyInfo === null) { + if (isAttributeNameSafe(name)) { + var _attributeName = name; + + if (value === null) { + node.removeAttribute(_attributeName); + } else { + node.setAttribute(_attributeName, '' + value); + } + } + + return; + } + + var mustUseProperty = propertyInfo.mustUseProperty; + + if (mustUseProperty) { + var propertyName = propertyInfo.propertyName; + + if (value === null) { + var type = propertyInfo.type; + node[propertyName] = type === BOOLEAN ? false : ''; + } else { + // Contrary to `setAttribute`, object properties are properly + // `toString`ed by IE8/9. + node[propertyName] = value; + } + + return; + } // The rest are treated as attributes with special cases. + + + var attributeName = propertyInfo.attributeName, + attributeNamespace = propertyInfo.attributeNamespace; + + if (value === null) { + node.removeAttribute(attributeName); + } else { + var _type = propertyInfo.type; + var attributeValue; + + if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { + // If attribute type is boolean, we know for sure it won't be an execution sink + // and we won't require Trusted Type here. + attributeValue = ''; + } else { + // `setAttribute` with objects becomes only `[object]` in IE8/9, + // ('' + value) makes it output the correct toString()-value. + { + attributeValue = '' + value; + } + + if (propertyInfo.sanitizeURL) { + sanitizeURL(attributeValue.toString()); + } + } + + if (attributeNamespace) { + node.setAttributeNS(attributeNamespace, attributeName, attributeValue); + } else { + node.setAttribute(attributeName, attributeValue); + } + } +} + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +var REACT_FRAGMENT_TYPE = 0xeacb; +var REACT_STRICT_MODE_TYPE = 0xeacc; +var REACT_PROFILER_TYPE = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +var REACT_SUSPENSE_TYPE = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + REACT_FRAGMENT_TYPE = symbolFor('react.fragment'); + REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); + REACT_PROFILER_TYPE = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} + +function describeClassComponentFrame(ctor, source, ownerFn) { + { + return describeNativeComponentFrame(ctor, true); + } +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +function describeFiber(fiber) { + var owner = fiber._debugOwner ? fiber._debugOwner.type : null ; + var source = fiber._debugSource ; + + switch (fiber.tag) { + case HostComponent: + return describeBuiltInComponentFrame(fiber.type); + + case LazyComponent: + return describeBuiltInComponentFrame('Lazy'); + + case SuspenseComponent: + return describeBuiltInComponentFrame('Suspense'); + + case SuspenseListComponent: + return describeBuiltInComponentFrame('SuspenseList'); + + case FunctionComponent: + case IndeterminateComponent: + case SimpleMemoComponent: + return describeFunctionComponentFrame(fiber.type); + + case ForwardRef: + return describeFunctionComponentFrame(fiber.type.render); + + case Block: + return describeFunctionComponentFrame(fiber.type._render); + + case ClassComponent: + return describeClassComponentFrame(fiber.type); + + default: + return ''; + } +} + +function getStackByFiberInDevAndProd(workInProgress) { + try { + var info = ''; + var node = workInProgress; + + do { + info += describeFiber(node); + node = node.return; + } while (node); + + return info; + } catch (x) { + return '\nError generating stack: ' + x.message + '\n' + x.stack; + } +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; +var current = null; +var isRendering = false; +function getCurrentFiberOwnerNameInDevOrNull() { + { + if (current === null) { + return null; + } + + var owner = current._debugOwner; + + if (owner !== null && typeof owner !== 'undefined') { + return getComponentName(owner.type); + } + } + + return null; +} + +function getCurrentFiberStackInDev() { + { + if (current === null) { + return ''; + } // Safe because if current fiber exists, we are reconciling, + // and it is guaranteed to be the work-in-progress version. + + + return getStackByFiberInDevAndProd(current); + } +} + +function resetCurrentFiber() { + { + ReactDebugCurrentFrame.getCurrentStack = null; + current = null; + isRendering = false; + } +} +function setCurrentFiber(fiber) { + { + ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev; + current = fiber; + isRendering = false; + } +} +function setIsRendering(rendering) { + { + isRendering = rendering; + } +} +function getIsRendering() { + { + return isRendering; + } +} + +// Flow does not allow string concatenation of most non-string types. To work +// around this limitation, we use an opaque type that can only be obtained by +// passing the value through getToStringValue first. +function toString(value) { + return '' + value; +} +function getToStringValue(value) { + switch (typeof value) { + case 'boolean': + case 'number': + case 'object': + case 'string': + case 'undefined': + return value; + + default: + // function, symbol are assigned as empty strings + return ''; + } +} + +var hasReadOnlyValue = { + button: true, + checkbox: true, + image: true, + hidden: true, + radio: true, + reset: true, + submit: true +}; +function checkControlledValueProps(tagName, props) { + { + if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) { + error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + + if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) { + error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + } +} + +function isCheckable(elem) { + var type = elem.type; + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio'); +} + +function getTracker(node) { + return node._valueTracker; +} + +function detachTracker(node) { + node._valueTracker = null; +} + +function getValueFromNode(node) { + var value = ''; + + if (!node) { + return value; + } + + if (isCheckable(node)) { + value = node.checked ? 'true' : 'false'; + } else { + value = node.value; + } + + return value; +} + +function trackValueOnNode(node) { + var valueField = isCheckable(node) ? 'checked' : 'value'; + var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); + var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail + // and don't track value will cause over reporting of changes, + // but it's better then a hard failure + // (needed for certain tests that spyOn input values and Safari) + + if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { + return; + } + + var get = descriptor.get, + set = descriptor.set; + Object.defineProperty(node, valueField, { + configurable: true, + get: function () { + return get.call(this); + }, + set: function (value) { + currentValue = '' + value; + set.call(this, value); + } + }); // We could've passed this the first time + // but it triggers a bug in IE11 and Edge 14/15. + // Calling defineProperty() again should be equivalent. + // https://github.com/facebook/react/issues/11768 + + Object.defineProperty(node, valueField, { + enumerable: descriptor.enumerable + }); + var tracker = { + getValue: function () { + return currentValue; + }, + setValue: function (value) { + currentValue = '' + value; + }, + stopTracking: function () { + detachTracker(node); + delete node[valueField]; + } + }; + return tracker; +} + +function track(node) { + if (getTracker(node)) { + return; + } // TODO: Once it's just Fiber we can move this to node._wrapperState + + + node._valueTracker = trackValueOnNode(node); +} +function updateValueIfChanged(node) { + if (!node) { + return false; + } + + var tracker = getTracker(node); // if there is no tracker at this point it's unlikely + // that trying again will succeed + + if (!tracker) { + return true; + } + + var lastValue = tracker.getValue(); + var nextValue = getValueFromNode(node); + + if (nextValue !== lastValue) { + tracker.setValue(nextValue); + return true; + } + + return false; +} + +function getActiveElement(doc) { + doc = doc || (typeof document !== 'undefined' ? document : undefined); + + if (typeof doc === 'undefined') { + return null; + } + + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; + } +} + +var didWarnValueDefaultValue = false; +var didWarnCheckedDefaultChecked = false; +var didWarnControlledToUncontrolled = false; +var didWarnUncontrolledToControlled = false; + +function isControlled(props) { + var usesChecked = props.type === 'checkbox' || props.type === 'radio'; + return usesChecked ? props.checked != null : props.value != null; +} +/** + * Implements an <input> host component that allows setting these optional + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. + * + * If `checked` or `value` are not supplied (or null/undefined), user actions + * that affect the checked state or value will trigger updates to the element. + * + * If they are supplied (and not null/undefined), the rendered element will not + * trigger updates to the element. Instead, the props must change in order for + * the rendered element to be updated. + * + * The rendered element will be initialized as unchecked (or `defaultChecked`) + * with an empty value (or `defaultValue`). + * + * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html + */ + + +function getHostProps(element, props) { + var node = element; + var checked = props.checked; + + var hostProps = _assign({}, props, { + defaultChecked: undefined, + defaultValue: undefined, + value: undefined, + checked: checked != null ? checked : node._wrapperState.initialChecked + }); + + return hostProps; +} +function initWrapperState(element, props) { + { + checkControlledValueProps('input', props); + + if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) { + error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); + + didWarnCheckedDefaultChecked = true; + } + + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) { + error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); + + didWarnValueDefaultValue = true; + } + } + + var node = element; + var defaultValue = props.defaultValue == null ? '' : props.defaultValue; + node._wrapperState = { + initialChecked: props.checked != null ? props.checked : props.defaultChecked, + initialValue: getToStringValue(props.value != null ? props.value : defaultValue), + controlled: isControlled(props) + }; +} +function updateChecked(element, props) { + var node = element; + var checked = props.checked; + + if (checked != null) { + setValueForProperty(node, 'checked', checked, false); + } +} +function updateWrapper(element, props) { + var node = element; + + { + var controlled = isControlled(props); + + if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { + error('A component is changing an uncontrolled input to be controlled. ' + 'This is likely caused by the value changing from undefined to ' + 'a defined value, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components'); + + didWarnUncontrolledToControlled = true; + } + + if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { + error('A component is changing a controlled input to be uncontrolled. ' + 'This is likely caused by the value changing from a defined to ' + 'undefined, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components'); + + didWarnControlledToUncontrolled = true; + } + } + + updateChecked(element, props); + var value = getToStringValue(props.value); + var type = props.type; + + if (value != null) { + if (type === 'number') { + if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible. + // eslint-disable-next-line + node.value != value) { + node.value = toString(value); + } + } else if (node.value !== toString(value)) { + node.value = toString(value); + } + } else if (type === 'submit' || type === 'reset') { + // Submit/reset inputs need the attribute removed completely to avoid + // blank-text buttons. + node.removeAttribute('value'); + return; + } + + { + // When syncing the value attribute, the value comes from a cascade of + // properties: + // 1. The value React property + // 2. The defaultValue React property + // 3. Otherwise there should be no change + if (props.hasOwnProperty('value')) { + setDefaultValue(node, props.type, value); + } else if (props.hasOwnProperty('defaultValue')) { + setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); + } + } + + { + // When syncing the checked attribute, it only changes when it needs + // to be removed, such as transitioning from a checkbox into a text input + if (props.checked == null && props.defaultChecked != null) { + node.defaultChecked = !!props.defaultChecked; + } + } +} +function postMountWrapper(element, props, isHydrating) { + var node = element; // Do not assign value if it is already set. This prevents user text input + // from being lost during SSR hydration. + + if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) { + var type = props.type; + var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the + // default value provided by the browser. See: #12872 + + if (isButton && (props.value === undefined || props.value === null)) { + return; + } + + var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input + // from being lost during SSR hydration. + + if (!isHydrating) { + { + // When syncing the value attribute, the value property should use + // the wrapperState._initialValue property. This uses: + // + // 1. The value React property when present + // 2. The defaultValue React property when present + // 3. An empty string + if (initialValue !== node.value) { + node.value = initialValue; + } + } + } + + { + // Otherwise, the value attribute is synchronized to the property, + // so we assign defaultValue to the same thing as the value property + // assignment step above. + node.defaultValue = initialValue; + } + } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug + // this is needed to work around a chrome bug where setting defaultChecked + // will sometimes influence the value of checked (even after detachment). + // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416 + // We need to temporarily unset name to avoid disrupting radio button groups. + + + var name = node.name; + + if (name !== '') { + node.name = ''; + } + + { + // When syncing the checked attribute, both the checked property and + // attribute are assigned at the same time using defaultChecked. This uses: + // + // 1. The checked React property when present + // 2. The defaultChecked React property when present + // 3. Otherwise, false + node.defaultChecked = !node.defaultChecked; + node.defaultChecked = !!node._wrapperState.initialChecked; + } + + if (name !== '') { + node.name = name; + } +} +function restoreControlledState(element, props) { + var node = element; + updateWrapper(node, props); + updateNamedCousins(node, props); +} + +function updateNamedCousins(rootNode, props) { + var name = props.name; + + if (props.type === 'radio' && name != null) { + var queryRoot = rootNode; + + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } // If `rootNode.form` was non-null, then we could try `form.elements`, + // but that sometimes behaves strangely in IE8. We could also try using + // `form.getElementsByName`, but that will only return direct children + // and won't include inputs that use the HTML5 `form=` attribute. Since + // the input might not even be in a form. It might not even be in the + // document. Let's just use the local `querySelectorAll` to ensure we don't + // miss anything. + + + var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); + + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; + + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } // This will throw if radio buttons rendered by different copies of React + // and the same name are rendered into the same form (same as #1939). + // That's probably okay; we don't support it just as we don't support + // mixing React radio buttons with non-React ones. + + + var otherProps = getFiberCurrentPropsFromNode(otherNode); + + if (!otherProps) { + { + throw Error( "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported." ); + } + } // We need update the tracked value on the named cousin since the value + // was changed but the input saw no event or value set + + + updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that + // was previously checked to update will cause it to be come re-checked + // as appropriate. + + updateWrapper(otherNode, otherProps); + } + } +} // In Chrome, assigning defaultValue to certain input types triggers input validation. +// For number inputs, the display value loses trailing decimal points. For email inputs, +// Chrome raises "The specified value <x> is not a valid email address". +// +// Here we check to see if the defaultValue has actually changed, avoiding these problems +// when the user is inputting text +// +// https://github.com/facebook/react/issues/7253 + + +function setDefaultValue(node, type, value) { + if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js + type !== 'number' || getActiveElement(node.ownerDocument) !== node) { + if (value == null) { + node.defaultValue = toString(node._wrapperState.initialValue); + } else if (node.defaultValue !== toString(value)) { + node.defaultValue = toString(value); + } + } +} + +var didWarnSelectedSetOnOption = false; +var didWarnInvalidChild = false; + +function flattenChildren(children) { + var content = ''; // Flatten children. We'll warn if they are invalid + // during validateProps() which runs for hydration too. + // Note that this would throw on non-element objects. + // Elements are stringified (which is normally irrelevant + // but matters for <fbt>). + + React.Children.forEach(children, function (child) { + if (child == null) { + return; + } + + content += child; // Note: we don't warn about invalid children here. + // Instead, this is done separately below so that + // it happens during the hydration code path too. + }); + return content; +} +/** + * Implements an <option> host component that warns when `selected` is set. + */ + + +function validateProps(element, props) { + { + // This mirrors the code path above, but runs for hydration too. + // Warn about invalid children here so that client and hydration are consistent. + // TODO: this seems like it could cause a DEV-only throw for hydration + // if children contains a non-element object. We should try to avoid that. + if (typeof props.children === 'object' && props.children !== null) { + React.Children.forEach(props.children, function (child) { + if (child == null) { + return; + } + + if (typeof child === 'string' || typeof child === 'number') { + return; + } + + if (typeof child.type !== 'string') { + return; + } + + if (!didWarnInvalidChild) { + didWarnInvalidChild = true; + + error('Only strings and numbers are supported as <option> children.'); + } + }); + } // TODO: Remove support for `selected` in <option>. + + + if (props.selected != null && !didWarnSelectedSetOnOption) { + error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.'); + + didWarnSelectedSetOnOption = true; + } + } +} +function postMountWrapper$1(element, props) { + // value="" should make a value attribute (#6219) + if (props.value != null) { + element.setAttribute('value', toString(getToStringValue(props.value))); + } +} +function getHostProps$1(element, props) { + var hostProps = _assign({ + children: undefined + }, props); + + var content = flattenChildren(props.children); + + if (content) { + hostProps.children = content; + } + + return hostProps; +} + +var didWarnValueDefaultValue$1; + +{ + didWarnValueDefaultValue$1 = false; +} + +function getDeclarationErrorAddendum() { + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + + if (ownerName) { + return '\n\nCheck the render method of `' + ownerName + '`.'; + } + + return ''; +} + +var valuePropNames = ['value', 'defaultValue']; +/** + * Validation function for `value` and `defaultValue`. + */ + +function checkSelectPropTypes(props) { + { + checkControlledValueProps('select', props); + + for (var i = 0; i < valuePropNames.length; i++) { + var propName = valuePropNames[i]; + + if (props[propName] == null) { + continue; + } + + var isArray = Array.isArray(props[propName]); + + if (props.multiple && !isArray) { + error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum()); + } else if (!props.multiple && isArray) { + error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum()); + } + } + } +} + +function updateOptions(node, multiple, propValue, setDefaultSelected) { + var options = node.options; + + if (multiple) { + var selectedValues = propValue; + var selectedValue = {}; + + for (var i = 0; i < selectedValues.length; i++) { + // Prefix to avoid chaos with special keys. + selectedValue['$' + selectedValues[i]] = true; + } + + for (var _i = 0; _i < options.length; _i++) { + var selected = selectedValue.hasOwnProperty('$' + options[_i].value); + + if (options[_i].selected !== selected) { + options[_i].selected = selected; + } + + if (selected && setDefaultSelected) { + options[_i].defaultSelected = true; + } + } + } else { + // Do not set `select.value` as exact behavior isn't consistent across all + // browsers for all cases. + var _selectedValue = toString(getToStringValue(propValue)); + + var defaultSelected = null; + + for (var _i2 = 0; _i2 < options.length; _i2++) { + if (options[_i2].value === _selectedValue) { + options[_i2].selected = true; + + if (setDefaultSelected) { + options[_i2].defaultSelected = true; + } + + return; + } + + if (defaultSelected === null && !options[_i2].disabled) { + defaultSelected = options[_i2]; + } + } + + if (defaultSelected !== null) { + defaultSelected.selected = true; + } + } +} +/** + * Implements a <select> host component that allows optionally setting the + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a + * stringable. If `multiple` is true, the prop must be an array of stringables. + * + * If `value` is not supplied (or null/undefined), user actions that change the + * selected option will trigger updates to the rendered options. + * + * If it is supplied (and not null/undefined), the rendered options will not + * update in response to user actions. Instead, the `value` prop must change in + * order for the rendered options to update. + * + * If `defaultValue` is provided, any options with the supplied values will be + * selected. + */ + + +function getHostProps$2(element, props) { + return _assign({}, props, { + value: undefined + }); +} +function initWrapperState$1(element, props) { + var node = element; + + { + checkSelectPropTypes(props); + } + + node._wrapperState = { + wasMultiple: !!props.multiple + }; + + { + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) { + error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components'); + + didWarnValueDefaultValue$1 = true; + } + } +} +function postMountWrapper$2(element, props) { + var node = element; + node.multiple = !!props.multiple; + var value = props.value; + + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } else if (props.defaultValue != null) { + updateOptions(node, !!props.multiple, props.defaultValue, true); + } +} +function postUpdateWrapper(element, props) { + var node = element; + var wasMultiple = node._wrapperState.wasMultiple; + node._wrapperState.wasMultiple = !!props.multiple; + var value = props.value; + + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } else if (wasMultiple !== !!props.multiple) { + // For simplicity, reapply `defaultValue` if `multiple` is toggled. + if (props.defaultValue != null) { + updateOptions(node, !!props.multiple, props.defaultValue, true); + } else { + // Revert the select back to its default unselected state. + updateOptions(node, !!props.multiple, props.multiple ? [] : '', false); + } + } +} +function restoreControlledState$1(element, props) { + var node = element; + var value = props.value; + + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } +} + +var didWarnValDefaultVal = false; + +/** + * Implements a <textarea> host component that allows setting `value`, and + * `defaultValue`. This differs from the traditional DOM API because value is + * usually set as PCDATA children. + * + * If `value` is not supplied (or null/undefined), user actions that affect the + * value will trigger updates to the element. + * + * If `value` is supplied (and not null/undefined), the rendered element will + * not trigger updates to the element. Instead, the `value` prop must change in + * order for the rendered element to be updated. + * + * The rendered element will be initialized with an empty value, the prop + * `defaultValue` if specified, or the children content (deprecated). + */ +function getHostProps$3(element, props) { + var node = element; + + if (!(props.dangerouslySetInnerHTML == null)) { + { + throw Error( "`dangerouslySetInnerHTML` does not make sense on <textarea>." ); + } + } // Always set children to the same thing. In IE9, the selection range will + // get reset if `textContent` is mutated. We could add a check in setTextContent + // to only set the value if/when the value differs from the node value (which would + // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this + // solution. The value can be a boolean or object so that's why it's forced + // to be a string. + + + var hostProps = _assign({}, props, { + value: undefined, + defaultValue: undefined, + children: toString(node._wrapperState.initialValue) + }); + + return hostProps; +} +function initWrapperState$2(element, props) { + var node = element; + + { + checkControlledValueProps('textarea', props); + + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) { + error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component'); + + didWarnValDefaultVal = true; + } + } + + var initialValue = props.value; // Only bother fetching default value if we're going to use it + + if (initialValue == null) { + var children = props.children, + defaultValue = props.defaultValue; + + if (children != null) { + { + error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.'); + } + + { + if (!(defaultValue == null)) { + { + throw Error( "If you supply `defaultValue` on a <textarea>, do not pass children." ); + } + } + + if (Array.isArray(children)) { + if (!(children.length <= 1)) { + { + throw Error( "<textarea> can only have at most one child." ); + } + } + + children = children[0]; + } + + defaultValue = children; + } + } + + if (defaultValue == null) { + defaultValue = ''; + } + + initialValue = defaultValue; + } + + node._wrapperState = { + initialValue: getToStringValue(initialValue) + }; +} +function updateWrapper$1(element, props) { + var node = element; + var value = getToStringValue(props.value); + var defaultValue = getToStringValue(props.defaultValue); + + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed + + if (newValue !== node.value) { + node.value = newValue; + } + + if (props.defaultValue == null && node.defaultValue !== newValue) { + node.defaultValue = newValue; + } + } + + if (defaultValue != null) { + node.defaultValue = toString(defaultValue); + } +} +function postMountWrapper$3(element, props) { + var node = element; // This is in postMount because we need access to the DOM node, which is not + // available until after the component has mounted. + + var textContent = node.textContent; // Only set node.value if textContent is equal to the expected + // initial value. In IE10/IE11 there is a bug where the placeholder attribute + // will populate textContent as well. + // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/ + + if (textContent === node._wrapperState.initialValue) { + if (textContent !== '' && textContent !== null) { + node.value = textContent; + } + } +} +function restoreControlledState$2(element, props) { + // DOM component is still mounted; update + updateWrapper$1(element, props); +} + +var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; +var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; +var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; +var Namespaces = { + html: HTML_NAMESPACE, + mathml: MATH_NAMESPACE, + svg: SVG_NAMESPACE +}; // Assumes there is no parent namespace. + +function getIntrinsicNamespace(type) { + switch (type) { + case 'svg': + return SVG_NAMESPACE; + + case 'math': + return MATH_NAMESPACE; + + default: + return HTML_NAMESPACE; + } +} +function getChildNamespace(parentNamespace, type) { + if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) { + // No (or default) parent namespace: potential entry point. + return getIntrinsicNamespace(type); + } + + if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') { + // We're leaving SVG. + return HTML_NAMESPACE; + } // By default, pass namespace below. + + + return parentNamespace; +} + +/* globals MSApp */ + +/** + * Create a function which has 'unsafe' privileges (required by windows8 apps) + */ +var createMicrosoftUnsafeLocalFunction = function (func) { + if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { + return function (arg0, arg1, arg2, arg3) { + MSApp.execUnsafeLocalFunction(function () { + return func(arg0, arg1, arg2, arg3); + }); + }; + } else { + return func; + } +}; + +var reusableSVGContainer; +/** + * Set the innerHTML property of a node + * + * @param {DOMElement} node + * @param {string} html + * @internal + */ + +var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) { + if (node.namespaceURI === Namespaces.svg) { + + if (!('innerHTML' in node)) { + // IE does not have innerHTML for SVG nodes, so instead we inject the + // new markup in a temp node and then move the child nodes across into + // the target node + reusableSVGContainer = reusableSVGContainer || document.createElement('div'); + reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>'; + var svgNode = reusableSVGContainer.firstChild; + + while (node.firstChild) { + node.removeChild(node.firstChild); + } + + while (svgNode.firstChild) { + node.appendChild(svgNode.firstChild); + } + + return; + } + } + + node.innerHTML = html; +}); + +/** + * HTML nodeType values that represent the type of the node + */ +var ELEMENT_NODE = 1; +var TEXT_NODE = 3; +var COMMENT_NODE = 8; +var DOCUMENT_NODE = 9; +var DOCUMENT_FRAGMENT_NODE = 11; + +/** + * Set the textContent property of a node. For text updates, it's faster + * to set the `nodeValue` of the Text node directly instead of using + * `.textContent` which will remove the existing node and create a new one. + * + * @param {DOMElement} node + * @param {string} text + * @internal + */ + +var setTextContent = function (node, text) { + if (text) { + var firstChild = node.firstChild; + + if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) { + firstChild.nodeValue = text; + return; + } + } + + node.textContent = text; +}; + +// List derived from Gecko source code: +// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js +var shorthandToLonghand = { + animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'], + background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'], + backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'], + border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'], + borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'], + borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'], + borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'], + borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'], + borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'], + borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'], + borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'], + borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'], + borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'], + borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'], + borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'], + borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'], + borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'], + columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'], + columns: ['columnCount', 'columnWidth'], + flex: ['flexBasis', 'flexGrow', 'flexShrink'], + flexFlow: ['flexDirection', 'flexWrap'], + font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'], + fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'], + gap: ['columnGap', 'rowGap'], + grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], + gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'], + gridColumn: ['gridColumnEnd', 'gridColumnStart'], + gridColumnGap: ['columnGap'], + gridGap: ['columnGap', 'rowGap'], + gridRow: ['gridRowEnd', 'gridRowStart'], + gridRowGap: ['rowGap'], + gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], + listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'], + margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'], + marker: ['markerEnd', 'markerMid', 'markerStart'], + mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'], + maskPosition: ['maskPositionX', 'maskPositionY'], + outline: ['outlineColor', 'outlineStyle', 'outlineWidth'], + overflow: ['overflowX', 'overflowY'], + padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'], + placeContent: ['alignContent', 'justifyContent'], + placeItems: ['alignItems', 'justifyItems'], + placeSelf: ['alignSelf', 'justifySelf'], + textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'], + textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'], + transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'], + wordWrap: ['overflowWrap'] +}; + +/** + * CSS properties which accept numbers but are not in units of "px". + */ +var isUnitlessNumber = { + animationIterationCount: true, + borderImageOutset: true, + borderImageSlice: true, + borderImageWidth: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + columns: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + gridArea: true, + gridRow: true, + gridRowEnd: true, + gridRowSpan: true, + gridRowStart: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnSpan: true, + gridColumnStart: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + // SVG-related properties + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeDasharray: true, + strokeDashoffset: true, + strokeMiterlimit: true, + strokeOpacity: true, + strokeWidth: true +}; +/** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ + +function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); +} +/** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ + + +var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an +// infinite loop, because it iterates over the newly added props too. + +Object.keys(isUnitlessNumber).forEach(function (prop) { + prefixes.forEach(function (prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); +}); + +/** + * Convert a value into the proper css writable value. The style name `name` + * should be logical (no hyphens), as specified + * in `CSSProperty.isUnitlessNumber`. + * + * @param {string} name CSS property name such as `topMargin`. + * @param {*} value CSS property value such as `10px`. + * @return {string} Normalized style value with dimensions applied. + */ + +function dangerousStyleValue(name, value, isCustomProperty) { + // Note that we've removed escapeTextForBrowser() calls here since the + // whole string will be escaped when the attribute is injected into + // the markup. If you provide unsafe user data here they can inject + // arbitrary CSS which may be problematic (I couldn't repro this): + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ + // This is not an XSS hole but instead a potential CSS injection issue + // which has lead to a greater discussion about how we're going to + // trust URLs moving forward. See #2115901 + var isEmpty = value == null || typeof value === 'boolean' || value === ''; + + if (isEmpty) { + return ''; + } + + if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) { + return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers + } + + return ('' + value).trim(); +} + +var uppercasePattern = /([A-Z])/g; +var msPattern = /^ms-/; +/** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + */ + +function hyphenateStyleName(name) { + return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-'); +} + +var warnValidStyle = function () {}; + +{ + // 'msTransform' is correct, but the other prefixes should be capitalized + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; + var msPattern$1 = /^-ms-/; + var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon + + var badStyleValueWithSemicolonPattern = /;\s*$/; + var warnedStyleNames = {}; + var warnedStyleValues = {}; + var warnedForNaNValue = false; + var warnedForInfinityValue = false; + + var camelize = function (string) { + return string.replace(hyphenPattern, function (_, character) { + return character.toUpperCase(); + }); + }; + + var warnHyphenatedStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + + error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests + // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix + // is converted to lowercase `ms`. + camelize(name.replace(msPattern$1, 'ms-'))); + }; + + var warnBadVendoredStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + + error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)); + }; + + var warnStyleValueWithSemicolon = function (name, value) { + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { + return; + } + + warnedStyleValues[value] = true; + + error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')); + }; + + var warnStyleValueIsNaN = function (name, value) { + if (warnedForNaNValue) { + return; + } + + warnedForNaNValue = true; + + error('`NaN` is an invalid value for the `%s` css style property.', name); + }; + + var warnStyleValueIsInfinity = function (name, value) { + if (warnedForInfinityValue) { + return; + } + + warnedForInfinityValue = true; + + error('`Infinity` is an invalid value for the `%s` css style property.', name); + }; + + warnValidStyle = function (name, value) { + if (name.indexOf('-') > -1) { + warnHyphenatedStyleName(name); + } else if (badVendoredStyleNamePattern.test(name)) { + warnBadVendoredStyleName(name); + } else if (badStyleValueWithSemicolonPattern.test(value)) { + warnStyleValueWithSemicolon(name, value); + } + + if (typeof value === 'number') { + if (isNaN(value)) { + warnStyleValueIsNaN(name, value); + } else if (!isFinite(value)) { + warnStyleValueIsInfinity(name, value); + } + } + }; +} + +var warnValidStyle$1 = warnValidStyle; + +/** + * Operations for dealing with CSS properties. + */ + +/** + * This creates a string that is expected to be equivalent to the style + * attribute generated by server-side rendering. It by-passes warnings and + * security checks so it's not safe to use this value for anything other than + * comparison. It is only used in DEV for SSR validation. + */ + +function createDangerousStringForStyles(styles) { + { + var serialized = ''; + var delimiter = ''; + + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + + var styleValue = styles[styleName]; + + if (styleValue != null) { + var isCustomProperty = styleName.indexOf('--') === 0; + serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':'; + serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty); + delimiter = ';'; + } + } + + return serialized || null; + } +} +/** + * Sets the value for multiple styles on a node. If a value is specified as + * '' (empty string), the corresponding style property will be unset. + * + * @param {DOMElement} node + * @param {object} styles + */ + +function setValueForStyles(node, styles) { + var style = node.style; + + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + + var isCustomProperty = styleName.indexOf('--') === 0; + + { + if (!isCustomProperty) { + warnValidStyle$1(styleName, styles[styleName]); + } + } + + var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty); + + if (styleName === 'float') { + styleName = 'cssFloat'; + } + + if (isCustomProperty) { + style.setProperty(styleName, styleValue); + } else { + style[styleName] = styleValue; + } + } +} + +function isValueEmpty(value) { + return value == null || typeof value === 'boolean' || value === ''; +} +/** + * Given {color: 'red', overflow: 'hidden'} returns { + * color: 'color', + * overflowX: 'overflow', + * overflowY: 'overflow', + * }. This can be read as "the overflowY property was set by the overflow + * shorthand". That is, the values are the property that each was derived from. + */ + + +function expandShorthandMap(styles) { + var expanded = {}; + + for (var key in styles) { + var longhands = shorthandToLonghand[key] || [key]; + + for (var i = 0; i < longhands.length; i++) { + expanded[longhands[i]] = key; + } + } + + return expanded; +} +/** + * When mixing shorthand and longhand property names, we warn during updates if + * we expect an incorrect result to occur. In particular, we warn for: + * + * Updating a shorthand property (longhand gets overwritten): + * {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'} + * becomes .style.font = 'baz' + * Removing a shorthand property (longhand gets lost too): + * {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'} + * becomes .style.font = '' + * Removing a longhand property (should revert to shorthand; doesn't): + * {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'} + * becomes .style.fontVariant = '' + */ + + +function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) { + { + if (!nextStyles) { + return; + } + + var expandedUpdates = expandShorthandMap(styleUpdates); + var expandedStyles = expandShorthandMap(nextStyles); + var warnedAbout = {}; + + for (var key in expandedUpdates) { + var originalKey = expandedUpdates[key]; + var correctOriginalKey = expandedStyles[key]; + + if (correctOriginalKey && originalKey !== correctOriginalKey) { + var warningKey = originalKey + ',' + correctOriginalKey; + + if (warnedAbout[warningKey]) { + continue; + } + + warnedAbout[warningKey] = true; + + error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey); + } + } + } +} + +// For HTML, certain tags should omit their close tag. We keep a list for +// those special-case tags. +var omittedCloseTags = { + area: true, + base: true, + br: true, + col: true, + embed: true, + hr: true, + img: true, + input: true, + keygen: true, + link: true, + meta: true, + param: true, + source: true, + track: true, + wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems. + +}; + +// `omittedCloseTags` except that `menuitem` should still have its closing tag. + +var voidElementTags = _assign({ + menuitem: true +}, omittedCloseTags); + +var HTML = '__html'; + +function assertValidProps(tag, props) { + if (!props) { + return; + } // Note the use of `==` which checks for null or undefined. + + + if (voidElementTags[tag]) { + if (!(props.children == null && props.dangerouslySetInnerHTML == null)) { + { + throw Error( tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." ); + } + } + } + + if (props.dangerouslySetInnerHTML != null) { + if (!(props.children == null)) { + { + throw Error( "Can only set one of `children` or `props.dangerouslySetInnerHTML`." ); + } + } + + if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) { + { + throw Error( "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://reactjs.org/link/dangerously-set-inner-html for more information." ); + } + } + } + + { + if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) { + error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.'); + } + } + + if (!(props.style == null || typeof props.style === 'object')) { + { + throw Error( "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." ); + } + } +} + +function isCustomComponent(tagName, props) { + if (tagName.indexOf('-') === -1) { + return typeof props.is === 'string'; + } + + switch (tagName) { + // These are reserved SVG and MathML elements. + // We don't mind this list too much because we expect it to never grow. + // The alternative is to track the namespace in a few places which is convoluted. + // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts + case 'annotation-xml': + case 'color-profile': + case 'font-face': + case 'font-face-src': + case 'font-face-uri': + case 'font-face-format': + case 'font-face-name': + case 'missing-glyph': + return false; + + default: + return true; + } +} + +// When adding attributes to the HTML or SVG allowed attribute list, be sure to +// also add them to this module to ensure casing and incorrect name +// warnings. +var possibleStandardNames = { + // HTML + accept: 'accept', + acceptcharset: 'acceptCharset', + 'accept-charset': 'acceptCharset', + accesskey: 'accessKey', + action: 'action', + allowfullscreen: 'allowFullScreen', + alt: 'alt', + as: 'as', + async: 'async', + autocapitalize: 'autoCapitalize', + autocomplete: 'autoComplete', + autocorrect: 'autoCorrect', + autofocus: 'autoFocus', + autoplay: 'autoPlay', + autosave: 'autoSave', + capture: 'capture', + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing', + challenge: 'challenge', + charset: 'charSet', + checked: 'checked', + children: 'children', + cite: 'cite', + class: 'className', + classid: 'classID', + classname: 'className', + cols: 'cols', + colspan: 'colSpan', + content: 'content', + contenteditable: 'contentEditable', + contextmenu: 'contextMenu', + controls: 'controls', + controlslist: 'controlsList', + coords: 'coords', + crossorigin: 'crossOrigin', + dangerouslysetinnerhtml: 'dangerouslySetInnerHTML', + data: 'data', + datetime: 'dateTime', + default: 'default', + defaultchecked: 'defaultChecked', + defaultvalue: 'defaultValue', + defer: 'defer', + dir: 'dir', + disabled: 'disabled', + disablepictureinpicture: 'disablePictureInPicture', + disableremoteplayback: 'disableRemotePlayback', + download: 'download', + draggable: 'draggable', + enctype: 'encType', + enterkeyhint: 'enterKeyHint', + for: 'htmlFor', + form: 'form', + formmethod: 'formMethod', + formaction: 'formAction', + formenctype: 'formEncType', + formnovalidate: 'formNoValidate', + formtarget: 'formTarget', + frameborder: 'frameBorder', + headers: 'headers', + height: 'height', + hidden: 'hidden', + high: 'high', + href: 'href', + hreflang: 'hrefLang', + htmlfor: 'htmlFor', + httpequiv: 'httpEquiv', + 'http-equiv': 'httpEquiv', + icon: 'icon', + id: 'id', + innerhtml: 'innerHTML', + inputmode: 'inputMode', + integrity: 'integrity', + is: 'is', + itemid: 'itemID', + itemprop: 'itemProp', + itemref: 'itemRef', + itemscope: 'itemScope', + itemtype: 'itemType', + keyparams: 'keyParams', + keytype: 'keyType', + kind: 'kind', + label: 'label', + lang: 'lang', + list: 'list', + loop: 'loop', + low: 'low', + manifest: 'manifest', + marginwidth: 'marginWidth', + marginheight: 'marginHeight', + max: 'max', + maxlength: 'maxLength', + media: 'media', + mediagroup: 'mediaGroup', + method: 'method', + min: 'min', + minlength: 'minLength', + multiple: 'multiple', + muted: 'muted', + name: 'name', + nomodule: 'noModule', + nonce: 'nonce', + novalidate: 'noValidate', + open: 'open', + optimum: 'optimum', + pattern: 'pattern', + placeholder: 'placeholder', + playsinline: 'playsInline', + poster: 'poster', + preload: 'preload', + profile: 'profile', + radiogroup: 'radioGroup', + readonly: 'readOnly', + referrerpolicy: 'referrerPolicy', + rel: 'rel', + required: 'required', + reversed: 'reversed', + role: 'role', + rows: 'rows', + rowspan: 'rowSpan', + sandbox: 'sandbox', + scope: 'scope', + scoped: 'scoped', + scrolling: 'scrolling', + seamless: 'seamless', + selected: 'selected', + shape: 'shape', + size: 'size', + sizes: 'sizes', + span: 'span', + spellcheck: 'spellCheck', + src: 'src', + srcdoc: 'srcDoc', + srclang: 'srcLang', + srcset: 'srcSet', + start: 'start', + step: 'step', + style: 'style', + summary: 'summary', + tabindex: 'tabIndex', + target: 'target', + title: 'title', + type: 'type', + usemap: 'useMap', + value: 'value', + width: 'width', + wmode: 'wmode', + wrap: 'wrap', + // SVG + about: 'about', + accentheight: 'accentHeight', + 'accent-height': 'accentHeight', + accumulate: 'accumulate', + additive: 'additive', + alignmentbaseline: 'alignmentBaseline', + 'alignment-baseline': 'alignmentBaseline', + allowreorder: 'allowReorder', + alphabetic: 'alphabetic', + amplitude: 'amplitude', + arabicform: 'arabicForm', + 'arabic-form': 'arabicForm', + ascent: 'ascent', + attributename: 'attributeName', + attributetype: 'attributeType', + autoreverse: 'autoReverse', + azimuth: 'azimuth', + basefrequency: 'baseFrequency', + baselineshift: 'baselineShift', + 'baseline-shift': 'baselineShift', + baseprofile: 'baseProfile', + bbox: 'bbox', + begin: 'begin', + bias: 'bias', + by: 'by', + calcmode: 'calcMode', + capheight: 'capHeight', + 'cap-height': 'capHeight', + clip: 'clip', + clippath: 'clipPath', + 'clip-path': 'clipPath', + clippathunits: 'clipPathUnits', + cliprule: 'clipRule', + 'clip-rule': 'clipRule', + color: 'color', + colorinterpolation: 'colorInterpolation', + 'color-interpolation': 'colorInterpolation', + colorinterpolationfilters: 'colorInterpolationFilters', + 'color-interpolation-filters': 'colorInterpolationFilters', + colorprofile: 'colorProfile', + 'color-profile': 'colorProfile', + colorrendering: 'colorRendering', + 'color-rendering': 'colorRendering', + contentscripttype: 'contentScriptType', + contentstyletype: 'contentStyleType', + cursor: 'cursor', + cx: 'cx', + cy: 'cy', + d: 'd', + datatype: 'datatype', + decelerate: 'decelerate', + descent: 'descent', + diffuseconstant: 'diffuseConstant', + direction: 'direction', + display: 'display', + divisor: 'divisor', + dominantbaseline: 'dominantBaseline', + 'dominant-baseline': 'dominantBaseline', + dur: 'dur', + dx: 'dx', + dy: 'dy', + edgemode: 'edgeMode', + elevation: 'elevation', + enablebackground: 'enableBackground', + 'enable-background': 'enableBackground', + end: 'end', + exponent: 'exponent', + externalresourcesrequired: 'externalResourcesRequired', + fill: 'fill', + fillopacity: 'fillOpacity', + 'fill-opacity': 'fillOpacity', + fillrule: 'fillRule', + 'fill-rule': 'fillRule', + filter: 'filter', + filterres: 'filterRes', + filterunits: 'filterUnits', + floodopacity: 'floodOpacity', + 'flood-opacity': 'floodOpacity', + floodcolor: 'floodColor', + 'flood-color': 'floodColor', + focusable: 'focusable', + fontfamily: 'fontFamily', + 'font-family': 'fontFamily', + fontsize: 'fontSize', + 'font-size': 'fontSize', + fontsizeadjust: 'fontSizeAdjust', + 'font-size-adjust': 'fontSizeAdjust', + fontstretch: 'fontStretch', + 'font-stretch': 'fontStretch', + fontstyle: 'fontStyle', + 'font-style': 'fontStyle', + fontvariant: 'fontVariant', + 'font-variant': 'fontVariant', + fontweight: 'fontWeight', + 'font-weight': 'fontWeight', + format: 'format', + from: 'from', + fx: 'fx', + fy: 'fy', + g1: 'g1', + g2: 'g2', + glyphname: 'glyphName', + 'glyph-name': 'glyphName', + glyphorientationhorizontal: 'glyphOrientationHorizontal', + 'glyph-orientation-horizontal': 'glyphOrientationHorizontal', + glyphorientationvertical: 'glyphOrientationVertical', + 'glyph-orientation-vertical': 'glyphOrientationVertical', + glyphref: 'glyphRef', + gradienttransform: 'gradientTransform', + gradientunits: 'gradientUnits', + hanging: 'hanging', + horizadvx: 'horizAdvX', + 'horiz-adv-x': 'horizAdvX', + horizoriginx: 'horizOriginX', + 'horiz-origin-x': 'horizOriginX', + ideographic: 'ideographic', + imagerendering: 'imageRendering', + 'image-rendering': 'imageRendering', + in2: 'in2', + in: 'in', + inlist: 'inlist', + intercept: 'intercept', + k1: 'k1', + k2: 'k2', + k3: 'k3', + k4: 'k4', + k: 'k', + kernelmatrix: 'kernelMatrix', + kernelunitlength: 'kernelUnitLength', + kerning: 'kerning', + keypoints: 'keyPoints', + keysplines: 'keySplines', + keytimes: 'keyTimes', + lengthadjust: 'lengthAdjust', + letterspacing: 'letterSpacing', + 'letter-spacing': 'letterSpacing', + lightingcolor: 'lightingColor', + 'lighting-color': 'lightingColor', + limitingconeangle: 'limitingConeAngle', + local: 'local', + markerend: 'markerEnd', + 'marker-end': 'markerEnd', + markerheight: 'markerHeight', + markermid: 'markerMid', + 'marker-mid': 'markerMid', + markerstart: 'markerStart', + 'marker-start': 'markerStart', + markerunits: 'markerUnits', + markerwidth: 'markerWidth', + mask: 'mask', + maskcontentunits: 'maskContentUnits', + maskunits: 'maskUnits', + mathematical: 'mathematical', + mode: 'mode', + numoctaves: 'numOctaves', + offset: 'offset', + opacity: 'opacity', + operator: 'operator', + order: 'order', + orient: 'orient', + orientation: 'orientation', + origin: 'origin', + overflow: 'overflow', + overlineposition: 'overlinePosition', + 'overline-position': 'overlinePosition', + overlinethickness: 'overlineThickness', + 'overline-thickness': 'overlineThickness', + paintorder: 'paintOrder', + 'paint-order': 'paintOrder', + panose1: 'panose1', + 'panose-1': 'panose1', + pathlength: 'pathLength', + patterncontentunits: 'patternContentUnits', + patterntransform: 'patternTransform', + patternunits: 'patternUnits', + pointerevents: 'pointerEvents', + 'pointer-events': 'pointerEvents', + points: 'points', + pointsatx: 'pointsAtX', + pointsaty: 'pointsAtY', + pointsatz: 'pointsAtZ', + prefix: 'prefix', + preservealpha: 'preserveAlpha', + preserveaspectratio: 'preserveAspectRatio', + primitiveunits: 'primitiveUnits', + property: 'property', + r: 'r', + radius: 'radius', + refx: 'refX', + refy: 'refY', + renderingintent: 'renderingIntent', + 'rendering-intent': 'renderingIntent', + repeatcount: 'repeatCount', + repeatdur: 'repeatDur', + requiredextensions: 'requiredExtensions', + requiredfeatures: 'requiredFeatures', + resource: 'resource', + restart: 'restart', + result: 'result', + results: 'results', + rotate: 'rotate', + rx: 'rx', + ry: 'ry', + scale: 'scale', + security: 'security', + seed: 'seed', + shaperendering: 'shapeRendering', + 'shape-rendering': 'shapeRendering', + slope: 'slope', + spacing: 'spacing', + specularconstant: 'specularConstant', + specularexponent: 'specularExponent', + speed: 'speed', + spreadmethod: 'spreadMethod', + startoffset: 'startOffset', + stddeviation: 'stdDeviation', + stemh: 'stemh', + stemv: 'stemv', + stitchtiles: 'stitchTiles', + stopcolor: 'stopColor', + 'stop-color': 'stopColor', + stopopacity: 'stopOpacity', + 'stop-opacity': 'stopOpacity', + strikethroughposition: 'strikethroughPosition', + 'strikethrough-position': 'strikethroughPosition', + strikethroughthickness: 'strikethroughThickness', + 'strikethrough-thickness': 'strikethroughThickness', + string: 'string', + stroke: 'stroke', + strokedasharray: 'strokeDasharray', + 'stroke-dasharray': 'strokeDasharray', + strokedashoffset: 'strokeDashoffset', + 'stroke-dashoffset': 'strokeDashoffset', + strokelinecap: 'strokeLinecap', + 'stroke-linecap': 'strokeLinecap', + strokelinejoin: 'strokeLinejoin', + 'stroke-linejoin': 'strokeLinejoin', + strokemiterlimit: 'strokeMiterlimit', + 'stroke-miterlimit': 'strokeMiterlimit', + strokewidth: 'strokeWidth', + 'stroke-width': 'strokeWidth', + strokeopacity: 'strokeOpacity', + 'stroke-opacity': 'strokeOpacity', + suppresscontenteditablewarning: 'suppressContentEditableWarning', + suppresshydrationwarning: 'suppressHydrationWarning', + surfacescale: 'surfaceScale', + systemlanguage: 'systemLanguage', + tablevalues: 'tableValues', + targetx: 'targetX', + targety: 'targetY', + textanchor: 'textAnchor', + 'text-anchor': 'textAnchor', + textdecoration: 'textDecoration', + 'text-decoration': 'textDecoration', + textlength: 'textLength', + textrendering: 'textRendering', + 'text-rendering': 'textRendering', + to: 'to', + transform: 'transform', + typeof: 'typeof', + u1: 'u1', + u2: 'u2', + underlineposition: 'underlinePosition', + 'underline-position': 'underlinePosition', + underlinethickness: 'underlineThickness', + 'underline-thickness': 'underlineThickness', + unicode: 'unicode', + unicodebidi: 'unicodeBidi', + 'unicode-bidi': 'unicodeBidi', + unicoderange: 'unicodeRange', + 'unicode-range': 'unicodeRange', + unitsperem: 'unitsPerEm', + 'units-per-em': 'unitsPerEm', + unselectable: 'unselectable', + valphabetic: 'vAlphabetic', + 'v-alphabetic': 'vAlphabetic', + values: 'values', + vectoreffect: 'vectorEffect', + 'vector-effect': 'vectorEffect', + version: 'version', + vertadvy: 'vertAdvY', + 'vert-adv-y': 'vertAdvY', + vertoriginx: 'vertOriginX', + 'vert-origin-x': 'vertOriginX', + vertoriginy: 'vertOriginY', + 'vert-origin-y': 'vertOriginY', + vhanging: 'vHanging', + 'v-hanging': 'vHanging', + videographic: 'vIdeographic', + 'v-ideographic': 'vIdeographic', + viewbox: 'viewBox', + viewtarget: 'viewTarget', + visibility: 'visibility', + vmathematical: 'vMathematical', + 'v-mathematical': 'vMathematical', + vocab: 'vocab', + widths: 'widths', + wordspacing: 'wordSpacing', + 'word-spacing': 'wordSpacing', + writingmode: 'writingMode', + 'writing-mode': 'writingMode', + x1: 'x1', + x2: 'x2', + x: 'x', + xchannelselector: 'xChannelSelector', + xheight: 'xHeight', + 'x-height': 'xHeight', + xlinkactuate: 'xlinkActuate', + 'xlink:actuate': 'xlinkActuate', + xlinkarcrole: 'xlinkArcrole', + 'xlink:arcrole': 'xlinkArcrole', + xlinkhref: 'xlinkHref', + 'xlink:href': 'xlinkHref', + xlinkrole: 'xlinkRole', + 'xlink:role': 'xlinkRole', + xlinkshow: 'xlinkShow', + 'xlink:show': 'xlinkShow', + xlinktitle: 'xlinkTitle', + 'xlink:title': 'xlinkTitle', + xlinktype: 'xlinkType', + 'xlink:type': 'xlinkType', + xmlbase: 'xmlBase', + 'xml:base': 'xmlBase', + xmllang: 'xmlLang', + 'xml:lang': 'xmlLang', + xmlns: 'xmlns', + 'xml:space': 'xmlSpace', + xmlnsxlink: 'xmlnsXlink', + 'xmlns:xlink': 'xmlnsXlink', + xmlspace: 'xmlSpace', + y1: 'y1', + y2: 'y2', + y: 'y', + ychannelselector: 'yChannelSelector', + z: 'z', + zoomandpan: 'zoomAndPan' +}; + +var ariaProperties = { + 'aria-current': 0, + // state + 'aria-details': 0, + 'aria-disabled': 0, + // state + 'aria-hidden': 0, + // state + 'aria-invalid': 0, + // state + 'aria-keyshortcuts': 0, + 'aria-label': 0, + 'aria-roledescription': 0, + // Widget Attributes + 'aria-autocomplete': 0, + 'aria-checked': 0, + 'aria-expanded': 0, + 'aria-haspopup': 0, + 'aria-level': 0, + 'aria-modal': 0, + 'aria-multiline': 0, + 'aria-multiselectable': 0, + 'aria-orientation': 0, + 'aria-placeholder': 0, + 'aria-pressed': 0, + 'aria-readonly': 0, + 'aria-required': 0, + 'aria-selected': 0, + 'aria-sort': 0, + 'aria-valuemax': 0, + 'aria-valuemin': 0, + 'aria-valuenow': 0, + 'aria-valuetext': 0, + // Live Region Attributes + 'aria-atomic': 0, + 'aria-busy': 0, + 'aria-live': 0, + 'aria-relevant': 0, + // Drag-and-Drop Attributes + 'aria-dropeffect': 0, + 'aria-grabbed': 0, + // Relationship Attributes + 'aria-activedescendant': 0, + 'aria-colcount': 0, + 'aria-colindex': 0, + 'aria-colspan': 0, + 'aria-controls': 0, + 'aria-describedby': 0, + 'aria-errormessage': 0, + 'aria-flowto': 0, + 'aria-labelledby': 0, + 'aria-owns': 0, + 'aria-posinset': 0, + 'aria-rowcount': 0, + 'aria-rowindex': 0, + 'aria-rowspan': 0, + 'aria-setsize': 0 +}; + +var warnedProperties = {}; +var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); +var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); +var hasOwnProperty$1 = Object.prototype.hasOwnProperty; + +function validateProperty(tagName, name) { + { + if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) { + return true; + } + + if (rARIACamel.test(name)) { + var ariaName = 'aria-' + name.slice(4).toLowerCase(); + var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. + + if (correctName == null) { + error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name); + + warnedProperties[name] = true; + return true; + } // aria-* attributes should be lowercase; suggest the lowercase version. + + + if (name !== correctName) { + error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName); + + warnedProperties[name] = true; + return true; + } + } + + if (rARIA.test(name)) { + var lowerCasedName = name.toLowerCase(); + var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. + + if (standardName == null) { + warnedProperties[name] = true; + return false; + } // aria-* attributes should be lowercase; suggest the lowercase version. + + + if (name !== standardName) { + error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName); + + warnedProperties[name] = true; + return true; + } + } + } + + return true; +} + +function warnInvalidARIAProps(type, props) { + { + var invalidProps = []; + + for (var key in props) { + var isValid = validateProperty(type, key); + + if (!isValid) { + invalidProps.push(key); + } + } + + var unknownPropString = invalidProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); + + if (invalidProps.length === 1) { + error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); + } else if (invalidProps.length > 1) { + error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); + } + } +} + +function validateProperties(type, props) { + if (isCustomComponent(type, props)) { + return; + } + + warnInvalidARIAProps(type, props); +} + +var didWarnValueNull = false; +function validateProperties$1(type, props) { + { + if (type !== 'input' && type !== 'textarea' && type !== 'select') { + return; + } + + if (props != null && props.value === null && !didWarnValueNull) { + didWarnValueNull = true; + + if (type === 'select' && props.multiple) { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type); + } else { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type); + } + } + } +} + +var validateProperty$1 = function () {}; + +{ + var warnedProperties$1 = {}; + var _hasOwnProperty = Object.prototype.hasOwnProperty; + var EVENT_NAME_REGEX = /^on./; + var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/; + var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); + var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + + validateProperty$1 = function (tagName, name, value, eventRegistry) { + if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) { + return true; + } + + var lowerCasedName = name.toLowerCase(); + + if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') { + error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.'); + + warnedProperties$1[name] = true; + return true; + } // We can't rely on the event system being injected on the server. + + + if (eventRegistry != null) { + var registrationNameDependencies = eventRegistry.registrationNameDependencies, + possibleRegistrationNames = eventRegistry.possibleRegistrationNames; + + if (registrationNameDependencies.hasOwnProperty(name)) { + return true; + } + + var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null; + + if (registrationName != null) { + error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName); + + warnedProperties$1[name] = true; + return true; + } + + if (EVENT_NAME_REGEX.test(name)) { + error('Unknown event handler property `%s`. It will be ignored.', name); + + warnedProperties$1[name] = true; + return true; + } + } else if (EVENT_NAME_REGEX.test(name)) { + // If no event plugins have been injected, we are in a server environment. + // So we can't tell if the event name is correct for sure, but we can filter + // out known bad ones like `onclick`. We can't suggest a specific replacement though. + if (INVALID_EVENT_NAME_REGEX.test(name)) { + error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name); + } + + warnedProperties$1[name] = true; + return true; + } // Let the ARIA attribute hook validate ARIA attributes + + + if (rARIA$1.test(name) || rARIACamel$1.test(name)) { + return true; + } + + if (lowerCasedName === 'innerhtml') { + error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.'); + + warnedProperties$1[name] = true; + return true; + } + + if (lowerCasedName === 'aria') { + error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.'); + + warnedProperties$1[name] = true; + return true; + } + + if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') { + error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value); + + warnedProperties$1[name] = true; + return true; + } + + if (typeof value === 'number' && isNaN(value)) { + error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name); + + warnedProperties$1[name] = true; + return true; + } + + var propertyInfo = getPropertyInfo(name); + var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config. + + if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { + var standardName = possibleStandardNames[lowerCasedName]; + + if (standardName !== name) { + error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName); + + warnedProperties$1[name] = true; + return true; + } + } else if (!isReserved && name !== lowerCasedName) { + // Unknown attributes should have lowercase casing since that's how they + // will be cased anyway with server rendering. + error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName); + + warnedProperties$1[name] = true; + return true; + } + + if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + if (value) { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name); + } else { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name); + } + + warnedProperties$1[name] = true; + return true; + } // Now that we've validated casing, do not validate + // data types for reserved props + + + if (isReserved) { + return true; + } // Warn when a known attribute is a bad type + + + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + warnedProperties$1[name] = true; + return false; + } // Warn when passing the strings 'false' or 'true' into a boolean prop + + + if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) { + error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value); + + warnedProperties$1[name] = true; + return true; + } + + return true; + }; +} + +var warnUnknownProperties = function (type, props, eventRegistry) { + { + var unknownProps = []; + + for (var key in props) { + var isValid = validateProperty$1(type, key, props[key], eventRegistry); + + if (!isValid) { + unknownProps.push(key); + } + } + + var unknownPropString = unknownProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); + + if (unknownProps.length === 1) { + error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); + } else if (unknownProps.length > 1) { + error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); + } + } +}; + +function validateProperties$2(type, props, eventRegistry) { + if (isCustomComponent(type, props)) { + return; + } + + warnUnknownProperties(type, props, eventRegistry); +} + +var IS_EVENT_HANDLE_NON_MANAGED_NODE = 1; +var IS_NON_DELEGATED = 1 << 1; +var IS_CAPTURE_PHASE = 1 << 2; +var IS_REPLAYED = 1 << 4; +// set to LEGACY_FB_SUPPORT. LEGACY_FB_SUPPORT only gets set when +// we call willDeferLaterForLegacyFBSupport, thus not bailing out +// will result in endless cycles like an infinite loop. +// We also don't want to defer during event replaying. + +var SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS = IS_EVENT_HANDLE_NON_MANAGED_NODE | IS_NON_DELEGATED | IS_CAPTURE_PHASE; + +/** + * Gets the target node from a native browser event by accounting for + * inconsistencies in browser DOM APIs. + * + * @param {object} nativeEvent Native browser event. + * @return {DOMEventTarget} Target node. + */ + +function getEventTarget(nativeEvent) { + // Fallback to nativeEvent.srcElement for IE9 + // https://github.com/facebook/react/issues/12506 + var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963 + + if (target.correspondingUseElement) { + target = target.correspondingUseElement; + } // Safari may fire events on text nodes (Node.TEXT_NODE is 3). + // @see http://www.quirksmode.org/js/events_properties.html + + + return target.nodeType === TEXT_NODE ? target.parentNode : target; +} + +var restoreImpl = null; +var restoreTarget = null; +var restoreQueue = null; + +function restoreStateOfTarget(target) { + // We perform this translation at the end of the event loop so that we + // always receive the correct fiber here + var internalInstance = getInstanceFromNode(target); + + if (!internalInstance) { + // Unmounted + return; + } + + if (!(typeof restoreImpl === 'function')) { + { + throw Error( "setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted. + + if (stateNode) { + var _props = getFiberCurrentPropsFromNode(stateNode); + + restoreImpl(internalInstance.stateNode, internalInstance.type, _props); + } +} + +function setRestoreImplementation(impl) { + restoreImpl = impl; +} +function enqueueStateRestore(target) { + if (restoreTarget) { + if (restoreQueue) { + restoreQueue.push(target); + } else { + restoreQueue = [target]; + } + } else { + restoreTarget = target; + } +} +function needsStateRestore() { + return restoreTarget !== null || restoreQueue !== null; +} +function restoreStateIfNeeded() { + if (!restoreTarget) { + return; + } + + var target = restoreTarget; + var queuedTargets = restoreQueue; + restoreTarget = null; + restoreQueue = null; + restoreStateOfTarget(target); + + if (queuedTargets) { + for (var i = 0; i < queuedTargets.length; i++) { + restoreStateOfTarget(queuedTargets[i]); + } + } +} + +// the renderer. Such as when we're dispatching events or if third party +// libraries need to call batchedUpdates. Eventually, this API will go away when +// everything is batched by default. We'll then have a similar API to opt-out of +// scheduled work and instead do synchronous work. +// Defaults + +var batchedUpdatesImpl = function (fn, bookkeeping) { + return fn(bookkeeping); +}; + +var discreteUpdatesImpl = function (fn, a, b, c, d) { + return fn(a, b, c, d); +}; + +var flushDiscreteUpdatesImpl = function () {}; + +var batchedEventUpdatesImpl = batchedUpdatesImpl; +var isInsideEventHandler = false; +var isBatchingEventUpdates = false; + +function finishEventHandler() { + // Here we wait until all updates have propagated, which is important + // when using controlled components within layers: + // https://github.com/facebook/react/issues/1698 + // Then we restore state of any controlled component. + var controlledComponentsHavePendingUpdates = needsStateRestore(); + + if (controlledComponentsHavePendingUpdates) { + // If a controlled event was fired, we may need to restore the state of + // the DOM node back to the controlled value. This is necessary when React + // bails out of the update without touching the DOM. + flushDiscreteUpdatesImpl(); + restoreStateIfNeeded(); + } +} + +function batchedUpdates(fn, bookkeeping) { + if (isInsideEventHandler) { + // If we are currently inside another batch, we need to wait until it + // fully completes before restoring state. + return fn(bookkeeping); + } + + isInsideEventHandler = true; + + try { + return batchedUpdatesImpl(fn, bookkeeping); + } finally { + isInsideEventHandler = false; + finishEventHandler(); + } +} +function batchedEventUpdates(fn, a, b) { + if (isBatchingEventUpdates) { + // If we are currently inside another batch, we need to wait until it + // fully completes before restoring state. + return fn(a, b); + } + + isBatchingEventUpdates = true; + + try { + return batchedEventUpdatesImpl(fn, a, b); + } finally { + isBatchingEventUpdates = false; + finishEventHandler(); + } +} +function discreteUpdates(fn, a, b, c, d) { + var prevIsInsideEventHandler = isInsideEventHandler; + isInsideEventHandler = true; + + try { + return discreteUpdatesImpl(fn, a, b, c, d); + } finally { + isInsideEventHandler = prevIsInsideEventHandler; + + if (!isInsideEventHandler) { + finishEventHandler(); + } + } +} +function flushDiscreteUpdatesIfNeeded(timeStamp) { + { + if (!isInsideEventHandler) { + flushDiscreteUpdatesImpl(); + } + } +} +function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) { + batchedUpdatesImpl = _batchedUpdatesImpl; + discreteUpdatesImpl = _discreteUpdatesImpl; + flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl; + batchedEventUpdatesImpl = _batchedEventUpdatesImpl; +} + +function isInteractive(tag) { + return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea'; +} + +function shouldPreventMouseEvent(name, type, props) { + switch (name) { + case 'onClick': + case 'onClickCapture': + case 'onDoubleClick': + case 'onDoubleClickCapture': + case 'onMouseDown': + case 'onMouseDownCapture': + case 'onMouseMove': + case 'onMouseMoveCapture': + case 'onMouseUp': + case 'onMouseUpCapture': + case 'onMouseEnter': + return !!(props.disabled && isInteractive(type)); + + default: + return false; + } +} +/** + * @param {object} inst The instance, which is the source of events. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @return {?function} The stored callback. + */ + + +function getListener(inst, registrationName) { + var stateNode = inst.stateNode; + + if (stateNode === null) { + // Work in progress (ex: onload events in incremental mode). + return null; + } + + var props = getFiberCurrentPropsFromNode(stateNode); + + if (props === null) { + // Work in progress. + return null; + } + + var listener = props[registrationName]; + + if (shouldPreventMouseEvent(registrationName, inst.type, props)) { + return null; + } + + if (!(!listener || typeof listener === 'function')) { + { + throw Error( "Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type." ); + } + } + + return listener; +} + +var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners +// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + +if (canUseDOM) { + try { + var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value + + Object.defineProperty(options, 'passive', { + get: function () { + passiveBrowserEventsSupported = true; + } + }); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (e) { + passiveBrowserEventsSupported = false; + } +} + +function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) { + var funcArgs = Array.prototype.slice.call(arguments, 3); + + try { + func.apply(context, funcArgs); + } catch (error) { + this.onError(error); + } +} + +var invokeGuardedCallbackImpl = invokeGuardedCallbackProd; + +{ + // In DEV mode, we swap out invokeGuardedCallback for a special version + // that plays more nicely with the browser's DevTools. The idea is to preserve + // "Pause on exceptions" behavior. Because React wraps all user-provided + // functions in invokeGuardedCallback, and the production version of + // invokeGuardedCallback uses a try-catch, all user exceptions are treated + // like caught exceptions, and the DevTools won't pause unless the developer + // takes the extra step of enabling pause on caught exceptions. This is + // unintuitive, though, because even though React has caught the error, from + // the developer's perspective, the error is uncaught. + // + // To preserve the expected "Pause on exceptions" behavior, we don't use a + // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake + // DOM node, and call the user-provided callback from inside an event handler + // for that fake event. If the callback throws, the error is "captured" using + // a global event handler. But because the error happens in a different + // event loop context, it does not interrupt the normal program flow. + // Effectively, this gives us try-catch behavior without actually using + // try-catch. Neat! + // Check that the browser supports the APIs we need to implement our special + // DEV version of invokeGuardedCallback + if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { + var fakeNode = document.createElement('react'); + + invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) { + // If document doesn't exist we know for sure we will crash in this method + // when we call document.createEvent(). However this can cause confusing + // errors: https://github.com/facebookincubator/create-react-app/issues/3482 + // So we preemptively throw with a better message instead. + if (!(typeof document !== 'undefined')) { + { + throw Error( "The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous." ); + } + } + + var evt = document.createEvent('Event'); + var didCall = false; // Keeps track of whether the user-provided callback threw an error. We + // set this to true at the beginning, then set it to false right after + // calling the function. If the function errors, `didError` will never be + // set to false. This strategy works even if the browser is flaky and + // fails to call our global error handler, because it doesn't rely on + // the error event at all. + + var didError = true; // Keeps track of the value of window.event so that we can reset it + // during the callback to let user code access window.event in the + // browsers that support it. + + var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event + // dispatching: https://github.com/facebook/react/issues/13688 + + var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); + + function restoreAfterDispatch() { + // We immediately remove the callback from event listeners so that + // nested `invokeGuardedCallback` calls do not clash. Otherwise, a + // nested call would trigger the fake event handlers of any call higher + // in the stack. + fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the + // window.event assignment in both IE <= 10 as they throw an error + // "Member not found" in strict mode, and in Firefox which does not + // support window.event. + + if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) { + window.event = windowEvent; + } + } // Create an event handler for our fake event. We will synchronously + // dispatch our fake event using `dispatchEvent`. Inside the handler, we + // call the user-provided callback. + + + var funcArgs = Array.prototype.slice.call(arguments, 3); + + function callCallback() { + didCall = true; + restoreAfterDispatch(); + func.apply(context, funcArgs); + didError = false; + } // Create a global error event handler. We use this to capture the value + // that was thrown. It's possible that this error handler will fire more + // than once; for example, if non-React code also calls `dispatchEvent` + // and a handler for that event throws. We should be resilient to most of + // those cases. Even if our error event handler fires more than once, the + // last error event is always used. If the callback actually does error, + // we know that the last error event is the correct one, because it's not + // possible for anything else to have happened in between our callback + // erroring and the code that follows the `dispatchEvent` call below. If + // the callback doesn't error, but the error event was fired, we know to + // ignore it because `didError` will be false, as described above. + + + var error; // Use this to track whether the error event is ever called. + + var didSetError = false; + var isCrossOriginError = false; + + function handleWindowError(event) { + error = event.error; + didSetError = true; + + if (error === null && event.colno === 0 && event.lineno === 0) { + isCrossOriginError = true; + } + + if (event.defaultPrevented) { + // Some other error handler has prevented default. + // Browsers silence the error report if this happens. + // We'll remember this to later decide whether to log it or not. + if (error != null && typeof error === 'object') { + try { + error._suppressLogging = true; + } catch (inner) {// Ignore. + } + } + } + } // Create a fake event type. + + + var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers + + window.addEventListener('error', handleWindowError); + fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function + // errors, it will trigger our global error handler. + + evt.initEvent(evtType, false, false); + fakeNode.dispatchEvent(evt); + + if (windowEventDescriptor) { + Object.defineProperty(window, 'event', windowEventDescriptor); + } + + if (didCall && didError) { + if (!didSetError) { + // The callback errored, but the error event never fired. + error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.'); + } else if (isCrossOriginError) { + error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://reactjs.org/link/crossorigin-error for more information.'); + } + + this.onError(error); + } // Remove our event listeners + + + window.removeEventListener('error', handleWindowError); + + if (!didCall) { + // Something went really wrong, and our event was not dispatched. + // https://github.com/facebook/react/issues/16734 + // https://github.com/facebook/react/issues/16585 + // Fall back to the production implementation. + restoreAfterDispatch(); + return invokeGuardedCallbackProd.apply(this, arguments); + } + }; + } +} + +var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl; + +var hasError = false; +var caughtError = null; // Used by event system to capture/rethrow the first error. + +var hasRethrowError = false; +var rethrowError = null; +var reporter = { + onError: function (error) { + hasError = true; + caughtError = error; + } +}; +/** + * Call a function while guarding against errors that happens within it. + * Returns an error if it throws, otherwise null. + * + * In production, this is implemented using a try-catch. The reason we don't + * use a try-catch directly is so that we can swap out a different + * implementation in DEV mode. + * + * @param {String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} context The context to use when calling the function + * @param {...*} args Arguments for function + */ + +function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) { + hasError = false; + caughtError = null; + invokeGuardedCallbackImpl$1.apply(reporter, arguments); +} +/** + * Same as invokeGuardedCallback, but instead of returning an error, it stores + * it in a global so it can be rethrown by `rethrowCaughtError` later. + * TODO: See if caughtError and rethrowError can be unified. + * + * @param {String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} context The context to use when calling the function + * @param {...*} args Arguments for function + */ + +function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) { + invokeGuardedCallback.apply(this, arguments); + + if (hasError) { + var error = clearCaughtError(); + + if (!hasRethrowError) { + hasRethrowError = true; + rethrowError = error; + } + } +} +/** + * During execution of guarded functions we will capture the first error which + * we will rethrow to be handled by the top level error handler. + */ + +function rethrowCaughtError() { + if (hasRethrowError) { + var error = rethrowError; + hasRethrowError = false; + rethrowError = null; + throw error; + } +} +function hasCaughtError() { + return hasError; +} +function clearCaughtError() { + if (hasError) { + var error = caughtError; + hasError = false; + caughtError = null; + return error; + } else { + { + { + throw Error( "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } +} + +/** + * `ReactInstanceMap` maintains a mapping from a public facing stateful + * instance (key) and the internal representation (value). This allows public + * methods to accept the user facing instance as an argument and map them back + * to internal methods. + * + * Note that this module is currently shared and assumed to be stateless. + * If this becomes an actual Map, that will break. + */ +function get(key) { + return key._reactInternals; +} +function has(key) { + return key._reactInternals !== undefined; +} +function set(key, value) { + key._reactInternals = value; +} + +// Don't change these two values. They're used by React Dev Tools. +var NoFlags = +/* */ +0; +var PerformedWork = +/* */ +1; // You can change the rest (and add more). + +var Placement = +/* */ +2; +var Update = +/* */ +4; +var PlacementAndUpdate = +/* */ +6; +var Deletion = +/* */ +8; +var ContentReset = +/* */ +16; +var Callback = +/* */ +32; +var DidCapture = +/* */ +64; +var Ref = +/* */ +128; +var Snapshot = +/* */ +256; +var Passive = +/* */ +512; // TODO (effects) Remove this bit once the new reconciler is synced to the old. + +var PassiveUnmountPendingDev = +/* */ +8192; +var Hydrating = +/* */ +1024; +var HydratingAndUpdate = +/* */ +1028; // Passive & Update & Callback & Ref & Snapshot + +var LifecycleEffectMask = +/* */ +932; // Union of all host effects + +var HostEffectMask = +/* */ +2047; // These are not really side effects, but we still reuse this field. + +var Incomplete = +/* */ +2048; +var ShouldCapture = +/* */ +4096; +var ForceUpdateForLegacySuspense = +/* */ +16384; // Static tags describe aspects of a fiber that are not specific to a render, + +var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; +function getNearestMountedFiber(fiber) { + var node = fiber; + var nearestMounted = fiber; + + if (!fiber.alternate) { + // If there is no alternate, this might be a new tree that isn't inserted + // yet. If it is, then it will have a pending insertion effect on it. + var nextNode = node; + + do { + node = nextNode; + + if ((node.flags & (Placement | Hydrating)) !== NoFlags) { + // This is an insertion or in-progress hydration. The nearest possible + // mounted fiber is the parent but we need to continue to figure out + // if that one is still mounted. + nearestMounted = node.return; + } + + nextNode = node.return; + } while (nextNode); + } else { + while (node.return) { + node = node.return; + } + } + + if (node.tag === HostRoot) { + // TODO: Check if this was a nested HostRoot when used with + // renderContainerIntoSubtree. + return nearestMounted; + } // If we didn't hit the root, that means that we're in an disconnected tree + // that has been unmounted. + + + return null; +} +function getSuspenseInstanceFromFiber(fiber) { + if (fiber.tag === SuspenseComponent) { + var suspenseState = fiber.memoizedState; + + if (suspenseState === null) { + var current = fiber.alternate; + + if (current !== null) { + suspenseState = current.memoizedState; + } + } + + if (suspenseState !== null) { + return suspenseState.dehydrated; + } + } + + return null; +} +function getContainerFromFiber(fiber) { + return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null; +} +function isFiberMounted(fiber) { + return getNearestMountedFiber(fiber) === fiber; +} +function isMounted(component) { + { + var owner = ReactCurrentOwner.current; + + if (owner !== null && owner.tag === ClassComponent) { + var ownerFiber = owner; + var instance = ownerFiber.stateNode; + + if (!instance._warnedAboutRefsInRender) { + error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component'); + } + + instance._warnedAboutRefsInRender = true; + } + } + + var fiber = get(component); + + if (!fiber) { + return false; + } + + return getNearestMountedFiber(fiber) === fiber; +} + +function assertIsMounted(fiber) { + if (!(getNearestMountedFiber(fiber) === fiber)) { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } +} + +function findCurrentFiberUsingSlowPath(fiber) { + var alternate = fiber.alternate; + + if (!alternate) { + // If there is no alternate, then we only need to check if it is mounted. + var nearestMounted = getNearestMountedFiber(fiber); + + if (!(nearestMounted !== null)) { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + + if (nearestMounted !== fiber) { + return null; + } + + return fiber; + } // If we have two possible branches, we'll walk backwards up to the root + // to see what path the root points to. On the way we may hit one of the + // special cases and we'll deal with them. + + + var a = fiber; + var b = alternate; + + while (true) { + var parentA = a.return; + + if (parentA === null) { + // We're at the root. + break; + } + + var parentB = parentA.alternate; + + if (parentB === null) { + // There is no alternate. This is an unusual case. Currently, it only + // happens when a Suspense component is hidden. An extra fragment fiber + // is inserted in between the Suspense fiber and its children. Skip + // over this extra fragment fiber and proceed to the next parent. + var nextParent = parentA.return; + + if (nextParent !== null) { + a = b = nextParent; + continue; + } // If there's no parent, we're at the root. + + + break; + } // If both copies of the parent fiber point to the same child, we can + // assume that the child is current. This happens when we bailout on low + // priority: the bailed out fiber's child reuses the current child. + + + if (parentA.child === parentB.child) { + var child = parentA.child; + + while (child) { + if (child === a) { + // We've determined that A is the current branch. + assertIsMounted(parentA); + return fiber; + } + + if (child === b) { + // We've determined that B is the current branch. + assertIsMounted(parentA); + return alternate; + } + + child = child.sibling; + } // We should never have an alternate for any mounting node. So the only + // way this could possibly happen is if this was unmounted, if at all. + + + { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + } + + if (a.return !== b.return) { + // The return pointer of A and the return pointer of B point to different + // fibers. We assume that return pointers never criss-cross, so A must + // belong to the child set of A.return, and B must belong to the child + // set of B.return. + a = parentA; + b = parentB; + } else { + // The return pointers point to the same fiber. We'll have to use the + // default, slow path: scan the child sets of each parent alternate to see + // which child belongs to which set. + // + // Search parent A's child set + var didFindChild = false; + var _child = parentA.child; + + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentA; + b = parentB; + break; + } + + if (_child === b) { + didFindChild = true; + b = parentA; + a = parentB; + break; + } + + _child = _child.sibling; + } + + if (!didFindChild) { + // Search parent B's child set + _child = parentB.child; + + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentB; + b = parentA; + break; + } + + if (_child === b) { + didFindChild = true; + b = parentB; + a = parentA; + break; + } + + _child = _child.sibling; + } + + if (!didFindChild) { + { + throw Error( "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue." ); + } + } + } + } + + if (!(a.alternate === b)) { + { + throw Error( "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } // If the root is not a host container, we're in a disconnected tree. I.e. + // unmounted. + + + if (!(a.tag === HostRoot)) { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + + if (a.stateNode.current === a) { + // We've determined that A is the current branch. + return fiber; + } // Otherwise B has to be current branch. + + + return alternate; +} +function findCurrentHostFiber(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); + + if (!currentParent) { + return null; + } // Next we'll drill down this component to find the first HostComponent/Text. + + + var node = currentParent; + + while (true) { + if (node.tag === HostComponent || node.tag === HostText) { + return node; + } else if (node.child) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === currentParent) { + return null; + } + + while (!node.sibling) { + if (!node.return || node.return === currentParent) { + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } // Flow needs the return null here, but ESLint complains about it. + // eslint-disable-next-line no-unreachable + + + return null; +} +function findCurrentHostFiberWithNoPortals(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); + + if (!currentParent) { + return null; + } // Next we'll drill down this component to find the first HostComponent/Text. + + + var node = currentParent; + + while (true) { + if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) { + return node; + } else if (node.child && node.tag !== HostPortal) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === currentParent) { + return null; + } + + while (!node.sibling) { + if (!node.return || node.return === currentParent) { + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } // Flow needs the return null here, but ESLint complains about it. + // eslint-disable-next-line no-unreachable + + + return null; +} +function doesFiberContain(parentFiber, childFiber) { + var node = childFiber; + var parentFiberAlternate = parentFiber.alternate; + + while (node !== null) { + if (node === parentFiber || node === parentFiberAlternate) { + return true; + } + + node = node.return; + } + + return false; +} + +var attemptUserBlockingHydration; +function setAttemptUserBlockingHydration(fn) { + attemptUserBlockingHydration = fn; +} +var attemptContinuousHydration; +function setAttemptContinuousHydration(fn) { + attemptContinuousHydration = fn; +} +var attemptHydrationAtCurrentPriority; +function setAttemptHydrationAtCurrentPriority(fn) { + attemptHydrationAtCurrentPriority = fn; +} +var attemptHydrationAtPriority; +function setAttemptHydrationAtPriority(fn) { + attemptHydrationAtPriority = fn; +} // TODO: Upgrade this definition once we're on a newer version of Flow that +var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed. + +var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout. +// if the last target was dehydrated. + +var queuedFocus = null; +var queuedDrag = null; +var queuedMouse = null; // For pointer events there can be one latest event per pointerId. + +var queuedPointers = new Map(); +var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too. + +var queuedExplicitHydrationTargets = []; +function hasQueuedDiscreteEvents() { + return queuedDiscreteEvents.length > 0; +} +var discreteReplayableEvents = ['mousedown', 'mouseup', 'touchcancel', 'touchend', 'touchstart', 'auxclick', 'dblclick', 'pointercancel', 'pointerdown', 'pointerup', 'dragend', 'dragstart', 'drop', 'compositionend', 'compositionstart', 'keydown', 'keypress', 'keyup', 'input', 'textInput', // Intentionally camelCase +'copy', 'cut', 'paste', 'click', 'change', 'contextmenu', 'reset', 'submit']; +function isReplayableDiscreteEvent(eventType) { + return discreteReplayableEvents.indexOf(eventType) > -1; +} + +function createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + return { + blockedOn: blockedOn, + domEventName: domEventName, + eventSystemFlags: eventSystemFlags | IS_REPLAYED, + nativeEvent: nativeEvent, + targetContainers: [targetContainer] + }; +} + +function queueDiscreteEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent); + queuedDiscreteEvents.push(queuedEvent); +} // Resets the replaying for this type of continuous event to no event. + +function clearIfContinuousEvent(domEventName, nativeEvent) { + switch (domEventName) { + case 'focusin': + case 'focusout': + queuedFocus = null; + break; + + case 'dragenter': + case 'dragleave': + queuedDrag = null; + break; + + case 'mouseover': + case 'mouseout': + queuedMouse = null; + break; + + case 'pointerover': + case 'pointerout': + { + var pointerId = nativeEvent.pointerId; + queuedPointers.delete(pointerId); + break; + } + + case 'gotpointercapture': + case 'lostpointercapture': + { + var _pointerId = nativeEvent.pointerId; + queuedPointerCaptures.delete(_pointerId); + break; + } + } +} + +function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) { + var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent); + + if (blockedOn !== null) { + var _fiber2 = getInstanceFromNode(blockedOn); + + if (_fiber2 !== null) { + // Attempt to increase the priority of this target. + attemptContinuousHydration(_fiber2); + } + } + + return queuedEvent; + } // If we have already queued this exact event, then it's because + // the different event systems have different DOM event listeners. + // We can accumulate the flags, and the targetContainers, and + // store a single event to be replayed. + + + existingQueuedEvent.eventSystemFlags |= eventSystemFlags; + var targetContainers = existingQueuedEvent.targetContainers; + + if (targetContainer !== null && targetContainers.indexOf(targetContainer) === -1) { + targetContainers.push(targetContainer); + } + + return existingQueuedEvent; +} + +function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + // These set relatedTarget to null because the replayed event will be treated as if we + // moved from outside the window (no target) onto the target once it hydrates. + // Instead of mutating we could clone the event. + switch (domEventName) { + case 'focusin': + { + var focusEvent = nativeEvent; + queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, focusEvent); + return true; + } + + case 'dragenter': + { + var dragEvent = nativeEvent; + queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, dragEvent); + return true; + } + + case 'mouseover': + { + var mouseEvent = nativeEvent; + queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, mouseEvent); + return true; + } + + case 'pointerover': + { + var pointerEvent = nativeEvent; + var pointerId = pointerEvent.pointerId; + queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, pointerEvent)); + return true; + } + + case 'gotpointercapture': + { + var _pointerEvent = nativeEvent; + var _pointerId2 = _pointerEvent.pointerId; + queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, _pointerEvent)); + return true; + } + } + + return false; +} // Check if this target is unblocked. Returns true if it's unblocked. + +function attemptExplicitHydrationTarget(queuedTarget) { + // TODO: This function shares a lot of logic with attemptToDispatchEvent. + // Try to unify them. It's a bit tricky since it would require two return + // values. + var targetInst = getClosestInstanceFromNode(queuedTarget.target); + + if (targetInst !== null) { + var nearestMounted = getNearestMountedFiber(targetInst); + + if (nearestMounted !== null) { + var tag = nearestMounted.tag; + + if (tag === SuspenseComponent) { + var instance = getSuspenseInstanceFromFiber(nearestMounted); + + if (instance !== null) { + // We're blocked on hydrating this boundary. + // Increase its priority. + queuedTarget.blockedOn = instance; + attemptHydrationAtPriority(queuedTarget.lanePriority, function () { + Scheduler.unstable_runWithPriority(queuedTarget.priority, function () { + attemptHydrationAtCurrentPriority(nearestMounted); + }); + }); + return; + } + } else if (tag === HostRoot) { + var root = nearestMounted.stateNode; + + if (root.hydrate) { + queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of + // a root other than sync. + + return; + } + } + } + } + + queuedTarget.blockedOn = null; +} + +function attemptReplayContinuousQueuedEvent(queuedEvent) { + if (queuedEvent.blockedOn !== null) { + return false; + } + + var targetContainers = queuedEvent.targetContainers; + + while (targetContainers.length > 0) { + var targetContainer = targetContainers[0]; + var nextBlockedOn = attemptToDispatchEvent(queuedEvent.domEventName, queuedEvent.eventSystemFlags, targetContainer, queuedEvent.nativeEvent); + + if (nextBlockedOn !== null) { + // We're still blocked. Try again later. + var _fiber3 = getInstanceFromNode(nextBlockedOn); + + if (_fiber3 !== null) { + attemptContinuousHydration(_fiber3); + } + + queuedEvent.blockedOn = nextBlockedOn; + return false; + } // This target container was successfully dispatched. Try the next. + + + targetContainers.shift(); + } + + return true; +} + +function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) { + if (attemptReplayContinuousQueuedEvent(queuedEvent)) { + map.delete(key); + } +} + +function replayUnblockedEvents() { + hasScheduledReplayAttempt = false; // First replay discrete events. + + while (queuedDiscreteEvents.length > 0) { + var nextDiscreteEvent = queuedDiscreteEvents[0]; + + if (nextDiscreteEvent.blockedOn !== null) { + // We're still blocked. + // Increase the priority of this boundary to unblock + // the next discrete event. + var _fiber4 = getInstanceFromNode(nextDiscreteEvent.blockedOn); + + if (_fiber4 !== null) { + attemptUserBlockingHydration(_fiber4); + } + + break; + } + + var targetContainers = nextDiscreteEvent.targetContainers; + + while (targetContainers.length > 0) { + var targetContainer = targetContainers[0]; + var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.domEventName, nextDiscreteEvent.eventSystemFlags, targetContainer, nextDiscreteEvent.nativeEvent); + + if (nextBlockedOn !== null) { + // We're still blocked. Try again later. + nextDiscreteEvent.blockedOn = nextBlockedOn; + break; + } // This target container was successfully dispatched. Try the next. + + + targetContainers.shift(); + } + + if (nextDiscreteEvent.blockedOn === null) { + // We've successfully replayed the first event. Let's try the next one. + queuedDiscreteEvents.shift(); + } + } // Next replay any continuous events. + + + if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) { + queuedFocus = null; + } + + if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) { + queuedDrag = null; + } + + if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) { + queuedMouse = null; + } + + queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap); + queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap); +} + +function scheduleCallbackIfUnblocked(queuedEvent, unblocked) { + if (queuedEvent.blockedOn === unblocked) { + queuedEvent.blockedOn = null; + + if (!hasScheduledReplayAttempt) { + hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are + // now unblocked. This first might not actually be unblocked yet. + // We could check it early to avoid scheduling an unnecessary callback. + + Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents); + } + } +} + +function retryIfBlockedOn(unblocked) { + // Mark anything that was blocked on this as no longer blocked + // and eligible for a replay. + if (queuedDiscreteEvents.length > 0) { + scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's + // worth it because we expect very few discrete events to queue up and once + // we are actually fully unblocked it will be fast to replay them. + + for (var i = 1; i < queuedDiscreteEvents.length; i++) { + var queuedEvent = queuedDiscreteEvents[i]; + + if (queuedEvent.blockedOn === unblocked) { + queuedEvent.blockedOn = null; + } + } + } + + if (queuedFocus !== null) { + scheduleCallbackIfUnblocked(queuedFocus, unblocked); + } + + if (queuedDrag !== null) { + scheduleCallbackIfUnblocked(queuedDrag, unblocked); + } + + if (queuedMouse !== null) { + scheduleCallbackIfUnblocked(queuedMouse, unblocked); + } + + var unblock = function (queuedEvent) { + return scheduleCallbackIfUnblocked(queuedEvent, unblocked); + }; + + queuedPointers.forEach(unblock); + queuedPointerCaptures.forEach(unblock); + + for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) { + var queuedTarget = queuedExplicitHydrationTargets[_i]; + + if (queuedTarget.blockedOn === unblocked) { + queuedTarget.blockedOn = null; + } + } + + while (queuedExplicitHydrationTargets.length > 0) { + var nextExplicitTarget = queuedExplicitHydrationTargets[0]; + + if (nextExplicitTarget.blockedOn !== null) { + // We're still blocked. + break; + } else { + attemptExplicitHydrationTarget(nextExplicitTarget); + + if (nextExplicitTarget.blockedOn === null) { + // We're unblocked. + queuedExplicitHydrationTargets.shift(); + } + } + } +} + +var DiscreteEvent = 0; +var UserBlockingEvent = 1; +var ContinuousEvent = 2; + +/** + * Generate a mapping of standard vendor prefixes using the defined style property and event name. + * + * @param {string} styleProp + * @param {string} eventName + * @returns {object} + */ + +function makePrefixMap(styleProp, eventName) { + var prefixes = {}; + prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); + prefixes['Webkit' + styleProp] = 'webkit' + eventName; + prefixes['Moz' + styleProp] = 'moz' + eventName; + return prefixes; +} +/** + * A list of event names to a configurable list of vendor prefixes. + */ + + +var vendorPrefixes = { + animationend: makePrefixMap('Animation', 'AnimationEnd'), + animationiteration: makePrefixMap('Animation', 'AnimationIteration'), + animationstart: makePrefixMap('Animation', 'AnimationStart'), + transitionend: makePrefixMap('Transition', 'TransitionEnd') +}; +/** + * Event names that have already been detected and prefixed (if applicable). + */ + +var prefixedEventNames = {}; +/** + * Element to check for prefixes on. + */ + +var style = {}; +/** + * Bootstrap if a DOM exists. + */ + +if (canUseDOM) { + style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x, + // the un-prefixed "animation" and "transition" properties are defined on the + // style object but the events that fire will still be prefixed, so we need + // to check if the un-prefixed events are usable, and if not remove them from the map. + + if (!('AnimationEvent' in window)) { + delete vendorPrefixes.animationend.animation; + delete vendorPrefixes.animationiteration.animation; + delete vendorPrefixes.animationstart.animation; + } // Same as above + + + if (!('TransitionEvent' in window)) { + delete vendorPrefixes.transitionend.transition; + } +} +/** + * Attempts to determine the correct vendor prefixed event name. + * + * @param {string} eventName + * @returns {string} + */ + + +function getVendorPrefixedEventName(eventName) { + if (prefixedEventNames[eventName]) { + return prefixedEventNames[eventName]; + } else if (!vendorPrefixes[eventName]) { + return eventName; + } + + var prefixMap = vendorPrefixes[eventName]; + + for (var styleProp in prefixMap) { + if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) { + return prefixedEventNames[eventName] = prefixMap[styleProp]; + } + } + + return eventName; +} + +var ANIMATION_END = getVendorPrefixedEventName('animationend'); +var ANIMATION_ITERATION = getVendorPrefixedEventName('animationiteration'); +var ANIMATION_START = getVendorPrefixedEventName('animationstart'); +var TRANSITION_END = getVendorPrefixedEventName('transitionend'); + +var topLevelEventsToReactNames = new Map(); +var eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use +// the code required to apply the same logic for event prioritization and that of the +// SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code +// duplication (for which there would be quite a bit). For the events that are not needed +// for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an +// array of top level events. +// Lastly, we ignore prettier so we can keep the formatting sane. +// prettier-ignore + +var discreteEventPairsForSimpleEventPlugin = ['cancel', 'cancel', 'click', 'click', 'close', 'close', 'contextmenu', 'contextMenu', 'copy', 'copy', 'cut', 'cut', 'auxclick', 'auxClick', 'dblclick', 'doubleClick', // Careful! +'dragend', 'dragEnd', 'dragstart', 'dragStart', 'drop', 'drop', 'focusin', 'focus', // Careful! +'focusout', 'blur', // Careful! +'input', 'input', 'invalid', 'invalid', 'keydown', 'keyDown', 'keypress', 'keyPress', 'keyup', 'keyUp', 'mousedown', 'mouseDown', 'mouseup', 'mouseUp', 'paste', 'paste', 'pause', 'pause', 'play', 'play', 'pointercancel', 'pointerCancel', 'pointerdown', 'pointerDown', 'pointerup', 'pointerUp', 'ratechange', 'rateChange', 'reset', 'reset', 'seeked', 'seeked', 'submit', 'submit', 'touchcancel', 'touchCancel', 'touchend', 'touchEnd', 'touchstart', 'touchStart', 'volumechange', 'volumeChange']; +var otherDiscreteEvents = ['change', 'selectionchange', 'textInput', 'compositionstart', 'compositionend', 'compositionupdate']; + + +var userBlockingPairsForSimpleEventPlugin = ['drag', 'drag', 'dragenter', 'dragEnter', 'dragexit', 'dragExit', 'dragleave', 'dragLeave', 'dragover', 'dragOver', 'mousemove', 'mouseMove', 'mouseout', 'mouseOut', 'mouseover', 'mouseOver', 'pointermove', 'pointerMove', 'pointerout', 'pointerOut', 'pointerover', 'pointerOver', 'scroll', 'scroll', 'toggle', 'toggle', 'touchmove', 'touchMove', 'wheel', 'wheel']; // prettier-ignore + +var continuousPairsForSimpleEventPlugin = ['abort', 'abort', ANIMATION_END, 'animationEnd', ANIMATION_ITERATION, 'animationIteration', ANIMATION_START, 'animationStart', 'canplay', 'canPlay', 'canplaythrough', 'canPlayThrough', 'durationchange', 'durationChange', 'emptied', 'emptied', 'encrypted', 'encrypted', 'ended', 'ended', 'error', 'error', 'gotpointercapture', 'gotPointerCapture', 'load', 'load', 'loadeddata', 'loadedData', 'loadedmetadata', 'loadedMetadata', 'loadstart', 'loadStart', 'lostpointercapture', 'lostPointerCapture', 'playing', 'playing', 'progress', 'progress', 'seeking', 'seeking', 'stalled', 'stalled', 'suspend', 'suspend', 'timeupdate', 'timeUpdate', TRANSITION_END, 'transitionEnd', 'waiting', 'waiting']; +/** + * Turns + * ['abort', ...] + * + * into + * + * topLevelEventsToReactNames = new Map([ + * ['abort', 'onAbort'], + * ]); + * + * and registers them. + */ + +function registerSimplePluginEventsAndSetTheirPriorities(eventTypes, priority) { + // As the event types are in pairs of two, we need to iterate + // through in twos. The events are in pairs of two to save code + // and improve init perf of processing this array, as it will + // result in far fewer object allocations and property accesses + // if we only use three arrays to process all the categories of + // instead of tuples. + for (var i = 0; i < eventTypes.length; i += 2) { + var topEvent = eventTypes[i]; + var event = eventTypes[i + 1]; + var capitalizedEvent = event[0].toUpperCase() + event.slice(1); + var reactName = 'on' + capitalizedEvent; + eventPriorities.set(topEvent, priority); + topLevelEventsToReactNames.set(topEvent, reactName); + registerTwoPhaseEvent(reactName, [topEvent]); + } +} + +function setEventPriorities(eventTypes, priority) { + for (var i = 0; i < eventTypes.length; i++) { + eventPriorities.set(eventTypes[i], priority); + } +} + +function getEventPriorityForPluginSystem(domEventName) { + var priority = eventPriorities.get(domEventName); // Default to a ContinuousEvent. Note: we might + // want to warn if we can't detect the priority + // for the event. + + return priority === undefined ? ContinuousEvent : priority; +} +function registerSimpleEvents() { + registerSimplePluginEventsAndSetTheirPriorities(discreteEventPairsForSimpleEventPlugin, DiscreteEvent); + registerSimplePluginEventsAndSetTheirPriorities(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent); + registerSimplePluginEventsAndSetTheirPriorities(continuousPairsForSimpleEventPlugin, ContinuousEvent); + setEventPriorities(otherDiscreteEvents, DiscreteEvent); +} + +var Scheduler_now = Scheduler.unstable_now; + +{ + // Provide explicit error message when production+profiling bundle of e.g. + // react-dom is used with production (non-profiling) bundle of + // scheduler/tracing + if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) { + { + throw Error( "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://reactjs.org/link/profiling" ); + } + } +} +// ascending numbers so we can compare them like numbers. They start at 90 to +// avoid clashing with Scheduler's priorities. + +var ImmediatePriority = 99; +var UserBlockingPriority = 98; +var NormalPriority = 97; +var LowPriority = 96; +var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only. + +var NoPriority = 90; +var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly. + +var SyncLanePriority = 15; +var SyncBatchedLanePriority = 14; +var InputDiscreteHydrationLanePriority = 13; +var InputDiscreteLanePriority = 12; +var InputContinuousHydrationLanePriority = 11; +var InputContinuousLanePriority = 10; +var DefaultHydrationLanePriority = 9; +var DefaultLanePriority = 8; +var TransitionHydrationPriority = 7; +var TransitionPriority = 6; +var RetryLanePriority = 5; +var SelectiveHydrationLanePriority = 4; +var IdleHydrationLanePriority = 3; +var IdleLanePriority = 2; +var OffscreenLanePriority = 1; +var NoLanePriority = 0; +var TotalLanes = 31; +var NoLanes = +/* */ +0; +var NoLane = +/* */ +0; +var SyncLane = +/* */ +1; +var SyncBatchedLane = +/* */ +2; +var InputDiscreteHydrationLane = +/* */ +4; +var InputDiscreteLanes = +/* */ +24; +var InputContinuousHydrationLane = +/* */ +32; +var InputContinuousLanes = +/* */ +192; +var DefaultHydrationLane = +/* */ +256; +var DefaultLanes = +/* */ +3584; +var TransitionHydrationLane = +/* */ +4096; +var TransitionLanes = +/* */ +4186112; +var RetryLanes = +/* */ +62914560; +var SomeRetryLane = +/* */ +33554432; +var SelectiveHydrationLane = +/* */ +67108864; +var NonIdleLanes = +/* */ +134217727; +var IdleHydrationLane = +/* */ +134217728; +var IdleLanes = +/* */ +805306368; +var OffscreenLane = +/* */ +1073741824; +var NoTimestamp = -1; +function setCurrentUpdateLanePriority(newLanePriority) { +} // "Registers" used to "return" multiple values +// Used by getHighestPriorityLanes and getNextLanes: + +var return_highestLanePriority = DefaultLanePriority; + +function getHighestPriorityLanes(lanes) { + if ((SyncLane & lanes) !== NoLanes) { + return_highestLanePriority = SyncLanePriority; + return SyncLane; + } + + if ((SyncBatchedLane & lanes) !== NoLanes) { + return_highestLanePriority = SyncBatchedLanePriority; + return SyncBatchedLane; + } + + if ((InputDiscreteHydrationLane & lanes) !== NoLanes) { + return_highestLanePriority = InputDiscreteHydrationLanePriority; + return InputDiscreteHydrationLane; + } + + var inputDiscreteLanes = InputDiscreteLanes & lanes; + + if (inputDiscreteLanes !== NoLanes) { + return_highestLanePriority = InputDiscreteLanePriority; + return inputDiscreteLanes; + } + + if ((lanes & InputContinuousHydrationLane) !== NoLanes) { + return_highestLanePriority = InputContinuousHydrationLanePriority; + return InputContinuousHydrationLane; + } + + var inputContinuousLanes = InputContinuousLanes & lanes; + + if (inputContinuousLanes !== NoLanes) { + return_highestLanePriority = InputContinuousLanePriority; + return inputContinuousLanes; + } + + if ((lanes & DefaultHydrationLane) !== NoLanes) { + return_highestLanePriority = DefaultHydrationLanePriority; + return DefaultHydrationLane; + } + + var defaultLanes = DefaultLanes & lanes; + + if (defaultLanes !== NoLanes) { + return_highestLanePriority = DefaultLanePriority; + return defaultLanes; + } + + if ((lanes & TransitionHydrationLane) !== NoLanes) { + return_highestLanePriority = TransitionHydrationPriority; + return TransitionHydrationLane; + } + + var transitionLanes = TransitionLanes & lanes; + + if (transitionLanes !== NoLanes) { + return_highestLanePriority = TransitionPriority; + return transitionLanes; + } + + var retryLanes = RetryLanes & lanes; + + if (retryLanes !== NoLanes) { + return_highestLanePriority = RetryLanePriority; + return retryLanes; + } + + if (lanes & SelectiveHydrationLane) { + return_highestLanePriority = SelectiveHydrationLanePriority; + return SelectiveHydrationLane; + } + + if ((lanes & IdleHydrationLane) !== NoLanes) { + return_highestLanePriority = IdleHydrationLanePriority; + return IdleHydrationLane; + } + + var idleLanes = IdleLanes & lanes; + + if (idleLanes !== NoLanes) { + return_highestLanePriority = IdleLanePriority; + return idleLanes; + } + + if ((OffscreenLane & lanes) !== NoLanes) { + return_highestLanePriority = OffscreenLanePriority; + return OffscreenLane; + } + + { + error('Should have found matching lanes. This is a bug in React.'); + } // This shouldn't be reachable, but as a fallback, return the entire bitmask. + + + return_highestLanePriority = DefaultLanePriority; + return lanes; +} + +function schedulerPriorityToLanePriority(schedulerPriorityLevel) { + switch (schedulerPriorityLevel) { + case ImmediatePriority: + return SyncLanePriority; + + case UserBlockingPriority: + return InputContinuousLanePriority; + + case NormalPriority: + case LowPriority: + // TODO: Handle LowSchedulerPriority, somehow. Maybe the same lane as hydration. + return DefaultLanePriority; + + case IdlePriority: + return IdleLanePriority; + + default: + return NoLanePriority; + } +} +function lanePriorityToSchedulerPriority(lanePriority) { + switch (lanePriority) { + case SyncLanePriority: + case SyncBatchedLanePriority: + return ImmediatePriority; + + case InputDiscreteHydrationLanePriority: + case InputDiscreteLanePriority: + case InputContinuousHydrationLanePriority: + case InputContinuousLanePriority: + return UserBlockingPriority; + + case DefaultHydrationLanePriority: + case DefaultLanePriority: + case TransitionHydrationPriority: + case TransitionPriority: + case SelectiveHydrationLanePriority: + case RetryLanePriority: + return NormalPriority; + + case IdleHydrationLanePriority: + case IdleLanePriority: + case OffscreenLanePriority: + return IdlePriority; + + case NoLanePriority: + return NoPriority; + + default: + { + { + throw Error( "Invalid update priority: " + lanePriority + ". This is a bug in React." ); + } + } + + } +} +function getNextLanes(root, wipLanes) { + // Early bailout if there's no pending work left. + var pendingLanes = root.pendingLanes; + + if (pendingLanes === NoLanes) { + return_highestLanePriority = NoLanePriority; + return NoLanes; + } + + var nextLanes = NoLanes; + var nextLanePriority = NoLanePriority; + var expiredLanes = root.expiredLanes; + var suspendedLanes = root.suspendedLanes; + var pingedLanes = root.pingedLanes; // Check if any work has expired. + + if (expiredLanes !== NoLanes) { + nextLanes = expiredLanes; + nextLanePriority = return_highestLanePriority = SyncLanePriority; + } else { + // Do not work on any idle work until all the non-idle work has finished, + // even if the work is suspended. + var nonIdlePendingLanes = pendingLanes & NonIdleLanes; + + if (nonIdlePendingLanes !== NoLanes) { + var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes; + + if (nonIdleUnblockedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes); + nextLanePriority = return_highestLanePriority; + } else { + var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes; + + if (nonIdlePingedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(nonIdlePingedLanes); + nextLanePriority = return_highestLanePriority; + } + } + } else { + // The only remaining work is Idle. + var unblockedLanes = pendingLanes & ~suspendedLanes; + + if (unblockedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(unblockedLanes); + nextLanePriority = return_highestLanePriority; + } else { + if (pingedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(pingedLanes); + nextLanePriority = return_highestLanePriority; + } + } + } + } + + if (nextLanes === NoLanes) { + // This should only be reachable if we're suspended + // TODO: Consider warning in this path if a fallback timer is not scheduled. + return NoLanes; + } // If there are higher priority lanes, we'll include them even if they + // are suspended. + + + nextLanes = pendingLanes & getEqualOrHigherPriorityLanes(nextLanes); // If we're already in the middle of a render, switching lanes will interrupt + // it and we'll lose our progress. We should only do this if the new lanes are + // higher priority. + + if (wipLanes !== NoLanes && wipLanes !== nextLanes && // If we already suspended with a delay, then interrupting is fine. Don't + // bother waiting until the root is complete. + (wipLanes & suspendedLanes) === NoLanes) { + getHighestPriorityLanes(wipLanes); + var wipLanePriority = return_highestLanePriority; + + if (nextLanePriority <= wipLanePriority) { + return wipLanes; + } else { + return_highestLanePriority = nextLanePriority; + } + } // Check for entangled lanes and add them to the batch. + // + // A lane is said to be entangled with another when it's not allowed to render + // in a batch that does not also include the other lane. Typically we do this + // when multiple updates have the same source, and we only want to respond to + // the most recent event from that source. + // + // Note that we apply entanglements *after* checking for partial work above. + // This means that if a lane is entangled during an interleaved event while + // it's already rendering, we won't interrupt it. This is intentional, since + // entanglement is usually "best effort": we'll try our best to render the + // lanes in the same batch, but it's not worth throwing out partially + // completed work in order to do it. + // + // For those exceptions where entanglement is semantically important, like + // useMutableSource, we should ensure that there is no partial work at the + // time we apply the entanglement. + + + var entangledLanes = root.entangledLanes; + + if (entangledLanes !== NoLanes) { + var entanglements = root.entanglements; + var lanes = nextLanes & entangledLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + nextLanes |= entanglements[index]; + lanes &= ~lane; + } + } + + return nextLanes; +} +function getMostRecentEventTime(root, lanes) { + var eventTimes = root.eventTimes; + var mostRecentEventTime = NoTimestamp; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + var eventTime = eventTimes[index]; + + if (eventTime > mostRecentEventTime) { + mostRecentEventTime = eventTime; + } + + lanes &= ~lane; + } + + return mostRecentEventTime; +} + +function computeExpirationTime(lane, currentTime) { + // TODO: Expiration heuristic is constant per lane, so could use a map. + getHighestPriorityLanes(lane); + var priority = return_highestLanePriority; + + if (priority >= InputContinuousLanePriority) { + // User interactions should expire slightly more quickly. + // + // NOTE: This is set to the corresponding constant as in Scheduler.js. When + // we made it larger, a product metric in www regressed, suggesting there's + // a user interaction that's being starved by a series of synchronous + // updates. If that theory is correct, the proper solution is to fix the + // starvation. However, this scenario supports the idea that expiration + // times are an important safeguard when starvation does happen. + // + // Also note that, in the case of user input specifically, this will soon no + // longer be an issue because we plan to make user input synchronous by + // default (until you enter `startTransition`, of course.) + // + // If weren't planning to make these updates synchronous soon anyway, I + // would probably make this number a configurable parameter. + return currentTime + 250; + } else if (priority >= TransitionPriority) { + return currentTime + 5000; + } else { + // Anything idle priority or lower should never expire. + return NoTimestamp; + } +} + +function markStarvedLanesAsExpired(root, currentTime) { + // TODO: This gets called every time we yield. We can optimize by storing + // the earliest expiration time on the root. Then use that to quickly bail out + // of this function. + var pendingLanes = root.pendingLanes; + var suspendedLanes = root.suspendedLanes; + var pingedLanes = root.pingedLanes; + var expirationTimes = root.expirationTimes; // Iterate through the pending lanes and check if we've reached their + // expiration time. If so, we'll assume the update is being starved and mark + // it as expired to force it to finish. + + var lanes = pendingLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + var expirationTime = expirationTimes[index]; + + if (expirationTime === NoTimestamp) { + // Found a pending lane with no expiration time. If it's not suspended, or + // if it's pinged, assume it's CPU-bound. Compute a new expiration time + // using the current time. + if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) { + // Assumes timestamps are monotonically increasing. + expirationTimes[index] = computeExpirationTime(lane, currentTime); + } + } else if (expirationTime <= currentTime) { + // This lane expired + root.expiredLanes |= lane; + } + + lanes &= ~lane; + } +} // This returns the highest priority pending lanes regardless of whether they +function getLanesToRetrySynchronouslyOnError(root) { + var everythingButOffscreen = root.pendingLanes & ~OffscreenLane; + + if (everythingButOffscreen !== NoLanes) { + return everythingButOffscreen; + } + + if (everythingButOffscreen & OffscreenLane) { + return OffscreenLane; + } + + return NoLanes; +} +function returnNextLanesPriority() { + return return_highestLanePriority; +} +function includesNonIdleWork(lanes) { + return (lanes & NonIdleLanes) !== NoLanes; +} +function includesOnlyRetries(lanes) { + return (lanes & RetryLanes) === lanes; +} +function includesOnlyTransitions(lanes) { + return (lanes & TransitionLanes) === lanes; +} // To ensure consistency across multiple updates in the same event, this should +// be a pure function, so that it always returns the same lane for given inputs. + +function findUpdateLane(lanePriority, wipLanes) { + switch (lanePriority) { + case NoLanePriority: + break; + + case SyncLanePriority: + return SyncLane; + + case SyncBatchedLanePriority: + return SyncBatchedLane; + + case InputDiscreteLanePriority: + { + var _lane = pickArbitraryLane(InputDiscreteLanes & ~wipLanes); + + if (_lane === NoLane) { + // Shift to the next priority level + return findUpdateLane(InputContinuousLanePriority, wipLanes); + } + + return _lane; + } + + case InputContinuousLanePriority: + { + var _lane2 = pickArbitraryLane(InputContinuousLanes & ~wipLanes); + + if (_lane2 === NoLane) { + // Shift to the next priority level + return findUpdateLane(DefaultLanePriority, wipLanes); + } + + return _lane2; + } + + case DefaultLanePriority: + { + var _lane3 = pickArbitraryLane(DefaultLanes & ~wipLanes); + + if (_lane3 === NoLane) { + // If all the default lanes are already being worked on, look for a + // lane in the transition range. + _lane3 = pickArbitraryLane(TransitionLanes & ~wipLanes); + + if (_lane3 === NoLane) { + // All the transition lanes are taken, too. This should be very + // rare, but as a last resort, pick a default lane. This will have + // the effect of interrupting the current work-in-progress render. + _lane3 = pickArbitraryLane(DefaultLanes); + } + } + + return _lane3; + } + + case TransitionPriority: // Should be handled by findTransitionLane instead + + case RetryLanePriority: + // Should be handled by findRetryLane instead + break; + + case IdleLanePriority: + var lane = pickArbitraryLane(IdleLanes & ~wipLanes); + + if (lane === NoLane) { + lane = pickArbitraryLane(IdleLanes); + } + + return lane; + } + + { + { + throw Error( "Invalid update priority: " + lanePriority + ". This is a bug in React." ); + } + } +} // To ensure consistency across multiple updates in the same event, this should +// be pure function, so that it always returns the same lane for given inputs. + +function findTransitionLane(wipLanes, pendingLanes) { + // First look for lanes that are completely unclaimed, i.e. have no + // pending work. + var lane = pickArbitraryLane(TransitionLanes & ~pendingLanes); + + if (lane === NoLane) { + // If all lanes have pending work, look for a lane that isn't currently + // being worked on. + lane = pickArbitraryLane(TransitionLanes & ~wipLanes); + + if (lane === NoLane) { + // If everything is being worked on, pick any lane. This has the + // effect of interrupting the current work-in-progress. + lane = pickArbitraryLane(TransitionLanes); + } + } + + return lane; +} // To ensure consistency across multiple updates in the same event, this should +// be pure function, so that it always returns the same lane for given inputs. + +function findRetryLane(wipLanes) { + // This is a fork of `findUpdateLane` designed specifically for Suspense + // "retries" — a special update that attempts to flip a Suspense boundary + // from its placeholder state to its primary/resolved state. + var lane = pickArbitraryLane(RetryLanes & ~wipLanes); + + if (lane === NoLane) { + lane = pickArbitraryLane(RetryLanes); + } + + return lane; +} + +function getHighestPriorityLane(lanes) { + return lanes & -lanes; +} + +function getLowestPriorityLane(lanes) { + // This finds the most significant non-zero bit. + var index = 31 - clz32(lanes); + return index < 0 ? NoLanes : 1 << index; +} + +function getEqualOrHigherPriorityLanes(lanes) { + return (getLowestPriorityLane(lanes) << 1) - 1; +} + +function pickArbitraryLane(lanes) { + // This wrapper function gets inlined. Only exists so to communicate that it + // doesn't matter which bit is selected; you can pick any bit without + // affecting the algorithms where its used. Here I'm using + // getHighestPriorityLane because it requires the fewest operations. + return getHighestPriorityLane(lanes); +} + +function pickArbitraryLaneIndex(lanes) { + return 31 - clz32(lanes); +} + +function laneToIndex(lane) { + return pickArbitraryLaneIndex(lane); +} + +function includesSomeLane(a, b) { + return (a & b) !== NoLanes; +} +function isSubsetOfLanes(set, subset) { + return (set & subset) === subset; +} +function mergeLanes(a, b) { + return a | b; +} +function removeLanes(set, subset) { + return set & ~subset; +} // Seems redundant, but it changes the type from a single lane (used for +// updates) to a group of lanes (used for flushing work). + +function laneToLanes(lane) { + return lane; +} +function higherPriorityLane(a, b) { + // This works because the bit ranges decrease in priority as you go left. + return a !== NoLane && a < b ? a : b; +} +function createLaneMap(initial) { + // Intentionally pushing one by one. + // https://v8.dev/blog/elements-kinds#avoid-creating-holes + var laneMap = []; + + for (var i = 0; i < TotalLanes; i++) { + laneMap.push(initial); + } + + return laneMap; +} +function markRootUpdated(root, updateLane, eventTime) { + root.pendingLanes |= updateLane; // TODO: Theoretically, any update to any lane can unblock any other lane. But + // it's not practical to try every single possible combination. We need a + // heuristic to decide which lanes to attempt to render, and in which batches. + // For now, we use the same heuristic as in the old ExpirationTimes model: + // retry any lane at equal or lower priority, but don't try updates at higher + // priority without also including the lower priority updates. This works well + // when considering updates across different priority levels, but isn't + // sufficient for updates within the same priority, since we want to treat + // those updates as parallel. + // Unsuspend any update at equal or lower priority. + + var higherPriorityLanes = updateLane - 1; // Turns 0b1000 into 0b0111 + + root.suspendedLanes &= higherPriorityLanes; + root.pingedLanes &= higherPriorityLanes; + var eventTimes = root.eventTimes; + var index = laneToIndex(updateLane); // We can always overwrite an existing timestamp because we prefer the most + // recent event, and we assume time is monotonically increasing. + + eventTimes[index] = eventTime; +} +function markRootSuspended(root, suspendedLanes) { + root.suspendedLanes |= suspendedLanes; + root.pingedLanes &= ~suspendedLanes; // The suspended lanes are no longer CPU-bound. Clear their expiration times. + + var expirationTimes = root.expirationTimes; + var lanes = suspendedLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + expirationTimes[index] = NoTimestamp; + lanes &= ~lane; + } +} +function markRootPinged(root, pingedLanes, eventTime) { + root.pingedLanes |= root.suspendedLanes & pingedLanes; +} +function markDiscreteUpdatesExpired(root) { + root.expiredLanes |= InputDiscreteLanes & root.pendingLanes; +} +function hasDiscreteLanes(lanes) { + return (lanes & InputDiscreteLanes) !== NoLanes; +} +function markRootMutableRead(root, updateLane) { + root.mutableReadLanes |= updateLane & root.pendingLanes; +} +function markRootFinished(root, remainingLanes) { + var noLongerPendingLanes = root.pendingLanes & ~remainingLanes; + root.pendingLanes = remainingLanes; // Let's try everything again + + root.suspendedLanes = 0; + root.pingedLanes = 0; + root.expiredLanes &= remainingLanes; + root.mutableReadLanes &= remainingLanes; + root.entangledLanes &= remainingLanes; + var entanglements = root.entanglements; + var eventTimes = root.eventTimes; + var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work + + var lanes = noLongerPendingLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + entanglements[index] = NoLanes; + eventTimes[index] = NoTimestamp; + expirationTimes[index] = NoTimestamp; + lanes &= ~lane; + } +} +function markRootEntangled(root, entangledLanes) { + root.entangledLanes |= entangledLanes; + var entanglements = root.entanglements; + var lanes = entangledLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + entanglements[index] |= entangledLanes; + lanes &= ~lane; + } +} +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. Only used on lanes, so assume input is an integer. +// Based on: +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +var log = Math.log; +var LN2 = Math.LN2; + +function clz32Fallback(lanes) { + if (lanes === 0) { + return 32; + } + + return 31 - (log(lanes) / LN2 | 0) | 0; +} + +// Intentionally not named imports because Rollup would use dynamic dispatch for +var UserBlockingPriority$1 = Scheduler.unstable_UserBlockingPriority, + runWithPriority = Scheduler.unstable_runWithPriority; // TODO: can we stop exporting these? + +var _enabled = true; // This is exported in FB builds for use by legacy FB layer infra. +// We'd like to remove this but it's not clear if this is safe. + +function setEnabled(enabled) { + _enabled = !!enabled; +} +function isEnabled() { + return _enabled; +} +function createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags) { + var eventPriority = getEventPriorityForPluginSystem(domEventName); + var listenerWrapper; + + switch (eventPriority) { + case DiscreteEvent: + listenerWrapper = dispatchDiscreteEvent; + break; + + case UserBlockingEvent: + listenerWrapper = dispatchUserBlockingUpdate; + break; + + case ContinuousEvent: + default: + listenerWrapper = dispatchEvent; + break; + } + + return listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer); +} + +function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) { + { + flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp); + } + + discreteUpdates(dispatchEvent, domEventName, eventSystemFlags, container, nativeEvent); +} + +function dispatchUserBlockingUpdate(domEventName, eventSystemFlags, container, nativeEvent) { + { + runWithPriority(UserBlockingPriority$1, dispatchEvent.bind(null, domEventName, eventSystemFlags, container, nativeEvent)); + } +} + +function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) { + if (!_enabled) { + return; + } + + var allowReplay = true; + + { + // TODO: replaying capture phase events is currently broken + // because we used to do it during top-level native bubble handlers + // but now we use different bubble and capture handlers. + // In eager mode, we attach capture listeners early, so we need + // to filter them out until we fix the logic to handle them correctly. + // This could've been outside the flag but I put it inside to reduce risk. + allowReplay = (eventSystemFlags & IS_CAPTURE_PHASE) === 0; + } + + if (allowReplay && hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(domEventName)) { + // If we already have a queue of discrete events, and this is another discrete + // event, then we can't dispatch it regardless of its target, since they + // need to dispatch in order. + queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know. + domEventName, eventSystemFlags, targetContainer, nativeEvent); + return; + } + + var blockedOn = attemptToDispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent); + + if (blockedOn === null) { + // We successfully dispatched this event. + if (allowReplay) { + clearIfContinuousEvent(domEventName, nativeEvent); + } + + return; + } + + if (allowReplay) { + if (isReplayableDiscreteEvent(domEventName)) { + // This this to be replayed later once the target is available. + queueDiscreteEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent); + return; + } + + if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) { + return; + } // We need to clear only if we didn't queue because + // queueing is accummulative. + + + clearIfContinuousEvent(domEventName, nativeEvent); + } // This is not replayable so we'll invoke it but without a target, + // in case the event system needs to trace it. + + + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer); +} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked. + +function attemptToDispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) { + // TODO: Warn if _enabled is false. + var nativeEventTarget = getEventTarget(nativeEvent); + var targetInst = getClosestInstanceFromNode(nativeEventTarget); + + if (targetInst !== null) { + var nearestMounted = getNearestMountedFiber(targetInst); + + if (nearestMounted === null) { + // This tree has been unmounted already. Dispatch without a target. + targetInst = null; + } else { + var tag = nearestMounted.tag; + + if (tag === SuspenseComponent) { + var instance = getSuspenseInstanceFromFiber(nearestMounted); + + if (instance !== null) { + // Queue the event to be replayed later. Abort dispatching since we + // don't want this event dispatched twice through the event system. + // TODO: If this is the first discrete event in the queue. Schedule an increased + // priority for this boundary. + return instance; + } // This shouldn't happen, something went wrong but to avoid blocking + // the whole system, dispatch the event without a target. + // TODO: Warn. + + + targetInst = null; + } else if (tag === HostRoot) { + var root = nearestMounted.stateNode; + + if (root.hydrate) { + // If this happens during a replay something went wrong and it might block + // the whole system. + return getContainerFromFiber(nearestMounted); + } + + targetInst = null; + } else if (nearestMounted !== targetInst) { + // If we get an event (ex: img onload) before committing that + // component's mount, ignore it for now (that is, treat it as if it was an + // event on a non-React tree). We might also consider queueing events and + // dispatching them after the mount. + targetInst = null; + } + } + } + + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer); // We're not blocked on anything. + + return null; +} + +function addEventBubbleListener(target, eventType, listener) { + target.addEventListener(eventType, listener, false); + return listener; +} +function addEventCaptureListener(target, eventType, listener) { + target.addEventListener(eventType, listener, true); + return listener; +} +function addEventCaptureListenerWithPassiveFlag(target, eventType, listener, passive) { + target.addEventListener(eventType, listener, { + capture: true, + passive: passive + }); + return listener; +} +function addEventBubbleListenerWithPassiveFlag(target, eventType, listener, passive) { + target.addEventListener(eventType, listener, { + passive: passive + }); + return listener; +} + +/** + * These variables store information about text content of a target node, + * allowing comparison of content before and after a given event. + * + * Identify the node where selection currently begins, then observe + * both its text content and its current position in the DOM. Since the + * browser may natively replace the target node during composition, we can + * use its position to find its replacement. + * + * + */ +var root = null; +var startText = null; +var fallbackText = null; +function initialize(nativeEventTarget) { + root = nativeEventTarget; + startText = getText(); + return true; +} +function reset() { + root = null; + startText = null; + fallbackText = null; +} +function getData() { + if (fallbackText) { + return fallbackText; + } + + var start; + var startValue = startText; + var startLength = startValue.length; + var end; + var endValue = getText(); + var endLength = endValue.length; + + for (start = 0; start < startLength; start++) { + if (startValue[start] !== endValue[start]) { + break; + } + } + + var minEnd = startLength - start; + + for (end = 1; end <= minEnd; end++) { + if (startValue[startLength - end] !== endValue[endLength - end]) { + break; + } + } + + var sliceTail = end > 1 ? 1 - end : undefined; + fallbackText = endValue.slice(start, sliceTail); + return fallbackText; +} +function getText() { + if ('value' in root) { + return root.value; + } + + return root.textContent; +} + +/** + * `charCode` represents the actual "character code" and is safe to use with + * `String.fromCharCode`. As such, only keys that correspond to printable + * characters produce a valid `charCode`, the only exception to this is Enter. + * The Tab-key is considered non-printable and does not have a `charCode`, + * presumably because it does not produce a tab-character in browsers. + * + * @param {object} nativeEvent Native browser event. + * @return {number} Normalized `charCode` property. + */ +function getEventCharCode(nativeEvent) { + var charCode; + var keyCode = nativeEvent.keyCode; + + if ('charCode' in nativeEvent) { + charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`. + + if (charCode === 0 && keyCode === 13) { + charCode = 13; + } + } else { + // IE8 does not implement `charCode`, but `keyCode` has the correct value. + charCode = keyCode; + } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux) + // report Enter as charCode 10 when ctrl is pressed. + + + if (charCode === 10) { + charCode = 13; + } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. + // Must not discard the (non-)printable Enter-key. + + + if (charCode >= 32 || charCode === 13) { + return charCode; + } + + return 0; +} + +function functionThatReturnsTrue() { + return true; +} + +function functionThatReturnsFalse() { + return false; +} // This is intentionally a factory so that we have different returned constructors. +// If we had a single constructor, it would be megamorphic and engines would deopt. + + +function createSyntheticEvent(Interface) { + /** + * Synthetic events are dispatched by event plugins, typically in response to a + * top-level event delegation handler. + * + * These systems should generally use pooling to reduce the frequency of garbage + * collection. The system should check `isPersistent` to determine whether the + * event should be released into the pool after being dispatched. Users that + * need a persisted event should invoke `persist`. + * + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by + * normalizing browser quirks. Subclasses do not necessarily have to implement a + * DOM interface; custom application-specific events can also subclass this. + */ + function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) { + this._reactName = reactName; + this._targetInst = targetInst; + this.type = reactEventType; + this.nativeEvent = nativeEvent; + this.target = nativeEventTarget; + this.currentTarget = null; + + for (var _propName in Interface) { + if (!Interface.hasOwnProperty(_propName)) { + continue; + } + + var normalize = Interface[_propName]; + + if (normalize) { + this[_propName] = normalize(nativeEvent); + } else { + this[_propName] = nativeEvent[_propName]; + } + } + + var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; + + if (defaultPrevented) { + this.isDefaultPrevented = functionThatReturnsTrue; + } else { + this.isDefaultPrevented = functionThatReturnsFalse; + } + + this.isPropagationStopped = functionThatReturnsFalse; + return this; + } + + _assign(SyntheticBaseEvent.prototype, { + preventDefault: function () { + this.defaultPrevented = true; + var event = this.nativeEvent; + + if (!event) { + return; + } + + if (event.preventDefault) { + event.preventDefault(); // $FlowFixMe - flow is not aware of `unknown` in IE + } else if (typeof event.returnValue !== 'unknown') { + event.returnValue = false; + } + + this.isDefaultPrevented = functionThatReturnsTrue; + }, + stopPropagation: function () { + var event = this.nativeEvent; + + if (!event) { + return; + } + + if (event.stopPropagation) { + event.stopPropagation(); // $FlowFixMe - flow is not aware of `unknown` in IE + } else if (typeof event.cancelBubble !== 'unknown') { + // The ChangeEventPlugin registers a "propertychange" event for + // IE. This event does not support bubbling or cancelling, and + // any references to cancelBubble throw "Member not found". A + // typeof check of "unknown" circumvents this issue (and is also + // IE specific). + event.cancelBubble = true; + } + + this.isPropagationStopped = functionThatReturnsTrue; + }, + + /** + * We release all dispatched `SyntheticEvent`s after each event loop, adding + * them back into the pool. This allows a way to hold onto a reference that + * won't be added back into the pool. + */ + persist: function () {// Modern event system doesn't use pooling. + }, + + /** + * Checks if this event should be released back into the pool. + * + * @return {boolean} True if this should not be released, false otherwise. + */ + isPersistent: functionThatReturnsTrue + }); + + return SyntheticBaseEvent; +} +/** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + + +var EventInterface = { + eventPhase: 0, + bubbles: 0, + cancelable: 0, + timeStamp: function (event) { + return event.timeStamp || Date.now(); + }, + defaultPrevented: 0, + isTrusted: 0 +}; +var SyntheticEvent = createSyntheticEvent(EventInterface); + +var UIEventInterface = _assign({}, EventInterface, { + view: 0, + detail: 0 +}); + +var SyntheticUIEvent = createSyntheticEvent(UIEventInterface); +var lastMovementX; +var lastMovementY; +var lastMouseEvent; + +function updateMouseMovementPolyfillState(event) { + if (event !== lastMouseEvent) { + if (lastMouseEvent && event.type === 'mousemove') { + lastMovementX = event.screenX - lastMouseEvent.screenX; + lastMovementY = event.screenY - lastMouseEvent.screenY; + } else { + lastMovementX = 0; + lastMovementY = 0; + } + + lastMouseEvent = event; + } +} +/** + * @interface MouseEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + + +var MouseEventInterface = _assign({}, UIEventInterface, { + screenX: 0, + screenY: 0, + clientX: 0, + clientY: 0, + pageX: 0, + pageY: 0, + ctrlKey: 0, + shiftKey: 0, + altKey: 0, + metaKey: 0, + getModifierState: getEventModifierState, + button: 0, + buttons: 0, + relatedTarget: function (event) { + if (event.relatedTarget === undefined) return event.fromElement === event.srcElement ? event.toElement : event.fromElement; + return event.relatedTarget; + }, + movementX: function (event) { + if ('movementX' in event) { + return event.movementX; + } + + updateMouseMovementPolyfillState(event); + return lastMovementX; + }, + movementY: function (event) { + if ('movementY' in event) { + return event.movementY; + } // Don't need to call updateMouseMovementPolyfillState() here + // because it's guaranteed to have already run when movementX + // was copied. + + + return lastMovementY; + } +}); + +var SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface); +/** + * @interface DragEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + +var DragEventInterface = _assign({}, MouseEventInterface, { + dataTransfer: 0 +}); + +var SyntheticDragEvent = createSyntheticEvent(DragEventInterface); +/** + * @interface FocusEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + +var FocusEventInterface = _assign({}, UIEventInterface, { + relatedTarget: 0 +}); + +var SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface + * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent + */ + +var AnimationEventInterface = _assign({}, EventInterface, { + animationName: 0, + elapsedTime: 0, + pseudoElement: 0 +}); + +var SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/clipboard-apis/ + */ + +var ClipboardEventInterface = _assign({}, EventInterface, { + clipboardData: function (event) { + return 'clipboardData' in event ? event.clipboardData : window.clipboardData; + } +}); + +var SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents + */ + +var CompositionEventInterface = _assign({}, EventInterface, { + data: 0 +}); + +var SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 + * /#events-inputevents + */ +// Happens to share the same list for now. + +var SyntheticInputEvent = SyntheticCompositionEvent; +/** + * Normalization of deprecated HTML5 `key` values + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + +var normalizeKey = { + Esc: 'Escape', + Spacebar: ' ', + Left: 'ArrowLeft', + Up: 'ArrowUp', + Right: 'ArrowRight', + Down: 'ArrowDown', + Del: 'Delete', + Win: 'OS', + Menu: 'ContextMenu', + Apps: 'ContextMenu', + Scroll: 'ScrollLock', + MozPrintableKey: 'Unidentified' +}; +/** + * Translation from legacy `keyCode` to HTML5 `key` + * Only special keys supported, all others depend on keyboard layout or browser + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + +var translateToKey = { + '8': 'Backspace', + '9': 'Tab', + '12': 'Clear', + '13': 'Enter', + '16': 'Shift', + '17': 'Control', + '18': 'Alt', + '19': 'Pause', + '20': 'CapsLock', + '27': 'Escape', + '32': ' ', + '33': 'PageUp', + '34': 'PageDown', + '35': 'End', + '36': 'Home', + '37': 'ArrowLeft', + '38': 'ArrowUp', + '39': 'ArrowRight', + '40': 'ArrowDown', + '45': 'Insert', + '46': 'Delete', + '112': 'F1', + '113': 'F2', + '114': 'F3', + '115': 'F4', + '116': 'F5', + '117': 'F6', + '118': 'F7', + '119': 'F8', + '120': 'F9', + '121': 'F10', + '122': 'F11', + '123': 'F12', + '144': 'NumLock', + '145': 'ScrollLock', + '224': 'Meta' +}; +/** + * @param {object} nativeEvent Native browser event. + * @return {string} Normalized `key` property. + */ + +function getEventKey(nativeEvent) { + if (nativeEvent.key) { + // Normalize inconsistent values reported by browsers due to + // implementations of a working draft specification. + // FireFox implements `key` but returns `MozPrintableKey` for all + // printable characters (normalized to `Unidentified`), ignore it. + var key = normalizeKey[nativeEvent.key] || nativeEvent.key; + + if (key !== 'Unidentified') { + return key; + } + } // Browser does not implement `key`, polyfill as much of it as we can. + + + if (nativeEvent.type === 'keypress') { + var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can + // thus be captured by `keypress`, no other non-printable key should. + + return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); + } + + if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { + // While user keyboard layout determines the actual meaning of each + // `keyCode` value, almost all function keys have a universal value. + return translateToKey[nativeEvent.keyCode] || 'Unidentified'; + } + + return ''; +} +/** + * Translation from modifier key to the associated property in the event. + * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers + */ + + +var modifierKeyToProp = { + Alt: 'altKey', + Control: 'ctrlKey', + Meta: 'metaKey', + Shift: 'shiftKey' +}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support +// getModifierState. If getModifierState is not supported, we map it to a set of +// modifier keys exposed by the event. In this case, Lock-keys are not supported. + +function modifierStateGetter(keyArg) { + var syntheticEvent = this; + var nativeEvent = syntheticEvent.nativeEvent; + + if (nativeEvent.getModifierState) { + return nativeEvent.getModifierState(keyArg); + } + + var keyProp = modifierKeyToProp[keyArg]; + return keyProp ? !!nativeEvent[keyProp] : false; +} + +function getEventModifierState(nativeEvent) { + return modifierStateGetter; +} +/** + * @interface KeyboardEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + + +var KeyboardEventInterface = _assign({}, UIEventInterface, { + key: getEventKey, + code: 0, + location: 0, + ctrlKey: 0, + shiftKey: 0, + altKey: 0, + metaKey: 0, + repeat: 0, + locale: 0, + getModifierState: getEventModifierState, + // Legacy Interface + charCode: function (event) { + // `charCode` is the result of a KeyPress event and represents the value of + // the actual printable character. + // KeyPress is deprecated, but its replacement is not yet final and not + // implemented in any major browser. Only KeyPress has charCode. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + + return 0; + }, + keyCode: function (event) { + // `keyCode` is the result of a KeyDown/Up event and represents the value of + // physical keyboard key. + // The actual meaning of the value depends on the users' keyboard layout + // which cannot be detected. Assuming that it is a US keyboard layout + // provides a surprisingly accurate mapping for US and European users. + // Due to this, it is left to the user to implement at this time. + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + + return 0; + }, + which: function (event) { + // `which` is an alias for either `keyCode` or `charCode` depending on the + // type of the event. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + + return 0; + } +}); + +var SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface); +/** + * @interface PointerEvent + * @see http://www.w3.org/TR/pointerevents/ + */ + +var PointerEventInterface = _assign({}, MouseEventInterface, { + pointerId: 0, + width: 0, + height: 0, + pressure: 0, + tangentialPressure: 0, + tiltX: 0, + tiltY: 0, + twist: 0, + pointerType: 0, + isPrimary: 0 +}); + +var SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface); +/** + * @interface TouchEvent + * @see http://www.w3.org/TR/touch-events/ + */ + +var TouchEventInterface = _assign({}, UIEventInterface, { + touches: 0, + targetTouches: 0, + changedTouches: 0, + altKey: 0, + metaKey: 0, + ctrlKey: 0, + shiftKey: 0, + getModifierState: getEventModifierState +}); + +var SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- + * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent + */ + +var TransitionEventInterface = _assign({}, EventInterface, { + propertyName: 0, + elapsedTime: 0, + pseudoElement: 0 +}); + +var SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface); +/** + * @interface WheelEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + +var WheelEventInterface = _assign({}, MouseEventInterface, { + deltaX: function (event) { + return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; + }, + deltaY: function (event) { + return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). + 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). + 'wheelDelta' in event ? -event.wheelDelta : 0; + }, + deltaZ: 0, + // Browsers without "deltaMode" is reporting in raw wheel delta where one + // notch on the scroll is always +/- 120, roughly equivalent to pixels. + // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or + // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. + deltaMode: 0 +}); + +var SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface); + +var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space + +var START_KEYCODE = 229; +var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window; +var documentMode = null; + +if (canUseDOM && 'documentMode' in document) { + documentMode = document.documentMode; +} // Webkit offers a very useful `textInput` event that can be used to +// directly represent `beforeInput`. The IE `textinput` event is not as +// useful, so we don't use it. + + +var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied +// by the native compositionend event may be incorrect. Japanese ideographic +// spaces, for instance (\u3000) are not recorded correctly. + +var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); +var SPACEBAR_CODE = 32; +var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); + +function registerEvents() { + registerTwoPhaseEvent('onBeforeInput', ['compositionend', 'keypress', 'textInput', 'paste']); + registerTwoPhaseEvent('onCompositionEnd', ['compositionend', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']); + registerTwoPhaseEvent('onCompositionStart', ['compositionstart', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']); + registerTwoPhaseEvent('onCompositionUpdate', ['compositionupdate', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']); +} // Track whether we've ever handled a keypress on the space key. + + +var hasSpaceKeypress = false; +/** + * Return whether a native keypress event is assumed to be a command. + * This is required because Firefox fires `keypress` events for key commands + * (cut, copy, select-all, etc.) even though no character is inserted. + */ + +function isKeypressCommand(nativeEvent) { + return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command. + !(nativeEvent.ctrlKey && nativeEvent.altKey); +} +/** + * Translate native top level events into event types. + */ + + +function getCompositionEventType(domEventName) { + switch (domEventName) { + case 'compositionstart': + return 'onCompositionStart'; + + case 'compositionend': + return 'onCompositionEnd'; + + case 'compositionupdate': + return 'onCompositionUpdate'; + } +} +/** + * Does our fallback best-guess model think this event signifies that + * composition has begun? + */ + + +function isFallbackCompositionStart(domEventName, nativeEvent) { + return domEventName === 'keydown' && nativeEvent.keyCode === START_KEYCODE; +} +/** + * Does our fallback mode think that this event is the end of composition? + */ + + +function isFallbackCompositionEnd(domEventName, nativeEvent) { + switch (domEventName) { + case 'keyup': + // Command keys insert or clear IME input. + return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; + + case 'keydown': + // Expect IME keyCode on each keydown. If we get any other + // code we must have exited earlier. + return nativeEvent.keyCode !== START_KEYCODE; + + case 'keypress': + case 'mousedown': + case 'focusout': + // Events are not possible without cancelling IME. + return true; + + default: + return false; + } +} +/** + * Google Input Tools provides composition data via a CustomEvent, + * with the `data` property populated in the `detail` object. If this + * is available on the event object, use it. If not, this is a plain + * composition event and we have nothing special to extract. + * + * @param {object} nativeEvent + * @return {?string} + */ + + +function getDataFromCustomEvent(nativeEvent) { + var detail = nativeEvent.detail; + + if (typeof detail === 'object' && 'data' in detail) { + return detail.data; + } + + return null; +} +/** + * Check if a composition event was triggered by Korean IME. + * Our fallback mode does not work well with IE's Korean IME, + * so just use native composition events when Korean IME is used. + * Although CompositionEvent.locale property is deprecated, + * it is available in IE, where our fallback mode is enabled. + * + * @param {object} nativeEvent + * @return {boolean} + */ + + +function isUsingKoreanIME(nativeEvent) { + return nativeEvent.locale === 'ko'; +} // Track the current IME composition status, if any. + + +var isComposing = false; +/** + * @return {?object} A SyntheticCompositionEvent. + */ + +function extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) { + var eventType; + var fallbackData; + + if (canUseCompositionEvent) { + eventType = getCompositionEventType(domEventName); + } else if (!isComposing) { + if (isFallbackCompositionStart(domEventName, nativeEvent)) { + eventType = 'onCompositionStart'; + } + } else if (isFallbackCompositionEnd(domEventName, nativeEvent)) { + eventType = 'onCompositionEnd'; + } + + if (!eventType) { + return null; + } + + if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) { + // The current composition is stored statically and must not be + // overwritten while composition continues. + if (!isComposing && eventType === 'onCompositionStart') { + isComposing = initialize(nativeEventTarget); + } else if (eventType === 'onCompositionEnd') { + if (isComposing) { + fallbackData = getData(); + } + } + } + + var listeners = accumulateTwoPhaseListeners(targetInst, eventType); + + if (listeners.length > 0) { + var event = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + + if (fallbackData) { + // Inject data generated from fallback path into the synthetic event. + // This matches the property of native CompositionEventInterface. + event.data = fallbackData; + } else { + var customData = getDataFromCustomEvent(nativeEvent); + + if (customData !== null) { + event.data = customData; + } + } + } +} + +function getNativeBeforeInputChars(domEventName, nativeEvent) { + switch (domEventName) { + case 'compositionend': + return getDataFromCustomEvent(nativeEvent); + + case 'keypress': + /** + * If native `textInput` events are available, our goal is to make + * use of them. However, there is a special case: the spacebar key. + * In Webkit, preventing default on a spacebar `textInput` event + * cancels character insertion, but it *also* causes the browser + * to fall back to its default spacebar behavior of scrolling the + * page. + * + * Tracking at: + * https://code.google.com/p/chromium/issues/detail?id=355103 + * + * To avoid this issue, use the keypress event as if no `textInput` + * event is available. + */ + var which = nativeEvent.which; + + if (which !== SPACEBAR_CODE) { + return null; + } + + hasSpaceKeypress = true; + return SPACEBAR_CHAR; + + case 'textInput': + // Record the characters to be added to the DOM. + var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled + // it at the keypress level and bail immediately. Android Chrome + // doesn't give us keycodes, so we need to ignore it. + + if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { + return null; + } + + return chars; + + default: + // For other native event types, do nothing. + return null; + } +} +/** + * For browsers that do not provide the `textInput` event, extract the + * appropriate string to use for SyntheticInputEvent. + */ + + +function getFallbackBeforeInputChars(domEventName, nativeEvent) { + // If we are currently composing (IME) and using a fallback to do so, + // try to extract the composed characters from the fallback object. + // If composition event is available, we extract a string only at + // compositionevent, otherwise extract it at fallback events. + if (isComposing) { + if (domEventName === 'compositionend' || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent)) { + var chars = getData(); + reset(); + isComposing = false; + return chars; + } + + return null; + } + + switch (domEventName) { + case 'paste': + // If a paste event occurs after a keypress, throw out the input + // chars. Paste events should not lead to BeforeInput events. + return null; + + case 'keypress': + /** + * As of v27, Firefox may fire keypress events even when no character + * will be inserted. A few possibilities: + * + * - `which` is `0`. Arrow keys, Esc key, etc. + * + * - `which` is the pressed key code, but no char is available. + * Ex: 'AltGr + d` in Polish. There is no modified character for + * this key combination and no character is inserted into the + * document, but FF fires the keypress for char code `100` anyway. + * No `input` event will occur. + * + * - `which` is the pressed key code, but a command combination is + * being used. Ex: `Cmd+C`. No character is inserted, and no + * `input` event will occur. + */ + if (!isKeypressCommand(nativeEvent)) { + // IE fires the `keypress` event when a user types an emoji via + // Touch keyboard of Windows. In such a case, the `char` property + // holds an emoji character like `\uD83D\uDE0A`. Because its length + // is 2, the property `which` does not represent an emoji correctly. + // In such a case, we directly return the `char` property instead of + // using `which`. + if (nativeEvent.char && nativeEvent.char.length > 1) { + return nativeEvent.char; + } else if (nativeEvent.which) { + return String.fromCharCode(nativeEvent.which); + } + } + + return null; + + case 'compositionend': + return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data; + + default: + return null; + } +} +/** + * Extract a SyntheticInputEvent for `beforeInput`, based on either native + * `textInput` or fallback behavior. + * + * @return {?object} A SyntheticInputEvent. + */ + + +function extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) { + var chars; + + if (canUseTextInputEvent) { + chars = getNativeBeforeInputChars(domEventName, nativeEvent); + } else { + chars = getFallbackBeforeInputChars(domEventName, nativeEvent); + } // If no characters are being inserted, no BeforeInput event should + // be fired. + + + if (!chars) { + return null; + } + + var listeners = accumulateTwoPhaseListeners(targetInst, 'onBeforeInput'); + + if (listeners.length > 0) { + var event = new SyntheticInputEvent('onBeforeInput', 'beforeinput', null, nativeEvent, nativeEventTarget); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + event.data = chars; + } +} +/** + * Create an `onBeforeInput` event to match + * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. + * + * This event plugin is based on the native `textInput` event + * available in Chrome, Safari, Opera, and IE. This event fires after + * `onKeyPress` and `onCompositionEnd`, but before `onInput`. + * + * `beforeInput` is spec'd but not implemented in any browsers, and + * the `input` event does not provide any useful information about what has + * actually been added, contrary to the spec. Thus, `textInput` is the best + * available event to identify the characters that have actually been inserted + * into the target node. + * + * This plugin is also responsible for emitting `composition` events, thus + * allowing us to share composition fallback code for both `beforeInput` and + * `composition` event types. + */ + + +function extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); +} + +/** + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + */ +var supportedInputTypes = { + color: true, + date: true, + datetime: true, + 'datetime-local': true, + email: true, + month: true, + number: true, + password: true, + range: true, + search: true, + tel: true, + text: true, + time: true, + url: true, + week: true +}; + +function isTextInputElement(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + + if (nodeName === 'input') { + return !!supportedInputTypes[elem.type]; + } + + if (nodeName === 'textarea') { + return true; + } + + return false; +} + +/** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ + +function isEventSupported(eventNameSuffix) { + if (!canUseDOM) { + return false; + } + + var eventName = 'on' + eventNameSuffix; + var isSupported = (eventName in document); + + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + return isSupported; +} + +function registerEvents$1() { + registerTwoPhaseEvent('onChange', ['change', 'click', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'selectionchange']); +} + +function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) { + // Flag this event loop as needing state restore. + enqueueStateRestore(target); + var listeners = accumulateTwoPhaseListeners(inst, 'onChange'); + + if (listeners.length > 0) { + var event = new SyntheticEvent('onChange', 'change', null, nativeEvent, target); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + } +} +/** + * For IE shims + */ + + +var activeElement = null; +var activeElementInst = null; +/** + * SECTION: handle `change` event + */ + +function shouldUseChangeEvent(elem) { + var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; +} + +function manualDispatchChangeEvent(nativeEvent) { + var dispatchQueue = []; + createAndAccumulateChangeEvent(dispatchQueue, activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the + // other events and have it go through ReactBrowserEventEmitter. Since it + // doesn't, we manually listen for the events and so we have to enqueue and + // process the abstract event manually. + // + // Batching is necessary here in order to ensure that all event handlers run + // before the next rerender (including event handlers attached to ancestor + // elements instead of directly on the input). Without this, controlled + // components don't work properly in conjunction with event bubbling because + // the component is rerendered and the value reverted before all the event + // handlers can run. See https://github.com/facebook/react/issues/708. + + batchedUpdates(runEventInBatch, dispatchQueue); +} + +function runEventInBatch(dispatchQueue) { + processDispatchQueue(dispatchQueue, 0); +} + +function getInstIfValueChanged(targetInst) { + var targetNode = getNodeFromInstance(targetInst); + + if (updateValueIfChanged(targetNode)) { + return targetInst; + } +} + +function getTargetInstForChangeEvent(domEventName, targetInst) { + if (domEventName === 'change') { + return targetInst; + } +} +/** + * SECTION: handle `input` event + */ + + +var isInputEventSupported = false; + +if (canUseDOM) { + // IE9 claims to support the input event but fails to trigger it when + // deleting text, so we ignore its input events. + isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9); +} +/** + * (For IE <=9) Starts tracking propertychange events on the passed-in element + * and override the value property so that we can distinguish user events from + * value changes in JS. + */ + + +function startWatchingForValueChange(target, targetInst) { + activeElement = target; + activeElementInst = targetInst; + activeElement.attachEvent('onpropertychange', handlePropertyChange); +} +/** + * (For IE <=9) Removes the event listeners from the currently-tracked element, + * if any exists. + */ + + +function stopWatchingForValueChange() { + if (!activeElement) { + return; + } + + activeElement.detachEvent('onpropertychange', handlePropertyChange); + activeElement = null; + activeElementInst = null; +} +/** + * (For IE <=9) Handles a propertychange event, sending a `change` event if + * the value of the active element has changed. + */ + + +function handlePropertyChange(nativeEvent) { + if (nativeEvent.propertyName !== 'value') { + return; + } + + if (getInstIfValueChanged(activeElementInst)) { + manualDispatchChangeEvent(nativeEvent); + } +} + +function handleEventsForInputEventPolyfill(domEventName, target, targetInst) { + if (domEventName === 'focusin') { + // In IE9, propertychange fires for most input events but is buggy and + // doesn't fire when text is deleted, but conveniently, selectionchange + // appears to fire in all of the remaining cases so we catch those and + // forward the event if the value has changed + // In either case, we don't want to call the event handler if the value + // is changed from JS so we redefine a setter for `.value` that updates + // our activeElementValue variable, allowing us to ignore those changes + // + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForValueChange(); + startWatchingForValueChange(target, targetInst); + } else if (domEventName === 'focusout') { + stopWatchingForValueChange(); + } +} // For IE8 and IE9. + + +function getTargetInstForInputEventPolyfill(domEventName, targetInst) { + if (domEventName === 'selectionchange' || domEventName === 'keyup' || domEventName === 'keydown') { + // On the selectionchange event, the target is just document which isn't + // helpful for us so just check activeElement instead. + // + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire + // propertychange on the first input event after setting `value` from a + // script and fires only keydown, keypress, keyup. Catching keyup usually + // gets it and catching keydown lets us fire an event for the first + // keystroke if user does a key repeat (it'll be a little delayed: right + // before the second keystroke). Other input methods (e.g., paste) seem to + // fire selectionchange normally. + return getInstIfValueChanged(activeElementInst); + } +} +/** + * SECTION: handle `click` event + */ + + +function shouldUseClickEvent(elem) { + // Use the `click` event to detect changes to checkbox and radio inputs. + // This approach works across all browsers, whereas `change` does not fire + // until `blur` in IE8. + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); +} + +function getTargetInstForClickEvent(domEventName, targetInst) { + if (domEventName === 'click') { + return getInstIfValueChanged(targetInst); + } +} + +function getTargetInstForInputOrChangeEvent(domEventName, targetInst) { + if (domEventName === 'input' || domEventName === 'change') { + return getInstIfValueChanged(targetInst); + } +} + +function handleControlledInputBlur(node) { + var state = node._wrapperState; + + if (!state || !state.controlled || node.type !== 'number') { + return; + } + + { + // If controlled, assign the value attribute to the current value on blur + setDefaultValue(node, 'number', node.value); + } +} +/** + * This plugin creates an `onChange` event that normalizes change events + * across form elements. This event fires at a time when it's possible to + * change the element's value without seeing a flicker. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - select + */ + + +function extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + var targetNode = targetInst ? getNodeFromInstance(targetInst) : window; + var getTargetInstFunc, handleEventFunc; + + if (shouldUseChangeEvent(targetNode)) { + getTargetInstFunc = getTargetInstForChangeEvent; + } else if (isTextInputElement(targetNode)) { + if (isInputEventSupported) { + getTargetInstFunc = getTargetInstForInputOrChangeEvent; + } else { + getTargetInstFunc = getTargetInstForInputEventPolyfill; + handleEventFunc = handleEventsForInputEventPolyfill; + } + } else if (shouldUseClickEvent(targetNode)) { + getTargetInstFunc = getTargetInstForClickEvent; + } + + if (getTargetInstFunc) { + var inst = getTargetInstFunc(domEventName, targetInst); + + if (inst) { + createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, nativeEventTarget); + return; + } + } + + if (handleEventFunc) { + handleEventFunc(domEventName, targetNode, targetInst); + } // When blurring, set the value attribute for number inputs + + + if (domEventName === 'focusout') { + handleControlledInputBlur(targetNode); + } +} + +function registerEvents$2() { + registerDirectEvent('onMouseEnter', ['mouseout', 'mouseover']); + registerDirectEvent('onMouseLeave', ['mouseout', 'mouseover']); + registerDirectEvent('onPointerEnter', ['pointerout', 'pointerover']); + registerDirectEvent('onPointerLeave', ['pointerout', 'pointerover']); +} +/** + * For almost every interaction we care about, there will be both a top-level + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that + * we do not extract duplicate events. However, moving the mouse into the + * browser from outside will not fire a `mouseout` event. In this case, we use + * the `mouseover` top-level event. + */ + + +function extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + var isOverEvent = domEventName === 'mouseover' || domEventName === 'pointerover'; + var isOutEvent = domEventName === 'mouseout' || domEventName === 'pointerout'; + + if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0) { + // If this is an over event with a target, we might have already dispatched + // the event in the out event of the other target. If this is replayed, + // then it's because we couldn't dispatch against this target previously + // so we have to do it now instead. + var related = nativeEvent.relatedTarget || nativeEvent.fromElement; + + if (related) { + // If the related node is managed by React, we can assume that we have + // already dispatched the corresponding events during its mouseout. + if (getClosestInstanceFromNode(related) || isContainerMarkedAsRoot(related)) { + return; + } + } + } + + if (!isOutEvent && !isOverEvent) { + // Must not be a mouse or pointer in or out - ignoring. + return; + } + + var win; // TODO: why is this nullable in the types but we read from it? + + if (nativeEventTarget.window === nativeEventTarget) { + // `nativeEventTarget` is probably a window object. + win = nativeEventTarget; + } else { + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + var doc = nativeEventTarget.ownerDocument; + + if (doc) { + win = doc.defaultView || doc.parentWindow; + } else { + win = window; + } + } + + var from; + var to; + + if (isOutEvent) { + var _related = nativeEvent.relatedTarget || nativeEvent.toElement; + + from = targetInst; + to = _related ? getClosestInstanceFromNode(_related) : null; + + if (to !== null) { + var nearestMounted = getNearestMountedFiber(to); + + if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) { + to = null; + } + } + } else { + // Moving to a node from outside the window. + from = null; + to = targetInst; + } + + if (from === to) { + // Nothing pertains to our managed components. + return; + } + + var SyntheticEventCtor = SyntheticMouseEvent; + var leaveEventType = 'onMouseLeave'; + var enterEventType = 'onMouseEnter'; + var eventTypePrefix = 'mouse'; + + if (domEventName === 'pointerout' || domEventName === 'pointerover') { + SyntheticEventCtor = SyntheticPointerEvent; + leaveEventType = 'onPointerLeave'; + enterEventType = 'onPointerEnter'; + eventTypePrefix = 'pointer'; + } + + var fromNode = from == null ? win : getNodeFromInstance(from); + var toNode = to == null ? win : getNodeFromInstance(to); + var leave = new SyntheticEventCtor(leaveEventType, eventTypePrefix + 'leave', from, nativeEvent, nativeEventTarget); + leave.target = fromNode; + leave.relatedTarget = toNode; + var enter = null; // We should only process this nativeEvent if we are processing + // the first ancestor. Next time, we will ignore the event. + + var nativeTargetInst = getClosestInstanceFromNode(nativeEventTarget); + + if (nativeTargetInst === targetInst) { + var enterEvent = new SyntheticEventCtor(enterEventType, eventTypePrefix + 'enter', to, nativeEvent, nativeEventTarget); + enterEvent.target = toNode; + enterEvent.relatedTarget = fromNode; + enter = enterEvent; + } + + accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leave, enter, from, to); +} + +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; +} + +var objectIs = typeof Object.is === 'function' ? Object.is : is; + +var hasOwnProperty$2 = Object.prototype.hasOwnProperty; +/** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ + +function shallowEqual(objA, objB) { + if (objectIs(objA, objB)) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } // Test for A's keys different from B. + + + for (var i = 0; i < keysA.length; i++) { + if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) { + return false; + } + } + + return true; +} + +/** + * Given any node return the first leaf node without children. + * + * @param {DOMElement|DOMTextNode} node + * @return {DOMElement|DOMTextNode} + */ + +function getLeafNode(node) { + while (node && node.firstChild) { + node = node.firstChild; + } + + return node; +} +/** + * Get the next sibling within a container. This will walk up the + * DOM if a node's siblings have been exhausted. + * + * @param {DOMElement|DOMTextNode} node + * @return {?DOMElement|DOMTextNode} + */ + + +function getSiblingNode(node) { + while (node) { + if (node.nextSibling) { + return node.nextSibling; + } + + node = node.parentNode; + } +} +/** + * Get object describing the nodes which contain characters at offset. + * + * @param {DOMElement|DOMTextNode} root + * @param {number} offset + * @return {?object} + */ + + +function getNodeForCharacterOffset(root, offset) { + var node = getLeafNode(root); + var nodeStart = 0; + var nodeEnd = 0; + + while (node) { + if (node.nodeType === TEXT_NODE) { + nodeEnd = nodeStart + node.textContent.length; + + if (nodeStart <= offset && nodeEnd >= offset) { + return { + node: node, + offset: offset - nodeStart + }; + } + + nodeStart = nodeEnd; + } + + node = getLeafNode(getSiblingNode(node)); + } +} + +/** + * @param {DOMElement} outerNode + * @return {?object} + */ + +function getOffsets(outerNode) { + var ownerDocument = outerNode.ownerDocument; + var win = ownerDocument && ownerDocument.defaultView || window; + var selection = win.getSelection && win.getSelection(); + + if (!selection || selection.rangeCount === 0) { + return null; + } + + var anchorNode = selection.anchorNode, + anchorOffset = selection.anchorOffset, + focusNode = selection.focusNode, + focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the + // up/down buttons on an <input type="number">. Anonymous divs do not seem to + // expose properties, triggering a "Permission denied error" if any of its + // properties are accessed. The only seemingly possible way to avoid erroring + // is to access a property that typically works for non-anonymous divs and + // catch any error that may otherwise arise. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + + try { + /* eslint-disable no-unused-expressions */ + anchorNode.nodeType; + focusNode.nodeType; + /* eslint-enable no-unused-expressions */ + } catch (e) { + return null; + } + + return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset); +} +/** + * Returns {start, end} where `start` is the character/codepoint index of + * (anchorNode, anchorOffset) within the textContent of `outerNode`, and + * `end` is the index of (focusNode, focusOffset). + * + * Returns null if you pass in garbage input but we should probably just crash. + * + * Exported only for testing. + */ + +function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) { + var length = 0; + var start = -1; + var end = -1; + var indexWithinAnchor = 0; + var indexWithinFocus = 0; + var node = outerNode; + var parentNode = null; + + outer: while (true) { + var next = null; + + while (true) { + if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) { + start = length + anchorOffset; + } + + if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) { + end = length + focusOffset; + } + + if (node.nodeType === TEXT_NODE) { + length += node.nodeValue.length; + } + + if ((next = node.firstChild) === null) { + break; + } // Moving from `node` to its first child `next`. + + + parentNode = node; + node = next; + } + + while (true) { + if (node === outerNode) { + // If `outerNode` has children, this is always the second time visiting + // it. If it has no children, this is still the first loop, and the only + // valid selection is anchorNode and focusNode both equal to this node + // and both offsets 0, in which case we will have handled above. + break outer; + } + + if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) { + start = length; + } + + if (parentNode === focusNode && ++indexWithinFocus === focusOffset) { + end = length; + } + + if ((next = node.nextSibling) !== null) { + break; + } + + node = parentNode; + parentNode = node.parentNode; + } // Moving from `node` to its next sibling `next`. + + + node = next; + } + + if (start === -1 || end === -1) { + // This should never happen. (Would happen if the anchor/focus nodes aren't + // actually inside the passed-in node.) + return null; + } + + return { + start: start, + end: end + }; +} +/** + * In modern non-IE browsers, we can support both forward and backward + * selections. + * + * Note: IE10+ supports the Selection object, but it does not support + * the `extend` method, which means that even in modern IE, it's not possible + * to programmatically create a backward selection. Thus, for all IE + * versions, we use the old IE API to create our selections. + * + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + +function setOffsets(node, offsets) { + var doc = node.ownerDocument || document; + var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios. + // (For instance: TinyMCE editor used in a list component that supports pasting to add more, + // fails when pasting 100+ items) + + if (!win.getSelection) { + return; + } + + var selection = win.getSelection(); + var length = node.textContent.length; + var start = Math.min(offsets.start, length); + var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. + + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; + } + + var startMarker = getNodeForCharacterOffset(node, start); + var endMarker = getNodeForCharacterOffset(node, end); + + if (startMarker && endMarker) { + if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) { + return; + } + + var range = doc.createRange(); + range.setStart(startMarker.node, startMarker.offset); + selection.removeAllRanges(); + + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); + } + } +} + +function isTextNode(node) { + return node && node.nodeType === TEXT_NODE; +} + +function containsNode(outerNode, innerNode) { + if (!outerNode || !innerNode) { + return false; + } else if (outerNode === innerNode) { + return true; + } else if (isTextNode(outerNode)) { + return false; + } else if (isTextNode(innerNode)) { + return containsNode(outerNode, innerNode.parentNode); + } else if ('contains' in outerNode) { + return outerNode.contains(innerNode); + } else if (outerNode.compareDocumentPosition) { + return !!(outerNode.compareDocumentPosition(innerNode) & 16); + } else { + return false; + } +} + +function isInDocument(node) { + return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node); +} + +function isSameOriginFrame(iframe) { + try { + // Accessing the contentDocument of a HTMLIframeElement can cause the browser + // to throw, e.g. if it has a cross-origin src attribute. + // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g: + // iframe.contentDocument.defaultView; + // A safety way is to access one of the cross origin properties: Window or Location + // Which might result in "SecurityError" DOM Exception and it is compatible to Safari. + // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl + return typeof iframe.contentWindow.location.href === 'string'; + } catch (err) { + return false; + } +} + +function getActiveElementDeep() { + var win = window; + var element = getActiveElement(); + + while (element instanceof win.HTMLIFrameElement) { + if (isSameOriginFrame(element)) { + win = element.contentWindow; + } else { + return element; + } + + element = getActiveElement(win.document); + } + + return element; +} +/** + * @ReactInputSelection: React input selection module. Based on Selection.js, + * but modified to be suitable for react and has a couple of bug fixes (doesn't + * assume buttons have range selections allowed). + * Input selection module for React. + */ + +/** + * @hasSelectionCapabilities: we get the element types that support selection + * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart` + * and `selectionEnd` rows. + */ + + +function hasSelectionCapabilities(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true'); +} +function getSelectionInformation() { + var focusedElem = getActiveElementDeep(); + return { + focusedElem: focusedElem, + selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null + }; +} +/** + * @restoreSelection: If any selection information was potentially lost, + * restore it. This is useful when performing operations that could remove dom + * nodes and place them back in, resulting in focus being lost. + */ + +function restoreSelection(priorSelectionInformation) { + var curFocusedElem = getActiveElementDeep(); + var priorFocusedElem = priorSelectionInformation.focusedElem; + var priorSelectionRange = priorSelectionInformation.selectionRange; + + if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { + if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) { + setSelection(priorFocusedElem, priorSelectionRange); + } // Focusing a node can change the scroll position, which is undesirable + + + var ancestors = []; + var ancestor = priorFocusedElem; + + while (ancestor = ancestor.parentNode) { + if (ancestor.nodeType === ELEMENT_NODE) { + ancestors.push({ + element: ancestor, + left: ancestor.scrollLeft, + top: ancestor.scrollTop + }); + } + } + + if (typeof priorFocusedElem.focus === 'function') { + priorFocusedElem.focus(); + } + + for (var i = 0; i < ancestors.length; i++) { + var info = ancestors[i]; + info.element.scrollLeft = info.left; + info.element.scrollTop = info.top; + } + } +} +/** + * @getSelection: Gets the selection bounds of a focused textarea, input or + * contentEditable node. + * -@input: Look up selection bounds of this input + * -@return {start: selectionStart, end: selectionEnd} + */ + +function getSelection(input) { + var selection; + + if ('selectionStart' in input) { + // Modern browser with input or textarea. + selection = { + start: input.selectionStart, + end: input.selectionEnd + }; + } else { + // Content editable or old IE textarea. + selection = getOffsets(input); + } + + return selection || { + start: 0, + end: 0 + }; +} +/** + * @setSelection: Sets the selection bounds of a textarea or input and focuses + * the input. + * -@input Set selection bounds of this input or textarea + * -@offsets Object of same form that is returned from get* + */ + +function setSelection(input, offsets) { + var start = offsets.start; + var end = offsets.end; + + if (end === undefined) { + end = start; + } + + if ('selectionStart' in input) { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + } else { + setOffsets(input, offsets); + } +} + +var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11; + +function registerEvents$3() { + registerTwoPhaseEvent('onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin', 'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']); +} + +var activeElement$1 = null; +var activeElementInst$1 = null; +var lastSelection = null; +var mouseDown = false; +/** + * Get an object which is a unique representation of the current selection. + * + * The return value will not be consistent across nodes or browsers, but + * two identical selections on the same node will return identical objects. + */ + +function getSelection$1(node) { + if ('selectionStart' in node && hasSelectionCapabilities(node)) { + return { + start: node.selectionStart, + end: node.selectionEnd + }; + } else { + var win = node.ownerDocument && node.ownerDocument.defaultView || window; + var selection = win.getSelection(); + return { + anchorNode: selection.anchorNode, + anchorOffset: selection.anchorOffset, + focusNode: selection.focusNode, + focusOffset: selection.focusOffset + }; + } +} +/** + * Get document associated with the event target. + */ + + +function getEventTargetDocument(eventTarget) { + return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument; +} +/** + * Poll selection to see whether it's changed. + * + * @param {object} nativeEvent + * @param {object} nativeEventTarget + * @return {?SyntheticEvent} + */ + + +function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) { + // Ensure we have the right element, and that the user is not dragging a + // selection (this matches native `select` event behavior). In HTML5, select + // fires only on input and textarea thus if there's no focused element we + // won't dispatch. + var doc = getEventTargetDocument(nativeEventTarget); + + if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) { + return; + } // Only fire when selection has actually changed. + + + var currentSelection = getSelection$1(activeElement$1); + + if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { + lastSelection = currentSelection; + var listeners = accumulateTwoPhaseListeners(activeElementInst$1, 'onSelect'); + + if (listeners.length > 0) { + var event = new SyntheticEvent('onSelect', 'select', null, nativeEvent, nativeEventTarget); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + event.target = activeElement$1; + } + } +} +/** + * This plugin creates an `onSelect` event that normalizes select events + * across form elements. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - contentEditable + * + * This differs from native browser implementations in the following ways: + * - Fires on contentEditable fields as well as inputs. + * - Fires for collapsed selection. + * - Fires after user input. + */ + + +function extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + + var targetNode = targetInst ? getNodeFromInstance(targetInst) : window; + + switch (domEventName) { + // Track the input node that has focus. + case 'focusin': + if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') { + activeElement$1 = targetNode; + activeElementInst$1 = targetInst; + lastSelection = null; + } + + break; + + case 'focusout': + activeElement$1 = null; + activeElementInst$1 = null; + lastSelection = null; + break; + // Don't fire the event while the user is dragging. This matches the + // semantics of the native select event. + + case 'mousedown': + mouseDown = true; + break; + + case 'contextmenu': + case 'mouseup': + case 'dragend': + mouseDown = false; + constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); + break; + // Chrome and IE fire non-standard event when selection is changed (and + // sometimes when it hasn't). IE's event fires out of order with respect + // to key and input events on deletion, so we discard it. + // + // Firefox doesn't support selectionchange, so check selection status + // after each key entry. The selection changes after keydown and before + // keyup, but we check on keydown as well in the case of holding down a + // key, when multiple keydown events are fired but only one keyup is. + // This is also our approach for IE handling, for the reason above. + + case 'selectionchange': + if (skipSelectionChangeEvent) { + break; + } + + // falls through + + case 'keydown': + case 'keyup': + constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); + } +} + +function extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + var reactName = topLevelEventsToReactNames.get(domEventName); + + if (reactName === undefined) { + return; + } + + var SyntheticEventCtor = SyntheticEvent; + var reactEventType = domEventName; + + switch (domEventName) { + case 'keypress': + // Firefox creates a keypress event for function keys too. This removes + // the unwanted keypress events. Enter is however both printable and + // non-printable. One would expect Tab to be as well (but it isn't). + if (getEventCharCode(nativeEvent) === 0) { + return; + } + + /* falls through */ + + case 'keydown': + case 'keyup': + SyntheticEventCtor = SyntheticKeyboardEvent; + break; + + case 'focusin': + reactEventType = 'focus'; + SyntheticEventCtor = SyntheticFocusEvent; + break; + + case 'focusout': + reactEventType = 'blur'; + SyntheticEventCtor = SyntheticFocusEvent; + break; + + case 'beforeblur': + case 'afterblur': + SyntheticEventCtor = SyntheticFocusEvent; + break; + + case 'click': + // Firefox creates a click event on right mouse clicks. This removes the + // unwanted click events. + if (nativeEvent.button === 2) { + return; + } + + /* falls through */ + + case 'auxclick': + case 'dblclick': + case 'mousedown': + case 'mousemove': + case 'mouseup': // TODO: Disabled elements should not respond to mouse events + + /* falls through */ + + case 'mouseout': + case 'mouseover': + case 'contextmenu': + SyntheticEventCtor = SyntheticMouseEvent; + break; + + case 'drag': + case 'dragend': + case 'dragenter': + case 'dragexit': + case 'dragleave': + case 'dragover': + case 'dragstart': + case 'drop': + SyntheticEventCtor = SyntheticDragEvent; + break; + + case 'touchcancel': + case 'touchend': + case 'touchmove': + case 'touchstart': + SyntheticEventCtor = SyntheticTouchEvent; + break; + + case ANIMATION_END: + case ANIMATION_ITERATION: + case ANIMATION_START: + SyntheticEventCtor = SyntheticAnimationEvent; + break; + + case TRANSITION_END: + SyntheticEventCtor = SyntheticTransitionEvent; + break; + + case 'scroll': + SyntheticEventCtor = SyntheticUIEvent; + break; + + case 'wheel': + SyntheticEventCtor = SyntheticWheelEvent; + break; + + case 'copy': + case 'cut': + case 'paste': + SyntheticEventCtor = SyntheticClipboardEvent; + break; + + case 'gotpointercapture': + case 'lostpointercapture': + case 'pointercancel': + case 'pointerdown': + case 'pointermove': + case 'pointerout': + case 'pointerover': + case 'pointerup': + SyntheticEventCtor = SyntheticPointerEvent; + break; + } + + var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0; + + { + // Some events don't bubble in the browser. + // In the past, React has always bubbled them, but this can be surprising. + // We're going to try aligning closer to the browser behavior by not bubbling + // them in React either. We'll start by not bubbling onScroll, and then expand. + var accumulateTargetOnly = !inCapturePhase && // TODO: ideally, we'd eventually add all events from + // nonDelegatedEvents list in DOMPluginEventSystem. + // Then we can remove this special list. + // This is a breaking change that can wait until React 18. + domEventName === 'scroll'; + + var _listeners = accumulateSinglePhaseListeners(targetInst, reactName, nativeEvent.type, inCapturePhase, accumulateTargetOnly); + + if (_listeners.length > 0) { + // Intentionally create event lazily. + var _event = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget); + + dispatchQueue.push({ + event: _event, + listeners: _listeners + }); + } + } +} + +// TODO: remove top-level side effect. +registerSimpleEvents(); +registerEvents$2(); +registerEvents$1(); +registerEvents$3(); +registerEvents(); + +function extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + // TODO: we should remove the concept of a "SimpleEventPlugin". + // This is the basic functionality of the event system. All + // the other plugins are essentially polyfills. So the plugin + // should probably be inlined somewhere and have its logic + // be core the to event system. This would potentially allow + // us to ship builds of React without the polyfilled plugins below. + extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + var shouldProcessPolyfillPlugins = (eventSystemFlags & SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS) === 0; // We don't process these events unless we are in the + // event's native "bubble" phase, which means that we're + // not in the capture phase. That's because we emulate + // the capture phase here still. This is a trade-off, + // because in an ideal world we would not emulate and use + // the phases properly, like we do with the SimpleEvent + // plugin. However, the plugins below either expect + // emulation (EnterLeave) or use state localized to that + // plugin (BeforeInput, Change, Select). The state in + // these modules complicates things, as you'll essentially + // get the case where the capture phase event might change + // state, only for the following bubble event to come in + // later and not trigger anything as the state now + // invalidates the heuristics of the event plugin. We + // could alter all these plugins to work in such ways, but + // that might cause other unknown side-effects that we + // can't forsee right now. + + if (shouldProcessPolyfillPlugins) { + extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + } +} // List of events that need to be individually attached to media elements. + + +var mediaEventTypes = ['abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'encrypted', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting']; // We should not delegate these events to the container, but rather +// set them on the actual target element itself. This is primarily +// because these events do not consistently bubble in the DOM. + +var nonDelegatedEvents = new Set(['cancel', 'close', 'invalid', 'load', 'scroll', 'toggle'].concat(mediaEventTypes)); + +function executeDispatch(event, listener, currentTarget) { + var type = event.type || 'unknown-event'; + event.currentTarget = currentTarget; + invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event); + event.currentTarget = null; +} + +function processDispatchQueueItemsInOrder(event, dispatchListeners, inCapturePhase) { + var previousInstance; + + if (inCapturePhase) { + for (var i = dispatchListeners.length - 1; i >= 0; i--) { + var _dispatchListeners$i = dispatchListeners[i], + instance = _dispatchListeners$i.instance, + currentTarget = _dispatchListeners$i.currentTarget, + listener = _dispatchListeners$i.listener; + + if (instance !== previousInstance && event.isPropagationStopped()) { + return; + } + + executeDispatch(event, listener, currentTarget); + previousInstance = instance; + } + } else { + for (var _i = 0; _i < dispatchListeners.length; _i++) { + var _dispatchListeners$_i = dispatchListeners[_i], + _instance = _dispatchListeners$_i.instance, + _currentTarget = _dispatchListeners$_i.currentTarget, + _listener = _dispatchListeners$_i.listener; + + if (_instance !== previousInstance && event.isPropagationStopped()) { + return; + } + + executeDispatch(event, _listener, _currentTarget); + previousInstance = _instance; + } + } +} + +function processDispatchQueue(dispatchQueue, eventSystemFlags) { + var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0; + + for (var i = 0; i < dispatchQueue.length; i++) { + var _dispatchQueue$i = dispatchQueue[i], + event = _dispatchQueue$i.event, + listeners = _dispatchQueue$i.listeners; + processDispatchQueueItemsInOrder(event, listeners, inCapturePhase); // event system doesn't use pooling. + } // This would be a good time to rethrow if any of the event handlers threw. + + + rethrowCaughtError(); +} + +function dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) { + var nativeEventTarget = getEventTarget(nativeEvent); + var dispatchQueue = []; + extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + processDispatchQueue(dispatchQueue, eventSystemFlags); +} + +function listenToNonDelegatedEvent(domEventName, targetElement) { + var isCapturePhaseListener = false; + var listenerSet = getEventListenerSet(targetElement); + var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener); + + if (!listenerSet.has(listenerSetKey)) { + addTrappedEventListener(targetElement, domEventName, IS_NON_DELEGATED, isCapturePhaseListener); + listenerSet.add(listenerSetKey); + } +} +var listeningMarker = '_reactListening' + Math.random().toString(36).slice(2); +function listenToAllSupportedEvents(rootContainerElement) { + { + if (rootContainerElement[listeningMarker]) { + // Performance optimization: don't iterate through events + // for the same portal container or root node more than once. + // TODO: once we remove the flag, we may be able to also + // remove some of the bookkeeping maps used for laziness. + return; + } + + rootContainerElement[listeningMarker] = true; + allNativeEvents.forEach(function (domEventName) { + if (!nonDelegatedEvents.has(domEventName)) { + listenToNativeEvent(domEventName, false, rootContainerElement, null); + } + + listenToNativeEvent(domEventName, true, rootContainerElement, null); + }); + } +} +function listenToNativeEvent(domEventName, isCapturePhaseListener, rootContainerElement, targetElement) { + var eventSystemFlags = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var target = rootContainerElement; // selectionchange needs to be attached to the document + // otherwise it won't capture incoming events that are only + // triggered on the document directly. + + if (domEventName === 'selectionchange' && rootContainerElement.nodeType !== DOCUMENT_NODE) { + target = rootContainerElement.ownerDocument; + } // If the event can be delegated (or is capture phase), we can + // register it to the root container. Otherwise, we should + // register the event to the target element and mark it as + // a non-delegated event. + + + if (targetElement !== null && !isCapturePhaseListener && nonDelegatedEvents.has(domEventName)) { + // For all non-delegated events, apart from scroll, we attach + // their event listeners to the respective elements that their + // events fire on. That means we can skip this step, as event + // listener has already been added previously. However, we + // special case the scroll event because the reality is that any + // element can scroll. + // TODO: ideally, we'd eventually apply the same logic to all + // events from the nonDelegatedEvents list. Then we can remove + // this special case and use the same logic for all events. + if (domEventName !== 'scroll') { + return; + } + + eventSystemFlags |= IS_NON_DELEGATED; + target = targetElement; + } + + var listenerSet = getEventListenerSet(target); + var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener); // If the listener entry is empty or we should upgrade, then + // we need to trap an event listener onto the target. + + if (!listenerSet.has(listenerSetKey)) { + if (isCapturePhaseListener) { + eventSystemFlags |= IS_CAPTURE_PHASE; + } + + addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener); + listenerSet.add(listenerSetKey); + } +} + +function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener, isDeferredListenerForLegacyFBSupport) { + var listener = createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags); // If passive option is not supported, then the event will be + // active and not passive. + + var isPassiveListener = undefined; + + if (passiveBrowserEventsSupported) { + // Browsers introduced an intervention, making these events + // passive by default on document. React doesn't bind them + // to document anymore, but changing this now would undo + // the performance wins from the change. So we emulate + // the existing behavior manually on the roots now. + // https://github.com/facebook/react/issues/19651 + if (domEventName === 'touchstart' || domEventName === 'touchmove' || domEventName === 'wheel') { + isPassiveListener = true; + } + } + + targetContainer = targetContainer; + var unsubscribeListener; // When legacyFBSupport is enabled, it's for when we + + + if (isCapturePhaseListener) { + if (isPassiveListener !== undefined) { + unsubscribeListener = addEventCaptureListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener); + } else { + unsubscribeListener = addEventCaptureListener(targetContainer, domEventName, listener); + } + } else { + if (isPassiveListener !== undefined) { + unsubscribeListener = addEventBubbleListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener); + } else { + unsubscribeListener = addEventBubbleListener(targetContainer, domEventName, listener); + } + } +} + +function isMatchingRootContainer(grandContainer, targetContainer) { + return grandContainer === targetContainer || grandContainer.nodeType === COMMENT_NODE && grandContainer.parentNode === targetContainer; +} + +function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) { + var ancestorInst = targetInst; + + if ((eventSystemFlags & IS_EVENT_HANDLE_NON_MANAGED_NODE) === 0 && (eventSystemFlags & IS_NON_DELEGATED) === 0) { + var targetContainerNode = targetContainer; // If we are using the legacy FB support flag, we + + if (targetInst !== null) { + // The below logic attempts to work out if we need to change + // the target fiber to a different ancestor. We had similar logic + // in the legacy event system, except the big difference between + // systems is that the modern event system now has an event listener + // attached to each React Root and React Portal Root. Together, + // the DOM nodes representing these roots are the "rootContainer". + // To figure out which ancestor instance we should use, we traverse + // up the fiber tree from the target instance and attempt to find + // root boundaries that match that of our current "rootContainer". + // If we find that "rootContainer", we find the parent fiber + // sub-tree for that root and make that our ancestor instance. + var node = targetInst; + + mainLoop: while (true) { + if (node === null) { + return; + } + + var nodeTag = node.tag; + + if (nodeTag === HostRoot || nodeTag === HostPortal) { + var container = node.stateNode.containerInfo; + + if (isMatchingRootContainer(container, targetContainerNode)) { + break; + } + + if (nodeTag === HostPortal) { + // The target is a portal, but it's not the rootContainer we're looking for. + // Normally portals handle their own events all the way down to the root. + // So we should be able to stop now. However, we don't know if this portal + // was part of *our* root. + var grandNode = node.return; + + while (grandNode !== null) { + var grandTag = grandNode.tag; + + if (grandTag === HostRoot || grandTag === HostPortal) { + var grandContainer = grandNode.stateNode.containerInfo; + + if (isMatchingRootContainer(grandContainer, targetContainerNode)) { + // This is the rootContainer we're looking for and we found it as + // a parent of the Portal. That means we can ignore it because the + // Portal will bubble through to us. + return; + } + } + + grandNode = grandNode.return; + } + } // Now we need to find it's corresponding host fiber in the other + // tree. To do this we can use getClosestInstanceFromNode, but we + // need to validate that the fiber is a host instance, otherwise + // we need to traverse up through the DOM till we find the correct + // node that is from the other tree. + + + while (container !== null) { + var parentNode = getClosestInstanceFromNode(container); + + if (parentNode === null) { + return; + } + + var parentTag = parentNode.tag; + + if (parentTag === HostComponent || parentTag === HostText) { + node = ancestorInst = parentNode; + continue mainLoop; + } + + container = container.parentNode; + } + } + + node = node.return; + } + } + } + + batchedEventUpdates(function () { + return dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, ancestorInst); + }); +} + +function createDispatchListener(instance, listener, currentTarget) { + return { + instance: instance, + listener: listener, + currentTarget: currentTarget + }; +} + +function accumulateSinglePhaseListeners(targetFiber, reactName, nativeEventType, inCapturePhase, accumulateTargetOnly) { + var captureName = reactName !== null ? reactName + 'Capture' : null; + var reactEventName = inCapturePhase ? captureName : reactName; + var listeners = []; + var instance = targetFiber; + var lastHostComponent = null; // Accumulate all instances and listeners via the target -> root path. + + while (instance !== null) { + var _instance2 = instance, + stateNode = _instance2.stateNode, + tag = _instance2.tag; // Handle listeners that are on HostComponents (i.e. <div>) + + if (tag === HostComponent && stateNode !== null) { + lastHostComponent = stateNode; // createEventHandle listeners + + + if (reactEventName !== null) { + var listener = getListener(instance, reactEventName); + + if (listener != null) { + listeners.push(createDispatchListener(instance, listener, lastHostComponent)); + } + } + } // If we are only accumulating events for the target, then we don't + // continue to propagate through the React fiber tree to find other + // listeners. + + + if (accumulateTargetOnly) { + break; + } + + instance = instance.return; + } + + return listeners; +} // We should only use this function for: +// - BeforeInputEventPlugin +// - ChangeEventPlugin +// - SelectEventPlugin +// This is because we only process these plugins +// in the bubble phase, so we need to accumulate two +// phase event listeners (via emulation). + +function accumulateTwoPhaseListeners(targetFiber, reactName) { + var captureName = reactName + 'Capture'; + var listeners = []; + var instance = targetFiber; // Accumulate all instances and listeners via the target -> root path. + + while (instance !== null) { + var _instance3 = instance, + stateNode = _instance3.stateNode, + tag = _instance3.tag; // Handle listeners that are on HostComponents (i.e. <div>) + + if (tag === HostComponent && stateNode !== null) { + var currentTarget = stateNode; + var captureListener = getListener(instance, captureName); + + if (captureListener != null) { + listeners.unshift(createDispatchListener(instance, captureListener, currentTarget)); + } + + var bubbleListener = getListener(instance, reactName); + + if (bubbleListener != null) { + listeners.push(createDispatchListener(instance, bubbleListener, currentTarget)); + } + } + + instance = instance.return; + } + + return listeners; +} + +function getParent(inst) { + if (inst === null) { + return null; + } + + do { + inst = inst.return; // TODO: If this is a HostRoot we might want to bail out. + // That is depending on if we want nested subtrees (layers) to bubble + // events to their parent. We could also go through parentNode on the + // host node but that wouldn't work for React Native and doesn't let us + // do the portal feature. + } while (inst && inst.tag !== HostComponent); + + if (inst) { + return inst; + } + + return null; +} +/** + * Return the lowest common ancestor of A and B, or null if they are in + * different trees. + */ + + +function getLowestCommonAncestor(instA, instB) { + var nodeA = instA; + var nodeB = instB; + var depthA = 0; + + for (var tempA = nodeA; tempA; tempA = getParent(tempA)) { + depthA++; + } + + var depthB = 0; + + for (var tempB = nodeB; tempB; tempB = getParent(tempB)) { + depthB++; + } // If A is deeper, crawl up. + + + while (depthA - depthB > 0) { + nodeA = getParent(nodeA); + depthA--; + } // If B is deeper, crawl up. + + + while (depthB - depthA > 0) { + nodeB = getParent(nodeB); + depthB--; + } // Walk in lockstep until we find a match. + + + var depth = depthA; + + while (depth--) { + if (nodeA === nodeB || nodeB !== null && nodeA === nodeB.alternate) { + return nodeA; + } + + nodeA = getParent(nodeA); + nodeB = getParent(nodeB); + } + + return null; +} + +function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) { + var registrationName = event._reactName; + var listeners = []; + var instance = target; + + while (instance !== null) { + if (instance === common) { + break; + } + + var _instance4 = instance, + alternate = _instance4.alternate, + stateNode = _instance4.stateNode, + tag = _instance4.tag; + + if (alternate !== null && alternate === common) { + break; + } + + if (tag === HostComponent && stateNode !== null) { + var currentTarget = stateNode; + + if (inCapturePhase) { + var captureListener = getListener(instance, registrationName); + + if (captureListener != null) { + listeners.unshift(createDispatchListener(instance, captureListener, currentTarget)); + } + } else if (!inCapturePhase) { + var bubbleListener = getListener(instance, registrationName); + + if (bubbleListener != null) { + listeners.push(createDispatchListener(instance, bubbleListener, currentTarget)); + } + } + } + + instance = instance.return; + } + + if (listeners.length !== 0) { + dispatchQueue.push({ + event: event, + listeners: listeners + }); + } +} // We should only use this function for: +// - EnterLeaveEventPlugin +// This is because we only process this plugin +// in the bubble phase, so we need to accumulate two +// phase event listeners. + + +function accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leaveEvent, enterEvent, from, to) { + var common = from && to ? getLowestCommonAncestor(from, to) : null; + + if (from !== null) { + accumulateEnterLeaveListenersForEvent(dispatchQueue, leaveEvent, from, common, false); + } + + if (to !== null && enterEvent !== null) { + accumulateEnterLeaveListenersForEvent(dispatchQueue, enterEvent, to, common, true); + } +} +function getListenerSetKey(domEventName, capture) { + return domEventName + "__" + (capture ? 'capture' : 'bubble'); +} + +var didWarnInvalidHydration = false; +var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML'; +var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning'; +var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning'; +var AUTOFOCUS = 'autoFocus'; +var CHILDREN = 'children'; +var STYLE = 'style'; +var HTML$1 = '__html'; +var HTML_NAMESPACE$1 = Namespaces.html; +var warnedUnknownTags; +var suppressHydrationWarning; +var validatePropertiesInDevelopment; +var warnForTextDifference; +var warnForPropDifference; +var warnForExtraAttributes; +var warnForInvalidEventListener; +var canDiffStyleForHydrationWarning; +var normalizeMarkupForTextOrAttribute; +var normalizeHTML; + +{ + warnedUnknownTags = { + // There are working polyfills for <dialog>. Let people use it. + dialog: true, + // Electron ships a custom <webview> tag to display external web content in + // an isolated frame and process. + // This tag is not present in non Electron environments such as JSDom which + // is often used for testing purposes. + // @see https://electronjs.org/docs/api/webview-tag + webview: true + }; + + validatePropertiesInDevelopment = function (type, props) { + validateProperties(type, props); + validateProperties$1(type, props); + validateProperties$2(type, props, { + registrationNameDependencies: registrationNameDependencies, + possibleRegistrationNames: possibleRegistrationNames + }); + }; // IE 11 parses & normalizes the style attribute as opposed to other + // browsers. It adds spaces and sorts the properties in some + // non-alphabetical order. Handling that would require sorting CSS + // properties in the client & server versions or applying + // `expectedStyle` to a temporary DOM node to read its `style` attribute + // normalized. Since it only affects IE, we're skipping style warnings + // in that browser completely in favor of doing all that work. + // See https://github.com/facebook/react/issues/11807 + + + canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF. + // It also can turn \u0000 into \uFFFD inside attributes. + // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream + // If we have a mismatch, it might be caused by that. + // We will still patch up in this case but not fire the warning. + + var NORMALIZE_NEWLINES_REGEX = /\r\n?/g; + var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g; + + normalizeMarkupForTextOrAttribute = function (markup) { + var markupString = typeof markup === 'string' ? markup : '' + markup; + return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, ''); + }; + + warnForTextDifference = function (serverText, clientText) { + if (didWarnInvalidHydration) { + return; + } + + var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText); + var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText); + + if (normalizedServerText === normalizedClientText) { + return; + } + + didWarnInvalidHydration = true; + + error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText); + }; + + warnForPropDifference = function (propName, serverValue, clientValue) { + if (didWarnInvalidHydration) { + return; + } + + var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue); + var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue); + + if (normalizedServerValue === normalizedClientValue) { + return; + } + + didWarnInvalidHydration = true; + + error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue)); + }; + + warnForExtraAttributes = function (attributeNames) { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + var names = []; + attributeNames.forEach(function (name) { + names.push(name); + }); + + error('Extra attributes from the server: %s', names); + }; + + warnForInvalidEventListener = function (registrationName, listener) { + if (listener === false) { + error('Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName); + } else { + error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener); + } + }; // Parse the HTML and read it back to normalize the HTML string so that it + // can be used for comparison. + + + normalizeHTML = function (parent, html) { + // We could have created a separate document here to avoid + // re-initializing custom elements if they exist. But this breaks + // how <noscript> is being handled. So we use the same document. + // See the discussion in https://github.com/facebook/react/pull/11157. + var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName); + testElement.innerHTML = html; + return testElement.innerHTML; + }; +} + +function getOwnerDocumentFromRootContainer(rootContainerElement) { + return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument; +} + +function noop() {} + +function trapClickOnNonInteractiveElement(node) { + // Mobile Safari does not fire properly bubble click events on + // non-interactive elements, which means delegated click listeners do not + // fire. The workaround for this bug involves attaching an empty click + // listener on the target node. + // https://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + // Just set it using the onclick property so that we don't have to manage any + // bookkeeping for it. Not sure if we need to clear it when the listener is + // removed. + // TODO: Only do this for the relevant Safaris maybe? + node.onclick = noop; +} + +function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) { + for (var propKey in nextProps) { + if (!nextProps.hasOwnProperty(propKey)) { + continue; + } + + var nextProp = nextProps[propKey]; + + if (propKey === STYLE) { + { + if (nextProp) { + // Freeze the next style object so that we can assume it won't be + // mutated. We have already warned for this in the past. + Object.freeze(nextProp); + } + } // Relies on `updateStylesByID` not mutating `styleUpdates`. + + + setValueForStyles(domElement, nextProp); + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + + if (nextHtml != null) { + setInnerHTML(domElement, nextHtml); + } + } else if (propKey === CHILDREN) { + if (typeof nextProp === 'string') { + // Avoid setting initial textContent when the text is empty. In IE11 setting + // textContent on a <textarea> will cause the placeholder to not + // show within the <textarea> until it has been focused and blurred again. + // https://github.com/facebook/react/issues/6731#issuecomment-254874553 + var canSetTextContent = tag !== 'textarea' || nextProp !== ''; + + if (canSetTextContent) { + setTextContent(domElement, nextProp); + } + } else if (typeof nextProp === 'number') { + setTextContent(domElement, '' + nextProp); + } + } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) { + if (nextProp != null) { + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } + + if (propKey === 'onScroll') { + listenToNonDelegatedEvent('scroll', domElement); + } + } + } else if (nextProp != null) { + setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag); + } + } +} + +function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) { + // TODO: Handle wasCustomComponentTag + for (var i = 0; i < updatePayload.length; i += 2) { + var propKey = updatePayload[i]; + var propValue = updatePayload[i + 1]; + + if (propKey === STYLE) { + setValueForStyles(domElement, propValue); + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + setInnerHTML(domElement, propValue); + } else if (propKey === CHILDREN) { + setTextContent(domElement, propValue); + } else { + setValueForProperty(domElement, propKey, propValue, isCustomComponentTag); + } + } +} + +function createElement(type, props, rootContainerElement, parentNamespace) { + var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML + // tags get no namespace. + + var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement); + var domElement; + var namespaceURI = parentNamespace; + + if (namespaceURI === HTML_NAMESPACE$1) { + namespaceURI = getIntrinsicNamespace(type); + } + + if (namespaceURI === HTML_NAMESPACE$1) { + { + isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to + // allow <SVG> or <mATH>. + + if (!isCustomComponentTag && type !== type.toLowerCase()) { + error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type); + } + } + + if (type === 'script') { + // Create the script via .innerHTML so its "parser-inserted" flag is + // set to true and it does not execute + var div = ownerDocument.createElement('div'); + + div.innerHTML = '<script><' + '/script>'; // eslint-disable-line + // This is guaranteed to yield a script element. + + var firstChild = div.firstChild; + domElement = div.removeChild(firstChild); + } else if (typeof props.is === 'string') { + // $FlowIssue `createElement` should be updated for Web Components + domElement = ownerDocument.createElement(type, { + is: props.is + }); + } else { + // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug. + // See discussion in https://github.com/facebook/react/pull/6896 + // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240 + domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size` + // attributes on `select`s needs to be added before `option`s are inserted. + // This prevents: + // - a bug where the `select` does not scroll to the correct option because singular + // `select` elements automatically pick the first item #13222 + // - a bug where the `select` set the first item as selected despite the `size` attribute #14239 + // See https://github.com/facebook/react/issues/13222 + // and https://github.com/facebook/react/issues/14239 + + if (type === 'select') { + var node = domElement; + + if (props.multiple) { + node.multiple = true; + } else if (props.size) { + // Setting a size greater than 1 causes a select to behave like `multiple=true`, where + // it is possible that no option is selected. + // + // This is only necessary when a select in "single selection mode". + node.size = props.size; + } + } + } + } else { + domElement = ownerDocument.createElementNS(namespaceURI, type); + } + + { + if (namespaceURI === HTML_NAMESPACE$1) { + if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) { + warnedUnknownTags[type] = true; + + error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type); + } + } + } + + return domElement; +} +function createTextNode(text, rootContainerElement) { + return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text); +} +function setInitialProperties(domElement, tag, rawProps, rootContainerElement) { + var isCustomComponentTag = isCustomComponent(tag, rawProps); + + { + validatePropertiesInDevelopment(tag, rawProps); + } // TODO: Make sure that we check isMounted before firing any of these events. + + + var props; + + switch (tag) { + case 'dialog': + listenToNonDelegatedEvent('cancel', domElement); + listenToNonDelegatedEvent('close', domElement); + props = rawProps; + break; + + case 'iframe': + case 'object': + case 'embed': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the load event. + listenToNonDelegatedEvent('load', domElement); + props = rawProps; + break; + + case 'video': + case 'audio': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for all the media events. + for (var i = 0; i < mediaEventTypes.length; i++) { + listenToNonDelegatedEvent(mediaEventTypes[i], domElement); + } + + props = rawProps; + break; + + case 'source': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the error event. + listenToNonDelegatedEvent('error', domElement); + props = rawProps; + break; + + case 'img': + case 'image': + case 'link': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for error and load events. + listenToNonDelegatedEvent('error', domElement); + listenToNonDelegatedEvent('load', domElement); + props = rawProps; + break; + + case 'details': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the toggle event. + listenToNonDelegatedEvent('toggle', domElement); + props = rawProps; + break; + + case 'input': + initWrapperState(domElement, rawProps); + props = getHostProps(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'option': + validateProps(domElement, rawProps); + props = getHostProps$1(domElement, rawProps); + break; + + case 'select': + initWrapperState$1(domElement, rawProps); + props = getHostProps$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'textarea': + initWrapperState$2(domElement, rawProps); + props = getHostProps$3(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + default: + props = rawProps; + } + + assertValidProps(tag, props); + setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag); + + switch (tag) { + case 'input': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper(domElement, rawProps, false); + break; + + case 'textarea': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper$3(domElement); + break; + + case 'option': + postMountWrapper$1(domElement, rawProps); + break; + + case 'select': + postMountWrapper$2(domElement, rawProps); + break; + + default: + if (typeof props.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } + + break; + } +} // Calculate the diff between the two objects. + +function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) { + { + validatePropertiesInDevelopment(tag, nextRawProps); + } + + var updatePayload = null; + var lastProps; + var nextProps; + + switch (tag) { + case 'input': + lastProps = getHostProps(domElement, lastRawProps); + nextProps = getHostProps(domElement, nextRawProps); + updatePayload = []; + break; + + case 'option': + lastProps = getHostProps$1(domElement, lastRawProps); + nextProps = getHostProps$1(domElement, nextRawProps); + updatePayload = []; + break; + + case 'select': + lastProps = getHostProps$2(domElement, lastRawProps); + nextProps = getHostProps$2(domElement, nextRawProps); + updatePayload = []; + break; + + case 'textarea': + lastProps = getHostProps$3(domElement, lastRawProps); + nextProps = getHostProps$3(domElement, nextRawProps); + updatePayload = []; + break; + + default: + lastProps = lastRawProps; + nextProps = nextRawProps; + + if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } + + break; + } + + assertValidProps(tag, nextProps); + var propKey; + var styleName; + var styleUpdates = null; + + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) { + continue; + } + + if (propKey === STYLE) { + var lastStyle = lastProps[propKey]; + + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + if (!styleUpdates) { + styleUpdates = {}; + } + + styleUpdates[styleName] = ''; + } + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) { + // This is a special case. If any listener updates we need to ensure + // that the "current" fiber pointer gets updated so we need a commit + // to update this element. + if (!updatePayload) { + updatePayload = []; + } + } else { + // For all other deleted properties we add it to the queue. We use + // the allowed property list in the commit phase instead. + (updatePayload = updatePayload || []).push(propKey, null); + } + } + + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = lastProps != null ? lastProps[propKey] : undefined; + + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) { + continue; + } + + if (propKey === STYLE) { + { + if (nextProp) { + // Freeze the next style object so that we can assume it won't be + // mutated. We have already warned for this in the past. + Object.freeze(nextProp); + } + } + + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { + if (!styleUpdates) { + styleUpdates = {}; + } + + styleUpdates[styleName] = ''; + } + } // Update styles that changed since `lastProp`. + + + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { + if (!styleUpdates) { + styleUpdates = {}; + } + + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + if (!styleUpdates) { + if (!updatePayload) { + updatePayload = []; + } + + updatePayload.push(propKey, styleUpdates); + } + + styleUpdates = nextProp; + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + var lastHtml = lastProp ? lastProp[HTML$1] : undefined; + + if (nextHtml != null) { + if (lastHtml !== nextHtml) { + (updatePayload = updatePayload || []).push(propKey, nextHtml); + } + } + } else if (propKey === CHILDREN) { + if (typeof nextProp === 'string' || typeof nextProp === 'number') { + (updatePayload = updatePayload || []).push(propKey, '' + nextProp); + } + } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) { + if (nextProp != null) { + // We eagerly listen to this even though we haven't committed yet. + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } + + if (propKey === 'onScroll') { + listenToNonDelegatedEvent('scroll', domElement); + } + } + + if (!updatePayload && lastProp !== nextProp) { + // This is a special case. If any listener updates we need to ensure + // that the "current" props pointer gets updated so we need a commit + // to update this element. + updatePayload = []; + } + } else if (typeof nextProp === 'object' && nextProp !== null && nextProp.$$typeof === REACT_OPAQUE_ID_TYPE) { + // If we encounter useOpaqueReference's opaque object, this means we are hydrating. + // In this case, call the opaque object's toString function which generates a new client + // ID so client and server IDs match and throws to rerender. + nextProp.toString(); + } else { + // For any other property we always add it to the queue and then we + // filter it out using the allowed property list during the commit. + (updatePayload = updatePayload || []).push(propKey, nextProp); + } + } + + if (styleUpdates) { + { + validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]); + } + + (updatePayload = updatePayload || []).push(STYLE, styleUpdates); + } + + return updatePayload; +} // Apply the diff. + +function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) { + // Update checked *before* name. + // In the middle of an update, it is possible to have multiple checked. + // When a checked radio tries to change name, browser makes another radio's checked false. + if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) { + updateChecked(domElement, nextRawProps); + } + + var wasCustomComponentTag = isCustomComponent(tag, lastRawProps); + var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff. + + updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props + // changed. + + switch (tag) { + case 'input': + // Update the wrapper around inputs *after* updating props. This has to + // happen after `updateDOMProperties`. Otherwise HTML5 input validations + // raise warnings and prevent the new value from being assigned. + updateWrapper(domElement, nextRawProps); + break; + + case 'textarea': + updateWrapper$1(domElement, nextRawProps); + break; + + case 'select': + // <select> value update needs to occur after <option> children + // reconciliation + postUpdateWrapper(domElement, nextRawProps); + break; + } +} + +function getPossibleStandardName(propName) { + { + var lowerCasedName = propName.toLowerCase(); + + if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) { + return null; + } + + return possibleStandardNames[lowerCasedName] || null; + } +} + +function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) { + var isCustomComponentTag; + var extraAttributeNames; + + { + suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true; + isCustomComponentTag = isCustomComponent(tag, rawProps); + validatePropertiesInDevelopment(tag, rawProps); + } // TODO: Make sure that we check isMounted before firing any of these events. + + + switch (tag) { + case 'dialog': + listenToNonDelegatedEvent('cancel', domElement); + listenToNonDelegatedEvent('close', domElement); + break; + + case 'iframe': + case 'object': + case 'embed': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the load event. + listenToNonDelegatedEvent('load', domElement); + break; + + case 'video': + case 'audio': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for all the media events. + for (var i = 0; i < mediaEventTypes.length; i++) { + listenToNonDelegatedEvent(mediaEventTypes[i], domElement); + } + + break; + + case 'source': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the error event. + listenToNonDelegatedEvent('error', domElement); + break; + + case 'img': + case 'image': + case 'link': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for error and load events. + listenToNonDelegatedEvent('error', domElement); + listenToNonDelegatedEvent('load', domElement); + break; + + case 'details': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the toggle event. + listenToNonDelegatedEvent('toggle', domElement); + break; + + case 'input': + initWrapperState(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'option': + validateProps(domElement, rawProps); + break; + + case 'select': + initWrapperState$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'textarea': + initWrapperState$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + } + + assertValidProps(tag, rawProps); + + { + extraAttributeNames = new Set(); + var attributes = domElement.attributes; + + for (var _i = 0; _i < attributes.length; _i++) { + var name = attributes[_i].name.toLowerCase(); + + switch (name) { + // Built-in SSR attribute is allowed + case 'data-reactroot': + break; + // Controlled attributes are not validated + // TODO: Only ignore them on controlled tags. + + case 'value': + break; + + case 'checked': + break; + + case 'selected': + break; + + default: + // Intentionally use the original name. + // See discussion in https://github.com/facebook/react/pull/10676. + extraAttributeNames.add(attributes[_i].name); + } + } + } + + var updatePayload = null; + + for (var propKey in rawProps) { + if (!rawProps.hasOwnProperty(propKey)) { + continue; + } + + var nextProp = rawProps[propKey]; + + if (propKey === CHILDREN) { + // For text content children we compare against textContent. This + // might match additional HTML that is hidden when we read it using + // textContent. E.g. "foo" will match "f<span>oo</span>" but that still + // satisfies our requirement. Our requirement is not to produce perfect + // HTML and attributes. Ideally we should preserve structure but it's + // ok not to if the visible content is still enough to indicate what + // even listeners these nodes might be wired up to. + // TODO: Warn if there is more than a single textNode as a child. + // TODO: Should we use domElement.firstChild.nodeValue to compare? + if (typeof nextProp === 'string') { + if (domElement.textContent !== nextProp) { + if ( !suppressHydrationWarning) { + warnForTextDifference(domElement.textContent, nextProp); + } + + updatePayload = [CHILDREN, nextProp]; + } + } else if (typeof nextProp === 'number') { + if (domElement.textContent !== '' + nextProp) { + if ( !suppressHydrationWarning) { + warnForTextDifference(domElement.textContent, nextProp); + } + + updatePayload = [CHILDREN, '' + nextProp]; + } + } + } else if (registrationNameDependencies.hasOwnProperty(propKey)) { + if (nextProp != null) { + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } + + if (propKey === 'onScroll') { + listenToNonDelegatedEvent('scroll', domElement); + } + } + } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.) + typeof isCustomComponentTag === 'boolean') { + // Validate that the properties correspond to their expected values. + var serverValue = void 0; + var propertyInfo = getPropertyInfo(propKey); + + if (suppressHydrationWarning) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated + // TODO: Only ignore them on controlled tags. + propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var serverHTML = domElement.innerHTML; + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + + if (nextHtml != null) { + var expectedHTML = normalizeHTML(domElement, nextHtml); + + if (expectedHTML !== serverHTML) { + warnForPropDifference(propKey, serverHTML, expectedHTML); + } + } + } else if (propKey === STYLE) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey); + + if (canDiffStyleForHydrationWarning) { + var expectedStyle = createDangerousStringForStyles(nextProp); + serverValue = domElement.getAttribute('style'); + + if (expectedStyle !== serverValue) { + warnForPropDifference(propKey, serverValue, expectedStyle); + } + } + } else if (isCustomComponentTag) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey.toLowerCase()); + serverValue = getValueForAttribute(domElement, propKey, nextProp); + + if (nextProp !== serverValue) { + warnForPropDifference(propKey, serverValue, nextProp); + } + } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) { + var isMismatchDueToBadCasing = false; + + if (propertyInfo !== null) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propertyInfo.attributeName); + serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo); + } else { + var ownNamespace = parentNamespace; + + if (ownNamespace === HTML_NAMESPACE$1) { + ownNamespace = getIntrinsicNamespace(tag); + } + + if (ownNamespace === HTML_NAMESPACE$1) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey.toLowerCase()); + } else { + var standardName = getPossibleStandardName(propKey); + + if (standardName !== null && standardName !== propKey) { + // If an SVG prop is supplied with bad casing, it will + // be successfully parsed from HTML, but will produce a mismatch + // (and would be incorrectly rendered on the client). + // However, we already warn about bad casing elsewhere. + // So we'll skip the misleading extra mismatch warning in this case. + isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined. + + extraAttributeNames.delete(standardName); + } // $FlowFixMe - Should be inferred as not undefined. + + + extraAttributeNames.delete(propKey); + } + + serverValue = getValueForAttribute(domElement, propKey, nextProp); + } + + if (nextProp !== serverValue && !isMismatchDueToBadCasing) { + warnForPropDifference(propKey, serverValue, nextProp); + } + } + } + } + + { + // $FlowFixMe - Should be inferred as not undefined. + if (extraAttributeNames.size > 0 && !suppressHydrationWarning) { + // $FlowFixMe - Should be inferred as not undefined. + warnForExtraAttributes(extraAttributeNames); + } + } + + switch (tag) { + case 'input': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper(domElement, rawProps, true); + break; + + case 'textarea': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper$3(domElement); + break; + + case 'select': + case 'option': + // For input and textarea we current always set the value property at + // post mount to force it to diverge from attributes. However, for + // option and select we don't quite do the same thing and select + // is not resilient to the DOM state changing so we don't do that here. + // TODO: Consider not doing this for input and textarea. + break; + + default: + if (typeof rawProps.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } + + break; + } + + return updatePayload; +} +function diffHydratedText(textNode, text) { + var isDifferent = textNode.nodeValue !== text; + return isDifferent; +} +function warnForUnmatchedText(textNode, text) { + { + warnForTextDifference(textNode.nodeValue, text); + } +} +function warnForDeletedHydratableElement(parentNode, child) { + { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase()); + } +} +function warnForDeletedHydratableText(parentNode, child) { + { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase()); + } +} +function warnForInsertedHydratedElement(parentNode, tag, props) { + { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase()); + } +} +function warnForInsertedHydratedText(parentNode, text) { + { + if (text === '') { + // We expect to insert empty text nodes since they're not represented in + // the HTML. + // TODO: Remove this special case if we can just avoid inserting empty + // text nodes. + return; + } + + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase()); + } +} +function restoreControlledState$3(domElement, tag, props) { + switch (tag) { + case 'input': + restoreControlledState(domElement, props); + return; + + case 'textarea': + restoreControlledState$2(domElement, props); + return; + + case 'select': + restoreControlledState$1(domElement, props); + return; + } +} + +var validateDOMNesting = function () {}; + +var updatedAncestorInfo = function () {}; + +{ + // This validation code was written based on the HTML5 parsing spec: + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + // + // Note: this does not catch all invalid nesting, nor does it try to (as it's + // not clear what practical benefit doing so provides); instead, we warn only + // for cases where the parser will give a parse tree differing from what React + // intended. For example, <b><div></div></b> is invalid but we don't warn + // because it still parses correctly; we do warn for other cases like nested + // <p> tags where the beginning of the second element implicitly closes the + // first, causing a confusing mess. + // https://html.spec.whatwg.org/multipage/syntax.html#special + var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + + var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point + // TODO: Distinguish by namespace here -- for <title>, including it here + // errs on the side of fewer warnings + 'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope + + var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags + + var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; + var emptyAncestorInfo = { + current: null, + formTag: null, + aTagInScope: null, + buttonTagInScope: null, + nobrTagInScope: null, + pTagInButtonScope: null, + listItemTagAutoclosing: null, + dlItemTagAutoclosing: null + }; + + updatedAncestorInfo = function (oldInfo, tag) { + var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo); + + var info = { + tag: tag + }; + + if (inScopeTags.indexOf(tag) !== -1) { + ancestorInfo.aTagInScope = null; + ancestorInfo.buttonTagInScope = null; + ancestorInfo.nobrTagInScope = null; + } + + if (buttonScopeTags.indexOf(tag) !== -1) { + ancestorInfo.pTagInButtonScope = null; + } // See rules for 'li', 'dd', 'dt' start tags in + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + + + if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { + ancestorInfo.listItemTagAutoclosing = null; + ancestorInfo.dlItemTagAutoclosing = null; + } + + ancestorInfo.current = info; + + if (tag === 'form') { + ancestorInfo.formTag = info; + } + + if (tag === 'a') { + ancestorInfo.aTagInScope = info; + } + + if (tag === 'button') { + ancestorInfo.buttonTagInScope = info; + } + + if (tag === 'nobr') { + ancestorInfo.nobrTagInScope = info; + } + + if (tag === 'p') { + ancestorInfo.pTagInButtonScope = info; + } + + if (tag === 'li') { + ancestorInfo.listItemTagAutoclosing = info; + } + + if (tag === 'dd' || tag === 'dt') { + ancestorInfo.dlItemTagAutoclosing = info; + } + + return ancestorInfo; + }; + /** + * Returns whether + */ + + + var isTagValidWithParent = function (tag, parentTag) { + // First, let's check if we're in an unusual parsing mode... + switch (parentTag) { + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect + case 'select': + return tag === 'option' || tag === 'optgroup' || tag === '#text'; + + case 'optgroup': + return tag === 'option' || tag === '#text'; + // Strictly speaking, seeing an <option> doesn't mean we're in a <select> + // but + + case 'option': + return tag === '#text'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption + // No special behavior since these rules fall back to "in body" mode for + // all except special table nodes which cause bad parsing behavior anyway. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr + + case 'tr': + return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody + + case 'tbody': + case 'thead': + case 'tfoot': + return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup + + case 'colgroup': + return tag === 'col' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable + + case 'table': + return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead + + case 'head': + return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element + + case 'html': + return tag === 'head' || tag === 'body' || tag === 'frameset'; + + case 'frameset': + return tag === 'frame'; + + case '#document': + return tag === 'html'; + } // Probably in the "in body" parsing mode, so we outlaw only tag combos + // where the parsing rules cause implicit opens or closes to be added. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + + + switch (tag) { + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; + + case 'rp': + case 'rt': + return impliedEndTags.indexOf(parentTag) === -1; + + case 'body': + case 'caption': + case 'col': + case 'colgroup': + case 'frameset': + case 'frame': + case 'head': + case 'html': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // These tags are only valid with a few parents that have special child + // parsing rules -- if we're down here, then none of those matched and + // so we allow it only if we don't know what the parent is, as all other + // cases are invalid. + return parentTag == null; + } + + return true; + }; + /** + * Returns whether + */ + + + var findInvalidAncestorForTag = function (tag, ancestorInfo) { + switch (tag) { + case 'address': + case 'article': + case 'aside': + case 'blockquote': + case 'center': + case 'details': + case 'dialog': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'figcaption': + case 'figure': + case 'footer': + case 'header': + case 'hgroup': + case 'main': + case 'menu': + case 'nav': + case 'ol': + case 'p': + case 'section': + case 'summary': + case 'ul': + case 'pre': + case 'listing': + case 'table': + case 'hr': + case 'xmp': + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return ancestorInfo.pTagInButtonScope; + + case 'form': + return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; + + case 'li': + return ancestorInfo.listItemTagAutoclosing; + + case 'dd': + case 'dt': + return ancestorInfo.dlItemTagAutoclosing; + + case 'button': + return ancestorInfo.buttonTagInScope; + + case 'a': + // Spec says something about storing a list of markers, but it sounds + // equivalent to this check. + return ancestorInfo.aTagInScope; + + case 'nobr': + return ancestorInfo.nobrTagInScope; + } + + return null; + }; + + var didWarn$1 = {}; + + validateDOMNesting = function (childTag, childText, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.current; + var parentTag = parentInfo && parentInfo.tag; + + if (childText != null) { + if (childTag != null) { + error('validateDOMNesting: when childText is passed, childTag should be null'); + } + + childTag = '#text'; + } + + var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; + var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); + var invalidParentOrAncestor = invalidParent || invalidAncestor; + + if (!invalidParentOrAncestor) { + return; + } + + var ancestorTag = invalidParentOrAncestor.tag; + var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag; + + if (didWarn$1[warnKey]) { + return; + } + + didWarn$1[warnKey] = true; + var tagDisplayName = childTag; + var whitespaceInfo = ''; + + if (childTag === '#text') { + if (/\S/.test(childText)) { + tagDisplayName = 'Text nodes'; + } else { + tagDisplayName = 'Whitespace text nodes'; + whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.'; + } + } else { + tagDisplayName = '<' + childTag + '>'; + } + + if (invalidParent) { + var info = ''; + + if (ancestorTag === 'table' && childTag === 'tr') { + info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.'; + } + + error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info); + } else { + error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag); + } + }; +} + +var SUPPRESS_HYDRATION_WARNING$1; + +{ + SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning'; +} + +var SUSPENSE_START_DATA = '$'; +var SUSPENSE_END_DATA = '/$'; +var SUSPENSE_PENDING_START_DATA = '$?'; +var SUSPENSE_FALLBACK_START_DATA = '$!'; +var STYLE$1 = 'style'; +var eventsEnabled = null; +var selectionInformation = null; + +function shouldAutoFocusHostComponent(type, props) { + switch (type) { + case 'button': + case 'input': + case 'select': + case 'textarea': + return !!props.autoFocus; + } + + return false; +} +function getRootHostContext(rootContainerInstance) { + var type; + var namespace; + var nodeType = rootContainerInstance.nodeType; + + switch (nodeType) { + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + { + type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment'; + var root = rootContainerInstance.documentElement; + namespace = root ? root.namespaceURI : getChildNamespace(null, ''); + break; + } + + default: + { + var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance; + var ownNamespace = container.namespaceURI || null; + type = container.tagName; + namespace = getChildNamespace(ownNamespace, type); + break; + } + } + + { + var validatedTag = type.toLowerCase(); + var ancestorInfo = updatedAncestorInfo(null, validatedTag); + return { + namespace: namespace, + ancestorInfo: ancestorInfo + }; + } +} +function getChildHostContext(parentHostContext, type, rootContainerInstance) { + { + var parentHostContextDev = parentHostContext; + var namespace = getChildNamespace(parentHostContextDev.namespace, type); + var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type); + return { + namespace: namespace, + ancestorInfo: ancestorInfo + }; + } +} +function getPublicInstance(instance) { + return instance; +} +function prepareForCommit(containerInfo) { + eventsEnabled = isEnabled(); + selectionInformation = getSelectionInformation(); + var activeInstance = null; + + setEnabled(false); + return activeInstance; +} +function resetAfterCommit(containerInfo) { + restoreSelection(selectionInformation); + setEnabled(eventsEnabled); + eventsEnabled = null; + selectionInformation = null; +} +function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + var parentNamespace; + + { + // TODO: take namespace into account when validating. + var hostContextDev = hostContext; + validateDOMNesting(type, null, hostContextDev.ancestorInfo); + + if (typeof props.children === 'string' || typeof props.children === 'number') { + var string = '' + props.children; + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); + validateDOMNesting(null, string, ownAncestorInfo); + } + + parentNamespace = hostContextDev.namespace; + } + + var domElement = createElement(type, props, rootContainerInstance, parentNamespace); + precacheFiberNode(internalInstanceHandle, domElement); + updateFiberProps(domElement, props); + return domElement; +} +function appendInitialChild(parentInstance, child) { + parentInstance.appendChild(child); +} +function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) { + setInitialProperties(domElement, type, props, rootContainerInstance); + return shouldAutoFocusHostComponent(type, props); +} +function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) { + { + var hostContextDev = hostContext; + + if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) { + var string = '' + newProps.children; + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); + validateDOMNesting(null, string, ownAncestorInfo); + } + } + + return diffProperties(domElement, type, oldProps, newProps); +} +function shouldSetTextContent(type, props) { + return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null; +} +function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { + { + var hostContextDev = hostContext; + validateDOMNesting(null, text, hostContextDev.ancestorInfo); + } + + var textNode = createTextNode(text, rootContainerInstance); + precacheFiberNode(internalInstanceHandle, textNode); + return textNode; +} +// if a component just imports ReactDOM (e.g. for findDOMNode). +// Some environments might not have setTimeout or clearTimeout. + +var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined; +var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined; +var noTimeout = -1; // ------------------- +function commitMount(domElement, type, newProps, internalInstanceHandle) { + // Despite the naming that might imply otherwise, this method only + // fires if there is an `Update` effect scheduled during mounting. + // This happens if `finalizeInitialChildren` returns `true` (which it + // does to implement the `autoFocus` attribute on the client). But + // there are also other cases when this might happen (such as patching + // up text content during hydration mismatch). So we'll check this again. + if (shouldAutoFocusHostComponent(type, newProps)) { + domElement.focus(); + } +} +function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) { + // Update the props handle so that we know which props are the ones with + // with current event handlers. + updateFiberProps(domElement, newProps); // Apply the diff to the DOM node. + + updateProperties(domElement, updatePayload, type, oldProps, newProps); +} +function resetTextContent(domElement) { + setTextContent(domElement, ''); +} +function commitTextUpdate(textInstance, oldText, newText) { + textInstance.nodeValue = newText; +} +function appendChild(parentInstance, child) { + parentInstance.appendChild(child); +} +function appendChildToContainer(container, child) { + var parentNode; + + if (container.nodeType === COMMENT_NODE) { + parentNode = container.parentNode; + parentNode.insertBefore(child, container); + } else { + parentNode = container; + parentNode.appendChild(child); + } // This container might be used for a portal. + // If something inside a portal is clicked, that click should bubble + // through the React tree. However, on Mobile Safari the click would + // never bubble through the *DOM* tree unless an ancestor with onclick + // event exists. So we wouldn't see it and dispatch it. + // This is why we ensure that non React root containers have inline onclick + // defined. + // https://github.com/facebook/react/issues/11918 + + + var reactRootContainer = container._reactRootContainer; + + if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(parentNode); + } +} +function insertBefore(parentInstance, child, beforeChild) { + parentInstance.insertBefore(child, beforeChild); +} +function insertInContainerBefore(container, child, beforeChild) { + if (container.nodeType === COMMENT_NODE) { + container.parentNode.insertBefore(child, beforeChild); + } else { + container.insertBefore(child, beforeChild); + } +} + +function removeChild(parentInstance, child) { + parentInstance.removeChild(child); +} +function removeChildFromContainer(container, child) { + if (container.nodeType === COMMENT_NODE) { + container.parentNode.removeChild(child); + } else { + container.removeChild(child); + } +} +function hideInstance(instance) { + // TODO: Does this work for all element types? What about MathML? Should we + // pass host context to this method? + instance = instance; + var style = instance.style; + + if (typeof style.setProperty === 'function') { + style.setProperty('display', 'none', 'important'); + } else { + style.display = 'none'; + } +} +function hideTextInstance(textInstance) { + textInstance.nodeValue = ''; +} +function unhideInstance(instance, props) { + instance = instance; + var styleProp = props[STYLE$1]; + var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null; + instance.style.display = dangerousStyleValue('display', display); +} +function unhideTextInstance(textInstance, text) { + textInstance.nodeValue = text; +} +function clearContainer(container) { + if (container.nodeType === ELEMENT_NODE) { + container.textContent = ''; + } else if (container.nodeType === DOCUMENT_NODE) { + var body = container.body; + + if (body != null) { + body.textContent = ''; + } + } +} // ------------------- +function canHydrateInstance(instance, type, props) { + if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) { + return null; + } // This has now been refined to an element node. + + + return instance; +} +function canHydrateTextInstance(instance, text) { + if (text === '' || instance.nodeType !== TEXT_NODE) { + // Empty strings are not parsed by HTML so there won't be a correct match here. + return null; + } // This has now been refined to a text node. + + + return instance; +} +function isSuspenseInstancePending(instance) { + return instance.data === SUSPENSE_PENDING_START_DATA; +} +function isSuspenseInstanceFallback(instance) { + return instance.data === SUSPENSE_FALLBACK_START_DATA; +} + +function getNextHydratable(node) { + // Skip non-hydratable nodes. + for (; node != null; node = node.nextSibling) { + var nodeType = node.nodeType; + + if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) { + break; + } + } + + return node; +} + +function getNextHydratableSibling(instance) { + return getNextHydratable(instance.nextSibling); +} +function getFirstHydratableChild(parentInstance) { + return getNextHydratable(parentInstance.firstChild); +} +function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events + // get attached. + + updateFiberProps(instance, props); + var parentNamespace; + + { + var hostContextDev = hostContext; + parentNamespace = hostContextDev.namespace; + } + + return diffHydratedProperties(instance, type, props, parentNamespace); +} +function hydrateTextInstance(textInstance, text, internalInstanceHandle) { + precacheFiberNode(internalInstanceHandle, textInstance); + return diffHydratedText(textInstance, text); +} +function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) { + var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary. + // There might be nested nodes so we need to keep track of how + // deep we are and only break out when we're back on top. + + var depth = 0; + + while (node) { + if (node.nodeType === COMMENT_NODE) { + var data = node.data; + + if (data === SUSPENSE_END_DATA) { + if (depth === 0) { + return getNextHydratableSibling(node); + } else { + depth--; + } + } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { + depth++; + } + } + + node = node.nextSibling; + } // TODO: Warn, we didn't find the end comment boundary. + + + return null; +} // Returns the SuspenseInstance if this node is a direct child of a +// SuspenseInstance. I.e. if its previous sibling is a Comment with +// SUSPENSE_x_START_DATA. Otherwise, null. + +function getParentSuspenseInstance(targetInstance) { + var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary. + // There might be nested nodes so we need to keep track of how + // deep we are and only break out when we're back on top. + + var depth = 0; + + while (node) { + if (node.nodeType === COMMENT_NODE) { + var data = node.data; + + if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { + if (depth === 0) { + return node; + } else { + depth--; + } + } else if (data === SUSPENSE_END_DATA) { + depth++; + } + } + + node = node.previousSibling; + } + + return null; +} +function commitHydratedContainer(container) { + // Retry if any event replaying was blocked on this. + retryIfBlockedOn(container); +} +function commitHydratedSuspenseInstance(suspenseInstance) { + // Retry if any event replaying was blocked on this. + retryIfBlockedOn(suspenseInstance); +} +function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) { + { + warnForUnmatchedText(textInstance, text); + } +} +function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForUnmatchedText(textInstance, text); + } +} +function didNotHydrateContainerInstance(parentContainer, instance) { + { + if (instance.nodeType === ELEMENT_NODE) { + warnForDeletedHydratableElement(parentContainer, instance); + } else if (instance.nodeType === COMMENT_NODE) ; else { + warnForDeletedHydratableText(parentContainer, instance); + } + } +} +function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + if (instance.nodeType === ELEMENT_NODE) { + warnForDeletedHydratableElement(parentInstance, instance); + } else if (instance.nodeType === COMMENT_NODE) ; else { + warnForDeletedHydratableText(parentInstance, instance); + } + } +} +function didNotFindHydratableContainerInstance(parentContainer, type, props) { + { + warnForInsertedHydratedElement(parentContainer, type); + } +} +function didNotFindHydratableContainerTextInstance(parentContainer, text) { + { + warnForInsertedHydratedText(parentContainer, text); + } +} +function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForInsertedHydratedElement(parentInstance, type); + } +} +function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForInsertedHydratedText(parentInstance, text); + } +} +function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ; +} +var clientId = 0; +function makeClientIdInDEV(warnOnAccessInDEV) { + var id = 'r:' + (clientId++).toString(36); + return { + toString: function () { + warnOnAccessInDEV(); + return id; + }, + valueOf: function () { + warnOnAccessInDEV(); + return id; + } + }; +} +function isOpaqueHydratingObject(value) { + return value !== null && typeof value === 'object' && value.$$typeof === REACT_OPAQUE_ID_TYPE; +} +function makeOpaqueHydratingObject(attemptToReadValue) { + return { + $$typeof: REACT_OPAQUE_ID_TYPE, + toString: attemptToReadValue, + valueOf: attemptToReadValue + }; +} +function preparePortalMount(portalInstance) { + { + listenToAllSupportedEvents(portalInstance); + } +} + +var randomKey = Math.random().toString(36).slice(2); +var internalInstanceKey = '__reactFiber$' + randomKey; +var internalPropsKey = '__reactProps$' + randomKey; +var internalContainerInstanceKey = '__reactContainer$' + randomKey; +var internalEventHandlersKey = '__reactEvents$' + randomKey; +function precacheFiberNode(hostInst, node) { + node[internalInstanceKey] = hostInst; +} +function markContainerAsRoot(hostRoot, node) { + node[internalContainerInstanceKey] = hostRoot; +} +function unmarkContainerAsRoot(node) { + node[internalContainerInstanceKey] = null; +} +function isContainerMarkedAsRoot(node) { + return !!node[internalContainerInstanceKey]; +} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor. +// If the target node is part of a hydrated or not yet rendered subtree, then +// this may also return a SuspenseComponent or HostRoot to indicate that. +// Conceptually the HostRoot fiber is a child of the Container node. So if you +// pass the Container node as the targetNode, you will not actually get the +// HostRoot back. To get to the HostRoot, you need to pass a child of it. +// The same thing applies to Suspense boundaries. + +function getClosestInstanceFromNode(targetNode) { + var targetInst = targetNode[internalInstanceKey]; + + if (targetInst) { + // Don't return HostRoot or SuspenseComponent here. + return targetInst; + } // If the direct event target isn't a React owned DOM node, we need to look + // to see if one of its parents is a React owned DOM node. + + + var parentNode = targetNode.parentNode; + + while (parentNode) { + // We'll check if this is a container root that could include + // React nodes in the future. We need to check this first because + // if we're a child of a dehydrated container, we need to first + // find that inner container before moving on to finding the parent + // instance. Note that we don't check this field on the targetNode + // itself because the fibers are conceptually between the container + // node and the first child. It isn't surrounding the container node. + // If it's not a container, we check if it's an instance. + targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]; + + if (targetInst) { + // Since this wasn't the direct target of the event, we might have + // stepped past dehydrated DOM nodes to get here. However they could + // also have been non-React nodes. We need to answer which one. + // If we the instance doesn't have any children, then there can't be + // a nested suspense boundary within it. So we can use this as a fast + // bailout. Most of the time, when people add non-React children to + // the tree, it is using a ref to a child-less DOM node. + // Normally we'd only need to check one of the fibers because if it + // has ever gone from having children to deleting them or vice versa + // it would have deleted the dehydrated boundary nested inside already. + // However, since the HostRoot starts out with an alternate it might + // have one on the alternate so we need to check in case this was a + // root. + var alternate = targetInst.alternate; + + if (targetInst.child !== null || alternate !== null && alternate.child !== null) { + // Next we need to figure out if the node that skipped past is + // nested within a dehydrated boundary and if so, which one. + var suspenseInstance = getParentSuspenseInstance(targetNode); + + while (suspenseInstance !== null) { + // We found a suspense instance. That means that we haven't + // hydrated it yet. Even though we leave the comments in the + // DOM after hydrating, and there are boundaries in the DOM + // that could already be hydrated, we wouldn't have found them + // through this pass since if the target is hydrated it would + // have had an internalInstanceKey on it. + // Let's get the fiber associated with the SuspenseComponent + // as the deepest instance. + var targetSuspenseInst = suspenseInstance[internalInstanceKey]; + + if (targetSuspenseInst) { + return targetSuspenseInst; + } // If we don't find a Fiber on the comment, it might be because + // we haven't gotten to hydrate it yet. There might still be a + // parent boundary that hasn't above this one so we need to find + // the outer most that is known. + + + suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent + // host component also hasn't hydrated yet. We can return it + // below since it will bail out on the isMounted check later. + } + } + + return targetInst; + } + + targetNode = parentNode; + parentNode = targetNode.parentNode; + } + + return null; +} +/** + * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent + * instance, or null if the node was not rendered by this React. + */ + +function getInstanceFromNode(node) { + var inst = node[internalInstanceKey] || node[internalContainerInstanceKey]; + + if (inst) { + if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) { + return inst; + } else { + return null; + } + } + + return null; +} +/** + * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding + * DOM node. + */ + +function getNodeFromInstance(inst) { + if (inst.tag === HostComponent || inst.tag === HostText) { + // In Fiber this, is just the state node right now. We assume it will be + // a host component or host text. + return inst.stateNode; + } // Without this first invariant, passing a non-DOM-component triggers the next + // invariant for a missing parent, which is super confusing. + + + { + { + throw Error( "getNodeFromInstance: Invalid argument." ); + } + } +} +function getFiberCurrentPropsFromNode(node) { + return node[internalPropsKey] || null; +} +function updateFiberProps(node, props) { + node[internalPropsKey] = props; +} +function getEventListenerSet(node) { + var elementListenerSet = node[internalEventHandlersKey]; + + if (elementListenerSet === undefined) { + elementListenerSet = node[internalEventHandlersKey] = new Set(); + } + + return elementListenerSet; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +var valueStack = []; +var fiberStack; + +{ + fiberStack = []; +} + +var index = -1; + +function createCursor(defaultValue) { + return { + current: defaultValue + }; +} + +function pop(cursor, fiber) { + if (index < 0) { + { + error('Unexpected pop.'); + } + + return; + } + + { + if (fiber !== fiberStack[index]) { + error('Unexpected Fiber popped.'); + } + } + + cursor.current = valueStack[index]; + valueStack[index] = null; + + { + fiberStack[index] = null; + } + + index--; +} + +function push(cursor, value, fiber) { + index++; + valueStack[index] = cursor.current; + + { + fiberStack[index] = fiber; + } + + cursor.current = value; +} + +var warnedAboutMissingGetChildContext; + +{ + warnedAboutMissingGetChildContext = {}; +} + +var emptyContextObject = {}; + +{ + Object.freeze(emptyContextObject); +} // A cursor to the current merged context object on the stack. + + +var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed. + +var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack. +// We use this to get access to the parent context after we have already +// pushed the next context provider, and now need to merge their contexts. + +var previousContext = emptyContextObject; + +function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) { + { + if (didPushOwnContextIfProvider && isContextProvider(Component)) { + // If the fiber is a context provider itself, when we read its context + // we may have already pushed its own child context on the stack. A context + // provider should not "see" its own child context. Therefore we read the + // previous (parent) context instead for a context provider. + return previousContext; + } + + return contextStackCursor.current; + } +} + +function cacheContext(workInProgress, unmaskedContext, maskedContext) { + { + var instance = workInProgress.stateNode; + instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext; + instance.__reactInternalMemoizedMaskedChildContext = maskedContext; + } +} + +function getMaskedContext(workInProgress, unmaskedContext) { + { + var type = workInProgress.type; + var contextTypes = type.contextTypes; + + if (!contextTypes) { + return emptyContextObject; + } // Avoid recreating masked context unless unmasked context has changed. + // Failing to do this will result in unnecessary calls to componentWillReceiveProps. + // This may trigger infinite loops if componentWillReceiveProps calls setState. + + + var instance = workInProgress.stateNode; + + if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) { + return instance.__reactInternalMemoizedMaskedChildContext; + } + + var context = {}; + + for (var key in contextTypes) { + context[key] = unmaskedContext[key]; + } + + { + var name = getComponentName(type) || 'Unknown'; + checkPropTypes(contextTypes, context, 'context', name); + } // Cache unmasked context so we can avoid recreating masked context unless necessary. + // Context is created before the class component is instantiated so check for instance. + + + if (instance) { + cacheContext(workInProgress, unmaskedContext, context); + } + + return context; + } +} + +function hasContextChanged() { + { + return didPerformWorkStackCursor.current; + } +} + +function isContextProvider(type) { + { + var childContextTypes = type.childContextTypes; + return childContextTypes !== null && childContextTypes !== undefined; + } +} + +function popContext(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } +} + +function popTopLevelContextObject(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } +} + +function pushTopLevelContextObject(fiber, context, didChange) { + { + if (!(contextStackCursor.current === emptyContextObject)) { + { + throw Error( "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + push(contextStackCursor, context, fiber); + push(didPerformWorkStackCursor, didChange, fiber); + } +} + +function processChildContext(fiber, type, parentContext) { + { + var instance = fiber.stateNode; + var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future. + // It has only been added in Fiber to match the (unintentional) behavior in Stack. + + if (typeof instance.getChildContext !== 'function') { + { + var componentName = getComponentName(type) || 'Unknown'; + + if (!warnedAboutMissingGetChildContext[componentName]) { + warnedAboutMissingGetChildContext[componentName] = true; + + error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName); + } + } + + return parentContext; + } + + var childContext = instance.getChildContext(); + + for (var contextKey in childContext) { + if (!(contextKey in childContextTypes)) { + { + throw Error( (getComponentName(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes." ); + } + } + } + + { + var name = getComponentName(type) || 'Unknown'; + checkPropTypes(childContextTypes, childContext, 'child context', name); + } + + return _assign({}, parentContext, childContext); + } +} + +function pushContextProvider(workInProgress) { + { + var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity. + // If the instance does not exist yet, we will push null at first, + // and replace it on the stack later when invalidating the context. + + var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later. + // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates. + + previousContext = contextStackCursor.current; + push(contextStackCursor, memoizedMergedChildContext, workInProgress); + push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress); + return true; + } +} + +function invalidateContextProvider(workInProgress, type, didChange) { + { + var instance = workInProgress.stateNode; + + if (!instance) { + { + throw Error( "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + if (didChange) { + // Merge parent and own context. + // Skip this if we're not updating due to sCU. + // This avoids unnecessarily recomputing memoized values. + var mergedContext = processChildContext(workInProgress, type, previousContext); + instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one. + // It is important to unwind the context in the reverse order. + + pop(didPerformWorkStackCursor, workInProgress); + pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed. + + push(contextStackCursor, mergedContext, workInProgress); + push(didPerformWorkStackCursor, didChange, workInProgress); + } else { + pop(didPerformWorkStackCursor, workInProgress); + push(didPerformWorkStackCursor, didChange, workInProgress); + } + } +} + +function findCurrentUnmaskedContext(fiber) { + { + // Currently this is only used with renderSubtreeIntoContainer; not sure if it + // makes sense elsewhere + if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) { + { + throw Error( "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var node = fiber; + + do { + switch (node.tag) { + case HostRoot: + return node.stateNode.context; + + case ClassComponent: + { + var Component = node.type; + + if (isContextProvider(Component)) { + return node.stateNode.__reactInternalMemoizedMergedChildContext; + } + + break; + } + } + + node = node.return; + } while (node !== null); + + { + { + throw Error( "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } +} + +var LegacyRoot = 0; +var BlockingRoot = 1; +var ConcurrentRoot = 2; + +var rendererID = null; +var injectedHook = null; +var hasLoggedError = false; +var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined'; +function injectInternals(internals) { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { + // No DevTools + return false; + } + + var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; + + if (hook.isDisabled) { + // This isn't a real property on the hook, but it can be set to opt out + // of DevTools integration and associated warnings and logs. + // https://github.com/facebook/react/issues/3877 + return true; + } + + if (!hook.supportsFiber) { + { + error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://reactjs.org/link/react-devtools'); + } // DevTools exists, even though it doesn't support Fiber. + + + return true; + } + + try { + rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks. + + injectedHook = hook; + } catch (err) { + // Catch all errors because it is unsafe to throw during initialization. + { + error('React instrumentation encountered an error: %s.', err); + } + } // DevTools exists + + + return true; +} +function onScheduleRoot(root, children) { + { + if (injectedHook && typeof injectedHook.onScheduleFiberRoot === 'function') { + try { + injectedHook.onScheduleFiberRoot(rendererID, root, children); + } catch (err) { + if ( !hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } + } + } +} +function onCommitRoot(root, priorityLevel) { + if (injectedHook && typeof injectedHook.onCommitFiberRoot === 'function') { + try { + var didError = (root.current.flags & DidCapture) === DidCapture; + + if (enableProfilerTimer) { + injectedHook.onCommitFiberRoot(rendererID, root, priorityLevel, didError); + } else { + injectedHook.onCommitFiberRoot(rendererID, root, undefined, didError); + } + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } + } + } +} +function onCommitUnmount(fiber) { + if (injectedHook && typeof injectedHook.onCommitFiberUnmount === 'function') { + try { + injectedHook.onCommitFiberUnmount(rendererID, fiber); + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } + } + } +} + +var Scheduler_runWithPriority = Scheduler.unstable_runWithPriority, + Scheduler_scheduleCallback = Scheduler.unstable_scheduleCallback, + Scheduler_cancelCallback = Scheduler.unstable_cancelCallback, + Scheduler_shouldYield = Scheduler.unstable_shouldYield, + Scheduler_requestPaint = Scheduler.unstable_requestPaint, + Scheduler_now$1 = Scheduler.unstable_now, + Scheduler_getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel, + Scheduler_ImmediatePriority = Scheduler.unstable_ImmediatePriority, + Scheduler_UserBlockingPriority = Scheduler.unstable_UserBlockingPriority, + Scheduler_NormalPriority = Scheduler.unstable_NormalPriority, + Scheduler_LowPriority = Scheduler.unstable_LowPriority, + Scheduler_IdlePriority = Scheduler.unstable_IdlePriority; + +{ + // Provide explicit error message when production+profiling bundle of e.g. + // react-dom is used with production (non-profiling) bundle of + // scheduler/tracing + if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) { + { + throw Error( "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://reactjs.org/link/profiling" ); + } + } +} + +var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use +// ascending numbers so we can compare them like numbers. They start at 90 to +// avoid clashing with Scheduler's priorities. + +var ImmediatePriority$1 = 99; +var UserBlockingPriority$2 = 98; +var NormalPriority$1 = 97; +var LowPriority$1 = 96; +var IdlePriority$1 = 95; // NoPriority is the absence of priority. Also React-only. + +var NoPriority$1 = 90; +var shouldYield = Scheduler_shouldYield; +var requestPaint = // Fall back gracefully if we're running an older version of Scheduler. +Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {}; +var syncQueue = null; +var immediateQueueCallbackNode = null; +var isFlushingSyncQueue = false; +var initialTimeMs$1 = Scheduler_now$1(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly. +// This will be the case for modern browsers that support `performance.now`. In +// older browsers, Scheduler falls back to `Date.now`, which returns a Unix +// timestamp. In that case, subtract the module initialization time to simulate +// the behavior of performance.now and keep our times small enough to fit +// within 32 bits. +// TODO: Consider lifting this into Scheduler. + +var now = initialTimeMs$1 < 10000 ? Scheduler_now$1 : function () { + return Scheduler_now$1() - initialTimeMs$1; +}; +function getCurrentPriorityLevel() { + switch (Scheduler_getCurrentPriorityLevel()) { + case Scheduler_ImmediatePriority: + return ImmediatePriority$1; + + case Scheduler_UserBlockingPriority: + return UserBlockingPriority$2; + + case Scheduler_NormalPriority: + return NormalPriority$1; + + case Scheduler_LowPriority: + return LowPriority$1; + + case Scheduler_IdlePriority: + return IdlePriority$1; + + default: + { + { + throw Error( "Unknown priority level." ); + } + } + + } +} + +function reactPriorityToSchedulerPriority(reactPriorityLevel) { + switch (reactPriorityLevel) { + case ImmediatePriority$1: + return Scheduler_ImmediatePriority; + + case UserBlockingPriority$2: + return Scheduler_UserBlockingPriority; + + case NormalPriority$1: + return Scheduler_NormalPriority; + + case LowPriority$1: + return Scheduler_LowPriority; + + case IdlePriority$1: + return Scheduler_IdlePriority; + + default: + { + { + throw Error( "Unknown priority level." ); + } + } + + } +} + +function runWithPriority$1(reactPriorityLevel, fn) { + var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); + return Scheduler_runWithPriority(priorityLevel, fn); +} +function scheduleCallback(reactPriorityLevel, callback, options) { + var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); + return Scheduler_scheduleCallback(priorityLevel, callback, options); +} +function scheduleSyncCallback(callback) { + // Push this callback into an internal queue. We'll flush these either in + // the next tick, or earlier if something calls `flushSyncCallbackQueue`. + if (syncQueue === null) { + syncQueue = [callback]; // Flush the queue in the next tick, at the earliest. + + immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl); + } else { + // Push onto existing queue. Don't need to schedule a callback because + // we already scheduled one when we created the queue. + syncQueue.push(callback); + } + + return fakeCallbackNode; +} +function cancelCallback(callbackNode) { + if (callbackNode !== fakeCallbackNode) { + Scheduler_cancelCallback(callbackNode); + } +} +function flushSyncCallbackQueue() { + if (immediateQueueCallbackNode !== null) { + var node = immediateQueueCallbackNode; + immediateQueueCallbackNode = null; + Scheduler_cancelCallback(node); + } + + flushSyncCallbackQueueImpl(); +} + +function flushSyncCallbackQueueImpl() { + if (!isFlushingSyncQueue && syncQueue !== null) { + // Prevent re-entrancy. + isFlushingSyncQueue = true; + var i = 0; + + { + try { + var _isSync2 = true; + var _queue = syncQueue; + runWithPriority$1(ImmediatePriority$1, function () { + for (; i < _queue.length; i++) { + var callback = _queue[i]; + + do { + callback = callback(_isSync2); + } while (callback !== null); + } + }); + syncQueue = null; + } catch (error) { + // If something throws, leave the remaining callbacks on the queue. + if (syncQueue !== null) { + syncQueue = syncQueue.slice(i + 1); + } // Resume flushing in the next tick + + + Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue); + throw error; + } finally { + isFlushingSyncQueue = false; + } + } + } +} + +// TODO: this is special because it gets imported during build. +var ReactVersion = '17.0.2'; + +var NoMode = 0; +var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root +// tag instead + +var BlockingMode = 2; +var ConcurrentMode = 4; +var ProfileMode = 8; +var DebugTracingMode = 16; + +var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; +var NoTransition = 0; +function requestCurrentTransition() { + return ReactCurrentBatchConfig.transition; +} + +var ReactStrictModeWarnings = { + recordUnsafeLifecycleWarnings: function (fiber, instance) {}, + flushPendingUnsafeLifecycleWarnings: function () {}, + recordLegacyContextWarning: function (fiber, instance) {}, + flushLegacyContextWarning: function () {}, + discardPendingWarnings: function () {} +}; + +{ + var findStrictRoot = function (fiber) { + var maybeStrictRoot = null; + var node = fiber; + + while (node !== null) { + if (node.mode & StrictMode) { + maybeStrictRoot = node; + } + + node = node.return; + } + + return maybeStrictRoot; + }; + + var setToSortedString = function (set) { + var array = []; + set.forEach(function (value) { + array.push(value); + }); + return array.sort().join(', '); + }; + + var pendingComponentWillMountWarnings = []; + var pendingUNSAFE_ComponentWillMountWarnings = []; + var pendingComponentWillReceivePropsWarnings = []; + var pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + var pendingComponentWillUpdateWarnings = []; + var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about. + + var didWarnAboutUnsafeLifecycles = new Set(); + + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) { + // Dedup strategy: Warn once per component. + if (didWarnAboutUnsafeLifecycles.has(fiber.type)) { + return; + } + + if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components. + instance.componentWillMount.__suppressDeprecationWarning !== true) { + pendingComponentWillMountWarnings.push(fiber); + } + + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') { + pendingUNSAFE_ComponentWillMountWarnings.push(fiber); + } + + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + pendingComponentWillReceivePropsWarnings.push(fiber); + } + + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber); + } + + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + pendingComponentWillUpdateWarnings.push(fiber); + } + + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') { + pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber); + } + }; + + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () { + // We do an initial pass to gather component names + var componentWillMountUniqueNames = new Set(); + + if (pendingComponentWillMountWarnings.length > 0) { + pendingComponentWillMountWarnings.forEach(function (fiber) { + componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillMountWarnings = []; + } + + var UNSAFE_componentWillMountUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) { + pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) { + UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillMountWarnings = []; + } + + var componentWillReceivePropsUniqueNames = new Set(); + + if (pendingComponentWillReceivePropsWarnings.length > 0) { + pendingComponentWillReceivePropsWarnings.forEach(function (fiber) { + componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillReceivePropsWarnings = []; + } + + var UNSAFE_componentWillReceivePropsUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) { + pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) { + UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + } + + var componentWillUpdateUniqueNames = new Set(); + + if (pendingComponentWillUpdateWarnings.length > 0) { + pendingComponentWillUpdateWarnings.forEach(function (fiber) { + componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillUpdateWarnings = []; + } + + var UNSAFE_componentWillUpdateUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) { + pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) { + UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillUpdateWarnings = []; + } // Finally, we flush all the warnings + // UNSAFE_ ones before the deprecated ones, since they'll be 'louder' + + + if (UNSAFE_componentWillMountUniqueNames.size > 0) { + var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames); + + error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames); + } + + if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames); + + error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '\nPlease update the following components: %s', _sortedNames); + } + + if (UNSAFE_componentWillUpdateUniqueNames.size > 0) { + var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames); + + error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2); + } + + if (componentWillMountUniqueNames.size > 0) { + var _sortedNames3 = setToSortedString(componentWillMountUniqueNames); + + warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3); + } + + if (componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames); + + warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4); + } + + if (componentWillUpdateUniqueNames.size > 0) { + var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames); + + warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5); + } + }; + + var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about. + + var didWarnAboutLegacyContext = new Set(); + + ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) { + var strictRoot = findStrictRoot(fiber); + + if (strictRoot === null) { + error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.'); + + return; + } // Dedup strategy: Warn once per component. + + + if (didWarnAboutLegacyContext.has(fiber.type)) { + return; + } + + var warningsForRoot = pendingLegacyContextWarning.get(strictRoot); + + if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') { + if (warningsForRoot === undefined) { + warningsForRoot = []; + pendingLegacyContextWarning.set(strictRoot, warningsForRoot); + } + + warningsForRoot.push(fiber); + } + }; + + ReactStrictModeWarnings.flushLegacyContextWarning = function () { + pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) { + if (fiberArray.length === 0) { + return; + } + + var firstFiber = fiberArray[0]; + var uniqueNames = new Set(); + fiberArray.forEach(function (fiber) { + uniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutLegacyContext.add(fiber.type); + }); + var sortedNames = setToSortedString(uniqueNames); + + try { + setCurrentFiber(firstFiber); + + error('Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://reactjs.org/link/legacy-context', sortedNames); + } finally { + resetCurrentFiber(); + } + }); + }; + + ReactStrictModeWarnings.discardPendingWarnings = function () { + pendingComponentWillMountWarnings = []; + pendingUNSAFE_ComponentWillMountWarnings = []; + pendingComponentWillReceivePropsWarnings = []; + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + pendingComponentWillUpdateWarnings = []; + pendingUNSAFE_ComponentWillUpdateWarnings = []; + pendingLegacyContextWarning = new Map(); + }; +} + +function resolveDefaultProps(Component, baseProps) { + if (Component && Component.defaultProps) { + // Resolve default props. Taken from ReactElement + var props = _assign({}, baseProps); + + var defaultProps = Component.defaultProps; + + for (var propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + + return props; + } + + return baseProps; +} + +// Max 31 bit integer. The max integer size in V8 for 32-bit systems. +// Math.pow(2, 30) - 1 +// 0b111111111111111111111111111111 +var MAX_SIGNED_31_BIT_INT = 1073741823; + +var valueCursor = createCursor(null); +var rendererSigil; + +{ + // Use this to detect multiple renderers using the same context + rendererSigil = {}; +} + +var currentlyRenderingFiber = null; +var lastContextDependency = null; +var lastContextWithAllBitsObserved = null; +var isDisallowedContextReadInDEV = false; +function resetContextDependencies() { + // This is called right before React yields execution, to ensure `readContext` + // cannot be called outside the render phase. + currentlyRenderingFiber = null; + lastContextDependency = null; + lastContextWithAllBitsObserved = null; + + { + isDisallowedContextReadInDEV = false; + } +} +function enterDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = true; + } +} +function exitDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = false; + } +} +function pushProvider(providerFiber, nextValue) { + var context = providerFiber.type._context; + + { + push(valueCursor, context._currentValue, providerFiber); + context._currentValue = nextValue; + + { + if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) { + error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.'); + } + + context._currentRenderer = rendererSigil; + } + } +} +function popProvider(providerFiber) { + var currentValue = valueCursor.current; + pop(valueCursor, providerFiber); + var context = providerFiber.type._context; + + { + context._currentValue = currentValue; + } +} +function calculateChangedBits(context, newValue, oldValue) { + if (objectIs(oldValue, newValue)) { + // No change + return 0; + } else { + var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT; + + { + if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) { + error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits); + } + } + + return changedBits | 0; + } +} +function scheduleWorkOnParentPath(parent, renderLanes) { + // Update the child lanes of all the ancestors, including the alternates. + var node = parent; + + while (node !== null) { + var alternate = node.alternate; + + if (!isSubsetOfLanes(node.childLanes, renderLanes)) { + node.childLanes = mergeLanes(node.childLanes, renderLanes); + + if (alternate !== null) { + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes); + } + } else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes)) { + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes); + } else { + // Neither alternate was updated, which means the rest of the + // ancestor path already has sufficient priority. + break; + } + + node = node.return; + } +} +function propagateContextChange(workInProgress, context, changedBits, renderLanes) { + var fiber = workInProgress.child; + + if (fiber !== null) { + // Set the return pointer of the child to the work-in-progress fiber. + fiber.return = workInProgress; + } + + while (fiber !== null) { + var nextFiber = void 0; // Visit this fiber. + + var list = fiber.dependencies; + + if (list !== null) { + nextFiber = fiber.child; + var dependency = list.firstContext; + + while (dependency !== null) { + // Check if the context matches. + if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) { + // Match! Schedule an update on this fiber. + if (fiber.tag === ClassComponent) { + // Schedule a force update on the work-in-progress. + var update = createUpdate(NoTimestamp, pickArbitraryLane(renderLanes)); + update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the + // update to the current fiber, too, which means it will persist even if + // this render is thrown away. Since it's a race condition, not sure it's + // worth fixing. + + enqueueUpdate(fiber, update); + } + + fiber.lanes = mergeLanes(fiber.lanes, renderLanes); + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, renderLanes); + } + + scheduleWorkOnParentPath(fiber.return, renderLanes); // Mark the updated lanes on the list, too. + + list.lanes = mergeLanes(list.lanes, renderLanes); // Since we already found a match, we can stop traversing the + // dependency list. + + break; + } + + dependency = dependency.next; + } + } else if (fiber.tag === ContextProvider) { + // Don't scan deeper if this is a matching provider + nextFiber = fiber.type === workInProgress.type ? null : fiber.child; + } else { + // Traverse down. + nextFiber = fiber.child; + } + + if (nextFiber !== null) { + // Set the return pointer of the child to the work-in-progress fiber. + nextFiber.return = fiber; + } else { + // No child. Traverse to next sibling. + nextFiber = fiber; + + while (nextFiber !== null) { + if (nextFiber === workInProgress) { + // We're back to the root of this subtree. Exit. + nextFiber = null; + break; + } + + var sibling = nextFiber.sibling; + + if (sibling !== null) { + // Set the return pointer of the sibling to the work-in-progress fiber. + sibling.return = nextFiber.return; + nextFiber = sibling; + break; + } // No more siblings. Traverse up. + + + nextFiber = nextFiber.return; + } + } + + fiber = nextFiber; + } +} +function prepareToReadContext(workInProgress, renderLanes) { + currentlyRenderingFiber = workInProgress; + lastContextDependency = null; + lastContextWithAllBitsObserved = null; + var dependencies = workInProgress.dependencies; + + if (dependencies !== null) { + var firstContext = dependencies.firstContext; + + if (firstContext !== null) { + if (includesSomeLane(dependencies.lanes, renderLanes)) { + // Context list has a pending update. Mark that this fiber performed work. + markWorkInProgressReceivedUpdate(); + } // Reset the work-in-progress list + + + dependencies.firstContext = null; + } + } +} +function readContext(context, observedBits) { + { + // This warning would fire if you read context inside a Hook like useMemo. + // Unlike the class check below, it's not enforced in production for perf. + if (isDisallowedContextReadInDEV) { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + } + } + + if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else { + var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types. + + if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) { + // Observe all updates. + lastContextWithAllBitsObserved = context; + resolvedObservedBits = MAX_SIGNED_31_BIT_INT; + } else { + resolvedObservedBits = observedBits; + } + + var contextItem = { + context: context, + observedBits: resolvedObservedBits, + next: null + }; + + if (lastContextDependency === null) { + if (!(currentlyRenderingFiber !== null)) { + { + throw Error( "Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()." ); + } + } // This is the first dependency for this component. Create a new list. + + + lastContextDependency = contextItem; + currentlyRenderingFiber.dependencies = { + lanes: NoLanes, + firstContext: contextItem, + responders: null + }; + } else { + // Append a new context item. + lastContextDependency = lastContextDependency.next = contextItem; + } + } + + return context._currentValue ; +} + +var UpdateState = 0; +var ReplaceState = 1; +var ForceUpdate = 2; +var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`. +// It should only be read right after calling `processUpdateQueue`, via +// `checkHasForceUpdateAfterProcessing`. + +var hasForceUpdate = false; +var didWarnUpdateInsideUpdate; +var currentlyProcessingQueue; + +{ + didWarnUpdateInsideUpdate = false; + currentlyProcessingQueue = null; +} + +function initializeUpdateQueue(fiber) { + var queue = { + baseState: fiber.memoizedState, + firstBaseUpdate: null, + lastBaseUpdate: null, + shared: { + pending: null + }, + effects: null + }; + fiber.updateQueue = queue; +} +function cloneUpdateQueue(current, workInProgress) { + // Clone the update queue from current. Unless it's already a clone. + var queue = workInProgress.updateQueue; + var currentQueue = current.updateQueue; + + if (queue === currentQueue) { + var clone = { + baseState: currentQueue.baseState, + firstBaseUpdate: currentQueue.firstBaseUpdate, + lastBaseUpdate: currentQueue.lastBaseUpdate, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress.updateQueue = clone; + } +} +function createUpdate(eventTime, lane) { + var update = { + eventTime: eventTime, + lane: lane, + tag: UpdateState, + payload: null, + callback: null, + next: null + }; + return update; +} +function enqueueUpdate(fiber, update) { + var updateQueue = fiber.updateQueue; + + if (updateQueue === null) { + // Only occurs if the fiber has been unmounted. + return; + } + + var sharedQueue = updateQueue.shared; + var pending = sharedQueue.pending; + + if (pending === null) { + // This is the first update. Create a circular list. + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + + sharedQueue.pending = update; + + { + if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) { + error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.'); + + didWarnUpdateInsideUpdate = true; + } + } +} +function enqueueCapturedUpdate(workInProgress, capturedUpdate) { + // Captured updates are updates that are thrown by a child during the render + // phase. They should be discarded if the render is aborted. Therefore, + // we should only put them on the work-in-progress queue, not the current one. + var queue = workInProgress.updateQueue; // Check if the work-in-progress queue is a clone. + + var current = workInProgress.alternate; + + if (current !== null) { + var currentQueue = current.updateQueue; + + if (queue === currentQueue) { + // The work-in-progress queue is the same as current. This happens when + // we bail out on a parent fiber that then captures an error thrown by + // a child. Since we want to append the update only to the work-in + // -progress queue, we need to clone the updates. We usually clone during + // processUpdateQueue, but that didn't happen in this case because we + // skipped over the parent when we bailed out. + var newFirst = null; + var newLast = null; + var firstBaseUpdate = queue.firstBaseUpdate; + + if (firstBaseUpdate !== null) { + // Loop through the updates and clone them. + var update = firstBaseUpdate; + + do { + var clone = { + eventTime: update.eventTime, + lane: update.lane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + + if (newLast === null) { + newFirst = newLast = clone; + } else { + newLast.next = clone; + newLast = clone; + } + + update = update.next; + } while (update !== null); // Append the captured update the end of the cloned list. + + + if (newLast === null) { + newFirst = newLast = capturedUpdate; + } else { + newLast.next = capturedUpdate; + newLast = capturedUpdate; + } + } else { + // There are no base updates. + newFirst = newLast = capturedUpdate; + } + + queue = { + baseState: currentQueue.baseState, + firstBaseUpdate: newFirst, + lastBaseUpdate: newLast, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress.updateQueue = queue; + return; + } + } // Append the update to the end of the list. + + + var lastBaseUpdate = queue.lastBaseUpdate; + + if (lastBaseUpdate === null) { + queue.firstBaseUpdate = capturedUpdate; + } else { + lastBaseUpdate.next = capturedUpdate; + } + + queue.lastBaseUpdate = capturedUpdate; +} + +function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) { + switch (update.tag) { + case ReplaceState: + { + var payload = update.payload; + + if (typeof payload === 'function') { + // Updater function + { + enterDisallowedContextReadInDEV(); + } + + var nextState = payload.call(instance, prevState, nextProps); + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + payload.call(instance, prevState, nextProps); + } finally { + reenableLogs(); + } + } + + exitDisallowedContextReadInDEV(); + } + + return nextState; + } // State object + + + return payload; + } + + case CaptureUpdate: + { + workInProgress.flags = workInProgress.flags & ~ShouldCapture | DidCapture; + } + // Intentional fallthrough + + case UpdateState: + { + var _payload = update.payload; + var partialState; + + if (typeof _payload === 'function') { + // Updater function + { + enterDisallowedContextReadInDEV(); + } + + partialState = _payload.call(instance, prevState, nextProps); + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + _payload.call(instance, prevState, nextProps); + } finally { + reenableLogs(); + } + } + + exitDisallowedContextReadInDEV(); + } + } else { + // Partial state object + partialState = _payload; + } + + if (partialState === null || partialState === undefined) { + // Null and undefined are treated as no-ops. + return prevState; + } // Merge the partial state and the previous state. + + + return _assign({}, prevState, partialState); + } + + case ForceUpdate: + { + hasForceUpdate = true; + return prevState; + } + } + + return prevState; +} + +function processUpdateQueue(workInProgress, props, instance, renderLanes) { + // This is always non-null on a ClassComponent or HostRoot + var queue = workInProgress.updateQueue; + hasForceUpdate = false; + + { + currentlyProcessingQueue = queue.shared; + } + + var firstBaseUpdate = queue.firstBaseUpdate; + var lastBaseUpdate = queue.lastBaseUpdate; // Check if there are pending updates. If so, transfer them to the base queue. + + var pendingQueue = queue.shared.pending; + + if (pendingQueue !== null) { + queue.shared.pending = null; // The pending queue is circular. Disconnect the pointer between first + // and last so that it's non-circular. + + var lastPendingUpdate = pendingQueue; + var firstPendingUpdate = lastPendingUpdate.next; + lastPendingUpdate.next = null; // Append pending updates to base queue + + if (lastBaseUpdate === null) { + firstBaseUpdate = firstPendingUpdate; + } else { + lastBaseUpdate.next = firstPendingUpdate; + } + + lastBaseUpdate = lastPendingUpdate; // If there's a current queue, and it's different from the base queue, then + // we need to transfer the updates to that queue, too. Because the base + // queue is a singly-linked list with no cycles, we can append to both + // lists and take advantage of structural sharing. + // TODO: Pass `current` as argument + + var current = workInProgress.alternate; + + if (current !== null) { + // This is always non-null on a ClassComponent or HostRoot + var currentQueue = current.updateQueue; + var currentLastBaseUpdate = currentQueue.lastBaseUpdate; + + if (currentLastBaseUpdate !== lastBaseUpdate) { + if (currentLastBaseUpdate === null) { + currentQueue.firstBaseUpdate = firstPendingUpdate; + } else { + currentLastBaseUpdate.next = firstPendingUpdate; + } + + currentQueue.lastBaseUpdate = lastPendingUpdate; + } + } + } // These values may change as we process the queue. + + + if (firstBaseUpdate !== null) { + // Iterate through the list of updates to compute the result. + var newState = queue.baseState; // TODO: Don't need to accumulate this. Instead, we can remove renderLanes + // from the original lanes. + + var newLanes = NoLanes; + var newBaseState = null; + var newFirstBaseUpdate = null; + var newLastBaseUpdate = null; + var update = firstBaseUpdate; + + do { + var updateLane = update.lane; + var updateEventTime = update.eventTime; + + if (!isSubsetOfLanes(renderLanes, updateLane)) { + // Priority is insufficient. Skip this update. If this is the first + // skipped update, the previous update/state is the new base + // update/state. + var clone = { + eventTime: updateEventTime, + lane: updateLane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + + if (newLastBaseUpdate === null) { + newFirstBaseUpdate = newLastBaseUpdate = clone; + newBaseState = newState; + } else { + newLastBaseUpdate = newLastBaseUpdate.next = clone; + } // Update the remaining priority in the queue. + + + newLanes = mergeLanes(newLanes, updateLane); + } else { + // This update does have sufficient priority. + if (newLastBaseUpdate !== null) { + var _clone = { + eventTime: updateEventTime, + // This update is going to be committed so we never want uncommit + // it. Using NoLane works because 0 is a subset of all bitmasks, so + // this will never be skipped by the check above. + lane: NoLane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + newLastBaseUpdate = newLastBaseUpdate.next = _clone; + } // Process this update. + + + newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance); + var callback = update.callback; + + if (callback !== null) { + workInProgress.flags |= Callback; + var effects = queue.effects; + + if (effects === null) { + queue.effects = [update]; + } else { + effects.push(update); + } + } + } + + update = update.next; + + if (update === null) { + pendingQueue = queue.shared.pending; + + if (pendingQueue === null) { + break; + } else { + // An update was scheduled from inside a reducer. Add the new + // pending updates to the end of the list and keep processing. + var _lastPendingUpdate = pendingQueue; // Intentionally unsound. Pending updates form a circular list, but we + // unravel them when transferring them to the base queue. + + var _firstPendingUpdate = _lastPendingUpdate.next; + _lastPendingUpdate.next = null; + update = _firstPendingUpdate; + queue.lastBaseUpdate = _lastPendingUpdate; + queue.shared.pending = null; + } + } + } while (true); + + if (newLastBaseUpdate === null) { + newBaseState = newState; + } + + queue.baseState = newBaseState; + queue.firstBaseUpdate = newFirstBaseUpdate; + queue.lastBaseUpdate = newLastBaseUpdate; // Set the remaining expiration time to be whatever is remaining in the queue. + // This should be fine because the only two other things that contribute to + // expiration time are props and context. We're already in the middle of the + // begin phase by the time we start processing the queue, so we've already + // dealt with the props. Context in components that specify + // shouldComponentUpdate is tricky; but we'll have to account for + // that regardless. + + markSkippedUpdateLanes(newLanes); + workInProgress.lanes = newLanes; + workInProgress.memoizedState = newState; + } + + { + currentlyProcessingQueue = null; + } +} + +function callCallback(callback, context) { + if (!(typeof callback === 'function')) { + { + throw Error( "Invalid argument passed as callback. Expected a function. Instead received: " + callback ); + } + } + + callback.call(context); +} + +function resetHasForceUpdateBeforeProcessing() { + hasForceUpdate = false; +} +function checkHasForceUpdateAfterProcessing() { + return hasForceUpdate; +} +function commitUpdateQueue(finishedWork, finishedQueue, instance) { + // Commit the effects + var effects = finishedQueue.effects; + finishedQueue.effects = null; + + if (effects !== null) { + for (var i = 0; i < effects.length; i++) { + var effect = effects[i]; + var callback = effect.callback; + + if (callback !== null) { + effect.callback = null; + callCallback(callback, instance); + } + } + } +} + +var fakeInternalInstance = {}; +var isArray = Array.isArray; // React.Component uses a shared frozen object by default. +// We'll use it to determine whether we need to initialize legacy refs. + +var emptyRefsObject = new React.Component().refs; +var didWarnAboutStateAssignmentForComponent; +var didWarnAboutUninitializedState; +var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate; +var didWarnAboutLegacyLifecyclesAndDerivedState; +var didWarnAboutUndefinedDerivedState; +var warnOnUndefinedDerivedState; +var warnOnInvalidCallback; +var didWarnAboutDirectlyAssigningPropsToState; +var didWarnAboutContextTypeAndContextTypes; +var didWarnAboutInvalidateContextType; + +{ + didWarnAboutStateAssignmentForComponent = new Set(); + didWarnAboutUninitializedState = new Set(); + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set(); + didWarnAboutLegacyLifecyclesAndDerivedState = new Set(); + didWarnAboutDirectlyAssigningPropsToState = new Set(); + didWarnAboutUndefinedDerivedState = new Set(); + didWarnAboutContextTypeAndContextTypes = new Set(); + didWarnAboutInvalidateContextType = new Set(); + var didWarnOnInvalidCallback = new Set(); + + warnOnInvalidCallback = function (callback, callerName) { + if (callback === null || typeof callback === 'function') { + return; + } + + var key = callerName + '_' + callback; + + if (!didWarnOnInvalidCallback.has(key)) { + didWarnOnInvalidCallback.add(key); + + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); + } + }; + + warnOnUndefinedDerivedState = function (type, partialState) { + if (partialState === undefined) { + var componentName = getComponentName(type) || 'Component'; + + if (!didWarnAboutUndefinedDerivedState.has(componentName)) { + didWarnAboutUndefinedDerivedState.add(componentName); + + error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName); + } + } + }; // This is so gross but it's at least non-critical and can be removed if + // it causes problems. This is meant to give a nicer error message for + // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component, + // ...)) which otherwise throws a "_processChildContext is not a function" + // exception. + + + Object.defineProperty(fakeInternalInstance, '_processChildContext', { + enumerable: false, + value: function () { + { + { + throw Error( "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)." ); + } + } + } + }); + Object.freeze(fakeInternalInstance); +} + +function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) { + var prevState = workInProgress.memoizedState; + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + // Invoke the function an extra time to help detect side-effects. + getDerivedStateFromProps(nextProps, prevState); + } finally { + reenableLogs(); + } + } + } + + var partialState = getDerivedStateFromProps(nextProps, prevState); + + { + warnOnUndefinedDerivedState(ctor, partialState); + } // Merge the partial state and the previous state. + + + var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState); + workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the + // base state. + + if (workInProgress.lanes === NoLanes) { + // Queue is always non-null for classes + var updateQueue = workInProgress.updateQueue; + updateQueue.baseState = memoizedState; + } +} +var classComponentUpdater = { + isMounted: isMounted, + enqueueSetState: function (inst, payload, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.payload = payload; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'setState'); + } + + update.callback = callback; + } + + enqueueUpdate(fiber, update); + scheduleUpdateOnFiber(fiber, lane, eventTime); + }, + enqueueReplaceState: function (inst, payload, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.tag = ReplaceState; + update.payload = payload; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'replaceState'); + } + + update.callback = callback; + } + + enqueueUpdate(fiber, update); + scheduleUpdateOnFiber(fiber, lane, eventTime); + }, + enqueueForceUpdate: function (inst, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.tag = ForceUpdate; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'forceUpdate'); + } + + update.callback = callback; + } + + enqueueUpdate(fiber, update); + scheduleUpdateOnFiber(fiber, lane, eventTime); + } +}; + +function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) { + var instance = workInProgress.stateNode; + + if (typeof instance.shouldComponentUpdate === 'function') { + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + // Invoke the function an extra time to help detect side-effects. + instance.shouldComponentUpdate(newProps, newState, nextContext); + } finally { + reenableLogs(); + } + } + } + + var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext); + + { + if (shouldUpdate === undefined) { + error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component'); + } + } + + return shouldUpdate; + } + + if (ctor.prototype && ctor.prototype.isPureReactComponent) { + return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState); + } + + return true; +} + +function checkClassInstance(workInProgress, ctor, newProps) { + var instance = workInProgress.stateNode; + + { + var name = getComponentName(ctor) || 'Component'; + var renderPresent = instance.render; + + if (!renderPresent) { + if (ctor.prototype && typeof ctor.prototype.render === 'function') { + error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name); + } else { + error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name); + } + } + + if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) { + error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name); + } + + if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) { + error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name); + } + + if (instance.propTypes) { + error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name); + } + + if (instance.contextType) { + error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name); + } + + { + if (instance.contextTypes) { + error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name); + } + + if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) { + didWarnAboutContextTypeAndContextTypes.add(ctor); + + error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name); + } + } + + if (typeof instance.componentShouldUpdate === 'function') { + error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name); + } + + if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') { + error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component'); + } + + if (typeof instance.componentDidUnmount === 'function') { + error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name); + } + + if (typeof instance.componentDidReceiveProps === 'function') { + error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name); + } + + if (typeof instance.componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name); + } + + if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name); + } + + var hasMutatedProps = instance.props !== newProps; + + if (instance.props !== undefined && hasMutatedProps) { + error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name); + } + + if (instance.defaultProps) { + error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name); + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) { + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor); + + error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor)); + } + + if (typeof instance.getDerivedStateFromProps === 'function') { + error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + + if (typeof instance.getDerivedStateFromError === 'function') { + error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + + if (typeof ctor.getSnapshotBeforeUpdate === 'function') { + error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name); + } + + var _state = instance.state; + + if (_state && (typeof _state !== 'object' || isArray(_state))) { + error('%s.state: must be set to an object or null', name); + } + + if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') { + error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name); + } + } +} + +function adoptClassInstance(workInProgress, instance) { + instance.updater = classComponentUpdater; + workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates + + set(instance, workInProgress); + + { + instance._reactInternalInstance = fakeInternalInstance; + } +} + +function constructClassInstance(workInProgress, ctor, props) { + var isLegacyContextConsumer = false; + var unmaskedContext = emptyContextObject; + var context = emptyContextObject; + var contextType = ctor.contextType; + + { + if ('contextType' in ctor) { + var isValid = // Allow null for conditional declaration + contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer> + + if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) { + didWarnAboutInvalidateContextType.add(ctor); + var addendum = ''; + + if (contextType === undefined) { + addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.'; + } else if (typeof contextType !== 'object') { + addendum = ' However, it is set to a ' + typeof contextType + '.'; + } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { + addendum = ' Did you accidentally pass the Context.Provider instead?'; + } else if (contextType._context !== undefined) { + // <Context.Consumer> + addendum = ' Did you accidentally pass the Context.Consumer instead?'; + } else { + addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.'; + } + + error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum); + } + } + } + + if (typeof contextType === 'object' && contextType !== null) { + context = readContext(contextType); + } else { + unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + var contextTypes = ctor.contextTypes; + isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined; + context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject; + } // Instantiate twice to help detect side-effects. + + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + new ctor(props, context); // eslint-disable-line no-new + } finally { + reenableLogs(); + } + } + } + + var instance = new ctor(props, context); + var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null; + adoptClassInstance(workInProgress, instance); + + { + if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) { + var componentName = getComponentName(ctor) || 'Component'; + + if (!didWarnAboutUninitializedState.has(componentName)) { + didWarnAboutUninitializedState.add(componentName); + + error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName); + } + } // If new component APIs are defined, "unsafe" lifecycles won't be called. + // Warn about these lifecycles if they are present. + // Don't warn about react-lifecycles-compat polyfilled methods though. + + + if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') { + var foundWillMountName = null; + var foundWillReceivePropsName = null; + var foundWillUpdateName = null; + + if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) { + foundWillMountName = 'componentWillMount'; + } else if (typeof instance.UNSAFE_componentWillMount === 'function') { + foundWillMountName = 'UNSAFE_componentWillMount'; + } + + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + foundWillReceivePropsName = 'componentWillReceiveProps'; + } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps'; + } + + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + foundWillUpdateName = 'componentWillUpdate'; + } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + foundWillUpdateName = 'UNSAFE_componentWillUpdate'; + } + + if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) { + var _componentName = getComponentName(ctor) || 'Component'; + + var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()'; + + if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) { + didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName); + + error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : ''); + } + } + } + } // Cache unmasked context so we can avoid recreating masked context unless necessary. + // ReactFiberContext usually updates this cache but can't for newly-created instances. + + + if (isLegacyContextConsumer) { + cacheContext(workInProgress, unmaskedContext, context); + } + + return instance; +} + +function callComponentWillMount(workInProgress, instance) { + var oldState = instance.state; + + if (typeof instance.componentWillMount === 'function') { + instance.componentWillMount(); + } + + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); + } + + if (oldState !== instance.state) { + { + error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component'); + } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } +} + +function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) { + var oldState = instance.state; + + if (typeof instance.componentWillReceiveProps === 'function') { + instance.componentWillReceiveProps(newProps, nextContext); + } + + if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); + } + + if (instance.state !== oldState) { + { + var componentName = getComponentName(workInProgress.type) || 'Component'; + + if (!didWarnAboutStateAssignmentForComponent.has(componentName)) { + didWarnAboutStateAssignmentForComponent.add(componentName); + + error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName); + } + } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } +} // Invokes the mount life-cycles on a previously never rendered instance. + + +function mountClassInstance(workInProgress, ctor, newProps, renderLanes) { + { + checkClassInstance(workInProgress, ctor, newProps); + } + + var instance = workInProgress.stateNode; + instance.props = newProps; + instance.state = workInProgress.memoizedState; + instance.refs = emptyRefsObject; + initializeUpdateQueue(workInProgress); + var contextType = ctor.contextType; + + if (typeof contextType === 'object' && contextType !== null) { + instance.context = readContext(contextType); + } else { + var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + instance.context = getMaskedContext(workInProgress, unmaskedContext); + } + + { + if (instance.state === newProps) { + var componentName = getComponentName(ctor) || 'Component'; + + if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) { + didWarnAboutDirectlyAssigningPropsToState.add(componentName); + + error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName); + } + } + + if (workInProgress.mode & StrictMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance); + } + + { + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance); + } + } + + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + instance.state = workInProgress.memoizedState; + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + instance.state = workInProgress.memoizedState; + } // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + + if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's + // process them now. + + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + instance.state = workInProgress.memoizedState; + } + + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } +} + +function resumeMountClassInstance(workInProgress, ctor, newProps, renderLanes) { + var instance = workInProgress.stateNode; + var oldProps = workInProgress.memoizedProps; + instance.props = oldProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + + if (typeof contextType === 'object' && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext); + } + + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what + // ever the previously attempted to render - not the "current". However, + // during componentDidUpdate we pass the "current" props. + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { + if (oldProps !== newProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + } + } + + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + newState = workInProgress.memoizedState; + + if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } + + return false; + } + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress.memoizedState; + } + + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); + + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + if (typeof instance.componentWillMount === 'function') { + instance.componentWillMount(); + } + + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); + } + } + + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } + } else { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } // If shouldComponentUpdate returned false, we should still update the + // memoized state to indicate that this work can be reused. + + + workInProgress.memoizedProps = newProps; + workInProgress.memoizedState = newState; + } // Update the existing instance's state, props, and context pointers even + // if shouldComponentUpdate returns false. + + + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; +} // Invokes the update life-cycles and returns false if it shouldn't rerender. + + +function updateClassInstance(current, workInProgress, ctor, newProps, renderLanes) { + var instance = workInProgress.stateNode; + cloneUpdateQueue(current, workInProgress); + var unresolvedOldProps = workInProgress.memoizedProps; + var oldProps = workInProgress.type === workInProgress.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress.type, unresolvedOldProps); + instance.props = oldProps; + var unresolvedNewProps = workInProgress.pendingProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + + if (typeof contextType === 'object' && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + nextContext = getMaskedContext(workInProgress, nextUnmaskedContext); + } + + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what + // ever the previously attempted to render - not the "current". However, + // during componentDidUpdate we pass the "current" props. + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { + if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + } + } + + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + newState = workInProgress.memoizedState; + + if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Update; + } + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Snapshot; + } + } + + return false; + } + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress.memoizedState; + } + + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); + + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) { + if (typeof instance.componentWillUpdate === 'function') { + instance.componentWillUpdate(newProps, newState, nextContext); + } + + if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext); + } + } + + if (typeof instance.componentDidUpdate === 'function') { + workInProgress.flags |= Update; + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + workInProgress.flags |= Snapshot; + } + } else { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Update; + } + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Snapshot; + } + } // If shouldComponentUpdate returned false, we should still update the + // memoized props/state to indicate that this work can be reused. + + + workInProgress.memoizedProps = newProps; + workInProgress.memoizedState = newState; + } // Update the existing instance's state, props, and context pointers even + // if shouldComponentUpdate returns false. + + + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; +} + +var didWarnAboutMaps; +var didWarnAboutGenerators; +var didWarnAboutStringRefs; +var ownerHasKeyUseWarning; +var ownerHasFunctionTypeWarning; + +var warnForMissingKey = function (child, returnFiber) {}; + +{ + didWarnAboutMaps = false; + didWarnAboutGenerators = false; + didWarnAboutStringRefs = {}; + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + ownerHasKeyUseWarning = {}; + ownerHasFunctionTypeWarning = {}; + + warnForMissingKey = function (child, returnFiber) { + if (child === null || typeof child !== 'object') { + return; + } + + if (!child._store || child._store.validated || child.key != null) { + return; + } + + if (!(typeof child._store === 'object')) { + { + throw Error( "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + child._store.validated = true; + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (ownerHasKeyUseWarning[componentName]) { + return; + } + + ownerHasKeyUseWarning[componentName] = true; + + error('Each child in a list should have a unique ' + '"key" prop. See https://reactjs.org/link/warning-keys for ' + 'more information.'); + }; +} + +var isArray$1 = Array.isArray; + +function coerceRef(returnFiber, current, element) { + var mixedRef = element.ref; + + if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') { + { + // TODO: Clean this up once we turn on the string ref warning for + // everyone, because the strict mode case will no longer be relevant + if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs + // because these cannot be automatically converted to an arrow function + // using a codemod. Therefore, we don't have to warn about string refs again. + !(element._owner && element._self && element._owner.stateNode !== element._self)) { + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (!didWarnAboutStringRefs[componentName]) { + { + error('A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', mixedRef); + } + + didWarnAboutStringRefs[componentName] = true; + } + } + } + + if (element._owner) { + var owner = element._owner; + var inst; + + if (owner) { + var ownerFiber = owner; + + if (!(ownerFiber.tag === ClassComponent)) { + { + throw Error( "Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref" ); + } + } + + inst = ownerFiber.stateNode; + } + + if (!inst) { + { + throw Error( "Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref + + if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) { + return current.ref; + } + + var ref = function (value) { + var refs = inst.refs; + + if (refs === emptyRefsObject) { + // This is a lazy pooled frozen object, so we need to initialize. + refs = inst.refs = {}; + } + + if (value === null) { + delete refs[stringRef]; + } else { + refs[stringRef] = value; + } + }; + + ref._stringRef = stringRef; + return ref; + } else { + if (!(typeof mixedRef === 'string')) { + { + throw Error( "Expected ref to be a function, a string, an object returned by React.createRef(), or null." ); + } + } + + if (!element._owner) { + { + throw Error( "Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://reactjs.org/link/refs-must-have-owner for more information." ); + } + } + } + } + + return mixedRef; +} + +function throwOnInvalidObjectType(returnFiber, newChild) { + if (returnFiber.type !== 'textarea') { + { + { + throw Error( "Objects are not valid as a React child (found: " + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + "). If you meant to render a collection of children, use an array instead." ); + } + } + } +} + +function warnOnFunctionType(returnFiber) { + { + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (ownerHasFunctionTypeWarning[componentName]) { + return; + } + + ownerHasFunctionTypeWarning[componentName] = true; + + error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.'); + } +} // We avoid inlining this to avoid potential deopts from using try/catch. +// to be able to optimize each path individually by branching early. This needs +// a compiler or we can do it manually. Helpers that don't need this branching +// live outside of this function. + + +function ChildReconciler(shouldTrackSideEffects) { + function deleteChild(returnFiber, childToDelete) { + if (!shouldTrackSideEffects) { + // Noop. + return; + } // Deletions are added in reversed order so we add it to the front. + // At this point, the return fiber's effect list is empty except for + // deletions, so we can just append the deletion to the list. The remaining + // effects aren't added until the complete phase. Once we implement + // resuming, this may not be true. + + + var last = returnFiber.lastEffect; + + if (last !== null) { + last.nextEffect = childToDelete; + returnFiber.lastEffect = childToDelete; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; + } + + childToDelete.nextEffect = null; + childToDelete.flags = Deletion; + } + + function deleteRemainingChildren(returnFiber, currentFirstChild) { + if (!shouldTrackSideEffects) { + // Noop. + return null; + } // TODO: For the shouldClone case, this could be micro-optimized a bit by + // assuming that after the first child we've already added everything. + + + var childToDelete = currentFirstChild; + + while (childToDelete !== null) { + deleteChild(returnFiber, childToDelete); + childToDelete = childToDelete.sibling; + } + + return null; + } + + function mapRemainingChildren(returnFiber, currentFirstChild) { + // Add the remaining children to a temporary map so that we can find them by + // keys quickly. Implicit (null) keys get added to this set with their index + // instead. + var existingChildren = new Map(); + var existingChild = currentFirstChild; + + while (existingChild !== null) { + if (existingChild.key !== null) { + existingChildren.set(existingChild.key, existingChild); + } else { + existingChildren.set(existingChild.index, existingChild); + } + + existingChild = existingChild.sibling; + } + + return existingChildren; + } + + function useFiber(fiber, pendingProps) { + // We currently set sibling to null and index to 0 here because it is easy + // to forget to do before returning it. E.g. for the single child case. + var clone = createWorkInProgress(fiber, pendingProps); + clone.index = 0; + clone.sibling = null; + return clone; + } + + function placeChild(newFiber, lastPlacedIndex, newIndex) { + newFiber.index = newIndex; + + if (!shouldTrackSideEffects) { + // Noop. + return lastPlacedIndex; + } + + var current = newFiber.alternate; + + if (current !== null) { + var oldIndex = current.index; + + if (oldIndex < lastPlacedIndex) { + // This is a move. + newFiber.flags = Placement; + return lastPlacedIndex; + } else { + // This item can stay in place. + return oldIndex; + } + } else { + // This is an insertion. + newFiber.flags = Placement; + return lastPlacedIndex; + } + } + + function placeSingleChild(newFiber) { + // This is simpler for the single child case. We only need to do a + // placement for inserting new children. + if (shouldTrackSideEffects && newFiber.alternate === null) { + newFiber.flags = Placement; + } + + return newFiber; + } + + function updateTextNode(returnFiber, current, textContent, lanes) { + if (current === null || current.tag !== HostText) { + // Insert + var created = createFiberFromText(textContent, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, textContent); + existing.return = returnFiber; + return existing; + } + } + + function updateElement(returnFiber, current, element, lanes) { + if (current !== null) { + if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(current, element) )) { + // Move based on index + var existing = useFiber(current, element.props); + existing.ref = coerceRef(returnFiber, current, element); + existing.return = returnFiber; + + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } + + return existing; + } + } // Insert + + + var created = createFiberFromElement(element, returnFiber.mode, lanes); + created.ref = coerceRef(returnFiber, current, element); + created.return = returnFiber; + return created; + } + + function updatePortal(returnFiber, current, portal, lanes) { + if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) { + // Insert + var created = createFiberFromPortal(portal, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, portal.children || []); + existing.return = returnFiber; + return existing; + } + } + + function updateFragment(returnFiber, current, fragment, lanes, key) { + if (current === null || current.tag !== Fragment) { + // Insert + var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, fragment); + existing.return = returnFiber; + return existing; + } + } + + function createChild(returnFiber, newChild, lanes) { + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys. If the previous node is implicitly keyed + // we can continue to replace it without aborting even if it is not a text + // node. + var created = createFiberFromText('' + newChild, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var _created = createFiberFromElement(newChild, returnFiber.mode, lanes); + + _created.ref = coerceRef(returnFiber, null, newChild); + _created.return = returnFiber; + return _created; + } + + case REACT_PORTAL_TYPE: + { + var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes); + + _created2.return = returnFiber; + return _created2; + } + } + + if (isArray$1(newChild) || getIteratorFn(newChild)) { + var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null); + + _created3.return = returnFiber; + return _created3; + } + + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + return null; + } + + function updateSlot(returnFiber, oldFiber, newChild, lanes) { + // Update the fiber if the keys match, otherwise return null. + var key = oldFiber !== null ? oldFiber.key : null; + + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys. If the previous node is implicitly keyed + // we can continue to replace it without aborting even if it is not a text + // node. + if (key !== null) { + return null; + } + + return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes); + } + + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + if (newChild.key === key) { + if (newChild.type === REACT_FRAGMENT_TYPE) { + return updateFragment(returnFiber, oldFiber, newChild.props.children, lanes, key); + } + + return updateElement(returnFiber, oldFiber, newChild, lanes); + } else { + return null; + } + } + + case REACT_PORTAL_TYPE: + { + if (newChild.key === key) { + return updatePortal(returnFiber, oldFiber, newChild, lanes); + } else { + return null; + } + } + } + + if (isArray$1(newChild) || getIteratorFn(newChild)) { + if (key !== null) { + return null; + } + + return updateFragment(returnFiber, oldFiber, newChild, lanes, null); + } + + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + return null; + } + + function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) { + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys, so we neither have to check the old nor + // new node for the key. If both are text nodes, they match. + var matchedFiber = existingChildren.get(newIdx) || null; + return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes); + } + + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + + if (newChild.type === REACT_FRAGMENT_TYPE) { + return updateFragment(returnFiber, _matchedFiber, newChild.props.children, lanes, newChild.key); + } + + return updateElement(returnFiber, _matchedFiber, newChild, lanes); + } + + case REACT_PORTAL_TYPE: + { + var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + + return updatePortal(returnFiber, _matchedFiber2, newChild, lanes); + } + + } + + if (isArray$1(newChild) || getIteratorFn(newChild)) { + var _matchedFiber3 = existingChildren.get(newIdx) || null; + + return updateFragment(returnFiber, _matchedFiber3, newChild, lanes, null); + } + + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + return null; + } + /** + * Warns if there is a duplicate or missing key + */ + + + function warnOnInvalidKey(child, knownKeys, returnFiber) { + { + if (typeof child !== 'object' || child === null) { + return knownKeys; + } + + switch (child.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + warnForMissingKey(child, returnFiber); + var key = child.key; + + if (typeof key !== 'string') { + break; + } + + if (knownKeys === null) { + knownKeys = new Set(); + knownKeys.add(key); + break; + } + + if (!knownKeys.has(key)) { + knownKeys.add(key); + break; + } + + error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key); + + break; + } + } + + return knownKeys; + } + + function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) { + // This algorithm can't optimize by searching from both ends since we + // don't have backpointers on fibers. I'm trying to see how far we can get + // with that model. If it ends up not being worth the tradeoffs, we can + // add it later. + // Even with a two ended optimization, we'd want to optimize for the case + // where there are few changes and brute force the comparison instead of + // going for the Map. It'd like to explore hitting that path first in + // forward-only mode and only go for the Map once we notice that we need + // lots of look ahead. This doesn't handle reversal as well as two ended + // search but that's unusual. Besides, for the two ended optimization to + // work on Iterables, we'd need to copy the whole set. + // In this first iteration, we'll just live with hitting the bad case + // (adding everything to a Map) in for every insert/move. + // If you change this code, also update reconcileChildrenIterator() which + // uses the same algorithm. + { + // First, validate keys. + var knownKeys = null; + + for (var i = 0; i < newChildren.length; i++) { + var child = newChildren[i]; + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber); + } + } + + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + + for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } + + var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes); + + if (newFiber === null) { + // TODO: This breaks on empty slots like null children. That's + // unfortunate because it triggers the slow path all the time. We need + // a better way to communicate whether this was a miss or null, + // boolean, undefined, etc. + if (oldFiber === null) { + oldFiber = nextOldFiber; + } + + break; + } + + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + // We matched the slot, but we didn't reuse the existing fiber, so we + // need to delete the existing child. + deleteChild(returnFiber, oldFiber); + } + } + + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = newFiber; + } else { + // TODO: Defer siblings if we're not at the right index for this slot. + // I.e. if we had null values before, then we want to defer this + // for each null value. However, we also don't want to call updateSlot + // with the previous one. + previousNewFiber.sibling = newFiber; + } + + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } + + if (newIdx === newChildren.length) { + // We've reached the end of the new children. We can delete the rest. + deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; + } + + if (oldFiber === null) { + // If we don't have any more existing children we can choose a fast path + // since the rest will all be insertions. + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes); + + if (_newFiber === null) { + continue; + } + + lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = _newFiber; + } else { + previousNewFiber.sibling = _newFiber; + } + + previousNewFiber = _newFiber; + } + + return resultingFirstChild; + } // Add all children to a key map for quick lookups. + + + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes); + + if (_newFiber2 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber2.alternate !== null) { + // The new fiber is a work in progress, but if there exists a + // current, that means that we reused the fiber. We need to delete + // it from the child list so that we don't add it to the deletion + // list. + existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key); + } + } + + lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + resultingFirstChild = _newFiber2; + } else { + previousNewFiber.sibling = _newFiber2; + } + + previousNewFiber = _newFiber2; + } + } + + if (shouldTrackSideEffects) { + // Any existing children that weren't consumed above were deleted. We need + // to add them to the deletion list. + existingChildren.forEach(function (child) { + return deleteChild(returnFiber, child); + }); + } + + return resultingFirstChild; + } + + function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) { + // This is the same implementation as reconcileChildrenArray(), + // but using the iterator instead. + var iteratorFn = getIteratorFn(newChildrenIterable); + + if (!(typeof iteratorFn === 'function')) { + { + throw Error( "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + { + // We don't support rendering Generators because it's a mutation. + // See https://github.com/facebook/react/issues/12995 + if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag + newChildrenIterable[Symbol.toStringTag] === 'Generator') { + if (!didWarnAboutGenerators) { + error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.'); + } + + didWarnAboutGenerators = true; + } // Warn about using Maps as children + + + if (newChildrenIterable.entries === iteratorFn) { + if (!didWarnAboutMaps) { + error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } // First, validate keys. + // We'll get a different iterator later for the main pass. + + + var _newChildren = iteratorFn.call(newChildrenIterable); + + if (_newChildren) { + var knownKeys = null; + + var _step = _newChildren.next(); + + for (; !_step.done; _step = _newChildren.next()) { + var child = _step.value; + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber); + } + } + } + + var newChildren = iteratorFn.call(newChildrenIterable); + + if (!(newChildren != null)) { + { + throw Error( "An iterable object provided no iterator." ); + } + } + + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + var step = newChildren.next(); + + for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } + + var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes); + + if (newFiber === null) { + // TODO: This breaks on empty slots like null children. That's + // unfortunate because it triggers the slow path all the time. We need + // a better way to communicate whether this was a miss or null, + // boolean, undefined, etc. + if (oldFiber === null) { + oldFiber = nextOldFiber; + } + + break; + } + + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + // We matched the slot, but we didn't reuse the existing fiber, so we + // need to delete the existing child. + deleteChild(returnFiber, oldFiber); + } + } + + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = newFiber; + } else { + // TODO: Defer siblings if we're not at the right index for this slot. + // I.e. if we had null values before, then we want to defer this + // for each null value. However, we also don't want to call updateSlot + // with the previous one. + previousNewFiber.sibling = newFiber; + } + + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } + + if (step.done) { + // We've reached the end of the new children. We can delete the rest. + deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; + } + + if (oldFiber === null) { + // If we don't have any more existing children we can choose a fast path + // since the rest will all be insertions. + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber3 = createChild(returnFiber, step.value, lanes); + + if (_newFiber3 === null) { + continue; + } + + lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = _newFiber3; + } else { + previousNewFiber.sibling = _newFiber3; + } + + previousNewFiber = _newFiber3; + } + + return resultingFirstChild; + } // Add all children to a key map for quick lookups. + + + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes); + + if (_newFiber4 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber4.alternate !== null) { + // The new fiber is a work in progress, but if there exists a + // current, that means that we reused the fiber. We need to delete + // it from the child list so that we don't add it to the deletion + // list. + existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key); + } + } + + lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + resultingFirstChild = _newFiber4; + } else { + previousNewFiber.sibling = _newFiber4; + } + + previousNewFiber = _newFiber4; + } + } + + if (shouldTrackSideEffects) { + // Any existing children that weren't consumed above were deleted. We need + // to add them to the deletion list. + existingChildren.forEach(function (child) { + return deleteChild(returnFiber, child); + }); + } + + return resultingFirstChild; + } + + function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) { + // There's no need to check for keys on text nodes since we don't have a + // way to define them. + if (currentFirstChild !== null && currentFirstChild.tag === HostText) { + // We already have an existing node so let's just update it and delete + // the rest. + deleteRemainingChildren(returnFiber, currentFirstChild.sibling); + var existing = useFiber(currentFirstChild, textContent); + existing.return = returnFiber; + return existing; + } // The existing first child is not a text node so we need to create one + // and delete the existing ones. + + + deleteRemainingChildren(returnFiber, currentFirstChild); + var created = createFiberFromText(textContent, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + + function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) { + var key = element.key; + var child = currentFirstChild; + + while (child !== null) { + // TODO: If key === null and child.key === null, then this only applies to + // the first item in the list. + if (child.key === key) { + switch (child.tag) { + case Fragment: + { + if (element.type === REACT_FRAGMENT_TYPE) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, element.props.children); + existing.return = returnFiber; + + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } + + return existing; + } + + break; + } + + case Block: + + // We intentionally fallthrough here if enableBlocksAPI is not on. + // eslint-disable-next-lined no-fallthrough + + default: + { + if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(child, element) )) { + deleteRemainingChildren(returnFiber, child.sibling); + + var _existing3 = useFiber(child, element.props); + + _existing3.ref = coerceRef(returnFiber, child, element); + _existing3.return = returnFiber; + + { + _existing3._debugSource = element._source; + _existing3._debugOwner = element._owner; + } + + return _existing3; + } + + break; + } + } // Didn't match. + + + deleteRemainingChildren(returnFiber, child); + break; + } else { + deleteChild(returnFiber, child); + } + + child = child.sibling; + } + + if (element.type === REACT_FRAGMENT_TYPE) { + var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key); + created.return = returnFiber; + return created; + } else { + var _created4 = createFiberFromElement(element, returnFiber.mode, lanes); + + _created4.ref = coerceRef(returnFiber, currentFirstChild, element); + _created4.return = returnFiber; + return _created4; + } + } + + function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) { + var key = portal.key; + var child = currentFirstChild; + + while (child !== null) { + // TODO: If key === null and child.key === null, then this only applies to + // the first item in the list. + if (child.key === key) { + if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, portal.children || []); + existing.return = returnFiber; + return existing; + } else { + deleteRemainingChildren(returnFiber, child); + break; + } + } else { + deleteChild(returnFiber, child); + } + + child = child.sibling; + } + + var created = createFiberFromPortal(portal, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } // This API will tag the children with the side-effect of the reconciliation + // itself. They will be added to the side-effect list as we pass through the + // children and the parent. + + + function reconcileChildFibers(returnFiber, currentFirstChild, newChild, lanes) { + // This function is not recursive. + // If the top level item is an array, we treat it as a set of children, + // not as a fragment. Nested arrays on the other hand will be treated as + // fragment nodes. Recursion happens at the normal flow. + // Handle top level unkeyed fragments as if they were arrays. + // This leads to an ambiguity between <>{[...]}</> and <>...</>. + // We treat the ambiguous cases above the same. + var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null; + + if (isUnkeyedTopLevelFragment) { + newChild = newChild.props.children; + } // Handle object types + + + var isObject = typeof newChild === 'object' && newChild !== null; + + if (isObject) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes)); + + case REACT_PORTAL_TYPE: + return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes)); + + } + } + + if (typeof newChild === 'string' || typeof newChild === 'number') { + return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, lanes)); + } + + if (isArray$1(newChild)) { + return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes); + } + + if (getIteratorFn(newChild)) { + return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes); + } + + if (isObject) { + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) { + // If the new child is undefined, and the return fiber is a composite + // component, throw an error. If Fiber return types are disabled, + // we already threw above. + switch (returnFiber.tag) { + case ClassComponent: + { + { + var instance = returnFiber.stateNode; + + if (instance.render._isMockFunction) { + // We allow auto-mocks to proceed as if they're returning null. + break; + } + } + } + // Intentionally fall through to the next case, which handles both + // functions and classes + // eslint-disable-next-lined no-fallthrough + + case Block: + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + { + { + { + throw Error( (getComponentName(returnFiber.type) || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null." ); + } + } + } + } + } // Remaining cases are all treated as empty. + + + return deleteRemainingChildren(returnFiber, currentFirstChild); + } + + return reconcileChildFibers; +} + +var reconcileChildFibers = ChildReconciler(true); +var mountChildFibers = ChildReconciler(false); +function cloneChildFibers(current, workInProgress) { + if (!(current === null || workInProgress.child === current.child)) { + { + throw Error( "Resuming work not yet implemented." ); + } + } + + if (workInProgress.child === null) { + return; + } + + var currentChild = workInProgress.child; + var newChild = createWorkInProgress(currentChild, currentChild.pendingProps); + workInProgress.child = newChild; + newChild.return = workInProgress; + + while (currentChild.sibling !== null) { + currentChild = currentChild.sibling; + newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps); + newChild.return = workInProgress; + } + + newChild.sibling = null; +} // Reset a workInProgress child set to prepare it for a second pass. + +function resetChildFibers(workInProgress, lanes) { + var child = workInProgress.child; + + while (child !== null) { + resetWorkInProgress(child, lanes); + child = child.sibling; + } +} + +var NO_CONTEXT = {}; +var contextStackCursor$1 = createCursor(NO_CONTEXT); +var contextFiberStackCursor = createCursor(NO_CONTEXT); +var rootInstanceStackCursor = createCursor(NO_CONTEXT); + +function requiredContext(c) { + if (!(c !== NO_CONTEXT)) { + { + throw Error( "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + return c; +} + +function getRootHostContainer() { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + return rootInstance; +} + +function pushHostContainer(fiber, nextRootInstance) { + // Push current root instance onto the stack; + // This allows us to reset root when portals are popped. + push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it. + // This enables us to pop only Fibers that provide unique contexts. + + push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack. + // However, we can't just call getRootHostContext() and push it because + // we'd have a different number of entries on the stack depending on + // whether getRootHostContext() throws somewhere in renderer code or not. + // So we push an empty value first. This lets us safely unwind on errors. + + push(contextStackCursor$1, NO_CONTEXT, fiber); + var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it. + + pop(contextStackCursor$1, fiber); + push(contextStackCursor$1, nextRootContext, fiber); +} + +function popHostContainer(fiber) { + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); + pop(rootInstanceStackCursor, fiber); +} + +function getHostContext() { + var context = requiredContext(contextStackCursor$1.current); + return context; +} + +function pushHostContext(fiber) { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + var context = requiredContext(contextStackCursor$1.current); + var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique. + + if (context === nextContext) { + return; + } // Track the context and the Fiber that provided it. + // This enables us to pop only Fibers that provide unique contexts. + + + push(contextFiberStackCursor, fiber, fiber); + push(contextStackCursor$1, nextContext, fiber); +} + +function popHostContext(fiber) { + // Do not pop unless this Fiber provided the current context. + // pushHostContext() only pushes Fibers that provide unique contexts. + if (contextFiberStackCursor.current !== fiber) { + return; + } + + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); +} + +var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is +// inherited deeply down the subtree. The upper bits only affect +// this immediate suspense boundary and gets reset each new +// boundary or suspense list. + +var SubtreeSuspenseContextMask = 1; // Subtree Flags: +// InvisibleParentSuspenseContext indicates that one of our parent Suspense +// boundaries is not currently showing visible main content. +// Either because it is already showing a fallback or is not mounted at all. +// We can use this to determine if it is desirable to trigger a fallback at +// the parent. If not, then we might need to trigger undesirable boundaries +// and/or suspend the commit to avoid hiding the parent content. + +var InvisibleParentSuspenseContext = 1; // Shallow Flags: +// ForceSuspenseFallback can be used by SuspenseList to force newly added +// items into their fallback state during one of the render passes. + +var ForceSuspenseFallback = 2; +var suspenseStackCursor = createCursor(DefaultSuspenseContext); +function hasSuspenseContext(parentContext, flag) { + return (parentContext & flag) !== 0; +} +function setDefaultShallowSuspenseContext(parentContext) { + return parentContext & SubtreeSuspenseContextMask; +} +function setShallowSuspenseContext(parentContext, shallowContext) { + return parentContext & SubtreeSuspenseContextMask | shallowContext; +} +function addSubtreeSuspenseContext(parentContext, subtreeContext) { + return parentContext | subtreeContext; +} +function pushSuspenseContext(fiber, newContext) { + push(suspenseStackCursor, newContext, fiber); +} +function popSuspenseContext(fiber) { + pop(suspenseStackCursor, fiber); +} + +function shouldCaptureSuspense(workInProgress, hasInvisibleParent) { + // If it was the primary children that just suspended, capture and render the + // fallback. Otherwise, don't capture and bubble to the next boundary. + var nextState = workInProgress.memoizedState; + + if (nextState !== null) { + if (nextState.dehydrated !== null) { + // A dehydrated boundary always captures. + return true; + } + + return false; + } + + var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop. + + if (props.fallback === undefined) { + return false; + } // Regular boundaries always capture. + + + if (props.unstable_avoidThisFallback !== true) { + return true; + } // If it's a boundary we should avoid, then we prefer to bubble up to the + // parent boundary if it is currently invisible. + + + if (hasInvisibleParent) { + return false; + } // If the parent is not able to handle it, we must handle it. + + + return true; +} +function findFirstSuspended(row) { + var node = row; + + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + + if (state !== null) { + var dehydrated = state.dehydrated; + + if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) { + return node; + } + } + } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't + // keep track of whether it suspended or not. + node.memoizedProps.revealOrder !== undefined) { + var didSuspend = (node.flags & DidCapture) !== NoFlags; + + if (didSuspend) { + return node; + } + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === row) { + return null; + } + + while (node.sibling === null) { + if (node.return === null || node.return === row) { + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + + return null; +} + +var NoFlags$1 = +/* */ +0; // Represents whether effect should fire. + +var HasEffect = +/* */ +1; // Represents the phase in which the effect (not the clean-up) fires. + +var Layout = +/* */ +2; +var Passive$1 = +/* */ +4; + +// This may have been an insertion or a hydration. + +var hydrationParentFiber = null; +var nextHydratableInstance = null; +var isHydrating = false; + +function enterHydrationState(fiber) { + + var parentInstance = fiber.stateNode.containerInfo; + nextHydratableInstance = getFirstHydratableChild(parentInstance); + hydrationParentFiber = fiber; + isHydrating = true; + return true; +} + +function deleteHydratableInstance(returnFiber, instance) { + { + switch (returnFiber.tag) { + case HostRoot: + didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance); + break; + + case HostComponent: + didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance); + break; + } + } + + var childToDelete = createFiberFromHostInstanceForDeletion(); + childToDelete.stateNode = instance; + childToDelete.return = returnFiber; + childToDelete.flags = Deletion; // This might seem like it belongs on progressedFirstDeletion. However, + // these children are not part of the reconciliation list of children. + // Even if we abort and rereconcile the children, that will try to hydrate + // again and the nodes are still in the host tree so these will be + // recreated. + + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = childToDelete; + returnFiber.lastEffect = childToDelete; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; + } +} + +function insertNonHydratedInstance(returnFiber, fiber) { + fiber.flags = fiber.flags & ~Hydrating | Placement; + + { + switch (returnFiber.tag) { + case HostRoot: + { + var parentContainer = returnFiber.stateNode.containerInfo; + + switch (fiber.tag) { + case HostComponent: + var type = fiber.type; + var props = fiber.pendingProps; + didNotFindHydratableContainerInstance(parentContainer, type); + break; + + case HostText: + var text = fiber.pendingProps; + didNotFindHydratableContainerTextInstance(parentContainer, text); + break; + } + + break; + } + + case HostComponent: + { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + + switch (fiber.tag) { + case HostComponent: + var _type = fiber.type; + var _props = fiber.pendingProps; + didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type); + break; + + case HostText: + var _text = fiber.pendingProps; + didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text); + break; + + case SuspenseComponent: + didNotFindHydratableSuspenseInstance(parentType, parentProps); + break; + } + + break; + } + + default: + return; + } + } +} + +function tryHydrate(fiber, nextInstance) { + switch (fiber.tag) { + case HostComponent: + { + var type = fiber.type; + var props = fiber.pendingProps; + var instance = canHydrateInstance(nextInstance, type); + + if (instance !== null) { + fiber.stateNode = instance; + return true; + } + + return false; + } + + case HostText: + { + var text = fiber.pendingProps; + var textInstance = canHydrateTextInstance(nextInstance, text); + + if (textInstance !== null) { + fiber.stateNode = textInstance; + return true; + } + + return false; + } + + case SuspenseComponent: + { + + return false; + } + + default: + return false; + } +} + +function tryToClaimNextHydratableInstance(fiber) { + if (!isHydrating) { + return; + } + + var nextInstance = nextHydratableInstance; + + if (!nextInstance) { + // Nothing to hydrate. Make it an insertion. + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } + + var firstAttemptedInstance = nextInstance; + + if (!tryHydrate(fiber, nextInstance)) { + // If we can't hydrate this instance let's try the next one. + // We use this as a heuristic. It's based on intuition and not data so it + // might be flawed or unnecessary. + nextInstance = getNextHydratableSibling(firstAttemptedInstance); + + if (!nextInstance || !tryHydrate(fiber, nextInstance)) { + // Nothing to hydrate. Make it an insertion. + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } // We matched the next one, we'll now assume that the first one was + // superfluous and we'll delete it. Since we can't eagerly delete it + // we'll have to schedule a deletion. To do that, this node needs a dummy + // fiber associated with it. + + + deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance); + } + + hydrationParentFiber = fiber; + nextHydratableInstance = getFirstHydratableChild(nextInstance); +} + +function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) { + + var instance = fiber.stateNode; + var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component. + + fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there + // is a new ref we mark this as an update. + + if (updatePayload !== null) { + return true; + } + + return false; +} + +function prepareToHydrateHostTextInstance(fiber) { + + var textInstance = fiber.stateNode; + var textContent = fiber.memoizedProps; + var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber); + + { + if (shouldUpdate) { + // We assume that prepareToHydrateHostTextInstance is called in a context where the + // hydration parent is the parent host component of this host text. + var returnFiber = hydrationParentFiber; + + if (returnFiber !== null) { + switch (returnFiber.tag) { + case HostRoot: + { + var parentContainer = returnFiber.stateNode.containerInfo; + didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent); + break; + } + + case HostComponent: + { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent); + break; + } + } + } + } + } + + return shouldUpdate; +} + +function skipPastDehydratedSuspenseInstance(fiber) { + + var suspenseState = fiber.memoizedState; + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; + + if (!suspenseInstance) { + { + throw Error( "Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance); +} + +function popToNextHostParent(fiber) { + var parent = fiber.return; + + while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) { + parent = parent.return; + } + + hydrationParentFiber = parent; +} + +function popHydrationState(fiber) { + + if (fiber !== hydrationParentFiber) { + // We're deeper than the current hydration context, inside an inserted + // tree. + return false; + } + + if (!isHydrating) { + // If we're not currently hydrating but we're in a hydration context, then + // we were an insertion and now need to pop up reenter hydration of our + // siblings. + popToNextHostParent(fiber); + isHydrating = true; + return false; + } + + var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now. + // We only do this deeper than head and body since they tend to have random + // other nodes in them. We also ignore components with pure text content in + // side of them. + // TODO: Better heuristic. + + if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) { + var nextInstance = nextHydratableInstance; + + while (nextInstance) { + deleteHydratableInstance(fiber, nextInstance); + nextInstance = getNextHydratableSibling(nextInstance); + } + } + + popToNextHostParent(fiber); + + if (fiber.tag === SuspenseComponent) { + nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber); + } else { + nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null; + } + + return true; +} + +function resetHydrationState() { + + hydrationParentFiber = null; + nextHydratableInstance = null; + isHydrating = false; +} + +function getIsHydrating() { + return isHydrating; +} + +// and should be reset before starting a new render. +// This tracks which mutable sources need to be reset after a render. + +var workInProgressSources = []; +var rendererSigil$1; + +{ + // Used to detect multiple renderers using the same mutable source. + rendererSigil$1 = {}; +} + +function markSourceAsDirty(mutableSource) { + workInProgressSources.push(mutableSource); +} +function resetWorkInProgressVersions() { + for (var i = 0; i < workInProgressSources.length; i++) { + var mutableSource = workInProgressSources[i]; + + { + mutableSource._workInProgressVersionPrimary = null; + } + } + + workInProgressSources.length = 0; +} +function getWorkInProgressVersion(mutableSource) { + { + return mutableSource._workInProgressVersionPrimary; + } +} +function setWorkInProgressVersion(mutableSource, version) { + { + mutableSource._workInProgressVersionPrimary = version; + } + + workInProgressSources.push(mutableSource); +} +function warnAboutMultipleRenderersDEV(mutableSource) { + { + { + if (mutableSource._currentPrimaryRenderer == null) { + mutableSource._currentPrimaryRenderer = rendererSigil$1; + } else if (mutableSource._currentPrimaryRenderer !== rendererSigil$1) { + error('Detected multiple renderers concurrently rendering the ' + 'same mutable source. This is currently unsupported.'); + } + } + } +} // Eager reads the version of a mutable source and stores it on the root. + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, + ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; +var didWarnAboutMismatchedHooksForComponent; +var didWarnAboutUseOpaqueIdentifier; + +{ + didWarnAboutUseOpaqueIdentifier = {}; + didWarnAboutMismatchedHooksForComponent = new Set(); +} + +// These are set right before calling the component. +var renderLanes = NoLanes; // The work-in-progress fiber. I've named it differently to distinguish it from +// the work-in-progress hook. + +var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The +// current hook list is the list that belongs to the current fiber. The +// work-in-progress hook list is a new list that will be added to the +// work-in-progress fiber. + +var currentHook = null; +var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This +// does not get reset if we do another render pass; only when we're completely +// finished evaluating this component. This is an optimization so we know +// whether we need to clear render phase updates after a throw. + +var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only during the current render pass. This +// gets reset after each attempt. +// TODO: Maybe there's some way to consolidate this with +// `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`. + +var didScheduleRenderPhaseUpdateDuringThisPass = false; +var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook + +var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders. +// The list stores the order of hooks used during the initial render (mount). +// Subsequent renders (updates) reference this list. + +var hookTypesDev = null; +var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore +// the dependencies for Hooks that need them (e.g. useEffect or useMemo). +// When true, such Hooks will always be "remounted". Only used during hot reload. + +var ignorePreviousDependencies = false; + +function mountHookTypesDev() { + { + var hookName = currentHookNameInDev; + + if (hookTypesDev === null) { + hookTypesDev = [hookName]; + } else { + hookTypesDev.push(hookName); + } + } +} + +function updateHookTypesDev() { + { + var hookName = currentHookNameInDev; + + if (hookTypesDev !== null) { + hookTypesUpdateIndexDev++; + + if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) { + warnOnHookMismatchInDev(hookName); + } + } + } +} + +function checkDepsAreArrayDev(deps) { + { + if (deps !== undefined && deps !== null && !Array.isArray(deps)) { + // Verify deps, but only on mount to avoid extra checks. + // It's unlikely their type would change as usually you define them inline. + error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps); + } + } +} + +function warnOnHookMismatchInDev(currentHookName) { + { + var componentName = getComponentName(currentlyRenderingFiber$1.type); + + if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) { + didWarnAboutMismatchedHooksForComponent.add(componentName); + + if (hookTypesDev !== null) { + var table = ''; + var secondColumnStart = 30; + + for (var i = 0; i <= hookTypesUpdateIndexDev; i++) { + var oldHookName = hookTypesDev[i]; + var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName; + var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up + // lol @ IE not supporting String#repeat + + while (row.length < secondColumnStart) { + row += ' '; + } + + row += newHookName + '\n'; + table += row; + } + + error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks\n\n' + ' Previous render Next render\n' + ' ------------------------------------------------------\n' + '%s' + ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table); + } + } + } +} + +function throwInvalidHookError() { + { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); + } + } +} + +function areHookInputsEqual(nextDeps, prevDeps) { + { + if (ignorePreviousDependencies) { + // Only true when this component is being hot reloaded. + return false; + } + } + + if (prevDeps === null) { + { + error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev); + } + + return false; + } + + { + // Don't bother comparing lengths in prod because these arrays should be + // passed inline. + if (nextDeps.length !== prevDeps.length) { + error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]"); + } + } + + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { + if (objectIs(nextDeps[i], prevDeps[i])) { + continue; + } + + return false; + } + + return true; +} + +function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) { + renderLanes = nextRenderLanes; + currentlyRenderingFiber$1 = workInProgress; + + { + hookTypesDev = current !== null ? current._debugHookTypes : null; + hookTypesUpdateIndexDev = -1; // Used for hot reloading: + + ignorePreviousDependencies = current !== null && current.type !== workInProgress.type; + } + + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; + workInProgress.lanes = NoLanes; // The following should have already been reset + // currentHook = null; + // workInProgressHook = null; + // didScheduleRenderPhaseUpdate = false; + // TODO Warn if no hooks are used at all during mount, then some are used during update. + // Currently we will identify the update render as a mount because memoizedState === null. + // This is tricky because it's valid for certain types of components (e.g. React.lazy) + // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used. + // Non-stateful hooks (e.g. context) don't get added to memoizedState, + // so memoizedState would be null during updates and mounts. + + { + if (current !== null && current.memoizedState !== null) { + ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV; + } else if (hookTypesDev !== null) { + // This dispatcher handles an edge case where a component is updating, + // but no stateful hooks have been used. + // We want to match the production code behavior (which will use HooksDispatcherOnMount), + // but with the extra DEV validation to ensure hooks ordering hasn't changed. + // This dispatcher does that. + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV; + } else { + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV; + } + } + + var children = Component(props, secondArg); // Check if there was a render phase update + + if (didScheduleRenderPhaseUpdateDuringThisPass) { + // Keep rendering in a loop for as long as render phase updates continue to + // be scheduled. Use a counter to prevent infinite loops. + var numberOfReRenders = 0; + + do { + didScheduleRenderPhaseUpdateDuringThisPass = false; + + if (!(numberOfReRenders < RE_RENDER_LIMIT)) { + { + throw Error( "Too many re-renders. React limits the number of renders to prevent an infinite loop." ); + } + } + + numberOfReRenders += 1; + + { + // Even when hot reloading, allow dependencies to stabilize + // after first render to prevent infinite render phase updates. + ignorePreviousDependencies = false; + } // Start over from the beginning of the list + + + currentHook = null; + workInProgressHook = null; + workInProgress.updateQueue = null; + + { + // Also validate hook order for cascading updates. + hookTypesUpdateIndexDev = -1; + } + + ReactCurrentDispatcher$1.current = HooksDispatcherOnRerenderInDEV ; + children = Component(props, secondArg); + } while (didScheduleRenderPhaseUpdateDuringThisPass); + } // We can assume the previous dispatcher is always this one, since we set it + // at the beginning of the render phase and there's no re-entrancy. + + + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; + + { + workInProgress._debugHookTypes = hookTypesDev; + } // This check uses currentHook so that it works the same in DEV and prod bundles. + // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles. + + + var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null; + renderLanes = NoLanes; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; + + { + currentHookNameInDev = null; + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + } + + didScheduleRenderPhaseUpdate = false; + + if (!!didRenderTooFewHooks) { + { + throw Error( "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." ); + } + } + + return children; +} +function bailoutHooks(current, workInProgress, lanes) { + workInProgress.updateQueue = current.updateQueue; + workInProgress.flags &= ~(Passive | Update); + current.lanes = removeLanes(current.lanes, lanes); +} +function resetHooksAfterThrow() { + // We can assume the previous dispatcher is always this one, since we set it + // at the beginning of the render phase and there's no re-entrancy. + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; + + if (didScheduleRenderPhaseUpdate) { + // There were render phase updates. These are only valid for this render + // phase, which we are now aborting. Remove the updates from the queues so + // they do not persist to the next render. Do not remove updates from hooks + // that weren't processed. + // + // Only reset the updates from the queue if it has a clone. If it does + // not have a clone, that means it wasn't processed, and the updates were + // scheduled before we entered the render phase. + var hook = currentlyRenderingFiber$1.memoizedState; + + while (hook !== null) { + var queue = hook.queue; + + if (queue !== null) { + queue.pending = null; + } + + hook = hook.next; + } + + didScheduleRenderPhaseUpdate = false; + } + + renderLanes = NoLanes; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; + + { + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + currentHookNameInDev = null; + isUpdatingOpaqueValueInRenderPhase = false; + } + + didScheduleRenderPhaseUpdateDuringThisPass = false; +} + +function mountWorkInProgressHook() { + var hook = { + memoizedState: null, + baseState: null, + baseQueue: null, + queue: null, + next: null + }; + + if (workInProgressHook === null) { + // This is the first hook in the list + currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook; + } else { + // Append to the end of the list + workInProgressHook = workInProgressHook.next = hook; + } + + return workInProgressHook; +} + +function updateWorkInProgressHook() { + // This function is used both for updates and for re-renders triggered by a + // render phase update. It assumes there is either a current hook we can + // clone, or a work-in-progress hook from a previous render pass that we can + // use as a base. When we reach the end of the base list, we must switch to + // the dispatcher used for mounts. + var nextCurrentHook; + + if (currentHook === null) { + var current = currentlyRenderingFiber$1.alternate; + + if (current !== null) { + nextCurrentHook = current.memoizedState; + } else { + nextCurrentHook = null; + } + } else { + nextCurrentHook = currentHook.next; + } + + var nextWorkInProgressHook; + + if (workInProgressHook === null) { + nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState; + } else { + nextWorkInProgressHook = workInProgressHook.next; + } + + if (nextWorkInProgressHook !== null) { + // There's already a work-in-progress. Reuse it. + workInProgressHook = nextWorkInProgressHook; + nextWorkInProgressHook = workInProgressHook.next; + currentHook = nextCurrentHook; + } else { + // Clone from the current hook. + if (!(nextCurrentHook !== null)) { + { + throw Error( "Rendered more hooks than during the previous render." ); + } + } + + currentHook = nextCurrentHook; + var newHook = { + memoizedState: currentHook.memoizedState, + baseState: currentHook.baseState, + baseQueue: currentHook.baseQueue, + queue: currentHook.queue, + next: null + }; + + if (workInProgressHook === null) { + // This is the first hook in the list. + currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook; + } else { + // Append to the end of the list. + workInProgressHook = workInProgressHook.next = newHook; + } + } + + return workInProgressHook; +} + +function createFunctionComponentUpdateQueue() { + return { + lastEffect: null + }; +} + +function basicStateReducer(state, action) { + // $FlowFixMe: Flow doesn't like mixed types + return typeof action === 'function' ? action(state) : action; +} + +function mountReducer(reducer, initialArg, init) { + var hook = mountWorkInProgressHook(); + var initialState; + + if (init !== undefined) { + initialState = init(initialArg); + } else { + initialState = initialArg; + } + + hook.memoizedState = hook.baseState = initialState; + var queue = hook.queue = { + pending: null, + dispatch: null, + lastRenderedReducer: reducer, + lastRenderedState: initialState + }; + var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; +} + +function updateReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + + if (!(queue !== null)) { + { + throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." ); + } + } + + queue.lastRenderedReducer = reducer; + var current = currentHook; // The last rebase update that is NOT part of the base state. + + var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet. + + var pendingQueue = queue.pending; + + if (pendingQueue !== null) { + // We have new updates that haven't been processed yet. + // We'll add them to the base queue. + if (baseQueue !== null) { + // Merge the pending queue and the base queue. + var baseFirst = baseQueue.next; + var pendingFirst = pendingQueue.next; + baseQueue.next = pendingFirst; + pendingQueue.next = baseFirst; + } + + { + if (current.baseQueue !== baseQueue) { + // Internal invariant that should never happen, but feasibly could in + // the future if we implement resuming, or some form of that. + error('Internal error: Expected work-in-progress queue to be a clone. ' + 'This is a bug in React.'); + } + } + + current.baseQueue = baseQueue = pendingQueue; + queue.pending = null; + } + + if (baseQueue !== null) { + // We have a queue to process. + var first = baseQueue.next; + var newState = current.baseState; + var newBaseState = null; + var newBaseQueueFirst = null; + var newBaseQueueLast = null; + var update = first; + + do { + var updateLane = update.lane; + + if (!isSubsetOfLanes(renderLanes, updateLane)) { + // Priority is insufficient. Skip this update. If this is the first + // skipped update, the previous update/state is the new base + // update/state. + var clone = { + lane: updateLane, + action: update.action, + eagerReducer: update.eagerReducer, + eagerState: update.eagerState, + next: null + }; + + if (newBaseQueueLast === null) { + newBaseQueueFirst = newBaseQueueLast = clone; + newBaseState = newState; + } else { + newBaseQueueLast = newBaseQueueLast.next = clone; + } // Update the remaining priority in the queue. + // TODO: Don't need to accumulate this. Instead, we can remove + // renderLanes from the original lanes. + + + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane); + markSkippedUpdateLanes(updateLane); + } else { + // This update does have sufficient priority. + if (newBaseQueueLast !== null) { + var _clone = { + // This update is going to be committed so we never want uncommit + // it. Using NoLane works because 0 is a subset of all bitmasks, so + // this will never be skipped by the check above. + lane: NoLane, + action: update.action, + eagerReducer: update.eagerReducer, + eagerState: update.eagerState, + next: null + }; + newBaseQueueLast = newBaseQueueLast.next = _clone; + } // Process this update. + + + if (update.eagerReducer === reducer) { + // If this update was processed eagerly, and its reducer matches the + // current reducer, we can use the eagerly computed state. + newState = update.eagerState; + } else { + var action = update.action; + newState = reducer(newState, action); + } + } + + update = update.next; + } while (update !== null && update !== first); + + if (newBaseQueueLast === null) { + newBaseState = newState; + } else { + newBaseQueueLast.next = newBaseQueueFirst; + } // Mark that the fiber performed work, but only if the new state is + // different from the current state. + + + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + + hook.memoizedState = newState; + hook.baseState = newBaseState; + hook.baseQueue = newBaseQueueLast; + queue.lastRenderedState = newState; + } + + var dispatch = queue.dispatch; + return [hook.memoizedState, dispatch]; +} + +function rerenderReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + + if (!(queue !== null)) { + { + throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." ); + } + } + + queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous + // work-in-progress hook. + + var dispatch = queue.dispatch; + var lastRenderPhaseUpdate = queue.pending; + var newState = hook.memoizedState; + + if (lastRenderPhaseUpdate !== null) { + // The queue doesn't persist past this render pass. + queue.pending = null; + var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next; + var update = firstRenderPhaseUpdate; + + do { + // Process this render phase update. We don't have to check the + // priority because it will always be the same as the current + // render's. + var action = update.action; + newState = reducer(newState, action); + update = update.next; + } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is + // different from the current state. + + + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + + hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to + // the base state unless the queue is empty. + // TODO: Not sure if this is the desired semantics, but it's what we + // do for gDSFP. I can't remember why. + + if (hook.baseQueue === null) { + hook.baseState = newState; + } + + queue.lastRenderedState = newState; + } + + return [newState, dispatch]; +} + +function readFromUnsubcribedMutableSource(root, source, getSnapshot) { + { + warnAboutMultipleRenderersDEV(source); + } + + var getVersion = source._getVersion; + var version = getVersion(source._source); // Is it safe for this component to read from this source during the current render? + + var isSafeToReadFromSource = false; // Check the version first. + // If this render has already been started with a specific version, + // we can use it alone to determine if we can safely read from the source. + + var currentRenderVersion = getWorkInProgressVersion(source); + + if (currentRenderVersion !== null) { + // It's safe to read if the store hasn't been mutated since the last time + // we read something. + isSafeToReadFromSource = currentRenderVersion === version; + } else { + // If there's no version, then this is the first time we've read from the + // source during the current render pass, so we need to do a bit more work. + // What we need to determine is if there are any hooks that already + // subscribed to the source, and if so, whether there are any pending + // mutations that haven't been synchronized yet. + // + // If there are no pending mutations, then `root.mutableReadLanes` will be + // empty, and we know we can safely read. + // + // If there *are* pending mutations, we may still be able to safely read + // if the currently rendering lanes are inclusive of the pending mutation + // lanes, since that guarantees that the value we're about to read from + // the source is consistent with the values that we read during the most + // recent mutation. + isSafeToReadFromSource = isSubsetOfLanes(renderLanes, root.mutableReadLanes); + + if (isSafeToReadFromSource) { + // If it's safe to read from this source during the current render, + // store the version in case other components read from it. + // A changed version number will let those components know to throw and restart the render. + setWorkInProgressVersion(source, version); + } + } + + if (isSafeToReadFromSource) { + var snapshot = getSnapshot(source._source); + + { + if (typeof snapshot === 'function') { + error('Mutable source should not return a function as the snapshot value. ' + 'Functions may close over mutable values and cause tearing.'); + } + } + + return snapshot; + } else { + // This handles the special case of a mutable source being shared between renderers. + // In that case, if the source is mutated between the first and second renderer, + // The second renderer don't know that it needs to reset the WIP version during unwind, + // (because the hook only marks sources as dirty if it's written to their WIP version). + // That would cause this tear check to throw again and eventually be visible to the user. + // We can avoid this infinite loop by explicitly marking the source as dirty. + // + // This can lead to tearing in the first renderer when it resumes, + // but there's nothing we can do about that (short of throwing here and refusing to continue the render). + markSourceAsDirty(source); + + { + { + throw Error( "Cannot read from mutable source during the current render without tearing. This is a bug in React. Please file an issue." ); + } + } + } +} + +function useMutableSource(hook, source, getSnapshot, subscribe) { + var root = getWorkInProgressRoot(); + + if (!(root !== null)) { + { + throw Error( "Expected a work-in-progress root. This is a bug in React. Please file an issue." ); + } + } + + var getVersion = source._getVersion; + var version = getVersion(source._source); + var dispatcher = ReactCurrentDispatcher$1.current; // eslint-disable-next-line prefer-const + + var _dispatcher$useState = dispatcher.useState(function () { + return readFromUnsubcribedMutableSource(root, source, getSnapshot); + }), + currentSnapshot = _dispatcher$useState[0], + setSnapshot = _dispatcher$useState[1]; + + var snapshot = currentSnapshot; // Grab a handle to the state hook as well. + // We use it to clear the pending update queue if we have a new source. + + var stateHook = workInProgressHook; + var memoizedState = hook.memoizedState; + var refs = memoizedState.refs; + var prevGetSnapshot = refs.getSnapshot; + var prevSource = memoizedState.source; + var prevSubscribe = memoizedState.subscribe; + var fiber = currentlyRenderingFiber$1; + hook.memoizedState = { + refs: refs, + source: source, + subscribe: subscribe + }; // Sync the values needed by our subscription handler after each commit. + + dispatcher.useEffect(function () { + refs.getSnapshot = getSnapshot; // Normally the dispatch function for a state hook never changes, + // but this hook recreates the queue in certain cases to avoid updates from stale sources. + // handleChange() below needs to reference the dispatch function without re-subscribing, + // so we use a ref to ensure that it always has the latest version. + + refs.setSnapshot = setSnapshot; // Check for a possible change between when we last rendered now. + + var maybeNewVersion = getVersion(source._source); + + if (!objectIs(version, maybeNewVersion)) { + var maybeNewSnapshot = getSnapshot(source._source); + + { + if (typeof maybeNewSnapshot === 'function') { + error('Mutable source should not return a function as the snapshot value. ' + 'Functions may close over mutable values and cause tearing.'); + } + } + + if (!objectIs(snapshot, maybeNewSnapshot)) { + setSnapshot(maybeNewSnapshot); + var lane = requestUpdateLane(fiber); + markRootMutableRead(root, lane); + } // If the source mutated between render and now, + // there may be state updates already scheduled from the old source. + // Entangle the updates so that they render in the same batch. + + + markRootEntangled(root, root.mutableReadLanes); + } + }, [getSnapshot, source, subscribe]); // If we got a new source or subscribe function, re-subscribe in a passive effect. + + dispatcher.useEffect(function () { + var handleChange = function () { + var latestGetSnapshot = refs.getSnapshot; + var latestSetSnapshot = refs.setSnapshot; + + try { + latestSetSnapshot(latestGetSnapshot(source._source)); // Record a pending mutable source update with the same expiration time. + + var lane = requestUpdateLane(fiber); + markRootMutableRead(root, lane); + } catch (error) { + // A selector might throw after a source mutation. + // e.g. it might try to read from a part of the store that no longer exists. + // In this case we should still schedule an update with React. + // Worst case the selector will throw again and then an error boundary will handle it. + latestSetSnapshot(function () { + throw error; + }); + } + }; + + var unsubscribe = subscribe(source._source, handleChange); + + { + if (typeof unsubscribe !== 'function') { + error('Mutable source subscribe function must return an unsubscribe function.'); + } + } + + return unsubscribe; + }, [source, subscribe]); // If any of the inputs to useMutableSource change, reading is potentially unsafe. + // + // If either the source or the subscription have changed we can't can't trust the update queue. + // Maybe the source changed in a way that the old subscription ignored but the new one depends on. + // + // If the getSnapshot function changed, we also shouldn't rely on the update queue. + // It's possible that the underlying source was mutated between the when the last "change" event fired, + // and when the current render (with the new getSnapshot function) is processed. + // + // In both cases, we need to throw away pending updates (since they are no longer relevant) + // and treat reading from the source as we do in the mount case. + + if (!objectIs(prevGetSnapshot, getSnapshot) || !objectIs(prevSource, source) || !objectIs(prevSubscribe, subscribe)) { + // Create a new queue and setState method, + // So if there are interleaved updates, they get pushed to the older queue. + // When this becomes current, the previous queue and dispatch method will be discarded, + // including any interleaving updates that occur. + var newQueue = { + pending: null, + dispatch: null, + lastRenderedReducer: basicStateReducer, + lastRenderedState: snapshot + }; + newQueue.dispatch = setSnapshot = dispatchAction.bind(null, currentlyRenderingFiber$1, newQueue); + stateHook.queue = newQueue; + stateHook.baseQueue = null; + snapshot = readFromUnsubcribedMutableSource(root, source, getSnapshot); + stateHook.memoizedState = stateHook.baseState = snapshot; + } + + return snapshot; +} + +function mountMutableSource(source, getSnapshot, subscribe) { + var hook = mountWorkInProgressHook(); + hook.memoizedState = { + refs: { + getSnapshot: getSnapshot, + setSnapshot: null + }, + source: source, + subscribe: subscribe + }; + return useMutableSource(hook, source, getSnapshot, subscribe); +} + +function updateMutableSource(source, getSnapshot, subscribe) { + var hook = updateWorkInProgressHook(); + return useMutableSource(hook, source, getSnapshot, subscribe); +} + +function mountState(initialState) { + var hook = mountWorkInProgressHook(); + + if (typeof initialState === 'function') { + // $FlowFixMe: Flow doesn't like mixed types + initialState = initialState(); + } + + hook.memoizedState = hook.baseState = initialState; + var queue = hook.queue = { + pending: null, + dispatch: null, + lastRenderedReducer: basicStateReducer, + lastRenderedState: initialState + }; + var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; +} + +function updateState(initialState) { + return updateReducer(basicStateReducer); +} + +function rerenderState(initialState) { + return rerenderReducer(basicStateReducer); +} + +function pushEffect(tag, create, destroy, deps) { + var effect = { + tag: tag, + create: create, + destroy: destroy, + deps: deps, + // Circular + next: null + }; + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue; + + if (componentUpdateQueue === null) { + componentUpdateQueue = createFunctionComponentUpdateQueue(); + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue; + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var lastEffect = componentUpdateQueue.lastEffect; + + if (lastEffect === null) { + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var firstEffect = lastEffect.next; + lastEffect.next = effect; + effect.next = firstEffect; + componentUpdateQueue.lastEffect = effect; + } + } + + return effect; +} + +function mountRef(initialValue) { + var hook = mountWorkInProgressHook(); + var ref = { + current: initialValue + }; + + { + Object.seal(ref); + } + + hook.memoizedState = ref; + return ref; +} + +function updateRef(initialValue) { + var hook = updateWorkInProgressHook(); + return hook.memoizedState; +} + +function mountEffectImpl(fiberFlags, hookFlags, create, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + currentlyRenderingFiber$1.flags |= fiberFlags; + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, undefined, nextDeps); +} + +function updateEffectImpl(fiberFlags, hookFlags, create, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var destroy = undefined; + + if (currentHook !== null) { + var prevEffect = currentHook.memoizedState; + destroy = prevEffect.destroy; + + if (nextDeps !== null) { + var prevDeps = prevEffect.deps; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + pushEffect(hookFlags, create, destroy, nextDeps); + return; + } + } + } + + currentlyRenderingFiber$1.flags |= fiberFlags; + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, destroy, nextDeps); +} + +function mountEffect(create, deps) { + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + } + } + + return mountEffectImpl(Update | Passive, Passive$1, create, deps); +} + +function updateEffect(create, deps) { + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + } + } + + return updateEffectImpl(Update | Passive, Passive$1, create, deps); +} + +function mountLayoutEffect(create, deps) { + return mountEffectImpl(Update, Layout, create, deps); +} + +function updateLayoutEffect(create, deps) { + return updateEffectImpl(Update, Layout, create, deps); +} + +function imperativeHandleEffect(create, ref) { + if (typeof ref === 'function') { + var refCallback = ref; + + var _inst = create(); + + refCallback(_inst); + return function () { + refCallback(null); + }; + } else if (ref !== null && ref !== undefined) { + var refObject = ref; + + { + if (!refObject.hasOwnProperty('current')) { + error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}'); + } + } + + var _inst2 = create(); + + refObject.current = _inst2; + return function () { + refObject.current = null; + }; + } +} + +function mountImperativeHandle(ref, create, deps) { + { + if (typeof create !== 'function') { + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null'); + } + } // TODO: If deps are provided, should we skip comparing the ref itself? + + + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; + return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); +} + +function updateImperativeHandle(ref, create, deps) { + { + if (typeof create !== 'function') { + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null'); + } + } // TODO: If deps are provided, should we skip comparing the ref itself? + + + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; + return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); +} + +function mountDebugValue(value, formatterFn) {// This hook is normally a no-op. + // The react-debug-hooks package injects its own implementation + // so that e.g. DevTools can display custom hook values. +} + +var updateDebugValue = mountDebugValue; + +function mountCallback(callback, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + hook.memoizedState = [callback, nextDeps]; + return callback; +} + +function updateCallback(callback, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var prevState = hook.memoizedState; + + if (prevState !== null) { + if (nextDeps !== null) { + var prevDeps = prevState[1]; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + + hook.memoizedState = [callback, nextDeps]; + return callback; +} + +function mountMemo(nextCreate, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; +} + +function updateMemo(nextCreate, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var prevState = hook.memoizedState; + + if (prevState !== null) { + // Assume these are defined. If they're not, areHookInputsEqual will warn. + if (nextDeps !== null) { + var prevDeps = prevState[1]; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; +} + +function mountDeferredValue(value) { + var _mountState = mountState(value), + prevValue = _mountState[0], + setValue = _mountState[1]; + + mountEffect(function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }, [value]); + return prevValue; +} + +function updateDeferredValue(value) { + var _updateState = updateState(), + prevValue = _updateState[0], + setValue = _updateState[1]; + + updateEffect(function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }, [value]); + return prevValue; +} + +function rerenderDeferredValue(value) { + var _rerenderState = rerenderState(), + prevValue = _rerenderState[0], + setValue = _rerenderState[1]; + + updateEffect(function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }, [value]); + return prevValue; +} + +function startTransition(setPending, callback) { + var priorityLevel = getCurrentPriorityLevel(); + + { + runWithPriority$1(priorityLevel < UserBlockingPriority$2 ? UserBlockingPriority$2 : priorityLevel, function () { + setPending(true); + }); + runWithPriority$1(priorityLevel > NormalPriority$1 ? NormalPriority$1 : priorityLevel, function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setPending(false); + callback(); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }); + } +} + +function mountTransition() { + var _mountState2 = mountState(false), + isPending = _mountState2[0], + setPending = _mountState2[1]; // The `start` method can be stored on a ref, since `setPending` + // never changes. + + + var start = startTransition.bind(null, setPending); + mountRef(start); + return [start, isPending]; +} + +function updateTransition() { + var _updateState2 = updateState(), + isPending = _updateState2[0]; + + var startRef = updateRef(); + var start = startRef.current; + return [start, isPending]; +} + +function rerenderTransition() { + var _rerenderState2 = rerenderState(), + isPending = _rerenderState2[0]; + + var startRef = updateRef(); + var start = startRef.current; + return [start, isPending]; +} + +var isUpdatingOpaqueValueInRenderPhase = false; +function getIsUpdatingOpaqueValueInRenderPhaseInDEV() { + { + return isUpdatingOpaqueValueInRenderPhase; + } +} + +function warnOnOpaqueIdentifierAccessInDEV(fiber) { + { + // TODO: Should warn in effects and callbacks, too + var name = getComponentName(fiber.type) || 'Unknown'; + + if (getIsRendering() && !didWarnAboutUseOpaqueIdentifier[name]) { + error('The object passed back from useOpaqueIdentifier is meant to be ' + 'passed through to attributes only. Do not read the ' + 'value directly.'); + + didWarnAboutUseOpaqueIdentifier[name] = true; + } + } +} + +function mountOpaqueIdentifier() { + var makeId = makeClientIdInDEV.bind(null, warnOnOpaqueIdentifierAccessInDEV.bind(null, currentlyRenderingFiber$1)) ; + + if (getIsHydrating()) { + var didUpgrade = false; + var fiber = currentlyRenderingFiber$1; + + var readValue = function () { + if (!didUpgrade) { + // Only upgrade once. This works even inside the render phase because + // the update is added to a shared queue, which outlasts the + // in-progress render. + didUpgrade = true; + + { + isUpdatingOpaqueValueInRenderPhase = true; + setId(makeId()); + isUpdatingOpaqueValueInRenderPhase = false; + warnOnOpaqueIdentifierAccessInDEV(fiber); + } + } + + { + { + throw Error( "The object passed back from useOpaqueIdentifier is meant to be passed through to attributes only. Do not read the value directly." ); + } + } + }; + + var id = makeOpaqueHydratingObject(readValue); + var setId = mountState(id)[1]; + + if ((currentlyRenderingFiber$1.mode & BlockingMode) === NoMode) { + currentlyRenderingFiber$1.flags |= Update | Passive; + pushEffect(HasEffect | Passive$1, function () { + setId(makeId()); + }, undefined, null); + } + + return id; + } else { + var _id = makeId(); + + mountState(_id); + return _id; + } +} + +function updateOpaqueIdentifier() { + var id = updateState()[0]; + return id; +} + +function rerenderOpaqueIdentifier() { + var id = rerenderState()[0]; + return id; +} + +function dispatchAction(fiber, queue, action) { + { + if (typeof arguments[3] === 'function') { + error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().'); + } + } + + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = { + lane: lane, + action: action, + eagerReducer: null, + eagerState: null, + next: null + }; // Append the update to the end of the list. + + var pending = queue.pending; + + if (pending === null) { + // This is the first update. Create a circular list. + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + + queue.pending = update; + var alternate = fiber.alternate; + + if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) { + // This is a render phase update. Stash it in a lazily-created map of + // queue -> linked list of updates. After this render pass, we'll restart + // and apply the stashed updates on top of the work-in-progress hook. + didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true; + } else { + if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) { + // The queue is currently empty, which means we can eagerly compute the + // next state before entering the render phase. If the new state is the + // same as the current state, we may be able to bail out entirely. + var lastRenderedReducer = queue.lastRenderedReducer; + + if (lastRenderedReducer !== null) { + var prevDispatcher; + + { + prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + } + + try { + var currentState = queue.lastRenderedState; + var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute + // it, on the update object. If the reducer hasn't changed by the + // time we enter the render phase, then the eager state can be used + // without calling the reducer again. + + update.eagerReducer = lastRenderedReducer; + update.eagerState = eagerState; + + if (objectIs(eagerState, currentState)) { + // Fast path. We can bail out without scheduling React to re-render. + // It's still possible that we'll need to rebase this update later, + // if the component re-renders for a different reason and by that + // time the reducer has changed. + return; + } + } catch (error) {// Suppress the error. It will throw again in the render phase. + } finally { + { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + } + } + } + + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotScopedWithMatchingAct(fiber); + warnIfNotCurrentlyActingUpdatesInDev(fiber); + } + } + + scheduleUpdateOnFiber(fiber, lane, eventTime); + } +} + +var ContextOnlyDispatcher = { + readContext: readContext, + useCallback: throwInvalidHookError, + useContext: throwInvalidHookError, + useEffect: throwInvalidHookError, + useImperativeHandle: throwInvalidHookError, + useLayoutEffect: throwInvalidHookError, + useMemo: throwInvalidHookError, + useReducer: throwInvalidHookError, + useRef: throwInvalidHookError, + useState: throwInvalidHookError, + useDebugValue: throwInvalidHookError, + useDeferredValue: throwInvalidHookError, + useTransition: throwInvalidHookError, + useMutableSource: throwInvalidHookError, + useOpaqueIdentifier: throwInvalidHookError, + unstable_isNewReconciler: enableNewReconciler +}; +var HooksDispatcherOnMountInDEV = null; +var HooksDispatcherOnMountWithHookTypesInDEV = null; +var HooksDispatcherOnUpdateInDEV = null; +var HooksDispatcherOnRerenderInDEV = null; +var InvalidNestedHooksDispatcherOnMountInDEV = null; +var InvalidNestedHooksDispatcherOnUpdateInDEV = null; +var InvalidNestedHooksDispatcherOnRerenderInDEV = null; + +{ + var warnInvalidContextAccess = function () { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + }; + + var warnInvalidHookAccess = function () { + error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks'); + }; + + HooksDispatcherOnMountInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + mountHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + mountHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + mountHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + mountHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + mountHookTypesDev(); + return mountMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + mountHookTypesDev(); + return mountOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnMountWithHookTypesInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + updateHookTypesDev(); + return mountMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + updateHookTypesDev(); + return mountOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnUpdateInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return updateDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return updateTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + updateHookTypesDev(); + return updateOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnRerenderInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return rerenderDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return rerenderTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + updateHookTypesDev(); + return rerenderOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnMountInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnUpdateInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnRerenderInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; +} + +var now$1 = Scheduler.unstable_now; +var commitTime = 0; +var profilerStartTime = -1; + +function getCommitTime() { + return commitTime; +} + +function recordCommitTime() { + + commitTime = now$1(); +} + +function startProfilerTimer(fiber) { + + profilerStartTime = now$1(); + + if (fiber.actualStartTime < 0) { + fiber.actualStartTime = now$1(); + } +} + +function stopProfilerTimerIfRunning(fiber) { + + profilerStartTime = -1; +} + +function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) { + + if (profilerStartTime >= 0) { + var elapsedTime = now$1() - profilerStartTime; + fiber.actualDuration += elapsedTime; + + if (overrideBaseTime) { + fiber.selfBaseDuration = elapsedTime; + } + + profilerStartTime = -1; + } +} + +function transferActualDuration(fiber) { + // Transfer time spent rendering these children so we don't lose it + // after we rerender. This is used as a helper in special cases + // where we should count the work of multiple passes. + var child = fiber.child; + + while (child) { + fiber.actualDuration += child.actualDuration; + child = child.sibling; + } +} + +var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; +var didReceiveUpdate = false; +var didWarnAboutBadClass; +var didWarnAboutModulePatternComponent; +var didWarnAboutContextTypeOnFunctionComponent; +var didWarnAboutGetDerivedStateOnFunctionComponent; +var didWarnAboutFunctionRefs; +var didWarnAboutReassigningProps; +var didWarnAboutRevealOrder; +var didWarnAboutTailOptions; + +{ + didWarnAboutBadClass = {}; + didWarnAboutModulePatternComponent = {}; + didWarnAboutContextTypeOnFunctionComponent = {}; + didWarnAboutGetDerivedStateOnFunctionComponent = {}; + didWarnAboutFunctionRefs = {}; + didWarnAboutReassigningProps = false; + didWarnAboutRevealOrder = {}; + didWarnAboutTailOptions = {}; +} + +function reconcileChildren(current, workInProgress, nextChildren, renderLanes) { + if (current === null) { + // If this is a fresh new component that hasn't been rendered yet, we + // won't update its child set by applying minimal side-effects. Instead, + // we will add them all to the child before it gets rendered. That means + // we can optimize this reconciliation pass by not tracking side-effects. + workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderLanes); + } else { + // If the current child is the same as the work in progress, it means that + // we haven't yet started any work on these children. Therefore, we use + // the clone algorithm to create a copy of all the current children. + // If we had any progressed work already, that is invalid at this point so + // let's throw it out. + workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes); + } +} + +function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes) { + // This function is fork of reconcileChildren. It's used in cases where we + // want to reconcile without matching against the existing set. This has the + // effect of all current children being unmounted; even if the type and key + // are the same, the old child is unmounted and a new child is created. + // + // To do this, we're going to go through the reconcile algorithm twice. In + // the first pass, we schedule a deletion for all the current children by + // passing null. + workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes); // In the second pass, we mount the new children. The trick here is that we + // pass null in place of where we usually pass the current child set. This has + // the effect of remounting all children regardless of whether their + // identities match. + + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes); +} + +function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) { + // TODO: current can be non-null here even if the component + // hasn't yet mounted. This happens after the first render suspends. + // We'll need to figure out if this is fine or can cause issues. + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; + + if (innerPropTypes) { + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component)); + } + } + } + + var render = Component.render; + var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent + + var nextChildren; + prepareToReadContext(workInProgress, renderLanes); + + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes); + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes); + } finally { + reenableLogs(); + } + } + + setIsRendering(false); + } + + if (current !== null && !didReceiveUpdate) { + bailoutHooks(current, workInProgress, renderLanes); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateMemoComponent(current, workInProgress, Component, nextProps, updateLanes, renderLanes) { + if (current === null) { + var type = Component.type; + + if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either. + Component.defaultProps === undefined) { + var resolvedType = type; + + { + resolvedType = resolveFunctionForHotReloading(type); + } // If this is a plain function component without default props, + // and with only the default shallow comparison, we upgrade it + // to a SimpleMemoComponent to allow fast path updates. + + + workInProgress.tag = SimpleMemoComponent; + workInProgress.type = resolvedType; + + { + validateFunctionComponentInDev(workInProgress, type); + } + + return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateLanes, renderLanes); + } + + { + var innerPropTypes = type.propTypes; + + if (innerPropTypes) { + // Inner memo component props aren't currently validated in createElement. + // We could move it there, but we'd still need this for lazy code path. + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(type)); + } + } + + var child = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes); + child.ref = workInProgress.ref; + child.return = workInProgress; + workInProgress.child = child; + return child; + } + + { + var _type = Component.type; + var _innerPropTypes = _type.propTypes; + + if (_innerPropTypes) { + // Inner memo component props aren't currently validated in createElement. + // We could move it there, but we'd still need this for lazy code path. + checkPropTypes(_innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(_type)); + } + } + + var currentChild = current.child; // This is always exactly one child + + if (!includesSomeLane(updateLanes, renderLanes)) { + // This will be the props with resolved defaultProps, + // unlike current.memoizedProps which will be the unresolved ones. + var prevProps = currentChild.memoizedProps; // Default to shallow comparison + + var compare = Component.compare; + compare = compare !== null ? compare : shallowEqual; + + if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) { + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + var newChild = createWorkInProgress(currentChild, nextProps); + newChild.ref = workInProgress.ref; + newChild.return = workInProgress; + workInProgress.child = newChild; + return newChild; +} + +function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateLanes, renderLanes) { + // TODO: current can be non-null here even if the component + // hasn't yet mounted. This happens when the inner render suspends. + // We'll need to figure out if this is fine or can cause issues. + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var outerMemoType = workInProgress.elementType; + + if (outerMemoType.$$typeof === REACT_LAZY_TYPE) { + // We warn when you define propTypes on lazy() + // so let's just skip over it to find memo() outer wrapper. + // Inner props for memo are validated later. + var lazyComponent = outerMemoType; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + outerMemoType = init(payload); + } catch (x) { + outerMemoType = null; + } // Inner propTypes will be validated in the function component path. + + + var outerPropTypes = outerMemoType && outerMemoType.propTypes; + + if (outerPropTypes) { + checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps) + 'prop', getComponentName(outerMemoType)); + } + } + } + } + + if (current !== null) { + var prevProps = current.memoizedProps; + + if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload. + workInProgress.type === current.type )) { + didReceiveUpdate = false; + + if (!includesSomeLane(renderLanes, updateLanes)) { + // The pending lanes were cleared at the beginning of beginWork. We're + // about to bail out, but there might be other lanes that weren't + // included in the current render. Usually, the priority level of the + // remaining updates is accumlated during the evaluation of the + // component (i.e. when processing the update queue). But since since + // we're bailing out early *without* evaluating the component, we need + // to account for it here, too. Reset to the value of the current fiber. + // NOTE: This only applies to SimpleMemoComponent, not MemoComponent, + // because a MemoComponent fiber does not have hooks or an update queue; + // rather, it wraps around an inner component, which may or may not + // contains hooks. + // TODO: Move the reset at in beginWork out of the common path so that + // this is no longer necessary. + workInProgress.lanes = current.lanes; + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } else if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) { + // This is a special case that only exists for legacy mode. + // See https://github.com/facebook/react/pull/19216. + didReceiveUpdate = true; + } + } + } + + return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes); +} + +function updateOffscreenComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps; + var nextChildren = nextProps.children; + var prevState = current !== null ? current.memoizedState : null; + + if (nextProps.mode === 'hidden' || nextProps.mode === 'unstable-defer-without-hiding') { + if ((workInProgress.mode & ConcurrentMode) === NoMode) { + // In legacy sync mode, don't defer the subtree. Render it now. + // TODO: Figure out what we should do in Blocking mode. + var nextState = { + baseLanes: NoLanes + }; + workInProgress.memoizedState = nextState; + pushRenderLanes(workInProgress, renderLanes); + } else if (!includesSomeLane(renderLanes, OffscreenLane)) { + var nextBaseLanes; + + if (prevState !== null) { + var prevBaseLanes = prevState.baseLanes; + nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes); + } else { + nextBaseLanes = renderLanes; + } // Schedule this fiber to re-render at offscreen priority. Then bailout. + + + { + markSpawnedWork(OffscreenLane); + } + + workInProgress.lanes = workInProgress.childLanes = laneToLanes(OffscreenLane); + var _nextState = { + baseLanes: nextBaseLanes + }; + workInProgress.memoizedState = _nextState; // We're about to bail out, but we need to push this to the stack anyway + // to avoid a push/pop misalignment. + + pushRenderLanes(workInProgress, nextBaseLanes); + return null; + } else { + // Rendering at offscreen, so we can clear the base lanes. + var _nextState2 = { + baseLanes: NoLanes + }; + workInProgress.memoizedState = _nextState2; // Push the lanes that were skipped when we bailed out. + + var subtreeRenderLanes = prevState !== null ? prevState.baseLanes : renderLanes; + pushRenderLanes(workInProgress, subtreeRenderLanes); + } + } else { + var _subtreeRenderLanes; + + if (prevState !== null) { + _subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes); // Since we're not hidden anymore, reset the state + + workInProgress.memoizedState = null; + } else { + // We weren't previously hidden, and we still aren't, so there's nothing + // special to do. Need to push to the stack regardless, though, to avoid + // a push/pop misalignment. + _subtreeRenderLanes = renderLanes; + } + + pushRenderLanes(workInProgress, _subtreeRenderLanes); + } + + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} // Note: These happen to have identical begin phases, for now. We shouldn't hold +// ourselves to this constraint, though. If the behavior diverges, we should +// fork the function. + + +var updateLegacyHiddenComponent = updateOffscreenComponent; + +function updateFragment(current, workInProgress, renderLanes) { + var nextChildren = workInProgress.pendingProps; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateMode(current, workInProgress, renderLanes) { + var nextChildren = workInProgress.pendingProps.children; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateProfiler(current, workInProgress, renderLanes) { + { + workInProgress.flags |= Update; // Reset effect durations for the next eventual effect phase. + // These are reset during render to allow the DevTools commit hook a chance to read them, + + var stateNode = workInProgress.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + + var nextProps = workInProgress.pendingProps; + var nextChildren = nextProps.children; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function markRef(current, workInProgress) { + var ref = workInProgress.ref; + + if (current === null && ref !== null || current !== null && current.ref !== ref) { + // Schedule a Ref effect + workInProgress.flags |= Ref; + } +} + +function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) { + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; + + if (innerPropTypes) { + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component)); + } + } + } + + var context; + + { + var unmaskedContext = getUnmaskedContext(workInProgress, Component, true); + context = getMaskedContext(workInProgress, unmaskedContext); + } + + var nextChildren; + prepareToReadContext(workInProgress, renderLanes); + + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes); + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes); + } finally { + reenableLogs(); + } + } + + setIsRendering(false); + } + + if (current !== null && !didReceiveUpdate) { + bailoutHooks(current, workInProgress, renderLanes); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) { + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; + + if (innerPropTypes) { + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component)); + } + } + } // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + + var hasContext; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } + + prepareToReadContext(workInProgress, renderLanes); + var instance = workInProgress.stateNode; + var shouldUpdate; + + if (instance === null) { + if (current !== null) { + // A class component without an instance only mounts if it suspended + // inside a non-concurrent tree, in an inconsistent state. We want to + // treat it like a new mount, even though an empty version of it already + // committed. Disconnect the alternate pointers. + current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } // In the initial pass we might need to construct the instance. + + + constructClassInstance(workInProgress, Component, nextProps); + mountClassInstance(workInProgress, Component, nextProps, renderLanes); + shouldUpdate = true; + } else if (current === null) { + // In a resume, we'll already have an instance we can reuse. + shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderLanes); + } else { + shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderLanes); + } + + var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes); + + { + var inst = workInProgress.stateNode; + + if (shouldUpdate && inst.props !== nextProps) { + if (!didWarnAboutReassigningProps) { + error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component'); + } + + didWarnAboutReassigningProps = true; + } + } + + return nextUnitOfWork; +} + +function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes) { + // Refs should update even if shouldComponentUpdate returns false + markRef(current, workInProgress); + var didCaptureError = (workInProgress.flags & DidCapture) !== NoFlags; + + if (!shouldUpdate && !didCaptureError) { + // Context providers should defer to sCU for rendering + if (hasContext) { + invalidateContextProvider(workInProgress, Component, false); + } + + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + + var instance = workInProgress.stateNode; // Rerender + + ReactCurrentOwner$1.current = workInProgress; + var nextChildren; + + if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') { + // If we captured an error, but getDerivedStateFromError is not defined, + // unmount all the children. componentDidCatch will schedule an update to + // re-render a fallback. This is temporary until we migrate everyone to + // the new API. + // TODO: Warn in a future release. + nextChildren = null; + + { + stopProfilerTimerIfRunning(); + } + } else { + { + setIsRendering(true); + nextChildren = instance.render(); + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + instance.render(); + } finally { + reenableLogs(); + } + } + + setIsRendering(false); + } + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + + if (current !== null && didCaptureError) { + // If we're recovering from an error, reconcile without reusing any of + // the existing children. Conceptually, the normal children and the children + // that are shown on error are two different sets, so we shouldn't reuse + // normal children even if their identities match. + forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes); + } else { + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + } // Memoize state using the values we just used to render. + // TODO: Restructure so we never read values from the instance. + + + workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it. + + if (hasContext) { + invalidateContextProvider(workInProgress, Component, true); + } + + return workInProgress.child; +} + +function pushHostRootContext(workInProgress) { + var root = workInProgress.stateNode; + + if (root.pendingContext) { + pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context); + } else if (root.context) { + // Should always be set + pushTopLevelContextObject(workInProgress, root.context, false); + } + + pushHostContainer(workInProgress, root.containerInfo); +} + +function updateHostRoot(current, workInProgress, renderLanes) { + pushHostRootContext(workInProgress); + var updateQueue = workInProgress.updateQueue; + + if (!(current !== null && updateQueue !== null)) { + { + throw Error( "If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var nextProps = workInProgress.pendingProps; + var prevState = workInProgress.memoizedState; + var prevChildren = prevState !== null ? prevState.element : null; + cloneUpdateQueue(current, workInProgress); + processUpdateQueue(workInProgress, nextProps, null, renderLanes); + var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property + // being called "element". + + var nextChildren = nextState.element; + + if (nextChildren === prevChildren) { + resetHydrationState(); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + + var root = workInProgress.stateNode; + + if (root.hydrate && enterHydrationState(workInProgress)) { + // If we don't have any current children this might be the first pass. + // We always try to hydrate. If this isn't a hydration pass there won't + // be any children to hydrate which is effectively the same thing as + // not hydrating. + { + var mutableSourceEagerHydrationData = root.mutableSourceEagerHydrationData; + + if (mutableSourceEagerHydrationData != null) { + for (var i = 0; i < mutableSourceEagerHydrationData.length; i += 2) { + var mutableSource = mutableSourceEagerHydrationData[i]; + var version = mutableSourceEagerHydrationData[i + 1]; + setWorkInProgressVersion(mutableSource, version); + } + } + } + + var child = mountChildFibers(workInProgress, null, nextChildren, renderLanes); + workInProgress.child = child; + var node = child; + + while (node) { + // Mark each child as hydrating. This is a fast path to know whether this + // tree is part of a hydrating tree. This is used to determine if a child + // node has fully mounted yet, and for scheduling event replaying. + // Conceptually this is similar to Placement in that a new subtree is + // inserted into the React tree here. It just happens to not need DOM + // mutations because it already exists. + node.flags = node.flags & ~Placement | Hydrating; + node = node.sibling; + } + } else { + // Otherwise reset hydration state in case we aborted and resumed another + // root. + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + resetHydrationState(); + } + + return workInProgress.child; +} + +function updateHostComponent(current, workInProgress, renderLanes) { + pushHostContext(workInProgress); + + if (current === null) { + tryToClaimNextHydratableInstance(workInProgress); + } + + var type = workInProgress.type; + var nextProps = workInProgress.pendingProps; + var prevProps = current !== null ? current.memoizedProps : null; + var nextChildren = nextProps.children; + var isDirectTextChild = shouldSetTextContent(type, nextProps); + + if (isDirectTextChild) { + // We special case a direct text child of a host node. This is a common + // case. We won't handle it as a reified child. We will instead handle + // this in the host environment that also has access to this prop. That + // avoids allocating another HostText fiber and traversing it. + nextChildren = null; + } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) { + // If we're switching from a direct text child to a normal child, or to + // empty, we need to schedule the text content to be reset. + workInProgress.flags |= ContentReset; + } + + markRef(current, workInProgress); + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateHostText(current, workInProgress) { + if (current === null) { + tryToClaimNextHydratableInstance(workInProgress); + } // Nothing to do here. This is terminal. We'll do the completion step + // immediately after. + + + return null; +} + +function mountLazyComponent(_current, workInProgress, elementType, updateLanes, renderLanes) { + if (_current !== null) { + // A lazy component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } + + var props = workInProgress.pendingProps; + var lazyComponent = elementType; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + var Component = init(payload); // Store the unwrapped component in the type. + + workInProgress.type = Component; + var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component); + var resolvedProps = resolveDefaultProps(Component, props); + var child; + + switch (resolvedTag) { + case FunctionComponent: + { + { + validateFunctionComponentInDev(workInProgress, Component); + workInProgress.type = Component = resolveFunctionForHotReloading(Component); + } + + child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderLanes); + return child; + } + + case ClassComponent: + { + { + workInProgress.type = Component = resolveClassForHotReloading(Component); + } + + child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderLanes); + return child; + } + + case ForwardRef: + { + { + workInProgress.type = Component = resolveForwardRefForHotReloading(Component); + } + + child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderLanes); + return child; + } + + case MemoComponent: + { + { + if (workInProgress.type !== workInProgress.elementType) { + var outerPropTypes = Component.propTypes; + + if (outerPropTypes) { + checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only + 'prop', getComponentName(Component)); + } + } + } + + child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too + updateLanes, renderLanes); + return child; + } + } + + var hint = ''; + + { + if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) { + hint = ' Did you wrap a component in React.lazy() more than once?'; + } + } // This message intentionally doesn't mention ForwardRef or MemoComponent + // because the fact that it's a separate type of work is an + // implementation detail. + + + { + { + throw Error( "Element type is invalid. Received a promise that resolves to: " + Component + ". Lazy element type must resolve to a class or function." + hint ); + } + } +} + +function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderLanes) { + if (_current !== null) { + // An incomplete component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } // Promote the fiber to a class and try rendering again. + + + workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent` + // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + var hasContext; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } + + prepareToReadContext(workInProgress, renderLanes); + constructClassInstance(workInProgress, Component, nextProps); + mountClassInstance(workInProgress, Component, nextProps, renderLanes); + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes); +} + +function mountIndeterminateComponent(_current, workInProgress, Component, renderLanes) { + if (_current !== null) { + // An indeterminate component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } + + var props = workInProgress.pendingProps; + var context; + + { + var unmaskedContext = getUnmaskedContext(workInProgress, Component, false); + context = getMaskedContext(workInProgress, unmaskedContext); + } + + prepareToReadContext(workInProgress, renderLanes); + var value; + + { + if (Component.prototype && typeof Component.prototype.render === 'function') { + var componentName = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutBadClass[componentName]) { + error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName); + + didWarnAboutBadClass[componentName] = true; + } + } + + if (workInProgress.mode & StrictMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null); + } + + setIsRendering(true); + ReactCurrentOwner$1.current = workInProgress; + value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes); + setIsRendering(false); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + + { + // Support for module components is deprecated and is removed behind a flag. + // Whether or not it would crash later, we want to show a good message in DEV first. + if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + var _componentName = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutModulePatternComponent[_componentName]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName); + + didWarnAboutModulePatternComponent[_componentName] = true; + } + } + } + + if ( // Run these checks in production only if the flag is off. + // Eventually we'll delete this branch altogether. + typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + { + var _componentName2 = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutModulePatternComponent[_componentName2]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName2, _componentName2, _componentName2); + + didWarnAboutModulePatternComponent[_componentName2] = true; + } + } // Proceed under the assumption that this is a class instance + + + workInProgress.tag = ClassComponent; // Throw out any hooks that were used. + + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + var hasContext = false; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } + + workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null; + initializeUpdateQueue(workInProgress); + var getDerivedStateFromProps = Component.getDerivedStateFromProps; + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props); + } + + adoptClassInstance(workInProgress, value); + mountClassInstance(workInProgress, Component, props, renderLanes); + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes); + } else { + // Proceed under the assumption that this is a function component + workInProgress.tag = FunctionComponent; + + { + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes); + } finally { + reenableLogs(); + } + } + } + + reconcileChildren(null, workInProgress, value, renderLanes); + + { + validateFunctionComponentInDev(workInProgress, Component); + } + + return workInProgress.child; + } +} + +function validateFunctionComponentInDev(workInProgress, Component) { + { + if (Component) { + if (Component.childContextTypes) { + error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component'); + } + } + + if (workInProgress.ref !== null) { + var info = ''; + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + + if (ownerName) { + info += '\n\nCheck the render method of `' + ownerName + '`.'; + } + + var warningKey = ownerName || workInProgress._debugID || ''; + var debugSource = workInProgress._debugSource; + + if (debugSource) { + warningKey = debugSource.fileName + ':' + debugSource.lineNumber; + } + + if (!didWarnAboutFunctionRefs[warningKey]) { + didWarnAboutFunctionRefs[warningKey] = true; + + error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info); + } + } + + if (typeof Component.getDerivedStateFromProps === 'function') { + var _componentName3 = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) { + error('%s: Function components do not support getDerivedStateFromProps.', _componentName3); + + didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true; + } + } + + if (typeof Component.contextType === 'object' && Component.contextType !== null) { + var _componentName4 = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) { + error('%s: Function components do not support contextType.', _componentName4); + + didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true; + } + } + } +} + +var SUSPENDED_MARKER = { + dehydrated: null, + retryLane: NoLane +}; + +function mountSuspenseOffscreenState(renderLanes) { + return { + baseLanes: renderLanes + }; +} + +function updateSuspenseOffscreenState(prevOffscreenState, renderLanes) { + return { + baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes) + }; +} // TODO: Probably should inline this back + + +function shouldRemainOnFallback(suspenseContext, current, workInProgress, renderLanes) { + // If we're already showing a fallback, there are cases where we need to + // remain on that fallback regardless of whether the content has resolved. + // For example, SuspenseList coordinates when nested content appears. + if (current !== null) { + var suspenseState = current.memoizedState; + + if (suspenseState === null) { + // Currently showing content. Don't hide it, even if ForceSuspenseFallack + // is true. More precise name might be "ForceRemainSuspenseFallback". + // Note: This is a factoring smell. Can't remain on a fallback if there's + // no fallback to remain on. + return false; + } + } // Not currently showing content. Consult the Suspense context. + + + return hasSuspenseContext(suspenseContext, ForceSuspenseFallback); +} + +function getRemainingWorkInPrimaryTree(current, renderLanes) { + // TODO: Should not remove render lanes that were pinged during this render + return removeLanes(current.childLanes, renderLanes); +} + +function updateSuspenseComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend. + + { + if (shouldSuspend(workInProgress)) { + workInProgress.flags |= DidCapture; + } + } + + var suspenseContext = suspenseStackCursor.current; + var showFallback = false; + var didSuspend = (workInProgress.flags & DidCapture) !== NoFlags; + + if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) { + // Something in this boundary's subtree already suspended. Switch to + // rendering the fallback children. + showFallback = true; + workInProgress.flags &= ~DidCapture; + } else { + // Attempting the main content + if (current === null || current.memoizedState !== null) { + // This is a new mount or this boundary is already showing a fallback state. + // Mark this subtree context as having at least one invisible parent that could + // handle the fallback state. + // Boundaries without fallbacks or should be avoided are not considered since + // they cannot handle preferred fallback states. + if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) { + suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext); + } + } + } + + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + pushSuspenseContext(workInProgress, suspenseContext); // OK, the next part is confusing. We're about to reconcile the Suspense + // boundary's children. This involves some custom reconcilation logic. Two + // main reasons this is so complicated. + // + // First, Legacy Mode has different semantics for backwards compatibility. The + // primary tree will commit in an inconsistent state, so when we do the + // second pass to render the fallback, we do some exceedingly, uh, clever + // hacks to make that not totally break. Like transferring effects and + // deletions from hidden tree. In Concurrent Mode, it's much simpler, + // because we bailout on the primary tree completely and leave it in its old + // state, no effects. Same as what we do for Offscreen (except that + // Offscreen doesn't have the first render pass). + // + // Second is hydration. During hydration, the Suspense fiber has a slightly + // different layout, where the child points to a dehydrated fragment, which + // contains the DOM rendered by the server. + // + // Third, even if you set all that aside, Suspense is like error boundaries in + // that we first we try to render one tree, and if that fails, we render again + // and switch to a different tree. Like a try/catch block. So we have to track + // which branch we're currently rendering. Ideally we would model this using + // a stack. + + if (current === null) { + // Initial mount + // If we're currently hydrating, try to hydrate this boundary. + // But only if this has a fallback. + if (nextProps.fallback !== undefined) { + tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component. + } + + var nextPrimaryChildren = nextProps.children; + var nextFallbackChildren = nextProps.fallback; + + if (showFallback) { + var fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes); + var primaryChildFragment = workInProgress.child; + primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes); + workInProgress.memoizedState = SUSPENDED_MARKER; + return fallbackFragment; + } else if (typeof nextProps.unstable_expectedLoadTime === 'number') { + // This is a CPU-bound tree. Skip this tree and show a placeholder to + // unblock the surrounding content. Then immediately retry after the + // initial commit. + var _fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes); + + var _primaryChildFragment = workInProgress.child; + _primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes); + workInProgress.memoizedState = SUSPENDED_MARKER; // Since nothing actually suspended, there will nothing to ping this to + // get it started back up to attempt the next item. While in terms of + // priority this work has the same priority as this current render, it's + // not part of the same transition once the transition has committed. If + // it's sync, we still want to yield so that it can be painted. + // Conceptually, this is really the same as pinging. We can use any + // RetryLane even if it's the one currently rendering since we're leaving + // it behind on this node. + + workInProgress.lanes = SomeRetryLane; + + { + markSpawnedWork(SomeRetryLane); + } + + return _fallbackFragment; + } else { + return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren, renderLanes); + } + } else { + // This is an update. + // If the current fiber has a SuspenseState, that means it's already showing + // a fallback. + var prevState = current.memoizedState; + + if (prevState !== null) { + + if (showFallback) { + var _nextFallbackChildren2 = nextProps.fallback; + var _nextPrimaryChildren2 = nextProps.children; + + var _fallbackChildFragment = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren2, _nextFallbackChildren2, renderLanes); + + var _primaryChildFragment3 = workInProgress.child; + var prevOffscreenState = current.child.memoizedState; + _primaryChildFragment3.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes); + _primaryChildFragment3.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes); + workInProgress.memoizedState = SUSPENDED_MARKER; + return _fallbackChildFragment; + } else { + var _nextPrimaryChildren3 = nextProps.children; + + var _primaryChildFragment4 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren3, renderLanes); + + workInProgress.memoizedState = null; + return _primaryChildFragment4; + } + } else { + // The current tree is not already showing a fallback. + if (showFallback) { + // Timed out. + var _nextFallbackChildren3 = nextProps.fallback; + var _nextPrimaryChildren4 = nextProps.children; + + var _fallbackChildFragment2 = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren4, _nextFallbackChildren3, renderLanes); + + var _primaryChildFragment5 = workInProgress.child; + var _prevOffscreenState = current.child.memoizedState; + _primaryChildFragment5.memoizedState = _prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(_prevOffscreenState, renderLanes); + _primaryChildFragment5.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes); // Skip the primary children, and continue working on the + // fallback children. + + workInProgress.memoizedState = SUSPENDED_MARKER; + return _fallbackChildFragment2; + } else { + // Still haven't timed out. Continue rendering the children, like we + // normally do. + var _nextPrimaryChildren5 = nextProps.children; + + var _primaryChildFragment6 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren5, renderLanes); + + workInProgress.memoizedState = null; + return _primaryChildFragment6; + } + } + } +} + +function mountSuspensePrimaryChildren(workInProgress, primaryChildren, renderLanes) { + var mode = workInProgress.mode; + var primaryChildProps = { + mode: 'visible', + children: primaryChildren + }; + var primaryChildFragment = createFiberFromOffscreen(primaryChildProps, mode, renderLanes, null); + primaryChildFragment.return = workInProgress; + workInProgress.child = primaryChildFragment; + return primaryChildFragment; +} + +function mountSuspenseFallbackChildren(workInProgress, primaryChildren, fallbackChildren, renderLanes) { + var mode = workInProgress.mode; + var progressedPrimaryFragment = workInProgress.child; + var primaryChildProps = { + mode: 'hidden', + children: primaryChildren + }; + var primaryChildFragment; + var fallbackChildFragment; + + if ((mode & BlockingMode) === NoMode && progressedPrimaryFragment !== null) { + // In legacy mode, we commit the primary tree as if it successfully + // completed, even though it's in an inconsistent state. + primaryChildFragment = progressedPrimaryFragment; + primaryChildFragment.childLanes = NoLanes; + primaryChildFragment.pendingProps = primaryChildProps; + + if ( workInProgress.mode & ProfileMode) { + // Reset the durations from the first pass so they aren't included in the + // final amounts. This seems counterintuitive, since we're intentionally + // not measuring part of the render phase, but this makes it match what we + // do in Concurrent Mode. + primaryChildFragment.actualDuration = 0; + primaryChildFragment.actualStartTime = -1; + primaryChildFragment.selfBaseDuration = 0; + primaryChildFragment.treeBaseDuration = 0; + } + + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); + } else { + primaryChildFragment = createFiberFromOffscreen(primaryChildProps, mode, NoLanes, null); + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); + } + + primaryChildFragment.return = workInProgress; + fallbackChildFragment.return = workInProgress; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress.child = primaryChildFragment; + return fallbackChildFragment; +} + +function createWorkInProgressOffscreenFiber(current, offscreenProps) { + // The props argument to `createWorkInProgress` is `any` typed, so we use this + // wrapper function to constrain it. + return createWorkInProgress(current, offscreenProps); +} + +function updateSuspensePrimaryChildren(current, workInProgress, primaryChildren, renderLanes) { + var currentPrimaryChildFragment = current.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var primaryChildFragment = createWorkInProgressOffscreenFiber(currentPrimaryChildFragment, { + mode: 'visible', + children: primaryChildren + }); + + if ((workInProgress.mode & BlockingMode) === NoMode) { + primaryChildFragment.lanes = renderLanes; + } + + primaryChildFragment.return = workInProgress; + primaryChildFragment.sibling = null; + + if (currentFallbackChildFragment !== null) { + // Delete the fallback child fragment + currentFallbackChildFragment.nextEffect = null; + currentFallbackChildFragment.flags = Deletion; + workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChildFragment; + } + + workInProgress.child = primaryChildFragment; + return primaryChildFragment; +} + +function updateSuspenseFallbackChildren(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) { + var mode = workInProgress.mode; + var currentPrimaryChildFragment = current.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var primaryChildProps = { + mode: 'hidden', + children: primaryChildren + }; + var primaryChildFragment; + + if ( // In legacy mode, we commit the primary tree as if it successfully + // completed, even though it's in an inconsistent state. + (mode & BlockingMode) === NoMode && // Make sure we're on the second pass, i.e. the primary child fragment was + // already cloned. In legacy mode, the only case where this isn't true is + // when DevTools forces us to display a fallback; we skip the first render + // pass entirely and go straight to rendering the fallback. (In Concurrent + // Mode, SuspenseList can also trigger this scenario, but this is a legacy- + // only codepath.) + workInProgress.child !== currentPrimaryChildFragment) { + var progressedPrimaryFragment = workInProgress.child; + primaryChildFragment = progressedPrimaryFragment; + primaryChildFragment.childLanes = NoLanes; + primaryChildFragment.pendingProps = primaryChildProps; + + if ( workInProgress.mode & ProfileMode) { + // Reset the durations from the first pass so they aren't included in the + // final amounts. This seems counterintuitive, since we're intentionally + // not measuring part of the render phase, but this makes it match what we + // do in Concurrent Mode. + primaryChildFragment.actualDuration = 0; + primaryChildFragment.actualStartTime = -1; + primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration; + primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration; + } // The fallback fiber was added as a deletion effect during the first pass. + // However, since we're going to remain on the fallback, we no longer want + // to delete it. So we need to remove it from the list. Deletions are stored + // on the same list as effects. We want to keep the effects from the primary + // tree. So we copy the primary child fragment's effect list, which does not + // include the fallback deletion effect. + + + var progressedLastEffect = primaryChildFragment.lastEffect; + + if (progressedLastEffect !== null) { + workInProgress.firstEffect = primaryChildFragment.firstEffect; + workInProgress.lastEffect = progressedLastEffect; + progressedLastEffect.nextEffect = null; + } else { + // TODO: Reset this somewhere else? Lol legacy mode is so weird. + workInProgress.firstEffect = workInProgress.lastEffect = null; + } + } else { + primaryChildFragment = createWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps); + } + + var fallbackChildFragment; + + if (currentFallbackChildFragment !== null) { + fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren); + } else { + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); // Needs a placement effect because the parent (the Suspense boundary) already + // mounted but this is a new fiber. + + fallbackChildFragment.flags |= Placement; + } + + fallbackChildFragment.return = workInProgress; + primaryChildFragment.return = workInProgress; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress.child = primaryChildFragment; + return fallbackChildFragment; +} + +function scheduleWorkOnFiber(fiber, renderLanes) { + fiber.lanes = mergeLanes(fiber.lanes, renderLanes); + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, renderLanes); + } + + scheduleWorkOnParentPath(fiber.return, renderLanes); +} + +function propagateSuspenseContextChange(workInProgress, firstChild, renderLanes) { + // Mark any Suspense boundaries with fallbacks as having work to do. + // If they were previously forced into fallbacks, they may now be able + // to unblock. + var node = firstChild; + + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + + if (state !== null) { + scheduleWorkOnFiber(node, renderLanes); + } + } else if (node.tag === SuspenseListComponent) { + // If the tail is hidden there might not be an Suspense boundaries + // to schedule work on. In this case we have to schedule it on the + // list itself. + // We don't have to traverse to the children of the list since + // the list will propagate the change when it rerenders. + scheduleWorkOnFiber(node, renderLanes); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === workInProgress) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } +} + +function findLastContentRow(firstChild) { + // This is going to find the last row among these children that is already + // showing content on the screen, as opposed to being in fallback state or + // new. If a row has multiple Suspense boundaries, any of them being in the + // fallback state, counts as the whole row being in a fallback state. + // Note that the "rows" will be workInProgress, but any nested children + // will still be current since we haven't rendered them yet. The mounted + // order may not be the same as the new order. We use the new order. + var row = firstChild; + var lastContentRow = null; + + while (row !== null) { + var currentRow = row.alternate; // New rows can't be content rows. + + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + lastContentRow = row; + } + + row = row.sibling; + } + + return lastContentRow; +} + +function validateRevealOrder(revealOrder) { + { + if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) { + didWarnAboutRevealOrder[revealOrder] = true; + + if (typeof revealOrder === 'string') { + switch (revealOrder.toLowerCase()) { + case 'together': + case 'forwards': + case 'backwards': + { + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase()); + + break; + } + + case 'forward': + case 'backward': + { + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase()); + + break; + } + + default: + error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + + break; + } + } else { + error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + } + } + } +} + +function validateTailOptions(tailMode, revealOrder) { + { + if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) { + if (tailMode !== 'collapsed' && tailMode !== 'hidden') { + didWarnAboutTailOptions[tailMode] = true; + + error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode); + } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') { + didWarnAboutTailOptions[tailMode] = true; + + error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode); + } + } + } +} + +function validateSuspenseListNestedChild(childSlot, index) { + { + var isArray = Array.isArray(childSlot); + var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function'; + + if (isArray || isIterable) { + var type = isArray ? 'array' : 'iterable'; + + error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type); + + return false; + } + } + + return true; +} + +function validateSuspenseListChildren(children, revealOrder) { + { + if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) { + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + if (!validateSuspenseListNestedChild(children[i], i)) { + return; + } + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var childrenIterator = iteratorFn.call(children); + + if (childrenIterator) { + var step = childrenIterator.next(); + var _i = 0; + + for (; !step.done; step = childrenIterator.next()) { + if (!validateSuspenseListNestedChild(step.value, _i)) { + return; + } + + _i++; + } + } + } else { + error('A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder); + } + } + } + } +} + +function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) { + var renderState = workInProgress.memoizedState; + + if (renderState === null) { + workInProgress.memoizedState = { + isBackwards: isBackwards, + rendering: null, + renderingStartTime: 0, + last: lastContentRow, + tail: tail, + tailMode: tailMode, + lastEffect: lastEffectBeforeRendering + }; + } else { + // We can reuse the existing object from previous renders. + renderState.isBackwards = isBackwards; + renderState.rendering = null; + renderState.renderingStartTime = 0; + renderState.last = lastContentRow; + renderState.tail = tail; + renderState.tailMode = tailMode; + renderState.lastEffect = lastEffectBeforeRendering; + } +} // This can end up rendering this component multiple passes. +// The first pass splits the children fibers into two sets. A head and tail. +// We first render the head. If anything is in fallback state, we do another +// pass through beginWork to rerender all children (including the tail) with +// the force suspend context. If the first render didn't have anything in +// in fallback state. Then we render each row in the tail one-by-one. +// That happens in the completeWork phase without going back to beginWork. + + +function updateSuspenseListComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps; + var revealOrder = nextProps.revealOrder; + var tailMode = nextProps.tail; + var newChildren = nextProps.children; + validateRevealOrder(revealOrder); + validateTailOptions(tailMode, revealOrder); + validateSuspenseListChildren(newChildren, revealOrder); + reconcileChildren(current, workInProgress, newChildren, renderLanes); + var suspenseContext = suspenseStackCursor.current; + var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback); + + if (shouldForceFallback) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + workInProgress.flags |= DidCapture; + } else { + var didSuspendBefore = current !== null && (current.flags & DidCapture) !== NoFlags; + + if (didSuspendBefore) { + // If we previously forced a fallback, we need to schedule work + // on any nested boundaries to let them know to try to render + // again. This is the same as context updating. + propagateSuspenseContextChange(workInProgress, workInProgress.child, renderLanes); + } + + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + } + + pushSuspenseContext(workInProgress, suspenseContext); + + if ((workInProgress.mode & BlockingMode) === NoMode) { + // In legacy mode, SuspenseList doesn't work so we just + // use make it a noop by treating it as the default revealOrder. + workInProgress.memoizedState = null; + } else { + switch (revealOrder) { + case 'forwards': + { + var lastContentRow = findLastContentRow(workInProgress.child); + var tail; + + if (lastContentRow === null) { + // The whole list is part of the tail. + // TODO: We could fast path by just rendering the tail now. + tail = workInProgress.child; + workInProgress.child = null; + } else { + // Disconnect the tail rows after the content row. + // We're going to render them separately later. + tail = lastContentRow.sibling; + lastContentRow.sibling = null; + } + + initSuspenseListRenderState(workInProgress, false, // isBackwards + tail, lastContentRow, tailMode, workInProgress.lastEffect); + break; + } + + case 'backwards': + { + // We're going to find the first row that has existing content. + // At the same time we're going to reverse the list of everything + // we pass in the meantime. That's going to be our tail in reverse + // order. + var _tail = null; + var row = workInProgress.child; + workInProgress.child = null; + + while (row !== null) { + var currentRow = row.alternate; // New rows can't be content rows. + + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + // This is the beginning of the main content. + workInProgress.child = row; + break; + } + + var nextRow = row.sibling; + row.sibling = _tail; + _tail = row; + row = nextRow; + } // TODO: If workInProgress.child is null, we can continue on the tail immediately. + + + initSuspenseListRenderState(workInProgress, true, // isBackwards + _tail, null, // last + tailMode, workInProgress.lastEffect); + break; + } + + case 'together': + { + initSuspenseListRenderState(workInProgress, false, // isBackwards + null, // tail + null, // last + undefined, workInProgress.lastEffect); + break; + } + + default: + { + // The default reveal order is the same as not having + // a boundary. + workInProgress.memoizedState = null; + } + } + } + + return workInProgress.child; +} + +function updatePortalComponent(current, workInProgress, renderLanes) { + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); + var nextChildren = workInProgress.pendingProps; + + if (current === null) { + // Portals are special because we don't append the children during mount + // but at commit. Therefore we need to track insertions which the normal + // flow doesn't do during mount. This doesn't happen at the root because + // the root always starts with a "current" with a null child. + // TODO: Consider unifying this with how the root works. + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes); + } else { + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + } + + return workInProgress.child; +} + +var hasWarnedAboutUsingNoValuePropOnContextProvider = false; + +function updateContextProvider(current, workInProgress, renderLanes) { + var providerType = workInProgress.type; + var context = providerType._context; + var newProps = workInProgress.pendingProps; + var oldProps = workInProgress.memoizedProps; + var newValue = newProps.value; + + { + if (!('value' in newProps)) { + if (!hasWarnedAboutUsingNoValuePropOnContextProvider) { + hasWarnedAboutUsingNoValuePropOnContextProvider = true; + + error('The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?'); + } + } + + var providerPropTypes = workInProgress.type.propTypes; + + if (providerPropTypes) { + checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider'); + } + } + + pushProvider(workInProgress, newValue); + + if (oldProps !== null) { + var oldValue = oldProps.value; + var changedBits = calculateChangedBits(context, newValue, oldValue); + + if (changedBits === 0) { + // No change. Bailout early if children are the same. + if (oldProps.children === newProps.children && !hasContextChanged()) { + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + } else { + // The context value changed. Search for matching consumers and schedule + // them to update. + propagateContextChange(workInProgress, context, changedBits, renderLanes); + } + } + + var newChildren = newProps.children; + reconcileChildren(current, workInProgress, newChildren, renderLanes); + return workInProgress.child; +} + +var hasWarnedAboutUsingContextAsConsumer = false; + +function updateContextConsumer(current, workInProgress, renderLanes) { + var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In + // DEV mode, we create a separate object for Context.Consumer that acts + // like a proxy to Context. This proxy object adds unnecessary code in PROD + // so we use the old behaviour (Context.Consumer references Context) to + // reduce size and overhead. The separate object references context via + // a property called "_context", which also gives us the ability to check + // in DEV mode if this property exists or not and warn if it does not. + + { + if (context._context === undefined) { + // This may be because it's a Context (rather than a Consumer). + // Or it may be because it's older React where they're the same thing. + // We only want to warn if we're sure it's a new React. + if (context !== context.Consumer) { + if (!hasWarnedAboutUsingContextAsConsumer) { + hasWarnedAboutUsingContextAsConsumer = true; + + error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } + } + } else { + context = context._context; + } + } + + var newProps = workInProgress.pendingProps; + var render = newProps.children; + + { + if (typeof render !== 'function') { + error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.'); + } + } + + prepareToReadContext(workInProgress, renderLanes); + var newValue = readContext(context, newProps.unstable_observedBits); + var newChildren; + + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + newChildren = render(newValue); + setIsRendering(false); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + reconcileChildren(current, workInProgress, newChildren, renderLanes); + return workInProgress.child; +} + +function markWorkInProgressReceivedUpdate() { + didReceiveUpdate = true; +} + +function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) { + if (current !== null) { + // Reuse previous dependencies + workInProgress.dependencies = current.dependencies; + } + + { + // Don't update "base" render times for bailouts. + stopProfilerTimerIfRunning(); + } + + markSkippedUpdateLanes(workInProgress.lanes); // Check if the children have any pending work. + + if (!includesSomeLane(renderLanes, workInProgress.childLanes)) { + // The children don't have any work either. We can skip them. + // TODO: Once we add back resuming, we should check if the children are + // a work-in-progress set. If so, we need to transfer their effects. + return null; + } else { + // This fiber doesn't have work, but its subtree does. Clone the child + // fibers and continue. + cloneChildFibers(current, workInProgress); + return workInProgress.child; + } +} + +function remountFiber(current, oldWorkInProgress, newWorkInProgress) { + { + var returnFiber = oldWorkInProgress.return; + + if (returnFiber === null) { + throw new Error('Cannot swap the root fiber.'); + } // Disconnect from the old current. + // It will get deleted. + + + current.alternate = null; + oldWorkInProgress.alternate = null; // Connect to the new tree. + + newWorkInProgress.index = oldWorkInProgress.index; + newWorkInProgress.sibling = oldWorkInProgress.sibling; + newWorkInProgress.return = oldWorkInProgress.return; + newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it. + + if (oldWorkInProgress === returnFiber.child) { + returnFiber.child = newWorkInProgress; + } else { + var prevSibling = returnFiber.child; + + if (prevSibling === null) { + throw new Error('Expected parent to have a child.'); + } + + while (prevSibling.sibling !== oldWorkInProgress) { + prevSibling = prevSibling.sibling; + + if (prevSibling === null) { + throw new Error('Expected to find the previous sibling.'); + } + } + + prevSibling.sibling = newWorkInProgress; + } // Delete the old fiber and place the new one. + // Since the old fiber is disconnected, we have to schedule it manually. + + + var last = returnFiber.lastEffect; + + if (last !== null) { + last.nextEffect = current; + returnFiber.lastEffect = current; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = current; + } + + current.nextEffect = null; + current.flags = Deletion; + newWorkInProgress.flags |= Placement; // Restart work from the new fiber. + + return newWorkInProgress; + } +} + +function beginWork(current, workInProgress, renderLanes) { + var updateLanes = workInProgress.lanes; + + { + if (workInProgress._debugNeedsRemount && current !== null) { + // This will restart the begin phase with a new fiber. + return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes)); + } + } + + if (current !== null) { + var oldProps = current.memoizedProps; + var newProps = workInProgress.pendingProps; + + if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload: + workInProgress.type !== current.type )) { + // If props or context changed, mark the fiber as having performed work. + // This may be unset if the props are determined to be equal later (memo). + didReceiveUpdate = true; + } else if (!includesSomeLane(renderLanes, updateLanes)) { + didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering + // the begin phase. There's still some bookkeeping we that needs to be done + // in this optimized path, mostly pushing stuff onto the stack. + + switch (workInProgress.tag) { + case HostRoot: + pushHostRootContext(workInProgress); + resetHydrationState(); + break; + + case HostComponent: + pushHostContext(workInProgress); + break; + + case ClassComponent: + { + var Component = workInProgress.type; + + if (isContextProvider(Component)) { + pushContextProvider(workInProgress); + } + + break; + } + + case HostPortal: + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); + break; + + case ContextProvider: + { + var newValue = workInProgress.memoizedProps.value; + pushProvider(workInProgress, newValue); + break; + } + + case Profiler: + { + // Profiler should only call onRender when one of its descendants actually rendered. + var hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes); + + if (hasChildWork) { + workInProgress.flags |= Update; + } // Reset effect durations for the next eventual effect phase. + // These are reset during render to allow the DevTools commit hook a chance to read them, + + + var stateNode = workInProgress.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + + break; + + case SuspenseComponent: + { + var state = workInProgress.memoizedState; + + if (state !== null) { + // whether to retry the primary children, or to skip over it and + // go straight to the fallback. Check the priority of the primary + // child fragment. + + + var primaryChildFragment = workInProgress.child; + var primaryChildLanes = primaryChildFragment.childLanes; + + if (includesSomeLane(renderLanes, primaryChildLanes)) { + // The primary children have pending work. Use the normal path + // to attempt to render the primary children again. + return updateSuspenseComponent(current, workInProgress, renderLanes); + } else { + // The primary child fragment does not have pending work marked + // on it + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient + // priority. Bailout. + + var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + + if (child !== null) { + // The fallback children have pending work. Skip over the + // primary children and work on the fallback. + return child.sibling; + } else { + return null; + } + } + } else { + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); + } + + break; + } + + case SuspenseListComponent: + { + var didSuspendBefore = (current.flags & DidCapture) !== NoFlags; + + var _hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes); + + if (didSuspendBefore) { + if (_hasChildWork) { + // If something was in fallback state last time, and we have all the + // same children then we're still in progressive loading state. + // Something might get unblocked by state updates or retries in the + // tree which will affect the tail. So we need to use the normal + // path to compute the correct tail. + return updateSuspenseListComponent(current, workInProgress, renderLanes); + } // If none of the children had any work, that means that none of + // them got retried so they'll still be blocked in the same way + // as before. We can fast bail out. + + + workInProgress.flags |= DidCapture; + } // If nothing suspended before and we're rendering the same children, + // then the tail doesn't matter. Anything new that suspends will work + // in the "together" mode, so we can continue from the state we had. + + + var renderState = workInProgress.memoizedState; + + if (renderState !== null) { + // Reset to the "together" mode in case we've started a different + // update in the past but didn't complete it. + renderState.rendering = null; + renderState.tail = null; + renderState.lastEffect = null; + } + + pushSuspenseContext(workInProgress, suspenseStackCursor.current); + + if (_hasChildWork) { + break; + } else { + // If none of the children had any work, that means that none of + // them got retried so they'll still be blocked in the same way + // as before. We can fast bail out. + return null; + } + } + + case OffscreenComponent: + case LegacyHiddenComponent: + { + // Need to check if the tree still needs to be deferred. This is + // almost identical to the logic used in the normal update path, + // so we'll just enter that. The only difference is we'll bail out + // at the next level instead of this one, because the child props + // have not changed. Which is fine. + // TODO: Probably should refactor `beginWork` to split the bailout + // path from the normal path. I'm tempted to do a labeled break here + // but I won't :) + workInProgress.lanes = NoLanes; + return updateOffscreenComponent(current, workInProgress, renderLanes); + } + } + + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } else { + if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) { + // This is a special case that only exists for legacy mode. + // See https://github.com/facebook/react/pull/19216. + didReceiveUpdate = true; + } else { + // An update was scheduled on this fiber, but there are no new props + // nor legacy context. Set this to false. If an update queue or context + // consumer produces a changed value, it will set this to true. Otherwise, + // the component will assume the children have not changed and bail out. + didReceiveUpdate = false; + } + } + } else { + didReceiveUpdate = false; + } // Before entering the begin phase, clear pending update priority. + // TODO: This assumes that we're about to evaluate the component and process + // the update queue. However, there's an exception: SimpleMemoComponent + // sometimes bails out later in the begin phase. This indicates that we should + // move this assignment out of the common path and into each branch. + + + workInProgress.lanes = NoLanes; + + switch (workInProgress.tag) { + case IndeterminateComponent: + { + return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderLanes); + } + + case LazyComponent: + { + var elementType = workInProgress.elementType; + return mountLazyComponent(current, workInProgress, elementType, updateLanes, renderLanes); + } + + case FunctionComponent: + { + var _Component = workInProgress.type; + var unresolvedProps = workInProgress.pendingProps; + var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps); + return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderLanes); + } + + case ClassComponent: + { + var _Component2 = workInProgress.type; + var _unresolvedProps = workInProgress.pendingProps; + + var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps); + + return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderLanes); + } + + case HostRoot: + return updateHostRoot(current, workInProgress, renderLanes); + + case HostComponent: + return updateHostComponent(current, workInProgress, renderLanes); + + case HostText: + return updateHostText(current, workInProgress); + + case SuspenseComponent: + return updateSuspenseComponent(current, workInProgress, renderLanes); + + case HostPortal: + return updatePortalComponent(current, workInProgress, renderLanes); + + case ForwardRef: + { + var type = workInProgress.type; + var _unresolvedProps2 = workInProgress.pendingProps; + + var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2); + + return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderLanes); + } + + case Fragment: + return updateFragment(current, workInProgress, renderLanes); + + case Mode: + return updateMode(current, workInProgress, renderLanes); + + case Profiler: + return updateProfiler(current, workInProgress, renderLanes); + + case ContextProvider: + return updateContextProvider(current, workInProgress, renderLanes); + + case ContextConsumer: + return updateContextConsumer(current, workInProgress, renderLanes); + + case MemoComponent: + { + var _type2 = workInProgress.type; + var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props. + + var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3); + + { + if (workInProgress.type !== workInProgress.elementType) { + var outerPropTypes = _type2.propTypes; + + if (outerPropTypes) { + checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only + 'prop', getComponentName(_type2)); + } + } + } + + _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3); + return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateLanes, renderLanes); + } + + case SimpleMemoComponent: + { + return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateLanes, renderLanes); + } + + case IncompleteClassComponent: + { + var _Component3 = workInProgress.type; + var _unresolvedProps4 = workInProgress.pendingProps; + + var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4); + + return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderLanes); + } + + case SuspenseListComponent: + { + return updateSuspenseListComponent(current, workInProgress, renderLanes); + } + + case FundamentalComponent: + { + + break; + } + + case ScopeComponent: + { + + break; + } + + case Block: + { + + break; + } + + case OffscreenComponent: + { + return updateOffscreenComponent(current, workInProgress, renderLanes); + } + + case LegacyHiddenComponent: + { + return updateLegacyHiddenComponent(current, workInProgress, renderLanes); + } + } + + { + { + throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function markUpdate(workInProgress) { + // Tag the fiber with an update effect. This turns a Placement into + // a PlacementAndUpdate. + workInProgress.flags |= Update; +} + +function markRef$1(workInProgress) { + workInProgress.flags |= Ref; +} + +var appendAllChildren; +var updateHostContainer; +var updateHostComponent$1; +var updateHostText$1; + +{ + // Mutation mode + appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) { + // We only have the top Fiber that was created but we need recurse down its + // children to find all the terminal nodes. + var node = workInProgress.child; + + while (node !== null) { + if (node.tag === HostComponent || node.tag === HostText) { + appendInitialChild(parent, node.stateNode); + } else if (node.tag === HostPortal) ; else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === workInProgress) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + }; + + updateHostContainer = function (workInProgress) {// Noop + }; + + updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) { + // If we have an alternate, that means this is an update and we need to + // schedule a side-effect to do the updates. + var oldProps = current.memoizedProps; + + if (oldProps === newProps) { + // In mutation mode, this is sufficient for a bailout because + // we won't touch this node even if children changed. + return; + } // If we get updated because one of our children updated, we don't + // have newProps so we'll have to reuse them. + // TODO: Split the update API as separate for the props vs. children. + // Even better would be if children weren't special cased at all tho. + + + var instance = workInProgress.stateNode; + var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host + // component is hitting the resume path. Figure out why. Possibly + // related to `hidden`. + + var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component. + + workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there + // is a new ref we mark this as an update. All the work is done in commitWork. + + if (updatePayload) { + markUpdate(workInProgress); + } + }; + + updateHostText$1 = function (current, workInProgress, oldText, newText) { + // If the text differs, mark it as an update. All the work in done in commitWork. + if (oldText !== newText) { + markUpdate(workInProgress); + } + }; +} + +function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { + if (getIsHydrating()) { + // If we're hydrating, we should consume as many items as we can + // so we don't leave any behind. + return; + } + + switch (renderState.tailMode) { + case 'hidden': + { + // Any insertions at the end of the tail list after this point + // should be invisible. If there are already mounted boundaries + // anything before them are not considered for collapsing. + // Therefore we need to go through the whole tail to find if + // there are any. + var tailNode = renderState.tail; + var lastTailNode = null; + + while (tailNode !== null) { + if (tailNode.alternate !== null) { + lastTailNode = tailNode; + } + + tailNode = tailNode.sibling; + } // Next we're simply going to delete all insertions after the + // last rendered item. + + + if (lastTailNode === null) { + // All remaining items in the tail are insertions. + renderState.tail = null; + } else { + // Detach the insertion after the last node that was already + // inserted. + lastTailNode.sibling = null; + } + + break; + } + + case 'collapsed': + { + // Any insertions at the end of the tail list after this point + // should be invisible. If there are already mounted boundaries + // anything before them are not considered for collapsing. + // Therefore we need to go through the whole tail to find if + // there are any. + var _tailNode = renderState.tail; + var _lastTailNode = null; + + while (_tailNode !== null) { + if (_tailNode.alternate !== null) { + _lastTailNode = _tailNode; + } + + _tailNode = _tailNode.sibling; + } // Next we're simply going to delete all insertions after the + // last rendered item. + + + if (_lastTailNode === null) { + // All remaining items in the tail are insertions. + if (!hasRenderedATailFallback && renderState.tail !== null) { + // We suspended during the head. We want to show at least one + // row at the tail. So we'll keep on and cut off the rest. + renderState.tail.sibling = null; + } else { + renderState.tail = null; + } + } else { + // Detach the insertion after the last node that was already + // inserted. + _lastTailNode.sibling = null; + } + + break; + } + } +} + +function completeWork(current, workInProgress, renderLanes) { + var newProps = workInProgress.pendingProps; + + switch (workInProgress.tag) { + case IndeterminateComponent: + case LazyComponent: + case SimpleMemoComponent: + case FunctionComponent: + case ForwardRef: + case Fragment: + case Mode: + case Profiler: + case ContextConsumer: + case MemoComponent: + return null; + + case ClassComponent: + { + var Component = workInProgress.type; + + if (isContextProvider(Component)) { + popContext(workInProgress); + } + + return null; + } + + case HostRoot: + { + popHostContainer(workInProgress); + popTopLevelContextObject(workInProgress); + resetWorkInProgressVersions(); + var fiberRoot = workInProgress.stateNode; + + if (fiberRoot.pendingContext) { + fiberRoot.context = fiberRoot.pendingContext; + fiberRoot.pendingContext = null; + } + + if (current === null || current.child === null) { + // If we hydrated, pop so that we can delete any remaining children + // that weren't hydrated. + var wasHydrated = popHydrationState(workInProgress); + + if (wasHydrated) { + // If we hydrated, then we'll need to schedule an update for + // the commit side-effects on the root. + markUpdate(workInProgress); + } else if (!fiberRoot.hydrate) { + // Schedule an effect to clear this container at the start of the next commit. + // This handles the case of React rendering into a container with previous children. + // It's also safe to do for updates too, because current.child would only be null + // if the previous render was null (so the the container would already be empty). + workInProgress.flags |= Snapshot; + } + } + + updateHostContainer(workInProgress); + return null; + } + + case HostComponent: + { + popHostContext(workInProgress); + var rootContainerInstance = getRootHostContainer(); + var type = workInProgress.type; + + if (current !== null && workInProgress.stateNode != null) { + updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance); + + if (current.ref !== workInProgress.ref) { + markRef$1(workInProgress); + } + } else { + if (!newProps) { + if (!(workInProgress.stateNode !== null)) { + { + throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); + } + } // This can happen when we abort work. + + + return null; + } + + var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context + // "stack" as the parent. Then append children as we go in beginWork + // or completeWork depending on whether we want to add them top->down or + // bottom->up. Top->down is faster in IE11. + + var _wasHydrated = popHydrationState(workInProgress); + + if (_wasHydrated) { + // TODO: Move this and createInstance step into the beginPhase + // to consolidate. + if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) { + // If changes to the hydrated node need to be applied at the + // commit-phase we mark this as such. + markUpdate(workInProgress); + } + } else { + var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress); + appendAllChildren(instance, workInProgress, false, false); + workInProgress.stateNode = instance; // Certain renderers require commit-time effects for initial mount. + // (eg DOM renderer supports auto-focus for certain elements). + // Make sure such renderers get scheduled for later work. + + if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) { + markUpdate(workInProgress); + } + } + + if (workInProgress.ref !== null) { + // If there is a ref on a host node we need to schedule a callback + markRef$1(workInProgress); + } + } + + return null; + } + + case HostText: + { + var newText = newProps; + + if (current && workInProgress.stateNode != null) { + var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need + // to schedule a side-effect to do the updates. + + updateHostText$1(current, workInProgress, oldText, newText); + } else { + if (typeof newText !== 'string') { + if (!(workInProgress.stateNode !== null)) { + { + throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); + } + } // This can happen when we abort work. + + } + + var _rootContainerInstance = getRootHostContainer(); + + var _currentHostContext = getHostContext(); + + var _wasHydrated2 = popHydrationState(workInProgress); + + if (_wasHydrated2) { + if (prepareToHydrateHostTextInstance(workInProgress)) { + markUpdate(workInProgress); + } + } else { + workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress); + } + } + + return null; + } + + case SuspenseComponent: + { + popSuspenseContext(workInProgress); + var nextState = workInProgress.memoizedState; + + if ((workInProgress.flags & DidCapture) !== NoFlags) { + // Something suspended. Re-render with the fallback children. + workInProgress.lanes = renderLanes; // Do not reset the effect list. + + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress); + } + + return workInProgress; + } + + var nextDidTimeout = nextState !== null; + var prevDidTimeout = false; + + if (current === null) { + if (workInProgress.memoizedProps.fallback !== undefined) { + popHydrationState(workInProgress); + } + } else { + var prevState = current.memoizedState; + prevDidTimeout = prevState !== null; + } + + if (nextDidTimeout && !prevDidTimeout) { + // If this subtreee is running in blocking mode we can suspend, + // otherwise we won't suspend. + // TODO: This will still suspend a synchronous tree if anything + // in the concurrent tree already suspended during this render. + // This is a known bug. + if ((workInProgress.mode & BlockingMode) !== NoMode) { + // TODO: Move this back to throwException because this is too late + // if this is a large tree which is common for initial loads. We + // don't know if we should restart a render or not until we get + // this marker, and this is too late. + // If this render already had a ping or lower pri updates, + // and this is the first time we know we're going to suspend we + // should be able to immediately restart from within throwException. + var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true; + + if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) { + // If this was in an invisible tree or a new render, then showing + // this boundary is ok. + renderDidSuspend(); + } else { + // Otherwise, we're going to have to hide content so we should + // suspend for longer if possible. + renderDidSuspendDelayIfPossible(); + } + } + } + + { + // TODO: Only schedule updates if these values are non equal, i.e. it changed. + if (nextDidTimeout || prevDidTimeout) { + // If this boundary just timed out, schedule an effect to attach a + // retry listener to the promise. This flag is also used to hide the + // primary children. In mutation mode, we also need the flag to + // *unhide* children that were previously hidden, so check if this + // is currently timed out, too. + workInProgress.flags |= Update; + } + } + + return null; + } + + case HostPortal: + popHostContainer(workInProgress); + updateHostContainer(workInProgress); + + if (current === null) { + preparePortalMount(workInProgress.stateNode.containerInfo); + } + + return null; + + case ContextProvider: + // Pop provider fiber + popProvider(workInProgress); + return null; + + case IncompleteClassComponent: + { + // Same as class component case. I put it down here so that the tags are + // sequential to ensure this switch is compiled to a jump table. + var _Component = workInProgress.type; + + if (isContextProvider(_Component)) { + popContext(workInProgress); + } + + return null; + } + + case SuspenseListComponent: + { + popSuspenseContext(workInProgress); + var renderState = workInProgress.memoizedState; + + if (renderState === null) { + // We're running in the default, "independent" mode. + // We don't do anything in this mode. + return null; + } + + var didSuspendAlready = (workInProgress.flags & DidCapture) !== NoFlags; + var renderedTail = renderState.rendering; + + if (renderedTail === null) { + // We just rendered the head. + if (!didSuspendAlready) { + // This is the first pass. We need to figure out if anything is still + // suspended in the rendered set. + // If new content unsuspended, but there's still some content that + // didn't. Then we need to do a second pass that forces everything + // to keep showing their fallbacks. + // We might be suspended if something in this render pass suspended, or + // something in the previous committed pass suspended. Otherwise, + // there's no chance so we can skip the expensive call to + // findFirstSuspended. + var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.flags & DidCapture) === NoFlags); + + if (!cannotBeSuspended) { + var row = workInProgress.child; + + while (row !== null) { + var suspended = findFirstSuspended(row); + + if (suspended !== null) { + didSuspendAlready = true; + workInProgress.flags |= DidCapture; + cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as + // part of the second pass. In that case nothing will subscribe to + // its thennables. Instead, we'll transfer its thennables to the + // SuspenseList so that it can retry if they resolve. + // There might be multiple of these in the list but since we're + // going to wait for all of them anyway, it doesn't really matter + // which ones gets to ping. In theory we could get clever and keep + // track of how many dependencies remain but it gets tricky because + // in the meantime, we can add/remove/change items and dependencies. + // We might bail out of the loop before finding any but that + // doesn't matter since that means that the other boundaries that + // we did find already has their listeners attached. + + var newThennables = suspended.updateQueue; + + if (newThennables !== null) { + workInProgress.updateQueue = newThennables; + workInProgress.flags |= Update; + } // Rerender the whole list, but this time, we'll force fallbacks + // to stay in place. + // Reset the effect list before doing the second pass since that's now invalid. + + + if (renderState.lastEffect === null) { + workInProgress.firstEffect = null; + } + + workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state. + + resetChildFibers(workInProgress, renderLanes); // Set up the Suspense Context to force suspense and immediately + // rerender the children. + + pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); + return workInProgress.child; + } + + row = row.sibling; + } + } + + if (renderState.tail !== null && now() > getRenderTargetTime()) { + // We have already passed our CPU deadline but we still have rows + // left in the tail. We'll just give up further attempts to render + // the main content and only render fallbacks. + workInProgress.flags |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this + // to get it started back up to attempt the next item. While in terms + // of priority this work has the same priority as this current render, + // it's not part of the same transition once the transition has + // committed. If it's sync, we still want to yield so that it can be + // painted. Conceptually, this is really the same as pinging. + // We can use any RetryLane even if it's the one currently rendering + // since we're leaving it behind on this node. + + workInProgress.lanes = SomeRetryLane; + + { + markSpawnedWork(SomeRetryLane); + } + } + } else { + cutOffTailIfNeeded(renderState, false); + } // Next we're going to render the tail. + + } else { + // Append the rendered row to the child list. + if (!didSuspendAlready) { + var _suspended = findFirstSuspended(renderedTail); + + if (_suspended !== null) { + workInProgress.flags |= DidCapture; + didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't + // get lost if this row ends up dropped during a second pass. + + var _newThennables = _suspended.updateQueue; + + if (_newThennables !== null) { + workInProgress.updateQueue = _newThennables; + workInProgress.flags |= Update; + } + + cutOffTailIfNeeded(renderState, true); // This might have been modified. + + if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate && !getIsHydrating() // We don't cut it if we're hydrating. + ) { + // We need to delete the row we just rendered. + // Reset the effect list to what it was before we rendered this + // child. The nested children have already appended themselves. + var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point. + + if (lastEffect !== null) { + lastEffect.nextEffect = null; + } // We're done. + + + return null; + } + } else if ( // The time it took to render last row is greater than the remaining + // time we have to render. So rendering one more row would likely + // exceed it. + now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes !== OffscreenLane) { + // We have now passed our CPU deadline and we'll just give up further + // attempts to render the main content and only render fallbacks. + // The assumption is that this is usually faster. + workInProgress.flags |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this + // to get it started back up to attempt the next item. While in terms + // of priority this work has the same priority as this current render, + // it's not part of the same transition once the transition has + // committed. If it's sync, we still want to yield so that it can be + // painted. Conceptually, this is really the same as pinging. + // We can use any RetryLane even if it's the one currently rendering + // since we're leaving it behind on this node. + + workInProgress.lanes = SomeRetryLane; + + { + markSpawnedWork(SomeRetryLane); + } + } + } + + if (renderState.isBackwards) { + // The effect list of the backwards tail will have been added + // to the end. This breaks the guarantee that life-cycles fire in + // sibling order but that isn't a strong guarantee promised by React. + // Especially since these might also just pop in during future commits. + // Append to the beginning of the list. + renderedTail.sibling = workInProgress.child; + workInProgress.child = renderedTail; + } else { + var previousSibling = renderState.last; + + if (previousSibling !== null) { + previousSibling.sibling = renderedTail; + } else { + workInProgress.child = renderedTail; + } + + renderState.last = renderedTail; + } + } + + if (renderState.tail !== null) { + // We still have tail rows to render. + // Pop a row. + var next = renderState.tail; + renderState.rendering = next; + renderState.tail = next.sibling; + renderState.lastEffect = workInProgress.lastEffect; + renderState.renderingStartTime = now(); + next.sibling = null; // Restore the context. + // TODO: We can probably just avoid popping it instead and only + // setting it the first time we go from not suspended to suspended. + + var suspenseContext = suspenseStackCursor.current; + + if (didSuspendAlready) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + } else { + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + } + + pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row. + + return next; + } + + return null; + } + + case FundamentalComponent: + { + + break; + } + + case ScopeComponent: + { + + break; + } + + case Block: + + break; + + case OffscreenComponent: + case LegacyHiddenComponent: + { + popRenderLanes(workInProgress); + + if (current !== null) { + var _nextState = workInProgress.memoizedState; + var _prevState = current.memoizedState; + var prevIsHidden = _prevState !== null; + var nextIsHidden = _nextState !== null; + + if (prevIsHidden !== nextIsHidden && newProps.mode !== 'unstable-defer-without-hiding') { + workInProgress.flags |= Update; + } + } + + return null; + } + } + + { + { + throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function unwindWork(workInProgress, renderLanes) { + switch (workInProgress.tag) { + case ClassComponent: + { + var Component = workInProgress.type; + + if (isContextProvider(Component)) { + popContext(workInProgress); + } + + var flags = workInProgress.flags; + + if (flags & ShouldCapture) { + workInProgress.flags = flags & ~ShouldCapture | DidCapture; + + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress); + } + + return workInProgress; + } + + return null; + } + + case HostRoot: + { + popHostContainer(workInProgress); + popTopLevelContextObject(workInProgress); + resetWorkInProgressVersions(); + var _flags = workInProgress.flags; + + if (!((_flags & DidCapture) === NoFlags)) { + { + throw Error( "The root failed to unmount after an error. This is likely a bug in React. Please file an issue." ); + } + } + + workInProgress.flags = _flags & ~ShouldCapture | DidCapture; + return workInProgress; + } + + case HostComponent: + { + // TODO: popHydrationState + popHostContext(workInProgress); + return null; + } + + case SuspenseComponent: + { + popSuspenseContext(workInProgress); + + var _flags2 = workInProgress.flags; + + if (_flags2 & ShouldCapture) { + workInProgress.flags = _flags2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary. + + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress); + } + + return workInProgress; + } + + return null; + } + + case SuspenseListComponent: + { + popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been + // caught by a nested boundary. If not, it should bubble through. + + return null; + } + + case HostPortal: + popHostContainer(workInProgress); + return null; + + case ContextProvider: + popProvider(workInProgress); + return null; + + case OffscreenComponent: + case LegacyHiddenComponent: + popRenderLanes(workInProgress); + return null; + + default: + return null; + } +} + +function unwindInterruptedWork(interruptedWork) { + switch (interruptedWork.tag) { + case ClassComponent: + { + var childContextTypes = interruptedWork.type.childContextTypes; + + if (childContextTypes !== null && childContextTypes !== undefined) { + popContext(interruptedWork); + } + + break; + } + + case HostRoot: + { + popHostContainer(interruptedWork); + popTopLevelContextObject(interruptedWork); + resetWorkInProgressVersions(); + break; + } + + case HostComponent: + { + popHostContext(interruptedWork); + break; + } + + case HostPortal: + popHostContainer(interruptedWork); + break; + + case SuspenseComponent: + popSuspenseContext(interruptedWork); + break; + + case SuspenseListComponent: + popSuspenseContext(interruptedWork); + break; + + case ContextProvider: + popProvider(interruptedWork); + break; + + case OffscreenComponent: + case LegacyHiddenComponent: + popRenderLanes(interruptedWork); + break; + } +} + +function createCapturedValue(value, source) { + // If the value is an error, call this function immediately after it is thrown + // so the stack is accurate. + return { + value: value, + source: source, + stack: getStackByFiberInDevAndProd(source) + }; +} + +// This module is forked in different environments. +// By default, return `true` to log errors to the console. +// Forks can return `false` if this isn't desirable. +function showErrorDialog(boundary, errorInfo) { + return true; +} + +function logCapturedError(boundary, errorInfo) { + try { + var logError = showErrorDialog(boundary, errorInfo); // Allow injected showErrorDialog() to prevent default console.error logging. + // This enables renderers like ReactNative to better manage redbox behavior. + + if (logError === false) { + return; + } + + var error = errorInfo.value; + + if (true) { + var source = errorInfo.source; + var stack = errorInfo.stack; + var componentStack = stack !== null ? stack : ''; // Browsers support silencing uncaught errors by calling + // `preventDefault()` in window `error` handler. + // We record this information as an expando on the error. + + if (error != null && error._suppressLogging) { + if (boundary.tag === ClassComponent) { + // The error is recoverable and was silenced. + // Ignore it and don't print the stack addendum. + // This is handy for testing error boundaries without noise. + return; + } // The error is fatal. Since the silencing might have + // been accidental, we'll surface it anyway. + // However, the browser would have silenced the original error + // so we'll print it first, and then print the stack addendum. + + + console['error'](error); // Don't transform to our wrapper + // For a more detailed description of this block, see: + // https://github.com/facebook/react/pull/13384 + } + + var componentName = source ? getComponentName(source.type) : null; + var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:'; + var errorBoundaryMessage; + var errorBoundaryName = getComponentName(boundary.type); + + if (errorBoundaryName) { + errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + "."); + } else { + errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.'; + } + + var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack. + // We don't include the original error message and JS stack because the browser + // has already printed it. Even if the application swallows the error, it is still + // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils. + + console['error'](combinedMessage); // Don't transform to our wrapper + } else {} + } catch (e) { + // This method must not throw, or React internal state will get messed up. + // If console.error is overridden, or logCapturedError() shows a dialog that throws, + // we want to report this error outside of the normal stack as a last resort. + // https://github.com/facebook/react/issues/13188 + setTimeout(function () { + throw e; + }); + } +} + +var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map; + +function createRootErrorUpdate(fiber, errorInfo, lane) { + var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null. + + update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property + // being called "element". + + update.payload = { + element: null + }; + var error = errorInfo.value; + + update.callback = function () { + onUncaughtError(error); + logCapturedError(fiber, errorInfo); + }; + + return update; +} + +function createClassErrorUpdate(fiber, errorInfo, lane) { + var update = createUpdate(NoTimestamp, lane); + update.tag = CaptureUpdate; + var getDerivedStateFromError = fiber.type.getDerivedStateFromError; + + if (typeof getDerivedStateFromError === 'function') { + var error$1 = errorInfo.value; + + update.payload = function () { + logCapturedError(fiber, errorInfo); + return getDerivedStateFromError(error$1); + }; + } + + var inst = fiber.stateNode; + + if (inst !== null && typeof inst.componentDidCatch === 'function') { + update.callback = function callback() { + { + markFailedErrorBoundaryForHotReloading(fiber); + } + + if (typeof getDerivedStateFromError !== 'function') { + // To preserve the preexisting retry behavior of error boundaries, + // we keep track of which ones already failed during this batch. + // This gets reset before we yield back to the browser. + // TODO: Warn in strict mode if getDerivedStateFromError is + // not defined. + markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined + + logCapturedError(fiber, errorInfo); + } + + var error$1 = errorInfo.value; + var stack = errorInfo.stack; + this.componentDidCatch(error$1, { + componentStack: stack !== null ? stack : '' + }); + + { + if (typeof getDerivedStateFromError !== 'function') { + // If componentDidCatch is the only error boundary method defined, + // then it needs to call setState to recover from errors. + // If no state update is scheduled then the boundary will swallow the error. + if (!includesSomeLane(fiber.lanes, SyncLane)) { + error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown'); + } + } + } + }; + } else { + update.callback = function () { + markFailedErrorBoundaryForHotReloading(fiber); + }; + } + + return update; +} + +function attachPingListener(root, wakeable, lanes) { + // Attach a listener to the promise to "ping" the root and retry. But only if + // one does not already exist for the lanes we're currently rendering (which + // acts like a "thread ID" here). + var pingCache = root.pingCache; + var threadIDs; + + if (pingCache === null) { + pingCache = root.pingCache = new PossiblyWeakMap$1(); + threadIDs = new Set(); + pingCache.set(wakeable, threadIDs); + } else { + threadIDs = pingCache.get(wakeable); + + if (threadIDs === undefined) { + threadIDs = new Set(); + pingCache.set(wakeable, threadIDs); + } + } + + if (!threadIDs.has(lanes)) { + // Memoize using the thread ID to prevent redundant listeners. + threadIDs.add(lanes); + var ping = pingSuspendedRoot.bind(null, root, wakeable, lanes); + wakeable.then(ping, ping); + } +} + +function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) { + // The source fiber did not complete. + sourceFiber.flags |= Incomplete; // Its effect list is no longer valid. + + sourceFiber.firstEffect = sourceFiber.lastEffect = null; + + if (value !== null && typeof value === 'object' && typeof value.then === 'function') { + // This is a wakeable. + var wakeable = value; + + if ((sourceFiber.mode & BlockingMode) === NoMode) { + // Reset the memoizedState to what it was before we attempted + // to render it. + var currentSource = sourceFiber.alternate; + + if (currentSource) { + sourceFiber.updateQueue = currentSource.updateQueue; + sourceFiber.memoizedState = currentSource.memoizedState; + sourceFiber.lanes = currentSource.lanes; + } else { + sourceFiber.updateQueue = null; + sourceFiber.memoizedState = null; + } + } + + var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view. + + var _workInProgress = returnFiber; + + do { + if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) { + // Found the nearest boundary. + // Stash the promise on the boundary fiber. If the boundary times out, we'll + // attach another listener to flip the boundary back to its normal state. + var wakeables = _workInProgress.updateQueue; + + if (wakeables === null) { + var updateQueue = new Set(); + updateQueue.add(wakeable); + _workInProgress.updateQueue = updateQueue; + } else { + wakeables.add(wakeable); + } // If the boundary is outside of blocking mode, we should *not* + // suspend the commit. Pretend as if the suspended component rendered + // null and keep rendering. In the commit phase, we'll schedule a + // subsequent synchronous update to re-render the Suspense. + // + // Note: It doesn't matter whether the component that suspended was + // inside a blocking mode tree. If the Suspense is outside of it, we + // should *not* suspend the commit. + + + if ((_workInProgress.mode & BlockingMode) === NoMode) { + _workInProgress.flags |= DidCapture; + sourceFiber.flags |= ForceUpdateForLegacySuspense; // We're going to commit this fiber even though it didn't complete. + // But we shouldn't call any lifecycle methods or callbacks. Remove + // all lifecycle effect tags. + + sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete); + + if (sourceFiber.tag === ClassComponent) { + var currentSourceFiber = sourceFiber.alternate; + + if (currentSourceFiber === null) { + // This is a new mount. Change the tag so it's not mistaken for a + // completed class component. For example, we should not call + // componentWillUnmount if it is deleted. + sourceFiber.tag = IncompleteClassComponent; + } else { + // When we try rendering again, we should not reuse the current fiber, + // since it's known to be in an inconsistent state. Use a force update to + // prevent a bail out. + var update = createUpdate(NoTimestamp, SyncLane); + update.tag = ForceUpdate; + enqueueUpdate(sourceFiber, update); + } + } // The source fiber did not complete. Mark it with Sync priority to + // indicate that it still has pending work. + + + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane); // Exit without suspending. + + return; + } // Confirmed that the boundary is in a concurrent mode tree. Continue + // with the normal suspend path. + // + // After this we'll use a set of heuristics to determine whether this + // render pass will run to completion or restart or "suspend" the commit. + // The actual logic for this is spread out in different places. + // + // This first principle is that if we're going to suspend when we complete + // a root, then we should also restart if we get an update or ping that + // might unsuspend it, and vice versa. The only reason to suspend is + // because you think you might want to restart before committing. However, + // it doesn't make sense to restart only while in the period we're suspended. + // + // Restarting too aggressively is also not good because it starves out any + // intermediate loading state. So we use heuristics to determine when. + // Suspense Heuristics + // + // If nothing threw a Promise or all the same fallbacks are already showing, + // then don't suspend/restart. + // + // If this is an initial render of a new tree of Suspense boundaries and + // those trigger a fallback, then don't suspend/restart. We want to ensure + // that we can show the initial loading state as quickly as possible. + // + // If we hit a "Delayed" case, such as when we'd switch from content back into + // a fallback, then we should always suspend/restart. Transitions apply + // to this case. If none is defined, JND is used instead. + // + // If we're already showing a fallback and it gets "retried", allowing us to show + // another level, but there's still an inner boundary that would show a fallback, + // then we suspend/restart for 500ms since the last time we showed a fallback + // anywhere in the tree. This effectively throttles progressive loading into a + // consistent train of commits. This also gives us an opportunity to restart to + // get to the completed state slightly earlier. + // + // If there's ambiguity due to batching it's resolved in preference of: + // 1) "delayed", 2) "initial render", 3) "retry". + // + // We want to ensure that a "busy" state doesn't get force committed. We want to + // ensure that new initial loading states can commit as soon as possible. + + + attachPingListener(root, wakeable, rootRenderLanes); + _workInProgress.flags |= ShouldCapture; + _workInProgress.lanes = rootRenderLanes; + return; + } // This boundary already captured during this render. Continue to the next + // boundary. + + + _workInProgress = _workInProgress.return; + } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode. + // TODO: Use invariant so the message is stripped in prod? + + + value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.'); + } // We didn't find a boundary that could handle this type of exception. Start + // over and traverse parent path again, this time treating the exception + // as an error. + + + renderDidError(); + value = createCapturedValue(value, sourceFiber); + var workInProgress = returnFiber; + + do { + switch (workInProgress.tag) { + case HostRoot: + { + var _errorInfo = value; + workInProgress.flags |= ShouldCapture; + var lane = pickArbitraryLane(rootRenderLanes); + workInProgress.lanes = mergeLanes(workInProgress.lanes, lane); + + var _update = createRootErrorUpdate(workInProgress, _errorInfo, lane); + + enqueueCapturedUpdate(workInProgress, _update); + return; + } + + case ClassComponent: + // Capture and retry + var errorInfo = value; + var ctor = workInProgress.type; + var instance = workInProgress.stateNode; + + if ((workInProgress.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) { + workInProgress.flags |= ShouldCapture; + + var _lane = pickArbitraryLane(rootRenderLanes); + + workInProgress.lanes = mergeLanes(workInProgress.lanes, _lane); // Schedule the error boundary to re-render using updated state + + var _update2 = createClassErrorUpdate(workInProgress, errorInfo, _lane); + + enqueueCapturedUpdate(workInProgress, _update2); + return; + } + + break; + } + + workInProgress = workInProgress.return; + } while (workInProgress !== null); +} + +var didWarnAboutUndefinedSnapshotBeforeUpdate = null; + +{ + didWarnAboutUndefinedSnapshotBeforeUpdate = new Set(); +} + +var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set; + +var callComponentWillUnmountWithTimer = function (current, instance) { + instance.props = current.memoizedProps; + instance.state = current.memoizedState; + + { + instance.componentWillUnmount(); + } +}; // Capture errors so they don't interrupt unmounting. + + +function safelyCallComponentWillUnmount(current, instance) { + { + invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance); + + if (hasCaughtError()) { + var unmountError = clearCaughtError(); + captureCommitPhaseError(current, unmountError); + } + } +} + +function safelyDetachRef(current) { + var ref = current.ref; + + if (ref !== null) { + if (typeof ref === 'function') { + { + invokeGuardedCallback(null, ref, null, null); + + if (hasCaughtError()) { + var refError = clearCaughtError(); + captureCommitPhaseError(current, refError); + } + } + } else { + ref.current = null; + } + } +} + +function safelyCallDestroy(current, destroy) { + { + invokeGuardedCallback(null, destroy, null); + + if (hasCaughtError()) { + var error = clearCaughtError(); + captureCommitPhaseError(current, error); + } + } +} + +function commitBeforeMutationLifeCycles(current, finishedWork) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + case Block: + { + return; + } + + case ClassComponent: + { + if (finishedWork.flags & Snapshot) { + if (current !== null) { + var prevProps = current.memoizedProps; + var prevState = current.memoizedState; + var instance = finishedWork.stateNode; // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } + + var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState); + + { + var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate; + + if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) { + didWarnSet.add(finishedWork.type); + + error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type)); + } + } + + instance.__reactInternalSnapshotBeforeUpdate = snapshot; + } + } + + return; + } + + case HostRoot: + { + { + if (finishedWork.flags & Snapshot) { + var root = finishedWork.stateNode; + clearContainer(root.containerInfo); + } + } + + return; + } + + case HostComponent: + case HostText: + case HostPortal: + case IncompleteClassComponent: + // Nothing to do for these component types + return; + } + + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function commitHookEffectListUnmount(tag, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + if ((effect.tag & tag) === tag) { + // Unmount + var destroy = effect.destroy; + effect.destroy = undefined; + + if (destroy !== undefined) { + destroy(); + } + } + + effect = effect.next; + } while (effect !== firstEffect); + } +} + +function commitHookEffectListMount(tag, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + if ((effect.tag & tag) === tag) { + // Mount + var create = effect.create; + effect.destroy = create(); + + { + var destroy = effect.destroy; + + if (destroy !== undefined && typeof destroy !== 'function') { + var addendum = void 0; + + if (destroy === null) { + addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).'; + } else if (typeof destroy.then === 'function') { + addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + ' async function fetchData() {\n' + ' // You can await here\n' + ' const response = await MyAPI.getData(someId);\n' + ' // ...\n' + ' }\n' + ' fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://reactjs.org/link/hooks-data-fetching'; + } else { + addendum = ' You returned: ' + destroy; + } + + error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s', addendum); + } + } + } + + effect = effect.next; + } while (effect !== firstEffect); + } +} + +function schedulePassiveEffects(finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + var _effect = effect, + next = _effect.next, + tag = _effect.tag; + + if ((tag & Passive$1) !== NoFlags$1 && (tag & HasEffect) !== NoFlags$1) { + enqueuePendingPassiveHookEffectUnmount(finishedWork, effect); + enqueuePendingPassiveHookEffectMount(finishedWork, effect); + } + + effect = next; + } while (effect !== firstEffect); + } +} + +function commitLifeCycles(finishedRoot, current, finishedWork, committedLanes) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + case Block: + { + // At this point layout effects have already been destroyed (during mutation phase). + // This is done to prevent sibling component effects from interfering with each other, + // e.g. a destroy function in one component should never override a ref set + // by a create function in another component during the same commit. + { + commitHookEffectListMount(Layout | HasEffect, finishedWork); + } + + schedulePassiveEffects(finishedWork); + return; + } + + case ClassComponent: + { + var instance = finishedWork.stateNode; + + if (finishedWork.flags & Update) { + if (current === null) { + // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } + + { + instance.componentDidMount(); + } + } else { + var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps); + var prevState = current.memoizedState; // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } + + { + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate); + } + } + } // TODO: I think this is now always non-null by the time it reaches the + // commit phase. Consider removing the type check. + + + var updateQueue = finishedWork.updateQueue; + + if (updateQueue !== null) { + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + + commitUpdateQueue(finishedWork, updateQueue, instance); + } + + return; + } + + case HostRoot: + { + // TODO: I think this is now always non-null by the time it reaches the + // commit phase. Consider removing the type check. + var _updateQueue = finishedWork.updateQueue; + + if (_updateQueue !== null) { + var _instance = null; + + if (finishedWork.child !== null) { + switch (finishedWork.child.tag) { + case HostComponent: + _instance = getPublicInstance(finishedWork.child.stateNode); + break; + + case ClassComponent: + _instance = finishedWork.child.stateNode; + break; + } + } + + commitUpdateQueue(finishedWork, _updateQueue, _instance); + } + + return; + } + + case HostComponent: + { + var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted + // (eg DOM renderer may schedule auto-focus for inputs and form controls). + // These effects should only be committed when components are first mounted, + // aka when there is no current/alternate. + + if (current === null && finishedWork.flags & Update) { + var type = finishedWork.type; + var props = finishedWork.memoizedProps; + commitMount(_instance2, type, props); + } + + return; + } + + case HostText: + { + // We have no life-cycles associated with text. + return; + } + + case HostPortal: + { + // We have no life-cycles associated with portals. + return; + } + + case Profiler: + { + { + var _finishedWork$memoize2 = finishedWork.memoizedProps, + onCommit = _finishedWork$memoize2.onCommit, + onRender = _finishedWork$memoize2.onRender; + var effectDuration = finishedWork.stateNode.effectDuration; + var commitTime = getCommitTime(); + + if (typeof onRender === 'function') { + { + onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime, finishedRoot.memoizedInteractions); + } + } + } + + return; + } + + case SuspenseComponent: + { + commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); + return; + } + + case SuspenseListComponent: + case IncompleteClassComponent: + case FundamentalComponent: + case ScopeComponent: + case OffscreenComponent: + case LegacyHiddenComponent: + return; + } + + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function hideOrUnhideAllChildren(finishedWork, isHidden) { + { + // We only have the top Fiber that was inserted but we need to recurse down its + // children to find all the terminal nodes. + var node = finishedWork; + + while (true) { + if (node.tag === HostComponent) { + var instance = node.stateNode; + + if (isHidden) { + hideInstance(instance); + } else { + unhideInstance(node.stateNode, node.memoizedProps); + } + } else if (node.tag === HostText) { + var _instance3 = node.stateNode; + + if (isHidden) { + hideTextInstance(_instance3); + } else { + unhideTextInstance(_instance3, node.memoizedProps); + } + } else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork) ; else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === finishedWork) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === finishedWork) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + } +} + +function commitAttachRef(finishedWork) { + var ref = finishedWork.ref; + + if (ref !== null) { + var instance = finishedWork.stateNode; + var instanceToUse; + + switch (finishedWork.tag) { + case HostComponent: + instanceToUse = getPublicInstance(instance); + break; + + default: + instanceToUse = instance; + } // Moved outside to ensure DCE works with this flag + + if (typeof ref === 'function') { + ref(instanceToUse); + } else { + { + if (!ref.hasOwnProperty('current')) { + error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().', getComponentName(finishedWork.type)); + } + } + + ref.current = instanceToUse; + } + } +} + +function commitDetachRef(current) { + var currentRef = current.ref; + + if (currentRef !== null) { + if (typeof currentRef === 'function') { + currentRef(null); + } else { + currentRef.current = null; + } + } +} // User-originating errors (lifecycles and refs) should not interrupt +// deletion, so don't let them throw. Host-originating errors should +// interrupt deletion, so it's okay + + +function commitUnmount(finishedRoot, current, renderPriorityLevel) { + onCommitUnmount(current); + + switch (current.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: + case Block: + { + var updateQueue = current.updateQueue; + + if (updateQueue !== null) { + var lastEffect = updateQueue.lastEffect; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + var _effect2 = effect, + destroy = _effect2.destroy, + tag = _effect2.tag; + + if (destroy !== undefined) { + if ((tag & Passive$1) !== NoFlags$1) { + enqueuePendingPassiveHookEffectUnmount(current, effect); + } else { + { + safelyCallDestroy(current, destroy); + } + } + } + + effect = effect.next; + } while (effect !== firstEffect); + } + } + + return; + } + + case ClassComponent: + { + safelyDetachRef(current); + var instance = current.stateNode; + + if (typeof instance.componentWillUnmount === 'function') { + safelyCallComponentWillUnmount(current, instance); + } + + return; + } + + case HostComponent: + { + safelyDetachRef(current); + return; + } + + case HostPortal: + { + // TODO: this is recursive. + // We are also not using this parent because + // the portal will get pushed immediately. + { + unmountHostComponents(finishedRoot, current); + } + + return; + } + + case FundamentalComponent: + { + + return; + } + + case DehydratedFragment: + { + + return; + } + + case ScopeComponent: + { + + return; + } + } +} + +function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) { + // While we're inside a removed host node we don't want to call + // removeChild on the inner nodes because they're removed by the top + // call anyway. We also want to call componentWillUnmount on all + // composites before this host node is removed from the tree. Therefore + // we do an inner loop while we're still inside the host node. + var node = root; + + while (true) { + commitUnmount(finishedRoot, node); // Visit children because they may contain more composite or host nodes. + // Skip portals because commitUnmount() currently visits them recursively. + + if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above. + // If we don't use mutation we drill down into portals here instead. + node.tag !== HostPortal)) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === root) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === root) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } +} + +function detachFiberMutation(fiber) { + // Cut off the return pointers to disconnect it from the tree. Ideally, we + // should clear the child pointer of the parent alternate to let this + // get GC:ed but we don't know which for sure which parent is the current + // one so we'll settle for GC:ing the subtree of this child. This child + // itself will be GC:ed when the parent updates the next time. + // Note: we cannot null out sibling here, otherwise it can cause issues + // with findDOMNode and how it requires the sibling field to carry out + // traversal in a later effect. See PR #16820. We now clear the sibling + // field after effects, see: detachFiberAfterEffects. + // + // Don't disconnect stateNode now; it will be detached in detachFiberAfterEffects. + // It may be required if the current component is an error boundary, + // and one of its descendants throws while unmounting a passive effect. + fiber.alternate = null; + fiber.child = null; + fiber.dependencies = null; + fiber.firstEffect = null; + fiber.lastEffect = null; + fiber.memoizedProps = null; + fiber.memoizedState = null; + fiber.pendingProps = null; + fiber.return = null; + fiber.updateQueue = null; + + { + fiber._debugOwner = null; + } +} + +function getHostParentFiber(fiber) { + var parent = fiber.return; + + while (parent !== null) { + if (isHostParent(parent)) { + return parent; + } + + parent = parent.return; + } + + { + { + throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function isHostParent(fiber) { + return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal; +} + +function getHostSibling(fiber) { + // We're going to search forward into the tree until we find a sibling host + // node. Unfortunately, if multiple insertions are done in a row we have to + // search past them. This leads to exponential search for the next sibling. + // TODO: Find a more efficient way to do this. + var node = fiber; + + siblings: while (true) { + // If we didn't find anything, let's try the next sibling. + while (node.sibling === null) { + if (node.return === null || isHostParent(node.return)) { + // If we pop out of the root or hit the parent the fiber we are the + // last sibling. + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + + while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) { + // If it is not host node and, we might have a host node inside it. + // Try to search down until we find one. + if (node.flags & Placement) { + // If we don't have a child, try the siblings instead. + continue siblings; + } // If we don't have a child, try the siblings instead. + // We also skip portals because they are not part of this host tree. + + + if (node.child === null || node.tag === HostPortal) { + continue siblings; + } else { + node.child.return = node; + node = node.child; + } + } // Check if this host node is stable or about to be placed. + + + if (!(node.flags & Placement)) { + // Found it! + return node.stateNode; + } + } +} + +function commitPlacement(finishedWork) { + + + var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together. + + var parent; + var isContainer; + var parentStateNode = parentFiber.stateNode; + + switch (parentFiber.tag) { + case HostComponent: + parent = parentStateNode; + isContainer = false; + break; + + case HostRoot: + parent = parentStateNode.containerInfo; + isContainer = true; + break; + + case HostPortal: + parent = parentStateNode.containerInfo; + isContainer = true; + break; + + case FundamentalComponent: + + // eslint-disable-next-line-no-fallthrough + + default: + { + { + throw Error( "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + } + + if (parentFiber.flags & ContentReset) { + // Reset the text content of the parent before doing any insertions + resetTextContent(parent); // Clear ContentReset from the effect tag + + parentFiber.flags &= ~ContentReset; + } + + var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its + // children to find all the terminal nodes. + + if (isContainer) { + insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent); + } else { + insertOrAppendPlacementNode(finishedWork, before, parent); + } +} + +function insertOrAppendPlacementNodeIntoContainer(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; + + if (isHost || enableFundamentalAPI ) { + var stateNode = isHost ? node.stateNode : node.stateNode.instance; + + if (before) { + insertInContainerBefore(parent, stateNode, before); + } else { + appendChildToContainer(parent, stateNode); + } + } else if (tag === HostPortal) ; else { + var child = node.child; + + if (child !== null) { + insertOrAppendPlacementNodeIntoContainer(child, before, parent); + var sibling = child.sibling; + + while (sibling !== null) { + insertOrAppendPlacementNodeIntoContainer(sibling, before, parent); + sibling = sibling.sibling; + } + } + } +} + +function insertOrAppendPlacementNode(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; + + if (isHost || enableFundamentalAPI ) { + var stateNode = isHost ? node.stateNode : node.stateNode.instance; + + if (before) { + insertBefore(parent, stateNode, before); + } else { + appendChild(parent, stateNode); + } + } else if (tag === HostPortal) ; else { + var child = node.child; + + if (child !== null) { + insertOrAppendPlacementNode(child, before, parent); + var sibling = child.sibling; + + while (sibling !== null) { + insertOrAppendPlacementNode(sibling, before, parent); + sibling = sibling.sibling; + } + } + } +} + +function unmountHostComponents(finishedRoot, current, renderPriorityLevel) { + // We only have the top Fiber that was deleted but we need to recurse down its + // children to find all the terminal nodes. + var node = current; // Each iteration, currentParent is populated with node's host parent if not + // currentParentIsValid. + + var currentParentIsValid = false; // Note: these two variables *must* always be updated together. + + var currentParent; + var currentParentIsContainer; + + while (true) { + if (!currentParentIsValid) { + var parent = node.return; + + findParent: while (true) { + if (!(parent !== null)) { + { + throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var parentStateNode = parent.stateNode; + + switch (parent.tag) { + case HostComponent: + currentParent = parentStateNode; + currentParentIsContainer = false; + break findParent; + + case HostRoot: + currentParent = parentStateNode.containerInfo; + currentParentIsContainer = true; + break findParent; + + case HostPortal: + currentParent = parentStateNode.containerInfo; + currentParentIsContainer = true; + break findParent; + + } + + parent = parent.return; + } + + currentParentIsValid = true; + } + + if (node.tag === HostComponent || node.tag === HostText) { + commitNestedUnmounts(finishedRoot, node); // After all the children have unmounted, it is now safe to remove the + // node from the tree. + + if (currentParentIsContainer) { + removeChildFromContainer(currentParent, node.stateNode); + } else { + removeChild(currentParent, node.stateNode); + } // Don't visit children because we already visited them. + + } else if (node.tag === HostPortal) { + if (node.child !== null) { + // When we go into a portal, it becomes the parent to remove from. + // We will reassign it back when we pop the portal on the way up. + currentParent = node.stateNode.containerInfo; + currentParentIsContainer = true; // Visit children because portals might contain host components. + + node.child.return = node; + node = node.child; + continue; + } + } else { + commitUnmount(finishedRoot, node); // Visit children because we may find more host components below. + + if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + } + + if (node === current) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === current) { + return; + } + + node = node.return; + + if (node.tag === HostPortal) { + // When we go out of the portal, we need to restore the parent. + // Since we don't keep a stack of them, we will search for it. + currentParentIsValid = false; + } + } + + node.sibling.return = node.return; + node = node.sibling; + } +} + +function commitDeletion(finishedRoot, current, renderPriorityLevel) { + { + // Recursively delete all host nodes from the parent. + // Detach refs and call componentWillUnmount() on the whole subtree. + unmountHostComponents(finishedRoot, current); + } + + var alternate = current.alternate; + detachFiberMutation(current); + + if (alternate !== null) { + detachFiberMutation(alternate); + } +} + +function commitWork(current, finishedWork) { + + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: + case Block: + { + // Layout effects are destroyed during the mutation phase so that all + // destroy functions for all fibers are called before any create functions. + // This prevents sibling component effects from interfering with each other, + // e.g. a destroy function in one component should never override a ref set + // by a create function in another component during the same commit. + { + commitHookEffectListUnmount(Layout | HasEffect, finishedWork); + } + + return; + } + + case ClassComponent: + { + return; + } + + case HostComponent: + { + var instance = finishedWork.stateNode; + + if (instance != null) { + // Commit the work prepared earlier. + var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps + // as the newProps. The updatePayload will contain the real change in + // this case. + + var oldProps = current !== null ? current.memoizedProps : newProps; + var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components. + + var updatePayload = finishedWork.updateQueue; + finishedWork.updateQueue = null; + + if (updatePayload !== null) { + commitUpdate(instance, updatePayload, type, oldProps, newProps); + } + } + + return; + } + + case HostText: + { + if (!(finishedWork.stateNode !== null)) { + { + throw Error( "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var textInstance = finishedWork.stateNode; + var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps + // as the newProps. The updatePayload will contain the real change in + // this case. + + var oldText = current !== null ? current.memoizedProps : newText; + commitTextUpdate(textInstance, oldText, newText); + return; + } + + case HostRoot: + { + { + var _root = finishedWork.stateNode; + + if (_root.hydrate) { + // We've just hydrated. No need to hydrate again. + _root.hydrate = false; + commitHydratedContainer(_root.containerInfo); + } + } + + return; + } + + case Profiler: + { + return; + } + + case SuspenseComponent: + { + commitSuspenseComponent(finishedWork); + attachSuspenseRetryListeners(finishedWork); + return; + } + + case SuspenseListComponent: + { + attachSuspenseRetryListeners(finishedWork); + return; + } + + case IncompleteClassComponent: + { + return; + } + + case FundamentalComponent: + { + + break; + } + + case ScopeComponent: + { + + break; + } + + case OffscreenComponent: + case LegacyHiddenComponent: + { + var newState = finishedWork.memoizedState; + var isHidden = newState !== null; + hideOrUnhideAllChildren(finishedWork, isHidden); + return; + } + } + + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function commitSuspenseComponent(finishedWork) { + var newState = finishedWork.memoizedState; + + if (newState !== null) { + markCommitTimeOfFallback(); + + { + // Hide the Offscreen component that contains the primary children. TODO: + // Ideally, this effect would have been scheduled on the Offscreen fiber + // itself. That's how unhiding works: the Offscreen component schedules an + // effect on itself. However, in this case, the component didn't complete, + // so the fiber was never added to the effect list in the normal path. We + // could have appended it to the effect list in the Suspense component's + // second pass, but doing it this way is less complicated. This would be + // simpler if we got rid of the effect list and traversed the tree, like + // we're planning to do. + var primaryChildParent = finishedWork.child; + hideOrUnhideAllChildren(primaryChildParent, true); + } + } +} + +function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { + + var newState = finishedWork.memoizedState; + + if (newState === null) { + var current = finishedWork.alternate; + + if (current !== null) { + var prevState = current.memoizedState; + + if (prevState !== null) { + var suspenseInstance = prevState.dehydrated; + + if (suspenseInstance !== null) { + commitHydratedSuspenseInstance(suspenseInstance); + } + } + } + } +} + +function attachSuspenseRetryListeners(finishedWork) { + // If this boundary just timed out, then it will have a set of wakeables. + // For each wakeable, attach a listener so that when it resolves, React + // attempts to re-render the boundary in the primary (pre-timeout) state. + var wakeables = finishedWork.updateQueue; + + if (wakeables !== null) { + finishedWork.updateQueue = null; + var retryCache = finishedWork.stateNode; + + if (retryCache === null) { + retryCache = finishedWork.stateNode = new PossiblyWeakSet(); + } + + wakeables.forEach(function (wakeable) { + // Memoize using the boundary fiber to prevent redundant listeners. + var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable); + + if (!retryCache.has(wakeable)) { + { + if (wakeable.__reactDoNotTraceInteractions !== true) { + retry = tracing.unstable_wrap(retry); + } + } + + retryCache.add(wakeable); + wakeable.then(retry, retry); + } + }); + } +} // This function detects when a Suspense boundary goes from visible to hidden. +// It returns false if the boundary is already hidden. +// TODO: Use an effect tag. + + +function isSuspenseBoundaryBeingHidden(current, finishedWork) { + if (current !== null) { + var oldState = current.memoizedState; + + if (oldState === null || oldState.dehydrated !== null) { + var newState = finishedWork.memoizedState; + return newState !== null && newState.dehydrated === null; + } + } + + return false; +} + +function commitResetTextContent(current) { + + resetTextContent(current.stateNode); +} + +var COMPONENT_TYPE = 0; +var HAS_PSEUDO_CLASS_TYPE = 1; +var ROLE_TYPE = 2; +var TEST_NAME_TYPE = 3; +var TEXT_TYPE = 4; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor$1 = Symbol.for; + COMPONENT_TYPE = symbolFor$1('selector.component'); + HAS_PSEUDO_CLASS_TYPE = symbolFor$1('selector.has_pseudo_class'); + ROLE_TYPE = symbolFor$1('selector.role'); + TEST_NAME_TYPE = symbolFor$1('selector.test_id'); + TEXT_TYPE = symbolFor$1('selector.text'); +} +var commitHooks = []; +function onCommitRoot$1() { + { + commitHooks.forEach(function (commitHook) { + return commitHook(); + }); + } +} + +var ceil = Math.ceil; +var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher, + ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, + IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing; +var NoContext = +/* */ +0; +var BatchedContext = +/* */ +1; +var EventContext = +/* */ +2; +var DiscreteEventContext = +/* */ +4; +var LegacyUnbatchedContext = +/* */ +8; +var RenderContext = +/* */ +16; +var CommitContext = +/* */ +32; +var RetryAfterError = +/* */ +64; +var RootIncomplete = 0; +var RootFatalErrored = 1; +var RootErrored = 2; +var RootSuspended = 3; +var RootSuspendedWithDelay = 4; +var RootCompleted = 5; // Describes where we are in the React execution stack + +var executionContext = NoContext; // The root we're working on + +var workInProgressRoot = null; // The fiber we're working on + +var workInProgress = null; // The lanes we're rendering + +var workInProgressRootRenderLanes = NoLanes; // Stack that allows components to change the render lanes for its subtree +// This is a superset of the lanes we started working on at the root. The only +// case where it's different from `workInProgressRootRenderLanes` is when we +// enter a subtree that is hidden and needs to be unhidden: Suspense and +// Offscreen component. +// +// Most things in the work loop should deal with workInProgressRootRenderLanes. +// Most things in begin/complete phases should deal with subtreeRenderLanes. + +var subtreeRenderLanes = NoLanes; +var subtreeRenderLanesCursor = createCursor(NoLanes); // Whether to root completed, errored, suspended, etc. + +var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown + +var workInProgressRootFatalError = null; // "Included" lanes refer to lanes that were worked on during this render. It's +// slightly different than `renderLanes` because `renderLanes` can change as you +// enter and exit an Offscreen tree. This value is the combination of all render +// lanes for the entire render phase. + +var workInProgressRootIncludedLanes = NoLanes; // The work left over by components that were visited during this render. Only +// includes unprocessed updates, not work in bailed out children. + +var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render. + +var workInProgressRootUpdatedLanes = NoLanes; // Lanes that were pinged (in an interleaved event) during this render. + +var workInProgressRootPingedLanes = NoLanes; +var mostRecentlyUpdatedRoot = null; // The most recent time we committed a fallback. This lets us ensure a train +// model where we don't commit new loading states in too quick succession. + +var globalMostRecentFallbackTime = 0; +var FALLBACK_THROTTLE_MS = 500; // The absolute time for when we should start giving up on rendering +// more and prefer CPU suspense heuristics instead. + +var workInProgressRootRenderTargetTime = Infinity; // How long a render is supposed to take before we start following CPU +// suspense heuristics and opt out of rendering more content. + +var RENDER_TIMEOUT_MS = 500; + +function resetRenderTimer() { + workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS; +} + +function getRenderTargetTime() { + return workInProgressRootRenderTargetTime; +} +var nextEffect = null; +var hasUncaughtError = false; +var firstUncaughtError = null; +var legacyErrorBoundariesThatAlreadyFailed = null; +var rootDoesHavePassiveEffects = false; +var rootWithPendingPassiveEffects = null; +var pendingPassiveEffectsRenderPriority = NoPriority$1; +var pendingPassiveEffectsLanes = NoLanes; +var pendingPassiveHookEffectsMount = []; +var pendingPassiveHookEffectsUnmount = []; +var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates + +var NESTED_UPDATE_LIMIT = 50; +var nestedUpdateCount = 0; +var rootWithNestedUpdates = null; +var NESTED_PASSIVE_UPDATE_LIMIT = 50; +var nestedPassiveUpdateCount = 0; // Marks the need to reschedule pending interactions at these lanes +// during the commit phase. This enables them to be traced across components +// that spawn new work during render. E.g. hidden boundaries, suspended SSR +// hydration or SuspenseList. +// TODO: Can use a bitmask instead of an array + +var spawnedWorkDuringRender = null; // If two updates are scheduled within the same event, we should treat their +// event times as simultaneous, even if the actual clock time has advanced +// between the first and second call. + +var currentEventTime = NoTimestamp; +var currentEventWipLanes = NoLanes; +var currentEventPendingLanes = NoLanes; // Dev only flag that tracks if passive effects are currently being flushed. +// We warn about state updates for unmounted components differently in this case. + +var isFlushingPassiveEffects = false; +var focusedInstanceHandle = null; +var shouldFireAfterActiveInstanceBlur = false; +function getWorkInProgressRoot() { + return workInProgressRoot; +} +function requestEventTime() { + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + // We're inside React, so it's fine to read the actual time. + return now(); + } // We're not inside React, so we may be in the middle of a browser event. + + + if (currentEventTime !== NoTimestamp) { + // Use the same start time for all updates until we enter React again. + return currentEventTime; + } // This is the first update since React yielded. Compute a new start time. + + + currentEventTime = now(); + return currentEventTime; +} +function requestUpdateLane(fiber) { + // Special cases + var mode = fiber.mode; + + if ((mode & BlockingMode) === NoMode) { + return SyncLane; + } else if ((mode & ConcurrentMode) === NoMode) { + return getCurrentPriorityLevel() === ImmediatePriority$1 ? SyncLane : SyncBatchedLane; + } // The algorithm for assigning an update to a lane should be stable for all + // updates at the same priority within the same event. To do this, the inputs + // to the algorithm must be the same. For example, we use the `renderLanes` + // to avoid choosing a lane that is already in the middle of rendering. + // + // However, the "included" lanes could be mutated in between updates in the + // same event, like if you perform an update inside `flushSync`. Or any other + // code path that might call `prepareFreshStack`. + // + // The trick we use is to cache the first of each of these inputs within an + // event. Then reset the cached values once we can be sure the event is over. + // Our heuristic for that is whenever we enter a concurrent work loop. + // + // We'll do the same for `currentEventPendingLanes` below. + + + if (currentEventWipLanes === NoLanes) { + currentEventWipLanes = workInProgressRootIncludedLanes; + } + + var isTransition = requestCurrentTransition() !== NoTransition; + + if (isTransition) { + if (currentEventPendingLanes !== NoLanes) { + currentEventPendingLanes = mostRecentlyUpdatedRoot !== null ? mostRecentlyUpdatedRoot.pendingLanes : NoLanes; + } + + return findTransitionLane(currentEventWipLanes, currentEventPendingLanes); + } // TODO: Remove this dependency on the Scheduler priority. + // To do that, we're replacing it with an update lane priority. + + + var schedulerPriority = getCurrentPriorityLevel(); // The old behavior was using the priority level of the Scheduler. + // This couples React to the Scheduler internals, so we're replacing it + // with the currentUpdateLanePriority above. As an example of how this + // could be problematic, if we're not inside `Scheduler.runWithPriority`, + // then we'll get the priority of the current running Scheduler task, + // which is probably not what we want. + + var lane; + + if ( // TODO: Temporary. We're removing the concept of discrete updates. + (executionContext & DiscreteEventContext) !== NoContext && schedulerPriority === UserBlockingPriority$2) { + lane = findUpdateLane(InputDiscreteLanePriority, currentEventWipLanes); + } else { + var schedulerLanePriority = schedulerPriorityToLanePriority(schedulerPriority); + + lane = findUpdateLane(schedulerLanePriority, currentEventWipLanes); + } + + return lane; +} + +function requestRetryLane(fiber) { + // This is a fork of `requestUpdateLane` designed specifically for Suspense + // "retries" — a special update that attempts to flip a Suspense boundary + // from its placeholder state to its primary/resolved state. + // Special cases + var mode = fiber.mode; + + if ((mode & BlockingMode) === NoMode) { + return SyncLane; + } else if ((mode & ConcurrentMode) === NoMode) { + return getCurrentPriorityLevel() === ImmediatePriority$1 ? SyncLane : SyncBatchedLane; + } // See `requestUpdateLane` for explanation of `currentEventWipLanes` + + + if (currentEventWipLanes === NoLanes) { + currentEventWipLanes = workInProgressRootIncludedLanes; + } + + return findRetryLane(currentEventWipLanes); +} + +function scheduleUpdateOnFiber(fiber, lane, eventTime) { + checkForNestedUpdates(); + warnAboutRenderPhaseUpdatesInDEV(fiber); + var root = markUpdateLaneFromFiberToRoot(fiber, lane); + + if (root === null) { + warnAboutUpdateOnUnmountedFiberInDEV(fiber); + return null; + } // Mark that the root has a pending update. + + + markRootUpdated(root, lane, eventTime); + + if (root === workInProgressRoot) { + // Received an update to a tree that's in the middle of rendering. Mark + // that there was an interleaved update work on this root. Unless the + // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render + // phase update. In that case, we don't treat render phase updates as if + // they were interleaved, for backwards compat reasons. + { + workInProgressRootUpdatedLanes = mergeLanes(workInProgressRootUpdatedLanes, lane); + } + + if (workInProgressRootExitStatus === RootSuspendedWithDelay) { + // The root already suspended with a delay, which means this render + // definitely won't finish. Since we have a new update, let's mark it as + // suspended now, right before marking the incoming update. This has the + // effect of interrupting the current render and switching to the update. + // TODO: Make sure this doesn't override pings that happen while we've + // already started rendering. + markRootSuspended$1(root, workInProgressRootRenderLanes); + } + } // TODO: requestUpdateLanePriority also reads the priority. Pass the + // priority as an argument to that function and this one. + + + var priorityLevel = getCurrentPriorityLevel(); + + if (lane === SyncLane) { + if ( // Check if we're inside unbatchedUpdates + (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering + (executionContext & (RenderContext | CommitContext)) === NoContext) { + // Register pending interactions on the root to avoid losing traced interaction data. + schedulePendingInteractions(root, lane); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed + // root inside of batchedUpdates should be synchronous, but layout updates + // should be deferred until the end of the batch. + + performSyncWorkOnRoot(root); + } else { + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, lane); + + if (executionContext === NoContext) { + // Flush the synchronous work now, unless we're already working or inside + // a batch. This is intentionally inside scheduleUpdateOnFiber instead of + // scheduleCallbackForFiber to preserve the ability to schedule a callback + // without immediately flushing it. We only do this for user-initiated + // updates, to preserve historical behavior of legacy mode. + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } + } else { + // Schedule a discrete update but only if it's not Sync. + if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered + // discrete, even inside a discrete event. + priorityLevel === UserBlockingPriority$2 || priorityLevel === ImmediatePriority$1)) { + // This is the result of a discrete event. Track the lowest priority + // discrete update per root so we can flush them early, if needed. + if (rootsWithPendingDiscreteUpdates === null) { + rootsWithPendingDiscreteUpdates = new Set([root]); + } else { + rootsWithPendingDiscreteUpdates.add(root); + } + } // Schedule other updates after in case the callback is sync. + + + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, lane); + } // We use this when assigning a lane for a transition inside + // `requestUpdateLane`. We assume it's the same as the root being updated, + // since in the common case of a single root app it probably is. If it's not + // the same root, then it's not a huge deal, we just might batch more stuff + // together more than necessary. + + + mostRecentlyUpdatedRoot = root; +} // This is split into a separate function so we can mark a fiber with pending +// work without treating it as a typical update that originates from an event; +// e.g. retrying a Suspense boundary isn't an update, but it does schedule work +// on a fiber. + +function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { + // Update the source fiber's lanes + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane); + var alternate = sourceFiber.alternate; + + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, lane); + } + + { + if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) { + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); + } + } // Walk the parent path to the root and update the child expiration time. + + + var node = sourceFiber; + var parent = sourceFiber.return; + + while (parent !== null) { + parent.childLanes = mergeLanes(parent.childLanes, lane); + alternate = parent.alternate; + + if (alternate !== null) { + alternate.childLanes = mergeLanes(alternate.childLanes, lane); + } else { + { + if ((parent.flags & (Placement | Hydrating)) !== NoFlags) { + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); + } + } + } + + node = parent; + parent = parent.return; + } + + if (node.tag === HostRoot) { + var root = node.stateNode; + return root; + } else { + return null; + } +} // Use this function to schedule a task for a root. There's only one task per +// root; if a task was already scheduled, we'll check to make sure the priority +// of the existing task is the same as the priority of the next level that the +// root has work on. This function is called on every update, and right before +// exiting a task. + + +function ensureRootIsScheduled(root, currentTime) { + var existingCallbackNode = root.callbackNode; // Check if any lanes are being starved by other work. If so, mark them as + // expired so we know to work on those next. + + markStarvedLanesAsExpired(root, currentTime); // Determine the next lanes to work on, and their priority. + + var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); // This returns the priority level computed during the `getNextLanes` call. + + var newCallbackPriority = returnNextLanesPriority(); + + if (nextLanes === NoLanes) { + // Special case: There's nothing to work on. + if (existingCallbackNode !== null) { + cancelCallback(existingCallbackNode); + root.callbackNode = null; + root.callbackPriority = NoLanePriority; + } + + return; + } // Check if there's an existing task. We may be able to reuse it. + + + if (existingCallbackNode !== null) { + var existingCallbackPriority = root.callbackPriority; + + if (existingCallbackPriority === newCallbackPriority) { + // The priority hasn't changed. We can reuse the existing task. Exit. + return; + } // The priority changed. Cancel the existing callback. We'll schedule a new + // one below. + + + cancelCallback(existingCallbackNode); + } // Schedule a new callback. + + + var newCallbackNode; + + if (newCallbackPriority === SyncLanePriority) { + // Special case: Sync React callbacks are scheduled on a special + // internal queue + newCallbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); + } else if (newCallbackPriority === SyncBatchedLanePriority) { + newCallbackNode = scheduleCallback(ImmediatePriority$1, performSyncWorkOnRoot.bind(null, root)); + } else { + var schedulerPriorityLevel = lanePriorityToSchedulerPriority(newCallbackPriority); + newCallbackNode = scheduleCallback(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root)); + } + + root.callbackPriority = newCallbackPriority; + root.callbackNode = newCallbackNode; +} // This is the entry point for every concurrent task, i.e. anything that +// goes through Scheduler. + + +function performConcurrentWorkOnRoot(root) { + // Since we know we're in a React event, we can clear the current + // event time. The next update will compute a new event time. + currentEventTime = NoTimestamp; + currentEventWipLanes = NoLanes; + currentEventPendingLanes = NoLanes; + + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } // Flush any pending passive effects before deciding which lanes to work on, + // in case they schedule additional work. + + + var originalCallbackNode = root.callbackNode; + var didFlushPassiveEffects = flushPassiveEffects(); + + if (didFlushPassiveEffects) { + // Something in the passive effect phase may have canceled the current task. + // Check if the task node for this root was changed. + if (root.callbackNode !== originalCallbackNode) { + // The current task was canceled. Exit. We don't need to call + // `ensureRootIsScheduled` because the check above implies either that + // there's a new task, or that there's no remaining work on this root. + return null; + } + } // Determine the next expiration time to work on, using the fields stored + // on the root. + + + var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); + + if (lanes === NoLanes) { + // Defensive coding. This is never expected to happen. + return null; + } + + var exitStatus = renderRootConcurrent(root, lanes); + + if (includesSomeLane(workInProgressRootIncludedLanes, workInProgressRootUpdatedLanes)) { + // The render included lanes that were updated during the render phase. + // For example, when unhiding a hidden tree, we include all the lanes + // that were previously skipped when the tree was hidden. That set of + // lanes is a superset of the lanes we started rendering with. + // + // So we'll throw out the current work and restart. + prepareFreshStack(root, NoLanes); + } else if (exitStatus !== RootIncomplete) { + if (exitStatus === RootErrored) { + executionContext |= RetryAfterError; // If an error occurred during hydration, + // discard server response and fall back to client side render. + + if (root.hydrate) { + root.hydrate = false; + clearContainer(root.containerInfo); + } // If something threw an error, try rendering one more time. We'll render + // synchronously to block concurrent data mutations, and we'll includes + // all pending updates are included. If it still fails after the second + // attempt, we'll give up and commit the resulting tree. + + + lanes = getLanesToRetrySynchronouslyOnError(root); + + if (lanes !== NoLanes) { + exitStatus = renderRootSync(root, lanes); + } + } + + if (exitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw fatalError; + } // We now have a consistent tree. The next step is either to commit it, + // or, if something suspended, wait to commit it after a timeout. + + + var finishedWork = root.current.alternate; + root.finishedWork = finishedWork; + root.finishedLanes = lanes; + finishConcurrentRender(root, exitStatus, lanes); + } + + ensureRootIsScheduled(root, now()); + + if (root.callbackNode === originalCallbackNode) { + // The task node scheduled for this root is the same one that's + // currently executed. Need to return a continuation. + return performConcurrentWorkOnRoot.bind(null, root); + } + + return null; +} + +function finishConcurrentRender(root, exitStatus, lanes) { + switch (exitStatus) { + case RootIncomplete: + case RootFatalErrored: + { + { + { + throw Error( "Root did not complete. This is a bug in React." ); + } + } + } + // Flow knows about invariant, so it complains if I add a break + // statement, but eslint doesn't know about invariant, so it complains + // if I do. eslint-disable-next-line no-fallthrough + + case RootErrored: + { + // We should have already attempted to retry this tree. If we reached + // this point, it errored again. Commit it. + commitRoot(root); + break; + } + + case RootSuspended: + { + markRootSuspended$1(root, lanes); // We have an acceptable loading state. We need to figure out if we + // should immediately commit it or wait a bit. + + if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope + !shouldForceFlushFallbacksInDEV()) { + // This render only included retries, no updates. Throttle committing + // retries so that we don't show too many loading states too quickly. + var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time. + + if (msUntilTimeout > 10) { + var nextLanes = getNextLanes(root, NoLanes); + + if (nextLanes !== NoLanes) { + // There's additional work on this root. + break; + } + + var suspendedLanes = root.suspendedLanes; + + if (!isSubsetOfLanes(suspendedLanes, lanes)) { + // We should prefer to render the fallback of at the last + // suspended level. Ping the last suspended level to try + // rendering it again. + // FIXME: What if the suspended lanes are Idle? Should not restart. + var eventTime = requestEventTime(); + markRootPinged(root, suspendedLanes); + break; + } // The render is suspended, it hasn't timed out, and there's no + // lower priority work to do. Instead of committing the fallback + // immediately, wait for more data to arrive. + + + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout); + break; + } + } // The work expired. Commit immediately. + + + commitRoot(root); + break; + } + + case RootSuspendedWithDelay: + { + markRootSuspended$1(root, lanes); + + if (includesOnlyTransitions(lanes)) { + // This is a transition, so we should exit without committing a + // placeholder and without scheduling a timeout. Delay indefinitely + // until we receive more data. + break; + } + + if (!shouldForceFlushFallbacksInDEV()) { + // This is not a transition, but we did trigger an avoided state. + // Schedule a placeholder to display after a short delay, using the Just + // Noticeable Difference. + // TODO: Is the JND optimization worth the added complexity? If this is + // the only reason we track the event time, then probably not. + // Consider removing. + var mostRecentEventTime = getMostRecentEventTime(root, lanes); + var eventTimeMs = mostRecentEventTime; + var timeElapsedMs = now() - eventTimeMs; + + var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; // Don't bother with a very short suspense time. + + + if (_msUntilTimeout > 10) { + // Instead of committing the fallback immediately, wait for more data + // to arrive. + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout); + break; + } + } // Commit the placeholder. + + + commitRoot(root); + break; + } + + case RootCompleted: + { + // The work completed. Ready to commit. + commitRoot(root); + break; + } + + default: + { + { + { + throw Error( "Unknown root exit status." ); + } + } + } + } +} + +function markRootSuspended$1(root, suspendedLanes) { + // When suspending, we should always exclude lanes that were pinged or (more + // rarely, since we try to avoid it) updated during the render phase. + // TODO: Lol maybe there's a better way to factor this besides this + // obnoxiously named function :) + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes); + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootUpdatedLanes); + markRootSuspended(root, suspendedLanes); +} // This is the entry point for synchronous tasks that don't go +// through Scheduler + + +function performSyncWorkOnRoot(root) { + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } + + flushPassiveEffects(); + var lanes; + var exitStatus; + + if (root === workInProgressRoot && includesSomeLane(root.expiredLanes, workInProgressRootRenderLanes)) { + // There's a partial tree, and at least one of its lanes has expired. Finish + // rendering it before rendering the rest of the expired work. + lanes = workInProgressRootRenderLanes; + exitStatus = renderRootSync(root, lanes); + + if (includesSomeLane(workInProgressRootIncludedLanes, workInProgressRootUpdatedLanes)) { + // The render included lanes that were updated during the render phase. + // For example, when unhiding a hidden tree, we include all the lanes + // that were previously skipped when the tree was hidden. That set of + // lanes is a superset of the lanes we started rendering with. + // + // Note that this only happens when part of the tree is rendered + // concurrently. If the whole tree is rendered synchronously, then there + // are no interleaved events. + lanes = getNextLanes(root, lanes); + exitStatus = renderRootSync(root, lanes); + } + } else { + lanes = getNextLanes(root, NoLanes); + exitStatus = renderRootSync(root, lanes); + } + + if (root.tag !== LegacyRoot && exitStatus === RootErrored) { + executionContext |= RetryAfterError; // If an error occurred during hydration, + // discard server response and fall back to client side render. + + if (root.hydrate) { + root.hydrate = false; + clearContainer(root.containerInfo); + } // If something threw an error, try rendering one more time. We'll render + // synchronously to block concurrent data mutations, and we'll includes + // all pending updates are included. If it still fails after the second + // attempt, we'll give up and commit the resulting tree. + + + lanes = getLanesToRetrySynchronouslyOnError(root); + + if (lanes !== NoLanes) { + exitStatus = renderRootSync(root, lanes); + } + } + + if (exitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw fatalError; + } // We now have a consistent tree. Because this is a sync render, we + // will commit it even if something suspended. + + + var finishedWork = root.current.alternate; + root.finishedWork = finishedWork; + root.finishedLanes = lanes; + commitRoot(root); // Before exiting, make sure there's a callback scheduled for the next + // pending level. + + ensureRootIsScheduled(root, now()); + return null; +} +function flushDiscreteUpdates() { + // TODO: Should be able to flush inside batchedUpdates, but not inside `act`. + // However, `act` uses `batchedUpdates`, so there's no way to distinguish + // those two cases. Need to fix this before exposing flushDiscreteUpdates + // as a public API. + if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) { + { + if ((executionContext & RenderContext) !== NoContext) { + error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.'); + } + } // We're already rendering, so we can't synchronously flush pending work. + // This is probably a nested event dispatch triggered by a lifecycle/effect, + // like `el.focus()`. Exit. + + + return; + } + + flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that + // they fire before the next serial event. + + flushPassiveEffects(); +} + +function flushPendingDiscreteUpdates() { + if (rootsWithPendingDiscreteUpdates !== null) { + // For each root with pending discrete updates, schedule a callback to + // immediately flush them. + var roots = rootsWithPendingDiscreteUpdates; + rootsWithPendingDiscreteUpdates = null; + roots.forEach(function (root) { + markDiscreteUpdatesExpired(root); + ensureRootIsScheduled(root, now()); + }); + } // Now flush the immediate queue. + + + flushSyncCallbackQueue(); +} + +function batchedUpdates$1(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; + + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } +} +function batchedEventUpdates$1(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= EventContext; + + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } +} +function discreteUpdates$1(fn, a, b, c, d) { + var prevExecutionContext = executionContext; + executionContext |= DiscreteEventContext; + + { + try { + return runWithPriority$1(UserBlockingPriority$2, fn.bind(null, a, b, c, d)); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } + } +} +function unbatchedUpdates(fn, a) { + var prevExecutionContext = executionContext; + executionContext &= ~BatchedContext; + executionContext |= LegacyUnbatchedContext; + + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } +} +function flushSync(fn, a) { + var prevExecutionContext = executionContext; + + if ((prevExecutionContext & (RenderContext | CommitContext)) !== NoContext) { + { + error('flushSync was called from inside a lifecycle method. React cannot ' + 'flush when React is already rendering. Consider moving this call to ' + 'a scheduler task or micro task.'); + } + + return fn(a); + } + + executionContext |= BatchedContext; + + { + try { + if (fn) { + return runWithPriority$1(ImmediatePriority$1, fn.bind(null, a)); + } else { + return undefined; + } + } finally { + executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch. + // Note that this will happen even if batchedUpdates is higher up + // the stack. + + flushSyncCallbackQueue(); + } + } +} +function pushRenderLanes(fiber, lanes) { + push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber); + subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes); + workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes); +} +function popRenderLanes(fiber) { + subtreeRenderLanes = subtreeRenderLanesCursor.current; + pop(subtreeRenderLanesCursor, fiber); +} + +function prepareFreshStack(root, lanes) { + root.finishedWork = null; + root.finishedLanes = NoLanes; + var timeoutHandle = root.timeoutHandle; + + if (timeoutHandle !== noTimeout) { + // The root previous suspended and scheduled a timeout to commit a fallback + // state. Now that we have additional work, cancel the timeout. + root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above + + cancelTimeout(timeoutHandle); + } + + if (workInProgress !== null) { + var interruptedWork = workInProgress.return; + + while (interruptedWork !== null) { + unwindInterruptedWork(interruptedWork); + interruptedWork = interruptedWork.return; + } + } + + workInProgressRoot = root; + workInProgress = createWorkInProgress(root.current, null); + workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes; + workInProgressRootExitStatus = RootIncomplete; + workInProgressRootFatalError = null; + workInProgressRootSkippedLanes = NoLanes; + workInProgressRootUpdatedLanes = NoLanes; + workInProgressRootPingedLanes = NoLanes; + + { + spawnedWorkDuringRender = null; + } + + { + ReactStrictModeWarnings.discardPendingWarnings(); + } +} + +function handleError(root, thrownValue) { + do { + var erroredWork = workInProgress; + + try { + // Reset module-level state that was set during the render phase. + resetContextDependencies(); + resetHooksAfterThrow(); + resetCurrentFiber(); // TODO: I found and added this missing line while investigating a + // separate issue. Write a regression test using string refs. + + ReactCurrentOwner$2.current = null; + + if (erroredWork === null || erroredWork.return === null) { + // Expected to be working on a non-root fiber. This is a fatal error + // because there's no ancestor that can handle it; the root is + // supposed to capture all errors that weren't caught by an error + // boundary. + workInProgressRootExitStatus = RootFatalErrored; + workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next + // sibling, or the parent if there are no siblings. But since the root + // has no siblings nor a parent, we set it to null. Usually this is + // handled by `completeUnitOfWork` or `unwindWork`, but since we're + // intentionally not calling those, we need set it here. + // TODO: Consider calling `unwindWork` to pop the contexts. + + workInProgress = null; + return; + } + + if (enableProfilerTimer && erroredWork.mode & ProfileMode) { + // Record the time spent rendering before an error was thrown. This + // avoids inaccurate Profiler durations in the case of a + // suspended render. + stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true); + } + + throwException(root, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes); + completeUnitOfWork(erroredWork); + } catch (yetAnotherThrownValue) { + // Something in the return path also threw. + thrownValue = yetAnotherThrownValue; + + if (workInProgress === erroredWork && erroredWork !== null) { + // If this boundary has already errored, then we had trouble processing + // the error. Bubble it to the next boundary. + erroredWork = erroredWork.return; + workInProgress = erroredWork; + } else { + erroredWork = workInProgress; + } + + continue; + } // Return to the normal work loop. + + + return; + } while (true); +} + +function pushDispatcher() { + var prevDispatcher = ReactCurrentDispatcher$2.current; + ReactCurrentDispatcher$2.current = ContextOnlyDispatcher; + + if (prevDispatcher === null) { + // The React isomorphic package does not include a default dispatcher. + // Instead the first renderer will lazily attach one, in order to give + // nicer error messages. + return ContextOnlyDispatcher; + } else { + return prevDispatcher; + } +} + +function popDispatcher(prevDispatcher) { + ReactCurrentDispatcher$2.current = prevDispatcher; +} + +function pushInteractions(root) { + { + var prevInteractions = tracing.__interactionsRef.current; + tracing.__interactionsRef.current = root.memoizedInteractions; + return prevInteractions; + } +} + +function popInteractions(prevInteractions) { + { + tracing.__interactionsRef.current = prevInteractions; + } +} + +function markCommitTimeOfFallback() { + globalMostRecentFallbackTime = now(); +} +function markSkippedUpdateLanes(lane) { + workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes); +} +function renderDidSuspend() { + if (workInProgressRootExitStatus === RootIncomplete) { + workInProgressRootExitStatus = RootSuspended; + } +} +function renderDidSuspendDelayIfPossible() { + if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) { + workInProgressRootExitStatus = RootSuspendedWithDelay; + } // Check if there are updates that we skipped tree that might have unblocked + // this render. + + + if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootUpdatedLanes))) { + // Mark the current render as suspended so that we switch to working on + // the updates that were skipped. Usually we only suspend at the end of + // the render phase. + // TODO: We should probably always mark the root as suspended immediately + // (inside this function), since by suspending at the end of the render + // phase introduces a potential mistake where we suspend lanes that were + // pinged or updated while we were rendering. + markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes); + } +} +function renderDidError() { + if (workInProgressRootExitStatus !== RootCompleted) { + workInProgressRootExitStatus = RootErrored; + } +} // Called during render to determine if anything has suspended. +// Returns false if we're not sure. + +function renderHasNotSuspendedYet() { + // If something errored or completed, we can't really be sure, + // so those are false. + return workInProgressRootExitStatus === RootIncomplete; +} + +function renderRootSync(root, lanes) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack + // and prepare a fresh one. Otherwise we'll continue where we left off. + + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { + prepareFreshStack(root, lanes); + startWorkOnPendingInteractions(root, lanes); + } + + var prevInteractions = pushInteractions(root); + + do { + try { + workLoopSync(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); + + resetContextDependencies(); + + { + popInteractions(prevInteractions); + } + + executionContext = prevExecutionContext; + popDispatcher(prevDispatcher); + + if (workInProgress !== null) { + // This is a sync render, so we should have finished the whole tree. + { + { + throw Error( "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } + + + workInProgressRoot = null; + workInProgressRootRenderLanes = NoLanes; + return workInProgressRootExitStatus; +} // The work loop is an extremely hot path. Tell Closure not to inline it. + +/** @noinline */ + + +function workLoopSync() { + // Already timed out, so perform work without checking if we need to yield. + while (workInProgress !== null) { + performUnitOfWork(workInProgress); + } +} + +function renderRootConcurrent(root, lanes) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack + // and prepare a fresh one. Otherwise we'll continue where we left off. + + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { + resetRenderTimer(); + prepareFreshStack(root, lanes); + startWorkOnPendingInteractions(root, lanes); + } + + var prevInteractions = pushInteractions(root); + + do { + try { + workLoopConcurrent(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); + + resetContextDependencies(); + + { + popInteractions(prevInteractions); + } + + popDispatcher(prevDispatcher); + executionContext = prevExecutionContext; + + + if (workInProgress !== null) { + + return RootIncomplete; + } else { + + + workInProgressRoot = null; + workInProgressRootRenderLanes = NoLanes; // Return the final exit status. + + return workInProgressRootExitStatus; + } +} +/** @noinline */ + + +function workLoopConcurrent() { + // Perform work until Scheduler asks us to yield + while (workInProgress !== null && !shouldYield()) { + performUnitOfWork(workInProgress); + } +} + +function performUnitOfWork(unitOfWork) { + // The current, flushed, state of this fiber is the alternate. Ideally + // nothing should rely on this, but relying on it here means that we don't + // need an additional field on the work in progress. + var current = unitOfWork.alternate; + setCurrentFiber(unitOfWork); + var next; + + if ( (unitOfWork.mode & ProfileMode) !== NoMode) { + startProfilerTimer(unitOfWork); + next = beginWork$1(current, unitOfWork, subtreeRenderLanes); + stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true); + } else { + next = beginWork$1(current, unitOfWork, subtreeRenderLanes); + } + + resetCurrentFiber(); + unitOfWork.memoizedProps = unitOfWork.pendingProps; + + if (next === null) { + // If this doesn't spawn new work, complete the current work. + completeUnitOfWork(unitOfWork); + } else { + workInProgress = next; + } + + ReactCurrentOwner$2.current = null; +} + +function completeUnitOfWork(unitOfWork) { + // Attempt to complete the current unit of work, then move to the next + // sibling. If there are no more siblings, return to the parent fiber. + var completedWork = unitOfWork; + + do { + // The current, flushed, state of this fiber is the alternate. Ideally + // nothing should rely on this, but relying on it here means that we don't + // need an additional field on the work in progress. + var current = completedWork.alternate; + var returnFiber = completedWork.return; // Check if the work completed or if something threw. + + if ((completedWork.flags & Incomplete) === NoFlags) { + setCurrentFiber(completedWork); + var next = void 0; + + if ( (completedWork.mode & ProfileMode) === NoMode) { + next = completeWork(current, completedWork, subtreeRenderLanes); + } else { + startProfilerTimer(completedWork); + next = completeWork(current, completedWork, subtreeRenderLanes); // Update render duration assuming we didn't error. + + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); + } + + resetCurrentFiber(); + + if (next !== null) { + // Completing this fiber spawned new work. Work on that next. + workInProgress = next; + return; + } + + resetChildLanes(completedWork); + + if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete + (returnFiber.flags & Incomplete) === NoFlags) { + // Append all the effects of the subtree and this fiber onto the effect + // list of the parent. The completion order of the children affects the + // side-effect order. + if (returnFiber.firstEffect === null) { + returnFiber.firstEffect = completedWork.firstEffect; + } + + if (completedWork.lastEffect !== null) { + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = completedWork.firstEffect; + } + + returnFiber.lastEffect = completedWork.lastEffect; + } // If this fiber had side-effects, we append it AFTER the children's + // side-effects. We can perform certain side-effects earlier if needed, + // by doing multiple passes over the effect list. We don't want to + // schedule our own side-effect on our own list because if end up + // reusing children we'll schedule this effect onto itself since we're + // at the end. + + + var flags = completedWork.flags; // Skip both NoWork and PerformedWork tags when creating the effect + // list. PerformedWork effect is read by React DevTools but shouldn't be + // committed. + + if (flags > PerformedWork) { + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = completedWork; + } else { + returnFiber.firstEffect = completedWork; + } + + returnFiber.lastEffect = completedWork; + } + } + } else { + // This fiber did not complete because something threw. Pop values off + // the stack without entering the complete phase. If this is a boundary, + // capture values if possible. + var _next = unwindWork(completedWork); // Because this fiber did not complete, don't reset its expiration time. + + + if (_next !== null) { + // If completing this work spawned new work, do that next. We'll come + // back here again. + // Since we're restarting, remove anything that is not a host effect + // from the effect tag. + _next.flags &= HostEffectMask; + workInProgress = _next; + return; + } + + if ( (completedWork.mode & ProfileMode) !== NoMode) { + // Record the render duration for the fiber that errored. + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); // Include the time spent working on failed children before continuing. + + var actualDuration = completedWork.actualDuration; + var child = completedWork.child; + + while (child !== null) { + actualDuration += child.actualDuration; + child = child.sibling; + } + + completedWork.actualDuration = actualDuration; + } + + if (returnFiber !== null) { + // Mark the parent fiber as incomplete and clear its effect list. + returnFiber.firstEffect = returnFiber.lastEffect = null; + returnFiber.flags |= Incomplete; + } + } + + var siblingFiber = completedWork.sibling; + + if (siblingFiber !== null) { + // If there is more work to do in this returnFiber, do that next. + workInProgress = siblingFiber; + return; + } // Otherwise, return to the parent + + + completedWork = returnFiber; // Update the next thing we're working on in case something throws. + + workInProgress = completedWork; + } while (completedWork !== null); // We've reached the root. + + + if (workInProgressRootExitStatus === RootIncomplete) { + workInProgressRootExitStatus = RootCompleted; + } +} + +function resetChildLanes(completedWork) { + if ( // TODO: Move this check out of the hot path by moving `resetChildLanes` + // to switch statement in `completeWork`. + (completedWork.tag === LegacyHiddenComponent || completedWork.tag === OffscreenComponent) && completedWork.memoizedState !== null && !includesSomeLane(subtreeRenderLanes, OffscreenLane) && (completedWork.mode & ConcurrentMode) !== NoLanes) { + // The children of this component are hidden. Don't bubble their + // expiration times. + return; + } + + var newChildLanes = NoLanes; // Bubble up the earliest expiration time. + + if ( (completedWork.mode & ProfileMode) !== NoMode) { + // In profiling mode, resetChildExpirationTime is also used to reset + // profiler durations. + var actualDuration = completedWork.actualDuration; + var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will + // only be updated if work is done on the fiber (i.e. it doesn't bailout). + // When work is done, it should bubble to the parent's actualDuration. If + // the fiber has not been cloned though, (meaning no work was done), then + // this value will reflect the amount of time spent working on a previous + // render. In that case it should not bubble. We determine whether it was + // cloned by comparing the child pointer. + + var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child; + var child = completedWork.child; + + while (child !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes)); + + if (shouldBubbleActualDurations) { + actualDuration += child.actualDuration; + } + + treeBaseDuration += child.treeBaseDuration; + child = child.sibling; + } + + var isTimedOutSuspense = completedWork.tag === SuspenseComponent && completedWork.memoizedState !== null; + + if (isTimedOutSuspense) { + // Don't count time spent in a timed out Suspense subtree as part of the base duration. + var primaryChildFragment = completedWork.child; + + if (primaryChildFragment !== null) { + treeBaseDuration -= primaryChildFragment.treeBaseDuration; + } + } + + completedWork.actualDuration = actualDuration; + completedWork.treeBaseDuration = treeBaseDuration; + } else { + var _child = completedWork.child; + + while (_child !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes)); + _child = _child.sibling; + } + } + + completedWork.childLanes = newChildLanes; +} + +function commitRoot(root) { + var renderPriorityLevel = getCurrentPriorityLevel(); + runWithPriority$1(ImmediatePriority$1, commitRootImpl.bind(null, root, renderPriorityLevel)); + return null; +} + +function commitRootImpl(root, renderPriorityLevel) { + do { + // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which + // means `flushPassiveEffects` will sometimes result in additional + // passive effects. So we need to keep flushing in a loop until there are + // no more pending effects. + // TODO: Might be better if `flushPassiveEffects` did not automatically + // flush synchronous work at the end, to avoid factoring hazards like this. + flushPassiveEffects(); + } while (rootWithPendingPassiveEffects !== null); + + flushRenderPhaseStrictModeWarningsInDEV(); + + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } + + var finishedWork = root.finishedWork; + var lanes = root.finishedLanes; + + if (finishedWork === null) { + + return null; + } + + root.finishedWork = null; + root.finishedLanes = NoLanes; + + if (!(finishedWork !== root.current)) { + { + throw Error( "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." ); + } + } // commitRoot never returns a continuation; it always finishes synchronously. + // So we can clear these now to allow a new callback to be scheduled. + + + root.callbackNode = null; // Update the first and last pending times on this root. The new first + // pending time is whatever is left on the root fiber. + + var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes); + markRootFinished(root, remainingLanes); // Clear already finished discrete updates in case that a later call of + // `flushDiscreteUpdates` starts a useless render pass which may cancels + // a scheduled timeout. + + if (rootsWithPendingDiscreteUpdates !== null) { + if (!hasDiscreteLanes(remainingLanes) && rootsWithPendingDiscreteUpdates.has(root)) { + rootsWithPendingDiscreteUpdates.delete(root); + } + } + + if (root === workInProgressRoot) { + // We can reset these now that they are finished. + workInProgressRoot = null; + workInProgress = null; + workInProgressRootRenderLanes = NoLanes; + } // Get the list of effects. + + + var firstEffect; + + if (finishedWork.flags > PerformedWork) { + // A fiber's effect list consists only of its children, not itself. So if + // the root has an effect, we need to add it to the end of the list. The + // resulting list is the set that would belong to the root's parent, if it + // had one; that is, all the effects in the tree including the root. + if (finishedWork.lastEffect !== null) { + finishedWork.lastEffect.nextEffect = finishedWork; + firstEffect = finishedWork.firstEffect; + } else { + firstEffect = finishedWork; + } + } else { + // There is no effect on the root. + firstEffect = finishedWork.firstEffect; + } + + if (firstEffect !== null) { + + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles + + ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass + // of the effect list for each phase: all mutation effects come before all + // layout effects, and so on. + // The first phase a "before mutation" phase. We use this phase to read the + // state of the host tree right before we mutate it. This is where + // getSnapshotBeforeUpdate is called. + + focusedInstanceHandle = prepareForCommit(root.containerInfo); + shouldFireAfterActiveInstanceBlur = false; + nextEffect = firstEffect; + + do { + { + invokeGuardedCallback(null, commitBeforeMutationEffects, null); + + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var error = clearCaughtError(); + captureCommitPhaseError(nextEffect, error); + nextEffect = nextEffect.nextEffect; + } + } + } while (nextEffect !== null); // We no longer need to track the active instance fiber + + + focusedInstanceHandle = null; + + { + // Mark the current commit time to be shared by all Profilers in this + // batch. This enables them to be grouped later. + recordCommitTime(); + } // The next phase is the mutation phase, where we mutate the host tree. + + + nextEffect = firstEffect; + + do { + { + invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel); + + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var _error = clearCaughtError(); + + captureCommitPhaseError(nextEffect, _error); + nextEffect = nextEffect.nextEffect; + } + } + } while (nextEffect !== null); + + resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after + // the mutation phase, so that the previous tree is still current during + // componentWillUnmount, but before the layout phase, so that the finished + // work is current during componentDidMount/Update. + + root.current = finishedWork; // The next phase is the layout phase, where we call effects that read + // the host tree after it's been mutated. The idiomatic use case for this is + // layout, but class component lifecycles also fire here for legacy reasons. + + nextEffect = firstEffect; + + do { + { + invokeGuardedCallback(null, commitLayoutEffects, null, root, lanes); + + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var _error2 = clearCaughtError(); + + captureCommitPhaseError(nextEffect, _error2); + nextEffect = nextEffect.nextEffect; + } + } + } while (nextEffect !== null); + + nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an + // opportunity to paint. + + requestPaint(); + + { + popInteractions(prevInteractions); + } + + executionContext = prevExecutionContext; + } else { + // No effects. + root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were + // no effects. + // TODO: Maybe there's a better way to report this. + + { + recordCommitTime(); + } + } + + var rootDidHavePassiveEffects = rootDoesHavePassiveEffects; + + if (rootDoesHavePassiveEffects) { + // This commit has passive effects. Stash a reference to them. But don't + // schedule a callback until after flushing layout work. + rootDoesHavePassiveEffects = false; + rootWithPendingPassiveEffects = root; + pendingPassiveEffectsLanes = lanes; + pendingPassiveEffectsRenderPriority = renderPriorityLevel; + } else { + // We are done with the effect chain at this point so let's clear the + // nextEffect pointers to assist with GC. If we have passive effects, we'll + // clear this in flushPassiveEffects. + nextEffect = firstEffect; + + while (nextEffect !== null) { + var nextNextEffect = nextEffect.nextEffect; + nextEffect.nextEffect = null; + + if (nextEffect.flags & Deletion) { + detachFiberAfterEffects(nextEffect); + } + + nextEffect = nextNextEffect; + } + } // Read this again, since an effect might have updated it + + + remainingLanes = root.pendingLanes; // Check if there's remaining work on this root + + if (remainingLanes !== NoLanes) { + { + if (spawnedWorkDuringRender !== null) { + var expirationTimes = spawnedWorkDuringRender; + spawnedWorkDuringRender = null; + + for (var i = 0; i < expirationTimes.length; i++) { + scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions); + } + } + + schedulePendingInteractions(root, remainingLanes); + } + } else { + // If there's no remaining work, we can clear the set of already failed + // error boundaries. + legacyErrorBoundariesThatAlreadyFailed = null; + } + + { + if (!rootDidHavePassiveEffects) { + // If there are no passive effects, then we can complete the pending interactions. + // Otherwise, we'll wait until after the passive effects are flushed. + // Wait to do this until after remaining work has been scheduled, + // so that we don't prematurely signal complete for interactions when there's e.g. hidden work. + finishPendingInteractions(root, lanes); + } + } + + if (remainingLanes === SyncLane) { + // Count the number of times the root synchronously re-renders without + // finishing. If there are too many, it indicates an infinite update loop. + if (root === rootWithNestedUpdates) { + nestedUpdateCount++; + } else { + nestedUpdateCount = 0; + rootWithNestedUpdates = root; + } + } else { + nestedUpdateCount = 0; + } + + onCommitRoot(finishedWork.stateNode, renderPriorityLevel); + + { + onCommitRoot$1(); + } // Always call this before exiting `commitRoot`, to ensure that any + // additional work on this root is scheduled. + + + ensureRootIsScheduled(root, now()); + + if (hasUncaughtError) { + hasUncaughtError = false; + var _error3 = firstUncaughtError; + firstUncaughtError = null; + throw _error3; + } + + if ((executionContext & LegacyUnbatchedContext) !== NoContext) { + // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired + // synchronously, but layout updates should be deferred until the end + // of the batch. + + + return null; + } // If layout work was scheduled, flush it now. + + + flushSyncCallbackQueue(); + + return null; +} + +function commitBeforeMutationEffects() { + while (nextEffect !== null) { + var current = nextEffect.alternate; + + if (!shouldFireAfterActiveInstanceBlur && focusedInstanceHandle !== null) { + if ((nextEffect.flags & Deletion) !== NoFlags) { + if (doesFiberContain(nextEffect, focusedInstanceHandle)) { + shouldFireAfterActiveInstanceBlur = true; + } + } else { + // TODO: Move this out of the hot path using a dedicated effect tag. + if (nextEffect.tag === SuspenseComponent && isSuspenseBoundaryBeingHidden(current, nextEffect) && doesFiberContain(nextEffect, focusedInstanceHandle)) { + shouldFireAfterActiveInstanceBlur = true; + } + } + } + + var flags = nextEffect.flags; + + if ((flags & Snapshot) !== NoFlags) { + setCurrentFiber(nextEffect); + commitBeforeMutationLifeCycles(current, nextEffect); + resetCurrentFiber(); + } + + if ((flags & Passive) !== NoFlags) { + // If there are passive effects, schedule a callback to flush at + // the earliest opportunity. + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + }); + } + } + + nextEffect = nextEffect.nextEffect; + } +} + +function commitMutationEffects(root, renderPriorityLevel) { + // TODO: Should probably move the bulk of this function to commitWork. + while (nextEffect !== null) { + setCurrentFiber(nextEffect); + var flags = nextEffect.flags; + + if (flags & ContentReset) { + commitResetTextContent(nextEffect); + } + + if (flags & Ref) { + var current = nextEffect.alternate; + + if (current !== null) { + commitDetachRef(current); + } + } // The following switch statement is only concerned about placement, + // updates, and deletions. To avoid needing to add a case for every possible + // bitmap value, we remove the secondary effects from the effect tag and + // switch on that value. + + + var primaryFlags = flags & (Placement | Update | Deletion | Hydrating); + + switch (primaryFlags) { + case Placement: + { + commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is + // inserted, before any life-cycles like componentDidMount gets called. + // TODO: findDOMNode doesn't rely on this any more but isMounted does + // and isMounted is deprecated anyway so we should be able to kill this. + + nextEffect.flags &= ~Placement; + break; + } + + case PlacementAndUpdate: + { + // Placement + commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is + // inserted, before any life-cycles like componentDidMount gets called. + + nextEffect.flags &= ~Placement; // Update + + var _current = nextEffect.alternate; + commitWork(_current, nextEffect); + break; + } + + case Hydrating: + { + nextEffect.flags &= ~Hydrating; + break; + } + + case HydratingAndUpdate: + { + nextEffect.flags &= ~Hydrating; // Update + + var _current2 = nextEffect.alternate; + commitWork(_current2, nextEffect); + break; + } + + case Update: + { + var _current3 = nextEffect.alternate; + commitWork(_current3, nextEffect); + break; + } + + case Deletion: + { + commitDeletion(root, nextEffect); + break; + } + } + + resetCurrentFiber(); + nextEffect = nextEffect.nextEffect; + } +} + +function commitLayoutEffects(root, committedLanes) { + + + while (nextEffect !== null) { + setCurrentFiber(nextEffect); + var flags = nextEffect.flags; + + if (flags & (Update | Callback)) { + var current = nextEffect.alternate; + commitLifeCycles(root, current, nextEffect); + } + + { + if (flags & Ref) { + commitAttachRef(nextEffect); + } + } + + resetCurrentFiber(); + nextEffect = nextEffect.nextEffect; + } +} + +function flushPassiveEffects() { + // Returns whether passive effects were flushed. + if (pendingPassiveEffectsRenderPriority !== NoPriority$1) { + var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority$1 ? NormalPriority$1 : pendingPassiveEffectsRenderPriority; + pendingPassiveEffectsRenderPriority = NoPriority$1; + + { + return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl); + } + } + + return false; +} +function enqueuePendingPassiveHookEffectMount(fiber, effect) { + pendingPassiveHookEffectsMount.push(effect, fiber); + + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + }); + } +} +function enqueuePendingPassiveHookEffectUnmount(fiber, effect) { + pendingPassiveHookEffectsUnmount.push(effect, fiber); + + { + fiber.flags |= PassiveUnmountPendingDev; + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.flags |= PassiveUnmountPendingDev; + } + } + + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + }); + } +} + +function invokePassiveEffectCreate(effect) { + var create = effect.create; + effect.destroy = create(); +} + +function flushPassiveEffectsImpl() { + if (rootWithPendingPassiveEffects === null) { + return false; + } + + var root = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; + rootWithPendingPassiveEffects = null; + pendingPassiveEffectsLanes = NoLanes; + + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Cannot flush passive effects while already rendering." ); + } + } + + { + isFlushingPassiveEffects = true; + } + + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + var prevInteractions = pushInteractions(root); // It's important that ALL pending passive effect destroy functions are called + // before ANY passive effect create functions are called. + // Otherwise effects in sibling components might interfere with each other. + // e.g. a destroy function in one component may unintentionally override a ref + // value set by a create function in another component. + // Layout effects have the same constraint. + // First pass: Destroy stale passive effects. + + var unmountEffects = pendingPassiveHookEffectsUnmount; + pendingPassiveHookEffectsUnmount = []; + + for (var i = 0; i < unmountEffects.length; i += 2) { + var _effect = unmountEffects[i]; + var fiber = unmountEffects[i + 1]; + var destroy = _effect.destroy; + _effect.destroy = undefined; + + { + fiber.flags &= ~PassiveUnmountPendingDev; + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.flags &= ~PassiveUnmountPendingDev; + } + } + + if (typeof destroy === 'function') { + { + setCurrentFiber(fiber); + + { + invokeGuardedCallback(null, destroy, null); + } + + if (hasCaughtError()) { + if (!(fiber !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var error = clearCaughtError(); + captureCommitPhaseError(fiber, error); + } + + resetCurrentFiber(); + } + } + } // Second pass: Create new passive effects. + + + var mountEffects = pendingPassiveHookEffectsMount; + pendingPassiveHookEffectsMount = []; + + for (var _i = 0; _i < mountEffects.length; _i += 2) { + var _effect2 = mountEffects[_i]; + var _fiber = mountEffects[_i + 1]; + + { + setCurrentFiber(_fiber); + + { + invokeGuardedCallback(null, invokePassiveEffectCreate, null, _effect2); + } + + if (hasCaughtError()) { + if (!(_fiber !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var _error4 = clearCaughtError(); + + captureCommitPhaseError(_fiber, _error4); + } + + resetCurrentFiber(); + } + } // Note: This currently assumes there are no passive effects on the root fiber + // because the root is not part of its own effect list. + // This could change in the future. + + + var effect = root.current.firstEffect; + + while (effect !== null) { + var nextNextEffect = effect.nextEffect; // Remove nextEffect pointer to assist GC + + effect.nextEffect = null; + + if (effect.flags & Deletion) { + detachFiberAfterEffects(effect); + } + + effect = nextNextEffect; + } + + { + popInteractions(prevInteractions); + finishPendingInteractions(root, lanes); + } + + { + isFlushingPassiveEffects = false; + } + + executionContext = prevExecutionContext; + flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this + // exceeds the limit, we'll fire a warning. + + nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1; + return true; +} + +function isAlreadyFailedLegacyErrorBoundary(instance) { + return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance); +} +function markLegacyErrorBoundaryAsFailed(instance) { + if (legacyErrorBoundariesThatAlreadyFailed === null) { + legacyErrorBoundariesThatAlreadyFailed = new Set([instance]); + } else { + legacyErrorBoundariesThatAlreadyFailed.add(instance); + } +} + +function prepareToThrowUncaughtError(error) { + if (!hasUncaughtError) { + hasUncaughtError = true; + firstUncaughtError = error; + } +} + +var onUncaughtError = prepareToThrowUncaughtError; + +function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) { + var errorInfo = createCapturedValue(error, sourceFiber); + var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane); + enqueueUpdate(rootFiber, update); + var eventTime = requestEventTime(); + var root = markUpdateLaneFromFiberToRoot(rootFiber, SyncLane); + + if (root !== null) { + markRootUpdated(root, SyncLane, eventTime); + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, SyncLane); + } +} + +function captureCommitPhaseError(sourceFiber, error) { + if (sourceFiber.tag === HostRoot) { + // Error was thrown at the root. There is no parent, so the root + // itself should capture it. + captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error); + return; + } + + var fiber = sourceFiber.return; + + while (fiber !== null) { + if (fiber.tag === HostRoot) { + captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error); + return; + } else if (fiber.tag === ClassComponent) { + var ctor = fiber.type; + var instance = fiber.stateNode; + + if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) { + var errorInfo = createCapturedValue(error, sourceFiber); + var update = createClassErrorUpdate(fiber, errorInfo, SyncLane); + enqueueUpdate(fiber, update); + var eventTime = requestEventTime(); + var root = markUpdateLaneFromFiberToRoot(fiber, SyncLane); + + if (root !== null) { + markRootUpdated(root, SyncLane, eventTime); + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, SyncLane); + } else { + // This component has already been unmounted. + // We can't schedule any follow up work for the root because the fiber is already unmounted, + // but we can still call the log-only boundary so the error isn't swallowed. + // + // TODO This is only a temporary bandaid for the old reconciler fork. + // We can delete this special case once the new fork is merged. + if (typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) { + try { + instance.componentDidCatch(error, errorInfo); + } catch (errorToIgnore) {// TODO Ignore this error? Rethrow it? + // This is kind of an edge case. + } + } + } + + return; + } + } + + fiber = fiber.return; + } +} +function pingSuspendedRoot(root, wakeable, pingedLanes) { + var pingCache = root.pingCache; + + if (pingCache !== null) { + // The wakeable resolved, so we no longer need to memoize, because it will + // never be thrown again. + pingCache.delete(wakeable); + } + + var eventTime = requestEventTime(); + markRootPinged(root, pingedLanes); + + if (workInProgressRoot === root && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) { + // Received a ping at the same priority level at which we're currently + // rendering. We might want to restart this render. This should mirror + // the logic of whether or not a root suspends once it completes. + // TODO: If we're rendering sync either due to Sync, Batched or expired, + // we should probably never restart. + // If we're suspended with delay, or if it's a retry, we'll always suspend + // so we can always restart. + if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) { + // Restart from the root. + prepareFreshStack(root, NoLanes); + } else { + // Even though we can't restart right now, we might get an + // opportunity later. So we mark this render as having a ping. + workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes); + } + } + + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, pingedLanes); +} + +function retryTimedOutBoundary(boundaryFiber, retryLane) { + // The boundary fiber (a Suspense component or SuspenseList component) + // previously was rendered in its fallback state. One of the promises that + // suspended it has resolved, which means at least part of the tree was + // likely unblocked. Try rendering again, at a new expiration time. + if (retryLane === NoLane) { + retryLane = requestRetryLane(boundaryFiber); + } // TODO: Special case idle priority? + + + var eventTime = requestEventTime(); + var root = markUpdateLaneFromFiberToRoot(boundaryFiber, retryLane); + + if (root !== null) { + markRootUpdated(root, retryLane, eventTime); + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, retryLane); + } +} +function resolveRetryWakeable(boundaryFiber, wakeable) { + var retryLane = NoLane; // Default + + var retryCache; + + { + retryCache = boundaryFiber.stateNode; + } + + if (retryCache !== null) { + // The wakeable resolved, so we no longer need to memoize, because it will + // never be thrown again. + retryCache.delete(wakeable); + } + + retryTimedOutBoundary(boundaryFiber, retryLane); +} // Computes the next Just Noticeable Difference (JND) boundary. +// The theory is that a person can't tell the difference between small differences in time. +// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable +// difference in the experience. However, waiting for longer might mean that we can avoid +// showing an intermediate loading state. The longer we have already waited, the harder it +// is to tell small differences in time. Therefore, the longer we've already waited, +// the longer we can wait additionally. At some point we have to give up though. +// We pick a train model where the next boundary commits at a consistent schedule. +// These particular numbers are vague estimates. We expect to adjust them based on research. + +function jnd(timeElapsed) { + return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960; +} + +function checkForNestedUpdates() { + if (nestedUpdateCount > NESTED_UPDATE_LIMIT) { + nestedUpdateCount = 0; + rootWithNestedUpdates = null; + + { + { + throw Error( "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops." ); + } + } + } + + { + if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) { + nestedPassiveUpdateCount = 0; + + error('Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.'); + } + } +} + +function flushRenderPhaseStrictModeWarningsInDEV() { + { + ReactStrictModeWarnings.flushLegacyContextWarning(); + + { + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(); + } + } +} + +var didWarnStateUpdateForNotYetMountedComponent = null; + +function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) { + { + if ((executionContext & RenderContext) !== NoContext) { + // We let the other warning about render phase updates deal with this one. + return; + } + + if (!(fiber.mode & (BlockingMode | ConcurrentMode))) { + return; + } + + var tag = fiber.tag; + + if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) { + // Only warn for user-defined components, not internal ones like Suspense. + return; + } // We show the whole stack but dedupe on the top component's name because + // the problematic code almost always lies inside that component. + + + var componentName = getComponentName(fiber.type) || 'ReactComponent'; + + if (didWarnStateUpdateForNotYetMountedComponent !== null) { + if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) { + return; + } + + didWarnStateUpdateForNotYetMountedComponent.add(componentName); + } else { + didWarnStateUpdateForNotYetMountedComponent = new Set([componentName]); + } + + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error("Can't perform a React state update on a component that hasn't mounted yet. " + 'This indicates that you have a side-effect in your render function that ' + 'asynchronously later calls tries to update the component. Move this work to ' + 'useEffect instead.'); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } +} + +var didWarnStateUpdateForUnmountedComponent = null; + +function warnAboutUpdateOnUnmountedFiberInDEV(fiber) { + { + var tag = fiber.tag; + + if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) { + // Only warn for user-defined components, not internal ones like Suspense. + return; + } // If there are pending passive effects unmounts for this Fiber, + // we can assume that they would have prevented this update. + + + if ((fiber.flags & PassiveUnmountPendingDev) !== NoFlags) { + return; + } // We show the whole stack but dedupe on the top component's name because + // the problematic code almost always lies inside that component. + + + var componentName = getComponentName(fiber.type) || 'ReactComponent'; + + if (didWarnStateUpdateForUnmountedComponent !== null) { + if (didWarnStateUpdateForUnmountedComponent.has(componentName)) { + return; + } + + didWarnStateUpdateForUnmountedComponent.add(componentName); + } else { + didWarnStateUpdateForUnmountedComponent = new Set([componentName]); + } + + if (isFlushingPassiveEffects) ; else { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error("Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function'); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} + +var beginWork$1; + +{ + var dummyFiber = null; + + beginWork$1 = function (current, unitOfWork, lanes) { + // If a component throws an error, we replay it again in a synchronously + // dispatched event, so that the debugger will treat it as an uncaught + // error See ReactErrorUtils for more information. + // Before entering the begin phase, copy the work-in-progress onto a dummy + // fiber. If beginWork throws, we'll use this to reset the state. + var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork); + + try { + return beginWork(current, unitOfWork, lanes); + } catch (originalError) { + if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') { + // Don't replay promises. Treat everything else like an error. + throw originalError; + } // Keep this code in sync with handleError; any changes here must have + // corresponding changes there. + + + resetContextDependencies(); + resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the + // same fiber again. + // Unwind the failed stack frame + + unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber. + + assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy); + + if ( unitOfWork.mode & ProfileMode) { + // Reset the profiler timer. + startProfilerTimer(unitOfWork); + } // Run beginWork again. + + + invokeGuardedCallback(null, beginWork, null, current, unitOfWork, lanes); + + if (hasCaughtError()) { + var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`. + // Rethrow this error instead of the original one. + + throw replayError; + } else { + // This branch is reachable if the render phase is impure. + throw originalError; + } + } + }; +} + +var didWarnAboutUpdateInRender = false; +var didWarnAboutUpdateInRenderForAnotherComponent; + +{ + didWarnAboutUpdateInRenderForAnotherComponent = new Set(); +} + +function warnAboutRenderPhaseUpdatesInDEV(fiber) { + { + if (isRendering && (executionContext & RenderContext) !== NoContext && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + { + var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed. + + var dedupeKey = renderingComponentName; + + if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) { + didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey); + var setStateComponentName = getComponentName(fiber.type) || 'Unknown'; + + error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://reactjs.org/link/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName); + } + + break; + } + + case ClassComponent: + { + if (!didWarnAboutUpdateInRender) { + error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.'); + + didWarnAboutUpdateInRender = true; + } + + break; + } + } + } + } +} // a 'shared' variable that changes when act() opens/closes in tests. + + +var IsThisRendererActing = { + current: false +}; +function warnIfNotScopedWithMatchingAct(fiber) { + { + if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error("It looks like you're using the wrong act() around your test interactions.\n" + 'Be sure to use the matching version of act() corresponding to your renderer:\n\n' + '// for react-dom:\n' + // Break up imports to avoid accidentally parsing them as dependencies. + 'import {act} fr' + "om 'react-dom/test-utils';\n" + '// ...\n' + 'act(() => ...);\n\n' + '// for react-test-renderer:\n' + // Break up imports to avoid accidentally parsing them as dependencies. + 'import TestRenderer fr' + "om react-test-renderer';\n" + 'const {act} = TestRenderer;\n' + '// ...\n' + 'act(() => ...);'); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} +function warnIfNotCurrentlyActingEffectsInDEV(fiber) { + { + if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { + error('An update to %s ran an effect, but was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act', getComponentName(fiber.type)); + } + } +} + +function warnIfNotCurrentlyActingUpdatesInDEV(fiber) { + { + if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error('An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act', getComponentName(fiber.type)); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} + +var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler. + +var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked +// scheduler is the actual recommendation. The alternative could be a testing build, +// a new lib, or whatever; we dunno just yet. This message is for early adopters +// to get their tests right. + +function warnIfUnmockedScheduler(fiber) { + { + if (didWarnAboutUnmockedScheduler === false && Scheduler.unstable_flushAllWithoutAsserting === undefined) { + if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) { + didWarnAboutUnmockedScheduler = true; + + error('In Concurrent or Sync modes, the "scheduler" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + // Break up requires to avoid accidentally parsing them as dependencies. + "jest.mock('scheduler', () => require" + "('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://reactjs.org/link/mock-scheduler'); + } + } + } +} + +function computeThreadID(root, lane) { + // Interaction threads are unique per root and expiration time. + // NOTE: Intentionally unsound cast. All that matters is that it's a number + // and it represents a batch of work. Could make a helper function instead, + // but meh this is fine for now. + return lane * 1000 + root.interactionThreadID; +} + +function markSpawnedWork(lane) { + + if (spawnedWorkDuringRender === null) { + spawnedWorkDuringRender = [lane]; + } else { + spawnedWorkDuringRender.push(lane); + } +} + +function scheduleInteractions(root, lane, interactions) { + + if (interactions.size > 0) { + var pendingInteractionMap = root.pendingInteractionMap; + var pendingInteractions = pendingInteractionMap.get(lane); + + if (pendingInteractions != null) { + interactions.forEach(function (interaction) { + if (!pendingInteractions.has(interaction)) { + // Update the pending async work count for previously unscheduled interaction. + interaction.__count++; + } + + pendingInteractions.add(interaction); + }); + } else { + pendingInteractionMap.set(lane, new Set(interactions)); // Update the pending async work count for the current interactions. + + interactions.forEach(function (interaction) { + interaction.__count++; + }); + } + + var subscriber = tracing.__subscriberRef.current; + + if (subscriber !== null) { + var threadID = computeThreadID(root, lane); + subscriber.onWorkScheduled(interactions, threadID); + } + } +} + +function schedulePendingInteractions(root, lane) { + + scheduleInteractions(root, lane, tracing.__interactionsRef.current); +} + +function startWorkOnPendingInteractions(root, lanes) { + // we can accurately attribute time spent working on it, And so that cascading + // work triggered during the render phase will be associated with it. + + + var interactions = new Set(); + root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledLane) { + if (includesSomeLane(lanes, scheduledLane)) { + scheduledInteractions.forEach(function (interaction) { + return interactions.add(interaction); + }); + } + }); // Store the current set of interactions on the FiberRoot for a few reasons: + // We can re-use it in hot functions like performConcurrentWorkOnRoot() + // without having to recalculate it. We will also use it in commitWork() to + // pass to any Profiler onRender() hooks. This also provides DevTools with a + // way to access it when the onCommitRoot() hook is called. + + root.memoizedInteractions = interactions; + + if (interactions.size > 0) { + var subscriber = tracing.__subscriberRef.current; + + if (subscriber !== null) { + var threadID = computeThreadID(root, lanes); + + try { + subscriber.onWorkStarted(interactions, threadID); + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority$1, function () { + throw error; + }); + } + } + } +} + +function finishPendingInteractions(root, committedLanes) { + + var remainingLanesAfterCommit = root.pendingLanes; + var subscriber; + + try { + subscriber = tracing.__subscriberRef.current; + + if (subscriber !== null && root.memoizedInteractions.size > 0) { + // FIXME: More than one lane can finish in a single commit. + var threadID = computeThreadID(root, committedLanes); + subscriber.onWorkStopped(root.memoizedInteractions, threadID); + } + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority$1, function () { + throw error; + }); + } finally { + // Clear completed interactions from the pending Map. + // Unless the render was suspended or cascading work was scheduled, + // In which case– leave pending interactions until the subsequent render. + var pendingInteractionMap = root.pendingInteractionMap; + pendingInteractionMap.forEach(function (scheduledInteractions, lane) { + // Only decrement the pending interaction count if we're done. + // If there's still work at the current priority, + // That indicates that we are waiting for suspense data. + if (!includesSomeLane(remainingLanesAfterCommit, lane)) { + pendingInteractionMap.delete(lane); + scheduledInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber !== null && interaction.__count === 0) { + try { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority$1, function () { + throw error; + }); + } + } + }); + } + }); + } +} // `act` testing API + +function shouldForceFlushFallbacksInDEV() { + // Never force flush in production. This function should get stripped out. + return actingUpdatesScopeDepth > 0; +} +// so we can tell if any async act() calls try to run in parallel. + + +var actingUpdatesScopeDepth = 0; + +function detachFiberAfterEffects(fiber) { + fiber.sibling = null; + fiber.stateNode = null; +} + +var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below. + +var failedBoundaries = null; +var setRefreshHandler = function (handler) { + { + resolveFamily = handler; + } +}; +function resolveFunctionForHotReloading(type) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return type; + } + + var family = resolveFamily(type); + + if (family === undefined) { + return type; + } // Use the latest known implementation. + + + return family.current; + } +} +function resolveClassForHotReloading(type) { + // No implementation differences. + return resolveFunctionForHotReloading(type); +} +function resolveForwardRefForHotReloading(type) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return type; + } + + var family = resolveFamily(type); + + if (family === undefined) { + // Check if we're dealing with a real forwardRef. Don't want to crash early. + if (type !== null && type !== undefined && typeof type.render === 'function') { + // ForwardRef is special because its resolved .type is an object, + // but it's possible that we only have its inner render function in the map. + // If that inner render function is different, we'll build a new forwardRef type. + var currentRender = resolveFunctionForHotReloading(type.render); + + if (type.render !== currentRender) { + var syntheticType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: currentRender + }; + + if (type.displayName !== undefined) { + syntheticType.displayName = type.displayName; + } + + return syntheticType; + } + } + + return type; + } // Use the latest known implementation. + + + return family.current; + } +} +function isCompatibleFamilyForHotReloading(fiber, element) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return false; + } + + var prevType = fiber.elementType; + var nextType = element.type; // If we got here, we know types aren't === equal. + + var needsCompareFamilies = false; + var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null; + + switch (fiber.tag) { + case ClassComponent: + { + if (typeof nextType === 'function') { + needsCompareFamilies = true; + } + + break; + } + + case FunctionComponent: + { + if (typeof nextType === 'function') { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + // We don't know the inner type yet. + // We're going to assume that the lazy inner type is stable, + // and so it is sufficient to avoid reconciling it away. + // We're not going to unwrap or actually use the new lazy type. + needsCompareFamilies = true; + } + + break; + } + + case ForwardRef: + { + if ($$typeofNextType === REACT_FORWARD_REF_TYPE) { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + + break; + } + + case MemoComponent: + case SimpleMemoComponent: + { + if ($$typeofNextType === REACT_MEMO_TYPE) { + // TODO: if it was but can no longer be simple, + // we shouldn't set this. + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + + break; + } + + default: + return false; + } // Check if both types have a family and it's the same one. + + + if (needsCompareFamilies) { + // Note: memo() and forwardRef() we'll compare outer rather than inner type. + // This means both of them need to be registered to preserve state. + // If we unwrapped and compared the inner types for wrappers instead, + // then we would risk falsely saying two separate memo(Foo) + // calls are equivalent because they wrap the same Foo function. + var prevFamily = resolveFamily(prevType); + + if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) { + return true; + } + } + + return false; + } +} +function markFailedErrorBoundaryForHotReloading(fiber) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return; + } + + if (typeof WeakSet !== 'function') { + return; + } + + if (failedBoundaries === null) { + failedBoundaries = new WeakSet(); + } + + failedBoundaries.add(fiber); + } +} +var scheduleRefresh = function (root, update) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return; + } + + var staleFamilies = update.staleFamilies, + updatedFamilies = update.updatedFamilies; + flushPassiveEffects(); + flushSync(function () { + scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies); + }); + } +}; +var scheduleRoot = function (root, element) { + { + if (root.context !== emptyContextObject) { + // Super edge case: root has a legacy _renderSubtree context + // but we don't know the parentComponent so we can't pass it. + // Just ignore. We'll delete this with _renderSubtree code path later. + return; + } + + flushPassiveEffects(); + flushSync(function () { + updateContainer(element, root, null, null); + }); + } +}; + +function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) { + { + var alternate = fiber.alternate, + child = fiber.child, + sibling = fiber.sibling, + tag = fiber.tag, + type = fiber.type; + var candidateType = null; + + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; + + case ForwardRef: + candidateType = type.render; + break; + } + + if (resolveFamily === null) { + throw new Error('Expected resolveFamily to be set during hot reload.'); + } + + var needsRender = false; + var needsRemount = false; + + if (candidateType !== null) { + var family = resolveFamily(candidateType); + + if (family !== undefined) { + if (staleFamilies.has(family)) { + needsRemount = true; + } else if (updatedFamilies.has(family)) { + if (tag === ClassComponent) { + needsRemount = true; + } else { + needsRender = true; + } + } + } + } + + if (failedBoundaries !== null) { + if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) { + needsRemount = true; + } + } + + if (needsRemount) { + fiber._debugNeedsRemount = true; + } + + if (needsRemount || needsRender) { + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + + if (child !== null && !needsRemount) { + scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies); + } + + if (sibling !== null) { + scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies); + } + } +} + +var findHostInstancesForRefresh = function (root, families) { + { + var hostInstances = new Set(); + var types = new Set(families.map(function (family) { + return family.current; + })); + findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances); + return hostInstances; + } +}; + +function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) { + { + var child = fiber.child, + sibling = fiber.sibling, + tag = fiber.tag, + type = fiber.type; + var candidateType = null; + + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; + + case ForwardRef: + candidateType = type.render; + break; + } + + var didMatch = false; + + if (candidateType !== null) { + if (types.has(candidateType)) { + didMatch = true; + } + } + + if (didMatch) { + // We have a match. This only drills down to the closest host components. + // There's no need to search deeper because for the purpose of giving + // visual feedback, "flashing" outermost parent rectangles is sufficient. + findHostInstancesForFiberShallowly(fiber, hostInstances); + } else { + // If there's no match, maybe there will be one further down in the child tree. + if (child !== null) { + findHostInstancesForMatchingFibersRecursively(child, types, hostInstances); + } + } + + if (sibling !== null) { + findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances); + } + } +} + +function findHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances); + + if (foundHostInstances) { + return; + } // If we didn't find any host children, fallback to closest host parent. + + + var node = fiber; + + while (true) { + switch (node.tag) { + case HostComponent: + hostInstances.add(node.stateNode); + return; + + case HostPortal: + hostInstances.add(node.stateNode.containerInfo); + return; + + case HostRoot: + hostInstances.add(node.stateNode.containerInfo); + return; + } + + if (node.return === null) { + throw new Error('Expected to reach root first.'); + } + + node = node.return; + } + } +} + +function findChildHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var node = fiber; + var foundHostInstances = false; + + while (true) { + if (node.tag === HostComponent) { + // We got a match. + foundHostInstances = true; + hostInstances.add(node.stateNode); // There may still be more, so keep searching. + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === fiber) { + return foundHostInstances; + } + + while (node.sibling === null) { + if (node.return === null || node.return === fiber) { + return foundHostInstances; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + } + + return false; +} + +var hasBadMapPolyfill; + +{ + hasBadMapPolyfill = false; + + try { + var nonExtensibleObject = Object.preventExtensions({}); + /* eslint-disable no-new */ + + new Map([[nonExtensibleObject, null]]); + new Set([nonExtensibleObject]); + /* eslint-enable no-new */ + } catch (e) { + // TODO: Consider warning about bad polyfills + hasBadMapPolyfill = true; + } +} + +var debugCounter = 1; + +function FiberNode(tag, pendingProps, key, mode) { + // Instance + this.tag = tag; + this.key = key; + this.elementType = null; + this.type = null; + this.stateNode = null; // Fiber + + this.return = null; + this.child = null; + this.sibling = null; + this.index = 0; + this.ref = null; + this.pendingProps = pendingProps; + this.memoizedProps = null; + this.updateQueue = null; + this.memoizedState = null; + this.dependencies = null; + this.mode = mode; // Effects + + this.flags = NoFlags; + this.nextEffect = null; + this.firstEffect = null; + this.lastEffect = null; + this.lanes = NoLanes; + this.childLanes = NoLanes; + this.alternate = null; + + { + // Note: The following is done to avoid a v8 performance cliff. + // + // Initializing the fields below to smis and later updating them with + // double values will cause Fibers to end up having separate shapes. + // This behavior/bug has something to do with Object.preventExtension(). + // Fortunately this only impacts DEV builds. + // Unfortunately it makes React unusably slow for some applications. + // To work around this, initialize the fields below with doubles. + // + // Learn more about this here: + // https://github.com/facebook/react/issues/14365 + // https://bugs.chromium.org/p/v8/issues/detail?id=8538 + this.actualDuration = Number.NaN; + this.actualStartTime = Number.NaN; + this.selfBaseDuration = Number.NaN; + this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization. + // This won't trigger the performance cliff mentioned above, + // and it simplifies other profiler code (including DevTools). + + this.actualDuration = 0; + this.actualStartTime = -1; + this.selfBaseDuration = 0; + this.treeBaseDuration = 0; + } + + { + // This isn't directly used but is handy for debugging internals: + this._debugID = debugCounter++; + this._debugSource = null; + this._debugOwner = null; + this._debugNeedsRemount = false; + this._debugHookTypes = null; + + if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') { + Object.preventExtensions(this); + } + } +} // This is a constructor function, rather than a POJO constructor, still +// please ensure we do the following: +// 1) Nobody should add any instance methods on this. Instance methods can be +// more difficult to predict when they get optimized and they are almost +// never inlined properly in static compilers. +// 2) Nobody should rely on `instanceof Fiber` for type testing. We should +// always know when it is a fiber. +// 3) We might want to experiment with using numeric keys since they are easier +// to optimize in a non-JIT environment. +// 4) We can easily go from a constructor to a createFiber object literal if that +// is faster. +// 5) It should be easy to port this to a C struct and keep a C implementation +// compatible. + + +var createFiber = function (tag, pendingProps, key, mode) { + // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors + return new FiberNode(tag, pendingProps, key, mode); +}; + +function shouldConstruct$1(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function isSimpleFunctionComponent(type) { + return typeof type === 'function' && !shouldConstruct$1(type) && type.defaultProps === undefined; +} +function resolveLazyComponentTag(Component) { + if (typeof Component === 'function') { + return shouldConstruct$1(Component) ? ClassComponent : FunctionComponent; + } else if (Component !== undefined && Component !== null) { + var $$typeof = Component.$$typeof; + + if ($$typeof === REACT_FORWARD_REF_TYPE) { + return ForwardRef; + } + + if ($$typeof === REACT_MEMO_TYPE) { + return MemoComponent; + } + } + + return IndeterminateComponent; +} // This is used to create an alternate fiber to do work on. + +function createWorkInProgress(current, pendingProps) { + var workInProgress = current.alternate; + + if (workInProgress === null) { + // We use a double buffering pooling technique because we know that we'll + // only ever need at most two versions of a tree. We pool the "other" unused + // node that we're free to reuse. This is lazily created to avoid allocating + // extra objects for things that are never updated. It also allow us to + // reclaim the extra memory if needed. + workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode); + workInProgress.elementType = current.elementType; + workInProgress.type = current.type; + workInProgress.stateNode = current.stateNode; + + { + // DEV-only fields + workInProgress._debugID = current._debugID; + workInProgress._debugSource = current._debugSource; + workInProgress._debugOwner = current._debugOwner; + workInProgress._debugHookTypes = current._debugHookTypes; + } + + workInProgress.alternate = current; + current.alternate = workInProgress; + } else { + workInProgress.pendingProps = pendingProps; // Needed because Blocks store data on type. + + workInProgress.type = current.type; // We already have an alternate. + // Reset the effect tag. + + workInProgress.flags = NoFlags; // The effect list is no longer valid. + + workInProgress.nextEffect = null; + workInProgress.firstEffect = null; + workInProgress.lastEffect = null; + + { + // We intentionally reset, rather than copy, actualDuration & actualStartTime. + // This prevents time from endlessly accumulating in new commits. + // This has the downside of resetting values for different priority renders, + // But works for yielding (the common case) and should support resuming. + workInProgress.actualDuration = 0; + workInProgress.actualStartTime = -1; + } + } + + workInProgress.childLanes = current.childLanes; + workInProgress.lanes = current.lanes; + workInProgress.child = current.child; + workInProgress.memoizedProps = current.memoizedProps; + workInProgress.memoizedState = current.memoizedState; + workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so + // it cannot be shared with the current fiber. + + var currentDependencies = current.dependencies; + workInProgress.dependencies = currentDependencies === null ? null : { + lanes: currentDependencies.lanes, + firstContext: currentDependencies.firstContext + }; // These will be overridden during the parent's reconciliation + + workInProgress.sibling = current.sibling; + workInProgress.index = current.index; + workInProgress.ref = current.ref; + + { + workInProgress.selfBaseDuration = current.selfBaseDuration; + workInProgress.treeBaseDuration = current.treeBaseDuration; + } + + { + workInProgress._debugNeedsRemount = current._debugNeedsRemount; + + switch (workInProgress.tag) { + case IndeterminateComponent: + case FunctionComponent: + case SimpleMemoComponent: + workInProgress.type = resolveFunctionForHotReloading(current.type); + break; + + case ClassComponent: + workInProgress.type = resolveClassForHotReloading(current.type); + break; + + case ForwardRef: + workInProgress.type = resolveForwardRefForHotReloading(current.type); + break; + } + } + + return workInProgress; +} // Used to reuse a Fiber for a second pass. + +function resetWorkInProgress(workInProgress, renderLanes) { + // This resets the Fiber to what createFiber or createWorkInProgress would + // have set the values to before during the first pass. Ideally this wouldn't + // be necessary but unfortunately many code paths reads from the workInProgress + // when they should be reading from current and writing to workInProgress. + // We assume pendingProps, index, key, ref, return are still untouched to + // avoid doing another reconciliation. + // Reset the effect tag but keep any Placement tags, since that's something + // that child fiber is setting, not the reconciliation. + workInProgress.flags &= Placement; // The effect list is no longer valid. + + workInProgress.nextEffect = null; + workInProgress.firstEffect = null; + workInProgress.lastEffect = null; + var current = workInProgress.alternate; + + if (current === null) { + // Reset to createFiber's initial values. + workInProgress.childLanes = NoLanes; + workInProgress.lanes = renderLanes; + workInProgress.child = null; + workInProgress.memoizedProps = null; + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; + workInProgress.dependencies = null; + workInProgress.stateNode = null; + + { + // Note: We don't reset the actualTime counts. It's useful to accumulate + // actual time across multiple render passes. + workInProgress.selfBaseDuration = 0; + workInProgress.treeBaseDuration = 0; + } + } else { + // Reset to the cloned values that createWorkInProgress would've. + workInProgress.childLanes = current.childLanes; + workInProgress.lanes = current.lanes; + workInProgress.child = current.child; + workInProgress.memoizedProps = current.memoizedProps; + workInProgress.memoizedState = current.memoizedState; + workInProgress.updateQueue = current.updateQueue; // Needed because Blocks store data on type. + + workInProgress.type = current.type; // Clone the dependencies object. This is mutated during the render phase, so + // it cannot be shared with the current fiber. + + var currentDependencies = current.dependencies; + workInProgress.dependencies = currentDependencies === null ? null : { + lanes: currentDependencies.lanes, + firstContext: currentDependencies.firstContext + }; + + { + // Note: We don't reset the actualTime counts. It's useful to accumulate + // actual time across multiple render passes. + workInProgress.selfBaseDuration = current.selfBaseDuration; + workInProgress.treeBaseDuration = current.treeBaseDuration; + } + } + + return workInProgress; +} +function createHostRootFiber(tag) { + var mode; + + if (tag === ConcurrentRoot) { + mode = ConcurrentMode | BlockingMode | StrictMode; + } else if (tag === BlockingRoot) { + mode = BlockingMode | StrictMode; + } else { + mode = NoMode; + } + + if ( isDevToolsPresent) { + // Always collect profile timings when DevTools are present. + // This enables DevTools to start capturing timing at any point– + // Without some nodes in the tree having empty base times. + mode |= ProfileMode; + } + + return createFiber(HostRoot, null, null, mode); +} +function createFiberFromTypeAndProps(type, // React$ElementType +key, pendingProps, owner, mode, lanes) { + var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy. + + var resolvedType = type; + + if (typeof type === 'function') { + if (shouldConstruct$1(type)) { + fiberTag = ClassComponent; + + { + resolvedType = resolveClassForHotReloading(resolvedType); + } + } else { + { + resolvedType = resolveFunctionForHotReloading(resolvedType); + } + } + } else if (typeof type === 'string') { + fiberTag = HostComponent; + } else { + getTag: switch (type) { + case REACT_FRAGMENT_TYPE: + return createFiberFromFragment(pendingProps.children, mode, lanes, key); + + case REACT_DEBUG_TRACING_MODE_TYPE: + fiberTag = Mode; + mode |= DebugTracingMode; + break; + + case REACT_STRICT_MODE_TYPE: + fiberTag = Mode; + mode |= StrictMode; + break; + + case REACT_PROFILER_TYPE: + return createFiberFromProfiler(pendingProps, mode, lanes, key); + + case REACT_SUSPENSE_TYPE: + return createFiberFromSuspense(pendingProps, mode, lanes, key); + + case REACT_SUSPENSE_LIST_TYPE: + return createFiberFromSuspenseList(pendingProps, mode, lanes, key); + + case REACT_OFFSCREEN_TYPE: + return createFiberFromOffscreen(pendingProps, mode, lanes, key); + + case REACT_LEGACY_HIDDEN_TYPE: + return createFiberFromLegacyHidden(pendingProps, mode, lanes, key); + + case REACT_SCOPE_TYPE: + + // eslint-disable-next-line no-fallthrough + + default: + { + if (typeof type === 'object' && type !== null) { + switch (type.$$typeof) { + case REACT_PROVIDER_TYPE: + fiberTag = ContextProvider; + break getTag; + + case REACT_CONTEXT_TYPE: + // This is a consumer + fiberTag = ContextConsumer; + break getTag; + + case REACT_FORWARD_REF_TYPE: + fiberTag = ForwardRef; + + { + resolvedType = resolveForwardRefForHotReloading(resolvedType); + } + + break getTag; + + case REACT_MEMO_TYPE: + fiberTag = MemoComponent; + break getTag; + + case REACT_LAZY_TYPE: + fiberTag = LazyComponent; + resolvedType = null; + break getTag; + + case REACT_BLOCK_TYPE: + fiberTag = Block; + break getTag; + } + } + + var info = ''; + + { + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.'; + } + + var ownerName = owner ? getComponentName(owner.type) : null; + + if (ownerName) { + info += '\n\nCheck the render method of `' + ownerName + '`.'; + } + } + + { + { + throw Error( "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (type == null ? type : typeof type) + "." + info ); + } + } + } + } + } + + var fiber = createFiber(fiberTag, pendingProps, key, mode); + fiber.elementType = type; + fiber.type = resolvedType; + fiber.lanes = lanes; + + { + fiber._debugOwner = owner; + } + + return fiber; +} +function createFiberFromElement(element, mode, lanes) { + var owner = null; + + { + owner = element._owner; + } + + var type = element.type; + var key = element.key; + var pendingProps = element.props; + var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes); + + { + fiber._debugSource = element._source; + fiber._debugOwner = element._owner; + } + + return fiber; +} +function createFiberFromFragment(elements, mode, lanes, key) { + var fiber = createFiber(Fragment, elements, key, mode); + fiber.lanes = lanes; + return fiber; +} + +function createFiberFromProfiler(pendingProps, mode, lanes, key) { + { + if (typeof pendingProps.id !== 'string') { + error('Profiler must specify an "id" as a prop'); + } + } + + var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag. + + fiber.elementType = REACT_PROFILER_TYPE; + fiber.type = REACT_PROFILER_TYPE; + fiber.lanes = lanes; + + { + fiber.stateNode = { + effectDuration: 0, + passiveEffectDuration: 0 + }; + } + + return fiber; +} + +function createFiberFromSuspense(pendingProps, mode, lanes, key) { + var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + + fiber.type = REACT_SUSPENSE_TYPE; + fiber.elementType = REACT_SUSPENSE_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromSuspenseList(pendingProps, mode, lanes, key) { + var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode); + + { + // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + fiber.type = REACT_SUSPENSE_LIST_TYPE; + } + + fiber.elementType = REACT_SUSPENSE_LIST_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromOffscreen(pendingProps, mode, lanes, key) { + var fiber = createFiber(OffscreenComponent, pendingProps, key, mode); // TODO: The OffscreenComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + + { + fiber.type = REACT_OFFSCREEN_TYPE; + } + + fiber.elementType = REACT_OFFSCREEN_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromLegacyHidden(pendingProps, mode, lanes, key) { + var fiber = createFiber(LegacyHiddenComponent, pendingProps, key, mode); // TODO: The LegacyHidden fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + + { + fiber.type = REACT_LEGACY_HIDDEN_TYPE; + } + + fiber.elementType = REACT_LEGACY_HIDDEN_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromText(content, mode, lanes) { + var fiber = createFiber(HostText, content, null, mode); + fiber.lanes = lanes; + return fiber; +} +function createFiberFromHostInstanceForDeletion() { + var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type. + + fiber.elementType = 'DELETED'; + fiber.type = 'DELETED'; + return fiber; +} +function createFiberFromPortal(portal, mode, lanes) { + var pendingProps = portal.children !== null ? portal.children : []; + var fiber = createFiber(HostPortal, pendingProps, portal.key, mode); + fiber.lanes = lanes; + fiber.stateNode = { + containerInfo: portal.containerInfo, + pendingChildren: null, + // Used by persistent updates + implementation: portal.implementation + }; + return fiber; +} // Used for stashing WIP properties to replay failed work in DEV. + +function assignFiberPropertiesInDEV(target, source) { + if (target === null) { + // This Fiber's initial properties will always be overwritten. + // We only use a Fiber to ensure the same hidden class so DEV isn't slow. + target = createFiber(IndeterminateComponent, null, null, NoMode); + } // This is intentionally written as a list of all properties. + // We tried to use Object.assign() instead but this is called in + // the hottest path, and Object.assign() was too slow: + // https://github.com/facebook/react/issues/12502 + // This code is DEV-only so size is not a concern. + + + target.tag = source.tag; + target.key = source.key; + target.elementType = source.elementType; + target.type = source.type; + target.stateNode = source.stateNode; + target.return = source.return; + target.child = source.child; + target.sibling = source.sibling; + target.index = source.index; + target.ref = source.ref; + target.pendingProps = source.pendingProps; + target.memoizedProps = source.memoizedProps; + target.updateQueue = source.updateQueue; + target.memoizedState = source.memoizedState; + target.dependencies = source.dependencies; + target.mode = source.mode; + target.flags = source.flags; + target.nextEffect = source.nextEffect; + target.firstEffect = source.firstEffect; + target.lastEffect = source.lastEffect; + target.lanes = source.lanes; + target.childLanes = source.childLanes; + target.alternate = source.alternate; + + { + target.actualDuration = source.actualDuration; + target.actualStartTime = source.actualStartTime; + target.selfBaseDuration = source.selfBaseDuration; + target.treeBaseDuration = source.treeBaseDuration; + } + + target._debugID = source._debugID; + target._debugSource = source._debugSource; + target._debugOwner = source._debugOwner; + target._debugNeedsRemount = source._debugNeedsRemount; + target._debugHookTypes = source._debugHookTypes; + return target; +} + +function FiberRootNode(containerInfo, tag, hydrate) { + this.tag = tag; + this.containerInfo = containerInfo; + this.pendingChildren = null; + this.current = null; + this.pingCache = null; + this.finishedWork = null; + this.timeoutHandle = noTimeout; + this.context = null; + this.pendingContext = null; + this.hydrate = hydrate; + this.callbackNode = null; + this.callbackPriority = NoLanePriority; + this.eventTimes = createLaneMap(NoLanes); + this.expirationTimes = createLaneMap(NoTimestamp); + this.pendingLanes = NoLanes; + this.suspendedLanes = NoLanes; + this.pingedLanes = NoLanes; + this.expiredLanes = NoLanes; + this.mutableReadLanes = NoLanes; + this.finishedLanes = NoLanes; + this.entangledLanes = NoLanes; + this.entanglements = createLaneMap(NoLanes); + + { + this.mutableSourceEagerHydrationData = null; + } + + { + this.interactionThreadID = tracing.unstable_getThreadID(); + this.memoizedInteractions = new Set(); + this.pendingInteractionMap = new Map(); + } + + { + switch (tag) { + case BlockingRoot: + this._debugRootType = 'createBlockingRoot()'; + break; + + case ConcurrentRoot: + this._debugRootType = 'createRoot()'; + break; + + case LegacyRoot: + this._debugRootType = 'createLegacyRoot()'; + break; + } + } +} + +function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) { + var root = new FiberRootNode(containerInfo, tag, hydrate); + // stateNode is any. + + + var uninitializedFiber = createHostRootFiber(tag); + root.current = uninitializedFiber; + uninitializedFiber.stateNode = root; + initializeUpdateQueue(uninitializedFiber); + return root; +} + +// This ensures that the version used for server rendering matches the one +// that is eventually read during hydration. +// If they don't match there's a potential tear and a full deopt render is required. + +function registerMutableSourceForHydration(root, mutableSource) { + var getVersion = mutableSource._getVersion; + var version = getVersion(mutableSource._source); // TODO Clear this data once all pending hydration work is finished. + // Retaining it forever may interfere with GC. + + if (root.mutableSourceEagerHydrationData == null) { + root.mutableSourceEagerHydrationData = [mutableSource, version]; + } else { + root.mutableSourceEagerHydrationData.push(mutableSource, version); + } +} + +function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation. +implementation) { + var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + return { + // This tag allow us to uniquely identify this as a React Portal + $$typeof: REACT_PORTAL_TYPE, + key: key == null ? null : '' + key, + children: children, + containerInfo: containerInfo, + implementation: implementation + }; +} + +var didWarnAboutNestedUpdates; +var didWarnAboutFindNodeInStrictMode; + +{ + didWarnAboutNestedUpdates = false; + didWarnAboutFindNodeInStrictMode = {}; +} + +function getContextForSubtree(parentComponent) { + if (!parentComponent) { + return emptyContextObject; + } + + var fiber = get(parentComponent); + var parentContext = findCurrentUnmaskedContext(fiber); + + if (fiber.tag === ClassComponent) { + var Component = fiber.type; + + if (isContextProvider(Component)) { + return processChildContext(fiber, Component, parentContext); + } + } + + return parentContext; +} + +function findHostInstanceWithWarning(component, methodName) { + { + var fiber = get(component); + + if (fiber === undefined) { + if (typeof component.render === 'function') { + { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + } else { + { + { + throw Error( "Argument appears to not be a ReactComponent. Keys: " + Object.keys(component) ); + } + } + } + } + + var hostFiber = findCurrentHostFiber(fiber); + + if (hostFiber === null) { + return null; + } + + if (hostFiber.mode & StrictMode) { + var componentName = getComponentName(fiber.type) || 'Component'; + + if (!didWarnAboutFindNodeInStrictMode[componentName]) { + didWarnAboutFindNodeInStrictMode[componentName] = true; + var previousFiber = current; + + try { + setCurrentFiber(hostFiber); + + if (fiber.mode & StrictMode) { + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName); + } else { + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName); + } + } finally { + // Ideally this should reset to previous but this shouldn't be called in + // render and there's another warning for that anyway. + if (previousFiber) { + setCurrentFiber(previousFiber); + } else { + resetCurrentFiber(); + } + } + } + } + + return hostFiber.stateNode; + } +} + +function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) { + return createFiberRoot(containerInfo, tag, hydrate); +} +function updateContainer(element, container, parentComponent, callback) { + { + onScheduleRoot(container, element); + } + + var current$1 = container.current; + var eventTime = requestEventTime(); + + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfUnmockedScheduler(current$1); + warnIfNotScopedWithMatchingAct(current$1); + } + } + + var lane = requestUpdateLane(current$1); + + var context = getContextForSubtree(parentComponent); + + if (container.context === null) { + container.context = context; + } else { + container.pendingContext = context; + } + + { + if (isRendering && current !== null && !didWarnAboutNestedUpdates) { + didWarnAboutNestedUpdates = true; + + error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown'); + } + } + + var update = createUpdate(eventTime, lane); // Caution: React DevTools currently depends on this property + // being called "element". + + update.payload = { + element: element + }; + callback = callback === undefined ? null : callback; + + if (callback !== null) { + { + if (typeof callback !== 'function') { + error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback); + } + } + + update.callback = callback; + } + + enqueueUpdate(current$1, update); + scheduleUpdateOnFiber(current$1, lane, eventTime); + return lane; +} +function getPublicRootInstance(container) { + var containerFiber = container.current; + + if (!containerFiber.child) { + return null; + } + + switch (containerFiber.child.tag) { + case HostComponent: + return getPublicInstance(containerFiber.child.stateNode); + + default: + return containerFiber.child.stateNode; + } +} + +function markRetryLaneImpl(fiber, retryLane) { + var suspenseState = fiber.memoizedState; + + if (suspenseState !== null && suspenseState.dehydrated !== null) { + suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane); + } +} // Increases the priority of thennables when they resolve within this boundary. + + +function markRetryLaneIfNotHydrated(fiber, retryLane) { + markRetryLaneImpl(fiber, retryLane); + var alternate = fiber.alternate; + + if (alternate) { + markRetryLaneImpl(alternate, retryLane); + } +} + +function attemptUserBlockingHydration$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority and they should not suspend on I/O, + // since you have to wrap anything that might suspend in + // Suspense. + return; + } + + var eventTime = requestEventTime(); + var lane = InputDiscreteHydrationLane; + scheduleUpdateOnFiber(fiber, lane, eventTime); + markRetryLaneIfNotHydrated(fiber, lane); +} +function attemptContinuousHydration$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority and they should not suspend on I/O, + // since you have to wrap anything that might suspend in + // Suspense. + return; + } + + var eventTime = requestEventTime(); + var lane = SelectiveHydrationLane; + scheduleUpdateOnFiber(fiber, lane, eventTime); + markRetryLaneIfNotHydrated(fiber, lane); +} +function attemptHydrationAtCurrentPriority$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority other than synchronously flush it. + return; + } + + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + scheduleUpdateOnFiber(fiber, lane, eventTime); + markRetryLaneIfNotHydrated(fiber, lane); +} +function runWithPriority$2(priority, fn) { + + try { + setCurrentUpdateLanePriority(priority); + return fn(); + } finally { + } +} +function findHostInstanceWithNoPortals(fiber) { + var hostFiber = findCurrentHostFiberWithNoPortals(fiber); + + if (hostFiber === null) { + return null; + } + + if (hostFiber.tag === FundamentalComponent) { + return hostFiber.stateNode.instance; + } + + return hostFiber.stateNode; +} + +var shouldSuspendImpl = function (fiber) { + return false; +}; + +function shouldSuspend(fiber) { + return shouldSuspendImpl(fiber); +} +var overrideHookState = null; +var overrideHookStateDeletePath = null; +var overrideHookStateRenamePath = null; +var overrideProps = null; +var overridePropsDeletePath = null; +var overridePropsRenamePath = null; +var scheduleUpdate = null; +var setSuspenseHandler = null; + +{ + var copyWithDeleteImpl = function (obj, path, index) { + var key = path[index]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); + + if (index + 1 === path.length) { + if (Array.isArray(updated)) { + updated.splice(key, 1); + } else { + delete updated[key]; + } + + return updated; + } // $FlowFixMe number or string is fine here + + + updated[key] = copyWithDeleteImpl(obj[key], path, index + 1); + return updated; + }; + + var copyWithDelete = function (obj, path) { + return copyWithDeleteImpl(obj, path, 0); + }; + + var copyWithRenameImpl = function (obj, oldPath, newPath, index) { + var oldKey = oldPath[index]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); + + if (index + 1 === oldPath.length) { + var newKey = newPath[index]; // $FlowFixMe number or string is fine here + + updated[newKey] = updated[oldKey]; + + if (Array.isArray(updated)) { + updated.splice(oldKey, 1); + } else { + delete updated[oldKey]; + } + } else { + // $FlowFixMe number or string is fine here + updated[oldKey] = copyWithRenameImpl( // $FlowFixMe number or string is fine here + obj[oldKey], oldPath, newPath, index + 1); + } + + return updated; + }; + + var copyWithRename = function (obj, oldPath, newPath) { + if (oldPath.length !== newPath.length) { + warn('copyWithRename() expects paths of the same length'); + + return; + } else { + for (var i = 0; i < newPath.length - 1; i++) { + if (oldPath[i] !== newPath[i]) { + warn('copyWithRename() expects paths to be the same except for the deepest key'); + + return; + } + } + } + + return copyWithRenameImpl(obj, oldPath, newPath, 0); + }; + + var copyWithSetImpl = function (obj, path, index, value) { + if (index >= path.length) { + return value; + } + + var key = path[index]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here + + updated[key] = copyWithSetImpl(obj[key], path, index + 1, value); + return updated; + }; + + var copyWithSet = function (obj, path, value) { + return copyWithSetImpl(obj, path, 0, value); + }; + + var findHook = function (fiber, id) { + // For now, the "id" of stateful hooks is just the stateful hook index. + // This may change in the future with e.g. nested hooks. + var currentHook = fiber.memoizedState; + + while (currentHook !== null && id > 0) { + currentHook = currentHook.next; + id--; + } + + return currentHook; + }; // Support DevTools editable values for useState and useReducer. + + + overrideHookState = function (fiber, id, path, value) { + var hook = findHook(fiber, id); + + if (hook !== null) { + var newState = copyWithSet(hook.memoizedState, path, value); + hook.memoizedState = newState; + hook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. + + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + }; + + overrideHookStateDeletePath = function (fiber, id, path) { + var hook = findHook(fiber, id); + + if (hook !== null) { + var newState = copyWithDelete(hook.memoizedState, path); + hook.memoizedState = newState; + hook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. + + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + }; + + overrideHookStateRenamePath = function (fiber, id, oldPath, newPath) { + var hook = findHook(fiber, id); + + if (hook !== null) { + var newState = copyWithRename(hook.memoizedState, oldPath, newPath); + hook.memoizedState = newState; + hook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. + + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + }; // Support DevTools props for function components, forwardRef, memo, host components, etc. + + + overrideProps = function (fiber, path, value) { + fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value); + + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + overridePropsDeletePath = function (fiber, path) { + fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path); + + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + overridePropsRenamePath = function (fiber, oldPath, newPath) { + fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath); + + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + scheduleUpdate = function (fiber) { + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + setSuspenseHandler = function (newShouldSuspendImpl) { + shouldSuspendImpl = newShouldSuspendImpl; + }; +} + +function findHostInstanceByFiber(fiber) { + var hostFiber = findCurrentHostFiber(fiber); + + if (hostFiber === null) { + return null; + } + + return hostFiber.stateNode; +} + +function emptyFindFiberByHostInstance(instance) { + return null; +} + +function getCurrentFiberForDevTools() { + return current; +} + +function injectIntoDevTools(devToolsConfig) { + var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance; + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + return injectInternals({ + bundleType: devToolsConfig.bundleType, + version: devToolsConfig.version, + rendererPackageName: devToolsConfig.rendererPackageName, + rendererConfig: devToolsConfig.rendererConfig, + overrideHookState: overrideHookState, + overrideHookStateDeletePath: overrideHookStateDeletePath, + overrideHookStateRenamePath: overrideHookStateRenamePath, + overrideProps: overrideProps, + overridePropsDeletePath: overridePropsDeletePath, + overridePropsRenamePath: overridePropsRenamePath, + setSuspenseHandler: setSuspenseHandler, + scheduleUpdate: scheduleUpdate, + currentDispatcherRef: ReactCurrentDispatcher, + findHostInstanceByFiber: findHostInstanceByFiber, + findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance, + // React Refresh + findHostInstancesForRefresh: findHostInstancesForRefresh , + scheduleRefresh: scheduleRefresh , + scheduleRoot: scheduleRoot , + setRefreshHandler: setRefreshHandler , + // Enables DevTools to append owner stacks to error messages in DEV mode. + getCurrentFiber: getCurrentFiberForDevTools + }); +} + +function ReactDOMRoot(container, options) { + this._internalRoot = createRootImpl(container, ConcurrentRoot, options); +} + +function ReactDOMBlockingRoot(container, tag, options) { + this._internalRoot = createRootImpl(container, tag, options); +} + +ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) { + var root = this._internalRoot; + + { + if (typeof arguments[1] === 'function') { + error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().'); + } + + var container = root.containerInfo; + + if (container.nodeType !== COMMENT_NODE) { + var hostInstance = findHostInstanceWithNoPortals(root.current); + + if (hostInstance) { + if (hostInstance.parentNode !== container) { + error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + "root.unmount() to empty a root's container."); + } + } + } + } + + updateContainer(children, root, null, null); +}; + +ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () { + { + if (typeof arguments[0] === 'function') { + error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().'); + } + } + + var root = this._internalRoot; + var container = root.containerInfo; + updateContainer(null, root, null, function () { + unmarkContainerAsRoot(container); + }); +}; + +function createRootImpl(container, tag, options) { + // Tag is either LegacyRoot or Concurrent Root + var hydrate = options != null && options.hydrate === true; + var hydrationCallbacks = options != null && options.hydrationOptions || null; + var mutableSources = options != null && options.hydrationOptions != null && options.hydrationOptions.mutableSources || null; + var root = createContainer(container, tag, hydrate); + markContainerAsRoot(root.current, container); + var containerNodeType = container.nodeType; + + { + var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container; + listenToAllSupportedEvents(rootContainerElement); + } + + if (mutableSources) { + for (var i = 0; i < mutableSources.length; i++) { + var mutableSource = mutableSources[i]; + registerMutableSourceForHydration(root, mutableSource); + } + } + + return root; +} +function createLegacyRoot(container, options) { + return new ReactDOMBlockingRoot(container, LegacyRoot, options); +} +function isValidContainer(node) { + return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable ')); +} + +var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner; +var topLevelUpdateWarnings; +var warnedAboutHydrateAPI = false; + +{ + topLevelUpdateWarnings = function (container) { + if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) { + var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current); + + if (hostInstance) { + if (hostInstance.parentNode !== container) { + error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.'); + } + } + } + + var isRootRenderedBySomeReact = !!container._reactRootContainer; + var rootEl = getReactRootElementInContainer(container); + var hasNonRootReactChild = !!(rootEl && getInstanceFromNode(rootEl)); + + if (hasNonRootReactChild && !isRootRenderedBySomeReact) { + error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.'); + } + + if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') { + error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.'); + } + }; +} + +function getReactRootElementInContainer(container) { + if (!container) { + return null; + } + + if (container.nodeType === DOCUMENT_NODE) { + return container.documentElement; + } else { + return container.firstChild; + } +} + +function shouldHydrateDueToLegacyHeuristic(container) { + var rootElement = getReactRootElementInContainer(container); + return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME)); +} + +function legacyCreateRootFromDOMContainer(container, forceHydrate) { + var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content. + + if (!shouldHydrate) { + var warned = false; + var rootSibling; + + while (rootSibling = container.lastChild) { + { + if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) { + warned = true; + + error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.'); + } + } + + container.removeChild(rootSibling); + } + } + + { + if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) { + warnedAboutHydrateAPI = true; + + warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v18. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.'); + } + } + + return createLegacyRoot(container, shouldHydrate ? { + hydrate: true + } : undefined); +} + +function warnOnInvalidCallback$1(callback, callerName) { + { + if (callback !== null && typeof callback !== 'function') { + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); + } + } +} + +function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) { + { + topLevelUpdateWarnings(container); + warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render'); + } // TODO: Without `any` type, Flow says "Property cannot be accessed on any + // member of intersection type." Whyyyyyy. + + + var root = container._reactRootContainer; + var fiberRoot; + + if (!root) { + // Initial mount + root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate); + fiberRoot = root._internalRoot; + + if (typeof callback === 'function') { + var originalCallback = callback; + + callback = function () { + var instance = getPublicRootInstance(fiberRoot); + originalCallback.call(instance); + }; + } // Initial mount should not be batched. + + + unbatchedUpdates(function () { + updateContainer(children, fiberRoot, parentComponent, callback); + }); + } else { + fiberRoot = root._internalRoot; + + if (typeof callback === 'function') { + var _originalCallback = callback; + + callback = function () { + var instance = getPublicRootInstance(fiberRoot); + + _originalCallback.call(instance); + }; + } // Update + + + updateContainer(children, fiberRoot, parentComponent, callback); + } + + return getPublicRootInstance(fiberRoot); +} + +function findDOMNode(componentOrElement) { + { + var owner = ReactCurrentOwner$3.current; + + if (owner !== null && owner.stateNode !== null) { + var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender; + + if (!warnedAboutRefsInRender) { + error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component'); + } + + owner.stateNode._warnedAboutRefsInRender = true; + } + } + + if (componentOrElement == null) { + return null; + } + + if (componentOrElement.nodeType === ELEMENT_NODE) { + return componentOrElement; + } + + { + return findHostInstanceWithWarning(componentOrElement, 'findDOMNode'); + } +} +function hydrate(element, container, callback) { + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } + + { + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?'); + } + } // TODO: throw or warn if we couldn't hydrate? + + + return legacyRenderSubtreeIntoContainer(null, element, container, true, callback); +} +function render(element, container, callback) { + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } + + { + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?'); + } + } + + return legacyRenderSubtreeIntoContainer(null, element, container, false, callback); +} +function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { + if (!isValidContainer(containerNode)) { + { + throw Error( "Target container is not a DOM element." ); + } + } + + if (!(parentComponent != null && has(parentComponent))) { + { + throw Error( "parentComponent must be a valid React Component" ); + } + } + + return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback); +} +function unmountComponentAtNode(container) { + if (!isValidContainer(container)) { + { + throw Error( "unmountComponentAtNode(...): Target container is not a DOM element." ); + } + } + + { + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?'); + } + } + + if (container._reactRootContainer) { + { + var rootEl = getReactRootElementInContainer(container); + var renderedByDifferentReact = rootEl && !getInstanceFromNode(rootEl); + + if (renderedByDifferentReact) { + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.'); + } + } // Unmount should not be batched. + + + unbatchedUpdates(function () { + legacyRenderSubtreeIntoContainer(null, null, container, false, function () { + // $FlowFixMe This should probably use `delete container._reactRootContainer` + container._reactRootContainer = null; + unmarkContainerAsRoot(container); + }); + }); // If you call unmountComponentAtNode twice in quick succession, you'll + // get `true` twice. That's probably fine? + + return true; + } else { + { + var _rootEl = getReactRootElementInContainer(container); + + var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode(_rootEl)); // Check if the container itself is a React root node. + + var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer; + + if (hasNonRootReactChild) { + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.'); + } + } + + return false; + } +} + +setAttemptUserBlockingHydration(attemptUserBlockingHydration$1); +setAttemptContinuousHydration(attemptContinuousHydration$1); +setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1); +setAttemptHydrationAtPriority(runWithPriority$2); +var didWarnAboutUnstableCreatePortal = false; + +{ + if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype + Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype + Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') { + error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills'); + } +} + +setRestoreImplementation(restoreControlledState$3); +setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1); + +function createPortal$1(children, container) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } // TODO: pass ReactDOM portal implementation as third argument + // $FlowFixMe The Flow type is opaque but there's no way to actually create it. + + + return createPortal(children, container, null, key); +} + +function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { + + return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback); +} + +function unstable_createPortal(children, container) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + { + if (!didWarnAboutUnstableCreatePortal) { + didWarnAboutUnstableCreatePortal = true; + + warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 18+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.'); + } + } + + return createPortal$1(children, container, key); +} + +var Internals = { + // Keep in sync with ReactTestUtils.js, and ReactTestUtilsAct.js. + // This is an array for better minification. + Events: [getInstanceFromNode, getNodeFromInstance, getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, flushPassiveEffects, // TODO: This is related to `act`, not events. Move to separate key? + IsThisRendererActing] +}; +var foundDevTools = injectIntoDevTools({ + findFiberByHostInstance: getClosestInstanceFromNode, + bundleType: 1 , + version: ReactVersion, + rendererPackageName: 'react-dom' +}); + +{ + if (!foundDevTools && canUseDOM && window.top === window.self) { + // If we're in Chrome or Firefox, provide a download link if not installed. + if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { + var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://. + + if (/^(https?|file):$/.test(protocol)) { + // eslint-disable-next-line react-internal/no-production-logging + console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://reactjs.org/link/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://reactjs.org/link/react-devtools-faq' : ''), 'font-weight:bold'); + } + } + } +} + +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals; +exports.createPortal = createPortal$1; +exports.findDOMNode = findDOMNode; +exports.flushSync = flushSync; +exports.hydrate = hydrate; +exports.render = render; +exports.unmountComponentAtNode = unmountComponentAtNode; +exports.unstable_batchedUpdates = batchedUpdates$1; +exports.unstable_createPortal = unstable_createPortal; +exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer; +exports.version = ReactVersion; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react-dom/index.js": +/*!*****************************************!*\ + !*** ./node_modules/react-dom/index.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function checkDCE() { + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function' + ) { + return; + } + if (true) { + // This branch is unreachable because this function is only called + // in production, but the condition is true only in development. + // Therefore if the branch is still here, dead code elimination wasn't + // properly applied. + // Don't change the message. React DevTools relies on it. Also make sure + // this message doesn't occur elsewhere in this function, or it will cause + // a false positive. + throw new Error('^_^'); + } + try { + // Verify that the code above has been dead code eliminated (DCE'd). + __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); + } catch (err) { + // DevTools shouldn't crash React, no matter what. + // We should still report in case we break this code. + console.error(err); + } +} + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-dom.development.js */ "./node_modules/react-dom/cjs/react-dom.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react-is/cjs/react-is.development.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-is/cjs/react-is.development.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + + + +if (true) { + (function() { +'use strict'; + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary +// (unstable) APIs that have been removed. Can we remove the symbols? + +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; +var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; +var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; +var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; +var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} // AsyncMode is deprecated along with isAsyncMode + +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} + +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react-is/index.js": +/*!****************************************!*\ + !*** ./node_modules/react-is/index.js ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-is/cjs/react-is.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react/cjs/react.development.js": +/*!*****************************************************!*\ + !*** ./node_modules/react/cjs/react.development.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +// TODO: this is special because it gets imported during build. +var ReactVersion = '17.0.2'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +exports.Fragment = 0xeacb; +exports.StrictMode = 0xeacc; +exports.Profiler = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +exports.Suspense = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + exports.Fragment = symbolFor('react.fragment'); + exports.StrictMode = symbolFor('react.strict_mode'); + exports.Profiler = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + exports.Suspense = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +/** + * Keeps track of the current dispatcher. + */ +var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +/** + * Keeps track of the current batch's configuration such as how long an update + * should suspend for if it needs to. + */ +var ReactCurrentBatchConfig = { + transition: 0 +}; + +/** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ +var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +var ReactDebugCurrentFrame = {}; +var currentExtraStackFrame = null; +function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } +} + +{ + ReactDebugCurrentFrame.setExtraStackFrame = function (stack) { + { + currentExtraStackFrame = stack; + } + }; // Stack implementation injected by the current renderer. + + + ReactDebugCurrentFrame.getCurrentStack = null; + + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ''; // Add an extra top frame while an element is being validated + + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } // Delegate to the injected renderer-specific implementation + + + var impl = ReactDebugCurrentFrame.getCurrentStack; + + if (impl) { + stack += impl() || ''; + } + + return stack; + }; +} + +/** + * Used by act() to track whether you're inside an act() scope. + */ +var IsSomeRendererActing = { + current: false +}; + +var ReactSharedInternals = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentBatchConfig: ReactCurrentBatchConfig, + ReactCurrentOwner: ReactCurrentOwner, + IsSomeRendererActing: IsSomeRendererActing, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign: _assign +}; + +{ + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; +} + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } +} +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +var didWarnStateUpdateForUnmountedComponent = {}; + +function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; + + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); + + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } +} +/** + * This is the abstract API for an update queue. + */ + + +var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); + } +}; + +var emptyObject = {}; + +{ + Object.freeze(emptyObject); +} +/** + * Base class helpers for the updating state of a component. + */ + + +function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. + + this.updater = updater || ReactNoopUpdateQueue; +} + +Component.prototype.isReactComponent = {}; +/** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + +Component.prototype.setState = function (partialState, callback) { + if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { + { + throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." ); + } + } + + this.updater.enqueueSetState(this, partialState, callback, 'setState'); +}; +/** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + + +Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); +}; +/** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + + +{ + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; + + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); + + return undefined; + } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } +} + +function ComponentDummy() {} + +ComponentDummy.prototype = Component.prototype; +/** + * Convenience component with default shallow equality check for sCU. + */ + +function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; +} + +var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); +pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. + +_assign(pureComponentPrototype, Component.prototype); + +pureComponentPrototype.isPureReactComponent = true; + +// an immutable object with a single mutable value +function createRef() { + var refObject = { + current: null + }; + + { + Object.seal(refObject); + } + + return refObject; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case exports.Fragment: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case exports.Profiler: + return 'Profiler'; + + case exports.StrictMode: + return 'StrictMode'; + + case exports.Suspense: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); +} + +function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); +} + +function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ + +function createElement(type, config, children) { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + + if (hasValidKey(config)) { + key = '' + config.key; + } + + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + + props.children = childArray; + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); +} +function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; +} +/** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ + +function cloneElement(element, config, children) { + if (!!(element === null || element === undefined)) { + { + throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." ); + } + } + + var propName; // Original props are copied + + var props = _assign({}, element.props); // Reserved names are extracted + + + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. + + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + + var source = element._source; // Owner will be preserved, unless ref is overridden + + var owner = element._owner; + + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + + if (hasValidKey(config)) { + key = '' + config.key; + } // Remaining properties override existing props + + + var defaultProps; + + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} + +var SEPARATOR = '.'; +var SUBSEPARATOR = ':'; +/** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ + +function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; +} +/** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + +var didWarnAboutMaps = false; +var userProvidedKeyEscapeRegex = /\/+/g; + +function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, '$&/'); +} +/** + * Generate a key string that identifies a element within a set. + * + * @param {*} element A element that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + + +function getElementKey(element, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof element === 'object' && element !== null && element.key != null) { + // Explicit key + return escape('' + element.key); + } // Implicit key determined by the index in the set + + + return index.toString(36); +} + +function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + var invokeCallback = false; + + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; + + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + + } + } + + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows: + + var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + + if (Array.isArray(mappedChild)) { + var escapedChildKey = ''; + + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + '/'; + } + + mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); + } + + array.push(mappedChild); + } + + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var iterableChildren = children; + + { + // Warn about using Maps as children + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } + + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === 'object') { + var childrenString = '' + children; + + { + { + throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). If you meant to render a collection of children, use an array instead." ); + } + } + } + } + + return subtreeCount; +} + +/** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ +function mapChildren(children, func, context) { + if (children == null) { + return children; + } + + var result = []; + var count = 0; + mapIntoArray(children, result, '', '', function (child) { + return func.call(context, child, count++); + }); + return result; +} +/** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + + +function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; // Don't return anything + }); + return n; +} + +/** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ +function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function () { + forEachFunc.apply(this, arguments); // Don't return anything. + }, forEachContext); +} +/** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ + + +function toArray(children) { + return mapChildren(children, function (child) { + return child; + }) || []; +} +/** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ + + +function onlyChild(children) { + if (!isValidElement(children)) { + { + throw Error( "React.Children.only expected to receive a single React element child." ); + } + } + + return children; +} + +function createContext(defaultValue, calculateChangedBits) { + if (calculateChangedBits === undefined) { + calculateChangedBits = null; + } else { + { + if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') { + error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits); + } + } + } + + var context = { + $$typeof: REACT_CONTEXT_TYPE, + _calculateChangedBits: calculateChangedBits, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context, + _calculateChangedBits: context._calculateChangedBits + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + + error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } + + return context.Consumer; + } + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); + + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + + context.Consumer = Consumer; + } + + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + + return context; +} + +var Uninitialized = -1; +var Pending = 0; +var Resolved = 1; +var Rejected = 2; + +function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); // Transition to the next state. + + var pending = payload; + pending._status = Pending; + pending._result = thenable; + thenable.then(function (moduleObject) { + if (payload._status === Pending) { + var defaultExport = moduleObject.default; + + { + if (defaultExport === undefined) { + error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); + } + } // Transition to the next state. + + + var resolved = payload; + resolved._status = Resolved; + resolved._result = defaultExport; + } + }, function (error) { + if (payload._status === Pending) { + // Transition to the next state. + var rejected = payload; + rejected._status = Rejected; + rejected._result = error; + } + }); + } + + if (payload._status === Resolved) { + return payload._result; + } else { + throw payload._result; + } +} + +function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: -1, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + + { + // In production, this would just set it on the object. + var defaultProps; + var propTypes; // $FlowFixMe + + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); + } + } + }); + } + + return lazyType; +} + +function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); + } + } + + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); + } + } + } + + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (render.displayName == null) { + render.displayName = name; + } + } + }); + } + + return elementType; +} + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableScopeAPI = false; // Experimental Create Event Handle API. + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === exports.Fragment || type === exports.Profiler || type === REACT_DEBUG_TRACING_MODE_TYPE || type === exports.StrictMode || type === exports.Suspense || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { + return true; + } + } + + return false; +} + +function memo(type, compare) { + { + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } + } + + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (type.displayName == null) { + type.displayName = name; + } + } + }); + } + + return elementType; +} + +function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + + if (!(dispatcher !== null)) { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); + } + } + + return dispatcher; +} + +function useContext(Context, unstable_observedBits) { + var dispatcher = resolveDispatcher(); + + { + if (unstable_observedBits !== undefined) { + error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://reactjs.org/link/rules-of-hooks' : ''); + } // TODO: add a more generic warning for invalid values. + + + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. + + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); + } + } + } + + return dispatcher.useContext(Context, unstable_observedBits); +} +function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); +} +function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); +} +function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); +} +function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); +} +function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); +} +function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); +} +function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); +} +function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); +} +function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case exports.Suspense: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} + +function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentName(ReactCurrentOwner.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; +} + +function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; +} + +function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + + return ''; +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + } + + { + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentName(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentName(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} +function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } + + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === exports.Fragment) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; +} +var didWarnAboutDeprecatedCreateFactory = false; +function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it + + + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); + + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + + return validatedFactory; +} +function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + + validatePropTypes(newElement); + return newElement; +} + +{ + + try { + var frozenObject = Object.freeze({}); + /* eslint-disable no-new */ + + new Map([[frozenObject, null]]); + new Set([frozenObject]); + /* eslint-enable no-new */ + } catch (e) { + } +} + +var createElement$1 = createElementWithValidation ; +var cloneElement$1 = cloneElementWithValidation ; +var createFactory = createFactoryWithValidation ; +var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray: toArray, + only: onlyChild +}; + +exports.Children = Children; +exports.Component = Component; +exports.PureComponent = PureComponent; +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; +exports.cloneElement = cloneElement$1; +exports.createContext = createContext; +exports.createElement = createElement$1; +exports.createFactory = createFactory; +exports.createRef = createRef; +exports.forwardRef = forwardRef; +exports.isValidElement = isValidElement; +exports.lazy = lazy; +exports.memo = memo; +exports.useCallback = useCallback; +exports.useContext = useContext; +exports.useDebugValue = useDebugValue; +exports.useEffect = useEffect; +exports.useImperativeHandle = useImperativeHandle; +exports.useLayoutEffect = useLayoutEffect; +exports.useMemo = useMemo; +exports.useReducer = useReducer; +exports.useRef = useRef; +exports.useState = useState; +exports.version = ReactVersion; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react/index.js": +/*!*************************************!*\ + !*** ./node_modules/react/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react.development.js */ "./node_modules/react/cjs/react.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/regenerator-runtime/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/regenerator-runtime/runtime.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var runtime = (function (exports) { + "use strict"; + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + function define(obj, key, value) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + return obj[key]; + } + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects. + define({}, ""); + } catch (err) { + define = function(obj, key, value) { + return obj[key] = value; + }; + } + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + exports.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = define( + GeneratorFunctionPrototype, + toStringTagSymbol, + "GeneratorFunction" + ); + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + define(prototype, method, function(arg) { + return this._invoke(method, arg); + }); + }); + } + + exports.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + exports.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + define(genFun, toStringTagSymbol, "GeneratorFunction"); + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + exports.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return PromiseImpl.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return PromiseImpl.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function(error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + exports.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { + if (PromiseImpl === void 0) PromiseImpl = Promise; + + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList), + PromiseImpl + ); + + return exports.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + define(Gp, toStringTagSymbol, "Generator"); + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + exports.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + exports.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; + + // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + return exports; + +}( + // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + true ? module.exports : undefined +)); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + Function("r", "regeneratorRuntime = r")(runtime); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/cjs/scheduler-tracing.development.js": +/*!*********************************************************************!*\ + !*** ./node_modules/scheduler/cjs/scheduler-tracing.development.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v0.20.2 + * scheduler-tracing.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs. + +var interactionIDCounter = 0; +var threadIDCounter = 0; // Set of currently traced interactions. +// Interactions "stack"– +// Meaning that newly traced interactions are appended to the previously active set. +// When an interaction goes out of scope, the previous set (if any) is restored. + +exports.__interactionsRef = null; // Listener(s) to notify when interactions begin and end. + +exports.__subscriberRef = null; + +{ + exports.__interactionsRef = { + current: new Set() + }; + exports.__subscriberRef = { + current: null + }; +} +function unstable_clear(callback) { + + var prevInteractions = exports.__interactionsRef.current; + exports.__interactionsRef.current = new Set(); + + try { + return callback(); + } finally { + exports.__interactionsRef.current = prevInteractions; + } +} +function unstable_getCurrent() { + { + return exports.__interactionsRef.current; + } +} +function unstable_getThreadID() { + return ++threadIDCounter; +} +function unstable_trace(name, timestamp, callback) { + var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID; + + var interaction = { + __count: 1, + id: interactionIDCounter++, + name: name, + timestamp: timestamp + }; + var prevInteractions = exports.__interactionsRef.current; // Traced interactions should stack/accumulate. + // To do that, clone the current interactions. + // The previous set will be restored upon completion. + + var interactions = new Set(prevInteractions); + interactions.add(interaction); + exports.__interactionsRef.current = interactions; + var subscriber = exports.__subscriberRef.current; + var returnValue; + + try { + if (subscriber !== null) { + subscriber.onInteractionTraced(interaction); + } + } finally { + try { + if (subscriber !== null) { + subscriber.onWorkStarted(interactions, threadID); + } + } finally { + try { + returnValue = callback(); + } finally { + exports.__interactionsRef.current = prevInteractions; + + try { + if (subscriber !== null) { + subscriber.onWorkStopped(interactions, threadID); + } + } finally { + interaction.__count--; // If no async work was scheduled for this interaction, + // Notify subscribers that it's completed. + + if (subscriber !== null && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + } + } + } + } + + return returnValue; +} +function unstable_wrap(callback) { + var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID; + + var wrappedInteractions = exports.__interactionsRef.current; + var subscriber = exports.__subscriberRef.current; + + if (subscriber !== null) { + subscriber.onWorkScheduled(wrappedInteractions, threadID); + } // Update the pending async work count for the current interactions. + // Update after calling subscribers in case of error. + + + wrappedInteractions.forEach(function (interaction) { + interaction.__count++; + }); + var hasRun = false; + + function wrapped() { + var prevInteractions = exports.__interactionsRef.current; + exports.__interactionsRef.current = wrappedInteractions; + subscriber = exports.__subscriberRef.current; + + try { + var returnValue; + + try { + if (subscriber !== null) { + subscriber.onWorkStarted(wrappedInteractions, threadID); + } + } finally { + try { + returnValue = callback.apply(undefined, arguments); + } finally { + exports.__interactionsRef.current = prevInteractions; + + if (subscriber !== null) { + subscriber.onWorkStopped(wrappedInteractions, threadID); + } + } + } + + return returnValue; + } finally { + if (!hasRun) { + // We only expect a wrapped function to be executed once, + // But in the event that it's executed more than once– + // Only decrement the outstanding interaction counts once. + hasRun = true; // Update pending async counts for all wrapped interactions. + // If this was the last scheduled async work for any of them, + // Mark them as completed. + + wrappedInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber !== null && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + }); + } + } + } + + wrapped.cancel = function cancel() { + subscriber = exports.__subscriberRef.current; + + try { + if (subscriber !== null) { + subscriber.onWorkCanceled(wrappedInteractions, threadID); + } + } finally { + // Update pending async counts for all wrapped interactions. + // If this was the last scheduled async work for any of them, + // Mark them as completed. + wrappedInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + }); + } + }; + + return wrapped; +} + +var subscribers = null; + +{ + subscribers = new Set(); +} + +function unstable_subscribe(subscriber) { + { + subscribers.add(subscriber); + + if (subscribers.size === 1) { + exports.__subscriberRef.current = { + onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted, + onInteractionTraced: onInteractionTraced, + onWorkCanceled: onWorkCanceled, + onWorkScheduled: onWorkScheduled, + onWorkStarted: onWorkStarted, + onWorkStopped: onWorkStopped + }; + } + } +} +function unstable_unsubscribe(subscriber) { + { + subscribers.delete(subscriber); + + if (subscribers.size === 0) { + exports.__subscriberRef.current = null; + } + } +} + +function onInteractionTraced(interaction) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onInteractionTraced(interaction); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onInteractionScheduledWorkCompleted(interaction) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkScheduled(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkScheduled(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkStarted(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkStarted(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkStopped(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkStopped(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkCanceled(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkCanceled(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +exports.unstable_clear = unstable_clear; +exports.unstable_getCurrent = unstable_getCurrent; +exports.unstable_getThreadID = unstable_getThreadID; +exports.unstable_subscribe = unstable_subscribe; +exports.unstable_trace = unstable_trace; +exports.unstable_unsubscribe = unstable_unsubscribe; +exports.unstable_wrap = unstable_wrap; + })(); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/cjs/scheduler.development.js": +/*!*************************************************************!*\ + !*** ./node_modules/scheduler/cjs/scheduler.development.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v0.20.2 + * scheduler.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var enableSchedulerDebugging = false; +var enableProfiling = false; + +var requestHostCallback; +var requestHostTimeout; +var cancelHostTimeout; +var requestPaint; +var hasPerformanceNow = typeof performance === 'object' && typeof performance.now === 'function'; + +if (hasPerformanceNow) { + var localPerformance = performance; + + exports.unstable_now = function () { + return localPerformance.now(); + }; +} else { + var localDate = Date; + var initialTime = localDate.now(); + + exports.unstable_now = function () { + return localDate.now() - initialTime; + }; +} + +if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive +// implementation using setTimeout. +typeof window === 'undefined' || // Check if MessageChannel is supported, too. +typeof MessageChannel !== 'function') { + // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore, + // fallback to a naive implementation. + var _callback = null; + var _timeoutID = null; + + var _flushCallback = function () { + if (_callback !== null) { + try { + var currentTime = exports.unstable_now(); + var hasRemainingTime = true; + + _callback(hasRemainingTime, currentTime); + + _callback = null; + } catch (e) { + setTimeout(_flushCallback, 0); + throw e; + } + } + }; + + requestHostCallback = function (cb) { + if (_callback !== null) { + // Protect against re-entrancy. + setTimeout(requestHostCallback, 0, cb); + } else { + _callback = cb; + setTimeout(_flushCallback, 0); + } + }; + + requestHostTimeout = function (cb, ms) { + _timeoutID = setTimeout(cb, ms); + }; + + cancelHostTimeout = function () { + clearTimeout(_timeoutID); + }; + + exports.unstable_shouldYield = function () { + return false; + }; + + requestPaint = exports.unstable_forceFrameRate = function () {}; +} else { + // Capture local references to native APIs, in case a polyfill overrides them. + var _setTimeout = window.setTimeout; + var _clearTimeout = window.clearTimeout; + + if (typeof console !== 'undefined') { + // TODO: Scheduler no longer requires these methods to be polyfilled. But + // maybe we want to continue warning if they don't exist, to preserve the + // option to rely on it in the future? + var requestAnimationFrame = window.requestAnimationFrame; + var cancelAnimationFrame = window.cancelAnimationFrame; + + if (typeof requestAnimationFrame !== 'function') { + // Using console['error'] to evade Babel and ESLint + console['error']("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills'); + } + + if (typeof cancelAnimationFrame !== 'function') { + // Using console['error'] to evade Babel and ESLint + console['error']("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills'); + } + } + + var isMessageLoopRunning = false; + var scheduledHostCallback = null; + var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main + // thread, like user events. By default, it yields multiple times per frame. + // It does not attempt to align with frame boundaries, since most tasks don't + // need to be frame aligned; for those that do, use requestAnimationFrame. + + var yieldInterval = 5; + var deadline = 0; // TODO: Make this configurable + + { + // `isInputPending` is not available. Since we have no way of knowing if + // there's pending input, always yield at the end of the frame. + exports.unstable_shouldYield = function () { + return exports.unstable_now() >= deadline; + }; // Since we yield every frame regardless, `requestPaint` has no effect. + + + requestPaint = function () {}; + } + + exports.unstable_forceFrameRate = function (fps) { + if (fps < 0 || fps > 125) { + // Using console['error'] to evade Babel and ESLint + console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing frame rates higher than 125 fps is not supported'); + return; + } + + if (fps > 0) { + yieldInterval = Math.floor(1000 / fps); + } else { + // reset the framerate + yieldInterval = 5; + } + }; + + var performWorkUntilDeadline = function () { + if (scheduledHostCallback !== null) { + var currentTime = exports.unstable_now(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync + // cycle. This means there's always time remaining at the beginning of + // the message event. + + deadline = currentTime + yieldInterval; + var hasTimeRemaining = true; + + try { + var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + + if (!hasMoreWork) { + isMessageLoopRunning = false; + scheduledHostCallback = null; + } else { + // If there's more work, schedule the next message event at the end + // of the preceding one. + port.postMessage(null); + } + } catch (error) { + // If a scheduler task throws, exit the current browser task so the + // error can be observed. + port.postMessage(null); + throw error; + } + } else { + isMessageLoopRunning = false; + } // Yielding to the browser will give it a chance to paint, so we can + }; + + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; + + requestHostCallback = function (callback) { + scheduledHostCallback = callback; + + if (!isMessageLoopRunning) { + isMessageLoopRunning = true; + port.postMessage(null); + } + }; + + requestHostTimeout = function (callback, ms) { + taskTimeoutID = _setTimeout(function () { + callback(exports.unstable_now()); + }, ms); + }; + + cancelHostTimeout = function () { + _clearTimeout(taskTimeoutID); + + taskTimeoutID = -1; + }; +} + +function push(heap, node) { + var index = heap.length; + heap.push(node); + siftUp(heap, node, index); +} +function peek(heap) { + var first = heap[0]; + return first === undefined ? null : first; +} +function pop(heap) { + var first = heap[0]; + + if (first !== undefined) { + var last = heap.pop(); + + if (last !== first) { + heap[0] = last; + siftDown(heap, last, 0); + } + + return first; + } else { + return null; + } +} + +function siftUp(heap, node, i) { + var index = i; + + while (true) { + var parentIndex = index - 1 >>> 1; + var parent = heap[parentIndex]; + + if (parent !== undefined && compare(parent, node) > 0) { + // The parent is larger. Swap positions. + heap[parentIndex] = node; + heap[index] = parent; + index = parentIndex; + } else { + // The parent is smaller. Exit. + return; + } + } +} + +function siftDown(heap, node, i) { + var index = i; + var length = heap.length; + + while (index < length) { + var leftIndex = (index + 1) * 2 - 1; + var left = heap[leftIndex]; + var rightIndex = leftIndex + 1; + var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those. + + if (left !== undefined && compare(left, node) < 0) { + if (right !== undefined && compare(right, left) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + heap[index] = left; + heap[leftIndex] = node; + index = leftIndex; + } + } else if (right !== undefined && compare(right, node) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + // Neither child is smaller. Exit. + return; + } + } +} + +function compare(a, b) { + // Compare sort index first, then task id. + var diff = a.sortIndex - b.sortIndex; + return diff !== 0 ? diff : a.id - b.id; +} + +// TODO: Use symbols? +var ImmediatePriority = 1; +var UserBlockingPriority = 2; +var NormalPriority = 3; +var LowPriority = 4; +var IdlePriority = 5; + +function markTaskErrored(task, ms) { +} + +/* eslint-disable no-var */ +// Math.pow(2, 30) - 1 +// 0b111111111111111111111111111111 + +var maxSigned31BitInt = 1073741823; // Times out immediately + +var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out + +var USER_BLOCKING_PRIORITY_TIMEOUT = 250; +var NORMAL_PRIORITY_TIMEOUT = 5000; +var LOW_PRIORITY_TIMEOUT = 10000; // Never times out + +var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt; // Tasks are stored on a min heap + +var taskQueue = []; +var timerQueue = []; // Incrementing id counter. Used to maintain insertion order. + +var taskIdCounter = 1; // Pausing the scheduler is useful for debugging. +var currentTask = null; +var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy. + +var isPerformingWork = false; +var isHostCallbackScheduled = false; +var isHostTimeoutScheduled = false; + +function advanceTimers(currentTime) { + // Check for tasks that are no longer delayed and add them to the queue. + var timer = peek(timerQueue); + + while (timer !== null) { + if (timer.callback === null) { + // Timer was cancelled. + pop(timerQueue); + } else if (timer.startTime <= currentTime) { + // Timer fired. Transfer to the task queue. + pop(timerQueue); + timer.sortIndex = timer.expirationTime; + push(taskQueue, timer); + } else { + // Remaining timers are pending. + return; + } + + timer = peek(timerQueue); + } +} + +function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); + + if (!isHostCallbackScheduled) { + if (peek(taskQueue) !== null) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } else { + var firstTimer = peek(timerQueue); + + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + } + } +} + +function flushWork(hasTimeRemaining, initialTime) { + + + isHostCallbackScheduled = false; + + if (isHostTimeoutScheduled) { + // We scheduled a timeout but it's no longer needed. Cancel it. + isHostTimeoutScheduled = false; + cancelHostTimeout(); + } + + isPerformingWork = true; + var previousPriorityLevel = currentPriorityLevel; + + try { + if (enableProfiling) { + try { + return workLoop(hasTimeRemaining, initialTime); + } catch (error) { + if (currentTask !== null) { + var currentTime = exports.unstable_now(); + markTaskErrored(currentTask, currentTime); + currentTask.isQueued = false; + } + + throw error; + } + } else { + // No catch in prod code path. + return workLoop(hasTimeRemaining, initialTime); + } + } finally { + currentTask = null; + currentPriorityLevel = previousPriorityLevel; + isPerformingWork = false; + } +} + +function workLoop(hasTimeRemaining, initialTime) { + var currentTime = initialTime; + advanceTimers(currentTime); + currentTask = peek(taskQueue); + + while (currentTask !== null && !(enableSchedulerDebugging )) { + if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || exports.unstable_shouldYield())) { + // This currentTask hasn't expired, and we've reached the deadline. + break; + } + + var callback = currentTask.callback; + + if (typeof callback === 'function') { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; + + var continuationCallback = callback(didUserCallbackTimeout); + currentTime = exports.unstable_now(); + + if (typeof continuationCallback === 'function') { + currentTask.callback = continuationCallback; + } else { + + if (currentTask === peek(taskQueue)) { + pop(taskQueue); + } + } + + advanceTimers(currentTime); + } else { + pop(taskQueue); + } + + currentTask = peek(taskQueue); + } // Return whether there's additional work + + + if (currentTask !== null) { + return true; + } else { + var firstTimer = peek(timerQueue); + + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + + return false; + } +} + +function unstable_runWithPriority(priorityLevel, eventHandler) { + switch (priorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + case LowPriority: + case IdlePriority: + break; + + default: + priorityLevel = NormalPriority; + } + + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } +} + +function unstable_next(eventHandler) { + var priorityLevel; + + switch (currentPriorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + // Shift down to normal priority + priorityLevel = NormalPriority; + break; + + default: + // Anything lower than normal priority should remain at the current level. + priorityLevel = currentPriorityLevel; + break; + } + + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } +} + +function unstable_wrapCallback(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function () { + // This is a fork of runWithPriority, inlined for performance. + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; + + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; +} + +function unstable_scheduleCallback(priorityLevel, callback, options) { + var currentTime = exports.unstable_now(); + var startTime; + + if (typeof options === 'object' && options !== null) { + var delay = options.delay; + + if (typeof delay === 'number' && delay > 0) { + startTime = currentTime + delay; + } else { + startTime = currentTime; + } + } else { + startTime = currentTime; + } + + var timeout; + + switch (priorityLevel) { + case ImmediatePriority: + timeout = IMMEDIATE_PRIORITY_TIMEOUT; + break; + + case UserBlockingPriority: + timeout = USER_BLOCKING_PRIORITY_TIMEOUT; + break; + + case IdlePriority: + timeout = IDLE_PRIORITY_TIMEOUT; + break; + + case LowPriority: + timeout = LOW_PRIORITY_TIMEOUT; + break; + + case NormalPriority: + default: + timeout = NORMAL_PRIORITY_TIMEOUT; + break; + } + + var expirationTime = startTime + timeout; + var newTask = { + id: taskIdCounter++, + callback: callback, + priorityLevel: priorityLevel, + startTime: startTime, + expirationTime: expirationTime, + sortIndex: -1 + }; + + if (startTime > currentTime) { + // This is a delayed task. + newTask.sortIndex = startTime; + push(timerQueue, newTask); + + if (peek(taskQueue) === null && newTask === peek(timerQueue)) { + // All tasks are delayed, and this is the task with the earliest delay. + if (isHostTimeoutScheduled) { + // Cancel an existing timeout. + cancelHostTimeout(); + } else { + isHostTimeoutScheduled = true; + } // Schedule a timeout. + + + requestHostTimeout(handleTimeout, startTime - currentTime); + } + } else { + newTask.sortIndex = expirationTime; + push(taskQueue, newTask); + // wait until the next time we yield. + + + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + + return newTask; +} + +function unstable_pauseExecution() { +} + +function unstable_continueExecution() { + + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } +} + +function unstable_getFirstCallbackNode() { + return peek(taskQueue); +} + +function unstable_cancelCallback(task) { + // remove from the queue because you can't remove arbitrary nodes from an + // array based heap, only the first one.) + + + task.callback = null; +} + +function unstable_getCurrentPriorityLevel() { + return currentPriorityLevel; +} + +var unstable_requestPaint = requestPaint; +var unstable_Profiling = null; + +exports.unstable_IdlePriority = IdlePriority; +exports.unstable_ImmediatePriority = ImmediatePriority; +exports.unstable_LowPriority = LowPriority; +exports.unstable_NormalPriority = NormalPriority; +exports.unstable_Profiling = unstable_Profiling; +exports.unstable_UserBlockingPriority = UserBlockingPriority; +exports.unstable_cancelCallback = unstable_cancelCallback; +exports.unstable_continueExecution = unstable_continueExecution; +exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; +exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode; +exports.unstable_next = unstable_next; +exports.unstable_pauseExecution = unstable_pauseExecution; +exports.unstable_requestPaint = unstable_requestPaint; +exports.unstable_runWithPriority = unstable_runWithPriority; +exports.unstable_scheduleCallback = unstable_scheduleCallback; +exports.unstable_wrapCallback = unstable_wrapCallback; + })(); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/index.js": +/*!*****************************************!*\ + !*** ./node_modules/scheduler/index.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/scheduler.development.js */ "./node_modules/scheduler/cjs/scheduler.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/tracing.js": +/*!*******************************************!*\ + !*** ./node_modules/scheduler/tracing.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/scheduler-tracing.development.js */ "./node_modules/scheduler/cjs/scheduler-tracing.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js": +/*!***********************************************************************!*\ + !*** ./node_modules/stacktrace-parser/dist/stack-trace-parser.esm.js ***! + \***********************************************************************/ +/*! exports provided: parse */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parse", function() { return parse; }); +var UNKNOWN_FUNCTION = '<unknown>'; +/** + * This parses the different stack traces and puts them into one format + * This borrows heavily from TraceKit (https://github.com/csnover/TraceKit) + */ + +function parse(stackString) { + var lines = stackString.split('\n'); + return lines.reduce(function (stack, line) { + var parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line); + + if (parseResult) { + stack.push(parseResult); + } + + return stack; + }, []); +} +var chromeRe = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; +var chromeEvalRe = /\((\S*)(?::(\d+))(?::(\d+))\)/; + +function parseChrome(line) { + var parts = chromeRe.exec(line); + + if (!parts) { + return null; + } + + var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line + + var isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line + + var submatch = chromeEvalRe.exec(parts[2]); + + if (isEval && submatch != null) { + // throw out eval line/column and use top-most line/column number + parts[2] = submatch[1]; // url + + parts[3] = submatch[2]; // line + + parts[4] = submatch[3]; // column + } + + return { + file: !isNative ? parts[2] : null, + methodName: parts[1] || UNKNOWN_FUNCTION, + arguments: isNative ? [parts[2]] : [], + lineNumber: parts[3] ? +parts[3] : null, + column: parts[4] ? +parts[4] : null + }; +} + +var winjsRe = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; + +function parseWinjs(line) { + var parts = winjsRe.exec(line); + + if (!parts) { + return null; + } + + return { + file: parts[2], + methodName: parts[1] || UNKNOWN_FUNCTION, + arguments: [], + lineNumber: +parts[3], + column: parts[4] ? +parts[4] : null + }; +} + +var geckoRe = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i; +var geckoEvalRe = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; + +function parseGecko(line) { + var parts = geckoRe.exec(line); + + if (!parts) { + return null; + } + + var isEval = parts[3] && parts[3].indexOf(' > eval') > -1; + var submatch = geckoEvalRe.exec(parts[3]); + + if (isEval && submatch != null) { + // throw out eval line/column and use top-most line number + parts[3] = submatch[1]; + parts[4] = submatch[2]; + parts[5] = null; // no column when eval + } + + return { + file: parts[3], + methodName: parts[1] || UNKNOWN_FUNCTION, + arguments: parts[2] ? parts[2].split(',') : [], + lineNumber: parts[4] ? +parts[4] : null, + column: parts[5] ? +parts[5] : null + }; +} + +var javaScriptCoreRe = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i; + +function parseJSC(line) { + var parts = javaScriptCoreRe.exec(line); + + if (!parts) { + return null; + } + + return { + file: parts[3], + methodName: parts[1] || UNKNOWN_FUNCTION, + arguments: [], + lineNumber: +parts[4], + column: parts[5] ? +parts[5] : null + }; +} + +var nodeRe = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i; + +function parseNode(line) { + var parts = nodeRe.exec(line); + + if (!parts) { + return null; + } + + return { + file: parts[2], + methodName: parts[1] || UNKNOWN_FUNCTION, + arguments: [], + lineNumber: +parts[3], + column: parts[4] ? +parts[4] : null + }; +} + + + + +/***/ }) + +},[["./node_modules/next/dist/client/next-dev.js","webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlMaWtlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jb25zdHJ1Y3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9leHRlbmRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3BvbHlmaWxsLW1vZHVsZS9kaXN0L3BvbHlmaWxsLW1vZHVsZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9jbGllbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvRXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9SZWFjdERldk92ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvYnVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvQ29kZUZyYW1lL0NvZGVGcmFtZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL0NvZGVGcmFtZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL0NvZGVGcmFtZS9zdHlsZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9EaWFsb2cvRGlhbG9nLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvRGlhbG9nL0RpYWxvZ0JvZHkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9EaWFsb2cvRGlhbG9nQ29udGVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL0RpYWxvZy9EaWFsb2dIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9EaWFsb2cvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9EaWFsb2cvc3R5bGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvTGVmdFJpZ2h0RGlhbG9nSGVhZGVyL0xlZnRSaWdodERpYWxvZ0hlYWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL0xlZnRSaWdodERpYWxvZ0hlYWRlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL0xlZnRSaWdodERpYWxvZ0hlYWRlci9zdHlsZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9PdmVybGF5L092ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9PdmVybGF5L2JvZHktbG9ja2VyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvT3ZlcmxheS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL092ZXJsYXkvbWFpbnRhaW4tLXRhYi1mb2N1cy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL092ZXJsYXkvc3R5bGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvU2hhZG93UG9ydGFsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvVGVybWluYWwvVGVybWluYWwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9UZXJtaW5hbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL1Rlcm1pbmFsL3N0eWxlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb21wb25lbnRzL1RvYXN0L1RvYXN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2NvbXBvbmVudHMvVG9hc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29tcG9uZW50cy9Ub2FzdC9zdHlsZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29udGFpbmVyL0J1aWxkRXJyb3IuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvY29udGFpbmVyL0Vycm9ycy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9jb250YWluZXIvUnVudGltZUVycm9yLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2hlbHBlcnMvbm9kZVN0YWNrRnJhbWVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL2hlbHBlcnMvbm9vcC10ZW1wbGF0ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9oZWxwZXJzL3BhcnNlU3RhY2suanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvaW50ZXJuYWwvaGVscGVycy9zdGFjay1mcmFtZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9ob29rcy91c2Utb24tY2xpY2stb3V0c2lkZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9zdHlsZXMvQmFzZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9pbnRlcm5hbC9zdHlsZXMvQ29tcG9uZW50U3R5bGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2ludGVybmFsL3N0eWxlcy9Dc3NSZXNldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L25vZGVfbW9kdWxlcy9hbnNpLXJlZ2V4L2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbm9kZV9tb2R1bGVzL3N0cmlwLWFuc2kvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9hbnNlci9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9jc3MuZXNjYXBlL2Nzcy5lc2NhcGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYnVpbGQvcG9seWZpbGxzL29iamVjdC1hc3NpZ24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvZGV2L2Rldi1idWlsZC13YXRjaGVyLmpzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vY2xpZW50L2Rldi9lcnJvci1vdmVybGF5L2V2ZW50c291cmNlLmpzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vY2xpZW50L2Rldi9lcnJvci1vdmVybGF5L2Zvcm1hdC13ZWJwYWNrLW1lc3NhZ2VzLmpzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vY2xpZW50L2Rldi9lcnJvci1vdmVybGF5L2hvdC1kZXYtY2xpZW50LmpzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vY2xpZW50L2Rldi9ldmVudC1zb3VyY2UtcG9seWZpbGwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvZGV2L2ZvdWMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvZGV2L29uLWRlbWFuZC1lbnRyaWVzLWNsaWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL2NsaWVudC9kZXYvb24tZGVtYW5kLWVudHJpZXMtdXRpbHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvZGV2L3dlYnBhY2staG90LW1pZGRsZXdhcmUtY2xpZW50LmpzIiwid2VicGFjazovL19OX0UvLi4vLi4vY2xpZW50L2hlYWQtbWFuYWdlci50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uL2NsaWVudC9pbmRleC50c3giLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvbmV4dC1kZXYuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvbm9ybWFsaXplLXRyYWlsaW5nLXNsYXNoLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vY2xpZW50L3BhZ2UtbG9hZGVyLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vY2xpZW50L3BlcmZvcm1hbmNlLXJlbGF5ZXIudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9jbGllbnQvcG9ydGFsL2luZGV4LnRzeCIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uL2NsaWVudC9yZXF1ZXN0LWlkbGUtY2FsbGJhY2sudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvcm91dGUtYW5ub3VuY2VyLnRzeCIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uL2NsaWVudC9yb3V0ZS1sb2FkZXIudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvcm91dGVyLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vY2xpZW50L3dpdGgtcm91dGVyLnRzeCIsIndlYnBhY2s6Ly9fTl9FLyh3ZWJwYWNrKS9zdHJpcC1hbnNpL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvKHdlYnBhY2spL3dlYi12aXRhbHMvd2ViLXZpdGFscy5lczUudW1kLm1pbi5qcyIsIndlYnBhY2s6Ly9fTl9FLyh3ZWJwYWNrKS93ZWJwYWNrL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly9fTl9FLyh3ZWJwYWNrKS93ZWJwYWNrL21vZHVsZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9oZWFkLW1hbmFnZXItY29udGV4dC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9pMThuL25vcm1hbGl6ZS1sb2NhbGUtcGF0aC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9taXR0LnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci1jb250ZXh0LnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci9yb3V0ZXIudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2Zvcm1hdC11cmwudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2dldC1hc3NldC1wYXRoLWZyb20tcm91dGUudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2lzLWR5bmFtaWMudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3BhcnNlLXJlbGF0aXZlLXVybC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvcXVlcnlzdHJpbmcudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3Jlc29sdmUtcmV3cml0ZXMtbm9vcC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvcm91dGUtbWF0Y2hlci50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvcm91dGUtcmVnZXgudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcnVudGltZS1jb25maWcudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvbmV4dC1zZXJ2ZXIvc2VydmVyL2Rlbm9ybWFsaXplLXBhZ2UtcGF0aC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvcm91dGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcGxhdGZvcm0vcGxhdGZvcm0uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC1kb20vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWlzL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvdHJhY2luZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3N0YWNrdHJhY2UtcGFyc2VyL2Rpc3Qvc3RhY2stdHJhY2UtcGFyc2VyLmVzbS5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwib25seUZpcnN0IiwicGF0dGVybiIsImpvaW4iLCJSZWdFeHAiLCJ1bmRlZmluZWQiLCJhbnNpUmVnZXgiLCJyZXF1aXJlIiwic3RyaW5nIiwicmVwbGFjZSIsInNoYWRvd0hvc3QiLCJkb2N1bWVudCIsInByZWZpeCIsInNoYWRvd1Jvb3QiLCJtb2RlIiwiY29udGFpbmVyIiwiY3JlYXRlQ29udGFpbmVyIiwiY3NzIiwiY3JlYXRlQ3NzIiwiaXNWaXNpYmxlIiwiaXNCdWlsZGluZyIsInRpbWVvdXRJZCIsImV2dFNvdXJjZSIsInBhdGgiLCJldmVudCIsImhhbmRsZU1lc3NhZ2UiLCJvYmoiLCJhY3Rpb24iLCJKU09OIiwiY2xlYXJUaW1lb3V0IiwidXBkYXRlQ29udGFpbmVyIiwic2V0VGltZW91dCIsInRvZ2dsZUNhbGxiYWNrIiwiZXZlbnRDYWxsYmFja3MiLCJsYXN0QWN0aXZpdHkiLCJsaXN0ZW5lcnMiLCJvcHRpb25zIiwiaW5pdCIsInRpbWVyIiwic2V0SW50ZXJ2YWwiLCJoYW5kbGVEaXNjb25uZWN0Iiwic291cmNlIiwid2luZG93IiwiY29uc29sZSIsImkiLCJjYiIsImNsZWFySW50ZXJ2YWwiLCJjbG9zZSIsImFkZE1lc3NhZ2VMaXN0ZW5lciIsIkV2ZW50U291cmNlV3JhcHBlciIsImZyaWVuZGx5U3ludGF4RXJyb3JMYWJlbCIsIm1lc3NhZ2UiLCJsaW5lcyIsImxpbmUiLCJwYXJzaW5nRXJyb3IiLCJlcnJvck1lc3NhZ2UiLCJlcnJvckxpbmUiLCJpbmRleCIsImFyciIsImZvcm1hdHRlZEVycm9ycyIsImpzb24iLCJmb3JtYXRNZXNzYWdlIiwiZm9ybWF0dGVkV2FybmluZ3MiLCJyZXN1bHQiLCJlcnJvcnMiLCJ3YXJuaW5ncyIsImhhZFJ1bnRpbWVFcnJvciIsIkRldk92ZXJsYXkiLCJwcm9jZXNzTWVzc2FnZSIsInN1YnNjcmliZVRvSG1yRXZlbnQiLCJjdXN0b21IbXJFdmVudEhhbmRsZXIiLCJvblVucmVjb3ZlcmFibGVFcnJvciIsImlzRmlyc3RDb21waWxhdGlvbiIsIm1vc3RSZWNlbnRDb21waWxhdGlvbkhhc2giLCJoYXNDb21waWxlRXJyb3JzIiwiY2xlYXJPdXRkYXRlZEVycm9ycyIsImlzSG90VXBkYXRlIiwidHJ5QXBwbHlVcGRhdGVzIiwib25GYXN0UmVmcmVzaCIsImZvcm1hdHRlZCIsInByaW50V2FybmluZ3MiLCJwcm9jZXNzIiwic2VsZiIsImUiLCJoYW5kbGVBdmFpbGFibGVIYXNoIiwiaGFzRXJyb3JzIiwiQm9vbGVhbiIsImhhbmRsZUVycm9ycyIsImhhc1dhcm5pbmdzIiwiaGFuZGxlV2FybmluZ3MiLCJoYW5kbGVTdWNjZXNzIiwiY2FuQXBwbHlVcGRhdGVzIiwiZm4iLCJzdGF0dXMiLCJpc1VwZGF0ZUF2YWlsYWJsZSIsImVyciIsImhhc1VwZGF0ZXMiLCJ1cGRhdGVkTW9kdWxlcyIsIm9uSG90VXBkYXRlU3VjY2VzcyIsImFmdGVyQXBwbHlVcGRhdGVzIiwiaGFuZGxlQXBwbHlVcGRhdGVzIiwiUmVzcG9uc2UiLCJUZXh0RGVjb2RlciIsIlRleHRFbmNvZGVyIiwiQWJvcnRDb250cm9sbGVyIiwiVGV4dERlY29kZXJQb2x5ZmlsbCIsIm9jdGV0c0NvdW50IiwiY29kZVBvaW50IiwiYml0c05lZWRlZCIsIlJFUExBQ0VSIiwib2N0ZXRzIiwib2N0ZXQiLCJ2YWxpZCIsIlN0cmluZyIsInN1cHBvcnRzU3RyZWFtT3B0aW9uIiwic3RyZWFtIiwiayIsInRoYXQiLCJ4aHIiLCJzdGF0ZSIsInRpbWVvdXQiLCJvblN0YXJ0Iiwic3RhdHVzVGV4dCIsImNvbnRlbnRUeXBlIiwib25Qcm9ncmVzcyIsInJlc3BvbnNlVGV4dCIsIm9uRmluaXNoIiwib25SZWFkeVN0YXRlQ2hhbmdlIiwib25UaW1lb3V0IiwiWE1MSHR0cFJlcXVlc3QiLCJ1cmwiLCJYSFJXcmFwcGVyIiwibmFtZSIsImMiLCJtYXAiLCJPYmplY3QiLCJhcnJheSIsImFsbCIsInBhcnRzIiwidmFsdWUiLCJ0b0xvd2VyQ2FzZSIsIkhlYWRlcnNQb2x5ZmlsbCIsIlhIUlRyYW5zcG9ydCIsIm9mZnNldCIsImNodW5rIiwib25Qcm9ncmVzc0NhbGxiYWNrIiwiaGVhZGVycyIsIm9uU3RhcnRDYWxsYmFjayIsIm9uRmluaXNoQ2FsbGJhY2siLCJIZWFkZXJzV3JhcHBlciIsImNvbnRyb2xsZXIiLCJzaWduYWwiLCJ0ZXh0RGVjb2RlciIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJ3aXRoQ3JlZGVudGlhbHMiLCJjYWNoZSIsInJlYWRlciIsInJlc3BvbnNlIiwicmVhZE5leHRDaHVuayIsInJlc29sdmUiLCJyZWplY3QiLCJQcm9taXNlIiwiRXZlbnRUYXJnZXQiLCJ0eXBlTGlzdGVuZXJzIiwibGVuZ3RoIiwibGlzdGVuZXIiLCJ0aHJvd0Vycm9yIiwidHlwZSIsImZvdW5kIiwiZmlsdGVyZWQiLCJFdmVudCIsIk1lc3NhZ2VFdmVudCIsIkNvbm5lY3Rpb25FdmVudCIsIldBSVRJTkciLCJDT05ORUNUSU5HIiwiT1BFTiIsIkNMT1NFRCIsIkFGVEVSX0NSIiwiRklFTERfU1RBUlQiLCJGSUVMRCIsIlZBTFVFX1NUQVJUIiwiVkFMVUUiLCJjb250ZW50VHlwZVJlZ0V4cCIsIk1JTklNVU1fRFVSQVRJT04iLCJNQVhJTVVNX0RVUkFUSU9OIiwicGFyc2VEdXJhdGlvbiIsIm4iLCJwYXJzZUludCIsImNsYW1wRHVyYXRpb24iLCJNYXRoIiwiZmlyZSIsImYiLCJzdGFydCIsImlzRmV0Y2hTdXBwb3J0ZWQiLCJpbml0aWFsUmV0cnkiLCJoZWFydGJlYXRUaW1lb3V0IiwibGFzdEV2ZW50SWQiLCJyZXRyeSIsIndhc0FjdGl2aXR5IiwiQ3VycmVudFRyYW5zcG9ydCIsInRyYW5zcG9ydCIsImNhbmNlbEZ1bmN0aW9uIiwiY3VycmVudFN0YXRlIiwiZGF0YUJ1ZmZlciIsImxhc3RFdmVudElkQnVmZmVyIiwiZXZlbnRUeXBlQnVmZmVyIiwidGV4dEJ1ZmZlciIsImZpZWxkU3RhcnQiLCJ2YWx1ZVN0YXJ0IiwiZXMiLCJ0ZXh0Q2h1bmsiLCJwb3NpdGlvbiIsImZpZWxkIiwiZGF0YSIsInJlcXVlc3RVUkwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXF1ZXN0SGVhZGVycyIsIkV2ZW50U291cmNlUG9seWZpbGwiLCJ4IiwiY2FsbGJhY2siLCJSb3V0ZXIiLCJzZXR1cFBpbmciLCJjdXJyZW50UGFnZSIsIl9ldmVudCIsInBhdGhuYW1lIiwicGF0aG5hbWVGbiIsImNsb3NlUGluZyIsImFzc2V0UHJlZml4Iiwib25kZW1hbmQiLCJwYXlsb2FkIiwibG9jYXRpb24iLCJwYWdlUmVzIiwiZGV2Q2xpZW50IiwicGFnZSIsIkRPTUF0dHJpYnV0ZU5hbWVzIiwiYWNjZXB0Q2hhcnNldCIsImNsYXNzTmFtZSIsImh0bWxGb3IiLCJodHRwRXF1aXYiLCJub01vZHVsZSIsImVsIiwicHJvcHMiLCJwIiwiYXR0ciIsImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiwiQXJyYXkiLCJjaGlsZHJlbiIsImhlYWRFbCIsImhlYWRDb3VudEVsIiwiaGVhZENvdW50IiwiTnVtYmVyIiwib2xkVGFncyIsImoiLCJuZXdUYWdzIiwiY29tcG9uZW50cyIsIm5ld1RhZyIsImxlbiIsIm9sZFRhZyIsInQiLCJ1cGRhdGVQcm9taXNlIiwibW91bnRlZEluc3RhbmNlcyIsInVwZGF0ZUhlYWQiLCJoZWFkIiwicHJvbWlzZSIsInRhZ3MiLCJoIiwidGl0bGVDb21wb25lbnQiLCJ0aXRsZSIsInVwZGF0ZUVsZW1lbnRzIiwidmVyc2lvbiIsIl9fTkVYVF9WRVJTSU9OIiwibG9vc2VUb0FycmF5IiwiaXNGYWxsYmFjayIsImRlZmF1bHRMb2NhbGUiLCJfX3dlYnBhY2tfcHVibGljX3BhdGhfXyIsImVudkNvbmZpZyIsInNlcnZlclJ1bnRpbWVDb25maWciLCJwdWJsaWNSdW50aW1lQ29uZmlnIiwicnVudGltZUNvbmZpZyIsImFzUGF0aCIsInBhZ2VMb2FkZXIiLCJQYWdlTG9hZGVyIiwicmVnaXN0ZXIiLCJoZWFkTWFuYWdlciIsImFwcEVsZW1lbnQiLCJjb21wb25lbnREaWRNb3VudCIsInJvdXRlciIsImh5ZHJhdGVQcm9wcyIsInF1ZXJ5c3RyaW5nIiwiX2giLCJzaGFsbG93IiwiY29tcG9uZW50RGlkVXBkYXRlIiwic2Nyb2xsVG9IYXNoIiwiaGFzaCIsInJlbmRlciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiZW1pdHRlciIsIm9wdHMiLCJ3ZWJwYWNrSE1SIiwiYXBwRW50cnlwb2ludCIsImNvbXBvbmVudCIsIkNhY2hlZEFwcCIsIm1vZCIsIm9uUGVyZkVudHJ5IiwidW5pcXVlSUQiLCJEYXRlIiwiZW50cmllcyIsInBlcmZTdGFydEVudHJ5IiwiaWQiLCJzdGFydFRpbWUiLCJsYWJlbCIsImVudHJ5VHlwZSIsImluaXRpYWxFcnIiLCJlcnJvciIsInBhZ2VFbnRyeXBvaW50IiwiQ2FjaGVkQ29tcG9uZW50IiwiaXNWYWxpZEVsZW1lbnRUeXBlIiwibm9kZSIsImdldE5vZGVFcnJvciIsImluaXRpYWxQcm9wcyIsIkFwcCIsIndyYXBBcHAiLCJzdWJzY3JpcHRpb24iLCJzY3JvbGwiLCJsb2NhbGUiLCJsb2NhbGVzIiwiZG9tYWluTG9jYWxlcyIsImlzUHJldmlldyIsInJlbmRlckN0eCIsImluaXRpYWwiLCJyZW5kZXJpbmdQcm9wcyIsInJlbmRlckVycm9yIiwiZG9SZW5kZXIiLCJyZW5kZXJFcnIiLCJzdHlsZVNoZWV0cyIsIkFwcFRyZWUiLCJhcHBDdHgiLCJjdHgiLCJxdWVyeSIsInJlbmRlckVycm9yUHJvcHMiLCJpbml0UHJvcHMiLCJyZWFjdFJvb3QiLCJzaG91bGRVc2VIeWRyYXRlIiwiUmVhY3RET00iLCJTVCIsInBlcmZvcm1hbmNlIiwiY2xlYXJNYXJrcyIsIm5hdlN0YXJ0RW50cmllcyIsIm1lYXN1cmUiLCJtYXJrIiwid3JhcHBlZEFwcFByb3BzIiwiYXBwUHJvcHMiLCJpbnB1dCIsImxhc3RBcHBQcm9wcyIsImNhbmNlbGVkIiwicmVuZGVyUHJvbWlzZSIsImxhc3RSZW5kZXJSZWplY3QiLCJyZXNvbHZlUHJvbWlzZSIsImN1cnJlbnRTdHlsZVRhZ3MiLCJjdXJyZW50SHJlZnMiLCJ0YWciLCJub3NjcmlwdCIsIm5vbmNlIiwic3R5bGVUYWciLCJlbGVtIiwicmVuZGVyUmVhY3RFbGVtZW50IiwiX19SRVBMQUNFX05PT1BfSU1QT1JUX18iLCJfX05FWFRfREFUQV9fIiwiYnVpbGRJbmRpY2F0b3JIYW5kbGVyIiwicmVzIiwibWFuaWZlc3QiLCJwYWdlcyIsImNsZWFySW5kaWNhdG9yIiwiZGV2UGFnZXNNYW5pZmVzdExpc3RlbmVyIiwiaGFuZGxlciIsIm5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoIiwicm91dGUiLCJjb25zdHJ1Y3RvciIsImJ1aWxkSWQiLCJwcm9taXNlZFNzZ01hbmlmZXN0IiwicHJvbWlzZWREZXZQYWdlc01hbmlmZXN0Iiwicm91dGVMb2FkZXIiLCJnZXRQYWdlTGlzdCIsIm5vcm1hbGl6ZVJvdXRlIiwiZ2V0SHJlZkZvclNsdWciLCJkYXRhUm91dGUiLCJzc2ciLCJpc0R5bmFtaWMiLCJpbnRlcnBvbGF0ZWRSb3V0ZSIsInMiLCJsb2FkUGFnZSIsIm8iLCJocmVmIiwidGV4dCIsInByZWZldGNoIiwiaW5pdGlhbEhyZWYiLCJpc1JlZ2lzdGVyZWQiLCJ1c2VyUmVwb3J0SGFuZGxlciIsIlBvcnRhbCIsInBvcnRhbE5vZGUiLCJmb3JjZVVwZGF0ZSIsInJlcXVlc3RJZGxlQ2FsbGJhY2siLCJkaWRUaW1lb3V0IiwidGltZVJlbWFpbmluZyIsImNhbmNlbElkbGVDYWxsYmFjayIsImluaXRpYWxQYXRoTG9hZGVkIiwicGFnZUhlYWRlciIsIm5ld1JvdXRlQW5ub3VuY2VtZW50Iiwic2V0Um91dGVBbm5vdW5jZW1lbnQiLCJib3JkZXIiLCJjbGlwIiwiaGVpZ2h0IiwibWFyZ2luIiwib3ZlcmZsb3ciLCJwYWRkaW5nIiwid2lkdGgiLCJ3aGl0ZVNwYWNlIiwid29yZFdyYXAiLCJSb3V0ZUFubm91bmNlciIsIk1TX01BWF9JRExFX0RFTEFZIiwiZW50cnkiLCJwcm9tIiwicmVzb2x2ZXIiLCJmdXR1cmUiLCJnZW5lcmF0b3IiLCJsaW5rIiwiY2FuUHJlZmV0Y2giLCJoYXNQcmVmZXRjaCIsIkFTU0VUX0xPQURfRVJST1IiLCJTeW1ib2wiLCJzY3JpcHQiLCJtYXJrQXNzZXRFcnJvciIsImNhbmNlbGxlZCIsInIiLCJvbkJ1aWxkTWFuaWZlc3QiLCJyZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0Iiwic2NyaXB0cyIsImVuY29kZVVSSSIsImdldENsaWVudEJ1aWxkTWFuaWZlc3QiLCJhbGxGaWxlcyIsInYiLCJlbnRyeXBvaW50cyIsImxvYWRlZFNjcmlwdHMiLCJyb3V0ZXMiLCJhcHBlbmRTY3JpcHQiLCJjb250ZW50Iiwid2hlbkVudHJ5cG9pbnQiLCJ3aXRoRnV0dXJlIiwib25FbnRyeXBvaW50Iiwib2xkIiwibG9hZFJvdXRlIiwiZ2V0RmlsZXNGb3JSb3V0ZSIsImVudHJ5cG9pbnQiLCJzdHlsZXMiLCJjbiIsIm5hdmlnYXRvciIsIm91dHB1dCIsInByZWZldGNoVmlhRG9tIiwiY3JlYXRlUm91dGVMb2FkZXIiLCJzaW5nbGV0b25Sb3V0ZXIiLCJyZWFkeUNhbGxiYWNrcyIsInJlYWR5IiwidXJsUHJvcGVydHlGaWVsZHMiLCJyb3V0ZXJFdmVudHMiLCJjb3JlTWV0aG9kRmllbGRzIiwiZ2V0IiwiZ2V0Um91dGVyIiwiZXZlbnRGaWVsZCIsIl9zaW5nbGV0b25Sb3V0ZXIiLCJSb3V0ZXJDb250ZXh0IiwiY3JlYXRlUm91dGVyIiwiX3JvdXRlciIsImluc3RhbmNlIiwiQ29tcG9zZWRDb21wb25lbnQiLCJnZXRJbml0aWFsUHJvcHMiLCJXaXRoUm91dGVyV3JhcHBlciIsIl8iLCJfX25jY3dwY2tfcmVxdWlyZV9fIiwiYWIiLCJfX2Rpcm5hbWUiLCJIZWFkTWFuYWdlckNvbnRleHQiLCJwYXRobmFtZVBhcnRzIiwiZGV0ZWN0ZWRMb2NhbGUiLCJvbiIsIm9mZiIsImVtaXQiLCJiYXNlUGF0aCIsInBhdGhOb1F1ZXJ5SGFzaCIsInF1ZXJ5SW5kZXgiLCJoYXNoSW5kZXgiLCJhZGRQYXRoUHJlZml4IiwibG9jYXRpb25PcmlnaW4iLCJyZXNvbHZlZCIsImhhc0Jhc2VQYXRoIiwiZHluYW1pY1JlZ2V4IiwiZHluYW1pY0dyb3VwcyIsImR5bmFtaWNNYXRjaGVzIiwiYXNQYXRobmFtZSIsInBhcmFtcyIsInBhcmFtIiwicmVwbGFjZWQiLCJyZXBlYXQiLCJvcHRpb25hbCIsInNlZ21lbnQiLCJmaWx0ZXJlZFF1ZXJ5Iiwia2V5IiwiYmFzZSIsInVybEFzU3RyaW5nIiwiaXNMb2NhbFVSTCIsInJlc29sdmVBcyIsImZpbmFsVXJsIiwiaW50ZXJwb2xhdGVkQXMiLCJpbnRlcnBvbGF0ZUFzIiwib21pdFBhcm1zRnJvbVF1ZXJ5IiwicmVzb2x2ZWRIcmVmIiwib3JpZ2luIiwicmVzb2x2ZUhyZWYiLCJocmVmSGFkT3JpZ2luIiwiYXNIYWRPcmlnaW4iLCJyZXNvbHZlZEFzIiwic3RyaXBPcmlnaW4iLCJwcmVwYXJlZFVybCIsImFkZEJhc2VQYXRoIiwicHJlcGFyZWRBcyIsImFzIiwiY2xlYW5QYXRobmFtZSIsIm1hbnVhbFNjcm9sbFJlc3RvcmF0aW9uIiwiU1NHX0RBVEFfTk9UX0ZPVU5EIiwiYXR0ZW1wdHMiLCJmZXRjaFJldHJ5Iiwibm90Rm91bmQiLCJpc1NlcnZlclJlbmRlciIsInNkYyIsInNkciIsInN1YiIsImNsYyIsIl9icHMiLCJldmVudHMiLCJfd3JhcEFwcCIsImlzU3NyIiwiX2luRmxpZ2h0Um91dGUiLCJfc2hhbGxvdyIsImlzUmVhZHkiLCJpc0xvY2FsZURvbWFpbiIsIl9pZHgiLCJfX05fU1NHIiwiX19OX1NTUCIsImF1dG9FeHBvcnREeW5hbWljIiwicmVsb2FkIiwicHJlcGFyZVVybEFzIiwibG9jYWxlQ2hhbmdlIiwicGFyc2VkQXMiLCJkZWxCYXNlUGF0aCIsImxvY2FsZVBhdGhSZXN1bHQiLCJkaWROYXZpZ2F0ZSIsImRldGVjdGVkRG9tYWluIiwiZGV0ZWN0RG9tYWluTG9jYWxlIiwicm91dGVQcm9wcyIsImFkZExvY2FsZSIsImNsZWFuZWRBcyIsImRlbExvY2FsZSIsInBhcnNlZCIsIl9fcmV3cml0ZXMiLCJtZXRob2QiLCJyZXNvbHZlRHluYW1pY1JvdXRlIiwicm91dGVSZWdleCIsInJvdXRlTWF0Y2giLCJzaG91bGRJbnRlcnBvbGF0ZSIsIm1pc3NpbmdQYXJhbXMiLCJyb3V0ZUluZm8iLCJkZXN0aW5hdGlvbiIsInBhcnNlZEhyZWYiLCJub3RGb3VuZFJvdXRlIiwiYXBwQ29tcCIsImlzVmFsaWRTaGFsbG93Um91dGUiLCJmb3JjZWRTY3JvbGwiLCJ5IiwiX19OIiwiaWR4IiwiYnVpbGRDYW5jZWxsYXRpb25FcnJvciIsImV4aXN0aW5nUm91dGVJbmZvIiwiY2FjaGVkUm91dGVJbmZvIiwiZGF0YUhyZWYiLCJvbmx5QUhhc2hDaGFuZ2UiLCJuZXdIYXNoIiwib2xkVXJsTm9IYXNoIiwib2xkSGFzaCIsImlkRWwiLCJuYW1lRWwiLCJ1cmxJc05ldyIsInJld3JpdGVzUmVzdWx0IiwiaXNTc2ciLCJjYW5jZWwiLCJjb21wb25lbnRSZXN1bHQiLCJfZ2V0U3RhdGljRGF0YSIsImZldGNoTmV4dERhdGEiLCJfZ2V0U2VydmVyRGF0YSIsImFib3J0Q29tcG9uZW50TG9hZCIsIm5vdGlmeSIsInNsYXNoZWRQcm90b2NvbHMiLCJwcm90b2NvbCIsInVybE9iaiIsImhvc3QiLCJhdXRoIiwiaG9zdG5hbWUiLCJzZWFyY2giLCJleHQiLCJURVNUX1JPVVRFIiwiZ2xvYmFsQmFzZSIsInJlc29sdmVkQmFzZSIsInNlYXJjaFBhcmFtcyIsImlzTmFOIiwiaXRlbSIsInN0cmluZ2lmeVVybFF1ZXJ5UGFyYW0iLCJzZWFyY2hQYXJhbXNMaXN0IiwidGFyZ2V0IiwicmUiLCJkZWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzbHVnTmFtZSIsImciLCJncm91cHMiLCJtIiwic3RyIiwic2VnbWVudHMiLCJub3JtYWxpemVkUm91dGUiLCJncm91cEluZGV4IiwicGFyYW1ldGVyaXplZFJvdXRlIiwicGFyc2VQYXJhbWV0ZXIiLCJwb3MiLCJlc2NhcGVSZWdleCIsInVzZWQiLCJwb3J0IiwiZ2V0TG9jYXRpb25PcmlnaW4iLCJnZXREaXNwbGF5TmFtZSIsImxvYWRHZXRJbml0aWFsUHJvcHMiLCJwYWdlUHJvcHMiLCJpc1Jlc1NlbnQiLCJ1cmxPYmplY3RLZXlzIiwiU1AiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQzs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7O0FBRUEsaUM7Ozs7Ozs7Ozs7O0FDSkEsdUJBQXVCLG1CQUFPLENBQUMscUZBQW9COztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsb0M7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Qzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELGdCQUFnQixPQUFPLFdBQVcsV0FBVyxZQUFZLGlCQUFpQjtBQUM5SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxPQUFPO0FBQ1osS0FBSyxTQUFTO0FBQ2Q7QUFDQSxLQUFLLFNBQVM7QUFDZDtBQUNBO0FBQ0EsS0FBSyxTQUFTO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxzQkFBc0IsZUFBZTtBQUNsRyx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELHNCQUFzQixlQUFlO0FBQ2xHLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvREFBb0QsY0FBYyxnQkFBZ0I7QUFDbEY7QUFDQSxzQ0FBc0MsY0FBYztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxjQUFjO0FBQ2xFO0FBQ0Esc0NBQXNDLGNBQWM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELGNBQWMsZ0JBQWdCO0FBQ2xGO0FBQ0Esc0NBQXNDLGNBQWM7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLG1CQUFtQjtBQUMzRDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsWUFBWTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixtQkFBbUI7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsZUFBZTtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1CQUFtQjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsdURBQXVELGdCQUFnQjtBQUN2RTtBQUNBLDBDQUEwQztBQUMxQztBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsZ0NBQWdDLEVBQUU7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFFBQVE7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsU0FBUztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixVQUFVO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsaUJBQWlCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRjtBQUNyRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7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O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGVBQWUsT0FBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQixlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLE9BQU87QUFDcEIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLEVBQUU7QUFDZixlQUFlLE9BQU87QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsRUFBRTtBQUNmLGFBQWEsT0FBTztBQUNwQixlQUFlLFFBQVE7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QTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0QsR0FBRztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0ZBQWtGO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlGQUF5RjtBQUN6RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7O0FBRUEsZ0JBQWdCO0FBQ2hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULHlCQUF5QjtBQUN6QjtBQUNBLFNBQVM7QUFDVCx5QkFBeUI7QUFDekI7QUFDQSxTQUFTO0FBQ1Qsa0NBQWtDO0FBQ2xDO0FBQ0EsU0FBUztBQUNULDRCQUE0QjtBQUM1QjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTs7QUFFQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxrQkFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7OztBQUdqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0E7QUFDQSxNQUFNLGdDQUFnQyxLQUFLO0FBQzNDO0FBQ0EsNERBQTREO0FBQzVELE1BQU0sZ0NBQWdDLEtBQUs7QUFDM0M7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDROQUE0TjtBQUM1TjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0RUFBNEUsWUFBWTtBQUN4RjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkhBQTJILDZCQUE2QjtBQUN4SjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrRkFBa0Y7QUFDbEY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTywwQ0FBMEM7OztBQUdqRDtBQUNBOztBQUVBO0FB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RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksVUFBVTtBQUN0Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsZ0JBQWdCOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUCx1RUFBdUU7O0FBRXZFO0FBQ0EsOERBQThEO0FBQzlEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxLQUFLO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLEVBQUU7QUFDYixXQUFXLEtBQUs7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHNDQUFzQzs7QUFFdEMsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHlFQUF5RTtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFF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OztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDO0FBQzFDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0EsK0VBQStFO0FBQy9FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZHQUE2RztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSCxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwR0FBMEc7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0QsZ1RBQWdUO0FBQ2hUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlJQUFpSSxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUNsTSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUssb0dBQW9HLGtDQUFrQztBQUMzSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7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O0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSwwdkJBQTB2Qjs7QUFFMXZCO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEMsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsY0FBYztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLCtDQUErQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSywrQ0FBK0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOzs7QUFHQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtRUFBbUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdELDBEQUEwRDs7QUFFMUQsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQSwwSEFBMEg7QUFDMUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDs7QUFFckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7O0FBRTlDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhEQUE4RDs7QUFFOUQsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1ELHlEQUF5RDtBQUM1Ryw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyx5QkFBeUI7OztBQUdsQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOzs7QUFHVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNB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SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNklBQTZJOztBQUU3STtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULGtFQUFrRSw0Q0FBNEM7QUFDOUc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtJQUFrSTtBQUNsSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0lBQWtJO0FBQ2xJO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SkFBOEoseUNBQXlDO0FBQ3ZNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGtEQUFrRDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZCQUE2QjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMLHVFQUF1RTs7QUFFdkUsVUFBVSw2QkFBNkI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGlDQUFpQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTCx1RUFBdUU7O0FBRXZFLFVBQVUsWUFBWTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxNQUFNO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDRIQUE0SDs7QUFFNUgsb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLGtDQUFrQztBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCO0FBQzlCLG1EQUFtRDtBQUNuRDtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5QkFBeUI7O0FBRXpCLGdDQUFnQztBQUNoQztBQUNBOztBQUVBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsdUJBQXVCLDhCQUE4QjtBQUNyRDtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQiw0Q0FBNEM7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlDQUFpQzs7QUFFakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7O0FBRTVCLG9DQUFvQzs7QUFFcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDJDQUEyQztBQUNoRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQzs7QUFFM0MscUNBQXFDO0FBQ3JDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DOztBQUVuQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLEdBQUcsb0NBQW9DOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRyx1QkFBdUI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLHlLQUF5SywwQ0FBMEM7QUFDbk47QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7OztBQUdUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EseUVBQXlFOztBQUV6RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qiw0Q0FBNEM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0EsR0FBRzs7O0FBR0gsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0wsd0NBQXdDOztBQUV4QztBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrRkFBK0Y7QUFDL0Y7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlOQUF5TixHQUFHOztBQUU1TjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOzs7QUFHWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsbUhBQW1IO0FBQ25IOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7O0FBR0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLG9DQUFvQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBOztBQUVBLHFIQUFxSDs7QUFFckgsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLHFFQUFxRTs7QUFFckUsZ0VBQWdFO0FBQ2hFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVzs7QUFFWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0RBQW9EOztBQUVwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGOztBQUV0RjtBQUNBO0FBQ0EsbUJBQW1COzs7QUFHbkI7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUEsK0RBQStEOztBQUUvRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUVBQXVFOztBQUV2RTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7O0FBR0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUEsZ0hBQWdIO0FBQ2hIO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEMsS0FBSyxNQUFNLEVBS047QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSwrQ0FBK0M7O0FBRS9DLDZCQUE2QjtBQUM3Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxSEFBcUg7O0FBRXJIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7O0FBR0Esc0VBQXNFOztBQUV0RTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBLEtBQUssa0NBQWtDO0FBQ3ZDOzs7QUFHQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHlFQUF5RTs7QUFFekU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYix5TkFBeU4scUNBQXFDLHdGQUF3RiwyQkFBMkIscUJBQXFCLFFBQVEsWUFBWTtBQUMxWixhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU8sNElBQTRJO0FBQ25KO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTs7QUFFQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRywrQkFBK0I7QUFDbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUcsK0JBQStCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUEsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87O0FBRVAsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEIsaUNBQWlDOztBQUVqQyw4QkFBOEI7O0FBRTlCLDBCQUEwQjs7QUFFMUIsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEOztBQUVyRCxrREFBa0Q7O0FBRWxELHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDOztBQUVBLDZDQUE2Qzs7QUFFN0MsNkNBQTZDOztBQUU3QztBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQjs7QUFFQSxrREFBa0Q7QUFDbEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUEsK0NBQStDOztBQUUvQyw0R0FBNEc7O0FBRTVHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkY7O0FBRTNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtRUFBbUU7OztBQUduRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3Q0FBd0M7QUFDeEM7QUFDQTs7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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQiwyQkFBMkI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EsMkNBQTJDOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx3QkFBd0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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VztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrQ0FBK0M7O0FBRS9DLHVDQUF1QztBQUN2Qzs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJELHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJFQUEyRTs7QUFFM0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5RUFBeUU7QUFDekU7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0Esa0NBQWtDOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLHdCQUF3QjtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0QsT0FBTzs7QUFFdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GOztBQUVuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaU1BQWlNLGNBQWM7QUFDL007QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUssRUFBRTtBQUNQOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUEsNkVBQTZFOztBQUU3RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7OztBQ3JwekJhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQUksS0FBcUMsRUFBRSxFQUsxQztBQUNELG1CQUFtQixtQkFBTyxDQUFDLDZGQUFnQztBQUMzRDs7Ozs7Ozs7Ozs7OztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOzs7O0FBSWIsSUFBSSxJQUFxQztBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7O0FBRWhEO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUNwTGE7O0FBRWIsSUFBSSxLQUFxQyxFQUFFLEVBRTFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMsMEZBQStCO0FBQzFEOzs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FB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QUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZ0JBQWdCO0FBQzNCO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtREFBbUQ7O0FBRW5EOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiLFdBQVcsY0FBYztBQUN6QixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssRUFBRTtBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsZUFBZTs7QUFFZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvRUFBb0U7O0FBRXBFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsbUJBQW1CLG9CQUFvQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWU7O0FBRWYsd0JBQXdCLGlCQUFpQjs7O0FBR3pDO0FBQ0Esd0JBQXdCOztBQUV4QiwyQkFBMkI7QUFDM0I7QUFDQTs7QUFFQSwrQkFBK0I7O0FBRS9COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsbUJBQW1CLG9CQUFvQjtBQUN2QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxPQUFPO0FBQ2xCLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUJBQXVCOztBQUV2Qjs7QUFFQTtBQUNBLG1CQUFtQixxQkFBcUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQSxzSUFBc0kseUNBQXlDO0FBQy9LO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsRUFBRTtBQUNiLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxZQUFZLE9BQU87QUFDbkI7OztBQUdBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssRUFBRTs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0EseUNBQXlDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFROztBQUVSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBLFNBQVM7QUFDVCx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULHlCQUF5QjtBQUN6QjtBQUNBLFNBQVM7QUFDVCx5QkFBeUI7QUFDekI7QUFDQSxTQUFTO0FBQ1Qsa0NBQWtDO0FBQ2xDO0FBQ0EsU0FBUztBQUNULDRCQUE0QjtBQUM1QjtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDBEQUEwRDs7QUFFMUQ7QUFDQTs7QUFFQTtBQUNBLDBEQUEwRDtBQUMxRDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7O0FBR1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWSxrQkFBa0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7OztBQUdqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBIQUEwSDtBQUMxSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7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Q0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsS0FBMEIsb0JBQW9CLFNBQUU7QUFDbEQ7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDM3VCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVhOztBQUViLElBQUksSUFBcUM7QUFDekM7QUFDQTs7QUFFQSwwQkFBMEI7O0FBRTFCO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7O0FBRWpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGdDQUFnQztBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNB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LEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7Ozs7Ozs7Ozs7OztBQ3JvQmE7O0FBRWIsSUFBSSxLQUFxQyxFQUFFLEVBRTFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMsNkZBQWdDO0FBQzNEOzs7Ozs7Ozs7Ozs7O0FDTmE7O0FBRWIsSUFBSSxLQUFxQyxFQUFFLEVBRTFDO0FBQ0QsbUJBQW1CLG1CQUFPLENBQUMsNkdBQXdDO0FBQ25FOzs7Ozs7Ozs7Ozs7O0FDTkE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4REFBOEQ7O0FBRTlELDBEQUEwRDs7QUFFMUQ7O0FBRUE7QUFDQTtBQUNBLDJCQUEyQjs7QUFFM0IsMkJBQTJCOztBQUUzQiwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFaUIiLCJmaWxlIjoic3RhdGljL2NodW5rcy9tYWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBuZXcgQXJyYXkobGVuKTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgYXJyMltpXSA9IGFycltpXTtcbiAgfVxuXG4gIHJldHVybiBhcnIyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheUxpa2VUb0FycmF5OyIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRoSG9sZXM7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5XCIpO1xuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZDsiLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXN5bmNUb0dlbmVyYXRvcjsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc0NhbGxDaGVjazsiLCJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZlwiKTtcblxudmFyIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCA9IHJlcXVpcmUoXCIuL2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdFwiKTtcblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBGdW5jdGlvbi5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdDsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZXh0ZW5kczsiLCJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwidmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHM7IiwiZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBcImRlZmF1bHRcIjogb2JqXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdDsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkge1xuICBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7XG4gIHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlID0gZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkge1xuICAgIHJldHVybiBjYWNoZTtcbiAgfTtcblxuICByZXR1cm4gY2FjaGU7XG59XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikge1xuICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChvYmogPT09IG51bGwgfHwgX3R5cGVvZihvYmopICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB7XG4gICAgICBcImRlZmF1bHRcIjogb2JqXG4gICAgfTtcbiAgfVxuXG4gIHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpO1xuXG4gIGlmIChjYWNoZSAmJiBjYWNoZS5oYXMob2JqKSkge1xuICAgIHJldHVybiBjYWNoZS5nZXQob2JqKTtcbiAgfVxuXG4gIHZhciBuZXdPYmogPSB7fTtcbiAgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgdmFyIGRlc2MgPSBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KSA6IG51bGw7XG5cbiAgICAgIGlmIChkZXNjICYmIChkZXNjLmdldCB8fCBkZXNjLnNldCkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmV3T2JqW1wiZGVmYXVsdFwiXSA9IG9iajtcblxuICBpZiAoY2FjaGUpIHtcbiAgICBjYWNoZS5zZXQob2JqLCBuZXdPYmopO1xuICB9XG5cbiAgcmV0dXJuIG5ld09iajtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZDsiLCJmdW5jdGlvbiBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0KCkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwidW5kZWZpbmVkXCIgfHwgIVJlZmxlY3QuY29uc3RydWN0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG5cbiAgdHJ5IHtcbiAgICBEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFJlZmxlY3QuY29uc3RydWN0KERhdGUsIFtdLCBmdW5jdGlvbiAoKSB7fSkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2lzTmF0aXZlUmVmbGVjdENvbnN0cnVjdDsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVNwcmVhZDsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IHJlcXVpcmUoXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKTtcblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjsiLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsInZhciBhcnJheVdpdGhvdXRIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aG91dEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlU3ByZWFkID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVTcHJlYWRcIik7XG5cbmZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHtcbiAgcmV0dXJuIGFycmF5V2l0aG91dEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5KGFycikgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCBub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90b0NvbnN1bWFibGVBcnJheTsiLCJmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mID0gZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF90eXBlb2Y7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5XCIpO1xuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWdlbmVyYXRvci1ydW50aW1lXCIpO1xuIiwiXCJ0cmltU3RhcnRcImluIFN0cmluZy5wcm90b3R5cGV8fChTdHJpbmcucHJvdG90eXBlLnRyaW1TdGFydD1TdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0KSxcInRyaW1FbmRcImluIFN0cmluZy5wcm90b3R5cGV8fChTdHJpbmcucHJvdG90eXBlLnRyaW1FbmQ9U3RyaW5nLnByb3RvdHlwZS50cmltUmlnaHQpLFwiZGVzY3JpcHRpb25cImluIFN5bWJvbC5wcm90b3R5cGV8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShTeW1ib2wucHJvdG90eXBlLFwiZGVzY3JpcHRpb25cIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciB0PS9cXCgoLiopXFwpLy5leGVjKHRoaXMudG9TdHJpbmcoKSk7cmV0dXJuIHQ/dFsxXTp2b2lkIDB9fSksQXJyYXkucHJvdG90eXBlLmZsYXR8fChBcnJheS5wcm90b3R5cGUuZmxhdD1mdW5jdGlvbih0LHIpe3JldHVybiByPXRoaXMuY29uY2F0LmFwcGx5KFtdLHRoaXMpLHQ+MSYmci5zb21lKEFycmF5LmlzQXJyYXkpP3IuZmxhdCh0LTEpOnJ9LEFycmF5LnByb3RvdHlwZS5mbGF0TWFwPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMubWFwKHQscikuZmxhdCgpfSksUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseXx8KFByb21pc2UucHJvdG90eXBlLmZpbmFsbHk9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdClyZXR1cm4gdGhpcy50aGVuKHQsdCk7dmFyIHI9dGhpcy5jb25zdHJ1Y3Rvcnx8UHJvbWlzZTtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKG8pe3JldHVybiByLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG99KX0sZnVuY3Rpb24obyl7cmV0dXJuIHIucmVzb2x2ZSh0KCkpLnRoZW4oZnVuY3Rpb24oKXt0aHJvdyBvfSl9KX0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIEJ1cyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9pbnRlcm5hbC9idXNcIikpO1xudmFyIHBhcnNlU3RhY2tfMSA9IHJlcXVpcmUoXCIuL2ludGVybmFsL2hlbHBlcnMvcGFyc2VTdGFja1wiKTtcbnZhciBpc1JlZ2lzdGVyZWQgPSBmYWxzZTtcbnZhciBzdGFja1RyYWNlTGltaXQgPSB1bmRlZmluZWQ7XG5mdW5jdGlvbiBvblVuaGFuZGxlZEVycm9yKGV2KSB7XG4gICAgdmFyIGVycm9yID0gZXYgPT09IG51bGwgfHwgZXYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2LmVycm9yO1xuICAgIGlmICghZXJyb3IgfHwgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCB0eXBlb2YgZXJyb3Iuc3RhY2sgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEEgbm9uLWVycm9yIHdhcyB0aHJvd24sIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2hvdy4gOi0oXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGUgPSBlcnJvcjtcbiAgICBCdXMuZW1pdCh7XG4gICAgICAgIHR5cGU6IEJ1cy5UWVBFX1VOSEFORExFRF9FUlJPUixcbiAgICAgICAgcmVhc29uOiBlcnJvcixcbiAgICAgICAgZnJhbWVzOiBwYXJzZVN0YWNrXzEucGFyc2VTdGFjayhlLnN0YWNrKVxuICAgIH0pO1xufVxuZnVuY3Rpb24gb25VbmhhbmRsZWRSZWplY3Rpb24oZXYpIHtcbiAgICB2YXIgcmVhc29uID0gZXYgPT09IG51bGwgfHwgZXYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV2LnJlYXNvbjtcbiAgICBpZiAoIXJlYXNvbiB8fFxuICAgICAgICAhKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB8fFxuICAgICAgICB0eXBlb2YgcmVhc29uLnN0YWNrICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBBIG5vbi1lcnJvciB3YXMgdGhyb3duLCB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNob3cuIDotKFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlID0gcmVhc29uO1xuICAgIEJ1cy5lbWl0KHtcbiAgICAgICAgdHlwZTogQnVzLlRZUEVfVU5IQU5ETEVEX1JFSkVDVElPTixcbiAgICAgICAgcmVhc29uOiByZWFzb24sXG4gICAgICAgIGZyYW1lczogcGFyc2VTdGFja18xLnBhcnNlU3RhY2soZS5zdGFjaylcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyKCkge1xuICAgIGlmIChpc1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciBsaW1pdCA9IEVycm9yLnN0YWNrVHJhY2VMaW1pdDtcbiAgICAgICAgRXJyb3Iuc3RhY2tUcmFjZUxpbWl0ID0gNTA7XG4gICAgICAgIHN0YWNrVHJhY2VMaW1pdCA9IGxpbWl0O1xuICAgIH1cbiAgICBjYXRjaCAoX2EpIHsgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uVW5oYW5kbGVkRXJyb3IpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCBvblVuaGFuZGxlZFJlamVjdGlvbik7XG59XG5leHBvcnRzLnJlZ2lzdGVyID0gcmVnaXN0ZXI7XG5mdW5jdGlvbiB1bnJlZ2lzdGVyKCkge1xuICAgIGlmICghaXNSZWdpc3RlcmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXNSZWdpc3RlcmVkID0gZmFsc2U7XG4gICAgaWYgKHN0YWNrVHJhY2VMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBFcnJvci5zdGFja1RyYWNlTGltaXQgPSBzdGFja1RyYWNlTGltaXQ7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKF9hKSB7IH1cbiAgICAgICAgc3RhY2tUcmFjZUxpbWl0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvblVuaGFuZGxlZEVycm9yKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgb25VbmhhbmRsZWRSZWplY3Rpb24pO1xufVxuZXhwb3J0cy51bnJlZ2lzdGVyID0gdW5yZWdpc3RlcjtcbmZ1bmN0aW9uIG9uQnVpbGRPaygpIHtcbiAgICBCdXMuZW1pdCh7IHR5cGU6IEJ1cy5UWVBFX0JVSUxEX09LIH0pO1xufVxuZXhwb3J0cy5vbkJ1aWxkT2sgPSBvbkJ1aWxkT2s7XG5mdW5jdGlvbiBvbkJ1aWxkRXJyb3IobWVzc2FnZSkge1xuICAgIEJ1cy5lbWl0KHsgdHlwZTogQnVzLlRZUEVfQlVJTERfRVJST1IsIG1lc3NhZ2U6IG1lc3NhZ2UgfSk7XG59XG5leHBvcnRzLm9uQnVpbGRFcnJvciA9IG9uQnVpbGRFcnJvcjtcbmZ1bmN0aW9uIG9uUmVmcmVzaCgpIHtcbiAgICBCdXMuZW1pdCh7IHR5cGU6IEJ1cy5UWVBFX1JFRkZSRVNIIH0pO1xufVxuZXhwb3J0cy5vblJlZnJlc2ggPSBvblJlZnJlc2g7XG52YXIgbm9kZVN0YWNrRnJhbWVzXzEgPSByZXF1aXJlKFwiLi9pbnRlcm5hbC9oZWxwZXJzL25vZGVTdGFja0ZyYW1lc1wiKTtcbmV4cG9ydHMuZ2V0Tm9kZUVycm9yID0gbm9kZVN0YWNrRnJhbWVzXzEuZ2V0Tm9kZUVycm9yO1xudmFyIFJlYWN0RGV2T3ZlcmxheV8xID0gcmVxdWlyZShcIi4vaW50ZXJuYWwvUmVhY3REZXZPdmVybGF5XCIpO1xuZXhwb3J0cy5SZWFjdERldk92ZXJsYXkgPSBSZWFjdERldk92ZXJsYXlfMVtcImRlZmF1bHRcIl07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgcmVhY3RfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIEVycm9yQm91bmRhcnkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKEVycm9yQm91bmRhcnksIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gRXJyb3JCb3VuZGFyeSgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgICAgIF90aGlzLnN0YXRlID0geyBlcnJvcjogbnVsbCB9O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIEVycm9yQm91bmRhcnkucHJvdG90eXBlLmNvbXBvbmVudERpZENhdGNoID0gZnVuY3Rpb24gKGVycm9yLCBcbiAgICAvLyBMb29zZWx5IHR5cGVkIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgUmVhY3QgdmVyc2lvbiBhbmQgd2FzXG4gICAgLy8gYWNjaWRlbnRhbGx5IGV4Y2x1ZGVkIGluIHNvbWUgdmVyc2lvbnMuXG4gICAgZXJyb3JJbmZvKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25FcnJvcihlcnJvciwgKGVycm9ySW5mbyA9PT0gbnVsbCB8fCBlcnJvckluZm8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9ySW5mby5jb21wb25lbnRTdGFjaykgfHwgbnVsbCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBlcnJvcjogZXJyb3IgfSk7XG4gICAgfTtcbiAgICBFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmVycm9yXG4gICAgICAgICAgICA/IC8vIFRoZSBjb21wb25lbnQgaGFzIHRvIGJlIHVubW91bnRlZCBvciBlbHNlIGl0IHdvdWxkIGNvbnRpbnVlIHRvIGVycm9yXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgOiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH07XG4gICAgcmV0dXJuIEVycm9yQm91bmRhcnk7XG59KHJlYWN0XzFbXCJkZWZhdWx0XCJdLlB1cmVDb21wb25lbnQpKTtcbmV4cG9ydHMuRXJyb3JCb3VuZGFyeSA9IEVycm9yQm91bmRhcnk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvckJvdW5kYXJ5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXNzaWduID0gKHRoaXMgJiYgdGhpcy5fX2Fzc2lnbikgfHwgZnVuY3Rpb24gKCkge1xuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7XG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSlcbiAgICAgICAgICAgICAgICB0W3BdID0gc1twXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdDtcbiAgICB9O1xuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZCA9ICh0aGlzICYmIHRoaXMuX19zcHJlYWQpIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIFJlYWN0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgQnVzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2J1c1wiKSk7XG52YXIgU2hhZG93UG9ydGFsXzEgPSByZXF1aXJlKFwiLi9jb21wb25lbnRzL1NoYWRvd1BvcnRhbFwiKTtcbnZhciBFcnJvcnNfMSA9IHJlcXVpcmUoXCIuL2NvbnRhaW5lci9FcnJvcnNcIik7XG52YXIgQnVpbGRFcnJvcl8xID0gcmVxdWlyZShcIi4vY29udGFpbmVyL0J1aWxkRXJyb3JcIik7XG52YXIgRXJyb3JCb3VuZGFyeV8xID0gcmVxdWlyZShcIi4vRXJyb3JCb3VuZGFyeVwiKTtcbnZhciBCYXNlXzEgPSByZXF1aXJlKFwiLi9zdHlsZXMvQmFzZVwiKTtcbnZhciBDb21wb25lbnRTdHlsZXNfMSA9IHJlcXVpcmUoXCIuL3N0eWxlcy9Db21wb25lbnRTdHlsZXNcIik7XG52YXIgQ3NzUmVzZXRfMSA9IHJlcXVpcmUoXCIuL3N0eWxlcy9Dc3NSZXNldFwiKTtcbmZ1bmN0aW9uIHJlZHVjZXIoc3RhdGUsIGV2KSB7XG4gICAgc3dpdGNoIChldi50eXBlKSB7XG4gICAgICAgIGNhc2UgQnVzLlRZUEVfQlVJTERfT0s6IHtcbiAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3RhdGUpLCB7IGJ1aWxkRXJyb3I6IG51bGwgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBCdXMuVFlQRV9CVUlMRF9FUlJPUjoge1xuICAgICAgICAgICAgcmV0dXJuIF9fYXNzaWduKF9fYXNzaWduKHt9LCBzdGF0ZSksIHsgYnVpbGRFcnJvcjogZXYubWVzc2FnZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEJ1cy5UWVBFX1JFRkZSRVNIOiB7XG4gICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHN0YXRlKSwgeyBidWlsZEVycm9yOiBudWxsLCBlcnJvcnM6IFtdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQnVzLlRZUEVfVU5IQU5ETEVEX0VSUk9SOlxuICAgICAgICBjYXNlIEJ1cy5UWVBFX1VOSEFORExFRF9SRUpFQ1RJT046IHtcbiAgICAgICAgICAgIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgc3RhdGUpLCB7IG5leHRJZDogc3RhdGUubmV4dElkICsgMSwgZXJyb3JzOiBfX3NwcmVhZChzdGF0ZS5lcnJvcnMsIFt7IGlkOiBzdGF0ZS5uZXh0SWQsIGV2ZW50OiBldiB9XSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICAgICAgdmFyIF8xID0gZXY7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG52YXIgUmVhY3REZXZPdmVybGF5ID0gZnVuY3Rpb24gUmVhY3REZXZPdmVybGF5KF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW47XG4gICAgdmFyIF9iID0gX19yZWFkKFJlYWN0LnVzZVJlZHVjZXIocmVkdWNlciwgeyBuZXh0SWQ6IDEsIGJ1aWxkRXJyb3I6IG51bGwsIGVycm9yczogW10gfSksIDIpLCBzdGF0ZSA9IF9iWzBdLCBkaXNwYXRjaCA9IF9iWzFdO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIEJ1cy5vbihkaXNwYXRjaCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBCdXMub2ZmKGRpc3BhdGNoKTtcbiAgICAgICAgfTtcbiAgICB9LCBbZGlzcGF0Y2hdKTtcbiAgICB2YXIgb25Db21wb25lbnRFcnJvciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChfZXJyb3IsIF9jb21wb25lbnRTdGFjaykge1xuICAgICAgICAvLyBUT0RPOiBzcGVjaWFsIGhhbmRsaW5nXG4gICAgfSwgW10pO1xuICAgIHZhciBoYXNCdWlsZEVycm9yID0gc3RhdGUuYnVpbGRFcnJvciAhPSBudWxsO1xuICAgIHZhciBoYXNSdW50aW1lRXJyb3JzID0gQm9vbGVhbihzdGF0ZS5lcnJvcnMubGVuZ3RoKTtcbiAgICB2YXIgaXNNb3VudGVkID0gaGFzQnVpbGRFcnJvciB8fCBoYXNSdW50aW1lRXJyb3JzO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChFcnJvckJvdW5kYXJ5XzEuRXJyb3JCb3VuZGFyeSwgeyBvbkVycm9yOiBvbkNvbXBvbmVudEVycm9yIH0sIGNoaWxkcmVuICE9PSBudWxsICYmIGNoaWxkcmVuICE9PSB2b2lkIDAgPyBjaGlsZHJlbiA6IG51bGwpLFxuICAgICAgICBpc01vdW50ZWQgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChTaGFkb3dQb3J0YWxfMS5TaGFkb3dQb3J0YWwsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENzc1Jlc2V0XzEuQ3NzUmVzZXQsIG51bGwpLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChCYXNlXzEuQmFzZSwgbnVsbCksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudFN0eWxlc18xLkNvbXBvbmVudFN0eWxlcywgbnVsbCksXG4gICAgICAgICAgICBoYXNCdWlsZEVycm9yID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQnVpbGRFcnJvcl8xLkJ1aWxkRXJyb3IsIHsgbWVzc2FnZTogc3RhdGUuYnVpbGRFcnJvciB9KSkgOiBoYXNSdW50aW1lRXJyb3JzID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoRXJyb3JzXzEuRXJyb3JzLCB7IGVycm9yczogc3RhdGUuZXJyb3JzIH0pKSA6IHVuZGVmaW5lZCkpIDogdW5kZWZpbmVkKSk7XG59O1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBSZWFjdERldk92ZXJsYXk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWFjdERldk92ZXJsYXkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuVFlQRV9CVUlMRF9PSyA9ICdidWlsZC1vayc7XG5leHBvcnRzLlRZUEVfQlVJTERfRVJST1IgPSAnYnVpbGQtZXJyb3InO1xuZXhwb3J0cy5UWVBFX1JFRkZSRVNIID0gJ2Zhc3QtcmVmcmVzaCc7XG5leHBvcnRzLlRZUEVfVU5IQU5ETEVEX0VSUk9SID0gJ3VuaGFuZGxlZC1lcnJvcic7XG5leHBvcnRzLlRZUEVfVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWQtcmVqZWN0aW9uJztcbnZhciBoYW5kbGVycyA9IG5ldyBTZXQoKTtcbnZhciBxdWV1ZSA9IFtdO1xuZnVuY3Rpb24gZHJhaW4oKSB7XG4gICAgLy8gRHJhaW5pbmcgc2hvdWxkIG5ldmVyIGhhcHBlbiBzeW5jaHJvbm91c2x5IGluIGNhc2UgbXVsdGlwbGUgaGFuZGxlcnMgYXJlXG4gICAgLy8gcmVnaXN0ZXJlZC5cbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZXYgPSBxdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgaGFuZGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlcihldik7IH0pO1xuICAgICAgICB9O1xuICAgICAgICB3aGlsZSAoXG4gICAgICAgIC8vIFVudGlsIHdlIGFyZSBvdXQgb2YgZXZlbnRzOlxuICAgICAgICBCb29sZWFuKHF1ZXVlLmxlbmd0aCkgJiZcbiAgICAgICAgICAgIC8vIE9yLCBpZiBhbGwgaGFuZGxlcnMgcmVtb3ZlZCB0aGVtc2VsdmVzIGFzIGEgcmVzdWx0IG9mIGhhbmRsaW5nIHRoZVxuICAgICAgICAgICAgLy8gZXZlbnQocylcbiAgICAgICAgICAgIEJvb2xlYW4oaGFuZGxlcnMuc2l6ZSkpIHtcbiAgICAgICAgICAgIF9sb29wXzEoKTtcbiAgICAgICAgfVxuICAgIH0sIDEpO1xufVxuZnVuY3Rpb24gZW1pdChldikge1xuICAgIHF1ZXVlLnB1c2goT2JqZWN0LmZyZWV6ZShfX2Fzc2lnbih7fSwgZXYpKSk7XG4gICAgZHJhaW4oKTtcbn1cbmV4cG9ydHMuZW1pdCA9IGVtaXQ7XG5mdW5jdGlvbiBvbihmbikge1xuICAgIGlmIChoYW5kbGVycy5oYXMoZm4pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaGFuZGxlcnMuYWRkKGZuKTtcbiAgICBkcmFpbigpO1xuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0cy5vbiA9IG9uO1xuZnVuY3Rpb24gb2ZmKGZuKSB7XG4gICAgaWYgKGhhbmRsZXJzLmhhcyhmbikpIHtcbiAgICAgICAgaGFuZGxlcnNbXCJkZWxldGVcIl0oZm4pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0cy5vZmYgPSBvZmY7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBhbnNlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJhbnNlclwiKSk7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBzdHJpcF9hbnNpXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInN0cmlwLWFuc2lcIikpO1xudmFyIHN0YWNrX2ZyYW1lXzEgPSByZXF1aXJlKFwiLi4vLi4vaGVscGVycy9zdGFjay1mcmFtZVwiKTtcbmV4cG9ydHMuQ29kZUZyYW1lID0gZnVuY3Rpb24gQ29kZUZyYW1lKF9hKSB7XG4gICAgdmFyIHN0YWNrRnJhbWUgPSBfYS5zdGFja0ZyYW1lLCBjb2RlRnJhbWUgPSBfYS5jb2RlRnJhbWU7XG4gICAgLy8gU3RyaXAgbGVhZGluZyBzcGFjZXMgb3V0IG9mIHRoZSBjb2RlIGZyYW1lOlxuICAgIHZhciBmb3JtYXR0ZWRGcmFtZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGluZXMgPSBjb2RlRnJhbWUuc3BsaXQoL1xccj9cXG4vZyk7XG4gICAgICAgIHZhciBwcmVmaXhMZW5ndGggPSBsaW5lc1xuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gL14+PyArXFxkKyArXFx8ICggKikvLmV4ZWMoc3RyaXBfYW5zaV8xW1wiZGVmYXVsdFwiXShsaW5lKSk7IH0pXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uICh2KSB7IHJldHVybiB2LnBvcCgpOyB9KVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoYywgbikgeyByZXR1cm4gKGlzTmFOKGMpID8gbi5sZW5ndGggOiBNYXRoLm1pbihjLCBuLmxlbmd0aCkpOyB9LCBOYU4pO1xuICAgICAgICBpZiAocHJlZml4TGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmFyIHBfMSA9ICcgJy5yZXBlYXQocHJlZml4TGVuZ3RoKTtcbiAgICAgICAgICAgIHJldHVybiBsaW5lc1xuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGxpbmUsIGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gfihhID0gbGluZS5pbmRleE9mKCd8JykpXG4gICAgICAgICAgICAgICAgICAgID8gbGluZS5zdWJzdHJpbmcoMCwgYSkgKyBsaW5lLnN1YnN0cmluZyhhKS5yZXBsYWNlKHBfMSwgJycpXG4gICAgICAgICAgICAgICAgICAgIDogbGluZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgICB9LCBbY29kZUZyYW1lXSk7XG4gICAgdmFyIGRlY29kZWQgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFuc2VyXzFbXCJkZWZhdWx0XCJdLmFuc2lUb0pzb24oZm9ybWF0dGVkRnJhbWUsIHtcbiAgICAgICAgICAgIGpzb246IHRydWUsXG4gICAgICAgICAgICB1c2VfY2xhc3NlczogdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZV9lbXB0eTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LCBbZm9ybWF0dGVkRnJhbWVdKTtcbiAgICB2YXIgb3BlbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICB2YXIgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3RhY2tGcmFtZSkge1xuICAgICAgICAgICAgcGFyYW1zLmFwcGVuZChrZXksICgoX2EgPSBzdGFja0ZyYW1lW2tleV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBzZWxmXG4gICAgICAgICAgICAuZmV0Y2goKHByb2Nlc3MuZW52Ll9fTkVYVF9ST1VURVJfQkFTRVBBVEggfHwgJycpICsgXCIvX19uZXh0anNfbGF1bmNoLWVkaXRvcj9cIiArIHBhcmFtcy50b1N0cmluZygpKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfSwgW3N0YWNrRnJhbWVdKTtcbiAgICAvLyBUT0RPOiBtYWtlIHRoZSBjYXJldCBhYnNvbHV0ZVxuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiZGF0YS1uZXh0anMtY29kZWZyYW1lXCI6IHRydWUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBcIiwgeyByb2xlOiBcImxpbmtcIiwgb25DbGljazogb3BlbiwgdGFiSW5kZXg6IDEsIHRpdGxlOiBcIkNsaWNrIHRvIG9wZW4gaW4geW91ciBlZGl0b3JcIiB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCxcbiAgICAgICAgICAgICAgICBzdGFja19mcmFtZV8xLmdldEZyYW1lU291cmNlKHN0YWNrRnJhbWUpLFxuICAgICAgICAgICAgICAgIFwiIEAgXCIsXG4gICAgICAgICAgICAgICAgc3RhY2tGcmFtZS5tZXRob2ROYW1lKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLCBmaWxsOiBcIm5vbmVcIiwgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLCBzdHJva2VXaWR0aDogXCIyXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIiB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNlwiIH0pLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwb2x5bGluZVwiLCB7IHBvaW50czogXCIxNSAzIDIxIDMgMjEgOVwiIH0pLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIHsgeDE6IFwiMTBcIiwgeTE6IFwiMTRcIiwgeDI6IFwiMjFcIiwgeTI6IFwiM1wiIH0pKSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoclwiLCBudWxsKSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInByZVwiLCBudWxsLCBkZWNvZGVkLm1hcChmdW5jdGlvbiAoZW50cnksIGluZGV4KSB7IHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBrZXk6IFwiZnJhbWUtXCIgKyBpbmRleCwgc3R5bGU6IF9fYXNzaWduKHsgY29sb3I6IGVudHJ5LmZnID8gXCJ2YXIoLS1jb2xvci1cIiArIGVudHJ5LmZnICsgXCIpXCIgOiB1bmRlZmluZWQgfSwgKGVudHJ5LmRlY29yYXRpb24gPT09ICdib2xkJ1xuICAgICAgICAgICAgICAgID8geyBmb250V2VpZ2h0OiA4MDAgfVxuICAgICAgICAgICAgICAgIDogZW50cnkuZGVjb3JhdGlvbiA9PT0gJ2l0YWxpYydcbiAgICAgICAgICAgICAgICAgICAgPyB7IGZvbnRTdHlsZTogJ2l0YWxpYycgfVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCkpIH0sIGVudHJ5LmNvbnRlbnQpKTsgfSkpKSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29kZUZyYW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBDb2RlRnJhbWVfMSA9IHJlcXVpcmUoXCIuL0NvZGVGcmFtZVwiKTtcbmV4cG9ydHMuQ29kZUZyYW1lID0gQ29kZUZyYW1lXzEuQ29kZUZyYW1lO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3QgPSAodGhpcyAmJiB0aGlzLl9fbWFrZVRlbXBsYXRlT2JqZWN0KSB8fCBmdW5jdGlvbiAoY29va2VkLCByYXcpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICAgIHJldHVybiBjb29rZWQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBub29wX3RlbXBsYXRlXzEgPSByZXF1aXJlKFwiLi4vLi4vaGVscGVycy9ub29wLXRlbXBsYXRlXCIpO1xudmFyIHN0eWxlcyA9IG5vb3BfdGVtcGxhdGVfMS5ub29wKHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbXCJcXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdIHtcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2l6ZS1nYXAtaGFsZik7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktYmcpO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYW5zaS1mZyk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtY29kZWZyYW1lXTo6c2VsZWN0aW9uLFxcbiAgW2RhdGEtbmV4dGpzLWNvZGVmcmFtZV0gKjo6c2VsZWN0aW9uIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sb3ItYW5zaS1zZWxlY3Rpb24pO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNvZGVmcmFtZV0gKiB7XFxuICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc3RhY2stbW9ub3NwYWNlKTtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdID4gKiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogY2FsYyh2YXIoLS1zaXplLWdhcCkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSlcXG4gICAgICBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtY29kZWZyYW1lXSA+IGhyIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci13aWR0aDogMDtcXG4gICAgYm9yZGVyLWJvdHRvbS13aWR0aDogMXB4O1xcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktYnJpZ2h0LWJsYWNrKTtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdID4gcCB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNvZGVmcmFtZV0gPiBwOmhvdmVyIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNvZGVmcmFtZV0gPiBwID4gc3ZnIHtcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIGhlaWdodDogMWVtO1xcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xcbiAgfVxcblwiXSwgW1wiXFxuICBbZGF0YS1uZXh0anMtY29kZWZyYW1lXSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLWJnKTtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktZmcpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNvZGVmcmFtZV06OnNlbGVjdGlvbixcXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdICo6OnNlbGVjdGlvbiB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktc2VsZWN0aW9uKTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdICoge1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXN0YWNrLW1vbm9zcGFjZSk7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtY29kZWZyYW1lXSA+ICoge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IGNhbGModmFyKC0tc2l6ZS1nYXApICsgdmFyKC0tc2l6ZS1nYXAtaGFsZikpXFxuICAgICAgY2FsYyh2YXIoLS1zaXplLWdhcC1kb3VibGUpICsgdmFyKC0tc2l6ZS1nYXAtaGFsZikpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNvZGVmcmFtZV0gPiBociB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogMDtcXG5cXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkO1xcbiAgICBib3JkZXItd2lkdGg6IDA7XFxuICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDFweDtcXG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLWJyaWdodC1ibGFjayk7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtY29kZWZyYW1lXSA+IHAge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdID4gcDpob3ZlciB7XFxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1jb2RlZnJhbWVdID4gcCA+IHN2ZyB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBoZWlnaHQ6IDFlbTtcXG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcXG4gIH1cXG5cIl0pKSk7XG5leHBvcnRzLnN0eWxlcyA9IHN0eWxlcztcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fcmVzdCA9ICh0aGlzICYmIHRoaXMuX19yZXN0KSB8fCBmdW5jdGlvbiAocywgZSkge1xuICAgIHZhciB0ID0ge307XG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICAgIHRbcF0gPSBzW3BdO1xuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgICB9XG4gICAgcmV0dXJuIHQ7XG59O1xudmFyIF9fcmVhZCA9ICh0aGlzICYmIHRoaXMuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIHVzZV9vbl9jbGlja19vdXRzaWRlXzEgPSByZXF1aXJlKFwiLi4vLi4vaG9va3MvdXNlLW9uLWNsaWNrLW91dHNpZGVcIik7XG52YXIgRGlhbG9nID0gZnVuY3Rpb24gRGlhbG9nKF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIHR5cGUgPSBfYS50eXBlLCBvbkNsb3NlID0gX2Eub25DbG9zZSwgcHJvcHMgPSBfX3Jlc3QoX2EsIFtcImNoaWxkcmVuXCIsIFwidHlwZVwiLCBcIm9uQ2xvc2VcIl0pO1xuICAgIHZhciBfYiA9IF9fcmVhZChSZWFjdC51c2VTdGF0ZShudWxsKSwgMiksIGRpYWxvZyA9IF9iWzBdLCBzZXREaWFsb2cgPSBfYlsxXTtcbiAgICB2YXIgb25EaWFsb2cgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICBzZXREaWFsb2cobm9kZSk7XG4gICAgfSwgW10pO1xuICAgIHVzZV9vbl9jbGlja19vdXRzaWRlXzEudXNlT25DbGlja091dHNpZGUoZGlhbG9nLCBvbkNsb3NlKTtcbiAgICAvLyBNYWtlIEhUTUxFbGVtZW50cyB3aXRoIGByb2xlPWxpbmtgIGFjY2Vzc2libGUgdG8gYmUgdHJpZ2dlcmVkIGJ5IHRoZVxuICAgIC8vIGtleWJvYXJkLCBpLmUuIFtFbnRlcl0uXG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGRpYWxvZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJvb3QgPSBkaWFsb2cuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgLy8gQWx3YXlzIHRydWUsIGJ1dCB3ZSBkbyB0aGlzIGZvciBUeXBlU2NyaXB0OlxuICAgICAgICBpZiAoIShyb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2hhZG93Um9vdCA9IHJvb3Q7XG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZXIoZSkge1xuICAgICAgICAgICAgdmFyIGVsID0gc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmXG4gICAgICAgICAgICAgICAgZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnbGluaycpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlbC5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNoYWRvd1Jvb3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgIH0sIFtkaWFsb2ddKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyByZWY6IG9uRGlhbG9nLCBcImRhdGEtbmV4dGpzLWRpYWxvZ1wiOiB0cnVlLCB0YWJJbmRleDogLTEsIHJvbGU6IFwiZGlhbG9nXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IHByb3BzWydhcmlhLWxhYmVsbGVkYnknXSwgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IHByb3BzWydhcmlhLWRlc2NyaWJlZGJ5J10sIFwiYXJpYS1tb2RhbFwiOiBcInRydWVcIiB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgXCJkYXRhLW5leHRqcy1kaWFsb2ctYmFubmVyXCI6IHRydWUsIGNsYXNzTmFtZTogXCJiYW5uZXItXCIgKyB0eXBlIH0pLFxuICAgICAgICBjaGlsZHJlbikpO1xufTtcbmV4cG9ydHMuRGlhbG9nID0gRGlhbG9nO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIERpYWxvZ0JvZHkgPSBmdW5jdGlvbiBEaWFsb2dCb2R5KF9hKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gX2EuY2hpbGRyZW4sIGNsYXNzTmFtZSA9IF9hLmNsYXNzTmFtZTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImRhdGEtbmV4dGpzLWRpYWxvZy1ib2R5XCI6IHRydWUsIGNsYXNzTmFtZTogY2xhc3NOYW1lIH0sIGNoaWxkcmVuKSk7XG59O1xuZXhwb3J0cy5EaWFsb2dCb2R5ID0gRGlhbG9nQm9keTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURpYWxvZ0JvZHkuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIFJlYWN0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgRGlhbG9nQ29udGVudCA9IGZ1bmN0aW9uIERpYWxvZ0NvbnRlbnQoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiZGF0YS1uZXh0anMtZGlhbG9nLWNvbnRlbnRcIjogdHJ1ZSwgY2xhc3NOYW1lOiBjbGFzc05hbWUgfSwgY2hpbGRyZW4pKTtcbn07XG5leHBvcnRzLkRpYWxvZ0NvbnRlbnQgPSBEaWFsb2dDb250ZW50O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nQ29udGVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBEaWFsb2dIZWFkZXIgPSBmdW5jdGlvbiBEaWFsb2dIZWFkZXIoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiZGF0YS1uZXh0anMtZGlhbG9nLWhlYWRlclwiOiB0cnVlLCBjbGFzc05hbWU6IGNsYXNzTmFtZSB9LCBjaGlsZHJlbikpO1xufTtcbmV4cG9ydHMuRGlhbG9nSGVhZGVyID0gRGlhbG9nSGVhZGVyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlhbG9nSGVhZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBEaWFsb2dfMSA9IHJlcXVpcmUoXCIuL0RpYWxvZ1wiKTtcbmV4cG9ydHMuRGlhbG9nID0gRGlhbG9nXzEuRGlhbG9nO1xudmFyIERpYWxvZ0JvZHlfMSA9IHJlcXVpcmUoXCIuL0RpYWxvZ0JvZHlcIik7XG5leHBvcnRzLkRpYWxvZ0JvZHkgPSBEaWFsb2dCb2R5XzEuRGlhbG9nQm9keTtcbnZhciBEaWFsb2dDb250ZW50XzEgPSByZXF1aXJlKFwiLi9EaWFsb2dDb250ZW50XCIpO1xuZXhwb3J0cy5EaWFsb2dDb250ZW50ID0gRGlhbG9nQ29udGVudF8xLkRpYWxvZ0NvbnRlbnQ7XG52YXIgRGlhbG9nSGVhZGVyXzEgPSByZXF1aXJlKFwiLi9EaWFsb2dIZWFkZXJcIik7XG5leHBvcnRzLkRpYWxvZ0hlYWRlciA9IERpYWxvZ0hlYWRlcl8xLkRpYWxvZ0hlYWRlcjtcbnZhciBzdHlsZXNfMSA9IHJlcXVpcmUoXCIuL3N0eWxlc1wiKTtcbmV4cG9ydHMuc3R5bGVzID0gc3R5bGVzXzEuc3R5bGVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3QgPSAodGhpcyAmJiB0aGlzLl9fbWFrZVRlbXBsYXRlT2JqZWN0KSB8fCBmdW5jdGlvbiAoY29va2VkLCByYXcpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICAgIHJldHVybiBjb29rZWQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBub29wX3RlbXBsYXRlXzEgPSByZXF1aXJlKFwiLi4vLi4vaGVscGVycy9ub29wLXRlbXBsYXRlXCIpO1xudmFyIHN0eWxlcyA9IG5vb3BfdGVtcGxhdGVfMS5ub29wKHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbXCJcXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ddIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1zaXplLWdhcCk7XFxuICAgIGJveC1zaGFkb3c6IDAgdmFyKC0tc2l6ZS1nYXAtaGFsZikgdmFyKC0tc2l6ZS1nYXAtZG91YmxlKVxcbiAgICAgIHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxuICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDU2cHgpO1xcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XFxuICB9XFxuXFxuICBAbWVkaWEgKG1heC1oZWlnaHQ6IDgxMnB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy1kaWFsb2ctb3ZlcmxheV0ge1xcbiAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDE1cHgpO1xcbiAgICB9XFxuICB9XFxuXFxuICBAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHtcXG4gICAgW2RhdGEtbmV4dGpzLWRpYWxvZ10ge1xcbiAgICAgIG1heC13aWR0aDogNTQwcHg7XFxuICAgICAgYm94LXNoYWRvdzogMCB2YXIoLS1zaXplLWdhcCkgdmFyKC0tc2l6ZS1nYXAtcXVhZCkgcmdiYSgwLCAwLCAwLCAwLjI1KTtcXG4gICAgfVxcbiAgfVxcblxcbiAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy1kaWFsb2ddIHtcXG4gICAgICBtYXgtd2lkdGg6IDcyMHB4O1xcbiAgICB9XFxuICB9XFxuXFxuICBAbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcXG4gICAgW2RhdGEtbmV4dGpzLWRpYWxvZ10ge1xcbiAgICAgIG1heC13aWR0aDogOTYwcHg7XFxuICAgIH1cXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctYmFubmVyXSB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctYmFubmVyXS5iYW5uZXItd2FybmluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItYW5zaS15ZWxsb3cpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1iYW5uZXJdLmJhbm5lci1lcnJvciB7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItYW5zaS1yZWQpO1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1iYW5uZXJdOjphZnRlciB7XFxuICAgIHotaW5kZXg6IDI7XFxuICAgIGNvbnRlbnQ6ICcnO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICAvKiBiYW5uZXIgd2lkdGg6ICovXFxuICAgIGJvcmRlci10b3Atd2lkdGg6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xcbiAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci10b3AtY29sb3I6IGluaGVyaXQ7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1jb250ZW50XSB7XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICAvKiBjYWxjKHBhZGRpbmcgKyBiYW5uZXIgd2lkdGggb2Zmc2V0KSAqL1xcbiAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSlcXG4gICAgICB2YXIoLS1zaXplLWdhcC1kb3VibGUpO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWNvbnRlbnRdID4gW2RhdGEtbmV4dGpzLWRpYWxvZy1oZWFkZXJdIHtcXG4gICAgZmxleC1zaHJpbms6IDA7XFxuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNpemUtZ2FwLWRvdWJsZSk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWNvbnRlbnRdID4gW2RhdGEtbmV4dGpzLWRpYWxvZy1ib2R5XSB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZmxleDogMSAxIGF1dG87XFxuICB9XFxuXCJdLCBbXCJcXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ddIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgd2lkdGg6IDEwMCU7XFxuICAgIG1hcmdpbi1yaWdodDogYXV0bztcXG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XFxuICAgIG91dGxpbmU6IG5vbmU7XFxuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1zaXplLWdhcCk7XFxuICAgIGJveC1zaGFkb3c6IDAgdmFyKC0tc2l6ZS1nYXAtaGFsZikgdmFyKC0tc2l6ZS1nYXAtZG91YmxlKVxcbiAgICAgIHJnYmEoMCwgMCwgMCwgMC4yNSk7XFxuICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDU2cHgpO1xcbiAgICBvdmVyZmxvdy15OiBoaWRkZW47XFxuICB9XFxuXFxuICBAbWVkaWEgKG1heC1oZWlnaHQ6IDgxMnB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy1kaWFsb2ctb3ZlcmxheV0ge1xcbiAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDE1cHgpO1xcbiAgICB9XFxuICB9XFxuXFxuICBAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHtcXG4gICAgW2RhdGEtbmV4dGpzLWRpYWxvZ10ge1xcbiAgICAgIG1heC13aWR0aDogNTQwcHg7XFxuICAgICAgYm94LXNoYWRvdzogMCB2YXIoLS1zaXplLWdhcCkgdmFyKC0tc2l6ZS1nYXAtcXVhZCkgcmdiYSgwLCAwLCAwLCAwLjI1KTtcXG4gICAgfVxcbiAgfVxcblxcbiAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy1kaWFsb2ddIHtcXG4gICAgICBtYXgtd2lkdGg6IDcyMHB4O1xcbiAgICB9XFxuICB9XFxuXFxuICBAbWVkaWEgKG1pbi13aWR0aDogOTkycHgpIHtcXG4gICAgW2RhdGEtbmV4dGpzLWRpYWxvZ10ge1xcbiAgICAgIG1heC13aWR0aDogOTYwcHg7XFxuICAgIH1cXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctYmFubmVyXSB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctYmFubmVyXS5iYW5uZXItd2FybmluZyB7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItYW5zaS15ZWxsb3cpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1iYW5uZXJdLmJhbm5lci1lcnJvciB7XFxuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sb3ItYW5zaS1yZWQpO1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1iYW5uZXJdOjphZnRlciB7XFxuICAgIHotaW5kZXg6IDI7XFxuICAgIGNvbnRlbnQ6ICcnO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIHRvcDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICAvKiBiYW5uZXIgd2lkdGg6ICovXFxuICAgIGJvcmRlci10b3Atd2lkdGg6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAwO1xcbiAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci10b3AtY29sb3I6IGluaGVyaXQ7XFxuICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1jb250ZW50XSB7XFxuICAgIG92ZXJmbG93LXk6IGF1dG87XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICAvKiBjYWxjKHBhZGRpbmcgKyBiYW5uZXIgd2lkdGggb2Zmc2V0KSAqL1xcbiAgICBwYWRkaW5nOiBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSlcXG4gICAgICB2YXIoLS1zaXplLWdhcC1kb3VibGUpO1xcbiAgICBoZWlnaHQ6IDEwMCU7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWNvbnRlbnRdID4gW2RhdGEtbmV4dGpzLWRpYWxvZy1oZWFkZXJdIHtcXG4gICAgZmxleC1zaHJpbms6IDA7XFxuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNpemUtZ2FwLWRvdWJsZSk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWNvbnRlbnRdID4gW2RhdGEtbmV4dGpzLWRpYWxvZy1ib2R5XSB7XFxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgZmxleDogMSAxIGF1dG87XFxuICB9XFxuXCJdKSkpO1xuZXhwb3J0cy5zdHlsZXMgPSBzdHlsZXM7XG52YXIgdGVtcGxhdGVPYmplY3RfMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBMZWZ0UmlnaHREaWFsb2dIZWFkZXIgPSBmdW5jdGlvbiBMZWZ0UmlnaHREaWFsb2dIZWFkZXIoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbiwgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBwcmV2aW91cyA9IF9hLnByZXZpb3VzLCBuZXh0ID0gX2EubmV4dCwgY2xvc2UgPSBfYS5jbG9zZTtcbiAgICB2YXIgYnV0dG9uTGVmdCA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICB2YXIgYnV0dG9uUmlnaHQgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgdmFyIGJ1dHRvbkNsb3NlID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBfYiA9IF9fcmVhZChSZWFjdC51c2VTdGF0ZShudWxsKSwgMiksIG5hdiA9IF9iWzBdLCBzZXROYXYgPSBfYlsxXTtcbiAgICB2YXIgb25OYXYgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgc2V0TmF2KGVsKTtcbiAgICB9LCBbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG5hdiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJvb3QgPSBuYXYuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgdmFyIGQgPSBzZWxmLmRvY3VtZW50O1xuICAgICAgICBmdW5jdGlvbiBoYW5kbGVyKGUpIHtcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGlmIChidXR0b25MZWZ0LmN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uTGVmdC5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHByZXZpb3VzICYmIHByZXZpb3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93UmlnaHQnKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoYnV0dG9uUmlnaHQuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b25SaWdodC5jdXJyZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5leHQgJiYgbmV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAocm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByb290LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEgIT09IGJ1dHRvbkNsb3NlLmN1cnJlbnQgJiYgYSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhLmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlcik7XG4gICAgICAgIGlmIChyb290ICE9PSBkKSB7XG4gICAgICAgICAgICBkLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlcik7XG4gICAgICAgICAgICBpZiAocm9vdCAhPT0gZCkge1xuICAgICAgICAgICAgICAgIGQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sIFtjbG9zZSwgbmF2LCBuZXh0LCBwcmV2aW91c10pO1xuICAgIC8vIFVubG9jayBmb2N1cyBmb3IgYnJvd3NlcnMgbGlrZSBGaXJlZm94LCB0aGF0IGJyZWFrIGFsbCB1c2VyIGZvY3VzIGlmIHRoZVxuICAgIC8vIGN1cnJlbnRseSBmb2N1c2VkIGl0ZW0gYmVjb21lcyBkaXNhYmxlZC5cbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAobmF2ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcm9vdCA9IG5hdi5nZXRSb290Tm9kZSgpO1xuICAgICAgICAvLyBBbHdheXMgdHJ1ZSwgYnV0IHdlIGRvIHRoaXMgZm9yIFR5cGVTY3JpcHQ6XG4gICAgICAgIGlmIChyb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgdmFyIGEgPSByb290LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAocHJldmlvdXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChidXR0b25MZWZ0LmN1cnJlbnQgJiYgYSA9PT0gYnV0dG9uTGVmdC5jdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbkxlZnQuY3VycmVudC5ibHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV4dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1dHRvblJpZ2h0LmN1cnJlbnQgJiYgYSA9PT0gYnV0dG9uUmlnaHQuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBidXR0b25SaWdodC5jdXJyZW50LmJsdXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbbmF2LCBuZXh0LCBwcmV2aW91c10pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRcIjogdHJ1ZSwgY2xhc3NOYW1lOiBjbGFzc05hbWUgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcIm5hdlwiLCB7IHJlZjogb25OYXYgfSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgeyByZWY6IGJ1dHRvbkxlZnQsIHR5cGU6IFwiYnV0dG9uXCIsIGRpc2FibGVkOiBwcmV2aW91cyA9PSBudWxsID8gdHJ1ZSA6IHVuZGVmaW5lZCwgXCJhcmlhLWRpc2FibGVkXCI6IHByZXZpb3VzID09IG51bGwgPyB0cnVlIDogdW5kZWZpbmVkLCBvbkNsaWNrOiBwcmV2aW91cyAhPT0gbnVsbCAmJiBwcmV2aW91cyAhPT0gdm9pZCAwID8gcHJldmlvdXMgOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgdmlld0JveDogXCIwIDAgMTQgMTRcIiwgZmlsbDogXCJub25lXCIsIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk02Ljk5OTk2IDEuMTY2NjZMMS4xNjY2MyA2Ljk5OTk5TDYuOTk5OTYgMTIuODMzM00xMi44MzMzIDYuOTk5OTlIMS45OTk5NkgxMi44MzMzWlwiLCBzdHJva2U6IFwiY3VycmVudENvbG9yXCIsIHN0cm9rZVdpZHRoOiBcIjJcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiIH0pKSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHsgcmVmOiBidXR0b25SaWdodCwgdHlwZTogXCJidXR0b25cIiwgZGlzYWJsZWQ6IG5leHQgPT0gbnVsbCA/IHRydWUgOiB1bmRlZmluZWQsIFwiYXJpYS1kaXNhYmxlZFwiOiBuZXh0ID09IG51bGwgPyB0cnVlIDogdW5kZWZpbmVkLCBvbkNsaWNrOiBuZXh0ICE9PSBudWxsICYmIG5leHQgIT09IHZvaWQgMCA/IG5leHQgOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgdmlld0JveDogXCIwIDAgMTQgMTRcIiwgZmlsbDogXCJub25lXCIsIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwgeyBkOiBcIk02Ljk5OTk2IDEuMTY2NjZMMTIuODMzMyA2Ljk5OTk5TDYuOTk5OTYgMTIuODMzM00xLjE2NjYzIDYuOTk5OTlIMTJIMS4xNjY2M1pcIiwgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLCBzdHJva2VXaWR0aDogXCIyXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIiB9KSkpLFxuICAgICAgICAgICAgXCJcXHUwMEEwXCIsXG4gICAgICAgICAgICBjaGlsZHJlbiksXG4gICAgICAgIGNsb3NlID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwgeyByZWY6IGJ1dHRvbkNsb3NlLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiBjbG9zZSwgXCJhcmlhLWxhYmVsXCI6IFwiQ2xvc2VcIiB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgeyBcImFyaWEtaGlkZGVuXCI6IFwidHJ1ZVwiIH0sXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7IHdpZHRoOiBcIjI0XCIsIGhlaWdodDogXCIyNFwiLCB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLCBmaWxsOiBcIm5vbmVcIiwgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB9LFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTE4IDZMNiAxOFwiLCBzdHJva2U6IFwiY3VycmVudENvbG9yXCIsIHN0cm9rZVdpZHRoOiBcIjJcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiIH0pLFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7IGQ6IFwiTTYgNkwxOCAxOFwiLCBzdHJva2U6IFwiY3VycmVudENvbG9yXCIsIHN0cm9rZVdpZHRoOiBcIjJcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiIH0pKSkpKSA6IG51bGwpKTtcbn07XG5leHBvcnRzLkxlZnRSaWdodERpYWxvZ0hlYWRlciA9IExlZnRSaWdodERpYWxvZ0hlYWRlcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxlZnRSaWdodERpYWxvZ0hlYWRlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgTGVmdFJpZ2h0RGlhbG9nSGVhZGVyXzEgPSByZXF1aXJlKFwiLi9MZWZ0UmlnaHREaWFsb2dIZWFkZXJcIik7XG5leHBvcnRzLkxlZnRSaWdodERpYWxvZ0hlYWRlciA9IExlZnRSaWdodERpYWxvZ0hlYWRlcl8xLkxlZnRSaWdodERpYWxvZ0hlYWRlcjtcbnZhciBzdHlsZXNfMSA9IHJlcXVpcmUoXCIuL3N0eWxlc1wiKTtcbmV4cG9ydHMuc3R5bGVzID0gc3R5bGVzXzEuc3R5bGVzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3QgPSAodGhpcyAmJiB0aGlzLl9fbWFrZVRlbXBsYXRlT2JqZWN0KSB8fCBmdW5jdGlvbiAoY29va2VkLCByYXcpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICAgIHJldHVybiBjb29rZWQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBub29wX3RlbXBsYXRlXzEgPSByZXF1aXJlKFwiLi4vLi4vaGVscGVycy9ub29wLXRlbXBsYXRlXCIpO1xudmFyIHN0eWxlcyA9IG5vb3BfdGVtcGxhdGVfMS5ub29wKHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbXCJcXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0ge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xcbiAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBuYXYgPiBidXR0b24ge1xcbiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuXFxuICAgIHdpZHRoOiBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcCkpO1xcbiAgICBoZWlnaHQ6IGNhbGModmFyKC0tc2l6ZS1nYXAtZG91YmxlKSArIHZhcigtLXNpemUtZ2FwKSk7XFxuICAgIGZvbnQtc2l6ZTogMDtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgODUsIDg1LCAwLjEpO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYW5zaS1yZWQpO1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMC4yNXMgZWFzZTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBuYXYgPiBidXR0b24gPiBzdmcge1xcbiAgICB3aWR0aDogYXV0bztcXG4gICAgaGVpZ2h0OiBjYWxjKHZhcigtLXNpemUtZ2FwKSArIHZhcigtLXNpemUtZ2FwLWhhbGYpKTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBuYXYgPiBidXR0b246aG92ZXIge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgODUsIDg1LCAwLjIpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1sZWZ0LXJpZ2h0XSA+IG5hdiA+IGJ1dHRvbjpkaXNhYmxlZCB7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCA4NSwgODUsIDAuMSk7XFxuICAgIGNvbG9yOiByZ2JhKDI1NSwgODUsIDg1LCAwLjQpO1xcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1sZWZ0LXJpZ2h0XSA+IG5hdiA+IGJ1dHRvbjpmaXJzdC1vZi10eXBlIHtcXG4gICAgYm9yZGVyLXJhZGl1czogdmFyKC0tc2l6ZS1nYXAtaGFsZikgMCAwIHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBtYXJnaW4tcmlnaHQ6IDFweDtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBuYXYgPiBidXR0b246bGFzdC1vZi10eXBlIHtcXG4gICAgYm9yZGVyLXJhZGl1czogMCB2YXIoLS1zaXplLWdhcC1oYWxmKSB2YXIoLS1zaXplLWdhcC1oYWxmKSAwO1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1sZWZ0LXJpZ2h0XSA+IGJ1dHRvbjpsYXN0LW9mLXR5cGUge1xcbiAgICBib3JkZXI6IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuXFxuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICBhcHBlYXJhbmNlOiBub25lO1xcblxcbiAgICBvcGFjaXR5OiAwLjQ7XFxuICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXMgZWFzZTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBidXR0b246bGFzdC1vZi10eXBlOmhvdmVyIHtcXG4gICAgb3BhY2l0eTogMC43O1xcbiAgfVxcblwiXSwgW1wiXFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRdIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRdID4gbmF2ID4gYnV0dG9uIHtcXG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xcblxcbiAgICB3aWR0aDogY2FsYyh2YXIoLS1zaXplLWdhcC1kb3VibGUpICsgdmFyKC0tc2l6ZS1nYXApKTtcXG4gICAgaGVpZ2h0OiBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcCkpO1xcbiAgICBmb250LXNpemU6IDA7XFxuICAgIGJvcmRlcjogbm9uZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDg1LCA4NSwgMC4xKTtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktcmVkKTtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMjVzIGVhc2U7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRdID4gbmF2ID4gYnV0dG9uID4gc3ZnIHtcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIGhlaWdodDogY2FsYyh2YXIoLS1zaXplLWdhcCkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRdID4gbmF2ID4gYnV0dG9uOmhvdmVyIHtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDg1LCA4NSwgMC4yKTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBuYXYgPiBidXR0b246ZGlzYWJsZWQge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgODUsIDg1LCAwLjEpO1xcbiAgICBjb2xvcjogcmdiYSgyNTUsIDg1LCA4NSwgMC40KTtcXG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBuYXYgPiBidXR0b246Zmlyc3Qtb2YtdHlwZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNpemUtZ2FwLWhhbGYpIDAgMCB2YXIoLS1zaXplLWdhcC1oYWxmKTtcXG4gICAgbWFyZ2luLXJpZ2h0OiAxcHg7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRdID4gbmF2ID4gYnV0dG9uOmxhc3Qtb2YtdHlwZSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tc2l6ZS1nYXAtaGFsZikgdmFyKC0tc2l6ZS1nYXAtaGFsZikgMDtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctbGVmdC1yaWdodF0gPiBidXR0b246bGFzdC1vZi10eXBlIHtcXG4gICAgYm9yZGVyOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcblxcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcXG4gICAgYXBwZWFyYW5jZTogbm9uZTtcXG5cXG4gICAgb3BhY2l0eTogMC40O1xcbiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMjVzIGVhc2U7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWxlZnQtcmlnaHRdID4gYnV0dG9uOmxhc3Qtb2YtdHlwZTpob3ZlciB7XFxuICAgIG9wYWNpdHk6IDAuNztcXG4gIH1cXG5cIl0pKSk7XG5leHBvcnRzLnN0eWxlcyA9IHN0eWxlcztcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fcmVhZCA9ICh0aGlzICYmIHRoaXMuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8vIEB0cy1pZ25vcmVcbnZhciBtYWludGFpbl9fdGFiX2ZvY3VzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbWFpbnRhaW4tLXRhYi1mb2N1c1wiKSk7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBib2R5X2xvY2tlcl8xID0gcmVxdWlyZShcIi4vYm9keS1sb2NrZXJcIik7XG52YXIgT3ZlcmxheSA9IGZ1bmN0aW9uIE92ZXJsYXkoX2EpIHtcbiAgICB2YXIgY2xhc3NOYW1lID0gX2EuY2xhc3NOYW1lLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBmaXhlZCA9IF9hLmZpeGVkO1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJvZHlfbG9ja2VyXzEubG9jaygpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYm9keV9sb2NrZXJfMS51bmxvY2soKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgdmFyIF9iID0gX19yZWFkKFJlYWN0LnVzZVN0YXRlKG51bGwpLCAyKSwgb3ZlcmxheSA9IF9iWzBdLCBzZXRPdmVybGF5ID0gX2JbMV07XG4gICAgdmFyIG9uT3ZlcmxheSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICBzZXRPdmVybGF5KGVsKTtcbiAgICB9LCBbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG92ZXJsYXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBoYW5kbGUyID0gbWFpbnRhaW5fX3RhYl9mb2N1c18xW1wiZGVmYXVsdFwiXSh7IGNvbnRleHQ6IG92ZXJsYXkgfSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBoYW5kbGUyLmRpc2VuZ2FnZSgpO1xuICAgICAgICB9O1xuICAgIH0sIFtvdmVybGF5XSk7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgXCJkYXRhLW5leHRqcy1kaWFsb2ctb3ZlcmxheVwiOiB0cnVlLCBjbGFzc05hbWU6IGNsYXNzTmFtZSwgcmVmOiBvbk92ZXJsYXkgfSxcbiAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiZGF0YS1uZXh0anMtZGlhbG9nLWJhY2tkcm9wXCI6IHRydWUsIFwiZGF0YS1uZXh0anMtZGlhbG9nLWJhY2tkcm9wLWZpeGVkXCI6IGZpeGVkID8gdHJ1ZSA6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgY2hpbGRyZW4pKTtcbn07XG5leHBvcnRzLk92ZXJsYXkgPSBPdmVybGF5O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9T3ZlcmxheS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgcHJldmlvdXNCb2R5UGFkZGluZ1JpZ2h0O1xudmFyIHByZXZpb3VzQm9keU92ZXJmbG93U2V0dGluZztcbnZhciBhY3RpdmVMb2NrcyA9IDA7XG5mdW5jdGlvbiBsb2NrKCkge1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoYWN0aXZlTG9ja3MrKyA+IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc2Nyb2xsQmFyR2FwID0gd2luZG93LmlubmVyV2lkdGggLSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIGlmIChzY3JvbGxCYXJHYXAgPiAwKSB7XG4gICAgICAgICAgICBwcmV2aW91c0JvZHlQYWRkaW5nUmlnaHQgPSBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodDtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZ1JpZ2h0ID0gc2Nyb2xsQmFyR2FwICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzQm9keU92ZXJmbG93U2V0dGluZyA9IGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9KTtcbn1cbmV4cG9ydHMubG9jayA9IGxvY2s7XG5mdW5jdGlvbiB1bmxvY2soKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChhY3RpdmVMb2NrcyA9PT0gMCB8fCAtLWFjdGl2ZUxvY2tzICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZpb3VzQm9keVBhZGRpbmdSaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodCA9IHByZXZpb3VzQm9keVBhZGRpbmdSaWdodDtcbiAgICAgICAgICAgIHByZXZpb3VzQm9keVBhZGRpbmdSaWdodCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldmlvdXNCb2R5T3ZlcmZsb3dTZXR0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSBwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmc7XG4gICAgICAgICAgICBwcmV2aW91c0JvZHlPdmVyZmxvd1NldHRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydHMudW5sb2NrID0gdW5sb2NrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Ym9keS1sb2NrZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIE92ZXJsYXlfMSA9IHJlcXVpcmUoXCIuL092ZXJsYXlcIik7XG5leHBvcnRzLk92ZXJsYXkgPSBPdmVybGF5XzEuT3ZlcmxheTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG4vLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanNcbi8vIExpY2Vuc2U6IE1JVFxuLy8gQ29weXJpZ2h0IChjKSAyMDE1IFJvZG5leSBSZWhtXG4vL1xuLy8gRW50cnlwb2ludDogYWxseS5qcy9tYWludGFpbi90YWItZm9jdXNcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgcGxhdGZvcm1fMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicGxhdGZvcm1cIikpO1xudmFyIGNzc19lc2NhcGVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiY3NzLmVzY2FwZVwiKSk7XG4vLyBpbnB1dCBtYXkgYmUgdW5kZWZpbmVkLCBzZWxlY3Rvci10cmluZywgTm9kZSwgTm9kZUxpc3QsIEhUTUxDb2xsZWN0aW9uLCBhcnJheSBvZiBOb2Rlc1xuLy8geWVzLCB0byBzb21lIGV4dGVudCB0aGlzIGlzIGEgYmFkIHJlcGxpY2Egb2YgalF1ZXJ5J3MgY29uc3RydWN0b3IgZnVuY3Rpb25cbmZ1bmN0aW9uIG5vZGVBcnJheShpbnB1dCkge1xuICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgICAvLyBpbnN0YW5jZW9mIE5vZGUgLSBkb2VzIG5vdCB3b3JrIHdpdGggaWZyYW1lc1xuICAgIGlmIChpbnB1dC5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbaW5wdXRdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoaW5wdXQpO1xuICAgIH1cbiAgICBpZiAoaW5wdXQubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdLnNsaWNlLmNhbGwoaW5wdXQsIDApO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1bmV4cGVjdGVkIGlucHV0ICcgKyBTdHJpbmcoaW5wdXQpKTtcbn1cbmZ1bmN0aW9uIGNvbnRleHRUb0VsZW1lbnQoX3JlZikge1xuICAgIHZhciBjb250ZXh0ID0gX3JlZi5jb250ZXh0LCBfcmVmJGxhYmVsID0gX3JlZi5sYWJlbCwgbGFiZWwgPSBfcmVmJGxhYmVsID09PSB1bmRlZmluZWQgPyAnY29udGV4dC10by1lbGVtZW50JyA6IF9yZWYkbGFiZWwsIHJlc29sdmVEb2N1bWVudCA9IF9yZWYucmVzb2x2ZURvY3VtZW50LCBkZWZhdWx0VG9Eb2N1bWVudCA9IF9yZWYuZGVmYXVsdFRvRG9jdW1lbnQ7XG4gICAgdmFyIGVsZW1lbnQgPSBub2RlQXJyYXkoY29udGV4dClbMF07XG4gICAgaWYgKHJlc29sdmVEb2N1bWVudCAmJiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfTk9ERSkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfVxuICAgIGlmICghZWxlbWVudCAmJiBkZWZhdWx0VG9Eb2N1bWVudCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIH1cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihsYWJlbCArICcgcmVxdWlyZXMgdmFsaWQgb3B0aW9ucy5jb250ZXh0Jyk7XG4gICAgfVxuICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJlxuICAgICAgICBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihsYWJlbCArICcgcmVxdWlyZXMgb3B0aW9ucy5jb250ZXh0IHRvIGJlIGFuIEVsZW1lbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5mdW5jdGlvbiBnZXRTaGFkb3dIb3N0KCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwgY29udGV4dCA9IF9yZWYuY29udGV4dDtcbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2dldC9zaGFkb3ctaG9zdCcsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9KTtcbiAgICAvLyB3YWxrIHVwIHRvIHRoZSByb290XG4gICAgdmFyIGNvbnRhaW5lciA9IG51bGw7XG4gICAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICAgICAgY29udGFpbmVyID0gZWxlbWVudDtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUubm9kZVR5cGVcbiAgICAvLyBOT1RFOiBGaXJlZm94IDM0IGRvZXMgbm90IGV4cG9zZSBTaGFkb3dSb290Lmhvc3QgKGJ1dCAzNyBkb2VzKVxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IGNvbnRhaW5lci5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICYmXG4gICAgICAgIGNvbnRhaW5lci5ob3N0KSB7XG4gICAgICAgIC8vIHRoZSByb290IGlzIGF0dGFjaGVkIHRvIGEgZnJhZ21lbnQgbm9kZSB0aGF0IGhhcyBhIGhvc3RcbiAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5ob3N0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldERvY3VtZW50KG5vZGUpIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xufVxuZnVuY3Rpb24gaXNBY3RpdmVFbGVtZW50KGNvbnRleHQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2lzL2FjdGl2ZS1lbGVtZW50JyxcbiAgICAgICAgcmVzb2x2ZURvY3VtZW50OiB0cnVlLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSk7XG4gICAgdmFyIF9kb2N1bWVudCA9IGdldERvY3VtZW50KGVsZW1lbnQpO1xuICAgIGlmIChfZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHNoYWRvd0hvc3QgPSBnZXRTaGFkb3dIb3N0KHsgY29udGV4dDogZWxlbWVudCB9KTtcbiAgICBpZiAoc2hhZG93SG9zdCAmJiBzaGFkb3dIb3N0LnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuLy8gW2VsZW0sIGVsZW0ucGFyZW50LCBlbGVtLnBhcmVudC5wYXJlbnQsIOKApiwgaHRtbF1cbi8vIHdpbGwgbm90IGNvbnRhaW4gdGhlIHNoYWRvd1Jvb3QgKERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIGFuZCBzaGFkb3dIb3N0XG5mdW5jdGlvbiBnZXRQYXJlbnRzKCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwgY29udGV4dCA9IF9yZWYuY29udGV4dDtcbiAgICB2YXIgbGlzdCA9IFtdO1xuICAgIHZhciBlbGVtZW50ID0gY29udGV4dFRvRWxlbWVudCh7XG4gICAgICAgIGxhYmVsOiAnZ2V0L3BhcmVudHMnLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSk7XG4gICAgd2hpbGUgKGVsZW1lbnQpIHtcbiAgICAgICAgbGlzdC5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAvLyBJRSBkb2VzIGtub3cgc3VwcG9ydCBwYXJlbnRFbGVtZW50IG9uIFNWR0VsZW1lbnRcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuLy8gRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcyBtYXkgYmUgYXZhaWxhYmxlIGF0IGEgZGlmZmVyZW50IG5hbWVcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0FQSS9FbGVtZW50L21hdGNoZXNcbnZhciBuYW1lcyA9IFtcbiAgICAnbWF0Y2hlcycsXG4gICAgJ3dlYmtpdE1hdGNoZXNTZWxlY3RvcicsXG4gICAgJ21vek1hdGNoZXNTZWxlY3RvcicsXG4gICAgJ21zTWF0Y2hlc1NlbGVjdG9yJyxcbl07XG52YXIgbmFtZSA9IG51bGw7XG5mdW5jdGlvbiBmaW5kTWV0aG9kTmFtZShlbGVtZW50KSB7XG4gICAgbmFtZXMuc29tZShmdW5jdGlvbiAoX25hbWUpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50W19uYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG5hbWUgPSBfbmFtZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlcyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGlmICghbmFtZSkge1xuICAgICAgICBmaW5kTWV0aG9kTmFtZShlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRbbmFtZV0oc2VsZWN0b3IpO1xufVxuLy8gZGVlcCBjbG9uZSBvZiBvcmlnaW5hbCBwbGF0Zm9ybVxudmFyIHBsYXRmb3JtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwbGF0Zm9ybV8xW1wiZGVmYXVsdFwiXSkpO1xuLy8gb3BlcmF0aW5nIHN5c3RlbVxudmFyIG9zID0gcGxhdGZvcm0ub3MuZmFtaWx5IHx8ICcnO1xudmFyIEFORFJPSUQgPSBvcyA9PT0gJ0FuZHJvaWQnO1xudmFyIFdJTkRPV1MgPSBvcy5zbGljZSgwLCA3KSA9PT0gJ1dpbmRvd3MnO1xudmFyIE9TWCA9IG9zID09PSAnT1MgWCc7XG52YXIgSU9TID0gb3MgPT09ICdpT1MnO1xuLy8gbGF5b3V0XG52YXIgQkxJTksgPSBwbGF0Zm9ybS5sYXlvdXQgPT09ICdCbGluayc7XG52YXIgR0VDS08gPSBwbGF0Zm9ybS5sYXlvdXQgPT09ICdHZWNrbyc7XG52YXIgVFJJREVOVCA9IHBsYXRmb3JtLmxheW91dCA9PT0gJ1RyaWRlbnQnO1xudmFyIEVER0UgPSBwbGF0Zm9ybS5sYXlvdXQgPT09ICdFZGdlSFRNTCc7XG52YXIgV0VCS0lUID0gcGxhdGZvcm0ubGF5b3V0ID09PSAnV2ViS2l0Jztcbi8vIGJyb3dzZXIgdmVyc2lvbiAobm90IGxheW91dCBlbmdpbmUgdmVyc2lvbiEpXG52YXIgdmVyc2lvbiA9IHBhcnNlRmxvYXQocGxhdGZvcm0udmVyc2lvbik7XG52YXIgbWFqb3JWZXJzaW9uID0gTWF0aC5mbG9vcih2ZXJzaW9uKTtcbnBsYXRmb3JtLm1ham9yVmVyc2lvbiA9IG1ham9yVmVyc2lvbjtcbnBsYXRmb3JtLmlzID0ge1xuICAgIC8vIG9wZXJhdGluZyBzeXN0ZW1cbiAgICBBTkRST0lEOiBBTkRST0lELFxuICAgIFdJTkRPV1M6IFdJTkRPV1MsXG4gICAgT1NYOiBPU1gsXG4gICAgSU9TOiBJT1MsXG4gICAgLy8gbGF5b3V0XG4gICAgQkxJTks6IEJMSU5LLFxuICAgIEdFQ0tPOiBHRUNLTyxcbiAgICBUUklERU5UOiBUUklERU5ULFxuICAgIEVER0U6IEVER0UsXG4gICAgV0VCS0lUOiBXRUJLSVQsXG4gICAgLy8gSU5URVJORVQgRVhQTE9SRVJTXG4gICAgSUU5OiBUUklERU5UICYmIG1ham9yVmVyc2lvbiA9PT0gOSxcbiAgICBJRTEwOiBUUklERU5UICYmIG1ham9yVmVyc2lvbiA9PT0gMTAsXG4gICAgSUUxMTogVFJJREVOVCAmJiBtYWpvclZlcnNpb24gPT09IDExXG59O1xuZnVuY3Rpb24gYmVmb3JlKCkge1xuICAgIHZhciBkYXRhID0ge1xuICAgICAgICAvLyByZW1lbWJlciB3aGF0IGhhZCBmb2N1cyB0byByZXN0b3JlIGFmdGVyIHRlc3RcbiAgICAgICAgYWN0aXZlRWxlbWVudDogZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxcbiAgICAgICAgLy8gcmVtZW1iZXIgc2Nyb2xsIHBvc2l0aW9ucyB0byByZXN0b3JlIGFmdGVyIHRlc3RcbiAgICAgICAgd2luZG93U2Nyb2xsVG9wOiB3aW5kb3cuc2Nyb2xsVG9wLFxuICAgICAgICB3aW5kb3dTY3JvbGxMZWZ0OiB3aW5kb3cuc2Nyb2xsTGVmdCxcbiAgICAgICAgYm9keVNjcm9sbFRvcDogZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsXG4gICAgICAgIGJvZHlTY3JvbGxMZWZ0OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnRcbiAgICB9O1xuICAgIC8vIHdyYXAgdGVzdHMgaW4gYW4gZWxlbWVudCBoaWRkZW4gZnJvbSBzY3JlZW4gcmVhZGVycyB0byBwcmV2ZW50IHRoZW1cbiAgICAvLyBmcm9tIGFubm91bmNpbmcgZm9jdXMsIHdoaWNoIGNhbiBiZSBxdWl0ZSBpcnJpdGF0aW5nIHRvIHRoZSB1c2VyXG4gICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3Bvc2l0aW9uOmFic29sdXRlOyBwb3NpdGlvbjpmaXhlZDsgdG9wOjA7IGxlZnQ6LTJweDsgd2lkdGg6MXB4OyBoZWlnaHQ6MXB4OyBvdmVyZmxvdzpoaWRkZW47Jyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnYXJpYS1saXZlJywgJ29mZicpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtYnVzeScsICd0cnVlJyk7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICB2YXIgX3dpbmRvdyA9IGlmcmFtZS5jb250ZW50V2luZG93O1xuICAgIHZhciBfZG9jdW1lbnQgPSBfd2luZG93LmRvY3VtZW50O1xuICAgIF9kb2N1bWVudC5vcGVuKCk7XG4gICAgX2RvY3VtZW50LmNsb3NlKCk7XG4gICAgdmFyIHdyYXBwZXIgPSBfZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgX2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQod3JhcHBlcik7XG4gICAgZGF0YS5pZnJhbWUgPSBpZnJhbWU7XG4gICAgZGF0YS53cmFwcGVyID0gd3JhcHBlcjtcbiAgICBkYXRhLndpbmRvdyA9IF93aW5kb3c7XG4gICAgZGF0YS5kb2N1bWVudCA9IF9kb2N1bWVudDtcbiAgICByZXR1cm4gZGF0YTtcbn1cbi8vIG9wdGlvbnMuZWxlbWVudDpcbi8vICB7c3RyaW5nfSBlbGVtZW50IG5hbWVcbi8vICB7ZnVuY3Rpb259IGNhbGxiYWNrKHdyYXBwZXIsIGRvY3VtZW50KSB0byBnZW5lcmF0ZSBhbiBlbGVtZW50XG4vLyBvcHRpb25zLm11dGF0ZTogKG9wdGlvbmFsKVxuLy8gIHtmdW5jdGlvbn0gY2FsbGJhY2soZWxlbWVudCwgd3JhcHBlciwgZG9jdW1lbnQpIHRvIG1hbmlwdWxhdGUgZWxlbWVudCBwcmlvciB0byBmb2N1cy10ZXN0LlxuLy8gICAgICAgICAgICAgQ2FuIHJldHVybiBET01FbGVtZW50IHRvIGRlZmluZSBmb2N1cyB0YXJnZXQgKGRlZmF1bHQ6IGVsZW1lbnQpXG4vLyBvcHRpb25zLnZhbGlkYXRlOiAob3B0aW9uYWwpXG4vLyAge2Z1bmN0aW9ufSBjYWxsYmFjayhlbGVtZW50LCBmb2N1c1RhcmdldCwgZG9jdW1lbnQpIHRvIG1hbmlwdWxhdGUgdGVzdC1yZXN1bHRcbmZ1bmN0aW9uIHRlc3QoZGF0YSwgb3B0aW9ucykge1xuICAgIC8vIG1ha2Ugc3VyZSB3ZSBvcGVyYXRlIG9uIGEgY2xlYW4gc2xhdGVcbiAgICBkYXRhLndyYXBwZXIuaW5uZXJIVE1MID0gJyc7XG4gICAgLy8gY3JlYXRlIGR1bW15IGVsZW1lbnQgdG8gdGVzdCBmb2N1c2FiaWxpdHkgb2ZcbiAgICB2YXIgZWxlbWVudCA9IHR5cGVvZiBvcHRpb25zLmVsZW1lbnQgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZGF0YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KG9wdGlvbnMuZWxlbWVudClcbiAgICAgICAgOiBvcHRpb25zLmVsZW1lbnQoZGF0YS53cmFwcGVyLCBkYXRhLmRvY3VtZW50KTtcbiAgICAvLyBhbGxvdyBjYWxsYmFjayB0byBmdXJ0aGVyIHNwZWNpZnkgZHVtbXkgZWxlbWVudFxuICAgIC8vIGFuZCBvcHRpb25hbGx5IGRlZmluZSBlbGVtZW50IHRvIGZvY3VzXG4gICAgdmFyIGZvY3VzID0gb3B0aW9ucy5tdXRhdGUgJiYgb3B0aW9ucy5tdXRhdGUoZWxlbWVudCwgZGF0YS53cmFwcGVyLCBkYXRhLmRvY3VtZW50KTtcbiAgICBpZiAoIWZvY3VzICYmIGZvY3VzICE9PSBmYWxzZSkge1xuICAgICAgICBmb2N1cyA9IGVsZW1lbnQ7XG4gICAgfVxuICAgIC8vIGVsZW1lbnQgbmVlZHMgdG8gYmUgcGFydCBvZiB0aGUgRE9NIHRvIGJlIGZvY3VzYWJsZVxuICAgICFlbGVtZW50LnBhcmVudE5vZGUgJiYgZGF0YS53cmFwcGVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgIC8vIHRlc3QgaWYgdGhlIGVsZW1lbnQgd2l0aCBpbnZhbGlkIHRhYmluZGV4IGNhbiBiZSBmb2N1c2VkXG4gICAgZm9jdXMgJiYgZm9jdXMuZm9jdXMgJiYgZm9jdXMuZm9jdXMoKTtcbiAgICAvLyB2YWxpZGF0ZSB0ZXN0J3MgcmVzdWx0XG4gICAgcmV0dXJuIG9wdGlvbnMudmFsaWRhdGVcbiAgICAgICAgPyBvcHRpb25zLnZhbGlkYXRlKGVsZW1lbnQsIGZvY3VzLCBkYXRhLmRvY3VtZW50KVxuICAgICAgICA6IGRhdGEuZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZm9jdXM7XG59XG5mdW5jdGlvbiBhZnRlcihkYXRhKSB7XG4gICAgLy8gcmVzdG9yZSBmb2N1cyB0byB3aGF0IGl0IHdhcyBiZWZvcmUgdGVzdCBhbmQgY2xlYW51cFxuICAgIGlmIChkYXRhLmFjdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJlxuICAgICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyICYmXG4gICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICAgICAgaWYgKHBsYXRmb3JtLmlzLklFMTApIHtcbiAgICAgICAgICAgIC8vIElFMTAgZG9lcyBub3QgcmVkaXJlY3QgZm9jdXMgdG8gPGJvZHk+IHdoZW4gdGhlIGFjdGl2ZUVsZW1lbnQgaXMgcmVtb3ZlZFxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBkYXRhLmFjdGl2ZUVsZW1lbnQgJiYgZGF0YS5hY3RpdmVFbGVtZW50LmZvY3VzICYmIGRhdGEuYWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRhdGEuaWZyYW1lKTtcbiAgICAvLyByZXN0b3JlIHNjcm9sbCBwb3NpdGlvblxuICAgIHdpbmRvdy5zY3JvbGxUb3AgPSBkYXRhLndpbmRvd1Njcm9sbFRvcDtcbiAgICB3aW5kb3cuc2Nyb2xsTGVmdCA9IGRhdGEud2luZG93U2Nyb2xsTGVmdDtcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCA9IGRhdGEuYm9keVNjcm9sbFRvcDtcbiAgICBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgPSBkYXRhLmJvZHlTY3JvbGxMZWZ0O1xufVxuZnVuY3Rpb24gZGV0ZWN0Rm9jdXModGVzdHMpIHtcbiAgICB2YXIgZGF0YSA9IGJlZm9yZSgpO1xuICAgIHZhciByZXN1bHRzID0ge307XG4gICAgT2JqZWN0LmtleXModGVzdHMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJlc3VsdHNba2V5XSA9IHRlc3QoZGF0YSwgdGVzdHNba2V5XSk7XG4gICAgfSk7XG4gICAgYWZ0ZXIoZGF0YSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG4vLyB0aGlzIGZpbGUgaXMgb3ZlcndyaXR0ZW4gYnkgYG5wbSBydW4gYnVpbGQ6cHJlYFxudmFyIHZlcnNpb24kMSA9ICcxLjQuMSc7XG4vKlxuICAgIEZhY2lsaXR5IHRvIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBsb2NhbFN0b3JhZ2UuXG5cbiAgICBVU0FHRTpcbiAgICAgIGNhY2hlLmdldCgna2V5Jyk7XG4gICAgICBjYWNoZS5zZXQoJ2tleScsICd2YWx1ZScpO1xuICovXG5mdW5jdGlvbiByZWFkTG9jYWxTdG9yYWdlKGtleSkge1xuICAgIC8vIGFsbG93IHJlYWRpbmcgZnJvbSBzdG9yYWdlIHRvIHJldHJpZXZlIHByZXZpb3VzIHN1cHBvcnQgcmVzdWx0c1xuICAgIC8vIGV2ZW4gd2hpbGUgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZm9jdXNcbiAgICB2YXIgZGF0YSA9IHZvaWQgMDtcbiAgICB0cnkge1xuICAgICAgICBkYXRhID0gd2luZG93LmxvY2FsU3RvcmFnZSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgZGF0YSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEpIDoge307XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGRhdGEgPSB7fTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59XG5mdW5jdGlvbiB3cml0ZUxvY2FsU3RvcmFnZShrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFkb2N1bWVudC5oYXNGb2N1cygpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGZvY3VzIHdoZW4gdGVzdHMgYXJlIGV4ZWN1dGVkLCBmb2N1cygpIG1heVxuICAgICAgICAvLyBub3QgYmUgaGFuZGxlZCBwcm9wZXJseSBhbmQgZXZlbnRzIG1heSBub3QgYmUgZGlzcGF0Y2hlZCBpbW1lZGlhdGVseS5cbiAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBkb2N1bWVudCBpcyByZWxvYWRlZCB3aGlsZSBEZXZlbG9wZXIgVG9vbHMgaGF2ZSBmb2N1cy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UgJiYgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZSAmJlxuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgfVxufVxudmFyIHVzZXJBZ2VudCA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgfHwgJyc7XG52YXIgY2FjaGVLZXkgPSAnYWxseS1zdXBwb3J0cy1jYWNoZSc7XG52YXIgY2FjaGUgPSByZWFkTG9jYWxTdG9yYWdlKGNhY2hlS2V5KTtcbi8vIHVwZGF0ZSB0aGUgY2FjaGUgaWYgYWxseSBvciB0aGUgdXNlciBhZ2VudCBjaGFuZ2VkIChuZXdlciB2ZXJzaW9uLCBldGMpXG5pZiAoY2FjaGUudXNlckFnZW50ICE9PSB1c2VyQWdlbnQgfHwgY2FjaGUudmVyc2lvbiAhPT0gdmVyc2lvbiQxKSB7XG4gICAgY2FjaGUgPSB7fTtcbn1cbmNhY2hlLnVzZXJBZ2VudCA9IHVzZXJBZ2VudDtcbmNhY2hlLnZlcnNpb24gPSB2ZXJzaW9uJDE7XG52YXIgY2FjaGUkMSA9IHtcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWVzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWVzW2tleV07XG4gICAgICAgIH0pO1xuICAgICAgICBjYWNoZS50aW1lID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgICB3cml0ZUxvY2FsU3RvcmFnZShjYWNoZUtleSwgY2FjaGUpO1xuICAgIH1cbn07XG5mdW5jdGlvbiBjc3NTaGFkb3dQaWVyY2luZ0RlZXBDb21iaW5hdG9yKCkge1xuICAgIHZhciBjb21iaW5hdG9yID0gdm9pZCAwO1xuICAgIC8vIHNlZSBodHRwczovL2Rldi53My5vcmcvY3Nzd2cvY3NzLXNjb3BpbmctMS8jZGVlcC1jb21iaW5hdG9yXG4gICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTExNzU3MlxuICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDYwNTFcbiAgICB0cnkge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdodG1sID4+PiA6Zmlyc3QtY2hpbGQnKTtcbiAgICAgICAgY29tYmluYXRvciA9ICc+Pj4nO1xuICAgIH1cbiAgICBjYXRjaCAobm9BcnJvd0Fycm93QXJyb3cpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIG9sZCBzeW50YXggc3VwcG9ydGVkIGF0IGxlYXN0IHVwIHRvIENocm9tZSA0MVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0NjA1MVxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaHRtbCAvZGVlcC8gOmZpcnN0LWNoaWxkJyk7XG4gICAgICAgICAgICBjb21iaW5hdG9yID0gJy9kZWVwLyc7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKG5vRGVlcCkge1xuICAgICAgICAgICAgY29tYmluYXRvciA9ICcnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21iaW5hdG9yO1xufVxudmFyIGdpZiA9ICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUlBQUFBQUFBUC8vL3lINUJBRUFBQUFBTEFBQUFBQUJBQUVBQUFJQlJBQTcnO1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2ltZyNhdHRyLXVzZW1hcFxudmFyIGZvY3VzQXJlYUltZ1RhYmluZGV4ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzxtYXAgbmFtZT1cImltYWdlLW1hcC10YWJpbmRleC10ZXN0XCI+JyArXG4gICAgICAgICAgICAgICAgJzxhcmVhIHNoYXBlPVwicmVjdFwiIGNvb3Jkcz1cIjYzLDE5LDE0NCw0NVwiPjwvbWFwPicgK1xuICAgICAgICAgICAgICAgICc8aW1nIHVzZW1hcD1cIiNpbWFnZS1tYXAtdGFiaW5kZXgtdGVzdFwiIHRhYmluZGV4PVwiLTFcIiBhbHQ9XCJcIiBzcmM9XCInICtcbiAgICAgICAgICAgICAgICBnaWYgK1xuICAgICAgICAgICAgICAgICdcIj4nO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhcmVhJyk7XG4gICAgfVxufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbWcjYXR0ci11c2VtYXBcbnZhciBmb2N1c0FyZWFUYWJpbmRleCA9IHtcbiAgICBlbGVtZW50OiAnZGl2JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8bWFwIG5hbWU9XCJpbWFnZS1tYXAtdGFiaW5kZXgtdGVzdFwiPicgK1xuICAgICAgICAgICAgICAgICc8YXJlYSBocmVmPVwiI3ZvaWRcIiB0YWJpbmRleD1cIi0xXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiNjMsMTksMTQ0LDQ1XCI+PC9tYXA+JyArXG4gICAgICAgICAgICAgICAgJzxpbWcgdXNlbWFwPVwiI2ltYWdlLW1hcC10YWJpbmRleC10ZXN0XCIgYWx0PVwiXCIgc3JjPVwiJyArXG4gICAgICAgICAgICAgICAgZ2lmICtcbiAgICAgICAgICAgICAgICAnXCI+JztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKGVsZW1lbnQsIGZvY3VzVGFyZ2V0LCBfZG9jdW1lbnQpIHtcbiAgICAgICAgaWYgKHBsYXRmb3JtLmlzLkdFQ0tPKSB7XG4gICAgICAgICAgICAvLyBmaXhlcyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzM1XG4gICAgICAgICAgICAvLyBGaXJlZm94IGxvYWRzIHRoZSBEYXRhVVJJIGFzeW5jaHJvbm91c2x5LCBjYXVzaW5nIGEgZmFsc2UtbmVnYXRpdmVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmb2N1cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignYXJlYScpO1xuICAgICAgICBmb2N1cy5mb2N1cygpO1xuICAgICAgICByZXR1cm4gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGZvY3VzO1xuICAgIH1cbn07XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW1nI2F0dHItdXNlbWFwXG52YXIgZm9jdXNBcmVhV2l0aG91dEhyZWYgPSB7XG4gICAgZWxlbWVudDogJ2RpdicsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9XG4gICAgICAgICAgICAnPG1hcCBuYW1lPVwiaW1hZ2UtbWFwLWFyZWEtaHJlZi10ZXN0XCI+JyArXG4gICAgICAgICAgICAgICAgJzxhcmVhIHNoYXBlPVwicmVjdFwiIGNvb3Jkcz1cIjYzLDE5LDE0NCw0NVwiPjwvbWFwPicgK1xuICAgICAgICAgICAgICAgICc8aW1nIHVzZW1hcD1cIiNpbWFnZS1tYXAtYXJlYS1ocmVmLXRlc3RcIiBhbHQ9XCJcIiBzcmM9XCInICtcbiAgICAgICAgICAgICAgICBnaWYgK1xuICAgICAgICAgICAgICAgICdcIj4nO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhcmVhJyk7XG4gICAgfSxcbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoZWxlbWVudCwgZm9jdXNUYXJnZXQsIF9kb2N1bWVudCkge1xuICAgICAgICBpZiAocGxhdGZvcm0uaXMuR0VDS08pIHtcbiAgICAgICAgICAgIC8vIGZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvYWxseS5qcy9pc3N1ZXMvMzVcbiAgICAgICAgICAgIC8vIEZpcmVmb3ggbG9hZHMgdGhlIERhdGFVUkkgYXN5bmNocm9ub3VzbHksIGNhdXNpbmcgYSBmYWxzZS1uZWdhdGl2ZVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9kb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBmb2N1c1RhcmdldDtcbiAgICB9XG59O1xudmFyIGZvY3VzQXVkaW9XaXRob3V0Q29udHJvbHMgPSB7XG4gICAgbmFtZTogJ2Nhbi1mb2N1cy1hdWRpby13aXRob3V0LWNvbnRyb2xzJyxcbiAgICBlbGVtZW50OiAnYXVkaW8nLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIGludmFsaWQgbWVkaWEgZmlsZSBjYW4gdHJpZ2dlciB3YXJuaW5nIGluIGNvbnNvbGUsIGRhdGEtdXJpIHRvIHByZXZlbnQgSFRUUCByZXF1ZXN0XG4gICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3JjJywgZ2lmKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSUU5IG1heSB0aHJvdyBcIkVycm9yOiBOb3QgaW1wbGVtZW50ZWRcIlxuICAgICAgICB9XG4gICAgfVxufTtcbnZhciBpbnZhbGlkR2lmID0gJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8vWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWic7XG4vLyBOT1RFOiBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzM1XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW1nI2F0dHItdXNlbWFwXG52YXIgZm9jdXNCcm9rZW5JbWFnZU1hcCA9IHtcbiAgICBlbGVtZW50OiAnZGl2JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8bWFwIG5hbWU9XCJicm9rZW4taW1hZ2UtbWFwLXRlc3RcIj48YXJlYSBocmVmPVwiI3ZvaWRcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCI2MywxOSwxNDQsNDVcIj48L21hcD4nICtcbiAgICAgICAgICAgICAgICAnPGltZyB1c2VtYXA9XCIjYnJva2VuLWltYWdlLW1hcC10ZXN0XCIgYWx0PVwiXCIgc3JjPVwiJyArXG4gICAgICAgICAgICAgICAgaW52YWxpZEdpZiArXG4gICAgICAgICAgICAgICAgJ1wiPic7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2FyZWEnKTtcbiAgICB9XG59O1xuLy8gQ2hpbGRyZW4gb2YgZm9jdXNhYmxlIGVsZW1lbnRzIHdpdGggZGlzcGxheTpmbGV4IGFyZSBmb2N1c2FibGUgaW4gSUUxMC0xMVxudmFyIGZvY3VzQ2hpbGRyZW5PZkZvY3VzYWJsZUZsZXhib3ggPSB7XG4gICAgZWxlbWVudDogJ2RpdicsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IC13ZWJraXQtZmxleDsgZGlzcGxheTogLW1zLWZsZXhib3g7IGRpc3BsYXk6IGZsZXg7Jyk7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+aGVsbG88L3NwYW4+JztcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3Rvcignc3BhbicpO1xuICAgIH1cbn07XG4vLyBmaWVsZHNldFt0YWJpbmRleD0wXVtkaXNhYmxlZF0gc2hvdWxkIG5vdCBiZSBmb2N1c2FibGUsIGJ1dCBCbGluayBhbmQgV2ViS2l0IGRpc2FncmVlXG4vLyBAc3BlY2lmaWNhdGlvbiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZGlzYWJsZWQtZWxlbWVudHMuaHRtbCNjb25jZXB0LWVsZW1lbnQtZGlzYWJsZWRcbi8vIEBicm93c2VyLWlzc3VlIENocm9taXVtIGh0dHBzOi8vY3JidWcuY29tLzQ1Mzg0N1xuLy8gQGJyb3dzZXItaXNzdWUgV2ViS2l0IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDEwODZcbnZhciBmb2N1c0ZpZWxkc2V0RGlzYWJsZWQgPSB7XG4gICAgZWxlbWVudDogJ2ZpZWxkc2V0JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIDApO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICB9XG59O1xudmFyIGZvY3VzRmllbGRzZXQgPSB7XG4gICAgZWxlbWVudDogJ2ZpZWxkc2V0JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJzxsZWdlbmQ+bGVnZW5kPC9sZWdlbmQ+PHA+Y29udGVudDwvcD4nO1xuICAgIH1cbn07XG4vLyBlbGVtZW50cyB3aXRoIGRpc3BsYXk6ZmxleCBhcmUgZm9jdXNhYmxlIGluIElFMTAtMTFcbnZhciBmb2N1c0ZsZXhib3hDb250YWluZXIgPSB7XG4gICAgZWxlbWVudDogJ3NwYW4nLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IC13ZWJraXQtZmxleDsgZGlzcGxheTogLW1zLWZsZXhib3g7IGRpc3BsYXk6IGZsZXg7Jyk7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+aGVsbG88L3NwYW4+JztcbiAgICB9XG59O1xuLy8gZm9ybVt0YWJpbmRleD0wXVtkaXNhYmxlZF0gc2hvdWxkIGJlIGZvY3VzYWJsZSBhcyB0aGVcbi8vIHNwZWNpZmljYXRpb24gZG9lc24ndCBrbm93IHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgb24gdGhlIGZvcm0gZWxlbWVudFxuLy8gQHNwZWNpZmljYXRpb24gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2Zvcm1zLmh0bWwjdGhlLWZvcm0tZWxlbWVudFxudmFyIGZvY3VzRm9ybURpc2FibGVkID0ge1xuICAgIGVsZW1lbnQ6ICdmb3JtJyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIDApO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICB9XG59O1xuLy8gTk9URTogaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9hbGx5LmpzL2lzc3Vlcy8zNVxuLy8gZml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9hbGx5LmpzL2lzc3Vlcy8yMFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2ltZyNhdHRyLWlzbWFwXG52YXIgZm9jdXNJbWdJc21hcCA9IHtcbiAgICBlbGVtZW50OiAnYScsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmhyZWYgPSAnI3ZvaWQnO1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICc8aW1nIGlzbWFwIHNyYz1cIicgKyBnaWYgKyAnXCIgYWx0PVwiXCI+JztcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJyk7XG4gICAgfVxufTtcbi8vIE5PVEU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvYWxseS5qcy9pc3N1ZXMvMzVcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pbWcjYXR0ci11c2VtYXBcbnZhciBmb2N1c0ltZ1VzZW1hcFRhYmluZGV4ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzxtYXAgbmFtZT1cImltYWdlLW1hcC10YWJpbmRleC10ZXN0XCI+PGFyZWEgaHJlZj1cIiN2b2lkXCIgc2hhcGU9XCJyZWN0XCIgY29vcmRzPVwiNjMsMTksMTQ0LDQ1XCI+PC9tYXA+JyArXG4gICAgICAgICAgICAgICAgJzxpbWcgdXNlbWFwPVwiI2ltYWdlLW1hcC10YWJpbmRleC10ZXN0XCIgdGFiaW5kZXg9XCItMVwiIGFsdD1cIlwiICcgK1xuICAgICAgICAgICAgICAgICdzcmM9XCInICtcbiAgICAgICAgICAgICAgICBnaWYgK1xuICAgICAgICAgICAgICAgICdcIj4nO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbWcnKTtcbiAgICB9XG59O1xudmFyIGZvY3VzSW5IaWRkZW5JZnJhbWUgPSB7XG4gICAgZWxlbWVudDogZnVuY3Rpb24gZWxlbWVudCh3cmFwcGVyLCBfZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIGlmcmFtZSA9IF9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgLy8gaWZyYW1lIG11c3QgYmUgcGFydCBvZiB0aGUgRE9NIGJlZm9yZSBhY2Nlc3NpbmcgdGhlIGNvbnRlbnRXaW5kb3cgaXMgcG9zc2libGVcbiAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICAgICAgICAvLyBjcmVhdGUgdGhlIGlmcmFtZSdzIGRlZmF1bHQgZG9jdW1lbnQgKDxodG1sPjxoZWFkPjwvaGVhZD48Ym9keT48L2JvZHk+PC9odG1sPilcbiAgICAgICAgdmFyIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgICAgICAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIGlmcmFtZTtcbiAgICB9LFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGlmcmFtZSkge1xuICAgICAgICBpZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB2YXIgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgdmFyIGlucHV0ID0gaWZyYW1lRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgaWZyYW1lRG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpbnB1dCk7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9LFxuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZShpZnJhbWUpIHtcbiAgICAgICAgdmFyIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgIHZhciBmb2N1cyA9IGlmcmFtZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgIHJldHVybiBpZnJhbWVEb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBmb2N1cztcbiAgICB9XG59O1xudmFyIHJlc3VsdCA9ICFwbGF0Zm9ybS5pcy5XRUJLSVQ7XG5mdW5jdGlvbiBmb2N1c0luWmVyb0RpbWVuc2lvbk9iamVjdCgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8gRmlyZWZveCBhbGxvd3MgKmFueSogdmFsdWUgYW5kIHRyZWF0cyBpbnZhbGlkIHZhbHVlcyBsaWtlIHRhYmluZGV4PVwiLTFcIlxuLy8gQGJyb3dzZXItaXNzdWUgR2Vja28gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEyODA1NFxudmFyIGZvY3VzSW52YWxpZFRhYmluZGV4ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJ2ludmFsaWQtdmFsdWUnKTtcbiAgICB9XG59O1xudmFyIGZvY3VzTGFiZWxUYWJpbmRleCA9IHtcbiAgICBlbGVtZW50OiAnbGFiZWwnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7XG4gICAgfSxcbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoZWxlbWVudCwgZm9jdXNUYXJnZXQsIF9kb2N1bWVudCkge1xuICAgICAgICAvLyBmb3JjZSBsYXlvdXQgaW4gQ2hyb21lIDQ5LCBvdGhlcndpc2UgdGhlIGVsZW1lbnQgd29uJ3QgYmUgZm9jdXNhYmxlXG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gICAgICAgIHZhciB2YXJpYWJsZVRvUHJldmVudERlYWRDb2RlRWxpbWluYXRpb24gPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuICAgICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHJldHVybiBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudDtcbiAgICB9XG59O1xudmFyIHN2ZyA9ICdkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LFBITjJaeUI0Yld4dWN6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNakF3TUM5emRtY2lJSGh0YicgK1xuICAgICdHNXpPbmhzYVc1clBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1TDNoc2FXNXJJaUJwWkQwaWMzWm5JajQ4ZEdWNGRDQjRQU0l4TUNJZ2VUMGlNakFpSUdsa1BTSicgK1xuICAgICd6ZG1jdGJHbHVheTEwWlhoMElqNTBaWGgwUEM5MFpYaDBQand2YzNablBnPT0nO1xuLy8gTm90ZTogSUUxMCBvbiBCcm93c2VyU3RhY2sgZG9lcyBub3QgbGlrZSB0aGlzIHRlc3RcbnZhciBmb2N1c09iamVjdFN2Z0hpZGRlbiA9IHtcbiAgICBlbGVtZW50OiAnb2JqZWN0JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2ltYWdlL3N2Zyt4bWwnKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBzdmcpO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjAwJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnNTAnKTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxufTtcbi8vIE5vdGU6IElFMTAgb24gQnJvd3NlclN0YWNrIGRvZXMgbm90IGxpa2UgdGhpcyB0ZXN0XG52YXIgZm9jdXNPYmplY3RTdmcgPSB7XG4gICAgbmFtZTogJ2Nhbi1mb2N1cy1vYmplY3Qtc3ZnJyxcbiAgICBlbGVtZW50OiAnb2JqZWN0JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2ltYWdlL3N2Zyt4bWwnKTtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEnLCBzdmcpO1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCAnMjAwJyk7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdoZWlnaHQnLCAnNTAnKTtcbiAgICB9LFxuICAgIHZhbGlkYXRlOiBmdW5jdGlvbiB2YWxpZGF0ZShlbGVtZW50LCBmb2N1c1RhcmdldCwgX2RvY3VtZW50KSB7XG4gICAgICAgIGlmIChwbGF0Zm9ybS5pcy5HRUNLTykge1xuICAgICAgICAgICAgLy8gRmlyZWZveCBzZWVtcyB0byBiZSBoYW5kbGluZyB0aGUgb2JqZWN0IGNyZWF0aW9uIGFzeW5jaHJvbm91c2x5IGFuZCB0aGVyZWJ5IHByb2R1Y2VzIGEgZmFsc2UgbmVnYXRpdmUgdGVzdCByZXN1bHQuXG4gICAgICAgICAgICAvLyBCZWNhdXNlIHdlIGtub3cgRmlyZWZveCBpcyBhYmxlIHRvIGZvY3VzIG9iamVjdCBlbGVtZW50cyByZWZlcmVuY2luZyBTVkdzLCB3ZSBzaW1wbHkgY2hlYXQgYnkgc25pZmZpbmcgdGhlIHVzZXIgYWdlbnQgc3RyaW5nXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGVsZW1lbnQ7XG4gICAgfVxufTtcbi8vIEV2ZXJ5IEVudmlyb25tZW50IGV4Y2VwdCBJRTkgY29uc2lkZXJzIFNXRiBvYmplY3RzIGZvY3VzYWJsZVxudmFyIHJlc3VsdCQxID0gIXBsYXRmb3JtLmlzLklFOTtcbmZ1bmN0aW9uIGZvY3VzT2JqZWN0U3dmKCkge1xuICAgIHJldHVybiByZXN1bHQkMTtcbn1cbnZhciBmb2N1c1JlZGlyZWN0SW1nVXNlbWFwID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzxtYXAgbmFtZT1cImZvY3VzLXJlZGlyZWN0LWltZy11c2VtYXBcIj48YXJlYSBocmVmPVwiI3ZvaWRcIiBzaGFwZT1cInJlY3RcIiBjb29yZHM9XCI2MywxOSwxNDQsNDVcIj48L21hcD4nICtcbiAgICAgICAgICAgICAgICAnPGltZyB1c2VtYXA9XCIjZm9jdXMtcmVkaXJlY3QtaW1nLXVzZW1hcFwiIGFsdD1cIlwiICcgK1xuICAgICAgICAgICAgICAgICdzcmM9XCInICtcbiAgICAgICAgICAgICAgICBnaWYgK1xuICAgICAgICAgICAgICAgICdcIj4nO1xuICAgICAgICAvLyBmb2N1cyB0aGUgPGltZz4sIG5vdCB0aGUgPGRpdj5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW1nJyk7XG4gICAgfSxcbiAgICB2YWxpZGF0ZTogZnVuY3Rpb24gdmFsaWRhdGUoZWxlbWVudCwgZm9jdXNUYXJnZXQsIF9kb2N1bWVudCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdhcmVhJyk7XG4gICAgICAgIHJldHVybiBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGFyZ2V0O1xuICAgIH1cbn07XG4vLyBzZWUgaHR0cHM6Ly9qc2Jpbi5jb20vbmVuaXJpc2FnZS9lZGl0P2h0bWwsanMsY29uc29sZSxvdXRwdXRcbnZhciBmb2N1c1JlZGlyZWN0TGVnZW5kID0ge1xuICAgIGVsZW1lbnQ6ICdmaWVsZHNldCcsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9XG4gICAgICAgICAgICAnPGxlZ2VuZD5sZWdlbmQ8L2xlZ2VuZD48aW5wdXQgdGFiaW5kZXg9XCItMVwiPjxpbnB1dCB0YWJpbmRleD1cIjBcIj4nO1xuICAgICAgICAvLyB0YWtlIGNhcmUgb2YgZm9jdXMgaW4gdmFsaWRhdGUoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgdmFsaWRhdGU6IGZ1bmN0aW9uIHZhbGlkYXRlKGVsZW1lbnQsIGZvY3VzVGFyZ2V0LCBfZG9jdW1lbnQpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZSA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbdGFiaW5kZXg9XCItMVwiXScpO1xuICAgICAgICB2YXIgdGFiYmFibGUgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W3RhYmluZGV4PVwiMFwiXScpO1xuICAgICAgICAvLyBGaXJlZm94IHJlcXVpcmVzIHRoaXMgdGVzdCB0byBmb2N1cyB0aGUgPGZpZWxkc2V0PiBmaXJzdCwgd2hpbGUgdGhpcyBpcyBub3QgbmVjZXNzYXJ5IGluXG4gICAgICAgIC8vIGh0dHBzOi8vanNiaW4uY29tL25lbmlyaXNhZ2UvZWRpdD9odG1sLGpzLGNvbnNvbGUsb3V0cHV0XG4gICAgICAgIGVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdsZWdlbmQnKS5mb2N1cygpO1xuICAgICAgICByZXR1cm4gKChfZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZm9jdXNhYmxlICYmICdmb2N1c2FibGUnKSB8fFxuICAgICAgICAgICAgKF9kb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0YWJiYWJsZSAmJiAndGFiYmFibGUnKSB8fFxuICAgICAgICAgICAgJycpO1xuICAgIH1cbn07XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzIxXG52YXIgZm9jdXNTY3JvbGxCb2R5ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAxMDBweDsgaGVpZ2h0OiA1MHB4OyBvdmVyZmxvdzogYXV0bzsnKTtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPVxuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJ3aWR0aDogNTAwcHg7IGhlaWdodDogNDBweDtcIj5zY3JvbGxhYmxlIGNvbnRlbnQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdkaXYnKTtcbiAgICB9XG59O1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9hbGx5LmpzL2lzc3Vlcy8yMVxudmFyIGZvY3VzU2Nyb2xsQ29udGFpbmVyV2l0aG91dE92ZXJmbG93ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOiAxMDBweDsgaGVpZ2h0OiA1MHB4OycpO1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9XG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cIndpZHRoOiA1MDBweDsgaGVpZ2h0OiA0MHB4O1wiPnNjcm9sbGFibGUgY29udGVudDwvZGl2Pic7XG4gICAgfVxufTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvYWxseS5qcy9pc3N1ZXMvMjFcbnZhciBmb2N1c1Njcm9sbENvbnRhaW5lciA9IHtcbiAgICBlbGVtZW50OiAnZGl2JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDogMTAwcHg7IGhlaWdodDogNTBweDsgb3ZlcmZsb3c6IGF1dG87Jyk7XG4gICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID1cbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwid2lkdGg6IDUwMHB4OyBoZWlnaHQ6IDQwcHg7XCI+c2Nyb2xsYWJsZSBjb250ZW50PC9kaXY+JztcbiAgICB9XG59O1xudmFyIGZvY3VzU3VtbWFyeSA9IHtcbiAgICBlbGVtZW50OiAnZGV0YWlscycsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICc8c3VtbWFyeT5mb288L3N1bW1hcnk+PHA+Y29udGVudDwvcD4nO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICB9XG59O1xuZnVuY3Rpb24gbWFrZUZvY3VzYWJsZUZvcmVpZ25PYmplY3QoKSB7XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZnJhZ21lbnQuaW5uZXJIVE1MID1cbiAgICAgICAgJzxzdmc+PGZvcmVpZ25PYmplY3Qgd2lkdGg9XCIzMFwiIGhlaWdodD1cIjMwXCI+XFxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIvPlxcbiAgPC9mb3JlaWduT2JqZWN0Pjwvc3ZnPic7XG4gICAgcmV0dXJuIGZyYWdtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZDtcbn1cbmZ1bmN0aW9uIGZvY3VzU3ZnRm9yZWlnbk9iamVjdEhhY2soZWxlbWVudCkge1xuICAgIC8vIEVkZ2UxMywgRWRnZTE0OiBmb3JlaWduT2JqZWN0IGZvY3VzIGhhY2tcbiAgICAvLyBodHRwczovL2pzYmluLmNvbS9rdW5laGludWdpL2VkaXQ/aHRtbCxqcyxvdXRwdXRcbiAgICAvLyBodHRwczovL2pzYmluLmNvbS9mYWphZ2kvMy9lZGl0P2h0bWwsanMsb3V0cHV0XG4gICAgdmFyIGlzU3ZnRWxlbWVudCA9IGVsZW1lbnQub3duZXJTVkdFbGVtZW50IHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2Zyc7XG4gICAgaWYgKCFpc1N2Z0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBpbmplY3QgYW5kIGZvY3VzIGFuIDxpbnB1dD4gZWxlbWVudCBpbnRvIHRoZSBTVkcgZWxlbWVudCB0byByZWNlaXZlIGZvY3VzXG4gICAgdmFyIGZvcmVpZ25PYmplY3QgPSBtYWtlRm9jdXNhYmxlRm9yZWlnbk9iamVjdCgpO1xuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZm9yZWlnbk9iamVjdCk7XG4gICAgdmFyIGlucHV0ID0gZm9yZWlnbk9iamVjdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGlucHV0LmZvY3VzKCk7XG4gICAgLy8gdXBvbiBkaXNhYmxpbmcgdGhlIGFjdGl2ZUVsZW1lbnQsIElFIGFuZCBFZGdlXG4gICAgLy8gd2lsbCBub3Qgc2hpZnQgZm9jdXMgdG8gPGJvZHk+IGxpa2UgYWxsIHRoZSBvdGhlclxuICAgIC8vIGJyb3dzZXJzLCBidXQgaW5zdGVhZCBmaW5kIHRoZSBmaXJzdCBmb2N1c2FibGVcbiAgICAvLyBhbmNlc3RvciBhbmQgc2hpZnQgZm9jdXMgdG8gdGhhdFxuICAgIGlucHV0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAvLyBjbGVhbiB1cFxuICAgIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZm9yZWlnbk9iamVjdCk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBnZW5lcmF0ZShlbGVtZW50KSB7XG4gICAgcmV0dXJuICgnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCI+JyArXG4gICAgICAgIGVsZW1lbnQgK1xuICAgICAgICAnPC9zdmc+Jyk7XG59XG5mdW5jdGlvbiBmb2N1cyhlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQuZm9jdXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuZm9jdXMuY2FsbChlbGVtZW50KTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZm9jdXNTdmdGb3JlaWduT2JqZWN0SGFjayhlbGVtZW50KTtcbiAgICB9XG59XG5mdW5jdGlvbiB2YWxpZGF0ZShlbGVtZW50LCBmb2N1c1RhcmdldCwgX2RvY3VtZW50KSB7XG4gICAgZm9jdXMoZm9jdXNUYXJnZXQpO1xuICAgIHJldHVybiBfZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gZm9jdXNUYXJnZXQ7XG59XG52YXIgZm9jdXNTdmdGb2N1c2FibGVBdHRyaWJ1dGUgPSB7XG4gICAgZWxlbWVudDogJ2RpdicsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGdlbmVyYXRlKCc8dGV4dCBmb2N1c2FibGU9XCJ0cnVlXCI+YTwvdGV4dD4nKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcigndGV4dCcpO1xuICAgIH0sXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlXG59O1xudmFyIGZvY3VzU3ZnVGFiaW5kZXhBdHRyaWJ1dGUgPSB7XG4gICAgZWxlbWVudDogJ2RpdicsXG4gICAgbXV0YXRlOiBmdW5jdGlvbiBtdXRhdGUoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGdlbmVyYXRlKCc8dGV4dCB0YWJpbmRleD1cIjBcIj5hPC90ZXh0PicpO1xuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ZXh0Jyk7XG4gICAgfSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGVcbn07XG52YXIgZm9jdXNTdmdOZWdhdGl2ZVRhYmluZGV4QXR0cmlidXRlID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBnZW5lcmF0ZSgnPHRleHQgdGFiaW5kZXg9XCItMVwiPmE8L3RleHQ+Jyk7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RleHQnKTtcbiAgICB9LFxuICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxufTtcbnZhciBmb2N1c1N2Z1VzZVRhYmluZGV4ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBnZW5lcmF0ZShbXG4gICAgICAgICAgICAnPGcgaWQ9XCJhbGx5LXRlc3QtdGFyZ2V0XCI+PGEgeGxpbms6aHJlZj1cIiN2b2lkXCI+PHRleHQ+bGluazwvdGV4dD48L2E+PC9nPicsXG4gICAgICAgICAgICAnPHVzZSB4bGluazpocmVmPVwiI2FsbHktdGVzdC10YXJnZXRcIiB4PVwiMFwiIHk9XCIwXCIgdGFiaW5kZXg9XCItMVwiIC8+JyxcbiAgICAgICAgXS5qb2luKCcnKSk7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VzZScpO1xuICAgIH0sXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlXG59O1xudmFyIGZvY3VzU3ZnRm9yZWlnbm9iamVjdFRhYmluZGV4ID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBnZW5lcmF0ZSgnPGZvcmVpZ25PYmplY3QgdGFiaW5kZXg9XCItMVwiPjxpbnB1dCB0eXBlPVwidGV4dFwiIC8+PC9mb3JlaWduT2JqZWN0PicpO1xuICAgICAgICAvLyBTYWZhcmkgOCdzIHF1ZXJzU2VsZWN0b3IoKSBjYW4ndCBpZGVudGlmeSBmb3JlaWduT2JqZWN0LCBidXQgZ2V0RWxlbWVudHlCeVRhZ05hbWUoKSBjYW5cbiAgICAgICAgcmV0dXJuIChlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2ZvcmVpZ25PYmplY3QnKSB8fFxuICAgICAgICAgICAgZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZm9yZWlnbk9iamVjdCcpWzBdKTtcbiAgICB9LFxuICAgIHZhbGlkYXRlOiB2YWxpZGF0ZVxufTtcbi8vIEZpcmVmb3ggc2VlbXMgdG8gYmUgaGFuZGxpbmcgdGhlIFNWRy1kb2N1bWVudC1pbi1pZnJhbWUgY3JlYXRpb24gYXN5bmNocm9ub3VzbHlcbi8vIGFuZCB0aGVyZWJ5IHByb2R1Y2VzIGEgZmFsc2UgbmVnYXRpdmUgdGVzdCByZXN1bHQuIFRodXMgdGhlIHRlc3QgaXMgcG9pbnRsZXNzXG4vLyBhbmQgd2UgcmVzb3J0IHRvIFVBIHNuaWZmaW5nIG9uY2UgYWdhaW4uXG4vLyBzZWUgaHR0cDovL2pzYmluLmNvbS92dW5hZG9ob2tvLzEvZWRpdD9qcyxjb25zb2xlLG91dHB1dFxudmFyIHJlc3VsdCQyID0gQm9vbGVhbihwbGF0Zm9ybS5pcy5HRUNLTyAmJlxuICAgIHR5cGVvZiBTVkdFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIFNWR0VsZW1lbnQucHJvdG90eXBlLmZvY3VzKTtcbmZ1bmN0aW9uIGZvY3VzU3ZnSW5JZnJhbWUoKSB7XG4gICAgcmV0dXJuIHJlc3VsdCQyO1xufVxudmFyIGZvY3VzU3ZnID0ge1xuICAgIGVsZW1lbnQ6ICdkaXYnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBnZW5lcmF0ZSgnJyk7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmZpcnN0Q2hpbGQ7XG4gICAgfSxcbiAgICB2YWxpZGF0ZTogdmFsaWRhdGVcbn07XG4vLyBGaXJlZm94IGFsbG93cyAqYW55KiB2YWx1ZSBhbmQgdHJlYXRzIGludmFsaWQgdmFsdWVzIGxpa2UgdGFiaW5kZXg9XCItMVwiXG4vLyBAYnJvd3Nlci1pc3N1ZSBHZWNrbyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTI4MDU0XG52YXIgZm9jdXNUYWJpbmRleFRyYWlsaW5nQ2hhcmFjdGVycyA9IHtcbiAgICBlbGVtZW50OiAnZGl2JyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsICczeCcpO1xuICAgIH1cbn07XG52YXIgZm9jdXNUYWJsZSA9IHtcbiAgICBlbGVtZW50OiAndGFibGUnLFxuICAgIG11dGF0ZTogZnVuY3Rpb24gbXV0YXRlKGVsZW1lbnQsIHdyYXBwZXIsIF9kb2N1bWVudCkge1xuICAgICAgICAvLyBJRTkgaGFzIGEgcHJvYmxlbSByZXBsYWNpbmcgVEJPRFkgY29udGVudHMgd2l0aCBpbm5lckhUTUwuXG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS84MDk3MDU1LzUxNTEyNFxuICAgICAgICAvLyBlbGVtZW50LmlubmVySFRNTCA9ICc8dHI+PHRkPmNlbGw8L3RkPjwvdHI+JztcbiAgICAgICAgdmFyIGZyYWdtZW50ID0gX2RvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgZnJhZ21lbnQuaW5uZXJIVE1MID0gJzx0cj48dGQ+Y2VsbDwvdGQ+PC90cj4nO1xuICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICB9XG59O1xudmFyIGZvY3VzVmlkZW9XaXRob3V0Q29udHJvbHMgPSB7XG4gICAgZWxlbWVudDogJ3ZpZGVvJyxcbiAgICBtdXRhdGU6IGZ1bmN0aW9uIG11dGF0ZShlbGVtZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBpbnZhbGlkIG1lZGlhIGZpbGUgY2FuIHRyaWdnZXIgd2FybmluZyBpbiBjb25zb2xlLCBkYXRhLXVyaSB0byBwcmV2ZW50IEhUVFAgcmVxdWVzdFxuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NyYycsIGdpZik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElFOSBtYXkgdGhyb3cgXCJFcnJvcjogTm90IGltcGxlbWVudGVkXCJcbiAgICAgICAgfVxuICAgIH1cbn07XG4vLyBodHRwczovL2pzYmluLmNvbS92YWZhYmEvMy9lZGl0P2h0bWwsanMsY29uc29sZSxvdXRwdXRcbnZhciByZXN1bHQkMyA9IHBsYXRmb3JtLmlzLkdFQ0tPIHx8IHBsYXRmb3JtLmlzLlRSSURFTlQgfHwgcGxhdGZvcm0uaXMuRURHRTtcbmZ1bmN0aW9uIHRhYnNlcXVlbmNlQXJlYUF0SW1nUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIHJlc3VsdCQzO1xufVxudmFyIHRlc3RDYWxsYmFja3MgPSB7XG4gICAgY3NzU2hhZG93UGllcmNpbmdEZWVwQ29tYmluYXRvcjogY3NzU2hhZG93UGllcmNpbmdEZWVwQ29tYmluYXRvcixcbiAgICBmb2N1c0luWmVyb0RpbWVuc2lvbk9iamVjdDogZm9jdXNJblplcm9EaW1lbnNpb25PYmplY3QsXG4gICAgZm9jdXNPYmplY3RTd2Y6IGZvY3VzT2JqZWN0U3dmLFxuICAgIGZvY3VzU3ZnSW5JZnJhbWU6IGZvY3VzU3ZnSW5JZnJhbWUsXG4gICAgdGFic2VxdWVuY2VBcmVhQXRJbWdQb3NpdGlvbjogdGFic2VxdWVuY2VBcmVhQXRJbWdQb3NpdGlvblxufTtcbnZhciB0ZXN0RGVzY3JpcHRpb25zID0ge1xuICAgIGZvY3VzQXJlYUltZ1RhYmluZGV4OiBmb2N1c0FyZWFJbWdUYWJpbmRleCxcbiAgICBmb2N1c0FyZWFUYWJpbmRleDogZm9jdXNBcmVhVGFiaW5kZXgsXG4gICAgZm9jdXNBcmVhV2l0aG91dEhyZWY6IGZvY3VzQXJlYVdpdGhvdXRIcmVmLFxuICAgIGZvY3VzQXVkaW9XaXRob3V0Q29udHJvbHM6IGZvY3VzQXVkaW9XaXRob3V0Q29udHJvbHMsXG4gICAgZm9jdXNCcm9rZW5JbWFnZU1hcDogZm9jdXNCcm9rZW5JbWFnZU1hcCxcbiAgICBmb2N1c0NoaWxkcmVuT2ZGb2N1c2FibGVGbGV4Ym94OiBmb2N1c0NoaWxkcmVuT2ZGb2N1c2FibGVGbGV4Ym94LFxuICAgIGZvY3VzRmllbGRzZXREaXNhYmxlZDogZm9jdXNGaWVsZHNldERpc2FibGVkLFxuICAgIGZvY3VzRmllbGRzZXQ6IGZvY3VzRmllbGRzZXQsXG4gICAgZm9jdXNGbGV4Ym94Q29udGFpbmVyOiBmb2N1c0ZsZXhib3hDb250YWluZXIsXG4gICAgZm9jdXNGb3JtRGlzYWJsZWQ6IGZvY3VzRm9ybURpc2FibGVkLFxuICAgIGZvY3VzSW1nSXNtYXA6IGZvY3VzSW1nSXNtYXAsXG4gICAgZm9jdXNJbWdVc2VtYXBUYWJpbmRleDogZm9jdXNJbWdVc2VtYXBUYWJpbmRleCxcbiAgICBmb2N1c0luSGlkZGVuSWZyYW1lOiBmb2N1c0luSGlkZGVuSWZyYW1lLFxuICAgIGZvY3VzSW52YWxpZFRhYmluZGV4OiBmb2N1c0ludmFsaWRUYWJpbmRleCxcbiAgICBmb2N1c0xhYmVsVGFiaW5kZXg6IGZvY3VzTGFiZWxUYWJpbmRleCxcbiAgICBmb2N1c09iamVjdFN2ZzogZm9jdXNPYmplY3RTdmcsXG4gICAgZm9jdXNPYmplY3RTdmdIaWRkZW46IGZvY3VzT2JqZWN0U3ZnSGlkZGVuLFxuICAgIGZvY3VzUmVkaXJlY3RJbWdVc2VtYXA6IGZvY3VzUmVkaXJlY3RJbWdVc2VtYXAsXG4gICAgZm9jdXNSZWRpcmVjdExlZ2VuZDogZm9jdXNSZWRpcmVjdExlZ2VuZCxcbiAgICBmb2N1c1Njcm9sbEJvZHk6IGZvY3VzU2Nyb2xsQm9keSxcbiAgICBmb2N1c1Njcm9sbENvbnRhaW5lcldpdGhvdXRPdmVyZmxvdzogZm9jdXNTY3JvbGxDb250YWluZXJXaXRob3V0T3ZlcmZsb3csXG4gICAgZm9jdXNTY3JvbGxDb250YWluZXI6IGZvY3VzU2Nyb2xsQ29udGFpbmVyLFxuICAgIGZvY3VzU3VtbWFyeTogZm9jdXNTdW1tYXJ5LFxuICAgIGZvY3VzU3ZnRm9jdXNhYmxlQXR0cmlidXRlOiBmb2N1c1N2Z0ZvY3VzYWJsZUF0dHJpYnV0ZSxcbiAgICBmb2N1c1N2Z1RhYmluZGV4QXR0cmlidXRlOiBmb2N1c1N2Z1RhYmluZGV4QXR0cmlidXRlLFxuICAgIGZvY3VzU3ZnTmVnYXRpdmVUYWJpbmRleEF0dHJpYnV0ZTogZm9jdXNTdmdOZWdhdGl2ZVRhYmluZGV4QXR0cmlidXRlLFxuICAgIGZvY3VzU3ZnVXNlVGFiaW5kZXg6IGZvY3VzU3ZnVXNlVGFiaW5kZXgsXG4gICAgZm9jdXNTdmdGb3JlaWdub2JqZWN0VGFiaW5kZXg6IGZvY3VzU3ZnRm9yZWlnbm9iamVjdFRhYmluZGV4LFxuICAgIGZvY3VzU3ZnOiBmb2N1c1N2ZyxcbiAgICBmb2N1c1RhYmluZGV4VHJhaWxpbmdDaGFyYWN0ZXJzOiBmb2N1c1RhYmluZGV4VHJhaWxpbmdDaGFyYWN0ZXJzLFxuICAgIGZvY3VzVGFibGU6IGZvY3VzVGFibGUsXG4gICAgZm9jdXNWaWRlb1dpdGhvdXRDb250cm9sczogZm9jdXNWaWRlb1dpdGhvdXRDb250cm9sc1xufTtcbmZ1bmN0aW9uIGV4ZWN1dGVUZXN0cygpIHtcbiAgICB2YXIgcmVzdWx0cyA9IGRldGVjdEZvY3VzKHRlc3REZXNjcmlwdGlvbnMpO1xuICAgIE9iamVjdC5rZXlzKHRlc3RDYWxsYmFja3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXN1bHRzW2tleV0gPSB0ZXN0Q2FsbGJhY2tzW2tleV0oKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cztcbn1cbnZhciBzdXBwb3J0c0NhY2hlID0gbnVsbDtcbmZ1bmN0aW9uIF9zdXBwb3J0cygpIHtcbiAgICBpZiAoc3VwcG9ydHNDYWNoZSkge1xuICAgICAgICByZXR1cm4gc3VwcG9ydHNDYWNoZTtcbiAgICB9XG4gICAgc3VwcG9ydHNDYWNoZSA9IGNhY2hlJDEuZ2V0KCk7XG4gICAgaWYgKCFzdXBwb3J0c0NhY2hlLnRpbWUpIHtcbiAgICAgICAgY2FjaGUkMS5zZXQoZXhlY3V0ZVRlc3RzKCkpO1xuICAgICAgICBzdXBwb3J0c0NhY2hlID0gY2FjaGUkMS5nZXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cHBvcnRzQ2FjaGU7XG59XG52YXIgc3VwcG9ydHMgPSB2b2lkIDA7XG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5mcmFzdHJ1Y3R1cmUuaHRtbCNydWxlcy1mb3ItcGFyc2luZy1pbnRlZ2Vyc1xuLy8gTk9URTogYWxsIGJyb3dzZXJzIGFncmVlIHRvIGFsbG93IHRyYWlsaW5nIHNwYWNlcyBhcyB3ZWxsXG52YXIgdmFsaWRJbnRlZ2VyUGF0dGVybk5vVHJhaWxpbmcgPSAvXlxccyooLXxcXCspP1swLTldK1xccyokLztcbnZhciB2YWxpZEludGVnZXJQYXR0ZXJuV2l0aFRyYWlsaW5nID0gL15cXHMqKC18XFwrKT9bMC05XSsuKiQvO1xuZnVuY3Rpb24gaXNWYWxpZFRhYmluZGV4KGNvbnRleHQpIHtcbiAgICBpZiAoIXN1cHBvcnRzKSB7XG4gICAgICAgIHN1cHBvcnRzID0gX3N1cHBvcnRzKCk7XG4gICAgfVxuICAgIHZhciB2YWxpZEludGVnZXJQYXR0ZXJuID0gc3VwcG9ydHMuZm9jdXNUYWJpbmRleFRyYWlsaW5nQ2hhcmFjdGVyc1xuICAgICAgICA/IHZhbGlkSW50ZWdlclBhdHRlcm5XaXRoVHJhaWxpbmdcbiAgICAgICAgOiB2YWxpZEludGVnZXJQYXR0ZXJuTm9UcmFpbGluZztcbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2lzL3ZhbGlkLXRhYmluZGV4JyxcbiAgICAgICAgcmVzb2x2ZURvY3VtZW50OiB0cnVlLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSk7XG4gICAgLy8gRWRnZSAxNCBoYXMgYSBjYXBpdGFsaXphdGlvbiBwcm9ibGVtIG9uIFNWRyBlbGVtZW50cyxcbiAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvOTI4MjA1OC9cbiAgICB2YXIgaGFzVGFiaW5kZXggPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICB2YXIgaGFzVGFiSW5kZXggPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFiSW5kZXgnKTtcbiAgICBpZiAoIWhhc1RhYmluZGV4ICYmICFoYXNUYWJJbmRleCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIG9sZGVyIEZpcmVmb3ggYW5kIEludGVybmV0IEV4cGxvcmVyIGRvbid0IHN1cHBvcnQgdGFiaW5kZXggb24gU1ZHIGVsZW1lbnRzXG4gICAgdmFyIGlzU3ZnRWxlbWVudCA9IGVsZW1lbnQub3duZXJTVkdFbGVtZW50IHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2Zyc7XG4gICAgaWYgKGlzU3ZnRWxlbWVudCAmJiAhc3VwcG9ydHMuZm9jdXNTdmdUYWJpbmRleEF0dHJpYnV0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIEBicm93c2VyLWlzc3VlIEdlY2tvIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTExMjgwNTRcbiAgICBpZiAoc3VwcG9ydHMuZm9jdXNJbnZhbGlkVGFiaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgdGFiaW5kZXggc2VsZWN0b3IgZXZlbiBpZiBpdHMgdmFsdWUgaXMgaW52YWxpZFxuICAgIHZhciB0YWJpbmRleCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGhhc1RhYmluZGV4ID8gJ3RhYmluZGV4JyA6ICd0YWJJbmRleCcpO1xuICAgIC8vIElFMTEgcGFyc2VzIHRhYmluZGV4PVwiXCIgYXMgdGhlIHZhbHVlIFwiLTMyNzY4XCJcbiAgICAvLyBAYnJvd3Nlci1pc3N1ZSBUcmlkZW50IGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTA3Mjk2NVxuICAgIGlmICh0YWJpbmRleCA9PT0gJy0zMjc2OCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gQm9vbGVhbih0YWJpbmRleCAmJiB2YWxpZEludGVnZXJQYXR0ZXJuLnRlc3QodGFiaW5kZXgpKTtcbn1cbmZ1bmN0aW9uIHRhYmluZGV4VmFsdWUoZWxlbWVudCkge1xuICAgIGlmICghaXNWYWxpZFRhYmluZGV4KGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBFZGdlIDE0IGhhcyBhIGNhcGl0YWxpemF0aW9uIHByb2JsZW0gb24gU1ZHIGVsZW1lbnRzLFxuICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy85MjgyMDU4L1xuICAgIHZhciBoYXNUYWJpbmRleCA9IGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpO1xuICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gaGFzVGFiaW5kZXggPyAndGFiaW5kZXgnIDogJ3RhYkluZGV4JztcbiAgICAvLyBAYnJvd3Nlci1pc3N1ZSBHZWNrbyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTI4MDU0XG4gICAgdmFyIHRhYmluZGV4ID0gcGFyc2VJbnQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4odGFiaW5kZXgpID8gLTEgOiB0YWJpbmRleDtcbn1cbi8vIHRoaXMgaXMgYSBzaGFyZWQgdXRpbGl0eSBmaWxlIGZvciBmb2N1cy1yZWxldmFudC5qcyBhbmQgdGFiYmFibGUuanNcbi8vIHNlcGFyYXRlIHRlc3Rpbmcgb2YgdGhpcyBmaWxlJ3MgZnVuY3Rpb25zIGlzIG5vdCBuZWNlc3NhcnksXG4vLyBhcyB0aGV5J3JlIGltcGxpY2l0bHkgdGVzdGVkIGJ5IHdheSBvZiB0aGUgY29uc3VtZXJzXG5mdW5jdGlvbiBpc1VzZXJNb2RpZnlXcml0YWJsZShzdHlsZSkge1xuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8xOTk5L1dELWNzczMtdXNlcmludC0xOTk5MDkxNiN1c2VyLW1vZGlmeVxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvYWxseS5qcy9pc3N1ZXMvMTdcbiAgICB2YXIgdXNlck1vZGlmeSA9IHN0eWxlLndlYmtpdFVzZXJNb2RpZnkgfHwgJyc7XG4gICAgcmV0dXJuIEJvb2xlYW4odXNlck1vZGlmeSAmJiB1c2VyTW9kaWZ5LmluZGV4T2YoJ3dyaXRlJykgIT09IC0xKTtcbn1cbmZ1bmN0aW9uIGhhc0Nzc092ZXJmbG93U2Nyb2xsKHN0eWxlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cnKSxcbiAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpLFxuICAgICAgICBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdvdmVyZmxvdy15JyksXG4gICAgXS5zb21lKGZ1bmN0aW9uIChvdmVyZmxvdykge1xuICAgICAgICByZXR1cm4gb3ZlcmZsb3cgPT09ICdhdXRvJyB8fCBvdmVyZmxvdyA9PT0gJ3Njcm9sbCc7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBoYXNDc3NEaXNwbGF5RmxleChzdHlsZSkge1xuICAgIHJldHVybiBzdHlsZS5kaXNwbGF5LmluZGV4T2YoJ2ZsZXgnKSA+IC0xO1xufVxuZnVuY3Rpb24gaXNTY3JvbGxhYmxlQ29udGFpbmVyKGVsZW1lbnQsIG5vZGVOYW1lLCBwYXJlbnROb2RlTmFtZSwgcGFyZW50U3R5bGUpIHtcbiAgICBpZiAobm9kZU5hbWUgIT09ICdkaXYnICYmIG5vZGVOYW1lICE9PSAnc3BhbicpIHtcbiAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgYWR2YW5jZXMgc2Nyb2xsYWJsZSBjb250YWluZXJzIGFuZCBib2RpZXMgdG8gZm9jdXNhYmxlXG4gICAgICAgIC8vIG9ubHkgaWYgdGhlIHNjcm9sbGFibGUgY29udGFpbmVyIGlzIDxkaXY+IG9yIDxzcGFuPiAtIHRoaXMgZG9lcyAqbm90KlxuICAgICAgICAvLyBoYXBwZW4gZm9yIDxzZWN0aW9uPiwgPGFydGljbGU+LCDigKZcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAocGFyZW50Tm9kZU5hbWUgJiZcbiAgICAgICAgcGFyZW50Tm9kZU5hbWUgIT09ICdkaXYnICYmXG4gICAgICAgIHBhcmVudE5vZGVOYW1lICE9PSAnc3BhbicgJiZcbiAgICAgICAgIWhhc0Nzc092ZXJmbG93U2Nyb2xsKHBhcmVudFN0eWxlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAoZWxlbWVudC5vZmZzZXRIZWlnaHQgPCBlbGVtZW50LnNjcm9sbEhlaWdodCB8fFxuICAgICAgICBlbGVtZW50Lm9mZnNldFdpZHRoIDwgZWxlbWVudC5zY3JvbGxXaWR0aCk7XG59XG52YXIgc3VwcG9ydHMkMSA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzRm9jdXNSZWxldmFudFJ1bGVzKCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwgY29udGV4dCA9IF9yZWYuY29udGV4dCwgX3JlZiRleGNlcHQgPSBfcmVmLmV4Y2VwdCwgZXhjZXB0ID0gX3JlZiRleGNlcHQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGZsZXhib3g6IGZhbHNlLFxuICAgICAgICAgICAgc2Nyb2xsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBzaGFkb3c6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgOiBfcmVmJGV4Y2VwdDtcbiAgICBpZiAoIXN1cHBvcnRzJDEpIHtcbiAgICAgICAgc3VwcG9ydHMkMSA9IF9zdXBwb3J0cygpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2lzL2ZvY3VzLXJlbGV2YW50JyxcbiAgICAgICAgcmVzb2x2ZURvY3VtZW50OiB0cnVlLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSk7XG4gICAgaWYgKCFleGNlcHQuc2hhZG93ICYmIGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAvLyBhIFNoYWRvd0RPTSBob3N0IHJlY2VpdmVzIGZvY3VzIHdoZW4gdGhlIGZvY3VzIG1vdmVzIHRvIGl0cyBjb250ZW50XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW1lbnQudHlwZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgICAgLy8gaW5wdXRbdHlwZT1cImhpZGRlblwiXSBzdXBwb3J0cy5jYW5ub3QgYmUgZm9jdXNlZFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ2lucHV0JyB8fFxuICAgICAgICBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHxcbiAgICAgICAgbm9kZU5hbWUgPT09ICdidXR0b24nIHx8XG4gICAgICAgIG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobm9kZU5hbWUgPT09ICdsZWdlbmQnICYmIHN1cHBvcnRzJDEuZm9jdXNSZWRpcmVjdExlZ2VuZCkge1xuICAgICAgICAvLyBzcGVjaWZpY3MgZmlsdGVyZWQgaW4gaXMvZm9jdXNhYmxlXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobm9kZU5hbWUgPT09ICdsYWJlbCcpIHtcbiAgICAgICAgLy8gc3BlY2lmaWNzIGZpbHRlcmVkIGluIGlzL2ZvY3VzYWJsZVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnYXJlYScpIHtcbiAgICAgICAgLy8gc3BlY2lmaWNzIGZpbHRlcmVkIGluIGlzL2ZvY3VzYWJsZVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnYScgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnb2JqZWN0JyAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndXNlbWFwJykpIHtcbiAgICAgICAgLy8gb2JqZWN0W3VzZW1hcF0gaXMgbm90IGZvY3VzYWJsZSBpbiBhbnkgYnJvd3NlclxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdmFyIHN2Z1R5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgndHlwZScpO1xuICAgICAgICBpZiAoIXN1cHBvcnRzJDEuZm9jdXNPYmplY3RTdmcgJiYgc3ZnVHlwZSA9PT0gJ2ltYWdlL3N2Zyt4bWwnKSB7XG4gICAgICAgICAgICAvLyBvYmplY3RbdHlwZT1cImltYWdlL3N2Zyt4bWxcIl0gaXMgbm90IGZvY3VzYWJsZSBpbiBJbnRlcm5ldCBFeHBsb3JlclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFzdXBwb3J0cyQxLmZvY3VzT2JqZWN0U3dmICYmXG4gICAgICAgICAgICBzdmdUeXBlID09PSAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnKSB7XG4gICAgICAgICAgICAvLyBvYmplY3RbdHlwZT1cImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoXCJdIGlzIG5vdCBmb2N1c2FibGUgaW4gSW50ZXJuZXQgRXhwbG9yZXIgOVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ2lmcmFtZScgfHwgbm9kZU5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIGJyb3dzaW5nIGNvbnRleHQgY29udGFpbmVyc1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnZW1iZWQnIHx8IG5vZGVOYW1lID09PSAna2V5Z2VuJykge1xuICAgICAgICAvLyBlbWJlZCBpcyBjb25zaWRlcmVkIGZvY3VzLXJlbGV2YW50IGJ1dCBub3QgZm9jdXNhYmxlXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzgyXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpKSB7XG4gICAgICAgIC8vIGFsc28gc2VlIENTUyBwcm9wZXJ0eSB1c2VyLW1vZGlmeSBiZWxvd1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnYXVkaW8nICYmXG4gICAgICAgIChzdXBwb3J0cyQxLmZvY3VzQXVkaW9XaXRob3V0Q29udHJvbHMgfHwgZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRyb2xzJykpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobm9kZU5hbWUgPT09ICd2aWRlbycgJiZcbiAgICAgICAgKHN1cHBvcnRzJDEuZm9jdXNWaWRlb1dpdGhvdXRDb250cm9scyB8fCBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udHJvbHMnKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0cyQxLmZvY3VzU3VtbWFyeSAmJiBub2RlTmFtZSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgdmFsaWRUYWJpbmRleCA9IGlzVmFsaWRUYWJpbmRleChlbGVtZW50KTtcbiAgICBpZiAobm9kZU5hbWUgPT09ICdpbWcnICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd1c2VtYXAnKSkge1xuICAgICAgICAvLyBHZWNrbywgVHJpZGVudCBhbmQgRWRnZSBkbyBub3QgYWxsb3cgYW4gaW1hZ2Ugd2l0aCBhbiBpbWFnZSBtYXAgYW5kIHRhYmluZGV4IHRvIGJlIGZvY3VzZWQsXG4gICAgICAgIC8vIGl0IGFwcGVhcnMgdGhlIHRhYmluZGV4IGlzIG92ZXJydWxlZCBzbyBmb2N1cyBpcyBzdGlsbCBmb3J3YXJkZWQgdG8gdGhlIDxtYXA+XG4gICAgICAgIHJldHVybiAoKHZhbGlkVGFiaW5kZXggJiYgc3VwcG9ydHMkMS5mb2N1c0ltZ1VzZW1hcFRhYmluZGV4KSB8fFxuICAgICAgICAgICAgc3VwcG9ydHMkMS5mb2N1c1JlZGlyZWN0SW1nVXNlbWFwKTtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnRzJDEuZm9jdXNUYWJsZSAmJiAobm9kZU5hbWUgPT09ICd0YWJsZScgfHwgbm9kZU5hbWUgPT09ICd0ZCcpKSB7XG4gICAgICAgIC8vIElFMTAtMTEgc3VwcG9ydHMuY2FuIGZvY3VzIDx0YWJsZT4gYW5kIDx0ZD5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0cyQxLmZvY3VzRmllbGRzZXQgJiYgbm9kZU5hbWUgPT09ICdmaWVsZHNldCcpIHtcbiAgICAgICAgLy8gSUUxMC0xMSBzdXBwb3J0cy5jYW4gZm9jdXMgPGZpZWxkc2V0PlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIGlzU3ZnRWxlbWVudCA9IG5vZGVOYW1lID09PSAnc3ZnJztcbiAgICB2YXIgaXNTdmdDb250ZW50ID0gZWxlbWVudC5vd25lclNWR0VsZW1lbnQ7XG4gICAgdmFyIGZvY3VzYWJsZUF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdmb2N1c2FibGUnKTtcbiAgICB2YXIgdGFiaW5kZXggPSB0YWJpbmRleFZhbHVlKGVsZW1lbnQpO1xuICAgIGlmIChub2RlTmFtZSA9PT0gJ3VzZScgJiZcbiAgICAgICAgdGFiaW5kZXggIT09IG51bGwgJiZcbiAgICAgICAgIXN1cHBvcnRzJDEuZm9jdXNTdmdVc2VUYWJpbmRleCkge1xuICAgICAgICAvLyA8dXNlPiBjYW5ub3QgYmUgbWFkZSBmb2N1c2FibGUgYnkgYWRkaW5nIGEgdGFiaW5kZXggYXR0cmlidXRlIGFueXdoZXJlIGJ1dCBCbGluayBhbmQgV2ViS2l0XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnZm9yZWlnbm9iamVjdCcpIHtcbiAgICAgICAgLy8gPHVzZT4gY2FuIG9ubHkgYmUgbWFkZSBmb2N1c2FibGUgaW4gQmxpbmsgYW5kIFdlYktpdFxuICAgICAgICByZXR1cm4gdGFiaW5kZXggIT09IG51bGwgJiYgc3VwcG9ydHMkMS5mb2N1c1N2Z0ZvcmVpZ25vYmplY3RUYWJpbmRleDtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnRNYXRjaGVzKGVsZW1lbnQsICdzdmcgYScpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd4bGluazpocmVmJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgoaXNTdmdFbGVtZW50IHx8IGlzU3ZnQ29udGVudCkgJiZcbiAgICAgICAgZWxlbWVudC5mb2N1cyAmJlxuICAgICAgICAhc3VwcG9ydHMkMS5mb2N1c1N2Z05lZ2F0aXZlVGFiaW5kZXhBdHRyaWJ1dGUgJiZcbiAgICAgICAgdGFiaW5kZXggPCAwKSB7XG4gICAgICAgIC8vIEZpcmVmb3ggNTEgYW5kIDUyIHRyZWF0IGFueSBuYXRpdmVseSB0YWJiYWJsZSBTVkcgZWxlbWVudCB3aXRoXG4gICAgICAgIC8vIHRhYmluZGV4PVwiLTFcIiBhcyB0YWJiYWJsZSBhbmQgZXZlcnl0aGluZyBlbHNlIGFzIGluZXJ0XG4gICAgICAgIC8vIHNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzAyMzQwXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGlzU3ZnRWxlbWVudCkge1xuICAgICAgICByZXR1cm4gKHZhbGlkVGFiaW5kZXggfHxcbiAgICAgICAgICAgIHN1cHBvcnRzJDEuZm9jdXNTdmcgfHxcbiAgICAgICAgICAgIHN1cHBvcnRzJDEuZm9jdXNTdmdJbklmcmFtZSB8fFxuICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgdW5kZXJzdGFuZHMgdGhlIGZvY3VzYWJsZSBhdHRyaWJ1dGUgaW50cm9kdWNlZCBpbiBTVkcgVGlueSAxLjJcbiAgICAgICAgICAgIEJvb2xlYW4oc3VwcG9ydHMkMS5mb2N1c1N2Z0ZvY3VzYWJsZUF0dHJpYnV0ZSAmJlxuICAgICAgICAgICAgICAgIGZvY3VzYWJsZUF0dHJpYnV0ZSAmJlxuICAgICAgICAgICAgICAgIGZvY3VzYWJsZUF0dHJpYnV0ZSA9PT0gJ3RydWUnKSk7XG4gICAgfVxuICAgIGlmIChpc1N2Z0NvbnRlbnQpIHtcbiAgICAgICAgaWYgKHN1cHBvcnRzJDEuZm9jdXNTdmdUYWJpbmRleEF0dHJpYnV0ZSAmJiB2YWxpZFRhYmluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcG9ydHMkMS5mb2N1c1N2Z0ZvY3VzYWJsZUF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgdW5kZXJzdGFuZHMgdGhlIGZvY3VzYWJsZSBhdHRyaWJ1dGUgaW50cm9kdWNlZCBpbiBTVkcgVGlueSAxLjJcbiAgICAgICAgICAgIHJldHVybiBmb2N1c2FibGVBdHRyaWJ1dGUgPT09ICd0cnVlJztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZWRpdGluZy5odG1sI3NlcXVlbnRpYWwtZm9jdXMtbmF2aWdhdGlvbi1hbmQtdGhlLXRhYmluZGV4LWF0dHJpYnV0ZVxuICAgIGlmICh2YWxpZFRhYmluZGV4KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTtcbiAgICBpZiAoaXNVc2VyTW9kaWZ5V3JpdGFibGUoc3R5bGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydHMkMS5mb2N1c0ltZ0lzbWFwICYmXG4gICAgICAgIG5vZGVOYW1lID09PSAnaW1nJyAmJlxuICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnaXNtYXAnKSkge1xuICAgICAgICAvLyBJRTEwLTExIGNvbnNpZGVycyB0aGUgPGltZz4gaW4gPGEgaHJlZj48aW1nIGlzbWFwPiBmb2N1c2FibGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9hbGx5LmpzL2lzc3Vlcy8yMFxuICAgICAgICB2YXIgaGFzTGlua1BhcmVudCA9IGdldFBhcmVudHMoeyBjb250ZXh0OiBlbGVtZW50IH0pLnNvbWUoZnVuY3Rpb24gKHBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2EnICYmIHBhcmVudC5oYXNBdHRyaWJ1dGUoJ2hyZWYnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaGFzTGlua1BhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9hbGx5LmpzL2lzc3Vlcy8yMVxuICAgIGlmICghZXhjZXB0LnNjcm9sbGFibGUgJiYgc3VwcG9ydHMkMS5mb2N1c1Njcm9sbENvbnRhaW5lcikge1xuICAgICAgICBpZiAoc3VwcG9ydHMkMS5mb2N1c1Njcm9sbENvbnRhaW5lcldpdGhvdXRPdmVyZmxvdykge1xuICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZG9lcyB3aWxsIGNvbnNpZGVyIHRoZSBzY3JvbGxhYmxlIGFyZWEgZm9jdXNhYmxlXG4gICAgICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyBhIDxkaXY+IG9yIGEgPHNwYW4+IGFuZCBpdCBpcyBpbiBmYWN0IHNjcm9sbGFibGUsXG4gICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBDU1Mgb3ZlcmZsb3cgcHJvcGVydHlcbiAgICAgICAgICAgIGlmIChpc1Njcm9sbGFibGVDb250YWluZXIoZWxlbWVudCwgbm9kZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaGFzQ3NzT3ZlcmZsb3dTY3JvbGwoc3R5bGUpKSB7XG4gICAgICAgICAgICAvLyBGaXJlZm94IHJlcXVpcmVzIHByb3BlciBvdmVyZmxvdyBzZXR0aW5nLCBJRSBkb2VzIG5vdCBuZWNlc3NhcmlseVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL292ZXJmbG93XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWV4Y2VwdC5mbGV4Ym94ICYmXG4gICAgICAgIHN1cHBvcnRzJDEuZm9jdXNGbGV4Ym94Q29udGFpbmVyICYmXG4gICAgICAgIGhhc0Nzc0Rpc3BsYXlGbGV4KHN0eWxlKSkge1xuICAgICAgICAvLyBlbGVtZW50cyB3aXRoIGRpc3BsYXk6ZmxleCBhcmUgZm9jdXNhYmxlIGluIElFMTAtMTFcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFleGNlcHQuc2Nyb2xsYWJsZSAmJiBwYXJlbnQpIHtcbiAgICAgICAgdmFyIHBhcmVudE5vZGVOYW1lID0gcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHZhciBwYXJlbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCwgbnVsbCk7XG4gICAgICAgIGlmIChzdXBwb3J0cyQxLmZvY3VzU2Nyb2xsQm9keSAmJlxuICAgICAgICAgICAgaXNTY3JvbGxhYmxlQ29udGFpbmVyKHBhcmVudCwgbm9kZU5hbWUsIHBhcmVudE5vZGVOYW1lLCBwYXJlbnRTdHlsZSkpIHtcbiAgICAgICAgICAgIC8vIHNjcm9sbGFibGUgYm9kaWVzIGFyZSBmb2N1c2FibGUgSW50ZXJuZXQgRXhwbG9yZXJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tZWRpYWxpemUvYWxseS5qcy9pc3N1ZXMvMjFcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoaWxkcmVuIG9mIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoIGRpc3BsYXk6ZmxleCBhcmUgZm9jdXNhYmxlIGluIElFMTAtMTFcbiAgICAgICAgaWYgKHN1cHBvcnRzJDEuZm9jdXNDaGlsZHJlbk9mRm9jdXNhYmxlRmxleGJveCkge1xuICAgICAgICAgICAgaWYgKGhhc0Nzc0Rpc3BsYXlGbGV4KHBhcmVudFN0eWxlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE5PVEU6IGVsZW1lbnRzIG1hcmtlZCBhcyBpbmVydCBhcmUgbm90IGZvY3VzYWJsZSxcbiAgICAvLyBidXQgdGhhdCBwcm9wZXJ0eSBpcyBub3QgZXhwb3NlZCB0byB0aGUgRE9NXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VkaXRpbmcuaHRtbCNpbmVydFxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIGJpbmQgZXhjZXB0aW9ucyB0byBhbiBpdGVyYXRvciBjYWxsYmFja1xuaXNGb2N1c1JlbGV2YW50UnVsZXMuZXhjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBleGNlcHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBpc0ZvY3VzUmVsZXZhbnQgPSBmdW5jdGlvbiBpc0ZvY3VzUmVsZXZhbnQoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gaXNGb2N1c1JlbGV2YW50UnVsZXMoe1xuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgIGV4Y2VwdDogZXhjZXB0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaXNGb2N1c1JlbGV2YW50LnJ1bGVzID0gaXNGb2N1c1JlbGV2YW50UnVsZXM7XG4gICAgcmV0dXJuIGlzRm9jdXNSZWxldmFudDtcbn07XG4vLyBwcm92aWRlIGlzRm9jdXNSZWxldmFudChjb250ZXh0KSBhcyBkZWZhdWx0IGl0ZXJhdG9yIGNhbGxiYWNrXG52YXIgaXNGb2N1c1JlbGV2YW50ID0gaXNGb2N1c1JlbGV2YW50UnVsZXMuZXhjZXB0KHt9KTtcbmZ1bmN0aW9uIGZpbmRJbmRleChhcnJheSwgY2FsbGJhY2spIHtcbiAgICAvLyBhdHRlbXB0IHRvIHVzZSBuYXRpdmUgb3IgcG9seWZpbGxlZCBBcnJheSNmaW5kSW5kZXggZmlyc3RcbiAgICBpZiAoYXJyYXkuZmluZEluZGV4KSB7XG4gICAgICAgIHJldHVybiBhcnJheS5maW5kSW5kZXgoY2FsbGJhY2spO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgIC8vIHNob3J0Y3V0IGlmIHRoZSBhcnJheSBpcyBlbXB0eVxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICAvLyBvdGhlcndpc2UgbG9vcCBvdmVyIGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoY2FsbGJhY2soYXJyYXlbaV0sIGksIGFycmF5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gZ2V0Q29udGVudERvY3VtZW50KG5vZGUpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyB3b3JrcyBvbiA8b2JqZWN0PiBhbmQgPGlmcmFtZT5cbiAgICAgICAgcmV0dXJuIChub2RlLmNvbnRlbnREb2N1bWVudCB8fFxuICAgICAgICAgICAgLy8gd29ya3Mgb24gPG9iamVjdD4gYW5kIDxpZnJhbWU+XG4gICAgICAgICAgICAobm9kZS5jb250ZW50V2luZG93ICYmIG5vZGUuY29udGVudFdpbmRvdy5kb2N1bWVudCkgfHxcbiAgICAgICAgICAgIC8vIHdvcmtzIG9uIDxvYmplY3Q+IGFuZCA8aWZyYW1lPiB0aGF0IGNvbnRhaW4gU1ZHXG4gICAgICAgICAgICAobm9kZS5nZXRTVkdEb2N1bWVudCAmJiBub2RlLmdldFNWR0RvY3VtZW50KCkpIHx8XG4gICAgICAgICAgICBudWxsKTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gU2VjdXJpdHlFcnJvcjogRmFpbGVkIHRvIHJlYWQgdGhlICdjb250ZW50RG9jdW1lbnQnIHByb3BlcnR5IGZyb20gJ0hUTUxPYmplY3RFbGVtZW50J1xuICAgICAgICAvLyBhbHNvIElFIG1heSB0aHJvdyBtZW1iZXIgbm90IGZvdW5kIGV4Y2VwdGlvbiBlLmcuIG9uIDxvYmplY3QgdHlwZT1cImltYWdlL3BuZ1wiPlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICAgIHZhciBfZG9jdW1lbnQgPSBnZXREb2N1bWVudChub2RlKTtcbiAgICByZXR1cm4gX2RvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbn1cbnZhciBzaGFkb3dQcmVmaXggPSB2b2lkIDA7XG5mdW5jdGlvbiBzZWxlY3RJblNoYWRvd3Moc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIHNoYWRvd1ByZWZpeCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIG9wZXJhdG9yID0gY3NzU2hhZG93UGllcmNpbmdEZWVwQ29tYmluYXRvcigpO1xuICAgICAgICBpZiAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIHNoYWRvd1ByZWZpeCA9ICcsIGh0bWwgJyArIG9wZXJhdG9yICsgJyAnO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc2hhZG93UHJlZml4KSB7XG4gICAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG4gICAgcmV0dXJuIChzZWxlY3RvciArXG4gICAgICAgIHNoYWRvd1ByZWZpeCArXG4gICAgICAgIHNlbGVjdG9yXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzKixcXHMqL2csICcsJylcbiAgICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgICAuam9pbihzaGFkb3dQcmVmaXgpKTtcbn1cbnZhciBzZWxlY3RvciA9IHZvaWQgMDtcbmZ1bmN0aW9uIGZpbmREb2N1bWVudEhvc3RFbGVtZW50KF93aW5kb3cpIHtcbiAgICBpZiAoIXNlbGVjdG9yKSB7XG4gICAgICAgIHNlbGVjdG9yID0gc2VsZWN0SW5TaGFkb3dzKCdvYmplY3QsIGlmcmFtZScpO1xuICAgIH1cbiAgICBpZiAoX3dpbmRvdy5fZnJhbWVFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIF93aW5kb3cuX2ZyYW1lRWxlbWVudDtcbiAgICB9XG4gICAgX3dpbmRvdy5fZnJhbWVFbGVtZW50ID0gbnVsbDtcbiAgICB2YXIgcG90ZW50aWFsSG9zdHMgPSBfd2luZG93LnBhcmVudC5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBbXS5zb21lLmNhbGwocG90ZW50aWFsSG9zdHMsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciBfZG9jdW1lbnQgPSBnZXRDb250ZW50RG9jdW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGlmIChfZG9jdW1lbnQgIT09IF93aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBfd2luZG93Ll9mcmFtZUVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gX3dpbmRvdy5fZnJhbWVFbGVtZW50O1xufVxuZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB2YXIgX3dpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgICBpZiAoIV93aW5kb3cucGFyZW50IHx8IF93aW5kb3cucGFyZW50ID09PSBfd2luZG93KSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBicm93c2luZyBjb250ZXh0LFxuICAgICAgICAvLyB3ZSdyZSBub3QgZ29pbmcgdG8gZ2V0IGEgZnJhbWVFbGVtZW50IGVpdGhlciB3YXlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2ZyYW1lRWxlbWVudFxuICAgICAgICAvLyBkb2VzIG5vdCB3b3JrIHdpdGhpbiA8ZW1iZWQ+IGFueXdoZXJlLCBhbmQgbm90IHdpdGhpbiBpbiA8b2JqZWN0PiBpbiBJRVxuICAgICAgICByZXR1cm4gX3dpbmRvdy5mcmFtZUVsZW1lbnQgfHwgZmluZERvY3VtZW50SG9zdEVsZW1lbnQoX3dpbmRvdyk7XG4gICAgfVxuICAgIGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9yZW5kZXJpbmcuaHRtbCNiZWluZy1yZW5kZXJlZFxuLy8gPGFyZWE+IGlzIG5vdCByZW5kZXJlZCwgYnV0IHdlICpjb25zaWRlciogaXQgdmlzaWJsZSB0byBzaW1wbGZpeSB0aGlzIGZ1bmN0aW9uJ3MgdXNhZ2VcbnZhciBub3RSZW5kZXJlZEVsZW1lbnRzUGF0dGVybiA9IC9eKGFyZWEpJC87XG5mdW5jdGlvbiBjb21wdXRlZFN0eWxlKGVsZW1lbnQsIHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpO1xufVxuZnVuY3Rpb24gbm90RGlzcGxheWVkKF9wYXRoKSB7XG4gICAgcmV0dXJuIF9wYXRoLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gZGlzcGxheTpub25lIGlzIG5vdCB2aXNpYmxlIChvcHRpbWl6ZWQgYXdheSBhdCBsYXlvdXQpXG4gICAgICAgIHJldHVybiBjb21wdXRlZFN0eWxlKGVsZW1lbnQsICdkaXNwbGF5JykgPT09ICdub25lJztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG5vdFZpc2libGUoX3BhdGgpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS11aS9ibG9iL21hc3Rlci91aS9jb3JlLmpzI0wxMDktTDExNFxuICAgIC8vIE5PVEU6IGEgbmVzdGVkIGVsZW1lbnQgY2FuIHJldmVyc2UgdmlzaWJpbGl0eTpoaWRkZW58Y29sbGFwc2UgYnkgZXhwbGljaXRseSBzZXR0aW5nIHZpc2liaWxpdHk6dmlzaWJsZVxuICAgIC8vIE5PVEU6IHZpc2liaWxpdHkgY2FuIGJlIFtcIlwiLCBcInZpc2libGVcIiwgXCJoaWRkZW5cIiwgXCJjb2xsYXBzZVwiXVxuICAgIHZhciBoaWRkZW4gPSBmaW5kSW5kZXgoX3BhdGgsIGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHZhciB2aXNpYmlsaXR5ID0gY29tcHV0ZWRTdHlsZShlbGVtZW50LCAndmlzaWJpbGl0eScpO1xuICAgICAgICByZXR1cm4gdmlzaWJpbGl0eSA9PT0gJ2hpZGRlbicgfHwgdmlzaWJpbGl0eSA9PT0gJ2NvbGxhcHNlJztcbiAgICB9KTtcbiAgICBpZiAoaGlkZGVuID09PSAtMSkge1xuICAgICAgICAvLyB0aGVyZSBpcyBubyBoaWRkZW4gZWxlbWVudFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciB2aXNpYmxlID0gZmluZEluZGV4KF9wYXRoLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gY29tcHV0ZWRTdHlsZShlbGVtZW50LCAndmlzaWJpbGl0eScpID09PSAndmlzaWJsZSc7XG4gICAgfSk7XG4gICAgaWYgKHZpc2libGUgPT09IC0xKSB7XG4gICAgICAgIC8vIHRoZXJlIGlzIG5vIHZpc2libGUgZWxlbWVudCAoYnV0IGEgaGlkZGVuIGVsZW1lbnQpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoaGlkZGVuIDwgdmlzaWJsZSkge1xuICAgICAgICAvLyB0aGVyZSBpcyBhIGhpZGRlbiBlbGVtZW50IGFuZCBpdCdzIGNsb3NlciB0aGFuIHRoZSBmaXJzdCB2aXNpYmxlIGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIHRoZXJlIG1heSBiZSBhIGhpZGRlbiBlbGVtZW50LCBidXQgdGhlIGNsb3Nlc3QgZWxlbWVudCBpcyB2aXNpYmxlXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gY29sbGFwc2VkUGFyZW50KF9wYXRoKSB7XG4gICAgdmFyIG9mZnNldCA9IDE7XG4gICAgaWYgKF9wYXRoWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5Jykge1xuICAgICAgICBvZmZzZXQgPSAyO1xuICAgIH1cbiAgICByZXR1cm4gX3BhdGguc2xpY2Uob2Zmc2V0KS5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIC8vIFwiY29udGVudCBjaGlsZHJlblwiIG9mIGEgY2xvc2VkIGRldGFpbHMgZWxlbWVudCBhcmUgbm90IHZpc2libGVcbiAgICAgICAgcmV0dXJuIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJyAmJiBlbGVtZW50Lm9wZW4gPT09IGZhbHNlKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGlzVmlzaWJsZVJ1bGVzKCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwgY29udGV4dCA9IF9yZWYuY29udGV4dCwgX3JlZiRleGNlcHQgPSBfcmVmLmV4Y2VwdCwgZXhjZXB0ID0gX3JlZiRleGNlcHQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG5vdFJlbmRlcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIGNzc0Rpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgY3NzVmlzaWJpbGl0eTogZmFsc2UsXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudDogZmFsc2UsXG4gICAgICAgICAgICBicm93c2luZ0NvbnRleHQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgOiBfcmVmJGV4Y2VwdDtcbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2lzL3Zpc2libGUnLFxuICAgICAgICByZXNvbHZlRG9jdW1lbnQ6IHRydWUsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9KTtcbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFleGNlcHQubm90UmVuZGVyZWQgJiYgbm90UmVuZGVyZWRFbGVtZW50c1BhdHRlcm4udGVzdChub2RlTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBfcGF0aCA9IGdldFBhcmVudHMoeyBjb250ZXh0OiBlbGVtZW50IH0pO1xuICAgIC8vIGluIEludGVybmV0IEV4cGxvcmVyIDxhdWRpbz4gaGFzIGEgZGVmYXVsdCBkaXNwbGF5OiBub25lLCB3aGVyZSBvdGhlcnMgaGF2ZSBkaXNwbGF5OiBpbmxpbmVcbiAgICAvLyBidXQgSUUgYWxsb3dzIGZvY3VzaW5nIDxhdWRpbyBzdHlsZT1cImRpc3BsYXk6bm9uZVwiPiwgYnV0IG5vdCA8ZGl2IGRpc3BsYXk6bm9uZT48YXVkaW8+XG4gICAgLy8gdGhpcyBpcyBpcnJlbGV2YW50IHRvIG90aGVyIGJyb3dzZXJzLCBhcyB0aGUgY29udHJvbHMgYXR0cmlidXRlIGlzIHJlcXVpcmVkIHRvIG1ha2UgPGF1ZGlvPiBmb2N1c2FibGVcbiAgICB2YXIgaXNBdWRpb1dpdGhvdXRDb250cm9scyA9IG5vZGVOYW1lID09PSAnYXVkaW8nICYmICFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udHJvbHMnKTtcbiAgICBpZiAoIWV4Y2VwdC5jc3NEaXNwbGF5ICYmXG4gICAgICAgIG5vdERpc3BsYXllZChpc0F1ZGlvV2l0aG91dENvbnRyb2xzID8gX3BhdGguc2xpY2UoMSkgOiBfcGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV4Y2VwdC5jc3NWaXNpYmlsaXR5ICYmIG5vdFZpc2libGUoX3BhdGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFleGNlcHQuZGV0YWlsc0VsZW1lbnQgJiYgY29sbGFwc2VkUGFyZW50KF9wYXRoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZXhjZXB0LmJyb3dzaW5nQ29udGV4dCkge1xuICAgICAgICAvLyBlbGVtZW50cyB3aXRoaW4gYSBicm93c2luZyBjb250ZXh0IGFyZSBhZmZlY3RlZCBieSB0aGVcbiAgICAgICAgLy8gYnJvd3NpbmcgY29udGV4dCBob3N0IGVsZW1lbnQncyB2aXNpYmlsaXR5IGFuZCB0YWJpbmRleFxuICAgICAgICB2YXIgZnJhbWVFbGVtZW50ID0gZ2V0RnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB2YXIgX2lzVmlzaWJsZSA9IGlzVmlzaWJsZVJ1bGVzLmV4Y2VwdChleGNlcHQpO1xuICAgICAgICBpZiAoZnJhbWVFbGVtZW50ICYmICFfaXNWaXNpYmxlKGZyYW1lRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vIGJpbmQgZXhjZXB0aW9ucyB0byBhbiBpdGVyYXRvciBjYWxsYmFja1xuaXNWaXNpYmxlUnVsZXMuZXhjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBleGNlcHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBpc1Zpc2libGUgPSBmdW5jdGlvbiBpc1Zpc2libGUoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gaXNWaXNpYmxlUnVsZXMoe1xuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgIGV4Y2VwdDogZXhjZXB0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaXNWaXNpYmxlLnJ1bGVzID0gaXNWaXNpYmxlUnVsZXM7XG4gICAgcmV0dXJuIGlzVmlzaWJsZTtcbn07XG4vLyBwcm92aWRlIGlzVmlzaWJsZShjb250ZXh0KSBhcyBkZWZhdWx0IGl0ZXJhdG9yIGNhbGxiYWNrXG52YXIgaXNWaXNpYmxlID0gaXNWaXNpYmxlUnVsZXMuZXhjZXB0KHt9KTtcbmZ1bmN0aW9uIGdldE1hcEJ5TmFtZShuYW1lLCBfZG9jdW1lbnQpIHtcbiAgICAvLyBhcHBhcmVudGx5IGdldEVsZW1lbnRzQnlOYW1lKCkgYWxzbyBjb25zaWRlcnMgaWQgYXR0cmlidXRlIGluIElFICYgb3BlcmFcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRG9jdW1lbnQvZ2V0RWxlbWVudHNCeU5hbWVcbiAgICB2YXIgbWFwID0gX2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21hcFtuYW1lPVwiJyArIGNzc19lc2NhcGVfMVtcImRlZmF1bHRcIl0obmFtZSkgKyAnXCJdJyk7XG4gICAgcmV0dXJuIG1hcCB8fCBudWxsO1xufVxuZnVuY3Rpb24gZ2V0SW1hZ2VPZkFyZWEoZWxlbWVudCkge1xuICAgIHZhciBtYXAgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKCFtYXAubmFtZSB8fCBtYXAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ21hcCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIE5PVEU6IGltYWdlIG1hcHMgY2FuIGFsc28gYmUgYXBwbGllZCB0byA8b2JqZWN0PiB3aXRoIGltYWdlIGNvbnRlbnQsXG4gICAgLy8gYnV0IG5vIGJyb3dzZXIgc3VwcG9ydHMgdGhpcyBhdCB0aGUgbW9tZW50XG4gICAgLy8gSFRNTDUgc3BlY2lmaWVzIEhUTUxNYXBFbGVtZW50LmltYWdlcyB0byBiZSBhbiBIVE1MQ29sbGVjdGlvbiBvZiBhbGxcbiAgICAvLyA8aW1nPiBhbmQgPG9iamVjdD4gcmVmZXJlbmNpbmcgdGhlIDxtYXA+IGVsZW1lbnQsIGJ1dCBubyBicm93c2VyIGltcGxlbWVudHMgdGhpc1xuICAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI3RoZS1tYXAtZWxlbWVudFxuICAgIC8vICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxNYXBFbGVtZW50XG4gICAgLy8gdGhlIGltYWdlIG11c3QgYmUgdmFsaWQgYW5kIGxvYWRlZCBmb3IgdGhlIG1hcCB0byB0YWtlIGVmZmVjdFxuICAgIHZhciBfZG9jdW1lbnQgPSBnZXREb2N1bWVudChlbGVtZW50KTtcbiAgICByZXR1cm4gKF9kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbWdbdXNlbWFwPVwiIycgKyBjc3NfZXNjYXBlXzFbXCJkZWZhdWx0XCJdKG1hcC5uYW1lKSArICdcIl0nKSB8fFxuICAgICAgICBudWxsKTtcbn1cbnZhciBzdXBwb3J0cyQyID0gdm9pZCAwO1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L21hcFxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2ltZyNhdHRyLXVzZW1hcFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnktdWkvYmxvYi9tYXN0ZXIvdWkvY29yZS5qcyNMODgtTDEwN1xuZnVuY3Rpb24gaXNWYWxpZEFyZWEoY29udGV4dCkge1xuICAgIGlmICghc3VwcG9ydHMkMikge1xuICAgICAgICBzdXBwb3J0cyQyID0gX3N1cHBvcnRzKCk7XG4gICAgfVxuICAgIHZhciBlbGVtZW50ID0gY29udGV4dFRvRWxlbWVudCh7XG4gICAgICAgIGxhYmVsOiAnaXMvdmFsaWQtYXJlYScsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9KTtcbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lICE9PSAnYXJlYScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgaGFzVGFiaW5kZXggPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKTtcbiAgICBpZiAoIXN1cHBvcnRzJDIuZm9jdXNBcmVhVGFiaW5kZXggJiYgaGFzVGFiaW5kZXgpIHtcbiAgICAgICAgLy8gQmxpbmsgYW5kIFdlYktpdCBkbyBub3QgY29uc2lkZXIgPGFyZWEgdGFiaW5kZXg9XCItMVwiIGhyZWY9XCIjdm9pZFwiPiBmb2N1c2FibGVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgaW1nID0gZ2V0SW1hZ2VPZkFyZWEoZWxlbWVudCk7XG4gICAgaWYgKCFpbWcgfHwgIWlzVmlzaWJsZShpbWcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gRmlyZWZveCBvbmx5IGFsbG93cyBmdWxseSBsb2FkZWQgaW1hZ2VzIHRvIHJlZmVyZW5jZSBpbWFnZSBtYXBzXG4gICAgLy8gaHR0cHM6Ly9zdGVyZW9jaHJvLm1lL2lkZWFzL2RldGVjdGluZy1icm9rZW4taW1hZ2VzLWpzXG4gICAgaWYgKCFzdXBwb3J0cyQyLmZvY3VzQnJva2VuSW1hZ2VNYXAgJiZcbiAgICAgICAgKCFpbWcuY29tcGxldGUgfHxcbiAgICAgICAgICAgICFpbWcubmF0dXJhbEhlaWdodCB8fFxuICAgICAgICAgICAgaW1nLm9mZnNldFdpZHRoIDw9IDAgfHxcbiAgICAgICAgICAgIGltZy5vZmZzZXRIZWlnaHQgPD0gMCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBGaXJlZm94IHN1cHBvcnRzLmNhbiBmb2N1cyBhcmVhIGVsZW1lbnRzIGV2ZW4gaWYgdGhleSBkb24ndCBoYXZlIGFuIGhyZWYgYXR0cmlidXRlXG4gICAgaWYgKCFzdXBwb3J0cyQyLmZvY3VzQXJlYVdpdGhvdXRIcmVmICYmICFlbGVtZW50LmhyZWYpIHtcbiAgICAgICAgLy8gSW50ZXJuZXQgZXhwbG9yZXIgc3VwcG9ydHMuY2FuIGZvY3VzIGFyZWEgZWxlbWVudHMgd2l0aG91dCBocmVmIGlmIGVpdGhlclxuICAgICAgICAvLyB0aGUgYXJlYSBlbGVtZW50IG9yIHRoZSBpbWFnZSBlbGVtZW50IGhhcyBhIHRhYmluZGV4IGF0dHJpYnV0ZVxuICAgICAgICByZXR1cm4gKChzdXBwb3J0cyQyLmZvY3VzQXJlYVRhYmluZGV4ICYmIGhhc1RhYmluZGV4KSB8fFxuICAgICAgICAgICAgKHN1cHBvcnRzJDIuZm9jdXNBcmVhSW1nVGFiaW5kZXggJiYgaW1nLmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSkpO1xuICAgIH1cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW1nI2F0dHItdXNlbWFwXG4gICAgdmFyIGNoaWxkT2ZJbnRlcmFjdGl2ZSA9IGdldFBhcmVudHMoeyBjb250ZXh0OiBpbWcgfSlcbiAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgIC5zb21lKGZ1bmN0aW9uIChfZWxlbWVudCkge1xuICAgICAgICB2YXIgbmFtZSA9IF9lbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiBuYW1lID09PSAnYnV0dG9uJyB8fCBuYW1lID09PSAnYSc7XG4gICAgfSk7XG4gICAgaWYgKGNoaWxkT2ZJbnRlcmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxudmFyIHN1cHBvcnRzJDMgPSB2b2lkIDA7XG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZGlzYWJsZWQtZWxlbWVudHMuaHRtbCNjb25jZXB0LWVsZW1lbnQtZGlzYWJsZWRcbnZhciBkaXNhYmxlZEVsZW1lbnRzUGF0dGVybiA9IHZvaWQgMDtcbnZhciBkaXNhYmxlZEVsZW1lbnRzID0ge1xuICAgIGlucHV0OiB0cnVlLFxuICAgIHNlbGVjdDogdHJ1ZSxcbiAgICB0ZXh0YXJlYTogdHJ1ZSxcbiAgICBidXR0b246IHRydWUsXG4gICAgZmllbGRzZXQ6IHRydWUsXG4gICAgZm9ybTogdHJ1ZVxufTtcbmZ1bmN0aW9uIGlzTmF0aXZlRGlzYWJsZWRTdXBwb3J0ZWQoY29udGV4dCkge1xuICAgIGlmICghc3VwcG9ydHMkMykge1xuICAgICAgICBzdXBwb3J0cyQzID0gX3N1cHBvcnRzKCk7XG4gICAgICAgIGlmIChzdXBwb3J0cyQzLmZvY3VzRmllbGRzZXREaXNhYmxlZCkge1xuICAgICAgICAgICAgZGVsZXRlIGRpc2FibGVkRWxlbWVudHMuZmllbGRzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBvcnRzJDMuZm9jdXNGb3JtRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBkaXNhYmxlZEVsZW1lbnRzLmZvcm07XG4gICAgICAgIH1cbiAgICAgICAgZGlzYWJsZWRFbGVtZW50c1BhdHRlcm4gPSBuZXcgUmVnRXhwKCdeKCcgKyBPYmplY3Qua2V5cyhkaXNhYmxlZEVsZW1lbnRzKS5qb2luKCd8JykgKyAnKSQnKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnQgPSBjb250ZXh0VG9FbGVtZW50KHtcbiAgICAgICAgbGFiZWw6ICdpcy9uYXRpdmUtZGlzYWJsZWQtc3VwcG9ydGVkJyxcbiAgICAgICAgY29udGV4dDogY29udGV4dFxuICAgIH0pO1xuICAgIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gQm9vbGVhbihkaXNhYmxlZEVsZW1lbnRzUGF0dGVybi50ZXN0KG5vZGVOYW1lKSk7XG59XG52YXIgc3VwcG9ydHMkNCA9IHZvaWQgMDtcbmZ1bmN0aW9uIGlzRGlzYWJsZWRGaWVsZHNldChlbGVtZW50KSB7XG4gICAgdmFyIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub2RlTmFtZSA9PT0gJ2ZpZWxkc2V0JyAmJiBlbGVtZW50LmRpc2FibGVkO1xufVxuZnVuY3Rpb24gaXNEaXNhYmxlZEZvcm0oZWxlbWVudCkge1xuICAgIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9kZU5hbWUgPT09ICdmb3JtJyAmJiBlbGVtZW50LmRpc2FibGVkO1xufVxuZnVuY3Rpb24gaXNEaXNhYmxlZChjb250ZXh0KSB7XG4gICAgaWYgKCFzdXBwb3J0cyQ0KSB7XG4gICAgICAgIHN1cHBvcnRzJDQgPSBfc3VwcG9ydHMoKTtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnQgPSBjb250ZXh0VG9FbGVtZW50KHtcbiAgICAgICAgbGFiZWw6ICdpcy9kaXNhYmxlZCcsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9KTtcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtYWxseS1kaXNhYmxlZCcpKSB7XG4gICAgICAgIC8vIHRyZWF0IGFsbHkncyBlbGVtZW50L2Rpc2FibGVkIGxpa2UgdGhlIERPTSBuYXRpdmUgZWxlbWVudC5kaXNhYmxlZFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCFpc05hdGl2ZURpc2FibGVkU3VwcG9ydGVkKGVsZW1lbnQpKSB7XG4gICAgICAgIC8vIG5vbi1mb3JtIGVsZW1lbnRzIGRvIG5vdCBzdXBwb3J0IHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudC5kaXNhYmxlZCkge1xuICAgICAgICAvLyB0aGUgZWxlbWVudCBpdHNlbGYgaXMgZGlzYWJsZWRcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBwYXJlbnRzID0gZ2V0UGFyZW50cyh7IGNvbnRleHQ6IGVsZW1lbnQgfSk7XG4gICAgaWYgKHBhcmVudHMuc29tZShpc0Rpc2FibGVkRmllbGRzZXQpKSB7XG4gICAgICAgIC8vIGEgcGFyZW50YWwgPGZpZWxkc2V0PiBpcyBkaXNhYmxkIGFuZCBpbmhlcml0cyB0aGUgc3RhdGUgb250byB0aGlzIGVsZW1lbnRcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghc3VwcG9ydHMkNC5mb2N1c0Zvcm1EaXNhYmxlZCAmJiBwYXJlbnRzLnNvbWUoaXNEaXNhYmxlZEZvcm0pKSB7XG4gICAgICAgIC8vIGEgcGFyZW50YWwgPGZvcm0+IGlzIGRpc2FibGQgYW5kIGluaGVyaXRzIHRoZSBzdGF0ZSBvbnRvIHRoaXMgZWxlbWVudFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNPbmx5VGFiYmFibGVSdWxlcygpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsIF9yZWYkZXhjZXB0ID0gX3JlZi5leGNlcHQsIGV4Y2VwdCA9IF9yZWYkZXhjZXB0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBvbmx5Rm9jdXNhYmxlQnJvd3NpbmdDb250ZXh0OiBmYWxzZSxcbiAgICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgOiBfcmVmJGV4Y2VwdDtcbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2lzL29ubHktdGFiYmFibGUnLFxuICAgICAgICByZXNvbHZlRG9jdW1lbnQ6IHRydWUsXG4gICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9KTtcbiAgICBpZiAoIWV4Y2VwdC52aXNpYmxlICYmICFpc1Zpc2libGUoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWV4Y2VwdC5vbmx5Rm9jdXNhYmxlQnJvd3NpbmdDb250ZXh0ICYmXG4gICAgICAgIChwbGF0Zm9ybS5pcy5HRUNLTyB8fCBwbGF0Zm9ybS5pcy5UUklERU5UIHx8IHBsYXRmb3JtLmlzLkVER0UpKSB7XG4gICAgICAgIHZhciBmcmFtZUVsZW1lbnQgPSBnZXRGcmFtZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGlmIChmcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmICh0YWJpbmRleFZhbHVlKGZyYW1lRWxlbWVudCkgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gaWZyYW1lW3RhYmluZGV4PVwiLTFcIl0gYW5kIG9iamVjdFt0YWJpbmRleD1cIi0xXCJdIGluaGVyaXQgdGhlXG4gICAgICAgICAgICAgICAgLy8gdGFiYmFibGUgZGVtb3Rpb24gb250byBlbGVtZW50cyBvZiB0aGVpciBicm93c2luZyBjb250ZXh0c1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIHRhYmluZGV4ID0gdGFiaW5kZXhWYWx1ZShlbGVtZW50KTtcbiAgICBpZiAobm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgcGxhdGZvcm0uaXMuR0VDS08pIHtcbiAgICAgICAgLy8gRmlyZWZveCBjYW5ub3QgZm9jdXMsIGJ1dCB0YWIgdG86IGxhYmVsW3RhYmluZGV4PTBdXG4gICAgICAgIHJldHVybiB0YWJpbmRleCAhPT0gbnVsbCAmJiB0YWJpbmRleCA+PSAwO1xuICAgIH1cbiAgICAvLyBTVkcgRWxlbWVudHMgd2VyZSBrZXlib2FyZCBmb2N1c2FibGUgYnV0IG5vdCBzY3JpcHQgZm9jdXNhYmxlIGJlZm9yZSBGaXJlZm94IDUxLlxuICAgIC8vIEZpcmVmb3ggNTEgYWRkZWQgdGhlIGZvY3VzIG1hbmFnZW1lbnQgRE9NIEFQSSAoLmZvY3VzIGFuZCAuYmx1cikgdG8gU1ZHRWxlbWVudCxcbiAgICAvLyBzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Nzc4NjU0XG4gICAgaWYgKHBsYXRmb3JtLmlzLkdFQ0tPICYmIGVsZW1lbnQub3duZXJTVkdFbGVtZW50ICYmICFlbGVtZW50LmZvY3VzKSB7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2EnICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd4bGluazpocmVmJykpIHtcbiAgICAgICAgICAgIC8vIGFueSBmb2N1c2FibGUgY2hpbGQgb2YgPHN2Zz4gY2Fubm90IGJlIGZvY3VzZWQsIGJ1dCB0YWJiZWQgdG9cbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybS5pcy5HRUNLTykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIGJpbmQgZXhjZXB0aW9ucyB0byBhbiBpdGVyYXRvciBjYWxsYmFja1xuaXNPbmx5VGFiYmFibGVSdWxlcy5leGNlcHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4Y2VwdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIGlzT25seVRhYmJhYmxlID0gZnVuY3Rpb24gaXNPbmx5VGFiYmFibGUoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gaXNPbmx5VGFiYmFibGVSdWxlcyh7XG4gICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgICAgICAgZXhjZXB0OiBleGNlcHRcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBpc09ubHlUYWJiYWJsZS5ydWxlcyA9IGlzT25seVRhYmJhYmxlUnVsZXM7XG4gICAgcmV0dXJuIGlzT25seVRhYmJhYmxlO1xufTtcbi8vIHByb3ZpZGUgaXNPbmx5VGFiYmFibGUoY29udGV4dCkgYXMgZGVmYXVsdCBpdGVyYXRvciBjYWxsYmFja1xudmFyIGlzT25seVRhYmJhYmxlID0gaXNPbmx5VGFiYmFibGVSdWxlcy5leGNlcHQoe30pO1xudmFyIHN1cHBvcnRzJDUgPSB2b2lkIDA7XG5mdW5jdGlvbiBpc09ubHlGb2N1c1JlbGV2YW50KGVsZW1lbnQpIHtcbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vZGVOYW1lID09PSAnZW1iZWQnIHx8IG5vZGVOYW1lID09PSAna2V5Z2VuJykge1xuICAgICAgICAvLyBlbWJlZCBpcyBjb25zaWRlcmVkIGZvY3VzLXJlbGV2YW50IGJ1dCBub3QgZm9jdXNhYmxlXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzgyXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgX3RhYmluZGV4ID0gdGFiaW5kZXhWYWx1ZShlbGVtZW50KTtcbiAgICBpZiAoZWxlbWVudC5zaGFkb3dSb290ICYmIF90YWJpbmRleCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBTaGFkb3dET00gaG9zdCBlbGVtZW50cyAqbWF5KiByZWNlaXZlIGZvY3VzXG4gICAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBjb25zaWRlcmVkIGZvY3VhYmxlXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobm9kZU5hbWUgPT09ICdsYWJlbCcpIHtcbiAgICAgICAgLy8gPGxhYmVsIHRhYmluZGV4PVwiMFwiPiBpcyBvbmx5IHRhYmJhYmxlIGluIEZpcmVmb3gsIG5vdCBzY3JpcHQtZm9jdXNhYmxlXG4gICAgICAgIC8vIHRoZXJlJ3Mgbm8gd2F5IHRvIG1ha2UgYW4gZWxlbWVudCBmb2N1c2FibGUgb3RoZXIgdGhhbiBieSBhZGRpbmcgYSB0YWJpbmRleCxcbiAgICAgICAgLy8gYW5kIGZvY3VzIGJlaGF2aW9yIG9mIHRoZSBsYWJlbCBlbGVtZW50IHNlZW1zIGhhcmQtd2lyZWQgdG8gaWdub3JlIHRhYmluZGV4XG4gICAgICAgIC8vIGluIHNvbWUgYnJvd3NlcnMgKGxpa2UgR2Vja28sIEJsaW5rIGFuZCBXZWJLaXQpXG4gICAgICAgIHJldHVybiAhc3VwcG9ydHMkNS5mb2N1c0xhYmVsVGFiaW5kZXggfHwgX3RhYmluZGV4ID09PSBudWxsO1xuICAgIH1cbiAgICBpZiAobm9kZU5hbWUgPT09ICdsZWdlbmQnKSB7XG4gICAgICAgIHJldHVybiBfdGFiaW5kZXggPT09IG51bGw7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0cyQ1LmZvY3VzU3ZnRm9jdXNhYmxlQXR0cmlidXRlICYmXG4gICAgICAgIChlbGVtZW50Lm93bmVyU1ZHRWxlbWVudCB8fCBub2RlTmFtZSA9PT0gJ3N2ZycpKSB7XG4gICAgICAgIC8vIEludGVybmV0IEV4cGxvcmVyIHVuZGVyc3RhbmRzIHRoZSBmb2N1c2FibGUgYXR0cmlidXRlIGludHJvZHVjZWQgaW4gU1ZHIFRpbnkgMS4yXG4gICAgICAgIHZhciBmb2N1c2FibGVBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJyk7XG4gICAgICAgIHJldHVybiBmb2N1c2FibGVBdHRyaWJ1dGUgJiYgZm9jdXNhYmxlQXR0cmlidXRlID09PSAnZmFsc2UnO1xuICAgIH1cbiAgICBpZiAobm9kZU5hbWUgPT09ICdpbWcnICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd1c2VtYXAnKSkge1xuICAgICAgICAvLyBHZWNrbywgVHJpZGVudCBhbmQgRWRnZSBkbyBub3QgYWxsb3cgYW4gaW1hZ2Ugd2l0aCBhbiBpbWFnZSBtYXAgYW5kIHRhYmluZGV4IHRvIGJlIGZvY3VzZWQsXG4gICAgICAgIC8vIGl0IGFwcGVhcnMgdGhlIHRhYmluZGV4IGlzIG92ZXJydWxlZCBzbyBmb2N1cyBpcyBzdGlsbCBmb3J3YXJkZWQgdG8gdGhlIDxtYXA+XG4gICAgICAgIHJldHVybiBfdGFiaW5kZXggPT09IG51bGwgfHwgIXN1cHBvcnRzJDUuZm9jdXNJbWdVc2VtYXBUYWJpbmRleDtcbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnYXJlYScpIHtcbiAgICAgICAgLy8gYWxsIDxhcmVhPnMgYXJlIGNvbnNpZGVyZWQgcmVsZXZhbnQsXG4gICAgICAgIC8vIGJ1dCBvbmx5IHRoZSB2YWxpZCA8YXJlYT5zIGFyZSBmb2N1c2FibGVcbiAgICAgICAgcmV0dXJuICFpc1ZhbGlkQXJlYShlbGVtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNGb2N1c2FibGVSdWxlcygpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsIF9yZWYkZXhjZXB0ID0gX3JlZi5leGNlcHQsIGV4Y2VwdCA9IF9yZWYkZXhjZXB0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIG9ubHlUYWJiYWJsZTogZmFsc2VcbiAgICAgICAgfVxuICAgICAgICA6IF9yZWYkZXhjZXB0O1xuICAgIGlmICghc3VwcG9ydHMkNSkge1xuICAgICAgICBzdXBwb3J0cyQ1ID0gX3N1cHBvcnRzKCk7XG4gICAgfVxuICAgIHZhciBfaXNPbmx5VGFiYmFibGUgPSBpc09ubHlUYWJiYWJsZS5ydWxlcy5leGNlcHQoe1xuICAgICAgICBvbmx5Rm9jdXNhYmxlQnJvd3NpbmdDb250ZXh0OiB0cnVlLFxuICAgICAgICB2aXNpYmxlOiBleGNlcHQudmlzaWJsZVxuICAgIH0pO1xuICAgIHZhciBlbGVtZW50ID0gY29udGV4dFRvRWxlbWVudCh7XG4gICAgICAgIGxhYmVsOiAnaXMvZm9jdXNhYmxlJyxcbiAgICAgICAgcmVzb2x2ZURvY3VtZW50OiB0cnVlLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSk7XG4gICAgdmFyIGZvY3VzUmVsZXZhbnQgPSBpc0ZvY3VzUmVsZXZhbnQucnVsZXMoe1xuICAgICAgICBjb250ZXh0OiBlbGVtZW50LFxuICAgICAgICBleGNlcHQ6IGV4Y2VwdFxuICAgIH0pO1xuICAgIGlmICghZm9jdXNSZWxldmFudCB8fCBpc09ubHlGb2N1c1JlbGV2YW50KGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFleGNlcHQuZGlzYWJsZWQgJiYgaXNEaXNhYmxlZChlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZXhjZXB0Lm9ubHlUYWJiYWJsZSAmJiBfaXNPbmx5VGFiYmFibGUoZWxlbWVudCkpIHtcbiAgICAgICAgLy8gc29tZSBlbGVtZW50cyBtYXkgYmUga2V5Ym9hcmQgZm9jdXNhYmxlLCBidXQgbm90IHNjcmlwdCBmb2N1c2FibGVcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBlbGVtZW50cyB0aGF0IGFyZSBub3QgcmVuZGVyZWQsIGNhbm5vdCBiZSBmb2N1c2VkXG4gICAgaWYgKCFleGNlcHQudmlzaWJsZSkge1xuICAgICAgICB2YXIgdmlzaWJpbGl0eU9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjb250ZXh0OiBlbGVtZW50LFxuICAgICAgICAgICAgZXhjZXB0OiB7fVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHMkNS5mb2N1c0luSGlkZGVuSWZyYW1lKSB7XG4gICAgICAgICAgICAvLyBXZWJLaXQgYW5kIEJsaW5rIGNhbiBmb2N1cyBjb250ZW50IGluIGhpZGRlbiA8aWZyYW1lPiBhbmQgPG9iamVjdD5cbiAgICAgICAgICAgIHZpc2liaWxpdHlPcHRpb25zLmV4Y2VwdC5icm93c2luZ0NvbnRleHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdXBwb3J0cyQ1LmZvY3VzT2JqZWN0U3ZnSGlkZGVuKSB7XG4gICAgICAgICAgICAvLyBCbGluayBhbGxvd3MgZm9jdXNpbmcgdGhlIG9iamVjdCBlbGVtZW50LCBldmVuIGlmIGl0IGhhcyB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgICAgICAvLyBAYnJvd3Nlci1pc3N1ZSBCbGluayBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg2MTkxXG4gICAgICAgICAgICB2YXIgX25vZGVOYW1lMiA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChfbm9kZU5hbWUyID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlPcHRpb25zLmV4Y2VwdC5jc3NWaXNpYmlsaXR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVmlzaWJsZS5ydWxlcyh2aXNpYmlsaXR5T3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgZnJhbWVFbGVtZW50ID0gZ2V0RnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChmcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF9ub2RlTmFtZSA9IGZyYW1lRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoX25vZGVOYW1lID09PSAnb2JqZWN0JyAmJiAhc3VwcG9ydHMkNS5mb2N1c0luWmVyb0RpbWVuc2lvbk9iamVjdCkge1xuICAgICAgICAgICAgaWYgKCFmcmFtZUVsZW1lbnQub2Zmc2V0V2lkdGggfHwgIWZyYW1lRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZWJLaXQgY2FuIG5vdCBmb2N1cyBjb250ZW50IGluIDxvYmplY3Q+IGlmIGl0IGRvZXNuJ3QgaGF2ZSBkaW1lbnNpb25zXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9kZU5hbWUgPT09ICdzdmcnICYmXG4gICAgICAgIHN1cHBvcnRzJDUuZm9jdXNTdmdJbklmcmFtZSAmJlxuICAgICAgICAhZnJhbWVFbGVtZW50ICYmXG4gICAgICAgIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG4vLyBiaW5kIGV4Y2VwdGlvbnMgdG8gYW4gaXRlcmF0b3IgY2FsbGJhY2tcbmlzRm9jdXNhYmxlUnVsZXMuZXhjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBleGNlcHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBpc0ZvY3VzYWJsZSA9IGZ1bmN0aW9uIGlzRm9jdXNhYmxlKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIGlzRm9jdXNhYmxlUnVsZXMoe1xuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgIGV4Y2VwdDogZXhjZXB0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaXNGb2N1c2FibGUucnVsZXMgPSBpc0ZvY3VzYWJsZVJ1bGVzO1xuICAgIHJldHVybiBpc0ZvY3VzYWJsZTtcbn07XG4vLyBwcm92aWRlIGlzRm9jdXNSZWxldmFudChjb250ZXh0KSBhcyBkZWZhdWx0IGl0ZXJhdG9yIGNhbGxiYWNrXG52YXIgaXNGb2N1c2FibGUgPSBpc0ZvY3VzYWJsZVJ1bGVzLmV4Y2VwdCh7fSk7XG5mdW5jdGlvbiBjcmVhdGVGaWx0ZXIoY29uZGl0aW9uKSB7XG4gICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlRmlsdGVyXG4gICAgdmFyIGZpbHRlciA9IGZ1bmN0aW9uIGZpbHRlcihub2RlKSB7XG4gICAgICAgIGlmIChub2RlLnNoYWRvd1Jvb3QpIHtcbiAgICAgICAgICAgIC8vIHJldHVybiBTaGFkb3dSb290IGVsZW1lbnRzIHJlZ2FyZGxlc3Mgb2YgdGhlbSBiZWluZyBmb2N1c2FibGUsXG4gICAgICAgICAgICAvLyBzbyB0aGV5IGNhbiBiZSB3YWxrZWQgcmVjdXJzaXZlbHkgbGF0ZXJcbiAgICAgICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbihub2RlKSkge1xuICAgICAgICAgICAgLy8gZmluZHMgZWxlbWVudHMgdGhhdCBjb3VsZCBoYXZlIGJlZW4gZm91bmQgYnkgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgpXG4gICAgICAgICAgICByZXR1cm4gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgIH07XG4gICAgLy8gSUUgcmVxdWlyZXMgYSBmdW5jdGlvbiwgQnJvd3NlcnMgcmVxdWlyZSB7YWNjZXB0Tm9kZTogZnVuY3Rpb259XG4gICAgLy8gc2VlIGh0dHA6Ly93d3cuYmVubmFkZWwuY29tL2Jsb2cvMjYwNy1maW5kaW5nLWh0bWwtY29tbWVudC1ub2Rlcy1pbi10aGUtZG9tLXVzaW5nLXRyZWV3YWxrZXIuaHRtXG4gICAgZmlsdGVyLmFjY2VwdE5vZGUgPSBmaWx0ZXI7XG4gICAgcmV0dXJuIGZpbHRlcjtcbn1cbnZhciBQb3NzaWJseUZvY3VzYWJsZUZpbHRlciA9IGNyZWF0ZUZpbHRlcihpc0ZvY3VzUmVsZXZhbnQpO1xuZnVuY3Rpb24gcXVlcnlGb2N1c2FibGVTdHJpY3QoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LCBjb250ZXh0ID0gX3JlZi5jb250ZXh0LCBpbmNsdWRlQ29udGV4dCA9IF9yZWYuaW5jbHVkZUNvbnRleHQsIGluY2x1ZGVPbmx5VGFiYmFibGUgPSBfcmVmLmluY2x1ZGVPbmx5VGFiYmFibGUsIHN0cmF0ZWd5ID0gX3JlZi5zdHJhdGVneTtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9XG4gICAgdmFyIF9pc0ZvY3VzYWJsZSA9IGlzRm9jdXNhYmxlLnJ1bGVzLmV4Y2VwdCh7XG4gICAgICAgIG9ubHlUYWJiYWJsZTogaW5jbHVkZU9ubHlUYWJiYWJsZVxuICAgIH0pO1xuICAgIHZhciBfZG9jdW1lbnQgPSBnZXREb2N1bWVudChjb250ZXh0KTtcbiAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2NyZWF0ZVRyZWVXYWxrZXJcbiAgICB2YXIgd2Fsa2VyID0gX2RvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoXG4gICAgLy8gcm9vdCBlbGVtZW50IHRvIHN0YXJ0IHNlYXJjaCBpblxuICAgIGNvbnRleHQsIFxuICAgIC8vIGVsZW1lbnQgdHlwZSBmaWx0ZXJcbiAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwgXG4gICAgLy8gY3VzdG9tIE5vZGVGaWx0ZXIgZmlsdGVyXG4gICAgc3RyYXRlZ3kgPT09ICdhbGwnID8gUG9zc2libHlGb2N1c2FibGVGaWx0ZXIgOiBjcmVhdGVGaWx0ZXIoX2lzRm9jdXNhYmxlKSwgXG4gICAgLy8gZGVwcmVjYXRlZCwgYnV0IElFIHJlcXVpcmVzIGl0XG4gICAgZmFsc2UpO1xuICAgIHZhciBsaXN0ID0gW107XG4gICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIGlmICh3YWxrZXIuY3VycmVudE5vZGUuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgaWYgKF9pc0ZvY3VzYWJsZSh3YWxrZXIuY3VycmVudE5vZGUpKSB7XG4gICAgICAgICAgICAgICAgbGlzdC5wdXNoKHdhbGtlci5jdXJyZW50Tm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0ID0gbGlzdC5jb25jYXQocXVlcnlGb2N1c2FibGVTdHJpY3Qoe1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHdhbGtlci5jdXJyZW50Tm9kZS5zaGFkb3dSb290LFxuICAgICAgICAgICAgICAgIGluY2x1ZGVPbmx5VGFiYmFibGU6IGluY2x1ZGVPbmx5VGFiYmFibGUsXG4gICAgICAgICAgICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsaXN0LnB1c2god2Fsa2VyLmN1cnJlbnROb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgY29udGV4dCBpZiByZXF1ZXN0ZWQgYW5kIGZvY3VzYWJsZVxuICAgIGlmIChpbmNsdWRlQ29udGV4dCkge1xuICAgICAgICBpZiAoc3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBpZiAoaXNGb2N1c1JlbGV2YW50KGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbGlzdC51bnNoaWZ0KGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKF9pc0ZvY3VzYWJsZShjb250ZXh0KSkge1xuICAgICAgICAgICAgbGlzdC51bnNoaWZ0KGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuLy8gTk9URTogdGhpcyBzZWxlY3RvciBNVVNUICpuZXZlciogYmUgdXNlZCBkaXJlY3RseSxcbnZhciBzdXBwb3J0cyQ2ID0gdm9pZCAwO1xudmFyIHNlbGVjdG9yJDEgPSB2b2lkIDA7XG5mdW5jdGlvbiBzZWxlY3RvciQyKCkge1xuICAgIGlmICghc3VwcG9ydHMkNikge1xuICAgICAgICBzdXBwb3J0cyQ2ID0gX3N1cHBvcnRzKCk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IkMSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yJDE7XG4gICAgfVxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lZGl0aW5nLmh0bWwjc2VxdWVudGlhbC1mb2N1cy1uYXZpZ2F0aW9uLWFuZC10aGUtdGFiaW5kZXgtYXR0cmlidXRlXG4gICAgc2VsZWN0b3IkMSA9XG4gICAgICAgICcnICtcbiAgICAgICAgICAgIC8vIElFMTEgc3VwcG9ydHMuY2FuIGZvY3VzIDx0YWJsZT4gYW5kIDx0ZD5cbiAgICAgICAgICAgIChzdXBwb3J0cyQ2LmZvY3VzVGFibGUgPyAndGFibGUsIHRkLCcgOiAnJykgK1xuICAgICAgICAgICAgLy8gSUUxMSBzdXBwb3J0cy5jYW4gZm9jdXMgPGZpZWxkc2V0PlxuICAgICAgICAgICAgKHN1cHBvcnRzJDYuZm9jdXNGaWVsZHNldCA/ICdmaWVsZHNldCwnIDogJycpICtcbiAgICAgICAgICAgIC8vIE5hbWVzcGFjZSBwcm9ibGVtcyBvZiBbeGxpbms6aHJlZl0gZXhwbGFpbmVkIGluIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMzA0Nzg4OC81MTUxMjRcbiAgICAgICAgICAgIC8vIHN2ZyBhWyp8aHJlZl0gZG9lcyBub3QgbWF0Y2ggaW4gSUU5LCBidXQgc2luY2Ugd2UncmUgZmlsdGVyaW5nXG4gICAgICAgICAgICAvLyB0aHJvdWdoIGlzL2ZvY3VzYWJsZSB3ZSBjYW4gaW5jbHVkZSBhbGwgPGE+IGZyb20gU1ZHXG4gICAgICAgICAgICAnc3ZnIGEsJyArXG4gICAgICAgICAgICAvLyBtYXkgYmVoYXZlIGFzICdzdmcsIHN2ZyAqLCcgaW4gY2hyb21lIGFzICpldmVyeSogc3ZnIGVsZW1lbnQgd2l0aCBhIGZvY3VzIGV2ZW50IGxpc3RlbmVyIGlzIGZvY3VzYWJsZVxuICAgICAgICAgICAgLy8gbmF2aWdhdGlvbmFsIGVsZW1lbnRzXG4gICAgICAgICAgICAnYVtocmVmXSwnICtcbiAgICAgICAgICAgIC8vIHZhbGlkaXR5IGRldGVybWluZWQgYnkgaXMvdmFsaWQtYXJlYS5qc1xuICAgICAgICAgICAgJ2FyZWFbaHJlZl0sJyArXG4gICAgICAgICAgICAvLyB2YWxpZGl0eSBkZXRlcm1pbmVkIGJ5IGlzL2Rpc2FibGVkLmpzXG4gICAgICAgICAgICAnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGJ1dHRvbiwnICtcbiAgICAgICAgICAgIC8vIGJyb3dzaW5nIGNvbnRleHQgY29udGFpbmVyc1xuICAgICAgICAgICAgJ2lmcmFtZSwgb2JqZWN0LCBlbWJlZCwnICtcbiAgICAgICAgICAgIC8vIGludGVyYWN0aXZlIGNvbnRlbnRcbiAgICAgICAgICAgICdrZXlnZW4sJyArXG4gICAgICAgICAgICAoc3VwcG9ydHMkNi5mb2N1c0F1ZGlvV2l0aG91dENvbnRyb2xzID8gJ2F1ZGlvLCcgOiAnYXVkaW9bY29udHJvbHNdLCcpICtcbiAgICAgICAgICAgIChzdXBwb3J0cyQ2LmZvY3VzVmlkZW9XaXRob3V0Q29udHJvbHMgPyAndmlkZW8sJyA6ICd2aWRlb1tjb250cm9sc10sJykgK1xuICAgICAgICAgICAgKHN1cHBvcnRzJDYuZm9jdXNTdW1tYXJ5ID8gJ3N1bW1hcnksJyA6ICcnKSArXG4gICAgICAgICAgICAvLyB2YWxpZGl0eSBkZXRlcm1pbmVkIGJ5IGlzL3ZhbGlkLXRhYmluZGV4LmpzXG4gICAgICAgICAgICAnW3RhYmluZGV4XSwnICtcbiAgICAgICAgICAgIC8vIGVkaXRpbmcgaG9zdHNcbiAgICAgICAgICAgICdbY29udGVudGVkaXRhYmxlXSc7XG4gICAgLy8gd2hlcmUgU2hhZG93RE9NIGlzIHN1cHBvcnRlZCwgd2UgYWxzbyB3YW50IHRoZSBzaGFkb3dlZCBmb2N1c2FibGUgZWxlbWVudHMgKHZpYSBcIj4+PlwiIG9yIFwiL2RlZXAvXCIpXG4gICAgc2VsZWN0b3IkMSA9IHNlbGVjdEluU2hhZG93cyhzZWxlY3RvciQxKTtcbiAgICByZXR1cm4gc2VsZWN0b3IkMTtcbn1cbmZ1bmN0aW9uIHF1ZXJ5Rm9jdXNhYmxlUXVpY2soKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LCBjb250ZXh0ID0gX3JlZi5jb250ZXh0LCBpbmNsdWRlQ29udGV4dCA9IF9yZWYuaW5jbHVkZUNvbnRleHQsIGluY2x1ZGVPbmx5VGFiYmFibGUgPSBfcmVmLmluY2x1ZGVPbmx5VGFiYmFibGU7XG4gICAgdmFyIF9zZWxlY3RvciA9IHNlbGVjdG9yJDIoKTtcbiAgICB2YXIgZWxlbWVudHMgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoX3NlbGVjdG9yKTtcbiAgICAvLyB0aGUgc2VsZWN0b3IgcG90ZW50aWFsbHkgbWF0Y2hlcyBtb3JlIHRoYW4gcmVhbGx5IGlzIGZvY3VzYWJsZVxuICAgIHZhciBfaXNGb2N1c2FibGUgPSBpc0ZvY3VzYWJsZS5ydWxlcy5leGNlcHQoe1xuICAgICAgICBvbmx5VGFiYmFibGU6IGluY2x1ZGVPbmx5VGFiYmFibGVcbiAgICB9KTtcbiAgICB2YXIgcmVzdWx0ID0gW10uZmlsdGVyLmNhbGwoZWxlbWVudHMsIF9pc0ZvY3VzYWJsZSk7XG4gICAgLy8gYWRkIGNvbnRleHQgaWYgcmVxdWVzdGVkIGFuZCBmb2N1c2FibGVcbiAgICBpZiAoaW5jbHVkZUNvbnRleHQgJiYgX2lzRm9jdXNhYmxlKGNvbnRleHQpKSB7XG4gICAgICAgIHJlc3VsdC51bnNoaWZ0KGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gcXVlcnlGb2N1c2FibGUoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LCBjb250ZXh0ID0gX3JlZi5jb250ZXh0LCBpbmNsdWRlQ29udGV4dCA9IF9yZWYuaW5jbHVkZUNvbnRleHQsIGluY2x1ZGVPbmx5VGFiYmFibGUgPSBfcmVmLmluY2x1ZGVPbmx5VGFiYmFibGUsIF9yZWYkc3RyYXRlZ3kgPSBfcmVmLnN0cmF0ZWd5LCBzdHJhdGVneSA9IF9yZWYkc3RyYXRlZ3kgPT09IHVuZGVmaW5lZCA/ICdxdWljaycgOiBfcmVmJHN0cmF0ZWd5O1xuICAgIHZhciBlbGVtZW50ID0gY29udGV4dFRvRWxlbWVudCh7XG4gICAgICAgIGxhYmVsOiAncXVlcnkvZm9jdXNhYmxlJyxcbiAgICAgICAgcmVzb2x2ZURvY3VtZW50OiB0cnVlLFxuICAgICAgICBkZWZhdWx0VG9Eb2N1bWVudDogdHJ1ZSxcbiAgICAgICAgY29udGV4dDogY29udGV4dFxuICAgIH0pO1xuICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBjb250ZXh0OiBlbGVtZW50LFxuICAgICAgICBpbmNsdWRlQ29udGV4dDogaW5jbHVkZUNvbnRleHQsXG4gICAgICAgIGluY2x1ZGVPbmx5VGFiYmFibGU6IGluY2x1ZGVPbmx5VGFiYmFibGUsXG4gICAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneVxuICAgIH07XG4gICAgaWYgKHN0cmF0ZWd5ID09PSAncXVpY2snKSB7XG4gICAgICAgIHJldHVybiBxdWVyeUZvY3VzYWJsZVF1aWNrKG9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIGlmIChzdHJhdGVneSA9PT0gJ3N0cmljdCcgfHwgc3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgIHJldHVybiBxdWVyeUZvY3VzYWJsZVN0cmljdChvcHRpb25zKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncXVlcnkvZm9jdXNhYmxlIHJlcXVpcmVzIG9wdGlvbi5zdHJhdGVneSB0byBiZSBvbmUgb2YgW1wicXVpY2tcIiwgXCJzdHJpY3RcIiwgXCJhbGxcIl0nKTtcbn1cbnZhciBzdXBwb3J0cyQ3ID0gdm9pZCAwO1xuLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTEgY29uc2lkZXJzIGZpZWxkc2V0LCB0YWJsZSwgdGQgZm9jdXNhYmxlLCBidXQgbm90IHRhYmJhYmxlXG4vLyBJbnRlcm5ldCBFeHBsb3JlciAxMSBjb25zaWRlcnMgYm9keSB0byBoYXZlIFt0YWJpbmRleD0wXSwgYnV0IGRvZXMgbm90IGFsbG93IHRhYmJpbmcgdG8gaXRcbnZhciBmb2N1c2FibGVFbGVtZW50c1BhdHRlcm4gPSAvXihmaWVsZHNldHx0YWJsZXx0ZHxib2R5KSQvO1xuZnVuY3Rpb24gaXNUYWJiYWJsZVJ1bGVzKCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwgY29udGV4dCA9IF9yZWYuY29udGV4dCwgX3JlZiRleGNlcHQgPSBfcmVmLmV4Y2VwdCwgZXhjZXB0ID0gX3JlZiRleGNlcHQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGZsZXhib3g6IGZhbHNlLFxuICAgICAgICAgICAgc2Nyb2xsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBzaGFkb3c6IGZhbHNlLFxuICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICBvbmx5VGFiYmFibGU6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgOiBfcmVmJGV4Y2VwdDtcbiAgICBpZiAoIXN1cHBvcnRzJDcpIHtcbiAgICAgICAgc3VwcG9ydHMkNyA9IF9zdXBwb3J0cygpO1xuICAgIH1cbiAgICB2YXIgZWxlbWVudCA9IGNvbnRleHRUb0VsZW1lbnQoe1xuICAgICAgICBsYWJlbDogJ2lzL3RhYmJhYmxlJyxcbiAgICAgICAgcmVzb2x2ZURvY3VtZW50OiB0cnVlLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfSk7XG4gICAgaWYgKHBsYXRmb3JtLmlzLkJMSU5LICYmIHBsYXRmb3JtLmlzLkFORFJPSUQgJiYgcGxhdGZvcm0ubWFqb3JWZXJzaW9uID4gNDIpIHtcbiAgICAgICAgLy8gRXh0ZXJuYWwga2V5Ym9hcmQgc3VwcG9ydCB3b3JrZWQgZmluZSBpbiBDSHJvbWUgNDIsIGJ1dCBzdG9wcGVkIHdvcmtpbmcgaW4gQ2hyb21lIDQ1LlxuICAgICAgICAvLyBUaGUgb24tc2NyZWVuIGtleWJvYXJkIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gZm9jdXMgdGhlIG5leHQgaW5wdXQgZWxlbWVudCAobGlrZSBpT1MgZG9lcykuXG4gICAgICAgIC8vIFRoYXQgbGVhdmVzIHVzIHdpdGggbm8gb3B0aW9uIHRvIGFkdmFuY2UgZm9jdXMgYnkga2V5Ym9hcmQsIGVyZ28gbm90aGluZyBpcyB0YWJiYWJsZSAoa2V5Ym9hcmQgZm9jdXNhYmxlKS5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZnJhbWVFbGVtZW50ID0gZ2V0RnJhbWVFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChmcmFtZUVsZW1lbnQpIHtcbiAgICAgICAgaWYgKHBsYXRmb3JtLmlzLldFQktJVCAmJiBwbGF0Zm9ybS5pcy5JT1MpIHtcbiAgICAgICAgICAgIC8vIGlPUyBvbmx5IGRvZXMgbm90IGNvbnNpZGVyIGFueXRoaW5nIGZyb20gYW5vdGhlciBicm93c2luZyBjb250ZXh0IGtleWJvYXJkIGZvY3VzYWJsZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmcmFtZVt0YWJpbmRleD1cIi0xXCJdIGFuZCBvYmplY3RbdGFiaW5kZXg9XCItMVwiXSBpbmhlcml0IHRoZVxuICAgICAgICAvLyB0YWJiYWJsZSBkZW1vdGlvbiBvbnRvIGVsZW1lbnRzIG9mIHRoZWlyIGJyb3dzaW5nIGNvbnRleHRzXG4gICAgICAgIGlmICh0YWJpbmRleFZhbHVlKGZyYW1lRWxlbWVudCkgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFleGNlcHQudmlzaWJsZSAmJlxuICAgICAgICAgICAgKHBsYXRmb3JtLmlzLkJMSU5LIHx8IHBsYXRmb3JtLmlzLldFQktJVCkgJiZcbiAgICAgICAgICAgICFpc1Zpc2libGUoZnJhbWVFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gQmxpbmsgYW5kIFdlYktpdCBjb25zaWRlciBlbGVtZW50cyBpbiBoaWRkZW4gYnJvd3NpbmcgY29udGV4dHMgZm9jdXNhYmxlLCBidXQgbm90IHRhYmJhYmxlXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2Via2l0IGFuZCBCbGluayBkb24ndCBjb25zaWRlciBhbnl0aGluZyBpbiA8b2JqZWN0PiB0YWJiYWJsZVxuICAgICAgICAvLyBCbGluayBmaXhlZCB0aGF0IGZpeGVkIGluIENocm9tZSA1NCwgT3BlcmEgNDFcbiAgICAgICAgdmFyIGZyYW1lTm9kZU5hbWUgPSBmcmFtZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGZyYW1lTm9kZU5hbWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YXIgaXNGaXhlZEJsaW5rID0gKHBsYXRmb3JtLm5hbWUgPT09ICdDaHJvbWUnICYmIHBsYXRmb3JtLm1ham9yVmVyc2lvbiA+PSA1NCkgfHxcbiAgICAgICAgICAgICAgICAocGxhdGZvcm0ubmFtZSA9PT0gJ09wZXJhJyAmJiBwbGF0Zm9ybS5tYWpvclZlcnNpb24gPj0gNDEpO1xuICAgICAgICAgICAgaWYgKHBsYXRmb3JtLmlzLldFQktJVCB8fCAocGxhdGZvcm0uaXMuQkxJTksgJiYgIWlzRml4ZWRCbGluaykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBfdGFiaW5kZXggPSB0YWJpbmRleFZhbHVlKGVsZW1lbnQpO1xuICAgIHZhciB0YWJpbmRleCA9IF90YWJpbmRleCA9PT0gbnVsbCA/IG51bGwgOiBfdGFiaW5kZXggPj0gMDtcbiAgICBpZiAocGxhdGZvcm0uaXMuRURHRSAmJlxuICAgICAgICBwbGF0Zm9ybS5tYWpvclZlcnNpb24gPj0gMTQgJiZcbiAgICAgICAgZnJhbWVFbGVtZW50ICYmXG4gICAgICAgIGVsZW1lbnQub3duZXJTVkdFbGVtZW50ICYmXG4gICAgICAgIF90YWJpbmRleCA8IDApIHtcbiAgICAgICAgLy8gRWRnZSAxNCsgY29uc2lkZXJzIDxhIHhsaW5rOmhyZWY9XCLigKZcIiB0YWJpbmRleD1cIi0xXCI+IGtleWJvYXJkIGZvY3VzYWJsZVxuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyBpbiBhIG5lc3RlZCBicm93c2luZyBjb250ZXh0XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgaGFzVGFiYmFibGVUYWJpbmRleE9yTm9uZSA9IHRhYmluZGV4ICE9PSBmYWxzZTtcbiAgICB2YXIgaGFzVGFiYmFibGVUYWJpbmRleCA9IF90YWJpbmRleCAhPT0gbnVsbCAmJiBfdGFiaW5kZXggPj0gMDtcbiAgICAvLyBOT1RFOiBGaXJlZm94IDMxIGNvbnNpZGVycyBbY29udGVudGVkaXRhYmxlXSB0byBoYXZlIFt0YWJpbmRleD0tMV0sIGJ1dCBhbGxvd3MgdGFiYmluZyB0byBpdFxuICAgIC8vIGZpeGVkIGluIEZpcmVmb3ggNDAgdGhlIGxhdGVzdCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTExODU2NTdcbiAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpKSB7XG4gICAgICAgIC8vIHRhYmJpbmcgY2FuIHN0aWxsIGJlIGRpc2FibGVkIGJ5IGV4cGxpY2l0bHkgcHJvdmlkaW5nIFt0YWJpbmRleD1cIi0xXCJdXG4gICAgICAgIHJldHVybiBoYXNUYWJiYWJsZVRhYmluZGV4T3JOb25lO1xuICAgIH1cbiAgICBpZiAoZm9jdXNhYmxlRWxlbWVudHNQYXR0ZXJuLnRlc3Qobm9kZU5hbWUpICYmIHRhYmluZGV4ICE9PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHBsYXRmb3JtLmlzLldFQktJVCAmJiBwbGF0Zm9ybS5pcy5JT1MpIHtcbiAgICAgICAgLy8gaU9TIG9ubHkgY29uc2lkZXJzIGEgaGFuZCBmdWxsIG9mIGVsZW1lbnRzIHRhYmJhYmxlIChrZXlib2FyZCBmb2N1c2FibGUpXG4gICAgICAgIC8vIHRoaXMgaG9sZHMgdHJ1ZSBldmVuIHdpdGggZXh0ZXJuYWwga2V5Ym9hcmRzXG4gICAgICAgIHZhciBwb3RlbnRpYWxseVRhYmJhYmxlID0gKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW1lbnQudHlwZSA9PT0gJ3RleHQnKSB8fFxuICAgICAgICAgICAgZWxlbWVudC50eXBlID09PSAncGFzc3dvcmQnIHx8XG4gICAgICAgICAgICBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHxcbiAgICAgICAgICAgIG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8XG4gICAgICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJyk7XG4gICAgICAgIGlmICghcG90ZW50aWFsbHlUYWJiYWJsZSkge1xuICAgICAgICAgICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgICAgICBwb3RlbnRpYWxseVRhYmJhYmxlID0gaXNVc2VyTW9kaWZ5V3JpdGFibGUoc3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcG90ZW50aWFsbHlUYWJiYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ3VzZScgJiYgX3RhYmluZGV4ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChwbGF0Zm9ybS5pcy5CTElOSyB8fFxuICAgICAgICAgICAgKHBsYXRmb3JtLmlzLldFQktJVCAmJiBwbGF0Zm9ybS5tYWpvclZlcnNpb24gPT09IDkpKSB7XG4gICAgICAgICAgICAvLyBJbiBDaHJvbWUgYW5kIFNhZmFyaSA5IHRoZSA8dXNlPiBlbGVtZW50IGlzIGtleWJvYXJkIGZvY3VzYWJsZSBldmVuIGZvciB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbGVtZW50TWF0Y2hlcyhlbGVtZW50LCAnc3ZnIGEnKSAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgneGxpbms6aHJlZicpKSB7XG4gICAgICAgIGlmIChoYXNUYWJiYWJsZVRhYmluZGV4T3JOb25lKSB7XG4gICAgICAgICAgICAvLyBpbiBUcmlkZW50IGFuZCBHZWNrbyBTVkdFbGVtZW50IGRvZXMgbm90IGhhbmRsZSB0aGUgdGFiSW5kZXggcHJvcGVydHkgcHJvcGVybHlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LmZvY3VzICYmICFzdXBwb3J0cyQ3LmZvY3VzU3ZnTmVnYXRpdmVUYWJpbmRleEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgLy8gRmlyZWZveCA1MSBhbmQgNTIgdHJlYXQgYW55IG5hdGl2ZWx5IHRhYmJhYmxlIFNWRyBlbGVtZW50IHdpdGhcbiAgICAgICAgICAgIC8vIHRhYmluZGV4PVwiLTFcIiBhcyB0YWJiYWJsZSBhbmQgZXZlcnl0aGluZyBlbHNlIGFzIGluZXJ0XG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTMwMjM0MFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAnc3ZnJyAmJlxuICAgICAgICBzdXBwb3J0cyQ3LmZvY3VzU3ZnSW5JZnJhbWUgJiZcbiAgICAgICAgaGFzVGFiYmFibGVUYWJpbmRleE9yTm9uZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBsYXRmb3JtLmlzLlRSSURFTlQgfHwgcGxhdGZvcm0uaXMuRURHRSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzdmcnKSB7XG4gICAgICAgICAgICBpZiAoc3VwcG9ydHMkNy5mb2N1c1N2Zykge1xuICAgICAgICAgICAgICAgIC8vIG9sZGVyIEludGVybmV0IEV4cGxvcmVycyBjb25zaWRlciA8c3ZnPiBrZXlib2FyZCBmb2N1c2FibGVcbiAgICAgICAgICAgICAgICAvLyB1bmxlc3MgdGhleSBoYXZlIGZvY3NhYmxlPVwiZmFsc2VcIiwgYnV0IHRoZW4gdGhleSB3b3VsZG4ndFxuICAgICAgICAgICAgICAgIC8vIGJlIGZvY3VzYWJsZSBhbmQgdGh1cyBub3QgZXZlbiByZWFjaCB0aGlzIGZpbHRlclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZWxlbWVudHMgdGhhdCBoYXZlIFtmb2N1c2FibGVdIGFyZSBhdXRvbWF0aWNhbGx5IGtleWJvYXJkIGZvY3VzYWJsZSByZWdhcmRsZXNzIG9mIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZVxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdmb2N1c2FibGUnKSB8fCBoYXNUYWJiYWJsZVRhYmluZGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50Lm93bmVyU1ZHRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRzJDcuZm9jdXNTdmdUYWJpbmRleEF0dHJpYnV0ZSAmJiBoYXNUYWJiYWJsZVRhYmluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbGVtZW50cyB0aGF0IGhhdmUgW2ZvY3VzYWJsZV0gYXJlIGF1dG9tYXRpY2FsbHkga2V5Ym9hcmQgZm9jdXNhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlbGVtZW50LnRhYkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZXhjZXB0Lm9ubHlUYWJiYWJsZSk7XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250cm9scycpKSB7XG4gICAgICAgICAgICAvLyBJbiBJbnRlcm5ldCBFeHBsb3JlciB0aGUgPGF1ZGlvPiBlbGVtZW50IGlzIGZvY3VzYWJsZSwgYnV0IG5vdCB0YWJiYWJsZSwgYW5kIHRhYkluZGV4IHByb3BlcnR5IGlzIHdyb25nXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGxhdGZvcm0uaXMuQkxJTkspIHtcbiAgICAgICAgICAgIC8vIEluIENocm9tZSA8YXVkaW8gY29udHJvbHMgdGFiaW5kZXg9XCItMVwiPiByZW1haW5zIGtleWJvYXJkIGZvY3VzYWJsZVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGVOYW1lID09PSAndmlkZW8nKSB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2NvbnRyb2xzJykpIHtcbiAgICAgICAgICAgIGlmIChwbGF0Zm9ybS5pcy5UUklERU5UIHx8IHBsYXRmb3JtLmlzLkVER0UpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBJbnRlcm5ldCBFeHBsb3JlciBhbmQgRWRnZSB0aGUgPHZpZGVvPiBlbGVtZW50IGlzIGZvY3VzYWJsZSwgYnV0IG5vdCB0YWJiYWJsZSwgYW5kIHRhYkluZGV4IHByb3BlcnR5IGlzIHdyb25nXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBsYXRmb3JtLmlzLkJMSU5LIHx8IHBsYXRmb3JtLmlzLkdFQ0tPKSB7XG4gICAgICAgICAgICAvLyBJbiBDaHJvbWUgYW5kIEZpcmVmb3ggPHZpZGVvIGNvbnRyb2xzIHRhYmluZGV4PVwiLTFcIj4gcmVtYWlucyBrZXlib2FyZCBmb2N1c2FibGVcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKHBsYXRmb3JtLmlzLkJMSU5LIHx8IHBsYXRmb3JtLmlzLldFQktJVCkge1xuICAgICAgICAgICAgLy8gSW4gYWxsIEJsaW5rIGFuZCBXZWJLaXQgYmFzZWQgYnJvd3NlcnMgPGVtYmVkPiBhbmQgPG9iamVjdD4gYXJlIG5ldmVyIGtleWJvYXJkIGZvY3VzYWJsZSwgZXZlbiB3aXRoIHRhYmluZGV4PVwiMFwiIHNldFxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlTmFtZSA9PT0gJ2lmcmFtZScpIHtcbiAgICAgICAgLy8gSW4gSW50ZXJuZXQgRXhwbG9yZXIgYWxsIGlmcmFtZXMgYXJlIG9ubHkgZm9jdXNhYmxlXG4gICAgICAgIC8vIEluIFdlYktpdCwgQmxpbmsgYW5kIEdlY2tvIGlmcmFtZXMgbWF5IGJlIHRhYmJhYmxlIGRlcGVuZGluZyBvbiBjb250ZW50LlxuICAgICAgICAvLyBTaW5jZSB3ZSBjYW4ndCByZWxpYWJseSBpbnZlc3RpZ2F0ZSBpZnJhbWUgZG9jdW1lbnRzIGJlY2F1c2Ugb2YgdGhlXG4gICAgICAgIC8vIFNhbWVPcmlnaW5Qb2xpY3ksIHdlJ3JlIGRlY2xhcmluZyBldmVyeXRoaW5nIG9ubHkgZm9jdXNhYmxlLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZXhjZXB0LnNjcm9sbGFibGUgJiYgcGxhdGZvcm0uaXMuR0VDS08pIHtcbiAgICAgICAgLy8gRmlyZWZveCBjb25zaWRlcnMgc2Nyb2xsYWJsZSBjb250YWluZXJzIGtleWJvYXJkIGZvY3VzYWJsZSxcbiAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlaXIgdGFiSW5kZXggcHJvcGVydHkgaXMgLTFcbiAgICAgICAgdmFyIF9zdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsIG51bGwpO1xuICAgICAgICBpZiAoaGFzQ3NzT3ZlcmZsb3dTY3JvbGwoX3N0eWxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGhhc1RhYmJhYmxlVGFiaW5kZXhPck5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBsYXRmb3JtLmlzLlRSSURFTlQgfHwgcGxhdGZvcm0uaXMuRURHRSkge1xuICAgICAgICAvLyBJRSBhbmQgRWRnZSBkZWdyYWRlIDxhcmVhPiB0byBzY3JpcHQgZm9jdXNhYmxlLCBpZiB0aGUgaW1hZ2VcbiAgICAgICAgLy8gdXNpbmcgdGhlIDxtYXA+IGhhcyBiZWVuIGdpdmVuIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdhcmVhJykge1xuICAgICAgICAgICAgdmFyIGltZyA9IGdldEltYWdlT2ZBcmVhKGVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKGltZyAmJiB0YWJpbmRleFZhbHVlKGltZykgPCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBfc3R5bGUyID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIGlmIChpc1VzZXJNb2RpZnlXcml0YWJsZShfc3R5bGUyKSkge1xuICAgICAgICAgICAgLy8gcHJldmVudCBiZWluZyBzd2FsbG93ZWQgYnkgdGhlIG92ZXJ6ZWFsb3VzIGlzU2Nyb2xsYWJsZUNvbnRhaW5lcigpIGJlbG93XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50YWJJbmRleCA+PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZXhjZXB0LmZsZXhib3ggJiYgaGFzQ3NzRGlzcGxheUZsZXgoX3N0eWxlMikpIHtcbiAgICAgICAgICAgIGlmIChfdGFiaW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFzVGFiYmFibGVUYWJpbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAoaXNGb2N1c1JlbGV2YW50V2l0aG91dEZsZXhib3goZWxlbWVudCkgJiZcbiAgICAgICAgICAgICAgICBpc1RhYmJhYmxlV2l0aG91dEZsZXhib3goZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElFIGNvbnNpZGVycyBzY3JvbGxhYmxlIGNvbnRhaW5lcnMgc2NyaXB0IGZvY3VzYWJsZSBvbmx5LFxuICAgICAgICAvLyBldmVuIHRob3VnaCB0aGVpciB0YWJJbmRleCBwcm9wZXJ0eSBpcyAwXG4gICAgICAgIGlmIChpc1Njcm9sbGFibGVDb250YWluZXIoZWxlbWVudCwgbm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgdmFyIHBhcmVudE5vZGVOYW1lID0gcGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB2YXIgcGFyZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQsIG51bGwpO1xuICAgICAgICAgICAgLy8gSUUgY29uc2lkZXJzIHNjcm9sbGFibGUgYm9kaWVzIHNjcmlwdCBmb2N1c2FibGUgb25seSxcbiAgICAgICAgICAgIGlmIChpc1Njcm9sbGFibGVDb250YWluZXIocGFyZW50LCBub2RlTmFtZSwgcGFyZW50Tm9kZU5hbWUsIHBhcmVudFN0eWxlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoaWxkcmVuIG9mIGZvY3VzYWJsZSBlbGVtZW50cyB3aXRoIGRpc3BsYXk6ZmxleCBhcmUgZm9jdXNhYmxlIGluIElFMTAtMTEsXG4gICAgICAgICAgICAvLyBldmVuIHRob3VnaCB0aGVpciB0YWJJbmRleCBwcm9wZXJ0eSBzdWdnZXN0cyBvdGhlcndpc2VcbiAgICAgICAgICAgIGlmIChoYXNDc3NEaXNwbGF5RmxleChwYXJlbnRTdHlsZSkpIHtcbiAgICAgICAgICAgICAgICAvLyB2YWx1ZSBvZiB0YWJpbmRleCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhhc1RhYmJhYmxlVGFiaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1dBSS9QRi9hcmlhLXByYWN0aWNlcy8jZm9jdXNfdGFiaW5kZXhcbiAgICByZXR1cm4gZWxlbWVudC50YWJJbmRleCA+PSAwO1xufVxuLy8gYmluZCBleGNlcHRpb25zIHRvIGFuIGl0ZXJhdG9yIGNhbGxiYWNrXG5pc1RhYmJhYmxlUnVsZXMuZXhjZXB0ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBleGNlcHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBpc1RhYmJhYmxlID0gZnVuY3Rpb24gaXNUYWJiYWJsZShjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiBpc1RhYmJhYmxlUnVsZXMoe1xuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgICAgIGV4Y2VwdDogZXhjZXB0XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgaXNUYWJiYWJsZS5ydWxlcyA9IGlzVGFiYmFibGVSdWxlcztcbiAgICByZXR1cm4gaXNUYWJiYWJsZTtcbn07XG52YXIgaXNGb2N1c1JlbGV2YW50V2l0aG91dEZsZXhib3ggPSBpc0ZvY3VzUmVsZXZhbnQucnVsZXMuZXhjZXB0KHtcbiAgICBmbGV4Ym94OiB0cnVlXG59KTtcbnZhciBpc1RhYmJhYmxlV2l0aG91dEZsZXhib3ggPSBpc1RhYmJhYmxlUnVsZXMuZXhjZXB0KHsgZmxleGJveDogdHJ1ZSB9KTtcbi8vIHByb3ZpZGUgaXNUYWJiYWJsZShjb250ZXh0KSBhcyBkZWZhdWx0IGl0ZXJhdG9yIGNhbGxiYWNrXG52YXIgaXNUYWJiYWJsZSA9IGlzVGFiYmFibGVSdWxlcy5leGNlcHQoe30pO1xuZnVuY3Rpb24gcXVlcnlUYWJiYWJsZSgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsIGluY2x1ZGVDb250ZXh0ID0gX3JlZi5pbmNsdWRlQ29udGV4dCwgaW5jbHVkZU9ubHlUYWJiYWJsZSA9IF9yZWYuaW5jbHVkZU9ubHlUYWJiYWJsZSwgc3RyYXRlZ3kgPSBfcmVmLnN0cmF0ZWd5O1xuICAgIHZhciBfaXNUYWJiYWJsZSA9IGlzVGFiYmFibGUucnVsZXMuZXhjZXB0KHtcbiAgICAgICAgb25seVRhYmJhYmxlOiBpbmNsdWRlT25seVRhYmJhYmxlXG4gICAgfSk7XG4gICAgcmV0dXJuIHF1ZXJ5Rm9jdXNhYmxlKHtcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgICAgaW5jbHVkZUNvbnRleHQ6IGluY2x1ZGVDb250ZXh0LFxuICAgICAgICBpbmNsdWRlT25seVRhYmJhYmxlOiBpbmNsdWRlT25seVRhYmJhYmxlLFxuICAgICAgICBzdHJhdGVneTogc3RyYXRlZ3lcbiAgICB9KS5maWx0ZXIoX2lzVGFiYmFibGUpO1xufVxuLy8gc29ydHMgYSBsaXN0IG9mIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGVpciBvcmRlciBpbiB0aGUgRE9NXG5mdW5jdGlvbiBjb21wYXJlRG9tUG9zaXRpb24oYSwgYikge1xuICAgIHJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkdcbiAgICAgICAgPyAtMVxuICAgICAgICA6IDE7XG59XG5mdW5jdGlvbiBzb3J0RG9tT3JkZXIoZWxlbWVudHMpIHtcbiAgICByZXR1cm4gZWxlbWVudHMuc29ydChjb21wYXJlRG9tUG9zaXRpb24pO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RTdWNjZXNzb3JPZmZzZXQobGlzdCwgdGFyZ2V0KSB7XG4gICAgLy8gZmluZCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGNvbWVzIEFGVEVSIHRoZSB0YXJnZXQgZWxlbWVudFxuICAgIHJldHVybiBmaW5kSW5kZXgobGlzdCwgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICh0YXJnZXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbWVudCkgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBmaW5kSW5zZXJ0aW9uT2Zmc2V0cyhsaXN0LCBlbGVtZW50cywgcmVzb2x2ZUVsZW1lbnQpIHtcbiAgICAvLyBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZSBlbGVtZW50cyBsaXN0IGRpcmVjdGx5LCByZW1lbWJlciBwb3NpdGlvbiBhbmQgbWFwXG4gICAgLy8gdG8gaW5qZWN0IGxhdGVyLCB3aGVuIHdlIGNhbiBkbyB0aGlzIG1vcmUgZWZmaWNpZW50bHlcbiAgICB2YXIgaW5zZXJ0aW9ucyA9IFtdO1xuICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIHJlcGxhY2UgPSB0cnVlO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gbGlzdC5pbmRleE9mKGVsZW1lbnQpO1xuICAgICAgICBpZiAob2Zmc2V0ID09PSAtMSkge1xuICAgICAgICAgICAgLy8gZWxlbWVudCBpcyBub3QgaW4gdGFyZ2V0IGxpc3RcbiAgICAgICAgICAgIG9mZnNldCA9IGdldEZpcnN0U3VjY2Vzc29yT2Zmc2V0KGxpc3QsIGVsZW1lbnQpO1xuICAgICAgICAgICAgcmVwbGFjZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZzZXQgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBzdWNjZXNzb3IgaW4gdGhlIHRhYnNlcXVlbmNlLFxuICAgICAgICAgICAgLy8gbWVhbmluZyB0aGUgaW1hZ2UgbXVzdCBiZSB0aGUgbGFzdCBlbGVtZW50XG4gICAgICAgICAgICBvZmZzZXQgPSBsaXN0Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbGxvdyB0aGUgY29uc3VtZXIgdG8gcmVwbGFjZSB0aGUgaW5qZWN0ZWQgZWxlbWVudFxuICAgICAgICB2YXIgaW5qZWN0aW9ucyA9IG5vZGVBcnJheShyZXNvbHZlRWxlbWVudCA/IHJlc29sdmVFbGVtZW50KGVsZW1lbnQpIDogZWxlbWVudCk7XG4gICAgICAgIGlmICghaW5qZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHdlIGNhbid0IGluamVjdCB6ZXJvIGVsZW1lbnRzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgICAgcmVwbGFjZTogcmVwbGFjZSxcbiAgICAgICAgICAgIGVsZW1lbnRzOiBpbmplY3Rpb25zXG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBpbnNlcnRpb25zO1xufVxuZnVuY3Rpb24gaW5zZXJ0RWxlbWVudHNBdE9mZnNldHMobGlzdCwgaW5zZXJ0aW9ucykge1xuICAgIC8vIHJlbWVtYmVyIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgd2UgaGF2ZSBhbHJlYWR5IGluamVjdGVkXG4gICAgLy8gc28gd2UgYWNjb3VudCBmb3IgdGhlIGNhdXNlZCBpbmRleCBvZmZzZXRcbiAgICB2YXIgaW5zZXJ0ZWQgPSAwO1xuICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGluc2VydCB0aGUgZWxlbWVudHMgaW4gc2VxdWVuY2UsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBvZmZzZXQgY29tcGVuc2F0aW9uIHdvbid0IHdvcmtcbiAgICBpbnNlcnRpb25zLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEub2Zmc2V0IC0gYi5vZmZzZXQ7XG4gICAgfSk7XG4gICAgaW5zZXJ0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gYXJyYXkuc3BsaWNlIGhhcyBhbiBhbm5veWluZyBmdW5jdGlvbiBzaWduYXR1cmUgOihcbiAgICAgICAgdmFyIHJlbW92ZSA9IGluc2VydGlvbi5yZXBsYWNlID8gMSA6IDA7XG4gICAgICAgIHZhciBhcmdzID0gW2luc2VydGlvbi5vZmZzZXQgKyBpbnNlcnRlZCwgcmVtb3ZlXS5jb25jYXQoaW5zZXJ0aW9uLmVsZW1lbnRzKTtcbiAgICAgICAgbGlzdC5zcGxpY2UuYXBwbHkobGlzdCwgYXJncyk7XG4gICAgICAgIGluc2VydGVkICs9IGluc2VydGlvbi5lbGVtZW50cy5sZW5ndGggLSByZW1vdmU7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBtZXJnZUluRG9tT3JkZXIoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LCBsaXN0ID0gX3JlZi5saXN0LCBlbGVtZW50cyA9IF9yZWYuZWxlbWVudHMsIHJlc29sdmVFbGVtZW50ID0gX3JlZi5yZXNvbHZlRWxlbWVudDtcbiAgICAvLyBvcGVyYXRlIG9uIGEgY29weSBzbyB3ZSBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGFycmF5XG4gICAgdmFyIF9saXN0ID0gbGlzdC5zbGljZSgwKTtcbiAgICAvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnRzIHdlJ3JlIGluamVjdGluZyBhcmUgcHJvdmlkZWQgaW4gRE9NIG9yZGVyXG4gICAgdmFyIF9lbGVtZW50cyA9IG5vZGVBcnJheShlbGVtZW50cykuc2xpY2UoMCk7XG4gICAgc29ydERvbU9yZGVyKF9lbGVtZW50cyk7XG4gICAgLy8gZmluZCB0aGUgb2Zmc2V0cyB3aXRoaW4gdGhlIHRhcmdldCBhcnJheSAobGlzdCkgYXQgd2hpY2ggdG8gaW5qZWN0XG4gICAgLy8gZWFjaCBpbmRpdmlkdWFsIGVsZW1lbnQgKGZyb20gZWxlbWVudHMpXG4gICAgdmFyIGluc2VydGlvbnMgPSBmaW5kSW5zZXJ0aW9uT2Zmc2V0cyhfbGlzdCwgX2VsZW1lbnRzLCByZXNvbHZlRWxlbWVudCk7XG4gICAgLy8gYWN0dWFsbHkgaW5qZWN0IHRoZSBlbGVtZW50cyBpbnRvIHRoZSB0YXJnZXQgYXJyYXkgYXQgdGhlIGlkZW50aWZpZWQgcG9zaXRpb25zXG4gICAgaW5zZXJ0RWxlbWVudHNBdE9mZnNldHMoX2xpc3QsIGluc2VydGlvbnMpO1xuICAgIHJldHVybiBfbGlzdDtcbn1cbnZhciBfY3JlYXRlQ2xhc3MgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCd2YWx1ZScgaW4gZGVzY3JpcHRvcilcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgICAgICBpZiAocHJvdG9Qcm9wcylcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgICAgICAgaWYgKHN0YXRpY1Byb3BzKVxuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgICAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gICAgfTtcbn0pKCk7XG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgfVxufVxudmFyIE1hcHMgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1hcHMoY29udGV4dCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTWFwcyk7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZ2V0RG9jdW1lbnQoY29udGV4dCk7XG4gICAgICAgIHRoaXMubWFwcyA9IHt9O1xuICAgIH1cbiAgICBfY3JlYXRlQ2xhc3MoTWFwcywgW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdnZXRBcmVhc0ZvcicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0QXJlYXNGb3IobmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tYXBzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtYXAgaXMgbm90IGRlZmluZWQgd2l0aGluIHRoZSBjb250ZXh0LCBzbyB3ZVxuICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIGdvIGZpbmQgaXQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1hcEJ5TmFtZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwc1tuYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnYWRkTWFwQnlOYW1lJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRNYXBCeU5hbWUobmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciBtYXAgPSBnZXRNYXBCeU5hbWUobmFtZSwgdGhpcy5fZG9jdW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICghbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIG1hcCwgdGhlIGltZ1t1c2VtYXBdIHdhc24ndCBkb2luZyBhbnl0aGluZyBhbnl3YXlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm1hcHNbbWFwLm5hbWVdID0gcXVlcnlUYWJiYWJsZSh7IGNvbnRleHQ6IG1hcCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnZXh0cmFjdEFyZWFzRnJvbUxpc3QnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RBcmVhc0Zyb21MaXN0KGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCA8YXJlYT4gZWxlbWVudHMgZnJvbSB0aGUgZWxlbWVudHMgbGlzdCxcbiAgICAgICAgICAgICAgICAvLyBidXQgcHV0IHRoZW0gdGhlIG1hcCBmb3IgbGF0ZXIgcmV0cmlldmFsXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSAhPT0gJ2FyZWEnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgbWFwID0gZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWFwc1ttYXAubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwc1ttYXAubmFtZV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHNbbWFwLm5hbWVdLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4gTWFwcztcbn0pKCk7XG5mdW5jdGlvbiBzb3J0QXJlYShlbGVtZW50cywgY29udGV4dCkge1xuICAgIC8vIGltYWdlcyAtIHVubGVzcyB0aGV5IGFyZSBmb2N1c2FibGUgdGhlbXNlbHZlcywgbGlrZWx5IG5vdFxuICAgIC8vIHBhcnQgb2YgdGhlIGVsZW1lbnRzIGxpc3QsIHNvIHdlJ2xsIGhhdmUgdG8gZmluZCB0aGVtIGFuZFxuICAgIC8vIHNvcnQgdGhlbSBpbnRvIHRoZSBlbGVtZW50cyBsaXN0IG1hbnVhbGx5XG4gICAgdmFyIHVzZW1hcHMgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZ1t1c2VtYXBdJyk7XG4gICAgdmFyIG1hcHMgPSBuZXcgTWFwcyhjb250ZXh0KTtcbiAgICAvLyByZW1vdmUgYWxsIDxhcmVhPiBlbGVtZW50cyBmcm9tIHRoZSBlbGVtZW50cyBsaXN0LFxuICAgIC8vIGJ1dCBwdXQgdGhlbSB0aGUgbWFwIGZvciBsYXRlciByZXRyaWV2YWxcbiAgICB2YXIgX2VsZW1lbnRzID0gbWFwcy5leHRyYWN0QXJlYXNGcm9tTGlzdChlbGVtZW50cyk7XG4gICAgaWYgKCF1c2VtYXBzLmxlbmd0aCkge1xuICAgICAgICAvLyB0aGUgY29udGV4dCBkb2VzIG5vdCBjb250YWluIGFueSA8YXJlYT5zIHNvIG5vIG5lZWRcbiAgICAgICAgLy8gdG8gcmVwbGFjZSBhbnl0aGluZywganVzdCByZW1vdmUgYW55IG1hcHNcbiAgICAgICAgcmV0dXJuIF9lbGVtZW50cztcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlSW5Eb21PcmRlcih7XG4gICAgICAgIGxpc3Q6IF9lbGVtZW50cyxcbiAgICAgICAgZWxlbWVudHM6IHVzZW1hcHMsXG4gICAgICAgIHJlc29sdmVFbGVtZW50OiBmdW5jdGlvbiByZXNvbHZlRWxlbWVudChpbWFnZSkge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBpbWFnZS5nZXRBdHRyaWJ1dGUoJ3VzZW1hcCcpLnNsaWNlKDEpO1xuICAgICAgICAgICAgcmV0dXJuIG1hcHMuZ2V0QXJlYXNGb3IobmFtZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbnZhciBfY3JlYXRlQ2xhc3MkMSA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICAgICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiBkZXNjcmlwdG9yKVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgICAgIGlmIChwcm90b1Byb3BzKVxuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgICAgICBpZiAoc3RhdGljUHJvcHMpXG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgICB9O1xufSkoKTtcbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayQxKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpO1xuICAgIH1cbn1cbnZhciBTaGFkb3dzID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBTaGFkb3dzKGNvbnRleHQsIHNvcnRFbGVtZW50cykge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2skMSh0aGlzLCBTaGFkb3dzKTtcbiAgICAgICAgLy8gZG9jdW1lbnQgY29udGV4dCB3ZSdyZSB3b3JraW5nIHdpdGhcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgLy8gY2FsbGJhY2sgdGhhdCBzb3J0cyBhbiBhcnJheSBvZiBlbGVtZW50c1xuICAgICAgICB0aGlzLnNvcnRFbGVtZW50cyA9IHNvcnRFbGVtZW50cztcbiAgICAgICAgLy8gcmVmZXJlbmNlIHRvIGNyZWF0ZSB1bmlxdWUgSURzIGZvciBlYWNoIFNoYWRvd0hvc3RcbiAgICAgICAgdGhpcy5ob3N0Q291bnRlciA9IDE7XG4gICAgICAgIC8vIHJlZmVyZW5jZSBtYXAgZm9yIGNoaWxkLVNoYWRvd0hvc3RzIG9mIGEgU2hhZG93SG9zdFxuICAgICAgICB0aGlzLmluSG9zdCA9IHt9O1xuICAgICAgICAvLyByZWZlcmVuY2UgbWFwIGZvciBjaGlsZC1TaGFkb3dIb3N0IG9mIHRoZSBkb2N1bWVudFxuICAgICAgICB0aGlzLmluRG9jdW1lbnQgPSBbXTtcbiAgICAgICAgLy8gcmVmZXJlbmNlIG1hcCBmb3IgU2hhZG93SG9zdHNcbiAgICAgICAgdGhpcy5ob3N0cyA9IHt9O1xuICAgICAgICAvLyByZWZlcmVuY2UgbWFwIGZvciB0YWJiYWJsZSBlbGVtZW50cyBvZiBhIFNoYWRvd0hvc3RcbiAgICAgICAgdGhpcy5lbGVtZW50cyA9IHt9O1xuICAgIH1cbiAgICAvLyByZW1lbWJlciB3aGljaCBob3N0cyB3ZSBoYXZlIHRvIHNvcnQgd2l0aGluIGxhdGVyXG4gICAgX2NyZWF0ZUNsYXNzJDEoU2hhZG93cywgW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdfcmVnaXN0ZXJIb3N0JyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVnaXN0ZXJIb3N0KGhvc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG9zdC5fc29ydGluZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gbWFrZSB0aGUgU2hhZG93SG9zdCBpZGVudGlmaWFibGUgKHNlZSBjbGVhbnVwKCkgZm9yIHVuZG8pXG4gICAgICAgICAgICAgICAgaG9zdC5fc29ydGluZ0lkID0gJ3NoYWRvdy0nICsgdGhpcy5ob3N0Q291bnRlcisrO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9zdHNbaG9zdC5fc29ydGluZ0lkXSA9IGhvc3Q7XG4gICAgICAgICAgICAgICAgLy8gaG9zdHMgbWF5IGNvbnRhaW4gb3RoZXIgaG9zdHNcbiAgICAgICAgICAgICAgICB2YXIgcGFyZW50SG9zdCA9IGdldFNoYWRvd0hvc3QoeyBjb250ZXh0OiBob3N0IH0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIb3N0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVySG9zdChwYXJlbnRIb3N0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJIb3N0UGFyZW50KGhvc3QsIHBhcmVudEhvc3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbkRvY3VtZW50LnB1c2goaG9zdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdfcmVnaXN0ZXJIb3N0UGFyZW50JyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfcmVnaXN0ZXJIb3N0UGFyZW50KGhvc3QsIHBhcmVudCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbkhvc3RbcGFyZW50Ll9zb3J0aW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5Ib3N0W3BhcmVudC5fc29ydGluZ0lkXSA9IFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmluSG9zdFtwYXJlbnQuX3NvcnRpbmdJZF0ucHVzaChob3N0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnX3JlZ2lzdGVyRWxlbWVudCcsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3JlZ2lzdGVyRWxlbWVudChlbGVtZW50LCBob3N0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnRzW2hvc3QuX3NvcnRpbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50c1tob3N0Ll9zb3J0aW5nSWRdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudHNbaG9zdC5fc29ydGluZ0lkXS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdleHRyYWN0RWxlbWVudHMnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGV4dHJhY3RFbGVtZW50cyhlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhvc3QgPSBnZXRTaGFkb3dIb3N0KHsgY29udGV4dDogZWxlbWVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFob3N0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3Rlckhvc3QoaG9zdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyRWxlbWVudChlbGVtZW50LCBob3N0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdzb3J0JyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzb3J0KGVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIF9lbGVtZW50cyA9IHRoaXMuX2luamVjdEhvc3RzKGVsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICBfZWxlbWVudHMgPSB0aGlzLl9yZXBsYWNlSG9zdHMoX2VsZW1lbnRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhbnVwKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9lbGVtZW50cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnX2luamVjdEhvc3RzJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfaW5qZWN0SG9zdHMoZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmhvc3RzKS5mb3JFYWNoKGZ1bmN0aW9uIChfc29ydGluZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfbGlzdCA9IHRoaXMuZWxlbWVudHNbX3NvcnRpbmdJZF07XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZWxlbWVudHMgPSB0aGlzLmluSG9zdFtfc29ydGluZ0lkXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9jb250ZXh0ID0gdGhpcy5ob3N0c1tfc29ydGluZ0lkXS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzW19zb3J0aW5nSWRdID0gdGhpcy5fbWVyZ2UoX2xpc3QsIF9lbGVtZW50cywgX2NvbnRleHQpO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZXJnZShlbGVtZW50cywgdGhpcy5pbkRvY3VtZW50LCB0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdfbWVyZ2UnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9tZXJnZShsaXN0LCBlbGVtZW50cywgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZUluRG9tT3JkZXIoe1xuICAgICAgICAgICAgICAgICAgICBsaXN0OiBsaXN0LFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zb3J0RWxlbWVudHMobWVyZ2VkLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnX3JlcGxhY2VIb3N0cycsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX3JlcGxhY2VIb3N0cyhlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZUluRG9tT3JkZXIoe1xuICAgICAgICAgICAgICAgICAgICBsaXN0OiBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IHRoaXMuaW5Eb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUVsZW1lbnQ6IHRoaXMuX3Jlc29sdmVIb3N0RWxlbWVudC5iaW5kKHRoaXMpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ19yZXNvbHZlSG9zdEVsZW1lbnQnLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIF9yZXNvbHZlSG9zdEVsZW1lbnQoaG9zdCkge1xuICAgICAgICAgICAgICAgIHZhciBtZXJnZWQgPSBtZXJnZUluRG9tT3JkZXIoe1xuICAgICAgICAgICAgICAgICAgICBsaXN0OiB0aGlzLmVsZW1lbnRzW2hvc3QuX3NvcnRpbmdJZF0sXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiB0aGlzLmluSG9zdFtob3N0Ll9zb3J0aW5nSWRdLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlRWxlbWVudDogdGhpcy5fcmVzb2x2ZUhvc3RFbGVtZW50LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB2YXIgX3RhYmluZGV4ID0gdGFiaW5kZXhWYWx1ZShob3N0KTtcbiAgICAgICAgICAgICAgICBpZiAoX3RhYmluZGV4ICE9PSBudWxsICYmIF90YWJpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbaG9zdF0uY29uY2F0KG1lcmdlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ19jbGVhbnVwJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBfY2xlYW51cCgpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhvc2UgaWRlbnRpZmVycyB3ZSBwdXQgb24gdGhlIFNoYWRvd0hvc3QgdG8gYXZvaWQgdXNpbmcgTWFwKClcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmhvc3RzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuaG9zdHNba2V5XS5fc29ydGluZ0lkO1xuICAgICAgICAgICAgICAgIH0sIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiBTaGFkb3dzO1xufSkoKTtcbmZ1bmN0aW9uIHNvcnRTaGFkb3dlZChlbGVtZW50cywgY29udGV4dCwgc29ydEVsZW1lbnRzKSB7XG4gICAgdmFyIHNoYWRvd3MgPSBuZXcgU2hhZG93cyhjb250ZXh0LCBzb3J0RWxlbWVudHMpO1xuICAgIHZhciBfZWxlbWVudHMgPSBzaGFkb3dzLmV4dHJhY3RFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgaWYgKF9lbGVtZW50cy5sZW5ndGggPT09IGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAvLyBubyBzaGFkb3dlZCBjb250ZW50IGZvdW5kLCBubyBuZWVkIHRvIGNvbnRpbnVlXG4gICAgICAgIHJldHVybiBzb3J0RWxlbWVudHMoZWxlbWVudHMpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhZG93cy5zb3J0KF9lbGVtZW50cyk7XG59XG5mdW5jdGlvbiBzb3J0VGFiaW5kZXgoZWxlbWVudHMpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSFRNTEVsZW1lbnQudGFiSW5kZXhcbiAgICAvLyBlbGVtZW50cyB3aXRoIHRhYkluZGV4IFwiMFwiIChpbmNsdWRpbmcgdGFiYmFibGVFbGVtZW50cyB3aXRob3V0IHRhYkluZGV4KSBzaG91bGQgYmUgbmF2aWdhdGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhci5cbiAgICAvLyBlbGVtZW50cyB3aXRoIGEgcG9zaXRpdmUgdGFiSW5kZXg6XG4gICAgLy8gICBFbGVtZW50cyB0aGF0IGhhdmUgaWRlbnRpY2FsIHRhYkluZGV4ZXMgc2hvdWxkIGJlIG5hdmlnYXRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuXG4gICAgLy8gICBOYXZpZ2F0aW9uIHByb2NlZWRzIGZyb20gdGhlIGxvd2VzdCB0YWJJbmRleCB0byB0aGUgaGlnaGVzdCB0YWJJbmRleC5cbiAgICAvLyBOT1RFOiBzb3J0IGltcGxlbWVudGF0aW9uIG1heSBiZSB1bnN0YWJsZSBhbmQgdGh1cyBtZXNzIHVwIERPTSBvcmRlcixcbiAgICAvLyB0aGF0J3Mgd2h5IHdlIGJ1aWxkIGEgbWFwIHRoYXQncyBiZWluZyBzb3J0ZWQgaW5zdGVhZC4gSWYgd2Ugd2VyZSBhYmxlIHRvIHJlbHlcbiAgICAvLyBvbiBhIHN0YWJsZSBzb3J0aW5nIGFsZ29yaXRobSwgc29ydFRhYmluZGV4KCkgY291bGQgYmUgYXMgc2ltcGxlIGFzXG4gICAgLy8gZWxlbWVudHMuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLnRhYkluZGV4IC0gYi50YWJJbmRleDsgfSk7XG4gICAgLy8gYXQgdGhpcyB0aW1lIENocm9tZSBkb2VzIG5vdCB1c2UgYSBzdGFibGUgc29ydGluZyBhbGdvcml0aG1cbiAgICAvLyBzZWUgaHR0cDovL2Jsb2cucm9kbmV5cmVobS5kZS9hcmNoaXZlcy8xNC1Tb3J0aW5nLVdlcmUtRG9pbmctSXQtV3JvbmcuaHRtbCNzdGFiaWxpdHlcbiAgICAvLyBOT1RFOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiBzZWVtZWQgbGlrZSBtb3JlIG92ZXJoZWFkIHRoYW4ganVzdCBzb3J0aW5nIHRoaXMgd2l0aCBidWNrZXRzXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb25cbiAgICB2YXIgbWFwID0ge307XG4gICAgdmFyIGluZGV4ZXMgPSBbXTtcbiAgICB2YXIgbm9ybWFsID0gZWxlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIC8vIGluIFRyaWRlbnQgYW5kIEdlY2tvIFNWR0VsZW1lbnQgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgdGFiSW5kZXggcHJvcGVydHlcbiAgICAgICAgdmFyIHRhYkluZGV4ID0gZWxlbWVudC50YWJJbmRleDtcbiAgICAgICAgaWYgKHRhYkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRhYkluZGV4ID0gdGFiaW5kZXhWYWx1ZShlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBleHRyYWN0IGVsZW1lbnRzIHRoYXQgZG9uJ3QgbmVlZCBzb3J0aW5nXG4gICAgICAgIGlmICh0YWJJbmRleCA8PSAwIHx8IHRhYkluZGV4ID09PSBudWxsIHx8IHRhYkluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbWFwW3RhYkluZGV4XSkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIHNvcnRhYmxlIGJ1Y2tldCBmb3IgZG9tLW9yZGVyLXByZXNlcnZhdGlvbiBvZiBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIHRhYkluZGV4XG4gICAgICAgICAgICBtYXBbdGFiSW5kZXhdID0gW107XG4gICAgICAgICAgICAvLyBtYWludGFpbiBhIGxpc3Qgb2YgdW5pcXVlIHRhYkluZGV4ZXNcbiAgICAgICAgICAgIGluZGV4ZXMucHVzaCh0YWJJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc29ydCBlbGVtZW50IGludG8gdGhlIHByb3BlciBidWNrZXRcbiAgICAgICAgbWFwW3RhYkluZGV4XS5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAvLyBlbGVtZW50IG1vdmVkIHRvIHNvcnRpbmcgbWFwLCBzbyBub3QgXCJub3JtYWxcIiBhbnltb3JlXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgICAvLyBzb3J0IHRoZSB0YWJpbmRleCBhc2NlbmRpbmcsXG4gICAgLy8gdGhlbiByZXNvbHZlIHRoZW0gdG8gdGhlaXIgYXBwcm9wcmlhdGUgYnVja2V0cyxcbiAgICAvLyB0aGVuIGZsYXR0ZW4gdGhlIGFycmF5IG9mIGFycmF5cyB0byBhbiBhcnJheVxuICAgIHZhciBfZWxlbWVudHMgPSBpbmRleGVzXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLm1hcChmdW5jdGlvbiAodGFiSW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG1hcFt0YWJJbmRleF07XG4gICAgfSlcbiAgICAgICAgLnJlZHVjZVJpZ2h0KGZ1bmN0aW9uIChwcmV2aW91cywgY3VycmVudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudC5jb25jYXQocHJldmlvdXMpO1xuICAgIH0sIG5vcm1hbCk7XG4gICAgcmV0dXJuIF9lbGVtZW50cztcbn1cbnZhciBzdXBwb3J0cyQ4ID0gdm9pZCAwO1xuZnVuY3Rpb24gbW92ZUNvbnRleHRUb0JlZ2lubmluZyhlbGVtZW50cywgY29udGV4dCkge1xuICAgIHZhciBwb3MgPSBlbGVtZW50cy5pbmRleE9mKGNvbnRleHQpO1xuICAgIGlmIChwb3MgPiAwKSB7XG4gICAgICAgIHZhciB0bXAgPSBlbGVtZW50cy5zcGxpY2UocG9zLCAxKTtcbiAgICAgICAgcmV0dXJuIHRtcC5jb25jYXQoZWxlbWVudHMpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG59XG5mdW5jdGlvbiBzb3J0RWxlbWVudHMoZWxlbWVudHMsIF9jb250ZXh0KSB7XG4gICAgaWYgKHN1cHBvcnRzJDgudGFic2VxdWVuY2VBcmVhQXRJbWdQb3NpdGlvbikge1xuICAgICAgICAvLyBTb21lIGJyb3dzZXJzIHNvcnQgPGFyZWE+IGluIERPTSBvcmRlciwgc29tZSBwbGFjZSB0aGUgPGFyZWE+c1xuICAgICAgICAvLyB3aGVyZSB0aGUgPGltZz4gcmVmZXJlY2luZyB0aGVtIHdvdWxkJ3ZlIGJlZW4gaW4gRE9NIG9yZGVyLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzVcbiAgICAgICAgZWxlbWVudHMgPSBzb3J0QXJlYShlbGVtZW50cywgX2NvbnRleHQpO1xuICAgIH1cbiAgICBlbGVtZW50cyA9IHNvcnRUYWJpbmRleChlbGVtZW50cyk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufVxuZnVuY3Rpb24gcXVlcnlUYWJzZXF1ZW5jZSgpIHtcbiAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30sIGNvbnRleHQgPSBfcmVmLmNvbnRleHQsIGluY2x1ZGVDb250ZXh0ID0gX3JlZi5pbmNsdWRlQ29udGV4dCwgaW5jbHVkZU9ubHlUYWJiYWJsZSA9IF9yZWYuaW5jbHVkZU9ubHlUYWJiYWJsZSwgc3RyYXRlZ3kgPSBfcmVmLnN0cmF0ZWd5O1xuICAgIGlmICghc3VwcG9ydHMkOCkge1xuICAgICAgICBzdXBwb3J0cyQ4ID0gX3N1cHBvcnRzKCk7XG4gICAgfVxuICAgIHZhciBfY29udGV4dCA9IG5vZGVBcnJheShjb250ZXh0KVswXSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgdmFyIGVsZW1lbnRzID0gcXVlcnlUYWJiYWJsZSh7XG4gICAgICAgIGNvbnRleHQ6IF9jb250ZXh0LFxuICAgICAgICBpbmNsdWRlQ29udGV4dDogaW5jbHVkZUNvbnRleHQsXG4gICAgICAgIGluY2x1ZGVPbmx5VGFiYmFibGU6IGluY2x1ZGVPbmx5VGFiYmFibGUsXG4gICAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneVxuICAgIH0pO1xuICAgIGlmIChkb2N1bWVudC5ib2R5LmNyZWF0ZVNoYWRvd1Jvb3QgJiYgcGxhdGZvcm0uaXMuQkxJTkspIHtcbiAgICAgICAgLy8gc29ydCB0YWJpbmRleCBsb2NhbGl6ZWQgdG8gc2hhZG93IGRvbVxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21lZGlhbGl6ZS9hbGx5LmpzL2lzc3Vlcy82XG4gICAgICAgIGVsZW1lbnRzID0gc29ydFNoYWRvd2VkKGVsZW1lbnRzLCBfY29udGV4dCwgc29ydEVsZW1lbnRzKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGVsZW1lbnRzID0gc29ydEVsZW1lbnRzKGVsZW1lbnRzLCBfY29udGV4dCk7XG4gICAgfVxuICAgIGlmIChpbmNsdWRlQ29udGV4dCkge1xuICAgICAgICAvLyBpZiB3ZSBpbmNsdWRlIHRoZSBjb250ZXh0IGl0c2VsZiwgaXQgaGFzIHRvIGJlIHRoZSBmaXJzdFxuICAgICAgICAvLyBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZVxuICAgICAgICBlbGVtZW50cyA9IG1vdmVDb250ZXh0VG9CZWdpbm5pbmcoZWxlbWVudHMsIF9jb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufVxuLy8gY29kZXMgbW9zdGx5IGNsb25lZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9rZWl0aGFtdXMvandlcnR5L2Jsb2IvbWFzdGVyL2p3ZXJ0eS5qc1xuLy8gZGVsaWJlcmF0ZWx5IG5vdCBleHBvc2luZyBjaGFyYWN0ZXJzIGxpa2UgPCwuLSMqIGJlY2F1c2UgdGhleSB2YXJ5ICp3aWxkbHkqXG4vLyBhY3Jvc3Mga2V5Ym9hcmQgbGF5b3V0cyBhbmQgbWF5IGNhdXNlIHZhcmlvdXMgcHJvYmxlbXNcbi8vIChlLmcuIFwiKlwiIGlzIFwiU2hpZnQgK1wiIG9uIGEgR2VybWFuIE1hYyBrZXlib2FyZClcbi8vIChlLmcuIFwiQFwiIGlzIFwiQWx0IExcIiBvbiBhIEdlcm1hbiBNYWMga2V5Ym9hcmQpXG52YXIga2V5Y29kZSA9IHtcbiAgICAvLyBFbGVtZW50IEZvY3VzXG4gICAgdGFiOiA5LFxuICAgIC8vIE5hdmlnYXRpb25cbiAgICBsZWZ0OiAzNyxcbiAgICB1cDogMzgsXG4gICAgcmlnaHQ6IDM5LFxuICAgIGRvd246IDQwLFxuICAgIHBhZ2VVcDogMzMsXG4gICAgJ3BhZ2UtdXAnOiAzMyxcbiAgICBwYWdlRG93bjogMzQsXG4gICAgJ3BhZ2UtZG93bic6IDM0LFxuICAgIGVuZDogMzUsXG4gICAgaG9tZTogMzYsXG4gICAgLy8gQWN0aW9uXG4gICAgZW50ZXI6IDEzLFxuICAgIGVzY2FwZTogMjcsXG4gICAgc3BhY2U6IDMyLFxuICAgIC8vIE1vZGlmaWVyXG4gICAgc2hpZnQ6IDE2LFxuICAgIGNhcHNMb2NrOiAyMCxcbiAgICAnY2Fwcy1sb2NrJzogMjAsXG4gICAgY3RybDogMTcsXG4gICAgYWx0OiAxOCxcbiAgICBtZXRhOiA5MSxcbiAgICAvLyBpbiBmaXJlZm94OiAyMjRcbiAgICAvLyBvbiBtYWMgKGNocm9tZSk6IG1ldGEtbGVmdD05MSwgbWV0YS1yaWdodD05M1xuICAgIC8vIG9uIHdpbiAoSUUxMSk6IG1ldGEtbGVmdD05MSwgbWV0YS1yaWdodD05MlxuICAgIHBhdXNlOiAxOSxcbiAgICAvLyBDb250ZW50IE1hbmlwdWxhdGlvblxuICAgIGluc2VydDogNDUsXG4gICAgXCJkZWxldGVcIjogNDYsXG4gICAgYmFja3NwYWNlOiA4LFxuICAgIC8vIHRoZSBzYW1lIGxvZ2ljYWwga2V5IG1heSBiZSBpZGVudGlmaWVkIHRocm91Z2ggZGlmZmVyZW50IGtleUNvZGVzXG4gICAgX2FsaWFzOiB7XG4gICAgICAgIDkxOiBbOTIsIDkzLCAyMjRdXG4gICAgfVxufTtcbi8vIEZ1bmN0aW9uIGtleXMgKDExMiAtIDEzNylcbi8vIE5PVEU6IG5vdCBldmVyeSBrZXlib2FyZCBrbm93cyBGMTMrXG5mb3IgKHZhciBuID0gMTsgbiA8IDI2OyBuKyspIHtcbiAgICBrZXljb2RlWydmJyArIG5dID0gbiArIDExMTtcbn1cbi8vIE51bWJlciBrZXlzICg0OC01NywgbnVtcGFkIDk2LTEwNSlcbi8vIE5PVEU6IG5vdCBldmVyeSBrZXlib2FyZCBrbm93cyBudW0tMCtcbmZvciAodmFyIF9uID0gMDsgX24gPCAxMDsgX24rKykge1xuICAgIHZhciBjb2RlID0gX24gKyA0ODtcbiAgICB2YXIgbnVtQ29kZSA9IF9uICsgOTY7XG4gICAga2V5Y29kZVtfbl0gPSBjb2RlO1xuICAgIGtleWNvZGVbJ251bS0nICsgX25dID0gbnVtQ29kZTtcbiAgICBrZXljb2RlLl9hbGlhc1tjb2RlXSA9IFtudW1Db2RlXTtcbn1cbi8vIExhdGluIGNoYXJhY3RlcnMgKDY1IC0gOTApXG5mb3IgKHZhciBfbjIgPSAwOyBfbjIgPCAyNjsgX24yKyspIHtcbiAgICB2YXIgX2NvZGUgPSBfbjIgKyA2NTtcbiAgICB2YXIgbmFtZSQxID0gU3RyaW5nLmZyb21DaGFyQ29kZShfY29kZSkudG9Mb3dlckNhc2UoKTtcbiAgICBrZXljb2RlW25hbWUkMV0gPSBfY29kZTtcbn1cbnZhciBtb2RpZmllciA9IHtcbiAgICBhbHQ6ICdhbHRLZXknLFxuICAgIGN0cmw6ICdjdHJsS2V5JyxcbiAgICBtZXRhOiAnbWV0YUtleScsXG4gICAgc2hpZnQ6ICdzaGlmdEtleSdcbn07XG52YXIgbW9kaWZpZXJTZXF1ZW5jZSA9IE9iamVjdC5rZXlzKG1vZGlmaWVyKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gbW9kaWZpZXJbbmFtZV07XG59KTtcbmZ1bmN0aW9uIGNyZWF0ZUV4cGVjdGVkTW9kaWZpZXJzKGlnbm9yZU1vZGlmaWVycykge1xuICAgIHZhciB2YWx1ZSA9IGlnbm9yZU1vZGlmaWVycyA/IG51bGwgOiBmYWxzZTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhbHRLZXk6IHZhbHVlLFxuICAgICAgICBjdHJsS2V5OiB2YWx1ZSxcbiAgICAgICAgbWV0YUtleTogdmFsdWUsXG4gICAgICAgIHNoaWZ0S2V5OiB2YWx1ZVxuICAgIH07XG59XG5mdW5jdGlvbiByZXNvbHZlTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAgIHZhciBpZ25vcmVNb2RpZmllcnMgPSBtb2RpZmllcnMuaW5kZXhPZignKicpICE9PSAtMTtcbiAgICB2YXIgZXhwZWN0ZWQgPSBjcmVhdGVFeHBlY3RlZE1vZGlmaWVycyhpZ25vcmVNb2RpZmllcnMpO1xuICAgIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uICh0b2tlbikge1xuICAgICAgICBpZiAodG9rZW4gPT09ICcqJykge1xuICAgICAgICAgICAgLy8gd2UndmUgYWxyZWFkeSBjb3ZlcmVkIHRoZSBhbGwtaW4gb3BlcmF0b3JcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSB3YW50IHRoZSBtb2RpZmllciBwcmVzc2VkXG4gICAgICAgIHZhciB2YWx1ZSA9IHRydWU7XG4gICAgICAgIHZhciBvcGVyYXRvciA9IHRva2VuLnNsaWNlKDAsIDEpO1xuICAgICAgICBpZiAob3BlcmF0b3IgPT09ICc/Jykge1xuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY2FyZSBpZiB0aGUgbW9kaWZpZXIgaXMgcHJlc3NlZFxuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSAnIScpIHtcbiAgICAgICAgICAgIC8vIHdlIGRvIG5vdCB3YW50IHRoZSBtb2RpZmllciBwcmVzc2VkXG4gICAgICAgICAgICB2YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgLy8gY29tcGVuc2F0ZSBmb3IgdGhlIG1vZGlmaWVyJ3Mgb3BlcmF0b3JcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IG1vZGlmaWVyW3Rva2VuXTtcbiAgICAgICAgaWYgKCFwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgXCInICsgdG9rZW4gKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgICBleHBlY3RlZFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV4cGVjdGVkO1xufVxuZnVuY3Rpb24gcmVzb2x2ZUtleShrZXkpIHtcbiAgICB2YXIgY29kZSA9IGtleWNvZGVba2V5XSB8fCBwYXJzZUludChrZXksIDEwKTtcbiAgICBpZiAoIWNvZGUgfHwgdHlwZW9mIGNvZGUgIT09ICdudW1iZXInIHx8IGlzTmFOKGNvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24ga2V5IFwiJyArIGtleSArICdcIicpO1xuICAgIH1cbiAgICByZXR1cm4gW2NvZGVdLmNvbmNhdChrZXljb2RlLl9hbGlhc1tjb2RlXSB8fCBbXSk7XG59XG5mdW5jdGlvbiBtYXRjaE1vZGlmaWVycyhleHBlY3RlZCwgZXZlbnQpIHtcbiAgICAvLyByZXR1cm5zIHRydWUgb24gbWF0Y2hcbiAgICByZXR1cm4gIW1vZGlmaWVyU2VxdWVuY2Uuc29tZShmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAvLyByZXR1cm5zIHRydWUgb24gbWlzbWF0Y2hcbiAgICAgICAgcmV0dXJuICh0eXBlb2YgZXhwZWN0ZWRbcHJvcF0gPT09ICdib29sZWFuJyAmJlxuICAgICAgICAgICAgQm9vbGVhbihldmVudFtwcm9wXSkgIT09IGV4cGVjdGVkW3Byb3BdKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGtleUJpbmRpbmcodGV4dCkge1xuICAgIHJldHVybiB0ZXh0LnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uIChfdGV4dCkge1xuICAgICAgICB2YXIgdG9rZW5zID0gX3RleHQuc3BsaXQoJysnKTtcbiAgICAgICAgdmFyIF9tb2RpZmllcnMgPSByZXNvbHZlTW9kaWZpZXJzKHRva2Vucy5zbGljZSgwLCAtMSkpO1xuICAgICAgICB2YXIgX2tleUNvZGVzID0gcmVzb2x2ZUtleSh0b2tlbnMuc2xpY2UoLTEpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGtleUNvZGVzOiBfa2V5Q29kZXMsXG4gICAgICAgICAgICBtb2RpZmllcnM6IF9tb2RpZmllcnMsXG4gICAgICAgICAgICBtYXRjaE1vZGlmaWVyczogbWF0Y2hNb2RpZmllcnMuYmluZChudWxsLCBfbW9kaWZpZXJzKVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuLy8gTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiBpcyBhdmFpbGFibGUgc2luY2UgSUU5XG4vLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb25cbi8vIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSB3aGVuIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IHBhcmVudCBvciBpcyB0aGUgcGFyZW50IHN1aXRlZCBmb3IgdXNlIHdpdGggQXJyYXkuc29tZSgpXG4vKlxuICBVU0FHRTpcbiAgICB2YXIgaXNDaGlsZE9mID0gZ2V0UGFyZW50Q29tcGFyYXRvcih7cGFyZW50OiBzb21lTm9kZX0pO1xuICAgIGxpc3RPZkVsZW1lbnRzLnNvbWUoaXNDaGlsZE9mKVxuKi9cbmZ1bmN0aW9uIGdldFBhcmVudENvbXBhcmF0b3IoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LCBwYXJlbnQgPSBfcmVmLnBhcmVudCwgZWxlbWVudCA9IF9yZWYuZWxlbWVudCwgaW5jbHVkZVNlbGYgPSBfcmVmLmluY2x1ZGVTZWxmO1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlzQ2hpbGRPZihub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbigoaW5jbHVkZVNlbGYgJiYgbm9kZSA9PT0gcGFyZW50KSB8fFxuICAgICAgICAgICAgICAgIHBhcmVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmXG4gICAgICAgICAgICAgICAgICAgIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZWxlbWVudCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gaXNQYXJlbnRPZihub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gQm9vbGVhbigoaW5jbHVkZVNlbGYgJiYgZWxlbWVudCA9PT0gbm9kZSkgfHxcbiAgICAgICAgICAgICAgICBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW1lbnQpICZcbiAgICAgICAgICAgICAgICAgICAgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd1dGlsL2NvbXBhcmUtcG9zaXRpb24jZ2V0UGFyZW50Q29tcGFyYXRvciByZXF1aXJlZCBlaXRoZXIgb3B0aW9ucy5wYXJlbnQgb3Igb3B0aW9ucy5lbGVtZW50Jyk7XG59XG4vLyBCdWcgMjg2OTMzIC0gS2V5IGV2ZW50cyBpbiB0aGUgYXV0b2NvbXBsZXRlIHBvcHVwIHNob3VsZCBiZSBoaWRkZW4gZnJvbSBwYWdlIHNjcmlwdHNcbi8vIEBicm93c2VyLWlzc3VlIEdlY2tvIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTI4NjkzM1xuZnVuY3Rpb24gd2hlbktleSgpIHtcbiAgICB2YXIgbWFwID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgYmluZGluZ3MgPSB7fTtcbiAgICB2YXIgY29udGV4dCA9IG5vZGVBcnJheShtYXAuY29udGV4dClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGRlbGV0ZSBtYXAuY29udGV4dDtcbiAgICB2YXIgZmlsdGVyID0gbm9kZUFycmF5KG1hcC5maWx0ZXIpO1xuICAgIGRlbGV0ZSBtYXAuZmlsdGVyO1xuICAgIHZhciBtYXBLZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICBpZiAoIW1hcEtleXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3doZW4va2V5IHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBvcHRpb24ga2V5Jyk7XG4gICAgfVxuICAgIHZhciByZWdpc3RlckJpbmRpbmcgPSBmdW5jdGlvbiByZWdpc3RlckJpbmRpbmcoZXZlbnQpIHtcbiAgICAgICAgZXZlbnQua2V5Q29kZXMuZm9yRWFjaChmdW5jdGlvbiAoY29kZSkge1xuICAgICAgICAgICAgaWYgKCFiaW5kaW5nc1tjb2RlXSkge1xuICAgICAgICAgICAgICAgIGJpbmRpbmdzW2NvZGVdID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiaW5kaW5nc1tjb2RlXS5wdXNoKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBtYXBLZXlzLmZvckVhY2goZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXBbdGV4dF0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3doZW4va2V5IHJlcXVpcmVzIG9wdGlvbltcIicgKyB0ZXh0ICsgJ1wiXSB0byBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFkZENhbGxiYWNrID0gZnVuY3Rpb24gYWRkQ2FsbGJhY2soZXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50LmNhbGxiYWNrID0gbWFwW3RleHRdO1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9O1xuICAgICAgICBrZXlCaW5kaW5nKHRleHQpLm1hcChhZGRDYWxsYmFjaykuZm9yRWFjaChyZWdpc3RlckJpbmRpbmcpO1xuICAgIH0pO1xuICAgIHZhciBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgZWxlbWVudHMgd2l0aGluIHRoZSBleGVtcHRlZCBzdWItdHJlZXNcbiAgICAgICAgICAgIHZhciBpc1BhcmVudE9mRWxlbWVudCA9IGdldFBhcmVudENvbXBhcmF0b3Ioe1xuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGV2ZW50LnRhcmdldCxcbiAgICAgICAgICAgICAgICBpbmNsdWRlU2VsZjogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZmlsdGVyLnNvbWUoaXNQYXJlbnRPZkVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHZhciBrZXkgPSBldmVudC5rZXlDb2RlIHx8IGV2ZW50LndoaWNoO1xuICAgICAgICBpZiAoIWJpbmRpbmdzW2tleV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBiaW5kaW5nc1trZXldLmZvckVhY2goZnVuY3Rpb24gKF9ldmVudCkge1xuICAgICAgICAgICAgaWYgKCFfZXZlbnQubWF0Y2hNb2RpZmllcnMoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2V2ZW50LmNhbGxiYWNrLmNhbGwoY29udGV4dCwgZXZlbnQsIGRpc2VuZ2FnZSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29udGV4dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93biwgZmFsc2UpO1xuICAgIHZhciBkaXNlbmdhZ2UgPSBmdW5jdGlvbiBkaXNlbmdhZ2UoKSB7XG4gICAgICAgIGNvbnRleHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24sIGZhbHNlKTtcbiAgICB9O1xuICAgIHJldHVybiB7IGRpc2VuZ2FnZTogZGlzZW5nYWdlIH07XG59XG5mdW5jdGlvbiBkZWZhdWx0XzEoX2EpIHtcbiAgICB2YXIgY29udGV4dCA9IChfYSA9PT0gdm9pZCAwID8ge30gOiBfYSkuY29udGV4dDtcbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9XG4gICAgLy8gTWFrZSBzdXJlIHRoZSBzdXBwb3J0cyB0ZXN0cyBhcmUgcnVuIGJlZm9yZSBpbnRlcmNlcHRpbmcgdGhlIFRhYiBrZXksXG4gICAgLy8gb3IgSUUxMCBhbmQgSUUxMSB3aWxsIGZhaWwgdG8gcHJvY2VzcyB0aGUgZmlyc3QgVGFiIGtleSBldmVudC4gTm90XG4gICAgLy8gbGltaXRpbmcgdGhpcyB3YXJtLXVwIHRvIElFIGJlY2F1c2UgaXQgbWF5IGJlIGEgcHJvYmxlbSBlbHNld2hlcmUsIHRvby5cbiAgICBxdWVyeVRhYnNlcXVlbmNlKCk7XG4gICAgcmV0dXJuIHdoZW5LZXkoe1xuICAgICAgICAvLyBTYWZhcmkgb24gT1NYIG1heSByZXF1aXJlIEFMVCtUQUIgdG8gcmVhY2ggbGlua3MsXG4gICAgICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL2FsbHkuanMvaXNzdWVzLzE0NlxuICAgICAgICAnP2FsdCs/c2hpZnQrdGFiJzogZnVuY3Rpb24gYWx0U2hpZnRUYWIoZXZlbnQpIHtcbiAgICAgICAgICAgIC8vIHdlJ3JlIGNvbXBsZXRlbHkgdGFraW5nIG92ZXIgdGhlIFRhYiBrZXkgaGFuZGxpbmdcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgc2VxdWVuY2UgPSBxdWVyeVRhYnNlcXVlbmNlKHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBiYWNrd2FyZCA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICAgICAgdmFyIGZpcnN0ID0gc2VxdWVuY2VbMF07XG4gICAgICAgICAgICB2YXIgbGFzdCA9IHNlcXVlbmNlW3NlcXVlbmNlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgLy8gd3JhcCBhcm91bmQgZmlyc3QgdG8gbGFzdCwgbGFzdCB0byBmaXJzdFxuICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGJhY2t3YXJkID8gZmlyc3QgOiBsYXN0O1xuICAgICAgICAgICAgdmFyIHRhcmdldCA9IGJhY2t3YXJkID8gbGFzdCA6IGZpcnN0O1xuICAgICAgICAgICAgaWYgKGlzQWN0aXZlRWxlbWVudChzb3VyY2UpKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZmluZCBjdXJyZW50IHBvc2l0aW9uIGluIHRhYnNlcXVlbmNlXG4gICAgICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIGZvdW5kID0gc2VxdWVuY2Uuc29tZShmdW5jdGlvbiAoZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWN0aXZlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVkaXJlY3QgdG8gZmlyc3QgYXMgd2UncmUgbm90IGluIG91ciB0YWJzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGZpcnN0LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gc2hpZnQgZm9jdXMgdG8gcHJldmlvdXMvbmV4dCBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZVxuICAgICAgICAgICAgdmFyIG9mZnNldCA9IGJhY2t3YXJkID8gLTEgOiAxO1xuICAgICAgICAgICAgc2VxdWVuY2VbY3VycmVudEluZGV4ICsgb2Zmc2V0XS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGRlZmF1bHRfMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW50YWluLS10YWItZm9jdXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3QgPSAodGhpcyAmJiB0aGlzLl9fbWFrZVRlbXBsYXRlT2JqZWN0KSB8fCBmdW5jdGlvbiAoY29va2VkLCByYXcpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICAgIHJldHVybiBjb29rZWQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBub29wX3RlbXBsYXRlXzEgPSByZXF1aXJlKFwiLi4vLi4vaGVscGVycy9ub29wLXRlbXBsYXRlXCIpO1xudmFyIHN0eWxlcyA9IG5vb3BfdGVtcGxhdGVfMS5ub29wKHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbXCJcXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctb3ZlcmxheV0ge1xcbiAgICBwb3NpdGlvbjogZml4ZWQ7XFxuICAgIHRvcDogMDtcXG4gICAgcmlnaHQ6IDA7XFxuICAgIGJvdHRvbTogMDtcXG4gICAgbGVmdDogMDtcXG4gICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgIHotaW5kZXg6IDkwMDA7XFxuXFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgcGFkZGluZzogMTB2aCAxNXB4IDA7XFxuICB9XFxuXFxuICBAbWVkaWEgKG1heC1oZWlnaHQ6IDgxMnB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy1kaWFsb2ctb3ZlcmxheV0ge1xcbiAgICAgIHBhZGRpbmc6IDE1cHggMTVweCAwO1xcbiAgICB9XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWJhY2tkcm9wXSB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgdG9wOiAwO1xcbiAgICByaWdodDogMDtcXG4gICAgYm90dG9tOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE3LCAxNywgMTcsIDAuMik7XFxuICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7XFxuICAgIHotaW5kZXg6IC0xO1xcbiAgfVxcblxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1iYWNrZHJvcC1maXhlZF0ge1xcbiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xcbiAgICAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xcbiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoOHB4KTtcXG4gIH1cXG5cIl0sIFtcIlxcbiAgW2RhdGEtbmV4dGpzLWRpYWxvZy1vdmVybGF5XSB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgdG9wOiAwO1xcbiAgICByaWdodDogMDtcXG4gICAgYm90dG9tOiAwO1xcbiAgICBsZWZ0OiAwO1xcbiAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgei1pbmRleDogOTAwMDtcXG5cXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBwYWRkaW5nOiAxMHZoIDE1cHggMDtcXG4gIH1cXG5cXG4gIEBtZWRpYSAobWF4LWhlaWdodDogODEycHgpIHtcXG4gICAgW2RhdGEtbmV4dGpzLWRpYWxvZy1vdmVybGF5XSB7XFxuICAgICAgcGFkZGluZzogMTVweCAxNXB4IDA7XFxuICAgIH1cXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1kaWFsb2ctYmFja2Ryb3BdIHtcXG4gICAgcG9zaXRpb246IGZpeGVkO1xcbiAgICB0b3A6IDA7XFxuICAgIHJpZ2h0OiAwO1xcbiAgICBib3R0b206IDA7XFxuICAgIGxlZnQ6IDA7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTcsIDE3LCAxNywgMC4yKTtcXG4gICAgcG9pbnRlci1ldmVudHM6IGFsbDtcXG4gICAgei1pbmRleDogLTE7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtZGlhbG9nLWJhY2tkcm9wLWZpeGVkXSB7XFxuICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XFxuICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDhweCk7XFxuICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig4cHgpO1xcbiAgfVxcblwiXSkpKTtcbmV4cG9ydHMuc3R5bGVzID0gc3R5bGVzO1xudmFyIHRlbXBsYXRlT2JqZWN0XzE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHlsZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19yZWFkID0gKHRoaXMgJiYgdGhpcy5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIFJlYWN0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgcmVhY3RfZG9tXzEgPSByZXF1aXJlKFwicmVhY3QtZG9tXCIpO1xuZXhwb3J0cy5TaGFkb3dQb3J0YWwgPSBmdW5jdGlvbiBQb3J0YWwoX2EpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBfYS5jaGlsZHJlbjtcbiAgICB2YXIgbW91bnROb2RlID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBwb3J0YWxOb2RlID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBzaGFkb3dOb2RlID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIHZhciBfYiA9IF9fcmVhZChSZWFjdC51c2VTdGF0ZSgpLCAyKSwgZm9yY2VVcGRhdGUgPSBfYlsxXTtcbiAgICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb3duZXJEb2N1bWVudCA9IG1vdW50Tm9kZS5jdXJyZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIHBvcnRhbE5vZGUuY3VycmVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbmV4dGpzLXBvcnRhbCcpO1xuICAgICAgICBzaGFkb3dOb2RlLmN1cnJlbnQgPSBwb3J0YWxOb2RlLmN1cnJlbnQuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgICAgICBvd25lckRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9ydGFsTm9kZS5jdXJyZW50KTtcbiAgICAgICAgZm9yY2VVcGRhdGUoe30pO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHBvcnRhbE5vZGUuY3VycmVudCAmJiBwb3J0YWxOb2RlLmN1cnJlbnQub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgICAgIHBvcnRhbE5vZGUuY3VycmVudC5vd25lckRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocG9ydGFsTm9kZS5jdXJyZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHNoYWRvd05vZGUuY3VycmVudCA/IChyZWFjdF9kb21fMS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHNoYWRvd05vZGUuY3VycmVudCkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHsgcmVmOiBtb3VudE5vZGUgfSkpO1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNoYWRvd1BvcnRhbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIGFuc2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImFuc2VyXCIpKTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xuZXhwb3J0cy5UZXJtaW5hbCA9IGZ1bmN0aW9uIFRlcm1pbmFsKF9hKSB7XG4gICAgdmFyIGNvbnRlbnQgPSBfYS5jb250ZW50O1xuICAgIHZhciBkZWNvZGVkID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhbnNlcl8xW1wiZGVmYXVsdFwiXS5hbnNpVG9Kc29uKGNvbnRlbnQsIHtcbiAgICAgICAgICAgIGpzb246IHRydWUsXG4gICAgICAgICAgICB1c2VfY2xhc3NlczogdHJ1ZSxcbiAgICAgICAgICAgIHJlbW92ZV9lbXB0eTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LCBbY29udGVudF0pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IFwiZGF0YS1uZXh0anMtdGVybWluYWxcIjogdHJ1ZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicHJlXCIsIG51bGwsIGRlY29kZWQubWFwKGZ1bmN0aW9uIChlbnRyeSwgaW5kZXgpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7IGtleTogXCJ0ZXJtaW5hbC1lbnRyeS1cIiArIGluZGV4LCBzdHlsZTogX19hc3NpZ24oeyBjb2xvcjogZW50cnkuZmcgPyBcInZhcigtLWNvbG9yLVwiICsgZW50cnkuZmcgKyBcIilcIiA6IHVuZGVmaW5lZCB9LCAoZW50cnkuZGVjb3JhdGlvbiA9PT0gJ2JvbGQnXG4gICAgICAgICAgICAgICAgPyB7IGZvbnRXZWlnaHQ6IDgwMCB9XG4gICAgICAgICAgICAgICAgOiBlbnRyeS5kZWNvcmF0aW9uID09PSAnaXRhbGljJ1xuICAgICAgICAgICAgICAgICAgICA/IHsgZm9udFN0eWxlOiAnaXRhbGljJyB9XG4gICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkKSkgfSwgZW50cnkuY29udGVudCkpOyB9KSkpKTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1UZXJtaW5hbC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgVGVybWluYWxfMSA9IHJlcXVpcmUoXCIuL1Rlcm1pbmFsXCIpO1xuZXhwb3J0cy5UZXJtaW5hbCA9IFRlcm1pbmFsXzEuVGVybWluYWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdCA9ICh0aGlzICYmIHRoaXMuX19tYWtlVGVtcGxhdGVPYmplY3QpIHx8IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gICAgcmV0dXJuIGNvb2tlZDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIG5vb3BfdGVtcGxhdGVfMSA9IHJlcXVpcmUoXCIuLi8uLi9oZWxwZXJzL25vb3AtdGVtcGxhdGVcIik7XG52YXIgc3R5bGVzID0gbm9vcF90ZW1wbGF0ZV8xLm5vb3AodGVtcGxhdGVPYmplY3RfMSB8fCAodGVtcGxhdGVPYmplY3RfMSA9IF9fbWFrZVRlbXBsYXRlT2JqZWN0KFtcIlxcbiAgW2RhdGEtbmV4dGpzLXRlcm1pbmFsXSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLWJnKTtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktZmcpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLXRlcm1pbmFsXTo6c2VsZWN0aW9uLFxcbiAgW2RhdGEtbmV4dGpzLXRlcm1pbmFsXSAqOjpzZWxlY3Rpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLXNlbGVjdGlvbik7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtdGVybWluYWxdICoge1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXN0YWNrLW1vbm9zcGFjZSk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtdGVybWluYWxdID4gKiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogY2FsYyh2YXIoLS1zaXplLWdhcCkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSlcXG4gICAgICBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSk7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtdGVybWluYWxdIHByZSB7XFxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcXG4gIH1cXG5cIl0sIFtcIlxcbiAgW2RhdGEtbmV4dGpzLXRlcm1pbmFsXSB7XFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLWJnKTtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktZmcpO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLXRlcm1pbmFsXTo6c2VsZWN0aW9uLFxcbiAgW2RhdGEtbmV4dGpzLXRlcm1pbmFsXSAqOjpzZWxlY3Rpb24ge1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLXNlbGVjdGlvbik7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtdGVybWluYWxdICoge1xcbiAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXN0YWNrLW1vbm9zcGFjZSk7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtdGVybWluYWxdID4gKiB7XFxuICAgIG1hcmdpbjogMDtcXG4gICAgcGFkZGluZzogY2FsYyh2YXIoLS1zaXplLWdhcCkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSlcXG4gICAgICBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSk7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtdGVybWluYWxdIHByZSB7XFxuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcXG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcXG4gIH1cXG5cIl0pKSk7XG5leHBvcnRzLnN0eWxlcyA9IHN0eWxlcztcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xuZXhwb3J0cy5Ub2FzdCA9IGZ1bmN0aW9uIFRvYXN0KF9hKSB7XG4gICAgdmFyIG9uQ2xpY2sgPSBfYS5vbkNsaWNrLCBjaGlsZHJlbiA9IF9hLmNoaWxkcmVuLCBjbGFzc05hbWUgPSBfYS5jbGFzc05hbWU7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgXCJkYXRhLW5leHRqcy10b2FzdFwiOiB0cnVlLCBvbkNsaWNrOiBvbkNsaWNrLCBjbGFzc05hbWU6IGNsYXNzTmFtZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHsgXCJkYXRhLW5leHRqcy10b2FzdC13cmFwcGVyXCI6IHRydWUgfSwgY2hpbGRyZW4pKSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VG9hc3QuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHN0eWxlc18xID0gcmVxdWlyZShcIi4vc3R5bGVzXCIpO1xuZXhwb3J0cy5zdHlsZXMgPSBzdHlsZXNfMS5zdHlsZXM7XG52YXIgVG9hc3RfMSA9IHJlcXVpcmUoXCIuL1RvYXN0XCIpO1xuZXhwb3J0cy5Ub2FzdCA9IFRvYXN0XzEuVG9hc3Q7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdCA9ICh0aGlzICYmIHRoaXMuX19tYWtlVGVtcGxhdGVPYmplY3QpIHx8IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gICAgcmV0dXJuIGNvb2tlZDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIG5vb3BfdGVtcGxhdGVfMSA9IHJlcXVpcmUoXCIuLi8uLi9oZWxwZXJzL25vb3AtdGVtcGxhdGVcIik7XG52YXIgc3R5bGVzID0gbm9vcF90ZW1wbGF0ZV8xLm5vb3AodGVtcGxhdGVPYmplY3RfMSB8fCAodGVtcGxhdGVPYmplY3RfMSA9IF9fbWFrZVRlbXBsYXRlT2JqZWN0KFtcIlxcbiAgW2RhdGEtbmV4dGpzLXRvYXN0XSB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiB2YXIoLS1zaXplLWdhcC1kb3VibGUpO1xcbiAgICBsZWZ0OiB2YXIoLS1zaXplLWdhcC1kb3VibGUpO1xcbiAgICBtYXgtd2lkdGg6IDQyMHB4O1xcbiAgICB6LWluZGV4OiA5MDAwO1xcbiAgfVxcblxcbiAgQG1lZGlhIChtYXgtd2lkdGg6IDQ0MHB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy10b2FzdF0ge1xcbiAgICAgIG1heC13aWR0aDogOTB2dztcXG4gICAgICBsZWZ0OiA1dnc7XFxuICAgIH1cXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy10b2FzdC13cmFwcGVyXSB7XFxuICAgIHBhZGRpbmc6IDE2cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYW5zaS1icmlnaHQtd2hpdGUpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLXJlZCk7XFxuICAgIGJveC1zaGFkb3c6IDBweCB2YXIoLS1zaXplLWdhcC1kb3VibGUpIHZhcigtLXNpemUtZ2FwLXF1YWQpXFxuICAgICAgcmdiYSgwLCAwLCAwLCAwLjI1KTtcXG4gIH1cXG5cIl0sIFtcIlxcbiAgW2RhdGEtbmV4dGpzLXRvYXN0XSB7XFxuICAgIHBvc2l0aW9uOiBmaXhlZDtcXG4gICAgYm90dG9tOiB2YXIoLS1zaXplLWdhcC1kb3VibGUpO1xcbiAgICBsZWZ0OiB2YXIoLS1zaXplLWdhcC1kb3VibGUpO1xcbiAgICBtYXgtd2lkdGg6IDQyMHB4O1xcbiAgICB6LWluZGV4OiA5MDAwO1xcbiAgfVxcblxcbiAgQG1lZGlhIChtYXgtd2lkdGg6IDQ0MHB4KSB7XFxuICAgIFtkYXRhLW5leHRqcy10b2FzdF0ge1xcbiAgICAgIG1heC13aWR0aDogOTB2dztcXG4gICAgICBsZWZ0OiA1dnc7XFxuICAgIH1cXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy10b2FzdC13cmFwcGVyXSB7XFxuICAgIHBhZGRpbmc6IDE2cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBmb250LXdlaWdodDogNTAwO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYW5zaS1icmlnaHQtd2hpdGUpO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLXJlZCk7XFxuICAgIGJveC1zaGFkb3c6IDBweCB2YXIoLS1zaXplLWdhcC1kb3VibGUpIHZhcigtLXNpemUtZ2FwLXF1YWQpXFxuICAgICAgcmdiYSgwLCAwLCAwLCAwLjI1KTtcXG4gIH1cXG5cIl0pKSk7XG5leHBvcnRzLnN0eWxlcyA9IHN0eWxlcztcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3R5bGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gKHRoaXMgJiYgdGhpcy5fX21ha2VUZW1wbGF0ZU9iamVjdCkgfHwgZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgICByZXR1cm4gY29va2VkO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBEaWFsb2dfMSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0RpYWxvZ1wiKTtcbnZhciBPdmVybGF5XzEgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9PdmVybGF5XCIpO1xudmFyIFRlcm1pbmFsXzEgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9UZXJtaW5hbFwiKTtcbnZhciBub29wX3RlbXBsYXRlXzEgPSByZXF1aXJlKFwiLi4vaGVscGVycy9ub29wLXRlbXBsYXRlXCIpO1xuZXhwb3J0cy5CdWlsZEVycm9yID0gZnVuY3Rpb24gQnVpbGRFcnJvcihfYSkge1xuICAgIHZhciBtZXNzYWdlID0gX2EubWVzc2FnZTtcbiAgICB2YXIgbm9vcCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHsgfSwgW10pO1xuICAgIHJldHVybiAoUmVhY3QuY3JlYXRlRWxlbWVudChPdmVybGF5XzEuT3ZlcmxheSwgeyBmaXhlZDogdHJ1ZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZ18xLkRpYWxvZywgeyB0eXBlOiBcImVycm9yXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IFwibmV4dGpzX19jb250YWluZXJfYnVpbGRfZXJyb3JfbGFiZWxcIiwgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IFwibmV4dGpzX19jb250YWluZXJfYnVpbGRfZXJyb3JfZGVzY1wiLCBvbkNsb3NlOiBub29wIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZ18xLkRpYWxvZ0NvbnRlbnQsIG51bGwsXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEaWFsb2dfMS5EaWFsb2dIZWFkZXIsIHsgY2xhc3NOYW1lOiBcIm5leHRqcy1jb250YWluZXItYnVpbGQtZXJyb3ItaGVhZGVyXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImg0XCIsIHsgaWQ6IFwibmV4dGpzX19jb250YWluZXJfYnVpbGRfZXJyb3JfbGFiZWxcIiB9LCBcIkZhaWxlZCB0byBjb21waWxlXCIpKSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZ18xLkRpYWxvZ0JvZHksIHsgY2xhc3NOYW1lOiBcIm5leHRqcy1jb250YWluZXItYnVpbGQtZXJyb3ItYm9keVwiIH0sXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoVGVybWluYWxfMS5UZXJtaW5hbCwgeyBjb250ZW50OiBtZXNzYWdlIH0pLFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZm9vdGVyXCIsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwicFwiLCB7IGlkOiBcIm5leHRqc19fY29udGFpbmVyX2J1aWxkX2Vycm9yX2Rlc2NcIiB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzbWFsbFwiLCBudWxsLCBcIlRoaXMgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGFuZCBjYW4gb25seSBiZSBkaXNtaXNzZWQgYnkgZml4aW5nIHRoZSBlcnJvci5cIikpKSkpKSkpO1xufTtcbmV4cG9ydHMuc3R5bGVzID0gbm9vcF90ZW1wbGF0ZV8xLm5vb3AodGVtcGxhdGVPYmplY3RfMSB8fCAodGVtcGxhdGVPYmplY3RfMSA9IF9fbWFrZVRlbXBsYXRlT2JqZWN0KFtcIlxcbiAgLm5leHRqcy1jb250YWluZXItYnVpbGQtZXJyb3ItaGVhZGVyID4gaDQge1xcbiAgICBsaW5lLWhlaWdodDogMS41O1xcbiAgICBtYXJnaW46IDA7XFxuICAgIHBhZGRpbmc6IDA7XFxuICB9XFxuXFxuICAubmV4dGpzLWNvbnRhaW5lci1idWlsZC1lcnJvci1ib2R5IGZvb3RlciB7XFxuICAgIG1hcmdpbi10b3A6IHZhcigtLXNpemUtZ2FwKTtcXG4gIH1cXG4gIC5uZXh0anMtY29udGFpbmVyLWJ1aWxkLWVycm9yLWJvZHkgZm9vdGVyIHAge1xcbiAgICBtYXJnaW46IDA7XFxuICB9XFxuXFxuICAubmV4dGpzLWNvbnRhaW5lci1idWlsZC1lcnJvci1ib2R5IHNtYWxsIHtcXG4gICAgY29sb3I6ICM3NTc1NzU7XFxuICB9XFxuXCJdLCBbXCJcXG4gIC5uZXh0anMtY29udGFpbmVyLWJ1aWxkLWVycm9yLWhlYWRlciA+IGg0IHtcXG4gICAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgfVxcblxcbiAgLm5leHRqcy1jb250YWluZXItYnVpbGQtZXJyb3ItYm9keSBmb290ZXIge1xcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zaXplLWdhcCk7XFxuICB9XFxuICAubmV4dGpzLWNvbnRhaW5lci1idWlsZC1lcnJvci1ib2R5IGZvb3RlciBwIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgfVxcblxcbiAgLm5leHRqcy1jb250YWluZXItYnVpbGQtZXJyb3ItYm9keSBzbWFsbCB7XFxuICAgIGNvbG9yOiAjNzU3NTc1O1xcbiAgfVxcblwiXSkpKTtcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnVpbGRFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdCA9ICh0aGlzICYmIHRoaXMuX19tYWtlVGVtcGxhdGVPYmplY3QpIHx8IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gICAgcmV0dXJuIGNvb2tlZDtcbn07XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbnZhciBfX3JlYWQgPSAodGhpcyAmJiB0aGlzLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBidXNfMSA9IHJlcXVpcmUoXCIuLi9idXNcIik7XG52YXIgRGlhbG9nXzEgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9EaWFsb2dcIik7XG52YXIgTGVmdFJpZ2h0RGlhbG9nSGVhZGVyXzEgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9MZWZ0UmlnaHREaWFsb2dIZWFkZXJcIik7XG52YXIgT3ZlcmxheV8xID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvT3ZlcmxheVwiKTtcbnZhciBUb2FzdF8xID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvVG9hc3RcIik7XG52YXIgbm9kZVN0YWNrRnJhbWVzXzEgPSByZXF1aXJlKFwiLi4vaGVscGVycy9ub2RlU3RhY2tGcmFtZXNcIik7XG52YXIgbm9vcF90ZW1wbGF0ZV8xID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvbm9vcC10ZW1wbGF0ZVwiKTtcbnZhciBzdGFja19mcmFtZV8xID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvc3RhY2stZnJhbWVcIik7XG52YXIgUnVudGltZUVycm9yXzEgPSByZXF1aXJlKFwiLi9SdW50aW1lRXJyb3JcIik7XG5mdW5jdGlvbiBnZXRFcnJvclNpZ25hdHVyZShldikge1xuICAgIHZhciBldmVudCA9IGV2LmV2ZW50O1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlIGJ1c18xLlRZUEVfVU5IQU5ETEVEX0VSUk9SOlxuICAgICAgICBjYXNlIGJ1c18xLlRZUEVfVU5IQU5ETEVEX1JFSkVDVElPTjoge1xuICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnJlYXNvbi5uYW1lICsgXCI6OlwiICsgZXZlbnQucmVhc29uLm1lc3NhZ2UgKyBcIjo6XCIgKyBldmVudC5yZWFzb24uc3RhY2s7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgXyA9IGV2ZW50O1xuICAgIHJldHVybiAnJztcbn1cbnZhciBIb3RsaW5rZWRUZXh0ID0gZnVuY3Rpb24gSG90bGlua2VkVGV4dChwcm9wcykge1xuICAgIHZhciB0ZXh0ID0gcHJvcHMudGV4dDtcbiAgICB2YXIgbGlua1JlZ2V4ID0gL2h0dHBzPzpcXC9cXC9bXlxccy8kLj8jXS5bXlxcc1wiXSovaTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIGxpbmtSZWdleC50ZXN0KHRleHQpXG4gICAgICAgID8gdGV4dC5zcGxpdCgnICcpLm1hcChmdW5jdGlvbiAod29yZCwgaW5kZXgsIGFycmF5KSB7XG4gICAgICAgICAgICBpZiAobGlua1JlZ2V4LnRlc3Qod29yZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIHsga2V5OiBcImxpbmstXCIgKyBpbmRleCB9LFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCB7IGhyZWY6IHdvcmQgfSwgd29yZCksXG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID09PSBhcnJheS5sZW5ndGggLSAxID8gJycgOiAnICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbmRleCA9PT0gYXJyYXkubGVuZ3RoIC0gMSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCB7IGtleTogXCJ0ZXh0LVwiICsgaW5kZXggfSwgd29yZCkpIDogKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIHsga2V5OiBcInRleHQtXCIgKyBpbmRleCB9LFxuICAgICAgICAgICAgICAgIHdvcmQsXG4gICAgICAgICAgICAgICAgXCIgXCIpKTtcbiAgICAgICAgfSlcbiAgICAgICAgOiB0ZXh0KSk7XG59O1xuZnVuY3Rpb24gZ2V0RXJyb3JCeVR5cGUoZXYpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBpZCwgZXZlbnQsIF9hLCBfYiwgXztcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYykge1xuICAgICAgICAgICAgc3dpdGNoIChfYy5sYWJlbCkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBldi5pZCwgZXZlbnQgPSBldi5ldmVudDtcbiAgICAgICAgICAgICAgICAgICAgX2EgPSBldmVudC50eXBlO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGJ1c18xLlRZUEVfVU5IQU5ETEVEX0VSUk9SOiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYnVzXzEuVFlQRV9VTkhBTkRMRURfUkVKRUNUSU9OOiByZXR1cm4gWzMgLypicmVhayovLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzMgLypicmVhayovLCAzXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIF9iID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBldmVudC5yZWFzb25cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgc3RhY2tfZnJhbWVfMS5nZXRPcmlnaW5hbFN0YWNrRnJhbWVzKG5vZGVTdGFja0ZyYW1lc18xLmlzTm9kZUVycm9yKGV2ZW50LnJlYXNvbiksIGV2ZW50LmZyYW1lcyldO1xuICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIFsyIC8qcmV0dXJuKi8sIChfYi5mcmFtZXMgPSBfYy5zZW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBfYildO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFszIC8qYnJlYWsqLywgNF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX2MubGFiZWwgPSA0O1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgXyA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R5cGUgc3lzdGVtIGludmFyaWFudCB2aW9sYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLkVycm9ycyA9IGZ1bmN0aW9uIEVycm9ycyhfYSkge1xuICAgIHZhciBlcnJvcnMgPSBfYS5lcnJvcnM7XG4gICAgdmFyIF9iID0gX19yZWFkKFJlYWN0LnVzZVN0YXRlKHt9KSwgMiksIGxvb2t1cHMgPSBfYlswXSwgc2V0TG9va3VwcyA9IF9iWzFdO1xuICAgIHZhciBfYyA9IF9fcmVhZChSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJlYWR5ID0gW107XG4gICAgICAgIHZhciBuZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gRW5zdXJlIGVycm9ycyBhcmUgZGlzcGxheWVkIGluIHRoZSBvcmRlciB0aGV5IG9jY3VycmVkIGluOlxuICAgICAgICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBlcnJvcnMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgdmFyIGUgPSBlcnJvcnNbaWR4XTtcbiAgICAgICAgICAgIHZhciBpZCA9IGUuaWQ7XG4gICAgICAgICAgICBpZiAoaWQgaW4gbG9va3Vwcykge1xuICAgICAgICAgICAgICAgIHJlYWR5LnB1c2gobG9va3Vwc1tpZF0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBlcnJvcnNcbiAgICAgICAgICAgIGlmIChpZHggPiAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByZXYgPSBlcnJvcnNbaWR4IC0gMV07XG4gICAgICAgICAgICAgICAgaWYgKGdldEVycm9yU2lnbmF0dXJlKHByZXYpID09PSBnZXRFcnJvclNpZ25hdHVyZShlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0ID0gZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbcmVhZHksIG5leHRdO1xuICAgIH0sIFtlcnJvcnMsIGxvb2t1cHNdKSwgMiksIHJlYWR5RXJyb3JzID0gX2NbMF0sIG5leHRFcnJvciA9IF9jWzFdO1xuICAgIHZhciBpc0xvYWRpbmcgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlYWR5RXJyb3JzLmxlbmd0aCA8IDEgJiYgQm9vbGVhbihlcnJvcnMubGVuZ3RoKTtcbiAgICB9LCBbZXJyb3JzLmxlbmd0aCwgcmVhZHlFcnJvcnMubGVuZ3RoXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKG5leHRFcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vdW50ZWQgPSB0cnVlO1xuICAgICAgICBnZXRFcnJvckJ5VHlwZShuZXh0RXJyb3IpLnRoZW4oZnVuY3Rpb24gKHJlc29sdmVkKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBjYXJlIGlmIHRoZSBkZXNpcmVkIGVycm9yIGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSByZXNvbHZpbmcsXG4gICAgICAgICAgICAvLyB0aHVzIHdlJ3JlIG5vdCB0cmFja2luZyBpdCB1c2luZyBhIHJlZi4gT25jZSB0aGUgd29yayBoYXMgYmVlbiBkb25lLFxuICAgICAgICAgICAgLy8gd2UnbGwgc3RvcmUgaXQuXG4gICAgICAgICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICAgICAgICAgIHNldExvb2t1cHMoZnVuY3Rpb24gKG0pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKF9fYXNzaWduKF9fYXNzaWduKHt9LCBtKSwgKF9hID0ge30sIF9hW3Jlc29sdmVkLmlkXSA9IHJlc29sdmVkLCBfYSkpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIHRoaXMsIHRob3VnaCBhbiBlZGdlIGNhc2VcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBtb3VudGVkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfSwgW25leHRFcnJvcl0pO1xuICAgIHZhciBfZCA9IF9fcmVhZChSZWFjdC51c2VTdGF0ZShmYWxzZSksIDIpLCBpc01pbmltaXplZCA9IF9kWzBdLCBzZXRNaW5pbWl6ZWQgPSBfZFsxXTtcbiAgICB2YXIgX2UgPSBfX3JlYWQoUmVhY3QudXNlU3RhdGUoMCksIDIpLCBhY3RpdmVJZHggPSBfZVswXSwgc2V0QWN0aXZlSW5kZXggPSBfZVsxXTtcbiAgICB2YXIgcHJldmlvdXMgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0QWN0aXZlSW5kZXgoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIE1hdGgubWF4KDAsIHYgLSAxKTsgfSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBuZXh0ID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZSA9PT0gbnVsbCB8fCBlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHNldEFjdGl2ZUluZGV4KGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5taW4ocmVhZHlFcnJvcnMubGVuZ3RoIC0gMSwgdiArIDEpKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW3JlYWR5RXJyb3JzLmxlbmd0aF0pO1xuICAgIHZhciBhY3RpdmVFcnJvciA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkgeyB2YXIgX2E7IHJldHVybiAoX2EgPSByZWFkeUVycm9yc1thY3RpdmVJZHhdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsOyB9LCBbYWN0aXZlSWR4LCByZWFkeUVycm9yc10pO1xuICAgIC8vIFJlc2V0IGNvbXBvbmVudCBzdGF0ZSB3aGVuIHRoZXJlIGFyZSBubyBlcnJvcnMgdG8gYmUgZGlzcGxheWVkLlxuICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGxldHMgaGFuZGxlIGl0LlxuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgc2V0TG9va3Vwcyh7fSk7XG4gICAgICAgICAgICBzZXRNaW5pbWl6ZWQoZmFsc2UpO1xuICAgICAgICAgICAgc2V0QWN0aXZlSW5kZXgoMCk7XG4gICAgICAgIH1cbiAgICB9LCBbZXJyb3JzLmxlbmd0aF0pO1xuICAgIHZhciBtaW5pbWl6ZSA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUgPT09IG51bGwgfHwgZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRNaW5pbWl6ZWQodHJ1ZSk7XG4gICAgfSwgW10pO1xuICAgIHZhciByZW9wZW4gPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAoZSkge1xuICAgICAgICBlID09PSBudWxsIHx8IGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0TWluaW1pemVkKGZhbHNlKTtcbiAgICB9LCBbXSk7XG4gICAgLy8gVGhpcyBjb21wb25lbnQgc2hvdWxkbid0IGJlIHJlbmRlcmVkIHdpdGggbm8gZXJyb3JzLCBidXQgaWYgaXQgaXMsIGxldCdzXG4gICAgLy8gaGFuZGxlIGl0IGdyYWNlZnVsbHkgYnkgcmVuZGVyaW5nIG5vdGhpbmcuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPCAxIHx8IGFjdGl2ZUVycm9yID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0xvYWRpbmcpIHtcbiAgICAgICAgLy8gVE9ETzogYmV0dGVyIGxvYWRpbmcgc3RhdGVcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoT3ZlcmxheV8xLk92ZXJsYXksIG51bGwpO1xuICAgIH1cbiAgICBpZiAoaXNNaW5pbWl6ZWQpIHtcbiAgICAgICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFRvYXN0XzEuVG9hc3QsIHsgY2xhc3NOYW1lOiBcIm5leHRqcy10b2FzdC1lcnJvcnMtcGFyZW50XCIsIG9uQ2xpY2s6IHJlb3BlbiB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7IGNsYXNzTmFtZTogXCJuZXh0anMtdG9hc3QtZXJyb3JzXCIgfSxcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHsgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgd2lkdGg6IFwiMjRcIiwgaGVpZ2h0OiBcIjI0XCIsIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsIGZpbGw6IFwibm9uZVwiLCBzdHJva2U6IFwiY3VycmVudENvbG9yXCIsIHN0cm9rZVdpZHRoOiBcIjJcIiwgc3Ryb2tlTGluZWNhcDogXCJyb3VuZFwiLCBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiIH0sXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjaXJjbGVcIiwgeyBjeDogXCIxMlwiLCBjeTogXCIxMlwiLCByOiBcIjEwXCIgfSksXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIHsgeDE6IFwiMTJcIiwgeTE6IFwiOFwiLCB4MjogXCIxMlwiLCB5MjogXCIxMlwiIH0pLFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwibGluZVwiLCB7IHgxOiBcIjEyXCIsIHkxOiBcIjE2XCIsIHgyOiBcIjEyLjAxXCIsIHkyOiBcIjE2XCIgfSkpLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHJlYWR5RXJyb3JzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgXCIgZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgcmVhZHlFcnJvcnMubGVuZ3RoID4gMSA/ICdzJyA6ICcnKSkpKTtcbiAgICB9XG4gICAgdmFyIGlzU2VydmVyRXJyb3IgPSBub2RlU3RhY2tGcmFtZXNfMS5pc05vZGVFcnJvcihhY3RpdmVFcnJvci5lcnJvcik7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KE92ZXJsYXlfMS5PdmVybGF5LCBudWxsLFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZ18xLkRpYWxvZywgeyB0eXBlOiBcImVycm9yXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCI6IFwibmV4dGpzX19jb250YWluZXJfZXJyb3JzX2xhYmVsXCIsIFwiYXJpYS1kZXNjcmliZWRieVwiOiBcIm5leHRqc19fY29udGFpbmVyX2Vycm9yc19kZXNjXCIsIG9uQ2xvc2U6IGlzU2VydmVyRXJyb3IgPyB1bmRlZmluZWQgOiBtaW5pbWl6ZSB9LFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChEaWFsb2dfMS5EaWFsb2dDb250ZW50LCBudWxsLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGlhbG9nXzEuRGlhbG9nSGVhZGVyLCB7IGNsYXNzTmFtZTogXCJuZXh0anMtY29udGFpbmVyLWVycm9ycy1oZWFkZXJcIiB9LFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExlZnRSaWdodERpYWxvZ0hlYWRlcl8xLkxlZnRSaWdodERpYWxvZ0hlYWRlciwgeyBwcmV2aW91czogYWN0aXZlSWR4ID4gMCA/IHByZXZpb3VzIDogbnVsbCwgbmV4dDogYWN0aXZlSWR4IDwgcmVhZHlFcnJvcnMubGVuZ3RoIC0gMSA/IG5leHQgOiBudWxsLCBjbG9zZTogaXNTZXJ2ZXJFcnJvciA/IHVuZGVmaW5lZCA6IG1pbmltaXplIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic21hbGxcIiwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBhY3RpdmVJZHggKyAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBvZlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCByZWFkeUVycm9ycy5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHVuaGFuZGxlZCBlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5RXJyb3JzLmxlbmd0aCA8IDIgPyAnJyA6ICdzJykpLFxuICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDFcIiwgeyBpZDogXCJuZXh0anNfX2NvbnRhaW5lcl9lcnJvcnNfbGFiZWxcIiB9LCBpc1NlcnZlckVycm9yID8gJ1NlcnZlciBFcnJvcicgOiAnVW5oYW5kbGVkIFJ1bnRpbWUgRXJyb3InKSxcbiAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInBcIiwgeyBpZDogXCJuZXh0anNfX2NvbnRhaW5lcl9lcnJvcnNfZGVzY1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFcnJvci5lcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCI6XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAnICcsXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KEhvdGxpbmtlZFRleHQsIHsgdGV4dDogYWN0aXZlRXJyb3IuZXJyb3IubWVzc2FnZSB9KSksXG4gICAgICAgICAgICAgICAgICAgIGlzU2VydmVyRXJyb3IgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNtYWxsXCIsIG51bGwsIFwiVGhpcyBlcnJvciBoYXBwZW5lZCB3aGlsZSBnZW5lcmF0aW5nIHRoZSBwYWdlLiBBbnkgY29uc29sZSBsb2dzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSB0ZXJtaW5hbCB3aW5kb3cuXCIpKSkgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRGlhbG9nXzEuRGlhbG9nQm9keSwgeyBjbGFzc05hbWU6IFwibmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtYm9keVwiIH0sXG4gICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoUnVudGltZUVycm9yXzEuUnVudGltZUVycm9yLCB7IGtleTogYWN0aXZlRXJyb3IuaWQudG9TdHJpbmcoKSwgZXJyb3I6IGFjdGl2ZUVycm9yIH0pKSkpKSk7XG59O1xuZXhwb3J0cy5zdHlsZXMgPSBub29wX3RlbXBsYXRlXzEubm9vcCh0ZW1wbGF0ZU9iamVjdF8xIHx8ICh0ZW1wbGF0ZU9iamVjdF8xID0gX19tYWtlVGVtcGxhdGVPYmplY3QoW1wiXFxuICAubmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtaGVhZGVyID4gaDEge1xcbiAgICBmb250LXNpemU6IHZhcigtLXNpemUtZm9udC1iaWcpO1xcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tc2l6ZS1mb250LWJpZ2dlcik7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IGNhbGModmFyKC0tc2l6ZS1nYXAtZG91YmxlKSArIHZhcigtLXNpemUtZ2FwLWhhbGYpKTtcXG4gIH1cXG4gIC5uZXh0anMtY29udGFpbmVyLWVycm9ycy1oZWFkZXIgc21hbGwge1xcbiAgICBmb250LXNpemU6IHZhcigtLXNpemUtZm9udC1zbWFsbCk7XFxuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1hY2NlbnRzLTEpO1xcbiAgICBtYXJnaW4tbGVmdDogdmFyKC0tc2l6ZS1nYXAtZG91YmxlKTtcXG4gIH1cXG4gIC5uZXh0anMtY29udGFpbmVyLWVycm9ycy1oZWFkZXIgc21hbGwgPiBzcGFuIHtcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc3RhY2stbW9ub3NwYWNlKTtcXG4gIH1cXG4gIC5uZXh0anMtY29udGFpbmVyLWVycm9ycy1oZWFkZXIgPiBwIHtcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc3RhY2stbW9ub3NwYWNlKTtcXG4gICAgZm9udC1zaXplOiB2YXIoLS1zaXplLWZvbnQtc21hbGwpO1xcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tc2l6ZS1mb250LWJpZyk7XFxuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYW5zaS1yZWQpO1xcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XFxuICB9XFxuICAubmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtaGVhZGVyID4gZGl2ID4gc21hbGwge1xcbiAgICBtYXJnaW46IDA7XFxuICAgIG1hcmdpbi10b3A6IHZhcigtLXNpemUtZ2FwLWhhbGYpO1xcbiAgfVxcbiAgLm5leHRqcy1jb250YWluZXItZXJyb3JzLWhlYWRlciA+IHAgPiBhIHtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktcmVkKTtcXG4gIH1cXG5cXG4gIC5uZXh0anMtY29udGFpbmVyLWVycm9ycy1ib2R5ID4gaDU6bm90KDpmaXJzdC1jaGlsZCkge1xcbiAgICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcCkpO1xcbiAgfVxcbiAgLm5leHRqcy1jb250YWluZXItZXJyb3JzLWJvZHkgPiBoNSB7XFxuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNpemUtZ2FwKTtcXG4gIH1cXG5cXG4gIC5uZXh0anMtdG9hc3QtZXJyb3JzLXBhcmVudCB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTtcXG4gIH1cXG4gIC5uZXh0anMtdG9hc3QtZXJyb3JzLXBhcmVudDpob3ZlciB7XFxuICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcXG4gIH1cXG4gIC5uZXh0anMtdG9hc3QtZXJyb3JzIHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xcbiAgfVxcbiAgLm5leHRqcy10b2FzdC1lcnJvcnMgPiBzdmcge1xcbiAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXNpemUtZ2FwKTtcXG4gIH1cXG5cIl0sIFtcIlxcbiAgLm5leHRqcy1jb250YWluZXItZXJyb3JzLWhlYWRlciA+IGgxIHtcXG4gICAgZm9udC1zaXplOiB2YXIoLS1zaXplLWZvbnQtYmlnKTtcXG4gICAgbGluZS1oZWlnaHQ6IHZhcigtLXNpemUtZm9udC1iaWdnZXIpO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBtYXJnaW4tdG9wOiBjYWxjKHZhcigtLXNpemUtZ2FwLWRvdWJsZSkgKyB2YXIoLS1zaXplLWdhcC1oYWxmKSk7XFxuICB9XFxuICAubmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtaGVhZGVyIHNtYWxsIHtcXG4gICAgZm9udC1zaXplOiB2YXIoLS1zaXplLWZvbnQtc21hbGwpO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYWNjZW50cy0xKTtcXG4gICAgbWFyZ2luLWxlZnQ6IHZhcigtLXNpemUtZ2FwLWRvdWJsZSk7XFxuICB9XFxuICAubmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtaGVhZGVyIHNtYWxsID4gc3BhbiB7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXN0YWNrLW1vbm9zcGFjZSk7XFxuICB9XFxuICAubmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtaGVhZGVyID4gcCB7XFxuICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXN0YWNrLW1vbm9zcGFjZSk7XFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tc2l6ZS1mb250LXNtYWxsKTtcXG4gICAgbGluZS1oZWlnaHQ6IHZhcigtLXNpemUtZm9udC1iaWcpO1xcbiAgICBmb250LXdlaWdodDogYm9sZDtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zaXplLWdhcC1oYWxmKTtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFuc2ktcmVkKTtcXG4gICAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xcbiAgfVxcbiAgLm5leHRqcy1jb250YWluZXItZXJyb3JzLWhlYWRlciA+IGRpdiA+IHNtYWxsIHtcXG4gICAgbWFyZ2luOiAwO1xcbiAgICBtYXJnaW4tdG9wOiB2YXIoLS1zaXplLWdhcC1oYWxmKTtcXG4gIH1cXG4gIC5uZXh0anMtY29udGFpbmVyLWVycm9ycy1oZWFkZXIgPiBwID4gYSB7XFxuICAgIGNvbG9yOiB2YXIoLS1jb2xvci1hbnNpLXJlZCk7XFxuICB9XFxuXFxuICAubmV4dGpzLWNvbnRhaW5lci1lcnJvcnMtYm9keSA+IGg1Om5vdCg6Zmlyc3QtY2hpbGQpIHtcXG4gICAgbWFyZ2luLXRvcDogY2FsYyh2YXIoLS1zaXplLWdhcC1kb3VibGUpICsgdmFyKC0tc2l6ZS1nYXApKTtcXG4gIH1cXG4gIC5uZXh0anMtY29udGFpbmVyLWVycm9ycy1ib2R5ID4gaDUge1xcbiAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zaXplLWdhcCk7XFxuICB9XFxuXFxuICAubmV4dGpzLXRvYXN0LWVycm9ycy1wYXJlbnQge1xcbiAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7XFxuICB9XFxuICAubmV4dGpzLXRvYXN0LWVycm9ycy1wYXJlbnQ6aG92ZXIge1xcbiAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XFxuICB9XFxuICAubmV4dGpzLXRvYXN0LWVycm9ycyB7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcXG4gIH1cXG4gIC5uZXh0anMtdG9hc3QtZXJyb3JzID4gc3ZnIHtcXG4gICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1zaXplLWdhcCk7XFxuICB9XFxuXCJdKSkpO1xudmFyIHRlbXBsYXRlT2JqZWN0XzE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvcnMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3QgPSAodGhpcyAmJiB0aGlzLl9fbWFrZVRlbXBsYXRlT2JqZWN0KSB8fCBmdW5jdGlvbiAoY29va2VkLCByYXcpIHtcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICAgIHJldHVybiBjb29rZWQ7XG59O1xudmFyIF9fcmVhZCA9ICh0aGlzICYmIHRoaXMuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIENvZGVGcmFtZV8xID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvQ29kZUZyYW1lXCIpO1xudmFyIG5vb3BfdGVtcGxhdGVfMSA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL25vb3AtdGVtcGxhdGVcIik7XG52YXIgc3RhY2tfZnJhbWVfMSA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3N0YWNrLWZyYW1lXCIpO1xudmFyIENhbGxTdGFja0ZyYW1lID0gZnVuY3Rpb24gQ2FsbFN0YWNrRnJhbWUoX2EpIHtcbiAgICAvLyBUT0RPOiBhYmlsaXR5IHRvIGV4cGFuZCByZXNvbHZlZCBmcmFtZXNcbiAgICAvLyBUT0RPOiByZW5kZXIgZXJyb3Igb3IgZXh0ZXJuYWwgaW5kaWNhdG9yXG4gICAgdmFyIGZyYW1lID0gX2EuZnJhbWU7XG4gICAgdmFyIF9iO1xuICAgIHZhciBmID0gKF9iID0gZnJhbWUub3JpZ2luYWxTdGFja0ZyYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmcmFtZS5zb3VyY2VTdGFja0ZyYW1lO1xuICAgIHZhciBoYXNTb3VyY2UgPSBCb29sZWFuKGZyYW1lLm9yaWdpbmFsQ29kZUZyYW1lKTtcbiAgICB2YXIgb3BlbiA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIWhhc1NvdXJjZSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGYpIHtcbiAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCAoKF9hID0gZltrZXldKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnJykudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZlxuICAgICAgICAgICAgLmZldGNoKChwcm9jZXNzLmVudi5fX05FWFRfUk9VVEVSX0JBU0VQQVRIIHx8ICcnKSArIFwiL19fbmV4dGpzX2xhdW5jaC1lZGl0b3I/XCIgKyBwYXJhbXMudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICgpIHsgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVE9ETzogcmVwb3J0IGVycm9yXG4gICAgICAgIH0pO1xuICAgIH0sIFtoYXNTb3VyY2UsIGZdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImRhdGEtbmV4dGpzLWNhbGwtc3RhY2stZnJhbWVcIjogdHJ1ZSB9LFxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDZcIiwgeyBcImRhdGEtbmV4dGpzLWZyYW1lLWV4cGFuZGVkXCI6IEJvb2xlYW4oZnJhbWUuZXhwYW5kZWQpIH0sIGYubWV0aG9kTmFtZSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgeyBcImRhdGEtaGFzLXNvdXJjZVwiOiBoYXNTb3VyY2UgPyAndHJ1ZScgOiB1bmRlZmluZWQsIHRhYkluZGV4OiBoYXNTb3VyY2UgPyAxMCA6IHVuZGVmaW5lZCwgcm9sZTogaGFzU291cmNlID8gJ2xpbmsnIDogdW5kZWZpbmVkLCBvbkNsaWNrOiBvcGVuLCB0aXRsZTogaGFzU291cmNlID8gJ0NsaWNrIHRvIG9wZW4gaW4geW91ciBlZGl0b3InIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBzdGFja19mcmFtZV8xLmdldEZyYW1lU291cmNlKGYpKSxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgeyB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLCBmaWxsOiBcIm5vbmVcIiwgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLCBzdHJva2VXaWR0aDogXCIyXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIiB9LFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHsgZDogXCJNMTggMTN2NmEyIDIgMCAwIDEtMiAySDVhMiAyIDAgMCAxLTItMlY4YTIgMiAwIDAgMSAyLTJoNlwiIH0pLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwb2x5bGluZVwiLCB7IHBvaW50czogXCIxNSAzIDIxIDMgMjEgOVwiIH0pLFxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIHsgeDE6IFwiMTBcIiwgeTE6IFwiMTRcIiwgeDI6IFwiMjFcIiwgeTI6IFwiM1wiIH0pKSkpKTtcbn07XG52YXIgUnVudGltZUVycm9yID0gZnVuY3Rpb24gUnVudGltZUVycm9yKF9hKSB7XG4gICAgdmFyIGVycm9yID0gX2EuZXJyb3I7XG4gICAgdmFyIGZpcnN0Rmlyc3RQYXJ0eUZyYW1lSW5kZXggPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yLmZyYW1lcy5maW5kSW5kZXgoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkuZXhwYW5kZWQgJiZcbiAgICAgICAgICAgICAgICBCb29sZWFuKGVudHJ5Lm9yaWdpbmFsQ29kZUZyYW1lKSAmJlxuICAgICAgICAgICAgICAgIEJvb2xlYW4oZW50cnkub3JpZ2luYWxTdGFja0ZyYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW2Vycm9yLmZyYW1lc10pO1xuICAgIHZhciBmaXJzdEZyYW1lID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IGVycm9yLmZyYW1lc1tmaXJzdEZpcnN0UGFydHlGcmFtZUluZGV4XSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbDtcbiAgICB9LCBbZXJyb3IuZnJhbWVzLCBmaXJzdEZpcnN0UGFydHlGcmFtZUluZGV4XSk7XG4gICAgdmFyIGFsbExlYWRpbmdGcmFtZXMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZpcnN0Rmlyc3RQYXJ0eUZyYW1lSW5kZXggPCAwXG4gICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICA6IGVycm9yLmZyYW1lcy5zbGljZSgwLCBmaXJzdEZpcnN0UGFydHlGcmFtZUluZGV4KTtcbiAgICB9LCBbZXJyb3IuZnJhbWVzLCBmaXJzdEZpcnN0UGFydHlGcmFtZUluZGV4XSk7XG4gICAgdmFyIF9iID0gX19yZWFkKFJlYWN0LnVzZVN0YXRlKGZpcnN0RnJhbWUgPT0gbnVsbCksIDIpLCBhbGwgPSBfYlswXSwgc2V0QWxsID0gX2JbMV07XG4gICAgdmFyIHRvZ2dsZUFsbCA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0QWxsKGZ1bmN0aW9uICh2KSB7IHJldHVybiAhdjsgfSk7XG4gICAgfSwgW10pO1xuICAgIHZhciBsZWFkaW5nRnJhbWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7IHJldHVybiBhbGxMZWFkaW5nRnJhbWVzLmZpbHRlcihmdW5jdGlvbiAoZikgeyByZXR1cm4gZi5leHBhbmRlZCB8fCBhbGw7IH0pOyB9LCBbYWxsLCBhbGxMZWFkaW5nRnJhbWVzXSk7XG4gICAgdmFyIGFsbENhbGxTdGFja0ZyYW1lcyA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkgeyByZXR1cm4gZXJyb3IuZnJhbWVzLnNsaWNlKGZpcnN0Rmlyc3RQYXJ0eUZyYW1lSW5kZXggKyAxKTsgfSwgW2Vycm9yLmZyYW1lcywgZmlyc3RGaXJzdFBhcnR5RnJhbWVJbmRleF0pO1xuICAgIHZhciB2aXNpYmxlQ2FsbFN0YWNrRnJhbWVzID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7IHJldHVybiBhbGxDYWxsU3RhY2tGcmFtZXMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBmLmV4cGFuZGVkIHx8IGFsbDsgfSk7IH0sIFthbGwsIGFsbENhbGxTdGFja0ZyYW1lc10pO1xuICAgIHZhciBjYW5TaG93TW9yZSA9IFJlYWN0LnVzZU1lbW8oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKGFsbENhbGxTdGFja0ZyYW1lcy5sZW5ndGggIT09IHZpc2libGVDYWxsU3RhY2tGcmFtZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAoYWxsICYmIGZpcnN0RnJhbWUgIT0gbnVsbCkpO1xuICAgIH0sIFtcbiAgICAgICAgYWxsLFxuICAgICAgICBhbGxDYWxsU3RhY2tGcmFtZXMubGVuZ3RoLFxuICAgICAgICBmaXJzdEZyYW1lLFxuICAgICAgICB2aXNpYmxlQ2FsbFN0YWNrRnJhbWVzLmxlbmd0aCxcbiAgICBdKTtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgIGZpcnN0RnJhbWUgPyAoUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCxcbiAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoNVwiLCBudWxsLCBcIlNvdXJjZVwiKSxcbiAgICAgICAgICAgIGxlYWRpbmdGcmFtZXMubWFwKGZ1bmN0aW9uIChmcmFtZSwgaW5kZXgpIHsgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KENhbGxTdGFja0ZyYW1lLCB7IGtleTogXCJsZWFkaW5nLWZyYW1lLVwiICsgaW5kZXggKyBcIi1cIiArIGFsbCwgZnJhbWU6IGZyYW1lIH0pKTsgfSksXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KENvZGVGcmFtZV8xLkNvZGVGcmFtZSwgeyBzdGFja0ZyYW1lOiBmaXJzdEZyYW1lLm9yaWdpbmFsU3RhY2tGcmFtZSwgY29kZUZyYW1lOiBmaXJzdEZyYW1lLm9yaWdpbmFsQ29kZUZyYW1lIH0pKSkgOiB1bmRlZmluZWQsXG4gICAgICAgIHZpc2libGVDYWxsU3RhY2tGcmFtZXMubGVuZ3RoID8gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwiaDVcIiwgbnVsbCwgXCJDYWxsIFN0YWNrXCIpLFxuICAgICAgICAgICAgdmlzaWJsZUNhbGxTdGFja0ZyYW1lcy5tYXAoZnVuY3Rpb24gKGZyYW1lLCBpbmRleCkgeyByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FsbFN0YWNrRnJhbWUsIHsga2V5OiBcImNhbGwtc3RhY2stXCIgKyBpbmRleCArIFwiLVwiICsgYWxsLCBmcmFtZTogZnJhbWUgfSkpOyB9KSkpIDogdW5kZWZpbmVkLFxuICAgICAgICBjYW5TaG93TW9yZSA/IChSZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7IHRhYkluZGV4OiAxMCwgXCJkYXRhLW5leHRqcy1kYXRhLXJ1bnRpbWUtZXJyb3ItY29sbGFwc2VkLWFjdGlvblwiOiB0cnVlLCB0eXBlOiBcImJ1dHRvblwiLCBvbkNsaWNrOiB0b2dnbGVBbGwgfSxcbiAgICAgICAgICAgICAgICBhbGwgPyAnSGlkZScgOiAnU2hvdycsXG4gICAgICAgICAgICAgICAgXCIgY29sbGFwc2VkIGZyYW1lc1wiKSkpIDogdW5kZWZpbmVkKSk7XG59O1xuZXhwb3J0cy5SdW50aW1lRXJyb3IgPSBSdW50aW1lRXJyb3I7XG5leHBvcnRzLnN0eWxlcyA9IG5vb3BfdGVtcGxhdGVfMS5ub29wKHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbXCJcXG4gIGJ1dHRvbltkYXRhLW5leHRqcy1kYXRhLXJ1bnRpbWUtZXJyb3ItY29sbGFwc2VkLWFjdGlvbl0ge1xcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xcbiAgICBib3JkZXI6IG5vbmU7XFxuICAgIHBhZGRpbmc6IDA7XFxuICAgIGZvbnQtc2l6ZTogdmFyKC0tc2l6ZS1mb250LXNtYWxsKTtcXG4gICAgbGluZS1oZWlnaHQ6IHZhcigtLXNpemUtZm9udC1iaWdnZXIpO1xcbiAgICBjb2xvcjogdmFyKC0tY29sb3ItYWNjZW50cy0zKTtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1jYWxsLXN0YWNrLWZyYW1lXTpub3QoOmxhc3QtY2hpbGQpIHtcXG4gICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc2l6ZS1nYXAtZG91YmxlKTtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1jYWxsLXN0YWNrLWZyYW1lXSA+IGg2IHtcXG4gICAgbWFyZ2luLXRvcDogMDtcXG4gICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc2l6ZS1nYXApO1xcbiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1zdGFjay1tb25vc3BhY2UpO1xcbiAgICBjb2xvcjogIzIyMjtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1jYWxsLXN0YWNrLWZyYW1lXSA+IGg2W2RhdGEtbmV4dGpzLWZyYW1lLWV4cGFuZGVkPSdmYWxzZSddIHtcXG4gICAgY29sb3I6ICM2NjY7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtY2FsbC1zdGFjay1mcmFtZV0gPiBkaXYge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xcbiAgICBwYWRkaW5nLWxlZnQ6IGNhbGModmFyKC0tc2l6ZS1nYXApICsgdmFyKC0tc2l6ZS1nYXAtaGFsZikpO1xcbiAgICBmb250LXNpemU6IHZhcigtLXNpemUtZm9udC1zbWFsbCk7XFxuICAgIGNvbG9yOiAjOTk5O1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNhbGwtc3RhY2stZnJhbWVdID4gZGl2ID4gc3ZnIHtcXG4gICAgd2lkdGg6IGF1dG87XFxuICAgIGhlaWdodDogdmFyKC0tc2l6ZS1mb250LXNtYWxsKTtcXG4gICAgbWFyZ2luLWxlZnQ6IHZhcigtLXNpemUtZ2FwKTtcXG5cXG4gICAgZGlzcGxheTogbm9uZTtcXG4gIH1cXG5cXG4gIFtkYXRhLW5leHRqcy1jYWxsLXN0YWNrLWZyYW1lXSA+IGRpdltkYXRhLWhhcy1zb3VyY2VdIHtcXG4gICAgY3Vyc29yOiBwb2ludGVyO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNhbGwtc3RhY2stZnJhbWVdID4gZGl2W2RhdGEtaGFzLXNvdXJjZV06aG92ZXIge1xcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtY2FsbC1zdGFjay1mcmFtZV0gPiBkaXZbZGF0YS1oYXMtc291cmNlXSA+IHN2ZyB7XFxuICAgIGRpc3BsYXk6IHVuc2V0O1xcbiAgfVxcblwiXSwgW1wiXFxuICBidXR0b25bZGF0YS1uZXh0anMtZGF0YS1ydW50aW1lLWVycm9yLWNvbGxhcHNlZC1hY3Rpb25dIHtcXG4gICAgYmFja2dyb3VuZDogbm9uZTtcXG4gICAgYm9yZGVyOiBub25lO1xcbiAgICBwYWRkaW5nOiAwO1xcbiAgICBmb250LXNpemU6IHZhcigtLXNpemUtZm9udC1zbWFsbCk7XFxuICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1zaXplLWZvbnQtYmlnZ2VyKTtcXG4gICAgY29sb3I6IHZhcigtLWNvbG9yLWFjY2VudHMtMyk7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtY2FsbC1zdGFjay1mcmFtZV06bm90KDpsYXN0LWNoaWxkKSB7XFxuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNpemUtZ2FwLWRvdWJsZSk7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtY2FsbC1zdGFjay1mcmFtZV0gPiBoNiB7XFxuICAgIG1hcmdpbi10b3A6IDA7XFxuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNpemUtZ2FwKTtcXG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc3RhY2stbW9ub3NwYWNlKTtcXG4gICAgY29sb3I6ICMyMjI7XFxuICB9XFxuICBbZGF0YS1uZXh0anMtY2FsbC1zdGFjay1mcmFtZV0gPiBoNltkYXRhLW5leHRqcy1mcmFtZS1leHBhbmRlZD0nZmFsc2UnXSB7XFxuICAgIGNvbG9yOiAjNjY2O1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNhbGwtc3RhY2stZnJhbWVdID4gZGl2IHtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG4gICAgcGFkZGluZy1sZWZ0OiBjYWxjKHZhcigtLXNpemUtZ2FwKSArIHZhcigtLXNpemUtZ2FwLWhhbGYpKTtcXG4gICAgZm9udC1zaXplOiB2YXIoLS1zaXplLWZvbnQtc21hbGwpO1xcbiAgICBjb2xvcjogIzk5OTtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1jYWxsLXN0YWNrLWZyYW1lXSA+IGRpdiA+IHN2ZyB7XFxuICAgIHdpZHRoOiBhdXRvO1xcbiAgICBoZWlnaHQ6IHZhcigtLXNpemUtZm9udC1zbWFsbCk7XFxuICAgIG1hcmdpbi1sZWZ0OiB2YXIoLS1zaXplLWdhcCk7XFxuXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxuICB9XFxuXFxuICBbZGF0YS1uZXh0anMtY2FsbC1zdGFjay1mcmFtZV0gPiBkaXZbZGF0YS1oYXMtc291cmNlXSB7XFxuICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gIH1cXG4gIFtkYXRhLW5leHRqcy1jYWxsLXN0YWNrLWZyYW1lXSA+IGRpdltkYXRhLWhhcy1zb3VyY2VdOmhvdmVyIHtcXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xcbiAgfVxcbiAgW2RhdGEtbmV4dGpzLWNhbGwtc3RhY2stZnJhbWVdID4gZGl2W2RhdGEtaGFzLXNvdXJjZV0gPiBzdmcge1xcbiAgICBkaXNwbGF5OiB1bnNldDtcXG4gIH1cXG5cIl0pKSk7XG52YXIgdGVtcGxhdGVPYmplY3RfMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJ1bnRpbWVFcnJvci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHtcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24odCkge1xuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpXG4gICAgICAgICAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfTtcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIHN0YWNrdHJhY2VfcGFyc2VyXzEgPSByZXF1aXJlKFwic3RhY2t0cmFjZS1wYXJzZXJcIik7XG5mdW5jdGlvbiBnZXRGaWxlc3lzdGVtRnJhbWUoZnJhbWUpIHtcbiAgICB2YXIgZiA9IF9fYXNzaWduKHt9LCBmcmFtZSk7XG4gICAgaWYgKHR5cGVvZiBmLmZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gUG9zaXg6XG4gICAgICAgIGYuZmlsZS5zdGFydHNXaXRoKCcvJykgfHxcbiAgICAgICAgICAgIC8vIFdpbjMyOlxuICAgICAgICAgICAgL15bYS16XTpcXFxcL2kudGVzdChmLmZpbGUpIHx8XG4gICAgICAgICAgICAvLyBXaW4zMiBVTkM6XG4gICAgICAgICAgICBmLmZpbGUuc3RhcnRzV2l0aCgnXFxcXFxcXFwnKSkge1xuICAgICAgICAgICAgZi5maWxlID0gXCJmaWxlOi8vXCIgKyBmLmZpbGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGY7XG59XG5leHBvcnRzLmdldEZpbGVzeXN0ZW1GcmFtZSA9IGdldEZpbGVzeXN0ZW1GcmFtZTtcbnZhciBzeW1ib2xOb2RlRXJyb3IgPSBTeW1ib2woJ05leHRqc05vZGVFcnJvcicpO1xuZnVuY3Rpb24gaXNOb2RlRXJyb3IoZXJyb3IpIHtcbiAgICByZXR1cm4gc3ltYm9sTm9kZUVycm9yIGluIGVycm9yO1xufVxuZXhwb3J0cy5pc05vZGVFcnJvciA9IGlzTm9kZUVycm9yO1xuZnVuY3Rpb24gZ2V0Tm9kZUVycm9yKGVycm9yKSB7XG4gICAgdmFyIG47XG4gICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICBuID0gZTtcbiAgICB9XG4gICAgbi5uYW1lID0gZXJyb3IubmFtZTtcbiAgICB0cnkge1xuICAgICAgICBuLnN0YWNrID0gc3RhY2t0cmFjZV9wYXJzZXJfMS5wYXJzZShlcnJvci5zdGFjaylcbiAgICAgICAgICAgIC5tYXAoZ2V0RmlsZXN5c3RlbUZyYW1lKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoZikge1xuICAgICAgICAgICAgdmFyIHN0ciA9IFwiICAgIGF0IFwiICsgZi5tZXRob2ROYW1lO1xuICAgICAgICAgICAgaWYgKGYuZmlsZSkge1xuICAgICAgICAgICAgICAgIHZhciBsb2MgPSBmLmZpbGU7XG4gICAgICAgICAgICAgICAgaWYgKGYubGluZU51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICBsb2MgKz0gXCI6XCIgKyBmLmxpbmVOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmLmNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9jICs9IFwiOlwiICsgZi5jb2x1bW47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyICs9IFwiIChcIiArIGxvYyArIFwiKVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG4gICAgY2F0Y2ggKF9hKSB7XG4gICAgICAgIG4uc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIHN5bWJvbE5vZGVFcnJvciwge1xuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIG47XG59XG5leHBvcnRzLmdldE5vZGVFcnJvciA9IGdldE5vZGVFcnJvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGVTdGFja0ZyYW1lcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBub29wKHN0cmluZ3MpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGtleXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgfVxuICAgIHZhciBsYXN0SW5kZXggPSBzdHJpbmdzLmxlbmd0aCAtIDE7XG4gICAgcmV0dXJuIChzdHJpbmdzLnNsaWNlKDAsIGxhc3RJbmRleCkucmVkdWNlKGZ1bmN0aW9uIChwLCBzLCBpKSB7IHJldHVybiBwICsgcyArIGtleXNbaV07IH0sICcnKSArXG4gICAgICAgIHN0cmluZ3NbbGFzdEluZGV4XSk7XG59XG5leHBvcnRzLm5vb3AgPSBub29wO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bm9vcC10ZW1wbGF0ZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgc3RhY2t0cmFjZV9wYXJzZXJfMSA9IHJlcXVpcmUoXCJzdGFja3RyYWNlLXBhcnNlclwiKTtcbnZhciByZWdleE5leHRTdGF0aWMgPSAvXFwvX25leHQoXFwvc3RhdGljXFwvLispL2c7XG5mdW5jdGlvbiBwYXJzZVN0YWNrKHN0YWNrKSB7XG4gICAgdmFyIGZyYW1lcyA9IHN0YWNrdHJhY2VfcGFyc2VyXzEucGFyc2Uoc3RhY2spO1xuICAgIHJldHVybiBmcmFtZXMubWFwKGZ1bmN0aW9uIChmcmFtZSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHVybCA9IG5ldyBVUkwoZnJhbWUuZmlsZSk7XG4gICAgICAgICAgICB2YXIgcmVzID0gcmVnZXhOZXh0U3RhdGljLmV4ZWModXJsLnBhdGhuYW1lKTtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZGlzdERpciA9IChfYiA9IChfYSA9IHByb2Nlc3MuZW52Ll9fTkVYVF9ESVNUX0RJUikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnJlcGxhY2UoL1xcXFwvZywgJy8nKSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRpc3REaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhbWUuZmlsZSA9ICdmaWxlOi8vJyArIGRpc3REaXIuY29uY2F0KHJlcy5wb3AoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChfYykgeyB9XG4gICAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9KTtcbn1cbmV4cG9ydHMucGFyc2VTdGFjayA9IHBhcnNlU3RhY2s7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZVN0YWNrLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG52YXIgX19nZW5lcmF0b3IgPSAodGhpcyAmJiB0aGlzLl9fZ2VuZXJhdG9yKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gICAgfVxufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBnZXRPcmlnaW5hbFN0YWNrRnJhbWVzKGlzU2VydmVyU2lkZSwgZnJhbWVzKSB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGZyYW1lcy5tYXAoZnVuY3Rpb24gKGZyYW1lKSB7IHJldHVybiBnZXRPcmlnaW5hbFN0YWNrRnJhbWUoaXNTZXJ2ZXJTaWRlLCBmcmFtZSk7IH0pKTtcbn1cbmV4cG9ydHMuZ2V0T3JpZ2luYWxTdGFja0ZyYW1lcyA9IGdldE9yaWdpbmFsU3RhY2tGcmFtZXM7XG5mdW5jdGlvbiBnZXRPcmlnaW5hbFN0YWNrRnJhbWUoaXNTZXJ2ZXJTaWRlLCBzb3VyY2UpIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGZ1bmN0aW9uIF9nZXRPcmlnaW5hbFN0YWNrRnJhbWUoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2U7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwYXJhbXMsIGtleSwgY29udHJvbGxlciwgdG0sIHJlcywgX2YsIF9nLCBfaCwgYm9keTtcbiAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2opIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9qLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoJ2lzU2VydmVyU2lkZScsIFN0cmluZyhpc1NlcnZlclNpZGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCAoKF9hID0gc291cmNlW2tleV0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcnKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0bSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY29udHJvbGxlci5hYm9ydCgpOyB9LCAzMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHNlbGZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZldGNoKChwcm9jZXNzLmVudi5fX05FWFRfUk9VVEVSX0JBU0VQQVRIIHx8ICcnKSArIFwiL19fbmV4dGpzX29yaWdpbmFsLXN0YWNrLWZyYW1lP1wiICsgcGFyYW1zLnRvU3RyaW5nKCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pW1wiZmluYWxseVwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBfai5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISghcmVzLm9rIHx8IHJlcy5zdGF0dXMgPT09IDIwNCkpIHJldHVybiBbMyAvKmJyZWFrKi8sIDNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgX2cgPSAoX2YgPSBQcm9taXNlKS5yZWplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBfaCA9IEVycm9yLmJpbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCByZXMudGV4dCgpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gWzIgLypyZXR1cm4qLywgX2cuYXBwbHkoX2YsIFtuZXcgKF9oLmFwcGx5KEVycm9yLCBbdm9pZCAwLCBfai5zZW50KCldKSkoKV0pXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiByZXR1cm4gWzQgLyp5aWVsZCovLCByZXMuanNvbigpXTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IF9qLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkOiAhQm9vbGVhbigoX2UgPSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29sbGFwc2VkICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKF9iID0gc291cmNlLmZpbGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpIHx8ICgoX2QgPSAoX2MgPSBib2R5Lm9yaWdpbmFsU3RhY2tGcmFtZSkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmZpbGUpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pbmNsdWRlcygnbm9kZV9tb2R1bGVzJykpKSkgIT09IG51bGwgJiYgX2UgIT09IHZvaWQgMCA/IF9lIDogdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVN0YWNrRnJhbWU6IHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFja0ZyYW1lOiBib2R5Lm9yaWdpbmFsU3RhY2tGcmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxDb2RlRnJhbWU6IGJvZHkub3JpZ2luYWxDb2RlRnJhbWUgfHwgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCEoKChfYSA9IHNvdXJjZS5maWxlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhcnRzV2l0aCgnd2VicGFjay1pbnRlcm5hbDonKSkgfHwgKChfYiA9IHNvdXJjZS5maWxlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iuc3RhcnRzV2l0aCgnZmlsZTonKSkpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICAgICAgZXJyb3I6IGZhbHNlLFxuICAgICAgICAgICAgcmVhc29uOiBudWxsLFxuICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICBleHBhbmRlZDogZmFsc2UsXG4gICAgICAgICAgICBzb3VyY2VTdGFja0ZyYW1lOiBzb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbFN0YWNrRnJhbWU6IG51bGwsXG4gICAgICAgICAgICBvcmlnaW5hbENvZGVGcmFtZTogbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9nZXRPcmlnaW5hbFN0YWNrRnJhbWUoKVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICAgIHJlYXNvbjogKF9iID0gKF9hID0gZXJyID09PSBudWxsIHx8IGVyciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyLm1lc3NhZ2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGVyciA9PT0gbnVsbCB8fCBlcnIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVyci50b1N0cmluZygpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAnVW5rbm93biBFcnJvcicsXG4gICAgICAgICAgICBleHRlcm5hbDogZmFsc2UsXG4gICAgICAgICAgICBleHBhbmRlZDogZmFsc2UsXG4gICAgICAgICAgICBzb3VyY2VTdGFja0ZyYW1lOiBzb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbFN0YWNrRnJhbWU6IG51bGwsXG4gICAgICAgICAgICBvcmlnaW5hbENvZGVGcmFtZTogbnVsbFxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0T3JpZ2luYWxTdGFja0ZyYW1lID0gZ2V0T3JpZ2luYWxTdGFja0ZyYW1lO1xuZnVuY3Rpb24gZ2V0RnJhbWVTb3VyY2UoZnJhbWUpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIHN0ciA9ICcnO1xuICAgIHRyeSB7XG4gICAgICAgIHZhciB1ID0gbmV3IFVSTChmcmFtZS5maWxlKTtcbiAgICAgICAgLy8gU3RyaXAgdGhlIG9yaWdpbiBmb3Igc2FtZS1vcmlnaW4gc2NyaXB0cy5cbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgKChfYSA9IGdsb2JhbFRoaXMubG9jYXRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vcmlnaW4pICE9PSB1Lm9yaWdpbikge1xuICAgICAgICAgICAgLy8gVVJMcyBjYW4gYmUgdmFsaWQgd2l0aG91dCBhbiBgb3JpZ2luYCwgc28gbG9uZyBhcyB0aGV5IGhhdmUgYVxuICAgICAgICAgICAgLy8gYHByb3RvY29sYC4gSG93ZXZlciwgYG9yaWdpbmAgaXMgcHJlZmVycmVkLlxuICAgICAgICAgICAgaWYgKHUub3JpZ2luID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gdS5wcm90b2NvbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0ciArPSB1Lm9yaWdpbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpcCBxdWVyeSBzdHJpbmcgaW5mb3JtYXRpb24gYXMgaXQncyB0eXBpY2FsbHkgdG9vIHZlcmJvc2UgdG8gYmVcbiAgICAgICAgLy8gbWVhbmluZ2Z1bC5cbiAgICAgICAgc3RyICs9IHUucGF0aG5hbWU7XG4gICAgICAgIHN0ciArPSAnICc7XG4gICAgfVxuICAgIGNhdGNoIChfYikge1xuICAgICAgICBzdHIgKz0gKGZyYW1lLmZpbGUgfHwgJyh1bmtub3duKScpICsgJyAnO1xuICAgIH1cbiAgICBpZiAoZnJhbWUubGluZU51bWJlciAhPSBudWxsKSB7XG4gICAgICAgIGlmIChmcmFtZS5jb2x1bW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgc3RyICs9IFwiKFwiICsgZnJhbWUubGluZU51bWJlciArIFwiOlwiICsgZnJhbWUuY29sdW1uICsgXCIpIFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RyICs9IFwiKFwiICsgZnJhbWUubGluZU51bWJlciArIFwiKSBcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RyLnNsaWNlKDAsIC0xKTtcbn1cbmV4cG9ydHMuZ2V0RnJhbWVTb3VyY2UgPSBnZXRGcmFtZVNvdXJjZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0YWNrLWZyYW1lLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBSZWFjdCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhY3RcIikpO1xuZnVuY3Rpb24gdXNlT25DbGlja091dHNpZGUoZWwsIGhhbmRsZXIpIHtcbiAgICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoZWwgPT0gbnVsbCB8fCBoYW5kbGVyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgLy8gRG8gbm90aGluZyBpZiBjbGlja2luZyByZWYncyBlbGVtZW50IG9yIGRlc2NlbmRlbnQgZWxlbWVudHNcbiAgICAgICAgICAgIGlmICghZWwgfHwgZWwuY29udGFpbnMoZS50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlcihlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHJvb3QgPSBlbC5nZXRSb290Tm9kZSgpO1xuICAgICAgICByb290LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGxpc3RlbmVyKTtcbiAgICAgICAgcm9vdC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICByb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBsaXN0ZW5lcik7XG4gICAgICAgIH07XG4gICAgfSwgW2hhbmRsZXIsIGVsXSk7XG59XG5leHBvcnRzLnVzZU9uQ2xpY2tPdXRzaWRlID0gdXNlT25DbGlja091dHNpZGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11c2Utb24tY2xpY2stb3V0c2lkZS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX21ha2VUZW1wbGF0ZU9iamVjdCA9ICh0aGlzICYmIHRoaXMuX19tYWtlVGVtcGxhdGVPYmplY3QpIHx8IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gICAgcmV0dXJuIGNvb2tlZDtcbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIFJlYWN0ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgbm9vcF90ZW1wbGF0ZV8xID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvbm9vcC10ZW1wbGF0ZVwiKTtcbmZ1bmN0aW9uIEJhc2UoKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgICAgX19odG1sOiBub29wX3RlbXBsYXRlXzEubm9vcCh0ZW1wbGF0ZU9iamVjdF8xIHx8ICh0ZW1wbGF0ZU9iamVjdF8xID0gX19tYWtlVGVtcGxhdGVPYmplY3QoW1wiXFxuICAgICAgICAgIDpob3N0IHtcXG4gICAgICAgICAgICAtLXNpemUtZ2FwLWhhbGY6IDRweDtcXG4gICAgICAgICAgICAtLXNpemUtZ2FwOiA4cHg7XFxuICAgICAgICAgICAgLS1zaXplLWdhcC1kb3VibGU6IDE2cHg7XFxuICAgICAgICAgICAgLS1zaXplLWdhcC1xdWFkOiAzMnB4O1xcblxcbiAgICAgICAgICAgIC0tc2l6ZS1mb250LXNtYWxsOiAxNHB4O1xcbiAgICAgICAgICAgIC0tc2l6ZS1mb250OiAxNnB4O1xcbiAgICAgICAgICAgIC0tc2l6ZS1mb250LWJpZzogMjBweDtcXG4gICAgICAgICAgICAtLXNpemUtZm9udC1iaWdnZXI6IDI0cHg7XFxuXFxuICAgICAgICAgICAgLS1jb2xvci1hY2NlbnRzLTE6ICM4MDgwODA7XFxuICAgICAgICAgICAgLS1jb2xvci1hY2NlbnRzLTI6ICMyMjIyMjI7XFxuICAgICAgICAgICAgLS1jb2xvci1hY2NlbnRzLTM6ICM0MDQwNDA7XFxuXFxuICAgICAgICAgICAgLS1mb250LXN0YWNrLW1vbm9zcGFjZTogJ1NGTW9uby1SZWd1bGFyJywgQ29uc29sYXMsXFxuICAgICAgICAgICAgICAnTGliZXJhdGlvbiBNb25vJywgTWVubG8sIENvdXJpZXIsIG1vbm9zcGFjZTtcXG5cXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktc2VsZWN0aW9uOiByZ2JhKDk1LCAxMjYsIDE1MSwgMC40OCk7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJnOiAjMTExMTExO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1mZzogI2NjY2NjYztcXG5cXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktd2hpdGU6ICM3Nzc3Nzc7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJsYWNrOiAjMTQxNDE0O1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1ibHVlOiAjMDBhYWZmO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1jeWFuOiAjODhkZGZmO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1ncmVlbjogIzk4ZWM2NTtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktbWFnZW50YTogI2FhODhmZjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktcmVkOiAjZmY1NTU1O1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS15ZWxsb3c6ICNmZmNjMzM7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJyaWdodC13aGl0ZTogI2ZmZmZmZjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LWJsYWNrOiAjNzc3Nzc3O1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1icmlnaHQtYmx1ZTogIzMzYmJmZjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LWN5YW46ICNiYmVjZmY7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJyaWdodC1ncmVlbjogI2I2ZjI5MjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LW1hZ2VudGE6ICNjZWJiZmY7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJyaWdodC1yZWQ6ICNmZjg4ODg7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJyaWdodC15ZWxsb3c6ICNmZmQ5NjY7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgLm1vbm8ge1xcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1mb250LXN0YWNrLW1vbm9zcGFjZSk7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgaDEsXFxuICAgICAgICAgIGgyLFxcbiAgICAgICAgICBoMyxcXG4gICAgICAgICAgaDQsXFxuICAgICAgICAgIGg1LFxcbiAgICAgICAgICBoNiB7XFxuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogdmFyKC0tc2l6ZS1nYXApO1xcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XFxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBoMSB7XFxuICAgICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGgyIHtcXG4gICAgICAgICAgICBmb250LXNpemU6IDMycHg7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaDMge1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBoNCB7XFxuICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGg1IHtcXG4gICAgICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaDYge1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgXCJdLCBbXCJcXG4gICAgICAgICAgOmhvc3Qge1xcbiAgICAgICAgICAgIC0tc2l6ZS1nYXAtaGFsZjogNHB4O1xcbiAgICAgICAgICAgIC0tc2l6ZS1nYXA6IDhweDtcXG4gICAgICAgICAgICAtLXNpemUtZ2FwLWRvdWJsZTogMTZweDtcXG4gICAgICAgICAgICAtLXNpemUtZ2FwLXF1YWQ6IDMycHg7XFxuXFxuICAgICAgICAgICAgLS1zaXplLWZvbnQtc21hbGw6IDE0cHg7XFxuICAgICAgICAgICAgLS1zaXplLWZvbnQ6IDE2cHg7XFxuICAgICAgICAgICAgLS1zaXplLWZvbnQtYmlnOiAyMHB4O1xcbiAgICAgICAgICAgIC0tc2l6ZS1mb250LWJpZ2dlcjogMjRweDtcXG5cXG4gICAgICAgICAgICAtLWNvbG9yLWFjY2VudHMtMTogIzgwODA4MDtcXG4gICAgICAgICAgICAtLWNvbG9yLWFjY2VudHMtMjogIzIyMjIyMjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFjY2VudHMtMzogIzQwNDA0MDtcXG5cXG4gICAgICAgICAgICAtLWZvbnQtc3RhY2stbW9ub3NwYWNlOiAnU0ZNb25vLVJlZ3VsYXInLCBDb25zb2xhcyxcXG4gICAgICAgICAgICAgICdMaWJlcmF0aW9uIE1vbm8nLCBNZW5sbywgQ291cmllciwgbW9ub3NwYWNlO1xcblxcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1zZWxlY3Rpb246IHJnYmEoOTUsIDEyNiwgMTUxLCAwLjQ4KTtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYmc6ICMxMTExMTE7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWZnOiAjY2NjY2NjO1xcblxcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS13aGl0ZTogIzc3Nzc3NztcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYmxhY2s6ICMxNDE0MTQ7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJsdWU6ICMwMGFhZmY7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWN5YW46ICM4OGRkZmY7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWdyZWVuOiAjOThlYzY1O1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1tYWdlbnRhOiAjYWE4OGZmO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1yZWQ6ICNmZjU1NTU7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLXllbGxvdzogI2ZmY2MzMztcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LXdoaXRlOiAjZmZmZmZmO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1icmlnaHQtYmxhY2s6ICM3Nzc3Nzc7XFxuICAgICAgICAgICAgLS1jb2xvci1hbnNpLWJyaWdodC1ibHVlOiAjMzNiYmZmO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1icmlnaHQtY3lhbjogI2JiZWNmZjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LWdyZWVuOiAjYjZmMjkyO1xcbiAgICAgICAgICAgIC0tY29sb3ItYW5zaS1icmlnaHQtbWFnZW50YTogI2NlYmJmZjtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LXJlZDogI2ZmODg4ODtcXG4gICAgICAgICAgICAtLWNvbG9yLWFuc2ktYnJpZ2h0LXllbGxvdzogI2ZmZDk2NjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICAubW9ubyB7XFxuICAgICAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc3RhY2stbW9ub3NwYWNlKTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBoMSxcXG4gICAgICAgICAgaDIsXFxuICAgICAgICAgIGgzLFxcbiAgICAgICAgICBoNCxcXG4gICAgICAgICAgaDUsXFxuICAgICAgICAgIGg2IHtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiB2YXIoLS1zaXplLWdhcCk7XFxuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcXG4gICAgICAgICAgICBsaW5lLWhlaWdodDogMS41O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGgxIHtcXG4gICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaDIge1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBoMyB7XFxuICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGg0IHtcXG4gICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaDUge1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBoNiB7XFxuICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICAgICAgICB9XFxuICAgICAgICBcIl0pKSlcbiAgICAgICAgfSB9KSk7XG59XG5leHBvcnRzLkJhc2UgPSBCYXNlO1xudmFyIHRlbXBsYXRlT2JqZWN0XzE7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1CYXNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gKHRoaXMgJiYgdGhpcy5fX21ha2VUZW1wbGF0ZU9iamVjdCkgfHwgZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgICByZXR1cm4gY29va2VkO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBzdHlsZXNfMSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL0NvZGVGcmFtZS9zdHlsZXNcIik7XG52YXIgRGlhbG9nXzEgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9EaWFsb2dcIik7XG52YXIgc3R5bGVzXzIgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9MZWZ0UmlnaHREaWFsb2dIZWFkZXIvc3R5bGVzXCIpO1xudmFyIHN0eWxlc18zID0gcmVxdWlyZShcIi4uL2NvbXBvbmVudHMvT3ZlcmxheS9zdHlsZXNcIik7XG52YXIgc3R5bGVzXzQgPSByZXF1aXJlKFwiLi4vY29tcG9uZW50cy9UZXJtaW5hbC9zdHlsZXNcIik7XG52YXIgVG9hc3RfMSA9IHJlcXVpcmUoXCIuLi9jb21wb25lbnRzL1RvYXN0XCIpO1xudmFyIEJ1aWxkRXJyb3JfMSA9IHJlcXVpcmUoXCIuLi9jb250YWluZXIvQnVpbGRFcnJvclwiKTtcbnZhciBFcnJvcnNfMSA9IHJlcXVpcmUoXCIuLi9jb250YWluZXIvRXJyb3JzXCIpO1xudmFyIFJ1bnRpbWVFcnJvcl8xID0gcmVxdWlyZShcIi4uL2NvbnRhaW5lci9SdW50aW1lRXJyb3JcIik7XG52YXIgbm9vcF90ZW1wbGF0ZV8xID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvbm9vcC10ZW1wbGF0ZVwiKTtcbmZ1bmN0aW9uIENvbXBvbmVudFN0eWxlcygpIHtcbiAgICByZXR1cm4gKFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiLCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7XG4gICAgICAgICAgICBfX2h0bWw6IG5vb3BfdGVtcGxhdGVfMS5ub29wKHRlbXBsYXRlT2JqZWN0XzEgfHwgKHRlbXBsYXRlT2JqZWN0XzEgPSBfX21ha2VUZW1wbGF0ZU9iamVjdChbXCJcXG4gICAgICAgICAgXCIsIFwiXFxuICAgICAgICAgIFwiLCBcIlxcbiAgICAgICAgICBcIiwgXCJcXG4gICAgICAgICAgXCIsIFwiXFxuICAgICAgICAgIFwiLCBcIlxcbiAgICAgICAgICBcIiwgXCJcXG5cXG4gICAgICAgICAgXCIsIFwiXFxuICAgICAgICAgIFwiLCBcIlxcbiAgICAgICAgICBcIiwgXCJcXG4gICAgICAgIFwiXSwgW1wiXFxuICAgICAgICAgIFwiLCBcIlxcbiAgICAgICAgICBcIiwgXCJcXG4gICAgICAgICAgXCIsIFwiXFxuICAgICAgICAgIFwiLCBcIlxcbiAgICAgICAgICBcIiwgXCJcXG4gICAgICAgICAgXCIsIFwiXFxuXFxuICAgICAgICAgIFwiLCBcIlxcbiAgICAgICAgICBcIiwgXCJcXG4gICAgICAgICAgXCIsIFwiXFxuICAgICAgICBcIl0pKSwgc3R5bGVzXzMuc3R5bGVzLCBUb2FzdF8xLnN0eWxlcywgRGlhbG9nXzEuc3R5bGVzLCBzdHlsZXNfMi5zdHlsZXMsIHN0eWxlc18xLnN0eWxlcywgc3R5bGVzXzQuc3R5bGVzLCBCdWlsZEVycm9yXzEuc3R5bGVzLCBFcnJvcnNfMS5zdHlsZXMsIFJ1bnRpbWVFcnJvcl8xLnN0eWxlcylcbiAgICAgICAgfSB9KSk7XG59XG5leHBvcnRzLkNvbXBvbmVudFN0eWxlcyA9IENvbXBvbmVudFN0eWxlcztcbnZhciB0ZW1wbGF0ZU9iamVjdF8xO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29tcG9uZW50U3R5bGVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gKHRoaXMgJiYgdGhpcy5fX21ha2VUZW1wbGF0ZU9iamVjdCkgfHwgZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgICByZXR1cm4gY29va2VkO1xufTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XG4gICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG52YXIgUmVhY3QgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBub29wX3RlbXBsYXRlXzEgPSByZXF1aXJlKFwiLi4vaGVscGVycy9ub29wLXRlbXBsYXRlXCIpO1xuZnVuY3Rpb24gQ3NzUmVzZXQoKSB7XG4gICAgcmV0dXJuIChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDoge1xuICAgICAgICAgICAgX19odG1sOiBub29wX3RlbXBsYXRlXzEubm9vcCh0ZW1wbGF0ZU9iamVjdF8xIHx8ICh0ZW1wbGF0ZU9iamVjdF8xID0gX19tYWtlVGVtcGxhdGVPYmplY3QoW1wiXFxuICAgICAgICAgIDpob3N0IHtcXG4gICAgICAgICAgICBhbGw6IGluaXRpYWw7XFxuXFxuICAgICAgICAgICAgLyogdGhlIGRpcmVjdGlvbiBwcm9wZXJ0eSBpcyBub3QgcmVzZXQgYnkgJ2FsbCcgKi9cXG4gICAgICAgICAgICBkaXJlY3Rpb246IGx0cjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICAvKiFcXG4gICAgICAgICAgICogQm9vdHN0cmFwIFJlYm9vdCB2NC40LjEgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXFxuICAgICAgICAgICAqIENvcHlyaWdodCAyMDExLTIwMTkgVGhlIEJvb3RzdHJhcCBBdXRob3JzXFxuICAgICAgICAgICAqIENvcHlyaWdodCAyMDExLTIwMTkgVHdpdHRlciwgSW5jLlxcbiAgICAgICAgICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxcbiAgICAgICAgICAgKiBGb3JrZWQgZnJvbSBOb3JtYWxpemUuY3NzLCBsaWNlbnNlZCBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZClcXG4gICAgICAgICAgICovXFxuICAgICAgICAgICosXFxuICAgICAgICAgICo6OmJlZm9yZSxcXG4gICAgICAgICAgKjo6YWZ0ZXIge1xcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgOmhvc3Qge1xcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjE1O1xcbiAgICAgICAgICAgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcXG4gICAgICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYXJ0aWNsZSxcXG4gICAgICAgICAgYXNpZGUsXFxuICAgICAgICAgIGZpZ2NhcHRpb24sXFxuICAgICAgICAgIGZpZ3VyZSxcXG4gICAgICAgICAgZm9vdGVyLFxcbiAgICAgICAgICBoZWFkZXIsXFxuICAgICAgICAgIGhncm91cCxcXG4gICAgICAgICAgbWFpbixcXG4gICAgICAgICAgbmF2LFxcbiAgICAgICAgICBzZWN0aW9uIHtcXG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICA6aG9zdCB7XFxuICAgICAgICAgICAgbWFyZ2luOiAwO1xcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90byxcXG4gICAgICAgICAgICAgICdIZWx2ZXRpY2EgTmV1ZScsIEFyaWFsLCAnTm90byBTYW5zJywgc2Fucy1zZXJpZixcXG4gICAgICAgICAgICAgICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLFxcbiAgICAgICAgICAgICAgJ05vdG8gQ29sb3IgRW1vamknO1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gICAgICAgICAgICBmb250LXdlaWdodDogNDAwO1xcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICAgICAgICAgICAgY29sb3I6ICMyMTI1Mjk7XFxuICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIFt0YWJpbmRleD0nLTEnXTpmb2N1czpub3QoOmZvY3VzLXZpc2libGUpIHtcXG4gICAgICAgICAgICBvdXRsaW5lOiAwICFpbXBvcnRhbnQ7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgaHIge1xcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xcbiAgICAgICAgICAgIGhlaWdodDogMDtcXG4gICAgICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBoMSxcXG4gICAgICAgICAgaDIsXFxuICAgICAgICAgIGgzLFxcbiAgICAgICAgICBoNCxcXG4gICAgICAgICAgaDUsXFxuICAgICAgICAgIGg2IHtcXG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBwIHtcXG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYWJiclt0aXRsZV0sXFxuICAgICAgICAgIGFiYnJbZGF0YS1vcmlnaW5hbC10aXRsZV0ge1xcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbiAgICAgICAgICAgIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcXG4gICAgICAgICAgICBjdXJzb3I6IGhlbHA7XFxuICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogMDtcXG4gICAgICAgICAgICAtd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwLWluazogbm9uZTtcXG4gICAgICAgICAgICB0ZXh0LWRlY29yYXRpb24tc2tpcC1pbms6IG5vbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYWRkcmVzcyB7XFxuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcXG4gICAgICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7XFxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgb2wsXFxuICAgICAgICAgIHVsLFxcbiAgICAgICAgICBkbCB7XFxuICAgICAgICAgICAgbWFyZ2luLXRvcDogMDtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIG9sIG9sLFxcbiAgICAgICAgICB1bCB1bCxcXG4gICAgICAgICAgb2wgdWwsXFxuICAgICAgICAgIHVsIG9sIHtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGR0IHtcXG4gICAgICAgICAgICBmb250LXdlaWdodDogNzAwO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGRkIHtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYmxvY2txdW90ZSB7XFxuICAgICAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBiLFxcbiAgICAgICAgICBzdHJvbmcge1xcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc21hbGwge1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogODAlO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHN1YixcXG4gICAgICAgICAgc3VwIHtcXG4gICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICAgICAgICAgICAgZm9udC1zaXplOiA3NSU7XFxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDA7XFxuICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHN1YiB7XFxuICAgICAgICAgICAgYm90dG9tOiAtMC4yNWVtO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHN1cCB7XFxuICAgICAgICAgICAgdG9wOiAtMC41ZW07XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYSB7XFxuICAgICAgICAgICAgY29sb3I6ICMwMDdiZmY7XFxuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGE6aG92ZXIge1xcbiAgICAgICAgICAgIGNvbG9yOiAjMDA1NmIzO1xcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGE6bm90KFtocmVmXSkge1xcbiAgICAgICAgICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBhOm5vdChbaHJlZl0pOmhvdmVyIHtcXG4gICAgICAgICAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgcHJlLFxcbiAgICAgICAgICBjb2RlLFxcbiAgICAgICAgICBrYmQsXFxuICAgICAgICAgIHNhbXAge1xcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsXFxuICAgICAgICAgICAgICAnTGliZXJhdGlvbiBNb25vJywgJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMWVtO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHByZSB7XFxuICAgICAgICAgICAgbWFyZ2luLXRvcDogMDtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGZpZ3VyZSB7XFxuICAgICAgICAgICAgbWFyZ2luOiAwIDAgMTZweDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBpbWcge1xcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgICAgICAgICAgYm9yZGVyLXN0eWxlOiBub25lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHN2ZyB7XFxuICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcXG4gICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHRhYmxlIHtcXG4gICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGNhcHRpb24ge1xcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMnB4O1xcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xcbiAgICAgICAgICAgIGNvbG9yOiAjNmM3NTdkO1xcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XFxuICAgICAgICAgICAgY2FwdGlvbi1zaWRlOiBib3R0b207XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgdGgge1xcbiAgICAgICAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgbGFiZWwge1xcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uIHtcXG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGJ1dHRvbjpmb2N1cyB7XFxuICAgICAgICAgICAgb3V0bGluZTogMXB4IGRvdHRlZDtcXG4gICAgICAgICAgICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgaW5wdXQsXFxuICAgICAgICAgIGJ1dHRvbixcXG4gICAgICAgICAgc2VsZWN0LFxcbiAgICAgICAgICBvcHRncm91cCxcXG4gICAgICAgICAgdGV4dGFyZWEge1xcbiAgICAgICAgICAgIG1hcmdpbjogMDtcXG4gICAgICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcXG4gICAgICAgICAgICBmb250LXNpemU6IGluaGVyaXQ7XFxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uLFxcbiAgICAgICAgICBpbnB1dCB7XFxuICAgICAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uLFxcbiAgICAgICAgICBzZWxlY3Qge1xcbiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHNlbGVjdCB7XFxuICAgICAgICAgICAgd29yZC13cmFwOiBub3JtYWw7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uLFxcbiAgICAgICAgICBbdHlwZT0nYnV0dG9uJ10sXFxuICAgICAgICAgIFt0eXBlPSdyZXNldCddLFxcbiAgICAgICAgICBbdHlwZT0nc3VibWl0J10ge1xcbiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGJ1dHRvbjpub3QoOmRpc2FibGVkKSxcXG4gICAgICAgICAgW3R5cGU9J2J1dHRvbiddOm5vdCg6ZGlzYWJsZWQpLFxcbiAgICAgICAgICBbdHlwZT0ncmVzZXQnXTpub3QoOmRpc2FibGVkKSxcXG4gICAgICAgICAgW3R5cGU9J3N1Ym1pdCddOm5vdCg6ZGlzYWJsZWQpIHtcXG4gICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxcbiAgICAgICAgICBbdHlwZT0nYnV0dG9uJ106Oi1tb3otZm9jdXMtaW5uZXIsXFxuICAgICAgICAgIFt0eXBlPSdyZXNldCddOjotbW96LWZvY3VzLWlubmVyLFxcbiAgICAgICAgICBbdHlwZT0nc3VibWl0J106Oi1tb3otZm9jdXMtaW5uZXIge1xcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XFxuICAgICAgICAgICAgYm9yZGVyLXN0eWxlOiBub25lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGlucHV0W3R5cGU9J3JhZGlvJ10sXFxuICAgICAgICAgIGlucHV0W3R5cGU9J2NoZWNrYm94J10ge1xcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICAgICAgICAgICAgcGFkZGluZzogMDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBpbnB1dFt0eXBlPSdkYXRlJ10sXFxuICAgICAgICAgIGlucHV0W3R5cGU9J3RpbWUnXSxcXG4gICAgICAgICAgaW5wdXRbdHlwZT0nZGF0ZXRpbWUtbG9jYWwnXSxcXG4gICAgICAgICAgaW5wdXRbdHlwZT0nbW9udGgnXSB7XFxuICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBsaXN0Ym94O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHRleHRhcmVhIHtcXG4gICAgICAgICAgICBvdmVyZmxvdzogYXV0bztcXG4gICAgICAgICAgICByZXNpemU6IHZlcnRpY2FsO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGZpZWxkc2V0IHtcXG4gICAgICAgICAgICBtaW4td2lkdGg6IDA7XFxuICAgICAgICAgICAgcGFkZGluZzogMDtcXG4gICAgICAgICAgICBtYXJnaW46IDA7XFxuICAgICAgICAgICAgYm9yZGVyOiAwO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGxlZ2VuZCB7XFxuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XFxuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XFxuICAgICAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XFxuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gICAgICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gICAgICAgICAgICBjb2xvcjogaW5oZXJpdDtcXG4gICAgICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHByb2dyZXNzIHtcXG4gICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgW3R5cGU9J251bWJlciddOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxcbiAgICAgICAgICBbdHlwZT0nbnVtYmVyJ106Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xcbiAgICAgICAgICAgIGhlaWdodDogYXV0bztcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBbdHlwZT0nc2VhcmNoJ10ge1xcbiAgICAgICAgICAgIG91dGxpbmUtb2Zmc2V0OiAtMnB4O1xcbiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBbdHlwZT0nc2VhcmNoJ106Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xcbiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICA6Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcXG4gICAgICAgICAgICBmb250OiBpbmhlcml0O1xcbiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIG91dHB1dCB7XFxuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHN1bW1hcnkge1xcbiAgICAgICAgICAgIGRpc3BsYXk6IGxpc3QtaXRlbTtcXG4gICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgdGVtcGxhdGUge1xcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgW2hpZGRlbl0ge1xcbiAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcXG4gICAgICAgICAgfVxcbiAgICAgICAgXCJdLCBbXCJcXG4gICAgICAgICAgOmhvc3Qge1xcbiAgICAgICAgICAgIGFsbDogaW5pdGlhbDtcXG5cXG4gICAgICAgICAgICAvKiB0aGUgZGlyZWN0aW9uIHByb3BlcnR5IGlzIG5vdCByZXNldCBieSAnYWxsJyAqL1xcbiAgICAgICAgICAgIGRpcmVjdGlvbjogbHRyO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIC8qIVxcbiAgICAgICAgICAgKiBCb290c3RyYXAgUmVib290IHY0LjQuMSAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcXG4gICAgICAgICAgICogQ29weXJpZ2h0IDIwMTEtMjAxOSBUaGUgQm9vdHN0cmFwIEF1dGhvcnNcXG4gICAgICAgICAgICogQ29weXJpZ2h0IDIwMTEtMjAxOSBUd2l0dGVyLCBJbmMuXFxuICAgICAgICAgICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXFxuICAgICAgICAgICAqIEZvcmtlZCBmcm9tIE5vcm1hbGl6ZS5jc3MsIGxpY2Vuc2VkIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kKVxcbiAgICAgICAgICAgKi9cXG4gICAgICAgICAgKixcXG4gICAgICAgICAgKjo6YmVmb3JlLFxcbiAgICAgICAgICAqOjphZnRlciB7XFxuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICA6aG9zdCB7XFxuICAgICAgICAgICAgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7XFxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMTU7XFxuICAgICAgICAgICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xcbiAgICAgICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBhcnRpY2xlLFxcbiAgICAgICAgICBhc2lkZSxcXG4gICAgICAgICAgZmlnY2FwdGlvbixcXG4gICAgICAgICAgZmlndXJlLFxcbiAgICAgICAgICBmb290ZXIsXFxuICAgICAgICAgIGhlYWRlcixcXG4gICAgICAgICAgaGdyb3VwLFxcbiAgICAgICAgICBtYWluLFxcbiAgICAgICAgICBuYXYsXFxuICAgICAgICAgIHNlY3Rpb24ge1xcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIDpob3N0IHtcXG4gICAgICAgICAgICBtYXJnaW46IDA7XFxuICAgICAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLFxcbiAgICAgICAgICAgICAgJ0hlbHZldGljYSBOZXVlJywgQXJpYWwsICdOb3RvIFNhbnMnLCBzYW5zLXNlcmlmLFxcbiAgICAgICAgICAgICAgJ0FwcGxlIENvbG9yIEVtb2ppJywgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCcsXFxuICAgICAgICAgICAgICAnTm90byBDb2xvciBFbW9qaSc7XFxuICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gICAgICAgICAgICBjb2xvcjogIzIxMjUyOTtcXG4gICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgW3RhYmluZGV4PSctMSddOmZvY3VzOm5vdCg6Zm9jdXMtdmlzaWJsZSkge1xcbiAgICAgICAgICAgIG91dGxpbmU6IDAgIWltcG9ydGFudDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBociB7XFxuICAgICAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XFxuICAgICAgICAgICAgaGVpZ2h0OiAwO1xcbiAgICAgICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGgxLFxcbiAgICAgICAgICBoMixcXG4gICAgICAgICAgaDMsXFxuICAgICAgICAgIGg0LFxcbiAgICAgICAgICBoNSxcXG4gICAgICAgICAgaDYge1xcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IDA7XFxuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIHAge1xcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IDA7XFxuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBhYmJyW3RpdGxlXSxcXG4gICAgICAgICAgYWJicltkYXRhLW9yaWdpbmFsLXRpdGxlXSB7XFxuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxuICAgICAgICAgICAgLXdlYmtpdC10ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSBkb3R0ZWQ7XFxuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xcbiAgICAgICAgICAgIGN1cnNvcjogaGVscDtcXG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiAwO1xcbiAgICAgICAgICAgIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXAtaW5rOiBub25lO1xcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbi1za2lwLWluazogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBhZGRyZXNzIHtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gICAgICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBvbCxcXG4gICAgICAgICAgdWwsXFxuICAgICAgICAgIGRsIHtcXG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgb2wgb2wsXFxuICAgICAgICAgIHVsIHVsLFxcbiAgICAgICAgICBvbCB1bCxcXG4gICAgICAgICAgdWwgb2wge1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgZHQge1xcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgZGQge1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBibG9ja3F1b3RlIHtcXG4gICAgICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGIsXFxuICAgICAgICAgIHN0cm9uZyB7XFxuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBzbWFsbCB7XFxuICAgICAgICAgICAgZm9udC1zaXplOiA4MCU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc3ViLFxcbiAgICAgICAgICBzdXAge1xcbiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gICAgICAgICAgICBmb250LXNpemU6IDc1JTtcXG4gICAgICAgICAgICBsaW5lLWhlaWdodDogMDtcXG4gICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc3ViIHtcXG4gICAgICAgICAgICBib3R0b206IC0wLjI1ZW07XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc3VwIHtcXG4gICAgICAgICAgICB0b3A6IC0wLjVlbTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBhIHtcXG4gICAgICAgICAgICBjb2xvcjogIzAwN2JmZjtcXG4gICAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XFxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYTpob3ZlciB7XFxuICAgICAgICAgICAgY29sb3I6ICMwMDU2YjM7XFxuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYTpub3QoW2hyZWZdKSB7XFxuICAgICAgICAgICAgY29sb3I6IGluaGVyaXQ7XFxuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGE6bm90KFtocmVmXSk6aG92ZXIge1xcbiAgICAgICAgICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBwcmUsXFxuICAgICAgICAgIGNvZGUsXFxuICAgICAgICAgIGtiZCxcXG4gICAgICAgICAgc2FtcCB7XFxuICAgICAgICAgICAgZm9udC1mYW1pbHk6IFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcyxcXG4gICAgICAgICAgICAgICdMaWJlcmF0aW9uIE1vbm8nLCAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7XFxuICAgICAgICAgICAgZm9udC1zaXplOiAxZW07XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgcHJlIHtcXG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgZmlndXJlIHtcXG4gICAgICAgICAgICBtYXJnaW46IDAgMCAxNnB4O1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGltZyB7XFxuICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcXG4gICAgICAgICAgICBib3JkZXItc3R5bGU6IG5vbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc3ZnIHtcXG4gICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgdGFibGUge1xcbiAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgY2FwdGlvbiB7XFxuICAgICAgICAgICAgcGFkZGluZy10b3A6IDEycHg7XFxuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEycHg7XFxuICAgICAgICAgICAgY29sb3I6ICM2Yzc1N2Q7XFxuICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcXG4gICAgICAgICAgICBjYXB0aW9uLXNpZGU6IGJvdHRvbTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICB0aCB7XFxuICAgICAgICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBsYWJlbCB7XFxuICAgICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBidXR0b24ge1xcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uOmZvY3VzIHtcXG4gICAgICAgICAgICBvdXRsaW5lOiAxcHggZG90dGVkO1xcbiAgICAgICAgICAgIG91dGxpbmU6IDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBpbnB1dCxcXG4gICAgICAgICAgYnV0dG9uLFxcbiAgICAgICAgICBzZWxlY3QsXFxuICAgICAgICAgIG9wdGdyb3VwLFxcbiAgICAgICAgICB0ZXh0YXJlYSB7XFxuICAgICAgICAgICAgbWFyZ2luOiAwO1xcbiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDtcXG4gICAgICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBidXR0b24sXFxuICAgICAgICAgIGlucHV0IHtcXG4gICAgICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBidXR0b24sXFxuICAgICAgICAgIHNlbGVjdCB7XFxuICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc2VsZWN0IHtcXG4gICAgICAgICAgICB3b3JkLXdyYXA6IG5vcm1hbDtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBidXR0b24sXFxuICAgICAgICAgIFt0eXBlPSdidXR0b24nXSxcXG4gICAgICAgICAgW3R5cGU9J3Jlc2V0J10sXFxuICAgICAgICAgIFt0eXBlPSdzdWJtaXQnXSB7XFxuICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgYnV0dG9uOm5vdCg6ZGlzYWJsZWQpLFxcbiAgICAgICAgICBbdHlwZT0nYnV0dG9uJ106bm90KDpkaXNhYmxlZCksXFxuICAgICAgICAgIFt0eXBlPSdyZXNldCddOm5vdCg6ZGlzYWJsZWQpLFxcbiAgICAgICAgICBbdHlwZT0nc3VibWl0J106bm90KDpkaXNhYmxlZCkge1xcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXFxuICAgICAgICAgIFt0eXBlPSdidXR0b24nXTo6LW1vei1mb2N1cy1pbm5lcixcXG4gICAgICAgICAgW3R5cGU9J3Jlc2V0J106Oi1tb3otZm9jdXMtaW5uZXIsXFxuICAgICAgICAgIFt0eXBlPSdzdWJtaXQnXTo6LW1vei1mb2N1cy1pbm5lciB7XFxuICAgICAgICAgICAgcGFkZGluZzogMDtcXG4gICAgICAgICAgICBib3JkZXItc3R5bGU6IG5vbmU7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgaW5wdXRbdHlwZT0ncmFkaW8nXSxcXG4gICAgICAgICAgaW5wdXRbdHlwZT0nY2hlY2tib3gnXSB7XFxuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIGlucHV0W3R5cGU9J2RhdGUnXSxcXG4gICAgICAgICAgaW5wdXRbdHlwZT0ndGltZSddLFxcbiAgICAgICAgICBpbnB1dFt0eXBlPSdkYXRldGltZS1sb2NhbCddLFxcbiAgICAgICAgICBpbnB1dFt0eXBlPSdtb250aCddIHtcXG4gICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IGxpc3Rib3g7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgdGV4dGFyZWEge1xcbiAgICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xcbiAgICAgICAgICAgIHJlc2l6ZTogdmVydGljYWw7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgZmllbGRzZXQge1xcbiAgICAgICAgICAgIG1pbi13aWR0aDogMDtcXG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xcbiAgICAgICAgICAgIG1hcmdpbjogMDtcXG4gICAgICAgICAgICBib3JkZXI6IDA7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgbGVnZW5kIHtcXG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcXG4gICAgICAgICAgICB3aWR0aDogMTAwJTtcXG4gICAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XFxuICAgICAgICAgICAgcGFkZGluZzogMDtcXG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiBpbmhlcml0O1xcbiAgICAgICAgICAgIGNvbG9yOiBpbmhlcml0O1xcbiAgICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgcHJvZ3Jlc3Mge1xcbiAgICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBbdHlwZT0nbnVtYmVyJ106Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXFxuICAgICAgICAgIFt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XFxuICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIFt0eXBlPSdzZWFyY2gnXSB7XFxuICAgICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XFxuICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIFt0eXBlPSdzZWFyY2gnXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XFxuICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xcbiAgICAgICAgICB9XFxuXFxuICAgICAgICAgIDo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xcbiAgICAgICAgICAgIGZvbnQ6IGluaGVyaXQ7XFxuICAgICAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgb3V0cHV0IHtcXG4gICAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgc3VtbWFyeSB7XFxuICAgICAgICAgICAgZGlzcGxheTogbGlzdC1pdGVtO1xcbiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICB0ZW1wbGF0ZSB7XFxuICAgICAgICAgICAgZGlzcGxheTogbm9uZTtcXG4gICAgICAgICAgfVxcblxcbiAgICAgICAgICBbaGlkZGVuXSB7XFxuICAgICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xcbiAgICAgICAgICB9XFxuICAgICAgICBcIl0pKSlcbiAgICAgICAgfSB9KSk7XG59XG5leHBvcnRzLkNzc1Jlc2V0ID0gQ3NzUmVzZXQ7XG52YXIgdGVtcGxhdGVPYmplY3RfMTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNzc1Jlc2V0LmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAoe29ubHlGaXJzdCA9IGZhbHNlfSA9IHt9KSA9PiB7XG5cdGNvbnN0IHBhdHRlcm4gPSBbXG5cdFx0J1tcXFxcdTAwMUJcXFxcdTAwOUJdW1tcXFxcXSgpIzs/XSooPzooPzooPzpbYS16QS1aXFxcXGRdKig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KScsXG5cdFx0Jyg/Oig/OlxcXFxkezEsNH0oPzo7XFxcXGR7MCw0fSkqKT9bXFxcXGRBLVBSLVRaY2YtbnRxcnk9Pjx+XSkpJ1xuXHRdLmpvaW4oJ3wnKTtcblxuXHRyZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBvbmx5Rmlyc3QgPyB1bmRlZmluZWQgOiAnZycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IGFuc2lSZWdleCA9IHJlcXVpcmUoJ2Fuc2ktcmVnZXgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdHJpbmcgPT4gdHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycgPyBzdHJpbmcucmVwbGFjZShhbnNpUmVnZXgoKSwgJycpIDogc3RyaW5nO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IEBkcnVkcnUgKGh0dHBzOi8vZ2l0aHViLmNvbS9kcnVkcnUvYW5zaV91cCksIE1JVCwgMjAxMVxuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgQU5TSV9DT0xPUlMgPSBbW3sgY29sb3I6IFwiMCwgMCwgMFwiLCBcImNsYXNzXCI6IFwiYW5zaS1ibGFja1wiIH0sIHsgY29sb3I6IFwiMTg3LCAwLCAwXCIsIFwiY2xhc3NcIjogXCJhbnNpLXJlZFwiIH0sIHsgY29sb3I6IFwiMCwgMTg3LCAwXCIsIFwiY2xhc3NcIjogXCJhbnNpLWdyZWVuXCIgfSwgeyBjb2xvcjogXCIxODcsIDE4NywgMFwiLCBcImNsYXNzXCI6IFwiYW5zaS15ZWxsb3dcIiB9LCB7IGNvbG9yOiBcIjAsIDAsIDE4N1wiLCBcImNsYXNzXCI6IFwiYW5zaS1ibHVlXCIgfSwgeyBjb2xvcjogXCIxODcsIDAsIDE4N1wiLCBcImNsYXNzXCI6IFwiYW5zaS1tYWdlbnRhXCIgfSwgeyBjb2xvcjogXCIwLCAxODcsIDE4N1wiLCBcImNsYXNzXCI6IFwiYW5zaS1jeWFuXCIgfSwgeyBjb2xvcjogXCIyNTUsMjU1LDI1NVwiLCBcImNsYXNzXCI6IFwiYW5zaS13aGl0ZVwiIH1dLCBbeyBjb2xvcjogXCI4NSwgODUsIDg1XCIsIFwiY2xhc3NcIjogXCJhbnNpLWJyaWdodC1ibGFja1wiIH0sIHsgY29sb3I6IFwiMjU1LCA4NSwgODVcIiwgXCJjbGFzc1wiOiBcImFuc2ktYnJpZ2h0LXJlZFwiIH0sIHsgY29sb3I6IFwiMCwgMjU1LCAwXCIsIFwiY2xhc3NcIjogXCJhbnNpLWJyaWdodC1ncmVlblwiIH0sIHsgY29sb3I6IFwiMjU1LCAyNTUsIDg1XCIsIFwiY2xhc3NcIjogXCJhbnNpLWJyaWdodC15ZWxsb3dcIiB9LCB7IGNvbG9yOiBcIjg1LCA4NSwgMjU1XCIsIFwiY2xhc3NcIjogXCJhbnNpLWJyaWdodC1ibHVlXCIgfSwgeyBjb2xvcjogXCIyNTUsIDg1LCAyNTVcIiwgXCJjbGFzc1wiOiBcImFuc2ktYnJpZ2h0LW1hZ2VudGFcIiB9LCB7IGNvbG9yOiBcIjg1LCAyNTUsIDI1NVwiLCBcImNsYXNzXCI6IFwiYW5zaS1icmlnaHQtY3lhblwiIH0sIHsgY29sb3I6IFwiMjU1LCAyNTUsIDI1NVwiLCBcImNsYXNzXCI6IFwiYW5zaS1icmlnaHQtd2hpdGVcIiB9XV07XG5cbnZhciBBbnNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICBfY3JlYXRlQ2xhc3MoQW5zZXIsIG51bGwsIFt7XG4gICAgICAgIGtleTogXCJlc2NhcGVGb3JIdG1sXCIsXG5cblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5zZXIuZXNjYXBlRm9ySHRtbFxuICAgICAgICAgKiBFc2NhcGUgdGhlIGlucHV0IEhUTUwuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgZG9lcyB0aGUgbWluaW11bSBlc2NhcGluZyBvZiB0ZXh0IHRvIG1ha2UgaXQgY29tcGxpYW50IHdpdGggSFRNTC5cbiAgICAgICAgICogSW4gcGFydGljdWxhciwgdGhlICcmJywnPCcsIGFuZCAnPicgY2hhcmFjdGVycyBhcmUgZXNjYXBlZC4gVGhpcyBzaG91bGRcbiAgICAgICAgICogYmUgcnVuIHByaW9yIHRvIGBhbnNpVG9IdG1sYC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgQW5zZXIuZXNjYXBlRm9ySHRtbFxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR4dCBUaGUgaW5wdXQgdGV4dCAoY29udGFpbmluZyB0aGUgQU5TSSBzbmlwcGV0cykuXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBlc2NhcGVkIGh0bWwuXG4gICAgICAgICAqL1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZXNjYXBlRm9ySHRtbCh0eHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQW5zZXIoKS5lc2NhcGVGb3JIdG1sKHR4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5zZXIubGlua2lmeVxuICAgICAgICAgKiBBZGRzIHRoZSBsaW5rcyBpbiB0aGUgSFRNTC5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyByZXBsYWNlcyBhbnkgbGlua3MgaW4gdGhlIHRleHQgd2l0aCBhbmNob3IgdGFncyB0aGF0IGRpc3BsYXkgdGhlXG4gICAgICAgICAqIGxpbmsuIFRoZSBsaW5rcyBzaG91bGQgaGF2ZSBhdCBsZWFzdCBvbmUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJcbiAgICAgICAgICogc3Vycm91bmRpbmcgaXQuIEFsc28sIHlvdSBzaG91bGQgYXBwbHkgdGhpcyBhZnRlciB5b3UgaGF2ZSBydW5cbiAgICAgICAgICogYGFuc2lUb0h0bWxgIG9uIHRoZSB0ZXh0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBBbnNlci5saW5raWZ5XG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHh0IFRoZSBpbnB1dCB0ZXh0LlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgSFRNTCBjb250YWluaW5nIHRoZSA8YT4gdGFncyAodW5lc2NhcGVkKS5cbiAgICAgICAgICovXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJsaW5raWZ5XCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBsaW5raWZ5KHR4dCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbnNlcigpLmxpbmtpZnkodHh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbnNlci5hbnNpVG9IdG1sXG4gICAgICAgICAqIFRoaXMgcmVwbGFjZXMgQU5TSSB0ZXJtaW5hbCBlc2NhcGUgY29kZXMgd2l0aCBTUEFOIHRhZ3MgdGhhdCB3cmFwIHRoZVxuICAgICAgICAgKiBjb250ZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgaW50ZXJwcmV0cyBBTlNJIFNHUiAoU2VsZWN0IEdyYXBoaWMgUmVuZGl0aW9uKSBjb2Rlc1xuICAgICAgICAgKiB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiBIVE1MLlxuICAgICAgICAgKiBGb3IgZXhhbXBsZSwgY3Vyc29yIG1vdmVtZW50IGNvZGVzIGFyZSBpZ25vcmVkIGFuZCBoaWRkZW4gZnJvbSBvdXRwdXQuXG4gICAgICAgICAqIFRoZSBkZWZhdWx0IHN0eWxlIHVzZXMgY29sb3JzIHRoYXQgYXJlIHZlcnkgY2xvc2UgdG8gdGhlIHByZXNjcmliZWRcbiAgICAgICAgICogc3RhbmRhcmQuIFRoZSBzdGFuZGFyZCBhc3N1bWVzIHRoYXQgdGhlIHRleHQgd2lsbCBoYXZlIGEgYmxhY2tcbiAgICAgICAgICogYmFja2dyb3VuZC4gVGhlc2UgY29sb3JzIGFyZSBzZXQgYXMgaW5saW5lIHN0eWxlcyBvbiB0aGUgU1BBTiB0YWdzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBBbm90aGVyIG9wdGlvbiBpcyB0byBzZXQgYHVzZV9jbGFzc2VzOiB0cnVlYCBpbiB0aGUgb3B0aW9ucyBhcmd1bWVudC5cbiAgICAgICAgICogVGhpcyB3aWxsIGluc3RlYWQgc2V0IGNsYXNzZXMgb24gdGhlIHNwYW5zIHNvIHRoZSBjb2xvcnMgY2FuIGJlIHNldCB2aWFcbiAgICAgICAgICogQ1NTLiBUaGUgY2xhc3MgbmFtZXMgdXNlZCBhcmUgb2YgdGhlIGZvcm1hdCBgYW5zaS0qLWZnL2JnYCBhbmRcbiAgICAgICAgICogYGFuc2ktYnJpZ2h0LSotZmcvYmdgIHdoZXJlIGAqYCBpcyB0aGUgY29sb3IgbmFtZSxcbiAgICAgICAgICogaS5lIGJsYWNrL3JlZC9ncmVlbi95ZWxsb3cvYmx1ZS9tYWdlbnRhL2N5YW4vd2hpdGUuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIEFuc2VyLmFuc2lUb0h0bWxcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eHQgVGhlIGlucHV0IHRleHQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgYW5zaVRvSFRNTCBtZXRob2QuXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBIVE1MIG91dHB1dC5cbiAgICAgICAgICovXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJhbnNpVG9IdG1sXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBhbnNpVG9IdG1sKHR4dCwgb3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBbnNlcigpLmFuc2lUb0h0bWwodHh0LCBvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbnNlci5hbnNpVG9Kc29uXG4gICAgICAgICAqIENvbnZlcnRzIEFOU0kgaW5wdXQgaW50byBKU09OIG91dHB1dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgQW5zZXIuYW5zaVRvSnNvblxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR4dCBUaGUgaW5wdXQgdGV4dC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgVGhlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBhbnNpVG9IVE1MIG1ldGhvZC5cbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIEhUTUwgb3V0cHV0LlxuICAgICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFuc2lUb0pzb25cIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFuc2lUb0pzb24odHh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEFuc2VyKCkuYW5zaVRvSnNvbih0eHQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuc2VyLmFuc2lUb1RleHRcbiAgICAgICAgICogQ29udmVydHMgQU5TSSBpbnB1dCBpbnRvIHRleHQgb3V0cHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBBbnNlci5hbnNpVG9UZXh0XG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHh0IFRoZSBpbnB1dCB0ZXh0LlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdGV4dCBvdXRwdXQuXG4gICAgICAgICAqL1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYW5zaVRvVGV4dFwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYW5zaVRvVGV4dCh0eHQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQW5zZXIoKS5hbnNpVG9UZXh0KHR4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQW5zZXJcbiAgICAgICAgICogVGhlIGBBbnNlcmAgY2xhc3MuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIEFuc2VyXG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcmV0dXJucyB7QW5zZXJ9XG4gICAgICAgICAqL1xuXG4gICAgfV0pO1xuXG4gICAgZnVuY3Rpb24gQW5zZXIoKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBbnNlcik7XG5cbiAgICAgICAgdGhpcy5mZyA9IHRoaXMuYmcgPSB0aGlzLmZnX3RydWVjb2xvciA9IHRoaXMuYmdfdHJ1ZWNvbG9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5icmlnaHQgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHNldHVwUGFsZXR0ZVxuICAgICAqIFNldHMgdXAgdGhlIHBhbGV0dGUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBzZXR1cFBhbGV0dGVcbiAgICAgKiBAZnVuY3Rpb25cbiAgICAgKi9cblxuXG4gICAgX2NyZWF0ZUNsYXNzKEFuc2VyLCBbe1xuICAgICAgICBrZXk6IFwic2V0dXBQYWxldHRlXCIsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXR1cFBhbGV0dGUoKSB7XG4gICAgICAgICAgICB0aGlzLlBBTEVUVEVfQ09MT1JTID0gW107XG5cbiAgICAgICAgICAgIC8vIEluZGV4IDAuLjE1IDogU3lzdGVtIGNvbG9yXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI7ICsraSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuUEFMRVRURV9DT0xPUlMucHVzaChBTlNJX0NPTE9SU1tpXVtqXS5jb2xvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmRleCAxNi4uMjMxIDogUkdCIDZ4Nng2XG4gICAgICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9qYXNvbm0yMy8yODY4OTgxI2ZpbGUteHRlcm0tMjU2Y29sb3IteWFtbFxuICAgICAgICAgICAgdmFyIGxldmVscyA9IFswLCA5NSwgMTM1LCAxNzUsIDIxNSwgMjU1XTtcbiAgICAgICAgICAgIHZhciBmb3JtYXQgPSBmdW5jdGlvbiBmb3JtYXQociwgZywgYikge1xuICAgICAgICAgICAgICAgIHJldHVybiBsZXZlbHNbcl0gKyBcIiwgXCIgKyBsZXZlbHNbZ10gKyBcIiwgXCIgKyBsZXZlbHNbYl07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHIgPSB2b2lkIDAsXG4gICAgICAgICAgICAgICAgZyA9IHZvaWQgMCxcbiAgICAgICAgICAgICAgICBiID0gdm9pZCAwO1xuICAgICAgICAgICAgZm9yICh2YXIgX3IgPSAwOyBfciA8IDY7ICsrX3IpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBfZyA9IDA7IF9nIDwgNjsgKytfZykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfYiA9IDA7IF9iIDwgNjsgKytfYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QQUxFVFRFX0NPTE9SUy5wdXNoKGZvcm1hdChfciwgX2csIF9iKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluZGV4IDIzMi4uMjU1IDogR3JheXNjYWxlXG4gICAgICAgICAgICB2YXIgbGV2ZWwgPSA4O1xuICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IDI0OyArK19pLCBsZXZlbCArPSAxMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuUEFMRVRURV9DT0xPUlMucHVzaChmb3JtYXQobGV2ZWwsIGxldmVsLCBsZXZlbCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGVzY2FwZUZvckh0bWxcbiAgICAgICAgICogRXNjYXBlcyB0aGUgaW5wdXQgdGV4dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgZXNjYXBlRm9ySHRtbFxuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR4dCBUaGUgaW5wdXQgdGV4dC5cbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIGVzY3BhZWQgSFRNTCBvdXRwdXQuXG4gICAgICAgICAqL1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiZXNjYXBlRm9ySHRtbFwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZXNjYXBlRm9ySHRtbCh0eHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0eHQucmVwbGFjZSgvWyY8Pl0vZ20sIGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyID09IFwiJlwiID8gXCImYW1wO1wiIDogc3RyID09IFwiPFwiID8gXCImbHQ7XCIgOiBzdHIgPT0gXCI+XCIgPyBcIiZndDtcIiA6IFwiXCI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBsaW5raWZ5XG4gICAgICAgICAqIEFkZHMgSFRNTCBsaW5rIGVsZW1lbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBsaW5raWZ5XG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHh0IFRoZSBpbnB1dCB0ZXh0LlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgSFRNTCBvdXRwdXQgY29udGFpbmluZyBsaW5rIGVsZW1lbnRzLlxuICAgICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImxpbmtpZnlcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGxpbmtpZnkodHh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHh0LnJlcGxhY2UoLyhodHRwcz86XFwvXFwvW15cXHNdKykvZ20sIGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI8YSBocmVmPVxcXCJcIiArIHN0ciArIFwiXFxcIj5cIiArIHN0ciArIFwiPC9hPlwiO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogYW5zaVRvSHRtbFxuICAgICAgICAgKiBDb252ZXJ0cyBBTlNJIGlucHV0IGludG8gSFRNTCBvdXRwdXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIGFuc2lUb0h0bWxcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eHQgVGhlIGlucHV0IHRleHQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIHBhc3NlZCBvdCB0aGUgYHByb2Nlc3NgIG1ldGhvZC5cbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIEhUTUwgb3V0cHV0LlxuICAgICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFuc2lUb0h0bWxcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFuc2lUb0h0bWwodHh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzKHR4dCwgb3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogYW5zaVRvSnNvblxuICAgICAgICAgKiBDb252ZXJ0cyBBTlNJIGlucHV0IGludG8gSFRNTCBvdXRwdXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIGFuc2lUb0pzb25cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0eHQgVGhlIGlucHV0IHRleHQuXG4gICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvcHRpb25zIHBhc3NlZCBvdCB0aGUgYHByb2Nlc3NgIG1ldGhvZC5cbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gVGhlIEpTT04gb3V0cHV0LlxuICAgICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcImFuc2lUb0pzb25cIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFuc2lUb0pzb24odHh0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIG9wdGlvbnMuanNvbiA9IHRydWU7XG4gICAgICAgICAgICBvcHRpb25zLmNsZWFyTGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzcyh0eHQsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGFuc2lUb1RleHRcbiAgICAgICAgICogQ29udmVydHMgQU5TSSBpbnB1dCBpbnRvIEhUTUwgb3V0cHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBhbnNpVG9UZXh0XG4gICAgICAgICAqIEBmdW5jdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHh0IFRoZSBpbnB1dCB0ZXh0LlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgdGV4dCBvdXRwdXQuXG4gICAgICAgICAqL1xuXG4gICAgfSwge1xuICAgICAgICBrZXk6IFwiYW5zaVRvVGV4dFwiLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYW5zaVRvVGV4dCh0eHQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3ModHh0LCB7fSwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHByb2Nlc3NcbiAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBpbnB1dC5cbiAgICAgICAgICpcbiAgICAgICAgICogQG5hbWUgcHJvY2Vzc1xuICAgICAgICAgKiBAZnVuY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IHR4dCBUaGUgaW5wdXQgdGV4dC5cbiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgQW4gb2JqZWN0IHBhc3NlZCB0byBgcHJvY2Vzc0NodW5rYCBtZXRob2QsIGV4dGVuZGVkIHdpdGg6XG4gICAgICAgICAqXG4gICAgICAgICAqICAtIGBqc29uYCAoQm9vbGVhbik6IElmIGB0cnVlYCwgdGhlIHJlc3VsdCB3aWxsIGJlIGFuIG9iamVjdC5cbiAgICAgICAgICogIC0gYHVzZV9jbGFzc2VzYCAoQm9vbGVhbik6IElmIGB0cnVlYCwgSFRNTCBjbGFzc2VzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIEhUTUwgb3V0cHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG1hcmt1cFxuICAgICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcInByb2Nlc3NcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3ModHh0LCBvcHRpb25zLCBtYXJrdXApIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgICAgIHZhciByYXdfdGV4dF9jaHVua3MgPSB0eHQuc3BsaXQoL1xcMDMzXFxbLyk7XG4gICAgICAgICAgICB2YXIgZmlyc3RfY2h1bmsgPSByYXdfdGV4dF9jaHVua3Muc2hpZnQoKTsgLy8gdGhlIGZpcnN0IGNodW5rIGlzIG5vdCB0aGUgcmVzdWx0IG9mIHRoZSBzcGxpdFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zLmNsZWFyTGluZSA9IC9cXHIvLnRlc3QodHh0KTsgLy8gY2hlY2sgZm9yIENhcnJpYWdlIFJldHVyblxuICAgICAgICAgICAgdmFyIGNvbG9yX2NodW5rcyA9IHJhd190ZXh0X2NodW5rcy5tYXAoZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLnByb2Nlc3NDaHVuayhjaHVuaywgb3B0aW9ucywgbWFya3VwKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSBzZWxmLnByb2Nlc3NDaHVua0pzb24oXCJcIik7XG4gICAgICAgICAgICAgICAgZmlyc3QuY29udGVudCA9IGZpcnN0X2NodW5rO1xuICAgICAgICAgICAgICAgIGZpcnN0LmNsZWFyTGluZSA9IG9wdGlvbnMuY2xlYXJMaW5lO1xuICAgICAgICAgICAgICAgIGNvbG9yX2NodW5rcy51bnNoaWZ0KGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZW1vdmVfZW1wdHkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sb3JfY2h1bmtzID0gY29sb3JfY2h1bmtzLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjLmlzRW1wdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcl9jaHVua3M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbG9yX2NodW5rcy51bnNoaWZ0KGZpcnN0X2NodW5rKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yX2NodW5rcy5qb2luKFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIHByb2Nlc3NDaHVua0pzb25cbiAgICAgICAgICogUHJvY2Vzc2VzIHRoZSBjdXJyZW50IGNodW5rIGludG8ganNvbiBvdXRwdXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBuYW1lIHByb2Nlc3NDaHVua0pzb25cbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBpbnB1dCB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGZpZWxkczpcbiAgICAgICAgICpcbiAgICAgICAgICogIC0gYGpzb25gIChCb29sZWFuKTogSWYgYHRydWVgLCB0aGUgcmVzdWx0IHdpbGwgYmUgYW4gb2JqZWN0LlxuICAgICAgICAgKiAgLSBgdXNlX2NsYXNzZXNgIChCb29sZWFuKTogSWYgYHRydWVgLCBIVE1MIGNsYXNzZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgSFRNTCBvdXRwdXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbWFya3VwIElmIGZhbHNlLCB0aGUgY29sb3JzIHdpbGwgbm90IGJlIHBhcnNlZC5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgcmVzdWx0IG9iamVjdDpcbiAgICAgICAgICpcbiAgICAgICAgICogIC0gYGNvbnRlbnRgIChTdHJpbmcpOiBUaGUgdGV4dC5cbiAgICAgICAgICogIC0gYGZnYCAoU3RyaW5nfG51bGwpOiBUaGUgZm9yZWdyb3VuZCBjb2xvci5cbiAgICAgICAgICogIC0gYGJnYCAoU3RyaW5nfG51bGwpOiBUaGUgYmFja2dyb3VuZCBjb2xvci5cbiAgICAgICAgICogIC0gYGZnX3RydWVjb2xvcmAgKFN0cmluZ3xudWxsKTogVGhlIGZvcmVncm91bmQgdHJ1ZSBjb2xvciAoaWYgMTZtIGNvbG9yIGlzIGVuYWJsZWQpLlxuICAgICAgICAgKiAgLSBgYmdfdHJ1ZWNvbG9yYCAoU3RyaW5nfG51bGwpOiBUaGUgYmFja2dyb3VuZCB0cnVlIGNvbG9yIChpZiAxNm0gY29sb3IgaXMgZW5hYmxlZCkuXG4gICAgICAgICAqICAtIGBjbGVhckxpbmVgIChCb29sZWFuKTogYHRydWVgIGlmIGEgY2FycmlhZ2VSZXR1cm4gXFxyIHdhcyBmb3VudCBhdCBlbmQgb2YgbGluZS5cbiAgICAgICAgICogIC0gYHdhc19wcm9jZXNzZWRgIChCb2xlYW4pOiBgdHJ1ZWAgaWYgdGhlIGNvbG9ycyB3ZXJlIHByb2Nlc3NlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICAgICAqICAtIGBpc0VtcHR5YCAoRnVuY3Rpb24pOiBBIGZ1bmN0aW9uIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlIGNvbnRlbnQgaXMgZW1wdHksIG9yIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAgICAgKlxuICAgICAgICAgKi9cblxuICAgIH0sIHtcbiAgICAgICAga2V5OiBcInByb2Nlc3NDaHVua0pzb25cIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3NDaHVua0pzb24odGV4dCwgb3B0aW9ucywgbWFya3VwKSB7XG5cbiAgICAgICAgICAgIC8vIEFyZSB3ZSB1c2luZyBjbGFzc2VzIG9yIHN0eWxlcz9cbiAgICAgICAgICAgIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PSBcInVuZGVmaW5lZFwiID8ge30gOiBvcHRpb25zO1xuICAgICAgICAgICAgdmFyIHVzZV9jbGFzc2VzID0gb3B0aW9ucy51c2VfY2xhc3NlcyA9IHR5cGVvZiBvcHRpb25zLnVzZV9jbGFzc2VzICE9IFwidW5kZWZpbmVkXCIgJiYgb3B0aW9ucy51c2VfY2xhc3NlcztcbiAgICAgICAgICAgIHZhciBrZXkgPSBvcHRpb25zLmtleSA9IHVzZV9jbGFzc2VzID8gXCJjbGFzc1wiIDogXCJjb2xvclwiO1xuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRleHQsXG4gICAgICAgICAgICAgICAgZmc6IG51bGwsXG4gICAgICAgICAgICAgICAgYmc6IG51bGwsXG4gICAgICAgICAgICAgICAgZmdfdHJ1ZWNvbG9yOiBudWxsLFxuICAgICAgICAgICAgICAgIGJnX3RydWVjb2xvcjogbnVsbCxcbiAgICAgICAgICAgICAgICBjbGVhckxpbmU6IG9wdGlvbnMuY2xlYXJMaW5lLFxuICAgICAgICAgICAgICAgIGRlY29yYXRpb246IG51bGwsXG4gICAgICAgICAgICAgICAgd2FzX3Byb2Nlc3NlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNFbXB0eTogZnVuY3Rpb24gaXNFbXB0eSgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFyZXN1bHQuY29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBFYWNoIFwiY2h1bmtcIiBpcyB0aGUgdGV4dCBhZnRlciB0aGUgQ1NJIChFU0MgKyBcIltcIikgYW5kIGJlZm9yZSB0aGUgbmV4dCBDU0kvRU9GLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoaXMgcmVnZXggbWF0Y2hlcyBmb3VyIGdyb3VwcyB3aXRoaW4gYSBjaHVuay5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgZmlyc3QgYW5kIHRoaXJkIGdyb3VwcyBtYXRjaCBjb2RlIHR5cGUuXG4gICAgICAgICAgICAvLyBXZSBzdXBwb3J0ZWQgb25seSBTR1IgY29tbWFuZC4gSXQgaGFzIGVtcHR5IGZpcnN0IGdyb3VwIGFuZCBcIm1cIiBpbiB0aGlyZC5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgc2Vjb25kIGdyb3VwIG1hdGNoZXMgYWxsIG9mIHRoZSBudW1iZXIrc2VtaWNvbG9uIGNvbW1hbmQgc2VxdWVuY2VzXG4gICAgICAgICAgICAvLyBiZWZvcmUgdGhlIFwibVwiIChvciBvdGhlciB0cmFpbGluZykgY2hhcmFjdGVyLlxuICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBncmFwaGljcyBvciBTR1IgY29tbWFuZHMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIGxhc3QgZ3JvdXAgaXMgdGhlIHRleHQgKGluY2x1ZGluZyBuZXdsaW5lcykgdGhhdCBpcyBjb2xvcmVkIGJ5XG4gICAgICAgICAgICAvLyB0aGUgb3RoZXIgZ3JvdXBcInMgY29tbWFuZHMuXG4gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IHRleHQubWF0Y2goL14oWyFcXHgzYy1cXHgzZl0qKShbXFxkO10qKShbXFx4MjAtXFx4MmNdKltcXHg0MC1cXHg3ZV0pKFtcXHNcXFNdKikvbSk7XG5cbiAgICAgICAgICAgIGlmICghbWF0Y2hlcykgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICAgICAgdmFyIG9yaWdfdHh0ID0gcmVzdWx0LmNvbnRlbnQgPSBtYXRjaGVzWzRdO1xuICAgICAgICAgICAgdmFyIG51bXMgPSBtYXRjaGVzWzJdLnNwbGl0KFwiO1wiKTtcblxuICAgICAgICAgICAgLy8gV2UgY3VycmVudGx5IHN1cHBvcnQgb25seSBcIlNHUlwiIChTZWxlY3QgR3JhcGhpYyBSZW5kaXRpb24pXG4gICAgICAgICAgICAvLyBTaW1wbHkgaWdub3JlIGlmIG5vdCBhIFNHUiBjb21tYW5kLlxuICAgICAgICAgICAgaWYgKG1hdGNoZXNbMV0gIT09IFwiXCIgfHwgbWF0Y2hlc1szXSAhPT0gXCJtXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW1hcmt1cCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uID0gbnVsbDtcblxuICAgICAgICAgICAgd2hpbGUgKG51bXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBudW1fc3RyID0gbnVtcy5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIHZhciBudW0gPSBwYXJzZUludChudW1fc3RyKTtcblxuICAgICAgICAgICAgICAgIGlmIChpc05hTihudW0pIHx8IG51bSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmZnID0gc2VsZi5iZyA9IHNlbGYuZGVjb3JhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uID0gXCJib2xkXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uID0gXCJkaW1cIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5hYmxlIGNvZGUgMiB0byBnZXQgc3RyaW5nXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMykge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24gPSBcIml0YWxpY1wiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtID09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uID0gXCJ1bmRlcmxpbmVcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA9PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVjb3JhdGlvbiA9IFwiYmxpbmtcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA9PT0gNykge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24gPSBcInJldmVyc2VcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA9PT0gOCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY29yYXRpb24gPSBcImhpZGRlblwiO1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgY29kZSA5IHRvIGdldCBzdHJpa2V0aHJvdWdoXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT09IDkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWNvcmF0aW9uID0gXCJzdHJpa2V0aHJvdWdoXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gMzkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5mZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPT0gNDkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5iZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvcmVncm91bmQgY29sb3JcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bSA+PSAzMCAmJiBudW0gPCAzOCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmZnID0gQU5TSV9DT0xPUlNbMF1bbnVtICUgMTBdW2tleV07XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvcmVncm91bmQgYnJpZ2h0IGNvbG9yXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPj0gOTAgJiYgbnVtIDwgOTgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5mZyA9IEFOU0lfQ09MT1JTWzFdW251bSAlIDEwXVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZ3JvdW5kIGNvbG9yXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW0gPj0gNDAgJiYgbnVtIDwgNDgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5iZyA9IEFOU0lfQ09MT1JTWzBdW251bSAlIDEwXVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZ3JvdW5kIGJyaWdodCBjb2xvclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtID49IDEwMCAmJiBudW0gPCAxMDgpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5iZyA9IEFOU0lfQ09MT1JTWzFdW251bSAlIDEwXVtrZXldO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtID09PSAzOCB8fCBudW0gPT09IDQ4KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuZCBjb2xvciAoMzg9ZmcsIDQ4PWJnKVxuICAgICAgICAgICAgICAgICAgICB2YXIgaXNfZm9yZWdyb3VuZCA9IG51bSA9PT0gMzg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IG51bXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcIjVcIiAmJiBudW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFsZXR0ZSBjb2xvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWxldHRlX2luZGV4ID0gcGFyc2VJbnQobnVtcy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFsZXR0ZV9pbmRleCA+PSAwICYmIHBhbGV0dGVfaW5kZXggPD0gMjU1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdXNlX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5QQUxFVFRFX0NPTE9SUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBQYWxldHRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfZm9yZWdyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmcgPSB0aGlzLlBBTEVUVEVfQ09MT1JTW3BhbGV0dGVfaW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJnID0gdGhpcy5QQUxFVFRFX0NPTE9SU1twYWxldHRlX2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrbGFzcyA9IHBhbGV0dGVfaW5kZXggPj0gMTYgPyBcImFuc2ktcGFsZXR0ZS1cIiArIHBhbGV0dGVfaW5kZXggOiBBTlNJX0NPTE9SU1twYWxldHRlX2luZGV4ID4gNyA/IDEgOiAwXVtwYWxldHRlX2luZGV4ICUgOF1bXCJjbGFzc1wiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19mb3JlZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mZyA9IGtsYXNzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJnID0ga2xhc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFwiMlwiICYmIG51bXMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBwYXJzZUludChudW1zLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gcGFyc2VJbnQobnVtcy5zaGlmdCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IHBhcnNlSW50KG51bXMuc2hpZnQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPj0gMCAmJiByIDw9IDI1NSAmJiBnID49IDAgJiYgZyA8PSAyNTUgJiYgYiA+PSAwICYmIGIgPD0gMjU1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xvciA9IHIgKyBcIiwgXCIgKyBnICsgXCIsIFwiICsgYjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VfY2xhc3Nlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2ZvcmVncm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZnID0gY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmcgPSBjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19mb3JlZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mZyA9IFwiYW5zaS10cnVlY29sb3JcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZnX3RydWVjb2xvciA9IGNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJnID0gXCJhbnNpLXRydWVjb2xvclwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmdfdHJ1ZWNvbG9yID0gY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmZnID09PSBudWxsICYmIHNlbGYuYmcgPT09IG51bGwgJiYgc2VsZi5kZWNvcmF0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0eWxlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBjbGFzc2VzID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTtcblxuICAgICAgICAgICAgICAgIHJlc3VsdC5mZyA9IHNlbGYuZmc7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmJnID0gc2VsZi5iZztcbiAgICAgICAgICAgICAgICByZXN1bHQuZmdfdHJ1ZWNvbG9yID0gc2VsZi5mZ190cnVlY29sb3I7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmJnX3RydWVjb2xvciA9IHNlbGYuYmdfdHJ1ZWNvbG9yO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZWNvcmF0aW9uID0gc2VsZi5kZWNvcmF0aW9uO1xuICAgICAgICAgICAgICAgIHJlc3VsdC53YXNfcHJvY2Vzc2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogcHJvY2Vzc0NodW5rXG4gICAgICAgICAqIFByb2Nlc3NlcyB0aGUgY3VycmVudCBjaHVuayBvZiB0ZXh0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAbmFtZSBwcm9jZXNzQ2h1bmtcbiAgICAgICAgICogQGZ1bmN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IFRoZSBpbnB1dCB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGZpZWxkczpcbiAgICAgICAgICpcbiAgICAgICAgICogIC0gYGpzb25gIChCb29sZWFuKTogSWYgYHRydWVgLCB0aGUgcmVzdWx0IHdpbGwgYmUgYW4gb2JqZWN0LlxuICAgICAgICAgKiAgLSBgdXNlX2NsYXNzZXNgIChCb29sZWFuKTogSWYgYHRydWVgLCBIVE1MIGNsYXNzZXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgSFRNTCBvdXRwdXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbWFya3VwIElmIGZhbHNlLCB0aGUgY29sb3JzIHdpbGwgbm90IGJlIHBhcnNlZC5cbiAgICAgICAgICogQHJldHVybiB7T2JqZWN0fFN0cmluZ30gVGhlIHJlc3VsdCAob2JqZWN0IGlmIGBqc29uYCBpcyB3YW50ZWQgYmFjayBvciBzdHJpbmcgb3RoZXJ3aXNlKS5cbiAgICAgICAgICovXG5cbiAgICB9LCB7XG4gICAgICAgIGtleTogXCJwcm9jZXNzQ2h1bmtcIixcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHByb2Nlc3NDaHVuayh0ZXh0LCBvcHRpb25zLCBtYXJrdXApIHtcbiAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgIHZhciBqc29uQ2h1bmsgPSB0aGlzLnByb2Nlc3NDaHVua0pzb24odGV4dCwgb3B0aW9ucywgbWFya3VwKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBqc29uQ2h1bms7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoanNvbkNodW5rLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFqc29uQ2h1bmsud2FzX3Byb2Nlc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBqc29uQ2h1bmsuY29udGVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHVzZV9jbGFzc2VzID0gb3B0aW9ucy51c2VfY2xhc3NlcztcblxuICAgICAgICAgICAgdmFyIHN0eWxlcyA9IFtdO1xuICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBbXTtcbiAgICAgICAgICAgIHZhciBkYXRhID0ge307XG4gICAgICAgICAgICB2YXIgcmVuZGVyX2RhdGEgPSBmdW5jdGlvbiByZW5kZXJfZGF0YShkYXRhKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyYWdtZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBrZXkgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgZm9yIChrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudHMucHVzaChcImRhdGEtXCIgKyBrZXkgKyBcIj1cXFwiXCIgKyBfdGhpczIuZXNjYXBlRm9ySHRtbChkYXRhW2tleV0pICsgXCJcXFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudHMubGVuZ3RoID4gMCA/IFwiIFwiICsgZnJhZ21lbnRzLmpvaW4oXCIgXCIpIDogXCJcIjtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChqc29uQ2h1bmsuZmcpIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKGpzb25DaHVuay5mZyArIFwiLWZnXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbkNodW5rLmZnX3RydWVjb2xvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtcImFuc2ktdHJ1ZWNvbG9yLWZnXCJdID0ganNvbkNodW5rLmZnX3RydWVjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25DaHVuay5mZ190cnVlY29sb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnB1c2goXCJjb2xvcjpyZ2IoXCIgKyBqc29uQ2h1bmsuZmcgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoanNvbkNodW5rLmJnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVzZV9jbGFzc2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaChqc29uQ2h1bmsuYmcgKyBcIi1iZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb25DaHVuay5iZ190cnVlY29sb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbXCJhbnNpLXRydWVjb2xvci1iZ1wiXSA9IGpzb25DaHVuay5iZ190cnVlY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQ2h1bmsuYmdfdHJ1ZWNvbG9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKFwiYmFja2dyb3VuZC1jb2xvcjpyZ2IoXCIgKyBqc29uQ2h1bmsuYmcgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoanNvbkNodW5rLmRlY29yYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodXNlX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKFwiYW5zaS1cIiArIGpzb25DaHVuay5kZWNvcmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25DaHVuay5kZWNvcmF0aW9uID09PSBcImJvbGRcIikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChcImZvbnQtd2VpZ2h0OmJvbGRcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uQ2h1bmsuZGVjb3JhdGlvbiA9PT0gXCJkaW1cIikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChcIm9wYWNpdHk6MC41XCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbkNodW5rLmRlY29yYXRpb24gPT09IFwiaXRhbGljXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLnB1c2goXCJmb250LXN0eWxlOml0YWxpY1wiKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5kZXJsaW5lIGFuZCBibGluayBhcmUgdHJlYXRlZCBiZWxsb3dcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpzb25DaHVuay5kZWNvcmF0aW9uID09PSBcInJldmVyc2VcIikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChcImZpbHRlcjppbnZlcnQoMTAwJSlcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uQ2h1bmsuZGVjb3JhdGlvbiA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChcInZpc2liaWxpdHk6aGlkZGVuXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanNvbkNodW5rLmRlY29yYXRpb24gPT09IFwic3RyaWtldGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKFwidGV4dC1kZWNvcmF0aW9uOmxpbmUtdGhyb3VnaFwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChcInRleHQtZGVjb3JhdGlvbjpcIiArIGpzb25DaHVuay5kZWNvcmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1c2VfY2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjxzcGFuIGNsYXNzPVxcXCJcIiArIGNsYXNzZXMuam9pbihcIiBcIikgKyBcIlxcXCJcIiArIHJlbmRlcl9kYXRhKGRhdGEpICsgXCI+XCIgKyBqc29uQ2h1bmsuY29udGVudCArIFwiPC9zcGFuPlwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI8c3BhbiBzdHlsZT1cXFwiXCIgKyBzdHlsZXMuam9pbihcIjtcIikgKyBcIlxcXCJcIiArIHJlbmRlcl9kYXRhKGRhdGEpICsgXCI+XCIgKyBqc29uQ2h1bmsuY29udGVudCArIFwiPC9zcGFuPlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIEFuc2VyO1xufSgpO1xuXG47XG5cbm1vZHVsZS5leHBvcnRzID0gQW5zZXI7IiwiLyohIGh0dHBzOi8vbXRocy5iZS9jc3Nlc2NhcGUgdjEuNS4xIGJ5IEBtYXRoaWFzIHwgTUlUIGxpY2Vuc2UgKi9cbjsoZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vdW1kanMvdW1kL2Jsb2IvbWFzdGVyL3JldHVybkV4cG9ydHMuanNcblx0aWYgKHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnKSB7XG5cdFx0Ly8gRm9yIE5vZGUuanMuXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJvb3QpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gRm9yIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cblx0XHRkZWZpbmUoW10sIGZhY3RvcnkuYmluZChyb290LCByb290KSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gRm9yIGJyb3dzZXIgZ2xvYmFscyAobm90IGV4cG9zaW5nIHRoZSBmdW5jdGlvbiBzZXBhcmF0ZWx5KS5cblx0XHRmYWN0b3J5KHJvb3QpO1xuXHR9XG59KHR5cGVvZiBnbG9iYWwgIT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB0aGlzLCBmdW5jdGlvbihyb290KSB7XG5cblx0aWYgKHJvb3QuQ1NTICYmIHJvb3QuQ1NTLmVzY2FwZSkge1xuXHRcdHJldHVybiByb290LkNTUy5lc2NhcGU7XG5cdH1cblxuXHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3NlcmlhbGl6ZS1hbi1pZGVudGlmaWVyXG5cdHZhciBjc3NFc2NhcGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHtcblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ2BDU1MuZXNjYXBlYCByZXF1aXJlcyBhbiBhcmd1bWVudC4nKTtcblx0XHR9XG5cdFx0dmFyIHN0cmluZyA9IFN0cmluZyh2YWx1ZSk7XG5cdFx0dmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cdFx0dmFyIGluZGV4ID0gLTE7XG5cdFx0dmFyIGNvZGVVbml0O1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHR2YXIgZmlyc3RDb2RlVW5pdCA9IHN0cmluZy5jaGFyQ29kZUF0KDApO1xuXHRcdHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdFx0XHRjb2RlVW5pdCA9IHN0cmluZy5jaGFyQ29kZUF0KGluZGV4KTtcblx0XHRcdC8vIE5vdGU6IHRoZXJl4oCZcyBubyBuZWVkIHRvIHNwZWNpYWwtY2FzZSBhc3RyYWwgc3ltYm9scywgc3Vycm9nYXRlXG5cdFx0XHQvLyBwYWlycywgb3IgbG9uZSBzdXJyb2dhdGVzLlxuXG5cdFx0XHQvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIE5VTEwgKFUrMDAwMCksIHRoZW4gdGhlIFJFUExBQ0VNRU5UIENIQVJBQ1RFUlxuXHRcdFx0Ly8gKFUrRkZGRCkuXG5cdFx0XHRpZiAoY29kZVVuaXQgPT0gMHgwMDAwKSB7XG5cdFx0XHRcdHJlc3VsdCArPSAnXFx1RkZGRCc7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgaW4gdGhlIHJhbmdlIFtcXDEtXFwxRl0gKFUrMDAwMSB0byBVKzAwMUYpIG9yIGlzXG5cdFx0XHRcdC8vIFUrMDA3RiwgW+KApl1cblx0XHRcdFx0KGNvZGVVbml0ID49IDB4MDAwMSAmJiBjb2RlVW5pdCA8PSAweDAwMUYpIHx8IGNvZGVVbml0ID09IDB4MDA3RiB8fFxuXHRcdFx0XHQvLyBJZiB0aGUgY2hhcmFjdGVyIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYW5kIGlzIGluIHRoZSByYW5nZSBbMC05XVxuXHRcdFx0XHQvLyAoVSswMDMwIHRvIFUrMDAzOSksIFvigKZdXG5cdFx0XHRcdChpbmRleCA9PSAwICYmIGNvZGVVbml0ID49IDB4MDAzMCAmJiBjb2RlVW5pdCA8PSAweDAwMzkpIHx8XG5cdFx0XHRcdC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgdGhlIHNlY29uZCBjaGFyYWN0ZXIgYW5kIGlzIGluIHRoZSByYW5nZSBbMC05XVxuXHRcdFx0XHQvLyAoVSswMDMwIHRvIFUrMDAzOSkgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBgLWAgKFUrMDAyRCksIFvigKZdXG5cdFx0XHRcdChcblx0XHRcdFx0XHRpbmRleCA9PSAxICYmXG5cdFx0XHRcdFx0Y29kZVVuaXQgPj0gMHgwMDMwICYmIGNvZGVVbml0IDw9IDB4MDAzOSAmJlxuXHRcdFx0XHRcdGZpcnN0Q29kZVVuaXQgPT0gMHgwMDJEXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI2VzY2FwZS1hLWNoYXJhY3Rlci1hcy1jb2RlLXBvaW50XG5cdFx0XHRcdHJlc3VsdCArPSAnXFxcXCcgKyBjb2RlVW5pdC50b1N0cmluZygxNikgKyAnICc7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBhbmQgaXMgYSBgLWAgKFUrMDAyRCksIGFuZFxuXHRcdFx0XHQvLyB0aGVyZSBpcyBubyBzZWNvbmQgY2hhcmFjdGVyLCBb4oCmXVxuXHRcdFx0XHRpbmRleCA9PSAwICYmXG5cdFx0XHRcdGxlbmd0aCA9PSAxICYmXG5cdFx0XHRcdGNvZGVVbml0ID09IDB4MDAyRFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlc3VsdCArPSAnXFxcXCcgKyBzdHJpbmcuY2hhckF0KGluZGV4KTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGhhbmRsZWQgYnkgb25lIG9mIHRoZSBhYm92ZSBydWxlcyBhbmQgaXNcblx0XHRcdC8vIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBVKzAwODAsIGlzIGAtYCAoVSswMDJEKSBvciBgX2AgKFUrMDA1RiksIG9yXG5cdFx0XHQvLyBpcyBpbiBvbmUgb2YgdGhlIHJhbmdlcyBbMC05XSAoVSswMDMwIHRvIFUrMDAzOSksIFtBLVpdIChVKzAwNDEgdG9cblx0XHRcdC8vIFUrMDA1QSksIG9yIFthLXpdIChVKzAwNjEgdG8gVSswMDdBKSwgW+KApl1cblx0XHRcdGlmIChcblx0XHRcdFx0Y29kZVVuaXQgPj0gMHgwMDgwIHx8XG5cdFx0XHRcdGNvZGVVbml0ID09IDB4MDAyRCB8fFxuXHRcdFx0XHRjb2RlVW5pdCA9PSAweDAwNUYgfHxcblx0XHRcdFx0Y29kZVVuaXQgPj0gMHgwMDMwICYmIGNvZGVVbml0IDw9IDB4MDAzOSB8fFxuXHRcdFx0XHRjb2RlVW5pdCA+PSAweDAwNDEgJiYgY29kZVVuaXQgPD0gMHgwMDVBIHx8XG5cdFx0XHRcdGNvZGVVbml0ID49IDB4MDA2MSAmJiBjb2RlVW5pdCA8PSAweDAwN0Fcblx0XHRcdCkge1xuXHRcdFx0XHQvLyB0aGUgY2hhcmFjdGVyIGl0c2VsZlxuXHRcdFx0XHRyZXN1bHQgKz0gc3RyaW5nLmNoYXJBdChpbmRleCk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cblx0XHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jZXNjYXBlLWEtY2hhcmFjdGVyXG5cdFx0XHRyZXN1bHQgKz0gJ1xcXFwnICsgc3RyaW5nLmNoYXJBdChpbmRleCk7XG5cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHRpZiAoIXJvb3QuQ1NTKSB7XG5cdFx0cm9vdC5DU1MgPSB7fTtcblx0fVxuXG5cdHJvb3QuQ1NTLmVzY2FwZSA9IGNzc0VzY2FwZTtcblx0cmV0dXJuIGNzc0VzY2FwZTtcblxufSkpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7dmFyIGFzc2lnbj1PYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KTttb2R1bGUuZXhwb3J0cz1hc3NpZ247bW9kdWxlLmV4cG9ydHMuZGVmYXVsdD1tb2R1bGUuZXhwb3J0cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC1hc3NpZ24uanMubWFwIiwiaW1wb3J0IHsgZ2V0RXZlbnRTb3VyY2VXcmFwcGVyIH0gZnJvbSAnLi9lcnJvci1vdmVybGF5L2V2ZW50c291cmNlJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpbml0aWFsaXplQnVpbGRXYXRjaGVyKHRvZ2dsZUNhbGxiYWNrKSB7XG4gIGNvbnN0IHNoYWRvd0hvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBzaGFkb3dIb3N0LmlkID0gJ19fbmV4dC1idWlsZC13YXRjaGVyJ1xuICAvLyBNYWtlIHN1cmUgY29udGFpbmVyIGlzIGZpeGVkIGFuZCBvbiBhIGhpZ2ggekluZGV4IHNvIGl0IHNob3dzXG4gIHNoYWRvd0hvc3Quc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnXG4gIHNoYWRvd0hvc3Quc3R5bGUuYm90dG9tID0gJzEwcHgnXG4gIHNoYWRvd0hvc3Quc3R5bGUucmlnaHQgPSAnMjBweCdcbiAgc2hhZG93SG9zdC5zdHlsZS53aWR0aCA9IDBcbiAgc2hhZG93SG9zdC5zdHlsZS5oZWlnaHQgPSAwXG4gIHNoYWRvd0hvc3Quc3R5bGUuekluZGV4ID0gOTk5OTlcbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzaGFkb3dIb3N0KVxuXG4gIGxldCBzaGFkb3dSb290XG4gIGxldCBwcmVmaXggPSAnJ1xuXG4gIGlmIChzaGFkb3dIb3N0LmF0dGFjaFNoYWRvdykge1xuICAgIHNoYWRvd1Jvb3QgPSBzaGFkb3dIb3N0LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGF0dGFjaFNoYWRvdyBpcyB1bmRlZmluZWQgdGhlbiB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0XG4gICAgLy8gdGhlIFNoYWRvdyBET00sIHdlIG5lZWQgdG8gcHJlZml4IGFsbCB0aGUgbmFtZXMgc28gdGhlcmVcbiAgICAvLyB3aWxsIGJlIG5vIGNvbmZsaWN0c1xuICAgIHNoYWRvd1Jvb3QgPSBzaGFkb3dIb3N0XG4gICAgcHJlZml4ID0gJ19fbmV4dC1idWlsZC13YXRjaGVyLSdcbiAgfVxuXG4gIC8vIENvbnRhaW5lclxuICBjb25zdCBjb250YWluZXIgPSBjcmVhdGVDb250YWluZXIocHJlZml4KVxuICBzaGFkb3dSb290LmFwcGVuZENoaWxkKGNvbnRhaW5lcilcblxuICAvLyBDU1NcbiAgY29uc3QgY3NzID0gY3JlYXRlQ3NzKHByZWZpeClcbiAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChjc3MpXG5cbiAgLy8gU3RhdGVcbiAgbGV0IGlzVmlzaWJsZSA9IGZhbHNlXG4gIGxldCBpc0J1aWxkaW5nID0gZmFsc2VcbiAgbGV0IHRpbWVvdXRJZCA9IG51bGxcblxuICAvLyBIYW5kbGUgZXZlbnRzXG4gIGNvbnN0IGV2dFNvdXJjZSA9IGdldEV2ZW50U291cmNlV3JhcHBlcih7IHBhdGg6ICcvX25leHQvd2VicGFjay1obXInIH0pXG4gIGV2dFNvdXJjZS5hZGRNZXNzYWdlTGlzdGVuZXIoKGV2ZW50KSA9PiB7XG4gICAgLy8gVGhpcyBpcyB0aGUgaGVhcnRiZWF0IGV2ZW50XG4gICAgaWYgKGV2ZW50LmRhdGEgPT09ICdcXHVEODNEXFx1REM5MycpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBoYW5kbGVNZXNzYWdlKGV2ZW50KVxuICAgIH0gY2F0Y2gge31cbiAgfSlcblxuICBmdW5jdGlvbiBoYW5kbGVNZXNzYWdlKGV2ZW50KSB7XG4gICAgY29uc3Qgb2JqID1cbiAgICAgIHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycgPyB7IGFjdGlvbjogZXZlbnQgfSA6IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2VcbiAgICBzd2l0Y2ggKG9iai5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2J1aWxkaW5nJzpcbiAgICAgICAgdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIGlzVmlzaWJsZSA9IHRydWVcbiAgICAgICAgaXNCdWlsZGluZyA9IHRydWVcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyKClcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2J1aWx0JzpcbiAgICAgIGNhc2UgJ3N5bmMnOlxuICAgICAgICBpc0J1aWxkaW5nID0gZmFsc2VcbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGZhZGUgb3V0IHRyYW5zdGlvbiB0byBjb21wbGV0ZVxuICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpc1Zpc2libGUgPSBmYWxzZVxuICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lcigpXG4gICAgICAgIH0sIDEwMClcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyKClcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVDYWxsYmFjayhoYW5kbGVNZXNzYWdlKVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lcigpIHtcbiAgICBpZiAoaXNCdWlsZGluZykge1xuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoYCR7cHJlZml4fWJ1aWxkaW5nYClcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoYCR7cHJlZml4fWJ1aWxkaW5nYClcbiAgICB9XG5cbiAgICBpZiAoaXNWaXNpYmxlKSB7XG4gICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChgJHtwcmVmaXh9dmlzaWJsZWApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGAke3ByZWZpeH12aXNpYmxlYClcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGFpbmVyKHByZWZpeCkge1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICBjb250YWluZXIuaWQgPSBgJHtwcmVmaXh9Y29udGFpbmVyYFxuICBjb250YWluZXIuaW5uZXJIVE1MID0gYFxuICAgIDxkaXYgaWQ9XCIke3ByZWZpeH1pY29uLXdyYXBwZXJcIj5cbiAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAyMjYgMjAwXCI+XG4gICAgICAgIDxkZWZzPlxuICAgICAgICAgIDxsaW5lYXJHcmFkaWVudFxuICAgICAgICAgICAgeDE9XCIxMTQuNzIwNzc1JVwiXG4gICAgICAgICAgICB5MT1cIjE4MS4yODMyNDUlXCJcbiAgICAgICAgICAgIHgyPVwiMzkuNTM5OTMwNiVcIlxuICAgICAgICAgICAgeTI9XCIxMDAlXCJcbiAgICAgICAgICAgIGlkPVwiJHtwcmVmaXh9bGluZWFyLWdyYWRpZW50XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPVwiIzAwMDAwMFwiIG9mZnNldD1cIjAlXCIgLz5cbiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9XCIjRkZGRkZGXCIgb2Zmc2V0PVwiMTAwJVwiIC8+XG4gICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgPC9kZWZzPlxuICAgICAgICA8ZyBpZD1cIiR7cHJlZml4fWljb24tZ3JvdXBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cInVybCgjJHtwcmVmaXh9bGluZWFyLWdyYWRpZW50KVwiIHN0cm9rZS13aWR0aD1cIjE4XCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMTMsNS4wODIxOTExNyBMNC4yODM5MzgwMSwxOTcuNSBMMjIxLjcxNjA2MiwxOTcuNSBMMTEzLDUuMDgyMTkxMTcgWlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvZGl2PlxuICBgXG5cbiAgcmV0dXJuIGNvbnRhaW5lclxufVxuXG5mdW5jdGlvbiBjcmVhdGVDc3MocHJlZml4KSB7XG4gIGNvbnN0IGNzcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgY3NzLnRleHRDb250ZW50ID0gYFxuICAgICMke3ByZWZpeH1jb250YWluZXIge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgYm90dG9tOiAxMHB4O1xuICAgICAgcmlnaHQ6IDMwcHg7XG5cbiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIGZvbnQ6IGluaXRpYWw7XG4gICAgICBjdXJzb3I6IGluaXRpYWw7XG4gICAgICBsZXR0ZXItc3BhY2luZzogaW5pdGlhbDtcbiAgICAgIHRleHQtc2hhZG93OiBpbml0aWFsO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IGluaXRpYWw7XG4gICAgICB2aXNpYmlsaXR5OiBpbml0aWFsO1xuXG4gICAgICBwYWRkaW5nOiA3cHggMTBweCA4cHggMTBweDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBib3gtc2hhZG93OiAwIDExcHggNDBweCAwIHJnYmEoMCwgMCwgMCwgMC4yNSksIDAgMnB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuXG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgb3BhY2l0eTogMDtcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xcyBlYXNlLCBib3R0b20gMC4xcyBlYXNlO1xuICAgICAgYW5pbWF0aW9uOiAke3ByZWZpeH1mYWRlLWluIDAuMXMgZWFzZS1pbi1vdXQ7XG4gICAgfVxuXG4gICAgIyR7cHJlZml4fWNvbnRhaW5lci4ke3ByZWZpeH12aXNpYmxlIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgfVxuXG4gICAgIyR7cHJlZml4fWNvbnRhaW5lci4ke3ByZWZpeH1idWlsZGluZyB7XG4gICAgICBib3R0b206IDIwcHg7XG4gICAgICBvcGFjaXR5OiAxO1xuICAgIH1cblxuICAgICMke3ByZWZpeH1pY29uLXdyYXBwZXIge1xuICAgICAgd2lkdGg6IDE2cHg7XG4gICAgICBoZWlnaHQ6IDE2cHg7XG4gICAgfVxuXG4gICAgIyR7cHJlZml4fWljb24td3JhcHBlciA+IHN2ZyB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG5cbiAgICAjJHtwcmVmaXh9aWNvbi1ncm91cCB7XG4gICAgICBhbmltYXRpb246ICR7cHJlZml4fXN0cm9rZWRhc2ggMXMgZWFzZS1pbi1vdXQgYm90aCBpbmZpbml0ZTtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzICR7cHJlZml4fWZhZGUtaW4ge1xuICAgICAgZnJvbSB7XG4gICAgICAgIGJvdHRvbTogMTBweDtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgIH1cbiAgICAgIHRvIHtcbiAgICAgICAgYm90dG9tOiAyMHB4O1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBrZXlmcmFtZXMgJHtwcmVmaXh9c3Ryb2tlZGFzaCB7XG4gICAgICAwJSB7XG4gICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDAgMjI2O1xuICAgICAgfVxuICAgICAgODAlLFxuICAgICAgMTAwJSB7XG4gICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDY1OSAyMjY7XG4gICAgICB9XG4gICAgfVxuICBgXG5cbiAgcmV0dXJuIGNzc1xufVxuIiwiY29uc3QgZXZlbnRDYWxsYmFja3MgPSBbXVxuXG5mdW5jdGlvbiBFdmVudFNvdXJjZVdyYXBwZXIob3B0aW9ucykge1xuICB2YXIgc291cmNlXG4gIHZhciBsYXN0QWN0aXZpdHkgPSBuZXcgRGF0ZSgpXG4gIHZhciBsaXN0ZW5lcnMgPSBbXVxuXG4gIGlmICghb3B0aW9ucy50aW1lb3V0KSB7XG4gICAgb3B0aW9ucy50aW1lb3V0ID0gMjAgKiAxMDAwXG4gIH1cblxuICBpbml0KClcbiAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgIGlmIChuZXcgRGF0ZSgpIC0gbGFzdEFjdGl2aXR5ID4gb3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICBoYW5kbGVEaXNjb25uZWN0KClcbiAgICB9XG4gIH0sIG9wdGlvbnMudGltZW91dCAvIDIpXG5cbiAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBzb3VyY2UgPSBuZXcgd2luZG93LkV2ZW50U291cmNlKG9wdGlvbnMucGF0aClcbiAgICBzb3VyY2Uub25vcGVuID0gaGFuZGxlT25saW5lXG4gICAgc291cmNlLm9uZXJyb3IgPSBoYW5kbGVEaXNjb25uZWN0XG4gICAgc291cmNlLm9ubWVzc2FnZSA9IGhhbmRsZU1lc3NhZ2VcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU9ubGluZSgpIHtcbiAgICBpZiAob3B0aW9ucy5sb2cpIGNvbnNvbGUubG9nKCdbSE1SXSBjb25uZWN0ZWQnKVxuICAgIGxhc3RBY3Rpdml0eSA9IG5ldyBEYXRlKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UoZXZlbnQpIHtcbiAgICBsYXN0QWN0aXZpdHkgPSBuZXcgRGF0ZSgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxpc3RlbmVyc1tpXShldmVudClcbiAgICB9XG5cbiAgICBldmVudENhbGxiYWNrcy5mb3JFYWNoKChjYikgPT4ge1xuICAgICAgaWYgKCFjYi51bmZpbHRlcmVkICYmIGV2ZW50LmRhdGEuaW5kZXhPZignYWN0aW9uJykgPT09IC0xKSByZXR1cm5cbiAgICAgIGNiKGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVEaXNjb25uZWN0KCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGltZXIpXG4gICAgc291cmNlLmNsb3NlKClcbiAgICBzZXRUaW1lb3V0KGluaXQsIG9wdGlvbnMudGltZW91dClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xvc2U6ICgpID0+IHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpXG4gICAgICBzb3VyY2UuY2xvc2UoKVxuICAgIH0sXG4gICAgYWRkTWVzc2FnZUxpc3RlbmVyOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIGxpc3RlbmVycy5wdXNoKGZuKVxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50U291cmNlV3JhcHBlcihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucy5vbmRlbWFuZCkge1xuICAgIHJldHVybiB7XG4gICAgICBhZGRNZXNzYWdlTGlzdGVuZXI6IChjYikgPT4ge1xuICAgICAgICBldmVudENhbGxiYWNrcy5wdXNoKGNiKVxuICAgICAgfSxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEV2ZW50U291cmNlV3JhcHBlcihvcHRpb25zKVxufVxuIiwiLyoqXG5NSVQgTGljZW5zZVxuXG5Db3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcblNPRlRXQVJFLlxuKi9cbi8vIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svY3JlYXRlLXJlYWN0LWFwcC9ibG9iLzdiMWEzMmJlNmVjOWY5OWE2YzlhM2M2NjgxM2YzYWMwOWM0NzM2YjkvcGFja2FnZXMvcmVhY3QtZGV2LXV0aWxzL2Zvcm1hdFdlYnBhY2tNZXNzYWdlcy5qc1xuLy8gSXQncyBiZWVuIGVkaXRlZCB0byByZW1vdmUgY2hhbGsgYW5kIENSQS1zcGVjaWZpYyBsb2dpY1xuXG5jb25zdCBmcmllbmRseVN5bnRheEVycm9yTGFiZWwgPSAnU3ludGF4IGVycm9yOidcblxuZnVuY3Rpb24gaXNMaWtlbHlBU3ludGF4RXJyb3IobWVzc2FnZSkge1xuICByZXR1cm4gbWVzc2FnZS5pbmRleE9mKGZyaWVuZGx5U3ludGF4RXJyb3JMYWJlbCkgIT09IC0xXG59XG5cbi8vIENsZWFucyB1cCB3ZWJwYWNrIGVycm9yIG1lc3NhZ2VzLlxuZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShtZXNzYWdlKSB7XG4gIC8vIFRPRE86IFJlcGxhY2UgdGhpcyBvbmNlIHdlYnBhY2sgNSBpcyBzdGFibGVcbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnb2JqZWN0JyAmJiBtZXNzYWdlLm1lc3NhZ2UpIHtcbiAgICBtZXNzYWdlID1cbiAgICAgIChtZXNzYWdlLm1vZHVsZU5hbWUgPyBtZXNzYWdlLm1vZHVsZU5hbWUgKyAnXFxuJyA6ICcnKSArXG4gICAgICAobWVzc2FnZS5maWxlID8gbWVzc2FnZS5maWxlICsgJ1xcbicgOiAnJykgK1xuICAgICAgbWVzc2FnZS5tZXNzYWdlXG4gIH1cbiAgbGV0IGxpbmVzID0gbWVzc2FnZS5zcGxpdCgnXFxuJylcblxuICAvLyBTdHJpcCBXZWJwYWNrLWFkZGVkIGhlYWRlcnMgb2ZmIGVycm9ycy93YXJuaW5nc1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay93ZWJwYWNrL2Jsb2IvbWFzdGVyL2xpYi9Nb2R1bGVFcnJvci5qc1xuICBsaW5lcyA9IGxpbmVzLmZpbHRlcigobGluZSkgPT4gIS9Nb2R1bGUgW0EteiBdK1xcKGZyb20vLnRlc3QobGluZSkpXG5cbiAgLy8gVHJhbnNmb3JtIHBhcnNpbmcgZXJyb3IgaW50byBzeW50YXggZXJyb3JcbiAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIG91ciBFU0xpbnQgZm9ybWF0dGVyP1xuICBsaW5lcyA9IGxpbmVzLm1hcCgobGluZSkgPT4ge1xuICAgIGNvbnN0IHBhcnNpbmdFcnJvciA9IC9MaW5lIChcXGQrKTooPzooXFxkKyk6KT9cXHMqUGFyc2luZyBlcnJvcjogKC4rKSQvLmV4ZWMoXG4gICAgICBsaW5lXG4gICAgKVxuICAgIGlmICghcGFyc2luZ0Vycm9yKSB7XG4gICAgICByZXR1cm4gbGluZVxuICAgIH1cbiAgICBjb25zdCBbLCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBlcnJvck1lc3NhZ2VdID0gcGFyc2luZ0Vycm9yXG4gICAgcmV0dXJuIGAke2ZyaWVuZGx5U3ludGF4RXJyb3JMYWJlbH0gJHtlcnJvck1lc3NhZ2V9ICgke2Vycm9yTGluZX06JHtlcnJvckNvbHVtbn0pYFxuICB9KVxuXG4gIG1lc3NhZ2UgPSBsaW5lcy5qb2luKCdcXG4nKVxuICAvLyBTbW9vc2ggc3ludGF4IGVycm9ycyAoY29tbW9ubHkgZm91bmQgaW4gQ1NTKVxuICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKFxuICAgIC9TeW50YXhFcnJvclxccytcXCgoXFxkKyk6KFxcZCspXFwpXFxzKiguKz8pXFxuL2csXG4gICAgYCR7ZnJpZW5kbHlTeW50YXhFcnJvckxhYmVsfSAkMyAoJDE6JDIpXFxuYFxuICApXG4gIC8vIENsZWFuIHVwIGV4cG9ydCBlcnJvcnNcbiAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAvXi4qZXhwb3J0ICcoLis/KScgd2FzIG5vdCBmb3VuZCBpbiAnKC4rPyknLiokL2dtLFxuICAgIGBBdHRlbXB0ZWQgaW1wb3J0IGVycm9yOiAnJDEnIGlzIG5vdCBleHBvcnRlZCBmcm9tICckMicuYFxuICApXG4gIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoXG4gICAgL14uKmV4cG9ydCAnZGVmYXVsdCcgXFwoaW1wb3J0ZWQgYXMgJyguKz8pJ1xcKSB3YXMgbm90IGZvdW5kIGluICcoLis/KScuKiQvZ20sXG4gICAgYEF0dGVtcHRlZCBpbXBvcnQgZXJyb3I6ICckMicgZG9lcyBub3QgY29udGFpbiBhIGRlZmF1bHQgZXhwb3J0IChpbXBvcnRlZCBhcyAnJDEnKS5gXG4gIClcbiAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShcbiAgICAvXi4qZXhwb3J0ICcoLis/KScgXFwoaW1wb3J0ZWQgYXMgJyguKz8pJ1xcKSB3YXMgbm90IGZvdW5kIGluICcoLis/KScuKiQvZ20sXG4gICAgYEF0dGVtcHRlZCBpbXBvcnQgZXJyb3I6ICckMScgaXMgbm90IGV4cG9ydGVkIGZyb20gJyQzJyAoaW1wb3J0ZWQgYXMgJyQyJykuYFxuICApXG4gIGxpbmVzID0gbWVzc2FnZS5zcGxpdCgnXFxuJylcblxuICAvLyBSZW1vdmUgbGVhZGluZyBuZXdsaW5lXG4gIGlmIChsaW5lcy5sZW5ndGggPiAyICYmIGxpbmVzWzFdLnRyaW0oKSA9PT0gJycpIHtcbiAgICBsaW5lcy5zcGxpY2UoMSwgMSlcbiAgfVxuICAvLyBDbGVhbiB1cCBmaWxlIG5hbWVcbiAgbGluZXNbMF0gPSBsaW5lc1swXS5yZXBsYWNlKC9eKC4qKSBcXGQrOlxcZCstXFxkKyQvLCAnJDEnKVxuXG4gIC8vIENsZWFucyB1cCB2ZXJib3NlIFwibW9kdWxlIG5vdCBmb3VuZFwiIG1lc3NhZ2VzIGZvciBmaWxlcyBhbmQgcGFja2FnZXMuXG4gIGlmIChsaW5lc1sxXSAmJiBsaW5lc1sxXS5pbmRleE9mKCdNb2R1bGUgbm90IGZvdW5kOiAnKSA9PT0gMCkge1xuICAgIGxpbmVzID0gW1xuICAgICAgbGluZXNbMF0sXG4gICAgICBsaW5lc1sxXVxuICAgICAgICAucmVwbGFjZSgnRXJyb3I6ICcsICcnKVxuICAgICAgICAucmVwbGFjZSgnTW9kdWxlIG5vdCBmb3VuZDogQ2Fubm90IGZpbmQgZmlsZTonLCAnQ2Fubm90IGZpbmQgZmlsZTonKSxcbiAgICAgIC4uLmxpbmVzLnNsaWNlKDIpLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmRleE9mKCcgQCAnKSAhPT0gMCksXG4gICAgXVxuICB9XG5cbiAgLy8gQWRkIGhlbHBmdWwgbWVzc2FnZSBmb3IgdXNlcnMgdHJ5aW5nIHRvIHVzZSBTYXNzIGZvciB0aGUgZmlyc3QgdGltZVxuICBpZiAobGluZXNbMV0gJiYgbGluZXNbMV0ubWF0Y2goL0Nhbm5vdCBmaW5kIG1vZHVsZS4rbm9kZS1zYXNzLykpIHtcbiAgICAvLyAuL2ZpbGUubW9kdWxlLnNjc3MgKDw8bG9hZGVyIGluZm8+PikgPT4gLi9maWxlLm1vZHVsZS5zY3NzXG4gICAgbGluZXNbMF0gPSBsaW5lc1swXS5yZXBsYWNlKC8oLispIFxcKC4rPyg/PVxcP1xcPykuKz9cXCkvLCAnJDEnKVxuXG4gICAgbGluZXNbMV0gPVxuICAgICAgXCJUbyB1c2UgTmV4dC5qcycgYnVpbHQtaW4gU2FzcyBzdXBwb3J0LCB5b3UgZmlyc3QgbmVlZCB0byBpbnN0YWxsIGBzYXNzYC5cXG5cIlxuICAgIGxpbmVzWzFdICs9ICdSdW4gYG5wbSBpIHNhc3NgIG9yIGB5YXJuIGFkZCBzYXNzYCBpbnNpZGUgeW91ciB3b3Jrc3BhY2UuXFxuJ1xuICAgIGxpbmVzWzFdICs9ICdcXG5MZWFybiBtb3JlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9pbnN0YWxsLXNhc3MnXG4gIH1cblxuICBtZXNzYWdlID0gbGluZXMuam9pbignXFxuJylcbiAgLy8gSW50ZXJuYWwgc3RhY2tzIGFyZSBnZW5lcmFsbHkgdXNlbGVzcyBzbyB3ZSBzdHJpcCB0aGVtLi4uIHdpdGggdGhlXG4gIC8vIGV4Y2VwdGlvbiBvZiBzdGFja3MgY29udGFpbmluZyBgd2VicGFjazpgIGJlY2F1c2UgdGhleSdyZSBub3JtYWxseVxuICAvLyBmcm9tIHVzZXIgY29kZSBnZW5lcmF0ZWQgYnkgV2VicGFjay4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9jcmVhdGUtcmVhY3QtYXBwL3B1bGwvMTA1MFxuICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKFxuICAgIC9eXFxzKmF0XFxzKCg/IXdlYnBhY2s6KS4pKjpcXGQrOlxcZCtbXFxzKV0qKFxcbnwkKS9nbSxcbiAgICAnJ1xuICApIC8vIGF0IC4uLiAuLi46eDp5XG4gIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoL15cXHMqYXRcXHM8YW5vbnltb3VzPihcXG58JCkvZ20sICcnKSAvLyBhdCA8YW5vbnltb3VzPlxuICBsaW5lcyA9IG1lc3NhZ2Uuc3BsaXQoJ1xcbicpXG5cbiAgLy8gUmVtb3ZlIGR1cGxpY2F0ZWQgbmV3bGluZXNcbiAgbGluZXMgPSBsaW5lcy5maWx0ZXIoXG4gICAgKGxpbmUsIGluZGV4LCBhcnIpID0+XG4gICAgICBpbmRleCA9PT0gMCB8fCBsaW5lLnRyaW0oKSAhPT0gJycgfHwgbGluZS50cmltKCkgIT09IGFycltpbmRleCAtIDFdLnRyaW0oKVxuICApXG5cbiAgLy8gUmVhc3NlbWJsZSB0aGUgbWVzc2FnZVxuICBtZXNzYWdlID0gbGluZXMuam9pbignXFxuJylcbiAgcmV0dXJuIG1lc3NhZ2UudHJpbSgpXG59XG5cbmZ1bmN0aW9uIGZvcm1hdFdlYnBhY2tNZXNzYWdlcyhqc29uKSB7XG4gIGNvbnN0IGZvcm1hdHRlZEVycm9ycyA9IGpzb24uZXJyb3JzLm1hcChmdW5jdGlvbiAobWVzc2FnZSkge1xuICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2UsIHRydWUpXG4gIH0pXG4gIGNvbnN0IGZvcm1hdHRlZFdhcm5pbmdzID0ganNvbi53YXJuaW5ncy5tYXAoZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlLCBmYWxzZSlcbiAgfSlcbiAgY29uc3QgcmVzdWx0ID0geyBlcnJvcnM6IGZvcm1hdHRlZEVycm9ycywgd2FybmluZ3M6IGZvcm1hdHRlZFdhcm5pbmdzIH1cbiAgaWYgKHJlc3VsdC5lcnJvcnMuc29tZShpc0xpa2VseUFTeW50YXhFcnJvcikpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgYW55IHN5bnRheCBlcnJvcnMsIHNob3cganVzdCB0aGVtLlxuICAgIHJlc3VsdC5lcnJvcnMgPSByZXN1bHQuZXJyb3JzLmZpbHRlcihpc0xpa2VseUFTeW50YXhFcnJvcilcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9ybWF0V2VicGFja01lc3NhZ2VzXG4iLCIvKipcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4vLyBUaGlzIGZpbGUgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBDcmVhdGUgUmVhY3QgQXBwIEhNUiBkZXYgY2xpZW50IHRoYXRcbi8vIGNhbiBiZSBmb3VuZCBoZXJlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2NyZWF0ZS1yZWFjdC1hcHAvYmxvYi92My40LjEvcGFja2FnZXMvcmVhY3QtZGV2LXV0aWxzL3dlYnBhY2tIb3REZXZDbGllbnQuanNcblxuaW1wb3J0ICogYXMgRGV2T3ZlcmxheSBmcm9tICdAbmV4dC9yZWFjdC1kZXYtb3ZlcmxheS9saWIvY2xpZW50J1xuaW1wb3J0IHN0cmlwQW5zaSBmcm9tICduZXh0L2Rpc3QvY29tcGlsZWQvc3RyaXAtYW5zaSdcbmltcG9ydCB7IGdldEV2ZW50U291cmNlV3JhcHBlciB9IGZyb20gJy4vZXZlbnRzb3VyY2UnXG5pbXBvcnQgZm9ybWF0V2VicGFja01lc3NhZ2VzIGZyb20gJy4vZm9ybWF0LXdlYnBhY2stbWVzc2FnZXMnXG5cbi8vIFRoaXMgYWx0ZXJuYXRpdmUgV2VicGFja0RldlNlcnZlciBjb21iaW5lcyB0aGUgZnVuY3Rpb25hbGl0eSBvZjpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrL3dlYnBhY2stZGV2LXNlcnZlci9ibG9iL3dlYnBhY2stMS9jbGllbnQvaW5kZXguanNcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJwYWNrL3dlYnBhY2svYmxvYi93ZWJwYWNrLTEvaG90L2Rldi1zZXJ2ZXIuanNcblxuLy8gSXQgb25seSBzdXBwb3J0cyB0aGVpciBzaW1wbGVzdCBjb25maWd1cmF0aW9uIChob3QgdXBkYXRlcyBvbiBzYW1lIHNlcnZlcikuXG4vLyBJdCBtYWtlcyBzb21lIG9waW5pb25hdGVkIGNob2ljZXMgb24gdG9wLCBsaWtlIGFkZGluZyBhIHN5bnRheCBlcnJvciBvdmVybGF5XG4vLyB0aGF0IGxvb2tzIHNpbWlsYXIgdG8gb3VyIGNvbnNvbGUgb3V0cHV0LiBUaGUgZXJyb3Igb3ZlcmxheSBpcyBpbnNwaXJlZCBieTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nbGVuamFtaW4vd2VicGFjay1ob3QtbWlkZGxld2FyZVxuXG5sZXQgaGFkUnVudGltZUVycm9yID0gZmFsc2VcbmxldCBjdXN0b21IbXJFdmVudEhhbmRsZXJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbm5lY3Qob3B0aW9ucykge1xuICBEZXZPdmVybGF5LnJlZ2lzdGVyKClcblxuICBnZXRFdmVudFNvdXJjZVdyYXBwZXIob3B0aW9ucykuYWRkTWVzc2FnZUxpc3RlbmVyKChldmVudCkgPT4ge1xuICAgIC8vIFRoaXMgaXMgdGhlIGhlYXJ0YmVhdCBldmVudFxuICAgIGlmIChldmVudC5kYXRhID09PSAnXFx1RDgzRFxcdURDOTMnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3NNZXNzYWdlKGV2ZW50KVxuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgSE1SIG1lc3NhZ2U6ICcgKyBldmVudC5kYXRhICsgJ1xcbicgKyBleClcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBzdWJzY3JpYmVUb0htckV2ZW50KGhhbmRsZXIpIHtcbiAgICAgIGN1c3RvbUhtckV2ZW50SGFuZGxlciA9IGhhbmRsZXJcbiAgICB9LFxuICAgIG9uVW5yZWNvdmVyYWJsZUVycm9yKCkge1xuICAgICAgaGFkUnVudGltZUVycm9yID0gdHJ1ZVxuICAgIH0sXG4gIH1cbn1cblxuLy8gUmVtZW1iZXIgc29tZSBzdGF0ZSByZWxhdGVkIHRvIGhvdCBtb2R1bGUgcmVwbGFjZW1lbnQuXG52YXIgaXNGaXJzdENvbXBpbGF0aW9uID0gdHJ1ZVxudmFyIG1vc3RSZWNlbnRDb21waWxhdGlvbkhhc2ggPSBudWxsXG52YXIgaGFzQ29tcGlsZUVycm9ycyA9IGZhbHNlXG5cbmZ1bmN0aW9uIGNsZWFyT3V0ZGF0ZWRFcnJvcnMoKSB7XG4gIC8vIENsZWFuIHVwIG91dGRhdGVkIGNvbXBpbGUgZXJyb3JzLCBpZiBhbnkuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuY2xlYXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoaGFzQ29tcGlsZUVycm9ycykge1xuICAgICAgY29uc29sZS5jbGVhcigpXG4gICAgfVxuICB9XG59XG5cbi8vIFN1Y2Nlc3NmdWwgY29tcGlsYXRpb24uXG5mdW5jdGlvbiBoYW5kbGVTdWNjZXNzKCkge1xuICBjbGVhck91dGRhdGVkRXJyb3JzKClcblxuICBjb25zdCBpc0hvdFVwZGF0ZSA9ICFpc0ZpcnN0Q29tcGlsYXRpb25cbiAgaXNGaXJzdENvbXBpbGF0aW9uID0gZmFsc2VcbiAgaGFzQ29tcGlsZUVycm9ycyA9IGZhbHNlXG5cbiAgLy8gQXR0ZW1wdCB0byBhcHBseSBob3QgdXBkYXRlcyBvciByZWxvYWQuXG4gIGlmIChpc0hvdFVwZGF0ZSkge1xuICAgIHRyeUFwcGx5VXBkYXRlcyhmdW5jdGlvbiBvblN1Y2Nlc3NmdWxIb3RVcGRhdGUoaGFzVXBkYXRlcykge1xuICAgICAgLy8gT25seSBkaXNtaXNzIGl0IHdoZW4gd2UncmUgc3VyZSBpdCdzIGEgaG90IHVwZGF0ZS5cbiAgICAgIC8vIE90aGVyd2lzZSBpdCB3b3VsZCBmbGlja2VyIHJpZ2h0IGJlZm9yZSB0aGUgcmVsb2FkLlxuICAgICAgb25GYXN0UmVmcmVzaChoYXNVcGRhdGVzKVxuICAgIH0pXG4gIH1cbn1cblxuLy8gQ29tcGlsYXRpb24gd2l0aCB3YXJuaW5ncyAoZS5nLiBFU0xpbnQpLlxuZnVuY3Rpb24gaGFuZGxlV2FybmluZ3Mod2FybmluZ3MpIHtcbiAgY2xlYXJPdXRkYXRlZEVycm9ycygpXG5cbiAgY29uc3QgaXNIb3RVcGRhdGUgPSAhaXNGaXJzdENvbXBpbGF0aW9uXG4gIGlzRmlyc3RDb21waWxhdGlvbiA9IGZhbHNlXG4gIGhhc0NvbXBpbGVFcnJvcnMgPSBmYWxzZVxuXG4gIGZ1bmN0aW9uIHByaW50V2FybmluZ3MoKSB7XG4gICAgLy8gUHJpbnQgd2FybmluZ3MgdG8gdGhlIGNvbnNvbGUuXG4gICAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0V2VicGFja01lc3NhZ2VzKHtcbiAgICAgIHdhcm5pbmdzOiB3YXJuaW5ncyxcbiAgICAgIGVycm9yczogW10sXG4gICAgfSlcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUud2FybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3JtYXR0ZWQud2FybmluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPT09IDUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnVGhlcmUgd2VyZSBtb3JlIHdhcm5pbmdzIGluIG90aGVyIGZpbGVzLlxcbicgK1xuICAgICAgICAgICAgICAnWW91IGNhbiBmaW5kIGEgY29tcGxldGUgbG9nIGluIHRoZSB0ZXJtaW5hbC4nXG4gICAgICAgICAgKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKHN0cmlwQW5zaShmb3JtYXR0ZWQud2FybmluZ3NbaV0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaW50V2FybmluZ3MoKVxuXG4gIC8vIEF0dGVtcHQgdG8gYXBwbHkgaG90IHVwZGF0ZXMgb3IgcmVsb2FkLlxuICBpZiAoaXNIb3RVcGRhdGUpIHtcbiAgICB0cnlBcHBseVVwZGF0ZXMoZnVuY3Rpb24gb25TdWNjZXNzZnVsSG90VXBkYXRlKGhhc1VwZGF0ZXMpIHtcbiAgICAgIC8vIE9ubHkgZGlzbWlzcyBpdCB3aGVuIHdlJ3JlIHN1cmUgaXQncyBhIGhvdCB1cGRhdGUuXG4gICAgICAvLyBPdGhlcndpc2UgaXQgd291bGQgZmxpY2tlciByaWdodCBiZWZvcmUgdGhlIHJlbG9hZC5cbiAgICAgIG9uRmFzdFJlZnJlc2goaGFzVXBkYXRlcylcbiAgICB9KVxuICB9XG59XG5cbi8vIENvbXBpbGF0aW9uIHdpdGggZXJyb3JzIChlLmcuIHN5bnRheCBlcnJvciBvciBtaXNzaW5nIG1vZHVsZXMpLlxuZnVuY3Rpb24gaGFuZGxlRXJyb3JzKGVycm9ycykge1xuICBjbGVhck91dGRhdGVkRXJyb3JzKClcblxuICBpc0ZpcnN0Q29tcGlsYXRpb24gPSBmYWxzZVxuICBoYXNDb21waWxlRXJyb3JzID0gdHJ1ZVxuXG4gIC8vIFwiTWFzc2FnZVwiIHdlYnBhY2sgbWVzc2FnZXMuXG4gIHZhciBmb3JtYXR0ZWQgPSBmb3JtYXRXZWJwYWNrTWVzc2FnZXMoe1xuICAgIGVycm9yczogZXJyb3JzLFxuICAgIHdhcm5pbmdzOiBbXSxcbiAgfSlcblxuICAvLyBPbmx5IHNob3cgdGhlIGZpcnN0IGVycm9yLlxuICBEZXZPdmVybGF5Lm9uQnVpbGRFcnJvcihmb3JtYXR0ZWQuZXJyb3JzWzBdKVxuXG4gIC8vIEFsc28gbG9nIHRoZW0gdG8gdGhlIGNvbnNvbGUuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hdHRlZC5lcnJvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnNvbGUuZXJyb3Ioc3RyaXBBbnNpKGZvcm1hdHRlZC5lcnJvcnNbaV0pKVxuICAgIH1cbiAgfVxuXG4gIC8vIERvIG5vdCBhdHRlbXB0IHRvIHJlbG9hZCBub3cuXG4gIC8vIFdlIHdpbGwgcmVsb2FkIG9uIG5leHQgc3VjY2VzcyBpbnN0ZWFkLlxuICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX1RFU1RfTU9ERSkge1xuICAgIGlmIChzZWxmLl9fTkVYVF9ITVJfQ0IpIHtcbiAgICAgIHNlbGYuX19ORVhUX0hNUl9DQihmb3JtYXR0ZWQuZXJyb3JzWzBdKVxuICAgICAgc2VsZi5fX05FWFRfSE1SX0NCID0gbnVsbFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBvbkZhc3RSZWZyZXNoKGhhc1VwZGF0ZXMpIHtcbiAgRGV2T3ZlcmxheS5vbkJ1aWxkT2soKVxuICBpZiAoaGFzVXBkYXRlcykge1xuICAgIERldk92ZXJsYXkub25SZWZyZXNoKClcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdbRmFzdCBSZWZyZXNoXSBkb25lJylcbn1cblxuLy8gVGhlcmUgaXMgYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBjb2RlIGF2YWlsYWJsZS5cbmZ1bmN0aW9uIGhhbmRsZUF2YWlsYWJsZUhhc2goaGFzaCkge1xuICAvLyBVcGRhdGUgbGFzdCBrbm93biBjb21waWxhdGlvbiBoYXNoLlxuICBtb3N0UmVjZW50Q29tcGlsYXRpb25IYXNoID0gaGFzaFxufVxuXG4vLyBIYW5kbGUgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLlxuZnVuY3Rpb24gcHJvY2Vzc01lc3NhZ2UoZSkge1xuICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUuZGF0YSlcbiAgc3dpdGNoIChvYmouYWN0aW9uKSB7XG4gICAgY2FzZSAnYnVpbGRpbmcnOiB7XG4gICAgICBjb25zb2xlLmxvZygnW0Zhc3QgUmVmcmVzaF0gcmVidWlsZGluZycpXG4gICAgICBicmVha1xuICAgIH1cbiAgICBjYXNlICdidWlsdCc6XG4gICAgY2FzZSAnc3luYyc6IHtcbiAgICAgIGlmIChvYmouaGFzaCkge1xuICAgICAgICBoYW5kbGVBdmFpbGFibGVIYXNoKG9iai5oYXNoKVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGVycm9ycywgd2FybmluZ3MgfSA9IG9ialxuICAgICAgY29uc3QgaGFzRXJyb3JzID0gQm9vbGVhbihlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aClcbiAgICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZUVycm9ycyhlcnJvcnMpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc1dhcm5pbmdzID0gQm9vbGVhbih3YXJuaW5ncyAmJiB3YXJuaW5ncy5sZW5ndGgpXG4gICAgICBpZiAoaGFzV2FybmluZ3MpIHtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVdhcm5pbmdzKHdhcm5pbmdzKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGFuZGxlU3VjY2VzcygpXG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmIChjdXN0b21IbXJFdmVudEhhbmRsZXIpIHtcbiAgICAgICAgY3VzdG9tSG1yRXZlbnRIYW5kbGVyKG9iailcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG5cbi8vIElzIHRoZXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGlzIGNvZGUgYXZhaWxhYmxlP1xuZnVuY3Rpb24gaXNVcGRhdGVBdmFpbGFibGUoKSB7XG4gIC8qIGdsb2JhbHMgX193ZWJwYWNrX2hhc2hfXyAqL1xuICAvLyBfX3dlYnBhY2tfaGFzaF9fIGlzIHRoZSBoYXNoIG9mIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uLlxuICAvLyBJdCdzIGEgZ2xvYmFsIHZhcmlhYmxlIGluamVjdGVkIGJ5IFdlYnBhY2suXG4gIHJldHVybiBtb3N0UmVjZW50Q29tcGlsYXRpb25IYXNoICE9PSBfX3dlYnBhY2tfaGFzaF9fXG59XG5cbi8vIFdlYnBhY2sgZGlzYWxsb3dzIHVwZGF0ZXMgaW4gb3RoZXIgc3RhdGVzLlxuZnVuY3Rpb24gY2FuQXBwbHlVcGRhdGVzKCkge1xuICByZXR1cm4gbW9kdWxlLmhvdC5zdGF0dXMoKSA9PT0gJ2lkbGUnXG59XG5mdW5jdGlvbiBhZnRlckFwcGx5VXBkYXRlcyhmbikge1xuICBpZiAoY2FuQXBwbHlVcGRhdGVzKCkpIHtcbiAgICBmbigpXG4gIH0gZWxzZSB7XG4gICAgZnVuY3Rpb24gaGFuZGxlcihzdGF0dXMpIHtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdpZGxlJykge1xuICAgICAgICBtb2R1bGUuaG90LnJlbW92ZVN0YXR1c0hhbmRsZXIoaGFuZGxlcilcbiAgICAgICAgZm4oKVxuICAgICAgfVxuICAgIH1cbiAgICBtb2R1bGUuaG90LmFkZFN0YXR1c0hhbmRsZXIoaGFuZGxlcilcbiAgfVxufVxuXG4vLyBBdHRlbXB0IHRvIHVwZGF0ZSBjb2RlIG9uIHRoZSBmbHksIGZhbGwgYmFjayB0byBhIGhhcmQgcmVsb2FkLlxuZnVuY3Rpb24gdHJ5QXBwbHlVcGRhdGVzKG9uSG90VXBkYXRlU3VjY2Vzcykge1xuICBpZiAoIW1vZHVsZS5ob3QpIHtcbiAgICAvLyBIb3RNb2R1bGVSZXBsYWNlbWVudFBsdWdpbiBpcyBub3QgaW4gV2VicGFjayBjb25maWd1cmF0aW9uLlxuICAgIGNvbnNvbGUuZXJyb3IoJ0hvdE1vZHVsZVJlcGxhY2VtZW50UGx1Z2luIGlzIG5vdCBpbiBXZWJwYWNrIGNvbmZpZ3VyYXRpb24uJylcbiAgICAvLyB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoIWlzVXBkYXRlQXZhaWxhYmxlKCkgfHwgIWNhbkFwcGx5VXBkYXRlcygpKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBcHBseVVwZGF0ZXMoZXJyLCB1cGRhdGVkTW9kdWxlcykge1xuICAgIGlmIChlcnIgfHwgaGFkUnVudGltZUVycm9yIHx8ICF1cGRhdGVkTW9kdWxlcykge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tGYXN0IFJlZnJlc2hdIHBlcmZvcm1pbmcgZnVsbCByZWxvYWRcXG5cXG4nICtcbiAgICAgICAgICAgIFwiRmFzdCBSZWZyZXNoIHdpbGwgcGVyZm9ybSBhIGZ1bGwgcmVsb2FkIHdoZW4geW91IGVkaXQgYSBmaWxlIHRoYXQncyBpbXBvcnRlZCBieSBtb2R1bGVzIG91dHNpZGUgb2YgdGhlIFJlYWN0IHJlbmRlcmluZyB0cmVlLlxcblwiICtcbiAgICAgICAgICAgICdZb3UgbWlnaHQgaGF2ZSBhIGZpbGUgd2hpY2ggZXhwb3J0cyBhIFJlYWN0IGNvbXBvbmVudCBidXQgYWxzbyBleHBvcnRzIGEgdmFsdWUgdGhhdCBpcyBpbXBvcnRlZCBieSBhIG5vbi1SZWFjdCBjb21wb25lbnQgZmlsZS5cXG4nICtcbiAgICAgICAgICAgICdDb25zaWRlciBtaWdyYXRpbmcgdGhlIG5vbi1SZWFjdCBjb21wb25lbnQgZXhwb3J0IHRvIGEgc2VwYXJhdGUgZmlsZSBhbmQgaW1wb3J0aW5nIGl0IGludG8gYm90aCBmaWxlcy5cXG5cXG4nICtcbiAgICAgICAgICAgICdJdCBpcyBhbHNvIHBvc3NpYmxlIHRoZSBwYXJlbnQgY29tcG9uZW50IG9mIHRoZSBjb21wb25lbnQgeW91IGVkaXRlZCBpcyBhIGNsYXNzIGNvbXBvbmVudCwgd2hpY2ggZGlzYWJsZXMgRmFzdCBSZWZyZXNoLlxcbicgK1xuICAgICAgICAgICAgJ0Zhc3QgUmVmcmVzaCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgcGFyZW50IGZ1bmN0aW9uIGNvbXBvbmVudCBpbiB5b3VyIFJlYWN0IHRyZWUuJ1xuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKGhhZFJ1bnRpbWVFcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tGYXN0IFJlZnJlc2hdIHBlcmZvcm1pbmcgZnVsbCByZWxvYWQgYmVjYXVzZSB5b3VyIGFwcGxpY2F0aW9uIGhhZCBhbiB1bnJlY292ZXJhYmxlIGVycm9yJ1xuICAgICAgICApXG4gICAgICB9XG4gICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhhc1VwZGF0ZXMgPSBCb29sZWFuKHVwZGF0ZWRNb2R1bGVzLmxlbmd0aClcbiAgICBpZiAodHlwZW9mIG9uSG90VXBkYXRlU3VjY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gTWF5YmUgd2Ugd2FudCB0byBkbyBzb21ldGhpbmcuXG4gICAgICBvbkhvdFVwZGF0ZVN1Y2Nlc3MoaGFzVXBkYXRlcylcbiAgICB9XG5cbiAgICBpZiAoaXNVcGRhdGVBdmFpbGFibGUoKSkge1xuICAgICAgLy8gV2hpbGUgd2Ugd2VyZSB1cGRhdGluZywgdGhlcmUgd2FzIGEgbmV3IHVwZGF0ZSEgRG8gaXQgYWdhaW4uXG4gICAgICB0cnlBcHBseVVwZGF0ZXMoaGFzVXBkYXRlcyA/IHVuZGVmaW5lZCA6IG9uSG90VXBkYXRlU3VjY2VzcylcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9URVNUX01PREUpIHtcbiAgICAgICAgYWZ0ZXJBcHBseVVwZGF0ZXMoKCkgPT4ge1xuICAgICAgICAgIGlmIChzZWxmLl9fTkVYVF9ITVJfQ0IpIHtcbiAgICAgICAgICAgIHNlbGYuX19ORVhUX0hNUl9DQigpXG4gICAgICAgICAgICBzZWxmLl9fTkVYVF9ITVJfQ0IgPSBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvYXBpL2hvdC1tb2R1bGUtcmVwbGFjZW1lbnQvI2NoZWNrXG4gIG1vZHVsZS5ob3QuY2hlY2soLyogYXV0b0FwcGx5ICovIHRydWUpLnRoZW4oXG4gICAgKHVwZGF0ZWRNb2R1bGVzKSA9PiB7XG4gICAgICBoYW5kbGVBcHBseVVwZGF0ZXMobnVsbCwgdXBkYXRlZE1vZHVsZXMpXG4gICAgfSxcbiAgICAoZXJyKSA9PiB7XG4gICAgICBoYW5kbGVBcHBseVVwZGF0ZXMoZXJyLCBudWxsKVxuICAgIH1cbiAgKVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEltcHJvdmVkIHZlcnNpb24gb2YgaHR0cHM6Ly9naXRodWIuY29tL1lhZmZsZS9FdmVudFNvdXJjZS9cbi8vIEF2YWlsYWJsZSB1bmRlciBNSVQgTGljZW5zZSAoTUlUKVxuLy8gT25seSB0cmllcyB0byBzdXBwb3J0IElFMTEgYW5kIG5vdGhpbmcgYmVsb3dcbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxudmFyIFJlc3BvbnNlID0gd2luZG93LlJlc3BvbnNlXG52YXIgVGV4dERlY29kZXIgPSB3aW5kb3cuVGV4dERlY29kZXJcbnZhciBUZXh0RW5jb2RlciA9IHdpbmRvdy5UZXh0RW5jb2RlclxudmFyIEFib3J0Q29udHJvbGxlciA9IHdpbmRvdy5BYm9ydENvbnRyb2xsZXJcblxuaWYgKEFib3J0Q29udHJvbGxlciA9PSB1bmRlZmluZWQpIHtcbiAgQWJvcnRDb250cm9sbGVyID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2lnbmFsID0gbnVsbFxuICAgIHRoaXMuYWJvcnQgPSBmdW5jdGlvbiAoKSB7fVxuICB9XG59XG5cbmZ1bmN0aW9uIFRleHREZWNvZGVyUG9seWZpbGwoKSB7XG4gIHRoaXMuYml0c05lZWRlZCA9IDBcbiAgdGhpcy5jb2RlUG9pbnQgPSAwXG59XG5cblRleHREZWNvZGVyUG9seWZpbGwucHJvdG90eXBlLmRlY29kZSA9IGZ1bmN0aW9uIChvY3RldHMpIHtcbiAgZnVuY3Rpb24gdmFsaWQoY29kZVBvaW50LCBzaGlmdCwgb2N0ZXRzQ291bnQpIHtcbiAgICBpZiAob2N0ZXRzQ291bnQgPT09IDEpIHtcbiAgICAgIHJldHVybiBjb2RlUG9pbnQgPj0gMHgwMDgwID4+IHNoaWZ0ICYmIGNvZGVQb2ludCA8PCBzaGlmdCA8PSAweDA3ZmZcbiAgICB9XG4gICAgaWYgKG9jdGV0c0NvdW50ID09PSAyKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoY29kZVBvaW50ID49IDB4MDgwMCA+PiBzaGlmdCAmJiBjb2RlUG9pbnQgPDwgc2hpZnQgPD0gMHhkN2ZmKSB8fFxuICAgICAgICAoY29kZVBvaW50ID49IDB4ZTAwMCA+PiBzaGlmdCAmJiBjb2RlUG9pbnQgPDwgc2hpZnQgPD0gMHhmZmZmKVxuICAgICAgKVxuICAgIH1cbiAgICBpZiAob2N0ZXRzQ291bnQgPT09IDMpIHtcbiAgICAgIHJldHVybiBjb2RlUG9pbnQgPj0gMHgwMTAwMDAgPj4gc2hpZnQgJiYgY29kZVBvaW50IDw8IHNoaWZ0IDw9IDB4MTBmZmZmXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigpXG4gIH1cbiAgZnVuY3Rpb24gb2N0ZXRzQ291bnQoYml0c05lZWRlZCwgY29kZVBvaW50KSB7XG4gICAgaWYgKGJpdHNOZWVkZWQgPT09IDYgKiAxKSB7XG4gICAgICByZXR1cm4gY29kZVBvaW50ID4+IDYgPiAxNSA/IDMgOiBjb2RlUG9pbnQgPiAzMSA/IDIgOiAxXG4gICAgfVxuICAgIGlmIChiaXRzTmVlZGVkID09PSA2ICogMikge1xuICAgICAgcmV0dXJuIGNvZGVQb2ludCA+IDE1ID8gMyA6IDJcbiAgICB9XG4gICAgaWYgKGJpdHNOZWVkZWQgPT09IDYgKiAzKSB7XG4gICAgICByZXR1cm4gM1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoKVxuICB9XG4gIHZhciBSRVBMQUNFUiA9IDB4ZmZmZFxuICB2YXIgc3RyaW5nID0gJydcbiAgdmFyIGJpdHNOZWVkZWQgPSB0aGlzLmJpdHNOZWVkZWRcbiAgdmFyIGNvZGVQb2ludCA9IHRoaXMuY29kZVBvaW50XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb2N0ZXRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIG9jdGV0ID0gb2N0ZXRzW2ldXG4gICAgaWYgKGJpdHNOZWVkZWQgIT09IDApIHtcbiAgICAgIGlmIChcbiAgICAgICAgb2N0ZXQgPCAxMjggfHxcbiAgICAgICAgb2N0ZXQgPiAxOTEgfHxcbiAgICAgICAgIXZhbGlkKFxuICAgICAgICAgIChjb2RlUG9pbnQgPDwgNikgfCAob2N0ZXQgJiA2MyksXG4gICAgICAgICAgYml0c05lZWRlZCAtIDYsXG4gICAgICAgICAgb2N0ZXRzQ291bnQoYml0c05lZWRlZCwgY29kZVBvaW50KVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDBcbiAgICAgICAgY29kZVBvaW50ID0gUkVQTEFDRVJcbiAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZVBvaW50KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYml0c05lZWRlZCA9PT0gMCkge1xuICAgICAgaWYgKG9jdGV0ID49IDAgJiYgb2N0ZXQgPD0gMTI3KSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSAwXG4gICAgICAgIGNvZGVQb2ludCA9IG9jdGV0XG4gICAgICB9IGVsc2UgaWYgKG9jdGV0ID49IDE5MiAmJiBvY3RldCA8PSAyMjMpIHtcbiAgICAgICAgYml0c05lZWRlZCA9IDYgKiAxXG4gICAgICAgIGNvZGVQb2ludCA9IG9jdGV0ICYgMzFcbiAgICAgIH0gZWxzZSBpZiAob2N0ZXQgPj0gMjI0ICYmIG9jdGV0IDw9IDIzOSkge1xuICAgICAgICBiaXRzTmVlZGVkID0gNiAqIDJcbiAgICAgICAgY29kZVBvaW50ID0gb2N0ZXQgJiAxNVxuICAgICAgfSBlbHNlIGlmIChvY3RldCA+PSAyNDAgJiYgb2N0ZXQgPD0gMjQ3KSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSA2ICogM1xuICAgICAgICBjb2RlUG9pbnQgPSBvY3RldCAmIDdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJpdHNOZWVkZWQgPSAwXG4gICAgICAgIGNvZGVQb2ludCA9IFJFUExBQ0VSXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGJpdHNOZWVkZWQgIT09IDAgJiZcbiAgICAgICAgIXZhbGlkKGNvZGVQb2ludCwgYml0c05lZWRlZCwgb2N0ZXRzQ291bnQoYml0c05lZWRlZCwgY29kZVBvaW50KSlcbiAgICAgICkge1xuICAgICAgICBiaXRzTmVlZGVkID0gMFxuICAgICAgICBjb2RlUG9pbnQgPSBSRVBMQUNFUlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBiaXRzTmVlZGVkIC09IDZcbiAgICAgIGNvZGVQb2ludCA9IChjb2RlUG9pbnQgPDwgNikgfCAob2N0ZXQgJiA2MylcbiAgICB9XG4gICAgaWYgKGJpdHNOZWVkZWQgPT09IDApIHtcbiAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZDgwMCArICgoY29kZVBvaW50IC0gMHhmZmZmIC0gMSkgPj4gMTApKVxuICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgICAgICAweGRjMDAgKyAoKGNvZGVQb2ludCAtIDB4ZmZmZiAtIDEpICYgMHgzZmYpXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdGhpcy5iaXRzTmVlZGVkID0gYml0c05lZWRlZFxuICB0aGlzLmNvZGVQb2ludCA9IGNvZGVQb2ludFxuICByZXR1cm4gc3RyaW5nXG59XG5cbi8vIEZpcmVmb3ggPCAzOCB0aHJvd3MgYW4gZXJyb3Igd2l0aCBzdHJlYW0gb3B0aW9uXG52YXIgc3VwcG9ydHNTdHJlYW1PcHRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ3Rlc3QnKSwge1xuICAgICAgICBzdHJlYW06IHRydWUsXG4gICAgICB9KSA9PT0gJ3Rlc3QnXG4gICAgKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG4vLyBJRSwgRWRnZVxuaWYgKFxuICBUZXh0RGVjb2RlciA9PSB1bmRlZmluZWQgfHxcbiAgVGV4dEVuY29kZXIgPT0gdW5kZWZpbmVkIHx8XG4gICFzdXBwb3J0c1N0cmVhbU9wdGlvbigpXG4pIHtcbiAgVGV4dERlY29kZXIgPSBUZXh0RGVjb2RlclBvbHlmaWxsXG59XG5cbnZhciBrID0gZnVuY3Rpb24gKCkge31cblxuZnVuY3Rpb24gWEhSV3JhcHBlcih4aHIpIHtcbiAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZVxuICB0aGlzLnJlc3BvbnNlVHlwZSA9ICcnXG4gIHRoaXMucmVhZHlTdGF0ZSA9IDBcbiAgdGhpcy5zdGF0dXMgPSAwXG4gIHRoaXMuc3RhdHVzVGV4dCA9ICcnXG4gIHRoaXMucmVzcG9uc2VUZXh0ID0gJydcbiAgdGhpcy5vbnByb2dyZXNzID0ga1xuICB0aGlzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGtcbiAgdGhpcy5fY29udGVudFR5cGUgPSAnJ1xuICB0aGlzLl94aHIgPSB4aHJcbiAgdGhpcy5fc2VuZFRpbWVvdXQgPSAwXG4gIHRoaXMuX2Fib3J0ID0ga1xufVxuXG5YSFJXcmFwcGVyLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKG1ldGhvZCwgdXJsKSB7XG4gIHRoaXMuX2Fib3J0KHRydWUpXG5cbiAgdmFyIHRoYXQgPSB0aGlzXG4gIHZhciB4aHIgPSB0aGlzLl94aHJcbiAgdmFyIHN0YXRlID0gMVxuICB2YXIgdGltZW91dCA9IDBcblxuICB0aGlzLl9hYm9ydCA9IGZ1bmN0aW9uIChzaWxlbnQpIHtcbiAgICBpZiAodGhhdC5fc2VuZFRpbWVvdXQgIT09IDApIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGF0Ll9zZW5kVGltZW91dClcbiAgICAgIHRoYXQuX3NlbmRUaW1lb3V0ID0gMFxuICAgIH1cbiAgICBpZiAoc3RhdGUgPT09IDEgfHwgc3RhdGUgPT09IDIgfHwgc3RhdGUgPT09IDMpIHtcbiAgICAgIHN0YXRlID0gNFxuICAgICAgeGhyLm9ubG9hZCA9IGtcbiAgICAgIHhoci5vbmVycm9yID0ga1xuICAgICAgeGhyLm9uYWJvcnQgPSBrXG4gICAgICB4aHIub25wcm9ncmVzcyA9IGtcbiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBrXG4gICAgICAvLyBJRSA4IC0gOTogWERvbWFpblJlcXVlc3QjYWJvcnQoKSBkb2VzIG5vdCBmaXJlIGFueSBldmVudFxuICAgICAgLy8gT3BlcmEgPCAxMDogWE1MSHR0cFJlcXVlc3QjYWJvcnQoKSBkb2VzIG5vdCBmaXJlIGFueSBldmVudFxuICAgICAgeGhyLmFib3J0KClcbiAgICAgIGlmICh0aW1lb3V0ICE9PSAwKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICB0aW1lb3V0ID0gMFxuICAgICAgfVxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgdGhhdC5yZWFkeVN0YXRlID0gNFxuICAgICAgICB0aGF0Lm9ucmVhZHlzdGF0ZWNoYW5nZSgpXG4gICAgICB9XG4gICAgfVxuICAgIHN0YXRlID0gMFxuICB9XG5cbiAgdmFyIG9uU3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHN0YXRlID09PSAxKSB7XG4gICAgICAvLyBzdGF0ZSA9IDI7XG4gICAgICB2YXIgc3RhdHVzID0gMFxuICAgICAgdmFyIHN0YXR1c1RleHQgPSAnJ1xuICAgICAgdmFyIGNvbnRlbnRUeXBlID0gdW5kZWZpbmVkXG4gICAgICBpZiAoISgnY29udGVudFR5cGUnIGluIHhocikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGF0dXMgPSB4aHIuc3RhdHVzXG4gICAgICAgICAgc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0XG4gICAgICAgICAgY29udGVudFR5cGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtVHlwZScpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSUUgPCAxMCB0aHJvd3MgZXhjZXB0aW9uIGZvciBgeGhyLnN0YXR1c2Agd2hlbiB4aHIucmVhZHlTdGF0ZSA9PT0gMiB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gM1xuICAgICAgICAgIC8vIE9wZXJhIDwgMTEgdGhyb3dzIGV4Y2VwdGlvbiBmb3IgYHhoci5zdGF0dXNgIHdoZW4geGhyLnJlYWR5U3RhdGUgPT09IDJcbiAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkxMjFcbiAgICAgICAgICBzdGF0dXMgPSAwXG4gICAgICAgICAgc3RhdHVzVGV4dCA9ICcnXG4gICAgICAgICAgY29udGVudFR5cGUgPSB1bmRlZmluZWRcbiAgICAgICAgICAvLyBGaXJlZm94IDwgMTQsIENocm9tZSA/LCBTYWZhcmkgP1xuICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTY1OFxuICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Nzg1NFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXMgPSAyMDBcbiAgICAgICAgc3RhdHVzVGV4dCA9ICdPSydcbiAgICAgICAgY29udGVudFR5cGUgPSB4aHIuY29udGVudFR5cGVcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0dXMgIT09IDApIHtcbiAgICAgICAgc3RhdGUgPSAyXG4gICAgICAgIHRoYXQucmVhZHlTdGF0ZSA9IDJcbiAgICAgICAgdGhhdC5zdGF0dXMgPSBzdGF0dXNcbiAgICAgICAgdGhhdC5zdGF0dXNUZXh0ID0gc3RhdHVzVGV4dFxuICAgICAgICB0aGF0Ll9jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlXG4gICAgICAgIHRoYXQub25yZWFkeXN0YXRlY2hhbmdlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIG9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgb25TdGFydCgpXG4gICAgaWYgKHN0YXRlID09PSAyIHx8IHN0YXRlID09PSAzKSB7XG4gICAgICBzdGF0ZSA9IDNcbiAgICAgIHZhciByZXNwb25zZVRleHQgPSAnJ1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2VUZXh0ID0geGhyLnJlc3BvbnNlVGV4dFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSUUgOCAtIDkgd2l0aCBYTUxIdHRwUmVxdWVzdFxuICAgICAgfVxuICAgICAgdGhhdC5yZWFkeVN0YXRlID0gM1xuICAgICAgdGhhdC5yZXNwb25zZVRleHQgPSByZXNwb25zZVRleHRcbiAgICAgIHRoYXQub25wcm9ncmVzcygpXG4gICAgfVxuICB9XG4gIHZhciBvbkZpbmlzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBGaXJlZm94IDUyIGZpcmVzIFwicmVhZHlzdGF0ZWNoYW5nZVwiICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgd2l0aG91dCBmaW5hbCBcInJlYWR5c3RhdGVjaGFuZ2VcIiAoeGhyLnJlYWR5U3RhdGUgPT09IDMpXG4gICAgLy8gSUUgOCBmaXJlcyBcIm9ubG9hZFwiIHdpdGhvdXQgXCJvbnByb2dyZXNzXCJcbiAgICBvblByb2dyZXNzKClcbiAgICBpZiAoc3RhdGUgPT09IDEgfHwgc3RhdGUgPT09IDIgfHwgc3RhdGUgPT09IDMpIHtcbiAgICAgIHN0YXRlID0gNFxuICAgICAgaWYgKHRpbWVvdXQgIT09IDApIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpXG4gICAgICAgIHRpbWVvdXQgPSAwXG4gICAgICB9XG4gICAgICB0aGF0LnJlYWR5U3RhdGUgPSA0XG4gICAgICB0aGF0Lm9ucmVhZHlzdGF0ZWNoYW5nZSgpXG4gICAgfVxuICB9XG4gIHZhciBvblJlYWR5U3RhdGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHhociAhPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wZXJhIDEyXG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgb25GaW5pc2goKVxuICAgICAgfSBlbHNlIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMykge1xuICAgICAgICBvblByb2dyZXNzKClcbiAgICAgIH0gZWxzZSBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDIpIHtcbiAgICAgICAgb25TdGFydCgpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBvblRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgb25UaW1lb3V0KClcbiAgICB9LCA1MDApXG4gICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSAzKSB7XG4gICAgICBvblByb2dyZXNzKClcbiAgICB9XG4gIH1cblxuICAvLyBYRG9tYWluUmVxdWVzdCNhYm9ydCByZW1vdmVzIG9ucHJvZ3Jlc3MsIG9uZXJyb3IsIG9ubG9hZFxuICB4aHIub25sb2FkID0gb25GaW5pc2hcbiAgeGhyLm9uZXJyb3IgPSBvbkZpbmlzaFxuICAvLyBpbXByb3BlciBmaXggdG8gbWF0Y2ggRmlyZWZveCBiZWhhdmlvciwgYnV0IGl0IGlzIGJldHRlciB0aGFuIGp1c3QgaWdub3JlIGFib3J0XG4gIC8vIHNlZSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03Njg1OTZcbiAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODgwMjAwXG4gIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTM1NzBcbiAgLy8gSUUgOCBmaXJlcyBcIm9ubG9hZFwiIHdpdGhvdXQgXCJvbnByb2dyZXNzXG4gIHhoci5vbmFib3J0ID0gb25GaW5pc2hcblxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD03MzY3MjNcbiAgaWYgKFxuICAgICEoJ3NlbmRBc0JpbmFyeScgaW4gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlKSAmJlxuICAgICEoJ21vekFub24nIGluIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSlcbiAgKSB7XG4gICAgeGhyLm9ucHJvZ3Jlc3MgPSBvblByb2dyZXNzXG4gIH1cblxuICAvLyBJRSA4IC0gOSAoWE1MSFRUUFJlcXVlc3QpXG4gIC8vIE9wZXJhIDwgMTJcbiAgLy8gRmlyZWZveCA8IDMuNVxuICAvLyBGaXJlZm94IDMuNSAtIDMuNiAtID8gPCA5LjBcbiAgLy8gb25wcm9ncmVzcyBpcyBub3QgZmlyZWQgc29tZXRpbWVzIG9yIGRlbGF5ZWRcbiAgLy8gc2VlIGFsc28gIzY0XG4gIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBvblJlYWR5U3RhdGVDaGFuZ2VcblxuICBpZiAoJ2NvbnRlbnRUeXBlJyBpbiB4aHIpIHtcbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArICdwYWRkaW5nPXRydWUnXG4gIH1cbiAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpXG5cbiAgaWYgKCdyZWFkeVN0YXRlJyBpbiB4aHIpIHtcbiAgICAvLyB3b3JrYXJvdW5kIGZvciBPcGVyYSAxMiBpc3N1ZSB3aXRoIFwicHJvZ3Jlc3NcIiBldmVudHNcbiAgICAvLyAjOTFcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBvblRpbWVvdXQoKVxuICAgIH0sIDApXG4gIH1cbn1cblhIUldyYXBwZXIucHJvdG90eXBlLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9hYm9ydChmYWxzZSlcbn1cblhIUldyYXBwZXIucHJvdG90eXBlLmdldFJlc3BvbnNlSGVhZGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHRoaXMuX2NvbnRlbnRUeXBlXG59XG5YSFJXcmFwcGVyLnByb3RvdHlwZS5zZXRSZXF1ZXN0SGVhZGVyID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gIHZhciB4aHIgPSB0aGlzLl94aHJcbiAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiB4aHIpIHtcbiAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCB2YWx1ZSlcbiAgfVxufVxuWEhSV3JhcHBlci5wcm90b3R5cGUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5feGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycyAhPSB1bmRlZmluZWRcbiAgICA/IHRoaXMuX3hoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuICAgIDogJydcbn1cblhIUldyYXBwZXIucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGxvYWRpbmcgaW5kaWNhdG9yIGluIFNhZmFyaSA8ID8gKDYpLCBDaHJvbWUgPCAxNCwgRmlyZWZveFxuICBpZiAoXG4gICAgISgnb250aW1lb3V0JyBpbiBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUpICYmXG4gICAgZG9jdW1lbnQgIT0gdW5kZWZpbmVkICYmXG4gICAgZG9jdW1lbnQucmVhZHlTdGF0ZSAhPSB1bmRlZmluZWQgJiZcbiAgICBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSAnY29tcGxldGUnXG4gICkge1xuICAgIHZhciB0aGF0ID0gdGhpc1xuICAgIHRoYXQuX3NlbmRUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICB0aGF0Ll9zZW5kVGltZW91dCA9IDBcbiAgICAgIHRoYXQuc2VuZCgpXG4gICAgfSwgNClcbiAgICByZXR1cm5cbiAgfVxuXG4gIHZhciB4aHIgPSB0aGlzLl94aHJcbiAgLy8gd2l0aENyZWRlbnRpYWxzIHNob3VsZCBiZSBzZXQgYWZ0ZXIgXCJvcGVuXCIgZm9yIFNhZmFyaSBhbmQgQ2hyb21lICg8IDE5ID8pXG4gIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFsc1xuICB4aHIucmVzcG9uc2VUeXBlID0gdGhpcy5yZXNwb25zZVR5cGVcbiAgdHJ5IHtcbiAgICAvLyB4aHIuc2VuZCgpOyB0aHJvd3MgXCJOb3QgZW5vdWdoIGFyZ3VtZW50c1wiIGluIEZpcmVmb3ggMy4wXG4gICAgeGhyLnNlbmQodW5kZWZpbmVkKVxuICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAvLyBTYWZhcmkgNS4xLjcsIE9wZXJhIDEyXG4gICAgdGhyb3cgZXJyb3IxXG4gIH1cbn1cblxuZnVuY3Rpb24gdG9Mb3dlckNhc2UobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKC9bQS1aXS9nLCBmdW5jdGlvbiAoYykge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMuY2hhckNvZGVBdCgwKSArIDB4MjApXG4gIH0pXG59XG5cbmZ1bmN0aW9uIEhlYWRlcnNQb2x5ZmlsbChhbGwpIHtcbiAgLy8gR2V0IGhlYWRlcnM6IGltcGxlbWVudGVkIGFjY29yZGluZyB0byBtb3ppbGxhJ3MgZXhhbXBsZSBjb2RlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvWE1MSHR0cFJlcXVlc3QvZ2V0QWxsUmVzcG9uc2VIZWFkZXJzI0V4YW1wbGVcbiAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbClcbiAgdmFyIGFycmF5ID0gYWxsLnNwbGl0KCdcXHJcXG4nKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGxpbmUgPSBhcnJheVtpXVxuICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzogJylcbiAgICB2YXIgbmFtZSA9IHBhcnRzLnNoaWZ0KClcbiAgICB2YXIgdmFsdWUgPSBwYXJ0cy5qb2luKCc6ICcpXG4gICAgbWFwW3RvTG93ZXJDYXNlKG5hbWUpXSA9IHZhbHVlXG4gIH1cbiAgdGhpcy5fbWFwID0gbWFwXG59XG5IZWFkZXJzUG9seWZpbGwucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiB0aGlzLl9tYXBbdG9Mb3dlckNhc2UobmFtZSldXG59XG5cbmZ1bmN0aW9uIFhIUlRyYW5zcG9ydCgpIHt9XG5cblhIUlRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChcbiAgeGhyLFxuICBvblN0YXJ0Q2FsbGJhY2ssXG4gIG9uUHJvZ3Jlc3NDYWxsYmFjayxcbiAgb25GaW5pc2hDYWxsYmFjayxcbiAgdXJsLFxuICB3aXRoQ3JlZGVudGlhbHMsXG4gIGhlYWRlcnNcbikge1xuICB4aHIub3BlbignR0VUJywgdXJsKVxuICB2YXIgb2Zmc2V0ID0gMFxuICB4aHIub25wcm9ncmVzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcmVzcG9uc2VUZXh0ID0geGhyLnJlc3BvbnNlVGV4dFxuICAgIHZhciBjaHVuayA9IHJlc3BvbnNlVGV4dC5zbGljZShvZmZzZXQpXG4gICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aFxuICAgIG9uUHJvZ3Jlc3NDYWxsYmFjayhjaHVuaylcbiAgfVxuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gMikge1xuICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXNcbiAgICAgIHZhciBzdGF0dXNUZXh0ID0geGhyLnN0YXR1c1RleHRcbiAgICAgIHZhciBjb250ZW50VHlwZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1UeXBlJylcbiAgICAgIHZhciBoZWFkZXJzID0geGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG4gICAgICBvblN0YXJ0Q2FsbGJhY2soXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dCxcbiAgICAgICAgY29udGVudFR5cGUsXG4gICAgICAgIG5ldyBIZWFkZXJzUG9seWZpbGwoaGVhZGVycyksXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB4aHIuYWJvcnQoKVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSBlbHNlIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgb25GaW5pc2hDYWxsYmFjaygpXG4gICAgfVxuICB9XG4gIHhoci53aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHNcbiAgeGhyLnJlc3BvbnNlVHlwZSA9ICd0ZXh0J1xuICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsIG5hbWUpKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihuYW1lLCBoZWFkZXJzW25hbWVdKVxuICAgIH1cbiAgfVxuICB4aHIuc2VuZCgpXG59XG5cbmZ1bmN0aW9uIEhlYWRlcnNXcmFwcGVyKGhlYWRlcnMpIHtcbiAgdGhpcy5faGVhZGVycyA9IGhlYWRlcnNcbn1cbkhlYWRlcnNXcmFwcGVyLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gdGhpcy5faGVhZGVycy5nZXQobmFtZSlcbn1cblxuZnVuY3Rpb24gRmV0Y2hUcmFuc3BvcnQoKSB7fVxuXG5GZXRjaFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uIChcbiAgeGhyLFxuICBvblN0YXJ0Q2FsbGJhY2ssXG4gIG9uUHJvZ3Jlc3NDYWxsYmFjayxcbiAgb25GaW5pc2hDYWxsYmFjayxcbiAgdXJsLFxuICB3aXRoQ3JlZGVudGlhbHMsXG4gIGhlYWRlcnNcbikge1xuICB2YXIgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICB2YXIgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWwgLy8gc2VlICMxMjBcbiAgdmFyIHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKClcbiAgZmV0Y2godXJsLCB7XG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBjcmVkZW50aWFsczogd2l0aENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ3NhbWUtb3JpZ2luJyxcbiAgICBzaWduYWw6IHNpZ25hbCxcbiAgICBjYWNoZTogJ25vLXN0b3JlJyxcbiAgfSlcbiAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgIHZhciByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpXG4gICAgICBvblN0YXJ0Q2FsbGJhY2soXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpLFxuICAgICAgICBuZXcgSGVhZGVyc1dyYXBwZXIocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmFib3J0KClcbiAgICAgICAgICByZWFkZXIuY2FuY2VsKClcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlYWROZXh0Q2h1bmsgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVhZGVyXG4gICAgICAgICAgICAucmVhZCgpXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICAgIC8vIE5vdGU6IGJ5dGVzIGluIHRleHREZWNvZGVyIGFyZSBpZ25vcmVkXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNodW5rID0gdGV4dERlY29kZXIuZGVjb2RlKHJlc3VsdC52YWx1ZSwgeyBzdHJlYW06IHRydWUgfSlcbiAgICAgICAgICAgICAgICBvblByb2dyZXNzQ2FsbGJhY2soY2h1bmspXG4gICAgICAgICAgICAgICAgcmVhZE5leHRDaHVuaygpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBbJ2NhdGNoJ10oZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmVhZE5leHRDaHVuaygpXG4gICAgICB9KVxuICAgIH0pXG4gICAgLnRoZW4oXG4gICAgICBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIG9uRmluaXNoQ2FsbGJhY2soKVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICB9LFxuICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIG9uRmluaXNoQ2FsbGJhY2soKVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgKVxufVxuXG5mdW5jdGlvbiBFdmVudFRhcmdldCgpIHtcbiAgdGhpcy5fbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKVxufVxuXG5mdW5jdGlvbiB0aHJvd0Vycm9yKGUpIHtcbiAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgZVxuICB9LCAwKVxufVxuXG5FdmVudFRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC50YXJnZXQgPSB0aGlzXG4gIHZhciB0eXBlTGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50LnR5cGVdXG4gIGlmICh0eXBlTGlzdGVuZXJzICE9IHVuZGVmaW5lZCkge1xuICAgIHZhciBsZW5ndGggPSB0eXBlTGlzdGVuZXJzLmxlbmd0aFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHZhciBsaXN0ZW5lciA9IHR5cGVMaXN0ZW5lcnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIuaGFuZGxlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93RXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHR5cGUgPSBTdHJpbmcodHlwZSlcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1xuICB2YXIgdHlwZUxpc3RlbmVycyA9IGxpc3RlbmVyc1t0eXBlXVxuICBpZiAodHlwZUxpc3RlbmVycyA9PSB1bmRlZmluZWQpIHtcbiAgICB0eXBlTGlzdGVuZXJzID0gW11cbiAgICBsaXN0ZW5lcnNbdHlwZV0gPSB0eXBlTGlzdGVuZXJzXG4gIH1cbiAgdmFyIGZvdW5kID0gZmFsc2VcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlTGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHR5cGVMaXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9XG4gIH1cbiAgaWYgKCFmb3VuZCkge1xuICAgIHR5cGVMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcbiAgfVxufVxuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgdHlwZSA9IFN0cmluZyh0eXBlKVxuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzXG4gIHZhciB0eXBlTGlzdGVuZXJzID0gbGlzdGVuZXJzW3R5cGVdXG4gIGlmICh0eXBlTGlzdGVuZXJzICE9IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaWx0ZXJlZCA9IFtdXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlTGlzdGVuZXJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAodHlwZUxpc3RlbmVyc1tpXSAhPT0gbGlzdGVuZXIpIHtcbiAgICAgICAgZmlsdGVyZWQucHVzaCh0eXBlTGlzdGVuZXJzW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZmlsdGVyZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgbGlzdGVuZXJzW3R5cGVdXG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3RlbmVyc1t0eXBlXSA9IGZpbHRlcmVkXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIEV2ZW50KHR5cGUpIHtcbiAgdGhpcy50eXBlID0gdHlwZVxuICB0aGlzLnRhcmdldCA9IHVuZGVmaW5lZFxufVxuXG5mdW5jdGlvbiBNZXNzYWdlRXZlbnQodHlwZSwgb3B0aW9ucykge1xuICBFdmVudC5jYWxsKHRoaXMsIHR5cGUpXG4gIHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YVxuICB0aGlzLmxhc3RFdmVudElkID0gb3B0aW9ucy5sYXN0RXZlbnRJZFxufVxuXG5NZXNzYWdlRXZlbnQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFdmVudC5wcm90b3R5cGUpXG5cbmZ1bmN0aW9uIENvbm5lY3Rpb25FdmVudCh0eXBlLCBvcHRpb25zKSB7XG4gIEV2ZW50LmNhbGwodGhpcywgdHlwZSlcbiAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1c1xuICB0aGlzLnN0YXR1c1RleHQgPSBvcHRpb25zLnN0YXR1c1RleHRcbiAgdGhpcy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzXG59XG5cbkNvbm5lY3Rpb25FdmVudC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEV2ZW50LnByb3RvdHlwZSlcblxudmFyIFdBSVRJTkcgPSAtMVxudmFyIENPTk5FQ1RJTkcgPSAwXG52YXIgT1BFTiA9IDFcbnZhciBDTE9TRUQgPSAyXG5cbnZhciBBRlRFUl9DUiA9IC0xXG52YXIgRklFTERfU1RBUlQgPSAwXG52YXIgRklFTEQgPSAxXG52YXIgVkFMVUVfU1RBUlQgPSAyXG52YXIgVkFMVUUgPSAzXG5cbnZhciBjb250ZW50VHlwZVJlZ0V4cCA9IC9edGV4dFxcL2V2ZW50XFwtc3RyZWFtOz8oXFxzKmNoYXJzZXRcXD11dGZcXC04KT8kL2lcblxudmFyIE1JTklNVU1fRFVSQVRJT04gPSAxMDAwXG52YXIgTUFYSU1VTV9EVVJBVElPTiA9IDE4MDAwMDAwXG5cbnZhciBwYXJzZUR1cmF0aW9uID0gZnVuY3Rpb24gKHZhbHVlLCBkZWYpIHtcbiAgdmFyIG4gPSBwYXJzZUludCh2YWx1ZSwgMTApXG4gIGlmIChuICE9PSBuKSB7XG4gICAgbiA9IGRlZlxuICB9XG4gIHJldHVybiBjbGFtcER1cmF0aW9uKG4pXG59XG52YXIgY2xhbXBEdXJhdGlvbiA9IGZ1bmN0aW9uIChuKSB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChuLCBNSU5JTVVNX0RVUkFUSU9OKSwgTUFYSU1VTV9EVVJBVElPTilcbn1cblxudmFyIGZpcmUgPSBmdW5jdGlvbiAodGhhdCwgZiwgZXZlbnQpIHtcbiAgdHJ5IHtcbiAgICBpZiAodHlwZW9mIGYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGYuY2FsbCh0aGF0LCBldmVudClcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvd0Vycm9yKGUpXG4gIH1cbn1cblxuZnVuY3Rpb24gRXZlbnRTb3VyY2VQb2x5ZmlsbCh1cmwsIG9wdGlvbnMpIHtcbiAgRXZlbnRUYXJnZXQuY2FsbCh0aGlzKVxuXG4gIHRoaXMub25vcGVuID0gdW5kZWZpbmVkXG4gIHRoaXMub25tZXNzYWdlID0gdW5kZWZpbmVkXG4gIHRoaXMub25lcnJvciA9IHVuZGVmaW5lZFxuXG4gIHRoaXMudXJsID0gdW5kZWZpbmVkXG4gIHRoaXMucmVhZHlTdGF0ZSA9IHVuZGVmaW5lZFxuICB0aGlzLndpdGhDcmVkZW50aWFscyA9IHVuZGVmaW5lZFxuXG4gIHRoaXMuX2Nsb3NlID0gdW5kZWZpbmVkXG5cbiAgc3RhcnQodGhpcywgdXJsLCBvcHRpb25zKVxufVxuXG52YXIgaXNGZXRjaFN1cHBvcnRlZCA9XG4gIGZldGNoICE9IHVuZGVmaW5lZCAmJiBSZXNwb25zZSAhPSB1bmRlZmluZWQgJiYgJ2JvZHknIGluIFJlc3BvbnNlLnByb3RvdHlwZVxuXG5mdW5jdGlvbiBzdGFydChlcywgdXJsLCBvcHRpb25zKSB7XG4gIHVybCA9IFN0cmluZyh1cmwpXG4gIHZhciB3aXRoQ3JlZGVudGlhbHMgPSBvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBCb29sZWFuKG9wdGlvbnMud2l0aENyZWRlbnRpYWxzKVxuXG4gIHZhciBpbml0aWFsUmV0cnkgPSBjbGFtcER1cmF0aW9uKDEwMDApXG4gIHZhciBoZWFydGJlYXRUaW1lb3V0ID1cbiAgICBvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBvcHRpb25zLmhlYXJ0YmVhdFRpbWVvdXQgIT0gdW5kZWZpbmVkXG4gICAgICA/IHBhcnNlRHVyYXRpb24ob3B0aW9ucy5oZWFydGJlYXRUaW1lb3V0LCA0NTAwMClcbiAgICAgIDogY2xhbXBEdXJhdGlvbig0NTAwMClcblxuICB2YXIgbGFzdEV2ZW50SWQgPSAnJ1xuICB2YXIgcmV0cnkgPSBpbml0aWFsUmV0cnlcbiAgdmFyIHdhc0FjdGl2aXR5ID0gZmFsc2VcbiAgdmFyIGhlYWRlcnMgPVxuICAgIG9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuaGVhZGVycyAhPSB1bmRlZmluZWRcbiAgICAgID8gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zLmhlYWRlcnMpKVxuICAgICAgOiB1bmRlZmluZWRcbiAgdmFyIEN1cnJlbnRUcmFuc3BvcnQgPVxuICAgIG9wdGlvbnMgIT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuVHJhbnNwb3J0ICE9IHVuZGVmaW5lZFxuICAgICAgPyBvcHRpb25zLlRyYW5zcG9ydFxuICAgICAgOiBYTUxIdHRwUmVxdWVzdFxuICB2YXIgeGhyID1cbiAgICBpc0ZldGNoU3VwcG9ydGVkICYmXG4gICAgIShvcHRpb25zICE9IHVuZGVmaW5lZCAmJiBvcHRpb25zLlRyYW5zcG9ydCAhPSB1bmRlZmluZWQpXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiBuZXcgWEhSV3JhcHBlcihuZXcgQ3VycmVudFRyYW5zcG9ydCgpKVxuICB2YXIgdHJhbnNwb3J0ID0geGhyID09IHVuZGVmaW5lZCA/IG5ldyBGZXRjaFRyYW5zcG9ydCgpIDogbmV3IFhIUlRyYW5zcG9ydCgpXG4gIHZhciBjYW5jZWxGdW5jdGlvbiA9IHVuZGVmaW5lZFxuICB2YXIgdGltZW91dCA9IDBcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IFdBSVRJTkdcbiAgdmFyIGRhdGFCdWZmZXIgPSAnJ1xuICB2YXIgbGFzdEV2ZW50SWRCdWZmZXIgPSAnJ1xuICB2YXIgZXZlbnRUeXBlQnVmZmVyID0gJydcblxuICB2YXIgdGV4dEJ1ZmZlciA9ICcnXG4gIHZhciBzdGF0ZSA9IEZJRUxEX1NUQVJUXG4gIHZhciBmaWVsZFN0YXJ0ID0gMFxuICB2YXIgdmFsdWVTdGFydCA9IDBcblxuICB2YXIgb25TdGFydCA9IGZ1bmN0aW9uIChzdGF0dXMsIHN0YXR1c1RleHQsIGNvbnRlbnRUeXBlLCBoZWFkZXJzLCBjYW5jZWwpIHtcbiAgICBpZiAoY3VycmVudFN0YXRlID09PSBDT05ORUNUSU5HKSB7XG4gICAgICBjYW5jZWxGdW5jdGlvbiA9IGNhbmNlbFxuICAgICAgaWYgKFxuICAgICAgICBzdGF0dXMgPT09IDIwMCAmJlxuICAgICAgICBjb250ZW50VHlwZSAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgY29udGVudFR5cGVSZWdFeHAudGVzdChjb250ZW50VHlwZSlcbiAgICAgICkge1xuICAgICAgICBjdXJyZW50U3RhdGUgPSBPUEVOXG4gICAgICAgIHdhc0FjdGl2aXR5ID0gdHJ1ZVxuICAgICAgICByZXRyeSA9IGluaXRpYWxSZXRyeVxuICAgICAgICBlcy5yZWFkeVN0YXRlID0gT1BFTlxuICAgICAgICB2YXIgZXZlbnQgPSBuZXcgQ29ubmVjdGlvbkV2ZW50KCdvcGVuJywge1xuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgfSlcbiAgICAgICAgZXMuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICAgICAgZmlyZShlcywgZXMub25vcGVuLCBldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBtZXNzYWdlID0gJydcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgaWYgKHN0YXR1c1RleHQpIHtcbiAgICAgICAgICAgIHN0YXR1c1RleHQgPSBzdGF0dXNUZXh0LnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZXNzYWdlID1cbiAgICAgICAgICAgIFwiRXZlbnRTb3VyY2UncyByZXNwb25zZSBoYXMgYSBzdGF0dXMgXCIgK1xuICAgICAgICAgICAgc3RhdHVzICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICBzdGF0dXNUZXh0ICtcbiAgICAgICAgICAgICcgdGhhdCBpcyBub3QgMjAwLiBBYm9ydGluZyB0aGUgY29ubmVjdGlvbi4nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICBcIkV2ZW50U291cmNlJ3MgcmVzcG9uc2UgaGFzIGEgQ29udGVudC1UeXBlIHNwZWNpZnlpbmcgYW4gdW5zdXBwb3J0ZWQgdHlwZTogXCIgK1xuICAgICAgICAgICAgKGNvbnRlbnRUeXBlID09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/ICctJ1xuICAgICAgICAgICAgICA6IGNvbnRlbnRUeXBlLnJlcGxhY2UoL1xccysvZywgJyAnKSkgK1xuICAgICAgICAgICAgJy4gQWJvcnRpbmcgdGhlIGNvbm5lY3Rpb24uJ1xuICAgICAgICB9XG4gICAgICAgIHRocm93RXJyb3IobmV3IEVycm9yKG1lc3NhZ2UpKVxuICAgICAgICBjbG9zZSgpXG4gICAgICAgIHZhciBldmVudCA9IG5ldyBDb25uZWN0aW9uRXZlbnQoJ2Vycm9yJywge1xuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgIHN0YXR1c1RleHQ6IHN0YXR1c1RleHQsXG4gICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgfSlcbiAgICAgICAgZXMuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICAgICAgZmlyZShlcywgZXMub25lcnJvciwgZXZlbnQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG9uUHJvZ3Jlc3MgPSBmdW5jdGlvbiAodGV4dENodW5rKSB7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gT1BFTikge1xuICAgICAgdmFyIG4gPSAtMVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Q2h1bmsubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSB0ZXh0Q2h1bmsuY2hhckNvZGVBdChpKVxuICAgICAgICBpZiAoYyA9PT0gJ1xcbicuY2hhckNvZGVBdCgwKSB8fCBjID09PSAnXFxyJy5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgICAgbiA9IGlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNodW5rID0gKG4gIT09IC0xID8gdGV4dEJ1ZmZlciA6ICcnKSArIHRleHRDaHVuay5zbGljZSgwLCBuICsgMSlcbiAgICAgIHRleHRCdWZmZXIgPSAobiA9PT0gLTEgPyB0ZXh0QnVmZmVyIDogJycpICsgdGV4dENodW5rLnNsaWNlKG4gKyAxKVxuICAgICAgaWYgKGNodW5rICE9PSAnJykge1xuICAgICAgICB3YXNBY3Rpdml0eSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBjaHVuay5sZW5ndGg7IHBvc2l0aW9uICs9IDEpIHtcbiAgICAgICAgdmFyIGMgPSBjaHVuay5jaGFyQ29kZUF0KHBvc2l0aW9uKVxuICAgICAgICBpZiAoc3RhdGUgPT09IEFGVEVSX0NSICYmIGMgPT09ICdcXG4nLmNoYXJDb2RlQXQoMCkpIHtcbiAgICAgICAgICBzdGF0ZSA9IEZJRUxEX1NUQVJUXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBBRlRFUl9DUikge1xuICAgICAgICAgICAgc3RhdGUgPSBGSUVMRF9TVEFSVFxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoYyA9PT0gJ1xccicuY2hhckNvZGVBdCgwKSB8fCBjID09PSAnXFxuJy5jaGFyQ29kZUF0KDApKSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgIT09IEZJRUxEX1NUQVJUKSB7XG4gICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gRklFTEQpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZVN0YXJ0ID0gcG9zaXRpb24gKyAxXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGZpZWxkID0gY2h1bmsuc2xpY2UoZmllbGRTdGFydCwgdmFsdWVTdGFydCAtIDEpXG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGNodW5rLnNsaWNlKFxuICAgICAgICAgICAgICAgIHZhbHVlU3RhcnQgK1xuICAgICAgICAgICAgICAgICAgKHZhbHVlU3RhcnQgPCBwb3NpdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgY2h1bmsuY2hhckNvZGVBdCh2YWx1ZVN0YXJ0KSA9PT0gJyAnLmNoYXJDb2RlQXQoMClcbiAgICAgICAgICAgICAgICAgICAgPyAxXG4gICAgICAgICAgICAgICAgICAgIDogMCksXG4gICAgICAgICAgICAgICAgcG9zaXRpb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAoZmllbGQgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIgKz0gJ1xcbidcbiAgICAgICAgICAgICAgICBkYXRhQnVmZmVyICs9IHZhbHVlXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdpZCcpIHtcbiAgICAgICAgICAgICAgICBsYXN0RXZlbnRJZEJ1ZmZlciA9IHZhbHVlXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdldmVudCcpIHtcbiAgICAgICAgICAgICAgICBldmVudFR5cGVCdWZmZXIgPSB2YWx1ZVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09PSAncmV0cnknKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbFJldHJ5ID0gcGFyc2VEdXJhdGlvbih2YWx1ZSwgaW5pdGlhbFJldHJ5KVxuICAgICAgICAgICAgICAgIHJldHJ5ID0gaW5pdGlhbFJldHJ5XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT09ICdoZWFydGJlYXRUaW1lb3V0Jykge1xuICAgICAgICAgICAgICAgIGhlYXJ0YmVhdFRpbWVvdXQgPSBwYXJzZUR1cmF0aW9uKHZhbHVlLCBoZWFydGJlYXRUaW1lb3V0KVxuICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgb25UaW1lb3V0KClcbiAgICAgICAgICAgICAgICAgIH0sIGhlYXJ0YmVhdFRpbWVvdXQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IEZJRUxEX1NUQVJUKSB7XG4gICAgICAgICAgICAgIGlmIChkYXRhQnVmZmVyICE9PSAnJykge1xuICAgICAgICAgICAgICAgIGxhc3RFdmVudElkID0gbGFzdEV2ZW50SWRCdWZmZXJcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlQnVmZmVyID09PSAnJykge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlQnVmZmVyID0gJ21lc3NhZ2UnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyBNZXNzYWdlRXZlbnQoZXZlbnRUeXBlQnVmZmVyLCB7XG4gICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhQnVmZmVyLnNsaWNlKDEpLFxuICAgICAgICAgICAgICAgICAgbGFzdEV2ZW50SWQ6IGxhc3RFdmVudElkQnVmZmVyLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgZXMuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlQnVmZmVyID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgIGZpcmUoZXMsIGVzLm9ubWVzc2FnZSwgZXZlbnQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3RhdGUgPT09IENMT1NFRCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRhdGFCdWZmZXIgPSAnJ1xuICAgICAgICAgICAgICBldmVudFR5cGVCdWZmZXIgPSAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdGUgPSBjID09PSAnXFxyJy5jaGFyQ29kZUF0KDApID8gQUZURVJfQ1IgOiBGSUVMRF9TVEFSVFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IEZJRUxEX1NUQVJUKSB7XG4gICAgICAgICAgICAgIGZpZWxkU3RhcnQgPSBwb3NpdGlvblxuICAgICAgICAgICAgICBzdGF0ZSA9IEZJRUxEXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUgPT09IEZJRUxEKSB7XG4gICAgICAgICAgICAgIGlmIChjID09PSAnOicuY2hhckNvZGVBdCgwKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlU3RhcnQgPSBwb3NpdGlvbiArIDFcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IFZBTFVFX1NUQVJUXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFZBTFVFX1NUQVJUKSB7XG4gICAgICAgICAgICAgIHN0YXRlID0gVkFMVUVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgb25GaW5pc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gT1BFTiB8fCBjdXJyZW50U3RhdGUgPT09IENPTk5FQ1RJTkcpIHtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IFdBSVRJTkdcbiAgICAgIGlmICh0aW1lb3V0ICE9PSAwKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgICB0aW1lb3V0ID0gMFxuICAgICAgfVxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBvblRpbWVvdXQoKVxuICAgICAgfSwgcmV0cnkpXG4gICAgICByZXRyeSA9IGNsYW1wRHVyYXRpb24oTWF0aC5taW4oaW5pdGlhbFJldHJ5ICogMTYsIHJldHJ5ICogMikpXG5cbiAgICAgIGVzLnJlYWR5U3RhdGUgPSBDT05ORUNUSU5HXG4gICAgICB2YXIgZXZlbnQgPSBuZXcgRXZlbnQoJ2Vycm9yJylcbiAgICAgIGVzLmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgICBmaXJlKGVzLCBlcy5vbmVycm9yLCBldmVudClcbiAgICB9XG4gIH1cblxuICB2YXIgY2xvc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgY3VycmVudFN0YXRlID0gQ0xPU0VEXG4gICAgaWYgKGNhbmNlbEZ1bmN0aW9uICE9IHVuZGVmaW5lZCkge1xuICAgICAgY2FuY2VsRnVuY3Rpb24oKVxuICAgICAgY2FuY2VsRnVuY3Rpb24gPSB1bmRlZmluZWRcbiAgICB9XG4gICAgaWYgKHRpbWVvdXQgIT09IDApIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KVxuICAgICAgdGltZW91dCA9IDBcbiAgICB9XG4gICAgZXMucmVhZHlTdGF0ZSA9IENMT1NFRFxuICB9XG5cbiAgdmFyIG9uVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aW1lb3V0ID0gMFxuXG4gICAgaWYgKGN1cnJlbnRTdGF0ZSAhPT0gV0FJVElORykge1xuICAgICAgaWYgKCF3YXNBY3Rpdml0eSAmJiBjYW5jZWxGdW5jdGlvbiAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3dFcnJvcihcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnTm8gYWN0aXZpdHkgd2l0aGluICcgK1xuICAgICAgICAgICAgICBoZWFydGJlYXRUaW1lb3V0ICtcbiAgICAgICAgICAgICAgJyBtaWxsaXNlY29uZHMuIFJlY29ubmVjdGluZy4nXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIGNhbmNlbEZ1bmN0aW9uKClcbiAgICAgICAgY2FuY2VsRnVuY3Rpb24gPSB1bmRlZmluZWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdhc0FjdGl2aXR5ID0gZmFsc2VcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG9uVGltZW91dCgpXG4gICAgICAgIH0sIGhlYXJ0YmVhdFRpbWVvdXQpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB3YXNBY3Rpdml0eSA9IGZhbHNlXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgb25UaW1lb3V0KClcbiAgICB9LCBoZWFydGJlYXRUaW1lb3V0KVxuXG4gICAgY3VycmVudFN0YXRlID0gQ09OTkVDVElOR1xuICAgIGRhdGFCdWZmZXIgPSAnJ1xuICAgIGV2ZW50VHlwZUJ1ZmZlciA9ICcnXG4gICAgbGFzdEV2ZW50SWRCdWZmZXIgPSBsYXN0RXZlbnRJZFxuICAgIHRleHRCdWZmZXIgPSAnJ1xuICAgIGZpZWxkU3RhcnQgPSAwXG4gICAgdmFsdWVTdGFydCA9IDBcbiAgICBzdGF0ZSA9IEZJRUxEX1NUQVJUXG5cbiAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00Mjg5MTZcbiAgICAvLyBSZXF1ZXN0IGhlYWRlciBmaWVsZCBMYXN0LUV2ZW50LUlEIGlzIG5vdCBhbGxvd2VkIGJ5IEFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMuXG4gICAgdmFyIHJlcXVlc3RVUkwgPSB1cmxcbiAgICBpZiAodXJsLnNsaWNlKDAsIDUpICE9PSAnZGF0YTonICYmIHVybC5zbGljZSgwLCA1KSAhPT0gJ2Jsb2I6Jykge1xuICAgICAgaWYgKGxhc3RFdmVudElkICE9PSAnJykge1xuICAgICAgICByZXF1ZXN0VVJMICs9XG4gICAgICAgICAgKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArXG4gICAgICAgICAgJ2xhc3RFdmVudElkPScgK1xuICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChsYXN0RXZlbnRJZClcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHJlcXVlc3RIZWFkZXJzID0ge31cbiAgICByZXF1ZXN0SGVhZGVyc1snQWNjZXB0J10gPSAndGV4dC9ldmVudC1zdHJlYW0nXG4gICAgaWYgKGhlYWRlcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoZWFkZXJzLCBuYW1lKSkge1xuICAgICAgICAgIHJlcXVlc3RIZWFkZXJzW25hbWVdID0gaGVhZGVyc1tuYW1lXVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0cmFuc3BvcnQub3BlbihcbiAgICAgICAgeGhyLFxuICAgICAgICBvblN0YXJ0LFxuICAgICAgICBvblByb2dyZXNzLFxuICAgICAgICBvbkZpbmlzaCxcbiAgICAgICAgcmVxdWVzdFVSTCxcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzLFxuICAgICAgICByZXF1ZXN0SGVhZGVyc1xuICAgICAgKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjbG9zZSgpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIGVzLnVybCA9IHVybFxuICBlcy5yZWFkeVN0YXRlID0gQ09OTkVDVElOR1xuICBlcy53aXRoQ3JlZGVudGlhbHMgPSB3aXRoQ3JlZGVudGlhbHNcbiAgZXMuX2Nsb3NlID0gY2xvc2VcblxuICBvblRpbWVvdXQoKVxufVxuXG5FdmVudFNvdXJjZVBvbHlmaWxsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXZlbnRUYXJnZXQucHJvdG90eXBlKVxuRXZlbnRTb3VyY2VQb2x5ZmlsbC5wcm90b3R5cGUuQ09OTkVDVElORyA9IENPTk5FQ1RJTkdcbkV2ZW50U291cmNlUG9seWZpbGwucHJvdG90eXBlLk9QRU4gPSBPUEVOXG5FdmVudFNvdXJjZVBvbHlmaWxsLnByb3RvdHlwZS5DTE9TRUQgPSBDTE9TRURcbkV2ZW50U291cmNlUG9seWZpbGwucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLl9jbG9zZSgpXG59XG5cbkV2ZW50U291cmNlUG9seWZpbGwuQ09OTkVDVElORyA9IENPTk5FQ1RJTkdcbkV2ZW50U291cmNlUG9seWZpbGwuT1BFTiA9IE9QRU5cbkV2ZW50U291cmNlUG9seWZpbGwuQ0xPU0VEID0gQ0xPU0VEXG5FdmVudFNvdXJjZVBvbHlmaWxsLnByb3RvdHlwZS53aXRoQ3JlZGVudGlhbHMgPSB1bmRlZmluZWRcblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRTb3VyY2VQb2x5ZmlsbFxuIiwiLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBOZXh0LmpzJyBuby1GT1VDIHN0eWxlcyB3b3JrYXJvdW5kIGZvciB1c2luZ1xuLy8gYHN0eWxlLWxvYWRlcmAgaW4gZGV2ZWxvcG1lbnQuIEl0IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBoeWRyYXRpb24sIG9yIGVsc2Vcbi8vIHJlbmRlcmluZyB3b24ndCBoYXZlIHRoZSBjb3JyZWN0IGNvbXB1dGVkIHZhbHVlcyBpbiBlZmZlY3RzLlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BsYXlDb250ZW50KGNhbGxiYWNrKSB7XG4gIDsod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0KShmdW5jdGlvbiAoKSB7XG4gICAgZm9yIChcbiAgICAgIHZhciB4ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtbmV4dC1oaWRlLWZvdWNdJyksIGkgPSB4Lmxlbmd0aDtcbiAgICAgIGktLTtcblxuICAgICkge1xuICAgICAgeFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHhbaV0pXG4gICAgfVxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCBSb3V0ZXIgZnJvbSAnbmV4dC9yb3V0ZXInXG5pbXBvcnQgeyBzZXR1cFBpbmcsIGN1cnJlbnRQYWdlLCBjbG9zZVBpbmcgfSBmcm9tICcuL29uLWRlbWFuZC1lbnRyaWVzLXV0aWxzJ1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyAoeyBhc3NldFByZWZpeCB9KSA9PiB7XG4gIFJvdXRlci5yZWFkeSgoKSA9PiB7XG4gICAgUm91dGVyLmV2ZW50cy5vbihcbiAgICAgICdyb3V0ZUNoYW5nZUNvbXBsZXRlJyxcbiAgICAgIHNldHVwUGluZy5iaW5kKHRoaXMsIGFzc2V0UHJlZml4LCAoKSA9PiBSb3V0ZXIucGF0aG5hbWUpXG4gICAgKVxuICB9KVxuXG4gIHNldHVwUGluZyhhc3NldFByZWZpeCwgKCkgPT4gUm91dGVyLnBhdGhuYW1lLCBjdXJyZW50UGFnZSlcblxuICAvLyBwcmV2ZW50IEhNUiBjb25uZWN0aW9uIGZyb20gYmVpbmcgY2xvc2VkIHdoZW4gcnVubmluZyB0ZXN0c1xuICBpZiAoIXByb2Nlc3MuZW52Ll9fTkVYVF9URVNUX01PREUpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKF9ldmVudCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGUgPSBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVcbiAgICAgIGlmIChzdGF0ZSA9PT0gJ3Zpc2libGUnKSB7XG4gICAgICAgIHNldHVwUGluZyhhc3NldFByZWZpeCwgKCkgPT4gUm91dGVyLnBhdGhuYW1lLCB0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvc2VQaW5nKClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICAgIGNsb3NlUGluZygpXG4gICAgfSlcbiAgfVxufVxuIiwiLyogZ2xvYmFsIGxvY2F0aW9uICovXG5pbXBvcnQgeyBnZXRFdmVudFNvdXJjZVdyYXBwZXIgfSBmcm9tICcuL2Vycm9yLW92ZXJsYXkvZXZlbnRzb3VyY2UnXG5cbmxldCBldnRTb3VyY2VcbmV4cG9ydCBsZXQgY3VycmVudFBhZ2VcblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlUGluZygpIHtcbiAgaWYgKGV2dFNvdXJjZSkgZXZ0U291cmNlLmNsb3NlKClcbiAgZXZ0U291cmNlID0gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBQaW5nKGFzc2V0UHJlZml4LCBwYXRobmFtZUZuLCByZXRyeSkge1xuICBjb25zdCBwYXRobmFtZSA9IHBhdGhuYW1lRm4oKVxuXG4gIC8vIE1ha2Ugc3VyZSB0byBvbmx5IGNyZWF0ZSBuZXcgRXZlbnRTb3VyY2UgcmVxdWVzdCBpZiBwYWdlIGhhcyBjaGFuZ2VkXG4gIGlmIChwYXRobmFtZSA9PT0gY3VycmVudFBhZ2UgJiYgIXJldHJ5KSByZXR1cm5cbiAgY3VycmVudFBhZ2UgPSBwYXRobmFtZVxuICAvLyBjbG9zZSBjdXJyZW50IEV2ZW50U291cmNlIGNvbm5lY3Rpb25cbiAgY2xvc2VQaW5nKClcblxuICBjb25zdCB1cmwgPSBgJHthc3NldFByZWZpeH0vX25leHQvd2VicGFjay1obXI/cGFnZT0ke2N1cnJlbnRQYWdlfWBcbiAgZXZ0U291cmNlID0gZ2V0RXZlbnRTb3VyY2VXcmFwcGVyKHsgcGF0aDogdXJsLCB0aW1lb3V0OiA1MDAwLCBvbmRlbWFuZDogMSB9KVxuXG4gIGV2dFNvdXJjZS5hZGRNZXNzYWdlTGlzdGVuZXIoKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LmRhdGEuaW5kZXhPZigneycpID09PSAtMSkgcmV0dXJuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpXG4gICAgICBpZiAocGF5bG9hZC5pbnZhbGlkKSB7XG4gICAgICAgIC8vIFBheWxvYWQgY2FuIGJlIGludmFsaWQgZXZlbiBpZiB0aGUgcGFnZSBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgLy8gU28sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0IGV4aXN0cyBiZWZvcmUgcmVsb2FkaW5nLlxuICAgICAgICBmZXRjaChsb2NhdGlvbi5ocmVmLCB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgIH0pLnRoZW4oKHBhZ2VSZXMpID0+IHtcbiAgICAgICAgICBpZiAocGFnZVJlcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdvbi1kZW1hbmQtZW50cmllcyBmYWlsZWQgdG8gcGFyc2UgcmVzcG9uc2UnLCBlcnIpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IGNvbm5lY3QgZnJvbSAnLi9lcnJvci1vdmVybGF5L2hvdC1kZXYtY2xpZW50J1xuXG5leHBvcnQgZGVmYXVsdCAoeyBhc3NldFByZWZpeCB9KSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgcGF0aDogYCR7YXNzZXRQcmVmaXh9L19uZXh0L3dlYnBhY2staG1yYCxcbiAgfVxuXG4gIGNvbnN0IGRldkNsaWVudCA9IGNvbm5lY3Qob3B0aW9ucylcblxuICBkZXZDbGllbnQuc3Vic2NyaWJlVG9IbXJFdmVudCgob2JqKSA9PiB7XG4gICAgaWYgKG9iai5hY3Rpb24gPT09ICdyZWxvYWRQYWdlJykge1xuICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgIH1cbiAgICBpZiAob2JqLmFjdGlvbiA9PT0gJ3JlbW92ZWRQYWdlJykge1xuICAgICAgY29uc3QgW3BhZ2VdID0gb2JqLmRhdGFcbiAgICAgIGlmIChwYWdlID09PSB3aW5kb3cubmV4dC5yb3V0ZXIucGF0aG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgfVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChvYmouYWN0aW9uID09PSAnYWRkZWRQYWdlJykge1xuICAgICAgY29uc3QgW3BhZ2VdID0gb2JqLmRhdGFcbiAgICAgIGlmIChcbiAgICAgICAgcGFnZSA9PT0gd2luZG93Lm5leHQucm91dGVyLnBhdGhuYW1lICYmXG4gICAgICAgIHR5cGVvZiB3aW5kb3cubmV4dC5yb3V0ZXIuY29tcG9uZW50c1twYWdlXSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIGFjdGlvbiAnICsgb2JqLmFjdGlvbilcbiAgfSlcblxuICByZXR1cm4gZGV2Q2xpZW50XG59XG4iLCJleHBvcnQgY29uc3QgRE9NQXR0cmlidXRlTmFtZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGFjY2VwdENoYXJzZXQ6ICdhY2NlcHQtY2hhcnNldCcsXG4gIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgaHRtbEZvcjogJ2ZvcicsXG4gIGh0dHBFcXVpdjogJ2h0dHAtZXF1aXYnLFxuICBub01vZHVsZTogJ25vTW9kdWxlJyxcbn1cblxuZnVuY3Rpb24gcmVhY3RFbGVtZW50VG9ET00oeyB0eXBlLCBwcm9wcyB9OiBKU1guRWxlbWVudCk6IEhUTUxFbGVtZW50IHtcbiAgY29uc3QgZWw6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKVxuICBmb3IgKGNvbnN0IHAgaW4gcHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KHApKSBjb250aW51ZVxuICAgIGlmIChwID09PSAnY2hpbGRyZW4nIHx8IHAgPT09ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcpIGNvbnRpbnVlXG5cbiAgICAvLyB3ZSBkb24ndCByZW5kZXIgdW5kZWZpbmVkIHByb3BzIHRvIHRoZSBET01cbiAgICBpZiAocHJvcHNbcF0gPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgIGNvbnN0IGF0dHIgPSBET01BdHRyaWJ1dGVOYW1lc1twXSB8fCBwLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoXG4gICAgICB0eXBlID09PSAnc2NyaXB0JyAmJlxuICAgICAgKGF0dHIgPT09ICdhc3luYycgfHwgYXR0ciA9PT0gJ2RlZmVyJyB8fCBhdHRyID09PSAnbm9Nb2R1bGUnKVxuICAgICkge1xuICAgICAgOyhlbCBhcyBIVE1MU2NyaXB0RWxlbWVudClbYXR0cl0gPSAhIXByb3BzW3BdXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCBwcm9wc1twXSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IGNoaWxkcmVuLCBkYW5nZXJvdXNseVNldElubmVySFRNTCB9ID0gcHJvcHNcbiAgaWYgKGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSB7XG4gICAgZWwuaW5uZXJIVE1MID0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sIHx8ICcnXG4gIH0gZWxzZSBpZiAoY2hpbGRyZW4pIHtcbiAgICBlbC50ZXh0Q29udGVudCA9XG4gICAgICB0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnXG4gICAgICAgID8gY2hpbGRyZW5cbiAgICAgICAgOiBBcnJheS5pc0FycmF5KGNoaWxkcmVuKVxuICAgICAgICA/IGNoaWxkcmVuLmpvaW4oJycpXG4gICAgICAgIDogJydcbiAgfVxuICByZXR1cm4gZWxcbn1cblxuZnVuY3Rpb24gdXBkYXRlRWxlbWVudHModHlwZTogc3RyaW5nLCBjb21wb25lbnRzOiBKU1guRWxlbWVudFtdKTogdm9pZCB7XG4gIGNvbnN0IGhlYWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF1cbiAgY29uc3QgaGVhZENvdW50RWw6IEhUTUxNZXRhRWxlbWVudCA9IGhlYWRFbC5xdWVyeVNlbGVjdG9yKFxuICAgICdtZXRhW25hbWU9bmV4dC1oZWFkLWNvdW50XSdcbiAgKSBhcyBIVE1MTWV0YUVsZW1lbnRcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoIWhlYWRDb3VudEVsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnV2FybmluZzogbmV4dC1oZWFkLWNvdW50IGlzIG1pc3NpbmcuIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL25leHQtaGVhZC1jb3VudC1taXNzaW5nJ1xuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGVhZENvdW50ID0gTnVtYmVyKGhlYWRDb3VudEVsLmNvbnRlbnQpXG4gIGNvbnN0IG9sZFRhZ3M6IEVsZW1lbnRbXSA9IFtdXG5cbiAgZm9yIChcbiAgICBsZXQgaSA9IDAsIGogPSBoZWFkQ291bnRFbC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgIGkgPCBoZWFkQ291bnQ7XG4gICAgaSsrLCBqID0gaiEucHJldmlvdXNFbGVtZW50U2libGluZ1xuICApIHtcbiAgICBpZiAoaiEudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0eXBlKSB7XG4gICAgICBvbGRUYWdzLnB1c2goaiEpXG4gICAgfVxuICB9XG4gIGNvbnN0IG5ld1RhZ3MgPSAoY29tcG9uZW50cy5tYXAocmVhY3RFbGVtZW50VG9ET00pIGFzIEhUTUxFbGVtZW50W10pLmZpbHRlcihcbiAgICAobmV3VGFnKSA9PiB7XG4gICAgICBmb3IgKGxldCBrID0gMCwgbGVuID0gb2xkVGFncy5sZW5ndGg7IGsgPCBsZW47IGsrKykge1xuICAgICAgICBjb25zdCBvbGRUYWcgPSBvbGRUYWdzW2tdXG4gICAgICAgIGlmIChvbGRUYWcuaXNFcXVhbE5vZGUobmV3VGFnKSkge1xuICAgICAgICAgIG9sZFRhZ3Muc3BsaWNlKGssIDEpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICApXG5cbiAgb2xkVGFncy5mb3JFYWNoKCh0KSA9PiB0LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHQpKVxuICBuZXdUYWdzLmZvckVhY2goKHQpID0+IGhlYWRFbC5pbnNlcnRCZWZvcmUodCwgaGVhZENvdW50RWwpKVxuICBoZWFkQ291bnRFbC5jb250ZW50ID0gKGhlYWRDb3VudCAtIG9sZFRhZ3MubGVuZ3RoICsgbmV3VGFncy5sZW5ndGgpLnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaW5pdEhlYWRNYW5hZ2VyKCk6IHtcbiAgbW91bnRlZEluc3RhbmNlczogU2V0PHVua25vd24+XG4gIHVwZGF0ZUhlYWQ6IChoZWFkOiBKU1guRWxlbWVudFtdKSA9PiB2b2lkXG59IHtcbiAgbGV0IHVwZGF0ZVByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbFxuXG4gIHJldHVybiB7XG4gICAgbW91bnRlZEluc3RhbmNlczogbmV3IFNldCgpLFxuICAgIHVwZGF0ZUhlYWQ6IChoZWFkOiBKU1guRWxlbWVudFtdKSA9PiB7XG4gICAgICBjb25zdCBwcm9taXNlID0gKHVwZGF0ZVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHByb21pc2UgIT09IHVwZGF0ZVByb21pc2UpIHJldHVyblxuXG4gICAgICAgIHVwZGF0ZVByb21pc2UgPSBudWxsXG4gICAgICAgIGNvbnN0IHRhZ3M6IFJlY29yZDxzdHJpbmcsIEpTWC5FbGVtZW50W10+ID0ge31cblxuICAgICAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdGFnc1toLnR5cGVdIHx8IFtdXG4gICAgICAgICAgY29tcG9uZW50cy5wdXNoKGgpXG4gICAgICAgICAgdGFnc1toLnR5cGVdID0gY29tcG9uZW50c1xuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHRpdGxlQ29tcG9uZW50ID0gdGFncy50aXRsZSA/IHRhZ3MudGl0bGVbMF0gOiBudWxsXG4gICAgICAgIGxldCB0aXRsZSA9ICcnXG4gICAgICAgIGlmICh0aXRsZUNvbXBvbmVudCkge1xuICAgICAgICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHRpdGxlQ29tcG9uZW50LnByb3BzXG4gICAgICAgICAgdGl0bGUgPVxuICAgICAgICAgICAgdHlwZW9mIGNoaWxkcmVuID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICA/IGNoaWxkcmVuXG4gICAgICAgICAgICAgIDogQXJyYXkuaXNBcnJheShjaGlsZHJlbilcbiAgICAgICAgICAgICAgPyBjaGlsZHJlbi5qb2luKCcnKVxuICAgICAgICAgICAgICA6ICcnXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpdGxlICE9PSBkb2N1bWVudC50aXRsZSkgZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgICA7WydtZXRhJywgJ2Jhc2UnLCAnbGluaycsICdzdHlsZScsICdzY3JpcHQnXS5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICAgICAgdXBkYXRlRWxlbWVudHModHlwZSwgdGFnc1t0eXBlXSB8fCBbXSlcbiAgICAgICAgfSlcbiAgICAgIH0pKVxuICAgIH0sXG4gIH1cbn1cbiIsIi8qIGdsb2JhbCBsb2NhdGlvbiAqL1xuaW1wb3J0ICdAbmV4dC9wb2x5ZmlsbC1tb2R1bGUnXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IHsgSGVhZE1hbmFnZXJDb250ZXh0IH0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL2hlYWQtbWFuYWdlci1jb250ZXh0J1xuaW1wb3J0IG1pdHQsIHsgTWl0dEVtaXR0ZXIgfSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvbWl0dCdcbmltcG9ydCB7IFJvdXRlckNvbnRleHQgfSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyLWNvbnRleHQnXG5pbXBvcnQgUm91dGVyLCB7XG4gIEFwcENvbXBvbmVudCxcbiAgQXBwUHJvcHMsXG4gIGRlbEJhc2VQYXRoLFxuICBoYXNCYXNlUGF0aCxcbiAgUHJpdmF0ZVJvdXRlSW5mbyxcbn0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci9yb3V0ZXInXG5pbXBvcnQgeyBpc0R5bmFtaWNSb3V0ZSB9IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvaXMtZHluYW1pYydcbmltcG9ydCAqIGFzIHF1ZXJ5c3RyaW5nIGZyb20gJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvcXVlcnlzdHJpbmcnXG5pbXBvcnQgKiBhcyBlbnZDb25maWcgZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL3J1bnRpbWUtY29uZmlnJ1xuaW1wb3J0IHtcbiAgZ2V0VVJMLFxuICBsb2FkR2V0SW5pdGlhbFByb3BzLFxuICBORVhUX0RBVEEsXG4gIFNULFxufSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvdXRpbHMnXG5pbXBvcnQgeyBQb3J0YWwgfSBmcm9tICcuL3BvcnRhbCdcbmltcG9ydCBpbml0SGVhZE1hbmFnZXIgZnJvbSAnLi9oZWFkLW1hbmFnZXInXG5pbXBvcnQgUGFnZUxvYWRlciwgeyBTdHlsZVNoZWV0VHVwbGUgfSBmcm9tICcuL3BhZ2UtbG9hZGVyJ1xuaW1wb3J0IG1lYXN1cmVXZWJWaXRhbHMgZnJvbSAnLi9wZXJmb3JtYW5jZS1yZWxheWVyJ1xuaW1wb3J0IHsgUm91dGVBbm5vdW5jZXIgfSBmcm9tICcuL3JvdXRlLWFubm91bmNlcidcbmltcG9ydCB7IGNyZWF0ZVJvdXRlciwgbWFrZVB1YmxpY1JvdXRlckluc3RhbmNlIH0gZnJvbSAnLi9yb3V0ZXInXG5cbi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwicmVhY3QtZG9tL2V4cGVyaW1lbnRhbFwiIC8+XG5cbmRlY2xhcmUgbGV0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fOiBzdHJpbmdcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAvKiB0ZXN0IGZucyAqL1xuICAgIF9fTkVYVF9IWURSQVRFRD86IGJvb2xlYW5cbiAgICBfX05FWFRfSFlEUkFURURfQ0I/OiAoKSA9PiB2b2lkXG5cbiAgICAvKiBwcm9kICovXG4gICAgX19ORVhUX1BSRUxPQURSRUFEWT86IChpZHM/OiBzdHJpbmdbXSkgPT4gdm9pZFxuICAgIF9fTkVYVF9EQVRBX186IE5FWFRfREFUQVxuICAgIF9fTkVYVF9QOiBhbnlbXVxuICB9XG59XG5cbnR5cGUgUmVuZGVyUm91dGVJbmZvID0gUHJpdmF0ZVJvdXRlSW5mbyAmIHtcbiAgQXBwOiBBcHBDb21wb25lbnRcbiAgc2Nyb2xsPzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbFxufVxudHlwZSBSZW5kZXJFcnJvclByb3BzID0gT21pdDxSZW5kZXJSb3V0ZUluZm8sICdDb21wb25lbnQnIHwgJ3N0eWxlU2hlZXRzJz5cblxuY29uc3QgZGF0YTogdHlwZW9mIHdpbmRvd1snX19ORVhUX0RBVEFfXyddID0gSlNPTi5wYXJzZShcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fTkVYVF9EQVRBX18nKSEudGV4dENvbnRlbnQhXG4pXG53aW5kb3cuX19ORVhUX0RBVEFfXyA9IGRhdGFcblxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBwcm9jZXNzLmVudi5fX05FWFRfVkVSU0lPTlxuXG5jb25zdCBsb29zZVRvQXJyYXkgPSA8VCBleHRlbmRzIHt9PihpbnB1dDogYW55KTogVFtdID0+IFtdLnNsaWNlLmNhbGwoaW5wdXQpXG5cbmNvbnN0IHtcbiAgcHJvcHM6IGh5ZHJhdGVQcm9wcyxcbiAgZXJyOiBoeWRyYXRlRXJyLFxuICBwYWdlLFxuICBxdWVyeSxcbiAgYnVpbGRJZCxcbiAgYXNzZXRQcmVmaXgsXG4gIHJ1bnRpbWVDb25maWcsXG4gIGR5bmFtaWNJZHMsXG4gIGlzRmFsbGJhY2ssXG4gIGxvY2FsZSxcbiAgbG9jYWxlcyxcbiAgZG9tYWluTG9jYWxlcyxcbiAgaXNQcmV2aWV3LFxufSA9IGRhdGFcblxubGV0IHsgZGVmYXVsdExvY2FsZSB9ID0gZGF0YVxuXG5jb25zdCBwcmVmaXg6IHN0cmluZyA9IGFzc2V0UHJlZml4IHx8ICcnXG5cbi8vIFdpdGggZHluYW1pYyBhc3NldFByZWZpeCBpdCdzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQgYXNzZXRQcmVmaXggYXQgdGhlIGJ1aWxkIHRpbWVcbi8vIFNvLCB0aGlzIGlzIGhvdyB3ZSBkbyBpdCBpbiB0aGUgY2xpZW50IHNpZGUgYXQgcnVudGltZVxuX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSBgJHtwcmVmaXh9L19uZXh0L2AgLy9lc2xpbnQtZGlzYWJsZS1saW5lXG4vLyBJbml0aWFsaXplIG5leHQvY29uZmlnIHdpdGggdGhlIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb25cbmVudkNvbmZpZy5zZXRDb25maWcoe1xuICBzZXJ2ZXJSdW50aW1lQ29uZmlnOiB7fSxcbiAgcHVibGljUnVudGltZUNvbmZpZzogcnVudGltZUNvbmZpZyB8fCB7fSxcbn0pXG5cbmxldCBhc1BhdGg6IHN0cmluZyA9IGdldFVSTCgpXG5cbi8vIG1ha2Ugc3VyZSBub3QgdG8gYXR0ZW1wdCBzdHJpcHBpbmcgYmFzZVBhdGggZm9yIDQwNHNcbmlmIChoYXNCYXNlUGF0aChhc1BhdGgpKSB7XG4gIGFzUGF0aCA9IGRlbEJhc2VQYXRoKGFzUGF0aClcbn1cblxuaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgY29uc3Qge1xuICAgIG5vcm1hbGl6ZUxvY2FsZVBhdGgsXG4gIH0gPSByZXF1aXJlKCcuLi9uZXh0LXNlcnZlci9saWIvaTE4bi9ub3JtYWxpemUtbG9jYWxlLXBhdGgnKSBhcyB0eXBlb2YgaW1wb3J0KCcuLi9uZXh0LXNlcnZlci9saWIvaTE4bi9ub3JtYWxpemUtbG9jYWxlLXBhdGgnKVxuXG4gIGNvbnN0IHtcbiAgICBkZXRlY3REb21haW5Mb2NhbGUsXG4gIH0gPSByZXF1aXJlKCcuLi9uZXh0LXNlcnZlci9saWIvaTE4bi9kZXRlY3QtZG9tYWluLWxvY2FsZScpIGFzIHR5cGVvZiBpbXBvcnQoJy4uL25leHQtc2VydmVyL2xpYi9pMThuL2RldGVjdC1kb21haW4tbG9jYWxlJylcblxuICBjb25zdCB7XG4gICAgcGFyc2VSZWxhdGl2ZVVybCxcbiAgfSA9IHJlcXVpcmUoJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvcGFyc2UtcmVsYXRpdmUtdXJsJykgYXMgdHlwZW9mIGltcG9ydCgnLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9wYXJzZS1yZWxhdGl2ZS11cmwnKVxuXG4gIGNvbnN0IHtcbiAgICBmb3JtYXRVcmwsXG4gIH0gPSByZXF1aXJlKCcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2Zvcm1hdC11cmwnKSBhcyB0eXBlb2YgaW1wb3J0KCcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2Zvcm1hdC11cmwnKVxuXG4gIGlmIChsb2NhbGVzKSB7XG4gICAgY29uc3QgcGFyc2VkQXMgPSBwYXJzZVJlbGF0aXZlVXJsKGFzUGF0aClcbiAgICBjb25zdCBsb2NhbGVQYXRoUmVzdWx0ID0gbm9ybWFsaXplTG9jYWxlUGF0aChwYXJzZWRBcy5wYXRobmFtZSwgbG9jYWxlcylcblxuICAgIGlmIChsb2NhbGVQYXRoUmVzdWx0LmRldGVjdGVkTG9jYWxlKSB7XG4gICAgICBwYXJzZWRBcy5wYXRobmFtZSA9IGxvY2FsZVBhdGhSZXN1bHQucGF0aG5hbWVcbiAgICAgIGFzUGF0aCA9IGZvcm1hdFVybChwYXJzZWRBcylcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGVyaXZlIHRoZSBkZWZhdWx0IGxvY2FsZSBpZiBpdCB3YXNuJ3QgZGV0ZWN0ZWQgaW4gdGhlIGFzUGF0aFxuICAgICAgLy8gc2luY2Ugd2UgZG9uJ3QgcHJlcmVuZGVyIHN0YXRpYyBwYWdlcyB3aXRoIGFsbCBwb3NzaWJsZSBkZWZhdWx0XG4gICAgICAvLyBsb2NhbGVzXG4gICAgICBkZWZhdWx0TG9jYWxlID0gbG9jYWxlXG4gICAgfVxuXG4gICAgLy8gYXR0ZW1wdCBkZXRlY3RpbmcgZGVmYXVsdCBsb2NhbGUgYmFzZWQgb24gaG9zdG5hbWVcbiAgICBjb25zdCBkZXRlY3RlZERvbWFpbiA9IGRldGVjdERvbWFpbkxvY2FsZShcbiAgICAgIHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX0RPTUFJTlMgYXMgYW55LFxuICAgICAgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lXG4gICAgKVxuXG4gICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgaWYgZGVmYXVsdExvY2FsZSBuZWVkcyB0byBiZSBwb3B1bGF0ZWQgYWZ0ZXJcbiAgICAvLyBoeWRyYXRpb24gdG8gcHJldmVudCBtaXNtYXRjaGVkIHJlbmRlcnNcbiAgICBpZiAoZGV0ZWN0ZWREb21haW4pIHtcbiAgICAgIGRlZmF1bHRMb2NhbGUgPSBkZXRlY3RlZERvbWFpbi5kZWZhdWx0TG9jYWxlXG4gICAgfVxuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5fX05FWFRfU0NSSVBUX0xPQURFUiAmJiBkYXRhLnNjcmlwdExvYWRlcikge1xuICBjb25zdCB7IGluaXRTY3JpcHRMb2FkZXIgfSA9IHJlcXVpcmUoJy4vZXhwZXJpbWVudGFsLXNjcmlwdCcpXG4gIGluaXRTY3JpcHRMb2FkZXIoZGF0YS5zY3JpcHRMb2FkZXIpXG59XG5cbnR5cGUgUmVnaXN0ZXJGbiA9IChpbnB1dDogW3N0cmluZywgKCkgPT4gdm9pZF0pID0+IHZvaWRcblxuY29uc3QgcGFnZUxvYWRlcjogUGFnZUxvYWRlciA9IG5ldyBQYWdlTG9hZGVyKGJ1aWxkSWQsIHByZWZpeClcbmNvbnN0IHJlZ2lzdGVyOiBSZWdpc3RlckZuID0gKFtyLCBmXSkgPT5cbiAgcGFnZUxvYWRlci5yb3V0ZUxvYWRlci5vbkVudHJ5cG9pbnQociwgZilcbmlmICh3aW5kb3cuX19ORVhUX1ApIHtcbiAgLy8gRGVmZXIgcGFnZSByZWdpc3RyYXRpb24gZm9yIGFub3RoZXIgdGljay4gVGhpcyB3aWxsIGluY3JlYXNlIHRoZSBvdmVyYWxsXG4gIC8vIGxhdGVuY3kgaW4gaHlkcmF0aW5nIHRoZSBwYWdlLCBidXQgcmVkdWNlIHRoZSB0b3RhbCBibG9ja2luZyB0aW1lLlxuICB3aW5kb3cuX19ORVhUX1AubWFwKChwKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlZ2lzdGVyKHApLCAwKSlcbn1cbndpbmRvdy5fX05FWFRfUCA9IFtdXG47KHdpbmRvdy5fX05FWFRfUCBhcyBhbnkpLnB1c2ggPSByZWdpc3RlclxuXG5jb25zdCBoZWFkTWFuYWdlcjoge1xuICBtb3VudGVkSW5zdGFuY2VzOiBTZXQ8dW5rbm93bj5cbiAgdXBkYXRlSGVhZDogKGhlYWQ6IEpTWC5FbGVtZW50W10pID0+IHZvaWRcbn0gPSBpbml0SGVhZE1hbmFnZXIoKVxuY29uc3QgYXBwRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ19fbmV4dCcpXG5cbmxldCBsYXN0UmVuZGVyUmVqZWN0OiAoKCkgPT4gdm9pZCkgfCBudWxsXG5sZXQgd2VicGFja0hNUjogYW55XG5leHBvcnQgbGV0IHJvdXRlcjogUm91dGVyXG5sZXQgQ2FjaGVkQXBwOiBBcHBDb21wb25lbnQsIG9uUGVyZkVudHJ5OiAobWV0cmljOiBhbnkpID0+IHZvaWRcblxuY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PHtcbiAgZm46IChlcnI6IEVycm9yLCBpbmZvPzogYW55KSA9PiB2b2lkXG59PiB7XG4gIGNvbXBvbmVudERpZENhdGNoKGNvbXBvbmVudEVycjogRXJyb3IsIGluZm86IGFueSkge1xuICAgIHRoaXMucHJvcHMuZm4oY29tcG9uZW50RXJyLCBpbmZvKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5zY3JvbGxUb0hhc2goKVxuXG4gICAgLy8gV2UgbmVlZCB0byByZXBsYWNlIHRoZSByb3V0ZXIgc3RhdGUgaWY6XG4gICAgLy8gLSB0aGUgcGFnZSB3YXMgKGF1dG8pIGV4cG9ydGVkIGFuZCBoYXMgYSBxdWVyeSBzdHJpbmcgb3Igc2VhcmNoIChoYXNoKVxuICAgIC8vIC0gaXQgd2FzIGF1dG8gZXhwb3J0ZWQgYW5kIGlzIGEgZHluYW1pYyByb3V0ZSAodG8gcHJvdmlkZSBwYXJhbXMpXG4gICAgLy8gLSBpZiBpdCBpcyBhIGNsaWVudC1zaWRlIHNrZWxldG9uIChmYWxsYmFjayByZW5kZXIpXG4gICAgaWYgKFxuICAgICAgcm91dGVyLmlzU3NyICYmXG4gICAgICAoaXNGYWxsYmFjayB8fFxuICAgICAgICAoZGF0YS5uZXh0RXhwb3J0ICYmXG4gICAgICAgICAgKGlzRHluYW1pY1JvdXRlKHJvdXRlci5wYXRobmFtZSkgfHwgbG9jYXRpb24uc2VhcmNoKSkgfHxcbiAgICAgICAgKGh5ZHJhdGVQcm9wcyAmJiBoeWRyYXRlUHJvcHMuX19OX1NTRyAmJiBsb2NhdGlvbi5zZWFyY2gpKVxuICAgICkge1xuICAgICAgLy8gdXBkYXRlIHF1ZXJ5IG9uIG1vdW50IGZvciBleHBvcnRlZCBwYWdlc1xuICAgICAgcm91dGVyLnJlcGxhY2UoXG4gICAgICAgIHJvdXRlci5wYXRobmFtZSArXG4gICAgICAgICAgJz8nICtcbiAgICAgICAgICBTdHJpbmcoXG4gICAgICAgICAgICBxdWVyeXN0cmluZy5hc3NpZ24oXG4gICAgICAgICAgICAgIHF1ZXJ5c3RyaW5nLnVybFF1ZXJ5VG9TZWFyY2hQYXJhbXMocm91dGVyLnF1ZXJ5KSxcbiAgICAgICAgICAgICAgbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgYXNQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIC8vIFdBUk5JTkc6IGBfaGAgaXMgYW4gaW50ZXJuYWwgb3B0aW9uIGZvciBoYW5kaW5nIE5leHQuanNcbiAgICAgICAgICAvLyBjbGllbnQtc2lkZSBoeWRyYXRpb24uIFlvdXIgYXBwIHNob3VsZCBfbmV2ZXJfIHVzZSB0aGlzIHByb3BlcnR5LlxuICAgICAgICAgIC8vIEl0IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgd2l0aG91dCBub3RpY2UuXG4gICAgICAgICAgX2g6IDEsXG4gICAgICAgICAgLy8gRmFsbGJhY2sgcGFnZXMgbXVzdCB0cmlnZ2VyIHRoZSBkYXRhIGZldGNoLCBzbyB0aGUgdHJhbnNpdGlvbiBpc1xuICAgICAgICAgIC8vIG5vdCBzaGFsbG93LlxuICAgICAgICAgIC8vIE90aGVyIHBhZ2VzIChzdHJpY3RseSB1cGRhdGluZyBxdWVyeSkgaGFwcGVucyBzaGFsbG93bHksIGFzIGRhdGFcbiAgICAgICAgICAvLyByZXF1aXJlbWVudHMgd291bGQgYWxyZWFkeSBiZSBwcmVzZW50LlxuICAgICAgICAgIHNoYWxsb3c6ICFpc0ZhbGxiYWNrLFxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHRoaXMuc2Nyb2xsVG9IYXNoKClcbiAgfVxuXG4gIHNjcm9sbFRvSGFzaCgpIHtcbiAgICBsZXQgeyBoYXNoIH0gPSBsb2NhdGlvblxuICAgIGhhc2ggPSBoYXNoICYmIGhhc2guc3Vic3RyaW5nKDEpXG4gICAgaWYgKCFoYXNoKSByZXR1cm5cblxuICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKVxuICAgIGlmICghZWwpIHJldHVyblxuXG4gICAgLy8gSWYgd2UgY2FsbCBzY3JvbGxJbnRvVmlldygpIGluIGhlcmUgd2l0aG91dCBhIHNldFRpbWVvdXRcbiAgICAvLyBpdCB3b24ndCBzY3JvbGwgcHJvcGVybHkuXG4gICAgc2V0VGltZW91dCgoKSA9PiBlbC5zY3JvbGxJbnRvVmlldygpLCAwKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IFJlYWN0RGV2T3ZlcmxheSB9ID0gcmVxdWlyZSgnQG5leHQvcmVhY3QtZGV2LW92ZXJsYXkvbGliL2NsaWVudCcpXG4gICAgICByZXR1cm4gPFJlYWN0RGV2T3ZlcmxheT57dGhpcy5wcm9wcy5jaGlsZHJlbn08L1JlYWN0RGV2T3ZlcmxheT5cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGVtaXR0ZXI6IE1pdHRFbWl0dGVyID0gbWl0dCgpXG5sZXQgQ2FjaGVkQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlXG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIChvcHRzOiB7IHdlYnBhY2tITVI/OiBhbnkgfSA9IHt9KSA9PiB7XG4gIC8vIFRoaXMgbWFrZXMgc3VyZSB0aGlzIHNwZWNpZmljIGxpbmVzIGFyZSByZW1vdmVkIGluIHByb2R1Y3Rpb25cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgd2VicGFja0hNUiA9IG9wdHMud2VicGFja0hNUlxuICB9XG5cbiAgY29uc3QgYXBwRW50cnlwb2ludCA9IGF3YWl0IHBhZ2VMb2FkZXIucm91dGVMb2FkZXIud2hlbkVudHJ5cG9pbnQoJy9fYXBwJylcbiAgaWYgKCdlcnJvcicgaW4gYXBwRW50cnlwb2ludCkge1xuICAgIHRocm93IGFwcEVudHJ5cG9pbnQuZXJyb3JcbiAgfVxuXG4gIGNvbnN0IHsgY29tcG9uZW50OiBhcHAsIGV4cG9ydHM6IG1vZCB9ID0gYXBwRW50cnlwb2ludFxuICBDYWNoZWRBcHAgPSBhcHAgYXMgQXBwQ29tcG9uZW50XG5cbiAgaWYgKG1vZCAmJiBtb2QucmVwb3J0V2ViVml0YWxzKSB7XG4gICAgb25QZXJmRW50cnkgPSAoe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIGVudHJ5VHlwZSxcbiAgICAgIGVudHJpZXMsXG4gICAgfSk6IHZvaWQgPT4ge1xuICAgICAgLy8gQ29tYmluZXMgdGltZXN0YW1wIHdpdGggcmFuZG9tIG51bWJlciBmb3IgdW5pcXVlIElEXG4gICAgICBjb25zdCB1bmlxdWVJRDogc3RyaW5nID0gYCR7RGF0ZS5ub3coKX0tJHtcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDllMTIgLSAxKSkgKyAxZTEyXG4gICAgICB9YFxuICAgICAgbGV0IHBlcmZTdGFydEVudHJ5OiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAgICAgaWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgcGVyZlN0YXJ0RW50cnkgPSBlbnRyaWVzWzBdLnN0YXJ0VGltZVxuICAgICAgfVxuXG4gICAgICBtb2QucmVwb3J0V2ViVml0YWxzKHtcbiAgICAgICAgaWQ6IGlkIHx8IHVuaXF1ZUlELFxuICAgICAgICBuYW1lLFxuICAgICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSB8fCBwZXJmU3RhcnRFbnRyeSxcbiAgICAgICAgdmFsdWU6IHZhbHVlID09IG51bGwgPyBkdXJhdGlvbiA6IHZhbHVlLFxuICAgICAgICBsYWJlbDpcbiAgICAgICAgICBlbnRyeVR5cGUgPT09ICdtYXJrJyB8fCBlbnRyeVR5cGUgPT09ICdtZWFzdXJlJ1xuICAgICAgICAgICAgPyAnY3VzdG9tJ1xuICAgICAgICAgICAgOiAnd2ViLXZpdGFsJyxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgbGV0IGluaXRpYWxFcnIgPSBoeWRyYXRlRXJyXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWdlRW50cnlwb2ludCA9XG4gICAgICAvLyBUaGUgZGV2IHNlcnZlciBmYWlscyB0byBzZXJ2ZSBzY3JpcHQgYXNzZXRzIHdoZW4gdGhlcmUncyBhIGh5ZHJhdGlvblxuICAgICAgLy8gZXJyb3IsIHNvIHdlIG5lZWQgdG8gc2tpcCB3YWl0aW5nIGZvciB0aGUgZW50cnlwb2ludC5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnICYmIGh5ZHJhdGVFcnJcbiAgICAgICAgPyB7IGVycm9yOiBoeWRyYXRlRXJyIH1cbiAgICAgICAgOiBhd2FpdCBwYWdlTG9hZGVyLnJvdXRlTG9hZGVyLndoZW5FbnRyeXBvaW50KHBhZ2UpXG4gICAgaWYgKCdlcnJvcicgaW4gcGFnZUVudHJ5cG9pbnQpIHtcbiAgICAgIHRocm93IHBhZ2VFbnRyeXBvaW50LmVycm9yXG4gICAgfVxuICAgIENhY2hlZENvbXBvbmVudCA9IHBhZ2VFbnRyeXBvaW50LmNvbXBvbmVudFxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgaXNWYWxpZEVsZW1lbnRUeXBlIH0gPSByZXF1aXJlKCdyZWFjdC1pcycpXG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZShDYWNoZWRDb21wb25lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGRlZmF1bHQgZXhwb3J0IGlzIG5vdCBhIFJlYWN0IENvbXBvbmVudCBpbiBwYWdlOiBcIiR7cGFnZX1cImBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGlzIGNhdGNoZXMgZXJyb3JzIGxpa2UgdGhyb3dpbmcgaW4gdGhlIHRvcCBsZXZlbCBvZiBhIG1vZHVsZVxuICAgIGluaXRpYWxFcnIgPSBlcnJvclxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgY29uc3QgeyBnZXROb2RlRXJyb3IgfSA9IHJlcXVpcmUoJ0BuZXh0L3JlYWN0LWRldi1vdmVybGF5L2xpYi9jbGllbnQnKVxuICAgIC8vIFNlcnZlci1zaWRlIHJ1bnRpbWUgZXJyb3JzIG5lZWQgdG8gYmUgcmUtdGhyb3duIG9uIHRoZSBjbGllbnQtc2lkZSBzb1xuICAgIC8vIHRoYXQgdGhlIG92ZXJsYXkgaXMgcmVuZGVyZWQuXG4gICAgaWYgKGluaXRpYWxFcnIpIHtcbiAgICAgIGlmIChpbml0aWFsRXJyID09PSBoeWRyYXRlRXJyKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGxldCBlcnJvclxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIG5ldyBlcnJvciBvYmplY3QuIFdlIGB0aHJvd2AgaXQgYmVjYXVzZSBzb21lIGJyb3dzZXJzXG4gICAgICAgICAgICAvLyB3aWxsIHNldCB0aGUgYHN0YWNrYCB3aGVuIHRocm93biwgYW5kIHdlIHdhbnQgdG8gZW5zdXJlIG91cnMgaXNcbiAgICAgICAgICAgIC8vIG5vdCBvdmVycmlkZGVuIHdoZW4gd2UgcmUtdGhyb3cgaXQgYmVsb3cuXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoaW5pdGlhbEVyciEubWVzc2FnZSlcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvci5uYW1lID0gaW5pdGlhbEVyciEubmFtZVxuICAgICAgICAgIGVycm9yLnN0YWNrID0gaW5pdGlhbEVyciEuc3RhY2tcblxuICAgICAgICAgIGNvbnN0IG5vZGUgPSBnZXROb2RlRXJyb3IoZXJyb3IpXG4gICAgICAgICAgdGhyb3cgbm9kZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgLy8gV2UgcmVwbGFjZWQgdGhlIHNlcnZlci1zaWRlIGVycm9yIHdpdGggYSBjbGllbnQtc2lkZSBlcnJvciwgYW5kIHNob3VsZFxuICAgICAgLy8gbm8gbG9uZ2VyIHJld3JpdGUgdGhlIHN0YWNrIHRyYWNlIHRvIGEgTm9kZSBlcnJvci5cbiAgICAgIGVsc2Uge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBpbml0aWFsRXJyXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHdpbmRvdy5fX05FWFRfUFJFTE9BRFJFQURZKSB7XG4gICAgYXdhaXQgd2luZG93Ll9fTkVYVF9QUkVMT0FEUkVBRFkoZHluYW1pY0lkcylcbiAgfVxuXG4gIHJvdXRlciA9IGNyZWF0ZVJvdXRlcihwYWdlLCBxdWVyeSwgYXNQYXRoLCB7XG4gICAgaW5pdGlhbFByb3BzOiBoeWRyYXRlUHJvcHMsXG4gICAgcGFnZUxvYWRlcixcbiAgICBBcHA6IENhY2hlZEFwcCxcbiAgICBDb21wb25lbnQ6IENhY2hlZENvbXBvbmVudCxcbiAgICB3cmFwQXBwLFxuICAgIGVycjogaW5pdGlhbEVycixcbiAgICBpc0ZhbGxiYWNrOiBCb29sZWFuKGlzRmFsbGJhY2spLFxuICAgIHN1YnNjcmlwdGlvbjogKGluZm8sIEFwcCwgc2Nyb2xsKSA9PlxuICAgICAgcmVuZGVyKFxuICAgICAgICBPYmplY3QuYXNzaWduPFxuICAgICAgICAgIHt9LFxuICAgICAgICAgIE9taXQ8UmVuZGVyUm91dGVJbmZvLCAnQXBwJyB8ICdzY3JvbGwnPixcbiAgICAgICAgICBQaWNrPFJlbmRlclJvdXRlSW5mbywgJ0FwcCcgfCAnc2Nyb2xsJz5cbiAgICAgICAgPih7fSwgaW5mbywge1xuICAgICAgICAgIEFwcCxcbiAgICAgICAgICBzY3JvbGwsXG4gICAgICAgIH0pIGFzIFJlbmRlclJvdXRlSW5mb1xuICAgICAgKSxcbiAgICBsb2NhbGUsXG4gICAgbG9jYWxlcyxcbiAgICBkZWZhdWx0TG9jYWxlLFxuICAgIGRvbWFpbkxvY2FsZXMsXG4gICAgaXNQcmV2aWV3LFxuICB9KVxuXG4gIC8vIGNhbGwgaW5pdC1jbGllbnQgbWlkZGxld2FyZVxuICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX1BMVUdJTlMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgaW1wb3J0KCduZXh0LXBsdWdpbi1sb2FkZXI/bWlkZGxld2FyZT1vbi1pbml0LWNsaWVudCEnKVxuICAgICAgLnRoZW4oKGluaXRDbGllbnRNb2R1bGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGluaXRDbGllbnRNb2R1bGUuZGVmYXVsdCh7IHJvdXRlciB9KVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoaW5pdENsaWVudEVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjYWxsaW5nIGNsaWVudC1pbml0IGZvciBwbHVnaW5zJywgaW5pdENsaWVudEVycilcbiAgICAgIH0pXG4gIH1cblxuICBjb25zdCByZW5kZXJDdHg6IFJlbmRlclJvdXRlSW5mbyA9IHtcbiAgICBBcHA6IENhY2hlZEFwcCxcbiAgICBpbml0aWFsOiB0cnVlLFxuICAgIENvbXBvbmVudDogQ2FjaGVkQ29tcG9uZW50LFxuICAgIHByb3BzOiBoeWRyYXRlUHJvcHMsXG4gICAgZXJyOiBpbml0aWFsRXJyLFxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgICByZW5kZXIocmVuZGVyQ3R4KVxuICAgIHJldHVybiBlbWl0dGVyXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgZW1pdHRlciwgcmVuZGVyLCByZW5kZXJDdHggfVxuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXIocmVuZGVyaW5nUHJvcHM6IFJlbmRlclJvdXRlSW5mbyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAocmVuZGVyaW5nUHJvcHMuZXJyKSB7XG4gICAgYXdhaXQgcmVuZGVyRXJyb3IocmVuZGVyaW5nUHJvcHMpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGRvUmVuZGVyKHJlbmRlcmluZ1Byb3BzKVxuICB9IGNhdGNoIChyZW5kZXJFcnIpIHtcbiAgICAvLyBidWJibGUgdXAgY2FuY2VsYXRpb24gZXJyb3JzXG4gICAgaWYgKHJlbmRlckVyci5jYW5jZWxsZWQpIHtcbiAgICAgIHRocm93IHJlbmRlckVyclxuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgLy8gRW5zdXJlIHRoaXMgZXJyb3IgaXMgZGlzcGxheWVkIGluIHRoZSBvdmVybGF5IGluIGRldmVsb3BtZW50XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhyb3cgcmVuZGVyRXJyXG4gICAgICB9KVxuICAgIH1cbiAgICBhd2FpdCByZW5kZXJFcnJvcih7IC4uLnJlbmRlcmluZ1Byb3BzLCBlcnI6IHJlbmRlckVyciB9KVxuICB9XG59XG5cbi8vIFRoaXMgbWV0aG9kIGhhbmRsZXMgYWxsIHJ1bnRpbWUgYW5kIGRlYnVnIGVycm9ycy5cbi8vIDQwNCBhbmQgNTAwIGVycm9ycyBhcmUgc3BlY2lhbCBraW5kIG9mIGVycm9yc1xuLy8gYW5kIHRoZXkgYXJlIHN0aWxsIGhhbmRsZSB2aWEgdGhlIG1haW4gcmVuZGVyIG1ldGhvZC5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFcnJvcihyZW5kZXJFcnJvclByb3BzOiBSZW5kZXJFcnJvclByb3BzKTogUHJvbWlzZTxhbnk+IHtcbiAgY29uc3QgeyBBcHAsIGVyciB9ID0gcmVuZGVyRXJyb3JQcm9wc1xuXG4gIC8vIEluIGRldmVsb3BtZW50IHJ1bnRpbWUgZXJyb3JzIGFyZSBjYXVnaHQgYnkgb3VyIG92ZXJsYXlcbiAgLy8gSW4gcHJvZHVjdGlvbiB3ZSBjYXRjaCBydW50aW1lIGVycm9ycyB1c2luZyBjb21wb25lbnREaWRDYXRjaCB3aGljaCB3aWxsIHRyaWdnZXIgcmVuZGVyRXJyb3JcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBBIE5leHQuanMgcmVuZGVyaW5nIHJ1bnRpbWUgZXJyb3IgaXMgYWx3YXlzIHVucmVjb3ZlcmFibGVcbiAgICAvLyBGSVhNRTogbGV0J3MgbWFrZSB0aGlzIHJlY292ZXJhYmxlIChlcnJvciBpbiBHSVAgY2xpZW50LXRyYW5zaXRpb24pXG4gICAgd2VicGFja0hNUi5vblVucmVjb3ZlcmFibGVFcnJvcigpXG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbmRlciBhbiBlbXB0eSA8QXBwPiBzbyB0aGF0IHRoZSBgPFJlYWN0RGV2T3ZlcmxheT5gIGNhblxuICAgIC8vIHJlbmRlciBpdHNlbGYuXG4gICAgcmV0dXJuIGRvUmVuZGVyKHtcbiAgICAgIEFwcDogKCkgPT4gbnVsbCxcbiAgICAgIHByb3BzOiB7fSxcbiAgICAgIENvbXBvbmVudDogKCkgPT4gbnVsbCxcbiAgICAgIHN0eWxlU2hlZXRzOiBbXSxcbiAgICB9KVxuICB9XG4gIGlmIChwcm9jZXNzLmVudi5fX05FWFRfUExVR0lOUykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBpbXBvcnQoJ25leHQtcGx1Z2luLWxvYWRlcj9taWRkbGV3YXJlPW9uLWVycm9yLWNsaWVudCEnKVxuICAgICAgLnRoZW4oKG9uQ2xpZW50RXJyb3JNb2R1bGUpID0+IHtcbiAgICAgICAgcmV0dXJuIG9uQ2xpZW50RXJyb3JNb2R1bGUuZGVmYXVsdCh7IGVyciB9KVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgob25DbGllbnRFcnJvckVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdlcnJvciBjYWxsaW5nIG9uLWVycm9yLWNsaWVudCBmb3IgcGx1Z2lucycsXG4gICAgICAgICAgb25DbGllbnRFcnJvckVyclxuICAgICAgICApXG4gICAgICB9KVxuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGxvZyB0aGUgZXJyb3IgdG8gdGhlIGNvbnNvbGUsIG90aGVyd2lzZSB1c2VycyBjYW4ndCB0cmFjayBkb3duIGlzc3Vlcy5cbiAgY29uc29sZS5lcnJvcihlcnIpXG4gIHJldHVybiBwYWdlTG9hZGVyXG4gICAgLmxvYWRQYWdlKCcvX2Vycm9yJylcbiAgICAudGhlbigoeyBwYWdlOiBFcnJvckNvbXBvbmVudCwgc3R5bGVTaGVldHMgfSkgPT4ge1xuICAgICAgLy8gSW4gcHJvZHVjdGlvbiB3ZSBkbyBhIG5vcm1hbCByZW5kZXIgd2l0aCB0aGUgYEVycm9yQ29tcG9uZW50YCBhcyBjb21wb25lbnQuXG4gICAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gaGVyZSB1cG9uIGluaXRpYWwgcmVuZGVyLCB3ZSBjYW4gdXNlIHRoZSBwcm9wcyBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gY2FsbCBgZ2V0SW5pdGlhbFByb3BzYCBvbiBgQXBwYCBiZWZvcmUgbW91bnRpbmcuXG4gICAgICBjb25zdCBBcHBUcmVlID0gd3JhcEFwcChBcHApXG4gICAgICBjb25zdCBhcHBDdHggPSB7XG4gICAgICAgIENvbXBvbmVudDogRXJyb3JDb21wb25lbnQsXG4gICAgICAgIEFwcFRyZWUsXG4gICAgICAgIHJvdXRlcixcbiAgICAgICAgY3R4OiB7IGVyciwgcGF0aG5hbWU6IHBhZ2UsIHF1ZXJ5LCBhc1BhdGgsIEFwcFRyZWUgfSxcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgIHJlbmRlckVycm9yUHJvcHMucHJvcHNcbiAgICAgICAgICA/IHJlbmRlckVycm9yUHJvcHMucHJvcHNcbiAgICAgICAgICA6IGxvYWRHZXRJbml0aWFsUHJvcHMoQXBwLCBhcHBDdHgpXG4gICAgICApLnRoZW4oKGluaXRQcm9wcykgPT5cbiAgICAgICAgZG9SZW5kZXIoe1xuICAgICAgICAgIC4uLnJlbmRlckVycm9yUHJvcHMsXG4gICAgICAgICAgZXJyLFxuICAgICAgICAgIENvbXBvbmVudDogRXJyb3JDb21wb25lbnQsXG4gICAgICAgICAgc3R5bGVTaGVldHMsXG4gICAgICAgICAgcHJvcHM6IGluaXRQcm9wcyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxufVxuXG5sZXQgcmVhY3RSb290OiBhbnkgPSBudWxsXG5sZXQgc2hvdWxkVXNlSHlkcmF0ZTogYm9vbGVhbiA9IHR5cGVvZiBSZWFjdERPTS5oeWRyYXRlID09PSAnZnVuY3Rpb24nXG5mdW5jdGlvbiByZW5kZXJSZWFjdEVsZW1lbnQocmVhY3RFbDogSlNYLkVsZW1lbnQsIGRvbUVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX1JFQUNUX01PREUgIT09ICdsZWdhY3knKSB7XG4gICAgaWYgKCFyZWFjdFJvb3QpIHtcbiAgICAgIGNvbnN0IG9wdHMgPSB7IGh5ZHJhdGU6IHRydWUgfVxuICAgICAgcmVhY3RSb290ID1cbiAgICAgICAgcHJvY2Vzcy5lbnYuX19ORVhUX1JFQUNUX01PREUgPT09ICdjb25jdXJyZW50J1xuICAgICAgICAgID8gKFJlYWN0RE9NIGFzIGFueSkudW5zdGFibGVfY3JlYXRlUm9vdChkb21FbCwgb3B0cylcbiAgICAgICAgICA6IChSZWFjdERPTSBhcyBhbnkpLnVuc3RhYmxlX2NyZWF0ZUJsb2NraW5nUm9vdChkb21FbCwgb3B0cylcbiAgICB9XG4gICAgcmVhY3RSb290LnJlbmRlcihyZWFjdEVsKVxuICB9IGVsc2Uge1xuICAgIC8vIG1hcmsgc3RhcnQgb2YgaHlkcmF0ZS9yZW5kZXJcbiAgICBpZiAoU1QpIHtcbiAgICAgIHBlcmZvcm1hbmNlLm1hcmsoJ2JlZm9yZVJlbmRlcicpXG4gICAgfVxuXG4gICAgLy8gVGhlIGNoZWNrIGZvciBgLmh5ZHJhdGVgIGlzIHRoZXJlIHRvIHN1cHBvcnQgUmVhY3QgYWx0ZXJuYXRpdmVzIGxpa2UgcHJlYWN0XG4gICAgaWYgKHNob3VsZFVzZUh5ZHJhdGUpIHtcbiAgICAgIFJlYWN0RE9NLmh5ZHJhdGUocmVhY3RFbCwgZG9tRWwsIG1hcmtIeWRyYXRlQ29tcGxldGUpXG4gICAgICBzaG91bGRVc2VIeWRyYXRlID0gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RET00ucmVuZGVyKHJlYWN0RWwsIGRvbUVsLCBtYXJrUmVuZGVyQ29tcGxldGUpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtIeWRyYXRlQ29tcGxldGUoKTogdm9pZCB7XG4gIGlmICghU1QpIHJldHVyblxuXG4gIHBlcmZvcm1hbmNlLm1hcmsoJ2FmdGVySHlkcmF0ZScpIC8vIG1hcmsgZW5kIG9mIGh5ZHJhdGlvblxuXG4gIHBlcmZvcm1hbmNlLm1lYXN1cmUoXG4gICAgJ05leHQuanMtYmVmb3JlLWh5ZHJhdGlvbicsXG4gICAgJ25hdmlnYXRpb25TdGFydCcsXG4gICAgJ2JlZm9yZVJlbmRlcidcbiAgKVxuICBwZXJmb3JtYW5jZS5tZWFzdXJlKCdOZXh0LmpzLWh5ZHJhdGlvbicsICdiZWZvcmVSZW5kZXInLCAnYWZ0ZXJIeWRyYXRlJylcblxuICBpZiAob25QZXJmRW50cnkpIHtcbiAgICBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKCdOZXh0LmpzLWh5ZHJhdGlvbicpLmZvckVhY2gob25QZXJmRW50cnkpXG4gIH1cbiAgY2xlYXJNYXJrcygpXG59XG5cbmZ1bmN0aW9uIG1hcmtSZW5kZXJDb21wbGV0ZSgpOiB2b2lkIHtcbiAgaWYgKCFTVCkgcmV0dXJuXG5cbiAgcGVyZm9ybWFuY2UubWFyaygnYWZ0ZXJSZW5kZXInKSAvLyBtYXJrIGVuZCBvZiByZW5kZXJcbiAgY29uc3QgbmF2U3RhcnRFbnRyaWVzOiBQZXJmb3JtYW5jZUVudHJ5TGlzdCA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUoXG4gICAgJ3JvdXRlQ2hhbmdlJyxcbiAgICAnbWFyaydcbiAgKVxuXG4gIGlmICghbmF2U3RhcnRFbnRyaWVzLmxlbmd0aCkgcmV0dXJuXG5cbiAgcGVyZm9ybWFuY2UubWVhc3VyZShcbiAgICAnTmV4dC5qcy1yb3V0ZS1jaGFuZ2UtdG8tcmVuZGVyJyxcbiAgICBuYXZTdGFydEVudHJpZXNbMF0ubmFtZSxcbiAgICAnYmVmb3JlUmVuZGVyJ1xuICApXG4gIHBlcmZvcm1hbmNlLm1lYXN1cmUoJ05leHQuanMtcmVuZGVyJywgJ2JlZm9yZVJlbmRlcicsICdhZnRlclJlbmRlcicpXG4gIGlmIChvblBlcmZFbnRyeSkge1xuICAgIHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUoJ05leHQuanMtcmVuZGVyJykuZm9yRWFjaChvblBlcmZFbnRyeSlcbiAgICBwZXJmb3JtYW5jZVxuICAgICAgLmdldEVudHJpZXNCeU5hbWUoJ05leHQuanMtcm91dGUtY2hhbmdlLXRvLXJlbmRlcicpXG4gICAgICAuZm9yRWFjaChvblBlcmZFbnRyeSlcbiAgfVxuICBjbGVhck1hcmtzKClcbiAgO1snTmV4dC5qcy1yb3V0ZS1jaGFuZ2UtdG8tcmVuZGVyJywgJ05leHQuanMtcmVuZGVyJ10uZm9yRWFjaCgobWVhc3VyZSkgPT5cbiAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKG1lYXN1cmUpXG4gIClcbn1cblxuZnVuY3Rpb24gY2xlYXJNYXJrcygpOiB2b2lkIHtcbiAgO1tcbiAgICAnYmVmb3JlUmVuZGVyJyxcbiAgICAnYWZ0ZXJIeWRyYXRlJyxcbiAgICAnYWZ0ZXJSZW5kZXInLFxuICAgICdyb3V0ZUNoYW5nZScsXG4gIF0uZm9yRWFjaCgobWFyaykgPT4gcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhtYXJrKSlcbn1cblxuZnVuY3Rpb24gQXBwQ29udGFpbmVyKHtcbiAgY2hpbGRyZW4sXG59OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx7fT4pOiBSZWFjdC5SZWFjdEVsZW1lbnQge1xuICByZXR1cm4gKFxuICAgIDxDb250YWluZXJcbiAgICAgIGZuPXsoZXJyb3IpID0+XG4gICAgICAgIHJlbmRlckVycm9yKHsgQXBwOiBDYWNoZWRBcHAsIGVycjogZXJyb3IgfSkuY2F0Y2goKGVycikgPT5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZW5kZXJpbmcgcGFnZTogJywgZXJyKVxuICAgICAgICApXG4gICAgICB9XG4gICAgPlxuICAgICAgPFJvdXRlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e21ha2VQdWJsaWNSb3V0ZXJJbnN0YW5jZShyb3V0ZXIpfT5cbiAgICAgICAgPEhlYWRNYW5hZ2VyQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17aGVhZE1hbmFnZXJ9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9IZWFkTWFuYWdlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgICA8L1JvdXRlckNvbnRleHQuUHJvdmlkZXI+XG4gICAgPC9Db250YWluZXI+XG4gIClcbn1cblxuY29uc3Qgd3JhcEFwcCA9IChBcHA6IEFwcENvbXBvbmVudCkgPT4gKFxuICB3cmFwcGVkQXBwUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEpTWC5FbGVtZW50ID0+IHtcbiAgY29uc3QgYXBwUHJvcHM6IEFwcFByb3BzID0ge1xuICAgIC4uLndyYXBwZWRBcHBQcm9wcyxcbiAgICBDb21wb25lbnQ6IENhY2hlZENvbXBvbmVudCxcbiAgICBlcnI6IGh5ZHJhdGVFcnIsXG4gICAgcm91dGVyLFxuICB9XG4gIHJldHVybiAoXG4gICAgPEFwcENvbnRhaW5lcj5cbiAgICAgIDxBcHAgey4uLmFwcFByb3BzfSAvPlxuICAgIDwvQXBwQ29udGFpbmVyPlxuICApXG59XG5cbmxldCBsYXN0QXBwUHJvcHM6IEFwcFByb3BzXG5mdW5jdGlvbiBkb1JlbmRlcihpbnB1dDogUmVuZGVyUm91dGVJbmZvKTogUHJvbWlzZTxhbnk+IHtcbiAgbGV0IHsgQXBwLCBDb21wb25lbnQsIHByb3BzLCBlcnIgfTogUmVuZGVyUm91dGVJbmZvID0gaW5wdXRcbiAgbGV0IHN0eWxlU2hlZXRzOiBTdHlsZVNoZWV0VHVwbGVbXSB8IHVuZGVmaW5lZCA9XG4gICAgJ2luaXRpYWwnIGluIGlucHV0ID8gdW5kZWZpbmVkIDogaW5wdXQuc3R5bGVTaGVldHNcbiAgQ29tcG9uZW50ID0gQ29tcG9uZW50IHx8IGxhc3RBcHBQcm9wcy5Db21wb25lbnRcbiAgcHJvcHMgPSBwcm9wcyB8fCBsYXN0QXBwUHJvcHMucHJvcHNcblxuICBjb25zdCBhcHBQcm9wczogQXBwUHJvcHMgPSB7XG4gICAgLi4ucHJvcHMsXG4gICAgQ29tcG9uZW50LFxuICAgIGVycixcbiAgICByb3V0ZXIsXG4gIH1cbiAgLy8gbGFzdEFwcFByb3BzIGhhcyB0byBiZSBzZXQgYmVmb3JlIFJlYWN0RG9tLnJlbmRlciB0byBhY2NvdW50IGZvciBSZWFjdERvbSB0aHJvd2luZyBhbiBlcnJvci5cbiAgbGFzdEFwcFByb3BzID0gYXBwUHJvcHNcblxuICBsZXQgY2FuY2VsZWQ6IGJvb2xlYW4gPSBmYWxzZVxuICBsZXQgcmVzb2x2ZVByb21pc2U6ICgpID0+IHZvaWRcbiAgY29uc3QgcmVuZGVyUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAobGFzdFJlbmRlclJlamVjdCkge1xuICAgICAgbGFzdFJlbmRlclJlamVjdCgpXG4gICAgfVxuICAgIHJlc29sdmVQcm9taXNlID0gKCkgPT4ge1xuICAgICAgbGFzdFJlbmRlclJlamVjdCA9IG51bGxcbiAgICAgIHJlc29sdmUoKVxuICAgIH1cbiAgICBsYXN0UmVuZGVyUmVqZWN0ID0gKCkgPT4ge1xuICAgICAgY2FuY2VsZWQgPSB0cnVlXG4gICAgICBsYXN0UmVuZGVyUmVqZWN0ID0gbnVsbFxuXG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKCdDYW5jZWwgcmVuZGVyaW5nIHJvdXRlJylcbiAgICAgIGVycm9yLmNhbmNlbGxlZCA9IHRydWVcbiAgICAgIHJlamVjdChlcnJvcilcbiAgICB9XG4gIH0pXG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgYSByZXR1cm4gdHlwZSB0byBlbnN1cmUgaXQgZG9lc24ndCBzdGFydCByZXR1cm5pbmcgYVxuICAvLyBQcm9taXNlLiBJdCBzaG91bGQgcmVtYWluIHN5bmNocm9ub3VzLlxuICBmdW5jdGlvbiBvblN0YXJ0KCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICFzdHlsZVNoZWV0cyB8fFxuICAgICAgLy8gV2UgdXNlIGBzdHlsZS1sb2FkZXJgIGluIGRldmVsb3BtZW50LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICAvLyB1bmxlc3Mgd2UncmUgaW4gcHJvZHVjdGlvbjpcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbidcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRTdHlsZVRhZ3M6IEhUTUxTdHlsZUVsZW1lbnRbXSA9IGxvb3NlVG9BcnJheTxIVE1MU3R5bGVFbGVtZW50PihcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlW2RhdGEtbi1ocmVmXScpXG4gICAgKVxuICAgIGNvbnN0IGN1cnJlbnRIcmVmczogU2V0PHN0cmluZyB8IG51bGw+ID0gbmV3IFNldChcbiAgICAgIGN1cnJlbnRTdHlsZVRhZ3MubWFwKCh0YWcpID0+IHRhZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtbi1ocmVmJykpXG4gICAgKVxuXG4gICAgY29uc3Qgbm9zY3JpcHQ6IEVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICdub3NjcmlwdFtkYXRhLW4tY3NzXSdcbiAgICApXG4gICAgY29uc3Qgbm9uY2U6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSBub3NjcmlwdD8uZ2V0QXR0cmlidXRlKFxuICAgICAgJ2RhdGEtbi1jc3MnXG4gICAgKVxuXG4gICAgc3R5bGVTaGVldHMuZm9yRWFjaCgoeyBocmVmLCB0ZXh0IH06IHsgaHJlZjogc3RyaW5nOyB0ZXh0OiBhbnkgfSkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50SHJlZnMuaGFzKGhyZWYpKSB7XG4gICAgICAgIGNvbnN0IHN0eWxlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKVxuICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbi1ocmVmJywgaHJlZilcbiAgICAgICAgc3R5bGVUYWcuc2V0QXR0cmlidXRlKCdtZWRpYScsICd4JylcblxuICAgICAgICBpZiAobm9uY2UpIHtcbiAgICAgICAgICBzdHlsZVRhZy5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpXG4gICAgICAgIH1cblxuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlVGFnKVxuICAgICAgICBzdHlsZVRhZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBvbkhlYWRDb21taXQoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgLy8gV2UgdXNlIGBzdHlsZS1sb2FkZXJgIGluIGRldmVsb3BtZW50LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICAvLyB1bmxlc3Mgd2UncmUgaW4gcHJvZHVjdGlvbjpcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiZcbiAgICAgIC8vIFdlIGNhbiBza2lwIHRoaXMgZHVyaW5nIGh5ZHJhdGlvbi4gUnVubmluZyBpdCB3b250IGNhdXNlIGFueSBoYXJtLCBidXRcbiAgICAgIC8vIHdlIG1heSBhcyB3ZWxsIHNhdmUgdGhlIENQVSBjeWNsZXM6XG4gICAgICBzdHlsZVNoZWV0cyAmJlxuICAgICAgLy8gRW5zdXJlIHRoaXMgcmVuZGVyIHdhcyBub3QgY2FuY2VsZWRcbiAgICAgICFjYW5jZWxlZFxuICAgICkge1xuICAgICAgY29uc3QgZGVzaXJlZEhyZWZzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoc3R5bGVTaGVldHMubWFwKChzKSA9PiBzLmhyZWYpKVxuICAgICAgY29uc3QgY3VycmVudFN0eWxlVGFnczogSFRNTFN0eWxlRWxlbWVudFtdID0gbG9vc2VUb0FycmF5PFxuICAgICAgICBIVE1MU3R5bGVFbGVtZW50XG4gICAgICA+KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlW2RhdGEtbi1ocmVmXScpKVxuICAgICAgY29uc3QgY3VycmVudEhyZWZzOiBzdHJpbmdbXSA9IGN1cnJlbnRTdHlsZVRhZ3MubWFwKFxuICAgICAgICAodGFnKSA9PiB0YWcuZ2V0QXR0cmlidXRlKCdkYXRhLW4taHJlZicpIVxuICAgICAgKVxuXG4gICAgICAvLyBUb2dnbGUgYDxzdHlsZT5gIHRhZ3Mgb24gb3Igb2ZmIGRlcGVuZGluZyBvbiBpZiB0aGV5J3JlIG5lZWRlZDpcbiAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGN1cnJlbnRIcmVmcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgIGlmIChkZXNpcmVkSHJlZnMuaGFzKGN1cnJlbnRIcmVmc1tpZHhdKSkge1xuICAgICAgICAgIGN1cnJlbnRTdHlsZVRhZ3NbaWR4XS5yZW1vdmVBdHRyaWJ1dGUoJ21lZGlhJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdXJyZW50U3R5bGVUYWdzW2lkeF0uc2V0QXR0cmlidXRlKCdtZWRpYScsICd4JylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZW9yZGVyIHN0eWxlcyBpbnRvIGludGVuZGVkIG9yZGVyOlxuICAgICAgbGV0IHJlZmVyZW5jZU5vZGU6IEVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgJ25vc2NyaXB0W2RhdGEtbi1jc3NdJ1xuICAgICAgKVxuICAgICAgaWYgKFxuICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBhbiBpbnZhcmlhbnQ6XG4gICAgICAgIHJlZmVyZW5jZU5vZGVcbiAgICAgICkge1xuICAgICAgICBzdHlsZVNoZWV0cy5mb3JFYWNoKCh7IGhyZWYgfTogeyBocmVmOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFRhZzogRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgYHN0eWxlW2RhdGEtbi1ocmVmPVwiJHtocmVmfVwiXWBcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgYW4gaW52YXJpYW50OlxuICAgICAgICAgICAgdGFyZ2V0VGFnXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZWZlcmVuY2VOb2RlIS5wYXJlbnROb2RlIS5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgIHRhcmdldFRhZyxcbiAgICAgICAgICAgICAgcmVmZXJlbmNlTm9kZSEubmV4dFNpYmxpbmdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUgPSB0YXJnZXRUYWdcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIEZpbmFsbHksIGNsZWFuIHVwIHNlcnZlciByZW5kZXJlZCBzdHlsZXNoZWV0czpcbiAgICAgIGxvb3NlVG9BcnJheTxIVE1MTGlua0VsZW1lbnQ+KFxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW2RhdGEtbi1wXScpXG4gICAgICApLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgIGVsLnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKGVsKVxuICAgICAgfSlcblxuICAgICAgLy8gRm9yY2UgYnJvd3NlciB0byByZWNvbXB1dGUgbGF5b3V0LCB3aGljaCBzaG91bGQgcHJldmVudCBhIGZsYXNoIG9mXG4gICAgICAvLyB1bnN0eWxlZCBjb250ZW50OlxuICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5LCAnaGVpZ2h0JylcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQuc2Nyb2xsKSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oaW5wdXQuc2Nyb2xsLngsIGlucHV0LnNjcm9sbC55KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUm9vdENvbW1pdCgpOiB2b2lkIHtcbiAgICByZXNvbHZlUHJvbWlzZSgpXG4gIH1cblxuICBjb25zdCBlbGVtOiBKU1guRWxlbWVudCA9IChcbiAgICA8Um9vdCBjYWxsYmFjaz17b25Sb290Q29tbWl0fT5cbiAgICAgIDxIZWFkIGNhbGxiYWNrPXtvbkhlYWRDb21taXR9IC8+XG4gICAgICA8QXBwQ29udGFpbmVyPlxuICAgICAgICA8QXBwIHsuLi5hcHBQcm9wc30gLz5cbiAgICAgICAgPFBvcnRhbCB0eXBlPVwibmV4dC1yb3V0ZS1hbm5vdW5jZXJcIj5cbiAgICAgICAgICA8Um91dGVBbm5vdW5jZXIgLz5cbiAgICAgICAgPC9Qb3J0YWw+XG4gICAgICA8L0FwcENvbnRhaW5lcj5cbiAgICA8L1Jvb3Q+XG4gIClcblxuICBvblN0YXJ0KClcblxuICAvLyBXZSBjYXRjaCBydW50aW1lIGVycm9ycyB1c2luZyBjb21wb25lbnREaWRDYXRjaCB3aGljaCB3aWxsIHRyaWdnZXIgcmVuZGVyRXJyb3JcbiAgcmVuZGVyUmVhY3RFbGVtZW50KFxuICAgIHByb2Nlc3MuZW52Ll9fTkVYVF9TVFJJQ1RfTU9ERSA/IChcbiAgICAgIDxSZWFjdC5TdHJpY3RNb2RlPntlbGVtfTwvUmVhY3QuU3RyaWN0TW9kZT5cbiAgICApIDogKFxuICAgICAgZWxlbVxuICAgICksXG4gICAgYXBwRWxlbWVudCFcbiAgKVxuXG4gIHJldHVybiByZW5kZXJQcm9taXNlXG59XG5cbmZ1bmN0aW9uIFJvb3Qoe1xuICBjYWxsYmFjayxcbiAgY2hpbGRyZW4sXG59OiBSZWFjdC5Qcm9wc1dpdGhDaGlsZHJlbjx7XG4gIGNhbGxiYWNrOiAoKSA9PiB2b2lkXG59Pik6IFJlYWN0LlJlYWN0RWxlbWVudCB7XG4gIC8vIFdlIHVzZSBgdXNlTGF5b3V0RWZmZWN0YCB0byBndWFyYW50ZWUgdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkXG4gIC8vIGFzIHNvb24gYXMgUmVhY3QgZmx1c2hlcyB0aGUgdXBkYXRlLlxuICBSZWFjdC51c2VMYXlvdXRFZmZlY3QoKCkgPT4gY2FsbGJhY2soKSwgW2NhbGxiYWNrXSlcbiAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9URVNUX01PREUpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvcnVsZXMtb2YtaG9va3NcbiAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgd2luZG93Ll9fTkVYVF9IWURSQVRFRCA9IHRydWVcblxuICAgICAgaWYgKHdpbmRvdy5fX05FWFRfSFlEUkFURURfQ0IpIHtcbiAgICAgICAgd2luZG93Ll9fTkVYVF9IWURSQVRFRF9DQigpXG4gICAgICB9XG4gICAgfSwgW10pXG4gIH1cbiAgLy8gV2Ugc2hvdWxkIGFzayB0byBtZWFzdXJlIHRoZSBXZWIgVml0YWxzIGFmdGVyIHJlbmRlcmluZyBjb21wbGV0ZXMgc28gd2VcbiAgLy8gZG9uJ3QgY2F1c2UgYW55IGh5ZHJhdGlvbiBkZWxheTpcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBtZWFzdXJlV2ViVml0YWxzKG9uUGVyZkVudHJ5KVxuICB9LCBbXSlcbiAgcmV0dXJuIGNoaWxkcmVuIGFzIFJlYWN0LlJlYWN0RWxlbWVudFxufVxuXG4vLyBEdW1teSBjb21wb25lbnQgdGhhdCB3ZSByZW5kZXIgYXMgYSBjaGlsZCBvZiBSb290IHNvIHRoYXQgd2UgY2FuXG4vLyB0b2dnbGUgdGhlIGNvcnJlY3Qgc3R5bGVzIGJlZm9yZSB0aGUgcGFnZSBpcyByZW5kZXJlZC5cbmZ1bmN0aW9uIEhlYWQoeyBjYWxsYmFjayB9OiB7IGNhbGxiYWNrOiAoKSA9PiB2b2lkIH0pOiBudWxsIHtcbiAgLy8gV2UgdXNlIGB1c2VMYXlvdXRFZmZlY3RgIHRvIGd1YXJhbnRlZSB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWRcbiAgLy8gYXMgc29vbiBhcyBSZWFjdCBmbHVzaGVzIHRoZSB1cGRhdGUuXG4gIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKSA9PiBjYWxsYmFjaygpLCBbY2FsbGJhY2tdKVxuICByZXR1cm4gbnVsbFxufVxuIiwiLyogZ2xvYmFscyBfX1JFUExBQ0VfTk9PUF9JTVBPUlRfXyAqL1xuaW1wb3J0IGluaXROZXh0LCAqIGFzIG5leHQgZnJvbSAnLi8nXG5pbXBvcnQgRXZlbnRTb3VyY2VQb2x5ZmlsbCBmcm9tICcuL2Rldi9ldmVudC1zb3VyY2UtcG9seWZpbGwnXG5pbXBvcnQgaW5pdE9uRGVtYW5kRW50cmllcyBmcm9tICcuL2Rldi9vbi1kZW1hbmQtZW50cmllcy1jbGllbnQnXG5pbXBvcnQgaW5pdFdlYnBhY2tITVIgZnJvbSAnLi9kZXYvd2VicGFjay1ob3QtbWlkZGxld2FyZS1jbGllbnQnXG5pbXBvcnQgaW5pdGlhbGl6ZUJ1aWxkV2F0Y2hlciBmcm9tICcuL2Rldi9kZXYtYnVpbGQtd2F0Y2hlcidcbmltcG9ydCB7IGRpc3BsYXlDb250ZW50IH0gZnJvbSAnLi9kZXYvZm91YydcbmltcG9ydCB7IGdldEV2ZW50U291cmNlV3JhcHBlciB9IGZyb20gJy4vZGV2L2Vycm9yLW92ZXJsYXkvZXZlbnRzb3VyY2UnXG5pbXBvcnQgKiBhcyBxdWVyeXN0cmluZyBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3F1ZXJ5c3RyaW5nJ1xuXG4vLyBUZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgdGhlIGlzc3VlIGRlc2NyaWJlZCBoZXJlOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3ZlcmNlbC9uZXh0LmpzL2lzc3Vlcy8zNzc1I2lzc3VlY29tbWVudC00MDc0MzgxMjNcbi8vIFRoZSBydW50aW1lQ2h1bmsgZG9lc24ndCBoYXZlIGR5bmFtaWMgaW1wb3J0IGhhbmRsaW5nIGNvZGUgd2hlbiB0aGVyZSBoYXNuJ3QgYmVlbiBhIGR5bmFtaWMgaW1wb3J0XG4vLyBUaGUgcnVudGltZUNodW5rIGNhbid0IGhvdCByZWxvYWQgaXRzZWxmIGN1cnJlbnRseSB0byBjb3JyZWN0IGl0IHdoZW4gYWRkaW5nIHBhZ2VzIHVzaW5nIG9uLWRlbWFuZC1lbnRyaWVzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG5fX1JFUExBQ0VfTk9PUF9JTVBPUlRfX1xuXG4vLyBTdXBwb3J0IEV2ZW50U291cmNlIG9uIEludGVybmV0IEV4cGxvcmVyIDExXG5pZiAoIXdpbmRvdy5FdmVudFNvdXJjZSkge1xuICB3aW5kb3cuRXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZVBvbHlmaWxsXG59XG5cbmNvbnN0IHtcbiAgX19ORVhUX0RBVEFfXzogeyBhc3NldFByZWZpeCB9LFxufSA9IHdpbmRvd1xuXG5jb25zdCBwcmVmaXggPSBhc3NldFByZWZpeCB8fCAnJ1xuY29uc3Qgd2VicGFja0hNUiA9IGluaXRXZWJwYWNrSE1SKHsgYXNzZXRQcmVmaXg6IHByZWZpeCB9KVxuXG53aW5kb3cubmV4dCA9IG5leHRcbmluaXROZXh0KHsgd2VicGFja0hNUiB9KVxuICAudGhlbigoeyByZW5kZXJDdHgsIHJlbmRlciB9KSA9PiB7XG4gICAgaW5pdE9uRGVtYW5kRW50cmllcyh7IGFzc2V0UHJlZml4OiBwcmVmaXggfSlcblxuICAgIGxldCBidWlsZEluZGljYXRvckhhbmRsZXIgPSAoKSA9PiB7fVxuXG4gICAgZnVuY3Rpb24gZGV2UGFnZXNNYW5pZmVzdExpc3RlbmVyKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuZGF0YS5pbmRleE9mKCdkZXZQYWdlc01hbmlmZXN0JykgIT09IC0xKSB7XG4gICAgICAgIGZldGNoKGAke3ByZWZpeH0vX25leHQvc3RhdGljL2RldmVsb3BtZW50L19kZXZQYWdlc01hbmlmZXN0Lmpzb25gKVxuICAgICAgICAgIC50aGVuKChyZXMpID0+IHJlcy5qc29uKCkpXG4gICAgICAgICAgLnRoZW4oKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cuX19ERVZfUEFHRVNfTUFOSUZFU1QgPSBtYW5pZmVzdFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gZmV0Y2ggZGV2UGFnZXNNYW5pZmVzdGAsIGVycilcbiAgICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmIChldmVudC5kYXRhLmluZGV4T2YoJ3NlcnZlck9ubHlDaGFuZ2VzJykgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHsgcGFnZXMgfSA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSlcbiAgICAgICAgY29uc3Qgcm91dGVyID0gd2luZG93Lm5leHQucm91dGVyXG5cbiAgICAgICAgaWYgKHBhZ2VzLmluY2x1ZGVzKHJvdXRlci5wYXRobmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnUmVmcmVzaGluZyBwYWdlIGRhdGEgZHVlIHRvIHNlcnZlci1zaWRlIGNoYW5nZScpXG5cbiAgICAgICAgICBidWlsZEluZGljYXRvckhhbmRsZXIoJ2J1aWxkaW5nJylcblxuICAgICAgICAgIGNvbnN0IGNsZWFySW5kaWNhdG9yID0gKCkgPT4gYnVpbGRJbmRpY2F0b3JIYW5kbGVyKCdidWlsdCcpXG5cbiAgICAgICAgICByb3V0ZXJcbiAgICAgICAgICAgIC5yZXBsYWNlKFxuICAgICAgICAgICAgICByb3V0ZXIucGF0aG5hbWUgK1xuICAgICAgICAgICAgICAgICc/JyArXG4gICAgICAgICAgICAgICAgU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgcXVlcnlzdHJpbmcuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICBxdWVyeXN0cmluZy51cmxRdWVyeVRvU2VhcmNoUGFyYW1zKHJvdXRlci5xdWVyeSksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHJvdXRlci5hc1BhdGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maW5hbGx5KGNsZWFySW5kaWNhdG9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGRldlBhZ2VzTWFuaWZlc3RMaXN0ZW5lci51bmZpbHRlcmVkID0gdHJ1ZVxuICAgIGdldEV2ZW50U291cmNlV3JhcHBlcih7fSkuYWRkTWVzc2FnZUxpc3RlbmVyKGRldlBhZ2VzTWFuaWZlc3RMaXN0ZW5lcilcblxuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfQlVJTERfSU5ESUNBVE9SKSB7XG4gICAgICBpbml0aWFsaXplQnVpbGRXYXRjaGVyKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIGJ1aWxkSW5kaWNhdG9ySGFuZGxlciA9IGhhbmRsZXJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gZGVsYXkgcmVuZGVyaW5nIHVudGlsIGFmdGVyIHN0eWxlcyBoYXZlIGJlZW4gYXBwbGllZCBpbiBkZXZlbG9wbWVudFxuICAgIGRpc3BsYXlDb250ZW50KCgpID0+IHtcbiAgICAgIHJlbmRlcihyZW5kZXJDdHgpXG4gICAgfSlcbiAgfSlcbiAgLmNhdGNoKChlcnIpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciB3YXMgbm90IGNhdWdodCcsIGVycilcbiAgfSlcbiIsIi8qKlxuICogUmVtb3ZlcyB0aGUgdHJhaWxpbmcgc2xhc2ggb2YgYSBwYXRoIGlmIHRoZXJlIGlzIG9uZS4gUHJlc2VydmVzIHRoZSByb290IHBhdGggYC9gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguZW5kc1dpdGgoJy8nKSAmJiBwYXRoICE9PSAnLycgPyBwYXRoLnNsaWNlKDAsIC0xKSA6IHBhdGhcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSB0cmFpbGluZyBzbGFzaCBvZiBhIHBhdGggYWNjb3JkaW5nIHRvIHRoZSBgdHJhaWxpbmdTbGFzaGAgb3B0aW9uXG4gKiBpbiBgbmV4dC5jb25maWcuanNgLlxuICovXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplUGF0aFRyYWlsaW5nU2xhc2ggPSBwcm9jZXNzLmVudi5fX05FWFRfVFJBSUxJTkdfU0xBU0hcbiAgPyAocGF0aDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAgIGlmICgvXFwuW14vXStcXC8/JC8udGVzdChwYXRoKSkge1xuICAgICAgICByZXR1cm4gcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2gocGF0aClcbiAgICAgIH0gZWxzZSBpZiAocGF0aC5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgIHJldHVybiBwYXRoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcGF0aCArICcvJ1xuICAgICAgfVxuICAgIH1cbiAgOiByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaFxuIiwiaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ2xpZW50U3NnTWFuaWZlc3QgfSBmcm9tICcuLi9idWlsZCdcbmltcG9ydCB7XG4gIGFkZEJhc2VQYXRoLFxuICBhZGRMb2NhbGUsXG4gIGludGVycG9sYXRlQXMsXG59IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvcm91dGVyJ1xuaW1wb3J0IGdldEFzc2V0UGF0aEZyb21Sb3V0ZSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2dldC1hc3NldC1wYXRoLWZyb20tcm91dGUnXG5pbXBvcnQgeyBpc0R5bmFtaWNSb3V0ZSB9IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvdXRpbHMvaXMtZHluYW1pYydcbmltcG9ydCB7IHBhcnNlUmVsYXRpdmVVcmwgfSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3BhcnNlLXJlbGF0aXZlLXVybCdcbmltcG9ydCB7IHJlbW92ZVBhdGhUcmFpbGluZ1NsYXNoIH0gZnJvbSAnLi9ub3JtYWxpemUtdHJhaWxpbmctc2xhc2gnXG5pbXBvcnQgY3JlYXRlUm91dGVMb2FkZXIsIHtcbiAgZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCxcbiAgUm91dGVMb2FkZXIsXG59IGZyb20gJy4vcm91dGUtbG9hZGVyJ1xuXG5mdW5jdGlvbiBub3JtYWxpemVSb3V0ZShyb3V0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHJvdXRlWzBdICE9PSAnLycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRlIG5hbWUgc2hvdWxkIHN0YXJ0IHdpdGggYSBcIi9cIiwgZ290IFwiJHtyb3V0ZX1cImApXG4gIH1cblxuICBpZiAocm91dGUgPT09ICcvJykgcmV0dXJuIHJvdXRlXG4gIHJldHVybiByb3V0ZS5yZXBsYWNlKC9cXC8kLywgJycpXG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlU2hlZXRUdXBsZSA9IHsgaHJlZjogc3RyaW5nOyB0ZXh0OiBzdHJpbmcgfVxuZXhwb3J0IHR5cGUgR29vZFBhZ2VDYWNoZSA9IHtcbiAgcGFnZTogQ29tcG9uZW50VHlwZVxuICBtb2Q6IGFueVxuICBzdHlsZVNoZWV0czogU3R5bGVTaGVldFR1cGxlW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZUxvYWRlciB7XG4gIHByaXZhdGUgYnVpbGRJZDogc3RyaW5nXG4gIHByaXZhdGUgYXNzZXRQcmVmaXg6IHN0cmluZ1xuXG4gIHByaXZhdGUgcHJvbWlzZWRTc2dNYW5pZmVzdD86IFByb21pc2U8Q2xpZW50U3NnTWFuaWZlc3Q+XG4gIHByaXZhdGUgcHJvbWlzZWREZXZQYWdlc01hbmlmZXN0PzogUHJvbWlzZTxhbnk+XG4gIHB1YmxpYyByb3V0ZUxvYWRlcjogUm91dGVMb2FkZXJcblxuICBjb25zdHJ1Y3RvcihidWlsZElkOiBzdHJpbmcsIGFzc2V0UHJlZml4OiBzdHJpbmcpIHtcbiAgICB0aGlzLnJvdXRlTG9hZGVyID0gY3JlYXRlUm91dGVMb2FkZXIoYXNzZXRQcmVmaXgpXG5cbiAgICB0aGlzLmJ1aWxkSWQgPSBidWlsZElkXG4gICAgdGhpcy5hc3NldFByZWZpeCA9IGFzc2V0UHJlZml4XG5cbiAgICAvKiogQHR5cGUge1Byb21pc2U8U2V0PHN0cmluZz4+fSAqL1xuICAgIHRoaXMucHJvbWlzZWRTc2dNYW5pZmVzdCA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fU1NHX01BTklGRVNUKSB7XG4gICAgICAgIHJlc29sdmUoKHdpbmRvdyBhcyBhbnkpLl9fU1NHX01BTklGRVNUKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgOyh3aW5kb3cgYXMgYW55KS5fX1NTR19NQU5JRkVTVF9DQiA9ICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCh3aW5kb3cgYXMgYW55KS5fX1NTR19NQU5JRkVTVClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXRQYWdlTGlzdCgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuIGdldENsaWVudEJ1aWxkTWFuaWZlc3QoKS50aGVuKChtYW5pZmVzdCkgPT4gbWFuaWZlc3Quc29ydGVkUGFnZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgod2luZG93IGFzIGFueSkuX19ERVZfUEFHRVNfTUFOSUZFU1QpIHtcbiAgICAgICAgcmV0dXJuICh3aW5kb3cgYXMgYW55KS5fX0RFVl9QQUdFU19NQU5JRkVTVC5wYWdlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb21pc2VkRGV2UGFnZXNNYW5pZmVzdCkge1xuICAgICAgICAgIHRoaXMucHJvbWlzZWREZXZQYWdlc01hbmlmZXN0ID0gZmV0Y2goXG4gICAgICAgICAgICBgJHt0aGlzLmFzc2V0UHJlZml4fS9fbmV4dC9zdGF0aWMvZGV2ZWxvcG1lbnQvX2RldlBhZ2VzTWFuaWZlc3QuanNvbmBcbiAgICAgICAgICApXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiByZXMuanNvbigpKVxuICAgICAgICAgICAgLnRoZW4oKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgICAgICAgIDsod2luZG93IGFzIGFueSkuX19ERVZfUEFHRVNfTUFOSUZFU1QgPSBtYW5pZmVzdFxuICAgICAgICAgICAgICByZXR1cm4gbWFuaWZlc3QucGFnZXNcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGZldGNoIGRldlBhZ2VzTWFuaWZlc3RgLCBlcnIpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2VkRGV2UGFnZXNNYW5pZmVzdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiB0aGUgcm91dGUgaHJlZiAoZmlsZS1zeXN0ZW0gcGF0aClcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFzUGF0aCB0aGUgVVJMIGFzIHNob3duIGluIGJyb3dzZXIgKHZpcnR1YWwgcGF0aCk7IHVzZWQgZm9yIGR5bmFtaWMgcm91dGVzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXREYXRhSHJlZihcbiAgICBocmVmOiBzdHJpbmcsXG4gICAgYXNQYXRoOiBzdHJpbmcsXG4gICAgc3NnOiBib29sZWFuLFxuICAgIGxvY2FsZT86IHN0cmluZyB8IGZhbHNlXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBwYXRobmFtZTogaHJlZlBhdGhuYW1lLCBxdWVyeSwgc2VhcmNoIH0gPSBwYXJzZVJlbGF0aXZlVXJsKGhyZWYpXG4gICAgY29uc3QgeyBwYXRobmFtZTogYXNQYXRobmFtZSB9ID0gcGFyc2VSZWxhdGl2ZVVybChhc1BhdGgpXG4gICAgY29uc3Qgcm91dGUgPSBub3JtYWxpemVSb3V0ZShocmVmUGF0aG5hbWUpXG5cbiAgICBjb25zdCBnZXRIcmVmRm9yU2x1ZyA9IChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFSb3V0ZSA9IGdldEFzc2V0UGF0aEZyb21Sb3V0ZShcbiAgICAgICAgcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2goYWRkTG9jYWxlKHBhdGgsIGxvY2FsZSkpLFxuICAgICAgICAnLmpzb24nXG4gICAgICApXG4gICAgICByZXR1cm4gYWRkQmFzZVBhdGgoXG4gICAgICAgIGAvX25leHQvZGF0YS8ke3RoaXMuYnVpbGRJZH0ke2RhdGFSb3V0ZX0ke3NzZyA/ICcnIDogc2VhcmNofWBcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBpc0R5bmFtaWM6IGJvb2xlYW4gPSBpc0R5bmFtaWNSb3V0ZShyb3V0ZSlcbiAgICBjb25zdCBpbnRlcnBvbGF0ZWRSb3V0ZSA9IGlzRHluYW1pY1xuICAgICAgPyBpbnRlcnBvbGF0ZUFzKGhyZWZQYXRobmFtZSwgYXNQYXRobmFtZSwgcXVlcnkpLnJlc3VsdFxuICAgICAgOiAnJ1xuXG4gICAgcmV0dXJuIGlzRHluYW1pY1xuICAgICAgPyBpbnRlcnBvbGF0ZWRSb3V0ZSAmJiBnZXRIcmVmRm9yU2x1ZyhpbnRlcnBvbGF0ZWRSb3V0ZSlcbiAgICAgIDogZ2V0SHJlZkZvclNsdWcocm91dGUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvdXRlIC0gdGhlIHJvdXRlIChmaWxlLXN5c3RlbSBwYXRoKVxuICAgKi9cbiAgX2lzU3NnKHJvdXRlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9taXNlZFNzZ01hbmlmZXN0IS50aGVuKChzOiBDbGllbnRTc2dNYW5pZmVzdCkgPT5cbiAgICAgIHMuaGFzKHJvdXRlKVxuICAgIClcbiAgfVxuXG4gIGxvYWRQYWdlKHJvdXRlOiBzdHJpbmcpOiBQcm9taXNlPEdvb2RQYWdlQ2FjaGU+IHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZUxvYWRlci5sb2FkUm91dGUocm91dGUpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgaWYgKCdjb21wb25lbnQnIGluIHJlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBhZ2U6IHJlcy5jb21wb25lbnQsXG4gICAgICAgICAgbW9kOiByZXMuZXhwb3J0cyxcbiAgICAgICAgICBzdHlsZVNoZWV0czogcmVzLnN0eWxlcy5tYXAoKG8pID0+ICh7XG4gICAgICAgICAgICBocmVmOiBvLmhyZWYsXG4gICAgICAgICAgICB0ZXh0OiBvLmNvbnRlbnQsXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyByZXMuZXJyb3JcbiAgICB9KVxuICB9XG5cbiAgcHJlZmV0Y2gocm91dGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnJvdXRlTG9hZGVyLnByZWZldGNoKHJvdXRlKVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBnZXRDTFMsXG4gIGdldEZDUCxcbiAgZ2V0RklELFxuICBnZXRMQ1AsXG4gIGdldFRURkIsXG4gIE1ldHJpYyxcbiAgUmVwb3J0SGFuZGxlcixcbn0gZnJvbSAnbmV4dC9kaXN0L2NvbXBpbGVkL3dlYi12aXRhbHMnXG5cbmNvbnN0IGluaXRpYWxIcmVmID0gbG9jYXRpb24uaHJlZlxubGV0IGlzUmVnaXN0ZXJlZCA9IGZhbHNlXG5sZXQgdXNlclJlcG9ydEhhbmRsZXI6IFJlcG9ydEhhbmRsZXIgfCB1bmRlZmluZWRcblxuZnVuY3Rpb24gb25SZXBvcnQobWV0cmljOiBNZXRyaWMpOiB2b2lkIHtcbiAgaWYgKHVzZXJSZXBvcnRIYW5kbGVyKSB7XG4gICAgdXNlclJlcG9ydEhhbmRsZXIobWV0cmljKVxuICB9XG5cbiAgLy8gVGhpcyBjb2RlIGlzIG5vdCBzaGlwcGVkLCBleGVjdXRlZCwgb3IgcHJlc2VudCBpbiB0aGUgY2xpZW50LXNpZGVcbiAgLy8gSmF2YVNjcmlwdCBidW5kbGUgdW5sZXNzIGV4cGxpY2l0bHkgZW5hYmxlZCBpbiB5b3VyIGFwcGxpY2F0aW9uLlxuICAvL1xuICAvLyBXaGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCB3ZSdsbCBtYWtlIGl0IHZlcnkgY2xlYXIgYnkgcHJpbnRpbmcgYVxuICAvLyBtZXNzYWdlIGR1cmluZyB0aGUgYnVpbGQgKGBuZXh0IGJ1aWxkYCkuXG4gIGlmIChcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgLy8gVGhpcyBmaWVsZCBpcyBlbXB0eSB1bmxlc3MgeW91IGV4cGxpY2l0bHkgY29uZmlndXJlIGl0OlxuICAgIHByb2Nlc3MuZW52Ll9fTkVYVF9BTkFMWVRJQ1NfSURcbiAgKSB7XG4gICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIGRzbjogcHJvY2Vzcy5lbnYuX19ORVhUX0FOQUxZVElDU19JRCxcbiAgICAgIGlkOiBtZXRyaWMuaWQsXG4gICAgICBwYWdlOiB3aW5kb3cuX19ORVhUX0RBVEFfXy5wYWdlLFxuICAgICAgaHJlZjogaW5pdGlhbEhyZWYsXG4gICAgICBldmVudF9uYW1lOiBtZXRyaWMubmFtZSxcbiAgICAgIHZhbHVlOiBtZXRyaWMudmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIHNwZWVkOlxuICAgICAgICAnY29ubmVjdGlvbicgaW4gbmF2aWdhdG9yICYmXG4gICAgICAgIG5hdmlnYXRvclsnY29ubmVjdGlvbiddICYmXG4gICAgICAgICdlZmZlY3RpdmVUeXBlJyBpbiBuYXZpZ2F0b3JbJ2Nvbm5lY3Rpb24nXVxuICAgICAgICAgID8gKG5hdmlnYXRvclsnY29ubmVjdGlvbiddWydlZmZlY3RpdmVUeXBlJ10gYXMgc3RyaW5nKVxuICAgICAgICAgIDogJycsXG4gICAgfVxuXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtuZXcgVVJMU2VhcmNoUGFyYW1zKGJvZHkpLnRvU3RyaW5nKCldLCB7XG4gICAgICAvLyBUaGlzIGNvbnRlbnQgdHlwZSBpcyBuZWNlc3NhcnkgZm9yIGBzZW5kQmVhY29uYDpcbiAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgIH0pXG4gICAgY29uc3Qgdml0YWxzVXJsID0gJ2h0dHBzOi8vdml0YWxzLnZlcmNlbC1pbnNpZ2h0cy5jb20vdjEvdml0YWxzJ1xuICAgIDsobmF2aWdhdG9yLnNlbmRCZWFjb24gJiYgbmF2aWdhdG9yLnNlbmRCZWFjb24odml0YWxzVXJsLCBibG9iKSkgfHxcbiAgICAgIGZldGNoKHZpdGFsc1VybCwge1xuICAgICAgICBib2R5OiBibG9iLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdvbWl0JyxcbiAgICAgICAga2VlcGFsaXZlOiB0cnVlLFxuICAgICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCAob25QZXJmRW50cnk/OiBSZXBvcnRIYW5kbGVyKTogdm9pZCA9PiB7XG4gIC8vIFVwZGF0ZSBmdW5jdGlvbiBpZiBpdCBjaGFuZ2VzOlxuICB1c2VyUmVwb3J0SGFuZGxlciA9IG9uUGVyZkVudHJ5XG5cbiAgLy8gT25seSByZWdpc3RlciBsaXN0ZW5lcnMgb25jZTpcbiAgaWYgKGlzUmVnaXN0ZXJlZCkge1xuICAgIHJldHVyblxuICB9XG4gIGlzUmVnaXN0ZXJlZCA9IHRydWVcblxuICBnZXRDTFMob25SZXBvcnQpXG4gIGdldEZJRChvblJlcG9ydClcbiAgZ2V0RkNQKG9uUmVwb3J0KVxuICBnZXRMQ1Aob25SZXBvcnQpXG4gIGdldFRURkIob25SZXBvcnQpXG59XG4iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSdcblxudHlwZSBQb3J0YWxQcm9wcyA9IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVxuICB0eXBlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFBvcnRhbDogUmVhY3QuRkM8UG9ydGFsUHJvcHM+ID0gKHsgY2hpbGRyZW4sIHR5cGUgfSkgPT4ge1xuICBsZXQgcG9ydGFsTm9kZSA9IFJlYWN0LnVzZVJlZjxIVE1MRWxlbWVudCB8IG51bGw+KG51bGwpXG4gIGxldCBbLCBmb3JjZVVwZGF0ZV0gPSBSZWFjdC51c2VTdGF0ZTx7fT4oKVxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIHBvcnRhbE5vZGUuY3VycmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodHlwZSlcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBvcnRhbE5vZGUuY3VycmVudClcbiAgICBmb3JjZVVwZGF0ZSh7fSlcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHBvcnRhbE5vZGUuY3VycmVudCkge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHBvcnRhbE5vZGUuY3VycmVudClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFt0eXBlXSlcblxuICByZXR1cm4gcG9ydGFsTm9kZS5jdXJyZW50ID8gY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBwb3J0YWxOb2RlLmN1cnJlbnQpIDogbnVsbFxufVxuIiwidHlwZSBSZXF1ZXN0SWRsZUNhbGxiYWNrSGFuZGxlID0gYW55XG50eXBlIFJlcXVlc3RJZGxlQ2FsbGJhY2tPcHRpb25zID0ge1xuICB0aW1lb3V0OiBudW1iZXJcbn1cbnR5cGUgUmVxdWVzdElkbGVDYWxsYmFja0RlYWRsaW5lID0ge1xuICByZWFkb25seSBkaWRUaW1lb3V0OiBib29sZWFuXG4gIHRpbWVSZW1haW5pbmc6ICgpID0+IG51bWJlclxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIHJlcXVlc3RJZGxlQ2FsbGJhY2s6IChcbiAgICAgIGNhbGxiYWNrOiAoZGVhZGxpbmU6IFJlcXVlc3RJZGxlQ2FsbGJhY2tEZWFkbGluZSkgPT4gdm9pZCxcbiAgICAgIG9wdHM/OiBSZXF1ZXN0SWRsZUNhbGxiYWNrT3B0aW9uc1xuICAgICkgPT4gUmVxdWVzdElkbGVDYWxsYmFja0hhbmRsZVxuICAgIGNhbmNlbElkbGVDYWxsYmFjazogKGlkOiBSZXF1ZXN0SWRsZUNhbGxiYWNrSGFuZGxlKSA9PiB2b2lkXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlcXVlc3RJZGxlQ2FsbGJhY2sgPVxuICAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYucmVxdWVzdElkbGVDYWxsYmFjaykgfHxcbiAgZnVuY3Rpb24gKFxuICAgIGNiOiAoZGVhZGxpbmU6IFJlcXVlc3RJZGxlQ2FsbGJhY2tEZWFkbGluZSkgPT4gdm9pZFxuICApOiBOb2RlSlMuVGltZW91dCB7XG4gICAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGNiKHtcbiAgICAgICAgZGlkVGltZW91dDogZmFsc2UsXG4gICAgICAgIHRpbWVSZW1haW5pbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgNTAgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0KSlcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfSwgMSlcbiAgfVxuXG5leHBvcnQgY29uc3QgY2FuY2VsSWRsZUNhbGxiYWNrID1cbiAgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLmNhbmNlbElkbGVDYWxsYmFjaykgfHxcbiAgZnVuY3Rpb24gKGlkOiBSZXF1ZXN0SWRsZUNhbGxiYWNrSGFuZGxlKSB7XG4gICAgcmV0dXJuIGNsZWFyVGltZW91dChpZClcbiAgfVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXInXG5cbmV4cG9ydCBmdW5jdGlvbiBSb3V0ZUFubm91bmNlcigpIHtcbiAgY29uc3QgeyBhc1BhdGggfSA9IHVzZVJvdXRlcigpXG4gIGNvbnN0IFtyb3V0ZUFubm91bmNlbWVudCwgc2V0Um91dGVBbm5vdW5jZW1lbnRdID0gdXNlU3RhdGUoJycpXG5cbiAgLy8gT25seSBhbm5vdW5jZSB0aGUgcGF0aCBjaGFuZ2UsIGJ1dCBub3QgZm9yIHRoZSBmaXJzdCBsb2FkIGJlY2F1c2Ugc2NyZWVuIHJlYWRlciB3aWxsIGRvIHRoYXQgYXV0b21hdGljYWxseS5cbiAgY29uc3QgaW5pdGlhbFBhdGhMb2FkZWQgPSB1c2VSZWYoZmFsc2UpXG5cbiAgLy8gRXZlcnkgdGltZSB0aGUgcGF0aCBjaGFuZ2VzLCBhbm5vdW5jZSB0aGUgcm91dGUgY2hhbmdlLiBUaGUgYW5ub3VuY2VtZW50IHdpbGwgYmUgcHJpb3JpdGl6ZWQgYnkgaDEsIHRoZW4gdGl0bGVcbiAgLy8gKGZyb20gbWV0YWRhdGEpLCBhbmQgZmluYWxseSBpZiB0aG9zZSBkb24ndCBleGlzdCwgdGhlbiB0aGUgcGF0aE5hbWUgdGhhdCBpcyBpbiB0aGUgVVJMLiBUaGlzIG1ldGhvZG9sb2d5IGlzXG4gIC8vIGluc3BpcmVkIGJ5IE1hcmN5IFN1dHRvbidzIGFjY2Vzc2libGUgY2xpZW50IHJvdXRpbmcgdXNlciB0ZXN0aW5nLiBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBoZXJlOlxuICAvLyBodHRwczovL3d3dy5nYXRzYnlqcy5jb20vYmxvZy8yMDE5LTA3LTExLXVzZXItdGVzdGluZy1hY2Nlc3NpYmxlLWNsaWVudC1yb3V0aW5nL1xuICB1c2VFZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgaWYgKCFpbml0aWFsUGF0aExvYWRlZC5jdXJyZW50KSB7XG4gICAgICAgIGluaXRpYWxQYXRoTG9hZGVkLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsZXQgbmV3Um91dGVBbm5vdW5jZW1lbnRcbiAgICAgIGNvbnN0IHBhZ2VIZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMScpXG5cbiAgICAgIGlmIChwYWdlSGVhZGVyKSB7XG4gICAgICAgIG5ld1JvdXRlQW5ub3VuY2VtZW50ID0gcGFnZUhlYWRlci5pbm5lclRleHQgfHwgcGFnZUhlYWRlci50ZXh0Q29udGVudFxuICAgICAgfVxuICAgICAgaWYgKCFuZXdSb3V0ZUFubm91bmNlbWVudCkge1xuICAgICAgICBpZiAoZG9jdW1lbnQudGl0bGUpIHtcbiAgICAgICAgICBuZXdSb3V0ZUFubm91bmNlbWVudCA9IGRvY3VtZW50LnRpdGxlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3Um91dGVBbm5vdW5jZW1lbnQgPSBhc1BhdGhcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRSb3V0ZUFubm91bmNlbWVudChuZXdSb3V0ZUFubm91bmNlbWVudClcbiAgICB9LFxuICAgIC8vIFRPRE86IHN3aXRjaCB0byBwYXRobmFtZSArIHF1ZXJ5IG9iamVjdCBvZiBkeW5hbWljIHJvdXRlIHJlcXVpcmVtZW50c1xuICAgIFthc1BhdGhdXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIiAvLyBNYWtlIHRoZSBhbm5vdW5jZW1lbnQgaW1tZWRpYXRlbHkuXG4gICAgICBpZD1cIl9fbmV4dC1yb3V0ZS1hbm5vdW5jZXJfX1wiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICBjbGlwOiAncmVjdCgwIDAgMCAwKScsXG4gICAgICAgIGhlaWdodDogJzFweCcsXG4gICAgICAgIG1hcmdpbjogJy0xcHgnLFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIHBhZGRpbmc6IDAsXG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB3aWR0aDogJzFweCcsXG5cbiAgICAgICAgLy8gaHR0cHM6Ly9tZWRpdW0uY29tL0BqZXNzZWJlYWNoL2Jld2FyZS1zbXVzaGVkLW9mZi1zY3JlZW4tYWNjZXNzaWJsZS10ZXh0LTU5NTJhNGMyY2JmZVxuICAgICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgICAgd29yZFdyYXA6ICdub3JtYWwnLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7cm91dGVBbm5vdW5jZW1lbnR9XG4gICAgPC9wPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvdXRlQW5ub3VuY2VyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRUeXBlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDbGllbnRCdWlsZE1hbmlmZXN0IH0gZnJvbSAnLi4vYnVpbGQvd2VicGFjay9wbHVnaW5zL2J1aWxkLW1hbmlmZXN0LXBsdWdpbidcbmltcG9ydCBnZXRBc3NldFBhdGhGcm9tUm91dGUgZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9nZXQtYXNzZXQtcGF0aC1mcm9tLXJvdXRlJ1xuaW1wb3J0IHsgcmVxdWVzdElkbGVDYWxsYmFjayB9IGZyb20gJy4vcmVxdWVzdC1pZGxlLWNhbGxiYWNrJ1xuXG4vLyAzLjhzIHdhcyBhcmJpdHJhcmlseSBjaG9zZW4gYXMgaXQncyB3aGF0IGh0dHBzOi8vd2ViLmRldi9pbnRlcmFjdGl2ZVxuLy8gY29uc2lkZXJzIGFzIFwiR29vZFwiIHRpbWUtdG8taW50ZXJhY3RpdmUuIFdlIG11c3QgYXNzdW1lIHNvbWV0aGluZyB3ZW50XG4vLyB3cm9uZyBiZXlvbmQgdGhpcyBwb2ludCwgYW5kIHRoZW4gZmFsbC1iYWNrIHRvIGEgZnVsbCBwYWdlIHRyYW5zaXRpb24gdG9cbi8vIHNob3cgdGhlIHVzZXIgc29tZXRoaW5nIG9mIHZhbHVlLlxuY29uc3QgTVNfTUFYX0lETEVfREVMQVkgPSAzODAwXG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX19CVUlMRF9NQU5JRkVTVD86IENsaWVudEJ1aWxkTWFuaWZlc3RcbiAgICBfX0JVSUxEX01BTklGRVNUX0NCPzogRnVuY3Rpb25cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZEVudHJ5cG9pbnRTdWNjZXNzIHtcbiAgY29tcG9uZW50OiBDb21wb25lbnRUeXBlXG4gIGV4cG9ydHM6IGFueVxufVxuZXhwb3J0IGludGVyZmFjZSBMb2FkZWRFbnRyeXBvaW50RmFpbHVyZSB7XG4gIGVycm9yOiB1bmtub3duXG59XG5leHBvcnQgdHlwZSBSb3V0ZUVudHJ5cG9pbnQgPSBMb2FkZWRFbnRyeXBvaW50U3VjY2VzcyB8IExvYWRlZEVudHJ5cG9pbnRGYWlsdXJlXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVTdHlsZVNoZWV0IHtcbiAgaHJlZjogc3RyaW5nXG4gIGNvbnRlbnQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZFJvdXRlU3VjY2VzcyBleHRlbmRzIExvYWRlZEVudHJ5cG9pbnRTdWNjZXNzIHtcbiAgc3R5bGVzOiBSb3V0ZVN0eWxlU2hlZXRbXVxufVxuZXhwb3J0IGludGVyZmFjZSBMb2FkZWRSb3V0ZUZhaWx1cmUge1xuICBlcnJvcjogdW5rbm93blxufVxuZXhwb3J0IHR5cGUgUm91dGVMb2FkZXJFbnRyeSA9IExvYWRlZFJvdXRlU3VjY2VzcyB8IExvYWRlZFJvdXRlRmFpbHVyZVxuXG5leHBvcnQgdHlwZSBGdXR1cmU8Vj4gPSB7XG4gIHJlc29sdmU6IChlbnRyeXBvaW50OiBWKSA9PiB2b2lkXG4gIGZ1dHVyZTogUHJvbWlzZTxWPlxufVxuZnVuY3Rpb24gd2l0aEZ1dHVyZTxUPihcbiAga2V5OiBzdHJpbmcsXG4gIG1hcDogTWFwPHN0cmluZywgRnV0dXJlPFQ+IHwgVD4sXG4gIGdlbmVyYXRvcj86ICgpID0+IFByb21pc2U8VD5cbik6IFByb21pc2U8VD4ge1xuICBsZXQgZW50cnk6IEZ1dHVyZTxUPiB8IFQgfCB1bmRlZmluZWQgPSBtYXAuZ2V0KGtleSlcbiAgaWYgKGVudHJ5KSB7XG4gICAgaWYgKCdmdXR1cmUnIGluIGVudHJ5KSB7XG4gICAgICByZXR1cm4gZW50cnkuZnV0dXJlXG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZW50cnkpXG4gIH1cbiAgbGV0IHJlc29sdmVyOiAoZW50cnlwb2ludDogVCkgPT4gdm9pZFxuICBjb25zdCBwcm9tOiBQcm9taXNlPFQ+ID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUpID0+IHtcbiAgICByZXNvbHZlciA9IHJlc29sdmVcbiAgfSlcbiAgbWFwLnNldChrZXksIChlbnRyeSA9IHsgcmVzb2x2ZTogcmVzb2x2ZXIhLCBmdXR1cmU6IHByb20gfSkpXG4gIHJldHVybiBnZW5lcmF0b3JcbiAgICA/IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZXF1ZW5jZXNcbiAgICAgIGdlbmVyYXRvcigpLnRoZW4oKHZhbHVlKSA9PiAocmVzb2x2ZXIodmFsdWUpLCB2YWx1ZSkpXG4gICAgOiBwcm9tXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVMb2FkZXIge1xuICB3aGVuRW50cnlwb2ludChyb3V0ZTogc3RyaW5nKTogUHJvbWlzZTxSb3V0ZUVudHJ5cG9pbnQ+XG4gIG9uRW50cnlwb2ludChyb3V0ZTogc3RyaW5nLCBleGVjdXRlOiAoKSA9PiB1bmtub3duKTogdm9pZFxuICBsb2FkUm91dGUocm91dGU6IHN0cmluZyk6IFByb21pc2U8Um91dGVMb2FkZXJFbnRyeT5cbiAgcHJlZmV0Y2gocm91dGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD5cbn1cblxuZnVuY3Rpb24gaGFzUHJlZmV0Y2gobGluaz86IEhUTUxMaW5rRWxlbWVudCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJylcbiAgICByZXR1cm4gKFxuICAgICAgLy8gZGV0ZWN0IElFMTEgc2luY2UgaXQgc3VwcG9ydHMgcHJlZmV0Y2ggYnV0IGlzbid0IGRldGVjdGVkXG4gICAgICAvLyB3aXRoIHJlbExpc3Quc3VwcG9ydFxuICAgICAgKCEhd2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0ICYmICEhKGRvY3VtZW50IGFzIGFueSkuZG9jdW1lbnRNb2RlKSB8fFxuICAgICAgbGluay5yZWxMaXN0LnN1cHBvcnRzKCdwcmVmZXRjaCcpXG4gICAgKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5jb25zdCBjYW5QcmVmZXRjaDogYm9vbGVhbiA9IGhhc1ByZWZldGNoKClcblxuZnVuY3Rpb24gcHJlZmV0Y2hWaWFEb20oXG4gIGhyZWY6IHN0cmluZyxcbiAgYXM6IHN0cmluZyxcbiAgbGluaz86IEhUTUxMaW5rRWxlbWVudFxuKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBsaW5rW3JlbD1cInByZWZldGNoXCJdW2hyZWZePVwiJHtocmVmfVwiXWApKSB7XG4gICAgICByZXR1cm4gcmVzKClcbiAgICB9XG5cbiAgICBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpXG5cbiAgICAvLyBUaGUgb3JkZXIgb2YgcHJvcGVydHkgYXNzaWdubWVudCBoZXJlIGlzIGludGVudGlvbmFsOlxuICAgIGlmIChhcykgbGluayEuYXMgPSBhc1xuICAgIGxpbmshLnJlbCA9IGBwcmVmZXRjaGBcbiAgICBsaW5rIS5jcm9zc09yaWdpbiA9IHByb2Nlc3MuZW52Ll9fTkVYVF9DUk9TU19PUklHSU4hXG4gICAgbGluayEub25sb2FkID0gcmVzXG4gICAgbGluayEub25lcnJvciA9IHJlalxuXG4gICAgLy8gYGhyZWZgIHNob3VsZCBhbHdheXMgYmUgbGFzdDpcbiAgICBsaW5rIS5ocmVmID0gaHJlZlxuXG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKVxuICB9KVxufVxuXG5jb25zdCBBU1NFVF9MT0FEX0VSUk9SID0gU3ltYm9sKCdBU1NFVF9MT0FEX0VSUk9SJylcbi8vIFRPRE86IHVuZXhwb3J0XG5leHBvcnQgZnVuY3Rpb24gbWFya0Fzc2V0RXJyb3IoZXJyOiBFcnJvcik6IEVycm9yIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnIsIEFTU0VUX0xPQURfRVJST1IsIHt9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNBc3NldEVycm9yKGVycj86IEVycm9yKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBlcnIgJiYgQVNTRVRfTE9BRF9FUlJPUiBpbiBlcnJcbn1cblxuZnVuY3Rpb24gYXBwZW5kU2NyaXB0KFxuICBzcmM6IHN0cmluZyxcbiAgc2NyaXB0PzogSFRNTFNjcmlwdEVsZW1lbnRcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG5cbiAgICAvLyBUaGUgb3JkZXIgb2YgcHJvcGVydHkgYXNzaWdubWVudCBoZXJlIGlzIGludGVudGlvbmFsLlxuICAgIC8vIDEuIFNldHVwIHN1Y2Nlc3MvZmFpbHVyZSBob29rcyBpbiBjYXNlIHRoZSBicm93c2VyIHN5bmNocm9ub3VzbHlcbiAgICAvLyAgICBleGVjdXRlcyB3aGVuIGBzcmNgIGlzIHNldC5cbiAgICBzY3JpcHQub25sb2FkID0gcmVzb2x2ZVxuICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT5cbiAgICAgIHJlamVjdChtYXJrQXNzZXRFcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHNjcmlwdDogJHtzcmN9YCkpKVxuXG4gICAgLy8gMi4gQ29uZmlndXJlIHRoZSBjcm9zcy1vcmlnaW4gYXR0cmlidXRlIGJlZm9yZSBzZXR0aW5nIGBzcmNgIGluIGNhc2UgdGhlXG4gICAgLy8gICAgYnJvd3NlciBiZWdpbnMgdG8gZmV0Y2guXG4gICAgc2NyaXB0LmNyb3NzT3JpZ2luID0gcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTiFcblxuICAgIC8vIDMuIEZpbmFsbHksIHNldCB0aGUgc291cmNlIGFuZCBpbmplY3QgaW50byB0aGUgRE9NIGluIGNhc2UgdGhlIGNoaWxkXG4gICAgLy8gICAgbXVzdCBiZSBhcHBlbmRlZCBmb3IgZmV0Y2hpbmcgdG8gc3RhcnQuXG4gICAgc2NyaXB0LnNyYyA9IHNyY1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KVxuICB9KVxufVxuXG4vLyBSZXNvbHZlIGEgcHJvbWlzZSB0aGF0IHRpbWVzIG91dCBhZnRlciBnaXZlbiBhbW91bnQgb2YgbWlsbGlzZWNvbmRzLlxuZnVuY3Rpb24gcmVzb2x2ZVByb21pc2VXaXRoVGltZW91dDxUPihcbiAgcDogUHJvbWlzZTxUPixcbiAgbXM6IG51bWJlcixcbiAgZXJyOiBFcnJvclxuKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlXG5cbiAgICBwLnRoZW4oKHIpID0+IHtcbiAgICAgIC8vIFJlc29sdmVkLCBjYW5jZWwgdGhlIHRpbWVvdXRcbiAgICAgIGNhbmNlbGxlZCA9IHRydWVcbiAgICAgIHJlc29sdmUocilcbiAgICB9KS5jYXRjaChyZWplY3QpXG5cbiAgICByZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICB9LCBtcylcbiAgICApXG4gIH0pXG59XG5cbi8vIFRPRE86IHN0b3AgZXhwb3J0aW5nIG9yIGNhY2hlIHRoZSBmYWlsdXJlXG4vLyBJdCdkIGJlIGJlc3QgdG8gc3RvcCBleHBvcnRpbmcgdGhpcy4gSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIFdlJ3JlXG4vLyBvbmx5IGV4cG9ydGluZyBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWx0eSB3aXRoIHRoZSBgcGFnZS1sb2FkZXJgLlxuLy8gT25seSBjYWNoZSB0aGlzIHJlc3BvbnNlIGFzIGEgbGFzdCByZXNvcnQgaWYgd2UgY2Fubm90IGVsaW1pbmF0ZSBhbGwgb3RoZXJcbi8vIGNvZGUgYnJhbmNoZXMgdGhhdCB1c2UgdGhlIEJ1aWxkIE1hbmlmZXN0IENhbGxiYWNrIGFuZCBwdXNoIHRoZW0gdGhyb3VnaFxuLy8gdGhlIFJvdXRlIExvYWRlciBpbnRlcmZhY2UuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCgpOiBQcm9taXNlPENsaWVudEJ1aWxkTWFuaWZlc3Q+IHtcbiAgaWYgKHNlbGYuX19CVUlMRF9NQU5JRkVTVCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc2VsZi5fX0JVSUxEX01BTklGRVNUKVxuICB9XG5cbiAgY29uc3Qgb25CdWlsZE1hbmlmZXN0OiBQcm9taXNlPENsaWVudEJ1aWxkTWFuaWZlc3Q+ID0gbmV3IFByb21pc2U8XG4gICAgQ2xpZW50QnVpbGRNYW5pZmVzdFxuICA+KChyZXNvbHZlKSA9PiB7XG4gICAgLy8gTWFuZGF0b3J5IGJlY2F1c2UgdGhpcyBpcyBub3QgY29uY3VycmVudCBzYWZlOlxuICAgIGNvbnN0IGNiID0gc2VsZi5fX0JVSUxEX01BTklGRVNUX0NCXG4gICAgc2VsZi5fX0JVSUxEX01BTklGRVNUX0NCID0gKCkgPT4ge1xuICAgICAgcmVzb2x2ZShzZWxmLl9fQlVJTERfTUFOSUZFU1QhKVxuICAgICAgY2IgJiYgY2IoKVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gcmVzb2x2ZVByb21pc2VXaXRoVGltZW91dDxDbGllbnRCdWlsZE1hbmlmZXN0PihcbiAgICBvbkJ1aWxkTWFuaWZlc3QsXG4gICAgTVNfTUFYX0lETEVfREVMQVksXG4gICAgbWFya0Fzc2V0RXJyb3IobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBjbGllbnQgYnVpbGQgbWFuaWZlc3QnKSlcbiAgKVxufVxuXG5pbnRlcmZhY2UgUm91dGVGaWxlcyB7XG4gIHNjcmlwdHM6IHN0cmluZ1tdXG4gIGNzczogc3RyaW5nW11cbn1cbmZ1bmN0aW9uIGdldEZpbGVzRm9yUm91dGUoXG4gIGFzc2V0UHJlZml4OiBzdHJpbmcsXG4gIHJvdXRlOiBzdHJpbmdcbik6IFByb21pc2U8Um91dGVGaWxlcz4ge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgIHNjcmlwdHM6IFtcbiAgICAgICAgYXNzZXRQcmVmaXggK1xuICAgICAgICAgICcvX25leHQvc3RhdGljL2NodW5rcy9wYWdlcycgK1xuICAgICAgICAgIGVuY29kZVVSSShnZXRBc3NldFBhdGhGcm9tUm91dGUocm91dGUsICcuanMnKSksXG4gICAgICBdLFxuICAgICAgLy8gU3R5bGVzIGFyZSBoYW5kbGVkIGJ5IGBzdHlsZS1sb2FkZXJgIGluIGRldmVsb3BtZW50OlxuICAgICAgY3NzOiBbXSxcbiAgICB9KVxuICB9XG4gIHJldHVybiBnZXRDbGllbnRCdWlsZE1hbmlmZXN0KCkudGhlbigobWFuaWZlc3QpID0+IHtcbiAgICBpZiAoIShyb3V0ZSBpbiBtYW5pZmVzdCkpIHtcbiAgICAgIHRocm93IG1hcmtBc3NldEVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvb2t1cCByb3V0ZTogJHtyb3V0ZX1gKSlcbiAgICB9XG4gICAgY29uc3QgYWxsRmlsZXMgPSBtYW5pZmVzdFtyb3V0ZV0ubWFwKFxuICAgICAgKGVudHJ5KSA9PiBhc3NldFByZWZpeCArICcvX25leHQvJyArIGVuY29kZVVSSShlbnRyeSlcbiAgICApXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcmlwdHM6IGFsbEZpbGVzLmZpbHRlcigodikgPT4gdi5lbmRzV2l0aCgnLmpzJykpLFxuICAgICAgY3NzOiBhbGxGaWxlcy5maWx0ZXIoKHYpID0+IHYuZW5kc1dpdGgoJy5jc3MnKSksXG4gICAgfVxuICB9KVxufVxuXG5mdW5jdGlvbiBjcmVhdGVSb3V0ZUxvYWRlcihhc3NldFByZWZpeDogc3RyaW5nKTogUm91dGVMb2FkZXIge1xuICBjb25zdCBlbnRyeXBvaW50czogTWFwPFxuICAgIHN0cmluZyxcbiAgICBGdXR1cmU8Um91dGVFbnRyeXBvaW50PiB8IFJvdXRlRW50cnlwb2ludFxuICA+ID0gbmV3IE1hcCgpXG4gIGNvbnN0IGxvYWRlZFNjcmlwdHM6IE1hcDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+ID0gbmV3IE1hcCgpXG4gIGNvbnN0IHN0eWxlU2hlZXRzOiBNYXA8c3RyaW5nLCBQcm9taXNlPFJvdXRlU3R5bGVTaGVldD4+ID0gbmV3IE1hcCgpXG4gIGNvbnN0IHJvdXRlczogTWFwPFxuICAgIHN0cmluZyxcbiAgICBGdXR1cmU8Um91dGVMb2FkZXJFbnRyeT4gfCBSb3V0ZUxvYWRlckVudHJ5XG4gID4gPSBuZXcgTWFwKClcblxuICBmdW5jdGlvbiBtYXliZUV4ZWN1dGVTY3JpcHQoc3JjOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBsZXQgcHJvbTogUHJvbWlzZTx1bmtub3duPiB8IHVuZGVmaW5lZCA9IGxvYWRlZFNjcmlwdHMuZ2V0KHNyYylcbiAgICBpZiAocHJvbSkge1xuICAgICAgcmV0dXJuIHByb21cbiAgICB9XG5cbiAgICAvLyBTa2lwIGV4ZWN1dGluZyBzY3JpcHQgaWYgaXQncyBhbHJlYWR5IGluIHRoZSBET006XG4gICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmNePVwiJHtzcmN9XCJdYCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIGxvYWRlZFNjcmlwdHMuc2V0KHNyYywgKHByb20gPSBhcHBlbmRTY3JpcHQoc3JjKSkpXG4gICAgcmV0dXJuIHByb21cbiAgfVxuXG4gIGZ1bmN0aW9uIGZldGNoU3R5bGVTaGVldChocmVmOiBzdHJpbmcpOiBQcm9taXNlPFJvdXRlU3R5bGVTaGVldD4ge1xuICAgIGxldCBwcm9tOiBQcm9taXNlPFJvdXRlU3R5bGVTaGVldD4gfCB1bmRlZmluZWQgPSBzdHlsZVNoZWV0cy5nZXQoaHJlZilcbiAgICBpZiAocHJvbSkge1xuICAgICAgcmV0dXJuIHByb21cbiAgICB9XG5cbiAgICBzdHlsZVNoZWV0cy5zZXQoXG4gICAgICBocmVmLFxuICAgICAgKHByb20gPSBmZXRjaChocmVmKVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgc3R5bGVzaGVldDogJHtocmVmfWApXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMudGV4dCgpLnRoZW4oKHRleHQpID0+ICh7IGhyZWY6IGhyZWYsIGNvbnRlbnQ6IHRleHQgfSkpXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbWFya0Fzc2V0RXJyb3IoZXJyKVxuICAgICAgICB9KSlcbiAgICApXG4gICAgcmV0dXJuIHByb21cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2hlbkVudHJ5cG9pbnQocm91dGU6IHN0cmluZykge1xuICAgICAgcmV0dXJuIHdpdGhGdXR1cmUocm91dGUsIGVudHJ5cG9pbnRzKVxuICAgIH0sXG4gICAgb25FbnRyeXBvaW50KHJvdXRlOiBzdHJpbmcsIGV4ZWN1dGU6ICgpID0+IHVua25vd24pIHtcbiAgICAgIFByb21pc2UucmVzb2x2ZShleGVjdXRlKVxuICAgICAgICAudGhlbigoZm4pID0+IGZuKCkpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChleHBvcnRzOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBjb21wb25lbnQ6IChleHBvcnRzICYmIGV4cG9ydHMuZGVmYXVsdCkgfHwgZXhwb3J0cyxcbiAgICAgICAgICAgIGV4cG9ydHM6IGV4cG9ydHMsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgKGVycikgPT4gKHsgZXJyb3I6IGVyciB9KVxuICAgICAgICApXG4gICAgICAgIC50aGVuKChpbnB1dDogUm91dGVFbnRyeXBvaW50KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2xkID0gZW50cnlwb2ludHMuZ2V0KHJvdXRlKVxuICAgICAgICAgIGVudHJ5cG9pbnRzLnNldChyb3V0ZSwgaW5wdXQpXG4gICAgICAgICAgaWYgKG9sZCAmJiAncmVzb2x2ZScgaW4gb2xkKSBvbGQucmVzb2x2ZShpbnB1dClcbiAgICAgICAgfSlcbiAgICB9LFxuICAgIGxvYWRSb3V0ZShyb3V0ZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gd2l0aEZ1dHVyZTxSb3V0ZUxvYWRlckVudHJ5Pihyb3V0ZSwgcm91dGVzLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBzY3JpcHRzLCBjc3MgfSA9IGF3YWl0IGdldEZpbGVzRm9yUm91dGUoYXNzZXRQcmVmaXgsIHJvdXRlKVxuICAgICAgICAgIGNvbnN0IFssIHN0eWxlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBlbnRyeXBvaW50cy5oYXMocm91dGUpXG4gICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgOiBQcm9taXNlLmFsbChzY3JpcHRzLm1hcChtYXliZUV4ZWN1dGVTY3JpcHQpKSxcbiAgICAgICAgICAgIFByb21pc2UuYWxsKGNzcy5tYXAoZmV0Y2hTdHlsZVNoZWV0KSksXG4gICAgICAgICAgXSBhcyBjb25zdClcblxuICAgICAgICAgIGNvbnN0IGVudHJ5cG9pbnQ6IFJvdXRlRW50cnlwb2ludCA9IGF3YWl0IHJlc29sdmVQcm9taXNlV2l0aFRpbWVvdXQoXG4gICAgICAgICAgICB0aGlzLndoZW5FbnRyeXBvaW50KHJvdXRlKSxcbiAgICAgICAgICAgIE1TX01BWF9JRExFX0RFTEFZLFxuICAgICAgICAgICAgbWFya0Fzc2V0RXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihgUm91dGUgZGlkIG5vdCBjb21wbGV0ZSBsb2FkaW5nOiAke3JvdXRlfWApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgcmVzOiBSb3V0ZUxvYWRlckVudHJ5ID0gT2JqZWN0LmFzc2lnbjxcbiAgICAgICAgICAgIHsgc3R5bGVzOiBSb3V0ZVN0eWxlU2hlZXRbXSB9LFxuICAgICAgICAgICAgUm91dGVFbnRyeXBvaW50XG4gICAgICAgICAgPih7IHN0eWxlcyB9LCBlbnRyeXBvaW50KVxuICAgICAgICAgIHJldHVybiAnZXJyb3InIGluIGVudHJ5cG9pbnQgPyBlbnRyeXBvaW50IDogcmVzXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJldHVybiB7IGVycm9yOiBlcnIgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgcHJlZmV0Y2gocm91dGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZUxhYnMvcXVpY2tsaW5rL2Jsb2IvNDUzYTY2MWZhMWZhOTQwZTJkMmUwNDQ0NTIzOThlMzhjNjdhOThmYi9zcmMvaW5kZXgubWpzI0wxMTUtTDExOFxuICAgICAgLy8gTGljZW5zZTogQXBhY2hlIDIuMFxuICAgICAgbGV0IGNuXG4gICAgICBpZiAoKGNuID0gKG5hdmlnYXRvciBhcyBhbnkpLmNvbm5lY3Rpb24pKSB7XG4gICAgICAgIC8vIERvbid0IHByZWZldGNoIGlmIHVzaW5nIDJHIG9yIGlmIFNhdmUtRGF0YSBpcyBlbmFibGVkLlxuICAgICAgICBpZiAoY24uc2F2ZURhdGEgfHwgLzJnLy50ZXN0KGNuLmVmZmVjdGl2ZVR5cGUpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRGaWxlc0ZvclJvdXRlKGFzc2V0UHJlZml4LCByb3V0ZSlcbiAgICAgICAgLnRoZW4oKG91dHB1dCkgPT5cbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGNhblByZWZldGNoXG4gICAgICAgICAgICAgID8gb3V0cHV0LnNjcmlwdHMubWFwKChzY3JpcHQpID0+IHByZWZldGNoVmlhRG9tKHNjcmlwdCwgJ3NjcmlwdCcpKVxuICAgICAgICAgICAgICA6IFtdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXF1ZXN0SWRsZUNhbGxiYWNrKCgpID0+IHRoaXMubG9hZFJvdXRlKHJvdXRlKSlcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKFxuICAgICAgICAgIC8vIHN3YWxsb3cgcHJlZmV0Y2ggZXJyb3JzXG4gICAgICAgICAgKCkgPT4ge31cbiAgICAgICAgKVxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlUm91dGVMb2FkZXJcbiIsIi8qIGdsb2JhbCB3aW5kb3cgKi9cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBSb3V0ZXIsIHsgTmV4dFJvdXRlciB9IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvcm91dGVyJ1xuaW1wb3J0IHsgUm91dGVyQ29udGV4dCB9IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXItY29udGV4dCdcblxudHlwZSBDbGFzc0FyZ3VtZW50czxUPiA9IFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGluZmVyIFUpID0+IGFueSA/IFUgOiBhbnlcblxudHlwZSBSb3V0ZXJBcmdzID0gQ2xhc3NBcmd1bWVudHM8dHlwZW9mIFJvdXRlcj5cblxudHlwZSBTaW5nbGV0b25Sb3V0ZXJCYXNlID0ge1xuICByb3V0ZXI6IFJvdXRlciB8IG51bGxcbiAgcmVhZHlDYWxsYmFja3M6IEFycmF5PCgpID0+IGFueT5cbiAgcmVhZHkoY2I6ICgpID0+IGFueSk6IHZvaWRcbn1cblxuZXhwb3J0IHsgUm91dGVyLCBOZXh0Um91dGVyIH1cblxuZXhwb3J0IHR5cGUgU2luZ2xldG9uUm91dGVyID0gU2luZ2xldG9uUm91dGVyQmFzZSAmIE5leHRSb3V0ZXJcblxuY29uc3Qgc2luZ2xldG9uUm91dGVyOiBTaW5nbGV0b25Sb3V0ZXJCYXNlID0ge1xuICByb3V0ZXI6IG51bGwsIC8vIGhvbGRzIHRoZSBhY3R1YWwgcm91dGVyIGluc3RhbmNlXG4gIHJlYWR5Q2FsbGJhY2tzOiBbXSxcbiAgcmVhZHkoY2I6ICgpID0+IHZvaWQpIHtcbiAgICBpZiAodGhpcy5yb3V0ZXIpIHJldHVybiBjYigpXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnJlYWR5Q2FsbGJhY2tzLnB1c2goY2IpXG4gICAgfVxuICB9LFxufVxuXG4vLyBDcmVhdGUgcHVibGljIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgdGhlIHJvdXRlciBpbiB0aGUgc2luZ2xldG9uUm91dGVyXG5jb25zdCB1cmxQcm9wZXJ0eUZpZWxkcyA9IFtcbiAgJ3BhdGhuYW1lJyxcbiAgJ3JvdXRlJyxcbiAgJ3F1ZXJ5JyxcbiAgJ2FzUGF0aCcsXG4gICdjb21wb25lbnRzJyxcbiAgJ2lzRmFsbGJhY2snLFxuICAnYmFzZVBhdGgnLFxuICAnbG9jYWxlJyxcbiAgJ2xvY2FsZXMnLFxuICAnZGVmYXVsdExvY2FsZScsXG4gICdpc1JlYWR5JyxcbiAgJ2lzUHJldmlldycsXG4gICdpc0xvY2FsZURvbWFpbicsXG5dXG5jb25zdCByb3V0ZXJFdmVudHMgPSBbXG4gICdyb3V0ZUNoYW5nZVN0YXJ0JyxcbiAgJ2JlZm9yZUhpc3RvcnlDaGFuZ2UnLFxuICAncm91dGVDaGFuZ2VDb21wbGV0ZScsXG4gICdyb3V0ZUNoYW5nZUVycm9yJyxcbiAgJ2hhc2hDaGFuZ2VTdGFydCcsXG4gICdoYXNoQ2hhbmdlQ29tcGxldGUnLFxuXVxuY29uc3QgY29yZU1ldGhvZEZpZWxkcyA9IFtcbiAgJ3B1c2gnLFxuICAncmVwbGFjZScsXG4gICdyZWxvYWQnLFxuICAnYmFjaycsXG4gICdwcmVmZXRjaCcsXG4gICdiZWZvcmVQb3BTdGF0ZScsXG5dXG5cbi8vIEV2ZW50cyBpcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiB0aGUgcm91dGVyLCB0aGUgcm91dGVyIGRvZXNuJ3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCB0byB1c2UgaXRcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaW5nbGV0b25Sb3V0ZXIsICdldmVudHMnLCB7XG4gIGdldCgpIHtcbiAgICByZXR1cm4gUm91dGVyLmV2ZW50c1xuICB9LFxufSlcblxudXJsUHJvcGVydHlGaWVsZHMuZm9yRWFjaCgoZmllbGQ6IHN0cmluZykgPT4ge1xuICAvLyBIZXJlIHdlIG5lZWQgdG8gdXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBiZWNhdXNlLCB3ZSBuZWVkIHRvIHJldHVyblxuICAvLyB0aGUgcHJvcGVydHkgYXNzaWduZWQgdG8gdGhlIGFjdHVhbCByb3V0ZXJcbiAgLy8gVGhlIHZhbHVlIG1pZ2h0IGdldCBjaGFuZ2VkIGFzIHdlIGNoYW5nZSByb3V0ZXMgYW5kIHRoaXMgaXMgdGhlXG4gIC8vIHByb3BlciB3YXkgdG8gYWNjZXNzIGl0XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaW5nbGV0b25Sb3V0ZXIsIGZpZWxkLCB7XG4gICAgZ2V0KCkge1xuICAgICAgY29uc3Qgcm91dGVyID0gZ2V0Um91dGVyKCkgYXMgYW55XG4gICAgICByZXR1cm4gcm91dGVyW2ZpZWxkXSBhcyBzdHJpbmdcbiAgICB9LFxuICB9KVxufSlcblxuY29yZU1ldGhvZEZpZWxkcy5mb3JFYWNoKChmaWVsZDogc3RyaW5nKSA9PiB7XG4gIC8vIFdlIGRvbid0IHJlYWxseSBrbm93IHRoZSB0eXBlcyBoZXJlLCBzbyB3ZSBhZGQgdGhlbSBsYXRlciBpbnN0ZWFkXG4gIDsoc2luZ2xldG9uUm91dGVyIGFzIGFueSlbZmllbGRdID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgY29uc3Qgcm91dGVyID0gZ2V0Um91dGVyKCkgYXMgYW55XG4gICAgcmV0dXJuIHJvdXRlcltmaWVsZF0oLi4uYXJncylcbiAgfVxufSlcblxucm91dGVyRXZlbnRzLmZvckVhY2goKGV2ZW50OiBzdHJpbmcpID0+IHtcbiAgc2luZ2xldG9uUm91dGVyLnJlYWR5KCgpID0+IHtcbiAgICBSb3V0ZXIuZXZlbnRzLm9uKGV2ZW50LCAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgZXZlbnRGaWVsZCA9IGBvbiR7ZXZlbnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtldmVudC5zdWJzdHJpbmcoXG4gICAgICAgIDFcbiAgICAgICl9YFxuICAgICAgY29uc3QgX3NpbmdsZXRvblJvdXRlciA9IHNpbmdsZXRvblJvdXRlciBhcyBhbnlcbiAgICAgIGlmIChfc2luZ2xldG9uUm91dGVyW2V2ZW50RmllbGRdKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX3NpbmdsZXRvblJvdXRlcltldmVudEZpZWxkXSguLi5hcmdzKVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciB3aGVuIHJ1bm5pbmcgdGhlIFJvdXRlciBldmVudDogJHtldmVudEZpZWxkfWApXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgJHtlcnIubWVzc2FnZX1cXG4ke2Vyci5zdGFja31gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn0pXG5cbmZ1bmN0aW9uIGdldFJvdXRlcigpOiBSb3V0ZXIge1xuICBpZiAoIXNpbmdsZXRvblJvdXRlci5yb3V0ZXIpIHtcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICdObyByb3V0ZXIgaW5zdGFuY2UgZm91bmQuXFxuJyArXG4gICAgICAnWW91IHNob3VsZCBvbmx5IHVzZSBcIm5leHQvcm91dGVyXCIgaW5zaWRlIHRoZSBjbGllbnQgc2lkZSBvZiB5b3VyIGFwcC5cXG4nXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gIH1cbiAgcmV0dXJuIHNpbmdsZXRvblJvdXRlci5yb3V0ZXJcbn1cblxuLy8gRXhwb3J0IHRoZSBzaW5nbGV0b25Sb3V0ZXIgYW5kIHRoaXMgaXMgdGhlIHB1YmxpYyBBUEkuXG5leHBvcnQgZGVmYXVsdCBzaW5nbGV0b25Sb3V0ZXIgYXMgU2luZ2xldG9uUm91dGVyXG5cbi8vIFJlZXhwb3J0IHRoZSB3aXRoUm91dGUgSE9DXG5leHBvcnQgeyBkZWZhdWx0IGFzIHdpdGhSb3V0ZXIgfSBmcm9tICcuL3dpdGgtcm91dGVyJ1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlUm91dGVyKCk6IE5leHRSb3V0ZXIge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChSb3V0ZXJDb250ZXh0KVxufVxuXG4vLyBJTlRFUk5BTCBBUElTXG4vLyAtLS0tLS0tLS0tLS0tXG4vLyAoZG8gbm90IHVzZSBmb2xsb3dpbmcgZXhwb3J0cyBpbnNpZGUgdGhlIGFwcClcblxuLy8gQ3JlYXRlIGEgcm91dGVyIGFuZCBhc3NpZ24gaXQgYXMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS5cbi8vIFRoaXMgaXMgdXNlZCBpbiBjbGllbnQgc2lkZSB3aGVuIHdlIGFyZSBpbml0aWxpemluZyB0aGUgYXBwLlxuLy8gVGhpcyBzaG91bGQgKipub3QqKiB1c2UgaW5zaWRlIHRoZSBzZXJ2ZXIuXG5leHBvcnQgY29uc3QgY3JlYXRlUm91dGVyID0gKC4uLmFyZ3M6IFJvdXRlckFyZ3MpOiBSb3V0ZXIgPT4ge1xuICBzaW5nbGV0b25Sb3V0ZXIucm91dGVyID0gbmV3IFJvdXRlciguLi5hcmdzKVxuICBzaW5nbGV0b25Sb3V0ZXIucmVhZHlDYWxsYmFja3MuZm9yRWFjaCgoY2IpID0+IGNiKCkpXG4gIHNpbmdsZXRvblJvdXRlci5yZWFkeUNhbGxiYWNrcyA9IFtdXG5cbiAgcmV0dXJuIHNpbmdsZXRvblJvdXRlci5yb3V0ZXJcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgYHdpdGhSb3V0ZXJgIHJvdXRlciBpbnN0YW5jZVxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQdWJsaWNSb3V0ZXJJbnN0YW5jZShyb3V0ZXI6IFJvdXRlcik6IE5leHRSb3V0ZXIge1xuICBjb25zdCBfcm91dGVyID0gcm91dGVyIGFzIGFueVxuICBjb25zdCBpbnN0YW5jZSA9IHt9IGFzIGFueVxuXG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdXJsUHJvcGVydHlGaWVsZHMpIHtcbiAgICBpZiAodHlwZW9mIF9yb3V0ZXJbcHJvcGVydHldID09PSAnb2JqZWN0Jykge1xuICAgICAgaW5zdGFuY2VbcHJvcGVydHldID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgQXJyYXkuaXNBcnJheShfcm91dGVyW3Byb3BlcnR5XSkgPyBbXSA6IHt9LFxuICAgICAgICBfcm91dGVyW3Byb3BlcnR5XVxuICAgICAgKSAvLyBtYWtlcyBzdXJlIHF1ZXJ5IGlzIG5vdCBzdGF0ZWZ1bFxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpbnN0YW5jZVtwcm9wZXJ0eV0gPSBfcm91dGVyW3Byb3BlcnR5XVxuICB9XG5cbiAgLy8gRXZlbnRzIGlzIGEgc3RhdGljIHByb3BlcnR5IG9uIHRoZSByb3V0ZXIsIHRoZSByb3V0ZXIgZG9lc24ndCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIHRvIHVzZSBpdFxuICBpbnN0YW5jZS5ldmVudHMgPSBSb3V0ZXIuZXZlbnRzXG5cbiAgY29yZU1ldGhvZEZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgIGluc3RhbmNlW2ZpZWxkXSA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgcmV0dXJuIF9yb3V0ZXJbZmllbGRdKC4uLmFyZ3MpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBpbnN0YW5jZVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTmV4dENvbXBvbmVudFR5cGUsIE5leHRQYWdlQ29udGV4dCB9IGZyb20gJy4uL25leHQtc2VydmVyL2xpYi91dGlscydcbmltcG9ydCB7IE5leHRSb3V0ZXIsIHVzZVJvdXRlciB9IGZyb20gJy4vcm91dGVyJ1xuXG5leHBvcnQgdHlwZSBXaXRoUm91dGVyUHJvcHMgPSB7XG4gIHJvdXRlcjogTmV4dFJvdXRlclxufVxuXG5leHBvcnQgdHlwZSBFeGNsdWRlUm91dGVyUHJvcHM8UD4gPSBQaWNrPFxuICBQLFxuICBFeGNsdWRlPGtleW9mIFAsIGtleW9mIFdpdGhSb3V0ZXJQcm9wcz5cbj5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gd2l0aFJvdXRlcjxcbiAgUCBleHRlbmRzIFdpdGhSb3V0ZXJQcm9wcyxcbiAgQyA9IE5leHRQYWdlQ29udGV4dFxuPihcbiAgQ29tcG9zZWRDb21wb25lbnQ6IE5leHRDb21wb25lbnRUeXBlPEMsIGFueSwgUD5cbik6IFJlYWN0LkNvbXBvbmVudFR5cGU8RXhjbHVkZVJvdXRlclByb3BzPFA+PiB7XG4gIGZ1bmN0aW9uIFdpdGhSb3V0ZXJXcmFwcGVyKHByb3BzOiBhbnkpOiBKU1guRWxlbWVudCB7XG4gICAgcmV0dXJuIDxDb21wb3NlZENvbXBvbmVudCByb3V0ZXI9e3VzZVJvdXRlcigpfSB7Li4ucHJvcHN9IC8+XG4gIH1cblxuICBXaXRoUm91dGVyV3JhcHBlci5nZXRJbml0aWFsUHJvcHMgPSBDb21wb3NlZENvbXBvbmVudC5nZXRJbml0aWFsUHJvcHNcbiAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgY2hlY2tpbmcgZm9yIGN1c3RvbSBnZXRJbml0aWFsUHJvcHMgaW4gX2FwcFxuICA7KFdpdGhSb3V0ZXJXcmFwcGVyIGFzIGFueSkub3JpZ0dldEluaXRpYWxQcm9wcyA9IChDb21wb3NlZENvbXBvbmVudCBhcyBhbnkpLm9yaWdHZXRJbml0aWFsUHJvcHNcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBjb25zdCBuYW1lID1cbiAgICAgIENvbXBvc2VkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvc2VkQ29tcG9uZW50Lm5hbWUgfHwgJ1Vua25vd24nXG4gICAgV2l0aFJvdXRlcldyYXBwZXIuZGlzcGxheU5hbWUgPSBgd2l0aFJvdXRlcigke25hbWV9KWBcbiAgfVxuXG4gIHJldHVybiBXaXRoUm91dGVyV3JhcHBlclxufVxuIiwibW9kdWxlLmV4cG9ydHM9KCgpPT57XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9ezE2MTplPT57ZS5leHBvcnRzPSgoe29ubHlGaXJzdDplPWZhbHNlfT17fSk9Pntjb25zdCByPVtcIltcXFxcdTAwMUJcXFxcdTAwOUJdW1tcXFxcXSgpIzs/XSooPzooPzooPzpbYS16QS1aXFxcXGRdKig/OjtbLWEtekEtWlxcXFxkXFxcXC8jJi46PT8lQH5fXSopKik/XFxcXHUwMDA3KVwiLFwiKD86KD86XFxcXGR7MSw0fSg/OjtcXFxcZHswLDR9KSopP1tcXFxcZEEtUFItVFpjZi1udHFyeT0+PH5dKSlcIl0uam9pbihcInxcIik7cmV0dXJuIG5ldyBSZWdFeHAocixlP3VuZGVmaW5lZDpcImdcIil9KX0sMzAxOihlLHIsdCk9Pntjb25zdCBfPXQoMTYxKTtlLmV4cG9ydHM9KGU9PnR5cGVvZiBlPT09XCJzdHJpbmdcIj9lLnJlcGxhY2UoXygpLFwiXCIpOmUpfX07dmFyIHI9e307ZnVuY3Rpb24gX19uY2N3cGNrX3JlcXVpcmVfXyh0KXtpZihyW3RdKXtyZXR1cm4gclt0XS5leHBvcnRzfXZhciBfPXJbdF09e2V4cG9ydHM6e319O3ZhciBuPXRydWU7dHJ5e2VbdF0oXyxfLmV4cG9ydHMsX19uY2N3cGNrX3JlcXVpcmVfXyk7bj1mYWxzZX1maW5hbGx5e2lmKG4pZGVsZXRlIHJbdF19cmV0dXJuIF8uZXhwb3J0c31fX25jY3dwY2tfcmVxdWlyZV9fLmFiPV9fZGlybmFtZStcIi9cIjtyZXR1cm4gX19uY2N3cGNrX3JlcXVpcmVfXygzMDEpfSkoKTsiLCJtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0PXs1OTk6ZnVuY3Rpb24odCxlKXshZnVuY3Rpb24odCxuKXt0cnVlP24oZSk6MH0odGhpcyxmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZSxuLGk9ZnVuY3Rpb24oKXtyZXR1cm5cIlwiLmNvbmNhdChEYXRlLm5vdygpLFwiLVwiKS5jb25jYXQoTWF0aC5mbG9vcig4OTk5OTk5OTk5OTk5Kk1hdGgucmFuZG9tKCkpKzFlMTIpfSxhPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTotMTtyZXR1cm57bmFtZTp0LHZhbHVlOmUsZGVsdGE6MCxlbnRyaWVzOltdLGlkOmkoKSxpc0ZpbmFsOiExfX0scj1mdW5jdGlvbih0LGUpe3RyeXtpZihQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMuaW5jbHVkZXModCkpe3ZhciBuPW5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEVudHJpZXMoKS5tYXAoZSl9KTtyZXR1cm4gbi5vYnNlcnZlKHt0eXBlOnQsYnVmZmVyZWQ6ITB9KSxufX1jYXRjaCh0KXt9fSxvPSExLHU9ITEscz1mdW5jdGlvbih0KXtvPSF0LnBlcnNpc3RlZH0sYz1mdW5jdGlvbigpe2FkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLHMpLGFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIixmdW5jdGlvbigpe30pfSxwPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV07dXx8KGMoKSx1PSEwKSxhZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGltZVN0YW1wO1wiaGlkZGVuXCI9PT1kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUmJnQoe3RpbWVTdGFtcDpuLGlzVW5sb2FkaW5nOm99KX0se2NhcHR1cmU6ITAsb25jZTplfSl9LGw9ZnVuY3Rpb24odCxlLG4saSl7dmFyIGE7cmV0dXJuIGZ1bmN0aW9uKCl7biYmZS5pc0ZpbmFsJiZuLmRpc2Nvbm5lY3QoKSxlLnZhbHVlPj0wJiYoaXx8ZS5pc0ZpbmFsfHxcImhpZGRlblwiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlKSYmKGUuZGVsdGE9ZS52YWx1ZS0oYXx8MCksKGUuZGVsdGF8fGUuaXNGaW5hbHx8dm9pZCAwPT09YSkmJih0KGUpLGE9ZS52YWx1ZSkpfX0sZj1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1cImhpZGRlblwiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlPzA6MS8wLHAoZnVuY3Rpb24odCl7dmFyIG49dC50aW1lU3RhbXA7cmV0dXJuIGU9bn0sITApKSx7Z2V0IHRpbWVTdGFtcCgpe3JldHVybiBlfX19LGQ9ZnVuY3Rpb24oKXtyZXR1cm4gbnx8KG49bmV3IFByb21pc2UoZnVuY3Rpb24odCl7cmV0dXJuW1wic2Nyb2xsXCIsXCJrZXlkb3duXCIsXCJwb2ludGVyZG93blwiXS5tYXAoZnVuY3Rpb24oZSl7YWRkRXZlbnRMaXN0ZW5lcihlLHQse29uY2U6ITAscGFzc2l2ZTohMCxjYXB0dXJlOiEwfSl9KX0pKSxufTt0LmdldENMUz1mdW5jdGlvbih0KXt2YXIgZSxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT1hKFwiQ0xTXCIsMCksbz1mdW5jdGlvbih0KXt0LmhhZFJlY2VudElucHV0fHwoaS52YWx1ZSs9dC52YWx1ZSxpLmVudHJpZXMucHVzaCh0KSxlKCkpfSx1PXIoXCJsYXlvdXQtc2hpZnRcIixvKTt1JiYoZT1sKHQsaSx1LG4pLHAoZnVuY3Rpb24odCl7dmFyIG49dC5pc1VubG9hZGluZzt1LnRha2VSZWNvcmRzKCkubWFwKG8pLG4mJihpLmlzRmluYWw9ITApLGUoKX0pKX0sdC5nZXRGQ1A9ZnVuY3Rpb24odCl7dmFyIGUsbj1hKFwiRkNQXCIpLGk9ZigpLG89cihcInBhaW50XCIsZnVuY3Rpb24odCl7XCJmaXJzdC1jb250ZW50ZnVsLXBhaW50XCI9PT10Lm5hbWUmJnQuc3RhcnRUaW1lPGkudGltZVN0YW1wJiYobi52YWx1ZT10LnN0YXJ0VGltZSxuLmlzRmluYWw9ITAsbi5lbnRyaWVzLnB1c2godCksZSgpKX0pO28mJihlPWwodCxuLG8pKX0sdC5nZXRGSUQ9ZnVuY3Rpb24odCl7dmFyIGU9YShcIkZJRFwiKSxuPWYoKSxpPWZ1bmN0aW9uKHQpe3Quc3RhcnRUaW1lPG4udGltZVN0YW1wJiYoZS52YWx1ZT10LnByb2Nlc3NpbmdTdGFydC10LnN0YXJ0VGltZSxlLmVudHJpZXMucHVzaCh0KSxlLmlzRmluYWw9ITAsdSgpKX0sbz1yKFwiZmlyc3QtaW5wdXRcIixpKSx1PWwodCxlLG8pO28/cChmdW5jdGlvbigpe28udGFrZVJlY29yZHMoKS5tYXAoaSksby5kaXNjb25uZWN0KCl9LCEwKTp3aW5kb3cucGVyZk1ldHJpY3MmJndpbmRvdy5wZXJmTWV0cmljcy5vbkZpcnN0SW5wdXREZWxheSYmd2luZG93LnBlcmZNZXRyaWNzLm9uRmlyc3RJbnB1dERlbGF5KGZ1bmN0aW9uKHQsaSl7aS50aW1lU3RhbXA8bi50aW1lU3RhbXAmJihlLnZhbHVlPXQsZS5pc0ZpbmFsPSEwLGUuZW50cmllcz1be2VudHJ5VHlwZTpcImZpcnN0LWlucHV0XCIsbmFtZTppLnR5cGUsdGFyZ2V0OmkudGFyZ2V0LGNhbmNlbGFibGU6aS5jYW5jZWxhYmxlLHN0YXJ0VGltZTppLnRpbWVTdGFtcCxwcm9jZXNzaW5nU3RhcnQ6aS50aW1lU3RhbXArdH1dLHUoKSl9KX0sdC5nZXRMQ1A9ZnVuY3Rpb24odCl7dmFyIGUsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9YShcIkxDUFwiKSxvPWYoKSx1PWZ1bmN0aW9uKHQpe3ZhciBuPXQuc3RhcnRUaW1lO248by50aW1lU3RhbXA/KGkudmFsdWU9bixpLmVudHJpZXMucHVzaCh0KSk6aS5pc0ZpbmFsPSEwLGUoKX0scz1yKFwibGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50XCIsdSk7aWYocyl7ZT1sKHQsaSxzLG4pO3ZhciBjPWZ1bmN0aW9uKCl7aS5pc0ZpbmFsfHwocy50YWtlUmVjb3JkcygpLm1hcCh1KSxpLmlzRmluYWw9ITAsZSgpKX07ZCgpLnRoZW4oYykscChjLCEwKX19LHQuZ2V0VFRGQj1mdW5jdGlvbih0KXt2YXIgZSxuPWEoXCJUVEZCXCIpO2U9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9cGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShcIm5hdmlnYXRpb25cIilbMF18fGZ1bmN0aW9uKCl7dmFyIHQ9cGVyZm9ybWFuY2UudGltaW5nLGU9e2VudHJ5VHlwZTpcIm5hdmlnYXRpb25cIixzdGFydFRpbWU6MH07Zm9yKHZhciBuIGluIHQpXCJuYXZpZ2F0aW9uU3RhcnRcIiE9PW4mJlwidG9KU09OXCIhPT1uJiYoZVtuXT1NYXRoLm1heCh0W25dLXQubmF2aWdhdGlvblN0YXJ0LDApKTtyZXR1cm4gZX0oKTtuLnZhbHVlPW4uZGVsdGE9ZS5yZXNwb25zZVN0YXJ0LG4uZW50cmllcz1bZV0sbi5pc0ZpbmFsPSEwLHQobil9Y2F0Y2godCl7fX0sXCJjb21wbGV0ZVwiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KGUsMCk6YWRkRXZlbnRMaXN0ZW5lcihcInBhZ2VzaG93XCIsZSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSl9fTt2YXIgZT17fTtmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG4pe2lmKGVbbl0pe3JldHVybiBlW25dLmV4cG9ydHN9dmFyIGk9ZVtuXT17ZXhwb3J0czp7fX07dmFyIGE9dHJ1ZTt0cnl7dFtuXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxfX25jY3dwY2tfcmVxdWlyZV9fKTthPWZhbHNlfWZpbmFsbHl7aWYoYSlkZWxldGUgZVtuXX1yZXR1cm4gaS5leHBvcnRzfV9fbmNjd3Bja19yZXF1aXJlX18uYWI9X19kaXJuYW1lK1wiL1wiO3JldHVybiBfX25jY3dwY2tfcmVxdWlyZV9fKDU5OSl9KCk7IiwibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gMTQ5OlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG52YXIgZztcblxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcbmcgPSAoZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzO1xufSkoKTtcblxudHJ5IHtcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXG5cdGcgPSBnIHx8IG5ldyBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XG59IGNhdGNoIChlKSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgdGhlIHdpbmRvdyByZWZlcmVuY2UgaXMgYXZhaWxhYmxlXG5cdGlmICh0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKSBnID0gd2luZG93O1xufVxuXG4vLyBnIGNhbiBzdGlsbCBiZSB1bmRlZmluZWQsIGJ1dCBub3RoaW5nIHRvIGRvIGFib3V0IGl0Li4uXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xuLy8gZWFzaWVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuIGlmKCFnbG9iYWwpIHsgLi4ufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGc7XG5cblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX19uY2N3cGNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHR2YXIgdGhyZXcgPSB0cnVlO1xuLyoqKioqKi8gXHRcdHRyeSB7XG4vKioqKioqLyBcdFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX25jY3dwY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovIFx0XHRcdHRocmV3ID0gZmFsc2U7XG4vKioqKioqLyBcdFx0fSBmaW5hbGx5IHtcbi8qKioqKiovIFx0XHRcdGlmKHRocmV3KSBkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCAqL1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0X19uY2N3cGNrX3JlcXVpcmVfXy5hYiA9IF9fZGlybmFtZSArIFwiL1wiOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX25jY3dwY2tfcmVxdWlyZV9fKDE0OSk7XG4vKioqKioqLyB9KSgpXG47IiwibW9kdWxlLmV4cG9ydHMgPVxuLyoqKioqKi8gKGZ1bmN0aW9uKCkgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlc19fID0gKHtcblxuLyoqKi8gODgwOlxuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSkge1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG5cblxuLyoqKi8gfSlcblxuLyoqKioqKi8gXHR9KTtcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX19uY2N3cGNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge31cbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHR2YXIgdGhyZXcgPSB0cnVlO1xuLyoqKioqKi8gXHRcdHRyeSB7XG4vKioqKioqLyBcdFx0XHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX25jY3dwY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovIFx0XHRcdHRocmV3ID0gZmFsc2U7XG4vKioqKioqLyBcdFx0fSBmaW5hbGx5IHtcbi8qKioqKiovIFx0XHRcdGlmKHRocmV3KSBkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqLyBcdFxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Lyogd2VicGFjay9ydW50aW1lL2NvbXBhdCAqL1xuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0X19uY2N3cGNrX3JlcXVpcmVfXy5hYiA9IF9fZGlybmFtZSArIFwiL1wiOy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8vIG1vZHVsZSBleHBvcnRzIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBydW50aW1lIHNvIGVudHJ5IGlubGluaW5nIGlzIGRpc2FibGVkXG4vKioqKioqLyBcdC8vIHN0YXJ0dXBcbi8qKioqKiovIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vKioqKioqLyBcdHJldHVybiBfX25jY3dwY2tfcmVxdWlyZV9fKDg4MCk7XG4vKioqKioqLyB9KSgpXG47IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgY29uc3QgSGVhZE1hbmFnZXJDb250ZXh0OiBSZWFjdC5Db250ZXh0PHtcbiAgdXBkYXRlSGVhZD86IChzdGF0ZTogYW55KSA9PiB2b2lkXG4gIG1vdW50ZWRJbnN0YW5jZXM/OiBhbnlcbiAgdXBkYXRlU2NyaXB0cz86IChzdGF0ZTogYW55KSA9PiB2b2lkXG4gIHNjcmlwdHM/OiBhbnlcbn0+ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSlcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGVhZE1hbmFnZXJDb250ZXh0LmRpc3BsYXlOYW1lID0gJ0hlYWRNYW5hZ2VyQ29udGV4dCdcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMb2NhbGVQYXRoKFxuICBwYXRobmFtZTogc3RyaW5nLFxuICBsb2NhbGVzPzogc3RyaW5nW11cbik6IHtcbiAgZGV0ZWN0ZWRMb2NhbGU/OiBzdHJpbmdcbiAgcGF0aG5hbWU6IHN0cmluZ1xufSB7XG4gIGxldCBkZXRlY3RlZExvY2FsZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIC8vIGZpcnN0IGl0ZW0gd2lsbCBiZSBlbXB0eSBzdHJpbmcgZnJvbSBzcGxpdHRpbmcgYXQgZmlyc3QgY2hhclxuICBjb25zdCBwYXRobmFtZVBhcnRzID0gcGF0aG5hbWUuc3BsaXQoJy8nKVxuXG4gIDsobG9jYWxlcyB8fCBbXSkuc29tZSgobG9jYWxlKSA9PiB7XG4gICAgaWYgKHBhdGhuYW1lUGFydHNbMV0udG9Mb3dlckNhc2UoKSA9PT0gbG9jYWxlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGRldGVjdGVkTG9jYWxlID0gbG9jYWxlXG4gICAgICBwYXRobmFtZVBhcnRzLnNwbGljZSgxLCAxKVxuICAgICAgcGF0aG5hbWUgPSBwYXRobmFtZVBhcnRzLmpvaW4oJy8nKSB8fCAnLydcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWUsXG4gICAgZGV0ZWN0ZWRMb2NhbGUsXG4gIH1cbn1cbiIsIi8qXG5NSVQgTGljZW5zZVxuXG5Db3B5cmlnaHQgKGMpIEphc29uIE1pbGxlciAoaHR0cHM6Ly9qYXNvbmZvcm1hdC5jb20vKVxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4qL1xuXG4vLyBUaGlzIGZpbGUgaXMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2RldmVsb3BpdC9taXR0L2Jsb2IvdjEuMS4zL3NyYy9pbmRleC5qc1xuLy8gSXQncyBiZWVuIGVkaXRlZCBmb3IgdGhlIG5lZWRzIG9mIHRoaXMgc2NyaXB0XG4vLyBTZWUgdGhlIExJQ0VOU0UgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZVxuXG50eXBlIEhhbmRsZXIgPSAoLi4uZXZ0czogYW55W10pID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgTWl0dEVtaXR0ZXIgPSB7XG4gIG9uKHR5cGU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IHZvaWRcbiAgb2ZmKHR5cGU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcik6IHZvaWRcbiAgZW1pdCh0eXBlOiBzdHJpbmcsIC4uLmV2dHM6IGFueVtdKTogdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtaXR0KCk6IE1pdHRFbWl0dGVyIHtcbiAgY29uc3QgYWxsOiB7IFtzOiBzdHJpbmddOiBIYW5kbGVyW10gfSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICByZXR1cm4ge1xuICAgIG9uKHR5cGU6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcikge1xuICAgICAgOyhhbGxbdHlwZV0gfHwgKGFsbFt0eXBlXSA9IFtdKSkucHVzaChoYW5kbGVyKVxuICAgIH0sXG5cbiAgICBvZmYodHlwZTogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyKSB7XG4gICAgICBpZiAoYWxsW3R5cGVdKSB7XG4gICAgICAgIGFsbFt0eXBlXS5zcGxpY2UoYWxsW3R5cGVdLmluZGV4T2YoaGFuZGxlcikgPj4+IDAsIDEpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGVtaXQodHlwZTogc3RyaW5nLCAuLi5ldnRzOiBhbnlbXSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGFycmF5LWNhbGxiYWNrLXJldHVyblxuICAgICAgOyhhbGxbdHlwZV0gfHwgW10pLnNsaWNlKCkubWFwKChoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICAgIGhhbmRsZXIoLi4uZXZ0cylcbiAgICAgIH0pXG4gICAgfSxcbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTmV4dFJvdXRlciB9IGZyb20gJy4vcm91dGVyL3JvdXRlcidcblxuZXhwb3J0IGNvbnN0IFJvdXRlckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PE5leHRSb3V0ZXI+KG51bGwgYXMgYW55KVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBSb3V0ZXJDb250ZXh0LmRpc3BsYXlOYW1lID0gJ1JvdXRlckNvbnRleHQnXG59XG4iLCIvKiBnbG9iYWwgX19ORVhUX0RBVEFfXyAqL1xuLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc29sZVxuaW1wb3J0IHsgUGFyc2VkVXJsUXVlcnkgfSBmcm9tICdxdWVyeXN0cmluZydcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFVybE9iamVjdCB9IGZyb20gJ3VybCdcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoLFxuICByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaCxcbn0gZnJvbSAnLi4vLi4vLi4vY2xpZW50L25vcm1hbGl6ZS10cmFpbGluZy1zbGFzaCdcbmltcG9ydCB7IEdvb2RQYWdlQ2FjaGUsIFN0eWxlU2hlZXRUdXBsZSB9IGZyb20gJy4uLy4uLy4uL2NsaWVudC9wYWdlLWxvYWRlcidcbmltcG9ydCB7XG4gIGdldENsaWVudEJ1aWxkTWFuaWZlc3QsXG4gIGlzQXNzZXRFcnJvcixcbiAgbWFya0Fzc2V0RXJyb3IsXG59IGZyb20gJy4uLy4uLy4uL2NsaWVudC9yb3V0ZS1sb2FkZXInXG5pbXBvcnQgeyBEb21haW5Mb2NhbGVzIH0gZnJvbSAnLi4vLi4vc2VydmVyL2NvbmZpZydcbmltcG9ydCB7IGRlbm9ybWFsaXplUGFnZVBhdGggfSBmcm9tICcuLi8uLi9zZXJ2ZXIvZGVub3JtYWxpemUtcGFnZS1wYXRoJ1xuaW1wb3J0IHsgbm9ybWFsaXplTG9jYWxlUGF0aCB9IGZyb20gJy4uL2kxOG4vbm9ybWFsaXplLWxvY2FsZS1wYXRoJ1xuaW1wb3J0IG1pdHQsIHsgTWl0dEVtaXR0ZXIgfSBmcm9tICcuLi9taXR0J1xuaW1wb3J0IHtcbiAgQXBwQ29udGV4dFR5cGUsXG4gIGZvcm1hdFdpdGhWYWxpZGF0aW9uLFxuICBnZXRMb2NhdGlvbk9yaWdpbixcbiAgZ2V0VVJMLFxuICBsb2FkR2V0SW5pdGlhbFByb3BzLFxuICBOZXh0UGFnZUNvbnRleHQsXG4gIFNULFxuICBORVhUX0RBVEEsXG59IGZyb20gJy4uL3V0aWxzJ1xuaW1wb3J0IHsgaXNEeW5hbWljUm91dGUgfSBmcm9tICcuL3V0aWxzL2lzLWR5bmFtaWMnXG5pbXBvcnQgeyBwYXJzZVJlbGF0aXZlVXJsIH0gZnJvbSAnLi91dGlscy9wYXJzZS1yZWxhdGl2ZS11cmwnXG5pbXBvcnQgeyBzZWFyY2hQYXJhbXNUb1VybFF1ZXJ5IH0gZnJvbSAnLi91dGlscy9xdWVyeXN0cmluZydcbmltcG9ydCByZXNvbHZlUmV3cml0ZXMgZnJvbSAnLi91dGlscy9yZXNvbHZlLXJld3JpdGVzJ1xuaW1wb3J0IHsgZ2V0Um91dGVNYXRjaGVyIH0gZnJvbSAnLi91dGlscy9yb3V0ZS1tYXRjaGVyJ1xuaW1wb3J0IHsgZ2V0Um91dGVSZWdleCB9IGZyb20gJy4vdXRpbHMvcm91dGUtcmVnZXgnXG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgLyogcHJvZCAqL1xuICAgIF9fTkVYVF9EQVRBX186IE5FWFRfREFUQVxuICB9XG59XG5cbmludGVyZmFjZSBSb3V0ZVByb3BlcnRpZXMge1xuICBzaGFsbG93OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBUcmFuc2l0aW9uT3B0aW9ucyB7XG4gIHNoYWxsb3c/OiBib29sZWFuXG4gIGxvY2FsZT86IHN0cmluZyB8IGZhbHNlXG4gIHNjcm9sbD86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIE5leHRIaXN0b3J5U3RhdGUge1xuICB1cmw6IHN0cmluZ1xuICBhczogc3RyaW5nXG4gIG9wdGlvbnM6IFRyYW5zaXRpb25PcHRpb25zXG59XG5cbnR5cGUgSGlzdG9yeVN0YXRlID1cbiAgfCBudWxsXG4gIHwgeyBfX046IGZhbHNlIH1cbiAgfCAoeyBfX046IHRydWU7IGlkeDogbnVtYmVyIH0gJiBOZXh0SGlzdG9yeVN0YXRlKVxuXG5sZXQgZGV0ZWN0RG9tYWluTG9jYWxlOiB0eXBlb2YgaW1wb3J0KCcuLi9pMThuL2RldGVjdC1kb21haW4tbG9jYWxlJykuZGV0ZWN0RG9tYWluTG9jYWxlXG5cbmlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gIGRldGVjdERvbWFpbkxvY2FsZSA9IHJlcXVpcmUoJy4uL2kxOG4vZGV0ZWN0LWRvbWFpbi1sb2NhbGUnKVxuICAgIC5kZXRlY3REb21haW5Mb2NhbGVcbn1cblxuY29uc3QgYmFzZVBhdGggPSAocHJvY2Vzcy5lbnYuX19ORVhUX1JPVVRFUl9CQVNFUEFUSCBhcyBzdHJpbmcpIHx8ICcnXG5cbmZ1bmN0aW9uIGJ1aWxkQ2FuY2VsbGF0aW9uRXJyb3IoKSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcignUm91dGUgQ2FuY2VsbGVkJyksIHtcbiAgICBjYW5jZWxsZWQ6IHRydWUsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGFkZFBhdGhQcmVmaXgocGF0aDogc3RyaW5nLCBwcmVmaXg/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHByZWZpeCAmJiBwYXRoLnN0YXJ0c1dpdGgoJy8nKVxuICAgID8gcGF0aCA9PT0gJy8nXG4gICAgICA/IG5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoKHByZWZpeClcbiAgICAgIDogYCR7cHJlZml4fSR7cGF0aE5vUXVlcnlIYXNoKHBhdGgpID09PSAnLycgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGh9YFxuICAgIDogcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tYWluTG9jYWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIGxvY2FsZT86IHN0cmluZyB8IGZhbHNlLFxuICBsb2NhbGVzPzogc3RyaW5nW10sXG4gIGRvbWFpbkxvY2FsZXM/OiBEb21haW5Mb2NhbGVzXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgICBsb2NhbGUgPSBsb2NhbGUgfHwgbm9ybWFsaXplTG9jYWxlUGF0aChwYXRoLCBsb2NhbGVzKS5kZXRlY3RlZExvY2FsZVxuXG4gICAgY29uc3QgZGV0ZWN0ZWREb21haW4gPSBkZXRlY3REb21haW5Mb2NhbGUoZG9tYWluTG9jYWxlcywgdW5kZWZpbmVkLCBsb2NhbGUpXG5cbiAgICBpZiAoZGV0ZWN0ZWREb21haW4pIHtcbiAgICAgIHJldHVybiBgaHR0cCR7ZGV0ZWN0ZWREb21haW4uaHR0cCA/ICcnIDogJ3MnfTovLyR7ZGV0ZWN0ZWREb21haW4uZG9tYWlufSR7XG4gICAgICAgIGJhc2VQYXRoIHx8ICcnXG4gICAgICB9JHtsb2NhbGUgPT09IGRldGVjdGVkRG9tYWluLmRlZmF1bHRMb2NhbGUgPyAnJyA6IGAvJHtsb2NhbGV9YH0ke3BhdGh9YFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9jYWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIGxvY2FsZT86IHN0cmluZyB8IGZhbHNlLFxuICBkZWZhdWx0TG9jYWxlPzogc3RyaW5nXG4pIHtcbiAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgICByZXR1cm4gbG9jYWxlICYmXG4gICAgICBsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUgJiZcbiAgICAgICFwYXRoLnN0YXJ0c1dpdGgoJy8nICsgbG9jYWxlICsgJy8nKSAmJlxuICAgICAgcGF0aCAhPT0gJy8nICsgbG9jYWxlXG4gICAgICA/IGFkZFBhdGhQcmVmaXgocGF0aCwgJy8nICsgbG9jYWxlKVxuICAgICAgOiBwYXRoXG4gIH1cbiAgcmV0dXJuIHBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbExvY2FsZShwYXRoOiBzdHJpbmcsIGxvY2FsZT86IHN0cmluZykge1xuICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgIHJldHVybiBsb2NhbGUgJiZcbiAgICAgIChwYXRoLnN0YXJ0c1dpdGgoJy8nICsgbG9jYWxlICsgJy8nKSB8fCBwYXRoID09PSAnLycgKyBsb2NhbGUpXG4gICAgICA/IHBhdGguc3Vic3RyKGxvY2FsZS5sZW5ndGggKyAxKSB8fCAnLydcbiAgICAgIDogcGF0aFxuICB9XG4gIHJldHVybiBwYXRoXG59XG5cbmZ1bmN0aW9uIHBhdGhOb1F1ZXJ5SGFzaChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IHBhdGguaW5kZXhPZignPycpXG4gIGNvbnN0IGhhc2hJbmRleCA9IHBhdGguaW5kZXhPZignIycpXG5cbiAgaWYgKHF1ZXJ5SW5kZXggPiAtMSB8fCBoYXNoSW5kZXggPiAtMSkge1xuICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZygwLCBxdWVyeUluZGV4ID4gLTEgPyBxdWVyeUluZGV4IDogaGFzaEluZGV4KVxuICB9XG4gIHJldHVybiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNCYXNlUGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcGF0aCA9IHBhdGhOb1F1ZXJ5SGFzaChwYXRoKVxuICByZXR1cm4gcGF0aCA9PT0gYmFzZVBhdGggfHwgcGF0aC5zdGFydHNXaXRoKGJhc2VQYXRoICsgJy8nKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkQmFzZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gd2Ugb25seSBhZGQgdGhlIGJhc2VwYXRoIG9uIHJlbGF0aXZlIHVybHNcbiAgcmV0dXJuIGFkZFBhdGhQcmVmaXgocGF0aCwgYmFzZVBhdGgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxCYXNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBwYXRoID0gcGF0aC5zbGljZShiYXNlUGF0aC5sZW5ndGgpXG4gIGlmICghcGF0aC5zdGFydHNXaXRoKCcvJykpIHBhdGggPSBgLyR7cGF0aH1gXG4gIHJldHVybiBwYXRoXG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIGEgZ2l2ZW4gdXJsIGlzIHJvdXRhYmxlIGJ5IHRoZSBOZXh0LmpzIHJvdXRlciAoYnJvd3NlciBvbmx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTG9jYWxVUkwodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gcHJldmVudCBhIGh5ZHJhdGlvbiBtaXNtYXRjaCBvbiBocmVmIGZvciB1cmwgd2l0aCBhbmNob3IgcmVmc1xuICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnIycpKSByZXR1cm4gdHJ1ZVxuICB0cnkge1xuICAgIC8vIGFic29sdXRlIHVybHMgY2FuIGJlIGxvY2FsIGlmIHRoZXkgYXJlIG9uIHRoZSBzYW1lIG9yaWdpblxuICAgIGNvbnN0IGxvY2F0aW9uT3JpZ2luID0gZ2V0TG9jYXRpb25PcmlnaW4oKVxuICAgIGNvbnN0IHJlc29sdmVkID0gbmV3IFVSTCh1cmwsIGxvY2F0aW9uT3JpZ2luKVxuICAgIHJldHVybiByZXNvbHZlZC5vcmlnaW4gPT09IGxvY2F0aW9uT3JpZ2luICYmIGhhc0Jhc2VQYXRoKHJlc29sdmVkLnBhdGhuYW1lKVxuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxudHlwZSBVcmwgPSBVcmxPYmplY3QgfCBzdHJpbmdcblxuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlQXMoXG4gIHJvdXRlOiBzdHJpbmcsXG4gIGFzUGF0aG5hbWU6IHN0cmluZyxcbiAgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5XG4pIHtcbiAgbGV0IGludGVycG9sYXRlZFJvdXRlID0gJydcblxuICBjb25zdCBkeW5hbWljUmVnZXggPSBnZXRSb3V0ZVJlZ2V4KHJvdXRlKVxuICBjb25zdCBkeW5hbWljR3JvdXBzID0gZHluYW1pY1JlZ2V4Lmdyb3Vwc1xuICBjb25zdCBkeW5hbWljTWF0Y2hlcyA9XG4gICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBkeW5hbWljIHJvdXRlIGFnYWluc3QgdGhlIGFzUGF0aFxuICAgIChhc1BhdGhuYW1lICE9PSByb3V0ZSA/IGdldFJvdXRlTWF0Y2hlcihkeW5hbWljUmVnZXgpKGFzUGF0aG5hbWUpIDogJycpIHx8XG4gICAgLy8gRmFsbCBiYWNrIHRvIHJlYWRpbmcgdGhlIHZhbHVlcyBmcm9tIHRoZSBocmVmXG4gICAgLy8gVE9ETzogc2hvdWxkIHRoaXMgdGFrZSBwcmlvcml0eTsgYWxzbyBuZWVkIHRvIGNoYW5nZSBpbiB0aGUgcm91dGVyLlxuICAgIHF1ZXJ5XG5cbiAgaW50ZXJwb2xhdGVkUm91dGUgPSByb3V0ZVxuICBjb25zdCBwYXJhbXMgPSBPYmplY3Qua2V5cyhkeW5hbWljR3JvdXBzKVxuXG4gIGlmIChcbiAgICAhcGFyYW1zLmV2ZXJ5KChwYXJhbSkgPT4ge1xuICAgICAgbGV0IHZhbHVlID0gZHluYW1pY01hdGNoZXNbcGFyYW1dIHx8ICcnXG4gICAgICBjb25zdCB7IHJlcGVhdCwgb3B0aW9uYWwgfSA9IGR5bmFtaWNHcm91cHNbcGFyYW1dXG5cbiAgICAgIC8vIHN1cHBvcnQgc2luZ2xlLWxldmVsIGNhdGNoLWFsbFxuICAgICAgLy8gVE9ETzogbW9yZSByb2J1c3QgaGFuZGxpbmcgZm9yIHVzZXItZXJyb3IgKHBhc3NpbmcgYC9gKVxuICAgICAgbGV0IHJlcGxhY2VkID0gYFske3JlcGVhdCA/ICcuLi4nIDogJyd9JHtwYXJhbX1dYFxuICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgIHJlcGxhY2VkID0gYCR7IXZhbHVlID8gJy8nIDogJyd9WyR7cmVwbGFjZWR9XWBcbiAgICAgIH1cbiAgICAgIGlmIChyZXBlYXQgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB2YWx1ZSA9IFt2YWx1ZV1cblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgKG9wdGlvbmFsIHx8IHBhcmFtIGluIGR5bmFtaWNNYXRjaGVzKSAmJlxuICAgICAgICAvLyBJbnRlcnBvbGF0ZSBncm91cCBpbnRvIGRhdGEgVVJMIGlmIHByZXNlbnRcbiAgICAgICAgKGludGVycG9sYXRlZFJvdXRlID1cbiAgICAgICAgICBpbnRlcnBvbGF0ZWRSb3V0ZSEucmVwbGFjZShcbiAgICAgICAgICAgIHJlcGxhY2VkLFxuICAgICAgICAgICAgcmVwZWF0XG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIHN0cmluZ1tdKVxuICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBmdWxseSBlbmNvZGVkIGluc3RlYWQgb2YganVzdFxuICAgICAgICAgICAgICAgICAgICAvLyBwYXRoIGRlbGltaXRlciBlc2NhcGVkIHNpbmNlIHRoZXkgYXJlIGJlaW5nIGluc2VydGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIGludG8gdGhlIFVSTCBhbmQgd2UgZXhwZWN0IFVSTCBlbmNvZGVkIHNlZ21lbnRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gcGFyc2luZyBkeW5hbWljIHJvdXRlIHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICAoc2VnbWVudCkgPT4gZW5jb2RlVVJJQ29tcG9uZW50KHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAuam9pbignLycpXG4gICAgICAgICAgICAgIDogZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlIGFzIHN0cmluZylcbiAgICAgICAgICApIHx8ICcvJylcbiAgICAgIClcbiAgICB9KVxuICApIHtcbiAgICBpbnRlcnBvbGF0ZWRSb3V0ZSA9ICcnIC8vIGRpZCBub3Qgc2F0aXNmeSBhbGwgcmVxdWlyZW1lbnRzXG5cbiAgICAvLyBuLmIuIFdlIGlnbm9yZSB0aGlzIGVycm9yIGJlY2F1c2Ugd2UgaGFuZGxlIHdhcm5pbmcgZm9yIHRoaXMgY2FzZSBpblxuICAgIC8vIGRldmVsb3BtZW50IGluIHRoZSBgPExpbms+YCBjb21wb25lbnQgZGlyZWN0bHkuXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwYXJhbXMsXG4gICAgcmVzdWx0OiBpbnRlcnBvbGF0ZWRSb3V0ZSxcbiAgfVxufVxuXG5mdW5jdGlvbiBvbWl0UGFybXNGcm9tUXVlcnkocXVlcnk6IFBhcnNlZFVybFF1ZXJ5LCBwYXJhbXM6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IGZpbHRlcmVkUXVlcnk6IFBhcnNlZFVybFF1ZXJ5ID0ge31cblxuICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgaWYgKCFwYXJhbXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgZmlsdGVyZWRRdWVyeVtrZXldID0gcXVlcnlba2V5XVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIGZpbHRlcmVkUXVlcnlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGdpdmVuIGh5cGVybGluayB3aXRoIGEgY2VydGFpbiByb3V0ZXIgc3RhdGUgKGJhc2VQYXRoIG5vdCBpbmNsdWRlZCkuXG4gKiBQcmVzZXJ2ZXMgYWJzb2x1dGUgdXJscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVIcmVmKFxuICBjdXJyZW50UGF0aDogc3RyaW5nLFxuICBocmVmOiBVcmwsXG4gIHJlc29sdmVBcz86IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIC8vIHdlIHVzZSBhIGR1bW15IGJhc2UgdXJsIGZvciByZWxhdGl2ZSB1cmxzXG4gIGNvbnN0IGJhc2UgPSBuZXcgVVJMKGN1cnJlbnRQYXRoLCAnaHR0cDovL24nKVxuICBjb25zdCB1cmxBc1N0cmluZyA9XG4gICAgdHlwZW9mIGhyZWYgPT09ICdzdHJpbmcnID8gaHJlZiA6IGZvcm1hdFdpdGhWYWxpZGF0aW9uKGhyZWYpXG4gIC8vIFJldHVybiBiZWNhdXNlIGl0IGNhbm5vdCBiZSByb3V0ZWQgYnkgdGhlIE5leHQuanMgcm91dGVyXG4gIGlmICghaXNMb2NhbFVSTCh1cmxBc1N0cmluZykpIHtcbiAgICByZXR1cm4gKHJlc29sdmVBcyA/IFt1cmxBc1N0cmluZ10gOiB1cmxBc1N0cmluZykgYXMgc3RyaW5nXG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBmaW5hbFVybCA9IG5ldyBVUkwodXJsQXNTdHJpbmcsIGJhc2UpXG4gICAgZmluYWxVcmwucGF0aG5hbWUgPSBub3JtYWxpemVQYXRoVHJhaWxpbmdTbGFzaChmaW5hbFVybC5wYXRobmFtZSlcbiAgICBsZXQgaW50ZXJwb2xhdGVkQXMgPSAnJ1xuXG4gICAgaWYgKFxuICAgICAgaXNEeW5hbWljUm91dGUoZmluYWxVcmwucGF0aG5hbWUpICYmXG4gICAgICBmaW5hbFVybC5zZWFyY2hQYXJhbXMgJiZcbiAgICAgIHJlc29sdmVBc1xuICAgICkge1xuICAgICAgY29uc3QgcXVlcnkgPSBzZWFyY2hQYXJhbXNUb1VybFF1ZXJ5KGZpbmFsVXJsLnNlYXJjaFBhcmFtcylcblxuICAgICAgY29uc3QgeyByZXN1bHQsIHBhcmFtcyB9ID0gaW50ZXJwb2xhdGVBcyhcbiAgICAgICAgZmluYWxVcmwucGF0aG5hbWUsXG4gICAgICAgIGZpbmFsVXJsLnBhdGhuYW1lLFxuICAgICAgICBxdWVyeVxuICAgICAgKVxuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGludGVycG9sYXRlZEFzID0gZm9ybWF0V2l0aFZhbGlkYXRpb24oe1xuICAgICAgICAgIHBhdGhuYW1lOiByZXN1bHQsXG4gICAgICAgICAgaGFzaDogZmluYWxVcmwuaGFzaCxcbiAgICAgICAgICBxdWVyeTogb21pdFBhcm1zRnJvbVF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoZSBvcmlnaW4gZGlkbid0IGNoYW5nZSwgaXQgbWVhbnMgd2UgcmVjZWl2ZWQgYSByZWxhdGl2ZSBocmVmXG4gICAgY29uc3QgcmVzb2x2ZWRIcmVmID1cbiAgICAgIGZpbmFsVXJsLm9yaWdpbiA9PT0gYmFzZS5vcmlnaW5cbiAgICAgICAgPyBmaW5hbFVybC5ocmVmLnNsaWNlKGZpbmFsVXJsLm9yaWdpbi5sZW5ndGgpXG4gICAgICAgIDogZmluYWxVcmwuaHJlZlxuXG4gICAgcmV0dXJuIChyZXNvbHZlQXNcbiAgICAgID8gW3Jlc29sdmVkSHJlZiwgaW50ZXJwb2xhdGVkQXMgfHwgcmVzb2x2ZWRIcmVmXVxuICAgICAgOiByZXNvbHZlZEhyZWYpIGFzIHN0cmluZ1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIChyZXNvbHZlQXMgPyBbdXJsQXNTdHJpbmddIDogdXJsQXNTdHJpbmcpIGFzIHN0cmluZ1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmlwT3JpZ2luKHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IG9yaWdpbiA9IGdldExvY2F0aW9uT3JpZ2luKClcblxuICByZXR1cm4gdXJsLnN0YXJ0c1dpdGgob3JpZ2luKSA/IHVybC5zdWJzdHJpbmcob3JpZ2luLmxlbmd0aCkgOiB1cmxcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVVybEFzKHJvdXRlcjogTmV4dFJvdXRlciwgdXJsOiBVcmwsIGFzPzogVXJsKSB7XG4gIC8vIElmIHVybCBhbmQgYXMgcHJvdmlkZWQgYXMgYW4gb2JqZWN0IHJlcHJlc2VudGF0aW9uLFxuICAvLyB3ZSdsbCBmb3JtYXQgdGhlbSBpbnRvIHRoZSBzdHJpbmcgdmVyc2lvbiBoZXJlLlxuICBsZXQgW3Jlc29sdmVkSHJlZiwgcmVzb2x2ZWRBc10gPSByZXNvbHZlSHJlZihyb3V0ZXIucGF0aG5hbWUsIHVybCwgdHJ1ZSlcbiAgY29uc3Qgb3JpZ2luID0gZ2V0TG9jYXRpb25PcmlnaW4oKVxuICBjb25zdCBocmVmSGFkT3JpZ2luID0gcmVzb2x2ZWRIcmVmLnN0YXJ0c1dpdGgob3JpZ2luKVxuICBjb25zdCBhc0hhZE9yaWdpbiA9IHJlc29sdmVkQXMgJiYgcmVzb2x2ZWRBcy5zdGFydHNXaXRoKG9yaWdpbilcblxuICByZXNvbHZlZEhyZWYgPSBzdHJpcE9yaWdpbihyZXNvbHZlZEhyZWYpXG4gIHJlc29sdmVkQXMgPSByZXNvbHZlZEFzID8gc3RyaXBPcmlnaW4ocmVzb2x2ZWRBcykgOiByZXNvbHZlZEFzXG5cbiAgY29uc3QgcHJlcGFyZWRVcmwgPSBocmVmSGFkT3JpZ2luID8gcmVzb2x2ZWRIcmVmIDogYWRkQmFzZVBhdGgocmVzb2x2ZWRIcmVmKVxuICBjb25zdCBwcmVwYXJlZEFzID0gYXNcbiAgICA/IHN0cmlwT3JpZ2luKHJlc29sdmVIcmVmKHJvdXRlci5wYXRobmFtZSwgYXMpKVxuICAgIDogcmVzb2x2ZWRBcyB8fCByZXNvbHZlZEhyZWZcblxuICByZXR1cm4ge1xuICAgIHVybDogcHJlcGFyZWRVcmwsXG4gICAgYXM6IGFzSGFkT3JpZ2luID8gcHJlcGFyZWRBcyA6IGFkZEJhc2VQYXRoKHByZXBhcmVkQXMpLFxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEeW5hbWljUm91dGUocGF0aG5hbWU6IHN0cmluZywgcGFnZXM6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IGNsZWFuUGF0aG5hbWUgPSByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaChkZW5vcm1hbGl6ZVBhZ2VQYXRoKHBhdGhuYW1lISkpXG5cbiAgaWYgKGNsZWFuUGF0aG5hbWUgPT09ICcvNDA0JyB8fCBjbGVhblBhdGhuYW1lID09PSAnL19lcnJvcicpIHtcbiAgICByZXR1cm4gcGF0aG5hbWVcbiAgfVxuXG4gIC8vIGhhbmRsZSByZXNvbHZpbmcgaHJlZiBmb3IgZHluYW1pYyByb3V0ZXNcbiAgaWYgKCFwYWdlcy5pbmNsdWRlcyhjbGVhblBhdGhuYW1lISkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYXJyYXktY2FsbGJhY2stcmV0dXJuXG4gICAgcGFnZXMuc29tZSgocGFnZSkgPT4ge1xuICAgICAgaWYgKGlzRHluYW1pY1JvdXRlKHBhZ2UpICYmIGdldFJvdXRlUmVnZXgocGFnZSkucmUudGVzdChjbGVhblBhdGhuYW1lISkpIHtcbiAgICAgICAgcGF0aG5hbWUgPSBwYWdlXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICByZXR1cm4gcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2gocGF0aG5hbWUpXG59XG5cbmV4cG9ydCB0eXBlIEJhc2VSb3V0ZXIgPSB7XG4gIHJvdXRlOiBzdHJpbmdcbiAgcGF0aG5hbWU6IHN0cmluZ1xuICBxdWVyeTogUGFyc2VkVXJsUXVlcnlcbiAgYXNQYXRoOiBzdHJpbmdcbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBsb2NhbGU/OiBzdHJpbmdcbiAgbG9jYWxlcz86IHN0cmluZ1tdXG4gIGRlZmF1bHRMb2NhbGU/OiBzdHJpbmdcbiAgZG9tYWluTG9jYWxlcz86IERvbWFpbkxvY2FsZXNcbiAgaXNMb2NhbGVEb21haW46IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgTmV4dFJvdXRlciA9IEJhc2VSb3V0ZXIgJlxuICBQaWNrPFxuICAgIFJvdXRlcixcbiAgICB8ICdwdXNoJ1xuICAgIHwgJ3JlcGxhY2UnXG4gICAgfCAncmVsb2FkJ1xuICAgIHwgJ2JhY2snXG4gICAgfCAncHJlZmV0Y2gnXG4gICAgfCAnYmVmb3JlUG9wU3RhdGUnXG4gICAgfCAnZXZlbnRzJ1xuICAgIHwgJ2lzRmFsbGJhY2snXG4gICAgfCAnaXNSZWFkeSdcbiAgICB8ICdpc1ByZXZpZXcnXG4gID5cblxuZXhwb3J0IHR5cGUgUHJlZmV0Y2hPcHRpb25zID0ge1xuICBwcmlvcml0eT86IGJvb2xlYW5cbiAgbG9jYWxlPzogc3RyaW5nIHwgZmFsc2Vcbn1cblxuZXhwb3J0IHR5cGUgUHJpdmF0ZVJvdXRlSW5mbyA9XG4gIHwgKE9taXQ8Q29tcGxldGVQcml2YXRlUm91dGVJbmZvLCAnc3R5bGVTaGVldHMnPiAmIHsgaW5pdGlhbDogdHJ1ZSB9KVxuICB8IENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mb1xuXG5leHBvcnQgdHlwZSBDb21wbGV0ZVByaXZhdGVSb3V0ZUluZm8gPSB7XG4gIENvbXBvbmVudDogQ29tcG9uZW50VHlwZVxuICBzdHlsZVNoZWV0czogU3R5bGVTaGVldFR1cGxlW11cbiAgX19OX1NTRz86IGJvb2xlYW5cbiAgX19OX1NTUD86IGJvb2xlYW5cbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gIGVycj86IEVycm9yXG4gIGVycm9yPzogYW55XG59XG5cbmV4cG9ydCB0eXBlIEFwcFByb3BzID0gUGljazxDb21wbGV0ZVByaXZhdGVSb3V0ZUluZm8sICdDb21wb25lbnQnIHwgJ2Vycic+ICYge1xuICByb3V0ZXI6IFJvdXRlclxufSAmIFJlY29yZDxzdHJpbmcsIGFueT5cbmV4cG9ydCB0eXBlIEFwcENvbXBvbmVudCA9IENvbXBvbmVudFR5cGU8QXBwUHJvcHM+XG5cbnR5cGUgU3Vic2NyaXB0aW9uID0gKFxuICBkYXRhOiBQcml2YXRlUm91dGVJbmZvLFxuICBBcHA6IEFwcENvbXBvbmVudCxcbiAgcmVzZXRTY3JvbGw6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGxcbikgPT4gUHJvbWlzZTx2b2lkPlxuXG50eXBlIEJlZm9yZVBvcFN0YXRlQ2FsbGJhY2sgPSAoc3RhdGU6IE5leHRIaXN0b3J5U3RhdGUpID0+IGJvb2xlYW5cblxudHlwZSBDb21wb25lbnRMb2FkQ2FuY2VsID0gKCgpID0+IHZvaWQpIHwgbnVsbFxuXG50eXBlIEhpc3RvcnlNZXRob2QgPSAncmVwbGFjZVN0YXRlJyB8ICdwdXNoU3RhdGUnXG5cbmNvbnN0IG1hbnVhbFNjcm9sbFJlc3RvcmF0aW9uID1cbiAgcHJvY2Vzcy5lbnYuX19ORVhUX1NDUk9MTF9SRVNUT1JBVElPTiAmJlxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAnc2Nyb2xsUmVzdG9yYXRpb24nIGluIHdpbmRvdy5oaXN0b3J5ICYmXG4gICEhKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHYgPSAnX19uZXh0J1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlcXVlbmNlc1xuICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odiwgdiksIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0odiksIHRydWVcbiAgICB9IGNhdGNoIChuKSB7fVxuICB9KSgpXG5cbmNvbnN0IFNTR19EQVRBX05PVF9GT1VORCA9IFN5bWJvbCgnU1NHX0RBVEFfTk9UX0ZPVU5EJylcblxuZnVuY3Rpb24gZmV0Y2hSZXRyeSh1cmw6IHN0cmluZywgYXR0ZW1wdHM6IG51bWJlcik6IFByb21pc2U8YW55PiB7XG4gIHJldHVybiBmZXRjaCh1cmwsIHtcbiAgICAvLyBDb29raWVzIGFyZSByZXF1aXJlZCB0byBiZSBwcmVzZW50IGZvciBOZXh0LmpzJyBTU0cgXCJQcmV2aWV3IE1vZGVcIi5cbiAgICAvLyBDb29raWVzIG1heSBhbHNvIGJlIHJlcXVpcmVkIGZvciBgZ2V0U2VydmVyU2lkZVByb3BzYC5cbiAgICAvL1xuICAgIC8vID4gYGZldGNoYCB3b27igJl0IHNlbmQgY29va2llcywgdW5sZXNzIHlvdSBzZXQgdGhlIGNyZWRlbnRpYWxzIGluaXRcbiAgICAvLyA+IG9wdGlvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRmV0Y2hfQVBJL1VzaW5nX0ZldGNoXG4gICAgLy9cbiAgICAvLyA+IEZvciBtYXhpbXVtIGJyb3dzZXIgY29tcGF0aWJpbGl0eSB3aGVuIGl0IGNvbWVzIHRvIHNlbmRpbmcgJlxuICAgIC8vID4gcmVjZWl2aW5nIGNvb2tpZXMsIGFsd2F5cyBzdXBwbHkgdGhlIGBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJ2BcbiAgICAvLyA+IG9wdGlvbiBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIGRlZmF1bHQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dpdGh1Yi9mZXRjaCNjYXZlYXRzXG4gICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gIH0pLnRoZW4oKHJlcykgPT4ge1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBpZiAoYXR0ZW1wdHMgPiAxICYmIHJlcy5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgIHJldHVybiBmZXRjaFJldHJ5KHVybCwgYXR0ZW1wdHMgLSAxKVxuICAgICAgfVxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEubm90Rm91bmQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5vdEZvdW5kOiBTU0dfREFUQV9OT1RfRk9VTkQgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHN0YXRpYyBwcm9wc2ApXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHN0YXRpYyBwcm9wc2ApXG4gICAgfVxuICAgIHJldHVybiByZXMuanNvbigpXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGZldGNoTmV4dERhdGEoZGF0YUhyZWY6IHN0cmluZywgaXNTZXJ2ZXJSZW5kZXI6IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGZldGNoUmV0cnkoZGF0YUhyZWYsIGlzU2VydmVyUmVuZGVyID8gMyA6IDEpLmNhdGNoKChlcnI6IEVycm9yKSA9PiB7XG4gICAgLy8gV2Ugc2hvdWxkIG9ubHkgdHJpZ2dlciBhIHNlcnZlci1zaWRlIHRyYW5zaXRpb24gaWYgdGhpcyB3YXMgY2F1c2VkXG4gICAgLy8gb24gYSBjbGllbnQtc2lkZSB0cmFuc2l0aW9uLiBPdGhlcndpc2UsIHdlJ2QgZ2V0IGludG8gYW4gaW5maW5pdGVcbiAgICAvLyBsb29wLlxuXG4gICAgaWYgKCFpc1NlcnZlclJlbmRlcikge1xuICAgICAgbWFya0Fzc2V0RXJyb3IoZXJyKVxuICAgIH1cbiAgICB0aHJvdyBlcnJcbiAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyIGltcGxlbWVudHMgQmFzZVJvdXRlciB7XG4gIHJvdXRlOiBzdHJpbmdcbiAgcGF0aG5hbWU6IHN0cmluZ1xuICBxdWVyeTogUGFyc2VkVXJsUXVlcnlcbiAgYXNQYXRoOiBzdHJpbmdcbiAgYmFzZVBhdGg6IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgYWxsIGNvbXBvbmVudHMgbG9hZGVkIGluIGBSb3V0ZXJgXG4gICAqL1xuICBjb21wb25lbnRzOiB7IFtwYXRobmFtZTogc3RyaW5nXTogUHJpdmF0ZVJvdXRlSW5mbyB9XG4gIC8vIFN0YXRpYyBEYXRhIENhY2hlXG4gIHNkYzogeyBbYXNQYXRoOiBzdHJpbmddOiBvYmplY3QgfSA9IHt9XG4gIC8vIEluLWZsaWdodCBTZXJ2ZXIgRGF0YSBSZXF1ZXN0cywgZm9yIGRlZHVwaW5nXG4gIHNkcjogeyBbYXNQYXRoOiBzdHJpbmddOiBQcm9taXNlPG9iamVjdD4gfSA9IHt9XG5cbiAgc3ViOiBTdWJzY3JpcHRpb25cbiAgY2xjOiBDb21wb25lbnRMb2FkQ2FuY2VsXG4gIHBhZ2VMb2FkZXI6IGFueVxuICBfYnBzOiBCZWZvcmVQb3BTdGF0ZUNhbGxiYWNrIHwgdW5kZWZpbmVkXG4gIGV2ZW50czogTWl0dEVtaXR0ZXJcbiAgX3dyYXBBcHA6IChBcHA6IEFwcENvbXBvbmVudCkgPT4gYW55XG4gIGlzU3NyOiBib29sZWFuXG4gIGlzRmFsbGJhY2s6IGJvb2xlYW5cbiAgX2luRmxpZ2h0Um91dGU/OiBzdHJpbmdcbiAgX3NoYWxsb3c/OiBib29sZWFuXG4gIGxvY2FsZT86IHN0cmluZ1xuICBsb2NhbGVzPzogc3RyaW5nW11cbiAgZGVmYXVsdExvY2FsZT86IHN0cmluZ1xuICBkb21haW5Mb2NhbGVzPzogRG9tYWluTG9jYWxlc1xuICBpc1JlYWR5OiBib29sZWFuXG4gIGlzUHJldmlldzogYm9vbGVhblxuICBpc0xvY2FsZURvbWFpbjogYm9vbGVhblxuXG4gIHByaXZhdGUgX2lkeDogbnVtYmVyID0gMFxuXG4gIHN0YXRpYyBldmVudHM6IE1pdHRFbWl0dGVyID0gbWl0dCgpXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBxdWVyeTogUGFyc2VkVXJsUXVlcnksXG4gICAgYXM6IHN0cmluZyxcbiAgICB7XG4gICAgICBpbml0aWFsUHJvcHMsXG4gICAgICBwYWdlTG9hZGVyLFxuICAgICAgQXBwLFxuICAgICAgd3JhcEFwcCxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIGVycixcbiAgICAgIHN1YnNjcmlwdGlvbixcbiAgICAgIGlzRmFsbGJhY2ssXG4gICAgICBsb2NhbGUsXG4gICAgICBsb2NhbGVzLFxuICAgICAgZGVmYXVsdExvY2FsZSxcbiAgICAgIGRvbWFpbkxvY2FsZXMsXG4gICAgICBpc1ByZXZpZXcsXG4gICAgfToge1xuICAgICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25cbiAgICAgIGluaXRpYWxQcm9wczogYW55XG4gICAgICBwYWdlTG9hZGVyOiBhbnlcbiAgICAgIENvbXBvbmVudDogQ29tcG9uZW50VHlwZVxuICAgICAgQXBwOiBBcHBDb21wb25lbnRcbiAgICAgIHdyYXBBcHA6IChBcHA6IEFwcENvbXBvbmVudCkgPT4gYW55XG4gICAgICBlcnI/OiBFcnJvclxuICAgICAgaXNGYWxsYmFjazogYm9vbGVhblxuICAgICAgbG9jYWxlPzogc3RyaW5nXG4gICAgICBsb2NhbGVzPzogc3RyaW5nW11cbiAgICAgIGRlZmF1bHRMb2NhbGU/OiBzdHJpbmdcbiAgICAgIGRvbWFpbkxvY2FsZXM/OiBEb21haW5Mb2NhbGVzXG4gICAgICBpc1ByZXZpZXc/OiBib29sZWFuXG4gICAgfVxuICApIHtcbiAgICAvLyByZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbXBvbmVudCBrZXlcbiAgICB0aGlzLnJvdXRlID0gcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2gocGF0aG5hbWUpXG5cbiAgICAvLyBzZXQgdXAgdGhlIGNvbXBvbmVudCBjYWNoZSAoYnkgcm91dGUga2V5cylcbiAgICB0aGlzLmNvbXBvbmVudHMgPSB7fVxuICAgIC8vIFdlIHNob3VsZCBub3Qga2VlcCB0aGUgY2FjaGUsIGlmIHRoZXJlJ3MgYW4gZXJyb3JcbiAgICAvLyBPdGhlcndpc2UsIHRoaXMgY2F1c2UgaXNzdWVzIHdoZW4gd2hlbiBnb2luZyBiYWNrIGFuZFxuICAgIC8vIGNvbWUgYWdhaW4gdG8gdGhlIGVycm9yZWQgcGFnZS5cbiAgICBpZiAocGF0aG5hbWUgIT09ICcvX2Vycm9yJykge1xuICAgICAgdGhpcy5jb21wb25lbnRzW3RoaXMucm91dGVdID0ge1xuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIGluaXRpYWw6IHRydWUsXG4gICAgICAgIHByb3BzOiBpbml0aWFsUHJvcHMsXG4gICAgICAgIGVycixcbiAgICAgICAgX19OX1NTRzogaW5pdGlhbFByb3BzICYmIGluaXRpYWxQcm9wcy5fX05fU1NHLFxuICAgICAgICBfX05fU1NQOiBpbml0aWFsUHJvcHMgJiYgaW5pdGlhbFByb3BzLl9fTl9TU1AsXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb21wb25lbnRzWycvX2FwcCddID0ge1xuICAgICAgQ29tcG9uZW50OiBBcHAgYXMgQ29tcG9uZW50VHlwZSxcbiAgICAgIHN0eWxlU2hlZXRzOiBbXG4gICAgICAgIC8qIC9fYXBwIGRvZXMgbm90IG5lZWQgaXRzIHN0eWxlc2hlZXRzIG1hbmFnZWQgKi9cbiAgICAgIF0sXG4gICAgfVxuXG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdCBmb3IgUm91dGVyLnJvdXRlci5ldmVudHNcbiAgICAvLyBUT0RPOiBTaG91bGQgYmUgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbWFqb3IgdmVyc2lvbiBhcyBpdCB3YXMgbmV2ZXIgZG9jdW1lbnRlZFxuICAgIHRoaXMuZXZlbnRzID0gUm91dGVyLmV2ZW50c1xuXG4gICAgdGhpcy5wYWdlTG9hZGVyID0gcGFnZUxvYWRlclxuICAgIHRoaXMucGF0aG5hbWUgPSBwYXRobmFtZVxuICAgIHRoaXMucXVlcnkgPSBxdWVyeVxuICAgIC8vIGlmIGF1dG8gcHJlcmVuZGVyZWQgYW5kIGR5bmFtaWMgcm91dGUgd2FpdCB0byB1cGRhdGUgYXNQYXRoXG4gICAgLy8gdW50aWwgYWZ0ZXIgbW91bnQgdG8gcHJldmVudCBoeWRyYXRpb24gbWlzbWF0Y2hcbiAgICBjb25zdCBhdXRvRXhwb3J0RHluYW1pYyA9XG4gICAgICBpc0R5bmFtaWNSb3V0ZShwYXRobmFtZSkgJiYgc2VsZi5fX05FWFRfREFUQV9fLmF1dG9FeHBvcnRcblxuICAgIHRoaXMuYXNQYXRoID0gYXV0b0V4cG9ydER5bmFtaWMgPyBwYXRobmFtZSA6IGFzXG4gICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoXG4gICAgdGhpcy5zdWIgPSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLmNsYyA9IG51bGxcbiAgICB0aGlzLl93cmFwQXBwID0gd3JhcEFwcFxuICAgIC8vIG1ha2Ugc3VyZSB0byBpZ25vcmUgZXh0cmEgcG9wU3RhdGUgaW4gc2FmYXJpIG9uIG5hdmlnYXRpbmdcbiAgICAvLyBiYWNrIGZyb20gZXh0ZXJuYWwgc2l0ZVxuICAgIHRoaXMuaXNTc3IgPSB0cnVlXG5cbiAgICB0aGlzLmlzRmFsbGJhY2sgPSBpc0ZhbGxiYWNrXG5cbiAgICB0aGlzLmlzUmVhZHkgPSAhIShcbiAgICAgIHNlbGYuX19ORVhUX0RBVEFfXy5nc3NwIHx8XG4gICAgICBzZWxmLl9fTkVYVF9EQVRBX18uZ2lwIHx8XG4gICAgICAoIWF1dG9FeHBvcnREeW5hbWljICYmICFzZWxmLmxvY2F0aW9uLnNlYXJjaClcbiAgICApXG4gICAgdGhpcy5pc1ByZXZpZXcgPSAhIWlzUHJldmlld1xuICAgIHRoaXMuaXNMb2NhbGVEb21haW4gPSBmYWxzZVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXG4gICAgICB0aGlzLmxvY2FsZXMgPSBsb2NhbGVzXG4gICAgICB0aGlzLmRlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlXG4gICAgICB0aGlzLmRvbWFpbkxvY2FsZXMgPSBkb21haW5Mb2NhbGVzXG4gICAgICB0aGlzLmlzTG9jYWxlRG9tYWluID0gISFkZXRlY3REb21haW5Mb2NhbGUoXG4gICAgICAgIGRvbWFpbkxvY2FsZXMsXG4gICAgICAgIHNlbGYubG9jYXRpb24uaG9zdG5hbWVcbiAgICAgIClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSBcImFzXCIgZG9lc24ndCBzdGFydCB3aXRoIGRvdWJsZSBzbGFzaGVzIG9yIGVsc2UgaXQgY2FuXG4gICAgICAvLyB0aHJvdyBhbiBlcnJvciBhcyBpdCdzIGNvbnNpZGVyZWQgaW52YWxpZFxuICAgICAgaWYgKGFzLnN1YnN0cigwLCAyKSAhPT0gJy8vJykge1xuICAgICAgICAvLyBpbiBvcmRlciBmb3IgYGUuc3RhdGVgIHRvIHdvcmsgb24gdGhlIGBvbnBvcHN0YXRlYCBldmVudFxuICAgICAgICAvLyB3ZSBoYXZlIHRvIHJlZ2lzdGVyIHRoZSBpbml0aWFsIHJvdXRlIHVwb24gaW5pdGlhbGl6YXRpb25cbiAgICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShcbiAgICAgICAgICAncmVwbGFjZVN0YXRlJyxcbiAgICAgICAgICBmb3JtYXRXaXRoVmFsaWRhdGlvbih7IHBhdGhuYW1lOiBhZGRCYXNlUGF0aChwYXRobmFtZSksIHF1ZXJ5IH0pLFxuICAgICAgICAgIGdldFVSTCgpLFxuICAgICAgICAgIHsgbG9jYWxlIH1cbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCB0aGlzLm9uUG9wU3RhdGUpXG5cbiAgICAgIC8vIGVuYWJsZSBjdXN0b20gc2Nyb2xsIHJlc3RvcmF0aW9uIGhhbmRsaW5nIHdoZW4gYXZhaWxhYmxlXG4gICAgICAvLyBvdGhlcndpc2UgZmFsbGJhY2sgdG8gYnJvd3NlcidzIGRlZmF1bHQgaGFuZGxpbmdcbiAgICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfU0NST0xMX1JFU1RPUkFUSU9OKSB7XG4gICAgICAgIGlmIChtYW51YWxTY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gJ21hbnVhbCdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uUG9wU3RhdGUgPSAoZTogUG9wU3RhdGVFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gZS5zdGF0ZSBhcyBIaXN0b3J5U3RhdGVcblxuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIC8vIFdlIGdldCBzdGF0ZSBhcyB1bmRlZmluZWQgZm9yIHR3byByZWFzb25zLlxuICAgICAgLy8gIDEuIFdpdGggb2xkZXIgc2FmYXJpICg8IDgpIGFuZCBvbGRlciBjaHJvbWUgKDwgMzQpXG4gICAgICAvLyAgMi4gV2hlbiB0aGUgVVJMIGNoYW5nZWQgd2l0aCAjXG4gICAgICAvL1xuICAgICAgLy8gSW4gdGhlIGJvdGggY2FzZXMsIHdlIGRvbid0IG5lZWQgdG8gcHJvY2VlZCBhbmQgY2hhbmdlIHRoZSByb3V0ZS5cbiAgICAgIC8vIChhcyBpdCdzIGFscmVhZHkgY2hhbmdlZClcbiAgICAgIC8vIEJ1dCB3ZSBjYW4gc2ltcGx5IHJlcGxhY2UgdGhlIHN0YXRlIHdpdGggdGhlIG5ldyBjaGFuZ2VzLlxuICAgICAgLy8gQWN0dWFsbHksIGZvciAoMSkgd2UgZG9uJ3QgbmVlZCB0byBub3RoaW5nLiBCdXQgaXQncyBoYXJkIHRvIGRldGVjdCB0aGF0IGV2ZW50LlxuICAgICAgLy8gU28sIGRvaW5nIHRoZSBmb2xsb3dpbmcgZm9yICgxKSBkb2VzIG5vIGhhcm0uXG4gICAgICBjb25zdCB7IHBhdGhuYW1lLCBxdWVyeSB9ID0gdGhpc1xuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShcbiAgICAgICAgJ3JlcGxhY2VTdGF0ZScsXG4gICAgICAgIGZvcm1hdFdpdGhWYWxpZGF0aW9uKHsgcGF0aG5hbWU6IGFkZEJhc2VQYXRoKHBhdGhuYW1lKSwgcXVlcnkgfSksXG4gICAgICAgIGdldFVSTCgpXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlLl9fTikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbGV0IGZvcmNlZFNjcm9sbDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgdW5kZWZpbmVkXG4gICAgY29uc3QgeyB1cmwsIGFzLCBvcHRpb25zLCBpZHggfSA9IHN0YXRlXG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9TQ1JPTExfUkVTVE9SQVRJT04pIHtcbiAgICAgIGlmIChtYW51YWxTY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICBpZiAodGhpcy5faWR4ICE9PSBpZHgpIHtcbiAgICAgICAgICAvLyBTbmFwc2hvdCBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbjpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcbiAgICAgICAgICAgICAgJ19fbmV4dF9zY3JvbGxfJyArIHRoaXMuX2lkeCxcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyB4OiBzZWxmLnBhZ2VYT2Zmc2V0LCB5OiBzZWxmLnBhZ2VZT2Zmc2V0IH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgICAgLy8gUmVzdG9yZSBvbGQgc2Nyb2xsIHBvc2l0aW9uOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnX19uZXh0X3Njcm9sbF8nICsgaWR4KVxuICAgICAgICAgICAgZm9yY2VkU2Nyb2xsID0gSlNPTi5wYXJzZSh2ISlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGZvcmNlZFNjcm9sbCA9IHsgeDogMCwgeTogMCB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2lkeCA9IGlkeFxuXG4gICAgY29uc3QgeyBwYXRobmFtZSB9ID0gcGFyc2VSZWxhdGl2ZVVybCh1cmwpXG5cbiAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmUtcmVuZGVyIG9uIGluaXRpYWwgbG9hZCxcbiAgICAvLyBjYW4gYmUgY2F1c2VkIGJ5IG5hdmlnYXRpbmcgYmFjayBmcm9tIGFuIGV4dGVybmFsIHNpdGVcbiAgICBpZiAodGhpcy5pc1NzciAmJiBhcyA9PT0gdGhpcy5hc1BhdGggJiYgcGF0aG5hbWUgPT09IHRoaXMucGF0aG5hbWUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoZSBkb3duc3RyZWFtIGFwcGxpY2F0aW9uIHJldHVybnMgZmFsc3ksIHJldHVybi5cbiAgICAvLyBUaGV5IHdpbGwgdGhlbiBiZSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIGV2ZW50LlxuICAgIGlmICh0aGlzLl9icHMgJiYgIXRoaXMuX2JwcyhzdGF0ZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuY2hhbmdlKFxuICAgICAgJ3JlcGxhY2VTdGF0ZScsXG4gICAgICB1cmwsXG4gICAgICBhcyxcbiAgICAgIE9iamVjdC5hc3NpZ248e30sIFRyYW5zaXRpb25PcHRpb25zLCBUcmFuc2l0aW9uT3B0aW9ucz4oe30sIG9wdGlvbnMsIHtcbiAgICAgICAgc2hhbGxvdzogb3B0aW9ucy5zaGFsbG93ICYmIHRoaXMuX3NoYWxsb3csXG4gICAgICAgIGxvY2FsZTogb3B0aW9ucy5sb2NhbGUgfHwgdGhpcy5kZWZhdWx0TG9jYWxlLFxuICAgICAgfSksXG4gICAgICBmb3JjZWRTY3JvbGxcbiAgICApXG4gIH1cblxuICByZWxvYWQoKTogdm9pZCB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gIH1cblxuICAvKipcbiAgICogR28gYmFjayBpbiBoaXN0b3J5XG4gICAqL1xuICBiYWNrKCkge1xuICAgIHdpbmRvdy5oaXN0b3J5LmJhY2soKVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgYHB1c2hTdGF0ZWAgd2l0aCBhcmd1bWVudHNcbiAgICogQHBhcmFtIHVybCBvZiB0aGUgcm91dGVcbiAgICogQHBhcmFtIGFzIG1hc2tzIGB1cmxgIGZvciB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgeW91IGNhbiBkZWZpbmUgYHNoYWxsb3dgIGFuZCBvdGhlciBvcHRpb25zXG4gICAqL1xuICBwdXNoKHVybDogVXJsLCBhcz86IFVybCwgb3B0aW9uczogVHJhbnNpdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfU0NST0xMX1JFU1RPUkFUSU9OKSB7XG4gICAgICAvLyBUT0RPOiByZW1vdmUgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIHVwZGF0ZSBoaXN0b3J5IGJlZm9yZSByb3V0ZSBjaGFuZ2VcbiAgICAgIC8vIGlzIGNvbXBsZXRlLCBhcyB0aGUgcG9wc3RhdGUgZXZlbnQgc2hvdWxkIGhhbmRsZSB0aGlzIGNhcHR1cmUuXG4gICAgICBpZiAobWFudWFsU2Nyb2xsUmVzdG9yYXRpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTbmFwc2hvdCBzY3JvbGwgcG9zaXRpb24gcmlnaHQgYmVmb3JlIG5hdmlnYXRpbmcgdG8gYSBuZXcgcGFnZTpcbiAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgJ19fbmV4dF9zY3JvbGxfJyArIHRoaXMuX2lkeCxcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgeDogc2VsZi5wYWdlWE9mZnNldCwgeTogc2VsZi5wYWdlWU9mZnNldCB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH1cbiAgICA7KHsgdXJsLCBhcyB9ID0gcHJlcGFyZVVybEFzKHRoaXMsIHVybCwgYXMpKVxuICAgIHJldHVybiB0aGlzLmNoYW5nZSgncHVzaFN0YXRlJywgdXJsLCBhcywgb3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIGByZXBsYWNlU3RhdGVgIHdpdGggYXJndW1lbnRzXG4gICAqIEBwYXJhbSB1cmwgb2YgdGhlIHJvdXRlXG4gICAqIEBwYXJhbSBhcyBtYXNrcyBgdXJsYCBmb3IgdGhlIGJyb3dzZXJcbiAgICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IHlvdSBjYW4gZGVmaW5lIGBzaGFsbG93YCBhbmQgb3RoZXIgb3B0aW9uc1xuICAgKi9cbiAgcmVwbGFjZSh1cmw6IFVybCwgYXM/OiBVcmwsIG9wdGlvbnM6IFRyYW5zaXRpb25PcHRpb25zID0ge30pIHtcbiAgICA7KHsgdXJsLCBhcyB9ID0gcHJlcGFyZVVybEFzKHRoaXMsIHVybCwgYXMpKVxuICAgIHJldHVybiB0aGlzLmNoYW5nZSgncmVwbGFjZVN0YXRlJywgdXJsLCBhcywgb3B0aW9ucylcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hhbmdlKFxuICAgIG1ldGhvZDogSGlzdG9yeU1ldGhvZCxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhczogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRyYW5zaXRpb25PcHRpb25zLFxuICAgIGZvcmNlZFNjcm9sbD86IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzTG9jYWxVUkwodXJsKSkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmxcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIGZvciBzdGF0aWMgcGFnZXMgd2l0aCBxdWVyeSBwYXJhbXMgaW4gdGhlIFVSTCB3ZSBkZWxheVxuICAgIC8vIG1hcmtpbmcgdGhlIHJvdXRlciByZWFkeSB1bnRpbCBhZnRlciB0aGUgcXVlcnkgaXMgdXBkYXRlZFxuICAgIGlmICgob3B0aW9ucyBhcyBhbnkpLl9oKSB7XG4gICAgICB0aGlzLmlzUmVhZHkgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBzY3JvbGwgcmVzZXQgYmVoYXZpb3IgdW5sZXNzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHRvIGJlXG4gICAgLy8gYGZhbHNlYCEgVGhpcyBtYWtlcyB0aGUgYmVoYXZpb3IgYmV0d2VlbiB1c2luZyBgUm91dGVyI3B1c2hgIGFuZCBhXG4gICAgLy8gYDxMaW5rIC8+YCBjb25zaXN0ZW50LlxuICAgIG9wdGlvbnMuc2Nyb2xsID0gISEob3B0aW9ucy5zY3JvbGwgPz8gdHJ1ZSlcblxuICAgIGxldCBsb2NhbGVDaGFuZ2UgPSBvcHRpb25zLmxvY2FsZSAhPT0gdGhpcy5sb2NhbGVcblxuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgICB0aGlzLmxvY2FsZSA9XG4gICAgICAgIG9wdGlvbnMubG9jYWxlID09PSBmYWxzZVxuICAgICAgICAgID8gdGhpcy5kZWZhdWx0TG9jYWxlXG4gICAgICAgICAgOiBvcHRpb25zLmxvY2FsZSB8fCB0aGlzLmxvY2FsZVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMubG9jYWxlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zLmxvY2FsZSA9IHRoaXMubG9jYWxlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZEFzID0gcGFyc2VSZWxhdGl2ZVVybChoYXNCYXNlUGF0aChhcykgPyBkZWxCYXNlUGF0aChhcykgOiBhcylcbiAgICAgIGNvbnN0IGxvY2FsZVBhdGhSZXN1bHQgPSBub3JtYWxpemVMb2NhbGVQYXRoKFxuICAgICAgICBwYXJzZWRBcy5wYXRobmFtZSxcbiAgICAgICAgdGhpcy5sb2NhbGVzXG4gICAgICApXG5cbiAgICAgIGlmIChsb2NhbGVQYXRoUmVzdWx0LmRldGVjdGVkTG9jYWxlKSB7XG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlUGF0aFJlc3VsdC5kZXRlY3RlZExvY2FsZVxuICAgICAgICBwYXJzZWRBcy5wYXRobmFtZSA9IGFkZEJhc2VQYXRoKHBhcnNlZEFzLnBhdGhuYW1lKVxuICAgICAgICBhcyA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKHBhcnNlZEFzKVxuICAgICAgICB1cmwgPSBhZGRCYXNlUGF0aChcbiAgICAgICAgICBub3JtYWxpemVMb2NhbGVQYXRoKFxuICAgICAgICAgICAgaGFzQmFzZVBhdGgodXJsKSA/IGRlbEJhc2VQYXRoKHVybCkgOiB1cmwsXG4gICAgICAgICAgICB0aGlzLmxvY2FsZXNcbiAgICAgICAgICApLnBhdGhuYW1lXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIGxldCBkaWROYXZpZ2F0ZSA9IGZhbHNlXG5cbiAgICAgIC8vIHdlIG5lZWQgdG8gd3JhcCB0aGlzIGluIHRoZSBlbnYgY2hlY2sgYWdhaW4gc2luY2UgcmVnZW5lcmF0b3IgcnVudGltZVxuICAgICAgLy8gbW92ZXMgdGhpcyBvbiBpdHMgb3duIGR1ZSB0byB0aGUgcmV0dXJuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgICAgICAvLyBpZiB0aGUgbG9jYWxlIGlzbid0IGNvbmZpZ3VyZWQgaGFyZCBuYXZpZ2F0ZSB0byBzaG93IDQwNCBwYWdlXG4gICAgICAgIGlmICghdGhpcy5sb2NhbGVzPy5pbmNsdWRlcyh0aGlzLmxvY2FsZSEpKSB7XG4gICAgICAgICAgcGFyc2VkQXMucGF0aG5hbWUgPSBhZGRMb2NhbGUocGFyc2VkQXMucGF0aG5hbWUsIHRoaXMubG9jYWxlKVxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZm9ybWF0V2l0aFZhbGlkYXRpb24ocGFyc2VkQXMpXG4gICAgICAgICAgLy8gdGhpcyB3YXMgcHJldmlvdXNseSBhIHJldHVybiBidXQgd2FzIHJlbW92ZWQgaW4gZmF2b3JcbiAgICAgICAgICAvLyBvZiBiZXR0ZXIgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdpdGggcmVnZW5lcmF0b3IgcnVudGltZVxuICAgICAgICAgIGRpZE5hdmlnYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRldGVjdGVkRG9tYWluID0gZGV0ZWN0RG9tYWluTG9jYWxlKFxuICAgICAgICB0aGlzLmRvbWFpbkxvY2FsZXMsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgdGhpcy5sb2NhbGVcbiAgICAgIClcblxuICAgICAgLy8gd2UgbmVlZCB0byB3cmFwIHRoaXMgaW4gdGhlIGVudiBjaGVjayBhZ2FpbiBzaW5jZSByZWdlbmVyYXRvciBydW50aW1lXG4gICAgICAvLyBtb3ZlcyB0aGlzIG9uIGl0cyBvd24gZHVlIHRvIHRoZSByZXR1cm5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgICAgIC8vIGlmIHdlIGFyZSBuYXZpZ2F0aW5nIHRvIGEgZG9tYWluIGxvY2FsZSBlbnN1cmUgd2UgcmVkaXJlY3QgdG8gdGhlXG4gICAgICAgIC8vIGNvcnJlY3QgZG9tYWluXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZGlkTmF2aWdhdGUgJiZcbiAgICAgICAgICBkZXRlY3RlZERvbWFpbiAmJlxuICAgICAgICAgIHRoaXMuaXNMb2NhbGVEb21haW4gJiZcbiAgICAgICAgICBzZWxmLmxvY2F0aW9uLmhvc3RuYW1lICE9PSBkZXRlY3RlZERvbWFpbi5kb21haW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgYXNOb0Jhc2VQYXRoID0gZGVsQmFzZVBhdGgoYXMpXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgaHR0cCR7ZGV0ZWN0ZWREb21haW4uaHR0cCA/ICcnIDogJ3MnfTovLyR7XG4gICAgICAgICAgICBkZXRlY3RlZERvbWFpbi5kb21haW5cbiAgICAgICAgICB9JHthZGRCYXNlUGF0aChcbiAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICB0aGlzLmxvY2FsZSA9PT0gZGV0ZWN0ZWREb21haW4uZGVmYXVsdExvY2FsZVxuICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICA6IGAvJHt0aGlzLmxvY2FsZX1gXG4gICAgICAgICAgICB9JHthc05vQmFzZVBhdGggPT09ICcvJyA/ICcnIDogYXNOb0Jhc2VQYXRofWAgfHwgJy8nXG4gICAgICAgICAgKX1gXG4gICAgICAgICAgLy8gdGhpcyB3YXMgcHJldmlvdXNseSBhIHJldHVybiBidXQgd2FzIHJlbW92ZWQgaW4gZmF2b3JcbiAgICAgICAgICAvLyBvZiBiZXR0ZXIgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdpdGggcmVnZW5lcmF0b3IgcnVudGltZVxuICAgICAgICAgIGRpZE5hdmlnYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkaWROYXZpZ2F0ZSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4ge30pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCEob3B0aW9ucyBhcyBhbnkpLl9oKSB7XG4gICAgICB0aGlzLmlzU3NyID0gZmFsc2VcbiAgICB9XG4gICAgLy8gbWFya2luZyByb3V0ZSBjaGFuZ2VzIGFzIGEgbmF2aWdhdGlvbiBzdGFydCBlbnRyeVxuICAgIGlmIChTVCkge1xuICAgICAgcGVyZm9ybWFuY2UubWFyaygncm91dGVDaGFuZ2UnKVxuICAgIH1cblxuICAgIGNvbnN0IHsgc2hhbGxvdyA9IGZhbHNlIH0gPSBvcHRpb25zXG4gICAgY29uc3Qgcm91dGVQcm9wcyA9IHsgc2hhbGxvdyB9XG5cbiAgICBpZiAodGhpcy5faW5GbGlnaHRSb3V0ZSkge1xuICAgICAgdGhpcy5hYm9ydENvbXBvbmVudExvYWQodGhpcy5faW5GbGlnaHRSb3V0ZSwgcm91dGVQcm9wcylcbiAgICB9XG5cbiAgICBhcyA9IGFkZEJhc2VQYXRoKFxuICAgICAgYWRkTG9jYWxlKFxuICAgICAgICBoYXNCYXNlUGF0aChhcykgPyBkZWxCYXNlUGF0aChhcykgOiBhcyxcbiAgICAgICAgb3B0aW9ucy5sb2NhbGUsXG4gICAgICAgIHRoaXMuZGVmYXVsdExvY2FsZVxuICAgICAgKVxuICAgIClcbiAgICBjb25zdCBjbGVhbmVkQXMgPSBkZWxMb2NhbGUoXG4gICAgICBoYXNCYXNlUGF0aChhcykgPyBkZWxCYXNlUGF0aChhcykgOiBhcyxcbiAgICAgIHRoaXMubG9jYWxlXG4gICAgKVxuICAgIHRoaXMuX2luRmxpZ2h0Um91dGUgPSBhc1xuXG4gICAgLy8gSWYgdGhlIHVybCBjaGFuZ2UgaXMgb25seSByZWxhdGVkIHRvIGEgaGFzaCBjaGFuZ2VcbiAgICAvLyBXZSBzaG91bGQgbm90IHByb2NlZWQuIFdlIHNob3VsZCBvbmx5IGNoYW5nZSB0aGUgc3RhdGUuXG5cbiAgICAvLyBXQVJOSU5HOiBgX2hgIGlzIGFuIGludGVybmFsIG9wdGlvbiBmb3IgaGFuZGluZyBOZXh0LmpzIGNsaWVudC1zaWRlXG4gICAgLy8gaHlkcmF0aW9uLiBZb3VyIGFwcCBzaG91bGQgX25ldmVyXyB1c2UgdGhpcyBwcm9wZXJ0eS4gSXQgbWF5IGNoYW5nZSBhdFxuICAgIC8vIGFueSB0aW1lIHdpdGhvdXQgbm90aWNlLlxuICAgIGlmICghKG9wdGlvbnMgYXMgYW55KS5faCAmJiB0aGlzLm9ubHlBSGFzaENoYW5nZShjbGVhbmVkQXMpKSB7XG4gICAgICB0aGlzLmFzUGF0aCA9IGNsZWFuZWRBc1xuICAgICAgUm91dGVyLmV2ZW50cy5lbWl0KCdoYXNoQ2hhbmdlU3RhcnQnLCBhcywgcm91dGVQcm9wcylcbiAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdGhlIHJlc29sdmVkIGhyZWYgd2hlbiBvbmx5IGEgaGFzaCBjaGFuZ2U/XG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKG1ldGhvZCwgdXJsLCBhcywgb3B0aW9ucylcbiAgICAgIHRoaXMuc2Nyb2xsVG9IYXNoKGNsZWFuZWRBcylcbiAgICAgIHRoaXMubm90aWZ5KHRoaXMuY29tcG9uZW50c1t0aGlzLnJvdXRlXSwgbnVsbClcbiAgICAgIFJvdXRlci5ldmVudHMuZW1pdCgnaGFzaENoYW5nZUNvbXBsZXRlJywgYXMsIHJvdXRlUHJvcHMpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGxldCBwYXJzZWQgPSBwYXJzZVJlbGF0aXZlVXJsKHVybClcbiAgICBsZXQgeyBwYXRobmFtZSwgcXVlcnkgfSA9IHBhcnNlZFxuXG4gICAgLy8gVGhlIGJ1aWxkIG1hbmlmZXN0IG5lZWRzIHRvIGJlIGxvYWRlZCBiZWZvcmUgYXV0by1zdGF0aWMgZHluYW1pYyBwYWdlc1xuICAgIC8vIGdldCB0aGVpciBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFsbG93IGVuc3VyaW5nIHRoZXkgY2FuIGJlIHBhcnNlZCBwcm9wZXJseVxuICAgIC8vIHdoZW4gcmV3cml0dGVuIHRvXG4gICAgbGV0IHBhZ2VzOiBhbnksIHJld3JpdGVzOiBhbnlcbiAgICB0cnkge1xuICAgICAgcGFnZXMgPSBhd2FpdCB0aGlzLnBhZ2VMb2FkZXIuZ2V0UGFnZUxpc3QoKVxuICAgICAgOyh7IF9fcmV3cml0ZXM6IHJld3JpdGVzIH0gPSBhd2FpdCBnZXRDbGllbnRCdWlsZE1hbmlmZXN0KCkpXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiB3ZSBmYWlsIHRvIHJlc29sdmUgdGhlIHBhZ2UgbGlzdCBvciBjbGllbnQtYnVpbGQgbWFuaWZlc3QsIHdlIG11c3RcbiAgICAgIC8vIGRvIGEgc2VydmVyLXNpZGUgdHJhbnNpdGlvbjpcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXNcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIElmIGFza2VkIHRvIGNoYW5nZSB0aGUgY3VycmVudCBVUkwgd2Ugc2hvdWxkIHJlbG9hZCB0aGUgY3VycmVudCBwYWdlXG4gICAgLy8gKG5vdCBsb2NhdGlvbi5yZWxvYWQoKSBidXQgcmVsb2FkIGdldEluaXRpYWxQcm9wcyBhbmQgb3RoZXIgTmV4dC5qcyBzdHVmZnMpXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIHNldCB0aGUgbWV0aG9kID0gcmVwbGFjZVN0YXRlIGFsd2F5c1xuICAgIC8vIGFzIHRoaXMgc2hvdWxkIG5vdCBnbyBpbnRvIHRoZSBoaXN0b3J5IChUaGF0J3MgaG93IGJyb3dzZXJzIHdvcmspXG4gICAgLy8gV2Ugc2hvdWxkIGNvbXBhcmUgdGhlIG5ldyBhc1BhdGggdG8gdGhlIGN1cnJlbnQgYXNQYXRoLCBub3QgdGhlIHVybFxuICAgIGlmICghdGhpcy51cmxJc05ldyhjbGVhbmVkQXMpICYmICFsb2NhbGVDaGFuZ2UpIHtcbiAgICAgIG1ldGhvZCA9ICdyZXBsYWNlU3RhdGUnXG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byByZXNvbHZlIHRoZSBhcyB2YWx1ZSB1c2luZyByZXdyaXRlcyBmb3IgZHluYW1pYyBTU0dcbiAgICAvLyBwYWdlcyB0byBhbGxvdyBidWlsZGluZyB0aGUgZGF0YSBVUkwgY29ycmVjdGx5XG4gICAgbGV0IHJlc29sdmVkQXMgPSBhc1xuXG4gICAgLy8gdXJsIGFuZCBhcyBzaG91bGQgYWx3YXlzIGJlIHByZWZpeGVkIHdpdGggYmFzZVBhdGggYnkgdGhpc1xuICAgIC8vIHBvaW50IGJ5IGVpdGhlciBuZXh0L2xpbmsgb3Igcm91dGVyLnB1c2gvcmVwbGFjZSBzbyBzdHJpcCB0aGVcbiAgICAvLyBiYXNlUGF0aCBmcm9tIHRoZSBwYXRobmFtZSB0byBtYXRjaCB0aGUgcGFnZXMgZGlyIDEtdG8tMVxuICAgIHBhdGhuYW1lID0gcGF0aG5hbWVcbiAgICAgID8gcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2goZGVsQmFzZVBhdGgocGF0aG5hbWUpKVxuICAgICAgOiBwYXRobmFtZVxuXG4gICAgaWYgKHBhdGhuYW1lICE9PSAnL19lcnJvcicpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSEFTX1JFV1JJVEVTICYmIGFzLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICBjb25zdCByZXdyaXRlc1Jlc3VsdCA9IHJlc29sdmVSZXdyaXRlcyhcbiAgICAgICAgICBhZGRCYXNlUGF0aChhZGRMb2NhbGUoZGVsQmFzZVBhdGgoYXMpLCB0aGlzLmxvY2FsZSkpLFxuICAgICAgICAgIHBhZ2VzLFxuICAgICAgICAgIHJld3JpdGVzLFxuICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgIChwOiBzdHJpbmcpID0+IHJlc29sdmVEeW5hbWljUm91dGUocCwgcGFnZXMpLFxuICAgICAgICAgIHRoaXMubG9jYWxlc1xuICAgICAgICApXG4gICAgICAgIHJlc29sdmVkQXMgPSByZXdyaXRlc1Jlc3VsdC5hc1BhdGhcblxuICAgICAgICBpZiAocmV3cml0ZXNSZXN1bHQubWF0Y2hlZFBhZ2UgJiYgcmV3cml0ZXNSZXN1bHQucmVzb2x2ZWRIcmVmKSB7XG4gICAgICAgICAgLy8gaWYgdGhpcyBkaXJlY3RseSBtYXRjaGVzIGEgcGFnZSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaHJlZiB0b1xuICAgICAgICAgIC8vIGFsbG93IHRoZSBjb3JyZWN0IHBhZ2UgY2h1bmsgdG8gYmUgbG9hZGVkXG4gICAgICAgICAgcGF0aG5hbWUgPSByZXdyaXRlc1Jlc3VsdC5yZXNvbHZlZEhyZWZcbiAgICAgICAgICBwYXJzZWQucGF0aG5hbWUgPSBwYXRobmFtZVxuICAgICAgICAgIHVybCA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKHBhcnNlZClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkLnBhdGhuYW1lID0gcmVzb2x2ZUR5bmFtaWNSb3V0ZShwYXRobmFtZSwgcGFnZXMpXG5cbiAgICAgICAgaWYgKHBhcnNlZC5wYXRobmFtZSAhPT0gcGF0aG5hbWUpIHtcbiAgICAgICAgICBwYXRobmFtZSA9IHBhcnNlZC5wYXRobmFtZVxuICAgICAgICAgIHVybCA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKHBhcnNlZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlID0gcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2gocGF0aG5hbWUpXG5cbiAgICBpZiAoIWlzTG9jYWxVUkwoYXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgaHJlZjogXCIke3VybH1cIiBhbmQgYXM6IFwiJHthc31cIiwgcmVjZWl2ZWQgcmVsYXRpdmUgaHJlZiBhbmQgZXh0ZXJuYWwgYXNgICtcbiAgICAgICAgICAgIGBcXG5TZWUgbW9yZSBpbmZvOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9tZXNzYWdlcy9pbnZhbGlkLXJlbGF0aXZlLXVybC1leHRlcm5hbC1hc2BcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGFzXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXNvbHZlZEFzID0gZGVsTG9jYWxlKGRlbEJhc2VQYXRoKHJlc29sdmVkQXMpLCB0aGlzLmxvY2FsZSlcblxuICAgIGlmIChpc0R5bmFtaWNSb3V0ZShyb3V0ZSkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEFzID0gcGFyc2VSZWxhdGl2ZVVybChyZXNvbHZlZEFzKVxuICAgICAgY29uc3QgYXNQYXRobmFtZSA9IHBhcnNlZEFzLnBhdGhuYW1lXG5cbiAgICAgIGNvbnN0IHJvdXRlUmVnZXggPSBnZXRSb3V0ZVJlZ2V4KHJvdXRlKVxuICAgICAgY29uc3Qgcm91dGVNYXRjaCA9IGdldFJvdXRlTWF0Y2hlcihyb3V0ZVJlZ2V4KShhc1BhdGhuYW1lKVxuICAgICAgY29uc3Qgc2hvdWxkSW50ZXJwb2xhdGUgPSByb3V0ZSA9PT0gYXNQYXRobmFtZVxuICAgICAgY29uc3QgaW50ZXJwb2xhdGVkQXMgPSBzaG91bGRJbnRlcnBvbGF0ZVxuICAgICAgICA/IGludGVycG9sYXRlQXMocm91dGUsIGFzUGF0aG5hbWUsIHF1ZXJ5KVxuICAgICAgICA6ICh7fSBhcyB7IHJlc3VsdDogdW5kZWZpbmVkOyBwYXJhbXM6IHVuZGVmaW5lZCB9KVxuXG4gICAgICBpZiAoIXJvdXRlTWF0Y2ggfHwgKHNob3VsZEludGVycG9sYXRlICYmICFpbnRlcnBvbGF0ZWRBcy5yZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IG1pc3NpbmdQYXJhbXMgPSBPYmplY3Qua2V5cyhyb3V0ZVJlZ2V4Lmdyb3VwcykuZmlsdGVyKFxuICAgICAgICAgIChwYXJhbSkgPT4gIXF1ZXJ5W3BhcmFtXVxuICAgICAgICApXG5cbiAgICAgICAgaWYgKG1pc3NpbmdQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGAke1xuICAgICAgICAgICAgICAgIHNob3VsZEludGVycG9sYXRlXG4gICAgICAgICAgICAgICAgICA/IGBJbnRlcnBvbGF0aW5nIGhyZWZgXG4gICAgICAgICAgICAgICAgICA6IGBNaXNtYXRjaGluZyBcXGBhc1xcYCBhbmQgXFxgaHJlZlxcYGBcbiAgICAgICAgICAgICAgfSBmYWlsZWQgdG8gbWFudWFsbHkgcHJvdmlkZSBgICtcbiAgICAgICAgICAgICAgICBgdGhlIHBhcmFtczogJHttaXNzaW5nUGFyYW1zLmpvaW4oXG4gICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgKX0gaW4gdGhlIFxcYGhyZWZcXGAncyBcXGBxdWVyeVxcYGBcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAoc2hvdWxkSW50ZXJwb2xhdGVcbiAgICAgICAgICAgICAgPyBgVGhlIHByb3ZpZGVkIFxcYGhyZWZcXGAgKCR7dXJsfSkgdmFsdWUgaXMgbWlzc2luZyBxdWVyeSB2YWx1ZXMgKCR7bWlzc2luZ1BhcmFtcy5qb2luKFxuICAgICAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgICAgICl9KSB0byBiZSBpbnRlcnBvbGF0ZWQgcHJvcGVybHkuIGBcbiAgICAgICAgICAgICAgOiBgVGhlIHByb3ZpZGVkIFxcYGFzXFxgIHZhbHVlICgke2FzUGF0aG5hbWV9KSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgXFxgaHJlZlxcYCB2YWx1ZSAoJHtyb3V0ZX0pLiBgKSArXG4gICAgICAgICAgICAgIGBSZWFkIG1vcmU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzLyR7XG4gICAgICAgICAgICAgICAgc2hvdWxkSW50ZXJwb2xhdGVcbiAgICAgICAgICAgICAgICAgID8gJ2hyZWYtaW50ZXJwb2xhdGlvbi1mYWlsZWQnXG4gICAgICAgICAgICAgICAgICA6ICdpbmNvbXBhdGlibGUtaHJlZi1hcydcbiAgICAgICAgICAgICAgfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2hvdWxkSW50ZXJwb2xhdGUpIHtcbiAgICAgICAgYXMgPSBmb3JtYXRXaXRoVmFsaWRhdGlvbihcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBwYXJzZWRBcywge1xuICAgICAgICAgICAgcGF0aG5hbWU6IGludGVycG9sYXRlZEFzLnJlc3VsdCxcbiAgICAgICAgICAgIHF1ZXJ5OiBvbWl0UGFybXNGcm9tUXVlcnkocXVlcnksIGludGVycG9sYXRlZEFzLnBhcmFtcyEpLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE1lcmdlIHBhcmFtcyBpbnRvIGBxdWVyeWAsIG92ZXJ3cml0aW5nIGFueSBzcGVjaWZpZWQgaW4gc2VhcmNoXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocXVlcnksIHJvdXRlTWF0Y2gpXG4gICAgICB9XG4gICAgfVxuXG4gICAgUm91dGVyLmV2ZW50cy5lbWl0KCdyb3V0ZUNoYW5nZVN0YXJ0JywgYXMsIHJvdXRlUHJvcHMpXG5cbiAgICB0cnkge1xuICAgICAgbGV0IHJvdXRlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0Um91dGVJbmZvKFxuICAgICAgICByb3V0ZSxcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBhcyxcbiAgICAgICAgcmVzb2x2ZWRBcyxcbiAgICAgICAgcm91dGVQcm9wc1xuICAgICAgKVxuICAgICAgbGV0IHsgZXJyb3IsIHByb3BzLCBfX05fU1NHLCBfX05fU1NQIH0gPSByb3V0ZUluZm9cblxuICAgICAgLy8gaGFuZGxlIHJlZGlyZWN0IG9uIGNsaWVudC10cmFuc2l0aW9uXG4gICAgICBpZiAoKF9fTl9TU0cgfHwgX19OX1NTUCkgJiYgcHJvcHMpIHtcbiAgICAgICAgaWYgKChwcm9wcyBhcyBhbnkpLnBhZ2VQcm9wcyAmJiAocHJvcHMgYXMgYW55KS5wYWdlUHJvcHMuX19OX1JFRElSRUNUKSB7XG4gICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSAocHJvcHMgYXMgYW55KS5wYWdlUHJvcHMuX19OX1JFRElSRUNUXG5cbiAgICAgICAgICAvLyBjaGVjayBpZiBkZXN0aW5hdGlvbiBpcyBpbnRlcm5hbCAocmVzb2x2ZXMgdG8gYSBwYWdlKSBhbmQgYXR0ZW1wdFxuICAgICAgICAgIC8vIGNsaWVudC1uYXZpZ2F0aW9uIGlmIGl0IGlzIGZhbGxpbmcgYmFjayB0byBoYXJkIG5hdmlnYXRpb24gaWZcbiAgICAgICAgICAvLyBpdCdzIG5vdFxuICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEhyZWYgPSBwYXJzZVJlbGF0aXZlVXJsKGRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgcGFyc2VkSHJlZi5wYXRobmFtZSA9IHJlc29sdmVEeW5hbWljUm91dGUoXG4gICAgICAgICAgICAgIHBhcnNlZEhyZWYucGF0aG5hbWUsXG4gICAgICAgICAgICAgIHBhZ2VzXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGlmIChwYWdlcy5pbmNsdWRlcyhwYXJzZWRIcmVmLnBhdGhuYW1lKSkge1xuICAgICAgICAgICAgICBjb25zdCB7IHVybDogbmV3VXJsLCBhczogbmV3QXMgfSA9IHByZXBhcmVVcmxBcyhcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlKG1ldGhvZCwgbmV3VXJsLCBuZXdBcywgb3B0aW9ucylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRlc3RpbmF0aW9uXG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgpID0+IHt9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1ByZXZpZXcgPSAhIXByb3BzLl9fTl9QUkVWSUVXXG5cbiAgICAgICAgLy8gaGFuZGxlIFNTRyBkYXRhIDQwNFxuICAgICAgICBpZiAocHJvcHMubm90Rm91bmQgPT09IFNTR19EQVRBX05PVF9GT1VORCkge1xuICAgICAgICAgIGxldCBub3RGb3VuZFJvdXRlXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbXBvbmVudCgnLzQwNCcpXG4gICAgICAgICAgICBub3RGb3VuZFJvdXRlID0gJy80MDQnXG4gICAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgICAgbm90Rm91bmRSb3V0ZSA9ICcvX2Vycm9yJ1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdXRlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0Um91dGVJbmZvKFxuICAgICAgICAgICAgbm90Rm91bmRSb3V0ZSxcbiAgICAgICAgICAgIG5vdEZvdW5kUm91dGUsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgIGFzLFxuICAgICAgICAgICAgcmVzb2x2ZWRBcyxcbiAgICAgICAgICAgIHsgc2hhbGxvdzogZmFsc2UgfVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBSb3V0ZXIuZXZlbnRzLmVtaXQoJ2JlZm9yZUhpc3RvcnlDaGFuZ2UnLCBhcywgcm91dGVQcm9wcylcbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUobWV0aG9kLCB1cmwsIGFzLCBvcHRpb25zKVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjb25zdCBhcHBDb21wOiBhbnkgPSB0aGlzLmNvbXBvbmVudHNbJy9fYXBwJ10uQ29tcG9uZW50XG4gICAgICAgIDsod2luZG93IGFzIGFueSkubmV4dC5pc1ByZXJlbmRlcmVkID1cbiAgICAgICAgICBhcHBDb21wLmdldEluaXRpYWxQcm9wcyA9PT0gYXBwQ29tcC5vcmlnR2V0SW5pdGlhbFByb3BzICYmXG4gICAgICAgICAgIShyb3V0ZUluZm8uQ29tcG9uZW50IGFzIGFueSkuZ2V0SW5pdGlhbFByb3BzXG4gICAgICB9XG5cbiAgICAgIC8vIHNoYWxsb3cgcm91dGluZyBpcyBvbmx5IGFsbG93ZWQgZm9yIHNhbWUgcGFnZSBVUkwgY2hhbmdlcy5cbiAgICAgIGNvbnN0IGlzVmFsaWRTaGFsbG93Um91dGUgPSBvcHRpb25zLnNoYWxsb3cgJiYgdGhpcy5yb3V0ZSA9PT0gcm91dGVcblxuICAgICAgaWYgKFxuICAgICAgICAob3B0aW9ucyBhcyBhbnkpLl9oICYmXG4gICAgICAgIHBhdGhuYW1lID09PSAnL19lcnJvcicgJiZcbiAgICAgICAgc2VsZi5fX05FWFRfREFUQV9fLnByb3BzPy5wYWdlUHJvcHM/LnN0YXR1c0NvZGUgPT09IDUwMCAmJlxuICAgICAgICBwcm9wcz8ucGFnZVByb3BzXG4gICAgICApIHtcbiAgICAgICAgLy8gZW5zdXJlIHN0YXR1c0NvZGUgaXMgc3RpbGwgY29ycmVjdCBmb3Igc3RhdGljIDUwMCBwYWdlXG4gICAgICAgIC8vIHdoZW4gdXBkYXRpbmcgcXVlcnkgaW5mb3JtYXRpb25cbiAgICAgICAgcHJvcHMucGFnZVByb3BzLnN0YXR1c0NvZGUgPSA1MDBcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zZXQoXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBwYXRobmFtZSEsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBjbGVhbmVkQXMsXG4gICAgICAgIHJvdXRlSW5mbyxcbiAgICAgICAgZm9yY2VkU2Nyb2xsIHx8XG4gICAgICAgICAgKGlzVmFsaWRTaGFsbG93Um91dGUgfHwgIW9wdGlvbnMuc2Nyb2xsID8gbnVsbCA6IHsgeDogMCwgeTogMCB9KVxuICAgICAgKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBpZiAoZS5jYW5jZWxsZWQpIGVycm9yID0gZXJyb3IgfHwgZVxuICAgICAgICBlbHNlIHRocm93IGVcbiAgICAgIH0pXG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBSb3V0ZXIuZXZlbnRzLmVtaXQoJ3JvdXRlQ2hhbmdlRXJyb3InLCBlcnJvciwgY2xlYW5lZEFzLCByb3V0ZVByb3BzKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgICAgICBpZiAodGhpcy5sb2NhbGUpIHtcbiAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyA9IHRoaXMubG9jYWxlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFJvdXRlci5ldmVudHMuZW1pdCgncm91dGVDaGFuZ2VDb21wbGV0ZScsIGFzLCByb3V0ZVByb3BzKVxuXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jYW5jZWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VTdGF0ZShcbiAgICBtZXRob2Q6IEhpc3RvcnlNZXRob2QsXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYXM6IHN0cmluZyxcbiAgICBvcHRpb25zOiBUcmFuc2l0aW9uT3B0aW9ucyA9IHt9XG4gICk6IHZvaWQge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5oaXN0b3J5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiB3aW5kb3cuaGlzdG9yeSBpcyBub3QgYXZhaWxhYmxlLmApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5oaXN0b3J5W21ldGhvZF0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdhcm5pbmc6IHdpbmRvdy5oaXN0b3J5LiR7bWV0aG9kfSBpcyBub3QgYXZhaWxhYmxlYClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCAhPT0gJ3B1c2hTdGF0ZScgfHwgZ2V0VVJMKCkgIT09IGFzKSB7XG4gICAgICB0aGlzLl9zaGFsbG93ID0gb3B0aW9ucy5zaGFsbG93XG4gICAgICB3aW5kb3cuaGlzdG9yeVttZXRob2RdKFxuICAgICAgICB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIGFzLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgX19OOiB0cnVlLFxuICAgICAgICAgIGlkeDogdGhpcy5faWR4ID0gbWV0aG9kICE9PSAncHVzaFN0YXRlJyA/IHRoaXMuX2lkeCA6IHRoaXMuX2lkeCArIDEsXG4gICAgICAgIH0gYXMgSGlzdG9yeVN0YXRlLFxuICAgICAgICAvLyBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyLCBhbHRob3VnaCB0aGV5IG1heSB1c2UgaXQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgICAgLy8gUGFzc2luZyB0aGUgZW1wdHkgc3RyaW5nIGhlcmUgc2hvdWxkIGJlIHNhZmUgYWdhaW5zdCBmdXR1cmUgY2hhbmdlcyB0byB0aGUgbWV0aG9kLlxuICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSGlzdG9yeS9yZXBsYWNlU3RhdGVcbiAgICAgICAgJycsXG4gICAgICAgIGFzXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFuZGxlUm91dGVJbmZvRXJyb3IoXG4gICAgZXJyOiBFcnJvciAmIHsgY29kZTogYW55OyBjYW5jZWxsZWQ6IGJvb2xlYW4gfSxcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICAgIHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeSxcbiAgICBhczogc3RyaW5nLFxuICAgIHJvdXRlUHJvcHM6IFJvdXRlUHJvcGVydGllcyxcbiAgICBsb2FkRXJyb3JGYWlsPzogYm9vbGVhblxuICApOiBQcm9taXNlPENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mbz4ge1xuICAgIGlmIChlcnIuY2FuY2VsbGVkKSB7XG4gICAgICAvLyBidWJibGUgdXAgY2FuY2VsbGF0aW9uIGVycm9yc1xuICAgICAgdGhyb3cgZXJyXG4gICAgfVxuXG4gICAgaWYgKGlzQXNzZXRFcnJvcihlcnIpIHx8IGxvYWRFcnJvckZhaWwpIHtcbiAgICAgIFJvdXRlci5ldmVudHMuZW1pdCgncm91dGVDaGFuZ2VFcnJvcicsIGVyciwgYXMsIHJvdXRlUHJvcHMpXG5cbiAgICAgIC8vIElmIHdlIGNhbid0IGxvYWQgdGhlIHBhZ2UgaXQgY291bGQgYmUgb25lIG9mIGZvbGxvd2luZyByZWFzb25zXG4gICAgICAvLyAgMS4gUGFnZSBkb2Vzbid0IGV4aXN0c1xuICAgICAgLy8gIDIuIFBhZ2UgZG9lcyBleGlzdCBpbiBhIGRpZmZlcmVudCB6b25lXG4gICAgICAvLyAgMy4gSW50ZXJuYWwgZXJyb3Igd2hpbGUgbG9hZGluZyB0aGUgcGFnZVxuXG4gICAgICAvLyBTbywgZG9pbmcgYSBoYXJkIHJlbG9hZCBpcyB0aGUgcHJvcGVyIHdheSB0byBkZWFsIHdpdGggdGhpcy5cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXNcblxuICAgICAgLy8gQ2hhbmdpbmcgdGhlIFVSTCBkb2Vzbid0IGJsb2NrIGV4ZWN1dGluZyB0aGUgY3VycmVudCBjb2RlIHBhdGguXG4gICAgICAvLyBTbyBsZXQncyB0aHJvdyBhIGNhbmNlbGxhdGlvbiBlcnJvciBzdG9wIHRoZSByb3V0aW5nIGxvZ2ljLlxuICAgICAgdGhyb3cgYnVpbGRDYW5jZWxsYXRpb25FcnJvcigpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBDb21wb25lbnQ6IENvbXBvbmVudFR5cGVcbiAgICAgIGxldCBzdHlsZVNoZWV0czogU3R5bGVTaGVldFR1cGxlW11cbiAgICAgIGxldCBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBDb21wb25lbnQhID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2Ygc3R5bGVTaGVldHMhID09PSAndW5kZWZpbmVkJ1xuICAgICAgKSB7XG4gICAgICAgIDsoeyBwYWdlOiBDb21wb25lbnQsIHN0eWxlU2hlZXRzIH0gPSBhd2FpdCB0aGlzLmZldGNoQ29tcG9uZW50KFxuICAgICAgICAgICcvX2Vycm9yJ1xuICAgICAgICApKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByb3V0ZUluZm86IENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mbyA9IHtcbiAgICAgICAgcHJvcHMsXG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgc3R5bGVTaGVldHMsXG4gICAgICAgIGVycixcbiAgICAgICAgZXJyb3I6IGVycixcbiAgICAgIH1cblxuICAgICAgaWYgKCFyb3V0ZUluZm8ucHJvcHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByb3V0ZUluZm8ucHJvcHMgPSBhd2FpdCB0aGlzLmdldEluaXRpYWxQcm9wcyhDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIHBhdGhuYW1lLFxuICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgfSBhcyBhbnkpXG4gICAgICAgIH0gY2F0Y2ggKGdpcEVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGVycm9yIHBhZ2UgYGdldEluaXRpYWxQcm9wc2A6ICcsIGdpcEVycilcbiAgICAgICAgICByb3V0ZUluZm8ucHJvcHMgPSB7fVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByb3V0ZUluZm9cbiAgICB9IGNhdGNoIChyb3V0ZUluZm9FcnIpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZVJvdXRlSW5mb0Vycm9yKFxuICAgICAgICByb3V0ZUluZm9FcnIsXG4gICAgICAgIHBhdGhuYW1lLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgYXMsXG4gICAgICAgIHJvdXRlUHJvcHMsXG4gICAgICAgIHRydWVcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRSb3V0ZUluZm8oXG4gICAgcm91dGU6IHN0cmluZyxcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICAgIHF1ZXJ5OiBhbnksXG4gICAgYXM6IHN0cmluZyxcbiAgICByZXNvbHZlZEFzOiBzdHJpbmcsXG4gICAgcm91dGVQcm9wczogUm91dGVQcm9wZXJ0aWVzXG4gICk6IFByb21pc2U8UHJpdmF0ZVJvdXRlSW5mbz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGlzdGluZ1JvdXRlSW5mbzogUHJpdmF0ZVJvdXRlSW5mbyB8IHVuZGVmaW5lZCA9IHRoaXMuY29tcG9uZW50c1tcbiAgICAgICAgcm91dGVcbiAgICAgIF1cbiAgICAgIGlmIChyb3V0ZVByb3BzLnNoYWxsb3cgJiYgZXhpc3RpbmdSb3V0ZUluZm8gJiYgdGhpcy5yb3V0ZSA9PT0gcm91dGUpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nUm91dGVJbmZvXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhY2hlZFJvdXRlSW5mbzogQ29tcGxldGVQcml2YXRlUm91dGVJbmZvIHwgdW5kZWZpbmVkID1cbiAgICAgICAgZXhpc3RpbmdSb3V0ZUluZm8gJiYgJ2luaXRpYWwnIGluIGV4aXN0aW5nUm91dGVJbmZvXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IGV4aXN0aW5nUm91dGVJbmZvXG4gICAgICBjb25zdCByb3V0ZUluZm86IENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mbyA9IGNhY2hlZFJvdXRlSW5mb1xuICAgICAgICA/IGNhY2hlZFJvdXRlSW5mb1xuICAgICAgICA6IGF3YWl0IHRoaXMuZmV0Y2hDb21wb25lbnQocm91dGUpLnRoZW4oKHJlcykgPT4gKHtcbiAgICAgICAgICAgIENvbXBvbmVudDogcmVzLnBhZ2UsXG4gICAgICAgICAgICBzdHlsZVNoZWV0czogcmVzLnN0eWxlU2hlZXRzLFxuICAgICAgICAgICAgX19OX1NTRzogcmVzLm1vZC5fX05fU1NHLFxuICAgICAgICAgICAgX19OX1NTUDogcmVzLm1vZC5fX05fU1NQLFxuICAgICAgICAgIH0pKVxuXG4gICAgICBjb25zdCB7IENvbXBvbmVudCwgX19OX1NTRywgX19OX1NTUCB9ID0gcm91dGVJbmZvXG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHsgaXNWYWxpZEVsZW1lbnRUeXBlIH0gPSByZXF1aXJlKCdyZWFjdC1pcycpXG4gICAgICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKENvbXBvbmVudCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIGRlZmF1bHQgZXhwb3J0IGlzIG5vdCBhIFJlYWN0IENvbXBvbmVudCBpbiBwYWdlOiBcIiR7cGF0aG5hbWV9XCJgXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBkYXRhSHJlZjogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgICAgIGlmIChfX05fU1NHIHx8IF9fTl9TU1ApIHtcbiAgICAgICAgZGF0YUhyZWYgPSB0aGlzLnBhZ2VMb2FkZXIuZ2V0RGF0YUhyZWYoXG4gICAgICAgICAgZm9ybWF0V2l0aFZhbGlkYXRpb24oeyBwYXRobmFtZSwgcXVlcnkgfSksXG4gICAgICAgICAgcmVzb2x2ZWRBcyxcbiAgICAgICAgICBfX05fU1NHLFxuICAgICAgICAgIHRoaXMubG9jYWxlXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcHMgPSBhd2FpdCB0aGlzLl9nZXREYXRhPENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mbz4oKCkgPT5cbiAgICAgICAgX19OX1NTR1xuICAgICAgICAgID8gdGhpcy5fZ2V0U3RhdGljRGF0YShkYXRhSHJlZiEpXG4gICAgICAgICAgOiBfX05fU1NQXG4gICAgICAgICAgPyB0aGlzLl9nZXRTZXJ2ZXJEYXRhKGRhdGFIcmVmISlcbiAgICAgICAgICA6IHRoaXMuZ2V0SW5pdGlhbFByb3BzKFxuICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgIC8vIHdlIHByb3ZpZGUgQXBwVHJlZSBsYXRlciBzbyB0aGlzIG5lZWRzIHRvIGJlIGBhbnlgXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgICBhc1BhdGg6IGFzLFxuICAgICAgICAgICAgICB9IGFzIGFueVxuICAgICAgICAgICAgKVxuICAgICAgKVxuXG4gICAgICByb3V0ZUluZm8ucHJvcHMgPSBwcm9wc1xuICAgICAgdGhpcy5jb21wb25lbnRzW3JvdXRlXSA9IHJvdXRlSW5mb1xuICAgICAgcmV0dXJuIHJvdXRlSW5mb1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUm91dGVJbmZvRXJyb3IoZXJyLCBwYXRobmFtZSwgcXVlcnksIGFzLCByb3V0ZVByb3BzKVxuICAgIH1cbiAgfVxuXG4gIHNldChcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5LFxuICAgIGFzOiBzdHJpbmcsXG4gICAgZGF0YTogUHJpdmF0ZVJvdXRlSW5mbyxcbiAgICByZXNldFNjcm9sbDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzRmFsbGJhY2sgPSBmYWxzZVxuXG4gICAgdGhpcy5yb3V0ZSA9IHJvdXRlXG4gICAgdGhpcy5wYXRobmFtZSA9IHBhdGhuYW1lXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5XG4gICAgdGhpcy5hc1BhdGggPSBhc1xuICAgIHJldHVybiB0aGlzLm5vdGlmeShkYXRhLCByZXNldFNjcm9sbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB0byBleGVjdXRlIGJlZm9yZSByZXBsYWNpbmcgcm91dGVyIHN0YXRlXG4gICAqIEBwYXJhbSBjYiBjYWxsYmFjayB0byBiZSBleGVjdXRlZFxuICAgKi9cbiAgYmVmb3JlUG9wU3RhdGUoY2I6IEJlZm9yZVBvcFN0YXRlQ2FsbGJhY2spIHtcbiAgICB0aGlzLl9icHMgPSBjYlxuICB9XG5cbiAgb25seUFIYXNoQ2hhbmdlKGFzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuYXNQYXRoKSByZXR1cm4gZmFsc2VcbiAgICBjb25zdCBbb2xkVXJsTm9IYXNoLCBvbGRIYXNoXSA9IHRoaXMuYXNQYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBbbmV3VXJsTm9IYXNoLCBuZXdIYXNoXSA9IGFzLnNwbGl0KCcjJylcblxuICAgIC8vIE1ha2VzIHN1cmUgd2Ugc2Nyb2xsIHRvIHRoZSBwcm92aWRlZCBoYXNoIGlmIHRoZSB1cmwvaGFzaCBhcmUgdGhlIHNhbWVcbiAgICBpZiAobmV3SGFzaCAmJiBvbGRVcmxOb0hhc2ggPT09IG5ld1VybE5vSGFzaCAmJiBvbGRIYXNoID09PSBuZXdIYXNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB1cmxzIGFyZSBjaGFuZ2UsIHRoZXJlJ3MgbW9yZSB0aGFuIGEgaGFzaCBjaGFuZ2VcbiAgICBpZiAob2xkVXJsTm9IYXNoICE9PSBuZXdVcmxOb0hhc2gpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBoYXNoIGhhcyBjaGFuZ2VkLCB0aGVuIGl0J3MgYSBoYXNoIG9ubHkgY2hhbmdlLlxuICAgIC8vIFRoaXMgY2hlY2sgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBib3RoIHRoZSBlbnRlciBhbmRcbiAgICAvLyBsZWF2ZSBoYXNoID09PSAnJyBjYXNlcy4gVGhlIGlkZW50aXR5IGNhc2UgZmFsbHMgdGhyb3VnaFxuICAgIC8vIGFuZCBpcyB0cmVhdGVkIGFzIGEgbmV4dCByZWxvYWQuXG4gICAgcmV0dXJuIG9sZEhhc2ggIT09IG5ld0hhc2hcbiAgfVxuXG4gIHNjcm9sbFRvSGFzaChhczogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgWywgaGFzaF0gPSBhcy5zcGxpdCgnIycpXG4gICAgLy8gU2Nyb2xsIHRvIHRvcCBpZiB0aGUgaGFzaCBpcyBqdXN0IGAjYCB3aXRoIG5vIHZhbHVlIG9yIGAjdG9wYFxuICAgIC8vIFRvIG1pcnJvciBicm93c2Vyc1xuICAgIGlmIChoYXNoID09PSAnJyB8fCBoYXNoID09PSAndG9wJykge1xuICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBGaXJzdCB3ZSBjaGVjayBpZiB0aGUgZWxlbWVudCBieSBpZCBpcyBmb3VuZFxuICAgIGNvbnN0IGlkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKVxuICAgIGlmIChpZEVsKSB7XG4gICAgICBpZEVsLnNjcm9sbEludG9WaWV3KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGVsZW1lbnQgd2l0aCB0aGUgaWQsIHdlIGNoZWNrIHRoZSBgbmFtZWAgcHJvcGVydHlcbiAgICAvLyBUbyBtaXJyb3IgYnJvd3NlcnNcbiAgICBjb25zdCBuYW1lRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZShoYXNoKVswXVxuICAgIGlmIChuYW1lRWwpIHtcbiAgICAgIG5hbWVFbC5zY3JvbGxJbnRvVmlldygpXG4gICAgfVxuICB9XG5cbiAgdXJsSXNOZXcoYXNQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hc1BhdGggIT09IGFzUGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIFByZWZldGNoIHBhZ2UgY29kZSwgeW91IG1heSB3YWl0IGZvciB0aGUgZGF0YSBkdXJpbmcgcGFnZSByZW5kZXJpbmcuXG4gICAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIGluIHByb2R1Y3Rpb24hXG4gICAqIEBwYXJhbSB1cmwgdGhlIGhyZWYgb2YgcHJlZmV0Y2hlZCBwYWdlXG4gICAqIEBwYXJhbSBhc1BhdGggdGhlIGFzIHBhdGggb2YgdGhlIHByZWZldGNoZWQgcGFnZVxuICAgKi9cbiAgYXN5bmMgcHJlZmV0Y2goXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYXNQYXRoOiBzdHJpbmcgPSB1cmwsXG4gICAgb3B0aW9uczogUHJlZmV0Y2hPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHBhcnNlZCA9IHBhcnNlUmVsYXRpdmVVcmwodXJsKVxuXG4gICAgbGV0IHsgcGF0aG5hbWUgfSA9IHBhcnNlZFxuXG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgICAgIGlmIChvcHRpb25zLmxvY2FsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aG5hbWUgPSBub3JtYWxpemVMb2NhbGVQYXRoIShwYXRobmFtZSwgdGhpcy5sb2NhbGVzKS5wYXRobmFtZVxuICAgICAgICBwYXJzZWQucGF0aG5hbWUgPSBwYXRobmFtZVxuICAgICAgICB1cmwgPSBmb3JtYXRXaXRoVmFsaWRhdGlvbihwYXJzZWQpXG5cbiAgICAgICAgbGV0IHBhcnNlZEFzID0gcGFyc2VSZWxhdGl2ZVVybChhc1BhdGgpXG4gICAgICAgIGNvbnN0IGxvY2FsZVBhdGhSZXN1bHQgPSBub3JtYWxpemVMb2NhbGVQYXRoIShcbiAgICAgICAgICBwYXJzZWRBcy5wYXRobmFtZSxcbiAgICAgICAgICB0aGlzLmxvY2FsZXNcbiAgICAgICAgKVxuICAgICAgICBwYXJzZWRBcy5wYXRobmFtZSA9IGxvY2FsZVBhdGhSZXN1bHQucGF0aG5hbWVcbiAgICAgICAgb3B0aW9ucy5sb2NhbGUgPSBsb2NhbGVQYXRoUmVzdWx0LmRldGVjdGVkTG9jYWxlIHx8IHRoaXMuZGVmYXVsdExvY2FsZVxuICAgICAgICBhc1BhdGggPSBmb3JtYXRXaXRoVmFsaWRhdGlvbihwYXJzZWRBcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYWdlcyA9IGF3YWl0IHRoaXMucGFnZUxvYWRlci5nZXRQYWdlTGlzdCgpXG4gICAgbGV0IHJlc29sdmVkQXMgPSBhc1BhdGhcblxuICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSEFTX1JFV1JJVEVTICYmIGFzUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgIGxldCByZXdyaXRlczogYW55XG4gICAgICA7KHsgX19yZXdyaXRlczogcmV3cml0ZXMgfSA9IGF3YWl0IGdldENsaWVudEJ1aWxkTWFuaWZlc3QoKSlcblxuICAgICAgY29uc3QgcmV3cml0ZXNSZXN1bHQgPSByZXNvbHZlUmV3cml0ZXMoXG4gICAgICAgIGFkZEJhc2VQYXRoKGFkZExvY2FsZShhc1BhdGgsIHRoaXMubG9jYWxlKSksXG4gICAgICAgIHBhZ2VzLFxuICAgICAgICByZXdyaXRlcyxcbiAgICAgICAgcGFyc2VkLnF1ZXJ5LFxuICAgICAgICAocDogc3RyaW5nKSA9PiByZXNvbHZlRHluYW1pY1JvdXRlKHAsIHBhZ2VzKSxcbiAgICAgICAgdGhpcy5sb2NhbGVzXG4gICAgICApXG4gICAgICByZXNvbHZlZEFzID0gZGVsTG9jYWxlKGRlbEJhc2VQYXRoKHJld3JpdGVzUmVzdWx0LmFzUGF0aCksIHRoaXMubG9jYWxlKVxuXG4gICAgICBpZiAocmV3cml0ZXNSZXN1bHQubWF0Y2hlZFBhZ2UgJiYgcmV3cml0ZXNSZXN1bHQucmVzb2x2ZWRIcmVmKSB7XG4gICAgICAgIC8vIGlmIHRoaXMgZGlyZWN0bHkgbWF0Y2hlcyBhIHBhZ2Ugd2UgbmVlZCB0byB1cGRhdGUgdGhlIGhyZWYgdG9cbiAgICAgICAgLy8gYWxsb3cgdGhlIGNvcnJlY3QgcGFnZSBjaHVuayB0byBiZSBsb2FkZWRcbiAgICAgICAgcGF0aG5hbWUgPSByZXdyaXRlc1Jlc3VsdC5yZXNvbHZlZEhyZWZcbiAgICAgICAgcGFyc2VkLnBhdGhuYW1lID0gcGF0aG5hbWVcbiAgICAgICAgdXJsID0gZm9ybWF0V2l0aFZhbGlkYXRpb24ocGFyc2VkKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZWQucGF0aG5hbWUgPSByZXNvbHZlRHluYW1pY1JvdXRlKHBhcnNlZC5wYXRobmFtZSwgcGFnZXMpXG5cbiAgICAgIGlmIChwYXJzZWQucGF0aG5hbWUgIT09IHBhdGhuYW1lKSB7XG4gICAgICAgIHBhdGhuYW1lID0gcGFyc2VkLnBhdGhuYW1lXG4gICAgICAgIHVybCA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKHBhcnNlZClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm91dGUgPSByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaChwYXRobmFtZSlcblxuICAgIC8vIFByZWZldGNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSBiZWNhdXNlIGl0IHdvdWxkIHRyaWdnZXIgb24tZGVtYW5kLWVudHJpZXNcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5wYWdlTG9hZGVyLl9pc1NzZyhyb3V0ZSkudGhlbigoaXNTc2c6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgcmV0dXJuIGlzU3NnXG4gICAgICAgICAgPyB0aGlzLl9nZXRTdGF0aWNEYXRhKFxuICAgICAgICAgICAgICB0aGlzLnBhZ2VMb2FkZXIuZ2V0RGF0YUhyZWYoXG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIHJlc29sdmVkQXMsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5sb2NhbGUgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICA/IG9wdGlvbnMubG9jYWxlXG4gICAgICAgICAgICAgICAgICA6IHRoaXMubG9jYWxlXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGZhbHNlXG4gICAgICB9KSxcbiAgICAgIHRoaXMucGFnZUxvYWRlcltvcHRpb25zLnByaW9yaXR5ID8gJ2xvYWRQYWdlJyA6ICdwcmVmZXRjaCddKHJvdXRlKSxcbiAgICBdKVxuICB9XG5cbiAgYXN5bmMgZmV0Y2hDb21wb25lbnQocm91dGU6IHN0cmluZyk6IFByb21pc2U8R29vZFBhZ2VDYWNoZT4ge1xuICAgIGxldCBjYW5jZWxsZWQgPSBmYWxzZVxuICAgIGNvbnN0IGNhbmNlbCA9ICh0aGlzLmNsYyA9ICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWVcbiAgICB9KVxuXG4gICAgY29uc3QgY29tcG9uZW50UmVzdWx0ID0gYXdhaXQgdGhpcy5wYWdlTG9hZGVyLmxvYWRQYWdlKHJvdXRlKVxuXG4gICAgaWYgKGNhbmNlbGxlZCkge1xuICAgICAgY29uc3QgZXJyb3I6IGFueSA9IG5ldyBFcnJvcihcbiAgICAgICAgYEFib3J0IGZldGNoaW5nIGNvbXBvbmVudCBmb3Igcm91dGU6IFwiJHtyb3V0ZX1cImBcbiAgICAgIClcbiAgICAgIGVycm9yLmNhbmNlbGxlZCA9IHRydWVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgaWYgKGNhbmNlbCA9PT0gdGhpcy5jbGMpIHtcbiAgICAgIHRoaXMuY2xjID0gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnRSZXN1bHRcbiAgfVxuXG4gIF9nZXREYXRhPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlXG4gICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZVxuICAgIH1cbiAgICB0aGlzLmNsYyA9IGNhbmNlbFxuICAgIHJldHVybiBmbigpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIGlmIChjYW5jZWwgPT09IHRoaXMuY2xjKSB7XG4gICAgICAgIHRoaXMuY2xjID0gbnVsbFxuICAgICAgfVxuXG4gICAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICAgIGNvbnN0IGVycjogYW55ID0gbmV3IEVycm9yKCdMb2FkaW5nIGluaXRpYWwgcHJvcHMgY2FuY2VsbGVkJylcbiAgICAgICAgZXJyLmNhbmNlbGxlZCA9IHRydWVcbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhXG4gICAgfSlcbiAgfVxuXG4gIF9nZXRTdGF0aWNEYXRhKGRhdGFIcmVmOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHsgaHJlZjogY2FjaGVLZXkgfSA9IG5ldyBVUkwoZGF0YUhyZWYsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICAgIGlmIChcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgJiZcbiAgICAgICF0aGlzLmlzUHJldmlldyAmJlxuICAgICAgdGhpcy5zZGNbY2FjaGVLZXldXG4gICAgKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2RjW2NhY2hlS2V5XSlcbiAgICB9XG4gICAgcmV0dXJuIGZldGNoTmV4dERhdGEoZGF0YUhyZWYsIHRoaXMuaXNTc3IpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuc2RjW2NhY2hlS2V5XSA9IGRhdGFcbiAgICAgIHJldHVybiBkYXRhXG4gICAgfSlcbiAgfVxuXG4gIF9nZXRTZXJ2ZXJEYXRhKGRhdGFIcmVmOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHsgaHJlZjogcmVzb3VyY2VLZXkgfSA9IG5ldyBVUkwoZGF0YUhyZWYsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICAgIGlmICh0aGlzLnNkcltyZXNvdXJjZUtleV0pIHtcbiAgICAgIHJldHVybiB0aGlzLnNkcltyZXNvdXJjZUtleV1cbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLnNkcltyZXNvdXJjZUtleV0gPSBmZXRjaE5leHREYXRhKGRhdGFIcmVmLCB0aGlzLmlzU3NyKVxuICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2RyW3Jlc291cmNlS2V5XVxuICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNkcltyZXNvdXJjZUtleV1cbiAgICAgICAgdGhyb3cgZXJyXG4gICAgICB9KSlcbiAgfVxuXG4gIGdldEluaXRpYWxQcm9wcyhcbiAgICBDb21wb25lbnQ6IENvbXBvbmVudFR5cGUsXG4gICAgY3R4OiBOZXh0UGFnZUNvbnRleHRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCB7IENvbXBvbmVudDogQXBwIH0gPSB0aGlzLmNvbXBvbmVudHNbJy9fYXBwJ11cbiAgICBjb25zdCBBcHBUcmVlID0gdGhpcy5fd3JhcEFwcChBcHAgYXMgQXBwQ29tcG9uZW50KVxuICAgIGN0eC5BcHBUcmVlID0gQXBwVHJlZVxuICAgIHJldHVybiBsb2FkR2V0SW5pdGlhbFByb3BzPEFwcENvbnRleHRUeXBlPFJvdXRlcj4+KEFwcCwge1xuICAgICAgQXBwVHJlZSxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIHJvdXRlcjogdGhpcyxcbiAgICAgIGN0eCxcbiAgICB9KVxuICB9XG5cbiAgYWJvcnRDb21wb25lbnRMb2FkKGFzOiBzdHJpbmcsIHJvdXRlUHJvcHM6IFJvdXRlUHJvcGVydGllcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNsYykge1xuICAgICAgUm91dGVyLmV2ZW50cy5lbWl0KFxuICAgICAgICAncm91dGVDaGFuZ2VFcnJvcicsXG4gICAgICAgIGJ1aWxkQ2FuY2VsbGF0aW9uRXJyb3IoKSxcbiAgICAgICAgYXMsXG4gICAgICAgIHJvdXRlUHJvcHNcbiAgICAgIClcbiAgICAgIHRoaXMuY2xjKClcbiAgICAgIHRoaXMuY2xjID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIG5vdGlmeShcbiAgICBkYXRhOiBQcml2YXRlUm91dGVJbmZvLFxuICAgIHJlc2V0U2Nyb2xsOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnN1YihcbiAgICAgIGRhdGEsXG4gICAgICB0aGlzLmNvbXBvbmVudHNbJy9fYXBwJ10uQ29tcG9uZW50IGFzIEFwcENvbXBvbmVudCxcbiAgICAgIHJlc2V0U2Nyb2xsXG4gICAgKVxuICB9XG59XG4iLCIvLyBGb3JtYXQgZnVuY3Rpb24gbW9kaWZpZWQgZnJvbSBub2RlanNcbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBVcmxPYmplY3QgfSBmcm9tICd1cmwnXG5pbXBvcnQgeyBQYXJzZWRVcmxRdWVyeSB9IGZyb20gJ3F1ZXJ5c3RyaW5nJ1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAnLi9xdWVyeXN0cmluZydcblxuY29uc3Qgc2xhc2hlZFByb3RvY29scyA9IC9odHRwcz98ZnRwfGdvcGhlcnxmaWxlL1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VXJsKHVybE9iajogVXJsT2JqZWN0KSB7XG4gIGxldCB7IGF1dGgsIGhvc3RuYW1lIH0gPSB1cmxPYmpcbiAgbGV0IHByb3RvY29sID0gdXJsT2JqLnByb3RvY29sIHx8ICcnXG4gIGxldCBwYXRobmFtZSA9IHVybE9iai5wYXRobmFtZSB8fCAnJ1xuICBsZXQgaGFzaCA9IHVybE9iai5oYXNoIHx8ICcnXG4gIGxldCBxdWVyeSA9IHVybE9iai5xdWVyeSB8fCAnJ1xuICBsZXQgaG9zdDogc3RyaW5nIHwgZmFsc2UgPSBmYWxzZVxuXG4gIGF1dGggPSBhdXRoID8gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpLnJlcGxhY2UoLyUzQS9pLCAnOicpICsgJ0AnIDogJydcblxuICBpZiAodXJsT2JqLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHVybE9iai5ob3N0XG4gIH0gZWxzZSBpZiAoaG9zdG5hbWUpIHtcbiAgICBob3N0ID0gYXV0aCArICh+aG9zdG5hbWUuaW5kZXhPZignOicpID8gYFske2hvc3RuYW1lfV1gIDogaG9zdG5hbWUpXG4gICAgaWYgKHVybE9iai5wb3J0KSB7XG4gICAgICBob3N0ICs9ICc6JyArIHVybE9iai5wb3J0XG4gICAgfVxuICB9XG5cbiAgaWYgKHF1ZXJ5ICYmIHR5cGVvZiBxdWVyeSA9PT0gJ29iamVjdCcpIHtcbiAgICBxdWVyeSA9IFN0cmluZyhxdWVyeXN0cmluZy51cmxRdWVyeVRvU2VhcmNoUGFyYW1zKHF1ZXJ5IGFzIFBhcnNlZFVybFF1ZXJ5KSlcbiAgfVxuXG4gIGxldCBzZWFyY2ggPSB1cmxPYmouc2VhcmNoIHx8IChxdWVyeSAmJiBgPyR7cXVlcnl9YCkgfHwgJydcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOidcblxuICBpZiAoXG4gICAgdXJsT2JqLnNsYXNoZXMgfHxcbiAgICAoKCFwcm90b2NvbCB8fCBzbGFzaGVkUHJvdG9jb2xzLnRlc3QocHJvdG9jb2wpKSAmJiBob3N0ICE9PSBmYWxzZSlcbiAgKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJylcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWVbMF0gIT09ICcvJykgcGF0aG5hbWUgPSAnLycgKyBwYXRobmFtZVxuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnXG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoWzBdICE9PSAnIycpIGhhc2ggPSAnIycgKyBoYXNoXG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoWzBdICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaFxuXG4gIHBhdGhuYW1lID0gcGF0aG5hbWUucmVwbGFjZSgvWz8jXS9nLCBlbmNvZGVVUklDb21wb25lbnQpXG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpXG5cbiAgcmV0dXJuIGAke3Byb3RvY29sfSR7aG9zdH0ke3BhdGhuYW1lfSR7c2VhcmNofSR7aGFzaH1gXG59XG4iLCIvLyBUcmFuc2xhdGVzIGEgbG9naWNhbCByb3V0ZSBpbnRvIGl0cyBwYWdlcyBhc3NldCBwYXRoIChyZWxhdGl2ZSBmcm9tIGEgY29tbW9uIHByZWZpeClcbi8vIFwiYXNzZXQgcGF0aFwiIGJlaW5nIGl0cyBqYXZhc2NyaXB0IGZpbGUsIGRhdGEgZmlsZSwgcHJlcmVuZGVyZWQgaHRtbCwuLi5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEFzc2V0UGF0aEZyb21Sb3V0ZShcbiAgcm91dGU6IHN0cmluZyxcbiAgZXh0OiBzdHJpbmcgPSAnJ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9XG4gICAgcm91dGUgPT09ICcvJ1xuICAgICAgPyAnL2luZGV4J1xuICAgICAgOiAvXlxcL2luZGV4KFxcL3wkKS8udGVzdChyb3V0ZSlcbiAgICAgID8gYC9pbmRleCR7cm91dGV9YFxuICAgICAgOiBgJHtyb3V0ZX1gXG4gIHJldHVybiBwYXRoICsgZXh0XG59XG4iLCIvLyBJZGVudGlmeSAvW3BhcmFtXS8gaW4gcm91dGUgc3RyaW5nXG5jb25zdCBURVNUX1JPVVRFID0gL1xcL1xcW1teL10rP1xcXSg/PVxcL3wkKS9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY1JvdXRlKHJvdXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIFRFU1RfUk9VVEUudGVzdChyb3V0ZSlcbn1cbiIsImltcG9ydCB7IGdldExvY2F0aW9uT3JpZ2luIH0gZnJvbSAnLi4vLi4vdXRpbHMnXG5pbXBvcnQgeyBzZWFyY2hQYXJhbXNUb1VybFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeXN0cmluZydcblxuLyoqXG4gKiBQYXJzZXMgcGF0aC1yZWxhdGl2ZSB1cmxzIChlLmcuIGAvaGVsbG8vd29ybGQ/Zm9vPWJhcmApLiBJZiB1cmwgaXNuJ3QgcGF0aC1yZWxhdGl2ZVxuICogKGUuZy4gYC4vaGVsbG9gKSB0aGVuIGF0IGxlYXN0IGJhc2UgbXVzdCBiZS5cbiAqIEFic29sdXRlIHVybHMgYXJlIHJlamVjdGVkIHdpdGggb25lIGV4Y2VwdGlvbiwgaW4gdGhlIGJyb3dzZXIsIGFic29sdXRlIHVybHMgdGhhdCBhcmUgb25cbiAqIHRoZSBjdXJyZW50IG9yaWdpbiB3aWxsIGJlIHBhcnNlZCBhcyByZWxhdGl2ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZWxhdGl2ZVVybCh1cmw6IHN0cmluZywgYmFzZT86IHN0cmluZykge1xuICBjb25zdCBnbG9iYWxCYXNlID0gbmV3IFVSTChcbiAgICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/ICdodHRwOi8vbicgOiBnZXRMb2NhdGlvbk9yaWdpbigpXG4gIClcbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gYmFzZSA/IG5ldyBVUkwoYmFzZSwgZ2xvYmFsQmFzZSkgOiBnbG9iYWxCYXNlXG4gIGNvbnN0IHsgcGF0aG5hbWUsIHNlYXJjaFBhcmFtcywgc2VhcmNoLCBoYXNoLCBocmVmLCBvcmlnaW4gfSA9IG5ldyBVUkwoXG4gICAgdXJsLFxuICAgIHJlc29sdmVkQmFzZVxuICApXG4gIGlmIChvcmlnaW4gIT09IGdsb2JhbEJhc2Uub3JpZ2luKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhcmlhbnQ6IGludmFsaWQgcmVsYXRpdmUgVVJMLCByb3V0ZXIgcmVjZWl2ZWQgJHt1cmx9YClcbiAgfVxuICByZXR1cm4ge1xuICAgIHBhdGhuYW1lLFxuICAgIHF1ZXJ5OiBzZWFyY2hQYXJhbXNUb1VybFF1ZXJ5KHNlYXJjaFBhcmFtcyksXG4gICAgc2VhcmNoLFxuICAgIGhhc2gsXG4gICAgaHJlZjogaHJlZi5zbGljZShnbG9iYWxCYXNlLm9yaWdpbi5sZW5ndGgpLFxuICB9XG59XG4iLCJpbXBvcnQgeyBQYXJzZWRVcmxRdWVyeSB9IGZyb20gJ3F1ZXJ5c3RyaW5nJ1xuXG5leHBvcnQgZnVuY3Rpb24gc2VhcmNoUGFyYW1zVG9VcmxRdWVyeShcbiAgc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXNcbik6IFBhcnNlZFVybFF1ZXJ5IHtcbiAgY29uc3QgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5ID0ge31cbiAgc2VhcmNoUGFyYW1zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICBpZiAodHlwZW9mIHF1ZXJ5W2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBxdWVyeVtrZXldID0gdmFsdWVcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocXVlcnlba2V5XSkpIHtcbiAgICAgIDsocXVlcnlba2V5XSBhcyBzdHJpbmdbXSkucHVzaCh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnlba2V5XSA9IFtxdWVyeVtrZXldIGFzIHN0cmluZywgdmFsdWVdXG4gICAgfVxuICB9KVxuICByZXR1cm4gcXVlcnlcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5VXJsUXVlcnlQYXJhbShwYXJhbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycgfHxcbiAgICAodHlwZW9mIHBhcmFtID09PSAnbnVtYmVyJyAmJiAhaXNOYU4ocGFyYW0pKSB8fFxuICAgIHR5cGVvZiBwYXJhbSA9PT0gJ2Jvb2xlYW4nXG4gICkge1xuICAgIHJldHVybiBTdHJpbmcocGFyYW0pXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVybFF1ZXJ5VG9TZWFyY2hQYXJhbXMoXG4gIHVybFF1ZXJ5OiBQYXJzZWRVcmxRdWVyeVxuKTogVVJMU2VhcmNoUGFyYW1zIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gIE9iamVjdC5lbnRyaWVzKHVybFF1ZXJ5KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW0pID0+IHJlc3VsdC5hcHBlbmQoa2V5LCBzdHJpbmdpZnlVcmxRdWVyeVBhcmFtKGl0ZW0pKSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnNldChrZXksIHN0cmluZ2lmeVVybFF1ZXJ5UGFyYW0odmFsdWUpKVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKFxuICB0YXJnZXQ6IFVSTFNlYXJjaFBhcmFtcyxcbiAgLi4uc2VhcmNoUGFyYW1zTGlzdDogVVJMU2VhcmNoUGFyYW1zW11cbik6IFVSTFNlYXJjaFBhcmFtcyB7XG4gIHNlYXJjaFBhcmFtc0xpc3QuZm9yRWFjaCgoc2VhcmNoUGFyYW1zKSA9PiB7XG4gICAgQXJyYXkuZnJvbShzZWFyY2hQYXJhbXMua2V5cygpKS5mb3JFYWNoKChrZXkpID0+IHRhcmdldC5kZWxldGUoa2V5KSlcbiAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gdGFyZ2V0LmFwcGVuZChrZXksIHZhbHVlKSlcbiAgfSlcbiAgcmV0dXJuIHRhcmdldFxufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVzb2x2ZVJld3JpdGVzKCkge31cbiIsImltcG9ydCB7IGdldFJvdXRlUmVnZXggfSBmcm9tICcuL3JvdXRlLXJlZ2V4J1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um91dGVNYXRjaGVyKHJvdXRlUmVnZXg6IFJldHVyblR5cGU8dHlwZW9mIGdldFJvdXRlUmVnZXg+KSB7XG4gIGNvbnN0IHsgcmUsIGdyb3VwcyB9ID0gcm91dGVSZWdleFxuICByZXR1cm4gKHBhdGhuYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3Qgcm91dGVNYXRjaCA9IHJlLmV4ZWMocGF0aG5hbWUhKVxuICAgIGlmICghcm91dGVNYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgZGVjb2RlID0gKHBhcmFtOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQocGFyYW0pXG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIGNvbnN0IGVycjogRXJyb3IgJiB7IGNvZGU/OiBzdHJpbmcgfSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAnZmFpbGVkIHRvIGRlY29kZSBwYXJhbSdcbiAgICAgICAgKVxuICAgICAgICBlcnIuY29kZSA9ICdERUNPREVfRkFJTEVEJ1xuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFyYW1zOiB7IFtwYXJhbU5hbWU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdIH0gPSB7fVxuXG4gICAgT2JqZWN0LmtleXMoZ3JvdXBzKS5mb3JFYWNoKChzbHVnTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBnID0gZ3JvdXBzW3NsdWdOYW1lXVxuICAgICAgY29uc3QgbSA9IHJvdXRlTWF0Y2hbZy5wb3NdXG4gICAgICBpZiAobSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcmFtc1tzbHVnTmFtZV0gPSB+bS5pbmRleE9mKCcvJylcbiAgICAgICAgICA/IG0uc3BsaXQoJy8nKS5tYXAoKGVudHJ5KSA9PiBkZWNvZGUoZW50cnkpKVxuICAgICAgICAgIDogZy5yZXBlYXRcbiAgICAgICAgICA/IFtkZWNvZGUobSldXG4gICAgICAgICAgOiBkZWNvZGUobSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxufVxuIiwiZXhwb3J0IGludGVyZmFjZSBHcm91cCB7XG4gIHBvczogbnVtYmVyXG4gIHJlcGVhdDogYm9vbGVhblxuICBvcHRpb25hbDogYm9vbGVhblxufVxuXG4vLyB0aGlzIGlzbid0IGltcG9ydGluZyB0aGUgZXNjYXBlLXN0cmluZy1yZWdleCBtb2R1bGVcbi8vIHRvIHJlZHVjZSBieXRlc1xuZnVuY3Rpb24gZXNjYXBlUmVnZXgoc3RyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bfFxcXFx7fSgpW1xcXV4kKyo/Li1dL2csICdcXFxcJCYnKVxufVxuXG5mdW5jdGlvbiBwYXJzZVBhcmFtZXRlcihwYXJhbTogc3RyaW5nKSB7XG4gIGNvbnN0IG9wdGlvbmFsID0gcGFyYW0uc3RhcnRzV2l0aCgnWycpICYmIHBhcmFtLmVuZHNXaXRoKCddJylcbiAgaWYgKG9wdGlvbmFsKSB7XG4gICAgcGFyYW0gPSBwYXJhbS5zbGljZSgxLCAtMSlcbiAgfVxuICBjb25zdCByZXBlYXQgPSBwYXJhbS5zdGFydHNXaXRoKCcuLi4nKVxuICBpZiAocmVwZWF0KSB7XG4gICAgcGFyYW0gPSBwYXJhbS5zbGljZSgzKVxuICB9XG4gIHJldHVybiB7IGtleTogcGFyYW0sIHJlcGVhdCwgb3B0aW9uYWwgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um91dGVSZWdleChcbiAgbm9ybWFsaXplZFJvdXRlOiBzdHJpbmdcbik6IHtcbiAgcmU6IFJlZ0V4cFxuICBuYW1lZFJlZ2V4Pzogc3RyaW5nXG4gIHJvdXRlS2V5cz86IHsgW25hbWVkOiBzdHJpbmddOiBzdHJpbmcgfVxuICBncm91cHM6IHsgW2dyb3VwTmFtZTogc3RyaW5nXTogR3JvdXAgfVxufSB7XG4gIGNvbnN0IHNlZ21lbnRzID0gKG5vcm1hbGl6ZWRSb3V0ZS5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJylcbiAgICAuc2xpY2UoMSlcbiAgICAuc3BsaXQoJy8nKVxuXG4gIGNvbnN0IGdyb3VwczogeyBbZ3JvdXBOYW1lOiBzdHJpbmddOiBHcm91cCB9ID0ge31cbiAgbGV0IGdyb3VwSW5kZXggPSAxXG4gIGNvbnN0IHBhcmFtZXRlcml6ZWRSb3V0ZSA9IHNlZ21lbnRzXG4gICAgLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aCgnWycpICYmIHNlZ21lbnQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICBjb25zdCB7IGtleSwgb3B0aW9uYWwsIHJlcGVhdCB9ID0gcGFyc2VQYXJhbWV0ZXIoc2VnbWVudC5zbGljZSgxLCAtMSkpXG4gICAgICAgIGdyb3Vwc1trZXldID0geyBwb3M6IGdyb3VwSW5kZXgrKywgcmVwZWF0LCBvcHRpb25hbCB9XG4gICAgICAgIHJldHVybiByZXBlYXQgPyAob3B0aW9uYWwgPyAnKD86LyguKz8pKT8nIDogJy8oLis/KScpIDogJy8oW14vXSs/KSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBgLyR7ZXNjYXBlUmVnZXgoc2VnbWVudCl9YFxuICAgICAgfVxuICAgIH0pXG4gICAgLmpvaW4oJycpXG5cbiAgLy8gZGVhZCBjb2RlIGVsaW1pbmF0ZSBmb3IgYnJvd3NlciBzaW5jZSBpdCdzIG9ubHkgbmVlZGVkXG4gIC8vIHdoaWxlIGdlbmVyYXRpbmcgcm91dGVzLW1hbmlmZXN0XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgIGxldCByb3V0ZUtleUNoYXJDb2RlID0gOTdcbiAgICBsZXQgcm91dGVLZXlDaGFyTGVuZ3RoID0gMVxuXG4gICAgLy8gYnVpbGRzIGEgbWluaW1hbCByb3V0ZUtleSB1c2luZyBvbmx5IGEteiBhbmQgbWluaW1hbCBudW1iZXIgb2YgY2hhcmFjdGVyc1xuICAgIGNvbnN0IGdldFNhZmVSb3V0ZUtleSA9ICgpID0+IHtcbiAgICAgIGxldCByb3V0ZUtleSA9ICcnXG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVLZXlDaGFyTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcm91dGVLZXkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyb3V0ZUtleUNoYXJDb2RlKVxuICAgICAgICByb3V0ZUtleUNoYXJDb2RlKytcblxuICAgICAgICBpZiAocm91dGVLZXlDaGFyQ29kZSA+IDEyMikge1xuICAgICAgICAgIHJvdXRlS2V5Q2hhckxlbmd0aCsrXG4gICAgICAgICAgcm91dGVLZXlDaGFyQ29kZSA9IDk3XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByb3V0ZUtleVxuICAgIH1cblxuICAgIGNvbnN0IHJvdXRlS2V5czogeyBbbmFtZWQ6IHN0cmluZ106IHN0cmluZyB9ID0ge31cblxuICAgIGxldCBuYW1lZFBhcmFtZXRlcml6ZWRSb3V0ZSA9IHNlZ21lbnRzXG4gICAgICAubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICAgIGlmIChzZWdtZW50LnN0YXJ0c1dpdGgoJ1snKSAmJiBzZWdtZW50LmVuZHNXaXRoKCddJykpIHtcbiAgICAgICAgICBjb25zdCB7IGtleSwgb3B0aW9uYWwsIHJlcGVhdCB9ID0gcGFyc2VQYXJhbWV0ZXIoc2VnbWVudC5zbGljZSgxLCAtMSkpXG4gICAgICAgICAgLy8gcmVwbGFjZSBhbnkgbm9uLXdvcmQgY2hhcmFjdGVycyBzaW5jZSB0aGV5IGNhbiBicmVha1xuICAgICAgICAgIC8vIHRoZSBuYW1lZCByZWdleFxuICAgICAgICAgIGxldCBjbGVhbmVkS2V5ID0ga2V5LnJlcGxhY2UoL1xcVy9nLCAnJylcbiAgICAgICAgICBsZXQgaW52YWxpZEtleSA9IGZhbHNlXG5cbiAgICAgICAgICAvLyBjaGVjayBpZiB0aGUga2V5IGlzIHN0aWxsIGludmFsaWQgYW5kIGZhbGxiYWNrIHRvIHVzaW5nIGEga25vd25cbiAgICAgICAgICAvLyBzYWZlIGtleVxuICAgICAgICAgIGlmIChjbGVhbmVkS2V5Lmxlbmd0aCA9PT0gMCB8fCBjbGVhbmVkS2V5Lmxlbmd0aCA+IDMwKSB7XG4gICAgICAgICAgICBpbnZhbGlkS2V5ID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzTmFOKHBhcnNlSW50KGNsZWFuZWRLZXkuc3Vic3RyKDAsIDEpKSkpIHtcbiAgICAgICAgICAgIGludmFsaWRLZXkgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGludmFsaWRLZXkpIHtcbiAgICAgICAgICAgIGNsZWFuZWRLZXkgPSBnZXRTYWZlUm91dGVLZXkoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdXRlS2V5c1tjbGVhbmVkS2V5XSA9IGtleVxuICAgICAgICAgIHJldHVybiByZXBlYXRcbiAgICAgICAgICAgID8gb3B0aW9uYWxcbiAgICAgICAgICAgICAgPyBgKD86Lyg/PCR7Y2xlYW5lZEtleX0+Lis/KSk/YFxuICAgICAgICAgICAgICA6IGAvKD88JHtjbGVhbmVkS2V5fT4uKz8pYFxuICAgICAgICAgICAgOiBgLyg/PCR7Y2xlYW5lZEtleX0+W14vXSs/KWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gYC8ke2VzY2FwZVJlZ2V4KHNlZ21lbnQpfWBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlOiBuZXcgUmVnRXhwKGBeJHtwYXJhbWV0ZXJpemVkUm91dGV9KD86Lyk/JGApLFxuICAgICAgZ3JvdXBzLFxuICAgICAgcm91dGVLZXlzLFxuICAgICAgbmFtZWRSZWdleDogYF4ke25hbWVkUGFyYW1ldGVyaXplZFJvdXRlfSg/Oi8pPyRgLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmU6IG5ldyBSZWdFeHAoYF4ke3BhcmFtZXRlcml6ZWRSb3V0ZX0oPzovKT8kYCksXG4gICAgZ3JvdXBzLFxuICB9XG59XG4iLCJsZXQgcnVudGltZUNvbmZpZzogYW55XG5cbmV4cG9ydCBkZWZhdWx0ICgpID0+IHtcbiAgcmV0dXJuIHJ1bnRpbWVDb25maWdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbmZpZyhjb25maWdWYWx1ZTogYW55KTogdm9pZCB7XG4gIHJ1bnRpbWVDb25maWcgPSBjb25maWdWYWx1ZVxufVxuIiwiaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnXG5pbXBvcnQgeyBQYXJzZWRVcmxRdWVyeSB9IGZyb20gJ3F1ZXJ5c3RyaW5nJ1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgVXJsT2JqZWN0IH0gZnJvbSAndXJsJ1xuaW1wb3J0IHsgZm9ybWF0VXJsIH0gZnJvbSAnLi9yb3V0ZXIvdXRpbHMvZm9ybWF0LXVybCdcbmltcG9ydCB7IE1hbmlmZXN0SXRlbSB9IGZyb20gJy4uL3NlcnZlci9sb2FkLWNvbXBvbmVudHMnXG5pbXBvcnQgeyBOZXh0Um91dGVyIH0gZnJvbSAnLi9yb3V0ZXIvcm91dGVyJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnQG5leHQvZW52J1xuaW1wb3J0IHsgQnVpbGRNYW5pZmVzdCB9IGZyb20gJy4uL3NlcnZlci9nZXQtcGFnZS1maWxlcydcbmltcG9ydCB7IERvbWFpbkxvY2FsZXMgfSBmcm9tICcuLi9zZXJ2ZXIvY29uZmlnJ1xuXG4vKipcbiAqIFR5cGVzIHVzZWQgYnkgYm90aCBuZXh0IGFuZCBuZXh0LXNlcnZlclxuICovXG5cbmV4cG9ydCB0eXBlIE5leHRDb21wb25lbnRUeXBlPFxuICBDIGV4dGVuZHMgQmFzZUNvbnRleHQgPSBOZXh0UGFnZUNvbnRleHQsXG4gIElQID0ge30sXG4gIFAgPSB7fVxuPiA9IENvbXBvbmVudFR5cGU8UD4gJiB7XG4gIC8qKlxuICAgKiBVc2VkIGZvciBpbml0aWFsIHBhZ2UgbG9hZCBkYXRhIHBvcHVsYXRpb24uIERhdGEgcmV0dXJuZWQgZnJvbSBgZ2V0SW5pdGlhbFByb3BzYCBpcyBzZXJpYWxpemVkIHdoZW4gc2VydmVyIHJlbmRlcmVkLlxuICAgKiBNYWtlIHN1cmUgdG8gcmV0dXJuIHBsYWluIGBPYmplY3RgIHdpdGhvdXQgdXNpbmcgYERhdGVgLCBgTWFwYCwgYFNldGAuXG4gICAqIEBwYXJhbSBjdHggQ29udGV4dCBvZiBgcGFnZWBcbiAgICovXG4gIGdldEluaXRpYWxQcm9wcz8oY29udGV4dDogQyk6IElQIHwgUHJvbWlzZTxJUD5cbn1cblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRUeXBlID0gTmV4dENvbXBvbmVudFR5cGU8XG4gIERvY3VtZW50Q29udGV4dCxcbiAgRG9jdW1lbnRJbml0aWFsUHJvcHMsXG4gIERvY3VtZW50UHJvcHNcbj4gJiB7XG4gIHJlbmRlckRvY3VtZW50KFxuICAgIERvY3VtZW50OiBEb2N1bWVudFR5cGUsXG4gICAgcHJvcHM6IERvY3VtZW50UHJvcHNcbiAgKTogUmVhY3QuUmVhY3RFbGVtZW50XG59XG5cbmV4cG9ydCB0eXBlIEFwcFR5cGUgPSBOZXh0Q29tcG9uZW50VHlwZTxcbiAgQXBwQ29udGV4dFR5cGUsXG4gIEFwcEluaXRpYWxQcm9wcyxcbiAgQXBwUHJvcHNUeXBlXG4+XG5cbmV4cG9ydCB0eXBlIEFwcFRyZWVUeXBlID0gQ29tcG9uZW50VHlwZTxcbiAgQXBwSW5pdGlhbFByb3BzICYgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbj5cblxuLyoqXG4gKiBXZWIgdml0YWxzIHByb3ZpZGVkIHRvIF9hcHAucmVwb3J0V2ViVml0YWxzIGJ5IENvcmUgV2ViIFZpdGFscyBwbHVnaW4gZGV2ZWxvcGVkIGJ5IEdvb2dsZSBDaHJvbWUgdGVhbS5cbiAqIGh0dHBzOi8vbmV4dGpzLm9yZy9ibG9nL25leHQtOS00I2ludGVncmF0ZWQtd2ViLXZpdGFscy1yZXBvcnRpbmdcbiAqL1xuZXhwb3J0IHR5cGUgTmV4dFdlYlZpdGFsc01ldHJpYyA9IHtcbiAgaWQ6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIG5hbWU6IHN0cmluZ1xuICBzdGFydFRpbWU6IG51bWJlclxuICB2YWx1ZTogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIEVuaGFuY2VyPEM+ID0gKENvbXBvbmVudDogQykgPT4gQ1xuXG5leHBvcnQgdHlwZSBDb21wb25lbnRzRW5oYW5jZXIgPVxuICB8IHtcbiAgICAgIGVuaGFuY2VBcHA/OiBFbmhhbmNlcjxBcHBUeXBlPlxuICAgICAgZW5oYW5jZUNvbXBvbmVudD86IEVuaGFuY2VyPE5leHRDb21wb25lbnRUeXBlPlxuICAgIH1cbiAgfCBFbmhhbmNlcjxOZXh0Q29tcG9uZW50VHlwZT5cblxuZXhwb3J0IHR5cGUgUmVuZGVyUGFnZVJlc3VsdCA9IHtcbiAgaHRtbDogc3RyaW5nXG4gIGhlYWQ/OiBBcnJheTxKU1guRWxlbWVudCB8IG51bGw+XG59XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhZ2UgPSAoXG4gIG9wdGlvbnM/OiBDb21wb25lbnRzRW5oYW5jZXJcbikgPT4gUmVuZGVyUGFnZVJlc3VsdCB8IFByb21pc2U8UmVuZGVyUGFnZVJlc3VsdD5cblxuZXhwb3J0IHR5cGUgQmFzZUNvbnRleHQgPSB7XG4gIHJlcz86IFNlcnZlclJlc3BvbnNlXG4gIFtrOiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IHR5cGUgTkVYVF9EQVRBID0ge1xuICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PlxuICBwYWdlOiBzdHJpbmdcbiAgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5XG4gIGJ1aWxkSWQ6IHN0cmluZ1xuICBhc3NldFByZWZpeD86IHN0cmluZ1xuICBydW50aW1lQ29uZmlnPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICBuZXh0RXhwb3J0PzogYm9vbGVhblxuICBhdXRvRXhwb3J0PzogYm9vbGVhblxuICBpc0ZhbGxiYWNrPzogYm9vbGVhblxuICBkeW5hbWljSWRzPzogc3RyaW5nW11cbiAgZXJyPzogRXJyb3IgJiB7IHN0YXR1c0NvZGU/OiBudW1iZXIgfVxuICBnc3A/OiBib29sZWFuXG4gIGdzc3A/OiBib29sZWFuXG4gIGN1c3RvbVNlcnZlcj86IGJvb2xlYW5cbiAgZ2lwPzogYm9vbGVhblxuICBhcHBHaXA/OiBib29sZWFuXG4gIGxvY2FsZT86IHN0cmluZ1xuICBsb2NhbGVzPzogc3RyaW5nW11cbiAgZGVmYXVsdExvY2FsZT86IHN0cmluZ1xuICBkb21haW5Mb2NhbGVzPzogRG9tYWluTG9jYWxlc1xuICBzY3JpcHRMb2FkZXI/OiBhbnlbXVxuICBpc1ByZXZpZXc/OiBib29sZWFuXG59XG5cbi8qKlxuICogYE5leHRgIGNvbnRleHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0UGFnZUNvbnRleHQge1xuICAvKipcbiAgICogRXJyb3Igb2JqZWN0IGlmIGVuY291bnRlcmVkIGR1cmluZyByZW5kZXJpbmdcbiAgICovXG4gIGVycj86IChFcnJvciAmIHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSB8IG51bGxcbiAgLyoqXG4gICAqIGBIVFRQYCByZXF1ZXN0IG9iamVjdC5cbiAgICovXG4gIHJlcT86IEluY29taW5nTWVzc2FnZVxuICAvKipcbiAgICogYEhUVFBgIHJlc3BvbnNlIG9iamVjdC5cbiAgICovXG4gIHJlcz86IFNlcnZlclJlc3BvbnNlXG4gIC8qKlxuICAgKiBQYXRoIHNlY3Rpb24gb2YgYFVSTGAuXG4gICAqL1xuICBwYXRobmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBRdWVyeSBzdHJpbmcgc2VjdGlvbiBvZiBgVVJMYCBwYXJzZWQgYXMgYW4gb2JqZWN0LlxuICAgKi9cbiAgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5XG4gIC8qKlxuICAgKiBgU3RyaW5nYCBvZiB0aGUgYWN0dWFsIHBhdGggaW5jbHVkaW5nIHF1ZXJ5LlxuICAgKi9cbiAgYXNQYXRoPzogc3RyaW5nXG4gIC8qKlxuICAgKiBgQ29tcG9uZW50YCB0aGUgdHJlZSBvZiB0aGUgQXBwIHRvIHVzZSBpZiBuZWVkaW5nIHRvIHJlbmRlciBzZXBhcmF0ZWx5XG4gICAqL1xuICBBcHBUcmVlOiBBcHBUcmVlVHlwZVxufVxuXG5leHBvcnQgdHlwZSBBcHBDb250ZXh0VHlwZTxSIGV4dGVuZHMgTmV4dFJvdXRlciA9IE5leHRSb3V0ZXI+ID0ge1xuICBDb21wb25lbnQ6IE5leHRDb21wb25lbnRUeXBlPE5leHRQYWdlQ29udGV4dD5cbiAgQXBwVHJlZTogQXBwVHJlZVR5cGVcbiAgY3R4OiBOZXh0UGFnZUNvbnRleHRcbiAgcm91dGVyOiBSXG59XG5cbmV4cG9ydCB0eXBlIEFwcEluaXRpYWxQcm9wcyA9IHtcbiAgcGFnZVByb3BzOiBhbnlcbn1cblxuZXhwb3J0IHR5cGUgQXBwUHJvcHNUeXBlPFxuICBSIGV4dGVuZHMgTmV4dFJvdXRlciA9IE5leHRSb3V0ZXIsXG4gIFAgPSB7fVxuPiA9IEFwcEluaXRpYWxQcm9wcyAmIHtcbiAgQ29tcG9uZW50OiBOZXh0Q29tcG9uZW50VHlwZTxOZXh0UGFnZUNvbnRleHQsIGFueSwgUD5cbiAgcm91dGVyOiBSXG4gIF9fTl9TU0c/OiBib29sZWFuXG4gIF9fTl9TU1A/OiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50Q29udGV4dCA9IE5leHRQYWdlQ29udGV4dCAmIHtcbiAgcmVuZGVyUGFnZTogUmVuZGVyUGFnZVxufVxuXG5leHBvcnQgdHlwZSBEb2N1bWVudEluaXRpYWxQcm9wcyA9IFJlbmRlclBhZ2VSZXN1bHQgJiB7XG4gIHN0eWxlcz86IFJlYWN0LlJlYWN0RWxlbWVudFtdIHwgUmVhY3QuUmVhY3RGcmFnbWVudFxufVxuXG5leHBvcnQgdHlwZSBEb2N1bWVudFByb3BzID0gRG9jdW1lbnRJbml0aWFsUHJvcHMgJiB7XG4gIF9fTkVYVF9EQVRBX186IE5FWFRfREFUQVxuICBkYW5nZXJvdXNBc1BhdGg6IHN0cmluZ1xuICBkb2NDb21wb25lbnRzUmVuZGVyZWQ6IHtcbiAgICBIdG1sPzogYm9vbGVhblxuICAgIE1haW4/OiBib29sZWFuXG4gICAgSGVhZD86IGJvb2xlYW5cbiAgICBOZXh0U2NyaXB0PzogYm9vbGVhblxuICB9XG4gIGJ1aWxkTWFuaWZlc3Q6IEJ1aWxkTWFuaWZlc3RcbiAgYW1wUGF0aDogc3RyaW5nXG4gIGluQW1wTW9kZTogYm9vbGVhblxuICBoeWJyaWRBbXA6IGJvb2xlYW5cbiAgaXNEZXZlbG9wbWVudDogYm9vbGVhblxuICBkeW5hbWljSW1wb3J0czogTWFuaWZlc3RJdGVtW11cbiAgYXNzZXRQcmVmaXg/OiBzdHJpbmdcbiAgY2Fub25pY2FsQmFzZTogc3RyaW5nXG4gIGhlYWRUYWdzOiBhbnlbXVxuICB1bnN0YWJsZV9ydW50aW1lSlM/OiBmYWxzZVxuICB1bnN0YWJsZV9Kc1ByZWxvYWQ/OiBmYWxzZVxuICBkZXZPbmx5Q2FjaGVCdXN0ZXJRdWVyeVN0cmluZzogc3RyaW5nXG4gIHNjcmlwdExvYWRlcjogeyBkZWZlcj86IHN0cmluZ1tdOyBlYWdlcj86IGFueVtdIH1cbiAgbG9jYWxlPzogc3RyaW5nXG59XG5cbi8qKlxuICogTmV4dCBgQVBJYCByb3V0ZSByZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dEFwaVJlcXVlc3QgZXh0ZW5kcyBJbmNvbWluZ01lc3NhZ2Uge1xuICAvKipcbiAgICogT2JqZWN0IG9mIGBxdWVyeWAgdmFsdWVzIGZyb20gdXJsXG4gICAqL1xuICBxdWVyeToge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdXG4gIH1cbiAgLyoqXG4gICAqIE9iamVjdCBvZiBgY29va2llc2AgZnJvbSBoZWFkZXJcbiAgICovXG4gIGNvb2tpZXM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdcbiAgfVxuXG4gIGJvZHk6IGFueVxuXG4gIGVudjogRW52XG5cbiAgcHJldmlldz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFByZXZpZXcgZGF0YSBzZXQgb24gdGhlIHJlcXVlc3QsIGlmIGFueVxuICAgKiAqL1xuICBwcmV2aWV3RGF0YT86IGFueVxufVxuXG4vKipcbiAqIFNlbmQgYm9keSBvZiByZXNwb25zZVxuICovXG50eXBlIFNlbmQ8VD4gPSAoYm9keTogVCkgPT4gdm9pZFxuXG4vKipcbiAqIE5leHQgYEFQSWAgcm91dGUgcmVzcG9uc2VcbiAqL1xuZXhwb3J0IHR5cGUgTmV4dEFwaVJlc3BvbnNlPFQgPSBhbnk+ID0gU2VydmVyUmVzcG9uc2UgJiB7XG4gIC8qKlxuICAgKiBTZW5kIGRhdGEgYGFueWAgZGF0YSBpbiByZXNwb25zZVxuICAgKi9cbiAgc2VuZDogU2VuZDxUPlxuICAvKipcbiAgICogU2VuZCBkYXRhIGBqc29uYCBkYXRhIGluIHJlc3BvbnNlXG4gICAqL1xuICBqc29uOiBTZW5kPFQ+XG4gIHN0YXR1czogKHN0YXR1c0NvZGU6IG51bWJlcikgPT4gTmV4dEFwaVJlc3BvbnNlPFQ+XG4gIHJlZGlyZWN0KHVybDogc3RyaW5nKTogTmV4dEFwaVJlc3BvbnNlPFQ+XG4gIHJlZGlyZWN0KHN0YXR1czogbnVtYmVyLCB1cmw6IHN0cmluZyk6IE5leHRBcGlSZXNwb25zZTxUPlxuXG4gIC8qKlxuICAgKiBTZXQgcHJldmlldyBkYXRhIGZvciBOZXh0LmpzJyBwcmVyZW5kZXIgbW9kZVxuICAgKi9cbiAgc2V0UHJldmlld0RhdGE6IChcbiAgICBkYXRhOiBvYmplY3QgfCBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIC8qKlxuICAgICAgICogU3BlY2lmaWVzIHRoZSBudW1iZXIgKGluIHNlY29uZHMpIGZvciB0aGUgcHJldmlldyBzZXNzaW9uIHRvIGxhc3QgZm9yLlxuICAgICAgICogVGhlIGdpdmVuIG51bWJlciB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyIGJ5IHJvdW5kaW5nIGRvd24uXG4gICAgICAgKiBCeSBkZWZhdWx0LCBubyBtYXhpbXVtIGFnZSBpcyBzZXQgYW5kIHRoZSBwcmV2aWV3IHNlc3Npb24gZmluaXNoZXNcbiAgICAgICAqIHdoZW4gdGhlIGNsaWVudCBzaHV0cyBkb3duIChicm93c2VyIGlzIGNsb3NlZCkuXG4gICAgICAgKi9cbiAgICAgIG1heEFnZT86IG51bWJlclxuICAgIH1cbiAgKSA9PiBOZXh0QXBpUmVzcG9uc2U8VD5cbiAgY2xlYXJQcmV2aWV3RGF0YTogKCkgPT4gTmV4dEFwaVJlc3BvbnNlPFQ+XG59XG5cbi8qKlxuICogTmV4dCBgQVBJYCByb3V0ZSBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIE5leHRBcGlIYW5kbGVyPFQgPSBhbnk+ID0gKFxuICByZXE6IE5leHRBcGlSZXF1ZXN0LFxuICByZXM6IE5leHRBcGlSZXNwb25zZTxUPlxuKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPlxuXG4vKipcbiAqIFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjT25jZTxUIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBSZXR1cm5UeXBlPFQ+PihcbiAgZm46IFRcbik6IFQge1xuICBsZXQgdXNlZCA9IGZhbHNlXG4gIGxldCByZXN1bHQ6IFJldHVyblR5cGU8VD5cblxuICByZXR1cm4gKCguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGlmICghdXNlZCkge1xuICAgICAgdXNlZCA9IHRydWVcbiAgICAgIHJlc3VsdCA9IGZuKC4uLmFyZ3MpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfSkgYXMgVFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYXRpb25PcmlnaW4oKSB7XG4gIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lLCBwb3J0IH0gPSB3aW5kb3cubG9jYXRpb25cbiAgcmV0dXJuIGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX0ke3BvcnQgPyAnOicgKyBwb3J0IDogJyd9YFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVJMKCkge1xuICBjb25zdCB7IGhyZWYgfSA9IHdpbmRvdy5sb2NhdGlvblxuICBjb25zdCBvcmlnaW4gPSBnZXRMb2NhdGlvbk9yaWdpbigpXG4gIHJldHVybiBocmVmLnN1YnN0cmluZyhvcmlnaW4ubGVuZ3RoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWU8UD4oQ29tcG9uZW50OiBDb21wb25lbnRUeXBlPFA+KSB7XG4gIHJldHVybiB0eXBlb2YgQ29tcG9uZW50ID09PSAnc3RyaW5nJ1xuICAgID8gQ29tcG9uZW50XG4gICAgOiBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ1Vua25vd24nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc1NlbnQocmVzOiBTZXJ2ZXJSZXNwb25zZSkge1xuICByZXR1cm4gcmVzLmZpbmlzaGVkIHx8IHJlcy5oZWFkZXJzU2VudFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEdldEluaXRpYWxQcm9wczxcbiAgQyBleHRlbmRzIEJhc2VDb250ZXh0LFxuICBJUCA9IHt9LFxuICBQID0ge31cbj4oQXBwOiBOZXh0Q29tcG9uZW50VHlwZTxDLCBJUCwgUD4sIGN0eDogQyk6IFByb21pc2U8SVA+IHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoQXBwLnByb3RvdHlwZT8uZ2V0SW5pdGlhbFByb3BzKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYFwiJHtnZXREaXNwbGF5TmFtZShcbiAgICAgICAgQXBwXG4gICAgICApfS5nZXRJbml0aWFsUHJvcHMoKVwiIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kIC0gdmlzaXQgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvZ2V0LWluaXRpYWwtcHJvcHMtYXMtYW4taW5zdGFuY2UtbWV0aG9kIGZvciBtb3JlIGluZm9ybWF0aW9uLmBcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKVxuICAgIH1cbiAgfVxuICAvLyB3aGVuIGNhbGxlZCBmcm9tIF9hcHAgYGN0eGAgaXMgbmVzdGVkIGluIGBjdHhgXG4gIGNvbnN0IHJlcyA9IGN0eC5yZXMgfHwgKGN0eC5jdHggJiYgY3R4LmN0eC5yZXMpXG5cbiAgaWYgKCFBcHAuZ2V0SW5pdGlhbFByb3BzKSB7XG4gICAgaWYgKGN0eC5jdHggJiYgY3R4LkNvbXBvbmVudCkge1xuICAgICAgLy8gQHRzLWlnbm9yZSBwYWdlUHJvcHMgZGVmYXVsdFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZVByb3BzOiBhd2FpdCBsb2FkR2V0SW5pdGlhbFByb3BzKGN0eC5Db21wb25lbnQsIGN0eC5jdHgpLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge30gYXMgSVBcbiAgfVxuXG4gIGNvbnN0IHByb3BzID0gYXdhaXQgQXBwLmdldEluaXRpYWxQcm9wcyhjdHgpXG5cbiAgaWYgKHJlcyAmJiBpc1Jlc1NlbnQocmVzKSkge1xuICAgIHJldHVybiBwcm9wc1xuICB9XG5cbiAgaWYgKCFwcm9wcykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgXCIke2dldERpc3BsYXlOYW1lKFxuICAgICAgQXBwXG4gICAgKX0uZ2V0SW5pdGlhbFByb3BzKClcIiBzaG91bGQgcmVzb2x2ZSB0byBhbiBvYmplY3QuIEJ1dCBmb3VuZCBcIiR7cHJvcHN9XCIgaW5zdGVhZC5gXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpXG4gIH1cblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wcykubGVuZ3RoID09PSAwICYmICFjdHguY3R4KSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGAke2dldERpc3BsYXlOYW1lKFxuICAgICAgICAgIEFwcFxuICAgICAgICApfSByZXR1cm5lZCBhbiBlbXB0eSBvYmplY3QgZnJvbSBcXGBnZXRJbml0aWFsUHJvcHNcXGAuIFRoaXMgZGUtb3B0aW1pemVzIGFuZCBwcmV2ZW50cyBhdXRvbWF0aWMgc3RhdGljIG9wdGltaXphdGlvbi4gaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvZW1wdHktb2JqZWN0LWdldEluaXRpYWxQcm9wc2BcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvcHNcbn1cblxuZXhwb3J0IGNvbnN0IHVybE9iamVjdEtleXMgPSBbXG4gICdhdXRoJyxcbiAgJ2hhc2gnLFxuICAnaG9zdCcsXG4gICdob3N0bmFtZScsXG4gICdocmVmJyxcbiAgJ3BhdGgnLFxuICAncGF0aG5hbWUnLFxuICAncG9ydCcsXG4gICdwcm90b2NvbCcsXG4gICdxdWVyeScsXG4gICdzZWFyY2gnLFxuICAnc2xhc2hlcycsXG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRXaXRoVmFsaWRhdGlvbih1cmw6IFVybE9iamVjdCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgIGlmICh1cmwgIT09IG51bGwgJiYgdHlwZW9mIHVybCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIE9iamVjdC5rZXlzKHVybCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICh1cmxPYmplY3RLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgVW5rbm93biBrZXkgcGFzc2VkIHZpYSB1cmxPYmplY3QgaW50byB1cmwuZm9ybWF0OiAke2tleX1gXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmb3JtYXRVcmwodXJsKVxufVxuXG5leHBvcnQgY29uc3QgU1AgPSB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnXG5leHBvcnQgY29uc3QgU1QgPVxuICBTUCAmJlxuICB0eXBlb2YgcGVyZm9ybWFuY2UubWFyayA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgcGVyZm9ybWFuY2UubWVhc3VyZSA9PT0gJ2Z1bmN0aW9uJ1xuIiwiXCJ1c2Ugc3RyaWN0XCI7ZXhwb3J0cy5fX2VzTW9kdWxlPXRydWU7ZXhwb3J0cy5ub3JtYWxpemVQYXRoU2VwPW5vcm1hbGl6ZVBhdGhTZXA7ZXhwb3J0cy5kZW5vcm1hbGl6ZVBhZ2VQYXRoPWRlbm9ybWFsaXplUGFnZVBhdGg7ZnVuY3Rpb24gbm9ybWFsaXplUGF0aFNlcChwYXRoKXtyZXR1cm4gcGF0aC5yZXBsYWNlKC9cXFxcL2csJy8nKTt9ZnVuY3Rpb24gZGVub3JtYWxpemVQYWdlUGF0aChwYWdlKXtwYWdlPW5vcm1hbGl6ZVBhdGhTZXAocGFnZSk7aWYocGFnZS5zdGFydHNXaXRoKCcvaW5kZXgvJykpe3BhZ2U9cGFnZS5zbGljZSg2KTt9ZWxzZSBpZihwYWdlPT09Jy9pbmRleCcpe3BhZ2U9Jy8nO31yZXR1cm4gcGFnZTt9XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kZW5vcm1hbGl6ZS1wYWdlLXBhdGguanMubWFwIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Rpc3QvY2xpZW50L3JvdXRlcicpXG4iLCIvKiFcbiAqIFBsYXRmb3JtLmpzIHYxLjMuNlxuICogQ29weXJpZ2h0IDIwMTQtMjAyMCBCZW5qYW1pbiBUYW5cbiAqIENvcHlyaWdodCAyMDExLTIwMTMgSm9obi1EYXZpZCBEYWx0b25cbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZVxuICovXG47KGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHZhbHVlcyBhcmUgb2YgdGhlIGxhbmd1YWdlIHR5cGUgYE9iamVjdGAuICovXG4gIHZhciBvYmplY3RUeXBlcyA9IHtcbiAgICAnZnVuY3Rpb24nOiB0cnVlLFxuICAgICdvYmplY3QnOiB0cnVlXG4gIH07XG5cbiAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciByb290ID0gKG9iamVjdFR5cGVzW3R5cGVvZiB3aW5kb3ddICYmIHdpbmRvdykgfHwgdGhpcztcblxuICAvKiogQmFja3VwIHBvc3NpYmxlIGdsb2JhbCBvYmplY3QuICovXG4gIHZhciBvbGRSb290ID0gcm9vdDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xuICB2YXIgZnJlZUV4cG9ydHMgPSBvYmplY3RUeXBlc1t0eXBlb2YgZXhwb3J0c10gJiYgZXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG4gIHZhciBmcmVlTW9kdWxlID0gb2JqZWN0VHlwZXNbdHlwZW9mIG1vZHVsZV0gJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUgYW5kIHVzZSBpdCBhcyBgcm9vdGAuICovXG4gIHZhciBmcmVlR2xvYmFsID0gZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSAmJiB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcbiAgaWYgKGZyZWVHbG9iYWwgJiYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbCkpIHtcbiAgICByb290ID0gZnJlZUdsb2JhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGFzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBhcnJheS1saWtlIG9iamVjdC5cbiAgICogU2VlIHRoZSBbRVM2IHNwZWNdKGh0dHA6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoKVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgdmFyIG1heFNhZmVJbnRlZ2VyID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuICAvKiogUmVndWxhciBleHByZXNzaW9uIHRvIGRldGVjdCBPcGVyYS4gKi9cbiAgdmFyIHJlT3BlcmEgPSAvXFxiT3BlcmEvO1xuXG4gIC8qKiBQb3NzaWJsZSBnbG9iYWwgb2JqZWN0LiAqL1xuICB2YXIgdGhpc0JpbmRpbmcgPSB0aGlzO1xuXG4gIC8qKiBVc2VkIGZvciBuYXRpdmUgbWV0aG9kIHJlZmVyZW5jZXMuICovXG4gIHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgLyoqIFVzZWQgdG8gY2hlY2sgZm9yIG93biBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC4gKi9cbiAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgaW50ZXJuYWwgYFtbQ2xhc3NdXWAgb2YgdmFsdWVzLiAqL1xuICB2YXIgdG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQ2FwaXRhbGl6ZXMgYSBzdHJpbmcgdmFsdWUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjYXBpdGFsaXplLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgICBzdHJpbmcgPSBTdHJpbmcoc3RyaW5nKTtcbiAgICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgdXRpbGl0eSBmdW5jdGlvbiB0byBjbGVhbiB1cCB0aGUgT1MgbmFtZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9zIFRoZSBPUyBuYW1lIHRvIGNsZWFuIHVwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5dIEEgYFJlZ0V4cGAgcGF0dGVybiBtYXRjaGluZyB0aGUgT1MgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF0gQSBsYWJlbCBmb3IgdGhlIE9TLlxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW51cE9TKG9zLCBwYXR0ZXJuLCBsYWJlbCkge1xuICAgIC8vIFBsYXRmb3JtIHRva2VucyBhcmUgZGVmaW5lZCBhdDpcbiAgICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1Mzc1MDMoVlMuODUpLmFzcHhcbiAgICAvLyBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDA4MTEyMjA1Mzk1MC9odHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1Mzc1MDMoVlMuODUpLmFzcHhcbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgICcxMC4wJzogJzEwJyxcbiAgICAgICc2LjQnOiAgJzEwIFRlY2huaWNhbCBQcmV2aWV3JyxcbiAgICAgICc2LjMnOiAgJzguMScsXG4gICAgICAnNi4yJzogICc4JyxcbiAgICAgICc2LjEnOiAgJ1NlcnZlciAyMDA4IFIyIC8gNycsXG4gICAgICAnNi4wJzogICdTZXJ2ZXIgMjAwOCAvIFZpc3RhJyxcbiAgICAgICc1LjInOiAgJ1NlcnZlciAyMDAzIC8gWFAgNjQtYml0JyxcbiAgICAgICc1LjEnOiAgJ1hQJyxcbiAgICAgICc1LjAxJzogJzIwMDAgU1AxJyxcbiAgICAgICc1LjAnOiAgJzIwMDAnLFxuICAgICAgJzQuMCc6ICAnTlQnLFxuICAgICAgJzQuOTAnOiAnTUUnXG4gICAgfTtcbiAgICAvLyBEZXRlY3QgV2luZG93cyB2ZXJzaW9uIGZyb20gcGxhdGZvcm0gdG9rZW5zLlxuICAgIGlmIChwYXR0ZXJuICYmIGxhYmVsICYmIC9eV2luL2kudGVzdChvcykgJiYgIS9eV2luZG93cyBQaG9uZSAvaS50ZXN0KG9zKSAmJlxuICAgICAgICAoZGF0YSA9IGRhdGFbL1tcXGQuXSskLy5leGVjKG9zKV0pKSB7XG4gICAgICBvcyA9ICdXaW5kb3dzICcgKyBkYXRhO1xuICAgIH1cbiAgICAvLyBDb3JyZWN0IGNoYXJhY3RlciBjYXNlIGFuZCBjbGVhbnVwIHN0cmluZy5cbiAgICBvcyA9IFN0cmluZyhvcyk7XG5cbiAgICBpZiAocGF0dGVybiAmJiBsYWJlbCkge1xuICAgICAgb3MgPSBvcy5yZXBsYWNlKFJlZ0V4cChwYXR0ZXJuLCAnaScpLCBsYWJlbCk7XG4gICAgfVxuXG4gICAgb3MgPSBmb3JtYXQoXG4gICAgICBvcy5yZXBsYWNlKC8gY2UkL2ksICcgQ0UnKVxuICAgICAgICAucmVwbGFjZSgvXFxiaHB3L2ksICd3ZWInKVxuICAgICAgICAucmVwbGFjZSgvXFxiTWFjaW50b3NoXFxiLywgJ01hYyBPUycpXG4gICAgICAgIC5yZXBsYWNlKC9fUG93ZXJQQ1xcYi9pLCAnIE9TJylcbiAgICAgICAgLnJlcGxhY2UoL1xcYihPUyBYKSBbXiBcXGRdKy9pLCAnJDEnKVxuICAgICAgICAucmVwbGFjZSgvXFxiTWFjIChPUyBYKVxcYi8sICckMScpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8oXFxkKS8sICcgJDEnKVxuICAgICAgICAucmVwbGFjZSgvXy9nLCAnLicpXG4gICAgICAgIC5yZXBsYWNlKC8oPzogQmVQQ3xbIC5dKmZjWyBcXGQuXSspJC9pLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcYng4NlxcLjY0XFxiL2dpLCAneDg2XzY0JylcbiAgICAgICAgLnJlcGxhY2UoL1xcYihXaW5kb3dzIFBob25lKSBPU1xcYi8sICckMScpXG4gICAgICAgIC5yZXBsYWNlKC9cXGIoQ2hyb21lIE9TIFxcdyspIFtcXGQuXStcXGIvLCAnJDEnKVxuICAgICAgICAuc3BsaXQoJyBvbiAnKVswXVxuICAgICk7XG5cbiAgICByZXR1cm4gb3M7XG4gIH1cblxuICAvKipcbiAgICogQW4gaXRlcmF0aW9uIHV0aWxpdHkgZm9yIGFycmF5cyBhbmQgb2JqZWN0cy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIGNhbGxlZCBwZXIgaXRlcmF0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24gZWFjaChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG9iamVjdCA/IG9iamVjdC5sZW5ndGggOiAwO1xuXG4gICAgaWYgKHR5cGVvZiBsZW5ndGggPT0gJ251bWJlcicgJiYgbGVuZ3RoID4gLTEgJiYgbGVuZ3RoIDw9IG1heFNhZmVJbnRlZ2VyKSB7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjYWxsYmFjayhvYmplY3RbaW5kZXhdLCBpbmRleCwgb2JqZWN0KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yT3duKG9iamVjdCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmltIGFuZCBjb25kaXRpb25hbGx5IGNhcGl0YWxpemUgc3RyaW5nIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGZvcm1hdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBzdHJpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBmb3JtYXQoc3RyaW5nKSB7XG4gICAgc3RyaW5nID0gdHJpbShzdHJpbmcpO1xuICAgIHJldHVybiAvXig/OndlYk9TfGkoPzpPU3xQKSkvLnRlc3Qoc3RyaW5nKVxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogY2FwaXRhbGl6ZShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMsIGV4ZWN1dGluZyB0aGUgYGNhbGxiYWNrYCBmb3IgZWFjaC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIGV4ZWN1dGVkIHBlciBvd24gcHJvcGVydHkuXG4gICAqL1xuICBmdW5jdGlvbiBmb3JPd24ob2JqZWN0LCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgICBjYWxsYmFjayhvYmplY3Rba2V5XSwga2V5LCBvYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBgW1tDbGFzc11dYCBvZiBhIHZhbHVlLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGBbW0NsYXNzXV1gLlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xhc3NPZih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsXG4gICAgICA/IGNhcGl0YWxpemUodmFsdWUpXG4gICAgICA6IHRvU3RyaW5nLmNhbGwodmFsdWUpLnNsaWNlKDgsIC0xKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3N0IG9iamVjdHMgY2FuIHJldHVybiB0eXBlIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGVpciBhY3R1YWxcbiAgICogZGF0YSB0eXBlLiBUaGUgb2JqZWN0cyB3ZSBhcmUgY29uY2VybmVkIHdpdGggdXN1YWxseSByZXR1cm4gbm9uLXByaW1pdGl2ZVxuICAgKiB0eXBlcyBvZiBcIm9iamVjdFwiLCBcImZ1bmN0aW9uXCIsIG9yIFwidW5rbm93blwiLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgb3duZXIgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIHByb3BlcnR5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGEgbm9uLXByaW1pdGl2ZSwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gaXNIb3N0VHlwZShvYmplY3QsIHByb3BlcnR5KSB7XG4gICAgdmFyIHR5cGUgPSBvYmplY3QgIT0gbnVsbCA/IHR5cGVvZiBvYmplY3RbcHJvcGVydHldIDogJ251bWJlcic7XG4gICAgcmV0dXJuICEvXig/OmJvb2xlYW58bnVtYmVyfHN0cmluZ3x1bmRlZmluZWQpJC8udGVzdCh0eXBlKSAmJlxuICAgICAgKHR5cGUgPT0gJ29iamVjdCcgPyAhIW9iamVjdFtwcm9wZXJ0eV0gOiB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIHN0cmluZyBmb3IgdXNlIGluIGEgYFJlZ0V4cGAgYnkgbWFraW5nIGh5cGhlbnMgYW5kIHNwYWNlcyBvcHRpb25hbC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHF1YWxpZnkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBxdWFsaWZpZWQgc3RyaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gcXVhbGlmeShzdHJpbmcpIHtcbiAgICByZXR1cm4gU3RyaW5nKHN0cmluZykucmVwbGFjZSgvKFsgLV0pKD8hJCkvZywgJyQxPycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgYmFyZS1ib25lcyBgQXJyYXkjcmVkdWNlYCBsaWtlIHV0aWxpdHkgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiBjYWxsZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMgeyp9IFRoZSBhY2N1bXVsYXRlZCByZXN1bHQuXG4gICAqL1xuICBmdW5jdGlvbiByZWR1Y2UoYXJyYXksIGNhbGxiYWNrKSB7XG4gICAgdmFyIGFjY3VtdWxhdG9yID0gbnVsbDtcbiAgICBlYWNoKGFycmF5LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gY2FsbGJhY2soYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgYXJyYXkpO1xuICAgIH0pO1xuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBhIHN0cmluZy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB0cmltbWVkIHN0cmluZy5cbiAgICovXG4gIGZ1bmN0aW9uIHRyaW0oc3RyaW5nKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzdHJpbmcpLnJlcGxhY2UoL14gK3wgKyQvZywgJycpO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGxhdGZvcm0gb2JqZWN0LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBbdWE9bmF2aWdhdG9yLnVzZXJBZ2VudF0gVGhlIHVzZXIgYWdlbnQgc3RyaW5nIG9yXG4gICAqICBjb250ZXh0IG9iamVjdC5cbiAgICogQHJldHVybnMge09iamVjdH0gQSBwbGF0Zm9ybSBvYmplY3QuXG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZSh1YSkge1xuXG4gICAgLyoqIFRoZSBlbnZpcm9ubWVudCBjb250ZXh0IG9iamVjdC4gKi9cbiAgICB2YXIgY29udGV4dCA9IHJvb3Q7XG5cbiAgICAvKiogVXNlZCB0byBmbGFnIHdoZW4gYSBjdXN0b20gY29udGV4dCBpcyBwcm92aWRlZC4gKi9cbiAgICB2YXIgaXNDdXN0b21Db250ZXh0ID0gdWEgJiYgdHlwZW9mIHVhID09ICdvYmplY3QnICYmIGdldENsYXNzT2YodWEpICE9ICdTdHJpbmcnO1xuXG4gICAgLy8gSnVnZ2xlIGFyZ3VtZW50cy5cbiAgICBpZiAoaXNDdXN0b21Db250ZXh0KSB7XG4gICAgICBjb250ZXh0ID0gdWE7XG4gICAgICB1YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLyoqIEJyb3dzZXIgbmF2aWdhdG9yIG9iamVjdC4gKi9cbiAgICB2YXIgbmF2ID0gY29udGV4dC5uYXZpZ2F0b3IgfHwge307XG5cbiAgICAvKiogQnJvd3NlciB1c2VyIGFnZW50IHN0cmluZy4gKi9cbiAgICB2YXIgdXNlckFnZW50ID0gbmF2LnVzZXJBZ2VudCB8fCAnJztcblxuICAgIHVhIHx8ICh1YSA9IHVzZXJBZ2VudCk7XG5cbiAgICAvKiogVXNlZCB0byBmbGFnIHdoZW4gYHRoaXNCaW5kaW5nYCBpcyB0aGUgW01vZHVsZVNjb3BlXS4gKi9cbiAgICB2YXIgaXNNb2R1bGVTY29wZSA9IGlzQ3VzdG9tQ29udGV4dCB8fCB0aGlzQmluZGluZyA9PSBvbGRSb290O1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGlmIGJyb3dzZXIgaXMgbGlrZSBDaHJvbWUuICovXG4gICAgdmFyIGxpa2VDaHJvbWUgPSBpc0N1c3RvbUNvbnRleHRcbiAgICAgID8gISFuYXYubGlrZUNocm9tZVxuICAgICAgOiAvXFxiQ2hyb21lXFxiLy50ZXN0KHVhKSAmJiAhL2ludGVybmFsfFxcbi9pLnRlc3QodG9TdHJpbmcudG9TdHJpbmcoKSk7XG5cbiAgICAvKiogSW50ZXJuYWwgYFtbQ2xhc3NdXWAgdmFsdWUgc2hvcnRjdXRzLiAqL1xuICAgIHZhciBvYmplY3RDbGFzcyA9ICdPYmplY3QnLFxuICAgICAgICBhaXJSdW50aW1lQ2xhc3MgPSBpc0N1c3RvbUNvbnRleHQgPyBvYmplY3RDbGFzcyA6ICdTY3JpcHRCcmlkZ2luZ1Byb3h5T2JqZWN0JyxcbiAgICAgICAgZW52aXJvQ2xhc3MgPSBpc0N1c3RvbUNvbnRleHQgPyBvYmplY3RDbGFzcyA6ICdFbnZpcm9ubWVudCcsXG4gICAgICAgIGphdmFDbGFzcyA9IChpc0N1c3RvbUNvbnRleHQgJiYgY29udGV4dC5qYXZhKSA/ICdKYXZhUGFja2FnZScgOiBnZXRDbGFzc09mKGNvbnRleHQuamF2YSksXG4gICAgICAgIHBoYW50b21DbGFzcyA9IGlzQ3VzdG9tQ29udGV4dCA/IG9iamVjdENsYXNzIDogJ1J1bnRpbWVPYmplY3QnO1xuXG4gICAgLyoqIERldGVjdCBKYXZhIGVudmlyb25tZW50cy4gKi9cbiAgICB2YXIgamF2YSA9IC9cXGJKYXZhLy50ZXN0KGphdmFDbGFzcykgJiYgY29udGV4dC5qYXZhO1xuXG4gICAgLyoqIERldGVjdCBSaGluby4gKi9cbiAgICB2YXIgcmhpbm8gPSBqYXZhICYmIGdldENsYXNzT2YoY29udGV4dC5lbnZpcm9ubWVudCkgPT0gZW52aXJvQ2xhc3M7XG5cbiAgICAvKiogQSBjaGFyYWN0ZXIgdG8gcmVwcmVzZW50IGFscGhhLiAqL1xuICAgIHZhciBhbHBoYSA9IGphdmEgPyAnYScgOiAnXFx1MDNiMSc7XG5cbiAgICAvKiogQSBjaGFyYWN0ZXIgdG8gcmVwcmVzZW50IGJldGEuICovXG4gICAgdmFyIGJldGEgPSBqYXZhID8gJ2InIDogJ1xcdTAzYjInO1xuXG4gICAgLyoqIEJyb3dzZXIgZG9jdW1lbnQgb2JqZWN0LiAqL1xuICAgIHZhciBkb2MgPSBjb250ZXh0LmRvY3VtZW50IHx8IHt9O1xuXG4gICAgLyoqXG4gICAgICogRGV0ZWN0IE9wZXJhIGJyb3dzZXIgKFByZXN0by1iYXNlZCkuXG4gICAgICogaHR0cDovL3d3dy5ob3d0b2NyZWF0ZS5jby51ay9vcGVyYVN0dWZmL29wZXJhT2JqZWN0Lmh0bWxcbiAgICAgKiBodHRwOi8vZGV2Lm9wZXJhLmNvbS9hcnRpY2xlcy92aWV3L29wZXJhLW1pbmktd2ViLWNvbnRlbnQtYXV0aG9yaW5nLWd1aWRlbGluZXMvI29wZXJhbWluaVxuICAgICAqL1xuICAgIHZhciBvcGVyYSA9IGNvbnRleHQub3BlcmFtaW5pIHx8IGNvbnRleHQub3BlcmE7XG5cbiAgICAvKiogT3BlcmEgYFtbQ2xhc3NdXWAuICovXG4gICAgdmFyIG9wZXJhQ2xhc3MgPSByZU9wZXJhLnRlc3Qob3BlcmFDbGFzcyA9IChpc0N1c3RvbUNvbnRleHQgJiYgb3BlcmEpID8gb3BlcmFbJ1tbQ2xhc3NdXSddIDogZ2V0Q2xhc3NPZihvcGVyYSkpXG4gICAgICA/IG9wZXJhQ2xhc3NcbiAgICAgIDogKG9wZXJhID0gbnVsbCk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKiogVGVtcG9yYXJ5IHZhcmlhYmxlIHVzZWQgb3ZlciB0aGUgc2NyaXB0J3MgbGlmZXRpbWUuICovXG4gICAgdmFyIGRhdGE7XG5cbiAgICAvKiogVGhlIENQVSBhcmNoaXRlY3R1cmUuICovXG4gICAgdmFyIGFyY2ggPSB1YTtcblxuICAgIC8qKiBQbGF0Zm9ybSBkZXNjcmlwdGlvbiBhcnJheS4gKi9cbiAgICB2YXIgZGVzY3JpcHRpb24gPSBbXTtcblxuICAgIC8qKiBQbGF0Zm9ybSBhbHBoYS9iZXRhIGluZGljYXRvci4gKi9cbiAgICB2YXIgcHJlcmVsZWFzZSA9IG51bGw7XG5cbiAgICAvKiogQSBmbGFnIHRvIGluZGljYXRlIHRoYXQgZW52aXJvbm1lbnQgZmVhdHVyZXMgc2hvdWxkIGJlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcGxhdGZvcm0uICovXG4gICAgdmFyIHVzZUZlYXR1cmVzID0gdWEgPT0gdXNlckFnZW50O1xuXG4gICAgLyoqIFRoZSBicm93c2VyL2Vudmlyb25tZW50IHZlcnNpb24uICovXG4gICAgdmFyIHZlcnNpb24gPSB1c2VGZWF0dXJlcyAmJiBvcGVyYSAmJiB0eXBlb2Ygb3BlcmEudmVyc2lvbiA9PSAnZnVuY3Rpb24nICYmIG9wZXJhLnZlcnNpb24oKTtcblxuICAgIC8qKiBBIGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIE9TIGVuZHMgd2l0aCBcIi8gVmVyc2lvblwiICovXG4gICAgdmFyIGlzU3BlY2lhbENhc2VkT1M7XG5cbiAgICAvKiBEZXRlY3RhYmxlIGxheW91dCBlbmdpbmVzIChvcmRlciBpcyBpbXBvcnRhbnQpLiAqL1xuICAgIHZhciBsYXlvdXQgPSBnZXRMYXlvdXQoW1xuICAgICAgeyAnbGFiZWwnOiAnRWRnZUhUTUwnLCAncGF0dGVybic6ICdFZGdlJyB9LFxuICAgICAgJ1RyaWRlbnQnLFxuICAgICAgeyAnbGFiZWwnOiAnV2ViS2l0JywgJ3BhdHRlcm4nOiAnQXBwbGVXZWJLaXQnIH0sXG4gICAgICAnaUNhYicsXG4gICAgICAnUHJlc3RvJyxcbiAgICAgICdOZXRGcm9udCcsXG4gICAgICAnVGFzbWFuJyxcbiAgICAgICdLSFRNTCcsXG4gICAgICAnR2Vja28nXG4gICAgXSk7XG5cbiAgICAvKiBEZXRlY3RhYmxlIGJyb3dzZXIgbmFtZXMgKG9yZGVyIGlzIGltcG9ydGFudCkuICovXG4gICAgdmFyIG5hbWUgPSBnZXROYW1lKFtcbiAgICAgICdBZG9iZSBBSVInLFxuICAgICAgJ0Fyb3JhJyxcbiAgICAgICdBdmFudCBCcm93c2VyJyxcbiAgICAgICdCcmVhY2gnLFxuICAgICAgJ0NhbWlubycsXG4gICAgICAnRWxlY3Ryb24nLFxuICAgICAgJ0VwaXBoYW55JyxcbiAgICAgICdGZW5uZWMnLFxuICAgICAgJ0Zsb2NrJyxcbiAgICAgICdHYWxlb24nLFxuICAgICAgJ0dyZWVuQnJvd3NlcicsXG4gICAgICAnaUNhYicsXG4gICAgICAnSWNld2Vhc2VsJyxcbiAgICAgICdLLU1lbGVvbicsXG4gICAgICAnS29ucXVlcm9yJyxcbiAgICAgICdMdW5hc2NhcGUnLFxuICAgICAgJ01heHRob24nLFxuICAgICAgeyAnbGFiZWwnOiAnTWljcm9zb2Z0IEVkZ2UnLCAncGF0dGVybic6ICcoPzpFZGdlfEVkZ3xFZGdBfEVkZ2lPUyknIH0sXG4gICAgICAnTWlkb3JpJyxcbiAgICAgICdOb29rIEJyb3dzZXInLFxuICAgICAgJ1BhbGVNb29uJyxcbiAgICAgICdQaGFudG9tSlMnLFxuICAgICAgJ1JhdmVuJyxcbiAgICAgICdSZWtvbnEnLFxuICAgICAgJ1JvY2tNZWx0JyxcbiAgICAgIHsgJ2xhYmVsJzogJ1NhbXN1bmcgSW50ZXJuZXQnLCAncGF0dGVybic6ICdTYW1zdW5nQnJvd3NlcicgfSxcbiAgICAgICdTZWFNb25rZXknLFxuICAgICAgeyAnbGFiZWwnOiAnU2lsaycsICdwYXR0ZXJuJzogJyg/OkNsb3VkOXxTaWxrLUFjY2VsZXJhdGVkKScgfSxcbiAgICAgICdTbGVpcG5pcicsXG4gICAgICAnU2xpbUJyb3dzZXInLFxuICAgICAgeyAnbGFiZWwnOiAnU1JXYXJlIElyb24nLCAncGF0dGVybic6ICdJcm9uJyB9LFxuICAgICAgJ1N1bnJpc2UnLFxuICAgICAgJ1N3aWZ0Zm94JyxcbiAgICAgICdWaXZhbGRpJyxcbiAgICAgICdXYXRlcmZveCcsXG4gICAgICAnV2ViUG9zaXRpdmUnLFxuICAgICAgeyAnbGFiZWwnOiAnWWFuZGV4IEJyb3dzZXInLCAncGF0dGVybic6ICdZYUJyb3dzZXInIH0sXG4gICAgICB7ICdsYWJlbCc6ICdVQyBCcm93c2VyJywgJ3BhdHRlcm4nOiAnVUNCcm93c2VyJyB9LFxuICAgICAgJ09wZXJhIE1pbmknLFxuICAgICAgeyAnbGFiZWwnOiAnT3BlcmEgTWluaScsICdwYXR0ZXJuJzogJ09QaU9TJyB9LFxuICAgICAgJ09wZXJhJyxcbiAgICAgIHsgJ2xhYmVsJzogJ09wZXJhJywgJ3BhdHRlcm4nOiAnT1BSJyB9LFxuICAgICAgJ0Nocm9taXVtJyxcbiAgICAgICdDaHJvbWUnLFxuICAgICAgeyAnbGFiZWwnOiAnQ2hyb21lJywgJ3BhdHRlcm4nOiAnKD86SGVhZGxlc3NDaHJvbWUpJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnQ2hyb21lIE1vYmlsZScsICdwYXR0ZXJuJzogJyg/OkNyaU9TfENyTW8pJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnRmlyZWZveCcsICdwYXR0ZXJuJzogJyg/OkZpcmVmb3h8TWluZWZpZWxkKScgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0ZpcmVmb3ggZm9yIGlPUycsICdwYXR0ZXJuJzogJ0Z4aU9TJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnSUUnLCAncGF0dGVybic6ICdJRU1vYmlsZScgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0lFJywgJ3BhdHRlcm4nOiAnTVNJRScgfSxcbiAgICAgICdTYWZhcmknXG4gICAgXSk7XG5cbiAgICAvKiBEZXRlY3RhYmxlIHByb2R1Y3RzIChvcmRlciBpcyBpbXBvcnRhbnQpLiAqL1xuICAgIHZhciBwcm9kdWN0ID0gZ2V0UHJvZHVjdChbXG4gICAgICB7ICdsYWJlbCc6ICdCbGFja0JlcnJ5JywgJ3BhdHRlcm4nOiAnQkIxMCcgfSxcbiAgICAgICdCbGFja0JlcnJ5JyxcbiAgICAgIHsgJ2xhYmVsJzogJ0dhbGF4eSBTJywgJ3BhdHRlcm4nOiAnR1QtSTkwMDAnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUzInLCAncGF0dGVybic6ICdHVC1JOTEwMCcgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0dhbGF4eSBTMycsICdwYXR0ZXJuJzogJ0dULUk5MzAwJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnR2FsYXh5IFM0JywgJ3BhdHRlcm4nOiAnR1QtSTk1MDAnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUzUnLCAncGF0dGVybic6ICdTTS1HOTAwJyB9LFxuICAgICAgeyAnbGFiZWwnOiAnR2FsYXh5IFM2JywgJ3BhdHRlcm4nOiAnU00tRzkyMCcgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0dhbGF4eSBTNiBFZGdlJywgJ3BhdHRlcm4nOiAnU00tRzkyNScgfSxcbiAgICAgIHsgJ2xhYmVsJzogJ0dhbGF4eSBTNycsICdwYXR0ZXJuJzogJ1NNLUc5MzAnIH0sXG4gICAgICB7ICdsYWJlbCc6ICdHYWxheHkgUzcgRWRnZScsICdwYXR0ZXJuJzogJ1NNLUc5MzUnIH0sXG4gICAgICAnR29vZ2xlIFRWJyxcbiAgICAgICdMdW1pYScsXG4gICAgICAnaVBhZCcsXG4gICAgICAnaVBvZCcsXG4gICAgICAnaVBob25lJyxcbiAgICAgICdLaW5kbGUnLFxuICAgICAgeyAnbGFiZWwnOiAnS2luZGxlIEZpcmUnLCAncGF0dGVybic6ICcoPzpDbG91ZDl8U2lsay1BY2NlbGVyYXRlZCknIH0sXG4gICAgICAnTmV4dXMnLFxuICAgICAgJ05vb2snLFxuICAgICAgJ1BsYXlCb29rJyxcbiAgICAgICdQbGF5U3RhdGlvbiBWaXRhJyxcbiAgICAgICdQbGF5U3RhdGlvbicsXG4gICAgICAnVG91Y2hQYWQnLFxuICAgICAgJ1RyYW5zZm9ybWVyJyxcbiAgICAgIHsgJ2xhYmVsJzogJ1dpaSBVJywgJ3BhdHRlcm4nOiAnV2lpVScgfSxcbiAgICAgICdXaWknLFxuICAgICAgJ1hib3ggT25lJyxcbiAgICAgIHsgJ2xhYmVsJzogJ1hib3ggMzYwJywgJ3BhdHRlcm4nOiAnWGJveCcgfSxcbiAgICAgICdYb29tJ1xuICAgIF0pO1xuXG4gICAgLyogRGV0ZWN0YWJsZSBtYW51ZmFjdHVyZXJzLiAqL1xuICAgIHZhciBtYW51ZmFjdHVyZXIgPSBnZXRNYW51ZmFjdHVyZXIoe1xuICAgICAgJ0FwcGxlJzogeyAnaVBhZCc6IDEsICdpUGhvbmUnOiAxLCAnaVBvZCc6IDEgfSxcbiAgICAgICdBbGNhdGVsJzoge30sXG4gICAgICAnQXJjaG9zJzoge30sXG4gICAgICAnQW1hem9uJzogeyAnS2luZGxlJzogMSwgJ0tpbmRsZSBGaXJlJzogMSB9LFxuICAgICAgJ0FzdXMnOiB7ICdUcmFuc2Zvcm1lcic6IDEgfSxcbiAgICAgICdCYXJuZXMgJiBOb2JsZSc6IHsgJ05vb2snOiAxIH0sXG4gICAgICAnQmxhY2tCZXJyeSc6IHsgJ1BsYXlCb29rJzogMSB9LFxuICAgICAgJ0dvb2dsZSc6IHsgJ0dvb2dsZSBUVic6IDEsICdOZXh1cyc6IDEgfSxcbiAgICAgICdIUCc6IHsgJ1RvdWNoUGFkJzogMSB9LFxuICAgICAgJ0hUQyc6IHt9LFxuICAgICAgJ0h1YXdlaSc6IHt9LFxuICAgICAgJ0xlbm92byc6IHt9LFxuICAgICAgJ0xHJzoge30sXG4gICAgICAnTWljcm9zb2Z0JzogeyAnWGJveCc6IDEsICdYYm94IE9uZSc6IDEgfSxcbiAgICAgICdNb3Rvcm9sYSc6IHsgJ1hvb20nOiAxIH0sXG4gICAgICAnTmludGVuZG8nOiB7ICdXaWkgVSc6IDEsICAnV2lpJzogMSB9LFxuICAgICAgJ05va2lhJzogeyAnTHVtaWEnOiAxIH0sXG4gICAgICAnT3Bwbyc6IHt9LFxuICAgICAgJ1NhbXN1bmcnOiB7ICdHYWxheHkgUyc6IDEsICdHYWxheHkgUzInOiAxLCAnR2FsYXh5IFMzJzogMSwgJ0dhbGF4eSBTNCc6IDEgfSxcbiAgICAgICdTb255JzogeyAnUGxheVN0YXRpb24nOiAxLCAnUGxheVN0YXRpb24gVml0YSc6IDEgfSxcbiAgICAgICdYaWFvbWknOiB7ICdNaSc6IDEsICdSZWRtaSc6IDEgfVxuICAgIH0pO1xuXG4gICAgLyogRGV0ZWN0YWJsZSBvcGVyYXRpbmcgc3lzdGVtcyAob3JkZXIgaXMgaW1wb3J0YW50KS4gKi9cbiAgICB2YXIgb3MgPSBnZXRPUyhbXG4gICAgICAnV2luZG93cyBQaG9uZScsXG4gICAgICAnS2FpT1MnLFxuICAgICAgJ0FuZHJvaWQnLFxuICAgICAgJ0NlbnRPUycsXG4gICAgICB7ICdsYWJlbCc6ICdDaHJvbWUgT1MnLCAncGF0dGVybic6ICdDck9TJyB9LFxuICAgICAgJ0RlYmlhbicsXG4gICAgICB7ICdsYWJlbCc6ICdEcmFnb25GbHkgQlNEJywgJ3BhdHRlcm4nOiAnRHJhZ29uRmx5JyB9LFxuICAgICAgJ0ZlZG9yYScsXG4gICAgICAnRnJlZUJTRCcsXG4gICAgICAnR2VudG9vJyxcbiAgICAgICdIYWlrdScsXG4gICAgICAnS3VidW50dScsXG4gICAgICAnTGludXggTWludCcsXG4gICAgICAnT3BlbkJTRCcsXG4gICAgICAnUmVkIEhhdCcsXG4gICAgICAnU3VTRScsXG4gICAgICAnVWJ1bnR1JyxcbiAgICAgICdYdWJ1bnR1JyxcbiAgICAgICdDeWd3aW4nLFxuICAgICAgJ1N5bWJpYW4gT1MnLFxuICAgICAgJ2hwd09TJyxcbiAgICAgICd3ZWJPUyAnLFxuICAgICAgJ3dlYk9TJyxcbiAgICAgICdUYWJsZXQgT1MnLFxuICAgICAgJ1RpemVuJyxcbiAgICAgICdMaW51eCcsXG4gICAgICAnTWFjIE9TIFgnLFxuICAgICAgJ01hY2ludG9zaCcsXG4gICAgICAnTWFjJyxcbiAgICAgICdXaW5kb3dzIDk4OycsXG4gICAgICAnV2luZG93cyAnXG4gICAgXSk7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyB0aGUgbGF5b3V0IGVuZ2luZSBmcm9tIGFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGd1ZXNzZXMgQW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBsYXlvdXQgZW5naW5lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldExheW91dChndWVzc2VzKSB7XG4gICAgICByZXR1cm4gcmVkdWNlKGd1ZXNzZXMsIGZ1bmN0aW9uKHJlc3VsdCwgZ3Vlc3MpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBSZWdFeHAoJ1xcXFxiJyArIChcbiAgICAgICAgICBndWVzcy5wYXR0ZXJuIHx8IHF1YWxpZnkoZ3Vlc3MpXG4gICAgICAgICkgKyAnXFxcXGInLCAnaScpLmV4ZWModWEpICYmIChndWVzcy5sYWJlbCB8fCBndWVzcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyB0aGUgbWFudWZhY3R1cmVyIGZyb20gYW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZ3Vlc3NlcyBBbiBvYmplY3Qgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBtYW51ZmFjdHVyZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TWFudWZhY3R1cmVyKGd1ZXNzZXMpIHtcbiAgICAgIHJldHVybiByZWR1Y2UoZ3Vlc3NlcywgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICAgIC8vIExvb2t1cCB0aGUgbWFudWZhY3R1cmVyIGJ5IHByb2R1Y3Qgb3Igc2NhbiB0aGUgVUEgZm9yIHRoZSBtYW51ZmFjdHVyZXIuXG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgKFxuICAgICAgICAgIHZhbHVlW3Byb2R1Y3RdIHx8XG4gICAgICAgICAgdmFsdWVbL15bYS16XSsoPzogK1thLXpdK1xcYikqL2kuZXhlYyhwcm9kdWN0KV0gfHxcbiAgICAgICAgICBSZWdFeHAoJ1xcXFxiJyArIHF1YWxpZnkoa2V5KSArICcoPzpcXFxcYnxcXFxcdypcXFxcZCknLCAnaScpLmV4ZWModWEpXG4gICAgICAgICkgJiYga2V5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlja3MgdGhlIGJyb3dzZXIgbmFtZSBmcm9tIGFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGd1ZXNzZXMgQW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBicm93c2VyIG5hbWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmFtZShndWVzc2VzKSB7XG4gICAgICByZXR1cm4gcmVkdWNlKGd1ZXNzZXMsIGZ1bmN0aW9uKHJlc3VsdCwgZ3Vlc3MpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBSZWdFeHAoJ1xcXFxiJyArIChcbiAgICAgICAgICBndWVzcy5wYXR0ZXJuIHx8IHF1YWxpZnkoZ3Vlc3MpXG4gICAgICAgICkgKyAnXFxcXGInLCAnaScpLmV4ZWModWEpICYmIChndWVzcy5sYWJlbCB8fCBndWVzcyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQaWNrcyB0aGUgT1MgbmFtZSBmcm9tIGFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGd1ZXNzZXMgQW4gYXJyYXkgb2YgZ3Vlc3Nlcy5cbiAgICAgKiBAcmV0dXJucyB7bnVsbHxzdHJpbmd9IFRoZSBkZXRlY3RlZCBPUyBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE9TKGd1ZXNzZXMpIHtcbiAgICAgIHJldHVybiByZWR1Y2UoZ3Vlc3NlcywgZnVuY3Rpb24ocmVzdWx0LCBndWVzcykge1xuICAgICAgICB2YXIgcGF0dGVybiA9IGd1ZXNzLnBhdHRlcm4gfHwgcXVhbGlmeShndWVzcyk7XG4gICAgICAgIGlmICghcmVzdWx0ICYmIChyZXN1bHQgPVxuICAgICAgICAgICAgICBSZWdFeHAoJ1xcXFxiJyArIHBhdHRlcm4gKyAnKD86L1tcXFxcZC5dK3xbIFxcXFx3Ll0qKScsICdpJykuZXhlYyh1YSlcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICByZXN1bHQgPSBjbGVhbnVwT1MocmVzdWx0LCBwYXR0ZXJuLCBndWVzcy5sYWJlbCB8fCBndWVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpY2tzIHRoZSBwcm9kdWN0IG5hbWUgZnJvbSBhbiBhcnJheSBvZiBndWVzc2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBndWVzc2VzIEFuIGFycmF5IG9mIGd1ZXNzZXMuXG4gICAgICogQHJldHVybnMge251bGx8c3RyaW5nfSBUaGUgZGV0ZWN0ZWQgcHJvZHVjdCBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFByb2R1Y3QoZ3Vlc3Nlcykge1xuICAgICAgcmV0dXJuIHJlZHVjZShndWVzc2VzLCBmdW5jdGlvbihyZXN1bHQsIGd1ZXNzKSB7XG4gICAgICAgIHZhciBwYXR0ZXJuID0gZ3Vlc3MucGF0dGVybiB8fCBxdWFsaWZ5KGd1ZXNzKTtcbiAgICAgICAgaWYgKCFyZXN1bHQgJiYgKHJlc3VsdCA9XG4gICAgICAgICAgICAgIFJlZ0V4cCgnXFxcXGInICsgcGF0dGVybiArICcgKlxcXFxkK1suXFxcXHdfXSonLCAnaScpLmV4ZWModWEpIHx8XG4gICAgICAgICAgICAgIFJlZ0V4cCgnXFxcXGInICsgcGF0dGVybiArICcgKlxcXFx3Ky1bXFxcXHddKicsICdpJykuZXhlYyh1YSkgfHxcbiAgICAgICAgICAgICAgUmVnRXhwKCdcXFxcYicgKyBwYXR0ZXJuICsgJyg/OjsgKig/OlthLXpdK1tfLV0pP1thLXpdK1xcXFxkK3xbXiAoKTstXSopJywgJ2knKS5leGVjKHVhKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIC8vIFNwbGl0IGJ5IGZvcndhcmQgc2xhc2ggYW5kIGFwcGVuZCBwcm9kdWN0IHZlcnNpb24gaWYgbmVlZGVkLlxuICAgICAgICAgIGlmICgocmVzdWx0ID0gU3RyaW5nKChndWVzcy5sYWJlbCAmJiAhUmVnRXhwKHBhdHRlcm4sICdpJykudGVzdChndWVzcy5sYWJlbCkpID8gZ3Vlc3MubGFiZWwgOiByZXN1bHQpLnNwbGl0KCcvJykpWzFdICYmICEvW1xcZC5dKy8udGVzdChyZXN1bHRbMF0pKSB7XG4gICAgICAgICAgICByZXN1bHRbMF0gKz0gJyAnICsgcmVzdWx0WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDb3JyZWN0IGNoYXJhY3RlciBjYXNlIGFuZCBjbGVhbnVwIHN0cmluZy5cbiAgICAgICAgICBndWVzcyA9IGd1ZXNzLmxhYmVsIHx8IGd1ZXNzO1xuICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdChyZXN1bHRbMF1cbiAgICAgICAgICAgIC5yZXBsYWNlKFJlZ0V4cChwYXR0ZXJuLCAnaScpLCBndWVzcylcbiAgICAgICAgICAgIC5yZXBsYWNlKFJlZ0V4cCgnOyAqKD86JyArIGd1ZXNzICsgJ1tfLV0pPycsICdpJyksICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKFJlZ0V4cCgnKCcgKyBndWVzcyArICcpWy1fLl0/KFxcXFx3KScsICdpJyksICckMSAkMicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgdGhlIHZlcnNpb24gdXNpbmcgYW4gYXJyYXkgb2YgVUEgcGF0dGVybnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdHRlcm5zIEFuIGFycmF5IG9mIFVBIHBhdHRlcm5zLlxuICAgICAqIEByZXR1cm5zIHtudWxsfHN0cmluZ30gVGhlIGRldGVjdGVkIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0VmVyc2lvbihwYXR0ZXJucykge1xuICAgICAgcmV0dXJuIHJlZHVjZShwYXR0ZXJucywgZnVuY3Rpb24ocmVzdWx0LCBwYXR0ZXJuKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgfHwgKFJlZ0V4cChwYXR0ZXJuICtcbiAgICAgICAgICAnKD86LVtcXFxcZC5dKy98KD86IGZvciBbXFxcXHctXSspP1sgLy1dKShbXFxcXGQuXStbXiAoKTsvXy1dKiknLCAnaScpLmV4ZWModWEpIHx8IDApWzFdIHx8IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBwbGF0Zm9ybS5kZXNjcmlwdGlvbmAgd2hlbiB0aGUgcGxhdGZvcm0gb2JqZWN0IGlzIGNvZXJjZWQgdG8gYSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAbmFtZSB0b1N0cmluZ1xuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgYHBsYXRmb3JtLmRlc2NyaXB0aW9uYCBpZiBhdmFpbGFibGUsIGVsc2UgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nUGxhdGZvcm0oKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbiB8fCAnJztcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvLyBDb252ZXJ0IGxheW91dCB0byBhbiBhcnJheSBzbyB3ZSBjYW4gYWRkIGV4dHJhIGRldGFpbHMuXG4gICAgbGF5b3V0ICYmIChsYXlvdXQgPSBbbGF5b3V0XSk7XG5cbiAgICAvLyBEZXRlY3QgQW5kcm9pZCBwcm9kdWN0cy5cbiAgICAvLyBCcm93c2VycyBvbiBBbmRyb2lkIGRldmljZXMgdHlwaWNhbGx5IHByb3ZpZGUgdGhlaXIgcHJvZHVjdCBJRFMgYWZ0ZXIgXCJBbmRyb2lkO1wiXG4gICAgLy8gdXAgdG8gXCJCdWlsZFwiIG9yIFwiKSBBcHBsZVdlYktpdFwiLlxuICAgIC8vIEV4YW1wbGU6XG4gICAgLy8gXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOC4xLjA7IE1vdG8gRyAoNSkgUGx1cykgQXBwbGVXZWJLaXQvNTM3LjM2XG4gICAgLy8gKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNzAuMC4zNTM4LjgwIE1vYmlsZSBTYWZhcmkvNTM3LjM2XCJcbiAgICBpZiAoL1xcYkFuZHJvaWRcXGIvLnRlc3Qob3MpICYmICFwcm9kdWN0ICYmXG4gICAgICAgIChkYXRhID0gL1xcYkFuZHJvaWRbXjtdKjsoLio/KSg/OkJ1aWxkfFxcKSBBcHBsZVdlYktpdClcXGIvaS5leGVjKHVhKSkpIHtcbiAgICAgIHByb2R1Y3QgPSB0cmltKGRhdGFbMV0pXG4gICAgICAgIC8vIFJlcGxhY2UgYW55IGxhbmd1YWdlIGNvZGVzIChlZy4gXCJlbi1VU1wiKS5cbiAgICAgICAgLnJlcGxhY2UoL15bYS16XXsyfS1bYS16XXsyfTtcXHMqL2ksICcnKVxuICAgICAgICB8fCBudWxsO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgcHJvZHVjdCBuYW1lcyB0aGF0IGNvbnRhaW4gdGhlaXIgbWFudWZhY3R1cmVyJ3MgbmFtZS5cbiAgICBpZiAobWFudWZhY3R1cmVyICYmICFwcm9kdWN0KSB7XG4gICAgICBwcm9kdWN0ID0gZ2V0UHJvZHVjdChbbWFudWZhY3R1cmVyXSk7XG4gICAgfSBlbHNlIGlmIChtYW51ZmFjdHVyZXIgJiYgcHJvZHVjdCkge1xuICAgICAgcHJvZHVjdCA9IHByb2R1Y3RcbiAgICAgICAgLnJlcGxhY2UoUmVnRXhwKCdeKCcgKyBxdWFsaWZ5KG1hbnVmYWN0dXJlcikgKyAnKVstXy5cXFxcc10nLCAnaScpLCBtYW51ZmFjdHVyZXIgKyAnICcpXG4gICAgICAgIC5yZXBsYWNlKFJlZ0V4cCgnXignICsgcXVhbGlmeShtYW51ZmFjdHVyZXIpICsgJylbLV8uXT8oXFxcXHcpJywgJ2knKSwgbWFudWZhY3R1cmVyICsgJyAkMicpO1xuICAgIH1cbiAgICAvLyBDbGVhbiB1cCBHb29nbGUgVFYuXG4gICAgaWYgKChkYXRhID0gL1xcYkdvb2dsZSBUVlxcYi8uZXhlYyhwcm9kdWN0KSkpIHtcbiAgICAgIHByb2R1Y3QgPSBkYXRhWzBdO1xuICAgIH1cbiAgICAvLyBEZXRlY3Qgc2ltdWxhdG9ycy5cbiAgICBpZiAoL1xcYlNpbXVsYXRvclxcYi9pLnRlc3QodWEpKSB7XG4gICAgICBwcm9kdWN0ID0gKHByb2R1Y3QgPyBwcm9kdWN0ICsgJyAnIDogJycpICsgJ1NpbXVsYXRvcic7XG4gICAgfVxuICAgIC8vIERldGVjdCBPcGVyYSBNaW5pIDgrIHJ1bm5pbmcgaW4gVHVyYm8vVW5jb21wcmVzc2VkIG1vZGUgb24gaU9TLlxuICAgIGlmIChuYW1lID09ICdPcGVyYSBNaW5pJyAmJiAvXFxiT1BpT1NcXGIvLnRlc3QodWEpKSB7XG4gICAgICBkZXNjcmlwdGlvbi5wdXNoKCdydW5uaW5nIGluIFR1cmJvL1VuY29tcHJlc3NlZCBtb2RlJyk7XG4gICAgfVxuICAgIC8vIERldGVjdCBJRSBNb2JpbGUgMTEuXG4gICAgaWYgKG5hbWUgPT0gJ0lFJyAmJiAvXFxibGlrZSBpUGhvbmUgT1NcXGIvLnRlc3QodWEpKSB7XG4gICAgICBkYXRhID0gcGFyc2UodWEucmVwbGFjZSgvbGlrZSBpUGhvbmUgT1MvLCAnJykpO1xuICAgICAgbWFudWZhY3R1cmVyID0gZGF0YS5tYW51ZmFjdHVyZXI7XG4gICAgICBwcm9kdWN0ID0gZGF0YS5wcm9kdWN0O1xuICAgIH1cbiAgICAvLyBEZXRlY3QgaU9TLlxuICAgIGVsc2UgaWYgKC9eaVAvLnRlc3QocHJvZHVjdCkpIHtcbiAgICAgIG5hbWUgfHwgKG5hbWUgPSAnU2FmYXJpJyk7XG4gICAgICBvcyA9ICdpT1MnICsgKChkYXRhID0gLyBPUyAoW1xcZF9dKykvaS5leGVjKHVhKSlcbiAgICAgICAgPyAnICcgKyBkYXRhWzFdLnJlcGxhY2UoL18vZywgJy4nKVxuICAgICAgICA6ICcnKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IEt1YnVudHUuXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnS29ucXVlcm9yJyAmJiAvXkxpbnV4XFxiL2kudGVzdChvcykpIHtcbiAgICAgIG9zID0gJ0t1YnVudHUnO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgQW5kcm9pZCBicm93c2Vycy5cbiAgICBlbHNlIGlmICgobWFudWZhY3R1cmVyICYmIG1hbnVmYWN0dXJlciAhPSAnR29vZ2xlJyAmJlxuICAgICAgICAoKC9DaHJvbWUvLnRlc3QobmFtZSkgJiYgIS9cXGJNb2JpbGUgU2FmYXJpXFxiL2kudGVzdCh1YSkpIHx8IC9cXGJWaXRhXFxiLy50ZXN0KHByb2R1Y3QpKSkgfHxcbiAgICAgICAgKC9cXGJBbmRyb2lkXFxiLy50ZXN0KG9zKSAmJiAvXkNocm9tZS8udGVzdChuYW1lKSAmJiAvXFxiVmVyc2lvblxcLy9pLnRlc3QodWEpKSkge1xuICAgICAgbmFtZSA9ICdBbmRyb2lkIEJyb3dzZXInO1xuICAgICAgb3MgPSAvXFxiQW5kcm9pZFxcYi8udGVzdChvcykgPyBvcyA6ICdBbmRyb2lkJztcbiAgICB9XG4gICAgLy8gRGV0ZWN0IFNpbGsgZGVza3RvcC9hY2NlbGVyYXRlZCBtb2Rlcy5cbiAgICBlbHNlIGlmIChuYW1lID09ICdTaWxrJykge1xuICAgICAgaWYgKCEvXFxiTW9iaS9pLnRlc3QodWEpKSB7XG4gICAgICAgIG9zID0gJ0FuZHJvaWQnO1xuICAgICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KCdkZXNrdG9wIG1vZGUnKTtcbiAgICAgIH1cbiAgICAgIGlmICgvQWNjZWxlcmF0ZWQgKj0gKnRydWUvaS50ZXN0KHVhKSkge1xuICAgICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KCdhY2NlbGVyYXRlZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEZXRlY3QgVUMgQnJvd3NlciBzcGVlZCBtb2RlLlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ1VDIEJyb3dzZXInICYmIC9cXGJVQ1dFQlxcYi8udGVzdCh1YSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ3NwZWVkIG1vZGUnKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IFBhbGVNb29uIGlkZW50aWZ5aW5nIGFzIEZpcmVmb3guXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnUGFsZU1vb24nICYmIChkYXRhID0gL1xcYkZpcmVmb3hcXC8oW1xcZC5dKylcXGIvLmV4ZWModWEpKSkge1xuICAgICAgZGVzY3JpcHRpb24ucHVzaCgnaWRlbnRpZnlpbmcgYXMgRmlyZWZveCAnICsgZGF0YVsxXSk7XG4gICAgfVxuICAgIC8vIERldGVjdCBGaXJlZm94IE9TIGFuZCBwcm9kdWN0cyBydW5uaW5nIEZpcmVmb3guXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnRmlyZWZveCcgJiYgKGRhdGEgPSAvXFxiKE1vYmlsZXxUYWJsZXR8VFYpXFxiL2kuZXhlYyh1YSkpKSB7XG4gICAgICBvcyB8fCAob3MgPSAnRmlyZWZveCBPUycpO1xuICAgICAgcHJvZHVjdCB8fCAocHJvZHVjdCA9IGRhdGFbMV0pO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgZmFsc2UgcG9zaXRpdmVzIGZvciBGaXJlZm94L1NhZmFyaS5cbiAgICBlbHNlIGlmICghbmFtZSB8fCAoZGF0YSA9ICEvXFxiTWluZWZpZWxkXFxiL2kudGVzdCh1YSkgJiYgL1xcYig/OkZpcmVmb3h8U2FmYXJpKVxcYi8uZXhlYyhuYW1lKSkpIHtcbiAgICAgIC8vIEVzY2FwZSB0aGUgYC9gIGZvciBGaXJlZm94IDEuXG4gICAgICBpZiAobmFtZSAmJiAhcHJvZHVjdCAmJiAvW1xcLyxdfF5bXihdKz9cXCkvLnRlc3QodWEuc2xpY2UodWEuaW5kZXhPZihkYXRhICsgJy8nKSArIDgpKSkge1xuICAgICAgICAvLyBDbGVhciBuYW1lIG9mIGZhbHNlIHBvc2l0aXZlcy5cbiAgICAgICAgbmFtZSA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBSZWFzc2lnbiBhIGdlbmVyaWMgbmFtZS5cbiAgICAgIGlmICgoZGF0YSA9IHByb2R1Y3QgfHwgbWFudWZhY3R1cmVyIHx8IG9zKSAmJlxuICAgICAgICAgIChwcm9kdWN0IHx8IG1hbnVmYWN0dXJlciB8fCAvXFxiKD86QW5kcm9pZHxTeW1iaWFuIE9TfFRhYmxldCBPU3x3ZWJPUylcXGIvLnRlc3Qob3MpKSkge1xuICAgICAgICBuYW1lID0gL1thLXpdKyg/OiBIYXQpPy9pLmV4ZWMoL1xcYkFuZHJvaWRcXGIvLnRlc3Qob3MpID8gb3MgOiBkYXRhKSArICcgQnJvd3Nlcic7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFkZCBDaHJvbWUgdmVyc2lvbiB0byBkZXNjcmlwdGlvbiBmb3IgRWxlY3Ryb24uXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnRWxlY3Ryb24nICYmIChkYXRhID0gKC9cXGJDaHJvbWVcXC8oW1xcZC5dKylcXGIvLmV4ZWModWEpIHx8IDApWzFdKSkge1xuICAgICAgZGVzY3JpcHRpb24ucHVzaCgnQ2hyb21pdW0gJyArIGRhdGEpO1xuICAgIH1cbiAgICAvLyBEZXRlY3Qgbm9uLU9wZXJhIChQcmVzdG8tYmFzZWQpIHZlcnNpb25zIChvcmRlciBpcyBpbXBvcnRhbnQpLlxuICAgIGlmICghdmVyc2lvbikge1xuICAgICAgdmVyc2lvbiA9IGdldFZlcnNpb24oW1xuICAgICAgICAnKD86Q2xvdWQ5fENyaU9TfENyTW98RWRnZXxFZGd8RWRnQXxFZGdpT1N8RnhpT1N8SGVhZGxlc3NDaHJvbWV8SUVNb2JpbGV8SXJvbnxPcGVyYSA/TWluaXxPUGlPU3xPUFJ8UmF2ZW58U2Ftc3VuZ0Jyb3dzZXJ8U2lsayg/IS9bXFxcXGQuXSskKXxVQ0Jyb3dzZXJ8WWFCcm93c2VyKScsXG4gICAgICAgICdWZXJzaW9uJyxcbiAgICAgICAgcXVhbGlmeShuYW1lKSxcbiAgICAgICAgJyg/OkZpcmVmb3h8TWluZWZpZWxkfE5ldEZyb250KSdcbiAgICAgIF0pO1xuICAgIH1cbiAgICAvLyBEZXRlY3Qgc3R1YmJvcm4gbGF5b3V0IGVuZ2luZXMuXG4gICAgaWYgKChkYXRhID1cbiAgICAgICAgICBsYXlvdXQgPT0gJ2lDYWInICYmIHBhcnNlRmxvYXQodmVyc2lvbikgPiAzICYmICdXZWJLaXQnIHx8XG4gICAgICAgICAgL1xcYk9wZXJhXFxiLy50ZXN0KG5hbWUpICYmICgvXFxiT1BSXFxiLy50ZXN0KHVhKSA/ICdCbGluaycgOiAnUHJlc3RvJykgfHxcbiAgICAgICAgICAvXFxiKD86TWlkb3JpfE5vb2t8U2FmYXJpKVxcYi9pLnRlc3QodWEpICYmICEvXig/OlRyaWRlbnR8RWRnZUhUTUwpJC8udGVzdChsYXlvdXQpICYmICdXZWJLaXQnIHx8XG4gICAgICAgICAgIWxheW91dCAmJiAvXFxiTVNJRVxcYi9pLnRlc3QodWEpICYmIChvcyA9PSAnTWFjIE9TJyA/ICdUYXNtYW4nIDogJ1RyaWRlbnQnKSB8fFxuICAgICAgICAgIGxheW91dCA9PSAnV2ViS2l0JyAmJiAvXFxiUGxheVN0YXRpb25cXGIoPyEgVml0YVxcYikvaS50ZXN0KG5hbWUpICYmICdOZXRGcm9udCdcbiAgICAgICAgKSkge1xuICAgICAgbGF5b3V0ID0gW2RhdGFdO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgV2luZG93cyBQaG9uZSA3IGRlc2t0b3AgbW9kZS5cbiAgICBpZiAobmFtZSA9PSAnSUUnICYmIChkYXRhID0gKC87ICooPzpYQkxXUHxadW5lV1ApKFxcZCspL2kuZXhlYyh1YSkgfHwgMClbMV0pKSB7XG4gICAgICBuYW1lICs9ICcgTW9iaWxlJztcbiAgICAgIG9zID0gJ1dpbmRvd3MgUGhvbmUgJyArICgvXFwrJC8udGVzdChkYXRhKSA/IGRhdGEgOiBkYXRhICsgJy54Jyk7XG4gICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KCdkZXNrdG9wIG1vZGUnKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IFdpbmRvd3MgUGhvbmUgOC54IGRlc2t0b3AgbW9kZS5cbiAgICBlbHNlIGlmICgvXFxiV1BEZXNrdG9wXFxiL2kudGVzdCh1YSkpIHtcbiAgICAgIG5hbWUgPSAnSUUgTW9iaWxlJztcbiAgICAgIG9zID0gJ1dpbmRvd3MgUGhvbmUgOC54JztcbiAgICAgIGRlc2NyaXB0aW9uLnVuc2hpZnQoJ2Rlc2t0b3AgbW9kZScpO1xuICAgICAgdmVyc2lvbiB8fCAodmVyc2lvbiA9ICgvXFxicnY6KFtcXGQuXSspLy5leGVjKHVhKSB8fCAwKVsxXSk7XG4gICAgfVxuICAgIC8vIERldGVjdCBJRSAxMSBpZGVudGlmeWluZyBhcyBvdGhlciBicm93c2Vycy5cbiAgICBlbHNlIGlmIChuYW1lICE9ICdJRScgJiYgbGF5b3V0ID09ICdUcmlkZW50JyAmJiAoZGF0YSA9IC9cXGJydjooW1xcZC5dKykvLmV4ZWModWEpKSkge1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgZGVzY3JpcHRpb24ucHVzaCgnaWRlbnRpZnlpbmcgYXMgJyArIG5hbWUgKyAodmVyc2lvbiA/ICcgJyArIHZlcnNpb24gOiAnJykpO1xuICAgICAgfVxuICAgICAgbmFtZSA9ICdJRSc7XG4gICAgICB2ZXJzaW9uID0gZGF0YVsxXTtcbiAgICB9XG4gICAgLy8gTGV2ZXJhZ2UgZW52aXJvbm1lbnQgZmVhdHVyZXMuXG4gICAgaWYgKHVzZUZlYXR1cmVzKSB7XG4gICAgICAvLyBEZXRlY3Qgc2VydmVyLXNpZGUgZW52aXJvbm1lbnRzLlxuICAgICAgLy8gUmhpbm8gaGFzIGEgZ2xvYmFsIGZ1bmN0aW9uIHdoaWxlIG90aGVycyBoYXZlIGEgZ2xvYmFsIG9iamVjdC5cbiAgICAgIGlmIChpc0hvc3RUeXBlKGNvbnRleHQsICdnbG9iYWwnKSkge1xuICAgICAgICBpZiAoamF2YSkge1xuICAgICAgICAgIGRhdGEgPSBqYXZhLmxhbmcuU3lzdGVtO1xuICAgICAgICAgIGFyY2ggPSBkYXRhLmdldFByb3BlcnR5KCdvcy5hcmNoJyk7XG4gICAgICAgICAgb3MgPSBvcyB8fCBkYXRhLmdldFByb3BlcnR5KCdvcy5uYW1lJykgKyAnICcgKyBkYXRhLmdldFByb3BlcnR5KCdvcy52ZXJzaW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJoaW5vKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZlcnNpb24gPSBjb250ZXh0LnJlcXVpcmUoJ3JpbmdvL2VuZ2luZScpLnZlcnNpb24uam9pbignLicpO1xuICAgICAgICAgICAgbmFtZSA9ICdSaW5nb0pTJztcbiAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIGlmICgoZGF0YSA9IGNvbnRleHQuc3lzdGVtKSAmJiBkYXRhLmdsb2JhbC5zeXN0ZW0gPT0gY29udGV4dC5zeXN0ZW0pIHtcbiAgICAgICAgICAgICAgbmFtZSA9ICdOYXJ3aGFsJztcbiAgICAgICAgICAgICAgb3MgfHwgKG9zID0gZGF0YVswXS5vcyB8fCBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBuYW1lID0gJ1JoaW5vJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgdHlwZW9mIGNvbnRleHQucHJvY2VzcyA9PSAnb2JqZWN0JyAmJiAhY29udGV4dC5wcm9jZXNzLmJyb3dzZXIgJiZcbiAgICAgICAgICAoZGF0YSA9IGNvbnRleHQucHJvY2VzcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnZlcnNpb25zID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEudmVyc2lvbnMuZWxlY3Ryb24gPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucHVzaCgnTm9kZSAnICsgZGF0YS52ZXJzaW9ucy5ub2RlKTtcbiAgICAgICAgICAgICAgbmFtZSA9ICdFbGVjdHJvbic7XG4gICAgICAgICAgICAgIHZlcnNpb24gPSBkYXRhLnZlcnNpb25zLmVsZWN0cm9uO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YS52ZXJzaW9ucy5udyA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5wdXNoKCdDaHJvbWl1bSAnICsgdmVyc2lvbiwgJ05vZGUgJyArIGRhdGEudmVyc2lvbnMubm9kZSk7XG4gICAgICAgICAgICAgIG5hbWUgPSAnTlcuanMnO1xuICAgICAgICAgICAgICB2ZXJzaW9uID0gZGF0YS52ZXJzaW9ucy5udztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBuYW1lID0gJ05vZGUuanMnO1xuICAgICAgICAgICAgYXJjaCA9IGRhdGEuYXJjaDtcbiAgICAgICAgICAgIG9zID0gZGF0YS5wbGF0Zm9ybTtcbiAgICAgICAgICAgIHZlcnNpb24gPSAvW1xcZC5dKy8uZXhlYyhkYXRhLnZlcnNpb24pO1xuICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gPyB2ZXJzaW9uWzBdIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIERldGVjdCBBZG9iZSBBSVIuXG4gICAgICBlbHNlIGlmIChnZXRDbGFzc09mKChkYXRhID0gY29udGV4dC5ydW50aW1lKSkgPT0gYWlyUnVudGltZUNsYXNzKSB7XG4gICAgICAgIG5hbWUgPSAnQWRvYmUgQUlSJztcbiAgICAgICAgb3MgPSBkYXRhLmZsYXNoLnN5c3RlbS5DYXBhYmlsaXRpZXMub3M7XG4gICAgICB9XG4gICAgICAvLyBEZXRlY3QgUGhhbnRvbUpTLlxuICAgICAgZWxzZSBpZiAoZ2V0Q2xhc3NPZigoZGF0YSA9IGNvbnRleHQucGhhbnRvbSkpID09IHBoYW50b21DbGFzcykge1xuICAgICAgICBuYW1lID0gJ1BoYW50b21KUyc7XG4gICAgICAgIHZlcnNpb24gPSAoZGF0YSA9IGRhdGEudmVyc2lvbiB8fCBudWxsKSAmJiAoZGF0YS5tYWpvciArICcuJyArIGRhdGEubWlub3IgKyAnLicgKyBkYXRhLnBhdGNoKTtcbiAgICAgIH1cbiAgICAgIC8vIERldGVjdCBJRSBjb21wYXRpYmlsaXR5IG1vZGVzLlxuICAgICAgZWxzZSBpZiAodHlwZW9mIGRvYy5kb2N1bWVudE1vZGUgPT0gJ251bWJlcicgJiYgKGRhdGEgPSAvXFxiVHJpZGVudFxcLyhcXGQrKS9pLmV4ZWModWEpKSkge1xuICAgICAgICAvLyBXZSdyZSBpbiBjb21wYXRpYmlsaXR5IG1vZGUgd2hlbiB0aGUgVHJpZGVudCB2ZXJzaW9uICsgNCBkb2Vzbid0XG4gICAgICAgIC8vIGVxdWFsIHRoZSBkb2N1bWVudCBtb2RlLlxuICAgICAgICB2ZXJzaW9uID0gW3ZlcnNpb24sIGRvYy5kb2N1bWVudE1vZGVdO1xuICAgICAgICBpZiAoKGRhdGEgPSArZGF0YVsxXSArIDQpICE9IHZlcnNpb25bMV0pIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbi5wdXNoKCdJRSAnICsgdmVyc2lvblsxXSArICcgbW9kZScpO1xuICAgICAgICAgIGxheW91dCAmJiAobGF5b3V0WzFdID0gJycpO1xuICAgICAgICAgIHZlcnNpb25bMV0gPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHZlcnNpb24gPSBuYW1lID09ICdJRScgPyBTdHJpbmcodmVyc2lvblsxXS50b0ZpeGVkKDEpKSA6IHZlcnNpb25bMF07XG4gICAgICB9XG4gICAgICAvLyBEZXRlY3QgSUUgMTEgbWFza2luZyBhcyBvdGhlciBicm93c2Vycy5cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBkb2MuZG9jdW1lbnRNb2RlID09ICdudW1iZXInICYmIC9eKD86Q2hyb21lfEZpcmVmb3gpXFxiLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ21hc2tpbmcgYXMgJyArIG5hbWUgKyAnICcgKyB2ZXJzaW9uKTtcbiAgICAgICAgbmFtZSA9ICdJRSc7XG4gICAgICAgIHZlcnNpb24gPSAnMTEuMCc7XG4gICAgICAgIGxheW91dCA9IFsnVHJpZGVudCddO1xuICAgICAgICBvcyA9ICdXaW5kb3dzJztcbiAgICAgIH1cbiAgICAgIG9zID0gb3MgJiYgZm9ybWF0KG9zKTtcbiAgICB9XG4gICAgLy8gRGV0ZWN0IHByZXJlbGVhc2UgcGhhc2VzLlxuICAgIGlmICh2ZXJzaW9uICYmIChkYXRhID1cbiAgICAgICAgICAvKD86W2FiXXxkcHxwcmV8W2FiXVxcZCtwcmUpKD86XFxkK1xcKz8pPyQvaS5leGVjKHZlcnNpb24pIHx8XG4gICAgICAgICAgLyg/OmFscGhhfGJldGEpKD86ID9cXGQpPy9pLmV4ZWModWEgKyAnOycgKyAodXNlRmVhdHVyZXMgJiYgbmF2LmFwcE1pbm9yVmVyc2lvbikpIHx8XG4gICAgICAgICAgL1xcYk1pbmVmaWVsZFxcYi9pLnRlc3QodWEpICYmICdhJ1xuICAgICAgICApKSB7XG4gICAgICBwcmVyZWxlYXNlID0gL2IvaS50ZXN0KGRhdGEpID8gJ2JldGEnIDogJ2FscGhhJztcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoUmVnRXhwKGRhdGEgKyAnXFxcXCs/JCcpLCAnJykgK1xuICAgICAgICAocHJlcmVsZWFzZSA9PSAnYmV0YScgPyBiZXRhIDogYWxwaGEpICsgKC9cXGQrXFwrPy8uZXhlYyhkYXRhKSB8fCAnJyk7XG4gICAgfVxuICAgIC8vIERldGVjdCBGaXJlZm94IE1vYmlsZS5cbiAgICBpZiAobmFtZSA9PSAnRmVubmVjJyB8fCBuYW1lID09ICdGaXJlZm94JyAmJiAvXFxiKD86QW5kcm9pZHxGaXJlZm94IE9TfEthaU9TKVxcYi8udGVzdChvcykpIHtcbiAgICAgIG5hbWUgPSAnRmlyZWZveCBNb2JpbGUnO1xuICAgIH1cbiAgICAvLyBPYnNjdXJlIE1heHRob24ncyB1bnJlbGlhYmxlIHZlcnNpb24uXG4gICAgZWxzZSBpZiAobmFtZSA9PSAnTWF4dGhvbicgJiYgdmVyc2lvbikge1xuICAgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgvXFwuW1xcZC5dKy8sICcueCcpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgWGJveCAzNjAgYW5kIFhib3ggT25lLlxuICAgIGVsc2UgaWYgKC9cXGJYYm94XFxiL2kudGVzdChwcm9kdWN0KSkge1xuICAgICAgaWYgKHByb2R1Y3QgPT0gJ1hib3ggMzYwJykge1xuICAgICAgICBvcyA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAocHJvZHVjdCA9PSAnWGJveCAzNjAnICYmIC9cXGJJRU1vYmlsZVxcYi8udGVzdCh1YSkpIHtcbiAgICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgnbW9iaWxlIG1vZGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQWRkIG1vYmlsZSBwb3N0Zml4LlxuICAgIGVsc2UgaWYgKCgvXig/OkNocm9tZXxJRXxPcGVyYSkkLy50ZXN0KG5hbWUpIHx8IG5hbWUgJiYgIXByb2R1Y3QgJiYgIS9Ccm93c2VyfE1vYmkvLnRlc3QobmFtZSkpICYmXG4gICAgICAgIChvcyA9PSAnV2luZG93cyBDRScgfHwgL01vYmkvaS50ZXN0KHVhKSkpIHtcbiAgICAgIG5hbWUgKz0gJyBNb2JpbGUnO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgSUUgcGxhdGZvcm0gcHJldmlldy5cbiAgICBlbHNlIGlmIChuYW1lID09ICdJRScgJiYgdXNlRmVhdHVyZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChjb250ZXh0LmV4dGVybmFsID09PSBudWxsKSB7XG4gICAgICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgncGxhdGZvcm0gcHJldmlldycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgnZW1iZWRkZWQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGV0ZWN0IEJsYWNrQmVycnkgT1MgdmVyc2lvbi5cbiAgICAvLyBodHRwOi8vZG9jcy5ibGFja2JlcnJ5LmNvbS9lbi9kZXZlbG9wZXJzL2RlbGl2ZXJhYmxlcy8xODE2OS9IVFRQX2hlYWRlcnNfc2VudF9ieV9CQl9Ccm93c2VyXzEyMzQ5MTFfMTEuanNwXG4gICAgZWxzZSBpZiAoKC9cXGJCbGFja0JlcnJ5XFxiLy50ZXN0KHByb2R1Y3QpIHx8IC9cXGJCQjEwXFxiLy50ZXN0KHVhKSkgJiYgKGRhdGEgPVxuICAgICAgICAgIChSZWdFeHAocHJvZHVjdC5yZXBsYWNlKC8gKy9nLCAnIConKSArICcvKFsuXFxcXGRdKyknLCAnaScpLmV4ZWModWEpIHx8IDApWzFdIHx8XG4gICAgICAgICAgdmVyc2lvblxuICAgICAgICApKSB7XG4gICAgICBkYXRhID0gW2RhdGEsIC9CQjEwLy50ZXN0KHVhKV07XG4gICAgICBvcyA9IChkYXRhWzFdID8gKHByb2R1Y3QgPSBudWxsLCBtYW51ZmFjdHVyZXIgPSAnQmxhY2tCZXJyeScpIDogJ0RldmljZSBTb2Z0d2FyZScpICsgJyAnICsgZGF0YVswXTtcbiAgICAgIHZlcnNpb24gPSBudWxsO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgT3BlcmEgaWRlbnRpZnlpbmcvbWFza2luZyBpdHNlbGYgYXMgYW5vdGhlciBicm93c2VyLlxuICAgIC8vIGh0dHA6Ly93d3cub3BlcmEuY29tL3N1cHBvcnQva2Ivdmlldy84NDMvXG4gICAgZWxzZSBpZiAodGhpcyAhPSBmb3JPd24gJiYgcHJvZHVjdCAhPSAnV2lpJyAmJiAoXG4gICAgICAgICAgKHVzZUZlYXR1cmVzICYmIG9wZXJhKSB8fFxuICAgICAgICAgICgvT3BlcmEvLnRlc3QobmFtZSkgJiYgL1xcYig/Ok1TSUV8RmlyZWZveClcXGIvaS50ZXN0KHVhKSkgfHxcbiAgICAgICAgICAobmFtZSA9PSAnRmlyZWZveCcgJiYgL1xcYk9TIFggKD86XFxkK1xcLil7Mix9Ly50ZXN0KG9zKSkgfHxcbiAgICAgICAgICAobmFtZSA9PSAnSUUnICYmIChcbiAgICAgICAgICAgIChvcyAmJiAhL15XaW4vLnRlc3Qob3MpICYmIHZlcnNpb24gPiA1LjUpIHx8XG4gICAgICAgICAgICAvXFxiV2luZG93cyBYUFxcYi8udGVzdChvcykgJiYgdmVyc2lvbiA+IDggfHxcbiAgICAgICAgICAgIHZlcnNpb24gPT0gOCAmJiAhL1xcYlRyaWRlbnRcXGIvLnRlc3QodWEpXG4gICAgICAgICAgKSlcbiAgICAgICAgKSAmJiAhcmVPcGVyYS50ZXN0KChkYXRhID0gcGFyc2UuY2FsbChmb3JPd24sIHVhLnJlcGxhY2UocmVPcGVyYSwgJycpICsgJzsnKSkpICYmIGRhdGEubmFtZSkge1xuICAgICAgLy8gV2hlbiBcImlkZW50aWZ5aW5nXCIsIHRoZSBVQSBjb250YWlucyBib3RoIE9wZXJhIGFuZCB0aGUgb3RoZXIgYnJvd3NlcidzIG5hbWUuXG4gICAgICBkYXRhID0gJ2luZyBhcyAnICsgZGF0YS5uYW1lICsgKChkYXRhID0gZGF0YS52ZXJzaW9uKSA/ICcgJyArIGRhdGEgOiAnJyk7XG4gICAgICBpZiAocmVPcGVyYS50ZXN0KG5hbWUpKSB7XG4gICAgICAgIGlmICgvXFxiSUVcXGIvLnRlc3QoZGF0YSkgJiYgb3MgPT0gJ01hYyBPUycpIHtcbiAgICAgICAgICBvcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9ICdpZGVudGlmeScgKyBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gV2hlbiBcIm1hc2tpbmdcIiwgdGhlIFVBIGNvbnRhaW5zIG9ubHkgdGhlIG90aGVyIGJyb3dzZXIncyBuYW1lLlxuICAgICAgZWxzZSB7XG4gICAgICAgIGRhdGEgPSAnbWFzaycgKyBkYXRhO1xuICAgICAgICBpZiAob3BlcmFDbGFzcykge1xuICAgICAgICAgIG5hbWUgPSBmb3JtYXQob3BlcmFDbGFzcy5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEgJDInKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmFtZSA9ICdPcGVyYSc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9cXGJJRVxcYi8udGVzdChkYXRhKSkge1xuICAgICAgICAgIG9zID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXVzZUZlYXR1cmVzKSB7XG4gICAgICAgICAgdmVyc2lvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxheW91dCA9IFsnUHJlc3RvJ107XG4gICAgICBkZXNjcmlwdGlvbi5wdXNoKGRhdGEpO1xuICAgIH1cbiAgICAvLyBEZXRlY3QgV2ViS2l0IE5pZ2h0bHkgYW5kIGFwcHJveGltYXRlIENocm9tZS9TYWZhcmkgdmVyc2lvbnMuXG4gICAgaWYgKChkYXRhID0gKC9cXGJBcHBsZVdlYktpdFxcLyhbXFxkLl0rXFwrPykvaS5leGVjKHVhKSB8fCAwKVsxXSkpIHtcbiAgICAgIC8vIENvcnJlY3QgYnVpbGQgbnVtYmVyIGZvciBudW1lcmljIGNvbXBhcmlzb24uXG4gICAgICAvLyAoZS5nLiBcIjUzMi41XCIgYmVjb21lcyBcIjUzMi4wNVwiKVxuICAgICAgZGF0YSA9IFtwYXJzZUZsb2F0KGRhdGEucmVwbGFjZSgvXFwuKFxcZCkkLywgJy4wJDEnKSksIGRhdGFdO1xuICAgICAgLy8gTmlnaHRseSBidWlsZHMgYXJlIHBvc3RmaXhlZCB3aXRoIGEgXCIrXCIuXG4gICAgICBpZiAobmFtZSA9PSAnU2FmYXJpJyAmJiBkYXRhWzFdLnNsaWNlKC0xKSA9PSAnKycpIHtcbiAgICAgICAgbmFtZSA9ICdXZWJLaXQgTmlnaHRseSc7XG4gICAgICAgIHByZXJlbGVhc2UgPSAnYWxwaGEnO1xuICAgICAgICB2ZXJzaW9uID0gZGF0YVsxXS5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciBpbmNvcnJlY3QgYnJvd3NlciB2ZXJzaW9ucy5cbiAgICAgIGVsc2UgaWYgKHZlcnNpb24gPT0gZGF0YVsxXSB8fFxuICAgICAgICAgIHZlcnNpb24gPT0gKGRhdGFbMl0gPSAoL1xcYlNhZmFyaVxcLyhbXFxkLl0rXFwrPykvaS5leGVjKHVhKSB8fCAwKVsxXSkpIHtcbiAgICAgICAgdmVyc2lvbiA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBVc2UgdGhlIGZ1bGwgQ2hyb21lIHZlcnNpb24gd2hlbiBhdmFpbGFibGUuXG4gICAgICBkYXRhWzFdID0gKC9cXGIoPzpIZWFkbGVzcyk/Q2hyb21lXFwvKFtcXGQuXSspL2kuZXhlYyh1YSkgfHwgMClbMV07XG4gICAgICAvLyBEZXRlY3QgQmxpbmsgbGF5b3V0IGVuZ2luZS5cbiAgICAgIGlmIChkYXRhWzBdID09IDUzNy4zNiAmJiBkYXRhWzJdID09IDUzNy4zNiAmJiBwYXJzZUZsb2F0KGRhdGFbMV0pID49IDI4ICYmIGxheW91dCA9PSAnV2ViS2l0Jykge1xuICAgICAgICBsYXlvdXQgPSBbJ0JsaW5rJ107XG4gICAgICB9XG4gICAgICAvLyBEZXRlY3QgSmF2YVNjcmlwdENvcmUuXG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzY3Njg0NzQvaG93LWNhbi1pLWRldGVjdC13aGljaC1qYXZhc2NyaXB0LWVuZ2luZS12OC1vci1qc2MtaXMtdXNlZC1hdC1ydW50aW1lLWluLWFuZHJvaVxuICAgICAgaWYgKCF1c2VGZWF0dXJlcyB8fCAoIWxpa2VDaHJvbWUgJiYgIWRhdGFbMV0pKSB7XG4gICAgICAgIGxheW91dCAmJiAobGF5b3V0WzFdID0gJ2xpa2UgU2FmYXJpJyk7XG4gICAgICAgIGRhdGEgPSAoZGF0YSA9IGRhdGFbMF0sIGRhdGEgPCA0MDAgPyAxIDogZGF0YSA8IDUwMCA/IDIgOiBkYXRhIDwgNTI2ID8gMyA6IGRhdGEgPCA1MzMgPyA0IDogZGF0YSA8IDUzNCA/ICc0KycgOiBkYXRhIDwgNTM1ID8gNSA6IGRhdGEgPCA1MzcgPyA2IDogZGF0YSA8IDUzOCA/IDcgOiBkYXRhIDwgNjAxID8gOCA6IGRhdGEgPCA2MDIgPyA5IDogZGF0YSA8IDYwNCA/IDEwIDogZGF0YSA8IDYwNiA/IDExIDogZGF0YSA8IDYwOCA/IDEyIDogJzEyJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXlvdXQgJiYgKGxheW91dFsxXSA9ICdsaWtlIENocm9tZScpO1xuICAgICAgICBkYXRhID0gZGF0YVsxXSB8fCAoZGF0YSA9IGRhdGFbMF0sIGRhdGEgPCA1MzAgPyAxIDogZGF0YSA8IDUzMiA/IDIgOiBkYXRhIDwgNTMyLjA1ID8gMyA6IGRhdGEgPCA1MzMgPyA0IDogZGF0YSA8IDUzNC4wMyA/IDUgOiBkYXRhIDwgNTM0LjA3ID8gNiA6IGRhdGEgPCA1MzQuMTAgPyA3IDogZGF0YSA8IDUzNC4xMyA/IDggOiBkYXRhIDwgNTM0LjE2ID8gOSA6IGRhdGEgPCA1MzQuMjQgPyAxMCA6IGRhdGEgPCA1MzQuMzAgPyAxMSA6IGRhdGEgPCA1MzUuMDEgPyAxMiA6IGRhdGEgPCA1MzUuMDIgPyAnMTMrJyA6IGRhdGEgPCA1MzUuMDcgPyAxNSA6IGRhdGEgPCA1MzUuMTEgPyAxNiA6IGRhdGEgPCA1MzUuMTkgPyAxNyA6IGRhdGEgPCA1MzYuMDUgPyAxOCA6IGRhdGEgPCA1MzYuMTAgPyAxOSA6IGRhdGEgPCA1MzcuMDEgPyAyMCA6IGRhdGEgPCA1MzcuMTEgPyAnMjErJyA6IGRhdGEgPCA1MzcuMTMgPyAyMyA6IGRhdGEgPCA1MzcuMTggPyAyNCA6IGRhdGEgPCA1MzcuMjQgPyAyNSA6IGRhdGEgPCA1MzcuMzYgPyAyNiA6IGxheW91dCAhPSAnQmxpbmsnID8gJzI3JyA6ICcyOCcpO1xuICAgICAgfVxuICAgICAgLy8gQWRkIHRoZSBwb3N0Zml4IG9mIFwiLnhcIiBvciBcIitcIiBmb3IgYXBwcm94aW1hdGUgdmVyc2lvbnMuXG4gICAgICBsYXlvdXQgJiYgKGxheW91dFsxXSArPSAnICcgKyAoZGF0YSArPSB0eXBlb2YgZGF0YSA9PSAnbnVtYmVyJyA/ICcueCcgOiAvWy4rXS8udGVzdChkYXRhKSA/ICcnIDogJysnKSk7XG4gICAgICAvLyBPYnNjdXJlIHZlcnNpb24gZm9yIHNvbWUgU2FmYXJpIDEtMiByZWxlYXNlcy5cbiAgICAgIGlmIChuYW1lID09ICdTYWZhcmknICYmICghdmVyc2lvbiB8fCBwYXJzZUludCh2ZXJzaW9uKSA+IDQ1KSkge1xuICAgICAgICB2ZXJzaW9uID0gZGF0YTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAnQ2hyb21lJyAmJiAvXFxiSGVhZGxlc3NDaHJvbWUvaS50ZXN0KHVhKSkge1xuICAgICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KCdoZWFkbGVzcycpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEZXRlY3QgT3BlcmEgZGVza3RvcCBtb2Rlcy5cbiAgICBpZiAobmFtZSA9PSAnT3BlcmEnICYmICAoZGF0YSA9IC9cXGJ6Ym92fHp2YXYkLy5leGVjKG9zKSkpIHtcbiAgICAgIG5hbWUgKz0gJyAnO1xuICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgnZGVza3RvcCBtb2RlJyk7XG4gICAgICBpZiAoZGF0YSA9PSAnenZhdicpIHtcbiAgICAgICAgbmFtZSArPSAnTWluaSc7XG4gICAgICAgIHZlcnNpb24gPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmFtZSArPSAnTW9iaWxlJztcbiAgICAgIH1cbiAgICAgIG9zID0gb3MucmVwbGFjZShSZWdFeHAoJyAqJyArIGRhdGEgKyAnJCcpLCAnJyk7XG4gICAgfVxuICAgIC8vIERldGVjdCBDaHJvbWUgZGVza3RvcCBtb2RlLlxuICAgIGVsc2UgaWYgKG5hbWUgPT0gJ1NhZmFyaScgJiYgL1xcYkNocm9tZVxcYi8uZXhlYyhsYXlvdXQgJiYgbGF5b3V0WzFdKSkge1xuICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgnZGVza3RvcCBtb2RlJyk7XG4gICAgICBuYW1lID0gJ0Nocm9tZSBNb2JpbGUnO1xuICAgICAgdmVyc2lvbiA9IG51bGw7XG5cbiAgICAgIGlmICgvXFxiT1MgWFxcYi8udGVzdChvcykpIHtcbiAgICAgICAgbWFudWZhY3R1cmVyID0gJ0FwcGxlJztcbiAgICAgICAgb3MgPSAnaU9TIDQuMysnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3MgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBTUldhcmUgSXJvbiB1c2VzIHRoZSBDaHJvbWUgdGFnIHRvIGluZGljYXRlIGl0cyB2ZXJzaW9uIG51bWJlci5cbiAgICBlbHNlIGlmICgvXFxiU1JXYXJlIElyb25cXGIvLnRlc3QobmFtZSkgJiYgIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSBnZXRWZXJzaW9uKCdDaHJvbWUnKTtcbiAgICB9XG4gICAgLy8gU3RyaXAgaW5jb3JyZWN0IE9TIHZlcnNpb25zLlxuICAgIGlmICh2ZXJzaW9uICYmIHZlcnNpb24uaW5kZXhPZigoZGF0YSA9IC9bXFxkLl0rJC8uZXhlYyhvcykpKSA9PSAwICYmXG4gICAgICAgIHVhLmluZGV4T2YoJy8nICsgZGF0YSArICctJykgPiAtMSkge1xuICAgICAgb3MgPSB0cmltKG9zLnJlcGxhY2UoZGF0YSwgJycpKTtcbiAgICB9XG4gICAgLy8gRW5zdXJlIE9TIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJyb3dzZXIgbmFtZS5cbiAgICBpZiAob3MgJiYgb3MuaW5kZXhPZihuYW1lKSAhPSAtMSAmJiAhUmVnRXhwKG5hbWUgKyAnIE9TJykudGVzdChvcykpIHtcbiAgICAgIG9zID0gb3MucmVwbGFjZShSZWdFeHAoJyAqJyArIHF1YWxpZnkobmFtZSkgKyAnIConKSwgJycpO1xuICAgIH1cbiAgICAvLyBBZGQgbGF5b3V0IGVuZ2luZS5cbiAgICBpZiAobGF5b3V0ICYmICEvXFxiKD86QXZhbnR8Tm9vaylcXGIvLnRlc3QobmFtZSkgJiYgKFxuICAgICAgICAvQnJvd3NlcnxMdW5hc2NhcGV8TWF4dGhvbi8udGVzdChuYW1lKSB8fFxuICAgICAgICBuYW1lICE9ICdTYWZhcmknICYmIC9eaU9TLy50ZXN0KG9zKSAmJiAvXFxiU2FmYXJpXFxiLy50ZXN0KGxheW91dFsxXSkgfHxcbiAgICAgICAgL14oPzpBZG9iZXxBcm9yYXxCcmVhY2h8TWlkb3JpfE9wZXJhfFBoYW50b218UmVrb25xfFJvY2t8U2Ftc3VuZyBJbnRlcm5ldHxTbGVpcG5pcnxTUldhcmUgSXJvbnxWaXZhbGRpfFdlYikvLnRlc3QobmFtZSkgJiYgbGF5b3V0WzFdKSkge1xuICAgICAgLy8gRG9uJ3QgYWRkIGxheW91dCBkZXRhaWxzIHRvIGRlc2NyaXB0aW9uIGlmIHRoZXkgYXJlIGZhbHNleS5cbiAgICAgIChkYXRhID0gbGF5b3V0W2xheW91dC5sZW5ndGggLSAxXSkgJiYgZGVzY3JpcHRpb24ucHVzaChkYXRhKTtcbiAgICB9XG4gICAgLy8gQ29tYmluZSBjb250ZXh0dWFsIGluZm9ybWF0aW9uLlxuICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGgpIHtcbiAgICAgIGRlc2NyaXB0aW9uID0gWycoJyArIGRlc2NyaXB0aW9uLmpvaW4oJzsgJykgKyAnKSddO1xuICAgIH1cbiAgICAvLyBBcHBlbmQgbWFudWZhY3R1cmVyIHRvIGRlc2NyaXB0aW9uLlxuICAgIGlmIChtYW51ZmFjdHVyZXIgJiYgcHJvZHVjdCAmJiBwcm9kdWN0LmluZGV4T2YobWFudWZhY3R1cmVyKSA8IDApIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2goJ29uICcgKyBtYW51ZmFjdHVyZXIpO1xuICAgIH1cbiAgICAvLyBBcHBlbmQgcHJvZHVjdCB0byBkZXNjcmlwdGlvbi5cbiAgICBpZiAocHJvZHVjdCkge1xuICAgICAgZGVzY3JpcHRpb24ucHVzaCgoL15vbiAvLnRlc3QoZGVzY3JpcHRpb25bZGVzY3JpcHRpb24ubGVuZ3RoIC0gMV0pID8gJycgOiAnb24gJykgKyBwcm9kdWN0KTtcbiAgICB9XG4gICAgLy8gUGFyc2UgdGhlIE9TIGludG8gYW4gb2JqZWN0LlxuICAgIGlmIChvcykge1xuICAgICAgZGF0YSA9IC8gKFtcXGQuK10rKSQvLmV4ZWMob3MpO1xuICAgICAgaXNTcGVjaWFsQ2FzZWRPUyA9IGRhdGEgJiYgb3MuY2hhckF0KG9zLmxlbmd0aCAtIGRhdGFbMF0ubGVuZ3RoIC0gMSkgPT0gJy8nO1xuICAgICAgb3MgPSB7XG4gICAgICAgICdhcmNoaXRlY3R1cmUnOiAzMixcbiAgICAgICAgJ2ZhbWlseSc6IChkYXRhICYmICFpc1NwZWNpYWxDYXNlZE9TKSA/IG9zLnJlcGxhY2UoZGF0YVswXSwgJycpIDogb3MsXG4gICAgICAgICd2ZXJzaW9uJzogZGF0YSA/IGRhdGFbMV0gOiBudWxsLFxuICAgICAgICAndG9TdHJpbmcnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgdmVyc2lvbiA9IHRoaXMudmVyc2lvbjtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYW1pbHkgKyAoKHZlcnNpb24gJiYgIWlzU3BlY2lhbENhc2VkT1MpID8gJyAnICsgdmVyc2lvbiA6ICcnKSArICh0aGlzLmFyY2hpdGVjdHVyZSA9PSA2NCA/ICcgNjQtYml0JyA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gQWRkIGJyb3dzZXIvT1MgYXJjaGl0ZWN0dXJlLlxuICAgIGlmICgoZGF0YSA9IC9cXGIoPzpBTUR8SUF8V2lufFdPV3x4ODZffHgpNjRcXGIvaS5leGVjKGFyY2gpKSAmJiAhL1xcYmk2ODZcXGIvaS50ZXN0KGFyY2gpKSB7XG4gICAgICBpZiAob3MpIHtcbiAgICAgICAgb3MuYXJjaGl0ZWN0dXJlID0gNjQ7XG4gICAgICAgIG9zLmZhbWlseSA9IG9zLmZhbWlseS5yZXBsYWNlKFJlZ0V4cCgnIConICsgZGF0YSksICcnKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgICBuYW1lICYmICgvXFxiV09XNjRcXGIvaS50ZXN0KHVhKSB8fFxuICAgICAgICAgICh1c2VGZWF0dXJlcyAmJiAvXFx3KD86ODZ8MzIpJC8udGVzdChuYXYuY3B1Q2xhc3MgfHwgbmF2LnBsYXRmb3JtKSAmJiAhL1xcYldpbjY0OyB4NjRcXGIvaS50ZXN0KHVhKSkpXG4gICAgICApIHtcbiAgICAgICAgZGVzY3JpcHRpb24udW5zaGlmdCgnMzItYml0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENocm9tZSAzOSBhbmQgYWJvdmUgb24gT1MgWCBpcyBhbHdheXMgNjQtYml0LlxuICAgIGVsc2UgaWYgKFxuICAgICAgICBvcyAmJiAvXk9TIFgvLnRlc3Qob3MuZmFtaWx5KSAmJlxuICAgICAgICBuYW1lID09ICdDaHJvbWUnICYmIHBhcnNlRmxvYXQodmVyc2lvbikgPj0gMzlcbiAgICApIHtcbiAgICAgIG9zLmFyY2hpdGVjdHVyZSA9IDY0O1xuICAgIH1cblxuICAgIHVhIHx8ICh1YSA9IG51bGwpO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBsYXRmb3JtIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYXRmb3JtXG4gICAgICogQHR5cGUgT2JqZWN0XG4gICAgICovXG4gICAgdmFyIHBsYXRmb3JtID0ge307XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcGxhdGZvcm0gZGVzY3JpcHRpb24uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLmRlc2NyaXB0aW9uID0gdWE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJvd3NlcidzIGxheW91dCBlbmdpbmUuXG4gICAgICpcbiAgICAgKiBUaGUgbGlzdCBvZiBjb21tb24gbGF5b3V0IGVuZ2luZXMgaW5jbHVkZTpcbiAgICAgKiBcIkJsaW5rXCIsIFwiRWRnZUhUTUxcIiwgXCJHZWNrb1wiLCBcIlRyaWRlbnRcIiBhbmQgXCJXZWJLaXRcIlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHBsYXRmb3JtXG4gICAgICogQHR5cGUgc3RyaW5nfG51bGxcbiAgICAgKi9cbiAgICBwbGF0Zm9ybS5sYXlvdXQgPSBsYXlvdXQgJiYgbGF5b3V0WzBdO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QncyBtYW51ZmFjdHVyZXIuXG4gICAgICpcbiAgICAgKiBUaGUgbGlzdCBvZiBtYW51ZmFjdHVyZXJzIGluY2x1ZGU6XG4gICAgICogXCJBcHBsZVwiLCBcIkFyY2hvc1wiLCBcIkFtYXpvblwiLCBcIkFzdXNcIiwgXCJCYXJuZXMgJiBOb2JsZVwiLCBcIkJsYWNrQmVycnlcIixcbiAgICAgKiBcIkdvb2dsZVwiLCBcIkhQXCIsIFwiSFRDXCIsIFwiTEdcIiwgXCJNaWNyb3NvZnRcIiwgXCJNb3Rvcm9sYVwiLCBcIk5pbnRlbmRvXCIsXG4gICAgICogXCJOb2tpYVwiLCBcIlNhbXN1bmdcIiBhbmQgXCJTb255XCJcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybVxuICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICovXG4gICAgcGxhdGZvcm0ubWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXIvZW52aXJvbm1lbnQuXG4gICAgICpcbiAgICAgKiBUaGUgbGlzdCBvZiBjb21tb24gYnJvd3NlciBuYW1lcyBpbmNsdWRlOlxuICAgICAqIFwiQ2hyb21lXCIsIFwiRWxlY3Ryb25cIiwgXCJGaXJlZm94XCIsIFwiRmlyZWZveCBmb3IgaU9TXCIsIFwiSUVcIixcbiAgICAgKiBcIk1pY3Jvc29mdCBFZGdlXCIsIFwiUGhhbnRvbUpTXCIsIFwiU2FmYXJpXCIsIFwiU2VhTW9ua2V5XCIsIFwiU2lsa1wiLFxuICAgICAqIFwiT3BlcmEgTWluaVwiIGFuZCBcIk9wZXJhXCJcbiAgICAgKlxuICAgICAqIE1vYmlsZSB2ZXJzaW9ucyBvZiBzb21lIGJyb3dzZXJzIGhhdmUgXCJNb2JpbGVcIiBhcHBlbmRlZCB0byB0aGVpciBuYW1lOlxuICAgICAqIGVnLiBcIkNocm9tZSBNb2JpbGVcIiwgXCJGaXJlZm94IE1vYmlsZVwiLCBcIklFIE1vYmlsZVwiIGFuZCBcIk9wZXJhIE1vYmlsZVwiXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLm5hbWUgPSBuYW1lO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGFscGhhL2JldGEgcmVsZWFzZSBpbmRpY2F0b3IuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb2R1Y3QgaG9zdGluZyB0aGUgYnJvd3Nlci5cbiAgICAgKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW1vbiBwcm9kdWN0cyBpbmNsdWRlOlxuICAgICAqXG4gICAgICogXCJCbGFja0JlcnJ5XCIsIFwiR2FsYXh5IFM0XCIsIFwiTHVtaWFcIiwgXCJpUGFkXCIsIFwiaVBvZFwiLCBcImlQaG9uZVwiLCBcIktpbmRsZVwiLFxuICAgICAqIFwiS2luZGxlIEZpcmVcIiwgXCJOZXh1c1wiLCBcIk5vb2tcIiwgXCJQbGF5Qm9va1wiLCBcIlRvdWNoUGFkXCIgYW5kIFwiVHJhbnNmb3JtZXJcIlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHBsYXRmb3JtXG4gICAgICogQHR5cGUgc3RyaW5nfG51bGxcbiAgICAgKi9cbiAgICBwbGF0Zm9ybS5wcm9kdWN0ID0gcHJvZHVjdDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBicm93c2VyJ3MgdXNlciBhZ2VudCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBzdHJpbmd8bnVsbFxuICAgICAqL1xuICAgIHBsYXRmb3JtLnVhID0gdWE7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYnJvd3Nlci9lbnZpcm9ubWVudCB2ZXJzaW9uLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHBsYXRmb3JtXG4gICAgICogQHR5cGUgc3RyaW5nfG51bGxcbiAgICAgKi9cbiAgICBwbGF0Zm9ybS52ZXJzaW9uID0gbmFtZSAmJiB2ZXJzaW9uO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm1cbiAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgKi9cbiAgICBwbGF0Zm9ybS5vcyA9IG9zIHx8IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgQ1BVIGFyY2hpdGVjdHVyZSB0aGUgT1MgaXMgYnVpbHQgZm9yLlxuICAgICAgICpcbiAgICAgICAqIEBtZW1iZXJPZiBwbGF0Zm9ybS5vc1xuICAgICAgICogQHR5cGUgbnVtYmVyfG51bGxcbiAgICAgICAqL1xuICAgICAgJ2FyY2hpdGVjdHVyZSc6IG51bGwsXG5cbiAgICAgIC8qKlxuICAgICAgICogVGhlIGZhbWlseSBvZiB0aGUgT1MuXG4gICAgICAgKlxuICAgICAgICogQ29tbW9uIHZhbHVlcyBpbmNsdWRlOlxuICAgICAgICogXCJXaW5kb3dzXCIsIFwiV2luZG93cyBTZXJ2ZXIgMjAwOCBSMiAvIDdcIiwgXCJXaW5kb3dzIFNlcnZlciAyMDA4IC8gVmlzdGFcIixcbiAgICAgICAqIFwiV2luZG93cyBYUFwiLCBcIk9TIFhcIiwgXCJMaW51eFwiLCBcIlVidW50dVwiLCBcIkRlYmlhblwiLCBcIkZlZG9yYVwiLCBcIlJlZCBIYXRcIixcbiAgICAgICAqIFwiU3VTRVwiLCBcIkFuZHJvaWRcIiwgXCJpT1NcIiBhbmQgXCJXaW5kb3dzIFBob25lXCJcbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm0ub3NcbiAgICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICAgKi9cbiAgICAgICdmYW1pbHknOiBudWxsLFxuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBPUy5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgcGxhdGZvcm0ub3NcbiAgICAgICAqIEB0eXBlIHN0cmluZ3xudWxsXG4gICAgICAgKi9cbiAgICAgICd2ZXJzaW9uJzogbnVsbCxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZXR1cm5zIHRoZSBPUyBzdHJpbmcuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIHBsYXRmb3JtLm9zXG4gICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgT1Mgc3RyaW5nLlxuICAgICAgICovXG4gICAgICAndG9TdHJpbmcnOiBmdW5jdGlvbigpIHsgcmV0dXJuICdudWxsJzsgfVxuICAgIH07XG5cbiAgICBwbGF0Zm9ybS5wYXJzZSA9IHBhcnNlO1xuICAgIHBsYXRmb3JtLnRvU3RyaW5nID0gdG9TdHJpbmdQbGF0Zm9ybTtcblxuICAgIGlmIChwbGF0Zm9ybS52ZXJzaW9uKSB7XG4gICAgICBkZXNjcmlwdGlvbi51bnNoaWZ0KHZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAocGxhdGZvcm0ubmFtZSkge1xuICAgICAgZGVzY3JpcHRpb24udW5zaGlmdChuYW1lKTtcbiAgICB9XG4gICAgaWYgKG9zICYmIG5hbWUgJiYgIShvcyA9PSBTdHJpbmcob3MpLnNwbGl0KCcgJylbMF0gJiYgKG9zID09IG5hbWUuc3BsaXQoJyAnKVswXSB8fCBwcm9kdWN0KSkpIHtcbiAgICAgIGRlc2NyaXB0aW9uLnB1c2gocHJvZHVjdCA/ICcoJyArIG9zICsgJyknIDogJ29uICcgKyBvcyk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGgpIHtcbiAgICAgIHBsYXRmb3JtLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24uam9pbignICcpO1xuICAgIH1cbiAgICByZXR1cm4gcGxhdGZvcm07XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvLyBFeHBvcnQgcGxhdGZvcm0uXG4gIHZhciBwbGF0Zm9ybSA9IHBhcnNlKCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2UgdGhlIGZvbGxvd2luZzpcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgLy8gRXhwb3NlIHBsYXRmb3JtIG9uIHRoZSBnbG9iYWwgb2JqZWN0IHRvIHByZXZlbnQgZXJyb3JzIHdoZW4gcGxhdGZvcm0gaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgcm9vdC5wbGF0Zm9ybSA9IHBsYXRmb3JtO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28gcGxhdGZvcm0gY2FuIGJlIGFsaWFzZWQgdGhyb3VnaCBwYXRoIG1hcHBpbmcuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHBsYXRmb3JtO1xuICAgIH0pO1xuICB9XG4gIC8vIENoZWNrIGZvciBgZXhwb3J0c2AgYWZ0ZXIgYGRlZmluZWAgaW4gY2FzZSBhIGJ1aWxkIG9wdGltaXplciBhZGRzIGFuIGBleHBvcnRzYCBvYmplY3QuXG4gIGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIENvbW1vbkpTIHN1cHBvcnQuXG4gICAgZm9yT3duKHBsYXRmb3JtLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICBmcmVlRXhwb3J0c1trZXldID0gdmFsdWU7XG4gICAgfSk7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gRXhwb3J0IHRvIHRoZSBnbG9iYWwgb2JqZWN0LlxuICAgIHJvb3QucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnc2NoZWR1bGVyJyk7XG52YXIgdHJhY2luZyA9IHJlcXVpcmUoJ3NjaGVkdWxlci90cmFjaW5nJyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH1cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuaWYgKCFSZWFjdCkge1xuICB7XG4gICAgdGhyb3cgRXJyb3IoIFwiUmVhY3RET00gd2FzIGxvYWRlZCBiZWZvcmUgUmVhY3QuIE1ha2Ugc3VyZSB5b3UgbG9hZCB0aGUgUmVhY3QgcGFja2FnZSBiZWZvcmUgbG9hZGluZyBSZWFjdERPTS5cIiApO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBGdW5kYW1lbnRhbENvbXBvbmVudCA9IDIwO1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgQmxvY2sgPSAyMjtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMztcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyNDtcblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlRnVuZGFtZW50YWxBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIFNjb3BlIHN1cHBvcnQuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIHdoaWxlIHVubW91bnRpbmcgKG9yIGFmdGVyIGluIHRoZSBjYXNlIG9mIHBhc3NpdmUgZWZmZWN0cylcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gZmFsc2U7XG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFJPT1RfQVRUUklCVVRFX05BTUUgPSAnZGF0YS1yZWFjdHJvb3QnO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWZcbiAgICAgICAgLy8gdGhlIGh5ZHJhdGlvbiBpcyBzdWNjZXNzZnVsIG9mIGEgamF2YXNjcmlwdDogVVJMLCB3ZVxuICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHdhcm4gb24gdGhlIGNsaWVudC5cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCkge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIG9wYXF1ZSByZWZlcmVuY2UgSUQsIGl0J3MgZXhwZWN0ZWQgdGhhdFxuICAgIC8vIHRoZSBuZXh0IHByb3AgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHNlcnZlciB2YWx1ZSwgc28ganVzdCByZXR1cm5cbiAgICAvLyBleHBlY3RlZFxuXG5cbiAgICBpZiAoaXNPcGFxdWVIeWRyYXRpbmdPYmplY3QoZXhwZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH0gLy8gSWYgdGhlIHByb3AgaXNuJ3QgaW4gdGhlIHNwZWNpYWwgbGlzdCwgdHJlYXQgaXQgYXMgYSBzaW1wbGUgYXR0cmlidXRlLlxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQmxvY2s6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUuX3JlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SXNSZW5kZXJpbmcoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNSZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC5cIiApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJzsgLy8gRmxhdHRlbiBjaGlsZHJlbi4gV2UnbGwgd2FybiBpZiB0aGV5IGFyZSBpbnZhbGlkXG4gIC8vIGR1cmluZyB2YWxpZGF0ZVByb3BzKCkgd2hpY2ggcnVucyBmb3IgaHlkcmF0aW9uIHRvby5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgdGhyb3cgb24gbm9uLWVsZW1lbnQgb2JqZWN0cy5cbiAgLy8gRWxlbWVudHMgYXJlIHN0cmluZ2lmaWVkICh3aGljaCBpcyBub3JtYWxseSBpcnJlbGV2YW50XG4gIC8vIGJ1dCBtYXR0ZXJzIGZvciA8ZmJ0PikuXG5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZW50ICs9IGNoaWxkOyAvLyBOb3RlOiB3ZSBkb24ndCB3YXJuIGFib3V0IGludmFsaWQgY2hpbGRyZW4gaGVyZS5cbiAgICAvLyBJbnN0ZWFkLCB0aGlzIGlzIGRvbmUgc2VwYXJhdGVseSBiZWxvdyBzbyB0aGF0XG4gICAgLy8gaXQgaGFwcGVucyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBjb2RlIHBhdGggdG9vLlxuICB9KTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gVGhpcyBtaXJyb3JzIHRoZSBjb2RlIHBhdGggYWJvdmUsIGJ1dCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAgIC8vIFdhcm4gYWJvdXQgaW52YWxpZCBjaGlsZHJlbiBoZXJlIHNvIHRoYXQgY2xpZW50IGFuZCBoeWRyYXRpb24gYXJlIGNvbnNpc3RlbnQuXG4gICAgLy8gVE9ETzogdGhpcyBzZWVtcyBsaWtlIGl0IGNvdWxkIGNhdXNlIGEgREVWLW9ubHkgdGhyb3cgZm9yIGh5ZHJhdGlvblxuICAgIC8vIGlmIGNoaWxkcmVuIGNvbnRhaW5zIGEgbm9uLWVsZW1lbnQgb2JqZWN0LiBXZSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe1xuICAgIGNoaWxkcmVuOiB1bmRlZmluZWRcbiAgfSwgcHJvcHMpO1xuXG4gIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICBpZiAoY29udGVudCkge1xuICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgaXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAoIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImBkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LlwiICk7XG4gICAgfVxuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZGVmYXVsdFZhbHVlID09IG51bGwpKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKCEoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCBcIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC5cIiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xudmFyIE5hbWVzcGFjZXMgPSB7XG4gIGh0bWw6IEhUTUxfTkFNRVNQQUNFLFxuICBtYXRobWw6IE1BVEhfTkFNRVNQQUNFLFxuICBzdmc6IFNWR19OQU1FU1BBQ0Vcbn07IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2VzLnN2Zykge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBfYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggdGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocHJvcHMuc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2YgcHJvcHMuc3R5bGUgPT09ICdvYmplY3QnKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIHVzaW5nIEpTWC5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaGFzT3duUHJvcGVydHkkMSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5JDEuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xudmFyIElTX1JFUExBWUVEID0gMSA8PCA0O1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0eXBlb2YgcmVzdG9yZUltcGwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCBldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZGlzY3JldGVVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYSwgYiwgYywgZCkge1xuICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG59O1xuXG52YXIgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCA9IGJhdGNoZWRVcGRhdGVzSW1wbDtcbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xudmFyIGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBib29ra2VlcGluZykge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYm9va2tlZXBpbmcpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRFdmVudFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0JhdGNoaW5nRXZlbnRVcGRhdGVzID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNCYXRjaGluZ0V2ZW50VXBkYXRlcyA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZJc0luc2lkZUV2ZW50SGFuZGxlciA9IGlzSW5zaWRlRXZlbnRIYW5kbGVyO1xuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGlzY3JldGVVcGRhdGVzSW1wbChmbiwgYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBwcmV2SXNJbnNpZGVFdmVudEhhbmRsZXI7XG5cbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoRGlzY3JldGVVcGRhdGVzSWZOZWVkZWQodGltZVN0YW1wKSB7XG4gIHtcbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwsIF9iYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBkaXNjcmV0ZVVwZGF0ZXNJbXBsID0gX2Rpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGZsdXNoRGlzY3JldGVVcGRhdGVzSW1wbCA9IF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGJhdGNoZWRFdmVudFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRFdmVudFVwZGF0ZXNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghKCFsaXN0ZW5lciB8fCB0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29raW5jdWJhdG9yL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICghKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50IHNjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSBmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0IGNhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgdG8gYmUgYXN5bmNocm9ub3VzLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImNsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBQbGFjZW1lbnRBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG42O1xudmFyIERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7IC8vIFRPRE8gKGVmZmVjdHMpIFJlbW92ZSB0aGlzIGJpdCBvbmNlIHRoZSBuZXcgcmVjb25jaWxlciBpcyBzeW5jZWQgdG8gdGhlIG9sZC5cblxudmFyIFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldiA9XG4vKiAgICAgKi9cbjgxOTI7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBIeWRyYXRpbmdBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG4xMDI4OyAvLyBQYXNzaXZlICYgVXBkYXRlICYgQ2FsbGJhY2sgJiBSZWYgJiBTbmFwc2hvdFxuXG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAqL1xuOTMyOyAvLyBVbmlvbiBvZiBhbGwgaG9zdCBlZmZlY3RzXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4yMDQ3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjE2Mzg0OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXJGaWJlci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmICghKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmICghKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShhLmFsdGVybmF0ZSA9PT0gYikpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmICghKGEudGFnID09PSBIb3N0Um9vdCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG5cbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cblxuXG4gIHZhciBub2RlID0gY3VycmVudFBhcmVudDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKCFub2RlLnNpYmxpbmcpIHtcbiAgICAgIGlmICghbm9kZS5yZXR1cm4gfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuXG4gIGlmICghY3VycmVudFBhcmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG5cblxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0IHx8IGVuYWJsZUZ1bmRhbWVudGFsQVBJICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICYmIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAoIW5vZGUuc2libGluZykge1xuICAgICAgaWYgKCFub2RlLnJldHVybiB8fCBub2RlLnJldHVybiA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgbmVlZHMgdGhlIHJldHVybiBudWxsIGhlcmUsIGJ1dCBFU0xpbnQgY29tcGxhaW5zIGFib3V0IGl0LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZG9lc0ZpYmVyQ29udGFpbihwYXJlbnRGaWJlciwgY2hpbGRGaWJlcikge1xuICB2YXIgbm9kZSA9IGNoaWxkRmliZXI7XG4gIHZhciBwYXJlbnRGaWJlckFsdGVybmF0ZSA9IHBhcmVudEZpYmVyLmFsdGVybmF0ZTtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlID09PSBwYXJlbnRGaWJlciB8fCBub2RlID09PSBwYXJlbnRGaWJlckFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbmZ1bmN0aW9uIGhhc1F1ZXVlZERpc2NyZXRlRXZlbnRzKCkge1xuICByZXR1cm4gcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMDtcbn1cbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzIHwgSVNfUkVQTEFZRUQsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRGlzY3JldGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5wdXNoKHF1ZXVlZEV2ZW50KTtcbn0gLy8gUmVzZXRzIHRoZSByZXBsYXlpbmcgZm9yIHRoaXMgdHlwZSBvZiBjb250aW51b3VzIGV2ZW50IHRvIG5vIGV2ZW50LlxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LmxhbmVQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gRmlyc3QgcmVwbGF5IGRpc2NyZXRlIGV2ZW50cy5cblxuICB3aGlsZSAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RGlzY3JldGVFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdO1xuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIC8vIEluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIGJvdW5kYXJ5IHRvIHVuYmxvY2tcbiAgICAgIC8vIHRoZSBuZXh0IGRpc2NyZXRlIGV2ZW50LlxuICAgICAgdmFyIF9maWJlcjQgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oX2ZpYmVyNCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRDb250YWluZXJzID0gbmV4dERpc2NyZXRlRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICAgIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBhdHRlbXB0VG9EaXNwYXRjaEV2ZW50KG5leHREaXNjcmV0ZUV2ZW50LmRvbUV2ZW50TmFtZSwgbmV4dERpc2NyZXRlRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuZXh0RGlzY3JldGVFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgICAgbmV4dERpc2NyZXRlRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UndmUgc3VjY2Vzc2Z1bGx5IHJlcGxheWVkIHRoZSBmaXJzdCBldmVudC4gTGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAgIHF1ZXVlZERpc2NyZXRlRXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuICB9IC8vIE5leHQgcmVwbGF5IGFueSBjb250aW51b3VzIGV2ZW50cy5cblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnQgPSAwO1xudmFyIFVzZXJCbG9ja2luZ0V2ZW50ID0gMTtcbnZhciBDb250aW51b3VzRXZlbnQgPSAyO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTtcbnZhciBldmVudFByaW9yaXRpZXMgPSBuZXcgTWFwKCk7IC8vIFdlIHN0b3JlIG1vc3Qgb2YgdGhlIGV2ZW50cyBpbiB0aGlzIG1vZHVsZSBpbiBwYWlycyBvZiB0d28gc3RyaW5ncyBzbyB3ZSBjYW4gcmUtdXNlXG4vLyB0aGUgY29kZSByZXF1aXJlZCB0byBhcHBseSB0aGUgc2FtZSBsb2dpYyBmb3IgZXZlbnQgcHJpb3JpdGl6YXRpb24gYW5kIHRoYXQgb2YgdGhlXG4vLyBTaW1wbGVFdmVudFBsdWdpbi4gVGhpcyBjb21wbGljYXRlcyB0aGluZ3Mgc2xpZ2h0bHksIGJ1dCB0aGUgYWltIGlzIHRvIHJlZHVjZSBjb2RlXG4vLyBkdXBsaWNhdGlvbiAoZm9yIHdoaWNoIHRoZXJlIHdvdWxkIGJlIHF1aXRlIGEgYml0KS4gRm9yIHRoZSBldmVudHMgdGhhdCBhcmUgbm90IG5lZWRlZFxuLy8gZm9yIHRoZSBTaW1wbGVFdmVudFBsdWdpbiAob3RoZXJEaXNjcmV0ZUV2ZW50cykgd2UgcHJvY2VzcyB0aGVtIHNlcGFyYXRlbHkgYXMgYW5cbi8vIGFycmF5IG9mIHRvcCBsZXZlbCBldmVudHMuXG4vLyBMYXN0bHksIHdlIGlnbm9yZSBwcmV0dGllciBzbyB3ZSBjYW4ga2VlcCB0aGUgZm9ybWF0dGluZyBzYW5lLlxuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBkaXNjcmV0ZUV2ZW50UGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiA9IFsnY2FuY2VsJywgJ2NhbmNlbCcsICdjbGljaycsICdjbGljaycsICdjbG9zZScsICdjbG9zZScsICdjb250ZXh0bWVudScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2NvcHknLCAnY3V0JywgJ2N1dCcsICdhdXhjbGljaycsICdhdXhDbGljaycsICdkYmxjbGljaycsICdkb3VibGVDbGljaycsIC8vIENhcmVmdWwhXG4nZHJhZ2VuZCcsICdkcmFnRW5kJywgJ2RyYWdzdGFydCcsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkcm9wJywgJ2ZvY3VzaW4nLCAnZm9jdXMnLCAvLyBDYXJlZnVsIVxuJ2ZvY3Vzb3V0JywgJ2JsdXInLCAvLyBDYXJlZnVsIVxuJ2lucHV0JywgJ2lucHV0JywgJ2ludmFsaWQnLCAnaW52YWxpZCcsICdrZXlkb3duJywgJ2tleURvd24nLCAna2V5cHJlc3MnLCAna2V5UHJlc3MnLCAna2V5dXAnLCAna2V5VXAnLCAnbW91c2Vkb3duJywgJ21vdXNlRG93bicsICdtb3VzZXVwJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGFzdGUnLCAncGF1c2UnLCAncGF1c2UnLCAncGxheScsICdwbGF5JywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVyRG93bicsICdwb2ludGVydXAnLCAncG9pbnRlclVwJywgJ3JhdGVjaGFuZ2UnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNldCcsICdzZWVrZWQnLCAnc2Vla2VkJywgJ3N1Ym1pdCcsICdzdWJtaXQnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hFbmQnLCAndG91Y2hzdGFydCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZWNoYW5nZScsICd2b2x1bWVDaGFuZ2UnXTtcbnZhciBvdGhlckRpc2NyZXRlRXZlbnRzID0gWydjaGFuZ2UnLCAnc2VsZWN0aW9uY2hhbmdlJywgJ3RleHRJbnB1dCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9udXBkYXRlJ107XG5cblxudmFyIHVzZXJCbG9ja2luZ1BhaXJzRm9yU2ltcGxlRXZlbnRQbHVnaW4gPSBbJ2RyYWcnLCAnZHJhZycsICdkcmFnZW50ZXInLCAnZHJhZ0VudGVyJywgJ2RyYWdleGl0JywgJ2RyYWdFeGl0JywgJ2RyYWdsZWF2ZScsICdkcmFnTGVhdmUnLCAnZHJhZ292ZXInLCAnZHJhZ092ZXInLCAnbW91c2Vtb3ZlJywgJ21vdXNlTW92ZScsICdtb3VzZW91dCcsICdtb3VzZU91dCcsICdtb3VzZW92ZXInLCAnbW91c2VPdmVyJywgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJvdXQnLCAncG9pbnRlck91dCcsICdwb2ludGVyb3ZlcicsICdwb2ludGVyT3ZlcicsICdzY3JvbGwnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b2dnbGUnLCAndG91Y2htb3ZlJywgJ3RvdWNoTW92ZScsICd3aGVlbCcsICd3aGVlbCddOyAvLyBwcmV0dGllci1pZ25vcmVcblxudmFyIGNvbnRpbnVvdXNQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luID0gWydhYm9ydCcsICdhYm9ydCcsIEFOSU1BVElPTl9FTkQsICdhbmltYXRpb25FbmQnLCBBTklNQVRJT05fSVRFUkFUSU9OLCAnYW5pbWF0aW9uSXRlcmF0aW9uJywgQU5JTUFUSU9OX1NUQVJULCAnYW5pbWF0aW9uU3RhcnQnLCAnY2FucGxheScsICdjYW5QbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2NhblBsYXlUaHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2Vycm9yJywgJ2dvdHBvaW50ZXJjYXB0dXJlJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2xvYWQnLCAnbG9hZCcsICdsb2FkZWRkYXRhJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ2xvYWRTdGFydCcsICdsb3N0cG9pbnRlcmNhcHR1cmUnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ3BsYXlpbmcnLCAncGxheWluZycsICdwcm9ncmVzcycsICdwcm9ncmVzcycsICdzZWVraW5nJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3RpbWVVcGRhdGUnLCBUUkFOU0lUSU9OX0VORCwgJ3RyYW5zaXRpb25FbmQnLCAnd2FpdGluZycsICd3YWl0aW5nJ107XG4vKipcbiAqIFR1cm5zXG4gKiBbJ2Fib3J0JywgLi4uXVxuICpcbiAqIGludG9cbiAqXG4gKiB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoW1xuICogICBbJ2Fib3J0JywgJ29uQWJvcnQnXSxcbiAqIF0pO1xuICpcbiAqIGFuZCByZWdpc3RlcnMgdGhlbS5cbiAqL1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhldmVudFR5cGVzLCBwcmlvcml0eSkge1xuICAvLyBBcyB0aGUgZXZlbnQgdHlwZXMgYXJlIGluIHBhaXJzIG9mIHR3bywgd2UgbmVlZCB0byBpdGVyYXRlXG4gIC8vIHRocm91Z2ggaW4gdHdvcy4gVGhlIGV2ZW50cyBhcmUgaW4gcGFpcnMgb2YgdHdvIHRvIHNhdmUgY29kZVxuICAvLyBhbmQgaW1wcm92ZSBpbml0IHBlcmYgb2YgcHJvY2Vzc2luZyB0aGlzIGFycmF5LCBhcyBpdCB3aWxsXG4gIC8vIHJlc3VsdCBpbiBmYXIgZmV3ZXIgb2JqZWN0IGFsbG9jYXRpb25zIGFuZCBwcm9wZXJ0eSBhY2Nlc3Nlc1xuICAvLyBpZiB3ZSBvbmx5IHVzZSB0aHJlZSBhcnJheXMgdG8gcHJvY2VzcyBhbGwgdGhlIGNhdGVnb3JpZXMgb2ZcbiAgLy8gaW5zdGVhZCBvZiB0dXBsZXMuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB0b3BFdmVudCA9IGV2ZW50VHlwZXNbaV07XG4gICAgdmFyIGV2ZW50ID0gZXZlbnRUeXBlc1tpICsgMV07XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gICAgdmFyIHJlYWN0TmFtZSA9ICdvbicgKyBjYXBpdGFsaXplZEV2ZW50O1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQodG9wRXZlbnQsIHByaW9yaXR5KTtcbiAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQodG9wRXZlbnQsIHJlYWN0TmFtZSk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW3RvcEV2ZW50XSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnRQcmlvcml0aWVzKGV2ZW50VHlwZXMsIHByaW9yaXR5KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQoZXZlbnRUeXBlc1tpXSwgcHJpb3JpdHkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHlGb3JQbHVnaW5TeXN0ZW0oZG9tRXZlbnROYW1lKSB7XG4gIHZhciBwcmlvcml0eSA9IGV2ZW50UHJpb3JpdGllcy5nZXQoZG9tRXZlbnROYW1lKTsgLy8gRGVmYXVsdCB0byBhIENvbnRpbnVvdXNFdmVudC4gTm90ZTogd2UgbWlnaHRcbiAgLy8gd2FudCB0byB3YXJuIGlmIHdlIGNhbid0IGRldGVjdCB0aGUgcHJpb3JpdHlcbiAgLy8gZm9yIHRoZSBldmVudC5cblxuICByZXR1cm4gcHJpb3JpdHkgPT09IHVuZGVmaW5lZCA/IENvbnRpbnVvdXNFdmVudCA6IHByaW9yaXR5O1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIHJlZ2lzdGVyU2ltcGxlUGx1Z2luRXZlbnRzQW5kU2V0VGhlaXJQcmlvcml0aWVzKGRpc2NyZXRlRXZlbnRQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luLCBEaXNjcmV0ZUV2ZW50KTtcbiAgcmVnaXN0ZXJTaW1wbGVQbHVnaW5FdmVudHNBbmRTZXRUaGVpclByaW9yaXRpZXModXNlckJsb2NraW5nUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgVXNlckJsb2NraW5nRXZlbnQpO1xuICByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhjb250aW51b3VzUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgQ29udGludW91c0V2ZW50KTtcbiAgc2V0RXZlbnRQcmlvcml0aWVzKG90aGVyRGlzY3JldGVFdmVudHMsIERpc2NyZXRlRXZlbnQpO1xufVxuXG52YXIgU2NoZWR1bGVyX25vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG5cbntcbiAgLy8gUHJvdmlkZSBleHBsaWNpdCBlcnJvciBtZXNzYWdlIHdoZW4gcHJvZHVjdGlvbitwcm9maWxpbmcgYnVuZGxlIG9mIGUuZy5cbiAgLy8gcmVhY3QtZG9tIGlzIHVzZWQgd2l0aCBwcm9kdWN0aW9uIChub24tcHJvZmlsaW5nKSBidW5kbGUgb2ZcbiAgLy8gc2NoZWR1bGVyL3RyYWNpbmdcbiAgaWYgKCEodHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZiAhPSBudWxsICYmIHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCAhPSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gcnVuIHRoZSBwcm9maWxpbmcgdmVyc2lvbiBvZiBhIHJlbmRlcmVyIChmb3IgZXhhbXBsZSwgYHJlYWN0LWRvbS9wcm9maWxpbmdgKSB3aXRob3V0IGFsc28gcmVwbGFjaW5nIHRoZSBgc2NoZWR1bGVyL3RyYWNpbmdgIG1vZHVsZSB3aXRoIGBzY2hlZHVsZXIvdHJhY2luZy1wcm9maWxpbmdgLiBZb3VyIGJ1bmRsZXIgbWlnaHQgaGF2ZSBhIHNldHRpbmcgZm9yIGFsaWFzaW5nIGJvdGggbW9kdWxlcy4gTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcHJvZmlsaW5nXCIgKTtcbiAgICB9XG4gIH1cbn1cbi8vIGFzY2VuZGluZyBudW1iZXJzIHNvIHdlIGNhbiBjb21wYXJlIHRoZW0gbGlrZSBudW1iZXJzLiBUaGV5IHN0YXJ0IGF0IDkwIHRvXG4vLyBhdm9pZCBjbGFzaGluZyB3aXRoIFNjaGVkdWxlcidzIHByaW9yaXRpZXMuXG5cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gOTg7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSA5NztcbnZhciBMb3dQcmlvcml0eSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSA9IDk1OyAvLyBOb1ByaW9yaXR5IGlzIHRoZSBhYnNlbmNlIG9mIHByaW9yaXR5LiBBbHNvIFJlYWN0LW9ubHkuXG5cbnZhciBOb1ByaW9yaXR5ID0gOTA7XG52YXIgaW5pdGlhbFRpbWVNcyA9IFNjaGVkdWxlcl9ub3coKTsgLy8gSWYgdGhlIGluaXRpYWwgdGltZXN0YW1wIGlzIHJlYXNvbmFibHkgc21hbGwsIHVzZSBTY2hlZHVsZXIncyBgbm93YCBkaXJlY3RseS5cblxudmFyIFN5bmNMYW5lUHJpb3JpdHkgPSAxNTtcbnZhciBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSA9IDE0O1xudmFyIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAxMztcbnZhciBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5ID0gMTI7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5ID0gMTE7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5ID0gMTA7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmVQcmlvcml0eSA9IDk7XG52YXIgRGVmYXVsdExhbmVQcmlvcml0eSA9IDg7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvblByaW9yaXR5ID0gNztcbnZhciBUcmFuc2l0aW9uUHJpb3JpdHkgPSA2O1xudmFyIFJldHJ5TGFuZVByaW9yaXR5ID0gNTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSA0O1xudmFyIElkbGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAzO1xudmFyIElkbGVMYW5lUHJpb3JpdHkgPSAyO1xudmFyIE9mZnNjcmVlbkxhbmVQcmlvcml0eSA9IDE7XG52YXIgTm9MYW5lUHJpb3JpdHkgPSAwO1xudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFN5bmNCYXRjaGVkTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAqL1xuNDtcbnZhciBJbnB1dERpc2NyZXRlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yNDtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAqL1xuMzI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAqL1xuMTkyO1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBEZWZhdWx0TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjM1ODQ7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE4NjExMjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42MjkxNDU2MDtcbnZhciBTb21lUmV0cnlMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzQyMTc3Mjc7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIElkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgwNTMwNjM2ODtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0O1xudmFyIE5vVGltZXN0YW1wID0gLTE7XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlTGFuZVByaW9yaXR5KG5ld0xhbmVQcmlvcml0eSkge1xufSAvLyBcIlJlZ2lzdGVyc1wiIHVzZWQgdG8gXCJyZXR1cm5cIiBtdWx0aXBsZSB2YWx1ZXNcbi8vIFVzZWQgYnkgZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMgYW5kIGdldE5leHRMYW5lczpcblxudmFyIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gRGVmYXVsdExhbmVQcmlvcml0eTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgaWYgKChTeW5jTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICBpZiAoKFN5bmNCYXRjaGVkTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIFN5bmNCYXRjaGVkTGFuZTtcbiAgfVxuXG4gIGlmICgoSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgJiBsYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0RGlzY3JldGVMYW5lcyA9IElucHV0RGlzY3JldGVMYW5lcyAmIGxhbmVzO1xuXG4gIGlmIChpbnB1dERpc2NyZXRlTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIGlucHV0RGlzY3JldGVMYW5lcztcbiAgfVxuXG4gIGlmICgobGFuZXMgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0Q29udGludW91c0xhbmVzID0gSW5wdXRDb250aW51b3VzTGFuZXMgJiBsYW5lcztcblxuICBpZiAoaW5wdXRDb250aW51b3VzTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaW5wdXRDb250aW51b3VzTGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0TGFuZXMgPSBEZWZhdWx0TGFuZXMgJiBsYW5lcztcblxuICBpZiAoZGVmYXVsdExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBkZWZhdWx0TGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBUcmFuc2l0aW9uSHlkcmF0aW9uUHJpb3JpdHk7XG4gICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIHRyYW5zaXRpb25MYW5lcyA9IFRyYW5zaXRpb25MYW5lcyAmIGxhbmVzO1xuXG4gIGlmICh0cmFuc2l0aW9uTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFRyYW5zaXRpb25Qcmlvcml0eTtcbiAgICByZXR1cm4gdHJhbnNpdGlvbkxhbmVzO1xuICB9XG5cbiAgdmFyIHJldHJ5TGFuZXMgPSBSZXRyeUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKHJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFJldHJ5TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiByZXRyeUxhbmVzO1xuICB9XG5cbiAgaWYgKGxhbmVzICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgaWYgKChsYW5lcyAmIElkbGVIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gIH1cblxuICB2YXIgaWRsZUxhbmVzID0gSWRsZUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKGlkbGVMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaWRsZUxhbmVzO1xuICB9XG5cbiAgaWYgKChPZmZzY3JlZW5MYW5lICYgbGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBPZmZzY3JlZW5MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICB7XG4gICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IERlZmF1bHRMYW5lUHJpb3JpdHk7XG4gIHJldHVybiBsYW5lcztcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0xhbmVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSWRsZUxhbmVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gTm9MYW5lUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxhbmVQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkobGFuZVByaW9yaXR5KSB7XG4gIHN3aXRjaCAobGFuZVByaW9yaXR5KSB7XG4gICAgY2FzZSBTeW5jTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW1tZWRpYXRlUHJpb3JpdHk7XG5cbiAgICBjYXNlIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk6XG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgRGVmYXVsdExhbmVQcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTpcbiAgICBjYXNlIFJldHJ5TGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSWRsZUxhbmVQcmlvcml0eTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJZGxlUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vUHJpb3JpdHk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSW52YWxpZCB1cGRhdGUgcHJpb3JpdHk6IFwiICsgbGFuZVByaW9yaXR5ICsgXCIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgbmV4dExhbmVQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB2YXIgZXhwaXJlZExhbmVzID0gcm9vdC5leHBpcmVkTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIENoZWNrIGlmIGFueSB3b3JrIGhhcyBleHBpcmVkLlxuXG4gIGlmIChleHBpcmVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBuZXh0TGFuZXMgPSBleHBpcmVkTGFuZXM7XG4gICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gICAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG4gICAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgICAgICBuZXh0TGFuZVByaW9yaXR5ID0gcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgICAgIG5leHRMYW5lUHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIGhpZ2hlciBwcmlvcml0eSBsYW5lcywgd2UnbGwgaW5jbHVkZSB0aGVtIGV2ZW4gaWYgdGhleVxuICAvLyBhcmUgc3VzcGVuZGVkLlxuXG5cbiAgbmV4dExhbmVzID0gcGVuZGluZ0xhbmVzICYgZ2V0RXF1YWxPckhpZ2hlclByaW9yaXR5TGFuZXMobmV4dExhbmVzKTsgLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh3aXBMYW5lcyk7XG4gICAgdmFyIHdpcExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuXG4gICAgaWYgKG5leHRMYW5lUHJpb3JpdHkgPD0gd2lwTGFuZVByaW9yaXR5KSB7XG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gbmV4dExhbmVQcmlvcml0eTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IEV4cGlyYXRpb24gaGV1cmlzdGljIGlzIGNvbnN0YW50IHBlciBsYW5lLCBzbyBjb3VsZCB1c2UgYSBtYXAuXG4gIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmUpO1xuICB2YXIgcHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcblxuICBpZiAocHJpb3JpdHkgPj0gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5KSB7XG4gICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuIFdoZW5cbiAgICAvLyB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nIHRoZXJlJ3NcbiAgICAvLyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2Ygc3luY2hyb25vdXNcbiAgICAvLyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGVcbiAgICAvLyBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQgZXhwaXJhdGlvblxuICAgIC8vIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvbiBkb2VzIGhhcHBlbi5cbiAgICAvL1xuICAgIC8vIEFsc28gbm90ZSB0aGF0LCBpbiB0aGUgY2FzZSBvZiB1c2VyIGlucHV0IHNwZWNpZmljYWxseSwgdGhpcyB3aWxsIHNvb24gbm9cbiAgICAvLyBsb25nZXIgYmUgYW4gaXNzdWUgYmVjYXVzZSB3ZSBwbGFuIHRvIG1ha2UgdXNlciBpbnB1dCBzeW5jaHJvbm91cyBieVxuICAgIC8vIGRlZmF1bHQgKHVudGlsIHlvdSBlbnRlciBgc3RhcnRUcmFuc2l0aW9uYCwgb2YgY291cnNlLilcbiAgICAvL1xuICAgIC8vIElmIHdlcmVuJ3QgcGxhbm5pbmcgdG8gbWFrZSB0aGVzZSB1cGRhdGVzIHN5bmNocm9ub3VzIHNvb24gYW55d2F5LCBJXG4gICAgLy8gd291bGQgcHJvYmFibHkgbWFrZSB0aGlzIG51bWJlciBhIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuXG4gICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuICB9IGVsc2UgaWYgKHByaW9yaXR5ID49IFRyYW5zaXRpb25Qcmlvcml0eSkge1xuICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiByZXR1cm5OZXh0TGFuZXNQcmlvcml0eSgpIHtcbiAgcmV0dXJuIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn0gLy8gVG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyBtdWx0aXBsZSB1cGRhdGVzIGluIHRoZSBzYW1lIGV2ZW50LCB0aGlzIHNob3VsZFxuLy8gYmUgYSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFVwZGF0ZUxhbmUobGFuZVByaW9yaXR5LCB3aXBMYW5lcykge1xuICBzd2l0Y2ggKGxhbmVQcmlvcml0eSkge1xuICAgIGNhc2UgTm9MYW5lUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3luY0xhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0JhdGNoZWRMYW5lO1xuXG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJbnB1dERpc2NyZXRlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgIGlmIChfbGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgLy8gU2hpZnQgdG8gdGhlIG5leHQgcHJpb3JpdHkgbGV2ZWxcbiAgICAgICAgICByZXR1cm4gZmluZFVwZGF0ZUxhbmUoSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmU7XG4gICAgICB9XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9sYW5lMiA9IHBpY2tBcmJpdHJhcnlMYW5lKElucHV0Q29udGludW91c0xhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUyID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBTaGlmdCB0byB0aGUgbmV4dCBwcmlvcml0eSBsZXZlbFxuICAgICAgICAgIHJldHVybiBmaW5kVXBkYXRlTGFuZShEZWZhdWx0TGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmUyO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWZhdWx0TGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUzID0gcGlja0FyYml0cmFyeUxhbmUoRGVmYXVsdExhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUzID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBJZiBhbGwgdGhlIGRlZmF1bHQgbGFuZXMgYXJlIGFscmVhZHkgYmVpbmcgd29ya2VkIG9uLCBsb29rIGZvciBhXG4gICAgICAgICAgLy8gbGFuZSBpbiB0aGUgdHJhbnNpdGlvbiByYW5nZS5cbiAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgICAgaWYgKF9sYW5lMyA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgICAvLyBBbGwgdGhlIHRyYW5zaXRpb24gbGFuZXMgYXJlIHRha2VuLCB0b28uIFRoaXMgc2hvdWxkIGJlIHZlcnlcbiAgICAgICAgICAgIC8vIHJhcmUsIGJ1dCBhcyBhIGxhc3QgcmVzb3J0LCBwaWNrIGEgZGVmYXVsdCBsYW5lLiBUaGlzIHdpbGwgaGF2ZVxuICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgd29yay1pbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShEZWZhdWx0TGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbGFuZTM7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTogLy8gU2hvdWxkIGJlIGhhbmRsZWQgYnkgZmluZFRyYW5zaXRpb25MYW5lIGluc3RlYWRcblxuICAgIGNhc2UgUmV0cnlMYW5lUHJpb3JpdHk6XG4gICAgICAvLyBTaG91bGQgYmUgaGFuZGxlZCBieSBmaW5kUmV0cnlMYW5lIGluc3RlYWRcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZVByaW9yaXR5OlxuICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGFuZTtcbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIHVwZGF0ZSBwcmlvcml0eTogXCIgKyBsYW5lUHJpb3JpdHkgKyBcIi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIiApO1xuICAgIH1cbiAgfVxufSAvLyBUbyBlbnN1cmUgY29uc2lzdGVuY3kgYWNyb3NzIG11bHRpcGxlIHVwZGF0ZXMgaW4gdGhlIHNhbWUgZXZlbnQsIHRoaXMgc2hvdWxkXG4vLyBiZSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFRyYW5zaXRpb25MYW5lKHdpcExhbmVzLCBwZW5kaW5nTGFuZXMpIHtcbiAgLy8gRmlyc3QgbG9vayBmb3IgbGFuZXMgdGhhdCBhcmUgY29tcGxldGVseSB1bmNsYWltZWQsIGkuZS4gaGF2ZSBub1xuICAvLyBwZW5kaW5nIHdvcmsuXG4gIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUoVHJhbnNpdGlvbkxhbmVzICYgfnBlbmRpbmdMYW5lcyk7XG5cbiAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIElmIGFsbCBsYW5lcyBoYXZlIHBlbmRpbmcgd29yaywgbG9vayBmb3IgYSBsYW5lIHRoYXQgaXNuJ3QgY3VycmVudGx5XG4gICAgLy8gYmVpbmcgd29ya2VkIG9uLlxuICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBiZWluZyB3b3JrZWQgb24sIHBpY2sgYW55IGxhbmUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFRyYW5zaXRpb25MYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59IC8vIFRvIGVuc3VyZSBjb25zaXN0ZW5jeSBhY3Jvc3MgbXVsdGlwbGUgdXBkYXRlcyBpbiB0aGUgc2FtZSBldmVudCwgdGhpcyBzaG91bGRcbi8vIGJlIHB1cmUgZnVuY3Rpb24sIHNvIHRoYXQgaXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgbGFuZSBmb3IgZ2l2ZW4gaW5wdXRzLlxuXG5mdW5jdGlvbiBmaW5kUmV0cnlMYW5lKHdpcExhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGBmaW5kVXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShSZXRyeUxhbmVzICYgfndpcExhbmVzKTtcblxuICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFJldHJ5TGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuXG5mdW5jdGlvbiBnZXRMb3dlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyBmaW5kcyB0aGUgbW9zdCBzaWduaWZpY2FudCBub24temVybyBiaXQuXG4gIHZhciBpbmRleCA9IDMxIC0gY2x6MzIobGFuZXMpO1xuICByZXR1cm4gaW5kZXggPCAwID8gTm9MYW5lcyA6IDEgPDwgaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdldEVxdWFsT3JIaWdoZXJQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHJldHVybiAoZ2V0TG93ZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSA8PCAxKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBUT0RPOiBUaGVvcmV0aWNhbGx5LCBhbnkgdXBkYXRlIHRvIGFueSBsYW5lIGNhbiB1bmJsb2NrIGFueSBvdGhlciBsYW5lLiBCdXRcbiAgLy8gaXQncyBub3QgcHJhY3RpY2FsIHRvIHRyeSBldmVyeSBzaW5nbGUgcG9zc2libGUgY29tYmluYXRpb24uIFdlIG5lZWQgYVxuICAvLyBoZXVyaXN0aWMgdG8gZGVjaWRlIHdoaWNoIGxhbmVzIHRvIGF0dGVtcHQgdG8gcmVuZGVyLCBhbmQgaW4gd2hpY2ggYmF0Y2hlcy5cbiAgLy8gRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIGhldXJpc3RpYyBhcyBpbiB0aGUgb2xkIEV4cGlyYXRpb25UaW1lcyBtb2RlbDpcbiAgLy8gcmV0cnkgYW55IGxhbmUgYXQgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHksIGJ1dCBkb24ndCB0cnkgdXBkYXRlcyBhdCBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgd2l0aG91dCBhbHNvIGluY2x1ZGluZyB0aGUgbG93ZXIgcHJpb3JpdHkgdXBkYXRlcy4gVGhpcyB3b3JrcyB3ZWxsXG4gIC8vIHdoZW4gY29uc2lkZXJpbmcgdXBkYXRlcyBhY3Jvc3MgZGlmZmVyZW50IHByaW9yaXR5IGxldmVscywgYnV0IGlzbid0XG4gIC8vIHN1ZmZpY2llbnQgZm9yIHVwZGF0ZXMgd2l0aGluIHRoZSBzYW1lIHByaW9yaXR5LCBzaW5jZSB3ZSB3YW50IHRvIHRyZWF0XG4gIC8vIHRob3NlIHVwZGF0ZXMgYXMgcGFyYWxsZWwuXG4gIC8vIFVuc3VzcGVuZCBhbnkgdXBkYXRlIGF0IGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5LlxuXG4gIHZhciBoaWdoZXJQcmlvcml0eUxhbmVzID0gdXBkYXRlTGFuZSAtIDE7IC8vIFR1cm5zIDBiMTAwMCBpbnRvIDBiMDExMVxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgJj0gaGlnaGVyUHJpb3JpdHlMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSBoaWdoZXJQcmlvcml0eUxhbmVzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCkge1xuICByb290LmV4cGlyZWRMYW5lcyB8PSBJbnB1dERpc2NyZXRlTGFuZXMgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIGhhc0Rpc2NyZXRlTGFuZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIElucHV0RGlzY3JldGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdE11dGFibGVSZWFkKHJvb3QsIHVwZGF0ZUxhbmUpIHtcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzIHw9IHVwZGF0ZUxhbmUgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IDA7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSAwO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSBlbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuIE9ubHkgdXNlZCBvbiBsYW5lcywgc28gYXNzdW1lIGlucHV0IGlzIGFuIGludGVnZXIuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKGxhbmVzKSB7XG4gIGlmIChsYW5lcyA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2cobGFuZXMpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJbnRlbnRpb25hbGx5IG5vdCBuYW1lZCBpbXBvcnRzIGJlY2F1c2UgUm9sbHVwIHdvdWxkIHVzZSBkeW5hbWljIGRpc3BhdGNoIGZvclxudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksXG4gICAgcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eUZvclBsdWdpblN5c3RlbShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudDpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJZk5lZWRlZChuYXRpdmVFdmVudC50aW1lU3RhbXApO1xuICB9XG5cbiAgZGlzY3JldGVVcGRhdGVzKGRpc3BhdGNoRXZlbnQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgcnVuV2l0aFByaW9yaXR5KFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEsIGRpc3BhdGNoRXZlbnQuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFsbG93UmVwbGF5ID0gdHJ1ZTtcblxuICB7XG4gICAgLy8gVE9ETzogcmVwbGF5aW5nIGNhcHR1cmUgcGhhc2UgZXZlbnRzIGlzIGN1cnJlbnRseSBicm9rZW5cbiAgICAvLyBiZWNhdXNlIHdlIHVzZWQgdG8gZG8gaXQgZHVyaW5nIHRvcC1sZXZlbCBuYXRpdmUgYnViYmxlIGhhbmRsZXJzXG4gICAgLy8gYnV0IG5vdyB3ZSB1c2UgZGlmZmVyZW50IGJ1YmJsZSBhbmQgY2FwdHVyZSBoYW5kbGVycy5cbiAgICAvLyBJbiBlYWdlciBtb2RlLCB3ZSBhdHRhY2ggY2FwdHVyZSBsaXN0ZW5lcnMgZWFybHksIHNvIHdlIG5lZWRcbiAgICAvLyB0byBmaWx0ZXIgdGhlbSBvdXQgdW50aWwgd2UgZml4IHRoZSBsb2dpYyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkuXG4gICAgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIG91dHNpZGUgdGhlIGZsYWcgYnV0IEkgcHV0IGl0IGluc2lkZSB0byByZWR1Y2Ugcmlzay5cbiAgICBhbGxvd1JlcGxheSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgPT09IDA7XG4gIH1cblxuICBpZiAoYWxsb3dSZXBsYXkgJiYgaGFzUXVldWVkRGlzY3JldGVFdmVudHMoKSAmJiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSkpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMsIGFuZCB0aGlzIGlzIGFub3RoZXIgZGlzY3JldGVcbiAgICAvLyBldmVudCwgdGhlbiB3ZSBjYW4ndCBkaXNwYXRjaCBpdCByZWdhcmRsZXNzIG9mIGl0cyB0YXJnZXQsIHNpbmNlIHRoZXlcbiAgICAvLyBuZWVkIHRvIGRpc3BhdGNoIGluIG9yZGVyLlxuICAgIHF1ZXVlRGlzY3JldGVFdmVudChudWxsLCAvLyBGbGFncyB0aGF0IHdlJ3JlIG5vdCBhY3R1YWxseSBibG9ja2VkIG9uIGFueXRoaW5nIGFzIGZhciBhcyB3ZSBrbm93LlxuICAgIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGJsb2NrZWRPbiA9IGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQgdGhpcyBldmVudC5cbiAgICBpZiAoYWxsb3dSZXBsYXkpIHtcbiAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93UmVwbGF5KSB7XG4gICAgaWYgKGlzUmVwbGF5YWJsZURpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lKSkge1xuICAgICAgLy8gVGhpcyB0aGlzIHRvIGJlIHJlcGxheWVkIGxhdGVyIG9uY2UgdGhlIHRhcmdldCBpcyBhdmFpbGFibGUuXG4gICAgICBxdWV1ZURpc2NyZXRlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gICAgLy8gcXVldWVpbmcgaXMgYWNjdW1tdWxhdGl2ZS5cblxuXG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59IC8vIEF0dGVtcHQgZGlzcGF0Y2hpbmcgYW4gZXZlbnQuIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBfYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcblxuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19SRVBMQVlFRCkgPT09IDApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIGhhc093blByb3BlcnR5JDIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duUHJvcGVydHkkMi5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhb2JqZWN0SXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuXG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IGRvbid0IGl0ZXJhdGUgdGhyb3VnaCBldmVudHNcbiAgICAgIC8vIGZvciB0aGUgc2FtZSBwb3J0YWwgY29udGFpbmVyIG9yIHJvb3Qgbm9kZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgIC8vIFRPRE86IG9uY2Ugd2UgcmVtb3ZlIHRoZSBmbGFnLCB3ZSBtYXkgYmUgYWJsZSB0byBhbHNvXG4gICAgICAvLyByZW1vdmUgc29tZSBvZiB0aGUgYm9va2tlZXBpbmcgbWFwcyB1c2VkIGZvciBsYXppbmVzcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHJvb3RDb250YWluZXJFbGVtZW50LCB0YXJnZXRFbGVtZW50KSB7XG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICB2YXIgdGFyZ2V0ID0gcm9vdENvbnRhaW5lckVsZW1lbnQ7IC8vIHNlbGVjdGlvbmNoYW5nZSBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnRcbiAgLy8gb3RoZXJ3aXNlIGl0IHdvbid0IGNhcHR1cmUgaW5jb21pbmcgZXZlbnRzIHRoYXQgYXJlIG9ubHlcbiAgLy8gdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCBkaXJlY3RseS5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyAmJiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSAhPT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHRhcmdldCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIH0gLy8gSWYgdGhlIGV2ZW50IGNhbiBiZSBkZWxlZ2F0ZWQgKG9yIGlzIGNhcHR1cmUgcGhhc2UpLCB3ZSBjYW5cbiAgLy8gcmVnaXN0ZXIgaXQgdG8gdGhlIHJvb3QgY29udGFpbmVyLiBPdGhlcndpc2UsIHdlIHNob3VsZFxuICAvLyByZWdpc3RlciB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50IGFuZCBtYXJrIGl0IGFzXG4gIC8vIGEgbm9uLWRlbGVnYXRlZCBldmVudC5cblxuXG4gIGlmICh0YXJnZXRFbGVtZW50ICE9PSBudWxsICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyICYmIG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgIC8vIEZvciBhbGwgbm9uLWRlbGVnYXRlZCBldmVudHMsIGFwYXJ0IGZyb20gc2Nyb2xsLCB3ZSBhdHRhY2hcbiAgICAvLyB0aGVpciBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHJlc3BlY3RpdmUgZWxlbWVudHMgdGhhdCB0aGVpclxuICAgIC8vIGV2ZW50cyBmaXJlIG9uLiBUaGF0IG1lYW5zIHdlIGNhbiBza2lwIHRoaXMgc3RlcCwgYXMgZXZlbnRcbiAgICAvLyBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHByZXZpb3VzbHkuIEhvd2V2ZXIsIHdlXG4gICAgLy8gc3BlY2lhbCBjYXNlIHRoZSBzY3JvbGwgZXZlbnQgYmVjYXVzZSB0aGUgcmVhbGl0eSBpcyB0aGF0IGFueVxuICAgIC8vIGVsZW1lbnQgY2FuIHNjcm9sbC5cbiAgICAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYXBwbHkgdGhlIHNhbWUgbG9naWMgdG8gYWxsXG4gICAgLy8gZXZlbnRzIGZyb20gdGhlIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0LiBUaGVuIHdlIGNhbiByZW1vdmVcbiAgICAvLyB0aGlzIHNwZWNpYWwgY2FzZSBhbmQgdXNlIHRoZSBzYW1lIGxvZ2ljIGZvciBhbGwgZXZlbnRzLlxuICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzY3JvbGwnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19OT05fREVMRUdBVEVEO1xuICAgIHRhcmdldCA9IHRhcmdldEVsZW1lbnQ7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7IC8vIElmIHRoZSBsaXN0ZW5lciBlbnRyeSBpcyBlbXB0eSBvciB3ZSBzaG91bGQgdXBncmFkZSwgdGhlblxuICAvLyB3ZSBuZWVkIHRvIHRyYXAgYW4gZXZlbnQgbGlzdGVuZXIgb250byB0aGUgdGFyZ2V0LlxuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gICAgfVxuXG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkRXZlbnRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIEhUTUxfTkFNRVNQQUNFJDEgPSBOYW1lc3BhY2VzLmh0bWw7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclRleHREaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZTtcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuICAvLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbiAgLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbiAgLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG4gIHZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xuICB2YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG4gIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbiAgfTtcblxuICB3YXJuRm9yVGV4dERpZmZlcmVuY2UgPSBmdW5jdGlvbiAoc2VydmVyVGV4dCwgY2xpZW50VGV4dCkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gIH07XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdvYmplY3QnICYmIG5leHRQcm9wICE9PSBudWxsICYmIG5leHRQcm9wLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRSkge1xuICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIHVzZU9wYXF1ZVJlZmVyZW5jZSdzIG9wYXF1ZSBvYmplY3QsIHRoaXMgbWVhbnMgd2UgYXJlIGh5ZHJhdGluZy5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgY2FsbCB0aGUgb3BhcXVlIG9iamVjdCdzIHRvU3RyaW5nIGZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyBhIG5ldyBjbGllbnRcbiAgICAgIC8vIElEIHNvIGNsaWVudCBhbmQgc2VydmVyIElEcyBtYXRjaCBhbmQgdGhyb3dzIHRvIHJlcmVuZGVyLlxuICAgICAgbmV4dFByb3AudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nID0gcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlO1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIEJ1aWx0LWluIFNTUiBhdHRyaWJ1dGUgaXMgYWxsb3dlZFxuICAgICAgICBjYXNlICdkYXRhLXJlYWN0cm9vdCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cblxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICggLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgaWYgKGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgIXN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yVW5tYXRjaGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclRleHREaWZmZXJlbmNlKHRleHROb2RlLm5vZGVWYWx1ZSwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gX2Fzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxO1xuXG57XG4gIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbn1cblxudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICByZXR1cm4gc2hvdWxkQXV0b0ZvY3VzSG9zdENvbXBvbmVudCh0eXBlLCBwcm9wcyk7XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnb3B0aW9uJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIGlmIChzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIG5ld1Byb3BzKSkge1xuICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICB2YXIgYm9keSA9IGNvbnRhaW5lci5ib2R5O1xuXG4gICAgaWYgKGJvZHkgIT0gbnVsbCkge1xuICAgICAgYm9keS50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICByZXR1cm4gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHBhcmVudE5hbWVzcGFjZSk7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSA7XG59XG52YXIgY2xpZW50SWQgPSAwO1xuZnVuY3Rpb24gbWFrZUNsaWVudElkSW5ERVYod2Fybk9uQWNjZXNzSW5ERVYpIHtcbiAgdmFyIGlkID0gJ3I6JyArIChjbGllbnRJZCsrKS50b1N0cmluZygzNik7XG4gIHJldHVybiB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm5PbkFjY2Vzc0luREVWKCk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSxcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuT25BY2Nlc3NJbkRFVigpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRTtcbn1cbmZ1bmN0aW9uIG1ha2VPcGFxdWVIeWRyYXRpbmdPYmplY3QoYXR0ZW1wdFRvUmVhZFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX09QQVFVRV9JRF9UWVBFLFxuICAgIHRvU3RyaW5nOiBhdHRlbXB0VG9SZWFkVmFsdWUsXG4gICAgdmFsdWVPZjogYXR0ZW1wdFRvUmVhZFZhbHVlXG4gIH07XG59XG5mdW5jdGlvbiBwcmVwYXJlUG9ydGFsTW91bnQocG9ydGFsSW5zdGFuY2UpIHtcbiAge1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbiAgfVxufVxuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0RmliZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXkgPSAnX19yZWFjdENvbnRhaW5lciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRzJCcgKyByYW5kb21LZXk7XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImdldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xudmFyIGZpYmVyU3RhY2s7XG5cbntcbiAgZmliZXJTdGFjayA9IFtdO1xufVxuXG52YXIgaW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBGaWJlciBwb3BwZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTtcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gZmliZXI7XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxuXG52YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0O1xuXG57XG4gIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dCA9IHt9O1xufVxuXG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufSAvLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxuXG5cbnZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cblxudmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suXG4vLyBXZSB1c2UgdGhpcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBwYXJlbnQgY29udGV4dCBhZnRlciB3ZSBoYXZlIGFscmVhZHlcbi8vIHB1c2hlZCB0aGUgbmV4dCBjb250ZXh0IHByb3ZpZGVyLCBhbmQgbm93IG5lZWQgdG8gbWVyZ2UgdGhlaXIgY29udGV4dHMuXG5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAge1xuICAgIGlmIChkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIgJiYgaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0XG4gICAgICAvLyBwcm92aWRlciBzaG91bGQgbm90IFwic2VlXCIgaXRzIG93biBjaGlsZCBjb250ZXh0LiBUaGVyZWZvcmUgd2UgcmVhZCB0aGVcbiAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgICAgcmV0dXJuIHByZXZpb3VzQ29udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIG1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gdHlwZS5jb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuXG4gICAgLy8gRmFpbGluZyB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuXG4gICAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9PT0gdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IHVubWFza2VkQ29udGV4dFtrZXldO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoIShjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0KSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBfYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCEoaXNGaWJlck1vdW50ZWQoZmliZXIpICYmIGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHN1YnRyZWUgcGFyZW50IHRvIGJlIGEgbW91bnRlZCBjbGFzcyBjb21wb25lbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5jb250ZXh0O1xuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQmxvY2tpbmdSb290ID0gMTtcbnZhciBDb25jdXJyZW50Um9vdCA9IDI7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9IC8vIERldlRvb2xzIGV4aXN0c1xuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIHByaW9yaXR5TGV2ZWwpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHByaW9yaXR5TGV2ZWwsIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTY2hlZHVsZXJfcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFxuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgICBTY2hlZHVsZXJfc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQsXG4gICAgU2NoZWR1bGVyX3JlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsXG4gICAgU2NoZWR1bGVyX25vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdyxcbiAgICBTY2hlZHVsZXJfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsXG4gICAgU2NoZWR1bGVyX0ltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgU2NoZWR1bGVyX0xvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9JZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuXG57XG4gIC8vIFByb3ZpZGUgZXhwbGljaXQgZXJyb3IgbWVzc2FnZSB3aGVuIHByb2R1Y3Rpb24rcHJvZmlsaW5nIGJ1bmRsZSBvZiBlLmcuXG4gIC8vIHJlYWN0LWRvbSBpcyB1c2VkIHdpdGggcHJvZHVjdGlvbiAobm9uLXByb2ZpbGluZykgYnVuZGxlIG9mXG4gIC8vIHNjaGVkdWxlci90cmFjaW5nXG4gIGlmICghKHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYgIT0gbnVsbCAmJiB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgIT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHJ1biB0aGUgcHJvZmlsaW5nIHZlcnNpb24gb2YgYSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIGByZWFjdC1kb20vcHJvZmlsaW5nYCkgd2l0aG91dCBhbHNvIHJlcGxhY2luZyB0aGUgYHNjaGVkdWxlci90cmFjaW5nYCBtb2R1bGUgd2l0aCBgc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nYC4gWW91ciBidW5kbGVyIG1pZ2h0IGhhdmUgYSBzZXR0aW5nIGZvciBhbGlhc2luZyBib3RoIG1vZHVsZXMuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Byb2ZpbGluZ1wiICk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlQ2FsbGJhY2tOb2RlID0ge307IC8vIEV4Y2VwdCBmb3IgTm9Qcmlvcml0eSwgdGhlc2UgY29ycmVzcG9uZCB0byBTY2hlZHVsZXIgcHJpb3JpdGllcy4gV2UgdXNlXG4vLyBhc2NlbmRpbmcgbnVtYmVycyBzbyB3ZSBjYW4gY29tcGFyZSB0aGVtIGxpa2UgbnVtYmVycy4gVGhleSBzdGFydCBhdCA5MCB0b1xuLy8gYXZvaWQgY2xhc2hpbmcgd2l0aCBTY2hlZHVsZXIncyBwcmlvcml0aWVzLlxuXG52YXIgSW1tZWRpYXRlUHJpb3JpdHkkMSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgPSA5ODtcbnZhciBOb3JtYWxQcmlvcml0eSQxID0gOTc7XG52YXIgTG93UHJpb3JpdHkkMSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSQxID0gOTU7IC8vIE5vUHJpb3JpdHkgaXMgdGhlIGFic2VuY2Ugb2YgcHJpb3JpdHkuIEFsc28gUmVhY3Qtb25seS5cblxudmFyIE5vUHJpb3JpdHkkMSA9IDkwO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IC8vIEZhbGwgYmFjayBncmFjZWZ1bGx5IGlmIHdlJ3JlIHJ1bm5pbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiBTY2hlZHVsZXIuXG5TY2hlZHVsZXJfcmVxdWVzdFBhaW50ICE9PSB1bmRlZmluZWQgPyBTY2hlZHVsZXJfcmVxdWVzdFBhaW50IDogZnVuY3Rpb24gKCkge307XG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbW1lZGlhdGVRdWV1ZUNhbGxiYWNrTm9kZSA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xudmFyIGluaXRpYWxUaW1lTXMkMSA9IFNjaGVkdWxlcl9ub3ckMSgpOyAvLyBJZiB0aGUgaW5pdGlhbCB0aW1lc3RhbXAgaXMgcmVhc29uYWJseSBzbWFsbCwgdXNlIFNjaGVkdWxlcidzIGBub3dgIGRpcmVjdGx5LlxuLy8gVGhpcyB3aWxsIGJlIHRoZSBjYXNlIGZvciBtb2Rlcm4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGBwZXJmb3JtYW5jZS5ub3dgLiBJblxuLy8gb2xkZXIgYnJvd3NlcnMsIFNjaGVkdWxlciBmYWxscyBiYWNrIHRvIGBEYXRlLm5vd2AsIHdoaWNoIHJldHVybnMgYSBVbml4XG4vLyB0aW1lc3RhbXAuIEluIHRoYXQgY2FzZSwgc3VidHJhY3QgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lIHRvIHNpbXVsYXRlXG4vLyB0aGUgYmVoYXZpb3Igb2YgcGVyZm9ybWFuY2Uubm93IGFuZCBrZWVwIG91ciB0aW1lcyBzbWFsbCBlbm91Z2ggdG8gZml0XG4vLyB3aXRoaW4gMzIgYml0cy5cbi8vIFRPRE86IENvbnNpZGVyIGxpZnRpbmcgdGhpcyBpbnRvIFNjaGVkdWxlci5cblxudmFyIG5vdyA9IGluaXRpYWxUaW1lTXMkMSA8IDEwMDAwID8gU2NoZWR1bGVyX25vdyQxIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU2NoZWR1bGVyX25vdyQxKCkgLSBpbml0aWFsVGltZU1zJDE7XG59O1xuZnVuY3Rpb24gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHN3aXRjaCAoU2NoZWR1bGVyX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICBjYXNlIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJbW1lZGlhdGVQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gVXNlckJsb2NraW5nUHJpb3JpdHkkMjtcblxuICAgIGNhc2UgU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5JDE7XG5cbiAgICBjYXNlIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTpcbiAgICAgIHJldHVybiBMb3dQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfSWRsZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIElkbGVQcmlvcml0eSQxO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcHJpb3JpdHkgbGV2ZWwuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhY3RQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHkkMjpcbiAgICAgIHJldHVybiBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTtcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX0lkbGVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmtub3duIHByaW9yaXR5IGxldmVsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQxKHJlYWN0UHJpb3JpdHlMZXZlbCwgZm4pIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBmbik7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrKHJlYWN0UHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdOyAvLyBGbHVzaCB0aGUgcXVldWUgaW4gdGhlIG5leHQgdGljaywgYXQgdGhlIGVhcmxpZXN0LlxuXG4gICAgaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgPSBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXJfSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrUXVldWVJbXBsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlXG4gICAgLy8gd2UgYWxyZWFkeSBzY2hlZHVsZWQgb25lIHdoZW4gd2UgY3JlYXRlZCB0aGUgcXVldWUuXG4gICAgc3luY1F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGZha2VDYWxsYmFja05vZGU7XG59XG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpIHtcbiAgaWYgKGNhbGxiYWNrTm9kZSAhPT0gZmFrZUNhbGxiYWNrTm9kZSkge1xuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCkge1xuICBpZiAoaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgbm9kZSA9IGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlO1xuICAgIGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICBTY2hlZHVsZXJfY2FuY2VsQ2FsbGJhY2sobm9kZSk7XG4gIH1cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nU3luY1F1ZXVlICYmIHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY3kuXG4gICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IHRydWU7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9pc1N5bmMyID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9xdWV1ZSA9IHN5bmNRdWV1ZTtcbiAgICAgICAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAoOyBpIDwgX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfcXVldWVbaV07XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhfaXNTeW5jMik7XG4gICAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICAgIFNjaGVkdWxlcl9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxudmFyIE5vTW9kZSA9IDA7XG52YXIgU3RyaWN0TW9kZSA9IDE7IC8vIFRPRE86IFJlbW92ZSBCbG9ja2luZ01vZGUgYW5kIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdFxuLy8gdGFnIGluc3RlYWRcblxudmFyIEJsb2NraW5nTW9kZSA9IDI7XG52YXIgQ29uY3VycmVudE1vZGUgPSA0O1xudmFyIFByb2ZpbGVNb2RlID0gODtcbnZhciBEZWJ1Z1RyYWNpbmdNb2RlID0gMTY7XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IDA7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCAmJiBDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzLiBUYWtlbiBmcm9tIFJlYWN0RWxlbWVudFxuICAgIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGJhc2VQcm9wcyk7XG5cbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxuLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxudmFyIE1BWF9TSUdORURfMzFfQklUX0lOVCA9IDEwNzM3NDE4MjM7XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBuZXh0VmFsdWUpIHtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlckZpYmVyLnR5cGUuX2NvbnRleHQ7XG5cbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVDaGFuZ2VkQml0cyhjb250ZXh0LCBuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAvLyBObyBjaGFuZ2VcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY2hhbmdlZEJpdHMgPSB0eXBlb2YgY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09ICdmdW5jdGlvbicgPyBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0cyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogTUFYX1NJR05FRF8zMV9CSVRfSU5UO1xuXG4gICAge1xuICAgICAgaWYgKChjaGFuZ2VkQml0cyAmIE1BWF9TSUdORURfMzFfQklUX0lOVCkgIT09IGNoYW5nZWRCaXRzKSB7XG4gICAgICAgIGVycm9yKCdjYWxjdWxhdGVDaGFuZ2VkQml0czogRXhwZWN0ZWQgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhICcgKyAnMzEtYml0IGludGVnZXIuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkQml0cyB8IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlV29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGFsdGVybmF0ZSB3YXMgdXBkYXRlZCwgd2hpY2ggbWVhbnMgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAvLyBhbmNlc3RvciBwYXRoIGFscmVhZHkgaGFzIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIGNoYW5nZWRCaXRzLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQgJiYgKGRlcGVuZGVuY3kub2JzZXJ2ZWRCaXRzICYgY2hhbmdlZEJpdHMpICE9PSAwKSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cblxuICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGFzdENvbnRleHRXaXRoQWxsQml0c09ic2VydmVkID09PSBjb250ZXh0KSA7IGVsc2UgaWYgKG9ic2VydmVkQml0cyA9PT0gZmFsc2UgfHwgb2JzZXJ2ZWRCaXRzID09PSAwKSA7IGVsc2Uge1xuICAgIHZhciByZXNvbHZlZE9ic2VydmVkQml0czsgLy8gQXZvaWQgZGVvcHRpbmcgb24gb2JzZXJ2YWJsZSBhcmd1bWVudHMgb3IgaGV0ZXJvZ2VuZW91cyB0eXBlcy5cblxuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZWRCaXRzICE9PSAnbnVtYmVyJyB8fCBvYnNlcnZlZEJpdHMgPT09IE1BWF9TSUdORURfMzFfQklUX0lOVCkge1xuICAgICAgLy8gT2JzZXJ2ZSBhbGwgdXBkYXRlcy5cbiAgICAgIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IGNvbnRleHQ7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IE1BWF9TSUdORURfMzFfQklUX0lOVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZWRPYnNlcnZlZEJpdHMgPSBvYnNlcnZlZEJpdHM7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG9ic2VydmVkQml0czogcmVzb2x2ZWRPYnNlcnZlZEJpdHMsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmICghKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90IGluc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtLFxuICAgICAgICByZXNwb25kZXJzOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbFxuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBfYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICghKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogXCIgKyBjYWxsYmFjayApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5OyAvLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxuXG52YXIgZW1wdHlSZWZzT2JqZWN0ID0gbmV3IFJlYWN0LkNvbXBvbmVudCgpLnJlZnM7XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0IGEgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSB0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCB0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IF9hc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7XG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgY2hpbGQuX3N0b3JlID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbnZhciBpc0FycmF5JDEgPSBBcnJheS5pc0FycmF5O1xuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKCEob3duZXJGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuIFdlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gaW5zdC5yZWZzO1xuXG4gICAgICAgIGlmIChyZWZzID09PSBlbXB0eVJlZnNPYmplY3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLlxuICAgICAgICAgIHJlZnMgPSBpbnN0LnJlZnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEodHlwZW9mIG1peGVkUmVmID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4yLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICBpZiAocmV0dXJuRmliZXIudHlwZSAhPT0gJ3RleHRhcmVhJykge1xuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBuZXdDaGlsZCkgKyBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShyZXR1cm5GaWJlci50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59IC8vIFdlIGF2b2lkIGlubGluaW5nIHRoaXMgdG8gYXZvaWQgcG90ZW50aWFsIGRlb3B0cyBmcm9tIHVzaW5nIHRyeS9jYXRjaC5cbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWxldGlvbnMgYXJlIGFkZGVkIGluIHJldmVyc2VkIG9yZGVyIHNvIHdlIGFkZCBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJldHVybiBmaWJlcidzIGVmZmVjdCBsaXN0IGlzIGVtcHR5IGV4Y2VwdCBmb3JcbiAgICAvLyBkZWxldGlvbnMsIHNvIHdlIGNhbiBqdXN0IGFwcGVuZCB0aGUgZGVsZXRpb24gdG8gdGhlIGxpc3QuIFRoZSByZW1haW5pbmdcbiAgICAvLyBlZmZlY3RzIGFyZW4ndCBhZGRlZCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UuIE9uY2Ugd2UgaW1wbGVtZW50XG4gICAgLy8gcmVzdW1pbmcsIHRoaXMgbWF5IG5vdCBiZSB0cnVlLlxuXG5cbiAgICB2YXIgbGFzdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgbGFzdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH1cblxuICAgIGNoaWxkVG9EZWxldGUubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgY2hpbGRUb0RlbGV0ZS5mbGFncyA9IERlbGV0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyA9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzID0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgPSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5JDEobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywga2V5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywgbmV3Q2hpbGQua2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAoISh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKCEobmV3Q2hpbGRyZW4gIT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHN3aXRjaCAoY2hpbGQudGFnKSB7XG4gICAgICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBCbG9jazpcblxuICAgICAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZmFsbHRocm91Z2ggaGVyZSBpZiBlbmFibGVCbG9ja3NBUEkgaXMgbm90IG9uLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZWQgbm8tZmFsbHRocm91Z2hcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2V4aXN0aW5nMyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgICAgIF9leGlzdGluZzMucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIF9leGlzdGluZzMuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZXhpc3RpbmczO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIHZhciBpc09iamVjdCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGw7XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAndW5kZWZpbmVkJyAmJiAhaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgcmV0dXJuIGZpYmVyIGlzIGEgY29tcG9zaXRlXG4gICAgICAvLyBjb21wb25lbnQsIHRocm93IGFuIGVycm9yLiBJZiBGaWJlciByZXR1cm4gdHlwZXMgYXJlIGRpc2FibGVkLFxuICAgICAgLy8gd2UgYWxyZWFkeSB0aHJldyBhYm92ZS5cbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnJlbmRlci5faXNNb2NrRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZSwgd2hpY2ggaGFuZGxlcyBib3RoXG4gICAgICAgIC8vIGZ1bmN0aW9ucyBhbmQgY2xhc3Nlc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVkIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgICAgY2FzZSBCbG9jazpcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKSArIFwiKC4uLik6IE5vdGhpbmcgd2FzIHJldHVybmVkIGZyb20gcmVuZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSByZXR1cm4gc3RhdGVtZW50IGlzIG1pc3NpbmcuIE9yLCB0byByZW5kZXIgbm90aGluZywgcmV0dXJuIG51bGwuXCIgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICghKGN1cnJlbnQgPT09IG51bGwgfHwgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IGN1cnJlbnQuY2hpbGQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKCEoYyAhPT0gTk9fQ09OVEVYVCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIEluIG9yZGVyIHRvIGNhcHR1cmUsIHRoZSBTdXNwZW5zZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgZmFsbGJhY2sgcHJvcC5cblxuICBpZiAocHJvcHMuZmFsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cblxuICBpZiAocHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG4gIC8vIHBhcmVudCBib3VuZGFyeSBpZiBpdCBpcyBjdXJyZW50bHkgaW52aXNpYmxlLlxuXG5cbiAgaWYgKGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBhYmxlIHRvIGhhbmRsZSBpdCwgd2UgbXVzdCBoYW5kbGUgaXQuXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjI7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjQ7XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIHZhciBwYXJlbnRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICBjaGlsZFRvRGVsZXRlLmZsYWdzID0gRGVsZXRpb247IC8vIFRoaXMgbWlnaHQgc2VlbSBsaWtlIGl0IGJlbG9uZ3Mgb24gcHJvZ3Jlc3NlZEZpcnN0RGVsZXRpb24uIEhvd2V2ZXIsXG4gIC8vIHRoZXNlIGNoaWxkcmVuIGFyZSBub3QgcGFydCBvZiB0aGUgcmVjb25jaWxpYXRpb24gbGlzdCBvZiBjaGlsZHJlbi5cbiAgLy8gRXZlbiBpZiB3ZSBhYm9ydCBhbmQgcmVyZWNvbmNpbGUgdGhlIGNoaWxkcmVuLCB0aGF0IHdpbGwgdHJ5IHRvIGh5ZHJhdGVcbiAgLy8gYWdhaW4gYW5kIHRoZSBub2RlcyBhcmUgc3RpbGwgaW4gdGhlIGhvc3QgdHJlZSBzbyB0aGVzZSB3aWxsIGJlXG4gIC8vIHJlY3JlYXRlZC5cblxuICBpZiAocmV0dXJuRmliZXIubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcblxuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3RleHQpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQobmV4dEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuXG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyKTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG5cbiAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG5cbiAge1xuICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0eXBlID0gZmliZXIudHlwZTsgLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS5cbiAgLy8gVE9ETzogQmV0dGVyIGhldXJpc3RpYy5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHR5cGUgIT09ICdoZWFkJyAmJiB0eXBlICE9PSAnYm9keScgJiYgIXNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xudmFyIHJlbmRlcmVyU2lnaWwkMTtcblxue1xuICAvLyBVc2VkIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgbXV0YWJsZSBzb3VyY2UuXG4gIHJlbmRlcmVyU2lnaWwkMSA9IHt9O1xufVxuXG5mdW5jdGlvbiBtYXJrU291cmNlQXNEaXJ0eShtdXRhYmxlU291cmNlKSB7XG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24obXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAgcmV0dXJuIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFdvcmtJblByb2dyZXNzVmVyc2lvbihtdXRhYmxlU291cmNlLCB2ZXJzaW9uKSB7XG4gIHtcbiAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gdmVyc2lvbjtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gd2FybkFib3V0TXVsdGlwbGVSZW5kZXJlcnNERVYobXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAge1xuICAgICAgaWYgKG11dGFibGVTb3VyY2UuX2N1cnJlbnRQcmltYXJ5UmVuZGVyZXIgPT0gbnVsbCkge1xuICAgICAgICBtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbCQxO1xuICAgICAgfSBlbHNlIGlmIChtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsJDEpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgbXV0YWJsZSBzb3VyY2UuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBFYWdlciByZWFkcyB0aGUgdmVyc2lvbiBvZiBhIG11dGFibGUgc291cmNlIGFuZCBzdG9yZXMgaXQgb24gdGhlIHJvb3QuXG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VXNlT3BhcXVlSWRlbnRpZmllcjtcblxue1xuICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyID0ge307XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnR5cGUpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcblxuICAgICAgaWYgKCEobnVtYmVyT2ZSZVJlbmRlcnMgPCBSRV9SRU5ERVJfTElNSVQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cIiApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jeS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIGlmICghIWRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgZWFybHkgcmV0dXJuIHN0YXRlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmN5LlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmICghKG5leHRDdXJyZW50SG9vayAhPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBlYWdlclJlZHVjZXI6IHVwZGF0ZS5lYWdlclJlZHVjZXIsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgZWFnZXJSZWR1Y2VyOiB1cGRhdGUuZWFnZXJSZWR1Y2VyLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmVhZ2VyUmVkdWNlciA9PT0gcmVkdWNlcikge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIHdhcyBwcm9jZXNzZWQgZWFnZXJseSwgYW5kIGl0cyByZWR1Y2VyIG1hdGNoZXMgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCByZWR1Y2VyLCB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLlxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpIHtcbiAge1xuICAgIHdhcm5BYm91dE11bHRpcGxlUmVuZGVyZXJzREVWKHNvdXJjZSk7XG4gIH1cblxuICB2YXIgZ2V0VmVyc2lvbiA9IHNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKHNvdXJjZS5fc291cmNlKTsgLy8gSXMgaXQgc2FmZSBmb3IgdGhpcyBjb21wb25lbnQgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXI/XG5cbiAgdmFyIGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsgLy8gQ2hlY2sgdGhlIHZlcnNpb24gZmlyc3QuXG4gIC8vIElmIHRoaXMgcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbixcbiAgLy8gd2UgY2FuIHVzZSBpdCBhbG9uZSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHNhZmVseSByZWFkIGZyb20gdGhlIHNvdXJjZS5cblxuICB2YXIgY3VycmVudFJlbmRlclZlcnNpb24gPSBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24oc291cmNlKTtcblxuICBpZiAoY3VycmVudFJlbmRlclZlcnNpb24gIT09IG51bGwpIHtcbiAgICAvLyBJdCdzIHNhZmUgdG8gcmVhZCBpZiB0aGUgc3RvcmUgaGFzbid0IGJlZW4gbXV0YXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lXG4gICAgLy8gd2UgcmVhZCBzb21ldGhpbmcuXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGN1cnJlbnRSZW5kZXJWZXJzaW9uID09PSB2ZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gdmVyc2lvbiwgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHJlYWQgZnJvbSB0aGVcbiAgICAvLyBzb3VyY2UgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLCBzbyB3ZSBuZWVkIHRvIGRvIGEgYml0IG1vcmUgd29yay5cbiAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlzIGlmIHRoZXJlIGFyZSBhbnkgaG9va3MgdGhhdCBhbHJlYWR5XG4gICAgLy8gc3Vic2NyaWJlZCB0byB0aGUgc291cmNlLCBhbmQgaWYgc28sIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwZW5kaW5nXG4gICAgLy8gbXV0YXRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIHN5bmNocm9uaXplZCB5ZXQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyBtdXRhdGlvbnMsIHRoZW4gYHJvb3QubXV0YWJsZVJlYWRMYW5lc2Agd2lsbCBiZVxuICAgIC8vIGVtcHR5LCBhbmQgd2Uga25vdyB3ZSBjYW4gc2FmZWx5IHJlYWQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSAqYXJlKiBwZW5kaW5nIG11dGF0aW9ucywgd2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gc2FmZWx5IHJlYWRcbiAgICAvLyBpZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBsYW5lcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBwZW5kaW5nIG11dGF0aW9uXG4gICAgLy8gbGFuZXMsIHNpbmNlIHRoYXQgZ3VhcmFudGVlcyB0aGF0IHRoZSB2YWx1ZSB3ZSdyZSBhYm91dCB0byByZWFkIGZyb21cbiAgICAvLyB0aGUgc291cmNlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBkdXJpbmcgdGhlIG1vc3RcbiAgICAvLyByZWNlbnQgbXV0YXRpb24uXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgcm9vdC5tdXRhYmxlUmVhZExhbmVzKTtcblxuICAgIGlmIChpc1NhZmVUb1JlYWRGcm9tU291cmNlKSB7XG4gICAgICAvLyBJZiBpdCdzIHNhZmUgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIsXG4gICAgICAvLyBzdG9yZSB0aGUgdmVyc2lvbiBpbiBjYXNlIG90aGVyIGNvbXBvbmVudHMgcmVhZCBmcm9tIGl0LlxuICAgICAgLy8gQSBjaGFuZ2VkIHZlcnNpb24gbnVtYmVyIHdpbGwgbGV0IHRob3NlIGNvbXBvbmVudHMga25vdyB0byB0aHJvdyBhbmQgcmVzdGFydCB0aGUgcmVuZGVyLlxuICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKHNvdXJjZSwgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UpIHtcbiAgICB2YXIgc25hcHNob3QgPSBnZXRTbmFwc2hvdChzb3VyY2UuX3NvdXJjZSk7XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIHNuYXBzaG90ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdNdXRhYmxlIHNvdXJjZSBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uIGFzIHRoZSBzbmFwc2hvdCB2YWx1ZS4gJyArICdGdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgbXV0YWJsZSB2YWx1ZXMgYW5kIGNhdXNlIHRlYXJpbmcuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbXV0YWJsZSBzb3VyY2UgYmVpbmcgc2hhcmVkIGJldHdlZW4gcmVuZGVyZXJzLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgaWYgdGhlIHNvdXJjZSBpcyBtdXRhdGVkIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVuZGVyZXIsXG4gICAgLy8gVGhlIHNlY29uZCByZW5kZXJlciBkb24ndCBrbm93IHRoYXQgaXQgbmVlZHMgdG8gcmVzZXQgdGhlIFdJUCB2ZXJzaW9uIGR1cmluZyB1bndpbmQsXG4gICAgLy8gKGJlY2F1c2UgdGhlIGhvb2sgb25seSBtYXJrcyBzb3VyY2VzIGFzIGRpcnR5IGlmIGl0J3Mgd3JpdHRlbiB0byB0aGVpciBXSVAgdmVyc2lvbikuXG4gICAgLy8gVGhhdCB3b3VsZCBjYXVzZSB0aGlzIHRlYXIgY2hlY2sgdG8gdGhyb3cgYWdhaW4gYW5kIGV2ZW50dWFsbHkgYmUgdmlzaWJsZSB0byB0aGUgdXNlci5cbiAgICAvLyBXZSBjYW4gYXZvaWQgdGhpcyBpbmZpbml0ZSBsb29wIGJ5IGV4cGxpY2l0bHkgbWFya2luZyB0aGUgc291cmNlIGFzIGRpcnR5LlxuICAgIC8vXG4gICAgLy8gVGhpcyBjYW4gbGVhZCB0byB0ZWFyaW5nIGluIHRoZSBmaXJzdCByZW5kZXJlciB3aGVuIGl0IHJlc3VtZXMsXG4gICAgLy8gYnV0IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCAoc2hvcnQgb2YgdGhyb3dpbmcgaGVyZSBhbmQgcmVmdXNpbmcgdG8gY29udGludWUgdGhlIHJlbmRlcikuXG4gICAgbWFya1NvdXJjZUFzRGlydHkoc291cmNlKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2Fubm90IHJlYWQgZnJvbSBtdXRhYmxlIHNvdXJjZSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgdGVhcmluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlTXV0YWJsZVNvdXJjZShob29rLCBzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICBpZiAoIShyb290ICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBnZXRWZXJzaW9uID0gc291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5cbiAgdmFyIF9kaXNwYXRjaGVyJHVzZVN0YXRlID0gZGlzcGF0Y2hlci51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpO1xuICB9KSxcbiAgICAgIGN1cnJlbnRTbmFwc2hvdCA9IF9kaXNwYXRjaGVyJHVzZVN0YXRlWzBdLFxuICAgICAgc2V0U25hcHNob3QgPSBfZGlzcGF0Y2hlciR1c2VTdGF0ZVsxXTtcblxuICB2YXIgc25hcHNob3QgPSBjdXJyZW50U25hcHNob3Q7IC8vIEdyYWIgYSBoYW5kbGUgdG8gdGhlIHN0YXRlIGhvb2sgYXMgd2VsbC5cbiAgLy8gV2UgdXNlIGl0IHRvIGNsZWFyIHRoZSBwZW5kaW5nIHVwZGF0ZSBxdWV1ZSBpZiB3ZSBoYXZlIGEgbmV3IHNvdXJjZS5cblxuICB2YXIgc3RhdGVIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rO1xuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJlZnMgPSBtZW1vaXplZFN0YXRlLnJlZnM7XG4gIHZhciBwcmV2R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICB2YXIgcHJldlNvdXJjZSA9IG1lbW9pemVkU3RhdGUuc291cmNlO1xuICB2YXIgcHJldlN1YnNjcmliZSA9IG1lbW9pemVkU3RhdGUuc3Vic2NyaWJlO1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgcmVmczogcmVmcyxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZVxuICB9OyAvLyBTeW5jIHRoZSB2YWx1ZXMgbmVlZGVkIGJ5IG91ciBzdWJzY3JpcHRpb24gaGFuZGxlciBhZnRlciBlYWNoIGNvbW1pdC5cblxuICBkaXNwYXRjaGVyLnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcy5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBOb3JtYWxseSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24gZm9yIGEgc3RhdGUgaG9vayBuZXZlciBjaGFuZ2VzLFxuICAgIC8vIGJ1dCB0aGlzIGhvb2sgcmVjcmVhdGVzIHRoZSBxdWV1ZSBpbiBjZXJ0YWluIGNhc2VzICB0byBhdm9pZCB1cGRhdGVzIGZyb20gc3RhbGUgc291cmNlcy5cbiAgICAvLyBoYW5kbGVDaGFuZ2UoKSBiZWxvdyBuZWVkcyB0byByZWZlcmVuY2UgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpdGhvdXQgcmUtc3Vic2NyaWJpbmcsXG4gICAgLy8gc28gd2UgdXNlIGEgcmVmIHRvIGVuc3VyZSB0aGF0IGl0IGFsd2F5cyBoYXMgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXG4gICAgcmVmcy5zZXRTbmFwc2hvdCA9IHNldFNuYXBzaG90OyAvLyBDaGVjayBmb3IgYSBwb3NzaWJsZSBjaGFuZ2UgYmV0d2VlbiB3aGVuIHdlIGxhc3QgcmVuZGVyZWQgbm93LlxuXG4gICAgdmFyIG1heWJlTmV3VmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuXG4gICAgaWYgKCFvYmplY3RJcyh2ZXJzaW9uLCBtYXliZU5ld1ZlcnNpb24pKSB7XG4gICAgICB2YXIgbWF5YmVOZXdTbmFwc2hvdCA9IGdldFNuYXBzaG90KHNvdXJjZS5fc291cmNlKTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIG1heWJlTmV3U25hcHNob3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignTXV0YWJsZSBzb3VyY2Ugc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbiBhcyB0aGUgc25hcHNob3QgdmFsdWUuICcgKyAnRnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIG11dGFibGUgdmFsdWVzIGFuZCBjYXVzZSB0ZWFyaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0SXMoc25hcHNob3QsIG1heWJlTmV3U25hcHNob3QpKSB7XG4gICAgICAgIHNldFNuYXBzaG90KG1heWJlTmV3U25hcHNob3QpO1xuICAgICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgICAgbWFya1Jvb3RNdXRhYmxlUmVhZChyb290LCBsYW5lKTtcbiAgICAgIH0gLy8gSWYgdGhlIHNvdXJjZSBtdXRhdGVkIGJldHdlZW4gcmVuZGVyIGFuZCBub3csXG4gICAgICAvLyB0aGVyZSBtYXkgYmUgc3RhdGUgdXBkYXRlcyBhbHJlYWR5IHNjaGVkdWxlZCBmcm9tIHRoZSBvbGQgc291cmNlLlxuICAgICAgLy8gRW50YW5nbGUgdGhlIHVwZGF0ZXMgc28gdGhhdCB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC5cblxuXG4gICAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCByb290Lm11dGFibGVSZWFkTGFuZXMpO1xuICAgIH1cbiAgfSwgW2dldFNuYXBzaG90LCBzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiB3ZSBnb3QgYSBuZXcgc291cmNlIG9yIHN1YnNjcmliZSBmdW5jdGlvbiwgcmUtc3Vic2NyaWJlIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cbiAgZGlzcGF0Y2hlci51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICAgICAgdmFyIGxhdGVzdFNldFNuYXBzaG90ID0gcmVmcy5zZXRTbmFwc2hvdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGF0ZXN0U2V0U25hcHNob3QobGF0ZXN0R2V0U25hcHNob3Qoc291cmNlLl9zb3VyY2UpKTsgLy8gUmVjb3JkIGEgcGVuZGluZyBtdXRhYmxlIHNvdXJjZSB1cGRhdGUgd2l0aCB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuXG5cbiAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgICAgIG1hcmtSb290TXV0YWJsZVJlYWQocm9vdCwgbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBBIHNlbGVjdG9yIG1pZ2h0IHRocm93IGFmdGVyIGEgc291cmNlIG11dGF0aW9uLlxuICAgICAgICAvLyBlLmcuIGl0IG1pZ2h0IHRyeSB0byByZWFkIGZyb20gYSBwYXJ0IG9mIHRoZSBzdG9yZSB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgc3RpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHdpdGggUmVhY3QuXG4gICAgICAgIC8vIFdvcnN0IGNhc2UgdGhlIHNlbGVjdG9yIHdpbGwgdGhyb3cgYWdhaW4gYW5kIHRoZW4gYW4gZXJyb3IgYm91bmRhcnkgd2lsbCBoYW5kbGUgaXQuXG4gICAgICAgIGxhdGVzdFNldFNuYXBzaG90KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB1bnN1YnNjcmliZSA9IHN1YnNjcmliZShzb3VyY2UuX3NvdXJjZSwgaGFuZGxlQ2hhbmdlKTtcblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgdW5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ011dGFibGUgc291cmNlIHN1YnNjcmliZSBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gIH0sIFtzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiBhbnkgb2YgdGhlIGlucHV0cyB0byB1c2VNdXRhYmxlU291cmNlIGNoYW5nZSwgcmVhZGluZyBpcyBwb3RlbnRpYWxseSB1bnNhZmUuXG4gIC8vXG4gIC8vIElmIGVpdGhlciB0aGUgc291cmNlIG9yIHRoZSBzdWJzY3JpcHRpb24gaGF2ZSBjaGFuZ2VkIHdlIGNhbid0IGNhbid0IHRydXN0IHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIE1heWJlIHRoZSBzb3VyY2UgY2hhbmdlZCBpbiBhIHdheSB0aGF0IHRoZSBvbGQgc3Vic2NyaXB0aW9uIGlnbm9yZWQgYnV0IHRoZSBuZXcgb25lIGRlcGVuZHMgb24uXG4gIC8vXG4gIC8vIElmIHRoZSBnZXRTbmFwc2hvdCBmdW5jdGlvbiBjaGFuZ2VkLCB3ZSBhbHNvIHNob3VsZG4ndCByZWx5IG9uIHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgdW5kZXJseWluZyBzb3VyY2Ugd2FzIG11dGF0ZWQgYmV0d2VlbiB0aGUgd2hlbiB0aGUgbGFzdCBcImNoYW5nZVwiIGV2ZW50IGZpcmVkLFxuICAvLyBhbmQgd2hlbiB0aGUgY3VycmVudCByZW5kZXIgKHdpdGggdGhlIG5ldyBnZXRTbmFwc2hvdCBmdW5jdGlvbikgaXMgcHJvY2Vzc2VkLlxuICAvL1xuICAvLyBJbiBib3RoIGNhc2VzLCB3ZSBuZWVkIHRvIHRocm93IGF3YXkgcGVuZGluZyB1cGRhdGVzIChzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgcmVsZXZhbnQpXG4gIC8vIGFuZCB0cmVhdCByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBhcyB3ZSBkbyBpbiB0aGUgbW91bnQgY2FzZS5cblxuICBpZiAoIW9iamVjdElzKHByZXZHZXRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHx8ICFvYmplY3RJcyhwcmV2U291cmNlLCBzb3VyY2UpIHx8ICFvYmplY3RJcyhwcmV2U3Vic2NyaWJlLCBzdWJzY3JpYmUpKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHF1ZXVlIGFuZCBzZXRTdGF0ZSBtZXRob2QsXG4gICAgLy8gU28gaWYgdGhlcmUgYXJlIGludGVybGVhdmVkIHVwZGF0ZXMsIHRoZXkgZ2V0IHB1c2hlZCB0byB0aGUgb2xkZXIgcXVldWUuXG4gICAgLy8gV2hlbiB0aGlzIGJlY29tZXMgY3VycmVudCwgdGhlIHByZXZpb3VzIHF1ZXVlIGFuZCBkaXNwYXRjaCBtZXRob2Qgd2lsbCBiZSBkaXNjYXJkZWQsXG4gICAgLy8gaW5jbHVkaW5nIGFueSBpbnRlcmxlYXZpbmcgdXBkYXRlcyB0aGF0IG9jY3VyLlxuICAgIHZhciBuZXdRdWV1ZSA9IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IHNuYXBzaG90XG4gICAgfTtcbiAgICBuZXdRdWV1ZS5kaXNwYXRjaCA9IHNldFNuYXBzaG90ID0gZGlzcGF0Y2hBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBuZXdRdWV1ZSk7XG4gICAgc3RhdGVIb29rLnF1ZXVlID0gbmV3UXVldWU7XG4gICAgc3RhdGVIb29rLmJhc2VRdWV1ZSA9IG51bGw7XG4gICAgc25hcHNob3QgPSByZWFkRnJvbVVuc3ViY3JpYmVkTXV0YWJsZVNvdXJjZShyb290LCBzb3VyY2UsIGdldFNuYXBzaG90KTtcbiAgICBzdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXRlSG9vay5iYXNlU3RhdGUgPSBzbmFwc2hvdDtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICByZWZzOiB7XG4gICAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgICBzZXRTbmFwc2hvdDogbnVsbFxuICAgIH0sXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmVcbiAgfTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZWYgPSB7XG4gICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZik7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSByZWY7XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlIHwgUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSB8IFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZSh2YWx1ZSksXG4gICAgICBwcmV2VmFsdWUgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX21vdW50U3RhdGVbMV07XG5cbiAgbW91bnRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldFZhbHVlKHZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgcmV0dXJuIHByZXZWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIHByZXZWYWx1ZSA9IF91cGRhdGVTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX3VwZGF0ZVN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgcHJldlZhbHVlID0gX3JlcmVuZGVyU3RhdGVbMF0sXG4gICAgICBzZXRWYWx1ZSA9IF9yZXJlbmRlclN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2spIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gIHtcbiAgICBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsIDwgVXNlckJsb2NraW5nUHJpb3JpdHkkMiA/IFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgOiBwcmlvcml0eUxldmVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRQZW5kaW5nKHRydWUpO1xuICAgIH0pO1xuICAgIHJ1bldpdGhQcmlvcml0eSQxKHByaW9yaXR5TGV2ZWwgPiBOb3JtYWxQcmlvcml0eSQxID8gTm9ybWFsUHJpb3JpdHkkMSA6IHByaW9yaXR5TGV2ZWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUyID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZTJbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGUyWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgY2FuIGJlIHN0b3JlZCBvbiBhIHJlZiwgc2luY2UgYHNldFBlbmRpbmdgXG4gIC8vIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgbW91bnRSZWYoc3RhcnQpO1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlMiA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGUyWzBdO1xuXG4gIHZhciBzdGFydFJlZiA9IHVwZGF0ZVJlZigpO1xuICB2YXIgc3RhcnQgPSBzdGFydFJlZi5jdXJyZW50O1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZTIgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZTJbMF07XG5cbiAgdmFyIHN0YXJ0UmVmID0gdXBkYXRlUmVmKCk7XG4gIHZhciBzdGFydCA9IHN0YXJ0UmVmLmN1cnJlbnQ7XG4gIHJldHVybiBbc3RhcnQsIGlzUGVuZGluZ107XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25PcGFxdWVJZGVudGlmaWVyQWNjZXNzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFNob3VsZCB3YXJuIGluIGVmZmVjdHMgYW5kIGNhbGxiYWNrcywgdG9vXG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcblxuICAgIGlmIChnZXRJc1JlbmRlcmluZygpICYmICFkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdKSB7XG4gICAgICBlcnJvcignVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgJyArICdwYXNzZWQgdGhyb3VnaCB0byBhdHRyaWJ1dGVzIG9ubHkuIERvIG5vdCByZWFkIHRoZSAnICsgJ3ZhbHVlIGRpcmVjdGx5LicpO1xuXG4gICAgICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRPcGFxdWVJZGVudGlmaWVyKCkge1xuICB2YXIgbWFrZUlkID0gIG1ha2VDbGllbnRJZEluREVWLmJpbmQobnVsbCwgd2Fybk9uT3BhcXVlSWRlbnRpZmllckFjY2Vzc0luREVWLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSkpIDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciBkaWRVcGdyYWRlID0gZmFsc2U7XG4gICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcblxuICAgIHZhciByZWFkVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWRpZFVwZ3JhZGUpIHtcbiAgICAgICAgLy8gT25seSB1cGdyYWRlIG9uY2UuIFRoaXMgd29ya3MgZXZlbiBpbnNpZGUgdGhlIHJlbmRlciBwaGFzZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB1cGRhdGUgaXMgYWRkZWQgdG8gYSBzaGFyZWQgcXVldWUsIHdoaWNoIG91dGxhc3RzIHRoZVxuICAgICAgICAvLyBpbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgIGRpZFVwZ3JhZGUgPSB0cnVlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gdHJ1ZTtcbiAgICAgICAgICBzZXRJZChtYWtlSWQoKSk7XG4gICAgICAgICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICAgICAgICAgIHdhcm5Pbk9wYXF1ZUlkZW50aWZpZXJBY2Nlc3NJbkRFVihmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgcGFzc2VkIHRocm91Z2ggdG8gYXR0cmlidXRlcyBvbmx5LiBEbyBub3QgcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaWQgPSBtYWtlT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHJlYWRWYWx1ZSk7XG4gICAgdmFyIHNldElkID0gbW91bnRTdGF0ZShpZClbMV07XG5cbiAgICBpZiAoKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBVcGRhdGUgfCBQYXNzaXZlO1xuICAgICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0SWQobWFrZUlkKCkpO1xuICAgICAgfSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQ7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9pZCA9IG1ha2VJZCgpO1xuXG4gICAgbW91bnRTdGF0ZShfaWQpO1xuICAgIHJldHVybiBfaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpIHtcbiAgdmFyIGlkID0gdXBkYXRlU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlck9wYXF1ZUlkZW50aWZpZXIoKSB7XG4gIHZhciBpZCA9IHJlcmVuZGVyU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBlYWdlclJlZHVjZXI6IG51bGwsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gICAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5lYWdlclJlZHVjZXIgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gamVzdCBpc24ndCBhIGdsb2JhbCwgYW5kIGlzbid0IHJlY29nbml6ZWQgb3V0c2lkZSBvZiB0ZXN0c1xuICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgICB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpO1xuICAgICAgICB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5EZXYoZmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VPcGFxdWVJZGVudGlmaWVyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbiAgICB9LFxuICAgIHVzZU9wYXF1ZUlkZW50aWZpZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU9wYXF1ZUlkZW50aWZpZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKHR5cGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW1sYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgbmV4dFByb3BzLm1vZGUgPT09ICd1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZycpIHtcbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgd2Ugc2hvdWxkIGRvIGluIEJsb2NraW5nIG1vZGUuXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7IC8vIFdlJ3JlIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgd2UgbmVlZCB0byBwdXNoIHRoaXMgdG8gdGhlIHN0YWNrIGFueXdheVxuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlJ3JlIG5vdCBoaWRkZW4gYW55bW9yZSwgcmVzZXQgdGhlIHN0YXRlXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuLy8gb3Vyc2VsdmVzIHRvIHRoaXMgY29uc3RyYWludCwgdGhvdWdoLiBJZiB0aGUgYmVoYXZpb3IgZGl2ZXJnZXMsIHdlIHNob3VsZFxuLy8gZm9yayB0aGUgZnVuY3Rpb24uXG5cblxudmFyIHVwZGF0ZUxlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudDtcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuXG4gICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgY2xhc3MgY29tcG9uZW50IHdpdGhvdXQgYW4gaW5zdGFuY2Ugb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkXG4gICAgICAvLyBpbnNpZGUgYSBub24tY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG9cbiAgICAgIC8vIHRyZWF0IGl0IGxpa2UgYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICBpZiAoIShjdXJyZW50ICE9PSBudWxsICYmIHVwZGF0ZVF1ZXVlICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIklmIHRoZSByb290IGRvZXMgbm90IGhhdmUgYW4gdXBkYXRlUXVldWUsIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgYmFpbGVkIG91dC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmVsZW1lbnQgOiBudWxsO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290Lmh5ZHJhdGUgJiYgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBjdXJyZW50IGNoaWxkcmVuIHRoaXMgbWlnaHQgYmUgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gV2UgYWx3YXlzIHRyeSB0byBoeWRyYXRlLiBJZiB0aGlzIGlzbid0IGEgaHlkcmF0aW9uIHBhc3MgdGhlcmUgd29uJ3RcbiAgICAvLyBiZSBhbnkgY2hpbGRyZW4gdG8gaHlkcmF0ZSB3aGljaCBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSB0aGluZyBhc1xuICAgIC8vIG5vdCBoeWRyYXRpbmcuXG4gICAge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7XG5cbiAgICAgIGlmIChtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhW2ldO1xuICAgICAgICAgIHZhciB2ZXJzaW9uID0gbXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YVtpICsgMV07XG4gICAgICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHJlc2V0IGh5ZHJhdGlvbiBzdGF0ZSBpbiBjYXNlIHdlIGFib3J0ZWQgYW5kIHJlc3VtZWQgYW5vdGhlclxuICAgIC8vIHJvb3QuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQW4gaW5jb21wbGV0ZSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEFuIGluZGV0ZXJtaW5hdGUgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICBfY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcihcIlRoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gaGF2ZSBhIHJlbmRlciBtZXRob2QsIGJ1dCBkb2Vzbid0IGV4dGVuZCBSZWFjdC5Db21wb25lbnQuIFwiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICB7XG4gICAgLy8gU3VwcG9ydCBmb3IgbW9kdWxlIGNvbXBvbmVudHMgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVtb3ZlZCBiZWhpbmQgYSBmbGFnLlxuICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHByb3BzKTtcbiAgICB9XG5cbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSUQgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQm91bmRhcmllcyB3aXRob3V0IGZhbGxiYWNrcyBvciBzaG91bGQgYmUgYXZvaWRlZCBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2VcbiAgICAgIC8vIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAgaWYgKG5leHRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIG5leHRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSkge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICAvLyBCdXQgb25seSBpZiB0aGlzIGhhcyBhIGZhbGxiYWNrLlxuICAgIGlmIChuZXh0UHJvcHMuZmFsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3BzLnVuc3RhYmxlX2V4cGVjdGVkTG9hZFRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgQ1BVLWJvdW5kIHRyZWUuIFNraXAgdGhpcyB0cmVlIGFuZCBzaG93IGEgcGxhY2Vob2xkZXIgdG9cbiAgICAgIC8vIHVuYmxvY2sgdGhlIHN1cnJvdW5kaW5nIGNvbnRlbnQuIFRoZW4gaW1tZWRpYXRlbHkgcmV0cnkgYWZ0ZXIgdGhlXG4gICAgICAvLyBpbml0aWFsIGNvbW1pdC5cbiAgICAgIHZhciBfZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXMgdG9cbiAgICAgIC8vIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtcyBvZlxuICAgICAgLy8gcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLCBpdCdzXG4gICAgICAvLyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzIGNvbW1pdHRlZC4gSWZcbiAgICAgIC8vIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZSBwYWludGVkLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLiBXZSBjYW4gdXNlIGFueVxuICAgICAgLy8gUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmcgc2luY2Ugd2UncmUgbGVhdmluZ1xuICAgICAgLy8gaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9mYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBJZiB0aGUgY3VycmVudCBmaWJlciBoYXMgYSBTdXNwZW5zZVN0YXRlLCB0aGF0IG1lYW5zIGl0J3MgYWxyZWFkeSBzaG93aW5nXG4gICAgLy8gYSBmYWxsYmFjay5cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4yID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50My5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgcmV0dXJuIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4zID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdHJlZSBpcyBub3QgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2suXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIC8vIFRpbWVkIG91dC5cbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjQgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjQsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgX3ByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5tZW1vaXplZFN0YXRlID0gX3ByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKF9wcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpOyAvLyBTa2lwIHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBhbmQgY29udGludWUgd29ya2luZyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgdGltZWQgb3V0LiBDb250aW51ZSByZW5kZXJpbmcgdGhlIGNoaWxkcmVuLCBsaWtlIHdlXG4gICAgICAgIC8vIG5vcm1hbGx5IGRvLlxuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW41ID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ2ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuNSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0ID0gY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBCbG9ja2luZ01vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBlZmZlY3QgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LiBTbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiBEZWxldGlvbnMgYXJlIHN0b3JlZFxuICAgIC8vIG9uIHRoZSBzYW1lIGxpc3QgYXMgZWZmZWN0cy4gV2Ugd2FudCB0byBrZWVwIHRoZSBlZmZlY3RzIGZyb20gdGhlIHByaW1hcnlcbiAgICAvLyB0cmVlLiBTbyB3ZSBjb3B5IHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50J3MgZWZmZWN0IGxpc3QsIHdoaWNoIGRvZXMgbm90XG4gICAgLy8gaW5jbHVkZSB0aGUgZmFsbGJhY2sgZGVsZXRpb24gZWZmZWN0LlxuXG5cbiAgICB2YXIgcHJvZ3Jlc3NlZExhc3RFZmZlY3QgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKHByb2dyZXNzZWRMYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmZpcnN0RWZmZWN0O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IHByb2dyZXNzZWRMYXN0RWZmZWN0O1xuICAgICAgcHJvZ3Jlc3NlZExhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IFJlc2V0IHRoaXMgc29tZXdoZXJlIGVsc2U/IExvbCBsZWdhY3kgbW9kZSBpcyBzbyB3ZWlyZC5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTtcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCBsYXN0RWZmZWN0QmVmb3JlUmVuZGVyaW5nKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZSxcbiAgICAgIGxhc3RFZmZlY3Q6IGxhc3RFZmZlY3RCZWZvcmVSZW5kZXJpbmdcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbGFzdEVmZmVjdEJlZm9yZVJlbmRlcmluZztcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgbmV3VmFsdWUpO1xuXG4gIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkQml0cyA9IGNhbGN1bGF0ZUNoYW5nZWRCaXRzKGNvbnRleHQsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG5cbiAgICBpZiAoY2hhbmdlZEJpdHMgPT09IDApIHtcbiAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBjaGFuZ2VkQml0cywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQsIG5ld1Byb3BzLnVuc3RhYmxlX29ic2VydmVkQml0cyk7XG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuICAgIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBsYXN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0ICE9PSBudWxsKSB7XG4gICAgICBsYXN0Lm5leHRFZmZlY3QgPSBjdXJyZW50O1xuICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgY3VycmVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHVwZGF0ZUxhbmVzID0gd29ya0luUHJvZ3Jlc3MubGFuZXM7XG5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAgICAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gICAgICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cblxuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICB9IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG5cblxuICAgICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgdXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MyA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQzID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQzLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MywgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlTGVnYWN5SGlkZGVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uICh3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFmaWJlclJvb3QuaHlkcmF0ZSkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQuXG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi5cbiAgICAgICAgICAgIC8vIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvciB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbFxuICAgICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeSBiZSBlbXB0eSkuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgcHJldkRpZFRpbWVvdXQgPSBwcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgJiYgIXByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBzdWJ0cmVlZSBpcyBydW5uaW5nIGluIGJsb2NraW5nIG1vZGUgd2UgY2FuIHN1c3BlbmQsXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvbid0IHN1c3BlbmQuXG4gICAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBCbG9ja2luZ01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IE9ubHkgc2NoZWR1bGUgdXBkYXRlcyBpZiB0aGVzZSB2YWx1ZXMgYXJlIG5vbiBlcXVhbCwgaS5lLiBpdCBjaGFuZ2VkLlxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCB8fCBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhXG4gICAgICAgICAgICAvLyByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS4gVGhpcyBmbGFnIGlzIGFsc28gdXNlZCB0byBoaWRlIHRoZVxuICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbi4gSW4gbXV0YXRpb24gbW9kZSwgd2UgYWxzbyBuZWVkIHRoZSBmbGFnIHRvXG4gICAgICAgICAgICAvLyAqdW5oaWRlKiBjaGlsZHJlbiB0aGF0IHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHNvIGNoZWNrIGlmIHRoaXNcbiAgICAgICAgICAgIC8vIGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHRvby5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHBvcFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVubmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbm5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVubmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbm5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5uYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cblxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVubmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5uYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVubmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIHRoZSByb3cgd2UganVzdCByZW5kZXJlZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgd2UgcmVuZGVyZWQgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gY2hpbGQuIFRoZSBuZXN0ZWQgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGFwcGVuZGVkIHRoZW1zZWx2ZXMuXG4gICAgICAgICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZW1vdmUgYW55IGVmZmVjdHMgdGhhdCB3ZXJlIGFwcGVuZGVkIGFmdGVyIHRoaXMgcG9pbnQuXG5cbiAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IC8vIFdlJ3JlIGRvbmUuXG5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFya1NwYXduZWRXb3JrKFNvbWVSZXRyeUxhbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3Q7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgbmV3UHJvcHMubW9kZSAhPT0gJ3Vuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nJykge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKCEoKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlRoZSByb290IGZhaWxlZCB0byB1bm1vdW50IGFmdGVyIGFuIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspIHtcbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICBwb3BQcm92aWRlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lKHNvdXJjZS50eXBlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lKGJvdW5kYXJ5LnR5cGUpO1xuXG4gICAgICBpZiAoZXJyb3JCb3VuZGFyeU5hbWUpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTsgLy8gT25seSBsb2cgaGVyZSBpZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZFxuXG4gICAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UgdG8gXCJwaW5nXCIgdGhlIHJvb3QgYW5kIHJldHJ5LiBCdXQgb25seSBpZlxuICAvLyBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoXG4gIC8vIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7IC8vIEl0cyBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgc291cmNlRmliZXIuZmlyc3RFZmZlY3QgPSBzb3VyY2VGaWJlci5sYXN0RWZmZWN0ID0gbnVsbDtcblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcblxuICAgIGlmICgoc291cmNlRmliZXIubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIG1lbW9pemVkU3RhdGUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIHdlIGF0dGVtcHRlZFxuICAgICAgLy8gdG8gcmVuZGVyIGl0LlxuICAgICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzSW52aXNpYmxlUGFyZW50Qm91bmRhcnkgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpOyAvLyBTY2hlZHVsZSB0aGUgbmVhcmVzdCBTdXNwZW5zZSB0byByZS1yZW5kZXIgdGhlIHRpbWVkIG91dCB2aWV3LlxuXG4gICAgdmFyIF93b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShfd29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudEJvdW5kYXJ5KSkge1xuICAgICAgICAvLyBGb3VuZCB0aGUgbmVhcmVzdCBib3VuZGFyeS5cbiAgICAgICAgLy8gU3Rhc2ggdGhlIHByb21pc2Ugb24gdGhlIGJvdW5kYXJ5IGZpYmVyLiBJZiB0aGUgYm91bmRhcnkgdGltZXMgb3V0LCB3ZSdsbFxuICAgICAgICAvLyBhdHRhY2ggYW5vdGhlciBsaXN0ZW5lciB0byBmbGlwIHRoZSBib3VuZGFyeSBiYWNrIHRvIGl0cyBub3JtYWwgc3RhdGUuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSBfd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICAgICAgICB9IC8vIElmIHRoZSBib3VuZGFyeSBpcyBvdXRzaWRlIG9mIGJsb2NraW5nIG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgICAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAgICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIEluIHRoZSBjb21taXQgcGhhc2UsIHdlJ2xsIHNjaGVkdWxlIGFcbiAgICAgICAgLy8gc3Vic2VxdWVudCBzeW5jaHJvbm91cyB1cGRhdGUgdG8gcmUtcmVuZGVyIHRoZSBTdXNwZW5zZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgY29tcG9uZW50IHRoYXQgc3VzcGVuZGVkIHdhc1xuICAgICAgICAvLyBpbnNpZGUgYSBibG9ja2luZyBtb2RlIHRyZWUuIElmIHRoZSBTdXNwZW5zZSBpcyBvdXRzaWRlIG9mIGl0LCB3ZVxuICAgICAgICAvLyBzaG91bGQgKm5vdCogc3VzcGVuZCB0aGUgY29tbWl0LlxuXG5cbiAgICAgICAgaWYgKChfd29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpOyAvLyBFeGl0IHdpdGhvdXQgc3VzcGVuZGluZy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgICAgICAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAgICAgICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgICAgICAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgICAgICAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgICAgICAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgICAgICAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAgICAgICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgICAgICAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgICAgICAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgICAgICAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gICAgICAgIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAgICAgICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAgICAgICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgICAgICAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAgICAgICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAgICAgICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgICBfd29ya0luUHJvZ3Jlc3MgPSBfd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIH0gd2hpbGUgKF93b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7IC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gRmFsbHRocm91Z2ggdG8gZXJyb3IgbW9kZS5cbiAgICAvLyBUT0RPOiBVc2UgaW52YXJpYW50IHNvIHRoZSBtZXNzYWdlIGlzIHN0cmlwcGVkIGluIHByb2Q/XG5cblxuICAgIHZhbHVlID0gbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lKHNvdXJjZUZpYmVyLnR5cGUpIHx8ICdBIFJlYWN0IGNvbXBvbmVudCcpICsgJyBzdXNwZW5kZWQgd2hpbGUgcmVuZGVyaW5nLCBidXQgbm8gZmFsbGJhY2sgVUkgd2FzIHNwZWNpZmllZC5cXG4nICsgJ1xcbicgKyAnQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byAnICsgJ3Byb3ZpZGUgYSBsb2FkaW5nIGluZGljYXRvciBvciBwbGFjZWhvbGRlciB0byBkaXNwbGF5LicpO1xuICB9IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG5cbiAgcmVuZGVyRGlkRXJyb3IoKTtcbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlMiA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlMik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn1cblxudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyLCBudWxsLCBjdXJyZW50LCBpbnN0YW5jZSk7XG5cbiAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgdmFyIHVubW91bnRFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIHVubW91bnRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIHJlZiwgbnVsbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICB2YXIgcmVmRXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgcmVmRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSkge1xuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuXG4gICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25MaWZlQ3ljbGVzKGN1cnJlbnQsIGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBCbG9jazpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFNuYXBzaG90KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgU25hcHNob3QpIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KHRhZywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIHRhZykgPT09IHRhZykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudCh0YWcsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiB0YWcpID09PSB0YWcpIHtcbiAgICAgICAgLy8gTW91bnRcbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlIHVzZUVmZmVjdChhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArICd1c2VFZmZlY3QoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignQW4gZWZmZWN0IGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgIG5leHQgPSBfZWZmZWN0Lm5leHQsXG4gICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgIGlmICgodGFnICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxICYmICh0YWcgJiBIYXNFZmZlY3QpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdFVubW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0TW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBuZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lLCBmaW5pc2hlZFJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciBjdXJyZW50UmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKGN1cnJlbnRSZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRSZWYobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59IC8vIFVzZXItb3JpZ2luYXRpbmcgZXJyb3JzIChsaWZlY3ljbGVzIGFuZCByZWZzKSBzaG91bGQgbm90IGludGVycnVwdFxuLy8gZGVsZXRpb24sIHNvIGRvbid0IGxldCB0aGVtIHRocm93LiBIb3N0LW9yaWdpbmF0aW5nIGVycm9ycyBzaG91bGRcbi8vIGludGVycnVwdCBkZWxldGlvbiwgc28gaXQncyBva2F5XG5cblxuZnVuY3Rpb24gY29tbWl0VW5tb3VudChmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgb25Db21taXRVbm1vdW50KGN1cnJlbnQpO1xuXG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgQmxvY2s6XG4gICAgICB7XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICB2YXIgX2VmZmVjdDIgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdDIuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QyLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RVbm1vdW50KGN1cnJlbnQsIGVmZmVjdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyByZWN1cnNpdmUuXG4gICAgICAgIC8vIFdlIGFyZSBhbHNvIG5vdCB1c2luZyB0aGlzIHBhcmVudCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgd2lsbCBnZXQgcHVzaGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICB7XG4gICAgICAgICAgdW5tb3VudEhvc3RDb21wb25lbnRzKGZpbmlzaGVkUm9vdCwgY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmRhbWVudGFsQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgcm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBXaGlsZSB3ZSdyZSBpbnNpZGUgYSByZW1vdmVkIGhvc3Qgbm9kZSB3ZSBkb24ndCB3YW50IHRvIGNhbGxcbiAgLy8gcmVtb3ZlQ2hpbGQgb24gdGhlIGlubmVyIG5vZGVzIGJlY2F1c2UgdGhleSdyZSByZW1vdmVkIGJ5IHRoZSB0b3BcbiAgLy8gY2FsbCBhbnl3YXkuIFdlIGFsc28gd2FudCB0byBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50IG9uIGFsbFxuICAvLyBjb21wb3NpdGVzIGJlZm9yZSB0aGlzIGhvc3Qgbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZXJlZm9yZVxuICAvLyB3ZSBkbyBhbiBpbm5lciBsb29wIHdoaWxlIHdlJ3JlIHN0aWxsIGluc2lkZSB0aGUgaG9zdCBub2RlLlxuICB2YXIgbm9kZSA9IHJvb3Q7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb21taXRVbm1vdW50KGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIFZpc2l0IGNoaWxkcmVuIGJlY2F1c2UgdGhleSBtYXkgY29udGFpbiBtb3JlIGNvbXBvc2l0ZSBvciBob3N0IG5vZGVzLlxuICAgIC8vIFNraXAgcG9ydGFscyBiZWNhdXNlIGNvbW1pdFVubW91bnQoKSBjdXJyZW50bHkgdmlzaXRzIHRoZW0gcmVjdXJzaXZlbHkuXG5cbiAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCAmJiAoIC8vIElmIHdlIHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyB1c2luZyBjb21taXRVbm1vdW50IGFib3ZlLlxuICAgIC8vIElmIHdlIGRvbid0IHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyBoZXJlIGluc3RlYWQuXG4gICAgIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm9vdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVycyB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuIElkZWFsbHksIHdlXG4gIC8vIHNob3VsZCBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLiBUaGlzIGNoaWxkXG4gIC8vIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vIE5vdGU6IHdlIGNhbm5vdCBudWxsIG91dCBzaWJsaW5nIGhlcmUsIG90aGVyd2lzZSBpdCBjYW4gY2F1c2UgaXNzdWVzXG4gIC8vIHdpdGggZmluZERPTU5vZGUgYW5kIGhvdyBpdCByZXF1aXJlcyB0aGUgc2libGluZyBmaWVsZCB0byBjYXJyeSBvdXRcbiAgLy8gdHJhdmVyc2FsIGluIGEgbGF0ZXIgZWZmZWN0LiBTZWUgUFIgIzE2ODIwLiBXZSBub3cgY2xlYXIgdGhlIHNpYmxpbmdcbiAgLy8gZmllbGQgYWZ0ZXIgZWZmZWN0cywgc2VlOiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cy5cbiAgLy9cbiAgLy8gRG9uJ3QgZGlzY29ubmVjdCBzdGF0ZU5vZGUgbm93OyBpdCB3aWxsIGJlIGRldGFjaGVkIGluIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzLlxuICAvLyBJdCBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGFuIGVycm9yIGJvdW5kYXJ5LFxuICAvLyBhbmQgb25lIG9mIGl0cyBkZXNjZW5kYW50cyB0aHJvd3Mgd2hpbGUgdW5tb3VudGluZyBhIHBhc3NpdmUgZWZmZWN0LlxuICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICBmaWJlci5jaGlsZCA9IG51bGw7XG4gIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIGZpYmVyLmZpcnN0RWZmZWN0ID0gbnVsbDtcbiAgZmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgdmFyIHBhcmVudDtcbiAgdmFyIGlzQ29udGFpbmVyO1xuICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcGFyZW50ID0gcGFyZW50U3RhdGVOb2RlO1xuICAgICAgaXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgaXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgIGlzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cblxuICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgfVxuXG4gIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICBpZiAoaXNDb250YWluZXIpIHtcbiAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICB9IGVsc2Uge1xuICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QgfHwgZW5hYmxlRnVuZGFtZW50YWxBUEkgKSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IGlzSG9zdCA/IG5vZGUuc3RhdGVOb2RlIDogbm9kZS5zdGF0ZU5vZGUuaW5zdGFuY2U7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCB8fCBlbmFibGVGdW5kYW1lbnRhbEFQSSApIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gaXNIb3N0ID8gbm9kZS5zdGF0ZU5vZGUgOiBub2RlLnN0YXRlTm9kZS5pbnN0YW5jZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVubW91bnRIb3N0Q29tcG9uZW50cyhmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgdmFyIG5vZGUgPSBjdXJyZW50OyAvLyBFYWNoIGl0ZXJhdGlvbiwgY3VycmVudFBhcmVudCBpcyBwb3B1bGF0ZWQgd2l0aCBub2RlJ3MgaG9zdCBwYXJlbnQgaWYgbm90XG4gIC8vIGN1cnJlbnRQYXJlbnRJc1ZhbGlkLlxuXG4gIHZhciBjdXJyZW50UGFyZW50SXNWYWxpZCA9IGZhbHNlOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICB2YXIgY3VycmVudFBhcmVudDtcbiAgdmFyIGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmICghY3VycmVudFBhcmVudElzVmFsaWQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLnJldHVybjtcblxuICAgICAgZmluZFBhcmVudDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKCEocGFyZW50ICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGU7XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcGFyZW50U3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcblxuICAgICAgICB9XG5cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIEFmdGVyIGFsbCB0aGUgY2hpbGRyZW4gaGF2ZSB1bm1vdW50ZWQsIGl0IGlzIG5vdyBzYWZlIHRvIHJlbW92ZSB0aGVcbiAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cblxuICAgICAgaWYgKGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGQoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSAvLyBEb24ndCB2aXNpdCBjaGlsZHJlbiBiZWNhdXNlIHdlIGFscmVhZHkgdmlzaXRlZCB0aGVtLlxuXG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgIC8vIFdlIHdpbGwgcmVhc3NpZ24gaXQgYmFjayB3aGVuIHdlIHBvcCB0aGUgcG9ydGFsIG9uIHRoZSB3YXkgdXAuXG4gICAgICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlOyAvLyBWaXNpdCBjaGlsZHJlbiBiZWNhdXNlIHBvcnRhbHMgbWlnaHQgY29udGFpbiBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFVubW91bnQoZmluaXNoZWRSb290LCBub2RlKTsgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSB3ZSBtYXkgZmluZCBtb3JlIGhvc3QgY29tcG9uZW50cyBiZWxvdy5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBXaGVuIHdlIGdvIG91dCBvZiB0aGUgcG9ydGFsLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga2VlcCBhIHN0YWNrIG9mIHRoZW0sIHdlIHdpbGwgc2VhcmNoIGZvciBpdC5cbiAgICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQuXG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICB1bm1vdW50SG9zdENvbXBvbmVudHMoZmluaXNoZWRSb290LCBjdXJyZW50KTtcbiAgfVxuXG4gIHZhciBhbHRlcm5hdGUgPSBjdXJyZW50LmFsdGVybmF0ZTtcbiAgZGV0YWNoRmliZXJNdXRhdGlvbihjdXJyZW50KTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZGV0YWNoRmliZXJNdXRhdGlvbihhbHRlcm5hdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFdvcmsoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21taXRVcGRhdGUoaW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3Jvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKF9yb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgaHlkcmF0ZWQuIE5vIG5lZWQgdG8gaHlkcmF0ZSBhZ2Fpbi5cbiAgICAgICAgICAgIF9yb290Lmh5ZHJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKF9yb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlQ29tcG9uZW50KGZpbmlzaGVkV29yayk7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuZGFtZW50YWxDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNvbXBvbmVudChmaW5pc2hlZFdvcmspIHtcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlICE9PSBudWxsKSB7XG4gICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG5cbiAgICB7XG4gICAgICAvLyBIaWRlIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkgY2hpbGRyZW4uIFRPRE86XG4gICAgICAvLyBJZGVhbGx5LCB0aGlzIGVmZmVjdCB3b3VsZCBoYXZlIGJlZW4gc2NoZWR1bGVkIG9uIHRoZSBPZmZzY3JlZW4gZmliZXJcbiAgICAgIC8vIGl0c2VsZi4gVGhhdCdzIGhvdyB1bmhpZGluZyB3b3JrczogdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc2NoZWR1bGVzIGFuXG4gICAgICAvLyBlZmZlY3Qgb24gaXRzZWxmLiBIb3dldmVyLCBpbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgZGlkbid0IGNvbXBsZXRlLFxuICAgICAgLy8gc28gdGhlIGZpYmVyIHdhcyBuZXZlciBhZGRlZCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIG5vcm1hbCBwYXRoLiBXZVxuICAgICAgLy8gY291bGQgaGF2ZSBhcHBlbmRlZCBpdCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIFN1c3BlbnNlIGNvbXBvbmVudCdzXG4gICAgICAvLyBzZWNvbmQgcGFzcywgYnV0IGRvaW5nIGl0IHRoaXMgd2F5IGlzIGxlc3MgY29tcGxpY2F0ZWQuIFRoaXMgd291bGQgYmVcbiAgICAgIC8vIHNpbXBsZXIgaWYgd2UgZ290IHJpZCBvZiB0aGUgZWZmZWN0IGxpc3QgYW5kIHRyYXZlcnNlZCB0aGUgdHJlZSwgbGlrZVxuICAgICAgLy8gd2UncmUgcGxhbm5pbmcgdG8gZG8uXG4gICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ocHJpbWFyeUNoaWxkUGFyZW50LCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod2FrZWFibGUuX19yZWFjdERvTm90VHJhY2VJbnRlcmFjdGlvbnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHJ5ID0gdHJhY2luZy51bnN0YWJsZV93cmFwKHJldHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbi8vIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGJvdW5kYXJ5IGlzIGFscmVhZHkgaGlkZGVuLlxuLy8gVE9ETzogVXNlIGFuIGVmZmVjdCB0YWcuXG5cblxuZnVuY3Rpb24gaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKG9sZFN0YXRlID09PSBudWxsIHx8IG9sZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIG5ld1N0YXRlICE9PSBudWxsICYmIG5ld1N0YXRlLmRlaHlkcmF0ZWQgPT09IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb21taXRSZXNldFRleHRDb250ZW50KGN1cnJlbnQpIHtcblxuICByZXNldFRleHRDb250ZW50KGN1cnJlbnQuc3RhdGVOb2RlKTtcbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciQxID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IkMSgnc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIElzU29tZVJlbmRlcmVyQWN0aW5nID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSXNTb21lUmVuZGVyZXJBY3Rpbmc7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgRXZlbnRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBEaXNjcmV0ZUV2ZW50Q29udGV4dCA9XG4vKiAgICAgICAgICovXG40O1xudmFyIExlZ2FjeVVuYmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgKi9cbjg7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgUmV0cnlBZnRlckVycm9yID1cbi8qICAgICAgICovXG42NDtcbnZhciBSb290SW5jb21wbGV0ZSA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5jb21wbGV0ZTsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgcGluZ2VkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xudmFyIG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID0gTm9Qcmlvcml0eSQxO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xudmFyIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsgLy8gTWFya3MgdGhlIG5lZWQgdG8gcmVzY2hlZHVsZSBwZW5kaW5nIGludGVyYWN0aW9ucyBhdCB0aGVzZSBsYW5lc1xuLy8gZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIHRyYWNlZCBhY3Jvc3MgY29tcG9uZW50c1xuLy8gdGhhdCBzcGF3biBuZXcgd29yayBkdXJpbmcgcmVuZGVyLiBFLmcuIGhpZGRlbiBib3VuZGFyaWVzLCBzdXNwZW5kZWQgU1NSXG4vLyBoeWRyYXRpb24gb3IgU3VzcGVuc2VMaXN0LlxuLy8gVE9ETzogQ2FuIHVzZSBhIGJpdG1hc2sgaW5zdGVhZCBvZiBhbiBhcnJheVxuXG52YXIgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbnZhciBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgPSBOb0xhbmVzOyAvLyBEZXYgb25seSBmbGFnIHRoYXQgdHJhY2tzIGlmIHBhc3NpdmUgZWZmZWN0cyBhcmUgY3VycmVudGx5IGJlaW5nIGZsdXNoZWQuXG4vLyBXZSB3YXJuIGFib3V0IHN0YXRlIHVwZGF0ZXMgZm9yIHVubW91bnRlZCBjb21wb25lbnRzIGRpZmZlcmVudGx5IGluIHRoaXMgY2FzZS5cblxudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZSBpbnB1dHNcbiAgLy8gdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLiBGb3IgZXhhbXBsZSwgd2UgdXNlIHRoZSBgcmVuZGVyTGFuZXNgXG4gIC8vIHRvIGF2b2lkIGNob29zaW5nIGEgbGFuZSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuXG4gIC8vXG4gIC8vIEhvd2V2ZXIsIHRoZSBcImluY2x1ZGVkXCIgbGFuZXMgY291bGQgYmUgbXV0YXRlZCBpbiBiZXR3ZWVuIHVwZGF0ZXMgaW4gdGhlXG4gIC8vIHNhbWUgZXZlbnQsIGxpa2UgaWYgeW91IHBlcmZvcm0gYW4gdXBkYXRlIGluc2lkZSBgZmx1c2hTeW5jYC4gT3IgYW55IG90aGVyXG4gIC8vIGNvZGUgcGF0aCB0aGF0IG1pZ2h0IGNhbGwgYHByZXBhcmVGcmVzaFN0YWNrYC5cbiAgLy9cbiAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzIG92ZXIuXG4gIC8vIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cbiAgLy9cbiAgLy8gV2UnbGwgZG8gdGhlIHNhbWUgZm9yIGBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXNgIGJlbG93LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmIChjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGN1cnJlbnRFdmVudFBlbmRpbmdMYW5lcyA9IG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ICE9PSBudWxsID8gbW9zdFJlY2VudGx5VXBkYXRlZFJvb3QucGVuZGluZ0xhbmVzIDogTm9MYW5lcztcbiAgICB9XG5cbiAgICByZXR1cm4gZmluZFRyYW5zaXRpb25MYW5lKGN1cnJlbnRFdmVudFdpcExhbmVzLCBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMpO1xuICB9IC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlcGVuZGVuY3kgb24gdGhlIFNjaGVkdWxlciBwcmlvcml0eS5cbiAgLy8gVG8gZG8gdGhhdCwgd2UncmUgcmVwbGFjaW5nIGl0IHdpdGggYW4gdXBkYXRlIGxhbmUgcHJpb3JpdHkuXG5cblxuICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpOyAvLyBUaGUgb2xkIGJlaGF2aW9yIHdhcyB1c2luZyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIFNjaGVkdWxlci5cbiAgLy8gVGhpcyBjb3VwbGVzIFJlYWN0IHRvIHRoZSBTY2hlZHVsZXIgaW50ZXJuYWxzLCBzbyB3ZSdyZSByZXBsYWNpbmcgaXRcbiAgLy8gd2l0aCB0aGUgY3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eSBhYm92ZS4gQXMgYW4gZXhhbXBsZSBvZiBob3cgdGhpc1xuICAvLyBjb3VsZCBiZSBwcm9ibGVtYXRpYywgaWYgd2UncmUgbm90IGluc2lkZSBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsXG4gIC8vIHRoZW4gd2UnbGwgZ2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBydW5uaW5nIFNjaGVkdWxlciB0YXNrLFxuICAvLyB3aGljaCBpcyBwcm9iYWJseSBub3Qgd2hhdCB3ZSB3YW50LlxuXG4gIHZhciBsYW5lO1xuXG4gIGlmICggLy8gVE9ETzogVGVtcG9yYXJ5LiBXZSdyZSByZW1vdmluZyB0aGUgY29uY2VwdCBvZiBkaXNjcmV0ZSB1cGRhdGVzLlxuICAoZXhlY3V0aW9uQ29udGV4dCAmIERpc2NyZXRlRXZlbnRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHNjaGVkdWxlclByaW9yaXR5ID09PSBVc2VyQmxvY2tpbmdQcmlvcml0eSQyKSB7XG4gICAgbGFuZSA9IGZpbmRVcGRhdGVMYW5lKElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHksIGN1cnJlbnRFdmVudFdpcExhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyTGFuZVByaW9yaXR5ID0gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eSk7XG5cbiAgICBsYW5lID0gZmluZFVwZGF0ZUxhbmUoc2NoZWR1bGVyTGFuZVByaW9yaXR5LCBjdXJyZW50RXZlbnRXaXBMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBTZWUgYHJlcXVlc3RVcGRhdGVMYW5lYCBmb3IgZXhwbGFuYXRpb24gb2YgYGN1cnJlbnRFdmVudFdpcExhbmVzYFxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRSZXRyeUxhbmUoY3VycmVudEV2ZW50V2lwTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcbiAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpO1xuICB2YXIgcm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiByZXF1ZXN0VXBkYXRlTGFuZVByaW9yaXR5IGFsc28gcmVhZHMgdGhlIHByaW9yaXR5LiBQYXNzIHRoZVxuICAvLyBwcmlvcml0eSBhcyBhbiBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzIG9uZS5cblxuXG4gIHZhciBwcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICBpZiAobGFuZSA9PT0gU3luY0xhbmUpIHtcbiAgICBpZiAoIC8vIENoZWNrIGlmIHdlJ3JlIGluc2lkZSB1bmJhdGNoZWRVcGRhdGVzXG4gICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBMZWdhY3lVbmJhdGNoZWRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIC8vIENoZWNrIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gUmVnaXN0ZXIgcGVuZGluZyBpbnRlcmFjdGlvbnMgb24gdGhlIHJvb3QgdG8gYXZvaWQgbG9zaW5nIHRyYWNlZCBpbnRlcmFjdGlvbiBkYXRhLlxuICAgICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmUpOyAvLyBUaGlzIGlzIGEgbGVnYWN5IGVkZ2UgY2FzZS4gVGhlIGluaXRpYWwgbW91bnQgb2YgYSBSZWFjdERPTS5yZW5kZXItZWRcbiAgICAgIC8vIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzIHNob3VsZCBiZSBzeW5jaHJvbm91cywgYnV0IGxheW91dCB1cGRhdGVzXG4gICAgICAvLyBzaG91bGQgYmUgZGVmZXJyZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmF0Y2guXG5cbiAgICAgIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNjaGVkdWxlIGEgZGlzY3JldGUgdXBkYXRlIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IFN5bmMuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgRGlzY3JldGVFdmVudENvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgKCAvLyBPbmx5IHVwZGF0ZXMgYXQgdXNlci1ibG9ja2luZyBwcmlvcml0eSBvciBncmVhdGVyIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gZGlzY3JldGUsIGV2ZW4gaW5zaWRlIGEgZGlzY3JldGUgZXZlbnQuXG4gICAgcHJpb3JpdHlMZXZlbCA9PT0gVXNlckJsb2NraW5nUHJpb3JpdHkkMiB8fCBwcmlvcml0eUxldmVsID09PSBJbW1lZGlhdGVQcmlvcml0eSQxKSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgZXZlbnQuIFRyYWNrIHRoZSBsb3dlc3QgcHJpb3JpdHlcbiAgICAgIC8vIGRpc2NyZXRlIHVwZGF0ZSBwZXIgcm9vdCBzbyB3ZSBjYW4gZmx1c2ggdGhlbSBlYXJseSwgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG5ldyBTZXQoW3Jvb3RdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuYWRkKHJvb3QpO1xuICAgICAgfVxuICAgIH0gLy8gU2NoZWR1bGUgb3RoZXIgdXBkYXRlcyBhZnRlciBpbiBjYXNlIHRoZSBjYWxsYmFjayBpcyBzeW5jLlxuXG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG4gIH0gLy8gV2UgdXNlIHRoaXMgd2hlbiBhc3NpZ25pbmcgYSBsYW5lIGZvciBhIHRyYW5zaXRpb24gaW5zaWRlXG4gIC8vIGByZXF1ZXN0VXBkYXRlTGFuZWAuIFdlIGFzc3VtZSBpdCdzIHRoZSBzYW1lIGFzIHRoZSByb290IGJlaW5nIHVwZGF0ZWQsXG4gIC8vIHNpbmNlIGluIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZSByb290IGFwcCBpdCBwcm9iYWJseSBpcy4gSWYgaXQncyBub3RcbiAgLy8gdGhlIHNhbWUgcm9vdCwgdGhlbiBpdCdzIG5vdCBhIGh1Z2UgZGVhbCwgd2UganVzdCBtaWdodCBiYXRjaCBtb3JlIHN0dWZmXG4gIC8vIHRvZ2V0aGVyIG1vcmUgdGhhbiBuZWNlc3NhcnkuXG5cblxuICBtb3N0UmVjZW50bHlVcGRhdGVkUm9vdCA9IHJvb3Q7XG59IC8vIFRoaXMgaXMgc3BsaXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIHdlIGNhbiBtYXJrIGEgZmliZXIgd2l0aCBwZW5kaW5nXG4vLyB3b3JrIHdpdGhvdXQgdHJlYXRpbmcgaXQgYXMgYSB0eXBpY2FsIHVwZGF0ZSB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBhbiBldmVudDtcbi8vIGUuZy4gcmV0cnlpbmcgYSBTdXNwZW5zZSBib3VuZGFyeSBpc24ndCBhbiB1cGRhdGUsIGJ1dCBpdCBkb2VzIHNjaGVkdWxlIHdvcmtcbi8vIG9uIGEgZmliZXIuXG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgZXhwaXJhdGlvbiB0aW1lLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpOyAvLyBUaGlzIHJldHVybnMgdGhlIHByaW9yaXR5IGxldmVsIGNvbXB1dGVkIGR1cmluZyB0aGUgYGdldE5leHRMYW5lc2AgY2FsbC5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IHJldHVybk5leHRMYW5lc1ByaW9yaXR5KCk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayhleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5KSB7XG4gICAgICAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoZSBwcmlvcml0eSBjaGFuZ2VkLiBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ld1xuICAgIC8vIG9uZSBiZWxvdy5cblxuXG4gICAgY2FuY2VsQ2FsbGJhY2soZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmVQcmlvcml0eSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfSBlbHNlIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSkge1xuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgcGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gbGFuZVByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShuZXdDYWxsYmFja1ByaW9yaXR5KTtcbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QpIHtcbiAgLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudEV2ZW50UGVuZGluZ0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGV4cGlyYXRpb24gdGltZSB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcyk7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgIC8vIFRoZSByZW5kZXIgaW5jbHVkZWQgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHdoZW4gdW5oaWRpbmcgYSBoaWRkZW4gdHJlZSwgd2UgaW5jbHVkZSBhbGwgdGhlIGxhbmVzXG4gICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgLy8gbGFuZXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCByZW5kZXJpbmcgd2l0aC5cbiAgICAvL1xuICAgIC8vIFNvIHdlJ2xsIHRocm93IG91dCB0aGUgY3VycmVudCB3b3JrIGFuZCByZXN0YXJ0LlxuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICB9IGVsc2UgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAgIC8vIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuXG4gICAgICBpZiAocm9vdC5oeWRyYXRlKSB7XG4gICAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgfSAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG5cblxuICAgICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluY29tcGxldGU6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcm9vdCBleGl0IHN0YXR1cy5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLlwiICk7XG4gICAgfVxuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXM7XG4gIHZhciBleGl0U3RhdHVzO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiYgaW5jbHVkZXNTb21lTGFuZShyb290LmV4cGlyZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpKSB7XG4gICAgLy8gVGhlcmUncyBhIHBhcnRpYWwgdHJlZSwgYW5kIGF0IGxlYXN0IG9uZSBvZiBpdHMgbGFuZXMgaGFzIGV4cGlyZWQuIEZpbmlzaFxuICAgIC8vIHJlbmRlcmluZyBpdCBiZWZvcmUgcmVuZGVyaW5nIHRoZSByZXN0IG9mIHRoZSBleHBpcmVkIHdvcmsuXG4gICAgbGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gICAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgICAgLy8gVGhlIHJlbmRlciBpbmNsdWRlZCBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIC8vIEZvciBleGFtcGxlLCB3aGVuIHVuaGlkaW5nIGEgaGlkZGVuIHRyZWUsIHdlIGluY2x1ZGUgYWxsIHRoZSBsYW5lc1xuICAgICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgICAvLyBsYW5lcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHJlbmRlcmluZyB3aXRoLlxuICAgICAgLy9cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIHBhcnQgb2YgdGhlIHRyZWUgaXMgcmVuZGVyZWRcbiAgICAgIC8vIGNvbmN1cnJlbnRseS4gSWYgdGhlIHdob2xlIHRyZWUgaXMgcmVuZGVyZWQgc3luY2hyb25vdXNseSwgdGhlbiB0aGVyZVxuICAgICAgLy8gYXJlIG5vIGludGVybGVhdmVkIGV2ZW50cy5cbiAgICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIGxhbmVzKTtcbiAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gIH1cblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAvLyBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cblxuICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9IC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cblxuXG4gICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmbHVzaERpc2NyZXRlVXBkYXRlcygpIHtcbiAgLy8gVE9ETzogU2hvdWxkIGJlIGFibGUgdG8gZmx1c2ggaW5zaWRlIGJhdGNoZWRVcGRhdGVzLCBidXQgbm90IGluc2lkZSBgYWN0YC5cbiAgLy8gSG93ZXZlciwgYGFjdGAgdXNlcyBgYmF0Y2hlZFVwZGF0ZXNgLCBzbyB0aGVyZSdzIG5vIHdheSB0byBkaXN0aW5ndWlzaFxuICAvLyB0aG9zZSB0d28gY2FzZXMuIE5lZWQgdG8gZml4IHRoaXMgYmVmb3JlIGV4cG9zaW5nIGZsdXNoRGlzY3JldGVVcGRhdGVzXG4gIC8vIGFzIGEgcHVibGljIEFQSS5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKEJhdGNoZWRDb250ZXh0IHwgUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgICBlcnJvcigndW5zdGFibGVfZmx1c2hEaXNjcmV0ZVVwZGF0ZXM6IENhbm5vdCBmbHVzaCB1cGRhdGVzIHdoZW4gUmVhY3QgaXMgJyArICdhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFdlJ3JlIGFscmVhZHkgcmVuZGVyaW5nLCBzbyB3ZSBjYW4ndCBzeW5jaHJvbm91c2x5IGZsdXNoIHBlbmRpbmcgd29yay5cbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmVzdGVkIGV2ZW50IGRpc3BhdGNoIHRyaWdnZXJlZCBieSBhIGxpZmVjeWNsZS9lZmZlY3QsXG4gICAgLy8gbGlrZSBgZWwuZm9jdXMoKWAuIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZsdXNoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcygpOyAvLyBJZiB0aGUgZGlzY3JldGUgdXBkYXRlcyBzY2hlZHVsZWQgcGFzc2l2ZSBlZmZlY3RzLCBmbHVzaCB0aGVtIG5vdyBzbyB0aGF0XG4gIC8vIHRoZXkgZmlyZSBiZWZvcmUgdGhlIG5leHQgc2VyaWFsIGV2ZW50LlxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbn1cblxuZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGlzY3JldGVVcGRhdGVzKCkge1xuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIC8vIEZvciBlYWNoIHJvb3Qgd2l0aCBwZW5kaW5nIGRpc2NyZXRlIHVwZGF0ZXMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG9cbiAgICAvLyBpbW1lZGlhdGVseSBmbHVzaCB0aGVtLlxuICAgIHZhciByb290cyA9IHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXM7XG4gICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG51bGw7XG4gICAgcm9vdHMuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIH0pO1xuICB9IC8vIE5vdyBmbHVzaCB0aGUgaW1tZWRpYXRlIHF1ZXVlLlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaFxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZEV2ZW50VXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRXZlbnRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyQxKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRGlzY3JldGVFdmVudENvbnRleHQ7XG5cbiAge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcnVuV2l0aFByaW9yaXR5JDEoVXNlckJsb2NraW5nUHJpb3JpdHkkMiwgZm4uYmluZChudWxsLCBhLCBiLCBjLCBkKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoXG4gICAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5iYXRjaGVkVXBkYXRlcyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0ICY9IH5CYXRjaGVkQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBMZWdhY3lVbmJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luYyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gIGlmICgocHJldkV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oYSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShJbW1lZGlhdGVQcmlvcml0eSQxLCBmbi5iaW5kKG51bGwsIGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgICAvLyB0aGUgc3RhY2suXG5cbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluY29tcGxldGU7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAge1xuICAgIHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gcHVzaEludGVyYWN0aW9ucyhyb290KSB7XG4gIHtcbiAgICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zO1xuICAgIHJldHVybiBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcEludGVyYWN0aW9ucyhwcmV2SW50ZXJhY3Rpb25zKSB7XG4gIHtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5jb21wbGV0ZSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGUgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdENvbXBsZXRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gICAgc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gcHVzaEludGVyYWN0aW9ucyhyb290KTtcblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICAgIHN0YXJ0V29ya09uUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHB1c2hJbnRlcmFjdGlvbnMocm9vdCk7XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcblxuICB7XG4gICAgcG9wSW50ZXJhY3Rpb25zKHByZXZJbnRlcmFjdGlvbnMpO1xuICB9XG5cbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuXG4gICAgcmV0dXJuIFJvb3RJbmNvbXBsZXRlO1xuICB9IGVsc2Uge1xuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNldENoaWxkTGFuZXMoY29tcGxldGVkV29yayk7XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCAmJiAvLyBEbyBub3QgYXBwZW5kIGVmZmVjdHMgdG8gcGFyZW50cyBpZiBhIHNpYmxpbmcgZmFpbGVkIHRvIGNvbXBsZXRlXG4gICAgICAocmV0dXJuRmliZXIuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBBcHBlbmQgYWxsIHRoZSBlZmZlY3RzIG9mIHRoZSBzdWJ0cmVlIGFuZCB0aGlzIGZpYmVyIG9udG8gdGhlIGVmZmVjdFxuICAgICAgICAvLyBsaXN0IG9mIHRoZSBwYXJlbnQuIFRoZSBjb21wbGV0aW9uIG9yZGVyIG9mIHRoZSBjaGlsZHJlbiBhZmZlY3RzIHRoZVxuICAgICAgICAvLyBzaWRlLWVmZmVjdCBvcmRlci5cbiAgICAgICAgaWYgKHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdvcmsubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmxhc3RFZmZlY3Q7XG4gICAgICAgIH0gLy8gSWYgdGhpcyBmaWJlciBoYWQgc2lkZS1lZmZlY3RzLCB3ZSBhcHBlbmQgaXQgQUZURVIgdGhlIGNoaWxkcmVuJ3NcbiAgICAgICAgLy8gc2lkZS1lZmZlY3RzLiBXZSBjYW4gcGVyZm9ybSBjZXJ0YWluIHNpZGUtZWZmZWN0cyBlYXJsaWVyIGlmIG5lZWRlZCxcbiAgICAgICAgLy8gYnkgZG9pbmcgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIGVmZmVjdCBsaXN0LiBXZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIHNjaGVkdWxlIG91ciBvd24gc2lkZS1lZmZlY3Qgb24gb3VyIG93biBsaXN0IGJlY2F1c2UgaWYgZW5kIHVwXG4gICAgICAgIC8vIHJldXNpbmcgY2hpbGRyZW4gd2UnbGwgc2NoZWR1bGUgdGhpcyBlZmZlY3Qgb250byBpdHNlbGYgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gYXQgdGhlIGVuZC5cblxuXG4gICAgICAgIHZhciBmbGFncyA9IGNvbXBsZXRlZFdvcmsuZmxhZ3M7IC8vIFNraXAgYm90aCBOb1dvcmsgYW5kIFBlcmZvcm1lZFdvcmsgdGFncyB3aGVuIGNyZWF0aW5nIHRoZSBlZmZlY3RcbiAgICAgICAgLy8gbGlzdC4gUGVyZm9ybWVkV29yayBlZmZlY3QgaXMgcmVhZCBieSBSZWFjdCBEZXZUb29scyBidXQgc2hvdWxkbid0IGJlXG4gICAgICAgIC8vIGNvbW1pdHRlZC5cblxuICAgICAgICBpZiAoZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZpYmVyLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBleHBpcmF0aW9uIHRpbWUuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgZWZmZWN0IGxpc3QuXG4gICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDaGlsZExhbmVzKGNvbXBsZXRlZFdvcmspIHtcbiAgaWYgKCAvLyBUT0RPOiBNb3ZlIHRoaXMgY2hlY2sgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBtb3ZpbmcgYHJlc2V0Q2hpbGRMYW5lc2BcbiAgLy8gdG8gc3dpdGNoIHN0YXRlbWVudCBpbiBgY29tcGxldGVXb3JrYC5cbiAgKGNvbXBsZXRlZFdvcmsudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQgfHwgY29tcGxldGVkV29yay50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkgJiYgY29tcGxldGVkV29yay5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmICFpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkgJiYgKGNvbXBsZXRlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvbmVudCBhcmUgaGlkZGVuLiBEb24ndCBidWJibGUgdGhlaXJcbiAgICAvLyBleHBpcmF0aW9uIHRpbWVzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lczsgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG5cbiAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgIHZhciBzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCB8fCBjb21wbGV0ZWRXb3JrLmNoaWxkICE9PSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZDtcbiAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG5cbiAgICAgIGlmIChzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMpIHtcbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gY29tcGxldGVkV29yay50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIGNvbXBsZXRlZFdvcmsubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290KSB7XG4gIHZhciByZW5kZXJQcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcbiAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgY29tbWl0Um9vdEltcGwuYmluZChudWxsLCByb290LCByZW5kZXJQcmlvcml0eUxldmVsKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoIShmaW5pc2hlZFdvcmsgIT09IHJvb3QuY3VycmVudCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpOyAvLyBDbGVhciBhbHJlYWR5IGZpbmlzaGVkIGRpc2NyZXRlIHVwZGF0ZXMgaW4gY2FzZSB0aGF0IGEgbGF0ZXIgY2FsbCBvZlxuICAvLyBgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNgIHN0YXJ0cyBhIHVzZWxlc3MgcmVuZGVyIHBhc3Mgd2hpY2ggbWF5IGNhbmNlbHNcbiAgLy8gYSBzY2hlZHVsZWQgdGltZW91dC5cblxuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIGlmICghaGFzRGlzY3JldGVMYW5lcyhyZW1haW5pbmdMYW5lcykgJiYgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcy5oYXMocm9vdCkpIHtcbiAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIEdldCB0aGUgbGlzdCBvZiBlZmZlY3RzLlxuXG5cbiAgdmFyIGZpcnN0RWZmZWN0O1xuXG4gIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgLy8gQSBmaWJlcidzIGVmZmVjdCBsaXN0IGNvbnNpc3RzIG9ubHkgb2YgaXRzIGNoaWxkcmVuLCBub3QgaXRzZWxmLiBTbyBpZlxuICAgIC8vIHRoZSByb290IGhhcyBhbiBlZmZlY3QsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIFRoZVxuICAgIC8vIHJlc3VsdGluZyBsaXN0IGlzIHRoZSBzZXQgdGhhdCB3b3VsZCBiZWxvbmcgdG8gdGhlIHJvb3QncyBwYXJlbnQsIGlmIGl0XG4gICAgLy8gaGFkIG9uZTsgdGhhdCBpcywgYWxsIHRoZSBlZmZlY3RzIGluIHRoZSB0cmVlIGluY2x1ZGluZyB0aGUgcm9vdC5cbiAgICBpZiAoZmluaXNoZWRXb3JrLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgIGZpbmlzaGVkV29yay5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlyc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIG5vIGVmZmVjdCBvbiB0aGUgcm9vdC5cbiAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgfVxuXG4gIGlmIChmaXJzdEVmZmVjdCAhPT0gbnVsbCkge1xuXG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMsIG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIGVycm9yKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuXG4gICAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfSAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbXV0YXRpb24gcGhhc2UsIHdoZXJlIHdlIG11dGF0ZSB0aGUgaG9zdCB0cmVlLlxuXG5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRNdXRhdGlvbkVmZmVjdHMsIG51bGwsIHJvb3QsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIF9lcnJvcik7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcbiAgICAvLyB0aGUgaG9zdCB0cmVlIGFmdGVyIGl0J3MgYmVlbiBtdXRhdGVkLiBUaGUgaWRpb21hdGljIHVzZSBjYXNlIGZvciB0aGlzIGlzXG4gICAgLy8gbGF5b3V0LCBidXQgY2xhc3MgY29tcG9uZW50IGxpZmVjeWNsZXMgYWxzbyBmaXJlIGhlcmUgZm9yIGxlZ2FjeSByZWFzb25zLlxuXG4gICAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAge1xuICAgICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY29tbWl0TGF5b3V0RWZmZWN0cywgbnVsbCwgcm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvcjIgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihuZXh0RWZmZWN0LCBfZXJyb3IyKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7XG5cbiAgICBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVGVsbCBTY2hlZHVsZXIgdG8geWllbGQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUsIHNvIHRoZSBicm93c2VyIGhhcyBhblxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG5cbiAgICB7XG4gICAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzUmVuZGVyUHJpb3JpdHkgPSByZW5kZXJQcmlvcml0eUxldmVsO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIGVmZmVjdCBjaGFpbiBhdCB0aGlzIHBvaW50IHNvIGxldCdzIGNsZWFyIHRoZVxuICAgIC8vIG5leHRFZmZlY3QgcG9pbnRlcnMgdG8gYXNzaXN0IHdpdGggR0MuIElmIHdlIGhhdmUgcGFzc2l2ZSBlZmZlY3RzLCB3ZSdsbFxuICAgIC8vIGNsZWFyIHRoaXMgaW4gZmx1c2hQYXNzaXZlRWZmZWN0cy5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5leHROZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgbmV4dEVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgICAgaWYgKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhuZXh0RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgbmV4dEVmZmVjdCA9IG5leHROZXh0RWZmZWN0O1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBleHBpcmF0aW9uVGltZXMgPSBzcGF3bmVkV29ya0R1cmluZ1JlbmRlcjtcbiAgICAgICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwaXJhdGlvblRpbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgZXhwaXJhdGlvblRpbWVzW2ldLCByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cywgdGhlbiB3ZSBjYW4gY29tcGxldGUgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb25zLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCB3YWl0IHVudGlsIGFmdGVyIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIGZsdXNoZWQuXG4gICAgICAvLyBXYWl0IHRvIGRvIHRoaXMgdW50aWwgYWZ0ZXIgcmVtYWluaW5nIHdvcmsgaGFzIGJlZW4gc2NoZWR1bGVkLFxuICAgICAgLy8gc28gdGhhdCB3ZSBkb24ndCBwcmVtYXR1cmVseSBzaWduYWwgY29tcGxldGUgZm9yIGludGVyYWN0aW9ucyB3aGVuIHRoZXJlJ3MgZS5nLiBoaWRkZW4gd29yay5cbiAgICAgIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIF9lcnJvcjMgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBfZXJyb3IzO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgTGVnYWN5VW5iYXRjaGVkQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIGEgUmVhY3RET00ucmVuZGVyLWVkIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzLiBUaGUgY29tbWl0IGZpcmVkXG4gICAgLy8gc3luY2hyb25vdXNseSwgYnV0IGxheW91dCB1cGRhdGVzIHNob3VsZCBiZSBkZWZlcnJlZCB1bnRpbCB0aGUgZW5kXG4gICAgLy8gb2YgdGhlIGJhdGNoLlxuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cygpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgJiYgZm9jdXNlZEluc3RhbmNlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgaWYgKGRvZXNGaWJlckNvbnRhaW4obmV4dEVmZmVjdCwgZm9jdXNlZEluc3RhbmNlSGFuZGxlKSkge1xuICAgICAgICAgIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBvdXQgb2YgdGhlIGhvdCBwYXRoIHVzaW5nIGEgZGVkaWNhdGVkIGVmZmVjdCB0YWcuXG4gICAgICAgIGlmIChuZXh0RWZmZWN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgbmV4dEVmZmVjdCkgJiYgZG9lc0ZpYmVyQ29udGFpbihuZXh0RWZmZWN0LCBmb2N1c2VkSW5zdGFuY2VIYW5kbGUpKSB7XG4gICAgICAgICAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIobmV4dEVmZmVjdCk7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVDeWNsZXMoY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBmbHVzaCBhdFxuICAgICAgLy8gdGhlIGVhcmxpZXN0IG9wcG9ydHVuaXR5LlxuICAgICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBUT0RPOiBTaG91bGQgcHJvYmFibHkgbW92ZSB0aGUgYnVsayBvZiB0aGlzIGZ1bmN0aW9uIHRvIGNvbW1pdFdvcmsuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgIGNvbW1pdFJlc2V0VGV4dENvbnRlbnQobmV4dEVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjb21taXREZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQgaXMgb25seSBjb25jZXJuZWQgYWJvdXQgcGxhY2VtZW50LFxuICAgIC8vIHVwZGF0ZXMsIGFuZCBkZWxldGlvbnMuIFRvIGF2b2lkIG5lZWRpbmcgdG8gYWRkIGEgY2FzZSBmb3IgZXZlcnkgcG9zc2libGVcbiAgICAvLyBiaXRtYXAgdmFsdWUsIHdlIHJlbW92ZSB0aGUgc2Vjb25kYXJ5IGVmZmVjdHMgZnJvbSB0aGUgZWZmZWN0IHRhZyBhbmRcbiAgICAvLyBzd2l0Y2ggb24gdGhhdCB2YWx1ZS5cblxuXG4gICAgdmFyIHByaW1hcnlGbGFncyA9IGZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSB8IERlbGV0aW9uIHwgSHlkcmF0aW5nKTtcblxuICAgIHN3aXRjaCAocHJpbWFyeUZsYWdzKSB7XG4gICAgICBjYXNlIFBsYWNlbWVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFBsYWNlbWVudChuZXh0RWZmZWN0KTsgLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgICAgICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgICAgICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG4gICAgICAgICAgbmV4dEVmZmVjdC5mbGFncyAmPSB+UGxhY2VtZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUGxhY2VtZW50QW5kVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGxhY2VtZW50XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpOyAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgICAgICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG5cbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5QbGFjZW1lbnQ7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gbmV4dEVmZmVjdC5hbHRlcm5hdGU7XG4gICAgICAgICAgY29tbWl0V29yayhfY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmc6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmdBbmRVcGRhdGU6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50MiA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGNvbW1pdFdvcmsoX2N1cnJlbnQyLCBuZXh0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFVwZGF0ZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfY3VycmVudDMgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgICAgICBjb21taXRXb3JrKF9jdXJyZW50MywgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBEZWxldGlvbjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uKHJvb3QsIG5leHRFZmZlY3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiAoVXBkYXRlIHwgQ2FsbGJhY2spKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgY29tbWl0TGlmZUN5Y2xlcyhyb290LCBjdXJyZW50LCBuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKG5leHRFZmZlY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgaWYgKHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ICE9PSBOb1ByaW9yaXR5JDEpIHtcbiAgICB2YXIgcHJpb3JpdHlMZXZlbCA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID4gTm9ybWFsUHJpb3JpdHkkMSA/IE5vcm1hbFByaW9yaXR5JDEgOiBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eTtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eSA9IE5vUHJpb3JpdHkkMTtcblxuICAgIHtcbiAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsLCBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdE1vdW50KGZpYmVyLCBlZmZlY3QpIHtcbiAgcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBzY2hlZHVsZUNhbGxiYWNrKE5vcm1hbFByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0VW5tb3VudChmaWJlciwgZWZmZWN0KSB7XG4gIHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdENyZWF0ZShlZmZlY3QpIHtcbiAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkNhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBJdCdzIGltcG9ydGFudCB0aGF0IEFMTCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0IGRlc3Ryb3kgZnVuY3Rpb25zIGFyZSBjYWxsZWRcbiAgLy8gYmVmb3JlIEFOWSBwYXNzaXZlIGVmZmVjdCBjcmVhdGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQuXG4gIC8vIE90aGVyd2lzZSBlZmZlY3RzIGluIHNpYmxpbmcgY29tcG9uZW50cyBtaWdodCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLlxuICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IG1heSB1bmludGVudGlvbmFsbHkgb3ZlcnJpZGUgYSByZWZcbiAgLy8gdmFsdWUgc2V0IGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50LlxuICAvLyBMYXlvdXQgZWZmZWN0cyBoYXZlIHRoZSBzYW1lIGNvbnN0cmFpbnQuXG4gIC8vIEZpcnN0IHBhc3M6IERlc3Ryb3kgc3RhbGUgcGFzc2l2ZSBlZmZlY3RzLlxuXG4gIHZhciB1bm1vdW50RWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudEVmZmVjdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgX2VmZmVjdCA9IHVubW91bnRFZmZlY3RzW2ldO1xuICAgIHZhciBmaWJlciA9IHVubW91bnRFZmZlY3RzW2kgKyAxXTtcbiAgICB2YXIgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveTtcbiAgICBfZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICB7XG4gICAgICBmaWJlci5mbGFncyAmPSB+UGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2O1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuZmxhZ3MgJj0gflBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICBpZiAoIShmaWJlciAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTZWNvbmQgcGFzczogQ3JlYXRlIG5ldyBwYXNzaXZlIGVmZmVjdHMuXG5cblxuICB2YXIgbW91bnRFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW91bnRFZmZlY3RzLmxlbmd0aDsgX2kgKz0gMikge1xuICAgIHZhciBfZWZmZWN0MiA9IG1vdW50RWZmZWN0c1tfaV07XG4gICAgdmFyIF9maWJlciA9IG1vdW50RWZmZWN0c1tfaSArIDFdO1xuXG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKF9maWJlcik7XG5cbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGludm9rZVBhc3NpdmVFZmZlY3RDcmVhdGUsIG51bGwsIF9lZmZlY3QyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgaWYgKCEoX2ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBiZSB3b3JraW5nIG9uIGFuIGVmZmVjdC5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZXJyb3I0ID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKF9maWJlciwgX2Vycm9yNCk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuICB9IC8vIE5vdGU6IFRoaXMgY3VycmVudGx5IGFzc3VtZXMgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cyBvbiB0aGUgcm9vdCBmaWJlclxuICAvLyBiZWNhdXNlIHRoZSByb290IGlzIG5vdCBwYXJ0IG9mIGl0cyBvd24gZWZmZWN0IGxpc3QuXG4gIC8vIFRoaXMgY291bGQgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cblxuICB2YXIgZWZmZWN0ID0gcm9vdC5jdXJyZW50LmZpcnN0RWZmZWN0O1xuXG4gIHdoaWxlIChlZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dE5leHRFZmZlY3QgPSBlZmZlY3QubmV4dEVmZmVjdDsgLy8gUmVtb3ZlIG5leHRFZmZlY3QgcG9pbnRlciB0byBhc3Npc3QgR0NcblxuICAgIGVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgIGlmIChlZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZWZmZWN0KTtcbiAgICB9XG5cbiAgICBlZmZlY3QgPSBuZXh0TmV4dEVmZmVjdDtcbiAgfVxuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgZmluaXNoUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTsgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuXG4gIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsID8gMCA6IG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCArIDE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChyb290RmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgU3luY0xhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICAgIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBTeW5jTGFuZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQuXG4gICAgICAgICAgLy8gV2UgY2FuJ3Qgc2NoZWR1bGUgYW55IGZvbGxvdyB1cCB3b3JrIGZvciB0aGUgcm9vdCBiZWNhdXNlIHRoZSBmaWJlciBpcyBhbHJlYWR5IHVubW91bnRlZCxcbiAgICAgICAgICAvLyBidXQgd2UgY2FuIHN0aWxsIGNhbGwgdGhlIGxvZy1vbmx5IGJvdW5kYXJ5IHNvIHRoZSBlcnJvciBpc24ndCBzd2FsbG93ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUT0RPIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBiYW5kYWlkIGZvciB0aGUgb2xkIHJlY29uY2lsZXIgZm9yay5cbiAgICAgICAgICAvLyBXZSBjYW4gZGVsZXRlIHRoaXMgc3BlY2lhbCBjYXNlIG9uY2UgdGhlIG5ldyBmb3JrIGlzIG1lcmdlZC5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvclRvSWdub3JlKSB7Ly8gVE9ETyBJZ25vcmUgdGhpcyBlcnJvcj8gUmV0aHJvdyBpdD9cbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBraW5kIG9mIGFuIGVkZ2UgY2FzZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHBpbmdlZExhbmVzKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGV4cGlyYXRpb24gdGltZS5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICB7XG4gICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgcmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciBjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIChCbG9ja2luZ01vZGUgfCBDb25jdXJyZW50TW9kZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBCbG9jaykge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IEJsb2NrKSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIHVubW91bnRzIGZvciB0aGlzIEZpYmVyLFxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGV5IHdvdWxkIGhhdmUgcHJldmVudGVkIHRoaXMgdXBkYXRlLlxuXG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2KSAhPT0gTm9GbGFncykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykgOyBlbHNlIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gVGhpcyBcIiArICdpcyBhIG5vLW9wLCBidXQgaXQgaW5kaWNhdGVzIGEgbWVtb3J5IGxlYWsgaW4geW91ciBhcHBsaWNhdGlvbi4gVG8gJyArICdmaXgsIGNhbmNlbCBhbGwgc3Vic2NyaXB0aW9ucyBhbmQgYXN5bmNocm9ub3VzIHRhc2tzIGluICVzLicsIHRhZyA9PT0gQ2xhc3NDb21wb25lbnQgPyAndGhlIGNvbXBvbmVudFdpbGxVbm1vdW50IG1ldGhvZCcgOiAnYSB1c2VFZmZlY3QgY2xlYW51cCBmdW5jdGlvbicpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuIFRyZWF0IGV2ZXJ5dGhpbmcgZWxzZSBsaWtlIGFuIGVycm9yLlxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayh1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTsgLy8gYGludm9rZUd1YXJkZWRDYWxsYmFja2Agc29tZXRpbWVzIHNldHMgYW4gZXhwYW5kbyBgX3N1cHByZXNzTG9nZ2luZ2AuXG4gICAgICAgIC8vIFJldGhyb3cgdGhpcyBlcnJvciBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmUuXG5cbiAgICAgICAgdGhyb3cgcmVwbGF5RXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGJyYW5jaCBpcyByZWFjaGFibGUgaWYgdGhlIHJlbmRlciBwaGFzZSBpcyBpbXB1cmUuXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIGEgJ3NoYXJlZCcgdmFyaWFibGUgdGhhdCBjaGFuZ2VzIHdoZW4gYWN0KCkgb3BlbnMvY2xvc2VzIGluIHRlc3RzLlxuXG5cbnZhciBJc1RoaXNSZW5kZXJlckFjdGluZyA9IHtcbiAgY3VycmVudDogZmFsc2Vcbn07XG5mdW5jdGlvbiB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpIHtcbiAge1xuICAgIGlmICggSXNTb21lUmVuZGVyZXJBY3RpbmcuY3VycmVudCA9PT0gdHJ1ZSAmJiBJc1RoaXNSZW5kZXJlckFjdGluZy5jdXJyZW50ICE9PSB0cnVlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgd3JvbmcgYWN0KCkgYXJvdW5kIHlvdXIgdGVzdCBpbnRlcmFjdGlvbnMuXFxuXCIgKyAnQmUgc3VyZSB0byB1c2UgdGhlIG1hdGNoaW5nIHZlcnNpb24gb2YgYWN0KCkgY29ycmVzcG9uZGluZyB0byB5b3VyIHJlbmRlcmVyOlxcblxcbicgKyAnLy8gZm9yIHJlYWN0LWRvbTpcXG4nICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2ltcG9ydCB7YWN0fSBmcicgKyBcIm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XFxuXCIgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTtcXG5cXG4nICsgJy8vIGZvciByZWFjdC10ZXN0LXJlbmRlcmVyOlxcbicgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnaW1wb3J0IFRlc3RSZW5kZXJlciBmcicgKyBcIm9tIHJlYWN0LXRlc3QtcmVuZGVyZXInO1xcblwiICsgJ2NvbnN0IHthY3R9ID0gVGVzdFJlbmRlcmVyO1xcbicgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTsnKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdFZmZlY3RzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggKGZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlKSAhPT0gTm9Nb2RlICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIHJhbiBhbiBlZmZlY3QsIGJ1dCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luRGV2ID0gd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luREVWOyAvLyBJbiB0ZXN0cywgd2Ugd2FudCB0byBlbmZvcmNlIGEgbW9ja2VkIHNjaGVkdWxlci5cblxudmFyIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gZmFsc2U7IC8vIFRPRE8gQmVmb3JlIHdlIHJlbGVhc2UgY29uY3VycmVudCBtb2RlLCByZXZpc2l0IHRoaXMgYW5kIGRlY2lkZSB3aGV0aGVyIGEgbW9ja2VkXG4vLyBzY2hlZHVsZXIgaXMgdGhlIGFjdHVhbCByZWNvbW1lbmRhdGlvbi4gVGhlIGFsdGVybmF0aXZlIGNvdWxkIGJlIGEgdGVzdGluZyBidWlsZCxcbi8vIGEgbmV3IGxpYiwgb3Igd2hhdGV2ZXI7IHdlIGR1bm5vIGp1c3QgeWV0LiBUaGlzIG1lc3NhZ2UgaXMgZm9yIGVhcmx5IGFkb3B0ZXJzXG4vLyB0byBnZXQgdGhlaXIgdGVzdHMgcmlnaHQuXG5cbmZ1bmN0aW9uIHdhcm5JZlVubW9ja2VkU2NoZWR1bGVyKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkFib3V0VW5tb2NrZWRTY2hlZHVsZXIgPT09IGZhbHNlICYmIFNjaGVkdWxlci51bnN0YWJsZV9mbHVzaEFsbFdpdGhvdXRBc3NlcnRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpYmVyLm1vZGUgJiBCbG9ja2luZ01vZGUgfHwgZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignSW4gQ29uY3VycmVudCBvciBTeW5jIG1vZGVzLCB0aGUgXCJzY2hlZHVsZXJcIiBtb2R1bGUgbmVlZHMgdG8gYmUgbW9ja2VkICcgKyAndG8gZ3VhcmFudGVlIGNvbnNpc3RlbnQgYmVoYXZpb3VyIGFjcm9zcyB0ZXN0cyBhbmQgYnJvd3NlcnMuICcgKyAnRm9yIGV4YW1wbGUsIHdpdGggamVzdDogXFxuJyArIC8vIEJyZWFrIHVwIHJlcXVpcmVzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICBcImplc3QubW9jaygnc2NoZWR1bGVyJywgKCkgPT4gcmVxdWlyZVwiICsgXCIoJ3NjaGVkdWxlci91bnN0YWJsZV9tb2NrJykpO1xcblxcblwiICsgJ0ZvciBtb3JlIGluZm8sIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9tb2NrLXNjaGVkdWxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkSUQocm9vdCwgbGFuZSkge1xuICAvLyBJbnRlcmFjdGlvbiB0aHJlYWRzIGFyZSB1bmlxdWUgcGVyIHJvb3QgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAgLy8gTk9URTogSW50ZW50aW9uYWxseSB1bnNvdW5kIGNhc3QuIEFsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCBpdCdzIGEgbnVtYmVyXG4gIC8vIGFuZCBpdCByZXByZXNlbnRzIGEgYmF0Y2ggb2Ygd29yay4gQ291bGQgbWFrZSBhIGhlbHBlciBmdW5jdGlvbiBpbnN0ZWFkLFxuICAvLyBidXQgbWVoIHRoaXMgaXMgZmluZSBmb3Igbm93LlxuICByZXR1cm4gbGFuZSAqIDEwMDAgKyByb290LmludGVyYWN0aW9uVGhyZWFkSUQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtTcGF3bmVkV29yayhsYW5lKSB7XG5cbiAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID09PSBudWxsKSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBbbGFuZV07XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIucHVzaChsYW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUludGVyYWN0aW9ucyhyb290LCBsYW5lLCBpbnRlcmFjdGlvbnMpIHtcblxuICBpZiAoaW50ZXJhY3Rpb25zLnNpemUgPiAwKSB7XG4gICAgdmFyIHBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwO1xuICAgIHZhciBwZW5kaW5nSW50ZXJhY3Rpb25zID0gcGVuZGluZ0ludGVyYWN0aW9uTWFwLmdldChsYW5lKTtcblxuICAgIGlmIChwZW5kaW5nSW50ZXJhY3Rpb25zICE9IG51bGwpIHtcbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnRlcmFjdGlvbnMuaGFzKGludGVyYWN0aW9uKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciBwcmV2aW91c2x5IHVuc2NoZWR1bGVkIGludGVyYWN0aW9uLlxuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nSW50ZXJhY3Rpb25NYXAuc2V0KGxhbmUsIG5ldyBTZXQoaW50ZXJhY3Rpb25zKSk7IC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG5cbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmUpO1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lKSB7XG5cbiAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSwgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50KTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKSB7XG4gIC8vIHdlIGNhbiBhY2N1cmF0ZWx5IGF0dHJpYnV0ZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gaXQsIEFuZCBzbyB0aGF0IGNhc2NhZGluZ1xuICAvLyB3b3JrIHRyaWdnZXJlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KCk7XG4gIHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgc2NoZWR1bGVkTGFuZSkge1xuICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBzY2hlZHVsZWRMYW5lKSkge1xuICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHNldCBvZiBpbnRlcmFjdGlvbnMgb24gdGhlIEZpYmVyUm9vdCBmb3IgYSBmZXcgcmVhc29uczpcbiAgLy8gV2UgY2FuIHJlLXVzZSBpdCBpbiBob3QgZnVuY3Rpb25zIGxpa2UgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KClcbiAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmVjYWxjdWxhdGUgaXQuIFdlIHdpbGwgYWxzbyB1c2UgaXQgaW4gY29tbWl0V29yaygpIHRvXG4gIC8vIHBhc3MgdG8gYW55IFByb2ZpbGVyIG9uUmVuZGVyKCkgaG9va3MuIFRoaXMgYWxzbyBwcm92aWRlcyBEZXZUb29scyB3aXRoIGFcbiAgLy8gd2F5IHRvIGFjY2VzcyBpdCB3aGVuIHRoZSBvbkNvbW1pdFJvb3QoKSBob29rIGlzIGNhbGxlZC5cblxuICByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25zO1xuXG4gIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgdGhlIHN1YnNjcmliZXIgdGhyb3dzLCByZXRocm93IGl0IGluIGEgc2VwYXJhdGUgdGFza1xuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuICB2YXIgcmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3Vic2NyaWJlcjtcblxuICB0cnkge1xuICAgIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucy5zaXplID4gMCkge1xuICAgICAgLy8gRklYTUU6IE1vcmUgdGhhbiBvbmUgbGFuZSBjYW4gZmluaXNoIGluIGEgc2luZ2xlIGNvbW1pdC5cbiAgICAgIHZhciB0aHJlYWRJRCA9IGNvbXB1dGVUaHJlYWRJRChyb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQocm9vdC5tZW1vaXplZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhciBjb21wbGV0ZWQgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBlbmRpbmcgTWFwLlxuICAgIC8vIFVubGVzcyB0aGUgcmVuZGVyIHdhcyBzdXNwZW5kZWQgb3IgY2FzY2FkaW5nIHdvcmsgd2FzIHNjaGVkdWxlZCxcbiAgICAvLyBJbiB3aGljaCBjYXNl4oCTIGxlYXZlIHBlbmRpbmcgaW50ZXJhY3Rpb25zIHVudGlsIHRoZSBzdWJzZXF1ZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9uTWFwID0gcm9vdC5wZW5kaW5nSW50ZXJhY3Rpb25NYXA7XG4gICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgbGFuZSkge1xuICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb24gY291bnQgaWYgd2UncmUgZG9uZS5cbiAgICAgIC8vIElmIHRoZXJlJ3Mgc3RpbGwgd29yayBhdCB0aGUgY3VycmVudCBwcmlvcml0eSxcbiAgICAgIC8vIFRoYXQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIHN1c3BlbnNlIGRhdGEuXG4gICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCwgbGFuZSkpIHtcbiAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmRlbGV0ZShsYW5lKTtcbiAgICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgICAgICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIGBhY3RgIHRlc3RpbmcgQVBJXG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBhY3RpbmdVcGRhdGVzU2NvcGVEZXB0aCA+IDA7XG59XG4vLyBzbyB3ZSBjYW4gdGVsbCBpZiBhbnkgYXN5bmMgYWN0KCkgY2FsbHMgdHJ5IHRvIHJ1biBpbiBwYXJhbGxlbC5cblxuXG52YXIgYWN0aW5nVXBkYXRlc1Njb3BlRGVwdGggPSAwO1xuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICBmaWJlci5zaWJsaW5nID0gbnVsbDtcbiAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbn1cblxudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgZGVidWdDb3VudGVyID0gMTtcblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMubmV4dEVmZmVjdCA9IG51bGw7XG4gIHRoaXMuZmlyc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnSUQgPSBkZWJ1Z0NvdW50ZXIrKztcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0lEID0gY3VycmVudC5fZGVidWdJRDtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0IGxpc3QgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHdvcmtJblByb2dyZXNzLm5leHRFZmZlY3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZykge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZSB8IEJsb2NraW5nTW9kZSB8IFN0cmljdE1vZGU7XG4gIH0gZWxzZSBpZiAodGFnID09PSBCbG9ja2luZ1Jvb3QpIHtcbiAgICBtb2RlID0gQmxvY2tpbmdNb2RlIHwgU3RyaWN0TW9kZTtcbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IERlYnVnVHJhY2luZ01vZGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RNb2RlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUxlZ2FjeUhpZGRlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lKG93bmVyLnR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvciggXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgYXMgYSBwcm9wJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpOyAvLyBUT0RPOiBUaGUgUHJvZmlsZXIgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci50eXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIFN1c3BlbnNlQ29tcG9uZW50IGZpYmVyIHNob3VsZG4ndCBoYXZlIGEgdHlwZS4gSXQgaGFzIGEgdGFnLlxuICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGluIGdldENvbXBvbmVudE5hbWUgc28gdGhhdCBpdCByZWxpZXMgb24gdGhlIHRhZ1xuICAvLyBpbnN0ZWFkLlxuXG4gIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG5cbiAge1xuICAgIC8vIFRPRE86IFRoZSBTdXNwZW5zZUxpc3RDb21wb25lbnQgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG4gICAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgICAvLyBpbnN0ZWFkLlxuICAgIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIH1cblxuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIE9mZnNjcmVlbkNvbXBvbmVudCBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICB9XG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tTGVnYWN5SGlkZGVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihMZWdhY3lIaWRkZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIExlZ2FjeUhpZGRlbiBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTtcbiAgfVxuXG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7IC8vIFRPRE86IFRoZXNlIHNob3VsZCBub3QgbmVlZCBhIHR5cGUuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIGZpYmVyLnR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0Lm5leHRFZmZlY3QgPSBzb3VyY2UubmV4dEVmZmVjdDtcbiAgdGFyZ2V0LmZpcnN0RWZmZWN0ID0gc291cmNlLmZpcnN0RWZmZWN0O1xuICB0YXJnZXQubGFzdEVmZmVjdCA9IHNvdXJjZS5sYXN0RWZmZWN0O1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z0lEID0gc291cmNlLl9kZWJ1Z0lEO1xuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmludGVyYWN0aW9uVGhyZWFkSUQgPSB0cmFjaW5nLnVuc3RhYmxlX2dldFRocmVhZElEKCk7XG4gICAgdGhpcy5tZW1vaXplZEludGVyYWN0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBCbG9ja2luZ1Jvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSAnY3JlYXRlQmxvY2tpbmdSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gJ2NyZWF0ZUxlZ2FjeVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBoeWRyYXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIE9iamVjdC5rZXlzKGNvbXBvbmVudCkgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGh5ZHJhdGlvbkNhbGxiYWNrcykge1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmVW5tb2NrZWRTY2hlZHVsZXIoY3VycmVudCQxKTtcbiAgICAgIHdhcm5JZk5vdFNjb3BlZFdpdGhNYXRjaGluZ0FjdChjdXJyZW50JDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWUoY3VycmVudC50eXBlKSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlKTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5uYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmU7XG4gIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQyKHByaW9yaXR5LCBmbikge1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChob3N0RmliZXIudGFnID09PSBGdW5kYW1lbnRhbENvbXBvbmVudCkge1xuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlLmluc3RhbmNlO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gX2Fzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IF9hc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBfYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gY3JlYXRlUm9vdEltcGwoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NQmxvY2tpbmdSb290KGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKTtcbn1cblxuUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTUJsb2NraW5nUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01CbG9ja2luZ1Jvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgZnVuY3Rpb24gKCkge1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIC8vIFRhZyBpcyBlaXRoZXIgTGVnYWN5Um9vdCBvciBDb25jdXJyZW50IFJvb3RcbiAgdmFyIGh5ZHJhdGUgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlID09PSB0cnVlO1xuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0aW9uT3B0aW9ucyB8fCBudWxsO1xuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zLm11dGFibGVTb3VyY2VzIHx8IG51bGw7XG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgdGFnLCBoeWRyYXRlKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciBjb250YWluZXJOb2RlVHlwZSA9IGNvbnRhaW5lci5ub2RlVHlwZTtcblxuICB7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIH1cblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTUJsb2NraW5nUm9vdChjb250YWluZXIsIExlZ2FjeVJvb3QsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcbnZhciB3YXJuZWRBYm91dEh5ZHJhdGVBUEkgPSBmYWxzZTtcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHJldHVybiAhIShyb290RWxlbWVudCAmJiByb290RWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKSB7XG4gIHZhciBzaG91bGRIeWRyYXRlID0gZm9yY2VIeWRyYXRlIHx8IHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpOyAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cblxuICBpZiAoIXNob3VsZEh5ZHJhdGUpIHtcbiAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAge1xuICAgICAgICBpZiAoIXdhcm5lZCAmJiByb290U2libGluZy5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RTaWJsaW5nLmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSkge1xuICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcigncmVuZGVyKCk6IFRhcmdldCBub2RlIGhhcyBtYXJrdXAgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCB0aGVyZSAnICsgJ2FyZSB1bnJlbGF0ZWQgbm9kZXMgYXMgd2VsbC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGNhdXNlZCBieSAnICsgJ3doaXRlLXNwYWNlIGluc2VydGVkIGFyb3VuZCBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRIeWRyYXRlICYmICFmb3JjZUh5ZHJhdGUgJiYgIXdhcm5lZEFib3V0SHlkcmF0ZUFQSSkge1xuICAgICAgd2FybmVkQWJvdXRIeWRyYXRlQVBJID0gdHJ1ZTtcblxuICAgICAgd2FybigncmVuZGVyKCk6IENhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgdG8gaHlkcmF0ZSBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwICcgKyAnd2lsbCBzdG9wIHdvcmtpbmcgaW4gUmVhY3QgdjE4LiBSZXBsYWNlIHRoZSBSZWFjdERPTS5yZW5kZXIoKSBjYWxsICcgKyAnd2l0aCBSZWFjdERPTS5oeWRyYXRlKCkgaWYgeW91IHdhbnQgUmVhY3QgdG8gYXR0YWNoIHRvIHRoZSBzZXJ2ZXIgSFRNTC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIHNob3VsZEh5ZHJhdGUgPyB7XG4gICAgaHlkcmF0ZTogdHJ1ZVxuICB9IDogdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH0gLy8gVE9ETzogV2l0aG91dCBgYW55YCB0eXBlLCBGbG93IHNheXMgXCJQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgb24gYW55XG4gIC8vIG1lbWJlciBvZiBpbnRlcnNlY3Rpb24gdHlwZS5cIiBXaHl5eXl5eS5cblxuXG4gIHZhciByb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciBmaWJlclJvb3Q7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKTtcbiAgICBmaWJlclJvb3QgPSByb290Ll9pbnRlcm5hbFJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIHVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCBmaWJlclJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZpYmVyUm9vdCA9IHJvb3QuX2ludGVybmFsUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgZmliZXJSb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2UoZmliZXJSb290KTtcbn1cblxuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00uY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgY3JlYXRlUm9vdChjb250YWluZXIsIHtoeWRyYXRlOiB0cnVlfSkucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyTm9kZSkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgaGFzKHBhcmVudENvbXBvbmVudCkpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwicGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnRcIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInVubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgdW5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0VXNlckJsb2NraW5nSHlkcmF0aW9uKGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkkMik7XG52YXIgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSBmYWxzZTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzJDEsIGZsdXNoRGlzY3JldGVVcGRhdGVzLCBiYXRjaGVkRXZlbnRVcGRhdGVzJDEpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuXG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRVbnN0YWJsZUNyZWF0ZVBvcnRhbCkge1xuICAgICAgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdUaGUgUmVhY3RET00udW5zdGFibGVfY3JlYXRlUG9ydGFsKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdERPTS5jcmVhdGVQb3J0YWwoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLCAnICsgJ2J1dCB3aXRob3V0IHRoZSBcInVuc3RhYmxlX1wiIHByZWZpeC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lciwga2V5KTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMsIGFuZCBSZWFjdFRlc3RVdGlsc0FjdC5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGZsdXNoUGFzc2l2ZUVmZmVjdHMsIC8vIFRPRE86IFRoaXMgaXMgcmVsYXRlZCB0byBgYWN0YCwgbm90IGV2ZW50cy4gTW92ZSB0byBzZXBhcmF0ZSBrZXk/XG4gIElzVGhpc1JlbmRlcmVyQWN0aW5nXVxufTtcbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWwgPSB1bnN0YWJsZV9jcmVhdGVQb3J0YWw7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNy4wLjJcbiAqIHJlYWN0LmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIFRPRE86IHRoaXMgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGdldHMgaW1wb3J0ZWQgZHVyaW5nIGJ1aWxkLlxudmFyIFJlYWN0VmVyc2lvbiA9ICcxNy4wLjInO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xuZXhwb3J0cy5GcmFnbWVudCA9IDB4ZWFjYjtcbmV4cG9ydHMuU3RyaWN0TW9kZSA9IDB4ZWFjYztcbmV4cG9ydHMuUHJvZmlsZXIgPSAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSAweGVhY2U7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IDB4ZWFkMDtcbmV4cG9ydHMuU3VzcGVuc2UgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBleHBvcnRzLkZyYWdtZW50ID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBleHBvcnRzLlN0cmljdE1vZGUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIGV4cG9ydHMuUHJvZmlsZXIgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBleHBvcnRzLlN1c3BlbnNlID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgZGlzcGF0Y2hlci5cbiAqL1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBiYXRjaCdzIGNvbmZpZ3VyYXRpb24gc3VjaCBhcyBob3cgbG9uZyBhbiB1cGRhdGVcbiAqIHNob3VsZCBzdXNwZW5kIGZvciBpZiBpdCBuZWVkcyB0by5cbiAqL1xudmFyIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnID0ge1xuICB0cmFuc2l0aW9uOiAwXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0ge307XG52YXIgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IG51bGw7XG5mdW5jdGlvbiBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spIHtcbiAge1xuICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgfVxufVxuXG57XG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lID0gZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAge1xuICAgICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICAgIH1cbiAgfTsgLy8gU3RhY2sgaW1wbGVtZW50YXRpb24gaW5qZWN0ZWQgYnkgdGhlIGN1cnJlbnQgcmVuZGVyZXIuXG5cblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudEV4dHJhU3RhY2tGcmFtZSkge1xuICAgICAgc3RhY2sgKz0gY3VycmVudEV4dHJhU3RhY2tGcmFtZTtcbiAgICB9IC8vIERlbGVnYXRlIHRvIHRoZSBpbmplY3RlZCByZW5kZXJlci1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuXG5cbiAgICB2YXIgaW1wbCA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrO1xuXG4gICAgaWYgKGltcGwpIHtcbiAgICAgIHN0YWNrICs9IGltcGwoKSB8fCAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG59XG5cbi8qKlxuICogVXNlZCBieSBhY3QoKSB0byB0cmFjayB3aGV0aGVyIHlvdSdyZSBpbnNpZGUgYW4gYWN0KCkgc2NvcGUuXG4gKi9cbnZhciBJc1NvbWVSZW5kZXJlckFjdGluZyA9IHtcbiAgY3VycmVudDogZmFsc2Vcbn07XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLFxuICBSZWFjdEN1cnJlbnRPd25lcjogUmVhY3RDdXJyZW50T3duZXIsXG4gIElzU29tZVJlbmRlcmVyQWN0aW5nOiBJc1NvbWVSZW5kZXJlckFjdGluZyxcbiAgLy8gVXNlZCBieSByZW5kZXJlcnMgdG8gYXZvaWQgYnVuZGxpbmcgb2JqZWN0LWFzc2lnbiB0d2ljZSBpbiBVTUQgYnVuZGxlczpcbiAgYXNzaWduOiBfYXNzaWduXG59O1xuXG57XG4gIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lO1xufVxuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH1cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgdmFyIF9jb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gX2NvbnN0cnVjdG9yICYmIChfY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgX2NvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJztcbiAgICB2YXIgd2FybmluZ0tleSA9IGNvbXBvbmVudE5hbWUgKyBcIi5cIiArIGNhbGxlck5hbWU7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXJyb3IoXCJDYW4ndCBjYWxsICVzIG9uIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHlldCBtb3VudGVkLiBcIiArICdUaGlzIGlzIGEgbm8tb3AsIGJ1dCBpdCBtaWdodCBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiAnICsgJ0luc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCAnICsgJ2NsYXNzIHByb3BlcnR5IHdpdGggdGhlIGRlc2lyZWQgc3RhdGUgaW4gdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBhbiB1cGRhdGUgcXVldWUuXG4gKi9cblxuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICghKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuXCIgKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuX2Fzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcblxucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgZXhwb3J0cy5GcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgZXhwb3J0cy5Qcm9maWxlcjpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBleHBvcnRzLlN0cmljdE1vZGU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBleHBvcnRzLlN1c3BlbnNlOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xudmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLCBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biwgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5yZWYgPT09ICdzdHJpbmcnICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgY29uZmlnLl9fc2VsZiAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnN0YXRlTm9kZSAhPT0gY29uZmlnLl9fc2VsZikge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignQ29tcG9uZW50IFwiJXNcIiBjb250YWlucyB0aGUgc3RyaW5nIHJlZiBcIiVzXCIuICcgKyAnU3VwcG9ydCBmb3Igc3RyaW5nIHJlZnMgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuICcgKyAnVGhpcyBjYXNlIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBhbiBhcnJvdyBmdW5jdGlvbi4gJyArICdXZSBhc2sgeW91IHRvIG1hbnVhbGx5IGZpeCB0aGlzIGNhc2UgYnkgdXNpbmcgdXNlUmVmKCkgb3IgY3JlYXRlUmVmKCkgaW5zdGVhZC4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLXN0cmluZy1yZWYnLCBjb21wb25lbnROYW1lLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY3JlYXRlZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuICB2YXIgcHJvcHMgPSB7fTtcbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuICB2YXIgc2VsZiA9IG51bGw7XG4gIHZhciBzb3VyY2UgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuXG4gICAgICB7XG4gICAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTsgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9IC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuXG5cbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufVxuZnVuY3Rpb24gY2xvbmVBbmRSZXBsYWNlS2V5KG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2Nsb25lZWxlbWVudFxuICovXG5cbmZ1bmN0aW9uIGNsb25lRWxlbWVudChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIGlmICghIShlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHVuZGVmaW5lZCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCBcIiArIGVsZW1lbnQgKyBcIi5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm9wTmFtZTsgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuXG4gIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cblxuICB2YXIga2V5ID0gZWxlbWVudC5rZXk7XG4gIHZhciByZWYgPSBlbGVtZW50LnJlZjsgLy8gU2VsZiBpcyBwcmVzZXJ2ZWQgc2luY2UgdGhlIG93bmVyIGlzIHByZXNlcnZlZC5cblxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7IC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7IC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuXG5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuXG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cblxuXG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiBSZWFjdEVsZW1lbnQoZWxlbWVudC50eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG4vKipcbiAqIEVzY2FwZSBhbmQgd3JhcCBrZXkgc28gaXQgaXMgc2FmZSB0byB1c2UgYXMgYSByZWFjdGlkXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSB0byBiZSBlc2NhcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZXNjYXBlZCBrZXkuXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlKGtleSkge1xuICB2YXIgZXNjYXBlUmVnZXggPSAvWz06XS9nO1xuICB2YXIgZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPSc6ICc9MCcsXG4gICAgJzonOiAnPTInXG4gIH07XG4gIHZhciBlc2NhcGVkU3RyaW5nID0ga2V5LnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG4gIHJldHVybiAnJCcgKyBlc2NhcGVkU3RyaW5nO1xufVxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcblxuZnVuY3Rpb24gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHRleHQpIHtcbiAgcmV0dXJuIHRleHQucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgZWxlbWVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBlbGVtZW50IEEgZWxlbWVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEtleShlbGVtZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnb2JqZWN0JyAmJiBlbGVtZW50ICE9PSBudWxsICYmIGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICByZXR1cm4gZXNjYXBlKCcnICsgZWxlbWVudC5rZXkpO1xuICB9IC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG5cblxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG5mdW5jdGlvbiBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuYW1lU29GYXIsIGNhbGxiYWNrKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICB2YXIgaW52b2tlQ2FsbGJhY2sgPSBmYWxzZTtcblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwpIHtcbiAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgc3dpdGNoIChjaGlsZHJlbi4kJHR5cGVvZikge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgIHZhciBfY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB2YXIgbWFwcGVkQ2hpbGQgPSBjYWxsYmFjayhfY2hpbGQpOyAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3M6XG5cbiAgICB2YXIgY2hpbGRLZXkgPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0RWxlbWVudEtleShfY2hpbGQsIDApIDogbmFtZVNvRmFyO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWFwcGVkQ2hpbGQpKSB7XG4gICAgICB2YXIgZXNjYXBlZENoaWxkS2V5ID0gJyc7XG5cbiAgICAgIGlmIChjaGlsZEtleSAhPSBudWxsKSB7XG4gICAgICAgIGVzY2FwZWRDaGlsZEtleSA9IGVzY2FwZVVzZXJQcm92aWRlZEtleShjaGlsZEtleSkgKyAnLyc7XG4gICAgICB9XG5cbiAgICAgIG1hcEludG9BcnJheShtYXBwZWRDaGlsZCwgYXJyYXksIGVzY2FwZWRDaGlsZEtleSwgJycsIGZ1bmN0aW9uIChjKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICAgIG1hcHBlZENoaWxkID0gY2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLCAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgICAvLyB0cmF2ZXJzZUFsbENoaWxkcmVuIHVzZWQgdG8gZG8gZm9yIG9iamVjdHMgYXMgY2hpbGRyZW5cbiAgICAgICAgZXNjYXBlZFByZWZpeCArICggLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBSZWFjdC5Qb3J0YWwgZG9lc24ndCBoYXZlIGEga2V5XG4gICAgICAgIG1hcHBlZENoaWxkLmtleSAmJiAoIV9jaGlsZCB8fCBfY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gLy8gJEZsb3dGaXhNZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBleGlzdGluZyBlbGVtZW50J3Mga2V5IGNhbiBiZSBhIG51bWJlclxuICAgICAgICBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoJycgKyBtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgICAgfVxuXG4gICAgICBhcnJheS5wdXNoKG1hcHBlZENoaWxkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIGl0ZXJhYmxlQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICAvLyBXYXJuIGFib3V0IHVzaW5nIE1hcHMgYXMgY2hpbGRyZW5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gPT09IGl0ZXJhYmxlQ2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICAgIGlmICghZGlkV2FybkFib3V0TWFwcykge1xuICAgICAgICAgICAgd2FybignVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1VzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGl0ZXJhYmxlQ2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaWkgPSAwO1xuXG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gbWFwSW50b0FycmF5KGNoaWxkLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmV4dE5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSAnJyArIGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIiApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBjb3VudCA9IDA7XG4gIG1hcEludG9BcnJheShjaGlsZHJlbiwgcmVzdWx0LCAnJywgJycsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGNvdW50KyspO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBuID0gMDtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBuKys7IC8vIERvbid0IHJldHVybiBhbnl0aGluZ1xuICB9KTtcbiAgcmV0dXJuIG47XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpIHtcbiAgbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICgpIHtcbiAgICBmb3JFYWNoRnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmcuXG4gIH0sIGZvckVhY2hDb250ZXh0KTtcbn1cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVudG9hcnJheVxuICovXG5cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICByZXR1cm4gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZDtcbiAgfSkgfHwgW107XG59XG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVub25seVxuICpcbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGEgc2luZ2xlIGNoaWxkIGdldHNcbiAqIHBhc3NlZCB3aXRob3V0IGEgd3JhcHBlciwgYnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHRvXG4gKiBhYnN0cmFjdCBhd2F5IHRoZSBwYXJ0aWN1bGFyIHN0cnVjdHVyZSBvZiBjaGlsZHJlbi5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IGNoaWxkcmVuIENoaWxkIGNvbGxlY3Rpb24gc3RydWN0dXJlLlxuICogQHJldHVybiB7UmVhY3RFbGVtZW50fSBUaGUgZmlyc3QgYW5kIG9ubHkgYFJlYWN0RWxlbWVudGAgY29udGFpbmVkIGluIHRoZVxuICogc3RydWN0dXJlLlxuICovXG5cblxuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gIGlmICghaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hpbGRyZW47XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlLCBjYWxjdWxhdGVDaGFuZ2VkQml0cykge1xuICBpZiAoY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhbGN1bGF0ZUNoYW5nZWRCaXRzID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICBpZiAoY2FsY3VsYXRlQ2hhbmdlZEJpdHMgIT09IG51bGwgJiYgdHlwZW9mIGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdjcmVhdGVDb250ZXh0OiBFeHBlY3RlZCB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMnLCBjYWxjdWxhdGVDaGFuZ2VkQml0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICBfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6IGNhbGN1bGF0ZUNoYW5nZWRCaXRzLFxuICAgIC8vIEFzIGEgd29ya2Fyb3VuZCB0byBzdXBwb3J0IG11bHRpcGxlIGNvbmN1cnJlbnQgcmVuZGVyZXJzLCB3ZSBjYXRlZ29yaXplXG4gICAgLy8gc29tZSByZW5kZXJlcnMgYXMgcHJpbWFyeSBhbmQgb3RoZXJzIGFzIHNlY29uZGFyeS4gV2Ugb25seSBleHBlY3RcbiAgICAvLyB0aGVyZSB0byBiZSB0d28gY29uY3VycmVudCByZW5kZXJlcnMgYXQgbW9zdDogUmVhY3QgTmF0aXZlIChwcmltYXJ5KSBhbmRcbiAgICAvLyBGYWJyaWMgKHNlY29uZGFyeSk7IFJlYWN0IERPTSAocHJpbWFyeSkgYW5kIFJlYWN0IEFSVCAoc2Vjb25kYXJ5KS5cbiAgICAvLyBTZWNvbmRhcnkgcmVuZGVyZXJzIHN0b3JlIHRoZWlyIGNvbnRleHQgdmFsdWVzIG9uIHNlcGFyYXRlIGZpZWxkcy5cbiAgICBfY3VycmVudFZhbHVlOiBkZWZhdWx0VmFsdWUsXG4gICAgX2N1cnJlbnRWYWx1ZTI6IGRlZmF1bHRWYWx1ZSxcbiAgICAvLyBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGNvbmN1cnJlbnQgcmVuZGVyZXJzIHRoaXMgY29udGV4dCBjdXJyZW50bHlcbiAgICAvLyBzdXBwb3J0cyB3aXRoaW4gaW4gYSBzaW5nbGUgcmVuZGVyZXIuIFN1Y2ggYXMgcGFyYWxsZWwgc2VydmVyIHJlbmRlcmluZy5cbiAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgLy8gVGhlc2UgYXJlIGNpcmN1bGFyXG4gICAgUHJvdmlkZXI6IG51bGwsXG4gICAgQ29uc3VtZXI6IG51bGxcbiAgfTtcbiAgY29udGV4dC5Qcm92aWRlciA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfUFJPVklERVJfVFlQRSxcbiAgICBfY29udGV4dDogY29udGV4dFxuICB9O1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0c1xuICAgIH07IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG5vdCBzZXR0aW5nIGEgdmFsdWUsIHdoaWNoIGlzIGludGVudGlvbmFsIGhlcmVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENvbnN1bWVyLCB7XG4gICAgICBQcm92aWRlcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuUHJvdmlkZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuUHJvdmlkZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuQ29uc3VtZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBkaXNwbGF5TmFtZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5kaXNwbGF5TmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyKSB7XG4gICAgICAgICAgICB3YXJuKCdTZXR0aW5nIGBkaXNwbGF5TmFtZWAgb24gQ29udGV4dC5Db25zdW1lciBoYXMgbm8gZWZmZWN0LiAnICsgXCJZb3Ugc2hvdWxkIHNldCBpdCBkaXJlY3RseSBvbiB0aGUgY29udGV4dCB3aXRoIENvbnRleHQuZGlzcGxheU5hbWUgPSAnJXMnLlwiLCBkaXNwbGF5TmFtZSk7XG5cbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG5cbiAgICBjb250ZXh0LkNvbnN1bWVyID0gQ29uc3VtZXI7XG4gIH1cblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gbnVsbDtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0O1xufVxuXG52YXIgVW5pbml0aWFsaXplZCA9IC0xO1xudmFyIFBlbmRpbmcgPSAwO1xudmFyIFJlc29sdmVkID0gMTtcbnZhciBSZWplY3RlZCA9IDI7XG5cbmZ1bmN0aW9uIGxhenlJbml0aWFsaXplcihwYXlsb2FkKSB7XG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFVuaW5pdGlhbGl6ZWQpIHtcbiAgICB2YXIgY3RvciA9IHBheWxvYWQuX3Jlc3VsdDtcbiAgICB2YXIgdGhlbmFibGUgPSBjdG9yKCk7IC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG5cbiAgICB2YXIgcGVuZGluZyA9IHBheWxvYWQ7XG4gICAgcGVuZGluZy5fc3RhdHVzID0gUGVuZGluZztcbiAgICBwZW5kaW5nLl9yZXN1bHQgPSB0aGVuYWJsZTtcbiAgICB0aGVuYWJsZS50aGVuKGZ1bmN0aW9uIChtb2R1bGVPYmplY3QpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRFeHBvcnQgPSBtb2R1bGVPYmplY3QuZGVmYXVsdDtcblxuICAgICAgICB7XG4gICAgICAgICAgaWYgKGRlZmF1bHRFeHBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZXJyb3IoJ2xhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcG9ydCgpIGNhbGwuICcgKyAnSW5zdGVhZCByZWNlaXZlZDogJXNcXG5cXG5Zb3VyIGNvZGUgc2hvdWxkIGxvb2sgbGlrZTogXFxuICAnICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICdjb25zdCBNeUNvbXBvbmVudCA9IGxhenkoKCkgPT4gaW1wJyArIFwib3J0KCcuL015Q29tcG9uZW50JykpXCIsIG1vZHVsZU9iamVjdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG5cblxuICAgICAgICB2YXIgcmVzb2x2ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZXNvbHZlZC5fc3RhdHVzID0gUmVzb2x2ZWQ7XG4gICAgICAgIHJlc29sdmVkLl9yZXN1bHQgPSBkZWZhdWx0RXhwb3J0O1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZykge1xuICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuICAgICAgICB2YXIgcmVqZWN0ZWQgPSBwYXlsb2FkO1xuICAgICAgICByZWplY3RlZC5fc3RhdHVzID0gUmVqZWN0ZWQ7XG4gICAgICAgIHJlamVjdGVkLl9yZXN1bHQgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFJlc29sdmVkKSB7XG4gICAgcmV0dXJuIHBheWxvYWQuX3Jlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBwYXlsb2FkLl9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbGF6eShjdG9yKSB7XG4gIHZhciBwYXlsb2FkID0ge1xuICAgIC8vIFdlIHVzZSB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiAtMSxcbiAgICBfcmVzdWx0OiBjdG9yXG4gIH07XG4gIHZhciBsYXp5VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgIF9wYXlsb2FkOiBwYXlsb2FkLFxuICAgIF9pbml0OiBsYXp5SW5pdGlhbGl6ZXJcbiAgfTtcblxuICB7XG4gICAgLy8gSW4gcHJvZHVjdGlvbiwgdGhpcyB3b3VsZCBqdXN0IHNldCBpdCBvbiB0aGUgb2JqZWN0LlxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG4gICAgdmFyIHByb3BUeXBlczsgLy8gJEZsb3dGaXhNZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eVR5cGUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvcHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RlZmF1bHRQcm9wcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBkZWZhdWx0UHJvcHMgPSBuZXdEZWZhdWx0UHJvcHM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ2RlZmF1bHRQcm9wcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHByb3BUeXBlczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBwcm9wVHlwZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld1Byb3BUeXBlcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBwcm9wVHlwZXNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBwcm9wVHlwZXMgPSBuZXdQcm9wVHlwZXM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuICAgICAgICAgIC8vICRGbG93Rml4TWVcblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsYXp5VHlwZSwgJ3Byb3BUeXBlcycsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGxhenlUeXBlO1xufVxuXG5mdW5jdGlvbiBmb3J3YXJkUmVmKHJlbmRlcikge1xuICB7XG4gICAgaWYgKHJlbmRlciAhPSBudWxsICYmIHJlbmRlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgcmVjZWl2ZWQgYSBgbWVtb2AgJyArICdjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgJyArICdtZW1vKGZvcndhcmRSZWYoLi4uKSkuJyk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVuZGVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignZm9yd2FyZFJlZiByZXF1aXJlcyBhIHJlbmRlciBmdW5jdGlvbiBidXQgd2FzIGdpdmVuICVzLicsIHJlbmRlciA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiByZW5kZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVuZGVyLmxlbmd0aCAhPT0gMCAmJiByZW5kZXIubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgYWNjZXB0IGV4YWN0bHkgdHdvIHBhcmFtZXRlcnM6IHByb3BzIGFuZCByZWYuICVzJywgcmVuZGVyLmxlbmd0aCA9PT0gMSA/ICdEaWQgeW91IGZvcmdldCB0byB1c2UgdGhlIHJlZiBwYXJhbWV0ZXI/JyA6ICdBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbmRlciAhPSBudWxsKSB7XG4gICAgICBpZiAocmVuZGVyLmRlZmF1bHRQcm9wcyAhPSBudWxsIHx8IHJlbmRlci5wcm9wVHlwZXMgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHByb3BUeXBlcyBvciBkZWZhdWx0UHJvcHMuICcgKyAnRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUsXG4gICAgcmVuZGVyOiByZW5kZXJcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lO1xuXG4gICAgICAgIGlmIChyZW5kZXIuZGlzcGxheU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgIHJlbmRlci5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVTY29wZUFQSSA9IGZhbHNlOyAvLyBFeHBlcmltZW50YWwgQ3JlYXRlIEV2ZW50IEhhbmRsZSBBUEkuXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBOb3RlOiB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyAoZS5nLiBpZiBpdCdzIGEgcG9seWZpbGwpLlxuXG5cbiAgaWYgKHR5cGUgPT09IGV4cG9ydHMuRnJhZ21lbnQgfHwgdHlwZSA9PT0gZXhwb3J0cy5Qcm9maWxlciB8fCB0eXBlID09PSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSB8fCB0eXBlID09PSBleHBvcnRzLlN0cmljdE1vZGUgfHwgdHlwZSA9PT0gZXhwb3J0cy5TdXNwZW5zZSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUgfHwgdHlwZVswXSA9PT0gUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbWVtbyh0eXBlLCBjb21wYXJlKSB7XG4gIHtcbiAgICBpZiAoIWlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSkge1xuICAgICAgZXJyb3IoJ21lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkICcgKyAncmVjZWl2ZWQ6ICVzJywgdHlwZSA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiB0eXBlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudFR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTtcblxuICAgICAgICBpZiAodHlwZS5kaXNwbGF5TmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50VHlwZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpc3BhdGNoZXIoKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50O1xuXG4gIGlmICghKGRpc3BhdGNoZXIgIT09IG51bGwpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiSW52YWxpZCBob29rIGNhbGwuIEhvb2tzIGNhbiBvbmx5IGJlIGNhbGxlZCBpbnNpZGUgb2YgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbiBjb21wb25lbnQuIFRoaXMgY291bGQgaGFwcGVuIGZvciBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbjEuIFlvdSBtaWdodCBoYXZlIG1pc21hdGNoaW5nIHZlcnNpb25zIG9mIFJlYWN0IGFuZCB0aGUgcmVuZGVyZXIgKHN1Y2ggYXMgUmVhY3QgRE9NKVxcbjIuIFlvdSBtaWdodCBiZSBicmVha2luZyB0aGUgUnVsZXMgb2YgSG9va3NcXG4zLiBZb3UgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QgaW4gdGhlIHNhbWUgYXBwXFxuU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gdXNlQ29udGV4dChDb250ZXh0LCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuXG4gIHtcbiAgICBpZiAodW5zdGFibGVfb2JzZXJ2ZWRCaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yKCd1c2VDb250ZXh0KCkgc2Vjb25kIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgJyArICd1c2UgaW4gUmVhY3QuIFBhc3NpbmcgaXQgaXMgbm90IHN1cHBvcnRlZC4gJyArICdZb3UgcGFzc2VkOiAlcy4lcycsIHVuc3RhYmxlX29ic2VydmVkQml0cywgdHlwZW9mIHVuc3RhYmxlX29ic2VydmVkQml0cyA9PT0gJ251bWJlcicgJiYgQXJyYXkuaXNBcnJheShhcmd1bWVudHNbMl0pID8gJ1xcblxcbkRpZCB5b3UgY2FsbCBhcnJheS5tYXAodXNlQ29udGV4dCk/ICcgKyAnQ2FsbGluZyBIb29rcyBpbnNpZGUgYSBsb29wIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcnVsZXMtb2YtaG9va3MnIDogJycpO1xuICAgIH0gLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuXG5cbiAgICBpZiAoQ29udGV4dC5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVhbENvbnRleHQgPSBDb250ZXh0Ll9jb250ZXh0OyAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG5cbiAgICAgIGlmIChyZWFsQ29udGV4dC5Db25zdW1lciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuUHJvdmlkZXIpIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyO1xudmFyIHByZWZpeDtcbmZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgaWYgKHByZWZpeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBFeHRyYWN0IHRoZSBWTSBzcGVjaWZpYyBwcmVmaXggdXNlZCBieSBlYWNoIGxpbmUuXG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICB2YXIgbWF0Y2ggPSB4LnN0YWNrLnRyaW0oKS5tYXRjaCgvXFxuKCAqKGF0ICk/KS8pO1xuICAgICAgICBwcmVmaXggPSBtYXRjaCAmJiBtYXRjaFsxXSB8fCAnJztcbiAgICAgIH1cbiAgICB9IC8vIFdlIHVzZSB0aGUgcHJlZml4IHRvIGVuc3VyZSBvdXIgc3RhY2tzIGxpbmUgdXAgd2l0aCBuYXRpdmUgc3RhY2sgZnJhbWVzLlxuXG5cbiAgICByZXR1cm4gJ1xcbicgKyBwcmVmaXggKyBuYW1lO1xuICB9XG59XG52YXIgcmVlbnRyeSA9IGZhbHNlO1xudmFyIGNvbXBvbmVudEZyYW1lQ2FjaGU7XG5cbntcbiAgdmFyIFBvc3NpYmx5V2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gV2Vha01hcCA6IE1hcDtcbiAgY29tcG9uZW50RnJhbWVDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtNYXAoKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gIC8vIElmIHNvbWV0aGluZyBhc2tlZCBmb3IgYSBzdGFjayBpbnNpZGUgYSBmYWtlIHJlbmRlciwgaXQgc2hvdWxkIGdldCBpZ25vcmVkLlxuICBpZiAoIWZuIHx8IHJlZW50cnkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB7XG4gICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmcmFtZTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29udHJvbDtcbiAgcmVlbnRyeSA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7IC8vICRGbG93Rml4TWUgSXQgZG9lcyBhY2NlcHQgdW5kZWZpbmVkLlxuXG4gIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gdW5kZWZpbmVkO1xuICB2YXIgcHJldmlvdXNEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICBwcmV2aW91c0Rpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldmlvdXNEaXNwYXRjaGVyO1xuICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgfVxuXG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2aW91c1ByZXBhcmVTdGFja1RyYWNlO1xuICB9IC8vIEZhbGxiYWNrIHRvIGp1c3QgdXNpbmcgdGhlIG5hbWUgaWYgd2UgY291bGRuJ3QgbWFrZSBpdCB0aHJvdy5cblxuXG4gIHZhciBuYW1lID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogJyc7XG4gIHZhciBzeW50aGV0aWNGcmFtZSA9IG5hbWUgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lKSA6ICcnO1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc3ludGhldGljRnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzeW50aGV0aWNGcmFtZTtcbn1cbmZ1bmN0aW9uIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZShmbiwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpIHtcbiAgdmFyIHByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gIHJldHVybiAhIShwcm90b3R5cGUgJiYgcHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSwgc291cmNlLCBvd25lckZuKSB7XG5cbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHtcbiAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUsIHNob3VsZENvbnN0cnVjdCh0eXBlKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSh0eXBlKTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgZXhwb3J0cy5TdXNwZW5zZTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLnJlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAvLyBNZW1vIG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUudHlwZSwgc291cmNlLCBvd25lckZuKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTGF6eSBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoaW5pdChwYXlsb2FkKSwgc291cmNlLCBvd25lckZuKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcy5fX3NvdXJjZSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAge1xuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCk7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcblxuICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShjaGlsZCwgcGFyZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgIC8vIGJ1dCBub3cgd2UgcHJpbnQgYSBzZXBhcmF0ZSB3YXJuaW5nIGZvciB0aGVtIGxhdGVyLlxuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoc3RlcC52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCB8fCB0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKTtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUuUHJvcFR5cGVzICE9PSB1bmRlZmluZWQgJiYgIXByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duKSB7XG4gICAgICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IHRydWU7IC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG5cbiAgICAgIHZhciBfbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG5cbiAgICAgIGVycm9yKCdDb21wb25lbnQgJXMgZGVjbGFyZWQgYFByb3BUeXBlc2AgaW5zdGVhZCBvZiBgcHJvcFR5cGVzYC4gRGlkIHlvdSBtaXNzcGVsbCB0aGUgcHJvcGVydHkgYXNzaWdubWVudD8nLCBfbmFtZSB8fCAnVW5rbm93bicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdHlwZS5nZXREZWZhdWx0UHJvcHMgPT09ICdmdW5jdGlvbicgJiYgIXR5cGUuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkKSB7XG4gICAgICBlcnJvcignZ2V0RGVmYXVsdFByb3BzIGlzIG9ubHkgdXNlZCBvbiBjbGFzc2ljIFJlYWN0LmNyZWF0ZUNsYXNzICcgKyAnZGVmaW5pdGlvbnMuIFVzZSBhIHN0YXRpYyBwcm9wZXJ0eSBuYW1lZCBgZGVmYXVsdFByb3BzYCBpbnN0ZWFkLicpO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhIGZyYWdtZW50LCB2YWxpZGF0ZSB0aGF0IGl0IGNhbiBvbmx5IGJlIHByb3ZpZGVkIHdpdGggZnJhZ21lbnQgcHJvcHNcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBmcmFnbWVudFxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVGcmFnbWVudFByb3BzKGZyYWdtZW50KSB7XG4gIHtcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZyYWdtZW50LnByb3BzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG5cbiAgICAgIGlmIChrZXkgIT09ICdjaGlsZHJlbicgJiYga2V5ICE9PSAna2V5Jykge1xuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgICBlcnJvcignSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gJyArICdSZWFjdC5GcmFnbWVudCBjYW4gb25seSBoYXZlIGBrZXlgIGFuZCBgY2hpbGRyZW5gIHByb3BzLicsIGtleSk7XG5cbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZyYWdtZW50LnJlZiAhPT0gbnVsbCkge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgIGVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBgcmVmYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLicpO1xuXG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gIGlmICghdmFsaWRUeXBlKSB7XG4gICAgdmFyIGluZm8gPSAnJztcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhwcm9wcyk7XG5cbiAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgIH1cblxuICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50KSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG57XG5cbiAgdHJ5IHtcbiAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbZnJvemVuT2JqZWN0LCBudWxsXV0pO1xuICAgIG5ldyBTZXQoW2Zyb3plbk9iamVjdF0pO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tbmV3ICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxufVxuXG52YXIgY3JlYXRlRWxlbWVudCQxID0gIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY2xvbmVFbGVtZW50JDEgPSAgY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNyZWF0ZUZhY3RvcnkgPSAgY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uIDtcbnZhciBDaGlsZHJlbiA9IHtcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgZm9yRWFjaDogZm9yRWFjaENoaWxkcmVuLFxuICBjb3VudDogY291bnRDaGlsZHJlbixcbiAgdG9BcnJheTogdG9BcnJheSxcbiAgb25seTogb25seUNoaWxkXG59O1xuXG5leHBvcnRzLkNoaWxkcmVuID0gQ2hpbGRyZW47XG5leHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IFB1cmVDb21wb25lbnQ7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MC4yMC4yXG4gKiBzY2hlZHVsZXItdHJhY2luZy5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBERUZBVUxUX1RIUkVBRF9JRCA9IDA7IC8vIENvdW50ZXJzIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEcy5cblxudmFyIGludGVyYWN0aW9uSURDb3VudGVyID0gMDtcbnZhciB0aHJlYWRJRENvdW50ZXIgPSAwOyAvLyBTZXQgb2YgY3VycmVudGx5IHRyYWNlZCBpbnRlcmFjdGlvbnMuXG4vLyBJbnRlcmFjdGlvbnMgXCJzdGFja1wi4oCTXG4vLyBNZWFuaW5nIHRoYXQgbmV3bHkgdHJhY2VkIGludGVyYWN0aW9ucyBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZXZpb3VzbHkgYWN0aXZlIHNldC5cbi8vIFdoZW4gYW4gaW50ZXJhY3Rpb24gZ29lcyBvdXQgb2Ygc2NvcGUsIHRoZSBwcmV2aW91cyBzZXQgKGlmIGFueSkgaXMgcmVzdG9yZWQuXG5cbmV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYgPSBudWxsOyAvLyBMaXN0ZW5lcihzKSB0byBub3RpZnkgd2hlbiBpbnRlcmFjdGlvbnMgYmVnaW4gYW5kIGVuZC5cblxuZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYgPSBudWxsO1xuXG57XG4gIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYgPSB7XG4gICAgY3VycmVudDogbmV3IFNldCgpXG4gIH07XG4gIGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX2NsZWFyKGNhbGxiYWNrKSB7XG5cbiAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IG5ldyBTZXQoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHByZXZJbnRlcmFjdGlvbnM7XG4gIH1cbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnQoKSB7XG4gIHtcbiAgICByZXR1cm4gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICB9XG59XG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRUaHJlYWRJRCgpIHtcbiAgcmV0dXJuICsrdGhyZWFkSURDb3VudGVyO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfdHJhY2UobmFtZSwgdGltZXN0YW1wLCBjYWxsYmFjaykge1xuICB2YXIgdGhyZWFkSUQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IERFRkFVTFRfVEhSRUFEX0lEO1xuXG4gIHZhciBpbnRlcmFjdGlvbiA9IHtcbiAgICBfX2NvdW50OiAxLFxuICAgIGlkOiBpbnRlcmFjdGlvbklEQ291bnRlcisrLFxuICAgIG5hbWU6IG5hbWUsXG4gICAgdGltZXN0YW1wOiB0aW1lc3RhbXBcbiAgfTtcbiAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7IC8vIFRyYWNlZCBpbnRlcmFjdGlvbnMgc2hvdWxkIHN0YWNrL2FjY3VtdWxhdGUuXG4gIC8vIFRvIGRvIHRoYXQsIGNsb25lIHRoZSBjdXJyZW50IGludGVyYWN0aW9ucy5cbiAgLy8gVGhlIHByZXZpb3VzIHNldCB3aWxsIGJlIHJlc3RvcmVkIHVwb24gY29tcGxldGlvbi5cblxuICB2YXIgaW50ZXJhY3Rpb25zID0gbmV3IFNldChwcmV2SW50ZXJhY3Rpb25zKTtcbiAgaW50ZXJhY3Rpb25zLmFkZChpbnRlcmFjdGlvbik7XG4gIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IGludGVyYWN0aW9ucztcbiAgdmFyIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuICB2YXIgcmV0dXJuVmFsdWU7XG5cbiAgdHJ5IHtcbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uVHJhY2VkKGludGVyYWN0aW9uKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTsgLy8gSWYgbm8gYXN5bmMgd29yayB3YXMgc2NoZWR1bGVkIGZvciB0aGlzIGludGVyYWN0aW9uLFxuICAgICAgICAgIC8vIE5vdGlmeSBzdWJzY3JpYmVycyB0aGF0IGl0J3MgY29tcGxldGVkLlxuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfd3JhcChjYWxsYmFjaykge1xuICB2YXIgdGhyZWFkSUQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IERFRkFVTFRfVEhSRUFEX0lEO1xuXG4gIHZhciB3cmFwcGVkSW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICB2YXIgc3Vic2NyaWJlciA9IGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICBzdWJzY3JpYmVyLm9uV29ya1NjaGVkdWxlZCh3cmFwcGVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gIH0gLy8gVXBkYXRlIHRoZSBwZW5kaW5nIGFzeW5jIHdvcmsgY291bnQgZm9yIHRoZSBjdXJyZW50IGludGVyYWN0aW9ucy5cbiAgLy8gVXBkYXRlIGFmdGVyIGNhbGxpbmcgc3Vic2NyaWJlcnMgaW4gY2FzZSBvZiBlcnJvci5cblxuXG4gIHdyYXBwZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gIH0pO1xuICB2YXIgaGFzUnVuID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gd3JhcHBlZCgpIHtcbiAgICB2YXIgcHJldkludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSB3cmFwcGVkSW50ZXJhY3Rpb25zO1xuICAgIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXR1cm5WYWx1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0YXJ0ZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVyblZhbHVlID0gY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHByZXZJbnRlcmFjdGlvbnM7XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdG9wcGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIWhhc1J1bikge1xuICAgICAgICAvLyBXZSBvbmx5IGV4cGVjdCBhIHdyYXBwZWQgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgb25jZSxcbiAgICAgICAgLy8gQnV0IGluIHRoZSBldmVudCB0aGF0IGl0J3MgZXhlY3V0ZWQgbW9yZSB0aGFuIG9uY2XigJNcbiAgICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIG91dHN0YW5kaW5nIGludGVyYWN0aW9uIGNvdW50cyBvbmNlLlxuICAgICAgICBoYXNSdW4gPSB0cnVlOyAvLyBVcGRhdGUgcGVuZGluZyBhc3luYyBjb3VudHMgZm9yIGFsbCB3cmFwcGVkIGludGVyYWN0aW9ucy5cbiAgICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGxhc3Qgc2NoZWR1bGVkIGFzeW5jIHdvcmsgZm9yIGFueSBvZiB0aGVtLFxuICAgICAgICAvLyBNYXJrIHRoZW0gYXMgY29tcGxldGVkLlxuXG4gICAgICAgIHdyYXBwZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50LS07XG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdyYXBwZWQuY2FuY2VsID0gZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIHN1YnNjcmliZXIgPSBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN1YnNjcmliZXIub25Xb3JrQ2FuY2VsZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBVcGRhdGUgcGVuZGluZyBhc3luYyBjb3VudHMgZm9yIGFsbCB3cmFwcGVkIGludGVyYWN0aW9ucy5cbiAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IHNjaGVkdWxlZCBhc3luYyB3b3JrIGZvciBhbnkgb2YgdGhlbSxcbiAgICAgIC8vIE1hcmsgdGhlbSBhcyBjb21wbGV0ZWQuXG4gICAgICB3cmFwcGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICBpZiAoc3Vic2NyaWJlciAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gd3JhcHBlZDtcbn1cblxudmFyIHN1YnNjcmliZXJzID0gbnVsbDtcblxue1xuICBzdWJzY3JpYmVycyA9IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHtcbiAge1xuICAgIHN1YnNjcmliZXJzLmFkZChzdWJzY3JpYmVyKTtcblxuICAgIGlmIChzdWJzY3JpYmVycy5zaXplID09PSAxKSB7XG4gICAgICBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50ID0ge1xuICAgICAgICBvbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZDogb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQsXG4gICAgICAgIG9uSW50ZXJhY3Rpb25UcmFjZWQ6IG9uSW50ZXJhY3Rpb25UcmFjZWQsXG4gICAgICAgIG9uV29ya0NhbmNlbGVkOiBvbldvcmtDYW5jZWxlZCxcbiAgICAgICAgb25Xb3JrU2NoZWR1bGVkOiBvbldvcmtTY2hlZHVsZWQsXG4gICAgICAgIG9uV29ya1N0YXJ0ZWQ6IG9uV29ya1N0YXJ0ZWQsXG4gICAgICAgIG9uV29ya1N0b3BwZWQ6IG9uV29ya1N0b3BwZWRcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB1bnN0YWJsZV91bnN1YnNjcmliZShzdWJzY3JpYmVyKSB7XG4gIHtcbiAgICBzdWJzY3JpYmVycy5kZWxldGUoc3Vic2NyaWJlcik7XG5cbiAgICBpZiAoc3Vic2NyaWJlcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25UcmFjZWQoaW50ZXJhY3Rpb24pIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25UcmFjZWQoaW50ZXJhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Xb3JrU2NoZWR1bGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1NjaGVkdWxlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1N0YXJ0ZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Xb3JrU3RvcHBlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKSB7XG4gIHZhciBkaWRDYXRjaEVycm9yID0gZmFsc2U7XG4gIHZhciBjYXVnaHRFcnJvciA9IG51bGw7XG4gIHN1YnNjcmliZXJzLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmliZXIpIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTdG9wcGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya0NhbmNlbGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya0NhbmNlbGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmV4cG9ydHMudW5zdGFibGVfY2xlYXIgPSB1bnN0YWJsZV9jbGVhcjtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudCA9IHVuc3RhYmxlX2dldEN1cnJlbnQ7XG5leHBvcnRzLnVuc3RhYmxlX2dldFRocmVhZElEID0gdW5zdGFibGVfZ2V0VGhyZWFkSUQ7XG5leHBvcnRzLnVuc3RhYmxlX3N1YnNjcmliZSA9IHVuc3RhYmxlX3N1YnNjcmliZTtcbmV4cG9ydHMudW5zdGFibGVfdHJhY2UgPSB1bnN0YWJsZV90cmFjZTtcbmV4cG9ydHMudW5zdGFibGVfdW5zdWJzY3JpYmUgPSB1bnN0YWJsZV91bnN1YnNjcmliZTtcbmV4cG9ydHMudW5zdGFibGVfd3JhcCA9IHVuc3RhYmxlX3dyYXA7XG4gIH0pKCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjAuMjAuMlxuICogc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIGVuYWJsZVNjaGVkdWxlckRlYnVnZ2luZyA9IGZhbHNlO1xudmFyIGVuYWJsZVByb2ZpbGluZyA9IGZhbHNlO1xuXG52YXIgcmVxdWVzdEhvc3RDYWxsYmFjaztcbnZhciByZXF1ZXN0SG9zdFRpbWVvdXQ7XG52YXIgY2FuY2VsSG9zdFRpbWVvdXQ7XG52YXIgcmVxdWVzdFBhaW50O1xudmFyIGhhc1BlcmZvcm1hbmNlTm93ID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGVyZm9ybWFuY2Uubm93ID09PSAnZnVuY3Rpb24nO1xuXG5pZiAoaGFzUGVyZm9ybWFuY2VOb3cpIHtcbiAgdmFyIGxvY2FsUGVyZm9ybWFuY2UgPSBwZXJmb3JtYW5jZTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICB2YXIgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICB9O1xufVxuXG5pZiAoIC8vIElmIFNjaGVkdWxlciBydW5zIGluIGEgbm9uLURPTSBlbnZpcm9ubWVudCwgaXQgZmFsbHMgYmFjayB0byBhIG5haXZlXG4vLyBpbXBsZW1lbnRhdGlvbiB1c2luZyBzZXRUaW1lb3V0LlxudHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgLy8gQ2hlY2sgaWYgTWVzc2FnZUNoYW5uZWwgaXMgc3VwcG9ydGVkLCB0b28uXG50eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICdmdW5jdGlvbicpIHtcbiAgLy8gSWYgdGhpcyBhY2NpZGVudGFsbHkgZ2V0cyBpbXBvcnRlZCBpbiBhIG5vbi1icm93c2VyIGVudmlyb25tZW50LCBlLmcuIEphdmFTY3JpcHRDb3JlLFxuICAvLyBmYWxsYmFjayB0byBhIG5haXZlIGltcGxlbWVudGF0aW9uLlxuICB2YXIgX2NhbGxiYWNrID0gbnVsbDtcbiAgdmFyIF90aW1lb3V0SUQgPSBudWxsO1xuXG4gIHZhciBfZmx1c2hDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoX2NhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICB2YXIgaGFzUmVtYWluaW5nVGltZSA9IHRydWU7XG5cbiAgICAgICAgX2NhbGxiYWNrKGhhc1JlbWFpbmluZ1RpbWUsIGN1cnJlbnRUaW1lKTtcblxuICAgICAgICBfY2FsbGJhY2sgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZXRUaW1lb3V0KF9mbHVzaENhbGxiYWNrLCAwKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmVxdWVzdEhvc3RDYWxsYmFjayA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIC8vIFByb3RlY3QgYWdhaW5zdCByZS1lbnRyYW5jeS5cbiAgICAgIHNldFRpbWVvdXQocmVxdWVzdEhvc3RDYWxsYmFjaywgMCwgY2IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfY2FsbGJhY2sgPSBjYjtcbiAgICAgIHNldFRpbWVvdXQoX2ZsdXNoQ2FsbGJhY2ssIDApO1xuICAgIH1cbiAgfTtcblxuICByZXF1ZXN0SG9zdFRpbWVvdXQgPSBmdW5jdGlvbiAoY2IsIG1zKSB7XG4gICAgX3RpbWVvdXRJRCA9IHNldFRpbWVvdXQoY2IsIG1zKTtcbiAgfTtcblxuICBjYW5jZWxIb3N0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbGVhclRpbWVvdXQoX3RpbWVvdXRJRCk7XG4gIH07XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgcmVxdWVzdFBhaW50ID0gZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZ1bmN0aW9uICgpIHt9O1xufSBlbHNlIHtcbiAgLy8gQ2FwdHVyZSBsb2NhbCByZWZlcmVuY2VzIHRvIG5hdGl2ZSBBUElzLCBpbiBjYXNlIGEgcG9seWZpbGwgb3ZlcnJpZGVzIHRoZW0uXG4gIHZhciBfc2V0VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0O1xuICB2YXIgX2NsZWFyVGltZW91dCA9IHdpbmRvdy5jbGVhclRpbWVvdXQ7XG5cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIFRPRE86IFNjaGVkdWxlciBubyBsb25nZXIgcmVxdWlyZXMgdGhlc2UgbWV0aG9kcyB0byBiZSBwb2x5ZmlsbGVkLiBCdXRcbiAgICAvLyBtYXliZSB3ZSB3YW50IHRvIGNvbnRpbnVlIHdhcm5pbmcgaWYgdGhleSBkb24ndCBleGlzdCwgdG8gcHJlc2VydmUgdGhlXG4gICAgLy8gb3B0aW9uIHRvIHJlbHkgb24gaXQgaW4gdGhlIGZ1dHVyZT9cbiAgICB2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTtcbiAgICB2YXIgY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XG5cbiAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgICBjb25zb2xlWydlcnJvciddKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuIFwiICsgJ01ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FuY2VsQW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgICAgY29uc29sZVsnZXJyb3InXShcIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgY2FuY2VsQW5pbWF0aW9uRnJhbWUuIFwiICsgJ01ha2Ugc3VyZSB0aGF0IHlvdSBsb2FkIGEgJyArICdwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3JlYWN0LXBvbHlmaWxscycpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICB2YXIgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbiAgdmFyIHRhc2tUaW1lb3V0SUQgPSAtMTsgLy8gU2NoZWR1bGVyIHBlcmlvZGljYWxseSB5aWVsZHMgaW4gY2FzZSB0aGVyZSBpcyBvdGhlciB3b3JrIG9uIHRoZSBtYWluXG4gIC8vIHRocmVhZCwgbGlrZSB1c2VyIGV2ZW50cy4gQnkgZGVmYXVsdCwgaXQgeWllbGRzIG11bHRpcGxlIHRpbWVzIHBlciBmcmFtZS5cbiAgLy8gSXQgZG9lcyBub3QgYXR0ZW1wdCB0byBhbGlnbiB3aXRoIGZyYW1lIGJvdW5kYXJpZXMsIHNpbmNlIG1vc3QgdGFza3MgZG9uJ3RcbiAgLy8gbmVlZCB0byBiZSBmcmFtZSBhbGlnbmVkOyBmb3IgdGhvc2UgdGhhdCBkbywgdXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZS5cblxuICB2YXIgeWllbGRJbnRlcnZhbCA9IDU7XG4gIHZhciBkZWFkbGluZSA9IDA7IC8vIFRPRE86IE1ha2UgdGhpcyBjb25maWd1cmFibGVcblxuICB7XG4gICAgLy8gYGlzSW5wdXRQZW5kaW5nYCBpcyBub3QgYXZhaWxhYmxlLiBTaW5jZSB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nIGlmXG4gICAgLy8gdGhlcmUncyBwZW5kaW5nIGlucHV0LCBhbHdheXMgeWllbGQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUuXG4gICAgZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpID49IGRlYWRsaW5lO1xuICAgIH07IC8vIFNpbmNlIHdlIHlpZWxkIGV2ZXJ5IGZyYW1lIHJlZ2FyZGxlc3MsIGByZXF1ZXN0UGFpbnRgIGhhcyBubyBlZmZlY3QuXG5cblxuICAgIHJlcXVlc3RQYWludCA9IGZ1bmN0aW9uICgpIHt9O1xuICB9XG5cbiAgZXhwb3J0cy51bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSA9IGZ1bmN0aW9uIChmcHMpIHtcbiAgICBpZiAoZnBzIDwgMCB8fCBmcHMgPiAxMjUpIHtcbiAgICAgIC8vIFVzaW5nIGNvbnNvbGVbJ2Vycm9yJ10gdG8gZXZhZGUgQmFiZWwgYW5kIEVTTGludFxuICAgICAgY29uc29sZVsnZXJyb3InXSgnZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsICcgKyAnZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZnBzID4gMCkge1xuICAgICAgeWllbGRJbnRlcnZhbCA9IE1hdGguZmxvb3IoMTAwMCAvIGZwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlc2V0IHRoZSBmcmFtZXJhdGVcbiAgICAgIHlpZWxkSW50ZXJ2YWwgPSA1O1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7IC8vIFlpZWxkIGFmdGVyIGB5aWVsZEludGVydmFsYCBtcywgcmVnYXJkbGVzcyBvZiB3aGVyZSB3ZSBhcmUgaW4gdGhlIHZzeW5jXG4gICAgICAvLyBjeWNsZS4gVGhpcyBtZWFucyB0aGVyZSdzIGFsd2F5cyB0aW1lIHJlbWFpbmluZyBhdCB0aGUgYmVnaW5uaW5nIG9mXG4gICAgICAvLyB0aGUgbWVzc2FnZSBldmVudC5cblxuICAgICAgZGVhZGxpbmUgPSBjdXJyZW50VGltZSArIHlpZWxkSW50ZXJ2YWw7XG4gICAgICB2YXIgaGFzVGltZVJlbWFpbmluZyA9IHRydWU7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBoYXNNb3JlV29yayA9IHNjaGVkdWxlZEhvc3RDYWxsYmFjayhoYXNUaW1lUmVtYWluaW5nLCBjdXJyZW50VGltZSk7XG5cbiAgICAgICAgaWYgKCFoYXNNb3JlV29yaykge1xuICAgICAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgc2NoZWR1bGVkSG9zdENhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgd29yaywgc2NoZWR1bGUgdGhlIG5leHQgbWVzc2FnZSBldmVudCBhdCB0aGUgZW5kXG4gICAgICAgICAgLy8gb2YgdGhlIHByZWNlZGluZyBvbmUuXG4gICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgYSBzY2hlZHVsZXIgdGFzayB0aHJvd3MsIGV4aXQgdGhlIGN1cnJlbnQgYnJvd3NlciB0YXNrIHNvIHRoZVxuICAgICAgICAvLyBlcnJvciBjYW4gYmUgb2JzZXJ2ZWQuXG4gICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpc01lc3NhZ2VMb29wUnVubmluZyA9IGZhbHNlO1xuICAgIH0gLy8gWWllbGRpbmcgdG8gdGhlIGJyb3dzZXIgd2lsbCBnaXZlIGl0IGEgY2hhbmNlIHRvIHBhaW50LCBzbyB3ZSBjYW5cbiAgfTtcblxuICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICB2YXIgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuXG4gIHJlcXVlc3RIb3N0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgIGlmICghaXNNZXNzYWdlTG9vcFJ1bm5pbmcpIHtcbiAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gdHJ1ZTtcbiAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIHJlcXVlc3RIb3N0VGltZW91dCA9IGZ1bmN0aW9uIChjYWxsYmFjaywgbXMpIHtcbiAgICB0YXNrVGltZW91dElEID0gX3NldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gICAgfSwgbXMpO1xuICB9O1xuXG4gIGNhbmNlbEhvc3RUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIF9jbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCk7XG5cbiAgICB0YXNrVGltZW91dElEID0gLTE7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHB1c2goaGVhcCwgbm9kZSkge1xuICB2YXIgaW5kZXggPSBoZWFwLmxlbmd0aDtcbiAgaGVhcC5wdXNoKG5vZGUpO1xuICBzaWZ0VXAoaGVhcCwgbm9kZSwgaW5kZXgpO1xufVxuZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gIHZhciBmaXJzdCA9IGhlYXBbMF07XG4gIHJldHVybiBmaXJzdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGZpcnN0O1xufVxuZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcblxuICBpZiAoZmlyc3QgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBsYXN0ID0gaGVhcC5wb3AoKTtcblxuICAgIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgICAgaGVhcFswXSA9IGxhc3Q7XG4gICAgICBzaWZ0RG93bihoZWFwLCBsYXN0LCAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlyc3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2lmdFVwKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBwYXJlbnRJbmRleCA9IGluZGV4IC0gMSA+Pj4gMTtcbiAgICB2YXIgcGFyZW50ID0gaGVhcFtwYXJlbnRJbmRleF07XG5cbiAgICBpZiAocGFyZW50ICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZShwYXJlbnQsIG5vZGUpID4gMCkge1xuICAgICAgLy8gVGhlIHBhcmVudCBpcyBsYXJnZXIuIFN3YXAgcG9zaXRpb25zLlxuICAgICAgaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlO1xuICAgICAgaGVhcFtpbmRleF0gPSBwYXJlbnQ7XG4gICAgICBpbmRleCA9IHBhcmVudEluZGV4O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIHNtYWxsZXIuIEV4aXQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNpZnREb3duKGhlYXAsIG5vZGUsIGkpIHtcbiAgdmFyIGluZGV4ID0gaTtcbiAgdmFyIGxlbmd0aCA9IGhlYXAubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBsZWZ0SW5kZXggPSAoaW5kZXggKyAxKSAqIDIgLSAxO1xuICAgIHZhciBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdO1xuICAgIHZhciByaWdodEluZGV4ID0gbGVmdEluZGV4ICsgMTtcbiAgICB2YXIgcmlnaHQgPSBoZWFwW3JpZ2h0SW5kZXhdOyAvLyBJZiB0aGUgbGVmdCBvciByaWdodCBub2RlIGlzIHNtYWxsZXIsIHN3YXAgd2l0aCB0aGUgc21hbGxlciBvZiB0aG9zZS5cblxuICAgIGlmIChsZWZ0ICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZShsZWZ0LCBub2RlKSA8IDApIHtcbiAgICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkge1xuICAgICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgICAgaW5kZXggPSByaWdodEluZGV4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhcFtpbmRleF0gPSBsZWZ0O1xuICAgICAgICBoZWFwW2xlZnRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IGxlZnRJbmRleDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZShyaWdodCwgbm9kZSkgPCAwKSB7XG4gICAgICBoZWFwW2luZGV4XSA9IHJpZ2h0O1xuICAgICAgaGVhcFtyaWdodEluZGV4XSA9IG5vZGU7XG4gICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5laXRoZXIgY2hpbGQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGFyZShhLCBiKSB7XG4gIC8vIENvbXBhcmUgc29ydCBpbmRleCBmaXJzdCwgdGhlbiB0YXNrIGlkLlxuICB2YXIgZGlmZiA9IGEuc29ydEluZGV4IC0gYi5zb3J0SW5kZXg7XG4gIHJldHVybiBkaWZmICE9PSAwID8gZGlmZiA6IGEuaWQgLSBiLmlkO1xufVxuXG4vLyBUT0RPOiBVc2Ugc3ltYm9scz9cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDE7XG52YXIgVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xudmFyIE5vcm1hbFByaW9yaXR5ID0gMztcbnZhciBMb3dQcmlvcml0eSA9IDQ7XG52YXIgSWRsZVByaW9yaXR5ID0gNTtcblxuZnVuY3Rpb24gbWFya1Rhc2tFcnJvcmVkKHRhc2ssIG1zKSB7XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXZhciAqL1xuLy8gTWF0aC5wb3coMiwgMzApIC0gMVxuLy8gMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcblxudmFyIG1heFNpZ25lZDMxQml0SW50ID0gMTA3Mzc0MTgyMzsgLy8gVGltZXMgb3V0IGltbWVkaWF0ZWx5XG5cbnZhciBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVCA9IC0xOyAvLyBFdmVudHVhbGx5IHRpbWVzIG91dFxuXG52YXIgVVNFUl9CTE9DS0lOR19QUklPUklUWV9USU1FT1VUID0gMjUwO1xudmFyIE5PUk1BTF9QUklPUklUWV9USU1FT1VUID0gNTAwMDtcbnZhciBMT1dfUFJJT1JJVFlfVElNRU9VVCA9IDEwMDAwOyAvLyBOZXZlciB0aW1lcyBvdXRcblxudmFyIElETEVfUFJJT1JJVFlfVElNRU9VVCA9IG1heFNpZ25lZDMxQml0SW50OyAvLyBUYXNrcyBhcmUgc3RvcmVkIG9uIGEgbWluIGhlYXBcblxudmFyIHRhc2tRdWV1ZSA9IFtdO1xudmFyIHRpbWVyUXVldWUgPSBbXTsgLy8gSW5jcmVtZW50aW5nIGlkIGNvdW50ZXIuIFVzZWQgdG8gbWFpbnRhaW4gaW5zZXJ0aW9uIG9yZGVyLlxuXG52YXIgdGFza0lkQ291bnRlciA9IDE7IC8vIFBhdXNpbmcgdGhlIHNjaGVkdWxlciBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbnZhciBjdXJyZW50VGFzayA9IG51bGw7XG52YXIgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTsgLy8gVGhpcyBpcyBzZXQgd2hpbGUgcGVyZm9ybWluZyB3b3JrLCB0byBwcmV2ZW50IHJlLWVudHJhbmN5LlxuXG52YXIgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xudmFyIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gZmFsc2U7XG52YXIgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKSB7XG4gIC8vIENoZWNrIGZvciB0YXNrcyB0aGF0IGFyZSBubyBsb25nZXIgZGVsYXllZCBhbmQgYWRkIHRoZW0gdG8gdGhlIHF1ZXVlLlxuICB2YXIgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gIHdoaWxlICh0aW1lciAhPT0gbnVsbCkge1xuICAgIGlmICh0aW1lci5jYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGltZXIgd2FzIGNhbmNlbGxlZC5cbiAgICAgIHBvcCh0aW1lclF1ZXVlKTtcbiAgICB9IGVsc2UgaWYgKHRpbWVyLnN0YXJ0VGltZSA8PSBjdXJyZW50VGltZSkge1xuICAgICAgLy8gVGltZXIgZmlyZWQuIFRyYW5zZmVyIHRvIHRoZSB0YXNrIHF1ZXVlLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgICAgdGltZXIuc29ydEluZGV4ID0gdGltZXIuZXhwaXJhdGlvblRpbWU7XG4gICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZW1haW5pbmcgdGltZXJzIGFyZSBwZW5kaW5nLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVUaW1lb3V0KGN1cnJlbnRUaW1lKSB7XG4gIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCkge1xuICAgIGlmIChwZWVrKHRhc2tRdWV1ZSkgIT09IG51bGwpIHtcbiAgICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoaGFuZGxlVGltZW91dCwgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZsdXNoV29yayhoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSkge1xuXG5cbiAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcblxuICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgIC8vIFdlIHNjaGVkdWxlZCBhIHRpbWVvdXQgYnV0IGl0J3Mgbm8gbG9uZ2VyIG5lZWRlZC4gQ2FuY2VsIGl0LlxuICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBjYW5jZWxIb3N0VGltZW91dCgpO1xuICB9XG5cbiAgaXNQZXJmb3JtaW5nV29yayA9IHRydWU7XG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIGlmIChlbmFibGVQcm9maWxpbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuICAgICAgICAgIG1hcmtUYXNrRXJyb3JlZChjdXJyZW50VGFzaywgY3VycmVudFRpbWUpO1xuICAgICAgICAgIGN1cnJlbnRUYXNrLmlzUXVldWVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2F0Y2ggaW4gcHJvZCBjb2RlIHBhdGguXG4gICAgICByZXR1cm4gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50VGFzayA9IG51bGw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgaXNQZXJmb3JtaW5nV29yayA9IGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGluaXRpYWxUaW1lO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgY3VycmVudFRhc2sgPSBwZWVrKHRhc2tRdWV1ZSk7XG5cbiAgd2hpbGUgKGN1cnJlbnRUYXNrICE9PSBudWxsICYmICEoZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nICkpIHtcbiAgICBpZiAoY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPiBjdXJyZW50VGltZSAmJiAoIWhhc1RpbWVSZW1haW5pbmcgfHwgZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZCgpKSkge1xuICAgICAgLy8gVGhpcyBjdXJyZW50VGFzayBoYXNuJ3QgZXhwaXJlZCwgYW5kIHdlJ3ZlIHJlYWNoZWQgdGhlIGRlYWRsaW5lLlxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICB2YXIgZGlkVXNlckNhbGxiYWNrVGltZW91dCA9IGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lO1xuXG4gICAgICB2YXIgY29udGludWF0aW9uQ2FsbGJhY2sgPSBjYWxsYmFjayhkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0KTtcbiAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb250aW51YXRpb25DYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjdXJyZW50VGFzay5jYWxsYmFjayA9IGNvbnRpbnVhdGlvbkNhbGxiYWNrO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSkge1xuICAgICAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3AodGFza1F1ZXVlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgfSAvLyBSZXR1cm4gd2hldGhlciB0aGVyZSdzIGFkZGl0aW9uYWwgd29ya1xuXG5cbiAgaWYgKGN1cnJlbnRUYXNrICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuXG4gICAgaWYgKGZpcnN0VGltZXIgIT09IG51bGwpIHtcbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5TGV2ZWwsIGV2ZW50SGFuZGxlcikge1xuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfbmV4dChldmVudEhhbmRsZXIpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWw7XG5cbiAgc3dpdGNoIChjdXJyZW50UHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgICAgLy8gU2hpZnQgZG93biB0byBub3JtYWwgcHJpb3JpdHlcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBOb3JtYWxQcmlvcml0eTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEFueXRoaW5nIGxvd2VyIHRoYW4gbm9ybWFsIHByaW9yaXR5IHNob3VsZCByZW1haW4gYXQgdGhlIGN1cnJlbnQgbGV2ZWwuXG4gICAgICBwcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGV2ZW50SGFuZGxlcigpO1xuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3dyYXBDYWxsYmFjayhjYWxsYmFjaykge1xuICB2YXIgcGFyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgYSBmb3JrIG9mIHJ1bldpdGhQcmlvcml0eSwgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKHByaW9yaXR5TGV2ZWwsIGNhbGxiYWNrLCBvcHRpb25zKSB7XG4gIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gIHZhciBzdGFydFRpbWU7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zICE9PSBudWxsKSB7XG4gICAgdmFyIGRlbGF5ID0gb3B0aW9ucy5kZWxheTtcblxuICAgIGlmICh0eXBlb2YgZGVsYXkgPT09ICdudW1iZXInICYmIGRlbGF5ID4gMCkge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWUgKyBkZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICB9XG5cbiAgdmFyIHRpbWVvdXQ7XG5cbiAgc3dpdGNoIChwcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBJTU1FRElBVEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElETEVfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eTpcbiAgICAgIHRpbWVvdXQgPSBMT1dfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBkZWZhdWx0OlxuICAgICAgdGltZW91dCA9IE5PUk1BTF9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICB2YXIgZXhwaXJhdGlvblRpbWUgPSBzdGFydFRpbWUgKyB0aW1lb3V0O1xuICB2YXIgbmV3VGFzayA9IHtcbiAgICBpZDogdGFza0lkQ291bnRlcisrLFxuICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICBwcmlvcml0eUxldmVsOiBwcmlvcml0eUxldmVsLFxuICAgIHN0YXJ0VGltZTogc3RhcnRUaW1lLFxuICAgIGV4cGlyYXRpb25UaW1lOiBleHBpcmF0aW9uVGltZSxcbiAgICBzb3J0SW5kZXg6IC0xXG4gIH07XG5cbiAgaWYgKHN0YXJ0VGltZSA+IGN1cnJlbnRUaW1lKSB7XG4gICAgLy8gVGhpcyBpcyBhIGRlbGF5ZWQgdGFzay5cbiAgICBuZXdUYXNrLnNvcnRJbmRleCA9IHN0YXJ0VGltZTtcbiAgICBwdXNoKHRpbWVyUXVldWUsIG5ld1Rhc2spO1xuXG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSA9PT0gbnVsbCAmJiBuZXdUYXNrID09PSBwZWVrKHRpbWVyUXVldWUpKSB7XG4gICAgICAvLyBBbGwgdGFza3MgYXJlIGRlbGF5ZWQsIGFuZCB0aGlzIGlzIHRoZSB0YXNrIHdpdGggdGhlIGVhcmxpZXN0IGRlbGF5LlxuICAgICAgaWYgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFuIGV4aXN0aW5nIHRpbWVvdXQuXG4gICAgICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gdHJ1ZTtcbiAgICAgIH0gLy8gU2NoZWR1bGUgYSB0aW1lb3V0LlxuXG5cbiAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBzdGFydFRpbWUgLSBjdXJyZW50VGltZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gZXhwaXJhdGlvblRpbWU7XG4gICAgcHVzaCh0YXNrUXVldWUsIG5ld1Rhc2spO1xuICAgIC8vIHdhaXQgdW50aWwgdGhlIG5leHQgdGltZSB3ZSB5aWVsZC5cblxuXG4gICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdUYXNrO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbigpIHtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY29udGludWVFeGVjdXRpb24oKSB7XG5cbiAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCAmJiAhaXNQZXJmb3JtaW5nV29yaykge1xuICAgIGlzSG9zdENhbGxiYWNrU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUoKSB7XG4gIHJldHVybiBwZWVrKHRhc2tRdWV1ZSk7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2NhbmNlbENhbGxiYWNrKHRhc2spIHtcbiAgLy8gcmVtb3ZlIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgeW91IGNhbid0IHJlbW92ZSBhcmJpdHJhcnkgbm9kZXMgZnJvbSBhblxuICAvLyBhcnJheSBiYXNlZCBoZWFwLCBvbmx5IHRoZSBmaXJzdCBvbmUuKVxuXG5cbiAgdGFzay5jYWxsYmFjayA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkge1xuICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG59XG5cbnZhciB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSByZXF1ZXN0UGFpbnQ7XG52YXIgdW5zdGFibGVfUHJvZmlsaW5nID0gIG51bGw7XG5cbmV4cG9ydHMudW5zdGFibGVfSWRsZVByaW9yaXR5ID0gSWRsZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IEltbWVkaWF0ZVByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IExvd1ByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSB1bnN0YWJsZV9Qcm9maWxpbmc7XG5leHBvcnRzLnVuc3RhYmxlX1VzZXJCbG9ja2luZ1ByaW9yaXR5ID0gVXNlckJsb2NraW5nUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX2NhbmNlbENhbGxiYWNrID0gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uID0gdW5zdGFibGVfY29udGludWVFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsID0gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw7XG5leHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlID0gdW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU7XG5leHBvcnRzLnVuc3RhYmxlX25leHQgPSB1bnN0YWJsZV9uZXh0O1xuZXhwb3J0cy51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiA9IHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uO1xuZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSB1bnN0YWJsZV9yZXF1ZXN0UGFpbnQ7XG5leHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IHVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayA9IHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s7XG5leHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjayA9IHVuc3RhYmxlX3dyYXBDYWxsYmFjaztcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLXRyYWNpbmcucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvc2NoZWR1bGVyLXRyYWNpbmcuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsInZhciBVTktOT1dOX0ZVTkNUSU9OID0gJzx1bmtub3duPic7XG4vKipcbiAqIFRoaXMgcGFyc2VzIHRoZSBkaWZmZXJlbnQgc3RhY2sgdHJhY2VzIGFuZCBwdXRzIHRoZW0gaW50byBvbmUgZm9ybWF0XG4gKiBUaGlzIGJvcnJvd3MgaGVhdmlseSBmcm9tIFRyYWNlS2l0IChodHRwczovL2dpdGh1Yi5jb20vY3Nub3Zlci9UcmFjZUtpdClcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdGFja1N0cmluZykge1xuICB2YXIgbGluZXMgPSBzdGFja1N0cmluZy5zcGxpdCgnXFxuJyk7XG4gIHJldHVybiBsaW5lcy5yZWR1Y2UoZnVuY3Rpb24gKHN0YWNrLCBsaW5lKSB7XG4gICAgdmFyIHBhcnNlUmVzdWx0ID0gcGFyc2VDaHJvbWUobGluZSkgfHwgcGFyc2VXaW5qcyhsaW5lKSB8fCBwYXJzZUdlY2tvKGxpbmUpIHx8IHBhcnNlTm9kZShsaW5lKSB8fCBwYXJzZUpTQyhsaW5lKTtcblxuICAgIGlmIChwYXJzZVJlc3VsdCkge1xuICAgICAgc3RhY2sucHVzaChwYXJzZVJlc3VsdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9LCBbXSk7XG59XG52YXIgY2hyb21lUmUgPSAvXlxccyphdCAoLio/KSA/XFwoKCg/OmZpbGV8aHR0cHM/fGJsb2J8Y2hyb21lLWV4dGVuc2lvbnxuYXRpdmV8ZXZhbHx3ZWJwYWNrfDxhbm9ueW1vdXM+fFxcL3xbYS16XTpcXFxcfFxcXFxcXFxcKS4qPykoPzo6KFxcZCspKT8oPzo6KFxcZCspKT9cXCk/XFxzKiQvaTtcbnZhciBjaHJvbWVFdmFsUmUgPSAvXFwoKFxcUyopKD86OihcXGQrKSkoPzo6KFxcZCspKVxcKS87XG5cbmZ1bmN0aW9uIHBhcnNlQ2hyb21lKGxpbmUpIHtcbiAgdmFyIHBhcnRzID0gY2hyb21lUmUuZXhlYyhsaW5lKTtcblxuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgaXNOYXRpdmUgPSBwYXJ0c1syXSAmJiBwYXJ0c1syXS5pbmRleE9mKCduYXRpdmUnKSA9PT0gMDsgLy8gc3RhcnQgb2YgbGluZVxuXG4gIHZhciBpc0V2YWwgPSBwYXJ0c1syXSAmJiBwYXJ0c1syXS5pbmRleE9mKCdldmFsJykgPT09IDA7IC8vIHN0YXJ0IG9mIGxpbmVcblxuICB2YXIgc3VibWF0Y2ggPSBjaHJvbWVFdmFsUmUuZXhlYyhwYXJ0c1syXSk7XG5cbiAgaWYgKGlzRXZhbCAmJiBzdWJtYXRjaCAhPSBudWxsKSB7XG4gICAgLy8gdGhyb3cgb3V0IGV2YWwgbGluZS9jb2x1bW4gYW5kIHVzZSB0b3AtbW9zdCBsaW5lL2NvbHVtbiBudW1iZXJcbiAgICBwYXJ0c1syXSA9IHN1Ym1hdGNoWzFdOyAvLyB1cmxcblxuICAgIHBhcnRzWzNdID0gc3VibWF0Y2hbMl07IC8vIGxpbmVcblxuICAgIHBhcnRzWzRdID0gc3VibWF0Y2hbM107IC8vIGNvbHVtblxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaWxlOiAhaXNOYXRpdmUgPyBwYXJ0c1syXSA6IG51bGwsXG4gICAgbWV0aG9kTmFtZTogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICBhcmd1bWVudHM6IGlzTmF0aXZlID8gW3BhcnRzWzJdXSA6IFtdLFxuICAgIGxpbmVOdW1iZXI6IHBhcnRzWzNdID8gK3BhcnRzWzNdIDogbnVsbCxcbiAgICBjb2x1bW46IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbFxuICB9O1xufVxuXG52YXIgd2luanNSZSA9IC9eXFxzKmF0ICg/OigoPzpcXFtvYmplY3Qgb2JqZWN0XFxdKT8uKykgKT9cXCg/KCg/OmZpbGV8bXMtYXBweHxodHRwcz98d2VicGFja3xibG9iKTouKj8pOihcXGQrKSg/OjooXFxkKykpP1xcKT9cXHMqJC9pO1xuXG5mdW5jdGlvbiBwYXJzZVdpbmpzKGxpbmUpIHtcbiAgdmFyIHBhcnRzID0gd2luanNSZS5leGVjKGxpbmUpO1xuXG4gIGlmICghcGFydHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmlsZTogcGFydHNbMl0sXG4gICAgbWV0aG9kTmFtZTogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICBhcmd1bWVudHM6IFtdLFxuICAgIGxpbmVOdW1iZXI6ICtwYXJ0c1szXSxcbiAgICBjb2x1bW46IHBhcnRzWzRdID8gK3BhcnRzWzRdIDogbnVsbFxuICB9O1xufVxuXG52YXIgZ2Vja29SZSA9IC9eXFxzKiguKj8pKD86XFwoKC4qPylcXCkpPyg/Ol58QCkoKD86ZmlsZXxodHRwcz98YmxvYnxjaHJvbWV8d2VicGFja3xyZXNvdXJjZXxcXFtuYXRpdmUpLio/fFteQF0qYnVuZGxlKSg/OjooXFxkKykpPyg/OjooXFxkKykpP1xccyokL2k7XG52YXIgZ2Vja29FdmFsUmUgPSAvKFxcUyspIGxpbmUgKFxcZCspKD86ID4gZXZhbCBsaW5lIFxcZCspKiA+IGV2YWwvaTtcblxuZnVuY3Rpb24gcGFyc2VHZWNrbyhsaW5lKSB7XG4gIHZhciBwYXJ0cyA9IGdlY2tvUmUuZXhlYyhsaW5lKTtcblxuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgaXNFdmFsID0gcGFydHNbM10gJiYgcGFydHNbM10uaW5kZXhPZignID4gZXZhbCcpID4gLTE7XG4gIHZhciBzdWJtYXRjaCA9IGdlY2tvRXZhbFJlLmV4ZWMocGFydHNbM10pO1xuXG4gIGlmIChpc0V2YWwgJiYgc3VibWF0Y2ggIT0gbnVsbCkge1xuICAgIC8vIHRocm93IG91dCBldmFsIGxpbmUvY29sdW1uIGFuZCB1c2UgdG9wLW1vc3QgbGluZSBudW1iZXJcbiAgICBwYXJ0c1szXSA9IHN1Ym1hdGNoWzFdO1xuICAgIHBhcnRzWzRdID0gc3VibWF0Y2hbMl07XG4gICAgcGFydHNbNV0gPSBudWxsOyAvLyBubyBjb2x1bW4gd2hlbiBldmFsXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpbGU6IHBhcnRzWzNdLFxuICAgIG1ldGhvZE5hbWU6IHBhcnRzWzFdIHx8IFVOS05PV05fRlVOQ1RJT04sXG4gICAgYXJndW1lbnRzOiBwYXJ0c1syXSA/IHBhcnRzWzJdLnNwbGl0KCcsJykgOiBbXSxcbiAgICBsaW5lTnVtYmVyOiBwYXJ0c1s0XSA/ICtwYXJ0c1s0XSA6IG51bGwsXG4gICAgY29sdW1uOiBwYXJ0c1s1XSA/ICtwYXJ0c1s1XSA6IG51bGxcbiAgfTtcbn1cblxudmFyIGphdmFTY3JpcHRDb3JlUmUgPSAvXlxccyooPzooW15AXSopKD86XFwoKC4qPylcXCkpP0ApPyhcXFMuKj8pOihcXGQrKSg/OjooXFxkKykpP1xccyokL2k7XG5cbmZ1bmN0aW9uIHBhcnNlSlNDKGxpbmUpIHtcbiAgdmFyIHBhcnRzID0gamF2YVNjcmlwdENvcmVSZS5leGVjKGxpbmUpO1xuXG4gIGlmICghcGFydHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZmlsZTogcGFydHNbM10sXG4gICAgbWV0aG9kTmFtZTogcGFydHNbMV0gfHwgVU5LTk9XTl9GVU5DVElPTixcbiAgICBhcmd1bWVudHM6IFtdLFxuICAgIGxpbmVOdW1iZXI6ICtwYXJ0c1s0XSxcbiAgICBjb2x1bW46IHBhcnRzWzVdID8gK3BhcnRzWzVdIDogbnVsbFxuICB9O1xufVxuXG52YXIgbm9kZVJlID0gL15cXHMqYXQgKD86KCg/OlxcW29iamVjdCBvYmplY3RcXF0pP1teXFxcXC9dKyg/OiBcXFthcyBcXFMrXFxdKT8pICk/XFwoPyguKj8pOihcXGQrKSg/OjooXFxkKykpP1xcKT9cXHMqJC9pO1xuXG5mdW5jdGlvbiBwYXJzZU5vZGUobGluZSkge1xuICB2YXIgcGFydHMgPSBub2RlUmUuZXhlYyhsaW5lKTtcblxuICBpZiAoIXBhcnRzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpbGU6IHBhcnRzWzJdLFxuICAgIG1ldGhvZE5hbWU6IHBhcnRzWzFdIHx8IFVOS05PV05fRlVOQ1RJT04sXG4gICAgYXJndW1lbnRzOiBbXSxcbiAgICBsaW5lTnVtYmVyOiArcGFydHNbM10sXG4gICAgY29sdW1uOiBwYXJ0c1s0XSA/ICtwYXJ0c1s0XSA6IG51bGxcbiAgfTtcbn1cblxuZXhwb3J0IHsgcGFyc2UgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/static/chunks/pages/_app.js b/.next/static/chunks/pages/_app.js new file mode 100644 index 0000000..8942896 --- /dev/null +++ b/.next/static/chunks/pages/_app.js @@ -0,0 +1,10654 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["pages/_app"],{ + +/***/ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayLikeToArray.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +module.exports = _arrayLikeToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/arrayWithHoles.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayWithHoles.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; +} + +module.exports = _arrayWithHoles; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js"); + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); +} + +module.exports = _arrayWithoutHoles; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/assertThisInitialized.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +module.exports = _assertThisInitialized; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/asyncToGenerator.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + + _next(undefined); + }); + }; +} + +module.exports = _asyncToGenerator; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +module.exports = _classCallCheck; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/construct.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/construct.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); + +var isNativeReflectConstruct = __webpack_require__(/*! ./isNativeReflectConstruct */ "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js"); + +function _construct(Parent, args, Class) { + if (isNativeReflectConstruct()) { + module.exports = _construct = Reflect.construct; + } else { + module.exports = _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); +} + +module.exports = _construct; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/createClass.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/createClass.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +module.exports = _createClass; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/defineProperty.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +module.exports = _defineProperty; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/defineProperty.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 _defineProperty; }); +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/getPrototypeOf.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _getPrototypeOf(o) { + module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +module.exports = _getPrototypeOf; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/inherits.js": +/*!*********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/inherits.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) setPrototypeOf(subClass, superClass); +} + +module.exports = _inherits; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireWildcard.js ***! + \***********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +module.exports = _interopRequireWildcard; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js ***! + \*************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); + return true; + } catch (e) { + return false; + } +} + +module.exports = _isNativeReflectConstruct; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/iterableToArray.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/iterableToArray.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); +} + +module.exports = _iterableToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; +} + +module.exports = _iterableToArrayLimit; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/nonIterableRest.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/nonIterableRest.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +module.exports = _nonIterableRest; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/nonIterableSpread.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/nonIterableSpread.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +module.exports = _nonIterableSpread; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); + +var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + + return assertThisInitialized(self); +} + +module.exports = _possibleConstructorReturn; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _setPrototypeOf(o, p) { + module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +module.exports = _setPrototypeOf; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/slicedToArray.js": +/*!**************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/slicedToArray.js ***! + \**************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayWithHoles = __webpack_require__(/*! ./arrayWithHoles */ "./node_modules/@babel/runtime/helpers/arrayWithHoles.js"); + +var iterableToArrayLimit = __webpack_require__(/*! ./iterableToArrayLimit */ "./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js"); + +var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray */ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js"); + +var nonIterableRest = __webpack_require__(/*! ./nonIterableRest */ "./node_modules/@babel/runtime/helpers/nonIterableRest.js"); + +function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest(); +} + +module.exports = _slicedToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/toConsumableArray.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/toConsumableArray.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js"); + +var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "./node_modules/@babel/runtime/helpers/iterableToArray.js"); + +var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray */ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js"); + +var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "./node_modules/@babel/runtime/helpers/nonIterableSpread.js"); + +function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); +} + +module.exports = _toConsumableArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/typeof.js": +/*!*******************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +module.exports = _typeof; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js"); + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); +} + +module.exports = _unsupportedIterableToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/regenerator/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/regenerator/index.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js"); + + +/***/ }), + +/***/ "./node_modules/next/dist/build/polyfills/object-assign.js": +/*!*****************************************************************!*\ + !*** ./node_modules/next/dist/build/polyfills/object-assign.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +var assign=Object.assign.bind(Object);module.exports=assign;module.exports.default=module.exports; +//# sourceMappingURL=object-assign.js.map + +/***/ }), + +/***/ "./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F_app&absolutePagePath=private-next-pages%2F_app.tsx!./": +/*!**********************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F_app&absolutePagePath=private-next-pages%2F_app.tsx ***! + \**********************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + + + (window.__NEXT_P = window.__NEXT_P || []).push([ + "/_app", + function () { + return __webpack_require__(/*! private-next-pages/_app.tsx */ "./src/pages/_app.tsx"); + } + ]); + + +/***/ }), + +/***/ "./node_modules/next/dist/build/webpack/loaders/next-style-loader/runtime/injectStylesIntoStyleTag.js": +/*!************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-style-loader/runtime/injectStylesIntoStyleTag.js ***! + \************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +const isOldIE=function isOldIE(){let memo;return function memorize(){if(typeof memo==='undefined'){// Test for IE <= 9 as proposed by Browserhacks +// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 +// Tests for existence of standard globals is to allow style-loader +// to operate correctly into non-standard environments +// @see https://github.com/webpack-contrib/style-loader/issues/177 +memo=Boolean(window&&document&&document.all&&!window.atob);}return memo;};}();const getTarget=function getTarget(){const memo={};return function memorize(target){if(typeof memo[target]==='undefined'){let styleTarget=document.querySelector(target);// Special case to return head of iframe instead of iframe itself +if(window.HTMLIFrameElement&&styleTarget instanceof window.HTMLIFrameElement){try{// This will throw an exception if access to iframe is blocked +// due to cross-origin restrictions +styleTarget=styleTarget.contentDocument.head;}catch(e){// istanbul ignore next +styleTarget=null;}}memo[target]=styleTarget;}return memo[target];};}();const stylesInDom=[];function getIndexByIdentifier(identifier){let result=-1;for(let i=0;i<stylesInDom.length;i++){if(stylesInDom[i].identifier===identifier){result=i;break;}}return result;}function modulesToDom(list,options){const idCountMap={};const identifiers=[];for(let i=0;i<list.length;i++){const item=list[i];const id=options.base?item[0]+options.base:item[0];const count=idCountMap[id]||0;const identifier=`${id} ${count}`;idCountMap[id]=count+1;const index=getIndexByIdentifier(identifier);const obj={css:item[1],media:item[2],sourceMap:item[3]};if(index!==-1){stylesInDom[index].references++;stylesInDom[index].updater(obj);}else{stylesInDom.push({identifier,updater:addStyle(obj,options),references:1});}identifiers.push(identifier);}return identifiers;}function insertStyleElement(options){const style=document.createElement('style');const attributes=options.attributes||{};if(typeof attributes.nonce==='undefined'){const nonce=// eslint-disable-next-line no-undef + true?__webpack_require__.nc:undefined;if(nonce){attributes.nonce=nonce;}}Object.keys(attributes).forEach(key=>{style.setAttribute(key,attributes[key]);});if(typeof options.insert==='function'){options.insert(style);}else{const target=getTarget(options.insert||'head');if(!target){throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");}target.appendChild(style);}return style;}function removeStyleElement(style){// istanbul ignore if +if(style.parentNode===null){return false;}style.parentNode.removeChild(style);}/* istanbul ignore next */const replaceText=function replaceText(){const textStore=[];return function replace(index,replacement){textStore[index]=replacement;return textStore.filter(Boolean).join('\n');};}();function applyToSingletonTag(style,index,remove,obj){const css=remove?'':obj.media?`@media ${obj.media} {${obj.css}}`:obj.css;// For old IE +/* istanbul ignore if */if(style.styleSheet){style.styleSheet.cssText=replaceText(index,css);}else{const cssNode=document.createTextNode(css);const childNodes=style.childNodes;if(childNodes[index]){style.removeChild(childNodes[index]);}if(childNodes.length){style.insertBefore(cssNode,childNodes[index]);}else{style.appendChild(cssNode);}}}function applyToTag(style,options,obj){let css=obj.css;const media=obj.media;const sourceMap=obj.sourceMap;if(media){style.setAttribute('media',media);}else{style.removeAttribute('media');}if(sourceMap&&typeof btoa!=='undefined'){css+=`\n/*# sourceMappingURL=data:application/json;base64,${btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))))} */`;}// For old IE +/* istanbul ignore if */if(style.styleSheet){style.styleSheet.cssText=css;}else{while(style.firstChild){style.removeChild(style.firstChild);}style.appendChild(document.createTextNode(css));}}let singleton=null;let singletonCounter=0;function addStyle(obj,options){let style;let update;let remove;if(options.singleton){const styleIndex=singletonCounter++;style=singleton||(singleton=insertStyleElement(options));update=applyToSingletonTag.bind(null,style,styleIndex,false);remove=applyToSingletonTag.bind(null,style,styleIndex,true);}else{style=insertStyleElement(options);update=applyToTag.bind(null,style,options);remove=()=>{removeStyleElement(style);};}update(obj);return function updateStyle(newObj){if(newObj){if(newObj.css===obj.css&&newObj.media===obj.media&&newObj.sourceMap===obj.sourceMap){return;}update(obj=newObj);}else{remove();}};}module.exports=(list,options)=>{options=options||{};// Force single-tag solution on IE6-9, which has a hard limit on the # of <style> +// tags it will allow on a page +if(!options.singleton&&typeof options.singleton!=='boolean'){options.singleton=isOldIE();}list=list||[];let lastIdentifiers=modulesToDom(list,options);return function update(newList){newList=newList||[];if(Object.prototype.toString.call(newList)!=='[object Array]'){return;}for(let i=0;i<lastIdentifiers.length;i++){const identifier=lastIdentifiers[i];const index=getIndexByIdentifier(identifier);stylesInDom[index].references--;}const newLastIdentifiers=modulesToDom(newList,options);for(let i=0;i<lastIdentifiers.length;i++){const identifier=lastIdentifiers[i];const index=getIndexByIdentifier(identifier);if(stylesInDom[index].references===0){stylesInDom[index].updater();stylesInDom.splice(index,1);}}lastIdentifiers=newLastIdentifiers;};}; +//# sourceMappingURL=injectStylesIntoStyleTag.js.map + +/***/ }), + +/***/ "./node_modules/next/dist/client/normalize-trailing-slash.js": +/*!*******************************************************************!*\ + !*** ./node_modules/next/dist/client/normalize-trailing-slash.js ***! + \*******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.removePathTrailingSlash = removePathTrailingSlash; +exports.normalizePathTrailingSlash = void 0; +/** +* Removes the trailing slash of a path if there is one. Preserves the root path `/`. +*/ + +function removePathTrailingSlash(path) { + return path.endsWith('/') && path !== '/' ? path.slice(0, -1) : path; +} +/** +* Normalizes the trailing slash of a path according to the `trailingSlash` option +* in `next.config.js`. +*/ + + +var normalizePathTrailingSlash = false ? undefined : removePathTrailingSlash; +exports.normalizePathTrailingSlash = normalizePathTrailingSlash; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/request-idle-callback.js": +/*!****************************************************************!*\ + !*** ./node_modules/next/dist/client/request-idle-callback.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.cancelIdleCallback = exports.requestIdleCallback = void 0; + +var requestIdleCallback = typeof self !== 'undefined' && self.requestIdleCallback || function (cb) { + var start = Date.now(); + return setTimeout(function () { + cb({ + didTimeout: false, + timeRemaining: function timeRemaining() { + return Math.max(0, 50 - (Date.now() - start)); + } + }); + }, 1); +}; + +exports.requestIdleCallback = requestIdleCallback; + +var cancelIdleCallback = typeof self !== 'undefined' && self.cancelIdleCallback || function (id) { + return clearTimeout(id); +}; + +exports.cancelIdleCallback = cancelIdleCallback; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/route-loader.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/client/route-loader.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.markAssetError = markAssetError; +exports.isAssetError = isAssetError; +exports.getClientBuildManifest = getClientBuildManifest; +exports["default"] = void 0; + +var _getAssetPathFromRoute = _interopRequireDefault(__webpack_require__(/*! ../next-server/lib/router/utils/get-asset-path-from-route */ "./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js")); + +var _requestIdleCallback = __webpack_require__(/*! ./request-idle-callback */ "./node_modules/next/dist/client/request-idle-callback.js"); // 3.8s was arbitrarily chosen as it's what https://web.dev/interactive +// considers as "Good" time-to-interactive. We must assume something went +// wrong beyond this point, and then fall-back to a full page transition to +// show the user something of value. + + +var MS_MAX_IDLE_DELAY = 3800; + +function withFuture(key, map, generator) { + var entry = map.get(key); + + if (entry) { + if ('future' in entry) { + return entry.future; + } + + return Promise.resolve(entry); + } + + var resolver; + var prom = new Promise(function (resolve) { + resolver = resolve; + }); + map.set(key, entry = { + resolve: resolver, + future: prom + }); + return generator ? // eslint-disable-next-line no-sequences + generator().then(function (value) { + return resolver(value), value; + }) : prom; +} + +function hasPrefetch(link) { + try { + link = document.createElement('link'); + return (// detect IE11 since it supports prefetch but isn't detected + // with relList.support + !!window.MSInputMethodContext && !!document.documentMode || link.relList.supports('prefetch') + ); + } catch (_unused) { + return false; + } +} + +var canPrefetch = hasPrefetch(); + +function prefetchViaDom(href, as, link) { + return new Promise(function (res, rej) { + if (document.querySelector("link[rel=\"prefetch\"][href^=\"".concat(href, "\"]"))) { + return res(); + } + + link = document.createElement('link'); // The order of property assignment here is intentional: + + if (as) link.as = as; + link.rel = "prefetch"; + link.crossOrigin = undefined; + link.onload = res; + link.onerror = rej; // `href` should always be last: + + link.href = href; + document.head.appendChild(link); + }); +} + +var ASSET_LOAD_ERROR = Symbol('ASSET_LOAD_ERROR'); // TODO: unexport + +function markAssetError(err) { + return Object.defineProperty(err, ASSET_LOAD_ERROR, {}); +} + +function isAssetError(err) { + return err && ASSET_LOAD_ERROR in err; +} + +function appendScript(src, script) { + return new Promise(function (resolve, reject) { + script = document.createElement('script'); // The order of property assignment here is intentional. + // 1. Setup success/failure hooks in case the browser synchronously + // executes when `src` is set. + + script.onload = resolve; + + script.onerror = function () { + return reject(markAssetError(new Error("Failed to load script: ".concat(src)))); + }; // 2. Configure the cross-origin attribute before setting `src` in case the + // browser begins to fetch. + + + script.crossOrigin = undefined; // 3. Finally, set the source and inject into the DOM in case the child + // must be appended for fetching to start. + + script.src = src; + document.body.appendChild(script); + }); +} // Resolve a promise that times out after given amount of milliseconds. + + +function resolvePromiseWithTimeout(p, ms, err) { + return new Promise(function (resolve, reject) { + var cancelled = false; + p.then(function (r) { + // Resolved, cancel the timeout + cancelled = true; + resolve(r); + })["catch"](reject); + (0, _requestIdleCallback.requestIdleCallback)(function () { + return setTimeout(function () { + if (!cancelled) { + reject(err); + } + }, ms); + }); + }); +} // TODO: stop exporting or cache the failure +// It'd be best to stop exporting this. It's an implementation detail. We're +// only exporting it for backwards compatibilty with the `page-loader`. +// Only cache this response as a last resort if we cannot eliminate all other +// code branches that use the Build Manifest Callback and push them through +// the Route Loader interface. + + +function getClientBuildManifest() { + if (self.__BUILD_MANIFEST) { + return Promise.resolve(self.__BUILD_MANIFEST); + } + + var onBuildManifest = new Promise(function (resolve) { + // Mandatory because this is not concurrent safe: + var cb = self.__BUILD_MANIFEST_CB; + + self.__BUILD_MANIFEST_CB = function () { + resolve(self.__BUILD_MANIFEST); + cb && cb(); + }; + }); + return resolvePromiseWithTimeout(onBuildManifest, MS_MAX_IDLE_DELAY, markAssetError(new Error('Failed to load client build manifest'))); +} + +function getFilesForRoute(assetPrefix, route) { + if (true) { + return Promise.resolve({ + scripts: [assetPrefix + '/_next/static/chunks/pages' + encodeURI((0, _getAssetPathFromRoute["default"])(route, '.js'))], + // Styles are handled by `style-loader` in development: + css: [] + }); + } + + return getClientBuildManifest().then(function (manifest) { + if (!(route in manifest)) { + throw markAssetError(new Error("Failed to lookup route: ".concat(route))); + } + + var allFiles = manifest[route].map(function (entry) { + return assetPrefix + '/_next/' + encodeURI(entry); + }); + return { + scripts: allFiles.filter(function (v) { + return v.endsWith('.js'); + }), + css: allFiles.filter(function (v) { + return v.endsWith('.css'); + }) + }; + }); +} + +function createRouteLoader(assetPrefix) { + var entrypoints = new Map(); + var loadedScripts = new Map(); + var styleSheets = new Map(); + var routes = new Map(); + + function maybeExecuteScript(src) { + var prom = loadedScripts.get(src); + + if (prom) { + return prom; + } // Skip executing script if it's already in the DOM: + + + if (document.querySelector("script[src^=\"".concat(src, "\"]"))) { + return Promise.resolve(); + } + + loadedScripts.set(src, prom = appendScript(src)); + return prom; + } + + function fetchStyleSheet(href) { + var prom = styleSheets.get(href); + + if (prom) { + return prom; + } + + styleSheets.set(href, prom = fetch(href).then(function (res) { + if (!res.ok) { + throw new Error("Failed to load stylesheet: ".concat(href)); + } + + return res.text().then(function (text) { + return { + href: href, + content: text + }; + }); + })["catch"](function (err) { + throw markAssetError(err); + })); + return prom; + } + + return { + whenEntrypoint: function whenEntrypoint(route) { + return withFuture(route, entrypoints); + }, + onEntrypoint: function onEntrypoint(route, execute) { + Promise.resolve(execute).then(function (fn) { + return fn(); + }).then(function (exports) { + return { + component: exports && exports["default"] || exports, + exports: exports + }; + }, function (err) { + return { + error: err + }; + }).then(function (input) { + var old = entrypoints.get(route); + entrypoints.set(route, input); + if (old && 'resolve' in old) old.resolve(input); + }); + }, + loadRoute: function loadRoute(route) { + var _this = this; + + return withFuture(route, routes, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { + var _yield$getFilesForRou, scripts, css, _yield$Promise$all, _yield$Promise$all2, styles, entrypoint, res; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return getFilesForRoute(assetPrefix, route); + + case 3: + _yield$getFilesForRou = _context.sent; + scripts = _yield$getFilesForRou.scripts; + css = _yield$getFilesForRou.css; + _context.next = 8; + return Promise.all([entrypoints.has(route) ? [] : Promise.all(scripts.map(maybeExecuteScript)), Promise.all(css.map(fetchStyleSheet))]); + + case 8: + _yield$Promise$all = _context.sent; + _yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 2); + styles = _yield$Promise$all2[1]; + _context.next = 13; + return resolvePromiseWithTimeout(_this.whenEntrypoint(route), MS_MAX_IDLE_DELAY, markAssetError(new Error("Route did not complete loading: ".concat(route)))); + + case 13: + entrypoint = _context.sent; + res = Object.assign({ + styles: styles + }, entrypoint); + return _context.abrupt("return", 'error' in entrypoint ? entrypoint : res); + + case 18: + _context.prev = 18; + _context.t0 = _context["catch"](0); + return _context.abrupt("return", { + error: _context.t0 + }); + + case 21: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 18]]); + }))); + }, + prefetch: function prefetch(route) { + var _this2 = this; + + // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118 + // License: Apache 2.0 + var cn; + + if (cn = navigator.connection) { + // Don't prefetch if using 2G or if Save-Data is enabled. + if (cn.saveData || /2g/.test(cn.effectiveType)) return Promise.resolve(); + } + + return getFilesForRoute(assetPrefix, route).then(function (output) { + return Promise.all(canPrefetch ? output.scripts.map(function (script) { + return prefetchViaDom(script, 'script'); + }) : []); + }).then(function () { + (0, _requestIdleCallback.requestIdleCallback)(function () { + return _this2.loadRoute(route); + }); + })["catch"]( // swallow prefetch errors + function () {}); + } + }; +} + +var _default = createRouteLoader; +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/router.js": +/*!*************************************************!*\ + !*** ./node_modules/next/dist/client/router.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _construct = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/construct */ "./node_modules/@babel/runtime/helpers/construct.js"); + +var _s = $RefreshSig$(); + +function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } + +var _interopRequireWildcard = __webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "./node_modules/@babel/runtime/helpers/interopRequireWildcard.js"); + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports.useRouter = useRouter; +exports.makePublicRouterInstance = makePublicRouterInstance; +exports.createRouter = exports.withRouter = exports["default"] = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _router2 = _interopRequireWildcard(__webpack_require__(/*! ../next-server/lib/router/router */ "./node_modules/next/dist/next-server/lib/router/router.js")); + +exports.Router = _router2["default"]; +exports.NextRouter = _router2.NextRouter; + +var _routerContext = __webpack_require__(/*! ../next-server/lib/router-context */ "./node_modules/next/dist/next-server/lib/router-context.js"); + +var _withRouter = _interopRequireDefault(__webpack_require__(/*! ./with-router */ "./node_modules/next/dist/client/with-router.js")); + +exports.withRouter = _withRouter["default"]; +/* global window */ + +var singletonRouter = { + router: null, + // holds the actual router instance + readyCallbacks: [], + ready: function ready(cb) { + if (this.router) return cb(); + + if (true) { + this.readyCallbacks.push(cb); + } + } +}; // Create public properties and methods of the router in the singletonRouter + +var urlPropertyFields = ['pathname', 'route', 'query', 'asPath', 'components', 'isFallback', 'basePath', 'locale', 'locales', 'defaultLocale', 'isReady', 'isPreview', 'isLocaleDomain']; +var routerEvents = ['routeChangeStart', 'beforeHistoryChange', 'routeChangeComplete', 'routeChangeError', 'hashChangeStart', 'hashChangeComplete']; +var coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'beforePopState']; // Events is a static property on the router, the router doesn't have to be initialized to use it + +Object.defineProperty(singletonRouter, 'events', { + get: function get() { + return _router2["default"].events; + } +}); +urlPropertyFields.forEach(function (field) { + // Here we need to use Object.defineProperty because, we need to return + // the property assigned to the actual router + // The value might get changed as we change routes and this is the + // proper way to access it + Object.defineProperty(singletonRouter, field, { + get: function get() { + var router = getRouter(); + return router[field]; + } + }); +}); +coreMethodFields.forEach(function (field) { + // We don't really know the types here, so we add them later instead + ; + + singletonRouter[field] = function () { + var router = getRouter(); + return router[field].apply(router, arguments); + }; +}); +routerEvents.forEach(function (event) { + singletonRouter.ready(function () { + _router2["default"].events.on(event, function () { + var eventField = "on".concat(event.charAt(0).toUpperCase()).concat(event.substring(1)); + var _singletonRouter = singletonRouter; + + if (_singletonRouter[eventField]) { + try { + _singletonRouter[eventField].apply(_singletonRouter, arguments); + } catch (err) { + console.error("Error when running the Router event: ".concat(eventField)); + console.error("".concat(err.message, "\n").concat(err.stack)); + } + } + }); + }); +}); + +function getRouter() { + if (!singletonRouter.router) { + var message = 'No router instance found.\n' + 'You should only use "next/router" inside the client side of your app.\n'; + throw new Error(message); + } + + return singletonRouter.router; +} // Export the singletonRouter and this is the public API. + + +var _default = singletonRouter; // Reexport the withRoute HOC + +exports["default"] = _default; + +function useRouter() { + _s(); + + return _react["default"].useContext(_routerContext.RouterContext); +} // INTERNAL APIS +// ------------- +// (do not use following exports inside the app) +// Create a router and assign it as the singleton instance. +// This is used in client side when we are initilizing the app. +// This should **not** use inside the server. + + +_s(useRouter, "gDsCjeeItUuvgOWf1v4qoK9RF6k="); + +var createRouter = function createRouter() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + singletonRouter.router = _construct(_router2["default"], args); + singletonRouter.readyCallbacks.forEach(function (cb) { + return cb(); + }); + singletonRouter.readyCallbacks = []; + return singletonRouter.router; +}; // This function is used to create the `withRouter` router instance + + +exports.createRouter = createRouter; + +function makePublicRouterInstance(router) { + var _router = router; + var instance = {}; + + var _iterator = _createForOfIteratorHelper(urlPropertyFields), + _step; + + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var property = _step.value; + + if (typeof _router[property] === 'object') { + instance[property] = Object.assign(Array.isArray(_router[property]) ? [] : {}, _router[property]); // makes sure query is not stateful + + continue; + } + + instance[property] = _router[property]; + } // Events is a static property on the router, the router doesn't have to be initialized to use it + + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + + instance.events = _router2["default"].events; + coreMethodFields.forEach(function (field) { + instance[field] = function () { + return _router[field].apply(_router, arguments); + }; + }); + return instance; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/with-router.js": +/*!******************************************************!*\ + !*** ./node_modules/next/dist/client/with-router.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports["default"] = withRouter; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _router = __webpack_require__(/*! ./router */ "./node_modules/next/dist/client/router.js"); + +function withRouter(ComposedComponent) { + function WithRouterWrapper(props) { + return /*#__PURE__*/_react["default"].createElement(ComposedComponent, Object.assign({ + router: (0, _router.useRouter)() + }, props)); + } + + WithRouterWrapper.getInitialProps = ComposedComponent.getInitialProps // This is needed to allow checking for custom getInitialProps in _app + ; + WithRouterWrapper.origGetInitialProps = ComposedComponent.origGetInitialProps; + + if (true) { + var name = ComposedComponent.displayName || ComposedComponent.name || 'Unknown'; + WithRouterWrapper.displayName = "withRouter(".concat(name, ")"); + } + + return WithRouterWrapper; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/css-loader/api.js": +/*!***********************************!*\ + !*** (webpack)/css-loader/api.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports=function(){"use strict";var n={762:function(n){n.exports=function(n){var t=[];t.toString=function toString(){return this.map(function(t){var r=cssWithMappingToString(t,n);if(t[2]){return"@media ".concat(t[2]," {").concat(r,"}")}return r}).join("")};t.i=function(n,r,o){if(typeof n==="string"){n=[[null,n,""]]}var e={};if(o){for(var a=0;a<this.length;a++){var c=this[a][0];if(c!=null){e[c]=true}}}for(var i=0;i<n.length;i++){var u=[].concat(n[i]);if(o&&e[u[0]]){continue}if(r){if(!u[2]){u[2]=r}else{u[2]="".concat(r," and ").concat(u[2])}}t.push(u)}};return t};function cssWithMappingToString(n,t){var r=n[1]||"";var o=n[3];if(!o){return r}if(t&&typeof btoa==="function"){var e=toComment(o);var a=o.sources.map(function(n){return"/*# sourceURL=".concat(o.sourceRoot||"").concat(n," */")});return[r].concat(a).concat([e]).join("\n")}return[r].join("\n")}function toComment(n){var t=btoa(unescape(encodeURIComponent(JSON.stringify(n))));var r="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t);return"/*# ".concat(r," */")}}};var t={};function __nccwpck_require__(r){if(t[r]){return t[r].exports}var o=t[r]={exports:{}};var e=true;try{n[r](o,o.exports,__nccwpck_require__);e=false}finally{if(e)delete t[r]}return o.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(762)}(); +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/css-loader/cjs.js?!./node_modules/next/dist/compiled/postcss-loader/cjs.js?!./node_modules/semantic-ui-css/semantic.min.css": +/*!*******************************************************************************************************************************************************!*\ + !*** (webpack)/css-loader/cjs.js??ref--5-oneOf-5-1!(webpack)/postcss-loader/cjs.js??ref--5-oneOf-5-2!./node_modules/semantic-ui-css/semantic.min.css ***! + \*******************************************************************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _next_dist_compiled_css_loader_api_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../next/dist/compiled/css-loader/api.js */ "./node_modules/next/dist/compiled/css-loader/api.js"); +/* harmony import */ var _next_dist_compiled_css_loader_api_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_next_dist_compiled_css_loader_api_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../next/dist/compiled/css-loader/getUrl.js */ "./node_modules/next/dist/compiled/css-loader/getUrl.js"); +/* harmony import */ var _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _themes_default_assets_images_flags_png__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themes/default/assets/images/flags.png */ "./node_modules/semantic-ui-css/themes/default/assets/images/flags.png"); +/* harmony import */ var _themes_default_assets_fonts_icons_eot__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./themes/default/assets/fonts/icons.eot */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.eot"); +/* harmony import */ var _themes_default_assets_fonts_icons_woff2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./themes/default/assets/fonts/icons.woff2 */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.woff2"); +/* harmony import */ var _themes_default_assets_fonts_icons_woff__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themes/default/assets/fonts/icons.woff */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.woff"); +/* harmony import */ var _themes_default_assets_fonts_icons_ttf__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themes/default/assets/fonts/icons.ttf */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.ttf"); +/* harmony import */ var _themes_default_assets_fonts_icons_svg__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./themes/default/assets/fonts/icons.svg */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.svg"); +/* harmony import */ var _themes_default_assets_fonts_outline_icons_eot__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./themes/default/assets/fonts/outline-icons.eot */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.eot"); +/* harmony import */ var _themes_default_assets_fonts_outline_icons_woff2__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./themes/default/assets/fonts/outline-icons.woff2 */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.woff2"); +/* harmony import */ var _themes_default_assets_fonts_outline_icons_woff__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./themes/default/assets/fonts/outline-icons.woff */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.woff"); +/* harmony import */ var _themes_default_assets_fonts_outline_icons_ttf__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./themes/default/assets/fonts/outline-icons.ttf */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.ttf"); +/* harmony import */ var _themes_default_assets_fonts_outline_icons_svg__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./themes/default/assets/fonts/outline-icons.svg */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.svg"); +/* harmony import */ var _themes_default_assets_fonts_brand_icons_eot__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./themes/default/assets/fonts/brand-icons.eot */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.eot"); +/* harmony import */ var _themes_default_assets_fonts_brand_icons_woff2__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./themes/default/assets/fonts/brand-icons.woff2 */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.woff2"); +/* harmony import */ var _themes_default_assets_fonts_brand_icons_woff__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./themes/default/assets/fonts/brand-icons.woff */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.woff"); +/* harmony import */ var _themes_default_assets_fonts_brand_icons_ttf__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./themes/default/assets/fonts/brand-icons.ttf */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.ttf"); +/* harmony import */ var _themes_default_assets_fonts_brand_icons_svg__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./themes/default/assets/fonts/brand-icons.svg */ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.svg"); +// Imports + + + + + + + + + + + + + + + + + + +var ___CSS_LOADER_EXPORT___ = _next_dist_compiled_css_loader_api_js__WEBPACK_IMPORTED_MODULE_0___default()(true); +___CSS_LOADER_EXPORT___.push([module.i, "@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin);"]); +var ___CSS_LOADER_URL_REPLACEMENT_0___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_images_flags_png__WEBPACK_IMPORTED_MODULE_2__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_1___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_icons_eot__WEBPACK_IMPORTED_MODULE_3__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_2___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_icons_eot__WEBPACK_IMPORTED_MODULE_3__["default"], { hash: "?#iefix" }); +var ___CSS_LOADER_URL_REPLACEMENT_3___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_icons_woff2__WEBPACK_IMPORTED_MODULE_4__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_4___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_icons_woff__WEBPACK_IMPORTED_MODULE_5__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_5___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_icons_ttf__WEBPACK_IMPORTED_MODULE_6__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_6___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_icons_svg__WEBPACK_IMPORTED_MODULE_7__["default"], { hash: "#icons" }); +var ___CSS_LOADER_URL_REPLACEMENT_7___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_outline_icons_eot__WEBPACK_IMPORTED_MODULE_8__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_8___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_outline_icons_eot__WEBPACK_IMPORTED_MODULE_8__["default"], { hash: "?#iefix" }); +var ___CSS_LOADER_URL_REPLACEMENT_9___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_outline_icons_woff2__WEBPACK_IMPORTED_MODULE_9__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_10___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_outline_icons_woff__WEBPACK_IMPORTED_MODULE_10__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_11___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_outline_icons_ttf__WEBPACK_IMPORTED_MODULE_11__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_12___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_outline_icons_svg__WEBPACK_IMPORTED_MODULE_12__["default"], { hash: "#icons" }); +var ___CSS_LOADER_URL_REPLACEMENT_13___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_brand_icons_eot__WEBPACK_IMPORTED_MODULE_13__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_14___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_brand_icons_eot__WEBPACK_IMPORTED_MODULE_13__["default"], { hash: "?#iefix" }); +var ___CSS_LOADER_URL_REPLACEMENT_15___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_brand_icons_woff2__WEBPACK_IMPORTED_MODULE_14__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_16___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_brand_icons_woff__WEBPACK_IMPORTED_MODULE_15__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_17___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_brand_icons_ttf__WEBPACK_IMPORTED_MODULE_16__["default"]); +var ___CSS_LOADER_URL_REPLACEMENT_18___ = _next_dist_compiled_css_loader_getUrl_js__WEBPACK_IMPORTED_MODULE_1___default()(_themes_default_assets_fonts_brand_icons_svg__WEBPACK_IMPORTED_MODULE_17__["default"], { hash: "#icons" }); +// Module +___CSS_LOADER_EXPORT___.push([module.i, " /*\n * # Semantic UI - 2.4.0\n * https://github.com/Semantic-Org/Semantic-UI\n * http://www.semantic-ui.com/\n *\n * Copyright 2014 Contributors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n *//*!\n * # Semantic UI 2.4.0 - Reset\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=email],input[type=password],input[type=search],input[type=text]{-webkit-appearance:none;-moz-appearance:none}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*!\n * # Semantic UI 2.4.0 - Site\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */body,html{height:100%}html{font-size:14px}body{margin:0;padding:0;overflow-x:hidden;min-width:320px;background:#fff;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87);font-smoothing:antialiased}h1,h2,h3,h4,h5{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.28571429em;margin:calc(2rem - .14285714em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.71428571rem}h3{font-size:1.28571429rem}h4{font-size:1.07142857rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}p:first-child{margin-top:0}p:last-child{margin-bottom:0}a{color:#4183c4;text-decoration:none}a:hover{color:#1e70bf;text-decoration:none}::-webkit-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}body ::-webkit-scrollbar{-webkit-appearance:none;width:10px;height:10px}body ::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:0}body ::-webkit-scrollbar-thumb{cursor:pointer;border-radius:5px;background:rgba(0,0,0,.25);-webkit-transition:color .2s ease;transition:color .2s ease}body ::-webkit-scrollbar-thumb:window-inactive{background:rgba(0,0,0,.15)}body ::-webkit-scrollbar-thumb:hover{background:rgba(128,135,139,.8)}body .ui.inverted::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}body .ui.inverted::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}body .ui.inverted::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}body .ui.inverted::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}/*!\n * # Semantic UI 2.4.0 - Button\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#e0e1e2 none;color:rgba(0,0,0,.6);font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em .78571429em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;will-change:'';-webkit-tap-highlight-color:transparent}.ui.button:hover{background-color:#cacbcd;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;color:rgba(0,0,0,.8)}.ui.button:hover .icon{opacity:.85}.ui.button:focus{background-color:#cacbcd;color:rgba(0,0,0,.8);background-image:''!important;-webkit-box-shadow:''!important;box-shadow:''!important}.ui.button:focus .icon{opacity:.85}.ui.active.button:active,.ui.button:active{background-color:#babbbc;background-image:'';color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px transparent inset,none;box-shadow:0 0 0 1px transparent inset,none}.ui.active.button{background-color:#c0c1c2;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset;color:rgba(0,0,0,.95)}.ui.active.button:hover{background-color:#c0c1c2;background-image:none;color:rgba(0,0,0,.95)}.ui.active.button:active{background-color:#c0c1c2;background-image:none}.ui.loading.loading.loading.loading.loading.loading.button{position:relative;cursor:default;text-shadow:none!important;color:transparent!important;opacity:1;pointer-events:auto;-webkit-transition:all 0s linear,opacity .1s ease;transition:all 0s linear,opacity .1s ease}.ui.loading.button:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.ui.loading.button:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}@-webkit-keyframes button-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes button-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.loading.button:not(.inverted):before{border-color:rgba(0,0,0,.1)}.ui.basic.loading.button:not(.inverted):after{border-top-color:#767676}.ui.button:disabled,.ui.buttons .disabled.button,.ui.disabled.active.button,.ui.disabled.button,.ui.disabled.button:hover{cursor:default;opacity:.45!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;pointer-events:none!important}.ui.basic.buttons .ui.disabled.button{border-color:rgba(34,36,38,.5)}.ui.animated.button{position:relative;overflow:hidden;padding-right:0!important;vertical-align:middle;z-index:1}.ui.animated.button .content{will-change:transform,opacity}.ui.animated.button .visible.content{position:relative;margin-right:1.5em}.ui.animated.button .hidden.content{position:absolute;width:100%}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button .visible.content{left:auto;right:0}.ui.animated.button .hidden.content{top:50%;left:auto;right:-100%;margin-top:-.5em}.ui.animated.button:focus .visible.content,.ui.animated.button:hover .visible.content{left:auto;right:200%}.ui.animated.button:focus .hidden.content,.ui.animated.button:hover .hidden.content{left:auto;right:0}.ui.vertical.animated.button .hidden.content,.ui.vertical.animated.button .visible.content{-webkit-transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,transform .3s ease;transition:top .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.vertical.animated.button .visible.content{-webkit-transform:translateY(0);transform:translateY(0);right:auto}.ui.vertical.animated.button .hidden.content{top:-50%;left:0;right:auto}.ui.vertical.animated.button:focus .visible.content,.ui.vertical.animated.button:hover .visible.content{-webkit-transform:translateY(200%);transform:translateY(200%);right:auto}.ui.vertical.animated.button:focus .hidden.content,.ui.vertical.animated.button:hover .hidden.content{top:50%;right:auto}.ui.fade.animated.button .hidden.content,.ui.fade.animated.button .visible.content{-webkit-transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,transform .3s ease;transition:opacity .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.fade.animated.button .visible.content{left:auto;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.fade.animated.button .hidden.content{opacity:0;left:0;right:auto;-webkit-transform:scale(1.5);transform:scale(1.5)}.ui.fade.animated.button:focus .visible.content,.ui.fade.animated.button:hover .visible.content{left:auto;right:auto;opacity:0;-webkit-transform:scale(.75);transform:scale(.75)}.ui.fade.animated.button:focus .hidden.content,.ui.fade.animated.button:hover .hidden.content{left:0;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.inverted.button{-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;background:transparent none;color:#fff;text-shadow:none!important}.ui.inverted.buttons .button{margin:0 0 0 -2px}.ui.inverted.buttons .button:first-child{margin-left:0}.ui.inverted.vertical.buttons .button{margin:0 0 -2px 0}.ui.inverted.vertical.buttons .button:first-child{margin-top:0}.ui.inverted.button:hover{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active,.ui.inverted.button:focus{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active:focus{background:#dcddde;-webkit-box-shadow:0 0 0 2px #dcddde inset!important;box-shadow:0 0 0 2px #dcddde inset!important;color:rgba(0,0,0,.8)}.ui.labeled.button:not(.icon){display:inline-flex;flex-direction:row;background:0 0!important;padding:0!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.labeled.button>.button{margin:0}.ui.labeled.button>.label{display:flex;align-items:center;margin:0 0 0 -1px!important;padding:'';font-size:1em;border-color:rgba(34,36,38,.15)}.ui.labeled.button>.tag.label:before{width:1.85em;height:1.85em}.ui.labeled.button:not([class*=\"left labeled\"])>.button{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.button:not([class*=\"left labeled\"])>.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*=\"left labeled\"].button>.button{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*=\"left labeled\"].button>.label{border-top-right-radius:0;border-bottom-right-radius:0}.ui.facebook.button{background-color:#3b5998;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.facebook.button:hover{background-color:#304d8a;color:#fff;text-shadow:none}.ui.facebook.button:active{background-color:#2d4373;color:#fff;text-shadow:none}.ui.twitter.button{background-color:#55acee;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.twitter.button:hover{background-color:#35a2f4;color:#fff;text-shadow:none}.ui.twitter.button:active{background-color:#2795e9;color:#fff;text-shadow:none}.ui.google.plus.button{background-color:#dd4b39;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.google.plus.button:hover{background-color:#e0321c;color:#fff;text-shadow:none}.ui.google.plus.button:active{background-color:#c23321;color:#fff;text-shadow:none}.ui.linkedin.button{background-color:#1f88be;color:#fff;text-shadow:none}.ui.linkedin.button:hover{background-color:#147baf;color:#fff;text-shadow:none}.ui.linkedin.button:active{background-color:#186992;color:#fff;text-shadow:none}.ui.youtube.button{background-color:red;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.youtube.button:hover{background-color:#e60000;color:#fff;text-shadow:none}.ui.youtube.button:active{background-color:#c00;color:#fff;text-shadow:none}.ui.instagram.button{background-color:#49769c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.instagram.button:hover{background-color:#3d698e;color:#fff;text-shadow:none}.ui.instagram.button:active{background-color:#395c79;color:#fff;text-shadow:none}.ui.pinterest.button{background-color:#bd081c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pinterest.button:hover{background-color:#ac0013;color:#fff;text-shadow:none}.ui.pinterest.button:active{background-color:#8c0615;color:#fff;text-shadow:none}.ui.vk.button{background-color:#4d7198;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.vk.button:hover{background-color:#41648a;color:#fff}.ui.vk.button:active{background-color:#3c5876;color:#fff}.ui.button>.icon:not(.button){height:.85714286em;opacity:.8;margin:0 .42857143em 0 -.21428571em;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;vertical-align:'';color:''}.ui.button:not(.icon)>.icon:not(.button):not(.dropdown){margin:0 .42857143em 0 -.21428571em}.ui.button:not(.icon)>.right.icon:not(.button):not(.dropdown){margin:0 -.21428571em 0 .42857143em}.ui[class*=\"left floated\"].button,.ui[class*=\"left floated\"].buttons{float:left;margin-left:0;margin-right:.25em}.ui[class*=\"right floated\"].button,.ui[class*=\"right floated\"].buttons{float:right;margin-right:0;margin-left:.25em}.ui.compact.button,.ui.compact.buttons .button{padding:.58928571em 1.125em .58928571em}.ui.compact.icon.button,.ui.compact.icon.buttons .button{padding:.58928571em .58928571em .58928571em}.ui.compact.labeled.icon.button,.ui.compact.labeled.icon.buttons .button{padding:.58928571em 3.69642857em .58928571em}.ui.mini.button,.ui.mini.buttons .button,.ui.mini.buttons .or{font-size:.78571429rem}.ui.tiny.button,.ui.tiny.buttons .button,.ui.tiny.buttons .or{font-size:.85714286rem}.ui.small.button,.ui.small.buttons .button,.ui.small.buttons .or{font-size:.92857143rem}.ui.button,.ui.buttons .button,.ui.buttons .or{font-size:1rem}.ui.large.button,.ui.large.buttons .button,.ui.large.buttons .or{font-size:1.14285714rem}.ui.big.button,.ui.big.buttons .button,.ui.big.buttons .or{font-size:1.28571429rem}.ui.huge.button,.ui.huge.buttons .button,.ui.huge.buttons .or{font-size:1.42857143rem}.ui.massive.button,.ui.massive.buttons .button,.ui.massive.buttons .or{font-size:1.71428571rem}.ui.icon.button,.ui.icon.buttons .button{padding:.78571429em .78571429em .78571429em}.ui.icon.button>.icon,.ui.icon.buttons .button>.icon{opacity:.9;margin:0!important;vertical-align:top}.ui.basic.button,.ui.basic.buttons .button{background:transparent none!important;color:rgba(0,0,0,.6)!important;font-weight:400;border-radius:.28571429rem;text-transform:none;text-shadow:none!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.basic.buttons{-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem}.ui.basic.buttons .button{border-radius:0}.ui.basic.button:hover,.ui.basic.buttons .button:hover{background:#fff!important;color:rgba(0,0,0,.8)!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:focus,.ui.basic.buttons .button:focus{background:#fff!important;color:rgba(0,0,0,.8)!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:active,.ui.basic.buttons .button:active{background:#f8f8f8!important;color:rgba(0,0,0,.9)!important;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset}.ui.basic.active.button,.ui.basic.buttons .active.button{background:rgba(0,0,0,.05)!important;-webkit-box-shadow:''!important;box-shadow:''!important;color:rgba(0,0,0,.95)!important}.ui.basic.active.button:hover,.ui.basic.buttons .active.button:hover{background-color:rgba(0,0,0,.05)}.ui.basic.buttons .button:hover{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .active.button{-webkit-box-shadow:''!important;box-shadow:''!important}.ui.basic.inverted.button,.ui.basic.inverted.buttons .button{background-color:transparent!important;color:#f9fafb!important;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important}.ui.basic.inverted.button:hover,.ui.basic.inverted.buttons .button:hover{color:#fff!important;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.inverted.button:focus,.ui.basic.inverted.buttons .button:focus{color:#fff!important;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.inverted.button:active,.ui.basic.inverted.buttons .button:active{background-color:rgba(255,255,255,.08)!important;color:#fff!important;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.9) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.9) inset!important}.ui.basic.inverted.active.button,.ui.basic.inverted.buttons .active.button{background-color:rgba(255,255,255,.08);color:#fff;text-shadow:none;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.7) inset;box-shadow:0 0 0 2px rgba(255,255,255,.7) inset}.ui.basic.inverted.active.button:hover,.ui.basic.inverted.buttons .active.button:hover{background-color:rgba(255,255,255,.15);-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.buttons .button{border-left:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.vertical.buttons .button{border-left:none}.ui.basic.vertical.buttons .button{border-left-width:0;border-top:1px solid rgba(34,36,38,.15)}.ui.basic.vertical.buttons .button:first-child{border-top-width:0}.ui.labeled.icon.button,.ui.labeled.icon.buttons .button{position:relative;padding-left:4.07142857em!important;padding-right:1.5em!important}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{position:absolute;height:100%;line-height:1;border-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit;text-align:center;margin:0;width:2.57142857em;background-color:rgba(0,0,0,.05);color:'';-webkit-box-shadow:-1px 0 0 0 transparent inset;box-shadow:-1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{top:0;left:0}.ui[class*=\"right labeled\"].icon.button{padding-right:4.07142857em!important;padding-left:1.5em!important}.ui[class*=\"right labeled\"].icon.button>.icon{left:auto;right:0;border-radius:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit;-webkit-box-shadow:1px 0 0 0 transparent inset;box-shadow:1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon:after,.ui.labeled.icon.button>.icon:before,.ui.labeled.icon.buttons>.button>.icon:after,.ui.labeled.icon.buttons>.button>.icon:before{display:block;position:absolute;width:100%;top:50%;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.labeled.icon.buttons .button>.icon{border-radius:0}.ui.labeled.icon.buttons .button:first-child>.icon{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.buttons .button:last-child>.icon{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:first-child>.icon{border-radius:0;border-top-left-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:last-child>.icon{border-radius:0;border-bottom-left-radius:.28571429rem}.ui.fluid[class*=\"left labeled\"].icon.button,.ui.fluid[class*=\"right labeled\"].icon.button{padding-left:1.5em!important;padding-right:1.5em!important}.ui.button.toggle.active,.ui.buttons .button.toggle.active,.ui.toggle.buttons .active.button{background-color:#21ba45!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none;color:#fff!important}.ui.button.toggle.active:hover{background-color:#16ab39!important;text-shadow:none;color:#fff!important}.ui.circular.button{border-radius:10em}.ui.circular.button>.icon{width:1em;vertical-align:baseline}.ui.buttons .or{position:relative;width:.3em;height:2.57142857em;z-index:3}.ui.buttons .or:before{position:absolute;text-align:center;border-radius:500rem;content:'or';top:50%;left:50%;background-color:#fff;text-shadow:none;margin-top:-.89285714em;margin-left:-.89285714em;width:1.78571429em;height:1.78571429em;line-height:1.78571429em;color:rgba(0,0,0,.4);font-style:normal;font-weight:700;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset}.ui.buttons .or[data-text]:before{content:attr(data-text)}.ui.fluid.buttons .or{width:0!important}.ui.fluid.buttons .or:after{display:none}.ui.attached.button{position:relative;display:block;margin:0;border-radius:0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15)!important;box-shadow:0 0 0 1px rgba(34,36,38,.15)!important}.ui.attached.top.button{border-radius:.28571429rem .28571429rem 0 0}.ui.attached.bottom.button{border-radius:0 0 .28571429rem .28571429rem}.ui.left.attached.button{display:inline-block;border-left:none;text-align:right;padding-right:.75em;border-radius:.28571429rem 0 0 .28571429rem}.ui.right.attached.button{display:inline-block;text-align:left;padding-left:.75em;border-radius:0 .28571429rem .28571429rem 0}.ui.attached.buttons{position:relative;display:flex;border-radius:0;width:auto!important;z-index:2;margin-left:-1px;margin-right:-1px}.ui.attached.buttons .button{margin:0}.ui.attached.buttons .button:first-child{border-radius:0}.ui.attached.buttons .button:last-child{border-radius:0}.ui[class*=\"top attached\"].buttons{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0}.ui[class*=\"top attached\"].buttons .button:first-child{border-radius:.28571429rem 0 0 0}.ui[class*=\"top attached\"].buttons .button:last-child{border-radius:0 .28571429rem 0 0}.ui[class*=\"bottom attached\"].buttons{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"bottom attached\"].buttons .button:first-child{border-radius:0 0 0 .28571429rem}.ui[class*=\"bottom attached\"].buttons .button:last-child{border-radius:0 0 .28571429rem 0}.ui[class*=\"left attached\"].buttons{display:inline-flex;margin-right:0;margin-left:-1px;border-radius:0 .28571429rem .28571429rem 0}.ui[class*=\"left attached\"].buttons .button:first-child{margin-left:-1px;border-radius:0 .28571429rem 0 0}.ui[class*=\"left attached\"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 .28571429rem 0}.ui[class*=\"right attached\"].buttons{display:inline-flex;margin-left:0;margin-right:-1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"right attached\"].buttons .button:first-child{margin-left:-1px;border-radius:.28571429rem 0 0 0}.ui[class*=\"right attached\"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 0 .28571429rem}.ui.fluid.button,.ui.fluid.buttons{width:100%}.ui.fluid.button{display:block}.ui.two.buttons{width:100%}.ui.two.buttons>.button{width:50%}.ui.three.buttons{width:100%}.ui.three.buttons>.button{width:33.333%}.ui.four.buttons{width:100%}.ui.four.buttons>.button{width:25%}.ui.five.buttons{width:100%}.ui.five.buttons>.button{width:20%}.ui.six.buttons{width:100%}.ui.six.buttons>.button{width:16.666%}.ui.seven.buttons{width:100%}.ui.seven.buttons>.button{width:14.285%}.ui.eight.buttons{width:100%}.ui.eight.buttons>.button{width:12.5%}.ui.nine.buttons{width:100%}.ui.nine.buttons>.button{width:11.11%}.ui.ten.buttons{width:100%}.ui.ten.buttons>.button{width:10%}.ui.eleven.buttons{width:100%}.ui.eleven.buttons>.button{width:9.09%}.ui.twelve.buttons{width:100%}.ui.twelve.buttons>.button{width:8.3333%}.ui.fluid.vertical.buttons,.ui.fluid.vertical.buttons>.button{display:flex;width:auto}.ui.two.vertical.buttons>.button{height:50%}.ui.three.vertical.buttons>.button{height:33.333%}.ui.four.vertical.buttons>.button{height:25%}.ui.five.vertical.buttons>.button{height:20%}.ui.six.vertical.buttons>.button{height:16.666%}.ui.seven.vertical.buttons>.button{height:14.285%}.ui.eight.vertical.buttons>.button{height:12.5%}.ui.nine.vertical.buttons>.button{height:11.11%}.ui.ten.vertical.buttons>.button{height:10%}.ui.eleven.vertical.buttons>.button{height:9.09%}.ui.twelve.vertical.buttons>.button{height:8.3333%}.ui.black.button,.ui.black.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.black.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.black.button:hover,.ui.black.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.black.button:focus,.ui.black.buttons .button:focus{background-color:#2f3032;color:#fff;text-shadow:none}.ui.black.button:active,.ui.black.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.black.active.button,.ui.black.button .active.button:active,.ui.black.buttons .active.button,.ui.black.buttons .active.button:active{background-color:#0f0f10;color:#fff;text-shadow:none}.ui.basic.black.button,.ui.basic.black.buttons .button{-webkit-box-shadow:0 0 0 1px #1b1c1d inset!important;box-shadow:0 0 0 1px #1b1c1d inset!important;color:#1b1c1d!important}.ui.basic.black.button:hover,.ui.basic.black.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#27292a!important}.ui.basic.black.button:focus,.ui.basic.black.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #2f3032 inset!important;box-shadow:0 0 0 1px #2f3032 inset!important;color:#27292a!important}.ui.basic.black.active.button,.ui.basic.black.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0f0f10 inset!important;box-shadow:0 0 0 1px #0f0f10 inset!important;color:#343637!important}.ui.basic.black.button:active,.ui.basic.black.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset!important;box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.buttons:not(.vertical)>.basic.black.button:not(:first-child){margin-left:-1px}.ui.inverted.black.button,.ui.inverted.black.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset!important;box-shadow:0 0 0 2px #d4d4d5 inset!important;color:#fff}.ui.inverted.black.button.active,.ui.inverted.black.button:active,.ui.inverted.black.button:focus,.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button.active,.ui.inverted.black.buttons .button:active,.ui.inverted.black.buttons .button:focus,.ui.inverted.black.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button:hover{background-color:#000}.ui.inverted.black.button:focus,.ui.inverted.black.buttons .button:focus{background-color:#000}.ui.inverted.black.active.button,.ui.inverted.black.buttons .active.button{background-color:#000}.ui.inverted.black.button:active,.ui.inverted.black.buttons .button:active{background-color:#000}.ui.inverted.black.basic.button,.ui.inverted.black.basic.buttons .button,.ui.inverted.black.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.black.basic.button:hover,.ui.inverted.black.basic.buttons .button:hover,.ui.inverted.black.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.inverted.black.basic.button:focus,.ui.inverted.black.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#545454!important}.ui.inverted.black.basic.active.button,.ui.inverted.black.basic.buttons .active.button,.ui.inverted.black.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.inverted.black.basic.button:active,.ui.inverted.black.basic.buttons .button:active,.ui.inverted.black.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.grey.button,.ui.grey.buttons .button{background-color:#767676;color:#fff;text-shadow:none;background-image:none}.ui.grey.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.grey.button:hover,.ui.grey.buttons .button:hover{background-color:#838383;color:#fff;text-shadow:none}.ui.grey.button:focus,.ui.grey.buttons .button:focus{background-color:#8a8a8a;color:#fff;text-shadow:none}.ui.grey.button:active,.ui.grey.buttons .button:active{background-color:#909090;color:#fff;text-shadow:none}.ui.grey.active.button,.ui.grey.button .active.button:active,.ui.grey.buttons .active.button,.ui.grey.buttons .active.button:active{background-color:#696969;color:#fff;text-shadow:none}.ui.basic.grey.button,.ui.basic.grey.buttons .button{-webkit-box-shadow:0 0 0 1px #767676 inset!important;box-shadow:0 0 0 1px #767676 inset!important;color:#767676!important}.ui.basic.grey.button:hover,.ui.basic.grey.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #838383 inset!important;box-shadow:0 0 0 1px #838383 inset!important;color:#838383!important}.ui.basic.grey.button:focus,.ui.basic.grey.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #8a8a8a inset!important;box-shadow:0 0 0 1px #8a8a8a inset!important;color:#838383!important}.ui.basic.grey.active.button,.ui.basic.grey.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #696969 inset!important;box-shadow:0 0 0 1px #696969 inset!important;color:#909090!important}.ui.basic.grey.button:active,.ui.basic.grey.buttons .button:active{-webkit-box-shadow:0 0 0 1px #909090 inset!important;box-shadow:0 0 0 1px #909090 inset!important;color:#909090!important}.ui.buttons:not(.vertical)>.basic.grey.button:not(:first-child){margin-left:-1px}.ui.inverted.grey.button,.ui.inverted.grey.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset!important;box-shadow:0 0 0 2px #d4d4d5 inset!important;color:#fff}.ui.inverted.grey.button.active,.ui.inverted.grey.button:active,.ui.inverted.grey.button:focus,.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button.active,.ui.inverted.grey.buttons .button:active,.ui.inverted.grey.buttons .button:focus,.ui.inverted.grey.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button:hover{background-color:#cfd0d2}.ui.inverted.grey.button:focus,.ui.inverted.grey.buttons .button:focus{background-color:#c7c9cb}.ui.inverted.grey.active.button,.ui.inverted.grey.buttons .active.button{background-color:#cfd0d2}.ui.inverted.grey.button:active,.ui.inverted.grey.buttons .button:active{background-color:#c2c4c5}.ui.inverted.grey.basic.button,.ui.inverted.grey.basic.buttons .button,.ui.inverted.grey.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.grey.basic.button:hover,.ui.inverted.grey.basic.buttons .button:hover,.ui.inverted.grey.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset!important;box-shadow:0 0 0 2px #cfd0d2 inset!important;color:#fff!important}.ui.inverted.grey.basic.button:focus,.ui.inverted.grey.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c7c9cb inset!important;box-shadow:0 0 0 2px #c7c9cb inset!important;color:#dcddde!important}.ui.inverted.grey.basic.active.button,.ui.inverted.grey.basic.buttons .active.button,.ui.inverted.grey.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset!important;box-shadow:0 0 0 2px #cfd0d2 inset!important;color:#fff!important}.ui.inverted.grey.basic.button:active,.ui.inverted.grey.basic.buttons .button:active,.ui.inverted.grey.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset!important;box-shadow:0 0 0 2px #c2c4c5 inset!important;color:#fff!important}.ui.brown.button,.ui.brown.buttons .button{background-color:#a5673f;color:#fff;text-shadow:none;background-image:none}.ui.brown.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.brown.button:hover,.ui.brown.buttons .button:hover{background-color:#975b33;color:#fff;text-shadow:none}.ui.brown.button:focus,.ui.brown.buttons .button:focus{background-color:#90532b;color:#fff;text-shadow:none}.ui.brown.button:active,.ui.brown.buttons .button:active{background-color:#805031;color:#fff;text-shadow:none}.ui.brown.active.button,.ui.brown.button .active.button:active,.ui.brown.buttons .active.button,.ui.brown.buttons .active.button:active{background-color:#995a31;color:#fff;text-shadow:none}.ui.basic.brown.button,.ui.basic.brown.buttons .button{-webkit-box-shadow:0 0 0 1px #a5673f inset!important;box-shadow:0 0 0 1px #a5673f inset!important;color:#a5673f!important}.ui.basic.brown.button:hover,.ui.basic.brown.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #975b33 inset!important;box-shadow:0 0 0 1px #975b33 inset!important;color:#975b33!important}.ui.basic.brown.button:focus,.ui.basic.brown.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #90532b inset!important;box-shadow:0 0 0 1px #90532b inset!important;color:#975b33!important}.ui.basic.brown.active.button,.ui.basic.brown.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #995a31 inset!important;box-shadow:0 0 0 1px #995a31 inset!important;color:#805031!important}.ui.basic.brown.button:active,.ui.basic.brown.buttons .button:active{-webkit-box-shadow:0 0 0 1px #805031 inset!important;box-shadow:0 0 0 1px #805031 inset!important;color:#805031!important}.ui.buttons:not(.vertical)>.basic.brown.button:not(:first-child){margin-left:-1px}.ui.inverted.brown.button,.ui.inverted.brown.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d67c1c inset!important;box-shadow:0 0 0 2px #d67c1c inset!important;color:#d67c1c}.ui.inverted.brown.button.active,.ui.inverted.brown.button:active,.ui.inverted.brown.button:focus,.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button.active,.ui.inverted.brown.buttons .button:active,.ui.inverted.brown.buttons .button:focus,.ui.inverted.brown.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button:hover{background-color:#c86f11}.ui.inverted.brown.button:focus,.ui.inverted.brown.buttons .button:focus{background-color:#c16808}.ui.inverted.brown.active.button,.ui.inverted.brown.buttons .active.button{background-color:#cc6f0d}.ui.inverted.brown.button:active,.ui.inverted.brown.buttons .button:active{background-color:#a96216}.ui.inverted.brown.basic.button,.ui.inverted.brown.basic.buttons .button,.ui.inverted.brown.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.brown.basic.button:hover,.ui.inverted.brown.basic.buttons .button:hover,.ui.inverted.brown.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #c86f11 inset!important;box-shadow:0 0 0 2px #c86f11 inset!important;color:#d67c1c!important}.ui.inverted.brown.basic.button:focus,.ui.inverted.brown.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c16808 inset!important;box-shadow:0 0 0 2px #c16808 inset!important;color:#d67c1c!important}.ui.inverted.brown.basic.active.button,.ui.inverted.brown.basic.buttons .active.button,.ui.inverted.brown.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cc6f0d inset!important;box-shadow:0 0 0 2px #cc6f0d inset!important;color:#d67c1c!important}.ui.inverted.brown.basic.button:active,.ui.inverted.brown.basic.buttons .button:active,.ui.inverted.brown.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #a96216 inset!important;box-shadow:0 0 0 2px #a96216 inset!important;color:#d67c1c!important}.ui.blue.button,.ui.blue.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.blue.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.blue.button:hover,.ui.blue.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.blue.button:focus,.ui.blue.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.blue.button:active,.ui.blue.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.blue.active.button,.ui.blue.button .active.button:active,.ui.blue.buttons .active.button,.ui.blue.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.blue.button,.ui.basic.blue.buttons .button{-webkit-box-shadow:0 0 0 1px #2185d0 inset!important;box-shadow:0 0 0 1px #2185d0 inset!important;color:#2185d0!important}.ui.basic.blue.button:hover,.ui.basic.blue.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1678c2 inset!important;box-shadow:0 0 0 1px #1678c2 inset!important;color:#1678c2!important}.ui.basic.blue.button:focus,.ui.basic.blue.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0d71bb inset!important;box-shadow:0 0 0 1px #0d71bb inset!important;color:#1678c2!important}.ui.basic.blue.active.button,.ui.basic.blue.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1279c6 inset!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.blue.button:active,.ui.basic.blue.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset!important;box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.buttons:not(.vertical)>.basic.blue.button:not(:first-child){margin-left:-1px}.ui.inverted.blue.button,.ui.inverted.blue.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset!important;box-shadow:0 0 0 2px #54c8ff inset!important;color:#54c8ff}.ui.inverted.blue.button.active,.ui.inverted.blue.button:active,.ui.inverted.blue.button:focus,.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button.active,.ui.inverted.blue.buttons .button:active,.ui.inverted.blue.buttons .button:focus,.ui.inverted.blue.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button:hover{background-color:#3ac0ff}.ui.inverted.blue.button:focus,.ui.inverted.blue.buttons .button:focus{background-color:#2bbbff}.ui.inverted.blue.active.button,.ui.inverted.blue.buttons .active.button{background-color:#3ac0ff}.ui.inverted.blue.button:active,.ui.inverted.blue.buttons .button:active{background-color:#21b8ff}.ui.inverted.blue.basic.button,.ui.inverted.blue.basic.buttons .button,.ui.inverted.blue.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.blue.basic.button:hover,.ui.inverted.blue.basic.buttons .button:hover,.ui.inverted.blue.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.blue.basic.button:focus,.ui.inverted.blue.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset!important;box-shadow:0 0 0 2px #2bbbff inset!important;color:#54c8ff!important}.ui.inverted.blue.basic.active.button,.ui.inverted.blue.basic.buttons .active.button,.ui.inverted.blue.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.blue.basic.button:active,.ui.inverted.blue.basic.buttons .button:active,.ui.inverted.blue.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset!important;box-shadow:0 0 0 2px #21b8ff inset!important;color:#54c8ff!important}.ui.green.button,.ui.green.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.green.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.green.button:hover,.ui.green.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.green.button:focus,.ui.green.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.green.button:active,.ui.green.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.green.active.button,.ui.green.button .active.button:active,.ui.green.buttons .active.button,.ui.green.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.green.button,.ui.basic.green.buttons .button{-webkit-box-shadow:0 0 0 1px #21ba45 inset!important;box-shadow:0 0 0 1px #21ba45 inset!important;color:#21ba45!important}.ui.basic.green.button:hover,.ui.basic.green.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #16ab39 inset!important;box-shadow:0 0 0 1px #16ab39 inset!important;color:#16ab39!important}.ui.basic.green.button:focus,.ui.basic.green.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0ea432 inset!important;box-shadow:0 0 0 1px #0ea432 inset!important;color:#16ab39!important}.ui.basic.green.active.button,.ui.basic.green.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #13ae38 inset!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.green.button:active,.ui.basic.green.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset!important;box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.buttons:not(.vertical)>.basic.green.button:not(:first-child){margin-left:-1px}.ui.inverted.green.button,.ui.inverted.green.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #2ecc40 inset!important;box-shadow:0 0 0 2px #2ecc40 inset!important;color:#2ecc40}.ui.inverted.green.button.active,.ui.inverted.green.button:active,.ui.inverted.green.button:focus,.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button.active,.ui.inverted.green.buttons .button:active,.ui.inverted.green.buttons .button:focus,.ui.inverted.green.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button:hover{background-color:#22be34}.ui.inverted.green.button:focus,.ui.inverted.green.buttons .button:focus{background-color:#19b82b}.ui.inverted.green.active.button,.ui.inverted.green.buttons .active.button{background-color:#1fc231}.ui.inverted.green.button:active,.ui.inverted.green.buttons .button:active{background-color:#25a233}.ui.inverted.green.basic.button,.ui.inverted.green.basic.buttons .button,.ui.inverted.green.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.green.basic.button:hover,.ui.inverted.green.basic.buttons .button:hover,.ui.inverted.green.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #22be34 inset!important;box-shadow:0 0 0 2px #22be34 inset!important;color:#2ecc40!important}.ui.inverted.green.basic.button:focus,.ui.inverted.green.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #19b82b inset!important;box-shadow:0 0 0 2px #19b82b inset!important;color:#2ecc40!important}.ui.inverted.green.basic.active.button,.ui.inverted.green.basic.buttons .active.button,.ui.inverted.green.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #1fc231 inset!important;box-shadow:0 0 0 2px #1fc231 inset!important;color:#2ecc40!important}.ui.inverted.green.basic.button:active,.ui.inverted.green.basic.buttons .button:active,.ui.inverted.green.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #25a233 inset!important;box-shadow:0 0 0 2px #25a233 inset!important;color:#2ecc40!important}.ui.orange.button,.ui.orange.buttons .button{background-color:#f2711c;color:#fff;text-shadow:none;background-image:none}.ui.orange.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.orange.button:hover,.ui.orange.buttons .button:hover{background-color:#f26202;color:#fff;text-shadow:none}.ui.orange.button:focus,.ui.orange.buttons .button:focus{background-color:#e55b00;color:#fff;text-shadow:none}.ui.orange.button:active,.ui.orange.buttons .button:active{background-color:#cf590c;color:#fff;text-shadow:none}.ui.orange.active.button,.ui.orange.button .active.button:active,.ui.orange.buttons .active.button,.ui.orange.buttons .active.button:active{background-color:#f56100;color:#fff;text-shadow:none}.ui.basic.orange.button,.ui.basic.orange.buttons .button{-webkit-box-shadow:0 0 0 1px #f2711c inset!important;box-shadow:0 0 0 1px #f2711c inset!important;color:#f2711c!important}.ui.basic.orange.button:hover,.ui.basic.orange.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #f26202 inset!important;box-shadow:0 0 0 1px #f26202 inset!important;color:#f26202!important}.ui.basic.orange.button:focus,.ui.basic.orange.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #e55b00 inset!important;box-shadow:0 0 0 1px #e55b00 inset!important;color:#f26202!important}.ui.basic.orange.active.button,.ui.basic.orange.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #f56100 inset!important;box-shadow:0 0 0 1px #f56100 inset!important;color:#cf590c!important}.ui.basic.orange.button:active,.ui.basic.orange.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cf590c inset!important;box-shadow:0 0 0 1px #cf590c inset!important;color:#cf590c!important}.ui.buttons:not(.vertical)>.basic.orange.button:not(:first-child){margin-left:-1px}.ui.inverted.orange.button,.ui.inverted.orange.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff851b inset!important;box-shadow:0 0 0 2px #ff851b inset!important;color:#ff851b}.ui.inverted.orange.button.active,.ui.inverted.orange.button:active,.ui.inverted.orange.button:focus,.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button.active,.ui.inverted.orange.buttons .button:active,.ui.inverted.orange.buttons .button:focus,.ui.inverted.orange.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button:hover{background-color:#ff7701}.ui.inverted.orange.button:focus,.ui.inverted.orange.buttons .button:focus{background-color:#f17000}.ui.inverted.orange.active.button,.ui.inverted.orange.buttons .active.button{background-color:#ff7701}.ui.inverted.orange.button:active,.ui.inverted.orange.buttons .button:active{background-color:#e76b00}.ui.inverted.orange.basic.button,.ui.inverted.orange.basic.buttons .button,.ui.inverted.orange.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.orange.basic.button:hover,.ui.inverted.orange.basic.buttons .button:hover,.ui.inverted.orange.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff7701 inset!important;box-shadow:0 0 0 2px #ff7701 inset!important;color:#ff851b!important}.ui.inverted.orange.basic.button:focus,.ui.inverted.orange.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f17000 inset!important;box-shadow:0 0 0 2px #f17000 inset!important;color:#ff851b!important}.ui.inverted.orange.basic.active.button,.ui.inverted.orange.basic.buttons .active.button,.ui.inverted.orange.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff7701 inset!important;box-shadow:0 0 0 2px #ff7701 inset!important;color:#ff851b!important}.ui.inverted.orange.basic.button:active,.ui.inverted.orange.basic.buttons .button:active,.ui.inverted.orange.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #e76b00 inset!important;box-shadow:0 0 0 2px #e76b00 inset!important;color:#ff851b!important}.ui.pink.button,.ui.pink.buttons .button{background-color:#e03997;color:#fff;text-shadow:none;background-image:none}.ui.pink.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pink.button:hover,.ui.pink.buttons .button:hover{background-color:#e61a8d;color:#fff;text-shadow:none}.ui.pink.button:focus,.ui.pink.buttons .button:focus{background-color:#e10f85;color:#fff;text-shadow:none}.ui.pink.button:active,.ui.pink.buttons .button:active{background-color:#c71f7e;color:#fff;text-shadow:none}.ui.pink.active.button,.ui.pink.button .active.button:active,.ui.pink.buttons .active.button,.ui.pink.buttons .active.button:active{background-color:#ea158d;color:#fff;text-shadow:none}.ui.basic.pink.button,.ui.basic.pink.buttons .button{-webkit-box-shadow:0 0 0 1px #e03997 inset!important;box-shadow:0 0 0 1px #e03997 inset!important;color:#e03997!important}.ui.basic.pink.button:hover,.ui.basic.pink.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #e61a8d inset!important;box-shadow:0 0 0 1px #e61a8d inset!important;color:#e61a8d!important}.ui.basic.pink.button:focus,.ui.basic.pink.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #e10f85 inset!important;box-shadow:0 0 0 1px #e10f85 inset!important;color:#e61a8d!important}.ui.basic.pink.active.button,.ui.basic.pink.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #ea158d inset!important;box-shadow:0 0 0 1px #ea158d inset!important;color:#c71f7e!important}.ui.basic.pink.button:active,.ui.basic.pink.buttons .button:active{-webkit-box-shadow:0 0 0 1px #c71f7e inset!important;box-shadow:0 0 0 1px #c71f7e inset!important;color:#c71f7e!important}.ui.buttons:not(.vertical)>.basic.pink.button:not(:first-child){margin-left:-1px}.ui.inverted.pink.button,.ui.inverted.pink.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff8edf inset!important;box-shadow:0 0 0 2px #ff8edf inset!important;color:#ff8edf}.ui.inverted.pink.button.active,.ui.inverted.pink.button:active,.ui.inverted.pink.button:focus,.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button.active,.ui.inverted.pink.buttons .button:active,.ui.inverted.pink.buttons .button:focus,.ui.inverted.pink.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button:hover{background-color:#ff74d8}.ui.inverted.pink.button:focus,.ui.inverted.pink.buttons .button:focus{background-color:#ff65d3}.ui.inverted.pink.active.button,.ui.inverted.pink.buttons .active.button{background-color:#ff74d8}.ui.inverted.pink.button:active,.ui.inverted.pink.buttons .button:active{background-color:#ff5bd1}.ui.inverted.pink.basic.button,.ui.inverted.pink.basic.buttons .button,.ui.inverted.pink.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.pink.basic.button:hover,.ui.inverted.pink.basic.buttons .button:hover,.ui.inverted.pink.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff74d8 inset!important;box-shadow:0 0 0 2px #ff74d8 inset!important;color:#ff8edf!important}.ui.inverted.pink.basic.button:focus,.ui.inverted.pink.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff65d3 inset!important;box-shadow:0 0 0 2px #ff65d3 inset!important;color:#ff8edf!important}.ui.inverted.pink.basic.active.button,.ui.inverted.pink.basic.buttons .active.button,.ui.inverted.pink.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff74d8 inset!important;box-shadow:0 0 0 2px #ff74d8 inset!important;color:#ff8edf!important}.ui.inverted.pink.basic.button:active,.ui.inverted.pink.basic.buttons .button:active,.ui.inverted.pink.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset!important;box-shadow:0 0 0 2px #ff5bd1 inset!important;color:#ff8edf!important}.ui.violet.button,.ui.violet.buttons .button{background-color:#6435c9;color:#fff;text-shadow:none;background-image:none}.ui.violet.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.violet.button:hover,.ui.violet.buttons .button:hover{background-color:#5829bb;color:#fff;text-shadow:none}.ui.violet.button:focus,.ui.violet.buttons .button:focus{background-color:#4f20b5;color:#fff;text-shadow:none}.ui.violet.button:active,.ui.violet.buttons .button:active{background-color:#502aa1;color:#fff;text-shadow:none}.ui.violet.active.button,.ui.violet.button .active.button:active,.ui.violet.buttons .active.button,.ui.violet.buttons .active.button:active{background-color:#5626bf;color:#fff;text-shadow:none}.ui.basic.violet.button,.ui.basic.violet.buttons .button{-webkit-box-shadow:0 0 0 1px #6435c9 inset!important;box-shadow:0 0 0 1px #6435c9 inset!important;color:#6435c9!important}.ui.basic.violet.button:hover,.ui.basic.violet.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #5829bb inset!important;box-shadow:0 0 0 1px #5829bb inset!important;color:#5829bb!important}.ui.basic.violet.button:focus,.ui.basic.violet.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #4f20b5 inset!important;box-shadow:0 0 0 1px #4f20b5 inset!important;color:#5829bb!important}.ui.basic.violet.active.button,.ui.basic.violet.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #5626bf inset!important;box-shadow:0 0 0 1px #5626bf inset!important;color:#502aa1!important}.ui.basic.violet.button:active,.ui.basic.violet.buttons .button:active{-webkit-box-shadow:0 0 0 1px #502aa1 inset!important;box-shadow:0 0 0 1px #502aa1 inset!important;color:#502aa1!important}.ui.buttons:not(.vertical)>.basic.violet.button:not(:first-child){margin-left:-1px}.ui.inverted.violet.button,.ui.inverted.violet.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #a291fb inset!important;box-shadow:0 0 0 2px #a291fb inset!important;color:#a291fb}.ui.inverted.violet.button.active,.ui.inverted.violet.button:active,.ui.inverted.violet.button:focus,.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button.active,.ui.inverted.violet.buttons .button:active,.ui.inverted.violet.buttons .button:focus,.ui.inverted.violet.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button:hover{background-color:#8a73ff}.ui.inverted.violet.button:focus,.ui.inverted.violet.buttons .button:focus{background-color:#7d64ff}.ui.inverted.violet.active.button,.ui.inverted.violet.buttons .active.button{background-color:#8a73ff}.ui.inverted.violet.button:active,.ui.inverted.violet.buttons .button:active{background-color:#7860f9}.ui.inverted.violet.basic.button,.ui.inverted.violet.basic.buttons .button,.ui.inverted.violet.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.violet.basic.button:hover,.ui.inverted.violet.basic.buttons .button:hover,.ui.inverted.violet.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #8a73ff inset!important;box-shadow:0 0 0 2px #8a73ff inset!important;color:#a291fb!important}.ui.inverted.violet.basic.button:focus,.ui.inverted.violet.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #7d64ff inset!important;box-shadow:0 0 0 2px #7d64ff inset!important;color:#a291fb!important}.ui.inverted.violet.basic.active.button,.ui.inverted.violet.basic.buttons .active.button,.ui.inverted.violet.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #8a73ff inset!important;box-shadow:0 0 0 2px #8a73ff inset!important;color:#a291fb!important}.ui.inverted.violet.basic.button:active,.ui.inverted.violet.basic.buttons .button:active,.ui.inverted.violet.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #7860f9 inset!important;box-shadow:0 0 0 2px #7860f9 inset!important;color:#a291fb!important}.ui.purple.button,.ui.purple.buttons .button{background-color:#a333c8;color:#fff;text-shadow:none;background-image:none}.ui.purple.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.purple.button:hover,.ui.purple.buttons .button:hover{background-color:#9627ba;color:#fff;text-shadow:none}.ui.purple.button:focus,.ui.purple.buttons .button:focus{background-color:#8f1eb4;color:#fff;text-shadow:none}.ui.purple.button:active,.ui.purple.buttons .button:active{background-color:#82299f;color:#fff;text-shadow:none}.ui.purple.active.button,.ui.purple.button .active.button:active,.ui.purple.buttons .active.button,.ui.purple.buttons .active.button:active{background-color:#9724be;color:#fff;text-shadow:none}.ui.basic.purple.button,.ui.basic.purple.buttons .button{-webkit-box-shadow:0 0 0 1px #a333c8 inset!important;box-shadow:0 0 0 1px #a333c8 inset!important;color:#a333c8!important}.ui.basic.purple.button:hover,.ui.basic.purple.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #9627ba inset!important;box-shadow:0 0 0 1px #9627ba inset!important;color:#9627ba!important}.ui.basic.purple.button:focus,.ui.basic.purple.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #8f1eb4 inset!important;box-shadow:0 0 0 1px #8f1eb4 inset!important;color:#9627ba!important}.ui.basic.purple.active.button,.ui.basic.purple.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #9724be inset!important;box-shadow:0 0 0 1px #9724be inset!important;color:#82299f!important}.ui.basic.purple.button:active,.ui.basic.purple.buttons .button:active{-webkit-box-shadow:0 0 0 1px #82299f inset!important;box-shadow:0 0 0 1px #82299f inset!important;color:#82299f!important}.ui.buttons:not(.vertical)>.basic.purple.button:not(:first-child){margin-left:-1px}.ui.inverted.purple.button,.ui.inverted.purple.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #dc73ff inset!important;box-shadow:0 0 0 2px #dc73ff inset!important;color:#dc73ff}.ui.inverted.purple.button.active,.ui.inverted.purple.button:active,.ui.inverted.purple.button:focus,.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button.active,.ui.inverted.purple.buttons .button:active,.ui.inverted.purple.buttons .button:focus,.ui.inverted.purple.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button:hover{background-color:#d65aff}.ui.inverted.purple.button:focus,.ui.inverted.purple.buttons .button:focus{background-color:#d24aff}.ui.inverted.purple.active.button,.ui.inverted.purple.buttons .active.button{background-color:#d65aff}.ui.inverted.purple.button:active,.ui.inverted.purple.buttons .button:active{background-color:#cf40ff}.ui.inverted.purple.basic.button,.ui.inverted.purple.basic.buttons .button,.ui.inverted.purple.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.purple.basic.button:hover,.ui.inverted.purple.basic.buttons .button:hover,.ui.inverted.purple.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #d65aff inset!important;box-shadow:0 0 0 2px #d65aff inset!important;color:#dc73ff!important}.ui.inverted.purple.basic.button:focus,.ui.inverted.purple.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #d24aff inset!important;box-shadow:0 0 0 2px #d24aff inset!important;color:#dc73ff!important}.ui.inverted.purple.basic.active.button,.ui.inverted.purple.basic.buttons .active.button,.ui.inverted.purple.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #d65aff inset!important;box-shadow:0 0 0 2px #d65aff inset!important;color:#dc73ff!important}.ui.inverted.purple.basic.button:active,.ui.inverted.purple.basic.buttons .button:active,.ui.inverted.purple.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cf40ff inset!important;box-shadow:0 0 0 2px #cf40ff inset!important;color:#dc73ff!important}.ui.red.button,.ui.red.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.red.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.red.button:hover,.ui.red.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.red.button:focus,.ui.red.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.red.button:active,.ui.red.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.red.active.button,.ui.red.button .active.button:active,.ui.red.buttons .active.button,.ui.red.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.red.button,.ui.basic.red.buttons .button{-webkit-box-shadow:0 0 0 1px #db2828 inset!important;box-shadow:0 0 0 1px #db2828 inset!important;color:#db2828!important}.ui.basic.red.button:hover,.ui.basic.red.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d01919 inset!important;box-shadow:0 0 0 1px #d01919 inset!important;color:#d01919!important}.ui.basic.red.button:focus,.ui.basic.red.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #ca1010 inset!important;box-shadow:0 0 0 1px #ca1010 inset!important;color:#d01919!important}.ui.basic.red.active.button,.ui.basic.red.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d41515 inset!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.red.button:active,.ui.basic.red.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset!important;box-shadow:0 0 0 1px #b21e1e inset!important;color:#b21e1e!important}.ui.buttons:not(.vertical)>.basic.red.button:not(:first-child){margin-left:-1px}.ui.inverted.red.button,.ui.inverted.red.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff695e inset!important;box-shadow:0 0 0 2px #ff695e inset!important;color:#ff695e}.ui.inverted.red.button.active,.ui.inverted.red.button:active,.ui.inverted.red.button:focus,.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button.active,.ui.inverted.red.buttons .button:active,.ui.inverted.red.buttons .button:focus,.ui.inverted.red.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button:hover{background-color:#ff5144}.ui.inverted.red.button:focus,.ui.inverted.red.buttons .button:focus{background-color:#ff4335}.ui.inverted.red.active.button,.ui.inverted.red.buttons .active.button{background-color:#ff5144}.ui.inverted.red.button:active,.ui.inverted.red.buttons .button:active{background-color:#ff392b}.ui.inverted.red.basic.button,.ui.inverted.red.basic.buttons .button,.ui.inverted.red.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.red.basic.button:hover,.ui.inverted.red.basic.buttons .button:hover,.ui.inverted.red.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff5144 inset!important;box-shadow:0 0 0 2px #ff5144 inset!important;color:#ff695e!important}.ui.inverted.red.basic.button:focus,.ui.inverted.red.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff4335 inset!important;box-shadow:0 0 0 2px #ff4335 inset!important;color:#ff695e!important}.ui.inverted.red.basic.active.button,.ui.inverted.red.basic.buttons .active.button,.ui.inverted.red.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff5144 inset!important;box-shadow:0 0 0 2px #ff5144 inset!important;color:#ff695e!important}.ui.inverted.red.basic.button:active,.ui.inverted.red.basic.buttons .button:active,.ui.inverted.red.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff392b inset!important;box-shadow:0 0 0 2px #ff392b inset!important;color:#ff695e!important}.ui.teal.button,.ui.teal.buttons .button{background-color:#00b5ad;color:#fff;text-shadow:none;background-image:none}.ui.teal.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.teal.button:hover,.ui.teal.buttons .button:hover{background-color:#009c95;color:#fff;text-shadow:none}.ui.teal.button:focus,.ui.teal.buttons .button:focus{background-color:#008c86;color:#fff;text-shadow:none}.ui.teal.button:active,.ui.teal.buttons .button:active{background-color:#00827c;color:#fff;text-shadow:none}.ui.teal.active.button,.ui.teal.button .active.button:active,.ui.teal.buttons .active.button,.ui.teal.buttons .active.button:active{background-color:#009c95;color:#fff;text-shadow:none}.ui.basic.teal.button,.ui.basic.teal.buttons .button{-webkit-box-shadow:0 0 0 1px #00b5ad inset!important;box-shadow:0 0 0 1px #00b5ad inset!important;color:#00b5ad!important}.ui.basic.teal.button:hover,.ui.basic.teal.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #009c95 inset!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#009c95!important}.ui.basic.teal.button:focus,.ui.basic.teal.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #008c86 inset!important;box-shadow:0 0 0 1px #008c86 inset!important;color:#009c95!important}.ui.basic.teal.active.button,.ui.basic.teal.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #009c95 inset!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#00827c!important}.ui.basic.teal.button:active,.ui.basic.teal.buttons .button:active{-webkit-box-shadow:0 0 0 1px #00827c inset!important;box-shadow:0 0 0 1px #00827c inset!important;color:#00827c!important}.ui.buttons:not(.vertical)>.basic.teal.button:not(:first-child){margin-left:-1px}.ui.inverted.teal.button,.ui.inverted.teal.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #6dffff inset!important;box-shadow:0 0 0 2px #6dffff inset!important;color:#6dffff}.ui.inverted.teal.button.active,.ui.inverted.teal.button:active,.ui.inverted.teal.button:focus,.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button.active,.ui.inverted.teal.buttons .button:active,.ui.inverted.teal.buttons .button:focus,.ui.inverted.teal.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button:hover{background-color:#54ffff}.ui.inverted.teal.button:focus,.ui.inverted.teal.buttons .button:focus{background-color:#4ff}.ui.inverted.teal.active.button,.ui.inverted.teal.buttons .active.button{background-color:#54ffff}.ui.inverted.teal.button:active,.ui.inverted.teal.buttons .button:active{background-color:#3affff}.ui.inverted.teal.basic.button,.ui.inverted.teal.basic.buttons .button,.ui.inverted.teal.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.teal.basic.button:hover,.ui.inverted.teal.basic.buttons .button:hover,.ui.inverted.teal.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #54ffff inset!important;box-shadow:0 0 0 2px #54ffff inset!important;color:#6dffff!important}.ui.inverted.teal.basic.button:focus,.ui.inverted.teal.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #4ff inset!important;box-shadow:0 0 0 2px #4ff inset!important;color:#6dffff!important}.ui.inverted.teal.basic.active.button,.ui.inverted.teal.basic.buttons .active.button,.ui.inverted.teal.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #54ffff inset!important;box-shadow:0 0 0 2px #54ffff inset!important;color:#6dffff!important}.ui.inverted.teal.basic.button:active,.ui.inverted.teal.basic.buttons .button:active,.ui.inverted.teal.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #3affff inset!important;box-shadow:0 0 0 2px #3affff inset!important;color:#6dffff!important}.ui.olive.button,.ui.olive.buttons .button{background-color:#b5cc18;color:#fff;text-shadow:none;background-image:none}.ui.olive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.olive.button:hover,.ui.olive.buttons .button:hover{background-color:#a7bd0d;color:#fff;text-shadow:none}.ui.olive.button:focus,.ui.olive.buttons .button:focus{background-color:#a0b605;color:#fff;text-shadow:none}.ui.olive.button:active,.ui.olive.buttons .button:active{background-color:#8d9e13;color:#fff;text-shadow:none}.ui.olive.active.button,.ui.olive.button .active.button:active,.ui.olive.buttons .active.button,.ui.olive.buttons .active.button:active{background-color:#aac109;color:#fff;text-shadow:none}.ui.basic.olive.button,.ui.basic.olive.buttons .button{-webkit-box-shadow:0 0 0 1px #b5cc18 inset!important;box-shadow:0 0 0 1px #b5cc18 inset!important;color:#b5cc18!important}.ui.basic.olive.button:hover,.ui.basic.olive.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #a7bd0d inset!important;box-shadow:0 0 0 1px #a7bd0d inset!important;color:#a7bd0d!important}.ui.basic.olive.button:focus,.ui.basic.olive.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #a0b605 inset!important;box-shadow:0 0 0 1px #a0b605 inset!important;color:#a7bd0d!important}.ui.basic.olive.active.button,.ui.basic.olive.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #aac109 inset!important;box-shadow:0 0 0 1px #aac109 inset!important;color:#8d9e13!important}.ui.basic.olive.button:active,.ui.basic.olive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #8d9e13 inset!important;box-shadow:0 0 0 1px #8d9e13 inset!important;color:#8d9e13!important}.ui.buttons:not(.vertical)>.basic.olive.button:not(:first-child){margin-left:-1px}.ui.inverted.olive.button,.ui.inverted.olive.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d9e778 inset!important;box-shadow:0 0 0 2px #d9e778 inset!important;color:#d9e778}.ui.inverted.olive.button.active,.ui.inverted.olive.button:active,.ui.inverted.olive.button:focus,.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button.active,.ui.inverted.olive.buttons .button:active,.ui.inverted.olive.buttons .button:focus,.ui.inverted.olive.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button:hover{background-color:#d8ea5c}.ui.inverted.olive.button:focus,.ui.inverted.olive.buttons .button:focus{background-color:#daef47}.ui.inverted.olive.active.button,.ui.inverted.olive.buttons .active.button{background-color:#daed59}.ui.inverted.olive.button:active,.ui.inverted.olive.buttons .button:active{background-color:#cddf4d}.ui.inverted.olive.basic.button,.ui.inverted.olive.basic.buttons .button,.ui.inverted.olive.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.olive.basic.button:hover,.ui.inverted.olive.basic.buttons .button:hover,.ui.inverted.olive.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #d8ea5c inset!important;box-shadow:0 0 0 2px #d8ea5c inset!important;color:#d9e778!important}.ui.inverted.olive.basic.button:focus,.ui.inverted.olive.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #daef47 inset!important;box-shadow:0 0 0 2px #daef47 inset!important;color:#d9e778!important}.ui.inverted.olive.basic.active.button,.ui.inverted.olive.basic.buttons .active.button,.ui.inverted.olive.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #daed59 inset!important;box-shadow:0 0 0 2px #daed59 inset!important;color:#d9e778!important}.ui.inverted.olive.basic.button:active,.ui.inverted.olive.basic.buttons .button:active,.ui.inverted.olive.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cddf4d inset!important;box-shadow:0 0 0 2px #cddf4d inset!important;color:#d9e778!important}.ui.yellow.button,.ui.yellow.buttons .button{background-color:#fbbd08;color:#fff;text-shadow:none;background-image:none}.ui.yellow.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.yellow.button:hover,.ui.yellow.buttons .button:hover{background-color:#eaae00;color:#fff;text-shadow:none}.ui.yellow.button:focus,.ui.yellow.buttons .button:focus{background-color:#daa300;color:#fff;text-shadow:none}.ui.yellow.button:active,.ui.yellow.buttons .button:active{background-color:#cd9903;color:#fff;text-shadow:none}.ui.yellow.active.button,.ui.yellow.button .active.button:active,.ui.yellow.buttons .active.button,.ui.yellow.buttons .active.button:active{background-color:#eaae00;color:#fff;text-shadow:none}.ui.basic.yellow.button,.ui.basic.yellow.buttons .button{-webkit-box-shadow:0 0 0 1px #fbbd08 inset!important;box-shadow:0 0 0 1px #fbbd08 inset!important;color:#fbbd08!important}.ui.basic.yellow.button:hover,.ui.basic.yellow.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #eaae00 inset!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#eaae00!important}.ui.basic.yellow.button:focus,.ui.basic.yellow.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #daa300 inset!important;box-shadow:0 0 0 1px #daa300 inset!important;color:#eaae00!important}.ui.basic.yellow.active.button,.ui.basic.yellow.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #eaae00 inset!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#cd9903!important}.ui.basic.yellow.button:active,.ui.basic.yellow.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cd9903 inset!important;box-shadow:0 0 0 1px #cd9903 inset!important;color:#cd9903!important}.ui.buttons:not(.vertical)>.basic.yellow.button:not(:first-child){margin-left:-1px}.ui.inverted.yellow.button,.ui.inverted.yellow.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ffe21f inset!important;box-shadow:0 0 0 2px #ffe21f inset!important;color:#ffe21f}.ui.inverted.yellow.button.active,.ui.inverted.yellow.button:active,.ui.inverted.yellow.button:focus,.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button.active,.ui.inverted.yellow.buttons .button:active,.ui.inverted.yellow.buttons .button:focus,.ui.inverted.yellow.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button:hover{background-color:#ffdf05}.ui.inverted.yellow.button:focus,.ui.inverted.yellow.buttons .button:focus{background-color:#f5d500}.ui.inverted.yellow.active.button,.ui.inverted.yellow.buttons .active.button{background-color:#ffdf05}.ui.inverted.yellow.button:active,.ui.inverted.yellow.buttons .button:active{background-color:#ebcd00}.ui.inverted.yellow.basic.button,.ui.inverted.yellow.basic.buttons .button,.ui.inverted.yellow.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.yellow.basic.button:hover,.ui.inverted.yellow.basic.buttons .button:hover,.ui.inverted.yellow.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ffdf05 inset!important;box-shadow:0 0 0 2px #ffdf05 inset!important;color:#ffe21f!important}.ui.inverted.yellow.basic.button:focus,.ui.inverted.yellow.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f5d500 inset!important;box-shadow:0 0 0 2px #f5d500 inset!important;color:#ffe21f!important}.ui.inverted.yellow.basic.active.button,.ui.inverted.yellow.basic.buttons .active.button,.ui.inverted.yellow.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ffdf05 inset!important;box-shadow:0 0 0 2px #ffdf05 inset!important;color:#ffe21f!important}.ui.inverted.yellow.basic.button:active,.ui.inverted.yellow.basic.buttons .button:active,.ui.inverted.yellow.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ebcd00 inset!important;box-shadow:0 0 0 2px #ebcd00 inset!important;color:#ffe21f!important}.ui.primary.button,.ui.primary.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.primary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.primary.button:hover,.ui.primary.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.primary.button:focus,.ui.primary.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.primary.button:active,.ui.primary.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.primary.active.button,.ui.primary.button .active.button:active,.ui.primary.buttons .active.button,.ui.primary.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.primary.button,.ui.basic.primary.buttons .button{-webkit-box-shadow:0 0 0 1px #2185d0 inset!important;box-shadow:0 0 0 1px #2185d0 inset!important;color:#2185d0!important}.ui.basic.primary.button:hover,.ui.basic.primary.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1678c2 inset!important;box-shadow:0 0 0 1px #1678c2 inset!important;color:#1678c2!important}.ui.basic.primary.button:focus,.ui.basic.primary.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0d71bb inset!important;box-shadow:0 0 0 1px #0d71bb inset!important;color:#1678c2!important}.ui.basic.primary.active.button,.ui.basic.primary.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1279c6 inset!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.primary.button:active,.ui.basic.primary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset!important;box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.primary.button,.ui.inverted.primary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset!important;box-shadow:0 0 0 2px #54c8ff inset!important;color:#54c8ff}.ui.inverted.primary.button.active,.ui.inverted.primary.button:active,.ui.inverted.primary.button:focus,.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button.active,.ui.inverted.primary.buttons .button:active,.ui.inverted.primary.buttons .button:focus,.ui.inverted.primary.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button:hover{background-color:#3ac0ff}.ui.inverted.primary.button:focus,.ui.inverted.primary.buttons .button:focus{background-color:#2bbbff}.ui.inverted.primary.active.button,.ui.inverted.primary.buttons .active.button{background-color:#3ac0ff}.ui.inverted.primary.button:active,.ui.inverted.primary.buttons .button:active{background-color:#21b8ff}.ui.inverted.primary.basic.button,.ui.inverted.primary.basic.buttons .button,.ui.inverted.primary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.primary.basic.button:hover,.ui.inverted.primary.basic.buttons .button:hover,.ui.inverted.primary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.button:focus,.ui.inverted.primary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset!important;box-shadow:0 0 0 2px #2bbbff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.active.button,.ui.inverted.primary.basic.buttons .active.button,.ui.inverted.primary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.button:active,.ui.inverted.primary.basic.buttons .button:active,.ui.inverted.primary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset!important;box-shadow:0 0 0 2px #21b8ff inset!important;color:#54c8ff!important}.ui.secondary.button,.ui.secondary.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.secondary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.secondary.button:hover,.ui.secondary.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.secondary.button:focus,.ui.secondary.buttons .button:focus{background-color:#2e3032;color:#fff;text-shadow:none}.ui.secondary.button:active,.ui.secondary.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.secondary.active.button,.ui.secondary.button .active.button:active,.ui.secondary.buttons .active.button,.ui.secondary.buttons .active.button:active{background-color:#27292a;color:#fff;text-shadow:none}.ui.basic.secondary.button,.ui.basic.secondary.buttons .button{-webkit-box-shadow:0 0 0 1px #1b1c1d inset!important;box-shadow:0 0 0 1px #1b1c1d inset!important;color:#1b1c1d!important}.ui.basic.secondary.button:hover,.ui.basic.secondary.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#27292a!important}.ui.basic.secondary.button:focus,.ui.basic.secondary.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #2e3032 inset!important;box-shadow:0 0 0 1px #2e3032 inset!important;color:#27292a!important}.ui.basic.secondary.active.button,.ui.basic.secondary.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#343637!important}.ui.basic.secondary.button:active,.ui.basic.secondary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset!important;box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.secondary.button,.ui.inverted.secondary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #545454 inset!important;box-shadow:0 0 0 2px #545454 inset!important;color:#545454}.ui.inverted.secondary.button.active,.ui.inverted.secondary.button:active,.ui.inverted.secondary.button:focus,.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button.active,.ui.inverted.secondary.buttons .button:active,.ui.inverted.secondary.buttons .button:focus,.ui.inverted.secondary.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button:hover{background-color:#616161}.ui.inverted.secondary.button:focus,.ui.inverted.secondary.buttons .button:focus{background-color:#686868}.ui.inverted.secondary.active.button,.ui.inverted.secondary.buttons .active.button{background-color:#616161}.ui.inverted.secondary.button:active,.ui.inverted.secondary.buttons .button:active{background-color:#6e6e6e}.ui.inverted.secondary.basic.button,.ui.inverted.secondary.basic.buttons .button,.ui.inverted.secondary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.secondary.basic.button:hover,.ui.inverted.secondary.basic.buttons .button:hover,.ui.inverted.secondary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #616161 inset!important;box-shadow:0 0 0 2px #616161 inset!important;color:#545454!important}.ui.inverted.secondary.basic.button:focus,.ui.inverted.secondary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #686868 inset!important;box-shadow:0 0 0 2px #686868 inset!important;color:#545454!important}.ui.inverted.secondary.basic.active.button,.ui.inverted.secondary.basic.buttons .active.button,.ui.inverted.secondary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #616161 inset!important;box-shadow:0 0 0 2px #616161 inset!important;color:#545454!important}.ui.inverted.secondary.basic.button:active,.ui.inverted.secondary.basic.buttons .button:active,.ui.inverted.secondary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #6e6e6e inset!important;box-shadow:0 0 0 2px #6e6e6e inset!important;color:#545454!important}.ui.positive.button,.ui.positive.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.positive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.positive.button:hover,.ui.positive.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.positive.button:focus,.ui.positive.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.positive.button:active,.ui.positive.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.positive.active.button,.ui.positive.button .active.button:active,.ui.positive.buttons .active.button,.ui.positive.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.positive.button,.ui.basic.positive.buttons .button{-webkit-box-shadow:0 0 0 1px #21ba45 inset!important;box-shadow:0 0 0 1px #21ba45 inset!important;color:#21ba45!important}.ui.basic.positive.button:hover,.ui.basic.positive.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #16ab39 inset!important;box-shadow:0 0 0 1px #16ab39 inset!important;color:#16ab39!important}.ui.basic.positive.button:focus,.ui.basic.positive.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0ea432 inset!important;box-shadow:0 0 0 1px #0ea432 inset!important;color:#16ab39!important}.ui.basic.positive.active.button,.ui.basic.positive.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #13ae38 inset!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.positive.button:active,.ui.basic.positive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset!important;box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.negative.button,.ui.negative.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.negative.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.negative.button:hover,.ui.negative.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.negative.button:focus,.ui.negative.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.negative.button:active,.ui.negative.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.negative.active.button,.ui.negative.button .active.button:active,.ui.negative.buttons .active.button,.ui.negative.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.negative.button,.ui.basic.negative.buttons .button{-webkit-box-shadow:0 0 0 1px #db2828 inset!important;box-shadow:0 0 0 1px #db2828 inset!important;color:#db2828!important}.ui.basic.negative.button:hover,.ui.basic.negative.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d01919 inset!important;box-shadow:0 0 0 1px #d01919 inset!important;color:#d01919!important}.ui.basic.negative.button:focus,.ui.basic.negative.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #ca1010 inset!important;box-shadow:0 0 0 1px #ca1010 inset!important;color:#d01919!important}.ui.basic.negative.active.button,.ui.basic.negative.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d41515 inset!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.negative.button:active,.ui.basic.negative.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset!important;box-shadow:0 0 0 1px #b21e1e inset!important;color:#b21e1e!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.buttons{display:inline-flex;flex-direction:row;font-size:0;vertical-align:baseline;margin:0 .25em 0 0}.ui.buttons:not(.basic):not(.inverted){-webkit-box-shadow:none;box-shadow:none}.ui.buttons:after{content:\".\";display:block;height:0;clear:both;visibility:hidden}.ui.buttons .button{flex:1 0 auto;margin:0;border-radius:0;margin:0}.ui.buttons:not(.basic):not(.inverted)>.button,.ui.buttons>.ui.button:not(.basic):not(.inverted){-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.buttons .button:first-child{border-left:none;margin-left:0;border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.buttons .button:last-child{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons{display:inline-flex;flex-direction:column}.ui.vertical.buttons .button{display:block;float:none;width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.ui.vertical.buttons .button:first-child{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.vertical.buttons .button:last-child{margin-bottom:0;border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons .button:only-child{border-radius:.28571429rem}/*!\n * # Semantic UI 2.4.0 - Container\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.container{display:block;max-width:100%!important}@media only screen and (max-width:767px){.ui.container{width:auto!important;margin-left:1em!important;margin-right:1em!important}.ui.grid.container{width:auto!important}.ui.relaxed.grid.container{width:auto!important}.ui.very.relaxed.grid.container{width:auto!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.container{width:723px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(723px + 2rem)!important}.ui.relaxed.grid.container{width:calc(723px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(723px + 5rem)!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.container{width:933px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(933px + 2rem)!important}.ui.relaxed.grid.container{width:calc(933px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(933px + 5rem)!important}}@media only screen and (min-width:1200px){.ui.container{width:1127px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(1127px + 2rem)!important}.ui.relaxed.grid.container{width:calc(1127px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(1127px + 5rem)!important}}.ui.text.container{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;max-width:700px!important;line-height:1.5}.ui.text.container{font-size:1.14285714rem}.ui.fluid.container{width:100%}.ui[class*=\"left aligned\"].container{text-align:left}.ui[class*=\"center aligned\"].container{text-align:center}.ui[class*=\"right aligned\"].container{text-align:right}.ui.justified.container{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}/*!\n * # Semantic UI 2.4.0 - Divider\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(255,255,255,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:'';line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:'';z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(255,255,255,.1);width:0%;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{position:static;left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#fff}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:rgba(255,255,255,.15)!important;border-right-color:rgba(255,255,255,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem}.ui.divider{font-size:1rem}.ui.horizontal.divider:after,.ui.horizontal.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}}/*!\n * # Semantic UI 2.4.0 - Flag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */i.flag:not(.icon){display:inline-block;width:16px;height:11px;line-height:11px;vertical-align:baseline;margin:0 .5em 0 0;text-decoration:inherit;speak:none;font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.flag:not(.icon):before{display:inline-block;content:'';background:url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ") no-repeat -108px -1976px;width:16px;height:11px}i.flag.ad:before,i.flag.andorra:before{background-position:0 0}i.flag.ae:before,i.flag.uae:before,i.flag.united.arab.emirates:before{background-position:0 -26px}i.flag.af:before,i.flag.afghanistan:before{background-position:0 -52px}i.flag.ag:before,i.flag.antigua:before{background-position:0 -78px}i.flag.ai:before,i.flag.anguilla:before{background-position:0 -104px}i.flag.al:before,i.flag.albania:before{background-position:0 -130px}i.flag.am:before,i.flag.armenia:before{background-position:0 -156px}i.flag.an:before,i.flag.netherlands.antilles:before{background-position:0 -182px}i.flag.angola:before,i.flag.ao:before{background-position:0 -208px}i.flag.ar:before,i.flag.argentina:before{background-position:0 -234px}i.flag.american.samoa:before,i.flag.as:before{background-position:0 -260px}i.flag.at:before,i.flag.austria:before{background-position:0 -286px}i.flag.au:before,i.flag.australia:before{background-position:0 -312px}i.flag.aruba:before,i.flag.aw:before{background-position:0 -338px}i.flag.aland.islands:before,i.flag.ax:before{background-position:0 -364px}i.flag.az:before,i.flag.azerbaijan:before{background-position:0 -390px}i.flag.ba:before,i.flag.bosnia:before{background-position:0 -416px}i.flag.barbados:before,i.flag.bb:before{background-position:0 -442px}i.flag.bangladesh:before,i.flag.bd:before{background-position:0 -468px}i.flag.be:before,i.flag.belgium:before{background-position:0 -494px}i.flag.bf:before,i.flag.burkina.faso:before{background-position:0 -520px}i.flag.bg:before,i.flag.bulgaria:before{background-position:0 -546px}i.flag.bahrain:before,i.flag.bh:before{background-position:0 -572px}i.flag.bi:before,i.flag.burundi:before{background-position:0 -598px}i.flag.benin:before,i.flag.bj:before{background-position:0 -624px}i.flag.bermuda:before,i.flag.bm:before{background-position:0 -650px}i.flag.bn:before,i.flag.brunei:before{background-position:0 -676px}i.flag.bo:before,i.flag.bolivia:before{background-position:0 -702px}i.flag.br:before,i.flag.brazil:before{background-position:0 -728px}i.flag.bahamas:before,i.flag.bs:before{background-position:0 -754px}i.flag.bhutan:before,i.flag.bt:before{background-position:0 -780px}i.flag.bouvet.island:before,i.flag.bv:before{background-position:0 -806px}i.flag.botswana:before,i.flag.bw:before{background-position:0 -832px}i.flag.belarus:before,i.flag.by:before{background-position:0 -858px}i.flag.belize:before,i.flag.bz:before{background-position:0 -884px}i.flag.ca:before,i.flag.canada:before{background-position:0 -910px}i.flag.cc:before,i.flag.cocos.islands:before{background-position:0 -962px}i.flag.cd:before,i.flag.congo:before{background-position:0 -988px}i.flag.central.african.republic:before,i.flag.cf:before{background-position:0 -1014px}i.flag.cg:before,i.flag.congo.brazzaville:before{background-position:0 -1040px}i.flag.ch:before,i.flag.switzerland:before{background-position:0 -1066px}i.flag.ci:before,i.flag.cote.divoire:before{background-position:0 -1092px}i.flag.ck:before,i.flag.cook.islands:before{background-position:0 -1118px}i.flag.chile:before,i.flag.cl:before{background-position:0 -1144px}i.flag.cameroon:before,i.flag.cm:before{background-position:0 -1170px}i.flag.china:before,i.flag.cn:before{background-position:0 -1196px}i.flag.co:before,i.flag.colombia:before{background-position:0 -1222px}i.flag.costa.rica:before,i.flag.cr:before{background-position:0 -1248px}i.flag.cs:before,i.flag.serbia:before{background-position:0 -1274px}i.flag.cu:before,i.flag.cuba:before{background-position:0 -1300px}i.flag.cape.verde:before,i.flag.cv:before{background-position:0 -1326px}i.flag.christmas.island:before,i.flag.cx:before{background-position:0 -1352px}i.flag.cy:before,i.flag.cyprus:before{background-position:0 -1378px}i.flag.cz:before,i.flag.czech.republic:before{background-position:0 -1404px}i.flag.de:before,i.flag.germany:before{background-position:0 -1430px}i.flag.dj:before,i.flag.djibouti:before{background-position:0 -1456px}i.flag.denmark:before,i.flag.dk:before{background-position:0 -1482px}i.flag.dm:before,i.flag.dominica:before{background-position:0 -1508px}i.flag.do:before,i.flag.dominican.republic:before{background-position:0 -1534px}i.flag.algeria:before,i.flag.dz:before{background-position:0 -1560px}i.flag.ec:before,i.flag.ecuador:before{background-position:0 -1586px}i.flag.ee:before,i.flag.estonia:before{background-position:0 -1612px}i.flag.eg:before,i.flag.egypt:before{background-position:0 -1638px}i.flag.eh:before,i.flag.western.sahara:before{background-position:0 -1664px}i.flag.england:before,i.flag.gb.eng:before{background-position:0 -1690px}i.flag.er:before,i.flag.eritrea:before{background-position:0 -1716px}i.flag.es:before,i.flag.spain:before{background-position:0 -1742px}i.flag.et:before,i.flag.ethiopia:before{background-position:0 -1768px}i.flag.eu:before,i.flag.european.union:before{background-position:0 -1794px}i.flag.fi:before,i.flag.finland:before{background-position:0 -1846px}i.flag.fiji:before,i.flag.fj:before{background-position:0 -1872px}i.flag.falkland.islands:before,i.flag.fk:before{background-position:0 -1898px}i.flag.fm:before,i.flag.micronesia:before{background-position:0 -1924px}i.flag.faroe.islands:before,i.flag.fo:before{background-position:0 -1950px}i.flag.fr:before,i.flag.france:before{background-position:0 -1976px}i.flag.ga:before,i.flag.gabon:before{background-position:-36px 0}i.flag.gb:before,i.flag.uk:before,i.flag.united.kingdom:before{background-position:-36px -26px}i.flag.gd:before,i.flag.grenada:before{background-position:-36px -52px}i.flag.ge:before,i.flag.georgia:before{background-position:-36px -78px}i.flag.french.guiana:before,i.flag.gf:before{background-position:-36px -104px}i.flag.gh:before,i.flag.ghana:before{background-position:-36px -130px}i.flag.gi:before,i.flag.gibraltar:before{background-position:-36px -156px}i.flag.gl:before,i.flag.greenland:before{background-position:-36px -182px}i.flag.gambia:before,i.flag.gm:before{background-position:-36px -208px}i.flag.gn:before,i.flag.guinea:before{background-position:-36px -234px}i.flag.gp:before,i.flag.guadeloupe:before{background-position:-36px -260px}i.flag.equatorial.guinea:before,i.flag.gq:before{background-position:-36px -286px}i.flag.gr:before,i.flag.greece:before{background-position:-36px -312px}i.flag.gs:before,i.flag.sandwich.islands:before{background-position:-36px -338px}i.flag.gt:before,i.flag.guatemala:before{background-position:-36px -364px}i.flag.gu:before,i.flag.guam:before{background-position:-36px -390px}i.flag.guinea-bissau:before,i.flag.gw:before{background-position:-36px -416px}i.flag.guyana:before,i.flag.gy:before{background-position:-36px -442px}i.flag.hk:before,i.flag.hong.kong:before{background-position:-36px -468px}i.flag.heard.island:before,i.flag.hm:before{background-position:-36px -494px}i.flag.hn:before,i.flag.honduras:before{background-position:-36px -520px}i.flag.croatia:before,i.flag.hr:before{background-position:-36px -546px}i.flag.haiti:before,i.flag.ht:before{background-position:-36px -572px}i.flag.hu:before,i.flag.hungary:before{background-position:-36px -598px}i.flag.id:before,i.flag.indonesia:before{background-position:-36px -624px}i.flag.ie:before,i.flag.ireland:before{background-position:-36px -650px}i.flag.il:before,i.flag.israel:before{background-position:-36px -676px}i.flag.in:before,i.flag.india:before{background-position:-36px -702px}i.flag.indian.ocean.territory:before,i.flag.io:before{background-position:-36px -728px}i.flag.iq:before,i.flag.iraq:before{background-position:-36px -754px}i.flag.ir:before,i.flag.iran:before{background-position:-36px -780px}i.flag.iceland:before,i.flag.is:before{background-position:-36px -806px}i.flag.it:before,i.flag.italy:before{background-position:-36px -832px}i.flag.jamaica:before,i.flag.jm:before{background-position:-36px -858px}i.flag.jo:before,i.flag.jordan:before{background-position:-36px -884px}i.flag.japan:before,i.flag.jp:before{background-position:-36px -910px}i.flag.ke:before,i.flag.kenya:before{background-position:-36px -936px}i.flag.kg:before,i.flag.kyrgyzstan:before{background-position:-36px -962px}i.flag.cambodia:before,i.flag.kh:before{background-position:-36px -988px}i.flag.ki:before,i.flag.kiribati:before{background-position:-36px -1014px}i.flag.comoros:before,i.flag.km:before{background-position:-36px -1040px}i.flag.kn:before,i.flag.saint.kitts.and.nevis:before{background-position:-36px -1066px}i.flag.kp:before,i.flag.north.korea:before{background-position:-36px -1092px}i.flag.kr:before,i.flag.south.korea:before{background-position:-36px -1118px}i.flag.kuwait:before,i.flag.kw:before{background-position:-36px -1144px}i.flag.cayman.islands:before,i.flag.ky:before{background-position:-36px -1170px}i.flag.kazakhstan:before,i.flag.kz:before{background-position:-36px -1196px}i.flag.la:before,i.flag.laos:before{background-position:-36px -1222px}i.flag.lb:before,i.flag.lebanon:before{background-position:-36px -1248px}i.flag.lc:before,i.flag.saint.lucia:before{background-position:-36px -1274px}i.flag.li:before,i.flag.liechtenstein:before{background-position:-36px -1300px}i.flag.lk:before,i.flag.sri.lanka:before{background-position:-36px -1326px}i.flag.liberia:before,i.flag.lr:before{background-position:-36px -1352px}i.flag.lesotho:before,i.flag.ls:before{background-position:-36px -1378px}i.flag.lithuania:before,i.flag.lt:before{background-position:-36px -1404px}i.flag.lu:before,i.flag.luxembourg:before{background-position:-36px -1430px}i.flag.latvia:before,i.flag.lv:before{background-position:-36px -1456px}i.flag.libya:before,i.flag.ly:before{background-position:-36px -1482px}i.flag.ma:before,i.flag.morocco:before{background-position:-36px -1508px}i.flag.mc:before,i.flag.monaco:before{background-position:-36px -1534px}i.flag.md:before,i.flag.moldova:before{background-position:-36px -1560px}i.flag.me:before,i.flag.montenegro:before{background-position:-36px -1586px}i.flag.madagascar:before,i.flag.mg:before{background-position:-36px -1613px}i.flag.marshall.islands:before,i.flag.mh:before{background-position:-36px -1639px}i.flag.macedonia:before,i.flag.mk:before{background-position:-36px -1665px}i.flag.mali:before,i.flag.ml:before{background-position:-36px -1691px}i.flag.burma:before,i.flag.mm:before,i.flag.myanmar:before{background-position:-73px -1821px}i.flag.mn:before,i.flag.mongolia:before{background-position:-36px -1743px}i.flag.macau:before,i.flag.mo:before{background-position:-36px -1769px}i.flag.mp:before,i.flag.northern.mariana.islands:before{background-position:-36px -1795px}i.flag.martinique:before,i.flag.mq:before{background-position:-36px -1821px}i.flag.mauritania:before,i.flag.mr:before{background-position:-36px -1847px}i.flag.montserrat:before,i.flag.ms:before{background-position:-36px -1873px}i.flag.malta:before,i.flag.mt:before{background-position:-36px -1899px}i.flag.mauritius:before,i.flag.mu:before{background-position:-36px -1925px}i.flag.maldives:before,i.flag.mv:before{background-position:-36px -1951px}i.flag.malawi:before,i.flag.mw:before{background-position:-36px -1977px}i.flag.mexico:before,i.flag.mx:before{background-position:-72px 0}i.flag.malaysia:before,i.flag.my:before{background-position:-72px -26px}i.flag.mozambique:before,i.flag.mz:before{background-position:-72px -52px}i.flag.na:before,i.flag.namibia:before{background-position:-72px -78px}i.flag.nc:before,i.flag.new.caledonia:before{background-position:-72px -104px}i.flag.ne:before,i.flag.niger:before{background-position:-72px -130px}i.flag.nf:before,i.flag.norfolk.island:before{background-position:-72px -156px}i.flag.ng:before,i.flag.nigeria:before{background-position:-72px -182px}i.flag.ni:before,i.flag.nicaragua:before{background-position:-72px -208px}i.flag.netherlands:before,i.flag.nl:before{background-position:-72px -234px}i.flag.no:before,i.flag.norway:before{background-position:-72px -260px}i.flag.nepal:before,i.flag.np:before{background-position:-72px -286px}i.flag.nauru:before,i.flag.nr:before{background-position:-72px -312px}i.flag.niue:before,i.flag.nu:before{background-position:-72px -338px}i.flag.new.zealand:before,i.flag.nz:before{background-position:-72px -364px}i.flag.om:before,i.flag.oman:before{background-position:-72px -390px}i.flag.pa:before,i.flag.panama:before{background-position:-72px -416px}i.flag.pe:before,i.flag.peru:before{background-position:-72px -442px}i.flag.french.polynesia:before,i.flag.pf:before{background-position:-72px -468px}i.flag.new.guinea:before,i.flag.pg:before{background-position:-72px -494px}i.flag.ph:before,i.flag.philippines:before{background-position:-72px -520px}i.flag.pakistan:before,i.flag.pk:before{background-position:-72px -546px}i.flag.pl:before,i.flag.poland:before{background-position:-72px -572px}i.flag.pm:before,i.flag.saint.pierre:before{background-position:-72px -598px}i.flag.pitcairn.islands:before,i.flag.pn:before{background-position:-72px -624px}i.flag.pr:before,i.flag.puerto.rico:before{background-position:-72px -650px}i.flag.palestine:before,i.flag.ps:before{background-position:-72px -676px}i.flag.portugal:before,i.flag.pt:before{background-position:-72px -702px}i.flag.palau:before,i.flag.pw:before{background-position:-72px -728px}i.flag.paraguay:before,i.flag.py:before{background-position:-72px -754px}i.flag.qa:before,i.flag.qatar:before{background-position:-72px -780px}i.flag.re:before,i.flag.reunion:before{background-position:-72px -806px}i.flag.ro:before,i.flag.romania:before{background-position:-72px -832px}i.flag.rs:before,i.flag.serbia:before{background-position:-72px -858px}i.flag.ru:before,i.flag.russia:before{background-position:-72px -884px}i.flag.rw:before,i.flag.rwanda:before{background-position:-72px -910px}i.flag.sa:before,i.flag.saudi.arabia:before{background-position:-72px -936px}i.flag.sb:before,i.flag.solomon.islands:before{background-position:-72px -962px}i.flag.sc:before,i.flag.seychelles:before{background-position:-72px -988px}i.flag.gb.sct:before,i.flag.scotland:before{background-position:-72px -1014px}i.flag.sd:before,i.flag.sudan:before{background-position:-72px -1040px}i.flag.se:before,i.flag.sweden:before{background-position:-72px -1066px}i.flag.sg:before,i.flag.singapore:before{background-position:-72px -1092px}i.flag.saint.helena:before,i.flag.sh:before{background-position:-72px -1118px}i.flag.si:before,i.flag.slovenia:before{background-position:-72px -1144px}i.flag.jan.mayen:before,i.flag.sj:before,i.flag.svalbard:before{background-position:-72px -1170px}i.flag.sk:before,i.flag.slovakia:before{background-position:-72px -1196px}i.flag.sierra.leone:before,i.flag.sl:before{background-position:-72px -1222px}i.flag.san.marino:before,i.flag.sm:before{background-position:-72px -1248px}i.flag.senegal:before,i.flag.sn:before{background-position:-72px -1274px}i.flag.so:before,i.flag.somalia:before{background-position:-72px -1300px}i.flag.sr:before,i.flag.suriname:before{background-position:-72px -1326px}i.flag.sao.tome:before,i.flag.st:before{background-position:-72px -1352px}i.flag.el.salvador:before,i.flag.sv:before{background-position:-72px -1378px}i.flag.sy:before,i.flag.syria:before{background-position:-72px -1404px}i.flag.swaziland:before,i.flag.sz:before{background-position:-72px -1430px}i.flag.caicos.islands:before,i.flag.tc:before{background-position:-72px -1456px}i.flag.chad:before,i.flag.td:before{background-position:-72px -1482px}i.flag.french.territories:before,i.flag.tf:before{background-position:-72px -1508px}i.flag.tg:before,i.flag.togo:before{background-position:-72px -1534px}i.flag.th:before,i.flag.thailand:before{background-position:-72px -1560px}i.flag.tajikistan:before,i.flag.tj:before{background-position:-72px -1586px}i.flag.tk:before,i.flag.tokelau:before{background-position:-72px -1612px}i.flag.timorleste:before,i.flag.tl:before{background-position:-72px -1638px}i.flag.tm:before,i.flag.turkmenistan:before{background-position:-72px -1664px}i.flag.tn:before,i.flag.tunisia:before{background-position:-72px -1690px}i.flag.to:before,i.flag.tonga:before{background-position:-72px -1716px}i.flag.tr:before,i.flag.turkey:before{background-position:-72px -1742px}i.flag.trinidad:before,i.flag.tt:before{background-position:-72px -1768px}i.flag.tuvalu:before,i.flag.tv:before{background-position:-72px -1794px}i.flag.taiwan:before,i.flag.tw:before{background-position:-72px -1820px}i.flag.tanzania:before,i.flag.tz:before{background-position:-72px -1846px}i.flag.ua:before,i.flag.ukraine:before{background-position:-72px -1872px}i.flag.ug:before,i.flag.uganda:before{background-position:-72px -1898px}i.flag.um:before,i.flag.us.minor.islands:before{background-position:-72px -1924px}i.flag.america:before,i.flag.united.states:before,i.flag.us:before{background-position:-72px -1950px}i.flag.uruguay:before,i.flag.uy:before{background-position:-72px -1976px}i.flag.uz:before,i.flag.uzbekistan:before{background-position:-108px 0}i.flag.va:before,i.flag.vatican.city:before{background-position:-108px -26px}i.flag.saint.vincent:before,i.flag.vc:before{background-position:-108px -52px}i.flag.ve:before,i.flag.venezuela:before{background-position:-108px -78px}i.flag.british.virgin.islands:before,i.flag.vg:before{background-position:-108px -104px}i.flag.us.virgin.islands:before,i.flag.vi:before{background-position:-108px -130px}i.flag.vietnam:before,i.flag.vn:before{background-position:-108px -156px}i.flag.vanuatu:before,i.flag.vu:before{background-position:-108px -182px}i.flag.gb.wls:before,i.flag.wales:before{background-position:-108px -208px}i.flag.wallis.and.futuna:before,i.flag.wf:before{background-position:-108px -234px}i.flag.samoa:before,i.flag.ws:before{background-position:-108px -260px}i.flag.ye:before,i.flag.yemen:before{background-position:-108px -286px}i.flag.mayotte:before,i.flag.yt:before{background-position:-108px -312px}i.flag.south.africa:before,i.flag.za:before{background-position:-108px -338px}i.flag.zambia:before,i.flag.zm:before{background-position:-108px -364px}i.flag.zimbabwe:before,i.flag.zw:before{background-position:-108px -390px}/*!\n * # Semantic UI 2.4.0 - Header\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.header{border:none;margin:calc(2rem - .14285714em) 0 1rem;padding:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;line-height:1.28571429em;text-transform:none;color:rgba(0,0,0,.87)}.ui.header:first-child{margin-top:-.14285714em}.ui.header:last-child{margin-bottom:0}.ui.header .sub.header{display:block;font-weight:400;padding:0;margin:0;font-size:1rem;line-height:1.2em;color:rgba(0,0,0,.6)}.ui.header>.icon{display:table-cell;opacity:1;font-size:1.5em;padding-top:0;vertical-align:middle}.ui.header .icon:only-child{display:inline-block;padding:0;margin-right:.75rem}.ui.header>.image:not(.icon),.ui.header>img{display:inline-block;margin-top:.14285714em;width:2.5em;height:auto;vertical-align:middle}.ui.header>.image:not(.icon):only-child,.ui.header>img:only-child{margin-right:.75rem}.ui.header .content{display:inline-block;vertical-align:top}.ui.header>.image+.content,.ui.header>img+.content{padding-left:.75rem;vertical-align:middle}.ui.header>.icon+.content{padding-left:.75rem;display:table-cell;vertical-align:middle}.ui.header .ui.label{font-size:'';margin-left:.5rem;vertical-align:middle}.ui.header+p{margin-top:0}h1.ui.header{font-size:2rem}h2.ui.header{font-size:1.71428571rem}h3.ui.header{font-size:1.28571429rem}h4.ui.header{font-size:1.07142857rem}h5.ui.header{font-size:1rem}h1.ui.header .sub.header{font-size:1.14285714rem}h2.ui.header .sub.header{font-size:1.14285714rem}h3.ui.header .sub.header{font-size:1rem}h4.ui.header .sub.header{font-size:1rem}h5.ui.header .sub.header{font-size:.92857143rem}.ui.huge.header{min-height:1em;font-size:2em}.ui.large.header{font-size:1.71428571em}.ui.medium.header{font-size:1.28571429em}.ui.small.header{font-size:1.07142857em}.ui.tiny.header{font-size:1em}.ui.huge.header .sub.header{font-size:1.14285714rem}.ui.large.header .sub.header{font-size:1.14285714rem}.ui.header .sub.header{font-size:1rem}.ui.small.header .sub.header{font-size:1rem}.ui.tiny.header .sub.header{font-size:.92857143rem}.ui.sub.header{padding:0;margin-bottom:.14285714rem;font-weight:700;font-size:.85714286em;text-transform:uppercase;color:''}.ui.small.sub.header{font-size:.78571429em}.ui.sub.header{font-size:.85714286em}.ui.large.sub.header{font-size:.92857143em}.ui.huge.sub.header{font-size:1em}.ui.icon.header{display:inline-block;text-align:center;margin:2rem 0 1rem}.ui.icon.header:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.icon.header:first-child{margin-top:0}.ui.icon.header .icon{float:none;display:block;width:auto;height:auto;line-height:1;padding:0;font-size:3em;margin:0 auto .5rem;opacity:1}.ui.icon.header .content{display:block;padding:0}.ui.icon.header .circular.icon{font-size:2em}.ui.icon.header .square.icon{font-size:2em}.ui.block.icon.header .icon{margin-bottom:0}.ui.icon.header.aligned{margin-left:auto;margin-right:auto;display:block}.ui.disabled.header{opacity:.45}.ui.inverted.header{color:#fff}.ui.inverted.header .sub.header{color:rgba(255,255,255,.8)}.ui.inverted.attached.header{background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 -webkit-gradient(linear,left top, left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none;border-color:transparent}.ui.inverted.block.header{background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 -webkit-gradient(linear,left top, left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none}.ui.inverted.block.header{border-bottom:none}.ui.red.header{color:#db2828!important}a.ui.red.header:hover{color:#d01919!important}.ui.red.dividing.header{border-bottom:2px solid #db2828}.ui.inverted.red.header{color:#ff695e!important}a.ui.inverted.red.header:hover{color:#ff5144!important}.ui.orange.header{color:#f2711c!important}a.ui.orange.header:hover{color:#f26202!important}.ui.orange.dividing.header{border-bottom:2px solid #f2711c}.ui.inverted.orange.header{color:#ff851b!important}a.ui.inverted.orange.header:hover{color:#ff7701!important}.ui.olive.header{color:#b5cc18!important}a.ui.olive.header:hover{color:#a7bd0d!important}.ui.olive.dividing.header{border-bottom:2px solid #b5cc18}.ui.inverted.olive.header{color:#d9e778!important}a.ui.inverted.olive.header:hover{color:#d8ea5c!important}.ui.yellow.header{color:#fbbd08!important}a.ui.yellow.header:hover{color:#eaae00!important}.ui.yellow.dividing.header{border-bottom:2px solid #fbbd08}.ui.inverted.yellow.header{color:#ffe21f!important}a.ui.inverted.yellow.header:hover{color:#ffdf05!important}.ui.green.header{color:#21ba45!important}a.ui.green.header:hover{color:#16ab39!important}.ui.green.dividing.header{border-bottom:2px solid #21ba45}.ui.inverted.green.header{color:#2ecc40!important}a.ui.inverted.green.header:hover{color:#22be34!important}.ui.teal.header{color:#00b5ad!important}a.ui.teal.header:hover{color:#009c95!important}.ui.teal.dividing.header{border-bottom:2px solid #00b5ad}.ui.inverted.teal.header{color:#6dffff!important}a.ui.inverted.teal.header:hover{color:#54ffff!important}.ui.blue.header{color:#2185d0!important}a.ui.blue.header:hover{color:#1678c2!important}.ui.blue.dividing.header{border-bottom:2px solid #2185d0}.ui.inverted.blue.header{color:#54c8ff!important}a.ui.inverted.blue.header:hover{color:#3ac0ff!important}.ui.violet.header{color:#6435c9!important}a.ui.violet.header:hover{color:#5829bb!important}.ui.violet.dividing.header{border-bottom:2px solid #6435c9}.ui.inverted.violet.header{color:#a291fb!important}a.ui.inverted.violet.header:hover{color:#8a73ff!important}.ui.purple.header{color:#a333c8!important}a.ui.purple.header:hover{color:#9627ba!important}.ui.purple.dividing.header{border-bottom:2px solid #a333c8}.ui.inverted.purple.header{color:#dc73ff!important}a.ui.inverted.purple.header:hover{color:#d65aff!important}.ui.pink.header{color:#e03997!important}a.ui.pink.header:hover{color:#e61a8d!important}.ui.pink.dividing.header{border-bottom:2px solid #e03997}.ui.inverted.pink.header{color:#ff8edf!important}a.ui.inverted.pink.header:hover{color:#ff74d8!important}.ui.brown.header{color:#a5673f!important}a.ui.brown.header:hover{color:#975b33!important}.ui.brown.dividing.header{border-bottom:2px solid #a5673f}.ui.inverted.brown.header{color:#d67c1c!important}a.ui.inverted.brown.header:hover{color:#c86f11!important}.ui.grey.header{color:#767676!important}a.ui.grey.header:hover{color:#838383!important}.ui.grey.dividing.header{border-bottom:2px solid #767676}.ui.inverted.grey.header{color:#dcddde!important}a.ui.inverted.grey.header:hover{color:#cfd0d2!important}.ui.left.aligned.header{text-align:left}.ui.right.aligned.header{text-align:right}.ui.center.aligned.header,.ui.centered.header{text-align:center}.ui.justified.header{text-align:justify}.ui.justified.header:after{display:inline-block;content:'';width:100%}.ui.floated.header,.ui[class*=\"left floated\"].header{float:left;margin-top:0;margin-right:.5em}.ui[class*=\"right floated\"].header{float:right;margin-top:0;margin-left:.5em}.ui.fitted.header{padding:0}.ui.dividing.header{padding-bottom:.21428571rem;border-bottom:1px solid rgba(34,36,38,.15)}.ui.dividing.header .sub.header{padding-bottom:.21428571rem}.ui.dividing.header .icon{margin-bottom:0}.ui.inverted.dividing.header{border-bottom-color:rgba(255,255,255,.1)}.ui.block.header{background:#f3f4f5;padding:.78571429rem 1rem;-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5;border-radius:.28571429rem}.ui.tiny.block.header{font-size:.85714286rem}.ui.small.block.header{font-size:.92857143rem}.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1rem}.ui.large.block.header{font-size:1.14285714rem}.ui.huge.block.header{font-size:1.42857143rem}.ui.attached.header{background:#fff;padding:.78571429rem 1rem;margin-left:-1px;margin-right:-1px;-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached.block.header{background:#f3f4f5}.ui.attached:not(.top):not(.bottom).header{margin-top:0;margin-bottom:0;border-top:none;border-radius:0}.ui.top.attached.header{margin-bottom:0;border-radius:.28571429rem .28571429rem 0 0}.ui.bottom.attached.header{margin-top:0;border-top:none;border-radius:0 0 .28571429rem .28571429rem}.ui.tiny.attached.header{font-size:.85714286em}.ui.small.attached.header{font-size:.92857143em}.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1em}.ui.large.attached.header{font-size:1.14285714em}.ui.huge.attached.header{font-size:1.42857143em}.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1.28571429em}/*!\n * # Semantic UI 2.4.0 - Icon\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */@font-face{font-family:Icons;src:url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ");src:url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") format('embedded-opentype'),url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ") format('woff2'),url(" + ___CSS_LOADER_URL_REPLACEMENT_4___ + ") format('woff'),url(" + ___CSS_LOADER_URL_REPLACEMENT_5___ + ") format('truetype'),url(" + ___CSS_LOADER_URL_REPLACEMENT_6___ + ") format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon{display:inline-block;opacity:1;margin:0 .25rem 0 0;width:1.18em;height:1em;font-family:Icons;font-style:normal;font-weight:400;text-decoration:inherit;text-align:center;speak:none;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.icon:before{background:0 0!important}i.icon.loading{height:1em;line-height:1;-webkit-animation:icon-loading 2s linear infinite;animation:icon-loading 2s linear infinite}@-webkit-keyframes icon-loading{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-loading{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}i.icon.hover{opacity:1!important}i.icon.active{opacity:1!important}i.emphasized.icon{opacity:1!important}i.disabled.icon{opacity:.45!important}i.fitted.icon{width:auto;margin:0!important}i.link.icon,i.link.icons{cursor:pointer;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}i.link.icon:hover,i.link.icons:hover{opacity:1!important}i.circular.icon{border-radius:500em!important;line-height:1!important;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;width:2em!important;height:2em!important}i.circular.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.flipped.icon,i.horizontally.flipped.icon{-webkit-transform:scale(-1,1);transform:scale(-1,1)}i.vertically.flipped.icon{-webkit-transform:scale(1,-1);transform:scale(1,-1)}i.clockwise.rotated.icon,i.right.rotated.icon,i.rotated.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}i.counterclockwise.rotated.icon,i.left.rotated.icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}i.bordered.icon{line-height:1;vertical-align:baseline;width:2em;height:2em;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset}i.bordered.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.inverted.bordered.icon,i.inverted.circular.icon{background-color:#1b1c1d!important;color:#fff!important}i.inverted.icon{color:#fff}i.red.icon{color:#db2828!important}i.inverted.red.icon{color:#ff695e!important}i.inverted.bordered.red.icon,i.inverted.circular.red.icon{background-color:#db2828!important;color:#fff!important}i.orange.icon{color:#f2711c!important}i.inverted.orange.icon{color:#ff851b!important}i.inverted.bordered.orange.icon,i.inverted.circular.orange.icon{background-color:#f2711c!important;color:#fff!important}i.yellow.icon{color:#fbbd08!important}i.inverted.yellow.icon{color:#ffe21f!important}i.inverted.bordered.yellow.icon,i.inverted.circular.yellow.icon{background-color:#fbbd08!important;color:#fff!important}i.olive.icon{color:#b5cc18!important}i.inverted.olive.icon{color:#d9e778!important}i.inverted.bordered.olive.icon,i.inverted.circular.olive.icon{background-color:#b5cc18!important;color:#fff!important}i.green.icon{color:#21ba45!important}i.inverted.green.icon{color:#2ecc40!important}i.inverted.bordered.green.icon,i.inverted.circular.green.icon{background-color:#21ba45!important;color:#fff!important}i.teal.icon{color:#00b5ad!important}i.inverted.teal.icon{color:#6dffff!important}i.inverted.bordered.teal.icon,i.inverted.circular.teal.icon{background-color:#00b5ad!important;color:#fff!important}i.blue.icon{color:#2185d0!important}i.inverted.blue.icon{color:#54c8ff!important}i.inverted.bordered.blue.icon,i.inverted.circular.blue.icon{background-color:#2185d0!important;color:#fff!important}i.violet.icon{color:#6435c9!important}i.inverted.violet.icon{color:#a291fb!important}i.inverted.bordered.violet.icon,i.inverted.circular.violet.icon{background-color:#6435c9!important;color:#fff!important}i.purple.icon{color:#a333c8!important}i.inverted.purple.icon{color:#dc73ff!important}i.inverted.bordered.purple.icon,i.inverted.circular.purple.icon{background-color:#a333c8!important;color:#fff!important}i.pink.icon{color:#e03997!important}i.inverted.pink.icon{color:#ff8edf!important}i.inverted.bordered.pink.icon,i.inverted.circular.pink.icon{background-color:#e03997!important;color:#fff!important}i.brown.icon{color:#a5673f!important}i.inverted.brown.icon{color:#d67c1c!important}i.inverted.bordered.brown.icon,i.inverted.circular.brown.icon{background-color:#a5673f!important;color:#fff!important}i.grey.icon{color:#767676!important}i.inverted.grey.icon{color:#dcddde!important}i.inverted.bordered.grey.icon,i.inverted.circular.grey.icon{background-color:#767676!important;color:#fff!important}i.black.icon{color:#1b1c1d!important}i.inverted.black.icon{color:#545454!important}i.inverted.bordered.black.icon,i.inverted.circular.black.icon{background-color:#1b1c1d!important;color:#fff!important}i.mini.icon,i.mini.icons{line-height:1;font-size:.4em}i.tiny.icon,i.tiny.icons{line-height:1;font-size:.5em}i.small.icon,i.small.icons{line-height:1;font-size:.75em}i.icon,i.icons{font-size:1em}i.large.icon,i.large.icons{line-height:1;vertical-align:middle;font-size:1.5em}i.big.icon,i.big.icons{line-height:1;vertical-align:middle;font-size:2em}i.huge.icon,i.huge.icons{line-height:1;vertical-align:middle;font-size:4em}i.massive.icon,i.massive.icons{line-height:1;vertical-align:middle;font-size:8em}i.icons{display:inline-block;position:relative;line-height:1}i.icons .icon{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);margin:0;margin:0}i.icons .icon:first-child{position:static;width:auto;height:auto;vertical-align:top;-webkit-transform:none;transform:none;margin-right:.25rem}i.icons .corner.icon{top:auto;left:auto;right:0;bottom:0;-webkit-transform:none;transform:none;font-size:.45em;text-shadow:-1px -1px 0 #fff,1px -1px 0 #fff,-1px 1px 0 #fff,1px 1px 0 #fff}i.icons .top.right.corner.icon{top:0;left:auto;right:0;bottom:auto}i.icons .top.left.corner.icon{top:0;left:0;right:auto;bottom:auto}i.icons .bottom.left.corner.icon{top:auto;left:0;right:auto;bottom:0}i.icons .bottom.right.corner.icon{top:auto;left:auto;right:0;bottom:0}i.icons .inverted.corner.icon{text-shadow:-1px -1px 0 #1b1c1d,1px -1px 0 #1b1c1d,-1px 1px 0 #1b1c1d,1px 1px 0 #1b1c1d}i.icon.linkedin.in:before{content:\"\\f0e1\"}i.icon.zoom.in:before{content:\"\\f00e\"}i.icon.zoom.out:before{content:\"\\f010\"}i.icon.sign.in:before{content:\"\\f2f6\"}i.icon.in.cart:before{content:\"\\f218\"}i.icon.log.out:before{content:\"\\f2f5\"}i.icon.sign.out:before{content:\"\\f2f5\"}i.icon.\\35 00px:before{content:\"\\f26e\"}i.icon.accessible.icon:before{content:\"\\f368\"}i.icon.accusoft:before{content:\"\\f369\"}i.icon.address.book:before{content:\"\\f2b9\"}i.icon.address.card:before{content:\"\\f2bb\"}i.icon.adjust:before{content:\"\\f042\"}i.icon.adn:before{content:\"\\f170\"}i.icon.adversal:before{content:\"\\f36a\"}i.icon.affiliatetheme:before{content:\"\\f36b\"}i.icon.algolia:before{content:\"\\f36c\"}i.icon.align.center:before{content:\"\\f037\"}i.icon.align.justify:before{content:\"\\f039\"}i.icon.align.left:before{content:\"\\f036\"}i.icon.align.right:before{content:\"\\f038\"}i.icon.amazon:before{content:\"\\f270\"}i.icon.amazon.pay:before{content:\"\\f42c\"}i.icon.ambulance:before{content:\"\\f0f9\"}i.icon.american.sign.language.interpreting:before{content:\"\\f2a3\"}i.icon.amilia:before{content:\"\\f36d\"}i.icon.anchor:before{content:\"\\f13d\"}i.icon.android:before{content:\"\\f17b\"}i.icon.angellist:before{content:\"\\f209\"}i.icon.angle.double.down:before{content:\"\\f103\"}i.icon.angle.double.left:before{content:\"\\f100\"}i.icon.angle.double.right:before{content:\"\\f101\"}i.icon.angle.double.up:before{content:\"\\f102\"}i.icon.angle.down:before{content:\"\\f107\"}i.icon.angle.left:before{content:\"\\f104\"}i.icon.angle.right:before{content:\"\\f105\"}i.icon.angle.up:before{content:\"\\f106\"}i.icon.angrycreative:before{content:\"\\f36e\"}i.icon.angular:before{content:\"\\f420\"}i.icon.app.store:before{content:\"\\f36f\"}i.icon.app.store.ios:before{content:\"\\f370\"}i.icon.apper:before{content:\"\\f371\"}i.icon.apple:before{content:\"\\f179\"}i.icon.apple.pay:before{content:\"\\f415\"}i.icon.archive:before{content:\"\\f187\"}i.icon.arrow.alternate.circle.down:before{content:\"\\f358\"}i.icon.arrow.alternate.circle.left:before{content:\"\\f359\"}i.icon.arrow.alternate.circle.right:before{content:\"\\f35a\"}i.icon.arrow.alternate.circle.up:before{content:\"\\f35b\"}i.icon.arrow.circle.down:before{content:\"\\f0ab\"}i.icon.arrow.circle.left:before{content:\"\\f0a8\"}i.icon.arrow.circle.right:before{content:\"\\f0a9\"}i.icon.arrow.circle.up:before{content:\"\\f0aa\"}i.icon.arrow.down:before{content:\"\\f063\"}i.icon.arrow.left:before{content:\"\\f060\"}i.icon.arrow.right:before{content:\"\\f061\"}i.icon.arrow.up:before{content:\"\\f062\"}i.icon.arrows.alternate:before{content:\"\\f0b2\"}i.icon.arrows.alternate.horizontal:before{content:\"\\f337\"}i.icon.arrows.alternate.vertical:before{content:\"\\f338\"}i.icon.assistive.listening.systems:before{content:\"\\f2a2\"}i.icon.asterisk:before{content:\"\\f069\"}i.icon.asymmetrik:before{content:\"\\f372\"}i.icon.at:before{content:\"\\f1fa\"}i.icon.audible:before{content:\"\\f373\"}i.icon.audio.description:before{content:\"\\f29e\"}i.icon.autoprefixer:before{content:\"\\f41c\"}i.icon.avianex:before{content:\"\\f374\"}i.icon.aviato:before{content:\"\\f421\"}i.icon.aws:before{content:\"\\f375\"}i.icon.backward:before{content:\"\\f04a\"}i.icon.balance.scale:before{content:\"\\f24e\"}i.icon.ban:before{content:\"\\f05e\"}i.icon.band.aid:before{content:\"\\f462\"}i.icon.bandcamp:before{content:\"\\f2d5\"}i.icon.barcode:before{content:\"\\f02a\"}i.icon.bars:before{content:\"\\f0c9\"}i.icon.baseball.ball:before{content:\"\\f433\"}i.icon.basketball.ball:before{content:\"\\f434\"}i.icon.bath:before{content:\"\\f2cd\"}i.icon.battery.empty:before{content:\"\\f244\"}i.icon.battery.full:before{content:\"\\f240\"}i.icon.battery.half:before{content:\"\\f242\"}i.icon.battery.quarter:before{content:\"\\f243\"}i.icon.battery.three.quarters:before{content:\"\\f241\"}i.icon.bed:before{content:\"\\f236\"}i.icon.beer:before{content:\"\\f0fc\"}i.icon.behance:before{content:\"\\f1b4\"}i.icon.behance.square:before{content:\"\\f1b5\"}i.icon.bell:before{content:\"\\f0f3\"}i.icon.bell.slash:before{content:\"\\f1f6\"}i.icon.bicycle:before{content:\"\\f206\"}i.icon.bimobject:before{content:\"\\f378\"}i.icon.binoculars:before{content:\"\\f1e5\"}i.icon.birthday.cake:before{content:\"\\f1fd\"}i.icon.bitbucket:before{content:\"\\f171\"}i.icon.bitcoin:before{content:\"\\f379\"}i.icon.bity:before{content:\"\\f37a\"}i.icon.black.tie:before{content:\"\\f27e\"}i.icon.blackberry:before{content:\"\\f37b\"}i.icon.blind:before{content:\"\\f29d\"}i.icon.blogger:before{content:\"\\f37c\"}i.icon.blogger.b:before{content:\"\\f37d\"}i.icon.bluetooth:before{content:\"\\f293\"}i.icon.bluetooth.b:before{content:\"\\f294\"}i.icon.bold:before{content:\"\\f032\"}i.icon.bolt:before{content:\"\\f0e7\"}i.icon.bomb:before{content:\"\\f1e2\"}i.icon.book:before{content:\"\\f02d\"}i.icon.bookmark:before{content:\"\\f02e\"}i.icon.bowling.ball:before{content:\"\\f436\"}i.icon.box:before{content:\"\\f466\"}i.icon.boxes:before{content:\"\\f468\"}i.icon.braille:before{content:\"\\f2a1\"}i.icon.briefcase:before{content:\"\\f0b1\"}i.icon.btc:before{content:\"\\f15a\"}i.icon.bug:before{content:\"\\f188\"}i.icon.building:before{content:\"\\f1ad\"}i.icon.bullhorn:before{content:\"\\f0a1\"}i.icon.bullseye:before{content:\"\\f140\"}i.icon.buromobelexperte:before{content:\"\\f37f\"}i.icon.bus:before{content:\"\\f207\"}i.icon.buysellads:before{content:\"\\f20d\"}i.icon.calculator:before{content:\"\\f1ec\"}i.icon.calendar:before{content:\"\\f133\"}i.icon.calendar.alternate:before{content:\"\\f073\"}i.icon.calendar.check:before{content:\"\\f274\"}i.icon.calendar.minus:before{content:\"\\f272\"}i.icon.calendar.plus:before{content:\"\\f271\"}i.icon.calendar.times:before{content:\"\\f273\"}i.icon.camera:before{content:\"\\f030\"}i.icon.camera.retro:before{content:\"\\f083\"}i.icon.car:before{content:\"\\f1b9\"}i.icon.caret.down:before{content:\"\\f0d7\"}i.icon.caret.left:before{content:\"\\f0d9\"}i.icon.caret.right:before{content:\"\\f0da\"}i.icon.caret.square.down:before{content:\"\\f150\"}i.icon.caret.square.left:before{content:\"\\f191\"}i.icon.caret.square.right:before{content:\"\\f152\"}i.icon.caret.square.up:before{content:\"\\f151\"}i.icon.caret.up:before{content:\"\\f0d8\"}i.icon.cart.arrow.down:before{content:\"\\f218\"}i.icon.cart.plus:before{content:\"\\f217\"}i.icon.cc.amazon.pay:before{content:\"\\f42d\"}i.icon.cc.amex:before{content:\"\\f1f3\"}i.icon.cc.apple.pay:before{content:\"\\f416\"}i.icon.cc.diners.club:before{content:\"\\f24c\"}i.icon.cc.discover:before{content:\"\\f1f2\"}i.icon.cc.jcb:before{content:\"\\f24b\"}i.icon.cc.mastercard:before{content:\"\\f1f1\"}i.icon.cc.paypal:before{content:\"\\f1f4\"}i.icon.cc.stripe:before{content:\"\\f1f5\"}i.icon.cc.visa:before{content:\"\\f1f0\"}i.icon.centercode:before{content:\"\\f380\"}i.icon.certificate:before{content:\"\\f0a3\"}i.icon.chart.area:before{content:\"\\f1fe\"}i.icon.chart.bar:before{content:\"\\f080\"}i.icon.chart.line:before{content:\"\\f201\"}i.icon.chart.pie:before{content:\"\\f200\"}i.icon.check:before{content:\"\\f00c\"}i.icon.check.circle:before{content:\"\\f058\"}i.icon.check.square:before{content:\"\\f14a\"}i.icon.chess:before{content:\"\\f439\"}i.icon.chess.bishop:before{content:\"\\f43a\"}i.icon.chess.board:before{content:\"\\f43c\"}i.icon.chess.king:before{content:\"\\f43f\"}i.icon.chess.knight:before{content:\"\\f441\"}i.icon.chess.pawn:before{content:\"\\f443\"}i.icon.chess.queen:before{content:\"\\f445\"}i.icon.chess.rook:before{content:\"\\f447\"}i.icon.chevron.circle.down:before{content:\"\\f13a\"}i.icon.chevron.circle.left:before{content:\"\\f137\"}i.icon.chevron.circle.right:before{content:\"\\f138\"}i.icon.chevron.circle.up:before{content:\"\\f139\"}i.icon.chevron.down:before{content:\"\\f078\"}i.icon.chevron.left:before{content:\"\\f053\"}i.icon.chevron.right:before{content:\"\\f054\"}i.icon.chevron.up:before{content:\"\\f077\"}i.icon.child:before{content:\"\\f1ae\"}i.icon.chrome:before{content:\"\\f268\"}i.icon.circle:before{content:\"\\f111\"}i.icon.circle.notch:before{content:\"\\f1ce\"}i.icon.clipboard:before{content:\"\\f328\"}i.icon.clipboard.check:before{content:\"\\f46c\"}i.icon.clipboard.list:before{content:\"\\f46d\"}i.icon.clock:before{content:\"\\f017\"}i.icon.clone:before{content:\"\\f24d\"}i.icon.closed.captioning:before{content:\"\\f20a\"}i.icon.cloud:before{content:\"\\f0c2\"}i.icon.cloudscale:before{content:\"\\f383\"}i.icon.cloudsmith:before{content:\"\\f384\"}i.icon.cloudversify:before{content:\"\\f385\"}i.icon.code:before{content:\"\\f121\"}i.icon.code.branch:before{content:\"\\f126\"}i.icon.codepen:before{content:\"\\f1cb\"}i.icon.codiepie:before{content:\"\\f284\"}i.icon.coffee:before{content:\"\\f0f4\"}i.icon.cog:before{content:\"\\f013\"}i.icon.cogs:before{content:\"\\f085\"}i.icon.columns:before{content:\"\\f0db\"}i.icon.comment:before{content:\"\\f075\"}i.icon.comment.alternate:before{content:\"\\f27a\"}i.icon.comments:before{content:\"\\f086\"}i.icon.compass:before{content:\"\\f14e\"}i.icon.compress:before{content:\"\\f066\"}i.icon.connectdevelop:before{content:\"\\f20e\"}i.icon.contao:before{content:\"\\f26d\"}i.icon.copy:before{content:\"\\f0c5\"}i.icon.copyright:before{content:\"\\f1f9\"}i.icon.cpanel:before{content:\"\\f388\"}i.icon.creative.commons:before{content:\"\\f25e\"}i.icon.credit.card:before{content:\"\\f09d\"}i.icon.crop:before{content:\"\\f125\"}i.icon.crosshairs:before{content:\"\\f05b\"}i.icon.css3:before{content:\"\\f13c\"}i.icon.css3.alternate:before{content:\"\\f38b\"}i.icon.cube:before{content:\"\\f1b2\"}i.icon.cubes:before{content:\"\\f1b3\"}i.icon.cut:before{content:\"\\f0c4\"}i.icon.cuttlefish:before{content:\"\\f38c\"}i.icon.d.and.d:before{content:\"\\f38d\"}i.icon.dashcube:before{content:\"\\f210\"}i.icon.database:before{content:\"\\f1c0\"}i.icon.deaf:before{content:\"\\f2a4\"}i.icon.delicious:before{content:\"\\f1a5\"}i.icon.deploydog:before{content:\"\\f38e\"}i.icon.deskpro:before{content:\"\\f38f\"}i.icon.desktop:before{content:\"\\f108\"}i.icon.deviantart:before{content:\"\\f1bd\"}i.icon.digg:before{content:\"\\f1a6\"}i.icon.digital.ocean:before{content:\"\\f391\"}i.icon.discord:before{content:\"\\f392\"}i.icon.discourse:before{content:\"\\f393\"}i.icon.dna:before{content:\"\\f471\"}i.icon.dochub:before{content:\"\\f394\"}i.icon.docker:before{content:\"\\f395\"}i.icon.dollar.sign:before{content:\"\\f155\"}i.icon.dolly:before{content:\"\\f472\"}i.icon.dolly.flatbed:before{content:\"\\f474\"}i.icon.dot.circle:before{content:\"\\f192\"}i.icon.download:before{content:\"\\f019\"}i.icon.draft2digital:before{content:\"\\f396\"}i.icon.dribbble:before{content:\"\\f17d\"}i.icon.dribbble.square:before{content:\"\\f397\"}i.icon.dropbox:before{content:\"\\f16b\"}i.icon.drupal:before{content:\"\\f1a9\"}i.icon.dyalog:before{content:\"\\f399\"}i.icon.earlybirds:before{content:\"\\f39a\"}i.icon.edge:before{content:\"\\f282\"}i.icon.edit:before{content:\"\\f044\"}i.icon.eject:before{content:\"\\f052\"}i.icon.elementor:before{content:\"\\f430\"}i.icon.ellipsis.horizontal:before{content:\"\\f141\"}i.icon.ellipsis.vertical:before{content:\"\\f142\"}i.icon.ember:before{content:\"\\f423\"}i.icon.empire:before{content:\"\\f1d1\"}i.icon.envelope:before{content:\"\\f0e0\"}i.icon.envelope.open:before{content:\"\\f2b6\"}i.icon.envelope.square:before{content:\"\\f199\"}i.icon.envira:before{content:\"\\f299\"}i.icon.eraser:before{content:\"\\f12d\"}i.icon.erlang:before{content:\"\\f39d\"}i.icon.ethereum:before{content:\"\\f42e\"}i.icon.etsy:before{content:\"\\f2d7\"}i.icon.euro.sign:before{content:\"\\f153\"}i.icon.exchange.alternate:before{content:\"\\f362\"}i.icon.exclamation:before{content:\"\\f12a\"}i.icon.exclamation.circle:before{content:\"\\f06a\"}i.icon.exclamation.triangle:before{content:\"\\f071\"}i.icon.expand:before{content:\"\\f065\"}i.icon.expand.arrows.alternate:before{content:\"\\f31e\"}i.icon.expeditedssl:before{content:\"\\f23e\"}i.icon.external.alternate:before{content:\"\\f35d\"}i.icon.external.square.alternate:before{content:\"\\f360\"}i.icon.eye:before{content:\"\\f06e\"}i.icon.eye.dropper:before{content:\"\\f1fb\"}i.icon.eye.slash:before{content:\"\\f070\"}i.icon.facebook:before{content:\"\\f09a\"}i.icon.facebook.f:before{content:\"\\f39e\"}i.icon.facebook.messenger:before{content:\"\\f39f\"}i.icon.facebook.square:before{content:\"\\f082\"}i.icon.fast.backward:before{content:\"\\f049\"}i.icon.fast.forward:before{content:\"\\f050\"}i.icon.fax:before{content:\"\\f1ac\"}i.icon.female:before{content:\"\\f182\"}i.icon.fighter.jet:before{content:\"\\f0fb\"}i.icon.file:before{content:\"\\f15b\"}i.icon.file.alternate:before{content:\"\\f15c\"}i.icon.file.archive:before{content:\"\\f1c6\"}i.icon.file.audio:before{content:\"\\f1c7\"}i.icon.file.code:before{content:\"\\f1c9\"}i.icon.file.excel:before{content:\"\\f1c3\"}i.icon.file.image:before{content:\"\\f1c5\"}i.icon.file.pdf:before{content:\"\\f1c1\"}i.icon.file.powerpoint:before{content:\"\\f1c4\"}i.icon.file.video:before{content:\"\\f1c8\"}i.icon.file.word:before{content:\"\\f1c2\"}i.icon.film:before{content:\"\\f008\"}i.icon.filter:before{content:\"\\f0b0\"}i.icon.fire:before{content:\"\\f06d\"}i.icon.fire.extinguisher:before{content:\"\\f134\"}i.icon.firefox:before{content:\"\\f269\"}i.icon.first.aid:before{content:\"\\f479\"}i.icon.first.order:before{content:\"\\f2b0\"}i.icon.firstdraft:before{content:\"\\f3a1\"}i.icon.flag:before{content:\"\\f024\"}i.icon.flag.checkered:before{content:\"\\f11e\"}i.icon.flask:before{content:\"\\f0c3\"}i.icon.flickr:before{content:\"\\f16e\"}i.icon.flipboard:before{content:\"\\f44d\"}i.icon.fly:before{content:\"\\f417\"}i.icon.folder:before{content:\"\\f07b\"}i.icon.folder.open:before{content:\"\\f07c\"}i.icon.font:before{content:\"\\f031\"}i.icon.font.awesome:before{content:\"\\f2b4\"}i.icon.font.awesome.alternate:before{content:\"\\f35c\"}i.icon.font.awesome.flag:before{content:\"\\f425\"}i.icon.fonticons:before{content:\"\\f280\"}i.icon.fonticons.fi:before{content:\"\\f3a2\"}i.icon.football.ball:before{content:\"\\f44e\"}i.icon.fort.awesome:before{content:\"\\f286\"}i.icon.fort.awesome.alternate:before{content:\"\\f3a3\"}i.icon.forumbee:before{content:\"\\f211\"}i.icon.forward:before{content:\"\\f04e\"}i.icon.foursquare:before{content:\"\\f180\"}i.icon.free.code.camp:before{content:\"\\f2c5\"}i.icon.freebsd:before{content:\"\\f3a4\"}i.icon.frown:before{content:\"\\f119\"}i.icon.futbol:before{content:\"\\f1e3\"}i.icon.gamepad:before{content:\"\\f11b\"}i.icon.gavel:before{content:\"\\f0e3\"}i.icon.gem:before{content:\"\\f3a5\"}i.icon.genderless:before{content:\"\\f22d\"}i.icon.get.pocket:before{content:\"\\f265\"}i.icon.gg:before{content:\"\\f260\"}i.icon.gg.circle:before{content:\"\\f261\"}i.icon.gift:before{content:\"\\f06b\"}i.icon.git:before{content:\"\\f1d3\"}i.icon.git.square:before{content:\"\\f1d2\"}i.icon.github:before{content:\"\\f09b\"}i.icon.github.alternate:before{content:\"\\f113\"}i.icon.github.square:before{content:\"\\f092\"}i.icon.gitkraken:before{content:\"\\f3a6\"}i.icon.gitlab:before{content:\"\\f296\"}i.icon.gitter:before{content:\"\\f426\"}i.icon.glass.martini:before{content:\"\\f000\"}i.icon.glide:before{content:\"\\f2a5\"}i.icon.glide.g:before{content:\"\\f2a6\"}i.icon.globe:before{content:\"\\f0ac\"}i.icon.gofore:before{content:\"\\f3a7\"}i.icon.golf.ball:before{content:\"\\f450\"}i.icon.goodreads:before{content:\"\\f3a8\"}i.icon.goodreads.g:before{content:\"\\f3a9\"}i.icon.google:before{content:\"\\f1a0\"}i.icon.google.drive:before{content:\"\\f3aa\"}i.icon.google.play:before{content:\"\\f3ab\"}i.icon.google.plus:before{content:\"\\f2b3\"}i.icon.google.plus.g:before{content:\"\\f0d5\"}i.icon.google.plus.square:before{content:\"\\f0d4\"}i.icon.google.wallet:before{content:\"\\f1ee\"}i.icon.graduation.cap:before{content:\"\\f19d\"}i.icon.gratipay:before{content:\"\\f184\"}i.icon.grav:before{content:\"\\f2d6\"}i.icon.gripfire:before{content:\"\\f3ac\"}i.icon.grunt:before{content:\"\\f3ad\"}i.icon.gulp:before{content:\"\\f3ae\"}i.icon.h.square:before{content:\"\\f0fd\"}i.icon.hacker.news:before{content:\"\\f1d4\"}i.icon.hacker.news.square:before{content:\"\\f3af\"}i.icon.hand.lizard:before{content:\"\\f258\"}i.icon.hand.paper:before{content:\"\\f256\"}i.icon.hand.peace:before{content:\"\\f25b\"}i.icon.hand.point.down:before{content:\"\\f0a7\"}i.icon.hand.point.left:before{content:\"\\f0a5\"}i.icon.hand.point.right:before{content:\"\\f0a4\"}i.icon.hand.point.up:before{content:\"\\f0a6\"}i.icon.hand.pointer:before{content:\"\\f25a\"}i.icon.hand.rock:before{content:\"\\f255\"}i.icon.hand.scissors:before{content:\"\\f257\"}i.icon.hand.spock:before{content:\"\\f259\"}i.icon.handshake:before{content:\"\\f2b5\"}i.icon.hashtag:before{content:\"\\f292\"}i.icon.hdd:before{content:\"\\f0a0\"}i.icon.heading:before{content:\"\\f1dc\"}i.icon.headphones:before{content:\"\\f025\"}i.icon.heart:before{content:\"\\f004\"}i.icon.heartbeat:before{content:\"\\f21e\"}i.icon.hips:before{content:\"\\f452\"}i.icon.hire.a.helper:before{content:\"\\f3b0\"}i.icon.history:before{content:\"\\f1da\"}i.icon.hockey.puck:before{content:\"\\f453\"}i.icon.home:before{content:\"\\f015\"}i.icon.hooli:before{content:\"\\f427\"}i.icon.hospital:before{content:\"\\f0f8\"}i.icon.hospital.symbol:before{content:\"\\f47e\"}i.icon.hotjar:before{content:\"\\f3b1\"}i.icon.hourglass:before{content:\"\\f254\"}i.icon.hourglass.end:before{content:\"\\f253\"}i.icon.hourglass.half:before{content:\"\\f252\"}i.icon.hourglass.start:before{content:\"\\f251\"}i.icon.houzz:before{content:\"\\f27c\"}i.icon.html5:before{content:\"\\f13b\"}i.icon.hubspot:before{content:\"\\f3b2\"}i.icon.i.cursor:before{content:\"\\f246\"}i.icon.id.badge:before{content:\"\\f2c1\"}i.icon.id.card:before{content:\"\\f2c2\"}i.icon.image:before{content:\"\\f03e\"}i.icon.images:before{content:\"\\f302\"}i.icon.imdb:before{content:\"\\f2d8\"}i.icon.inbox:before{content:\"\\f01c\"}i.icon.indent:before{content:\"\\f03c\"}i.icon.industry:before{content:\"\\f275\"}i.icon.info:before{content:\"\\f129\"}i.icon.info.circle:before{content:\"\\f05a\"}i.icon.instagram:before{content:\"\\f16d\"}i.icon.internet.explorer:before{content:\"\\f26b\"}i.icon.ioxhost:before{content:\"\\f208\"}i.icon.italic:before{content:\"\\f033\"}i.icon.itunes:before{content:\"\\f3b4\"}i.icon.itunes.note:before{content:\"\\f3b5\"}i.icon.jenkins:before{content:\"\\f3b6\"}i.icon.joget:before{content:\"\\f3b7\"}i.icon.joomla:before{content:\"\\f1aa\"}i.icon.js:before{content:\"\\f3b8\"}i.icon.js.square:before{content:\"\\f3b9\"}i.icon.jsfiddle:before{content:\"\\f1cc\"}i.icon.key:before{content:\"\\f084\"}i.icon.keyboard:before{content:\"\\f11c\"}i.icon.keycdn:before{content:\"\\f3ba\"}i.icon.kickstarter:before{content:\"\\f3bb\"}i.icon.kickstarter.k:before{content:\"\\f3bc\"}i.icon.korvue:before{content:\"\\f42f\"}i.icon.language:before{content:\"\\f1ab\"}i.icon.laptop:before{content:\"\\f109\"}i.icon.laravel:before{content:\"\\f3bd\"}i.icon.lastfm:before{content:\"\\f202\"}i.icon.lastfm.square:before{content:\"\\f203\"}i.icon.leaf:before{content:\"\\f06c\"}i.icon.leanpub:before{content:\"\\f212\"}i.icon.lemon:before{content:\"\\f094\"}i.icon.less:before{content:\"\\f41d\"}i.icon.level.down.alternate:before{content:\"\\f3be\"}i.icon.level.up.alternate:before{content:\"\\f3bf\"}i.icon.life.ring:before{content:\"\\f1cd\"}i.icon.lightbulb:before{content:\"\\f0eb\"}i.icon.linechat:before{content:\"\\f3c0\"}i.icon.linkify:before{content:\"\\f0c1\"}i.icon.linkedin:before{content:\"\\f08c\"}i.icon.linkedin.alt:before{content:\"\\f0e1\"}i.icon.linode:before{content:\"\\f2b8\"}i.icon.linux:before{content:\"\\f17c\"}i.icon.lira.sign:before{content:\"\\f195\"}i.icon.list:before{content:\"\\f03a\"}i.icon.list.alternate:before{content:\"\\f022\"}i.icon.list.ol:before{content:\"\\f0cb\"}i.icon.list.ul:before{content:\"\\f0ca\"}i.icon.location.arrow:before{content:\"\\f124\"}i.icon.lock:before{content:\"\\f023\"}i.icon.lock.open:before{content:\"\\f3c1\"}i.icon.long.arrow.alternate.down:before{content:\"\\f309\"}i.icon.long.arrow.alternate.left:before{content:\"\\f30a\"}i.icon.long.arrow.alternate.right:before{content:\"\\f30b\"}i.icon.long.arrow.alternate.up:before{content:\"\\f30c\"}i.icon.low.vision:before{content:\"\\f2a8\"}i.icon.lyft:before{content:\"\\f3c3\"}i.icon.magento:before{content:\"\\f3c4\"}i.icon.magic:before{content:\"\\f0d0\"}i.icon.magnet:before{content:\"\\f076\"}i.icon.male:before{content:\"\\f183\"}i.icon.map:before{content:\"\\f279\"}i.icon.map.marker:before{content:\"\\f041\"}i.icon.map.marker.alternate:before{content:\"\\f3c5\"}i.icon.map.pin:before{content:\"\\f276\"}i.icon.map.signs:before{content:\"\\f277\"}i.icon.mars:before{content:\"\\f222\"}i.icon.mars.double:before{content:\"\\f227\"}i.icon.mars.stroke:before{content:\"\\f229\"}i.icon.mars.stroke.horizontal:before{content:\"\\f22b\"}i.icon.mars.stroke.vertical:before{content:\"\\f22a\"}i.icon.maxcdn:before{content:\"\\f136\"}i.icon.medapps:before{content:\"\\f3c6\"}i.icon.medium:before{content:\"\\f23a\"}i.icon.medium.m:before{content:\"\\f3c7\"}i.icon.medkit:before{content:\"\\f0fa\"}i.icon.medrt:before{content:\"\\f3c8\"}i.icon.meetup:before{content:\"\\f2e0\"}i.icon.meh:before{content:\"\\f11a\"}i.icon.mercury:before{content:\"\\f223\"}i.icon.microchip:before{content:\"\\f2db\"}i.icon.microphone:before{content:\"\\f130\"}i.icon.microphone.slash:before{content:\"\\f131\"}i.icon.microsoft:before{content:\"\\f3ca\"}i.icon.minus:before{content:\"\\f068\"}i.icon.minus.circle:before{content:\"\\f056\"}i.icon.minus.square:before{content:\"\\f146\"}i.icon.mix:before{content:\"\\f3cb\"}i.icon.mixcloud:before{content:\"\\f289\"}i.icon.mizuni:before{content:\"\\f3cc\"}i.icon.mobile:before{content:\"\\f10b\"}i.icon.mobile.alternate:before{content:\"\\f3cd\"}i.icon.modx:before{content:\"\\f285\"}i.icon.monero:before{content:\"\\f3d0\"}i.icon.money.bill.alternate:before{content:\"\\f3d1\"}i.icon.moon:before{content:\"\\f186\"}i.icon.motorcycle:before{content:\"\\f21c\"}i.icon.mouse.pointer:before{content:\"\\f245\"}i.icon.music:before{content:\"\\f001\"}i.icon.napster:before{content:\"\\f3d2\"}i.icon.neuter:before{content:\"\\f22c\"}i.icon.newspaper:before{content:\"\\f1ea\"}i.icon.nintendo.switch:before{content:\"\\f418\"}i.icon.node:before{content:\"\\f419\"}i.icon.node.js:before{content:\"\\f3d3\"}i.icon.npm:before{content:\"\\f3d4\"}i.icon.ns8:before{content:\"\\f3d5\"}i.icon.nutritionix:before{content:\"\\f3d6\"}i.icon.object.group:before{content:\"\\f247\"}i.icon.object.ungroup:before{content:\"\\f248\"}i.icon.odnoklassniki:before{content:\"\\f263\"}i.icon.odnoklassniki.square:before{content:\"\\f264\"}i.icon.opencart:before{content:\"\\f23d\"}i.icon.openid:before{content:\"\\f19b\"}i.icon.opera:before{content:\"\\f26a\"}i.icon.optin.monster:before{content:\"\\f23c\"}i.icon.osi:before{content:\"\\f41a\"}i.icon.outdent:before{content:\"\\f03b\"}i.icon.page4:before{content:\"\\f3d7\"}i.icon.pagelines:before{content:\"\\f18c\"}i.icon.paint.brush:before{content:\"\\f1fc\"}i.icon.palfed:before{content:\"\\f3d8\"}i.icon.pallet:before{content:\"\\f482\"}i.icon.paper.plane:before{content:\"\\f1d8\"}i.icon.paperclip:before{content:\"\\f0c6\"}i.icon.paragraph:before{content:\"\\f1dd\"}i.icon.paste:before{content:\"\\f0ea\"}i.icon.patreon:before{content:\"\\f3d9\"}i.icon.pause:before{content:\"\\f04c\"}i.icon.pause.circle:before{content:\"\\f28b\"}i.icon.paw:before{content:\"\\f1b0\"}i.icon.paypal:before{content:\"\\f1ed\"}i.icon.pen.square:before{content:\"\\f14b\"}i.icon.pencil.alternate:before{content:\"\\f303\"}i.icon.percent:before{content:\"\\f295\"}i.icon.periscope:before{content:\"\\f3da\"}i.icon.phabricator:before{content:\"\\f3db\"}i.icon.phoenix.framework:before{content:\"\\f3dc\"}i.icon.phone:before{content:\"\\f095\"}i.icon.phone.square:before{content:\"\\f098\"}i.icon.phone.volume:before{content:\"\\f2a0\"}i.icon.php:before{content:\"\\f457\"}i.icon.pied.piper:before{content:\"\\f2ae\"}i.icon.pied.piper.alternate:before{content:\"\\f1a8\"}i.icon.pied.piper.pp:before{content:\"\\f1a7\"}i.icon.pills:before{content:\"\\f484\"}i.icon.pinterest:before{content:\"\\f0d2\"}i.icon.pinterest.p:before{content:\"\\f231\"}i.icon.pinterest.square:before{content:\"\\f0d3\"}i.icon.plane:before{content:\"\\f072\"}i.icon.play:before{content:\"\\f04b\"}i.icon.play.circle:before{content:\"\\f144\"}i.icon.playstation:before{content:\"\\f3df\"}i.icon.plug:before{content:\"\\f1e6\"}i.icon.plus:before{content:\"\\f067\"}i.icon.plus.circle:before{content:\"\\f055\"}i.icon.plus.square:before{content:\"\\f0fe\"}i.icon.podcast:before{content:\"\\f2ce\"}i.icon.pound.sign:before{content:\"\\f154\"}i.icon.power.off:before{content:\"\\f011\"}i.icon.print:before{content:\"\\f02f\"}i.icon.product.hunt:before{content:\"\\f288\"}i.icon.pushed:before{content:\"\\f3e1\"}i.icon.puzzle.piece:before{content:\"\\f12e\"}i.icon.python:before{content:\"\\f3e2\"}i.icon.qq:before{content:\"\\f1d6\"}i.icon.qrcode:before{content:\"\\f029\"}i.icon.question:before{content:\"\\f128\"}i.icon.question.circle:before{content:\"\\f059\"}i.icon.quidditch:before{content:\"\\f458\"}i.icon.quinscape:before{content:\"\\f459\"}i.icon.quora:before{content:\"\\f2c4\"}i.icon.quote.left:before{content:\"\\f10d\"}i.icon.quote.right:before{content:\"\\f10e\"}i.icon.random:before{content:\"\\f074\"}i.icon.ravelry:before{content:\"\\f2d9\"}i.icon.react:before{content:\"\\f41b\"}i.icon.rebel:before{content:\"\\f1d0\"}i.icon.recycle:before{content:\"\\f1b8\"}i.icon.redriver:before{content:\"\\f3e3\"}i.icon.reddit:before{content:\"\\f1a1\"}i.icon.reddit.alien:before{content:\"\\f281\"}i.icon.reddit.square:before{content:\"\\f1a2\"}i.icon.redo:before{content:\"\\f01e\"}i.icon.redo.alternate:before{content:\"\\f2f9\"}i.icon.registered:before{content:\"\\f25d\"}i.icon.rendact:before{content:\"\\f3e4\"}i.icon.renren:before{content:\"\\f18b\"}i.icon.reply:before{content:\"\\f3e5\"}i.icon.reply.all:before{content:\"\\f122\"}i.icon.replyd:before{content:\"\\f3e6\"}i.icon.resolving:before{content:\"\\f3e7\"}i.icon.retweet:before{content:\"\\f079\"}i.icon.road:before{content:\"\\f018\"}i.icon.rocket:before{content:\"\\f135\"}i.icon.rocketchat:before{content:\"\\f3e8\"}i.icon.rockrms:before{content:\"\\f3e9\"}i.icon.rss:before{content:\"\\f09e\"}i.icon.rss.square:before{content:\"\\f143\"}i.icon.ruble.sign:before{content:\"\\f158\"}i.icon.rupee.sign:before{content:\"\\f156\"}i.icon.safari:before{content:\"\\f267\"}i.icon.sass:before{content:\"\\f41e\"}i.icon.save:before{content:\"\\f0c7\"}i.icon.schlix:before{content:\"\\f3ea\"}i.icon.scribd:before{content:\"\\f28a\"}i.icon.search:before{content:\"\\f002\"}i.icon.search.minus:before{content:\"\\f010\"}i.icon.search.plus:before{content:\"\\f00e\"}i.icon.searchengin:before{content:\"\\f3eb\"}i.icon.sellcast:before{content:\"\\f2da\"}i.icon.sellsy:before{content:\"\\f213\"}i.icon.server:before{content:\"\\f233\"}i.icon.servicestack:before{content:\"\\f3ec\"}i.icon.share:before{content:\"\\f064\"}i.icon.share.alternate:before{content:\"\\f1e0\"}i.icon.share.alternate.square:before{content:\"\\f1e1\"}i.icon.share.square:before{content:\"\\f14d\"}i.icon.shekel.sign:before{content:\"\\f20b\"}i.icon.shield.alternate:before{content:\"\\f3ed\"}i.icon.ship:before{content:\"\\f21a\"}i.icon.shipping.fast:before{content:\"\\f48b\"}i.icon.shirtsinbulk:before{content:\"\\f214\"}i.icon.shopping.bag:before{content:\"\\f290\"}i.icon.shopping.basket:before{content:\"\\f291\"}i.icon.shopping.cart:before{content:\"\\f07a\"}i.icon.shower:before{content:\"\\f2cc\"}i.icon.sign.language:before{content:\"\\f2a7\"}i.icon.signal:before{content:\"\\f012\"}i.icon.simplybuilt:before{content:\"\\f215\"}i.icon.sistrix:before{content:\"\\f3ee\"}i.icon.sitemap:before{content:\"\\f0e8\"}i.icon.skyatlas:before{content:\"\\f216\"}i.icon.skype:before{content:\"\\f17e\"}i.icon.slack:before{content:\"\\f198\"}i.icon.slack.hash:before{content:\"\\f3ef\"}i.icon.sliders.horizontal:before{content:\"\\f1de\"}i.icon.slideshare:before{content:\"\\f1e7\"}i.icon.smile:before{content:\"\\f118\"}i.icon.snapchat:before{content:\"\\f2ab\"}i.icon.snapchat.ghost:before{content:\"\\f2ac\"}i.icon.snapchat.square:before{content:\"\\f2ad\"}i.icon.snowflake:before{content:\"\\f2dc\"}i.icon.sort:before{content:\"\\f0dc\"}i.icon.sort.alphabet.down:before{content:\"\\f15d\"}i.icon.sort.alphabet.up:before{content:\"\\f15e\"}i.icon.sort.amount.down:before{content:\"\\f160\"}i.icon.sort.amount.up:before{content:\"\\f161\"}i.icon.sort.down:before{content:\"\\f0dd\"}i.icon.sort.numeric.down:before{content:\"\\f162\"}i.icon.sort.numeric.up:before{content:\"\\f163\"}i.icon.sort.up:before{content:\"\\f0de\"}i.icon.soundcloud:before{content:\"\\f1be\"}i.icon.space.shuttle:before{content:\"\\f197\"}i.icon.speakap:before{content:\"\\f3f3\"}i.icon.spinner:before{content:\"\\f110\"}i.icon.spotify:before{content:\"\\f1bc\"}i.icon.square:before{content:\"\\f0c8\"}i.icon.square.full:before{content:\"\\f45c\"}i.icon.stack.exchange:before{content:\"\\f18d\"}i.icon.stack.overflow:before{content:\"\\f16c\"}i.icon.star:before{content:\"\\f005\"}i.icon.star.half:before{content:\"\\f089\"}i.icon.staylinked:before{content:\"\\f3f5\"}i.icon.steam:before{content:\"\\f1b6\"}i.icon.steam.square:before{content:\"\\f1b7\"}i.icon.steam.symbol:before{content:\"\\f3f6\"}i.icon.step.backward:before{content:\"\\f048\"}i.icon.step.forward:before{content:\"\\f051\"}i.icon.stethoscope:before{content:\"\\f0f1\"}i.icon.sticker.mule:before{content:\"\\f3f7\"}i.icon.sticky.note:before{content:\"\\f249\"}i.icon.stop:before{content:\"\\f04d\"}i.icon.stop.circle:before{content:\"\\f28d\"}i.icon.stopwatch:before{content:\"\\f2f2\"}i.icon.strava:before{content:\"\\f428\"}i.icon.street.view:before{content:\"\\f21d\"}i.icon.strikethrough:before{content:\"\\f0cc\"}i.icon.stripe:before{content:\"\\f429\"}i.icon.stripe.s:before{content:\"\\f42a\"}i.icon.studiovinari:before{content:\"\\f3f8\"}i.icon.stumbleupon:before{content:\"\\f1a4\"}i.icon.stumbleupon.circle:before{content:\"\\f1a3\"}i.icon.subscript:before{content:\"\\f12c\"}i.icon.subway:before{content:\"\\f239\"}i.icon.suitcase:before{content:\"\\f0f2\"}i.icon.sun:before{content:\"\\f185\"}i.icon.superpowers:before{content:\"\\f2dd\"}i.icon.superscript:before{content:\"\\f12b\"}i.icon.supple:before{content:\"\\f3f9\"}i.icon.sync:before{content:\"\\f021\"}i.icon.sync.alternate:before{content:\"\\f2f1\"}i.icon.syringe:before{content:\"\\f48e\"}i.icon.table:before{content:\"\\f0ce\"}i.icon.table.tennis:before{content:\"\\f45d\"}i.icon.tablet:before{content:\"\\f10a\"}i.icon.tablet.alternate:before{content:\"\\f3fa\"}i.icon.tachometer.alternate:before{content:\"\\f3fd\"}i.icon.tag:before{content:\"\\f02b\"}i.icon.tags:before{content:\"\\f02c\"}i.icon.tasks:before{content:\"\\f0ae\"}i.icon.taxi:before{content:\"\\f1ba\"}i.icon.telegram:before{content:\"\\f2c6\"}i.icon.telegram.plane:before{content:\"\\f3fe\"}i.icon.tencent.weibo:before{content:\"\\f1d5\"}i.icon.terminal:before{content:\"\\f120\"}i.icon.text.height:before{content:\"\\f034\"}i.icon.text.width:before{content:\"\\f035\"}i.icon.th:before{content:\"\\f00a\"}i.icon.th.large:before{content:\"\\f009\"}i.icon.th.list:before{content:\"\\f00b\"}i.icon.themeisle:before{content:\"\\f2b2\"}i.icon.thermometer:before{content:\"\\f491\"}i.icon.thermometer.empty:before{content:\"\\f2cb\"}i.icon.thermometer.full:before{content:\"\\f2c7\"}i.icon.thermometer.half:before{content:\"\\f2c9\"}i.icon.thermometer.quarter:before{content:\"\\f2ca\"}i.icon.thermometer.three.quarters:before{content:\"\\f2c8\"}i.icon.thumbs.down:before{content:\"\\f165\"}i.icon.thumbs.up:before{content:\"\\f164\"}i.icon.thumbtack:before{content:\"\\f08d\"}i.icon.ticket.alternate:before{content:\"\\f3ff\"}i.icon.times:before{content:\"\\f00d\"}i.icon.times.circle:before{content:\"\\f057\"}i.icon.tint:before{content:\"\\f043\"}i.icon.toggle.off:before{content:\"\\f204\"}i.icon.toggle.on:before{content:\"\\f205\"}i.icon.trademark:before{content:\"\\f25c\"}i.icon.train:before{content:\"\\f238\"}i.icon.transgender:before{content:\"\\f224\"}i.icon.transgender.alternate:before{content:\"\\f225\"}i.icon.trash:before{content:\"\\f1f8\"}i.icon.trash.alternate:before{content:\"\\f2ed\"}i.icon.tree:before{content:\"\\f1bb\"}i.icon.trello:before{content:\"\\f181\"}i.icon.tripadvisor:before{content:\"\\f262\"}i.icon.trophy:before{content:\"\\f091\"}i.icon.truck:before{content:\"\\f0d1\"}i.icon.tty:before{content:\"\\f1e4\"}i.icon.tumblr:before{content:\"\\f173\"}i.icon.tumblr.square:before{content:\"\\f174\"}i.icon.tv:before{content:\"\\f26c\"}i.icon.twitch:before{content:\"\\f1e8\"}i.icon.twitter:before{content:\"\\f099\"}i.icon.twitter.square:before{content:\"\\f081\"}i.icon.typo3:before{content:\"\\f42b\"}i.icon.uber:before{content:\"\\f402\"}i.icon.uikit:before{content:\"\\f403\"}i.icon.umbrella:before{content:\"\\f0e9\"}i.icon.underline:before{content:\"\\f0cd\"}i.icon.undo:before{content:\"\\f0e2\"}i.icon.undo.alternate:before{content:\"\\f2ea\"}i.icon.uniregistry:before{content:\"\\f404\"}i.icon.universal.access:before{content:\"\\f29a\"}i.icon.university:before{content:\"\\f19c\"}i.icon.unlink:before{content:\"\\f127\"}i.icon.unlock:before{content:\"\\f09c\"}i.icon.unlock.alternate:before{content:\"\\f13e\"}i.icon.untappd:before{content:\"\\f405\"}i.icon.upload:before{content:\"\\f093\"}i.icon.usb:before{content:\"\\f287\"}i.icon.user:before{content:\"\\f007\"}i.icon.user.circle:before{content:\"\\f2bd\"}i.icon.user.md:before{content:\"\\f0f0\"}i.icon.user.plus:before{content:\"\\f234\"}i.icon.user.secret:before{content:\"\\f21b\"}i.icon.user.times:before{content:\"\\f235\"}i.icon.users:before{content:\"\\f0c0\"}i.icon.ussunnah:before{content:\"\\f407\"}i.icon.utensil.spoon:before{content:\"\\f2e5\"}i.icon.utensils:before{content:\"\\f2e7\"}i.icon.vaadin:before{content:\"\\f408\"}i.icon.venus:before{content:\"\\f221\"}i.icon.venus.double:before{content:\"\\f226\"}i.icon.venus.mars:before{content:\"\\f228\"}i.icon.viacoin:before{content:\"\\f237\"}i.icon.viadeo:before{content:\"\\f2a9\"}i.icon.viadeo.square:before{content:\"\\f2aa\"}i.icon.viber:before{content:\"\\f409\"}i.icon.video:before{content:\"\\f03d\"}i.icon.vimeo:before{content:\"\\f40a\"}i.icon.vimeo.square:before{content:\"\\f194\"}i.icon.vimeo.v:before{content:\"\\f27d\"}i.icon.vine:before{content:\"\\f1ca\"}i.icon.vk:before{content:\"\\f189\"}i.icon.vnv:before{content:\"\\f40b\"}i.icon.volleyball.ball:before{content:\"\\f45f\"}i.icon.volume.down:before{content:\"\\f027\"}i.icon.volume.off:before{content:\"\\f026\"}i.icon.volume.up:before{content:\"\\f028\"}i.icon.vuejs:before{content:\"\\f41f\"}i.icon.warehouse:before{content:\"\\f494\"}i.icon.weibo:before{content:\"\\f18a\"}i.icon.weight:before{content:\"\\f496\"}i.icon.weixin:before{content:\"\\f1d7\"}i.icon.whatsapp:before{content:\"\\f232\"}i.icon.whatsapp.square:before{content:\"\\f40c\"}i.icon.wheelchair:before{content:\"\\f193\"}i.icon.whmcs:before{content:\"\\f40d\"}i.icon.wifi:before{content:\"\\f1eb\"}i.icon.wikipedia.w:before{content:\"\\f266\"}i.icon.window.close:before{content:\"\\f410\"}i.icon.window.maximize:before{content:\"\\f2d0\"}i.icon.window.minimize:before{content:\"\\f2d1\"}i.icon.window.restore:before{content:\"\\f2d2\"}i.icon.windows:before{content:\"\\f17a\"}i.icon.won.sign:before{content:\"\\f159\"}i.icon.wordpress:before{content:\"\\f19a\"}i.icon.wordpress.simple:before{content:\"\\f411\"}i.icon.wpbeginner:before{content:\"\\f297\"}i.icon.wpexplorer:before{content:\"\\f2de\"}i.icon.wpforms:before{content:\"\\f298\"}i.icon.wrench:before{content:\"\\f0ad\"}i.icon.xbox:before{content:\"\\f412\"}i.icon.xing:before{content:\"\\f168\"}i.icon.xing.square:before{content:\"\\f169\"}i.icon.y.combinator:before{content:\"\\f23b\"}i.icon.yahoo:before{content:\"\\f19e\"}i.icon.yandex:before{content:\"\\f413\"}i.icon.yandex.international:before{content:\"\\f414\"}i.icon.yelp:before{content:\"\\f1e9\"}i.icon.yen.sign:before{content:\"\\f157\"}i.icon.yoast:before{content:\"\\f2b1\"}i.icon.youtube:before{content:\"\\f167\"}i.icon.youtube.square:before{content:\"\\f431\"}i.icon.chess.rock:before{content:\"\\f447\"}i.icon.ordered.list:before{content:\"\\f0cb\"}i.icon.unordered.list:before{content:\"\\f0ca\"}i.icon.user.doctor:before{content:\"\\f0f0\"}i.icon.shield:before{content:\"\\f3ed\"}i.icon.puzzle:before{content:\"\\f12e\"}i.icon.credit.card.amazon.pay:before{content:\"\\f42d\"}i.icon.credit.card.american.express:before{content:\"\\f1f3\"}i.icon.credit.card.diners.club:before{content:\"\\f24c\"}i.icon.credit.card.discover:before{content:\"\\f1f2\"}i.icon.credit.card.jcb:before{content:\"\\f24b\"}i.icon.credit.card.mastercard:before{content:\"\\f1f1\"}i.icon.credit.card.paypal:before{content:\"\\f1f4\"}i.icon.credit.card.stripe:before{content:\"\\f1f5\"}i.icon.credit.card.visa:before{content:\"\\f1f0\"}i.icon.add.circle:before{content:\"\\f055\"}i.icon.add.square:before{content:\"\\f0fe\"}i.icon.add.to.calendar:before{content:\"\\f271\"}i.icon.add.to.cart:before{content:\"\\f217\"}i.icon.add.user:before{content:\"\\f234\"}i.icon.add:before{content:\"\\f067\"}i.icon.alarm.mute:before{content:\"\\f1f6\"}i.icon.alarm:before{content:\"\\f0f3\"}i.icon.ald:before{content:\"\\f2a2\"}i.icon.als:before{content:\"\\f2a2\"}i.icon.american.express.card:before{content:\"\\f1f3\"}i.icon.american.express:before{content:\"\\f1f3\"}i.icon.amex:before{content:\"\\f1f3\"}i.icon.announcement:before{content:\"\\f0a1\"}i.icon.area.chart:before{content:\"\\f1fe\"}i.icon.area.graph:before{content:\"\\f1fe\"}i.icon.arrow.down.cart:before{content:\"\\f218\"}i.icon.asexual:before{content:\"\\f22d\"}i.icon.asl.interpreting:before{content:\"\\f2a3\"}i.icon.asl:before{content:\"\\f2a3\"}i.icon.assistive.listening.devices:before{content:\"\\f2a2\"}i.icon.attach:before{content:\"\\f0c6\"}i.icon.attention:before{content:\"\\f06a\"}i.icon.balance:before{content:\"\\f24e\"}i.icon.bar:before{content:\"\\f0fc\"}i.icon.bathtub:before{content:\"\\f2cd\"}i.icon.battery.four:before{content:\"\\f240\"}i.icon.battery.high:before{content:\"\\f241\"}i.icon.battery.low:before{content:\"\\f243\"}i.icon.battery.medium:before{content:\"\\f242\"}i.icon.battery.one:before{content:\"\\f243\"}i.icon.battery.three:before{content:\"\\f241\"}i.icon.battery.two:before{content:\"\\f242\"}i.icon.battery.zero:before{content:\"\\f244\"}i.icon.birthday:before{content:\"\\f1fd\"}i.icon.block.layout:before{content:\"\\f009\"}i.icon.bluetooth.alternative:before{content:\"\\f294\"}i.icon.broken.chain:before{content:\"\\f127\"}i.icon.browser:before{content:\"\\f022\"}i.icon.call.square:before{content:\"\\f098\"}i.icon.call:before{content:\"\\f095\"}i.icon.cancel:before{content:\"\\f00d\"}i.icon.cart:before{content:\"\\f07a\"}i.icon.cc:before{content:\"\\f20a\"}i.icon.chain:before{content:\"\\f0c1\"}i.icon.chat:before{content:\"\\f075\"}i.icon.checked.calendar:before{content:\"\\f274\"}i.icon.checkmark:before{content:\"\\f00c\"}i.icon.circle.notched:before{content:\"\\f1ce\"}i.icon.close:before{content:\"\\f00d\"}i.icon.cny:before{content:\"\\f157\"}i.icon.cocktail:before{content:\"\\f000\"}i.icon.commenting:before{content:\"\\f27a\"}i.icon.computer:before{content:\"\\f108\"}i.icon.configure:before{content:\"\\f0ad\"}i.icon.content:before{content:\"\\f0c9\"}i.icon.deafness:before{content:\"\\f2a4\"}i.icon.delete.calendar:before{content:\"\\f273\"}i.icon.delete:before{content:\"\\f00d\"}i.icon.detective:before{content:\"\\f21b\"}i.icon.diners.club.card:before{content:\"\\f24c\"}i.icon.diners.club:before{content:\"\\f24c\"}i.icon.discover.card:before{content:\"\\f1f2\"}i.icon.discover:before{content:\"\\f1f2\"}i.icon.discussions:before{content:\"\\f086\"}i.icon.doctor:before{content:\"\\f0f0\"}i.icon.dollar:before{content:\"\\f155\"}i.icon.dont:before{content:\"\\f05e\"}i.icon.dribble:before{content:\"\\f17d\"}i.icon.drivers.license:before{content:\"\\f2c2\"}i.icon.dropdown:before{content:\"\\f0d7\"}i.icon.eercast:before{content:\"\\f2da\"}i.icon.emergency:before{content:\"\\f0f9\"}i.icon.envira.gallery:before{content:\"\\f299\"}i.icon.erase:before{content:\"\\f12d\"}i.icon.eur:before{content:\"\\f153\"}i.icon.euro:before{content:\"\\f153\"}i.icon.eyedropper:before{content:\"\\f1fb\"}i.icon.fa:before{content:\"\\f2b4\"}i.icon.factory:before{content:\"\\f275\"}i.icon.favorite:before{content:\"\\f005\"}i.icon.feed:before{content:\"\\f09e\"}i.icon.female.homosexual:before{content:\"\\f226\"}i.icon.file.text:before{content:\"\\f15c\"}i.icon.find:before{content:\"\\f1e5\"}i.icon.first.aid:before{content:\"\\f0fa\"}i.icon.five.hundred.pixels:before{content:\"\\f26e\"}i.icon.fork:before{content:\"\\f126\"}i.icon.game:before{content:\"\\f11b\"}i.icon.gay:before{content:\"\\f227\"}i.icon.gbp:before{content:\"\\f154\"}i.icon.gittip:before{content:\"\\f184\"}i.icon.google.plus.circle:before{content:\"\\f2b3\"}i.icon.google.plus.official:before{content:\"\\f2b3\"}i.icon.grab:before{content:\"\\f255\"}i.icon.graduation:before{content:\"\\f19d\"}i.icon.grid.layout:before{content:\"\\f00a\"}i.icon.group:before{content:\"\\f0c0\"}i.icon.h:before{content:\"\\f0fd\"}i.icon.hand.victory:before{content:\"\\f25b\"}i.icon.handicap:before{content:\"\\f193\"}i.icon.hard.of.hearing:before{content:\"\\f2a4\"}i.icon.header:before{content:\"\\f1dc\"}i.icon.help.circle:before{content:\"\\f059\"}i.icon.help:before{content:\"\\f128\"}i.icon.heterosexual:before{content:\"\\f228\"}i.icon.hide:before{content:\"\\f070\"}i.icon.hotel:before{content:\"\\f236\"}i.icon.hourglass.four:before{content:\"\\f254\"}i.icon.hourglass.full:before{content:\"\\f254\"}i.icon.hourglass.one:before{content:\"\\f251\"}i.icon.hourglass.three:before{content:\"\\f253\"}i.icon.hourglass.two:before{content:\"\\f252\"}i.icon.idea:before{content:\"\\f0eb\"}i.icon.ils:before{content:\"\\f20b\"}i.icon.in-cart:before{content:\"\\f218\"}i.icon.inr:before{content:\"\\f156\"}i.icon.intergender:before{content:\"\\f224\"}i.icon.intersex:before{content:\"\\f224\"}i.icon.japan.credit.bureau.card:before{content:\"\\f24b\"}i.icon.japan.credit.bureau:before{content:\"\\f24b\"}i.icon.jcb:before{content:\"\\f24b\"}i.icon.jpy:before{content:\"\\f157\"}i.icon.krw:before{content:\"\\f159\"}i.icon.lab:before{content:\"\\f0c3\"}i.icon.law:before{content:\"\\f24e\"}i.icon.legal:before{content:\"\\f0e3\"}i.icon.lesbian:before{content:\"\\f226\"}i.icon.lightning:before{content:\"\\f0e7\"}i.icon.like:before{content:\"\\f004\"}i.icon.line.graph:before{content:\"\\f201\"}i.icon.linkedin.square:before{content:\"\\f08c\"}i.icon.linkify:before{content:\"\\f0c1\"}i.icon.lira:before{content:\"\\f195\"}i.icon.list.layout:before{content:\"\\f00b\"}i.icon.magnify:before{content:\"\\f00e\"}i.icon.mail.forward:before{content:\"\\f064\"}i.icon.mail.square:before{content:\"\\f199\"}i.icon.mail:before{content:\"\\f0e0\"}i.icon.male.homosexual:before{content:\"\\f227\"}i.icon.man:before{content:\"\\f222\"}i.icon.marker:before{content:\"\\f041\"}i.icon.mars.alternate:before{content:\"\\f229\"}i.icon.mars.horizontal:before{content:\"\\f22b\"}i.icon.mars.vertical:before{content:\"\\f22a\"}i.icon.mastercard.card:before{content:\"\\f1f1\"}i.icon.mastercard:before{content:\"\\f1f1\"}i.icon.microsoft.edge:before{content:\"\\f282\"}i.icon.military:before{content:\"\\f0fb\"}i.icon.ms.edge:before{content:\"\\f282\"}i.icon.mute:before{content:\"\\f131\"}i.icon.new.pied.piper:before{content:\"\\f2ae\"}i.icon.non.binary.transgender:before{content:\"\\f223\"}i.icon.numbered.list:before{content:\"\\f0cb\"}i.icon.optinmonster:before{content:\"\\f23c\"}i.icon.options:before{content:\"\\f1de\"}i.icon.other.gender.horizontal:before{content:\"\\f22b\"}i.icon.other.gender.vertical:before{content:\"\\f22a\"}i.icon.other.gender:before{content:\"\\f229\"}i.icon.payment:before{content:\"\\f09d\"}i.icon.paypal.card:before{content:\"\\f1f4\"}i.icon.pencil.square:before{content:\"\\f14b\"}i.icon.photo:before{content:\"\\f030\"}i.icon.picture:before{content:\"\\f03e\"}i.icon.pie.chart:before{content:\"\\f200\"}i.icon.pie.graph:before{content:\"\\f200\"}i.icon.pied.piper.hat:before{content:\"\\f2ae\"}i.icon.pin:before{content:\"\\f08d\"}i.icon.plus.cart:before{content:\"\\f217\"}i.icon.pocket:before{content:\"\\f265\"}i.icon.point:before{content:\"\\f041\"}i.icon.pointing.down:before{content:\"\\f0a7\"}i.icon.pointing.left:before{content:\"\\f0a5\"}i.icon.pointing.right:before{content:\"\\f0a4\"}i.icon.pointing.up:before{content:\"\\f0a6\"}i.icon.pound:before{content:\"\\f154\"}i.icon.power.cord:before{content:\"\\f1e6\"}i.icon.power:before{content:\"\\f011\"}i.icon.privacy:before{content:\"\\f084\"}i.icon.r.circle:before{content:\"\\f25d\"}i.icon.rain:before{content:\"\\f0e9\"}i.icon.record:before{content:\"\\f03d\"}i.icon.refresh:before{content:\"\\f021\"}i.icon.remove.circle:before{content:\"\\f057\"}i.icon.remove.from.calendar:before{content:\"\\f272\"}i.icon.remove.user:before{content:\"\\f235\"}i.icon.remove:before{content:\"\\f00d\"}i.icon.repeat:before{content:\"\\f01e\"}i.icon.rmb:before{content:\"\\f157\"}i.icon.rouble:before{content:\"\\f158\"}i.icon.rub:before{content:\"\\f158\"}i.icon.ruble:before{content:\"\\f158\"}i.icon.rupee:before{content:\"\\f156\"}i.icon.s15:before{content:\"\\f2cd\"}i.icon.selected.radio:before{content:\"\\f192\"}i.icon.send:before{content:\"\\f1d8\"}i.icon.setting:before{content:\"\\f013\"}i.icon.settings:before{content:\"\\f085\"}i.icon.shekel:before{content:\"\\f20b\"}i.icon.sheqel:before{content:\"\\f20b\"}i.icon.shipping:before{content:\"\\f0d1\"}i.icon.shop:before{content:\"\\f07a\"}i.icon.shuffle:before{content:\"\\f074\"}i.icon.shutdown:before{content:\"\\f011\"}i.icon.sidebar:before{content:\"\\f0c9\"}i.icon.signing:before{content:\"\\f2a7\"}i.icon.signup:before{content:\"\\f044\"}i.icon.sliders:before{content:\"\\f1de\"}i.icon.soccer:before{content:\"\\f1e3\"}i.icon.sort.alphabet.ascending:before{content:\"\\f15d\"}i.icon.sort.alphabet.descending:before{content:\"\\f15e\"}i.icon.sort.ascending:before{content:\"\\f0de\"}i.icon.sort.content.ascending:before{content:\"\\f160\"}i.icon.sort.content.descending:before{content:\"\\f161\"}i.icon.sort.descending:before{content:\"\\f0dd\"}i.icon.sort.numeric.ascending:before{content:\"\\f162\"}i.icon.sort.numeric.descending:before{content:\"\\f163\"}i.icon.sound:before{content:\"\\f025\"}i.icon.spy:before{content:\"\\f21b\"}i.icon.stripe.card:before{content:\"\\f1f5\"}i.icon.student:before{content:\"\\f19d\"}i.icon.talk:before{content:\"\\f27a\"}i.icon.target:before{content:\"\\f140\"}i.icon.teletype:before{content:\"\\f1e4\"}i.icon.television:before{content:\"\\f26c\"}i.icon.text.cursor:before{content:\"\\f246\"}i.icon.text.telephone:before{content:\"\\f1e4\"}i.icon.theme.isle:before{content:\"\\f2b2\"}i.icon.theme:before{content:\"\\f043\"}i.icon.thermometer:before{content:\"\\f2c7\"}i.icon.thumb.tack:before{content:\"\\f08d\"}i.icon.time:before{content:\"\\f017\"}i.icon.tm:before{content:\"\\f25c\"}i.icon.toggle.down:before{content:\"\\f150\"}i.icon.toggle.left:before{content:\"\\f191\"}i.icon.toggle.right:before{content:\"\\f152\"}i.icon.toggle.up:before{content:\"\\f151\"}i.icon.translate:before{content:\"\\f1ab\"}i.icon.travel:before{content:\"\\f0b1\"}i.icon.treatment:before{content:\"\\f0f1\"}i.icon.triangle.down:before{content:\"\\f0d7\"}i.icon.triangle.left:before{content:\"\\f0d9\"}i.icon.triangle.right:before{content:\"\\f0da\"}i.icon.triangle.up:before{content:\"\\f0d8\"}i.icon.try:before{content:\"\\f195\"}i.icon.unhide:before{content:\"\\f06e\"}i.icon.unlinkify:before{content:\"\\f127\"}i.icon.unmute:before{content:\"\\f130\"}i.icon.usd:before{content:\"\\f155\"}i.icon.user.cancel:before{content:\"\\f235\"}i.icon.user.close:before{content:\"\\f235\"}i.icon.user.delete:before{content:\"\\f235\"}i.icon.user.x:before{content:\"\\f235\"}i.icon.vcard:before{content:\"\\f2bb\"}i.icon.video.camera:before{content:\"\\f03d\"}i.icon.video.play:before{content:\"\\f144\"}i.icon.visa.card:before{content:\"\\f1f0\"}i.icon.visa:before{content:\"\\f1f0\"}i.icon.volume.control.phone:before{content:\"\\f2a0\"}i.icon.wait:before{content:\"\\f017\"}i.icon.warning.circle:before{content:\"\\f06a\"}i.icon.warning.sign:before{content:\"\\f071\"}i.icon.warning:before{content:\"\\f12a\"}i.icon.wechat:before{content:\"\\f1d7\"}i.icon.wi-fi:before{content:\"\\f1eb\"}i.icon.wikipedia:before{content:\"\\f266\"}i.icon.winner:before{content:\"\\f091\"}i.icon.wizard:before{content:\"\\f0d0\"}i.icon.woman:before{content:\"\\f221\"}i.icon.won:before{content:\"\\f159\"}i.icon.wordpress.beginner:before{content:\"\\f297\"}i.icon.wordpress.forms:before{content:\"\\f298\"}i.icon.world:before{content:\"\\f0ac\"}i.icon.write.square:before{content:\"\\f14b\"}i.icon.x:before{content:\"\\f00d\"}i.icon.yc:before{content:\"\\f23b\"}i.icon.ycombinator:before{content:\"\\f23b\"}i.icon.yen:before{content:\"\\f157\"}i.icon.zip:before{content:\"\\f187\"}i.icon.zoom-in:before{content:\"\\f00e\"}i.icon.zoom-out:before{content:\"\\f010\"}i.icon.zoom:before{content:\"\\f00e\"}i.icon.bitbucket.square:before{content:\"\\f171\"}i.icon.checkmark.box:before{content:\"\\f14a\"}i.icon.circle.thin:before{content:\"\\f111\"}i.icon.cloud.download:before{content:\"\\f381\"}i.icon.cloud.upload:before{content:\"\\f382\"}i.icon.compose:before{content:\"\\f303\"}i.icon.conversation:before{content:\"\\f086\"}i.icon.credit.card.alternative:before{content:\"\\f09d\"}i.icon.currency:before{content:\"\\f3d1\"}i.icon.dashboard:before{content:\"\\f3fd\"}i.icon.diamond:before{content:\"\\f3a5\"}i.icon.disk:before{content:\"\\f0a0\"}i.icon.exchange:before{content:\"\\f362\"}i.icon.external.share:before{content:\"\\f14d\"}i.icon.external.square:before{content:\"\\f360\"}i.icon.external:before{content:\"\\f35d\"}i.icon.facebook.official:before{content:\"\\f082\"}i.icon.food:before{content:\"\\f2e7\"}i.icon.hourglass.zero:before{content:\"\\f253\"}i.icon.level.down:before{content:\"\\f3be\"}i.icon.level.up:before{content:\"\\f3bf\"}i.icon.logout:before{content:\"\\f2f5\"}i.icon.meanpath:before{content:\"\\f0c8\"}i.icon.money:before{content:\"\\f3d1\"}i.icon.move:before{content:\"\\f0b2\"}i.icon.pencil:before{content:\"\\f303\"}i.icon.protect:before{content:\"\\f023\"}i.icon.radio:before{content:\"\\f192\"}i.icon.remove.bookmark:before{content:\"\\f02e\"}i.icon.resize.horizontal:before{content:\"\\f337\"}i.icon.resize.vertical:before{content:\"\\f338\"}i.icon.sign-in:before{content:\"\\f2f6\"}i.icon.sign-out:before{content:\"\\f2f5\"}i.icon.spoon:before{content:\"\\f2e5\"}i.icon.star.half.empty:before{content:\"\\f089\"}i.icon.star.half.full:before{content:\"\\f089\"}i.icon.ticket:before{content:\"\\f3ff\"}i.icon.times.rectangle:before{content:\"\\f410\"}i.icon.write:before{content:\"\\f303\"}i.icon.youtube.play:before{content:\"\\f167\"}@font-face{font-family:outline-icons;src:url(" + ___CSS_LOADER_URL_REPLACEMENT_7___ + ");src:url(" + ___CSS_LOADER_URL_REPLACEMENT_8___ + ") format('embedded-opentype'),url(" + ___CSS_LOADER_URL_REPLACEMENT_9___ + ") format('woff2'),url(" + ___CSS_LOADER_URL_REPLACEMENT_10___ + ") format('woff'),url(" + ___CSS_LOADER_URL_REPLACEMENT_11___ + ") format('truetype'),url(" + ___CSS_LOADER_URL_REPLACEMENT_12___ + ") format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.outline{font-family:outline-icons}i.icon.address.book.outline:before{content:\"\\f2b9\"}i.icon.address.card.outline:before{content:\"\\f2bb\"}i.icon.arrow.alternate.circle.down.outline:before{content:\"\\f358\"}i.icon.arrow.alternate.circle.left.outline:before{content:\"\\f359\"}i.icon.arrow.alternate.circle.right.outline:before{content:\"\\f35a\"}i.icon.arrow.alternate.circle.up.outline:before{content:\"\\f35b\"}i.icon.bell.outline:before{content:\"\\f0f3\"}i.icon.bell.slash.outline:before{content:\"\\f1f6\"}i.icon.bookmark.outline:before{content:\"\\f02e\"}i.icon.building.outline:before{content:\"\\f1ad\"}i.icon.calendar.outline:before{content:\"\\f133\"}i.icon.calendar.alternate.outline:before{content:\"\\f073\"}i.icon.calendar.check.outline:before{content:\"\\f274\"}i.icon.calendar.minus.outline:before{content:\"\\f272\"}i.icon.calendar.plus.outline:before{content:\"\\f271\"}i.icon.calendar.times.outline:before{content:\"\\f273\"}i.icon.caret.square.down.outline:before{content:\"\\f150\"}i.icon.caret.square.left.outline:before{content:\"\\f191\"}i.icon.caret.square.right.outline:before{content:\"\\f152\"}i.icon.caret.square.up.outline:before{content:\"\\f151\"}i.icon.chart.bar.outline:before{content:\"\\f080\"}i.icon.check.circle.outline:before{content:\"\\f058\"}i.icon.check.square.outline:before{content:\"\\f14a\"}i.icon.circle.outline:before{content:\"\\f111\"}i.icon.clipboard.outline:before{content:\"\\f328\"}i.icon.clock.outline:before{content:\"\\f017\"}i.icon.clone.outline:before{content:\"\\f24d\"}i.icon.closed.captioning.outline:before{content:\"\\f20a\"}i.icon.comment.outline:before{content:\"\\f075\"}i.icon.comment.alternate.outline:before{content:\"\\f27a\"}i.icon.comments.outline:before{content:\"\\f086\"}i.icon.compass.outline:before{content:\"\\f14e\"}i.icon.copy.outline:before{content:\"\\f0c5\"}i.icon.copyright.outline:before{content:\"\\f1f9\"}i.icon.credit.card.outline:before{content:\"\\f09d\"}i.icon.dot.circle.outline:before{content:\"\\f192\"}i.icon.edit.outline:before{content:\"\\f044\"}i.icon.envelope.outline:before{content:\"\\f0e0\"}i.icon.envelope.open.outline:before{content:\"\\f2b6\"}i.icon.eye.slash.outline:before{content:\"\\f070\"}i.icon.file.outline:before{content:\"\\f15b\"}i.icon.file.alternate.outline:before{content:\"\\f15c\"}i.icon.file.archive.outline:before{content:\"\\f1c6\"}i.icon.file.audio.outline:before{content:\"\\f1c7\"}i.icon.file.code.outline:before{content:\"\\f1c9\"}i.icon.file.excel.outline:before{content:\"\\f1c3\"}i.icon.file.image.outline:before{content:\"\\f1c5\"}i.icon.file.pdf.outline:before{content:\"\\f1c1\"}i.icon.file.powerpoint.outline:before{content:\"\\f1c4\"}i.icon.file.video.outline:before{content:\"\\f1c8\"}i.icon.file.word.outline:before{content:\"\\f1c2\"}i.icon.flag.outline:before{content:\"\\f024\"}i.icon.folder.outline:before{content:\"\\f07b\"}i.icon.folder.open.outline:before{content:\"\\f07c\"}i.icon.frown.outline:before{content:\"\\f119\"}i.icon.futbol.outline:before{content:\"\\f1e3\"}i.icon.gem.outline:before{content:\"\\f3a5\"}i.icon.hand.lizard.outline:before{content:\"\\f258\"}i.icon.hand.paper.outline:before{content:\"\\f256\"}i.icon.hand.peace.outline:before{content:\"\\f25b\"}i.icon.hand.point.down.outline:before{content:\"\\f0a7\"}i.icon.hand.point.left.outline:before{content:\"\\f0a5\"}i.icon.hand.point.right.outline:before{content:\"\\f0a4\"}i.icon.hand.point.up.outline:before{content:\"\\f0a6\"}i.icon.hand.pointer.outline:before{content:\"\\f25a\"}i.icon.hand.rock.outline:before{content:\"\\f255\"}i.icon.hand.scissors.outline:before{content:\"\\f257\"}i.icon.hand.spock.outline:before{content:\"\\f259\"}i.icon.handshake.outline:before{content:\"\\f2b5\"}i.icon.hdd.outline:before{content:\"\\f0a0\"}i.icon.heart.outline:before{content:\"\\f004\"}i.icon.hospital.outline:before{content:\"\\f0f8\"}i.icon.hourglass.outline:before{content:\"\\f254\"}i.icon.id.badge.outline:before{content:\"\\f2c1\"}i.icon.id.card.outline:before{content:\"\\f2c2\"}i.icon.image.outline:before{content:\"\\f03e\"}i.icon.images.outline:before{content:\"\\f302\"}i.icon.keyboard.outline:before{content:\"\\f11c\"}i.icon.lemon.outline:before{content:\"\\f094\"}i.icon.life.ring.outline:before{content:\"\\f1cd\"}i.icon.lightbulb.outline:before{content:\"\\f0eb\"}i.icon.list.alternate.outline:before{content:\"\\f022\"}i.icon.map.outline:before{content:\"\\f279\"}i.icon.meh.outline:before{content:\"\\f11a\"}i.icon.minus.square.outline:before{content:\"\\f146\"}i.icon.money.bill.alternate.outline:before{content:\"\\f3d1\"}i.icon.moon.outline:before{content:\"\\f186\"}i.icon.newspaper.outline:before{content:\"\\f1ea\"}i.icon.object.group.outline:before{content:\"\\f247\"}i.icon.object.ungroup.outline:before{content:\"\\f248\"}i.icon.paper.plane.outline:before{content:\"\\f1d8\"}i.icon.pause.circle.outline:before{content:\"\\f28b\"}i.icon.play.circle.outline:before{content:\"\\f144\"}i.icon.plus.square.outline:before{content:\"\\f0fe\"}i.icon.question.circle.outline:before{content:\"\\f059\"}i.icon.registered.outline:before{content:\"\\f25d\"}i.icon.save.outline:before{content:\"\\f0c7\"}i.icon.share.square.outline:before{content:\"\\f14d\"}i.icon.smile.outline:before{content:\"\\f118\"}i.icon.snowflake.outline:before{content:\"\\f2dc\"}i.icon.square.outline:before{content:\"\\f0c8\"}i.icon.star.outline:before{content:\"\\f005\"}i.icon.star.half.outline:before{content:\"\\f089\"}i.icon.sticky.note.outline:before{content:\"\\f249\"}i.icon.stop.circle.outline:before{content:\"\\f28d\"}i.icon.sun.outline:before{content:\"\\f185\"}i.icon.thumbs.down.outline:before{content:\"\\f165\"}i.icon.thumbs.up.outline:before{content:\"\\f164\"}i.icon.times.circle.outline:before{content:\"\\f057\"}i.icon.trash.alternate.outline:before{content:\"\\f2ed\"}i.icon.user.outline:before{content:\"\\f007\"}i.icon.user.circle.outline:before{content:\"\\f2bd\"}i.icon.window.close.outline:before{content:\"\\f410\"}i.icon.window.maximize.outline:before{content:\"\\f2d0\"}i.icon.window.minimize.outline:before{content:\"\\f2d1\"}i.icon.window.restore.outline:before{content:\"\\f2d2\"}i.icon.disk.outline:before{content:\"\\f0a0\"}i.icon.heart.empty,i.icon.star.empty{font-family:outline-icons}i.icon.heart.empty:before{content:\"\\f004\"}i.icon.star.empty:before{content:\"\\f089\"}@font-face{font-family:brand-icons;src:url(" + ___CSS_LOADER_URL_REPLACEMENT_13___ + ");src:url(" + ___CSS_LOADER_URL_REPLACEMENT_14___ + ") format('embedded-opentype'),url(" + ___CSS_LOADER_URL_REPLACEMENT_15___ + ") format('woff2'),url(" + ___CSS_LOADER_URL_REPLACEMENT_16___ + ") format('woff'),url(" + ___CSS_LOADER_URL_REPLACEMENT_17___ + ") format('truetype'),url(" + ___CSS_LOADER_URL_REPLACEMENT_18___ + ") format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.\\35 00px,i.icon.accessible.icon,i.icon.accusoft,i.icon.adn,i.icon.adversal,i.icon.affiliatetheme,i.icon.algolia,i.icon.amazon,i.icon.amazon.pay,i.icon.amilia,i.icon.android,i.icon.angellist,i.icon.angrycreative,i.icon.angular,i.icon.app.store,i.icon.app.store.ios,i.icon.apper,i.icon.apple,i.icon.apple.pay,i.icon.asymmetrik,i.icon.audible,i.icon.autoprefixer,i.icon.avianex,i.icon.aviato,i.icon.aws,i.icon.bandcamp,i.icon.behance,i.icon.behance.square,i.icon.bimobject,i.icon.bitbucket,i.icon.bitcoin,i.icon.bity,i.icon.black.tie,i.icon.blackberry,i.icon.blogger,i.icon.blogger.b,i.icon.bluetooth,i.icon.bluetooth.b,i.icon.btc,i.icon.buromobelexperte,i.icon.buysellads,i.icon.cc.amazon.pay,i.icon.cc.amex,i.icon.cc.apple.pay,i.icon.cc.diners.club,i.icon.cc.discover,i.icon.cc.jcb,i.icon.cc.mastercard,i.icon.cc.paypal,i.icon.cc.stripe,i.icon.cc.visa,i.icon.centercode,i.icon.chrome,i.icon.cloudscale,i.icon.cloudsmith,i.icon.cloudversify,i.icon.codepen,i.icon.codiepie,i.icon.connectdevelop,i.icon.contao,i.icon.cpanel,i.icon.creative.commons,i.icon.css3,i.icon.css3.alternate,i.icon.cuttlefish,i.icon.d.and.d,i.icon.dashcube,i.icon.delicious,i.icon.deploydog,i.icon.deskpro,i.icon.deviantart,i.icon.digg,i.icon.digital.ocean,i.icon.discord,i.icon.discourse,i.icon.dochub,i.icon.docker,i.icon.draft2digital,i.icon.dribbble,i.icon.dribbble.square,i.icon.dropbox,i.icon.drupal,i.icon.dyalog,i.icon.earlybirds,i.icon.edge,i.icon.elementor,i.icon.ember,i.icon.empire,i.icon.envira,i.icon.erlang,i.icon.ethereum,i.icon.etsy,i.icon.expeditedssl,i.icon.facebook,i.icon.facebook.f,i.icon.facebook.messenger,i.icon.facebook.square,i.icon.firefox,i.icon.first.order,i.icon.firstdraft,i.icon.flickr,i.icon.flipboard,i.icon.fly,i.icon.font.awesome,i.icon.font.awesome.alternate,i.icon.font.awesome.flag,i.icon.fonticons,i.icon.fonticons.fi,i.icon.fort.awesome,i.icon.fort.awesome.alternate,i.icon.forumbee,i.icon.foursquare,i.icon.free.code.camp,i.icon.freebsd,i.icon.get.pocket,i.icon.gg,i.icon.gg.circle,i.icon.git,i.icon.git.square,i.icon.github,i.icon.github.alternate,i.icon.github.square,i.icon.gitkraken,i.icon.gitlab,i.icon.gitter,i.icon.glide,i.icon.glide.g,i.icon.gofore,i.icon.goodreads,i.icon.goodreads.g,i.icon.google,i.icon.google.drive,i.icon.google.play,i.icon.google.plus,i.icon.google.plus.g,i.icon.google.plus.square,i.icon.google.wallet,i.icon.gratipay,i.icon.grav,i.icon.gripfire,i.icon.grunt,i.icon.gulp,i.icon.hacker.news,i.icon.hacker.news.square,i.icon.hips,i.icon.hire.a.helper,i.icon.hooli,i.icon.hotjar,i.icon.houzz,i.icon.html5,i.icon.hubspot,i.icon.imdb,i.icon.instagram,i.icon.internet.explorer,i.icon.ioxhost,i.icon.itunes,i.icon.itunes.note,i.icon.jenkins,i.icon.joget,i.icon.joomla,i.icon.js,i.icon.js.square,i.icon.jsfiddle,i.icon.keycdn,i.icon.kickstarter,i.icon.kickstarter.k,i.icon.korvue,i.icon.laravel,i.icon.lastfm,i.icon.lastfm.square,i.icon.leanpub,i.icon.less,i.icon.linechat,i.icon.linkedin,i.icon.linkedin.alternate,i.icon.linkedin.in,i.icon.linode,i.icon.linux,i.icon.lyft,i.icon.magento,i.icon.maxcdn,i.icon.medapps,i.icon.medium,i.icon.medium.m,i.icon.medrt,i.icon.meetup,i.icon.microsoft,i.icon.mix,i.icon.mixcloud,i.icon.mizuni,i.icon.modx,i.icon.monero,i.icon.napster,i.icon.nintendo.switch,i.icon.node,i.icon.node.js,i.icon.npm,i.icon.ns8,i.icon.nutritionix,i.icon.odnoklassniki,i.icon.odnoklassniki.square,i.icon.opencart,i.icon.openid,i.icon.opera,i.icon.optin.monster,i.icon.osi,i.icon.page4,i.icon.pagelines,i.icon.palfed,i.icon.patreon,i.icon.paypal,i.icon.periscope,i.icon.phabricator,i.icon.phoenix.framework,i.icon.php,i.icon.pied.piper,i.icon.pied.piper.alternate,i.icon.pied.piper.pp,i.icon.pinterest,i.icon.pinterest.p,i.icon.pinterest.square,i.icon.playstation,i.icon.product.hunt,i.icon.pushed,i.icon.python,i.icon.qq,i.icon.quinscape,i.icon.quora,i.icon.ravelry,i.icon.react,i.icon.rebel,i.icon.reddit,i.icon.reddit.alien,i.icon.reddit.square,i.icon.redriver,i.icon.rendact,i.icon.renren,i.icon.replyd,i.icon.resolving,i.icon.rocketchat,i.icon.rockrms,i.icon.safari,i.icon.sass,i.icon.schlix,i.icon.scribd,i.icon.searchengin,i.icon.sellcast,i.icon.sellsy,i.icon.servicestack,i.icon.shirtsinbulk,i.icon.simplybuilt,i.icon.sistrix,i.icon.skyatlas,i.icon.skype,i.icon.slack,i.icon.slack.hash,i.icon.slideshare,i.icon.snapchat,i.icon.snapchat.ghost,i.icon.snapchat.square,i.icon.soundcloud,i.icon.speakap,i.icon.spotify,i.icon.stack.exchange,i.icon.stack.overflow,i.icon.staylinked,i.icon.steam,i.icon.steam.square,i.icon.steam.symbol,i.icon.sticker.mule,i.icon.strava,i.icon.stripe,i.icon.stripe.s,i.icon.studiovinari,i.icon.stumbleupon,i.icon.stumbleupon.circle,i.icon.superpowers,i.icon.supple,i.icon.telegram,i.icon.telegram.plane,i.icon.tencent.weibo,i.icon.themeisle,i.icon.trello,i.icon.tripadvisor,i.icon.tumblr,i.icon.tumblr.square,i.icon.twitch,i.icon.twitter,i.icon.twitter.square,i.icon.typo3,i.icon.uber,i.icon.uikit,i.icon.uniregistry,i.icon.untappd,i.icon.usb,i.icon.ussunnah,i.icon.vaadin,i.icon.viacoin,i.icon.viadeo,i.icon.viadeo.square,i.icon.viber,i.icon.vimeo,i.icon.vimeo.square,i.icon.vimeo.v,i.icon.vine,i.icon.vk,i.icon.vnv,i.icon.vuejs,i.icon.wechat,i.icon.weibo,i.icon.weixin,i.icon.whatsapp,i.icon.whatsapp.square,i.icon.whmcs,i.icon.wikipedia.w,i.icon.windows,i.icon.wordpress,i.icon.wordpress.simple,i.icon.wpbeginner,i.icon.wpexplorer,i.icon.wpforms,i.icon.xbox,i.icon.xing,i.icon.xing.square,i.icon.y.combinator,i.icon.yahoo,i.icon.yandex,i.icon.yandex.international,i.icon.yelp,i.icon.yoast,i.icon.youtube,i.icon.youtube.square{font-family:brand-icons}/*!\n * # Semantic UI 2.4.0 - Image\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.image{position:relative;display:inline-block;vertical-align:middle;max-width:100%;background-color:transparent}img.ui.image{display:block}.ui.image img,.ui.image svg{display:block;max-width:100%;height:auto}.ui.hidden.image,.ui.hidden.images{display:none}.ui.hidden.transition.image,.ui.hidden.transition.images{display:block;visibility:hidden}.ui.images>.hidden.transition{display:inline-block;visibility:hidden}.ui.disabled.image,.ui.disabled.images{cursor:default;opacity:.45}.ui.inline.image,.ui.inline.image img,.ui.inline.image svg{display:inline-block}.ui.top.aligned.image,.ui.top.aligned.image img,.ui.top.aligned.image svg,.ui.top.aligned.images .image{display:inline-block;vertical-align:top}.ui.middle.aligned.image,.ui.middle.aligned.image img,.ui.middle.aligned.image svg,.ui.middle.aligned.images .image{display:inline-block;vertical-align:middle}.ui.bottom.aligned.image,.ui.bottom.aligned.image img,.ui.bottom.aligned.image svg,.ui.bottom.aligned.images .image{display:inline-block;vertical-align:bottom}.ui.rounded.image,.ui.rounded.image>*,.ui.rounded.images .image,.ui.rounded.images .image>*{border-radius:.3125em}.ui.bordered.image img,.ui.bordered.image svg,.ui.bordered.images .image,.ui.bordered.images img,.ui.bordered.images svg,img.ui.bordered.image{border:1px solid rgba(0,0,0,.1)}.ui.circular.image,.ui.circular.images{overflow:hidden}.ui.circular.image,.ui.circular.image>*,.ui.circular.images .image,.ui.circular.images .image>*{border-radius:500rem}.ui.fluid.image,.ui.fluid.image img,.ui.fluid.image svg,.ui.fluid.images,.ui.fluid.images img,.ui.fluid.images svg{display:block;width:100%;height:auto}.ui.avatar.image,.ui.avatar.image img,.ui.avatar.image svg,.ui.avatar.images .image,.ui.avatar.images img,.ui.avatar.images svg{margin-right:.25em;display:inline-block;width:2em;height:2em;border-radius:500rem}.ui.spaced.image{display:inline-block!important;margin-left:.5em;margin-right:.5em}.ui[class*=\"left spaced\"].image{margin-left:.5em;margin-right:0}.ui[class*=\"right spaced\"].image{margin-left:0;margin-right:.5em}.ui.floated.image,.ui.floated.images{float:left;margin-right:1em;margin-bottom:1em}.ui.right.floated.image,.ui.right.floated.images{float:right;margin-right:0;margin-bottom:1em;margin-left:1em}.ui.floated.image:last-child,.ui.floated.images:last-child{margin-bottom:0}.ui.centered.image,.ui.centered.images{margin-left:auto;margin-right:auto}.ui.mini.image,.ui.mini.images .image,.ui.mini.images img,.ui.mini.images svg{width:35px;height:auto;font-size:.78571429rem}.ui.tiny.image,.ui.tiny.images .image,.ui.tiny.images img,.ui.tiny.images svg{width:80px;height:auto;font-size:.85714286rem}.ui.small.image,.ui.small.images .image,.ui.small.images img,.ui.small.images svg{width:150px;height:auto;font-size:.92857143rem}.ui.medium.image,.ui.medium.images .image,.ui.medium.images img,.ui.medium.images svg{width:300px;height:auto;font-size:1rem}.ui.large.image,.ui.large.images .image,.ui.large.images img,.ui.large.images svg{width:450px;height:auto;font-size:1.14285714rem}.ui.big.image,.ui.big.images .image,.ui.big.images img,.ui.big.images svg{width:600px;height:auto;font-size:1.28571429rem}.ui.huge.image,.ui.huge.images .image,.ui.huge.images img,.ui.huge.images svg{width:800px;height:auto;font-size:1.42857143rem}.ui.massive.image,.ui.massive.images .image,.ui.massive.images img,.ui.massive.images svg{width:960px;height:auto;font-size:1.71428571rem}.ui.images{font-size:0;margin:0 -.25rem 0}.ui.images .image,.ui.images>img,.ui.images>svg{display:inline-block;margin:0 .25rem .5rem}/*!\n * # Semantic UI 2.4.0 - Input\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.input{position:relative;font-weight:400;font-style:normal;display:inline-flex;color:rgba(0,0,0,.87)}.ui.input>input{margin:0;max-width:100%;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:1.21428571em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;padding:.67857143em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-webkit-box-shadow:none;box-shadow:none}.ui.input>input::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.input>input::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.input>input:-ms-input-placeholder{color:rgba(191,191,191,.87)}.ui.disabled.input,.ui.input:not(.disabled) input[disabled]{opacity:.45}.ui.disabled.input>input,.ui.input:not(.disabled) input[disabled]{pointer-events:none}.ui.input.down input,.ui.input>input:active{border-color:rgba(0,0,0,.3);background:#fafafa;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.loading.loading.input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.loading.input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.input.focus>input,.ui.input>input:focus{border-color:#85b7d9;background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:none;box-shadow:none}.ui.input.focus>input::-webkit-input-placeholder,.ui.input>input:focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input::-moz-placeholder,.ui.input>input:focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input:-ms-input-placeholder,.ui.input>input:focus:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.error>input{background-color:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.input.error>input::-webkit-input-placeholder{color:#e7bdbc}.ui.input.error>input::-moz-placeholder{color:#e7bdbc}.ui.input.error>input:-ms-input-placeholder{color:#e7bdbc!important}.ui.input.error>input:focus::-webkit-input-placeholder{color:#da9796}.ui.input.error>input:focus::-moz-placeholder{color:#da9796}.ui.input.error>input:focus:-ms-input-placeholder{color:#da9796!important}.ui.transparent.input>input{border-color:transparent!important;background-color:transparent!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important}.ui.transparent.icon.input>i.icon{width:1.1em}.ui.transparent.icon.input>input{padding-left:0!important;padding-right:2em!important}.ui.transparent[class*=\"left icon\"].input>input{padding-left:2em!important;padding-right:0!important}.ui.transparent.inverted.input{color:#fff}.ui.transparent.inverted.input>input{color:inherit}.ui.transparent.inverted.input>input::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input::-moz-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input:-ms-input-placeholder{color:rgba(255,255,255,.5)}.ui.icon.input>i.icon{cursor:default;position:absolute;line-height:1;text-align:center;top:0;right:0;margin:0;height:100%;width:2.67142857em;opacity:.5;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.ui.icon.input>i.icon:not(.link){pointer-events:none}.ui.icon.input>input{padding-right:2.67142857em!important}.ui.icon.input>i.icon:after,.ui.icon.input>i.icon:before{left:0;position:absolute;text-align:center;top:50%;width:100%;margin-top:-.5em}.ui.icon.input>i.link.icon{cursor:pointer}.ui.icon.input>i.circular.icon{top:.35em;right:.5em}.ui[class*=\"left icon\"].input>i.icon{right:auto;left:1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"left icon\"].input>i.circular.icon{right:auto;left:.5em}.ui[class*=\"left icon\"].input>input{padding-left:2.67142857em!important;padding-right:1em!important}.ui.icon.input>input:focus~i.icon{opacity:1}.ui.labeled.input>.label{flex:0 0 auto;margin:0;font-size:1em}.ui.labeled.input>.label:not(.corner){padding-top:.78571429em;padding-bottom:.78571429em}.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child+input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child+input:focus{border-left-color:#85b7d9}.ui[class*=\"right labeled\"].input>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui[class*=\"right labeled\"].input>input+.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*=\"right labeled\"].input>input:focus{border-right-color:#85b7d9!important}.ui.labeled.input .corner.label{top:1px;right:1px;font-size:.64285714em;border-radius:0 .28571429rem 0 0}.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).labeled.input>input{padding-right:2.5em!important}.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"])>input{padding-right:3.25em!important}.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"])>.icon{margin-right:1.25em}.ui[class*=\"left corner labeled\"].labeled.input>input{padding-left:2.5em!important}.ui[class*=\"left corner labeled\"].icon.input>input{padding-left:3.25em!important}.ui[class*=\"left corner labeled\"].icon.input>.icon{margin-left:1.25em}.ui.input>.ui.corner.label{top:1px;right:1px}.ui.input>.ui.left.corner.label{right:auto;left:1px}.ui.action.input>.button,.ui.action.input>.buttons{display:flex;align-items:center;flex:0 0 auto}.ui.action.input>.button,.ui.action.input>.buttons>.button{padding-top:.78571429em;padding-bottom:.78571429em;margin:0}.ui.action.input:not([class*=\"left action\"])>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui.action.input:not([class*=\"left action\"])>.button:not(:first-child),.ui.action.input:not([class*=\"left action\"])>.buttons:not(:first-child)>.button,.ui.action.input:not([class*=\"left action\"])>.dropdown:not(:first-child){border-radius:0}.ui.action.input:not([class*=\"left action\"])>.button:last-child,.ui.action.input:not([class*=\"left action\"])>.buttons:last-child>.button,.ui.action.input:not([class*=\"left action\"])>.dropdown:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.action.input:not([class*=\"left action\"])>input:focus{border-right-color:#85b7d9!important}.ui[class*=\"left action\"].input>input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-left-color:transparent!important}.ui[class*=\"left action\"].input>.button,.ui[class*=\"left action\"].input>.buttons>.button,.ui[class*=\"left action\"].input>.dropdown{border-radius:0}.ui[class*=\"left action\"].input>.button:first-child,.ui[class*=\"left action\"].input>.buttons:first-child>.button,.ui[class*=\"left action\"].input>.dropdown:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"left action\"].input>input:focus{border-left-color:#85b7d9!important}.ui.inverted.input>input{border:none}.ui.fluid.input{display:flex}.ui.fluid.input>input{width:0!important}.ui.mini.input{font-size:.78571429em}.ui.small.input{font-size:.92857143em}.ui.input{font-size:1em}.ui.large.input{font-size:1.14285714em}.ui.big.input{font-size:1.28571429em}.ui.huge.input{font-size:1.42857143em}.ui.massive.input{font-size:1.71428571em}/*!\n * # Semantic UI 2.4.0 - Label\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.label{display:inline-block;line-height:1;vertical-align:baseline;margin:0 .14285714em;background-color:#e8e8e8;background-image:none;padding:.5833em .833em;color:rgba(0,0,0,.6);text-transform:none;font-weight:700;border:0 solid transparent;border-radius:.28571429rem;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label:first-child{margin-left:0}.ui.label:last-child{margin-right:0}a.ui.label{cursor:pointer}.ui.label>a{cursor:pointer;color:inherit;opacity:.5;-webkit-transition:.1s opacity ease;transition:.1s opacity ease}.ui.label>a:hover{opacity:1}.ui.label>img{width:auto!important;vertical-align:middle;height:2.1666em!important}.ui.label>.icon{width:auto;margin:0 .75em 0 0}.ui.label>.detail{display:inline-block;vertical-align:top;font-weight:700;margin-left:1em;opacity:.8}.ui.label>.detail .icon{margin:0 .25em 0 0}.ui.label>.close.icon,.ui.label>.delete.icon{cursor:pointer;margin-right:0;margin-left:.5em;font-size:.92857143em;opacity:.5;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label>.delete.icon:hover{opacity:1}.ui.labels>.label{margin:0 .5em .5em 0}.ui.header>.ui.label{margin-top:-.29165em}.ui.attached.segment>.ui.top.left.attached.label,.ui.bottom.attached.segment>.ui.top.left.attached.label{border-top-left-radius:0}.ui.attached.segment>.ui.top.right.attached.label,.ui.bottom.attached.segment>.ui.top.right.attached.label{border-top-right-radius:0}.ui.top.attached.segment>.ui.bottom.left.attached.label{border-bottom-left-radius:0}.ui.top.attached.segment>.ui.bottom.right.attached.label{border-bottom-right-radius:0}.ui.top.attached.label+[class*=\"right floated\"]+*,.ui.top.attached.label:first-child+:not(.attached){margin-top:2rem!important}.ui.bottom.attached.label:first-child~:last-child:not(.attached){margin-top:0;margin-bottom:2rem!important}.ui.image.label{width:auto!important;margin-top:0;margin-bottom:0;max-width:9999px;vertical-align:baseline;text-transform:none;background:#e8e8e8;padding:.5833em .833em .5833em .5em;border-radius:.28571429rem;-webkit-box-shadow:none;box-shadow:none}.ui.image.label img{display:inline-block;vertical-align:top;height:2.1666em;margin:-.5833em .5em -.5833em -.5em;border-radius:.28571429rem 0 0 .28571429rem}.ui.image.label .detail{background:rgba(0,0,0,.1);margin:-.5833em -.833em -.5833em .5em;padding:.5833em .833em;border-radius:0 .28571429rem .28571429rem 0}.ui.tag.label,.ui.tag.labels .label{margin-left:1em;position:relative;padding-left:1.5em;padding-right:1.5em;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:none;transition:none}.ui.tag.label:before,.ui.tag.labels .label:before{position:absolute;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg);top:50%;right:100%;content:'';background-color:inherit;background-image:none;width:1.56em;height:1.56em;-webkit-transition:none;transition:none}.ui.tag.label:after,.ui.tag.labels .label:after{position:absolute;content:'';top:50%;left:-.25em;margin-top:-.25em;background-color:#fff!important;width:.5em;height:.5em;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);border-radius:500rem}.ui.corner.label{position:absolute;top:0;right:0;margin:0;padding:0;text-align:center;border-color:#e8e8e8;width:4em;height:4em;z-index:1;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label{background-color:transparent!important}.ui.corner.label:after{position:absolute;content:\"\";right:0;top:0;z-index:-1;width:0;height:0;background-color:transparent!important;border-top:0 solid transparent;border-right:4em solid transparent;border-bottom:4em solid transparent;border-left:0 solid transparent;border-right-color:inherit;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label .icon{cursor:default;position:relative;top:.64285714em;left:.78571429em;font-size:1.14285714em;margin:0}.ui.left.corner.label,.ui.left.corner.label:after{right:auto;left:0}.ui.left.corner.label:after{border-top:4em solid transparent;border-right:4em solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent;border-top-color:inherit}.ui.left.corner.label .icon{left:-.78571429em}.ui.segment>.ui.corner.label{top:-1px;right:-1px}.ui.segment>.ui.left.corner.label{right:auto;left:-1px}.ui.ribbon.label{position:relative;margin:0;min-width:-webkit-max-content;min-width:max-content;border-radius:0 .28571429rem .28571429rem 0;border-color:rgba(0,0,0,.15)}.ui.ribbon.label:after{position:absolute;content:'';top:100%;left:0;background-color:transparent!important;border-style:solid;border-width:0 1.2em 1.2em 0;border-color:transparent;border-right-color:inherit;width:0;height:0}.ui.ribbon.label{left:calc(-1rem - 1.2em);margin-right:-1.2em;padding-left:calc(1rem + 1.2em);padding-right:1.2em}.ui[class*=\"right ribbon\"].label{left:calc(100% + 1rem + 1.2em);padding-left:1.2em;padding-right:calc(1rem + 1.2em)}.ui[class*=\"right ribbon\"].label{text-align:left;-webkit-transform:translateX(-100%);transform:translateX(-100%);border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"right ribbon\"].label:after{left:auto;right:0;border-style:solid;border-width:1.2em 1.2em 0 0;border-color:transparent;border-top-color:inherit}.ui.card .image>.ribbon.label,.ui.image>.ribbon.label{position:absolute;top:1rem}.ui.card .image>.ui.ribbon.label,.ui.image>.ui.ribbon.label{left:calc(.05rem - 1.2em)}.ui.card .image>.ui[class*=\"right ribbon\"].label,.ui.image>.ui[class*=\"right ribbon\"].label{left:calc(100% + -.05rem + 1.2em);padding-left:.833em}.ui.table td>.ui.ribbon.label{left:calc(-.78571429em - 1.2em)}.ui.table td>.ui[class*=\"right ribbon\"].label{left:calc(100% + .78571429em + 1.2em);padding-left:.833em}.ui.attached.label,.ui[class*=\"top attached\"].label{width:100%;position:absolute;margin:0;top:0;left:0;padding:.75em 1em;border-radius:.21428571rem .21428571rem 0 0}.ui[class*=\"bottom attached\"].label{top:auto;bottom:0;border-radius:0 0 .21428571rem .21428571rem}.ui[class*=\"top left attached\"].label{width:auto;margin-top:0!important;border-radius:.21428571rem 0 .28571429rem 0}.ui[class*=\"top right attached\"].label{width:auto;left:auto;right:0;border-radius:0 .21428571rem 0 .28571429rem}.ui[class*=\"bottom left attached\"].label{width:auto;top:auto;bottom:0;border-radius:0 .28571429rem 0 .21428571rem}.ui[class*=\"bottom right attached\"].label{top:auto;bottom:0;left:auto;right:0;width:auto;border-radius:.28571429rem 0 .21428571rem 0}.ui.label.disabled{opacity:.5}a.ui.label:hover,a.ui.labels .label:hover{background-color:#e0e0e0;border-color:#e0e0e0;background-image:none;color:rgba(0,0,0,.8)}.ui.labels a.label:hover:before,a.ui.label:hover:before{color:rgba(0,0,0,.8)}.ui.active.label{background-color:#d0d0d0;border-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}.ui.active.label:before{background-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}a.ui.active.label:hover,a.ui.labels .active.label:hover{background-color:#c8c8c8;border-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:ActiveHover:before,a.ui.active.label:ActiveHover:before{background-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.label.visible:not(.dropdown),.ui.labels.visible .label{display:inline-block!important}.ui.label.hidden,.ui.labels.hidden .label{display:none!important}.ui.red.label,.ui.red.labels .label{background-color:#db2828!important;border-color:#db2828!important;color:#fff!important}.ui.red.labels .label:hover,a.ui.red.label:hover{background-color:#d01919!important;border-color:#d01919!important;color:#fff!important}.ui.red.corner.label,.ui.red.corner.label:hover{background-color:transparent!important}.ui.red.ribbon.label{border-color:#b21e1e!important}.ui.basic.red.label{background:none #fff!important;color:#db2828!important;border-color:#db2828!important}.ui.basic.red.labels a.label:hover,a.ui.basic.red.label:hover{background-color:#fff!important;color:#d01919!important;border-color:#d01919!important}.ui.orange.label,.ui.orange.labels .label{background-color:#f2711c!important;border-color:#f2711c!important;color:#fff!important}.ui.orange.labels .label:hover,a.ui.orange.label:hover{background-color:#f26202!important;border-color:#f26202!important;color:#fff!important}.ui.orange.corner.label,.ui.orange.corner.label:hover{background-color:transparent!important}.ui.orange.ribbon.label{border-color:#cf590c!important}.ui.basic.orange.label{background:none #fff!important;color:#f2711c!important;border-color:#f2711c!important}.ui.basic.orange.labels a.label:hover,a.ui.basic.orange.label:hover{background-color:#fff!important;color:#f26202!important;border-color:#f26202!important}.ui.yellow.label,.ui.yellow.labels .label{background-color:#fbbd08!important;border-color:#fbbd08!important;color:#fff!important}.ui.yellow.labels .label:hover,a.ui.yellow.label:hover{background-color:#eaae00!important;border-color:#eaae00!important;color:#fff!important}.ui.yellow.corner.label,.ui.yellow.corner.label:hover{background-color:transparent!important}.ui.yellow.ribbon.label{border-color:#cd9903!important}.ui.basic.yellow.label{background:none #fff!important;color:#fbbd08!important;border-color:#fbbd08!important}.ui.basic.yellow.labels a.label:hover,a.ui.basic.yellow.label:hover{background-color:#fff!important;color:#eaae00!important;border-color:#eaae00!important}.ui.olive.label,.ui.olive.labels .label{background-color:#b5cc18!important;border-color:#b5cc18!important;color:#fff!important}.ui.olive.labels .label:hover,a.ui.olive.label:hover{background-color:#a7bd0d!important;border-color:#a7bd0d!important;color:#fff!important}.ui.olive.corner.label,.ui.olive.corner.label:hover{background-color:transparent!important}.ui.olive.ribbon.label{border-color:#198f35!important}.ui.basic.olive.label{background:none #fff!important;color:#b5cc18!important;border-color:#b5cc18!important}.ui.basic.olive.labels a.label:hover,a.ui.basic.olive.label:hover{background-color:#fff!important;color:#a7bd0d!important;border-color:#a7bd0d!important}.ui.green.label,.ui.green.labels .label{background-color:#21ba45!important;border-color:#21ba45!important;color:#fff!important}.ui.green.labels .label:hover,a.ui.green.label:hover{background-color:#16ab39!important;border-color:#16ab39!important;color:#fff!important}.ui.green.corner.label,.ui.green.corner.label:hover{background-color:transparent!important}.ui.green.ribbon.label{border-color:#198f35!important}.ui.basic.green.label{background:none #fff!important;color:#21ba45!important;border-color:#21ba45!important}.ui.basic.green.labels a.label:hover,a.ui.basic.green.label:hover{background-color:#fff!important;color:#16ab39!important;border-color:#16ab39!important}.ui.teal.label,.ui.teal.labels .label{background-color:#00b5ad!important;border-color:#00b5ad!important;color:#fff!important}.ui.teal.labels .label:hover,a.ui.teal.label:hover{background-color:#009c95!important;border-color:#009c95!important;color:#fff!important}.ui.teal.corner.label,.ui.teal.corner.label:hover{background-color:transparent!important}.ui.teal.ribbon.label{border-color:#00827c!important}.ui.basic.teal.label{background:none #fff!important;color:#00b5ad!important;border-color:#00b5ad!important}.ui.basic.teal.labels a.label:hover,a.ui.basic.teal.label:hover{background-color:#fff!important;color:#009c95!important;border-color:#009c95!important}.ui.blue.label,.ui.blue.labels .label{background-color:#2185d0!important;border-color:#2185d0!important;color:#fff!important}.ui.blue.labels .label:hover,a.ui.blue.label:hover{background-color:#1678c2!important;border-color:#1678c2!important;color:#fff!important}.ui.blue.corner.label,.ui.blue.corner.label:hover{background-color:transparent!important}.ui.blue.ribbon.label{border-color:#1a69a4!important}.ui.basic.blue.label{background:none #fff!important;color:#2185d0!important;border-color:#2185d0!important}.ui.basic.blue.labels a.label:hover,a.ui.basic.blue.label:hover{background-color:#fff!important;color:#1678c2!important;border-color:#1678c2!important}.ui.violet.label,.ui.violet.labels .label{background-color:#6435c9!important;border-color:#6435c9!important;color:#fff!important}.ui.violet.labels .label:hover,a.ui.violet.label:hover{background-color:#5829bb!important;border-color:#5829bb!important;color:#fff!important}.ui.violet.corner.label,.ui.violet.corner.label:hover{background-color:transparent!important}.ui.violet.ribbon.label{border-color:#502aa1!important}.ui.basic.violet.label{background:none #fff!important;color:#6435c9!important;border-color:#6435c9!important}.ui.basic.violet.labels a.label:hover,a.ui.basic.violet.label:hover{background-color:#fff!important;color:#5829bb!important;border-color:#5829bb!important}.ui.purple.label,.ui.purple.labels .label{background-color:#a333c8!important;border-color:#a333c8!important;color:#fff!important}.ui.purple.labels .label:hover,a.ui.purple.label:hover{background-color:#9627ba!important;border-color:#9627ba!important;color:#fff!important}.ui.purple.corner.label,.ui.purple.corner.label:hover{background-color:transparent!important}.ui.purple.ribbon.label{border-color:#82299f!important}.ui.basic.purple.label{background:none #fff!important;color:#a333c8!important;border-color:#a333c8!important}.ui.basic.purple.labels a.label:hover,a.ui.basic.purple.label:hover{background-color:#fff!important;color:#9627ba!important;border-color:#9627ba!important}.ui.pink.label,.ui.pink.labels .label{background-color:#e03997!important;border-color:#e03997!important;color:#fff!important}.ui.pink.labels .label:hover,a.ui.pink.label:hover{background-color:#e61a8d!important;border-color:#e61a8d!important;color:#fff!important}.ui.pink.corner.label,.ui.pink.corner.label:hover{background-color:transparent!important}.ui.pink.ribbon.label{border-color:#c71f7e!important}.ui.basic.pink.label{background:none #fff!important;color:#e03997!important;border-color:#e03997!important}.ui.basic.pink.labels a.label:hover,a.ui.basic.pink.label:hover{background-color:#fff!important;color:#e61a8d!important;border-color:#e61a8d!important}.ui.brown.label,.ui.brown.labels .label{background-color:#a5673f!important;border-color:#a5673f!important;color:#fff!important}.ui.brown.labels .label:hover,a.ui.brown.label:hover{background-color:#975b33!important;border-color:#975b33!important;color:#fff!important}.ui.brown.corner.label,.ui.brown.corner.label:hover{background-color:transparent!important}.ui.brown.ribbon.label{border-color:#805031!important}.ui.basic.brown.label{background:none #fff!important;color:#a5673f!important;border-color:#a5673f!important}.ui.basic.brown.labels a.label:hover,a.ui.basic.brown.label:hover{background-color:#fff!important;color:#975b33!important;border-color:#975b33!important}.ui.grey.label,.ui.grey.labels .label{background-color:#767676!important;border-color:#767676!important;color:#fff!important}.ui.grey.labels .label:hover,a.ui.grey.label:hover{background-color:#838383!important;border-color:#838383!important;color:#fff!important}.ui.grey.corner.label,.ui.grey.corner.label:hover{background-color:transparent!important}.ui.grey.ribbon.label{border-color:#805031!important}.ui.basic.grey.label{background:none #fff!important;color:#767676!important;border-color:#767676!important}.ui.basic.grey.labels a.label:hover,a.ui.basic.grey.label:hover{background-color:#fff!important;color:#838383!important;border-color:#838383!important}.ui.black.label,.ui.black.labels .label{background-color:#1b1c1d!important;border-color:#1b1c1d!important;color:#fff!important}.ui.black.labels .label:hover,a.ui.black.label:hover{background-color:#27292a!important;border-color:#27292a!important;color:#fff!important}.ui.black.corner.label,.ui.black.corner.label:hover{background-color:transparent!important}.ui.black.ribbon.label{border-color:#805031!important}.ui.basic.black.label{background:none #fff!important;color:#1b1c1d!important;border-color:#1b1c1d!important}.ui.basic.black.labels a.label:hover,a.ui.basic.black.label:hover{background-color:#fff!important;color:#27292a!important;border-color:#27292a!important}.ui.basic.label{background:none #fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}a.ui.basic.label:hover{text-decoration:none;background:none #fff;color:#1e70bf;-webkit-box-shadow:1px solid rgba(34,36,38,.15);box-shadow:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.pointing.label:before{border-color:inherit}.ui.fluid.labels>.label,.ui.label.fluid{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ui.inverted.label,.ui.inverted.labels .label{color:rgba(255,255,255,.9)!important}.ui.horizontal.label,.ui.horizontal.labels .label{margin:0 .5em 0 0;padding:.4em .833em;min-width:3em;text-align:center}.ui.circular.label,.ui.circular.labels .label{min-width:2em;min-height:2em;padding:.5em!important;line-height:1em;text-align:center;border-radius:500rem}.ui.empty.circular.label,.ui.empty.circular.labels .label{min-width:0;min-height:0;overflow:hidden;width:.5em;height:.5em;vertical-align:baseline}.ui.pointing.label{position:relative}.ui.attached.pointing.label{position:absolute}.ui.pointing.label:before{background-color:inherit;background-image:inherit;border-width:none;border-style:solid;border-color:inherit}.ui.pointing.label:before{position:absolute;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg);background-image:none;z-index:2;width:.6666em;height:.6666em;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.pointing.label,.ui[class*=\"pointing above\"].label{margin-top:1em}.ui.pointing.label:before,.ui[class*=\"pointing above\"].label:before{border-width:1px 0 0 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:0;left:50%}.ui[class*=\"bottom pointing\"].label,.ui[class*=\"pointing below\"].label{margin-top:0;margin-bottom:1em}.ui[class*=\"bottom pointing\"].label:before,.ui[class*=\"pointing below\"].label:before{border-width:0 1px 1px 0;top:auto;right:auto;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:100%;left:50%}.ui[class*=\"left pointing\"].label{margin-top:0;margin-left:.6666em}.ui[class*=\"left pointing\"].label:before{border-width:0 0 1px 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);bottom:auto;right:auto;top:50%;left:0}.ui[class*=\"right pointing\"].label{margin-top:0;margin-right:.6666em}.ui[class*=\"right pointing\"].label:before{border-width:1px 1px 0 0;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);top:50%;right:0;bottom:auto;left:auto}.ui.basic.pointing.label:before,.ui.basic[class*=\"pointing above\"].label:before{margin-top:-1px}.ui.basic[class*=\"bottom pointing\"].label:before,.ui.basic[class*=\"pointing below\"].label:before{bottom:auto;top:100%;margin-top:1px}.ui.basic[class*=\"left pointing\"].label:before{top:50%;left:-1px}.ui.basic[class*=\"right pointing\"].label:before{top:50%;right:-1px}.ui.floating.label{position:absolute;z-index:100;top:-1em;left:100%;margin:0 0 0 -1.5em!important}.ui.mini.label,.ui.mini.labels .label{font-size:.64285714rem}.ui.tiny.label,.ui.tiny.labels .label{font-size:.71428571rem}.ui.small.label,.ui.small.labels .label{font-size:.78571429rem}.ui.label,.ui.labels .label{font-size:.85714286rem}.ui.large.label,.ui.large.labels .label{font-size:1rem}.ui.big.label,.ui.big.labels .label{font-size:1.28571429rem}.ui.huge.label,.ui.huge.labels .label{font-size:1.42857143rem}.ui.massive.label,.ui.massive.labels .label{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - List\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.list,ol.ui.list,ul.ui.list{list-style-type:none;margin:1em 0;padding:0 0}.ui.list:first-child,ol.ui.list:first-child,ul.ui.list:first-child{margin-top:0;padding-top:0}.ui.list:last-child,ol.ui.list:last-child,ul.ui.list:last-child{margin-bottom:0;padding-bottom:0}.ui.list .list>.item,.ui.list>.item,ol.ui.list li,ul.ui.list li{display:list-item;table-layout:fixed;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.list>.item:after,.ui.list>.list>.item,ol.ui.list>li:first-child:after,ul.ui.list>li:first-child:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.list .list>.item:first-child,.ui.list>.item:first-child,ol.ui.list li:first-child,ul.ui.list li:first-child{padding-top:0}.ui.list .list>.item:last-child,.ui.list>.item:last-child,ol.ui.list li:last-child,ul.ui.list li:last-child{padding-bottom:0}.ui.list .list,ol.ui.list ol,ul.ui.list ul{clear:both;margin:0;padding:.75em 0 .25em .5em}.ui.list .list>.item,ol.ui.list ol li,ul.ui.list ul li{padding:.14285714em 0;line-height:inherit}.ui.list .list>.item>i.icon,.ui.list>.item>i.icon{display:table-cell;margin:0;padding-top:0;padding-right:.28571429em;vertical-align:top;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.list .list>.item>i.icon:only-child,.ui.list>.item>i.icon:only-child{display:inline-block;vertical-align:top}.ui.list .list>.item>.image,.ui.list>.item>.image{display:table-cell;background-color:transparent;margin:0;vertical-align:top}.ui.list .list>.item>.image:not(:only-child):not(img),.ui.list>.item>.image:not(:only-child):not(img){padding-right:.5em}.ui.list .list>.item>.image img,.ui.list>.item>.image img{vertical-align:top}.ui.list .list>.item>.image:only-child,.ui.list .list>.item>img.image,.ui.list>.item>.image:only-child,.ui.list>.item>img.image{display:inline-block}.ui.list .list>.item>.content,.ui.list>.item>.content{line-height:1.14285714em}.ui.list .list>.item>.icon+.content,.ui.list .list>.item>.image+.content,.ui.list>.item>.icon+.content,.ui.list>.item>.image+.content{display:table-cell;width:100%;padding:0 0 0 .5em;vertical-align:top}.ui.list .list>.item>img.image+.content,.ui.list>.item>img.image+.content{display:inline-block;width:auto}.ui.list .list>.item>.content>.list,.ui.list>.item>.content>.list{margin-left:0;padding-left:0}.ui.list .list>.item .header,.ui.list>.item .header{display:block;margin:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.87)}.ui.list .list>.item .description,.ui.list>.item .description{display:block;color:rgba(0,0,0,.7)}.ui.list .list>.item a,.ui.list>.item a{cursor:pointer}.ui.list .list>a.item,.ui.list>a.item{cursor:pointer;color:#4183c4}.ui.list .list>a.item:hover,.ui.list>a.item:hover{color:#1e70bf}.ui.list .list>a.item i.icon,.ui.list>a.item i.icon{color:rgba(0,0,0,.4)}.ui.list .list>.item a.header,.ui.list>.item a.header{cursor:pointer;color:#4183c4!important}.ui.list .list>.item a.header:hover,.ui.list>.item a.header:hover{color:#1e70bf!important}.ui[class*=\"left floated\"].list{float:left}.ui[class*=\"right floated\"].list{float:right}.ui.list .list>.item [class*=\"left floated\"],.ui.list>.item [class*=\"left floated\"]{float:left;margin:0 1em 0 0}.ui.list .list>.item [class*=\"right floated\"],.ui.list>.item [class*=\"right floated\"]{float:right;margin:0 0 0 1em}.ui.menu .ui.list .list>.item,.ui.menu .ui.list>.item{display:list-item;table-layout:fixed;background-color:transparent;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.menu .ui.list .list>.item:before,.ui.menu .ui.list>.item:before{border:none;background:0 0}.ui.menu .ui.list .list>.item:first-child,.ui.menu .ui.list>.item:first-child{padding-top:0}.ui.menu .ui.list .list>.item:last-child,.ui.menu .ui.list>.item:last-child{padding-bottom:0}.ui.horizontal.list{display:inline-block;font-size:0}.ui.horizontal.list>.item{display:inline-block;margin-left:1em;font-size:1rem}.ui.horizontal.list:not(.celled)>.item:first-child{margin-left:0!important;padding-left:0!important}.ui.horizontal.list .list{padding-left:0;padding-bottom:0}.ui.horizontal.list .list>.item>.content,.ui.horizontal.list .list>.item>.icon,.ui.horizontal.list .list>.item>.image,.ui.horizontal.list>.item>.content,.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.image{vertical-align:middle}.ui.horizontal.list>.item:first-child,.ui.horizontal.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.horizontal.list>.item>i.icon{margin:0;padding:0 .25em 0 0}.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.icon+.content{float:none;display:inline-block}.ui.list .list>.disabled.item,.ui.list>.disabled.item{pointer-events:none;color:rgba(40,40,40,.3)!important}.ui.inverted.list .list>.disabled.item,.ui.inverted.list>.disabled.item{color:rgba(225,225,225,.3)!important}.ui.list .list>a.item:hover .icon,.ui.list>a.item:hover .icon{color:rgba(0,0,0,.87)}.ui.inverted.list .list>a.item>.icon,.ui.inverted.list>a.item>.icon{color:rgba(255,255,255,.7)}.ui.inverted.list .list>.item .header,.ui.inverted.list>.item .header{color:rgba(255,255,255,.9)}.ui.inverted.list .list>.item .description,.ui.inverted.list>.item .description{color:rgba(255,255,255,.7)}.ui.inverted.list .list>a.item,.ui.inverted.list>a.item{cursor:pointer;color:rgba(255,255,255,.9)}.ui.inverted.list .list>a.item:hover,.ui.inverted.list>a.item:hover{color:#1e70bf}.ui.inverted.list .item a:not(.ui){color:rgba(255,255,255,.9)!important}.ui.inverted.list .item a:not(.ui):hover{color:#1e70bf!important}.ui.list [class*=\"top aligned\"],.ui.list[class*=\"top aligned\"] .content,.ui.list[class*=\"top aligned\"] .image{vertical-align:top!important}.ui.list [class*=\"middle aligned\"],.ui.list[class*=\"middle aligned\"] .content,.ui.list[class*=\"middle aligned\"] .image{vertical-align:middle!important}.ui.list [class*=\"bottom aligned\"],.ui.list[class*=\"bottom aligned\"] .content,.ui.list[class*=\"bottom aligned\"] .image{vertical-align:bottom!important}.ui.link.list .item,.ui.link.list .item a:not(.ui),.ui.link.list a.item{color:rgba(0,0,0,.4);-webkit-transition:.1s color ease;transition:.1s color ease}.ui.link.list.list .item a:not(.ui):hover,.ui.link.list.list a.item:hover{color:rgba(0,0,0,.8)}.ui.link.list.list .item a:not(.ui):active,.ui.link.list.list a.item:active{color:rgba(0,0,0,.9)}.ui.link.list.list .active.item,.ui.link.list.list .active.item a:not(.ui){color:rgba(0,0,0,.95)}.ui.inverted.link.list .item,.ui.inverted.link.list .item a:not(.ui),.ui.inverted.link.list a.item{color:rgba(255,255,255,.5)}.ui.inverted.link.list.list .item a:not(.ui):hover,.ui.inverted.link.list.list a.item:hover{color:#fff}.ui.inverted.link.list.list .item a:not(.ui):active,.ui.inverted.link.list.list a.item:active{color:#fff}.ui.inverted.link.list.list .active.item a:not(.ui),.ui.inverted.link.list.list a.active.item{color:#fff}.ui.selection.list .list>.item,.ui.selection.list>.item{cursor:pointer;background:0 0;padding:.5em .5em;margin:0;color:rgba(0,0,0,.4);border-radius:.5em;-webkit-transition:.1s color ease,.1s padding-left ease,.1s background-color ease;transition:.1s color ease,.1s padding-left ease,.1s background-color ease}.ui.selection.list .list>.item:last-child,.ui.selection.list>.item:last-child{margin-bottom:0}.ui.selection.list.list>.item:hover,.ui.selection.list>.item:hover{background:rgba(0,0,0,.03);color:rgba(0,0,0,.8)}.ui.selection.list .list>.item:active,.ui.selection.list>.item:active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.9)}.ui.selection.list .list>.item.active,.ui.selection.list>.item.active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.selection.list>.item{background:0 0;color:rgba(255,255,255,.5)}.ui.inverted.selection.list>.item:hover{background:rgba(255,255,255,.02);color:#fff}.ui.inverted.selection.list>.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.selection.list>.item.active{background:rgba(255,255,255,.08);color:#fff}.ui.celled.selection.list .list>.item,.ui.celled.selection.list>.item,.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{border-radius:0}.ui.animated.list>.item{-webkit-transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s;transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s}.ui.animated.list:not(.horizontal)>.item:hover{padding-left:1em}.ui.fitted.list:not(.selection) .list>.item,.ui.fitted.list:not(.selection)>.item{padding-left:0;padding-right:0}.ui.fitted.selection.list .list>.item,.ui.fitted.selection.list>.item{margin-left:-.5em;margin-right:-.5em}.ui.bulleted.list,ul.ui.list{margin-left:1.25rem}.ui.bulleted.list .list>.item,.ui.bulleted.list>.item,ul.ui.list li{position:relative}.ui.bulleted.list .list>.item:before,.ui.bulleted.list>.item:before,ul.ui.list li:before{-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;position:absolute;top:auto;left:auto;font-weight:400;margin-left:-1.25rem;content:'•';opacity:1;color:inherit;vertical-align:top}.ui.bulleted.list .list>a.item:before,.ui.bulleted.list>a.item:before,ul.ui.list li:before{color:rgba(0,0,0,.87)}.ui.bulleted.list .list,ul.ui.list ul{padding-left:1.25rem}.ui.horizontal.bulleted.list,ul.ui.horizontal.bulleted.list{margin-left:0}.ui.horizontal.bulleted.list>.item,ul.ui.horizontal.bulleted.list li{margin-left:1.75rem}.ui.horizontal.bulleted.list>.item:first-child,ul.ui.horizontal.bulleted.list li:first-child{margin-left:0}.ui.horizontal.bulleted.list>.item::before,ul.ui.horizontal.bulleted.list li::before{color:rgba(0,0,0,.87)}.ui.horizontal.bulleted.list>.item:first-child::before,ul.ui.horizontal.bulleted.list li:first-child::before{display:none}.ui.ordered.list,.ui.ordered.list .list,ol.ui.list,ol.ui.list ol{counter-reset:ordered;margin-left:1.25rem;list-style-type:none}.ui.ordered.list .list>.item,.ui.ordered.list>.item,ol.ui.list li{list-style-type:none;position:relative}.ui.ordered.list .list>.item:before,.ui.ordered.list>.item:before,ol.ui.list li:before{position:absolute;top:auto;left:auto;-webkit-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;margin-left:-1.25rem;counter-increment:ordered;content:counters(ordered, \".\") \" \";text-align:right;color:rgba(0,0,0,.87);vertical-align:middle;opacity:.8}.ui.ordered.inverted.list .list>.item:before,.ui.ordered.inverted.list>.item:before,ol.ui.inverted.list li:before{color:rgba(255,255,255,.7)}.ui.ordered.list>.item[data-value],.ui.ordered.list>.list>.item[data-value]{content:attr(data-value)}ol.ui.list li[value]:before{content:attr(value)}.ui.ordered.list .list,ol.ui.list ol{margin-left:1em}.ui.ordered.list .list>.item:before,ol.ui.list ol li:before{margin-left:-2em}.ui.ordered.horizontal.list,ol.ui.horizontal.list{margin-left:0}.ui.ordered.horizontal.list .list>.item:before,.ui.ordered.horizontal.list>.item:before,ol.ui.horizontal.list li:before{position:static;margin:0 .5em 0 0}.ui.divided.list>.item{border-top:1px solid rgba(34,36,38,.15)}.ui.divided.list .list>.item{border-top:none}.ui.divided.list .item .list>.item{border-top:none}.ui.divided.list .list>.item:first-child,.ui.divided.list>.item:first-child{border-top:none}.ui.divided.list:not(.horizontal) .list>.item:first-child{border-top-width:1px}.ui.divided.bulleted.list .list,.ui.divided.bulleted.list:not(.horizontal){margin-left:0;padding-left:0}.ui.divided.bulleted.list>.item:not(.horizontal){padding-left:1.25rem}.ui.divided.ordered.list{margin-left:0}.ui.divided.ordered.list .list>.item,.ui.divided.ordered.list>.item{padding-left:1.25rem}.ui.divided.ordered.list .item .list{margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.divided.ordered.list .item .list>.item{padding-left:1em}.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{margin:0;border-radius:0}.ui.divided.horizontal.list{margin-left:0}.ui.divided.horizontal.list>.item:not(:first-child){padding-left:.5em}.ui.divided.horizontal.list>.item:not(:last-child){padding-right:.5em}.ui.divided.horizontal.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;line-height:.6}.ui.horizontal.divided.list>.item:first-child{border-left:none}.ui.divided.inverted.horizontal.list>.item,.ui.divided.inverted.list>.item,.ui.divided.inverted.list>.list{border-color:rgba(255,255,255,.1)}.ui.celled.list>.item,.ui.celled.list>.list{border-top:1px solid rgba(34,36,38,.15);padding-left:.5em;padding-right:.5em}.ui.celled.list>.item:last-child{border-bottom:1px solid rgba(34,36,38,.15)}.ui.celled.list>.item:first-child,.ui.celled.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.celled.list .item .list>.item{border-width:0}.ui.celled.list .list>.item:first-child{border-top-width:0}.ui.celled.bulleted.list{margin-left:0}.ui.celled.bulleted.list .list>.item,.ui.celled.bulleted.list>.item{padding-left:1.25rem}.ui.celled.bulleted.list .item .list{margin-left:-1.25rem;margin-right:-1.25rem;padding-bottom:.21428571em}.ui.celled.ordered.list{margin-left:0}.ui.celled.ordered.list .list>.item,.ui.celled.ordered.list>.item{padding-left:1.25rem}.ui.celled.ordered.list .item .list{margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.celled.ordered.list .list>.item{padding-left:1em}.ui.horizontal.celled.list{margin-left:0}.ui.horizontal.celled.list .list>.item,.ui.horizontal.celled.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;padding-left:.5em;padding-right:.5em;line-height:.6}.ui.horizontal.celled.list .list>.item:last-child,.ui.horizontal.celled.list>.item:last-child{border-bottom:none;border-right:1px solid rgba(34,36,38,.15)}.ui.celled.inverted.list>.item,.ui.celled.inverted.list>.list{border-color:1px solid rgba(255,255,255,.1)}.ui.celled.inverted.horizontal.list .list>.item,.ui.celled.inverted.horizontal.list>.item{border-color:1px solid rgba(255,255,255,.1)}.ui.relaxed.list:not(.horizontal)>.item:not(:first-child){padding-top:.42857143em}.ui.relaxed.list:not(.horizontal)>.item:not(:last-child){padding-bottom:.42857143em}.ui.horizontal.relaxed.list .list>.item:not(:first-child),.ui.horizontal.relaxed.list>.item:not(:first-child){padding-left:1rem}.ui.horizontal.relaxed.list .list>.item:not(:last-child),.ui.horizontal.relaxed.list>.item:not(:last-child){padding-right:1rem}.ui[class*=\"very relaxed\"].list:not(.horizontal)>.item:not(:first-child){padding-top:.85714286em}.ui[class*=\"very relaxed\"].list:not(.horizontal)>.item:not(:last-child){padding-bottom:.85714286em}.ui.horizontal[class*=\"very relaxed\"].list .list>.item:not(:first-child),.ui.horizontal[class*=\"very relaxed\"].list>.item:not(:first-child){padding-left:1.5rem}.ui.horizontal[class*=\"very relaxed\"].list .list>.item:not(:last-child),.ui.horizontal[class*=\"very relaxed\"].list>.item:not(:last-child){padding-right:1.5rem}.ui.mini.list{font-size:.78571429em}.ui.tiny.list{font-size:.85714286em}.ui.small.list{font-size:.92857143em}.ui.list{font-size:1em}.ui.large.list{font-size:1.14285714em}.ui.big.list{font-size:1.28571429em}.ui.huge.list{font-size:1.42857143em}.ui.massive.list{font-size:1.71428571em}.ui.mini.horizontal.list .list>.item,.ui.mini.horizontal.list>.item{font-size:.78571429rem}.ui.tiny.horizontal.list .list>.item,.ui.tiny.horizontal.list>.item{font-size:.85714286rem}.ui.small.horizontal.list .list>.item,.ui.small.horizontal.list>.item{font-size:.92857143rem}.ui.horizontal.list .list>.item,.ui.horizontal.list>.item{font-size:1rem}.ui.large.horizontal.list .list>.item,.ui.large.horizontal.list>.item{font-size:1.14285714rem}.ui.big.horizontal.list .list>.item,.ui.big.horizontal.list>.item{font-size:1.28571429rem}.ui.huge.horizontal.list .list>.item,.ui.huge.horizontal.list>.item{font-size:1.42857143rem}.ui.massive.horizontal.list .list>.item,.ui.massive.horizontal.list>.item{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Loader\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.loader{display:none;position:absolute;top:50%;left:50%;margin:0;text-align:center;z-index:1000;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ui.loader:before{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;-webkit-animation:loader .6s linear;animation:loader .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}@-webkit-keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.mini.loader:after,.ui.mini.loader:before{width:1rem;height:1rem;margin:0 0 0 -.5rem}.ui.tiny.loader:after,.ui.tiny.loader:before{width:1.14285714rem;height:1.14285714rem;margin:0 0 0 -.57142857rem}.ui.small.loader:after,.ui.small.loader:before{width:1.71428571rem;height:1.71428571rem;margin:0 0 0 -.85714286rem}.ui.loader:after,.ui.loader:before{width:2.28571429rem;height:2.28571429rem;margin:0 0 0 -1.14285714rem}.ui.large.loader:after,.ui.large.loader:before{width:3.42857143rem;height:3.42857143rem;margin:0 0 0 -1.71428571rem}.ui.big.loader:after,.ui.big.loader:before{width:3.71428571rem;height:3.71428571rem;margin:0 0 0 -1.85714286rem}.ui.huge.loader:after,.ui.huge.loader:before{width:4.14285714rem;height:4.14285714rem;margin:0 0 0 -2.07142857rem}.ui.massive.loader:after,.ui.massive.loader:before{width:4.57142857rem;height:4.57142857rem;margin:0 0 0 -2.28571429rem}.ui.dimmer .loader{display:block}.ui.dimmer .ui.loader{color:rgba(255,255,255,.9)}.ui.dimmer .ui.loader:before{border-color:rgba(255,255,255,.15)}.ui.dimmer .ui.loader:after{border-color:#fff transparent transparent}.ui.inverted.dimmer .ui.loader{color:rgba(0,0,0,.87)}.ui.inverted.dimmer .ui.loader:before{border-color:rgba(0,0,0,.1)}.ui.inverted.dimmer .ui.loader:after{border-color:#767676 transparent transparent}.ui.text.loader{width:auto!important;height:auto!important;text-align:center;font-style:normal}.ui.indeterminate.loader:after{animation-direction:reverse;-webkit-animation-duration:1.2s;animation-duration:1.2s}.ui.loader.active,.ui.loader.visible{display:block}.ui.loader.disabled,.ui.loader.hidden{display:none}.ui.inverted.dimmer .ui.mini.loader,.ui.mini.loader{width:1rem;height:1rem;font-size:.78571429em}.ui.inverted.dimmer .ui.tiny.loader,.ui.tiny.loader{width:1.14285714rem;height:1.14285714rem;font-size:.85714286em}.ui.inverted.dimmer .ui.small.loader,.ui.small.loader{width:1.71428571rem;height:1.71428571rem;font-size:.92857143em}.ui.inverted.dimmer .ui.loader,.ui.loader{width:2.28571429rem;height:2.28571429rem;font-size:1em}.ui.inverted.dimmer .ui.large.loader,.ui.large.loader{width:3.42857143rem;height:3.42857143rem;font-size:1.14285714em}.ui.big.loader,.ui.inverted.dimmer .ui.big.loader{width:3.71428571rem;height:3.71428571rem;font-size:1.28571429em}.ui.huge.loader,.ui.inverted.dimmer .ui.huge.loader{width:4.14285714rem;height:4.14285714rem;font-size:1.42857143em}.ui.inverted.dimmer .ui.massive.loader,.ui.massive.loader{width:4.57142857rem;height:4.57142857rem;font-size:1.71428571em}.ui.mini.text.loader{min-width:1rem;padding-top:1.78571429rem}.ui.tiny.text.loader{min-width:1.14285714rem;padding-top:1.92857143rem}.ui.small.text.loader{min-width:1.71428571rem;padding-top:2.5rem}.ui.text.loader{min-width:2.28571429rem;padding-top:3.07142857rem}.ui.large.text.loader{min-width:3.42857143rem;padding-top:4.21428571rem}.ui.big.text.loader{min-width:3.71428571rem;padding-top:4.5rem}.ui.huge.text.loader{min-width:4.14285714rem;padding-top:4.92857143rem}.ui.massive.text.loader{min-width:4.57142857rem;padding-top:5.35714286rem}.ui.inverted.loader{color:rgba(255,255,255,.9)}.ui.inverted.loader:before{border-color:rgba(255,255,255,.15)}.ui.inverted.loader:after{border-top-color:#fff}.ui.inline.loader{position:relative;vertical-align:middle;margin:0;left:0;top:0;-webkit-transform:none;transform:none}.ui.inline.loader.active,.ui.inline.loader.visible{display:inline-block}.ui.centered.inline.loader.active,.ui.centered.inline.loader.visible{display:block;margin-left:auto;margin-right:auto}/*!\n * # Semantic UI 2.4.0 - Loader\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.placeholder{position:static;overflow:hidden;-webkit-animation:placeholderShimmer 2s linear;animation:placeholderShimmer 2s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;background-color:#fff;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.08)),color-stop(15%,rgba(0,0,0,.15)),color-stop(30%,rgba(0,0,0,.08)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-image:-webkit-gradient(linear,left top, right top,color-stop(0, rgba(0,0,0,.08)),color-stop(15%, rgba(0,0,0,.15)),color-stop(30%, rgba(0,0,0,.08)));background-image:linear-gradient(to right,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-size:1200px 100%;max-width:30rem}@-webkit-keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}@keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}.ui.placeholder+.ui.placeholder{margin-top:2rem}.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.15s;animation-delay:.15s}.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.3s;animation-delay:.3s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.45s;animation-delay:.45s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.6s;animation-delay:.6s}.ui.placeholder,.ui.placeholder .image.header:after,.ui.placeholder .line,.ui.placeholder .line:after,.ui.placeholder>:before{background-color:#fff}.ui.placeholder .image:not(.header):not(.ui){height:100px}.ui.placeholder .square.image:not(.header){height:0;overflow:hidden;padding-top:100%}.ui.placeholder .rectangular.image:not(.header){height:0;overflow:hidden;padding-top:75%}.ui.placeholder .line{position:relative;height:.85714286em}.ui.placeholder .line:after,.ui.placeholder .line:before{top:100%;position:absolute;content:'';background-color:inherit}.ui.placeholder .line:before{left:0}.ui.placeholder .line:after{right:0}.ui.placeholder .line{margin-bottom:.5em}.ui.placeholder .line:after,.ui.placeholder .line:before{height:.5em}.ui.placeholder .line:not(:first-child){margin-top:.5em}.ui.placeholder .header{position:relative;overflow:hidden}.ui.placeholder .line:nth-child(1):after{width:0%}.ui.placeholder .line:nth-child(2):after{width:50%}.ui.placeholder .line:nth-child(3):after{width:10%}.ui.placeholder .line:nth-child(4):after{width:35%}.ui.placeholder .line:nth-child(5):after{width:65%}.ui.placeholder .header .line{margin-bottom:.64285714em}.ui.placeholder .header .line:after,.ui.placeholder .header .line:before{height:.64285714em}.ui.placeholder .header .line:not(:first-child){margin-top:.64285714em}.ui.placeholder .header .line:after{width:20%}.ui.placeholder .header .line:nth-child(2):after{width:60%}.ui.placeholder .image.header .line{margin-left:3em}.ui.placeholder .image.header .line:before{width:.71428571rem}.ui.placeholder .image.header:after{display:block;height:.85714286em;content:'';margin-left:3em}.ui.placeholder .header .line:first-child,.ui.placeholder .image .line:first-child,.ui.placeholder .paragraph .line:first-child{height:.01px}.ui.placeholder .header:not(:first-child):before,.ui.placeholder .image:not(:first-child):before,.ui.placeholder .paragraph:not(:first-child):before{height:1.42857143em;content:'';display:block}.ui.inverted.placeholder{background-image:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,.08)),color-stop(15%,rgba(255,255,255,.14)),color-stop(30%,rgba(255,255,255,.08)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%);background-image:-webkit-gradient(linear,left top, right top,color-stop(0, rgba(255,255,255,.08)),color-stop(15%, rgba(255,255,255,.14)),color-stop(30%, rgba(255,255,255,.08)));background-image:linear-gradient(to right,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%)}.ui.inverted.placeholder,.ui.inverted.placeholder .image.header:after,.ui.inverted.placeholder .line,.ui.inverted.placeholder .line:after,.ui.inverted.placeholder>:before{background-color:#1b1c1d}.ui.placeholder .full.line.line.line:after{width:0%}.ui.placeholder .very.long.line.line.line:after{width:10%}.ui.placeholder .long.line.line.line:after{width:35%}.ui.placeholder .medium.line.line.line:after{width:50%}.ui.placeholder .short.line.line.line:after{width:65%}.ui.placeholder .very.short.line.line.line:after{width:80%}.ui.fluid.placeholder{max-width:none}/*!\n * # Semantic UI 2.4.0 - Rail\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.rail{position:absolute;top:0;width:300px;height:100%}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:calc(300px + 1em)}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:calc(300px + .5em)}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0}.ui.mini.rail{font-size:.78571429rem}.ui.tiny.rail{font-size:.85714286rem}.ui.small.rail{font-size:.92857143rem}.ui.rail{font-size:1rem}.ui.large.rail{font-size:1.14285714rem}.ui.big.rail{font-size:1.28571429rem}.ui.huge.rail{font-size:1.42857143rem}.ui.massive.rail{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Reveal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.reveal{display:inherit;position:relative!important;font-size:0!important}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;white-space:normal;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:-webkit-transform .5s ease .1s;transition:transform .5s ease .1s;transition:transform .5s ease .1s, -webkit-transform .5s ease .1s;transition:transform .5s ease .1s,-webkit-transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;white-space:normal;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s, -webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s,-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transform:rotate(0);transform:rotate(0)}.ui.rotate.reveal>.visible.content,.ui.rotate.right.reveal>.visible.content{-webkit-transform-origin:bottom right;transform-origin:bottom right}.ui.rotate.active.reveal>.visible.content,.ui.rotate.reveal:hover>.visible.content,.ui.rotate.right.active.reveal>.visible.content,.ui.rotate.right.reveal:hover>.visible.content{-webkit-transform:rotate(110deg);transform:rotate(110deg)}.ui.rotate.left.reveal>.visible.content{-webkit-transform-origin:bottom left;transform-origin:bottom left}.ui.rotate.left.active.reveal>.visible.content,.ui.rotate.left.reveal:hover>.visible.content{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.ui.disabled.reveal:hover>.visible.visible.content{position:static!important;display:block!important;opacity:1!important;top:0!important;left:0!important;right:auto!important;bottom:auto!important;-webkit-transform:none!important;transform:none!important}.ui.disabled.reveal:hover>.hidden.hidden.content{display:none!important}.ui.reveal>.ui.ribbon.label{z-index:5}.ui.visible.reveal{overflow:visible}.ui.instant.reveal>.content{-webkit-transition-delay:0s!important;transition-delay:0s!important}.ui.reveal>.content{font-size:1rem!important}/*!\n * # Semantic UI 2.4.0 - Segment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header{color:#fff}.ui[class*=\"bottom attached\"].segment>[class*=\"top attached\"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*=\"top attached\"].segment>[class*=\"bottom attached\"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*=\"top attached\"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*=\"bottom attached\"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*=\"very basic\"].table.segment{padding:1em 1em}.ui.placeholder.segment{display:flex;flex-direction:column;justify-content:center;align-items:stretch;max-width:none;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:'';box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*=\"top attached\"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*=\"top attached\"]:first-child{margin-top:0}.ui.piled.segment[class*=\"bottom attached\"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*=\"bottom attached\"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*=\"very padded\"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*=\"very padded\"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.segment,.ui.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{border-top:none;margin-top:0;bottom:0;margin-bottom:0;top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem 1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:flex;flex-direction:row;background-color:transparent;border-radius:0;padding:0;background-color:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments>.segment{flex:1 1 auto;-ms-flex:1 1 0px;margin:0;min-width:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments>.segment:first-child{border-left:none}.ui.disabled.segment{opacity:.45;color:rgba(40,40,40,.3)}.ui.loading.segment{position:relative;cursor:default;pointer-events:none;text-shadow:none!important;color:transparent!important;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:segment-spin .6s linear;animation:segment-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.segment{background:none transparent;-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:\".\";display:block;height:0;clear:both;visibility:hidden}.ui.red.segment:not(.inverted){border-top:2px solid #db2828!important}.ui.inverted.red.segment{background-color:#db2828!important;color:#fff!important}.ui.orange.segment:not(.inverted){border-top:2px solid #f2711c!important}.ui.inverted.orange.segment{background-color:#f2711c!important;color:#fff!important}.ui.yellow.segment:not(.inverted){border-top:2px solid #fbbd08!important}.ui.inverted.yellow.segment{background-color:#fbbd08!important;color:#fff!important}.ui.olive.segment:not(.inverted){border-top:2px solid #b5cc18!important}.ui.inverted.olive.segment{background-color:#b5cc18!important;color:#fff!important}.ui.green.segment:not(.inverted){border-top:2px solid #21ba45!important}.ui.inverted.green.segment{background-color:#21ba45!important;color:#fff!important}.ui.teal.segment:not(.inverted){border-top:2px solid #00b5ad!important}.ui.inverted.teal.segment{background-color:#00b5ad!important;color:#fff!important}.ui.blue.segment:not(.inverted){border-top:2px solid #2185d0!important}.ui.inverted.blue.segment{background-color:#2185d0!important;color:#fff!important}.ui.violet.segment:not(.inverted){border-top:2px solid #6435c9!important}.ui.inverted.violet.segment{background-color:#6435c9!important;color:#fff!important}.ui.purple.segment:not(.inverted){border-top:2px solid #a333c8!important}.ui.inverted.purple.segment{background-color:#a333c8!important;color:#fff!important}.ui.pink.segment:not(.inverted){border-top:2px solid #e03997!important}.ui.inverted.pink.segment{background-color:#e03997!important;color:#fff!important}.ui.brown.segment:not(.inverted){border-top:2px solid #a5673f!important}.ui.inverted.brown.segment{background-color:#a5673f!important;color:#fff!important}.ui.grey.segment:not(.inverted){border-top:2px solid #767676!important}.ui.inverted.grey.segment{background-color:#767676!important;color:#fff!important}.ui.black.segment:not(.inverted){border-top:2px solid #1b1c1d!important}.ui.inverted.black.segment{background-color:#1b1c1d!important;color:#fff!important}.ui[class*=\"left aligned\"].segment{text-align:left}.ui[class*=\"right aligned\"].segment{text-align:right}.ui[class*=\"center aligned\"].segment{text-align:center}.ui.floated.segment,.ui[class*=\"left floated\"].segment{float:left;margin-right:1em}.ui[class*=\"right floated\"].segment{float:right;margin-left:1em}.ui.inverted.segment{border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.segment,.ui.primary.inverted.segment{background:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.secondary.segment{background:#f3f4f5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:#4c4f52 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 -webkit-gradient(linear,left top, left bottom,color-stop(0, rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 -webkit-gradient(linear,left top, left bottom,color-stop(0, rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*=\"top attached\"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*=\"top attached\"]:first-child{margin-top:0}.ui.segment[class*=\"bottom attached\"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*=\"bottom attached\"]:last-child{margin-bottom:0}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Step\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.steps{display:inline-flex;flex-direction:row;align-items:stretch;margin:1em 0;background:'';-webkit-box-shadow:none;box-shadow:none;line-height:1.14285714em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.steps:first-child{margin-top:0}.ui.steps:last-child{margin-bottom:0}.ui.steps .step{position:relative;display:flex;flex:1 0 auto;flex-wrap:wrap;flex-direction:row;vertical-align:middle;align-items:center;justify-content:center;margin:0 0;padding:1.14285714em 2em;background:#fff;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border-radius:0;border:none;border-right:1px solid rgba(34,36,38,.15);-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease}.ui.steps .step:after{display:none;position:absolute;z-index:2;content:'';top:50%;right:0;border:medium none;background-color:#fff;width:1.14285714em;height:1.14285714em;border-style:solid;border-color:rgba(34,36,38,.15);border-width:0 1px 1px 0;-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg)}.ui.steps .step:first-child{padding-left:2em;border-radius:.28571429rem 0 0 .28571429rem}.ui.steps .step:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.steps .step:last-child{border-right:none;margin-right:0}.ui.steps .step:only-child{border-radius:.28571429rem}.ui.steps .step .title{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;font-weight:700}.ui.steps .step>.title{width:100%}.ui.steps .step .description{font-weight:400;font-size:.92857143em;color:rgba(0,0,0,.87)}.ui.steps .step>.description{width:100%}.ui.steps .step .title~.description{margin-top:.25em}.ui.steps .step>.icon{line-height:1;font-size:2.5em;margin:0 1rem 0 0}.ui.steps .step>.icon,.ui.steps .step>.icon~.content{display:block;flex:0 1 auto;align-self:middle}.ui.steps .step>.icon~.content{flex-grow:1 0 auto}.ui.steps:not(.vertical) .step>.icon{width:auto}.ui.steps .link.step,.ui.steps a.step{cursor:pointer}.ui.ordered.steps{counter-reset:ordered}.ui.ordered.steps .step:before{display:block;position:static;text-align:center;content:counters(ordered, \".\");align-self:middle;margin-right:1rem;font-size:2.5em;counter-increment:ordered;font-family:inherit;font-weight:700}.ui.ordered.steps .step>*{display:block;align-self:middle}.ui.vertical.steps{display:inline-flex;flex-direction:column;overflow:visible}.ui.vertical.steps .step{justify-content:flex-start;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.steps .step:last-child{border-bottom:none;border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.steps .step:only-child{border-radius:.28571429rem}.ui.vertical.steps .step:after{display:none}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0}.ui.vertical.steps .step:after{display:none}.ui.vertical.steps .active.step:after{display:block}.ui.vertical.steps .step:last-child:after{display:none}.ui.vertical.steps .active.step:last-child:after{display:block}@media only screen and (max-width:767px){.ui.steps:not(.unstackable){display:inline-flex;overflow:visible;flex-direction:column}.ui.steps:not(.unstackable) .step{width:100%!important;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui.steps:not(.unstackable) .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps:not(.unstackable) .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.steps:not(.unstackable) .step:after{display:none!important}.ui.steps:not(.unstackable) .step .content{text-align:center}.ui.ordered.steps:not(.unstackable) .step:before,.ui.steps:not(.unstackable) .step>.icon{margin:0 0 1rem 0}}.ui.steps .link.step:hover,.ui.steps .link.step:hover::after,.ui.steps a.step:hover,.ui.steps a.step:hover::after{background:#f9fafb;color:rgba(0,0,0,.8)}.ui.steps .link.step:active,.ui.steps .link.step:active::after,.ui.steps a.step:active,.ui.steps a.step:active::after{background:#f3f4f5;color:rgba(0,0,0,.9)}.ui.steps .step.active{cursor:auto;background:#f3f4f5}.ui.steps .step.active:after{background:#f3f4f5}.ui.steps .step.active .title{color:#4183c4}.ui.ordered.steps .step.active:before,.ui.steps .active.step .icon{color:rgba(0,0,0,.85)}.ui.steps .step:after{display:block}.ui.steps .active.step:after{display:block}.ui.steps .step:last-child:after{display:none}.ui.steps .active.step:last-child:after{display:none}.ui.steps .link.active.step:hover,.ui.steps .link.active.step:hover::after,.ui.steps a.active.step:hover,.ui.steps a.active.step:hover::after{cursor:pointer;background:#dcddde;color:rgba(0,0,0,.87)}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{color:#21ba45}.ui.steps .disabled.step{cursor:auto;background:#fff;pointer-events:none}.ui.steps .disabled.step,.ui.steps .disabled.step .description,.ui.steps .disabled.step .title{color:rgba(40,40,40,.3)}.ui.steps .disabled.step:after{background:#fff}@media only screen and (max-width:991px){.ui[class*=\"tablet stackable\"].steps{display:inline-flex;overflow:visible;flex-direction:column}.ui[class*=\"tablet stackable\"].steps .step{flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui[class*=\"tablet stackable\"].steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui[class*=\"tablet stackable\"].steps .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"tablet stackable\"].steps .step:after{display:none!important}.ui[class*=\"tablet stackable\"].steps .step .content{text-align:center}.ui[class*=\"tablet stackable\"].ordered.steps .step:before,.ui[class*=\"tablet stackable\"].steps .step>.icon{margin:0 0 1rem 0}}.ui.fluid.steps{display:flex;width:100%}.ui.attached.steps{width:calc(100% + 2px)!important;margin:0 -1px 0;max-width:calc(100% + 2px);border-radius:.28571429rem .28571429rem 0 0}.ui.attached.steps .step:first-child{border-radius:.28571429rem 0 0 0}.ui.attached.steps .step:last-child{border-radius:0 .28571429rem 0 0}.ui.bottom.attached.steps{margin:0 -1px 0;border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.attached.steps .step:first-child{border-radius:0 0 0 .28571429rem}.ui.bottom.attached.steps .step:last-child{border-radius:0 0 .28571429rem 0}.ui.eight.steps,.ui.five.steps,.ui.four.steps,.ui.one.steps,.ui.seven.steps,.ui.six.steps,.ui.three.steps,.ui.two.steps{width:100%}.ui.eight.steps>.step,.ui.five.steps>.step,.ui.four.steps>.step,.ui.one.steps>.step,.ui.seven.steps>.step,.ui.six.steps>.step,.ui.three.steps>.step,.ui.two.steps>.step{flex-wrap:nowrap}.ui.one.steps>.step{width:100%}.ui.two.steps>.step{width:50%}.ui.three.steps>.step{width:33.333%}.ui.four.steps>.step{width:25%}.ui.five.steps>.step{width:20%}.ui.six.steps>.step{width:16.666%}.ui.seven.steps>.step{width:14.285%}.ui.eight.steps>.step{width:12.5%}.ui.mini.step,.ui.mini.steps .step{font-size:.78571429rem}.ui.tiny.step,.ui.tiny.steps .step{font-size:.85714286rem}.ui.small.step,.ui.small.steps .step{font-size:.92857143rem}.ui.step,.ui.steps .step{font-size:1rem}.ui.large.step,.ui.large.steps .step{font-size:1.14285714rem}.ui.big.step,.ui.big.steps .step{font-size:1.28571429rem}.ui.huge.step,.ui.huge.steps .step{font-size:1.42857143rem}.ui.massive.step,.ui.massive.steps .step{font-size:1.71428571rem}@font-face{font-family:Step;src:url(data:application/x-font-ttf;charset=utf-8;;base64,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) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,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) format('woff')}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{font-family:Step;content:'\\e800'}/*!\n * # Semantic UI 2.4.0 - Breadcrumb\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.breadcrumb{line-height:1;display:inline-block;margin:0 0;vertical-align:middle}.ui.breadcrumb:first-child{margin-top:0}.ui.breadcrumb:last-child{margin-bottom:0}.ui.breadcrumb .divider{display:inline-block;opacity:.7;margin:0 .21428571rem 0;font-size:.92857143em;color:rgba(0,0,0,.4);vertical-align:baseline}.ui.breadcrumb a{color:#4183c4}.ui.breadcrumb a:hover{color:#1e70bf}.ui.breadcrumb .icon.divider{font-size:.85714286em;vertical-align:baseline}.ui.breadcrumb a.section{cursor:pointer}.ui.breadcrumb .section{display:inline-block;margin:0;padding:0}.ui.breadcrumb.segment{display:inline-block;padding:.78571429em 1em}.ui.breadcrumb .active.section{font-weight:700}.ui.mini.breadcrumb{font-size:.78571429rem}.ui.tiny.breadcrumb{font-size:.85714286rem}.ui.small.breadcrumb{font-size:.92857143rem}.ui.breadcrumb{font-size:1rem}.ui.large.breadcrumb{font-size:1.14285714rem}.ui.big.breadcrumb{font-size:1.28571429rem}.ui.huge.breadcrumb{font-size:1.42857143rem}.ui.massive.breadcrumb{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Form\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.form{position:relative;max-width:100%}.ui.form>p{margin:1em 0}.ui.form .field{clear:both;margin:0 0 1em}.ui.form .field:last-child,.ui.form .fields:last-child .field{margin-bottom:0}.ui.form .fields .field{clear:both;margin:0}.ui.form .field>label{display:block;margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.21428571em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url]{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0;outline:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form textarea{margin:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);padding:.78571429em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);outline:0;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease;font-size:1em;line-height:1.2857;resize:vertical}.ui.form textarea:not([rows]){height:12em;min-height:8em;max-height:24em}.ui.form input[type=checkbox],.ui.form textarea{vertical-align:top}.ui.form input.attached{width:auto}.ui.form select{display:block;height:auto;width:100%;background:#fff;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;padding:.62em 1em;color:rgba(0,0,0,.87);-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form .field>.selection.dropdown{width:100%}.ui.form .field>.selection.dropdown>.dropdown.icon{float:right}.ui.form .inline.field>.selection.dropdown,.ui.form .inline.fields .field>.selection.dropdown{width:auto}.ui.form .inline.field>.selection.dropdown>.dropdown.icon,.ui.form .inline.fields .field>.selection.dropdown>.dropdown.icon{float:none}.ui.form .field .ui.input,.ui.form .fields .field .ui.input,.ui.form .wide.field .ui.input{width:100%}.ui.form .inline.field:not(.wide) .ui.input,.ui.form .inline.fields .field:not(.wide) .ui.input{width:auto;vertical-align:middle}.ui.form .field .ui.input input,.ui.form .fields .field .ui.input input{width:auto}.ui.form .eight.fields .ui.input input,.ui.form .five.fields .ui.input input,.ui.form .four.fields .ui.input input,.ui.form .nine.fields .ui.input input,.ui.form .seven.fields .ui.input input,.ui.form .six.fields .ui.input input,.ui.form .ten.fields .ui.input input,.ui.form .three.fields .ui.input input,.ui.form .two.fields .ui.input input,.ui.form .wide.field .ui.input input{flex:1 0 auto;width:0}.ui.form .error.message,.ui.form .success.message,.ui.form .warning.message{display:none}.ui.form .message:first-child{margin-top:0}.ui.form .field .prompt.label{white-space:normal;background:#fff!important;border:1px solid #e0b4b4!important;color:#9f3a38!important}.ui.form .inline.field .prompt,.ui.form .inline.fields .field .prompt{vertical-align:top;margin:-.25em 0 -.5em .5em}.ui.form .inline.field .prompt:before,.ui.form .inline.fields .field .prompt:before{border-width:0 0 1px 1px;bottom:auto;right:auto;top:50%;left:0}.ui.form .field.field input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#e5dfa1!important}.ui.form .field.field input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#d5c315!important}.ui.form .error.error input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #fffaf0 inset!important;box-shadow:0 0 0 100px #fffaf0 inset!important;border-color:#e0b4b4!important}.ui.form ::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.form :-ms-input-placeholder{color:rgba(191,191,191,.87)!important}.ui.form ::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.form :focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.form :focus:-ms-input-placeholder{color:rgba(115,115,115,.87)!important}.ui.form :focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.form .error ::-webkit-input-placeholder{color:#e7bdbc}.ui.form .error :-ms-input-placeholder{color:#e7bdbc!important}.ui.form .error ::-moz-placeholder{color:#e7bdbc}.ui.form .error :focus::-webkit-input-placeholder{color:#da9796}.ui.form .error :focus:-ms-input-placeholder{color:#da9796!important}.ui.form .error :focus::-moz-placeholder{color:#da9796}.ui.form input:not([type]):focus,.ui.form input[type=date]:focus,.ui.form input[type=datetime-local]:focus,.ui.form input[type=email]:focus,.ui.form input[type=file]:focus,.ui.form input[type=number]:focus,.ui.form input[type=password]:focus,.ui.form input[type=search]:focus,.ui.form input[type=tel]:focus,.ui.form input[type=text]:focus,.ui.form input[type=time]:focus,.ui.form input[type=url]:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset}.ui.form textarea:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;-webkit-appearance:none}.ui.form.success .success.message:not(:empty){display:block}.ui.form.success .compact.success.message:not(:empty){display:inline-block}.ui.form.success .icon.success.message:not(:empty){display:flex}.ui.form.warning .warning.message:not(:empty){display:block}.ui.form.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form.warning .icon.warning.message:not(:empty){display:flex}.ui.form.error .error.message:not(:empty){display:block}.ui.form.error .compact.error.message:not(:empty){display:inline-block}.ui.form.error .icon.error.message:not(:empty){display:flex}.ui.form .field.error .input,.ui.form .field.error label,.ui.form .fields.error .field .input,.ui.form .fields.error .field label{color:#9f3a38}.ui.form .field.error .corner.label,.ui.form .fields.error .field .corner.label{border-color:#9f3a38;color:#fff}.ui.form .field.error input:not([type]),.ui.form .field.error input[type=date],.ui.form .field.error input[type=datetime-local],.ui.form .field.error input[type=email],.ui.form .field.error input[type=file],.ui.form .field.error input[type=number],.ui.form .field.error input[type=password],.ui.form .field.error input[type=search],.ui.form .field.error input[type=tel],.ui.form .field.error input[type=text],.ui.form .field.error input[type=time],.ui.form .field.error input[type=url],.ui.form .field.error select,.ui.form .field.error textarea,.ui.form .fields.error .field input:not([type]),.ui.form .fields.error .field input[type=date],.ui.form .fields.error .field input[type=datetime-local],.ui.form .fields.error .field input[type=email],.ui.form .fields.error .field input[type=file],.ui.form .fields.error .field input[type=number],.ui.form .fields.error .field input[type=password],.ui.form .fields.error .field input[type=search],.ui.form .fields.error .field input[type=tel],.ui.form .fields.error .field input[type=text],.ui.form .fields.error .field input[type=time],.ui.form .fields.error .field input[type=url],.ui.form .fields.error .field select,.ui.form .fields.error .field textarea{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error input:not([type]):focus,.ui.form .field.error input[type=date]:focus,.ui.form .field.error input[type=datetime-local]:focus,.ui.form .field.error input[type=email]:focus,.ui.form .field.error input[type=file]:focus,.ui.form .field.error input[type=number]:focus,.ui.form .field.error input[type=password]:focus,.ui.form .field.error input[type=search]:focus,.ui.form .field.error input[type=tel]:focus,.ui.form .field.error input[type=text]:focus,.ui.form .field.error input[type=time]:focus,.ui.form .field.error input[type=url]:focus,.ui.form .field.error select:focus,.ui.form .field.error textarea:focus{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-appearance:none;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error select{-webkit-appearance:menulist-button}.ui.form .field.error .ui.dropdown,.ui.form .field.error .ui.dropdown .item,.ui.form .field.error .ui.dropdown .text,.ui.form .fields.error .field .ui.dropdown,.ui.form .fields.error .field .ui.dropdown .item{background:#fff6f6;color:#9f3a38}.ui.form .field.error .ui.dropdown,.ui.form .fields.error .field .ui.dropdown{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover,.ui.form .fields.error .field .ui.dropdown:hover{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover .menu,.ui.form .fields.error .field .ui.dropdown:hover .menu{border-color:#e0b4b4}.ui.form .field.error .ui.multiple.selection.dropdown>.label,.ui.form .fields.error .field .ui.multiple.selection.dropdown>.label{background-color:#eacbcb;color:#9f3a38}.ui.form .field.error .ui.dropdown .menu .item:hover,.ui.form .fields.error .field .ui.dropdown .menu .item:hover{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .selected.item,.ui.form .fields.error .field .ui.dropdown .menu .selected.item{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .active.item,.ui.form .fields.error .field .ui.dropdown .menu .active.item{background-color:#fdcfcf!important}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label{color:#9f3a38}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before{background:#fff6f6;border-color:#e0b4b4}.ui.form .field.error .checkbox .box:after,.ui.form .field.error .checkbox label:after,.ui.form .fields.error .field .checkbox .box:after,.ui.form .fields.error .field .checkbox label:after{color:#9f3a38}.ui.form .disabled.field,.ui.form .disabled.fields .field,.ui.form .field :disabled{pointer-events:none;opacity:.45}.ui.form .field.disabled>label,.ui.form .fields.disabled>label{opacity:.45}.ui.form .field.disabled :disabled{opacity:1}.ui.loading.form{position:relative;cursor:default;pointer-events:none}.ui.loading.form:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;z-index:100}.ui.loading.form:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:form-spin .6s linear;animation:form-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes form-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes form-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.form .required.field>.checkbox:after,.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>label:after{margin:-.2em 0 0 .2em;content:'*';color:#db2828}.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>label:after{display:inline-block;vertical-align:top}.ui.form .required.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after{position:absolute;top:0;left:100%}.ui.form .inverted.segment .ui.checkbox .box,.ui.form .inverted.segment .ui.checkbox label,.ui.form .inverted.segment label,.ui.inverted.form .inline.field>label,.ui.inverted.form .inline.field>p,.ui.inverted.form .inline.fields .field>label,.ui.inverted.form .inline.fields .field>p,.ui.inverted.form .inline.fields>label,.ui.inverted.form .ui.checkbox .box,.ui.inverted.form .ui.checkbox label,.ui.inverted.form label{color:rgba(255,255,255,.9)}.ui.inverted.form input:not([type]),.ui.inverted.form input[type=date],.ui.inverted.form input[type=datetime-local],.ui.inverted.form input[type=email],.ui.inverted.form input[type=file],.ui.inverted.form input[type=number],.ui.inverted.form input[type=password],.ui.inverted.form input[type=search],.ui.inverted.form input[type=tel],.ui.inverted.form input[type=text],.ui.inverted.form input[type=time],.ui.inverted.form input[type=url]{background:#fff;border-color:rgba(255,255,255,.1);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.form .grouped.fields{display:block;margin:0 0 1em}.ui.form .grouped.fields:last-child{margin-bottom:0}.ui.form .grouped.fields>label{margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form .grouped.fields .field,.ui.form .grouped.inline.fields .field{display:block;margin:.5em 0;padding:0}.ui.form .fields{display:flex;flex-direction:row;margin:0 -.5em 1em}.ui.form .fields>.field{flex:0 1 auto;padding-left:.5em;padding-right:.5em}.ui.form .fields>.field:first-child{border-left:none;-webkit-box-shadow:none;box-shadow:none}.ui.form .two.fields>.field,.ui.form .two.fields>.fields{width:50%}.ui.form .three.fields>.field,.ui.form .three.fields>.fields{width:33.33333333%}.ui.form .four.fields>.field,.ui.form .four.fields>.fields{width:25%}.ui.form .five.fields>.field,.ui.form .five.fields>.fields{width:20%}.ui.form .six.fields>.field,.ui.form .six.fields>.fields{width:16.66666667%}.ui.form .seven.fields>.field,.ui.form .seven.fields>.fields{width:14.28571429%}.ui.form .eight.fields>.field,.ui.form .eight.fields>.fields{width:12.5%}.ui.form .nine.fields>.field,.ui.form .nine.fields>.fields{width:11.11111111%}.ui.form .ten.fields>.field,.ui.form .ten.fields>.fields{width:10%}@media only screen and (max-width:767px){.ui.form .fields{flex-wrap:wrap}.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) [class*=\"equal width\"].fields:not(.unstackable)>.field,.ui[class*=\"equal width\"].form:not(.unstackable) .fields>.field{width:100%!important;margin:0 0 1em}}.ui.form .fields .wide.field{width:6.25%;padding-left:.5em;padding-right:.5em}.ui.form .one.wide.field{width:6.25%!important}.ui.form .two.wide.field{width:12.5%!important}.ui.form .three.wide.field{width:18.75%!important}.ui.form .four.wide.field{width:25%!important}.ui.form .five.wide.field{width:31.25%!important}.ui.form .six.wide.field{width:37.5%!important}.ui.form .seven.wide.field{width:43.75%!important}.ui.form .eight.wide.field{width:50%!important}.ui.form .nine.wide.field{width:56.25%!important}.ui.form .ten.wide.field{width:62.5%!important}.ui.form .eleven.wide.field{width:68.75%!important}.ui.form .twelve.wide.field{width:75%!important}.ui.form .thirteen.wide.field{width:81.25%!important}.ui.form .fourteen.wide.field{width:87.5%!important}.ui.form .fifteen.wide.field{width:93.75%!important}.ui.form .sixteen.wide.field{width:100%!important}@media only screen and (max-width:767px){.ui.form:not(.unstackable) .fields:not(.unstackable)>.eight.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.eleven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fifteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.five.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.four.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fourteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.nine.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.seven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.six.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.sixteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.ten.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.thirteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.three.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.twelve.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.two.wide.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields{width:100%!important}.ui.form .fields{margin-bottom:0}}.ui.form [class*=\"equal width\"].fields>.field,.ui[class*=\"equal width\"].form .fields>.field{width:100%;flex:1 1 auto}.ui.form .inline.fields{margin:0 0 1em;align-items:center}.ui.form .inline.fields .field{margin:0;padding:0 1em 0 0}.ui.form .inline.field>label,.ui.form .inline.field>p,.ui.form .inline.fields .field>label,.ui.form .inline.fields .field>p,.ui.form .inline.fields>label{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:baseline;font-size:.92857143em;font-weight:700;color:rgba(0,0,0,.87);text-transform:none}.ui.form .inline.fields>label{margin:.035714em 1em 0 0}.ui.form .inline.field>input,.ui.form .inline.field>select,.ui.form .inline.fields .field>input,.ui.form .inline.fields .field>select{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:middle;font-size:1em}.ui.form .inline.field>:first-child,.ui.form .inline.fields .field>:first-child{margin:0 .85714286em 0 0}.ui.form .inline.field>:only-child,.ui.form .inline.fields .field>:only-child{margin:0}.ui.form .inline.fields .wide.field{display:flex;align-items:center}.ui.form .inline.fields .wide.field>input,.ui.form .inline.fields .wide.field>select{width:100%}.ui.mini.form{font-size:.78571429rem}.ui.tiny.form{font-size:.85714286rem}.ui.small.form{font-size:.92857143rem}.ui.form{font-size:1rem}.ui.large.form{font-size:1.14285714rem}.ui.big.form{font-size:1.28571429rem}.ui.huge.form{font-size:1.42857143rem}.ui.massive.form{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Grid\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.grid{display:flex;flex-direction:row;flex-wrap:wrap;align-items:stretch;padding:0}.ui.grid{margin-top:-1rem;margin-bottom:-1rem;margin-left:-1rem;margin-right:-1rem}.ui.relaxed.grid{margin-left:-1.5rem;margin-right:-1.5rem}.ui[class*=\"very relaxed\"].grid{margin-left:-2.5rem;margin-right:-2.5rem}.ui.grid+.grid{margin-top:1rem}.ui.grid>.column:not(.row),.ui.grid>.row>.column{position:relative;display:inline-block;width:6.25%;padding-left:1rem;padding-right:1rem;vertical-align:top}.ui.grid>*{padding-left:1rem;padding-right:1rem}.ui.grid>.row{position:relative;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:inherit;align-items:stretch;width:100%!important;padding:0;padding-top:1rem;padding-bottom:1rem}.ui.grid>.column:not(.row){padding-top:1rem;padding-bottom:1rem}.ui.grid>.row>.column{margin-top:0;margin-bottom:0}.ui.grid>.row>.column>img,.ui.grid>.row>img{max-width:100%}.ui.grid>.ui.grid:first-child{margin-top:0}.ui.grid>.ui.grid:last-child{margin-bottom:0}.ui.aligned.grid .column>.segment:not(.compact):not(.attached),.ui.grid .aligned.row>.column>.segment:not(.compact):not(.attached){width:100%}.ui.grid .row+.ui.divider{flex-grow:1;margin:1rem 1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - 1rem)}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{-webkit-box-shadow:none;box-shadow:none}@media only screen and (max-width:767px){.ui.page.grid{width:auto;padding-left:0;padding-right:0;margin-left:0;margin-right:0}}@media only screen and (min-width:768px) and (max-width:991px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:2em;padding-right:2em}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:3%;padding-right:3%}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:15%;padding-right:15%}}@media only screen and (min-width:1920px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:23%;padding-right:23%}}.ui.grid>.column:only-child,.ui.grid>.row>.column:only-child{width:100%}.ui[class*=\"one column\"].grid>.column:not(.row),.ui[class*=\"one column\"].grid>.row>.column{width:100%}.ui[class*=\"two column\"].grid>.column:not(.row),.ui[class*=\"two column\"].grid>.row>.column{width:50%}.ui[class*=\"three column\"].grid>.column:not(.row),.ui[class*=\"three column\"].grid>.row>.column{width:33.33333333%}.ui[class*=\"four column\"].grid>.column:not(.row),.ui[class*=\"four column\"].grid>.row>.column{width:25%}.ui[class*=\"five column\"].grid>.column:not(.row),.ui[class*=\"five column\"].grid>.row>.column{width:20%}.ui[class*=\"six column\"].grid>.column:not(.row),.ui[class*=\"six column\"].grid>.row>.column{width:16.66666667%}.ui[class*=\"seven column\"].grid>.column:not(.row),.ui[class*=\"seven column\"].grid>.row>.column{width:14.28571429%}.ui[class*=\"eight column\"].grid>.column:not(.row),.ui[class*=\"eight column\"].grid>.row>.column{width:12.5%}.ui[class*=\"nine column\"].grid>.column:not(.row),.ui[class*=\"nine column\"].grid>.row>.column{width:11.11111111%}.ui[class*=\"ten column\"].grid>.column:not(.row),.ui[class*=\"ten column\"].grid>.row>.column{width:10%}.ui[class*=\"eleven column\"].grid>.column:not(.row),.ui[class*=\"eleven column\"].grid>.row>.column{width:9.09090909%}.ui[class*=\"twelve column\"].grid>.column:not(.row),.ui[class*=\"twelve column\"].grid>.row>.column{width:8.33333333%}.ui[class*=\"thirteen column\"].grid>.column:not(.row),.ui[class*=\"thirteen column\"].grid>.row>.column{width:7.69230769%}.ui[class*=\"fourteen column\"].grid>.column:not(.row),.ui[class*=\"fourteen column\"].grid>.row>.column{width:7.14285714%}.ui[class*=\"fifteen column\"].grid>.column:not(.row),.ui[class*=\"fifteen column\"].grid>.row>.column{width:6.66666667%}.ui[class*=\"sixteen column\"].grid>.column:not(.row),.ui[class*=\"sixteen column\"].grid>.row>.column{width:6.25%}.ui.grid>[class*=\"one column\"].row>.column{width:100%!important}.ui.grid>[class*=\"two column\"].row>.column{width:50%!important}.ui.grid>[class*=\"three column\"].row>.column{width:33.33333333%!important}.ui.grid>[class*=\"four column\"].row>.column{width:25%!important}.ui.grid>[class*=\"five column\"].row>.column{width:20%!important}.ui.grid>[class*=\"six column\"].row>.column{width:16.66666667%!important}.ui.grid>[class*=\"seven column\"].row>.column{width:14.28571429%!important}.ui.grid>[class*=\"eight column\"].row>.column{width:12.5%!important}.ui.grid>[class*=\"nine column\"].row>.column{width:11.11111111%!important}.ui.grid>[class*=\"ten column\"].row>.column{width:10%!important}.ui.grid>[class*=\"eleven column\"].row>.column{width:9.09090909%!important}.ui.grid>[class*=\"twelve column\"].row>.column{width:8.33333333%!important}.ui.grid>[class*=\"thirteen column\"].row>.column{width:7.69230769%!important}.ui.grid>[class*=\"fourteen column\"].row>.column{width:7.14285714%!important}.ui.grid>[class*=\"fifteen column\"].row>.column{width:6.66666667%!important}.ui.grid>[class*=\"sixteen column\"].row>.column{width:6.25%!important}.ui.celled.page.grid{-webkit-box-shadow:none;box-shadow:none}.ui.column.grid>[class*=\"one wide\"].column,.ui.grid>.column.row>[class*=\"one wide\"].column,.ui.grid>.row>[class*=\"one wide\"].column,.ui.grid>[class*=\"one wide\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide\"].column,.ui.grid>.column.row>[class*=\"two wide\"].column,.ui.grid>.row>[class*=\"two wide\"].column,.ui.grid>[class*=\"two wide\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide\"].column,.ui.grid>.column.row>[class*=\"three wide\"].column,.ui.grid>.row>[class*=\"three wide\"].column,.ui.grid>[class*=\"three wide\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide\"].column,.ui.grid>.column.row>[class*=\"four wide\"].column,.ui.grid>.row>[class*=\"four wide\"].column,.ui.grid>[class*=\"four wide\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide\"].column,.ui.grid>.column.row>[class*=\"five wide\"].column,.ui.grid>.row>[class*=\"five wide\"].column,.ui.grid>[class*=\"five wide\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide\"].column,.ui.grid>.column.row>[class*=\"six wide\"].column,.ui.grid>.row>[class*=\"six wide\"].column,.ui.grid>[class*=\"six wide\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide\"].column,.ui.grid>.column.row>[class*=\"seven wide\"].column,.ui.grid>.row>[class*=\"seven wide\"].column,.ui.grid>[class*=\"seven wide\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide\"].column,.ui.grid>.column.row>[class*=\"eight wide\"].column,.ui.grid>.row>[class*=\"eight wide\"].column,.ui.grid>[class*=\"eight wide\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide\"].column,.ui.grid>.column.row>[class*=\"nine wide\"].column,.ui.grid>.row>[class*=\"nine wide\"].column,.ui.grid>[class*=\"nine wide\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide\"].column,.ui.grid>.column.row>[class*=\"ten wide\"].column,.ui.grid>.row>[class*=\"ten wide\"].column,.ui.grid>[class*=\"ten wide\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide\"].column,.ui.grid>.column.row>[class*=\"eleven wide\"].column,.ui.grid>.row>[class*=\"eleven wide\"].column,.ui.grid>[class*=\"eleven wide\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide\"].column,.ui.grid>.column.row>[class*=\"twelve wide\"].column,.ui.grid>.row>[class*=\"twelve wide\"].column,.ui.grid>[class*=\"twelve wide\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide\"].column,.ui.grid>.column.row>[class*=\"thirteen wide\"].column,.ui.grid>.row>[class*=\"thirteen wide\"].column,.ui.grid>[class*=\"thirteen wide\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide\"].column,.ui.grid>.column.row>[class*=\"fourteen wide\"].column,.ui.grid>.row>[class*=\"fourteen wide\"].column,.ui.grid>[class*=\"fourteen wide\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide\"].column,.ui.grid>.column.row>[class*=\"fifteen wide\"].column,.ui.grid>.row>[class*=\"fifteen wide\"].column,.ui.grid>[class*=\"fifteen wide\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide\"].column,.ui.grid>.column.row>[class*=\"sixteen wide\"].column,.ui.grid>.row>[class*=\"sixteen wide\"].column,.ui.grid>[class*=\"sixteen wide\"].column{width:100%!important}@media only screen and (min-width:320px) and (max-width:767px){.ui.column.grid>[class*=\"one wide mobile\"].column,.ui.grid>.column.row>[class*=\"one wide mobile\"].column,.ui.grid>.row>[class*=\"one wide mobile\"].column,.ui.grid>[class*=\"one wide mobile\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide mobile\"].column,.ui.grid>.column.row>[class*=\"two wide mobile\"].column,.ui.grid>.row>[class*=\"two wide mobile\"].column,.ui.grid>[class*=\"two wide mobile\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide mobile\"].column,.ui.grid>.column.row>[class*=\"three wide mobile\"].column,.ui.grid>.row>[class*=\"three wide mobile\"].column,.ui.grid>[class*=\"three wide mobile\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide mobile\"].column,.ui.grid>.column.row>[class*=\"four wide mobile\"].column,.ui.grid>.row>[class*=\"four wide mobile\"].column,.ui.grid>[class*=\"four wide mobile\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide mobile\"].column,.ui.grid>.column.row>[class*=\"five wide mobile\"].column,.ui.grid>.row>[class*=\"five wide mobile\"].column,.ui.grid>[class*=\"five wide mobile\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide mobile\"].column,.ui.grid>.column.row>[class*=\"six wide mobile\"].column,.ui.grid>.row>[class*=\"six wide mobile\"].column,.ui.grid>[class*=\"six wide mobile\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide mobile\"].column,.ui.grid>.column.row>[class*=\"seven wide mobile\"].column,.ui.grid>.row>[class*=\"seven wide mobile\"].column,.ui.grid>[class*=\"seven wide mobile\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide mobile\"].column,.ui.grid>.column.row>[class*=\"eight wide mobile\"].column,.ui.grid>.row>[class*=\"eight wide mobile\"].column,.ui.grid>[class*=\"eight wide mobile\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide mobile\"].column,.ui.grid>.column.row>[class*=\"nine wide mobile\"].column,.ui.grid>.row>[class*=\"nine wide mobile\"].column,.ui.grid>[class*=\"nine wide mobile\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide mobile\"].column,.ui.grid>.column.row>[class*=\"ten wide mobile\"].column,.ui.grid>.row>[class*=\"ten wide mobile\"].column,.ui.grid>[class*=\"ten wide mobile\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide mobile\"].column,.ui.grid>.column.row>[class*=\"eleven wide mobile\"].column,.ui.grid>.row>[class*=\"eleven wide mobile\"].column,.ui.grid>[class*=\"eleven wide mobile\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide mobile\"].column,.ui.grid>.column.row>[class*=\"twelve wide mobile\"].column,.ui.grid>.row>[class*=\"twelve wide mobile\"].column,.ui.grid>[class*=\"twelve wide mobile\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"thirteen wide mobile\"].column,.ui.grid>.row>[class*=\"thirteen wide mobile\"].column,.ui.grid>[class*=\"thirteen wide mobile\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"fourteen wide mobile\"].column,.ui.grid>.row>[class*=\"fourteen wide mobile\"].column,.ui.grid>[class*=\"fourteen wide mobile\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"fifteen wide mobile\"].column,.ui.grid>.row>[class*=\"fifteen wide mobile\"].column,.ui.grid>[class*=\"fifteen wide mobile\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"sixteen wide mobile\"].column,.ui.grid>.row>[class*=\"sixteen wide mobile\"].column,.ui.grid>[class*=\"sixteen wide mobile\"].column{width:100%!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.column.grid>[class*=\"one wide tablet\"].column,.ui.grid>.column.row>[class*=\"one wide tablet\"].column,.ui.grid>.row>[class*=\"one wide tablet\"].column,.ui.grid>[class*=\"one wide tablet\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide tablet\"].column,.ui.grid>.column.row>[class*=\"two wide tablet\"].column,.ui.grid>.row>[class*=\"two wide tablet\"].column,.ui.grid>[class*=\"two wide tablet\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide tablet\"].column,.ui.grid>.column.row>[class*=\"three wide tablet\"].column,.ui.grid>.row>[class*=\"three wide tablet\"].column,.ui.grid>[class*=\"three wide tablet\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide tablet\"].column,.ui.grid>.column.row>[class*=\"four wide tablet\"].column,.ui.grid>.row>[class*=\"four wide tablet\"].column,.ui.grid>[class*=\"four wide tablet\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide tablet\"].column,.ui.grid>.column.row>[class*=\"five wide tablet\"].column,.ui.grid>.row>[class*=\"five wide tablet\"].column,.ui.grid>[class*=\"five wide tablet\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide tablet\"].column,.ui.grid>.column.row>[class*=\"six wide tablet\"].column,.ui.grid>.row>[class*=\"six wide tablet\"].column,.ui.grid>[class*=\"six wide tablet\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide tablet\"].column,.ui.grid>.column.row>[class*=\"seven wide tablet\"].column,.ui.grid>.row>[class*=\"seven wide tablet\"].column,.ui.grid>[class*=\"seven wide tablet\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide tablet\"].column,.ui.grid>.column.row>[class*=\"eight wide tablet\"].column,.ui.grid>.row>[class*=\"eight wide tablet\"].column,.ui.grid>[class*=\"eight wide tablet\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide tablet\"].column,.ui.grid>.column.row>[class*=\"nine wide tablet\"].column,.ui.grid>.row>[class*=\"nine wide tablet\"].column,.ui.grid>[class*=\"nine wide tablet\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide tablet\"].column,.ui.grid>.column.row>[class*=\"ten wide tablet\"].column,.ui.grid>.row>[class*=\"ten wide tablet\"].column,.ui.grid>[class*=\"ten wide tablet\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide tablet\"].column,.ui.grid>.column.row>[class*=\"eleven wide tablet\"].column,.ui.grid>.row>[class*=\"eleven wide tablet\"].column,.ui.grid>[class*=\"eleven wide tablet\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide tablet\"].column,.ui.grid>.column.row>[class*=\"twelve wide tablet\"].column,.ui.grid>.row>[class*=\"twelve wide tablet\"].column,.ui.grid>[class*=\"twelve wide tablet\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"thirteen wide tablet\"].column,.ui.grid>.row>[class*=\"thirteen wide tablet\"].column,.ui.grid>[class*=\"thirteen wide tablet\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"fourteen wide tablet\"].column,.ui.grid>.row>[class*=\"fourteen wide tablet\"].column,.ui.grid>[class*=\"fourteen wide tablet\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"fifteen wide tablet\"].column,.ui.grid>.row>[class*=\"fifteen wide tablet\"].column,.ui.grid>[class*=\"fifteen wide tablet\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"sixteen wide tablet\"].column,.ui.grid>.row>[class*=\"sixteen wide tablet\"].column,.ui.grid>[class*=\"sixteen wide tablet\"].column{width:100%!important}}@media only screen and (min-width:992px){.ui.column.grid>[class*=\"one wide computer\"].column,.ui.grid>.column.row>[class*=\"one wide computer\"].column,.ui.grid>.row>[class*=\"one wide computer\"].column,.ui.grid>[class*=\"one wide computer\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide computer\"].column,.ui.grid>.column.row>[class*=\"two wide computer\"].column,.ui.grid>.row>[class*=\"two wide computer\"].column,.ui.grid>[class*=\"two wide computer\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide computer\"].column,.ui.grid>.column.row>[class*=\"three wide computer\"].column,.ui.grid>.row>[class*=\"three wide computer\"].column,.ui.grid>[class*=\"three wide computer\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide computer\"].column,.ui.grid>.column.row>[class*=\"four wide computer\"].column,.ui.grid>.row>[class*=\"four wide computer\"].column,.ui.grid>[class*=\"four wide computer\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide computer\"].column,.ui.grid>.column.row>[class*=\"five wide computer\"].column,.ui.grid>.row>[class*=\"five wide computer\"].column,.ui.grid>[class*=\"five wide computer\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide computer\"].column,.ui.grid>.column.row>[class*=\"six wide computer\"].column,.ui.grid>.row>[class*=\"six wide computer\"].column,.ui.grid>[class*=\"six wide computer\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide computer\"].column,.ui.grid>.column.row>[class*=\"seven wide computer\"].column,.ui.grid>.row>[class*=\"seven wide computer\"].column,.ui.grid>[class*=\"seven wide computer\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide computer\"].column,.ui.grid>.column.row>[class*=\"eight wide computer\"].column,.ui.grid>.row>[class*=\"eight wide computer\"].column,.ui.grid>[class*=\"eight wide computer\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide computer\"].column,.ui.grid>.column.row>[class*=\"nine wide computer\"].column,.ui.grid>.row>[class*=\"nine wide computer\"].column,.ui.grid>[class*=\"nine wide computer\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide computer\"].column,.ui.grid>.column.row>[class*=\"ten wide computer\"].column,.ui.grid>.row>[class*=\"ten wide computer\"].column,.ui.grid>[class*=\"ten wide computer\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide computer\"].column,.ui.grid>.column.row>[class*=\"eleven wide computer\"].column,.ui.grid>.row>[class*=\"eleven wide computer\"].column,.ui.grid>[class*=\"eleven wide computer\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide computer\"].column,.ui.grid>.column.row>[class*=\"twelve wide computer\"].column,.ui.grid>.row>[class*=\"twelve wide computer\"].column,.ui.grid>[class*=\"twelve wide computer\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide computer\"].column,.ui.grid>.column.row>[class*=\"thirteen wide computer\"].column,.ui.grid>.row>[class*=\"thirteen wide computer\"].column,.ui.grid>[class*=\"thirteen wide computer\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide computer\"].column,.ui.grid>.column.row>[class*=\"fourteen wide computer\"].column,.ui.grid>.row>[class*=\"fourteen wide computer\"].column,.ui.grid>[class*=\"fourteen wide computer\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide computer\"].column,.ui.grid>.column.row>[class*=\"fifteen wide computer\"].column,.ui.grid>.row>[class*=\"fifteen wide computer\"].column,.ui.grid>[class*=\"fifteen wide computer\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide computer\"].column,.ui.grid>.column.row>[class*=\"sixteen wide computer\"].column,.ui.grid>.row>[class*=\"sixteen wide computer\"].column,.ui.grid>[class*=\"sixteen wide computer\"].column{width:100%!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.column.grid>[class*=\"one wide large screen\"].column,.ui.grid>.column.row>[class*=\"one wide large screen\"].column,.ui.grid>.row>[class*=\"one wide large screen\"].column,.ui.grid>[class*=\"one wide large screen\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide large screen\"].column,.ui.grid>.column.row>[class*=\"two wide large screen\"].column,.ui.grid>.row>[class*=\"two wide large screen\"].column,.ui.grid>[class*=\"two wide large screen\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide large screen\"].column,.ui.grid>.column.row>[class*=\"three wide large screen\"].column,.ui.grid>.row>[class*=\"three wide large screen\"].column,.ui.grid>[class*=\"three wide large screen\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide large screen\"].column,.ui.grid>.column.row>[class*=\"four wide large screen\"].column,.ui.grid>.row>[class*=\"four wide large screen\"].column,.ui.grid>[class*=\"four wide large screen\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide large screen\"].column,.ui.grid>.column.row>[class*=\"five wide large screen\"].column,.ui.grid>.row>[class*=\"five wide large screen\"].column,.ui.grid>[class*=\"five wide large screen\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide large screen\"].column,.ui.grid>.column.row>[class*=\"six wide large screen\"].column,.ui.grid>.row>[class*=\"six wide large screen\"].column,.ui.grid>[class*=\"six wide large screen\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide large screen\"].column,.ui.grid>.column.row>[class*=\"seven wide large screen\"].column,.ui.grid>.row>[class*=\"seven wide large screen\"].column,.ui.grid>[class*=\"seven wide large screen\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide large screen\"].column,.ui.grid>.column.row>[class*=\"eight wide large screen\"].column,.ui.grid>.row>[class*=\"eight wide large screen\"].column,.ui.grid>[class*=\"eight wide large screen\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide large screen\"].column,.ui.grid>.column.row>[class*=\"nine wide large screen\"].column,.ui.grid>.row>[class*=\"nine wide large screen\"].column,.ui.grid>[class*=\"nine wide large screen\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide large screen\"].column,.ui.grid>.column.row>[class*=\"ten wide large screen\"].column,.ui.grid>.row>[class*=\"ten wide large screen\"].column,.ui.grid>[class*=\"ten wide large screen\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide large screen\"].column,.ui.grid>.column.row>[class*=\"eleven wide large screen\"].column,.ui.grid>.row>[class*=\"eleven wide large screen\"].column,.ui.grid>[class*=\"eleven wide large screen\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide large screen\"].column,.ui.grid>.column.row>[class*=\"twelve wide large screen\"].column,.ui.grid>.row>[class*=\"twelve wide large screen\"].column,.ui.grid>[class*=\"twelve wide large screen\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"thirteen wide large screen\"].column,.ui.grid>.row>[class*=\"thirteen wide large screen\"].column,.ui.grid>[class*=\"thirteen wide large screen\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"fourteen wide large screen\"].column,.ui.grid>.row>[class*=\"fourteen wide large screen\"].column,.ui.grid>[class*=\"fourteen wide large screen\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"fifteen wide large screen\"].column,.ui.grid>.row>[class*=\"fifteen wide large screen\"].column,.ui.grid>[class*=\"fifteen wide large screen\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"sixteen wide large screen\"].column,.ui.grid>.row>[class*=\"sixteen wide large screen\"].column,.ui.grid>[class*=\"sixteen wide large screen\"].column{width:100%!important}}@media only screen and (min-width:1920px){.ui.column.grid>[class*=\"one wide widescreen\"].column,.ui.grid>.column.row>[class*=\"one wide widescreen\"].column,.ui.grid>.row>[class*=\"one wide widescreen\"].column,.ui.grid>[class*=\"one wide widescreen\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide widescreen\"].column,.ui.grid>.column.row>[class*=\"two wide widescreen\"].column,.ui.grid>.row>[class*=\"two wide widescreen\"].column,.ui.grid>[class*=\"two wide widescreen\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide widescreen\"].column,.ui.grid>.column.row>[class*=\"three wide widescreen\"].column,.ui.grid>.row>[class*=\"three wide widescreen\"].column,.ui.grid>[class*=\"three wide widescreen\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide widescreen\"].column,.ui.grid>.column.row>[class*=\"four wide widescreen\"].column,.ui.grid>.row>[class*=\"four wide widescreen\"].column,.ui.grid>[class*=\"four wide widescreen\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide widescreen\"].column,.ui.grid>.column.row>[class*=\"five wide widescreen\"].column,.ui.grid>.row>[class*=\"five wide widescreen\"].column,.ui.grid>[class*=\"five wide widescreen\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide widescreen\"].column,.ui.grid>.column.row>[class*=\"six wide widescreen\"].column,.ui.grid>.row>[class*=\"six wide widescreen\"].column,.ui.grid>[class*=\"six wide widescreen\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide widescreen\"].column,.ui.grid>.column.row>[class*=\"seven wide widescreen\"].column,.ui.grid>.row>[class*=\"seven wide widescreen\"].column,.ui.grid>[class*=\"seven wide widescreen\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide widescreen\"].column,.ui.grid>.column.row>[class*=\"eight wide widescreen\"].column,.ui.grid>.row>[class*=\"eight wide widescreen\"].column,.ui.grid>[class*=\"eight wide widescreen\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide widescreen\"].column,.ui.grid>.column.row>[class*=\"nine wide widescreen\"].column,.ui.grid>.row>[class*=\"nine wide widescreen\"].column,.ui.grid>[class*=\"nine wide widescreen\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide widescreen\"].column,.ui.grid>.column.row>[class*=\"ten wide widescreen\"].column,.ui.grid>.row>[class*=\"ten wide widescreen\"].column,.ui.grid>[class*=\"ten wide widescreen\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide widescreen\"].column,.ui.grid>.column.row>[class*=\"eleven wide widescreen\"].column,.ui.grid>.row>[class*=\"eleven wide widescreen\"].column,.ui.grid>[class*=\"eleven wide widescreen\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide widescreen\"].column,.ui.grid>.column.row>[class*=\"twelve wide widescreen\"].column,.ui.grid>.row>[class*=\"twelve wide widescreen\"].column,.ui.grid>[class*=\"twelve wide widescreen\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"thirteen wide widescreen\"].column,.ui.grid>.row>[class*=\"thirteen wide widescreen\"].column,.ui.grid>[class*=\"thirteen wide widescreen\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"fourteen wide widescreen\"].column,.ui.grid>.row>[class*=\"fourteen wide widescreen\"].column,.ui.grid>[class*=\"fourteen wide widescreen\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"fifteen wide widescreen\"].column,.ui.grid>.row>[class*=\"fifteen wide widescreen\"].column,.ui.grid>[class*=\"fifteen wide widescreen\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"sixteen wide widescreen\"].column,.ui.grid>.row>[class*=\"sixteen wide widescreen\"].column,.ui.grid>[class*=\"sixteen wide widescreen\"].column{width:100%!important}}.ui.centered.grid,.ui.centered.grid>.row,.ui.grid>.centered.row{text-align:center;justify-content:center}.ui.centered.grid>.column:not(.aligned):not(.justified):not(.row),.ui.centered.grid>.row>.column:not(.aligned):not(.justified),.ui.grid .centered.row>.column:not(.aligned):not(.justified){text-align:left}.ui.grid>.centered.column,.ui.grid>.row>.centered.column{display:block;margin-left:auto;margin-right:auto}.ui.grid>.relaxed.row>.column,.ui.relaxed.grid>.column:not(.row),.ui.relaxed.grid>.row>.column{padding-left:1.5rem;padding-right:1.5rem}.ui.grid>[class*=\"very relaxed\"].row>.column,.ui[class*=\"very relaxed\"].grid>.column:not(.row),.ui[class*=\"very relaxed\"].grid>.row>.column{padding-left:2.5rem;padding-right:2.5rem}.ui.grid .relaxed.row+.ui.divider,.ui.relaxed.grid .row+.ui.divider{margin-left:1.5rem;margin-right:1.5rem}.ui.grid [class*=\"very relaxed\"].row+.ui.divider,.ui[class*=\"very relaxed\"].grid .row+.ui.divider{margin-left:2.5rem;margin-right:2.5rem}.ui.padded.grid:not(.vertically):not(.horizontally){margin:0!important}[class*=\"horizontally padded\"].ui.grid{margin-left:0!important;margin-right:0!important}[class*=\"vertically padded\"].ui.grid{margin-top:0!important;margin-bottom:0!important}.ui.grid [class*=\"left floated\"].column{margin-right:auto}.ui.grid [class*=\"right floated\"].column{margin-left:auto}.ui.divided.grid:not([class*=\"vertically divided\"])>.column:not(.row),.ui.divided.grid:not([class*=\"vertically divided\"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"vertically divided\"].grid>.column:not(.row),.ui[class*=\"vertically divided\"].grid>.row>.column{margin-top:1rem;margin-bottom:1rem;padding-top:0;padding-bottom:0}.ui[class*=\"vertically divided\"].grid>.row{margin-top:0;margin-bottom:0}.ui.divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui.divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"vertically divided\"].grid>.row:first-child>.column{margin-top:0}.ui.grid>.divided.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui.grid>.divided.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"vertically divided\"].grid>.row{position:relative}.ui[class*=\"vertically divided\"].grid>.row:before{position:absolute;content:\"\";top:0;left:0;width:calc(100% - 2rem);height:1px;margin:0 1rem;-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.padded.divided.grid:not(.vertically):not(.horizontally),[class*=\"horizontally padded\"].ui.divided.grid{width:100%}.ui[class*=\"vertically divided\"].grid>.row:first-child:before{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.column:not(.row),.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(255,255,255,.1);box-shadow:-1px 0 0 0 rgba(255,255,255,.1)}.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.column:not(.row):first-child,.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.inverted[class*=\"vertically divided\"].grid>.row:before{-webkit-box-shadow:0 -1px 0 0 rgba(255,255,255,.1);box-shadow:0 -1px 0 0 rgba(255,255,255,.1)}.ui.relaxed[class*=\"vertically divided\"].grid>.row:before{margin-left:1.5rem;margin-right:1.5rem;width:calc(100% - 3rem)}.ui[class*=\"very relaxed\"][class*=\"vertically divided\"].grid>.row:before{margin-left:5rem;margin-right:5rem;width:calc(100% - 5rem)}.ui.celled.grid{width:100%;margin:1em 0;-webkit-box-shadow:0 0 0 1px #d4d4d5;box-shadow:0 0 0 1px #d4d4d5}.ui.celled.grid>.row{width:100%!important;margin:0;padding:0;-webkit-box-shadow:0 -1px 0 0 #d4d4d5;box-shadow:0 -1px 0 0 #d4d4d5}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui.celled.grid>.column:first-child,.ui.celled.grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{padding:1em}.ui.relaxed.celled.grid>.column:not(.row),.ui.relaxed.celled.grid>.row>.column{padding:1.5em}.ui[class*=\"very relaxed\"].celled.grid>.column:not(.row),.ui[class*=\"very relaxed\"].celled.grid>.row>.column{padding:2em}.ui[class*=\"internally celled\"].grid{-webkit-box-shadow:none;box-shadow:none;margin:0}.ui[class*=\"internally celled\"].grid>.row:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"internally celled\"].grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid>.row>[class*=\"top aligned\"].column,.ui.grid>[class*=\"top aligned\"].column:not(.row),.ui.grid>[class*=\"top aligned\"].row>.column,.ui[class*=\"top aligned\"].grid>.column:not(.row),.ui[class*=\"top aligned\"].grid>.row>.column{flex-direction:column;vertical-align:top;align-self:flex-start!important}.ui.grid>.row>[class*=\"middle aligned\"].column,.ui.grid>[class*=\"middle aligned\"].column:not(.row),.ui.grid>[class*=\"middle aligned\"].row>.column,.ui[class*=\"middle aligned\"].grid>.column:not(.row),.ui[class*=\"middle aligned\"].grid>.row>.column{flex-direction:column;vertical-align:middle;align-self:center!important}.ui.grid>.row>[class*=\"bottom aligned\"].column,.ui.grid>[class*=\"bottom aligned\"].column:not(.row),.ui.grid>[class*=\"bottom aligned\"].row>.column,.ui[class*=\"bottom aligned\"].grid>.column:not(.row),.ui[class*=\"bottom aligned\"].grid>.row>.column{flex-direction:column;vertical-align:bottom;align-self:flex-end!important}.ui.grid>.row>.stretched.column,.ui.grid>.stretched.column:not(.row),.ui.grid>.stretched.row>.column,.ui.stretched.grid>.column,.ui.stretched.grid>.row>.column{display:inline-flex!important;align-self:stretch;flex-direction:column}.ui.grid>.row>.stretched.column>*,.ui.grid>.stretched.column:not(.row)>*,.ui.grid>.stretched.row>.column>*,.ui.stretched.grid>.column>*,.ui.stretched.grid>.row>.column>*{flex-grow:1}.ui.grid>.row>[class*=\"left aligned\"].column.column,.ui.grid>[class*=\"left aligned\"].column.column,.ui.grid>[class*=\"left aligned\"].row>.column,.ui[class*=\"left aligned\"].grid>.column,.ui[class*=\"left aligned\"].grid>.row>.column{text-align:left;align-self:inherit}.ui.grid>.row>[class*=\"center aligned\"].column.column,.ui.grid>[class*=\"center aligned\"].column.column,.ui.grid>[class*=\"center aligned\"].row>.column,.ui[class*=\"center aligned\"].grid>.column,.ui[class*=\"center aligned\"].grid>.row>.column{text-align:center;align-self:inherit}.ui[class*=\"center aligned\"].grid{justify-content:center}.ui.grid>.row>[class*=\"right aligned\"].column.column,.ui.grid>[class*=\"right aligned\"].column.column,.ui.grid>[class*=\"right aligned\"].row>.column,.ui[class*=\"right aligned\"].grid>.column,.ui[class*=\"right aligned\"].grid>.row>.column{text-align:right;align-self:inherit}.ui.grid>.justified.column.column,.ui.grid>.justified.row>.column,.ui.grid>.row>.justified.column.column,.ui.justified.grid>.column,.ui.justified.grid>.row>.column{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.ui.grid>.row>.black.column,.ui.grid>.row>.blue.column,.ui.grid>.row>.brown.column,.ui.grid>.row>.green.column,.ui.grid>.row>.grey.column,.ui.grid>.row>.olive.column,.ui.grid>.row>.orange.column,.ui.grid>.row>.pink.column,.ui.grid>.row>.purple.column,.ui.grid>.row>.red.column,.ui.grid>.row>.teal.column,.ui.grid>.row>.violet.column,.ui.grid>.row>.yellow.column{margin-top:-1rem;margin-bottom:-1rem;padding-top:1rem;padding-bottom:1rem}.ui.grid>.red.column,.ui.grid>.red.row,.ui.grid>.row>.red.column{background-color:#db2828!important;color:#fff}.ui.grid>.orange.column,.ui.grid>.orange.row,.ui.grid>.row>.orange.column{background-color:#f2711c!important;color:#fff}.ui.grid>.row>.yellow.column,.ui.grid>.yellow.column,.ui.grid>.yellow.row{background-color:#fbbd08!important;color:#fff}.ui.grid>.olive.column,.ui.grid>.olive.row,.ui.grid>.row>.olive.column{background-color:#b5cc18!important;color:#fff}.ui.grid>.green.column,.ui.grid>.green.row,.ui.grid>.row>.green.column{background-color:#21ba45!important;color:#fff}.ui.grid>.row>.teal.column,.ui.grid>.teal.column,.ui.grid>.teal.row{background-color:#00b5ad!important;color:#fff}.ui.grid>.blue.column,.ui.grid>.blue.row,.ui.grid>.row>.blue.column{background-color:#2185d0!important;color:#fff}.ui.grid>.row>.violet.column,.ui.grid>.violet.column,.ui.grid>.violet.row{background-color:#6435c9!important;color:#fff}.ui.grid>.purple.column,.ui.grid>.purple.row,.ui.grid>.row>.purple.column{background-color:#a333c8!important;color:#fff}.ui.grid>.pink.column,.ui.grid>.pink.row,.ui.grid>.row>.pink.column{background-color:#e03997!important;color:#fff}.ui.grid>.brown.column,.ui.grid>.brown.row,.ui.grid>.row>.brown.column{background-color:#a5673f!important;color:#fff}.ui.grid>.grey.column,.ui.grid>.grey.row,.ui.grid>.row>.grey.column{background-color:#767676!important;color:#fff}.ui.grid>.black.column,.ui.grid>.black.row,.ui.grid>.row>.black.column{background-color:#1b1c1d!important;color:#fff}.ui.grid>[class*=\"equal width\"].row>.column,.ui[class*=\"equal width\"].grid>.column:not(.row),.ui[class*=\"equal width\"].grid>.row>.column{display:inline-block;flex-grow:1}.ui.grid>[class*=\"equal width\"].row>.wide.column,.ui[class*=\"equal width\"].grid>.row>.wide.column,.ui[class*=\"equal width\"].grid>.wide.column{flex-grow:0}@media only screen and (max-width:767px){.ui.grid>[class*=\"mobile reversed\"].row,.ui[class*=\"mobile reversed\"].grid,.ui[class*=\"mobile reversed\"].grid>.row{flex-direction:row-reverse}.ui.stackable[class*=\"mobile reversed\"],.ui[class*=\"mobile vertically reversed\"].grid{flex-direction:column-reverse}.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:last-child,.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"mobile reversed\"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*=\"mobile reversed\"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991px){.ui.grid>[class*=\"tablet reversed\"].row,.ui[class*=\"tablet reversed\"].grid,.ui[class*=\"tablet reversed\"].grid>.row{flex-direction:row-reverse}.ui[class*=\"tablet vertically reversed\"].grid{flex-direction:column-reverse}.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:last-child,.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"tablet reversed\"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*=\"tablet reversed\"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:992px){.ui.grid>[class*=\"computer reversed\"].row,.ui[class*=\"computer reversed\"].grid,.ui[class*=\"computer reversed\"].grid>.row{flex-direction:row-reverse}.ui[class*=\"computer vertically reversed\"].grid{flex-direction:column-reverse}.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:last-child,.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"computer reversed\"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*=\"computer reversed\"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991px){.ui.doubling.grid{width:auto}.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{display:inline-block!important;padding-top:1rem!important;padding-bottom:1rem!important;-webkit-box-shadow:none!important;box-shadow:none!important;margin:0}.ui.grid>[class*=\"two column\"].doubling.row.row>.column,.ui[class*=\"two column\"].doubling.grid>.column:not(.row),.ui[class*=\"two column\"].doubling.grid>.row>.column{width:100%!important}.ui.grid>[class*=\"three column\"].doubling.row.row>.column,.ui[class*=\"three column\"].doubling.grid>.column:not(.row),.ui[class*=\"three column\"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*=\"four column\"].doubling.row.row>.column,.ui[class*=\"four column\"].doubling.grid>.column:not(.row),.ui[class*=\"four column\"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*=\"five column\"].doubling.row.row>.column,.ui[class*=\"five column\"].doubling.grid>.column:not(.row),.ui[class*=\"five column\"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"six column\"].doubling.row.row>.column,.ui[class*=\"six column\"].doubling.grid>.column:not(.row),.ui[class*=\"six column\"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"seven column\"].doubling.row.row>.column,.ui[class*=\"seven column\"].doubling.grid>.column:not(.row),.ui[class*=\"seven column\"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"eight column\"].doubling.row.row>.column,.ui[class*=\"eight column\"].doubling.grid>.column:not(.row),.ui[class*=\"eight column\"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*=\"nine column\"].doubling.row.row>.column,.ui[class*=\"nine column\"].doubling.grid>.column:not(.row),.ui[class*=\"nine column\"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*=\"ten column\"].doubling.row.row>.column,.ui[class*=\"ten column\"].doubling.grid>.column:not(.row),.ui[class*=\"ten column\"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*=\"eleven column\"].doubling.row.row>.column,.ui[class*=\"eleven column\"].doubling.grid>.column:not(.row),.ui[class*=\"eleven column\"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*=\"twelve column\"].doubling.row.row>.column,.ui[class*=\"twelve column\"].doubling.grid>.column:not(.row),.ui[class*=\"twelve column\"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*=\"thirteen column\"].doubling.row.row>.column,.ui[class*=\"thirteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"thirteen column\"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*=\"fourteen column\"].doubling.row.row>.column,.ui[class*=\"fourteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"fourteen column\"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*=\"fifteen column\"].doubling.row.row>.column,.ui[class*=\"fifteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"fifteen column\"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*=\"sixteen column\"].doubling.row.row>.column,.ui[class*=\"sixteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"sixteen column\"].doubling.grid>.row>.column{width:12.5%!important}}@media only screen and (max-width:767px){.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{padding-top:1rem!important;padding-bottom:1rem!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.grid>[class*=\"two column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"two column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"two column\"].doubling:not(.stackable).grid>.row>.column{width:100%!important}.ui.grid>[class*=\"three column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"three column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"three column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"four column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"four column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"four column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"five column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"five column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"five column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"six column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"six column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"six column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"seven column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"seven column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"seven column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"eight column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"eight column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"eight column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"nine column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"nine column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"nine column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"ten column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"ten column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"ten column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"eleven column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"eleven column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"eleven column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"twelve column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"twelve column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"twelve column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"thirteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"thirteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"thirteen column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"fourteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"fourteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"fourteen column\"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*=\"fifteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"fifteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"fifteen column\"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*=\"sixteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"sixteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"sixteen column\"].doubling:not(.stackable).grid>.row>.column{width:25%!important}}@media only screen and (max-width:767px){.ui.stackable.grid{width:auto;margin-left:0!important;margin-right:0!important}.ui.grid>.stackable.stackable.row>.column,.ui.stackable.grid>.column.grid>.column,.ui.stackable.grid>.column.row>.column,.ui.stackable.grid>.column:not(.row),.ui.stackable.grid>.row>.column,.ui.stackable.grid>.row>.wide.column,.ui.stackable.grid>.wide.column{width:100%!important;margin:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;padding:1rem 1rem!important}.ui.stackable.grid:not(.vertically)>.row{margin:0;padding:0}.ui.container>.ui.stackable.grid>.column,.ui.container>.ui.stackable.grid>.row>.column{padding-left:0!important;padding-right:0!important}.ui.grid .ui.stackable.grid,.ui.segment:not(.vertical) .ui.stackable.page.grid{margin-left:-1rem!important;margin-right:-1rem!important}.ui.stackable.celled.grid>.column:not(.row):first-child,.ui.stackable.celled.grid>.row:first-child>.column:first-child,.ui.stackable.divided.grid>.column:not(.row):first-child,.ui.stackable.divided.grid>.row:first-child>.column:first-child{border-top:none!important}.ui.inverted.stackable.celled.grid>.column:not(.row),.ui.inverted.stackable.celled.grid>.row>.column,.ui.inverted.stackable.divided.grid>.column:not(.row),.ui.inverted.stackable.divided.grid>.row>.column{border-top:1px solid rgba(255,255,255,.1)}.ui.stackable.celled.grid>.column:not(.row),.ui.stackable.celled.grid>.row>.column,.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{border-top:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none!important;box-shadow:none!important;padding-top:2rem!important;padding-bottom:2rem!important}.ui.stackable.celled.grid>.row{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{padding-left:0!important;padding-right:0!important}}@media only screen and (max-width:767px){.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.mobile),.ui[class*=\"tablet only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"computer only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"computer only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"computer only\"].row:not(.mobile),.ui[class*=\"computer only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].row:not(.mobile),.ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.tablet),.ui[class*=\"mobile only\"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*=\"computer only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"computer only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"computer only\"].row:not(.tablet),.ui[class*=\"computer only\"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].row:not(.mobile),.ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.computer),.ui[class*=\"mobile only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.computer),.ui[class*=\"tablet only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].row:not(.mobile),.ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.computer),.ui[class*=\"mobile only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.computer),.ui[class*=\"tablet only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1920px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.computer),.ui[class*=\"mobile only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.computer),.ui[class*=\"tablet only\"].grid.grid.grid:not(.computer){display:none!important}}.ui.menu{display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;font-weight:400;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:flex}.ui.menu:not(.vertical) .item{display:flex;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;flex:0 0 auto;-webkit-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:flex;align-items:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:'';text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0!important}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:\"\\f0da\";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{left:100%;min-width:0;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label{background:#999;color:#fff;margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{background:#999;color:#fff;margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.menu .list .item:before{background:0 0!important}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;-webkit-box-shadow:none;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.menu .item.disabled,.ui.menu .item.disabled:hover{cursor:default!important;background-color:transparent!important;color:rgba(40,40,40,.3)!important}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) :not(.dropdown)>.left.menu{display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:flex;margin-left:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.vertical.menu{display:block;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>.label{float:right;text-align:center}.ui.vertical.menu .item>i.icon{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;-webkit-box-shadow:none;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-top:1px solid #d4d4d5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:1px solid #d4d4d5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #d4d4d5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{align-self:center;-webkit-box-shadow:none;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none transparent}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item,.ui.secondary.inverted.menu a.item{color:rgba(255,255,255,.7)!important}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff!important}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-color:#1b1c1d;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:#1b1c1d;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:#1b1c1d}.ui.secondary.inverted.pointing.menu{border-color:rgba(255,255,255,.1)}.ui.secondary.inverted.pointing.menu{border-width:2px;border-color:rgba(34,36,38,.15)}.ui.secondary.inverted.pointing.menu .item{color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#fff!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:rgba(0,0,0,.95)}.ui.secondary.inverted.pointing.menu .active.item{border-color:#fff;color:#fff}.ui.text.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;align-self:center;margin:0 0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent!important}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1b1c1d}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#fff}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;flex-direction:column}.ui.labeled.icon.menu .item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767px){.ui.stackable.menu{flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}.ui.stackable.menu .left.menu,.ui.stackable.menu .right.menu{flex-direction:column}}.ui.menu .red.active.item,.ui.red.menu .active.item{border-color:#db2828!important;color:#db2828!important}.ui.menu .orange.active.item,.ui.orange.menu .active.item{border-color:#f2711c!important;color:#f2711c!important}.ui.menu .yellow.active.item,.ui.yellow.menu .active.item{border-color:#fbbd08!important;color:#fbbd08!important}.ui.menu .olive.active.item,.ui.olive.menu .active.item{border-color:#b5cc18!important;color:#b5cc18!important}.ui.green.menu .active.item,.ui.menu .green.active.item{border-color:#21ba45!important;color:#21ba45!important}.ui.menu .teal.active.item,.ui.teal.menu .active.item{border-color:#00b5ad!important;color:#00b5ad!important}.ui.blue.menu .active.item,.ui.menu .blue.active.item{border-color:#2185d0!important;color:#2185d0!important}.ui.menu .violet.active.item,.ui.violet.menu .active.item{border-color:#6435c9!important;color:#6435c9!important}.ui.menu .purple.active.item,.ui.purple.menu .active.item{border-color:#a333c8!important;color:#a333c8!important}.ui.menu .pink.active.item,.ui.pink.menu .active.item{border-color:#e03997!important;color:#e03997!important}.ui.brown.menu .active.item,.ui.menu .brown.active.item{border-color:#a5673f!important;color:#a5673f!important}.ui.grey.menu .active.item,.ui.menu .grey.active.item{border-color:#767676!important;color:#767676!important}.ui.inverted.menu{border:0 solid transparent;background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item.disabled,.ui.inverted.menu .item.disabled:hover{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#fff}.ui.inverted.pointing.menu .active.item:after{background:#3d3e3f!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3d3e3f!important}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.inverted.menu .red.active.item,.ui.inverted.red.menu{background-color:#db2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .orange.active.item,.ui.inverted.orange.menu{background-color:#f2711c}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .yellow.active.item,.ui.inverted.yellow.menu{background-color:#fbbd08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .olive.active.item,.ui.inverted.olive.menu{background-color:#b5cc18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.green.menu,.ui.inverted.menu .green.active.item{background-color:#21ba45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .teal.active.item,.ui.inverted.teal.menu{background-color:#00b5ad}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.blue.menu,.ui.inverted.menu .blue.active.item{background-color:#2185d0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .violet.active.item,.ui.inverted.violet.menu{background-color:#6435c9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .purple.active.item,.ui.inverted.purple.menu{background-color:#a333c8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .pink.active.item,.ui.inverted.pink.menu{background-color:#e03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.brown.menu,.ui.inverted.menu .brown.active.item{background-color:#a5673f}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.grey.menu,.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:inline-block}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu{width:auto!important}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;justify-content:center}.ui.attached.item.menu{margin:0 -1px!important}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*=\"top fixed\"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*=\"top fixed\"].menu{border-top:none;border-left:none;border-right:none}.ui[class*=\"right fixed\"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*=\"bottom fixed\"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*=\"left fixed\"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #d4d4d5;border-right:1px solid #d4d4d5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #d4d4d5;border-right:1px solid #d4d4d5}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#fff}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*=\"top attached\"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*=\"top attached\"]:first-child{margin-top:0}.ui[class*=\"bottom attached\"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"bottom attached\"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #d4d4d5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.mini.menu{font-size:.78571429rem}.ui.mini.vertical.menu{width:9rem}.ui.tiny.menu{font-size:.85714286rem}.ui.tiny.vertical.menu{width:11rem}.ui.small.menu{font-size:.92857143rem}.ui.small.vertical.menu{width:13rem}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.large.menu{font-size:1.07142857rem}.ui.large.vertical.menu{width:18rem}.ui.huge.menu{font-size:1.21428571rem}.ui.huge.vertical.menu{width:22rem}.ui.big.menu{font-size:1.14285714rem}.ui.big.vertical.menu{width:20rem}.ui.massive.menu{font-size:1.28571429rem}.ui.massive.vertical.menu{width:25rem}/*!\n * # Semantic UI 2.4.0 - Message\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.message{position:relative;min-height:1em;margin:1em 0;background:#f8f8f9;padding:1em 1.5em;line-height:1.4285em;color:rgba(0,0,0,.87);-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent;box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent}.ui.message:first-child{margin-top:0}.ui.message:last-child{margin-bottom:0}.ui.message .header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;margin:-.14285714em 0 0 0}.ui.message .header:not(.ui){font-size:1.14285714em}.ui.message p{opacity:.85;margin:.75em 0}.ui.message p:first-child{margin-top:0}.ui.message p:last-child{margin-bottom:0}.ui.message .header+p{margin-top:.25em}.ui.message .list:not(.ui){text-align:left;padding:0;opacity:.85;list-style-position:inside;margin:.5em 0 0}.ui.message .list:not(.ui):first-child{margin-top:0}.ui.message .list:not(.ui):last-child{margin-bottom:0}.ui.message .list:not(.ui) li{position:relative;list-style-type:none;margin:0 0 .3em 1em;padding:0}.ui.message .list:not(.ui) li:before{position:absolute;content:'•';left:-1em;height:100%;vertical-align:baseline}.ui.message .list:not(.ui) li:last-child{margin-bottom:0}.ui.message>.icon{margin-right:.6em}.ui.message>.close.icon{cursor:pointer;position:absolute;margin:0;top:.78575em;right:.5em;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.message>.close.icon:hover{opacity:1}.ui.message>:first-child{margin-top:0}.ui.message>:last-child{margin-bottom:0}.ui.dropdown .menu>.message{margin:0 -1px}.ui.visible.visible.visible.visible.message{display:block}.ui.icon.visible.visible.visible.visible.message{display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.compact.icon.message{display:inline-flex}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;margin-left:-1px;margin-right:-1px}.ui.attached+.ui.attached.message:not(.top):not(.bottom){margin-top:-1px;border-radius:0}.ui.bottom.attached.message{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15)}.ui.bottom.attached.message:not(:last-child){margin-bottom:1em}.ui.attached.icon.message{width:auto}.ui.icon.message{display:flex;width:100%;align-items:center}.ui.icon.message>.icon:not(.close){display:block;flex:0 0 auto;width:auto;line-height:1;vertical-align:middle;font-size:3em;opacity:.8}.ui.icon.message>.content{display:block;flex:1 1 auto;vertical-align:middle}.ui.icon.message .icon:not(.close)+.content{padding-left:0}.ui.icon.message .circular.icon{width:1em}.ui.floating.message{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.black.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.positive.message{background-color:#fcfff5;color:#2c662d}.ui.attached.positive.message,.ui.positive.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent}.ui.positive.message .header{color:#1a531b}.ui.negative.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.negative.message,.ui.negative.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent}.ui.negative.message .header{color:#912d2b}.ui.info.message{background-color:#f8ffff;color:#276f86}.ui.attached.info.message,.ui.info.message{-webkit-box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent}.ui.info.message .header{color:#0e566c}.ui.warning.message{background-color:#fffaf3;color:#573a08}.ui.attached.warning.message,.ui.warning.message{-webkit-box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent}.ui.warning.message .header{color:#794b02}.ui.error.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.error.message,.ui.error.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent}.ui.error.message .header{color:#912d2b}.ui.success.message{background-color:#fcfff5;color:#2c662d}.ui.attached.success.message,.ui.success.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent}.ui.success.message .header{color:#1a531b}.ui.black.message,.ui.inverted.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.red.message{background-color:#ffe8e6;color:#db2828;-webkit-box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent}.ui.red.message .header{color:#c82121}.ui.orange.message{background-color:#ffedde;color:#f2711c;-webkit-box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent}.ui.orange.message .header{color:#e7640d}.ui.yellow.message{background-color:#fff8db;color:#b58105;-webkit-box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent}.ui.yellow.message .header{color:#9c6f04}.ui.olive.message{background-color:#fbfdef;color:#8abc1e;-webkit-box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent}.ui.olive.message .header{color:#7aa61a}.ui.green.message{background-color:#e5f9e7;color:#1ebc30;-webkit-box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent}.ui.green.message .header{color:#1aa62a}.ui.teal.message{background-color:#e1f7f7;color:#10a3a3;-webkit-box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent}.ui.teal.message .header{color:#0e8c8c}.ui.blue.message{background-color:#dff0ff;color:#2185d0;-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent}.ui.blue.message .header{color:#1e77ba}.ui.violet.message{background-color:#eae7ff;color:#6435c9;-webkit-box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent}.ui.violet.message .header{color:#5a30b5}.ui.purple.message{background-color:#f6e7ff;color:#a333c8;-webkit-box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent}.ui.purple.message .header{color:#922eb4}.ui.pink.message{background-color:#ffe3fb;color:#e03997;-webkit-box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent}.ui.pink.message .header{color:#dd238b}.ui.brown.message{background-color:#f1e2d3;color:#a5673f;-webkit-box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent}.ui.brown.message .header{color:#935b38}.ui.mini.message{font-size:.78571429em}.ui.tiny.message{font-size:.85714286em}.ui.small.message{font-size:.92857143em}.ui.message{font-size:1em}.ui.large.message{font-size:1.14285714em}.ui.big.message{font-size:1.28571429em}.ui.huge.message{font-size:1.42857143em}.ui.massive.message{font-size:1.71428571em}/*!\n * # Semantic UI 2.4.0 - Table\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.table{width:100%;background:#fff;margin:1em 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem;text-align:left;color:rgba(0,0,0,.87);border-collapse:separate;border-spacing:0}.ui.table:first-child{margin-top:0}.ui.table:last-child{margin-bottom:0}.ui.table td,.ui.table th{-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.table thead{-webkit-box-shadow:none;box-shadow:none}.ui.table thead th{cursor:auto;background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.92857143em .78571429em;vertical-align:inherit;font-style:none;font-weight:700;text-transform:none;border-bottom:1px solid rgba(34,36,38,.1);border-left:none}.ui.table thead tr>th:first-child{border-left:none}.ui.table thead tr:first-child>th:first-child{border-radius:.28571429rem 0 0 0}.ui.table thead tr:first-child>th:last-child{border-radius:0 .28571429rem 0 0}.ui.table thead tr:first-child>th:only-child{border-radius:.28571429rem .28571429rem 0 0}.ui.table tfoot{-webkit-box-shadow:none;box-shadow:none}.ui.table tfoot th{cursor:auto;border-top:1px solid rgba(34,36,38,.15);background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.78571429em .78571429em;vertical-align:middle;font-style:normal;font-weight:400;text-transform:none}.ui.table tfoot tr>th:first-child{border-left:none}.ui.table tfoot tr:first-child>th:first-child{border-radius:0 0 0 .28571429rem}.ui.table tfoot tr:first-child>th:last-child{border-radius:0 0 .28571429rem 0}.ui.table tfoot tr:first-child>th:only-child{border-radius:0 0 .28571429rem .28571429rem}.ui.table tr td{border-top:1px solid rgba(34,36,38,.1)}.ui.table tr:first-child td{border-top:none}.ui.table tbody+tbody tr:first-child td{border-top:1px solid rgba(34,36,38,.1)}.ui.table td{padding:.78571429em .78571429em;text-align:inherit}.ui.table>.icon{vertical-align:baseline}.ui.table>.icon:only-child{margin:0}.ui.table.segment{padding:0}.ui.table.segment:after{display:none}.ui.table.segment.stacked:after{display:block}@media only screen and (max-width:767px){.ui.table:not(.unstackable){width:100%}.ui.table:not(.unstackable) tbody,.ui.table:not(.unstackable) tr,.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{width:auto!important;display:block!important}.ui.table:not(.unstackable){padding:0}.ui.table:not(.unstackable) thead{display:block}.ui.table:not(.unstackable) tfoot{display:block}.ui.table:not(.unstackable) tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important}.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{background:0 0;border:none!important;padding:.25em .75em!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.table:not(.unstackable) td:first-child,.ui.table:not(.unstackable) th:first-child{font-weight:700}.ui.definition.table:not(.unstackable) thead th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.table td .image,.ui.table td .image img,.ui.table th .image,.ui.table th .image img{max-width:none}.ui.structured.table{border-collapse:collapse}.ui.structured.table thead th{border-left:none;border-right:none}.ui.structured.sortable.table thead th{border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(34,36,38,.15)}.ui.structured.basic.table th{border-left:none;border-right:none}.ui.structured.celled.table tr td,.ui.structured.celled.table tr th{border-left:1px solid rgba(34,36,38,.1);border-right:1px solid rgba(34,36,38,.1)}.ui.definition.table thead:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-1px -1px 0 1px #fff;box-shadow:-1px -1px 0 1px #fff}.ui.definition.table tfoot:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:rgba(0,0,0,.4);color:normal;-webkit-box-shadow:1px 1px 0 1px #fff;box-shadow:1px 1px 0 1px #fff}.ui.celled.definition.table thead:not(.full-width) th:first-child{-webkit-box-shadow:0 -1px 0 1px #fff;box-shadow:0 -1px 0 1px #fff}.ui.celled.definition.table tfoot:not(.full-width) th:first-child{-webkit-box-shadow:0 1px 0 1px #fff;box-shadow:0 1px 0 1px #fff}.ui.definition.table tr td.definition,.ui.definition.table tr td:first-child:not(.ignored){background:rgba(0,0,0,.03);font-weight:700;color:rgba(0,0,0,.95);text-transform:'';-webkit-box-shadow:'';box-shadow:'';text-align:'';font-size:1em;padding-left:'';padding-right:''}.ui.definition.table thead:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table tfoot:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table td:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.table td.positive,.ui.table tr.positive{-webkit-box-shadow:0 0 0 #a3c293 inset;box-shadow:0 0 0 #a3c293 inset}.ui.table td.positive,.ui.table tr.positive{background:#fcfff5!important;color:#2c662d!important}.ui.table td.negative,.ui.table tr.negative{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset}.ui.table td.negative,.ui.table tr.negative{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.error,.ui.table tr.error{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset}.ui.table td.error,.ui.table tr.error{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.warning,.ui.table tr.warning{-webkit-box-shadow:0 0 0 #c9ba9b inset;box-shadow:0 0 0 #c9ba9b inset}.ui.table td.warning,.ui.table tr.warning{background:#fffaf3!important;color:#573a08!important}.ui.table td.active,.ui.table tr.active{-webkit-box-shadow:0 0 0 rgba(0,0,0,.87) inset;box-shadow:0 0 0 rgba(0,0,0,.87) inset}.ui.table td.active,.ui.table tr.active{background:#e0e0e0!important;color:rgba(0,0,0,.87)!important}.ui.table tr td.disabled,.ui.table tr.disabled td,.ui.table tr.disabled:hover,.ui.table tr:hover td.disabled{pointer-events:none;color:rgba(40,40,40,.3)}@media only screen and (max-width:991px){.ui[class*=\"tablet stackable\"].table,.ui[class*=\"tablet stackable\"].table tbody,.ui[class*=\"tablet stackable\"].table tr,.ui[class*=\"tablet stackable\"].table tr>td,.ui[class*=\"tablet stackable\"].table tr>th{width:100%!important;display:block!important}.ui[class*=\"tablet stackable\"].table{padding:0}.ui[class*=\"tablet stackable\"].table thead{display:block}.ui[class*=\"tablet stackable\"].table tfoot{display:block}.ui[class*=\"tablet stackable\"].table tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important}.ui[class*=\"tablet stackable\"].table tr>td,.ui[class*=\"tablet stackable\"].table tr>th{background:0 0;border:none!important;padding:.25em .75em;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.definition[class*=\"tablet stackable\"].table thead th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.table [class*=\"left aligned\"],.ui.table[class*=\"left aligned\"]{text-align:left}.ui.table [class*=\"center aligned\"],.ui.table[class*=\"center aligned\"]{text-align:center}.ui.table [class*=\"right aligned\"],.ui.table[class*=\"right aligned\"]{text-align:right}.ui.table [class*=\"top aligned\"],.ui.table[class*=\"top aligned\"]{vertical-align:top}.ui.table [class*=\"middle aligned\"],.ui.table[class*=\"middle aligned\"]{vertical-align:middle}.ui.table [class*=\"bottom aligned\"],.ui.table[class*=\"bottom aligned\"]{vertical-align:bottom}.ui.table td.collapsing,.ui.table th.collapsing{width:1px;white-space:nowrap}.ui.fixed.table{table-layout:fixed}.ui.fixed.table td,.ui.fixed.table th{overflow:hidden;text-overflow:ellipsis}.ui.selectable.table tbody tr:hover,.ui.table tbody tr td.selectable:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.inverted.table tbody tr td.selectable:hover,.ui.selectable.inverted.table tbody tr:hover{background:rgba(255,255,255,.08)!important;color:#fff!important}.ui.table tbody tr td.selectable{padding:0}.ui.table tbody tr td.selectable>a:not(.ui){display:block;color:inherit;padding:.78571429em .78571429em}.ui.selectable.table tr.error:hover,.ui.selectable.table tr:hover td.error,.ui.table tr td.selectable.error:hover{background:#ffe7e7!important;color:#943634!important}.ui.selectable.table tr.warning:hover,.ui.selectable.table tr:hover td.warning,.ui.table tr td.selectable.warning:hover{background:#fff4e4!important;color:#493107!important}.ui.selectable.table tr.active:hover,.ui.selectable.table tr:hover td.active,.ui.table tr td.selectable.active:hover{background:#e0e0e0!important;color:rgba(0,0,0,.87)!important}.ui.selectable.table tr.positive:hover,.ui.selectable.table tr:hover td.positive,.ui.table tr td.selectable.positive:hover{background:#f7ffe6!important;color:#275b28!important}.ui.selectable.table tr.negative:hover,.ui.selectable.table tr:hover td.negative,.ui.table tr td.selectable.negative:hover{background:#ffe7e7!important;color:#943634!important}.ui.attached.table{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached+.ui.attached.table:not(.top){border-top:none}.ui[class*=\"top attached\"].table{bottom:0;margin-bottom:0;top:0;margin-top:1em;border-radius:.28571429rem .28571429rem 0 0}.ui.table[class*=\"top attached\"]:first-child{margin-top:0}.ui[class*=\"bottom attached\"].table{bottom:0;margin-top:0;top:0;margin-bottom:1em;-webkit-box-shadow:none,none;box-shadow:none,none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"bottom attached\"].table:last-child{margin-bottom:0}.ui.striped.table tbody tr:nth-child(2n),.ui.striped.table>tr:nth-child(2n){background-color:rgba(0,0,50,.02)}.ui.inverted.striped.table tbody tr:nth-child(2n),.ui.inverted.striped.table>tr:nth-child(2n){background-color:rgba(255,255,255,.05)}.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover{background:#efefef!important;color:rgba(0,0,0,.95)!important}.ui.table [class*=\"single line\"],.ui.table[class*=\"single line\"]{white-space:nowrap}.ui.table [class*=\"single line\"],.ui.table[class*=\"single line\"]{white-space:nowrap}.ui.red.table{border-top:.2em solid #db2828}.ui.inverted.red.table{background-color:#db2828!important;color:#fff!important}.ui.orange.table{border-top:.2em solid #f2711c}.ui.inverted.orange.table{background-color:#f2711c!important;color:#fff!important}.ui.yellow.table{border-top:.2em solid #fbbd08}.ui.inverted.yellow.table{background-color:#fbbd08!important;color:#fff!important}.ui.olive.table{border-top:.2em solid #b5cc18}.ui.inverted.olive.table{background-color:#b5cc18!important;color:#fff!important}.ui.green.table{border-top:.2em solid #21ba45}.ui.inverted.green.table{background-color:#21ba45!important;color:#fff!important}.ui.teal.table{border-top:.2em solid #00b5ad}.ui.inverted.teal.table{background-color:#00b5ad!important;color:#fff!important}.ui.blue.table{border-top:.2em solid #2185d0}.ui.inverted.blue.table{background-color:#2185d0!important;color:#fff!important}.ui.violet.table{border-top:.2em solid #6435c9}.ui.inverted.violet.table{background-color:#6435c9!important;color:#fff!important}.ui.purple.table{border-top:.2em solid #a333c8}.ui.inverted.purple.table{background-color:#a333c8!important;color:#fff!important}.ui.pink.table{border-top:.2em solid #e03997}.ui.inverted.pink.table{background-color:#e03997!important;color:#fff!important}.ui.brown.table{border-top:.2em solid #a5673f}.ui.inverted.brown.table{background-color:#a5673f!important;color:#fff!important}.ui.grey.table{border-top:.2em solid #767676}.ui.inverted.grey.table{background-color:#767676!important;color:#fff!important}.ui.black.table{border-top:.2em solid #1b1c1d}.ui.inverted.black.table{background-color:#1b1c1d!important;color:#fff!important}.ui.one.column.table td{width:100%}.ui.two.column.table td{width:50%}.ui.three.column.table td{width:33.33333333%}.ui.four.column.table td{width:25%}.ui.five.column.table td{width:20%}.ui.six.column.table td{width:16.66666667%}.ui.seven.column.table td{width:14.28571429%}.ui.eight.column.table td{width:12.5%}.ui.nine.column.table td{width:11.11111111%}.ui.ten.column.table td{width:10%}.ui.eleven.column.table td{width:9.09090909%}.ui.twelve.column.table td{width:8.33333333%}.ui.thirteen.column.table td{width:7.69230769%}.ui.fourteen.column.table td{width:7.14285714%}.ui.fifteen.column.table td{width:6.66666667%}.ui.sixteen.column.table td{width:6.25%}.ui.table td.one.wide,.ui.table th.one.wide{width:6.25%}.ui.table td.two.wide,.ui.table th.two.wide{width:12.5%}.ui.table td.three.wide,.ui.table th.three.wide{width:18.75%}.ui.table td.four.wide,.ui.table th.four.wide{width:25%}.ui.table td.five.wide,.ui.table th.five.wide{width:31.25%}.ui.table td.six.wide,.ui.table th.six.wide{width:37.5%}.ui.table td.seven.wide,.ui.table th.seven.wide{width:43.75%}.ui.table td.eight.wide,.ui.table th.eight.wide{width:50%}.ui.table td.nine.wide,.ui.table th.nine.wide{width:56.25%}.ui.table td.ten.wide,.ui.table th.ten.wide{width:62.5%}.ui.table td.eleven.wide,.ui.table th.eleven.wide{width:68.75%}.ui.table td.twelve.wide,.ui.table th.twelve.wide{width:75%}.ui.table td.thirteen.wide,.ui.table th.thirteen.wide{width:81.25%}.ui.table td.fourteen.wide,.ui.table th.fourteen.wide{width:87.5%}.ui.table td.fifteen.wide,.ui.table th.fifteen.wide{width:93.75%}.ui.table td.sixteen.wide,.ui.table th.sixteen.wide{width:100%}.ui.sortable.table thead th{cursor:pointer;white-space:nowrap;border-left:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87)}.ui.sortable.table thead th:first-child{border-left:none}.ui.sortable.table thead th.sorted,.ui.sortable.table thead th.sorted:hover{-webkit-user-select:none;-ms-user-select:none;user-select:none}.ui.sortable.table thead th:after{display:none;font-style:normal;font-weight:400;text-decoration:inherit;content:'';height:1em;width:auto;opacity:.8;margin:0 0 0 .5em;font-family:Icons}.ui.sortable.table thead th.ascending:after{content:'\\f0d8'}.ui.sortable.table thead th.descending:after{content:'\\f0d7'}.ui.sortable.table th.disabled:hover{cursor:auto;color:rgba(40,40,40,.3)}.ui.sortable.table thead th:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8)}.ui.sortable.table thead th.sorted{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.sortable.table thead th.sorted:after{display:inline-block}.ui.sortable.table thead th.sorted:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.sortable.table thead th.sorted{background:rgba(255,255,255,.15) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.15) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.15) -webkit-gradient(linear,left top, left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.15) linear-gradient(transparent,rgba(0,0,0,.05));color:#fff}.ui.inverted.sortable.table thead th:hover{background:rgba(255,255,255,.08) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.08) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.08) -webkit-gradient(linear,left top, left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.08) linear-gradient(transparent,rgba(0,0,0,.05));color:#fff}.ui.inverted.sortable.table thead th{border-left-color:transparent;border-right-color:transparent}.ui.inverted.table{background:#333;color:rgba(255,255,255,.9);border:none}.ui.inverted.table th{background-color:rgba(0,0,0,.15);border-color:rgba(255,255,255,.1)!important;color:rgba(255,255,255,.9)!important}.ui.inverted.table tr td{border-color:rgba(255,255,255,.1)!important}.ui.inverted.table tr td.disabled,.ui.inverted.table tr.disabled td,.ui.inverted.table tr.disabled:hover td,.ui.inverted.table tr:hover td.disabled{pointer-events:none;color:rgba(225,225,225,.3)}.ui.inverted.definition.table tfoot:not(.full-width) th:first-child,.ui.inverted.definition.table thead:not(.full-width) th:first-child{background:#fff}.ui.inverted.definition.table tr td:first-child{background:rgba(255,255,255,.02);color:#fff}.ui.collapsing.table{width:auto}.ui.basic.table{background:0 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.table tfoot,.ui.basic.table thead{-webkit-box-shadow:none;box-shadow:none}.ui.basic.table th{background:0 0;border-left:none}.ui.basic.table tbody tr{border-bottom:1px solid rgba(0,0,0,.1)}.ui.basic.table td{background:0 0}.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.05)!important}.ui[class*=\"very basic\"].table{border:none}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td,.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th{padding:''}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td:first-child,.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th:first-child{padding-left:0}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td:last-child,.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th:last-child{padding-right:0}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) thead tr:first-child th{padding-top:0}.ui.celled.table tr td,.ui.celled.table tr th{border-left:1px solid rgba(34,36,38,.1)}.ui.celled.table tr td:first-child,.ui.celled.table tr th:first-child{border-left:none}.ui.padded.table th{padding-left:1em;padding-right:1em}.ui.padded.table td,.ui.padded.table th{padding:1em 1em}.ui[class*=\"very padded\"].table th{padding-left:1.5em;padding-right:1.5em}.ui[class*=\"very padded\"].table td{padding:1.5em 1.5em}.ui.compact.table th{padding-left:.7em;padding-right:.7em}.ui.compact.table td{padding:.5em .7em}.ui[class*=\"very compact\"].table th{padding-left:.6em;padding-right:.6em}.ui[class*=\"very compact\"].table td{padding:.4em .6em}.ui.small.table{font-size:.9em}.ui.table{font-size:1em}.ui.large.table{font-size:1.1em}/*!\n * # Semantic UI 2.4.0 - Ad\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Copyright 2013 Contributors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child{margin:0}.ui.ad:last-child{margin:0}.ui.ad iframe{margin:0;padding:0;border:none;overflow:hidden}.ui.leaderboard.ad{width:728px;height:90px}.ui[class*=\"medium rectangle\"].ad{width:300px;height:250px}.ui[class*=\"large rectangle\"].ad{width:336px;height:280px}.ui[class*=\"half page\"].ad{width:300px;height:600px}.ui.square.ad{width:250px;height:250px}.ui[class*=\"small square\"].ad{width:200px;height:200px}.ui[class*=\"small rectangle\"].ad{width:180px;height:150px}.ui[class*=\"vertical rectangle\"].ad{width:240px;height:400px}.ui.button.ad{width:120px;height:90px}.ui[class*=\"square button\"].ad{width:125px;height:125px}.ui[class*=\"small button\"].ad{width:120px;height:60px}.ui.skyscraper.ad{width:120px;height:600px}.ui[class*=\"wide skyscraper\"].ad{width:160px}.ui.banner.ad{width:468px;height:60px}.ui[class*=\"vertical banner\"].ad{width:120px;height:240px}.ui[class*=\"top banner\"].ad{width:930px;height:180px}.ui[class*=\"half banner\"].ad{width:234px;height:60px}.ui[class*=\"large leaderboard\"].ad{width:970px;height:90px}.ui.billboard.ad{width:970px;height:250px}.ui.panorama.ad{width:980px;height:120px}.ui.netboard.ad{width:580px;height:400px}.ui[class*=\"large mobile banner\"].ad{width:320px;height:100px}.ui[class*=\"mobile leaderboard\"].ad{width:320px;height:50px}.ui.mobile.ad{display:none}@media only screen and (max-width:767px){.ui.mobile.ad{display:block}}.ui.centered.ad{margin-left:auto;margin-right:auto}.ui.test.ad{position:relative;background:#545454}.ui.test.ad:after{position:absolute;top:50%;left:50%;width:100%;text-align:center;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);content:'Ad';color:#fff;font-size:1em;font-weight:700}.ui.mobile.test.ad:after{font-size:.85714286em}.ui.test.ad[data-text]:after{content:attr(data-text)}/*!\n * # Semantic UI 2.4.0 - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.card,.ui.cards>.card{max-width:100%;position:relative;display:flex;flex-direction:column;width:290px;min-height:0;background:#fff;padding:0;border:none;border-radius:.28571429rem;-webkit-box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;-webkit-transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,transform .1s ease;transition:box-shadow .1s ease,transform .1s ease,-webkit-box-shadow .1s ease,-webkit-transform .1s ease;z-index:''}.ui.card{margin:1em 0}.ui.card a,.ui.cards>.card a{cursor:pointer}.ui.card:first-child{margin-top:0}.ui.card:last-child{margin-bottom:0}.ui.cards{display:flex;margin:-.875em -.5em;flex-wrap:wrap}.ui.cards>.card{display:flex;margin:.875em .5em;float:none}.ui.card:after,.ui.cards:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.cards~.ui.cards{margin-top:.875em}.ui.card>:first-child,.ui.cards>.card>:first-child{border-radius:.28571429rem .28571429rem 0 0!important;border-top:none!important}.ui.card>:last-child,.ui.cards>.card>:last-child{border-radius:0 0 .28571429rem .28571429rem!important}.ui.card>:only-child,.ui.cards>.card>:only-child{border-radius:.28571429rem!important}.ui.card>.image,.ui.cards>.card>.image{position:relative;display:block;flex:0 0 auto;padding:0;background:rgba(0,0,0,.05)}.ui.card>.image>img,.ui.cards>.card>.image>img{display:block;width:100%;height:auto;border-radius:inherit}.ui.card>.image:not(.ui)>img,.ui.cards>.card>.image:not(.ui)>img{border:none}.ui.card>.content,.ui.cards>.card>.content{flex-grow:1;border:none;border-top:1px solid rgba(34,36,38,.1);background:0 0;margin:0;padding:1em 1em;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border-radius:0}.ui.card>.content:after,.ui.cards>.card>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.card>.content>.header,.ui.cards>.card>.content>.header{display:block;margin:'';font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;color:rgba(0,0,0,.85)}.ui.card>.content>.header:not(.ui),.ui.cards>.card>.content>.header:not(.ui){font-weight:700;font-size:1.28571429em;margin-top:-.21425em;line-height:1.28571429em}.ui.card>.content>.header+.description,.ui.card>.content>.meta+.description,.ui.cards>.card>.content>.header+.description,.ui.cards>.card>.content>.meta+.description{margin-top:.5em}.ui.card [class*=\"left floated\"],.ui.cards>.card [class*=\"left floated\"]{float:left}.ui.card [class*=\"right floated\"],.ui.cards>.card [class*=\"right floated\"]{float:right}.ui.card [class*=\"left aligned\"],.ui.cards>.card [class*=\"left aligned\"]{text-align:left}.ui.card [class*=\"center aligned\"],.ui.cards>.card [class*=\"center aligned\"]{text-align:center}.ui.card [class*=\"right aligned\"],.ui.cards>.card [class*=\"right aligned\"]{text-align:right}.ui.card .content img,.ui.cards>.card .content img{display:inline-block;vertical-align:middle;width:''}.ui.card .avatar img,.ui.card img.avatar,.ui.cards>.card .avatar img,.ui.cards>.card img.avatar{width:2em;height:2em;border-radius:500rem}.ui.card>.content>.description,.ui.cards>.card>.content>.description{clear:both;color:rgba(0,0,0,.68)}.ui.card>.content p,.ui.cards>.card>.content p{margin:0 0 .5em}.ui.card>.content p:last-child,.ui.cards>.card>.content p:last-child{margin-bottom:0}.ui.card .meta,.ui.cards>.card .meta{font-size:1em;color:rgba(0,0,0,.4)}.ui.card .meta *,.ui.cards>.card .meta *{margin-right:.3em}.ui.card .meta :last-child,.ui.cards>.card .meta :last-child{margin-right:0}.ui.card .meta [class*=\"right floated\"],.ui.cards>.card .meta [class*=\"right floated\"]{margin-right:0;margin-left:.3em}.ui.card>.content a:not(.ui),.ui.cards>.card>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content a:not(.ui):hover,.ui.cards>.card>.content a:not(.ui):hover{color:''}.ui.card>.content>a.header,.ui.cards>.card>.content>a.header{color:rgba(0,0,0,.85)}.ui.card>.content>a.header:hover,.ui.cards>.card>.content>a.header:hover{color:#1e70bf}.ui.card .meta>a:not(.ui),.ui.cards>.card .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.card .meta>a:not(.ui):hover,.ui.cards>.card .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.card>.button,.ui.card>.buttons,.ui.cards>.card>.button,.ui.cards>.card>.buttons{margin:0 -1px;width:calc(100% + 2px)}.ui.card .dimmer,.ui.cards>.card .dimmer{background-color:'';z-index:10}.ui.card>.content .star.icon,.ui.cards>.card>.content .star.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .star.icon:hover,.ui.cards>.card>.content .star.icon:hover{opacity:1;color:#ffb70a}.ui.card>.content .active.star.icon,.ui.cards>.card>.content .active.star.icon{color:#ffe623}.ui.card>.content .like.icon,.ui.cards>.card>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .like.icon:hover,.ui.cards>.card>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.card>.content .active.like.icon,.ui.cards>.card>.content .active.like.icon{color:#ff2733}.ui.card>.extra,.ui.cards>.card>.extra{max-width:100%;min-height:0!important;flex-grow:0;border-top:1px solid rgba(0,0,0,.05)!important;position:static;background:0 0;width:auto;margin:0 0;padding:.75em 1em;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.extra a:not(.ui),.ui.cards>.card>.extra a:not(.ui){color:rgba(0,0,0,.4)}.ui.card>.extra a:not(.ui):hover,.ui.cards>.card>.extra a:not(.ui):hover{color:#1e70bf}.ui.raised.card,.ui.raised.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.link.cards .raised.card:hover,.ui.link.raised.card:hover,.ui.raised.cards a.card:hover,a.ui.raised.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25)}.ui.raised.card,.ui.raised.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.centered.cards{justify-content:center}.ui.centered.card{margin-left:auto;margin-right:auto}.ui.fluid.card{width:100%;max-width:9999px}.ui.cards a.card,.ui.link.card,.ui.link.cards .card,a.ui.card{-webkit-transform:none;transform:none}.ui.cards a.card:hover,.ui.link.card:hover,.ui.link.cards .card:hover,a.ui.card:hover{cursor:pointer;z-index:5;background:#fff;border:none;-webkit-box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;-webkit-transform:translateY(-3px);transform:translateY(-3px)}.ui.cards>.red.card,.ui.red.card,.ui.red.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5}.ui.cards>.red.card:hover,.ui.red.card:hover,.ui.red.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd}.ui.cards>.orange.card,.ui.orange.card,.ui.orange.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5}.ui.cards>.orange.card:hover,.ui.orange.card:hover,.ui.orange.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd}.ui.cards>.yellow.card,.ui.yellow.card,.ui.yellow.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5}.ui.cards>.yellow.card:hover,.ui.yellow.card:hover,.ui.yellow.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd}.ui.cards>.olive.card,.ui.olive.card,.ui.olive.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5}.ui.cards>.olive.card:hover,.ui.olive.card:hover,.ui.olive.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd}.ui.cards>.green.card,.ui.green.card,.ui.green.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5}.ui.cards>.green.card:hover,.ui.green.card:hover,.ui.green.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd}.ui.cards>.teal.card,.ui.teal.card,.ui.teal.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5}.ui.cards>.teal.card:hover,.ui.teal.card:hover,.ui.teal.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd}.ui.blue.card,.ui.blue.cards>.card,.ui.cards>.blue.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5}.ui.blue.card:hover,.ui.blue.cards>.card:hover,.ui.cards>.blue.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd}.ui.cards>.violet.card,.ui.violet.card,.ui.violet.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5}.ui.cards>.violet.card:hover,.ui.violet.card:hover,.ui.violet.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd}.ui.cards>.purple.card,.ui.purple.card,.ui.purple.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5}.ui.cards>.purple.card:hover,.ui.purple.card:hover,.ui.purple.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd}.ui.cards>.pink.card,.ui.pink.card,.ui.pink.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5}.ui.cards>.pink.card:hover,.ui.pink.card:hover,.ui.pink.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd}.ui.brown.card,.ui.brown.cards>.card,.ui.cards>.brown.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5}.ui.brown.card:hover,.ui.brown.cards>.card:hover,.ui.cards>.brown.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd}.ui.cards>.grey.card,.ui.grey.card,.ui.grey.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5}.ui.cards>.grey.card:hover,.ui.grey.card:hover,.ui.grey.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd}.ui.black.card,.ui.black.cards>.card,.ui.cards>.black.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5}.ui.black.card:hover,.ui.black.cards>.card:hover,.ui.cards>.black.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd}.ui.one.cards{margin-left:0;margin-right:0}.ui.one.cards>.card{width:100%}.ui.two.cards{margin-left:-1em;margin-right:-1em}.ui.two.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.three.cards{margin-left:-1em;margin-right:-1em}.ui.three.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.four.cards{margin-left:-.75em;margin-right:-.75em}.ui.four.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.five.cards{margin-left:-.75em;margin-right:-.75em}.ui.five.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.six.cards{margin-left:-.75em;margin-right:-.75em}.ui.six.cards>.card{width:calc(16.66666667% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.seven.cards{margin-left:-.5em;margin-right:-.5em}.ui.seven.cards>.card{width:calc(14.28571429% - 1em);margin-left:.5em;margin-right:.5em}.ui.eight.cards{margin-left:-.5em;margin-right:-.5em}.ui.eight.cards>.card{width:calc(12.5% - 1em);margin-left:.5em;margin-right:.5em;font-size:11px}.ui.nine.cards{margin-left:-.5em;margin-right:-.5em}.ui.nine.cards>.card{width:calc(11.11111111% - 1em);margin-left:.5em;margin-right:.5em;font-size:10px}.ui.ten.cards{margin-left:-.5em;margin-right:-.5em}.ui.ten.cards>.card{width:calc(10% - 1em);margin-left:.5em;margin-right:.5em}@media only screen and (max-width:767px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards>.card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.seven.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.seven.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.nine.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.nine.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.ten.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.ten.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}}@media only screen and (min-width:768px) and (max-width:991px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards>.card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.eight.doubling.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.nine.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.nine.doubling.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.ten.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.ten.doubling.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}}@media only screen and (max-width:767px){.ui.stackable.cards{display:block!important}.ui.stackable.cards .card:first-child{margin-top:0!important}.ui.stackable.cards>.card{display:block!important;height:auto!important;margin:1em 1em;padding:0!important;width:calc(100% - 2em)!important}}.ui.cards>.card{font-size:1em}/*!\n * # Semantic UI 2.4.0 - Comment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.comments{margin:1.5em 0;max-width:650px}.ui.comments:first-child{margin-top:0}.ui.comments:last-child{margin-bottom:0}.ui.comments .comment{position:relative;background:0 0;margin:.5em 0 0;padding:.5em 0 0;border:none;border-top:none;line-height:1.2}.ui.comments .comment:first-child{margin-top:0;padding-top:0}.ui.comments .comment .comments{margin:0 0 .5em .5em;padding:1em 0 1em 1em}.ui.comments .comment .comments:before{position:absolute;top:0;left:0}.ui.comments .comment .comments .comment{border:none;border-top:none;background:0 0}.ui.comments .comment .avatar{display:block;width:2.5em;height:auto;float:left;margin:.2em 0 0}.ui.comments .comment .avatar img,.ui.comments .comment img.avatar{display:block;margin:0 auto;width:100%;height:100%;border-radius:.25rem}.ui.comments .comment>.content{display:block}.ui.comments .comment>.avatar~.content{margin-left:3.5em}.ui.comments .comment .author{font-size:1em;color:rgba(0,0,0,.87);font-weight:700}.ui.comments .comment a.author{cursor:pointer}.ui.comments .comment a.author:hover{color:#1e70bf}.ui.comments .comment .metadata{display:inline-block;margin-left:.5em;color:rgba(0,0,0,.4);font-size:.875em}.ui.comments .comment .metadata>*{display:inline-block;margin:0 .5em 0 0}.ui.comments .comment .metadata>:last-child{margin-right:0}.ui.comments .comment .text{margin:.25em 0 .5em;font-size:1em;word-wrap:break-word;color:rgba(0,0,0,.87);line-height:1.3}.ui.comments .comment .actions{font-size:.875em}.ui.comments .comment .actions a{cursor:pointer;display:inline-block;margin:0 .75em 0 0;color:rgba(0,0,0,.4)}.ui.comments .comment .actions a:last-child{margin-right:0}.ui.comments .comment .actions a.active,.ui.comments .comment .actions a:hover{color:rgba(0,0,0,.8)}.ui.comments>.reply.form{margin-top:1em}.ui.comments .comment .reply.form{width:100%;margin-top:1em}.ui.comments .reply.form textarea{font-size:1em;height:12em}.ui.collapsed.comments,.ui.comments .collapsed.comment,.ui.comments .collapsed.comments{display:none}.ui.threaded.comments .comment .comments{margin:-1.5em 0 -1em 1.25em;padding:3em 0 2em 2.25em;-webkit-box-shadow:-1px 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 rgba(34,36,38,.15)}.ui.minimal.comments .comment .actions{opacity:0;position:absolute;top:0;right:0;left:auto;-webkit-transition:opacity .2s ease;transition:opacity .2s ease;-webkit-transition-delay:.1s;transition-delay:.1s}.ui.minimal.comments .comment>.content:hover>.actions{opacity:1}.ui.mini.comments{font-size:.78571429rem}.ui.tiny.comments{font-size:.85714286rem}.ui.small.comments{font-size:.92857143rem}.ui.comments{font-size:1rem}.ui.large.comments{font-size:1.14285714rem}.ui.big.comments{font-size:1.28571429rem}.ui.huge.comments{font-size:1.42857143rem}.ui.massive.comments{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Feed\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.feed{margin:1em 0}.ui.feed:first-child{margin-top:0}.ui.feed:last-child{margin-bottom:0}.ui.feed>.event{display:flex;flex-direction:row;width:100%;padding:.21428571rem 0;margin:0;background:0 0;border-top:none}.ui.feed>.event:first-child{border-top:0;padding-top:0}.ui.feed>.event:last-child{padding-bottom:0}.ui.feed>.event>.label{display:block;flex:0 0 auto;width:2.5em;height:auto;align-self:stretch;text-align:left}.ui.feed>.event>.label .icon{opacity:1;font-size:1.5em;width:100%;padding:.25em;background:0 0;border:none;border-radius:none;color:rgba(0,0,0,.6)}.ui.feed>.event>.label img{width:100%;height:auto;border-radius:500rem}.ui.feed>.event>.label+.content{margin:.5em 0 .35714286em 1.14285714em}.ui.feed>.event>.content{display:block;flex:1 1 auto;align-self:stretch;text-align:left;word-wrap:break-word}.ui.feed>.event:last-child>.content{padding-bottom:0}.ui.feed>.event>.content a{cursor:pointer}.ui.feed>.event>.content .date{margin:-.5rem 0 0;padding:0;font-weight:400;font-size:1em;font-style:normal;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .summary{margin:0;font-size:1em;font-weight:700;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .summary img{display:inline-block;width:auto;height:10em;margin:-.25em .25em 0 0;border-radius:.25em;vertical-align:middle}.ui.feed>.event>.content .user{display:inline-block;font-weight:700;margin-right:0;vertical-align:baseline}.ui.feed>.event>.content .user img{margin:-.25em .25em 0 0;width:auto;height:10em;vertical-align:middle}.ui.feed>.event>.content .summary>.date{display:inline-block;float:none;font-weight:400;font-size:.85714286em;font-style:normal;margin:0 0 0 .5em;padding:0;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .extra{margin:.5em 0 0;background:0 0;padding:0;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .extra.images img{display:inline-block;margin:0 .25em 0 0;width:6em}.ui.feed>.event>.content .extra.text{padding:0;border-left:none;font-size:1em;max-width:500px;line-height:1.4285em}.ui.feed>.event>.content .meta{display:inline-block;font-size:.85714286em;margin:.5em 0 0;background:0 0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;padding:0;color:rgba(0,0,0,.6)}.ui.feed>.event>.content .meta>*{position:relative;margin-left:.75em}.ui.feed>.event>.content .meta>:after{content:'';color:rgba(0,0,0,.2);top:0;left:-1em;opacity:1;position:absolute;vertical-align:top}.ui.feed>.event>.content .meta .like{color:'';-webkit-transition:.2s color ease;transition:.2s color ease}.ui.feed>.event>.content .meta .like:hover .icon{color:#ff2733}.ui.feed>.event>.content .meta .active.like .icon{color:#ef404a}.ui.feed>.event>.content .meta>:first-child{margin-left:0}.ui.feed>.event>.content .meta>:first-child::after{display:none}.ui.feed>.event>.content .meta a,.ui.feed>.event>.content .meta>.icon{cursor:pointer;opacity:1;color:rgba(0,0,0,.5);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.feed>.event>.content .meta a:hover,.ui.feed>.event>.content .meta a:hover .icon,.ui.feed>.event>.content .meta>.icon:hover{color:rgba(0,0,0,.95)}.ui.small.feed{font-size:.92857143rem}.ui.feed{font-size:1rem}.ui.large.feed{font-size:1.14285714rem}/*!\n * # Semantic UI 2.4.0 - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.items>.item{display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:-webkit-box-shadow .1s ease;transition:-webkit-box-shadow .1s ease;transition:box-shadow .1s ease;transition:box-shadow .1s ease, -webkit-box-shadow .1s ease;transition:box-shadow .1s ease,-webkit-box-shadow .1s ease;z-index:''}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';align-self:top}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;flex:1 1 auto;background:0 0;margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;align-self:top;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*=\"left floated\"]{float:left}.ui.items>.item [class*=\"right floated\"]{float:right}.ui.items>.item .content img{align-self:middle;width:''}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:'';height:'';border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0 .5em;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*=\"right floated\"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:''}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#ffb70a}.ui.items>.item>.content .active.favorite.icon{color:#ffe623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.items>.item>.content .active.like.icon{color:#ff2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0 0 0;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*=\"right floated\"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767px){.ui.items:not(.unstackable)>.item{flex-direction:column;margin:2em 0}.ui.items:not(.unstackable)>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items:not(.unstackable)>.item>.image,.ui.items:not(.unstackable)>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items:not(.unstackable)>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*=\"top aligned\"].content{align-self:flex-start}.ui.items>.item>.image+[class*=\"middle aligned\"].content{align-self:center}.ui.items>.item>.image+[class*=\"bottom aligned\"].content{align-self:flex-end}.ui.relaxed.items>.item{margin:1.5em 0}.ui[class*=\"very relaxed\"].items>.item{margin:2em 0}.ui.divided.items>.item{border-top:1px solid rgba(34,36,38,.15);margin:0;padding:1em 0}.ui.divided.items>.item:first-child{border-top:none;margin-top:0!important;padding-top:0!important}.ui.divided.items>.item:last-child{margin-bottom:0!important;padding-bottom:0!important}.ui.relaxed.divided.items>.item{margin:0;padding:1.5em 0}.ui[class*=\"very relaxed\"].divided.items>.item{margin:0;padding:2em 0}.ui.items a.item:hover,.ui.link.items>.item:hover{cursor:pointer}.ui.items a.item:hover .content .header,.ui.link.items>.item:hover .content .header{color:#1e70bf}.ui.items>.item{font-size:1em}@media only screen and (max-width:767px){.ui.unstackable.items>.item>.image,.ui.unstackable.items>.item>.image>img{width:125px!important}}/*!\n * # Semantic UI 2.4.0 - Statistic\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.statistic{display:inline-flex;flex-direction:column;margin:1em 0;max-width:auto}.ui.statistic+.ui.statistic{margin:0 0 0 1.5em}.ui.statistic:first-child{margin-top:0}.ui.statistic:last-child{margin-bottom:0}.ui.statistics{display:flex;align-items:flex-start;flex-wrap:wrap}.ui.statistics>.statistic{display:inline-flex;flex:0 1 auto;flex-direction:column;margin:0 1.5em 1em;max-width:auto}.ui.statistics{display:flex;margin:1em -1.5em -1em}.ui.statistics:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:4rem;font-weight:400;line-height:1em;color:#1b1c1d;text-transform:uppercase;text-align:center}.ui.statistic>.label,.ui.statistics .statistic>.label{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;font-weight:700;color:rgba(0,0,0,.87);text-transform:uppercase;text-align:center}.ui.statistic>.label~.value,.ui.statistics .statistic>.label~.value{margin-top:0}.ui.statistic>.value~.label,.ui.statistics .statistic>.value~.label{margin-top:0}.ui.statistic>.value .icon,.ui.statistics .statistic>.value .icon{opacity:1;width:auto;margin:0}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{line-height:1em;min-height:2em;font-weight:700;text-align:center}.ui.statistic>.text.value+.label,.ui.statistics .statistic>.text.value+.label{text-align:center}.ui.statistic>.value img,.ui.statistics .statistic>.value img{max-height:3rem;vertical-align:baseline}.ui.ten.statistics{margin:0 0 -1em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 1em}.ui.nine.statistics{margin:0 0 -1em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 1em}.ui.eight.statistics{margin:0 0 -1em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 1em}.ui.seven.statistics{margin:0 0 -1em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 1em}.ui.six.statistics{margin:0 0 -1em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 1em}.ui.five.statistics{margin:0 0 -1em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 1em}.ui.four.statistics{margin:0 0 -1em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 1em}.ui.three.statistics{margin:0 0 -1em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 1em}.ui.two.statistics{margin:0 0 -1em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 1em}.ui.one.statistics{margin:0 0 -1em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 1em}.ui.horizontal.statistic{flex-direction:row;align-items:center}.ui.horizontal.statistics{flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{flex-direction:row;align-items:center;max-width:none;margin:1em 0}.ui.horizontal.statistic>.text.value,.ui.horizontal.statistics>.statistic>.text.value{min-height:0!important}.ui.horizontal.statistic>.value .icon,.ui.horizontal.statistics .statistic>.value .icon{width:1.18em}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle}.ui.horizontal.statistic>.label,.ui.horizontal.statistics .statistic>.label{display:inline-block;vertical-align:middle;margin:0 0 0 .75em}.ui.red.statistic>.value,.ui.red.statistics .statistic>.value,.ui.statistics .red.statistic>.value{color:#db2828}.ui.orange.statistic>.value,.ui.orange.statistics .statistic>.value,.ui.statistics .orange.statistic>.value{color:#f2711c}.ui.statistics .yellow.statistic>.value,.ui.yellow.statistic>.value,.ui.yellow.statistics .statistic>.value{color:#fbbd08}.ui.olive.statistic>.value,.ui.olive.statistics .statistic>.value,.ui.statistics .olive.statistic>.value{color:#b5cc18}.ui.green.statistic>.value,.ui.green.statistics .statistic>.value,.ui.statistics .green.statistic>.value{color:#21ba45}.ui.statistics .teal.statistic>.value,.ui.teal.statistic>.value,.ui.teal.statistics .statistic>.value{color:#00b5ad}.ui.blue.statistic>.value,.ui.blue.statistics .statistic>.value,.ui.statistics .blue.statistic>.value{color:#2185d0}.ui.statistics .violet.statistic>.value,.ui.violet.statistic>.value,.ui.violet.statistics .statistic>.value{color:#6435c9}.ui.purple.statistic>.value,.ui.purple.statistics .statistic>.value,.ui.statistics .purple.statistic>.value{color:#a333c8}.ui.pink.statistic>.value,.ui.pink.statistics .statistic>.value,.ui.statistics .pink.statistic>.value{color:#e03997}.ui.brown.statistic>.value,.ui.brown.statistics .statistic>.value,.ui.statistics .brown.statistic>.value{color:#a5673f}.ui.grey.statistic>.value,.ui.grey.statistics .statistic>.value,.ui.statistics .grey.statistic>.value{color:#767676}.ui.inverted.statistic .value,.ui.inverted.statistics .statistic>.value{color:#fff}.ui.inverted.statistic .label,.ui.inverted.statistics .statistic>.label{color:rgba(255,255,255,.9)}.ui.inverted.red.statistic>.value,.ui.inverted.red.statistics .statistic>.value,.ui.statistics .inverted.red.statistic>.value{color:#ff695e}.ui.inverted.orange.statistic>.value,.ui.inverted.orange.statistics .statistic>.value,.ui.statistics .inverted.orange.statistic>.value{color:#ff851b}.ui.inverted.yellow.statistic>.value,.ui.inverted.yellow.statistics .statistic>.value,.ui.statistics .inverted.yellow.statistic>.value{color:#ffe21f}.ui.inverted.olive.statistic>.value,.ui.inverted.olive.statistics .statistic>.value,.ui.statistics .inverted.olive.statistic>.value{color:#d9e778}.ui.inverted.green.statistic>.value,.ui.inverted.green.statistics .statistic>.value,.ui.statistics .inverted.green.statistic>.value{color:#2ecc40}.ui.inverted.teal.statistic>.value,.ui.inverted.teal.statistics .statistic>.value,.ui.statistics .inverted.teal.statistic>.value{color:#6dffff}.ui.inverted.blue.statistic>.value,.ui.inverted.blue.statistics .statistic>.value,.ui.statistics .inverted.blue.statistic>.value{color:#54c8ff}.ui.inverted.violet.statistic>.value,.ui.inverted.violet.statistics .statistic>.value,.ui.statistics .inverted.violet.statistic>.value{color:#a291fb}.ui.inverted.purple.statistic>.value,.ui.inverted.purple.statistics .statistic>.value,.ui.statistics .inverted.purple.statistic>.value{color:#dc73ff}.ui.inverted.pink.statistic>.value,.ui.inverted.pink.statistics .statistic>.value,.ui.statistics .inverted.pink.statistic>.value{color:#ff8edf}.ui.inverted.brown.statistic>.value,.ui.inverted.brown.statistics .statistic>.value,.ui.statistics .inverted.brown.statistic>.value{color:#d67c1c}.ui.inverted.grey.statistic>.value,.ui.inverted.grey.statistics .statistic>.value,.ui.statistics .inverted.grey.statistic>.value{color:#dcddde}.ui[class*=\"left floated\"].statistic{float:left;margin:0 2em 1em 0}.ui[class*=\"right floated\"].statistic{float:right;margin:0 0 1em 2em}.ui.floated.statistic:last-child{margin-bottom:0}.ui.mini.statistic>.value,.ui.mini.statistics .statistic>.value{font-size:1.5rem!important}.ui.mini.horizontal.statistic>.value,.ui.mini.horizontal.statistics .statistic>.value{font-size:1.5rem!important}.ui.mini.statistic>.text.value,.ui.mini.statistics .statistic>.text.value{font-size:1rem!important}.ui.tiny.statistic>.value,.ui.tiny.statistics .statistic>.value{font-size:2rem!important}.ui.tiny.horizontal.statistic>.value,.ui.tiny.horizontal.statistics .statistic>.value{font-size:2rem!important}.ui.tiny.statistic>.text.value,.ui.tiny.statistics .statistic>.text.value{font-size:1rem!important}.ui.small.statistic>.value,.ui.small.statistics .statistic>.value{font-size:3rem!important}.ui.small.horizontal.statistic>.value,.ui.small.horizontal.statistics .statistic>.value{font-size:2rem!important}.ui.small.statistic>.text.value,.ui.small.statistics .statistic>.text.value{font-size:1rem!important}.ui.statistic>.value,.ui.statistics .statistic>.value{font-size:4rem!important}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{font-size:3rem!important}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{font-size:2rem!important}.ui.large.statistic>.value,.ui.large.statistics .statistic>.value{font-size:5rem!important}.ui.large.horizontal.statistic>.value,.ui.large.horizontal.statistics .statistic>.value{font-size:4rem!important}.ui.large.statistic>.text.value,.ui.large.statistics .statistic>.text.value{font-size:2.5rem!important}.ui.huge.statistic>.value,.ui.huge.statistics .statistic>.value{font-size:6rem!important}.ui.huge.horizontal.statistic>.value,.ui.huge.horizontal.statistics .statistic>.value{font-size:5rem!important}.ui.huge.statistic>.text.value,.ui.huge.statistics .statistic>.text.value{font-size:2.5rem!important}/*!\n * # Semantic UI 2.4.0 - Accordion\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.accordion,.ui.accordion .accordion{max-width:100%}.ui.accordion .accordion{margin:1em 0 0;padding:0}.ui.accordion .accordion .title,.ui.accordion .title{cursor:pointer}.ui.accordion .title:not(.ui){padding:.5em 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;color:rgba(0,0,0,.87)}.ui.accordion .accordion .title~.content,.ui.accordion .title~.content{display:none}.ui.accordion:not(.styled) .accordion .title~.content:not(.ui),.ui.accordion:not(.styled) .title~.content:not(.ui){margin:'';padding:.5em 0 1em}.ui.accordion:not(.styled) .title~.content:not(.ui):last-child{padding-bottom:0}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{display:inline-block;float:none;opacity:1;width:1.25em;height:1em;margin:0 .25rem 0 0;padding:0;font-size:1em;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease;vertical-align:baseline;-webkit-transform:none;transform:none}.ui.accordion.menu .item .title{display:block;padding:0}.ui.accordion.menu .item .title>.dropdown.icon{float:right;margin:.21425em 0 0 1em;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ui.accordion .ui.header .dropdown.icon{font-size:1em;margin:0 .25rem 0 0}.ui.accordion .accordion .active.title .dropdown.icon,.ui.accordion .active.title .dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.accordion.menu .item .active.title>.dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.styled.accordion{width:600px}.ui.styled.accordion,.ui.styled.accordion .accordion{border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15)}.ui.styled.accordion .accordion .title,.ui.styled.accordion .title{margin:0;padding:.75em 1em;color:rgba(0,0,0,.4);font-weight:700;border-top:1px solid rgba(34,36,38,.15);-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.styled.accordion .accordion .title:first-child,.ui.styled.accordion>.title:first-child{border-top:none}.ui.styled.accordion .accordion .content,.ui.styled.accordion .content{margin:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .content{padding:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover,.ui.styled.accordion .active.title,.ui.styled.accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.styled.accordion .accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.accordion .accordion .active.content,.ui.accordion .active.content{display:block}.ui.fluid.accordion,.ui.fluid.accordion .accordion{width:100%}.ui.inverted.accordion .title:not(.ui){color:rgba(255,255,255,.9)}@font-face{font-family:Accordion;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfOIKAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zryj6HgAAAFwAAAAyGhlYWT/0IhHAAACOAAAADZoaGVhApkB5wAAAnAAAAAkaG10eAJuABIAAAKUAAAAGGxvY2EAjABWAAACrAAAAA5tYXhwAAgAFgAAArwAAAAgbmFtZfC1n04AAALcAAABPHBvc3QAAwAAAAAEGAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQASAEkAtwFuABMAADc0PwE2FzYXFh0BFAcGJwYvASY1EgaABQgHBQYGBQcIBYAG2wcGfwcBAQcECf8IBAcBAQd/BgYAAAAAAQAAAEkApQFuABMAADcRNDc2MzIfARYVFA8BBiMiJyY1AAUGBwgFgAYGgAUIBwYFWwEACAUGBoAFCAcFgAYGBQcAAAABAAAAAQAAqWYls18PPPUACwIAAAAAAM/9o+4AAAAAz/2j7gAAAAAAtwFuAAAACAACAAAAAAAAAAEAAAHg/+AAAAIAAAAAAAC3AAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAQAAAAC3ABIAtwAAAAAAAAAKABQAHgBCAGQAAAABAAAABgAUAAEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAASwAAoAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAS0AAAEtFpovuE9TLzIAAAIkAAAAYAAAAGAIIweQY21hcAAAAoQAAABMAAAATA984gpnYXNwAAAC0AAAAAgAAAAIAAAAEGhlYWQAAALYAAAANgAAADb/0IhHaGhlYQAAAxAAAAAkAAAAJAKZAedobXR4AAADNAAAABgAAAAYAm4AEm1heHAAAANMAAAABgAAAAYABlAAbmFtZQAAA1QAAAE8AAABPPC1n05wb3N0AAAEkAAAACAAAAAgAAMAAAEABAQAAQEBB3JhdGluZwABAgABADr4HAL4GwP4GAQeCgAZU/+Lix4KABlT/4uLDAeLa/iU+HQFHQAAAHkPHQAAAH4RHQAAAAkdAAABJBIABwEBBw0PERQZHnJhdGluZ3JhdGluZ3UwdTF1MjB1RjBEOXVGMERBAAACAYkABAAGAQEEBwoNVp38lA78lA78lA77lA773Z33bxWLkI2Qj44I9xT3FAWOj5CNkIuQi4+JjoePiI2Gi4YIi/uUBYuGiYeHiIiHh4mGi4aLho2Ijwj7FPcUBYeOiY+LkAgO+92L5hWL95QFi5CNkI6Oj4+PjZCLkIuQiY6HCPcU+xQFj4iNhouGi4aJh4eICPsU+xQFiIeGiYaLhouHjYePiI6Jj4uQCA74lBT4lBWLDAoAAAAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAEAADfYOJZfDzz1AAsCAAAAAADP/aPuAAAAAM/9o+4AAAAAALcBbgAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAAAtwABAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAEAAAAAtwASALcAAAAAUAAABgAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:400;font-style:normal}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{font-family:Accordion;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.accordion .accordion .title .dropdown.icon:before,.ui.accordion .title .dropdown.icon:before{content:'\\f0da'}/*!\n * # Semantic UI 2.4.0 - Checkbox\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.checkbox{position:relative;display:inline-block;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;min-height:17px;font-size:1rem;line-height:17px;min-width:17px}.ui.checkbox input[type=checkbox],.ui.checkbox input[type=radio]{cursor:pointer;position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:3;width:17px;height:17px}.ui.checkbox .box,.ui.checkbox label{cursor:auto;position:relative;display:block;padding-left:1.85714em;outline:0;font-size:1em}.ui.checkbox .box:before,.ui.checkbox label:before{position:absolute;top:0;left:0;width:17px;height:17px;content:'';background:#fff;border-radius:.21428571rem;-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;border:1px solid #d4d4d5}.ui.checkbox .box:after,.ui.checkbox label:after{position:absolute;font-size:14px;top:0;left:0;width:17px;height:17px;text-align:center;opacity:0;color:rgba(0,0,0,.87);-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease}.ui.checkbox label,.ui.checkbox+label{color:rgba(0,0,0,.87);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.checkbox+label{vertical-align:middle}.ui.checkbox .box:hover::before,.ui.checkbox label:hover::before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox label:hover,.ui.checkbox+label:hover{color:rgba(0,0,0,.8)}.ui.checkbox .box:active::before,.ui.checkbox label:active::before{background:#f9fafb;border-color:rgba(34,36,38,.35)}.ui.checkbox .box:active::after,.ui.checkbox label:active::after{color:rgba(0,0,0,.95)}.ui.checkbox input:active~label{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~.box:before,.ui.checkbox input:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:focus~.box:after,.ui.checkbox input:focus~label:after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label{color:rgba(0,0,0,.95)}.ui.checkbox input:checked~.box:before,.ui.checkbox input:checked~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:not([type=radio]):indeterminate~.box:before,.ui.checkbox input:not([type=radio]):indeterminate~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:not([type=radio]):indeterminate~.box:after,.ui.checkbox input:not([type=radio]):indeterminate~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:checked:focus~.box:before,.ui.checkbox input:checked:focus~label:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:checked:focus~.box:after,.ui.checkbox input:checked:focus~label:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:after{color:rgba(0,0,0,.95)}.ui.read-only.checkbox,.ui.read-only.checkbox label{cursor:default}.ui.checkbox input[disabled]~.box:after,.ui.checkbox input[disabled]~label,.ui.disabled.checkbox .box:after,.ui.disabled.checkbox label{cursor:default!important;opacity:.5;color:#000}.ui.checkbox input.hidden{z-index:-1}.ui.checkbox input.hidden+label{cursor:pointer;-webkit-user-select:none;-ms-user-select:none;user-select:none}.ui.radio.checkbox{min-height:15px}.ui.radio.checkbox .box,.ui.radio.checkbox label{padding-left:1.85714em}.ui.radio.checkbox .box:before,.ui.radio.checkbox label:before{content:'';-webkit-transform:none;transform:none;width:15px;height:15px;border-radius:500rem;top:1px;left:0}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{border:none;content:''!important;width:15px;height:15px;line-height:15px}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{top:1px;left:0;width:15px;height:15px;border-radius:500rem;-webkit-transform:scale(.46666667);transform:scale(.46666667);background-color:rgba(0,0,0,.87)}.ui.radio.checkbox input:focus~.box:before,.ui.radio.checkbox input:focus~label:before{background-color:#fff}.ui.radio.checkbox input:focus~.box:after,.ui.radio.checkbox input:focus~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:indeterminate~.box:after,.ui.radio.checkbox input:indeterminate~label:after{opacity:0}.ui.radio.checkbox input:checked~.box:before,.ui.radio.checkbox input:checked~label:before{background-color:#fff}.ui.radio.checkbox input:checked~.box:after,.ui.radio.checkbox input:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:focus:checked~.box:before,.ui.radio.checkbox input:focus:checked~label:before{background-color:#fff}.ui.radio.checkbox input:focus:checked~.box:after,.ui.radio.checkbox input:focus:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.slider.checkbox{min-height:1.25rem}.ui.slider.checkbox input{width:3.5rem;height:1.25rem}.ui.slider.checkbox .box,.ui.slider.checkbox label{padding-left:4.5rem;line-height:1rem;color:rgba(0,0,0,.4)}.ui.slider.checkbox .box:before,.ui.slider.checkbox label:before{display:block;position:absolute;content:'';border:none!important;left:0;z-index:1;top:.4rem;background-color:rgba(0,0,0,.05);width:3.5rem;height:.21428571rem;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider.checkbox .box:after,.ui.slider.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff -webkit-gradient(linear,left top, left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:-.25rem;left:0;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:left .3s ease;transition:left .3s ease}.ui.slider.checkbox input:focus~.box:before,.ui.slider.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.slider.checkbox .box:hover,.ui.slider.checkbox label:hover{color:rgba(0,0,0,.8)}.ui.slider.checkbox .box:hover::before,.ui.slider.checkbox label:hover::before{background:rgba(0,0,0,.15)}.ui.slider.checkbox input:checked~.box,.ui.slider.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:checked~.box:before,.ui.slider.checkbox input:checked~label:before{background-color:#545454!important}.ui.slider.checkbox input:checked~.box:after,.ui.slider.checkbox input:checked~label:after{left:2rem}.ui.slider.checkbox input:focus:checked~.box,.ui.slider.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:focus:checked~.box:before,.ui.slider.checkbox input:focus:checked~label:before{background-color:#000!important}.ui.toggle.checkbox{min-height:1.5rem}.ui.toggle.checkbox input{width:3.5rem;height:1.5rem}.ui.toggle.checkbox .box,.ui.toggle.checkbox label{min-height:1.5rem;padding-left:4.5rem;color:rgba(0,0,0,.87)}.ui.toggle.checkbox label{padding-top:.15em}.ui.toggle.checkbox .box:before,.ui.toggle.checkbox label:before{display:block;position:absolute;content:'';z-index:1;-webkit-transform:none;transform:none;border:none;top:0;background:rgba(0,0,0,.05);-webkit-box-shadow:none;box-shadow:none;width:3.5rem;height:1.5rem;border-radius:500rem}.ui.toggle.checkbox .box:after,.ui.toggle.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff -webkit-gradient(linear,left top, left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:0;left:0;border-radius:500rem;-webkit-transition:background .3s ease,left .3s ease;transition:background .3s ease,left .3s ease}.ui.toggle.checkbox input~.box:after,.ui.toggle.checkbox input~label:after{left:-.05rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus~.box:before,.ui.toggle.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox .box:hover::before,.ui.toggle.checkbox label:hover::before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox input:checked~.box,.ui.toggle.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:checked~.box:before,.ui.toggle.checkbox input:checked~label:before{background-color:#2185d0!important}.ui.toggle.checkbox input:checked~.box:after,.ui.toggle.checkbox input:checked~label:after{left:2.15rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus:checked~.box,.ui.toggle.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:focus:checked~.box:before,.ui.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.fitted.checkbox .box,.ui.fitted.checkbox label{padding-left:0!important}.ui.fitted.toggle.checkbox{width:3.5rem}.ui.fitted.slider.checkbox{width:3.5rem}@font-face{font-family:Checkbox;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype')}.ui.checkbox .box:after,.ui.checkbox label:after{font-family:Checkbox}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{content:'\\e800'}.ui.checkbox input:indeterminate~.box:after,.ui.checkbox input:indeterminate~label:after{font-size:12px;content:'\\e801'}/*!\n * # Semantic UI 2.4.0 - Dimmer\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.dimmable:not(body){position:relative}.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;padding:1em;background-color:rgba(0,0,0,.85);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-transition:background-color .5s linear;transition:background-color .5s linear;flex-direction:column;align-items:center;justify-content:center;-webkit-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{-webkit-user-select:text;-ms-user-select:text;user-select:text;color:#fff}.ui.segment>.ui.dimmer{border-radius:inherit!important}.ui.dimmer:not(.inverted)::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:flex;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.dimmed.dimmable>.ui.animating.legacy.dimmer,.dimmed.dimmable>.ui.visible.legacy.dimmer,.ui.active.legacy.dimmer{display:block}.ui[class*=\"top aligned\"].dimmer{justify-content:flex-start}.ui[class*=\"bottom aligned\"].dimmer{justify-content:flex-end}.ui.page.dimmer{position:fixed;-webkit-transform-style:'';transform-style:'';-webkit-perspective:2000px;perspective:2000px;-webkit-transform-origin:center center;transform-origin:center center}body.animating.in.dimmable,body.dimmed.dimmable{overflow:hidden}body.dimmable>.dimmer{position:fixed}.blurring.dimmable>:not(.dimmer){-webkit-filter:blur(0) grayscale(0);filter:blur(0) grayscale(0);-webkit-transition:.8s -webkit-filter ease;transition:.8s -webkit-filter ease;-webkit-transition:.8s filter ease;transition:.8s filter ease;-webkit-transition:.8s filter ease,.8s -webkit-filter ease;transition:.8s filter ease,.8s -webkit-filter ease}.blurring.dimmed.dimmable>:not(.dimmer){-webkit-filter:blur(5px) grayscale(.7);filter:blur(5px) grayscale(.7)}.blurring.dimmable>.dimmer{background-color:rgba(0,0,0,.6)}.blurring.dimmable>.inverted.dimmer{background-color:rgba(255,255,255,.6)}.ui.dimmer>.top.aligned.content>*{vertical-align:top}.ui.dimmer>.bottom.aligned.content>*{vertical-align:bottom}.ui.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui.inverted.dimmer>.content>*{color:#fff}.ui.simple.dimmer{display:block;overflow:hidden;opacity:1;width:0%;height:0%;z-index:-100;background-color:rgba(0,0,0,0)}.dimmed.dimmable>.ui.simple.dimmer{overflow:visible;opacity:1;width:100%;height:100%;background-color:rgba(0,0,0,.85);z-index:1}.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,0)}.dimmed.dimmable>.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,.85)}/*!\n * # Semantic UI 2.4.0 - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.dropdown{cursor:pointer;position:relative;display:inline-block;outline:0;text-align:left;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease;-webkit-tap-highlight-color:transparent}.ui.dropdown .menu{cursor:auto;position:absolute;display:none;outline:0;top:100%;min-width:-webkit-max-content;min-width:max-content;margin:0;padding:0 0;background:#fff;font-size:1em;text-shadow:none;text-align:left;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;z-index:11;will-change:transform,opacity}.ui.dropdown .menu>*{white-space:nowrap}.ui.dropdown>input:not(.search):first-child,.ui.dropdown>select{display:none!important}.ui.dropdown>.dropdown.icon{position:relative;width:auto;font-size:.85714286em;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon{width:auto;float:right;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon+.text{margin-right:1em}.ui.dropdown>.text{display:inline-block;-webkit-transition:none;transition:none}.ui.dropdown .menu>.item{position:relative;cursor:pointer;display:block;border:none;height:auto;text-align:left;border-top:none;line-height:1em;color:rgba(0,0,0,.87);padding:.78571429rem 1.14285714rem!important;font-size:1rem;text-transform:none;font-weight:400;-webkit-box-shadow:none;box-shadow:none;-webkit-touch-callout:none}.ui.dropdown .menu>.item:first-child{border-top-width:0}.ui.dropdown .menu .item>[class*=\"right floated\"],.ui.dropdown>.text>[class*=\"right floated\"]{float:right!important;margin-right:0!important;margin-left:1em!important}.ui.dropdown .menu .item>[class*=\"left floated\"],.ui.dropdown>.text>[class*=\"left floated\"]{float:left!important;margin-left:0!important;margin-right:1em!important}.ui.dropdown .menu .item>.flag.floated,.ui.dropdown .menu .item>.icon.floated,.ui.dropdown .menu .item>.image.floated,.ui.dropdown .menu .item>img.floated{margin-top:0}.ui.dropdown .menu>.header{margin:1rem 0 .75rem;padding:0 1.14285714rem;color:rgba(0,0,0,.85);font-size:.78571429em;font-weight:700;text-transform:uppercase}.ui.dropdown .menu>.divider{border-top:1px solid rgba(34,36,38,.1);height:0;margin:.5em 0}.ui.dropdown.dropdown .menu>.input{width:auto;display:flex;margin:1.14285714rem .78571429rem;min-width:10rem}.ui.dropdown .menu>.header+.input{margin-top:0}.ui.dropdown .menu>.input:not(.transparent) input{padding:.5em 1em}.ui.dropdown .menu>.input:not(.transparent) .button,.ui.dropdown .menu>.input:not(.transparent) .icon,.ui.dropdown .menu>.input:not(.transparent) .label{padding-top:.5em;padding-bottom:.5em}.ui.dropdown .menu>.item>.description,.ui.dropdown>.text>.description{float:right;margin:0 0 0 1em;color:rgba(0,0,0,.4)}.ui.dropdown .menu>.message{padding:.78571429rem 1.14285714rem;font-weight:400}.ui.dropdown .menu>.message:not(.ui){color:rgba(0,0,0,.4)}.ui.dropdown .menu .menu{top:0!important;left:100%;right:auto;margin:0 0 0 -.5em!important;border-radius:.28571429rem!important;z-index:21!important}.ui.dropdown .menu .menu:after{display:none}.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-left:0;float:none;margin-right:.78571429rem}.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.image,.ui.dropdown>.text>img{display:inline-block;vertical-align:top;width:auto;margin-top:-.5em;margin-bottom:-.5em;max-height:2em}.ui.dropdown .ui.menu>.item:before,.ui.menu .ui.dropdown .menu>.item:before{display:none}.ui.menu .ui.dropdown .menu .active.item{border-left:none}.ui.buttons>.ui.dropdown:last-child .menu,.ui.menu .right.dropdown.item .menu,.ui.menu .right.menu .dropdown:last-child .menu{left:auto;right:0}.ui.label.dropdown .menu{min-width:100%}.ui.dropdown.icon.button>.dropdown.icon{margin:0}.ui.button.dropdown .menu{min-width:100%}.ui.selection.dropdown{cursor:pointer;word-wrap:break-word;line-height:1em;white-space:normal;outline:0;-webkit-transform:rotateZ(0);transform:rotateZ(0);min-width:14em;min-height:2.71428571em;background:#fff;display:inline-block;padding:.78571429em 2.1em .78571429em 1em;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease}.ui.selection.dropdown.active,.ui.selection.dropdown.visible{z-index:10}select.ui.dropdown{height:38px;padding:.5em;border:1px solid rgba(34,36,38,.15);visibility:visible}.ui.selection.dropdown>.delete.icon,.ui.selection.dropdown>.dropdown.icon,.ui.selection.dropdown>.search.icon{cursor:pointer;position:absolute;width:auto;height:auto;line-height:1.21428571em;top:.78571429em;right:1em;z-index:3;margin:-.78571429em;padding:.91666667em;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.compact.selection.dropdown{min-width:0}.ui.selection.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;border-top-width:0!important;width:auto;outline:0;margin:0 -1px;min-width:calc(100% + 2px);width:calc(100% + 2px);border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.selection.dropdown .menu:after,.ui.selection.dropdown .menu:before{display:none}.ui.selection.dropdown .menu>.message{padding:.78571429rem 1.14285714rem}@media only screen and (max-width:767px){.ui.selection.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.selection.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.selection.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.selection.dropdown .menu{max-height:21.37142857rem}}.ui.selection.dropdown .menu>.item{border-top:1px solid #fafafa;padding:.78571429rem 1.14285714rem!important;white-space:normal;word-wrap:normal}.ui.selection.dropdown .menu>.hidden.addition.item{display:none}.ui.selection.dropdown:hover{border-color:rgba(34,36,38,.35);-webkit-box-shadow:none;box-shadow:none}.ui.selection.active.dropdown{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.dropdown:focus{border-color:#96c8da;-webkit-box-shadow:none;box-shadow:none}.ui.selection.dropdown:focus .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.visible.dropdown>.text:not(.default){font-weight:400;color:rgba(0,0,0,.8)}.ui.selection.active.dropdown:hover{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown:hover .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.active.selection.dropdown>.dropdown.icon,.ui.visible.selection.dropdown>.dropdown.icon{opacity:'';z-index:3}.ui.active.selection.dropdown{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.active.empty.selection.dropdown{border-radius:.28571429rem!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.active.empty.selection.dropdown .menu{border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.search.dropdown{min-width:''}.ui.search.dropdown>input.search{background:none transparent!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;cursor:text;top:0;left:1px;width:100%;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:inherit}.ui.search.dropdown>input.search{position:absolute;z-index:2}.ui.search.dropdown>.text{cursor:text;position:relative;left:1px;z-index:3}.ui.search.selection.dropdown>input.search{line-height:1.21428571em;padding:.67857143em 2.1em .67857143em 1em}.ui.search.selection.dropdown>span.sizer{line-height:1.21428571em;padding:.67857143em 2.1em .67857143em 1em;display:none;white-space:pre}.ui.search.dropdown.active>input.search,.ui.search.dropdown.visible>input.search{cursor:auto}.ui.search.dropdown.active>.text,.ui.search.dropdown.visible>.text{pointer-events:none}.ui.active.search.dropdown input.search:focus+.text .flag,.ui.active.search.dropdown input.search:focus+.text .icon{opacity:.45}.ui.active.search.dropdown input.search:focus+.text{color:rgba(115,115,115,.87)!important}.ui.search.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch}@media only screen and (max-width:767px){.ui.search.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.search.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.search.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.search.dropdown .menu{max-height:21.37142857rem}}.ui.multiple.dropdown{padding:.22619048em 2.1em .22619048em .35714286em}.ui.multiple.dropdown .menu{cursor:auto}.ui.multiple.search.dropdown,.ui.multiple.search.dropdown>input.search{cursor:text}.ui.multiple.dropdown>.label{-webkit-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;vertical-align:top;white-space:normal;font-size:1em;padding:.35714286em .78571429em;margin:.14285714rem .28571429rem .14285714rem 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.multiple.dropdown .dropdown.icon{margin:'';padding:''}.ui.multiple.dropdown>.text{position:static;padding:0;max-width:100%;margin:.45238095em 0 .45238095em .64285714em;line-height:1.21428571em}.ui.multiple.dropdown>.label~input.search{margin-left:.14285714em!important}.ui.multiple.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>.text{display:inline-block;position:absolute;top:0;left:0;padding:inherit;margin:.45238095em 0 .45238095em .64285714em;line-height:1.21428571em}.ui.multiple.search.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>input.search{position:static;padding:0;max-width:100%;margin:.45238095em 0 .45238095em .64285714em;width:2.2em;line-height:1.21428571em}.ui.inline.dropdown{cursor:pointer;display:inline-block;color:inherit}.ui.inline.dropdown .dropdown.icon{margin:0 .21428571em 0 .21428571em;vertical-align:baseline}.ui.inline.dropdown>.text{font-weight:700}.ui.inline.dropdown .menu{cursor:auto;margin-top:.21428571em;border-radius:.28571429rem}.ui.dropdown .menu .active.item{background:0 0;font-weight:700;color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none;z-index:12}.ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);z-index:13}.ui.loading.dropdown>i.icon{height:1em!important}.ui.loading.selection.dropdown>i.icon{padding:1.5em 1.28571429em!important}.ui.loading.dropdown>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.dropdown>i.icon:after{position:absolute;content:'';top:50%;left:50%;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:dropdown-spin .6s linear;animation:dropdown-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em}.ui.loading.dropdown.button>i.icon:after,.ui.loading.dropdown.button>i.icon:before{display:none}@-webkit-keyframes dropdown-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dropdown-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.default.dropdown:not(.button)>.text,.ui.dropdown:not(.button)>.default.text{color:rgba(191,191,191,.87)}.ui.default.dropdown:not(.button)>input:focus~.text,.ui.dropdown:not(.button)>input:focus~.default.text{color:rgba(115,115,115,.87)}.ui.loading.dropdown>.text{-webkit-transition:none;transition:none}.ui.dropdown .loading.menu{display:block;visibility:hidden;z-index:-1}.ui.dropdown>.loading.menu{left:0!important;right:auto!important}.ui.dropdown>.menu .loading.menu{left:100%!important;right:auto!important}.ui.dropdown .menu .selected.item,.ui.dropdown.selected{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.dropdown>.filtered.text{visibility:hidden}.ui.dropdown .filtered.item{display:none!important}.ui.dropdown.error,.ui.dropdown.error>.default.text,.ui.dropdown.error>.text{color:#9f3a38}.ui.selection.dropdown.error{background:#fff6f6;border-color:#e0b4b4}.ui.selection.dropdown.error:hover{border-color:#e0b4b4}.ui.dropdown.error>.menu,.ui.dropdown.error>.menu .menu{border-color:#e0b4b4}.ui.dropdown.error>.menu>.item{color:#9f3a38}.ui.multiple.selection.error.dropdown>.label{border-color:#e0b4b4}.ui.dropdown.error>.menu>.item:hover{background-color:#fff2f2}.ui.dropdown.error>.menu .active.item{background-color:#fdcfcf}.ui.dropdown>.clear.dropdown.icon{opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.dropdown>.clear.dropdown.icon:hover{opacity:1}.ui.disabled.dropdown,.ui.dropdown .menu>.disabled.item{cursor:default;pointer-events:none;opacity:.45}.ui.dropdown .menu{left:0}.ui.dropdown .menu .right.menu,.ui.dropdown .right.menu>.menu{left:100%!important;right:auto!important;border-radius:.28571429rem!important}.ui.dropdown>.left.menu{left:auto!important;right:0!important}.ui.dropdown .menu .left.menu,.ui.dropdown>.left.menu .menu{left:auto;right:100%;margin:0 -.5em 0 0!important;border-radius:.28571429rem!important}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon+.text,.ui.dropdown .left.menu .item .dropdown.icon+.text{margin-left:1em;margin-right:0}.ui.upward.dropdown>.menu{top:auto;bottom:100%;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:.28571429rem .28571429rem 0 0}.ui.dropdown .upward.menu{top:auto!important;bottom:0!important}.ui.simple.upward.active.dropdown,.ui.simple.upward.dropdown:hover{border-radius:.28571429rem .28571429rem 0 0!important}.ui.upward.dropdown.button:not(.pointing):not(.floating).active{border-radius:.28571429rem .28571429rem 0 0}.ui.upward.selection.dropdown .menu{border-top-width:1px!important;border-bottom-width:0!important;-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.upward.selection.dropdown:hover{-webkit-box-shadow:0 0 2px 0 rgba(0,0,0,.05);box-shadow:0 0 2px 0 rgba(0,0,0,.05)}.ui.active.upward.selection.dropdown{border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.selection.dropdown.visible{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.active.selection.dropdown:hover{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.05);box-shadow:0 0 3px 0 rgba(0,0,0,.05)}.ui.upward.active.selection.dropdown:hover .menu{-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto}.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;min-width:100%!important;width:auto!important}.ui.dropdown .scrolling.menu{position:static;overflow-y:auto;border:none;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important;margin:0!important;min-width:100%!important;width:auto!important;border-top:1px solid rgba(34,36,38,.15)}.ui.dropdown .scrolling.menu>.item.item.item,.ui.scrolling.dropdown .menu .item.item.item{border-top:none}.ui.dropdown .scrolling.menu .item:first-child,.ui.scrolling.dropdown .menu .item:first-child{border-top:none}.ui.dropdown>.animating.menu .scrolling.menu,.ui.dropdown>.visible.menu .scrolling.menu{display:block}@media all and (-ms-high-contrast:none){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{min-width:calc(100% - 17px)}}@media only screen and (max-width:767px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:10.28571429rem}}@media only screen and (min-width:768px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:15.42857143rem}}@media only screen and (min-width:992px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}@media only screen and (min-width:1920px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}.ui.simple.dropdown .menu:after,.ui.simple.dropdown .menu:before{display:none}.ui.simple.dropdown .menu{position:absolute;display:block;overflow:hidden;top:-9999px!important;opacity:0;width:0;height:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.simple.active.dropdown,.ui.simple.dropdown:hover{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.simple.active.dropdown>.menu,.ui.simple.dropdown:hover>.menu{overflow:visible;width:auto;height:auto;top:100%!important;opacity:1}.ui.simple.dropdown:hover>.menu>.item:hover>.menu,.ui.simple.dropdown>.menu>.item:active>.menu{overflow:visible;width:auto;height:auto;top:0!important;left:100%!important;opacity:1}.ui.simple.disabled.dropdown:hover .menu{display:none;height:0;width:0;overflow:hidden}.ui.simple.visible.dropdown>.menu{display:block}.ui.fluid.dropdown{display:block;width:100%;min-width:0}.ui.fluid.dropdown>.dropdown.icon{float:right}.ui.floating.dropdown .menu{left:0;right:auto;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;border-radius:.28571429rem!important}.ui.floating.dropdown>.menu{margin-top:.5em!important;border-radius:.28571429rem!important}.ui.pointing.dropdown>.menu{top:100%;margin-top:.78571429rem;border-radius:.28571429rem}.ui.pointing.dropdown>.menu:after{display:block;position:absolute;pointer-events:none;content:'';visibility:visible;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:.5em;height:.5em;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);background:#fff;z-index:2}.ui.pointing.dropdown>.menu:after{top:-.25em;left:50%;margin:0 0 0 -.25em}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu:after{top:-.25em;left:1em;right:auto;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.top.right.pointing.dropdown>.menu{top:100%;bottom:auto;right:0;left:auto;margin:1em 0 0}.ui.top.pointing.dropdown>.left.menu:after,.ui.top.right.pointing.dropdown>.menu:after{top:-.25em;left:auto!important;right:1em!important;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.left.pointing.dropdown>.menu{top:0;left:100%;right:auto;margin:0 0 0 1em}.ui.left.pointing.dropdown>.menu:after{top:1em;left:-.25em;margin:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu{left:auto!important;right:100%!important;margin:0 1em 0 0}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.right.pointing.dropdown>.menu{top:0;left:auto;right:100%;margin:0 1em 0 0}.ui.right.pointing.dropdown>.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.bottom.pointing.dropdown>.menu{top:auto;bottom:100%;left:0;right:auto;margin:0 0 1em}.ui.bottom.pointing.dropdown>.menu:after{top:auto;bottom:-.25em;right:auto;margin:0;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.ui.bottom.pointing.dropdown>.menu .menu{top:auto!important;bottom:0!important}.ui.bottom.left.pointing.dropdown>.menu{left:0;right:auto}.ui.bottom.left.pointing.dropdown>.menu:after{left:1em;right:auto}.ui.bottom.right.pointing.dropdown>.menu{right:0;left:auto}.ui.bottom.right.pointing.dropdown>.menu:after{left:auto;right:1em}.ui.pointing.upward.dropdown .menu,.ui.top.pointing.upward.dropdown .menu{top:auto!important;bottom:100%!important;margin:0 0 .78571429rem;border-radius:.28571429rem}.ui.pointing.upward.dropdown .menu:after,.ui.top.pointing.upward.dropdown .menu:after{top:100%!important;bottom:auto!important;-webkit-box-shadow:1px 1px 0 0 rgba(34,36,38,.15);box-shadow:1px 1px 0 0 rgba(34,36,38,.15);margin:-.25em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 1em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 0 0 1em}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}@font-face{font-family:Dropdown;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAVgAA8AAAAACFAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABWAAAABwAAAAchGgaq0dERUYAAAF0AAAAHAAAAB4AJwAPT1MvMgAAAZAAAABDAAAAVnW4TJdjbWFwAAAB1AAAAEsAAAFS8CcaqmN2dCAAAAIgAAAABAAAAAQAEQFEZ2FzcAAAAiQAAAAIAAAACP//AANnbHlmAAACLAAAAQoAAAGkrRHP9WhlYWQAAAM4AAAAMAAAADYPK8YyaGhlYQAAA2gAAAAdAAAAJANCAb1obXR4AAADiAAAACIAAAAiCBkAOGxvY2EAAAOsAAAAFAAAABQBnAIybWF4cAAAA8AAAAAfAAAAIAEVAF5uYW1lAAAD4AAAATAAAAKMFGlj5HBvc3QAAAUQAAAARgAAAHJoedjqd2ViZgAABVgAAAAGAAAABrO7W5UAAAABAAAAANXulPUAAAAA1r4hgAAAAADXu2Q1eNpjYGRgYOABYjEgZmJgBEIOIGYB8xgAA/YAN3jaY2BktGOcwMDKwMI4jTGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHFT/fLjFeOD/AQY9xjMMbkBhRpAcAN48DQYAeNpjYGBgZoBgGQZGBhDwAfIYwXwWBgMgzQGETAwMqn8+8H649f8/lHX9//9b7Pzf+fWgusCAkY0BzmUE6gHpQwGMDMMeAACbxg7SAAARAUQAAAAB//8AAnjadZBPSsNAGMXfS+yMqYgOhpSuSlKadmUhiVEhEMQzFF22m17BbbvzCh5BXCUn6EG8gjeQ4DepwYo4i+/ffL95j4EDA+CFC7jQuKyIeVHrI3wkleq9F7XrSInKteOeHdda8bOoaeepSc00NWPz/LRec9G8GabyGtEdF7h19z033GAMTK7zbM42xNEZpzYof0RtQ5CUHAQJ73OtVyutc+3b7Ou//b8XNlsPx3jgjUifABdhEohKJJL5iM5p39uqc7X1+sRQSqmGrUVhlsJ4lpmEUVwyT8SUYtg0P9DyNzPADDs+tjrGV6KRCRfsui3eHcL4/p8ZXvfMlcnEU+CLv7hDykOP+AKTPTxbAAB42mNgZGBgAGKuf5KP4vltvjLIMzGAwLV9ig0g+vruFFMQzdjACOJzMIClARh0CTJ42mNgZGBgPPD/AJD8wgAEjA0MjAyogAMAbOQEAQAAAAC7ABEAAAAAAKoAAAH0AAABgAAAAUAACAFAAAgAwAAXAAAAAAAAACoAKgAqADIAbACGAKAAugDSeNpjYGRgYOBkUGFgYgABEMkFhAwM/xn0QAIADdUBdAB42qWQvUoDQRSFv3GjaISUQaymSmGxJoGAsRC0iPYLsU50Y6IxrvlRtPCJJKUPIBb+PIHv4EN4djKuKAqCDHfmu+feOdwZoMCUAJNbAlYUMzaUlM14jjxbngOq7HnOia89z1Pk1vMCa9x7ztPkzfMyJbPj+ZGi6Xp+omxuPD+zaD7meaFg7mb8GrBqHmhwxoAxlm0uiRkpP9X5m26pKRoMxTGR1D49Dv/Yb/91o6l8qL6eu5n2hZQzn68utR9m3FU2cB4t9cdSLG2utI+44Eh/P9bqKO+oJ/WxmXssj77YkrjasZQD6SFddythk3Wtzrf+UF2p076Udla1VNzsERP3kkjVRKel7mp1udXYcHtZSlV7RfmJe1GiFWveluaeKD5/MuJcSk8Tpm/vvwPIbmJleNpjYGKAAFYG7ICTgYGRiZGZkYWRlZGNkZ2Rg5GTLT2nsiDDEEIZsZfmZRqZujmDaDcDAxcI7WIOpS2gtCWUdgQAZkcSmQAAAAFblbO6AAA=) format('woff');font-weight:400;font-style:normal}.ui.dropdown>.dropdown.icon{font-family:Dropdown;line-height:1;height:1em;width:1.23em;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.dropdown>.dropdown.icon{width:auto}.ui.dropdown>.dropdown.icon:before{content:'\\f0d7'}.ui.dropdown .menu .item .dropdown.icon:before{content:'\\f0da'}.ui.dropdown .item .left.dropdown.icon:before,.ui.dropdown .left.menu .item .dropdown.icon:before{content:\"\\f0d9\"}.ui.vertical.menu .dropdown.item>.dropdown.icon:before{content:\"\\f0da\"}.ui.dropdown>.clear.icon:before{content:\"\\f00d\"}/*!\n * # Semantic UI 2.4.0 - Video\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.embed{position:relative;max-width:100%;height:0;overflow:hidden;background:#dcddde;padding-bottom:56.25%}.ui.embed embed,.ui.embed iframe,.ui.embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0}.ui.embed>.embed{display:none}.ui.embed>.placeholder{position:absolute;cursor:pointer;top:0;left:0;display:block;width:100%;height:100%;background-color:radial-gradient(transparent 45%,rgba(0,0,0,.3))}.ui.embed>.icon{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.ui.embed>.icon:after{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;content:'';background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:.5;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.ui.embed>.icon:before{position:absolute;top:50%;left:50%;z-index:4;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);color:#fff;font-size:6rem;text-shadow:0 2px 10px rgba(34,36,38,.2);-webkit-transition:opacity .5s ease,color .5s ease;transition:opacity .5s ease,color .5s ease;z-index:10}.ui.embed .icon:hover:after{background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:1}.ui.embed .icon:hover:before{color:#fff}.ui.active.embed>.icon,.ui.active.embed>.placeholder{display:none}.ui.active.embed>.embed{display:block}.ui.square.embed{padding-bottom:100%}.ui[class*=\"4:3\"].embed{padding-bottom:75%}.ui[class*=\"16:9\"].embed{padding-bottom:56.25%}.ui[class*=\"21:9\"].embed{padding-bottom:42.85714286%}/*!\n * # Semantic UI 2.4.0 - Modal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.modal{position:absolute;display:none;z-index:1001;text-align:left;background:#fff;border:none;-webkit-box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);-webkit-transform-origin:50% 25%;transform-origin:50% 25%;flex:0 0 auto;border-radius:.28571429rem;-webkit-user-select:text;-ms-user-select:text;user-select:text;will-change:top,left,margin,transform,opacity}.ui.modal>.icon:first-child+*,.ui.modal>:first-child:not(.icon){border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.modal>:last-child{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.modal>.close{cursor:pointer;position:absolute;top:-2.5rem;right:-2.5rem;z-index:1;opacity:.8;font-size:1.25em;color:#fff;width:2.25rem;height:2.25rem;padding:.625rem 0 0 0}.ui.modal>.close:hover{opacity:1}.ui.modal>.header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;margin:0;padding:1.25rem 1.5rem;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.85);border-bottom:1px solid rgba(34,36,38,.15)}.ui.modal>.header:not(.ui){font-size:1.42857143rem;line-height:1.28571429em;font-weight:700}.ui.modal>.content{display:block;width:100%;font-size:1em;line-height:1.4;padding:1.5rem;background:#fff}.ui.modal>.image.content{display:flex;flex-direction:row}.ui.modal>.content>.image{display:block;flex:0 1 auto;width:'';align-self:top}.ui.modal>[class*=\"top aligned\"]{align-self:top}.ui.modal>[class*=\"middle aligned\"]{align-self:middle}.ui.modal>[class*=stretched]{align-self:stretch}.ui.modal>.content>.description{display:block;flex:1 0 auto;min-width:0;align-self:top}.ui.modal>.content>.icon+.description,.ui.modal>.content>.image+.description{flex:0 1 auto;min-width:'';width:auto;padding-left:2em}.ui.modal>.content>.image>i.icon{margin:0;opacity:1;width:auto;line-height:1;font-size:8rem}.ui.modal>.actions{background:#f9fafb;padding:1rem 1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right}.ui.modal .actions>.button{margin-left:.75em}@media only screen and (max-width:767px){.ui.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.modal{width:850px;margin:0}}@media only screen and (min-width:1200px){.ui.modal{width:900px;margin:0}}@media only screen and (min-width:1920px){.ui.modal{width:950px;margin:0}}@media only screen and (max-width:991px){.ui.modal>.header{padding-right:2.25rem}.ui.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}}@media only screen and (max-width:767px){.ui.modal>.header{padding:.75rem 1rem!important;padding-right:2.25rem!important}.ui.modal>.content{display:block;padding:1rem!important}.ui.modal>.close{top:.5rem!important;right:.5rem!important}.ui.modal .image.content{flex-direction:column}.ui.modal .content>.image{display:block;max-width:100%;margin:0 auto!important;text-align:center;padding:0 0 1rem!important}.ui.modal>.content>.image>i.icon{font-size:5rem;text-align:center}.ui.modal .content>.description{display:block;width:100%!important;margin:0!important;padding:1rem 0!important;-webkit-box-shadow:none;box-shadow:none}.ui.modal>.actions{padding:1rem 1rem 0!important}.ui.modal .actions>.button,.ui.modal .actions>.buttons{margin-bottom:1rem}}.ui.inverted.dimmer>.ui.modal{-webkit-box-shadow:1px 3px 10px 2px rgba(0,0,0,.2);box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{background-color:transparent;border:none;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.basic.modal>.actions,.ui.basic.modal>.content,.ui.basic.modal>.header{background-color:transparent}.ui.basic.modal>.header{color:#fff}.ui.basic.modal>.close{top:1rem;right:1.5rem}.ui.inverted.dimmer>.basic.modal{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.basic.modal>.header{color:rgba(0,0,0,.85)}.ui.legacy.modal,.ui.legacy.page.dimmer>.ui.modal{top:50%;left:50%}.ui.legacy.page.dimmer>.ui.scrolling.modal,.ui.page.dimmer>.ui.scrolling.legacy.modal,.ui.top.aligned.dimmer>.ui.legacy.modal,.ui.top.aligned.legacy.page.dimmer>.ui.modal{top:auto}@media only screen and (max-width:991px){.ui.basic.modal>.close{color:#fff}}.ui.loading.modal{display:block;visibility:hidden;z-index:-1}.ui.active.modal{display:block}.modals.dimmer[class*=\"top aligned\"] .modal{margin:5vh auto}@media only screen and (max-width:767px){.modals.dimmer[class*=\"top aligned\"] .modal{margin:1rem auto}}.legacy.modals.dimmer[class*=\"top aligned\"]{padding-top:5vh}@media only screen and (max-width:767px){.legacy.modals.dimmer[class*=\"top aligned\"]{padding-top:1rem}}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable>.dimmer{justify-content:flex-start}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.dimmable>.dimmer{position:fixed}.modals.dimmer .ui.scrolling.modal{margin:1rem auto}.scrolling.undetached.dimmable.dimmed{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.undetached.dimmable.dimmed>.dimmer{overflow:hidden}.scrolling.undetached.dimmable .ui.scrolling.modal{position:absolute;left:50%;margin-top:1rem!important}.ui.modal .scrolling.content{max-height:calc(70vh);overflow:auto}.ui.fullscreen.modal{width:95%!important;left:0!important;margin:1em auto}.ui.fullscreen.scrolling.modal{left:0!important}.ui.fullscreen.modal>.header{padding-right:2.25rem}.ui.fullscreen.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}.ui.modal{font-size:1rem}.ui.mini.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.mini.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.mini.modal{width:35.2%;margin:0}}@media only screen and (min-width:992px){.ui.mini.modal{width:340px;margin:0}}@media only screen and (min-width:1200px){.ui.mini.modal{width:360px;margin:0}}@media only screen and (min-width:1920px){.ui.mini.modal{width:380px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.tiny.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.tiny.modal{width:52.8%;margin:0}}@media only screen and (min-width:992px){.ui.tiny.modal{width:510px;margin:0}}@media only screen and (min-width:1200px){.ui.tiny.modal{width:540px;margin:0}}@media only screen and (min-width:1920px){.ui.tiny.modal{width:570px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.small.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0}}.ui.large.modal>.header{font-size:1.6em}@media only screen and (max-width:767px){.ui.large.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0}}/*!\n * # Semantic UI 2.4.0 - Nag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#555;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2);box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:.2s background ease;transition:.2s background ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#fff}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#fff;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:hover{background:#555;opacity:1}.ui.nag .close:hover{opacity:1}.ui.overlay.nag{position:absolute;display:block}.ui.fixed.nag{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#f3f4f5;color:rgba(0,0,0,.85)}.ui.inverted.nag .close,.ui.inverted.nag .title,.ui.inverted.nags .nag .close,.ui.inverted.nags .nag .title{color:rgba(0,0,0,.4)}.ui.nags .nag{border-radius:0!important}.ui.nags .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:last-child{border-radius:.28571429rem .28571429rem 0 0}/*!\n * # Semantic UI 2.4.0 - Popup\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:min-content;z-index:1900;border:1px solid #d4d4d5;line-height:1.4285em;max-width:250px;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.popup>.header{padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:'';width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:before{pointer-events:none;position:absolute;content:'';font-size:1rem;width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]:after{pointer-events:none;content:attr(data-tooltip);position:absolute;text-transform:none;text-align:left;white-space:nowrap;font-size:1rem;border:1px solid #d4d4d5;line-height:1.4285em;max-width:none;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1}[data-tooltip]:not([data-position]):before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-tooltip]:not([data-position]):after{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);bottom:100%;margin-bottom:.5em}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;visibility:hidden}[data-tooltip]:before{opacity:0;-webkit-transform:rotate(45deg) scale(0)!important;transform:rotate(45deg) scale(0)!important;-webkit-transform-origin:center top;transform-origin:center top;-webkit-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:after{opacity:1;-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;pointer-events:auto}[data-tooltip]:hover:before{-webkit-transform:rotate(45deg) scale(1)!important;transform:rotate(45deg) scale(1)!important;opacity:1}[data-tooltip]:after,[data-tooltip][data-position=\"bottom center\"]:after,[data-tooltip][data-position=\"top center\"]:after{-webkit-transform:translateX(-50%) scale(0)!important;transform:translateX(-50%) scale(0)!important}[data-tooltip]:hover:after,[data-tooltip][data-position=\"bottom center\"]:hover:after{-webkit-transform:translateX(-50%) scale(1)!important;transform:translateX(-50%) scale(1)!important}[data-tooltip][data-position=\"left center\"]:after,[data-tooltip][data-position=\"right center\"]:after{-webkit-transform:translateY(-50%) scale(0)!important;transform:translateY(-50%) scale(0)!important}[data-tooltip][data-position=\"left center\"]:hover:after,[data-tooltip][data-position=\"right center\"]:hover:after{-webkit-transform:translateY(-50%) scale(1)!important;transform:translateY(-50%) scale(1)!important}[data-tooltip][data-position=\"bottom left\"]:after,[data-tooltip][data-position=\"bottom right\"]:after,[data-tooltip][data-position=\"top left\"]:after,[data-tooltip][data-position=\"top right\"]:after{-webkit-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position=\"bottom left\"]:hover:after,[data-tooltip][data-position=\"bottom right\"]:hover:after,[data-tooltip][data-position=\"top left\"]:hover:after,[data-tooltip][data-position=\"top right\"]:hover:after{-webkit-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-inverted]:before{-webkit-box-shadow:none!important;box-shadow:none!important}[data-tooltip][data-inverted]:before{background:#1b1c1d}[data-tooltip][data-inverted]:after{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}[data-tooltip][data-inverted]:after .header{background-color:none;color:#fff}[data-position=\"top center\"][data-tooltip]:after{top:auto;right:auto;left:50%;bottom:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-bottom:.5em}[data-position=\"top center\"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position=\"top left\"][data-tooltip]:after{top:auto;right:auto;left:0;bottom:100%;margin-bottom:.5em}[data-position=\"top left\"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position=\"top right\"][data-tooltip]:after{top:auto;left:auto;right:0;bottom:100%;margin-bottom:.5em}[data-position=\"top right\"][data-tooltip]:before{top:auto;left:auto;bottom:100%;right:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position=\"bottom center\"][data-tooltip]:after{bottom:auto;right:auto;left:50%;top:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-top:.5em}[data-position=\"bottom center\"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:50%;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position=\"bottom left\"][data-tooltip]:after{left:0;top:100%;margin-top:.5em}[data-position=\"bottom left\"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:1em;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position=\"bottom right\"][data-tooltip]:after{right:0;top:100%;margin-top:.5em}[data-position=\"bottom right\"][data-tooltip]:before{bottom:auto;left:auto;top:100%;right:1em;margin-left:-.14285714rem;margin-top:.07142857rem}[data-position=\"left center\"][data-tooltip]:after{right:100%;top:50%;margin-right:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position=\"left center\"][data-tooltip]:before{right:100%;top:50%;margin-top:-.14285714rem;margin-right:-.07142857rem}[data-position=\"right center\"][data-tooltip]:after{left:100%;top:50%;margin-left:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position=\"right center\"][data-tooltip]:before{left:100%;top:50%;margin-top:-.07142857rem;margin-left:.14285714rem}[data-position~=bottom][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-position=\"left center\"][data-tooltip]:before{background:#fff;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-position=\"right center\"][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-position~=top][data-tooltip]:before{background:#fff}[data-inverted][data-position~=bottom][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-inverted][data-position=\"left center\"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-inverted][data-position=\"right center\"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=top][data-tooltip]:before{background:#1b1c1d}[data-position~=bottom][data-tooltip]:before{-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-position~=bottom][data-tooltip]:after{-webkit-transform-origin:center top;transform-origin:center top}[data-position=\"left center\"][data-tooltip]:before{-webkit-transform-origin:top center;transform-origin:top center}[data-position=\"left center\"][data-tooltip]:after{-webkit-transform-origin:right center;transform-origin:right center}[data-position=\"right center\"][data-tooltip]:before{-webkit-transform-origin:right center;transform-origin:right center}[data-position=\"right center\"][data-tooltip]:after{-webkit-transform-origin:left center;transform-origin:left center}.ui.popup{margin:0}.ui.top.popup{margin:0 0 .71428571em}.ui.top.left.popup{-webkit-transform-origin:left bottom;transform-origin:left bottom}.ui.top.center.popup{-webkit-transform-origin:center bottom;transform-origin:center bottom}.ui.top.right.popup{-webkit-transform-origin:right bottom;transform-origin:right bottom}.ui.left.center.popup{margin:0 .71428571em 0 0;-webkit-transform-origin:right 50%;transform-origin:right 50%}.ui.right.center.popup{margin:0 0 0 .71428571em;-webkit-transform-origin:left 50%;transform-origin:left 50%}.ui.bottom.popup{margin:.71428571em 0 0}.ui.bottom.left.popup{-webkit-transform-origin:left top;transform-origin:left top}.ui.bottom.center.popup{-webkit-transform-origin:center top;transform-origin:center top}.ui.bottom.right.popup{-webkit-transform-origin:right top;transform-origin:right top}.ui.bottom.center.popup:before{margin-left:-.30714286em;top:-.30714286em;left:50%;right:auto;bottom:auto;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.left.popup{margin-left:0}.ui.bottom.left.popup:before{top:-.30714286em;left:1em;right:auto;bottom:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup{margin-right:0}.ui.bottom.right.popup:before{top:-.30714286em;right:1em;bottom:auto;left:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.top.center.popup:before{top:auto;right:auto;bottom:-.30714286em;left:50%;margin-left:-.30714286em}.ui.top.left.popup{margin-left:0}.ui.top.left.popup:before{bottom:-.30714286em;left:1em;top:auto;right:auto;margin-left:0}.ui.top.right.popup{margin-right:0}.ui.top.right.popup:before{bottom:-.30714286em;right:1em;top:auto;left:auto;margin-left:0}.ui.left.center.popup:before{top:50%;right:-.30714286em;bottom:auto;left:auto;margin-top:-.30714286em;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.30714286em;bottom:auto;right:auto;margin-top:-.30714286em;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}.ui.bottom.popup:before{background:#fff}.ui.left.center.popup:before,.ui.right.center.popup:before{background:#fff}.ui.top.popup:before{background:#fff}.ui.inverted.bottom.popup:before{background:#1b1c1d}.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before{background:#1b1c1d}.ui.inverted.top.popup:before{background:#1b1c1d}.ui.popup>.ui.grid:not(.padded){width:calc(100% + 1.75rem);margin:-.7rem -.875rem}.ui.loading.popup{display:block;visibility:hidden;z-index:-1}.ui.animating.popup,.ui.visible.popup{display:block}.ui.visible.popup{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.basic.popup:before{display:none}.ui.wide.popup{max-width:350px}.ui[class*=\"very wide\"].popup{max-width:550px}@media only screen and (max-width:767px){.ui.wide.popup,.ui[class*=\"very wide\"].popup{max-width:250px}}.ui.fluid.popup{width:100%;max-width:none}.ui.inverted.popup{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#fff}.ui.inverted.popup:before{background-color:#1b1c1d;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.flowing.popup{max-width:none}.ui.mini.popup{font-size:.78571429rem}.ui.tiny.popup{font-size:.85714286rem}.ui.small.popup{font-size:.92857143rem}.ui.popup{font-size:1rem}.ui.large.popup{font-size:1.14285714rem}.ui.huge.popup{font-size:1.42857143rem}/*!\n * # Semantic UI 2.4.0 - Progress Bar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.progress{position:relative;display:block;max-width:100%;border:none;margin:1em 0 2.5em;-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.1);padding:0;border-radius:.28571429rem}.ui.progress:first-child{margin:0 0 2.5em}.ui.progress:last-child{margin:0 0 1.5em}.ui.progress .bar{display:block;line-height:1;position:relative;width:0%;min-width:2em;background:#888;border-radius:.28571429rem;-webkit-transition:width .1s ease,background-color .1s ease;transition:width .1s ease,background-color .1s ease}.ui.progress .bar>.progress{white-space:nowrap;position:absolute;width:auto;font-size:.92857143em;top:50%;right:.5em;left:auto;bottom:auto;color:rgba(255,255,255,.7);text-shadow:none;margin-top:-.5em;font-weight:700;text-align:left}.ui.progress>.label{position:absolute;width:100%;font-size:1em;top:100%;right:auto;left:0;bottom:auto;color:rgba(0,0,0,.87);font-weight:700;text-shadow:none;margin-top:.2em;text-align:center;-webkit-transition:color .4s ease;transition:color .4s ease}.ui.indicating.progress[data-percent^=\"1\"] .bar,.ui.indicating.progress[data-percent^=\"2\"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent^=\"3\"] .bar{background-color:#efbc72}.ui.indicating.progress[data-percent^=\"4\"] .bar,.ui.indicating.progress[data-percent^=\"5\"] .bar{background-color:#e6bb48}.ui.indicating.progress[data-percent^=\"6\"] .bar{background-color:#ddc928}.ui.indicating.progress[data-percent^=\"7\"] .bar,.ui.indicating.progress[data-percent^=\"8\"] .bar{background-color:#b4d95c}.ui.indicating.progress[data-percent^=\"100\"] .bar,.ui.indicating.progress[data-percent^=\"9\"] .bar{background-color:#66da81}.ui.indicating.progress[data-percent^=\"1\"] .label,.ui.indicating.progress[data-percent^=\"2\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"3\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"4\"] .label,.ui.indicating.progress[data-percent^=\"5\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"6\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"7\"] .label,.ui.indicating.progress[data-percent^=\"8\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"100\"] .label,.ui.indicating.progress[data-percent^=\"9\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent=\"1\"] .bar,.ui.indicating.progress[data-percent=\"2\"] .bar,.ui.indicating.progress[data-percent=\"3\"] .bar,.ui.indicating.progress[data-percent=\"4\"] .bar,.ui.indicating.progress[data-percent=\"5\"] .bar,.ui.indicating.progress[data-percent=\"6\"] .bar,.ui.indicating.progress[data-percent=\"7\"] .bar,.ui.indicating.progress[data-percent=\"8\"] .bar,.ui.indicating.progress[data-percent=\"9\"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent=\"1\"] .label,.ui.indicating.progress[data-percent=\"2\"] .label,.ui.indicating.progress[data-percent=\"3\"] .label,.ui.indicating.progress[data-percent=\"4\"] .label,.ui.indicating.progress[data-percent=\"5\"] .label,.ui.indicating.progress[data-percent=\"6\"] .label,.ui.indicating.progress[data-percent=\"7\"] .label,.ui.indicating.progress[data-percent=\"8\"] .label,.ui.indicating.progress[data-percent=\"9\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress.success .label{color:#1a531b}.ui.progress.success .bar{background-color:#21ba45!important}.ui.progress.success .bar,.ui.progress.success .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.success>.label{color:#1a531b}.ui.progress.warning .bar{background-color:#f2c037!important}.ui.progress.warning .bar,.ui.progress.warning .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.warning>.label{color:#794b02}.ui.progress.error .bar{background-color:#db2828!important}.ui.progress.error .bar,.ui.progress.error .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.error>.label{color:#912d2b}.ui.active.progress .bar{position:relative;min-width:2em}.ui.active.progress .bar::after{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:.28571429rem;-webkit-animation:progress-active 2s ease infinite;animation:progress-active 2s ease infinite}@-webkit-keyframes progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@keyframes progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}.ui.disabled.progress{opacity:.35}.ui.disabled.progress .bar,.ui.disabled.progress .bar::after{-webkit-animation:none!important;animation:none!important}.ui.inverted.progress{background:rgba(255,255,255,.08);border:none}.ui.inverted.progress .bar{background:#888}.ui.inverted.progress .bar>.progress{color:#f9fafb}.ui.inverted.progress>.label{color:#fff}.ui.inverted.progress.success>.label{color:#21ba45}.ui.inverted.progress.warning>.label{color:#f2c037}.ui.inverted.progress.error>.label{color:#db2828}.ui.progress.attached{background:0 0;position:relative;border:none;margin:0}.ui.progress.attached,.ui.progress.attached .bar{display:block;height:.2rem;padding:0;overflow:hidden;border-radius:0 0 .28571429rem .28571429rem}.ui.progress.attached .bar{border-radius:0}.ui.progress.top.attached,.ui.progress.top.attached .bar{top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.progress.top.attached .bar{border-radius:0}.ui.card>.ui.attached.progress,.ui.segment>.ui.attached.progress{position:absolute;top:auto;left:0;bottom:100%;width:100%}.ui.card>.ui.bottom.attached.progress,.ui.segment>.ui.bottom.attached.progress{top:100%;bottom:auto}.ui.red.progress .bar{background-color:#db2828}.ui.red.inverted.progress .bar{background-color:#ff695e}.ui.orange.progress .bar{background-color:#f2711c}.ui.orange.inverted.progress .bar{background-color:#ff851b}.ui.yellow.progress .bar{background-color:#fbbd08}.ui.yellow.inverted.progress .bar{background-color:#ffe21f}.ui.olive.progress .bar{background-color:#b5cc18}.ui.olive.inverted.progress .bar{background-color:#d9e778}.ui.green.progress .bar{background-color:#21ba45}.ui.green.inverted.progress .bar{background-color:#2ecc40}.ui.teal.progress .bar{background-color:#00b5ad}.ui.teal.inverted.progress .bar{background-color:#6dffff}.ui.blue.progress .bar{background-color:#2185d0}.ui.blue.inverted.progress .bar{background-color:#54c8ff}.ui.violet.progress .bar{background-color:#6435c9}.ui.violet.inverted.progress .bar{background-color:#a291fb}.ui.purple.progress .bar{background-color:#a333c8}.ui.purple.inverted.progress .bar{background-color:#dc73ff}.ui.pink.progress .bar{background-color:#e03997}.ui.pink.inverted.progress .bar{background-color:#ff8edf}.ui.brown.progress .bar{background-color:#a5673f}.ui.brown.inverted.progress .bar{background-color:#d67c1c}.ui.grey.progress .bar{background-color:#767676}.ui.grey.inverted.progress .bar{background-color:#dcddde}.ui.black.progress .bar{background-color:#1b1c1d}.ui.black.inverted.progress .bar{background-color:#545454}.ui.tiny.progress{font-size:.85714286rem}.ui.tiny.progress .bar{height:.5em}.ui.small.progress{font-size:.92857143rem}.ui.small.progress .bar{height:1em}.ui.progress{font-size:1rem}.ui.progress .bar{height:1.75em}.ui.large.progress{font-size:1.14285714rem}.ui.large.progress .bar{height:2.5em}.ui.big.progress{font-size:1.28571429rem}.ui.big.progress .bar{height:3.5em}/*!\n * # Semantic UI 2.4.0 - Rating\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.rating{display:inline-flex;white-space:nowrap;vertical-align:baseline}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;text-align:center;font-weight:400;font-style:normal;flex:1 0 auto;cursor:pointer;width:1.25em;height:auto;-webkit-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease}.ui.rating .icon{background:0 0;color:rgba(0,0,0,.15)}.ui.rating .active.icon{background:0 0;color:rgba(0,0,0,.85)}.ui.rating .icon.selected,.ui.rating .icon.selected.active{background:0 0;color:rgba(0,0,0,.87)}.ui.star.rating .icon{width:1.25em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none}.ui.star.rating .active.icon{background:0 0!important;color:#ffe623!important;text-shadow:0 -1px 0 #ddc507,-1px 0 0 #ddc507,0 1px 0 #ddc507,1px 0 0 #ddc507!important}.ui.star.rating .icon.selected,.ui.star.rating .icon.selected.active{background:0 0!important;color:#fc0!important;text-shadow:0 -1px 0 #e6a200,-1px 0 0 #e6a200,0 1px 0 #e6a200,1px 0 0 #e6a200!important}.ui.heart.rating .icon{width:1.4em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none!important}.ui.heart.rating .active.icon{background:0 0!important;color:#ff6d75!important;text-shadow:0 -1px 0 #cd0707,-1px 0 0 #cd0707,0 1px 0 #cd0707,1px 0 0 #cd0707!important}.ui.heart.rating .icon.selected,.ui.heart.rating .icon.selected.active{background:0 0!important;color:#ff3000!important;text-shadow:0 -1px 0 #aa0101,-1px 0 0 #aa0101,0 1px 0 #aa0101,1px 0 0 #aa0101!important}.ui.disabled.rating .icon{cursor:default}.ui.rating.selected .active.icon{opacity:1}.ui.rating .icon.selected,.ui.rating.selected .icon.selected{opacity:1}.ui.mini.rating{font-size:.78571429rem}.ui.tiny.rating{font-size:.85714286rem}.ui.small.rating{font-size:.92857143rem}.ui.rating{font-size:1rem}.ui.large.rating{font-size:1.14285714rem}.ui.huge.rating{font-size:1.42857143rem}.ui.massive.rating{font-size:2rem}@font-face{font-family:Rating;src:url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,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kIiRi5MI5vdUFfcni4vCBYufhJx8mn2ZepJ3i3aLeoR9fX18g3qLdwiLVAUO+yaLshWL+AQFi5GNkY+RjpCQj5KNj42PjI+LCPfAiwWPi4+Kj4mRiZCHj4aPhY2Fi4UIi/wEBYuEiYWHhoeGhoeFiIiKhoqHi4GLhI6EkQj7EvcN+xL7DQWEhYOIgouHi4eLh42EjoaPiJCHkImRi5IIDov3XRWLko2Rj5Kltq+vuKW4pbuZvYu9i7t9uHG4ca9npWCPhI2Fi4SLhYmEh4RxYGdoXnAIXnFbflmLWYtbmF6lXqZnrnG2h5KJkouRCLCLFaRkq2yxdLF0tH+4i7iLtJexorGiq6qksm64Z61goZZ3kXaLdItnfm1ycnJybX9oiwhoi22XcqRypH6pi6+LopGglp9gdWdpbl4I9xiwFYuHjIiOiI6IjoqPi4+LjoyOjo2OjY6Lj4ubkJmXl5eWmZGbi4+LjoyOjo2OjY6LjwiLj4mOiY6IjYiNh4tzi3eCenp6eoJ3i3MIDov3XRWLko2Sj5GouK+utqW3pbqYvouci5yJnIgIm6cFjY6NjI+LjIuNi42JjYqOio+JjomOiY6KjomOiY6JjoqNioyKjomMiYuHi4qLiouLCHdnbVVjQ2NDbVV3Zwh9cgWJiIiJiIuJi36SdJiIjYmOi46LjY+UlJlvl3KcdJ90oHeie6WHkYmSi5IIsIsVqlq0Z711CKGzBXqXfpqCnoKdhp6LoIuikaCWn2B1Z2luXgj3GLAVi4eMiI6IjoiOio+Lj4uOjI6OjY6NjouPi5uQmZeXl5aZkZuLj4uOjI6OjY6NjouPCIuPiY6JjoiNiI2Hi3OLd4J6enp6gneLcwji+10VoLAFtI+wmK2hrqKnqKKvdq1wp2uhCJ2rBZ1/nHycepx6mHqWeY+EjYWLhIuEiYWHhIR/gH1+fG9qaXJmeWV5Y4Jhiwi53BXb9yQFjIKMg4uEi3CDc3x1fHV3fHOBCA6L1BWL90sFi5WPlJKSkpKTj5aLCNmLBZKPmJqepJaZlZeVlY+Qj5ONl42WjpeOmI+YkZWTk5OSk46Vi5uLmYiYhZiFlIGSfgiSfo55i3WLeYd5gXgIvosFn4uchJl8mn2Seot3i3qGfIJ9jYSLhYuEi3yIfoR+i4eLh4uHi3eGen99i3CDdnt8CHt8dYNwiwhmiwV5i3mNeY95kHeRc5N1k36Ph4sIOYsFgIuDjoSShJKHlIuVCLCdFYuGjIePiI+Hj4mQi5CLj42Pj46OjY+LkIuQiZCIjoePh42Gi4aLh4mHh4eIioaLhgjUeRWUiwWNi46Lj4qOi4+KjYqOi4+Kj4mQio6KjYqNio+Kj4mQio6KjIqzfquEpIsIrosFr4uemouri5CKkYqQkY6QkI6SjpKNkouSi5KJkoiRlZWQlouYi5CKkImRiZGJj4iOCJGMkI+PlI+UjZKLkouViJODk4SSgo+CiwgmiwWLlpCalJ6UnpCbi5aLnoiYhJSFlH+QeYuGhoeDiYCJf4h/h3+IfoWBg4KHh4SCgH4Ii4qIiYiGh4aIh4mIiIiIh4eGh4aHh4eHiIiHiIeHiIiHiIeKh4mIioiLCIKLi/tLBQ6L90sVi/dLBYuVj5OSk5KSk46WiwjdiwWPi5iPoZOkk6CRnZCdj56Nn4sIq4sFpougg5x8m3yTd4txCIuJBZd8kHuLd4uHi4eLh5J+jn6LfIuEi4SJhZR9kHyLeot3hHp8fH19eoR3iwhYiwWVeI95i3mLdIh6hH6EfoKBfoV+hX2He4uBi4OPg5KFkYaTh5SHlYiTipOKk4qTiJMIiZSIkYiPgZSBl4CaeKR+moSPCD2LBYCLg4+EkoSSh5SLlQiw9zgVi4aMh4+Ij4ePiZCLkIuPjY+Pjo6Nj4uQi5CJkIiOh4+HjYaLhouHiYeHh4iKhouGCNT7OBWUiwWOi46Kj4mPio+IjoiPh4+IjoePiI+Hj4aPho6HjoiNiI6Hj4aOho6Ii4qWfpKDj4YIk4ORgY5+j36OgI1/jYCPg5CGnYuXj5GUkpSOmYuei5aGmoKfgp6GmouWCPCLBZSLlI+SkpOTjpOLlYuSiZKHlIeUho+Fi46PjY+NkY2RjJCLkIuYhpaBlY6RjZKLkgiLkomSiJKIkoaQhY6MkIyRi5CLm4aXgpOBkn6Pe4sIZosFcotrhGN9iouIioaJh4qHiomKiYqIioaKh4mHioiKiYuHioiLh4qIi4mLCIKLi/tLBQ77lIv3txWLkpCPlo0I9yOgzPcWBY6SkI+RiwiL/BL7FUcFh4mHioiLh4uIjImOiY6KjouPi4yLjYyOCKP3IyPwBYaQiZCLjwgOi/fFFYu1l6yjoqOjrZe2i5aLl4mYh5eHloWWhJaElIWShZOE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) format('woff');font-weight:400;font-style:normal}.ui.rating .icon{font-family:Rating;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.rating .icon:before{content:'\\f005'}.ui.rating .active.icon:before{content:'\\f005'}.ui.star.rating .icon:before{content:'\\f005'}.ui.star.rating .active.icon:before{content:'\\f005'}.ui.star.rating .partial.icon:before{content:'\\f006'}.ui.star.rating .partial.icon{content:'\\f005'}.ui.heart.rating .icon:before{content:'\\f004'}.ui.heart.rating .active.icon:before{content:'\\f004'}/*!\n * # Semantic UI 2.4.0 - Search\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;transform-origin:center top;white-space:normal;text-align:left;text-transform:none;background:#fff;margin-top:.5em;width:18em;border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid #d4d4d5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285714em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21ba45}.ui.search>.results>.message{padding:1em 1em}.ui.search>.results>.message .header{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#f3f4f5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#fff;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#f9fafb}.ui.search .action:hover{background:#e0e0e0}.ui.category.search>.results .category.active{background:#f3f4f5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none}.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search>.results .result.active .description{color:rgba(0,0,0,.85)}.ui.disabled.search{cursor:default;pointer-events:none;opacity:.45}.ui.search.selection .prompt{border-radius:.28571429rem}.ui.search.selection>.icon.input>.remove.icon{pointer-events:none;position:absolute;left:auto;opacity:0;color:'';top:0;right:0;-webkit-transition:color .1s ease,opacity .1s ease;transition:color .1s ease,opacity .1s ease}.ui.search.selection>.icon.input>.active.remove.icon{cursor:pointer;opacity:.8;pointer-events:auto}.ui.search.selection>.icon.input:not([class*=\"left icon\"])>.icon~.remove.icon{right:1.85714em}.ui.search.selection>.icon.input>.remove.icon:hover{opacity:1;color:#db2828}.ui.category.search .results{width:28em}.ui.category.search .results.animating,.ui.category.search .results.visible{display:table}.ui.category.search>.results .category{display:table-row;background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease}.ui.category.search>.results .category:last-child{border-bottom:none}.ui.category.search>.results .category:first-child .name+.result{border-radius:0 .28571429rem 0 0}.ui.category.search>.results .category:last-child .result:last-child{border-radius:0 0 .28571429rem 0}.ui.category.search>.results .category>.name{display:table-cell;text-overflow:ellipsis;width:100px;white-space:nowrap;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .results{display:table-cell;background:#fff;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .result{border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease;padding:.85714286em 1.14285714em}.ui[class*=\"left aligned\"].search>.results{right:auto;left:0}.ui[class*=\"right aligned\"].search>.results{right:0;left:auto}.ui.fluid.search .results{width:100%}.ui.mini.search{font-size:.78571429em}.ui.small.search{font-size:.92857143em}.ui.search{font-size:1em}.ui.large.search{font-size:1.14285714em}.ui.big.search{font-size:1.28571429em}.ui.huge.search{font-size:1.42857143em}.ui.massive.search{font-size:1.71428571em}@media only screen and (max-width:767px){.ui.search .results{max-width:calc(100vw - 2rem)}}/*!\n * # Semantic UI 2.4.0 - Shape\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.shape .side{display:none}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#e6e6e6;color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 2px rgba(0,0,0,.3);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute}.ui.shape.animating .sides{-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .active.side{display:block}/*!\n * # Semantic UI 2.4.0 - Sidebar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.sidebar{position:fixed;top:0;left:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:none;transition:none;will-change:transform;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;-webkit-overflow-scrolling:touch;height:100%!important;max-height:100%;border-radius:0!important;margin:0!important;overflow-y:auto!important;z-index:102}.ui.sidebar>*{-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.left.sidebar{right:auto;left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.sidebar{right:0!important;left:auto!important;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.bottom.sidebar,.ui.top.sidebar{width:100%!important;height:auto!important}.ui.top.sidebar{top:0!important;bottom:auto!important;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.sidebar{top:auto!important;bottom:0!important;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.pushable{height:100%;overflow-x:hidden;padding:0!important}body.pushable{background:#545454!important}.pushable:not(body){-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushable:not(body)>.fixed,.pushable:not(body)>.pusher:after,.pushable:not(body)>.ui.sidebar{position:absolute}.pushable>.fixed{position:fixed;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;will-change:transform;z-index:101}.pushable>.pusher{position:relative;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;min-height:100%;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:2}body.pushable>.pusher{background:#fff}.pushable>.pusher{background:inherit}.pushable>.pusher:after{position:fixed;top:0;right:0;content:'';background-color:rgba(0,0,0,.4);overflow:hidden;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;will-change:opacity;z-index:1000}.ui.sidebar.menu .item{border-radius:0!important}.pushable>.pusher.dimmed:after{width:100%!important;height:100%!important;opacity:1!important}.ui.animating.sidebar{visibility:visible}.ui.visible.sidebar{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.left.visible.sidebar,.ui.right.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.bottom.visible.sidebar,.ui.top.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.visible.left.sidebar~.fixed,.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0)}.ui.visible.right.sidebar~.fixed,.ui.visible.right.sidebar~.pusher{-webkit-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}.ui.visible.top.sidebar~.fixed,.ui.visible.top.sidebar~.pusher{-webkit-transform:translate3d(0,36px,0);transform:translate3d(0,36px,0)}.ui.visible.bottom.sidebar~.fixed,.ui.visible.bottom.sidebar~.pusher{-webkit-transform:translate3d(0,-36px,0);transform:translate3d(0,-36px,0)}.ui.visible.left.sidebar~.ui.visible.right.sidebar~.fixed,.ui.visible.left.sidebar~.ui.visible.right.sidebar~.pusher,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.fixed,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.thin.left.sidebar,.ui.thin.right.sidebar{width:150px}.ui[class*=\"very thin\"].left.sidebar,.ui[class*=\"very thin\"].right.sidebar{width:60px}.ui.left.sidebar,.ui.right.sidebar{width:260px}.ui.wide.left.sidebar,.ui.wide.right.sidebar{width:350px}.ui[class*=\"very wide\"].left.sidebar,.ui[class*=\"very wide\"].right.sidebar{width:475px}.ui.visible.thin.left.sidebar~.fixed,.ui.visible.thin.left.sidebar~.pusher{-webkit-transform:translate3d(150px,0,0);transform:translate3d(150px,0,0)}.ui.visible[class*=\"very thin\"].left.sidebar~.fixed,.ui.visible[class*=\"very thin\"].left.sidebar~.pusher{-webkit-transform:translate3d(60px,0,0);transform:translate3d(60px,0,0)}.ui.visible.wide.left.sidebar~.fixed,.ui.visible.wide.left.sidebar~.pusher{-webkit-transform:translate3d(350px,0,0);transform:translate3d(350px,0,0)}.ui.visible[class*=\"very wide\"].left.sidebar~.fixed,.ui.visible[class*=\"very wide\"].left.sidebar~.pusher{-webkit-transform:translate3d(475px,0,0);transform:translate3d(475px,0,0)}.ui.visible.thin.right.sidebar~.fixed,.ui.visible.thin.right.sidebar~.pusher{-webkit-transform:translate3d(-150px,0,0);transform:translate3d(-150px,0,0)}.ui.visible[class*=\"very thin\"].right.sidebar~.fixed,.ui.visible[class*=\"very thin\"].right.sidebar~.pusher{-webkit-transform:translate3d(-60px,0,0);transform:translate3d(-60px,0,0)}.ui.visible.wide.right.sidebar~.fixed,.ui.visible.wide.right.sidebar~.pusher{-webkit-transform:translate3d(-350px,0,0);transform:translate3d(-350px,0,0)}.ui.visible[class*=\"very wide\"].right.sidebar~.fixed,.ui.visible[class*=\"very wide\"].right.sidebar~.pusher{-webkit-transform:translate3d(-475px,0,0);transform:translate3d(-475px,0,0)}.ui.overlay.sidebar{z-index:102}.ui.left.overlay.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.overlay.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.overlay.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.overlay.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.animating.ui.overlay.sidebar,.ui.visible.overlay.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.left.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.right.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.top.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.bottom.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.overlay.sidebar~.fixed,.ui.visible.overlay.sidebar~.pusher{-webkit-transform:none!important;transform:none!important}.ui.push.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.push.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.push.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.push.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.push.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.visible.push.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}.ui.visible.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.slide.along.sidebar{z-index:1}.ui.left.slide.along.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.right.slide.along.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.top.slide.along.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.bottom.slide.along.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.animating.slide.along.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.along.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.slide.out.sidebar{z-index:1}.ui.left.slide.out.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.right.slide.out.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.top.slide.out.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.bottom.slide.out.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.animating.slide.out.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.out.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.scale.down.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.scale.down.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.scale.down.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.scale.down.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.scale.down.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.scale.down.left.sidebar~.pusher{-webkit-transform-origin:75% 50%;transform-origin:75% 50%}.ui.scale.down.right.sidebar~.pusher{-webkit-transform-origin:25% 50%;transform-origin:25% 50%}.ui.scale.down.top.sidebar~.pusher{-webkit-transform-origin:50% 75%;transform-origin:50% 75%}.ui.scale.down.bottom.sidebar~.pusher{-webkit-transform-origin:50% 25%;transform-origin:50% 25%}.ui.animating.scale.down>.visible.ui.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease, -webkit-transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.animating.scale.down.sidebar~.pusher,.ui.visible.scale.down.sidebar~.pusher{display:block!important;width:100%;height:100%;overflow:hidden!important}.ui.visible.scale.down.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.scale.down.sidebar~.pusher{-webkit-transform:scale(.75);transform:scale(.75)}/*!\n * # Semantic UI 2.4.0 - Sticky\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.sticky{position:static;-webkit-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky}/*!\n * # Semantic UI 2.4.0 - Tab\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}/*!\n * # Semantic UI 2.4.0 - Transition\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.transition{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animating.transition{-webkit-backface-visibility:hidden;backface-visibility:hidden;visibility:visible!important}.loading.transition{position:absolute;top:-99999px;left:-99999px}.hidden.transition{display:none;visibility:hidden}.visible.transition{display:block!important;visibility:visible!important}.disabled.transition{-webkit-animation-play-state:paused;animation-play-state:paused}.looping.transition{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.transition.browse{-webkit-animation-duration:.5s;animation-duration:.5s}.transition.browse.in{-webkit-animation-name:browseIn;animation-name:browseIn}.transition.browse.left.out,.transition.browse.out{-webkit-animation-name:browseOutLeft;animation-name:browseOutLeft}.transition.browse.right.out{-webkit-animation-name:browseOutRight;animation-name:browseOutRight}@-webkit-keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@-webkit-keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@-webkit-keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}.drop.transition{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.34,1.61,.7,1);animation-timing-function:cubic-bezier(.34,1.61,.7,1)}.drop.transition.in{-webkit-animation-name:dropIn;animation-name:dropIn}.drop.transition.out{-webkit-animation-name:dropOut;animation-name:dropOut}@-webkit-keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}@keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}.transition.fade.in{-webkit-animation-name:fadeIn;animation-name:fadeIn}.transition[class*=\"fade up\"].in{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}.transition[class*=\"fade down\"].in{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}.transition[class*=\"fade left\"].in{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}.transition[class*=\"fade right\"].in{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}.transition.fade.out{-webkit-animation-name:fadeOut;animation-name:fadeOut}.transition[class*=\"fade up\"].out{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}.transition[class*=\"fade down\"].out{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}.transition[class*=\"fade left\"].out{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}.transition[class*=\"fade right\"].out{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}.flip.transition.in,.flip.transition.out{-webkit-animation-duration:.6s;animation-duration:.6s}.horizontal.flip.transition.in{-webkit-animation-name:horizontalFlipIn;animation-name:horizontalFlipIn}.horizontal.flip.transition.out{-webkit-animation-name:horizontalFlipOut;animation-name:horizontalFlipOut}.vertical.flip.transition.in{-webkit-animation-name:verticalFlipIn;animation-name:verticalFlipIn}.vertical.flip.transition.out{-webkit-animation-name:verticalFlipOut;animation-name:verticalFlipOut}@-webkit-keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@-webkit-keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@-webkit-keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@-webkit-keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}@keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}.scale.transition.in{-webkit-animation-name:scaleIn;animation-name:scaleIn}.scale.transition.out{-webkit-animation-name:scaleOut;animation-name:scaleOut}@-webkit-keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition.fly{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.transition.fly.in{-webkit-animation-name:flyIn;animation-name:flyIn}.transition[class*=\"fly up\"].in{-webkit-animation-name:flyInUp;animation-name:flyInUp}.transition[class*=\"fly down\"].in{-webkit-animation-name:flyInDown;animation-name:flyInDown}.transition[class*=\"fly left\"].in{-webkit-animation-name:flyInLeft;animation-name:flyInLeft}.transition[class*=\"fly right\"].in{-webkit-animation-name:flyInRight;animation-name:flyInRight}.transition.fly.out{-webkit-animation-name:flyOut;animation-name:flyOut}.transition[class*=\"fly up\"].out{-webkit-animation-name:flyOutUp;animation-name:flyOutUp}.transition[class*=\"fly down\"].out{-webkit-animation-name:flyOutDown;animation-name:flyOutDown}.transition[class*=\"fly left\"].out{-webkit-animation-name:flyOutLeft;animation-name:flyOutLeft}.transition[class*=\"fly right\"].out{-webkit-animation-name:flyOutRight;animation-name:flyOutRight}@-webkit-keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@-webkit-keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.transition.slide.in,.transition[class*=\"slide down\"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"slide up\"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"slide left\"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"slide right\"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center left;transform-origin:center left}.transition.slide.out,.transition[class*=\"slide down\"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"slide up\"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"slide left\"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"slide right\"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@-webkit-keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}.transition.swing{-webkit-animation-duration:.8s;animation-duration:.8s}.transition[class*=\"swing down\"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"swing up\"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"swing left\"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"swing right\"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center left;transform-origin:center left}.transition.swing.out,.transition[class*=\"swing down\"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"swing up\"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"swing left\"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"swing right\"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@-webkit-keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@-webkit-keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@-webkit-keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}@keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}.transition.zoom.in{-webkit-animation-name:zoomIn;animation-name:zoomIn}.transition.zoom.out{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}.flash.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:flash;animation-name:flash}.shake.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:shake;animation-name:shake}.bounce.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:bounce;animation-name:bounce}.tada.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:tada;animation-name:tada}.pulse.transition{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-name:pulse;animation-name:pulse}.jiggle.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:jiggle;animation-name:jiggle}.transition.glow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:cubic-bezier(.19,1,.22,1);animation-timing-function:cubic-bezier(.19,1,.22,1)}.transition.glow{-webkit-animation-name:glow;animation-name:glow}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@-webkit-keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}@keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}", "",{"version":3,"sources":["webpack://node_modules/semantic-ui-css/semantic.min.css"],"names":[],"mappings":"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","sourcesContent":[" /*\n * # Semantic UI - 2.4.0\n * https://github.com/Semantic-Org/Semantic-UI\n * http://www.semantic-ui.com/\n *\n * Copyright 2014 Contributors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */\n@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin);/*!\n * # Semantic UI 2.4.0 - Reset\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=email],input[type=password],input[type=search],input[type=text]{-webkit-appearance:none;-moz-appearance:none}/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}template{display:none}[hidden]{display:none}/*!\n * # Semantic UI 2.4.0 - Site\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */body,html{height:100%}html{font-size:14px}body{margin:0;padding:0;overflow-x:hidden;min-width:320px;background:#fff;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87);font-smoothing:antialiased}h1,h2,h3,h4,h5{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.28571429em;margin:calc(2rem - .14285714em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.71428571rem}h3{font-size:1.28571429rem}h4{font-size:1.07142857rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}p:first-child{margin-top:0}p:last-child{margin-bottom:0}a{color:#4183c4;text-decoration:none}a:hover{color:#1e70bf;text-decoration:none}::-webkit-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::-moz-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::-moz-selection,textarea::-moz-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}body ::-webkit-scrollbar{-webkit-appearance:none;width:10px;height:10px}body ::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:0}body ::-webkit-scrollbar-thumb{cursor:pointer;border-radius:5px;background:rgba(0,0,0,.25);-webkit-transition:color .2s ease;transition:color .2s ease}body ::-webkit-scrollbar-thumb:window-inactive{background:rgba(0,0,0,.15)}body ::-webkit-scrollbar-thumb:hover{background:rgba(128,135,139,.8)}body .ui.inverted::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}body .ui.inverted::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}body .ui.inverted::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}body .ui.inverted::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}/*!\n * # Semantic UI 2.4.0 - Button\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.button{cursor:pointer;display:inline-block;min-height:1em;outline:0;border:none;vertical-align:baseline;background:#e0e1e2 none;color:rgba(0,0,0,.6);font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0 .25em 0 0;padding:.78571429em 1.5em .78571429em;text-transform:none;text-shadow:none;font-weight:700;line-height:1em;font-style:normal;text-align:center;text-decoration:none;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease;transition:opacity .1s ease,background-color .1s ease,color .1s ease,box-shadow .1s ease,background .1s ease,-webkit-box-shadow .1s ease;will-change:'';-webkit-tap-highlight-color:transparent}.ui.button:hover{background-color:#cacbcd;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;color:rgba(0,0,0,.8)}.ui.button:hover .icon{opacity:.85}.ui.button:focus{background-color:#cacbcd;color:rgba(0,0,0,.8);background-image:''!important;-webkit-box-shadow:''!important;box-shadow:''!important}.ui.button:focus .icon{opacity:.85}.ui.active.button:active,.ui.button:active{background-color:#babbbc;background-image:'';color:rgba(0,0,0,.9);-webkit-box-shadow:0 0 0 1px transparent inset,none;box-shadow:0 0 0 1px transparent inset,none}.ui.active.button{background-color:#c0c1c2;background-image:none;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset;color:rgba(0,0,0,.95)}.ui.active.button:hover{background-color:#c0c1c2;background-image:none;color:rgba(0,0,0,.95)}.ui.active.button:active{background-color:#c0c1c2;background-image:none}.ui.loading.loading.loading.loading.loading.loading.button{position:relative;cursor:default;text-shadow:none!important;color:transparent!important;opacity:1;pointer-events:auto;-webkit-transition:all 0s linear,opacity .1s ease;transition:all 0s linear,opacity .1s ease}.ui.loading.button:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.15)}.ui.loading.button:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#fff transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.labeled.icon.loading.button .icon{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}@-webkit-keyframes button-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes button-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.loading.button:not(.inverted):before{border-color:rgba(0,0,0,.1)}.ui.basic.loading.button:not(.inverted):after{border-top-color:#767676}.ui.button:disabled,.ui.buttons .disabled.button,.ui.disabled.active.button,.ui.disabled.button,.ui.disabled.button:hover{cursor:default;opacity:.45!important;background-image:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;pointer-events:none!important}.ui.basic.buttons .ui.disabled.button{border-color:rgba(34,36,38,.5)}.ui.animated.button{position:relative;overflow:hidden;padding-right:0!important;vertical-align:middle;z-index:1}.ui.animated.button .content{will-change:transform,opacity}.ui.animated.button .visible.content{position:relative;margin-right:1.5em}.ui.animated.button .hidden.content{position:absolute;width:100%}.ui.animated.button .hidden.content,.ui.animated.button .visible.content{-webkit-transition:right .3s ease 0s;transition:right .3s ease 0s}.ui.animated.button .visible.content{left:auto;right:0}.ui.animated.button .hidden.content{top:50%;left:auto;right:-100%;margin-top:-.5em}.ui.animated.button:focus .visible.content,.ui.animated.button:hover .visible.content{left:auto;right:200%}.ui.animated.button:focus .hidden.content,.ui.animated.button:hover .hidden.content{left:auto;right:0}.ui.vertical.animated.button .hidden.content,.ui.vertical.animated.button .visible.content{-webkit-transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,-webkit-transform .3s ease;transition:top .3s ease,transform .3s ease;transition:top .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.vertical.animated.button .visible.content{-webkit-transform:translateY(0);transform:translateY(0);right:auto}.ui.vertical.animated.button .hidden.content{top:-50%;left:0;right:auto}.ui.vertical.animated.button:focus .visible.content,.ui.vertical.animated.button:hover .visible.content{-webkit-transform:translateY(200%);transform:translateY(200%);right:auto}.ui.vertical.animated.button:focus .hidden.content,.ui.vertical.animated.button:hover .hidden.content{top:50%;right:auto}.ui.fade.animated.button .hidden.content,.ui.fade.animated.button .visible.content{-webkit-transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,-webkit-transform .3s ease;transition:opacity .3s ease,transform .3s ease;transition:opacity .3s ease,transform .3s ease,-webkit-transform .3s ease}.ui.fade.animated.button .visible.content{left:auto;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.fade.animated.button .hidden.content{opacity:0;left:0;right:auto;-webkit-transform:scale(1.5);transform:scale(1.5)}.ui.fade.animated.button:focus .visible.content,.ui.fade.animated.button:hover .visible.content{left:auto;right:auto;opacity:0;-webkit-transform:scale(.75);transform:scale(.75)}.ui.fade.animated.button:focus .hidden.content,.ui.fade.animated.button:hover .hidden.content{left:0;right:auto;opacity:1;-webkit-transform:scale(1);transform:scale(1)}.ui.inverted.button{-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;background:transparent none;color:#fff;text-shadow:none!important}.ui.inverted.buttons .button{margin:0 0 0 -2px}.ui.inverted.buttons .button:first-child{margin-left:0}.ui.inverted.vertical.buttons .button{margin:0 0 -2px 0}.ui.inverted.vertical.buttons .button:first-child{margin-top:0}.ui.inverted.button:hover{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active,.ui.inverted.button:focus{background:#fff;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important;color:rgba(0,0,0,.8)}.ui.inverted.button.active:focus{background:#dcddde;-webkit-box-shadow:0 0 0 2px #dcddde inset!important;box-shadow:0 0 0 2px #dcddde inset!important;color:rgba(0,0,0,.8)}.ui.labeled.button:not(.icon){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background:0 0!important;padding:0!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.labeled.button>.button{margin:0}.ui.labeled.button>.label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 0 0 -1px!important;padding:'';font-size:1em;border-color:rgba(34,36,38,.15)}.ui.labeled.button>.tag.label:before{width:1.85em;height:1.85em}.ui.labeled.button:not([class*=\"left labeled\"])>.button{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.button:not([class*=\"left labeled\"])>.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*=\"left labeled\"].button>.button{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*=\"left labeled\"].button>.label{border-top-right-radius:0;border-bottom-right-radius:0}.ui.facebook.button{background-color:#3b5998;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.facebook.button:hover{background-color:#304d8a;color:#fff;text-shadow:none}.ui.facebook.button:active{background-color:#2d4373;color:#fff;text-shadow:none}.ui.twitter.button{background-color:#55acee;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.twitter.button:hover{background-color:#35a2f4;color:#fff;text-shadow:none}.ui.twitter.button:active{background-color:#2795e9;color:#fff;text-shadow:none}.ui.google.plus.button{background-color:#dd4b39;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.google.plus.button:hover{background-color:#e0321c;color:#fff;text-shadow:none}.ui.google.plus.button:active{background-color:#c23321;color:#fff;text-shadow:none}.ui.linkedin.button{background-color:#1f88be;color:#fff;text-shadow:none}.ui.linkedin.button:hover{background-color:#147baf;color:#fff;text-shadow:none}.ui.linkedin.button:active{background-color:#186992;color:#fff;text-shadow:none}.ui.youtube.button{background-color:red;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.youtube.button:hover{background-color:#e60000;color:#fff;text-shadow:none}.ui.youtube.button:active{background-color:#c00;color:#fff;text-shadow:none}.ui.instagram.button{background-color:#49769c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.instagram.button:hover{background-color:#3d698e;color:#fff;text-shadow:none}.ui.instagram.button:active{background-color:#395c79;color:#fff;text-shadow:none}.ui.pinterest.button{background-color:#bd081c;color:#fff;text-shadow:none;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pinterest.button:hover{background-color:#ac0013;color:#fff;text-shadow:none}.ui.pinterest.button:active{background-color:#8c0615;color:#fff;text-shadow:none}.ui.vk.button{background-color:#4d7198;color:#fff;background-image:none;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.vk.button:hover{background-color:#41648a;color:#fff}.ui.vk.button:active{background-color:#3c5876;color:#fff}.ui.button>.icon:not(.button){height:.85714286em;opacity:.8;margin:0 .42857143em 0 -.21428571em;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;vertical-align:'';color:''}.ui.button:not(.icon)>.icon:not(.button):not(.dropdown){margin:0 .42857143em 0 -.21428571em}.ui.button:not(.icon)>.right.icon:not(.button):not(.dropdown){margin:0 -.21428571em 0 .42857143em}.ui[class*=\"left floated\"].button,.ui[class*=\"left floated\"].buttons{float:left;margin-left:0;margin-right:.25em}.ui[class*=\"right floated\"].button,.ui[class*=\"right floated\"].buttons{float:right;margin-right:0;margin-left:.25em}.ui.compact.button,.ui.compact.buttons .button{padding:.58928571em 1.125em .58928571em}.ui.compact.icon.button,.ui.compact.icon.buttons .button{padding:.58928571em .58928571em .58928571em}.ui.compact.labeled.icon.button,.ui.compact.labeled.icon.buttons .button{padding:.58928571em 3.69642857em .58928571em}.ui.mini.button,.ui.mini.buttons .button,.ui.mini.buttons .or{font-size:.78571429rem}.ui.tiny.button,.ui.tiny.buttons .button,.ui.tiny.buttons .or{font-size:.85714286rem}.ui.small.button,.ui.small.buttons .button,.ui.small.buttons .or{font-size:.92857143rem}.ui.button,.ui.buttons .button,.ui.buttons .or{font-size:1rem}.ui.large.button,.ui.large.buttons .button,.ui.large.buttons .or{font-size:1.14285714rem}.ui.big.button,.ui.big.buttons .button,.ui.big.buttons .or{font-size:1.28571429rem}.ui.huge.button,.ui.huge.buttons .button,.ui.huge.buttons .or{font-size:1.42857143rem}.ui.massive.button,.ui.massive.buttons .button,.ui.massive.buttons .or{font-size:1.71428571rem}.ui.icon.button,.ui.icon.buttons .button{padding:.78571429em .78571429em .78571429em}.ui.icon.button>.icon,.ui.icon.buttons .button>.icon{opacity:.9;margin:0!important;vertical-align:top}.ui.basic.button,.ui.basic.buttons .button{background:transparent none!important;color:rgba(0,0,0,.6)!important;font-weight:400;border-radius:.28571429rem;text-transform:none;text-shadow:none!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.basic.buttons{-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem}.ui.basic.buttons .button{border-radius:0}.ui.basic.button:hover,.ui.basic.buttons .button:hover{background:#fff!important;color:rgba(0,0,0,.8)!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:focus,.ui.basic.buttons .button:focus{background:#fff!important;color:rgba(0,0,0,.8)!important;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.basic.button:active,.ui.basic.buttons .button:active{background:#f8f8f8!important;color:rgba(0,0,0,.9)!important;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset}.ui.basic.active.button,.ui.basic.buttons .active.button{background:rgba(0,0,0,.05)!important;-webkit-box-shadow:''!important;box-shadow:''!important;color:rgba(0,0,0,.95)!important}.ui.basic.active.button:hover,.ui.basic.buttons .active.button:hover{background-color:rgba(0,0,0,.05)}.ui.basic.buttons .button:hover{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(34,36,38,.35) inset,0 0 0 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .button:active{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset;box-shadow:0 0 0 1px rgba(0,0,0,.15) inset,0 1px 4px 0 rgba(34,36,38,.15) inset inset}.ui.basic.buttons .active.button{-webkit-box-shadow:''!important;box-shadow:''!important}.ui.basic.inverted.button,.ui.basic.inverted.buttons .button{background-color:transparent!important;color:#f9fafb!important;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important}.ui.basic.inverted.button:hover,.ui.basic.inverted.buttons .button:hover{color:#fff!important;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.inverted.button:focus,.ui.basic.inverted.buttons .button:focus{color:#fff!important;-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.inverted.button:active,.ui.basic.inverted.buttons .button:active{background-color:rgba(255,255,255,.08)!important;color:#fff!important;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.9) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.9) inset!important}.ui.basic.inverted.active.button,.ui.basic.inverted.buttons .active.button{background-color:rgba(255,255,255,.08);color:#fff;text-shadow:none;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.7) inset;box-shadow:0 0 0 2px rgba(255,255,255,.7) inset}.ui.basic.inverted.active.button:hover,.ui.basic.inverted.buttons .active.button:hover{background-color:rgba(255,255,255,.15);-webkit-box-shadow:0 0 0 2px #fff inset!important;box-shadow:0 0 0 2px #fff inset!important}.ui.basic.buttons .button{border-left:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.vertical.buttons .button{border-left:none}.ui.basic.vertical.buttons .button{border-left-width:0;border-top:1px solid rgba(34,36,38,.15)}.ui.basic.vertical.buttons .button:first-child{border-top-width:0}.ui.labeled.icon.button,.ui.labeled.icon.buttons .button{position:relative;padding-left:4.07142857em!important;padding-right:1.5em!important}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{position:absolute;height:100%;line-height:1;border-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit;text-align:center;margin:0;width:2.57142857em;background-color:rgba(0,0,0,.05);color:'';-webkit-box-shadow:-1px 0 0 0 transparent inset;box-shadow:-1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon,.ui.labeled.icon.buttons>.button>.icon{top:0;left:0}.ui[class*=\"right labeled\"].icon.button{padding-right:4.07142857em!important;padding-left:1.5em!important}.ui[class*=\"right labeled\"].icon.button>.icon{left:auto;right:0;border-radius:0;border-top-right-radius:inherit;border-bottom-right-radius:inherit;-webkit-box-shadow:1px 0 0 0 transparent inset;box-shadow:1px 0 0 0 transparent inset}.ui.labeled.icon.button>.icon:after,.ui.labeled.icon.button>.icon:before,.ui.labeled.icon.buttons>.button>.icon:after,.ui.labeled.icon.buttons>.button>.icon:before{display:block;position:absolute;width:100%;top:50%;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.labeled.icon.buttons .button>.icon{border-radius:0}.ui.labeled.icon.buttons .button:first-child>.icon{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.labeled.icon.buttons .button:last-child>.icon{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:first-child>.icon{border-radius:0;border-top-left-radius:.28571429rem}.ui.vertical.labeled.icon.buttons .button:last-child>.icon{border-radius:0;border-bottom-left-radius:.28571429rem}.ui.fluid[class*=\"left labeled\"].icon.button,.ui.fluid[class*=\"right labeled\"].icon.button{padding-left:1.5em!important;padding-right:1.5em!important}.ui.button.toggle.active,.ui.buttons .button.toggle.active,.ui.toggle.buttons .active.button{background-color:#21ba45!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none;color:#fff!important}.ui.button.toggle.active:hover{background-color:#16ab39!important;text-shadow:none;color:#fff!important}.ui.circular.button{border-radius:10em}.ui.circular.button>.icon{width:1em;vertical-align:baseline}.ui.buttons .or{position:relative;width:.3em;height:2.57142857em;z-index:3}.ui.buttons .or:before{position:absolute;text-align:center;border-radius:500rem;content:'or';top:50%;left:50%;background-color:#fff;text-shadow:none;margin-top:-.89285714em;margin-left:-.89285714em;width:1.78571429em;height:1.78571429em;line-height:1.78571429em;color:rgba(0,0,0,.4);font-style:normal;font-weight:700;-webkit-box-shadow:0 0 0 1px transparent inset;box-shadow:0 0 0 1px transparent inset}.ui.buttons .or[data-text]:before{content:attr(data-text)}.ui.fluid.buttons .or{width:0!important}.ui.fluid.buttons .or:after{display:none}.ui.attached.button{position:relative;display:block;margin:0;border-radius:0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15)!important;box-shadow:0 0 0 1px rgba(34,36,38,.15)!important}.ui.attached.top.button{border-radius:.28571429rem .28571429rem 0 0}.ui.attached.bottom.button{border-radius:0 0 .28571429rem .28571429rem}.ui.left.attached.button{display:inline-block;border-left:none;text-align:right;padding-right:.75em;border-radius:.28571429rem 0 0 .28571429rem}.ui.right.attached.button{display:inline-block;text-align:left;padding-left:.75em;border-radius:0 .28571429rem .28571429rem 0}.ui.attached.buttons{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:0;width:auto!important;z-index:2;margin-left:-1px;margin-right:-1px}.ui.attached.buttons .button{margin:0}.ui.attached.buttons .button:first-child{border-radius:0}.ui.attached.buttons .button:last-child{border-radius:0}.ui[class*=\"top attached\"].buttons{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0}.ui[class*=\"top attached\"].buttons .button:first-child{border-radius:.28571429rem 0 0 0}.ui[class*=\"top attached\"].buttons .button:last-child{border-radius:0 .28571429rem 0 0}.ui[class*=\"bottom attached\"].buttons{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"bottom attached\"].buttons .button:first-child{border-radius:0 0 0 .28571429rem}.ui[class*=\"bottom attached\"].buttons .button:last-child{border-radius:0 0 .28571429rem 0}.ui[class*=\"left attached\"].buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:0;margin-left:-1px;border-radius:0 .28571429rem .28571429rem 0}.ui[class*=\"left attached\"].buttons .button:first-child{margin-left:-1px;border-radius:0 .28571429rem 0 0}.ui[class*=\"left attached\"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 .28571429rem 0}.ui[class*=\"right attached\"].buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-left:0;margin-right:-1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"right attached\"].buttons .button:first-child{margin-left:-1px;border-radius:.28571429rem 0 0 0}.ui[class*=\"right attached\"].buttons .button:last-child{margin-left:-1px;border-radius:0 0 0 .28571429rem}.ui.fluid.button,.ui.fluid.buttons{width:100%}.ui.fluid.button{display:block}.ui.two.buttons{width:100%}.ui.two.buttons>.button{width:50%}.ui.three.buttons{width:100%}.ui.three.buttons>.button{width:33.333%}.ui.four.buttons{width:100%}.ui.four.buttons>.button{width:25%}.ui.five.buttons{width:100%}.ui.five.buttons>.button{width:20%}.ui.six.buttons{width:100%}.ui.six.buttons>.button{width:16.666%}.ui.seven.buttons{width:100%}.ui.seven.buttons>.button{width:14.285%}.ui.eight.buttons{width:100%}.ui.eight.buttons>.button{width:12.5%}.ui.nine.buttons{width:100%}.ui.nine.buttons>.button{width:11.11%}.ui.ten.buttons{width:100%}.ui.ten.buttons>.button{width:10%}.ui.eleven.buttons{width:100%}.ui.eleven.buttons>.button{width:9.09%}.ui.twelve.buttons{width:100%}.ui.twelve.buttons>.button{width:8.3333%}.ui.fluid.vertical.buttons,.ui.fluid.vertical.buttons>.button{display:-webkit-box;display:-ms-flexbox;display:flex;width:auto}.ui.two.vertical.buttons>.button{height:50%}.ui.three.vertical.buttons>.button{height:33.333%}.ui.four.vertical.buttons>.button{height:25%}.ui.five.vertical.buttons>.button{height:20%}.ui.six.vertical.buttons>.button{height:16.666%}.ui.seven.vertical.buttons>.button{height:14.285%}.ui.eight.vertical.buttons>.button{height:12.5%}.ui.nine.vertical.buttons>.button{height:11.11%}.ui.ten.vertical.buttons>.button{height:10%}.ui.eleven.vertical.buttons>.button{height:9.09%}.ui.twelve.vertical.buttons>.button{height:8.3333%}.ui.black.button,.ui.black.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.black.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.black.button:hover,.ui.black.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.black.button:focus,.ui.black.buttons .button:focus{background-color:#2f3032;color:#fff;text-shadow:none}.ui.black.button:active,.ui.black.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.black.active.button,.ui.black.button .active.button:active,.ui.black.buttons .active.button,.ui.black.buttons .active.button:active{background-color:#0f0f10;color:#fff;text-shadow:none}.ui.basic.black.button,.ui.basic.black.buttons .button{-webkit-box-shadow:0 0 0 1px #1b1c1d inset!important;box-shadow:0 0 0 1px #1b1c1d inset!important;color:#1b1c1d!important}.ui.basic.black.button:hover,.ui.basic.black.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#27292a!important}.ui.basic.black.button:focus,.ui.basic.black.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #2f3032 inset!important;box-shadow:0 0 0 1px #2f3032 inset!important;color:#27292a!important}.ui.basic.black.active.button,.ui.basic.black.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0f0f10 inset!important;box-shadow:0 0 0 1px #0f0f10 inset!important;color:#343637!important}.ui.basic.black.button:active,.ui.basic.black.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset!important;box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.buttons:not(.vertical)>.basic.black.button:not(:first-child){margin-left:-1px}.ui.inverted.black.button,.ui.inverted.black.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset!important;box-shadow:0 0 0 2px #d4d4d5 inset!important;color:#fff}.ui.inverted.black.button.active,.ui.inverted.black.button:active,.ui.inverted.black.button:focus,.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button.active,.ui.inverted.black.buttons .button:active,.ui.inverted.black.buttons .button:focus,.ui.inverted.black.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.black.button:hover,.ui.inverted.black.buttons .button:hover{background-color:#000}.ui.inverted.black.button:focus,.ui.inverted.black.buttons .button:focus{background-color:#000}.ui.inverted.black.active.button,.ui.inverted.black.buttons .active.button{background-color:#000}.ui.inverted.black.button:active,.ui.inverted.black.buttons .button:active{background-color:#000}.ui.inverted.black.basic.button,.ui.inverted.black.basic.buttons .button,.ui.inverted.black.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.black.basic.button:hover,.ui.inverted.black.basic.buttons .button:hover,.ui.inverted.black.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.inverted.black.basic.button:focus,.ui.inverted.black.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#545454!important}.ui.inverted.black.basic.active.button,.ui.inverted.black.basic.buttons .active.button,.ui.inverted.black.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.inverted.black.basic.button:active,.ui.inverted.black.basic.buttons .button:active,.ui.inverted.black.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #000 inset!important;box-shadow:0 0 0 2px #000 inset!important;color:#fff!important}.ui.grey.button,.ui.grey.buttons .button{background-color:#767676;color:#fff;text-shadow:none;background-image:none}.ui.grey.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.grey.button:hover,.ui.grey.buttons .button:hover{background-color:#838383;color:#fff;text-shadow:none}.ui.grey.button:focus,.ui.grey.buttons .button:focus{background-color:#8a8a8a;color:#fff;text-shadow:none}.ui.grey.button:active,.ui.grey.buttons .button:active{background-color:#909090;color:#fff;text-shadow:none}.ui.grey.active.button,.ui.grey.button .active.button:active,.ui.grey.buttons .active.button,.ui.grey.buttons .active.button:active{background-color:#696969;color:#fff;text-shadow:none}.ui.basic.grey.button,.ui.basic.grey.buttons .button{-webkit-box-shadow:0 0 0 1px #767676 inset!important;box-shadow:0 0 0 1px #767676 inset!important;color:#767676!important}.ui.basic.grey.button:hover,.ui.basic.grey.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #838383 inset!important;box-shadow:0 0 0 1px #838383 inset!important;color:#838383!important}.ui.basic.grey.button:focus,.ui.basic.grey.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #8a8a8a inset!important;box-shadow:0 0 0 1px #8a8a8a inset!important;color:#838383!important}.ui.basic.grey.active.button,.ui.basic.grey.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #696969 inset!important;box-shadow:0 0 0 1px #696969 inset!important;color:#909090!important}.ui.basic.grey.button:active,.ui.basic.grey.buttons .button:active{-webkit-box-shadow:0 0 0 1px #909090 inset!important;box-shadow:0 0 0 1px #909090 inset!important;color:#909090!important}.ui.buttons:not(.vertical)>.basic.grey.button:not(:first-child){margin-left:-1px}.ui.inverted.grey.button,.ui.inverted.grey.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d4d4d5 inset!important;box-shadow:0 0 0 2px #d4d4d5 inset!important;color:#fff}.ui.inverted.grey.button.active,.ui.inverted.grey.button:active,.ui.inverted.grey.button:focus,.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button.active,.ui.inverted.grey.buttons .button:active,.ui.inverted.grey.buttons .button:focus,.ui.inverted.grey.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.grey.button:hover,.ui.inverted.grey.buttons .button:hover{background-color:#cfd0d2}.ui.inverted.grey.button:focus,.ui.inverted.grey.buttons .button:focus{background-color:#c7c9cb}.ui.inverted.grey.active.button,.ui.inverted.grey.buttons .active.button{background-color:#cfd0d2}.ui.inverted.grey.button:active,.ui.inverted.grey.buttons .button:active{background-color:#c2c4c5}.ui.inverted.grey.basic.button,.ui.inverted.grey.basic.buttons .button,.ui.inverted.grey.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.grey.basic.button:hover,.ui.inverted.grey.basic.buttons .button:hover,.ui.inverted.grey.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset!important;box-shadow:0 0 0 2px #cfd0d2 inset!important;color:#fff!important}.ui.inverted.grey.basic.button:focus,.ui.inverted.grey.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c7c9cb inset!important;box-shadow:0 0 0 2px #c7c9cb inset!important;color:#dcddde!important}.ui.inverted.grey.basic.active.button,.ui.inverted.grey.basic.buttons .active.button,.ui.inverted.grey.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cfd0d2 inset!important;box-shadow:0 0 0 2px #cfd0d2 inset!important;color:#fff!important}.ui.inverted.grey.basic.button:active,.ui.inverted.grey.basic.buttons .button:active,.ui.inverted.grey.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #c2c4c5 inset!important;box-shadow:0 0 0 2px #c2c4c5 inset!important;color:#fff!important}.ui.brown.button,.ui.brown.buttons .button{background-color:#a5673f;color:#fff;text-shadow:none;background-image:none}.ui.brown.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.brown.button:hover,.ui.brown.buttons .button:hover{background-color:#975b33;color:#fff;text-shadow:none}.ui.brown.button:focus,.ui.brown.buttons .button:focus{background-color:#90532b;color:#fff;text-shadow:none}.ui.brown.button:active,.ui.brown.buttons .button:active{background-color:#805031;color:#fff;text-shadow:none}.ui.brown.active.button,.ui.brown.button .active.button:active,.ui.brown.buttons .active.button,.ui.brown.buttons .active.button:active{background-color:#995a31;color:#fff;text-shadow:none}.ui.basic.brown.button,.ui.basic.brown.buttons .button{-webkit-box-shadow:0 0 0 1px #a5673f inset!important;box-shadow:0 0 0 1px #a5673f inset!important;color:#a5673f!important}.ui.basic.brown.button:hover,.ui.basic.brown.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #975b33 inset!important;box-shadow:0 0 0 1px #975b33 inset!important;color:#975b33!important}.ui.basic.brown.button:focus,.ui.basic.brown.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #90532b inset!important;box-shadow:0 0 0 1px #90532b inset!important;color:#975b33!important}.ui.basic.brown.active.button,.ui.basic.brown.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #995a31 inset!important;box-shadow:0 0 0 1px #995a31 inset!important;color:#805031!important}.ui.basic.brown.button:active,.ui.basic.brown.buttons .button:active{-webkit-box-shadow:0 0 0 1px #805031 inset!important;box-shadow:0 0 0 1px #805031 inset!important;color:#805031!important}.ui.buttons:not(.vertical)>.basic.brown.button:not(:first-child){margin-left:-1px}.ui.inverted.brown.button,.ui.inverted.brown.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d67c1c inset!important;box-shadow:0 0 0 2px #d67c1c inset!important;color:#d67c1c}.ui.inverted.brown.button.active,.ui.inverted.brown.button:active,.ui.inverted.brown.button:focus,.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button.active,.ui.inverted.brown.buttons .button:active,.ui.inverted.brown.buttons .button:focus,.ui.inverted.brown.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.brown.button:hover,.ui.inverted.brown.buttons .button:hover{background-color:#c86f11}.ui.inverted.brown.button:focus,.ui.inverted.brown.buttons .button:focus{background-color:#c16808}.ui.inverted.brown.active.button,.ui.inverted.brown.buttons .active.button{background-color:#cc6f0d}.ui.inverted.brown.button:active,.ui.inverted.brown.buttons .button:active{background-color:#a96216}.ui.inverted.brown.basic.button,.ui.inverted.brown.basic.buttons .button,.ui.inverted.brown.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.brown.basic.button:hover,.ui.inverted.brown.basic.buttons .button:hover,.ui.inverted.brown.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #c86f11 inset!important;box-shadow:0 0 0 2px #c86f11 inset!important;color:#d67c1c!important}.ui.inverted.brown.basic.button:focus,.ui.inverted.brown.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #c16808 inset!important;box-shadow:0 0 0 2px #c16808 inset!important;color:#d67c1c!important}.ui.inverted.brown.basic.active.button,.ui.inverted.brown.basic.buttons .active.button,.ui.inverted.brown.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #cc6f0d inset!important;box-shadow:0 0 0 2px #cc6f0d inset!important;color:#d67c1c!important}.ui.inverted.brown.basic.button:active,.ui.inverted.brown.basic.buttons .button:active,.ui.inverted.brown.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #a96216 inset!important;box-shadow:0 0 0 2px #a96216 inset!important;color:#d67c1c!important}.ui.blue.button,.ui.blue.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.blue.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.blue.button:hover,.ui.blue.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.blue.button:focus,.ui.blue.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.blue.button:active,.ui.blue.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.blue.active.button,.ui.blue.button .active.button:active,.ui.blue.buttons .active.button,.ui.blue.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.blue.button,.ui.basic.blue.buttons .button{-webkit-box-shadow:0 0 0 1px #2185d0 inset!important;box-shadow:0 0 0 1px #2185d0 inset!important;color:#2185d0!important}.ui.basic.blue.button:hover,.ui.basic.blue.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1678c2 inset!important;box-shadow:0 0 0 1px #1678c2 inset!important;color:#1678c2!important}.ui.basic.blue.button:focus,.ui.basic.blue.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0d71bb inset!important;box-shadow:0 0 0 1px #0d71bb inset!important;color:#1678c2!important}.ui.basic.blue.active.button,.ui.basic.blue.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1279c6 inset!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.blue.button:active,.ui.basic.blue.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset!important;box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.buttons:not(.vertical)>.basic.blue.button:not(:first-child){margin-left:-1px}.ui.inverted.blue.button,.ui.inverted.blue.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset!important;box-shadow:0 0 0 2px #54c8ff inset!important;color:#54c8ff}.ui.inverted.blue.button.active,.ui.inverted.blue.button:active,.ui.inverted.blue.button:focus,.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button.active,.ui.inverted.blue.buttons .button:active,.ui.inverted.blue.buttons .button:focus,.ui.inverted.blue.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.blue.button:hover,.ui.inverted.blue.buttons .button:hover{background-color:#3ac0ff}.ui.inverted.blue.button:focus,.ui.inverted.blue.buttons .button:focus{background-color:#2bbbff}.ui.inverted.blue.active.button,.ui.inverted.blue.buttons .active.button{background-color:#3ac0ff}.ui.inverted.blue.button:active,.ui.inverted.blue.buttons .button:active{background-color:#21b8ff}.ui.inverted.blue.basic.button,.ui.inverted.blue.basic.buttons .button,.ui.inverted.blue.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.blue.basic.button:hover,.ui.inverted.blue.basic.buttons .button:hover,.ui.inverted.blue.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.blue.basic.button:focus,.ui.inverted.blue.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset!important;box-shadow:0 0 0 2px #2bbbff inset!important;color:#54c8ff!important}.ui.inverted.blue.basic.active.button,.ui.inverted.blue.basic.buttons .active.button,.ui.inverted.blue.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.blue.basic.button:active,.ui.inverted.blue.basic.buttons .button:active,.ui.inverted.blue.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset!important;box-shadow:0 0 0 2px #21b8ff inset!important;color:#54c8ff!important}.ui.green.button,.ui.green.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.green.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.green.button:hover,.ui.green.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.green.button:focus,.ui.green.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.green.button:active,.ui.green.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.green.active.button,.ui.green.button .active.button:active,.ui.green.buttons .active.button,.ui.green.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.green.button,.ui.basic.green.buttons .button{-webkit-box-shadow:0 0 0 1px #21ba45 inset!important;box-shadow:0 0 0 1px #21ba45 inset!important;color:#21ba45!important}.ui.basic.green.button:hover,.ui.basic.green.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #16ab39 inset!important;box-shadow:0 0 0 1px #16ab39 inset!important;color:#16ab39!important}.ui.basic.green.button:focus,.ui.basic.green.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0ea432 inset!important;box-shadow:0 0 0 1px #0ea432 inset!important;color:#16ab39!important}.ui.basic.green.active.button,.ui.basic.green.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #13ae38 inset!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.green.button:active,.ui.basic.green.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset!important;box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.buttons:not(.vertical)>.basic.green.button:not(:first-child){margin-left:-1px}.ui.inverted.green.button,.ui.inverted.green.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #2ecc40 inset!important;box-shadow:0 0 0 2px #2ecc40 inset!important;color:#2ecc40}.ui.inverted.green.button.active,.ui.inverted.green.button:active,.ui.inverted.green.button:focus,.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button.active,.ui.inverted.green.buttons .button:active,.ui.inverted.green.buttons .button:focus,.ui.inverted.green.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.green.button:hover,.ui.inverted.green.buttons .button:hover{background-color:#22be34}.ui.inverted.green.button:focus,.ui.inverted.green.buttons .button:focus{background-color:#19b82b}.ui.inverted.green.active.button,.ui.inverted.green.buttons .active.button{background-color:#1fc231}.ui.inverted.green.button:active,.ui.inverted.green.buttons .button:active{background-color:#25a233}.ui.inverted.green.basic.button,.ui.inverted.green.basic.buttons .button,.ui.inverted.green.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.green.basic.button:hover,.ui.inverted.green.basic.buttons .button:hover,.ui.inverted.green.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #22be34 inset!important;box-shadow:0 0 0 2px #22be34 inset!important;color:#2ecc40!important}.ui.inverted.green.basic.button:focus,.ui.inverted.green.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #19b82b inset!important;box-shadow:0 0 0 2px #19b82b inset!important;color:#2ecc40!important}.ui.inverted.green.basic.active.button,.ui.inverted.green.basic.buttons .active.button,.ui.inverted.green.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #1fc231 inset!important;box-shadow:0 0 0 2px #1fc231 inset!important;color:#2ecc40!important}.ui.inverted.green.basic.button:active,.ui.inverted.green.basic.buttons .button:active,.ui.inverted.green.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #25a233 inset!important;box-shadow:0 0 0 2px #25a233 inset!important;color:#2ecc40!important}.ui.orange.button,.ui.orange.buttons .button{background-color:#f2711c;color:#fff;text-shadow:none;background-image:none}.ui.orange.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.orange.button:hover,.ui.orange.buttons .button:hover{background-color:#f26202;color:#fff;text-shadow:none}.ui.orange.button:focus,.ui.orange.buttons .button:focus{background-color:#e55b00;color:#fff;text-shadow:none}.ui.orange.button:active,.ui.orange.buttons .button:active{background-color:#cf590c;color:#fff;text-shadow:none}.ui.orange.active.button,.ui.orange.button .active.button:active,.ui.orange.buttons .active.button,.ui.orange.buttons .active.button:active{background-color:#f56100;color:#fff;text-shadow:none}.ui.basic.orange.button,.ui.basic.orange.buttons .button{-webkit-box-shadow:0 0 0 1px #f2711c inset!important;box-shadow:0 0 0 1px #f2711c inset!important;color:#f2711c!important}.ui.basic.orange.button:hover,.ui.basic.orange.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #f26202 inset!important;box-shadow:0 0 0 1px #f26202 inset!important;color:#f26202!important}.ui.basic.orange.button:focus,.ui.basic.orange.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #e55b00 inset!important;box-shadow:0 0 0 1px #e55b00 inset!important;color:#f26202!important}.ui.basic.orange.active.button,.ui.basic.orange.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #f56100 inset!important;box-shadow:0 0 0 1px #f56100 inset!important;color:#cf590c!important}.ui.basic.orange.button:active,.ui.basic.orange.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cf590c inset!important;box-shadow:0 0 0 1px #cf590c inset!important;color:#cf590c!important}.ui.buttons:not(.vertical)>.basic.orange.button:not(:first-child){margin-left:-1px}.ui.inverted.orange.button,.ui.inverted.orange.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff851b inset!important;box-shadow:0 0 0 2px #ff851b inset!important;color:#ff851b}.ui.inverted.orange.button.active,.ui.inverted.orange.button:active,.ui.inverted.orange.button:focus,.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button.active,.ui.inverted.orange.buttons .button:active,.ui.inverted.orange.buttons .button:focus,.ui.inverted.orange.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.orange.button:hover,.ui.inverted.orange.buttons .button:hover{background-color:#ff7701}.ui.inverted.orange.button:focus,.ui.inverted.orange.buttons .button:focus{background-color:#f17000}.ui.inverted.orange.active.button,.ui.inverted.orange.buttons .active.button{background-color:#ff7701}.ui.inverted.orange.button:active,.ui.inverted.orange.buttons .button:active{background-color:#e76b00}.ui.inverted.orange.basic.button,.ui.inverted.orange.basic.buttons .button,.ui.inverted.orange.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.orange.basic.button:hover,.ui.inverted.orange.basic.buttons .button:hover,.ui.inverted.orange.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff7701 inset!important;box-shadow:0 0 0 2px #ff7701 inset!important;color:#ff851b!important}.ui.inverted.orange.basic.button:focus,.ui.inverted.orange.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f17000 inset!important;box-shadow:0 0 0 2px #f17000 inset!important;color:#ff851b!important}.ui.inverted.orange.basic.active.button,.ui.inverted.orange.basic.buttons .active.button,.ui.inverted.orange.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff7701 inset!important;box-shadow:0 0 0 2px #ff7701 inset!important;color:#ff851b!important}.ui.inverted.orange.basic.button:active,.ui.inverted.orange.basic.buttons .button:active,.ui.inverted.orange.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #e76b00 inset!important;box-shadow:0 0 0 2px #e76b00 inset!important;color:#ff851b!important}.ui.pink.button,.ui.pink.buttons .button{background-color:#e03997;color:#fff;text-shadow:none;background-image:none}.ui.pink.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.pink.button:hover,.ui.pink.buttons .button:hover{background-color:#e61a8d;color:#fff;text-shadow:none}.ui.pink.button:focus,.ui.pink.buttons .button:focus{background-color:#e10f85;color:#fff;text-shadow:none}.ui.pink.button:active,.ui.pink.buttons .button:active{background-color:#c71f7e;color:#fff;text-shadow:none}.ui.pink.active.button,.ui.pink.button .active.button:active,.ui.pink.buttons .active.button,.ui.pink.buttons .active.button:active{background-color:#ea158d;color:#fff;text-shadow:none}.ui.basic.pink.button,.ui.basic.pink.buttons .button{-webkit-box-shadow:0 0 0 1px #e03997 inset!important;box-shadow:0 0 0 1px #e03997 inset!important;color:#e03997!important}.ui.basic.pink.button:hover,.ui.basic.pink.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #e61a8d inset!important;box-shadow:0 0 0 1px #e61a8d inset!important;color:#e61a8d!important}.ui.basic.pink.button:focus,.ui.basic.pink.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #e10f85 inset!important;box-shadow:0 0 0 1px #e10f85 inset!important;color:#e61a8d!important}.ui.basic.pink.active.button,.ui.basic.pink.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #ea158d inset!important;box-shadow:0 0 0 1px #ea158d inset!important;color:#c71f7e!important}.ui.basic.pink.button:active,.ui.basic.pink.buttons .button:active{-webkit-box-shadow:0 0 0 1px #c71f7e inset!important;box-shadow:0 0 0 1px #c71f7e inset!important;color:#c71f7e!important}.ui.buttons:not(.vertical)>.basic.pink.button:not(:first-child){margin-left:-1px}.ui.inverted.pink.button,.ui.inverted.pink.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff8edf inset!important;box-shadow:0 0 0 2px #ff8edf inset!important;color:#ff8edf}.ui.inverted.pink.button.active,.ui.inverted.pink.button:active,.ui.inverted.pink.button:focus,.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button.active,.ui.inverted.pink.buttons .button:active,.ui.inverted.pink.buttons .button:focus,.ui.inverted.pink.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.pink.button:hover,.ui.inverted.pink.buttons .button:hover{background-color:#ff74d8}.ui.inverted.pink.button:focus,.ui.inverted.pink.buttons .button:focus{background-color:#ff65d3}.ui.inverted.pink.active.button,.ui.inverted.pink.buttons .active.button{background-color:#ff74d8}.ui.inverted.pink.button:active,.ui.inverted.pink.buttons .button:active{background-color:#ff5bd1}.ui.inverted.pink.basic.button,.ui.inverted.pink.basic.buttons .button,.ui.inverted.pink.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.pink.basic.button:hover,.ui.inverted.pink.basic.buttons .button:hover,.ui.inverted.pink.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff74d8 inset!important;box-shadow:0 0 0 2px #ff74d8 inset!important;color:#ff8edf!important}.ui.inverted.pink.basic.button:focus,.ui.inverted.pink.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff65d3 inset!important;box-shadow:0 0 0 2px #ff65d3 inset!important;color:#ff8edf!important}.ui.inverted.pink.basic.active.button,.ui.inverted.pink.basic.buttons .active.button,.ui.inverted.pink.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff74d8 inset!important;box-shadow:0 0 0 2px #ff74d8 inset!important;color:#ff8edf!important}.ui.inverted.pink.basic.button:active,.ui.inverted.pink.basic.buttons .button:active,.ui.inverted.pink.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff5bd1 inset!important;box-shadow:0 0 0 2px #ff5bd1 inset!important;color:#ff8edf!important}.ui.violet.button,.ui.violet.buttons .button{background-color:#6435c9;color:#fff;text-shadow:none;background-image:none}.ui.violet.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.violet.button:hover,.ui.violet.buttons .button:hover{background-color:#5829bb;color:#fff;text-shadow:none}.ui.violet.button:focus,.ui.violet.buttons .button:focus{background-color:#4f20b5;color:#fff;text-shadow:none}.ui.violet.button:active,.ui.violet.buttons .button:active{background-color:#502aa1;color:#fff;text-shadow:none}.ui.violet.active.button,.ui.violet.button .active.button:active,.ui.violet.buttons .active.button,.ui.violet.buttons .active.button:active{background-color:#5626bf;color:#fff;text-shadow:none}.ui.basic.violet.button,.ui.basic.violet.buttons .button{-webkit-box-shadow:0 0 0 1px #6435c9 inset!important;box-shadow:0 0 0 1px #6435c9 inset!important;color:#6435c9!important}.ui.basic.violet.button:hover,.ui.basic.violet.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #5829bb inset!important;box-shadow:0 0 0 1px #5829bb inset!important;color:#5829bb!important}.ui.basic.violet.button:focus,.ui.basic.violet.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #4f20b5 inset!important;box-shadow:0 0 0 1px #4f20b5 inset!important;color:#5829bb!important}.ui.basic.violet.active.button,.ui.basic.violet.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #5626bf inset!important;box-shadow:0 0 0 1px #5626bf inset!important;color:#502aa1!important}.ui.basic.violet.button:active,.ui.basic.violet.buttons .button:active{-webkit-box-shadow:0 0 0 1px #502aa1 inset!important;box-shadow:0 0 0 1px #502aa1 inset!important;color:#502aa1!important}.ui.buttons:not(.vertical)>.basic.violet.button:not(:first-child){margin-left:-1px}.ui.inverted.violet.button,.ui.inverted.violet.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #a291fb inset!important;box-shadow:0 0 0 2px #a291fb inset!important;color:#a291fb}.ui.inverted.violet.button.active,.ui.inverted.violet.button:active,.ui.inverted.violet.button:focus,.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button.active,.ui.inverted.violet.buttons .button:active,.ui.inverted.violet.buttons .button:focus,.ui.inverted.violet.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.violet.button:hover,.ui.inverted.violet.buttons .button:hover{background-color:#8a73ff}.ui.inverted.violet.button:focus,.ui.inverted.violet.buttons .button:focus{background-color:#7d64ff}.ui.inverted.violet.active.button,.ui.inverted.violet.buttons .active.button{background-color:#8a73ff}.ui.inverted.violet.button:active,.ui.inverted.violet.buttons .button:active{background-color:#7860f9}.ui.inverted.violet.basic.button,.ui.inverted.violet.basic.buttons .button,.ui.inverted.violet.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.violet.basic.button:hover,.ui.inverted.violet.basic.buttons .button:hover,.ui.inverted.violet.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #8a73ff inset!important;box-shadow:0 0 0 2px #8a73ff inset!important;color:#a291fb!important}.ui.inverted.violet.basic.button:focus,.ui.inverted.violet.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #7d64ff inset!important;box-shadow:0 0 0 2px #7d64ff inset!important;color:#a291fb!important}.ui.inverted.violet.basic.active.button,.ui.inverted.violet.basic.buttons .active.button,.ui.inverted.violet.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #8a73ff inset!important;box-shadow:0 0 0 2px #8a73ff inset!important;color:#a291fb!important}.ui.inverted.violet.basic.button:active,.ui.inverted.violet.basic.buttons .button:active,.ui.inverted.violet.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #7860f9 inset!important;box-shadow:0 0 0 2px #7860f9 inset!important;color:#a291fb!important}.ui.purple.button,.ui.purple.buttons .button{background-color:#a333c8;color:#fff;text-shadow:none;background-image:none}.ui.purple.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.purple.button:hover,.ui.purple.buttons .button:hover{background-color:#9627ba;color:#fff;text-shadow:none}.ui.purple.button:focus,.ui.purple.buttons .button:focus{background-color:#8f1eb4;color:#fff;text-shadow:none}.ui.purple.button:active,.ui.purple.buttons .button:active{background-color:#82299f;color:#fff;text-shadow:none}.ui.purple.active.button,.ui.purple.button .active.button:active,.ui.purple.buttons .active.button,.ui.purple.buttons .active.button:active{background-color:#9724be;color:#fff;text-shadow:none}.ui.basic.purple.button,.ui.basic.purple.buttons .button{-webkit-box-shadow:0 0 0 1px #a333c8 inset!important;box-shadow:0 0 0 1px #a333c8 inset!important;color:#a333c8!important}.ui.basic.purple.button:hover,.ui.basic.purple.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #9627ba inset!important;box-shadow:0 0 0 1px #9627ba inset!important;color:#9627ba!important}.ui.basic.purple.button:focus,.ui.basic.purple.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #8f1eb4 inset!important;box-shadow:0 0 0 1px #8f1eb4 inset!important;color:#9627ba!important}.ui.basic.purple.active.button,.ui.basic.purple.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #9724be inset!important;box-shadow:0 0 0 1px #9724be inset!important;color:#82299f!important}.ui.basic.purple.button:active,.ui.basic.purple.buttons .button:active{-webkit-box-shadow:0 0 0 1px #82299f inset!important;box-shadow:0 0 0 1px #82299f inset!important;color:#82299f!important}.ui.buttons:not(.vertical)>.basic.purple.button:not(:first-child){margin-left:-1px}.ui.inverted.purple.button,.ui.inverted.purple.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #dc73ff inset!important;box-shadow:0 0 0 2px #dc73ff inset!important;color:#dc73ff}.ui.inverted.purple.button.active,.ui.inverted.purple.button:active,.ui.inverted.purple.button:focus,.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button.active,.ui.inverted.purple.buttons .button:active,.ui.inverted.purple.buttons .button:focus,.ui.inverted.purple.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.purple.button:hover,.ui.inverted.purple.buttons .button:hover{background-color:#d65aff}.ui.inverted.purple.button:focus,.ui.inverted.purple.buttons .button:focus{background-color:#d24aff}.ui.inverted.purple.active.button,.ui.inverted.purple.buttons .active.button{background-color:#d65aff}.ui.inverted.purple.button:active,.ui.inverted.purple.buttons .button:active{background-color:#cf40ff}.ui.inverted.purple.basic.button,.ui.inverted.purple.basic.buttons .button,.ui.inverted.purple.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.purple.basic.button:hover,.ui.inverted.purple.basic.buttons .button:hover,.ui.inverted.purple.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #d65aff inset!important;box-shadow:0 0 0 2px #d65aff inset!important;color:#dc73ff!important}.ui.inverted.purple.basic.button:focus,.ui.inverted.purple.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #d24aff inset!important;box-shadow:0 0 0 2px #d24aff inset!important;color:#dc73ff!important}.ui.inverted.purple.basic.active.button,.ui.inverted.purple.basic.buttons .active.button,.ui.inverted.purple.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #d65aff inset!important;box-shadow:0 0 0 2px #d65aff inset!important;color:#dc73ff!important}.ui.inverted.purple.basic.button:active,.ui.inverted.purple.basic.buttons .button:active,.ui.inverted.purple.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cf40ff inset!important;box-shadow:0 0 0 2px #cf40ff inset!important;color:#dc73ff!important}.ui.red.button,.ui.red.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.red.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.red.button:hover,.ui.red.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.red.button:focus,.ui.red.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.red.button:active,.ui.red.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.red.active.button,.ui.red.button .active.button:active,.ui.red.buttons .active.button,.ui.red.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.red.button,.ui.basic.red.buttons .button{-webkit-box-shadow:0 0 0 1px #db2828 inset!important;box-shadow:0 0 0 1px #db2828 inset!important;color:#db2828!important}.ui.basic.red.button:hover,.ui.basic.red.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d01919 inset!important;box-shadow:0 0 0 1px #d01919 inset!important;color:#d01919!important}.ui.basic.red.button:focus,.ui.basic.red.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #ca1010 inset!important;box-shadow:0 0 0 1px #ca1010 inset!important;color:#d01919!important}.ui.basic.red.active.button,.ui.basic.red.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d41515 inset!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.red.button:active,.ui.basic.red.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset!important;box-shadow:0 0 0 1px #b21e1e inset!important;color:#b21e1e!important}.ui.buttons:not(.vertical)>.basic.red.button:not(:first-child){margin-left:-1px}.ui.inverted.red.button,.ui.inverted.red.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ff695e inset!important;box-shadow:0 0 0 2px #ff695e inset!important;color:#ff695e}.ui.inverted.red.button.active,.ui.inverted.red.button:active,.ui.inverted.red.button:focus,.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button.active,.ui.inverted.red.buttons .button:active,.ui.inverted.red.buttons .button:focus,.ui.inverted.red.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.red.button:hover,.ui.inverted.red.buttons .button:hover{background-color:#ff5144}.ui.inverted.red.button:focus,.ui.inverted.red.buttons .button:focus{background-color:#ff4335}.ui.inverted.red.active.button,.ui.inverted.red.buttons .active.button{background-color:#ff5144}.ui.inverted.red.button:active,.ui.inverted.red.buttons .button:active{background-color:#ff392b}.ui.inverted.red.basic.button,.ui.inverted.red.basic.buttons .button,.ui.inverted.red.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.red.basic.button:hover,.ui.inverted.red.basic.buttons .button:hover,.ui.inverted.red.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ff5144 inset!important;box-shadow:0 0 0 2px #ff5144 inset!important;color:#ff695e!important}.ui.inverted.red.basic.button:focus,.ui.inverted.red.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #ff4335 inset!important;box-shadow:0 0 0 2px #ff4335 inset!important;color:#ff695e!important}.ui.inverted.red.basic.active.button,.ui.inverted.red.basic.buttons .active.button,.ui.inverted.red.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ff5144 inset!important;box-shadow:0 0 0 2px #ff5144 inset!important;color:#ff695e!important}.ui.inverted.red.basic.button:active,.ui.inverted.red.basic.buttons .button:active,.ui.inverted.red.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ff392b inset!important;box-shadow:0 0 0 2px #ff392b inset!important;color:#ff695e!important}.ui.teal.button,.ui.teal.buttons .button{background-color:#00b5ad;color:#fff;text-shadow:none;background-image:none}.ui.teal.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.teal.button:hover,.ui.teal.buttons .button:hover{background-color:#009c95;color:#fff;text-shadow:none}.ui.teal.button:focus,.ui.teal.buttons .button:focus{background-color:#008c86;color:#fff;text-shadow:none}.ui.teal.button:active,.ui.teal.buttons .button:active{background-color:#00827c;color:#fff;text-shadow:none}.ui.teal.active.button,.ui.teal.button .active.button:active,.ui.teal.buttons .active.button,.ui.teal.buttons .active.button:active{background-color:#009c95;color:#fff;text-shadow:none}.ui.basic.teal.button,.ui.basic.teal.buttons .button{-webkit-box-shadow:0 0 0 1px #00b5ad inset!important;box-shadow:0 0 0 1px #00b5ad inset!important;color:#00b5ad!important}.ui.basic.teal.button:hover,.ui.basic.teal.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #009c95 inset!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#009c95!important}.ui.basic.teal.button:focus,.ui.basic.teal.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #008c86 inset!important;box-shadow:0 0 0 1px #008c86 inset!important;color:#009c95!important}.ui.basic.teal.active.button,.ui.basic.teal.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #009c95 inset!important;box-shadow:0 0 0 1px #009c95 inset!important;color:#00827c!important}.ui.basic.teal.button:active,.ui.basic.teal.buttons .button:active{-webkit-box-shadow:0 0 0 1px #00827c inset!important;box-shadow:0 0 0 1px #00827c inset!important;color:#00827c!important}.ui.buttons:not(.vertical)>.basic.teal.button:not(:first-child){margin-left:-1px}.ui.inverted.teal.button,.ui.inverted.teal.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #6dffff inset!important;box-shadow:0 0 0 2px #6dffff inset!important;color:#6dffff}.ui.inverted.teal.button.active,.ui.inverted.teal.button:active,.ui.inverted.teal.button:focus,.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button.active,.ui.inverted.teal.buttons .button:active,.ui.inverted.teal.buttons .button:focus,.ui.inverted.teal.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.teal.button:hover,.ui.inverted.teal.buttons .button:hover{background-color:#54ffff}.ui.inverted.teal.button:focus,.ui.inverted.teal.buttons .button:focus{background-color:#4ff}.ui.inverted.teal.active.button,.ui.inverted.teal.buttons .active.button{background-color:#54ffff}.ui.inverted.teal.button:active,.ui.inverted.teal.buttons .button:active{background-color:#3affff}.ui.inverted.teal.basic.button,.ui.inverted.teal.basic.buttons .button,.ui.inverted.teal.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.teal.basic.button:hover,.ui.inverted.teal.basic.buttons .button:hover,.ui.inverted.teal.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #54ffff inset!important;box-shadow:0 0 0 2px #54ffff inset!important;color:#6dffff!important}.ui.inverted.teal.basic.button:focus,.ui.inverted.teal.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #4ff inset!important;box-shadow:0 0 0 2px #4ff inset!important;color:#6dffff!important}.ui.inverted.teal.basic.active.button,.ui.inverted.teal.basic.buttons .active.button,.ui.inverted.teal.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #54ffff inset!important;box-shadow:0 0 0 2px #54ffff inset!important;color:#6dffff!important}.ui.inverted.teal.basic.button:active,.ui.inverted.teal.basic.buttons .button:active,.ui.inverted.teal.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #3affff inset!important;box-shadow:0 0 0 2px #3affff inset!important;color:#6dffff!important}.ui.olive.button,.ui.olive.buttons .button{background-color:#b5cc18;color:#fff;text-shadow:none;background-image:none}.ui.olive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.olive.button:hover,.ui.olive.buttons .button:hover{background-color:#a7bd0d;color:#fff;text-shadow:none}.ui.olive.button:focus,.ui.olive.buttons .button:focus{background-color:#a0b605;color:#fff;text-shadow:none}.ui.olive.button:active,.ui.olive.buttons .button:active{background-color:#8d9e13;color:#fff;text-shadow:none}.ui.olive.active.button,.ui.olive.button .active.button:active,.ui.olive.buttons .active.button,.ui.olive.buttons .active.button:active{background-color:#aac109;color:#fff;text-shadow:none}.ui.basic.olive.button,.ui.basic.olive.buttons .button{-webkit-box-shadow:0 0 0 1px #b5cc18 inset!important;box-shadow:0 0 0 1px #b5cc18 inset!important;color:#b5cc18!important}.ui.basic.olive.button:hover,.ui.basic.olive.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #a7bd0d inset!important;box-shadow:0 0 0 1px #a7bd0d inset!important;color:#a7bd0d!important}.ui.basic.olive.button:focus,.ui.basic.olive.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #a0b605 inset!important;box-shadow:0 0 0 1px #a0b605 inset!important;color:#a7bd0d!important}.ui.basic.olive.active.button,.ui.basic.olive.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #aac109 inset!important;box-shadow:0 0 0 1px #aac109 inset!important;color:#8d9e13!important}.ui.basic.olive.button:active,.ui.basic.olive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #8d9e13 inset!important;box-shadow:0 0 0 1px #8d9e13 inset!important;color:#8d9e13!important}.ui.buttons:not(.vertical)>.basic.olive.button:not(:first-child){margin-left:-1px}.ui.inverted.olive.button,.ui.inverted.olive.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #d9e778 inset!important;box-shadow:0 0 0 2px #d9e778 inset!important;color:#d9e778}.ui.inverted.olive.button.active,.ui.inverted.olive.button:active,.ui.inverted.olive.button:focus,.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button.active,.ui.inverted.olive.buttons .button:active,.ui.inverted.olive.buttons .button:focus,.ui.inverted.olive.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.olive.button:hover,.ui.inverted.olive.buttons .button:hover{background-color:#d8ea5c}.ui.inverted.olive.button:focus,.ui.inverted.olive.buttons .button:focus{background-color:#daef47}.ui.inverted.olive.active.button,.ui.inverted.olive.buttons .active.button{background-color:#daed59}.ui.inverted.olive.button:active,.ui.inverted.olive.buttons .button:active{background-color:#cddf4d}.ui.inverted.olive.basic.button,.ui.inverted.olive.basic.buttons .button,.ui.inverted.olive.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.olive.basic.button:hover,.ui.inverted.olive.basic.buttons .button:hover,.ui.inverted.olive.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #d8ea5c inset!important;box-shadow:0 0 0 2px #d8ea5c inset!important;color:#d9e778!important}.ui.inverted.olive.basic.button:focus,.ui.inverted.olive.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #daef47 inset!important;box-shadow:0 0 0 2px #daef47 inset!important;color:#d9e778!important}.ui.inverted.olive.basic.active.button,.ui.inverted.olive.basic.buttons .active.button,.ui.inverted.olive.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #daed59 inset!important;box-shadow:0 0 0 2px #daed59 inset!important;color:#d9e778!important}.ui.inverted.olive.basic.button:active,.ui.inverted.olive.basic.buttons .button:active,.ui.inverted.olive.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #cddf4d inset!important;box-shadow:0 0 0 2px #cddf4d inset!important;color:#d9e778!important}.ui.yellow.button,.ui.yellow.buttons .button{background-color:#fbbd08;color:#fff;text-shadow:none;background-image:none}.ui.yellow.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.yellow.button:hover,.ui.yellow.buttons .button:hover{background-color:#eaae00;color:#fff;text-shadow:none}.ui.yellow.button:focus,.ui.yellow.buttons .button:focus{background-color:#daa300;color:#fff;text-shadow:none}.ui.yellow.button:active,.ui.yellow.buttons .button:active{background-color:#cd9903;color:#fff;text-shadow:none}.ui.yellow.active.button,.ui.yellow.button .active.button:active,.ui.yellow.buttons .active.button,.ui.yellow.buttons .active.button:active{background-color:#eaae00;color:#fff;text-shadow:none}.ui.basic.yellow.button,.ui.basic.yellow.buttons .button{-webkit-box-shadow:0 0 0 1px #fbbd08 inset!important;box-shadow:0 0 0 1px #fbbd08 inset!important;color:#fbbd08!important}.ui.basic.yellow.button:hover,.ui.basic.yellow.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #eaae00 inset!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#eaae00!important}.ui.basic.yellow.button:focus,.ui.basic.yellow.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #daa300 inset!important;box-shadow:0 0 0 1px #daa300 inset!important;color:#eaae00!important}.ui.basic.yellow.active.button,.ui.basic.yellow.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #eaae00 inset!important;box-shadow:0 0 0 1px #eaae00 inset!important;color:#cd9903!important}.ui.basic.yellow.button:active,.ui.basic.yellow.buttons .button:active{-webkit-box-shadow:0 0 0 1px #cd9903 inset!important;box-shadow:0 0 0 1px #cd9903 inset!important;color:#cd9903!important}.ui.buttons:not(.vertical)>.basic.yellow.button:not(:first-child){margin-left:-1px}.ui.inverted.yellow.button,.ui.inverted.yellow.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #ffe21f inset!important;box-shadow:0 0 0 2px #ffe21f inset!important;color:#ffe21f}.ui.inverted.yellow.button.active,.ui.inverted.yellow.button:active,.ui.inverted.yellow.button:focus,.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button.active,.ui.inverted.yellow.buttons .button:active,.ui.inverted.yellow.buttons .button:focus,.ui.inverted.yellow.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:rgba(0,0,0,.6)}.ui.inverted.yellow.button:hover,.ui.inverted.yellow.buttons .button:hover{background-color:#ffdf05}.ui.inverted.yellow.button:focus,.ui.inverted.yellow.buttons .button:focus{background-color:#f5d500}.ui.inverted.yellow.active.button,.ui.inverted.yellow.buttons .active.button{background-color:#ffdf05}.ui.inverted.yellow.button:active,.ui.inverted.yellow.buttons .button:active{background-color:#ebcd00}.ui.inverted.yellow.basic.button,.ui.inverted.yellow.basic.buttons .button,.ui.inverted.yellow.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.yellow.basic.button:hover,.ui.inverted.yellow.basic.buttons .button:hover,.ui.inverted.yellow.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #ffdf05 inset!important;box-shadow:0 0 0 2px #ffdf05 inset!important;color:#ffe21f!important}.ui.inverted.yellow.basic.button:focus,.ui.inverted.yellow.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #f5d500 inset!important;box-shadow:0 0 0 2px #f5d500 inset!important;color:#ffe21f!important}.ui.inverted.yellow.basic.active.button,.ui.inverted.yellow.basic.buttons .active.button,.ui.inverted.yellow.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #ffdf05 inset!important;box-shadow:0 0 0 2px #ffdf05 inset!important;color:#ffe21f!important}.ui.inverted.yellow.basic.button:active,.ui.inverted.yellow.basic.buttons .button:active,.ui.inverted.yellow.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #ebcd00 inset!important;box-shadow:0 0 0 2px #ebcd00 inset!important;color:#ffe21f!important}.ui.primary.button,.ui.primary.buttons .button{background-color:#2185d0;color:#fff;text-shadow:none;background-image:none}.ui.primary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.primary.button:hover,.ui.primary.buttons .button:hover{background-color:#1678c2;color:#fff;text-shadow:none}.ui.primary.button:focus,.ui.primary.buttons .button:focus{background-color:#0d71bb;color:#fff;text-shadow:none}.ui.primary.button:active,.ui.primary.buttons .button:active{background-color:#1a69a4;color:#fff;text-shadow:none}.ui.primary.active.button,.ui.primary.button .active.button:active,.ui.primary.buttons .active.button,.ui.primary.buttons .active.button:active{background-color:#1279c6;color:#fff;text-shadow:none}.ui.basic.primary.button,.ui.basic.primary.buttons .button{-webkit-box-shadow:0 0 0 1px #2185d0 inset!important;box-shadow:0 0 0 1px #2185d0 inset!important;color:#2185d0!important}.ui.basic.primary.button:hover,.ui.basic.primary.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1678c2 inset!important;box-shadow:0 0 0 1px #1678c2 inset!important;color:#1678c2!important}.ui.basic.primary.button:focus,.ui.basic.primary.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0d71bb inset!important;box-shadow:0 0 0 1px #0d71bb inset!important;color:#1678c2!important}.ui.basic.primary.active.button,.ui.basic.primary.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #1279c6 inset!important;box-shadow:0 0 0 1px #1279c6 inset!important;color:#1a69a4!important}.ui.basic.primary.button:active,.ui.basic.primary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #1a69a4 inset!important;box-shadow:0 0 0 1px #1a69a4 inset!important;color:#1a69a4!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.primary.button,.ui.inverted.primary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #54c8ff inset!important;box-shadow:0 0 0 2px #54c8ff inset!important;color:#54c8ff}.ui.inverted.primary.button.active,.ui.inverted.primary.button:active,.ui.inverted.primary.button:focus,.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button.active,.ui.inverted.primary.buttons .button:active,.ui.inverted.primary.buttons .button:focus,.ui.inverted.primary.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.primary.button:hover,.ui.inverted.primary.buttons .button:hover{background-color:#3ac0ff}.ui.inverted.primary.button:focus,.ui.inverted.primary.buttons .button:focus{background-color:#2bbbff}.ui.inverted.primary.active.button,.ui.inverted.primary.buttons .active.button{background-color:#3ac0ff}.ui.inverted.primary.button:active,.ui.inverted.primary.buttons .button:active{background-color:#21b8ff}.ui.inverted.primary.basic.button,.ui.inverted.primary.basic.buttons .button,.ui.inverted.primary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.primary.basic.button:hover,.ui.inverted.primary.basic.buttons .button:hover,.ui.inverted.primary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.button:focus,.ui.inverted.primary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #2bbbff inset!important;box-shadow:0 0 0 2px #2bbbff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.active.button,.ui.inverted.primary.basic.buttons .active.button,.ui.inverted.primary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #3ac0ff inset!important;box-shadow:0 0 0 2px #3ac0ff inset!important;color:#54c8ff!important}.ui.inverted.primary.basic.button:active,.ui.inverted.primary.basic.buttons .button:active,.ui.inverted.primary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #21b8ff inset!important;box-shadow:0 0 0 2px #21b8ff inset!important;color:#54c8ff!important}.ui.secondary.button,.ui.secondary.buttons .button{background-color:#1b1c1d;color:#fff;text-shadow:none;background-image:none}.ui.secondary.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.secondary.button:hover,.ui.secondary.buttons .button:hover{background-color:#27292a;color:#fff;text-shadow:none}.ui.secondary.button:focus,.ui.secondary.buttons .button:focus{background-color:#2e3032;color:#fff;text-shadow:none}.ui.secondary.button:active,.ui.secondary.buttons .button:active{background-color:#343637;color:#fff;text-shadow:none}.ui.secondary.active.button,.ui.secondary.button .active.button:active,.ui.secondary.buttons .active.button,.ui.secondary.buttons .active.button:active{background-color:#27292a;color:#fff;text-shadow:none}.ui.basic.secondary.button,.ui.basic.secondary.buttons .button{-webkit-box-shadow:0 0 0 1px #1b1c1d inset!important;box-shadow:0 0 0 1px #1b1c1d inset!important;color:#1b1c1d!important}.ui.basic.secondary.button:hover,.ui.basic.secondary.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#27292a!important}.ui.basic.secondary.button:focus,.ui.basic.secondary.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #2e3032 inset!important;box-shadow:0 0 0 1px #2e3032 inset!important;color:#27292a!important}.ui.basic.secondary.active.button,.ui.basic.secondary.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #27292a inset!important;box-shadow:0 0 0 1px #27292a inset!important;color:#343637!important}.ui.basic.secondary.button:active,.ui.basic.secondary.buttons .button:active{-webkit-box-shadow:0 0 0 1px #343637 inset!important;box-shadow:0 0 0 1px #343637 inset!important;color:#343637!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.inverted.secondary.button,.ui.inverted.secondary.buttons .button{background-color:transparent;-webkit-box-shadow:0 0 0 2px #545454 inset!important;box-shadow:0 0 0 2px #545454 inset!important;color:#545454}.ui.inverted.secondary.button.active,.ui.inverted.secondary.button:active,.ui.inverted.secondary.button:focus,.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button.active,.ui.inverted.secondary.buttons .button:active,.ui.inverted.secondary.buttons .button:focus,.ui.inverted.secondary.buttons .button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.inverted.secondary.button:hover,.ui.inverted.secondary.buttons .button:hover{background-color:#616161}.ui.inverted.secondary.button:focus,.ui.inverted.secondary.buttons .button:focus{background-color:#686868}.ui.inverted.secondary.active.button,.ui.inverted.secondary.buttons .active.button{background-color:#616161}.ui.inverted.secondary.button:active,.ui.inverted.secondary.buttons .button:active{background-color:#6e6e6e}.ui.inverted.secondary.basic.button,.ui.inverted.secondary.basic.buttons .button,.ui.inverted.secondary.buttons .basic.button{background-color:transparent;-webkit-box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;box-shadow:0 0 0 2px rgba(255,255,255,.5) inset!important;color:#fff!important}.ui.inverted.secondary.basic.button:hover,.ui.inverted.secondary.basic.buttons .button:hover,.ui.inverted.secondary.buttons .basic.button:hover{-webkit-box-shadow:0 0 0 2px #616161 inset!important;box-shadow:0 0 0 2px #616161 inset!important;color:#545454!important}.ui.inverted.secondary.basic.button:focus,.ui.inverted.secondary.basic.buttons .button:focus{-webkit-box-shadow:0 0 0 2px #686868 inset!important;box-shadow:0 0 0 2px #686868 inset!important;color:#545454!important}.ui.inverted.secondary.basic.active.button,.ui.inverted.secondary.basic.buttons .active.button,.ui.inverted.secondary.buttons .basic.active.button{-webkit-box-shadow:0 0 0 2px #616161 inset!important;box-shadow:0 0 0 2px #616161 inset!important;color:#545454!important}.ui.inverted.secondary.basic.button:active,.ui.inverted.secondary.basic.buttons .button:active,.ui.inverted.secondary.buttons .basic.button:active{-webkit-box-shadow:0 0 0 2px #6e6e6e inset!important;box-shadow:0 0 0 2px #6e6e6e inset!important;color:#545454!important}.ui.positive.button,.ui.positive.buttons .button{background-color:#21ba45;color:#fff;text-shadow:none;background-image:none}.ui.positive.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.positive.button:hover,.ui.positive.buttons .button:hover{background-color:#16ab39;color:#fff;text-shadow:none}.ui.positive.button:focus,.ui.positive.buttons .button:focus{background-color:#0ea432;color:#fff;text-shadow:none}.ui.positive.button:active,.ui.positive.buttons .button:active{background-color:#198f35;color:#fff;text-shadow:none}.ui.positive.active.button,.ui.positive.button .active.button:active,.ui.positive.buttons .active.button,.ui.positive.buttons .active.button:active{background-color:#13ae38;color:#fff;text-shadow:none}.ui.basic.positive.button,.ui.basic.positive.buttons .button{-webkit-box-shadow:0 0 0 1px #21ba45 inset!important;box-shadow:0 0 0 1px #21ba45 inset!important;color:#21ba45!important}.ui.basic.positive.button:hover,.ui.basic.positive.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #16ab39 inset!important;box-shadow:0 0 0 1px #16ab39 inset!important;color:#16ab39!important}.ui.basic.positive.button:focus,.ui.basic.positive.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #0ea432 inset!important;box-shadow:0 0 0 1px #0ea432 inset!important;color:#16ab39!important}.ui.basic.positive.active.button,.ui.basic.positive.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #13ae38 inset!important;box-shadow:0 0 0 1px #13ae38 inset!important;color:#198f35!important}.ui.basic.positive.button:active,.ui.basic.positive.buttons .button:active{-webkit-box-shadow:0 0 0 1px #198f35 inset!important;box-shadow:0 0 0 1px #198f35 inset!important;color:#198f35!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.negative.button,.ui.negative.buttons .button{background-color:#db2828;color:#fff;text-shadow:none;background-image:none}.ui.negative.button{-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 0 rgba(34,36,38,.15) inset}.ui.negative.button:hover,.ui.negative.buttons .button:hover{background-color:#d01919;color:#fff;text-shadow:none}.ui.negative.button:focus,.ui.negative.buttons .button:focus{background-color:#ca1010;color:#fff;text-shadow:none}.ui.negative.button:active,.ui.negative.buttons .button:active{background-color:#b21e1e;color:#fff;text-shadow:none}.ui.negative.active.button,.ui.negative.button .active.button:active,.ui.negative.buttons .active.button,.ui.negative.buttons .active.button:active{background-color:#d41515;color:#fff;text-shadow:none}.ui.basic.negative.button,.ui.basic.negative.buttons .button{-webkit-box-shadow:0 0 0 1px #db2828 inset!important;box-shadow:0 0 0 1px #db2828 inset!important;color:#db2828!important}.ui.basic.negative.button:hover,.ui.basic.negative.buttons .button:hover{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d01919 inset!important;box-shadow:0 0 0 1px #d01919 inset!important;color:#d01919!important}.ui.basic.negative.button:focus,.ui.basic.negative.buttons .button:focus{background:0 0!important;-webkit-box-shadow:0 0 0 1px #ca1010 inset!important;box-shadow:0 0 0 1px #ca1010 inset!important;color:#d01919!important}.ui.basic.negative.active.button,.ui.basic.negative.buttons .active.button{background:0 0!important;-webkit-box-shadow:0 0 0 1px #d41515 inset!important;box-shadow:0 0 0 1px #d41515 inset!important;color:#b21e1e!important}.ui.basic.negative.button:active,.ui.basic.negative.buttons .button:active{-webkit-box-shadow:0 0 0 1px #b21e1e inset!important;box-shadow:0 0 0 1px #b21e1e inset!important;color:#b21e1e!important}.ui.buttons:not(.vertical)>.basic.primary.button:not(:first-child){margin-left:-1px}.ui.buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;font-size:0;vertical-align:baseline;margin:0 .25em 0 0}.ui.buttons:not(.basic):not(.inverted){-webkit-box-shadow:none;box-shadow:none}.ui.buttons:after{content:\".\";display:block;height:0;clear:both;visibility:hidden}.ui.buttons .button{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;margin:0;border-radius:0;margin:0}.ui.buttons:not(.basic):not(.inverted)>.button,.ui.buttons>.ui.button:not(.basic):not(.inverted){-webkit-box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px transparent inset,0 0 0 0 rgba(34,36,38,.15) inset}.ui.buttons .button:first-child{border-left:none;margin-left:0;border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.buttons .button:last-child{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.vertical.buttons .button{display:block;float:none;width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none;border-radius:0}.ui.vertical.buttons .button:first-child{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.vertical.buttons .button:last-child{margin-bottom:0;border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.buttons .button:only-child{border-radius:.28571429rem}/*!\n * # Semantic UI 2.4.0 - Container\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.container{display:block;max-width:100%!important}@media only screen and (max-width:767px){.ui.container{width:auto!important;margin-left:1em!important;margin-right:1em!important}.ui.grid.container{width:auto!important}.ui.relaxed.grid.container{width:auto!important}.ui.very.relaxed.grid.container{width:auto!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.container{width:723px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(723px + 2rem)!important}.ui.relaxed.grid.container{width:calc(723px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(723px + 5rem)!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.container{width:933px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(933px + 2rem)!important}.ui.relaxed.grid.container{width:calc(933px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(933px + 5rem)!important}}@media only screen and (min-width:1200px){.ui.container{width:1127px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(1127px + 2rem)!important}.ui.relaxed.grid.container{width:calc(1127px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(1127px + 5rem)!important}}.ui.text.container{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;max-width:700px!important;line-height:1.5}.ui.text.container{font-size:1.14285714rem}.ui.fluid.container{width:100%}.ui[class*=\"left aligned\"].container{text-align:left}.ui[class*=\"center aligned\"].container{text-align:center}.ui[class*=\"right aligned\"].container{text-align:right}.ui.justified.container{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}/*!\n * # Semantic UI 2.4.0 - Divider\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(255,255,255,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:'';line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:'';z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(255,255,255,.1);width:0%;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{position:static;left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#fff}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:rgba(255,255,255,.15)!important;border-right-color:rgba(255,255,255,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem}.ui.divider{font-size:1rem}.ui.horizontal.divider:after,.ui.horizontal.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}}/*!\n * # Semantic UI 2.4.0 - Flag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */i.flag:not(.icon){display:inline-block;width:16px;height:11px;line-height:11px;vertical-align:baseline;margin:0 .5em 0 0;text-decoration:inherit;speak:none;font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.flag:not(.icon):before{display:inline-block;content:'';background:url(themes/default/assets/images/flags.png) no-repeat -108px -1976px;width:16px;height:11px}i.flag.ad:before,i.flag.andorra:before{background-position:0 0}i.flag.ae:before,i.flag.uae:before,i.flag.united.arab.emirates:before{background-position:0 -26px}i.flag.af:before,i.flag.afghanistan:before{background-position:0 -52px}i.flag.ag:before,i.flag.antigua:before{background-position:0 -78px}i.flag.ai:before,i.flag.anguilla:before{background-position:0 -104px}i.flag.al:before,i.flag.albania:before{background-position:0 -130px}i.flag.am:before,i.flag.armenia:before{background-position:0 -156px}i.flag.an:before,i.flag.netherlands.antilles:before{background-position:0 -182px}i.flag.angola:before,i.flag.ao:before{background-position:0 -208px}i.flag.ar:before,i.flag.argentina:before{background-position:0 -234px}i.flag.american.samoa:before,i.flag.as:before{background-position:0 -260px}i.flag.at:before,i.flag.austria:before{background-position:0 -286px}i.flag.au:before,i.flag.australia:before{background-position:0 -312px}i.flag.aruba:before,i.flag.aw:before{background-position:0 -338px}i.flag.aland.islands:before,i.flag.ax:before{background-position:0 -364px}i.flag.az:before,i.flag.azerbaijan:before{background-position:0 -390px}i.flag.ba:before,i.flag.bosnia:before{background-position:0 -416px}i.flag.barbados:before,i.flag.bb:before{background-position:0 -442px}i.flag.bangladesh:before,i.flag.bd:before{background-position:0 -468px}i.flag.be:before,i.flag.belgium:before{background-position:0 -494px}i.flag.bf:before,i.flag.burkina.faso:before{background-position:0 -520px}i.flag.bg:before,i.flag.bulgaria:before{background-position:0 -546px}i.flag.bahrain:before,i.flag.bh:before{background-position:0 -572px}i.flag.bi:before,i.flag.burundi:before{background-position:0 -598px}i.flag.benin:before,i.flag.bj:before{background-position:0 -624px}i.flag.bermuda:before,i.flag.bm:before{background-position:0 -650px}i.flag.bn:before,i.flag.brunei:before{background-position:0 -676px}i.flag.bo:before,i.flag.bolivia:before{background-position:0 -702px}i.flag.br:before,i.flag.brazil:before{background-position:0 -728px}i.flag.bahamas:before,i.flag.bs:before{background-position:0 -754px}i.flag.bhutan:before,i.flag.bt:before{background-position:0 -780px}i.flag.bouvet.island:before,i.flag.bv:before{background-position:0 -806px}i.flag.botswana:before,i.flag.bw:before{background-position:0 -832px}i.flag.belarus:before,i.flag.by:before{background-position:0 -858px}i.flag.belize:before,i.flag.bz:before{background-position:0 -884px}i.flag.ca:before,i.flag.canada:before{background-position:0 -910px}i.flag.cc:before,i.flag.cocos.islands:before{background-position:0 -962px}i.flag.cd:before,i.flag.congo:before{background-position:0 -988px}i.flag.central.african.republic:before,i.flag.cf:before{background-position:0 -1014px}i.flag.cg:before,i.flag.congo.brazzaville:before{background-position:0 -1040px}i.flag.ch:before,i.flag.switzerland:before{background-position:0 -1066px}i.flag.ci:before,i.flag.cote.divoire:before{background-position:0 -1092px}i.flag.ck:before,i.flag.cook.islands:before{background-position:0 -1118px}i.flag.chile:before,i.flag.cl:before{background-position:0 -1144px}i.flag.cameroon:before,i.flag.cm:before{background-position:0 -1170px}i.flag.china:before,i.flag.cn:before{background-position:0 -1196px}i.flag.co:before,i.flag.colombia:before{background-position:0 -1222px}i.flag.costa.rica:before,i.flag.cr:before{background-position:0 -1248px}i.flag.cs:before,i.flag.serbia:before{background-position:0 -1274px}i.flag.cu:before,i.flag.cuba:before{background-position:0 -1300px}i.flag.cape.verde:before,i.flag.cv:before{background-position:0 -1326px}i.flag.christmas.island:before,i.flag.cx:before{background-position:0 -1352px}i.flag.cy:before,i.flag.cyprus:before{background-position:0 -1378px}i.flag.cz:before,i.flag.czech.republic:before{background-position:0 -1404px}i.flag.de:before,i.flag.germany:before{background-position:0 -1430px}i.flag.dj:before,i.flag.djibouti:before{background-position:0 -1456px}i.flag.denmark:before,i.flag.dk:before{background-position:0 -1482px}i.flag.dm:before,i.flag.dominica:before{background-position:0 -1508px}i.flag.do:before,i.flag.dominican.republic:before{background-position:0 -1534px}i.flag.algeria:before,i.flag.dz:before{background-position:0 -1560px}i.flag.ec:before,i.flag.ecuador:before{background-position:0 -1586px}i.flag.ee:before,i.flag.estonia:before{background-position:0 -1612px}i.flag.eg:before,i.flag.egypt:before{background-position:0 -1638px}i.flag.eh:before,i.flag.western.sahara:before{background-position:0 -1664px}i.flag.england:before,i.flag.gb.eng:before{background-position:0 -1690px}i.flag.er:before,i.flag.eritrea:before{background-position:0 -1716px}i.flag.es:before,i.flag.spain:before{background-position:0 -1742px}i.flag.et:before,i.flag.ethiopia:before{background-position:0 -1768px}i.flag.eu:before,i.flag.european.union:before{background-position:0 -1794px}i.flag.fi:before,i.flag.finland:before{background-position:0 -1846px}i.flag.fiji:before,i.flag.fj:before{background-position:0 -1872px}i.flag.falkland.islands:before,i.flag.fk:before{background-position:0 -1898px}i.flag.fm:before,i.flag.micronesia:before{background-position:0 -1924px}i.flag.faroe.islands:before,i.flag.fo:before{background-position:0 -1950px}i.flag.fr:before,i.flag.france:before{background-position:0 -1976px}i.flag.ga:before,i.flag.gabon:before{background-position:-36px 0}i.flag.gb:before,i.flag.uk:before,i.flag.united.kingdom:before{background-position:-36px -26px}i.flag.gd:before,i.flag.grenada:before{background-position:-36px -52px}i.flag.ge:before,i.flag.georgia:before{background-position:-36px -78px}i.flag.french.guiana:before,i.flag.gf:before{background-position:-36px -104px}i.flag.gh:before,i.flag.ghana:before{background-position:-36px -130px}i.flag.gi:before,i.flag.gibraltar:before{background-position:-36px -156px}i.flag.gl:before,i.flag.greenland:before{background-position:-36px -182px}i.flag.gambia:before,i.flag.gm:before{background-position:-36px -208px}i.flag.gn:before,i.flag.guinea:before{background-position:-36px -234px}i.flag.gp:before,i.flag.guadeloupe:before{background-position:-36px -260px}i.flag.equatorial.guinea:before,i.flag.gq:before{background-position:-36px -286px}i.flag.gr:before,i.flag.greece:before{background-position:-36px -312px}i.flag.gs:before,i.flag.sandwich.islands:before{background-position:-36px -338px}i.flag.gt:before,i.flag.guatemala:before{background-position:-36px -364px}i.flag.gu:before,i.flag.guam:before{background-position:-36px -390px}i.flag.guinea-bissau:before,i.flag.gw:before{background-position:-36px -416px}i.flag.guyana:before,i.flag.gy:before{background-position:-36px -442px}i.flag.hk:before,i.flag.hong.kong:before{background-position:-36px -468px}i.flag.heard.island:before,i.flag.hm:before{background-position:-36px -494px}i.flag.hn:before,i.flag.honduras:before{background-position:-36px -520px}i.flag.croatia:before,i.flag.hr:before{background-position:-36px -546px}i.flag.haiti:before,i.flag.ht:before{background-position:-36px -572px}i.flag.hu:before,i.flag.hungary:before{background-position:-36px -598px}i.flag.id:before,i.flag.indonesia:before{background-position:-36px -624px}i.flag.ie:before,i.flag.ireland:before{background-position:-36px -650px}i.flag.il:before,i.flag.israel:before{background-position:-36px -676px}i.flag.in:before,i.flag.india:before{background-position:-36px -702px}i.flag.indian.ocean.territory:before,i.flag.io:before{background-position:-36px -728px}i.flag.iq:before,i.flag.iraq:before{background-position:-36px -754px}i.flag.ir:before,i.flag.iran:before{background-position:-36px -780px}i.flag.iceland:before,i.flag.is:before{background-position:-36px -806px}i.flag.it:before,i.flag.italy:before{background-position:-36px -832px}i.flag.jamaica:before,i.flag.jm:before{background-position:-36px -858px}i.flag.jo:before,i.flag.jordan:before{background-position:-36px -884px}i.flag.japan:before,i.flag.jp:before{background-position:-36px -910px}i.flag.ke:before,i.flag.kenya:before{background-position:-36px -936px}i.flag.kg:before,i.flag.kyrgyzstan:before{background-position:-36px -962px}i.flag.cambodia:before,i.flag.kh:before{background-position:-36px -988px}i.flag.ki:before,i.flag.kiribati:before{background-position:-36px -1014px}i.flag.comoros:before,i.flag.km:before{background-position:-36px -1040px}i.flag.kn:before,i.flag.saint.kitts.and.nevis:before{background-position:-36px -1066px}i.flag.kp:before,i.flag.north.korea:before{background-position:-36px -1092px}i.flag.kr:before,i.flag.south.korea:before{background-position:-36px -1118px}i.flag.kuwait:before,i.flag.kw:before{background-position:-36px -1144px}i.flag.cayman.islands:before,i.flag.ky:before{background-position:-36px -1170px}i.flag.kazakhstan:before,i.flag.kz:before{background-position:-36px -1196px}i.flag.la:before,i.flag.laos:before{background-position:-36px -1222px}i.flag.lb:before,i.flag.lebanon:before{background-position:-36px -1248px}i.flag.lc:before,i.flag.saint.lucia:before{background-position:-36px -1274px}i.flag.li:before,i.flag.liechtenstein:before{background-position:-36px -1300px}i.flag.lk:before,i.flag.sri.lanka:before{background-position:-36px -1326px}i.flag.liberia:before,i.flag.lr:before{background-position:-36px -1352px}i.flag.lesotho:before,i.flag.ls:before{background-position:-36px -1378px}i.flag.lithuania:before,i.flag.lt:before{background-position:-36px -1404px}i.flag.lu:before,i.flag.luxembourg:before{background-position:-36px -1430px}i.flag.latvia:before,i.flag.lv:before{background-position:-36px -1456px}i.flag.libya:before,i.flag.ly:before{background-position:-36px -1482px}i.flag.ma:before,i.flag.morocco:before{background-position:-36px -1508px}i.flag.mc:before,i.flag.monaco:before{background-position:-36px -1534px}i.flag.md:before,i.flag.moldova:before{background-position:-36px -1560px}i.flag.me:before,i.flag.montenegro:before{background-position:-36px -1586px}i.flag.madagascar:before,i.flag.mg:before{background-position:-36px -1613px}i.flag.marshall.islands:before,i.flag.mh:before{background-position:-36px -1639px}i.flag.macedonia:before,i.flag.mk:before{background-position:-36px -1665px}i.flag.mali:before,i.flag.ml:before{background-position:-36px -1691px}i.flag.burma:before,i.flag.mm:before,i.flag.myanmar:before{background-position:-73px -1821px}i.flag.mn:before,i.flag.mongolia:before{background-position:-36px -1743px}i.flag.macau:before,i.flag.mo:before{background-position:-36px -1769px}i.flag.mp:before,i.flag.northern.mariana.islands:before{background-position:-36px -1795px}i.flag.martinique:before,i.flag.mq:before{background-position:-36px -1821px}i.flag.mauritania:before,i.flag.mr:before{background-position:-36px -1847px}i.flag.montserrat:before,i.flag.ms:before{background-position:-36px -1873px}i.flag.malta:before,i.flag.mt:before{background-position:-36px -1899px}i.flag.mauritius:before,i.flag.mu:before{background-position:-36px -1925px}i.flag.maldives:before,i.flag.mv:before{background-position:-36px -1951px}i.flag.malawi:before,i.flag.mw:before{background-position:-36px -1977px}i.flag.mexico:before,i.flag.mx:before{background-position:-72px 0}i.flag.malaysia:before,i.flag.my:before{background-position:-72px -26px}i.flag.mozambique:before,i.flag.mz:before{background-position:-72px -52px}i.flag.na:before,i.flag.namibia:before{background-position:-72px -78px}i.flag.nc:before,i.flag.new.caledonia:before{background-position:-72px -104px}i.flag.ne:before,i.flag.niger:before{background-position:-72px -130px}i.flag.nf:before,i.flag.norfolk.island:before{background-position:-72px -156px}i.flag.ng:before,i.flag.nigeria:before{background-position:-72px -182px}i.flag.ni:before,i.flag.nicaragua:before{background-position:-72px -208px}i.flag.netherlands:before,i.flag.nl:before{background-position:-72px -234px}i.flag.no:before,i.flag.norway:before{background-position:-72px -260px}i.flag.nepal:before,i.flag.np:before{background-position:-72px -286px}i.flag.nauru:before,i.flag.nr:before{background-position:-72px -312px}i.flag.niue:before,i.flag.nu:before{background-position:-72px -338px}i.flag.new.zealand:before,i.flag.nz:before{background-position:-72px -364px}i.flag.om:before,i.flag.oman:before{background-position:-72px -390px}i.flag.pa:before,i.flag.panama:before{background-position:-72px -416px}i.flag.pe:before,i.flag.peru:before{background-position:-72px -442px}i.flag.french.polynesia:before,i.flag.pf:before{background-position:-72px -468px}i.flag.new.guinea:before,i.flag.pg:before{background-position:-72px -494px}i.flag.ph:before,i.flag.philippines:before{background-position:-72px -520px}i.flag.pakistan:before,i.flag.pk:before{background-position:-72px -546px}i.flag.pl:before,i.flag.poland:before{background-position:-72px -572px}i.flag.pm:before,i.flag.saint.pierre:before{background-position:-72px -598px}i.flag.pitcairn.islands:before,i.flag.pn:before{background-position:-72px -624px}i.flag.pr:before,i.flag.puerto.rico:before{background-position:-72px -650px}i.flag.palestine:before,i.flag.ps:before{background-position:-72px -676px}i.flag.portugal:before,i.flag.pt:before{background-position:-72px -702px}i.flag.palau:before,i.flag.pw:before{background-position:-72px -728px}i.flag.paraguay:before,i.flag.py:before{background-position:-72px -754px}i.flag.qa:before,i.flag.qatar:before{background-position:-72px -780px}i.flag.re:before,i.flag.reunion:before{background-position:-72px -806px}i.flag.ro:before,i.flag.romania:before{background-position:-72px -832px}i.flag.rs:before,i.flag.serbia:before{background-position:-72px -858px}i.flag.ru:before,i.flag.russia:before{background-position:-72px -884px}i.flag.rw:before,i.flag.rwanda:before{background-position:-72px -910px}i.flag.sa:before,i.flag.saudi.arabia:before{background-position:-72px -936px}i.flag.sb:before,i.flag.solomon.islands:before{background-position:-72px -962px}i.flag.sc:before,i.flag.seychelles:before{background-position:-72px -988px}i.flag.gb.sct:before,i.flag.scotland:before{background-position:-72px -1014px}i.flag.sd:before,i.flag.sudan:before{background-position:-72px -1040px}i.flag.se:before,i.flag.sweden:before{background-position:-72px -1066px}i.flag.sg:before,i.flag.singapore:before{background-position:-72px -1092px}i.flag.saint.helena:before,i.flag.sh:before{background-position:-72px -1118px}i.flag.si:before,i.flag.slovenia:before{background-position:-72px -1144px}i.flag.jan.mayen:before,i.flag.sj:before,i.flag.svalbard:before{background-position:-72px -1170px}i.flag.sk:before,i.flag.slovakia:before{background-position:-72px -1196px}i.flag.sierra.leone:before,i.flag.sl:before{background-position:-72px -1222px}i.flag.san.marino:before,i.flag.sm:before{background-position:-72px -1248px}i.flag.senegal:before,i.flag.sn:before{background-position:-72px -1274px}i.flag.so:before,i.flag.somalia:before{background-position:-72px -1300px}i.flag.sr:before,i.flag.suriname:before{background-position:-72px -1326px}i.flag.sao.tome:before,i.flag.st:before{background-position:-72px -1352px}i.flag.el.salvador:before,i.flag.sv:before{background-position:-72px -1378px}i.flag.sy:before,i.flag.syria:before{background-position:-72px -1404px}i.flag.swaziland:before,i.flag.sz:before{background-position:-72px -1430px}i.flag.caicos.islands:before,i.flag.tc:before{background-position:-72px -1456px}i.flag.chad:before,i.flag.td:before{background-position:-72px -1482px}i.flag.french.territories:before,i.flag.tf:before{background-position:-72px -1508px}i.flag.tg:before,i.flag.togo:before{background-position:-72px -1534px}i.flag.th:before,i.flag.thailand:before{background-position:-72px -1560px}i.flag.tajikistan:before,i.flag.tj:before{background-position:-72px -1586px}i.flag.tk:before,i.flag.tokelau:before{background-position:-72px -1612px}i.flag.timorleste:before,i.flag.tl:before{background-position:-72px -1638px}i.flag.tm:before,i.flag.turkmenistan:before{background-position:-72px -1664px}i.flag.tn:before,i.flag.tunisia:before{background-position:-72px -1690px}i.flag.to:before,i.flag.tonga:before{background-position:-72px -1716px}i.flag.tr:before,i.flag.turkey:before{background-position:-72px -1742px}i.flag.trinidad:before,i.flag.tt:before{background-position:-72px -1768px}i.flag.tuvalu:before,i.flag.tv:before{background-position:-72px -1794px}i.flag.taiwan:before,i.flag.tw:before{background-position:-72px -1820px}i.flag.tanzania:before,i.flag.tz:before{background-position:-72px -1846px}i.flag.ua:before,i.flag.ukraine:before{background-position:-72px -1872px}i.flag.ug:before,i.flag.uganda:before{background-position:-72px -1898px}i.flag.um:before,i.flag.us.minor.islands:before{background-position:-72px -1924px}i.flag.america:before,i.flag.united.states:before,i.flag.us:before{background-position:-72px -1950px}i.flag.uruguay:before,i.flag.uy:before{background-position:-72px -1976px}i.flag.uz:before,i.flag.uzbekistan:before{background-position:-108px 0}i.flag.va:before,i.flag.vatican.city:before{background-position:-108px -26px}i.flag.saint.vincent:before,i.flag.vc:before{background-position:-108px -52px}i.flag.ve:before,i.flag.venezuela:before{background-position:-108px -78px}i.flag.british.virgin.islands:before,i.flag.vg:before{background-position:-108px -104px}i.flag.us.virgin.islands:before,i.flag.vi:before{background-position:-108px -130px}i.flag.vietnam:before,i.flag.vn:before{background-position:-108px -156px}i.flag.vanuatu:before,i.flag.vu:before{background-position:-108px -182px}i.flag.gb.wls:before,i.flag.wales:before{background-position:-108px -208px}i.flag.wallis.and.futuna:before,i.flag.wf:before{background-position:-108px -234px}i.flag.samoa:before,i.flag.ws:before{background-position:-108px -260px}i.flag.ye:before,i.flag.yemen:before{background-position:-108px -286px}i.flag.mayotte:before,i.flag.yt:before{background-position:-108px -312px}i.flag.south.africa:before,i.flag.za:before{background-position:-108px -338px}i.flag.zambia:before,i.flag.zm:before{background-position:-108px -364px}i.flag.zimbabwe:before,i.flag.zw:before{background-position:-108px -390px}/*!\n * # Semantic UI 2.4.0 - Header\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.header{border:none;margin:calc(2rem - .14285714em) 0 1rem;padding:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;line-height:1.28571429em;text-transform:none;color:rgba(0,0,0,.87)}.ui.header:first-child{margin-top:-.14285714em}.ui.header:last-child{margin-bottom:0}.ui.header .sub.header{display:block;font-weight:400;padding:0;margin:0;font-size:1rem;line-height:1.2em;color:rgba(0,0,0,.6)}.ui.header>.icon{display:table-cell;opacity:1;font-size:1.5em;padding-top:0;vertical-align:middle}.ui.header .icon:only-child{display:inline-block;padding:0;margin-right:.75rem}.ui.header>.image:not(.icon),.ui.header>img{display:inline-block;margin-top:.14285714em;width:2.5em;height:auto;vertical-align:middle}.ui.header>.image:not(.icon):only-child,.ui.header>img:only-child{margin-right:.75rem}.ui.header .content{display:inline-block;vertical-align:top}.ui.header>.image+.content,.ui.header>img+.content{padding-left:.75rem;vertical-align:middle}.ui.header>.icon+.content{padding-left:.75rem;display:table-cell;vertical-align:middle}.ui.header .ui.label{font-size:'';margin-left:.5rem;vertical-align:middle}.ui.header+p{margin-top:0}h1.ui.header{font-size:2rem}h2.ui.header{font-size:1.71428571rem}h3.ui.header{font-size:1.28571429rem}h4.ui.header{font-size:1.07142857rem}h5.ui.header{font-size:1rem}h1.ui.header .sub.header{font-size:1.14285714rem}h2.ui.header .sub.header{font-size:1.14285714rem}h3.ui.header .sub.header{font-size:1rem}h4.ui.header .sub.header{font-size:1rem}h5.ui.header .sub.header{font-size:.92857143rem}.ui.huge.header{min-height:1em;font-size:2em}.ui.large.header{font-size:1.71428571em}.ui.medium.header{font-size:1.28571429em}.ui.small.header{font-size:1.07142857em}.ui.tiny.header{font-size:1em}.ui.huge.header .sub.header{font-size:1.14285714rem}.ui.large.header .sub.header{font-size:1.14285714rem}.ui.header .sub.header{font-size:1rem}.ui.small.header .sub.header{font-size:1rem}.ui.tiny.header .sub.header{font-size:.92857143rem}.ui.sub.header{padding:0;margin-bottom:.14285714rem;font-weight:700;font-size:.85714286em;text-transform:uppercase;color:''}.ui.small.sub.header{font-size:.78571429em}.ui.sub.header{font-size:.85714286em}.ui.large.sub.header{font-size:.92857143em}.ui.huge.sub.header{font-size:1em}.ui.icon.header{display:inline-block;text-align:center;margin:2rem 0 1rem}.ui.icon.header:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.icon.header:first-child{margin-top:0}.ui.icon.header .icon{float:none;display:block;width:auto;height:auto;line-height:1;padding:0;font-size:3em;margin:0 auto .5rem;opacity:1}.ui.icon.header .content{display:block;padding:0}.ui.icon.header .circular.icon{font-size:2em}.ui.icon.header .square.icon{font-size:2em}.ui.block.icon.header .icon{margin-bottom:0}.ui.icon.header.aligned{margin-left:auto;margin-right:auto;display:block}.ui.disabled.header{opacity:.45}.ui.inverted.header{color:#fff}.ui.inverted.header .sub.header{color:rgba(255,255,255,.8)}.ui.inverted.attached.header{background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none;border-color:transparent}.ui.inverted.block.header{background:#545454 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#545454 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#545454 linear-gradient(transparent,rgba(0,0,0,.05));-webkit-box-shadow:none;box-shadow:none}.ui.inverted.block.header{border-bottom:none}.ui.red.header{color:#db2828!important}a.ui.red.header:hover{color:#d01919!important}.ui.red.dividing.header{border-bottom:2px solid #db2828}.ui.inverted.red.header{color:#ff695e!important}a.ui.inverted.red.header:hover{color:#ff5144!important}.ui.orange.header{color:#f2711c!important}a.ui.orange.header:hover{color:#f26202!important}.ui.orange.dividing.header{border-bottom:2px solid #f2711c}.ui.inverted.orange.header{color:#ff851b!important}a.ui.inverted.orange.header:hover{color:#ff7701!important}.ui.olive.header{color:#b5cc18!important}a.ui.olive.header:hover{color:#a7bd0d!important}.ui.olive.dividing.header{border-bottom:2px solid #b5cc18}.ui.inverted.olive.header{color:#d9e778!important}a.ui.inverted.olive.header:hover{color:#d8ea5c!important}.ui.yellow.header{color:#fbbd08!important}a.ui.yellow.header:hover{color:#eaae00!important}.ui.yellow.dividing.header{border-bottom:2px solid #fbbd08}.ui.inverted.yellow.header{color:#ffe21f!important}a.ui.inverted.yellow.header:hover{color:#ffdf05!important}.ui.green.header{color:#21ba45!important}a.ui.green.header:hover{color:#16ab39!important}.ui.green.dividing.header{border-bottom:2px solid #21ba45}.ui.inverted.green.header{color:#2ecc40!important}a.ui.inverted.green.header:hover{color:#22be34!important}.ui.teal.header{color:#00b5ad!important}a.ui.teal.header:hover{color:#009c95!important}.ui.teal.dividing.header{border-bottom:2px solid #00b5ad}.ui.inverted.teal.header{color:#6dffff!important}a.ui.inverted.teal.header:hover{color:#54ffff!important}.ui.blue.header{color:#2185d0!important}a.ui.blue.header:hover{color:#1678c2!important}.ui.blue.dividing.header{border-bottom:2px solid #2185d0}.ui.inverted.blue.header{color:#54c8ff!important}a.ui.inverted.blue.header:hover{color:#3ac0ff!important}.ui.violet.header{color:#6435c9!important}a.ui.violet.header:hover{color:#5829bb!important}.ui.violet.dividing.header{border-bottom:2px solid #6435c9}.ui.inverted.violet.header{color:#a291fb!important}a.ui.inverted.violet.header:hover{color:#8a73ff!important}.ui.purple.header{color:#a333c8!important}a.ui.purple.header:hover{color:#9627ba!important}.ui.purple.dividing.header{border-bottom:2px solid #a333c8}.ui.inverted.purple.header{color:#dc73ff!important}a.ui.inverted.purple.header:hover{color:#d65aff!important}.ui.pink.header{color:#e03997!important}a.ui.pink.header:hover{color:#e61a8d!important}.ui.pink.dividing.header{border-bottom:2px solid #e03997}.ui.inverted.pink.header{color:#ff8edf!important}a.ui.inverted.pink.header:hover{color:#ff74d8!important}.ui.brown.header{color:#a5673f!important}a.ui.brown.header:hover{color:#975b33!important}.ui.brown.dividing.header{border-bottom:2px solid #a5673f}.ui.inverted.brown.header{color:#d67c1c!important}a.ui.inverted.brown.header:hover{color:#c86f11!important}.ui.grey.header{color:#767676!important}a.ui.grey.header:hover{color:#838383!important}.ui.grey.dividing.header{border-bottom:2px solid #767676}.ui.inverted.grey.header{color:#dcddde!important}a.ui.inverted.grey.header:hover{color:#cfd0d2!important}.ui.left.aligned.header{text-align:left}.ui.right.aligned.header{text-align:right}.ui.center.aligned.header,.ui.centered.header{text-align:center}.ui.justified.header{text-align:justify}.ui.justified.header:after{display:inline-block;content:'';width:100%}.ui.floated.header,.ui[class*=\"left floated\"].header{float:left;margin-top:0;margin-right:.5em}.ui[class*=\"right floated\"].header{float:right;margin-top:0;margin-left:.5em}.ui.fitted.header{padding:0}.ui.dividing.header{padding-bottom:.21428571rem;border-bottom:1px solid rgba(34,36,38,.15)}.ui.dividing.header .sub.header{padding-bottom:.21428571rem}.ui.dividing.header .icon{margin-bottom:0}.ui.inverted.dividing.header{border-bottom-color:rgba(255,255,255,.1)}.ui.block.header{background:#f3f4f5;padding:.78571429rem 1rem;-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5;border-radius:.28571429rem}.ui.tiny.block.header{font-size:.85714286rem}.ui.small.block.header{font-size:.92857143rem}.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1rem}.ui.large.block.header{font-size:1.14285714rem}.ui.huge.block.header{font-size:1.42857143rem}.ui.attached.header{background:#fff;padding:.78571429rem 1rem;margin-left:-1px;margin-right:-1px;-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached.block.header{background:#f3f4f5}.ui.attached:not(.top):not(.bottom).header{margin-top:0;margin-bottom:0;border-top:none;border-radius:0}.ui.top.attached.header{margin-bottom:0;border-radius:.28571429rem .28571429rem 0 0}.ui.bottom.attached.header{margin-top:0;border-top:none;border-radius:0 0 .28571429rem .28571429rem}.ui.tiny.attached.header{font-size:.85714286em}.ui.small.attached.header{font-size:.92857143em}.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1em}.ui.large.attached.header{font-size:1.14285714em}.ui.huge.attached.header{font-size:1.42857143em}.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6){font-size:1.28571429em}/*!\n * # Semantic UI 2.4.0 - Icon\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */@font-face{font-family:Icons;src:url(themes/default/assets/fonts/icons.eot);src:url(themes/default/assets/fonts/icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/icons.woff2) format('woff2'),url(themes/default/assets/fonts/icons.woff) format('woff'),url(themes/default/assets/fonts/icons.ttf) format('truetype'),url(themes/default/assets/fonts/icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon{display:inline-block;opacity:1;margin:0 .25rem 0 0;width:1.18em;height:1em;font-family:Icons;font-style:normal;font-weight:400;text-decoration:inherit;text-align:center;speak:none;font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-backface-visibility:hidden;backface-visibility:hidden}i.icon:before{background:0 0!important}i.icon.loading{height:1em;line-height:1;-webkit-animation:icon-loading 2s linear infinite;animation:icon-loading 2s linear infinite}@-webkit-keyframes icon-loading{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes icon-loading{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}i.icon.hover{opacity:1!important}i.icon.active{opacity:1!important}i.emphasized.icon{opacity:1!important}i.disabled.icon{opacity:.45!important}i.fitted.icon{width:auto;margin:0!important}i.link.icon,i.link.icons{cursor:pointer;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}i.link.icon:hover,i.link.icons:hover{opacity:1!important}i.circular.icon{border-radius:500em!important;line-height:1!important;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;width:2em!important;height:2em!important}i.circular.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.flipped.icon,i.horizontally.flipped.icon{-webkit-transform:scale(-1,1);transform:scale(-1,1)}i.vertically.flipped.icon{-webkit-transform:scale(1,-1);transform:scale(1,-1)}i.clockwise.rotated.icon,i.right.rotated.icon,i.rotated.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}i.counterclockwise.rotated.icon,i.left.rotated.icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}i.bordered.icon{line-height:1;vertical-align:baseline;width:2em;height:2em;padding:.5em 0!important;-webkit-box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset;box-shadow:0 0 0 .1em rgba(0,0,0,.1) inset}i.bordered.inverted.icon{border:none;-webkit-box-shadow:none;box-shadow:none}i.inverted.bordered.icon,i.inverted.circular.icon{background-color:#1b1c1d!important;color:#fff!important}i.inverted.icon{color:#fff}i.red.icon{color:#db2828!important}i.inverted.red.icon{color:#ff695e!important}i.inverted.bordered.red.icon,i.inverted.circular.red.icon{background-color:#db2828!important;color:#fff!important}i.orange.icon{color:#f2711c!important}i.inverted.orange.icon{color:#ff851b!important}i.inverted.bordered.orange.icon,i.inverted.circular.orange.icon{background-color:#f2711c!important;color:#fff!important}i.yellow.icon{color:#fbbd08!important}i.inverted.yellow.icon{color:#ffe21f!important}i.inverted.bordered.yellow.icon,i.inverted.circular.yellow.icon{background-color:#fbbd08!important;color:#fff!important}i.olive.icon{color:#b5cc18!important}i.inverted.olive.icon{color:#d9e778!important}i.inverted.bordered.olive.icon,i.inverted.circular.olive.icon{background-color:#b5cc18!important;color:#fff!important}i.green.icon{color:#21ba45!important}i.inverted.green.icon{color:#2ecc40!important}i.inverted.bordered.green.icon,i.inverted.circular.green.icon{background-color:#21ba45!important;color:#fff!important}i.teal.icon{color:#00b5ad!important}i.inverted.teal.icon{color:#6dffff!important}i.inverted.bordered.teal.icon,i.inverted.circular.teal.icon{background-color:#00b5ad!important;color:#fff!important}i.blue.icon{color:#2185d0!important}i.inverted.blue.icon{color:#54c8ff!important}i.inverted.bordered.blue.icon,i.inverted.circular.blue.icon{background-color:#2185d0!important;color:#fff!important}i.violet.icon{color:#6435c9!important}i.inverted.violet.icon{color:#a291fb!important}i.inverted.bordered.violet.icon,i.inverted.circular.violet.icon{background-color:#6435c9!important;color:#fff!important}i.purple.icon{color:#a333c8!important}i.inverted.purple.icon{color:#dc73ff!important}i.inverted.bordered.purple.icon,i.inverted.circular.purple.icon{background-color:#a333c8!important;color:#fff!important}i.pink.icon{color:#e03997!important}i.inverted.pink.icon{color:#ff8edf!important}i.inverted.bordered.pink.icon,i.inverted.circular.pink.icon{background-color:#e03997!important;color:#fff!important}i.brown.icon{color:#a5673f!important}i.inverted.brown.icon{color:#d67c1c!important}i.inverted.bordered.brown.icon,i.inverted.circular.brown.icon{background-color:#a5673f!important;color:#fff!important}i.grey.icon{color:#767676!important}i.inverted.grey.icon{color:#dcddde!important}i.inverted.bordered.grey.icon,i.inverted.circular.grey.icon{background-color:#767676!important;color:#fff!important}i.black.icon{color:#1b1c1d!important}i.inverted.black.icon{color:#545454!important}i.inverted.bordered.black.icon,i.inverted.circular.black.icon{background-color:#1b1c1d!important;color:#fff!important}i.mini.icon,i.mini.icons{line-height:1;font-size:.4em}i.tiny.icon,i.tiny.icons{line-height:1;font-size:.5em}i.small.icon,i.small.icons{line-height:1;font-size:.75em}i.icon,i.icons{font-size:1em}i.large.icon,i.large.icons{line-height:1;vertical-align:middle;font-size:1.5em}i.big.icon,i.big.icons{line-height:1;vertical-align:middle;font-size:2em}i.huge.icon,i.huge.icons{line-height:1;vertical-align:middle;font-size:4em}i.massive.icon,i.massive.icons{line-height:1;vertical-align:middle;font-size:8em}i.icons{display:inline-block;position:relative;line-height:1}i.icons .icon{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);margin:0;margin:0}i.icons .icon:first-child{position:static;width:auto;height:auto;vertical-align:top;-webkit-transform:none;transform:none;margin-right:.25rem}i.icons .corner.icon{top:auto;left:auto;right:0;bottom:0;-webkit-transform:none;transform:none;font-size:.45em;text-shadow:-1px -1px 0 #fff,1px -1px 0 #fff,-1px 1px 0 #fff,1px 1px 0 #fff}i.icons .top.right.corner.icon{top:0;left:auto;right:0;bottom:auto}i.icons .top.left.corner.icon{top:0;left:0;right:auto;bottom:auto}i.icons .bottom.left.corner.icon{top:auto;left:0;right:auto;bottom:0}i.icons .bottom.right.corner.icon{top:auto;left:auto;right:0;bottom:0}i.icons .inverted.corner.icon{text-shadow:-1px -1px 0 #1b1c1d,1px -1px 0 #1b1c1d,-1px 1px 0 #1b1c1d,1px 1px 0 #1b1c1d}i.icon.linkedin.in:before{content:\"\\f0e1\"}i.icon.zoom.in:before{content:\"\\f00e\"}i.icon.zoom.out:before{content:\"\\f010\"}i.icon.sign.in:before{content:\"\\f2f6\"}i.icon.in.cart:before{content:\"\\f218\"}i.icon.log.out:before{content:\"\\f2f5\"}i.icon.sign.out:before{content:\"\\f2f5\"}i.icon.\\35 00px:before{content:\"\\f26e\"}i.icon.accessible.icon:before{content:\"\\f368\"}i.icon.accusoft:before{content:\"\\f369\"}i.icon.address.book:before{content:\"\\f2b9\"}i.icon.address.card:before{content:\"\\f2bb\"}i.icon.adjust:before{content:\"\\f042\"}i.icon.adn:before{content:\"\\f170\"}i.icon.adversal:before{content:\"\\f36a\"}i.icon.affiliatetheme:before{content:\"\\f36b\"}i.icon.algolia:before{content:\"\\f36c\"}i.icon.align.center:before{content:\"\\f037\"}i.icon.align.justify:before{content:\"\\f039\"}i.icon.align.left:before{content:\"\\f036\"}i.icon.align.right:before{content:\"\\f038\"}i.icon.amazon:before{content:\"\\f270\"}i.icon.amazon.pay:before{content:\"\\f42c\"}i.icon.ambulance:before{content:\"\\f0f9\"}i.icon.american.sign.language.interpreting:before{content:\"\\f2a3\"}i.icon.amilia:before{content:\"\\f36d\"}i.icon.anchor:before{content:\"\\f13d\"}i.icon.android:before{content:\"\\f17b\"}i.icon.angellist:before{content:\"\\f209\"}i.icon.angle.double.down:before{content:\"\\f103\"}i.icon.angle.double.left:before{content:\"\\f100\"}i.icon.angle.double.right:before{content:\"\\f101\"}i.icon.angle.double.up:before{content:\"\\f102\"}i.icon.angle.down:before{content:\"\\f107\"}i.icon.angle.left:before{content:\"\\f104\"}i.icon.angle.right:before{content:\"\\f105\"}i.icon.angle.up:before{content:\"\\f106\"}i.icon.angrycreative:before{content:\"\\f36e\"}i.icon.angular:before{content:\"\\f420\"}i.icon.app.store:before{content:\"\\f36f\"}i.icon.app.store.ios:before{content:\"\\f370\"}i.icon.apper:before{content:\"\\f371\"}i.icon.apple:before{content:\"\\f179\"}i.icon.apple.pay:before{content:\"\\f415\"}i.icon.archive:before{content:\"\\f187\"}i.icon.arrow.alternate.circle.down:before{content:\"\\f358\"}i.icon.arrow.alternate.circle.left:before{content:\"\\f359\"}i.icon.arrow.alternate.circle.right:before{content:\"\\f35a\"}i.icon.arrow.alternate.circle.up:before{content:\"\\f35b\"}i.icon.arrow.circle.down:before{content:\"\\f0ab\"}i.icon.arrow.circle.left:before{content:\"\\f0a8\"}i.icon.arrow.circle.right:before{content:\"\\f0a9\"}i.icon.arrow.circle.up:before{content:\"\\f0aa\"}i.icon.arrow.down:before{content:\"\\f063\"}i.icon.arrow.left:before{content:\"\\f060\"}i.icon.arrow.right:before{content:\"\\f061\"}i.icon.arrow.up:before{content:\"\\f062\"}i.icon.arrows.alternate:before{content:\"\\f0b2\"}i.icon.arrows.alternate.horizontal:before{content:\"\\f337\"}i.icon.arrows.alternate.vertical:before{content:\"\\f338\"}i.icon.assistive.listening.systems:before{content:\"\\f2a2\"}i.icon.asterisk:before{content:\"\\f069\"}i.icon.asymmetrik:before{content:\"\\f372\"}i.icon.at:before{content:\"\\f1fa\"}i.icon.audible:before{content:\"\\f373\"}i.icon.audio.description:before{content:\"\\f29e\"}i.icon.autoprefixer:before{content:\"\\f41c\"}i.icon.avianex:before{content:\"\\f374\"}i.icon.aviato:before{content:\"\\f421\"}i.icon.aws:before{content:\"\\f375\"}i.icon.backward:before{content:\"\\f04a\"}i.icon.balance.scale:before{content:\"\\f24e\"}i.icon.ban:before{content:\"\\f05e\"}i.icon.band.aid:before{content:\"\\f462\"}i.icon.bandcamp:before{content:\"\\f2d5\"}i.icon.barcode:before{content:\"\\f02a\"}i.icon.bars:before{content:\"\\f0c9\"}i.icon.baseball.ball:before{content:\"\\f433\"}i.icon.basketball.ball:before{content:\"\\f434\"}i.icon.bath:before{content:\"\\f2cd\"}i.icon.battery.empty:before{content:\"\\f244\"}i.icon.battery.full:before{content:\"\\f240\"}i.icon.battery.half:before{content:\"\\f242\"}i.icon.battery.quarter:before{content:\"\\f243\"}i.icon.battery.three.quarters:before{content:\"\\f241\"}i.icon.bed:before{content:\"\\f236\"}i.icon.beer:before{content:\"\\f0fc\"}i.icon.behance:before{content:\"\\f1b4\"}i.icon.behance.square:before{content:\"\\f1b5\"}i.icon.bell:before{content:\"\\f0f3\"}i.icon.bell.slash:before{content:\"\\f1f6\"}i.icon.bicycle:before{content:\"\\f206\"}i.icon.bimobject:before{content:\"\\f378\"}i.icon.binoculars:before{content:\"\\f1e5\"}i.icon.birthday.cake:before{content:\"\\f1fd\"}i.icon.bitbucket:before{content:\"\\f171\"}i.icon.bitcoin:before{content:\"\\f379\"}i.icon.bity:before{content:\"\\f37a\"}i.icon.black.tie:before{content:\"\\f27e\"}i.icon.blackberry:before{content:\"\\f37b\"}i.icon.blind:before{content:\"\\f29d\"}i.icon.blogger:before{content:\"\\f37c\"}i.icon.blogger.b:before{content:\"\\f37d\"}i.icon.bluetooth:before{content:\"\\f293\"}i.icon.bluetooth.b:before{content:\"\\f294\"}i.icon.bold:before{content:\"\\f032\"}i.icon.bolt:before{content:\"\\f0e7\"}i.icon.bomb:before{content:\"\\f1e2\"}i.icon.book:before{content:\"\\f02d\"}i.icon.bookmark:before{content:\"\\f02e\"}i.icon.bowling.ball:before{content:\"\\f436\"}i.icon.box:before{content:\"\\f466\"}i.icon.boxes:before{content:\"\\f468\"}i.icon.braille:before{content:\"\\f2a1\"}i.icon.briefcase:before{content:\"\\f0b1\"}i.icon.btc:before{content:\"\\f15a\"}i.icon.bug:before{content:\"\\f188\"}i.icon.building:before{content:\"\\f1ad\"}i.icon.bullhorn:before{content:\"\\f0a1\"}i.icon.bullseye:before{content:\"\\f140\"}i.icon.buromobelexperte:before{content:\"\\f37f\"}i.icon.bus:before{content:\"\\f207\"}i.icon.buysellads:before{content:\"\\f20d\"}i.icon.calculator:before{content:\"\\f1ec\"}i.icon.calendar:before{content:\"\\f133\"}i.icon.calendar.alternate:before{content:\"\\f073\"}i.icon.calendar.check:before{content:\"\\f274\"}i.icon.calendar.minus:before{content:\"\\f272\"}i.icon.calendar.plus:before{content:\"\\f271\"}i.icon.calendar.times:before{content:\"\\f273\"}i.icon.camera:before{content:\"\\f030\"}i.icon.camera.retro:before{content:\"\\f083\"}i.icon.car:before{content:\"\\f1b9\"}i.icon.caret.down:before{content:\"\\f0d7\"}i.icon.caret.left:before{content:\"\\f0d9\"}i.icon.caret.right:before{content:\"\\f0da\"}i.icon.caret.square.down:before{content:\"\\f150\"}i.icon.caret.square.left:before{content:\"\\f191\"}i.icon.caret.square.right:before{content:\"\\f152\"}i.icon.caret.square.up:before{content:\"\\f151\"}i.icon.caret.up:before{content:\"\\f0d8\"}i.icon.cart.arrow.down:before{content:\"\\f218\"}i.icon.cart.plus:before{content:\"\\f217\"}i.icon.cc.amazon.pay:before{content:\"\\f42d\"}i.icon.cc.amex:before{content:\"\\f1f3\"}i.icon.cc.apple.pay:before{content:\"\\f416\"}i.icon.cc.diners.club:before{content:\"\\f24c\"}i.icon.cc.discover:before{content:\"\\f1f2\"}i.icon.cc.jcb:before{content:\"\\f24b\"}i.icon.cc.mastercard:before{content:\"\\f1f1\"}i.icon.cc.paypal:before{content:\"\\f1f4\"}i.icon.cc.stripe:before{content:\"\\f1f5\"}i.icon.cc.visa:before{content:\"\\f1f0\"}i.icon.centercode:before{content:\"\\f380\"}i.icon.certificate:before{content:\"\\f0a3\"}i.icon.chart.area:before{content:\"\\f1fe\"}i.icon.chart.bar:before{content:\"\\f080\"}i.icon.chart.line:before{content:\"\\f201\"}i.icon.chart.pie:before{content:\"\\f200\"}i.icon.check:before{content:\"\\f00c\"}i.icon.check.circle:before{content:\"\\f058\"}i.icon.check.square:before{content:\"\\f14a\"}i.icon.chess:before{content:\"\\f439\"}i.icon.chess.bishop:before{content:\"\\f43a\"}i.icon.chess.board:before{content:\"\\f43c\"}i.icon.chess.king:before{content:\"\\f43f\"}i.icon.chess.knight:before{content:\"\\f441\"}i.icon.chess.pawn:before{content:\"\\f443\"}i.icon.chess.queen:before{content:\"\\f445\"}i.icon.chess.rook:before{content:\"\\f447\"}i.icon.chevron.circle.down:before{content:\"\\f13a\"}i.icon.chevron.circle.left:before{content:\"\\f137\"}i.icon.chevron.circle.right:before{content:\"\\f138\"}i.icon.chevron.circle.up:before{content:\"\\f139\"}i.icon.chevron.down:before{content:\"\\f078\"}i.icon.chevron.left:before{content:\"\\f053\"}i.icon.chevron.right:before{content:\"\\f054\"}i.icon.chevron.up:before{content:\"\\f077\"}i.icon.child:before{content:\"\\f1ae\"}i.icon.chrome:before{content:\"\\f268\"}i.icon.circle:before{content:\"\\f111\"}i.icon.circle.notch:before{content:\"\\f1ce\"}i.icon.clipboard:before{content:\"\\f328\"}i.icon.clipboard.check:before{content:\"\\f46c\"}i.icon.clipboard.list:before{content:\"\\f46d\"}i.icon.clock:before{content:\"\\f017\"}i.icon.clone:before{content:\"\\f24d\"}i.icon.closed.captioning:before{content:\"\\f20a\"}i.icon.cloud:before{content:\"\\f0c2\"}i.icon.cloudscale:before{content:\"\\f383\"}i.icon.cloudsmith:before{content:\"\\f384\"}i.icon.cloudversify:before{content:\"\\f385\"}i.icon.code:before{content:\"\\f121\"}i.icon.code.branch:before{content:\"\\f126\"}i.icon.codepen:before{content:\"\\f1cb\"}i.icon.codiepie:before{content:\"\\f284\"}i.icon.coffee:before{content:\"\\f0f4\"}i.icon.cog:before{content:\"\\f013\"}i.icon.cogs:before{content:\"\\f085\"}i.icon.columns:before{content:\"\\f0db\"}i.icon.comment:before{content:\"\\f075\"}i.icon.comment.alternate:before{content:\"\\f27a\"}i.icon.comments:before{content:\"\\f086\"}i.icon.compass:before{content:\"\\f14e\"}i.icon.compress:before{content:\"\\f066\"}i.icon.connectdevelop:before{content:\"\\f20e\"}i.icon.contao:before{content:\"\\f26d\"}i.icon.copy:before{content:\"\\f0c5\"}i.icon.copyright:before{content:\"\\f1f9\"}i.icon.cpanel:before{content:\"\\f388\"}i.icon.creative.commons:before{content:\"\\f25e\"}i.icon.credit.card:before{content:\"\\f09d\"}i.icon.crop:before{content:\"\\f125\"}i.icon.crosshairs:before{content:\"\\f05b\"}i.icon.css3:before{content:\"\\f13c\"}i.icon.css3.alternate:before{content:\"\\f38b\"}i.icon.cube:before{content:\"\\f1b2\"}i.icon.cubes:before{content:\"\\f1b3\"}i.icon.cut:before{content:\"\\f0c4\"}i.icon.cuttlefish:before{content:\"\\f38c\"}i.icon.d.and.d:before{content:\"\\f38d\"}i.icon.dashcube:before{content:\"\\f210\"}i.icon.database:before{content:\"\\f1c0\"}i.icon.deaf:before{content:\"\\f2a4\"}i.icon.delicious:before{content:\"\\f1a5\"}i.icon.deploydog:before{content:\"\\f38e\"}i.icon.deskpro:before{content:\"\\f38f\"}i.icon.desktop:before{content:\"\\f108\"}i.icon.deviantart:before{content:\"\\f1bd\"}i.icon.digg:before{content:\"\\f1a6\"}i.icon.digital.ocean:before{content:\"\\f391\"}i.icon.discord:before{content:\"\\f392\"}i.icon.discourse:before{content:\"\\f393\"}i.icon.dna:before{content:\"\\f471\"}i.icon.dochub:before{content:\"\\f394\"}i.icon.docker:before{content:\"\\f395\"}i.icon.dollar.sign:before{content:\"\\f155\"}i.icon.dolly:before{content:\"\\f472\"}i.icon.dolly.flatbed:before{content:\"\\f474\"}i.icon.dot.circle:before{content:\"\\f192\"}i.icon.download:before{content:\"\\f019\"}i.icon.draft2digital:before{content:\"\\f396\"}i.icon.dribbble:before{content:\"\\f17d\"}i.icon.dribbble.square:before{content:\"\\f397\"}i.icon.dropbox:before{content:\"\\f16b\"}i.icon.drupal:before{content:\"\\f1a9\"}i.icon.dyalog:before{content:\"\\f399\"}i.icon.earlybirds:before{content:\"\\f39a\"}i.icon.edge:before{content:\"\\f282\"}i.icon.edit:before{content:\"\\f044\"}i.icon.eject:before{content:\"\\f052\"}i.icon.elementor:before{content:\"\\f430\"}i.icon.ellipsis.horizontal:before{content:\"\\f141\"}i.icon.ellipsis.vertical:before{content:\"\\f142\"}i.icon.ember:before{content:\"\\f423\"}i.icon.empire:before{content:\"\\f1d1\"}i.icon.envelope:before{content:\"\\f0e0\"}i.icon.envelope.open:before{content:\"\\f2b6\"}i.icon.envelope.square:before{content:\"\\f199\"}i.icon.envira:before{content:\"\\f299\"}i.icon.eraser:before{content:\"\\f12d\"}i.icon.erlang:before{content:\"\\f39d\"}i.icon.ethereum:before{content:\"\\f42e\"}i.icon.etsy:before{content:\"\\f2d7\"}i.icon.euro.sign:before{content:\"\\f153\"}i.icon.exchange.alternate:before{content:\"\\f362\"}i.icon.exclamation:before{content:\"\\f12a\"}i.icon.exclamation.circle:before{content:\"\\f06a\"}i.icon.exclamation.triangle:before{content:\"\\f071\"}i.icon.expand:before{content:\"\\f065\"}i.icon.expand.arrows.alternate:before{content:\"\\f31e\"}i.icon.expeditedssl:before{content:\"\\f23e\"}i.icon.external.alternate:before{content:\"\\f35d\"}i.icon.external.square.alternate:before{content:\"\\f360\"}i.icon.eye:before{content:\"\\f06e\"}i.icon.eye.dropper:before{content:\"\\f1fb\"}i.icon.eye.slash:before{content:\"\\f070\"}i.icon.facebook:before{content:\"\\f09a\"}i.icon.facebook.f:before{content:\"\\f39e\"}i.icon.facebook.messenger:before{content:\"\\f39f\"}i.icon.facebook.square:before{content:\"\\f082\"}i.icon.fast.backward:before{content:\"\\f049\"}i.icon.fast.forward:before{content:\"\\f050\"}i.icon.fax:before{content:\"\\f1ac\"}i.icon.female:before{content:\"\\f182\"}i.icon.fighter.jet:before{content:\"\\f0fb\"}i.icon.file:before{content:\"\\f15b\"}i.icon.file.alternate:before{content:\"\\f15c\"}i.icon.file.archive:before{content:\"\\f1c6\"}i.icon.file.audio:before{content:\"\\f1c7\"}i.icon.file.code:before{content:\"\\f1c9\"}i.icon.file.excel:before{content:\"\\f1c3\"}i.icon.file.image:before{content:\"\\f1c5\"}i.icon.file.pdf:before{content:\"\\f1c1\"}i.icon.file.powerpoint:before{content:\"\\f1c4\"}i.icon.file.video:before{content:\"\\f1c8\"}i.icon.file.word:before{content:\"\\f1c2\"}i.icon.film:before{content:\"\\f008\"}i.icon.filter:before{content:\"\\f0b0\"}i.icon.fire:before{content:\"\\f06d\"}i.icon.fire.extinguisher:before{content:\"\\f134\"}i.icon.firefox:before{content:\"\\f269\"}i.icon.first.aid:before{content:\"\\f479\"}i.icon.first.order:before{content:\"\\f2b0\"}i.icon.firstdraft:before{content:\"\\f3a1\"}i.icon.flag:before{content:\"\\f024\"}i.icon.flag.checkered:before{content:\"\\f11e\"}i.icon.flask:before{content:\"\\f0c3\"}i.icon.flickr:before{content:\"\\f16e\"}i.icon.flipboard:before{content:\"\\f44d\"}i.icon.fly:before{content:\"\\f417\"}i.icon.folder:before{content:\"\\f07b\"}i.icon.folder.open:before{content:\"\\f07c\"}i.icon.font:before{content:\"\\f031\"}i.icon.font.awesome:before{content:\"\\f2b4\"}i.icon.font.awesome.alternate:before{content:\"\\f35c\"}i.icon.font.awesome.flag:before{content:\"\\f425\"}i.icon.fonticons:before{content:\"\\f280\"}i.icon.fonticons.fi:before{content:\"\\f3a2\"}i.icon.football.ball:before{content:\"\\f44e\"}i.icon.fort.awesome:before{content:\"\\f286\"}i.icon.fort.awesome.alternate:before{content:\"\\f3a3\"}i.icon.forumbee:before{content:\"\\f211\"}i.icon.forward:before{content:\"\\f04e\"}i.icon.foursquare:before{content:\"\\f180\"}i.icon.free.code.camp:before{content:\"\\f2c5\"}i.icon.freebsd:before{content:\"\\f3a4\"}i.icon.frown:before{content:\"\\f119\"}i.icon.futbol:before{content:\"\\f1e3\"}i.icon.gamepad:before{content:\"\\f11b\"}i.icon.gavel:before{content:\"\\f0e3\"}i.icon.gem:before{content:\"\\f3a5\"}i.icon.genderless:before{content:\"\\f22d\"}i.icon.get.pocket:before{content:\"\\f265\"}i.icon.gg:before{content:\"\\f260\"}i.icon.gg.circle:before{content:\"\\f261\"}i.icon.gift:before{content:\"\\f06b\"}i.icon.git:before{content:\"\\f1d3\"}i.icon.git.square:before{content:\"\\f1d2\"}i.icon.github:before{content:\"\\f09b\"}i.icon.github.alternate:before{content:\"\\f113\"}i.icon.github.square:before{content:\"\\f092\"}i.icon.gitkraken:before{content:\"\\f3a6\"}i.icon.gitlab:before{content:\"\\f296\"}i.icon.gitter:before{content:\"\\f426\"}i.icon.glass.martini:before{content:\"\\f000\"}i.icon.glide:before{content:\"\\f2a5\"}i.icon.glide.g:before{content:\"\\f2a6\"}i.icon.globe:before{content:\"\\f0ac\"}i.icon.gofore:before{content:\"\\f3a7\"}i.icon.golf.ball:before{content:\"\\f450\"}i.icon.goodreads:before{content:\"\\f3a8\"}i.icon.goodreads.g:before{content:\"\\f3a9\"}i.icon.google:before{content:\"\\f1a0\"}i.icon.google.drive:before{content:\"\\f3aa\"}i.icon.google.play:before{content:\"\\f3ab\"}i.icon.google.plus:before{content:\"\\f2b3\"}i.icon.google.plus.g:before{content:\"\\f0d5\"}i.icon.google.plus.square:before{content:\"\\f0d4\"}i.icon.google.wallet:before{content:\"\\f1ee\"}i.icon.graduation.cap:before{content:\"\\f19d\"}i.icon.gratipay:before{content:\"\\f184\"}i.icon.grav:before{content:\"\\f2d6\"}i.icon.gripfire:before{content:\"\\f3ac\"}i.icon.grunt:before{content:\"\\f3ad\"}i.icon.gulp:before{content:\"\\f3ae\"}i.icon.h.square:before{content:\"\\f0fd\"}i.icon.hacker.news:before{content:\"\\f1d4\"}i.icon.hacker.news.square:before{content:\"\\f3af\"}i.icon.hand.lizard:before{content:\"\\f258\"}i.icon.hand.paper:before{content:\"\\f256\"}i.icon.hand.peace:before{content:\"\\f25b\"}i.icon.hand.point.down:before{content:\"\\f0a7\"}i.icon.hand.point.left:before{content:\"\\f0a5\"}i.icon.hand.point.right:before{content:\"\\f0a4\"}i.icon.hand.point.up:before{content:\"\\f0a6\"}i.icon.hand.pointer:before{content:\"\\f25a\"}i.icon.hand.rock:before{content:\"\\f255\"}i.icon.hand.scissors:before{content:\"\\f257\"}i.icon.hand.spock:before{content:\"\\f259\"}i.icon.handshake:before{content:\"\\f2b5\"}i.icon.hashtag:before{content:\"\\f292\"}i.icon.hdd:before{content:\"\\f0a0\"}i.icon.heading:before{content:\"\\f1dc\"}i.icon.headphones:before{content:\"\\f025\"}i.icon.heart:before{content:\"\\f004\"}i.icon.heartbeat:before{content:\"\\f21e\"}i.icon.hips:before{content:\"\\f452\"}i.icon.hire.a.helper:before{content:\"\\f3b0\"}i.icon.history:before{content:\"\\f1da\"}i.icon.hockey.puck:before{content:\"\\f453\"}i.icon.home:before{content:\"\\f015\"}i.icon.hooli:before{content:\"\\f427\"}i.icon.hospital:before{content:\"\\f0f8\"}i.icon.hospital.symbol:before{content:\"\\f47e\"}i.icon.hotjar:before{content:\"\\f3b1\"}i.icon.hourglass:before{content:\"\\f254\"}i.icon.hourglass.end:before{content:\"\\f253\"}i.icon.hourglass.half:before{content:\"\\f252\"}i.icon.hourglass.start:before{content:\"\\f251\"}i.icon.houzz:before{content:\"\\f27c\"}i.icon.html5:before{content:\"\\f13b\"}i.icon.hubspot:before{content:\"\\f3b2\"}i.icon.i.cursor:before{content:\"\\f246\"}i.icon.id.badge:before{content:\"\\f2c1\"}i.icon.id.card:before{content:\"\\f2c2\"}i.icon.image:before{content:\"\\f03e\"}i.icon.images:before{content:\"\\f302\"}i.icon.imdb:before{content:\"\\f2d8\"}i.icon.inbox:before{content:\"\\f01c\"}i.icon.indent:before{content:\"\\f03c\"}i.icon.industry:before{content:\"\\f275\"}i.icon.info:before{content:\"\\f129\"}i.icon.info.circle:before{content:\"\\f05a\"}i.icon.instagram:before{content:\"\\f16d\"}i.icon.internet.explorer:before{content:\"\\f26b\"}i.icon.ioxhost:before{content:\"\\f208\"}i.icon.italic:before{content:\"\\f033\"}i.icon.itunes:before{content:\"\\f3b4\"}i.icon.itunes.note:before{content:\"\\f3b5\"}i.icon.jenkins:before{content:\"\\f3b6\"}i.icon.joget:before{content:\"\\f3b7\"}i.icon.joomla:before{content:\"\\f1aa\"}i.icon.js:before{content:\"\\f3b8\"}i.icon.js.square:before{content:\"\\f3b9\"}i.icon.jsfiddle:before{content:\"\\f1cc\"}i.icon.key:before{content:\"\\f084\"}i.icon.keyboard:before{content:\"\\f11c\"}i.icon.keycdn:before{content:\"\\f3ba\"}i.icon.kickstarter:before{content:\"\\f3bb\"}i.icon.kickstarter.k:before{content:\"\\f3bc\"}i.icon.korvue:before{content:\"\\f42f\"}i.icon.language:before{content:\"\\f1ab\"}i.icon.laptop:before{content:\"\\f109\"}i.icon.laravel:before{content:\"\\f3bd\"}i.icon.lastfm:before{content:\"\\f202\"}i.icon.lastfm.square:before{content:\"\\f203\"}i.icon.leaf:before{content:\"\\f06c\"}i.icon.leanpub:before{content:\"\\f212\"}i.icon.lemon:before{content:\"\\f094\"}i.icon.less:before{content:\"\\f41d\"}i.icon.level.down.alternate:before{content:\"\\f3be\"}i.icon.level.up.alternate:before{content:\"\\f3bf\"}i.icon.life.ring:before{content:\"\\f1cd\"}i.icon.lightbulb:before{content:\"\\f0eb\"}i.icon.linechat:before{content:\"\\f3c0\"}i.icon.linkify:before{content:\"\\f0c1\"}i.icon.linkedin:before{content:\"\\f08c\"}i.icon.linkedin.alt:before{content:\"\\f0e1\"}i.icon.linode:before{content:\"\\f2b8\"}i.icon.linux:before{content:\"\\f17c\"}i.icon.lira.sign:before{content:\"\\f195\"}i.icon.list:before{content:\"\\f03a\"}i.icon.list.alternate:before{content:\"\\f022\"}i.icon.list.ol:before{content:\"\\f0cb\"}i.icon.list.ul:before{content:\"\\f0ca\"}i.icon.location.arrow:before{content:\"\\f124\"}i.icon.lock:before{content:\"\\f023\"}i.icon.lock.open:before{content:\"\\f3c1\"}i.icon.long.arrow.alternate.down:before{content:\"\\f309\"}i.icon.long.arrow.alternate.left:before{content:\"\\f30a\"}i.icon.long.arrow.alternate.right:before{content:\"\\f30b\"}i.icon.long.arrow.alternate.up:before{content:\"\\f30c\"}i.icon.low.vision:before{content:\"\\f2a8\"}i.icon.lyft:before{content:\"\\f3c3\"}i.icon.magento:before{content:\"\\f3c4\"}i.icon.magic:before{content:\"\\f0d0\"}i.icon.magnet:before{content:\"\\f076\"}i.icon.male:before{content:\"\\f183\"}i.icon.map:before{content:\"\\f279\"}i.icon.map.marker:before{content:\"\\f041\"}i.icon.map.marker.alternate:before{content:\"\\f3c5\"}i.icon.map.pin:before{content:\"\\f276\"}i.icon.map.signs:before{content:\"\\f277\"}i.icon.mars:before{content:\"\\f222\"}i.icon.mars.double:before{content:\"\\f227\"}i.icon.mars.stroke:before{content:\"\\f229\"}i.icon.mars.stroke.horizontal:before{content:\"\\f22b\"}i.icon.mars.stroke.vertical:before{content:\"\\f22a\"}i.icon.maxcdn:before{content:\"\\f136\"}i.icon.medapps:before{content:\"\\f3c6\"}i.icon.medium:before{content:\"\\f23a\"}i.icon.medium.m:before{content:\"\\f3c7\"}i.icon.medkit:before{content:\"\\f0fa\"}i.icon.medrt:before{content:\"\\f3c8\"}i.icon.meetup:before{content:\"\\f2e0\"}i.icon.meh:before{content:\"\\f11a\"}i.icon.mercury:before{content:\"\\f223\"}i.icon.microchip:before{content:\"\\f2db\"}i.icon.microphone:before{content:\"\\f130\"}i.icon.microphone.slash:before{content:\"\\f131\"}i.icon.microsoft:before{content:\"\\f3ca\"}i.icon.minus:before{content:\"\\f068\"}i.icon.minus.circle:before{content:\"\\f056\"}i.icon.minus.square:before{content:\"\\f146\"}i.icon.mix:before{content:\"\\f3cb\"}i.icon.mixcloud:before{content:\"\\f289\"}i.icon.mizuni:before{content:\"\\f3cc\"}i.icon.mobile:before{content:\"\\f10b\"}i.icon.mobile.alternate:before{content:\"\\f3cd\"}i.icon.modx:before{content:\"\\f285\"}i.icon.monero:before{content:\"\\f3d0\"}i.icon.money.bill.alternate:before{content:\"\\f3d1\"}i.icon.moon:before{content:\"\\f186\"}i.icon.motorcycle:before{content:\"\\f21c\"}i.icon.mouse.pointer:before{content:\"\\f245\"}i.icon.music:before{content:\"\\f001\"}i.icon.napster:before{content:\"\\f3d2\"}i.icon.neuter:before{content:\"\\f22c\"}i.icon.newspaper:before{content:\"\\f1ea\"}i.icon.nintendo.switch:before{content:\"\\f418\"}i.icon.node:before{content:\"\\f419\"}i.icon.node.js:before{content:\"\\f3d3\"}i.icon.npm:before{content:\"\\f3d4\"}i.icon.ns8:before{content:\"\\f3d5\"}i.icon.nutritionix:before{content:\"\\f3d6\"}i.icon.object.group:before{content:\"\\f247\"}i.icon.object.ungroup:before{content:\"\\f248\"}i.icon.odnoklassniki:before{content:\"\\f263\"}i.icon.odnoklassniki.square:before{content:\"\\f264\"}i.icon.opencart:before{content:\"\\f23d\"}i.icon.openid:before{content:\"\\f19b\"}i.icon.opera:before{content:\"\\f26a\"}i.icon.optin.monster:before{content:\"\\f23c\"}i.icon.osi:before{content:\"\\f41a\"}i.icon.outdent:before{content:\"\\f03b\"}i.icon.page4:before{content:\"\\f3d7\"}i.icon.pagelines:before{content:\"\\f18c\"}i.icon.paint.brush:before{content:\"\\f1fc\"}i.icon.palfed:before{content:\"\\f3d8\"}i.icon.pallet:before{content:\"\\f482\"}i.icon.paper.plane:before{content:\"\\f1d8\"}i.icon.paperclip:before{content:\"\\f0c6\"}i.icon.paragraph:before{content:\"\\f1dd\"}i.icon.paste:before{content:\"\\f0ea\"}i.icon.patreon:before{content:\"\\f3d9\"}i.icon.pause:before{content:\"\\f04c\"}i.icon.pause.circle:before{content:\"\\f28b\"}i.icon.paw:before{content:\"\\f1b0\"}i.icon.paypal:before{content:\"\\f1ed\"}i.icon.pen.square:before{content:\"\\f14b\"}i.icon.pencil.alternate:before{content:\"\\f303\"}i.icon.percent:before{content:\"\\f295\"}i.icon.periscope:before{content:\"\\f3da\"}i.icon.phabricator:before{content:\"\\f3db\"}i.icon.phoenix.framework:before{content:\"\\f3dc\"}i.icon.phone:before{content:\"\\f095\"}i.icon.phone.square:before{content:\"\\f098\"}i.icon.phone.volume:before{content:\"\\f2a0\"}i.icon.php:before{content:\"\\f457\"}i.icon.pied.piper:before{content:\"\\f2ae\"}i.icon.pied.piper.alternate:before{content:\"\\f1a8\"}i.icon.pied.piper.pp:before{content:\"\\f1a7\"}i.icon.pills:before{content:\"\\f484\"}i.icon.pinterest:before{content:\"\\f0d2\"}i.icon.pinterest.p:before{content:\"\\f231\"}i.icon.pinterest.square:before{content:\"\\f0d3\"}i.icon.plane:before{content:\"\\f072\"}i.icon.play:before{content:\"\\f04b\"}i.icon.play.circle:before{content:\"\\f144\"}i.icon.playstation:before{content:\"\\f3df\"}i.icon.plug:before{content:\"\\f1e6\"}i.icon.plus:before{content:\"\\f067\"}i.icon.plus.circle:before{content:\"\\f055\"}i.icon.plus.square:before{content:\"\\f0fe\"}i.icon.podcast:before{content:\"\\f2ce\"}i.icon.pound.sign:before{content:\"\\f154\"}i.icon.power.off:before{content:\"\\f011\"}i.icon.print:before{content:\"\\f02f\"}i.icon.product.hunt:before{content:\"\\f288\"}i.icon.pushed:before{content:\"\\f3e1\"}i.icon.puzzle.piece:before{content:\"\\f12e\"}i.icon.python:before{content:\"\\f3e2\"}i.icon.qq:before{content:\"\\f1d6\"}i.icon.qrcode:before{content:\"\\f029\"}i.icon.question:before{content:\"\\f128\"}i.icon.question.circle:before{content:\"\\f059\"}i.icon.quidditch:before{content:\"\\f458\"}i.icon.quinscape:before{content:\"\\f459\"}i.icon.quora:before{content:\"\\f2c4\"}i.icon.quote.left:before{content:\"\\f10d\"}i.icon.quote.right:before{content:\"\\f10e\"}i.icon.random:before{content:\"\\f074\"}i.icon.ravelry:before{content:\"\\f2d9\"}i.icon.react:before{content:\"\\f41b\"}i.icon.rebel:before{content:\"\\f1d0\"}i.icon.recycle:before{content:\"\\f1b8\"}i.icon.redriver:before{content:\"\\f3e3\"}i.icon.reddit:before{content:\"\\f1a1\"}i.icon.reddit.alien:before{content:\"\\f281\"}i.icon.reddit.square:before{content:\"\\f1a2\"}i.icon.redo:before{content:\"\\f01e\"}i.icon.redo.alternate:before{content:\"\\f2f9\"}i.icon.registered:before{content:\"\\f25d\"}i.icon.rendact:before{content:\"\\f3e4\"}i.icon.renren:before{content:\"\\f18b\"}i.icon.reply:before{content:\"\\f3e5\"}i.icon.reply.all:before{content:\"\\f122\"}i.icon.replyd:before{content:\"\\f3e6\"}i.icon.resolving:before{content:\"\\f3e7\"}i.icon.retweet:before{content:\"\\f079\"}i.icon.road:before{content:\"\\f018\"}i.icon.rocket:before{content:\"\\f135\"}i.icon.rocketchat:before{content:\"\\f3e8\"}i.icon.rockrms:before{content:\"\\f3e9\"}i.icon.rss:before{content:\"\\f09e\"}i.icon.rss.square:before{content:\"\\f143\"}i.icon.ruble.sign:before{content:\"\\f158\"}i.icon.rupee.sign:before{content:\"\\f156\"}i.icon.safari:before{content:\"\\f267\"}i.icon.sass:before{content:\"\\f41e\"}i.icon.save:before{content:\"\\f0c7\"}i.icon.schlix:before{content:\"\\f3ea\"}i.icon.scribd:before{content:\"\\f28a\"}i.icon.search:before{content:\"\\f002\"}i.icon.search.minus:before{content:\"\\f010\"}i.icon.search.plus:before{content:\"\\f00e\"}i.icon.searchengin:before{content:\"\\f3eb\"}i.icon.sellcast:before{content:\"\\f2da\"}i.icon.sellsy:before{content:\"\\f213\"}i.icon.server:before{content:\"\\f233\"}i.icon.servicestack:before{content:\"\\f3ec\"}i.icon.share:before{content:\"\\f064\"}i.icon.share.alternate:before{content:\"\\f1e0\"}i.icon.share.alternate.square:before{content:\"\\f1e1\"}i.icon.share.square:before{content:\"\\f14d\"}i.icon.shekel.sign:before{content:\"\\f20b\"}i.icon.shield.alternate:before{content:\"\\f3ed\"}i.icon.ship:before{content:\"\\f21a\"}i.icon.shipping.fast:before{content:\"\\f48b\"}i.icon.shirtsinbulk:before{content:\"\\f214\"}i.icon.shopping.bag:before{content:\"\\f290\"}i.icon.shopping.basket:before{content:\"\\f291\"}i.icon.shopping.cart:before{content:\"\\f07a\"}i.icon.shower:before{content:\"\\f2cc\"}i.icon.sign.language:before{content:\"\\f2a7\"}i.icon.signal:before{content:\"\\f012\"}i.icon.simplybuilt:before{content:\"\\f215\"}i.icon.sistrix:before{content:\"\\f3ee\"}i.icon.sitemap:before{content:\"\\f0e8\"}i.icon.skyatlas:before{content:\"\\f216\"}i.icon.skype:before{content:\"\\f17e\"}i.icon.slack:before{content:\"\\f198\"}i.icon.slack.hash:before{content:\"\\f3ef\"}i.icon.sliders.horizontal:before{content:\"\\f1de\"}i.icon.slideshare:before{content:\"\\f1e7\"}i.icon.smile:before{content:\"\\f118\"}i.icon.snapchat:before{content:\"\\f2ab\"}i.icon.snapchat.ghost:before{content:\"\\f2ac\"}i.icon.snapchat.square:before{content:\"\\f2ad\"}i.icon.snowflake:before{content:\"\\f2dc\"}i.icon.sort:before{content:\"\\f0dc\"}i.icon.sort.alphabet.down:before{content:\"\\f15d\"}i.icon.sort.alphabet.up:before{content:\"\\f15e\"}i.icon.sort.amount.down:before{content:\"\\f160\"}i.icon.sort.amount.up:before{content:\"\\f161\"}i.icon.sort.down:before{content:\"\\f0dd\"}i.icon.sort.numeric.down:before{content:\"\\f162\"}i.icon.sort.numeric.up:before{content:\"\\f163\"}i.icon.sort.up:before{content:\"\\f0de\"}i.icon.soundcloud:before{content:\"\\f1be\"}i.icon.space.shuttle:before{content:\"\\f197\"}i.icon.speakap:before{content:\"\\f3f3\"}i.icon.spinner:before{content:\"\\f110\"}i.icon.spotify:before{content:\"\\f1bc\"}i.icon.square:before{content:\"\\f0c8\"}i.icon.square.full:before{content:\"\\f45c\"}i.icon.stack.exchange:before{content:\"\\f18d\"}i.icon.stack.overflow:before{content:\"\\f16c\"}i.icon.star:before{content:\"\\f005\"}i.icon.star.half:before{content:\"\\f089\"}i.icon.staylinked:before{content:\"\\f3f5\"}i.icon.steam:before{content:\"\\f1b6\"}i.icon.steam.square:before{content:\"\\f1b7\"}i.icon.steam.symbol:before{content:\"\\f3f6\"}i.icon.step.backward:before{content:\"\\f048\"}i.icon.step.forward:before{content:\"\\f051\"}i.icon.stethoscope:before{content:\"\\f0f1\"}i.icon.sticker.mule:before{content:\"\\f3f7\"}i.icon.sticky.note:before{content:\"\\f249\"}i.icon.stop:before{content:\"\\f04d\"}i.icon.stop.circle:before{content:\"\\f28d\"}i.icon.stopwatch:before{content:\"\\f2f2\"}i.icon.strava:before{content:\"\\f428\"}i.icon.street.view:before{content:\"\\f21d\"}i.icon.strikethrough:before{content:\"\\f0cc\"}i.icon.stripe:before{content:\"\\f429\"}i.icon.stripe.s:before{content:\"\\f42a\"}i.icon.studiovinari:before{content:\"\\f3f8\"}i.icon.stumbleupon:before{content:\"\\f1a4\"}i.icon.stumbleupon.circle:before{content:\"\\f1a3\"}i.icon.subscript:before{content:\"\\f12c\"}i.icon.subway:before{content:\"\\f239\"}i.icon.suitcase:before{content:\"\\f0f2\"}i.icon.sun:before{content:\"\\f185\"}i.icon.superpowers:before{content:\"\\f2dd\"}i.icon.superscript:before{content:\"\\f12b\"}i.icon.supple:before{content:\"\\f3f9\"}i.icon.sync:before{content:\"\\f021\"}i.icon.sync.alternate:before{content:\"\\f2f1\"}i.icon.syringe:before{content:\"\\f48e\"}i.icon.table:before{content:\"\\f0ce\"}i.icon.table.tennis:before{content:\"\\f45d\"}i.icon.tablet:before{content:\"\\f10a\"}i.icon.tablet.alternate:before{content:\"\\f3fa\"}i.icon.tachometer.alternate:before{content:\"\\f3fd\"}i.icon.tag:before{content:\"\\f02b\"}i.icon.tags:before{content:\"\\f02c\"}i.icon.tasks:before{content:\"\\f0ae\"}i.icon.taxi:before{content:\"\\f1ba\"}i.icon.telegram:before{content:\"\\f2c6\"}i.icon.telegram.plane:before{content:\"\\f3fe\"}i.icon.tencent.weibo:before{content:\"\\f1d5\"}i.icon.terminal:before{content:\"\\f120\"}i.icon.text.height:before{content:\"\\f034\"}i.icon.text.width:before{content:\"\\f035\"}i.icon.th:before{content:\"\\f00a\"}i.icon.th.large:before{content:\"\\f009\"}i.icon.th.list:before{content:\"\\f00b\"}i.icon.themeisle:before{content:\"\\f2b2\"}i.icon.thermometer:before{content:\"\\f491\"}i.icon.thermometer.empty:before{content:\"\\f2cb\"}i.icon.thermometer.full:before{content:\"\\f2c7\"}i.icon.thermometer.half:before{content:\"\\f2c9\"}i.icon.thermometer.quarter:before{content:\"\\f2ca\"}i.icon.thermometer.three.quarters:before{content:\"\\f2c8\"}i.icon.thumbs.down:before{content:\"\\f165\"}i.icon.thumbs.up:before{content:\"\\f164\"}i.icon.thumbtack:before{content:\"\\f08d\"}i.icon.ticket.alternate:before{content:\"\\f3ff\"}i.icon.times:before{content:\"\\f00d\"}i.icon.times.circle:before{content:\"\\f057\"}i.icon.tint:before{content:\"\\f043\"}i.icon.toggle.off:before{content:\"\\f204\"}i.icon.toggle.on:before{content:\"\\f205\"}i.icon.trademark:before{content:\"\\f25c\"}i.icon.train:before{content:\"\\f238\"}i.icon.transgender:before{content:\"\\f224\"}i.icon.transgender.alternate:before{content:\"\\f225\"}i.icon.trash:before{content:\"\\f1f8\"}i.icon.trash.alternate:before{content:\"\\f2ed\"}i.icon.tree:before{content:\"\\f1bb\"}i.icon.trello:before{content:\"\\f181\"}i.icon.tripadvisor:before{content:\"\\f262\"}i.icon.trophy:before{content:\"\\f091\"}i.icon.truck:before{content:\"\\f0d1\"}i.icon.tty:before{content:\"\\f1e4\"}i.icon.tumblr:before{content:\"\\f173\"}i.icon.tumblr.square:before{content:\"\\f174\"}i.icon.tv:before{content:\"\\f26c\"}i.icon.twitch:before{content:\"\\f1e8\"}i.icon.twitter:before{content:\"\\f099\"}i.icon.twitter.square:before{content:\"\\f081\"}i.icon.typo3:before{content:\"\\f42b\"}i.icon.uber:before{content:\"\\f402\"}i.icon.uikit:before{content:\"\\f403\"}i.icon.umbrella:before{content:\"\\f0e9\"}i.icon.underline:before{content:\"\\f0cd\"}i.icon.undo:before{content:\"\\f0e2\"}i.icon.undo.alternate:before{content:\"\\f2ea\"}i.icon.uniregistry:before{content:\"\\f404\"}i.icon.universal.access:before{content:\"\\f29a\"}i.icon.university:before{content:\"\\f19c\"}i.icon.unlink:before{content:\"\\f127\"}i.icon.unlock:before{content:\"\\f09c\"}i.icon.unlock.alternate:before{content:\"\\f13e\"}i.icon.untappd:before{content:\"\\f405\"}i.icon.upload:before{content:\"\\f093\"}i.icon.usb:before{content:\"\\f287\"}i.icon.user:before{content:\"\\f007\"}i.icon.user.circle:before{content:\"\\f2bd\"}i.icon.user.md:before{content:\"\\f0f0\"}i.icon.user.plus:before{content:\"\\f234\"}i.icon.user.secret:before{content:\"\\f21b\"}i.icon.user.times:before{content:\"\\f235\"}i.icon.users:before{content:\"\\f0c0\"}i.icon.ussunnah:before{content:\"\\f407\"}i.icon.utensil.spoon:before{content:\"\\f2e5\"}i.icon.utensils:before{content:\"\\f2e7\"}i.icon.vaadin:before{content:\"\\f408\"}i.icon.venus:before{content:\"\\f221\"}i.icon.venus.double:before{content:\"\\f226\"}i.icon.venus.mars:before{content:\"\\f228\"}i.icon.viacoin:before{content:\"\\f237\"}i.icon.viadeo:before{content:\"\\f2a9\"}i.icon.viadeo.square:before{content:\"\\f2aa\"}i.icon.viber:before{content:\"\\f409\"}i.icon.video:before{content:\"\\f03d\"}i.icon.vimeo:before{content:\"\\f40a\"}i.icon.vimeo.square:before{content:\"\\f194\"}i.icon.vimeo.v:before{content:\"\\f27d\"}i.icon.vine:before{content:\"\\f1ca\"}i.icon.vk:before{content:\"\\f189\"}i.icon.vnv:before{content:\"\\f40b\"}i.icon.volleyball.ball:before{content:\"\\f45f\"}i.icon.volume.down:before{content:\"\\f027\"}i.icon.volume.off:before{content:\"\\f026\"}i.icon.volume.up:before{content:\"\\f028\"}i.icon.vuejs:before{content:\"\\f41f\"}i.icon.warehouse:before{content:\"\\f494\"}i.icon.weibo:before{content:\"\\f18a\"}i.icon.weight:before{content:\"\\f496\"}i.icon.weixin:before{content:\"\\f1d7\"}i.icon.whatsapp:before{content:\"\\f232\"}i.icon.whatsapp.square:before{content:\"\\f40c\"}i.icon.wheelchair:before{content:\"\\f193\"}i.icon.whmcs:before{content:\"\\f40d\"}i.icon.wifi:before{content:\"\\f1eb\"}i.icon.wikipedia.w:before{content:\"\\f266\"}i.icon.window.close:before{content:\"\\f410\"}i.icon.window.maximize:before{content:\"\\f2d0\"}i.icon.window.minimize:before{content:\"\\f2d1\"}i.icon.window.restore:before{content:\"\\f2d2\"}i.icon.windows:before{content:\"\\f17a\"}i.icon.won.sign:before{content:\"\\f159\"}i.icon.wordpress:before{content:\"\\f19a\"}i.icon.wordpress.simple:before{content:\"\\f411\"}i.icon.wpbeginner:before{content:\"\\f297\"}i.icon.wpexplorer:before{content:\"\\f2de\"}i.icon.wpforms:before{content:\"\\f298\"}i.icon.wrench:before{content:\"\\f0ad\"}i.icon.xbox:before{content:\"\\f412\"}i.icon.xing:before{content:\"\\f168\"}i.icon.xing.square:before{content:\"\\f169\"}i.icon.y.combinator:before{content:\"\\f23b\"}i.icon.yahoo:before{content:\"\\f19e\"}i.icon.yandex:before{content:\"\\f413\"}i.icon.yandex.international:before{content:\"\\f414\"}i.icon.yelp:before{content:\"\\f1e9\"}i.icon.yen.sign:before{content:\"\\f157\"}i.icon.yoast:before{content:\"\\f2b1\"}i.icon.youtube:before{content:\"\\f167\"}i.icon.youtube.square:before{content:\"\\f431\"}i.icon.chess.rock:before{content:\"\\f447\"}i.icon.ordered.list:before{content:\"\\f0cb\"}i.icon.unordered.list:before{content:\"\\f0ca\"}i.icon.user.doctor:before{content:\"\\f0f0\"}i.icon.shield:before{content:\"\\f3ed\"}i.icon.puzzle:before{content:\"\\f12e\"}i.icon.credit.card.amazon.pay:before{content:\"\\f42d\"}i.icon.credit.card.american.express:before{content:\"\\f1f3\"}i.icon.credit.card.diners.club:before{content:\"\\f24c\"}i.icon.credit.card.discover:before{content:\"\\f1f2\"}i.icon.credit.card.jcb:before{content:\"\\f24b\"}i.icon.credit.card.mastercard:before{content:\"\\f1f1\"}i.icon.credit.card.paypal:before{content:\"\\f1f4\"}i.icon.credit.card.stripe:before{content:\"\\f1f5\"}i.icon.credit.card.visa:before{content:\"\\f1f0\"}i.icon.add.circle:before{content:\"\\f055\"}i.icon.add.square:before{content:\"\\f0fe\"}i.icon.add.to.calendar:before{content:\"\\f271\"}i.icon.add.to.cart:before{content:\"\\f217\"}i.icon.add.user:before{content:\"\\f234\"}i.icon.add:before{content:\"\\f067\"}i.icon.alarm.mute:before{content:\"\\f1f6\"}i.icon.alarm:before{content:\"\\f0f3\"}i.icon.ald:before{content:\"\\f2a2\"}i.icon.als:before{content:\"\\f2a2\"}i.icon.american.express.card:before{content:\"\\f1f3\"}i.icon.american.express:before{content:\"\\f1f3\"}i.icon.amex:before{content:\"\\f1f3\"}i.icon.announcement:before{content:\"\\f0a1\"}i.icon.area.chart:before{content:\"\\f1fe\"}i.icon.area.graph:before{content:\"\\f1fe\"}i.icon.arrow.down.cart:before{content:\"\\f218\"}i.icon.asexual:before{content:\"\\f22d\"}i.icon.asl.interpreting:before{content:\"\\f2a3\"}i.icon.asl:before{content:\"\\f2a3\"}i.icon.assistive.listening.devices:before{content:\"\\f2a2\"}i.icon.attach:before{content:\"\\f0c6\"}i.icon.attention:before{content:\"\\f06a\"}i.icon.balance:before{content:\"\\f24e\"}i.icon.bar:before{content:\"\\f0fc\"}i.icon.bathtub:before{content:\"\\f2cd\"}i.icon.battery.four:before{content:\"\\f240\"}i.icon.battery.high:before{content:\"\\f241\"}i.icon.battery.low:before{content:\"\\f243\"}i.icon.battery.medium:before{content:\"\\f242\"}i.icon.battery.one:before{content:\"\\f243\"}i.icon.battery.three:before{content:\"\\f241\"}i.icon.battery.two:before{content:\"\\f242\"}i.icon.battery.zero:before{content:\"\\f244\"}i.icon.birthday:before{content:\"\\f1fd\"}i.icon.block.layout:before{content:\"\\f009\"}i.icon.bluetooth.alternative:before{content:\"\\f294\"}i.icon.broken.chain:before{content:\"\\f127\"}i.icon.browser:before{content:\"\\f022\"}i.icon.call.square:before{content:\"\\f098\"}i.icon.call:before{content:\"\\f095\"}i.icon.cancel:before{content:\"\\f00d\"}i.icon.cart:before{content:\"\\f07a\"}i.icon.cc:before{content:\"\\f20a\"}i.icon.chain:before{content:\"\\f0c1\"}i.icon.chat:before{content:\"\\f075\"}i.icon.checked.calendar:before{content:\"\\f274\"}i.icon.checkmark:before{content:\"\\f00c\"}i.icon.circle.notched:before{content:\"\\f1ce\"}i.icon.close:before{content:\"\\f00d\"}i.icon.cny:before{content:\"\\f157\"}i.icon.cocktail:before{content:\"\\f000\"}i.icon.commenting:before{content:\"\\f27a\"}i.icon.computer:before{content:\"\\f108\"}i.icon.configure:before{content:\"\\f0ad\"}i.icon.content:before{content:\"\\f0c9\"}i.icon.deafness:before{content:\"\\f2a4\"}i.icon.delete.calendar:before{content:\"\\f273\"}i.icon.delete:before{content:\"\\f00d\"}i.icon.detective:before{content:\"\\f21b\"}i.icon.diners.club.card:before{content:\"\\f24c\"}i.icon.diners.club:before{content:\"\\f24c\"}i.icon.discover.card:before{content:\"\\f1f2\"}i.icon.discover:before{content:\"\\f1f2\"}i.icon.discussions:before{content:\"\\f086\"}i.icon.doctor:before{content:\"\\f0f0\"}i.icon.dollar:before{content:\"\\f155\"}i.icon.dont:before{content:\"\\f05e\"}i.icon.dribble:before{content:\"\\f17d\"}i.icon.drivers.license:before{content:\"\\f2c2\"}i.icon.dropdown:before{content:\"\\f0d7\"}i.icon.eercast:before{content:\"\\f2da\"}i.icon.emergency:before{content:\"\\f0f9\"}i.icon.envira.gallery:before{content:\"\\f299\"}i.icon.erase:before{content:\"\\f12d\"}i.icon.eur:before{content:\"\\f153\"}i.icon.euro:before{content:\"\\f153\"}i.icon.eyedropper:before{content:\"\\f1fb\"}i.icon.fa:before{content:\"\\f2b4\"}i.icon.factory:before{content:\"\\f275\"}i.icon.favorite:before{content:\"\\f005\"}i.icon.feed:before{content:\"\\f09e\"}i.icon.female.homosexual:before{content:\"\\f226\"}i.icon.file.text:before{content:\"\\f15c\"}i.icon.find:before{content:\"\\f1e5\"}i.icon.first.aid:before{content:\"\\f0fa\"}i.icon.five.hundred.pixels:before{content:\"\\f26e\"}i.icon.fork:before{content:\"\\f126\"}i.icon.game:before{content:\"\\f11b\"}i.icon.gay:before{content:\"\\f227\"}i.icon.gbp:before{content:\"\\f154\"}i.icon.gittip:before{content:\"\\f184\"}i.icon.google.plus.circle:before{content:\"\\f2b3\"}i.icon.google.plus.official:before{content:\"\\f2b3\"}i.icon.grab:before{content:\"\\f255\"}i.icon.graduation:before{content:\"\\f19d\"}i.icon.grid.layout:before{content:\"\\f00a\"}i.icon.group:before{content:\"\\f0c0\"}i.icon.h:before{content:\"\\f0fd\"}i.icon.hand.victory:before{content:\"\\f25b\"}i.icon.handicap:before{content:\"\\f193\"}i.icon.hard.of.hearing:before{content:\"\\f2a4\"}i.icon.header:before{content:\"\\f1dc\"}i.icon.help.circle:before{content:\"\\f059\"}i.icon.help:before{content:\"\\f128\"}i.icon.heterosexual:before{content:\"\\f228\"}i.icon.hide:before{content:\"\\f070\"}i.icon.hotel:before{content:\"\\f236\"}i.icon.hourglass.four:before{content:\"\\f254\"}i.icon.hourglass.full:before{content:\"\\f254\"}i.icon.hourglass.one:before{content:\"\\f251\"}i.icon.hourglass.three:before{content:\"\\f253\"}i.icon.hourglass.two:before{content:\"\\f252\"}i.icon.idea:before{content:\"\\f0eb\"}i.icon.ils:before{content:\"\\f20b\"}i.icon.in-cart:before{content:\"\\f218\"}i.icon.inr:before{content:\"\\f156\"}i.icon.intergender:before{content:\"\\f224\"}i.icon.intersex:before{content:\"\\f224\"}i.icon.japan.credit.bureau.card:before{content:\"\\f24b\"}i.icon.japan.credit.bureau:before{content:\"\\f24b\"}i.icon.jcb:before{content:\"\\f24b\"}i.icon.jpy:before{content:\"\\f157\"}i.icon.krw:before{content:\"\\f159\"}i.icon.lab:before{content:\"\\f0c3\"}i.icon.law:before{content:\"\\f24e\"}i.icon.legal:before{content:\"\\f0e3\"}i.icon.lesbian:before{content:\"\\f226\"}i.icon.lightning:before{content:\"\\f0e7\"}i.icon.like:before{content:\"\\f004\"}i.icon.line.graph:before{content:\"\\f201\"}i.icon.linkedin.square:before{content:\"\\f08c\"}i.icon.linkify:before{content:\"\\f0c1\"}i.icon.lira:before{content:\"\\f195\"}i.icon.list.layout:before{content:\"\\f00b\"}i.icon.magnify:before{content:\"\\f00e\"}i.icon.mail.forward:before{content:\"\\f064\"}i.icon.mail.square:before{content:\"\\f199\"}i.icon.mail:before{content:\"\\f0e0\"}i.icon.male.homosexual:before{content:\"\\f227\"}i.icon.man:before{content:\"\\f222\"}i.icon.marker:before{content:\"\\f041\"}i.icon.mars.alternate:before{content:\"\\f229\"}i.icon.mars.horizontal:before{content:\"\\f22b\"}i.icon.mars.vertical:before{content:\"\\f22a\"}i.icon.mastercard.card:before{content:\"\\f1f1\"}i.icon.mastercard:before{content:\"\\f1f1\"}i.icon.microsoft.edge:before{content:\"\\f282\"}i.icon.military:before{content:\"\\f0fb\"}i.icon.ms.edge:before{content:\"\\f282\"}i.icon.mute:before{content:\"\\f131\"}i.icon.new.pied.piper:before{content:\"\\f2ae\"}i.icon.non.binary.transgender:before{content:\"\\f223\"}i.icon.numbered.list:before{content:\"\\f0cb\"}i.icon.optinmonster:before{content:\"\\f23c\"}i.icon.options:before{content:\"\\f1de\"}i.icon.other.gender.horizontal:before{content:\"\\f22b\"}i.icon.other.gender.vertical:before{content:\"\\f22a\"}i.icon.other.gender:before{content:\"\\f229\"}i.icon.payment:before{content:\"\\f09d\"}i.icon.paypal.card:before{content:\"\\f1f4\"}i.icon.pencil.square:before{content:\"\\f14b\"}i.icon.photo:before{content:\"\\f030\"}i.icon.picture:before{content:\"\\f03e\"}i.icon.pie.chart:before{content:\"\\f200\"}i.icon.pie.graph:before{content:\"\\f200\"}i.icon.pied.piper.hat:before{content:\"\\f2ae\"}i.icon.pin:before{content:\"\\f08d\"}i.icon.plus.cart:before{content:\"\\f217\"}i.icon.pocket:before{content:\"\\f265\"}i.icon.point:before{content:\"\\f041\"}i.icon.pointing.down:before{content:\"\\f0a7\"}i.icon.pointing.left:before{content:\"\\f0a5\"}i.icon.pointing.right:before{content:\"\\f0a4\"}i.icon.pointing.up:before{content:\"\\f0a6\"}i.icon.pound:before{content:\"\\f154\"}i.icon.power.cord:before{content:\"\\f1e6\"}i.icon.power:before{content:\"\\f011\"}i.icon.privacy:before{content:\"\\f084\"}i.icon.r.circle:before{content:\"\\f25d\"}i.icon.rain:before{content:\"\\f0e9\"}i.icon.record:before{content:\"\\f03d\"}i.icon.refresh:before{content:\"\\f021\"}i.icon.remove.circle:before{content:\"\\f057\"}i.icon.remove.from.calendar:before{content:\"\\f272\"}i.icon.remove.user:before{content:\"\\f235\"}i.icon.remove:before{content:\"\\f00d\"}i.icon.repeat:before{content:\"\\f01e\"}i.icon.rmb:before{content:\"\\f157\"}i.icon.rouble:before{content:\"\\f158\"}i.icon.rub:before{content:\"\\f158\"}i.icon.ruble:before{content:\"\\f158\"}i.icon.rupee:before{content:\"\\f156\"}i.icon.s15:before{content:\"\\f2cd\"}i.icon.selected.radio:before{content:\"\\f192\"}i.icon.send:before{content:\"\\f1d8\"}i.icon.setting:before{content:\"\\f013\"}i.icon.settings:before{content:\"\\f085\"}i.icon.shekel:before{content:\"\\f20b\"}i.icon.sheqel:before{content:\"\\f20b\"}i.icon.shipping:before{content:\"\\f0d1\"}i.icon.shop:before{content:\"\\f07a\"}i.icon.shuffle:before{content:\"\\f074\"}i.icon.shutdown:before{content:\"\\f011\"}i.icon.sidebar:before{content:\"\\f0c9\"}i.icon.signing:before{content:\"\\f2a7\"}i.icon.signup:before{content:\"\\f044\"}i.icon.sliders:before{content:\"\\f1de\"}i.icon.soccer:before{content:\"\\f1e3\"}i.icon.sort.alphabet.ascending:before{content:\"\\f15d\"}i.icon.sort.alphabet.descending:before{content:\"\\f15e\"}i.icon.sort.ascending:before{content:\"\\f0de\"}i.icon.sort.content.ascending:before{content:\"\\f160\"}i.icon.sort.content.descending:before{content:\"\\f161\"}i.icon.sort.descending:before{content:\"\\f0dd\"}i.icon.sort.numeric.ascending:before{content:\"\\f162\"}i.icon.sort.numeric.descending:before{content:\"\\f163\"}i.icon.sound:before{content:\"\\f025\"}i.icon.spy:before{content:\"\\f21b\"}i.icon.stripe.card:before{content:\"\\f1f5\"}i.icon.student:before{content:\"\\f19d\"}i.icon.talk:before{content:\"\\f27a\"}i.icon.target:before{content:\"\\f140\"}i.icon.teletype:before{content:\"\\f1e4\"}i.icon.television:before{content:\"\\f26c\"}i.icon.text.cursor:before{content:\"\\f246\"}i.icon.text.telephone:before{content:\"\\f1e4\"}i.icon.theme.isle:before{content:\"\\f2b2\"}i.icon.theme:before{content:\"\\f043\"}i.icon.thermometer:before{content:\"\\f2c7\"}i.icon.thumb.tack:before{content:\"\\f08d\"}i.icon.time:before{content:\"\\f017\"}i.icon.tm:before{content:\"\\f25c\"}i.icon.toggle.down:before{content:\"\\f150\"}i.icon.toggle.left:before{content:\"\\f191\"}i.icon.toggle.right:before{content:\"\\f152\"}i.icon.toggle.up:before{content:\"\\f151\"}i.icon.translate:before{content:\"\\f1ab\"}i.icon.travel:before{content:\"\\f0b1\"}i.icon.treatment:before{content:\"\\f0f1\"}i.icon.triangle.down:before{content:\"\\f0d7\"}i.icon.triangle.left:before{content:\"\\f0d9\"}i.icon.triangle.right:before{content:\"\\f0da\"}i.icon.triangle.up:before{content:\"\\f0d8\"}i.icon.try:before{content:\"\\f195\"}i.icon.unhide:before{content:\"\\f06e\"}i.icon.unlinkify:before{content:\"\\f127\"}i.icon.unmute:before{content:\"\\f130\"}i.icon.usd:before{content:\"\\f155\"}i.icon.user.cancel:before{content:\"\\f235\"}i.icon.user.close:before{content:\"\\f235\"}i.icon.user.delete:before{content:\"\\f235\"}i.icon.user.x:before{content:\"\\f235\"}i.icon.vcard:before{content:\"\\f2bb\"}i.icon.video.camera:before{content:\"\\f03d\"}i.icon.video.play:before{content:\"\\f144\"}i.icon.visa.card:before{content:\"\\f1f0\"}i.icon.visa:before{content:\"\\f1f0\"}i.icon.volume.control.phone:before{content:\"\\f2a0\"}i.icon.wait:before{content:\"\\f017\"}i.icon.warning.circle:before{content:\"\\f06a\"}i.icon.warning.sign:before{content:\"\\f071\"}i.icon.warning:before{content:\"\\f12a\"}i.icon.wechat:before{content:\"\\f1d7\"}i.icon.wi-fi:before{content:\"\\f1eb\"}i.icon.wikipedia:before{content:\"\\f266\"}i.icon.winner:before{content:\"\\f091\"}i.icon.wizard:before{content:\"\\f0d0\"}i.icon.woman:before{content:\"\\f221\"}i.icon.won:before{content:\"\\f159\"}i.icon.wordpress.beginner:before{content:\"\\f297\"}i.icon.wordpress.forms:before{content:\"\\f298\"}i.icon.world:before{content:\"\\f0ac\"}i.icon.write.square:before{content:\"\\f14b\"}i.icon.x:before{content:\"\\f00d\"}i.icon.yc:before{content:\"\\f23b\"}i.icon.ycombinator:before{content:\"\\f23b\"}i.icon.yen:before{content:\"\\f157\"}i.icon.zip:before{content:\"\\f187\"}i.icon.zoom-in:before{content:\"\\f00e\"}i.icon.zoom-out:before{content:\"\\f010\"}i.icon.zoom:before{content:\"\\f00e\"}i.icon.bitbucket.square:before{content:\"\\f171\"}i.icon.checkmark.box:before{content:\"\\f14a\"}i.icon.circle.thin:before{content:\"\\f111\"}i.icon.cloud.download:before{content:\"\\f381\"}i.icon.cloud.upload:before{content:\"\\f382\"}i.icon.compose:before{content:\"\\f303\"}i.icon.conversation:before{content:\"\\f086\"}i.icon.credit.card.alternative:before{content:\"\\f09d\"}i.icon.currency:before{content:\"\\f3d1\"}i.icon.dashboard:before{content:\"\\f3fd\"}i.icon.diamond:before{content:\"\\f3a5\"}i.icon.disk:before{content:\"\\f0a0\"}i.icon.exchange:before{content:\"\\f362\"}i.icon.external.share:before{content:\"\\f14d\"}i.icon.external.square:before{content:\"\\f360\"}i.icon.external:before{content:\"\\f35d\"}i.icon.facebook.official:before{content:\"\\f082\"}i.icon.food:before{content:\"\\f2e7\"}i.icon.hourglass.zero:before{content:\"\\f253\"}i.icon.level.down:before{content:\"\\f3be\"}i.icon.level.up:before{content:\"\\f3bf\"}i.icon.logout:before{content:\"\\f2f5\"}i.icon.meanpath:before{content:\"\\f0c8\"}i.icon.money:before{content:\"\\f3d1\"}i.icon.move:before{content:\"\\f0b2\"}i.icon.pencil:before{content:\"\\f303\"}i.icon.protect:before{content:\"\\f023\"}i.icon.radio:before{content:\"\\f192\"}i.icon.remove.bookmark:before{content:\"\\f02e\"}i.icon.resize.horizontal:before{content:\"\\f337\"}i.icon.resize.vertical:before{content:\"\\f338\"}i.icon.sign-in:before{content:\"\\f2f6\"}i.icon.sign-out:before{content:\"\\f2f5\"}i.icon.spoon:before{content:\"\\f2e5\"}i.icon.star.half.empty:before{content:\"\\f089\"}i.icon.star.half.full:before{content:\"\\f089\"}i.icon.ticket:before{content:\"\\f3ff\"}i.icon.times.rectangle:before{content:\"\\f410\"}i.icon.write:before{content:\"\\f303\"}i.icon.youtube.play:before{content:\"\\f167\"}@font-face{font-family:outline-icons;src:url(themes/default/assets/fonts/outline-icons.eot);src:url(themes/default/assets/fonts/outline-icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/outline-icons.woff2) format('woff2'),url(themes/default/assets/fonts/outline-icons.woff) format('woff'),url(themes/default/assets/fonts/outline-icons.ttf) format('truetype'),url(themes/default/assets/fonts/outline-icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.outline{font-family:outline-icons}i.icon.address.book.outline:before{content:\"\\f2b9\"}i.icon.address.card.outline:before{content:\"\\f2bb\"}i.icon.arrow.alternate.circle.down.outline:before{content:\"\\f358\"}i.icon.arrow.alternate.circle.left.outline:before{content:\"\\f359\"}i.icon.arrow.alternate.circle.right.outline:before{content:\"\\f35a\"}i.icon.arrow.alternate.circle.up.outline:before{content:\"\\f35b\"}i.icon.bell.outline:before{content:\"\\f0f3\"}i.icon.bell.slash.outline:before{content:\"\\f1f6\"}i.icon.bookmark.outline:before{content:\"\\f02e\"}i.icon.building.outline:before{content:\"\\f1ad\"}i.icon.calendar.outline:before{content:\"\\f133\"}i.icon.calendar.alternate.outline:before{content:\"\\f073\"}i.icon.calendar.check.outline:before{content:\"\\f274\"}i.icon.calendar.minus.outline:before{content:\"\\f272\"}i.icon.calendar.plus.outline:before{content:\"\\f271\"}i.icon.calendar.times.outline:before{content:\"\\f273\"}i.icon.caret.square.down.outline:before{content:\"\\f150\"}i.icon.caret.square.left.outline:before{content:\"\\f191\"}i.icon.caret.square.right.outline:before{content:\"\\f152\"}i.icon.caret.square.up.outline:before{content:\"\\f151\"}i.icon.chart.bar.outline:before{content:\"\\f080\"}i.icon.check.circle.outline:before{content:\"\\f058\"}i.icon.check.square.outline:before{content:\"\\f14a\"}i.icon.circle.outline:before{content:\"\\f111\"}i.icon.clipboard.outline:before{content:\"\\f328\"}i.icon.clock.outline:before{content:\"\\f017\"}i.icon.clone.outline:before{content:\"\\f24d\"}i.icon.closed.captioning.outline:before{content:\"\\f20a\"}i.icon.comment.outline:before{content:\"\\f075\"}i.icon.comment.alternate.outline:before{content:\"\\f27a\"}i.icon.comments.outline:before{content:\"\\f086\"}i.icon.compass.outline:before{content:\"\\f14e\"}i.icon.copy.outline:before{content:\"\\f0c5\"}i.icon.copyright.outline:before{content:\"\\f1f9\"}i.icon.credit.card.outline:before{content:\"\\f09d\"}i.icon.dot.circle.outline:before{content:\"\\f192\"}i.icon.edit.outline:before{content:\"\\f044\"}i.icon.envelope.outline:before{content:\"\\f0e0\"}i.icon.envelope.open.outline:before{content:\"\\f2b6\"}i.icon.eye.slash.outline:before{content:\"\\f070\"}i.icon.file.outline:before{content:\"\\f15b\"}i.icon.file.alternate.outline:before{content:\"\\f15c\"}i.icon.file.archive.outline:before{content:\"\\f1c6\"}i.icon.file.audio.outline:before{content:\"\\f1c7\"}i.icon.file.code.outline:before{content:\"\\f1c9\"}i.icon.file.excel.outline:before{content:\"\\f1c3\"}i.icon.file.image.outline:before{content:\"\\f1c5\"}i.icon.file.pdf.outline:before{content:\"\\f1c1\"}i.icon.file.powerpoint.outline:before{content:\"\\f1c4\"}i.icon.file.video.outline:before{content:\"\\f1c8\"}i.icon.file.word.outline:before{content:\"\\f1c2\"}i.icon.flag.outline:before{content:\"\\f024\"}i.icon.folder.outline:before{content:\"\\f07b\"}i.icon.folder.open.outline:before{content:\"\\f07c\"}i.icon.frown.outline:before{content:\"\\f119\"}i.icon.futbol.outline:before{content:\"\\f1e3\"}i.icon.gem.outline:before{content:\"\\f3a5\"}i.icon.hand.lizard.outline:before{content:\"\\f258\"}i.icon.hand.paper.outline:before{content:\"\\f256\"}i.icon.hand.peace.outline:before{content:\"\\f25b\"}i.icon.hand.point.down.outline:before{content:\"\\f0a7\"}i.icon.hand.point.left.outline:before{content:\"\\f0a5\"}i.icon.hand.point.right.outline:before{content:\"\\f0a4\"}i.icon.hand.point.up.outline:before{content:\"\\f0a6\"}i.icon.hand.pointer.outline:before{content:\"\\f25a\"}i.icon.hand.rock.outline:before{content:\"\\f255\"}i.icon.hand.scissors.outline:before{content:\"\\f257\"}i.icon.hand.spock.outline:before{content:\"\\f259\"}i.icon.handshake.outline:before{content:\"\\f2b5\"}i.icon.hdd.outline:before{content:\"\\f0a0\"}i.icon.heart.outline:before{content:\"\\f004\"}i.icon.hospital.outline:before{content:\"\\f0f8\"}i.icon.hourglass.outline:before{content:\"\\f254\"}i.icon.id.badge.outline:before{content:\"\\f2c1\"}i.icon.id.card.outline:before{content:\"\\f2c2\"}i.icon.image.outline:before{content:\"\\f03e\"}i.icon.images.outline:before{content:\"\\f302\"}i.icon.keyboard.outline:before{content:\"\\f11c\"}i.icon.lemon.outline:before{content:\"\\f094\"}i.icon.life.ring.outline:before{content:\"\\f1cd\"}i.icon.lightbulb.outline:before{content:\"\\f0eb\"}i.icon.list.alternate.outline:before{content:\"\\f022\"}i.icon.map.outline:before{content:\"\\f279\"}i.icon.meh.outline:before{content:\"\\f11a\"}i.icon.minus.square.outline:before{content:\"\\f146\"}i.icon.money.bill.alternate.outline:before{content:\"\\f3d1\"}i.icon.moon.outline:before{content:\"\\f186\"}i.icon.newspaper.outline:before{content:\"\\f1ea\"}i.icon.object.group.outline:before{content:\"\\f247\"}i.icon.object.ungroup.outline:before{content:\"\\f248\"}i.icon.paper.plane.outline:before{content:\"\\f1d8\"}i.icon.pause.circle.outline:before{content:\"\\f28b\"}i.icon.play.circle.outline:before{content:\"\\f144\"}i.icon.plus.square.outline:before{content:\"\\f0fe\"}i.icon.question.circle.outline:before{content:\"\\f059\"}i.icon.registered.outline:before{content:\"\\f25d\"}i.icon.save.outline:before{content:\"\\f0c7\"}i.icon.share.square.outline:before{content:\"\\f14d\"}i.icon.smile.outline:before{content:\"\\f118\"}i.icon.snowflake.outline:before{content:\"\\f2dc\"}i.icon.square.outline:before{content:\"\\f0c8\"}i.icon.star.outline:before{content:\"\\f005\"}i.icon.star.half.outline:before{content:\"\\f089\"}i.icon.sticky.note.outline:before{content:\"\\f249\"}i.icon.stop.circle.outline:before{content:\"\\f28d\"}i.icon.sun.outline:before{content:\"\\f185\"}i.icon.thumbs.down.outline:before{content:\"\\f165\"}i.icon.thumbs.up.outline:before{content:\"\\f164\"}i.icon.times.circle.outline:before{content:\"\\f057\"}i.icon.trash.alternate.outline:before{content:\"\\f2ed\"}i.icon.user.outline:before{content:\"\\f007\"}i.icon.user.circle.outline:before{content:\"\\f2bd\"}i.icon.window.close.outline:before{content:\"\\f410\"}i.icon.window.maximize.outline:before{content:\"\\f2d0\"}i.icon.window.minimize.outline:before{content:\"\\f2d1\"}i.icon.window.restore.outline:before{content:\"\\f2d2\"}i.icon.disk.outline:before{content:\"\\f0a0\"}i.icon.heart.empty,i.icon.star.empty{font-family:outline-icons}i.icon.heart.empty:before{content:\"\\f004\"}i.icon.star.empty:before{content:\"\\f089\"}@font-face{font-family:brand-icons;src:url(themes/default/assets/fonts/brand-icons.eot);src:url(themes/default/assets/fonts/brand-icons.eot?#iefix) format('embedded-opentype'),url(themes/default/assets/fonts/brand-icons.woff2) format('woff2'),url(themes/default/assets/fonts/brand-icons.woff) format('woff'),url(themes/default/assets/fonts/brand-icons.ttf) format('truetype'),url(themes/default/assets/fonts/brand-icons.svg#icons) format('svg');font-style:normal;font-weight:400;font-variant:normal;text-decoration:inherit;text-transform:none}i.icon.\\35 00px,i.icon.accessible.icon,i.icon.accusoft,i.icon.adn,i.icon.adversal,i.icon.affiliatetheme,i.icon.algolia,i.icon.amazon,i.icon.amazon.pay,i.icon.amilia,i.icon.android,i.icon.angellist,i.icon.angrycreative,i.icon.angular,i.icon.app.store,i.icon.app.store.ios,i.icon.apper,i.icon.apple,i.icon.apple.pay,i.icon.asymmetrik,i.icon.audible,i.icon.autoprefixer,i.icon.avianex,i.icon.aviato,i.icon.aws,i.icon.bandcamp,i.icon.behance,i.icon.behance.square,i.icon.bimobject,i.icon.bitbucket,i.icon.bitcoin,i.icon.bity,i.icon.black.tie,i.icon.blackberry,i.icon.blogger,i.icon.blogger.b,i.icon.bluetooth,i.icon.bluetooth.b,i.icon.btc,i.icon.buromobelexperte,i.icon.buysellads,i.icon.cc.amazon.pay,i.icon.cc.amex,i.icon.cc.apple.pay,i.icon.cc.diners.club,i.icon.cc.discover,i.icon.cc.jcb,i.icon.cc.mastercard,i.icon.cc.paypal,i.icon.cc.stripe,i.icon.cc.visa,i.icon.centercode,i.icon.chrome,i.icon.cloudscale,i.icon.cloudsmith,i.icon.cloudversify,i.icon.codepen,i.icon.codiepie,i.icon.connectdevelop,i.icon.contao,i.icon.cpanel,i.icon.creative.commons,i.icon.css3,i.icon.css3.alternate,i.icon.cuttlefish,i.icon.d.and.d,i.icon.dashcube,i.icon.delicious,i.icon.deploydog,i.icon.deskpro,i.icon.deviantart,i.icon.digg,i.icon.digital.ocean,i.icon.discord,i.icon.discourse,i.icon.dochub,i.icon.docker,i.icon.draft2digital,i.icon.dribbble,i.icon.dribbble.square,i.icon.dropbox,i.icon.drupal,i.icon.dyalog,i.icon.earlybirds,i.icon.edge,i.icon.elementor,i.icon.ember,i.icon.empire,i.icon.envira,i.icon.erlang,i.icon.ethereum,i.icon.etsy,i.icon.expeditedssl,i.icon.facebook,i.icon.facebook.f,i.icon.facebook.messenger,i.icon.facebook.square,i.icon.firefox,i.icon.first.order,i.icon.firstdraft,i.icon.flickr,i.icon.flipboard,i.icon.fly,i.icon.font.awesome,i.icon.font.awesome.alternate,i.icon.font.awesome.flag,i.icon.fonticons,i.icon.fonticons.fi,i.icon.fort.awesome,i.icon.fort.awesome.alternate,i.icon.forumbee,i.icon.foursquare,i.icon.free.code.camp,i.icon.freebsd,i.icon.get.pocket,i.icon.gg,i.icon.gg.circle,i.icon.git,i.icon.git.square,i.icon.github,i.icon.github.alternate,i.icon.github.square,i.icon.gitkraken,i.icon.gitlab,i.icon.gitter,i.icon.glide,i.icon.glide.g,i.icon.gofore,i.icon.goodreads,i.icon.goodreads.g,i.icon.google,i.icon.google.drive,i.icon.google.play,i.icon.google.plus,i.icon.google.plus.g,i.icon.google.plus.square,i.icon.google.wallet,i.icon.gratipay,i.icon.grav,i.icon.gripfire,i.icon.grunt,i.icon.gulp,i.icon.hacker.news,i.icon.hacker.news.square,i.icon.hips,i.icon.hire.a.helper,i.icon.hooli,i.icon.hotjar,i.icon.houzz,i.icon.html5,i.icon.hubspot,i.icon.imdb,i.icon.instagram,i.icon.internet.explorer,i.icon.ioxhost,i.icon.itunes,i.icon.itunes.note,i.icon.jenkins,i.icon.joget,i.icon.joomla,i.icon.js,i.icon.js.square,i.icon.jsfiddle,i.icon.keycdn,i.icon.kickstarter,i.icon.kickstarter.k,i.icon.korvue,i.icon.laravel,i.icon.lastfm,i.icon.lastfm.square,i.icon.leanpub,i.icon.less,i.icon.linechat,i.icon.linkedin,i.icon.linkedin.alternate,i.icon.linkedin.in,i.icon.linode,i.icon.linux,i.icon.lyft,i.icon.magento,i.icon.maxcdn,i.icon.medapps,i.icon.medium,i.icon.medium.m,i.icon.medrt,i.icon.meetup,i.icon.microsoft,i.icon.mix,i.icon.mixcloud,i.icon.mizuni,i.icon.modx,i.icon.monero,i.icon.napster,i.icon.nintendo.switch,i.icon.node,i.icon.node.js,i.icon.npm,i.icon.ns8,i.icon.nutritionix,i.icon.odnoklassniki,i.icon.odnoklassniki.square,i.icon.opencart,i.icon.openid,i.icon.opera,i.icon.optin.monster,i.icon.osi,i.icon.page4,i.icon.pagelines,i.icon.palfed,i.icon.patreon,i.icon.paypal,i.icon.periscope,i.icon.phabricator,i.icon.phoenix.framework,i.icon.php,i.icon.pied.piper,i.icon.pied.piper.alternate,i.icon.pied.piper.pp,i.icon.pinterest,i.icon.pinterest.p,i.icon.pinterest.square,i.icon.playstation,i.icon.product.hunt,i.icon.pushed,i.icon.python,i.icon.qq,i.icon.quinscape,i.icon.quora,i.icon.ravelry,i.icon.react,i.icon.rebel,i.icon.reddit,i.icon.reddit.alien,i.icon.reddit.square,i.icon.redriver,i.icon.rendact,i.icon.renren,i.icon.replyd,i.icon.resolving,i.icon.rocketchat,i.icon.rockrms,i.icon.safari,i.icon.sass,i.icon.schlix,i.icon.scribd,i.icon.searchengin,i.icon.sellcast,i.icon.sellsy,i.icon.servicestack,i.icon.shirtsinbulk,i.icon.simplybuilt,i.icon.sistrix,i.icon.skyatlas,i.icon.skype,i.icon.slack,i.icon.slack.hash,i.icon.slideshare,i.icon.snapchat,i.icon.snapchat.ghost,i.icon.snapchat.square,i.icon.soundcloud,i.icon.speakap,i.icon.spotify,i.icon.stack.exchange,i.icon.stack.overflow,i.icon.staylinked,i.icon.steam,i.icon.steam.square,i.icon.steam.symbol,i.icon.sticker.mule,i.icon.strava,i.icon.stripe,i.icon.stripe.s,i.icon.studiovinari,i.icon.stumbleupon,i.icon.stumbleupon.circle,i.icon.superpowers,i.icon.supple,i.icon.telegram,i.icon.telegram.plane,i.icon.tencent.weibo,i.icon.themeisle,i.icon.trello,i.icon.tripadvisor,i.icon.tumblr,i.icon.tumblr.square,i.icon.twitch,i.icon.twitter,i.icon.twitter.square,i.icon.typo3,i.icon.uber,i.icon.uikit,i.icon.uniregistry,i.icon.untappd,i.icon.usb,i.icon.ussunnah,i.icon.vaadin,i.icon.viacoin,i.icon.viadeo,i.icon.viadeo.square,i.icon.viber,i.icon.vimeo,i.icon.vimeo.square,i.icon.vimeo.v,i.icon.vine,i.icon.vk,i.icon.vnv,i.icon.vuejs,i.icon.wechat,i.icon.weibo,i.icon.weixin,i.icon.whatsapp,i.icon.whatsapp.square,i.icon.whmcs,i.icon.wikipedia.w,i.icon.windows,i.icon.wordpress,i.icon.wordpress.simple,i.icon.wpbeginner,i.icon.wpexplorer,i.icon.wpforms,i.icon.xbox,i.icon.xing,i.icon.xing.square,i.icon.y.combinator,i.icon.yahoo,i.icon.yandex,i.icon.yandex.international,i.icon.yelp,i.icon.yoast,i.icon.youtube,i.icon.youtube.square{font-family:brand-icons}/*!\n * # Semantic UI 2.4.0 - Image\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.image{position:relative;display:inline-block;vertical-align:middle;max-width:100%;background-color:transparent}img.ui.image{display:block}.ui.image img,.ui.image svg{display:block;max-width:100%;height:auto}.ui.hidden.image,.ui.hidden.images{display:none}.ui.hidden.transition.image,.ui.hidden.transition.images{display:block;visibility:hidden}.ui.images>.hidden.transition{display:inline-block;visibility:hidden}.ui.disabled.image,.ui.disabled.images{cursor:default;opacity:.45}.ui.inline.image,.ui.inline.image img,.ui.inline.image svg{display:inline-block}.ui.top.aligned.image,.ui.top.aligned.image img,.ui.top.aligned.image svg,.ui.top.aligned.images .image{display:inline-block;vertical-align:top}.ui.middle.aligned.image,.ui.middle.aligned.image img,.ui.middle.aligned.image svg,.ui.middle.aligned.images .image{display:inline-block;vertical-align:middle}.ui.bottom.aligned.image,.ui.bottom.aligned.image img,.ui.bottom.aligned.image svg,.ui.bottom.aligned.images .image{display:inline-block;vertical-align:bottom}.ui.rounded.image,.ui.rounded.image>*,.ui.rounded.images .image,.ui.rounded.images .image>*{border-radius:.3125em}.ui.bordered.image img,.ui.bordered.image svg,.ui.bordered.images .image,.ui.bordered.images img,.ui.bordered.images svg,img.ui.bordered.image{border:1px solid rgba(0,0,0,.1)}.ui.circular.image,.ui.circular.images{overflow:hidden}.ui.circular.image,.ui.circular.image>*,.ui.circular.images .image,.ui.circular.images .image>*{border-radius:500rem}.ui.fluid.image,.ui.fluid.image img,.ui.fluid.image svg,.ui.fluid.images,.ui.fluid.images img,.ui.fluid.images svg{display:block;width:100%;height:auto}.ui.avatar.image,.ui.avatar.image img,.ui.avatar.image svg,.ui.avatar.images .image,.ui.avatar.images img,.ui.avatar.images svg{margin-right:.25em;display:inline-block;width:2em;height:2em;border-radius:500rem}.ui.spaced.image{display:inline-block!important;margin-left:.5em;margin-right:.5em}.ui[class*=\"left spaced\"].image{margin-left:.5em;margin-right:0}.ui[class*=\"right spaced\"].image{margin-left:0;margin-right:.5em}.ui.floated.image,.ui.floated.images{float:left;margin-right:1em;margin-bottom:1em}.ui.right.floated.image,.ui.right.floated.images{float:right;margin-right:0;margin-bottom:1em;margin-left:1em}.ui.floated.image:last-child,.ui.floated.images:last-child{margin-bottom:0}.ui.centered.image,.ui.centered.images{margin-left:auto;margin-right:auto}.ui.mini.image,.ui.mini.images .image,.ui.mini.images img,.ui.mini.images svg{width:35px;height:auto;font-size:.78571429rem}.ui.tiny.image,.ui.tiny.images .image,.ui.tiny.images img,.ui.tiny.images svg{width:80px;height:auto;font-size:.85714286rem}.ui.small.image,.ui.small.images .image,.ui.small.images img,.ui.small.images svg{width:150px;height:auto;font-size:.92857143rem}.ui.medium.image,.ui.medium.images .image,.ui.medium.images img,.ui.medium.images svg{width:300px;height:auto;font-size:1rem}.ui.large.image,.ui.large.images .image,.ui.large.images img,.ui.large.images svg{width:450px;height:auto;font-size:1.14285714rem}.ui.big.image,.ui.big.images .image,.ui.big.images img,.ui.big.images svg{width:600px;height:auto;font-size:1.28571429rem}.ui.huge.image,.ui.huge.images .image,.ui.huge.images img,.ui.huge.images svg{width:800px;height:auto;font-size:1.42857143rem}.ui.massive.image,.ui.massive.images .image,.ui.massive.images img,.ui.massive.images svg{width:960px;height:auto;font-size:1.71428571rem}.ui.images{font-size:0;margin:0 -.25rem 0}.ui.images .image,.ui.images>img,.ui.images>svg{display:inline-block;margin:0 .25rem .5rem}/*!\n * # Semantic UI 2.4.0 - Input\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.input{position:relative;font-weight:400;font-style:normal;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;color:rgba(0,0,0,.87)}.ui.input>input{margin:0;max-width:100%;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);text-align:left;line-height:1.21428571em;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;padding:.67857143em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:border-color .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,border-color .1s ease;transition:box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;-webkit-box-shadow:none;box-shadow:none}.ui.input>input::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.input>input::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.input>input:-ms-input-placeholder{color:rgba(191,191,191,.87)}.ui.disabled.input,.ui.input:not(.disabled) input[disabled]{opacity:.45}.ui.disabled.input>input,.ui.input:not(.disabled) input[disabled]{pointer-events:none}.ui.input.down input,.ui.input>input:active{border-color:rgba(0,0,0,.3);background:#fafafa;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.loading.loading.input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.loading.input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.input.focus>input,.ui.input>input:focus{border-color:#85b7d9;background:#fff;color:rgba(0,0,0,.8);-webkit-box-shadow:none;box-shadow:none}.ui.input.focus>input::-webkit-input-placeholder,.ui.input>input:focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input::-moz-placeholder,.ui.input>input:focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.input.focus>input:-ms-input-placeholder,.ui.input>input:focus:-ms-input-placeholder{color:rgba(115,115,115,.87)}.ui.input.error>input{background-color:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-box-shadow:none;box-shadow:none}.ui.input.error>input::-webkit-input-placeholder{color:#e7bdbc}.ui.input.error>input::-moz-placeholder{color:#e7bdbc}.ui.input.error>input:-ms-input-placeholder{color:#e7bdbc!important}.ui.input.error>input:focus::-webkit-input-placeholder{color:#da9796}.ui.input.error>input:focus::-moz-placeholder{color:#da9796}.ui.input.error>input:focus:-ms-input-placeholder{color:#da9796!important}.ui.transparent.input>input{border-color:transparent!important;background-color:transparent!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important}.ui.transparent.icon.input>i.icon{width:1.1em}.ui.transparent.icon.input>input{padding-left:0!important;padding-right:2em!important}.ui.transparent[class*=\"left icon\"].input>input{padding-left:2em!important;padding-right:0!important}.ui.transparent.inverted.input{color:#fff}.ui.transparent.inverted.input>input{color:inherit}.ui.transparent.inverted.input>input::-webkit-input-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input::-moz-placeholder{color:rgba(255,255,255,.5)}.ui.transparent.inverted.input>input:-ms-input-placeholder{color:rgba(255,255,255,.5)}.ui.icon.input>i.icon{cursor:default;position:absolute;line-height:1;text-align:center;top:0;right:0;margin:0;height:100%;width:2.67142857em;opacity:.5;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.ui.icon.input>i.icon:not(.link){pointer-events:none}.ui.icon.input>input{padding-right:2.67142857em!important}.ui.icon.input>i.icon:after,.ui.icon.input>i.icon:before{left:0;position:absolute;text-align:center;top:50%;width:100%;margin-top:-.5em}.ui.icon.input>i.link.icon{cursor:pointer}.ui.icon.input>i.circular.icon{top:.35em;right:.5em}.ui[class*=\"left icon\"].input>i.icon{right:auto;left:1px;border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"left icon\"].input>i.circular.icon{right:auto;left:.5em}.ui[class*=\"left icon\"].input>input{padding-left:2.67142857em!important;padding-right:1em!important}.ui.icon.input>input:focus~i.icon{opacity:1}.ui.labeled.input>.label{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;margin:0;font-size:1em}.ui.labeled.input>.label:not(.corner){padding-top:.78571429em;padding-bottom:.78571429em}.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child+input{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:transparent}.ui.labeled.input:not([class*=\"corner labeled\"]) .label:first-child+input:focus{border-left-color:#85b7d9}.ui[class*=\"right labeled\"].input>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui[class*=\"right labeled\"].input>input+.label{border-top-left-radius:0;border-bottom-left-radius:0}.ui[class*=\"right labeled\"].input>input:focus{border-right-color:#85b7d9!important}.ui.labeled.input .corner.label{top:1px;right:1px;font-size:.64285714em;border-radius:0 .28571429rem 0 0}.ui[class*=\"corner labeled\"]:not([class*=\"left corner labeled\"]).labeled.input>input{padding-right:2.5em!important}.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"])>input{padding-right:3.25em!important}.ui[class*=\"corner labeled\"].icon.input:not([class*=\"left corner labeled\"])>.icon{margin-right:1.25em}.ui[class*=\"left corner labeled\"].labeled.input>input{padding-left:2.5em!important}.ui[class*=\"left corner labeled\"].icon.input>input{padding-left:3.25em!important}.ui[class*=\"left corner labeled\"].icon.input>.icon{margin-left:1.25em}.ui.input>.ui.corner.label{top:1px;right:1px}.ui.input>.ui.left.corner.label{right:auto;left:1px}.ui.action.input>.button,.ui.action.input>.buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.ui.action.input>.button,.ui.action.input>.buttons>.button{padding-top:.78571429em;padding-bottom:.78571429em;margin:0}.ui.action.input:not([class*=\"left action\"])>input{border-top-right-radius:0!important;border-bottom-right-radius:0!important;border-right-color:transparent!important}.ui.action.input:not([class*=\"left action\"])>.button:not(:first-child),.ui.action.input:not([class*=\"left action\"])>.buttons:not(:first-child)>.button,.ui.action.input:not([class*=\"left action\"])>.dropdown:not(:first-child){border-radius:0}.ui.action.input:not([class*=\"left action\"])>.button:last-child,.ui.action.input:not([class*=\"left action\"])>.buttons:last-child>.button,.ui.action.input:not([class*=\"left action\"])>.dropdown:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.action.input:not([class*=\"left action\"])>input:focus{border-right-color:#85b7d9!important}.ui[class*=\"left action\"].input>input{border-top-left-radius:0!important;border-bottom-left-radius:0!important;border-left-color:transparent!important}.ui[class*=\"left action\"].input>.button,.ui[class*=\"left action\"].input>.buttons>.button,.ui[class*=\"left action\"].input>.dropdown{border-radius:0}.ui[class*=\"left action\"].input>.button:first-child,.ui[class*=\"left action\"].input>.buttons:first-child>.button,.ui[class*=\"left action\"].input>.dropdown:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"left action\"].input>input:focus{border-left-color:#85b7d9!important}.ui.inverted.input>input{border:none}.ui.fluid.input{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.fluid.input>input{width:0!important}.ui.mini.input{font-size:.78571429em}.ui.small.input{font-size:.92857143em}.ui.input{font-size:1em}.ui.large.input{font-size:1.14285714em}.ui.big.input{font-size:1.28571429em}.ui.huge.input{font-size:1.42857143em}.ui.massive.input{font-size:1.71428571em}/*!\n * # Semantic UI 2.4.0 - Label\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.label{display:inline-block;line-height:1;vertical-align:baseline;margin:0 .14285714em;background-color:#e8e8e8;background-image:none;padding:.5833em .833em;color:rgba(0,0,0,.6);text-transform:none;font-weight:700;border:0 solid transparent;border-radius:.28571429rem;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label:first-child{margin-left:0}.ui.label:last-child{margin-right:0}a.ui.label{cursor:pointer}.ui.label>a{cursor:pointer;color:inherit;opacity:.5;-webkit-transition:.1s opacity ease;transition:.1s opacity ease}.ui.label>a:hover{opacity:1}.ui.label>img{width:auto!important;vertical-align:middle;height:2.1666em!important}.ui.label>.icon{width:auto;margin:0 .75em 0 0}.ui.label>.detail{display:inline-block;vertical-align:top;font-weight:700;margin-left:1em;opacity:.8}.ui.label>.detail .icon{margin:0 .25em 0 0}.ui.label>.close.icon,.ui.label>.delete.icon{cursor:pointer;margin-right:0;margin-left:.5em;font-size:.92857143em;opacity:.5;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.label>.delete.icon:hover{opacity:1}.ui.labels>.label{margin:0 .5em .5em 0}.ui.header>.ui.label{margin-top:-.29165em}.ui.attached.segment>.ui.top.left.attached.label,.ui.bottom.attached.segment>.ui.top.left.attached.label{border-top-left-radius:0}.ui.attached.segment>.ui.top.right.attached.label,.ui.bottom.attached.segment>.ui.top.right.attached.label{border-top-right-radius:0}.ui.top.attached.segment>.ui.bottom.left.attached.label{border-bottom-left-radius:0}.ui.top.attached.segment>.ui.bottom.right.attached.label{border-bottom-right-radius:0}.ui.top.attached.label+[class*=\"right floated\"]+*,.ui.top.attached.label:first-child+:not(.attached){margin-top:2rem!important}.ui.bottom.attached.label:first-child~:last-child:not(.attached){margin-top:0;margin-bottom:2rem!important}.ui.image.label{width:auto!important;margin-top:0;margin-bottom:0;max-width:9999px;vertical-align:baseline;text-transform:none;background:#e8e8e8;padding:.5833em .833em .5833em .5em;border-radius:.28571429rem;-webkit-box-shadow:none;box-shadow:none}.ui.image.label img{display:inline-block;vertical-align:top;height:2.1666em;margin:-.5833em .5em -.5833em -.5em;border-radius:.28571429rem 0 0 .28571429rem}.ui.image.label .detail{background:rgba(0,0,0,.1);margin:-.5833em -.833em -.5833em .5em;padding:.5833em .833em;border-radius:0 .28571429rem .28571429rem 0}.ui.tag.label,.ui.tag.labels .label{margin-left:1em;position:relative;padding-left:1.5em;padding-right:1.5em;border-radius:0 .28571429rem .28571429rem 0;-webkit-transition:none;transition:none}.ui.tag.label:before,.ui.tag.labels .label:before{position:absolute;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg);top:50%;right:100%;content:'';background-color:inherit;background-image:none;width:1.56em;height:1.56em;-webkit-transition:none;transition:none}.ui.tag.label:after,.ui.tag.labels .label:after{position:absolute;content:'';top:50%;left:-.25em;margin-top:-.25em;background-color:#fff!important;width:.5em;height:.5em;-webkit-box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);box-shadow:0 -1px 1px 0 rgba(0,0,0,.3);border-radius:500rem}.ui.corner.label{position:absolute;top:0;right:0;margin:0;padding:0;text-align:center;border-color:#e8e8e8;width:4em;height:4em;z-index:1;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label{background-color:transparent!important}.ui.corner.label:after{position:absolute;content:\"\";right:0;top:0;z-index:-1;width:0;height:0;background-color:transparent!important;border-top:0 solid transparent;border-right:4em solid transparent;border-bottom:4em solid transparent;border-left:0 solid transparent;border-right-color:inherit;-webkit-transition:border-color .1s ease;transition:border-color .1s ease}.ui.corner.label .icon{cursor:default;position:relative;top:.64285714em;left:.78571429em;font-size:1.14285714em;margin:0}.ui.left.corner.label,.ui.left.corner.label:after{right:auto;left:0}.ui.left.corner.label:after{border-top:4em solid transparent;border-right:4em solid transparent;border-bottom:0 solid transparent;border-left:0 solid transparent;border-top-color:inherit}.ui.left.corner.label .icon{left:-.78571429em}.ui.segment>.ui.corner.label{top:-1px;right:-1px}.ui.segment>.ui.left.corner.label{right:auto;left:-1px}.ui.ribbon.label{position:relative;margin:0;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;border-radius:0 .28571429rem .28571429rem 0;border-color:rgba(0,0,0,.15)}.ui.ribbon.label:after{position:absolute;content:'';top:100%;left:0;background-color:transparent!important;border-style:solid;border-width:0 1.2em 1.2em 0;border-color:transparent;border-right-color:inherit;width:0;height:0}.ui.ribbon.label{left:calc(-1rem - 1.2em);margin-right:-1.2em;padding-left:calc(1rem + 1.2em);padding-right:1.2em}.ui[class*=\"right ribbon\"].label{left:calc(100% + 1rem + 1.2em);padding-left:1.2em;padding-right:calc(1rem + 1.2em)}.ui[class*=\"right ribbon\"].label{text-align:left;-webkit-transform:translateX(-100%);transform:translateX(-100%);border-radius:.28571429rem 0 0 .28571429rem}.ui[class*=\"right ribbon\"].label:after{left:auto;right:0;border-style:solid;border-width:1.2em 1.2em 0 0;border-color:transparent;border-top-color:inherit}.ui.card .image>.ribbon.label,.ui.image>.ribbon.label{position:absolute;top:1rem}.ui.card .image>.ui.ribbon.label,.ui.image>.ui.ribbon.label{left:calc(.05rem - 1.2em)}.ui.card .image>.ui[class*=\"right ribbon\"].label,.ui.image>.ui[class*=\"right ribbon\"].label{left:calc(100% + -.05rem + 1.2em);padding-left:.833em}.ui.table td>.ui.ribbon.label{left:calc(-.78571429em - 1.2em)}.ui.table td>.ui[class*=\"right ribbon\"].label{left:calc(100% + .78571429em + 1.2em);padding-left:.833em}.ui.attached.label,.ui[class*=\"top attached\"].label{width:100%;position:absolute;margin:0;top:0;left:0;padding:.75em 1em;border-radius:.21428571rem .21428571rem 0 0}.ui[class*=\"bottom attached\"].label{top:auto;bottom:0;border-radius:0 0 .21428571rem .21428571rem}.ui[class*=\"top left attached\"].label{width:auto;margin-top:0!important;border-radius:.21428571rem 0 .28571429rem 0}.ui[class*=\"top right attached\"].label{width:auto;left:auto;right:0;border-radius:0 .21428571rem 0 .28571429rem}.ui[class*=\"bottom left attached\"].label{width:auto;top:auto;bottom:0;border-radius:0 .28571429rem 0 .21428571rem}.ui[class*=\"bottom right attached\"].label{top:auto;bottom:0;left:auto;right:0;width:auto;border-radius:.28571429rem 0 .21428571rem 0}.ui.label.disabled{opacity:.5}a.ui.label:hover,a.ui.labels .label:hover{background-color:#e0e0e0;border-color:#e0e0e0;background-image:none;color:rgba(0,0,0,.8)}.ui.labels a.label:hover:before,a.ui.label:hover:before{color:rgba(0,0,0,.8)}.ui.active.label{background-color:#d0d0d0;border-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}.ui.active.label:before{background-color:#d0d0d0;background-image:none;color:rgba(0,0,0,.95)}a.ui.active.label:hover,a.ui.labels .active.label:hover{background-color:#c8c8c8;border-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.labels a.active.label:ActiveHover:before,a.ui.active.label:ActiveHover:before{background-color:#c8c8c8;background-image:none;color:rgba(0,0,0,.95)}.ui.label.visible:not(.dropdown),.ui.labels.visible .label{display:inline-block!important}.ui.label.hidden,.ui.labels.hidden .label{display:none!important}.ui.red.label,.ui.red.labels .label{background-color:#db2828!important;border-color:#db2828!important;color:#fff!important}.ui.red.labels .label:hover,a.ui.red.label:hover{background-color:#d01919!important;border-color:#d01919!important;color:#fff!important}.ui.red.corner.label,.ui.red.corner.label:hover{background-color:transparent!important}.ui.red.ribbon.label{border-color:#b21e1e!important}.ui.basic.red.label{background:none #fff!important;color:#db2828!important;border-color:#db2828!important}.ui.basic.red.labels a.label:hover,a.ui.basic.red.label:hover{background-color:#fff!important;color:#d01919!important;border-color:#d01919!important}.ui.orange.label,.ui.orange.labels .label{background-color:#f2711c!important;border-color:#f2711c!important;color:#fff!important}.ui.orange.labels .label:hover,a.ui.orange.label:hover{background-color:#f26202!important;border-color:#f26202!important;color:#fff!important}.ui.orange.corner.label,.ui.orange.corner.label:hover{background-color:transparent!important}.ui.orange.ribbon.label{border-color:#cf590c!important}.ui.basic.orange.label{background:none #fff!important;color:#f2711c!important;border-color:#f2711c!important}.ui.basic.orange.labels a.label:hover,a.ui.basic.orange.label:hover{background-color:#fff!important;color:#f26202!important;border-color:#f26202!important}.ui.yellow.label,.ui.yellow.labels .label{background-color:#fbbd08!important;border-color:#fbbd08!important;color:#fff!important}.ui.yellow.labels .label:hover,a.ui.yellow.label:hover{background-color:#eaae00!important;border-color:#eaae00!important;color:#fff!important}.ui.yellow.corner.label,.ui.yellow.corner.label:hover{background-color:transparent!important}.ui.yellow.ribbon.label{border-color:#cd9903!important}.ui.basic.yellow.label{background:none #fff!important;color:#fbbd08!important;border-color:#fbbd08!important}.ui.basic.yellow.labels a.label:hover,a.ui.basic.yellow.label:hover{background-color:#fff!important;color:#eaae00!important;border-color:#eaae00!important}.ui.olive.label,.ui.olive.labels .label{background-color:#b5cc18!important;border-color:#b5cc18!important;color:#fff!important}.ui.olive.labels .label:hover,a.ui.olive.label:hover{background-color:#a7bd0d!important;border-color:#a7bd0d!important;color:#fff!important}.ui.olive.corner.label,.ui.olive.corner.label:hover{background-color:transparent!important}.ui.olive.ribbon.label{border-color:#198f35!important}.ui.basic.olive.label{background:none #fff!important;color:#b5cc18!important;border-color:#b5cc18!important}.ui.basic.olive.labels a.label:hover,a.ui.basic.olive.label:hover{background-color:#fff!important;color:#a7bd0d!important;border-color:#a7bd0d!important}.ui.green.label,.ui.green.labels .label{background-color:#21ba45!important;border-color:#21ba45!important;color:#fff!important}.ui.green.labels .label:hover,a.ui.green.label:hover{background-color:#16ab39!important;border-color:#16ab39!important;color:#fff!important}.ui.green.corner.label,.ui.green.corner.label:hover{background-color:transparent!important}.ui.green.ribbon.label{border-color:#198f35!important}.ui.basic.green.label{background:none #fff!important;color:#21ba45!important;border-color:#21ba45!important}.ui.basic.green.labels a.label:hover,a.ui.basic.green.label:hover{background-color:#fff!important;color:#16ab39!important;border-color:#16ab39!important}.ui.teal.label,.ui.teal.labels .label{background-color:#00b5ad!important;border-color:#00b5ad!important;color:#fff!important}.ui.teal.labels .label:hover,a.ui.teal.label:hover{background-color:#009c95!important;border-color:#009c95!important;color:#fff!important}.ui.teal.corner.label,.ui.teal.corner.label:hover{background-color:transparent!important}.ui.teal.ribbon.label{border-color:#00827c!important}.ui.basic.teal.label{background:none #fff!important;color:#00b5ad!important;border-color:#00b5ad!important}.ui.basic.teal.labels a.label:hover,a.ui.basic.teal.label:hover{background-color:#fff!important;color:#009c95!important;border-color:#009c95!important}.ui.blue.label,.ui.blue.labels .label{background-color:#2185d0!important;border-color:#2185d0!important;color:#fff!important}.ui.blue.labels .label:hover,a.ui.blue.label:hover{background-color:#1678c2!important;border-color:#1678c2!important;color:#fff!important}.ui.blue.corner.label,.ui.blue.corner.label:hover{background-color:transparent!important}.ui.blue.ribbon.label{border-color:#1a69a4!important}.ui.basic.blue.label{background:none #fff!important;color:#2185d0!important;border-color:#2185d0!important}.ui.basic.blue.labels a.label:hover,a.ui.basic.blue.label:hover{background-color:#fff!important;color:#1678c2!important;border-color:#1678c2!important}.ui.violet.label,.ui.violet.labels .label{background-color:#6435c9!important;border-color:#6435c9!important;color:#fff!important}.ui.violet.labels .label:hover,a.ui.violet.label:hover{background-color:#5829bb!important;border-color:#5829bb!important;color:#fff!important}.ui.violet.corner.label,.ui.violet.corner.label:hover{background-color:transparent!important}.ui.violet.ribbon.label{border-color:#502aa1!important}.ui.basic.violet.label{background:none #fff!important;color:#6435c9!important;border-color:#6435c9!important}.ui.basic.violet.labels a.label:hover,a.ui.basic.violet.label:hover{background-color:#fff!important;color:#5829bb!important;border-color:#5829bb!important}.ui.purple.label,.ui.purple.labels .label{background-color:#a333c8!important;border-color:#a333c8!important;color:#fff!important}.ui.purple.labels .label:hover,a.ui.purple.label:hover{background-color:#9627ba!important;border-color:#9627ba!important;color:#fff!important}.ui.purple.corner.label,.ui.purple.corner.label:hover{background-color:transparent!important}.ui.purple.ribbon.label{border-color:#82299f!important}.ui.basic.purple.label{background:none #fff!important;color:#a333c8!important;border-color:#a333c8!important}.ui.basic.purple.labels a.label:hover,a.ui.basic.purple.label:hover{background-color:#fff!important;color:#9627ba!important;border-color:#9627ba!important}.ui.pink.label,.ui.pink.labels .label{background-color:#e03997!important;border-color:#e03997!important;color:#fff!important}.ui.pink.labels .label:hover,a.ui.pink.label:hover{background-color:#e61a8d!important;border-color:#e61a8d!important;color:#fff!important}.ui.pink.corner.label,.ui.pink.corner.label:hover{background-color:transparent!important}.ui.pink.ribbon.label{border-color:#c71f7e!important}.ui.basic.pink.label{background:none #fff!important;color:#e03997!important;border-color:#e03997!important}.ui.basic.pink.labels a.label:hover,a.ui.basic.pink.label:hover{background-color:#fff!important;color:#e61a8d!important;border-color:#e61a8d!important}.ui.brown.label,.ui.brown.labels .label{background-color:#a5673f!important;border-color:#a5673f!important;color:#fff!important}.ui.brown.labels .label:hover,a.ui.brown.label:hover{background-color:#975b33!important;border-color:#975b33!important;color:#fff!important}.ui.brown.corner.label,.ui.brown.corner.label:hover{background-color:transparent!important}.ui.brown.ribbon.label{border-color:#805031!important}.ui.basic.brown.label{background:none #fff!important;color:#a5673f!important;border-color:#a5673f!important}.ui.basic.brown.labels a.label:hover,a.ui.basic.brown.label:hover{background-color:#fff!important;color:#975b33!important;border-color:#975b33!important}.ui.grey.label,.ui.grey.labels .label{background-color:#767676!important;border-color:#767676!important;color:#fff!important}.ui.grey.labels .label:hover,a.ui.grey.label:hover{background-color:#838383!important;border-color:#838383!important;color:#fff!important}.ui.grey.corner.label,.ui.grey.corner.label:hover{background-color:transparent!important}.ui.grey.ribbon.label{border-color:#805031!important}.ui.basic.grey.label{background:none #fff!important;color:#767676!important;border-color:#767676!important}.ui.basic.grey.labels a.label:hover,a.ui.basic.grey.label:hover{background-color:#fff!important;color:#838383!important;border-color:#838383!important}.ui.black.label,.ui.black.labels .label{background-color:#1b1c1d!important;border-color:#1b1c1d!important;color:#fff!important}.ui.black.labels .label:hover,a.ui.black.label:hover{background-color:#27292a!important;border-color:#27292a!important;color:#fff!important}.ui.black.corner.label,.ui.black.corner.label:hover{background-color:transparent!important}.ui.black.ribbon.label{border-color:#805031!important}.ui.basic.black.label{background:none #fff!important;color:#1b1c1d!important;border-color:#1b1c1d!important}.ui.basic.black.labels a.label:hover,a.ui.basic.black.label:hover{background-color:#fff!important;color:#27292a!important;border-color:#27292a!important}.ui.basic.label{background:none #fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}a.ui.basic.label:hover{text-decoration:none;background:none #fff;color:#1e70bf;-webkit-box-shadow:1px solid rgba(34,36,38,.15);box-shadow:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.pointing.label:before{border-color:inherit}.ui.fluid.labels>.label,.ui.label.fluid{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.ui.inverted.label,.ui.inverted.labels .label{color:rgba(255,255,255,.9)!important}.ui.horizontal.label,.ui.horizontal.labels .label{margin:0 .5em 0 0;padding:.4em .833em;min-width:3em;text-align:center}.ui.circular.label,.ui.circular.labels .label{min-width:2em;min-height:2em;padding:.5em!important;line-height:1em;text-align:center;border-radius:500rem}.ui.empty.circular.label,.ui.empty.circular.labels .label{min-width:0;min-height:0;overflow:hidden;width:.5em;height:.5em;vertical-align:baseline}.ui.pointing.label{position:relative}.ui.attached.pointing.label{position:absolute}.ui.pointing.label:before{background-color:inherit;background-image:inherit;border-width:none;border-style:solid;border-color:inherit}.ui.pointing.label:before{position:absolute;content:'';-webkit-transform:rotate(45deg);transform:rotate(45deg);background-image:none;z-index:2;width:.6666em;height:.6666em;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.pointing.label,.ui[class*=\"pointing above\"].label{margin-top:1em}.ui.pointing.label:before,.ui[class*=\"pointing above\"].label:before{border-width:1px 0 0 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:0;left:50%}.ui[class*=\"bottom pointing\"].label,.ui[class*=\"pointing below\"].label{margin-top:0;margin-bottom:1em}.ui[class*=\"bottom pointing\"].label:before,.ui[class*=\"pointing below\"].label:before{border-width:0 1px 1px 0;top:auto;right:auto;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);top:100%;left:50%}.ui[class*=\"left pointing\"].label{margin-top:0;margin-left:.6666em}.ui[class*=\"left pointing\"].label:before{border-width:0 0 1px 1px;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);bottom:auto;right:auto;top:50%;left:0}.ui[class*=\"right pointing\"].label{margin-top:0;margin-right:.6666em}.ui[class*=\"right pointing\"].label:before{border-width:1px 1px 0 0;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);top:50%;right:0;bottom:auto;left:auto}.ui.basic.pointing.label:before,.ui.basic[class*=\"pointing above\"].label:before{margin-top:-1px}.ui.basic[class*=\"bottom pointing\"].label:before,.ui.basic[class*=\"pointing below\"].label:before{bottom:auto;top:100%;margin-top:1px}.ui.basic[class*=\"left pointing\"].label:before{top:50%;left:-1px}.ui.basic[class*=\"right pointing\"].label:before{top:50%;right:-1px}.ui.floating.label{position:absolute;z-index:100;top:-1em;left:100%;margin:0 0 0 -1.5em!important}.ui.mini.label,.ui.mini.labels .label{font-size:.64285714rem}.ui.tiny.label,.ui.tiny.labels .label{font-size:.71428571rem}.ui.small.label,.ui.small.labels .label{font-size:.78571429rem}.ui.label,.ui.labels .label{font-size:.85714286rem}.ui.large.label,.ui.large.labels .label{font-size:1rem}.ui.big.label,.ui.big.labels .label{font-size:1.28571429rem}.ui.huge.label,.ui.huge.labels .label{font-size:1.42857143rem}.ui.massive.label,.ui.massive.labels .label{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - List\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.list,ol.ui.list,ul.ui.list{list-style-type:none;margin:1em 0;padding:0 0}.ui.list:first-child,ol.ui.list:first-child,ul.ui.list:first-child{margin-top:0;padding-top:0}.ui.list:last-child,ol.ui.list:last-child,ul.ui.list:last-child{margin-bottom:0;padding-bottom:0}.ui.list .list>.item,.ui.list>.item,ol.ui.list li,ul.ui.list li{display:list-item;table-layout:fixed;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.list>.item:after,.ui.list>.list>.item,ol.ui.list>li:first-child:after,ul.ui.list>li:first-child:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.list .list>.item:first-child,.ui.list>.item:first-child,ol.ui.list li:first-child,ul.ui.list li:first-child{padding-top:0}.ui.list .list>.item:last-child,.ui.list>.item:last-child,ol.ui.list li:last-child,ul.ui.list li:last-child{padding-bottom:0}.ui.list .list,ol.ui.list ol,ul.ui.list ul{clear:both;margin:0;padding:.75em 0 .25em .5em}.ui.list .list>.item,ol.ui.list ol li,ul.ui.list ul li{padding:.14285714em 0;line-height:inherit}.ui.list .list>.item>i.icon,.ui.list>.item>i.icon{display:table-cell;margin:0;padding-top:0;padding-right:.28571429em;vertical-align:top;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.list .list>.item>i.icon:only-child,.ui.list>.item>i.icon:only-child{display:inline-block;vertical-align:top}.ui.list .list>.item>.image,.ui.list>.item>.image{display:table-cell;background-color:transparent;margin:0;vertical-align:top}.ui.list .list>.item>.image:not(:only-child):not(img),.ui.list>.item>.image:not(:only-child):not(img){padding-right:.5em}.ui.list .list>.item>.image img,.ui.list>.item>.image img{vertical-align:top}.ui.list .list>.item>.image:only-child,.ui.list .list>.item>img.image,.ui.list>.item>.image:only-child,.ui.list>.item>img.image{display:inline-block}.ui.list .list>.item>.content,.ui.list>.item>.content{line-height:1.14285714em}.ui.list .list>.item>.icon+.content,.ui.list .list>.item>.image+.content,.ui.list>.item>.icon+.content,.ui.list>.item>.image+.content{display:table-cell;width:100%;padding:0 0 0 .5em;vertical-align:top}.ui.list .list>.item>img.image+.content,.ui.list>.item>img.image+.content{display:inline-block;width:auto}.ui.list .list>.item>.content>.list,.ui.list>.item>.content>.list{margin-left:0;padding-left:0}.ui.list .list>.item .header,.ui.list>.item .header{display:block;margin:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.87)}.ui.list .list>.item .description,.ui.list>.item .description{display:block;color:rgba(0,0,0,.7)}.ui.list .list>.item a,.ui.list>.item a{cursor:pointer}.ui.list .list>a.item,.ui.list>a.item{cursor:pointer;color:#4183c4}.ui.list .list>a.item:hover,.ui.list>a.item:hover{color:#1e70bf}.ui.list .list>a.item i.icon,.ui.list>a.item i.icon{color:rgba(0,0,0,.4)}.ui.list .list>.item a.header,.ui.list>.item a.header{cursor:pointer;color:#4183c4!important}.ui.list .list>.item a.header:hover,.ui.list>.item a.header:hover{color:#1e70bf!important}.ui[class*=\"left floated\"].list{float:left}.ui[class*=\"right floated\"].list{float:right}.ui.list .list>.item [class*=\"left floated\"],.ui.list>.item [class*=\"left floated\"]{float:left;margin:0 1em 0 0}.ui.list .list>.item [class*=\"right floated\"],.ui.list>.item [class*=\"right floated\"]{float:right;margin:0 0 0 1em}.ui.menu .ui.list .list>.item,.ui.menu .ui.list>.item{display:list-item;table-layout:fixed;background-color:transparent;list-style-type:none;list-style-position:outside;padding:.21428571em 0;line-height:1.14285714em}.ui.menu .ui.list .list>.item:before,.ui.menu .ui.list>.item:before{border:none;background:0 0}.ui.menu .ui.list .list>.item:first-child,.ui.menu .ui.list>.item:first-child{padding-top:0}.ui.menu .ui.list .list>.item:last-child,.ui.menu .ui.list>.item:last-child{padding-bottom:0}.ui.horizontal.list{display:inline-block;font-size:0}.ui.horizontal.list>.item{display:inline-block;margin-left:1em;font-size:1rem}.ui.horizontal.list:not(.celled)>.item:first-child{margin-left:0!important;padding-left:0!important}.ui.horizontal.list .list{padding-left:0;padding-bottom:0}.ui.horizontal.list .list>.item>.content,.ui.horizontal.list .list>.item>.icon,.ui.horizontal.list .list>.item>.image,.ui.horizontal.list>.item>.content,.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.image{vertical-align:middle}.ui.horizontal.list>.item:first-child,.ui.horizontal.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.horizontal.list>.item>i.icon{margin:0;padding:0 .25em 0 0}.ui.horizontal.list>.item>.icon,.ui.horizontal.list>.item>.icon+.content{float:none;display:inline-block}.ui.list .list>.disabled.item,.ui.list>.disabled.item{pointer-events:none;color:rgba(40,40,40,.3)!important}.ui.inverted.list .list>.disabled.item,.ui.inverted.list>.disabled.item{color:rgba(225,225,225,.3)!important}.ui.list .list>a.item:hover .icon,.ui.list>a.item:hover .icon{color:rgba(0,0,0,.87)}.ui.inverted.list .list>a.item>.icon,.ui.inverted.list>a.item>.icon{color:rgba(255,255,255,.7)}.ui.inverted.list .list>.item .header,.ui.inverted.list>.item .header{color:rgba(255,255,255,.9)}.ui.inverted.list .list>.item .description,.ui.inverted.list>.item .description{color:rgba(255,255,255,.7)}.ui.inverted.list .list>a.item,.ui.inverted.list>a.item{cursor:pointer;color:rgba(255,255,255,.9)}.ui.inverted.list .list>a.item:hover,.ui.inverted.list>a.item:hover{color:#1e70bf}.ui.inverted.list .item a:not(.ui){color:rgba(255,255,255,.9)!important}.ui.inverted.list .item a:not(.ui):hover{color:#1e70bf!important}.ui.list [class*=\"top aligned\"],.ui.list[class*=\"top aligned\"] .content,.ui.list[class*=\"top aligned\"] .image{vertical-align:top!important}.ui.list [class*=\"middle aligned\"],.ui.list[class*=\"middle aligned\"] .content,.ui.list[class*=\"middle aligned\"] .image{vertical-align:middle!important}.ui.list [class*=\"bottom aligned\"],.ui.list[class*=\"bottom aligned\"] .content,.ui.list[class*=\"bottom aligned\"] .image{vertical-align:bottom!important}.ui.link.list .item,.ui.link.list .item a:not(.ui),.ui.link.list a.item{color:rgba(0,0,0,.4);-webkit-transition:.1s color ease;transition:.1s color ease}.ui.link.list.list .item a:not(.ui):hover,.ui.link.list.list a.item:hover{color:rgba(0,0,0,.8)}.ui.link.list.list .item a:not(.ui):active,.ui.link.list.list a.item:active{color:rgba(0,0,0,.9)}.ui.link.list.list .active.item,.ui.link.list.list .active.item a:not(.ui){color:rgba(0,0,0,.95)}.ui.inverted.link.list .item,.ui.inverted.link.list .item a:not(.ui),.ui.inverted.link.list a.item{color:rgba(255,255,255,.5)}.ui.inverted.link.list.list .item a:not(.ui):hover,.ui.inverted.link.list.list a.item:hover{color:#fff}.ui.inverted.link.list.list .item a:not(.ui):active,.ui.inverted.link.list.list a.item:active{color:#fff}.ui.inverted.link.list.list .active.item a:not(.ui),.ui.inverted.link.list.list a.active.item{color:#fff}.ui.selection.list .list>.item,.ui.selection.list>.item{cursor:pointer;background:0 0;padding:.5em .5em;margin:0;color:rgba(0,0,0,.4);border-radius:.5em;-webkit-transition:.1s color ease,.1s padding-left ease,.1s background-color ease;transition:.1s color ease,.1s padding-left ease,.1s background-color ease}.ui.selection.list .list>.item:last-child,.ui.selection.list>.item:last-child{margin-bottom:0}.ui.selection.list.list>.item:hover,.ui.selection.list>.item:hover{background:rgba(0,0,0,.03);color:rgba(0,0,0,.8)}.ui.selection.list .list>.item:active,.ui.selection.list>.item:active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.9)}.ui.selection.list .list>.item.active,.ui.selection.list>.item.active{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.selection.list>.item{background:0 0;color:rgba(255,255,255,.5)}.ui.inverted.selection.list>.item:hover{background:rgba(255,255,255,.02);color:#fff}.ui.inverted.selection.list>.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.selection.list>.item.active{background:rgba(255,255,255,.08);color:#fff}.ui.celled.selection.list .list>.item,.ui.celled.selection.list>.item,.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{border-radius:0}.ui.animated.list>.item{-webkit-transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s;transition:.25s color ease .1s,.25s padding-left ease .1s,.25s background-color ease .1s}.ui.animated.list:not(.horizontal)>.item:hover{padding-left:1em}.ui.fitted.list:not(.selection) .list>.item,.ui.fitted.list:not(.selection)>.item{padding-left:0;padding-right:0}.ui.fitted.selection.list .list>.item,.ui.fitted.selection.list>.item{margin-left:-.5em;margin-right:-.5em}.ui.bulleted.list,ul.ui.list{margin-left:1.25rem}.ui.bulleted.list .list>.item,.ui.bulleted.list>.item,ul.ui.list li{position:relative}.ui.bulleted.list .list>.item:before,.ui.bulleted.list>.item:before,ul.ui.list li:before{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;position:absolute;top:auto;left:auto;font-weight:400;margin-left:-1.25rem;content:'•';opacity:1;color:inherit;vertical-align:top}.ui.bulleted.list .list>a.item:before,.ui.bulleted.list>a.item:before,ul.ui.list li:before{color:rgba(0,0,0,.87)}.ui.bulleted.list .list,ul.ui.list ul{padding-left:1.25rem}.ui.horizontal.bulleted.list,ul.ui.horizontal.bulleted.list{margin-left:0}.ui.horizontal.bulleted.list>.item,ul.ui.horizontal.bulleted.list li{margin-left:1.75rem}.ui.horizontal.bulleted.list>.item:first-child,ul.ui.horizontal.bulleted.list li:first-child{margin-left:0}.ui.horizontal.bulleted.list>.item::before,ul.ui.horizontal.bulleted.list li::before{color:rgba(0,0,0,.87)}.ui.horizontal.bulleted.list>.item:first-child::before,ul.ui.horizontal.bulleted.list li:first-child::before{display:none}.ui.ordered.list,.ui.ordered.list .list,ol.ui.list,ol.ui.list ol{counter-reset:ordered;margin-left:1.25rem;list-style-type:none}.ui.ordered.list .list>.item,.ui.ordered.list>.item,ol.ui.list li{list-style-type:none;position:relative}.ui.ordered.list .list>.item:before,.ui.ordered.list>.item:before,ol.ui.list li:before{position:absolute;top:auto;left:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;margin-left:-1.25rem;counter-increment:ordered;content:counters(ordered, \".\") \" \";text-align:right;color:rgba(0,0,0,.87);vertical-align:middle;opacity:.8}.ui.ordered.inverted.list .list>.item:before,.ui.ordered.inverted.list>.item:before,ol.ui.inverted.list li:before{color:rgba(255,255,255,.7)}.ui.ordered.list>.item[data-value],.ui.ordered.list>.list>.item[data-value]{content:attr(data-value)}ol.ui.list li[value]:before{content:attr(value)}.ui.ordered.list .list,ol.ui.list ol{margin-left:1em}.ui.ordered.list .list>.item:before,ol.ui.list ol li:before{margin-left:-2em}.ui.ordered.horizontal.list,ol.ui.horizontal.list{margin-left:0}.ui.ordered.horizontal.list .list>.item:before,.ui.ordered.horizontal.list>.item:before,ol.ui.horizontal.list li:before{position:static;margin:0 .5em 0 0}.ui.divided.list>.item{border-top:1px solid rgba(34,36,38,.15)}.ui.divided.list .list>.item{border-top:none}.ui.divided.list .item .list>.item{border-top:none}.ui.divided.list .list>.item:first-child,.ui.divided.list>.item:first-child{border-top:none}.ui.divided.list:not(.horizontal) .list>.item:first-child{border-top-width:1px}.ui.divided.bulleted.list .list,.ui.divided.bulleted.list:not(.horizontal){margin-left:0;padding-left:0}.ui.divided.bulleted.list>.item:not(.horizontal){padding-left:1.25rem}.ui.divided.ordered.list{margin-left:0}.ui.divided.ordered.list .list>.item,.ui.divided.ordered.list>.item{padding-left:1.25rem}.ui.divided.ordered.list .item .list{margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.divided.ordered.list .item .list>.item{padding-left:1em}.ui.divided.selection.list .list>.item,.ui.divided.selection.list>.item{margin:0;border-radius:0}.ui.divided.horizontal.list{margin-left:0}.ui.divided.horizontal.list>.item:not(:first-child){padding-left:.5em}.ui.divided.horizontal.list>.item:not(:last-child){padding-right:.5em}.ui.divided.horizontal.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;line-height:.6}.ui.horizontal.divided.list>.item:first-child{border-left:none}.ui.divided.inverted.horizontal.list>.item,.ui.divided.inverted.list>.item,.ui.divided.inverted.list>.list{border-color:rgba(255,255,255,.1)}.ui.celled.list>.item,.ui.celled.list>.list{border-top:1px solid rgba(34,36,38,.15);padding-left:.5em;padding-right:.5em}.ui.celled.list>.item:last-child{border-bottom:1px solid rgba(34,36,38,.15)}.ui.celled.list>.item:first-child,.ui.celled.list>.item:last-child{padding-top:.21428571em;padding-bottom:.21428571em}.ui.celled.list .item .list>.item{border-width:0}.ui.celled.list .list>.item:first-child{border-top-width:0}.ui.celled.bulleted.list{margin-left:0}.ui.celled.bulleted.list .list>.item,.ui.celled.bulleted.list>.item{padding-left:1.25rem}.ui.celled.bulleted.list .item .list{margin-left:-1.25rem;margin-right:-1.25rem;padding-bottom:.21428571em}.ui.celled.ordered.list{margin-left:0}.ui.celled.ordered.list .list>.item,.ui.celled.ordered.list>.item{padding-left:1.25rem}.ui.celled.ordered.list .item .list{margin-left:0;margin-right:0;padding-bottom:.21428571em}.ui.celled.ordered.list .list>.item{padding-left:1em}.ui.horizontal.celled.list{margin-left:0}.ui.horizontal.celled.list .list>.item,.ui.horizontal.celled.list>.item{border-top:none;border-left:1px solid rgba(34,36,38,.15);margin:0;padding-left:.5em;padding-right:.5em;line-height:.6}.ui.horizontal.celled.list .list>.item:last-child,.ui.horizontal.celled.list>.item:last-child{border-bottom:none;border-right:1px solid rgba(34,36,38,.15)}.ui.celled.inverted.list>.item,.ui.celled.inverted.list>.list{border-color:1px solid rgba(255,255,255,.1)}.ui.celled.inverted.horizontal.list .list>.item,.ui.celled.inverted.horizontal.list>.item{border-color:1px solid rgba(255,255,255,.1)}.ui.relaxed.list:not(.horizontal)>.item:not(:first-child){padding-top:.42857143em}.ui.relaxed.list:not(.horizontal)>.item:not(:last-child){padding-bottom:.42857143em}.ui.horizontal.relaxed.list .list>.item:not(:first-child),.ui.horizontal.relaxed.list>.item:not(:first-child){padding-left:1rem}.ui.horizontal.relaxed.list .list>.item:not(:last-child),.ui.horizontal.relaxed.list>.item:not(:last-child){padding-right:1rem}.ui[class*=\"very relaxed\"].list:not(.horizontal)>.item:not(:first-child){padding-top:.85714286em}.ui[class*=\"very relaxed\"].list:not(.horizontal)>.item:not(:last-child){padding-bottom:.85714286em}.ui.horizontal[class*=\"very relaxed\"].list .list>.item:not(:first-child),.ui.horizontal[class*=\"very relaxed\"].list>.item:not(:first-child){padding-left:1.5rem}.ui.horizontal[class*=\"very relaxed\"].list .list>.item:not(:last-child),.ui.horizontal[class*=\"very relaxed\"].list>.item:not(:last-child){padding-right:1.5rem}.ui.mini.list{font-size:.78571429em}.ui.tiny.list{font-size:.85714286em}.ui.small.list{font-size:.92857143em}.ui.list{font-size:1em}.ui.large.list{font-size:1.14285714em}.ui.big.list{font-size:1.28571429em}.ui.huge.list{font-size:1.42857143em}.ui.massive.list{font-size:1.71428571em}.ui.mini.horizontal.list .list>.item,.ui.mini.horizontal.list>.item{font-size:.78571429rem}.ui.tiny.horizontal.list .list>.item,.ui.tiny.horizontal.list>.item{font-size:.85714286rem}.ui.small.horizontal.list .list>.item,.ui.small.horizontal.list>.item{font-size:.92857143rem}.ui.horizontal.list .list>.item,.ui.horizontal.list>.item{font-size:1rem}.ui.large.horizontal.list .list>.item,.ui.large.horizontal.list>.item{font-size:1.14285714rem}.ui.big.horizontal.list .list>.item,.ui.big.horizontal.list>.item{font-size:1.28571429rem}.ui.huge.horizontal.list .list>.item,.ui.huge.horizontal.list>.item{font-size:1.42857143rem}.ui.massive.horizontal.list .list>.item,.ui.massive.horizontal.list>.item{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Loader\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.loader{display:none;position:absolute;top:50%;left:50%;margin:0;text-align:center;z-index:1000;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ui.loader:before{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after{position:absolute;content:'';top:0;left:50%;width:100%;height:100%;-webkit-animation:loader .6s linear;animation:loader .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}@-webkit-keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.mini.loader:after,.ui.mini.loader:before{width:1rem;height:1rem;margin:0 0 0 -.5rem}.ui.tiny.loader:after,.ui.tiny.loader:before{width:1.14285714rem;height:1.14285714rem;margin:0 0 0 -.57142857rem}.ui.small.loader:after,.ui.small.loader:before{width:1.71428571rem;height:1.71428571rem;margin:0 0 0 -.85714286rem}.ui.loader:after,.ui.loader:before{width:2.28571429rem;height:2.28571429rem;margin:0 0 0 -1.14285714rem}.ui.large.loader:after,.ui.large.loader:before{width:3.42857143rem;height:3.42857143rem;margin:0 0 0 -1.71428571rem}.ui.big.loader:after,.ui.big.loader:before{width:3.71428571rem;height:3.71428571rem;margin:0 0 0 -1.85714286rem}.ui.huge.loader:after,.ui.huge.loader:before{width:4.14285714rem;height:4.14285714rem;margin:0 0 0 -2.07142857rem}.ui.massive.loader:after,.ui.massive.loader:before{width:4.57142857rem;height:4.57142857rem;margin:0 0 0 -2.28571429rem}.ui.dimmer .loader{display:block}.ui.dimmer .ui.loader{color:rgba(255,255,255,.9)}.ui.dimmer .ui.loader:before{border-color:rgba(255,255,255,.15)}.ui.dimmer .ui.loader:after{border-color:#fff transparent transparent}.ui.inverted.dimmer .ui.loader{color:rgba(0,0,0,.87)}.ui.inverted.dimmer .ui.loader:before{border-color:rgba(0,0,0,.1)}.ui.inverted.dimmer .ui.loader:after{border-color:#767676 transparent transparent}.ui.text.loader{width:auto!important;height:auto!important;text-align:center;font-style:normal}.ui.indeterminate.loader:after{animation-direction:reverse;-webkit-animation-duration:1.2s;animation-duration:1.2s}.ui.loader.active,.ui.loader.visible{display:block}.ui.loader.disabled,.ui.loader.hidden{display:none}.ui.inverted.dimmer .ui.mini.loader,.ui.mini.loader{width:1rem;height:1rem;font-size:.78571429em}.ui.inverted.dimmer .ui.tiny.loader,.ui.tiny.loader{width:1.14285714rem;height:1.14285714rem;font-size:.85714286em}.ui.inverted.dimmer .ui.small.loader,.ui.small.loader{width:1.71428571rem;height:1.71428571rem;font-size:.92857143em}.ui.inverted.dimmer .ui.loader,.ui.loader{width:2.28571429rem;height:2.28571429rem;font-size:1em}.ui.inverted.dimmer .ui.large.loader,.ui.large.loader{width:3.42857143rem;height:3.42857143rem;font-size:1.14285714em}.ui.big.loader,.ui.inverted.dimmer .ui.big.loader{width:3.71428571rem;height:3.71428571rem;font-size:1.28571429em}.ui.huge.loader,.ui.inverted.dimmer .ui.huge.loader{width:4.14285714rem;height:4.14285714rem;font-size:1.42857143em}.ui.inverted.dimmer .ui.massive.loader,.ui.massive.loader{width:4.57142857rem;height:4.57142857rem;font-size:1.71428571em}.ui.mini.text.loader{min-width:1rem;padding-top:1.78571429rem}.ui.tiny.text.loader{min-width:1.14285714rem;padding-top:1.92857143rem}.ui.small.text.loader{min-width:1.71428571rem;padding-top:2.5rem}.ui.text.loader{min-width:2.28571429rem;padding-top:3.07142857rem}.ui.large.text.loader{min-width:3.42857143rem;padding-top:4.21428571rem}.ui.big.text.loader{min-width:3.71428571rem;padding-top:4.5rem}.ui.huge.text.loader{min-width:4.14285714rem;padding-top:4.92857143rem}.ui.massive.text.loader{min-width:4.57142857rem;padding-top:5.35714286rem}.ui.inverted.loader{color:rgba(255,255,255,.9)}.ui.inverted.loader:before{border-color:rgba(255,255,255,.15)}.ui.inverted.loader:after{border-top-color:#fff}.ui.inline.loader{position:relative;vertical-align:middle;margin:0;left:0;top:0;-webkit-transform:none;transform:none}.ui.inline.loader.active,.ui.inline.loader.visible{display:inline-block}.ui.centered.inline.loader.active,.ui.centered.inline.loader.visible{display:block;margin-left:auto;margin-right:auto}/*!\n * # Semantic UI 2.4.0 - Loader\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.placeholder{position:static;overflow:hidden;-webkit-animation:placeholderShimmer 2s linear;animation:placeholderShimmer 2s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;background-color:#fff;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.08)),color-stop(15%,rgba(0,0,0,.15)),color-stop(30%,rgba(0,0,0,.08)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-image:linear-gradient(to right,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-size:1200px 100%;max-width:30rem}@-webkit-keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}@keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}.ui.placeholder+.ui.placeholder{margin-top:2rem}.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.15s;animation-delay:.15s}.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.3s;animation-delay:.3s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.45s;animation-delay:.45s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.6s;animation-delay:.6s}.ui.placeholder,.ui.placeholder .image.header:after,.ui.placeholder .line,.ui.placeholder .line:after,.ui.placeholder>:before{background-color:#fff}.ui.placeholder .image:not(.header):not(.ui){height:100px}.ui.placeholder .square.image:not(.header){height:0;overflow:hidden;padding-top:100%}.ui.placeholder .rectangular.image:not(.header){height:0;overflow:hidden;padding-top:75%}.ui.placeholder .line{position:relative;height:.85714286em}.ui.placeholder .line:after,.ui.placeholder .line:before{top:100%;position:absolute;content:'';background-color:inherit}.ui.placeholder .line:before{left:0}.ui.placeholder .line:after{right:0}.ui.placeholder .line{margin-bottom:.5em}.ui.placeholder .line:after,.ui.placeholder .line:before{height:.5em}.ui.placeholder .line:not(:first-child){margin-top:.5em}.ui.placeholder .header{position:relative;overflow:hidden}.ui.placeholder .line:nth-child(1):after{width:0%}.ui.placeholder .line:nth-child(2):after{width:50%}.ui.placeholder .line:nth-child(3):after{width:10%}.ui.placeholder .line:nth-child(4):after{width:35%}.ui.placeholder .line:nth-child(5):after{width:65%}.ui.placeholder .header .line{margin-bottom:.64285714em}.ui.placeholder .header .line:after,.ui.placeholder .header .line:before{height:.64285714em}.ui.placeholder .header .line:not(:first-child){margin-top:.64285714em}.ui.placeholder .header .line:after{width:20%}.ui.placeholder .header .line:nth-child(2):after{width:60%}.ui.placeholder .image.header .line{margin-left:3em}.ui.placeholder .image.header .line:before{width:.71428571rem}.ui.placeholder .image.header:after{display:block;height:.85714286em;content:'';margin-left:3em}.ui.placeholder .header .line:first-child,.ui.placeholder .image .line:first-child,.ui.placeholder .paragraph .line:first-child{height:.01px}.ui.placeholder .header:not(:first-child):before,.ui.placeholder .image:not(:first-child):before,.ui.placeholder .paragraph:not(:first-child):before{height:1.42857143em;content:'';display:block}.ui.inverted.placeholder{background-image:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,.08)),color-stop(15%,rgba(255,255,255,.14)),color-stop(30%,rgba(255,255,255,.08)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%);background-image:linear-gradient(to right,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%)}.ui.inverted.placeholder,.ui.inverted.placeholder .image.header:after,.ui.inverted.placeholder .line,.ui.inverted.placeholder .line:after,.ui.inverted.placeholder>:before{background-color:#1b1c1d}.ui.placeholder .full.line.line.line:after{width:0%}.ui.placeholder .very.long.line.line.line:after{width:10%}.ui.placeholder .long.line.line.line:after{width:35%}.ui.placeholder .medium.line.line.line:after{width:50%}.ui.placeholder .short.line.line.line:after{width:65%}.ui.placeholder .very.short.line.line.line:after{width:80%}.ui.fluid.placeholder{max-width:none}/*!\n * # Semantic UI 2.4.0 - Rail\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.rail{position:absolute;top:0;width:300px;height:100%}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:calc(300px + 1em)}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:calc(300px + .5em)}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0}.ui.mini.rail{font-size:.78571429rem}.ui.tiny.rail{font-size:.85714286rem}.ui.small.rail{font-size:.92857143rem}.ui.rail{font-size:1rem}.ui.large.rail{font-size:1.14285714rem}.ui.big.rail{font-size:1.28571429rem}.ui.huge.rail{font-size:1.42857143rem}.ui.massive.rail{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Reveal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.reveal{display:inherit;position:relative!important;font-size:0!important}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;white-space:normal;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:-webkit-transform .5s ease .1s;transition:transform .5s ease .1s;transition:transform .5s ease .1s,-webkit-transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;white-space:normal;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s,-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transform:rotate(0);transform:rotate(0)}.ui.rotate.reveal>.visible.content,.ui.rotate.right.reveal>.visible.content{-webkit-transform-origin:bottom right;transform-origin:bottom right}.ui.rotate.active.reveal>.visible.content,.ui.rotate.reveal:hover>.visible.content,.ui.rotate.right.active.reveal>.visible.content,.ui.rotate.right.reveal:hover>.visible.content{-webkit-transform:rotate(110deg);transform:rotate(110deg)}.ui.rotate.left.reveal>.visible.content{-webkit-transform-origin:bottom left;transform-origin:bottom left}.ui.rotate.left.active.reveal>.visible.content,.ui.rotate.left.reveal:hover>.visible.content{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.ui.disabled.reveal:hover>.visible.visible.content{position:static!important;display:block!important;opacity:1!important;top:0!important;left:0!important;right:auto!important;bottom:auto!important;-webkit-transform:none!important;transform:none!important}.ui.disabled.reveal:hover>.hidden.hidden.content{display:none!important}.ui.reveal>.ui.ribbon.label{z-index:5}.ui.visible.reveal{overflow:visible}.ui.instant.reveal>.content{-webkit-transition-delay:0s!important;transition-delay:0s!important}.ui.reveal>.content{font-size:1rem!important}/*!\n * # Semantic UI 2.4.0 - Segment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header{color:#fff}.ui[class*=\"bottom attached\"].segment>[class*=\"top attached\"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*=\"top attached\"].segment>[class*=\"bottom attached\"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*=\"top attached\"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*=\"bottom attached\"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*=\"very basic\"].table.segment{padding:1em 1em}.ui.placeholder.segment{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{-ms-flex-item-align:center;align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:'';box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*=\"top attached\"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*=\"top attached\"]:first-child{margin-top:0}.ui.piled.segment[class*=\"bottom attached\"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*=\"bottom attached\"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*=\"very padded\"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*=\"very padded\"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.segment,.ui.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{border-top:none;margin-top:0;bottom:0;margin-bottom:0;top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem 1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:transparent;border-radius:0;padding:0;background-color:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments>.segment{-webkit-box-flex:1;flex:1 1 auto;-ms-flex:1 1 0px;margin:0;min-width:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments>.segment:first-child{border-left:none}.ui.disabled.segment{opacity:.45;color:rgba(40,40,40,.3)}.ui.loading.segment{position:relative;cursor:default;pointer-events:none;text-shadow:none!important;color:transparent!important;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:segment-spin .6s linear;animation:segment-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes segment-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.basic.segment{background:none transparent;-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:\".\";display:block;height:0;clear:both;visibility:hidden}.ui.red.segment:not(.inverted){border-top:2px solid #db2828!important}.ui.inverted.red.segment{background-color:#db2828!important;color:#fff!important}.ui.orange.segment:not(.inverted){border-top:2px solid #f2711c!important}.ui.inverted.orange.segment{background-color:#f2711c!important;color:#fff!important}.ui.yellow.segment:not(.inverted){border-top:2px solid #fbbd08!important}.ui.inverted.yellow.segment{background-color:#fbbd08!important;color:#fff!important}.ui.olive.segment:not(.inverted){border-top:2px solid #b5cc18!important}.ui.inverted.olive.segment{background-color:#b5cc18!important;color:#fff!important}.ui.green.segment:not(.inverted){border-top:2px solid #21ba45!important}.ui.inverted.green.segment{background-color:#21ba45!important;color:#fff!important}.ui.teal.segment:not(.inverted){border-top:2px solid #00b5ad!important}.ui.inverted.teal.segment{background-color:#00b5ad!important;color:#fff!important}.ui.blue.segment:not(.inverted){border-top:2px solid #2185d0!important}.ui.inverted.blue.segment{background-color:#2185d0!important;color:#fff!important}.ui.violet.segment:not(.inverted){border-top:2px solid #6435c9!important}.ui.inverted.violet.segment{background-color:#6435c9!important;color:#fff!important}.ui.purple.segment:not(.inverted){border-top:2px solid #a333c8!important}.ui.inverted.purple.segment{background-color:#a333c8!important;color:#fff!important}.ui.pink.segment:not(.inverted){border-top:2px solid #e03997!important}.ui.inverted.pink.segment{background-color:#e03997!important;color:#fff!important}.ui.brown.segment:not(.inverted){border-top:2px solid #a5673f!important}.ui.inverted.brown.segment{background-color:#a5673f!important;color:#fff!important}.ui.grey.segment:not(.inverted){border-top:2px solid #767676!important}.ui.inverted.grey.segment{background-color:#767676!important;color:#fff!important}.ui.black.segment:not(.inverted){border-top:2px solid #1b1c1d!important}.ui.inverted.black.segment{background-color:#1b1c1d!important;color:#fff!important}.ui[class*=\"left aligned\"].segment{text-align:left}.ui[class*=\"right aligned\"].segment{text-align:right}.ui[class*=\"center aligned\"].segment{text-align:center}.ui.floated.segment,.ui[class*=\"left floated\"].segment{float:left;margin-right:1em}.ui[class*=\"right floated\"].segment{float:right;margin-left:1em}.ui.inverted.segment{border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.segment,.ui.primary.inverted.segment{background:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.secondary.segment{background:#f3f4f5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:#4c4f52 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*=\"top attached\"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*=\"top attached\"]:first-child{margin-top:0}.ui.segment[class*=\"bottom attached\"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*=\"bottom attached\"]:last-child{margin-bottom:0}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Step\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:1em 0;background:'';-webkit-box-shadow:none;box-shadow:none;line-height:1.14285714em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.steps:first-child{margin-top:0}.ui.steps:last-child{margin-bottom:0}.ui.steps .step{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;vertical-align:middle;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0 0;padding:1.14285714em 2em;background:#fff;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border-radius:0;border:none;border-right:1px solid rgba(34,36,38,.15);-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease}.ui.steps .step:after{display:none;position:absolute;z-index:2;content:'';top:50%;right:0;border:medium none;background-color:#fff;width:1.14285714em;height:1.14285714em;border-style:solid;border-color:rgba(34,36,38,.15);border-width:0 1px 1px 0;-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg)}.ui.steps .step:first-child{padding-left:2em;border-radius:.28571429rem 0 0 .28571429rem}.ui.steps .step:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.steps .step:last-child{border-right:none;margin-right:0}.ui.steps .step:only-child{border-radius:.28571429rem}.ui.steps .step .title{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;font-weight:700}.ui.steps .step>.title{width:100%}.ui.steps .step .description{font-weight:400;font-size:.92857143em;color:rgba(0,0,0,.87)}.ui.steps .step>.description{width:100%}.ui.steps .step .title~.description{margin-top:.25em}.ui.steps .step>.icon{line-height:1;font-size:2.5em;margin:0 1rem 0 0}.ui.steps .step>.icon,.ui.steps .step>.icon~.content{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-item-align:middle;align-self:middle}.ui.steps .step>.icon~.content{-webkit-box-flex:1 0 auto;-ms-flex-positive:1 0 auto;flex-grow:1 0 auto}.ui.steps:not(.vertical) .step>.icon{width:auto}.ui.steps .link.step,.ui.steps a.step{cursor:pointer}.ui.ordered.steps{counter-reset:ordered}.ui.ordered.steps .step:before{display:block;position:static;text-align:center;content:counters(ordered, \".\");-ms-flex-item-align:middle;align-self:middle;margin-right:1rem;font-size:2.5em;counter-increment:ordered;font-family:inherit;font-weight:700}.ui.ordered.steps .step>*{display:block;-ms-flex-item-align:middle;align-self:middle}.ui.vertical.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:visible}.ui.vertical.steps .step{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.steps .step:last-child{border-bottom:none;border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.steps .step:only-child{border-radius:.28571429rem}.ui.vertical.steps .step:after{display:none}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0}.ui.vertical.steps .step:after{display:none}.ui.vertical.steps .active.step:after{display:block}.ui.vertical.steps .step:last-child:after{display:none}.ui.vertical.steps .active.step:last-child:after{display:block}@media only screen and (max-width:767px){.ui.steps:not(.unstackable){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.steps:not(.unstackable) .step{width:100%!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui.steps:not(.unstackable) .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps:not(.unstackable) .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.steps:not(.unstackable) .step:after{display:none!important}.ui.steps:not(.unstackable) .step .content{text-align:center}.ui.ordered.steps:not(.unstackable) .step:before,.ui.steps:not(.unstackable) .step>.icon{margin:0 0 1rem 0}}.ui.steps .link.step:hover,.ui.steps .link.step:hover::after,.ui.steps a.step:hover,.ui.steps a.step:hover::after{background:#f9fafb;color:rgba(0,0,0,.8)}.ui.steps .link.step:active,.ui.steps .link.step:active::after,.ui.steps a.step:active,.ui.steps a.step:active::after{background:#f3f4f5;color:rgba(0,0,0,.9)}.ui.steps .step.active{cursor:auto;background:#f3f4f5}.ui.steps .step.active:after{background:#f3f4f5}.ui.steps .step.active .title{color:#4183c4}.ui.ordered.steps .step.active:before,.ui.steps .active.step .icon{color:rgba(0,0,0,.85)}.ui.steps .step:after{display:block}.ui.steps .active.step:after{display:block}.ui.steps .step:last-child:after{display:none}.ui.steps .active.step:last-child:after{display:none}.ui.steps .link.active.step:hover,.ui.steps .link.active.step:hover::after,.ui.steps a.active.step:hover,.ui.steps a.active.step:hover::after{cursor:pointer;background:#dcddde;color:rgba(0,0,0,.87)}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{color:#21ba45}.ui.steps .disabled.step{cursor:auto;background:#fff;pointer-events:none}.ui.steps .disabled.step,.ui.steps .disabled.step .description,.ui.steps .disabled.step .title{color:rgba(40,40,40,.3)}.ui.steps .disabled.step:after{background:#fff}@media only screen and (max-width:991px){.ui[class*=\"tablet stackable\"].steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui[class*=\"tablet stackable\"].steps .step{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em}.ui[class*=\"tablet stackable\"].steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui[class*=\"tablet stackable\"].steps .step:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"tablet stackable\"].steps .step:after{display:none!important}.ui[class*=\"tablet stackable\"].steps .step .content{text-align:center}.ui[class*=\"tablet stackable\"].ordered.steps .step:before,.ui[class*=\"tablet stackable\"].steps .step>.icon{margin:0 0 1rem 0}}.ui.fluid.steps{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.ui.attached.steps{width:calc(100% + 2px)!important;margin:0 -1px 0;max-width:calc(100% + 2px);border-radius:.28571429rem .28571429rem 0 0}.ui.attached.steps .step:first-child{border-radius:.28571429rem 0 0 0}.ui.attached.steps .step:last-child{border-radius:0 .28571429rem 0 0}.ui.bottom.attached.steps{margin:0 -1px 0;border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.attached.steps .step:first-child{border-radius:0 0 0 .28571429rem}.ui.bottom.attached.steps .step:last-child{border-radius:0 0 .28571429rem 0}.ui.eight.steps,.ui.five.steps,.ui.four.steps,.ui.one.steps,.ui.seven.steps,.ui.six.steps,.ui.three.steps,.ui.two.steps{width:100%}.ui.eight.steps>.step,.ui.five.steps>.step,.ui.four.steps>.step,.ui.one.steps>.step,.ui.seven.steps>.step,.ui.six.steps>.step,.ui.three.steps>.step,.ui.two.steps>.step{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.ui.one.steps>.step{width:100%}.ui.two.steps>.step{width:50%}.ui.three.steps>.step{width:33.333%}.ui.four.steps>.step{width:25%}.ui.five.steps>.step{width:20%}.ui.six.steps>.step{width:16.666%}.ui.seven.steps>.step{width:14.285%}.ui.eight.steps>.step{width:12.5%}.ui.mini.step,.ui.mini.steps .step{font-size:.78571429rem}.ui.tiny.step,.ui.tiny.steps .step{font-size:.85714286rem}.ui.small.step,.ui.small.steps .step{font-size:.92857143rem}.ui.step,.ui.steps .step{font-size:1rem}.ui.large.step,.ui.large.steps .step{font-size:1.14285714rem}.ui.big.step,.ui.big.steps .step{font-size:1.28571429rem}.ui.huge.step,.ui.huge.steps .step{font-size:1.42857143rem}.ui.massive.step,.ui.massive.steps .step{font-size:1.71428571rem}@font-face{font-family:Step;src:url(data:application/x-font-ttf;charset=utf-8;;base64,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) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,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) format('woff')}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{font-family:Step;content:'\\e800'}/*!\n * # Semantic UI 2.4.0 - Breadcrumb\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.breadcrumb{line-height:1;display:inline-block;margin:0 0;vertical-align:middle}.ui.breadcrumb:first-child{margin-top:0}.ui.breadcrumb:last-child{margin-bottom:0}.ui.breadcrumb .divider{display:inline-block;opacity:.7;margin:0 .21428571rem 0;font-size:.92857143em;color:rgba(0,0,0,.4);vertical-align:baseline}.ui.breadcrumb a{color:#4183c4}.ui.breadcrumb a:hover{color:#1e70bf}.ui.breadcrumb .icon.divider{font-size:.85714286em;vertical-align:baseline}.ui.breadcrumb a.section{cursor:pointer}.ui.breadcrumb .section{display:inline-block;margin:0;padding:0}.ui.breadcrumb.segment{display:inline-block;padding:.78571429em 1em}.ui.breadcrumb .active.section{font-weight:700}.ui.mini.breadcrumb{font-size:.78571429rem}.ui.tiny.breadcrumb{font-size:.85714286rem}.ui.small.breadcrumb{font-size:.92857143rem}.ui.breadcrumb{font-size:1rem}.ui.large.breadcrumb{font-size:1.14285714rem}.ui.big.breadcrumb{font-size:1.28571429rem}.ui.huge.breadcrumb{font-size:1.42857143rem}.ui.massive.breadcrumb{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Form\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.form{position:relative;max-width:100%}.ui.form>p{margin:1em 0}.ui.form .field{clear:both;margin:0 0 1em}.ui.form .field:last-child,.ui.form .fields:last-child .field{margin-bottom:0}.ui.form .fields .field{clear:both;margin:0}.ui.form .field>label{display:block;margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url],.ui.form textarea{width:100%;vertical-align:top}.ui.form ::-webkit-datetime-edit,.ui.form ::-webkit-inner-spin-button{height:1.21428571em}.ui.form input:not([type]),.ui.form input[type=date],.ui.form input[type=datetime-local],.ui.form input[type=email],.ui.form input[type=file],.ui.form input[type=number],.ui.form input[type=password],.ui.form input[type=search],.ui.form input[type=tel],.ui.form input[type=text],.ui.form input[type=time],.ui.form input[type=url]{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;margin:0;outline:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form textarea{margin:0;-webkit-appearance:none;tap-highlight-color:rgba(255,255,255,0);padding:.78571429em 1em;background:#fff;border:1px solid rgba(34,36,38,.15);outline:0;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease;font-size:1em;line-height:1.2857;resize:vertical}.ui.form textarea:not([rows]){height:12em;min-height:8em;max-height:24em}.ui.form input[type=checkbox],.ui.form textarea{vertical-align:top}.ui.form input.attached{width:auto}.ui.form select{display:block;height:auto;width:100%;background:#fff;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;padding:.62em 1em;color:rgba(0,0,0,.87);-webkit-transition:color .1s ease,border-color .1s ease;transition:color .1s ease,border-color .1s ease}.ui.form .field>.selection.dropdown{width:100%}.ui.form .field>.selection.dropdown>.dropdown.icon{float:right}.ui.form .inline.field>.selection.dropdown,.ui.form .inline.fields .field>.selection.dropdown{width:auto}.ui.form .inline.field>.selection.dropdown>.dropdown.icon,.ui.form .inline.fields .field>.selection.dropdown>.dropdown.icon{float:none}.ui.form .field .ui.input,.ui.form .fields .field .ui.input,.ui.form .wide.field .ui.input{width:100%}.ui.form .inline.field:not(.wide) .ui.input,.ui.form .inline.fields .field:not(.wide) .ui.input{width:auto;vertical-align:middle}.ui.form .field .ui.input input,.ui.form .fields .field .ui.input input{width:auto}.ui.form .eight.fields .ui.input input,.ui.form .five.fields .ui.input input,.ui.form .four.fields .ui.input input,.ui.form .nine.fields .ui.input input,.ui.form .seven.fields .ui.input input,.ui.form .six.fields .ui.input input,.ui.form .ten.fields .ui.input input,.ui.form .three.fields .ui.input input,.ui.form .two.fields .ui.input input,.ui.form .wide.field .ui.input input{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;width:0}.ui.form .error.message,.ui.form .success.message,.ui.form .warning.message{display:none}.ui.form .message:first-child{margin-top:0}.ui.form .field .prompt.label{white-space:normal;background:#fff!important;border:1px solid #e0b4b4!important;color:#9f3a38!important}.ui.form .inline.field .prompt,.ui.form .inline.fields .field .prompt{vertical-align:top;margin:-.25em 0 -.5em .5em}.ui.form .inline.field .prompt:before,.ui.form .inline.fields .field .prompt:before{border-width:0 0 1px 1px;bottom:auto;right:auto;top:50%;left:0}.ui.form .field.field input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#e5dfa1!important}.ui.form .field.field input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 100px ivory inset!important;box-shadow:0 0 0 100px ivory inset!important;border-color:#d5c315!important}.ui.form .error.error input:-webkit-autofill{-webkit-box-shadow:0 0 0 100px #fffaf0 inset!important;box-shadow:0 0 0 100px #fffaf0 inset!important;border-color:#e0b4b4!important}.ui.form ::-webkit-input-placeholder{color:rgba(191,191,191,.87)}.ui.form :-ms-input-placeholder{color:rgba(191,191,191,.87)!important}.ui.form ::-moz-placeholder{color:rgba(191,191,191,.87)}.ui.form :focus::-webkit-input-placeholder{color:rgba(115,115,115,.87)}.ui.form :focus:-ms-input-placeholder{color:rgba(115,115,115,.87)!important}.ui.form :focus::-moz-placeholder{color:rgba(115,115,115,.87)}.ui.form .error ::-webkit-input-placeholder{color:#e7bdbc}.ui.form .error :-ms-input-placeholder{color:#e7bdbc!important}.ui.form .error ::-moz-placeholder{color:#e7bdbc}.ui.form .error :focus::-webkit-input-placeholder{color:#da9796}.ui.form .error :focus:-ms-input-placeholder{color:#da9796!important}.ui.form .error :focus::-moz-placeholder{color:#da9796}.ui.form input:not([type]):focus,.ui.form input[type=date]:focus,.ui.form input[type=datetime-local]:focus,.ui.form input[type=email]:focus,.ui.form input[type=file]:focus,.ui.form input[type=number]:focus,.ui.form input[type=password]:focus,.ui.form input[type=search]:focus,.ui.form input[type=tel]:focus,.ui.form input[type=text]:focus,.ui.form input[type=time]:focus,.ui.form input[type=url]:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset}.ui.form textarea:focus{color:rgba(0,0,0,.95);border-color:#85b7d9;border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;box-shadow:0 0 0 0 rgba(34,36,38,.35) inset;-webkit-appearance:none}.ui.form.success .success.message:not(:empty){display:block}.ui.form.success .compact.success.message:not(:empty){display:inline-block}.ui.form.success .icon.success.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form.warning .warning.message:not(:empty){display:block}.ui.form.warning .compact.warning.message:not(:empty){display:inline-block}.ui.form.warning .icon.warning.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form.error .error.message:not(:empty){display:block}.ui.form.error .compact.error.message:not(:empty){display:inline-block}.ui.form.error .icon.error.message:not(:empty){display:-webkit-box;display:-ms-flexbox;display:flex}.ui.form .field.error .input,.ui.form .field.error label,.ui.form .fields.error .field .input,.ui.form .fields.error .field label{color:#9f3a38}.ui.form .field.error .corner.label,.ui.form .fields.error .field .corner.label{border-color:#9f3a38;color:#fff}.ui.form .field.error input:not([type]),.ui.form .field.error input[type=date],.ui.form .field.error input[type=datetime-local],.ui.form .field.error input[type=email],.ui.form .field.error input[type=file],.ui.form .field.error input[type=number],.ui.form .field.error input[type=password],.ui.form .field.error input[type=search],.ui.form .field.error input[type=tel],.ui.form .field.error input[type=text],.ui.form .field.error input[type=time],.ui.form .field.error input[type=url],.ui.form .field.error select,.ui.form .field.error textarea,.ui.form .fields.error .field input:not([type]),.ui.form .fields.error .field input[type=date],.ui.form .fields.error .field input[type=datetime-local],.ui.form .fields.error .field input[type=email],.ui.form .fields.error .field input[type=file],.ui.form .fields.error .field input[type=number],.ui.form .fields.error .field input[type=password],.ui.form .fields.error .field input[type=search],.ui.form .fields.error .field input[type=tel],.ui.form .fields.error .field input[type=text],.ui.form .fields.error .field input[type=time],.ui.form .fields.error .field input[type=url],.ui.form .fields.error .field select,.ui.form .fields.error .field textarea{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;border-radius:'';-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error input:not([type]):focus,.ui.form .field.error input[type=date]:focus,.ui.form .field.error input[type=datetime-local]:focus,.ui.form .field.error input[type=email]:focus,.ui.form .field.error input[type=file]:focus,.ui.form .field.error input[type=number]:focus,.ui.form .field.error input[type=password]:focus,.ui.form .field.error input[type=search]:focus,.ui.form .field.error input[type=tel]:focus,.ui.form .field.error input[type=text]:focus,.ui.form .field.error input[type=time]:focus,.ui.form .field.error input[type=url]:focus,.ui.form .field.error select:focus,.ui.form .field.error textarea:focus{background:#fff6f6;border-color:#e0b4b4;color:#9f3a38;-webkit-appearance:none;-webkit-box-shadow:none;box-shadow:none}.ui.form .field.error select{-webkit-appearance:menulist-button}.ui.form .field.error .ui.dropdown,.ui.form .field.error .ui.dropdown .item,.ui.form .field.error .ui.dropdown .text,.ui.form .fields.error .field .ui.dropdown,.ui.form .fields.error .field .ui.dropdown .item{background:#fff6f6;color:#9f3a38}.ui.form .field.error .ui.dropdown,.ui.form .fields.error .field .ui.dropdown{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover,.ui.form .fields.error .field .ui.dropdown:hover{border-color:#e0b4b4!important}.ui.form .field.error .ui.dropdown:hover .menu,.ui.form .fields.error .field .ui.dropdown:hover .menu{border-color:#e0b4b4}.ui.form .field.error .ui.multiple.selection.dropdown>.label,.ui.form .fields.error .field .ui.multiple.selection.dropdown>.label{background-color:#eacbcb;color:#9f3a38}.ui.form .field.error .ui.dropdown .menu .item:hover,.ui.form .fields.error .field .ui.dropdown .menu .item:hover{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .selected.item,.ui.form .fields.error .field .ui.dropdown .menu .selected.item{background-color:#fbe7e7}.ui.form .field.error .ui.dropdown .menu .active.item,.ui.form .fields.error .field .ui.dropdown .menu .active.item{background-color:#fdcfcf!important}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label{color:#9f3a38}.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before{background:#fff6f6;border-color:#e0b4b4}.ui.form .field.error .checkbox .box:after,.ui.form .field.error .checkbox label:after,.ui.form .fields.error .field .checkbox .box:after,.ui.form .fields.error .field .checkbox label:after{color:#9f3a38}.ui.form .disabled.field,.ui.form .disabled.fields .field,.ui.form .field :disabled{pointer-events:none;opacity:.45}.ui.form .field.disabled>label,.ui.form .fields.disabled>label{opacity:.45}.ui.form .field.disabled :disabled{opacity:1}.ui.loading.form{position:relative;cursor:default;pointer-events:none}.ui.loading.form:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;z-index:100}.ui.loading.form:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:form-spin .6s linear;animation:form-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.1);border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}@-webkit-keyframes form-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes form-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.form .required.field>.checkbox:after,.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>label:after{margin:-.2em 0 0 .2em;content:'*';color:#db2828}.ui.form .required.field>label:after,.ui.form .required.fields.grouped>label:after,.ui.form .required.fields:not(.grouped)>.field>label:after{display:inline-block;vertical-align:top}.ui.form .required.field>.checkbox:after,.ui.form .required.fields:not(.grouped)>.field>.checkbox:after{position:absolute;top:0;left:100%}.ui.form .inverted.segment .ui.checkbox .box,.ui.form .inverted.segment .ui.checkbox label,.ui.form .inverted.segment label,.ui.inverted.form .inline.field>label,.ui.inverted.form .inline.field>p,.ui.inverted.form .inline.fields .field>label,.ui.inverted.form .inline.fields .field>p,.ui.inverted.form .inline.fields>label,.ui.inverted.form .ui.checkbox .box,.ui.inverted.form .ui.checkbox label,.ui.inverted.form label{color:rgba(255,255,255,.9)}.ui.inverted.form input:not([type]),.ui.inverted.form input[type=date],.ui.inverted.form input[type=datetime-local],.ui.inverted.form input[type=email],.ui.inverted.form input[type=file],.ui.inverted.form input[type=number],.ui.inverted.form input[type=password],.ui.inverted.form input[type=search],.ui.inverted.form input[type=tel],.ui.inverted.form input[type=text],.ui.inverted.form input[type=time],.ui.inverted.form input[type=url]{background:#fff;border-color:rgba(255,255,255,.1);color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none}.ui.form .grouped.fields{display:block;margin:0 0 1em}.ui.form .grouped.fields:last-child{margin-bottom:0}.ui.form .grouped.fields>label{margin:0 0 .28571429rem 0;color:rgba(0,0,0,.87);font-size:.92857143em;font-weight:700;text-transform:none}.ui.form .grouped.fields .field,.ui.form .grouped.inline.fields .field{display:block;margin:.5em 0;padding:0}.ui.form .fields{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;margin:0 -.5em 1em}.ui.form .fields>.field{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;padding-left:.5em;padding-right:.5em}.ui.form .fields>.field:first-child{border-left:none;-webkit-box-shadow:none;box-shadow:none}.ui.form .two.fields>.field,.ui.form .two.fields>.fields{width:50%}.ui.form .three.fields>.field,.ui.form .three.fields>.fields{width:33.33333333%}.ui.form .four.fields>.field,.ui.form .four.fields>.fields{width:25%}.ui.form .five.fields>.field,.ui.form .five.fields>.fields{width:20%}.ui.form .six.fields>.field,.ui.form .six.fields>.fields{width:16.66666667%}.ui.form .seven.fields>.field,.ui.form .seven.fields>.fields{width:14.28571429%}.ui.form .eight.fields>.field,.ui.form .eight.fields>.fields{width:12.5%}.ui.form .nine.fields>.field,.ui.form .nine.fields>.fields{width:11.11111111%}.ui.form .ten.fields>.field,.ui.form .ten.fields>.fields{width:10%}@media only screen and (max-width:767px){.ui.form .fields{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .eight.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .nine.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .seven.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .six.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .ten.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) [class*=\"equal width\"].fields:not(.unstackable)>.field,.ui[class*=\"equal width\"].form:not(.unstackable) .fields>.field{width:100%!important;margin:0 0 1em}}.ui.form .fields .wide.field{width:6.25%;padding-left:.5em;padding-right:.5em}.ui.form .one.wide.field{width:6.25%!important}.ui.form .two.wide.field{width:12.5%!important}.ui.form .three.wide.field{width:18.75%!important}.ui.form .four.wide.field{width:25%!important}.ui.form .five.wide.field{width:31.25%!important}.ui.form .six.wide.field{width:37.5%!important}.ui.form .seven.wide.field{width:43.75%!important}.ui.form .eight.wide.field{width:50%!important}.ui.form .nine.wide.field{width:56.25%!important}.ui.form .ten.wide.field{width:62.5%!important}.ui.form .eleven.wide.field{width:68.75%!important}.ui.form .twelve.wide.field{width:75%!important}.ui.form .thirteen.wide.field{width:81.25%!important}.ui.form .fourteen.wide.field{width:87.5%!important}.ui.form .fifteen.wide.field{width:93.75%!important}.ui.form .sixteen.wide.field{width:100%!important}@media only screen and (max-width:767px){.ui.form:not(.unstackable) .fields:not(.unstackable)>.eight.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.eleven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fifteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.five.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.four.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.fourteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.nine.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.seven.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.six.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.sixteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.ten.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.thirteen.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.three.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.twelve.wide.field,.ui.form:not(.unstackable) .fields:not(.unstackable)>.two.wide.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .five.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .four.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .three.fields:not(.unstackable)>.fields,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.field,.ui.form:not(.unstackable) .two.fields:not(.unstackable)>.fields{width:100%!important}.ui.form .fields{margin-bottom:0}}.ui.form [class*=\"equal width\"].fields>.field,.ui[class*=\"equal width\"].form .fields>.field{width:100%;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.ui.form .inline.fields{margin:0 0 1em;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .field{margin:0;padding:0 1em 0 0}.ui.form .inline.field>label,.ui.form .inline.field>p,.ui.form .inline.fields .field>label,.ui.form .inline.fields .field>p,.ui.form .inline.fields>label{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:baseline;font-size:.92857143em;font-weight:700;color:rgba(0,0,0,.87);text-transform:none}.ui.form .inline.fields>label{margin:.035714em 1em 0 0}.ui.form .inline.field>input,.ui.form .inline.field>select,.ui.form .inline.fields .field>input,.ui.form .inline.fields .field>select{display:inline-block;width:auto;margin-top:0;margin-bottom:0;vertical-align:middle;font-size:1em}.ui.form .inline.field>:first-child,.ui.form .inline.fields .field>:first-child{margin:0 .85714286em 0 0}.ui.form .inline.field>:only-child,.ui.form .inline.fields .field>:only-child{margin:0}.ui.form .inline.fields .wide.field{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.form .inline.fields .wide.field>input,.ui.form .inline.fields .wide.field>select{width:100%}.ui.mini.form{font-size:.78571429rem}.ui.tiny.form{font-size:.85714286rem}.ui.small.form{font-size:.92857143rem}.ui.form{font-size:1rem}.ui.large.form{font-size:1.14285714rem}.ui.big.form{font-size:1.28571429rem}.ui.huge.form{font-size:1.42857143rem}.ui.massive.form{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Grid\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;padding:0}.ui.grid{margin-top:-1rem;margin-bottom:-1rem;margin-left:-1rem;margin-right:-1rem}.ui.relaxed.grid{margin-left:-1.5rem;margin-right:-1.5rem}.ui[class*=\"very relaxed\"].grid{margin-left:-2.5rem;margin-right:-2.5rem}.ui.grid+.grid{margin-top:1rem}.ui.grid>.column:not(.row),.ui.grid>.row>.column{position:relative;display:inline-block;width:6.25%;padding-left:1rem;padding-right:1rem;vertical-align:top}.ui.grid>*{padding-left:1rem;padding-right:1rem}.ui.grid>.row{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:inherit;-ms-flex-pack:inherit;justify-content:inherit;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%!important;padding:0;padding-top:1rem;padding-bottom:1rem}.ui.grid>.column:not(.row){padding-top:1rem;padding-bottom:1rem}.ui.grid>.row>.column{margin-top:0;margin-bottom:0}.ui.grid>.row>.column>img,.ui.grid>.row>img{max-width:100%}.ui.grid>.ui.grid:first-child{margin-top:0}.ui.grid>.ui.grid:last-child{margin-bottom:0}.ui.aligned.grid .column>.segment:not(.compact):not(.attached),.ui.grid .aligned.row>.column>.segment:not(.compact):not(.attached){width:100%}.ui.grid .row+.ui.divider{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:1rem 1rem}.ui.grid .column+.ui.vertical.divider{height:calc(50% - 1rem)}.ui.grid>.column:last-child>.horizontal.segment,.ui.grid>.row>.column:last-child>.horizontal.segment{-webkit-box-shadow:none;box-shadow:none}@media only screen and (max-width:767px){.ui.page.grid{width:auto;padding-left:0;padding-right:0;margin-left:0;margin-right:0}}@media only screen and (min-width:768px) and (max-width:991px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:2em;padding-right:2em}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:3%;padding-right:3%}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:15%;padding-right:15%}}@media only screen and (min-width:1920px){.ui.page.grid{width:auto;margin-left:0;margin-right:0;padding-left:23%;padding-right:23%}}.ui.grid>.column:only-child,.ui.grid>.row>.column:only-child{width:100%}.ui[class*=\"one column\"].grid>.column:not(.row),.ui[class*=\"one column\"].grid>.row>.column{width:100%}.ui[class*=\"two column\"].grid>.column:not(.row),.ui[class*=\"two column\"].grid>.row>.column{width:50%}.ui[class*=\"three column\"].grid>.column:not(.row),.ui[class*=\"three column\"].grid>.row>.column{width:33.33333333%}.ui[class*=\"four column\"].grid>.column:not(.row),.ui[class*=\"four column\"].grid>.row>.column{width:25%}.ui[class*=\"five column\"].grid>.column:not(.row),.ui[class*=\"five column\"].grid>.row>.column{width:20%}.ui[class*=\"six column\"].grid>.column:not(.row),.ui[class*=\"six column\"].grid>.row>.column{width:16.66666667%}.ui[class*=\"seven column\"].grid>.column:not(.row),.ui[class*=\"seven column\"].grid>.row>.column{width:14.28571429%}.ui[class*=\"eight column\"].grid>.column:not(.row),.ui[class*=\"eight column\"].grid>.row>.column{width:12.5%}.ui[class*=\"nine column\"].grid>.column:not(.row),.ui[class*=\"nine column\"].grid>.row>.column{width:11.11111111%}.ui[class*=\"ten column\"].grid>.column:not(.row),.ui[class*=\"ten column\"].grid>.row>.column{width:10%}.ui[class*=\"eleven column\"].grid>.column:not(.row),.ui[class*=\"eleven column\"].grid>.row>.column{width:9.09090909%}.ui[class*=\"twelve column\"].grid>.column:not(.row),.ui[class*=\"twelve column\"].grid>.row>.column{width:8.33333333%}.ui[class*=\"thirteen column\"].grid>.column:not(.row),.ui[class*=\"thirteen column\"].grid>.row>.column{width:7.69230769%}.ui[class*=\"fourteen column\"].grid>.column:not(.row),.ui[class*=\"fourteen column\"].grid>.row>.column{width:7.14285714%}.ui[class*=\"fifteen column\"].grid>.column:not(.row),.ui[class*=\"fifteen column\"].grid>.row>.column{width:6.66666667%}.ui[class*=\"sixteen column\"].grid>.column:not(.row),.ui[class*=\"sixteen column\"].grid>.row>.column{width:6.25%}.ui.grid>[class*=\"one column\"].row>.column{width:100%!important}.ui.grid>[class*=\"two column\"].row>.column{width:50%!important}.ui.grid>[class*=\"three column\"].row>.column{width:33.33333333%!important}.ui.grid>[class*=\"four column\"].row>.column{width:25%!important}.ui.grid>[class*=\"five column\"].row>.column{width:20%!important}.ui.grid>[class*=\"six column\"].row>.column{width:16.66666667%!important}.ui.grid>[class*=\"seven column\"].row>.column{width:14.28571429%!important}.ui.grid>[class*=\"eight column\"].row>.column{width:12.5%!important}.ui.grid>[class*=\"nine column\"].row>.column{width:11.11111111%!important}.ui.grid>[class*=\"ten column\"].row>.column{width:10%!important}.ui.grid>[class*=\"eleven column\"].row>.column{width:9.09090909%!important}.ui.grid>[class*=\"twelve column\"].row>.column{width:8.33333333%!important}.ui.grid>[class*=\"thirteen column\"].row>.column{width:7.69230769%!important}.ui.grid>[class*=\"fourteen column\"].row>.column{width:7.14285714%!important}.ui.grid>[class*=\"fifteen column\"].row>.column{width:6.66666667%!important}.ui.grid>[class*=\"sixteen column\"].row>.column{width:6.25%!important}.ui.celled.page.grid{-webkit-box-shadow:none;box-shadow:none}.ui.column.grid>[class*=\"one wide\"].column,.ui.grid>.column.row>[class*=\"one wide\"].column,.ui.grid>.row>[class*=\"one wide\"].column,.ui.grid>[class*=\"one wide\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide\"].column,.ui.grid>.column.row>[class*=\"two wide\"].column,.ui.grid>.row>[class*=\"two wide\"].column,.ui.grid>[class*=\"two wide\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide\"].column,.ui.grid>.column.row>[class*=\"three wide\"].column,.ui.grid>.row>[class*=\"three wide\"].column,.ui.grid>[class*=\"three wide\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide\"].column,.ui.grid>.column.row>[class*=\"four wide\"].column,.ui.grid>.row>[class*=\"four wide\"].column,.ui.grid>[class*=\"four wide\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide\"].column,.ui.grid>.column.row>[class*=\"five wide\"].column,.ui.grid>.row>[class*=\"five wide\"].column,.ui.grid>[class*=\"five wide\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide\"].column,.ui.grid>.column.row>[class*=\"six wide\"].column,.ui.grid>.row>[class*=\"six wide\"].column,.ui.grid>[class*=\"six wide\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide\"].column,.ui.grid>.column.row>[class*=\"seven wide\"].column,.ui.grid>.row>[class*=\"seven wide\"].column,.ui.grid>[class*=\"seven wide\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide\"].column,.ui.grid>.column.row>[class*=\"eight wide\"].column,.ui.grid>.row>[class*=\"eight wide\"].column,.ui.grid>[class*=\"eight wide\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide\"].column,.ui.grid>.column.row>[class*=\"nine wide\"].column,.ui.grid>.row>[class*=\"nine wide\"].column,.ui.grid>[class*=\"nine wide\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide\"].column,.ui.grid>.column.row>[class*=\"ten wide\"].column,.ui.grid>.row>[class*=\"ten wide\"].column,.ui.grid>[class*=\"ten wide\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide\"].column,.ui.grid>.column.row>[class*=\"eleven wide\"].column,.ui.grid>.row>[class*=\"eleven wide\"].column,.ui.grid>[class*=\"eleven wide\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide\"].column,.ui.grid>.column.row>[class*=\"twelve wide\"].column,.ui.grid>.row>[class*=\"twelve wide\"].column,.ui.grid>[class*=\"twelve wide\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide\"].column,.ui.grid>.column.row>[class*=\"thirteen wide\"].column,.ui.grid>.row>[class*=\"thirteen wide\"].column,.ui.grid>[class*=\"thirteen wide\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide\"].column,.ui.grid>.column.row>[class*=\"fourteen wide\"].column,.ui.grid>.row>[class*=\"fourteen wide\"].column,.ui.grid>[class*=\"fourteen wide\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide\"].column,.ui.grid>.column.row>[class*=\"fifteen wide\"].column,.ui.grid>.row>[class*=\"fifteen wide\"].column,.ui.grid>[class*=\"fifteen wide\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide\"].column,.ui.grid>.column.row>[class*=\"sixteen wide\"].column,.ui.grid>.row>[class*=\"sixteen wide\"].column,.ui.grid>[class*=\"sixteen wide\"].column{width:100%!important}@media only screen and (min-width:320px) and (max-width:767px){.ui.column.grid>[class*=\"one wide mobile\"].column,.ui.grid>.column.row>[class*=\"one wide mobile\"].column,.ui.grid>.row>[class*=\"one wide mobile\"].column,.ui.grid>[class*=\"one wide mobile\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide mobile\"].column,.ui.grid>.column.row>[class*=\"two wide mobile\"].column,.ui.grid>.row>[class*=\"two wide mobile\"].column,.ui.grid>[class*=\"two wide mobile\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide mobile\"].column,.ui.grid>.column.row>[class*=\"three wide mobile\"].column,.ui.grid>.row>[class*=\"three wide mobile\"].column,.ui.grid>[class*=\"three wide mobile\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide mobile\"].column,.ui.grid>.column.row>[class*=\"four wide mobile\"].column,.ui.grid>.row>[class*=\"four wide mobile\"].column,.ui.grid>[class*=\"four wide mobile\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide mobile\"].column,.ui.grid>.column.row>[class*=\"five wide mobile\"].column,.ui.grid>.row>[class*=\"five wide mobile\"].column,.ui.grid>[class*=\"five wide mobile\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide mobile\"].column,.ui.grid>.column.row>[class*=\"six wide mobile\"].column,.ui.grid>.row>[class*=\"six wide mobile\"].column,.ui.grid>[class*=\"six wide mobile\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide mobile\"].column,.ui.grid>.column.row>[class*=\"seven wide mobile\"].column,.ui.grid>.row>[class*=\"seven wide mobile\"].column,.ui.grid>[class*=\"seven wide mobile\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide mobile\"].column,.ui.grid>.column.row>[class*=\"eight wide mobile\"].column,.ui.grid>.row>[class*=\"eight wide mobile\"].column,.ui.grid>[class*=\"eight wide mobile\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide mobile\"].column,.ui.grid>.column.row>[class*=\"nine wide mobile\"].column,.ui.grid>.row>[class*=\"nine wide mobile\"].column,.ui.grid>[class*=\"nine wide mobile\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide mobile\"].column,.ui.grid>.column.row>[class*=\"ten wide mobile\"].column,.ui.grid>.row>[class*=\"ten wide mobile\"].column,.ui.grid>[class*=\"ten wide mobile\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide mobile\"].column,.ui.grid>.column.row>[class*=\"eleven wide mobile\"].column,.ui.grid>.row>[class*=\"eleven wide mobile\"].column,.ui.grid>[class*=\"eleven wide mobile\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide mobile\"].column,.ui.grid>.column.row>[class*=\"twelve wide mobile\"].column,.ui.grid>.row>[class*=\"twelve wide mobile\"].column,.ui.grid>[class*=\"twelve wide mobile\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"thirteen wide mobile\"].column,.ui.grid>.row>[class*=\"thirteen wide mobile\"].column,.ui.grid>[class*=\"thirteen wide mobile\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"fourteen wide mobile\"].column,.ui.grid>.row>[class*=\"fourteen wide mobile\"].column,.ui.grid>[class*=\"fourteen wide mobile\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"fifteen wide mobile\"].column,.ui.grid>.row>[class*=\"fifteen wide mobile\"].column,.ui.grid>[class*=\"fifteen wide mobile\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide mobile\"].column,.ui.grid>.column.row>[class*=\"sixteen wide mobile\"].column,.ui.grid>.row>[class*=\"sixteen wide mobile\"].column,.ui.grid>[class*=\"sixteen wide mobile\"].column{width:100%!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.column.grid>[class*=\"one wide tablet\"].column,.ui.grid>.column.row>[class*=\"one wide tablet\"].column,.ui.grid>.row>[class*=\"one wide tablet\"].column,.ui.grid>[class*=\"one wide tablet\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide tablet\"].column,.ui.grid>.column.row>[class*=\"two wide tablet\"].column,.ui.grid>.row>[class*=\"two wide tablet\"].column,.ui.grid>[class*=\"two wide tablet\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide tablet\"].column,.ui.grid>.column.row>[class*=\"three wide tablet\"].column,.ui.grid>.row>[class*=\"three wide tablet\"].column,.ui.grid>[class*=\"three wide tablet\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide tablet\"].column,.ui.grid>.column.row>[class*=\"four wide tablet\"].column,.ui.grid>.row>[class*=\"four wide tablet\"].column,.ui.grid>[class*=\"four wide tablet\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide tablet\"].column,.ui.grid>.column.row>[class*=\"five wide tablet\"].column,.ui.grid>.row>[class*=\"five wide tablet\"].column,.ui.grid>[class*=\"five wide tablet\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide tablet\"].column,.ui.grid>.column.row>[class*=\"six wide tablet\"].column,.ui.grid>.row>[class*=\"six wide tablet\"].column,.ui.grid>[class*=\"six wide tablet\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide tablet\"].column,.ui.grid>.column.row>[class*=\"seven wide tablet\"].column,.ui.grid>.row>[class*=\"seven wide tablet\"].column,.ui.grid>[class*=\"seven wide tablet\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide tablet\"].column,.ui.grid>.column.row>[class*=\"eight wide tablet\"].column,.ui.grid>.row>[class*=\"eight wide tablet\"].column,.ui.grid>[class*=\"eight wide tablet\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide tablet\"].column,.ui.grid>.column.row>[class*=\"nine wide tablet\"].column,.ui.grid>.row>[class*=\"nine wide tablet\"].column,.ui.grid>[class*=\"nine wide tablet\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide tablet\"].column,.ui.grid>.column.row>[class*=\"ten wide tablet\"].column,.ui.grid>.row>[class*=\"ten wide tablet\"].column,.ui.grid>[class*=\"ten wide tablet\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide tablet\"].column,.ui.grid>.column.row>[class*=\"eleven wide tablet\"].column,.ui.grid>.row>[class*=\"eleven wide tablet\"].column,.ui.grid>[class*=\"eleven wide tablet\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide tablet\"].column,.ui.grid>.column.row>[class*=\"twelve wide tablet\"].column,.ui.grid>.row>[class*=\"twelve wide tablet\"].column,.ui.grid>[class*=\"twelve wide tablet\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"thirteen wide tablet\"].column,.ui.grid>.row>[class*=\"thirteen wide tablet\"].column,.ui.grid>[class*=\"thirteen wide tablet\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"fourteen wide tablet\"].column,.ui.grid>.row>[class*=\"fourteen wide tablet\"].column,.ui.grid>[class*=\"fourteen wide tablet\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"fifteen wide tablet\"].column,.ui.grid>.row>[class*=\"fifteen wide tablet\"].column,.ui.grid>[class*=\"fifteen wide tablet\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide tablet\"].column,.ui.grid>.column.row>[class*=\"sixteen wide tablet\"].column,.ui.grid>.row>[class*=\"sixteen wide tablet\"].column,.ui.grid>[class*=\"sixteen wide tablet\"].column{width:100%!important}}@media only screen and (min-width:992px){.ui.column.grid>[class*=\"one wide computer\"].column,.ui.grid>.column.row>[class*=\"one wide computer\"].column,.ui.grid>.row>[class*=\"one wide computer\"].column,.ui.grid>[class*=\"one wide computer\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide computer\"].column,.ui.grid>.column.row>[class*=\"two wide computer\"].column,.ui.grid>.row>[class*=\"two wide computer\"].column,.ui.grid>[class*=\"two wide computer\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide computer\"].column,.ui.grid>.column.row>[class*=\"three wide computer\"].column,.ui.grid>.row>[class*=\"three wide computer\"].column,.ui.grid>[class*=\"three wide computer\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide computer\"].column,.ui.grid>.column.row>[class*=\"four wide computer\"].column,.ui.grid>.row>[class*=\"four wide computer\"].column,.ui.grid>[class*=\"four wide computer\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide computer\"].column,.ui.grid>.column.row>[class*=\"five wide computer\"].column,.ui.grid>.row>[class*=\"five wide computer\"].column,.ui.grid>[class*=\"five wide computer\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide computer\"].column,.ui.grid>.column.row>[class*=\"six wide computer\"].column,.ui.grid>.row>[class*=\"six wide computer\"].column,.ui.grid>[class*=\"six wide computer\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide computer\"].column,.ui.grid>.column.row>[class*=\"seven wide computer\"].column,.ui.grid>.row>[class*=\"seven wide computer\"].column,.ui.grid>[class*=\"seven wide computer\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide computer\"].column,.ui.grid>.column.row>[class*=\"eight wide computer\"].column,.ui.grid>.row>[class*=\"eight wide computer\"].column,.ui.grid>[class*=\"eight wide computer\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide computer\"].column,.ui.grid>.column.row>[class*=\"nine wide computer\"].column,.ui.grid>.row>[class*=\"nine wide computer\"].column,.ui.grid>[class*=\"nine wide computer\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide computer\"].column,.ui.grid>.column.row>[class*=\"ten wide computer\"].column,.ui.grid>.row>[class*=\"ten wide computer\"].column,.ui.grid>[class*=\"ten wide computer\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide computer\"].column,.ui.grid>.column.row>[class*=\"eleven wide computer\"].column,.ui.grid>.row>[class*=\"eleven wide computer\"].column,.ui.grid>[class*=\"eleven wide computer\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide computer\"].column,.ui.grid>.column.row>[class*=\"twelve wide computer\"].column,.ui.grid>.row>[class*=\"twelve wide computer\"].column,.ui.grid>[class*=\"twelve wide computer\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide computer\"].column,.ui.grid>.column.row>[class*=\"thirteen wide computer\"].column,.ui.grid>.row>[class*=\"thirteen wide computer\"].column,.ui.grid>[class*=\"thirteen wide computer\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide computer\"].column,.ui.grid>.column.row>[class*=\"fourteen wide computer\"].column,.ui.grid>.row>[class*=\"fourteen wide computer\"].column,.ui.grid>[class*=\"fourteen wide computer\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide computer\"].column,.ui.grid>.column.row>[class*=\"fifteen wide computer\"].column,.ui.grid>.row>[class*=\"fifteen wide computer\"].column,.ui.grid>[class*=\"fifteen wide computer\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide computer\"].column,.ui.grid>.column.row>[class*=\"sixteen wide computer\"].column,.ui.grid>.row>[class*=\"sixteen wide computer\"].column,.ui.grid>[class*=\"sixteen wide computer\"].column{width:100%!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.column.grid>[class*=\"one wide large screen\"].column,.ui.grid>.column.row>[class*=\"one wide large screen\"].column,.ui.grid>.row>[class*=\"one wide large screen\"].column,.ui.grid>[class*=\"one wide large screen\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide large screen\"].column,.ui.grid>.column.row>[class*=\"two wide large screen\"].column,.ui.grid>.row>[class*=\"two wide large screen\"].column,.ui.grid>[class*=\"two wide large screen\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide large screen\"].column,.ui.grid>.column.row>[class*=\"three wide large screen\"].column,.ui.grid>.row>[class*=\"three wide large screen\"].column,.ui.grid>[class*=\"three wide large screen\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide large screen\"].column,.ui.grid>.column.row>[class*=\"four wide large screen\"].column,.ui.grid>.row>[class*=\"four wide large screen\"].column,.ui.grid>[class*=\"four wide large screen\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide large screen\"].column,.ui.grid>.column.row>[class*=\"five wide large screen\"].column,.ui.grid>.row>[class*=\"five wide large screen\"].column,.ui.grid>[class*=\"five wide large screen\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide large screen\"].column,.ui.grid>.column.row>[class*=\"six wide large screen\"].column,.ui.grid>.row>[class*=\"six wide large screen\"].column,.ui.grid>[class*=\"six wide large screen\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide large screen\"].column,.ui.grid>.column.row>[class*=\"seven wide large screen\"].column,.ui.grid>.row>[class*=\"seven wide large screen\"].column,.ui.grid>[class*=\"seven wide large screen\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide large screen\"].column,.ui.grid>.column.row>[class*=\"eight wide large screen\"].column,.ui.grid>.row>[class*=\"eight wide large screen\"].column,.ui.grid>[class*=\"eight wide large screen\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide large screen\"].column,.ui.grid>.column.row>[class*=\"nine wide large screen\"].column,.ui.grid>.row>[class*=\"nine wide large screen\"].column,.ui.grid>[class*=\"nine wide large screen\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide large screen\"].column,.ui.grid>.column.row>[class*=\"ten wide large screen\"].column,.ui.grid>.row>[class*=\"ten wide large screen\"].column,.ui.grid>[class*=\"ten wide large screen\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide large screen\"].column,.ui.grid>.column.row>[class*=\"eleven wide large screen\"].column,.ui.grid>.row>[class*=\"eleven wide large screen\"].column,.ui.grid>[class*=\"eleven wide large screen\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide large screen\"].column,.ui.grid>.column.row>[class*=\"twelve wide large screen\"].column,.ui.grid>.row>[class*=\"twelve wide large screen\"].column,.ui.grid>[class*=\"twelve wide large screen\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"thirteen wide large screen\"].column,.ui.grid>.row>[class*=\"thirteen wide large screen\"].column,.ui.grid>[class*=\"thirteen wide large screen\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"fourteen wide large screen\"].column,.ui.grid>.row>[class*=\"fourteen wide large screen\"].column,.ui.grid>[class*=\"fourteen wide large screen\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"fifteen wide large screen\"].column,.ui.grid>.row>[class*=\"fifteen wide large screen\"].column,.ui.grid>[class*=\"fifteen wide large screen\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide large screen\"].column,.ui.grid>.column.row>[class*=\"sixteen wide large screen\"].column,.ui.grid>.row>[class*=\"sixteen wide large screen\"].column,.ui.grid>[class*=\"sixteen wide large screen\"].column{width:100%!important}}@media only screen and (min-width:1920px){.ui.column.grid>[class*=\"one wide widescreen\"].column,.ui.grid>.column.row>[class*=\"one wide widescreen\"].column,.ui.grid>.row>[class*=\"one wide widescreen\"].column,.ui.grid>[class*=\"one wide widescreen\"].column{width:6.25%!important}.ui.column.grid>[class*=\"two wide widescreen\"].column,.ui.grid>.column.row>[class*=\"two wide widescreen\"].column,.ui.grid>.row>[class*=\"two wide widescreen\"].column,.ui.grid>[class*=\"two wide widescreen\"].column{width:12.5%!important}.ui.column.grid>[class*=\"three wide widescreen\"].column,.ui.grid>.column.row>[class*=\"three wide widescreen\"].column,.ui.grid>.row>[class*=\"three wide widescreen\"].column,.ui.grid>[class*=\"three wide widescreen\"].column{width:18.75%!important}.ui.column.grid>[class*=\"four wide widescreen\"].column,.ui.grid>.column.row>[class*=\"four wide widescreen\"].column,.ui.grid>.row>[class*=\"four wide widescreen\"].column,.ui.grid>[class*=\"four wide widescreen\"].column{width:25%!important}.ui.column.grid>[class*=\"five wide widescreen\"].column,.ui.grid>.column.row>[class*=\"five wide widescreen\"].column,.ui.grid>.row>[class*=\"five wide widescreen\"].column,.ui.grid>[class*=\"five wide widescreen\"].column{width:31.25%!important}.ui.column.grid>[class*=\"six wide widescreen\"].column,.ui.grid>.column.row>[class*=\"six wide widescreen\"].column,.ui.grid>.row>[class*=\"six wide widescreen\"].column,.ui.grid>[class*=\"six wide widescreen\"].column{width:37.5%!important}.ui.column.grid>[class*=\"seven wide widescreen\"].column,.ui.grid>.column.row>[class*=\"seven wide widescreen\"].column,.ui.grid>.row>[class*=\"seven wide widescreen\"].column,.ui.grid>[class*=\"seven wide widescreen\"].column{width:43.75%!important}.ui.column.grid>[class*=\"eight wide widescreen\"].column,.ui.grid>.column.row>[class*=\"eight wide widescreen\"].column,.ui.grid>.row>[class*=\"eight wide widescreen\"].column,.ui.grid>[class*=\"eight wide widescreen\"].column{width:50%!important}.ui.column.grid>[class*=\"nine wide widescreen\"].column,.ui.grid>.column.row>[class*=\"nine wide widescreen\"].column,.ui.grid>.row>[class*=\"nine wide widescreen\"].column,.ui.grid>[class*=\"nine wide widescreen\"].column{width:56.25%!important}.ui.column.grid>[class*=\"ten wide widescreen\"].column,.ui.grid>.column.row>[class*=\"ten wide widescreen\"].column,.ui.grid>.row>[class*=\"ten wide widescreen\"].column,.ui.grid>[class*=\"ten wide widescreen\"].column{width:62.5%!important}.ui.column.grid>[class*=\"eleven wide widescreen\"].column,.ui.grid>.column.row>[class*=\"eleven wide widescreen\"].column,.ui.grid>.row>[class*=\"eleven wide widescreen\"].column,.ui.grid>[class*=\"eleven wide widescreen\"].column{width:68.75%!important}.ui.column.grid>[class*=\"twelve wide widescreen\"].column,.ui.grid>.column.row>[class*=\"twelve wide widescreen\"].column,.ui.grid>.row>[class*=\"twelve wide widescreen\"].column,.ui.grid>[class*=\"twelve wide widescreen\"].column{width:75%!important}.ui.column.grid>[class*=\"thirteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"thirteen wide widescreen\"].column,.ui.grid>.row>[class*=\"thirteen wide widescreen\"].column,.ui.grid>[class*=\"thirteen wide widescreen\"].column{width:81.25%!important}.ui.column.grid>[class*=\"fourteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"fourteen wide widescreen\"].column,.ui.grid>.row>[class*=\"fourteen wide widescreen\"].column,.ui.grid>[class*=\"fourteen wide widescreen\"].column{width:87.5%!important}.ui.column.grid>[class*=\"fifteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"fifteen wide widescreen\"].column,.ui.grid>.row>[class*=\"fifteen wide widescreen\"].column,.ui.grid>[class*=\"fifteen wide widescreen\"].column{width:93.75%!important}.ui.column.grid>[class*=\"sixteen wide widescreen\"].column,.ui.grid>.column.row>[class*=\"sixteen wide widescreen\"].column,.ui.grid>.row>[class*=\"sixteen wide widescreen\"].column,.ui.grid>[class*=\"sixteen wide widescreen\"].column{width:100%!important}}.ui.centered.grid,.ui.centered.grid>.row,.ui.grid>.centered.row{text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.centered.grid>.column:not(.aligned):not(.justified):not(.row),.ui.centered.grid>.row>.column:not(.aligned):not(.justified),.ui.grid .centered.row>.column:not(.aligned):not(.justified){text-align:left}.ui.grid>.centered.column,.ui.grid>.row>.centered.column{display:block;margin-left:auto;margin-right:auto}.ui.grid>.relaxed.row>.column,.ui.relaxed.grid>.column:not(.row),.ui.relaxed.grid>.row>.column{padding-left:1.5rem;padding-right:1.5rem}.ui.grid>[class*=\"very relaxed\"].row>.column,.ui[class*=\"very relaxed\"].grid>.column:not(.row),.ui[class*=\"very relaxed\"].grid>.row>.column{padding-left:2.5rem;padding-right:2.5rem}.ui.grid .relaxed.row+.ui.divider,.ui.relaxed.grid .row+.ui.divider{margin-left:1.5rem;margin-right:1.5rem}.ui.grid [class*=\"very relaxed\"].row+.ui.divider,.ui[class*=\"very relaxed\"].grid .row+.ui.divider{margin-left:2.5rem;margin-right:2.5rem}.ui.padded.grid:not(.vertically):not(.horizontally){margin:0!important}[class*=\"horizontally padded\"].ui.grid{margin-left:0!important;margin-right:0!important}[class*=\"vertically padded\"].ui.grid{margin-top:0!important;margin-bottom:0!important}.ui.grid [class*=\"left floated\"].column{margin-right:auto}.ui.grid [class*=\"right floated\"].column{margin-left:auto}.ui.divided.grid:not([class*=\"vertically divided\"])>.column:not(.row),.ui.divided.grid:not([class*=\"vertically divided\"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"vertically divided\"].grid>.column:not(.row),.ui[class*=\"vertically divided\"].grid>.row>.column{margin-top:1rem;margin-bottom:1rem;padding-top:0;padding-bottom:0}.ui[class*=\"vertically divided\"].grid>.row{margin-top:0;margin-bottom:0}.ui.divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui.divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"vertically divided\"].grid>.row:first-child>.column{margin-top:0}.ui.grid>.divided.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui.grid>.divided.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"vertically divided\"].grid>.row{position:relative}.ui[class*=\"vertically divided\"].grid>.row:before{position:absolute;content:\"\";top:0;left:0;width:calc(100% - 2rem);height:1px;margin:0 1rem;-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.padded.divided.grid:not(.vertically):not(.horizontally),[class*=\"horizontally padded\"].ui.divided.grid{width:100%}.ui[class*=\"vertically divided\"].grid>.row:first-child:before{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.column:not(.row),.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.row>.column{-webkit-box-shadow:-1px 0 0 0 rgba(255,255,255,.1);box-shadow:-1px 0 0 0 rgba(255,255,255,.1)}.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.column:not(.row):first-child,.ui.inverted.divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.inverted[class*=\"vertically divided\"].grid>.row:before{-webkit-box-shadow:0 -1px 0 0 rgba(255,255,255,.1);box-shadow:0 -1px 0 0 rgba(255,255,255,.1)}.ui.relaxed[class*=\"vertically divided\"].grid>.row:before{margin-left:1.5rem;margin-right:1.5rem;width:calc(100% - 3rem)}.ui[class*=\"very relaxed\"][class*=\"vertically divided\"].grid>.row:before{margin-left:5rem;margin-right:5rem;width:calc(100% - 5rem)}.ui.celled.grid{width:100%;margin:1em 0;-webkit-box-shadow:0 0 0 1px #d4d4d5;box-shadow:0 0 0 1px #d4d4d5}.ui.celled.grid>.row{width:100%!important;margin:0;padding:0;-webkit-box-shadow:0 -1px 0 0 #d4d4d5;box-shadow:0 -1px 0 0 #d4d4d5}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui.celled.grid>.column:first-child,.ui.celled.grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.celled.grid>.column:not(.row),.ui.celled.grid>.row>.column{padding:1em}.ui.relaxed.celled.grid>.column:not(.row),.ui.relaxed.celled.grid>.row>.column{padding:1.5em}.ui[class*=\"very relaxed\"].celled.grid>.column:not(.row),.ui[class*=\"very relaxed\"].celled.grid>.row>.column{padding:2em}.ui[class*=\"internally celled\"].grid{-webkit-box-shadow:none;box-shadow:none;margin:0}.ui[class*=\"internally celled\"].grid>.row:first-child{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"internally celled\"].grid>.row>.column:first-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid>.row>[class*=\"top aligned\"].column,.ui.grid>[class*=\"top aligned\"].column:not(.row),.ui.grid>[class*=\"top aligned\"].row>.column,.ui[class*=\"top aligned\"].grid>.column:not(.row),.ui[class*=\"top aligned\"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:top;-ms-flex-item-align:start!important;align-self:flex-start!important}.ui.grid>.row>[class*=\"middle aligned\"].column,.ui.grid>[class*=\"middle aligned\"].column:not(.row),.ui.grid>[class*=\"middle aligned\"].row>.column,.ui[class*=\"middle aligned\"].grid>.column:not(.row),.ui[class*=\"middle aligned\"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:middle;-ms-flex-item-align:center!important;align-self:center!important}.ui.grid>.row>[class*=\"bottom aligned\"].column,.ui.grid>[class*=\"bottom aligned\"].column:not(.row),.ui.grid>[class*=\"bottom aligned\"].row>.column,.ui[class*=\"bottom aligned\"].grid>.column:not(.row),.ui[class*=\"bottom aligned\"].grid>.row>.column{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;vertical-align:bottom;-ms-flex-item-align:end!important;align-self:flex-end!important}.ui.grid>.row>.stretched.column,.ui.grid>.stretched.column:not(.row),.ui.grid>.stretched.row>.column,.ui.stretched.grid>.column,.ui.stretched.grid>.row>.column{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-ms-flex-item-align:stretch;align-self:stretch;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.grid>.row>.stretched.column>*,.ui.grid>.stretched.column:not(.row)>*,.ui.grid>.stretched.row>.column>*,.ui.stretched.grid>.column>*,.ui.stretched.grid>.row>.column>*{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>.row>[class*=\"left aligned\"].column.column,.ui.grid>[class*=\"left aligned\"].column.column,.ui.grid>[class*=\"left aligned\"].row>.column,.ui[class*=\"left aligned\"].grid>.column,.ui[class*=\"left aligned\"].grid>.row>.column{text-align:left;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.row>[class*=\"center aligned\"].column.column,.ui.grid>[class*=\"center aligned\"].column.column,.ui.grid>[class*=\"center aligned\"].row>.column,.ui[class*=\"center aligned\"].grid>.column,.ui[class*=\"center aligned\"].grid>.row>.column{text-align:center;-ms-flex-item-align:inherit;align-self:inherit}.ui[class*=\"center aligned\"].grid{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.grid>.row>[class*=\"right aligned\"].column.column,.ui.grid>[class*=\"right aligned\"].column.column,.ui.grid>[class*=\"right aligned\"].row>.column,.ui[class*=\"right aligned\"].grid>.column,.ui[class*=\"right aligned\"].grid>.row>.column{text-align:right;-ms-flex-item-align:inherit;align-self:inherit}.ui.grid>.justified.column.column,.ui.grid>.justified.row>.column,.ui.grid>.row>.justified.column.column,.ui.justified.grid>.column,.ui.justified.grid>.row>.column{text-align:justify;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto}.ui.grid>.row>.black.column,.ui.grid>.row>.blue.column,.ui.grid>.row>.brown.column,.ui.grid>.row>.green.column,.ui.grid>.row>.grey.column,.ui.grid>.row>.olive.column,.ui.grid>.row>.orange.column,.ui.grid>.row>.pink.column,.ui.grid>.row>.purple.column,.ui.grid>.row>.red.column,.ui.grid>.row>.teal.column,.ui.grid>.row>.violet.column,.ui.grid>.row>.yellow.column{margin-top:-1rem;margin-bottom:-1rem;padding-top:1rem;padding-bottom:1rem}.ui.grid>.red.column,.ui.grid>.red.row,.ui.grid>.row>.red.column{background-color:#db2828!important;color:#fff}.ui.grid>.orange.column,.ui.grid>.orange.row,.ui.grid>.row>.orange.column{background-color:#f2711c!important;color:#fff}.ui.grid>.row>.yellow.column,.ui.grid>.yellow.column,.ui.grid>.yellow.row{background-color:#fbbd08!important;color:#fff}.ui.grid>.olive.column,.ui.grid>.olive.row,.ui.grid>.row>.olive.column{background-color:#b5cc18!important;color:#fff}.ui.grid>.green.column,.ui.grid>.green.row,.ui.grid>.row>.green.column{background-color:#21ba45!important;color:#fff}.ui.grid>.row>.teal.column,.ui.grid>.teal.column,.ui.grid>.teal.row{background-color:#00b5ad!important;color:#fff}.ui.grid>.blue.column,.ui.grid>.blue.row,.ui.grid>.row>.blue.column{background-color:#2185d0!important;color:#fff}.ui.grid>.row>.violet.column,.ui.grid>.violet.column,.ui.grid>.violet.row{background-color:#6435c9!important;color:#fff}.ui.grid>.purple.column,.ui.grid>.purple.row,.ui.grid>.row>.purple.column{background-color:#a333c8!important;color:#fff}.ui.grid>.pink.column,.ui.grid>.pink.row,.ui.grid>.row>.pink.column{background-color:#e03997!important;color:#fff}.ui.grid>.brown.column,.ui.grid>.brown.row,.ui.grid>.row>.brown.column{background-color:#a5673f!important;color:#fff}.ui.grid>.grey.column,.ui.grid>.grey.row,.ui.grid>.row>.grey.column{background-color:#767676!important;color:#fff}.ui.grid>.black.column,.ui.grid>.black.row,.ui.grid>.row>.black.column{background-color:#1b1c1d!important;color:#fff}.ui.grid>[class*=\"equal width\"].row>.column,.ui[class*=\"equal width\"].grid>.column:not(.row),.ui[class*=\"equal width\"].grid>.row>.column{display:inline-block;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.ui.grid>[class*=\"equal width\"].row>.wide.column,.ui[class*=\"equal width\"].grid>.row>.wide.column,.ui[class*=\"equal width\"].grid>.wide.column{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}@media only screen and (max-width:767px){.ui.grid>[class*=\"mobile reversed\"].row,.ui[class*=\"mobile reversed\"].grid,.ui[class*=\"mobile reversed\"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui.stackable[class*=\"mobile reversed\"],.ui[class*=\"mobile vertically reversed\"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:last-child,.ui[class*=\"mobile reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*=\"vertically divided\"][class*=\"mobile vertically reversed\"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"mobile reversed\"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*=\"mobile reversed\"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991px){.ui.grid>[class*=\"tablet reversed\"].row,.ui[class*=\"tablet reversed\"].grid,.ui[class*=\"tablet reversed\"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*=\"tablet vertically reversed\"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:last-child,.ui[class*=\"tablet reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*=\"vertically divided\"][class*=\"tablet vertically reversed\"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"tablet reversed\"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*=\"tablet reversed\"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:992px){.ui.grid>[class*=\"computer reversed\"].row,.ui[class*=\"computer reversed\"].grid,.ui[class*=\"computer reversed\"].grid>.row{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ui[class*=\"computer vertically reversed\"].grid{-webkit-box-orient:vertical;-webkit-box-direction:reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:first-child,.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 0 rgba(34,36,38,.15)}.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.column:last-child,.ui[class*=\"computer reversed\"].divided.grid:not([class*=\"vertically divided\"])>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}.ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"]>.row:first-child:before{-webkit-box-shadow:0 -1px 0 0 rgba(34,36,38,.15);box-shadow:0 -1px 0 0 rgba(34,36,38,.15)}.ui.grid[class*=\"vertically divided\"][class*=\"computer vertically reversed\"]>.row:last-child:before{-webkit-box-shadow:none;box-shadow:none}.ui[class*=\"computer reversed\"].celled.grid>.row>.column:first-child{-webkit-box-shadow:-1px 0 0 0 #d4d4d5;box-shadow:-1px 0 0 0 #d4d4d5}.ui[class*=\"computer reversed\"].celled.grid>.row>.column:last-child{-webkit-box-shadow:none;box-shadow:none}}@media only screen and (min-width:768px) and (max-width:991px){.ui.doubling.grid{width:auto}.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{display:inline-block!important;padding-top:1rem!important;padding-bottom:1rem!important;-webkit-box-shadow:none!important;box-shadow:none!important;margin:0}.ui.grid>[class*=\"two column\"].doubling.row.row>.column,.ui[class*=\"two column\"].doubling.grid>.column:not(.row),.ui[class*=\"two column\"].doubling.grid>.row>.column{width:100%!important}.ui.grid>[class*=\"three column\"].doubling.row.row>.column,.ui[class*=\"three column\"].doubling.grid>.column:not(.row),.ui[class*=\"three column\"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*=\"four column\"].doubling.row.row>.column,.ui[class*=\"four column\"].doubling.grid>.column:not(.row),.ui[class*=\"four column\"].doubling.grid>.row>.column{width:50%!important}.ui.grid>[class*=\"five column\"].doubling.row.row>.column,.ui[class*=\"five column\"].doubling.grid>.column:not(.row),.ui[class*=\"five column\"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"six column\"].doubling.row.row>.column,.ui[class*=\"six column\"].doubling.grid>.column:not(.row),.ui[class*=\"six column\"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"seven column\"].doubling.row.row>.column,.ui[class*=\"seven column\"].doubling.grid>.column:not(.row),.ui[class*=\"seven column\"].doubling.grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"eight column\"].doubling.row.row>.column,.ui[class*=\"eight column\"].doubling.grid>.column:not(.row),.ui[class*=\"eight column\"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*=\"nine column\"].doubling.row.row>.column,.ui[class*=\"nine column\"].doubling.grid>.column:not(.row),.ui[class*=\"nine column\"].doubling.grid>.row>.column{width:25%!important}.ui.grid>[class*=\"ten column\"].doubling.row.row>.column,.ui[class*=\"ten column\"].doubling.grid>.column:not(.row),.ui[class*=\"ten column\"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*=\"eleven column\"].doubling.row.row>.column,.ui[class*=\"eleven column\"].doubling.grid>.column:not(.row),.ui[class*=\"eleven column\"].doubling.grid>.row>.column{width:20%!important}.ui.grid>[class*=\"twelve column\"].doubling.row.row>.column,.ui[class*=\"twelve column\"].doubling.grid>.column:not(.row),.ui[class*=\"twelve column\"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*=\"thirteen column\"].doubling.row.row>.column,.ui[class*=\"thirteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"thirteen column\"].doubling.grid>.row>.column{width:16.66666667%!important}.ui.grid>[class*=\"fourteen column\"].doubling.row.row>.column,.ui[class*=\"fourteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"fourteen column\"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*=\"fifteen column\"].doubling.row.row>.column,.ui[class*=\"fifteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"fifteen column\"].doubling.grid>.row>.column{width:14.28571429%!important}.ui.grid>[class*=\"sixteen column\"].doubling.row.row>.column,.ui[class*=\"sixteen column\"].doubling.grid>.column:not(.row),.ui[class*=\"sixteen column\"].doubling.grid>.row>.column{width:12.5%!important}}@media only screen and (max-width:767px){.ui.doubling.grid>.row,.ui.grid>.doubling.row{margin:0!important;padding:0!important}.ui.doubling.grid>.row>.column,.ui.grid>.doubling.row>.column{padding-top:1rem!important;padding-bottom:1rem!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.grid>[class*=\"two column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"two column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"two column\"].doubling:not(.stackable).grid>.row>.column{width:100%!important}.ui.grid>[class*=\"three column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"three column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"three column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"four column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"four column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"four column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"five column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"five column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"five column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"six column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"six column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"six column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"seven column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"seven column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"seven column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"eight column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"eight column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"eight column\"].doubling:not(.stackable).grid>.row>.column{width:50%!important}.ui.grid>[class*=\"nine column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"nine column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"nine column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"ten column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"ten column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"ten column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"eleven column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"eleven column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"eleven column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"twelve column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"twelve column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"twelve column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"thirteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"thirteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"thirteen column\"].doubling:not(.stackable).grid>.row>.column{width:33.33333333%!important}.ui.grid>[class*=\"fourteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"fourteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"fourteen column\"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*=\"fifteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"fifteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"fifteen column\"].doubling:not(.stackable).grid>.row>.column{width:25%!important}.ui.grid>[class*=\"sixteen column\"].doubling:not(.stackable).row.row>.column,.ui[class*=\"sixteen column\"].doubling:not(.stackable).grid>.column:not(.row),.ui[class*=\"sixteen column\"].doubling:not(.stackable).grid>.row>.column{width:25%!important}}@media only screen and (max-width:767px){.ui.stackable.grid{width:auto;margin-left:0!important;margin-right:0!important}.ui.grid>.stackable.stackable.row>.column,.ui.stackable.grid>.column.grid>.column,.ui.stackable.grid>.column.row>.column,.ui.stackable.grid>.column:not(.row),.ui.stackable.grid>.row>.column,.ui.stackable.grid>.row>.wide.column,.ui.stackable.grid>.wide.column{width:100%!important;margin:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important;padding:1rem 1rem!important}.ui.stackable.grid:not(.vertically)>.row{margin:0;padding:0}.ui.container>.ui.stackable.grid>.column,.ui.container>.ui.stackable.grid>.row>.column{padding-left:0!important;padding-right:0!important}.ui.grid .ui.stackable.grid,.ui.segment:not(.vertical) .ui.stackable.page.grid{margin-left:-1rem!important;margin-right:-1rem!important}.ui.stackable.celled.grid>.column:not(.row):first-child,.ui.stackable.celled.grid>.row:first-child>.column:first-child,.ui.stackable.divided.grid>.column:not(.row):first-child,.ui.stackable.divided.grid>.row:first-child>.column:first-child{border-top:none!important}.ui.inverted.stackable.celled.grid>.column:not(.row),.ui.inverted.stackable.celled.grid>.row>.column,.ui.inverted.stackable.divided.grid>.column:not(.row),.ui.inverted.stackable.divided.grid>.row>.column{border-top:1px solid rgba(255,255,255,.1)}.ui.stackable.celled.grid>.column:not(.row),.ui.stackable.celled.grid>.row>.column,.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{border-top:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none!important;box-shadow:none!important;padding-top:2rem!important;padding-bottom:2rem!important}.ui.stackable.celled.grid>.row{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.stackable.divided:not(.vertically).grid>.column:not(.row),.ui.stackable.divided:not(.vertically).grid>.row>.column{padding-left:0!important;padding-right:0!important}}@media only screen and (max-width:767px){.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.mobile),.ui[class*=\"tablet only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"computer only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"computer only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"computer only\"].row:not(.mobile),.ui[class*=\"computer only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].row:not(.mobile),.ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.tablet),.ui[class*=\"mobile only\"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*=\"computer only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"computer only\"].column:not(.tablet),.ui.grid.grid.grid>[class*=\"computer only\"].row:not(.tablet),.ui[class*=\"computer only\"].grid.grid.grid:not(.tablet){display:none!important}.ui.grid.grid.grid>.row>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].row:not(.mobile),.ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.computer),.ui[class*=\"mobile only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.computer),.ui[class*=\"tablet only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"large screen only\"].row:not(.mobile),.ui[class*=\"large screen only\"].grid.grid.grid:not(.mobile){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1200px) and (max-width:1919px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.computer),.ui[class*=\"mobile only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.computer),.ui[class*=\"tablet only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].column:not(.mobile),.ui.grid.grid.grid>[class*=\"widescreen only\"].row:not(.mobile),.ui[class*=\"widescreen only\"].grid.grid.grid:not(.mobile){display:none!important}}@media only screen and (min-width:1920px){.ui.grid.grid.grid>.row>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"mobile only\"].row:not(.computer),.ui[class*=\"mobile only\"].grid.grid.grid:not(.computer){display:none!important}.ui.grid.grid.grid>.row>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].column:not(.computer),.ui.grid.grid.grid>[class*=\"tablet only\"].row:not(.computer),.ui[class*=\"tablet only\"].grid.grid.grid:not(.computer){display:none!important}}.ui.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1rem 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;font-weight:400;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem;min-height:2.85714286em}.ui.menu:after{content:'';display:block;height:0;clear:both;visibility:hidden}.ui.menu:first-child{margin-top:0}.ui.menu:last-child{margin-bottom:0}.ui.menu .menu{margin:0}.ui.menu:not(.vertical)>.menu{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.menu:not(.vertical) .item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.menu .item{position:relative;vertical-align:middle;line-height:1;text-decoration:none;-webkit-tap-highlight-color:transparent;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:0 0;padding:.92857143em 1.14285714em;text-transform:none;color:rgba(0,0,0,.87);font-weight:400;-webkit-transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease;transition:background .1s ease,box-shadow .1s ease,color .1s ease,-webkit-box-shadow .1s ease}.ui.menu>.item:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.menu .item:before{position:absolute;content:'';top:0;right:0;height:100%;width:1px;background:rgba(34,36,38,.1)}.ui.menu .item>a:not(.ui),.ui.menu .item>p:only-child,.ui.menu .text.item>*{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;line-height:1.3}.ui.menu .item>p:first-child{margin-top:0}.ui.menu .item>p:last-child{margin-bottom:0}.ui.menu .item>i.icon{opacity:.9;float:none;margin:0 .35714286em 0 0}.ui.menu:not(.vertical) .item>.button{position:relative;top:0;margin:-.5em 0;padding-bottom:.78571429em;padding-top:.78571429em;font-size:1em}.ui.menu>.container,.ui.menu>.grid{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit;-webkit-box-orient:inherit;-webkit-box-direction:inherit;-ms-flex-direction:inherit;flex-direction:inherit}.ui.menu .item>.input{width:100%}.ui.menu:not(.vertical) .item>.input{position:relative;top:0;margin:-.5em 0}.ui.menu .item>.input input{font-size:1em;padding-top:.57142857em;padding-bottom:.57142857em}.ui.menu .header.item,.ui.vertical.menu .header.item{margin:0;background:'';text-transform:normal;font-weight:700}.ui.vertical.menu .item>.header:not(.ui){margin:0 0 .5em;font-size:1em;font-weight:700}.ui.menu .item>i.dropdown.icon{padding:0;float:right;margin:0 0 0 1em}.ui.menu .dropdown.item .menu{min-width:calc(100% - 1px);border-radius:0 0 .28571429rem .28571429rem;background:#fff;margin:0 0 0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.ui.menu .ui.dropdown .menu>.item{margin:0;text-align:left;font-size:1em!important;padding:.78571429em 1.14285714em!important;background:0 0!important;color:rgba(0,0,0,.87)!important;text-transform:none!important;font-weight:400!important;-webkit-box-shadow:none!important;box-shadow:none!important;-webkit-transition:none!important;transition:none!important}.ui.menu .ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.selected.item{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown .menu>.active.item{background:rgba(0,0,0,.03)!important;font-weight:700!important;color:rgba(0,0,0,.95)!important}.ui.menu .ui.dropdown.item .menu .item:not(.filtered){display:block}.ui.menu .ui.dropdown .menu>.item .icon:not(.dropdown){display:inline-block;font-size:1em!important;float:none;margin:0 .75em 0 0!important}.ui.secondary.menu .dropdown.item>.menu,.ui.text.menu .dropdown.item>.menu{border-radius:.28571429rem;margin-top:.35714286em}.ui.menu .pointing.dropdown.item .menu{margin-top:.75em}.ui.inverted.menu .search.dropdown.item>.search,.ui.inverted.menu .search.dropdown.item>.text{color:rgba(255,255,255,.9)}.ui.vertical.menu .dropdown.item>.icon{float:right;content:\"\\f0da\";margin-left:1em}.ui.vertical.menu .dropdown.item .menu{left:100%;min-width:0;margin:0;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.08);box-shadow:0 1px 3px 0 rgba(0,0,0,.08);border-radius:0 .28571429rem .28571429rem .28571429rem}.ui.vertical.menu .dropdown.item.upward .menu{bottom:0}.ui.vertical.menu .dropdown.item:not(.upward) .menu{top:0}.ui.vertical.menu .active.dropdown.item{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.menu .dropdown.active.item{-webkit-box-shadow:none;box-shadow:none}.ui.item.menu .dropdown .menu .item{width:100%}.ui.menu .item>.label{background:#999;color:#fff;margin-left:1em;padding:.3em .78571429em}.ui.vertical.menu .item>.label{background:#999;color:#fff;margin-top:-.15em;margin-bottom:-.15em;padding:.3em .78571429em}.ui.menu .item>.floating.label{padding:.3em .78571429em}.ui.menu .item>img:not(.ui){display:inline-block;vertical-align:middle;margin:-.3em 0;width:2.5em}.ui.vertical.menu .item>img:not(.ui):only-child{display:block;max-width:100%;width:auto}.ui.menu .list .item:before{background:0 0!important}.ui.vertical.sidebar.menu>.item:first-child:before{display:block!important}.ui.vertical.sidebar.menu>.item::before{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.menu>.ui.container{width:100%!important;margin-left:0!important;margin-right:0!important}}@media only screen and (min-width:768px){.ui.menu:not(.secondary):not(.text):not(.tabular):not(.borderless)>.container>.item:not(.right):not(.borderless):first-child{border-left:1px solid rgba(34,36,38,.1)}}.ui.link.menu .item:hover,.ui.menu .dropdown.item:hover,.ui.menu .link.item:hover,.ui.menu a.item:hover{cursor:pointer;background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.link.menu .item:active,.ui.menu .link.item:active,.ui.menu a.item:active{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.menu .active.item{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);font-weight:400;-webkit-box-shadow:none;box-shadow:none}.ui.menu .active.item>i.icon{opacity:1}.ui.menu .active.item:hover,.ui.vertical.menu .active.item:hover{background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.menu .item.disabled,.ui.menu .item.disabled:hover{cursor:default!important;background-color:transparent!important;color:rgba(40,40,40,.3)!important}.ui.menu:not(.vertical) .left.item,.ui.menu:not(.vertical) :not(.dropdown)>.left.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-right:auto!important}.ui.menu:not(.vertical) .right.item,.ui.menu:not(.vertical) .right.menu{display:-webkit-box;display:-ms-flexbox;display:flex;margin-left:auto!important}.ui.menu .right.item::before,.ui.menu .right.menu>.item::before{right:auto;left:0}.ui.vertical.menu{display:block;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui.vertical.menu .item{display:block;background:0 0;border-top:none;border-right:none}.ui.vertical.menu>.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu .item>.label{float:right;text-align:center}.ui.vertical.menu .item>i.icon{width:1.18em;float:right;margin:0 0 0 .5em}.ui.vertical.menu .item>.label+i.icon{float:none;margin:0 .5em 0 0}.ui.vertical.menu .item:before{position:absolute;content:'';top:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.vertical.menu .item:first-child:before{display:none!important}.ui.vertical.menu .item>.menu{margin:.5em -1.14285714em 0}.ui.vertical.menu .menu .item{background:0 0;padding:.5em 1.33333333em;font-size:.85714286em;color:rgba(0,0,0,.5)}.ui.vertical.menu .item .menu .link.item:hover,.ui.vertical.menu .item .menu a.item:hover{color:rgba(0,0,0,.85)}.ui.vertical.menu .menu .item:before{display:none}.ui.vertical.menu .active.item{background:rgba(0,0,0,.05);border-radius:0;-webkit-box-shadow:none;box-shadow:none}.ui.vertical.menu>.active.item:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.menu>.active.item:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.menu>.active.item:only-child{border-radius:.28571429rem}.ui.vertical.menu .active.item .menu .active.item{border-left:none}.ui.vertical.menu .item .menu .active.item{background-color:transparent;font-weight:700;color:rgba(0,0,0,.95)}.ui.tabular.menu{border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border:none;background:none transparent;border-bottom:1px solid #d4d4d5}.ui.tabular.fluid.menu{width:calc(100% + 2px)!important}.ui.tabular.menu .item{background:0 0;border-bottom:none;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;padding:.92857143em 1.42857143em;color:rgba(0,0,0,.87)}.ui.tabular.menu .item:before{display:none}.ui.tabular.menu .item:hover{background-color:transparent;color:rgba(0,0,0,.8)}.ui.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-top-width:1px;border-color:#d4d4d5;font-weight:700;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem .28571429rem 0 0!important}.ui.tabular.menu+.attached:not(.top).segment,.ui.tabular.menu+.attached:not(.top).segment+.attached:not(.top).segment{border-top:none;margin-left:0;margin-top:0;margin-right:0;width:100%}.top.attached.segment+.ui.bottom.tabular.menu{position:relative;width:calc(100% + 2px);left:-1px}.ui.bottom.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-top:1px solid #d4d4d5}.ui.bottom.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:none}.ui.bottom.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:-1px 0 0 0;border-radius:0 0 .28571429rem .28571429rem!important}.ui.vertical.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:1px solid #d4d4d5}.ui.vertical.tabular.menu .item{background:0 0;border-left:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-right:none}.ui.vertical.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 -1px 0 0;border-radius:.28571429rem 0 0 .28571429rem!important}.ui.vertical.right.tabular.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:none;border-right:none;border-left:1px solid #d4d4d5}.ui.vertical.right.tabular.menu .item{background:0 0;border-right:1px solid transparent;border-bottom:1px solid transparent;border-top:1px solid transparent;border-left:none}.ui.vertical.right.tabular.menu .active.item{background:none #fff;color:rgba(0,0,0,.95);border-color:#d4d4d5;margin:0 0 0 -1px;border-radius:0 .28571429rem .28571429rem 0!important}.ui.tabular.menu .active.dropdown.item{margin-bottom:0;border-left:1px solid transparent;border-right:1px solid transparent;border-top:2px solid transparent;border-bottom:none}.ui.pagination.menu{margin:0;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.ui.pagination.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.pagination.menu .item:last-child:before{display:none}.ui.pagination.menu .item{min-width:3em;text-align:center}.ui.pagination.menu .icon.item i.icon{vertical-align:top}.ui.pagination.menu .active.item{border-top:none;padding-top:.92857143em;background-color:rgba(0,0,0,.05);color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu{background:0 0;margin-left:-.35714286em;margin-right:-.35714286em;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.secondary.menu .item{-ms-flex-item-align:center;align-self:center;-webkit-box-shadow:none;box-shadow:none;border:none;padding:.78571429em .92857143em;margin:0 .35714286em;background:0 0;-webkit-transition:color .1s ease;transition:color .1s ease;border-radius:.28571429rem}.ui.secondary.menu .item:before{display:none!important}.ui.secondary.menu .header.item{border-radius:0;border-right:none;background:none transparent}.ui.secondary.menu .item>img:not(.ui){margin:0}.ui.secondary.menu .dropdown.item:hover,.ui.secondary.menu .link.item:hover,.ui.secondary.menu a.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.menu .active.item{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);border-radius:.28571429rem}.ui.secondary.menu .active.item:hover{-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.secondary.inverted.menu .link.item,.ui.secondary.inverted.menu a.item{color:rgba(255,255,255,.7)!important}.ui.secondary.inverted.menu .dropdown.item:hover,.ui.secondary.inverted.menu .link.item:hover,.ui.secondary.inverted.menu a.item:hover{background:rgba(255,255,255,.08);color:#fff!important}.ui.secondary.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.secondary.item.menu{margin-left:0;margin-right:0}.ui.secondary.item.menu .item:last-child{margin-right:0}.ui.secondary.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu{margin:0 -.92857143em}.ui.vertical.secondary.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 1.33333333em}.ui.secondary.vertical.menu>.item{border:none;margin:0 0 .35714286em;border-radius:.28571429rem!important}.ui.secondary.vertical.menu>.header.item{border-radius:0}.ui.vertical.secondary.menu .item>.menu .item{background-color:transparent}.ui.secondary.inverted.menu{background-color:transparent}.ui.secondary.pointing.menu{margin-left:0;margin-right:0;border-bottom:2px solid rgba(34,36,38,.15)}.ui.secondary.pointing.menu .item{border-bottom-color:transparent;border-bottom-style:solid;border-radius:0;-ms-flex-item-align:end;align-self:flex-end;margin:0 0 -2px;padding:.85714286em 1.14285714em;border-bottom-width:2px;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.secondary.pointing.menu .header.item{color:rgba(0,0,0,.85)!important}.ui.secondary.pointing.menu .text.item{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.secondary.pointing.menu .item:after{display:none}.ui.secondary.pointing.menu .dropdown.item:hover,.ui.secondary.pointing.menu .link.item:hover,.ui.secondary.pointing.menu a.item:hover{background-color:transparent;color:rgba(0,0,0,.87)}.ui.secondary.pointing.menu .dropdown.item:active,.ui.secondary.pointing.menu .link.item:active,.ui.secondary.pointing.menu a.item:active{background-color:transparent;border-color:rgba(34,36,38,.15)}.ui.secondary.pointing.menu .active.item{background-color:transparent;-webkit-box-shadow:none;box-shadow:none;border-color:#1b1c1d;font-weight:700;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.item:hover{border-color:#1b1c1d;color:rgba(0,0,0,.95)}.ui.secondary.pointing.menu .active.dropdown.item{border-color:transparent}.ui.secondary.vertical.pointing.menu{border-bottom-width:0;border-right-width:2px;border-right-style:solid;border-right-color:rgba(34,36,38,.15)}.ui.secondary.vertical.pointing.menu .item{border-bottom:none;border-right-style:solid;border-right-color:transparent;border-radius:0!important;margin:0 -2px 0 0;border-right-width:2px}.ui.secondary.vertical.pointing.menu .active.item{border-color:#1b1c1d}.ui.secondary.inverted.pointing.menu{border-color:rgba(255,255,255,.1)}.ui.secondary.inverted.pointing.menu{border-width:2px;border-color:rgba(34,36,38,.15)}.ui.secondary.inverted.pointing.menu .item{color:rgba(255,255,255,.9)}.ui.secondary.inverted.pointing.menu .header.item{color:#fff!important}.ui.secondary.inverted.pointing.menu .link.item:hover,.ui.secondary.inverted.pointing.menu a.item:hover{color:rgba(0,0,0,.95)}.ui.secondary.inverted.pointing.menu .active.item{border-color:#fff;color:#fff}.ui.text.menu{background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;margin:1em -.5em}.ui.text.menu .item{border-radius:0;-webkit-box-shadow:none;box-shadow:none;-ms-flex-item-align:center;align-self:center;margin:0 0;padding:.35714286em .5em;font-weight:400;color:rgba(0,0,0,.6);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.text.menu .item:before,.ui.text.menu .menu .item:before{display:none!important}.ui.text.menu .header.item{background-color:transparent;opacity:1;color:rgba(0,0,0,.85);font-size:.92857143em;text-transform:uppercase;font-weight:700}.ui.text.menu .item>img:not(.ui){margin:0}.ui.text.item.menu .item{margin:0}.ui.vertical.text.menu{margin:1em 0}.ui.vertical.text.menu:first-child{margin-top:0}.ui.vertical.text.menu:last-child{margin-bottom:0}.ui.vertical.text.menu .item{margin:.57142857em 0;padding-left:0;padding-right:0}.ui.vertical.text.menu .item>i.icon{float:none;margin:0 .35714286em 0 0}.ui.vertical.text.menu .header.item{margin:.57142857em 0 .71428571em}.ui.vertical.text.menu .item:not(.dropdown)>.menu{margin:0}.ui.vertical.text.menu .item:not(.dropdown)>.menu>.item{margin:0;padding:.5em 0}.ui.text.menu .item:hover{opacity:1;background-color:transparent}.ui.text.menu .active.item{background-color:transparent;border:none;-webkit-box-shadow:none;box-shadow:none;font-weight:400;color:rgba(0,0,0,.95)}.ui.text.menu .active.item:hover{background-color:transparent}.ui.text.pointing.menu .active.item:after{-webkit-box-shadow:none;box-shadow:none}.ui.text.attached.menu{-webkit-box-shadow:none;box-shadow:none}.ui.inverted.text.menu,.ui.inverted.text.menu .active.item,.ui.inverted.text.menu .item,.ui.inverted.text.menu .item:hover{background-color:transparent!important}.ui.fluid.text.menu{margin-left:0;margin-right:0}.ui.vertical.icon.menu{display:inline-block;width:auto}.ui.icon.menu .item{height:auto;text-align:center;color:#1b1c1d}.ui.icon.menu .item>.icon:not(.dropdown){margin:0;opacity:1}.ui.icon.menu .icon:before{opacity:1}.ui.menu .icon.item>.icon{width:auto;margin:0 auto}.ui.vertical.icon.menu .item>.icon:not(.dropdown){display:block;opacity:1;margin:0 auto;float:none}.ui.inverted.icon.menu .item{color:#fff}.ui.labeled.icon.menu{text-align:center}.ui.labeled.icon.menu .item{min-width:6em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.labeled.icon.menu .item>.icon:not(.dropdown){height:1em;display:block;font-size:1.71428571em!important;margin:0 auto .5rem!important}.ui.fluid.labeled.icon.menu>.item{min-width:0}@media only screen and (max-width:767px){.ui.stackable.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.stackable.menu .item{width:100%!important}.ui.stackable.menu .item:before{position:absolute;content:'';top:auto;bottom:0;left:0;width:100%;height:1px;background:rgba(34,36,38,.1)}.ui.stackable.menu .left.item,.ui.stackable.menu .left.menu{margin-right:0!important}.ui.stackable.menu .right.item,.ui.stackable.menu .right.menu{margin-left:0!important}.ui.stackable.menu .left.menu,.ui.stackable.menu .right.menu{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.ui.menu .red.active.item,.ui.red.menu .active.item{border-color:#db2828!important;color:#db2828!important}.ui.menu .orange.active.item,.ui.orange.menu .active.item{border-color:#f2711c!important;color:#f2711c!important}.ui.menu .yellow.active.item,.ui.yellow.menu .active.item{border-color:#fbbd08!important;color:#fbbd08!important}.ui.menu .olive.active.item,.ui.olive.menu .active.item{border-color:#b5cc18!important;color:#b5cc18!important}.ui.green.menu .active.item,.ui.menu .green.active.item{border-color:#21ba45!important;color:#21ba45!important}.ui.menu .teal.active.item,.ui.teal.menu .active.item{border-color:#00b5ad!important;color:#00b5ad!important}.ui.blue.menu .active.item,.ui.menu .blue.active.item{border-color:#2185d0!important;color:#2185d0!important}.ui.menu .violet.active.item,.ui.violet.menu .active.item{border-color:#6435c9!important;color:#6435c9!important}.ui.menu .purple.active.item,.ui.purple.menu .active.item{border-color:#a333c8!important;color:#a333c8!important}.ui.menu .pink.active.item,.ui.pink.menu .active.item{border-color:#e03997!important;color:#e03997!important}.ui.brown.menu .active.item,.ui.menu .brown.active.item{border-color:#a5673f!important;color:#a5673f!important}.ui.grey.menu .active.item,.ui.menu .grey.active.item{border-color:#767676!important;color:#767676!important}.ui.inverted.menu{border:0 solid transparent;background:#1b1c1d;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item,.ui.inverted.menu .item>a:not(.ui){background:0 0;color:rgba(255,255,255,.9)}.ui.inverted.menu .item.menu{background:0 0}.ui.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .item:before{background:rgba(255,255,255,.08)}.ui.vertical.inverted.menu .menu .item,.ui.vertical.inverted.menu .menu .item a:not(.ui){color:rgba(255,255,255,.5)}.ui.inverted.menu .header.item{margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.menu .item.disabled,.ui.inverted.menu .item.disabled:hover{color:rgba(225,225,225,.3)}.ui.inverted.menu .dropdown.item:hover,.ui.inverted.menu .link.item:hover,.ui.inverted.menu a.item:hover,.ui.link.inverted.menu .item:hover{background:rgba(255,255,255,.08);color:#fff}.ui.vertical.inverted.menu .item .menu .link.item:hover,.ui.vertical.inverted.menu .item .menu a.item:hover{background:0 0;color:#fff}.ui.inverted.menu .link.item:active,.ui.inverted.menu a.item:active{background:rgba(255,255,255,.08);color:#fff}.ui.inverted.menu .active.item{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.vertical.menu .item .menu .active.item{background:0 0;color:#fff}.ui.inverted.pointing.menu .active.item:after{background:#3d3e3f!important;margin:0!important;-webkit-box-shadow:none!important;box-shadow:none!important;border:none!important}.ui.inverted.menu .active.item:hover{background:rgba(255,255,255,.15);color:#fff!important}.ui.inverted.pointing.menu .active.item:hover:after{background:#3d3e3f!important}.ui.floated.menu{float:left;margin:0 .5rem 0 0}.ui.floated.menu .item:last-child:before{display:none}.ui.right.floated.menu{float:right;margin:0 0 0 .5rem}.ui.inverted.menu .red.active.item,.ui.inverted.red.menu{background-color:#db2828}.ui.inverted.red.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.red.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .orange.active.item,.ui.inverted.orange.menu{background-color:#f2711c}.ui.inverted.orange.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.orange.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .yellow.active.item,.ui.inverted.yellow.menu{background-color:#fbbd08}.ui.inverted.yellow.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.yellow.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .olive.active.item,.ui.inverted.olive.menu{background-color:#b5cc18}.ui.inverted.olive.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.olive.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.green.menu,.ui.inverted.menu .green.active.item{background-color:#21ba45}.ui.inverted.green.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.green.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .teal.active.item,.ui.inverted.teal.menu{background-color:#00b5ad}.ui.inverted.teal.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.teal.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.blue.menu,.ui.inverted.menu .blue.active.item{background-color:#2185d0}.ui.inverted.blue.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.blue.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .violet.active.item,.ui.inverted.violet.menu{background-color:#6435c9}.ui.inverted.violet.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.violet.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .purple.active.item,.ui.inverted.purple.menu{background-color:#a333c8}.ui.inverted.purple.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.purple.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.menu .pink.active.item,.ui.inverted.pink.menu{background-color:#e03997}.ui.inverted.pink.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.pink.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.brown.menu,.ui.inverted.menu .brown.active.item{background-color:#a5673f}.ui.inverted.brown.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.brown.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.inverted.grey.menu,.ui.inverted.menu .grey.active.item{background-color:#767676}.ui.inverted.grey.menu .item:before{background-color:rgba(34,36,38,.1)}.ui.inverted.grey.menu .active.item{background-color:rgba(0,0,0,.1)!important}.ui.fitted.menu .item,.ui.fitted.menu .item .menu .item,.ui.menu .fitted.item{padding:0}.ui.horizontally.fitted.menu .item,.ui.horizontally.fitted.menu .item .menu .item,.ui.menu .horizontally.fitted.item{padding-top:.92857143em;padding-bottom:.92857143em}.ui.menu .vertically.fitted.item,.ui.vertically.fitted.menu .item,.ui.vertically.fitted.menu .item .menu .item{padding-left:1.14285714em;padding-right:1.14285714em}.ui.borderless.menu .item .menu .item:before,.ui.borderless.menu .item:before,.ui.menu .borderless.item:before{background:0 0!important}.ui.compact.menu{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin:0;vertical-align:middle}.ui.compact.vertical.menu{display:inline-block}.ui.compact.menu .item:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui.compact.menu .item:last-child:before{display:none}.ui.compact.vertical.menu{width:auto!important}.ui.compact.vertical.menu .item:last-child::before{display:block}.ui.menu.fluid,.ui.vertical.menu.fluid{width:100%!important}.ui.item.menu,.ui.item.menu .item{width:100%;padding-left:0!important;padding-right:0!important;margin-left:0!important;margin-right:0!important;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.attached.item.menu{margin:0 -1px!important}.ui.item.menu .item:last-child:before{display:none}.ui.menu.two.item .item{width:50%}.ui.menu.three.item .item{width:33.333%}.ui.menu.four.item .item{width:25%}.ui.menu.five.item .item{width:20%}.ui.menu.six.item .item{width:16.666%}.ui.menu.seven.item .item{width:14.285%}.ui.menu.eight.item .item{width:12.5%}.ui.menu.nine.item .item{width:11.11%}.ui.menu.ten.item .item{width:10%}.ui.menu.eleven.item .item{width:9.09%}.ui.menu.twelve.item .item{width:8.333%}.ui.menu.fixed{position:fixed;z-index:101;margin:0;width:100%}.ui.menu.fixed,.ui.menu.fixed .item:first-child,.ui.menu.fixed .item:last-child{border-radius:0!important}.ui.fixed.menu,.ui[class*=\"top fixed\"].menu{top:0;left:0;right:auto;bottom:auto}.ui[class*=\"top fixed\"].menu{border-top:none;border-left:none;border-right:none}.ui[class*=\"right fixed\"].menu{border-top:none;border-bottom:none;border-right:none;top:0;right:0;left:auto;bottom:auto;width:auto;height:100%}.ui[class*=\"bottom fixed\"].menu{border-bottom:none;border-left:none;border-right:none;bottom:0;left:0;top:auto;right:auto}.ui[class*=\"left fixed\"].menu{border-top:none;border-bottom:none;border-left:none;top:0;left:0;right:auto;bottom:auto;width:auto;height:100%}.ui.fixed.menu+.ui.grid{padding-top:2.75rem}.ui.pointing.menu .item:after{visibility:hidden;position:absolute;content:'';top:100%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);background:0 0;margin:.5px 0 0;width:.57142857em;height:.57142857em;border:none;border-bottom:1px solid #d4d4d5;border-right:1px solid #d4d4d5;z-index:2;-webkit-transition:background .1s ease;transition:background .1s ease}.ui.vertical.pointing.menu .item:after{position:absolute;top:50%;right:0;bottom:auto;left:auto;-webkit-transform:translateX(50%) translateY(-50%) rotate(45deg);transform:translateX(50%) translateY(-50%) rotate(45deg);margin:0 -.5px 0 0;border:none;border-top:1px solid #d4d4d5;border-right:1px solid #d4d4d5}.ui.pointing.menu .active.item:after{visibility:visible}.ui.pointing.menu .active.dropdown.item:after{visibility:hidden}.ui.pointing.menu .active.item .menu .active.item:after,.ui.pointing.menu .dropdown.active.item:after{display:none}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:hover:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .active.item:after{background-color:#f2f2f2}.ui.vertical.pointing.menu .menu .active.item:after{background-color:#fff}.ui.attached.menu{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none}.ui.attached+.ui.attached.menu:not(.top){border-top:none}.ui[class*=\"top attached\"].menu{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.menu[class*=\"top attached\"]:first-child{margin-top:0}.ui[class*=\"bottom attached\"].menu{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"bottom attached\"].menu:last-child{margin-bottom:0}.ui.top.attached.menu>.item:first-child{border-radius:.28571429rem 0 0 0}.ui.bottom.attached.menu>.item:first-child{border-radius:0 0 0 .28571429rem}.ui.attached.menu:not(.tabular){border:1px solid #d4d4d5}.ui.attached.inverted.menu{border:none}.ui.attached.tabular.menu{margin-left:0;margin-right:0;width:100%}.ui.mini.menu{font-size:.78571429rem}.ui.mini.vertical.menu{width:9rem}.ui.tiny.menu{font-size:.85714286rem}.ui.tiny.vertical.menu{width:11rem}.ui.small.menu{font-size:.92857143rem}.ui.small.vertical.menu{width:13rem}.ui.menu{font-size:1rem}.ui.vertical.menu{width:15rem}.ui.large.menu{font-size:1.07142857rem}.ui.large.vertical.menu{width:18rem}.ui.huge.menu{font-size:1.21428571rem}.ui.huge.vertical.menu{width:22rem}.ui.big.menu{font-size:1.14285714rem}.ui.big.vertical.menu{width:20rem}.ui.massive.menu{font-size:1.28571429rem}.ui.massive.vertical.menu{width:25rem}/*!\n * # Semantic UI 2.4.0 - Message\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.message{position:relative;min-height:1em;margin:1em 0;background:#f8f8f9;padding:1em 1.5em;line-height:1.4285em;color:rgba(0,0,0,.87);-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,-webkit-box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;border-radius:.28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent;box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent}.ui.message:first-child{margin-top:0}.ui.message:last-child{margin-bottom:0}.ui.message .header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;margin:-.14285714em 0 0 0}.ui.message .header:not(.ui){font-size:1.14285714em}.ui.message p{opacity:.85;margin:.75em 0}.ui.message p:first-child{margin-top:0}.ui.message p:last-child{margin-bottom:0}.ui.message .header+p{margin-top:.25em}.ui.message .list:not(.ui){text-align:left;padding:0;opacity:.85;list-style-position:inside;margin:.5em 0 0}.ui.message .list:not(.ui):first-child{margin-top:0}.ui.message .list:not(.ui):last-child{margin-bottom:0}.ui.message .list:not(.ui) li{position:relative;list-style-type:none;margin:0 0 .3em 1em;padding:0}.ui.message .list:not(.ui) li:before{position:absolute;content:'•';left:-1em;height:100%;vertical-align:baseline}.ui.message .list:not(.ui) li:last-child{margin-bottom:0}.ui.message>.icon{margin-right:.6em}.ui.message>.close.icon{cursor:pointer;position:absolute;margin:0;top:.78575em;right:.5em;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.message>.close.icon:hover{opacity:1}.ui.message>:first-child{margin-top:0}.ui.message>:last-child{margin-bottom:0}.ui.dropdown .menu>.message{margin:0 -1px}.ui.visible.visible.visible.visible.message{display:block}.ui.icon.visible.visible.visible.visible.message{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.compact.icon.message{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;margin-left:-1px;margin-right:-1px}.ui.attached+.ui.attached.message:not(.top):not(.bottom){margin-top:-1px;border-radius:0}.ui.bottom.attached.message{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15)}.ui.bottom.attached.message:not(:last-child){margin-bottom:1em}.ui.attached.icon.message{width:auto}.ui.icon.message{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.icon.message>.icon:not(.close){display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;line-height:1;vertical-align:middle;font-size:3em;opacity:.8}.ui.icon.message>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;vertical-align:middle}.ui.icon.message .icon:not(.close)+.content{padding-left:0}.ui.icon.message .circular.icon{width:1em}.ui.floating.message{-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.black.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.positive.message{background-color:#fcfff5;color:#2c662d}.ui.attached.positive.message,.ui.positive.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent}.ui.positive.message .header{color:#1a531b}.ui.negative.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.negative.message,.ui.negative.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent}.ui.negative.message .header{color:#912d2b}.ui.info.message{background-color:#f8ffff;color:#276f86}.ui.attached.info.message,.ui.info.message{-webkit-box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a9d5de inset,0 0 0 0 transparent}.ui.info.message .header{color:#0e566c}.ui.warning.message{background-color:#fffaf3;color:#573a08}.ui.attached.warning.message,.ui.warning.message{-webkit-box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #c9ba9b inset,0 0 0 0 transparent}.ui.warning.message .header{color:#794b02}.ui.error.message{background-color:#fff6f6;color:#9f3a38}.ui.attached.error.message,.ui.error.message{-webkit-box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e0b4b4 inset,0 0 0 0 transparent}.ui.error.message .header{color:#912d2b}.ui.success.message{background-color:#fcfff5;color:#2c662d}.ui.attached.success.message,.ui.success.message{-webkit-box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a3c293 inset,0 0 0 0 transparent}.ui.success.message .header{color:#1a531b}.ui.black.message,.ui.inverted.message{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.red.message{background-color:#ffe8e6;color:#db2828;-webkit-box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #db2828 inset,0 0 0 0 transparent}.ui.red.message .header{color:#c82121}.ui.orange.message{background-color:#ffedde;color:#f2711c;-webkit-box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #f2711c inset,0 0 0 0 transparent}.ui.orange.message .header{color:#e7640d}.ui.yellow.message{background-color:#fff8db;color:#b58105;-webkit-box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #b58105 inset,0 0 0 0 transparent}.ui.yellow.message .header{color:#9c6f04}.ui.olive.message{background-color:#fbfdef;color:#8abc1e;-webkit-box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #8abc1e inset,0 0 0 0 transparent}.ui.olive.message .header{color:#7aa61a}.ui.green.message{background-color:#e5f9e7;color:#1ebc30;-webkit-box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #1ebc30 inset,0 0 0 0 transparent}.ui.green.message .header{color:#1aa62a}.ui.teal.message{background-color:#e1f7f7;color:#10a3a3;-webkit-box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #10a3a3 inset,0 0 0 0 transparent}.ui.teal.message .header{color:#0e8c8c}.ui.blue.message{background-color:#dff0ff;color:#2185d0;-webkit-box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #2185d0 inset,0 0 0 0 transparent}.ui.blue.message .header{color:#1e77ba}.ui.violet.message{background-color:#eae7ff;color:#6435c9;-webkit-box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #6435c9 inset,0 0 0 0 transparent}.ui.violet.message .header{color:#5a30b5}.ui.purple.message{background-color:#f6e7ff;color:#a333c8;-webkit-box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a333c8 inset,0 0 0 0 transparent}.ui.purple.message .header{color:#922eb4}.ui.pink.message{background-color:#ffe3fb;color:#e03997;-webkit-box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #e03997 inset,0 0 0 0 transparent}.ui.pink.message .header{color:#dd238b}.ui.brown.message{background-color:#f1e2d3;color:#a5673f;-webkit-box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent;box-shadow:0 0 0 1px #a5673f inset,0 0 0 0 transparent}.ui.brown.message .header{color:#935b38}.ui.mini.message{font-size:.78571429em}.ui.tiny.message{font-size:.85714286em}.ui.small.message{font-size:.92857143em}.ui.message{font-size:1em}.ui.large.message{font-size:1.14285714em}.ui.big.message{font-size:1.28571429em}.ui.huge.message{font-size:1.42857143em}.ui.massive.message{font-size:1.71428571em}/*!\n * # Semantic UI 2.4.0 - Table\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.table{width:100%;background:#fff;margin:1em 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem;text-align:left;color:rgba(0,0,0,.87);border-collapse:separate;border-spacing:0}.ui.table:first-child{margin-top:0}.ui.table:last-child{margin-bottom:0}.ui.table td,.ui.table th{-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.table thead{-webkit-box-shadow:none;box-shadow:none}.ui.table thead th{cursor:auto;background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.92857143em .78571429em;vertical-align:inherit;font-style:none;font-weight:700;text-transform:none;border-bottom:1px solid rgba(34,36,38,.1);border-left:none}.ui.table thead tr>th:first-child{border-left:none}.ui.table thead tr:first-child>th:first-child{border-radius:.28571429rem 0 0 0}.ui.table thead tr:first-child>th:last-child{border-radius:0 .28571429rem 0 0}.ui.table thead tr:first-child>th:only-child{border-radius:.28571429rem .28571429rem 0 0}.ui.table tfoot{-webkit-box-shadow:none;box-shadow:none}.ui.table tfoot th{cursor:auto;border-top:1px solid rgba(34,36,38,.15);background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.78571429em .78571429em;vertical-align:middle;font-style:normal;font-weight:400;text-transform:none}.ui.table tfoot tr>th:first-child{border-left:none}.ui.table tfoot tr:first-child>th:first-child{border-radius:0 0 0 .28571429rem}.ui.table tfoot tr:first-child>th:last-child{border-radius:0 0 .28571429rem 0}.ui.table tfoot tr:first-child>th:only-child{border-radius:0 0 .28571429rem .28571429rem}.ui.table tr td{border-top:1px solid rgba(34,36,38,.1)}.ui.table tr:first-child td{border-top:none}.ui.table tbody+tbody tr:first-child td{border-top:1px solid rgba(34,36,38,.1)}.ui.table td{padding:.78571429em .78571429em;text-align:inherit}.ui.table>.icon{vertical-align:baseline}.ui.table>.icon:only-child{margin:0}.ui.table.segment{padding:0}.ui.table.segment:after{display:none}.ui.table.segment.stacked:after{display:block}@media only screen and (max-width:767px){.ui.table:not(.unstackable){width:100%}.ui.table:not(.unstackable) tbody,.ui.table:not(.unstackable) tr,.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{width:auto!important;display:block!important}.ui.table:not(.unstackable){padding:0}.ui.table:not(.unstackable) thead{display:block}.ui.table:not(.unstackable) tfoot{display:block}.ui.table:not(.unstackable) tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important}.ui.table:not(.unstackable) tr>td,.ui.table:not(.unstackable) tr>th{background:0 0;border:none!important;padding:.25em .75em!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.table:not(.unstackable) td:first-child,.ui.table:not(.unstackable) th:first-child{font-weight:700}.ui.definition.table:not(.unstackable) thead th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.table td .image,.ui.table td .image img,.ui.table th .image,.ui.table th .image img{max-width:none}.ui.structured.table{border-collapse:collapse}.ui.structured.table thead th{border-left:none;border-right:none}.ui.structured.sortable.table thead th{border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(34,36,38,.15)}.ui.structured.basic.table th{border-left:none;border-right:none}.ui.structured.celled.table tr td,.ui.structured.celled.table tr th{border-left:1px solid rgba(34,36,38,.1);border-right:1px solid rgba(34,36,38,.1)}.ui.definition.table thead:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-1px -1px 0 1px #fff;box-shadow:-1px -1px 0 1px #fff}.ui.definition.table tfoot:not(.full-width) th:first-child{pointer-events:none;background:0 0;font-weight:rgba(0,0,0,.4);color:normal;-webkit-box-shadow:1px 1px 0 1px #fff;box-shadow:1px 1px 0 1px #fff}.ui.celled.definition.table thead:not(.full-width) th:first-child{-webkit-box-shadow:0 -1px 0 1px #fff;box-shadow:0 -1px 0 1px #fff}.ui.celled.definition.table tfoot:not(.full-width) th:first-child{-webkit-box-shadow:0 1px 0 1px #fff;box-shadow:0 1px 0 1px #fff}.ui.definition.table tr td.definition,.ui.definition.table tr td:first-child:not(.ignored){background:rgba(0,0,0,.03);font-weight:700;color:rgba(0,0,0,.95);text-transform:'';-webkit-box-shadow:'';box-shadow:'';text-align:'';font-size:1em;padding-left:'';padding-right:''}.ui.definition.table thead:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table tfoot:not(.full-width) th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table td:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.table td.positive,.ui.table tr.positive{-webkit-box-shadow:0 0 0 #a3c293 inset;box-shadow:0 0 0 #a3c293 inset}.ui.table td.positive,.ui.table tr.positive{background:#fcfff5!important;color:#2c662d!important}.ui.table td.negative,.ui.table tr.negative{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset}.ui.table td.negative,.ui.table tr.negative{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.error,.ui.table tr.error{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset}.ui.table td.error,.ui.table tr.error{background:#fff6f6!important;color:#9f3a38!important}.ui.table td.warning,.ui.table tr.warning{-webkit-box-shadow:0 0 0 #c9ba9b inset;box-shadow:0 0 0 #c9ba9b inset}.ui.table td.warning,.ui.table tr.warning{background:#fffaf3!important;color:#573a08!important}.ui.table td.active,.ui.table tr.active{-webkit-box-shadow:0 0 0 rgba(0,0,0,.87) inset;box-shadow:0 0 0 rgba(0,0,0,.87) inset}.ui.table td.active,.ui.table tr.active{background:#e0e0e0!important;color:rgba(0,0,0,.87)!important}.ui.table tr td.disabled,.ui.table tr.disabled td,.ui.table tr.disabled:hover,.ui.table tr:hover td.disabled{pointer-events:none;color:rgba(40,40,40,.3)}@media only screen and (max-width:991px){.ui[class*=\"tablet stackable\"].table,.ui[class*=\"tablet stackable\"].table tbody,.ui[class*=\"tablet stackable\"].table tr,.ui[class*=\"tablet stackable\"].table tr>td,.ui[class*=\"tablet stackable\"].table tr>th{width:100%!important;display:block!important}.ui[class*=\"tablet stackable\"].table{padding:0}.ui[class*=\"tablet stackable\"].table thead{display:block}.ui[class*=\"tablet stackable\"].table tfoot{display:block}.ui[class*=\"tablet stackable\"].table tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset!important}.ui[class*=\"tablet stackable\"].table tr>td,.ui[class*=\"tablet stackable\"].table tr>th{background:0 0;border:none!important;padding:.25em .75em;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.definition[class*=\"tablet stackable\"].table thead th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.table [class*=\"left aligned\"],.ui.table[class*=\"left aligned\"]{text-align:left}.ui.table [class*=\"center aligned\"],.ui.table[class*=\"center aligned\"]{text-align:center}.ui.table [class*=\"right aligned\"],.ui.table[class*=\"right aligned\"]{text-align:right}.ui.table [class*=\"top aligned\"],.ui.table[class*=\"top aligned\"]{vertical-align:top}.ui.table [class*=\"middle aligned\"],.ui.table[class*=\"middle aligned\"]{vertical-align:middle}.ui.table [class*=\"bottom aligned\"],.ui.table[class*=\"bottom aligned\"]{vertical-align:bottom}.ui.table td.collapsing,.ui.table th.collapsing{width:1px;white-space:nowrap}.ui.fixed.table{table-layout:fixed}.ui.fixed.table td,.ui.fixed.table th{overflow:hidden;text-overflow:ellipsis}.ui.selectable.table tbody tr:hover,.ui.table tbody tr td.selectable:hover{background:rgba(0,0,0,.05)!important;color:rgba(0,0,0,.95)!important}.ui.inverted.table tbody tr td.selectable:hover,.ui.selectable.inverted.table tbody tr:hover{background:rgba(255,255,255,.08)!important;color:#fff!important}.ui.table tbody tr td.selectable{padding:0}.ui.table tbody tr td.selectable>a:not(.ui){display:block;color:inherit;padding:.78571429em .78571429em}.ui.selectable.table tr.error:hover,.ui.selectable.table tr:hover td.error,.ui.table tr td.selectable.error:hover{background:#ffe7e7!important;color:#943634!important}.ui.selectable.table tr.warning:hover,.ui.selectable.table tr:hover td.warning,.ui.table tr td.selectable.warning:hover{background:#fff4e4!important;color:#493107!important}.ui.selectable.table tr.active:hover,.ui.selectable.table tr:hover td.active,.ui.table tr td.selectable.active:hover{background:#e0e0e0!important;color:rgba(0,0,0,.87)!important}.ui.selectable.table tr.positive:hover,.ui.selectable.table tr:hover td.positive,.ui.table tr td.selectable.positive:hover{background:#f7ffe6!important;color:#275b28!important}.ui.selectable.table tr.negative:hover,.ui.selectable.table tr:hover td.negative,.ui.table tr td.selectable.negative:hover{background:#ffe7e7!important;color:#943634!important}.ui.attached.table{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached+.ui.attached.table:not(.top){border-top:none}.ui[class*=\"top attached\"].table{bottom:0;margin-bottom:0;top:0;margin-top:1em;border-radius:.28571429rem .28571429rem 0 0}.ui.table[class*=\"top attached\"]:first-child{margin-top:0}.ui[class*=\"bottom attached\"].table{bottom:0;margin-top:0;top:0;margin-bottom:1em;-webkit-box-shadow:none,none;box-shadow:none,none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*=\"bottom attached\"].table:last-child{margin-bottom:0}.ui.striped.table tbody tr:nth-child(2n),.ui.striped.table>tr:nth-child(2n){background-color:rgba(0,0,50,.02)}.ui.inverted.striped.table tbody tr:nth-child(2n),.ui.inverted.striped.table>tr:nth-child(2n){background-color:rgba(255,255,255,.05)}.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover{background:#efefef!important;color:rgba(0,0,0,.95)!important}.ui.table [class*=\"single line\"],.ui.table[class*=\"single line\"]{white-space:nowrap}.ui.table [class*=\"single line\"],.ui.table[class*=\"single line\"]{white-space:nowrap}.ui.red.table{border-top:.2em solid #db2828}.ui.inverted.red.table{background-color:#db2828!important;color:#fff!important}.ui.orange.table{border-top:.2em solid #f2711c}.ui.inverted.orange.table{background-color:#f2711c!important;color:#fff!important}.ui.yellow.table{border-top:.2em solid #fbbd08}.ui.inverted.yellow.table{background-color:#fbbd08!important;color:#fff!important}.ui.olive.table{border-top:.2em solid #b5cc18}.ui.inverted.olive.table{background-color:#b5cc18!important;color:#fff!important}.ui.green.table{border-top:.2em solid #21ba45}.ui.inverted.green.table{background-color:#21ba45!important;color:#fff!important}.ui.teal.table{border-top:.2em solid #00b5ad}.ui.inverted.teal.table{background-color:#00b5ad!important;color:#fff!important}.ui.blue.table{border-top:.2em solid #2185d0}.ui.inverted.blue.table{background-color:#2185d0!important;color:#fff!important}.ui.violet.table{border-top:.2em solid #6435c9}.ui.inverted.violet.table{background-color:#6435c9!important;color:#fff!important}.ui.purple.table{border-top:.2em solid #a333c8}.ui.inverted.purple.table{background-color:#a333c8!important;color:#fff!important}.ui.pink.table{border-top:.2em solid #e03997}.ui.inverted.pink.table{background-color:#e03997!important;color:#fff!important}.ui.brown.table{border-top:.2em solid #a5673f}.ui.inverted.brown.table{background-color:#a5673f!important;color:#fff!important}.ui.grey.table{border-top:.2em solid #767676}.ui.inverted.grey.table{background-color:#767676!important;color:#fff!important}.ui.black.table{border-top:.2em solid #1b1c1d}.ui.inverted.black.table{background-color:#1b1c1d!important;color:#fff!important}.ui.one.column.table td{width:100%}.ui.two.column.table td{width:50%}.ui.three.column.table td{width:33.33333333%}.ui.four.column.table td{width:25%}.ui.five.column.table td{width:20%}.ui.six.column.table td{width:16.66666667%}.ui.seven.column.table td{width:14.28571429%}.ui.eight.column.table td{width:12.5%}.ui.nine.column.table td{width:11.11111111%}.ui.ten.column.table td{width:10%}.ui.eleven.column.table td{width:9.09090909%}.ui.twelve.column.table td{width:8.33333333%}.ui.thirteen.column.table td{width:7.69230769%}.ui.fourteen.column.table td{width:7.14285714%}.ui.fifteen.column.table td{width:6.66666667%}.ui.sixteen.column.table td{width:6.25%}.ui.table td.one.wide,.ui.table th.one.wide{width:6.25%}.ui.table td.two.wide,.ui.table th.two.wide{width:12.5%}.ui.table td.three.wide,.ui.table th.three.wide{width:18.75%}.ui.table td.four.wide,.ui.table th.four.wide{width:25%}.ui.table td.five.wide,.ui.table th.five.wide{width:31.25%}.ui.table td.six.wide,.ui.table th.six.wide{width:37.5%}.ui.table td.seven.wide,.ui.table th.seven.wide{width:43.75%}.ui.table td.eight.wide,.ui.table th.eight.wide{width:50%}.ui.table td.nine.wide,.ui.table th.nine.wide{width:56.25%}.ui.table td.ten.wide,.ui.table th.ten.wide{width:62.5%}.ui.table td.eleven.wide,.ui.table th.eleven.wide{width:68.75%}.ui.table td.twelve.wide,.ui.table th.twelve.wide{width:75%}.ui.table td.thirteen.wide,.ui.table th.thirteen.wide{width:81.25%}.ui.table td.fourteen.wide,.ui.table th.fourteen.wide{width:87.5%}.ui.table td.fifteen.wide,.ui.table th.fifteen.wide{width:93.75%}.ui.table td.sixteen.wide,.ui.table th.sixteen.wide{width:100%}.ui.sortable.table thead th{cursor:pointer;white-space:nowrap;border-left:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87)}.ui.sortable.table thead th:first-child{border-left:none}.ui.sortable.table thead th.sorted,.ui.sortable.table thead th.sorted:hover{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.sortable.table thead th:after{display:none;font-style:normal;font-weight:400;text-decoration:inherit;content:'';height:1em;width:auto;opacity:.8;margin:0 0 0 .5em;font-family:Icons}.ui.sortable.table thead th.ascending:after{content:'\\f0d8'}.ui.sortable.table thead th.descending:after{content:'\\f0d7'}.ui.sortable.table th.disabled:hover{cursor:auto;color:rgba(40,40,40,.3)}.ui.sortable.table thead th:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.8)}.ui.sortable.table thead th.sorted{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.sortable.table thead th.sorted:after{display:inline-block}.ui.sortable.table thead th.sorted:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.sortable.table thead th.sorted{background:rgba(255,255,255,.15) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.15) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.15) linear-gradient(transparent,rgba(0,0,0,.05));color:#fff}.ui.inverted.sortable.table thead th:hover{background:rgba(255,255,255,.08) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.08) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.08) linear-gradient(transparent,rgba(0,0,0,.05));color:#fff}.ui.inverted.sortable.table thead th{border-left-color:transparent;border-right-color:transparent}.ui.inverted.table{background:#333;color:rgba(255,255,255,.9);border:none}.ui.inverted.table th{background-color:rgba(0,0,0,.15);border-color:rgba(255,255,255,.1)!important;color:rgba(255,255,255,.9)!important}.ui.inverted.table tr td{border-color:rgba(255,255,255,.1)!important}.ui.inverted.table tr td.disabled,.ui.inverted.table tr.disabled td,.ui.inverted.table tr.disabled:hover td,.ui.inverted.table tr:hover td.disabled{pointer-events:none;color:rgba(225,225,225,.3)}.ui.inverted.definition.table tfoot:not(.full-width) th:first-child,.ui.inverted.definition.table thead:not(.full-width) th:first-child{background:#fff}.ui.inverted.definition.table tr td:first-child{background:rgba(255,255,255,.02);color:#fff}.ui.collapsing.table{width:auto}.ui.basic.table{background:0 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.table tfoot,.ui.basic.table thead{-webkit-box-shadow:none;box-shadow:none}.ui.basic.table th{background:0 0;border-left:none}.ui.basic.table tbody tr{border-bottom:1px solid rgba(0,0,0,.1)}.ui.basic.table td{background:0 0}.ui.basic.striped.table tbody tr:nth-child(2n){background-color:rgba(0,0,0,.05)!important}.ui[class*=\"very basic\"].table{border:none}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td,.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th{padding:''}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td:first-child,.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th:first-child{padding-left:0}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) td:last-child,.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) th:last-child{padding-right:0}.ui[class*=\"very basic\"].table:not(.sortable):not(.striped) thead tr:first-child th{padding-top:0}.ui.celled.table tr td,.ui.celled.table tr th{border-left:1px solid rgba(34,36,38,.1)}.ui.celled.table tr td:first-child,.ui.celled.table tr th:first-child{border-left:none}.ui.padded.table th{padding-left:1em;padding-right:1em}.ui.padded.table td,.ui.padded.table th{padding:1em 1em}.ui[class*=\"very padded\"].table th{padding-left:1.5em;padding-right:1.5em}.ui[class*=\"very padded\"].table td{padding:1.5em 1.5em}.ui.compact.table th{padding-left:.7em;padding-right:.7em}.ui.compact.table td{padding:.5em .7em}.ui[class*=\"very compact\"].table th{padding-left:.6em;padding-right:.6em}.ui[class*=\"very compact\"].table td{padding:.4em .6em}.ui.small.table{font-size:.9em}.ui.table{font-size:1em}.ui.large.table{font-size:1.1em}/*!\n * # Semantic UI 2.4.0 - Ad\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Copyright 2013 Contributors\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child{margin:0}.ui.ad:last-child{margin:0}.ui.ad iframe{margin:0;padding:0;border:none;overflow:hidden}.ui.leaderboard.ad{width:728px;height:90px}.ui[class*=\"medium rectangle\"].ad{width:300px;height:250px}.ui[class*=\"large rectangle\"].ad{width:336px;height:280px}.ui[class*=\"half page\"].ad{width:300px;height:600px}.ui.square.ad{width:250px;height:250px}.ui[class*=\"small square\"].ad{width:200px;height:200px}.ui[class*=\"small rectangle\"].ad{width:180px;height:150px}.ui[class*=\"vertical rectangle\"].ad{width:240px;height:400px}.ui.button.ad{width:120px;height:90px}.ui[class*=\"square button\"].ad{width:125px;height:125px}.ui[class*=\"small button\"].ad{width:120px;height:60px}.ui.skyscraper.ad{width:120px;height:600px}.ui[class*=\"wide skyscraper\"].ad{width:160px}.ui.banner.ad{width:468px;height:60px}.ui[class*=\"vertical banner\"].ad{width:120px;height:240px}.ui[class*=\"top banner\"].ad{width:930px;height:180px}.ui[class*=\"half banner\"].ad{width:234px;height:60px}.ui[class*=\"large leaderboard\"].ad{width:970px;height:90px}.ui.billboard.ad{width:970px;height:250px}.ui.panorama.ad{width:980px;height:120px}.ui.netboard.ad{width:580px;height:400px}.ui[class*=\"large mobile banner\"].ad{width:320px;height:100px}.ui[class*=\"mobile leaderboard\"].ad{width:320px;height:50px}.ui.mobile.ad{display:none}@media only screen and (max-width:767px){.ui.mobile.ad{display:block}}.ui.centered.ad{margin-left:auto;margin-right:auto}.ui.test.ad{position:relative;background:#545454}.ui.test.ad:after{position:absolute;top:50%;left:50%;width:100%;text-align:center;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);content:'Ad';color:#fff;font-size:1em;font-weight:700}.ui.mobile.test.ad:after{font-size:.85714286em}.ui.test.ad[data-text]:after{content:attr(data-text)}/*!\n * # Semantic UI 2.4.0 - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.card,.ui.cards>.card{max-width:100%;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:290px;min-height:0;background:#fff;padding:0;border:none;border-radius:.28571429rem;-webkit-box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #d4d4d5,0 0 0 1px #d4d4d5;-webkit-transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:-webkit-box-shadow .1s ease,-webkit-transform .1s ease;transition:box-shadow .1s ease,transform .1s ease;transition:box-shadow .1s ease,transform .1s ease,-webkit-box-shadow .1s ease,-webkit-transform .1s ease;z-index:''}.ui.card{margin:1em 0}.ui.card a,.ui.cards>.card a{cursor:pointer}.ui.card:first-child{margin-top:0}.ui.card:last-child{margin-bottom:0}.ui.cards{display:-webkit-box;display:-ms-flexbox;display:flex;margin:-.875em -.5em;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.cards>.card{display:-webkit-box;display:-ms-flexbox;display:flex;margin:.875em .5em;float:none}.ui.card:after,.ui.cards:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.cards~.ui.cards{margin-top:.875em}.ui.card>:first-child,.ui.cards>.card>:first-child{border-radius:.28571429rem .28571429rem 0 0!important;border-top:none!important}.ui.card>:last-child,.ui.cards>.card>:last-child{border-radius:0 0 .28571429rem .28571429rem!important}.ui.card>:only-child,.ui.cards>.card>:only-child{border-radius:.28571429rem!important}.ui.card>.image,.ui.cards>.card>.image{position:relative;display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;background:rgba(0,0,0,.05)}.ui.card>.image>img,.ui.cards>.card>.image>img{display:block;width:100%;height:auto;border-radius:inherit}.ui.card>.image:not(.ui)>img,.ui.cards>.card>.image:not(.ui)>img{border:none}.ui.card>.content,.ui.cards>.card>.content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border:none;border-top:1px solid rgba(34,36,38,.1);background:0 0;margin:0;padding:1em 1em;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border-radius:0}.ui.card>.content:after,.ui.cards>.card>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.card>.content>.header,.ui.cards>.card>.content>.header{display:block;margin:'';font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;color:rgba(0,0,0,.85)}.ui.card>.content>.header:not(.ui),.ui.cards>.card>.content>.header:not(.ui){font-weight:700;font-size:1.28571429em;margin-top:-.21425em;line-height:1.28571429em}.ui.card>.content>.header+.description,.ui.card>.content>.meta+.description,.ui.cards>.card>.content>.header+.description,.ui.cards>.card>.content>.meta+.description{margin-top:.5em}.ui.card [class*=\"left floated\"],.ui.cards>.card [class*=\"left floated\"]{float:left}.ui.card [class*=\"right floated\"],.ui.cards>.card [class*=\"right floated\"]{float:right}.ui.card [class*=\"left aligned\"],.ui.cards>.card [class*=\"left aligned\"]{text-align:left}.ui.card [class*=\"center aligned\"],.ui.cards>.card [class*=\"center aligned\"]{text-align:center}.ui.card [class*=\"right aligned\"],.ui.cards>.card [class*=\"right aligned\"]{text-align:right}.ui.card .content img,.ui.cards>.card .content img{display:inline-block;vertical-align:middle;width:''}.ui.card .avatar img,.ui.card img.avatar,.ui.cards>.card .avatar img,.ui.cards>.card img.avatar{width:2em;height:2em;border-radius:500rem}.ui.card>.content>.description,.ui.cards>.card>.content>.description{clear:both;color:rgba(0,0,0,.68)}.ui.card>.content p,.ui.cards>.card>.content p{margin:0 0 .5em}.ui.card>.content p:last-child,.ui.cards>.card>.content p:last-child{margin-bottom:0}.ui.card .meta,.ui.cards>.card .meta{font-size:1em;color:rgba(0,0,0,.4)}.ui.card .meta *,.ui.cards>.card .meta *{margin-right:.3em}.ui.card .meta :last-child,.ui.cards>.card .meta :last-child{margin-right:0}.ui.card .meta [class*=\"right floated\"],.ui.cards>.card .meta [class*=\"right floated\"]{margin-right:0;margin-left:.3em}.ui.card>.content a:not(.ui),.ui.cards>.card>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content a:not(.ui):hover,.ui.cards>.card>.content a:not(.ui):hover{color:''}.ui.card>.content>a.header,.ui.cards>.card>.content>a.header{color:rgba(0,0,0,.85)}.ui.card>.content>a.header:hover,.ui.cards>.card>.content>a.header:hover{color:#1e70bf}.ui.card .meta>a:not(.ui),.ui.cards>.card .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.card .meta>a:not(.ui):hover,.ui.cards>.card .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.card>.button,.ui.card>.buttons,.ui.cards>.card>.button,.ui.cards>.card>.buttons{margin:0 -1px;width:calc(100% + 2px)}.ui.card .dimmer,.ui.cards>.card .dimmer{background-color:'';z-index:10}.ui.card>.content .star.icon,.ui.cards>.card>.content .star.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .star.icon:hover,.ui.cards>.card>.content .star.icon:hover{opacity:1;color:#ffb70a}.ui.card>.content .active.star.icon,.ui.cards>.card>.content .active.star.icon{color:#ffe623}.ui.card>.content .like.icon,.ui.cards>.card>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.content .like.icon:hover,.ui.cards>.card>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.card>.content .active.like.icon,.ui.cards>.card>.content .active.like.icon{color:#ff2733}.ui.card>.extra,.ui.cards>.card>.extra{max-width:100%;min-height:0!important;-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;border-top:1px solid rgba(0,0,0,.05)!important;position:static;background:0 0;width:auto;margin:0 0;padding:.75em 1em;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.card>.extra a:not(.ui),.ui.cards>.card>.extra a:not(.ui){color:rgba(0,0,0,.4)}.ui.card>.extra a:not(.ui):hover,.ui.cards>.card>.extra a:not(.ui):hover{color:#1e70bf}.ui.raised.card,.ui.raised.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.link.cards .raised.card:hover,.ui.link.raised.card:hover,.ui.raised.cards a.card:hover,a.ui.raised.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.15),0 2px 10px 0 rgba(34,36,38,.25)}.ui.raised.card,.ui.raised.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px #d4d4d5,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.centered.cards{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.centered.card{margin-left:auto;margin-right:auto}.ui.fluid.card{width:100%;max-width:9999px}.ui.cards a.card,.ui.link.card,.ui.link.cards .card,a.ui.card{-webkit-transform:none;transform:none}.ui.cards a.card:hover,.ui.link.card:hover,.ui.link.cards .card:hover,a.ui.card:hover{cursor:pointer;z-index:5;background:#fff;border:none;-webkit-box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;box-shadow:0 1px 3px 0 #bcbdbd,0 0 0 1px #d4d4d5;-webkit-transform:translateY(-3px);transform:translateY(-3px)}.ui.cards>.red.card,.ui.red.card,.ui.red.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #db2828,0 1px 3px 0 #d4d4d5}.ui.cards>.red.card:hover,.ui.red.card:hover,.ui.red.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #d01919,0 1px 3px 0 #bcbdbd}.ui.cards>.orange.card,.ui.orange.card,.ui.orange.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f2711c,0 1px 3px 0 #d4d4d5}.ui.cards>.orange.card:hover,.ui.orange.card:hover,.ui.orange.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #f26202,0 1px 3px 0 #bcbdbd}.ui.cards>.yellow.card,.ui.yellow.card,.ui.yellow.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #fbbd08,0 1px 3px 0 #d4d4d5}.ui.cards>.yellow.card:hover,.ui.yellow.card:hover,.ui.yellow.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #eaae00,0 1px 3px 0 #bcbdbd}.ui.cards>.olive.card,.ui.olive.card,.ui.olive.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #b5cc18,0 1px 3px 0 #d4d4d5}.ui.cards>.olive.card:hover,.ui.olive.card:hover,.ui.olive.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a7bd0d,0 1px 3px 0 #bcbdbd}.ui.cards>.green.card,.ui.green.card,.ui.green.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #21ba45,0 1px 3px 0 #d4d4d5}.ui.cards>.green.card:hover,.ui.green.card:hover,.ui.green.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #16ab39,0 1px 3px 0 #bcbdbd}.ui.cards>.teal.card,.ui.teal.card,.ui.teal.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #00b5ad,0 1px 3px 0 #d4d4d5}.ui.cards>.teal.card:hover,.ui.teal.card:hover,.ui.teal.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #009c95,0 1px 3px 0 #bcbdbd}.ui.blue.card,.ui.blue.cards>.card,.ui.cards>.blue.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #2185d0,0 1px 3px 0 #d4d4d5}.ui.blue.card:hover,.ui.blue.cards>.card:hover,.ui.cards>.blue.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1678c2,0 1px 3px 0 #bcbdbd}.ui.cards>.violet.card,.ui.violet.card,.ui.violet.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #6435c9,0 1px 3px 0 #d4d4d5}.ui.cards>.violet.card:hover,.ui.violet.card:hover,.ui.violet.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #5829bb,0 1px 3px 0 #bcbdbd}.ui.cards>.purple.card,.ui.purple.card,.ui.purple.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a333c8,0 1px 3px 0 #d4d4d5}.ui.cards>.purple.card:hover,.ui.purple.card:hover,.ui.purple.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #9627ba,0 1px 3px 0 #bcbdbd}.ui.cards>.pink.card,.ui.pink.card,.ui.pink.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e03997,0 1px 3px 0 #d4d4d5}.ui.cards>.pink.card:hover,.ui.pink.card:hover,.ui.pink.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #e61a8d,0 1px 3px 0 #bcbdbd}.ui.brown.card,.ui.brown.cards>.card,.ui.cards>.brown.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #a5673f,0 1px 3px 0 #d4d4d5}.ui.brown.card:hover,.ui.brown.cards>.card:hover,.ui.cards>.brown.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #975b33,0 1px 3px 0 #bcbdbd}.ui.cards>.grey.card,.ui.grey.card,.ui.grey.cards>.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #767676,0 1px 3px 0 #d4d4d5}.ui.cards>.grey.card:hover,.ui.grey.card:hover,.ui.grey.cards>.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #838383,0 1px 3px 0 #bcbdbd}.ui.black.card,.ui.black.cards>.card,.ui.cards>.black.card{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #1b1c1d,0 1px 3px 0 #d4d4d5}.ui.black.card:hover,.ui.black.cards>.card:hover,.ui.cards>.black.card:hover{-webkit-box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd;box-shadow:0 0 0 1px #d4d4d5,0 2px 0 0 #27292a,0 1px 3px 0 #bcbdbd}.ui.one.cards{margin-left:0;margin-right:0}.ui.one.cards>.card{width:100%}.ui.two.cards{margin-left:-1em;margin-right:-1em}.ui.two.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.three.cards{margin-left:-1em;margin-right:-1em}.ui.three.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.four.cards{margin-left:-.75em;margin-right:-.75em}.ui.four.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.five.cards{margin-left:-.75em;margin-right:-.75em}.ui.five.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.six.cards{margin-left:-.75em;margin-right:-.75em}.ui.six.cards>.card{width:calc(16.66666667% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.seven.cards{margin-left:-.5em;margin-right:-.5em}.ui.seven.cards>.card{width:calc(14.28571429% - 1em);margin-left:.5em;margin-right:.5em}.ui.eight.cards{margin-left:-.5em;margin-right:-.5em}.ui.eight.cards>.card{width:calc(12.5% - 1em);margin-left:.5em;margin-right:.5em;font-size:11px}.ui.nine.cards{margin-left:-.5em;margin-right:-.5em}.ui.nine.cards>.card{width:calc(11.11111111% - 1em);margin-left:.5em;margin-right:.5em;font-size:10px}.ui.ten.cards{margin-left:-.5em;margin-right:-.5em}.ui.ten.cards>.card{width:calc(10% - 1em);margin-left:.5em;margin-right:.5em}@media only screen and (max-width:767px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards>.card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.seven.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.seven.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.nine.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.nine.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.ten.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.ten.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}}@media only screen and (min-width:768px) and (max-width:991px){.ui.two.doubling.cards{margin-left:0;margin-right:0}.ui.two.doubling.cards>.card{width:100%;margin-left:0;margin-right:0}.ui.three.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.three.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.four.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.four.doubling.cards>.card{width:calc(50% - 2em);margin-left:1em;margin-right:1em}.ui.five.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.five.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.six.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.six.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-1em;margin-right:-1em}.ui.eight.doubling.cards>.card{width:calc(33.33333333% - 2em);margin-left:1em;margin-right:1em}.ui.eight.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.eight.doubling.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.nine.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.nine.doubling.cards>.card{width:calc(25% - 1.5em);margin-left:.75em;margin-right:.75em}.ui.ten.doubling.cards{margin-left:-.75em;margin-right:-.75em}.ui.ten.doubling.cards>.card{width:calc(20% - 1.5em);margin-left:.75em;margin-right:.75em}}@media only screen and (max-width:767px){.ui.stackable.cards{display:block!important}.ui.stackable.cards .card:first-child{margin-top:0!important}.ui.stackable.cards>.card{display:block!important;height:auto!important;margin:1em 1em;padding:0!important;width:calc(100% - 2em)!important}}.ui.cards>.card{font-size:1em}/*!\n * # Semantic UI 2.4.0 - Comment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.comments{margin:1.5em 0;max-width:650px}.ui.comments:first-child{margin-top:0}.ui.comments:last-child{margin-bottom:0}.ui.comments .comment{position:relative;background:0 0;margin:.5em 0 0;padding:.5em 0 0;border:none;border-top:none;line-height:1.2}.ui.comments .comment:first-child{margin-top:0;padding-top:0}.ui.comments .comment .comments{margin:0 0 .5em .5em;padding:1em 0 1em 1em}.ui.comments .comment .comments:before{position:absolute;top:0;left:0}.ui.comments .comment .comments .comment{border:none;border-top:none;background:0 0}.ui.comments .comment .avatar{display:block;width:2.5em;height:auto;float:left;margin:.2em 0 0}.ui.comments .comment .avatar img,.ui.comments .comment img.avatar{display:block;margin:0 auto;width:100%;height:100%;border-radius:.25rem}.ui.comments .comment>.content{display:block}.ui.comments .comment>.avatar~.content{margin-left:3.5em}.ui.comments .comment .author{font-size:1em;color:rgba(0,0,0,.87);font-weight:700}.ui.comments .comment a.author{cursor:pointer}.ui.comments .comment a.author:hover{color:#1e70bf}.ui.comments .comment .metadata{display:inline-block;margin-left:.5em;color:rgba(0,0,0,.4);font-size:.875em}.ui.comments .comment .metadata>*{display:inline-block;margin:0 .5em 0 0}.ui.comments .comment .metadata>:last-child{margin-right:0}.ui.comments .comment .text{margin:.25em 0 .5em;font-size:1em;word-wrap:break-word;color:rgba(0,0,0,.87);line-height:1.3}.ui.comments .comment .actions{font-size:.875em}.ui.comments .comment .actions a{cursor:pointer;display:inline-block;margin:0 .75em 0 0;color:rgba(0,0,0,.4)}.ui.comments .comment .actions a:last-child{margin-right:0}.ui.comments .comment .actions a.active,.ui.comments .comment .actions a:hover{color:rgba(0,0,0,.8)}.ui.comments>.reply.form{margin-top:1em}.ui.comments .comment .reply.form{width:100%;margin-top:1em}.ui.comments .reply.form textarea{font-size:1em;height:12em}.ui.collapsed.comments,.ui.comments .collapsed.comment,.ui.comments .collapsed.comments{display:none}.ui.threaded.comments .comment .comments{margin:-1.5em 0 -1em 1.25em;padding:3em 0 2em 2.25em;-webkit-box-shadow:-1px 0 0 rgba(34,36,38,.15);box-shadow:-1px 0 0 rgba(34,36,38,.15)}.ui.minimal.comments .comment .actions{opacity:0;position:absolute;top:0;right:0;left:auto;-webkit-transition:opacity .2s ease;transition:opacity .2s ease;-webkit-transition-delay:.1s;transition-delay:.1s}.ui.minimal.comments .comment>.content:hover>.actions{opacity:1}.ui.mini.comments{font-size:.78571429rem}.ui.tiny.comments{font-size:.85714286rem}.ui.small.comments{font-size:.92857143rem}.ui.comments{font-size:1rem}.ui.large.comments{font-size:1.14285714rem}.ui.big.comments{font-size:1.28571429rem}.ui.huge.comments{font-size:1.42857143rem}.ui.massive.comments{font-size:1.71428571rem}/*!\n * # Semantic UI 2.4.0 - Feed\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.feed{margin:1em 0}.ui.feed:first-child{margin-top:0}.ui.feed:last-child{margin-bottom:0}.ui.feed>.event{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;width:100%;padding:.21428571rem 0;margin:0;background:0 0;border-top:none}.ui.feed>.event:first-child{border-top:0;padding-top:0}.ui.feed>.event:last-child{padding-bottom:0}.ui.feed>.event>.label{display:block;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:2.5em;height:auto;-ms-flex-item-align:stretch;align-self:stretch;text-align:left}.ui.feed>.event>.label .icon{opacity:1;font-size:1.5em;width:100%;padding:.25em;background:0 0;border:none;border-radius:none;color:rgba(0,0,0,.6)}.ui.feed>.event>.label img{width:100%;height:auto;border-radius:500rem}.ui.feed>.event>.label+.content{margin:.5em 0 .35714286em 1.14285714em}.ui.feed>.event>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;-ms-flex-item-align:stretch;align-self:stretch;text-align:left;word-wrap:break-word}.ui.feed>.event:last-child>.content{padding-bottom:0}.ui.feed>.event>.content a{cursor:pointer}.ui.feed>.event>.content .date{margin:-.5rem 0 0;padding:0;font-weight:400;font-size:1em;font-style:normal;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .summary{margin:0;font-size:1em;font-weight:700;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .summary img{display:inline-block;width:auto;height:10em;margin:-.25em .25em 0 0;border-radius:.25em;vertical-align:middle}.ui.feed>.event>.content .user{display:inline-block;font-weight:700;margin-right:0;vertical-align:baseline}.ui.feed>.event>.content .user img{margin:-.25em .25em 0 0;width:auto;height:10em;vertical-align:middle}.ui.feed>.event>.content .summary>.date{display:inline-block;float:none;font-weight:400;font-size:.85714286em;font-style:normal;margin:0 0 0 .5em;padding:0;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .extra{margin:.5em 0 0;background:0 0;padding:0;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .extra.images img{display:inline-block;margin:0 .25em 0 0;width:6em}.ui.feed>.event>.content .extra.text{padding:0;border-left:none;font-size:1em;max-width:500px;line-height:1.4285em}.ui.feed>.event>.content .meta{display:inline-block;font-size:.85714286em;margin:.5em 0 0;background:0 0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;padding:0;color:rgba(0,0,0,.6)}.ui.feed>.event>.content .meta>*{position:relative;margin-left:.75em}.ui.feed>.event>.content .meta>:after{content:'';color:rgba(0,0,0,.2);top:0;left:-1em;opacity:1;position:absolute;vertical-align:top}.ui.feed>.event>.content .meta .like{color:'';-webkit-transition:.2s color ease;transition:.2s color ease}.ui.feed>.event>.content .meta .like:hover .icon{color:#ff2733}.ui.feed>.event>.content .meta .active.like .icon{color:#ef404a}.ui.feed>.event>.content .meta>:first-child{margin-left:0}.ui.feed>.event>.content .meta>:first-child::after{display:none}.ui.feed>.event>.content .meta a,.ui.feed>.event>.content .meta>.icon{cursor:pointer;opacity:1;color:rgba(0,0,0,.5);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.feed>.event>.content .meta a:hover,.ui.feed>.event>.content .meta a:hover .icon,.ui.feed>.event>.content .meta>.icon:hover{color:rgba(0,0,0,.95)}.ui.small.feed{font-size:.92857143rem}.ui.feed{font-size:1rem}.ui.large.feed{font-size:1.14285714rem}/*!\n * # Semantic UI 2.4.0 - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.items>.item{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:-webkit-box-shadow .1s ease;transition:-webkit-box-shadow .1s ease;transition:box-shadow .1s ease;transition:box-shadow .1s ease,-webkit-box-shadow .1s ease;z-index:''}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';-ms-flex-item-align:top;align-self:top}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;-ms-flex-item-align:top;align-self:top;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*=\"left floated\"]{float:left}.ui.items>.item [class*=\"right floated\"]{float:right}.ui.items>.item .content img{-ms-flex-item-align:middle;align-self:middle;width:''}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:'';height:'';border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0 .5em;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*=\"right floated\"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:''}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#ffb70a}.ui.items>.item>.content .active.favorite.icon{color:#ffe623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#ff2733}.ui.items>.item>.content .active.like.icon{color:#ff2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0 0 0;top:0;left:0;color:rgba(0,0,0,.4);-webkit-box-shadow:none;box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*=\"right floated\"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767px){.ui.items:not(.unstackable)>.item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items:not(.unstackable)>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items:not(.unstackable)>.item>.image,.ui.items:not(.unstackable)>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items:not(.unstackable)>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*=\"top aligned\"].content{-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*=\"middle aligned\"].content{-ms-flex-item-align:center;align-self:center}.ui.items>.item>.image+[class*=\"bottom aligned\"].content{-ms-flex-item-align:end;align-self:flex-end}.ui.relaxed.items>.item{margin:1.5em 0}.ui[class*=\"very relaxed\"].items>.item{margin:2em 0}.ui.divided.items>.item{border-top:1px solid rgba(34,36,38,.15);margin:0;padding:1em 0}.ui.divided.items>.item:first-child{border-top:none;margin-top:0!important;padding-top:0!important}.ui.divided.items>.item:last-child{margin-bottom:0!important;padding-bottom:0!important}.ui.relaxed.divided.items>.item{margin:0;padding:1.5em 0}.ui[class*=\"very relaxed\"].divided.items>.item{margin:0;padding:2em 0}.ui.items a.item:hover,.ui.link.items>.item:hover{cursor:pointer}.ui.items a.item:hover .content .header,.ui.link.items>.item:hover .content .header{color:#1e70bf}.ui.items>.item{font-size:1em}@media only screen and (max-width:767px){.ui.unstackable.items>.item>.image,.ui.unstackable.items>.item>.image>img{width:125px!important}}/*!\n * # Semantic UI 2.4.0 - Statistic\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:1em 0;max-width:auto}.ui.statistic+.ui.statistic{margin:0 0 0 1.5em}.ui.statistic:first-child{margin-top:0}.ui.statistic:last-child{margin-bottom:0}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.statistics>.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 1.5em 1em;max-width:auto}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em -1.5em -1em}.ui.statistics:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:4rem;font-weight:400;line-height:1em;color:#1b1c1d;text-transform:uppercase;text-align:center}.ui.statistic>.label,.ui.statistics .statistic>.label{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;font-weight:700;color:rgba(0,0,0,.87);text-transform:uppercase;text-align:center}.ui.statistic>.label~.value,.ui.statistics .statistic>.label~.value{margin-top:0}.ui.statistic>.value~.label,.ui.statistics .statistic>.value~.label{margin-top:0}.ui.statistic>.value .icon,.ui.statistics .statistic>.value .icon{opacity:1;width:auto;margin:0}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{line-height:1em;min-height:2em;font-weight:700;text-align:center}.ui.statistic>.text.value+.label,.ui.statistics .statistic>.text.value+.label{text-align:center}.ui.statistic>.value img,.ui.statistics .statistic>.value img{max-height:3rem;vertical-align:baseline}.ui.ten.statistics{margin:0 0 -1em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 1em}.ui.nine.statistics{margin:0 0 -1em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 1em}.ui.eight.statistics{margin:0 0 -1em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 1em}.ui.seven.statistics{margin:0 0 -1em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 1em}.ui.six.statistics{margin:0 0 -1em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 1em}.ui.five.statistics{margin:0 0 -1em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 1em}.ui.four.statistics{margin:0 0 -1em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 1em}.ui.three.statistics{margin:0 0 -1em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 1em}.ui.two.statistics{margin:0 0 -1em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 1em}.ui.one.statistics{margin:0 0 -1em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 1em}.ui.horizontal.statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.horizontal.statistics{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:none;margin:1em 0}.ui.horizontal.statistic>.text.value,.ui.horizontal.statistics>.statistic>.text.value{min-height:0!important}.ui.horizontal.statistic>.value .icon,.ui.horizontal.statistics .statistic>.value .icon{width:1.18em}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle}.ui.horizontal.statistic>.label,.ui.horizontal.statistics .statistic>.label{display:inline-block;vertical-align:middle;margin:0 0 0 .75em}.ui.red.statistic>.value,.ui.red.statistics .statistic>.value,.ui.statistics .red.statistic>.value{color:#db2828}.ui.orange.statistic>.value,.ui.orange.statistics .statistic>.value,.ui.statistics .orange.statistic>.value{color:#f2711c}.ui.statistics .yellow.statistic>.value,.ui.yellow.statistic>.value,.ui.yellow.statistics .statistic>.value{color:#fbbd08}.ui.olive.statistic>.value,.ui.olive.statistics .statistic>.value,.ui.statistics .olive.statistic>.value{color:#b5cc18}.ui.green.statistic>.value,.ui.green.statistics .statistic>.value,.ui.statistics .green.statistic>.value{color:#21ba45}.ui.statistics .teal.statistic>.value,.ui.teal.statistic>.value,.ui.teal.statistics .statistic>.value{color:#00b5ad}.ui.blue.statistic>.value,.ui.blue.statistics .statistic>.value,.ui.statistics .blue.statistic>.value{color:#2185d0}.ui.statistics .violet.statistic>.value,.ui.violet.statistic>.value,.ui.violet.statistics .statistic>.value{color:#6435c9}.ui.purple.statistic>.value,.ui.purple.statistics .statistic>.value,.ui.statistics .purple.statistic>.value{color:#a333c8}.ui.pink.statistic>.value,.ui.pink.statistics .statistic>.value,.ui.statistics .pink.statistic>.value{color:#e03997}.ui.brown.statistic>.value,.ui.brown.statistics .statistic>.value,.ui.statistics .brown.statistic>.value{color:#a5673f}.ui.grey.statistic>.value,.ui.grey.statistics .statistic>.value,.ui.statistics .grey.statistic>.value{color:#767676}.ui.inverted.statistic .value,.ui.inverted.statistics .statistic>.value{color:#fff}.ui.inverted.statistic .label,.ui.inverted.statistics .statistic>.label{color:rgba(255,255,255,.9)}.ui.inverted.red.statistic>.value,.ui.inverted.red.statistics .statistic>.value,.ui.statistics .inverted.red.statistic>.value{color:#ff695e}.ui.inverted.orange.statistic>.value,.ui.inverted.orange.statistics .statistic>.value,.ui.statistics .inverted.orange.statistic>.value{color:#ff851b}.ui.inverted.yellow.statistic>.value,.ui.inverted.yellow.statistics .statistic>.value,.ui.statistics .inverted.yellow.statistic>.value{color:#ffe21f}.ui.inverted.olive.statistic>.value,.ui.inverted.olive.statistics .statistic>.value,.ui.statistics .inverted.olive.statistic>.value{color:#d9e778}.ui.inverted.green.statistic>.value,.ui.inverted.green.statistics .statistic>.value,.ui.statistics .inverted.green.statistic>.value{color:#2ecc40}.ui.inverted.teal.statistic>.value,.ui.inverted.teal.statistics .statistic>.value,.ui.statistics .inverted.teal.statistic>.value{color:#6dffff}.ui.inverted.blue.statistic>.value,.ui.inverted.blue.statistics .statistic>.value,.ui.statistics .inverted.blue.statistic>.value{color:#54c8ff}.ui.inverted.violet.statistic>.value,.ui.inverted.violet.statistics .statistic>.value,.ui.statistics .inverted.violet.statistic>.value{color:#a291fb}.ui.inverted.purple.statistic>.value,.ui.inverted.purple.statistics .statistic>.value,.ui.statistics .inverted.purple.statistic>.value{color:#dc73ff}.ui.inverted.pink.statistic>.value,.ui.inverted.pink.statistics .statistic>.value,.ui.statistics .inverted.pink.statistic>.value{color:#ff8edf}.ui.inverted.brown.statistic>.value,.ui.inverted.brown.statistics .statistic>.value,.ui.statistics .inverted.brown.statistic>.value{color:#d67c1c}.ui.inverted.grey.statistic>.value,.ui.inverted.grey.statistics .statistic>.value,.ui.statistics .inverted.grey.statistic>.value{color:#dcddde}.ui[class*=\"left floated\"].statistic{float:left;margin:0 2em 1em 0}.ui[class*=\"right floated\"].statistic{float:right;margin:0 0 1em 2em}.ui.floated.statistic:last-child{margin-bottom:0}.ui.mini.statistic>.value,.ui.mini.statistics .statistic>.value{font-size:1.5rem!important}.ui.mini.horizontal.statistic>.value,.ui.mini.horizontal.statistics .statistic>.value{font-size:1.5rem!important}.ui.mini.statistic>.text.value,.ui.mini.statistics .statistic>.text.value{font-size:1rem!important}.ui.tiny.statistic>.value,.ui.tiny.statistics .statistic>.value{font-size:2rem!important}.ui.tiny.horizontal.statistic>.value,.ui.tiny.horizontal.statistics .statistic>.value{font-size:2rem!important}.ui.tiny.statistic>.text.value,.ui.tiny.statistics .statistic>.text.value{font-size:1rem!important}.ui.small.statistic>.value,.ui.small.statistics .statistic>.value{font-size:3rem!important}.ui.small.horizontal.statistic>.value,.ui.small.horizontal.statistics .statistic>.value{font-size:2rem!important}.ui.small.statistic>.text.value,.ui.small.statistics .statistic>.text.value{font-size:1rem!important}.ui.statistic>.value,.ui.statistics .statistic>.value{font-size:4rem!important}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{font-size:3rem!important}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{font-size:2rem!important}.ui.large.statistic>.value,.ui.large.statistics .statistic>.value{font-size:5rem!important}.ui.large.horizontal.statistic>.value,.ui.large.horizontal.statistics .statistic>.value{font-size:4rem!important}.ui.large.statistic>.text.value,.ui.large.statistics .statistic>.text.value{font-size:2.5rem!important}.ui.huge.statistic>.value,.ui.huge.statistics .statistic>.value{font-size:6rem!important}.ui.huge.horizontal.statistic>.value,.ui.huge.horizontal.statistics .statistic>.value{font-size:5rem!important}.ui.huge.statistic>.text.value,.ui.huge.statistics .statistic>.text.value{font-size:2.5rem!important}/*!\n * # Semantic UI 2.4.0 - Accordion\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.accordion,.ui.accordion .accordion{max-width:100%}.ui.accordion .accordion{margin:1em 0 0;padding:0}.ui.accordion .accordion .title,.ui.accordion .title{cursor:pointer}.ui.accordion .title:not(.ui){padding:.5em 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;color:rgba(0,0,0,.87)}.ui.accordion .accordion .title~.content,.ui.accordion .title~.content{display:none}.ui.accordion:not(.styled) .accordion .title~.content:not(.ui),.ui.accordion:not(.styled) .title~.content:not(.ui){margin:'';padding:.5em 0 1em}.ui.accordion:not(.styled) .title~.content:not(.ui):last-child{padding-bottom:0}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{display:inline-block;float:none;opacity:1;width:1.25em;height:1em;margin:0 .25rem 0 0;padding:0;font-size:1em;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease;vertical-align:baseline;-webkit-transform:none;transform:none}.ui.accordion.menu .item .title{display:block;padding:0}.ui.accordion.menu .item .title>.dropdown.icon{float:right;margin:.21425em 0 0 1em;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.ui.accordion .ui.header .dropdown.icon{font-size:1em;margin:0 .25rem 0 0}.ui.accordion .accordion .active.title .dropdown.icon,.ui.accordion .active.title .dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.accordion.menu .item .active.title>.dropdown.icon{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ui.styled.accordion{width:600px}.ui.styled.accordion,.ui.styled.accordion .accordion{border-radius:.28571429rem;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15)}.ui.styled.accordion .accordion .title,.ui.styled.accordion .title{margin:0;padding:.75em 1em;color:rgba(0,0,0,.4);font-weight:700;border-top:1px solid rgba(34,36,38,.15);-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.styled.accordion .accordion .title:first-child,.ui.styled.accordion>.title:first-child{border-top:none}.ui.styled.accordion .accordion .content,.ui.styled.accordion .content{margin:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .content{padding:0;padding:.5em 1em 1.5em}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover,.ui.styled.accordion .active.title,.ui.styled.accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .accordion .active.title,.ui.styled.accordion .accordion .title:hover{background:0 0;color:rgba(0,0,0,.87)}.ui.styled.accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.styled.accordion .accordion .active.title{background:0 0;color:rgba(0,0,0,.95)}.ui.accordion .accordion .active.content,.ui.accordion .active.content{display:block}.ui.fluid.accordion,.ui.fluid.accordion .accordion{width:100%}.ui.inverted.accordion .title:not(.ui){color:rgba(255,255,255,.9)}@font-face{font-family:Accordion;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMggjB5AAAAC8AAAAYGNtYXAPfOIKAAABHAAAAExnYXNwAAAAEAAAAWgAAAAIZ2x5Zryj6HgAAAFwAAAAyGhlYWT/0IhHAAACOAAAADZoaGVhApkB5wAAAnAAAAAkaG10eAJuABIAAAKUAAAAGGxvY2EAjABWAAACrAAAAA5tYXhwAAgAFgAAArwAAAAgbmFtZfC1n04AAALcAAABPHBvc3QAAwAAAAAEGAAAACAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAAAAAAAAAIAADc5AQAAAAABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQASAEkAtwFuABMAADc0PwE2FzYXFh0BFAcGJwYvASY1EgaABQgHBQYGBQcIBYAG2wcGfwcBAQcECf8IBAcBAQd/BgYAAAAAAQAAAEkApQFuABMAADcRNDc2MzIfARYVFA8BBiMiJyY1AAUGBwgFgAYGgAUIBwYFWwEACAUGBoAFCAcFgAYGBQcAAAABAAAAAQAAqWYls18PPPUACwIAAAAAAM/9o+4AAAAAz/2j7gAAAAAAtwFuAAAACAACAAAAAAAAAAEAAAHg/+AAAAIAAAAAAAC3AAEAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAQAAAAC3ABIAtwAAAAAAAAAKABQAHgBCAGQAAAABAAAABgAUAAEAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRk9UVE8AAASwAAoAAAAABGgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABDRkYgAAAA9AAAAS0AAAEtFpovuE9TLzIAAAIkAAAAYAAAAGAIIweQY21hcAAAAoQAAABMAAAATA984gpnYXNwAAAC0AAAAAgAAAAIAAAAEGhlYWQAAALYAAAANgAAADb/0IhHaGhlYQAAAxAAAAAkAAAAJAKZAedobXR4AAADNAAAABgAAAAYAm4AEm1heHAAAANMAAAABgAAAAYABlAAbmFtZQAAA1QAAAE8AAABPPC1n05wb3N0AAAEkAAAACAAAAAgAAMAAAEABAQAAQEBB3JhdGluZwABAgABADr4HAL4GwP4GAQeCgAZU/+Lix4KABlT/4uLDAeLa/iU+HQFHQAAAHkPHQAAAH4RHQAAAAkdAAABJBIABwEBBw0PERQZHnJhdGluZ3JhdGluZ3UwdTF1MjB1RjBEOXVGMERBAAACAYkABAAGAQEEBwoNVp38lA78lA78lA77lA773Z33bxWLkI2Qj44I9xT3FAWOj5CNkIuQi4+JjoePiI2Gi4YIi/uUBYuGiYeHiIiHh4mGi4aLho2Ijwj7FPcUBYeOiY+LkAgO+92L5hWL95QFi5CNkI6Oj4+PjZCLkIuQiY6HCPcU+xQFj4iNhouGi4aJh4eICPsU+xQFiIeGiYaLhouHjYePiI6Jj4uQCA74lBT4lBWLDAoAAAAAAwIAAZAABQAAAUwBZgAAAEcBTAFmAAAA9QAZAIQAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADw2gHg/+D/4AHgACAAAAABAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEADgAAAAKAAgAAgACAAEAIPDa//3//wAAAAAAIPDZ//3//wAB/+MPKwADAAEAAAAAAAAAAAAAAAEAAf//AA8AAQAAAAEAADfYOJZfDzz1AAsCAAAAAADP/aPuAAAAAM/9o+4AAAAAALcBbgAAAAgAAgAAAAAAAAABAAAB4P/gAAACAAAAAAAAtwABAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAEAAAAAtwASALcAAAAAUAAABgAAAAAADgCuAAEAAAAAAAEADAAAAAEAAAAAAAIADgBAAAEAAAAAAAMADAAiAAEAAAAAAAQADABOAAEAAAAAAAUAFgAMAAEAAAAAAAYABgAuAAEAAAAAAAoANABaAAMAAQQJAAEADAAAAAMAAQQJAAIADgBAAAMAAQQJAAMADAAiAAMAAQQJAAQADABOAAMAAQQJAAUAFgAMAAMAAQQJAAYADAA0AAMAAQQJAAoANABaAHIAYQB0AGkAbgBnAFYAZQByAHMAaQBvAG4AIAAxAC4AMAByAGEAdABpAG4AZ3JhdGluZwByAGEAdABpAG4AZwBSAGUAZwB1AGwAYQByAHIAYQB0AGkAbgBnAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff');font-weight:400;font-style:normal}.ui.accordion .accordion .title .dropdown.icon,.ui.accordion .title .dropdown.icon{font-family:Accordion;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.accordion .accordion .title .dropdown.icon:before,.ui.accordion .title .dropdown.icon:before{content:'\\f0da'}/*!\n * # Semantic UI 2.4.0 - Checkbox\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.checkbox{position:relative;display:inline-block;-webkit-backface-visibility:hidden;backface-visibility:hidden;outline:0;vertical-align:baseline;font-style:normal;min-height:17px;font-size:1rem;line-height:17px;min-width:17px}.ui.checkbox input[type=checkbox],.ui.checkbox input[type=radio]{cursor:pointer;position:absolute;top:0;left:0;opacity:0!important;outline:0;z-index:3;width:17px;height:17px}.ui.checkbox .box,.ui.checkbox label{cursor:auto;position:relative;display:block;padding-left:1.85714em;outline:0;font-size:1em}.ui.checkbox .box:before,.ui.checkbox label:before{position:absolute;top:0;left:0;width:17px;height:17px;content:'';background:#fff;border-radius:.21428571rem;-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;border:1px solid #d4d4d5}.ui.checkbox .box:after,.ui.checkbox label:after{position:absolute;font-size:14px;top:0;left:0;width:17px;height:17px;text-align:center;opacity:0;color:rgba(0,0,0,.87);-webkit-transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease;transition:border .1s ease,opacity .1s ease,transform .1s ease,box-shadow .1s ease,-webkit-transform .1s ease,-webkit-box-shadow .1s ease}.ui.checkbox label,.ui.checkbox+label{color:rgba(0,0,0,.87);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.checkbox+label{vertical-align:middle}.ui.checkbox .box:hover::before,.ui.checkbox label:hover::before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox label:hover,.ui.checkbox+label:hover{color:rgba(0,0,0,.8)}.ui.checkbox .box:active::before,.ui.checkbox label:active::before{background:#f9fafb;border-color:rgba(34,36,38,.35)}.ui.checkbox .box:active::after,.ui.checkbox label:active::after{color:rgba(0,0,0,.95)}.ui.checkbox input:active~label{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~.box:before,.ui.checkbox input:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:focus~.box:after,.ui.checkbox input:focus~label:after{color:rgba(0,0,0,.95)}.ui.checkbox input:focus~label{color:rgba(0,0,0,.95)}.ui.checkbox input:checked~.box:before,.ui.checkbox input:checked~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:not([type=radio]):indeterminate~.box:before,.ui.checkbox input:not([type=radio]):indeterminate~label:before{background:#fff;border-color:rgba(34,36,38,.35)}.ui.checkbox input:not([type=radio]):indeterminate~.box:after,.ui.checkbox input:not([type=radio]):indeterminate~label:after{opacity:1;color:rgba(0,0,0,.95)}.ui.checkbox input:checked:focus~.box:before,.ui.checkbox input:checked:focus~label:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:before,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:before{background:#fff;border-color:#96c8da}.ui.checkbox input:checked:focus~.box:after,.ui.checkbox input:checked:focus~label:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~.box:after,.ui.checkbox input:not([type=radio]):indeterminate:focus~label:after{color:rgba(0,0,0,.95)}.ui.read-only.checkbox,.ui.read-only.checkbox label{cursor:default}.ui.checkbox input[disabled]~.box:after,.ui.checkbox input[disabled]~label,.ui.disabled.checkbox .box:after,.ui.disabled.checkbox label{cursor:default!important;opacity:.5;color:#000}.ui.checkbox input.hidden{z-index:-1}.ui.checkbox input.hidden+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.radio.checkbox{min-height:15px}.ui.radio.checkbox .box,.ui.radio.checkbox label{padding-left:1.85714em}.ui.radio.checkbox .box:before,.ui.radio.checkbox label:before{content:'';-webkit-transform:none;transform:none;width:15px;height:15px;border-radius:500rem;top:1px;left:0}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{border:none;content:''!important;width:15px;height:15px;line-height:15px}.ui.radio.checkbox .box:after,.ui.radio.checkbox label:after{top:1px;left:0;width:15px;height:15px;border-radius:500rem;-webkit-transform:scale(.46666667);transform:scale(.46666667);background-color:rgba(0,0,0,.87)}.ui.radio.checkbox input:focus~.box:before,.ui.radio.checkbox input:focus~label:before{background-color:#fff}.ui.radio.checkbox input:focus~.box:after,.ui.radio.checkbox input:focus~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:indeterminate~.box:after,.ui.radio.checkbox input:indeterminate~label:after{opacity:0}.ui.radio.checkbox input:checked~.box:before,.ui.radio.checkbox input:checked~label:before{background-color:#fff}.ui.radio.checkbox input:checked~.box:after,.ui.radio.checkbox input:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.radio.checkbox input:focus:checked~.box:before,.ui.radio.checkbox input:focus:checked~label:before{background-color:#fff}.ui.radio.checkbox input:focus:checked~.box:after,.ui.radio.checkbox input:focus:checked~label:after{background-color:rgba(0,0,0,.95)}.ui.slider.checkbox{min-height:1.25rem}.ui.slider.checkbox input{width:3.5rem;height:1.25rem}.ui.slider.checkbox .box,.ui.slider.checkbox label{padding-left:4.5rem;line-height:1rem;color:rgba(0,0,0,.4)}.ui.slider.checkbox .box:before,.ui.slider.checkbox label:before{display:block;position:absolute;content:'';border:none!important;left:0;z-index:1;top:.4rem;background-color:rgba(0,0,0,.05);width:3.5rem;height:.21428571rem;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider.checkbox .box:after,.ui.slider.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:-.25rem;left:0;-webkit-transform:none;transform:none;border-radius:500rem;-webkit-transition:left .3s ease;transition:left .3s ease}.ui.slider.checkbox input:focus~.box:before,.ui.slider.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.slider.checkbox .box:hover,.ui.slider.checkbox label:hover{color:rgba(0,0,0,.8)}.ui.slider.checkbox .box:hover::before,.ui.slider.checkbox label:hover::before{background:rgba(0,0,0,.15)}.ui.slider.checkbox input:checked~.box,.ui.slider.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:checked~.box:before,.ui.slider.checkbox input:checked~label:before{background-color:#545454!important}.ui.slider.checkbox input:checked~.box:after,.ui.slider.checkbox input:checked~label:after{left:2rem}.ui.slider.checkbox input:focus:checked~.box,.ui.slider.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.slider.checkbox input:focus:checked~.box:before,.ui.slider.checkbox input:focus:checked~label:before{background-color:#000!important}.ui.toggle.checkbox{min-height:1.5rem}.ui.toggle.checkbox input{width:3.5rem;height:1.5rem}.ui.toggle.checkbox .box,.ui.toggle.checkbox label{min-height:1.5rem;padding-left:4.5rem;color:rgba(0,0,0,.87)}.ui.toggle.checkbox label{padding-top:.15em}.ui.toggle.checkbox .box:before,.ui.toggle.checkbox label:before{display:block;position:absolute;content:'';z-index:1;-webkit-transform:none;transform:none;border:none;top:0;background:rgba(0,0,0,.05);-webkit-box-shadow:none;box-shadow:none;width:3.5rem;height:1.5rem;border-radius:500rem}.ui.toggle.checkbox .box:after,.ui.toggle.checkbox label:after{background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));position:absolute;content:''!important;opacity:1;z-index:2;border:none;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;width:1.5rem;height:1.5rem;top:0;left:0;border-radius:500rem;-webkit-transition:background .3s ease,left .3s ease;transition:background .3s ease,left .3s ease}.ui.toggle.checkbox input~.box:after,.ui.toggle.checkbox input~label:after{left:-.05rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus~.box:before,.ui.toggle.checkbox input:focus~label:before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox .box:hover::before,.ui.toggle.checkbox label:hover::before{background-color:rgba(0,0,0,.15);border:none}.ui.toggle.checkbox input:checked~.box,.ui.toggle.checkbox input:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:checked~.box:before,.ui.toggle.checkbox input:checked~label:before{background-color:#2185d0!important}.ui.toggle.checkbox input:checked~.box:after,.ui.toggle.checkbox input:checked~label:after{left:2.15rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset}.ui.toggle.checkbox input:focus:checked~.box,.ui.toggle.checkbox input:focus:checked~label{color:rgba(0,0,0,.95)!important}.ui.toggle.checkbox input:focus:checked~.box:before,.ui.toggle.checkbox input:focus:checked~label:before{background-color:#0d71bb!important}.ui.fitted.checkbox .box,.ui.fitted.checkbox label{padding-left:0!important}.ui.fitted.toggle.checkbox{width:3.5rem}.ui.fitted.slider.checkbox{width:3.5rem}@font-face{font-family:Checkbox;src:url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBD8AAAC8AAAAYGNtYXAYVtCJAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5Zn4huwUAAAF4AAABYGhlYWQGPe1ZAAAC2AAAADZoaGVhB30DyAAAAxAAAAAkaG10eBBKAEUAAAM0AAAAHGxvY2EAmgESAAADUAAAABBtYXhwAAkALwAAA2AAAAAgbmFtZSC8IugAAAOAAAABknBvc3QAAwAAAAAFFAAAACAAAwMTAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADoAgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6AL//f//AAAAAAAg6AD//f//AAH/4xgEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAEUAUQO7AvgAGgAAARQHAQYjIicBJjU0PwE2MzIfAQE2MzIfARYVA7sQ/hQQFhcQ/uMQEE4QFxcQqAF2EBcXEE4QAnMWEP4UEBABHRAXFhBOEBCoAXcQEE4QFwAAAAABAAABbgMlAkkAFAAAARUUBwYjISInJj0BNDc2MyEyFxYVAyUQEBf9SRcQEBAQFwK3FxAQAhJtFxAQEBAXbRcQEBAQFwAAAAABAAAASQMlA24ALAAAARUUBwYrARUUBwYrASInJj0BIyInJj0BNDc2OwE1NDc2OwEyFxYdATMyFxYVAyUQEBfuEBAXbhYQEO4XEBAQEBfuEBAWbhcQEO4XEBACEm0XEBDuFxAQEBAX7hAQF20XEBDuFxAQEBAX7hAQFwAAAQAAAAIAAHRSzT9fDzz1AAsEAAAAAADRsdR3AAAAANGx1HcAAAAAA7sDbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADuwABAAAAAAAAAAAAAAAAAAAABwQAAAAAAAAAAAAAAAIAAAAEAABFAyUAAAMlAAAAAAAAAAoAFAAeAE4AcgCwAAEAAAAHAC0AAQAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAIAAAAAQAAAAAAAgAHAGkAAQAAAAAAAwAIADkAAQAAAAAABAAIAH4AAQAAAAAABQALABgAAQAAAAAABgAIAFEAAQAAAAAACgAaAJYAAwABBAkAAQAQAAgAAwABBAkAAgAOAHAAAwABBAkAAwAQAEEAAwABBAkABAAQAIYAAwABBAkABQAWACMAAwABBAkABgAQAFkAAwABBAkACgA0ALBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhWZXJzaW9uIDIuMABWAGUAcgBzAGkAbwBuACAAMgAuADBDaGVja2JveABDAGgAZQBjAGsAYgBvAHhDaGVja2JveABDAGgAZQBjAGsAYgBvAHhSZWd1bGFyAFIAZQBnAHUAbABhAHJDaGVja2JveABDAGgAZQBjAGsAYgBvAHhGb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('truetype')}.ui.checkbox .box:after,.ui.checkbox label:after{font-family:Checkbox}.ui.checkbox input:checked~.box:after,.ui.checkbox input:checked~label:after{content:'\\e800'}.ui.checkbox input:indeterminate~.box:after,.ui.checkbox input:indeterminate~label:after{font-size:12px;content:'\\e801'}/*!\n * # Semantic UI 2.4.0 - Dimmer\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.dimmable:not(body){position:relative}.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;padding:1em;background-color:rgba(0,0,0,.85);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-transition:background-color .5s linear;transition:background-color .5s linear;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;color:#fff}.ui.segment>.ui.dimmer{border-radius:inherit!important}.ui.dimmer:not(.inverted)::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}.ui.dimmer:not(.inverted)::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.dimmed.dimmable>.ui.animating.legacy.dimmer,.dimmed.dimmable>.ui.visible.legacy.dimmer,.ui.active.legacy.dimmer{display:block}.ui[class*=\"top aligned\"].dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ui[class*=\"bottom aligned\"].dimmer{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ui.page.dimmer{position:fixed;-webkit-transform-style:'';transform-style:'';-webkit-perspective:2000px;perspective:2000px;-webkit-transform-origin:center center;transform-origin:center center}body.animating.in.dimmable,body.dimmed.dimmable{overflow:hidden}body.dimmable>.dimmer{position:fixed}.blurring.dimmable>:not(.dimmer){-webkit-filter:blur(0) grayscale(0);filter:blur(0) grayscale(0);-webkit-transition:.8s -webkit-filter ease;transition:.8s -webkit-filter ease;transition:.8s filter ease;transition:.8s filter ease,.8s -webkit-filter ease}.blurring.dimmed.dimmable>:not(.dimmer){-webkit-filter:blur(5px) grayscale(.7);filter:blur(5px) grayscale(.7)}.blurring.dimmable>.dimmer{background-color:rgba(0,0,0,.6)}.blurring.dimmable>.inverted.dimmer{background-color:rgba(255,255,255,.6)}.ui.dimmer>.top.aligned.content>*{vertical-align:top}.ui.dimmer>.bottom.aligned.content>*{vertical-align:bottom}.ui.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui.inverted.dimmer>.content>*{color:#fff}.ui.simple.dimmer{display:block;overflow:hidden;opacity:1;width:0%;height:0%;z-index:-100;background-color:rgba(0,0,0,0)}.dimmed.dimmable>.ui.simple.dimmer{overflow:visible;opacity:1;width:100%;height:100%;background-color:rgba(0,0,0,.85);z-index:1}.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,0)}.dimmed.dimmable>.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,.85)}/*!\n * # Semantic UI 2.4.0 - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.dropdown{cursor:pointer;position:relative;display:inline-block;outline:0;text-align:left;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease;-webkit-tap-highlight-color:transparent}.ui.dropdown .menu{cursor:auto;position:absolute;display:none;outline:0;top:100%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;margin:0;padding:0 0;background:#fff;font-size:1em;text-shadow:none;text-align:left;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:opacity .1s ease;transition:opacity .1s ease;z-index:11;will-change:transform,opacity}.ui.dropdown .menu>*{white-space:nowrap}.ui.dropdown>input:not(.search):first-child,.ui.dropdown>select{display:none!important}.ui.dropdown>.dropdown.icon{position:relative;width:auto;font-size:.85714286em;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon{width:auto;float:right;margin:0 0 0 1em}.ui.dropdown .menu>.item .dropdown.icon+.text{margin-right:1em}.ui.dropdown>.text{display:inline-block;-webkit-transition:none;transition:none}.ui.dropdown .menu>.item{position:relative;cursor:pointer;display:block;border:none;height:auto;text-align:left;border-top:none;line-height:1em;color:rgba(0,0,0,.87);padding:.78571429rem 1.14285714rem!important;font-size:1rem;text-transform:none;font-weight:400;-webkit-box-shadow:none;box-shadow:none;-webkit-touch-callout:none}.ui.dropdown .menu>.item:first-child{border-top-width:0}.ui.dropdown .menu .item>[class*=\"right floated\"],.ui.dropdown>.text>[class*=\"right floated\"]{float:right!important;margin-right:0!important;margin-left:1em!important}.ui.dropdown .menu .item>[class*=\"left floated\"],.ui.dropdown>.text>[class*=\"left floated\"]{float:left!important;margin-left:0!important;margin-right:1em!important}.ui.dropdown .menu .item>.flag.floated,.ui.dropdown .menu .item>.icon.floated,.ui.dropdown .menu .item>.image.floated,.ui.dropdown .menu .item>img.floated{margin-top:0}.ui.dropdown .menu>.header{margin:1rem 0 .75rem;padding:0 1.14285714rem;color:rgba(0,0,0,.85);font-size:.78571429em;font-weight:700;text-transform:uppercase}.ui.dropdown .menu>.divider{border-top:1px solid rgba(34,36,38,.1);height:0;margin:.5em 0}.ui.dropdown.dropdown .menu>.input{width:auto;display:-webkit-box;display:-ms-flexbox;display:flex;margin:1.14285714rem .78571429rem;min-width:10rem}.ui.dropdown .menu>.header+.input{margin-top:0}.ui.dropdown .menu>.input:not(.transparent) input{padding:.5em 1em}.ui.dropdown .menu>.input:not(.transparent) .button,.ui.dropdown .menu>.input:not(.transparent) .icon,.ui.dropdown .menu>.input:not(.transparent) .label{padding-top:.5em;padding-bottom:.5em}.ui.dropdown .menu>.item>.description,.ui.dropdown>.text>.description{float:right;margin:0 0 0 1em;color:rgba(0,0,0,.4)}.ui.dropdown .menu>.message{padding:.78571429rem 1.14285714rem;font-weight:400}.ui.dropdown .menu>.message:not(.ui){color:rgba(0,0,0,.4)}.ui.dropdown .menu .menu{top:0!important;left:100%;right:auto;margin:0 0 0 -.5em!important;border-radius:.28571429rem!important;z-index:21!important}.ui.dropdown .menu .menu:after{display:none}.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img{margin-top:0}.ui.dropdown .menu>.item>.flag,.ui.dropdown .menu>.item>.icon,.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>.label,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.flag,.ui.dropdown>.text>.icon,.ui.dropdown>.text>.image,.ui.dropdown>.text>.label,.ui.dropdown>.text>img{margin-left:0;float:none;margin-right:.78571429rem}.ui.dropdown .menu>.item>.image,.ui.dropdown .menu>.item>img,.ui.dropdown>.text>.image,.ui.dropdown>.text>img{display:inline-block;vertical-align:top;width:auto;margin-top:-.5em;margin-bottom:-.5em;max-height:2em}.ui.dropdown .ui.menu>.item:before,.ui.menu .ui.dropdown .menu>.item:before{display:none}.ui.menu .ui.dropdown .menu .active.item{border-left:none}.ui.buttons>.ui.dropdown:last-child .menu,.ui.menu .right.dropdown.item .menu,.ui.menu .right.menu .dropdown:last-child .menu{left:auto;right:0}.ui.label.dropdown .menu{min-width:100%}.ui.dropdown.icon.button>.dropdown.icon{margin:0}.ui.button.dropdown .menu{min-width:100%}.ui.selection.dropdown{cursor:pointer;word-wrap:break-word;line-height:1em;white-space:normal;outline:0;-webkit-transform:rotateZ(0);transform:rotateZ(0);min-width:14em;min-height:2.71428571em;background:#fff;display:inline-block;padding:.78571429em 2.1em .78571429em 1em;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border:1px solid rgba(34,36,38,.15);border-radius:.28571429rem;-webkit-transition:width .1s ease,-webkit-box-shadow .1s ease;transition:width .1s ease,-webkit-box-shadow .1s ease;transition:box-shadow .1s ease,width .1s ease;transition:box-shadow .1s ease,width .1s ease,-webkit-box-shadow .1s ease}.ui.selection.dropdown.active,.ui.selection.dropdown.visible{z-index:10}select.ui.dropdown{height:38px;padding:.5em;border:1px solid rgba(34,36,38,.15);visibility:visible}.ui.selection.dropdown>.delete.icon,.ui.selection.dropdown>.dropdown.icon,.ui.selection.dropdown>.search.icon{cursor:pointer;position:absolute;width:auto;height:auto;line-height:1.21428571em;top:.78571429em;right:1em;z-index:3;margin:-.78571429em;padding:.91666667em;opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.compact.selection.dropdown{min-width:0}.ui.selection.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;border-top-width:0!important;width:auto;outline:0;margin:0 -1px;min-width:calc(100% + 2px);width:calc(100% + 2px);border-radius:0 0 .28571429rem .28571429rem;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15);-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.selection.dropdown .menu:after,.ui.selection.dropdown .menu:before{display:none}.ui.selection.dropdown .menu>.message{padding:.78571429rem 1.14285714rem}@media only screen and (max-width:767px){.ui.selection.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.selection.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.selection.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.selection.dropdown .menu{max-height:21.37142857rem}}.ui.selection.dropdown .menu>.item{border-top:1px solid #fafafa;padding:.78571429rem 1.14285714rem!important;white-space:normal;word-wrap:normal}.ui.selection.dropdown .menu>.hidden.addition.item{display:none}.ui.selection.dropdown:hover{border-color:rgba(34,36,38,.35);-webkit-box-shadow:none;box-shadow:none}.ui.selection.active.dropdown{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.dropdown:focus{border-color:#96c8da;-webkit-box-shadow:none;box-shadow:none}.ui.selection.dropdown:focus .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.visible.dropdown>.text:not(.default){font-weight:400;color:rgba(0,0,0,.8)}.ui.selection.active.dropdown:hover{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.selection.active.dropdown:hover .menu{border-color:#96c8da;-webkit-box-shadow:0 2px 3px 0 rgba(34,36,38,.15);box-shadow:0 2px 3px 0 rgba(34,36,38,.15)}.ui.active.selection.dropdown>.dropdown.icon,.ui.visible.selection.dropdown>.dropdown.icon{opacity:'';z-index:3}.ui.active.selection.dropdown{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.active.empty.selection.dropdown{border-radius:.28571429rem!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.active.empty.selection.dropdown .menu{border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.search.dropdown{min-width:''}.ui.search.dropdown>input.search{background:none transparent!important;border:none!important;-webkit-box-shadow:none!important;box-shadow:none!important;cursor:text;top:0;left:1px;width:100%;outline:0;-webkit-tap-highlight-color:rgba(255,255,255,0);padding:inherit}.ui.search.dropdown>input.search{position:absolute;z-index:2}.ui.search.dropdown>.text{cursor:text;position:relative;left:1px;z-index:3}.ui.search.selection.dropdown>input.search{line-height:1.21428571em;padding:.67857143em 2.1em .67857143em 1em}.ui.search.selection.dropdown>span.sizer{line-height:1.21428571em;padding:.67857143em 2.1em .67857143em 1em;display:none;white-space:pre}.ui.search.dropdown.active>input.search,.ui.search.dropdown.visible>input.search{cursor:auto}.ui.search.dropdown.active>.text,.ui.search.dropdown.visible>.text{pointer-events:none}.ui.active.search.dropdown input.search:focus+.text .flag,.ui.active.search.dropdown input.search:focus+.text .icon{opacity:.45}.ui.active.search.dropdown input.search:focus+.text{color:rgba(115,115,115,.87)!important}.ui.search.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch}@media only screen and (max-width:767px){.ui.search.dropdown .menu{max-height:8.01428571rem}}@media only screen and (min-width:768px){.ui.search.dropdown .menu{max-height:10.68571429rem}}@media only screen and (min-width:992px){.ui.search.dropdown .menu{max-height:16.02857143rem}}@media only screen and (min-width:1920px){.ui.search.dropdown .menu{max-height:21.37142857rem}}.ui.multiple.dropdown{padding:.22619048em 2.1em .22619048em .35714286em}.ui.multiple.dropdown .menu{cursor:auto}.ui.multiple.search.dropdown,.ui.multiple.search.dropdown>input.search{cursor:text}.ui.multiple.dropdown>.label{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-block;vertical-align:top;white-space:normal;font-size:1em;padding:.35714286em .78571429em;margin:.14285714rem .28571429rem .14285714rem 0;-webkit-box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset}.ui.multiple.dropdown .dropdown.icon{margin:'';padding:''}.ui.multiple.dropdown>.text{position:static;padding:0;max-width:100%;margin:.45238095em 0 .45238095em .64285714em;line-height:1.21428571em}.ui.multiple.dropdown>.label~input.search{margin-left:.14285714em!important}.ui.multiple.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>.text{display:inline-block;position:absolute;top:0;left:0;padding:inherit;margin:.45238095em 0 .45238095em .64285714em;line-height:1.21428571em}.ui.multiple.search.dropdown>.label~.text{display:none}.ui.multiple.search.dropdown>input.search{position:static;padding:0;max-width:100%;margin:.45238095em 0 .45238095em .64285714em;width:2.2em;line-height:1.21428571em}.ui.inline.dropdown{cursor:pointer;display:inline-block;color:inherit}.ui.inline.dropdown .dropdown.icon{margin:0 .21428571em 0 .21428571em;vertical-align:baseline}.ui.inline.dropdown>.text{font-weight:700}.ui.inline.dropdown .menu{cursor:auto;margin-top:.21428571em;border-radius:.28571429rem}.ui.dropdown .menu .active.item{background:0 0;font-weight:700;color:rgba(0,0,0,.95);-webkit-box-shadow:none;box-shadow:none;z-index:12}.ui.dropdown .menu>.item:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95);z-index:13}.ui.loading.dropdown>i.icon{height:1em!important}.ui.loading.selection.dropdown>i.icon{padding:1.5em 1.28571429em!important}.ui.loading.dropdown>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.dropdown>i.icon:after{position:absolute;content:'';top:50%;left:50%;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:dropdown-spin .6s linear;animation:dropdown-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em}.ui.loading.dropdown.button>i.icon:after,.ui.loading.dropdown.button>i.icon:before{display:none}@-webkit-keyframes dropdown-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dropdown-spin{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.default.dropdown:not(.button)>.text,.ui.dropdown:not(.button)>.default.text{color:rgba(191,191,191,.87)}.ui.default.dropdown:not(.button)>input:focus~.text,.ui.dropdown:not(.button)>input:focus~.default.text{color:rgba(115,115,115,.87)}.ui.loading.dropdown>.text{-webkit-transition:none;transition:none}.ui.dropdown .loading.menu{display:block;visibility:hidden;z-index:-1}.ui.dropdown>.loading.menu{left:0!important;right:auto!important}.ui.dropdown>.menu .loading.menu{left:100%!important;right:auto!important}.ui.dropdown .menu .selected.item,.ui.dropdown.selected{background:rgba(0,0,0,.03);color:rgba(0,0,0,.95)}.ui.dropdown>.filtered.text{visibility:hidden}.ui.dropdown .filtered.item{display:none!important}.ui.dropdown.error,.ui.dropdown.error>.default.text,.ui.dropdown.error>.text{color:#9f3a38}.ui.selection.dropdown.error{background:#fff6f6;border-color:#e0b4b4}.ui.selection.dropdown.error:hover{border-color:#e0b4b4}.ui.dropdown.error>.menu,.ui.dropdown.error>.menu .menu{border-color:#e0b4b4}.ui.dropdown.error>.menu>.item{color:#9f3a38}.ui.multiple.selection.error.dropdown>.label{border-color:#e0b4b4}.ui.dropdown.error>.menu>.item:hover{background-color:#fff2f2}.ui.dropdown.error>.menu .active.item{background-color:#fdcfcf}.ui.dropdown>.clear.dropdown.icon{opacity:.8;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.dropdown>.clear.dropdown.icon:hover{opacity:1}.ui.disabled.dropdown,.ui.dropdown .menu>.disabled.item{cursor:default;pointer-events:none;opacity:.45}.ui.dropdown .menu{left:0}.ui.dropdown .menu .right.menu,.ui.dropdown .right.menu>.menu{left:100%!important;right:auto!important;border-radius:.28571429rem!important}.ui.dropdown>.left.menu{left:auto!important;right:0!important}.ui.dropdown .menu .left.menu,.ui.dropdown>.left.menu .menu{left:auto;right:100%;margin:0 -.5em 0 0!important;border-radius:.28571429rem!important}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon,.ui.dropdown .left.menu .item .dropdown.icon{width:auto;float:left;margin:0}.ui.dropdown .item .left.dropdown.icon+.text,.ui.dropdown .left.menu .item .dropdown.icon+.text{margin-left:1em;margin-right:0}.ui.upward.dropdown>.menu{top:auto;bottom:100%;-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:.28571429rem .28571429rem 0 0}.ui.dropdown .upward.menu{top:auto!important;bottom:0!important}.ui.simple.upward.active.dropdown,.ui.simple.upward.dropdown:hover{border-radius:.28571429rem .28571429rem 0 0!important}.ui.upward.dropdown.button:not(.pointing):not(.floating).active{border-radius:.28571429rem .28571429rem 0 0}.ui.upward.selection.dropdown .menu{border-top-width:1px!important;border-bottom-width:0!important;-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.upward.selection.dropdown:hover{-webkit-box-shadow:0 0 2px 0 rgba(0,0,0,.05);box-shadow:0 0 2px 0 rgba(0,0,0,.05)}.ui.active.upward.selection.dropdown{border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.selection.dropdown.visible{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.08);box-shadow:0 0 3px 0 rgba(0,0,0,.08);border-radius:0 0 .28571429rem .28571429rem!important}.ui.upward.active.selection.dropdown:hover{-webkit-box-shadow:0 0 3px 0 rgba(0,0,0,.05);box-shadow:0 0 3px 0 rgba(0,0,0,.05)}.ui.upward.active.selection.dropdown:hover .menu{-webkit-box-shadow:0 -2px 3px 0 rgba(0,0,0,.08);box-shadow:0 -2px 3px 0 rgba(0,0,0,.08)}.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto}.ui.scrolling.dropdown .menu{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch;min-width:100%!important;width:auto!important}.ui.dropdown .scrolling.menu{position:static;overflow-y:auto;border:none;-webkit-box-shadow:none!important;box-shadow:none!important;border-radius:0!important;margin:0!important;min-width:100%!important;width:auto!important;border-top:1px solid rgba(34,36,38,.15)}.ui.dropdown .scrolling.menu>.item.item.item,.ui.scrolling.dropdown .menu .item.item.item{border-top:none}.ui.dropdown .scrolling.menu .item:first-child,.ui.scrolling.dropdown .menu .item:first-child{border-top:none}.ui.dropdown>.animating.menu .scrolling.menu,.ui.dropdown>.visible.menu .scrolling.menu{display:block}@media all and (-ms-high-contrast:none){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{min-width:calc(100% - 17px)}}@media only screen and (max-width:767px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:10.28571429rem}}@media only screen and (min-width:768px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:15.42857143rem}}@media only screen and (min-width:992px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}@media only screen and (min-width:1920px){.ui.dropdown .scrolling.menu,.ui.scrolling.dropdown .menu{max-height:20.57142857rem}}.ui.simple.dropdown .menu:after,.ui.simple.dropdown .menu:before{display:none}.ui.simple.dropdown .menu{position:absolute;display:block;overflow:hidden;top:-9999px!important;opacity:0;width:0;height:0;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.simple.active.dropdown,.ui.simple.dropdown:hover{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.ui.simple.active.dropdown>.menu,.ui.simple.dropdown:hover>.menu{overflow:visible;width:auto;height:auto;top:100%!important;opacity:1}.ui.simple.dropdown:hover>.menu>.item:hover>.menu,.ui.simple.dropdown>.menu>.item:active>.menu{overflow:visible;width:auto;height:auto;top:0!important;left:100%!important;opacity:1}.ui.simple.disabled.dropdown:hover .menu{display:none;height:0;width:0;overflow:hidden}.ui.simple.visible.dropdown>.menu{display:block}.ui.fluid.dropdown{display:block;width:100%;min-width:0}.ui.fluid.dropdown>.dropdown.icon{float:right}.ui.floating.dropdown .menu{left:0;right:auto;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)!important;border-radius:.28571429rem!important}.ui.floating.dropdown>.menu{margin-top:.5em!important;border-radius:.28571429rem!important}.ui.pointing.dropdown>.menu{top:100%;margin-top:.78571429rem;border-radius:.28571429rem}.ui.pointing.dropdown>.menu:after{display:block;position:absolute;pointer-events:none;content:'';visibility:visible;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:.5em;height:.5em;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);background:#fff;z-index:2}.ui.pointing.dropdown>.menu:after{top:-.25em;left:50%;margin:0 0 0 -.25em}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu{top:100%;bottom:auto;left:0;right:auto;margin:1em 0 0}.ui.top.left.pointing.dropdown>.menu:after{top:-.25em;left:1em;right:auto;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.top.right.pointing.dropdown>.menu{top:100%;bottom:auto;right:0;left:auto;margin:1em 0 0}.ui.top.pointing.dropdown>.left.menu:after,.ui.top.right.pointing.dropdown>.menu:after{top:-.25em;left:auto!important;right:1em!important;margin:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ui.left.pointing.dropdown>.menu{top:0;left:100%;right:auto;margin:0 0 0 1em}.ui.left.pointing.dropdown>.menu:after{top:1em;left:-.25em;margin:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu{left:auto!important;right:100%!important;margin:0 1em 0 0}.ui.left:not(.top):not(.bottom).pointing.dropdown>.left.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.right.pointing.dropdown>.menu{top:0;left:auto;right:100%;margin:0 1em 0 0}.ui.right.pointing.dropdown>.menu:after{top:1em;left:auto;right:-.25em;margin:0;-webkit-transform:rotate(135deg);transform:rotate(135deg)}.ui.bottom.pointing.dropdown>.menu{top:auto;bottom:100%;left:0;right:auto;margin:0 0 1em}.ui.bottom.pointing.dropdown>.menu:after{top:auto;bottom:-.25em;right:auto;margin:0;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.ui.bottom.pointing.dropdown>.menu .menu{top:auto!important;bottom:0!important}.ui.bottom.left.pointing.dropdown>.menu{left:0;right:auto}.ui.bottom.left.pointing.dropdown>.menu:after{left:1em;right:auto}.ui.bottom.right.pointing.dropdown>.menu{right:0;left:auto}.ui.bottom.right.pointing.dropdown>.menu:after{left:auto;right:1em}.ui.pointing.upward.dropdown .menu,.ui.top.pointing.upward.dropdown .menu{top:auto!important;bottom:100%!important;margin:0 0 .78571429rem;border-radius:.28571429rem}.ui.pointing.upward.dropdown .menu:after,.ui.top.pointing.upward.dropdown .menu:after{top:100%!important;bottom:auto!important;-webkit-box-shadow:1px 1px 0 0 rgba(34,36,38,.15);box-shadow:1px 1px 0 0 rgba(34,36,38,.15);margin:-.25em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 1em 0 0}.ui.right.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu{top:auto!important;bottom:0!important;margin:0 0 0 1em}.ui.left.pointing.upward.dropdown:not(.top):not(.bottom) .menu:after{top:auto!important;bottom:0!important;margin:0 0 1em 0;-webkit-box-shadow:-1px -1px 0 0 rgba(34,36,38,.15);box-shadow:-1px -1px 0 0 rgba(34,36,38,.15)}@font-face{font-family:Dropdown;src:url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAVgAA8AAAAACFAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAABWAAAABwAAAAchGgaq0dERUYAAAF0AAAAHAAAAB4AJwAPT1MvMgAAAZAAAABDAAAAVnW4TJdjbWFwAAAB1AAAAEsAAAFS8CcaqmN2dCAAAAIgAAAABAAAAAQAEQFEZ2FzcAAAAiQAAAAIAAAACP//AANnbHlmAAACLAAAAQoAAAGkrRHP9WhlYWQAAAM4AAAAMAAAADYPK8YyaGhlYQAAA2gAAAAdAAAAJANCAb1obXR4AAADiAAAACIAAAAiCBkAOGxvY2EAAAOsAAAAFAAAABQBnAIybWF4cAAAA8AAAAAfAAAAIAEVAF5uYW1lAAAD4AAAATAAAAKMFGlj5HBvc3QAAAUQAAAARgAAAHJoedjqd2ViZgAABVgAAAAGAAAABrO7W5UAAAABAAAAANXulPUAAAAA1r4hgAAAAADXu2Q1eNpjYGRgYOABYjEgZmJgBEIOIGYB8xgAA/YAN3jaY2BktGOcwMDKwMI4jTGNgYHBHUp/ZZBkaGFgYGJgZWbACgLSXFMYHFT/fLjFeOD/AQY9xjMMbkBhRpAcAN48DQYAeNpjYGBgZoBgGQZGBhDwAfIYwXwWBgMgzQGETAwMqn8+8H649f8/lHX9//9b7Pzf+fWgusCAkY0BzmUE6gHpQwGMDMMeAACbxg7SAAARAUQAAAAB//8AAnjadZBPSsNAGMXfS+yMqYgOhpSuSlKadmUhiVEhEMQzFF22m17BbbvzCh5BXCUn6EG8gjeQ4DepwYo4i+/ffL95j4EDA+CFC7jQuKyIeVHrI3wkleq9F7XrSInKteOeHdda8bOoaeepSc00NWPz/LRec9G8GabyGtEdF7h19z033GAMTK7zbM42xNEZpzYof0RtQ5CUHAQJ73OtVyutc+3b7Ou//b8XNlsPx3jgjUifABdhEohKJJL5iM5p39uqc7X1+sRQSqmGrUVhlsJ4lpmEUVwyT8SUYtg0P9DyNzPADDs+tjrGV6KRCRfsui3eHcL4/p8ZXvfMlcnEU+CLv7hDykOP+AKTPTxbAAB42mNgZGBgAGKuf5KP4vltvjLIMzGAwLV9ig0g+vruFFMQzdjACOJzMIClARh0CTJ42mNgZGBgPPD/AJD8wgAEjA0MjAyogAMAbOQEAQAAAAC7ABEAAAAAAKoAAAH0AAABgAAAAUAACAFAAAgAwAAXAAAAAAAAACoAKgAqADIAbACGAKAAugDSeNpjYGRgYOBkUGFgYgABEMkFhAwM/xn0QAIADdUBdAB42qWQvUoDQRSFv3GjaISUQaymSmGxJoGAsRC0iPYLsU50Y6IxrvlRtPCJJKUPIBb+PIHv4EN4djKuKAqCDHfmu+feOdwZoMCUAJNbAlYUMzaUlM14jjxbngOq7HnOia89z1Pk1vMCa9x7ztPkzfMyJbPj+ZGi6Xp+omxuPD+zaD7meaFg7mb8GrBqHmhwxoAxlm0uiRkpP9X5m26pKRoMxTGR1D49Dv/Yb/91o6l8qL6eu5n2hZQzn68utR9m3FU2cB4t9cdSLG2utI+44Eh/P9bqKO+oJ/WxmXssj77YkrjasZQD6SFddythk3Wtzrf+UF2p076Udla1VNzsERP3kkjVRKel7mp1udXYcHtZSlV7RfmJe1GiFWveluaeKD5/MuJcSk8Tpm/vvwPIbmJleNpjYGKAAFYG7ICTgYGRiZGZkYWRlZGNkZ2Rg5GTLT2nsiDDEEIZsZfmZRqZujmDaDcDAxcI7WIOpS2gtCWUdgQAZkcSmQAAAAFblbO6AAA=) format('woff');font-weight:400;font-style:normal}.ui.dropdown>.dropdown.icon{font-family:Dropdown;line-height:1;height:1em;width:1.23em;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.dropdown>.dropdown.icon{width:auto}.ui.dropdown>.dropdown.icon:before{content:'\\f0d7'}.ui.dropdown .menu .item .dropdown.icon:before{content:'\\f0da'}.ui.dropdown .item .left.dropdown.icon:before,.ui.dropdown .left.menu .item .dropdown.icon:before{content:\"\\f0d9\"}.ui.vertical.menu .dropdown.item>.dropdown.icon:before{content:\"\\f0da\"}.ui.dropdown>.clear.icon:before{content:\"\\f00d\"}/*!\n * # Semantic UI 2.4.0 - Video\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.embed{position:relative;max-width:100%;height:0;overflow:hidden;background:#dcddde;padding-bottom:56.25%}.ui.embed embed,.ui.embed iframe,.ui.embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0}.ui.embed>.embed{display:none}.ui.embed>.placeholder{position:absolute;cursor:pointer;top:0;left:0;display:block;width:100%;height:100%;background-color:radial-gradient(transparent 45%,rgba(0,0,0,.3))}.ui.embed>.icon{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.ui.embed>.icon:after{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;content:'';background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:.5;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.ui.embed>.icon:before{position:absolute;top:50%;left:50%;z-index:4;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);color:#fff;font-size:6rem;text-shadow:0 2px 10px rgba(34,36,38,.2);-webkit-transition:opacity .5s ease,color .5s ease;transition:opacity .5s ease,color .5s ease;z-index:10}.ui.embed .icon:hover:after{background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:1}.ui.embed .icon:hover:before{color:#fff}.ui.active.embed>.icon,.ui.active.embed>.placeholder{display:none}.ui.active.embed>.embed{display:block}.ui.square.embed{padding-bottom:100%}.ui[class*=\"4:3\"].embed{padding-bottom:75%}.ui[class*=\"16:9\"].embed{padding-bottom:56.25%}.ui[class*=\"21:9\"].embed{padding-bottom:42.85714286%}/*!\n * # Semantic UI 2.4.0 - Modal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.modal{position:absolute;display:none;z-index:1001;text-align:left;background:#fff;border:none;-webkit-box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);-webkit-transform-origin:50% 25%;transform-origin:50% 25%;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-radius:.28571429rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;will-change:top,left,margin,transform,opacity}.ui.modal>.icon:first-child+*,.ui.modal>:first-child:not(.icon){border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.modal>:last-child{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.modal>.close{cursor:pointer;position:absolute;top:-2.5rem;right:-2.5rem;z-index:1;opacity:.8;font-size:1.25em;color:#fff;width:2.25rem;height:2.25rem;padding:.625rem 0 0 0}.ui.modal>.close:hover{opacity:1}.ui.modal>.header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;margin:0;padding:1.25rem 1.5rem;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.85);border-bottom:1px solid rgba(34,36,38,.15)}.ui.modal>.header:not(.ui){font-size:1.42857143rem;line-height:1.28571429em;font-weight:700}.ui.modal>.content{display:block;width:100%;font-size:1em;line-height:1.4;padding:1.5rem;background:#fff}.ui.modal>.image.content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ui.modal>.content>.image{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:'';-ms-flex-item-align:top;align-self:top}.ui.modal>[class*=\"top aligned\"]{-ms-flex-item-align:top;align-self:top}.ui.modal>[class*=\"middle aligned\"]{-ms-flex-item-align:middle;align-self:middle}.ui.modal>[class*=stretched]{-ms-flex-item-align:stretch;align-self:stretch}.ui.modal>.content>.description{display:block;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-width:0;-ms-flex-item-align:top;align-self:top}.ui.modal>.content>.icon+.description,.ui.modal>.content>.image+.description{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;min-width:'';width:auto;padding-left:2em}.ui.modal>.content>.image>i.icon{margin:0;opacity:1;width:auto;line-height:1;font-size:8rem}.ui.modal>.actions{background:#f9fafb;padding:1rem 1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right}.ui.modal .actions>.button{margin-left:.75em}@media only screen and (max-width:767px){.ui.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.modal{width:850px;margin:0}}@media only screen and (min-width:1200px){.ui.modal{width:900px;margin:0}}@media only screen and (min-width:1920px){.ui.modal{width:950px;margin:0}}@media only screen and (max-width:991px){.ui.modal>.header{padding-right:2.25rem}.ui.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}}@media only screen and (max-width:767px){.ui.modal>.header{padding:.75rem 1rem!important;padding-right:2.25rem!important}.ui.modal>.content{display:block;padding:1rem!important}.ui.modal>.close{top:.5rem!important;right:.5rem!important}.ui.modal .image.content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.modal .content>.image{display:block;max-width:100%;margin:0 auto!important;text-align:center;padding:0 0 1rem!important}.ui.modal>.content>.image>i.icon{font-size:5rem;text-align:center}.ui.modal .content>.description{display:block;width:100%!important;margin:0!important;padding:1rem 0!important;-webkit-box-shadow:none;box-shadow:none}.ui.modal>.actions{padding:1rem 1rem 0!important}.ui.modal .actions>.button,.ui.modal .actions>.buttons{margin-bottom:1rem}}.ui.inverted.dimmer>.ui.modal{-webkit-box-shadow:1px 3px 10px 2px rgba(0,0,0,.2);box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{background-color:transparent;border:none;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.basic.modal>.actions,.ui.basic.modal>.content,.ui.basic.modal>.header{background-color:transparent}.ui.basic.modal>.header{color:#fff}.ui.basic.modal>.close{top:1rem;right:1.5rem}.ui.inverted.dimmer>.basic.modal{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.basic.modal>.header{color:rgba(0,0,0,.85)}.ui.legacy.modal,.ui.legacy.page.dimmer>.ui.modal{top:50%;left:50%}.ui.legacy.page.dimmer>.ui.scrolling.modal,.ui.page.dimmer>.ui.scrolling.legacy.modal,.ui.top.aligned.dimmer>.ui.legacy.modal,.ui.top.aligned.legacy.page.dimmer>.ui.modal{top:auto}@media only screen and (max-width:991px){.ui.basic.modal>.close{color:#fff}}.ui.loading.modal{display:block;visibility:hidden;z-index:-1}.ui.active.modal{display:block}.modals.dimmer[class*=\"top aligned\"] .modal{margin:5vh auto}@media only screen and (max-width:767px){.modals.dimmer[class*=\"top aligned\"] .modal{margin:1rem auto}}.legacy.modals.dimmer[class*=\"top aligned\"]{padding-top:5vh}@media only screen and (max-width:767px){.legacy.modals.dimmer[class*=\"top aligned\"]{padding-top:1rem}}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable>.dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.dimmable>.dimmer{position:fixed}.modals.dimmer .ui.scrolling.modal{margin:1rem auto}.scrolling.undetached.dimmable.dimmed{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.undetached.dimmable.dimmed>.dimmer{overflow:hidden}.scrolling.undetached.dimmable .ui.scrolling.modal{position:absolute;left:50%;margin-top:1rem!important}.ui.modal .scrolling.content{max-height:calc(70vh);overflow:auto}.ui.fullscreen.modal{width:95%!important;left:0!important;margin:1em auto}.ui.fullscreen.scrolling.modal{left:0!important}.ui.fullscreen.modal>.header{padding-right:2.25rem}.ui.fullscreen.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}.ui.modal{font-size:1rem}.ui.mini.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.mini.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.mini.modal{width:35.2%;margin:0}}@media only screen and (min-width:992px){.ui.mini.modal{width:340px;margin:0}}@media only screen and (min-width:1200px){.ui.mini.modal{width:360px;margin:0}}@media only screen and (min-width:1920px){.ui.mini.modal{width:380px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.tiny.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.tiny.modal{width:52.8%;margin:0}}@media only screen and (min-width:992px){.ui.tiny.modal{width:510px;margin:0}}@media only screen and (min-width:1200px){.ui.tiny.modal{width:540px;margin:0}}@media only screen and (min-width:1920px){.ui.tiny.modal{width:570px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767px){.ui.small.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0}}.ui.large.modal>.header{font-size:1.6em}@media only screen and (max-width:767px){.ui.large.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0}}/*!\n * # Semantic UI 2.4.0 - Nag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#555;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2);box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:.2s background ease;transition:.2s background ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#fff}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#fff;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:hover{background:#555;opacity:1}.ui.nag .close:hover{opacity:1}.ui.overlay.nag{position:absolute;display:block}.ui.fixed.nag{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#f3f4f5;color:rgba(0,0,0,.85)}.ui.inverted.nag .close,.ui.inverted.nag .title,.ui.inverted.nags .nag .close,.ui.inverted.nags .nag .title{color:rgba(0,0,0,.4)}.ui.nags .nag{border-radius:0!important}.ui.nags .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:last-child{border-radius:.28571429rem .28571429rem 0 0}/*!\n * # Semantic UI 2.4.0 - Popup\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;z-index:1900;border:1px solid #d4d4d5;line-height:1.4285em;max-width:250px;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.popup>.header{padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:'';width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:before{pointer-events:none;position:absolute;content:'';font-size:1rem;width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:2;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]:after{pointer-events:none;content:attr(data-tooltip);position:absolute;text-transform:none;text-align:left;white-space:nowrap;font-size:1rem;border:1px solid #d4d4d5;line-height:1.4285em;max-width:none;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1}[data-tooltip]:not([data-position]):before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-tooltip]:not([data-position]):after{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);bottom:100%;margin-bottom:.5em}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;visibility:hidden}[data-tooltip]:before{opacity:0;-webkit-transform:rotate(45deg) scale(0)!important;transform:rotate(45deg) scale(0)!important;-webkit-transform-origin:center top;transform-origin:center top;-webkit-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:after{opacity:1;-webkit-transform-origin:center bottom;transform-origin:center bottom;-webkit-transition:all .1s ease;transition:all .1s ease}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;pointer-events:auto}[data-tooltip]:hover:before{-webkit-transform:rotate(45deg) scale(1)!important;transform:rotate(45deg) scale(1)!important;opacity:1}[data-tooltip]:after,[data-tooltip][data-position=\"bottom center\"]:after,[data-tooltip][data-position=\"top center\"]:after{-webkit-transform:translateX(-50%) scale(0)!important;transform:translateX(-50%) scale(0)!important}[data-tooltip]:hover:after,[data-tooltip][data-position=\"bottom center\"]:hover:after{-webkit-transform:translateX(-50%) scale(1)!important;transform:translateX(-50%) scale(1)!important}[data-tooltip][data-position=\"left center\"]:after,[data-tooltip][data-position=\"right center\"]:after{-webkit-transform:translateY(-50%) scale(0)!important;transform:translateY(-50%) scale(0)!important}[data-tooltip][data-position=\"left center\"]:hover:after,[data-tooltip][data-position=\"right center\"]:hover:after{-webkit-transform:translateY(-50%) scale(1)!important;transform:translateY(-50%) scale(1)!important}[data-tooltip][data-position=\"bottom left\"]:after,[data-tooltip][data-position=\"bottom right\"]:after,[data-tooltip][data-position=\"top left\"]:after,[data-tooltip][data-position=\"top right\"]:after{-webkit-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position=\"bottom left\"]:hover:after,[data-tooltip][data-position=\"bottom right\"]:hover:after,[data-tooltip][data-position=\"top left\"]:hover:after,[data-tooltip][data-position=\"top right\"]:hover:after{-webkit-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-inverted]:before{-webkit-box-shadow:none!important;box-shadow:none!important}[data-tooltip][data-inverted]:before{background:#1b1c1d}[data-tooltip][data-inverted]:after{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}[data-tooltip][data-inverted]:after .header{background-color:none;color:#fff}[data-position=\"top center\"][data-tooltip]:after{top:auto;right:auto;left:50%;bottom:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-bottom:.5em}[data-position=\"top center\"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position=\"top left\"][data-tooltip]:after{top:auto;right:auto;left:0;bottom:100%;margin-bottom:.5em}[data-position=\"top left\"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position=\"top right\"][data-tooltip]:after{top:auto;left:auto;right:0;bottom:100%;margin-bottom:.5em}[data-position=\"top right\"][data-tooltip]:before{top:auto;left:auto;bottom:100%;right:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position=\"bottom center\"][data-tooltip]:after{bottom:auto;right:auto;left:50%;top:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-top:.5em}[data-position=\"bottom center\"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:50%;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position=\"bottom left\"][data-tooltip]:after{left:0;top:100%;margin-top:.5em}[data-position=\"bottom left\"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:1em;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position=\"bottom right\"][data-tooltip]:after{right:0;top:100%;margin-top:.5em}[data-position=\"bottom right\"][data-tooltip]:before{bottom:auto;left:auto;top:100%;right:1em;margin-left:-.14285714rem;margin-top:.07142857rem}[data-position=\"left center\"][data-tooltip]:after{right:100%;top:50%;margin-right:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position=\"left center\"][data-tooltip]:before{right:100%;top:50%;margin-top:-.14285714rem;margin-right:-.07142857rem}[data-position=\"right center\"][data-tooltip]:after{left:100%;top:50%;margin-left:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position=\"right center\"][data-tooltip]:before{left:100%;top:50%;margin-top:-.07142857rem;margin-left:.14285714rem}[data-position~=bottom][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-position=\"left center\"][data-tooltip]:before{background:#fff;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-position=\"right center\"][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-position~=top][data-tooltip]:before{background:#fff}[data-inverted][data-position~=bottom][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-inverted][data-position=\"left center\"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-inverted][data-position=\"right center\"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=top][data-tooltip]:before{background:#1b1c1d}[data-position~=bottom][data-tooltip]:before{-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-position~=bottom][data-tooltip]:after{-webkit-transform-origin:center top;transform-origin:center top}[data-position=\"left center\"][data-tooltip]:before{-webkit-transform-origin:top center;transform-origin:top center}[data-position=\"left center\"][data-tooltip]:after{-webkit-transform-origin:right center;transform-origin:right center}[data-position=\"right center\"][data-tooltip]:before{-webkit-transform-origin:right center;transform-origin:right center}[data-position=\"right center\"][data-tooltip]:after{-webkit-transform-origin:left center;transform-origin:left center}.ui.popup{margin:0}.ui.top.popup{margin:0 0 .71428571em}.ui.top.left.popup{-webkit-transform-origin:left bottom;transform-origin:left bottom}.ui.top.center.popup{-webkit-transform-origin:center bottom;transform-origin:center bottom}.ui.top.right.popup{-webkit-transform-origin:right bottom;transform-origin:right bottom}.ui.left.center.popup{margin:0 .71428571em 0 0;-webkit-transform-origin:right 50%;transform-origin:right 50%}.ui.right.center.popup{margin:0 0 0 .71428571em;-webkit-transform-origin:left 50%;transform-origin:left 50%}.ui.bottom.popup{margin:.71428571em 0 0}.ui.bottom.left.popup{-webkit-transform-origin:left top;transform-origin:left top}.ui.bottom.center.popup{-webkit-transform-origin:center top;transform-origin:center top}.ui.bottom.right.popup{-webkit-transform-origin:right top;transform-origin:right top}.ui.bottom.center.popup:before{margin-left:-.30714286em;top:-.30714286em;left:50%;right:auto;bottom:auto;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.left.popup{margin-left:0}.ui.bottom.left.popup:before{top:-.30714286em;left:1em;right:auto;bottom:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup{margin-right:0}.ui.bottom.right.popup:before{top:-.30714286em;right:1em;bottom:auto;left:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.top.center.popup:before{top:auto;right:auto;bottom:-.30714286em;left:50%;margin-left:-.30714286em}.ui.top.left.popup{margin-left:0}.ui.top.left.popup:before{bottom:-.30714286em;left:1em;top:auto;right:auto;margin-left:0}.ui.top.right.popup{margin-right:0}.ui.top.right.popup:before{bottom:-.30714286em;right:1em;top:auto;left:auto;margin-left:0}.ui.left.center.popup:before{top:50%;right:-.30714286em;bottom:auto;left:auto;margin-top:-.30714286em;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.30714286em;bottom:auto;right:auto;margin-top:-.30714286em;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}.ui.bottom.popup:before{background:#fff}.ui.left.center.popup:before,.ui.right.center.popup:before{background:#fff}.ui.top.popup:before{background:#fff}.ui.inverted.bottom.popup:before{background:#1b1c1d}.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before{background:#1b1c1d}.ui.inverted.top.popup:before{background:#1b1c1d}.ui.popup>.ui.grid:not(.padded){width:calc(100% + 1.75rem);margin:-.7rem -.875rem}.ui.loading.popup{display:block;visibility:hidden;z-index:-1}.ui.animating.popup,.ui.visible.popup{display:block}.ui.visible.popup{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.basic.popup:before{display:none}.ui.wide.popup{max-width:350px}.ui[class*=\"very wide\"].popup{max-width:550px}@media only screen and (max-width:767px){.ui.wide.popup,.ui[class*=\"very wide\"].popup{max-width:250px}}.ui.fluid.popup{width:100%;max-width:none}.ui.inverted.popup{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#fff}.ui.inverted.popup:before{background-color:#1b1c1d;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.flowing.popup{max-width:none}.ui.mini.popup{font-size:.78571429rem}.ui.tiny.popup{font-size:.85714286rem}.ui.small.popup{font-size:.92857143rem}.ui.popup{font-size:1rem}.ui.large.popup{font-size:1.14285714rem}.ui.huge.popup{font-size:1.42857143rem}/*!\n * # Semantic UI 2.4.0 - Progress Bar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.progress{position:relative;display:block;max-width:100%;border:none;margin:1em 0 2.5em;-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.1);padding:0;border-radius:.28571429rem}.ui.progress:first-child{margin:0 0 2.5em}.ui.progress:last-child{margin:0 0 1.5em}.ui.progress .bar{display:block;line-height:1;position:relative;width:0%;min-width:2em;background:#888;border-radius:.28571429rem;-webkit-transition:width .1s ease,background-color .1s ease;transition:width .1s ease,background-color .1s ease}.ui.progress .bar>.progress{white-space:nowrap;position:absolute;width:auto;font-size:.92857143em;top:50%;right:.5em;left:auto;bottom:auto;color:rgba(255,255,255,.7);text-shadow:none;margin-top:-.5em;font-weight:700;text-align:left}.ui.progress>.label{position:absolute;width:100%;font-size:1em;top:100%;right:auto;left:0;bottom:auto;color:rgba(0,0,0,.87);font-weight:700;text-shadow:none;margin-top:.2em;text-align:center;-webkit-transition:color .4s ease;transition:color .4s ease}.ui.indicating.progress[data-percent^=\"1\"] .bar,.ui.indicating.progress[data-percent^=\"2\"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent^=\"3\"] .bar{background-color:#efbc72}.ui.indicating.progress[data-percent^=\"4\"] .bar,.ui.indicating.progress[data-percent^=\"5\"] .bar{background-color:#e6bb48}.ui.indicating.progress[data-percent^=\"6\"] .bar{background-color:#ddc928}.ui.indicating.progress[data-percent^=\"7\"] .bar,.ui.indicating.progress[data-percent^=\"8\"] .bar{background-color:#b4d95c}.ui.indicating.progress[data-percent^=\"100\"] .bar,.ui.indicating.progress[data-percent^=\"9\"] .bar{background-color:#66da81}.ui.indicating.progress[data-percent^=\"1\"] .label,.ui.indicating.progress[data-percent^=\"2\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"3\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"4\"] .label,.ui.indicating.progress[data-percent^=\"5\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"6\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"7\"] .label,.ui.indicating.progress[data-percent^=\"8\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^=\"100\"] .label,.ui.indicating.progress[data-percent^=\"9\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent=\"1\"] .bar,.ui.indicating.progress[data-percent=\"2\"] .bar,.ui.indicating.progress[data-percent=\"3\"] .bar,.ui.indicating.progress[data-percent=\"4\"] .bar,.ui.indicating.progress[data-percent=\"5\"] .bar,.ui.indicating.progress[data-percent=\"6\"] .bar,.ui.indicating.progress[data-percent=\"7\"] .bar,.ui.indicating.progress[data-percent=\"8\"] .bar,.ui.indicating.progress[data-percent=\"9\"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent=\"1\"] .label,.ui.indicating.progress[data-percent=\"2\"] .label,.ui.indicating.progress[data-percent=\"3\"] .label,.ui.indicating.progress[data-percent=\"4\"] .label,.ui.indicating.progress[data-percent=\"5\"] .label,.ui.indicating.progress[data-percent=\"6\"] .label,.ui.indicating.progress[data-percent=\"7\"] .label,.ui.indicating.progress[data-percent=\"8\"] .label,.ui.indicating.progress[data-percent=\"9\"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress.success .label{color:#1a531b}.ui.progress.success .bar{background-color:#21ba45!important}.ui.progress.success .bar,.ui.progress.success .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.success>.label{color:#1a531b}.ui.progress.warning .bar{background-color:#f2c037!important}.ui.progress.warning .bar,.ui.progress.warning .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.warning>.label{color:#794b02}.ui.progress.error .bar{background-color:#db2828!important}.ui.progress.error .bar,.ui.progress.error .bar::after{-webkit-animation:none!important;animation:none!important}.ui.progress.error>.label{color:#912d2b}.ui.active.progress .bar{position:relative;min-width:2em}.ui.active.progress .bar::after{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:.28571429rem;-webkit-animation:progress-active 2s ease infinite;animation:progress-active 2s ease infinite}@-webkit-keyframes progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}@keyframes progress-active{0%{opacity:.3;width:0}100%{opacity:0;width:100%}}.ui.disabled.progress{opacity:.35}.ui.disabled.progress .bar,.ui.disabled.progress .bar::after{-webkit-animation:none!important;animation:none!important}.ui.inverted.progress{background:rgba(255,255,255,.08);border:none}.ui.inverted.progress .bar{background:#888}.ui.inverted.progress .bar>.progress{color:#f9fafb}.ui.inverted.progress>.label{color:#fff}.ui.inverted.progress.success>.label{color:#21ba45}.ui.inverted.progress.warning>.label{color:#f2c037}.ui.inverted.progress.error>.label{color:#db2828}.ui.progress.attached{background:0 0;position:relative;border:none;margin:0}.ui.progress.attached,.ui.progress.attached .bar{display:block;height:.2rem;padding:0;overflow:hidden;border-radius:0 0 .28571429rem .28571429rem}.ui.progress.attached .bar{border-radius:0}.ui.progress.top.attached,.ui.progress.top.attached .bar{top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.progress.top.attached .bar{border-radius:0}.ui.card>.ui.attached.progress,.ui.segment>.ui.attached.progress{position:absolute;top:auto;left:0;bottom:100%;width:100%}.ui.card>.ui.bottom.attached.progress,.ui.segment>.ui.bottom.attached.progress{top:100%;bottom:auto}.ui.red.progress .bar{background-color:#db2828}.ui.red.inverted.progress .bar{background-color:#ff695e}.ui.orange.progress .bar{background-color:#f2711c}.ui.orange.inverted.progress .bar{background-color:#ff851b}.ui.yellow.progress .bar{background-color:#fbbd08}.ui.yellow.inverted.progress .bar{background-color:#ffe21f}.ui.olive.progress .bar{background-color:#b5cc18}.ui.olive.inverted.progress .bar{background-color:#d9e778}.ui.green.progress .bar{background-color:#21ba45}.ui.green.inverted.progress .bar{background-color:#2ecc40}.ui.teal.progress .bar{background-color:#00b5ad}.ui.teal.inverted.progress .bar{background-color:#6dffff}.ui.blue.progress .bar{background-color:#2185d0}.ui.blue.inverted.progress .bar{background-color:#54c8ff}.ui.violet.progress .bar{background-color:#6435c9}.ui.violet.inverted.progress .bar{background-color:#a291fb}.ui.purple.progress .bar{background-color:#a333c8}.ui.purple.inverted.progress .bar{background-color:#dc73ff}.ui.pink.progress .bar{background-color:#e03997}.ui.pink.inverted.progress .bar{background-color:#ff8edf}.ui.brown.progress .bar{background-color:#a5673f}.ui.brown.inverted.progress .bar{background-color:#d67c1c}.ui.grey.progress .bar{background-color:#767676}.ui.grey.inverted.progress .bar{background-color:#dcddde}.ui.black.progress .bar{background-color:#1b1c1d}.ui.black.inverted.progress .bar{background-color:#545454}.ui.tiny.progress{font-size:.85714286rem}.ui.tiny.progress .bar{height:.5em}.ui.small.progress{font-size:.92857143rem}.ui.small.progress .bar{height:1em}.ui.progress{font-size:1rem}.ui.progress .bar{height:1.75em}.ui.large.progress{font-size:1.14285714rem}.ui.large.progress .bar{height:2.5em}.ui.big.progress{font-size:1.28571429rem}.ui.big.progress .bar{height:3.5em}/*!\n * # Semantic UI 2.4.0 - Rating\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.rating{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;white-space:nowrap;vertical-align:baseline}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;text-align:center;font-weight:400;font-style:normal;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;cursor:pointer;width:1.25em;height:auto;-webkit-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease}.ui.rating .icon{background:0 0;color:rgba(0,0,0,.15)}.ui.rating .active.icon{background:0 0;color:rgba(0,0,0,.85)}.ui.rating .icon.selected,.ui.rating .icon.selected.active{background:0 0;color:rgba(0,0,0,.87)}.ui.star.rating .icon{width:1.25em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none}.ui.star.rating .active.icon{background:0 0!important;color:#ffe623!important;text-shadow:0 -1px 0 #ddc507,-1px 0 0 #ddc507,0 1px 0 #ddc507,1px 0 0 #ddc507!important}.ui.star.rating .icon.selected,.ui.star.rating .icon.selected.active{background:0 0!important;color:#fc0!important;text-shadow:0 -1px 0 #e6a200,-1px 0 0 #e6a200,0 1px 0 #e6a200,1px 0 0 #e6a200!important}.ui.heart.rating .icon{width:1.4em;height:auto;background:0 0;color:rgba(0,0,0,.15);text-shadow:none!important}.ui.heart.rating .active.icon{background:0 0!important;color:#ff6d75!important;text-shadow:0 -1px 0 #cd0707,-1px 0 0 #cd0707,0 1px 0 #cd0707,1px 0 0 #cd0707!important}.ui.heart.rating .icon.selected,.ui.heart.rating .icon.selected.active{background:0 0!important;color:#ff3000!important;text-shadow:0 -1px 0 #aa0101,-1px 0 0 #aa0101,0 1px 0 #aa0101,1px 0 0 #aa0101!important}.ui.disabled.rating .icon{cursor:default}.ui.rating.selected .active.icon{opacity:1}.ui.rating .icon.selected,.ui.rating.selected .icon.selected{opacity:1}.ui.mini.rating{font-size:.78571429rem}.ui.tiny.rating{font-size:.85714286rem}.ui.small.rating{font-size:.92857143rem}.ui.rating{font-size:1rem}.ui.large.rating{font-size:1.14285714rem}.ui.huge.rating{font-size:1.42857143rem}.ui.massive.rating{font-size:2rem}@font-face{font-family:Rating;src:url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,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kIiRi5MI5vdUFfcni4vCBYufhJx8mn2ZepJ3i3aLeoR9fX18g3qLdwiLVAUO+yaLshWL+AQFi5GNkY+RjpCQj5KNj42PjI+LCPfAiwWPi4+Kj4mRiZCHj4aPhY2Fi4UIi/wEBYuEiYWHhoeGhoeFiIiKhoqHi4GLhI6EkQj7EvcN+xL7DQWEhYOIgouHi4eLh42EjoaPiJCHkImRi5IIDov3XRWLko2Rj5Kltq+vuKW4pbuZvYu9i7t9uHG4ca9npWCPhI2Fi4SLhYmEh4RxYGdoXnAIXnFbflmLWYtbmF6lXqZnrnG2h5KJkouRCLCLFaRkq2yxdLF0tH+4i7iLtJexorGiq6qksm64Z61goZZ3kXaLdItnfm1ycnJybX9oiwhoi22XcqRypH6pi6+LopGglp9gdWdpbl4I9xiwFYuHjIiOiI6IjoqPi4+LjoyOjo2OjY6Lj4ubkJmXl5eWmZGbi4+LjoyOjo2OjY6LjwiLj4mOiY6IjYiNh4tzi3eCenp6eoJ3i3MIDov3XRWLko2Sj5GouK+utqW3pbqYvouci5yJnIgIm6cFjY6NjI+LjIuNi42JjYqOio+JjomOiY6KjomOiY6JjoqNioyKjomMiYuHi4qLiouLCHdnbVVjQ2NDbVV3Zwh9cgWJiIiJiIuJi36SdJiIjYmOi46LjY+UlJlvl3KcdJ90oHeie6WHkYmSi5IIsIsVqlq0Z711CKGzBXqXfpqCnoKdhp6LoIuikaCWn2B1Z2luXgj3GLAVi4eMiI6IjoiOio+Lj4uOjI6OjY6NjouPi5uQmZeXl5aZkZuLj4uOjI6OjY6NjouPCIuPiY6JjoiNiI2Hi3OLd4J6enp6gneLcwji+10VoLAFtI+wmK2hrqKnqKKvdq1wp2uhCJ2rBZ1/nHycepx6mHqWeY+EjYWLhIuEiYWHhIR/gH1+fG9qaXJmeWV5Y4Jhiwi53BXb9yQFjIKMg4uEi3CDc3x1fHV3fHOBCA6L1BWL90sFi5WPlJKSkpKTj5aLCNmLBZKPmJqepJaZlZeVlY+Qj5ONl42WjpeOmI+YkZWTk5OSk46Vi5uLmYiYhZiFlIGSfgiSfo55i3WLeYd5gXgIvosFn4uchJl8mn2Seot3i3qGfIJ9jYSLhYuEi3yIfoR+i4eLh4uHi3eGen99i3CDdnt8CHt8dYNwiwhmiwV5i3mNeY95kHeRc5N1k36Ph4sIOYsFgIuDjoSShJKHlIuVCLCdFYuGjIePiI+Hj4mQi5CLj42Pj46OjY+LkIuQiZCIjoePh42Gi4aLh4mHh4eIioaLhgjUeRWUiwWNi46Lj4qOi4+KjYqOi4+Kj4mQio6KjYqNio+Kj4mQio6KjIqzfquEpIsIrosFr4uemouri5CKkYqQkY6QkI6SjpKNkouSi5KJkoiRlZWQlouYi5CKkImRiZGJj4iOCJGMkI+PlI+UjZKLkouViJODk4SSgo+CiwgmiwWLlpCalJ6UnpCbi5aLnoiYhJSFlH+QeYuGhoeDiYCJf4h/h3+IfoWBg4KHh4SCgH4Ii4qIiYiGh4aIh4mIiIiIh4eGh4aHh4eHiIiHiIeHiIiHiIeKh4mIioiLCIKLi/tLBQ6L90sVi/dLBYuVj5OSk5KSk46WiwjdiwWPi5iPoZOkk6CRnZCdj56Nn4sIq4sFpougg5x8m3yTd4txCIuJBZd8kHuLd4uHi4eLh5J+jn6LfIuEi4SJhZR9kHyLeot3hHp8fH19eoR3iwhYiwWVeI95i3mLdIh6hH6EfoKBfoV+hX2He4uBi4OPg5KFkYaTh5SHlYiTipOKk4qTiJMIiZSIkYiPgZSBl4CaeKR+moSPCD2LBYCLg4+EkoSSh5SLlQiw9zgVi4aMh4+Ij4ePiZCLkIuPjY+Pjo6Nj4uQi5CJkIiOh4+HjYaLhouHiYeHh4iKhouGCNT7OBWUiwWOi46Kj4mPio+IjoiPh4+IjoePiI+Hj4aPho6HjoiNiI6Hj4aOho6Ii4qWfpKDj4YIk4ORgY5+j36OgI1/jYCPg5CGnYuXj5GUkpSOmYuei5aGmoKfgp6GmouWCPCLBZSLlI+SkpOTjpOLlYuSiZKHlIeUho+Fi46PjY+NkY2RjJCLkIuYhpaBlY6RjZKLkgiLkomSiJKIkoaQhY6MkIyRi5CLm4aXgpOBkn6Pe4sIZosFcotrhGN9iouIioaJh4qHiomKiYqIioaKh4mHioiKiYuHioiLh4qIi4mLCIKLi/tLBQ77lIv3txWLkpCPlo0I9yOgzPcWBY6SkI+RiwiL/BL7FUcFh4mHioiLh4uIjImOiY6KjouPi4yLjYyOCKP3IyPwBYaQiZCLjwgOi/fFFYu1l6yjoqOjrZe2i5aLl4mYh5eHloWWhJaElIWShZOE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) format('woff');font-weight:400;font-style:normal}.ui.rating .icon{font-family:Rating;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-weight:400;font-style:normal;text-align:center}.ui.rating .icon:before{content:'\\f005'}.ui.rating .active.icon:before{content:'\\f005'}.ui.star.rating .icon:before{content:'\\f005'}.ui.star.rating .active.icon:before{content:'\\f005'}.ui.star.rating .partial.icon:before{content:'\\f006'}.ui.star.rating .partial.icon{content:'\\f005'}.ui.heart.rating .icon:before{content:'\\f004'}.ui.heart.rating .active.icon:before{content:'\\f004'}/*!\n * # Semantic UI 2.4.0 - Search\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;transform-origin:center top;white-space:normal;text-align:left;text-transform:none;background:#fff;margin-top:.5em;width:18em;border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid #d4d4d5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285714em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21ba45}.ui.search>.results>.message{padding:1em 1em}.ui.search>.results>.message .header{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#f3f4f5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#fff;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#f9fafb}.ui.search .action:hover{background:#e0e0e0}.ui.category.search>.results .category.active{background:#f3f4f5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none}.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search>.results .result.active .description{color:rgba(0,0,0,.85)}.ui.disabled.search{cursor:default;pointer-events:none;opacity:.45}.ui.search.selection .prompt{border-radius:.28571429rem}.ui.search.selection>.icon.input>.remove.icon{pointer-events:none;position:absolute;left:auto;opacity:0;color:'';top:0;right:0;-webkit-transition:color .1s ease,opacity .1s ease;transition:color .1s ease,opacity .1s ease}.ui.search.selection>.icon.input>.active.remove.icon{cursor:pointer;opacity:.8;pointer-events:auto}.ui.search.selection>.icon.input:not([class*=\"left icon\"])>.icon~.remove.icon{right:1.85714em}.ui.search.selection>.icon.input>.remove.icon:hover{opacity:1;color:#db2828}.ui.category.search .results{width:28em}.ui.category.search .results.animating,.ui.category.search .results.visible{display:table}.ui.category.search>.results .category{display:table-row;background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease}.ui.category.search>.results .category:last-child{border-bottom:none}.ui.category.search>.results .category:first-child .name+.result{border-radius:0 .28571429rem 0 0}.ui.category.search>.results .category:last-child .result:last-child{border-radius:0 0 .28571429rem 0}.ui.category.search>.results .category>.name{display:table-cell;text-overflow:ellipsis;width:100px;white-space:nowrap;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .results{display:table-cell;background:#fff;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .result{border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease;padding:.85714286em 1.14285714em}.ui[class*=\"left aligned\"].search>.results{right:auto;left:0}.ui[class*=\"right aligned\"].search>.results{right:0;left:auto}.ui.fluid.search .results{width:100%}.ui.mini.search{font-size:.78571429em}.ui.small.search{font-size:.92857143em}.ui.search{font-size:1em}.ui.large.search{font-size:1.14285714em}.ui.big.search{font-size:1.28571429em}.ui.huge.search{font-size:1.42857143em}.ui.massive.search{font-size:1.71428571em}@media only screen and (max-width:767px){.ui.search .results{max-width:calc(100vw - 2rem)}}/*!\n * # Semantic UI 2.4.0 - Shape\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.shape .side{display:none}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#e6e6e6;color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 2px rgba(0,0,0,.3);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute}.ui.shape.animating .sides{-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .active.side{display:block}/*!\n * # Semantic UI 2.4.0 - Sidebar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.sidebar{position:fixed;top:0;left:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:none;transition:none;will-change:transform;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;-webkit-overflow-scrolling:touch;height:100%!important;max-height:100%;border-radius:0!important;margin:0!important;overflow-y:auto!important;z-index:102}.ui.sidebar>*{-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.left.sidebar{right:auto;left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.sidebar{right:0!important;left:auto!important;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.bottom.sidebar,.ui.top.sidebar{width:100%!important;height:auto!important}.ui.top.sidebar{top:0!important;bottom:auto!important;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.sidebar{top:auto!important;bottom:0!important;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.pushable{height:100%;overflow-x:hidden;padding:0!important}body.pushable{background:#545454!important}.pushable:not(body){-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.pushable:not(body)>.fixed,.pushable:not(body)>.pusher:after,.pushable:not(body)>.ui.sidebar{position:absolute}.pushable>.fixed{position:fixed;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;will-change:transform;z-index:101}.pushable>.pusher{position:relative;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;min-height:100%;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:2}body.pushable>.pusher{background:#fff}.pushable>.pusher{background:inherit}.pushable>.pusher:after{position:fixed;top:0;right:0;content:'';background-color:rgba(0,0,0,.4);overflow:hidden;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;will-change:opacity;z-index:1000}.ui.sidebar.menu .item{border-radius:0!important}.pushable>.pusher.dimmed:after{width:100%!important;height:100%!important;opacity:1!important}.ui.animating.sidebar{visibility:visible}.ui.visible.sidebar{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.left.visible.sidebar,.ui.right.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.bottom.visible.sidebar,.ui.top.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.visible.left.sidebar~.fixed,.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0)}.ui.visible.right.sidebar~.fixed,.ui.visible.right.sidebar~.pusher{-webkit-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}.ui.visible.top.sidebar~.fixed,.ui.visible.top.sidebar~.pusher{-webkit-transform:translate3d(0,36px,0);transform:translate3d(0,36px,0)}.ui.visible.bottom.sidebar~.fixed,.ui.visible.bottom.sidebar~.pusher{-webkit-transform:translate3d(0,-36px,0);transform:translate3d(0,-36px,0)}.ui.visible.left.sidebar~.ui.visible.right.sidebar~.fixed,.ui.visible.left.sidebar~.ui.visible.right.sidebar~.pusher,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.fixed,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.thin.left.sidebar,.ui.thin.right.sidebar{width:150px}.ui[class*=\"very thin\"].left.sidebar,.ui[class*=\"very thin\"].right.sidebar{width:60px}.ui.left.sidebar,.ui.right.sidebar{width:260px}.ui.wide.left.sidebar,.ui.wide.right.sidebar{width:350px}.ui[class*=\"very wide\"].left.sidebar,.ui[class*=\"very wide\"].right.sidebar{width:475px}.ui.visible.thin.left.sidebar~.fixed,.ui.visible.thin.left.sidebar~.pusher{-webkit-transform:translate3d(150px,0,0);transform:translate3d(150px,0,0)}.ui.visible[class*=\"very thin\"].left.sidebar~.fixed,.ui.visible[class*=\"very thin\"].left.sidebar~.pusher{-webkit-transform:translate3d(60px,0,0);transform:translate3d(60px,0,0)}.ui.visible.wide.left.sidebar~.fixed,.ui.visible.wide.left.sidebar~.pusher{-webkit-transform:translate3d(350px,0,0);transform:translate3d(350px,0,0)}.ui.visible[class*=\"very wide\"].left.sidebar~.fixed,.ui.visible[class*=\"very wide\"].left.sidebar~.pusher{-webkit-transform:translate3d(475px,0,0);transform:translate3d(475px,0,0)}.ui.visible.thin.right.sidebar~.fixed,.ui.visible.thin.right.sidebar~.pusher{-webkit-transform:translate3d(-150px,0,0);transform:translate3d(-150px,0,0)}.ui.visible[class*=\"very thin\"].right.sidebar~.fixed,.ui.visible[class*=\"very thin\"].right.sidebar~.pusher{-webkit-transform:translate3d(-60px,0,0);transform:translate3d(-60px,0,0)}.ui.visible.wide.right.sidebar~.fixed,.ui.visible.wide.right.sidebar~.pusher{-webkit-transform:translate3d(-350px,0,0);transform:translate3d(-350px,0,0)}.ui.visible[class*=\"very wide\"].right.sidebar~.fixed,.ui.visible[class*=\"very wide\"].right.sidebar~.pusher{-webkit-transform:translate3d(-475px,0,0);transform:translate3d(-475px,0,0)}.ui.overlay.sidebar{z-index:102}.ui.left.overlay.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.overlay.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.overlay.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.overlay.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.animating.ui.overlay.sidebar,.ui.visible.overlay.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.left.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.right.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.top.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.bottom.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.overlay.sidebar~.fixed,.ui.visible.overlay.sidebar~.pusher{-webkit-transform:none!important;transform:none!important}.ui.push.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.push.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.push.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.push.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.push.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.visible.push.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}.ui.visible.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.slide.along.sidebar{z-index:1}.ui.left.slide.along.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.right.slide.along.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.top.slide.along.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.bottom.slide.along.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.animating.slide.along.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.along.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.slide.out.sidebar{z-index:1}.ui.left.slide.out.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.right.slide.out.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.top.slide.out.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.bottom.slide.out.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.animating.slide.out.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.out.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.scale.down.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.scale.down.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.scale.down.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.scale.down.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.scale.down.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.scale.down.left.sidebar~.pusher{-webkit-transform-origin:75% 50%;transform-origin:75% 50%}.ui.scale.down.right.sidebar~.pusher{-webkit-transform-origin:25% 50%;transform-origin:25% 50%}.ui.scale.down.top.sidebar~.pusher{-webkit-transform-origin:50% 75%;transform-origin:50% 75%}.ui.scale.down.bottom.sidebar~.pusher{-webkit-transform-origin:50% 25%;transform-origin:50% 25%}.ui.animating.scale.down>.visible.ui.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.animating.scale.down.sidebar~.pusher,.ui.visible.scale.down.sidebar~.pusher{display:block!important;width:100%;height:100%;overflow:hidden!important}.ui.visible.scale.down.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.scale.down.sidebar~.pusher{-webkit-transform:scale(.75);transform:scale(.75)}/*!\n * # Semantic UI 2.4.0 - Sticky\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.sticky{position:static;-webkit-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky}/*!\n * # Semantic UI 2.4.0 - Tab\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}/*!\n * # Semantic UI 2.4.0 - Transition\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * http://opensource.org/licenses/MIT\n *\n */.transition{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animating.transition{-webkit-backface-visibility:hidden;backface-visibility:hidden;visibility:visible!important}.loading.transition{position:absolute;top:-99999px;left:-99999px}.hidden.transition{display:none;visibility:hidden}.visible.transition{display:block!important;visibility:visible!important}.disabled.transition{-webkit-animation-play-state:paused;animation-play-state:paused}.looping.transition{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.transition.browse{-webkit-animation-duration:.5s;animation-duration:.5s}.transition.browse.in{-webkit-animation-name:browseIn;animation-name:browseIn}.transition.browse.left.out,.transition.browse.out{-webkit-animation-name:browseOutLeft;animation-name:browseOutLeft}.transition.browse.right.out{-webkit-animation-name:browseOutRight;animation-name:browseOutRight}@-webkit-keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@-webkit-keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@-webkit-keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}.drop.transition{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.34,1.61,.7,1);animation-timing-function:cubic-bezier(.34,1.61,.7,1)}.drop.transition.in{-webkit-animation-name:dropIn;animation-name:dropIn}.drop.transition.out{-webkit-animation-name:dropOut;animation-name:dropOut}@-webkit-keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}@keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}.transition.fade.in{-webkit-animation-name:fadeIn;animation-name:fadeIn}.transition[class*=\"fade up\"].in{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}.transition[class*=\"fade down\"].in{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}.transition[class*=\"fade left\"].in{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}.transition[class*=\"fade right\"].in{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}.transition.fade.out{-webkit-animation-name:fadeOut;animation-name:fadeOut}.transition[class*=\"fade up\"].out{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}.transition[class*=\"fade down\"].out{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}.transition[class*=\"fade left\"].out{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}.transition[class*=\"fade right\"].out{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}.flip.transition.in,.flip.transition.out{-webkit-animation-duration:.6s;animation-duration:.6s}.horizontal.flip.transition.in{-webkit-animation-name:horizontalFlipIn;animation-name:horizontalFlipIn}.horizontal.flip.transition.out{-webkit-animation-name:horizontalFlipOut;animation-name:horizontalFlipOut}.vertical.flip.transition.in{-webkit-animation-name:verticalFlipIn;animation-name:verticalFlipIn}.vertical.flip.transition.out{-webkit-animation-name:verticalFlipOut;animation-name:verticalFlipOut}@-webkit-keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@-webkit-keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@-webkit-keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@-webkit-keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}@keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}.scale.transition.in{-webkit-animation-name:scaleIn;animation-name:scaleIn}.scale.transition.out{-webkit-animation-name:scaleOut;animation-name:scaleOut}@-webkit-keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition.fly{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.transition.fly.in{-webkit-animation-name:flyIn;animation-name:flyIn}.transition[class*=\"fly up\"].in{-webkit-animation-name:flyInUp;animation-name:flyInUp}.transition[class*=\"fly down\"].in{-webkit-animation-name:flyInDown;animation-name:flyInDown}.transition[class*=\"fly left\"].in{-webkit-animation-name:flyInLeft;animation-name:flyInLeft}.transition[class*=\"fly right\"].in{-webkit-animation-name:flyInRight;animation-name:flyInRight}.transition.fly.out{-webkit-animation-name:flyOut;animation-name:flyOut}.transition[class*=\"fly up\"].out{-webkit-animation-name:flyOutUp;animation-name:flyOutUp}.transition[class*=\"fly down\"].out{-webkit-animation-name:flyOutDown;animation-name:flyOutDown}.transition[class*=\"fly left\"].out{-webkit-animation-name:flyOutLeft;animation-name:flyOutLeft}.transition[class*=\"fly right\"].out{-webkit-animation-name:flyOutRight;animation-name:flyOutRight}@-webkit-keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@-webkit-keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.transition.slide.in,.transition[class*=\"slide down\"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"slide up\"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"slide left\"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"slide right\"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:center left;transform-origin:center left}.transition.slide.out,.transition[class*=\"slide down\"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"slide up\"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"slide left\"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"slide right\"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@-webkit-keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}.transition.swing{-webkit-animation-duration:.8s;animation-duration:.8s}.transition[class*=\"swing down\"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"swing up\"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"swing left\"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"swing right\"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:center left;transform-origin:center left}.transition.swing.out,.transition[class*=\"swing down\"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*=\"swing up\"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*=\"swing left\"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center right;transform-origin:center right}.transition[class*=\"swing right\"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:center left;transform-origin:center left}@-webkit-keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@-webkit-keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@-webkit-keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@-webkit-keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}@keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}.transition.zoom.in{-webkit-animation-name:zoomIn;animation-name:zoomIn}.transition.zoom.out{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}.flash.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:flash;animation-name:flash}.shake.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:shake;animation-name:shake}.bounce.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:bounce;animation-name:bounce}.tada.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:tada;animation-name:tada}.pulse.transition{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-name:pulse;animation-name:pulse}.jiggle.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:jiggle;animation-name:jiggle}.transition.glow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:cubic-bezier(.19,1,.22,1);animation-timing-function:cubic-bezier(.19,1,.22,1)}.transition.glow{-webkit-animation-name:glow;animation-name:glow}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@keyframes bounce{0%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@-webkit-keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@keyframes tada{0%{-webkit-transform:scale(1);transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg);transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.1) rotate(3deg);transform:scale(1.1) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.1) rotate(-3deg);transform:scale(1.1) rotate(-3deg)}100%{-webkit-transform:scale(1) rotate(0);transform:scale(1) rotate(0)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}@keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}"],"sourceRoot":""}]); +// Exports +/* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___); + + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/css-loader/getUrl.js": +/*!**************************************!*\ + !*** (webpack)/css-loader/getUrl.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports=function(){"use strict";var e={91:function(e){e.exports=function(e,r){if(!r){r={}}e=e&&e.__esModule?e.default:e;if(typeof e!=="string"){return e}if(/^['"].*['"]$/.test(e)){e=e.slice(1,-1)}if(r.hash){e+=r.hash}if(/["'() \t\n]/.test(e)||r.needQuotes){return'"'.concat(e.replace(/"/g,'\\"').replace(/\n/g,"\\n"),'"')}return e}}};var r={};function __nccwpck_require__(t){if(r[t]){return r[t].exports}var _=r[t]={exports:{}};var n=true;try{e[t](_,_.exports,__nccwpck_require__);n=false}finally{if(n)delete r[t]}return _.exports}__nccwpck_require__.ab=__dirname+"/";return __nccwpck_require__(91)}(); +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/harmony-module.js": +/*!*******************************************!*\ + !*** (webpack)/webpack/harmony-module.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 931: +/***/ (function(module) { + +module.exports = function(originalModule) { + if (!originalModule.webpackPolyfill) { + var module = Object.create(originalModule); + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + Object.defineProperty(module, "exports", { + enumerable: true + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(931); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/module.js": +/*!***********************************!*\ + !*** (webpack)/webpack/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 880: +/***/ (function(module) { + +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(880); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/amp-context.js": +/*!***************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/amp-context.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.AmpStateContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var AmpStateContext = /*#__PURE__*/_react["default"].createContext({}); + +exports.AmpStateContext = AmpStateContext; + +if (true) { + AmpStateContext.displayName = 'AmpStateContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/amp.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/amp.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _s = $RefreshSig$(); + +exports.__esModule = true; +exports.isInAmpMode = isInAmpMode; +exports.useAmp = useAmp; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _ampContext = __webpack_require__(/*! ./amp-context */ "./node_modules/next/dist/next-server/lib/amp-context.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +function isInAmpMode() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$ampFirst = _ref.ampFirst, + ampFirst = _ref$ampFirst === void 0 ? false : _ref$ampFirst, + _ref$hybrid = _ref.hybrid, + hybrid = _ref$hybrid === void 0 ? false : _ref$hybrid, + _ref$hasQuery = _ref.hasQuery, + hasQuery = _ref$hasQuery === void 0 ? false : _ref$hasQuery; + + return ampFirst || hybrid && hasQuery; +} + +function useAmp() { + _s(); + + // Don't assign the context value to a variable to save bytes + return isInAmpMode(_react["default"].useContext(_ampContext.AmpStateContext)); +} + +_s(useAmp, "gDsCjeeItUuvgOWf1v4qoK9RF6k="); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/head-manager-context.js": +/*!************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/head-manager-context.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.HeadManagerContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var HeadManagerContext = /*#__PURE__*/_react["default"].createContext({}); + +exports.HeadManagerContext = HeadManagerContext; + +if (true) { + HeadManagerContext.displayName = 'HeadManagerContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/head.js": +/*!********************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/head.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _defineProperty = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"); + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +exports.__esModule = true; +exports.defaultHead = defaultHead; +exports["default"] = void 0; + +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _sideEffect = _interopRequireDefault(__webpack_require__(/*! ./side-effect */ "./node_modules/next/dist/next-server/lib/side-effect.js")); + +var _ampContext = __webpack_require__(/*! ./amp-context */ "./node_modules/next/dist/next-server/lib/amp-context.js"); + +var _headManagerContext = __webpack_require__(/*! ./head-manager-context */ "./node_modules/next/dist/next-server/lib/head-manager-context.js"); + +var _amp = __webpack_require__(/*! ./amp */ "./node_modules/next/dist/next-server/lib/amp.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || typeof obj !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +function defaultHead() { + var inAmpMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var head = [/*#__PURE__*/_react["default"].createElement("meta", { + charSet: "utf-8" + })]; + + if (!inAmpMode) { + head.push( /*#__PURE__*/_react["default"].createElement("meta", { + name: "viewport", + content: "width=device-width" + })); + } + + return head; +} + +function onlyReactElement(list, child) { + // React children can be "string" or "number" in this case we ignore them for backwards compat + if (typeof child === 'string' || typeof child === 'number') { + return list; + } // Adds support for React.Fragment + + + if (child.type === _react["default"].Fragment) { + return list.concat(_react["default"].Children.toArray(child.props.children).reduce(function (fragmentList, fragmentChild) { + if (typeof fragmentChild === 'string' || typeof fragmentChild === 'number') { + return fragmentList; + } + + return fragmentList.concat(fragmentChild); + }, [])); + } + + return list.concat(child); +} + +var METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp']; +/* +returns a function for filtering head child elements +which shouldn't be duplicated, like <title/> +Also adds support for deduplicated `key` properties +*/ + +function unique() { + var keys = new Set(); + var tags = new Set(); + var metaTypes = new Set(); + var metaCategories = {}; + return function (h) { + var isUnique = true; + var hasKey = false; + + if (h.key && typeof h.key !== 'number' && h.key.indexOf('$') > 0) { + hasKey = true; + var key = h.key.slice(h.key.indexOf('$') + 1); + + if (keys.has(key)) { + isUnique = false; + } else { + keys.add(key); + } + } // eslint-disable-next-line default-case + + + switch (h.type) { + case 'title': + case 'base': + if (tags.has(h.type)) { + isUnique = false; + } else { + tags.add(h.type); + } + + break; + + case 'meta': + for (var i = 0, len = METATYPES.length; i < len; i++) { + var metatype = METATYPES[i]; + if (!h.props.hasOwnProperty(metatype)) continue; + + if (metatype === 'charSet') { + if (metaTypes.has(metatype)) { + isUnique = false; + } else { + metaTypes.add(metatype); + } + } else { + var category = h.props[metatype]; + var categories = metaCategories[metatype] || new Set(); + + if ((metatype !== 'name' || !hasKey) && categories.has(category)) { + isUnique = false; + } else { + categories.add(category); + metaCategories[metatype] = categories; + } + } + } + + break; + } + + return isUnique; + }; +} +/** +* +* @param headElements List of multiple <Head> instances +*/ + + +function reduceComponents(headElements, props) { + return headElements.reduce(function (list, headElement) { + var headElementChildren = _react["default"].Children.toArray(headElement.props.children); + + return list.concat(headElementChildren); + }, []).reduce(onlyReactElement, []).reverse().concat(defaultHead(props.inAmpMode)).filter(unique()).reverse().map(function (c, i) { + var key = c.key || i; + + if (false) { var newProps; } + + return /*#__PURE__*/_react["default"].cloneElement(c, { + key: key + }); + }); +} +/** +* This component injects elements to `<head>` of your page. +* To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once. +*/ + + +function Head(_ref) { + var children = _ref.children; + var ampState = (0, _react.useContext)(_ampContext.AmpStateContext); + var headManager = (0, _react.useContext)(_headManagerContext.HeadManagerContext); + return /*#__PURE__*/_react["default"].createElement(_sideEffect["default"], { + reduceComponentsToState: reduceComponents, + headManager: headManager, + inAmpMode: (0, _amp.isInAmpMode)(ampState) + }, children); +} // TODO: Remove in the next major release + + +_c = Head; + +Head.rewind = function () {}; + +var _default = Head; +exports["default"] = _default; + +var _c; + +$RefreshReg$(_c, "Head"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/i18n/normalize-locale-path.js": +/*!******************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/i18n/normalize-locale-path.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.normalizeLocalePath = normalizeLocalePath; + +function normalizeLocalePath(pathname, locales) { + var detectedLocale; // first item will be empty string from splitting at first char + + var pathnameParts = pathname.split('/'); + (locales || []).some(function (locale) { + if (pathnameParts[1].toLowerCase() === locale.toLowerCase()) { + detectedLocale = locale; + pathnameParts.splice(1, 1); + pathname = pathnameParts.join('/') || '/'; + return true; + } + + return false; + }); + return { + pathname: pathname, + detectedLocale: detectedLocale + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/mitt.js": +/*!********************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/mitt.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = mitt; +/* +MIT License +Copyright (c) Jason Miller (https://jasonformat.com/) +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. +*/ +// This file is based on https://github.com/developit/mitt/blob/v1.1.3/src/index.js +// It's been edited for the needs of this script +// See the LICENSE at the top of the file + +function mitt() { + var all = Object.create(null); + return { + on: function on(type, handler) { + ; + (all[type] || (all[type] = [])).push(handler); + }, + off: function off(type, handler) { + if (all[type]) { + all[type].splice(all[type].indexOf(handler) >>> 0, 1); + } + }, + emit: function emit(type) { + for (var _len = arguments.length, evts = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + evts[_key - 1] = arguments[_key]; + } + + // eslint-disable-next-line array-callback-return + ; + (all[type] || []).slice().map(function (handler) { + handler.apply(void 0, evts); + }); + } + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router-context.js": +/*!******************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router-context.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.RouterContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var RouterContext = /*#__PURE__*/_react["default"].createContext(null); + +exports.RouterContext = RouterContext; + +if (true) { + RouterContext.displayName = 'RouterContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/router.js": +/*!*****************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/router.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +exports.__esModule = true; +exports.getDomainLocale = getDomainLocale; +exports.addLocale = addLocale; +exports.delLocale = delLocale; +exports.hasBasePath = hasBasePath; +exports.addBasePath = addBasePath; +exports.delBasePath = delBasePath; +exports.isLocalURL = isLocalURL; +exports.interpolateAs = interpolateAs; +exports.resolveHref = resolveHref; +exports["default"] = void 0; + +var _normalizeTrailingSlash = __webpack_require__(/*! ../../../client/normalize-trailing-slash */ "./node_modules/next/dist/client/normalize-trailing-slash.js"); + +var _routeLoader = __webpack_require__(/*! ../../../client/route-loader */ "./node_modules/next/dist/client/route-loader.js"); + +var _denormalizePagePath = __webpack_require__(/*! ../../server/denormalize-page-path */ "./node_modules/next/dist/next-server/server/denormalize-page-path.js"); + +var _normalizeLocalePath = __webpack_require__(/*! ../i18n/normalize-locale-path */ "./node_modules/next/dist/next-server/lib/i18n/normalize-locale-path.js"); + +var _mitt = _interopRequireDefault(__webpack_require__(/*! ../mitt */ "./node_modules/next/dist/next-server/lib/mitt.js")); + +var _utils = __webpack_require__(/*! ../utils */ "./node_modules/next/dist/next-server/lib/utils.js"); + +var _isDynamic = __webpack_require__(/*! ./utils/is-dynamic */ "./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js"); + +var _parseRelativeUrl = __webpack_require__(/*! ./utils/parse-relative-url */ "./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js"); + +var _querystring = __webpack_require__(/*! ./utils/querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js"); + +var _resolveRewrites = _interopRequireDefault(__webpack_require__(/*! ./utils/resolve-rewrites */ "./node_modules/next/dist/next-server/lib/router/utils/resolve-rewrites-noop.js")); + +var _routeMatcher = __webpack_require__(/*! ./utils/route-matcher */ "./node_modules/next/dist/next-server/lib/router/utils/route-matcher.js"); + +var _routeRegex = __webpack_require__(/*! ./utils/route-regex */ "./node_modules/next/dist/next-server/lib/router/utils/route-regex.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} +/* global __NEXT_DATA__ */ +// tslint:disable:no-console + + +var detectDomainLocale; + +if (false) {} + +var basePath = false || ''; + +function buildCancellationError() { + return Object.assign(new Error('Route Cancelled'), { + cancelled: true + }); +} + +function addPathPrefix(path, prefix) { + return prefix && path.startsWith('/') ? path === '/' ? (0, _normalizeTrailingSlash.normalizePathTrailingSlash)(prefix) : "".concat(prefix).concat(pathNoQueryHash(path) === '/' ? path.substring(1) : path) : path; +} + +function getDomainLocale(path, locale, locales, domainLocales) { + if (false) { var detectedDomain; } + + return false; +} + +function addLocale(path, locale, defaultLocale) { + if (false) {} + + return path; +} + +function delLocale(path, locale) { + if (false) {} + + return path; +} + +function pathNoQueryHash(path) { + var queryIndex = path.indexOf('?'); + var hashIndex = path.indexOf('#'); + + if (queryIndex > -1 || hashIndex > -1) { + path = path.substring(0, queryIndex > -1 ? queryIndex : hashIndex); + } + + return path; +} + +function hasBasePath(path) { + path = pathNoQueryHash(path); + return path === basePath || path.startsWith(basePath + '/'); +} + +function addBasePath(path) { + // we only add the basepath on relative urls + return addPathPrefix(path, basePath); +} + +function delBasePath(path) { + path = path.slice(basePath.length); + if (!path.startsWith('/')) path = "/".concat(path); + return path; +} +/** +* Detects whether a given url is routable by the Next.js router (browser only). +*/ + + +function isLocalURL(url) { + // prevent a hydration mismatch on href for url with anchor refs + if (url.startsWith('/') || url.startsWith('#')) return true; + + try { + // absolute urls can be local if they are on the same origin + var locationOrigin = (0, _utils.getLocationOrigin)(); + var resolved = new URL(url, locationOrigin); + return resolved.origin === locationOrigin && hasBasePath(resolved.pathname); + } catch (_) { + return false; + } +} + +function interpolateAs(route, asPathname, query) { + var interpolatedRoute = ''; + var dynamicRegex = (0, _routeRegex.getRouteRegex)(route); + var dynamicGroups = dynamicRegex.groups; + var dynamicMatches = // Try to match the dynamic route against the asPath + (asPathname !== route ? (0, _routeMatcher.getRouteMatcher)(dynamicRegex)(asPathname) : '') || // Fall back to reading the values from the href + // TODO: should this take priority; also need to change in the router. + query; + interpolatedRoute = route; + var params = Object.keys(dynamicGroups); + + if (!params.every(function (param) { + var value = dynamicMatches[param] || ''; + var _dynamicGroups$param = dynamicGroups[param], + repeat = _dynamicGroups$param.repeat, + optional = _dynamicGroups$param.optional; // support single-level catch-all + // TODO: more robust handling for user-error (passing `/`) + + var replaced = "[".concat(repeat ? '...' : '').concat(param, "]"); + + if (optional) { + replaced = "".concat(!value ? '/' : '', "[").concat(replaced, "]"); + } + + if (repeat && !Array.isArray(value)) value = [value]; + return (optional || param in dynamicMatches) && ( // Interpolate group into data URL if present + interpolatedRoute = interpolatedRoute.replace(replaced, repeat ? value.map( // these values should be fully encoded instead of just + // path delimiter escaped since they are being inserted + // into the URL and we expect URL encoded segments + // when parsing dynamic route params + function (segment) { + return encodeURIComponent(segment); + }).join('/') : encodeURIComponent(value)) || '/'); + })) { + interpolatedRoute = ''; // did not satisfy all requirements + // n.b. We ignore this error because we handle warning for this case in + // development in the `<Link>` component directly. + } + + return { + params: params, + result: interpolatedRoute + }; +} + +function omitParmsFromQuery(query, params) { + var filteredQuery = {}; + Object.keys(query).forEach(function (key) { + if (!params.includes(key)) { + filteredQuery[key] = query[key]; + } + }); + return filteredQuery; +} +/** +* Resolves a given hyperlink with a certain router state (basePath not included). +* Preserves absolute urls. +*/ + + +function resolveHref(currentPath, href, resolveAs) { + // we use a dummy base url for relative urls + var base = new URL(currentPath, 'http://n'); + var urlAsString = typeof href === 'string' ? href : (0, _utils.formatWithValidation)(href); // Return because it cannot be routed by the Next.js router + + if (!isLocalURL(urlAsString)) { + return resolveAs ? [urlAsString] : urlAsString; + } + + try { + var finalUrl = new URL(urlAsString, base); + finalUrl.pathname = (0, _normalizeTrailingSlash.normalizePathTrailingSlash)(finalUrl.pathname); + var interpolatedAs = ''; + + if ((0, _isDynamic.isDynamicRoute)(finalUrl.pathname) && finalUrl.searchParams && resolveAs) { + var query = (0, _querystring.searchParamsToUrlQuery)(finalUrl.searchParams); + + var _interpolateAs = interpolateAs(finalUrl.pathname, finalUrl.pathname, query), + result = _interpolateAs.result, + params = _interpolateAs.params; + + if (result) { + interpolatedAs = (0, _utils.formatWithValidation)({ + pathname: result, + hash: finalUrl.hash, + query: omitParmsFromQuery(query, params) + }); + } + } // if the origin didn't change, it means we received a relative href + + + var resolvedHref = finalUrl.origin === base.origin ? finalUrl.href.slice(finalUrl.origin.length) : finalUrl.href; + return resolveAs ? [resolvedHref, interpolatedAs || resolvedHref] : resolvedHref; + } catch (_) { + return resolveAs ? [urlAsString] : urlAsString; + } +} + +function stripOrigin(url) { + var origin = (0, _utils.getLocationOrigin)(); + return url.startsWith(origin) ? url.substring(origin.length) : url; +} + +function prepareUrlAs(router, url, as) { + // If url and as provided as an object representation, + // we'll format them into the string version here. + var _resolveHref = resolveHref(router.pathname, url, true), + _resolveHref2 = _slicedToArray(_resolveHref, 2), + resolvedHref = _resolveHref2[0], + resolvedAs = _resolveHref2[1]; + + var origin = (0, _utils.getLocationOrigin)(); + var hrefHadOrigin = resolvedHref.startsWith(origin); + var asHadOrigin = resolvedAs && resolvedAs.startsWith(origin); + resolvedHref = stripOrigin(resolvedHref); + resolvedAs = resolvedAs ? stripOrigin(resolvedAs) : resolvedAs; + var preparedUrl = hrefHadOrigin ? resolvedHref : addBasePath(resolvedHref); + var preparedAs = as ? stripOrigin(resolveHref(router.pathname, as)) : resolvedAs || resolvedHref; + return { + url: preparedUrl, + as: asHadOrigin ? preparedAs : addBasePath(preparedAs) + }; +} + +function resolveDynamicRoute(pathname, pages) { + var cleanPathname = (0, _normalizeTrailingSlash.removePathTrailingSlash)((0, _denormalizePagePath.denormalizePagePath)(pathname)); + + if (cleanPathname === '/404' || cleanPathname === '/_error') { + return pathname; + } // handle resolving href for dynamic routes + + + if (!pages.includes(cleanPathname)) { + // eslint-disable-next-line array-callback-return + pages.some(function (page) { + if ((0, _isDynamic.isDynamicRoute)(page) && (0, _routeRegex.getRouteRegex)(page).re.test(cleanPathname)) { + pathname = page; + return true; + } + }); + } + + return (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname); +} + +var manualScrollRestoration = false && false; +var SSG_DATA_NOT_FOUND = Symbol('SSG_DATA_NOT_FOUND'); + +function fetchRetry(url, attempts) { + return fetch(url, { + // Cookies are required to be present for Next.js' SSG "Preview Mode". + // Cookies may also be required for `getServerSideProps`. + // + // > `fetch` won’t send cookies, unless you set the credentials init + // > option. + // https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch + // + // > For maximum browser compatibility when it comes to sending & + // > receiving cookies, always supply the `credentials: 'same-origin'` + // > option instead of relying on the default. + // https://github.com/github/fetch#caveats + credentials: 'same-origin' + }).then(function (res) { + if (!res.ok) { + if (attempts > 1 && res.status >= 500) { + return fetchRetry(url, attempts - 1); + } + + if (res.status === 404) { + return res.json().then(function (data) { + if (data.notFound) { + return { + notFound: SSG_DATA_NOT_FOUND + }; + } + + throw new Error("Failed to load static props"); + }); + } + + throw new Error("Failed to load static props"); + } + + return res.json(); + }); +} + +function fetchNextData(dataHref, isServerRender) { + return fetchRetry(dataHref, isServerRender ? 3 : 1)["catch"](function (err) { + // We should only trigger a server-side transition if this was caused + // on a client-side transition. Otherwise, we'd get into an infinite + // loop. + if (!isServerRender) { + (0, _routeLoader.markAssetError)(err); + } + + throw err; + }); +} + +var Router = /*#__PURE__*/function () { + /** + * Map of all components loaded in `Router` + */ + // Static Data Cache + // In-flight Server Data Requests, for deduping + function Router(_pathname, _query, _as, _ref) { + var _this = this; + + var initialProps = _ref.initialProps, + pageLoader = _ref.pageLoader, + App = _ref.App, + wrapApp = _ref.wrapApp, + Component = _ref.Component, + err = _ref.err, + subscription = _ref.subscription, + isFallback = _ref.isFallback, + locale = _ref.locale, + locales = _ref.locales, + defaultLocale = _ref.defaultLocale, + domainLocales = _ref.domainLocales, + isPreview = _ref.isPreview; + + _classCallCheck(this, Router); + + this.route = void 0; + this.pathname = void 0; + this.query = void 0; + this.asPath = void 0; + this.basePath = void 0; + this.components = void 0; + this.sdc = {}; + this.sdr = {}; + this.sub = void 0; + this.clc = void 0; + this.pageLoader = void 0; + this._bps = void 0; + this.events = void 0; + this._wrapApp = void 0; + this.isSsr = void 0; + this.isFallback = void 0; + this._inFlightRoute = void 0; + this._shallow = void 0; + this.locale = void 0; + this.locales = void 0; + this.defaultLocale = void 0; + this.domainLocales = void 0; + this.isReady = void 0; + this.isPreview = void 0; + this.isLocaleDomain = void 0; + this._idx = 0; + + this.onPopState = function (e) { + var state = e.state; + + if (!state) { + // We get state as undefined for two reasons. + // 1. With older safari (< 8) and older chrome (< 34) + // 2. When the URL changed with # + // + // In the both cases, we don't need to proceed and change the route. + // (as it's already changed) + // But we can simply replace the state with the new changes. + // Actually, for (1) we don't need to nothing. But it's hard to detect that event. + // So, doing the following for (1) does no harm. + var _pathname2 = _this.pathname, + query = _this.query; + + _this.changeState('replaceState', (0, _utils.formatWithValidation)({ + pathname: addBasePath(_pathname2), + query: query + }), (0, _utils.getURL)()); + + return; + } + + if (!state.__N) { + return; + } + + var forcedScroll; + var url = state.url, + as = state.as, + options = state.options, + idx = state.idx; + + if (false) { var v; } + + _this._idx = idx; + + var _ref2 = (0, _parseRelativeUrl.parseRelativeUrl)(url), + pathname = _ref2.pathname; // Make sure we don't re-render on initial load, + // can be caused by navigating back from an external site + + + if (_this.isSsr && as === _this.asPath && pathname === _this.pathname) { + return; + } // If the downstream application returns falsy, return. + // They will then be responsible for handling the event. + + + if (_this._bps && !_this._bps(state)) { + return; + } + + _this.change('replaceState', url, as, Object.assign({}, options, { + shallow: options.shallow && _this._shallow, + locale: options.locale || _this.defaultLocale + }), forcedScroll); + }; // represents the current component key + + + this.route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(_pathname); // set up the component cache (by route keys) + + this.components = {}; // We should not keep the cache, if there's an error + // Otherwise, this cause issues when when going back and + // come again to the errored page. + + if (_pathname !== '/_error') { + this.components[this.route] = { + Component: Component, + initial: true, + props: initialProps, + err: err, + __N_SSG: initialProps && initialProps.__N_SSG, + __N_SSP: initialProps && initialProps.__N_SSP + }; + } + + this.components['/_app'] = { + Component: App, + styleSheets: [ + /* /_app does not need its stylesheets managed */ + ] + }; // Backwards compat for Router.router.events + // TODO: Should be remove the following major version as it was never documented + + this.events = Router.events; + this.pageLoader = pageLoader; + this.pathname = _pathname; + this.query = _query; // if auto prerendered and dynamic route wait to update asPath + // until after mount to prevent hydration mismatch + + var autoExportDynamic = (0, _isDynamic.isDynamicRoute)(_pathname) && self.__NEXT_DATA__.autoExport; + + this.asPath = autoExportDynamic ? _pathname : _as; + this.basePath = basePath; + this.sub = subscription; + this.clc = null; + this._wrapApp = wrapApp; // make sure to ignore extra popState in safari on navigating + // back from external site + + this.isSsr = true; + this.isFallback = isFallback; + this.isReady = !!(self.__NEXT_DATA__.gssp || self.__NEXT_DATA__.gip || !autoExportDynamic && !self.location.search); + this.isPreview = !!isPreview; + this.isLocaleDomain = false; + + if (false) {} + + if (true) { + // make sure "as" doesn't start with double slashes or else it can + // throw an error as it's considered invalid + if (_as.substr(0, 2) !== '//') { + // in order for `e.state` to work on the `onpopstate` event + // we have to register the initial route upon initialization + this.changeState('replaceState', (0, _utils.formatWithValidation)({ + pathname: addBasePath(_pathname), + query: _query + }), (0, _utils.getURL)(), { + locale: locale + }); + } + + window.addEventListener('popstate', this.onPopState); // enable custom scroll restoration handling when available + // otherwise fallback to browser's default handling + + if (false) {} + } + } + + _createClass(Router, [{ + key: "reload", + value: function reload() { + window.location.reload(); + } + /** + * Go back in history + */ + + }, { + key: "back", + value: function back() { + window.history.back(); + } + /** + * Performs a `pushState` with arguments + * @param url of the route + * @param as masks `url` for the browser + * @param options object you can define `shallow` and other options + */ + + }, { + key: "push", + value: function push(url, as) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (false) {} + + ; + + var _prepareUrlAs = prepareUrlAs(this, url, as); + + url = _prepareUrlAs.url; + as = _prepareUrlAs.as; + return this.change('pushState', url, as, options); + } + /** + * Performs a `replaceState` with arguments + * @param url of the route + * @param as masks `url` for the browser + * @param options object you can define `shallow` and other options + */ + + }, { + key: "replace", + value: function replace(url, as) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + ; + + var _prepareUrlAs2 = prepareUrlAs(this, url, as); + + url = _prepareUrlAs2.url; + as = _prepareUrlAs2.as; + return this.change('replaceState', url, as, options); + } + }, { + key: "change", + value: function () { + var _change = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(method, url, as, options, forcedScroll) { + var _options$scroll, localeChange, parsedAs, localePathResult, didNavigate, _this$locales, detectedDomain, asNoBasePath, _options$shallow, shallow, routeProps, cleanedAs, parsed, pathname, query, pages, rewrites, _yield, resolvedAs, rewritesResult, route, _parsedAs, asPathname, routeRegex, routeMatch, shouldInterpolate, interpolatedAs, missingParams, _self$__NEXT_DATA__$p, _self$__NEXT_DATA__$p2, routeInfo, _routeInfo, error, props, __N_SSG, __N_SSP, destination, parsedHref, _prepareUrlAs3, newUrl, newAs, notFoundRoute, appComp, isValidShallowRoute; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (isLocalURL(url)) { + _context.next = 3; + break; + } + + window.location.href = url; + return _context.abrupt("return", false); + + case 3: + // for static pages with query params in the URL we delay + // marking the router ready until after the query is updated + if (options._h) { + this.isReady = true; + } // Default to scroll reset behavior unless explicitly specified to be + // `false`! This makes the behavior between using `Router#push` and a + // `<Link />` consistent. + + + options.scroll = !!((_options$scroll = options.scroll) != null ? _options$scroll : true); + localeChange = options.locale !== this.locale; + + if (true) { + _context.next = 18; + break; + } + + this.locale = options.locale === false ? this.defaultLocale : options.locale || this.locale; + + if (typeof options.locale === 'undefined') { + options.locale = this.locale; + } + + parsedAs = (0, _parseRelativeUrl.parseRelativeUrl)(hasBasePath(as) ? delBasePath(as) : as); + localePathResult = (0, _normalizeLocalePath.normalizeLocalePath)(parsedAs.pathname, this.locales); + + if (localePathResult.detectedLocale) { + this.locale = localePathResult.detectedLocale; + parsedAs.pathname = addBasePath(parsedAs.pathname); + as = (0, _utils.formatWithValidation)(parsedAs); + url = addBasePath((0, _normalizeLocalePath.normalizeLocalePath)(hasBasePath(url) ? delBasePath(url) : url, this.locales).pathname); + } + + didNavigate = false; // we need to wrap this in the env check again since regenerator runtime + // moves this on its own due to the return + + if (false) {} + + detectedDomain = detectDomainLocale(this.domainLocales, undefined, this.locale); // we need to wrap this in the env check again since regenerator runtime + // moves this on its own due to the return + + if (false) {} + + if (!didNavigate) { + _context.next = 18; + break; + } + + return _context.abrupt("return", new Promise(function () {})); + + case 18: + if (!options._h) { + this.isSsr = false; + } // marking route changes as a navigation start entry + + + if (_utils.ST) { + performance.mark('routeChange'); + } + + _options$shallow = options.shallow, shallow = _options$shallow === void 0 ? false : _options$shallow; + routeProps = { + shallow: shallow + }; + + if (this._inFlightRoute) { + this.abortComponentLoad(this._inFlightRoute, routeProps); + } + + as = addBasePath(addLocale(hasBasePath(as) ? delBasePath(as) : as, options.locale, this.defaultLocale)); + cleanedAs = delLocale(hasBasePath(as) ? delBasePath(as) : as, this.locale); + this._inFlightRoute = as; // If the url change is only related to a hash change + // We should not proceed. We should only change the state. + // WARNING: `_h` is an internal option for handing Next.js client-side + // hydration. Your app should _never_ use this property. It may change at + // any time without notice. + + if (!(!options._h && this.onlyAHashChange(cleanedAs))) { + _context.next = 34; + break; + } + + this.asPath = cleanedAs; + Router.events.emit('hashChangeStart', as, routeProps); // TODO: do we need the resolved href when only a hash change? + + this.changeState(method, url, as, options); + this.scrollToHash(cleanedAs); + this.notify(this.components[this.route], null); + Router.events.emit('hashChangeComplete', as, routeProps); + return _context.abrupt("return", true); + + case 34: + parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url); + pathname = parsed.pathname, query = parsed.query; // The build manifest needs to be loaded before auto-static dynamic pages + // get their query parameters to allow ensuring they can be parsed properly + // when rewritten to + + _context.prev = 36; + _context.next = 39; + return this.pageLoader.getPageList(); + + case 39: + pages = _context.sent; + _context.next = 42; + return (0, _routeLoader.getClientBuildManifest)(); + + case 42: + _yield = _context.sent; + rewrites = _yield.__rewrites; + _context.next = 50; + break; + + case 46: + _context.prev = 46; + _context.t0 = _context["catch"](36); + // If we fail to resolve the page list or client-build manifest, we must + // do a server-side transition: + window.location.href = as; + return _context.abrupt("return", false); + + case 50: + // If asked to change the current URL we should reload the current page + // (not location.reload() but reload getInitialProps and other Next.js stuffs) + // We also need to set the method = replaceState always + // as this should not go into the history (That's how browsers work) + // We should compare the new asPath to the current asPath, not the url + if (!this.urlIsNew(cleanedAs) && !localeChange) { + method = 'replaceState'; + } // we need to resolve the as value using rewrites for dynamic SSG + // pages to allow building the data URL correctly + + + resolvedAs = as; // url and as should always be prefixed with basePath by this + // point by either next/link or router.push/replace so strip the + // basePath from the pathname to match the pages dir 1-to-1 + + pathname = pathname ? (0, _normalizeTrailingSlash.removePathTrailingSlash)(delBasePath(pathname)) : pathname; + + if (pathname !== '/_error') { + if (false) {} else { + parsed.pathname = resolveDynamicRoute(pathname, pages); + + if (parsed.pathname !== pathname) { + pathname = parsed.pathname; + url = (0, _utils.formatWithValidation)(parsed); + } + } + } + + route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname); + + if (isLocalURL(as)) { + _context.next = 60; + break; + } + + if (false) {} + + throw new Error("Invalid href: \"".concat(url, "\" and as: \"").concat(as, "\", received relative href and external as") + "\nSee more info: https://nextjs.org/docs/messages/invalid-relative-url-external-as"); + + case 58: + window.location.href = as; + return _context.abrupt("return", false); + + case 60: + resolvedAs = delLocale(delBasePath(resolvedAs), this.locale); + + if (!(0, _isDynamic.isDynamicRoute)(route)) { + _context.next = 76; + break; + } + + _parsedAs = (0, _parseRelativeUrl.parseRelativeUrl)(resolvedAs); + asPathname = _parsedAs.pathname; + routeRegex = (0, _routeRegex.getRouteRegex)(route); + routeMatch = (0, _routeMatcher.getRouteMatcher)(routeRegex)(asPathname); + shouldInterpolate = route === asPathname; + interpolatedAs = shouldInterpolate ? interpolateAs(route, asPathname, query) : {}; + + if (!(!routeMatch || shouldInterpolate && !interpolatedAs.result)) { + _context.next = 75; + break; + } + + missingParams = Object.keys(routeRegex.groups).filter(function (param) { + return !query[param]; + }); + + if (!(missingParams.length > 0)) { + _context.next = 73; + break; + } + + if (true) { + console.warn("".concat(shouldInterpolate ? "Interpolating href" : "Mismatching `as` and `href`", " failed to manually provide ") + "the params: ".concat(missingParams.join(', '), " in the `href`'s `query`")); + } + + throw new Error((shouldInterpolate ? "The provided `href` (".concat(url, ") value is missing query values (").concat(missingParams.join(', '), ") to be interpolated properly. ") : "The provided `as` value (".concat(asPathname, ") is incompatible with the `href` value (").concat(route, "). ")) + "Read more: https://nextjs.org/docs/messages/".concat(shouldInterpolate ? 'href-interpolation-failed' : 'incompatible-href-as')); + + case 73: + _context.next = 76; + break; + + case 75: + if (shouldInterpolate) { + as = (0, _utils.formatWithValidation)(Object.assign({}, _parsedAs, { + pathname: interpolatedAs.result, + query: omitParmsFromQuery(query, interpolatedAs.params) + })); + } else { + // Merge params into `query`, overwriting any specified in search + Object.assign(query, routeMatch); + } + + case 76: + Router.events.emit('routeChangeStart', as, routeProps); + _context.prev = 77; + _context.next = 80; + return this.getRouteInfo(route, pathname, query, as, resolvedAs, routeProps); + + case 80: + routeInfo = _context.sent; + _routeInfo = routeInfo, error = _routeInfo.error, props = _routeInfo.props, __N_SSG = _routeInfo.__N_SSG, __N_SSP = _routeInfo.__N_SSP; // handle redirect on client-transition + + if (!((__N_SSG || __N_SSP) && props)) { + _context.next = 107; + break; + } + + if (!(props.pageProps && props.pageProps.__N_REDIRECT)) { + _context.next = 93; + break; + } + + destination = props.pageProps.__N_REDIRECT; // check if destination is internal (resolves to a page) and attempt + // client-navigation if it is falling back to hard navigation if + // it's not + + if (!destination.startsWith('/')) { + _context.next = 91; + break; + } + + parsedHref = (0, _parseRelativeUrl.parseRelativeUrl)(destination); + parsedHref.pathname = resolveDynamicRoute(parsedHref.pathname, pages); + + if (!pages.includes(parsedHref.pathname)) { + _context.next = 91; + break; + } + + _prepareUrlAs3 = prepareUrlAs(this, destination, destination), newUrl = _prepareUrlAs3.url, newAs = _prepareUrlAs3.as; + return _context.abrupt("return", this.change(method, newUrl, newAs, options)); + + case 91: + window.location.href = destination; + return _context.abrupt("return", new Promise(function () {})); + + case 93: + this.isPreview = !!props.__N_PREVIEW; // handle SSG data 404 + + if (!(props.notFound === SSG_DATA_NOT_FOUND)) { + _context.next = 107; + break; + } + + _context.prev = 95; + _context.next = 98; + return this.fetchComponent('/404'); + + case 98: + notFoundRoute = '/404'; + _context.next = 104; + break; + + case 101: + _context.prev = 101; + _context.t1 = _context["catch"](95); + notFoundRoute = '/_error'; + + case 104: + _context.next = 106; + return this.getRouteInfo(notFoundRoute, notFoundRoute, query, as, resolvedAs, { + shallow: false + }); + + case 106: + routeInfo = _context.sent; + + case 107: + Router.events.emit('beforeHistoryChange', as, routeProps); + this.changeState(method, url, as, options); + + if (true) { + appComp = this.components['/_app'].Component; + window.next.isPrerendered = appComp.getInitialProps === appComp.origGetInitialProps && !routeInfo.Component.getInitialProps; + } // shallow routing is only allowed for same page URL changes. + + + isValidShallowRoute = options.shallow && this.route === route; + + if (options._h && pathname === '/_error' && ((_self$__NEXT_DATA__$p = self.__NEXT_DATA__.props) == null ? void 0 : (_self$__NEXT_DATA__$p2 = _self$__NEXT_DATA__$p.pageProps) == null ? void 0 : _self$__NEXT_DATA__$p2.statusCode) === 500 && props != null && props.pageProps) { + // ensure statusCode is still correct for static 500 page + // when updating query information + props.pageProps.statusCode = 500; + } + + _context.next = 114; + return this.set(route, pathname, query, cleanedAs, routeInfo, forcedScroll || (isValidShallowRoute || !options.scroll ? null : { + x: 0, + y: 0 + }))["catch"](function (e) { + if (e.cancelled) error = error || e;else throw e; + }); + + case 114: + if (!error) { + _context.next = 117; + break; + } + + Router.events.emit('routeChangeError', error, cleanedAs, routeProps); + throw error; + + case 117: + if (false) {} + + Router.events.emit('routeChangeComplete', as, routeProps); + return _context.abrupt("return", true); + + case 122: + _context.prev = 122; + _context.t2 = _context["catch"](77); + + if (!_context.t2.cancelled) { + _context.next = 126; + break; + } + + return _context.abrupt("return", false); + + case 126: + throw _context.t2; + + case 127: + case "end": + return _context.stop(); + } + } + }, _callee, this, [[36, 46], [77, 122], [95, 101]]); + })); + + function change(_x, _x2, _x3, _x4, _x5) { + return _change.apply(this, arguments); + } + + return change; + }() + }, { + key: "changeState", + value: function changeState(method, url, as) { + var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + if (true) { + if (typeof window.history === 'undefined') { + console.error("Warning: window.history is not available."); + return; + } + + if (typeof window.history[method] === 'undefined') { + console.error("Warning: window.history.".concat(method, " is not available")); + return; + } + } + + if (method !== 'pushState' || (0, _utils.getURL)() !== as) { + this._shallow = options.shallow; + window.history[method]({ + url: url, + as: as, + options: options, + __N: true, + idx: this._idx = method !== 'pushState' ? this._idx : this._idx + 1 + }, // Most browsers currently ignores this parameter, although they may use it in the future. + // Passing the empty string here should be safe against future changes to the method. + // https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState + '', as); + } + } + }, { + key: "handleRouteInfoError", + value: function () { + var _handleRouteInfoError = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(err, pathname, query, as, routeProps, loadErrorFail) { + var Component, styleSheets, props, _yield$this$fetchComp, routeInfo; + + return _regeneratorRuntime.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!err.cancelled) { + _context2.next = 2; + break; + } + + throw err; + + case 2: + if (!((0, _routeLoader.isAssetError)(err) || loadErrorFail)) { + _context2.next = 6; + break; + } + + Router.events.emit('routeChangeError', err, as, routeProps); // If we can't load the page it could be one of following reasons + // 1. Page doesn't exists + // 2. Page does exist in a different zone + // 3. Internal error while loading the page + // So, doing a hard reload is the proper way to deal with this. + + window.location.href = as; // Changing the URL doesn't block executing the current code path. + // So let's throw a cancellation error stop the routing logic. + + throw buildCancellationError(); + + case 6: + _context2.prev = 6; + + if (!(typeof Component === 'undefined' || typeof styleSheets === 'undefined')) { + _context2.next = 14; + break; + } + + ; + _context2.next = 11; + return this.fetchComponent('/_error'); + + case 11: + _yield$this$fetchComp = _context2.sent; + Component = _yield$this$fetchComp.page; + styleSheets = _yield$this$fetchComp.styleSheets; + + case 14: + routeInfo = { + props: props, + Component: Component, + styleSheets: styleSheets, + err: err, + error: err + }; + + if (routeInfo.props) { + _context2.next = 26; + break; + } + + _context2.prev = 16; + _context2.next = 19; + return this.getInitialProps(Component, { + err: err, + pathname: pathname, + query: query + }); + + case 19: + routeInfo.props = _context2.sent; + _context2.next = 26; + break; + + case 22: + _context2.prev = 22; + _context2.t0 = _context2["catch"](16); + console.error('Error in error page `getInitialProps`: ', _context2.t0); + routeInfo.props = {}; + + case 26: + return _context2.abrupt("return", routeInfo); + + case 29: + _context2.prev = 29; + _context2.t1 = _context2["catch"](6); + return _context2.abrupt("return", this.handleRouteInfoError(_context2.t1, pathname, query, as, routeProps, true)); + + case 32: + case "end": + return _context2.stop(); + } + } + }, _callee2, this, [[6, 29], [16, 22]]); + })); + + function handleRouteInfoError(_x6, _x7, _x8, _x9, _x10, _x11) { + return _handleRouteInfoError.apply(this, arguments); + } + + return handleRouteInfoError; + }() + }, { + key: "getRouteInfo", + value: function () { + var _getRouteInfo = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3(route, pathname, query, as, resolvedAs, routeProps) { + var _this2 = this; + + var existingRouteInfo, cachedRouteInfo, routeInfo, Component, __N_SSG, __N_SSP, _require, isValidElementType, dataHref, props; + + return _regeneratorRuntime.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.prev = 0; + existingRouteInfo = this.components[route]; + + if (!(routeProps.shallow && existingRouteInfo && this.route === route)) { + _context3.next = 4; + break; + } + + return _context3.abrupt("return", existingRouteInfo); + + case 4: + cachedRouteInfo = existingRouteInfo && 'initial' in existingRouteInfo ? undefined : existingRouteInfo; + + if (!cachedRouteInfo) { + _context3.next = 9; + break; + } + + _context3.t0 = cachedRouteInfo; + _context3.next = 12; + break; + + case 9: + _context3.next = 11; + return this.fetchComponent(route).then(function (res) { + return { + Component: res.page, + styleSheets: res.styleSheets, + __N_SSG: res.mod.__N_SSG, + __N_SSP: res.mod.__N_SSP + }; + }); + + case 11: + _context3.t0 = _context3.sent; + + case 12: + routeInfo = _context3.t0; + Component = routeInfo.Component, __N_SSG = routeInfo.__N_SSG, __N_SSP = routeInfo.__N_SSP; + + if (false) {} + + _require = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"), isValidElementType = _require.isValidElementType; + + if (isValidElementType(Component)) { + _context3.next = 18; + break; + } + + throw new Error("The default export is not a React Component in page: \"".concat(pathname, "\"")); + + case 18: + if (__N_SSG || __N_SSP) { + dataHref = this.pageLoader.getDataHref((0, _utils.formatWithValidation)({ + pathname: pathname, + query: query + }), resolvedAs, __N_SSG, this.locale); + } + + _context3.next = 21; + return this._getData(function () { + return __N_SSG ? _this2._getStaticData(dataHref) : __N_SSP ? _this2._getServerData(dataHref) : _this2.getInitialProps(Component, // we provide AppTree later so this needs to be `any` + { + pathname: pathname, + query: query, + asPath: as + }); + }); + + case 21: + props = _context3.sent; + routeInfo.props = props; + this.components[route] = routeInfo; + return _context3.abrupt("return", routeInfo); + + case 27: + _context3.prev = 27; + _context3.t1 = _context3["catch"](0); + return _context3.abrupt("return", this.handleRouteInfoError(_context3.t1, pathname, query, as, routeProps)); + + case 30: + case "end": + return _context3.stop(); + } + } + }, _callee3, this, [[0, 27]]); + })); + + function getRouteInfo(_x12, _x13, _x14, _x15, _x16, _x17) { + return _getRouteInfo.apply(this, arguments); + } + + return getRouteInfo; + }() + }, { + key: "set", + value: function set(route, pathname, query, as, data, resetScroll) { + this.isFallback = false; + this.route = route; + this.pathname = pathname; + this.query = query; + this.asPath = as; + return this.notify(data, resetScroll); + } + /** + * Callback to execute before replacing router state + * @param cb callback to be executed + */ + + }, { + key: "beforePopState", + value: function beforePopState(cb) { + this._bps = cb; + } + }, { + key: "onlyAHashChange", + value: function onlyAHashChange(as) { + if (!this.asPath) return false; + + var _this$asPath$split = this.asPath.split('#'), + _this$asPath$split2 = _slicedToArray(_this$asPath$split, 2), + oldUrlNoHash = _this$asPath$split2[0], + oldHash = _this$asPath$split2[1]; + + var _as$split = as.split('#'), + _as$split2 = _slicedToArray(_as$split, 2), + newUrlNoHash = _as$split2[0], + newHash = _as$split2[1]; // Makes sure we scroll to the provided hash if the url/hash are the same + + + if (newHash && oldUrlNoHash === newUrlNoHash && oldHash === newHash) { + return true; + } // If the urls are change, there's more than a hash change + + + if (oldUrlNoHash !== newUrlNoHash) { + return false; + } // If the hash has changed, then it's a hash only change. + // This check is necessary to handle both the enter and + // leave hash === '' cases. The identity case falls through + // and is treated as a next reload. + + + return oldHash !== newHash; + } + }, { + key: "scrollToHash", + value: function scrollToHash(as) { + var _as$split3 = as.split('#'), + _as$split4 = _slicedToArray(_as$split3, 2), + hash = _as$split4[1]; // Scroll to top if the hash is just `#` with no value or `#top` + // To mirror browsers + + + if (hash === '' || hash === 'top') { + window.scrollTo(0, 0); + return; + } // First we check if the element by id is found + + + var idEl = document.getElementById(hash); + + if (idEl) { + idEl.scrollIntoView(); + return; + } // If there's no element with the id, we check the `name` property + // To mirror browsers + + + var nameEl = document.getElementsByName(hash)[0]; + + if (nameEl) { + nameEl.scrollIntoView(); + } + } + }, { + key: "urlIsNew", + value: function urlIsNew(asPath) { + return this.asPath !== asPath; + } + /** + * Prefetch page code, you may wait for the data during page rendering. + * This feature only works in production! + * @param url the href of prefetched page + * @param asPath the as path of the prefetched page + */ + + }, { + key: "prefetch", + value: function () { + var _prefetch = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(url) { + var _this3 = this; + + var asPath, + options, + parsed, + pathname, + parsedAs, + localePathResult, + pages, + resolvedAs, + rewrites, + _yield2, + rewritesResult, + route, + _args4 = arguments; + + return _regeneratorRuntime.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + asPath = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : url; + options = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : {}; + parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url); + pathname = parsed.pathname; + + if (false) {} + + _context4.next = 7; + return this.pageLoader.getPageList(); + + case 7: + pages = _context4.sent; + resolvedAs = asPath; + + if (true) { + _context4.next = 19; + break; + } + + _context4.next = 12; + return (0, _routeLoader.getClientBuildManifest)(); + + case 12: + _yield2 = _context4.sent; + rewrites = _yield2.__rewrites; + rewritesResult = (0, _resolveRewrites["default"])(addBasePath(addLocale(asPath, this.locale)), pages, rewrites, parsed.query, function (p) { + return resolveDynamicRoute(p, pages); + }, this.locales); + resolvedAs = delLocale(delBasePath(rewritesResult.asPath), this.locale); + + if (rewritesResult.matchedPage && rewritesResult.resolvedHref) { + // if this directly matches a page we need to update the href to + // allow the correct page chunk to be loaded + pathname = rewritesResult.resolvedHref; + parsed.pathname = pathname; + url = (0, _utils.formatWithValidation)(parsed); + } + + _context4.next = 21; + break; + + case 19: + parsed.pathname = resolveDynamicRoute(parsed.pathname, pages); + + if (parsed.pathname !== pathname) { + pathname = parsed.pathname; + url = (0, _utils.formatWithValidation)(parsed); + } + + case 21: + route = (0, _normalizeTrailingSlash.removePathTrailingSlash)(pathname); // Prefetch is not supported in development mode because it would trigger on-demand-entries + + if (false) {} + + return _context4.abrupt("return"); + + case 24: + _context4.next = 26; + return Promise.all([this.pageLoader._isSsg(route).then(function (isSsg) { + return isSsg ? _this3._getStaticData(_this3.pageLoader.getDataHref(url, resolvedAs, true, typeof options.locale !== 'undefined' ? options.locale : _this3.locale)) : false; + }), this.pageLoader[options.priority ? 'loadPage' : 'prefetch'](route)]); + + case 26: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function prefetch(_x18) { + return _prefetch.apply(this, arguments); + } + + return prefetch; + }() + }, { + key: "fetchComponent", + value: function () { + var _fetchComponent = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5(route) { + var cancelled, cancel, componentResult, error; + return _regeneratorRuntime.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + cancelled = false; + + cancel = this.clc = function () { + cancelled = true; + }; + + _context5.next = 4; + return this.pageLoader.loadPage(route); + + case 4: + componentResult = _context5.sent; + + if (!cancelled) { + _context5.next = 9; + break; + } + + error = new Error("Abort fetching component for route: \"".concat(route, "\"")); + error.cancelled = true; + throw error; + + case 9: + if (cancel === this.clc) { + this.clc = null; + } + + return _context5.abrupt("return", componentResult); + + case 11: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function fetchComponent(_x19) { + return _fetchComponent.apply(this, arguments); + } + + return fetchComponent; + }() + }, { + key: "_getData", + value: function _getData(fn) { + var _this4 = this; + + var cancelled = false; + + var cancel = function cancel() { + cancelled = true; + }; + + this.clc = cancel; + return fn().then(function (data) { + if (cancel === _this4.clc) { + _this4.clc = null; + } + + if (cancelled) { + var err = new Error('Loading initial props cancelled'); + err.cancelled = true; + throw err; + } + + return data; + }); + } + }, { + key: "_getStaticData", + value: function _getStaticData(dataHref) { + var _this5 = this; + + var _URL = new URL(dataHref, window.location.href), + cacheKey = _URL.href; + + if (false) {} + + return fetchNextData(dataHref, this.isSsr).then(function (data) { + _this5.sdc[cacheKey] = data; + return data; + }); + } + }, { + key: "_getServerData", + value: function _getServerData(dataHref) { + var _this6 = this; + + var _URL2 = new URL(dataHref, window.location.href), + resourceKey = _URL2.href; + + if (this.sdr[resourceKey]) { + return this.sdr[resourceKey]; + } + + return this.sdr[resourceKey] = fetchNextData(dataHref, this.isSsr).then(function (data) { + delete _this6.sdr[resourceKey]; + return data; + })["catch"](function (err) { + delete _this6.sdr[resourceKey]; + throw err; + }); + } + }, { + key: "getInitialProps", + value: function getInitialProps(Component, ctx) { + var App = this.components['/_app'].Component; + + var AppTree = this._wrapApp(App); + + ctx.AppTree = AppTree; + return (0, _utils.loadGetInitialProps)(App, { + AppTree: AppTree, + Component: Component, + router: this, + ctx: ctx + }); + } + }, { + key: "abortComponentLoad", + value: function abortComponentLoad(as, routeProps) { + if (this.clc) { + Router.events.emit('routeChangeError', buildCancellationError(), as, routeProps); + this.clc(); + this.clc = null; + } + } + }, { + key: "notify", + value: function notify(data, resetScroll) { + return this.sub(data, this.components['/_app'].Component, resetScroll); + } + }]); + + return Router; +}(); + +exports["default"] = Router; +Router.events = (0, _mitt["default"])(); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/format-url.js": +/*!***************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/format-url.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.formatUrl = formatUrl; + +var querystring = _interopRequireWildcard(__webpack_require__(/*! ./querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js")); + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || typeof obj !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} // Format function modified from nodejs +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + + +var slashedProtocols = /https?|ftp|gopher|file/; + +function formatUrl(urlObj) { + var auth = urlObj.auth, + hostname = urlObj.hostname; + var protocol = urlObj.protocol || ''; + var pathname = urlObj.pathname || ''; + var hash = urlObj.hash || ''; + var query = urlObj.query || ''; + var host = false; + auth = auth ? encodeURIComponent(auth).replace(/%3A/i, ':') + '@' : ''; + + if (urlObj.host) { + host = auth + urlObj.host; + } else if (hostname) { + host = auth + (~hostname.indexOf(':') ? "[".concat(hostname, "]") : hostname); + + if (urlObj.port) { + host += ':' + urlObj.port; + } + } + + if (query && typeof query === 'object') { + query = String(querystring.urlQueryToSearchParams(query)); + } + + var search = urlObj.search || query && "?".concat(query) || ''; + if (protocol && protocol.substr(-1) !== ':') protocol += ':'; + + if (urlObj.slashes || (!protocol || slashedProtocols.test(protocol)) && host !== false) { + host = '//' + (host || ''); + if (pathname && pathname[0] !== '/') pathname = '/' + pathname; + } else if (!host) { + host = ''; + } + + if (hash && hash[0] !== '#') hash = '#' + hash; + if (search && search[0] !== '?') search = '?' + search; + pathname = pathname.replace(/[?#]/g, encodeURIComponent); + search = search.replace('#', '%23'); + return "".concat(protocol).concat(host).concat(pathname).concat(search).concat(hash); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/get-asset-path-from-route.js ***! + \******************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = getAssetPathFromRoute; // Translates a logical route into its pages asset path (relative from a common prefix) +// "asset path" being its javascript file, data file, prerendered html,... + +function getAssetPathFromRoute(route) { + var ext = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var path = route === '/' ? '/index' : /^\/index(\/|$)/.test(route) ? "/index".concat(route) : "".concat(route); + return path + ext; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js": +/*!***************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/is-dynamic.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.isDynamicRoute = isDynamicRoute; // Identify /[param]/ in route string + +var TEST_ROUTE = /\/\[[^/]+?\](?=\/|$)/; + +function isDynamicRoute(route) { + return TEST_ROUTE.test(route); +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/parse-relative-url.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.parseRelativeUrl = parseRelativeUrl; + +var _utils = __webpack_require__(/*! ../../utils */ "./node_modules/next/dist/next-server/lib/utils.js"); + +var _querystring = __webpack_require__(/*! ./querystring */ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js"); +/** +* Parses path-relative urls (e.g. `/hello/world?foo=bar`). If url isn't path-relative +* (e.g. `./hello`) then at least base must be. +* Absolute urls are rejected with one exception, in the browser, absolute urls that are on +* the current origin will be parsed as relative +*/ + + +function parseRelativeUrl(url, base) { + var globalBase = new URL(false ? undefined : (0, _utils.getLocationOrigin)()); + var resolvedBase = base ? new URL(base, globalBase) : globalBase; + + var _URL = new URL(url, resolvedBase), + pathname = _URL.pathname, + searchParams = _URL.searchParams, + search = _URL.search, + hash = _URL.hash, + href = _URL.href, + origin = _URL.origin; + + if (origin !== globalBase.origin) { + throw new Error("invariant: invalid relative URL, router received ".concat(url)); + } + + return { + pathname: pathname, + query: (0, _querystring.searchParamsToUrlQuery)(searchParams), + search: search, + hash: hash, + href: href.slice(globalBase.origin.length) + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/querystring.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/querystring.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _slicedToArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/slicedToArray */ "./node_modules/@babel/runtime/helpers/slicedToArray.js"); + +exports.__esModule = true; +exports.searchParamsToUrlQuery = searchParamsToUrlQuery; +exports.urlQueryToSearchParams = urlQueryToSearchParams; +exports.assign = assign; + +function searchParamsToUrlQuery(searchParams) { + var query = {}; + searchParams.forEach(function (value, key) { + if (typeof query[key] === 'undefined') { + query[key] = value; + } else if (Array.isArray(query[key])) { + ; + query[key].push(value); + } else { + query[key] = [query[key], value]; + } + }); + return query; +} + +function stringifyUrlQueryParam(param) { + if (typeof param === 'string' || typeof param === 'number' && !isNaN(param) || typeof param === 'boolean') { + return String(param); + } else { + return ''; + } +} + +function urlQueryToSearchParams(urlQuery) { + var result = new URLSearchParams(); + Object.entries(urlQuery).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + key = _ref2[0], + value = _ref2[1]; + + if (Array.isArray(value)) { + value.forEach(function (item) { + return result.append(key, stringifyUrlQueryParam(item)); + }); + } else { + result.set(key, stringifyUrlQueryParam(value)); + } + }); + return result; +} + +function assign(target) { + for (var _len = arguments.length, searchParamsList = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + searchParamsList[_key - 1] = arguments[_key]; + } + + searchParamsList.forEach(function (searchParams) { + Array.from(searchParams.keys()).forEach(function (key) { + return target["delete"](key); + }); + searchParams.forEach(function (value, key) { + return target.append(key, value); + }); + }); + return target; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/resolve-rewrites-noop.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/resolve-rewrites-noop.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports["default"] = resolveRewrites; + +function resolveRewrites() {} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/route-matcher.js": +/*!******************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/route-matcher.js ***! + \******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.getRouteMatcher = getRouteMatcher; + +function getRouteMatcher(routeRegex) { + var re = routeRegex.re, + groups = routeRegex.groups; + return function (pathname) { + var routeMatch = re.exec(pathname); + + if (!routeMatch) { + return false; + } + + var decode = function decode(param) { + try { + return decodeURIComponent(param); + } catch (_) { + var err = new Error('failed to decode param'); + err.code = 'DECODE_FAILED'; + throw err; + } + }; + + var params = {}; + Object.keys(groups).forEach(function (slugName) { + var g = groups[slugName]; + var m = routeMatch[g.pos]; + + if (m !== undefined) { + params[slugName] = ~m.indexOf('/') ? m.split('/').map(function (entry) { + return decode(entry); + }) : g.repeat ? [decode(m)] : decode(m); + } + }); + return params; + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/router/utils/route-regex.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/router/utils/route-regex.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.getRouteRegex = getRouteRegex; // this isn't importing the escape-string-regex module +// to reduce bytes + +function escapeRegex(str) { + return str.replace(/[|\\{}()[\]^$+*?.-]/g, '\\$&'); +} + +function parseParameter(param) { + var optional = param.startsWith('[') && param.endsWith(']'); + + if (optional) { + param = param.slice(1, -1); + } + + var repeat = param.startsWith('...'); + + if (repeat) { + param = param.slice(3); + } + + return { + key: param, + repeat: repeat, + optional: optional + }; +} + +function getRouteRegex(normalizedRoute) { + var segments = (normalizedRoute.replace(/\/$/, '') || '/').slice(1).split('/'); + var groups = {}; + var groupIndex = 1; + var parameterizedRoute = segments.map(function (segment) { + if (segment.startsWith('[') && segment.endsWith(']')) { + var _parseParameter = parseParameter(segment.slice(1, -1)), + key = _parseParameter.key, + optional = _parseParameter.optional, + repeat = _parseParameter.repeat; + + groups[key] = { + pos: groupIndex++, + repeat: repeat, + optional: optional + }; + return repeat ? optional ? '(?:/(.+?))?' : '/(.+?)' : '/([^/]+?)'; + } else { + return "/".concat(escapeRegex(segment)); + } + }).join(''); // dead code eliminate for browser since it's only needed + // while generating routes-manifest + + if (false) { var namedParameterizedRoute, routeKeys, getSafeRouteKey, routeKeyCharLength, routeKeyCharCode; } + + return { + re: new RegExp("^".concat(parameterizedRoute, "(?:/)?$")), + groups: groups + }; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/side-effect.js": +/*!***************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/side-effect.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _toConsumableArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/toConsumableArray.js"); + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _assertThisInitialized = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); + +var _inherits = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); + +var _possibleConstructorReturn = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); + +var _getPrototypeOf = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +exports.__esModule = true; +exports["default"] = void 0; + +var _react = __webpack_require__(/*! react */ "./node_modules/react/index.js"); + +var isServer = false; + +var _default = /*#__PURE__*/function (_react$Component) { + _inherits(_default, _react$Component); + + var _super = _createSuper(_default); + + function _default(props) { + var _this; + + _classCallCheck(this, _default); + + _this = _super.call(this, props); + _this._hasHeadManager = void 0; + + _this.emitChange = function () { + if (_this._hasHeadManager) { + _this.props.headManager.updateHead(_this.props.reduceComponentsToState(_toConsumableArray(_this.props.headManager.mountedInstances), _this.props)); + } + }; + + _this._hasHeadManager = _this.props.headManager && _this.props.headManager.mountedInstances; + + if (isServer && _this._hasHeadManager) { + _this.props.headManager.mountedInstances.add(_assertThisInitialized(_this)); + + _this.emitChange(); + } + + return _this; + } + + _createClass(_default, [{ + key: "componentDidMount", + value: function componentDidMount() { + if (this._hasHeadManager) { + this.props.headManager.mountedInstances.add(this); + } + + this.emitChange(); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate() { + this.emitChange(); + } + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + if (this._hasHeadManager) { + this.props.headManager.mountedInstances["delete"](this); + } + + this.emitChange(); + } + }, { + key: "render", + value: function render() { + return null; + } + }]); + + return _default; +}(_react.Component); + +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/utils.js": +/*!*********************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/utils.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _regeneratorRuntime = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); + +var _asyncToGenerator = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/asyncToGenerator.js"); + +exports.__esModule = true; +exports.execOnce = execOnce; +exports.getLocationOrigin = getLocationOrigin; +exports.getURL = getURL; +exports.getDisplayName = getDisplayName; +exports.isResSent = isResSent; +exports.loadGetInitialProps = loadGetInitialProps; +exports.formatWithValidation = formatWithValidation; +exports.ST = exports.SP = exports.urlObjectKeys = void 0; + +var _formatUrl = __webpack_require__(/*! ./router/utils/format-url */ "./node_modules/next/dist/next-server/lib/router/utils/format-url.js"); +/** +* Utils +*/ + + +function execOnce(fn) { + var used = false; + var result; + return function () { + if (!used) { + used = true; + result = fn.apply(void 0, arguments); + } + + return result; + }; +} + +function getLocationOrigin() { + var _window$location = window.location, + protocol = _window$location.protocol, + hostname = _window$location.hostname, + port = _window$location.port; + return "".concat(protocol, "//").concat(hostname).concat(port ? ':' + port : ''); +} + +function getURL() { + var href = window.location.href; + var origin = getLocationOrigin(); + return href.substring(origin.length); +} + +function getDisplayName(Component) { + return typeof Component === 'string' ? Component : Component.displayName || Component.name || 'Unknown'; +} + +function isResSent(res) { + return res.finished || res.headersSent; +} + +function loadGetInitialProps(_x, _x2) { + return _loadGetInitialProps.apply(this, arguments); +} + +function _loadGetInitialProps() { + _loadGetInitialProps = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(App, ctx) { + var _App$prototype, message, res, props, _message; + + return _regeneratorRuntime.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (false) {} + + if (!((_App$prototype = App.prototype) != null && _App$prototype.getInitialProps)) { + _context.next = 4; + break; + } + + message = "\"".concat(getDisplayName(App), ".getInitialProps()\" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information."); + throw new Error(message); + + case 4: + // when called from _app `ctx` is nested in `ctx` + res = ctx.res || ctx.ctx && ctx.ctx.res; + + if (App.getInitialProps) { + _context.next = 12; + break; + } + + if (!(ctx.ctx && ctx.Component)) { + _context.next = 11; + break; + } + + _context.next = 9; + return loadGetInitialProps(ctx.Component, ctx.ctx); + + case 9: + _context.t0 = _context.sent; + return _context.abrupt("return", { + pageProps: _context.t0 + }); + + case 11: + return _context.abrupt("return", {}); + + case 12: + _context.next = 14; + return App.getInitialProps(ctx); + + case 14: + props = _context.sent; + + if (!(res && isResSent(res))) { + _context.next = 17; + break; + } + + return _context.abrupt("return", props); + + case 17: + if (props) { + _context.next = 20; + break; + } + + _message = "\"".concat(getDisplayName(App), ".getInitialProps()\" should resolve to an object. But found \"").concat(props, "\" instead."); + throw new Error(_message); + + case 20: + if (true) { + if (Object.keys(props).length === 0 && !ctx.ctx) { + console.warn("".concat(getDisplayName(App), " returned an empty object from `getInitialProps`. This de-optimizes and prevents automatic static optimization. https://nextjs.org/docs/messages/empty-object-getInitialProps")); + } + } + + return _context.abrupt("return", props); + + case 22: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + return _loadGetInitialProps.apply(this, arguments); +} + +var urlObjectKeys = ['auth', 'hash', 'host', 'hostname', 'href', 'path', 'pathname', 'port', 'protocol', 'query', 'search', 'slashes']; +exports.urlObjectKeys = urlObjectKeys; + +function formatWithValidation(url) { + if (true) { + if (url !== null && typeof url === 'object') { + Object.keys(url).forEach(function (key) { + if (urlObjectKeys.indexOf(key) === -1) { + console.warn("Unknown key passed via urlObject into url.format: ".concat(key)); + } + }); + } + } + + return (0, _formatUrl.formatUrl)(url); +} + +var SP = typeof performance !== 'undefined'; +exports.SP = SP; +var ST = SP && typeof performance.mark === 'function' && typeof performance.measure === 'function'; +exports.ST = ST; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/server/denormalize-page-path.js": +/*!****************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/server/denormalize-page-path.js ***! + \****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +exports.__esModule=true;exports.normalizePathSep=normalizePathSep;exports.denormalizePagePath=denormalizePagePath;function normalizePathSep(path){return path.replace(/\\/g,'/');}function denormalizePagePath(page){page=normalizePathSep(page);if(page.startsWith('/index/')){page=page.slice(6);}else if(page==='/index'){page='/';}return page;} +//# sourceMappingURL=denormalize-page-path.js.map + +/***/ }), + +/***/ "./node_modules/next/head.js": +/*!***********************************!*\ + !*** ./node_modules/next/head.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! ./dist/next-server/lib/head */ "./node_modules/next/dist/next-server/lib/head.js") + + +/***/ }), + +/***/ "./node_modules/react-is/cjs/react-is.development.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-is/cjs/react-is.development.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + + + +if (true) { + (function() { +'use strict'; + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary +// (unstable) APIs that have been removed. Can we remove the symbols? + +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; +var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; +var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; +var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; +var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} // AsyncMode is deprecated along with isAsyncMode + +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} + +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react-is/index.js": +/*!****************************************!*\ + !*** ./node_modules/react-is/index.js ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-is/cjs/react-is.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react/cjs/react-jsx-dev-runtime.development.js": +/*!*********************************************************************!*\ + !*** ./node_modules/react/cjs/react-jsx-dev-runtime.development.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react-jsx-dev-runtime.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var React = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +exports.Fragment = 0xeacb; +var REACT_STRICT_MODE_TYPE = 0xeacc; +var REACT_PROFILER_TYPE = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +var REACT_SUSPENSE_TYPE = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + exports.Fragment = symbolFor('react.fragment'); + REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); + REACT_PROFILER_TYPE = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableScopeAPI = false; // Experimental Create Event Handle API. + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { + return true; + } + } + + return false; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case exports.Fragment: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown; +var specialPropRefWarningShown; +var didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function warnIfStringRefCannotBeAutoConverted(config, self) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} + +function defineKeyPropWarningGetter(props, displayName) { + { + var warnAboutAccessingKey = function () { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); + } +} + +function defineRefPropWarningGetter(props, displayName) { + { + var warnAboutAccessingRef = function () { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * https://github.com/reactjs/rfcs/pull/107 + * @param {*} type + * @param {object} props + * @param {string} key + */ + +function jsxDEV(type, config, maybeKey, source, self) { + { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; // Currently, key can be spread in as a prop. This causes a potential + // issue if key is also explicitly declared (ie. <div {...props} key="Hi" /> + // or <div key="Hi" {...props} /> ). We want to deprecate key spread, + // but as an intermediary step, we will use jsxDEV for everything except + // <div {...props} key="Hi" />, because we aren't currently able to tell if + // key is explicitly declared to be undefined or not. + + if (maybeKey !== undefined) { + key = '' + maybeKey; + } + + if (hasValidKey(config)) { + key = '' + config.key; + } + + if (hasValidRef(config)) { + ref = config.ref; + warnIfStringRefCannotBeAutoConverted(config, self); + } // Remaining properties are added to a new props object + + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } +} + +var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } +} + +function getDeclarationErrorAddendum() { + { + if (ReactCurrentOwner$1.current) { + var name = getComponentName(ReactCurrentOwner$1.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; + } +} + +function getSourceInfoErrorAddendum(source) { + { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; + } +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; + } +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + } + + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + { + if (typeof node !== 'object') { + return; + } + + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentName(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentName(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} + +function jsxWithValidation(type, props, key, isStaticChildren, source, self) { + { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendum(source); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + + var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + var children = props.children; + + if (children !== undefined) { + if (isStaticChildren) { + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + validateChildKeys(children[i], type); + } + + if (Object.freeze) { + Object.freeze(children); + } + } else { + error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); + } + } else { + validateChildKeys(children, type); + } + } + } + + if (type === exports.Fragment) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; + } +} // These two functions exist to still get child warnings in dev + +var jsxDEV$1 = jsxWithValidation ; + +exports.jsxDEV = jsxDEV$1; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react/cjs/react.development.js": +/*!*****************************************************!*\ + !*** ./node_modules/react/cjs/react.development.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +// TODO: this is special because it gets imported during build. +var ReactVersion = '17.0.2'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +exports.Fragment = 0xeacb; +exports.StrictMode = 0xeacc; +exports.Profiler = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +exports.Suspense = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + exports.Fragment = symbolFor('react.fragment'); + exports.StrictMode = symbolFor('react.strict_mode'); + exports.Profiler = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + exports.Suspense = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +/** + * Keeps track of the current dispatcher. + */ +var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +/** + * Keeps track of the current batch's configuration such as how long an update + * should suspend for if it needs to. + */ +var ReactCurrentBatchConfig = { + transition: 0 +}; + +/** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ +var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +var ReactDebugCurrentFrame = {}; +var currentExtraStackFrame = null; +function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } +} + +{ + ReactDebugCurrentFrame.setExtraStackFrame = function (stack) { + { + currentExtraStackFrame = stack; + } + }; // Stack implementation injected by the current renderer. + + + ReactDebugCurrentFrame.getCurrentStack = null; + + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ''; // Add an extra top frame while an element is being validated + + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } // Delegate to the injected renderer-specific implementation + + + var impl = ReactDebugCurrentFrame.getCurrentStack; + + if (impl) { + stack += impl() || ''; + } + + return stack; + }; +} + +/** + * Used by act() to track whether you're inside an act() scope. + */ +var IsSomeRendererActing = { + current: false +}; + +var ReactSharedInternals = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentBatchConfig: ReactCurrentBatchConfig, + ReactCurrentOwner: ReactCurrentOwner, + IsSomeRendererActing: IsSomeRendererActing, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign: _assign +}; + +{ + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; +} + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } +} +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +var didWarnStateUpdateForUnmountedComponent = {}; + +function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; + + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); + + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } +} +/** + * This is the abstract API for an update queue. + */ + + +var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); + } +}; + +var emptyObject = {}; + +{ + Object.freeze(emptyObject); +} +/** + * Base class helpers for the updating state of a component. + */ + + +function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. + + this.updater = updater || ReactNoopUpdateQueue; +} + +Component.prototype.isReactComponent = {}; +/** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + +Component.prototype.setState = function (partialState, callback) { + if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { + { + throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." ); + } + } + + this.updater.enqueueSetState(this, partialState, callback, 'setState'); +}; +/** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + + +Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); +}; +/** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + + +{ + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; + + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); + + return undefined; + } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } +} + +function ComponentDummy() {} + +ComponentDummy.prototype = Component.prototype; +/** + * Convenience component with default shallow equality check for sCU. + */ + +function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; +} + +var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); +pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. + +_assign(pureComponentPrototype, Component.prototype); + +pureComponentPrototype.isPureReactComponent = true; + +// an immutable object with a single mutable value +function createRef() { + var refObject = { + current: null + }; + + { + Object.seal(refObject); + } + + return refObject; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case exports.Fragment: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case exports.Profiler: + return 'Profiler'; + + case exports.StrictMode: + return 'StrictMode'; + + case exports.Suspense: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); +} + +function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); +} + +function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ + +function createElement(type, config, children) { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + + if (hasValidKey(config)) { + key = '' + config.key; + } + + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + + props.children = childArray; + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); +} +function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; +} +/** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ + +function cloneElement(element, config, children) { + if (!!(element === null || element === undefined)) { + { + throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." ); + } + } + + var propName; // Original props are copied + + var props = _assign({}, element.props); // Reserved names are extracted + + + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. + + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + + var source = element._source; // Owner will be preserved, unless ref is overridden + + var owner = element._owner; + + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + + if (hasValidKey(config)) { + key = '' + config.key; + } // Remaining properties override existing props + + + var defaultProps; + + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} + +var SEPARATOR = '.'; +var SUBSEPARATOR = ':'; +/** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ + +function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; +} +/** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + +var didWarnAboutMaps = false; +var userProvidedKeyEscapeRegex = /\/+/g; + +function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, '$&/'); +} +/** + * Generate a key string that identifies a element within a set. + * + * @param {*} element A element that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + + +function getElementKey(element, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof element === 'object' && element !== null && element.key != null) { + // Explicit key + return escape('' + element.key); + } // Implicit key determined by the index in the set + + + return index.toString(36); +} + +function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + var invokeCallback = false; + + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; + + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + + } + } + + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows: + + var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + + if (Array.isArray(mappedChild)) { + var escapedChildKey = ''; + + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + '/'; + } + + mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); + } + + array.push(mappedChild); + } + + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var iterableChildren = children; + + { + // Warn about using Maps as children + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } + + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === 'object') { + var childrenString = '' + children; + + { + { + throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). If you meant to render a collection of children, use an array instead." ); + } + } + } + } + + return subtreeCount; +} + +/** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ +function mapChildren(children, func, context) { + if (children == null) { + return children; + } + + var result = []; + var count = 0; + mapIntoArray(children, result, '', '', function (child) { + return func.call(context, child, count++); + }); + return result; +} +/** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + + +function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; // Don't return anything + }); + return n; +} + +/** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ +function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function () { + forEachFunc.apply(this, arguments); // Don't return anything. + }, forEachContext); +} +/** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ + + +function toArray(children) { + return mapChildren(children, function (child) { + return child; + }) || []; +} +/** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ + + +function onlyChild(children) { + if (!isValidElement(children)) { + { + throw Error( "React.Children.only expected to receive a single React element child." ); + } + } + + return children; +} + +function createContext(defaultValue, calculateChangedBits) { + if (calculateChangedBits === undefined) { + calculateChangedBits = null; + } else { + { + if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') { + error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits); + } + } + } + + var context = { + $$typeof: REACT_CONTEXT_TYPE, + _calculateChangedBits: calculateChangedBits, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context, + _calculateChangedBits: context._calculateChangedBits + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + + error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } + + return context.Consumer; + } + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); + + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + + context.Consumer = Consumer; + } + + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + + return context; +} + +var Uninitialized = -1; +var Pending = 0; +var Resolved = 1; +var Rejected = 2; + +function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); // Transition to the next state. + + var pending = payload; + pending._status = Pending; + pending._result = thenable; + thenable.then(function (moduleObject) { + if (payload._status === Pending) { + var defaultExport = moduleObject.default; + + { + if (defaultExport === undefined) { + error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); + } + } // Transition to the next state. + + + var resolved = payload; + resolved._status = Resolved; + resolved._result = defaultExport; + } + }, function (error) { + if (payload._status === Pending) { + // Transition to the next state. + var rejected = payload; + rejected._status = Rejected; + rejected._result = error; + } + }); + } + + if (payload._status === Resolved) { + return payload._result; + } else { + throw payload._result; + } +} + +function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: -1, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + + { + // In production, this would just set it on the object. + var defaultProps; + var propTypes; // $FlowFixMe + + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); + } + } + }); + } + + return lazyType; +} + +function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); + } + } + + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); + } + } + } + + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (render.displayName == null) { + render.displayName = name; + } + } + }); + } + + return elementType; +} + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableScopeAPI = false; // Experimental Create Event Handle API. + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === exports.Fragment || type === exports.Profiler || type === REACT_DEBUG_TRACING_MODE_TYPE || type === exports.StrictMode || type === exports.Suspense || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { + return true; + } + } + + return false; +} + +function memo(type, compare) { + { + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } + } + + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (type.displayName == null) { + type.displayName = name; + } + } + }); + } + + return elementType; +} + +function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + + if (!(dispatcher !== null)) { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); + } + } + + return dispatcher; +} + +function useContext(Context, unstable_observedBits) { + var dispatcher = resolveDispatcher(); + + { + if (unstable_observedBits !== undefined) { + error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://reactjs.org/link/rules-of-hooks' : ''); + } // TODO: add a more generic warning for invalid values. + + + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. + + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); + } + } + } + + return dispatcher.useContext(Context, unstable_observedBits); +} +function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); +} +function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); +} +function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); +} +function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); +} +function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); +} +function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); +} +function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); +} +function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); +} +function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case exports.Suspense: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} + +function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentName(ReactCurrentOwner.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; +} + +function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; +} + +function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + + return ''; +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + } + + { + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentName(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentName(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} +function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } + + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === exports.Fragment) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; +} +var didWarnAboutDeprecatedCreateFactory = false; +function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it + + + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); + + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + + return validatedFactory; +} +function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + + validatePropTypes(newElement); + return newElement; +} + +{ + + try { + var frozenObject = Object.freeze({}); + /* eslint-disable no-new */ + + new Map([[frozenObject, null]]); + new Set([frozenObject]); + /* eslint-enable no-new */ + } catch (e) { + } +} + +var createElement$1 = createElementWithValidation ; +var cloneElement$1 = cloneElementWithValidation ; +var createFactory = createFactoryWithValidation ; +var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray: toArray, + only: onlyChild +}; + +exports.Children = Children; +exports.Component = Component; +exports.PureComponent = PureComponent; +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; +exports.cloneElement = cloneElement$1; +exports.createContext = createContext; +exports.createElement = createElement$1; +exports.createFactory = createFactory; +exports.createRef = createRef; +exports.forwardRef = forwardRef; +exports.isValidElement = isValidElement; +exports.lazy = lazy; +exports.memo = memo; +exports.useCallback = useCallback; +exports.useContext = useContext; +exports.useDebugValue = useDebugValue; +exports.useEffect = useEffect; +exports.useImperativeHandle = useImperativeHandle; +exports.useLayoutEffect = useLayoutEffect; +exports.useMemo = useMemo; +exports.useReducer = useReducer; +exports.useRef = useRef; +exports.useState = useState; +exports.version = ReactVersion; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react/index.js": +/*!*************************************!*\ + !*** ./node_modules/react/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react.development.js */ "./node_modules/react/cjs/react.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react/jsx-dev-runtime.js": +/*!***********************************************!*\ + !*** ./node_modules/react/jsx-dev-runtime.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-jsx-dev-runtime.development.js */ "./node_modules/react/cjs/react-jsx-dev-runtime.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/regenerator-runtime/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/regenerator-runtime/runtime.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var runtime = (function (exports) { + "use strict"; + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + function define(obj, key, value) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + return obj[key]; + } + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects. + define({}, ""); + } catch (err) { + define = function(obj, key, value) { + return obj[key] = value; + }; + } + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + exports.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = define( + GeneratorFunctionPrototype, + toStringTagSymbol, + "GeneratorFunction" + ); + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + define(prototype, method, function(arg) { + return this._invoke(method, arg); + }); + }); + } + + exports.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + exports.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + define(genFun, toStringTagSymbol, "GeneratorFunction"); + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + exports.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return PromiseImpl.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return PromiseImpl.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function(error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + exports.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { + if (PromiseImpl === void 0) PromiseImpl = Promise; + + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList), + PromiseImpl + ); + + return exports.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + define(Gp, toStringTagSymbol, "Generator"); + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + exports.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + exports.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; + + // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + return exports; + +}( + // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + true ? module.exports : undefined +)); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + Function("r", "regeneratorRuntime = r")(runtime); +} + + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/semantic.min.css": +/*!*******************************************************!*\ + !*** ./node_modules/semantic-ui-css/semantic.min.css ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var api = __webpack_require__(/*! ../next/dist/build/webpack/loaders/next-style-loader/runtime/injectStylesIntoStyleTag.js */ "./node_modules/next/dist/build/webpack/loaders/next-style-loader/runtime/injectStylesIntoStyleTag.js"); + var content = __webpack_require__(/*! !../next/dist/compiled/css-loader/cjs.js??ref--5-oneOf-5-1!../next/dist/compiled/postcss-loader/cjs.js??ref--5-oneOf-5-2!./semantic.min.css */ "./node_modules/next/dist/compiled/css-loader/cjs.js?!./node_modules/next/dist/compiled/postcss-loader/cjs.js?!./node_modules/semantic-ui-css/semantic.min.css"); + + content = content.__esModule ? content.default : content; + + if (typeof content === 'string') { + content = [[module.i, content, '']]; + } + +var options = {}; + +options.insert = function(element){// These elements should always exist. If they do not, +// this code should fail. +var anchorElement=document.querySelector('#__next_css__DO_NOT_USE__');var parentNode=anchorElement.parentNode;// Normally <head> +// Each style tag should be placed right before our +// anchor. By inserting before and not after, we do not +// need to track the last inserted element. +parentNode.insertBefore(element,anchorElement);}; +options.singleton = false; + +var update = api(content, options); + + +if (true) { + if (!content.locals || module.hot.invalidate) { + var isEqualLocals = function isEqualLocals(a,b,isNamedExport){if(!a&&b||a&&!b){return false;}let p;for(p in a){if(isNamedExport&&p==='default'){// eslint-disable-next-line no-continue +continue;}if(a[p]!==b[p]){return false;}}for(p in b){if(isNamedExport&&p==='default'){// eslint-disable-next-line no-continue +continue;}if(!a[p]){return false;}}return true;}; + var oldLocals = content.locals; + + module.hot.accept( + /*! !../next/dist/compiled/css-loader/cjs.js??ref--5-oneOf-5-1!../next/dist/compiled/postcss-loader/cjs.js??ref--5-oneOf-5-2!./semantic.min.css */ "./node_modules/next/dist/compiled/css-loader/cjs.js?!./node_modules/next/dist/compiled/postcss-loader/cjs.js?!./node_modules/semantic-ui-css/semantic.min.css", + function () { + content = __webpack_require__(/*! !../next/dist/compiled/css-loader/cjs.js??ref--5-oneOf-5-1!../next/dist/compiled/postcss-loader/cjs.js??ref--5-oneOf-5-2!./semantic.min.css */ "./node_modules/next/dist/compiled/css-loader/cjs.js?!./node_modules/next/dist/compiled/postcss-loader/cjs.js?!./node_modules/semantic-ui-css/semantic.min.css"); + + content = content.__esModule ? content.default : content; + + if (typeof content === 'string') { + content = [[module.i, content, '']]; + } + + if (!isEqualLocals(oldLocals, content.locals)) { + module.hot.invalidate(); + + return; + } + + oldLocals = content.locals; + + update(content); + } + ) + } + + module.hot.dispose(function() { + update(); + }); +} + +module.exports = content.locals || {}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.eot": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.eot ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/brand-icons.d68fa3e67dbb653a13cec44b1bcabcfe.eot"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.svg": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.svg ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/brand-icons.6729d29753e000c17489ed43135ba8d5.svg"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.ttf": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.ttf ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/brand-icons.65a2fb6d9aaa164b41a039302093995b.ttf"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.woff": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.woff ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/brand-icons.cac87dc00c87a5d74711d0276713808a.woff"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.woff2": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/brand-icons.woff2 ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/brand-icons.278156e41e0ad908cf7f841b17130502.woff2"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.eot": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.eot ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/icons.a01e3f2d6c83dc3aee175e2482b3f777.eot"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.svg": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.svg ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/icons.62d9dae4e0040e81c980950003df0e07.svg"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.ttf": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.ttf ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/icons.c656b8caa454ed19b9a2ef7f4f5b8fea.ttf"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.woff": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.woff ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/icons.425399f81e4ce7cbd967685402ba0260.woff"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.woff2": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/icons.woff2 ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/icons.38c6d8bab26db77d8c806813e1497763.woff2"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.eot": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.eot ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/outline-icons.752905fa5edf21fc52a10a0c1ca9c7a4.eot"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.svg": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.svg ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/outline-icons.9c4845b4b41ef40a22faee76144fa816.svg"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.ttf": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.ttf ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/outline-icons.5367103510b27b78482794590e1ce3b0.ttf"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.woff": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.woff ***! + \*************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/outline-icons.ddae9b1ba9b0b42f58809904b0b21349.woff"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.woff2": +/*!**************************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/fonts/outline-icons.woff2 ***! + \**************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/outline-icons.687a4990ea22bb1a49d469a5d9319790.woff2"); + +/***/ }), + +/***/ "./node_modules/semantic-ui-css/themes/default/assets/images/flags.png": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-css/themes/default/assets/images/flags.png ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony default export */ __webpack_exports__["default"] = (__webpack_require__.p + "static/media/flags.99f63ae7a743f21ab30847ed06a698d9.png"); + +/***/ }), + +/***/ "./src/pages/_app.tsx": +/*!****************************!*\ + !*** ./src/pages/_app.tsx ***! + \****************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/defineProperty */ "./node_modules/@babel/runtime/helpers/esm/defineProperty.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/head */ "./node_modules/next/head.js"); +/* harmony import */ var next_head__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(next_head__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_css_semantic_min_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-css/semantic.min.css */ "./node_modules/semantic-ui-css/semantic.min.css"); +/* harmony import */ var semantic_ui_css_semantic_min_css__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(semantic_ui_css_semantic_min_css__WEBPACK_IMPORTED_MODULE_4__); + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\_app.tsx"; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_1__["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + + + + + +function MyApp(_ref) { + var Component = _ref.Component, + pageProps = _ref.pageProps; + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["Fragment"], { + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(next_head__WEBPACK_IMPORTED_MODULE_3___default.a, { + children: /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("title", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 10, + columnNumber: 9 + }, this) + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 9, + columnNumber: 7 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(Component, _objectSpread({}, pageProps), void 0, false, { + fileName: _jsxFileName, + lineNumber: 12, + columnNumber: 7 + }, this)] + }, void 0, true); +} + +_c = MyApp; +/* harmony default export */ __webpack_exports__["default"] = (MyApp); + +var _c; + +$RefreshReg$(_c, "MyApp"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }), + +/***/ 0: +/*!********************************************************************************************************************************************!*\ + !*** multi next-client-pages-loader?page=%2F_app&absolutePagePath=private-next-pages%2F_app.tsx ./node_modules/next/dist/client/router.js ***! + \********************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +__webpack_require__(/*! next-client-pages-loader?page=%2F_app&absolutePagePath=private-next-pages%2F_app.tsx! */"./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F_app&absolutePagePath=private-next-pages%2F_app.tsx!./"); +module.exports = __webpack_require__(/*! G:\typescript-solidity-dev-starter-kit\node_modules\next\dist\client\router.js */"./node_modules/next/dist/client/router.js"); + + +/***/ }) + +},[[0,"webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlMaWtlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aG91dEhvbGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jb25zdHJ1Y3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9nZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheUxpbWl0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlU3ByZWFkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zZXRQcm90b3R5cGVPZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvc2xpY2VkVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdG9Db25zdW1hYmxlQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC9wb2x5ZmlsbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1jbGllbnQtcGFnZXMtbG9hZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LXN0eWxlLWxvYWRlci9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uL2NsaWVudC9ub3JtYWxpemUtdHJhaWxpbmctc2xhc2gudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvcmVxdWVzdC1pZGxlLWNhbGxiYWNrLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vY2xpZW50L3JvdXRlLWxvYWRlci50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uL2NsaWVudC9yb3V0ZXIudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvd2l0aC1yb3V0ZXIudHN4Iiwid2VicGFjazovL19OX0UvKHdlYnBhY2spL2Nzcy1sb2FkZXIvYXBpLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktY3NzL3NlbWFudGljLm1pbi5jc3MiLCJ3ZWJwYWNrOi8vX05fRS8od2VicGFjaykvY3NzLWxvYWRlci9nZXRVcmwuanMiLCJ3ZWJwYWNrOi8vX05fRS8od2VicGFjaykvd2VicGFjay9oYXJtb255LW1vZHVsZS5qcyIsIndlYnBhY2s6Ly9fTl9FLyh3ZWJwYWNrKS93ZWJwYWNrL21vZHVsZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9hbXAtY29udGV4dC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9hbXAudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvaGVhZC1tYW5hZ2VyLWNvbnRleHQudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvaGVhZC50c3giLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvaTE4bi9ub3JtYWxpemUtbG9jYWxlLXBhdGgudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvbWl0dC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXItY29udGV4dC50cyIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi9yb3V0ZXIvcm91dGVyLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9mb3JtYXQtdXJsLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9nZXQtYXNzZXQtcGF0aC1mcm9tLXJvdXRlLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9pcy1keW5hbWljLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9wYXJzZS1yZWxhdGl2ZS11cmwudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3F1ZXJ5c3RyaW5nLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci91dGlscy9yZXNvbHZlLXJld3JpdGVzLW5vb3AudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3JvdXRlLW1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL3JvdXRlLXJlZ2V4LnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3NpZGUtZWZmZWN0LnRzeCIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uLy4uL25leHQtc2VydmVyL2xpYi91dGlscy50cyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9uZXh0LXNlcnZlci9zZXJ2ZXIvZGVub3JtYWxpemUtcGFnZS1wYXRoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbmV4dC9oZWFkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9qc3gtZGV2LXJ1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1jc3Mvc2VtYW50aWMubWluLmNzcz9iNzU4Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktY3NzL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy5lb3QiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1jc3MvdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2JyYW5kLWljb25zLnN2ZyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvYnJhbmQtaWNvbnMudHRmIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktY3NzL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy53b2ZmIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktY3NzL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy53b2ZmMiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMuZW90Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktY3NzL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9pY29ucy5zdmciLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1jc3MvdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2ljb25zLnR0ZiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMud29mZiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMud29mZjIiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1jc3MvdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMuZW90Iiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktY3NzL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9vdXRsaW5lLWljb25zLnN2ZyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvb3V0bGluZS1pY29ucy50dGYiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1jc3MvdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMud29mZiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvb3V0bGluZS1pY29ucy53b2ZmMiIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLWNzcy90aGVtZXMvZGVmYXVsdC9hc3NldHMvaW1hZ2VzL2ZsYWdzLnBuZyIsIndlYnBhY2s6Ly9fTl9FLy4vc3JjL3BhZ2VzL19hcHAudHN4Il0sIm5hbWVzIjpbInBhdGgiLCJub3JtYWxpemVQYXRoVHJhaWxpbmdTbGFzaCIsInByb2Nlc3MiLCJyZXF1ZXN0SWRsZUNhbGxiYWNrIiwic2VsZiIsInN0YXJ0IiwiRGF0ZSIsInNldFRpbWVvdXQiLCJjYiIsImRpZFRpbWVvdXQiLCJ0aW1lUmVtYWluaW5nIiwiTWF0aCIsImNhbmNlbElkbGVDYWxsYmFjayIsImNsZWFyVGltZW91dCIsIk1TX01BWF9JRExFX0RFTEFZIiwiZW50cnkiLCJtYXAiLCJQcm9taXNlIiwicHJvbSIsInJlc29sdmUiLCJyZXNvbHZlciIsImZ1dHVyZSIsImdlbmVyYXRvciIsInZhbHVlIiwibGluayIsImRvY3VtZW50Iiwid2luZG93IiwiY2FuUHJlZmV0Y2giLCJoYXNQcmVmZXRjaCIsInJlcyIsIkFTU0VUX0xPQURfRVJST1IiLCJTeW1ib2wiLCJPYmplY3QiLCJlcnIiLCJzY3JpcHQiLCJyZWplY3QiLCJtYXJrQXNzZXRFcnJvciIsImNhbmNlbGxlZCIsInIiLCJvbkJ1aWxkTWFuaWZlc3QiLCJyZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0Iiwic2NyaXB0cyIsImFzc2V0UHJlZml4IiwiZW5jb2RlVVJJIiwiY3NzIiwiZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCIsIm1hbmlmZXN0Iiwicm91dGUiLCJhbGxGaWxlcyIsInYiLCJlbnRyeXBvaW50cyIsImxvYWRlZFNjcmlwdHMiLCJzdHlsZVNoZWV0cyIsInJvdXRlcyIsImFwcGVuZFNjcmlwdCIsImZldGNoIiwidGV4dCIsImhyZWYiLCJjb250ZW50Iiwid2hlbkVudHJ5cG9pbnQiLCJ3aXRoRnV0dXJlIiwib25FbnRyeXBvaW50IiwiZm4iLCJleHBvcnRzIiwiY29tcG9uZW50IiwiZXJyb3IiLCJpbnB1dCIsIm9sZCIsImxvYWRSb3V0ZSIsImdldEZpbGVzRm9yUm91dGUiLCJlbnRyeXBvaW50Iiwic3R5bGVzIiwicHJlZmV0Y2giLCJjbiIsIm5hdmlnYXRvciIsIm91dHB1dCIsInByZWZldGNoVmlhRG9tIiwiY3JlYXRlUm91dGVMb2FkZXIiLCJzaW5nbGV0b25Sb3V0ZXIiLCJyb3V0ZXIiLCJyZWFkeUNhbGxiYWNrcyIsInJlYWR5IiwidXJsUHJvcGVydHlGaWVsZHMiLCJyb3V0ZXJFdmVudHMiLCJjb3JlTWV0aG9kRmllbGRzIiwiZ2V0IiwiUm91dGVyIiwiZmllbGQiLCJnZXRSb3V0ZXIiLCJldmVudCIsImV2ZW50RmllbGQiLCJfc2luZ2xldG9uUm91dGVyIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJSZWFjdCIsIlJvdXRlckNvbnRleHQiLCJjcmVhdGVSb3V0ZXIiLCJfcm91dGVyIiwiaW5zdGFuY2UiLCJBcnJheSIsIkNvbXBvc2VkQ29tcG9uZW50IiwiZ2V0SW5pdGlhbFByb3BzIiwiV2l0aFJvdXRlcldyYXBwZXIiLCJuYW1lIiwiQW1wU3RhdGVDb250ZXh0IiwiYW1wRmlyc3QiLCJoeWJyaWQiLCJoYXNRdWVyeSIsImlzSW5BbXBNb2RlIiwiSGVhZE1hbmFnZXJDb250ZXh0IiwiaW5BbXBNb2RlIiwiaGVhZCIsImNoaWxkIiwibGlzdCIsImZyYWdtZW50TGlzdCIsIk1FVEFUWVBFUyIsImtleXMiLCJ0YWdzIiwibWV0YVR5cGVzIiwibWV0YUNhdGVnb3JpZXMiLCJoIiwiaXNVbmlxdWUiLCJoYXNLZXkiLCJrZXkiLCJpIiwibGVuIiwibWV0YXR5cGUiLCJjYXRlZ29yeSIsImNhdGVnb3JpZXMiLCJoZWFkRWxlbWVudHMiLCJoZWFkRWxlbWVudENoaWxkcmVuIiwiaGVhZEVsZW1lbnQiLCJkZWZhdWx0SGVhZCIsInByb3BzIiwidW5pcXVlIiwiYyIsImFtcFN0YXRlIiwiaGVhZE1hbmFnZXIiLCJIZWFkIiwicGF0aG5hbWVQYXJ0cyIsInBhdGhuYW1lIiwibG9jYWxlcyIsImxvY2FsZSIsImRldGVjdGVkTG9jYWxlIiwiYWxsIiwib24iLCJvZmYiLCJlbWl0IiwiaGFuZGxlciIsImJhc2VQYXRoIiwicHJlZml4IiwicGF0aE5vUXVlcnlIYXNoIiwicXVlcnlJbmRleCIsImhhc2hJbmRleCIsImFkZFBhdGhQcmVmaXgiLCJ1cmwiLCJsb2NhdGlvbk9yaWdpbiIsInJlc29sdmVkIiwiaGFzQmFzZVBhdGgiLCJpbnRlcnBvbGF0ZWRSb3V0ZSIsImR5bmFtaWNSZWdleCIsImR5bmFtaWNHcm91cHMiLCJkeW5hbWljTWF0Y2hlcyIsImFzUGF0aG5hbWUiLCJwYXJhbXMiLCJwYXJhbSIsInJlcGxhY2VkIiwicmVwZWF0Iiwib3B0aW9uYWwiLCJzZWdtZW50IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwicmVzdWx0IiwiZmlsdGVyZWRRdWVyeSIsInF1ZXJ5IiwiYmFzZSIsInVybEFzU3RyaW5nIiwiaXNMb2NhbFVSTCIsInJlc29sdmVBcyIsImZpbmFsVXJsIiwiaW50ZXJwb2xhdGVkQXMiLCJpbnRlcnBvbGF0ZUFzIiwiaGFzaCIsIm9taXRQYXJtc0Zyb21RdWVyeSIsInJlc29sdmVkSHJlZiIsIm9yaWdpbiIsInJlc29sdmVIcmVmIiwiaHJlZkhhZE9yaWdpbiIsImFzSGFkT3JpZ2luIiwicmVzb2x2ZWRBcyIsInN0cmlwT3JpZ2luIiwicHJlcGFyZWRVcmwiLCJhZGRCYXNlUGF0aCIsInByZXBhcmVkQXMiLCJhcyIsImNsZWFuUGF0aG5hbWUiLCJwYWdlcyIsInBhZ2UiLCJtYW51YWxTY3JvbGxSZXN0b3JhdGlvbiIsIlNTR19EQVRBX05PVF9GT1VORCIsImNyZWRlbnRpYWxzIiwiYXR0ZW1wdHMiLCJmZXRjaFJldHJ5IiwiZGF0YSIsIm5vdEZvdW5kIiwiaXNTZXJ2ZXJSZW5kZXIiLCJjb25zdHJ1Y3RvciIsImFzUGF0aCIsImNvbXBvbmVudHMiLCJzZGMiLCJzZHIiLCJzdWIiLCJjbGMiLCJwYWdlTG9hZGVyIiwiX2JwcyIsImV2ZW50cyIsIl93cmFwQXBwIiwiaXNTc3IiLCJpc0ZhbGxiYWNrIiwiX2luRmxpZ2h0Um91dGUiLCJfc2hhbGxvdyIsImRlZmF1bHRMb2NhbGUiLCJkb21haW5Mb2NhbGVzIiwiaXNSZWFkeSIsImlzUHJldmlldyIsImlzTG9jYWxlRG9tYWluIiwiX2lkeCIsImUiLCJzdGF0ZSIsInNoYWxsb3ciLCJvcHRpb25zIiwiQ29tcG9uZW50IiwiaW5pdGlhbCIsIl9fTl9TU0ciLCJpbml0aWFsUHJvcHMiLCJfX05fU1NQIiwiYXV0b0V4cG9ydER5bmFtaWMiLCJyZWxvYWQiLCJwcmVwYXJlVXJsQXMiLCJsb2NhbGVDaGFuZ2UiLCJwYXJzZWRBcyIsImRlbEJhc2VQYXRoIiwibG9jYWxlUGF0aFJlc3VsdCIsImRpZE5hdmlnYXRlIiwiZGV0ZWN0ZWREb21haW4iLCJkZXRlY3REb21haW5Mb2NhbGUiLCJTVCIsInBlcmZvcm1hbmNlIiwicm91dGVQcm9wcyIsImFkZExvY2FsZSIsImNsZWFuZWRBcyIsImRlbExvY2FsZSIsInBhcnNlZCIsIl9fcmV3cml0ZXMiLCJtZXRob2QiLCJyZXNvbHZlRHluYW1pY1JvdXRlIiwicm91dGVSZWdleCIsInJvdXRlTWF0Y2giLCJzaG91bGRJbnRlcnBvbGF0ZSIsIm1pc3NpbmdQYXJhbXMiLCJyb3V0ZUluZm8iLCJkZXN0aW5hdGlvbiIsInBhcnNlZEhyZWYiLCJub3RGb3VuZFJvdXRlIiwiYXBwQ29tcCIsImlzVmFsaWRTaGFsbG93Um91dGUiLCJmb3JjZWRTY3JvbGwiLCJ4IiwieSIsIl9fTiIsImlkeCIsImJ1aWxkQ2FuY2VsbGF0aW9uRXJyb3IiLCJleGlzdGluZ1JvdXRlSW5mbyIsImNhY2hlZFJvdXRlSW5mbyIsInJlcXVpcmUiLCJpc1ZhbGlkRWxlbWVudFR5cGUiLCJkYXRhSHJlZiIsIm9ubHlBSGFzaENoYW5nZSIsIm5ld0hhc2giLCJvbGRVcmxOb0hhc2giLCJvbGRIYXNoIiwic2Nyb2xsVG9IYXNoIiwiaWRFbCIsIm5hbWVFbCIsInVybElzTmV3IiwicmV3cml0ZXNSZXN1bHQiLCJwIiwiaXNTc2ciLCJjYW5jZWwiLCJjb21wb25lbnRSZXN1bHQiLCJfZ2V0U3RhdGljRGF0YSIsImZldGNoTmV4dERhdGEiLCJfZ2V0U2VydmVyRGF0YSIsIkFwcFRyZWUiLCJjdHgiLCJhYm9ydENvbXBvbmVudExvYWQiLCJub3RpZnkiLCJzbGFzaGVkUHJvdG9jb2xzIiwicHJvdG9jb2wiLCJ1cmxPYmoiLCJob3N0IiwiYXV0aCIsImhvc3RuYW1lIiwiU3RyaW5nIiwicXVlcnlzdHJpbmciLCJzZWFyY2giLCJleHQiLCJURVNUX1JPVVRFIiwiZ2xvYmFsQmFzZSIsInJlc29sdmVkQmFzZSIsInNlYXJjaFBhcmFtcyIsImlzTmFOIiwiaXRlbSIsInN0cmluZ2lmeVVybFF1ZXJ5UGFyYW0iLCJzZWFyY2hQYXJhbXNMaXN0IiwidGFyZ2V0IiwicmUiLCJkZWNvZGUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJzbHVnTmFtZSIsImciLCJncm91cHMiLCJtIiwic3RyIiwic2VnbWVudHMiLCJub3JtYWxpemVkUm91dGUiLCJncm91cEluZGV4IiwicGFyYW1ldGVyaXplZFJvdXRlIiwicGFyc2VQYXJhbWV0ZXIiLCJwb3MiLCJlc2NhcGVSZWdleCIsImlzU2VydmVyIiwiX2hhc0hlYWRNYW5hZ2VyIiwiZW1pdENoYW5nZSIsImNvbXBvbmVudERpZE1vdW50IiwiY29tcG9uZW50RGlkVXBkYXRlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW5kZXIiLCJ1c2VkIiwicG9ydCIsImdldExvY2F0aW9uT3JpZ2luIiwiQXBwIiwiZ2V0RGlzcGxheU5hbWUiLCJsb2FkR2V0SW5pdGlhbFByb3BzIiwicGFnZVByb3BzIiwiaXNSZXNTZW50IiwidXJsT2JqZWN0S2V5cyIsIlNQIiwiTXlBcHAiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtQzs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7O0FBRUEsaUM7Ozs7Ozs7Ozs7O0FDSkEsdUJBQXVCLG1CQUFPLENBQUMscUZBQW9COztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsb0M7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Qzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxtQzs7Ozs7Ozs7Ozs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQzs7Ozs7Ozs7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsOEZBQThGLGVBQWU7QUFDN0c7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVAsaURBQWlEO0FBQ2pEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1FQUFtRTs7QUFFbkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLGNBQWM7QUFDekIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7QUFDUDs7QUFFQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiLFdBQVcsY0FBYztBQUN6QixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssRUFBRTs7QUFFUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVztBQUNuRDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9DQUFvQyxjQUFjO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QUEsNEJBQ0UscUVBQUMsZ0RBQUQ7QUFBQSw2QkFDRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURGO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFERixlQUlFLHFFQUFDLFNBQUQsb0JBQWVBLFNBQWY7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUpGO0FBQUEsa0JBREY7QUFRRDs7S0FUUUksSztBQVdNQSxvRUFBZiIsImZpbGUiOiJzdGF0aWMvY2h1bmtzL3BhZ2VzL19hcHAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRob3V0SG9sZXM7IiwiZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkOyIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsInZhciBzZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuL3NldFByb3RvdHlwZU9mXCIpO1xuXG52YXIgaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0ID0gcmVxdWlyZShcIi4vaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0XCIpO1xuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gUmVmbGVjdC5jb25zdHJ1Y3Q7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBzZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0OyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufSIsImZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG8pO1xuICB9O1xuICByZXR1cm4gX2dldFByb3RvdHlwZU9mKG8pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZjsiLCJ2YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKFwiLi9zZXRQcm90b3R5cGVPZlwiKTtcblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbmhlcml0czsiLCJmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgIFwiZGVmYXVsdFwiOiBvYmpcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0OyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG5mdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7XG4gIGlmICh0eXBlb2YgV2Vha01hcCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gbnVsbDtcbiAgdmFyIGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuICBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKSB7XG4gICAgcmV0dXJuIGNhY2hlO1xuICB9O1xuXG4gIHJldHVybiBjYWNoZTtcbn1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7XG4gIGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBfdHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiZGVmYXVsdFwiOiBvYmpcbiAgICB9O1xuICB9XG5cbiAgdmFyIGNhY2hlID0gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCk7XG5cbiAgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChvYmopO1xuICB9XG5cbiAgdmFyIG5ld09iaiA9IHt9O1xuICB2YXIgaGFzUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDtcblxuICAgICAgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZXdPYmpbXCJkZWZhdWx0XCJdID0gb2JqO1xuXG4gIGlmIChjYWNoZSkge1xuICAgIGNhY2hlLnNldChvYmosIG5ld09iaik7XG4gIH1cblxuICByZXR1cm4gbmV3T2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkOyIsImZ1bmN0aW9uIF9pc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0OyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwidW5kZWZpbmVkXCIgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGFycikpKSByZXR1cm47XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaSA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaXRlcmFibGVUb0FycmF5TGltaXQ7IiwiZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlU3ByZWFkOyIsInZhciBfdHlwZW9mID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mXCIpO1xuXG52YXIgYXNzZXJ0VGhpc0luaXRpYWxpemVkID0gcmVxdWlyZShcIi4vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCIpO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuOyIsImZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mOyIsInZhciBhcnJheVdpdGhIb2xlcyA9IHJlcXVpcmUoXCIuL2FycmF5V2l0aEhvbGVzXCIpO1xuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlMaW1pdFwiKTtcblxudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXlcIik7XG5cbnZhciBub25JdGVyYWJsZVJlc3QgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVJlc3RcIik7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXk7IiwidmFyIGFycmF5V2l0aG91dEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRob3V0SG9sZXNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9pdGVyYWJsZVRvQXJyYXlcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVTcHJlYWQgPSByZXF1aXJlKFwiLi9ub25JdGVyYWJsZVNwcmVhZFwiKTtcblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXkoYXJyKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IG5vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3RvQ29uc3VtYWJsZUFycmF5OyIsImZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWVcIik7XG4iLCJcInVzZSBzdHJpY3RcIjt2YXIgYXNzaWduPU9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpO21vZHVsZS5leHBvcnRzPWFzc2lnbjttb2R1bGUuZXhwb3J0cy5kZWZhdWx0PW1vZHVsZS5leHBvcnRzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0LWFzc2lnbi5qcy5tYXAiLCJcbiAgICAod2luZG93Ll9fTkVYVF9QID0gd2luZG93Ll9fTkVYVF9QIHx8IFtdKS5wdXNoKFtcbiAgICAgIFwiL19hcHBcIixcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmUoXCJwcml2YXRlLW5leHQtcGFnZXMvX2FwcC50c3hcIik7XG4gICAgICB9XG4gICAgXSk7XG4gICIsIlwidXNlIHN0cmljdFwiO2NvbnN0IGlzT2xkSUU9ZnVuY3Rpb24gaXNPbGRJRSgpe2xldCBtZW1vO3JldHVybiBmdW5jdGlvbiBtZW1vcml6ZSgpe2lmKHR5cGVvZiBtZW1vPT09J3VuZGVmaW5lZCcpey8vIFRlc3QgZm9yIElFIDw9IDkgYXMgcHJvcG9zZWQgYnkgQnJvd3NlcmhhY2tzXG4vLyBAc2VlIGh0dHA6Ly9icm93c2VyaGFja3MuY29tLyNoYWNrLWU3MWQ4NjkyZjY1MzM0MTczZmVlNzE1YzIyMmNiODA1XG4vLyBUZXN0cyBmb3IgZXhpc3RlbmNlIG9mIHN0YW5kYXJkIGdsb2JhbHMgaXMgdG8gYWxsb3cgc3R5bGUtbG9hZGVyXG4vLyB0byBvcGVyYXRlIGNvcnJlY3RseSBpbnRvIG5vbi1zdGFuZGFyZCBlbnZpcm9ubWVudHNcbi8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi9zdHlsZS1sb2FkZXIvaXNzdWVzLzE3N1xubWVtbz1Cb29sZWFuKHdpbmRvdyYmZG9jdW1lbnQmJmRvY3VtZW50LmFsbCYmIXdpbmRvdy5hdG9iKTt9cmV0dXJuIG1lbW87fTt9KCk7Y29uc3QgZ2V0VGFyZ2V0PWZ1bmN0aW9uIGdldFRhcmdldCgpe2NvbnN0IG1lbW89e307cmV0dXJuIGZ1bmN0aW9uIG1lbW9yaXplKHRhcmdldCl7aWYodHlwZW9mIG1lbW9bdGFyZ2V0XT09PSd1bmRlZmluZWQnKXtsZXQgc3R5bGVUYXJnZXQ9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0YXJnZXQpOy8vIFNwZWNpYWwgY2FzZSB0byByZXR1cm4gaGVhZCBvZiBpZnJhbWUgaW5zdGVhZCBvZiBpZnJhbWUgaXRzZWxmXG5pZih3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQmJnN0eWxlVGFyZ2V0IGluc3RhbmNlb2Ygd2luZG93LkhUTUxJRnJhbWVFbGVtZW50KXt0cnl7Ly8gVGhpcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gaWZyYW1lIGlzIGJsb2NrZWRcbi8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG5zdHlsZVRhcmdldD1zdHlsZVRhcmdldC5jb250ZW50RG9jdW1lbnQuaGVhZDt9Y2F0Y2goZSl7Ly8gaXN0YW5idWwgaWdub3JlIG5leHRcbnN0eWxlVGFyZ2V0PW51bGw7fX1tZW1vW3RhcmdldF09c3R5bGVUYXJnZXQ7fXJldHVybiBtZW1vW3RhcmdldF07fTt9KCk7Y29uc3Qgc3R5bGVzSW5Eb209W107ZnVuY3Rpb24gZ2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcil7bGV0IHJlc3VsdD0tMTtmb3IobGV0IGk9MDtpPHN0eWxlc0luRG9tLmxlbmd0aDtpKyspe2lmKHN0eWxlc0luRG9tW2ldLmlkZW50aWZpZXI9PT1pZGVudGlmaWVyKXtyZXN1bHQ9aTticmVhazt9fXJldHVybiByZXN1bHQ7fWZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LG9wdGlvbnMpe2NvbnN0IGlkQ291bnRNYXA9e307Y29uc3QgaWRlbnRpZmllcnM9W107Zm9yKGxldCBpPTA7aTxsaXN0Lmxlbmd0aDtpKyspe2NvbnN0IGl0ZW09bGlzdFtpXTtjb25zdCBpZD1vcHRpb25zLmJhc2U/aXRlbVswXStvcHRpb25zLmJhc2U6aXRlbVswXTtjb25zdCBjb3VudD1pZENvdW50TWFwW2lkXXx8MDtjb25zdCBpZGVudGlmaWVyPWAke2lkfSAke2NvdW50fWA7aWRDb3VudE1hcFtpZF09Y291bnQrMTtjb25zdCBpbmRleD1nZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtjb25zdCBvYmo9e2NzczppdGVtWzFdLG1lZGlhOml0ZW1bMl0sc291cmNlTWFwOml0ZW1bM119O2lmKGluZGV4IT09LTEpe3N0eWxlc0luRG9tW2luZGV4XS5yZWZlcmVuY2VzKys7c3R5bGVzSW5Eb21baW5kZXhdLnVwZGF0ZXIob2JqKTt9ZWxzZXtzdHlsZXNJbkRvbS5wdXNoKHtpZGVudGlmaWVyLHVwZGF0ZXI6YWRkU3R5bGUob2JqLG9wdGlvbnMpLHJlZmVyZW5jZXM6MX0pO31pZGVudGlmaWVycy5wdXNoKGlkZW50aWZpZXIpO31yZXR1cm4gaWRlbnRpZmllcnM7fWZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKXtjb25zdCBzdHlsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO2NvbnN0IGF0dHJpYnV0ZXM9b3B0aW9ucy5hdHRyaWJ1dGVzfHx7fTtpZih0eXBlb2YgYXR0cmlidXRlcy5ub25jZT09PSd1bmRlZmluZWQnKXtjb25zdCBub25jZT0vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbnR5cGVvZiBfX3dlYnBhY2tfbm9uY2VfXyE9PSd1bmRlZmluZWQnP19fd2VicGFja19ub25jZV9fOm51bGw7aWYobm9uY2Upe2F0dHJpYnV0ZXMubm9uY2U9bm9uY2U7fX1PYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGtleT0+e3N0eWxlLnNldEF0dHJpYnV0ZShrZXksYXR0cmlidXRlc1trZXldKTt9KTtpZih0eXBlb2Ygb3B0aW9ucy5pbnNlcnQ9PT0nZnVuY3Rpb24nKXtvcHRpb25zLmluc2VydChzdHlsZSk7fWVsc2V7Y29uc3QgdGFyZ2V0PWdldFRhcmdldChvcHRpb25zLmluc2VydHx8J2hlYWQnKTtpZighdGFyZ2V0KXt0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZG4ndCBmaW5kIGEgc3R5bGUgdGFyZ2V0LiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHZhbHVlIGZvciB0aGUgJ2luc2VydCcgcGFyYW1ldGVyIGlzIGludmFsaWQuXCIpO310YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO31yZXR1cm4gc3R5bGU7fWZ1bmN0aW9uIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZSl7Ly8gaXN0YW5idWwgaWdub3JlIGlmXG5pZihzdHlsZS5wYXJlbnROb2RlPT09bnVsbCl7cmV0dXJuIGZhbHNlO31zdHlsZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHN0eWxlKTt9LyogaXN0YW5idWwgaWdub3JlIG5leHQgICovY29uc3QgcmVwbGFjZVRleHQ9ZnVuY3Rpb24gcmVwbGFjZVRleHQoKXtjb25zdCB0ZXh0U3RvcmU9W107cmV0dXJuIGZ1bmN0aW9uIHJlcGxhY2UoaW5kZXgscmVwbGFjZW1lbnQpe3RleHRTdG9yZVtpbmRleF09cmVwbGFjZW1lbnQ7cmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7fTt9KCk7ZnVuY3Rpb24gYXBwbHlUb1NpbmdsZXRvblRhZyhzdHlsZSxpbmRleCxyZW1vdmUsb2JqKXtjb25zdCBjc3M9cmVtb3ZlPycnOm9iai5tZWRpYT9gQG1lZGlhICR7b2JqLm1lZGlhfSB7JHtvYmouY3NzfX1gOm9iai5jc3M7Ly8gRm9yIG9sZCBJRVxuLyogaXN0YW5idWwgaWdub3JlIGlmICAqL2lmKHN0eWxlLnN0eWxlU2hlZXQpe3N0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dD1yZXBsYWNlVGV4dChpbmRleCxjc3MpO31lbHNle2NvbnN0IGNzc05vZGU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzKTtjb25zdCBjaGlsZE5vZGVzPXN0eWxlLmNoaWxkTm9kZXM7aWYoY2hpbGROb2Rlc1tpbmRleF0pe3N0eWxlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaW5kZXhdKTt9aWYoY2hpbGROb2Rlcy5sZW5ndGgpe3N0eWxlLmluc2VydEJlZm9yZShjc3NOb2RlLGNoaWxkTm9kZXNbaW5kZXhdKTt9ZWxzZXtzdHlsZS5hcHBlbmRDaGlsZChjc3NOb2RlKTt9fX1mdW5jdGlvbiBhcHBseVRvVGFnKHN0eWxlLG9wdGlvbnMsb2JqKXtsZXQgY3NzPW9iai5jc3M7Y29uc3QgbWVkaWE9b2JqLm1lZGlhO2NvbnN0IHNvdXJjZU1hcD1vYmouc291cmNlTWFwO2lmKG1lZGlhKXtzdHlsZS5zZXRBdHRyaWJ1dGUoJ21lZGlhJyxtZWRpYSk7fWVsc2V7c3R5bGUucmVtb3ZlQXR0cmlidXRlKCdtZWRpYScpO31pZihzb3VyY2VNYXAmJnR5cGVvZiBidG9hIT09J3VuZGVmaW5lZCcpe2Nzcys9YFxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsJHtidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShzb3VyY2VNYXApKSkpfSAqL2A7fS8vIEZvciBvbGQgSUVcbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9pZihzdHlsZS5zdHlsZVNoZWV0KXtzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQ9Y3NzO31lbHNle3doaWxlKHN0eWxlLmZpcnN0Q2hpbGQpe3N0eWxlLnJlbW92ZUNoaWxkKHN0eWxlLmZpcnN0Q2hpbGQpO31zdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTt9fWxldCBzaW5nbGV0b249bnVsbDtsZXQgc2luZ2xldG9uQ291bnRlcj0wO2Z1bmN0aW9uIGFkZFN0eWxlKG9iaixvcHRpb25zKXtsZXQgc3R5bGU7bGV0IHVwZGF0ZTtsZXQgcmVtb3ZlO2lmKG9wdGlvbnMuc2luZ2xldG9uKXtjb25zdCBzdHlsZUluZGV4PXNpbmdsZXRvbkNvdW50ZXIrKztzdHlsZT1zaW5nbGV0b258fChzaW5nbGV0b249aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpKTt1cGRhdGU9YXBwbHlUb1NpbmdsZXRvblRhZy5iaW5kKG51bGwsc3R5bGUsc3R5bGVJbmRleCxmYWxzZSk7cmVtb3ZlPWFwcGx5VG9TaW5nbGV0b25UYWcuYmluZChudWxsLHN0eWxlLHN0eWxlSW5kZXgsdHJ1ZSk7fWVsc2V7c3R5bGU9aW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO3VwZGF0ZT1hcHBseVRvVGFnLmJpbmQobnVsbCxzdHlsZSxvcHRpb25zKTtyZW1vdmU9KCk9PntyZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO307fXVwZGF0ZShvYmopO3JldHVybiBmdW5jdGlvbiB1cGRhdGVTdHlsZShuZXdPYmope2lmKG5ld09iail7aWYobmV3T2JqLmNzcz09PW9iai5jc3MmJm5ld09iai5tZWRpYT09PW9iai5tZWRpYSYmbmV3T2JqLnNvdXJjZU1hcD09PW9iai5zb3VyY2VNYXApe3JldHVybjt9dXBkYXRlKG9iaj1uZXdPYmopO31lbHNle3JlbW92ZSgpO319O31tb2R1bGUuZXhwb3J0cz0obGlzdCxvcHRpb25zKT0+e29wdGlvbnM9b3B0aW9uc3x8e307Ly8gRm9yY2Ugc2luZ2xlLXRhZyBzb2x1dGlvbiBvbiBJRTYtOSwgd2hpY2ggaGFzIGEgaGFyZCBsaW1pdCBvbiB0aGUgIyBvZiA8c3R5bGU+XG4vLyB0YWdzIGl0IHdpbGwgYWxsb3cgb24gYSBwYWdlXG5pZighb3B0aW9ucy5zaW5nbGV0b24mJnR5cGVvZiBvcHRpb25zLnNpbmdsZXRvbiE9PSdib29sZWFuJyl7b3B0aW9ucy5zaW5nbGV0b249aXNPbGRJRSgpO31saXN0PWxpc3R8fFtdO2xldCBsYXN0SWRlbnRpZmllcnM9bW9kdWxlc1RvRG9tKGxpc3Qsb3B0aW9ucyk7cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZShuZXdMaXN0KXtuZXdMaXN0PW5ld0xpc3R8fFtdO2lmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdMaXN0KSE9PSdbb2JqZWN0IEFycmF5XScpe3JldHVybjt9Zm9yKGxldCBpPTA7aTxsYXN0SWRlbnRpZmllcnMubGVuZ3RoO2krKyl7Y29uc3QgaWRlbnRpZmllcj1sYXN0SWRlbnRpZmllcnNbaV07Y29uc3QgaW5kZXg9Z2V0SW5kZXhCeUlkZW50aWZpZXIoaWRlbnRpZmllcik7c3R5bGVzSW5Eb21baW5kZXhdLnJlZmVyZW5jZXMtLTt9Y29uc3QgbmV3TGFzdElkZW50aWZpZXJzPW1vZHVsZXNUb0RvbShuZXdMaXN0LG9wdGlvbnMpO2ZvcihsZXQgaT0wO2k8bGFzdElkZW50aWZpZXJzLmxlbmd0aDtpKyspe2NvbnN0IGlkZW50aWZpZXI9bGFzdElkZW50aWZpZXJzW2ldO2NvbnN0IGluZGV4PWdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO2lmKHN0eWxlc0luRG9tW2luZGV4XS5yZWZlcmVuY2VzPT09MCl7c3R5bGVzSW5Eb21baW5kZXhdLnVwZGF0ZXIoKTtzdHlsZXNJbkRvbS5zcGxpY2UoaW5kZXgsMSk7fX1sYXN0SWRlbnRpZmllcnM9bmV3TGFzdElkZW50aWZpZXJzO307fTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcy5tYXAiLCIvKipcbiAqIFJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIG9mIGEgcGF0aCBpZiB0aGVyZSBpcyBvbmUuIFByZXNlcnZlcyB0aGUgcm9vdCBwYXRoIGAvYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVBhdGhUcmFpbGluZ1NsYXNoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmVuZHNXaXRoKCcvJykgJiYgcGF0aCAhPT0gJy8nID8gcGF0aC5zbGljZSgwLCAtMSkgOiBwYXRoXG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgdHJhaWxpbmcgc2xhc2ggb2YgYSBwYXRoIGFjY29yZGluZyB0byB0aGUgYHRyYWlsaW5nU2xhc2hgIG9wdGlvblxuICogaW4gYG5leHQuY29uZmlnLmpzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoID0gcHJvY2Vzcy5lbnYuX19ORVhUX1RSQUlMSU5HX1NMQVNIXG4gID8gKHBhdGg6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAoL1xcLlteL10rXFwvPyQvLnRlc3QocGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlbW92ZVBhdGhUcmFpbGluZ1NsYXNoKHBhdGgpXG4gICAgICB9IGVsc2UgaWYgKHBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICByZXR1cm4gcGF0aFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhdGggKyAnLydcbiAgICAgIH1cbiAgICB9XG4gIDogcmVtb3ZlUGF0aFRyYWlsaW5nU2xhc2hcbiIsInR5cGUgUmVxdWVzdElkbGVDYWxsYmFja0hhbmRsZSA9IGFueVxudHlwZSBSZXF1ZXN0SWRsZUNhbGxiYWNrT3B0aW9ucyA9IHtcbiAgdGltZW91dDogbnVtYmVyXG59XG50eXBlIFJlcXVlc3RJZGxlQ2FsbGJhY2tEZWFkbGluZSA9IHtcbiAgcmVhZG9ubHkgZGlkVGltZW91dDogYm9vbGVhblxuICB0aW1lUmVtYWluaW5nOiAoKSA9PiBudW1iZXJcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICByZXF1ZXN0SWRsZUNhbGxiYWNrOiAoXG4gICAgICBjYWxsYmFjazogKGRlYWRsaW5lOiBSZXF1ZXN0SWRsZUNhbGxiYWNrRGVhZGxpbmUpID0+IHZvaWQsXG4gICAgICBvcHRzPzogUmVxdWVzdElkbGVDYWxsYmFja09wdGlvbnNcbiAgICApID0+IFJlcXVlc3RJZGxlQ2FsbGJhY2tIYW5kbGVcbiAgICBjYW5jZWxJZGxlQ2FsbGJhY2s6IChpZDogUmVxdWVzdElkbGVDYWxsYmFja0hhbmRsZSkgPT4gdm9pZFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZXF1ZXN0SWRsZUNhbGxiYWNrID1cbiAgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmLnJlcXVlc3RJZGxlQ2FsbGJhY2spIHx8XG4gIGZ1bmN0aW9uIChcbiAgICBjYjogKGRlYWRsaW5lOiBSZXF1ZXN0SWRsZUNhbGxiYWNrRGVhZGxpbmUpID0+IHZvaWRcbiAgKTogTm9kZUpTLlRpbWVvdXQge1xuICAgIGxldCBzdGFydCA9IERhdGUubm93KClcbiAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBjYih7XG4gICAgICAgIGRpZFRpbWVvdXQ6IGZhbHNlLFxuICAgICAgICB0aW1lUmVtYWluaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIDUwIC0gKERhdGUubm93KCkgLSBzdGFydCkpXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH0sIDEpXG4gIH1cblxuZXhwb3J0IGNvbnN0IGNhbmNlbElkbGVDYWxsYmFjayA9XG4gICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jYW5jZWxJZGxlQ2FsbGJhY2spIHx8XG4gIGZ1bmN0aW9uIChpZDogUmVxdWVzdElkbGVDYWxsYmFja0hhbmRsZSkge1xuICAgIHJldHVybiBjbGVhclRpbWVvdXQoaWQpXG4gIH1cbiIsImltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENsaWVudEJ1aWxkTWFuaWZlc3QgfSBmcm9tICcuLi9idWlsZC93ZWJwYWNrL3BsdWdpbnMvYnVpbGQtbWFuaWZlc3QtcGx1Z2luJ1xuaW1wb3J0IGdldEFzc2V0UGF0aEZyb21Sb3V0ZSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvcm91dGVyL3V0aWxzL2dldC1hc3NldC1wYXRoLWZyb20tcm91dGUnXG5pbXBvcnQgeyByZXF1ZXN0SWRsZUNhbGxiYWNrIH0gZnJvbSAnLi9yZXF1ZXN0LWlkbGUtY2FsbGJhY2snXG5cbi8vIDMuOHMgd2FzIGFyYml0cmFyaWx5IGNob3NlbiBhcyBpdCdzIHdoYXQgaHR0cHM6Ly93ZWIuZGV2L2ludGVyYWN0aXZlXG4vLyBjb25zaWRlcnMgYXMgXCJHb29kXCIgdGltZS10by1pbnRlcmFjdGl2ZS4gV2UgbXVzdCBhc3N1bWUgc29tZXRoaW5nIHdlbnRcbi8vIHdyb25nIGJleW9uZCB0aGlzIHBvaW50LCBhbmQgdGhlbiBmYWxsLWJhY2sgdG8gYSBmdWxsIHBhZ2UgdHJhbnNpdGlvbiB0b1xuLy8gc2hvdyB0aGUgdXNlciBzb21ldGhpbmcgb2YgdmFsdWUuXG5jb25zdCBNU19NQVhfSURMRV9ERUxBWSA9IDM4MDBcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX0JVSUxEX01BTklGRVNUPzogQ2xpZW50QnVpbGRNYW5pZmVzdFxuICAgIF9fQlVJTERfTUFOSUZFU1RfQ0I/OiBGdW5jdGlvblxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRW50cnlwb2ludFN1Y2Nlc3Mge1xuICBjb21wb25lbnQ6IENvbXBvbmVudFR5cGVcbiAgZXhwb3J0czogYW55XG59XG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZEVudHJ5cG9pbnRGYWlsdXJlIHtcbiAgZXJyb3I6IHVua25vd25cbn1cbmV4cG9ydCB0eXBlIFJvdXRlRW50cnlwb2ludCA9IExvYWRlZEVudHJ5cG9pbnRTdWNjZXNzIHwgTG9hZGVkRW50cnlwb2ludEZhaWx1cmVcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVN0eWxlU2hlZXQge1xuICBocmVmOiBzdHJpbmdcbiAgY29udGVudDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkUm91dGVTdWNjZXNzIGV4dGVuZHMgTG9hZGVkRW50cnlwb2ludFN1Y2Nlc3Mge1xuICBzdHlsZXM6IFJvdXRlU3R5bGVTaGVldFtdXG59XG5leHBvcnQgaW50ZXJmYWNlIExvYWRlZFJvdXRlRmFpbHVyZSB7XG4gIGVycm9yOiB1bmtub3duXG59XG5leHBvcnQgdHlwZSBSb3V0ZUxvYWRlckVudHJ5ID0gTG9hZGVkUm91dGVTdWNjZXNzIHwgTG9hZGVkUm91dGVGYWlsdXJlXG5cbmV4cG9ydCB0eXBlIEZ1dHVyZTxWPiA9IHtcbiAgcmVzb2x2ZTogKGVudHJ5cG9pbnQ6IFYpID0+IHZvaWRcbiAgZnV0dXJlOiBQcm9taXNlPFY+XG59XG5mdW5jdGlvbiB3aXRoRnV0dXJlPFQ+KFxuICBrZXk6IHN0cmluZyxcbiAgbWFwOiBNYXA8c3RyaW5nLCBGdXR1cmU8VD4gfCBUPixcbiAgZ2VuZXJhdG9yPzogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGxldCBlbnRyeTogRnV0dXJlPFQ+IHwgVCB8IHVuZGVmaW5lZCA9IG1hcC5nZXQoa2V5KVxuICBpZiAoZW50cnkpIHtcbiAgICBpZiAoJ2Z1dHVyZScgaW4gZW50cnkpIHtcbiAgICAgIHJldHVybiBlbnRyeS5mdXR1cmVcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbnRyeSlcbiAgfVxuICBsZXQgcmVzb2x2ZXI6IChlbnRyeXBvaW50OiBUKSA9PiB2b2lkXG4gIGNvbnN0IHByb206IFByb21pc2U8VD4gPSBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmVyID0gcmVzb2x2ZVxuICB9KVxuICBtYXAuc2V0KGtleSwgKGVudHJ5ID0geyByZXNvbHZlOiByZXNvbHZlciEsIGZ1dHVyZTogcHJvbSB9KSlcbiAgcmV0dXJuIGdlbmVyYXRvclxuICAgID8gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlcXVlbmNlc1xuICAgICAgZ2VuZXJhdG9yKCkudGhlbigodmFsdWUpID0+IChyZXNvbHZlcih2YWx1ZSksIHZhbHVlKSlcbiAgICA6IHByb21cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZUxvYWRlciB7XG4gIHdoZW5FbnRyeXBvaW50KHJvdXRlOiBzdHJpbmcpOiBQcm9taXNlPFJvdXRlRW50cnlwb2ludD5cbiAgb25FbnRyeXBvaW50KHJvdXRlOiBzdHJpbmcsIGV4ZWN1dGU6ICgpID0+IHVua25vd24pOiB2b2lkXG4gIGxvYWRSb3V0ZShyb3V0ZTogc3RyaW5nKTogUHJvbWlzZTxSb3V0ZUxvYWRlckVudHJ5PlxuICBwcmVmZXRjaChyb3V0ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPlxufVxuXG5mdW5jdGlvbiBoYXNQcmVmZXRjaChsaW5rPzogSFRNTExpbmtFbGVtZW50KTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKVxuICAgIHJldHVybiAoXG4gICAgICAvLyBkZXRlY3QgSUUxMSBzaW5jZSBpdCBzdXBwb3J0cyBwcmVmZXRjaCBidXQgaXNuJ3QgZGV0ZWN0ZWRcbiAgICAgIC8vIHdpdGggcmVsTGlzdC5zdXBwb3J0XG4gICAgICAoISF3aW5kb3cuTVNJbnB1dE1ldGhvZENvbnRleHQgJiYgISEoZG9jdW1lbnQgYXMgYW55KS5kb2N1bWVudE1vZGUpIHx8XG4gICAgICBsaW5rLnJlbExpc3Quc3VwcG9ydHMoJ3ByZWZldGNoJylcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmNvbnN0IGNhblByZWZldGNoOiBib29sZWFuID0gaGFzUHJlZmV0Y2goKVxuXG5mdW5jdGlvbiBwcmVmZXRjaFZpYURvbShcbiAgaHJlZjogc3RyaW5nLFxuICBhczogc3RyaW5nLFxuICBsaW5rPzogSFRNTExpbmtFbGVtZW50XG4pOiBQcm9taXNlPGFueT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxpbmtbcmVsPVwicHJlZmV0Y2hcIl1baHJlZl49XCIke2hyZWZ9XCJdYCkpIHtcbiAgICAgIHJldHVybiByZXMoKVxuICAgIH1cblxuICAgIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJylcblxuICAgIC8vIFRoZSBvcmRlciBvZiBwcm9wZXJ0eSBhc3NpZ25tZW50IGhlcmUgaXMgaW50ZW50aW9uYWw6XG4gICAgaWYgKGFzKSBsaW5rIS5hcyA9IGFzXG4gICAgbGluayEucmVsID0gYHByZWZldGNoYFxuICAgIGxpbmshLmNyb3NzT3JpZ2luID0gcHJvY2Vzcy5lbnYuX19ORVhUX0NST1NTX09SSUdJTiFcbiAgICBsaW5rIS5vbmxvYWQgPSByZXNcbiAgICBsaW5rIS5vbmVycm9yID0gcmVqXG5cbiAgICAvLyBgaHJlZmAgc2hvdWxkIGFsd2F5cyBiZSBsYXN0OlxuICAgIGxpbmshLmhyZWYgPSBocmVmXG5cbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspXG4gIH0pXG59XG5cbmNvbnN0IEFTU0VUX0xPQURfRVJST1IgPSBTeW1ib2woJ0FTU0VUX0xPQURfRVJST1InKVxuLy8gVE9ETzogdW5leHBvcnRcbmV4cG9ydCBmdW5jdGlvbiBtYXJrQXNzZXRFcnJvcihlcnI6IEVycm9yKTogRXJyb3Ige1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGVyciwgQVNTRVRfTE9BRF9FUlJPUiwge30pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Fzc2V0RXJyb3IoZXJyPzogRXJyb3IpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGVyciAmJiBBU1NFVF9MT0FEX0VSUk9SIGluIGVyclxufVxuXG5mdW5jdGlvbiBhcHBlbmRTY3JpcHQoXG4gIHNyYzogc3RyaW5nLFxuICBzY3JpcHQ/OiBIVE1MU2NyaXB0RWxlbWVudFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcblxuICAgIC8vIFRoZSBvcmRlciBvZiBwcm9wZXJ0eSBhc3NpZ25tZW50IGhlcmUgaXMgaW50ZW50aW9uYWwuXG4gICAgLy8gMS4gU2V0dXAgc3VjY2Vzcy9mYWlsdXJlIGhvb2tzIGluIGNhc2UgdGhlIGJyb3dzZXIgc3luY2hyb25vdXNseVxuICAgIC8vICAgIGV4ZWN1dGVzIHdoZW4gYHNyY2AgaXMgc2V0LlxuICAgIHNjcmlwdC5vbmxvYWQgPSByZXNvbHZlXG4gICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PlxuICAgICAgcmVqZWN0KG1hcmtBc3NldEVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgc2NyaXB0OiAke3NyY31gKSkpXG5cbiAgICAvLyAyLiBDb25maWd1cmUgdGhlIGNyb3NzLW9yaWdpbiBhdHRyaWJ1dGUgYmVmb3JlIHNldHRpbmcgYHNyY2AgaW4gY2FzZSB0aGVcbiAgICAvLyAgICBicm93c2VyIGJlZ2lucyB0byBmZXRjaC5cbiAgICBzY3JpcHQuY3Jvc3NPcmlnaW4gPSBwcm9jZXNzLmVudi5fX05FWFRfQ1JPU1NfT1JJR0lOIVxuXG4gICAgLy8gMy4gRmluYWxseSwgc2V0IHRoZSBzb3VyY2UgYW5kIGluamVjdCBpbnRvIHRoZSBET00gaW4gY2FzZSB0aGUgY2hpbGRcbiAgICAvLyAgICBtdXN0IGJlIGFwcGVuZGVkIGZvciBmZXRjaGluZyB0byBzdGFydC5cbiAgICBzY3JpcHQuc3JjID0gc3JjXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpXG4gIH0pXG59XG5cbi8vIFJlc29sdmUgYSBwcm9taXNlIHRoYXQgdGltZXMgb3V0IGFmdGVyIGdpdmVuIGFtb3VudCBvZiBtaWxsaXNlY29uZHMuXG5mdW5jdGlvbiByZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0PFQ+KFxuICBwOiBQcm9taXNlPFQ+LFxuICBtczogbnVtYmVyLFxuICBlcnI6IEVycm9yXG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2VcblxuICAgIHAudGhlbigocikgPT4ge1xuICAgICAgLy8gUmVzb2x2ZWQsIGNhbmNlbCB0aGUgdGltZW91dFxuICAgICAgY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgcmVzb2x2ZShyKVxuICAgIH0pLmNhdGNoKHJlamVjdClcblxuICAgIHJlcXVlc3RJZGxlQ2FsbGJhY2soKCkgPT5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIWNhbmNlbGxlZCkge1xuICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgIH0sIG1zKVxuICAgIClcbiAgfSlcbn1cblxuLy8gVE9ETzogc3RvcCBleHBvcnRpbmcgb3IgY2FjaGUgdGhlIGZhaWx1cmVcbi8vIEl0J2QgYmUgYmVzdCB0byBzdG9wIGV4cG9ydGluZyB0aGlzLiBJdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gV2UncmVcbi8vIG9ubHkgZXhwb3J0aW5nIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbHR5IHdpdGggdGhlIGBwYWdlLWxvYWRlcmAuXG4vLyBPbmx5IGNhY2hlIHRoaXMgcmVzcG9uc2UgYXMgYSBsYXN0IHJlc29ydCBpZiB3ZSBjYW5ub3QgZWxpbWluYXRlIGFsbCBvdGhlclxuLy8gY29kZSBicmFuY2hlcyB0aGF0IHVzZSB0aGUgQnVpbGQgTWFuaWZlc3QgQ2FsbGJhY2sgYW5kIHB1c2ggdGhlbSB0aHJvdWdoXG4vLyB0aGUgUm91dGUgTG9hZGVyIGludGVyZmFjZS5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGllbnRCdWlsZE1hbmlmZXN0KCk6IFByb21pc2U8Q2xpZW50QnVpbGRNYW5pZmVzdD4ge1xuICBpZiAoc2VsZi5fX0JVSUxEX01BTklGRVNUKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzZWxmLl9fQlVJTERfTUFOSUZFU1QpXG4gIH1cblxuICBjb25zdCBvbkJ1aWxkTWFuaWZlc3Q6IFByb21pc2U8Q2xpZW50QnVpbGRNYW5pZmVzdD4gPSBuZXcgUHJvbWlzZTxcbiAgICBDbGllbnRCdWlsZE1hbmlmZXN0XG4gID4oKHJlc29sdmUpID0+IHtcbiAgICAvLyBNYW5kYXRvcnkgYmVjYXVzZSB0aGlzIGlzIG5vdCBjb25jdXJyZW50IHNhZmU6XG4gICAgY29uc3QgY2IgPSBzZWxmLl9fQlVJTERfTUFOSUZFU1RfQ0JcbiAgICBzZWxmLl9fQlVJTERfTUFOSUZFU1RfQ0IgPSAoKSA9PiB7XG4gICAgICByZXNvbHZlKHNlbGYuX19CVUlMRF9NQU5JRkVTVCEpXG4gICAgICBjYiAmJiBjYigpXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiByZXNvbHZlUHJvbWlzZVdpdGhUaW1lb3V0PENsaWVudEJ1aWxkTWFuaWZlc3Q+KFxuICAgIG9uQnVpbGRNYW5pZmVzdCxcbiAgICBNU19NQVhfSURMRV9ERUxBWSxcbiAgICBtYXJrQXNzZXRFcnJvcihuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNsaWVudCBidWlsZCBtYW5pZmVzdCcpKVxuICApXG59XG5cbmludGVyZmFjZSBSb3V0ZUZpbGVzIHtcbiAgc2NyaXB0czogc3RyaW5nW11cbiAgY3NzOiBzdHJpbmdbXVxufVxuZnVuY3Rpb24gZ2V0RmlsZXNGb3JSb3V0ZShcbiAgYXNzZXRQcmVmaXg6IHN0cmluZyxcbiAgcm91dGU6IHN0cmluZ1xuKTogUHJvbWlzZTxSb3V0ZUZpbGVzPiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgc2NyaXB0czogW1xuICAgICAgICBhc3NldFByZWZpeCArXG4gICAgICAgICAgJy9fbmV4dC9zdGF0aWMvY2h1bmtzL3BhZ2VzJyArXG4gICAgICAgICAgZW5jb2RlVVJJKGdldEFzc2V0UGF0aEZyb21Sb3V0ZShyb3V0ZSwgJy5qcycpKSxcbiAgICAgIF0sXG4gICAgICAvLyBTdHlsZXMgYXJlIGhhbmRsZWQgYnkgYHN0eWxlLWxvYWRlcmAgaW4gZGV2ZWxvcG1lbnQ6XG4gICAgICBjc3M6IFtdLFxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIGdldENsaWVudEJ1aWxkTWFuaWZlc3QoKS50aGVuKChtYW5pZmVzdCkgPT4ge1xuICAgIGlmICghKHJvdXRlIGluIG1hbmlmZXN0KSkge1xuICAgICAgdGhyb3cgbWFya0Fzc2V0RXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gbG9va3VwIHJvdXRlOiAke3JvdXRlfWApKVxuICAgIH1cbiAgICBjb25zdCBhbGxGaWxlcyA9IG1hbmlmZXN0W3JvdXRlXS5tYXAoXG4gICAgICAoZW50cnkpID0+IGFzc2V0UHJlZml4ICsgJy9fbmV4dC8nICsgZW5jb2RlVVJJKGVudHJ5KVxuICAgIClcbiAgICByZXR1cm4ge1xuICAgICAgc2NyaXB0czogYWxsRmlsZXMuZmlsdGVyKCh2KSA9PiB2LmVuZHNXaXRoKCcuanMnKSksXG4gICAgICBjc3M6IGFsbEZpbGVzLmZpbHRlcigodikgPT4gdi5lbmRzV2l0aCgnLmNzcycpKSxcbiAgICB9XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvdXRlTG9hZGVyKGFzc2V0UHJlZml4OiBzdHJpbmcpOiBSb3V0ZUxvYWRlciB7XG4gIGNvbnN0IGVudHJ5cG9pbnRzOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIEZ1dHVyZTxSb3V0ZUVudHJ5cG9pbnQ+IHwgUm91dGVFbnRyeXBvaW50XG4gID4gPSBuZXcgTWFwKClcbiAgY29uc3QgbG9hZGVkU2NyaXB0czogTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4gPSBuZXcgTWFwKClcbiAgY29uc3Qgc3R5bGVTaGVldHM6IE1hcDxzdHJpbmcsIFByb21pc2U8Um91dGVTdHlsZVNoZWV0Pj4gPSBuZXcgTWFwKClcbiAgY29uc3Qgcm91dGVzOiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIEZ1dHVyZTxSb3V0ZUxvYWRlckVudHJ5PiB8IFJvdXRlTG9hZGVyRW50cnlcbiAgPiA9IG5ldyBNYXAoKVxuXG4gIGZ1bmN0aW9uIG1heWJlRXhlY3V0ZVNjcmlwdChzcmM6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGxldCBwcm9tOiBQcm9taXNlPHVua25vd24+IHwgdW5kZWZpbmVkID0gbG9hZGVkU2NyaXB0cy5nZXQoc3JjKVxuICAgIGlmIChwcm9tKSB7XG4gICAgICByZXR1cm4gcHJvbVxuICAgIH1cblxuICAgIC8vIFNraXAgZXhlY3V0aW5nIHNjcmlwdCBpZiBpdCdzIGFscmVhZHkgaW4gdGhlIERPTTpcbiAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihgc2NyaXB0W3NyY149XCIke3NyY31cIl1gKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgbG9hZGVkU2NyaXB0cy5zZXQoc3JjLCAocHJvbSA9IGFwcGVuZFNjcmlwdChzcmMpKSlcbiAgICByZXR1cm4gcHJvbVxuICB9XG5cbiAgZnVuY3Rpb24gZmV0Y2hTdHlsZVNoZWV0KGhyZWY6IHN0cmluZyk6IFByb21pc2U8Um91dGVTdHlsZVNoZWV0PiB7XG4gICAgbGV0IHByb206IFByb21pc2U8Um91dGVTdHlsZVNoZWV0PiB8IHVuZGVmaW5lZCA9IHN0eWxlU2hlZXRzLmdldChocmVmKVxuICAgIGlmIChwcm9tKSB7XG4gICAgICByZXR1cm4gcHJvbVxuICAgIH1cblxuICAgIHN0eWxlU2hlZXRzLnNldChcbiAgICAgIGhyZWYsXG4gICAgICAocHJvbSA9IGZldGNoKGhyZWYpXG4gICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBzdHlsZXNoZWV0OiAke2hyZWZ9YClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlcy50ZXh0KCkudGhlbigodGV4dCkgPT4gKHsgaHJlZjogaHJlZiwgY29udGVudDogdGV4dCB9KSlcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICB0aHJvdyBtYXJrQXNzZXRFcnJvcihlcnIpXG4gICAgICAgIH0pKVxuICAgIClcbiAgICByZXR1cm4gcHJvbVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aGVuRW50cnlwb2ludChyb3V0ZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gd2l0aEZ1dHVyZShyb3V0ZSwgZW50cnlwb2ludHMpXG4gICAgfSxcbiAgICBvbkVudHJ5cG9pbnQocm91dGU6IHN0cmluZywgZXhlY3V0ZTogKCkgPT4gdW5rbm93bikge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKGV4ZWN1dGUpXG4gICAgICAgIC50aGVuKChmbikgPT4gZm4oKSlcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGV4cG9ydHM6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGNvbXBvbmVudDogKGV4cG9ydHMgJiYgZXhwb3J0cy5kZWZhdWx0KSB8fCBleHBvcnRzLFxuICAgICAgICAgICAgZXhwb3J0czogZXhwb3J0cyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAoZXJyKSA9PiAoeyBlcnJvcjogZXJyIH0pXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oKGlucHV0OiBSb3V0ZUVudHJ5cG9pbnQpID0+IHtcbiAgICAgICAgICBjb25zdCBvbGQgPSBlbnRyeXBvaW50cy5nZXQocm91dGUpXG4gICAgICAgICAgZW50cnlwb2ludHMuc2V0KHJvdXRlLCBpbnB1dClcbiAgICAgICAgICBpZiAob2xkICYmICdyZXNvbHZlJyBpbiBvbGQpIG9sZC5yZXNvbHZlKGlucHV0KVxuICAgICAgICB9KVxuICAgIH0sXG4gICAgbG9hZFJvdXRlKHJvdXRlOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiB3aXRoRnV0dXJlPFJvdXRlTG9hZGVyRW50cnk+KHJvdXRlLCByb3V0ZXMsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IHNjcmlwdHMsIGNzcyB9ID0gYXdhaXQgZ2V0RmlsZXNGb3JSb3V0ZShhc3NldFByZWZpeCwgcm91dGUpXG4gICAgICAgICAgY29uc3QgWywgc3R5bGVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGVudHJ5cG9pbnRzLmhhcyhyb3V0ZSlcbiAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICA6IFByb21pc2UuYWxsKHNjcmlwdHMubWFwKG1heWJlRXhlY3V0ZVNjcmlwdCkpLFxuICAgICAgICAgICAgUHJvbWlzZS5hbGwoY3NzLm1hcChmZXRjaFN0eWxlU2hlZXQpKSxcbiAgICAgICAgICBdIGFzIGNvbnN0KVxuXG4gICAgICAgICAgY29uc3QgZW50cnlwb2ludDogUm91dGVFbnRyeXBvaW50ID0gYXdhaXQgcmVzb2x2ZVByb21pc2VXaXRoVGltZW91dChcbiAgICAgICAgICAgIHRoaXMud2hlbkVudHJ5cG9pbnQocm91dGUpLFxuICAgICAgICAgICAgTVNfTUFYX0lETEVfREVMQVksXG4gICAgICAgICAgICBtYXJrQXNzZXRFcnJvcihcbiAgICAgICAgICAgICAgbmV3IEVycm9yKGBSb3V0ZSBkaWQgbm90IGNvbXBsZXRlIGxvYWRpbmc6ICR7cm91dGV9YClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCByZXM6IFJvdXRlTG9hZGVyRW50cnkgPSBPYmplY3QuYXNzaWduPFxuICAgICAgICAgICAgeyBzdHlsZXM6IFJvdXRlU3R5bGVTaGVldFtdIH0sXG4gICAgICAgICAgICBSb3V0ZUVudHJ5cG9pbnRcbiAgICAgICAgICA+KHsgc3R5bGVzIH0sIGVudHJ5cG9pbnQpXG4gICAgICAgICAgcmV0dXJuICdlcnJvcicgaW4gZW50cnlwb2ludCA/IGVudHJ5cG9pbnQgOiByZXNcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGVyciB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSxcbiAgICBwcmVmZXRjaChyb3V0ZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lTGFicy9xdWlja2xpbmsvYmxvYi80NTNhNjYxZmExZmE5NDBlMmQyZTA0NDQ1MjM5OGUzOGM2N2E5OGZiL3NyYy9pbmRleC5tanMjTDExNS1MMTE4XG4gICAgICAvLyBMaWNlbnNlOiBBcGFjaGUgMi4wXG4gICAgICBsZXQgY25cbiAgICAgIGlmICgoY24gPSAobmF2aWdhdG9yIGFzIGFueSkuY29ubmVjdGlvbikpIHtcbiAgICAgICAgLy8gRG9uJ3QgcHJlZmV0Y2ggaWYgdXNpbmcgMkcgb3IgaWYgU2F2ZS1EYXRhIGlzIGVuYWJsZWQuXG4gICAgICAgIGlmIChjbi5zYXZlRGF0YSB8fCAvMmcvLnRlc3QoY24uZWZmZWN0aXZlVHlwZSkpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdldEZpbGVzRm9yUm91dGUoYXNzZXRQcmVmaXgsIHJvdXRlKVxuICAgICAgICAudGhlbigob3V0cHV0KSA9PlxuICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgY2FuUHJlZmV0Y2hcbiAgICAgICAgICAgICAgPyBvdXRwdXQuc2NyaXB0cy5tYXAoKHNjcmlwdCkgPT4gcHJlZmV0Y2hWaWFEb20oc2NyaXB0LCAnc2NyaXB0JykpXG4gICAgICAgICAgICAgIDogW11cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3RJZGxlQ2FsbGJhY2soKCkgPT4gdGhpcy5sb2FkUm91dGUocm91dGUpKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goXG4gICAgICAgICAgLy8gc3dhbGxvdyBwcmVmZXRjaCBlcnJvcnNcbiAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICApXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSb3V0ZUxvYWRlclxuIiwiLyogZ2xvYmFsIHdpbmRvdyAqL1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFJvdXRlciwgeyBOZXh0Um91dGVyIH0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci9yb3V0ZXInXG5pbXBvcnQgeyBSb3V0ZXJDb250ZXh0IH0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL3JvdXRlci1jb250ZXh0J1xuXG50eXBlIENsYXNzQXJndW1lbnRzPFQ+ID0gVCBleHRlbmRzIG5ldyAoLi4uYXJnczogaW5mZXIgVSkgPT4gYW55ID8gVSA6IGFueVxuXG50eXBlIFJvdXRlckFyZ3MgPSBDbGFzc0FyZ3VtZW50czx0eXBlb2YgUm91dGVyPlxuXG50eXBlIFNpbmdsZXRvblJvdXRlckJhc2UgPSB7XG4gIHJvdXRlcjogUm91dGVyIHwgbnVsbFxuICByZWFkeUNhbGxiYWNrczogQXJyYXk8KCkgPT4gYW55PlxuICByZWFkeShjYjogKCkgPT4gYW55KTogdm9pZFxufVxuXG5leHBvcnQgeyBSb3V0ZXIsIE5leHRSb3V0ZXIgfVxuXG5leHBvcnQgdHlwZSBTaW5nbGV0b25Sb3V0ZXIgPSBTaW5nbGV0b25Sb3V0ZXJCYXNlICYgTmV4dFJvdXRlclxuXG5jb25zdCBzaW5nbGV0b25Sb3V0ZXI6IFNpbmdsZXRvblJvdXRlckJhc2UgPSB7XG4gIHJvdXRlcjogbnVsbCwgLy8gaG9sZHMgdGhlIGFjdHVhbCByb3V0ZXIgaW5zdGFuY2VcbiAgcmVhZHlDYWxsYmFja3M6IFtdLFxuICByZWFkeShjYjogKCkgPT4gdm9pZCkge1xuICAgIGlmICh0aGlzLnJvdXRlcikgcmV0dXJuIGNiKClcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucmVhZHlDYWxsYmFja3MucHVzaChjYilcbiAgICB9XG4gIH0sXG59XG5cbi8vIENyZWF0ZSBwdWJsaWMgcHJvcGVydGllcyBhbmQgbWV0aG9kcyBvZiB0aGUgcm91dGVyIGluIHRoZSBzaW5nbGV0b25Sb3V0ZXJcbmNvbnN0IHVybFByb3BlcnR5RmllbGRzID0gW1xuICAncGF0aG5hbWUnLFxuICAncm91dGUnLFxuICAncXVlcnknLFxuICAnYXNQYXRoJyxcbiAgJ2NvbXBvbmVudHMnLFxuICAnaXNGYWxsYmFjaycsXG4gICdiYXNlUGF0aCcsXG4gICdsb2NhbGUnLFxuICAnbG9jYWxlcycsXG4gICdkZWZhdWx0TG9jYWxlJyxcbiAgJ2lzUmVhZHknLFxuICAnaXNQcmV2aWV3JyxcbiAgJ2lzTG9jYWxlRG9tYWluJyxcbl1cbmNvbnN0IHJvdXRlckV2ZW50cyA9IFtcbiAgJ3JvdXRlQ2hhbmdlU3RhcnQnLFxuICAnYmVmb3JlSGlzdG9yeUNoYW5nZScsXG4gICdyb3V0ZUNoYW5nZUNvbXBsZXRlJyxcbiAgJ3JvdXRlQ2hhbmdlRXJyb3InLFxuICAnaGFzaENoYW5nZVN0YXJ0JyxcbiAgJ2hhc2hDaGFuZ2VDb21wbGV0ZScsXG5dXG5jb25zdCBjb3JlTWV0aG9kRmllbGRzID0gW1xuICAncHVzaCcsXG4gICdyZXBsYWNlJyxcbiAgJ3JlbG9hZCcsXG4gICdiYWNrJyxcbiAgJ3ByZWZldGNoJyxcbiAgJ2JlZm9yZVBvcFN0YXRlJyxcbl1cblxuLy8gRXZlbnRzIGlzIGEgc3RhdGljIHByb3BlcnR5IG9uIHRoZSByb3V0ZXIsIHRoZSByb3V0ZXIgZG9lc24ndCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIHRvIHVzZSBpdFxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHNpbmdsZXRvblJvdXRlciwgJ2V2ZW50cycsIHtcbiAgZ2V0KCkge1xuICAgIHJldHVybiBSb3V0ZXIuZXZlbnRzXG4gIH0sXG59KVxuXG51cmxQcm9wZXJ0eUZpZWxkcy5mb3JFYWNoKChmaWVsZDogc3RyaW5nKSA9PiB7XG4gIC8vIEhlcmUgd2UgbmVlZCB0byB1c2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IGJlY2F1c2UsIHdlIG5lZWQgdG8gcmV0dXJuXG4gIC8vIHRoZSBwcm9wZXJ0eSBhc3NpZ25lZCB0byB0aGUgYWN0dWFsIHJvdXRlclxuICAvLyBUaGUgdmFsdWUgbWlnaHQgZ2V0IGNoYW5nZWQgYXMgd2UgY2hhbmdlIHJvdXRlcyBhbmQgdGhpcyBpcyB0aGVcbiAgLy8gcHJvcGVyIHdheSB0byBhY2Nlc3MgaXRcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNpbmdsZXRvblJvdXRlciwgZmllbGQsIHtcbiAgICBnZXQoKSB7XG4gICAgICBjb25zdCByb3V0ZXIgPSBnZXRSb3V0ZXIoKSBhcyBhbnlcbiAgICAgIHJldHVybiByb3V0ZXJbZmllbGRdIGFzIHN0cmluZ1xuICAgIH0sXG4gIH0pXG59KVxuXG5jb3JlTWV0aG9kRmllbGRzLmZvckVhY2goKGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgLy8gV2UgZG9uJ3QgcmVhbGx5IGtub3cgdGhlIHR5cGVzIGhlcmUsIHNvIHdlIGFkZCB0aGVtIGxhdGVyIGluc3RlYWRcbiAgOyhzaW5nbGV0b25Sb3V0ZXIgYXMgYW55KVtmaWVsZF0gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICBjb25zdCByb3V0ZXIgPSBnZXRSb3V0ZXIoKSBhcyBhbnlcbiAgICByZXR1cm4gcm91dGVyW2ZpZWxkXSguLi5hcmdzKVxuICB9XG59KVxuXG5yb3V0ZXJFdmVudHMuZm9yRWFjaCgoZXZlbnQ6IHN0cmluZykgPT4ge1xuICBzaW5nbGV0b25Sb3V0ZXIucmVhZHkoKCkgPT4ge1xuICAgIFJvdXRlci5ldmVudHMub24oZXZlbnQsICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBldmVudEZpZWxkID0gYG9uJHtldmVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKX0ke2V2ZW50LnN1YnN0cmluZyhcbiAgICAgICAgMVxuICAgICAgKX1gXG4gICAgICBjb25zdCBfc2luZ2xldG9uUm91dGVyID0gc2luZ2xldG9uUm91dGVyIGFzIGFueVxuICAgICAgaWYgKF9zaW5nbGV0b25Sb3V0ZXJbZXZlbnRGaWVsZF0pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBfc2luZ2xldG9uUm91dGVyW2V2ZW50RmllbGRdKC4uLmFyZ3MpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHdoZW4gcnVubmluZyB0aGUgUm91dGVyIGV2ZW50OiAke2V2ZW50RmllbGR9YClcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAke2Vyci5tZXNzYWdlfVxcbiR7ZXJyLnN0YWNrfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9KVxufSlcblxuZnVuY3Rpb24gZ2V0Um91dGVyKCk6IFJvdXRlciB7XG4gIGlmICghc2luZ2xldG9uUm91dGVyLnJvdXRlcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgJ05vIHJvdXRlciBpbnN0YW5jZSBmb3VuZC5cXG4nICtcbiAgICAgICdZb3Ugc2hvdWxkIG9ubHkgdXNlIFwibmV4dC9yb3V0ZXJcIiBpbnNpZGUgdGhlIGNsaWVudCBzaWRlIG9mIHlvdXIgYXBwLlxcbidcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSlcbiAgfVxuICByZXR1cm4gc2luZ2xldG9uUm91dGVyLnJvdXRlclxufVxuXG4vLyBFeHBvcnQgdGhlIHNpbmdsZXRvblJvdXRlciBhbmQgdGhpcyBpcyB0aGUgcHVibGljIEFQSS5cbmV4cG9ydCBkZWZhdWx0IHNpbmdsZXRvblJvdXRlciBhcyBTaW5nbGV0b25Sb3V0ZXJcblxuLy8gUmVleHBvcnQgdGhlIHdpdGhSb3V0ZSBIT0NcbmV4cG9ydCB7IGRlZmF1bHQgYXMgd2l0aFJvdXRlciB9IGZyb20gJy4vd2l0aC1yb3V0ZXInXG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSb3V0ZXIoKTogTmV4dFJvdXRlciB7XG4gIHJldHVybiBSZWFjdC51c2VDb250ZXh0KFJvdXRlckNvbnRleHQpXG59XG5cbi8vIElOVEVSTkFMIEFQSVNcbi8vIC0tLS0tLS0tLS0tLS1cbi8vIChkbyBub3QgdXNlIGZvbGxvd2luZyBleHBvcnRzIGluc2lkZSB0aGUgYXBwKVxuXG4vLyBDcmVhdGUgYSByb3V0ZXIgYW5kIGFzc2lnbiBpdCBhcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLlxuLy8gVGhpcyBpcyB1c2VkIGluIGNsaWVudCBzaWRlIHdoZW4gd2UgYXJlIGluaXRpbGl6aW5nIHRoZSBhcHAuXG4vLyBUaGlzIHNob3VsZCAqKm5vdCoqIHVzZSBpbnNpZGUgdGhlIHNlcnZlci5cbmV4cG9ydCBjb25zdCBjcmVhdGVSb3V0ZXIgPSAoLi4uYXJnczogUm91dGVyQXJncyk6IFJvdXRlciA9PiB7XG4gIHNpbmdsZXRvblJvdXRlci5yb3V0ZXIgPSBuZXcgUm91dGVyKC4uLmFyZ3MpXG4gIHNpbmdsZXRvblJvdXRlci5yZWFkeUNhbGxiYWNrcy5mb3JFYWNoKChjYikgPT4gY2IoKSlcbiAgc2luZ2xldG9uUm91dGVyLnJlYWR5Q2FsbGJhY2tzID0gW11cblxuICByZXR1cm4gc2luZ2xldG9uUm91dGVyLnJvdXRlclxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBgd2l0aFJvdXRlcmAgcm91dGVyIGluc3RhbmNlXG5leHBvcnQgZnVuY3Rpb24gbWFrZVB1YmxpY1JvdXRlckluc3RhbmNlKHJvdXRlcjogUm91dGVyKTogTmV4dFJvdXRlciB7XG4gIGNvbnN0IF9yb3V0ZXIgPSByb3V0ZXIgYXMgYW55XG4gIGNvbnN0IGluc3RhbmNlID0ge30gYXMgYW55XG5cbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB1cmxQcm9wZXJ0eUZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgX3JvdXRlcltwcm9wZXJ0eV0gPT09ICdvYmplY3QnKSB7XG4gICAgICBpbnN0YW5jZVtwcm9wZXJ0eV0gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICBBcnJheS5pc0FycmF5KF9yb3V0ZXJbcHJvcGVydHldKSA/IFtdIDoge30sXG4gICAgICAgIF9yb3V0ZXJbcHJvcGVydHldXG4gICAgICApIC8vIG1ha2VzIHN1cmUgcXVlcnkgaXMgbm90IHN0YXRlZnVsXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGluc3RhbmNlW3Byb3BlcnR5XSA9IF9yb3V0ZXJbcHJvcGVydHldXG4gIH1cblxuICAvLyBFdmVudHMgaXMgYSBzdGF0aWMgcHJvcGVydHkgb24gdGhlIHJvdXRlciwgdGhlIHJvdXRlciBkb2Vzbid0IGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gdXNlIGl0XG4gIGluc3RhbmNlLmV2ZW50cyA9IFJvdXRlci5ldmVudHNcblxuICBjb3JlTWV0aG9kRmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgaW5zdGFuY2VbZmllbGRdID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICByZXR1cm4gX3JvdXRlcltmaWVsZF0oLi4uYXJncylcbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIGluc3RhbmNlXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBOZXh0Q29tcG9uZW50VHlwZSwgTmV4dFBhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL3V0aWxzJ1xuaW1wb3J0IHsgTmV4dFJvdXRlciwgdXNlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXInXG5cbmV4cG9ydCB0eXBlIFdpdGhSb3V0ZXJQcm9wcyA9IHtcbiAgcm91dGVyOiBOZXh0Um91dGVyXG59XG5cbmV4cG9ydCB0eXBlIEV4Y2x1ZGVSb3V0ZXJQcm9wczxQPiA9IFBpY2s8XG4gIFAsXG4gIEV4Y2x1ZGU8a2V5b2YgUCwga2V5b2YgV2l0aFJvdXRlclByb3BzPlxuPlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3aXRoUm91dGVyPFxuICBQIGV4dGVuZHMgV2l0aFJvdXRlclByb3BzLFxuICBDID0gTmV4dFBhZ2VDb250ZXh0XG4+KFxuICBDb21wb3NlZENvbXBvbmVudDogTmV4dENvbXBvbmVudFR5cGU8QywgYW55LCBQPlxuKTogUmVhY3QuQ29tcG9uZW50VHlwZTxFeGNsdWRlUm91dGVyUHJvcHM8UD4+IHtcbiAgZnVuY3Rpb24gV2l0aFJvdXRlcldyYXBwZXIocHJvcHM6IGFueSk6IEpTWC5FbGVtZW50IHtcbiAgICByZXR1cm4gPENvbXBvc2VkQ29tcG9uZW50IHJvdXRlcj17dXNlUm91dGVyKCl9IHsuLi5wcm9wc30gLz5cbiAgfVxuXG4gIFdpdGhSb3V0ZXJXcmFwcGVyLmdldEluaXRpYWxQcm9wcyA9IENvbXBvc2VkQ29tcG9uZW50LmdldEluaXRpYWxQcm9wc1xuICAvLyBUaGlzIGlzIG5lZWRlZCB0byBhbGxvdyBjaGVja2luZyBmb3IgY3VzdG9tIGdldEluaXRpYWxQcm9wcyBpbiBfYXBwXG4gIDsoV2l0aFJvdXRlcldyYXBwZXIgYXMgYW55KS5vcmlnR2V0SW5pdGlhbFByb3BzID0gKENvbXBvc2VkQ29tcG9uZW50IGFzIGFueSkub3JpZ0dldEluaXRpYWxQcm9wc1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IG5hbWUgPVxuICAgICAgQ29tcG9zZWRDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9zZWRDb21wb25lbnQubmFtZSB8fCAnVW5rbm93bidcbiAgICBXaXRoUm91dGVyV3JhcHBlci5kaXNwbGF5TmFtZSA9IGB3aXRoUm91dGVyKCR7bmFtZX0pYFxuICB9XG5cbiAgcmV0dXJuIFdpdGhSb3V0ZXJXcmFwcGVyXG59XG4iLCJtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBuPXs3NjI6ZnVuY3Rpb24obil7bi5leHBvcnRzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3QudG9TdHJpbmc9ZnVuY3Rpb24gdG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odCl7dmFyIHI9Y3NzV2l0aE1hcHBpbmdUb1N0cmluZyh0LG4pO2lmKHRbMl0pe3JldHVyblwiQG1lZGlhIFwiLmNvbmNhdCh0WzJdLFwiIHtcIikuY29uY2F0KHIsXCJ9XCIpfXJldHVybiByfSkuam9pbihcIlwiKX07dC5pPWZ1bmN0aW9uKG4scixvKXtpZih0eXBlb2Ygbj09PVwic3RyaW5nXCIpe249W1tudWxsLG4sXCJcIl1dfXZhciBlPXt9O2lmKG8pe2Zvcih2YXIgYT0wO2E8dGhpcy5sZW5ndGg7YSsrKXt2YXIgYz10aGlzW2FdWzBdO2lmKGMhPW51bGwpe2VbY109dHJ1ZX19fWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgdT1bXS5jb25jYXQobltpXSk7aWYobyYmZVt1WzBdXSl7Y29udGludWV9aWYocil7aWYoIXVbMl0pe3VbMl09cn1lbHNle3VbMl09XCJcIi5jb25jYXQocixcIiBhbmQgXCIpLmNvbmNhdCh1WzJdKX19dC5wdXNoKHUpfX07cmV0dXJuIHR9O2Z1bmN0aW9uIGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcobix0KXt2YXIgcj1uWzFdfHxcIlwiO3ZhciBvPW5bM107aWYoIW8pe3JldHVybiByfWlmKHQmJnR5cGVvZiBidG9hPT09XCJmdW5jdGlvblwiKXt2YXIgZT10b0NvbW1lbnQobyk7dmFyIGE9by5zb3VyY2VzLm1hcChmdW5jdGlvbihuKXtyZXR1cm5cIi8qIyBzb3VyY2VVUkw9XCIuY29uY2F0KG8uc291cmNlUm9vdHx8XCJcIikuY29uY2F0KG4sXCIgKi9cIil9KTtyZXR1cm5bcl0uY29uY2F0KGEpLmNvbmNhdChbZV0pLmpvaW4oXCJcXG5cIil9cmV0dXJuW3JdLmpvaW4oXCJcXG5cIil9ZnVuY3Rpb24gdG9Db21tZW50KG4pe3ZhciB0PWJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KG4pKSkpO3ZhciByPVwic291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsXCIuY29uY2F0KHQpO3JldHVyblwiLyojIFwiLmNvbmNhdChyLFwiICovXCIpfX19O3ZhciB0PXt9O2Z1bmN0aW9uIF9fbmNjd3Bja19yZXF1aXJlX18ocil7aWYodFtyXSl7cmV0dXJuIHRbcl0uZXhwb3J0c312YXIgbz10W3JdPXtleHBvcnRzOnt9fTt2YXIgZT10cnVlO3RyeXtuW3JdKG8sby5leHBvcnRzLF9fbmNjd3Bja19yZXF1aXJlX18pO2U9ZmFsc2V9ZmluYWxseXtpZihlKWRlbGV0ZSB0W3JdfXJldHVybiBvLmV4cG9ydHN9X19uY2N3cGNrX3JlcXVpcmVfXy5hYj1fX2Rpcm5hbWUrXCIvXCI7cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oNzYyKX0oKTsiLCIvLyBJbXBvcnRzXG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi9uZXh0L2Rpc3QvY29tcGlsZWQvY3NzLWxvYWRlci9hcGkuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fIGZyb20gXCIuLi9uZXh0L2Rpc3QvY29tcGlsZWQvY3NzLWxvYWRlci9nZXRVcmwuanNcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMF9fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvaW1hZ2VzL2ZsYWdzLnBuZ1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xX19fIGZyb20gXCIuL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9pY29ucy5lb3RcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMl9fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMud29mZjJcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfM19fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMud29mZlwiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF80X19fIGZyb20gXCIuL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9pY29ucy50dGZcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNV9fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMuc3ZnXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzZfX18gZnJvbSBcIi4vdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMuZW90XCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzdfX18gZnJvbSBcIi4vdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMud29mZjJcIjtcbmltcG9ydCBfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfOF9fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvb3V0bGluZS1pY29ucy53b2ZmXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzlfX18gZnJvbSBcIi4vdGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMudHRmXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEwX19fIGZyb20gXCIuL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9vdXRsaW5lLWljb25zLnN2Z1wiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMV9fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvYnJhbmQtaWNvbnMuZW90XCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEyX19fIGZyb20gXCIuL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy53b2ZmMlwiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xM19fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvYnJhbmQtaWNvbnMud29mZlwiO1xuaW1wb3J0IF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xNF9fXyBmcm9tIFwiLi90aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvYnJhbmQtaWNvbnMudHRmXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE1X19fIGZyb20gXCIuL3RoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy5zdmdcIjtcbnZhciBfX19DU1NfTE9BREVSX0VYUE9SVF9fXyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyh0cnVlKTtcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCJAaW1wb3J0IHVybChodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9TGF0bzo0MDAsNzAwLDQwMGl0YWxpYyw3MDBpdGFsaWMmc3Vic2V0PWxhdGluKTtcIl0pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzBfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8wX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzFfX18sIHsgaGFzaDogXCI/I2llZml4XCIgfSk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfM19fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzJfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzRfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8zX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF81X19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzVfX18sIHsgaGFzaDogXCIjaWNvbnNcIiB9KTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF83X19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfNl9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzZfX18sIHsgaGFzaDogXCI/I2llZml4XCIgfSk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzdfX18pO1xudmFyIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzEwX19fID0gX19fQ1NTX0xPQURFUl9HRVRfVVJMX0lNUE9SVF9fXyhfX19DU1NfTE9BREVSX1VSTF9JTVBPUlRfOF9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTFfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF85X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xMl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEwX19fLCB7IGhhc2g6IFwiI2ljb25zXCIgfSk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTNfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMV9fXyk7XG52YXIgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTRfX18gPSBfX19DU1NfTE9BREVSX0dFVF9VUkxfSU1QT1JUX19fKF9fX0NTU19MT0FERVJfVVJMX0lNUE9SVF8xMV9fXywgeyBoYXNoOiBcIj8jaWVmaXhcIiB9KTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNV9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEyX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNl9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzEzX19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xN19fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE0X19fKTtcbnZhciBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xOF9fXyA9IF9fX0NTU19MT0FERVJfR0VUX1VSTF9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9VUkxfSU1QT1JUXzE1X19fLCB7IGhhc2g6IFwiI2ljb25zXCIgfSk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgXCIgLypcXG4gKiAjIFNlbWFudGljIFVJIC0gMi40LjBcXG4gKiBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJXFxuICogaHR0cDovL3d3dy5zZW1hbnRpYy11aS5jb20vXFxuICpcXG4gKiBDb3B5cmlnaHQgMjAxNCBDb250cmlidXRvcnNcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gUmVzZXRcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLyosOmFmdGVyLDpiZWZvcmV7LXdlYmtpdC1ib3gtc2l6aW5nOmluaGVyaXQ7Ym94LXNpemluZzppbmhlcml0fWh0bWx7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fWlucHV0W3R5cGU9ZW1haWxdLGlucHV0W3R5cGU9cGFzc3dvcmRdLGlucHV0W3R5cGU9c2VhcmNoXSxpbnB1dFt0eXBlPXRleHRdey13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS8qISBub3JtYWxpemUuY3NzIHY3LjAuMCB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9odG1se2xpbmUtaGVpZ2h0OjEuMTU7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJX1ib2R5e21hcmdpbjowfWFydGljbGUsYXNpZGUsZm9vdGVyLGhlYWRlcixuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfWgxe2ZvbnQtc2l6ZToyZW07bWFyZ2luOi42N2VtIDB9ZmlnY2FwdGlvbixmaWd1cmUsbWFpbntkaXNwbGF5OmJsb2NrfWZpZ3VyZXttYXJnaW46MWVtIDQwcHh9aHJ7LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7aGVpZ2h0OjA7b3ZlcmZsb3c6dmlzaWJsZX1wcmV7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWF7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LXRleHQtZGVjb3JhdGlvbi1za2lwOm9iamVjdHN9YWJiclt0aXRsZV17Ym9yZGVyLWJvdHRvbTpub25lO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6aW5oZXJpdH1iLHN0cm9uZ3tmb250LXdlaWdodDpib2xkZXJ9Y29kZSxrYmQsc2FtcHtmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19ZGZue2ZvbnQtc3R5bGU6aXRhbGljfW1hcmt7YmFja2dyb3VuZC1jb2xvcjojZmYwO2NvbG9yOiMwMDB9c21hbGx7Zm9udC1zaXplOjgwJX1zdWIsc3Vwe2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX1zdWJ7Ym90dG9tOi0uMjVlbX1zdXB7dG9wOi0uNWVtfWF1ZGlvLHZpZGVve2Rpc3BsYXk6aW5saW5lLWJsb2NrfWF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjB9aW1ne2JvcmRlci1zdHlsZTpub25lfXN2Zzpub3QoOnJvb3Qpe292ZXJmbG93OmhpZGRlbn1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OnNhbnMtc2VyaWY7Zm9udC1zaXplOjEwMCU7bGluZS1oZWlnaHQ6MS4xNTttYXJnaW46MH1idXR0b24saW5wdXR7b3ZlcmZsb3c6dmlzaWJsZX1idXR0b24sc2VsZWN0e3RleHQtdHJhbnNmb3JtOm5vbmV9W3R5cGU9cmVzZXRdLFt0eXBlPXN1Ym1pdF0sYnV0dG9uLGh0bWwgW3R5cGU9YnV0dG9uXXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9ufVt0eXBlPWJ1dHRvbl06Oi1tb3otZm9jdXMtaW5uZXIsW3R5cGU9cmVzZXRdOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPXN1Ym1pdF06Oi1tb3otZm9jdXMtaW5uZXIsYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlci1zdHlsZTpub25lO3BhZGRpbmc6MH1bdHlwZT1idXR0b25dOi1tb3otZm9jdXNyaW5nLFt0eXBlPXJlc2V0XTotbW96LWZvY3VzcmluZyxbdHlwZT1zdWJtaXRdOi1tb3otZm9jdXNyaW5nLGJ1dHRvbjotbW96LWZvY3VzcmluZ3tvdXRsaW5lOjFweCBkb3R0ZWQgQnV0dG9uVGV4dH1maWVsZHNldHtwYWRkaW5nOi4zNWVtIC43NWVtIC42MjVlbX1sZWdlbmR7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2NvbG9yOmluaGVyaXQ7ZGlzcGxheTp0YWJsZTttYXgtd2lkdGg6MTAwJTtwYWRkaW5nOjA7d2hpdGUtc3BhY2U6bm9ybWFsfXByb2dyZXNze2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfXRleHRhcmVhe292ZXJmbG93OmF1dG99W3R5cGU9Y2hlY2tib3hdLFt0eXBlPXJhZGlvXXstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowfVt0eXBlPW51bWJlcl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sW3R5cGU9bnVtYmVyXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31bdHlwZT1zZWFyY2hdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH1bdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLFt0eXBlPXNlYXJjaF06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH1kZXRhaWxzLG1lbnV7ZGlzcGxheTpibG9ja31zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfWNhbnZhc3tkaXNwbGF5OmlubGluZS1ibG9ja310ZW1wbGF0ZXtkaXNwbGF5Om5vbmV9W2hpZGRlbl17ZGlzcGxheTpub25lfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBTaXRlXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi9ib2R5LGh0bWx7aGVpZ2h0OjEwMCV9aHRtbHtmb250LXNpemU6MTRweH1ib2R5e21hcmdpbjowO3BhZGRpbmc6MDtvdmVyZmxvdy14OmhpZGRlbjttaW4td2lkdGg6MzIwcHg7YmFja2dyb3VuZDojZmZmO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjQyODVlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Zm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWR9aDEsaDIsaDMsaDQsaDV7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2xpbmUtaGVpZ2h0OjEuMjg1NzE0MjllbTttYXJnaW46Y2FsYygycmVtIC0gLjE0Mjg1NzE0ZW0pIDAgMXJlbTtmb250LXdlaWdodDo3MDA7cGFkZGluZzowfWgxe21pbi1oZWlnaHQ6MXJlbTtmb250LXNpemU6MnJlbX1oMntmb250LXNpemU6MS43MTQyODU3MXJlbX1oM3tmb250LXNpemU6MS4yODU3MTQyOXJlbX1oNHtmb250LXNpemU6MS4wNzE0Mjg1N3JlbX1oNXtmb250LXNpemU6MXJlbX1oMTpmaXJzdC1jaGlsZCxoMjpmaXJzdC1jaGlsZCxoMzpmaXJzdC1jaGlsZCxoNDpmaXJzdC1jaGlsZCxoNTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9aDE6bGFzdC1jaGlsZCxoMjpsYXN0LWNoaWxkLGgzOmxhc3QtY2hpbGQsaDQ6bGFzdC1jaGlsZCxoNTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH1we21hcmdpbjowIDAgMWVtO2xpbmUtaGVpZ2h0OjEuNDI4NWVtfXA6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfXA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9YXtjb2xvcjojNDE4M2M0O3RleHQtZGVjb3JhdGlvbjpub25lfWE6aG92ZXJ7Y29sb3I6IzFlNzBiZjt0ZXh0LWRlY29yYXRpb246bm9uZX06Oi13ZWJraXQtc2VsZWN0aW9ue2JhY2tncm91bmQtY29sb3I6I2NjZTJmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9OjpzZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjojY2NlMmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX1pbnB1dDo6LXdlYmtpdC1zZWxlY3Rpb24sdGV4dGFyZWE6Oi13ZWJraXQtc2VsZWN0aW9ue2JhY2tncm91bmQtY29sb3I6cmdiYSgxMDAsMTAwLDEwMCwuNCk7Y29sb3I6cmdiYSgwLDAsMCwuODcpfWlucHV0OjpzZWxlY3Rpb24sdGV4dGFyZWE6OnNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTAwLDEwMCwxMDAsLjQpO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX1ib2R5IDo6LXdlYmtpdC1zY3JvbGxiYXJ7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7d2lkdGg6MTBweDtoZWlnaHQ6MTBweH1ib2R5IDo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xKTtib3JkZXItcmFkaXVzOjB9Ym9keSA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2N1cnNvcjpwb2ludGVyO2JvcmRlci1yYWRpdXM6NXB4O2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMjUpOy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMnMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4ycyBlYXNlfWJvZHkgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp3aW5kb3ctaW5hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xNSl9Ym9keSA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVye2JhY2tncm91bmQ6cmdiYSgxMjgsMTM1LDEzOSwuOCl9Ym9keSAudWkuaW52ZXJ0ZWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keSAudWkuaW52ZXJ0ZWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMjUpfWJvZHkgLnVpLmludmVydGVkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp3aW5kb3ctaW5hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9Ym9keSAudWkuaW52ZXJ0ZWQ6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMzUpfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBCdXR0b25cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5idXR0b257Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWluLWhlaWdodDoxZW07b3V0bGluZTowO2JvcmRlcjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2JhY2tncm91bmQ6I2UwZTFlMiBub25lO2NvbG9yOnJnYmEoMCwwLDAsLjYpO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjttYXJnaW46MCAuMjVlbSAwIDA7cGFkZGluZzouNzg1NzE0MjllbSAxLjVlbSAuNzg1NzE0MjllbTt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtc2hhZG93Om5vbmU7Zm9udC13ZWlnaHQ6NzAwO2xpbmUtaGVpZ2h0OjFlbTtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcjt0ZXh0LWRlY29yYXRpb246bm9uZTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50IGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50IGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0Oy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGJhY2tncm91bmQtY29sb3IgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGJhY2tncm91bmQtY29sb3IgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGJhY2tncm91bmQtY29sb3IgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSxiYWNrZ3JvdW5kIC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZSxiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7d2lsbC1jaGFuZ2U6Jyc7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS51aS5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojY2FjYmNkO2JhY2tncm91bmQtaW1hZ2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50IGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50IGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2NvbG9yOnJnYmEoMCwwLDAsLjgpfS51aS5idXR0b246aG92ZXIgLmljb257b3BhY2l0eTouODV9LnVpLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNjYWNiY2Q7Y29sb3I6cmdiYSgwLDAsMCwuOCk7YmFja2dyb3VuZC1pbWFnZTonJyFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OicnIWltcG9ydGFudDtib3gtc2hhZG93OicnIWltcG9ydGFudH0udWkuYnV0dG9uOmZvY3VzIC5pY29ue29wYWNpdHk6Ljg1fS51aS5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiYWJiYmM7YmFja2dyb3VuZC1pbWFnZTonJztjb2xvcjpyZ2JhKDAsMCwwLC45KTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50IGluc2V0LG5vbmU7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQsbm9uZX0udWkuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNjMGMxYzI7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5hY3RpdmUuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2MwYzFjMjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjMGMxYzI7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5sb2FkaW5nLmxvYWRpbmcubG9hZGluZy5sb2FkaW5nLmxvYWRpbmcubG9hZGluZy5idXR0b257cG9zaXRpb246cmVsYXRpdmU7Y3Vyc29yOmRlZmF1bHQ7dGV4dC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O29wYWNpdHk6MTtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgMHMgbGluZWFyLG9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjphbGwgMHMgbGluZWFyLG9wYWNpdHkgLjFzIGVhc2V9LnVpLmxvYWRpbmcuYnV0dG9uOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0uNjQyODU3MTRlbSAwIDAgLS42NDI4NTcxNGVtO3dpZHRoOjEuMjg1NzE0MjllbTtoZWlnaHQ6MS4yODU3MTQyOWVtO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlcjouMmVtIHNvbGlkIHJnYmEoMCwwLDAsLjE1KX0udWkubG9hZGluZy5idXR0b246YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjotLjY0Mjg1NzE0ZW0gMCAwIC0uNjQyODU3MTRlbTt3aWR0aDoxLjI4NTcxNDI5ZW07aGVpZ2h0OjEuMjg1NzE0MjllbTstd2Via2l0LWFuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojZmZmIHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50fS51aS5sYWJlbGVkLmljb24ubG9hZGluZy5idXR0b24gLmljb257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9QC13ZWJraXQta2V5ZnJhbWVzIGJ1dHRvbi1zcGlue2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGJ1dHRvbi1zcGlue2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0udWkuYmFzaWMubG9hZGluZy5idXR0b246bm90KC5pbnZlcnRlZCk6YmVmb3Jle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0udWkuYmFzaWMubG9hZGluZy5idXR0b246bm90KC5pbnZlcnRlZCk6YWZ0ZXJ7Ym9yZGVyLXRvcC1jb2xvcjojNzY3Njc2fS51aS5idXR0b246ZGlzYWJsZWQsLnVpLmJ1dHRvbnMgLmRpc2FibGVkLmJ1dHRvbiwudWkuZGlzYWJsZWQuYWN0aXZlLmJ1dHRvbiwudWkuZGlzYWJsZWQuYnV0dG9uLC51aS5kaXNhYmxlZC5idXR0b246aG92ZXJ7Y3Vyc29yOmRlZmF1bHQ7b3BhY2l0eTouNDUhaW1wb3J0YW50O2JhY2tncm91bmQtaW1hZ2U6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZSFpbXBvcnRhbnR9LnVpLmJhc2ljLmJ1dHRvbnMgLnVpLmRpc2FibGVkLmJ1dHRvbntib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuNSl9LnVpLmFuaW1hdGVkLmJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47cGFkZGluZy1yaWdodDowIWltcG9ydGFudDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ei1pbmRleDoxfS51aS5hbmltYXRlZC5idXR0b24gLmNvbnRlbnR7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtLG9wYWNpdHl9LnVpLmFuaW1hdGVkLmJ1dHRvbiAudmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1yaWdodDoxLjVlbX0udWkuYW5pbWF0ZWQuYnV0dG9uIC5oaWRkZW4uY29udGVudHtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfS51aS5hbmltYXRlZC5idXR0b24gLmhpZGRlbi5jb250ZW50LC51aS5hbmltYXRlZC5idXR0b24gLnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zaXRpb246cmlnaHQgLjNzIGVhc2UgMHM7dHJhbnNpdGlvbjpyaWdodCAuM3MgZWFzZSAwc30udWkuYW5pbWF0ZWQuYnV0dG9uIC52aXNpYmxlLmNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0OjB9LnVpLmFuaW1hdGVkLmJ1dHRvbiAuaGlkZGVuLmNvbnRlbnR7dG9wOjUwJTtsZWZ0OmF1dG87cmlnaHQ6LTEwMCU7bWFyZ2luLXRvcDotLjVlbX0udWkuYW5pbWF0ZWQuYnV0dG9uOmZvY3VzIC52aXNpYmxlLmNvbnRlbnQsLnVpLmFuaW1hdGVkLmJ1dHRvbjpob3ZlciAudmlzaWJsZS5jb250ZW50e2xlZnQ6YXV0bztyaWdodDoyMDAlfS51aS5hbmltYXRlZC5idXR0b246Zm9jdXMgLmhpZGRlbi5jb250ZW50LC51aS5hbmltYXRlZC5idXR0b246aG92ZXIgLmhpZGRlbi5jb250ZW50e2xlZnQ6YXV0bztyaWdodDowfS51aS52ZXJ0aWNhbC5hbmltYXRlZC5idXR0b24gLmhpZGRlbi5jb250ZW50LC51aS52ZXJ0aWNhbC5hbmltYXRlZC5idXR0b24gLnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zaXRpb246dG9wIC4zcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246dG9wIC4zcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246dG9wIC4zcyBlYXNlLHRyYW5zZm9ybSAuM3MgZWFzZTt0cmFuc2l0aW9uOnRvcCAuM3MgZWFzZSx0cmFuc2Zvcm0gLjNzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2V9LnVpLnZlcnRpY2FsLmFuaW1hdGVkLmJ1dHRvbiAudmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7cmlnaHQ6YXV0b30udWkudmVydGljYWwuYW5pbWF0ZWQuYnV0dG9uIC5oaWRkZW4uY29udGVudHt0b3A6LTUwJTtsZWZ0OjA7cmlnaHQ6YXV0b30udWkudmVydGljYWwuYW5pbWF0ZWQuYnV0dG9uOmZvY3VzIC52aXNpYmxlLmNvbnRlbnQsLnVpLnZlcnRpY2FsLmFuaW1hdGVkLmJ1dHRvbjpob3ZlciAudmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjAwJSk7cmlnaHQ6YXV0b30udWkudmVydGljYWwuYW5pbWF0ZWQuYnV0dG9uOmZvY3VzIC5oaWRkZW4uY29udGVudCwudWkudmVydGljYWwuYW5pbWF0ZWQuYnV0dG9uOmhvdmVyIC5oaWRkZW4uY29udGVudHt0b3A6NTAlO3JpZ2h0OmF1dG99LnVpLmZhZGUuYW5pbWF0ZWQuYnV0dG9uIC5oaWRkZW4uY29udGVudCwudWkuZmFkZS5hbmltYXRlZC5idXR0b24gLnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuM3MgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4zcyBlYXNlLHRyYW5zZm9ybSAuM3MgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGVhc2UsdHJhbnNmb3JtIC4zcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlfS51aS5mYWRlLmFuaW1hdGVkLmJ1dHRvbiAudmlzaWJsZS5jb250ZW50e2xlZnQ6YXV0bztyaWdodDphdXRvO29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9LnVpLmZhZGUuYW5pbWF0ZWQuYnV0dG9uIC5oaWRkZW4uY29udGVudHtvcGFjaXR5OjA7bGVmdDowO3JpZ2h0OmF1dG87LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS41KTt0cmFuc2Zvcm06c2NhbGUoMS41KX0udWkuZmFkZS5hbmltYXRlZC5idXR0b246Zm9jdXMgLnZpc2libGUuY29udGVudCwudWkuZmFkZS5hbmltYXRlZC5idXR0b246aG92ZXIgLnZpc2libGUuY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6YXV0bztvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjc1KTt0cmFuc2Zvcm06c2NhbGUoLjc1KX0udWkuZmFkZS5hbmltYXRlZC5idXR0b246Zm9jdXMgLmhpZGRlbi5jb250ZW50LC51aS5mYWRlLmFuaW1hdGVkLmJ1dHRvbjpob3ZlciAuaGlkZGVuLmNvbnRlbnR7bGVmdDowO3JpZ2h0OmF1dG87b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0udWkuaW52ZXJ0ZWQuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudCBub25lO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJ1dHRvbnMgLmJ1dHRvbnttYXJnaW46MCAwIDAgLTJweH0udWkuaW52ZXJ0ZWQuYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LnVpLmludmVydGVkLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbnttYXJnaW46MCAwIC0ycHggMH0udWkuaW52ZXJ0ZWQudmVydGljYWwuYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuaW52ZXJ0ZWQuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjgpfS51aS5pbnZlcnRlZC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLmludmVydGVkLmJ1dHRvbi5hY3RpdmU6Zm9jdXN7YmFja2dyb3VuZDojZGNkZGRlOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2RjZGRkZSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2RjZGRkZSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLmxhYmVsZWQuYnV0dG9uOm5vdCguaWNvbil7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS51aS5sYWJlbGVkLmJ1dHRvbj4uYnV0dG9ue21hcmdpbjowfS51aS5sYWJlbGVkLmJ1dHRvbj4ubGFiZWx7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46MCAwIDAgLTFweCFpbXBvcnRhbnQ7cGFkZGluZzonJztmb250LXNpemU6MWVtO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmxhYmVsZWQuYnV0dG9uPi50YWcubGFiZWw6YmVmb3Jle3dpZHRoOjEuODVlbTtoZWlnaHQ6MS44NWVtfS51aS5sYWJlbGVkLmJ1dHRvbjpub3QoW2NsYXNzKj1cXFwibGVmdCBsYWJlbGVkXFxcIl0pPi5idXR0b257Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS51aS5sYWJlbGVkLmJ1dHRvbjpub3QoW2NsYXNzKj1cXFwibGVmdCBsYWJlbGVkXFxcIl0pPi5sYWJlbHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS51aVtjbGFzcyo9XFxcImxlZnQgbGFiZWxlZFxcXCJdLmJ1dHRvbj4uYnV0dG9ue2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LnVpW2NsYXNzKj1cXFwibGVmdCBsYWJlbGVkXFxcIl0uYnV0dG9uPi5sYWJlbHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLmZhY2Vib29rLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMzYjU5OTg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuZmFjZWJvb2suYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzMwNGQ4YTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmZhY2Vib29rLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMmQ0MzczO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkudHdpdHRlci5idXR0b257YmFja2dyb3VuZC1jb2xvcjojNTVhY2VlO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnR3aXR0ZXIuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzM1YTJmNDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnR3aXR0ZXIuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMyNzk1ZTk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5nb29nbGUucGx1cy5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZGQ0YjM5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmdvb2dsZS5wbHVzLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMDMyMWM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5nb29nbGUucGx1cy5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2MyMzMyMTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmxpbmtlZGluLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMxZjg4YmU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5saW5rZWRpbi5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTQ3YmFmO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkubGlua2VkaW4uYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxODY5OTI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS55b3V0dWJlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS55b3V0dWJlLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlNjAwMDA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS55b3V0dWJlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYzAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuaW5zdGFncmFtLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM0OTc2OWM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuaW5zdGFncmFtLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzZDY5OGU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5pbnN0YWdyYW0uYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzOTVjNzk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5waW50ZXJlc3QuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2JkMDgxYztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5waW50ZXJlc3QuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2FjMDAxMztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnBpbnRlcmVzdC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzhjMDYxNTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnZrLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM0ZDcxOTg7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnZrLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM0MTY0OGE7Y29sb3I6I2ZmZn0udWkudmsuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzYzU4NzY7Y29sb3I6I2ZmZn0udWkuYnV0dG9uPi5pY29uOm5vdCguYnV0dG9uKXtoZWlnaHQ6Ljg1NzE0Mjg2ZW07b3BhY2l0eTouODttYXJnaW46MCAuNDI4NTcxNDNlbSAwIC0uMjE0Mjg1NzFlbTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dmVydGljYWwtYWxpZ246Jyc7Y29sb3I6Jyd9LnVpLmJ1dHRvbjpub3QoLmljb24pPi5pY29uOm5vdCguYnV0dG9uKTpub3QoLmRyb3Bkb3duKXttYXJnaW46MCAuNDI4NTcxNDNlbSAwIC0uMjE0Mjg1NzFlbX0udWkuYnV0dG9uOm5vdCguaWNvbik+LnJpZ2h0Lmljb246bm90KC5idXR0b24pOm5vdCguZHJvcGRvd24pe21hcmdpbjowIC0uMjE0Mjg1NzFlbSAwIC40Mjg1NzE0M2VtfS51aVtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJdLmJ1dHRvbiwudWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5idXR0b25ze2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6LjI1ZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmJ1dHRvbiwudWlbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0uYnV0dG9uc3tmbG9hdDpyaWdodDttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDouMjVlbX0udWkuY29tcGFjdC5idXR0b24sLnVpLmNvbXBhY3QuYnV0dG9ucyAuYnV0dG9ue3BhZGRpbmc6LjU4OTI4NTcxZW0gMS4xMjVlbSAuNTg5Mjg1NzFlbX0udWkuY29tcGFjdC5pY29uLmJ1dHRvbiwudWkuY29tcGFjdC5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwYWRkaW5nOi41ODkyODU3MWVtIC41ODkyODU3MWVtIC41ODkyODU3MWVtfS51aS5jb21wYWN0LmxhYmVsZWQuaWNvbi5idXR0b24sLnVpLmNvbXBhY3QubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwYWRkaW5nOi41ODkyODU3MWVtIDMuNjk2NDI4NTdlbSAuNTg5Mjg1NzFlbX0udWkubWluaS5idXR0b24sLnVpLm1pbmkuYnV0dG9ucyAuYnV0dG9uLC51aS5taW5pLmJ1dHRvbnMgLm9ye2ZvbnQtc2l6ZTouNzg1NzE0MjlyZW19LnVpLnRpbnkuYnV0dG9uLC51aS50aW55LmJ1dHRvbnMgLmJ1dHRvbiwudWkudGlueS5idXR0b25zIC5vcntmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5idXR0b24sLnVpLnNtYWxsLmJ1dHRvbnMgLmJ1dHRvbiwudWkuc21hbGwuYnV0dG9ucyAub3J7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuYnV0dG9uLC51aS5idXR0b25zIC5idXR0b24sLnVpLmJ1dHRvbnMgLm9ye2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5idXR0b24sLnVpLmxhcmdlLmJ1dHRvbnMgLmJ1dHRvbiwudWkubGFyZ2UuYnV0dG9ucyAub3J7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy5idXR0b24sLnVpLmJpZy5idXR0b25zIC5idXR0b24sLnVpLmJpZy5idXR0b25zIC5vcntmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5idXR0b24sLnVpLmh1Z2UuYnV0dG9ucyAuYnV0dG9uLC51aS5odWdlLmJ1dHRvbnMgLm9ye2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLmJ1dHRvbiwudWkubWFzc2l2ZS5idXR0b25zIC5idXR0b24sLnVpLm1hc3NpdmUuYnV0dG9ucyAub3J7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LnVpLmljb24uYnV0dG9uLC51aS5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwYWRkaW5nOi43ODU3MTQyOWVtIC43ODU3MTQyOWVtIC43ODU3MTQyOWVtfS51aS5pY29uLmJ1dHRvbj4uaWNvbiwudWkuaWNvbi5idXR0b25zIC5idXR0b24+Lmljb257b3BhY2l0eTouOTttYXJnaW46MCFpbXBvcnRhbnQ7dmVydGljYWwtYWxpZ246dG9wfS51aS5iYXNpYy5idXR0b24sLnVpLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IG5vbmUhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjYpIWltcG9ydGFudDtmb250LXdlaWdodDo0MDA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJhc2ljLmJ1dHRvbnN7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS5iYXNpYy5idXR0b25zIC5idXR0b257Ym9yZGVyLXJhZGl1czowfS51aS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOiNmZmYhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjgpIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4zNSkgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOCkhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kOiNmOGY4ZjghaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjkpIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMCwwLDAsLjE1KSBpbnNldCwwIDFweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMTUpIGluc2V0LDAgMXB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OicnIWltcG9ydGFudDtib3gtc2hhZG93OicnIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS5iYXNpYy5hY3RpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDUpfS51aS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4zNSkgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0IGluc2V0fS51aS5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMTUpIGluc2V0LDAgMXB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldCBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDAsMCwwLC4xNSkgaW5zZXQsMCAxcHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0IGluc2V0fS51aS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzonJyFpbXBvcnRhbnQ7Ym94LXNoYWRvdzonJyFpbXBvcnRhbnR9LnVpLmJhc2ljLmludmVydGVkLmJ1dHRvbiwudWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2NvbG9yOiNmOWZhZmIhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudH0udWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5idXR0b246aG92ZXJ7Y29sb3I6I2ZmZiFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudH0udWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5idXR0b246Zm9jdXN7Y29sb3I6I2ZmZiFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudH0udWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjA4KSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC45KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuOSkgaW5zZXQhaW1wb3J0YW50fS51aS5iYXNpYy5pbnZlcnRlZC5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjcpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjcpIGluc2V0fS51aS5iYXNpYy5pbnZlcnRlZC5hY3RpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnR9LnVpLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbntib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuYmFzaWMudmVydGljYWwuYnV0dG9ucyAuYnV0dG9ue2JvcmRlci1sZWZ0Om5vbmV9LnVpLmJhc2ljLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbntib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuYmFzaWMudmVydGljYWwuYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MH0udWkubGFiZWxlZC5pY29uLmJ1dHRvbiwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLWxlZnQ6NC4wNzE0Mjg1N2VtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjEuNWVtIWltcG9ydGFudH0udWkubGFiZWxlZC5pY29uLmJ1dHRvbj4uaWNvbiwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnM+LmJ1dHRvbj4uaWNvbntwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTtsaW5lLWhlaWdodDoxO2JvcmRlci1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czppbmhlcml0O3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO3dpZHRoOjIuNTcxNDI4NTdlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjonJzstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCB0cmFuc3BhcmVudCBpbnNldDtib3gtc2hhZG93Oi0xcHggMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXR9LnVpLmxhYmVsZWQuaWNvbi5idXR0b24+Lmljb24sLnVpLmxhYmVsZWQuaWNvbi5idXR0b25zPi5idXR0b24+Lmljb257dG9wOjA7bGVmdDowfS51aVtjbGFzcyo9XFxcInJpZ2h0IGxhYmVsZWRcXFwiXS5pY29uLmJ1dHRvbntwYWRkaW5nLXJpZ2h0OjQuMDcxNDI4NTdlbSFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjEuNWVtIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaWNvbi5idXR0b24+Lmljb257bGVmdDphdXRvO3JpZ2h0OjA7Ym9yZGVyLXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6aW5oZXJpdDstd2Via2l0LWJveC1zaGFkb3c6MXB4IDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O2JveC1zaGFkb3c6MXB4IDAgMCAwIHRyYW5zcGFyZW50IGluc2V0fS51aS5sYWJlbGVkLmljb24uYnV0dG9uPi5pY29uOmFmdGVyLC51aS5sYWJlbGVkLmljb24uYnV0dG9uPi5pY29uOmJlZm9yZSwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnM+LmJ1dHRvbj4uaWNvbjphZnRlciwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnM+LmJ1dHRvbj4uaWNvbjpiZWZvcmV7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3RvcDo1MCU7dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0udWkubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbj4uaWNvbntib3JkZXItcmFkaXVzOjB9LnVpLmxhYmVsZWQuaWNvbi5idXR0b25zIC5idXR0b246Zmlyc3QtY2hpbGQ+Lmljb257Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLmxhYmVsZWQuaWNvbi5idXR0b25zIC5idXR0b246bGFzdC1jaGlsZD4uaWNvbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS52ZXJ0aWNhbC5sYWJlbGVkLmljb24uYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxkPi5pY29ue2JvcmRlci1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkudmVydGljYWwubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxkPi5pY29ue2JvcmRlci1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuZmx1aWRbY2xhc3MqPVxcXCJsZWZ0IGxhYmVsZWRcXFwiXS5pY29uLmJ1dHRvbiwudWkuZmx1aWRbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaWNvbi5idXR0b257cGFkZGluZy1sZWZ0OjEuNWVtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjEuNWVtIWltcG9ydGFudH0udWkuYnV0dG9uLnRvZ2dsZS5hY3RpdmUsLnVpLmJ1dHRvbnMgLmJ1dHRvbi50b2dnbGUuYWN0aXZlLC51aS50b2dnbGUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O3RleHQtc2hhZG93Om5vbmU7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJ1dHRvbi50b2dnbGUuYWN0aXZlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzE2YWIzOSFpbXBvcnRhbnQ7dGV4dC1zaGFkb3c6bm9uZTtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuY2lyY3VsYXIuYnV0dG9ue2JvcmRlci1yYWRpdXM6MTBlbX0udWkuY2lyY3VsYXIuYnV0dG9uPi5pY29ue3dpZHRoOjFlbTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkuYnV0dG9ucyAub3J7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6LjNlbTtoZWlnaHQ6Mi41NzE0Mjg1N2VtO3otaW5kZXg6M30udWkuYnV0dG9ucyAub3I6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1yYWRpdXM6NTAwcmVtO2NvbnRlbnQ6J29yJzt0b3A6NTAlO2xlZnQ6NTAlO2JhY2tncm91bmQtY29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO21hcmdpbi10b3A6LS44OTI4NTcxNGVtO21hcmdpbi1sZWZ0Oi0uODkyODU3MTRlbTt3aWR0aDoxLjc4NTcxNDI5ZW07aGVpZ2h0OjEuNzg1NzE0MjllbTtsaW5lLWhlaWdodDoxLjc4NTcxNDI5ZW07Y29sb3I6cmdiYSgwLDAsMCwuNCk7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NzAwOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXR9LnVpLmJ1dHRvbnMgLm9yW2RhdGEtdGV4dF06YmVmb3Jle2NvbnRlbnQ6YXR0cihkYXRhLXRleHQpfS51aS5mbHVpZC5idXR0b25zIC5vcnt3aWR0aDowIWltcG9ydGFudH0udWkuZmx1aWQuYnV0dG9ucyAub3I6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5hdHRhY2hlZC5idXR0b257cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSFpbXBvcnRhbnR9LnVpLmF0dGFjaGVkLnRvcC5idXR0b257Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuYXR0YWNoZWQuYm90dG9tLmJ1dHRvbntib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5sZWZ0LmF0dGFjaGVkLmJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItbGVmdDpub25lO3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZy1yaWdodDouNzVlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgLjI4NTcxNDI5cmVtfS51aS5yaWdodC5hdHRhY2hlZC5idXR0b257ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmctbGVmdDouNzVlbTtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aS5hdHRhY2hlZC5idXR0b25ze3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtib3JkZXItcmFkaXVzOjA7d2lkdGg6YXV0byFpbXBvcnRhbnQ7ei1pbmRleDoyO21hcmdpbi1sZWZ0Oi0xcHg7bWFyZ2luLXJpZ2h0Oi0xcHh9LnVpLmF0dGFjaGVkLmJ1dHRvbnMgLmJ1dHRvbnttYXJnaW46MH0udWkuYXR0YWNoZWQuYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6MH0udWkuYXR0YWNoZWQuYnV0dG9ucyAuYnV0dG9uOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLmJ1dHRvbnN7bWFyZ2luLWJvdHRvbTotMXB4O2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpW2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl0uYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAwfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gMCAwfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLmJ1dHRvbnN7bWFyZ2luLXRvcDotMXB4O2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl0uYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIDAgLjI4NTcxNDI5cmVtfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAwfS51aVtjbGFzcyo9XFxcImxlZnQgYXR0YWNoZWRcXFwiXS5idXR0b25ze2Rpc3BsYXk6aW5saW5lLWZsZXg7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aVtjbGFzcyo9XFxcImxlZnQgYXR0YWNoZWRcXFwiXS5idXR0b25zIC5idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIDAgMH0udWlbY2xhc3MqPVxcXCJsZWZ0IGF0dGFjaGVkXFxcIl0uYnV0dG9ucyAuYnV0dG9uOmxhc3QtY2hpbGR7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gMH0udWlbY2xhc3MqPVxcXCJyaWdodCBhdHRhY2hlZFxcXCJdLmJ1dHRvbnN7ZGlzcGxheTppbmxpbmUtZmxleDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDotMXB4O2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgYXR0YWNoZWRcXFwiXS5idXR0b25zIC5idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgMH0udWlbY2xhc3MqPVxcXCJyaWdodCBhdHRhY2hlZFxcXCJdLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLXJhZGl1czowIDAgMCAuMjg1NzE0MjlyZW19LnVpLmZsdWlkLmJ1dHRvbiwudWkuZmx1aWQuYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5mbHVpZC5idXR0b257ZGlzcGxheTpibG9ja30udWkudHdvLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkudHdvLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDo1MCV9LnVpLnRocmVlLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkudGhyZWUuYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjMzLjMzMyV9LnVpLmZvdXIuYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5mb3VyLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDoyNSV9LnVpLmZpdmUuYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5maXZlLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDoyMCV9LnVpLnNpeC5idXR0b25ze3dpZHRoOjEwMCV9LnVpLnNpeC5idXR0b25zPi5idXR0b257d2lkdGg6MTYuNjY2JX0udWkuc2V2ZW4uYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5zZXZlbi5idXR0b25zPi5idXR0b257d2lkdGg6MTQuMjg1JX0udWkuZWlnaHQuYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5laWdodC5idXR0b25zPi5idXR0b257d2lkdGg6MTIuNSV9LnVpLm5pbmUuYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5uaW5lLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDoxMS4xMSV9LnVpLnRlbi5idXR0b25ze3dpZHRoOjEwMCV9LnVpLnRlbi5idXR0b25zPi5idXR0b257d2lkdGg6MTAlfS51aS5lbGV2ZW4uYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5lbGV2ZW4uYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjkuMDklfS51aS50d2VsdmUuYnV0dG9uc3t3aWR0aDoxMDAlfS51aS50d2VsdmUuYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjguMzMzMyV9LnVpLmZsdWlkLnZlcnRpY2FsLmJ1dHRvbnMsLnVpLmZsdWlkLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntkaXNwbGF5OmZsZXg7d2lkdGg6YXV0b30udWkudHdvLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6NTAlfS51aS50aHJlZS52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjMzLjMzMyV9LnVpLmZvdXIudmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDoyNSV9LnVpLmZpdmUudmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDoyMCV9LnVpLnNpeC52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjE2LjY2NiV9LnVpLnNldmVuLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6MTQuMjg1JX0udWkuZWlnaHQudmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDoxMi41JX0udWkubmluZS52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjExLjExJX0udWkudGVuLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6MTAlfS51aS5lbGV2ZW4udmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDo5LjA5JX0udWkudHdlbHZlLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6OC4zMzMzJX0udWkuYmxhY2suYnV0dG9uLC51aS5ibGFjay5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLmJsYWNrLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuYmxhY2suYnV0dG9uOmhvdmVyLC51aS5ibGFjay5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjcyOTJhO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmxhY2suYnV0dG9uOmZvY3VzLC51aS5ibGFjay5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojMmYzMDMyO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmxhY2suYnV0dG9uOmFjdGl2ZSwudWkuYmxhY2suYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzNDM2Mzc7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ibGFjay5hY3RpdmUuYnV0dG9uLC51aS5ibGFjay5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5ibGFjay5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5ibGFjay5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMwZjBmMTA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5ibGFjay5idXR0b24sLnVpLmJhc2ljLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxYjFjMWQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxYjFjMWQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxYjFjMWQhaW1wb3J0YW50fS51aS5iYXNpYy5ibGFjay5idXR0b246aG92ZXIsLnVpLmJhc2ljLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMjcyOTJhIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMjcyOTJhIGluc2V0IWltcG9ydGFudDtjb2xvcjojMjcyOTJhIWltcG9ydGFudH0udWkuYmFzaWMuYmxhY2suYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5ibGFjay5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzJmMzAzMiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzJmMzAzMiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzI3MjkyYSFpbXBvcnRhbnR9LnVpLmJhc2ljLmJsYWNrLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLmJsYWNrLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzBmMGYxMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzBmMGYxMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzM0MzYzNyFpbXBvcnRhbnR9LnVpLmJhc2ljLmJsYWNrLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMzQzNjM3IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMzQzNjM3IGluc2V0IWltcG9ydGFudDtjb2xvcjojMzQzNjM3IWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMuYmxhY2suYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZDRkNGQ1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZDRkNGQ1IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5ibGFjay5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDAwfS51aS5pbnZlcnRlZC5ibGFjay5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9LnVpLmludmVydGVkLmJsYWNrLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMDAwfS51aS5pbnZlcnRlZC5ibGFjay5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzAwMH0udWkuaW52ZXJ0ZWQuYmxhY2suYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYmxhY2suYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMwMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMwMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMwMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMwMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NDU0NTQhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzAwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzAwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMDAwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMDAwIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuZ3JleS5idXR0b24sLnVpLmdyZXkuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6Izc2NzY3Njtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5ncmV5LmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuZ3JleS5idXR0b246aG92ZXIsLnVpLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzgzODM4Mztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmdyZXkuYnV0dG9uOmZvY3VzLC51aS5ncmV5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiM4YThhOGE7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ncmV5LmJ1dHRvbjphY3RpdmUsLnVpLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM5MDkwOTA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ncmV5LmFjdGl2ZS5idXR0b24sLnVpLmdyZXkuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkuZ3JleS5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5ncmV5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzY5Njk2OTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLmdyZXkuYnV0dG9uLC51aS5iYXNpYy5ncmV5LmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM3Njc2NzYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM3Njc2NzYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM3Njc2NzYhaW1wb3J0YW50fS51aS5iYXNpYy5ncmV5LmJ1dHRvbjpob3ZlciwudWkuYmFzaWMuZ3JleS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzgzODM4MyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzgzODM4MyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzgzODM4MyFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZXkuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5ncmV5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOGE4YThhIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOGE4YThhIGluc2V0IWltcG9ydGFudDtjb2xvcjojODM4MzgzIWltcG9ydGFudH0udWkuYmFzaWMuZ3JleS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5ncmV5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzY5Njk2OSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzY5Njk2OSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzkwOTA5MCFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZXkuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuZ3JleS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzkwOTA5MCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzkwOTA5MCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzkwOTA5MCFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLmdyZXkuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLmdyZXkuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Q0ZDRkNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Q0ZDRkNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuZ3JleS5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC42KX0udWkuaW52ZXJ0ZWQuZ3JleS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2NmZDBkMn0udWkuaW52ZXJ0ZWQuZ3JleS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2M3YzljYn0udWkuaW52ZXJ0ZWQuZ3JleS5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojY2ZkMGQyfS51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjMmM0YzV9LnVpLmludmVydGVkLmdyZXkuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmV5LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZXkuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ncmV5LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjY2ZkMGQyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjY2ZkMGQyIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZXkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2M3YzljYiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2M3YzljYiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2RjZGRkZSFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZXkuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjY2ZkMGQyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjY2ZkMGQyIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ncmV5LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNjMmM0YzUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNjMmM0YzUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5icm93bi5idXR0b24sLnVpLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNhNTY3M2Y7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkuYnJvd24uYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5icm93bi5idXR0b246aG92ZXIsLnVpLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5NzViMzM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5icm93bi5idXR0b246Zm9jdXMsLnVpLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiM5MDUzMmI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5icm93bi5idXR0b246YWN0aXZlLC51aS5icm93bi5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzgwNTAzMTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJyb3duLmFjdGl2ZS5idXR0b24sLnVpLmJyb3duLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLmJyb3duLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmJyb3duLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6Izk5NWEzMTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLmJyb3duLmJ1dHRvbiwudWkuYmFzaWMuYnJvd24uYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2E1NjczZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2E1NjczZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2E1NjczZiFpbXBvcnRhbnR9LnVpLmJhc2ljLmJyb3duLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM5NzViMzMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM5NzViMzMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM5NzViMzMhaW1wb3J0YW50fS51aS5iYXNpYy5icm93bi5idXR0b246Zm9jdXMsLnVpLmJhc2ljLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOTA1MzJiIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOTA1MzJiIGluc2V0IWltcG9ydGFudDtjb2xvcjojOTc1YjMzIWltcG9ydGFudH0udWkuYmFzaWMuYnJvd24uYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuYnJvd24uYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOTk1YTMxIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOTk1YTMxIGluc2V0IWltcG9ydGFudDtjb2xvcjojODA1MDMxIWltcG9ydGFudH0udWkuYmFzaWMuYnJvd24uYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM4MDUwMzEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM4MDUwMzEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM4MDUwMzEhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5icm93bi5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkNjdjMWMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkNjdjMWMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkNjdjMWN9LnVpLmludmVydGVkLmJyb3duLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5icm93bi5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjODZmMTF9LnVpLmludmVydGVkLmJyb3duLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2MxNjgwOH0udWkuaW52ZXJ0ZWQuYnJvd24uYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNjYzZmMGR9LnVpLmludmVydGVkLmJyb3duLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYTk2MjE2fS51aS5pbnZlcnRlZC5icm93bi5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLmJyb3duLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5icm93bi5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJyb3duLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2M4NmYxMSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2M4NmYxMSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q2N2MxYyFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJyb3duLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2MxNjgwOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2MxNjgwOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q2N2MxYyFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJyb3duLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmJyb3duLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjY2M2ZjBkIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjY2M2ZjBkIGluc2V0IWltcG9ydGFudDtjb2xvcjojZDY3YzFjIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNhOTYyMTYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNhOTYyMTYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkNjdjMWMhaW1wb3J0YW50fS51aS5ibHVlLmJ1dHRvbiwudWkuYmx1ZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLmJsdWUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5ibHVlLmJ1dHRvbjpob3ZlciwudWkuYmx1ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTY3OGMyO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmx1ZS5idXR0b246Zm9jdXMsLnVpLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzBkNzFiYjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJsdWUuYnV0dG9uOmFjdGl2ZSwudWkuYmx1ZS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzFhNjlhNDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJsdWUuYWN0aXZlLmJ1dHRvbiwudWkuYmx1ZS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5ibHVlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmJsdWUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMTI3OWM2O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMuYmx1ZS5idXR0b24sLnVpLmJhc2ljLmJsdWUuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzIxODVkMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzIxODVkMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzIxODVkMCFpbXBvcnRhbnR9LnVpLmJhc2ljLmJsdWUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTY3OGMyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTY3OGMyIGluc2V0IWltcG9ydGFudDtjb2xvcjojMTY3OGMyIWltcG9ydGFudH0udWkuYmFzaWMuYmx1ZS5idXR0b246Zm9jdXMsLnVpLmJhc2ljLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMwZDcxYmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMwZDcxYmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxNjc4YzIhaW1wb3J0YW50fS51aS5iYXNpYy5ibHVlLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLmJsdWUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTI3OWM2IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTI3OWM2IGluc2V0IWltcG9ydGFudDtjb2xvcjojMWE2OWE0IWltcG9ydGFudH0udWkuYmFzaWMuYmx1ZS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMWE2OWE0IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMWE2OWE0IGluc2V0IWltcG9ydGFudDtjb2xvcjojMWE2OWE0IWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMuYmx1ZS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b24sLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNTRjOGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNTRjOGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmfS51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmJsdWUuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsdWUuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLmJsdWUuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzYWMwZmZ9LnVpLmludmVydGVkLmJsdWUuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMyYmJiZmZ9LnVpLmludmVydGVkLmJsdWUuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzNhYzBmZn0udWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMjFiOGZmfS51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmx1ZS5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYmx1ZS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsdWUuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMyYmJiZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyYmJiZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NGM4ZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmJsdWUuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsdWUuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmx1ZS5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMjFiOGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMjFiOGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmIWltcG9ydGFudH0udWkuZ3JlZW4uYnV0dG9uLC51aS5ncmVlbi5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLmdyZWVuLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuZ3JlZW4uYnV0dG9uOmhvdmVyLC51aS5ncmVlbi5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTZhYjM5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuZ3JlZW4uYnV0dG9uOmZvY3VzLC51aS5ncmVlbi5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojMGVhNDMyO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuZ3JlZW4uYnV0dG9uOmFjdGl2ZSwudWkuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxOThmMzU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ncmVlbi5hY3RpdmUuYnV0dG9uLC51aS5ncmVlbi5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5ncmVlbi5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5ncmVlbi5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxM2FlMzg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5ncmVlbi5idXR0b24sLnVpLmJhc2ljLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyMWJhNDUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyMWJhNDUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyMWJhNDUhaW1wb3J0YW50fS51aS5iYXNpYy5ncmVlbi5idXR0b246aG92ZXIsLnVpLmJhc2ljLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTZhYjM5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTZhYjM5IGluc2V0IWltcG9ydGFudDtjb2xvcjojMTZhYjM5IWltcG9ydGFudH0udWkuYmFzaWMuZ3JlZW4uYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5ncmVlbi5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzBlYTQzMiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzBlYTQzMiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE2YWIzOSFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZWVuLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLmdyZWVuLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzEzYWUzOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzEzYWUzOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE5OGYzNSFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZWVuLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTk4ZjM1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTk4ZjM1IGluc2V0IWltcG9ydGFudDtjb2xvcjojMTk4ZjM1IWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMuZ3JlZW4uYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMmVjYzQwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMmVjYzQwIGluc2V0IWltcG9ydGFudDtjb2xvcjojMmVjYzQwfS51aS5pbnZlcnRlZC5ncmVlbi5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjJiZTM0fS51aS5pbnZlcnRlZC5ncmVlbi5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMxOWI4MmJ9LnVpLmludmVydGVkLmdyZWVuLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMWZjMjMxfS51aS5pbnZlcnRlZC5ncmVlbi5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzI1YTIzM30udWkuaW52ZXJ0ZWQuZ3JlZW4uYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JlZW4uYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMyMmJlMzQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyMmJlMzQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyZWNjNDAhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMxOWI4MmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMxOWI4MmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyZWNjNDAhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzFmYzIzMSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzFmYzIzMSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzJlY2M0MCFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMjVhMjMzIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMjVhMjMzIGluc2V0IWltcG9ydGFudDtjb2xvcjojMmVjYzQwIWltcG9ydGFudH0udWkub3JhbmdlLmJ1dHRvbiwudWkub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNmMjcxMWM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkub3JhbmdlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkub3JhbmdlLmJ1dHRvbjpob3ZlciwudWkub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMjYyMDI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5vcmFuZ2UuYnV0dG9uOmZvY3VzLC51aS5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2U1NWIwMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm9yYW5nZS5idXR0b246YWN0aXZlLC51aS5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjZjU5MGM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5vcmFuZ2UuYWN0aXZlLmJ1dHRvbiwudWkub3JhbmdlLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLm9yYW5nZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5vcmFuZ2UuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZjU2MTAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMub3JhbmdlLmJ1dHRvbiwudWkuYmFzaWMub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNmMjcxMWMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmMjcxMWMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmMjcxMWMhaW1wb3J0YW50fS51aS5iYXNpYy5vcmFuZ2UuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNmMjYyMDIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmMjYyMDIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmMjYyMDIhaW1wb3J0YW50fS51aS5iYXNpYy5vcmFuZ2UuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlNTViMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlNTViMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmMjYyMDIhaW1wb3J0YW50fS51aS5iYXNpYy5vcmFuZ2UuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMub3JhbmdlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Y1NjEwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2Y1NjEwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2NmNTkwYyFpbXBvcnRhbnR9LnVpLmJhc2ljLm9yYW5nZS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNjZjU5MGMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNjZjU5MGMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNjZjU5MGMhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5vcmFuZ2UuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLm9yYW5nZS5idXR0b24sLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjg1MWIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjg1MWIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjg1MWJ9LnVpLmludmVydGVkLm9yYW5nZS5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLm9yYW5nZS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY3NzAxfS51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2YxNzAwMH0udWkuaW52ZXJ0ZWQub3JhbmdlLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2ZmNzcwMX0udWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2U3NmIwMH0udWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjc3MDEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjc3MDEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjg1MWIhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2YxNzAwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2YxNzAwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmODUxYiFpbXBvcnRhbnR9LnVpLmludmVydGVkLm9yYW5nZS5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY3NzAxIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY3NzAxIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY4NTFiIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9yYW5nZS5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNlNzZiMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNlNzZiMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjg1MWIhaW1wb3J0YW50fS51aS5waW5rLmJ1dHRvbiwudWkucGluay5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZTAzOTk3O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnBpbmsuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5waW5rLmJ1dHRvbjpob3ZlciwudWkucGluay5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTYxYThkO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucGluay5idXR0b246Zm9jdXMsLnVpLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2UxMGY4NTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnBpbmsuYnV0dG9uOmFjdGl2ZSwudWkucGluay5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2M3MWY3ZTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnBpbmsuYWN0aXZlLmJ1dHRvbiwudWkucGluay5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5waW5rLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLnBpbmsuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZWExNThkO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMucGluay5idXR0b24sLnVpLmJhc2ljLnBpbmsuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2UwMzk5NyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2UwMzk5NyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2UwMzk5NyFpbXBvcnRhbnR9LnVpLmJhc2ljLnBpbmsuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5waW5rLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZTYxYThkIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZTYxYThkIGluc2V0IWltcG9ydGFudDtjb2xvcjojZTYxYThkIWltcG9ydGFudH0udWkuYmFzaWMucGluay5idXR0b246Zm9jdXMsLnVpLmJhc2ljLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlMTBmODUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlMTBmODUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNlNjFhOGQhaW1wb3J0YW50fS51aS5iYXNpYy5waW5rLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnBpbmsuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZWExNThkIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZWExNThkIGluc2V0IWltcG9ydGFudDtjb2xvcjojYzcxZjdlIWltcG9ydGFudH0udWkuYmFzaWMucGluay5idXR0b246YWN0aXZlLC51aS5iYXNpYy5waW5rLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYzcxZjdlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYzcxZjdlIGluc2V0IWltcG9ydGFudDtjb2xvcjojYzcxZjdlIWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucGluay5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQucGluay5idXR0b24sLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY4ZWRmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY4ZWRmIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY4ZWRmfS51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnBpbmsuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucGluay5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnBpbmsuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnBpbmsuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjc0ZDh9LnVpLmludmVydGVkLnBpbmsuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNmZjY1ZDN9LnVpLmludmVydGVkLnBpbmsuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2ZmNzRkOH0udWkuaW52ZXJ0ZWQucGluay5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZmY1YmQxfS51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucGluay5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucGluay5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmNzRkOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmNzRkOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmOGVkZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnBpbmsuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjY1ZDMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjY1ZDMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjhlZGYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnBpbmsuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmNzRkOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmNzRkOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmOGVkZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnBpbmsuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucGluay5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY1YmQxIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY1YmQxIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY4ZWRmIWltcG9ydGFudH0udWkudmlvbGV0LmJ1dHRvbiwudWkudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM2NDM1Yzk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkudmlvbGV0LmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkudmlvbGV0LmJ1dHRvbjpob3ZlciwudWkudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM1ODI5YmI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS52aW9sZXQuYnV0dG9uOmZvY3VzLC51aS52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzRmMjBiNTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnZpb2xldC5idXR0b246YWN0aXZlLC51aS52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM1MDJhYTE7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS52aW9sZXQuYWN0aXZlLmJ1dHRvbiwudWkudmlvbGV0LmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLnZpb2xldC5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS52aW9sZXQuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNTYyNmJmO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMudmlvbGV0LmJ1dHRvbiwudWkuYmFzaWMudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM2NDM1YzkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM2NDM1YzkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM2NDM1YzkhaW1wb3J0YW50fS51aS5iYXNpYy52aW9sZXQuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM1ODI5YmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM1ODI5YmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1ODI5YmIhaW1wb3J0YW50fS51aS5iYXNpYy52aW9sZXQuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM0ZjIwYjUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM0ZjIwYjUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1ODI5YmIhaW1wb3J0YW50fS51aS5iYXNpYy52aW9sZXQuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMudmlvbGV0LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzU2MjZiZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzU2MjZiZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzUwMmFhMSFpbXBvcnRhbnR9LnVpLmJhc2ljLnZpb2xldC5idXR0b246YWN0aXZlLC51aS5iYXNpYy52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM1MDJhYTEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM1MDJhYTEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1MDJhYTEhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy52aW9sZXQuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLnZpb2xldC5idXR0b24sLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNhMjkxZmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNhMjkxZmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNhMjkxZmJ9LnVpLmludmVydGVkLnZpb2xldC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnZpb2xldC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojOGE3M2ZmfS51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzdkNjRmZn0udWkuaW52ZXJ0ZWQudmlvbGV0LmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzhhNzNmZn0udWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6Izc4NjBmOX0udWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM4YTczZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM4YTczZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNhMjkxZmIhaW1wb3J0YW50fS51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzdkNjRmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzdkNjRmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2EyOTFmYiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnZpb2xldC5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjOGE3M2ZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjOGE3M2ZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojYTI5MWZiIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnZpb2xldC5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM3ODYwZjkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM3ODYwZjkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNhMjkxZmIhaW1wb3J0YW50fS51aS5wdXJwbGUuYnV0dG9uLC51aS5wdXJwbGUuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2EzMzNjODtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5wdXJwbGUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5wdXJwbGUuYnV0dG9uOmhvdmVyLC51aS5wdXJwbGUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izk2MjdiYTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnB1cnBsZS5idXR0b246Zm9jdXMsLnVpLnB1cnBsZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojOGYxZWI0O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucHVycGxlLmJ1dHRvbjphY3RpdmUsLnVpLnB1cnBsZS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzgyMjk5Zjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnB1cnBsZS5hY3RpdmUuYnV0dG9uLC51aS5wdXJwbGUuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkucHVycGxlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLnB1cnBsZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM5NzI0YmU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5wdXJwbGUuYnV0dG9uLC51aS5iYXNpYy5wdXJwbGUuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2EzMzNjOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2EzMzNjOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2EzMzNjOCFpbXBvcnRhbnR9LnVpLmJhc2ljLnB1cnBsZS5idXR0b246aG92ZXIsLnVpLmJhc2ljLnB1cnBsZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzk2MjdiYSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzk2MjdiYSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6Izk2MjdiYSFpbXBvcnRhbnR9LnVpLmJhc2ljLnB1cnBsZS5idXR0b246Zm9jdXMsLnVpLmJhc2ljLnB1cnBsZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzhmMWViNCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzhmMWViNCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6Izk2MjdiYSFpbXBvcnRhbnR9LnVpLmJhc2ljLnB1cnBsZS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5wdXJwbGUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOTcyNGJlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOTcyNGJlIGluc2V0IWltcG9ydGFudDtjb2xvcjojODIyOTlmIWltcG9ydGFudH0udWkuYmFzaWMucHVycGxlLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLnB1cnBsZS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzgyMjk5ZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzgyMjk5ZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzgyMjk5ZiFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnB1cnBsZS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2RjNzNmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2RjNzNmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2RjNzNmZn0udWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNkNjVhZmZ9LnVpLmludmVydGVkLnB1cnBsZS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZDI0YWZmfS51aS5pbnZlcnRlZC5wdXJwbGUuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZDY1YWZmfS51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojY2Y0MGZmfS51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Q2NWFmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Q2NWFmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2RjNzNmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZDI0YWZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZDI0YWZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojZGM3M2ZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucHVycGxlLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkNjVhZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkNjVhZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkYzczZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHVycGxlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2NmNDBmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2NmNDBmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2RjNzNmZiFpbXBvcnRhbnR9LnVpLnJlZC5idXR0b24sLnVpLnJlZC5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZGIyODI4O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnJlZC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnJlZC5idXR0b246aG92ZXIsLnVpLnJlZC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDAxOTE5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucmVkLmJ1dHRvbjpmb2N1cywudWkucmVkLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNjYTEwMTA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5yZWQuYnV0dG9uOmFjdGl2ZSwudWkucmVkLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYjIxZTFlO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucmVkLmFjdGl2ZS5idXR0b24sLnVpLnJlZC5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5yZWQuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkucmVkLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2Q0MTUxNTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnJlZC5idXR0b24sLnVpLmJhc2ljLnJlZC5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZGIyODI4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZGIyODI4IGluc2V0IWltcG9ydGFudDtjb2xvcjojZGIyODI4IWltcG9ydGFudH0udWkuYmFzaWMucmVkLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMucmVkLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZDAxOTE5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDAxOTE5IGluc2V0IWltcG9ydGFudDtjb2xvcjojZDAxOTE5IWltcG9ydGFudH0udWkuYmFzaWMucmVkLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMucmVkLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjY2ExMDEwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjY2ExMDEwIGluc2V0IWltcG9ydGFudDtjb2xvcjojZDAxOTE5IWltcG9ydGFudH0udWkuYmFzaWMucmVkLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnJlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNDE1MTUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNDE1MTUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNiMjFlMWUhaW1wb3J0YW50fS51aS5iYXNpYy5yZWQuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMucmVkLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYjIxZTFlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYjIxZTFlIGluc2V0IWltcG9ydGFudDtjb2xvcjojYjIxZTFlIWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucmVkLmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5yZWQuYnV0dG9uLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY2OTVlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY2OTVlIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY2OTVlfS51aS5pbnZlcnRlZC5yZWQuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnJlZC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnJlZC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5yZWQuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmNTE0NH0udWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNmZjQzMzV9LnVpLmludmVydGVkLnJlZC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNmZjUxNDR9LnVpLmludmVydGVkLnJlZC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjM5MmJ9LnVpLmludmVydGVkLnJlZC5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLnJlZC5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnJlZC5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnJlZC5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY1MTQ0IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY1MTQ0IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY2OTVlIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjQzMzUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjQzMzUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjY5NWUhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5yZWQuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmNTE0NCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmNTE0NCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmNjk1ZSFpbXBvcnRhbnR9LnVpLmludmVydGVkLnJlZC5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5yZWQuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmYzOTJiIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmYzOTJiIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY2OTVlIWltcG9ydGFudH0udWkudGVhbC5idXR0b24sLnVpLnRlYWwuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzAwYjVhZDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS50ZWFsLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkudGVhbC5idXR0b246aG92ZXIsLnVpLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwOWM5NTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnRlYWwuYnV0dG9uOmZvY3VzLC51aS50ZWFsLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMwMDhjODY7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS50ZWFsLmJ1dHRvbjphY3RpdmUsLnVpLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDgyN2M7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS50ZWFsLmFjdGl2ZS5idXR0b24sLnVpLnRlYWwuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkudGVhbC5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS50ZWFsLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzAwOWM5NTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnRlYWwuYnV0dG9uLC51aS5iYXNpYy50ZWFsLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMwMGI1YWQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMwMGI1YWQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMwMGI1YWQhaW1wb3J0YW50fS51aS5iYXNpYy50ZWFsLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMudGVhbC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzAwOWM5NSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzAwOWM5NSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzAwOWM5NSFpbXBvcnRhbnR9LnVpLmJhc2ljLnRlYWwuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy50ZWFsLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMDA4Yzg2IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMDA4Yzg2IGluc2V0IWltcG9ydGFudDtjb2xvcjojMDA5Yzk1IWltcG9ydGFudH0udWkuYmFzaWMudGVhbC5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy50ZWFsLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzAwOWM5NSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzAwOWM5NSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzAwODI3YyFpbXBvcnRhbnR9LnVpLmJhc2ljLnRlYWwuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMudGVhbC5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzAwODI3YyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzAwODI3YyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzAwODI3YyFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnRlYWwuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLnRlYWwuYnV0dG9uLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzZkZmZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzZkZmZmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzZkZmZmZn0udWkuaW52ZXJ0ZWQudGVhbC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC42KX0udWkuaW52ZXJ0ZWQudGVhbC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzU0ZmZmZn0udWkuaW52ZXJ0ZWQudGVhbC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzRmZn0udWkuaW52ZXJ0ZWQudGVhbC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojNTRmZmZmfS51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzYWZmZmZ9LnVpLmludmVydGVkLnRlYWwuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC50ZWFsLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnRlYWwuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC50ZWFsLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNTRmZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNTRmZmZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNmRmZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnRlYWwuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzRmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzRmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzZkZmZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnRlYWwuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNTRmZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNTRmZmZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNmRmZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC50ZWFsLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMzYWZmZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMzYWZmZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM2ZGZmZmYhaW1wb3J0YW50fS51aS5vbGl2ZS5idXR0b24sLnVpLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNiNWNjMTg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkub2xpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5vbGl2ZS5idXR0b246aG92ZXIsLnVpLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhN2JkMGQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5vbGl2ZS5idXR0b246Zm9jdXMsLnVpLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNhMGI2MDU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5vbGl2ZS5idXR0b246YWN0aXZlLC51aS5vbGl2ZS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzhkOWUxMztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm9saXZlLmFjdGl2ZS5idXR0b24sLnVpLm9saXZlLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLm9saXZlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLm9saXZlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2FhYzEwOTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLm9saXZlLmJ1dHRvbiwudWkuYmFzaWMub2xpdmUuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2I1Y2MxOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2I1Y2MxOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2I1Y2MxOCFpbXBvcnRhbnR9LnVpLmJhc2ljLm9saXZlLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhN2JkMGQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNhN2JkMGQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNhN2JkMGQhaW1wb3J0YW50fS51aS5iYXNpYy5vbGl2ZS5idXR0b246Zm9jdXMsLnVpLmJhc2ljLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTBiNjA1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTBiNjA1IGluc2V0IWltcG9ydGFudDtjb2xvcjojYTdiZDBkIWltcG9ydGFudH0udWkuYmFzaWMub2xpdmUuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMub2xpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYWFjMTA5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYWFjMTA5IGluc2V0IWltcG9ydGFudDtjb2xvcjojOGQ5ZTEzIWltcG9ydGFudH0udWkuYmFzaWMub2xpdmUuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM4ZDllMTMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM4ZDllMTMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM4ZDllMTMhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5vbGl2ZS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkOWU3NzggaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkOWU3NzggaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkOWU3Nzh9LnVpLmludmVydGVkLm9saXZlLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC42KX0udWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDhlYTVjfS51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNkYWVmNDd9LnVpLmludmVydGVkLm9saXZlLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZGFlZDU5fS51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2NkZGY0ZH0udWkuaW52ZXJ0ZWQub2xpdmUuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQub2xpdmUuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkOGVhNWMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkOGVhNWMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkOWU3NzghaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkYWVmNDcgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkYWVmNDcgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkOWU3NzghaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2RhZWQ1OSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2RhZWQ1OSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q5ZTc3OCFpbXBvcnRhbnR9LnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjY2RkZjRkIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjY2RkZjRkIGluc2V0IWltcG9ydGFudDtjb2xvcjojZDllNzc4IWltcG9ydGFudH0udWkueWVsbG93LmJ1dHRvbiwudWkueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNmYmJkMDg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkueWVsbG93LmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkueWVsbG93LmJ1dHRvbjpob3ZlciwudWkueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlYWFlMDA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS55ZWxsb3cuYnV0dG9uOmZvY3VzLC51aS55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2RhYTMwMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnllbGxvdy5idXR0b246YWN0aXZlLC51aS55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjZDk5MDM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS55ZWxsb3cuYWN0aXZlLmJ1dHRvbiwudWkueWVsbG93LmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLnllbGxvdy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS55ZWxsb3cuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZWFhZTAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMueWVsbG93LmJ1dHRvbiwudWkuYmFzaWMueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNmYmJkMDggaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmYmJkMDggaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmYmJkMDghaW1wb3J0YW50fS51aS5iYXNpYy55ZWxsb3cuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlYWFlMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlYWFlMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNlYWFlMDAhaW1wb3J0YW50fS51aS5iYXNpYy55ZWxsb3cuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkYWEzMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkYWEzMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNlYWFlMDAhaW1wb3J0YW50fS51aS5iYXNpYy55ZWxsb3cuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMueWVsbG93LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2VhYWUwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2VhYWUwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2NkOTkwMyFpbXBvcnRhbnR9LnVpLmJhc2ljLnllbGxvdy5idXR0b246YWN0aXZlLC51aS5iYXNpYy55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNjZDk5MDMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNjZDk5MDMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNjZDk5MDMhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy55ZWxsb3cuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLnllbGxvdy5idXR0b24sLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZmUyMWYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZmUyMWYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmUyMWZ9LnVpLmludmVydGVkLnllbGxvdy5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZGYwNX0udWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNmNWQ1MDB9LnVpLmludmVydGVkLnllbGxvdy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNmZmRmMDV9LnVpLmludmVydGVkLnllbGxvdy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNlYmNkMDB9LnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZkZjA1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZkZjA1IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZlMjFmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmNWQ1MDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmNWQ1MDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmUyMWYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC55ZWxsb3cuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZGYwNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZGYwNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZTIxZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC55ZWxsb3cuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZWJjZDAwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZWJjZDAwIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZlMjFmIWltcG9ydGFudH0udWkucHJpbWFyeS5idXR0b24sLnVpLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzIxODVkMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5wcmltYXJ5LmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkucHJpbWFyeS5idXR0b246aG92ZXIsLnVpLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzE2NzhjMjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnByaW1hcnkuYnV0dG9uOmZvY3VzLC51aS5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMwZDcxYmI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5wcmltYXJ5LmJ1dHRvbjphY3RpdmUsLnVpLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxYTY5YTQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5wcmltYXJ5LmFjdGl2ZS5idXR0b24sLnVpLnByaW1hcnkuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkucHJpbWFyeS5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5wcmltYXJ5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzEyNzljNjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnByaW1hcnkuYnV0dG9uLC51aS5iYXNpYy5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyMTg1ZDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyMTg1ZDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyMTg1ZDAhaW1wb3J0YW50fS51aS5iYXNpYy5wcmltYXJ5LmJ1dHRvbjpob3ZlciwudWkuYmFzaWMucHJpbWFyeS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzE2NzhjMiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzE2NzhjMiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE2NzhjMiFpbXBvcnRhbnR9LnVpLmJhc2ljLnByaW1hcnkuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMGQ3MWJiIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMGQ3MWJiIGluc2V0IWltcG9ydGFudDtjb2xvcjojMTY3OGMyIWltcG9ydGFudH0udWkuYmFzaWMucHJpbWFyeS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5wcmltYXJ5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzEyNzljNiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzEyNzljNiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzFhNjlhNCFpbXBvcnRhbnR9LnVpLmJhc2ljLnByaW1hcnkuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMucHJpbWFyeS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzFhNjlhNCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzFhNjlhNCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzFhNjlhNCFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnByaW1hcnkuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzU0YzhmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzU0YzhmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZn0udWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojM2FjMGZmfS51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojMmJiYmZmfS51aS5pbnZlcnRlZC5wcmltYXJ5LmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMzYWMwZmZ9LnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzIxYjhmZn0udWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLnByaW1hcnkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnByaW1hcnkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMzYWMwZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMzYWMwZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NGM4ZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMmJiYmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMmJiYmZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMzYWMwZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMzYWMwZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NGM4ZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnByaW1hcnkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzIxYjhmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzIxYjhmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5idXR0b24sLnVpLnNlY29uZGFyeS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnNlY29uZGFyeS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnNlY29uZGFyeS5idXR0b246aG92ZXIsLnVpLnNlY29uZGFyeS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjcyOTJhO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuc2Vjb25kYXJ5LmJ1dHRvbjpmb2N1cywudWkuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMyZTMwMzI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5zZWNvbmRhcnkuYnV0dG9uOmFjdGl2ZSwudWkuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMzQzNjM3O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuc2Vjb25kYXJ5LmFjdGl2ZS5idXR0b24sLnVpLnNlY29uZGFyeS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5zZWNvbmRhcnkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuc2Vjb25kYXJ5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzI3MjkyYTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnNlY29uZGFyeS5idXR0b24sLnVpLmJhc2ljLnNlY29uZGFyeS5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMWIxYzFkIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMWIxYzFkIGluc2V0IWltcG9ydGFudDtjb2xvcjojMWIxYzFkIWltcG9ydGFudH0udWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbjpob3ZlciwudWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMjcyOTJhIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMjcyOTJhIGluc2V0IWltcG9ydGFudDtjb2xvcjojMjcyOTJhIWltcG9ydGFudH0udWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbjpmb2N1cywudWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMmUzMDMyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMmUzMDMyIGluc2V0IWltcG9ydGFudDtjb2xvcjojMjcyOTJhIWltcG9ydGFudH0udWkuYmFzaWMuc2Vjb25kYXJ5LmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnNlY29uZGFyeS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyNzI5MmEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyNzI5MmEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMzNDM2MzchaW1wb3J0YW50fS51aS5iYXNpYy5zZWNvbmRhcnkuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMzQzNjM3IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMzQzNjM3IGluc2V0IWltcG9ydGFudDtjb2xvcjojMzQzNjM3IWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucHJpbWFyeS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbiwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzU0NTQ1NCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzU0NTQ1NCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0NTQ1NH0udWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjF9LnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNjg2ODY4fS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxfS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNmU2ZTZlfS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzYxNjE2MSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzYxNjE2MSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9LnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNjg2ODY4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNjg2ODY4IGluc2V0IWltcG9ydGFudDtjb2xvcjojNTQ1NDU0IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM2MTYxNjEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM2MTYxNjEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NDU0NTQhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzZlNmU2ZSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzZlNmU2ZSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9LnVpLnBvc2l0aXZlLmJ1dHRvbiwudWkucG9zaXRpdmUuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzIxYmE0NTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5wb3NpdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnBvc2l0aXZlLmJ1dHRvbjpob3ZlciwudWkucG9zaXRpdmUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzE2YWIzOTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnBvc2l0aXZlLmJ1dHRvbjpmb2N1cywudWkucG9zaXRpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzBlYTQzMjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnBvc2l0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLnBvc2l0aXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMTk4ZjM1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucG9zaXRpdmUuYWN0aXZlLmJ1dHRvbiwudWkucG9zaXRpdmUuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkucG9zaXRpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkucG9zaXRpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMTNhZTM4O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMucG9zaXRpdmUuYnV0dG9uLC51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMjFiYTQ1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMjFiYTQ1IGluc2V0IWltcG9ydGFudDtjb2xvcjojMjFiYTQ1IWltcG9ydGFudH0udWkuYmFzaWMucG9zaXRpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzE2YWIzOSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzE2YWIzOSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE2YWIzOSFpbXBvcnRhbnR9LnVpLmJhc2ljLnBvc2l0aXZlLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMucG9zaXRpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMwZWE0MzIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMwZWE0MzIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxNmFiMzkhaW1wb3J0YW50fS51aS5iYXNpYy5wb3NpdGl2ZS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxM2FlMzggaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxM2FlMzggaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxOThmMzUhaW1wb3J0YW50fS51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzE5OGYzNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzE5OGYzNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE5OGYzNSFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnByaW1hcnkuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLm5lZ2F0aXZlLmJ1dHRvbiwudWkubmVnYXRpdmUuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2RiMjgyODtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5uZWdhdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLm5lZ2F0aXZlLmJ1dHRvbjpob3ZlciwudWkubmVnYXRpdmUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2QwMTkxOTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm5lZ2F0aXZlLmJ1dHRvbjpmb2N1cywudWkubmVnYXRpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2NhMTAxMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm5lZ2F0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLm5lZ2F0aXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYjIxZTFlO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkubmVnYXRpdmUuYWN0aXZlLmJ1dHRvbiwudWkubmVnYXRpdmUuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkubmVnYXRpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkubmVnYXRpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZDQxNTE1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMubmVnYXRpdmUuYnV0dG9uLC51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZGIyODI4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZGIyODI4IGluc2V0IWltcG9ydGFudDtjb2xvcjojZGIyODI4IWltcG9ydGFudH0udWkuYmFzaWMubmVnYXRpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2QwMTkxOSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2QwMTkxOSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2QwMTkxOSFpbXBvcnRhbnR9LnVpLmJhc2ljLm5lZ2F0aXZlLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMubmVnYXRpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNjYTEwMTAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNjYTEwMTAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkMDE5MTkhaW1wb3J0YW50fS51aS5iYXNpYy5uZWdhdGl2ZS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNDE1MTUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNDE1MTUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNiMjFlMWUhaW1wb3J0YW50fS51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2IyMWUxZSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2IyMWUxZSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2IyMWUxZSFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnByaW1hcnkuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmJ1dHRvbnN7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7Zm9udC1zaXplOjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7bWFyZ2luOjAgLjI1ZW0gMCAwfS51aS5idXR0b25zOm5vdCguYmFzaWMpOm5vdCguaW52ZXJ0ZWQpey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuYnV0dG9uczphZnRlcntjb250ZW50OlxcXCIuXFxcIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59LnVpLmJ1dHRvbnMgLmJ1dHRvbntmbGV4OjEgMCBhdXRvO21hcmdpbjowO2JvcmRlci1yYWRpdXM6MDttYXJnaW46MH0udWkuYnV0dG9uczpub3QoLmJhc2ljKTpub3QoLmludmVydGVkKT4uYnV0dG9uLC51aS5idXR0b25zPi51aS5idXR0b246bm90KC5iYXNpYyk6bm90KC5pbnZlcnRlZCl7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0Om5vbmU7bWFyZ2luLWxlZnQ6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuYnV0dG9ucyAuYnV0dG9uOmxhc3QtY2hpbGR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkudmVydGljYWwuYnV0dG9uc3tkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWkudmVydGljYWwuYnV0dG9ucyAuYnV0dG9ue2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bm9uZTt3aWR0aDoxMDAlO21hcmdpbjowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXItcmFkaXVzOjB9LnVpLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbjpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbjpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBDb250YWluZXJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5jb250YWluZXJ7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnR9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuY29udGFpbmVye3dpZHRoOmF1dG8haW1wb3J0YW50O21hcmdpbi1sZWZ0OjFlbSFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjFlbSFpbXBvcnRhbnR9LnVpLmdyaWQuY29udGFpbmVye3dpZHRoOmF1dG8haW1wb3J0YW50fS51aS5yZWxheGVkLmdyaWQuY29udGFpbmVye3dpZHRoOmF1dG8haW1wb3J0YW50fS51aS52ZXJ5LnJlbGF4ZWQuZ3JpZC5jb250YWluZXJ7d2lkdGg6YXV0byFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS5jb250YWluZXJ7d2lkdGg6NzIzcHg7bWFyZ2luLWxlZnQ6YXV0byFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OmF1dG8haW1wb3J0YW50fS51aS5ncmlkLmNvbnRhaW5lcnt3aWR0aDpjYWxjKDcyM3B4ICsgMnJlbSkhaW1wb3J0YW50fS51aS5yZWxheGVkLmdyaWQuY29udGFpbmVye3dpZHRoOmNhbGMoNzIzcHggKyAzcmVtKSFpbXBvcnRhbnR9LnVpLnZlcnkucmVsYXhlZC5ncmlkLmNvbnRhaW5lcnt3aWR0aDpjYWxjKDcyM3B4ICsgNXJlbSkhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnVpLmNvbnRhaW5lcnt3aWR0aDo5MzNweDttYXJnaW4tbGVmdDphdXRvIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6YXV0byFpbXBvcnRhbnR9LnVpLmdyaWQuY29udGFpbmVye3dpZHRoOmNhbGMoOTMzcHggKyAycmVtKSFpbXBvcnRhbnR9LnVpLnJlbGF4ZWQuZ3JpZC5jb250YWluZXJ7d2lkdGg6Y2FsYyg5MzNweCArIDNyZW0pIWltcG9ydGFudH0udWkudmVyeS5yZWxheGVkLmdyaWQuY29udGFpbmVye3dpZHRoOmNhbGMoOTMzcHggKyA1cmVtKSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMjAwcHgpey51aS5jb250YWluZXJ7d2lkdGg6MTEyN3B4O21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50O21hcmdpbi1yaWdodDphdXRvIWltcG9ydGFudH0udWkuZ3JpZC5jb250YWluZXJ7d2lkdGg6Y2FsYygxMTI3cHggKyAycmVtKSFpbXBvcnRhbnR9LnVpLnJlbGF4ZWQuZ3JpZC5jb250YWluZXJ7d2lkdGg6Y2FsYygxMTI3cHggKyAzcmVtKSFpbXBvcnRhbnR9LnVpLnZlcnkucmVsYXhlZC5ncmlkLmNvbnRhaW5lcnt3aWR0aDpjYWxjKDExMjdweCArIDVyZW0pIWltcG9ydGFudH19LnVpLnRleHQuY29udGFpbmVye2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjttYXgtd2lkdGg6NzAwcHghaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjEuNX0udWkudGV4dC5jb250YWluZXJ7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmZsdWlkLmNvbnRhaW5lcnt3aWR0aDoxMDAlfS51aVtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLmNvbnRhaW5lcnt0ZXh0LWFsaWduOmxlZnR9LnVpW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXS5jb250YWluZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmNvbnRhaW5lcnt0ZXh0LWFsaWduOnJpZ2h0fS51aS5qdXN0aWZpZWQuY29udGFpbmVye3RleHQtYWxpZ246anVzdGlmeTstd2Via2l0LWh5cGhlbnM6YXV0bzstbXMtaHlwaGVuczphdXRvO2h5cGhlbnM6YXV0b30vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gRGl2aWRlclxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmRpdmlkZXJ7bWFyZ2luOjFyZW0gMDtsaW5lLWhlaWdodDoxO2hlaWdodDowO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjA1ZW07Y29sb3I6cmdiYSgwLDAsMCwuODUpOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0udWkuZGl2aWRlcjpub3QoLnZlcnRpY2FsKTpub3QoLmhvcml6b250YWwpe2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuZ3JpZD4uY29sdW1uKy5kaXZpZGVyLC51aS5ncmlkPi5yb3c+LmNvbHVtbisuZGl2aWRlcntsZWZ0OmF1dG99LnVpLmhvcml6b250YWwuZGl2aWRlcntkaXNwbGF5OnRhYmxlO3doaXRlLXNwYWNlOm5vd3JhcDtoZWlnaHQ6YXV0bzttYXJnaW46Jyc7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcn0udWkuaG9yaXpvbnRhbC5kaXZpZGVyOmFmdGVyLC51aS5ob3Jpem9udGFsLmRpdmlkZXI6YmVmb3Jle2NvbnRlbnQ6Jyc7ZGlzcGxheTp0YWJsZS1jZWxsO3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDo1MCU7d2lkdGg6NTAlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0udWkuaG9yaXpvbnRhbC5kaXZpZGVyOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0IDFlbSB0b3AgNTAlfS51aS5ob3Jpem9udGFsLmRpdmlkZXI6YWZ0ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjpsZWZ0IDFlbSB0b3AgNTAlfS51aS52ZXJ0aWNhbC5kaXZpZGVye3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjowO3BhZGRpbmc6MDt3aWR0aDphdXRvO2hlaWdodDo1MCU7bGluZS1oZWlnaHQ6MDt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpfS51aS52ZXJ0aWNhbC5kaXZpZGVyOmFmdGVyLC51aS52ZXJ0aWNhbC5kaXZpZGVyOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTtjb250ZW50OicnO3otaW5kZXg6Mztib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1yaWdodDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7d2lkdGg6MCU7aGVpZ2h0OmNhbGMoMTAwJSAtIDFyZW0pfS51aS52ZXJ0aWNhbC5kaXZpZGVyOmJlZm9yZXt0b3A6LTEwMCV9LnVpLnZlcnRpY2FsLmRpdmlkZXI6YWZ0ZXJ7dG9wOmF1dG87Ym90dG9tOjB9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuZ3JpZCAuc3RhY2thYmxlLnJvdyAudWkudmVydGljYWwuZGl2aWRlciwudWkuc3RhY2thYmxlLmdyaWQgLnVpLnZlcnRpY2FsLmRpdmlkZXJ7ZGlzcGxheTp0YWJsZTt3aGl0ZS1zcGFjZTpub3dyYXA7aGVpZ2h0OmF1dG87bWFyZ2luOicnO292ZXJmbG93OmhpZGRlbjtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDtsZWZ0OjA7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX0udWkuZ3JpZCAuc3RhY2thYmxlLnJvdyAudWkudmVydGljYWwuZGl2aWRlcjphZnRlciwudWkuZ3JpZCAuc3RhY2thYmxlLnJvdyAudWkudmVydGljYWwuZGl2aWRlcjpiZWZvcmUsLnVpLnN0YWNrYWJsZS5ncmlkIC51aS52ZXJ0aWNhbC5kaXZpZGVyOmFmdGVyLC51aS5zdGFja2FibGUuZ3JpZCAudWkudmVydGljYWwuZGl2aWRlcjpiZWZvcmV7cG9zaXRpb246c3RhdGljO2xlZnQ6MDtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2NvbnRlbnQ6Jyc7ZGlzcGxheTp0YWJsZS1jZWxsO3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDo1MCU7d2lkdGg6NTAlO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH0udWkuZ3JpZCAuc3RhY2thYmxlLnJvdyAudWkudmVydGljYWwuZGl2aWRlcjpiZWZvcmUsLnVpLnN0YWNrYWJsZS5ncmlkIC51aS52ZXJ0aWNhbC5kaXZpZGVyOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOnJpZ2h0IDFlbSB0b3AgNTAlfS51aS5ncmlkIC5zdGFja2FibGUucm93IC51aS52ZXJ0aWNhbC5kaXZpZGVyOmFmdGVyLC51aS5zdGFja2FibGUuZ3JpZCAudWkudmVydGljYWwuZGl2aWRlcjphZnRlcntiYWNrZ3JvdW5kLXBvc2l0aW9uOmxlZnQgMWVtIHRvcCA1MCV9fS51aS5kaXZpZGVyPi5pY29ue21hcmdpbjowO2ZvbnQtc2l6ZToxcmVtO2hlaWdodDoxZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5oaWRkZW4uZGl2aWRlcntib3JkZXItY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5oaWRkZW4uZGl2aWRlcjphZnRlciwudWkuaGlkZGVuLmRpdmlkZXI6YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkuZGl2aWRlci5pbnZlcnRlZCwudWkuaG9yaXpvbnRhbC5pbnZlcnRlZC5kaXZpZGVyLC51aS52ZXJ0aWNhbC5pbnZlcnRlZC5kaXZpZGVye2NvbG9yOiNmZmZ9LnVpLmRpdmlkZXIuaW52ZXJ0ZWQsLnVpLmRpdmlkZXIuaW52ZXJ0ZWQ6YWZ0ZXIsLnVpLmRpdmlkZXIuaW52ZXJ0ZWQ6YmVmb3Jle2JvcmRlci10b3AtY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpIWltcG9ydGFudDtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xNSkhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpIWltcG9ydGFudDtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpIWltcG9ydGFudH0udWkuZml0dGVkLmRpdmlkZXJ7bWFyZ2luOjB9LnVpLmNsZWFyaW5nLmRpdmlkZXJ7Y2xlYXI6Ym90aH0udWkuc2VjdGlvbi5kaXZpZGVye21hcmdpbi10b3A6MnJlbTttYXJnaW4tYm90dG9tOjJyZW19LnVpLmRpdmlkZXJ7Zm9udC1zaXplOjFyZW19LnVpLmhvcml6b250YWwuZGl2aWRlcjphZnRlciwudWkuaG9yaXpvbnRhbC5kaXZpZGVyOmJlZm9yZXtiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQmFBQUFBQUNDQVlBQUFDdVRIdUtBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlGcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TlMxak1ERTBJRGM1TGpFMU1UUTRNU3dnTWpBeE15OHdNeTh4TXkweE1qb3dPVG94TlNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElDaFhhVzVrYjNkektTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzFPVGhCUkRZNE9VTkRNVFl4TVVVME9VRTNOVVZHT0VKRE16TXpNakUyTnlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvMU9UaEJSRFk0UVVORE1UWXhNVVUwT1VFM05VVkdPRUpETXpNek1qRTJOeUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pVNU9FRkVOamczUTBNeE5qRXhSVFE1UVRjMVJVWTRRa016TXpNeU1UWTNJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPalU1T0VGRU5qZzRRME14TmpFeFJUUTVRVGMxUlVZNFFrTXpNek15TVRZM0lpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtWVTUxM2dBQUFEVkpSRUZVZU5yczBERU5BQ0FRQkRCSVdMR0JKUWJ5L21VY0puNXNKWFFtT1FNQUFBQUFBSnF0KzJwckFBQUFBQUNnMnhkZ0FOazZCRVZ1Smd5TUFBQUFBRWxGVGtTdVFtQ0MpfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLmdyaWQgLnN0YWNrYWJsZS5yb3cgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YWZ0ZXIsLnVpLmdyaWQgLnN0YWNrYWJsZS5yb3cgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YmVmb3JlLC51aS5zdGFja2FibGUuZ3JpZCAudWkudmVydGljYWwuZGl2aWRlcjphZnRlciwudWkuc3RhY2thYmxlLmdyaWQgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YmVmb3Jle2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFCYUFBQUFBQ0NBWUFBQUN1VEh1S0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeUZwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOUzFqTURFMElEYzVMakUxTVRRNE1Td2dNakF4TXk4d015OHhNeTB4TWpvd09Ub3hOU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESUNoWGFXNWtiM2R6S1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvMU9UaEJSRFk0T1VORE1UWXhNVVUwT1VFM05VVkdPRUpETXpNek1qRTJOeUlnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG8xT1RoQlJEWTRRVU5ETVRZeE1VVTBPVUUzTlVWR09FSkRNek16TWpFMk55SStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPalU1T0VGRU5qZzNRME14TmpFeFJUUTVRVGMxUlVZNFFrTXpNek15TVRZM0lpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09qVTVPRUZFTmpnNFEwTXhOakV4UlRRNVFUYzFSVVk0UWtNek16TXlNVFkzSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K1ZVNTEzZ0FBQURWSlJFRlVlTnJzMERFTkFDQVFCREJJV0xHQkpRYnkvbVVjSm41c0pYUW1PUU1BQUFBQUFKcXQrMnByQUFBQUFBQ2cyeGRnQU5rNkJFVnVKZ3lNQUFBQUFFbEZUa1N1UW1DQyl9fS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBGbGFnXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi9pLmZsYWc6bm90KC5pY29uKXtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxNnB4O2hlaWdodDoxMXB4O2xpbmUtaGVpZ2h0OjExcHg7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7bWFyZ2luOjAgLjVlbSAwIDA7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7c3BlYWs6bm9uZTtmb250LXNtb290aGluZzphbnRpYWxpYXNlZDstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufWkuZmxhZzpub3QoLmljb24pOmJlZm9yZXtkaXNwbGF5OmlubGluZS1ibG9jaztjb250ZW50OicnO2JhY2tncm91bmQ6dXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMF9fXyArIFwiKSBuby1yZXBlYXQgLTEwOHB4IC0xOTc2cHg7d2lkdGg6MTZweDtoZWlnaHQ6MTFweH1pLmZsYWcuYWQ6YmVmb3JlLGkuZmxhZy5hbmRvcnJhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMH1pLmZsYWcuYWU6YmVmb3JlLGkuZmxhZy51YWU6YmVmb3JlLGkuZmxhZy51bml0ZWQuYXJhYi5lbWlyYXRlczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yNnB4fWkuZmxhZy5hZjpiZWZvcmUsaS5mbGFnLmFmZ2hhbmlzdGFuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTUycHh9aS5mbGFnLmFnOmJlZm9yZSxpLmZsYWcuYW50aWd1YTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC03OHB4fWkuZmxhZy5haTpiZWZvcmUsaS5mbGFnLmFuZ3VpbGxhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEwNHB4fWkuZmxhZy5hbDpiZWZvcmUsaS5mbGFnLmFsYmFuaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTMwcHh9aS5mbGFnLmFtOmJlZm9yZSxpLmZsYWcuYXJtZW5pYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNTZweH1pLmZsYWcuYW46YmVmb3JlLGkuZmxhZy5uZXRoZXJsYW5kcy5hbnRpbGxlczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xODJweH1pLmZsYWcuYW5nb2xhOmJlZm9yZSxpLmZsYWcuYW86YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMjA4cHh9aS5mbGFnLmFyOmJlZm9yZSxpLmZsYWcuYXJnZW50aW5hOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIzNHB4fWkuZmxhZy5hbWVyaWNhbi5zYW1vYTpiZWZvcmUsaS5mbGFnLmFzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTI2MHB4fWkuZmxhZy5hdDpiZWZvcmUsaS5mbGFnLmF1c3RyaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMjg2cHh9aS5mbGFnLmF1OmJlZm9yZSxpLmZsYWcuYXVzdHJhbGlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTMxMnB4fWkuZmxhZy5hcnViYTpiZWZvcmUsaS5mbGFnLmF3OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTMzOHB4fWkuZmxhZy5hbGFuZC5pc2xhbmRzOmJlZm9yZSxpLmZsYWcuYXg6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMzY0cHh9aS5mbGFnLmF6OmJlZm9yZSxpLmZsYWcuYXplcmJhaWphbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0zOTBweH1pLmZsYWcuYmE6YmVmb3JlLGkuZmxhZy5ib3NuaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNDE2cHh9aS5mbGFnLmJhcmJhZG9zOmJlZm9yZSxpLmZsYWcuYmI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNDQycHh9aS5mbGFnLmJhbmdsYWRlc2g6YmVmb3JlLGkuZmxhZy5iZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC00NjhweH1pLmZsYWcuYmU6YmVmb3JlLGkuZmxhZy5iZWxnaXVtOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQ5NHB4fWkuZmxhZy5iZjpiZWZvcmUsaS5mbGFnLmJ1cmtpbmEuZmFzbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC01MjBweH1pLmZsYWcuYmc6YmVmb3JlLGkuZmxhZy5idWxnYXJpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC01NDZweH1pLmZsYWcuYmFocmFpbjpiZWZvcmUsaS5mbGFnLmJoOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTU3MnB4fWkuZmxhZy5iaTpiZWZvcmUsaS5mbGFnLmJ1cnVuZGk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNTk4cHh9aS5mbGFnLmJlbmluOmJlZm9yZSxpLmZsYWcuYmo6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNjI0cHh9aS5mbGFnLmJlcm11ZGE6YmVmb3JlLGkuZmxhZy5ibTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC02NTBweH1pLmZsYWcuYm46YmVmb3JlLGkuZmxhZy5icnVuZWk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNjc2cHh9aS5mbGFnLmJvOmJlZm9yZSxpLmZsYWcuYm9saXZpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC03MDJweH1pLmZsYWcuYnI6YmVmb3JlLGkuZmxhZy5icmF6aWw6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNzI4cHh9aS5mbGFnLmJhaGFtYXM6YmVmb3JlLGkuZmxhZy5iczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC03NTRweH1pLmZsYWcuYmh1dGFuOmJlZm9yZSxpLmZsYWcuYnQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNzgwcHh9aS5mbGFnLmJvdXZldC5pc2xhbmQ6YmVmb3JlLGkuZmxhZy5idjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC04MDZweH1pLmZsYWcuYm90c3dhbmE6YmVmb3JlLGkuZmxhZy5idzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC04MzJweH1pLmZsYWcuYmVsYXJ1czpiZWZvcmUsaS5mbGFnLmJ5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTg1OHB4fWkuZmxhZy5iZWxpemU6YmVmb3JlLGkuZmxhZy5iejpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC04ODRweH1pLmZsYWcuY2E6YmVmb3JlLGkuZmxhZy5jYW5hZGE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtOTEwcHh9aS5mbGFnLmNjOmJlZm9yZSxpLmZsYWcuY29jb3MuaXNsYW5kczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC05NjJweH1pLmZsYWcuY2Q6YmVmb3JlLGkuZmxhZy5jb25nbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC05ODhweH1pLmZsYWcuY2VudHJhbC5hZnJpY2FuLnJlcHVibGljOmJlZm9yZSxpLmZsYWcuY2Y6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTAxNHB4fWkuZmxhZy5jZzpiZWZvcmUsaS5mbGFnLmNvbmdvLmJyYXp6YXZpbGxlOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEwNDBweH1pLmZsYWcuY2g6YmVmb3JlLGkuZmxhZy5zd2l0emVybGFuZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMDY2cHh9aS5mbGFnLmNpOmJlZm9yZSxpLmZsYWcuY290ZS5kaXZvaXJlOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEwOTJweH1pLmZsYWcuY2s6YmVmb3JlLGkuZmxhZy5jb29rLmlzbGFuZHM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTExOHB4fWkuZmxhZy5jaGlsZTpiZWZvcmUsaS5mbGFnLmNsOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExNDRweH1pLmZsYWcuY2FtZXJvb246YmVmb3JlLGkuZmxhZy5jbTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMTcwcHh9aS5mbGFnLmNoaW5hOmJlZm9yZSxpLmZsYWcuY246YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTE5NnB4fWkuZmxhZy5jbzpiZWZvcmUsaS5mbGFnLmNvbG9tYmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEyMjJweH1pLmZsYWcuY29zdGEucmljYTpiZWZvcmUsaS5mbGFnLmNyOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEyNDhweH1pLmZsYWcuY3M6YmVmb3JlLGkuZmxhZy5zZXJiaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTI3NHB4fWkuZmxhZy5jdTpiZWZvcmUsaS5mbGFnLmN1YmE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTMwMHB4fWkuZmxhZy5jYXBlLnZlcmRlOmJlZm9yZSxpLmZsYWcuY3Y6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTMyNnB4fWkuZmxhZy5jaHJpc3RtYXMuaXNsYW5kOmJlZm9yZSxpLmZsYWcuY3g6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTM1MnB4fWkuZmxhZy5jeTpiZWZvcmUsaS5mbGFnLmN5cHJ1czpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMzc4cHh9aS5mbGFnLmN6OmJlZm9yZSxpLmZsYWcuY3plY2gucmVwdWJsaWM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTQwNHB4fWkuZmxhZy5kZTpiZWZvcmUsaS5mbGFnLmdlcm1hbnk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTQzMHB4fWkuZmxhZy5kajpiZWZvcmUsaS5mbGFnLmRqaWJvdXRpOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0NTZweH1pLmZsYWcuZGVubWFyazpiZWZvcmUsaS5mbGFnLmRrOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0ODJweH1pLmZsYWcuZG06YmVmb3JlLGkuZmxhZy5kb21pbmljYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNTA4cHh9aS5mbGFnLmRvOmJlZm9yZSxpLmZsYWcuZG9taW5pY2FuLnJlcHVibGljOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1MzRweH1pLmZsYWcuYWxnZXJpYTpiZWZvcmUsaS5mbGFnLmR6OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1NjBweH1pLmZsYWcuZWM6YmVmb3JlLGkuZmxhZy5lY3VhZG9yOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE1ODZweH1pLmZsYWcuZWU6YmVmb3JlLGkuZmxhZy5lc3RvbmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2MTJweH1pLmZsYWcuZWc6YmVmb3JlLGkuZmxhZy5lZ3lwdDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNjM4cHh9aS5mbGFnLmVoOmJlZm9yZSxpLmZsYWcud2VzdGVybi5zYWhhcmE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTY2NHB4fWkuZmxhZy5lbmdsYW5kOmJlZm9yZSxpLmZsYWcuZ2IuZW5nOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2OTBweH1pLmZsYWcuZXI6YmVmb3JlLGkuZmxhZy5lcml0cmVhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE3MTZweH1pLmZsYWcuZXM6YmVmb3JlLGkuZmxhZy5zcGFpbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzQycHh9aS5mbGFnLmV0OmJlZm9yZSxpLmZsYWcuZXRoaW9waWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTc2OHB4fWkuZmxhZy5ldTpiZWZvcmUsaS5mbGFnLmV1cm9wZWFuLnVuaW9uOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE3OTRweH1pLmZsYWcuZmk6YmVmb3JlLGkuZmxhZy5maW5sYW5kOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE4NDZweH1pLmZsYWcuZmlqaTpiZWZvcmUsaS5mbGFnLmZqOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE4NzJweH1pLmZsYWcuZmFsa2xhbmQuaXNsYW5kczpiZWZvcmUsaS5mbGFnLmZrOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE4OThweH1pLmZsYWcuZm06YmVmb3JlLGkuZmxhZy5taWNyb25lc2lhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE5MjRweH1pLmZsYWcuZmFyb2UuaXNsYW5kczpiZWZvcmUsaS5mbGFnLmZvOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE5NTBweH1pLmZsYWcuZnI6YmVmb3JlLGkuZmxhZy5mcmFuY2U6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTk3NnB4fWkuZmxhZy5nYTpiZWZvcmUsaS5mbGFnLmdhYm9uOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IDB9aS5mbGFnLmdiOmJlZm9yZSxpLmZsYWcudWs6YmVmb3JlLGkuZmxhZy51bml0ZWQua2luZ2RvbTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMjZweH1pLmZsYWcuZ2Q6YmVmb3JlLGkuZmxhZy5ncmVuYWRhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC01MnB4fWkuZmxhZy5nZTpiZWZvcmUsaS5mbGFnLmdlb3JnaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTc4cHh9aS5mbGFnLmZyZW5jaC5ndWlhbmE6YmVmb3JlLGkuZmxhZy5nZjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTA0cHh9aS5mbGFnLmdoOmJlZm9yZSxpLmZsYWcuZ2hhbmE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEzMHB4fWkuZmxhZy5naTpiZWZvcmUsaS5mbGFnLmdpYnJhbHRhcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTU2cHh9aS5mbGFnLmdsOmJlZm9yZSxpLmZsYWcuZ3JlZW5sYW5kOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xODJweH1pLmZsYWcuZ2FtYmlhOmJlZm9yZSxpLmZsYWcuZ206YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTIwOHB4fWkuZmxhZy5nbjpiZWZvcmUsaS5mbGFnLmd1aW5lYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMjM0cHh9aS5mbGFnLmdwOmJlZm9yZSxpLmZsYWcuZ3VhZGVsb3VwZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMjYwcHh9aS5mbGFnLmVxdWF0b3JpYWwuZ3VpbmVhOmJlZm9yZSxpLmZsYWcuZ3E6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTI4NnB4fWkuZmxhZy5ncjpiZWZvcmUsaS5mbGFnLmdyZWVjZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMzEycHh9aS5mbGFnLmdzOmJlZm9yZSxpLmZsYWcuc2FuZHdpY2guaXNsYW5kczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMzM4cHh9aS5mbGFnLmd0OmJlZm9yZSxpLmZsYWcuZ3VhdGVtYWxhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0zNjRweH1pLmZsYWcuZ3U6YmVmb3JlLGkuZmxhZy5ndWFtOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0zOTBweH1pLmZsYWcuZ3VpbmVhLWJpc3NhdTpiZWZvcmUsaS5mbGFnLmd3OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC00MTZweH1pLmZsYWcuZ3V5YW5hOmJlZm9yZSxpLmZsYWcuZ3k6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTQ0MnB4fWkuZmxhZy5oazpiZWZvcmUsaS5mbGFnLmhvbmcua29uZzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNDY4cHh9aS5mbGFnLmhlYXJkLmlzbGFuZDpiZWZvcmUsaS5mbGFnLmhtOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC00OTRweH1pLmZsYWcuaG46YmVmb3JlLGkuZmxhZy5ob25kdXJhczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNTIwcHh9aS5mbGFnLmNyb2F0aWE6YmVmb3JlLGkuZmxhZy5ocjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNTQ2cHh9aS5mbGFnLmhhaXRpOmJlZm9yZSxpLmZsYWcuaHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTU3MnB4fWkuZmxhZy5odTpiZWZvcmUsaS5mbGFnLmh1bmdhcnk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTU5OHB4fWkuZmxhZy5pZDpiZWZvcmUsaS5mbGFnLmluZG9uZXNpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNjI0cHh9aS5mbGFnLmllOmJlZm9yZSxpLmZsYWcuaXJlbGFuZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNjUwcHh9aS5mbGFnLmlsOmJlZm9yZSxpLmZsYWcuaXNyYWVsOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC02NzZweH1pLmZsYWcuaW46YmVmb3JlLGkuZmxhZy5pbmRpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNzAycHh9aS5mbGFnLmluZGlhbi5vY2Vhbi50ZXJyaXRvcnk6YmVmb3JlLGkuZmxhZy5pbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNzI4cHh9aS5mbGFnLmlxOmJlZm9yZSxpLmZsYWcuaXJhcTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNzU0cHh9aS5mbGFnLmlyOmJlZm9yZSxpLmZsYWcuaXJhbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNzgwcHh9aS5mbGFnLmljZWxhbmQ6YmVmb3JlLGkuZmxhZy5pczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtODA2cHh9aS5mbGFnLml0OmJlZm9yZSxpLmZsYWcuaXRhbHk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTgzMnB4fWkuZmxhZy5qYW1haWNhOmJlZm9yZSxpLmZsYWcuam06YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTg1OHB4fWkuZmxhZy5qbzpiZWZvcmUsaS5mbGFnLmpvcmRhbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtODg0cHh9aS5mbGFnLmphcGFuOmJlZm9yZSxpLmZsYWcuanA6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTkxMHB4fWkuZmxhZy5rZTpiZWZvcmUsaS5mbGFnLmtlbnlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC05MzZweH1pLmZsYWcua2c6YmVmb3JlLGkuZmxhZy5reXJneXpzdGFuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC05NjJweH1pLmZsYWcuY2FtYm9kaWE6YmVmb3JlLGkuZmxhZy5raDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtOTg4cHh9aS5mbGFnLmtpOmJlZm9yZSxpLmZsYWcua2lyaWJhdGk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEwMTRweH1pLmZsYWcuY29tb3JvczpiZWZvcmUsaS5mbGFnLmttOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMDQwcHh9aS5mbGFnLmtuOmJlZm9yZSxpLmZsYWcuc2FpbnQua2l0dHMuYW5kLm5ldmlzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMDY2cHh9aS5mbGFnLmtwOmJlZm9yZSxpLmZsYWcubm9ydGgua29yZWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEwOTJweH1pLmZsYWcua3I6YmVmb3JlLGkuZmxhZy5zb3V0aC5rb3JlYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTExOHB4fWkuZmxhZy5rdXdhaXQ6YmVmb3JlLGkuZmxhZy5rdzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTE0NHB4fWkuZmxhZy5jYXltYW4uaXNsYW5kczpiZWZvcmUsaS5mbGFnLmt5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMTcwcHh9aS5mbGFnLmthemFraHN0YW46YmVmb3JlLGkuZmxhZy5rejpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTE5NnB4fWkuZmxhZy5sYTpiZWZvcmUsaS5mbGFnLmxhb3M6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEyMjJweH1pLmZsYWcubGI6YmVmb3JlLGkuZmxhZy5sZWJhbm9uOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMjQ4cHh9aS5mbGFnLmxjOmJlZm9yZSxpLmZsYWcuc2FpbnQubHVjaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEyNzRweH1pLmZsYWcubGk6YmVmb3JlLGkuZmxhZy5saWVjaHRlbnN0ZWluOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMzAwcHh9aS5mbGFnLmxrOmJlZm9yZSxpLmZsYWcuc3JpLmxhbmthOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMzI2cHh9aS5mbGFnLmxpYmVyaWE6YmVmb3JlLGkuZmxhZy5scjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTM1MnB4fWkuZmxhZy5sZXNvdGhvOmJlZm9yZSxpLmZsYWcubHM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEzNzhweH1pLmZsYWcubGl0aHVhbmlhOmJlZm9yZSxpLmZsYWcubHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE0MDRweH1pLmZsYWcubHU6YmVmb3JlLGkuZmxhZy5sdXhlbWJvdXJnOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNDMwcHh9aS5mbGFnLmxhdHZpYTpiZWZvcmUsaS5mbGFnLmx2OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNDU2cHh9aS5mbGFnLmxpYnlhOmJlZm9yZSxpLmZsYWcubHk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE0ODJweH1pLmZsYWcubWE6YmVmb3JlLGkuZmxhZy5tb3JvY2NvOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNTA4cHh9aS5mbGFnLm1jOmJlZm9yZSxpLmZsYWcubW9uYWNvOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNTM0cHh9aS5mbGFnLm1kOmJlZm9yZSxpLmZsYWcubW9sZG92YTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTU2MHB4fWkuZmxhZy5tZTpiZWZvcmUsaS5mbGFnLm1vbnRlbmVncm86YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE1ODZweH1pLmZsYWcubWFkYWdhc2NhcjpiZWZvcmUsaS5mbGFnLm1nOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNjEzcHh9aS5mbGFnLm1hcnNoYWxsLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy5taDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTYzOXB4fWkuZmxhZy5tYWNlZG9uaWE6YmVmb3JlLGkuZmxhZy5tazpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTY2NXB4fWkuZmxhZy5tYWxpOmJlZm9yZSxpLmZsYWcubWw6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE2OTFweH1pLmZsYWcuYnVybWE6YmVmb3JlLGkuZmxhZy5tbTpiZWZvcmUsaS5mbGFnLm15YW5tYXI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTczcHggLTE4MjFweH1pLmZsYWcubW46YmVmb3JlLGkuZmxhZy5tb25nb2xpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTc0M3B4fWkuZmxhZy5tYWNhdTpiZWZvcmUsaS5mbGFnLm1vOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNzY5cHh9aS5mbGFnLm1wOmJlZm9yZSxpLmZsYWcubm9ydGhlcm4ubWFyaWFuYS5pc2xhbmRzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNzk1cHh9aS5mbGFnLm1hcnRpbmlxdWU6YmVmb3JlLGkuZmxhZy5tcTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTgyMXB4fWkuZmxhZy5tYXVyaXRhbmlhOmJlZm9yZSxpLmZsYWcubXI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE4NDdweH1pLmZsYWcubW9udHNlcnJhdDpiZWZvcmUsaS5mbGFnLm1zOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xODczcHh9aS5mbGFnLm1hbHRhOmJlZm9yZSxpLmZsYWcubXQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE4OTlweH1pLmZsYWcubWF1cml0aXVzOmJlZm9yZSxpLmZsYWcubXU6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE5MjVweH1pLmZsYWcubWFsZGl2ZXM6YmVmb3JlLGkuZmxhZy5tdjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTk1MXB4fWkuZmxhZy5tYWxhd2k6YmVmb3JlLGkuZmxhZy5tdzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTk3N3B4fWkuZmxhZy5tZXhpY286YmVmb3JlLGkuZmxhZy5teDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAwfWkuZmxhZy5tYWxheXNpYTpiZWZvcmUsaS5mbGFnLm15OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0yNnB4fWkuZmxhZy5tb3phbWJpcXVlOmJlZm9yZSxpLmZsYWcubXo6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTUycHh9aS5mbGFnLm5hOmJlZm9yZSxpLmZsYWcubmFtaWJpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNzhweH1pLmZsYWcubmM6YmVmb3JlLGkuZmxhZy5uZXcuY2FsZWRvbmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMDRweH1pLmZsYWcubmU6YmVmb3JlLGkuZmxhZy5uaWdlcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTMwcHh9aS5mbGFnLm5mOmJlZm9yZSxpLmZsYWcubm9yZm9say5pc2xhbmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE1NnB4fWkuZmxhZy5uZzpiZWZvcmUsaS5mbGFnLm5pZ2VyaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE4MnB4fWkuZmxhZy5uaTpiZWZvcmUsaS5mbGFnLm5pY2FyYWd1YTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMjA4cHh9aS5mbGFnLm5ldGhlcmxhbmRzOmJlZm9yZSxpLmZsYWcubmw6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTIzNHB4fWkuZmxhZy5ubzpiZWZvcmUsaS5mbGFnLm5vcndheTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMjYwcHh9aS5mbGFnLm5lcGFsOmJlZm9yZSxpLmZsYWcubnA6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTI4NnB4fWkuZmxhZy5uYXVydTpiZWZvcmUsaS5mbGFnLm5yOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0zMTJweH1pLmZsYWcubml1ZTpiZWZvcmUsaS5mbGFnLm51OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0zMzhweH1pLmZsYWcubmV3LnplYWxhbmQ6YmVmb3JlLGkuZmxhZy5uejpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMzY0cHh9aS5mbGFnLm9tOmJlZm9yZSxpLmZsYWcub21hbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMzkwcHh9aS5mbGFnLnBhOmJlZm9yZSxpLmZsYWcucGFuYW1hOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC00MTZweH1pLmZsYWcucGU6YmVmb3JlLGkuZmxhZy5wZXJ1OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC00NDJweH1pLmZsYWcuZnJlbmNoLnBvbHluZXNpYTpiZWZvcmUsaS5mbGFnLnBmOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC00NjhweH1pLmZsYWcubmV3Lmd1aW5lYTpiZWZvcmUsaS5mbGFnLnBnOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC00OTRweH1pLmZsYWcucGg6YmVmb3JlLGkuZmxhZy5waGlsaXBwaW5lczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNTIwcHh9aS5mbGFnLnBha2lzdGFuOmJlZm9yZSxpLmZsYWcucGs6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTU0NnB4fWkuZmxhZy5wbDpiZWZvcmUsaS5mbGFnLnBvbGFuZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNTcycHh9aS5mbGFnLnBtOmJlZm9yZSxpLmZsYWcuc2FpbnQucGllcnJlOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC01OThweH1pLmZsYWcucGl0Y2Fpcm4uaXNsYW5kczpiZWZvcmUsaS5mbGFnLnBuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC02MjRweH1pLmZsYWcucHI6YmVmb3JlLGkuZmxhZy5wdWVydG8ucmljbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNjUwcHh9aS5mbGFnLnBhbGVzdGluZTpiZWZvcmUsaS5mbGFnLnBzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC02NzZweH1pLmZsYWcucG9ydHVnYWw6YmVmb3JlLGkuZmxhZy5wdDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNzAycHh9aS5mbGFnLnBhbGF1OmJlZm9yZSxpLmZsYWcucHc6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTcyOHB4fWkuZmxhZy5wYXJhZ3VheTpiZWZvcmUsaS5mbGFnLnB5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC03NTRweH1pLmZsYWcucWE6YmVmb3JlLGkuZmxhZy5xYXRhcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNzgwcHh9aS5mbGFnLnJlOmJlZm9yZSxpLmZsYWcucmV1bmlvbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtODA2cHh9aS5mbGFnLnJvOmJlZm9yZSxpLmZsYWcucm9tYW5pYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtODMycHh9aS5mbGFnLnJzOmJlZm9yZSxpLmZsYWcuc2VyYmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC04NThweH1pLmZsYWcucnU6YmVmb3JlLGkuZmxhZy5ydXNzaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTg4NHB4fWkuZmxhZy5ydzpiZWZvcmUsaS5mbGFnLnJ3YW5kYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtOTEwcHh9aS5mbGFnLnNhOmJlZm9yZSxpLmZsYWcuc2F1ZGkuYXJhYmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC05MzZweH1pLmZsYWcuc2I6YmVmb3JlLGkuZmxhZy5zb2xvbW9uLmlzbGFuZHM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTk2MnB4fWkuZmxhZy5zYzpiZWZvcmUsaS5mbGFnLnNleWNoZWxsZXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTk4OHB4fWkuZmxhZy5nYi5zY3Q6YmVmb3JlLGkuZmxhZy5zY290bGFuZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTAxNHB4fWkuZmxhZy5zZDpiZWZvcmUsaS5mbGFnLnN1ZGFuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMDQwcHh9aS5mbGFnLnNlOmJlZm9yZSxpLmZsYWcuc3dlZGVuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMDY2cHh9aS5mbGFnLnNnOmJlZm9yZSxpLmZsYWcuc2luZ2Fwb3JlOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMDkycHh9aS5mbGFnLnNhaW50LmhlbGVuYTpiZWZvcmUsaS5mbGFnLnNoOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMTE4cHh9aS5mbGFnLnNpOmJlZm9yZSxpLmZsYWcuc2xvdmVuaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTExNDRweH1pLmZsYWcuamFuLm1heWVuOmJlZm9yZSxpLmZsYWcuc2o6YmVmb3JlLGkuZmxhZy5zdmFsYmFyZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTE3MHB4fWkuZmxhZy5zazpiZWZvcmUsaS5mbGFnLnNsb3Zha2lhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMTk2cHh9aS5mbGFnLnNpZXJyYS5sZW9uZTpiZWZvcmUsaS5mbGFnLnNsOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMjIycHh9aS5mbGFnLnNhbi5tYXJpbm86YmVmb3JlLGkuZmxhZy5zbTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTI0OHB4fWkuZmxhZy5zZW5lZ2FsOmJlZm9yZSxpLmZsYWcuc246YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEyNzRweH1pLmZsYWcuc286YmVmb3JlLGkuZmxhZy5zb21hbGlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMzAwcHh9aS5mbGFnLnNyOmJlZm9yZSxpLmZsYWcuc3VyaW5hbWU6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEzMjZweH1pLmZsYWcuc2FvLnRvbWU6YmVmb3JlLGkuZmxhZy5zdDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTM1MnB4fWkuZmxhZy5lbC5zYWx2YWRvcjpiZWZvcmUsaS5mbGFnLnN2OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMzc4cHh9aS5mbGFnLnN5OmJlZm9yZSxpLmZsYWcuc3lyaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE0MDRweH1pLmZsYWcuc3dhemlsYW5kOmJlZm9yZSxpLmZsYWcuc3o6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE0MzBweH1pLmZsYWcuY2FpY29zLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy50YzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTQ1NnB4fWkuZmxhZy5jaGFkOmJlZm9yZSxpLmZsYWcudGQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE0ODJweH1pLmZsYWcuZnJlbmNoLnRlcnJpdG9yaWVzOmJlZm9yZSxpLmZsYWcudGY6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE1MDhweH1pLmZsYWcudGc6YmVmb3JlLGkuZmxhZy50b2dvOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNTM0cHh9aS5mbGFnLnRoOmJlZm9yZSxpLmZsYWcudGhhaWxhbmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE1NjBweH1pLmZsYWcudGFqaWtpc3RhbjpiZWZvcmUsaS5mbGFnLnRqOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNTg2cHh9aS5mbGFnLnRrOmJlZm9yZSxpLmZsYWcudG9rZWxhdTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTYxMnB4fWkuZmxhZy50aW1vcmxlc3RlOmJlZm9yZSxpLmZsYWcudGw6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE2MzhweH1pLmZsYWcudG06YmVmb3JlLGkuZmxhZy50dXJrbWVuaXN0YW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE2NjRweH1pLmZsYWcudG46YmVmb3JlLGkuZmxhZy50dW5pc2lhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNjkwcHh9aS5mbGFnLnRvOmJlZm9yZSxpLmZsYWcudG9uZ2E6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE3MTZweH1pLmZsYWcudHI6YmVmb3JlLGkuZmxhZy50dXJrZXk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE3NDJweH1pLmZsYWcudHJpbmlkYWQ6YmVmb3JlLGkuZmxhZy50dDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTc2OHB4fWkuZmxhZy50dXZhbHU6YmVmb3JlLGkuZmxhZy50djpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTc5NHB4fWkuZmxhZy50YWl3YW46YmVmb3JlLGkuZmxhZy50dzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTgyMHB4fWkuZmxhZy50YW56YW5pYTpiZWZvcmUsaS5mbGFnLnR6OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xODQ2cHh9aS5mbGFnLnVhOmJlZm9yZSxpLmZsYWcudWtyYWluZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTg3MnB4fWkuZmxhZy51ZzpiZWZvcmUsaS5mbGFnLnVnYW5kYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTg5OHB4fWkuZmxhZy51bTpiZWZvcmUsaS5mbGFnLnVzLm1pbm9yLmlzbGFuZHM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE5MjRweH1pLmZsYWcuYW1lcmljYTpiZWZvcmUsaS5mbGFnLnVuaXRlZC5zdGF0ZXM6YmVmb3JlLGkuZmxhZy51czpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTk1MHB4fWkuZmxhZy51cnVndWF5OmJlZm9yZSxpLmZsYWcudXk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE5NzZweH1pLmZsYWcudXo6YmVmb3JlLGkuZmxhZy51emJla2lzdGFuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAwfWkuZmxhZy52YTpiZWZvcmUsaS5mbGFnLnZhdGljYW4uY2l0eTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTI2cHh9aS5mbGFnLnNhaW50LnZpbmNlbnQ6YmVmb3JlLGkuZmxhZy52YzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTUycHh9aS5mbGFnLnZlOmJlZm9yZSxpLmZsYWcudmVuZXp1ZWxhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtNzhweH1pLmZsYWcuYnJpdGlzaC52aXJnaW4uaXNsYW5kczpiZWZvcmUsaS5mbGFnLnZnOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMTA0cHh9aS5mbGFnLnVzLnZpcmdpbi5pc2xhbmRzOmJlZm9yZSxpLmZsYWcudmk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0xMzBweH1pLmZsYWcudmlldG5hbTpiZWZvcmUsaS5mbGFnLnZuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMTU2cHh9aS5mbGFnLnZhbnVhdHU6YmVmb3JlLGkuZmxhZy52dTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTE4MnB4fWkuZmxhZy5nYi53bHM6YmVmb3JlLGkuZmxhZy53YWxlczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTIwOHB4fWkuZmxhZy53YWxsaXMuYW5kLmZ1dHVuYTpiZWZvcmUsaS5mbGFnLndmOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMjM0cHh9aS5mbGFnLnNhbW9hOmJlZm9yZSxpLmZsYWcud3M6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0yNjBweH1pLmZsYWcueWU6YmVmb3JlLGkuZmxhZy55ZW1lbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTI4NnB4fWkuZmxhZy5tYXlvdHRlOmJlZm9yZSxpLmZsYWcueXQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0zMTJweH1pLmZsYWcuc291dGguYWZyaWNhOmJlZm9yZSxpLmZsYWcuemE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0zMzhweH1pLmZsYWcuemFtYmlhOmJlZm9yZSxpLmZsYWcuem06YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0zNjRweH1pLmZsYWcuemltYmFid2U6YmVmb3JlLGkuZmxhZy56dzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTM5MHB4fS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBIZWFkZXJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5oZWFkZXJ7Ym9yZGVyOm5vbmU7bWFyZ2luOmNhbGMoMnJlbSAtIC4xNDI4NTcxNGVtKSAwIDFyZW07cGFkZGluZzowIDA7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxLjI4NTcxNDI5ZW07dGV4dC10cmFuc2Zvcm06bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmhlYWRlcjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOi0uMTQyODU3MTRlbX0udWkuaGVhZGVyOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5oZWFkZXIgLnN1Yi5oZWFkZXJ7ZGlzcGxheTpibG9jaztmb250LXdlaWdodDo0MDA7cGFkZGluZzowO21hcmdpbjowO2ZvbnQtc2l6ZToxcmVtO2xpbmUtaGVpZ2h0OjEuMmVtO2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5oZWFkZXI+Lmljb257ZGlzcGxheTp0YWJsZS1jZWxsO29wYWNpdHk6MTtmb250LXNpemU6MS41ZW07cGFkZGluZy10b3A6MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmhlYWRlciAuaWNvbjpvbmx5LWNoaWxke2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6MDttYXJnaW4tcmlnaHQ6Ljc1cmVtfS51aS5oZWFkZXI+LmltYWdlOm5vdCguaWNvbiksLnVpLmhlYWRlcj5pbWd7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDouMTQyODU3MTRlbTt3aWR0aDoyLjVlbTtoZWlnaHQ6YXV0bzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmhlYWRlcj4uaW1hZ2U6bm90KC5pY29uKTpvbmx5LWNoaWxkLC51aS5oZWFkZXI+aW1nOm9ubHktY2hpbGR7bWFyZ2luLXJpZ2h0Oi43NXJlbX0udWkuaGVhZGVyIC5jb250ZW50e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOnRvcH0udWkuaGVhZGVyPi5pbWFnZSsuY29udGVudCwudWkuaGVhZGVyPmltZysuY29udGVudHtwYWRkaW5nLWxlZnQ6Ljc1cmVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuaGVhZGVyPi5pY29uKy5jb250ZW50e3BhZGRpbmctbGVmdDouNzVyZW07ZGlzcGxheTp0YWJsZS1jZWxsO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuaGVhZGVyIC51aS5sYWJlbHtmb250LXNpemU6Jyc7bWFyZ2luLWxlZnQ6LjVyZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5oZWFkZXIrcHttYXJnaW4tdG9wOjB9aDEudWkuaGVhZGVye2ZvbnQtc2l6ZToycmVtfWgyLnVpLmhlYWRlcntmb250LXNpemU6MS43MTQyODU3MXJlbX1oMy51aS5oZWFkZXJ7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19aDQudWkuaGVhZGVye2ZvbnQtc2l6ZToxLjA3MTQyODU3cmVtfWg1LnVpLmhlYWRlcntmb250LXNpemU6MXJlbX1oMS51aS5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19aDIudWkuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfWgzLnVpLmhlYWRlciAuc3ViLmhlYWRlcntmb250LXNpemU6MXJlbX1oNC51aS5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjFyZW19aDUudWkuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLmh1Z2UuaGVhZGVye21pbi1oZWlnaHQ6MWVtO2ZvbnQtc2l6ZToyZW19LnVpLmxhcmdlLmhlYWRlcntmb250LXNpemU6MS43MTQyODU3MWVtfS51aS5tZWRpdW0uaGVhZGVye2ZvbnQtc2l6ZToxLjI4NTcxNDI5ZW19LnVpLnNtYWxsLmhlYWRlcntmb250LXNpemU6MS4wNzE0Mjg1N2VtfS51aS50aW55LmhlYWRlcntmb250LXNpemU6MWVtfS51aS5odWdlLmhlYWRlciAuc3ViLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkubGFyZ2UuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjFyZW19LnVpLnNtYWxsLmhlYWRlciAuc3ViLmhlYWRlcntmb250LXNpemU6MXJlbX0udWkudGlueS5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuc3ViLmhlYWRlcntwYWRkaW5nOjA7bWFyZ2luLWJvdHRvbTouMTQyODU3MTRyZW07Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZTouODU3MTQyODZlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Y29sb3I6Jyd9LnVpLnNtYWxsLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOi43ODU3MTQyOWVtfS51aS5zdWIuaGVhZGVye2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkubGFyZ2Uuc3ViLmhlYWRlcntmb250LXNpemU6LjkyODU3MTQzZW19LnVpLmh1Z2Uuc3ViLmhlYWRlcntmb250LXNpemU6MWVtfS51aS5pY29uLmhlYWRlcntkaXNwbGF5OmlubGluZS1ibG9jazt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MnJlbSAwIDFyZW19LnVpLmljb24uaGVhZGVyOmFmdGVye2NvbnRlbnQ6Jyc7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtjbGVhcjpib3RoO3Zpc2liaWxpdHk6aGlkZGVufS51aS5pY29uLmhlYWRlcjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLmljb24uaGVhZGVyIC5pY29ue2Zsb2F0Om5vbmU7ZGlzcGxheTpibG9jazt3aWR0aDphdXRvO2hlaWdodDphdXRvO2xpbmUtaGVpZ2h0OjE7cGFkZGluZzowO2ZvbnQtc2l6ZTozZW07bWFyZ2luOjAgYXV0byAuNXJlbTtvcGFjaXR5OjF9LnVpLmljb24uaGVhZGVyIC5jb250ZW50e2Rpc3BsYXk6YmxvY2s7cGFkZGluZzowfS51aS5pY29uLmhlYWRlciAuY2lyY3VsYXIuaWNvbntmb250LXNpemU6MmVtfS51aS5pY29uLmhlYWRlciAuc3F1YXJlLmljb257Zm9udC1zaXplOjJlbX0udWkuYmxvY2suaWNvbi5oZWFkZXIgLmljb257bWFyZ2luLWJvdHRvbTowfS51aS5pY29uLmhlYWRlci5hbGlnbmVke21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG87ZGlzcGxheTpibG9ja30udWkuZGlzYWJsZWQuaGVhZGVye29wYWNpdHk6LjQ1fS51aS5pbnZlcnRlZC5oZWFkZXJ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuaGVhZGVyIC5zdWIuaGVhZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjgpfS51aS5pbnZlcnRlZC5hdHRhY2hlZC5oZWFkZXJ7YmFja2dyb3VuZDojNTQ1NDU0IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20odHJhbnNwYXJlbnQpLHRvKHJnYmEoMCwwLDAsLjA1KSkpO2JhY2tncm91bmQ6IzU0NTQ1NCAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO2JhY2tncm91bmQ6IzU0NTQ1NCAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCwgbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDojNTQ1NDU0IGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LnVpLmludmVydGVkLmJsb2NrLmhlYWRlcntiYWNrZ3JvdW5kOiM1NDU0NTQgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDojNTQ1NDU0IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7YmFja2dyb3VuZDojNTQ1NDU0IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSxmcm9tKHRyYW5zcGFyZW50KSx0byhyZ2JhKDAsMCwwLC4wNSkpKTtiYWNrZ3JvdW5kOiM1NDU0NTQgbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5ibG9jay5oZWFkZXJ7Ym9yZGVyLWJvdHRvbTpub25lfS51aS5yZWQuaGVhZGVye2NvbG9yOiNkYjI4MjghaW1wb3J0YW50fWEudWkucmVkLmhlYWRlcjpob3Zlcntjb2xvcjojZDAxOTE5IWltcG9ydGFudH0udWkucmVkLmRpdmlkaW5nLmhlYWRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZGIyODI4fS51aS5pbnZlcnRlZC5yZWQuaGVhZGVye2NvbG9yOiNmZjY5NWUhaW1wb3J0YW50fWEudWkuaW52ZXJ0ZWQucmVkLmhlYWRlcjpob3Zlcntjb2xvcjojZmY1MTQ0IWltcG9ydGFudH0udWkub3JhbmdlLmhlYWRlcntjb2xvcjojZjI3MTFjIWltcG9ydGFudH1hLnVpLm9yYW5nZS5oZWFkZXI6aG92ZXJ7Y29sb3I6I2YyNjIwMiFpbXBvcnRhbnR9LnVpLm9yYW5nZS5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgI2YyNzExY30udWkuaW52ZXJ0ZWQub3JhbmdlLmhlYWRlcntjb2xvcjojZmY4NTFiIWltcG9ydGFudH1hLnVpLmludmVydGVkLm9yYW5nZS5oZWFkZXI6aG92ZXJ7Y29sb3I6I2ZmNzcwMSFpbXBvcnRhbnR9LnVpLm9saXZlLmhlYWRlcntjb2xvcjojYjVjYzE4IWltcG9ydGFudH1hLnVpLm9saXZlLmhlYWRlcjpob3Zlcntjb2xvcjojYTdiZDBkIWltcG9ydGFudH0udWkub2xpdmUuZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNiNWNjMTh9LnVpLmludmVydGVkLm9saXZlLmhlYWRlcntjb2xvcjojZDllNzc4IWltcG9ydGFudH1hLnVpLmludmVydGVkLm9saXZlLmhlYWRlcjpob3Zlcntjb2xvcjojZDhlYTVjIWltcG9ydGFudH0udWkueWVsbG93LmhlYWRlcntjb2xvcjojZmJiZDA4IWltcG9ydGFudH1hLnVpLnllbGxvdy5oZWFkZXI6aG92ZXJ7Y29sb3I6I2VhYWUwMCFpbXBvcnRhbnR9LnVpLnllbGxvdy5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgI2ZiYmQwOH0udWkuaW52ZXJ0ZWQueWVsbG93LmhlYWRlcntjb2xvcjojZmZlMjFmIWltcG9ydGFudH1hLnVpLmludmVydGVkLnllbGxvdy5oZWFkZXI6aG92ZXJ7Y29sb3I6I2ZmZGYwNSFpbXBvcnRhbnR9LnVpLmdyZWVuLmhlYWRlcntjb2xvcjojMjFiYTQ1IWltcG9ydGFudH1hLnVpLmdyZWVuLmhlYWRlcjpob3Zlcntjb2xvcjojMTZhYjM5IWltcG9ydGFudH0udWkuZ3JlZW4uZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMyMWJhNDV9LnVpLmludmVydGVkLmdyZWVuLmhlYWRlcntjb2xvcjojMmVjYzQwIWltcG9ydGFudH1hLnVpLmludmVydGVkLmdyZWVuLmhlYWRlcjpob3Zlcntjb2xvcjojMjJiZTM0IWltcG9ydGFudH0udWkudGVhbC5oZWFkZXJ7Y29sb3I6IzAwYjVhZCFpbXBvcnRhbnR9YS51aS50ZWFsLmhlYWRlcjpob3Zlcntjb2xvcjojMDA5Yzk1IWltcG9ydGFudH0udWkudGVhbC5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzAwYjVhZH0udWkuaW52ZXJ0ZWQudGVhbC5oZWFkZXJ7Y29sb3I6IzZkZmZmZiFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC50ZWFsLmhlYWRlcjpob3Zlcntjb2xvcjojNTRmZmZmIWltcG9ydGFudH0udWkuYmx1ZS5oZWFkZXJ7Y29sb3I6IzIxODVkMCFpbXBvcnRhbnR9YS51aS5ibHVlLmhlYWRlcjpob3Zlcntjb2xvcjojMTY3OGMyIWltcG9ydGFudH0udWkuYmx1ZS5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzIxODVkMH0udWkuaW52ZXJ0ZWQuYmx1ZS5oZWFkZXJ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC5ibHVlLmhlYWRlcjpob3Zlcntjb2xvcjojM2FjMGZmIWltcG9ydGFudH0udWkudmlvbGV0LmhlYWRlcntjb2xvcjojNjQzNWM5IWltcG9ydGFudH1hLnVpLnZpb2xldC5oZWFkZXI6aG92ZXJ7Y29sb3I6IzU4MjliYiFpbXBvcnRhbnR9LnVpLnZpb2xldC5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzY0MzVjOX0udWkuaW52ZXJ0ZWQudmlvbGV0LmhlYWRlcntjb2xvcjojYTI5MWZiIWltcG9ydGFudH1hLnVpLmludmVydGVkLnZpb2xldC5oZWFkZXI6aG92ZXJ7Y29sb3I6IzhhNzNmZiFpbXBvcnRhbnR9LnVpLnB1cnBsZS5oZWFkZXJ7Y29sb3I6I2EzMzNjOCFpbXBvcnRhbnR9YS51aS5wdXJwbGUuaGVhZGVyOmhvdmVye2NvbG9yOiM5NjI3YmEhaW1wb3J0YW50fS51aS5wdXJwbGUuZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNhMzMzYzh9LnVpLmludmVydGVkLnB1cnBsZS5oZWFkZXJ7Y29sb3I6I2RjNzNmZiFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC5wdXJwbGUuaGVhZGVyOmhvdmVye2NvbG9yOiNkNjVhZmYhaW1wb3J0YW50fS51aS5waW5rLmhlYWRlcntjb2xvcjojZTAzOTk3IWltcG9ydGFudH1hLnVpLnBpbmsuaGVhZGVyOmhvdmVye2NvbG9yOiNlNjFhOGQhaW1wb3J0YW50fS51aS5waW5rLmRpdmlkaW5nLmhlYWRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTAzOTk3fS51aS5pbnZlcnRlZC5waW5rLmhlYWRlcntjb2xvcjojZmY4ZWRmIWltcG9ydGFudH1hLnVpLmludmVydGVkLnBpbmsuaGVhZGVyOmhvdmVye2NvbG9yOiNmZjc0ZDghaW1wb3J0YW50fS51aS5icm93bi5oZWFkZXJ7Y29sb3I6I2E1NjczZiFpbXBvcnRhbnR9YS51aS5icm93bi5oZWFkZXI6aG92ZXJ7Y29sb3I6Izk3NWIzMyFpbXBvcnRhbnR9LnVpLmJyb3duLmRpdmlkaW5nLmhlYWRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZCAjYTU2NzNmfS51aS5pbnZlcnRlZC5icm93bi5oZWFkZXJ7Y29sb3I6I2Q2N2MxYyFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC5icm93bi5oZWFkZXI6aG92ZXJ7Y29sb3I6I2M4NmYxMSFpbXBvcnRhbnR9LnVpLmdyZXkuaGVhZGVye2NvbG9yOiM3Njc2NzYhaW1wb3J0YW50fWEudWkuZ3JleS5oZWFkZXI6aG92ZXJ7Y29sb3I6IzgzODM4MyFpbXBvcnRhbnR9LnVpLmdyZXkuZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM3Njc2NzZ9LnVpLmludmVydGVkLmdyZXkuaGVhZGVye2NvbG9yOiNkY2RkZGUhaW1wb3J0YW50fWEudWkuaW52ZXJ0ZWQuZ3JleS5oZWFkZXI6aG92ZXJ7Y29sb3I6I2NmZDBkMiFpbXBvcnRhbnR9LnVpLmxlZnQuYWxpZ25lZC5oZWFkZXJ7dGV4dC1hbGlnbjpsZWZ0fS51aS5yaWdodC5hbGlnbmVkLmhlYWRlcnt0ZXh0LWFsaWduOnJpZ2h0fS51aS5jZW50ZXIuYWxpZ25lZC5oZWFkZXIsLnVpLmNlbnRlcmVkLmhlYWRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udWkuanVzdGlmaWVkLmhlYWRlcnt0ZXh0LWFsaWduOmp1c3RpZnl9LnVpLmp1c3RpZmllZC5oZWFkZXI6YWZ0ZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7Y29udGVudDonJzt3aWR0aDoxMDAlfS51aS5mbG9hdGVkLmhlYWRlciwudWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5oZWFkZXJ7ZmxvYXQ6bGVmdDttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0Oi41ZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmhlYWRlcntmbG9hdDpyaWdodDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6LjVlbX0udWkuZml0dGVkLmhlYWRlcntwYWRkaW5nOjB9LnVpLmRpdmlkaW5nLmhlYWRlcntwYWRkaW5nLWJvdHRvbTouMjE0Mjg1NzFyZW07Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5kaXZpZGluZy5oZWFkZXIgLnN1Yi5oZWFkZXJ7cGFkZGluZy1ib3R0b206LjIxNDI4NTcxcmVtfS51aS5kaXZpZGluZy5oZWFkZXIgLmljb257bWFyZ2luLWJvdHRvbTowfS51aS5pbnZlcnRlZC5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuYmxvY2suaGVhZGVye2JhY2tncm91bmQ6I2YzZjRmNTtwYWRkaW5nOi43ODU3MTQyOXJlbSAxcmVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDU7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnRpbnkuYmxvY2suaGVhZGVye2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLmJsb2NrLmhlYWRlcntmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5ibG9jay5oZWFkZXI6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpOm5vdChoNil7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLmJsb2NrLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuaHVnZS5ibG9jay5oZWFkZXJ7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLmF0dGFjaGVkLmhlYWRlcntiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzouNzg1NzE0MjlyZW0gMXJlbTttYXJnaW4tbGVmdDotMXB4O21hcmdpbi1yaWdodDotMXB4Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDV9LnVpLmF0dGFjaGVkLmJsb2NrLmhlYWRlcntiYWNrZ3JvdW5kOiNmM2Y0ZjV9LnVpLmF0dGFjaGVkOm5vdCgudG9wKTpub3QoLmJvdHRvbSkuaGVhZGVye21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1yYWRpdXM6MH0udWkudG9wLmF0dGFjaGVkLmhlYWRlcnttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuYm90dG9tLmF0dGFjaGVkLmhlYWRlcnttYXJnaW4tdG9wOjA7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnRpbnkuYXR0YWNoZWQuaGVhZGVye2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkuc21hbGwuYXR0YWNoZWQuaGVhZGVye2ZvbnQtc2l6ZTouOTI4NTcxNDNlbX0udWkuYXR0YWNoZWQuaGVhZGVyOm5vdChoMSk6bm90KGgyKTpub3QoaDMpOm5vdChoNCk6bm90KGg1KTpub3QoaDYpe2ZvbnQtc2l6ZToxZW19LnVpLmxhcmdlLmF0dGFjaGVkLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNGVtfS51aS5odWdlLmF0dGFjaGVkLmhlYWRlcntmb250LXNpemU6MS40Mjg1NzE0M2VtfS51aS5oZWFkZXI6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpOm5vdChoNil7Zm9udC1zaXplOjEuMjg1NzE0MjllbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gSWNvblxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovQGZvbnQtZmFjZXtmb250LWZhbWlseTpJY29ucztzcmM6dXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMV9fXyArIFwiKTtzcmM6dXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMl9fXyArIFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfM19fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyksdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfNF9fXyArIFwiKSBmb3JtYXQoJ3dvZmYnKSx1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF81X19fICsgXCIpIGZvcm1hdCgndHJ1ZXR5cGUnKSx1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF82X19fICsgXCIpIGZvcm1hdCgnc3ZnJyk7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtdmFyaWFudDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7dGV4dC10cmFuc2Zvcm06bm9uZX1pLmljb257ZGlzcGxheTppbmxpbmUtYmxvY2s7b3BhY2l0eToxO21hcmdpbjowIC4yNXJlbSAwIDA7d2lkdGg6MS4xOGVtO2hlaWdodDoxZW07Zm9udC1mYW1pbHk6SWNvbnM7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3RleHQtZGVjb3JhdGlvbjppbmhlcml0O3RleHQtYWxpZ246Y2VudGVyO3NwZWFrOm5vbmU7Zm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6Z3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbn1pLmljb246YmVmb3Jle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH1pLmljb24ubG9hZGluZ3toZWlnaHQ6MWVtO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1hbmltYXRpb246aWNvbi1sb2FkaW5nIDJzIGxpbmVhciBpbmZpbml0ZTthbmltYXRpb246aWNvbi1sb2FkaW5nIDJzIGxpbmVhciBpbmZpbml0ZX1ALXdlYmtpdC1rZXlmcmFtZXMgaWNvbi1sb2FkaW5ne2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGljb24tbG9hZGluZ3tmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19aS5pY29uLmhvdmVye29wYWNpdHk6MSFpbXBvcnRhbnR9aS5pY29uLmFjdGl2ZXtvcGFjaXR5OjEhaW1wb3J0YW50fWkuZW1waGFzaXplZC5pY29ue29wYWNpdHk6MSFpbXBvcnRhbnR9aS5kaXNhYmxlZC5pY29ue29wYWNpdHk6LjQ1IWltcG9ydGFudH1pLmZpdHRlZC5pY29ue3dpZHRoOmF1dG87bWFyZ2luOjAhaW1wb3J0YW50fWkubGluay5pY29uLGkubGluay5pY29uc3tjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi44Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZX1pLmxpbmsuaWNvbjpob3ZlcixpLmxpbmsuaWNvbnM6aG92ZXJ7b3BhY2l0eToxIWltcG9ydGFudH1pLmNpcmN1bGFyLmljb257Ym9yZGVyLXJhZGl1czo1MDBlbSFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MSFpbXBvcnRhbnQ7cGFkZGluZzouNWVtIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAuMWVtIHJnYmEoMCwwLDAsLjEpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgLjFlbSByZ2JhKDAsMCwwLC4xKSBpbnNldDt3aWR0aDoyZW0haW1wb3J0YW50O2hlaWdodDoyZW0haW1wb3J0YW50fWkuY2lyY3VsYXIuaW52ZXJ0ZWQuaWNvbntib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9aS5mbGlwcGVkLmljb24saS5ob3Jpem9udGFsbHkuZmxpcHBlZC5pY29uey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKX1pLnZlcnRpY2FsbHkuZmxpcHBlZC5pY29uey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEsLTEpO3RyYW5zZm9ybTpzY2FsZSgxLC0xKX1pLmNsb2Nrd2lzZS5yb3RhdGVkLmljb24saS5yaWdodC5yb3RhdGVkLmljb24saS5yb3RhdGVkLmljb257LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX1pLmNvdW50ZXJjbG9ja3dpc2Uucm90YXRlZC5pY29uLGkubGVmdC5yb3RhdGVkLmljb257LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC05MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpfWkuYm9yZGVyZWQuaWNvbntsaW5lLWhlaWdodDoxO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3dpZHRoOjJlbTtoZWlnaHQ6MmVtO3BhZGRpbmc6LjVlbSAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgLjFlbSByZ2JhKDAsMCwwLC4xKSBpbnNldDtib3gtc2hhZG93OjAgMCAwIC4xZW0gcmdiYSgwLDAsMCwuMSkgaW5zZXR9aS5ib3JkZXJlZC5pbnZlcnRlZC5pY29ue2JvcmRlcjpub25lOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX1pLmludmVydGVkLmJvcmRlcmVkLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5pY29ue2JhY2tncm91bmQtY29sb3I6IzFiMWMxZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5pY29ue2NvbG9yOiNmZmZ9aS5yZWQuaWNvbntjb2xvcjojZGIyODI4IWltcG9ydGFudH1pLmludmVydGVkLnJlZC5pY29ue2NvbG9yOiNmZjY5NWUhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQucmVkLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5yZWQuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4MjghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkub3JhbmdlLmljb257Y29sb3I6I2YyNzExYyFpbXBvcnRhbnR9aS5pbnZlcnRlZC5vcmFuZ2UuaWNvbntjb2xvcjojZmY4NTFiIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLm9yYW5nZS5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIub3JhbmdlLmljb257YmFja2dyb3VuZC1jb2xvcjojZjI3MTFjIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLnllbGxvdy5pY29ue2NvbG9yOiNmYmJkMDghaW1wb3J0YW50fWkuaW52ZXJ0ZWQueWVsbG93Lmljb257Y29sb3I6I2ZmZTIxZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC55ZWxsb3cuaWNvbixpLmludmVydGVkLmNpcmN1bGFyLnllbGxvdy5pY29ue2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5vbGl2ZS5pY29ue2NvbG9yOiNiNWNjMTghaW1wb3J0YW50fWkuaW52ZXJ0ZWQub2xpdmUuaWNvbntjb2xvcjojZDllNzc4IWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLm9saXZlLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5vbGl2ZS5pY29ue2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5ncmVlbi5pY29ue2NvbG9yOiMyMWJhNDUhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuZ3JlZW4uaWNvbntjb2xvcjojMmVjYzQwIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLmdyZWVuLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5ncmVlbi5pY29ue2JhY2tncm91bmQtY29sb3I6IzIxYmE0NSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS50ZWFsLmljb257Y29sb3I6IzAwYjVhZCFpbXBvcnRhbnR9aS5pbnZlcnRlZC50ZWFsLmljb257Y29sb3I6IzZkZmZmZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC50ZWFsLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci50ZWFsLmljb257YmFja2dyb3VuZC1jb2xvcjojMDBiNWFkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLmJsdWUuaWNvbntjb2xvcjojMjE4NWQwIWltcG9ydGFudH1pLmludmVydGVkLmJsdWUuaWNvbntjb2xvcjojNTRjOGZmIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLmJsdWUuaWNvbixpLmludmVydGVkLmNpcmN1bGFyLmJsdWUuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiMyMTg1ZDAhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkudmlvbGV0Lmljb257Y29sb3I6IzY0MzVjOSFpbXBvcnRhbnR9aS5pbnZlcnRlZC52aW9sZXQuaWNvbntjb2xvcjojYTI5MWZiIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLnZpb2xldC5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIudmlvbGV0Lmljb257YmFja2dyb3VuZC1jb2xvcjojNjQzNWM5IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLnB1cnBsZS5pY29ue2NvbG9yOiNhMzMzYzghaW1wb3J0YW50fWkuaW52ZXJ0ZWQucHVycGxlLmljb257Y29sb3I6I2RjNzNmZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5wdXJwbGUuaWNvbixpLmludmVydGVkLmNpcmN1bGFyLnB1cnBsZS5pY29ue2JhY2tncm91bmQtY29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5waW5rLmljb257Y29sb3I6I2UwMzk5NyFpbXBvcnRhbnR9aS5pbnZlcnRlZC5waW5rLmljb257Y29sb3I6I2ZmOGVkZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5waW5rLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5waW5rLmljb257YmFja2dyb3VuZC1jb2xvcjojZTAzOTk3IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLmJyb3duLmljb257Y29sb3I6I2E1NjczZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5icm93bi5pY29ue2NvbG9yOiNkNjdjMWMhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQuYnJvd24uaWNvbixpLmludmVydGVkLmNpcmN1bGFyLmJyb3duLmljb257YmFja2dyb3VuZC1jb2xvcjojYTU2NzNmIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLmdyZXkuaWNvbntjb2xvcjojNzY3Njc2IWltcG9ydGFudH1pLmludmVydGVkLmdyZXkuaWNvbntjb2xvcjojZGNkZGRlIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLmdyZXkuaWNvbixpLmludmVydGVkLmNpcmN1bGFyLmdyZXkuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkuYmxhY2suaWNvbntjb2xvcjojMWIxYzFkIWltcG9ydGFudH1pLmludmVydGVkLmJsYWNrLmljb257Y29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5ibGFjay5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIuYmxhY2suaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkubWluaS5pY29uLGkubWluaS5pY29uc3tsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZTouNGVtfWkudGlueS5pY29uLGkudGlueS5pY29uc3tsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZTouNWVtfWkuc21hbGwuaWNvbixpLnNtYWxsLmljb25ze2xpbmUtaGVpZ2h0OjE7Zm9udC1zaXplOi43NWVtfWkuaWNvbixpLmljb25ze2ZvbnQtc2l6ZToxZW19aS5sYXJnZS5pY29uLGkubGFyZ2UuaWNvbnN7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjEuNWVtfWkuYmlnLmljb24saS5iaWcuaWNvbnN7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjJlbX1pLmh1Z2UuaWNvbixpLmh1Z2UuaWNvbnN7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjRlbX1pLm1hc3NpdmUuaWNvbixpLm1hc3NpdmUuaWNvbnN7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjhlbX1pLmljb25ze2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2xpbmUtaGVpZ2h0OjF9aS5pY29ucyAuaWNvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpO21hcmdpbjowO21hcmdpbjowfWkuaWNvbnMgLmljb246Zmlyc3QtY2hpbGR7cG9zaXRpb246c3RhdGljO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87dmVydGljYWwtYWxpZ246dG9wOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7bWFyZ2luLXJpZ2h0Oi4yNXJlbX1pLmljb25zIC5jb3JuZXIuaWNvbnt0b3A6YXV0bztsZWZ0OmF1dG87cmlnaHQ6MDtib3R0b206MDstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO2ZvbnQtc2l6ZTouNDVlbTt0ZXh0LXNoYWRvdzotMXB4IC0xcHggMCAjZmZmLDFweCAtMXB4IDAgI2ZmZiwtMXB4IDFweCAwICNmZmYsMXB4IDFweCAwICNmZmZ9aS5pY29ucyAudG9wLnJpZ2h0LmNvcm5lci5pY29ue3RvcDowO2xlZnQ6YXV0bztyaWdodDowO2JvdHRvbTphdXRvfWkuaWNvbnMgLnRvcC5sZWZ0LmNvcm5lci5pY29ue3RvcDowO2xlZnQ6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvfWkuaWNvbnMgLmJvdHRvbS5sZWZ0LmNvcm5lci5pY29ue3RvcDphdXRvO2xlZnQ6MDtyaWdodDphdXRvO2JvdHRvbTowfWkuaWNvbnMgLmJvdHRvbS5yaWdodC5jb3JuZXIuaWNvbnt0b3A6YXV0bztsZWZ0OmF1dG87cmlnaHQ6MDtib3R0b206MH1pLmljb25zIC5pbnZlcnRlZC5jb3JuZXIuaWNvbnt0ZXh0LXNoYWRvdzotMXB4IC0xcHggMCAjMWIxYzFkLDFweCAtMXB4IDAgIzFiMWMxZCwtMXB4IDFweCAwICMxYjFjMWQsMXB4IDFweCAwICMxYjFjMWR9aS5pY29uLmxpbmtlZGluLmluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlMVxcXCJ9aS5pY29uLnpvb20uaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBlXFxcIn1pLmljb24uem9vbS5vdXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDEwXFxcIn1pLmljb24uc2lnbi5pbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjZcXFwifWkuaWNvbi5pbi5jYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxOFxcXCJ9aS5pY29uLmxvZy5vdXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmY1XFxcIn1pLmljb24uc2lnbi5vdXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmY1XFxcIn1pLmljb24uXFxcXDM1IDAwcHg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjZlXFxcIn1pLmljb24uYWNjZXNzaWJsZS5pY29uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM2OFxcXCJ9aS5pY29uLmFjY3Vzb2Z0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM2OVxcXCJ9aS5pY29uLmFkZHJlc3MuYm9vazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjlcXFwifWkuaWNvbi5hZGRyZXNzLmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmJiXFxcIn1pLmljb24uYWRqdXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0MlxcXCJ9aS5pY29uLmFkbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNzBcXFwifWkuaWNvbi5hZHZlcnNhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNmFcXFwifWkuaWNvbi5hZmZpbGlhdGV0aGVtZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNmJcXFwifWkuaWNvbi5hbGdvbGlhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM2Y1xcXCJ9aS5pY29uLmFsaWduLmNlbnRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzdcXFwifWkuaWNvbi5hbGlnbi5qdXN0aWZ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzOVxcXCJ9aS5pY29uLmFsaWduLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDM2XFxcIn1pLmljb24uYWxpZ24ucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDM4XFxcIn1pLmljb24uYW1hem9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3MFxcXCJ9aS5pY29uLmFtYXpvbi5wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDJjXFxcIn1pLmljb24uYW1idWxhbmNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmOVxcXCJ9aS5pY29uLmFtZXJpY2FuLnNpZ24ubGFuZ3VhZ2UuaW50ZXJwcmV0aW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhM1xcXCJ9aS5pY29uLmFtaWxpYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNmRcXFwifWkuaWNvbi5hbmNob3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTNkXFxcIn1pLmljb24uYW5kcm9pZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxN2JcXFwifWkuaWNvbi5hbmdlbGxpc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjA5XFxcIn1pLmljb24uYW5nbGUuZG91YmxlLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTAzXFxcIn1pLmljb24uYW5nbGUuZG91YmxlLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTAwXFxcIn1pLmljb24uYW5nbGUuZG91YmxlLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwMVxcXCJ9aS5pY29uLmFuZ2xlLmRvdWJsZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMDJcXFwifWkuaWNvbi5hbmdsZS5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwN1xcXCJ9aS5pY29uLmFuZ2xlLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTA0XFxcIn1pLmljb24uYW5nbGUucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTA1XFxcIn1pLmljb24uYW5nbGUudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTA2XFxcIn1pLmljb24uYW5ncnljcmVhdGl2ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNmVcXFwifWkuaWNvbi5hbmd1bGFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyMFxcXCJ9aS5pY29uLmFwcC5zdG9yZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNmZcXFwifWkuaWNvbi5hcHAuc3RvcmUuaW9zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM3MFxcXCJ9aS5pY29uLmFwcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM3MVxcXCJ9aS5pY29uLmFwcGxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE3OVxcXCJ9aS5pY29uLmFwcGxlLnBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTVcXFwifWkuaWNvbi5hcmNoaXZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4N1xcXCJ9aS5pY29uLmFycm93LmFsdGVybmF0ZS5jaXJjbGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNThcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzU5XFxcIn1pLmljb24uYXJyb3cuYWx0ZXJuYXRlLmNpcmNsZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNWFcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1YlxcXCJ9aS5pY29uLmFycm93LmNpcmNsZS5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhYlxcXCJ9aS5pY29uLmFycm93LmNpcmNsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhOFxcXCJ9aS5pY29uLmFycm93LmNpcmNsZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTlcXFwifWkuaWNvbi5hcnJvdy5jaXJjbGUudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGFhXFxcIn1pLmljb24uYXJyb3cuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjNcXFwifWkuaWNvbi5hcnJvdy5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2MFxcXCJ9aS5pY29uLmFycm93LnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2MVxcXCJ9aS5pY29uLmFycm93LnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2MlxcXCJ9aS5pY29uLmFycm93cy5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGIyXFxcIn1pLmljb24uYXJyb3dzLmFsdGVybmF0ZS5ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMzN1xcXCJ9aS5pY29uLmFycm93cy5hbHRlcm5hdGUudmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzM4XFxcIn1pLmljb24uYXNzaXN0aXZlLmxpc3RlbmluZy5zeXN0ZW1zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhMlxcXCJ9aS5pY29uLmFzdGVyaXNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2OVxcXCJ9aS5pY29uLmFzeW1tZXRyaWs6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzcyXFxcIn1pLmljb24uYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWZhXFxcIn1pLmljb24uYXVkaWJsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNzNcXFwifWkuaWNvbi5hdWRpby5kZXNjcmlwdGlvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOWVcXFwifWkuaWNvbi5hdXRvcHJlZml4ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDFjXFxcIn1pLmljb24uYXZpYW5leDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNzRcXFwifWkuaWNvbi5hdmlhdG86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDIxXFxcIn1pLmljb24uYXdzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM3NVxcXCJ9aS5pY29uLmJhY2t3YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0YVxcXCJ9aS5pY29uLmJhbGFuY2Uuc2NhbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRlXFxcIn1pLmljb24uYmFuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1ZVxcXCJ9aS5pY29uLmJhbmQuYWlkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ2MlxcXCJ9aS5pY29uLmJhbmRjYW1wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkNVxcXCJ9aS5pY29uLmJhcmNvZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDJhXFxcIn1pLmljb24uYmFyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzlcXFwifWkuaWNvbi5iYXNlYmFsbC5iYWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQzM1xcXCJ9aS5pY29uLmJhc2tldGJhbGwuYmFsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MzRcXFwifWkuaWNvbi5iYXRoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjZFxcXCJ9aS5pY29uLmJhdHRlcnkuZW1wdHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ0XFxcIn1pLmljb24uYmF0dGVyeS5mdWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0MFxcXCJ9aS5pY29uLmJhdHRlcnkuaGFsZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDJcXFwifWkuaWNvbi5iYXR0ZXJ5LnF1YXJ0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQzXFxcIn1pLmljb24uYmF0dGVyeS50aHJlZS5xdWFydGVyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDFcXFwifWkuaWNvbi5iZWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM2XFxcIn1pLmljb24uYmVlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmNcXFwifWkuaWNvbi5iZWhhbmNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiNFxcXCJ9aS5pY29uLmJlaGFuY2Uuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiNVxcXCJ9aS5pY29uLmJlbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGYzXFxcIn1pLmljb24uYmVsbC5zbGFzaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjZcXFwifWkuaWNvbi5iaWN5Y2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwNlxcXCJ9aS5pY29uLmJpbW9iamVjdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNzhcXFwifWkuaWNvbi5iaW5vY3VsYXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlNVxcXCJ9aS5pY29uLmJpcnRoZGF5LmNha2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWZkXFxcIn1pLmljb24uYml0YnVja2V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE3MVxcXCJ9aS5pY29uLmJpdGNvaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzc5XFxcIn1pLmljb24uYml0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzN2FcXFwifWkuaWNvbi5ibGFjay50aWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjdlXFxcIn1pLmljb24uYmxhY2tiZXJyeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzN2JcXFwifWkuaWNvbi5ibGluZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOWRcXFwifWkuaWNvbi5ibG9nZ2VyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM3Y1xcXCJ9aS5pY29uLmJsb2dnZXIuYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzN2RcXFwifWkuaWNvbi5ibHVldG9vdGg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjkzXFxcIn1pLmljb24uYmx1ZXRvb3RoLmI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk0XFxcIn1pLmljb24uYm9sZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzJcXFwifWkuaWNvbi5ib2x0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlN1xcXCJ9aS5pY29uLmJvbWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWUyXFxcIn1pLmljb24uYm9vazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmRcXFwifWkuaWNvbi5ib29rbWFyazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmVcXFwifWkuaWNvbi5ib3dsaW5nLmJhbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDM2XFxcIn1pLmljb24uYm94OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ2NlxcXCJ9aS5pY29uLmJveGVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ2OFxcXCJ9aS5pY29uLmJyYWlsbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmExXFxcIn1pLmljb24uYnJpZWZjYXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBiMVxcXCJ9aS5pY29uLmJ0YzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWFcXFwifWkuaWNvbi5idWc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg4XFxcIn1pLmljb24uYnVpbGRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWFkXFxcIn1pLmljb24uYnVsbGhvcm46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGExXFxcIn1pLmljb24uYnVsbHNleWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTQwXFxcIn1pLmljb24uYnVyb21vYmVsZXhwZXJ0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzN2ZcXFwifWkuaWNvbi5idXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjA3XFxcIn1pLmljb24uYnV5c2VsbGFkczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGRcXFwifWkuaWNvbi5jYWxjdWxhdG9yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlY1xcXCJ9aS5pY29uLmNhbGVuZGFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzM1xcXCJ9aS5pY29uLmNhbGVuZGFyLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzNcXFwifWkuaWNvbi5jYWxlbmRhci5jaGVjazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzRcXFwifWkuaWNvbi5jYWxlbmRhci5taW51czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzJcXFwifWkuaWNvbi5jYWxlbmRhci5wbHVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3MVxcXCJ9aS5pY29uLmNhbGVuZGFyLnRpbWVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3M1xcXCJ9aS5pY29uLmNhbWVyYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzBcXFwifWkuaWNvbi5jYW1lcmEucmV0cm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDgzXFxcIn1pLmljb24uY2FyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiOVxcXCJ9aS5pY29uLmNhcmV0LmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQ3XFxcIn1pLmljb24uY2FyZXQubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDlcXFwifWkuaWNvbi5jYXJldC5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZGFcXFwifWkuaWNvbi5jYXJldC5zcXVhcmUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTBcXFwifWkuaWNvbi5jYXJldC5zcXVhcmUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTFcXFwifWkuaWNvbi5jYXJldC5zcXVhcmUucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUyXFxcIn1pLmljb24uY2FyZXQuc3F1YXJlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1MVxcXCJ9aS5pY29uLmNhcmV0LnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkOFxcXCJ9aS5pY29uLmNhcnQuYXJyb3cuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMThcXFwifWkuaWNvbi5jYXJ0LnBsdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE3XFxcIn1pLmljb24uY2MuYW1hem9uLnBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MmRcXFwifWkuaWNvbi5jYy5hbWV4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmM1xcXCJ9aS5pY29uLmNjLmFwcGxlLnBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTZcXFwifWkuaWNvbi5jYy5kaW5lcnMuY2x1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGNcXFwifWkuaWNvbi5jYy5kaXNjb3ZlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjJcXFwifWkuaWNvbi5jYy5qY2I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRiXFxcIn1pLmljb24uY2MubWFzdGVyY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjFcXFwifWkuaWNvbi5jYy5wYXlwYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY0XFxcIn1pLmljb24uY2Muc3RyaXBlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmNVxcXCJ9aS5pY29uLmNjLnZpc2E6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYwXFxcIn1pLmljb24uY2VudGVyY29kZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzODBcXFwifWkuaWNvbi5jZXJ0aWZpY2F0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTNcXFwifWkuaWNvbi5jaGFydC5hcmVhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmZVxcXCJ9aS5pY29uLmNoYXJ0LmJhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODBcXFwifWkuaWNvbi5jaGFydC5saW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwMVxcXCJ9aS5pY29uLmNoYXJ0LnBpZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDBcXFwifWkuaWNvbi5jaGVjazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGNcXFwifWkuaWNvbi5jaGVjay5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU4XFxcIn1pLmljb24uY2hlY2suc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0YVxcXCJ9aS5pY29uLmNoZXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQzOVxcXCJ9aS5pY29uLmNoZXNzLmJpc2hvcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0M2FcXFwifWkuaWNvbi5jaGVzcy5ib2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0M2NcXFwifWkuaWNvbi5jaGVzcy5raW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQzZlxcXCJ9aS5pY29uLmNoZXNzLmtuaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NDFcXFwifWkuaWNvbi5jaGVzcy5wYXduOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ0M1xcXCJ9aS5pY29uLmNoZXNzLnF1ZWVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ0NVxcXCJ9aS5pY29uLmNoZXNzLnJvb2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDQ3XFxcIn1pLmljb24uY2hldnJvbi5jaXJjbGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxM2FcXFwifWkuaWNvbi5jaGV2cm9uLmNpcmNsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzN1xcXCJ9aS5pY29uLmNoZXZyb24uY2lyY2xlLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzOFxcXCJ9aS5pY29uLmNoZXZyb24uY2lyY2xlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzOVxcXCJ9aS5pY29uLmNoZXZyb24uZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzhcXFwifWkuaWNvbi5jaGV2cm9uLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDUzXFxcIn1pLmljb24uY2hldnJvbi5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTRcXFwifWkuaWNvbi5jaGV2cm9uLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3N1xcXCJ9aS5pY29uLmNoaWxkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhZVxcXCJ9aS5pY29uLmNocm9tZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjhcXFwifWkuaWNvbi5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTExXFxcIn1pLmljb24uY2lyY2xlLm5vdGNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjZVxcXCJ9aS5pY29uLmNsaXBib2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMjhcXFwifWkuaWNvbi5jbGlwYm9hcmQuY2hlY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDZjXFxcIn1pLmljb24uY2xpcGJvYXJkLmxpc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDZkXFxcIn1pLmljb24uY2xvY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDE3XFxcIn1pLmljb24uY2xvbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRkXFxcIn1pLmljb24uY2xvc2VkLmNhcHRpb25pbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjBhXFxcIn1pLmljb24uY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGMyXFxcIn1pLmljb24uY2xvdWRzY2FsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzODNcXFwifWkuaWNvbi5jbG91ZHNtaXRoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4NFxcXCJ9aS5pY29uLmNsb3VkdmVyc2lmeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzODVcXFwifWkuaWNvbi5jb2RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyMVxcXCJ9aS5pY29uLmNvZGUuYnJhbmNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyNlxcXCJ9aS5pY29uLmNvZGVwZW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWNiXFxcIn1pLmljb24uY29kaWVwaWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjg0XFxcIn1pLmljb24uY29mZmVlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmNFxcXCJ9aS5pY29uLmNvZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTNcXFwifWkuaWNvbi5jb2dzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4NVxcXCJ9aS5pY29uLmNvbHVtbnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRiXFxcIn1pLmljb24uY29tbWVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzVcXFwifWkuaWNvbi5jb21tZW50LmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyN2FcXFwifWkuaWNvbi5jb21tZW50czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODZcXFwifWkuaWNvbi5jb21wYXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0ZVxcXCJ9aS5pY29uLmNvbXByZXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2NlxcXCJ9aS5pY29uLmNvbm5lY3RkZXZlbG9wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwZVxcXCJ9aS5pY29uLmNvbnRhbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNmRcXFwifWkuaWNvbi5jb3B5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjNVxcXCJ9aS5pY29uLmNvcHlyaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjlcXFwifWkuaWNvbi5jcGFuZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzg4XFxcIn1pLmljb24uY3JlYXRpdmUuY29tbW9uczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWVcXFwifWkuaWNvbi5jcmVkaXQuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWRcXFwifWkuaWNvbi5jcm9wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyNVxcXCJ9aS5pY29uLmNyb3NzaGFpcnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDViXFxcIn1pLmljb24uY3NzMzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxM2NcXFwifWkuaWNvbi5jc3MzLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOGJcXFwifWkuaWNvbi5jdWJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiMlxcXCJ9aS5pY29uLmN1YmVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiM1xcXCJ9aS5pY29uLmN1dDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzRcXFwifWkuaWNvbi5jdXR0bGVmaXNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4Y1xcXCJ9aS5pY29uLmQuYW5kLmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzhkXFxcIn1pLmljb24uZGFzaGN1YmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjEwXFxcIn1pLmljb24uZGF0YWJhc2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWMwXFxcIn1pLmljb24uZGVhZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTRcXFwifWkuaWNvbi5kZWxpY2lvdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWE1XFxcIn1pLmljb24uZGVwbG95ZG9nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4ZVxcXCJ9aS5pY29uLmRlc2twcm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzhmXFxcIn1pLmljb24uZGVza3RvcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMDhcXFwifWkuaWNvbi5kZXZpYW50YXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiZFxcXCJ9aS5pY29uLmRpZ2c6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWE2XFxcIn1pLmljb24uZGlnaXRhbC5vY2VhbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTFcXFwifWkuaWNvbi5kaXNjb3JkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM5MlxcXCJ9aS5pY29uLmRpc2NvdXJzZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTNcXFwifWkuaWNvbi5kbmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDcxXFxcIn1pLmljb24uZG9jaHViOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM5NFxcXCJ9aS5pY29uLmRvY2tlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTVcXFwifWkuaWNvbi5kb2xsYXIuc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTVcXFwifWkuaWNvbi5kb2xseTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NzJcXFwifWkuaWNvbi5kb2xseS5mbGF0YmVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ3NFxcXCJ9aS5pY29uLmRvdC5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTkyXFxcIn1pLmljb24uZG93bmxvYWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDE5XFxcIn1pLmljb24uZHJhZnQyZGlnaXRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTZcXFwifWkuaWNvbi5kcmliYmJsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxN2RcXFwifWkuaWNvbi5kcmliYmJsZS5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzk3XFxcIn1pLmljb24uZHJvcGJveDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNmJcXFwifWkuaWNvbi5kcnVwYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWE5XFxcIn1pLmljb24uZHlhbG9nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM5OVxcXCJ9aS5pY29uLmVhcmx5YmlyZHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzlhXFxcIn1pLmljb24uZWRnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODJcXFwifWkuaWNvbi5lZGl0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0NFxcXCJ9aS5pY29uLmVqZWN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1MlxcXCJ9aS5pY29uLmVsZW1lbnRvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MzBcXFwifWkuaWNvbi5lbGxpcHNpcy5ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0MVxcXCJ9aS5pY29uLmVsbGlwc2lzLnZlcnRpY2FsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0MlxcXCJ9aS5pY29uLmVtYmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyM1xcXCJ9aS5pY29uLmVtcGlyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDFcXFwifWkuaWNvbi5lbnZlbG9wZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTBcXFwifWkuaWNvbi5lbnZlbG9wZS5vcGVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiNlxcXCJ9aS5pY29uLmVudmVsb3BlLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTlcXFwifWkuaWNvbi5lbnZpcmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk5XFxcIn1pLmljb24uZXJhc2VyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyZFxcXCJ9aS5pY29uLmVybGFuZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOWRcXFwifWkuaWNvbi5ldGhlcmV1bTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MmVcXFwifWkuaWNvbi5ldHN5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkN1xcXCJ9aS5pY29uLmV1cm8uc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTNcXFwifWkuaWNvbi5leGNoYW5nZS5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzYyXFxcIn1pLmljb24uZXhjbGFtYXRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTJhXFxcIn1pLmljb24uZXhjbGFtYXRpb24uY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2YVxcXCJ9aS5pY29uLmV4Y2xhbWF0aW9uLnRyaWFuZ2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3MVxcXCJ9aS5pY29uLmV4cGFuZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjVcXFwifWkuaWNvbi5leHBhbmQuYXJyb3dzLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMWVcXFwifWkuaWNvbi5leHBlZGl0ZWRzc2w6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNlXFxcIn1pLmljb24uZXh0ZXJuYWwuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1ZFxcXCJ9aS5pY29uLmV4dGVybmFsLnNxdWFyZS5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzYwXFxcIn1pLmljb24uZXllOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2ZVxcXCJ9aS5pY29uLmV5ZS5kcm9wcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmYlxcXCJ9aS5pY29uLmV5ZS5zbGFzaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzBcXFwifWkuaWNvbi5mYWNlYm9vazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWFcXFwifWkuaWNvbi5mYWNlYm9vay5mOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM5ZVxcXCJ9aS5pY29uLmZhY2Vib29rLm1lc3NlbmdlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOWZcXFwifWkuaWNvbi5mYWNlYm9vay5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDgyXFxcIn1pLmljb24uZmFzdC5iYWNrd2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDlcXFwifWkuaWNvbi5mYXN0LmZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDUwXFxcIn1pLmljb24uZmF4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhY1xcXCJ9aS5pY29uLmZlbWFsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODJcXFwifWkuaWNvbi5maWdodGVyLmpldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmJcXFwifWkuaWNvbi5maWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1YlxcXCJ9aS5pY29uLmZpbGUuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1Y1xcXCJ9aS5pY29uLmZpbGUuYXJjaGl2ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzZcXFwifWkuaWNvbi5maWxlLmF1ZGlvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjN1xcXCJ9aS5pY29uLmZpbGUuY29kZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzlcXFwifWkuaWNvbi5maWxlLmV4Y2VsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjM1xcXCJ9aS5pY29uLmZpbGUuaW1hZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM1XFxcIn1pLmljb24uZmlsZS5wZGY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWMxXFxcIn1pLmljb24uZmlsZS5wb3dlcnBvaW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjNFxcXCJ9aS5pY29uLmZpbGUudmlkZW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM4XFxcIn1pLmljb24uZmlsZS53b3JkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjMlxcXCJ9aS5pY29uLmZpbG06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA4XFxcIn1pLmljb24uZmlsdGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBiMFxcXCJ9aS5pY29uLmZpcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDZkXFxcIn1pLmljb24uZmlyZS5leHRpbmd1aXNoZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTM0XFxcIn1pLmljb24uZmlyZWZveDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjlcXFwifWkuaWNvbi5maXJzdC5haWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDc5XFxcIn1pLmljb24uZmlyc3Qub3JkZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmIwXFxcIn1pLmljb24uZmlyc3RkcmFmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTFcXFwifWkuaWNvbi5mbGFnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyNFxcXCJ9aS5pY29uLmZsYWcuY2hlY2tlcmVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExZVxcXCJ9aS5pY29uLmZsYXNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjM1xcXCJ9aS5pY29uLmZsaWNrcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNmVcXFwifWkuaWNvbi5mbGlwYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDRkXFxcIn1pLmljb24uZmx5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxN1xcXCJ9aS5pY29uLmZvbGRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwN2JcXFwifWkuaWNvbi5mb2xkZXIub3BlbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwN2NcXFwifWkuaWNvbi5mb250OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzMVxcXCJ9aS5pY29uLmZvbnQuYXdlc29tZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjRcXFwifWkuaWNvbi5mb250LmF3ZXNvbWUuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1Y1xcXCJ9aS5pY29uLmZvbnQuYXdlc29tZS5mbGFnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyNVxcXCJ9aS5pY29uLmZvbnRpY29uczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODBcXFwifWkuaWNvbi5mb250aWNvbnMuZmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2EyXFxcIn1pLmljb24uZm9vdGJhbGwuYmFsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NGVcXFwifWkuaWNvbi5mb3J0LmF3ZXNvbWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjg2XFxcIn1pLmljb24uZm9ydC5hd2Vzb21lLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTNcXFwifWkuaWNvbi5mb3J1bWJlZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMTFcXFwifWkuaWNvbi5mb3J3YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0ZVxcXCJ9aS5pY29uLmZvdXJzcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTgwXFxcIn1pLmljb24uZnJlZS5jb2RlLmNhbXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmM1XFxcIn1pLmljb24uZnJlZWJzZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTRcXFwifWkuaWNvbi5mcm93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMTlcXFwifWkuaWNvbi5mdXRib2w6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWUzXFxcIn1pLmljb24uZ2FtZXBhZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMWJcXFwifWkuaWNvbi5nYXZlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTNcXFwifWkuaWNvbi5nZW06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2E1XFxcIn1pLmljb24uZ2VuZGVybGVzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmRcXFwifWkuaWNvbi5nZXQucG9ja2V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2NVxcXCJ9aS5pY29uLmdnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2MFxcXCJ9aS5pY29uLmdnLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjFcXFwifWkuaWNvbi5naWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2YlxcXCJ9aS5pY29uLmdpdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDNcXFwifWkuaWNvbi5naXQuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkMlxcXCJ9aS5pY29uLmdpdGh1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWJcXFwifWkuaWNvbi5naXRodWIuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExM1xcXCJ9aS5pY29uLmdpdGh1Yi5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDkyXFxcIn1pLmljb24uZ2l0a3Jha2VuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhNlxcXCJ9aS5pY29uLmdpdGxhYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTZcXFwifWkuaWNvbi5naXR0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDI2XFxcIn1pLmljb24uZ2xhc3MubWFydGluaTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDBcXFwifWkuaWNvbi5nbGlkZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTVcXFwifWkuaWNvbi5nbGlkZS5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhNlxcXCJ9aS5pY29uLmdsb2JlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhY1xcXCJ9aS5pY29uLmdvZm9yZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTdcXFwifWkuaWNvbi5nb2xmLmJhbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDUwXFxcIn1pLmljb24uZ29vZHJlYWRzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhOFxcXCJ9aS5pY29uLmdvb2RyZWFkcy5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhOVxcXCJ9aS5pY29uLmdvb2dsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYTBcXFwifWkuaWNvbi5nb29nbGUuZHJpdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2FhXFxcIn1pLmljb24uZ29vZ2xlLnBsYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2FiXFxcIn1pLmljb24uZ29vZ2xlLnBsdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmIzXFxcIn1pLmljb24uZ29vZ2xlLnBsdXMuZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDVcXFwifWkuaWNvbi5nb29nbGUucGx1cy5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQ0XFxcIn1pLmljb24uZ29vZ2xlLndhbGxldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZWVcXFwifWkuaWNvbi5ncmFkdWF0aW9uLmNhcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOWRcXFwifWkuaWNvbi5ncmF0aXBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODRcXFwifWkuaWNvbi5ncmF2OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkNlxcXCJ9aS5pY29uLmdyaXBmaXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhY1xcXCJ9aS5pY29uLmdydW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhZFxcXCJ9aS5pY29uLmd1bHA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2FlXFxcIn1pLmljb24uaC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZkXFxcIn1pLmljb24uaGFja2VyLm5ld3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQ0XFxcIn1pLmljb24uaGFja2VyLm5ld3Muc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhZlxcXCJ9aS5pY29uLmhhbmQubGl6YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1OFxcXCJ9aS5pY29uLmhhbmQucGFwZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU2XFxcIn1pLmljb24uaGFuZC5wZWFjZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWJcXFwifWkuaWNvbi5oYW5kLnBvaW50LmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE3XFxcIn1pLmljb24uaGFuZC5wb2ludC5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNVxcXCJ9aS5pY29uLmhhbmQucG9pbnQucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE0XFxcIn1pLmljb24uaGFuZC5wb2ludC51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTZcXFwifWkuaWNvbi5oYW5kLnBvaW50ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjVhXFxcIn1pLmljb24uaGFuZC5yb2NrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1NVxcXCJ9aS5pY29uLmhhbmQuc2Npc3NvcnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU3XFxcIn1pLmljb24uaGFuZC5zcG9jazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTlcXFwifWkuaWNvbi5oYW5kc2hha2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmI1XFxcIn1pLmljb24uaGFzaHRhZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTJcXFwifWkuaWNvbi5oZGQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGEwXFxcIn1pLmljb24uaGVhZGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZGNcXFwifWkuaWNvbi5oZWFkcGhvbmVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyNVxcXCJ9aS5pY29uLmhlYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwNFxcXCJ9aS5pY29uLmhlYXJ0YmVhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMWVcXFwifWkuaWNvbi5oaXBzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ1MlxcXCJ9aS5pY29uLmhpcmUuYS5oZWxwZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2IwXFxcIn1pLmljb24uaGlzdG9yeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZGFcXFwifWkuaWNvbi5ob2NrZXkucHVjazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NTNcXFwifWkuaWNvbi5ob21lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxNVxcXCJ9aS5pY29uLmhvb2xpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyN1xcXCJ9aS5pY29uLmhvc3BpdGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmOFxcXCJ9aS5pY29uLmhvc3BpdGFsLnN5bWJvbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0N2VcXFwifWkuaWNvbi5ob3RqYXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2IxXFxcIn1pLmljb24uaG91cmdsYXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1NFxcXCJ9aS5pY29uLmhvdXJnbGFzcy5lbmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjUzXFxcIn1pLmljb24uaG91cmdsYXNzLmhhbGY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjUyXFxcIn1pLmljb24uaG91cmdsYXNzLnN0YXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1MVxcXCJ9aS5pY29uLmhvdXp6OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3Y1xcXCJ9aS5pY29uLmh0bWw1OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzYlxcXCJ9aS5pY29uLmh1YnNwb3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2IyXFxcIn1pLmljb24uaS5jdXJzb3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ2XFxcIn1pLmljb24uaWQuYmFkZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmMxXFxcIn1pLmljb24uaWQuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYzJcXFwifWkuaWNvbi5pbWFnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwM2VcXFwifWkuaWNvbi5pbWFnZXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzAyXFxcIn1pLmljb24uaW1kYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDhcXFwifWkuaWNvbi5pbmJveDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMWNcXFwifWkuaWNvbi5pbmRlbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDNjXFxcIn1pLmljb24uaW5kdXN0cnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjc1XFxcIn1pLmljb24uaW5mbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjlcXFwifWkuaWNvbi5pbmZvLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNWFcXFwifWkuaWNvbi5pbnN0YWdyYW06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTZkXFxcIn1pLmljb24uaW50ZXJuZXQuZXhwbG9yZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjZiXFxcIn1pLmljb24uaW94aG9zdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDhcXFwifWkuaWNvbi5pdGFsaWM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDMzXFxcIn1pLmljb24uaXR1bmVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiNFxcXCJ9aS5pY29uLml0dW5lcy5ub3RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiNVxcXCJ9aS5pY29uLmplbmtpbnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2I2XFxcIn1pLmljb24uam9nZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2I3XFxcIn1pLmljb24uam9vbWxhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhYVxcXCJ9aS5pY29uLmpzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiOFxcXCJ9aS5pY29uLmpzLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYjlcXFwifWkuaWNvbi5qc2ZpZGRsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxY2NcXFwifWkuaWNvbi5rZXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg0XFxcIn1pLmljb24ua2V5Ym9hcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTFjXFxcIn1pLmljb24ua2V5Y2RuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiYVxcXCJ9aS5pY29uLmtpY2tzdGFydGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiYlxcXCJ9aS5pY29uLmtpY2tzdGFydGVyLms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2JjXFxcIn1pLmljb24ua29ydnVlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyZlxcXCJ9aS5pY29uLmxhbmd1YWdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhYlxcXCJ9aS5pY29uLmxhcHRvcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMDlcXFwifWkuaWNvbi5sYXJhdmVsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiZFxcXCJ9aS5pY29uLmxhc3RmbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDJcXFwifWkuaWNvbi5sYXN0Zm0uc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwM1xcXCJ9aS5pY29uLmxlYWY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDZjXFxcIn1pLmljb24ubGVhbnB1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMTJcXFwifWkuaWNvbi5sZW1vbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOTRcXFwifWkuaWNvbi5sZXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxZFxcXCJ9aS5pY29uLmxldmVsLmRvd24uYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiZVxcXCJ9aS5pY29uLmxldmVsLnVwLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYmZcXFwifWkuaWNvbi5saWZlLnJpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWNkXFxcIn1pLmljb24ubGlnaHRidWxiOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlYlxcXCJ9aS5pY29uLmxpbmVjaGF0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjMFxcXCJ9aS5pY29uLmxpbmtpZnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGMxXFxcIn1pLmljb24ubGlua2VkaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDhjXFxcIn1pLmljb24ubGlua2VkaW4uYWx0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlMVxcXCJ9aS5pY29uLmxpbm9kZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjhcXFwifWkuaWNvbi5saW51eDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxN2NcXFwifWkuaWNvbi5saXJhLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTk1XFxcIn1pLmljb24ubGlzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwM2FcXFwifWkuaWNvbi5saXN0LmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjJcXFwifWkuaWNvbi5saXN0Lm9sOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjYlxcXCJ9aS5pY29uLmxpc3QudWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGNhXFxcIn1pLmljb24ubG9jYXRpb24uYXJyb3c6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI0XFxcIn1pLmljb24ubG9jazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjNcXFwifWkuaWNvbi5sb2NrLm9wZW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2MxXFxcIn1pLmljb24ubG9uZy5hcnJvdy5hbHRlcm5hdGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMDlcXFwifWkuaWNvbi5sb25nLmFycm93LmFsdGVybmF0ZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwYVxcXCJ9aS5pY29uLmxvbmcuYXJyb3cuYWx0ZXJuYXRlLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwYlxcXCJ9aS5pY29uLmxvbmcuYXJyb3cuYWx0ZXJuYXRlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwY1xcXCJ9aS5pY29uLmxvdy52aXNpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmE4XFxcIn1pLmljb24ubHlmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYzNcXFwifWkuaWNvbi5tYWdlbnRvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjNFxcXCJ9aS5pY29uLm1hZ2ljOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkMFxcXCJ9aS5pY29uLm1hZ25ldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzZcXFwifWkuaWNvbi5tYWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4M1xcXCJ9aS5pY29uLm1hcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzlcXFwifWkuaWNvbi5tYXAubWFya2VyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0MVxcXCJ9aS5pY29uLm1hcC5tYXJrZXIuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjNVxcXCJ9aS5pY29uLm1hcC5waW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjc2XFxcIn1pLmljb24ubWFwLnNpZ25zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3N1xcXCJ9aS5pY29uLm1hcnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjIyXFxcIn1pLmljb24ubWFycy5kb3VibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI3XFxcIn1pLmljb24ubWFycy5zdHJva2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI5XFxcIn1pLmljb24ubWFycy5zdHJva2UuaG9yaXpvbnRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmJcXFwifWkuaWNvbi5tYXJzLnN0cm9rZS52ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmFcXFwifWkuaWNvbi5tYXhjZG46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTM2XFxcIn1pLmljb24ubWVkYXBwczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYzZcXFwifWkuaWNvbi5tZWRpdW06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNhXFxcIn1pLmljb24ubWVkaXVtLm06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2M3XFxcIn1pLmljb24ubWVka2l0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmYVxcXCJ9aS5pY29uLm1lZHJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjOFxcXCJ9aS5pY29uLm1lZXR1cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZTBcXFwifWkuaWNvbi5tZWg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTFhXFxcIn1pLmljb24ubWVyY3VyeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjNcXFwifWkuaWNvbi5taWNyb2NoaXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmRiXFxcIn1pLmljb24ubWljcm9waG9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzBcXFwifWkuaWNvbi5taWNyb3Bob25lLnNsYXNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzMVxcXCJ9aS5pY29uLm1pY3Jvc29mdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzY2FcXFwifWkuaWNvbi5taW51czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjhcXFwifWkuaWNvbi5taW51cy5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU2XFxcIn1pLmljb24ubWludXMuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0NlxcXCJ9aS5pY29uLm1peDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzY2JcXFwifWkuaWNvbi5taXhjbG91ZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODlcXFwifWkuaWNvbi5taXp1bmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2NjXFxcIn1pLmljb24ubW9iaWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwYlxcXCJ9aS5pY29uLm1vYmlsZS5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2NkXFxcIn1pLmljb24ubW9keDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODVcXFwifWkuaWNvbi5tb25lcm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2QwXFxcIn1pLmljb24ubW9uZXkuYmlsbC5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2QxXFxcIn1pLmljb24ubW9vbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODZcXFwifWkuaWNvbi5tb3RvcmN5Y2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxY1xcXCJ9aS5pY29uLm1vdXNlLnBvaW50ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ1XFxcIn1pLmljb24ubXVzaWM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDAxXFxcIn1pLmljb24ubmFwc3RlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDJcXFwifWkuaWNvbi5uZXV0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJjXFxcIn1pLmljb24ubmV3c3BhcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlYVxcXCJ9aS5pY29uLm5pbnRlbmRvLnN3aXRjaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MThcXFwifWkuaWNvbi5ub2RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxOVxcXCJ9aS5pY29uLm5vZGUuanM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2QzXFxcIn1pLmljb24ubnBtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkNFxcXCJ9aS5pY29uLm5zODpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDVcXFwifWkuaWNvbi5udXRyaXRpb25peDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDZcXFwifWkuaWNvbi5vYmplY3QuZ3JvdXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ3XFxcIn1pLmljb24ub2JqZWN0LnVuZ3JvdXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ4XFxcIn1pLmljb24ub2Rub2tsYXNzbmlraTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjNcXFwifWkuaWNvbi5vZG5va2xhc3NuaWtpLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjRcXFwifWkuaWNvbi5vcGVuY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyM2RcXFwifWkuaWNvbi5vcGVuaWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTliXFxcIn1pLmljb24ub3BlcmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjZhXFxcIn1pLmljb24ub3B0aW4ubW9uc3RlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyM2NcXFwifWkuaWNvbi5vc2k6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDFhXFxcIn1pLmljb24ub3V0ZGVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwM2JcXFwifWkuaWNvbi5wYWdlNDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDdcXFwifWkuaWNvbi5wYWdlbGluZXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMThjXFxcIn1pLmljb24ucGFpbnQuYnJ1c2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWZjXFxcIn1pLmljb24ucGFsZmVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkOFxcXCJ9aS5pY29uLnBhbGxldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0ODJcXFwifWkuaWNvbi5wYXBlci5wbGFuZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDhcXFwifWkuaWNvbi5wYXBlcmNsaXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM2XFxcIn1pLmljb24ucGFyYWdyYXBoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkZFxcXCJ9aS5pY29uLnBhc3RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlYVxcXCJ9aS5pY29uLnBhdHJlb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Q5XFxcIn1pLmljb24ucGF1c2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDRjXFxcIn1pLmljb24ucGF1c2UuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4YlxcXCJ9aS5pY29uLnBhdzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjBcXFwifWkuaWNvbi5wYXlwYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWVkXFxcIn1pLmljb24ucGVuLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGJcXFwifWkuaWNvbi5wZW5jaWwuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwM1xcXCJ9aS5pY29uLnBlcmNlbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk1XFxcIn1pLmljb24ucGVyaXNjb3BlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkYVxcXCJ9aS5pY29uLnBoYWJyaWNhdG9yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkYlxcXCJ9aS5pY29uLnBob2VuaXguZnJhbWV3b3JrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkY1xcXCJ9aS5pY29uLnBob25lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5NVxcXCJ9aS5pY29uLnBob25lLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOThcXFwifWkuaWNvbi5waG9uZS52b2x1bWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmEwXFxcIn1pLmljb24ucGhwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ1N1xcXCJ9aS5pY29uLnBpZWQucGlwZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFlXFxcIn1pLmljb24ucGllZC5waXBlci5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWE4XFxcIn1pLmljb24ucGllZC5waXBlci5wcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYTdcXFwifWkuaWNvbi5waWxsczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0ODRcXFwifWkuaWNvbi5waW50ZXJlc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQyXFxcIn1pLmljb24ucGludGVyZXN0LnA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjMxXFxcIn1pLmljb24ucGludGVyZXN0LnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDNcXFwifWkuaWNvbi5wbGFuZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzJcXFwifWkuaWNvbi5wbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0YlxcXCJ9aS5pY29uLnBsYXkuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0NFxcXCJ9aS5pY29uLnBsYXlzdGF0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkZlxcXCJ9aS5pY29uLnBsdWc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWU2XFxcIn1pLmljb24ucGx1czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjdcXFwifWkuaWNvbi5wbHVzLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTVcXFwifWkuaWNvbi5wbHVzLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmVcXFwifWkuaWNvbi5wb2RjYXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjZVxcXCJ9aS5pY29uLnBvdW5kLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU0XFxcIn1pLmljb24ucG93ZXIub2ZmOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxMVxcXCJ9aS5pY29uLnByaW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyZlxcXCJ9aS5pY29uLnByb2R1Y3QuaHVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODhcXFwifWkuaWNvbi5wdXNoZWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2UxXFxcIn1pLmljb24ucHV6emxlLnBpZWNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyZVxcXCJ9aS5pY29uLnB5dGhvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZTJcXFwifWkuaWNvbi5xcTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDZcXFwifWkuaWNvbi5xcmNvZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDI5XFxcIn1pLmljb24ucXVlc3Rpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI4XFxcIn1pLmljb24ucXVlc3Rpb24uY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1OVxcXCJ9aS5pY29uLnF1aWRkaXRjaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NThcXFwifWkuaWNvbi5xdWluc2NhcGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDU5XFxcIn1pLmljb24ucXVvcmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmM0XFxcIn1pLmljb24ucXVvdGUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMGRcXFwifWkuaWNvbi5xdW90ZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMGVcXFwifWkuaWNvbi5yYW5kb206YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc0XFxcIn1pLmljb24ucmF2ZWxyeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDlcXFwifWkuaWNvbi5yZWFjdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MWJcXFwifWkuaWNvbi5yZWJlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDBcXFwifWkuaWNvbi5yZWN5Y2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiOFxcXCJ9aS5pY29uLnJlZHJpdmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlM1xcXCJ9aS5pY29uLnJlZGRpdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYTFcXFwifWkuaWNvbi5yZWRkaXQuYWxpZW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjgxXFxcIn1pLmljb24ucmVkZGl0LnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYTJcXFwifWkuaWNvbi5yZWRvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxZVxcXCJ9aS5pY29uLnJlZG8uYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmOVxcXCJ9aS5pY29uLnJlZ2lzdGVyZWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjVkXFxcIn1pLmljb24ucmVuZGFjdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZTRcXFwifWkuaWNvbi5yZW5yZW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMThiXFxcIn1pLmljb24ucmVwbHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2U1XFxcIn1pLmljb24ucmVwbHkuYWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyMlxcXCJ9aS5pY29uLnJlcGx5ZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZTZcXFwifWkuaWNvbi5yZXNvbHZpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2U3XFxcIn1pLmljb24ucmV0d2VldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzlcXFwifWkuaWNvbi5yb2FkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxOFxcXCJ9aS5pY29uLnJvY2tldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzVcXFwifWkuaWNvbi5yb2NrZXRjaGF0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlOFxcXCJ9aS5pY29uLnJvY2tybXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2U5XFxcIn1pLmljb24ucnNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5ZVxcXCJ9aS5pY29uLnJzcy5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTQzXFxcIn1pLmljb24ucnVibGUuc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNThcXFwifWkuaWNvbi5ydXBlZS5zaWduOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NlxcXCJ9aS5pY29uLnNhZmFyaTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjdcXFwifWkuaWNvbi5zYXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxZVxcXCJ9aS5pY29uLnNhdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM3XFxcIn1pLmljb24uc2NobGl4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlYVxcXCJ9aS5pY29uLnNjcmliZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOGFcXFwifWkuaWNvbi5zZWFyY2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDAyXFxcIn1pLmljb24uc2VhcmNoLm1pbnVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxMFxcXCJ9aS5pY29uLnNlYXJjaC5wbHVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZVxcXCJ9aS5pY29uLnNlYXJjaGVuZ2luOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlYlxcXCJ9aS5pY29uLnNlbGxjYXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkYVxcXCJ9aS5pY29uLnNlbGxzeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMTNcXFwifWkuaWNvbi5zZXJ2ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjMzXFxcIn1pLmljb24uc2VydmljZXN0YWNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlY1xcXCJ9aS5pY29uLnNoYXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2NFxcXCJ9aS5pY29uLnNoYXJlLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTBcXFwifWkuaWNvbi5zaGFyZS5hbHRlcm5hdGUuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlMVxcXCJ9aS5pY29uLnNoYXJlLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGRcXFwifWkuaWNvbi5zaGVrZWwuc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGJcXFwifWkuaWNvbi5zaGllbGQuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlZFxcXCJ9aS5pY29uLnNoaXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjFhXFxcIn1pLmljb24uc2hpcHBpbmcuZmFzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0OGJcXFwifWkuaWNvbi5zaGlydHNpbmJ1bGs6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE0XFxcIn1pLmljb24uc2hvcHBpbmcuYmFnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5MFxcXCJ9aS5pY29uLnNob3BwaW5nLmJhc2tldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTFcXFwifWkuaWNvbi5zaG9wcGluZy5jYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3YVxcXCJ9aS5pY29uLnNob3dlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyY2NcXFwifWkuaWNvbi5zaWduLmxhbmd1YWdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhN1xcXCJ9aS5pY29uLnNpZ25hbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTJcXFwifWkuaWNvbi5zaW1wbHlidWlsdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMTVcXFwifWkuaWNvbi5zaXN0cml4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlZVxcXCJ9aS5pY29uLnNpdGVtYXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGU4XFxcIn1pLmljb24uc2t5YXRsYXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE2XFxcIn1pLmljb24uc2t5cGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTdlXFxcIn1pLmljb24uc2xhY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTk4XFxcIn1pLmljb24uc2xhY2suaGFzaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWZcXFwifWkuaWNvbi5zbGlkZXJzLmhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWRlXFxcIn1pLmljb24uc2xpZGVzaGFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTdcXFwifWkuaWNvbi5zbWlsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMThcXFwifWkuaWNvbi5zbmFwY2hhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYWJcXFwifWkuaWNvbi5zbmFwY2hhdC5naG9zdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYWNcXFwifWkuaWNvbi5zbmFwY2hhdC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFkXFxcIn1pLmljb24uc25vd2ZsYWtlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkY1xcXCJ9aS5pY29uLnNvcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRjXFxcIn1pLmljb24uc29ydC5hbHBoYWJldC5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1ZFxcXCJ9aS5pY29uLnNvcnQuYWxwaGFiZXQudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTVlXFxcIn1pLmljb24uc29ydC5hbW91bnQuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjBcXFwifWkuaWNvbi5zb3J0LmFtb3VudC51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjFcXFwifWkuaWNvbi5zb3J0LmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRkXFxcIn1pLmljb24uc29ydC5udW1lcmljLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYyXFxcIn1pLmljb24uc29ydC5udW1lcmljLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2M1xcXCJ9aS5pY29uLnNvcnQudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRlXFxcIn1pLmljb24uc291bmRjbG91ZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYmVcXFwifWkuaWNvbi5zcGFjZS5zaHV0dGxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5N1xcXCJ9aS5pY29uLnNwZWFrYXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2YzXFxcIn1pLmljb24uc3Bpbm5lcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMTBcXFwifWkuaWNvbi5zcG90aWZ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiY1xcXCJ9aS5pY29uLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzhcXFwifWkuaWNvbi5zcXVhcmUuZnVsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NWNcXFwifWkuaWNvbi5zdGFjay5leGNoYW5nZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOGRcXFwifWkuaWNvbi5zdGFjay5vdmVyZmxvdzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNmNcXFwifWkuaWNvbi5zdGFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwNVxcXCJ9aS5pY29uLnN0YXIuaGFsZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODlcXFwifWkuaWNvbi5zdGF5bGlua2VkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmNVxcXCJ9aS5pY29uLnN0ZWFtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiNlxcXCJ9aS5pY29uLnN0ZWFtLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjdcXFwifWkuaWNvbi5zdGVhbS5zeW1ib2w6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Y2XFxcIn1pLmljb24uc3RlcC5iYWNrd2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDhcXFwifWkuaWNvbi5zdGVwLmZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDUxXFxcIn1pLmljb24uc3RldGhvc2NvcGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGYxXFxcIn1pLmljb24uc3RpY2tlci5tdWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmN1xcXCJ9aS5pY29uLnN0aWNreS5ub3RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0OVxcXCJ9aS5pY29uLnN0b3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDRkXFxcIn1pLmljb24uc3RvcC5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjhkXFxcIn1pLmljb24uc3RvcHdhdGNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmMlxcXCJ9aS5pY29uLnN0cmF2YTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MjhcXFwifWkuaWNvbi5zdHJlZXQudmlldzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMWRcXFwifWkuaWNvbi5zdHJpa2V0aHJvdWdoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjY1xcXCJ9aS5pY29uLnN0cmlwZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MjlcXFwifWkuaWNvbi5zdHJpcGUuczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MmFcXFwifWkuaWNvbi5zdHVkaW92aW5hcmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Y4XFxcIn1pLmljb24uc3R1bWJsZXVwb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWE0XFxcIn1pLmljb24uc3R1bWJsZXVwb24uY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhM1xcXCJ9aS5pY29uLnN1YnNjcmlwdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMmNcXFwifWkuaWNvbi5zdWJ3YXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM5XFxcIn1pLmljb24uc3VpdGNhc2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGYyXFxcIn1pLmljb24uc3VuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4NVxcXCJ9aS5pY29uLnN1cGVycG93ZXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkZFxcXCJ9aS5pY29uLnN1cGVyc2NyaXB0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyYlxcXCJ9aS5pY29uLnN1cHBsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZjlcXFwifWkuaWNvbi5zeW5jOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyMVxcXCJ9aS5pY29uLnN5bmMuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmMVxcXCJ9aS5pY29uLnN5cmluZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDhlXFxcIn1pLmljb24udGFibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGNlXFxcIn1pLmljb24udGFibGUudGVubmlzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ1ZFxcXCJ9aS5pY29uLnRhYmxldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMGFcXFwifWkuaWNvbi50YWJsZXQuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmYVxcXCJ9aS5pY29uLnRhY2hvbWV0ZXIuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmZFxcXCJ9aS5pY29uLnRhZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmJcXFwifWkuaWNvbi50YWdzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyY1xcXCJ9aS5pY29uLnRhc2tzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhZVxcXCJ9aS5pY29uLnRheGk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWJhXFxcIn1pLmljb24udGVsZWdyYW06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmM2XFxcIn1pLmljb24udGVsZWdyYW0ucGxhbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2ZlXFxcIn1pLmljb24udGVuY2VudC53ZWlibzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDVcXFwifWkuaWNvbi50ZXJtaW5hbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjBcXFwifWkuaWNvbi50ZXh0LmhlaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzRcXFwifWkuaWNvbi50ZXh0LndpZHRoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzNVxcXCJ9aS5pY29uLnRoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwYVxcXCJ9aS5pY29uLnRoLmxhcmdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwOVxcXCJ9aS5pY29uLnRoLmxpc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBiXFxcIn1pLmljb24udGhlbWVpc2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiMlxcXCJ9aS5pY29uLnRoZXJtb21ldGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ5MVxcXCJ9aS5pY29uLnRoZXJtb21ldGVyLmVtcHR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjYlxcXCJ9aS5pY29uLnRoZXJtb21ldGVyLmZ1bGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmM3XFxcIn1pLmljb24udGhlcm1vbWV0ZXIuaGFsZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYzlcXFwifWkuaWNvbi50aGVybW9tZXRlci5xdWFydGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjYVxcXCJ9aS5pY29uLnRoZXJtb21ldGVyLnRocmVlLnF1YXJ0ZXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjOFxcXCJ9aS5pY29uLnRodW1icy5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2NVxcXCJ9aS5pY29uLnRodW1icy51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjRcXFwifWkuaWNvbi50aHVtYnRhY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDhkXFxcIn1pLmljb24udGlja2V0LmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZmZcXFwifWkuaWNvbi50aW1lczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGRcXFwifWkuaWNvbi50aW1lcy5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU3XFxcIn1pLmljb24udGludDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDNcXFwifWkuaWNvbi50b2dnbGUub2ZmOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwNFxcXCJ9aS5pY29uLnRvZ2dsZS5vbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDVcXFwifWkuaWNvbi50cmFkZW1hcms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjVjXFxcIn1pLmljb24udHJhaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM4XFxcIn1pLmljb24udHJhbnNnZW5kZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI0XFxcIn1pLmljb24udHJhbnNnZW5kZXIuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyNVxcXCJ9aS5pY29uLnRyYXNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmOFxcXCJ9aS5pY29uLnRyYXNoLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZWRcXFwifWkuaWNvbi50cmVlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiYlxcXCJ9aS5pY29uLnRyZWxsbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODFcXFwifWkuaWNvbi50cmlwYWR2aXNvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjJcXFwifWkuaWNvbi50cm9waHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDkxXFxcIn1pLmljb24udHJ1Y2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQxXFxcIn1pLmljb24udHR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlNFxcXCJ9aS5pY29uLnR1bWJscjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNzNcXFwifWkuaWNvbi50dW1ibHIuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE3NFxcXCJ9aS5pY29uLnR2OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2Y1xcXCJ9aS5pY29uLnR3aXRjaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZThcXFwifWkuaWNvbi50d2l0dGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5OVxcXCJ9aS5pY29uLnR3aXR0ZXIuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4MVxcXCJ9aS5pY29uLnR5cG8zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyYlxcXCJ9aS5pY29uLnViZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDAyXFxcIn1pLmljb24udWlraXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDAzXFxcIn1pLmljb24udW1icmVsbGE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGU5XFxcIn1pLmljb24udW5kZXJsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjZFxcXCJ9aS5pY29uLnVuZG86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGUyXFxcIn1pLmljb24udW5kby5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmVhXFxcIn1pLmljb24udW5pcmVnaXN0cnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDA0XFxcIn1pLmljb24udW5pdmVyc2FsLmFjY2VzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOWFcXFwifWkuaWNvbi51bml2ZXJzaXR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5Y1xcXCJ9aS5pY29uLnVubGluazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjdcXFwifWkuaWNvbi51bmxvY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDljXFxcIn1pLmljb24udW5sb2NrLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxM2VcXFwifWkuaWNvbi51bnRhcHBkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwNVxcXCJ9aS5pY29uLnVwbG9hZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOTNcXFwifWkuaWNvbi51c2I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjg3XFxcIn1pLmljb24udXNlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDdcXFwifWkuaWNvbi51c2VyLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYmRcXFwifWkuaWNvbi51c2VyLm1kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmMFxcXCJ9aS5pY29uLnVzZXIucGx1czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzRcXFwifWkuaWNvbi51c2VyLnNlY3JldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMWJcXFwifWkuaWNvbi51c2VyLnRpbWVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzNVxcXCJ9aS5pY29uLnVzZXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjMFxcXCJ9aS5pY29uLnVzc3VubmFoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwN1xcXCJ9aS5pY29uLnV0ZW5zaWwuc3Bvb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmU1XFxcIn1pLmljb24udXRlbnNpbHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmU3XFxcIn1pLmljb24udmFhZGluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwOFxcXCJ9aS5pY29uLnZlbnVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyMVxcXCJ9aS5pY29uLnZlbnVzLmRvdWJsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjZcXFwifWkuaWNvbi52ZW51cy5tYXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyOFxcXCJ9aS5pY29uLnZpYWNvaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM3XFxcIn1pLmljb24udmlhZGVvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhOVxcXCJ9aS5pY29uLnZpYWRlby5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFhXFxcIn1pLmljb24udmliZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDA5XFxcIn1pLmljb24udmlkZW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDNkXFxcIn1pLmljb24udmltZW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDBhXFxcIn1pLmljb24udmltZW8uc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5NFxcXCJ9aS5pY29uLnZpbWVvLnY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjdkXFxcIn1pLmljb24udmluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxY2FcXFwifWkuaWNvbi52azpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODlcXFwifWkuaWNvbi52bnY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDBiXFxcIn1pLmljb24udm9sbGV5YmFsbC5iYWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ1ZlxcXCJ9aS5pY29uLnZvbHVtZS5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyN1xcXCJ9aS5pY29uLnZvbHVtZS5vZmY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDI2XFxcIn1pLmljb24udm9sdW1lLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyOFxcXCJ9aS5pY29uLnZ1ZWpzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxZlxcXCJ9aS5pY29uLndhcmVob3VzZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0OTRcXFwifWkuaWNvbi53ZWlibzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOGFcXFwifWkuaWNvbi53ZWlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDk2XFxcIn1pLmljb24ud2VpeGluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkN1xcXCJ9aS5pY29uLndoYXRzYXBwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzMlxcXCJ9aS5pY29uLndoYXRzYXBwLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MGNcXFwifWkuaWNvbi53aGVlbGNoYWlyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5M1xcXCJ9aS5pY29uLndobWNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwZFxcXCJ9aS5pY29uLndpZmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWViXFxcIn1pLmljb24ud2lraXBlZGlhLnc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjY2XFxcIn1pLmljb24ud2luZG93LmNsb3NlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxMFxcXCJ9aS5pY29uLndpbmRvdy5tYXhpbWl6ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDBcXFwifWkuaWNvbi53aW5kb3cubWluaW1pemU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQxXFxcIn1pLmljb24ud2luZG93LnJlc3RvcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQyXFxcIn1pLmljb24ud2luZG93czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxN2FcXFwifWkuaWNvbi53b24uc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTlcXFwifWkuaWNvbi53b3JkcHJlc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTlhXFxcIn1pLmljb24ud29yZHByZXNzLnNpbXBsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTFcXFwifWkuaWNvbi53cGJlZ2lubmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5N1xcXCJ9aS5pY29uLndwZXhwbG9yZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmRlXFxcIn1pLmljb24ud3Bmb3JtczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOThcXFwifWkuaWNvbi53cmVuY2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGFkXFxcIn1pLmljb24ueGJveDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTJcXFwifWkuaWNvbi54aW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2OFxcXCJ9aS5pY29uLnhpbmcuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2OVxcXCJ9aS5pY29uLnkuY29tYmluYXRvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyM2JcXFwifWkuaWNvbi55YWhvbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOWVcXFwifWkuaWNvbi55YW5kZXg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDEzXFxcIn1pLmljb24ueWFuZGV4LmludGVybmF0aW9uYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDE0XFxcIn1pLmljb24ueWVscDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTlcXFwifWkuaWNvbi55ZW4uc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTdcXFwifWkuaWNvbi55b2FzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjFcXFwifWkuaWNvbi55b3V0dWJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2N1xcXCJ9aS5pY29uLnlvdXR1YmUuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQzMVxcXCJ9aS5pY29uLmNoZXNzLnJvY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDQ3XFxcIn1pLmljb24ub3JkZXJlZC5saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjYlxcXCJ9aS5pY29uLnVub3JkZXJlZC5saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjYVxcXCJ9aS5pY29uLnVzZXIuZG9jdG9yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmMFxcXCJ9aS5pY29uLnNoaWVsZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWRcXFwifWkuaWNvbi5wdXp6bGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTJlXFxcIn1pLmljb24uY3JlZGl0LmNhcmQuYW1hem9uLnBheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MmRcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5hbWVyaWNhbi5leHByZXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmM1xcXCJ9aS5pY29uLmNyZWRpdC5jYXJkLmRpbmVycy5jbHViOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0Y1xcXCJ9aS5pY29uLmNyZWRpdC5jYXJkLmRpc2NvdmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMlxcXCJ9aS5pY29uLmNyZWRpdC5jYXJkLmpjYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGJcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5tYXN0ZXJjYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMVxcXCJ9aS5pY29uLmNyZWRpdC5jYXJkLnBheXBhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjRcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5zdHJpcGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY1XFxcIn1pLmljb24uY3JlZGl0LmNhcmQudmlzYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjBcXFwifWkuaWNvbi5hZGQuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1NVxcXCJ9aS5pY29uLmFkZC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZlXFxcIn1pLmljb24uYWRkLnRvLmNhbGVuZGFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3MVxcXCJ9aS5pY29uLmFkZC50by5jYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxN1xcXCJ9aS5pY29uLmFkZC51c2VyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzNFxcXCJ9aS5pY29uLmFkZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjdcXFwifWkuaWNvbi5hbGFybS5tdXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmNlxcXCJ9aS5pY29uLmFsYXJtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmM1xcXCJ9aS5pY29uLmFsZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTJcXFwifWkuaWNvbi5hbHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmEyXFxcIn1pLmljb24uYW1lcmljYW4uZXhwcmVzcy5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmM1xcXCJ9aS5pY29uLmFtZXJpY2FuLmV4cHJlc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYzXFxcIn1pLmljb24uYW1leDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjNcXFwifWkuaWNvbi5hbm5vdW5jZW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGExXFxcIn1pLmljb24uYXJlYS5jaGFydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZmVcXFwifWkuaWNvbi5hcmVhLmdyYXBoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmZVxcXCJ9aS5pY29uLmFycm93LmRvd24uY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMThcXFwifWkuaWNvbi5hc2V4dWFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyZFxcXCJ9aS5pY29uLmFzbC5pbnRlcnByZXRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmEzXFxcIn1pLmljb24uYXNsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhM1xcXCJ9aS5pY29uLmFzc2lzdGl2ZS5saXN0ZW5pbmcuZGV2aWNlczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTJcXFwifWkuaWNvbi5hdHRhY2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM2XFxcIn1pLmljb24uYXR0ZW50aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2YVxcXCJ9aS5pY29uLmJhbGFuY2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRlXFxcIn1pLmljb24uYmFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmY1xcXCJ9aS5pY29uLmJhdGh0dWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmNkXFxcIn1pLmljb24uYmF0dGVyeS5mb3VyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0MFxcXCJ9aS5pY29uLmJhdHRlcnkuaGlnaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDFcXFwifWkuaWNvbi5iYXR0ZXJ5LmxvdzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDNcXFwifWkuaWNvbi5iYXR0ZXJ5Lm1lZGl1bTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDJcXFwifWkuaWNvbi5iYXR0ZXJ5Lm9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDNcXFwifWkuaWNvbi5iYXR0ZXJ5LnRocmVlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0MVxcXCJ9aS5pY29uLmJhdHRlcnkudHdvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0MlxcXCJ9aS5pY29uLmJhdHRlcnkuemVybzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDRcXFwifWkuaWNvbi5iaXJ0aGRheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZmRcXFwifWkuaWNvbi5ibG9jay5sYXlvdXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA5XFxcIn1pLmljb24uYmx1ZXRvb3RoLmFsdGVybmF0aXZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5NFxcXCJ9aS5pY29uLmJyb2tlbi5jaGFpbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjdcXFwifWkuaWNvbi5icm93c2VyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyMlxcXCJ9aS5pY29uLmNhbGwuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5OFxcXCJ9aS5pY29uLmNhbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDk1XFxcIn1pLmljb24uY2FuY2VsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZFxcXCJ9aS5pY29uLmNhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDdhXFxcIn1pLmljb24uY2M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjBhXFxcIn1pLmljb24uY2hhaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGMxXFxcIn1pLmljb24uY2hhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzVcXFwifWkuaWNvbi5jaGVja2VkLmNhbGVuZGFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3NFxcXCJ9aS5pY29uLmNoZWNrbWFyazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGNcXFwifWkuaWNvbi5jaXJjbGUubm90Y2hlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxY2VcXFwifWkuaWNvbi5jbG9zZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGRcXFwifWkuaWNvbi5jbnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU3XFxcIn1pLmljb24uY29ja3RhaWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDAwXFxcIn1pLmljb24uY29tbWVudGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyN2FcXFwifWkuaWNvbi5jb21wdXRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMDhcXFwifWkuaWNvbi5jb25maWd1cmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGFkXFxcIn1pLmljb24uY29udGVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzlcXFwifWkuaWNvbi5kZWFmbmVzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTRcXFwifWkuaWNvbi5kZWxldGUuY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjczXFxcIn1pLmljb24uZGVsZXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZFxcXCJ9aS5pY29uLmRldGVjdGl2ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMWJcXFwifWkuaWNvbi5kaW5lcnMuY2x1Yi5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0Y1xcXCJ9aS5pY29uLmRpbmVycy5jbHViOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0Y1xcXCJ9aS5pY29uLmRpc2NvdmVyLmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYyXFxcIn1pLmljb24uZGlzY292ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYyXFxcIn1pLmljb24uZGlzY3Vzc2lvbnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg2XFxcIn1pLmljb24uZG9jdG9yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmMFxcXCJ9aS5pY29uLmRvbGxhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTVcXFwifWkuaWNvbi5kb250OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1ZVxcXCJ9aS5pY29uLmRyaWJibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTdkXFxcIn1pLmljb24uZHJpdmVycy5saWNlbnNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjMlxcXCJ9aS5pY29uLmRyb3Bkb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkN1xcXCJ9aS5pY29uLmVlcmNhc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmRhXFxcIn1pLmljb24uZW1lcmdlbmN5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmOVxcXCJ9aS5pY29uLmVudmlyYS5nYWxsZXJ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5OVxcXCJ9aS5pY29uLmVyYXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyZFxcXCJ9aS5pY29uLmV1cjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTNcXFwifWkuaWNvbi5ldXJvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1M1xcXCJ9aS5pY29uLmV5ZWRyb3BwZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWZiXFxcIn1pLmljb24uZmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmI0XFxcIn1pLmljb24uZmFjdG9yeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzVcXFwifWkuaWNvbi5mYXZvcml0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDVcXFwifWkuaWNvbi5mZWVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5ZVxcXCJ9aS5pY29uLmZlbWFsZS5ob21vc2V4dWFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyNlxcXCJ9aS5pY29uLmZpbGUudGV4dDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWNcXFwifWkuaWNvbi5maW5kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlNVxcXCJ9aS5pY29uLmZpcnN0LmFpZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmFcXFwifWkuaWNvbi5maXZlLmh1bmRyZWQucGl4ZWxzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2ZVxcXCJ9aS5pY29uLmZvcms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI2XFxcIn1pLmljb24uZ2FtZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMWJcXFwifWkuaWNvbi5nYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI3XFxcIn1pLmljb24uZ2JwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NFxcXCJ9aS5pY29uLmdpdHRpcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODRcXFwifWkuaWNvbi5nb29nbGUucGx1cy5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmIzXFxcIn1pLmljb24uZ29vZ2xlLnBsdXMub2ZmaWNpYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmIzXFxcIn1pLmljb24uZ3JhYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTVcXFwifWkuaWNvbi5ncmFkdWF0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5ZFxcXCJ9aS5pY29uLmdyaWQubGF5b3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwYVxcXCJ9aS5pY29uLmdyb3VwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjMFxcXCJ9aS5pY29uLmg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZkXFxcIn1pLmljb24uaGFuZC52aWN0b3J5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1YlxcXCJ9aS5pY29uLmhhbmRpY2FwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5M1xcXCJ9aS5pY29uLmhhcmQub2YuaGVhcmluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTRcXFwifWkuaWNvbi5oZWFkZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWRjXFxcIn1pLmljb24uaGVscC5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU5XFxcIn1pLmljb24uaGVscDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjhcXFwifWkuaWNvbi5oZXRlcm9zZXh1YWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI4XFxcIn1pLmljb24uaGlkZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzBcXFwifWkuaWNvbi5ob3RlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzZcXFwifWkuaWNvbi5ob3VyZ2xhc3MuZm91cjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTRcXFwifWkuaWNvbi5ob3VyZ2xhc3MuZnVsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTRcXFwifWkuaWNvbi5ob3VyZ2xhc3Mub25lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1MVxcXCJ9aS5pY29uLmhvdXJnbGFzcy50aHJlZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTNcXFwifWkuaWNvbi5ob3VyZ2xhc3MudHdvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1MlxcXCJ9aS5pY29uLmlkZWE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGViXFxcIn1pLmljb24uaWxzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwYlxcXCJ9aS5pY29uLmluLWNhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE4XFxcIn1pLmljb24uaW5yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NlxcXCJ9aS5pY29uLmludGVyZ2VuZGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyNFxcXCJ9aS5pY29uLmludGVyc2V4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyNFxcXCJ9aS5pY29uLmphcGFuLmNyZWRpdC5idXJlYXUuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGJcXFwifWkuaWNvbi5qYXBhbi5jcmVkaXQuYnVyZWF1OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0YlxcXCJ9aS5pY29uLmpjYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGJcXFwifWkuaWNvbi5qcHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU3XFxcIn1pLmljb24ua3J3OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1OVxcXCJ9aS5pY29uLmxhYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzNcXFwifWkuaWNvbi5sYXc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRlXFxcIn1pLmljb24ubGVnYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGUzXFxcIn1pLmljb24ubGVzYmlhbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjZcXFwifWkuaWNvbi5saWdodG5pbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGU3XFxcIn1pLmljb24ubGlrZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDRcXFwifWkuaWNvbi5saW5lLmdyYXBoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwMVxcXCJ9aS5pY29uLmxpbmtlZGluLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOGNcXFwifWkuaWNvbi5saW5raWZ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjMVxcXCJ9aS5pY29uLmxpcmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTk1XFxcIn1pLmljb24ubGlzdC5sYXlvdXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBiXFxcIn1pLmljb24ubWFnbmlmeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGVcXFwifWkuaWNvbi5tYWlsLmZvcndhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDY0XFxcIn1pLmljb24ubWFpbC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTk5XFxcIn1pLmljb24ubWFpbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTBcXFwifWkuaWNvbi5tYWxlLmhvbW9zZXh1YWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI3XFxcIn1pLmljb24ubWFuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyMlxcXCJ9aS5pY29uLm1hcmtlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDFcXFwifWkuaWNvbi5tYXJzLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjlcXFwifWkuaWNvbi5tYXJzLmhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJiXFxcIn1pLmljb24ubWFycy52ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmFcXFwifWkuaWNvbi5tYXN0ZXJjYXJkLmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYxXFxcIn1pLmljb24ubWFzdGVyY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjFcXFwifWkuaWNvbi5taWNyb3NvZnQuZWRnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODJcXFwifWkuaWNvbi5taWxpdGFyeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmJcXFwifWkuaWNvbi5tcy5lZGdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4MlxcXCJ9aS5pY29uLm11dGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTMxXFxcIn1pLmljb24ubmV3LnBpZWQucGlwZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFlXFxcIn1pLmljb24ubm9uLmJpbmFyeS50cmFuc2dlbmRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjNcXFwifWkuaWNvbi5udW1iZXJlZC5saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjYlxcXCJ9aS5pY29uLm9wdGlubW9uc3RlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyM2NcXFwifWkuaWNvbi5vcHRpb25zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkZVxcXCJ9aS5pY29uLm90aGVyLmdlbmRlci5ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyYlxcXCJ9aS5pY29uLm90aGVyLmdlbmRlci52ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmFcXFwifWkuaWNvbi5vdGhlci5nZW5kZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI5XFxcIn1pLmljb24ucGF5bWVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWRcXFwifWkuaWNvbi5wYXlwYWwuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjRcXFwifWkuaWNvbi5wZW5jaWwuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0YlxcXCJ9aS5pY29uLnBob3RvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzMFxcXCJ9aS5pY29uLnBpY3R1cmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDNlXFxcIn1pLmljb24ucGllLmNoYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwMFxcXCJ9aS5pY29uLnBpZS5ncmFwaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDBcXFwifWkuaWNvbi5waWVkLnBpcGVyLmhhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYWVcXFwifWkuaWNvbi5waW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDhkXFxcIn1pLmljb24ucGx1cy5jYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxN1xcXCJ9aS5pY29uLnBvY2tldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjVcXFwifWkuaWNvbi5wb2ludDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDFcXFwifWkuaWNvbi5wb2ludGluZy5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhN1xcXCJ9aS5pY29uLnBvaW50aW5nLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE1XFxcIn1pLmljb24ucG9pbnRpbmcucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE0XFxcIn1pLmljb24ucG9pbnRpbmcudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE2XFxcIn1pLmljb24ucG91bmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU0XFxcIn1pLmljb24ucG93ZXIuY29yZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTZcXFwifWkuaWNvbi5wb3dlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTFcXFwifWkuaWNvbi5wcml2YWN5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4NFxcXCJ9aS5pY29uLnIuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1ZFxcXCJ9aS5pY29uLnJhaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGU5XFxcIn1pLmljb24ucmVjb3JkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzZFxcXCJ9aS5pY29uLnJlZnJlc2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDIxXFxcIn1pLmljb24ucmVtb3ZlLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTdcXFwifWkuaWNvbi5yZW1vdmUuZnJvbS5jYWxlbmRhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzJcXFwifWkuaWNvbi5yZW1vdmUudXNlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzVcXFwifWkuaWNvbi5yZW1vdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBkXFxcIn1pLmljb24ucmVwZWF0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxZVxcXCJ9aS5pY29uLnJtYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTdcXFwifWkuaWNvbi5yb3VibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU4XFxcIn1pLmljb24ucnViOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1OFxcXCJ9aS5pY29uLnJ1YmxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1OFxcXCJ9aS5pY29uLnJ1cGVlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NlxcXCJ9aS5pY29uLnMxNTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyY2RcXFwifWkuaWNvbi5zZWxlY3RlZC5yYWRpbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTJcXFwifWkuaWNvbi5zZW5kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkOFxcXCJ9aS5pY29uLnNldHRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDEzXFxcIn1pLmljb24uc2V0dGluZ3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg1XFxcIn1pLmljb24uc2hla2VsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwYlxcXCJ9aS5pY29uLnNoZXFlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGJcXFwifWkuaWNvbi5zaGlwcGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDFcXFwifWkuaWNvbi5zaG9wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3YVxcXCJ9aS5pY29uLnNodWZmbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc0XFxcIn1pLmljb24uc2h1dGRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDExXFxcIn1pLmljb24uc2lkZWJhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzlcXFwifWkuaWNvbi5zaWduaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhN1xcXCJ9aS5pY29uLnNpZ251cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDRcXFwifWkuaWNvbi5zbGlkZXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkZVxcXCJ9aS5pY29uLnNvY2NlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTNcXFwifWkuaWNvbi5zb3J0LmFscGhhYmV0LmFzY2VuZGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWRcXFwifWkuaWNvbi5zb3J0LmFscGhhYmV0LmRlc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTVlXFxcIn1pLmljb24uc29ydC5hc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRlXFxcIn1pLmljb24uc29ydC5jb250ZW50LmFzY2VuZGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjBcXFwifWkuaWNvbi5zb3J0LmNvbnRlbnQuZGVzY2VuZGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjFcXFwifWkuaWNvbi5zb3J0LmRlc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRkXFxcIn1pLmljb24uc29ydC5udW1lcmljLmFzY2VuZGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjJcXFwifWkuaWNvbi5zb3J0Lm51bWVyaWMuZGVzY2VuZGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjNcXFwifWkuaWNvbi5zb3VuZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjVcXFwifWkuaWNvbi5zcHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjFiXFxcIn1pLmljb24uc3RyaXBlLmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY1XFxcIn1pLmljb24uc3R1ZGVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOWRcXFwifWkuaWNvbi50YWxrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3YVxcXCJ9aS5pY29uLnRhcmdldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDBcXFwifWkuaWNvbi50ZWxldHlwZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTRcXFwifWkuaWNvbi50ZWxldmlzaW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2Y1xcXCJ9aS5pY29uLnRleHQuY3Vyc29yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0NlxcXCJ9aS5pY29uLnRleHQudGVsZXBob25lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlNFxcXCJ9aS5pY29uLnRoZW1lLmlzbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmIyXFxcIn1pLmljb24udGhlbWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQzXFxcIn1pLmljb24udGhlcm1vbWV0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmM3XFxcIn1pLmljb24udGh1bWIudGFjazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOGRcXFwifWkuaWNvbi50aW1lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxN1xcXCJ9aS5pY29uLnRtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1Y1xcXCJ9aS5pY29uLnRvZ2dsZS5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1MFxcXCJ9aS5pY29uLnRvZ2dsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5MVxcXCJ9aS5pY29uLnRvZ2dsZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTJcXFwifWkuaWNvbi50b2dnbGUudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUxXFxcIn1pLmljb24udHJhbnNsYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhYlxcXCJ9aS5pY29uLnRyYXZlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYjFcXFwifWkuaWNvbi50cmVhdG1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGYxXFxcIn1pLmljb24udHJpYW5nbGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDdcXFwifWkuaWNvbi50cmlhbmdsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkOVxcXCJ9aS5pY29uLnRyaWFuZ2xlLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkYVxcXCJ9aS5pY29uLnRyaWFuZ2xlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkOFxcXCJ9aS5pY29uLnRyeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTVcXFwifWkuaWNvbi51bmhpZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDZlXFxcIn1pLmljb24udW5saW5raWZ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyN1xcXCJ9aS5pY29uLnVubXV0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzBcXFwifWkuaWNvbi51c2Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU1XFxcIn1pLmljb24udXNlci5jYW5jZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM1XFxcIn1pLmljb24udXNlci5jbG9zZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzVcXFwifWkuaWNvbi51c2VyLmRlbGV0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzVcXFwifWkuaWNvbi51c2VyLng6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM1XFxcIn1pLmljb24udmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmJiXFxcIn1pLmljb24udmlkZW8uY2FtZXJhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzZFxcXCJ9aS5pY29uLnZpZGVvLnBsYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTQ0XFxcIn1pLmljb24udmlzYS5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMFxcXCJ9aS5pY29uLnZpc2E6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYwXFxcIn1pLmljb24udm9sdW1lLmNvbnRyb2wucGhvbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmEwXFxcIn1pLmljb24ud2FpdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTdcXFwifWkuaWNvbi53YXJuaW5nLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNmFcXFwifWkuaWNvbi53YXJuaW5nLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDcxXFxcIn1pLmljb24ud2FybmluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMmFcXFwifWkuaWNvbi53ZWNoYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQ3XFxcIn1pLmljb24ud2ktZmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWViXFxcIn1pLmljb24ud2lraXBlZGlhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2NlxcXCJ9aS5pY29uLndpbm5lcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOTFcXFwifWkuaWNvbi53aXphcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQwXFxcIn1pLmljb24ud29tYW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjIxXFxcIn1pLmljb24ud29uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1OVxcXCJ9aS5pY29uLndvcmRwcmVzcy5iZWdpbm5lcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTdcXFwifWkuaWNvbi53b3JkcHJlc3MuZm9ybXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk4XFxcIn1pLmljb24ud29ybGQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGFjXFxcIn1pLmljb24ud3JpdGUuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0YlxcXCJ9aS5pY29uLng6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBkXFxcIn1pLmljb24ueWM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNiXFxcIn1pLmljb24ueWNvbWJpbmF0b3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNiXFxcIn1pLmljb24ueWVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1N1xcXCJ9aS5pY29uLnppcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODdcXFwifWkuaWNvbi56b29tLWluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZVxcXCJ9aS5pY29uLnpvb20tb3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxMFxcXCJ9aS5pY29uLnpvb206YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBlXFxcIn1pLmljb24uYml0YnVja2V0LnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNzFcXFwifWkuaWNvbi5jaGVja21hcmsuYm94OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0YVxcXCJ9aS5pY29uLmNpcmNsZS50aGluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExMVxcXCJ9aS5pY29uLmNsb3VkLmRvd25sb2FkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4MVxcXCJ9aS5pY29uLmNsb3VkLnVwbG9hZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzODJcXFwifWkuaWNvbi5jb21wb3NlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwM1xcXCJ9aS5pY29uLmNvbnZlcnNhdGlvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODZcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5hbHRlcm5hdGl2ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWRcXFwifWkuaWNvbi5jdXJyZW5jeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDFcXFwifWkuaWNvbi5kYXNoYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2ZkXFxcIn1pLmljb24uZGlhbW9uZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTVcXFwifWkuaWNvbi5kaXNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhMFxcXCJ9aS5pY29uLmV4Y2hhbmdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM2MlxcXCJ9aS5pY29uLmV4dGVybmFsLnNoYXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0ZFxcXCJ9aS5pY29uLmV4dGVybmFsLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNjBcXFwifWkuaWNvbi5leHRlcm5hbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNWRcXFwifWkuaWNvbi5mYWNlYm9vay5vZmZpY2lhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODJcXFwifWkuaWNvbi5mb29kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJlN1xcXCJ9aS5pY29uLmhvdXJnbGFzcy56ZXJvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1M1xcXCJ9aS5pY29uLmxldmVsLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2JlXFxcIn1pLmljb24ubGV2ZWwudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2JmXFxcIn1pLmljb24ubG9nb3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmNVxcXCJ9aS5pY29uLm1lYW5wYXRoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjOFxcXCJ9aS5pY29uLm1vbmV5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkMVxcXCJ9aS5pY29uLm1vdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGIyXFxcIn1pLmljb24ucGVuY2lsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwM1xcXCJ9aS5pY29uLnByb3RlY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDIzXFxcIn1pLmljb24ucmFkaW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTkyXFxcIn1pLmljb24ucmVtb3ZlLmJvb2ttYXJrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyZVxcXCJ9aS5pY29uLnJlc2l6ZS5ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMzN1xcXCJ9aS5pY29uLnJlc2l6ZS52ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMzhcXFwifWkuaWNvbi5zaWduLWluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmNlxcXCJ9aS5pY29uLnNpZ24tb3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmNVxcXCJ9aS5pY29uLnNwb29uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJlNVxcXCJ9aS5pY29uLnN0YXIuaGFsZi5lbXB0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODlcXFwifWkuaWNvbi5zdGFyLmhhbGYuZnVsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODlcXFwifWkuaWNvbi50aWNrZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2ZmXFxcIn1pLmljb24udGltZXMucmVjdGFuZ2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxMFxcXCJ9aS5pY29uLndyaXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwM1xcXCJ9aS5pY29uLnlvdXR1YmUucGxheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjdcXFwifUBmb250LWZhY2V7Zm9udC1mYW1pbHk6b3V0bGluZS1pY29ucztzcmM6dXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfN19fXyArIFwiKTtzcmM6dXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOF9fXyArIFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfOV9fXyArIFwiKSBmb3JtYXQoJ3dvZmYyJyksdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTBfX18gKyBcIikgZm9ybWF0KCd3b2ZmJyksdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTFfX18gKyBcIikgZm9ybWF0KCd0cnVldHlwZScpLHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzEyX19fICsgXCIpIGZvcm1hdCgnc3ZnJyk7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtdmFyaWFudDpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7dGV4dC10cmFuc2Zvcm06bm9uZX1pLmljb24ub3V0bGluZXtmb250LWZhbWlseTpvdXRsaW5lLWljb25zfWkuaWNvbi5hZGRyZXNzLmJvb2sub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjlcXFwifWkuaWNvbi5hZGRyZXNzLmNhcmQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYmJcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLmRvd24ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNThcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLmxlZnQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNTlcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLnJpZ2h0Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzVhXFxcIn1pLmljb24uYXJyb3cuYWx0ZXJuYXRlLmNpcmNsZS51cC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1YlxcXCJ9aS5pY29uLmJlbGwub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjNcXFwifWkuaWNvbi5iZWxsLnNsYXNoLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY2XFxcIn1pLmljb24uYm9va21hcmsub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmVcXFwifWkuaWNvbi5idWlsZGluZy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhZFxcXCJ9aS5pY29uLmNhbGVuZGFyLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTMzXFxcIn1pLmljb24uY2FsZW5kYXIuYWx0ZXJuYXRlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDczXFxcIn1pLmljb24uY2FsZW5kYXIuY2hlY2sub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzRcXFwifWkuaWNvbi5jYWxlbmRhci5taW51cy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3MlxcXCJ9aS5pY29uLmNhbGVuZGFyLnBsdXMub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzFcXFwifWkuaWNvbi5jYWxlbmRhci50aW1lcy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3M1xcXCJ9aS5pY29uLmNhcmV0LnNxdWFyZS5kb3duLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUwXFxcIn1pLmljb24uY2FyZXQuc3F1YXJlLmxlZnQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTFcXFwifWkuaWNvbi5jYXJldC5zcXVhcmUucmlnaHQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTJcXFwifWkuaWNvbi5jYXJldC5zcXVhcmUudXAub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTFcXFwifWkuaWNvbi5jaGFydC5iYXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODBcXFwifWkuaWNvbi5jaGVjay5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNThcXFwifWkuaWNvbi5jaGVjay5zcXVhcmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGFcXFwifWkuaWNvbi5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMTFcXFwifWkuaWNvbi5jbGlwYm9hcmQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMjhcXFwifWkuaWNvbi5jbG9jay5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxN1xcXCJ9aS5pY29uLmNsb25lLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRkXFxcIn1pLmljb24uY2xvc2VkLmNhcHRpb25pbmcub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGFcXFwifWkuaWNvbi5jb21tZW50Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc1XFxcIn1pLmljb24uY29tbWVudC5hbHRlcm5hdGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyN2FcXFwifWkuaWNvbi5jb21tZW50cy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4NlxcXCJ9aS5pY29uLmNvbXBhc3Mub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGVcXFwifWkuaWNvbi5jb3B5Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM1XFxcIn1pLmljb24uY29weXJpZ2h0Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY5XFxcIn1pLmljb24uY3JlZGl0LmNhcmQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWRcXFwifWkuaWNvbi5kb3QuY2lyY2xlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTkyXFxcIn1pLmljb24uZWRpdC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0NFxcXCJ9aS5pY29uLmVudmVsb3BlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGUwXFxcIn1pLmljb24uZW52ZWxvcGUub3Blbi5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiNlxcXCJ9aS5pY29uLmV5ZS5zbGFzaC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3MFxcXCJ9aS5pY29uLmZpbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWJcXFwifWkuaWNvbi5maWxlLmFsdGVybmF0ZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1Y1xcXCJ9aS5pY29uLmZpbGUuYXJjaGl2ZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjNlxcXCJ9aS5pY29uLmZpbGUuYXVkaW8ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzdcXFwifWkuaWNvbi5maWxlLmNvZGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzlcXFwifWkuaWNvbi5maWxlLmV4Y2VsLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWMzXFxcIn1pLmljb24uZmlsZS5pbWFnZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjNVxcXCJ9aS5pY29uLmZpbGUucGRmLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWMxXFxcIn1pLmljb24uZmlsZS5wb3dlcnBvaW50Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM0XFxcIn1pLmljb24uZmlsZS52aWRlby5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjOFxcXCJ9aS5pY29uLmZpbGUud29yZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjMlxcXCJ9aS5pY29uLmZsYWcub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjRcXFwifWkuaWNvbi5mb2xkZXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwN2JcXFwifWkuaWNvbi5mb2xkZXIub3Blbi5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3Y1xcXCJ9aS5pY29uLmZyb3duLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTE5XFxcIn1pLmljb24uZnV0Ym9sLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWUzXFxcIn1pLmljb24uZ2VtLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2E1XFxcIn1pLmljb24uaGFuZC5saXphcmQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNThcXFwifWkuaWNvbi5oYW5kLnBhcGVyLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU2XFxcIn1pLmljb24uaGFuZC5wZWFjZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1YlxcXCJ9aS5pY29uLmhhbmQucG9pbnQuZG93bi5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhN1xcXCJ9aS5pY29uLmhhbmQucG9pbnQubGVmdC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNVxcXCJ9aS5pY29uLmhhbmQucG9pbnQucmlnaHQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTRcXFwifWkuaWNvbi5oYW5kLnBvaW50LnVwLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE2XFxcIn1pLmljb24uaGFuZC5wb2ludGVyLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjVhXFxcIn1pLmljb24uaGFuZC5yb2NrLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU1XFxcIn1pLmljb24uaGFuZC5zY2lzc29ycy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1N1xcXCJ9aS5pY29uLmhhbmQuc3BvY2sub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTlcXFwifWkuaWNvbi5oYW5kc2hha2Uub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjVcXFwifWkuaWNvbi5oZGQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTBcXFwifWkuaWNvbi5oZWFydC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwNFxcXCJ9aS5pY29uLmhvc3BpdGFsLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGY4XFxcIn1pLmljb24uaG91cmdsYXNzLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU0XFxcIn1pLmljb24uaWQuYmFkZ2Uub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYzFcXFwifWkuaWNvbi5pZC5jYXJkLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmMyXFxcIn1pLmljb24uaW1hZ2Uub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwM2VcXFwifWkuaWNvbi5pbWFnZXMub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMDJcXFwifWkuaWNvbi5rZXlib2FyZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExY1xcXCJ9aS5pY29uLmxlbW9uLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDk0XFxcIn1pLmljb24ubGlmZS5yaW5nLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWNkXFxcIn1pLmljb24ubGlnaHRidWxiLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGViXFxcIn1pLmljb24ubGlzdC5hbHRlcm5hdGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjJcXFwifWkuaWNvbi5tYXAub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzlcXFwifWkuaWNvbi5tZWgub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMWFcXFwifWkuaWNvbi5taW51cy5zcXVhcmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDZcXFwifWkuaWNvbi5tb25leS5iaWxsLmFsdGVybmF0ZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkMVxcXCJ9aS5pY29uLm1vb24ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODZcXFwifWkuaWNvbi5uZXdzcGFwZXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZWFcXFwifWkuaWNvbi5vYmplY3QuZ3JvdXAub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDdcXFwifWkuaWNvbi5vYmplY3QudW5ncm91cC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0OFxcXCJ9aS5pY29uLnBhcGVyLnBsYW5lLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQ4XFxcIn1pLmljb24ucGF1c2UuY2lyY2xlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjhiXFxcIn1pLmljb24ucGxheS5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDRcXFwifWkuaWNvbi5wbHVzLnNxdWFyZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmZVxcXCJ9aS5pY29uLnF1ZXN0aW9uLmNpcmNsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1OVxcXCJ9aS5pY29uLnJlZ2lzdGVyZWQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWRcXFwifWkuaWNvbi5zYXZlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM3XFxcIn1pLmljb24uc2hhcmUuc3F1YXJlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTRkXFxcIn1pLmljb24uc21pbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMThcXFwifWkuaWNvbi5zbm93Zmxha2Uub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZGNcXFwifWkuaWNvbi5zcXVhcmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzhcXFwifWkuaWNvbi5zdGFyLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA1XFxcIn1pLmljb24uc3Rhci5oYWxmLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg5XFxcIn1pLmljb24uc3RpY2t5Lm5vdGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDlcXFwifWkuaWNvbi5zdG9wLmNpcmNsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4ZFxcXCJ9aS5pY29uLnN1bi5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4NVxcXCJ9aS5pY29uLnRodW1icy5kb3duLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTY1XFxcIn1pLmljb24udGh1bWJzLnVwLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTY0XFxcIn1pLmljb24udGltZXMuY2lyY2xlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU3XFxcIn1pLmljb24udHJhc2guYWx0ZXJuYXRlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmVkXFxcIn1pLmljb24udXNlci5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwN1xcXCJ9aS5pY29uLnVzZXIuY2lyY2xlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmJkXFxcIn1pLmljb24ud2luZG93LmNsb3NlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDEwXFxcIn1pLmljb24ud2luZG93Lm1heGltaXplLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQwXFxcIn1pLmljb24ud2luZG93Lm1pbmltaXplLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQxXFxcIn1pLmljb24ud2luZG93LnJlc3RvcmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDJcXFwifWkuaWNvbi5kaXNrLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGEwXFxcIn1pLmljb24uaGVhcnQuZW1wdHksaS5pY29uLnN0YXIuZW1wdHl7Zm9udC1mYW1pbHk6b3V0bGluZS1pY29uc31pLmljb24uaGVhcnQuZW1wdHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA0XFxcIn1pLmljb24uc3Rhci5lbXB0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODlcXFwifUBmb250LWZhY2V7Zm9udC1mYW1pbHk6YnJhbmQtaWNvbnM7c3JjOnVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzEzX19fICsgXCIpO3NyYzp1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xNF9fXyArIFwiKSBmb3JtYXQoJ2VtYmVkZGVkLW9wZW50eXBlJyksdXJsKFwiICsgX19fQ1NTX0xPQURFUl9VUkxfUkVQTEFDRU1FTlRfMTVfX18gKyBcIikgZm9ybWF0KCd3b2ZmMicpLHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE2X19fICsgXCIpIGZvcm1hdCgnd29mZicpLHVybChcIiArIF9fX0NTU19MT0FERVJfVVJMX1JFUExBQ0VNRU5UXzE3X19fICsgXCIpIGZvcm1hdCgndHJ1ZXR5cGUnKSx1cmwoXCIgKyBfX19DU1NfTE9BREVSX1VSTF9SRVBMQUNFTUVOVF8xOF9fXyArIFwiKSBmb3JtYXQoJ3N2ZycpO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjppbmhlcml0O3RleHQtdHJhbnNmb3JtOm5vbmV9aS5pY29uLlxcXFwzNSAwMHB4LGkuaWNvbi5hY2Nlc3NpYmxlLmljb24saS5pY29uLmFjY3Vzb2Z0LGkuaWNvbi5hZG4saS5pY29uLmFkdmVyc2FsLGkuaWNvbi5hZmZpbGlhdGV0aGVtZSxpLmljb24uYWxnb2xpYSxpLmljb24uYW1hem9uLGkuaWNvbi5hbWF6b24ucGF5LGkuaWNvbi5hbWlsaWEsaS5pY29uLmFuZHJvaWQsaS5pY29uLmFuZ2VsbGlzdCxpLmljb24uYW5ncnljcmVhdGl2ZSxpLmljb24uYW5ndWxhcixpLmljb24uYXBwLnN0b3JlLGkuaWNvbi5hcHAuc3RvcmUuaW9zLGkuaWNvbi5hcHBlcixpLmljb24uYXBwbGUsaS5pY29uLmFwcGxlLnBheSxpLmljb24uYXN5bW1ldHJpayxpLmljb24uYXVkaWJsZSxpLmljb24uYXV0b3ByZWZpeGVyLGkuaWNvbi5hdmlhbmV4LGkuaWNvbi5hdmlhdG8saS5pY29uLmF3cyxpLmljb24uYmFuZGNhbXAsaS5pY29uLmJlaGFuY2UsaS5pY29uLmJlaGFuY2Uuc3F1YXJlLGkuaWNvbi5iaW1vYmplY3QsaS5pY29uLmJpdGJ1Y2tldCxpLmljb24uYml0Y29pbixpLmljb24uYml0eSxpLmljb24uYmxhY2sudGllLGkuaWNvbi5ibGFja2JlcnJ5LGkuaWNvbi5ibG9nZ2VyLGkuaWNvbi5ibG9nZ2VyLmIsaS5pY29uLmJsdWV0b290aCxpLmljb24uYmx1ZXRvb3RoLmIsaS5pY29uLmJ0YyxpLmljb24uYnVyb21vYmVsZXhwZXJ0ZSxpLmljb24uYnV5c2VsbGFkcyxpLmljb24uY2MuYW1hem9uLnBheSxpLmljb24uY2MuYW1leCxpLmljb24uY2MuYXBwbGUucGF5LGkuaWNvbi5jYy5kaW5lcnMuY2x1YixpLmljb24uY2MuZGlzY292ZXIsaS5pY29uLmNjLmpjYixpLmljb24uY2MubWFzdGVyY2FyZCxpLmljb24uY2MucGF5cGFsLGkuaWNvbi5jYy5zdHJpcGUsaS5pY29uLmNjLnZpc2EsaS5pY29uLmNlbnRlcmNvZGUsaS5pY29uLmNocm9tZSxpLmljb24uY2xvdWRzY2FsZSxpLmljb24uY2xvdWRzbWl0aCxpLmljb24uY2xvdWR2ZXJzaWZ5LGkuaWNvbi5jb2RlcGVuLGkuaWNvbi5jb2RpZXBpZSxpLmljb24uY29ubmVjdGRldmVsb3AsaS5pY29uLmNvbnRhbyxpLmljb24uY3BhbmVsLGkuaWNvbi5jcmVhdGl2ZS5jb21tb25zLGkuaWNvbi5jc3MzLGkuaWNvbi5jc3MzLmFsdGVybmF0ZSxpLmljb24uY3V0dGxlZmlzaCxpLmljb24uZC5hbmQuZCxpLmljb24uZGFzaGN1YmUsaS5pY29uLmRlbGljaW91cyxpLmljb24uZGVwbG95ZG9nLGkuaWNvbi5kZXNrcHJvLGkuaWNvbi5kZXZpYW50YXJ0LGkuaWNvbi5kaWdnLGkuaWNvbi5kaWdpdGFsLm9jZWFuLGkuaWNvbi5kaXNjb3JkLGkuaWNvbi5kaXNjb3Vyc2UsaS5pY29uLmRvY2h1YixpLmljb24uZG9ja2VyLGkuaWNvbi5kcmFmdDJkaWdpdGFsLGkuaWNvbi5kcmliYmJsZSxpLmljb24uZHJpYmJibGUuc3F1YXJlLGkuaWNvbi5kcm9wYm94LGkuaWNvbi5kcnVwYWwsaS5pY29uLmR5YWxvZyxpLmljb24uZWFybHliaXJkcyxpLmljb24uZWRnZSxpLmljb24uZWxlbWVudG9yLGkuaWNvbi5lbWJlcixpLmljb24uZW1waXJlLGkuaWNvbi5lbnZpcmEsaS5pY29uLmVybGFuZyxpLmljb24uZXRoZXJldW0saS5pY29uLmV0c3ksaS5pY29uLmV4cGVkaXRlZHNzbCxpLmljb24uZmFjZWJvb2ssaS5pY29uLmZhY2Vib29rLmYsaS5pY29uLmZhY2Vib29rLm1lc3NlbmdlcixpLmljb24uZmFjZWJvb2suc3F1YXJlLGkuaWNvbi5maXJlZm94LGkuaWNvbi5maXJzdC5vcmRlcixpLmljb24uZmlyc3RkcmFmdCxpLmljb24uZmxpY2tyLGkuaWNvbi5mbGlwYm9hcmQsaS5pY29uLmZseSxpLmljb24uZm9udC5hd2Vzb21lLGkuaWNvbi5mb250LmF3ZXNvbWUuYWx0ZXJuYXRlLGkuaWNvbi5mb250LmF3ZXNvbWUuZmxhZyxpLmljb24uZm9udGljb25zLGkuaWNvbi5mb250aWNvbnMuZmksaS5pY29uLmZvcnQuYXdlc29tZSxpLmljb24uZm9ydC5hd2Vzb21lLmFsdGVybmF0ZSxpLmljb24uZm9ydW1iZWUsaS5pY29uLmZvdXJzcXVhcmUsaS5pY29uLmZyZWUuY29kZS5jYW1wLGkuaWNvbi5mcmVlYnNkLGkuaWNvbi5nZXQucG9ja2V0LGkuaWNvbi5nZyxpLmljb24uZ2cuY2lyY2xlLGkuaWNvbi5naXQsaS5pY29uLmdpdC5zcXVhcmUsaS5pY29uLmdpdGh1YixpLmljb24uZ2l0aHViLmFsdGVybmF0ZSxpLmljb24uZ2l0aHViLnNxdWFyZSxpLmljb24uZ2l0a3Jha2VuLGkuaWNvbi5naXRsYWIsaS5pY29uLmdpdHRlcixpLmljb24uZ2xpZGUsaS5pY29uLmdsaWRlLmcsaS5pY29uLmdvZm9yZSxpLmljb24uZ29vZHJlYWRzLGkuaWNvbi5nb29kcmVhZHMuZyxpLmljb24uZ29vZ2xlLGkuaWNvbi5nb29nbGUuZHJpdmUsaS5pY29uLmdvb2dsZS5wbGF5LGkuaWNvbi5nb29nbGUucGx1cyxpLmljb24uZ29vZ2xlLnBsdXMuZyxpLmljb24uZ29vZ2xlLnBsdXMuc3F1YXJlLGkuaWNvbi5nb29nbGUud2FsbGV0LGkuaWNvbi5ncmF0aXBheSxpLmljb24uZ3JhdixpLmljb24uZ3JpcGZpcmUsaS5pY29uLmdydW50LGkuaWNvbi5ndWxwLGkuaWNvbi5oYWNrZXIubmV3cyxpLmljb24uaGFja2VyLm5ld3Muc3F1YXJlLGkuaWNvbi5oaXBzLGkuaWNvbi5oaXJlLmEuaGVscGVyLGkuaWNvbi5ob29saSxpLmljb24uaG90amFyLGkuaWNvbi5ob3V6eixpLmljb24uaHRtbDUsaS5pY29uLmh1YnNwb3QsaS5pY29uLmltZGIsaS5pY29uLmluc3RhZ3JhbSxpLmljb24uaW50ZXJuZXQuZXhwbG9yZXIsaS5pY29uLmlveGhvc3QsaS5pY29uLml0dW5lcyxpLmljb24uaXR1bmVzLm5vdGUsaS5pY29uLmplbmtpbnMsaS5pY29uLmpvZ2V0LGkuaWNvbi5qb29tbGEsaS5pY29uLmpzLGkuaWNvbi5qcy5zcXVhcmUsaS5pY29uLmpzZmlkZGxlLGkuaWNvbi5rZXljZG4saS5pY29uLmtpY2tzdGFydGVyLGkuaWNvbi5raWNrc3RhcnRlci5rLGkuaWNvbi5rb3J2dWUsaS5pY29uLmxhcmF2ZWwsaS5pY29uLmxhc3RmbSxpLmljb24ubGFzdGZtLnNxdWFyZSxpLmljb24ubGVhbnB1YixpLmljb24ubGVzcyxpLmljb24ubGluZWNoYXQsaS5pY29uLmxpbmtlZGluLGkuaWNvbi5saW5rZWRpbi5hbHRlcm5hdGUsaS5pY29uLmxpbmtlZGluLmluLGkuaWNvbi5saW5vZGUsaS5pY29uLmxpbnV4LGkuaWNvbi5seWZ0LGkuaWNvbi5tYWdlbnRvLGkuaWNvbi5tYXhjZG4saS5pY29uLm1lZGFwcHMsaS5pY29uLm1lZGl1bSxpLmljb24ubWVkaXVtLm0saS5pY29uLm1lZHJ0LGkuaWNvbi5tZWV0dXAsaS5pY29uLm1pY3Jvc29mdCxpLmljb24ubWl4LGkuaWNvbi5taXhjbG91ZCxpLmljb24ubWl6dW5pLGkuaWNvbi5tb2R4LGkuaWNvbi5tb25lcm8saS5pY29uLm5hcHN0ZXIsaS5pY29uLm5pbnRlbmRvLnN3aXRjaCxpLmljb24ubm9kZSxpLmljb24ubm9kZS5qcyxpLmljb24ubnBtLGkuaWNvbi5uczgsaS5pY29uLm51dHJpdGlvbml4LGkuaWNvbi5vZG5va2xhc3NuaWtpLGkuaWNvbi5vZG5va2xhc3NuaWtpLnNxdWFyZSxpLmljb24ub3BlbmNhcnQsaS5pY29uLm9wZW5pZCxpLmljb24ub3BlcmEsaS5pY29uLm9wdGluLm1vbnN0ZXIsaS5pY29uLm9zaSxpLmljb24ucGFnZTQsaS5pY29uLnBhZ2VsaW5lcyxpLmljb24ucGFsZmVkLGkuaWNvbi5wYXRyZW9uLGkuaWNvbi5wYXlwYWwsaS5pY29uLnBlcmlzY29wZSxpLmljb24ucGhhYnJpY2F0b3IsaS5pY29uLnBob2VuaXguZnJhbWV3b3JrLGkuaWNvbi5waHAsaS5pY29uLnBpZWQucGlwZXIsaS5pY29uLnBpZWQucGlwZXIuYWx0ZXJuYXRlLGkuaWNvbi5waWVkLnBpcGVyLnBwLGkuaWNvbi5waW50ZXJlc3QsaS5pY29uLnBpbnRlcmVzdC5wLGkuaWNvbi5waW50ZXJlc3Quc3F1YXJlLGkuaWNvbi5wbGF5c3RhdGlvbixpLmljb24ucHJvZHVjdC5odW50LGkuaWNvbi5wdXNoZWQsaS5pY29uLnB5dGhvbixpLmljb24ucXEsaS5pY29uLnF1aW5zY2FwZSxpLmljb24ucXVvcmEsaS5pY29uLnJhdmVscnksaS5pY29uLnJlYWN0LGkuaWNvbi5yZWJlbCxpLmljb24ucmVkZGl0LGkuaWNvbi5yZWRkaXQuYWxpZW4saS5pY29uLnJlZGRpdC5zcXVhcmUsaS5pY29uLnJlZHJpdmVyLGkuaWNvbi5yZW5kYWN0LGkuaWNvbi5yZW5yZW4saS5pY29uLnJlcGx5ZCxpLmljb24ucmVzb2x2aW5nLGkuaWNvbi5yb2NrZXRjaGF0LGkuaWNvbi5yb2Nrcm1zLGkuaWNvbi5zYWZhcmksaS5pY29uLnNhc3MsaS5pY29uLnNjaGxpeCxpLmljb24uc2NyaWJkLGkuaWNvbi5zZWFyY2hlbmdpbixpLmljb24uc2VsbGNhc3QsaS5pY29uLnNlbGxzeSxpLmljb24uc2VydmljZXN0YWNrLGkuaWNvbi5zaGlydHNpbmJ1bGssaS5pY29uLnNpbXBseWJ1aWx0LGkuaWNvbi5zaXN0cml4LGkuaWNvbi5za3lhdGxhcyxpLmljb24uc2t5cGUsaS5pY29uLnNsYWNrLGkuaWNvbi5zbGFjay5oYXNoLGkuaWNvbi5zbGlkZXNoYXJlLGkuaWNvbi5zbmFwY2hhdCxpLmljb24uc25hcGNoYXQuZ2hvc3QsaS5pY29uLnNuYXBjaGF0LnNxdWFyZSxpLmljb24uc291bmRjbG91ZCxpLmljb24uc3BlYWthcCxpLmljb24uc3BvdGlmeSxpLmljb24uc3RhY2suZXhjaGFuZ2UsaS5pY29uLnN0YWNrLm92ZXJmbG93LGkuaWNvbi5zdGF5bGlua2VkLGkuaWNvbi5zdGVhbSxpLmljb24uc3RlYW0uc3F1YXJlLGkuaWNvbi5zdGVhbS5zeW1ib2wsaS5pY29uLnN0aWNrZXIubXVsZSxpLmljb24uc3RyYXZhLGkuaWNvbi5zdHJpcGUsaS5pY29uLnN0cmlwZS5zLGkuaWNvbi5zdHVkaW92aW5hcmksaS5pY29uLnN0dW1ibGV1cG9uLGkuaWNvbi5zdHVtYmxldXBvbi5jaXJjbGUsaS5pY29uLnN1cGVycG93ZXJzLGkuaWNvbi5zdXBwbGUsaS5pY29uLnRlbGVncmFtLGkuaWNvbi50ZWxlZ3JhbS5wbGFuZSxpLmljb24udGVuY2VudC53ZWlibyxpLmljb24udGhlbWVpc2xlLGkuaWNvbi50cmVsbG8saS5pY29uLnRyaXBhZHZpc29yLGkuaWNvbi50dW1ibHIsaS5pY29uLnR1bWJsci5zcXVhcmUsaS5pY29uLnR3aXRjaCxpLmljb24udHdpdHRlcixpLmljb24udHdpdHRlci5zcXVhcmUsaS5pY29uLnR5cG8zLGkuaWNvbi51YmVyLGkuaWNvbi51aWtpdCxpLmljb24udW5pcmVnaXN0cnksaS5pY29uLnVudGFwcGQsaS5pY29uLnVzYixpLmljb24udXNzdW5uYWgsaS5pY29uLnZhYWRpbixpLmljb24udmlhY29pbixpLmljb24udmlhZGVvLGkuaWNvbi52aWFkZW8uc3F1YXJlLGkuaWNvbi52aWJlcixpLmljb24udmltZW8saS5pY29uLnZpbWVvLnNxdWFyZSxpLmljb24udmltZW8udixpLmljb24udmluZSxpLmljb24udmssaS5pY29uLnZudixpLmljb24udnVlanMsaS5pY29uLndlY2hhdCxpLmljb24ud2VpYm8saS5pY29uLndlaXhpbixpLmljb24ud2hhdHNhcHAsaS5pY29uLndoYXRzYXBwLnNxdWFyZSxpLmljb24ud2htY3MsaS5pY29uLndpa2lwZWRpYS53LGkuaWNvbi53aW5kb3dzLGkuaWNvbi53b3JkcHJlc3MsaS5pY29uLndvcmRwcmVzcy5zaW1wbGUsaS5pY29uLndwYmVnaW5uZXIsaS5pY29uLndwZXhwbG9yZXIsaS5pY29uLndwZm9ybXMsaS5pY29uLnhib3gsaS5pY29uLnhpbmcsaS5pY29uLnhpbmcuc3F1YXJlLGkuaWNvbi55LmNvbWJpbmF0b3IsaS5pY29uLnlhaG9vLGkuaWNvbi55YW5kZXgsaS5pY29uLnlhbmRleC5pbnRlcm5hdGlvbmFsLGkuaWNvbi55ZWxwLGkuaWNvbi55b2FzdCxpLmljb24ueW91dHViZSxpLmljb24ueW91dHViZS5zcXVhcmV7Zm9udC1mYW1pbHk6YnJhbmQtaWNvbnN9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEltYWdlXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuaW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9aW1nLnVpLmltYWdle2Rpc3BsYXk6YmxvY2t9LnVpLmltYWdlIGltZywudWkuaW1hZ2Ugc3Zne2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99LnVpLmhpZGRlbi5pbWFnZSwudWkuaGlkZGVuLmltYWdlc3tkaXNwbGF5Om5vbmV9LnVpLmhpZGRlbi50cmFuc2l0aW9uLmltYWdlLC51aS5oaWRkZW4udHJhbnNpdGlvbi5pbWFnZXN7ZGlzcGxheTpibG9jazt2aXNpYmlsaXR5OmhpZGRlbn0udWkuaW1hZ2VzPi5oaWRkZW4udHJhbnNpdGlvbntkaXNwbGF5OmlubGluZS1ibG9jazt2aXNpYmlsaXR5OmhpZGRlbn0udWkuZGlzYWJsZWQuaW1hZ2UsLnVpLmRpc2FibGVkLmltYWdlc3tjdXJzb3I6ZGVmYXVsdDtvcGFjaXR5Oi40NX0udWkuaW5saW5lLmltYWdlLC51aS5pbmxpbmUuaW1hZ2UgaW1nLC51aS5pbmxpbmUuaW1hZ2Ugc3Zne2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS50b3AuYWxpZ25lZC5pbWFnZSwudWkudG9wLmFsaWduZWQuaW1hZ2UgaW1nLC51aS50b3AuYWxpZ25lZC5pbWFnZSBzdmcsLnVpLnRvcC5hbGlnbmVkLmltYWdlcyAuaW1hZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wfS51aS5taWRkbGUuYWxpZ25lZC5pbWFnZSwudWkubWlkZGxlLmFsaWduZWQuaW1hZ2UgaW1nLC51aS5taWRkbGUuYWxpZ25lZC5pbWFnZSBzdmcsLnVpLm1pZGRsZS5hbGlnbmVkLmltYWdlcyAuaW1hZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5ib3R0b20uYWxpZ25lZC5pbWFnZSwudWkuYm90dG9tLmFsaWduZWQuaW1hZ2UgaW1nLC51aS5ib3R0b20uYWxpZ25lZC5pbWFnZSBzdmcsLnVpLmJvdHRvbS5hbGlnbmVkLmltYWdlcyAuaW1hZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246Ym90dG9tfS51aS5yb3VuZGVkLmltYWdlLC51aS5yb3VuZGVkLmltYWdlPiosLnVpLnJvdW5kZWQuaW1hZ2VzIC5pbWFnZSwudWkucm91bmRlZC5pbWFnZXMgLmltYWdlPip7Ym9yZGVyLXJhZGl1czouMzEyNWVtfS51aS5ib3JkZXJlZC5pbWFnZSBpbWcsLnVpLmJvcmRlcmVkLmltYWdlIHN2ZywudWkuYm9yZGVyZWQuaW1hZ2VzIC5pbWFnZSwudWkuYm9yZGVyZWQuaW1hZ2VzIGltZywudWkuYm9yZGVyZWQuaW1hZ2VzIHN2ZyxpbWcudWkuYm9yZGVyZWQuaW1hZ2V7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKX0udWkuY2lyY3VsYXIuaW1hZ2UsLnVpLmNpcmN1bGFyLmltYWdlc3tvdmVyZmxvdzpoaWRkZW59LnVpLmNpcmN1bGFyLmltYWdlLC51aS5jaXJjdWxhci5pbWFnZT4qLC51aS5jaXJjdWxhci5pbWFnZXMgLmltYWdlLC51aS5jaXJjdWxhci5pbWFnZXMgLmltYWdlPip7Ym9yZGVyLXJhZGl1czo1MDByZW19LnVpLmZsdWlkLmltYWdlLC51aS5mbHVpZC5pbWFnZSBpbWcsLnVpLmZsdWlkLmltYWdlIHN2ZywudWkuZmx1aWQuaW1hZ2VzLC51aS5mbHVpZC5pbWFnZXMgaW1nLC51aS5mbHVpZC5pbWFnZXMgc3Zne2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30udWkuYXZhdGFyLmltYWdlLC51aS5hdmF0YXIuaW1hZ2UgaW1nLC51aS5hdmF0YXIuaW1hZ2Ugc3ZnLC51aS5hdmF0YXIuaW1hZ2VzIC5pbWFnZSwudWkuYXZhdGFyLmltYWdlcyBpbWcsLnVpLmF2YXRhci5pbWFnZXMgc3Zne21hcmdpbi1yaWdodDouMjVlbTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkuc3BhY2VkLmltYWdle2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudDttYXJnaW4tbGVmdDouNWVtO21hcmdpbi1yaWdodDouNWVtfS51aVtjbGFzcyo9XFxcImxlZnQgc3BhY2VkXFxcIl0uaW1hZ2V7bWFyZ2luLWxlZnQ6LjVlbTttYXJnaW4tcmlnaHQ6MH0udWlbY2xhc3MqPVxcXCJyaWdodCBzcGFjZWRcXFwiXS5pbWFnZXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDouNWVtfS51aS5mbG9hdGVkLmltYWdlLC51aS5mbG9hdGVkLmltYWdlc3tmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxZW07bWFyZ2luLWJvdHRvbToxZW19LnVpLnJpZ2h0LmZsb2F0ZWQuaW1hZ2UsLnVpLnJpZ2h0LmZsb2F0ZWQuaW1hZ2Vze2Zsb2F0OnJpZ2h0O21hcmdpbi1yaWdodDowO21hcmdpbi1ib3R0b206MWVtO21hcmdpbi1sZWZ0OjFlbX0udWkuZmxvYXRlZC5pbWFnZTpsYXN0LWNoaWxkLC51aS5mbG9hdGVkLmltYWdlczpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuY2VudGVyZWQuaW1hZ2UsLnVpLmNlbnRlcmVkLmltYWdlc3ttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS51aS5taW5pLmltYWdlLC51aS5taW5pLmltYWdlcyAuaW1hZ2UsLnVpLm1pbmkuaW1hZ2VzIGltZywudWkubWluaS5pbWFnZXMgc3Zne3dpZHRoOjM1cHg7aGVpZ2h0OmF1dG87Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5pbWFnZSwudWkudGlueS5pbWFnZXMgLmltYWdlLC51aS50aW55LmltYWdlcyBpbWcsLnVpLnRpbnkuaW1hZ2VzIHN2Z3t3aWR0aDo4MHB4O2hlaWdodDphdXRvO2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLmltYWdlLC51aS5zbWFsbC5pbWFnZXMgLmltYWdlLC51aS5zbWFsbC5pbWFnZXMgaW1nLC51aS5zbWFsbC5pbWFnZXMgc3Zne3dpZHRoOjE1MHB4O2hlaWdodDphdXRvO2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLm1lZGl1bS5pbWFnZSwudWkubWVkaXVtLmltYWdlcyAuaW1hZ2UsLnVpLm1lZGl1bS5pbWFnZXMgaW1nLC51aS5tZWRpdW0uaW1hZ2VzIHN2Z3t3aWR0aDozMDBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MXJlbX0udWkubGFyZ2UuaW1hZ2UsLnVpLmxhcmdlLmltYWdlcyAuaW1hZ2UsLnVpLmxhcmdlLmltYWdlcyBpbWcsLnVpLmxhcmdlLmltYWdlcyBzdmd7d2lkdGg6NDUwcHg7aGVpZ2h0OmF1dG87Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy5pbWFnZSwudWkuYmlnLmltYWdlcyAuaW1hZ2UsLnVpLmJpZy5pbWFnZXMgaW1nLC51aS5iaWcuaW1hZ2VzIHN2Z3t3aWR0aDo2MDBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5pbWFnZSwudWkuaHVnZS5pbWFnZXMgLmltYWdlLC51aS5odWdlLmltYWdlcyBpbWcsLnVpLmh1Z2UuaW1hZ2VzIHN2Z3t3aWR0aDo4MDBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5pbWFnZSwudWkubWFzc2l2ZS5pbWFnZXMgLmltYWdlLC51aS5tYXNzaXZlLmltYWdlcyBpbWcsLnVpLm1hc3NpdmUuaW1hZ2VzIHN2Z3t3aWR0aDo5NjBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MS43MTQyODU3MXJlbX0udWkuaW1hZ2Vze2ZvbnQtc2l6ZTowO21hcmdpbjowIC0uMjVyZW0gMH0udWkuaW1hZ2VzIC5pbWFnZSwudWkuaW1hZ2VzPmltZywudWkuaW1hZ2VzPnN2Z3tkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAuMjVyZW0gLjVyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIElucHV0XFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuaW5wdXR7cG9zaXRpb246cmVsYXRpdmU7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2Rpc3BsYXk6aW5saW5lLWZsZXg7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbnB1dD5pbnB1dHttYXJnaW46MDttYXgtd2lkdGg6MTAwJTtmbGV4OjEgMCBhdXRvO291dGxpbmU6MDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwKTt0ZXh0LWFsaWduOmxlZnQ7bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtwYWRkaW5nOi42Nzg1NzE0M2VtIDFlbTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuaW5wdXQ+aW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxOTEsMTkxLDE5MSwuODcpfS51aS5pbnB1dD5pbnB1dDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDE5MSwxOTEsMTkxLC44Nyl9LnVpLmlucHV0PmlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDE5MSwxOTEsMTkxLC44Nyl9LnVpLmRpc2FibGVkLmlucHV0LC51aS5pbnB1dDpub3QoLmRpc2FibGVkKSBpbnB1dFtkaXNhYmxlZF17b3BhY2l0eTouNDV9LnVpLmRpc2FibGVkLmlucHV0PmlucHV0LC51aS5pbnB1dDpub3QoLmRpc2FibGVkKSBpbnB1dFtkaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0udWkuaW5wdXQuZG93biBpbnB1dCwudWkuaW5wdXQ+aW5wdXQ6YWN0aXZle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zKTtiYWNrZ3JvdW5kOiNmYWZhZmE7Y29sb3I6cmdiYSgwLDAsMCwuODcpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkubG9hZGluZy5sb2FkaW5nLmlucHV0PmkuaWNvbjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjotLjY0Mjg1NzE0ZW0gMCAwIC0uNjQyODU3MTRlbTt3aWR0aDoxLjI4NTcxNDI5ZW07aGVpZ2h0OjEuMjg1NzE0MjllbTtib3JkZXItcmFkaXVzOjUwMHJlbTtib3JkZXI6LjJlbSBzb2xpZCByZ2JhKDAsMCwwLC4xKX0udWkubG9hZGluZy5sb2FkaW5nLmlucHV0PmkuaWNvbjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0uNjQyODU3MTRlbSAwIDAgLS42NDI4NTcxNGVtO3dpZHRoOjEuMjg1NzE0MjllbTtoZWlnaHQ6MS4yODU3MTQyOWVtOy13ZWJraXQtYW5pbWF0aW9uOmJ1dHRvbi1zcGluIC42cyBsaW5lYXI7YW5pbWF0aW9uOmJ1dHRvbi1zcGluIC42cyBsaW5lYXI7LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyLWNvbG9yOiM3Njc2NzYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDouMmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnR9LnVpLmlucHV0LmZvY3VzPmlucHV0LC51aS5pbnB1dD5pbnB1dDpmb2N1c3tib3JkZXItY29sb3I6Izg1YjdkOTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuOCk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnB1dC5mb2N1cz5pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciwudWkuaW5wdXQ+aW5wdXQ6Zm9jdXM6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpfS51aS5pbnB1dC5mb2N1cz5pbnB1dDo6LW1vei1wbGFjZWhvbGRlciwudWkuaW5wdXQ+aW5wdXQ6Zm9jdXM6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpfS51aS5pbnB1dC5mb2N1cz5pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIsLnVpLmlucHV0PmlucHV0OmZvY3VzOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDExNSwxMTUsMTE1LC44Nyl9LnVpLmlucHV0LmVycm9yPmlucHV0e2JhY2tncm91bmQtY29sb3I6I2ZmZjZmNjtib3JkZXItY29sb3I6I2UwYjRiNDtjb2xvcjojOWYzYTM4Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuaW5wdXQuZXJyb3I+aW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2U3YmRiY30udWkuaW5wdXQuZXJyb3I+aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2U3YmRiY30udWkuaW5wdXQuZXJyb3I+aW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNlN2JkYmMhaW1wb3J0YW50fS51aS5pbnB1dC5lcnJvcj5pbnB1dDpmb2N1czo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojZGE5Nzk2fS51aS5pbnB1dC5lcnJvcj5pbnB1dDpmb2N1czo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojZGE5Nzk2fS51aS5pbnB1dC5lcnJvcj5pbnB1dDpmb2N1czotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2RhOTc5NiFpbXBvcnRhbnR9LnVpLnRyYW5zcGFyZW50LmlucHV0PmlucHV0e2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjAhaW1wb3J0YW50fS51aS50cmFuc3BhcmVudC5pY29uLmlucHV0PmkuaWNvbnt3aWR0aDoxLjFlbX0udWkudHJhbnNwYXJlbnQuaWNvbi5pbnB1dD5pbnB1dHtwYWRkaW5nLWxlZnQ6MCFpbXBvcnRhbnQ7cGFkZGluZy1yaWdodDoyZW0haW1wb3J0YW50fS51aS50cmFuc3BhcmVudFtjbGFzcyo9XFxcImxlZnQgaWNvblxcXCJdLmlucHV0PmlucHV0e3BhZGRpbmctbGVmdDoyZW0haW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MCFpbXBvcnRhbnR9LnVpLnRyYW5zcGFyZW50LmludmVydGVkLmlucHV0e2NvbG9yOiNmZmZ9LnVpLnRyYW5zcGFyZW50LmludmVydGVkLmlucHV0PmlucHV0e2NvbG9yOmluaGVyaXR9LnVpLnRyYW5zcGFyZW50LmludmVydGVkLmlucHV0PmlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfS51aS50cmFuc3BhcmVudC5pbnZlcnRlZC5pbnB1dD5pbnB1dDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX0udWkudHJhbnNwYXJlbnQuaW52ZXJ0ZWQuaW5wdXQ+aW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfS51aS5pY29uLmlucHV0PmkuaWNvbntjdXJzb3I6ZGVmYXVsdDtwb3NpdGlvbjphYnNvbHV0ZTtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO3RvcDowO3JpZ2h0OjA7bWFyZ2luOjA7aGVpZ2h0OjEwMCU7d2lkdGg6Mi42NzE0Mjg1N2VtO29wYWNpdHk6LjU7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMDstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuM3MgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGVhc2V9LnVpLmljb24uaW5wdXQ+aS5pY29uOm5vdCgubGluayl7cG9pbnRlci1ldmVudHM6bm9uZX0udWkuaWNvbi5pbnB1dD5pbnB1dHtwYWRkaW5nLXJpZ2h0OjIuNjcxNDI4NTdlbSFpbXBvcnRhbnR9LnVpLmljb24uaW5wdXQ+aS5pY29uOmFmdGVyLC51aS5pY29uLmlucHV0PmkuaWNvbjpiZWZvcmV7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO3RvcDo1MCU7d2lkdGg6MTAwJTttYXJnaW4tdG9wOi0uNWVtfS51aS5pY29uLmlucHV0PmkubGluay5pY29ue2N1cnNvcjpwb2ludGVyfS51aS5pY29uLmlucHV0PmkuY2lyY3VsYXIuaWNvbnt0b3A6LjM1ZW07cmlnaHQ6LjVlbX0udWlbY2xhc3MqPVxcXCJsZWZ0IGljb25cXFwiXS5pbnB1dD5pLmljb257cmlnaHQ6YXV0bztsZWZ0OjFweDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgLjI4NTcxNDI5cmVtfS51aVtjbGFzcyo9XFxcImxlZnQgaWNvblxcXCJdLmlucHV0PmkuY2lyY3VsYXIuaWNvbntyaWdodDphdXRvO2xlZnQ6LjVlbX0udWlbY2xhc3MqPVxcXCJsZWZ0IGljb25cXFwiXS5pbnB1dD5pbnB1dHtwYWRkaW5nLWxlZnQ6Mi42NzE0Mjg1N2VtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjFlbSFpbXBvcnRhbnR9LnVpLmljb24uaW5wdXQ+aW5wdXQ6Zm9jdXN+aS5pY29ue29wYWNpdHk6MX0udWkubGFiZWxlZC5pbnB1dD4ubGFiZWx7ZmxleDowIDAgYXV0bzttYXJnaW46MDtmb250LXNpemU6MWVtfS51aS5sYWJlbGVkLmlucHV0Pi5sYWJlbDpub3QoLmNvcm5lcil7cGFkZGluZy10b3A6Ljc4NTcxNDI5ZW07cGFkZGluZy1ib3R0b206Ljc4NTcxNDI5ZW19LnVpLmxhYmVsZWQuaW5wdXQ6bm90KFtjbGFzcyo9XFxcImNvcm5lciBsYWJlbGVkXFxcIl0pIC5sYWJlbDpmaXJzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLmxhYmVsZWQuaW5wdXQ6bm90KFtjbGFzcyo9XFxcImNvcm5lciBsYWJlbGVkXFxcIl0pIC5sYWJlbDpmaXJzdC1jaGlsZCtpbnB1dHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50fS51aS5sYWJlbGVkLmlucHV0Om5vdChbY2xhc3MqPVxcXCJjb3JuZXIgbGFiZWxlZFxcXCJdKSAubGFiZWw6Zmlyc3QtY2hpbGQraW5wdXQ6Zm9jdXN7Ym9yZGVyLWxlZnQtY29sb3I6Izg1YjdkOX0udWlbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaW5wdXQ+aW5wdXR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaW5wdXQ+aW5wdXQrLmxhYmVse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LnVpW2NsYXNzKj1cXFwicmlnaHQgbGFiZWxlZFxcXCJdLmlucHV0PmlucHV0OmZvY3Vze2JvcmRlci1yaWdodC1jb2xvcjojODViN2Q5IWltcG9ydGFudH0udWkubGFiZWxlZC5pbnB1dCAuY29ybmVyLmxhYmVse3RvcDoxcHg7cmlnaHQ6MXB4O2ZvbnQtc2l6ZTouNjQyODU3MTRlbTtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIDAgMH0udWlbY2xhc3MqPVxcXCJjb3JuZXIgbGFiZWxlZFxcXCJdOm5vdChbY2xhc3MqPVxcXCJsZWZ0IGNvcm5lciBsYWJlbGVkXFxcIl0pLmxhYmVsZWQuaW5wdXQ+aW5wdXR7cGFkZGluZy1yaWdodDoyLjVlbSFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwiY29ybmVyIGxhYmVsZWRcXFwiXS5pY29uLmlucHV0Om5vdChbY2xhc3MqPVxcXCJsZWZ0IGNvcm5lciBsYWJlbGVkXFxcIl0pPmlucHV0e3BhZGRpbmctcmlnaHQ6My4yNWVtIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJjb3JuZXIgbGFiZWxlZFxcXCJdLmljb24uaW5wdXQ6bm90KFtjbGFzcyo9XFxcImxlZnQgY29ybmVyIGxhYmVsZWRcXFwiXSk+Lmljb257bWFyZ2luLXJpZ2h0OjEuMjVlbX0udWlbY2xhc3MqPVxcXCJsZWZ0IGNvcm5lciBsYWJlbGVkXFxcIl0ubGFiZWxlZC5pbnB1dD5pbnB1dHtwYWRkaW5nLWxlZnQ6Mi41ZW0haW1wb3J0YW50fS51aVtjbGFzcyo9XFxcImxlZnQgY29ybmVyIGxhYmVsZWRcXFwiXS5pY29uLmlucHV0PmlucHV0e3BhZGRpbmctbGVmdDozLjI1ZW0haW1wb3J0YW50fS51aVtjbGFzcyo9XFxcImxlZnQgY29ybmVyIGxhYmVsZWRcXFwiXS5pY29uLmlucHV0Pi5pY29ue21hcmdpbi1sZWZ0OjEuMjVlbX0udWkuaW5wdXQ+LnVpLmNvcm5lci5sYWJlbHt0b3A6MXB4O3JpZ2h0OjFweH0udWkuaW5wdXQ+LnVpLmxlZnQuY29ybmVyLmxhYmVse3JpZ2h0OmF1dG87bGVmdDoxcHh9LnVpLmFjdGlvbi5pbnB1dD4uYnV0dG9uLC51aS5hY3Rpb24uaW5wdXQ+LmJ1dHRvbnN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4OjAgMCBhdXRvfS51aS5hY3Rpb24uaW5wdXQ+LmJ1dHRvbiwudWkuYWN0aW9uLmlucHV0Pi5idXR0b25zPi5idXR0b257cGFkZGluZy10b3A6Ljc4NTcxNDI5ZW07cGFkZGluZy1ib3R0b206Ljc4NTcxNDI5ZW07bWFyZ2luOjB9LnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+aW5wdXR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuYWN0aW9uLmlucHV0Om5vdChbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdKT4uYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpLC51aS5hY3Rpb24uaW5wdXQ6bm90KFtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0pPi5idXR0b25zOm5vdCg6Zmlyc3QtY2hpbGQpPi5idXR0b24sLnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+LmRyb3Bkb3duOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MH0udWkuYWN0aW9uLmlucHV0Om5vdChbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdKT4uYnV0dG9uOmxhc3QtY2hpbGQsLnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+LmJ1dHRvbnM6bGFzdC1jaGlsZD4uYnV0dG9uLC51aS5hY3Rpb24uaW5wdXQ6bm90KFtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0pPi5kcm9wZG93bjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDB9LnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+aW5wdXQ6Zm9jdXN7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM4NWI3ZDkhaW1wb3J0YW50fS51aVtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0uaW5wdXQ+aW5wdXR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjAhaW1wb3J0YW50O2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdLmlucHV0Pi5idXR0b24sLnVpW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXS5pbnB1dD4uYnV0dG9ucz4uYnV0dG9uLC51aVtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0uaW5wdXQ+LmRyb3Bkb3due2JvcmRlci1yYWRpdXM6MH0udWlbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdLmlucHV0Pi5idXR0b246Zmlyc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXS5pbnB1dD4uYnV0dG9uczpmaXJzdC1jaGlsZD4uYnV0dG9uLC51aVtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0uaW5wdXQ+LmRyb3Bkb3duOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXS5pbnB1dD5pbnB1dDpmb2N1c3tib3JkZXItbGVmdC1jb2xvcjojODViN2Q5IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuaW5wdXQ+aW5wdXR7Ym9yZGVyOm5vbmV9LnVpLmZsdWlkLmlucHV0e2Rpc3BsYXk6ZmxleH0udWkuZmx1aWQuaW5wdXQ+aW5wdXR7d2lkdGg6MCFpbXBvcnRhbnR9LnVpLm1pbmkuaW5wdXR7Zm9udC1zaXplOi43ODU3MTQyOWVtfS51aS5zbWFsbC5pbnB1dHtmb250LXNpemU6LjkyODU3MTQzZW19LnVpLmlucHV0e2ZvbnQtc2l6ZToxZW19LnVpLmxhcmdlLmlucHV0e2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW19LnVpLmJpZy5pbnB1dHtmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5odWdlLmlucHV0e2ZvbnQtc2l6ZToxLjQyODU3MTQzZW19LnVpLm1hc3NpdmUuaW5wdXR7Zm9udC1zaXplOjEuNzE0Mjg1NzFlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTGFiZWxcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5sYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoxO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO21hcmdpbjowIC4xNDI4NTcxNGVtO2JhY2tncm91bmQtY29sb3I6I2U4ZThlODtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7cGFkZGluZzouNTgzM2VtIC44MzNlbTtjb2xvcjpyZ2JhKDAsMCwwLC42KTt0ZXh0LXRyYW5zZm9ybTpub25lO2ZvbnQtd2VpZ2h0OjcwMDtib3JkZXI6MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2V9LnVpLmxhYmVsOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LnVpLmxhYmVsOmxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9YS51aS5sYWJlbHtjdXJzb3I6cG9pbnRlcn0udWkubGFiZWw+YXtjdXJzb3I6cG9pbnRlcjtjb2xvcjppbmhlcml0O29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2l0aW9uOi4xcyBvcGFjaXR5IGVhc2U7dHJhbnNpdGlvbjouMXMgb3BhY2l0eSBlYXNlfS51aS5sYWJlbD5hOmhvdmVye29wYWNpdHk6MX0udWkubGFiZWw+aW1ne3dpZHRoOmF1dG8haW1wb3J0YW50O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtoZWlnaHQ6Mi4xNjY2ZW0haW1wb3J0YW50fS51aS5sYWJlbD4uaWNvbnt3aWR0aDphdXRvO21hcmdpbjowIC43NWVtIDAgMH0udWkubGFiZWw+LmRldGFpbHtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi1sZWZ0OjFlbTtvcGFjaXR5Oi44fS51aS5sYWJlbD4uZGV0YWlsIC5pY29ue21hcmdpbjowIC4yNWVtIDAgMH0udWkubGFiZWw+LmNsb3NlLmljb24sLnVpLmxhYmVsPi5kZWxldGUuaWNvbntjdXJzb3I6cG9pbnRlcjttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDouNWVtO2ZvbnQtc2l6ZTouOTI4NTcxNDNlbTtvcGFjaXR5Oi41Oy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZX0udWkubGFiZWw+LmRlbGV0ZS5pY29uOmhvdmVye29wYWNpdHk6MX0udWkubGFiZWxzPi5sYWJlbHttYXJnaW46MCAuNWVtIC41ZW0gMH0udWkuaGVhZGVyPi51aS5sYWJlbHttYXJnaW4tdG9wOi0uMjkxNjVlbX0udWkuYXR0YWNoZWQuc2VnbWVudD4udWkudG9wLmxlZnQuYXR0YWNoZWQubGFiZWwsLnVpLmJvdHRvbS5hdHRhY2hlZC5zZWdtZW50Pi51aS50b3AubGVmdC5hdHRhY2hlZC5sYWJlbHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjB9LnVpLmF0dGFjaGVkLnNlZ21lbnQ+LnVpLnRvcC5yaWdodC5hdHRhY2hlZC5sYWJlbCwudWkuYm90dG9tLmF0dGFjaGVkLnNlZ21lbnQ+LnVpLnRvcC5yaWdodC5hdHRhY2hlZC5sYWJlbHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS51aS50b3AuYXR0YWNoZWQuc2VnbWVudD4udWkuYm90dG9tLmxlZnQuYXR0YWNoZWQubGFiZWx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS51aS50b3AuYXR0YWNoZWQuc2VnbWVudD4udWkuYm90dG9tLnJpZ2h0LmF0dGFjaGVkLmxhYmVse2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLnRvcC5hdHRhY2hlZC5sYWJlbCtbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0rKiwudWkudG9wLmF0dGFjaGVkLmxhYmVsOmZpcnN0LWNoaWxkKzpub3QoLmF0dGFjaGVkKXttYXJnaW4tdG9wOjJyZW0haW1wb3J0YW50fS51aS5ib3R0b20uYXR0YWNoZWQubGFiZWw6Zmlyc3QtY2hpbGR+Omxhc3QtY2hpbGQ6bm90KC5hdHRhY2hlZCl7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MnJlbSFpbXBvcnRhbnR9LnVpLmltYWdlLmxhYmVse3dpZHRoOmF1dG8haW1wb3J0YW50O21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7bWF4LXdpZHRoOjk5OTlweDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LXRyYW5zZm9ybTpub25lO2JhY2tncm91bmQ6I2U4ZThlODtwYWRkaW5nOi41ODMzZW0gLjgzM2VtIC41ODMzZW0gLjVlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmltYWdlLmxhYmVsIGltZ3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7aGVpZ2h0OjIuMTY2NmVtO21hcmdpbjotLjU4MzNlbSAuNWVtIC0uNTgzM2VtIC0uNWVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAuMjg1NzE0MjlyZW19LnVpLmltYWdlLmxhYmVsIC5kZXRhaWx7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xKTttYXJnaW46LS41ODMzZW0gLS44MzNlbSAtLjU4MzNlbSAuNWVtO3BhZGRpbmc6LjU4MzNlbSAuODMzZW07Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMH0udWkudGFnLmxhYmVsLC51aS50YWcubGFiZWxzIC5sYWJlbHttYXJnaW4tbGVmdDoxZW07cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZy1sZWZ0OjEuNWVtO3BhZGRpbmctcmlnaHQ6MS41ZW07Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMDstd2Via2l0LXRyYW5zaXRpb246bm9uZTt0cmFuc2l0aW9uOm5vbmV9LnVpLnRhZy5sYWJlbDpiZWZvcmUsLnVpLnRhZy5sYWJlbHMgLmxhYmVsOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoNTAlKSByb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKDUwJSkgcm90YXRlKC00NWRlZyk7dG9wOjUwJTtyaWdodDoxMDAlO2NvbnRlbnQ6Jyc7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0O2JhY2tncm91bmQtaW1hZ2U6bm9uZTt3aWR0aDoxLjU2ZW07aGVpZ2h0OjEuNTZlbTstd2Via2l0LXRyYW5zaXRpb246bm9uZTt0cmFuc2l0aW9uOm5vbmV9LnVpLnRhZy5sYWJlbDphZnRlciwudWkudGFnLmxhYmVscyAubGFiZWw6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6NTAlO2xlZnQ6LS4yNWVtO21hcmdpbi10b3A6LS4yNWVtO2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7d2lkdGg6LjVlbTtoZWlnaHQ6LjVlbTstd2Via2l0LWJveC1zaGFkb3c6MCAtMXB4IDFweCAwIHJnYmEoMCwwLDAsLjMpO2JveC1zaGFkb3c6MCAtMXB4IDFweCAwIHJnYmEoMCwwLDAsLjMpO2JvcmRlci1yYWRpdXM6NTAwcmVtfS51aS5jb3JuZXIubGFiZWx7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDttYXJnaW46MDtwYWRkaW5nOjA7dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLWNvbG9yOiNlOGU4ZTg7d2lkdGg6NGVtO2hlaWdodDo0ZW07ei1pbmRleDoxOy13ZWJraXQtdHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzIGVhc2V9LnVpLmNvcm5lci5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuY29ybmVyLmxhYmVsOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6XFxcIlxcXCI7cmlnaHQ6MDt0b3A6MDt6LWluZGV4Oi0xO3dpZHRoOjA7aGVpZ2h0OjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Ym9yZGVyLXRvcDowIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo0ZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTo0ZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQtY29sb3I6aW5oZXJpdDstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlfS51aS5jb3JuZXIubGFiZWwgLmljb257Y3Vyc29yOmRlZmF1bHQ7cG9zaXRpb246cmVsYXRpdmU7dG9wOi42NDI4NTcxNGVtO2xlZnQ6Ljc4NTcxNDI5ZW07Zm9udC1zaXplOjEuMTQyODU3MTRlbTttYXJnaW46MH0udWkubGVmdC5jb3JuZXIubGFiZWwsLnVpLmxlZnQuY29ybmVyLmxhYmVsOmFmdGVye3JpZ2h0OmF1dG87bGVmdDowfS51aS5sZWZ0LmNvcm5lci5sYWJlbDphZnRlcntib3JkZXItdG9wOjRlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NGVtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItbGVmdDowIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6aW5oZXJpdH0udWkubGVmdC5jb3JuZXIubGFiZWwgLmljb257bGVmdDotLjc4NTcxNDI5ZW19LnVpLnNlZ21lbnQ+LnVpLmNvcm5lci5sYWJlbHt0b3A6LTFweDtyaWdodDotMXB4fS51aS5zZWdtZW50Pi51aS5sZWZ0LmNvcm5lci5sYWJlbHtyaWdodDphdXRvO2xlZnQ6LTFweH0udWkucmliYm9uLmxhYmVse3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjowO21pbi13aWR0aDotd2Via2l0LW1heC1jb250ZW50O21pbi13aWR0aDptYXgtY29udGVudDtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwO2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xNSl9LnVpLnJpYmJvbi5sYWJlbDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDoxMDAlO2xlZnQ6MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjAgMS4yZW0gMS4yZW0gMDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOmluaGVyaXQ7d2lkdGg6MDtoZWlnaHQ6MH0udWkucmliYm9uLmxhYmVse2xlZnQ6Y2FsYygtMXJlbSAtIDEuMmVtKTttYXJnaW4tcmlnaHQ6LTEuMmVtO3BhZGRpbmctbGVmdDpjYWxjKDFyZW0gKyAxLjJlbSk7cGFkZGluZy1yaWdodDoxLjJlbX0udWlbY2xhc3MqPVxcXCJyaWdodCByaWJib25cXFwiXS5sYWJlbHtsZWZ0OmNhbGMoMTAwJSArIDFyZW0gKyAxLjJlbSk7cGFkZGluZy1sZWZ0OjEuMmVtO3BhZGRpbmctcmlnaHQ6Y2FsYygxcmVtICsgMS4yZW0pfS51aVtjbGFzcyo9XFxcInJpZ2h0IHJpYmJvblxcXCJdLmxhYmVse3RleHQtYWxpZ246bGVmdDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIC4yODU3MTQyOXJlbX0udWlbY2xhc3MqPVxcXCJyaWdodCByaWJib25cXFwiXS5sYWJlbDphZnRlcntsZWZ0OmF1dG87cmlnaHQ6MDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjEuMmVtIDEuMmVtIDAgMDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1jb2xvcjppbmhlcml0fS51aS5jYXJkIC5pbWFnZT4ucmliYm9uLmxhYmVsLC51aS5pbWFnZT4ucmliYm9uLmxhYmVse3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxcmVtfS51aS5jYXJkIC5pbWFnZT4udWkucmliYm9uLmxhYmVsLC51aS5pbWFnZT4udWkucmliYm9uLmxhYmVse2xlZnQ6Y2FsYyguMDVyZW0gLSAxLjJlbSl9LnVpLmNhcmQgLmltYWdlPi51aVtjbGFzcyo9XFxcInJpZ2h0IHJpYmJvblxcXCJdLmxhYmVsLC51aS5pbWFnZT4udWlbY2xhc3MqPVxcXCJyaWdodCByaWJib25cXFwiXS5sYWJlbHtsZWZ0OmNhbGMoMTAwJSArIC0uMDVyZW0gKyAxLjJlbSk7cGFkZGluZy1sZWZ0Oi44MzNlbX0udWkudGFibGUgdGQ+LnVpLnJpYmJvbi5sYWJlbHtsZWZ0OmNhbGMoLS43ODU3MTQyOWVtIC0gMS4yZW0pfS51aS50YWJsZSB0ZD4udWlbY2xhc3MqPVxcXCJyaWdodCByaWJib25cXFwiXS5sYWJlbHtsZWZ0OmNhbGMoMTAwJSArIC43ODU3MTQyOWVtICsgMS4yZW0pO3BhZGRpbmctbGVmdDouODMzZW19LnVpLmF0dGFjaGVkLmxhYmVsLC51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLmxhYmVse3dpZHRoOjEwMCU7cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luOjA7dG9wOjA7bGVmdDowO3BhZGRpbmc6Ljc1ZW0gMWVtO2JvcmRlci1yYWRpdXM6LjIxNDI4NTcxcmVtIC4yMTQyODU3MXJlbSAwIDB9LnVpW2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl0ubGFiZWx7dG9wOmF1dG87Ym90dG9tOjA7Ym9yZGVyLXJhZGl1czowIDAgLjIxNDI4NTcxcmVtIC4yMTQyODU3MXJlbX0udWlbY2xhc3MqPVxcXCJ0b3AgbGVmdCBhdHRhY2hlZFxcXCJdLmxhYmVse3dpZHRoOmF1dG87bWFyZ2luLXRvcDowIWltcG9ydGFudDtib3JkZXItcmFkaXVzOi4yMTQyODU3MXJlbSAwIC4yODU3MTQyOXJlbSAwfS51aVtjbGFzcyo9XFxcInRvcCByaWdodCBhdHRhY2hlZFxcXCJdLmxhYmVse3dpZHRoOmF1dG87bGVmdDphdXRvO3JpZ2h0OjA7Ym9yZGVyLXJhZGl1czowIC4yMTQyODU3MXJlbSAwIC4yODU3MTQyOXJlbX0udWlbY2xhc3MqPVxcXCJib3R0b20gbGVmdCBhdHRhY2hlZFxcXCJdLmxhYmVse3dpZHRoOmF1dG87dG9wOmF1dG87Ym90dG9tOjA7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAwIC4yMTQyODU3MXJlbX0udWlbY2xhc3MqPVxcXCJib3R0b20gcmlnaHQgYXR0YWNoZWRcXFwiXS5sYWJlbHt0b3A6YXV0bztib3R0b206MDtsZWZ0OmF1dG87cmlnaHQ6MDt3aWR0aDphdXRvO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgLjIxNDI4NTcxcmVtIDB9LnVpLmxhYmVsLmRpc2FibGVke29wYWNpdHk6LjV9YS51aS5sYWJlbDpob3ZlcixhLnVpLmxhYmVscyAubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2JvcmRlci1jb2xvcjojZTBlMGUwO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkubGFiZWxzIGEubGFiZWw6aG92ZXI6YmVmb3JlLGEudWkubGFiZWw6aG92ZXI6YmVmb3Jle2NvbG9yOnJnYmEoMCwwLDAsLjgpfS51aS5hY3RpdmUubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZDBkMGQwO2JvcmRlci1jb2xvcjojZDBkMGQwO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmFjdGl2ZS5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZDBkMGQwO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9YS51aS5hY3RpdmUubGFiZWw6aG92ZXIsYS51aS5sYWJlbHMgLmFjdGl2ZS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjOGM4Yzg7Ym9yZGVyLWNvbG9yOiNjOGM4Yzg7YmFja2dyb3VuZC1pbWFnZTpub25lO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkubGFiZWxzIGEuYWN0aXZlLmxhYmVsOkFjdGl2ZUhvdmVyOmJlZm9yZSxhLnVpLmFjdGl2ZS5sYWJlbDpBY3RpdmVIb3ZlcjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojYzhjOGM4O2JhY2tncm91bmQtaW1hZ2U6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmxhYmVsLnZpc2libGU6bm90KC5kcm9wZG93biksLnVpLmxhYmVscy52aXNpYmxlIC5sYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jayFpbXBvcnRhbnR9LnVpLmxhYmVsLmhpZGRlbiwudWkubGFiZWxzLmhpZGRlbiAubGFiZWx7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkucmVkLmxhYmVsLC51aS5yZWQubGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4MjghaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZGIyODI4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucmVkLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS5yZWQubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDAxOTE5IWltcG9ydGFudDtib3JkZXItY29sb3I6I2QwMTkxOSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnJlZC5jb3JuZXIubGFiZWwsLnVpLnJlZC5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLnJlZC5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiNiMjFlMWUhaW1wb3J0YW50fS51aS5iYXNpYy5yZWQubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiNkYjI4MjghaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZGIyODI4IWltcG9ydGFudH0udWkuYmFzaWMucmVkLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMucmVkLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2QwMTkxOSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNkMDE5MTkhaW1wb3J0YW50fS51aS5vcmFuZ2UubGFiZWwsLnVpLm9yYW5nZS5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNmMjcxMWMhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5vcmFuZ2UubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLm9yYW5nZS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMjYyMDIhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZjI2MjAyIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub3JhbmdlLmNvcm5lci5sYWJlbCwudWkub3JhbmdlLmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkub3JhbmdlLnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6I2NmNTkwYyFpbXBvcnRhbnR9LnVpLmJhc2ljLm9yYW5nZS5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNmMjcxMWMhaW1wb3J0YW50fS51aS5iYXNpYy5vcmFuZ2UubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy5vcmFuZ2UubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojZjI2MjAyIWltcG9ydGFudDtib3JkZXItY29sb3I6I2YyNjIwMiFpbXBvcnRhbnR9LnVpLnllbGxvdy5sYWJlbCwudWkueWVsbG93LmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmJiZDA4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnllbGxvdy5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkueWVsbG93LmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2VhYWUwMCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNlYWFlMDAhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS55ZWxsb3cuY29ybmVyLmxhYmVsLC51aS55ZWxsb3cuY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS55ZWxsb3cucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojY2Q5OTAzIWltcG9ydGFudH0udWkuYmFzaWMueWVsbG93LmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojZmJiZDA4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnR9LnVpLmJhc2ljLnllbGxvdy5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLnllbGxvdy5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiNlYWFlMDAhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZWFhZTAwIWltcG9ydGFudH0udWkub2xpdmUubGFiZWwsLnVpLm9saXZlLmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojYjVjYzE4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9saXZlLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS5vbGl2ZS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNhN2JkMGQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojYTdiZDBkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub2xpdmUuY29ybmVyLmxhYmVsLC51aS5vbGl2ZS5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLm9saXZlLnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6IzE5OGYzNSFpbXBvcnRhbnR9LnVpLmJhc2ljLm9saXZlLmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojYjVjYzE4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnR9LnVpLmJhc2ljLm9saXZlLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMub2xpdmUubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojYTdiZDBkIWltcG9ydGFudDtib3JkZXItY29sb3I6I2E3YmQwZCFpbXBvcnRhbnR9LnVpLmdyZWVuLmxhYmVsLC51aS5ncmVlbi5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6IzIxYmE0NSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ncmVlbi5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkuZ3JlZW4ubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTZhYjM5IWltcG9ydGFudDtib3JkZXItY29sb3I6IzE2YWIzOSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZWVuLmNvcm5lci5sYWJlbCwudWkuZ3JlZW4uY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5ncmVlbi5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiMxOThmMzUhaW1wb3J0YW50fS51aS5iYXNpYy5ncmVlbi5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzIxYmE0NSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50fS51aS5iYXNpYy5ncmVlbi5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLmdyZWVuLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzE2YWIzOSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMxNmFiMzkhaW1wb3J0YW50fS51aS50ZWFsLmxhYmVsLC51aS50ZWFsLmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojMDBiNWFkIWltcG9ydGFudDtib3JkZXItY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnRlYWwubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLnRlYWwubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA5Yzk1IWltcG9ydGFudDtib3JkZXItY29sb3I6IzAwOWM5NSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnRlYWwuY29ybmVyLmxhYmVsLC51aS50ZWFsLmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkudGVhbC5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiMwMDgyN2MhaW1wb3J0YW50fS51aS5iYXNpYy50ZWFsLmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojMDBiNWFkIWltcG9ydGFudDtib3JkZXItY29sb3I6IzAwYjVhZCFpbXBvcnRhbnR9LnVpLmJhc2ljLnRlYWwubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy50ZWFsLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzAwOWM5NSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMwMDljOTUhaW1wb3J0YW50fS51aS5ibHVlLmxhYmVsLC51aS5ibHVlLmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwIWltcG9ydGFudDtib3JkZXItY29sb3I6IzIxODVkMCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJsdWUubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLmJsdWUubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTY3OGMyIWltcG9ydGFudDtib3JkZXItY29sb3I6IzE2NzhjMiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJsdWUuY29ybmVyLmxhYmVsLC51aS5ibHVlLmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuYmx1ZS5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiMxYTY5YTQhaW1wb3J0YW50fS51aS5iYXNpYy5ibHVlLmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojMjE4NWQwIWltcG9ydGFudDtib3JkZXItY29sb3I6IzIxODVkMCFpbXBvcnRhbnR9LnVpLmJhc2ljLmJsdWUubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy5ibHVlLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzE2NzhjMiFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMxNjc4YzIhaW1wb3J0YW50fS51aS52aW9sZXQubGFiZWwsLnVpLnZpb2xldC5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiM2NDM1YzkhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS52aW9sZXQubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLnZpb2xldC5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM1ODI5YmIhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojNTgyOWJiIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkudmlvbGV0LmNvcm5lci5sYWJlbCwudWkudmlvbGV0LmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkudmlvbGV0LnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6IzUwMmFhMSFpbXBvcnRhbnR9LnVpLmJhc2ljLnZpb2xldC5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiM2NDM1YzkhaW1wb3J0YW50fS51aS5iYXNpYy52aW9sZXQubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy52aW9sZXQubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojNTgyOWJiIWltcG9ydGFudDtib3JkZXItY29sb3I6IzU4MjliYiFpbXBvcnRhbnR9LnVpLnB1cnBsZS5sYWJlbCwudWkucHVycGxlLmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojYTMzM2M4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnB1cnBsZS5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkucHVycGxlLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izk2MjdiYSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiM5NjI3YmEhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5wdXJwbGUuY29ybmVyLmxhYmVsLC51aS5wdXJwbGUuY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5wdXJwbGUucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojODIyOTlmIWltcG9ydGFudH0udWkuYmFzaWMucHVycGxlLmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojYTMzM2M4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2EzMzNjOCFpbXBvcnRhbnR9LnVpLmJhc2ljLnB1cnBsZS5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLnB1cnBsZS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiM5NjI3YmEhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojOTYyN2JhIWltcG9ydGFudH0udWkucGluay5sYWJlbCwudWkucGluay5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2UwMzk5NyFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5waW5rLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS5waW5rLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2U2MWE4ZCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNlNjFhOGQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5waW5rLmNvcm5lci5sYWJlbCwudWkucGluay5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLnBpbmsucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojYzcxZjdlIWltcG9ydGFudH0udWkuYmFzaWMucGluay5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2UwMzk5NyFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50fS51aS5iYXNpYy5waW5rLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMucGluay5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiNlNjFhOGQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZTYxYThkIWltcG9ydGFudH0udWkuYnJvd24ubGFiZWwsLnVpLmJyb3duLmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojYTU2NzNmIWltcG9ydGFudDtib3JkZXItY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJyb3duLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS5icm93bi5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5NzViMzMhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojOTc1YjMzIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuYnJvd24uY29ybmVyLmxhYmVsLC51aS5icm93bi5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLmJyb3duLnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6IzgwNTAzMSFpbXBvcnRhbnR9LnVpLmJhc2ljLmJyb3duLmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojYTU2NzNmIWltcG9ydGFudDtib3JkZXItY29sb3I6I2E1NjczZiFpbXBvcnRhbnR9LnVpLmJhc2ljLmJyb3duLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMuYnJvd24ubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojOTc1YjMzIWltcG9ydGFudDtib3JkZXItY29sb3I6Izk3NWIzMyFpbXBvcnRhbnR9LnVpLmdyZXkubGFiZWwsLnVpLmdyZXkubGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojNzY3Njc2IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuZ3JleS5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkuZ3JleS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM4MzgzODMhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojODM4MzgzIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuZ3JleS5jb3JuZXIubGFiZWwsLnVpLmdyZXkuY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5ncmV5LnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6IzgwNTAzMSFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZXkubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojNzY3Njc2IWltcG9ydGFudH0udWkuYmFzaWMuZ3JleS5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLmdyZXkubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojODM4MzgzIWltcG9ydGFudDtib3JkZXItY29sb3I6IzgzODM4MyFpbXBvcnRhbnR9LnVpLmJsYWNrLmxhYmVsLC51aS5ibGFjay5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6IzFiMWMxZCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMxYjFjMWQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibGFjay5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkuYmxhY2subGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMjcyOTJhIWltcG9ydGFudDtib3JkZXItY29sb3I6IzI3MjkyYSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJsYWNrLmNvcm5lci5sYWJlbCwudWkuYmxhY2suY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5ibGFjay5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiM4MDUwMzEhaW1wb3J0YW50fS51aS5iYXNpYy5ibGFjay5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzFiMWMxZCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMxYjFjMWQhaW1wb3J0YW50fS51aS5iYXNpYy5ibGFjay5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLmJsYWNrLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzI3MjkyYSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMyNzI5MmEhaW1wb3J0YW50fS51aS5iYXNpYy5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfWEudWkuYmFzaWMubGFiZWw6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YmFja2dyb3VuZDpub25lICNmZmY7Y29sb3I6IzFlNzBiZjstd2Via2l0LWJveC1zaGFkb3c6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5iYXNpYy5wb2ludGluZy5sYWJlbDpiZWZvcmV7Ym9yZGVyLWNvbG9yOmluaGVyaXR9LnVpLmZsdWlkLmxhYmVscz4ubGFiZWwsLnVpLmxhYmVsLmZsdWlke3dpZHRoOjEwMCU7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94fS51aS5pbnZlcnRlZC5sYWJlbCwudWkuaW52ZXJ0ZWQubGFiZWxzIC5sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KSFpbXBvcnRhbnR9LnVpLmhvcml6b250YWwubGFiZWwsLnVpLmhvcml6b250YWwubGFiZWxzIC5sYWJlbHttYXJnaW46MCAuNWVtIDAgMDtwYWRkaW5nOi40ZW0gLjgzM2VtO21pbi13aWR0aDozZW07dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLmNpcmN1bGFyLmxhYmVsLC51aS5jaXJjdWxhci5sYWJlbHMgLmxhYmVse21pbi13aWR0aDoyZW07bWluLWhlaWdodDoyZW07cGFkZGluZzouNWVtIWltcG9ydGFudDtsaW5lLWhlaWdodDoxZW07dGV4dC1hbGlnbjpjZW50ZXI7Ym9yZGVyLXJhZGl1czo1MDByZW19LnVpLmVtcHR5LmNpcmN1bGFyLmxhYmVsLC51aS5lbXB0eS5jaXJjdWxhci5sYWJlbHMgLmxhYmVse21pbi13aWR0aDowO21pbi1oZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47d2lkdGg6LjVlbTtoZWlnaHQ6LjVlbTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkucG9pbnRpbmcubGFiZWx7cG9zaXRpb246cmVsYXRpdmV9LnVpLmF0dGFjaGVkLnBvaW50aW5nLmxhYmVse3Bvc2l0aW9uOmFic29sdXRlfS51aS5wb2ludGluZy5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0O2JhY2tncm91bmQtaW1hZ2U6aW5oZXJpdDtib3JkZXItd2lkdGg6bm9uZTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOmluaGVyaXR9LnVpLnBvaW50aW5nLmxhYmVsOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7YmFja2dyb3VuZC1pbWFnZTpub25lO3otaW5kZXg6Mjt3aWR0aDouNjY2NmVtO2hlaWdodDouNjY2NmVtOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZX0udWkucG9pbnRpbmcubGFiZWwsLnVpW2NsYXNzKj1cXFwicG9pbnRpbmcgYWJvdmVcXFwiXS5sYWJlbHttYXJnaW4tdG9wOjFlbX0udWkucG9pbnRpbmcubGFiZWw6YmVmb3JlLC51aVtjbGFzcyo9XFxcInBvaW50aW5nIGFib3ZlXFxcIl0ubGFiZWw6YmVmb3Jle2JvcmRlci13aWR0aDoxcHggMCAwIDFweDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dG9wOjA7bGVmdDo1MCV9LnVpW2NsYXNzKj1cXFwiYm90dG9tIHBvaW50aW5nXFxcIl0ubGFiZWwsLnVpW2NsYXNzKj1cXFwicG9pbnRpbmcgYmVsb3dcXFwiXS5sYWJlbHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToxZW19LnVpW2NsYXNzKj1cXFwiYm90dG9tIHBvaW50aW5nXFxcIl0ubGFiZWw6YmVmb3JlLC51aVtjbGFzcyo9XFxcInBvaW50aW5nIGJlbG93XFxcIl0ubGFiZWw6YmVmb3Jle2JvcmRlci13aWR0aDowIDFweCAxcHggMDt0b3A6YXV0bztyaWdodDphdXRvOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTt0b3A6MTAwJTtsZWZ0OjUwJX0udWlbY2xhc3MqPVxcXCJsZWZ0IHBvaW50aW5nXFxcIl0ubGFiZWx7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0Oi42NjY2ZW19LnVpW2NsYXNzKj1cXFwibGVmdCBwb2ludGluZ1xcXCJdLmxhYmVsOmJlZm9yZXtib3JkZXItd2lkdGg6MCAwIDFweCAxcHg7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO2JvdHRvbTphdXRvO3JpZ2h0OmF1dG87dG9wOjUwJTtsZWZ0OjB9LnVpW2NsYXNzKj1cXFwicmlnaHQgcG9pbnRpbmdcXFwiXS5sYWJlbHttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0Oi42NjY2ZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgcG9pbnRpbmdcXFwiXS5sYWJlbDpiZWZvcmV7Ym9yZGVyLXdpZHRoOjFweCAxcHggMCAwOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dG9wOjUwJTtyaWdodDowO2JvdHRvbTphdXRvO2xlZnQ6YXV0b30udWkuYmFzaWMucG9pbnRpbmcubGFiZWw6YmVmb3JlLC51aS5iYXNpY1tjbGFzcyo9XFxcInBvaW50aW5nIGFib3ZlXFxcIl0ubGFiZWw6YmVmb3Jle21hcmdpbi10b3A6LTFweH0udWkuYmFzaWNbY2xhc3MqPVxcXCJib3R0b20gcG9pbnRpbmdcXFwiXS5sYWJlbDpiZWZvcmUsLnVpLmJhc2ljW2NsYXNzKj1cXFwicG9pbnRpbmcgYmVsb3dcXFwiXS5sYWJlbDpiZWZvcmV7Ym90dG9tOmF1dG87dG9wOjEwMCU7bWFyZ2luLXRvcDoxcHh9LnVpLmJhc2ljW2NsYXNzKj1cXFwibGVmdCBwb2ludGluZ1xcXCJdLmxhYmVsOmJlZm9yZXt0b3A6NTAlO2xlZnQ6LTFweH0udWkuYmFzaWNbY2xhc3MqPVxcXCJyaWdodCBwb2ludGluZ1xcXCJdLmxhYmVsOmJlZm9yZXt0b3A6NTAlO3JpZ2h0Oi0xcHh9LnVpLmZsb2F0aW5nLmxhYmVse3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwO3RvcDotMWVtO2xlZnQ6MTAwJTttYXJnaW46MCAwIDAgLTEuNWVtIWltcG9ydGFudH0udWkubWluaS5sYWJlbCwudWkubWluaS5sYWJlbHMgLmxhYmVse2ZvbnQtc2l6ZTouNjQyODU3MTRyZW19LnVpLnRpbnkubGFiZWwsLnVpLnRpbnkubGFiZWxzIC5sYWJlbHtmb250LXNpemU6LjcxNDI4NTcxcmVtfS51aS5zbWFsbC5sYWJlbCwudWkuc21hbGwubGFiZWxzIC5sYWJlbHtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS5sYWJlbCwudWkubGFiZWxzIC5sYWJlbHtmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5sYXJnZS5sYWJlbCwudWkubGFyZ2UubGFiZWxzIC5sYWJlbHtmb250LXNpemU6MXJlbX0udWkuYmlnLmxhYmVsLC51aS5iaWcubGFiZWxzIC5sYWJlbHtmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5sYWJlbCwudWkuaHVnZS5sYWJlbHMgLmxhYmVse2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLmxhYmVsLC51aS5tYXNzaXZlLmxhYmVscyAubGFiZWx7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIExpc3RcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5saXN0LG9sLnVpLmxpc3QsdWwudWkubGlzdHtsaXN0LXN0eWxlLXR5cGU6bm9uZTttYXJnaW46MWVtIDA7cGFkZGluZzowIDB9LnVpLmxpc3Q6Zmlyc3QtY2hpbGQsb2wudWkubGlzdDpmaXJzdC1jaGlsZCx1bC51aS5saXN0OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MDtwYWRkaW5nLXRvcDowfS51aS5saXN0Omxhc3QtY2hpbGQsb2wudWkubGlzdDpsYXN0LWNoaWxkLHVsLnVpLmxpc3Q6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjA7cGFkZGluZy1ib3R0b206MH0udWkubGlzdCAubGlzdD4uaXRlbSwudWkubGlzdD4uaXRlbSxvbC51aS5saXN0IGxpLHVsLnVpLmxpc3QgbGl7ZGlzcGxheTpsaXN0LWl0ZW07dGFibGUtbGF5b3V0OmZpeGVkO2xpc3Qtc3R5bGUtdHlwZTpub25lO2xpc3Qtc3R5bGUtcG9zaXRpb246b3V0c2lkZTtwYWRkaW5nOi4yMTQyODU3MWVtIDA7bGluZS1oZWlnaHQ6MS4xNDI4NTcxNGVtfS51aS5saXN0Pi5pdGVtOmFmdGVyLC51aS5saXN0Pi5saXN0Pi5pdGVtLG9sLnVpLmxpc3Q+bGk6Zmlyc3QtY2hpbGQ6YWZ0ZXIsdWwudWkubGlzdD5saTpmaXJzdC1jaGlsZDphZnRlcntjb250ZW50OicnO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjA7Y2xlYXI6Ym90aDt2aXNpYmlsaXR5OmhpZGRlbn0udWkubGlzdCAubGlzdD4uaXRlbTpmaXJzdC1jaGlsZCwudWkubGlzdD4uaXRlbTpmaXJzdC1jaGlsZCxvbC51aS5saXN0IGxpOmZpcnN0LWNoaWxkLHVsLnVpLmxpc3QgbGk6Zmlyc3QtY2hpbGR7cGFkZGluZy10b3A6MH0udWkubGlzdCAubGlzdD4uaXRlbTpsYXN0LWNoaWxkLC51aS5saXN0Pi5pdGVtOmxhc3QtY2hpbGQsb2wudWkubGlzdCBsaTpsYXN0LWNoaWxkLHVsLnVpLmxpc3QgbGk6bGFzdC1jaGlsZHtwYWRkaW5nLWJvdHRvbTowfS51aS5saXN0IC5saXN0LG9sLnVpLmxpc3Qgb2wsdWwudWkubGlzdCB1bHtjbGVhcjpib3RoO21hcmdpbjowO3BhZGRpbmc6Ljc1ZW0gMCAuMjVlbSAuNWVtfS51aS5saXN0IC5saXN0Pi5pdGVtLG9sLnVpLmxpc3Qgb2wgbGksdWwudWkubGlzdCB1bCBsaXtwYWRkaW5nOi4xNDI4NTcxNGVtIDA7bGluZS1oZWlnaHQ6aW5oZXJpdH0udWkubGlzdCAubGlzdD4uaXRlbT5pLmljb24sLnVpLmxpc3Q+Lml0ZW0+aS5pY29ue2Rpc3BsYXk6dGFibGUtY2VsbDttYXJnaW46MDtwYWRkaW5nLXRvcDowO3BhZGRpbmctcmlnaHQ6LjI4NTcxNDI5ZW07dmVydGljYWwtYWxpZ246dG9wOy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlfS51aS5saXN0IC5saXN0Pi5pdGVtPmkuaWNvbjpvbmx5LWNoaWxkLC51aS5saXN0Pi5pdGVtPmkuaWNvbjpvbmx5LWNoaWxke2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOnRvcH0udWkubGlzdCAubGlzdD4uaXRlbT4uaW1hZ2UsLnVpLmxpc3Q+Lml0ZW0+LmltYWdle2Rpc3BsYXk6dGFibGUtY2VsbDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O21hcmdpbjowO3ZlcnRpY2FsLWFsaWduOnRvcH0udWkubGlzdCAubGlzdD4uaXRlbT4uaW1hZ2U6bm90KDpvbmx5LWNoaWxkKTpub3QoaW1nKSwudWkubGlzdD4uaXRlbT4uaW1hZ2U6bm90KDpvbmx5LWNoaWxkKTpub3QoaW1nKXtwYWRkaW5nLXJpZ2h0Oi41ZW19LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+LmltYWdlIGltZywudWkubGlzdD4uaXRlbT4uaW1hZ2UgaW1ne3ZlcnRpY2FsLWFsaWduOnRvcH0udWkubGlzdCAubGlzdD4uaXRlbT4uaW1hZ2U6b25seS1jaGlsZCwudWkubGlzdCAubGlzdD4uaXRlbT5pbWcuaW1hZ2UsLnVpLmxpc3Q+Lml0ZW0+LmltYWdlOm9ubHktY2hpbGQsLnVpLmxpc3Q+Lml0ZW0+aW1nLmltYWdle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5saXN0IC5saXN0Pi5pdGVtPi5jb250ZW50LC51aS5saXN0Pi5pdGVtPi5jb250ZW50e2xpbmUtaGVpZ2h0OjEuMTQyODU3MTRlbX0udWkubGlzdCAubGlzdD4uaXRlbT4uaWNvbisuY29udGVudCwudWkubGlzdCAubGlzdD4uaXRlbT4uaW1hZ2UrLmNvbnRlbnQsLnVpLmxpc3Q+Lml0ZW0+Lmljb24rLmNvbnRlbnQsLnVpLmxpc3Q+Lml0ZW0+LmltYWdlKy5jb250ZW50e2Rpc3BsYXk6dGFibGUtY2VsbDt3aWR0aDoxMDAlO3BhZGRpbmc6MCAwIDAgLjVlbTt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+aW1nLmltYWdlKy5jb250ZW50LC51aS5saXN0Pi5pdGVtPmltZy5pbWFnZSsuY29udGVudHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDphdXRvfS51aS5saXN0IC5saXN0Pi5pdGVtPi5jb250ZW50Pi5saXN0LC51aS5saXN0Pi5pdGVtPi5jb250ZW50Pi5saXN0e21hcmdpbi1sZWZ0OjA7cGFkZGluZy1sZWZ0OjB9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0gLmhlYWRlciwudWkubGlzdD4uaXRlbSAuaGVhZGVye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0gLmRlc2NyaXB0aW9uLC51aS5saXN0Pi5pdGVtIC5kZXNjcmlwdGlvbntkaXNwbGF5OmJsb2NrO2NvbG9yOnJnYmEoMCwwLDAsLjcpfS51aS5saXN0IC5saXN0Pi5pdGVtIGEsLnVpLmxpc3Q+Lml0ZW0gYXtjdXJzb3I6cG9pbnRlcn0udWkubGlzdCAubGlzdD5hLml0ZW0sLnVpLmxpc3Q+YS5pdGVte2N1cnNvcjpwb2ludGVyO2NvbG9yOiM0MTgzYzR9LnVpLmxpc3QgLmxpc3Q+YS5pdGVtOmhvdmVyLC51aS5saXN0PmEuaXRlbTpob3Zlcntjb2xvcjojMWU3MGJmfS51aS5saXN0IC5saXN0PmEuaXRlbSBpLmljb24sLnVpLmxpc3Q+YS5pdGVtIGkuaWNvbntjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkubGlzdCAubGlzdD4uaXRlbSBhLmhlYWRlciwudWkubGlzdD4uaXRlbSBhLmhlYWRlcntjdXJzb3I6cG9pbnRlcjtjb2xvcjojNDE4M2M0IWltcG9ydGFudH0udWkubGlzdCAubGlzdD4uaXRlbSBhLmhlYWRlcjpob3ZlciwudWkubGlzdD4uaXRlbSBhLmhlYWRlcjpob3Zlcntjb2xvcjojMWU3MGJmIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5saXN0e2Zsb2F0OmxlZnR9LnVpW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmxpc3R7ZmxvYXQ6cmlnaHR9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0gW2NsYXNzKj1cXFwibGVmdCBmbG9hdGVkXFxcIl0sLnVpLmxpc3Q+Lml0ZW0gW2NsYXNzKj1cXFwibGVmdCBmbG9hdGVkXFxcIl17ZmxvYXQ6bGVmdDttYXJnaW46MCAxZW0gMCAwfS51aS5saXN0IC5saXN0Pi5pdGVtIFtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXSwudWkubGlzdD4uaXRlbSBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl17ZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMCAwIDFlbX0udWkubWVudSAudWkubGlzdCAubGlzdD4uaXRlbSwudWkubWVudSAudWkubGlzdD4uaXRlbXtkaXNwbGF5Omxpc3QtaXRlbTt0YWJsZS1sYXlvdXQ6Zml4ZWQ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtsaXN0LXN0eWxlLXR5cGU6bm9uZTtsaXN0LXN0eWxlLXBvc2l0aW9uOm91dHNpZGU7cGFkZGluZzouMjE0Mjg1NzFlbSAwO2xpbmUtaGVpZ2h0OjEuMTQyODU3MTRlbX0udWkubWVudSAudWkubGlzdCAubGlzdD4uaXRlbTpiZWZvcmUsLnVpLm1lbnUgLnVpLmxpc3Q+Lml0ZW06YmVmb3Jle2JvcmRlcjpub25lO2JhY2tncm91bmQ6MCAwfS51aS5tZW51IC51aS5saXN0IC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxkLC51aS5tZW51IC51aS5saXN0Pi5pdGVtOmZpcnN0LWNoaWxke3BhZGRpbmctdG9wOjB9LnVpLm1lbnUgLnVpLmxpc3QgLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZCwudWkubWVudSAudWkubGlzdD4uaXRlbTpsYXN0LWNoaWxke3BhZGRpbmctYm90dG9tOjB9LnVpLmhvcml6b250YWwubGlzdHtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MH0udWkuaG9yaXpvbnRhbC5saXN0Pi5pdGVte2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0OjFlbTtmb250LXNpemU6MXJlbX0udWkuaG9yaXpvbnRhbC5saXN0Om5vdCguY2VsbGVkKT4uaXRlbTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowIWltcG9ydGFudDtwYWRkaW5nLWxlZnQ6MCFpbXBvcnRhbnR9LnVpLmhvcml6b250YWwubGlzdCAubGlzdHtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLWJvdHRvbTowfS51aS5ob3Jpem9udGFsLmxpc3QgLmxpc3Q+Lml0ZW0+LmNvbnRlbnQsLnVpLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbT4uaWNvbiwudWkuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtPi5pbWFnZSwudWkuaG9yaXpvbnRhbC5saXN0Pi5pdGVtPi5jb250ZW50LC51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW0+Lmljb24sLnVpLmhvcml6b250YWwubGlzdD4uaXRlbT4uaW1hZ2V7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGQsLnVpLmhvcml6b250YWwubGlzdD4uaXRlbTpsYXN0LWNoaWxke3BhZGRpbmctdG9wOi4yMTQyODU3MWVtO3BhZGRpbmctYm90dG9tOi4yMTQyODU3MWVtfS51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW0+aS5pY29ue21hcmdpbjowO3BhZGRpbmc6MCAuMjVlbSAwIDB9LnVpLmhvcml6b250YWwubGlzdD4uaXRlbT4uaWNvbiwudWkuaG9yaXpvbnRhbC5saXN0Pi5pdGVtPi5pY29uKy5jb250ZW50e2Zsb2F0Om5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLmxpc3QgLmxpc3Q+LmRpc2FibGVkLml0ZW0sLnVpLmxpc3Q+LmRpc2FibGVkLml0ZW17cG9pbnRlci1ldmVudHM6bm9uZTtjb2xvcjpyZ2JhKDQwLDQwLDQwLC4zKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLmxpc3QgLmxpc3Q+LmRpc2FibGVkLml0ZW0sLnVpLmludmVydGVkLmxpc3Q+LmRpc2FibGVkLml0ZW17Y29sb3I6cmdiYSgyMjUsMjI1LDIyNSwuMykhaW1wb3J0YW50fS51aS5saXN0IC5saXN0PmEuaXRlbTpob3ZlciAuaWNvbiwudWkubGlzdD5hLml0ZW06aG92ZXIgLmljb257Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbnZlcnRlZC5saXN0IC5saXN0PmEuaXRlbT4uaWNvbiwudWkuaW52ZXJ0ZWQubGlzdD5hLml0ZW0+Lmljb257Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LnVpLmludmVydGVkLmxpc3QgLmxpc3Q+Lml0ZW0gLmhlYWRlciwudWkuaW52ZXJ0ZWQubGlzdD4uaXRlbSAuaGVhZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5pbnZlcnRlZC5saXN0IC5saXN0Pi5pdGVtIC5kZXNjcmlwdGlvbiwudWkuaW52ZXJ0ZWQubGlzdD4uaXRlbSAuZGVzY3JpcHRpb257Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LnVpLmludmVydGVkLmxpc3QgLmxpc3Q+YS5pdGVtLC51aS5pbnZlcnRlZC5saXN0PmEuaXRlbXtjdXJzb3I6cG9pbnRlcjtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkuaW52ZXJ0ZWQubGlzdCAubGlzdD5hLml0ZW06aG92ZXIsLnVpLmludmVydGVkLmxpc3Q+YS5pdGVtOmhvdmVye2NvbG9yOiMxZTcwYmZ9LnVpLmludmVydGVkLmxpc3QgLml0ZW0gYTpub3QoLnVpKXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KSFpbXBvcnRhbnR9LnVpLmludmVydGVkLmxpc3QgLml0ZW0gYTpub3QoLnVpKTpob3Zlcntjb2xvcjojMWU3MGJmIWltcG9ydGFudH0udWkubGlzdCBbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdLC51aS5saXN0W2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXSAuY29udGVudCwudWkubGlzdFtjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0gLmltYWdle3ZlcnRpY2FsLWFsaWduOnRvcCFpbXBvcnRhbnR9LnVpLmxpc3QgW2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXSwudWkubGlzdFtjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0gLmNvbnRlbnQsLnVpLmxpc3RbY2xhc3MqPVxcXCJtaWRkbGUgYWxpZ25lZFxcXCJdIC5pbWFnZXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGUhaW1wb3J0YW50fS51aS5saXN0IFtjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0sLnVpLmxpc3RbY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdIC5jb250ZW50LC51aS5saXN0W2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXSAuaW1hZ2V7dmVydGljYWwtYWxpZ246Ym90dG9tIWltcG9ydGFudH0udWkubGluay5saXN0IC5pdGVtLC51aS5saW5rLmxpc3QgLml0ZW0gYTpub3QoLnVpKSwudWkubGluay5saXN0IGEuaXRlbXtjb2xvcjpyZ2JhKDAsMCwwLC40KTstd2Via2l0LXRyYW5zaXRpb246LjFzIGNvbG9yIGVhc2U7dHJhbnNpdGlvbjouMXMgY29sb3IgZWFzZX0udWkubGluay5saXN0Lmxpc3QgLml0ZW0gYTpub3QoLnVpKTpob3ZlciwudWkubGluay5saXN0Lmxpc3QgYS5pdGVtOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjgpfS51aS5saW5rLmxpc3QubGlzdCAuaXRlbSBhOm5vdCgudWkpOmFjdGl2ZSwudWkubGluay5saXN0Lmxpc3QgYS5pdGVtOmFjdGl2ZXtjb2xvcjpyZ2JhKDAsMCwwLC45KX0udWkubGluay5saXN0Lmxpc3QgLmFjdGl2ZS5pdGVtLC51aS5saW5rLmxpc3QubGlzdCAuYWN0aXZlLml0ZW0gYTpub3QoLnVpKXtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmludmVydGVkLmxpbmsubGlzdCAuaXRlbSwudWkuaW52ZXJ0ZWQubGluay5saXN0IC5pdGVtIGE6bm90KC51aSksLnVpLmludmVydGVkLmxpbmsubGlzdCBhLml0ZW17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9LnVpLmludmVydGVkLmxpbmsubGlzdC5saXN0IC5pdGVtIGE6bm90KC51aSk6aG92ZXIsLnVpLmludmVydGVkLmxpbmsubGlzdC5saXN0IGEuaXRlbTpob3Zlcntjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5saW5rLmxpc3QubGlzdCAuaXRlbSBhOm5vdCgudWkpOmFjdGl2ZSwudWkuaW52ZXJ0ZWQubGluay5saXN0Lmxpc3QgYS5pdGVtOmFjdGl2ZXtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5saW5rLmxpc3QubGlzdCAuYWN0aXZlLml0ZW0gYTpub3QoLnVpKSwudWkuaW52ZXJ0ZWQubGluay5saXN0Lmxpc3QgYS5hY3RpdmUuaXRlbXtjb2xvcjojZmZmfS51aS5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbSwudWkuc2VsZWN0aW9uLmxpc3Q+Lml0ZW17Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZDowIDA7cGFkZGluZzouNWVtIC41ZW07bWFyZ2luOjA7Y29sb3I6cmdiYSgwLDAsMCwuNCk7Ym9yZGVyLXJhZGl1czouNWVtOy13ZWJraXQtdHJhbnNpdGlvbjouMXMgY29sb3IgZWFzZSwuMXMgcGFkZGluZy1sZWZ0IGVhc2UsLjFzIGJhY2tncm91bmQtY29sb3IgZWFzZTt0cmFuc2l0aW9uOi4xcyBjb2xvciBlYXNlLC4xcyBwYWRkaW5nLWxlZnQgZWFzZSwuMXMgYmFja2dyb3VuZC1jb2xvciBlYXNlfS51aS5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbTpsYXN0LWNoaWxkLC51aS5zZWxlY3Rpb24ubGlzdD4uaXRlbTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuc2VsZWN0aW9uLmxpc3QubGlzdD4uaXRlbTpob3ZlciwudWkuc2VsZWN0aW9uLmxpc3Q+Lml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMyk7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnNlbGVjdGlvbi5saXN0IC5saXN0Pi5pdGVtOmFjdGl2ZSwudWkuc2VsZWN0aW9uLmxpc3Q+Lml0ZW06YWN0aXZle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjkpfS51aS5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbS5hY3RpdmUsLnVpLnNlbGVjdGlvbi5saXN0Pi5pdGVtLmFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmludmVydGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVte2JhY2tncm91bmQ6MCAwO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfS51aS5pbnZlcnRlZC5zZWxlY3Rpb24ubGlzdD4uaXRlbTpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjAyKTtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5zZWxlY3Rpb24ubGlzdD4uaXRlbTphY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuc2VsZWN0aW9uLmxpc3Q+Lml0ZW0uYWN0aXZle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmZ9LnVpLmNlbGxlZC5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbSwudWkuY2VsbGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVtLC51aS5kaXZpZGVkLnNlbGVjdGlvbi5saXN0IC5saXN0Pi5pdGVtLC51aS5kaXZpZGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVte2JvcmRlci1yYWRpdXM6MH0udWkuYW5pbWF0ZWQubGlzdD4uaXRlbXstd2Via2l0LXRyYW5zaXRpb246LjI1cyBjb2xvciBlYXNlIC4xcywuMjVzIHBhZGRpbmctbGVmdCBlYXNlIC4xcywuMjVzIGJhY2tncm91bmQtY29sb3IgZWFzZSAuMXM7dHJhbnNpdGlvbjouMjVzIGNvbG9yIGVhc2UgLjFzLC4yNXMgcGFkZGluZy1sZWZ0IGVhc2UgLjFzLC4yNXMgYmFja2dyb3VuZC1jb2xvciBlYXNlIC4xc30udWkuYW5pbWF0ZWQubGlzdDpub3QoLmhvcml6b250YWwpPi5pdGVtOmhvdmVye3BhZGRpbmctbGVmdDoxZW19LnVpLmZpdHRlZC5saXN0Om5vdCguc2VsZWN0aW9uKSAubGlzdD4uaXRlbSwudWkuZml0dGVkLmxpc3Q6bm90KC5zZWxlY3Rpb24pPi5pdGVte3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0udWkuZml0dGVkLnNlbGVjdGlvbi5saXN0IC5saXN0Pi5pdGVtLC51aS5maXR0ZWQuc2VsZWN0aW9uLmxpc3Q+Lml0ZW17bWFyZ2luLWxlZnQ6LS41ZW07bWFyZ2luLXJpZ2h0Oi0uNWVtfS51aS5idWxsZXRlZC5saXN0LHVsLnVpLmxpc3R7bWFyZ2luLWxlZnQ6MS4yNXJlbX0udWkuYnVsbGV0ZWQubGlzdCAubGlzdD4uaXRlbSwudWkuYnVsbGV0ZWQubGlzdD4uaXRlbSx1bC51aS5saXN0IGxpe3Bvc2l0aW9uOnJlbGF0aXZlfS51aS5idWxsZXRlZC5saXN0IC5saXN0Pi5pdGVtOmJlZm9yZSwudWkuYnVsbGV0ZWQubGlzdD4uaXRlbTpiZWZvcmUsdWwudWkubGlzdCBsaTpiZWZvcmV7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6YXV0bztsZWZ0OmF1dG87Zm9udC13ZWlnaHQ6NDAwO21hcmdpbi1sZWZ0Oi0xLjI1cmVtO2NvbnRlbnQ6J+KAoic7b3BhY2l0eToxO2NvbG9yOmluaGVyaXQ7dmVydGljYWwtYWxpZ246dG9wfS51aS5idWxsZXRlZC5saXN0IC5saXN0PmEuaXRlbTpiZWZvcmUsLnVpLmJ1bGxldGVkLmxpc3Q+YS5pdGVtOmJlZm9yZSx1bC51aS5saXN0IGxpOmJlZm9yZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmJ1bGxldGVkLmxpc3QgLmxpc3QsdWwudWkubGlzdCB1bHtwYWRkaW5nLWxlZnQ6MS4yNXJlbX0udWkuaG9yaXpvbnRhbC5idWxsZXRlZC5saXN0LHVsLnVpLmhvcml6b250YWwuYnVsbGV0ZWQubGlzdHttYXJnaW4tbGVmdDowfS51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3Q+Lml0ZW0sdWwudWkuaG9yaXpvbnRhbC5idWxsZXRlZC5saXN0IGxpe21hcmdpbi1sZWZ0OjEuNzVyZW19LnVpLmhvcml6b250YWwuYnVsbGV0ZWQubGlzdD4uaXRlbTpmaXJzdC1jaGlsZCx1bC51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3QgbGk6Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0udWkuaG9yaXpvbnRhbC5idWxsZXRlZC5saXN0Pi5pdGVtOjpiZWZvcmUsdWwudWkuaG9yaXpvbnRhbC5idWxsZXRlZC5saXN0IGxpOjpiZWZvcmV7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGQ6OmJlZm9yZSx1bC51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3QgbGk6Zmlyc3QtY2hpbGQ6OmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLm9yZGVyZWQubGlzdCwudWkub3JkZXJlZC5saXN0IC5saXN0LG9sLnVpLmxpc3Qsb2wudWkubGlzdCBvbHtjb3VudGVyLXJlc2V0Om9yZGVyZWQ7bWFyZ2luLWxlZnQ6MS4yNXJlbTtsaXN0LXN0eWxlLXR5cGU6bm9uZX0udWkub3JkZXJlZC5saXN0IC5saXN0Pi5pdGVtLC51aS5vcmRlcmVkLmxpc3Q+Lml0ZW0sb2wudWkubGlzdCBsaXtsaXN0LXN0eWxlLXR5cGU6bm9uZTtwb3NpdGlvbjpyZWxhdGl2ZX0udWkub3JkZXJlZC5saXN0IC5saXN0Pi5pdGVtOmJlZm9yZSwudWkub3JkZXJlZC5saXN0Pi5pdGVtOmJlZm9yZSxvbC51aS5saXN0IGxpOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6YXV0bztsZWZ0OmF1dG87LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9pbnRlci1ldmVudHM6bm9uZTttYXJnaW4tbGVmdDotMS4yNXJlbTtjb3VudGVyLWluY3JlbWVudDpvcmRlcmVkO2NvbnRlbnQ6Y291bnRlcnMob3JkZXJlZCwgXFxcIi5cXFwiKSBcXFwiIFxcXCI7dGV4dC1hbGlnbjpyaWdodDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7dmVydGljYWwtYWxpZ246bWlkZGxlO29wYWNpdHk6Ljh9LnVpLm9yZGVyZWQuaW52ZXJ0ZWQubGlzdCAubGlzdD4uaXRlbTpiZWZvcmUsLnVpLm9yZGVyZWQuaW52ZXJ0ZWQubGlzdD4uaXRlbTpiZWZvcmUsb2wudWkuaW52ZXJ0ZWQubGlzdCBsaTpiZWZvcmV7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LnVpLm9yZGVyZWQubGlzdD4uaXRlbVtkYXRhLXZhbHVlXSwudWkub3JkZXJlZC5saXN0Pi5saXN0Pi5pdGVtW2RhdGEtdmFsdWVde2NvbnRlbnQ6YXR0cihkYXRhLXZhbHVlKX1vbC51aS5saXN0IGxpW3ZhbHVlXTpiZWZvcmV7Y29udGVudDphdHRyKHZhbHVlKX0udWkub3JkZXJlZC5saXN0IC5saXN0LG9sLnVpLmxpc3Qgb2x7bWFyZ2luLWxlZnQ6MWVtfS51aS5vcmRlcmVkLmxpc3QgLmxpc3Q+Lml0ZW06YmVmb3JlLG9sLnVpLmxpc3Qgb2wgbGk6YmVmb3Jle21hcmdpbi1sZWZ0Oi0yZW19LnVpLm9yZGVyZWQuaG9yaXpvbnRhbC5saXN0LG9sLnVpLmhvcml6b250YWwubGlzdHttYXJnaW4tbGVmdDowfS51aS5vcmRlcmVkLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbTpiZWZvcmUsLnVpLm9yZGVyZWQuaG9yaXpvbnRhbC5saXN0Pi5pdGVtOmJlZm9yZSxvbC51aS5ob3Jpem9udGFsLmxpc3QgbGk6YmVmb3Jle3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MCAuNWVtIDAgMH0udWkuZGl2aWRlZC5saXN0Pi5pdGVte2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuZGl2aWRlZC5saXN0IC5saXN0Pi5pdGVte2JvcmRlci10b3A6bm9uZX0udWkuZGl2aWRlZC5saXN0IC5pdGVtIC5saXN0Pi5pdGVte2JvcmRlci10b3A6bm9uZX0udWkuZGl2aWRlZC5saXN0IC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxkLC51aS5kaXZpZGVkLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDpub25lfS51aS5kaXZpZGVkLmxpc3Q6bm90KC5ob3Jpem9udGFsKSAubGlzdD4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLXdpZHRoOjFweH0udWkuZGl2aWRlZC5idWxsZXRlZC5saXN0IC5saXN0LC51aS5kaXZpZGVkLmJ1bGxldGVkLmxpc3Q6bm90KC5ob3Jpem9udGFsKXttYXJnaW4tbGVmdDowO3BhZGRpbmctbGVmdDowfS51aS5kaXZpZGVkLmJ1bGxldGVkLmxpc3Q+Lml0ZW06bm90KC5ob3Jpem9udGFsKXtwYWRkaW5nLWxlZnQ6MS4yNXJlbX0udWkuZGl2aWRlZC5vcmRlcmVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuZGl2aWRlZC5vcmRlcmVkLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmRpdmlkZWQub3JkZXJlZC5saXN0Pi5pdGVte3BhZGRpbmctbGVmdDoxLjI1cmVtfS51aS5kaXZpZGVkLm9yZGVyZWQubGlzdCAuaXRlbSAubGlzdHttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO3BhZGRpbmctYm90dG9tOi4yMTQyODU3MWVtfS51aS5kaXZpZGVkLm9yZGVyZWQubGlzdCAuaXRlbSAubGlzdD4uaXRlbXtwYWRkaW5nLWxlZnQ6MWVtfS51aS5kaXZpZGVkLnNlbGVjdGlvbi5saXN0IC5saXN0Pi5pdGVtLC51aS5kaXZpZGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVte21hcmdpbjowO2JvcmRlci1yYWRpdXM6MH0udWkuZGl2aWRlZC5ob3Jpem9udGFsLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuZGl2aWRlZC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW06bm90KDpmaXJzdC1jaGlsZCl7cGFkZGluZy1sZWZ0Oi41ZW19LnVpLmRpdmlkZWQuaG9yaXpvbnRhbC5saXN0Pi5pdGVtOm5vdCg6bGFzdC1jaGlsZCl7cGFkZGluZy1yaWdodDouNWVtfS51aS5kaXZpZGVkLmhvcml6b250YWwubGlzdD4uaXRlbXtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46MDtsaW5lLWhlaWdodDouNn0udWkuaG9yaXpvbnRhbC5kaXZpZGVkLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkuZGl2aWRlZC5pbnZlcnRlZC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW0sLnVpLmRpdmlkZWQuaW52ZXJ0ZWQubGlzdD4uaXRlbSwudWkuZGl2aWRlZC5pbnZlcnRlZC5saXN0Pi5saXN0e2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuY2VsbGVkLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5saXN0Pi5saXN0e2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0Oi41ZW19LnVpLmNlbGxlZC5saXN0Pi5pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5jZWxsZWQubGlzdD4uaXRlbTpmaXJzdC1jaGlsZCwudWkuY2VsbGVkLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZHtwYWRkaW5nLXRvcDouMjE0Mjg1NzFlbTtwYWRkaW5nLWJvdHRvbTouMjE0Mjg1NzFlbX0udWkuY2VsbGVkLmxpc3QgLml0ZW0gLmxpc3Q+Lml0ZW17Ym9yZGVyLXdpZHRoOjB9LnVpLmNlbGxlZC5saXN0IC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MH0udWkuY2VsbGVkLmJ1bGxldGVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuY2VsbGVkLmJ1bGxldGVkLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5idWxsZXRlZC5saXN0Pi5pdGVte3BhZGRpbmctbGVmdDoxLjI1cmVtfS51aS5jZWxsZWQuYnVsbGV0ZWQubGlzdCAuaXRlbSAubGlzdHttYXJnaW4tbGVmdDotMS4yNXJlbTttYXJnaW4tcmlnaHQ6LTEuMjVyZW07cGFkZGluZy1ib3R0b206LjIxNDI4NTcxZW19LnVpLmNlbGxlZC5vcmRlcmVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuY2VsbGVkLm9yZGVyZWQubGlzdCAubGlzdD4uaXRlbSwudWkuY2VsbGVkLm9yZGVyZWQubGlzdD4uaXRlbXtwYWRkaW5nLWxlZnQ6MS4yNXJlbX0udWkuY2VsbGVkLm9yZGVyZWQubGlzdCAuaXRlbSAubGlzdHttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO3BhZGRpbmctYm90dG9tOi4yMTQyODU3MWVtfS51aS5jZWxsZWQub3JkZXJlZC5saXN0IC5saXN0Pi5pdGVte3BhZGRpbmctbGVmdDoxZW19LnVpLmhvcml6b250YWwuY2VsbGVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuaG9yaXpvbnRhbC5jZWxsZWQubGlzdCAubGlzdD4uaXRlbSwudWkuaG9yaXpvbnRhbC5jZWxsZWQubGlzdD4uaXRlbXtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46MDtwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0Oi41ZW07bGluZS1oZWlnaHQ6LjZ9LnVpLmhvcml6b250YWwuY2VsbGVkLmxpc3QgLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZCwudWkuaG9yaXpvbnRhbC5jZWxsZWQubGlzdD4uaXRlbTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuY2VsbGVkLmludmVydGVkLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5pbnZlcnRlZC5saXN0Pi5saXN0e2JvcmRlci1jb2xvcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLmNlbGxlZC5pbnZlcnRlZC5ob3Jpem9udGFsLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5pbnZlcnRlZC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Ym9yZGVyLWNvbG9yOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkucmVsYXhlZC5saXN0Om5vdCguaG9yaXpvbnRhbCk+Lml0ZW06bm90KDpmaXJzdC1jaGlsZCl7cGFkZGluZy10b3A6LjQyODU3MTQzZW19LnVpLnJlbGF4ZWQubGlzdDpub3QoLmhvcml6b250YWwpPi5pdGVtOm5vdCg6bGFzdC1jaGlsZCl7cGFkZGluZy1ib3R0b206LjQyODU3MTQzZW19LnVpLmhvcml6b250YWwucmVsYXhlZC5saXN0IC5saXN0Pi5pdGVtOm5vdCg6Zmlyc3QtY2hpbGQpLC51aS5ob3Jpem9udGFsLnJlbGF4ZWQubGlzdD4uaXRlbTpub3QoOmZpcnN0LWNoaWxkKXtwYWRkaW5nLWxlZnQ6MXJlbX0udWkuaG9yaXpvbnRhbC5yZWxheGVkLmxpc3QgLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKSwudWkuaG9yaXpvbnRhbC5yZWxheGVkLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKXtwYWRkaW5nLXJpZ2h0OjFyZW19LnVpW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0ubGlzdDpub3QoLmhvcml6b250YWwpPi5pdGVtOm5vdCg6Zmlyc3QtY2hpbGQpe3BhZGRpbmctdG9wOi44NTcxNDI4NmVtfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3Q6bm90KC5ob3Jpem9udGFsKT4uaXRlbTpub3QoOmxhc3QtY2hpbGQpe3BhZGRpbmctYm90dG9tOi44NTcxNDI4NmVtfS51aS5ob3Jpem9udGFsW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0ubGlzdCAubGlzdD4uaXRlbTpub3QoOmZpcnN0LWNoaWxkKSwudWkuaG9yaXpvbnRhbFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3Q+Lml0ZW06bm90KDpmaXJzdC1jaGlsZCl7cGFkZGluZy1sZWZ0OjEuNXJlbX0udWkuaG9yaXpvbnRhbFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3QgLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKSwudWkuaG9yaXpvbnRhbFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKXtwYWRkaW5nLXJpZ2h0OjEuNXJlbX0udWkubWluaS5saXN0e2ZvbnQtc2l6ZTouNzg1NzE0MjllbX0udWkudGlueS5saXN0e2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkuc21hbGwubGlzdHtmb250LXNpemU6LjkyODU3MTQzZW19LnVpLmxpc3R7Zm9udC1zaXplOjFlbX0udWkubGFyZ2UubGlzdHtmb250LXNpemU6MS4xNDI4NTcxNGVtfS51aS5iaWcubGlzdHtmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5odWdlLmxpc3R7Zm9udC1zaXplOjEuNDI4NTcxNDNlbX0udWkubWFzc2l2ZS5saXN0e2ZvbnQtc2l6ZToxLjcxNDI4NTcxZW19LnVpLm1pbmkuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5taW5pLmhvcml6b250YWwubGlzdD4uaXRlbXtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55Lmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbSwudWkudGlueS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5zbWFsbC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbSwudWkubGFyZ2UuaG9yaXpvbnRhbC5saXN0Pi5pdGVte2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5iaWcuaG9yaXpvbnRhbC5saXN0Pi5pdGVte2ZvbnQtc2l6ZToxLjI4NTcxNDI5cmVtfS51aS5odWdlLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbSwudWkuaHVnZS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLm1hc3NpdmUuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5tYXNzaXZlLmhvcml6b250YWwubGlzdD4uaXRlbXtmb250LXNpemU6MS43MTQyODU3MXJlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTG9hZGVyXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubG9hZGVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjowO3RleHQtYWxpZ246Y2VudGVyO3otaW5kZXg6MTAwMDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKX0udWkubG9hZGVyOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDowO2xlZnQ6NTAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMSl9LnVpLmxvYWRlcjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDowO2xlZnQ6NTAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7LXdlYmtpdC1hbmltYXRpb246bG9hZGVyIC42cyBsaW5lYXI7YW5pbWF0aW9uOmxvYWRlciAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50fUAtd2Via2l0LWtleWZyYW1lcyBsb2FkZXJ7ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbG9hZGVye2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0udWkubWluaS5sb2FkZXI6YWZ0ZXIsLnVpLm1pbmkubG9hZGVyOmJlZm9yZXt3aWR0aDoxcmVtO2hlaWdodDoxcmVtO21hcmdpbjowIDAgMCAtLjVyZW19LnVpLnRpbnkubG9hZGVyOmFmdGVyLC51aS50aW55LmxvYWRlcjpiZWZvcmV7d2lkdGg6MS4xNDI4NTcxNHJlbTtoZWlnaHQ6MS4xNDI4NTcxNHJlbTttYXJnaW46MCAwIDAgLS41NzE0Mjg1N3JlbX0udWkuc21hbGwubG9hZGVyOmFmdGVyLC51aS5zbWFsbC5sb2FkZXI6YmVmb3Jle3dpZHRoOjEuNzE0Mjg1NzFyZW07aGVpZ2h0OjEuNzE0Mjg1NzFyZW07bWFyZ2luOjAgMCAwIC0uODU3MTQyODZyZW19LnVpLmxvYWRlcjphZnRlciwudWkubG9hZGVyOmJlZm9yZXt3aWR0aDoyLjI4NTcxNDI5cmVtO2hlaWdodDoyLjI4NTcxNDI5cmVtO21hcmdpbjowIDAgMCAtMS4xNDI4NTcxNHJlbX0udWkubGFyZ2UubG9hZGVyOmFmdGVyLC51aS5sYXJnZS5sb2FkZXI6YmVmb3Jle3dpZHRoOjMuNDI4NTcxNDNyZW07aGVpZ2h0OjMuNDI4NTcxNDNyZW07bWFyZ2luOjAgMCAwIC0xLjcxNDI4NTcxcmVtfS51aS5iaWcubG9hZGVyOmFmdGVyLC51aS5iaWcubG9hZGVyOmJlZm9yZXt3aWR0aDozLjcxNDI4NTcxcmVtO2hlaWdodDozLjcxNDI4NTcxcmVtO21hcmdpbjowIDAgMCAtMS44NTcxNDI4NnJlbX0udWkuaHVnZS5sb2FkZXI6YWZ0ZXIsLnVpLmh1Z2UubG9hZGVyOmJlZm9yZXt3aWR0aDo0LjE0Mjg1NzE0cmVtO2hlaWdodDo0LjE0Mjg1NzE0cmVtO21hcmdpbjowIDAgMCAtMi4wNzE0Mjg1N3JlbX0udWkubWFzc2l2ZS5sb2FkZXI6YWZ0ZXIsLnVpLm1hc3NpdmUubG9hZGVyOmJlZm9yZXt3aWR0aDo0LjU3MTQyODU3cmVtO2hlaWdodDo0LjU3MTQyODU3cmVtO21hcmdpbjowIDAgMCAtMi4yODU3MTQyOXJlbX0udWkuZGltbWVyIC5sb2FkZXJ7ZGlzcGxheTpibG9ja30udWkuZGltbWVyIC51aS5sb2FkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmRpbW1lciAudWkubG9hZGVyOmJlZm9yZXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpfS51aS5kaW1tZXIgLnVpLmxvYWRlcjphZnRlcntib3JkZXItY29sb3I6I2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5sb2FkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmxvYWRlcjpiZWZvcmV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmxvYWRlcjphZnRlcntib3JkZXItY29sb3I6Izc2NzY3NiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0udWkudGV4dC5sb2FkZXJ7d2lkdGg6YXV0byFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8haW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc3R5bGU6bm9ybWFsfS51aS5pbmRldGVybWluYXRlLmxvYWRlcjphZnRlcnthbmltYXRpb24tZGlyZWN0aW9uOnJldmVyc2U7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MS4yczthbmltYXRpb24tZHVyYXRpb246MS4yc30udWkubG9hZGVyLmFjdGl2ZSwudWkubG9hZGVyLnZpc2libGV7ZGlzcGxheTpibG9ja30udWkubG9hZGVyLmRpc2FibGVkLC51aS5sb2FkZXIuaGlkZGVue2Rpc3BsYXk6bm9uZX0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5taW5pLmxvYWRlciwudWkubWluaS5sb2FkZXJ7d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTtmb250LXNpemU6Ljc4NTcxNDI5ZW19LnVpLmludmVydGVkLmRpbW1lciAudWkudGlueS5sb2FkZXIsLnVpLnRpbnkubG9hZGVye3dpZHRoOjEuMTQyODU3MTRyZW07aGVpZ2h0OjEuMTQyODU3MTRyZW07Zm9udC1zaXplOi44NTcxNDI4NmVtfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLnNtYWxsLmxvYWRlciwudWkuc21hbGwubG9hZGVye3dpZHRoOjEuNzE0Mjg1NzFyZW07aGVpZ2h0OjEuNzE0Mjg1NzFyZW07Zm9udC1zaXplOi45Mjg1NzE0M2VtfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmxvYWRlciwudWkubG9hZGVye3dpZHRoOjIuMjg1NzE0MjlyZW07aGVpZ2h0OjIuMjg1NzE0MjlyZW07Zm9udC1zaXplOjFlbX0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5sYXJnZS5sb2FkZXIsLnVpLmxhcmdlLmxvYWRlcnt3aWR0aDozLjQyODU3MTQzcmVtO2hlaWdodDozLjQyODU3MTQzcmVtO2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW19LnVpLmJpZy5sb2FkZXIsLnVpLmludmVydGVkLmRpbW1lciAudWkuYmlnLmxvYWRlcnt3aWR0aDozLjcxNDI4NTcxcmVtO2hlaWdodDozLjcxNDI4NTcxcmVtO2ZvbnQtc2l6ZToxLjI4NTcxNDI5ZW19LnVpLmh1Z2UubG9hZGVyLC51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmh1Z2UubG9hZGVye3dpZHRoOjQuMTQyODU3MTRyZW07aGVpZ2h0OjQuMTQyODU3MTRyZW07Zm9udC1zaXplOjEuNDI4NTcxNDNlbX0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5tYXNzaXZlLmxvYWRlciwudWkubWFzc2l2ZS5sb2FkZXJ7d2lkdGg6NC41NzE0Mjg1N3JlbTtoZWlnaHQ6NC41NzE0Mjg1N3JlbTtmb250LXNpemU6MS43MTQyODU3MWVtfS51aS5taW5pLnRleHQubG9hZGVye21pbi13aWR0aDoxcmVtO3BhZGRpbmctdG9wOjEuNzg1NzE0MjlyZW19LnVpLnRpbnkudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjEuMTQyODU3MTRyZW07cGFkZGluZy10b3A6MS45Mjg1NzE0M3JlbX0udWkuc21hbGwudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjEuNzE0Mjg1NzFyZW07cGFkZGluZy10b3A6Mi41cmVtfS51aS50ZXh0LmxvYWRlcnttaW4td2lkdGg6Mi4yODU3MTQyOXJlbTtwYWRkaW5nLXRvcDozLjA3MTQyODU3cmVtfS51aS5sYXJnZS50ZXh0LmxvYWRlcnttaW4td2lkdGg6My40Mjg1NzE0M3JlbTtwYWRkaW5nLXRvcDo0LjIxNDI4NTcxcmVtfS51aS5iaWcudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjMuNzE0Mjg1NzFyZW07cGFkZGluZy10b3A6NC41cmVtfS51aS5odWdlLnRleHQubG9hZGVye21pbi13aWR0aDo0LjE0Mjg1NzE0cmVtO3BhZGRpbmctdG9wOjQuOTI4NTcxNDNyZW19LnVpLm1hc3NpdmUudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjQuNTcxNDI4NTdyZW07cGFkZGluZy10b3A6NS4zNTcxNDI4NnJlbX0udWkuaW52ZXJ0ZWQubG9hZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5pbnZlcnRlZC5sb2FkZXI6YmVmb3Jle2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9LnVpLmludmVydGVkLmxvYWRlcjphZnRlcntib3JkZXItdG9wLWNvbG9yOiNmZmZ9LnVpLmlubGluZS5sb2FkZXJ7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbjowO2xlZnQ6MDt0b3A6MDstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfS51aS5pbmxpbmUubG9hZGVyLmFjdGl2ZSwudWkuaW5saW5lLmxvYWRlci52aXNpYmxle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5jZW50ZXJlZC5pbmxpbmUubG9hZGVyLmFjdGl2ZSwudWkuY2VudGVyZWQuaW5saW5lLmxvYWRlci52aXNpYmxle2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0b30vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTG9hZGVyXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkucGxhY2Vob2xkZXJ7cG9zaXRpb246c3RhdGljO292ZXJmbG93OmhpZGRlbjstd2Via2l0LWFuaW1hdGlvbjpwbGFjZWhvbGRlclNoaW1tZXIgMnMgbGluZWFyO2FuaW1hdGlvbjpwbGFjZWhvbGRlclNoaW1tZXIgMnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IHRvcCxmcm9tKHJnYmEoMCwwLDAsLjA4KSksY29sb3Itc3RvcCgxNSUscmdiYSgwLDAsMCwuMTUpKSxjb2xvci1zdG9wKDMwJSxyZ2JhKDAsMCwwLC4wOCkpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQscmdiYSgwLDAsMCwuMDgpIDAscmdiYSgwLDAsMCwuMTUpIDE1JSxyZ2JhKDAsMCwwLC4wOCkgMzAlKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLCByaWdodCB0b3AsY29sb3Itc3RvcCgwLCByZ2JhKDAsMCwwLC4wOCkpLGNvbG9yLXN0b3AoMTUlLCByZ2JhKDAsMCwwLC4xNSkpLGNvbG9yLXN0b3AoMzAlLCByZ2JhKDAsMCwwLC4wOCkpKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wOCkgMCxyZ2JhKDAsMCwwLC4xNSkgMTUlLHJnYmEoMCwwLDAsLjA4KSAzMCUpO2JhY2tncm91bmQtc2l6ZToxMjAwcHggMTAwJTttYXgtd2lkdGg6MzByZW19QC13ZWJraXQta2V5ZnJhbWVzIHBsYWNlaG9sZGVyU2hpbW1lcnswJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjAwcHggMH0xMDAle2JhY2tncm91bmQtcG9zaXRpb246MTIwMHB4IDB9fUBrZXlmcmFtZXMgcGxhY2Vob2xkZXJTaGltbWVyezAle2JhY2tncm91bmQtcG9zaXRpb246LTEyMDBweCAwfTEwMCV7YmFja2dyb3VuZC1wb3NpdGlvbjoxMjAwcHggMH19LnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcnttYXJnaW4tdG9wOjJyZW19LnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcnstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouMTVzO2FuaW1hdGlvbi1kZWxheTouMTVzfS51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXIrLnVpLnBsYWNlaG9sZGVyey13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi4zczthbmltYXRpb24tZGVsYXk6LjNzfS51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXIrLnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcnstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouNDVzO2FuaW1hdGlvbi1kZWxheTouNDVzfS51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXIrLnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXJ7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LjZzO2FuaW1hdGlvbi1kZWxheTouNnN9LnVpLnBsYWNlaG9sZGVyLC51aS5wbGFjZWhvbGRlciAuaW1hZ2UuaGVhZGVyOmFmdGVyLC51aS5wbGFjZWhvbGRlciAubGluZSwudWkucGxhY2Vob2xkZXIgLmxpbmU6YWZ0ZXIsLnVpLnBsYWNlaG9sZGVyPjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS51aS5wbGFjZWhvbGRlciAuaW1hZ2U6bm90KC5oZWFkZXIpOm5vdCgudWkpe2hlaWdodDoxMDBweH0udWkucGxhY2Vob2xkZXIgLnNxdWFyZS5pbWFnZTpub3QoLmhlYWRlcil7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmctdG9wOjEwMCV9LnVpLnBsYWNlaG9sZGVyIC5yZWN0YW5ndWxhci5pbWFnZTpub3QoLmhlYWRlcil7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmctdG9wOjc1JX0udWkucGxhY2Vob2xkZXIgLmxpbmV7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0Oi44NTcxNDI4NmVtfS51aS5wbGFjZWhvbGRlciAubGluZTphZnRlciwudWkucGxhY2Vob2xkZXIgLmxpbmU6YmVmb3Jle3RvcDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0fS51aS5wbGFjZWhvbGRlciAubGluZTpiZWZvcmV7bGVmdDowfS51aS5wbGFjZWhvbGRlciAubGluZTphZnRlcntyaWdodDowfS51aS5wbGFjZWhvbGRlciAubGluZXttYXJnaW4tYm90dG9tOi41ZW19LnVpLnBsYWNlaG9sZGVyIC5saW5lOmFmdGVyLC51aS5wbGFjZWhvbGRlciAubGluZTpiZWZvcmV7aGVpZ2h0Oi41ZW19LnVpLnBsYWNlaG9sZGVyIC5saW5lOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi10b3A6LjVlbX0udWkucGxhY2Vob2xkZXIgLmhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW59LnVpLnBsYWNlaG9sZGVyIC5saW5lOm50aC1jaGlsZCgxKTphZnRlcnt3aWR0aDowJX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDIpOmFmdGVye3dpZHRoOjUwJX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDMpOmFmdGVye3dpZHRoOjEwJX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDQpOmFmdGVye3dpZHRoOjM1JX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDUpOmFmdGVye3dpZHRoOjY1JX0udWkucGxhY2Vob2xkZXIgLmhlYWRlciAubGluZXttYXJnaW4tYm90dG9tOi42NDI4NTcxNGVtfS51aS5wbGFjZWhvbGRlciAuaGVhZGVyIC5saW5lOmFmdGVyLC51aS5wbGFjZWhvbGRlciAuaGVhZGVyIC5saW5lOmJlZm9yZXtoZWlnaHQ6LjY0Mjg1NzE0ZW19LnVpLnBsYWNlaG9sZGVyIC5oZWFkZXIgLmxpbmU6bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLXRvcDouNjQyODU3MTRlbX0udWkucGxhY2Vob2xkZXIgLmhlYWRlciAubGluZTphZnRlcnt3aWR0aDoyMCV9LnVpLnBsYWNlaG9sZGVyIC5oZWFkZXIgLmxpbmU6bnRoLWNoaWxkKDIpOmFmdGVye3dpZHRoOjYwJX0udWkucGxhY2Vob2xkZXIgLmltYWdlLmhlYWRlciAubGluZXttYXJnaW4tbGVmdDozZW19LnVpLnBsYWNlaG9sZGVyIC5pbWFnZS5oZWFkZXIgLmxpbmU6YmVmb3Jle3dpZHRoOi43MTQyODU3MXJlbX0udWkucGxhY2Vob2xkZXIgLmltYWdlLmhlYWRlcjphZnRlcntkaXNwbGF5OmJsb2NrO2hlaWdodDouODU3MTQyODZlbTtjb250ZW50OicnO21hcmdpbi1sZWZ0OjNlbX0udWkucGxhY2Vob2xkZXIgLmhlYWRlciAubGluZTpmaXJzdC1jaGlsZCwudWkucGxhY2Vob2xkZXIgLmltYWdlIC5saW5lOmZpcnN0LWNoaWxkLC51aS5wbGFjZWhvbGRlciAucGFyYWdyYXBoIC5saW5lOmZpcnN0LWNoaWxke2hlaWdodDouMDFweH0udWkucGxhY2Vob2xkZXIgLmhlYWRlcjpub3QoOmZpcnN0LWNoaWxkKTpiZWZvcmUsLnVpLnBsYWNlaG9sZGVyIC5pbWFnZTpub3QoOmZpcnN0LWNoaWxkKTpiZWZvcmUsLnVpLnBsYWNlaG9sZGVyIC5wYXJhZ3JhcGg6bm90KDpmaXJzdC1jaGlsZCk6YmVmb3Jle2hlaWdodDoxLjQyODU3MTQzZW07Y29udGVudDonJztkaXNwbGF5OmJsb2NrfS51aS5pbnZlcnRlZC5wbGFjZWhvbGRlcntiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IHRvcCxmcm9tKHJnYmEoMjU1LDI1NSwyNTUsLjA4KSksY29sb3Itc3RvcCgxNSUscmdiYSgyNTUsMjU1LDI1NSwuMTQpKSxjb2xvci1zdG9wKDMwJSxyZ2JhKDI1NSwyNTUsMjU1LC4wOCkpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQscmdiYSgyNTUsMjU1LDI1NSwuMDgpIDAscmdiYSgyNTUsMjU1LDI1NSwuMTQpIDE1JSxyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgMzAlKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLCByaWdodCB0b3AsY29sb3Itc3RvcCgwLCByZ2JhKDI1NSwyNTUsMjU1LC4wOCkpLGNvbG9yLXN0b3AoMTUlLCByZ2JhKDI1NSwyNTUsMjU1LC4xNCkpLGNvbG9yLXN0b3AoMzAlLCByZ2JhKDI1NSwyNTUsMjU1LC4wOCkpKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgMCxyZ2JhKDI1NSwyNTUsMjU1LC4xNCkgMTUlLHJnYmEoMjU1LDI1NSwyNTUsLjA4KSAzMCUpfS51aS5pbnZlcnRlZC5wbGFjZWhvbGRlciwudWkuaW52ZXJ0ZWQucGxhY2Vob2xkZXIgLmltYWdlLmhlYWRlcjphZnRlciwudWkuaW52ZXJ0ZWQucGxhY2Vob2xkZXIgLmxpbmUsLnVpLmludmVydGVkLnBsYWNlaG9sZGVyIC5saW5lOmFmdGVyLC51aS5pbnZlcnRlZC5wbGFjZWhvbGRlcj46YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzFiMWMxZH0udWkucGxhY2Vob2xkZXIgLmZ1bGwubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6MCV9LnVpLnBsYWNlaG9sZGVyIC52ZXJ5LmxvbmcubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6MTAlfS51aS5wbGFjZWhvbGRlciAubG9uZy5saW5lLmxpbmUubGluZTphZnRlcnt3aWR0aDozNSV9LnVpLnBsYWNlaG9sZGVyIC5tZWRpdW0ubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6NTAlfS51aS5wbGFjZWhvbGRlciAuc2hvcnQubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6NjUlfS51aS5wbGFjZWhvbGRlciAudmVyeS5zaG9ydC5saW5lLmxpbmUubGluZTphZnRlcnt3aWR0aDo4MCV9LnVpLmZsdWlkLnBsYWNlaG9sZGVye21heC13aWR0aDpub25lfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBSYWlsXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkucmFpbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt3aWR0aDozMDBweDtoZWlnaHQ6MTAwJX0udWkubGVmdC5yYWlse2xlZnQ6YXV0bztyaWdodDoxMDAlO3BhZGRpbmc6MCAycmVtIDAgMDttYXJnaW46MCAycmVtIDAgMH0udWkucmlnaHQucmFpbHtsZWZ0OjEwMCU7cmlnaHQ6YXV0bztwYWRkaW5nOjAgMCAwIDJyZW07bWFyZ2luOjAgMCAwIDJyZW19LnVpLmxlZnQuaW50ZXJuYWwucmFpbHtsZWZ0OjA7cmlnaHQ6YXV0bztwYWRkaW5nOjAgMCAwIDJyZW07bWFyZ2luOjAgMCAwIDJyZW19LnVpLnJpZ2h0LmludGVybmFsLnJhaWx7bGVmdDphdXRvO3JpZ2h0OjA7cGFkZGluZzowIDJyZW0gMCAwO21hcmdpbjowIDJyZW0gMCAwfS51aS5kaXZpZGluZy5yYWlse3dpZHRoOjMwMi41cHh9LnVpLmxlZnQuZGl2aWRpbmcucmFpbHtwYWRkaW5nOjAgMi41cmVtIDAgMDttYXJnaW46MCAyLjVyZW0gMCAwO2JvcmRlci1yaWdodDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5yaWdodC5kaXZpZGluZy5yYWlse2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7cGFkZGluZzowIDAgMCAyLjVyZW07bWFyZ2luOjAgMCAwIDIuNXJlbX0udWkuY2xvc2UucmFpbHt3aWR0aDpjYWxjKDMwMHB4ICsgMWVtKX0udWkuY2xvc2UubGVmdC5yYWlse3BhZGRpbmc6MCAxZW0gMCAwO21hcmdpbjowIDFlbSAwIDB9LnVpLmNsb3NlLnJpZ2h0LnJhaWx7cGFkZGluZzowIDAgMCAxZW07bWFyZ2luOjAgMCAwIDFlbX0udWkudmVyeS5jbG9zZS5yYWlse3dpZHRoOmNhbGMoMzAwcHggKyAuNWVtKX0udWkudmVyeS5jbG9zZS5sZWZ0LnJhaWx7cGFkZGluZzowIC41ZW0gMCAwO21hcmdpbjowIC41ZW0gMCAwfS51aS52ZXJ5LmNsb3NlLnJpZ2h0LnJhaWx7cGFkZGluZzowIDAgMCAuNWVtO21hcmdpbjowIDAgMCAuNWVtfS51aS5hdHRhY2hlZC5sZWZ0LnJhaWwsLnVpLmF0dGFjaGVkLnJpZ2h0LnJhaWx7cGFkZGluZzowO21hcmdpbjowfS51aS5taW5pLnJhaWx7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5yYWlse2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLnJhaWx7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkucmFpbHtmb250LXNpemU6MXJlbX0udWkubGFyZ2UucmFpbHtmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuYmlnLnJhaWx7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmh1Z2UucmFpbHtmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5yYWlse2ZvbnQtc2l6ZToxLjcxNDI4NTcxcmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBSZXZlYWxcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5yZXZlYWx7ZGlzcGxheTppbmhlcml0O3Bvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudDtmb250LXNpemU6MCFpbXBvcnRhbnR9LnVpLnJldmVhbD4udmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlIWltcG9ydGFudDt0b3A6MCFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDt6LWluZGV4OjMhaW1wb3J0YW50Oy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjVzIGVhc2UgLjFzO3RyYW5zaXRpb246YWxsIC41cyBlYXNlIC4xc30udWkucmV2ZWFsPi5oaWRkZW4uY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZSFpbXBvcnRhbnQ7ei1pbmRleDoyIWltcG9ydGFudH0udWkuYWN0aXZlLnJldmVhbCAudmlzaWJsZS5jb250ZW50LC51aS5yZXZlYWw6aG92ZXIgLnZpc2libGUuY29udGVudHt6LWluZGV4OjQhaW1wb3J0YW50fS51aS5zbGlkZS5yZXZlYWx7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwfS51aS5zbGlkZS5yZXZlYWw+LmNvbnRlbnR7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vcm1hbDtmbG9hdDpsZWZ0O21hcmdpbjowOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZSAuMXM7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZSAuMXM7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UgLjFzO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlIC4xcywgLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2UgLjFzO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlIC4xcywtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZSAuMXN9LnVpLnNsaWRlLnJldmVhbD4udmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudH0udWkuc2xpZGUucmV2ZWFsPi5oaWRkZW4uY29udGVudHtwb3NpdGlvbjphYnNvbHV0ZSFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDt3aWR0aDoxMDAlIWltcG9ydGFudDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpIWltcG9ydGFudDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKSFpbXBvcnRhbnR9LnVpLnNsaWRlLmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkuc2xpZGUucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKSFpbXBvcnRhbnR9LnVpLnNsaWRlLmFjdGl2ZS5yZXZlYWw+LmhpZGRlbi5jb250ZW50LC51aS5zbGlkZS5yZXZlYWw6aG92ZXI+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIWltcG9ydGFudH0udWkuc2xpZGUucmlnaHQucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkhaW1wb3J0YW50fS51aS5zbGlkZS5yaWdodC5yZXZlYWw+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpIWltcG9ydGFudDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSkhaW1wb3J0YW50fS51aS5zbGlkZS5yaWdodC5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLnNsaWRlLnJpZ2h0LnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUucmlnaHQuYWN0aXZlLnJldmVhbD4uaGlkZGVuLmNvbnRlbnQsLnVpLnNsaWRlLnJpZ2h0LnJldmVhbDpob3Zlcj4uaGlkZGVuLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkhaW1wb3J0YW50fS51aS5zbGlkZS51cC5yZXZlYWw+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUudXAuYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5zbGlkZS51cC5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUudXAuYWN0aXZlLnJldmVhbD4uaGlkZGVuLmNvbnRlbnQsLnVpLnNsaWRlLnVwLnJldmVhbDpob3Zlcj4uaGlkZGVuLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkhaW1wb3J0YW50fS51aS5zbGlkZS5kb3duLnJldmVhbD4uaGlkZGVuLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKSFpbXBvcnRhbnR9LnVpLnNsaWRlLmRvd24uYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5zbGlkZS5kb3duLnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUuZG93bi5hY3RpdmUucmV2ZWFsPi5oaWRkZW4uY29udGVudCwudWkuc2xpZGUuZG93bi5yZXZlYWw6aG92ZXI+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIWltcG9ydGFudH0udWkuZmFkZS5yZXZlYWw+LnZpc2libGUuY29udGVudHtvcGFjaXR5OjF9LnVpLmZhZGUuYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5mYWRlLnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50e29wYWNpdHk6MH0udWkubW92ZS5yZXZlYWx7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwfS51aS5tb3ZlLnJldmVhbD4uY29udGVudHtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7d2hpdGUtc3BhY2U6bm9ybWFsO21hcmdpbjowOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgY3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSkgLjFzO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpIC4xczt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgY3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSkgLjFzO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKSAuMXMsIC13ZWJraXQtdHJhbnNmb3JtIC41cyBjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKSAuMXM7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpIC4xcywtd2Via2l0LXRyYW5zZm9ybSAuNXMgY3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSkgLjFzfS51aS5tb3ZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudH0udWkubW92ZS5yZXZlYWw+LmhpZGRlbi5jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlIWltcG9ydGFudDtsZWZ0OjAhaW1wb3J0YW50O3dpZHRoOjEwMCUhaW1wb3J0YW50fS51aS5tb3ZlLmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkubW92ZS5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpIWltcG9ydGFudH0udWkubW92ZS5yaWdodC5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLm1vdmUucmlnaHQucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSkhaW1wb3J0YW50fS51aS5tb3ZlLnVwLmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkubW92ZS51cC5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpIWltcG9ydGFudH0udWkubW92ZS5kb3duLmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkubW92ZS5kb3duLnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpIWltcG9ydGFudH0udWkucm90YXRlLnJldmVhbD4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjouNXM7dHJhbnNpdGlvbi1kdXJhdGlvbjouNXM7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9LnVpLnJvdGF0ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkucm90YXRlLnJpZ2h0LnJldmVhbD4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpib3R0b20gcmlnaHQ7dHJhbnNmb3JtLW9yaWdpbjpib3R0b20gcmlnaHR9LnVpLnJvdGF0ZS5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLnJvdGF0ZS5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudCwudWkucm90YXRlLnJpZ2h0LmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkucm90YXRlLnJpZ2h0LnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxMTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTEwZGVnKX0udWkucm90YXRlLmxlZnQucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmJvdHRvbSBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGxlZnR9LnVpLnJvdGF0ZS5sZWZ0LmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkucm90YXRlLmxlZnQucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xMTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTExMGRlZyl9LnVpLmRpc2FibGVkLnJldmVhbDpob3Zlcj4udmlzaWJsZS52aXNpYmxlLmNvbnRlbnR7cG9zaXRpb246c3RhdGljIWltcG9ydGFudDtkaXNwbGF5OmJsb2NrIWltcG9ydGFudDtvcGFjaXR5OjEhaW1wb3J0YW50O3RvcDowIWltcG9ydGFudDtsZWZ0OjAhaW1wb3J0YW50O3JpZ2h0OmF1dG8haW1wb3J0YW50O2JvdHRvbTphdXRvIWltcG9ydGFudDstd2Via2l0LXRyYW5zZm9ybTpub25lIWltcG9ydGFudDt0cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnR9LnVpLmRpc2FibGVkLnJldmVhbDpob3Zlcj4uaGlkZGVuLmhpZGRlbi5jb250ZW50e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLnJldmVhbD4udWkucmliYm9uLmxhYmVse3otaW5kZXg6NX0udWkudmlzaWJsZS5yZXZlYWx7b3ZlcmZsb3c6dmlzaWJsZX0udWkuaW5zdGFudC5yZXZlYWw+LmNvbnRlbnR7LXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OjBzIWltcG9ydGFudDt0cmFuc2l0aW9uLWRlbGF5OjBzIWltcG9ydGFudH0udWkucmV2ZWFsPi5jb250ZW50e2ZvbnQtc2l6ZToxcmVtIWltcG9ydGFudH0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gU2VnbWVudFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnNlZ21lbnR7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7bWFyZ2luOjFyZW0gMDtwYWRkaW5nOjFlbSAxZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnNlZ21lbnQ6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5zZWdtZW50Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS52ZXJ0aWNhbC5zZWdtZW50e21hcmdpbjowO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MDtiYWNrZ3JvdW5kOm5vbmUgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6bm9uZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnZlcnRpY2FsLnNlZ21lbnQ6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOm5vbmV9LnVpLmludmVydGVkLnNlZ21lbnQ+LnVpLmhlYWRlcntjb2xvcjojZmZmfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLnNlZ21lbnQ+W2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl0ubGFiZWx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjB9LnVpW2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl0uc2VnbWVudD5bY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS5sYWJlbHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0udWkuYXR0YWNoZWQuc2VnbWVudDpub3QoLnRvcCk6bm90KC5ib3R0b20pPltjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLmxhYmVse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS51aS5hdHRhY2hlZC5zZWdtZW50Om5vdCgudG9wKTpub3QoLmJvdHRvbSk+W2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl0ubGFiZWx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLmdyaWQ+LnJvdz4udWkuc2VnbWVudC5jb2x1bW4sLnVpLmdyaWQ+LnVpLnNlZ21lbnQuY29sdW1uLC51aS5wYWdlLmdyaWQuc2VnbWVudHtwYWRkaW5nLXRvcDoyZW07cGFkZGluZy1ib3R0b206MmVtfS51aS5ncmlkLnNlZ21lbnR7bWFyZ2luOjFyZW0gMDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuYmFzaWMudGFibGUuc2VnbWVudHtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGUuc2VnbWVudHtwYWRkaW5nOjFlbSAxZW19LnVpLnBsYWNlaG9sZGVyLnNlZ21lbnR7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOnN0cmV0Y2g7bWF4LXdpZHRoOm5vbmU7bWF4LXdpZHRoOmluaXRpYWw7LXdlYmtpdC1hbmltYXRpb246bm9uZTthbmltYXRpb246bm9uZTtvdmVyZmxvdzp2aXNpYmxlO3BhZGRpbmc6MWVtIDFlbTttaW4taGVpZ2h0OjE4cmVtO2JhY2tncm91bmQ6I2Y5ZmFmYjtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzowIDJweCAyNXB4IDAgcmdiYSgzNCwzNiwzOCwuMDUpIGluc2V0O2JveC1zaGFkb3c6MCAycHggMjVweCAwIHJnYmEoMzQsMzYsMzgsLjA1KSBpbnNldH0udWkucGxhY2Vob2xkZXIuc2VnbWVudCAuYnV0dG9uLC51aS5wbGFjZWhvbGRlci5zZWdtZW50IHRleHRhcmVhe2Rpc3BsYXk6YmxvY2t9LnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQgLmJ1dHRvbiwudWkucGxhY2Vob2xkZXIuc2VnbWVudCAuZmllbGQsLnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQgdGV4dGFyZWEsLnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQ+LnVpLmlucHV0e21heC13aWR0aDoxNXJlbTttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS51aS5wbGFjZWhvbGRlci5zZWdtZW50IC5jb2x1bW4gLmJ1dHRvbiwudWkucGxhY2Vob2xkZXIuc2VnbWVudCAuY29sdW1uIC5maWVsZCwudWkucGxhY2Vob2xkZXIuc2VnbWVudCAuY29sdW1uIHRleHRhcmVhLC51aS5wbGFjZWhvbGRlci5zZWdtZW50IC5jb2x1bW4+LnVpLmlucHV0e21heC13aWR0aDoxNXJlbTttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS51aS5wbGFjZWhvbGRlci5zZWdtZW50Pi5pbmxpbmV7YWxpZ24tc2VsZjpjZW50ZXJ9LnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQ+LmlubGluZT4uYnV0dG9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87bWFyZ2luOjAgLjM1NzE0Mjg2cmVtIDAgMH0udWkucGxhY2Vob2xkZXIuc2VnbWVudD4uaW5saW5lPi5idXR0b246bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udWkucGlsZWQuc2VnbWVudCwudWkucGlsZWQuc2VnbWVudHN7bWFyZ2luOjNlbSAwOy13ZWJraXQtYm94LXNoYWRvdzonJztib3gtc2hhZG93OicnO3otaW5kZXg6YXV0b30udWkucGlsZWQuc2VnbWVudDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnBpbGVkLnNlZ21lbnQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnBpbGVkLnNlZ21lbnQ6YWZ0ZXIsLnVpLnBpbGVkLnNlZ21lbnQ6YmVmb3JlLC51aS5waWxlZC5zZWdtZW50czphZnRlciwudWkucGlsZWQuc2VnbWVudHM6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2ZmZjt2aXNpYmlsaXR5OnZpc2libGU7Y29udGVudDonJztkaXNwbGF5OmJsb2NrO2hlaWdodDoxMDAlO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzonJztib3gtc2hhZG93OicnfS51aS5waWxlZC5zZWdtZW50OmJlZm9yZSwudWkucGlsZWQuc2VnbWVudHM6YmVmb3Jley13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtMS4yZGVnKTt0cmFuc2Zvcm06cm90YXRlKC0xLjJkZWcpO3RvcDowO3otaW5kZXg6LTJ9LnVpLnBpbGVkLnNlZ21lbnQ6YWZ0ZXIsLnVpLnBpbGVkLnNlZ21lbnRzOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxLjJkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMS4yZGVnKTt0b3A6MDt6LWluZGV4Oi0xfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLnBpbGVkLnNlZ21lbnR7bWFyZ2luLXRvcDozZW07bWFyZ2luLWJvdHRvbTowfS51aS5waWxlZC5zZWdtZW50W2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl06Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5waWxlZC5zZWdtZW50W2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl17bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206M2VtfS51aS5waWxlZC5zZWdtZW50W2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnN0YWNrZWQuc2VnbWVudHtwYWRkaW5nLWJvdHRvbToxLjRlbX0udWkuc3RhY2tlZC5zZWdtZW50OmFmdGVyLC51aS5zdGFja2VkLnNlZ21lbnQ6YmVmb3JlLC51aS5zdGFja2VkLnNlZ21lbnRzOmFmdGVyLC51aS5zdGFja2VkLnNlZ21lbnRzOmJlZm9yZXtjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTotM3B4O2xlZnQ6MDtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMyk7d2lkdGg6MTAwJTtoZWlnaHQ6NnB4O3Zpc2liaWxpdHk6dmlzaWJsZX0udWkuc3RhY2tlZC5zZWdtZW50OmJlZm9yZSwudWkuc3RhY2tlZC5zZWdtZW50czpiZWZvcmV7ZGlzcGxheTpub25lfS51aS50YWxsLnN0YWNrZWQuc2VnbWVudDpiZWZvcmUsLnVpLnRhbGwuc3RhY2tlZC5zZWdtZW50czpiZWZvcmV7ZGlzcGxheTpibG9jaztib3R0b206MH0udWkuc3RhY2tlZC5pbnZlcnRlZC5zZWdtZW50OmFmdGVyLC51aS5zdGFja2VkLmludmVydGVkLnNlZ21lbnQ6YmVmb3JlLC51aS5zdGFja2VkLmludmVydGVkLnNlZ21lbnRzOmFmdGVyLC51aS5zdGFja2VkLmludmVydGVkLnNlZ21lbnRzOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAzKTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4zNSl9LnVpLnBhZGRlZC5zZWdtZW50e3BhZGRpbmc6MS41ZW19LnVpW2NsYXNzKj1cXFwidmVyeSBwYWRkZWRcXFwiXS5zZWdtZW50e3BhZGRpbmc6M2VtfS51aS5wYWRkZWQuc2VnbWVudC52ZXJ0aWNhbC5zZWdtZW50LC51aVtjbGFzcyo9XFxcInZlcnkgcGFkZGVkXFxcIl0udmVydGljYWwuc2VnbWVudHtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LnVpLmNvbXBhY3Quc2VnbWVudHtkaXNwbGF5OnRhYmxlfS51aS5jb21wYWN0LnNlZ21lbnRze2Rpc3BsYXk6aW5saW5lLWZsZXh9LnVpLmNvbXBhY3Quc2VnbWVudHMgLnNlZ21lbnQsLnVpLnNlZ21lbnRzIC5jb21wYWN0LnNlZ21lbnR7ZGlzcGxheTpibG9jaztmbGV4OjAgMSBhdXRvfS51aS5jaXJjdWxhci5zZWdtZW50e2Rpc3BsYXk6dGFibGUtY2VsbDtwYWRkaW5nOjJlbTt0ZXh0LWFsaWduOmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym9yZGVyLXJhZGl1czo1MDBlbX0udWkucmFpc2VkLnNlZ21lbnQsLnVpLnJhaXNlZC5zZWdtZW50c3std2Via2l0LWJveC1zaGFkb3c6MCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VnbWVudHN7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjoxcmVtIDA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuc2VnbWVudHM6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5zZWdtZW50czpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuc2VnbWVudHM+LnNlZ21lbnR7dG9wOjA7Ym90dG9tOjA7Ym9yZGVyLXJhZGl1czowO21hcmdpbjowO3dpZHRoOmF1dG87LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlcjpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VnbWVudHM6bm90KC5ob3Jpem9udGFsKT4uc2VnbWVudDpmaXJzdC1jaGlsZHtib3JkZXItdG9wOm5vbmU7bWFyZ2luLXRvcDowO2JvdHRvbTowO21hcmdpbi1ib3R0b206MDt0b3A6MDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS5zZWdtZW50czpub3QoLmhvcml6b250YWwpPi5zZWdtZW50Omxhc3QtY2hpbGR7dG9wOjA7Ym90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLG5vbmU7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksbm9uZTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5zZWdtZW50czpub3QoLmhvcml6b250YWwpPi5zZWdtZW50Om9ubHktY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnNlZ21lbnRzPi51aS5zZWdtZW50c3tib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7bWFyZ2luOjFyZW0gMXJlbX0udWkuc2VnbWVudHM+LnNlZ21lbnRzOmZpcnN0LWNoaWxke2JvcmRlci10b3A6bm9uZX0udWkuc2VnbWVudHM+LnNlZ21lbnQrLnNlZ21lbnRzOm5vdCguaG9yaXpvbnRhbCl7bWFyZ2luLXRvcDowfS51aS5ob3Jpem9udGFsLnNlZ21lbnRze2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjA7cGFkZGluZzowO2JhY2tncm91bmQtY29sb3I6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO21hcmdpbjoxcmVtIDA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnNlZ21lbnRzPi5ob3Jpem9udGFsLnNlZ21lbnRze21hcmdpbjowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowO2JvcmRlcjpub25lOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmhvcml6b250YWwuc2VnbWVudHM+LnNlZ21lbnR7ZmxleDoxIDEgYXV0bzstbXMtZmxleDoxIDEgMHB4O21hcmdpbjowO21pbi13aWR0aDowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowO2JvcmRlcjpub25lOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWdtZW50cz4uaG9yaXpvbnRhbC5zZWdtZW50czpmaXJzdC1jaGlsZHtib3JkZXItdG9wOm5vbmV9LnVpLmhvcml6b250YWwuc2VnbWVudHM+LnNlZ21lbnQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkuZGlzYWJsZWQuc2VnbWVudHtvcGFjaXR5Oi40NTtjb2xvcjpyZ2JhKDQwLDQwLDQwLC4zKX0udWkubG9hZGluZy5zZWdtZW50e3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmU7dGV4dC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50Oy13ZWJraXQtdHJhbnNpdGlvbjphbGwgMHMgbGluZWFyO3RyYW5zaXRpb246YWxsIDBzIGxpbmVhcn0udWkubG9hZGluZy5zZWdtZW50OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDowO2xlZnQ6MDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjgpO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07ei1pbmRleDoxMDB9LnVpLmxvYWRpbmcuc2VnbWVudDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0xLjVlbSAwIDAgLTEuNWVtO3dpZHRoOjNlbTtoZWlnaHQ6M2VtOy13ZWJraXQtYW5pbWF0aW9uOnNlZ21lbnQtc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpzZWdtZW50LXNwaW4gLjZzIGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTtib3JkZXItcmFkaXVzOjUwMHJlbTtib3JkZXItY29sb3I6Izc2NzY3NiByZ2JhKDAsMCwwLC4xKSByZ2JhKDAsMCwwLC4xKSByZ2JhKDAsMCwwLC4xKTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOi4yZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDt2aXNpYmlsaXR5OnZpc2libGU7ei1pbmRleDoxMDF9QC13ZWJraXQta2V5ZnJhbWVzIHNlZ21lbnQtc3Bpbntmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBzZWdtZW50LXNwaW57ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS51aS5iYXNpYy5zZWdtZW50e2JhY2tncm91bmQ6bm9uZSB0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czowfS51aS5jbGVhcmluZy5zZWdtZW50OmFmdGVye2NvbnRlbnQ6XFxcIi5cXFwiO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjA7Y2xlYXI6Ym90aDt2aXNpYmlsaXR5OmhpZGRlbn0udWkucmVkLnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RiMjgyOCFpbXBvcnRhbnR9LnVpLmludmVydGVkLnJlZC5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6I2RiMjgyOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9yYW5nZS5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICNmMjcxMWMhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vcmFuZ2Uuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmMjcxMWMhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS55ZWxsb3cuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjZmJiZDA4IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQueWVsbG93LnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojZmJiZDA4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub2xpdmUuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjYjVjYzE4IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQub2xpdmUuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNiNWNjMTghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ncmVlbi5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICMyMWJhNDUhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmVlbi5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6IzIxYmE0NSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnRlYWwuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjMDBiNWFkIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGVhbC5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJsdWUuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjMjE4NWQwIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYmx1ZS5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6IzIxODVkMCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnZpb2xldC5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICM2NDM1YzkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC52aW9sZXQuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiM2NDM1YzkhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5wdXJwbGUuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjYTMzM2M4IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucHVycGxlLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojYTMzM2M4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucGluay5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICNlMDM5OTchaW1wb3J0YW50fS51aS5pbnZlcnRlZC5waW5rLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojZTAzOTk3IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuYnJvd24uc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjYTU2NzNmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYnJvd24uc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNhNTY3M2YhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ncmV5LnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgIzc2NzY3NiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZXkuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibGFjay5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICMxYjFjMWQhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibGFjay5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6IzFiMWMxZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0uc2VnbWVudHt0ZXh0LWFsaWduOmxlZnR9LnVpW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLnNlZ21lbnR7dGV4dC1hbGlnbjpyaWdodH0udWlbY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJdLnNlZ21lbnR7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLmZsb2F0ZWQuc2VnbWVudCwudWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5zZWdtZW50e2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjFlbX0udWlbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0uc2VnbWVudHtmbG9hdDpyaWdodDttYXJnaW4tbGVmdDoxZW19LnVpLmludmVydGVkLnNlZ21lbnR7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5zZWdtZW50LC51aS5wcmltYXJ5LmludmVydGVkLnNlZ21lbnR7YmFja2dyb3VuZDojMWIxYzFkO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5pbnZlcnRlZC5zZWdtZW50IC5zZWdtZW50e2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW52ZXJ0ZWQuc2VnbWVudCAuaW52ZXJ0ZWQuc2VnbWVudHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkuaW52ZXJ0ZWQuYXR0YWNoZWQuc2VnbWVudHtib3JkZXItY29sb3I6IzU1NX0udWkuc2Vjb25kYXJ5LnNlZ21lbnR7YmFja2dyb3VuZDojZjNmNGY1O2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQuc2VnbWVudHtiYWNrZ3JvdW5kOiM0YzRmNTIgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbShyZ2JhKDI1NSwyNTUsMjU1LC4yKSksdG8ocmdiYSgyNTUsMjU1LDI1NSwuMikpKTtiYWNrZ3JvdW5kOiM0YzRmNTIgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQocmdiYSgyNTUsMjU1LDI1NSwuMikgMCxyZ2JhKDI1NSwyNTUsMjU1LC4yKSAxMDAlKTtiYWNrZ3JvdW5kOiM0YzRmNTIgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsIGxlZnQgYm90dG9tLGNvbG9yLXN0b3AoMCwgcmdiYSgyNTUsMjU1LDI1NSwuMikpLHRvKHJnYmEoMjU1LDI1NSwyNTUsLjIpKSk7YmFja2dyb3VuZDojNGM0ZjUyIGxpbmVhci1ncmFkaWVudChyZ2JhKDI1NSwyNTUsMjU1LC4yKSAwLHJnYmEoMjU1LDI1NSwyNTUsLjIpIDEwMCUpO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjgpfS51aS50ZXJ0aWFyeS5zZWdtZW50e2JhY2tncm91bmQ6I2RjZGRkZTtjb2xvcjpyZ2JhKDAsMCwwLC42KX0udWkudGVydGlhcnkuaW52ZXJ0ZWQuc2VnbWVudHtiYWNrZ3JvdW5kOiM3MTc1NzkgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbShyZ2JhKDI1NSwyNTUsMjU1LC4zNSkpLHRvKHJnYmEoMjU1LDI1NSwyNTUsLjM1KSkpO2JhY2tncm91bmQ6IzcxNzU3OSAtd2Via2l0LWxpbmVhci1ncmFkaWVudChyZ2JhKDI1NSwyNTUsMjU1LC4zNSkgMCxyZ2JhKDI1NSwyNTUsMjU1LC4zNSkgMTAwJSk7YmFja2dyb3VuZDojNzE3NTc5IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSxjb2xvci1zdG9wKDAsIHJnYmEoMjU1LDI1NSwyNTUsLjM1KSksdG8ocmdiYSgyNTUsMjU1LDI1NSwuMzUpKSk7YmFja2dyb3VuZDojNzE3NTc5IGxpbmVhci1ncmFkaWVudChyZ2JhKDI1NSwyNTUsMjU1LC4zNSkgMCxyZ2JhKDI1NSwyNTUsMjU1LC4zNSkgMTAwJSk7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOCl9LnVpLmF0dGFjaGVkLnNlZ21lbnR7dG9wOjA7Ym90dG9tOjA7Ym9yZGVyLXJhZGl1czowO21hcmdpbjowIC0xcHg7d2lkdGg6Y2FsYygxMDAlICsgMnB4KTttYXgtd2lkdGg6Y2FsYygxMDAlICsgMnB4KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOjFweCBzb2xpZCAjZDRkNGQ1fS51aS5hdHRhY2hlZDpub3QoLm1lc3NhZ2UpKy51aS5hdHRhY2hlZC5zZWdtZW50Om5vdCgudG9wKXtib3JkZXItdG9wOm5vbmV9LnVpW2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl0uc2VnbWVudHtib3R0b206MDttYXJnaW4tYm90dG9tOjA7dG9wOjA7bWFyZ2luLXRvcDoxcmVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLnNlZ21lbnRbY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnNlZ21lbnRbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXXtib3R0b206MDttYXJnaW4tdG9wOjA7dG9wOjA7bWFyZ2luLWJvdHRvbToxcmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksbm9uZTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSxub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnNlZ21lbnRbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkubWluaS5zZWdtZW50LC51aS5taW5pLnNlZ21lbnRzIC5zZWdtZW50e2ZvbnQtc2l6ZTouNzg1NzE0MjlyZW19LnVpLnRpbnkuc2VnbWVudCwudWkudGlueS5zZWdtZW50cyAuc2VnbWVudHtmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5zZWdtZW50LC51aS5zbWFsbC5zZWdtZW50cyAuc2VnbWVudHtmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5zZWdtZW50LC51aS5zZWdtZW50cyAuc2VnbWVudHtmb250LXNpemU6MXJlbX0udWkubGFyZ2Uuc2VnbWVudCwudWkubGFyZ2Uuc2VnbWVudHMgLnNlZ21lbnR7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy5zZWdtZW50LC51aS5iaWcuc2VnbWVudHMgLnNlZ21lbnR7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmh1Z2Uuc2VnbWVudCwudWkuaHVnZS5zZWdtZW50cyAuc2VnbWVudHtmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5zZWdtZW50LC51aS5tYXNzaXZlLnNlZ21lbnRzIC5zZWdtZW50e2ZvbnQtc2l6ZToxLjcxNDI4NTcxcmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBTdGVwXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuc3RlcHN7ZGlzcGxheTppbmxpbmUtZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7YWxpZ24taXRlbXM6c3RyZXRjaDttYXJnaW46MWVtIDA7YmFja2dyb3VuZDonJzstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7bGluZS1oZWlnaHQ6MS4xNDI4NTcxNGVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zdGVwczpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnN0ZXBzOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5zdGVwcyAuc3RlcHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleDoxIDAgYXV0bztmbGV4LXdyYXA6d3JhcDtmbGV4LWRpcmVjdGlvbjpyb3c7dmVydGljYWwtYWxpZ246bWlkZGxlO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowIDA7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1yYWRpdXM6MDtib3JkZXI6bm9uZTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZX0udWkuc3RlcHMgLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjtjb250ZW50OicnO3RvcDo1MCU7cmlnaHQ6MDtib3JkZXI6bWVkaXVtIG5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3dpZHRoOjEuMTQyODU3MTRlbTtoZWlnaHQ6MS4xNDI4NTcxNGVtO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci13aWR0aDowIDFweCAxcHggMDstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoNTAlKSByb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKDUwJSkgcm90YXRlKC00NWRlZyl9LnVpLnN0ZXBzIC5zdGVwOmZpcnN0LWNoaWxke3BhZGRpbmctbGVmdDoyZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIC4yODU3MTQyOXJlbX0udWkuc3RlcHMgLnN0ZXA6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aS5zdGVwcyAuc3RlcDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpub25lO21hcmdpbi1yaWdodDowfS51aS5zdGVwcyAuc3RlcDpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS5zdGVwcyAuc3RlcCAudGl0bGV7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW07Zm9udC13ZWlnaHQ6NzAwfS51aS5zdGVwcyAuc3RlcD4udGl0bGV7d2lkdGg6MTAwJX0udWkuc3RlcHMgLnN0ZXAgLmRlc2NyaXB0aW9ue2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6LjkyODU3MTQzZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zdGVwcyAuc3RlcD4uZGVzY3JpcHRpb257d2lkdGg6MTAwJX0udWkuc3RlcHMgLnN0ZXAgLnRpdGxlfi5kZXNjcmlwdGlvbnttYXJnaW4tdG9wOi4yNWVtfS51aS5zdGVwcyAuc3RlcD4uaWNvbntsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZToyLjVlbTttYXJnaW46MCAxcmVtIDAgMH0udWkuc3RlcHMgLnN0ZXA+Lmljb24sLnVpLnN0ZXBzIC5zdGVwPi5pY29ufi5jb250ZW50e2Rpc3BsYXk6YmxvY2s7ZmxleDowIDEgYXV0bzthbGlnbi1zZWxmOm1pZGRsZX0udWkuc3RlcHMgLnN0ZXA+Lmljb25+LmNvbnRlbnR7ZmxleC1ncm93OjEgMCBhdXRvfS51aS5zdGVwczpub3QoLnZlcnRpY2FsKSAuc3RlcD4uaWNvbnt3aWR0aDphdXRvfS51aS5zdGVwcyAubGluay5zdGVwLC51aS5zdGVwcyBhLnN0ZXB7Y3Vyc29yOnBvaW50ZXJ9LnVpLm9yZGVyZWQuc3RlcHN7Y291bnRlci1yZXNldDpvcmRlcmVkfS51aS5vcmRlcmVkLnN0ZXBzIC5zdGVwOmJlZm9yZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYzt0ZXh0LWFsaWduOmNlbnRlcjtjb250ZW50OmNvdW50ZXJzKG9yZGVyZWQsIFxcXCIuXFxcIik7YWxpZ24tc2VsZjptaWRkbGU7bWFyZ2luLXJpZ2h0OjFyZW07Zm9udC1zaXplOjIuNWVtO2NvdW50ZXItaW5jcmVtZW50Om9yZGVyZWQ7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDo3MDB9LnVpLm9yZGVyZWQuc3RlcHMgLnN0ZXA+KntkaXNwbGF5OmJsb2NrO2FsaWduLXNlbGY6bWlkZGxlfS51aS52ZXJ0aWNhbC5zdGVwc3tkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtvdmVyZmxvdzp2aXNpYmxlfS51aS52ZXJ0aWNhbC5zdGVwcyAuc3RlcHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDtib3JkZXItcmFkaXVzOjA7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JvcmRlci1yaWdodDpub25lO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6Zmlyc3QtY2hpbGR7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwOm9ubHktY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwOmFmdGVye2Rpc3BsYXk6bm9uZX0udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6YWZ0ZXJ7dG9wOjUwJTtyaWdodDowO2JvcmRlci13aWR0aDowIDFweCAxcHggMH0udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS52ZXJ0aWNhbC5zdGVwcyAuYWN0aXZlLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpibG9ja30udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6bGFzdC1jaGlsZDphZnRlcntkaXNwbGF5Om5vbmV9LnVpLnZlcnRpY2FsLnN0ZXBzIC5hY3RpdmUuc3RlcDpsYXN0LWNoaWxkOmFmdGVye2Rpc3BsYXk6YmxvY2t9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuc3RlcHM6bm90KC51bnN0YWNrYWJsZSl7ZGlzcGxheTppbmxpbmUtZmxleDtvdmVyZmxvdzp2aXNpYmxlO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWkuc3RlcHM6bm90KC51bnN0YWNrYWJsZSkgLnN0ZXB7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JvcmRlci1yYWRpdXM6MDtwYWRkaW5nOjEuMTQyODU3MTRlbSAyZW19LnVpLnN0ZXBzOm5vdCgudW5zdGFja2FibGUpIC5zdGVwOmZpcnN0LWNoaWxke3BhZGRpbmc6MS4xNDI4NTcxNGVtIDJlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS5zdGVwczpub3QoLnVuc3RhY2thYmxlKSAuc3RlcDpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnN0ZXBzOm5vdCgudW5zdGFja2FibGUpIC5zdGVwOmFmdGVye2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLnN0ZXBzOm5vdCgudW5zdGFja2FibGUpIC5zdGVwIC5jb250ZW50e3RleHQtYWxpZ246Y2VudGVyfS51aS5vcmRlcmVkLnN0ZXBzOm5vdCgudW5zdGFja2FibGUpIC5zdGVwOmJlZm9yZSwudWkuc3RlcHM6bm90KC51bnN0YWNrYWJsZSkgLnN0ZXA+Lmljb257bWFyZ2luOjAgMCAxcmVtIDB9fS51aS5zdGVwcyAubGluay5zdGVwOmhvdmVyLC51aS5zdGVwcyAubGluay5zdGVwOmhvdmVyOjphZnRlciwudWkuc3RlcHMgYS5zdGVwOmhvdmVyLC51aS5zdGVwcyBhLnN0ZXA6aG92ZXI6OmFmdGVye2JhY2tncm91bmQ6I2Y5ZmFmYjtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuc3RlcHMgLmxpbmsuc3RlcDphY3RpdmUsLnVpLnN0ZXBzIC5saW5rLnN0ZXA6YWN0aXZlOjphZnRlciwudWkuc3RlcHMgYS5zdGVwOmFjdGl2ZSwudWkuc3RlcHMgYS5zdGVwOmFjdGl2ZTo6YWZ0ZXJ7YmFja2dyb3VuZDojZjNmNGY1O2NvbG9yOnJnYmEoMCwwLDAsLjkpfS51aS5zdGVwcyAuc3RlcC5hY3RpdmV7Y3Vyc29yOmF1dG87YmFja2dyb3VuZDojZjNmNGY1fS51aS5zdGVwcyAuc3RlcC5hY3RpdmU6YWZ0ZXJ7YmFja2dyb3VuZDojZjNmNGY1fS51aS5zdGVwcyAuc3RlcC5hY3RpdmUgLnRpdGxle2NvbG9yOiM0MTgzYzR9LnVpLm9yZGVyZWQuc3RlcHMgLnN0ZXAuYWN0aXZlOmJlZm9yZSwudWkuc3RlcHMgLmFjdGl2ZS5zdGVwIC5pY29ue2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuc3RlcHMgLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpibG9ja30udWkuc3RlcHMgLmFjdGl2ZS5zdGVwOmFmdGVye2Rpc3BsYXk6YmxvY2t9LnVpLnN0ZXBzIC5zdGVwOmxhc3QtY2hpbGQ6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5zdGVwcyAuYWN0aXZlLnN0ZXA6bGFzdC1jaGlsZDphZnRlcntkaXNwbGF5Om5vbmV9LnVpLnN0ZXBzIC5saW5rLmFjdGl2ZS5zdGVwOmhvdmVyLC51aS5zdGVwcyAubGluay5hY3RpdmUuc3RlcDpob3Zlcjo6YWZ0ZXIsLnVpLnN0ZXBzIGEuYWN0aXZlLnN0ZXA6aG92ZXIsLnVpLnN0ZXBzIGEuYWN0aXZlLnN0ZXA6aG92ZXI6OmFmdGVye2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6I2RjZGRkZTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLm9yZGVyZWQuc3RlcHMgLnN0ZXAuY29tcGxldGVkOmJlZm9yZSwudWkuc3RlcHMgLnN0ZXAuY29tcGxldGVkPi5pY29uOmJlZm9yZXtjb2xvcjojMjFiYTQ1fS51aS5zdGVwcyAuZGlzYWJsZWQuc3RlcHtjdXJzb3I6YXV0bztiYWNrZ3JvdW5kOiNmZmY7cG9pbnRlci1ldmVudHM6bm9uZX0udWkuc3RlcHMgLmRpc2FibGVkLnN0ZXAsLnVpLnN0ZXBzIC5kaXNhYmxlZC5zdGVwIC5kZXNjcmlwdGlvbiwudWkuc3RlcHMgLmRpc2FibGVkLnN0ZXAgLnRpdGxle2NvbG9yOnJnYmEoNDAsNDAsNDAsLjMpfS51aS5zdGVwcyAuZGlzYWJsZWQuc3RlcDphZnRlcntiYWNrZ3JvdW5kOiNmZmZ9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHN7ZGlzcGxheTppbmxpbmUtZmxleDtvdmVyZmxvdzp2aXNpYmxlO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHMgLnN0ZXB7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JvcmRlci1yYWRpdXM6MDtwYWRkaW5nOjEuMTQyODU3MTRlbSAyZW19LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnN0ZXBzIC5zdGVwOmZpcnN0LWNoaWxke3BhZGRpbmc6MS4xNDI4NTcxNGVtIDJlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS5zdGVwcyAuc3RlcDpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnN0ZXBzIC5zdGVwOmFmdGVye2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnN0ZXBzIC5zdGVwIC5jb250ZW50e3RleHQtYWxpZ246Y2VudGVyfS51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS5vcmRlcmVkLnN0ZXBzIC5zdGVwOmJlZm9yZSwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHMgLnN0ZXA+Lmljb257bWFyZ2luOjAgMCAxcmVtIDB9fS51aS5mbHVpZC5zdGVwc3tkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJX0udWkuYXR0YWNoZWQuc3RlcHN7d2lkdGg6Y2FsYygxMDAlICsgMnB4KSFpbXBvcnRhbnQ7bWFyZ2luOjAgLTFweCAwO21heC13aWR0aDpjYWxjKDEwMCUgKyAycHgpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLmF0dGFjaGVkLnN0ZXBzIC5zdGVwOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAwfS51aS5hdHRhY2hlZC5zdGVwcyAuc3RlcDpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gMCAwfS51aS5ib3R0b20uYXR0YWNoZWQuc3RlcHN7bWFyZ2luOjAgLTFweCAwO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLmJvdHRvbS5hdHRhY2hlZC5zdGVwcyAuc3RlcDpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAwIC4yODU3MTQyOXJlbX0udWkuYm90dG9tLmF0dGFjaGVkLnN0ZXBzIC5zdGVwOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIDB9LnVpLmVpZ2h0LnN0ZXBzLC51aS5maXZlLnN0ZXBzLC51aS5mb3VyLnN0ZXBzLC51aS5vbmUuc3RlcHMsLnVpLnNldmVuLnN0ZXBzLC51aS5zaXguc3RlcHMsLnVpLnRocmVlLnN0ZXBzLC51aS50d28uc3RlcHN7d2lkdGg6MTAwJX0udWkuZWlnaHQuc3RlcHM+LnN0ZXAsLnVpLmZpdmUuc3RlcHM+LnN0ZXAsLnVpLmZvdXIuc3RlcHM+LnN0ZXAsLnVpLm9uZS5zdGVwcz4uc3RlcCwudWkuc2V2ZW4uc3RlcHM+LnN0ZXAsLnVpLnNpeC5zdGVwcz4uc3RlcCwudWkudGhyZWUuc3RlcHM+LnN0ZXAsLnVpLnR3by5zdGVwcz4uc3RlcHtmbGV4LXdyYXA6bm93cmFwfS51aS5vbmUuc3RlcHM+LnN0ZXB7d2lkdGg6MTAwJX0udWkudHdvLnN0ZXBzPi5zdGVwe3dpZHRoOjUwJX0udWkudGhyZWUuc3RlcHM+LnN0ZXB7d2lkdGg6MzMuMzMzJX0udWkuZm91ci5zdGVwcz4uc3RlcHt3aWR0aDoyNSV9LnVpLmZpdmUuc3RlcHM+LnN0ZXB7d2lkdGg6MjAlfS51aS5zaXguc3RlcHM+LnN0ZXB7d2lkdGg6MTYuNjY2JX0udWkuc2V2ZW4uc3RlcHM+LnN0ZXB7d2lkdGg6MTQuMjg1JX0udWkuZWlnaHQuc3RlcHM+LnN0ZXB7d2lkdGg6MTIuNSV9LnVpLm1pbmkuc3RlcCwudWkubWluaS5zdGVwcyAuc3RlcHtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LnN0ZXAsLnVpLnRpbnkuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuc3RlcCwudWkuc21hbGwuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuc3RlcCwudWkuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLnN0ZXAsLnVpLmxhcmdlLnN0ZXBzIC5zdGVwe2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuc3RlcCwudWkuYmlnLnN0ZXBzIC5zdGVwe2ZvbnQtc2l6ZToxLjI4NTcxNDI5cmVtfS51aS5odWdlLnN0ZXAsLnVpLmh1Z2Uuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLm1hc3NpdmUuc3RlcCwudWkubWFzc2l2ZS5zdGVwcyAuc3RlcHtmb250LXNpemU6MS43MTQyODU3MXJlbX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OlN0ZXA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7Y2hhcnNldD11dGYtODs7YmFzZTY0LEFBRUFBQUFPQUlBQUF3QmdUMU12TWozaFNRRUFBQURzQUFBQVZtTnRZWERRRWhtM0FBQUJSQUFBQVVwamRuUWdCa24vbEFBQUJ1d0FBQUFjWm5CbmJZb0tlRHNBQUFjSUFBQUprV2RoYzNBQUFBQVFBQUFHNUFBQUFBaG5iSGxtMzJjRWRnQUFBcEFBQUFDMmFHVmhaQUVyUEhzQUFBTklBQUFBTm1ob1pXRUhVd05OQUFBRGdBQUFBQ1JvYlhSNEN5a0FBQUFBQTZRQUFBQU1iRzlqWVFBNEFGc0FBQU93QUFBQUNHMWhlSEFBcGdtOEFBQUR1QUFBQUNCdVlXMWx6SjBhSEFBQUE5Z0FBQUxOY0c5emRLNjlRSmdBQUFhb0FBQUFPM0J5WlhDU29aci9BQUFRbkFBQUFGWUFBUU80QVpBQUJRQUlBbm9DdkFBQUFJd0NlZ0s4QUFBQjRBQXhBUUlBQUFJQUJRTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVUdaRlpBQkE2QURvQVFOUy8yb0FXZ01MQUU4QUFBQUJBQUFBQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFFUUFBd0FCQUFBQUhBQUVBQ2dBQUFBR0FBUUFBUUFDQUFEb0FmLy9BQUFBQU9nQS8vOEFBQmdCQUFFQUFBQUFBQUFBQUFFR0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFEcEFLWUFCVUFIRUFaRHdFQUFRRkNBQUlCQW1vQUFRQUJhZ0FBQUdFVUZ4UURFaXNCRkFjQkJpSW5BU1kwUHdFMk1oOEJBVFl5SHdFV0E2UVAvaUFRTEJEKzZnOFBUQkFzRUtRQmJoQXNFRXdQQWhZV0VQNGdEdzhCRmhBc0VFd1FFS1VCYnhBUVRCQUFBQUgvL2YreEExOERDd0FNQUJKQUR3QUJBUXBEQUFBQUN3QkVGUk1DRVNzQkZBNEJJaTRDUGdFeUhnRURXWExHNk1odUJucTg5THArQVY1MXhIUjB4T3JFZEhURUFBQUFBQUVBQUFBQkFBRERlUnBkWHc4ODlRQUxBK2dBQUFBQXp6V1lqUUFBQUFEUE5XQk4vLzMvc1FPa0F3c0FBQUFJQUFJQUFBQUFBQUFBQVFBQUExTC9hZ0JhQStnQUFQLzNBNlFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQU1ENkFBQUErZ0FBQU5aQUFBQUFBQUFBRGdBV3dBQkFBQUFBd0FXQUFFQUFBQUFBQUlBQmdBVEFHNEFBQUF0Q1pFQUFBQUFBQUFBRWdEZUFBRUFBQUFBQUFBQU5RQUFBQUVBQUFBQUFBRUFDQUExQUFFQUFBQUFBQUlBQndBOUFBRUFBQUFBQUFNQUNBQkVBQUVBQUFBQUFBUUFDQUJNQUFFQUFBQUFBQVVBQ3dCVUFBRUFBQUFBQUFZQUNBQmZBQUVBQUFBQUFBb0FLd0JuQUFFQUFBQUFBQXNBRXdDU0FBTUFBUVFKQUFBQWFnQ2xBQU1BQVFRSkFBRUFFQUVQQUFNQUFRUUpBQUlBRGdFZkFBTUFBUVFKQUFNQUVBRXRBQU1BQVFRSkFBUUFFQUU5QUFNQUFRUUpBQVVBRmdGTkFBTUFBUVFKQUFZQUVBRmpBQU1BQVFRSkFBb0FWZ0Z6QUFNQUFRUUpBQXNBSmdISlEyOXdlWEpwWjJoMElDaERLU0F5TURFMElHSjVJRzl5YVdkcGJtRnNJR0YxZEdodmNuTWdRQ0JtYjI1MFpXeHNieTVqYjIxbWIyNTBaV3hzYjFKbFozVnNZWEptYjI1MFpXeHNiMlp2Ym5SbGJHeHZWbVZ5YzJsdmJpQXhMakJtYjI1MFpXeHNiMGRsYm1WeVlYUmxaQ0JpZVNCemRtY3lkSFJtSUdaeWIyMGdSbTl1ZEdWc2JHOGdjSEp2YW1WamRDNW9kSFJ3T2k4dlptOXVkR1ZzYkc4dVkyOXRBRU1BYndCd0FIa0FjZ0JwQUdjQWFBQjBBQ0FBS0FCREFDa0FJQUF5QURBQU1RQTBBQ0FBWWdCNUFDQUFid0J5QUdrQVp3QnBBRzRBWVFCc0FDQUFZUUIxQUhRQWFBQnZBSElBY3dBZ0FFQUFJQUJtQUc4QWJnQjBBR1VBYkFCc0FHOEFMZ0JqQUc4QWJRQm1BRzhBYmdCMEFHVUFiQUJzQUc4QVVnQmxBR2NBZFFCc0FHRUFjZ0JtQUc4QWJnQjBBR1VBYkFCc0FHOEFaZ0J2QUc0QWRBQmxBR3dBYkFCdkFGWUFaUUJ5QUhNQWFRQnZBRzRBSUFBeEFDNEFNQUJtQUc4QWJnQjBBR1VBYkFCc0FHOEFSd0JsQUc0QVpRQnlBR0VBZEFCbEFHUUFJQUJpQUhrQUlBQnpBSFlBWndBeUFIUUFkQUJtQUNBQVpnQnlBRzhBYlFBZ0FFWUFid0J1QUhRQVpRQnNBR3dBYndBZ0FIQUFjZ0J2QUdvQVpRQmpBSFFBTGdCb0FIUUFkQUJ3QURvQUx3QXZBR1lBYndCdUFIUUFaUUJzQUd3QWJ3QXVBR01BYndCdEFBQUFBQUlBQUFBQUFBQUFDZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3QUFBUUlCQXdsamFHVmphMjFoY21zR1kybHlZMnhsQUFBQUFBRUFBZi8vQUE4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQURJQU1nTUwvN0VEQy8reHNBQXNzQ0JnWmkyd0FTd2daQ0N3d0ZDd0JDWmFzQVJGVzFnaEl5RWJpbGdnc0ZCUVdDR3dRRmtiSUxBNFVGZ2hzRGhaV1NDd0NrVmhaTEFvVUZnaHNBcEZJTEF3VUZnaHNEQlpHeUN3d0ZCWUlHWWdpb3BoSUxBS1VGaGdHeUN3SUZCWUliQUtZQnNnc0RaUVdDR3dObUFiWUZsWldSdXdBQ3RaV1NPd0FGQllaVmxaTGJBQ0xDQkZJTEFFSldGa0lMQUZRMUJZc0FValFyQUdJMEliSVNGWnNBRmdMYkFETENNaEl5RWdaTEVGWWtJZ3NBWWpRcklLQUFJcUlTQ3dCa01naWlDS3NBQXJzVEFGSllwUldHQlFHMkZTV1ZnaldTRWdzRUJUV0xBQUt4c2hzRUJaSTdBQVVGaGxXUzJ3QkN5d0IwTXJzZ0FDQUVOZ1FpMndCU3l3QnlOQ0l5Q3dBQ05DWWJDQVlyQUJZTEFFS2kyd0Jpd2dJRVVnc0FKRlk3QUJSV0pnUkxBQllDMndCeXdnSUVVZ3NBQXJJN0VDQkNWZ0lFV0tJMkVnWkNDd0lGQllJYkFBRzdBd1VGaXdJQnV3UUZsWkk3QUFVRmhsV2JBREpTTmhSRVN3QVdBdHNBZ3NzUVVGUmJBQllVUXRzQWtzc0FGZ0lDQ3dDVU5Lc0FCUVdDQ3dDU05DV2JBS1EwcXdBRkpZSUxBS0kwSlpMYkFLTENDNEJBQmlJTGdFQUdPS0kyR3dDME5nSUlwZ0lMQUxJMElqTGJBTExFdFVXTEVIQVVSWkpMQU5aU040TGJBTUxFdFJXRXRUV0xFSEFVUlpHeUZaSkxBVFpTTjRMYkFOTExFQURFTlZXTEVNREVPd0FXRkNzQW9yV2JBQVE3QUNKVUt4Q1FJbFFyRUtBaVZDc0FFV0l5Q3dBeVZRV0xFQkFFTmdzQVFsUW9xS0lJb2pZYkFKS2lFanNBRmhJSW9qWWJBSktpRWJzUUVBUTJDd0FpVkNzQUlsWWJBSktpRlpzQWxEUjdBS1EwZGdzSUJpSUxBQ1JXT3dBVVZpWUxFQUFCTWpSTEFCUTdBQVBySUJBUUZEWUVJdHNBNHNzUUFGUlZSWUFMQU1JMElnWUxBQlliVU5EUUVBQ3dCQ1FvcGdzUTBGSzdCdEt4c2lXUzJ3RHl5eEFBNHJMYkFRTExFQkRpc3RzQkVzc1FJT0t5MndFaXl4QXc0ckxiQVRMTEVFRGlzdHNCUXNzUVVPS3kyd0ZTeXhCZzRyTGJBV0xMRUhEaXN0c0Jjc3NRZ09LeTJ3R0N5eENRNHJMYkFaTExBSUs3RUFCVVZVV0FDd0RDTkNJR0N3QVdHMURRMEJBQXNBUWtLS1lMRU5CU3V3YlNzYklsa3RzQm9zc1FBWkt5MndHeXl4QVJrckxiQWNMTEVDR1NzdHNCMHNzUU1aS3kyd0hpeXhCQmtyTGJBZkxMRUZHU3N0c0NBc3NRWVpLeTJ3SVN5eEJ4a3JMYkFpTExFSUdTc3RzQ01zc1FrWkt5MndKQ3dnUExBQllDMndKU3dnWUxBTllDQkRJN0FCWUVPd0FpVmhzQUZnc0NRcUlTMndKaXl3SlN1d0pTb3RzQ2NzSUNCSElDQ3dBa1Zqc0FGRlltQWpZVGdqSUlwVldDQkhJQ0N3QWtWanNBRkZZbUFqWVRnYklWa3RzQ2dzc1FBRlJWUllBTEFCRnJBbktyQUJGVEFiSWxrdHNDa3NzQWdyc1FBRlJWUllBTEFCRnJBbktyQUJGVEFiSWxrdHNDb3NJRFd3QVdBdHNDc3NBTEFEUldPd0FVVmlzQUFyc0FKRlk3QUJSV0t3QUN1d0FCYTBBQUFBQUFCRVBpTTRzU29CRlNvdHNDd3NJRHdnUnlDd0FrVmpzQUZGWW1Dd0FFTmhPQzJ3TFN3dUZ6d3RzQzRzSUR3Z1J5Q3dBa1Zqc0FGRlltQ3dBRU5oc0FGRFl6Z3RzQzhzc1FJQUZpVWdMaUJIc0FBalFyQUNKVW1LaWtjalJ5TmhJRmhpR3lGWnNBRWpRckl1QVFFVkZDb3RzREFzc0FBV3NBUWxzQVFsUnlOSEkyR3dCa1VyWllvdUl5QWdQSW80TGJBeExMQUFGckFFSmJBRUpTQXVSeU5ISTJFZ3NBUWpRckFHUlNzZ3NHQlFXQ0N3UUZGWXN3SWdBeUFic3dJbUF4cFpRa0lqSUxBSVF5Q0tJMGNqUnlOaEkwWmdzQVJEc0lCaVlDQ3dBQ3NnaW9waElMQUNRMkJrSTdBRFEyRmtVRml3QWtOaEc3QURRMkJac0FNbHNJQmlZU01nSUxBRUppTkdZVGdiSTdBSVEwYXdBaVd3Q0VOSEkwY2pZV0Fnc0FSRHNJQmlZQ01nc0FBckk3QUVRMkN3QUN1d0JTVmhzQVVsc0lCaXNBUW1ZU0N3QkNWZ1pDT3dBeVZnWkZCWUlSc2pJVmtqSUNDd0JDWWpSbUU0V1Myd01peXdBQllnSUNDd0JTWWdMa2NqUnlOaEl6dzRMYkF6TExBQUZpQ3dDQ05DSUNBZ1JpTkhzQUFySTJFNExiQTBMTEFBRnJBREpiQUNKVWNqUnlOaHNBQlVXQzRnUENNaEc3QUNKYkFDSlVjalJ5TmhJTEFGSmJBRUpVY2pSeU5oc0FZbHNBVWxTYkFDSldHd0FVVmpJeUJZWWhzaFdXT3dBVVZpWUNNdUl5QWdQSW80SXlGWkxiQTFMTEFBRmlDd0NFTWdMa2NqUnlOaElHQ3dJR0Jtc0lCaUl5QWdQSW80TGJBMkxDTWdMa2F3QWlWR1VsZ2dQRmt1c1NZQkZDc3RzRGNzSXlBdVJyQUNKVVpRV0NBOFdTNnhKZ0VVS3kyd09Dd2pJQzVHc0FJbFJsSllJRHhaSXlBdVJyQUNKVVpRV0NBOFdTNnhKZ0VVS3kyd09TeXdNQ3NqSUM1R3NBSWxSbEpZSUR4WkxyRW1BUlFyTGJBNkxMQXhLNG9nSUR5d0JDTkNpamdqSUM1R3NBSWxSbEpZSUR4WkxyRW1BUlFyc0FSRExyQW1LeTJ3T3l5d0FCYXdCQ1d3QkNZZ0xrY2pSeU5oc0FaRkt5TWdQQ0F1SXppeEpnRVVLeTJ3UEN5eENBUWxRckFBRnJBRUpiQUVKU0F1UnlOSEkyRWdzQVFqUXJBR1JTc2dzR0JRV0NDd1FGRllzd0lnQXlBYnN3SW1BeHBaUWtJaklFZXdCRU93Z0dKZ0lMQUFLeUNLaW1FZ3NBSkRZR1Fqc0FORFlXUlFXTEFDUTJFYnNBTkRZRm13QXlXd2dHSmhzQUlsUm1FNEl5QThJemdiSVNBZ1JpTkhzQUFySTJFNElWbXhKZ0VVS3kyd1BTeXdNQ3N1c1NZQkZDc3RzRDRzc0RFcklTTWdJRHl3QkNOQ0l6aXhKZ0VVSzdBRVF5NndKaXN0c0Q4c3NBQVZJRWV3QUNOQ3NnQUJBUlVVRXk2d0xDb3RzRUFzc0FBVklFZXdBQ05Dc2dBQkFSVVVFeTZ3TENvdHNFRXNzUUFCRkJPd0xTb3RzRUlzc0M4cUxiQkRMTEFBRmtVaklDNGdSb29qWVRpeEpnRVVLeTJ3UkN5d0NDTkNzRU1yTGJCRkxMSUFBRHdyTGJCR0xMSUFBVHdyTGJCSExMSUJBRHdyTGJCSUxMSUJBVHdyTGJCSkxMSUFBRDByTGJCS0xMSUFBVDByTGJCTExMSUJBRDByTGJCTUxMSUJBVDByTGJCTkxMSUFBRGtyTGJCT0xMSUFBVGtyTGJCUExMSUJBRGtyTGJCUUxMSUJBVGtyTGJCUkxMSUFBRHNyTGJCU0xMSUFBVHNyTGJCVExMSUJBRHNyTGJCVUxMSUJBVHNyTGJCVkxMSUFBRDRyTGJCV0xMSUFBVDRyTGJCWExMSUJBRDRyTGJCWUxMSUJBVDRyTGJCWkxMSUFBRG9yTGJCYUxMSUFBVG9yTGJCYkxMSUJBRG9yTGJCY0xMSUJBVG9yTGJCZExMQXlLeTZ4SmdFVUt5MndYaXl3TWl1d05pc3RzRjhzc0RJcnNEY3JMYkJnTExBQUZyQXlLN0E0S3kyd1lTeXdNeXN1c1NZQkZDc3RzR0lzc0RNcnNEWXJMYkJqTExBeks3QTNLeTJ3WkN5d015dXdPQ3N0c0dVc3NEUXJMckVtQVJRckxiQm1MTEEwSzdBMkt5MndaeXl3TkN1d055c3RzR2dzc0RRcnNEZ3JMYkJwTExBMUt5NnhKZ0VVS3kyd2FpeXdOU3V3TmlzdHNHc3NzRFVyc0RjckxiQnNMTEExSzdBNEt5MndiU3dyc0FobHNBTWtVSGl3QVJVd0xRQUFBRXU0QU1oU1dMRUJBWTVadVFnQUNBQmpJTEFCSTBTd0F5TndzZ1FvQ1VWU1JMSUtBZ2Nxc1FZQlJMRWtBWWhSV0xCQWlGaXhCZ05Fc1NZQmlGRll1QVFBaUZpeEJnRkVXVmxaV2JnQi80V3dCSTJ4QlFCRUFBQT0pIGZvcm1hdCgndHJ1ZXR5cGUnKSx1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUFvVUFBNEFBQUFBRVBRQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJQVXk4eUFBQUJSQUFBQUVRQUFBQldQZUZKQVdOdFlYQUFBQUdJQUFBQU9nQUFBVXJRRWhtM1kzWjBJQUFBQWNRQUFBQVVBQUFBSEFaSi81Um1jR2R0QUFBQjJBQUFCUGtBQUFtUmlncDRPMmRoYzNBQUFBYlVBQUFBQ0FBQUFBZ0FBQUFRWjJ4NVpnQUFCdHdBQUFDdUFBQUF0dDluQkhab1pXRmtBQUFIakFBQUFEVUFBQUEyQVNzOGUyaG9aV0VBQUFmRUFBQUFJQUFBQUNRSFV3Tk5hRzEwZUFBQUIrUUFBQUFNQUFBQURBc3BBQUJzYjJOaEFBQUg4QUFBQUFnQUFBQUlBRGdBVzIxaGVIQUFBQWY0QUFBQUlBQUFBQ0FBcGdtOGJtRnRaUUFBQ0JnQUFBRjNBQUFDemN5ZEdoeHdiM04wQUFBSmtBQUFBQ29BQUFBN3JyMUFtSEJ5WlhBQUFBbThBQUFBVmdBQUFGYVNvWnIvZUp4allHVGV3VGlCZ1pXQmc2bUthUThEQTBNUGhHWjh3R0RJeU1UQXdNVEF5c3lBRlFTa3VhWXdPTHhnZU1ISUhQUS9peUdLbVp2Qkh5ak1DSklEQVBlOUMyQjRuR05nWUdCbWdHQVpCa1lHRUhBQjhoakJmQllHRFNETkJxUVpHWmdZR0Y0dy92OFBVdkNDQVVSTE1FTFZBd0VqRzhPSUJ3Qms1QWF2QUFCNG5HTmdRQU5HREViTTNQODNnakFBRUxRRDRYaWNuVlhaZHROV0ZKVThaSEFTT21TZ29BN1gzRGhRNjhxRUtSZ3dhU3JGZGlFZEhBaXRCQjJrREhUa25jYys2MnVPUXJ0V0gvbTA3bjA5SkxSMHJiWXNscysrUjF0bjJEcm5SaHdqS24wYWlHdlVvWktYQTZtc1BaWks5MGxjMTNVdmo1VU1CbkZkdGhKUFNadW9uU1JLYXQzc1VDN3hXT3NxV1NkWUorUGxJRlpQVlo1bm9BemlGQjVsU1VRYlJCdXBseVpKNG9uako0a1daeEFmSlVrZ0phTVFwOUxJVUVJMUdzUlMxYUZNNmRDcjF4TngwMERLUnFNZWRWaFU5MFBGSjhjMXA5U3NBMFlxVnpuQ0ZldlZScjRicHdNdmU1REVPc0d6clljeEhuaXNmcFFxa0lxUjZjZy9ka3BPbElhQlZISFVvVmJpNkRDVFgvZVJUQ3JOUUthTVlrV2w3b0c0M2YxMDJ4WXhQWFE2dmk1S2xVYXF1cm5PS0pydDBmR29neWdQMmNicHBOelEyZmJ3NVJsVFZLdGRjYlB0UUdZTlhFckpiSFNmUkFBZEpsTGo2UUZPTlp3Q3FSbjFSOFhaNTg4QkVzbGNsS284VlRLSGVnT1pNenQ3Y1RIdGJpZXJzbkNrbndjeWIzWjI0NTJIUTZkWGgzL1IraGRNNGN4SGorSmlmajVDK2xCcWZpSk9KS1ZHV016eXA0WWZjVmNnUXJreGlBc1h5dUJUaERsMFJkclpabDNqdFRIMmhzLzVTcWxoUFFuYTZLUDRmZ3I5VGlRckhHZFJvL1ZJbk0xajEzV3QzR2RRUzdXN0Z6c3lyME9WSXU3dkN3dXVNK2VFWVo0V0MxVmZudm5lQlRUL0JvaG4vRURlTklWTCs1WXBTclJ2bTZKTXUyaUtDdTBTVktWZE5zVVU3WW9wcG1uUG1tS0c5aDFUek5LZU16TGovOHZjNTVIN0hON3hrSnYyWGVTbWZRKzVhZDlIYnRvUGtKdFdJVGR0SGJscEx5QTNyVVp1MmxXak9uWUVHZ1pwRjFJVlFkQTBzdnBoM0ZhYjlVRFdqRFI4YVdEeUxtTEkrdXBFUjUyMXRjb2Z4WDkxNGdzSGNtbWlwN3NpRjV2aUxxL2JGajQ4M2U2cmo1cEczYkRWK01hUjhqQWVSbm9jbXRCWitjM2h2KzFOM1M2YTdqS3FNdWdCRlV3S3dBQmw3VUFDMHpyYkNhVDFtcWY0OGdkZ1hJWjR6a3BEdFZTZk80YW03K1Y1WC9leE9mRyt4KzNHTHJkY2Qza0pXZFlOY21QMjhOOVNaS3JySCtVdHJWUW5SNndySjQ5VmF4aERLcndvdXI2U2xIdTB0UnUvS0tteThsNlUxc3JuazVDYlBZTWJRbHUyN21Hd0kweHB5aVVlWGxPbEtEM1VVbzZ5UXl4dktjbzg0SlNMQzFxR3hMZ09kUTlxYThUcG9Yb1lHd3NoaHFHMHZSQndTQ2xkRmQrMHluZnhIcXRyMk9qNHhSWGg2WHB5RWhHZjRpcjdVZkJVMTBiOTZBN2F2R2JkTW9NcFZhcW4rNHhQc2EvYjlsRlphYVNPc3hlM1ZBZlhOT3NhT1JYVFQrUnI0SFJ2T0dqZEF6MVVmRFJCSTFVMXgrakdLR00wbGpYbDN3UjBNVlordzJqVll2czkzRStkcEZXc3VVdVk3SnNUOStDMHUvMHErN1djVzBiVy9kY0d2VzNraXA4ak1iOHRDdnc3QjJLM1pBM1VPNU9CR0F2SVdkQVl4aFltZHhpdWcyM0ViZlkvSnFmLzM0YUZSWEpYT3hxN2VlckQxWk5SSlhmWjhyakxUWFpaMTZNMlI5Vk9HdnNJalMwUE4rYlk0WElzdHNSZ1FiYit3Zjh4N2dGM2FWRUM0TkRJWlppSTJuU2hudXJoNmg2cnNXMDRWeElCZHMyeDQzUUFlZ0F1UWQ4Y3U5YnpDWUQxM0NQbkxzQjljZ2gyeUNINGxCeUN6OGk1QmZBNU9RUmZrRU13SUlkZ2w1dzdBQS9JSVhoSURzRWVPUVNQeU5rRStKSWNncS9JSVlqSklVakl1UTN3bUJ5Q0orUVFmRTBPd1RkR3JrNWsvcFlIMlFENnpxS2JRS21kR2h6YU9HUkdyazNZK3p4WTlvRkZaQjlhUk9xUmtlc1Q2bE1lTFBWN2kwajl3U0pTZnpSeVkwTDlpUWRML2RraVVuK3hpTlJueHBlWkl5bXZEcDd6amc3K0JKZnFyVjRBQUFBQUFRQUIvLzhBRDNpY1kyQmtBQUxtSlV3ekdFUVpaQndrK1JrWkdCbWRHSmdZbWJJWWdNd3NvR1NpaUxnSXM1QTJvd2c3STV1U09xT2FpVDJqbVpFOEk1Z1FZMTdDLzA5QlFFZmczeXQrZmg4Z3ZZUXhEMGo2OERPSmlRbjhVK0RuWnhRRGNRVUVsakxtQ3dCcEJnYkcvMy8vYjJTT1orWm00R0VRY3VBSDJzYmxETFNFbThGRlZKaEpFR2dMSDZPU0hwTWRvNUVjSTNOazBiRVhKL0xZcXZaODJWWEhHRmQ2cEtUa3lDc1F3UUFBcStRa3FBQUFlSnhqWUdSZ1lBRGl3NVZTc2ZIOE5sOFp1SmxmQUVVWXpwdk82SVhRQ2I3Ly8vN2Z5THlFbVJ2STVXQmdBb2tDQUZiL0RKQUFBQUI0bkdOZ1pHQmdEdnFmeFJERi9JS0I0ZjkzNWlVTVFCRVV3QXdBaTVZRnBnUG9BQUFENkFBQUExa0FBQUFBQUFBQU9BQmJBQUVBQUFBREFCWUFBUUFBQUFBQUFnQUdBQk1BYmdBQUFDMEprUUFBQUFCNG5IV1F5MnJDUUJTRy8vSFNpMEpiV3VpMnN5cEthYnhnTjRJZ1dIVFRicVM0TFRIR0pCSXpNaGtGWDZQdjBJZnBTL1JaK3B1TXBTaE5tTXgzdmpsejVtUUFYT01iQXZuenhKR3p3Qm1qbkFzNFJjOXlrZjdaY29uOFlybU1LdDRzbjlDL1c2N2dBWUhsS203d3dRcWlkTTVvZ1UvTEFsZmkwbklCRitMT2NwSCswWEtKM0xOY3hxMTR0WHhDNzFtdVlDSlN5MVhjaTYrQldtMTFGSVJHMWdaMTJXNjJPbks2bFlvcVN0eFl1bXNUS3AzS3ZweXJ4UGh4ckJ4UExmYzg5b04xN09wOXVKOG52azRqbGNpVzA5eXJrWi80MmpYK2JGYzkzUVJ0WStaeXJ0VlNEbTJHWEdtMThEM2poTWFzdW8zRzMvTXdnTUlLVzJoRXZLb1FCaEkxMmpybk5wcG9vVU9hTWtNeU04K0trTUJGVE9OaXpSMWh0cEl5N25QTUdTVzBQak5pc2dPUDMrV1JINU1DN285WlJSK3RIc1lUMHU2TUtQT1NmVG5zN2pCclJFcXlURGV6czkvZVUyeDRXcHZXY05ldVM1MTFKVEU4cUNGNUg3dTFCWTFINzJTM1ltaTdhUEQ5NS85K0FOMWZoRXNBZUp4allHS0FBQzRHN0lDWmdZR1JpWkdaTXprak5UazdON0VvbXkwNXN5ZzVKNVdCQVFCRTFRWkJBQUJMdUFESVVsaXhBUUdPV2JrSUFBZ0FZeUN3QVNORXNBTWpjTElFS0FsRlVrU3lDZ0lIS3JFR0FVU3hKQUdJVVZpd1FJaFlzUVlEUkxFbUFZaFJXTGdFQUloWXNRWUJSRmxaV1ZtNEFmK0ZzQVNOc1FVQVJBQUEpIGZvcm1hdCgnd29mZicpfS51aS5vcmRlcmVkLnN0ZXBzIC5zdGVwLmNvbXBsZXRlZDpiZWZvcmUsLnVpLnN0ZXBzIC5zdGVwLmNvbXBsZXRlZD4uaWNvbjpiZWZvcmV7Zm9udC1mYW1pbHk6U3RlcDtjb250ZW50OidcXFxcZTgwMCd9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEJyZWFkY3J1bWJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5icmVhZGNydW1ie2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmJyZWFkY3J1bWI6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5icmVhZGNydW1iOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5icmVhZGNydW1iIC5kaXZpZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO29wYWNpdHk6Ljc7bWFyZ2luOjAgLjIxNDI4NTcxcmVtIDA7Zm9udC1zaXplOi45Mjg1NzE0M2VtO2NvbG9yOnJnYmEoMCwwLDAsLjQpO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS51aS5icmVhZGNydW1iIGF7Y29sb3I6IzQxODNjNH0udWkuYnJlYWRjcnVtYiBhOmhvdmVye2NvbG9yOiMxZTcwYmZ9LnVpLmJyZWFkY3J1bWIgLmljb24uZGl2aWRlcntmb250LXNpemU6Ljg1NzE0Mjg2ZW07dmVydGljYWwtYWxpZ246YmFzZWxpbmV9LnVpLmJyZWFkY3J1bWIgYS5zZWN0aW9ue2N1cnNvcjpwb2ludGVyfS51aS5icmVhZGNydW1iIC5zZWN0aW9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowO3BhZGRpbmc6MH0udWkuYnJlYWRjcnVtYi5zZWdtZW50e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6Ljc4NTcxNDI5ZW0gMWVtfS51aS5icmVhZGNydW1iIC5hY3RpdmUuc2VjdGlvbntmb250LXdlaWdodDo3MDB9LnVpLm1pbmkuYnJlYWRjcnVtYntmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LmJyZWFkY3J1bWJ7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuYnJlYWRjcnVtYntmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5icmVhZGNydW1ie2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5icmVhZGNydW1ie2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuYnJlYWRjcnVtYntmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5icmVhZGNydW1ie2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLmJyZWFkY3J1bWJ7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEZvcm1cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5mb3Jte3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlfS51aS5mb3JtPnB7bWFyZ2luOjFlbSAwfS51aS5mb3JtIC5maWVsZHtjbGVhcjpib3RoO21hcmdpbjowIDAgMWVtfS51aS5mb3JtIC5maWVsZDpsYXN0LWNoaWxkLC51aS5mb3JtIC5maWVsZHM6bGFzdC1jaGlsZCAuZmllbGR7bWFyZ2luLWJvdHRvbTowfS51aS5mb3JtIC5maWVsZHMgLmZpZWxke2NsZWFyOmJvdGg7bWFyZ2luOjB9LnVpLmZvcm0gLmZpZWxkPmxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgMCAuMjg1NzE0MjlyZW0gMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Zm9udC1zaXplOi45Mjg1NzE0M2VtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTpub25lfS51aS5mb3JtIGlucHV0Om5vdChbdHlwZV0pLC51aS5mb3JtIGlucHV0W3R5cGU9ZGF0ZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1lbWFpbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1maWxlXSwudWkuZm9ybSBpbnB1dFt0eXBlPW51bWJlcl0sLnVpLmZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1zZWFyY2hdLC51aS5mb3JtIGlucHV0W3R5cGU9dGVsXSwudWkuZm9ybSBpbnB1dFt0eXBlPXRleHRdLC51aS5mb3JtIGlucHV0W3R5cGU9dGltZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT11cmxdLC51aS5mb3JtIHRleHRhcmVhe3dpZHRoOjEwMCU7dmVydGljYWwtYWxpZ246dG9wfS51aS5mb3JtIDo6LXdlYmtpdC1kYXRldGltZS1lZGl0LC51aS5mb3JtIDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbntoZWlnaHQ6MS4yMTQyODU3MWVtfS51aS5mb3JtIGlucHV0Om5vdChbdHlwZV0pLC51aS5mb3JtIGlucHV0W3R5cGU9ZGF0ZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1lbWFpbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1maWxlXSwudWkuZm9ybSBpbnB1dFt0eXBlPW51bWJlcl0sLnVpLmZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1zZWFyY2hdLC51aS5mb3JtIGlucHV0W3R5cGU9dGVsXSwudWkuZm9ybSBpbnB1dFt0eXBlPXRleHRdLC51aS5mb3JtIGlucHV0W3R5cGU9dGltZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT11cmxde2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjttYXJnaW46MDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7dGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDApO2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbTtwYWRkaW5nOi42Nzg1NzE0M2VtIDFlbTtmb250LXNpemU6MWVtO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0Oy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2V9LnVpLmZvcm0gdGV4dGFyZWF7bWFyZ2luOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7dGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDApO3BhZGRpbmc6Ljc4NTcxNDI5ZW0gMWVtO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtvdXRsaW5lOjA7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCB0cmFuc3BhcmVudCBpbnNldDstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO2ZvbnQtc2l6ZToxZW07bGluZS1oZWlnaHQ6MS4yODU3O3Jlc2l6ZTp2ZXJ0aWNhbH0udWkuZm9ybSB0ZXh0YXJlYTpub3QoW3Jvd3NdKXtoZWlnaHQ6MTJlbTttaW4taGVpZ2h0OjhlbTttYXgtaGVpZ2h0OjI0ZW19LnVpLmZvcm0gaW5wdXRbdHlwZT1jaGVja2JveF0sLnVpLmZvcm0gdGV4dGFyZWF7dmVydGljYWwtYWxpZ246dG9wfS51aS5mb3JtIGlucHV0LmF0dGFjaGVke3dpZHRoOmF1dG99LnVpLmZvcm0gc2VsZWN0e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OmF1dG87d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O3BhZGRpbmc6LjYyZW0gMWVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlfS51aS5mb3JtIC5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3due3dpZHRoOjEwMCV9LnVpLmZvcm0gLmZpZWxkPi5zZWxlY3Rpb24uZHJvcGRvd24+LmRyb3Bkb3duLmljb257ZmxvYXQ6cmlnaHR9LnVpLmZvcm0gLmlubGluZS5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3duLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3due3dpZHRoOmF1dG99LnVpLmZvcm0gLmlubGluZS5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3duPi5kcm9wZG93bi5pY29uLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3duPi5kcm9wZG93bi5pY29ue2Zsb2F0Om5vbmV9LnVpLmZvcm0gLmZpZWxkIC51aS5pbnB1dCwudWkuZm9ybSAuZmllbGRzIC5maWVsZCAudWkuaW5wdXQsLnVpLmZvcm0gLndpZGUuZmllbGQgLnVpLmlucHV0e3dpZHRoOjEwMCV9LnVpLmZvcm0gLmlubGluZS5maWVsZDpub3QoLndpZGUpIC51aS5pbnB1dCwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQ6bm90KC53aWRlKSAudWkuaW5wdXR7d2lkdGg6YXV0bzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmZvcm0gLmZpZWxkIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuZmllbGRzIC5maWVsZCAudWkuaW5wdXQgaW5wdXR7d2lkdGg6YXV0b30udWkuZm9ybSAuZWlnaHQuZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuZml2ZS5maWVsZHMgLnVpLmlucHV0IGlucHV0LC51aS5mb3JtIC5mb3VyLmZpZWxkcyAudWkuaW5wdXQgaW5wdXQsLnVpLmZvcm0gLm5pbmUuZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuc2V2ZW4uZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuc2l4LmZpZWxkcyAudWkuaW5wdXQgaW5wdXQsLnVpLmZvcm0gLnRlbi5maWVsZHMgLnVpLmlucHV0IGlucHV0LC51aS5mb3JtIC50aHJlZS5maWVsZHMgLnVpLmlucHV0IGlucHV0LC51aS5mb3JtIC50d28uZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAud2lkZS5maWVsZCAudWkuaW5wdXQgaW5wdXR7ZmxleDoxIDAgYXV0bzt3aWR0aDowfS51aS5mb3JtIC5lcnJvci5tZXNzYWdlLC51aS5mb3JtIC5zdWNjZXNzLm1lc3NhZ2UsLnVpLmZvcm0gLndhcm5pbmcubWVzc2FnZXtkaXNwbGF5Om5vbmV9LnVpLmZvcm0gLm1lc3NhZ2U6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5mb3JtIC5maWVsZCAucHJvbXB0LmxhYmVse3doaXRlLXNwYWNlOm5vcm1hbDtiYWNrZ3JvdW5kOiNmZmYhaW1wb3J0YW50O2JvcmRlcjoxcHggc29saWQgI2UwYjRiNCFpbXBvcnRhbnQ7Y29sb3I6IzlmM2EzOCFpbXBvcnRhbnR9LnVpLmZvcm0gLmlubGluZS5maWVsZCAucHJvbXB0LC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZCAucHJvbXB0e3ZlcnRpY2FsLWFsaWduOnRvcDttYXJnaW46LS4yNWVtIDAgLS41ZW0gLjVlbX0udWkuZm9ybSAuaW5saW5lLmZpZWxkIC5wcm9tcHQ6YmVmb3JlLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZCAucHJvbXB0OmJlZm9yZXtib3JkZXItd2lkdGg6MCAwIDFweCAxcHg7Ym90dG9tOmF1dG87cmlnaHQ6YXV0bzt0b3A6NTAlO2xlZnQ6MH0udWkuZm9ybSAuZmllbGQuZmllbGQgaW5wdXQ6LXdlYmtpdC1hdXRvZmlsbHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMTAwcHggaXZvcnkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMTAwcHggaXZvcnkgaW5zZXQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZTVkZmExIWltcG9ydGFudH0udWkuZm9ybSAuZmllbGQuZmllbGQgaW5wdXQ6LXdlYmtpdC1hdXRvZmlsbDpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMTAwcHggaXZvcnkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMTAwcHggaXZvcnkgaW5zZXQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZDVjMzE1IWltcG9ydGFudH0udWkuZm9ybSAuZXJyb3IuZXJyb3IgaW5wdXQ6LXdlYmtpdC1hdXRvZmlsbHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMTAwcHggI2ZmZmFmMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxMDBweCAjZmZmYWYwIGluc2V0IWltcG9ydGFudDtib3JkZXItY29sb3I6I2UwYjRiNCFpbXBvcnRhbnR9LnVpLmZvcm0gOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTkxLDE5MSwxOTEsLjg3KX0udWkuZm9ybSA6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTkxLDE5MSwxOTEsLjg3KSFpbXBvcnRhbnR9LnVpLmZvcm0gOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTkxLDE5MSwxOTEsLjg3KX0udWkuZm9ybSA6Zm9jdXM6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpfS51aS5mb3JtIDpmb2N1czotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpIWltcG9ydGFudH0udWkuZm9ybSA6Zm9jdXM6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpfS51aS5mb3JtIC5lcnJvciA6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2U3YmRiY30udWkuZm9ybSAuZXJyb3IgOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojZTdiZGJjIWltcG9ydGFudH0udWkuZm9ybSAuZXJyb3IgOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOiNlN2JkYmN9LnVpLmZvcm0gLmVycm9yIDpmb2N1czo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojZGE5Nzk2fS51aS5mb3JtIC5lcnJvciA6Zm9jdXM6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNkYTk3OTYhaW1wb3J0YW50fS51aS5mb3JtIC5lcnJvciA6Zm9jdXM6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2RhOTc5Nn0udWkuZm9ybSBpbnB1dDpub3QoW3R5cGVdKTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPWRhdGVdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9ZW1haWxdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9ZmlsZV06Zm9jdXMsLnVpLmZvcm0gaW5wdXRbdHlwZT1udW1iZXJdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9c2VhcmNoXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPXRlbF06Zm9jdXMsLnVpLmZvcm0gaW5wdXRbdHlwZT10ZXh0XTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPXRpbWVdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9dXJsXTpmb2N1c3tjb2xvcjpyZ2JhKDAsMCwwLC45NSk7Ym9yZGVyLWNvbG9yOiM4NWI3ZDk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0fS51aS5mb3JtIHRleHRhcmVhOmZvY3Vze2NvbG9yOnJnYmEoMCwwLDAsLjk1KTtib3JkZXItY29sb3I6Izg1YjdkOTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4zNSkgaW5zZXQ7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9LnVpLmZvcm0uc3VjY2VzcyAuc3VjY2Vzcy5tZXNzYWdlOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6YmxvY2t9LnVpLmZvcm0uc3VjY2VzcyAuY29tcGFjdC5zdWNjZXNzLm1lc3NhZ2U6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLmZvcm0uc3VjY2VzcyAuaWNvbi5zdWNjZXNzLm1lc3NhZ2U6bm90KDplbXB0eSl7ZGlzcGxheTpmbGV4fS51aS5mb3JtLndhcm5pbmcgLndhcm5pbmcubWVzc2FnZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrfS51aS5mb3JtLndhcm5pbmcgLmNvbXBhY3Qud2FybmluZy5tZXNzYWdlOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5mb3JtLndhcm5pbmcgLmljb24ud2FybmluZy5tZXNzYWdlOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6ZmxleH0udWkuZm9ybS5lcnJvciAuZXJyb3IubWVzc2FnZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrfS51aS5mb3JtLmVycm9yIC5jb21wYWN0LmVycm9yLm1lc3NhZ2U6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLmZvcm0uZXJyb3IgLmljb24uZXJyb3IubWVzc2FnZTpub3QoOmVtcHR5KXtkaXNwbGF5OmZsZXh9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC5pbnB1dCwudWkuZm9ybSAuZmllbGQuZXJyb3IgbGFiZWwsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLmlucHV0LC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGxhYmVse2NvbG9yOiM5ZjNhMzh9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC5jb3JuZXIubGFiZWwsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLmNvcm5lci5sYWJlbHtib3JkZXItY29sb3I6IzlmM2EzODtjb2xvcjojZmZmfS51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dDpub3QoW3R5cGVdKSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1kYXRlXSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9ZW1haWxdLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPWZpbGVdLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPW51bWJlcl0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9cGFzc3dvcmRdLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXNlYXJjaF0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dGVsXSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT10ZXh0XSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT10aW1lXSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT11cmxdLC51aS5mb3JtIC5maWVsZC5lcnJvciBzZWxlY3QsLnVpLmZvcm0gLmZpZWxkLmVycm9yIHRleHRhcmVhLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0Om5vdChbdHlwZV0pLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9ZGF0ZV0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT1lbWFpbF0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT1maWxlXSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBpbnB1dFt0eXBlPW51bWJlcl0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT1wYXNzd29yZF0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT1zZWFyY2hdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9dGVsXSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBpbnB1dFt0eXBlPXRleHRdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9dGltZV0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT11cmxdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIHNlbGVjdCwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCB0ZXh0YXJlYXtiYWNrZ3JvdW5kOiNmZmY2ZjY7Ym9yZGVyLWNvbG9yOiNlMGI0YjQ7Y29sb3I6IzlmM2EzODtib3JkZXItcmFkaXVzOicnOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXQ6bm90KFt0eXBlXSk6Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9ZGF0ZV06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPWVtYWlsXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1maWxlXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1udW1iZXJdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXBhc3N3b3JkXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1zZWFyY2hdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXRlbF06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dGV4dF06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dGltZV06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dXJsXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3Igc2VsZWN0OmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciB0ZXh0YXJlYTpmb2N1c3tiYWNrZ3JvdW5kOiNmZmY2ZjY7Ym9yZGVyLWNvbG9yOiNlMGI0YjQ7Y29sb3I6IzlmM2EzODstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmZvcm0gLmZpZWxkLmVycm9yIHNlbGVjdHstd2Via2l0LWFwcGVhcmFuY2U6bWVudWxpc3QtYnV0dG9ufS51aS5mb3JtIC5maWVsZC5lcnJvciAudWkuZHJvcGRvd24sLnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5kcm9wZG93biAuaXRlbSwudWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLmRyb3Bkb3duIC50ZXh0LC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC51aS5kcm9wZG93biwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAudWkuZHJvcGRvd24gLml0ZW17YmFja2dyb3VuZDojZmZmNmY2O2NvbG9yOiM5ZjNhMzh9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5kcm9wZG93biwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAudWkuZHJvcGRvd257Ym9yZGVyLWNvbG9yOiNlMGI0YjQhaW1wb3J0YW50fS51aS5mb3JtIC5maWVsZC5lcnJvciAudWkuZHJvcGRvd246aG92ZXIsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLmRyb3Bkb3duOmhvdmVye2JvcmRlci1jb2xvcjojZTBiNGI0IWltcG9ydGFudH0udWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLmRyb3Bkb3duOmhvdmVyIC5tZW51LC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC51aS5kcm9wZG93bjpob3ZlciAubWVudXtib3JkZXItY29sb3I6I2UwYjRiNH0udWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLm11bHRpcGxlLnNlbGVjdGlvbi5kcm9wZG93bj4ubGFiZWwsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLm11bHRpcGxlLnNlbGVjdGlvbi5kcm9wZG93bj4ubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZWFjYmNiO2NvbG9yOiM5ZjNhMzh9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5kcm9wZG93biAubWVudSAuaXRlbTpob3ZlciwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAudWkuZHJvcGRvd24gLm1lbnUgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmJlN2U3fS51aS5mb3JtIC5maWVsZC5lcnJvciAudWkuZHJvcGRvd24gLm1lbnUgLnNlbGVjdGVkLml0ZW0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLmRyb3Bkb3duIC5tZW51IC5zZWxlY3RlZC5pdGVte2JhY2tncm91bmQtY29sb3I6I2ZiZTdlN30udWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLmRyb3Bkb3duIC5tZW51IC5hY3RpdmUuaXRlbSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAudWkuZHJvcGRvd24gLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6I2ZkY2ZjZiFpbXBvcnRhbnR9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC5jaGVja2JveDpub3QoLnRvZ2dsZSk6bm90KC5zbGlkZXIpIC5ib3gsLnVpLmZvcm0gLmZpZWxkLmVycm9yIC5jaGVja2JveDpub3QoLnRvZ2dsZSk6bm90KC5zbGlkZXIpIGxhYmVsLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC5jaGVja2JveDpub3QoLnRvZ2dsZSk6bm90KC5zbGlkZXIpIC5ib3gsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLmNoZWNrYm94Om5vdCgudG9nZ2xlKTpub3QoLnNsaWRlcikgbGFiZWx7Y29sb3I6IzlmM2EzOH0udWkuZm9ybSAuZmllbGQuZXJyb3IgLmNoZWNrYm94Om5vdCgudG9nZ2xlKTpub3QoLnNsaWRlcikgLmJveDpiZWZvcmUsLnVpLmZvcm0gLmZpZWxkLmVycm9yIC5jaGVja2JveDpub3QoLnRvZ2dsZSk6bm90KC5zbGlkZXIpIGxhYmVsOmJlZm9yZSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAuY2hlY2tib3g6bm90KC50b2dnbGUpOm5vdCguc2xpZGVyKSAuYm94OmJlZm9yZSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAuY2hlY2tib3g6bm90KC50b2dnbGUpOm5vdCguc2xpZGVyKSBsYWJlbDpiZWZvcmV7YmFja2dyb3VuZDojZmZmNmY2O2JvcmRlci1jb2xvcjojZTBiNGI0fS51aS5mb3JtIC5maWVsZC5lcnJvciAuY2hlY2tib3ggLmJveDphZnRlciwudWkuZm9ybSAuZmllbGQuZXJyb3IgLmNoZWNrYm94IGxhYmVsOmFmdGVyLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC5jaGVja2JveCAuYm94OmFmdGVyLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC5jaGVja2JveCBsYWJlbDphZnRlcntjb2xvcjojOWYzYTM4fS51aS5mb3JtIC5kaXNhYmxlZC5maWVsZCwudWkuZm9ybSAuZGlzYWJsZWQuZmllbGRzIC5maWVsZCwudWkuZm9ybSAuZmllbGQgOmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTouNDV9LnVpLmZvcm0gLmZpZWxkLmRpc2FibGVkPmxhYmVsLC51aS5mb3JtIC5maWVsZHMuZGlzYWJsZWQ+bGFiZWx7b3BhY2l0eTouNDV9LnVpLmZvcm0gLmZpZWxkLmRpc2FibGVkIDpkaXNhYmxlZHtvcGFjaXR5OjF9LnVpLmxvYWRpbmcuZm9ybXtwb3NpdGlvbjpyZWxhdGl2ZTtjdXJzb3I6ZGVmYXVsdDtwb2ludGVyLWV2ZW50czpub25lfS51aS5sb2FkaW5nLmZvcm06YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjA7bGVmdDowO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuOCk7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjEwMH0udWkubG9hZGluZy5mb3JtOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LTEuNWVtIDAgMCAtMS41ZW07d2lkdGg6M2VtO2hlaWdodDozZW07LXdlYmtpdC1hbmltYXRpb246Zm9ybS1zcGluIC42cyBsaW5lYXI7YW5pbWF0aW9uOmZvcm0tc3BpbiAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O3Zpc2liaWxpdHk6dmlzaWJsZTt6LWluZGV4OjEwMX1ALXdlYmtpdC1rZXlmcmFtZXMgZm9ybS1zcGlue2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGZvcm0tc3Bpbntmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LnVpLmZvcm0gLnJlcXVpcmVkLmZpZWxkPi5jaGVja2JveDphZnRlciwudWkuZm9ybSAucmVxdWlyZWQuZmllbGQ+bGFiZWw6YWZ0ZXIsLnVpLmZvcm0gLnJlcXVpcmVkLmZpZWxkcy5ncm91cGVkPmxhYmVsOmFmdGVyLC51aS5mb3JtIC5yZXF1aXJlZC5maWVsZHM6bm90KC5ncm91cGVkKT4uZmllbGQ+LmNoZWNrYm94OmFmdGVyLC51aS5mb3JtIC5yZXF1aXJlZC5maWVsZHM6bm90KC5ncm91cGVkKT4uZmllbGQ+bGFiZWw6YWZ0ZXJ7bWFyZ2luOi0uMmVtIDAgMCAuMmVtO2NvbnRlbnQ6JyonO2NvbG9yOiNkYjI4Mjh9LnVpLmZvcm0gLnJlcXVpcmVkLmZpZWxkPmxhYmVsOmFmdGVyLC51aS5mb3JtIC5yZXF1aXJlZC5maWVsZHMuZ3JvdXBlZD5sYWJlbDphZnRlciwudWkuZm9ybSAucmVxdWlyZWQuZmllbGRzOm5vdCguZ3JvdXBlZCk+LmZpZWxkPmxhYmVsOmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOnRvcH0udWkuZm9ybSAucmVxdWlyZWQuZmllbGQ+LmNoZWNrYm94OmFmdGVyLC51aS5mb3JtIC5yZXF1aXJlZC5maWVsZHM6bm90KC5ncm91cGVkKT4uZmllbGQ+LmNoZWNrYm94OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MTAwJX0udWkuZm9ybSAuaW52ZXJ0ZWQuc2VnbWVudCAudWkuY2hlY2tib3ggLmJveCwudWkuZm9ybSAuaW52ZXJ0ZWQuc2VnbWVudCAudWkuY2hlY2tib3ggbGFiZWwsLnVpLmZvcm0gLmludmVydGVkLnNlZ21lbnQgbGFiZWwsLnVpLmludmVydGVkLmZvcm0gLmlubGluZS5maWVsZD5sYWJlbCwudWkuaW52ZXJ0ZWQuZm9ybSAuaW5saW5lLmZpZWxkPnAsLnVpLmludmVydGVkLmZvcm0gLmlubGluZS5maWVsZHMgLmZpZWxkPmxhYmVsLC51aS5pbnZlcnRlZC5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD5wLC51aS5pbnZlcnRlZC5mb3JtIC5pbmxpbmUuZmllbGRzPmxhYmVsLC51aS5pbnZlcnRlZC5mb3JtIC51aS5jaGVja2JveCAuYm94LC51aS5pbnZlcnRlZC5mb3JtIC51aS5jaGVja2JveCBsYWJlbCwudWkuaW52ZXJ0ZWQuZm9ybSBsYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dDpub3QoW3R5cGVdKSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPWRhdGVdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9ZW1haWxdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9ZmlsZV0sLnVpLmludmVydGVkLmZvcm0gaW5wdXRbdHlwZT1udW1iZXJdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9cGFzc3dvcmRdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9c2VhcmNoXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPXRlbF0sLnVpLmludmVydGVkLmZvcm0gaW5wdXRbdHlwZT10ZXh0XSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPXRpbWVdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9dXJsXXtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmZvcm0gLmdyb3VwZWQuZmllbGRze2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgMCAxZW19LnVpLmZvcm0gLmdyb3VwZWQuZmllbGRzOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5mb3JtIC5ncm91cGVkLmZpZWxkcz5sYWJlbHttYXJnaW46MCAwIC4yODU3MTQyOXJlbSAwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtmb250LXNpemU6LjkyODU3MTQzZW07Zm9udC13ZWlnaHQ6NzAwO3RleHQtdHJhbnNmb3JtOm5vbmV9LnVpLmZvcm0gLmdyb3VwZWQuZmllbGRzIC5maWVsZCwudWkuZm9ybSAuZ3JvdXBlZC5pbmxpbmUuZmllbGRzIC5maWVsZHtkaXNwbGF5OmJsb2NrO21hcmdpbjouNWVtIDA7cGFkZGluZzowfS51aS5mb3JtIC5maWVsZHN7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzttYXJnaW46MCAtLjVlbSAxZW19LnVpLmZvcm0gLmZpZWxkcz4uZmllbGR7ZmxleDowIDEgYXV0bztwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0Oi41ZW19LnVpLmZvcm0gLmZpZWxkcz4uZmllbGQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmZvcm0gLnR3by5maWVsZHM+LmZpZWxkLC51aS5mb3JtIC50d28uZmllbGRzPi5maWVsZHN7d2lkdGg6NTAlfS51aS5mb3JtIC50aHJlZS5maWVsZHM+LmZpZWxkLC51aS5mb3JtIC50aHJlZS5maWVsZHM+LmZpZWxkc3t3aWR0aDozMy4zMzMzMzMzMyV9LnVpLmZvcm0gLmZvdXIuZmllbGRzPi5maWVsZCwudWkuZm9ybSAuZm91ci5maWVsZHM+LmZpZWxkc3t3aWR0aDoyNSV9LnVpLmZvcm0gLmZpdmUuZmllbGRzPi5maWVsZCwudWkuZm9ybSAuZml2ZS5maWVsZHM+LmZpZWxkc3t3aWR0aDoyMCV9LnVpLmZvcm0gLnNpeC5maWVsZHM+LmZpZWxkLC51aS5mb3JtIC5zaXguZmllbGRzPi5maWVsZHN7d2lkdGg6MTYuNjY2NjY2NjclfS51aS5mb3JtIC5zZXZlbi5maWVsZHM+LmZpZWxkLC51aS5mb3JtIC5zZXZlbi5maWVsZHM+LmZpZWxkc3t3aWR0aDoxNC4yODU3MTQyOSV9LnVpLmZvcm0gLmVpZ2h0LmZpZWxkcz4uZmllbGQsLnVpLmZvcm0gLmVpZ2h0LmZpZWxkcz4uZmllbGRze3dpZHRoOjEyLjUlfS51aS5mb3JtIC5uaW5lLmZpZWxkcz4uZmllbGQsLnVpLmZvcm0gLm5pbmUuZmllbGRzPi5maWVsZHN7d2lkdGg6MTEuMTExMTExMTElfS51aS5mb3JtIC50ZW4uZmllbGRzPi5maWVsZCwudWkuZm9ybSAudGVuLmZpZWxkcz4uZmllbGRze3dpZHRoOjEwJX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5mb3JtIC5maWVsZHN7ZmxleC13cmFwOndyYXB9LnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmVpZ2h0LmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmVpZ2h0LmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maXZlLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpdmUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZvdXIuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZm91ci5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAubmluZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5uaW5lLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5zZXZlbi5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5zZXZlbi5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuc2l4LmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnNpeC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudGVuLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnRlbi5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudGhyZWUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudGhyZWUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnR3by5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50d28uZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgW2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aVtjbGFzcyo9XFxcImVxdWFsIHdpZHRoXFxcIl0uZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzPi5maWVsZHt3aWR0aDoxMDAlIWltcG9ydGFudDttYXJnaW46MCAwIDFlbX19LnVpLmZvcm0gLmZpZWxkcyAud2lkZS5maWVsZHt3aWR0aDo2LjI1JTtwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0Oi41ZW19LnVpLmZvcm0gLm9uZS53aWRlLmZpZWxke3dpZHRoOjYuMjUlIWltcG9ydGFudH0udWkuZm9ybSAudHdvLndpZGUuZmllbGR7d2lkdGg6MTIuNSUhaW1wb3J0YW50fS51aS5mb3JtIC50aHJlZS53aWRlLmZpZWxke3dpZHRoOjE4Ljc1JSFpbXBvcnRhbnR9LnVpLmZvcm0gLmZvdXIud2lkZS5maWVsZHt3aWR0aDoyNSUhaW1wb3J0YW50fS51aS5mb3JtIC5maXZlLndpZGUuZmllbGR7d2lkdGg6MzEuMjUlIWltcG9ydGFudH0udWkuZm9ybSAuc2l4LndpZGUuZmllbGR7d2lkdGg6MzcuNSUhaW1wb3J0YW50fS51aS5mb3JtIC5zZXZlbi53aWRlLmZpZWxke3dpZHRoOjQzLjc1JSFpbXBvcnRhbnR9LnVpLmZvcm0gLmVpZ2h0LndpZGUuZmllbGR7d2lkdGg6NTAlIWltcG9ydGFudH0udWkuZm9ybSAubmluZS53aWRlLmZpZWxke3dpZHRoOjU2LjI1JSFpbXBvcnRhbnR9LnVpLmZvcm0gLnRlbi53aWRlLmZpZWxke3dpZHRoOjYyLjUlIWltcG9ydGFudH0udWkuZm9ybSAuZWxldmVuLndpZGUuZmllbGR7d2lkdGg6NjguNzUlIWltcG9ydGFudH0udWkuZm9ybSAudHdlbHZlLndpZGUuZmllbGR7d2lkdGg6NzUlIWltcG9ydGFudH0udWkuZm9ybSAudGhpcnRlZW4ud2lkZS5maWVsZHt3aWR0aDo4MS4yNSUhaW1wb3J0YW50fS51aS5mb3JtIC5mb3VydGVlbi53aWRlLmZpZWxke3dpZHRoOjg3LjUlIWltcG9ydGFudH0udWkuZm9ybSAuZmlmdGVlbi53aWRlLmZpZWxke3dpZHRoOjkzLjc1JSFpbXBvcnRhbnR9LnVpLmZvcm0gLnNpeHRlZW4ud2lkZS5maWVsZHt3aWR0aDoxMDAlIWltcG9ydGFudH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmVpZ2h0LndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZWxldmVuLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmlmdGVlbi53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpdmUud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5mb3VyLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZm91cnRlZW4ud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5uaW5lLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uc2V2ZW4ud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5zaXgud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5zaXh0ZWVuLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4udGVuLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4udGhpcnRlZW4ud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi50aHJlZS53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LnR3ZWx2ZS53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LnR3by53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maXZlLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpdmUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZvdXIuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZm91ci5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudGhyZWUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudGhyZWUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnR3by5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50d28uZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHN7d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnVpLmZvcm0gLmZpZWxkc3ttYXJnaW4tYm90dG9tOjB9fS51aS5mb3JtIFtjbGFzcyo9XFxcImVxdWFsIHdpZHRoXFxcIl0uZmllbGRzPi5maWVsZCwudWlbY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLmZvcm0gLmZpZWxkcz4uZmllbGR7d2lkdGg6MTAwJTtmbGV4OjEgMSBhdXRvfS51aS5mb3JtIC5pbmxpbmUuZmllbGRze21hcmdpbjowIDAgMWVtO2FsaWduLWl0ZW1zOmNlbnRlcn0udWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGR7bWFyZ2luOjA7cGFkZGluZzowIDFlbSAwIDB9LnVpLmZvcm0gLmlubGluZS5maWVsZD5sYWJlbCwudWkuZm9ybSAuaW5saW5lLmZpZWxkPnAsLnVpLmZvcm0gLmlubGluZS5maWVsZHMgLmZpZWxkPmxhYmVsLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD5wLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzPmxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtmb250LXNpemU6LjkyODU3MTQzZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTt0ZXh0LXRyYW5zZm9ybTpub25lfS51aS5mb3JtIC5pbmxpbmUuZmllbGRzPmxhYmVse21hcmdpbjouMDM1NzE0ZW0gMWVtIDAgMH0udWkuZm9ybSAuaW5saW5lLmZpZWxkPmlucHV0LC51aS5mb3JtIC5pbmxpbmUuZmllbGQ+c2VsZWN0LC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD5pbnB1dCwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQ+c2VsZWN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjFlbX0udWkuZm9ybSAuaW5saW5lLmZpZWxkPjpmaXJzdC1jaGlsZCwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQ+OmZpcnN0LWNoaWxke21hcmdpbjowIC44NTcxNDI4NmVtIDAgMH0udWkuZm9ybSAuaW5saW5lLmZpZWxkPjpvbmx5LWNoaWxkLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD46b25seS1jaGlsZHttYXJnaW46MH0udWkuZm9ybSAuaW5saW5lLmZpZWxkcyAud2lkZS5maWVsZHtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyfS51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC53aWRlLmZpZWxkPmlucHV0LC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC53aWRlLmZpZWxkPnNlbGVjdHt3aWR0aDoxMDAlfS51aS5taW5pLmZvcm17Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5mb3Jte2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLmZvcm17Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuZm9ybXtmb250LXNpemU6MXJlbX0udWkubGFyZ2UuZm9ybXtmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuYmlnLmZvcm17Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmh1Z2UuZm9ybXtmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5mb3Jte2ZvbnQtc2l6ZToxLjcxNDI4NTcxcmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBHcmlkXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuZ3JpZHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOnN0cmV0Y2g7cGFkZGluZzowfS51aS5ncmlke21hcmdpbi10b3A6LTFyZW07bWFyZ2luLWJvdHRvbTotMXJlbTttYXJnaW4tbGVmdDotMXJlbTttYXJnaW4tcmlnaHQ6LTFyZW19LnVpLnJlbGF4ZWQuZ3JpZHttYXJnaW4tbGVmdDotMS41cmVtO21hcmdpbi1yaWdodDotMS41cmVtfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmdyaWR7bWFyZ2luLWxlZnQ6LTIuNXJlbTttYXJnaW4tcmlnaHQ6LTIuNXJlbX0udWkuZ3JpZCsuZ3JpZHttYXJnaW4tdG9wOjFyZW19LnVpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLmdyaWQ+LnJvdz4uY29sdW1ue3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjYuMjUlO3BhZGRpbmctbGVmdDoxcmVtO3BhZGRpbmctcmlnaHQ6MXJlbTt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmdyaWQ+KntwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnVpLmdyaWQ+LnJvd3twb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDppbmhlcml0O2FsaWduLWl0ZW1zOnN0cmV0Y2g7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7cGFkZGluZzowO3BhZGRpbmctdG9wOjFyZW07cGFkZGluZy1ib3R0b206MXJlbX0udWkuZ3JpZD4uY29sdW1uOm5vdCgucm93KXtwYWRkaW5nLXRvcDoxcmVtO3BhZGRpbmctYm90dG9tOjFyZW19LnVpLmdyaWQ+LnJvdz4uY29sdW1ue21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LnVpLmdyaWQ+LnJvdz4uY29sdW1uPmltZywudWkuZ3JpZD4ucm93PmltZ3ttYXgtd2lkdGg6MTAwJX0udWkuZ3JpZD4udWkuZ3JpZDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLmdyaWQ+LnVpLmdyaWQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLmFsaWduZWQuZ3JpZCAuY29sdW1uPi5zZWdtZW50Om5vdCguY29tcGFjdCk6bm90KC5hdHRhY2hlZCksLnVpLmdyaWQgLmFsaWduZWQucm93Pi5jb2x1bW4+LnNlZ21lbnQ6bm90KC5jb21wYWN0KTpub3QoLmF0dGFjaGVkKXt3aWR0aDoxMDAlfS51aS5ncmlkIC5yb3crLnVpLmRpdmlkZXJ7ZmxleC1ncm93OjE7bWFyZ2luOjFyZW0gMXJlbX0udWkuZ3JpZCAuY29sdW1uKy51aS52ZXJ0aWNhbC5kaXZpZGVye2hlaWdodDpjYWxjKDUwJSAtIDFyZW0pfS51aS5ncmlkPi5jb2x1bW46bGFzdC1jaGlsZD4uaG9yaXpvbnRhbC5zZWdtZW50LC51aS5ncmlkPi5yb3c+LmNvbHVtbjpsYXN0LWNoaWxkPi5ob3Jpem9udGFsLnNlZ21lbnR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkucGFnZS5ncmlke3dpZHRoOmF1dG87bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MmVtO3BhZGRpbmctcmlnaHQ6MmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjMlO3BhZGRpbmctcmlnaHQ6MyV9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMjAwcHgpIGFuZCAobWF4LXdpZHRoOjE5MTlweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE1JTtwYWRkaW5nLXJpZ2h0OjE1JX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjIzJTtwYWRkaW5nLXJpZ2h0OjIzJX19LnVpLmdyaWQ+LmNvbHVtbjpvbmx5LWNoaWxkLC51aS5ncmlkPi5yb3c+LmNvbHVtbjpvbmx5LWNoaWxke3dpZHRoOjEwMCV9LnVpW2NsYXNzKj1cXFwib25lIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwib25lIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjEwMCV9LnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJX0udWlbY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInRocmVlIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJX0udWlbY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZm91ciBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyNSV9LnVpW2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImZpdmUgY29sdW1uXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjAlfS51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNi42NjY2NjY2NyV9LnVpW2NsYXNzKj1cXFwic2V2ZW4gY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJzZXZlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNC4yODU3MTQyOSV9LnVpW2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlaWdodCBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxMi41JX0udWlbY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwibmluZSBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxMS4xMTExMTExMSV9LnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjEwJX0udWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6OS4wOTA5MDkwOSV9LnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjguMzMzMzMzMzMlfS51aVtjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6Ny42OTIzMDc2OSV9LnVpW2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmb3VydGVlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo3LjE0Mjg1NzE0JX0udWlbY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZmlmdGVlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo2LjY2NjY2NjY3JX0udWlbY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwic2l4dGVlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo2LjI1JX0udWkuZ3JpZD5bY2xhc3MqPVxcXCJvbmUgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5yb3c+LmNvbHVtbnt3aWR0aDoyMCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5yb3c+LmNvbHVtbnt3aWR0aDoxNi42NjY2NjY2NyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjE0LjI4NTcxNDI5JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTIuNSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcIm5pbmUgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTEuMTExMTExMTElIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6OS4wOTA5MDkwOSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSBjb2x1bW5cXFwiXS5yb3c+LmNvbHVtbnt3aWR0aDo4LjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6Ny42OTIzMDc2OSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjcuMTQyODU3MTQlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjYuNjY2NjY2NjclIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjYuMjUlIWltcG9ydGFudH0udWkuY2VsbGVkLnBhZ2UuZ3JpZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcIm9uZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwib25lIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0d28gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInR3byB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjE4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91ciB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpdmUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeCB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwic2l4IHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6MzcuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjU2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGVuIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVsZXZlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6NzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZVxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjkzLjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4dGVlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDozMjBweCkgYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo0My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm5pbmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo2Mi41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW57d2lkdGg6ODEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo0My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm5pbmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo2Mi41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW57d2lkdGg6ODEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo5OTJweCl7LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcIm9uZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwib25lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0d28gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInR3byB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjE4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91ciB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpdmUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwic2l4IHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6MzcuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjU2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6NzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjkzLjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4dGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KSBhbmQgKG1heC13aWR0aDoxOTE5cHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo0My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm5pbmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo2Mi41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6ODEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxOTIwcHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcIm9uZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJvbmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0d28gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInR3byB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MTIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRocmVlIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZpdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MzEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwic2l4IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXggd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NjguNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjg3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fX0udWkuY2VudGVyZWQuZ3JpZCwudWkuY2VudGVyZWQuZ3JpZD4ucm93LC51aS5ncmlkPi5jZW50ZXJlZC5yb3d7dGV4dC1hbGlnbjpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0udWkuY2VudGVyZWQuZ3JpZD4uY29sdW1uOm5vdCguYWxpZ25lZCk6bm90KC5qdXN0aWZpZWQpOm5vdCgucm93KSwudWkuY2VudGVyZWQuZ3JpZD4ucm93Pi5jb2x1bW46bm90KC5hbGlnbmVkKTpub3QoLmp1c3RpZmllZCksLnVpLmdyaWQgLmNlbnRlcmVkLnJvdz4uY29sdW1uOm5vdCguYWxpZ25lZCk6bm90KC5qdXN0aWZpZWQpe3RleHQtYWxpZ246bGVmdH0udWkuZ3JpZD4uY2VudGVyZWQuY29sdW1uLC51aS5ncmlkPi5yb3c+LmNlbnRlcmVkLmNvbHVtbntkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLmdyaWQ+LnJlbGF4ZWQucm93Pi5jb2x1bW4sLnVpLnJlbGF4ZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkucmVsYXhlZC5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nLWxlZnQ6MS41cmVtO3BhZGRpbmctcmlnaHQ6MS41cmVtfS51aS5ncmlkPltjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57cGFkZGluZy1sZWZ0OjIuNXJlbTtwYWRkaW5nLXJpZ2h0OjIuNXJlbX0udWkuZ3JpZCAucmVsYXhlZC5yb3crLnVpLmRpdmlkZXIsLnVpLnJlbGF4ZWQuZ3JpZCAucm93Ky51aS5kaXZpZGVye21hcmdpbi1sZWZ0OjEuNXJlbTttYXJnaW4tcmlnaHQ6MS41cmVtfS51aS5ncmlkIFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLnJvdysudWkuZGl2aWRlciwudWlbY2xhc3MqPVxcXCJ2ZXJ5IHJlbGF4ZWRcXFwiXS5ncmlkIC5yb3crLnVpLmRpdmlkZXJ7bWFyZ2luLWxlZnQ6Mi41cmVtO21hcmdpbi1yaWdodDoyLjVyZW19LnVpLnBhZGRlZC5ncmlkOm5vdCgudmVydGljYWxseSk6bm90KC5ob3Jpem9udGFsbHkpe21hcmdpbjowIWltcG9ydGFudH1bY2xhc3MqPVxcXCJob3Jpem9udGFsbHkgcGFkZGVkXFxcIl0udWkuZ3JpZHttYXJnaW4tbGVmdDowIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6MCFpbXBvcnRhbnR9W2NsYXNzKj1cXFwidmVydGljYWxseSBwYWRkZWRcXFwiXS51aS5ncmlke21hcmdpbi10b3A6MCFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH0udWkuZ3JpZCBbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5jb2x1bW57bWFyZ2luLXJpZ2h0OmF1dG99LnVpLmdyaWQgW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmNvbHVtbnttYXJnaW4tbGVmdDphdXRvfS51aS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOm5vdCgucm93KSwudWkuZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aVtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57bWFyZ2luLXRvcDoxcmVtO21hcmdpbi1ib3R0b206MXJlbTtwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjB9LnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93e21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LnVpLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46Zmlyc3QtY2hpbGQsLnVpLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmZpcnN0LWNoaWxkPi5jb2x1bW57bWFyZ2luLXRvcDowfS51aS5ncmlkPi5kaXZpZGVkLnJvdz4uY29sdW1uey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ncmlkPi5kaXZpZGVkLnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWlbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXS5ncmlkPi5yb3d7cG9zaXRpb246cmVsYXRpdmV9LnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OlxcXCJcXFwiO3RvcDowO2xlZnQ6MDt3aWR0aDpjYWxjKDEwMCUgLSAycmVtKTtoZWlnaHQ6MXB4O21hcmdpbjowIDFyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnBhZGRlZC5kaXZpZGVkLmdyaWQ6bm90KC52ZXJ0aWNhbGx5KTpub3QoLmhvcml6b250YWxseSksW2NsYXNzKj1cXFwiaG9yaXpvbnRhbGx5IHBhZGRlZFxcXCJdLnVpLmRpdmlkZWQuZ3JpZHt3aWR0aDoxMDAlfS51aVtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdLmdyaWQ+LnJvdzpmaXJzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOm5vdCgucm93KSwudWkuaW52ZXJ0ZWQuZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpO2JveC1zaGFkb3c6LTFweCAwIDAgMCByZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuaW52ZXJ0ZWQuZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LmNvbHVtbjpub3QoLnJvdyk6Zmlyc3QtY2hpbGQsLnVpLmludmVydGVkLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmJlZm9yZXstd2Via2l0LWJveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLnJlbGF4ZWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXS5ncmlkPi5yb3c6YmVmb3Jle21hcmdpbi1sZWZ0OjEuNXJlbTttYXJnaW4tcmlnaHQ6MS41cmVtO3dpZHRoOmNhbGMoMTAwJSAtIDNyZW0pfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmJlZm9yZXttYXJnaW4tbGVmdDo1cmVtO21hcmdpbi1yaWdodDo1cmVtO3dpZHRoOmNhbGMoMTAwJSAtIDVyZW0pfS51aS5jZWxsZWQuZ3JpZHt3aWR0aDoxMDAlO21hcmdpbjoxZW0gMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDU7Ym94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNX0udWkuY2VsbGVkLmdyaWQ+LnJvd3t3aWR0aDoxMDAlIWltcG9ydGFudDttYXJnaW46MDtwYWRkaW5nOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgLTFweCAwIDAgI2Q0ZDRkNX0udWkuY2VsbGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbnstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1O2JveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1fS51aS5jZWxsZWQuZ3JpZD4uY29sdW1uOmZpcnN0LWNoaWxkLC51aS5jZWxsZWQuZ3JpZD4ucm93Pi5jb2x1bW46Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5jZWxsZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1ue3BhZGRpbmc6MWVtfS51aS5yZWxheGVkLmNlbGxlZC5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aS5yZWxheGVkLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nOjEuNWVtfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmNlbGxlZC5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nOjJlbX0udWlbY2xhc3MqPVxcXCJpbnRlcm5hbGx5IGNlbGxlZFxcXCJdLmdyaWR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO21hcmdpbjowfS51aVtjbGFzcyo9XFxcImludGVybmFsbHkgY2VsbGVkXFxcIl0uZ3JpZD4ucm93OmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWlbY2xhc3MqPVxcXCJpbnRlcm5hbGx5IGNlbGxlZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uY29sdW1uOm5vdCgucm93KSwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt2ZXJ0aWNhbC1hbGlnbjp0b3A7YWxpZ24tc2VsZjpmbGV4LXN0YXJ0IWltcG9ydGFudH0udWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0uY29sdW1uOm5vdCgucm93KSwudWkuZ3JpZD5bY2xhc3MqPVxcXCJtaWRkbGUgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJtaWRkbGUgYWxpZ25lZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7YWxpZ24tc2VsZjpjZW50ZXIhaW1wb3J0YW50fS51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXS5jb2x1bW46bm90KC5yb3cpLC51aS5ncmlkPltjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0ucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57ZmxleC1kaXJlY3Rpb246Y29sdW1uO3ZlcnRpY2FsLWFsaWduOmJvdHRvbTthbGlnbi1zZWxmOmZsZXgtZW5kIWltcG9ydGFudH0udWkuZ3JpZD4ucm93Pi5zdHJldGNoZWQuY29sdW1uLC51aS5ncmlkPi5zdHJldGNoZWQuY29sdW1uOm5vdCgucm93KSwudWkuZ3JpZD4uc3RyZXRjaGVkLnJvdz4uY29sdW1uLC51aS5zdHJldGNoZWQuZ3JpZD4uY29sdW1uLC51aS5zdHJldGNoZWQuZ3JpZD4ucm93Pi5jb2x1bW57ZGlzcGxheTppbmxpbmUtZmxleCFpbXBvcnRhbnQ7YWxpZ24tc2VsZjpzdHJldGNoO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWkuZ3JpZD4ucm93Pi5zdHJldGNoZWQuY29sdW1uPiosLnVpLmdyaWQ+LnN0cmV0Y2hlZC5jb2x1bW46bm90KC5yb3cpPiosLnVpLmdyaWQ+LnN0cmV0Y2hlZC5yb3c+LmNvbHVtbj4qLC51aS5zdHJldGNoZWQuZ3JpZD4uY29sdW1uPiosLnVpLnN0cmV0Y2hlZC5ncmlkPi5yb3c+LmNvbHVtbj4qe2ZsZXgtZ3JvdzoxfS51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0uY29sdW1uLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJsZWZ0IGFsaWduZWRcXFwiXS5jb2x1bW4uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLmdyaWQ+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJsZWZ0IGFsaWduZWRcXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt0ZXh0LWFsaWduOmxlZnQ7YWxpZ24tc2VsZjppbmhlcml0fS51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXS5jb2x1bW4uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0uY29sdW1uLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0uZ3JpZD4uY29sdW1uLC51aVtjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57dGV4dC1hbGlnbjpjZW50ZXI7YWxpZ24tc2VsZjppbmhlcml0fS51aVtjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0uZ3JpZHtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInJpZ2h0IGFsaWduZWRcXFwiXS5ncmlkPi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3RleHQtYWxpZ246cmlnaHQ7YWxpZ24tc2VsZjppbmhlcml0fS51aS5ncmlkPi5qdXN0aWZpZWQuY29sdW1uLmNvbHVtbiwudWkuZ3JpZD4uanVzdGlmaWVkLnJvdz4uY29sdW1uLC51aS5ncmlkPi5yb3c+Lmp1c3RpZmllZC5jb2x1bW4uY29sdW1uLC51aS5qdXN0aWZpZWQuZ3JpZD4uY29sdW1uLC51aS5qdXN0aWZpZWQuZ3JpZD4ucm93Pi5jb2x1bW57dGV4dC1hbGlnbjpqdXN0aWZ5Oy13ZWJraXQtaHlwaGVuczphdXRvOy1tcy1oeXBoZW5zOmF1dG87aHlwaGVuczphdXRvfS51aS5ncmlkPi5yb3c+LmJsYWNrLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5ibHVlLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5icm93bi5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4uZ3JlZW4uY29sdW1uLC51aS5ncmlkPi5yb3c+LmdyZXkuY29sdW1uLC51aS5ncmlkPi5yb3c+Lm9saXZlLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5vcmFuZ2UuY29sdW1uLC51aS5ncmlkPi5yb3c+LnBpbmsuY29sdW1uLC51aS5ncmlkPi5yb3c+LnB1cnBsZS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4ucmVkLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi50ZWFsLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi52aW9sZXQuY29sdW1uLC51aS5ncmlkPi5yb3c+LnllbGxvdy5jb2x1bW57bWFyZ2luLXRvcDotMXJlbTttYXJnaW4tYm90dG9tOi0xcmVtO3BhZGRpbmctdG9wOjFyZW07cGFkZGluZy1ib3R0b206MXJlbX0udWkuZ3JpZD4ucmVkLmNvbHVtbiwudWkuZ3JpZD4ucmVkLnJvdywudWkuZ3JpZD4ucm93Pi5yZWQuY29sdW1ue2JhY2tncm91bmQtY29sb3I6I2RiMjgyOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ub3JhbmdlLmNvbHVtbiwudWkuZ3JpZD4ub3JhbmdlLnJvdywudWkuZ3JpZD4ucm93Pi5vcmFuZ2UuY29sdW1ue2JhY2tncm91bmQtY29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ucm93Pi55ZWxsb3cuY29sdW1uLC51aS5ncmlkPi55ZWxsb3cuY29sdW1uLC51aS5ncmlkPi55ZWxsb3cucm93e2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ub2xpdmUuY29sdW1uLC51aS5ncmlkPi5vbGl2ZS5yb3csLnVpLmdyaWQ+LnJvdz4ub2xpdmUuY29sdW1ue2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4uZ3JlZW4uY29sdW1uLC51aS5ncmlkPi5ncmVlbi5yb3csLnVpLmdyaWQ+LnJvdz4uZ3JlZW4uY29sdW1ue2JhY2tncm91bmQtY29sb3I6IzIxYmE0NSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ucm93Pi50ZWFsLmNvbHVtbiwudWkuZ3JpZD4udGVhbC5jb2x1bW4sLnVpLmdyaWQ+LnRlYWwucm93e2JhY2tncm91bmQtY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4uYmx1ZS5jb2x1bW4sLnVpLmdyaWQ+LmJsdWUucm93LC51aS5ncmlkPi5yb3c+LmJsdWUuY29sdW1ue2JhY2tncm91bmQtY29sb3I6IzIxODVkMCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ucm93Pi52aW9sZXQuY29sdW1uLC51aS5ncmlkPi52aW9sZXQuY29sdW1uLC51aS5ncmlkPi52aW9sZXQucm93e2JhY2tncm91bmQtY29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ucHVycGxlLmNvbHVtbiwudWkuZ3JpZD4ucHVycGxlLnJvdywudWkuZ3JpZD4ucm93Pi5wdXJwbGUuY29sdW1ue2JhY2tncm91bmQtY29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4ucGluay5jb2x1bW4sLnVpLmdyaWQ+LnBpbmsucm93LC51aS5ncmlkPi5yb3c+LnBpbmsuY29sdW1ue2JhY2tncm91bmQtY29sb3I6I2UwMzk5NyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4uYnJvd24uY29sdW1uLC51aS5ncmlkPi5icm93bi5yb3csLnVpLmdyaWQ+LnJvdz4uYnJvd24uY29sdW1ue2JhY2tncm91bmQtY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4uZ3JleS5jb2x1bW4sLnVpLmdyaWQ+LmdyZXkucm93LC51aS5ncmlkPi5yb3c+LmdyZXkuY29sdW1ue2JhY2tncm91bmQtY29sb3I6Izc2NzY3NiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD4uYmxhY2suY29sdW1uLC51aS5ncmlkPi5ibGFjay5yb3csLnVpLmdyaWQ+LnJvdz4uYmxhY2suY29sdW1ue2JhY2tncm91bmQtY29sb3I6IzFiMWMxZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuZ3JpZD5bY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImVxdWFsIHdpZHRoXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZsZXgtZ3JvdzoxfS51aS5ncmlkPltjbGFzcyo9XFxcImVxdWFsIHdpZHRoXFxcIl0ucm93Pi53aWRlLmNvbHVtbiwudWlbY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLmdyaWQ+LnJvdz4ud2lkZS5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5ncmlkPi53aWRlLmNvbHVtbntmbGV4LWdyb3c6MH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5ncmlkPltjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLnJvdywudWlbY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXS5ncmlkLC51aVtjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLmdyaWQ+LnJvd3tmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0udWkuc3RhY2thYmxlW2NsYXNzKj1cXFwibW9iaWxlIHJldmVyc2VkXFxcIl0sLnVpW2NsYXNzKj1cXFwibW9iaWxlIHZlcnRpY2FsbHkgcmV2ZXJzZWRcXFwiXS5ncmlke2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS51aVtjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46Zmlyc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwibW9iaWxlIHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aVtjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46bGFzdC1jaGlsZCwudWlbY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4ucm93Pi5jb2x1bW46bGFzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmdyaWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXVtjbGFzcyo9XFxcIm1vYmlsZSB2ZXJ0aWNhbGx5IHJldmVyc2VkXFxcIl0+LnJvdzpmaXJzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmdyaWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXVtjbGFzcyo9XFxcIm1vYmlsZSB2ZXJ0aWNhbGx5IHJldmVyc2VkXFxcIl0+LnJvdzpsYXN0LWNoaWxkOmJlZm9yZXstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpW2NsYXNzKj1cXFwibW9iaWxlIHJldmVyc2VkXFxcIl0uY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwICNkNGQ0ZDU7Ym94LXNoYWRvdzotMXB4IDAgMCAwICNkNGQ0ZDV9LnVpW2NsYXNzKj1cXFwibW9iaWxlIHJldmVyc2VkXFxcIl0uY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1uOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0YWJsZXQgcmV2ZXJzZWRcXFwiXS5yb3csLnVpW2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0uZ3JpZCwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgcmV2ZXJzZWRcXFwiXS5ncmlkPi5yb3d7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2V9LnVpW2NsYXNzKj1cXFwidGFibGV0IHZlcnRpY2FsbHkgcmV2ZXJzZWRcXFwiXS5ncmlke2ZsZXgtZGlyZWN0aW9uOmNvbHVtbi1yZXZlcnNlfS51aVtjbGFzcyo9XFxcInRhYmxldCByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46Zmlyc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aVtjbGFzcyo9XFxcInRhYmxldCByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46bGFzdC1jaGlsZCwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4ucm93Pi5jb2x1bW46bGFzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmdyaWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXVtjbGFzcyo9XFxcInRhYmxldCB2ZXJ0aWNhbGx5IHJldmVyc2VkXFxcIl0+LnJvdzpmaXJzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmdyaWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXVtjbGFzcyo9XFxcInRhYmxldCB2ZXJ0aWNhbGx5IHJldmVyc2VkXFxcIl0+LnJvdzpsYXN0LWNoaWxkOmJlZm9yZXstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpW2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0uY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwICNkNGQ0ZDU7Ym94LXNoYWRvdzotMXB4IDAgMCAwICNkNGQ0ZDV9LnVpW2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0uY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1uOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5ncmlkPltjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0ucm93LC51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0uZ3JpZCwudWlbY2xhc3MqPVxcXCJjb21wdXRlciByZXZlcnNlZFxcXCJdLmdyaWQ+LnJvd3tmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0udWlbY2xhc3MqPVxcXCJjb21wdXRlciB2ZXJ0aWNhbGx5IHJldmVyc2VkXFxcIl0uZ3JpZHtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0udWlbY2xhc3MqPVxcXCJjb21wdXRlciByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46Zmlyc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4ucm93Pi5jb2x1bW46Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6LTFweCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOmxhc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4ucm93Pi5jb2x1bW46bGFzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmdyaWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXVtjbGFzcyo9XFxcImNvbXB1dGVyIHZlcnRpY2FsbHkgcmV2ZXJzZWRcXFwiXT4ucm93OmZpcnN0LWNoaWxkOmJlZm9yZXstd2Via2l0LWJveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuZ3JpZFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdW2NsYXNzKj1cXFwiY29tcHV0ZXIgdmVydGljYWxseSByZXZlcnNlZFxcXCJdPi5yb3c6bGFzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0uY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwICNkNGQ0ZDU7Ym94LXNoYWRvdzotMXB4IDAgMCAwICNkNGQ0ZDV9LnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgcmV2ZXJzZWRcXFwiXS5jZWxsZWQuZ3JpZD4ucm93Pi5jb2x1bW46bGFzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS5kb3VibGluZy5ncmlke3dpZHRoOmF1dG99LnVpLmRvdWJsaW5nLmdyaWQ+LnJvdywudWkuZ3JpZD4uZG91Ymxpbmcucm93e21hcmdpbjowIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50fS51aS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbiwudWkuZ3JpZD4uZG91Ymxpbmcucm93Pi5jb2x1bW57ZGlzcGxheTppbmxpbmUtYmxvY2shaW1wb3J0YW50O3BhZGRpbmctdG9wOjFyZW0haW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjFyZW0haW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O21hcmdpbjowfS51aS5ncmlkPltjbGFzcyo9XFxcInR3byBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInRocmVlIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInRocmVlIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91ciBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZm91ciBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImZvdXIgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJmaXZlIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDozMy4zMzMzMzMzMyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwic2l4IGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwic2l4IGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwic2V2ZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlaWdodCBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyNSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcIm5pbmUgY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcIm5pbmUgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImVsZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImVsZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyMCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjE2LjY2NjY2NjY3JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MTYuNjY2NjY2NjclIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmb3VydGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNC4yODU3MTQyOSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImZpZnRlZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjE0LjI4NTcxNDI5JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4dGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwic2l4dGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNpeHRlZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MTIuNSUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5kb3VibGluZy5ncmlkPi5yb3csLnVpLmdyaWQ+LmRvdWJsaW5nLnJvd3ttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudH0udWkuZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW4sLnVpLmdyaWQ+LmRvdWJsaW5nLnJvdz4uY29sdW1ue3BhZGRpbmctdG9wOjFyZW0haW1wb3J0YW50O3BhZGRpbmctYm90dG9tOjFyZW0haW1wb3J0YW50O21hcmdpbjowIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0d28gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0d28gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxMDAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInRocmVlIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInRocmVlIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo1MCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImZvdXIgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImZpdmUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXggY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJzaXggY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwic2l4IGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo1MCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwic2V2ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwic2V2ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJlaWdodCBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlaWdodCBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwibmluZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDozMy4zMzMzMzMzMyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInRlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInRlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZWxldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImVsZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0d2VsdmUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0d2VsdmUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDozMy4zMzMzMzMzMyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJmb3VydGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmb3VydGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZmlmdGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyNSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNpeHRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnN0YWNrYWJsZS5ncmlke3dpZHRoOmF1dG87bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50fS51aS5ncmlkPi5zdGFja2FibGUuc3RhY2thYmxlLnJvdz4uY29sdW1uLC51aS5zdGFja2FibGUuZ3JpZD4uY29sdW1uLmdyaWQ+LmNvbHVtbiwudWkuc3RhY2thYmxlLmdyaWQ+LmNvbHVtbi5yb3c+LmNvbHVtbiwudWkuc3RhY2thYmxlLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLnN0YWNrYWJsZS5ncmlkPi5yb3c+LmNvbHVtbiwudWkuc3RhY2thYmxlLmdyaWQ+LnJvdz4ud2lkZS5jb2x1bW4sLnVpLnN0YWNrYWJsZS5ncmlkPi53aWRlLmNvbHVtbnt3aWR0aDoxMDAlIWltcG9ydGFudDttYXJnaW46MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtwYWRkaW5nOjFyZW0gMXJlbSFpbXBvcnRhbnR9LnVpLnN0YWNrYWJsZS5ncmlkOm5vdCgudmVydGljYWxseSk+LnJvd3ttYXJnaW46MDtwYWRkaW5nOjB9LnVpLmNvbnRhaW5lcj4udWkuc3RhY2thYmxlLmdyaWQ+LmNvbHVtbiwudWkuY29udGFpbmVyPi51aS5zdGFja2FibGUuZ3JpZD4ucm93Pi5jb2x1bW57cGFkZGluZy1sZWZ0OjAhaW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MCFpbXBvcnRhbnR9LnVpLmdyaWQgLnVpLnN0YWNrYWJsZS5ncmlkLC51aS5zZWdtZW50Om5vdCgudmVydGljYWwpIC51aS5zdGFja2FibGUucGFnZS5ncmlke21hcmdpbi1sZWZ0Oi0xcmVtIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6LTFyZW0haW1wb3J0YW50fS51aS5zdGFja2FibGUuY2VsbGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyk6Zmlyc3QtY2hpbGQsLnVpLnN0YWNrYWJsZS5jZWxsZWQuZ3JpZD4ucm93OmZpcnN0LWNoaWxkPi5jb2x1bW46Zmlyc3QtY2hpbGQsLnVpLnN0YWNrYWJsZS5kaXZpZGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyk6Zmlyc3QtY2hpbGQsLnVpLnN0YWNrYWJsZS5kaXZpZGVkLmdyaWQ+LnJvdzpmaXJzdC1jaGlsZD4uY29sdW1uOmZpcnN0LWNoaWxke2JvcmRlci10b3A6bm9uZSFpbXBvcnRhbnR9LnVpLmludmVydGVkLnN0YWNrYWJsZS5jZWxsZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuaW52ZXJ0ZWQuc3RhY2thYmxlLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbiwudWkuaW52ZXJ0ZWQuc3RhY2thYmxlLmRpdmlkZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuaW52ZXJ0ZWQuc3RhY2thYmxlLmRpdmlkZWQuZ3JpZD4ucm93Pi5jb2x1bW57Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLnN0YWNrYWJsZS5jZWxsZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuc3RhY2thYmxlLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbiwudWkuc3RhY2thYmxlLmRpdmlkZWQ6bm90KC52ZXJ0aWNhbGx5KS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aS5zdGFja2FibGUuZGl2aWRlZDpub3QoLnZlcnRpY2FsbHkpLmdyaWQ+LnJvdz4uY29sdW1ue2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtwYWRkaW5nLXRvcDoycmVtIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbToycmVtIWltcG9ydGFudH0udWkuc3RhY2thYmxlLmNlbGxlZC5ncmlkPi5yb3d7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLnN0YWNrYWJsZS5kaXZpZGVkOm5vdCgudmVydGljYWxseSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuc3RhY2thYmxlLmRpdmlkZWQ6bm90KC52ZXJ0aWNhbGx5KS5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nLWxlZnQ6MCFpbXBvcnRhbnQ7cGFkZGluZy1yaWdodDowIWltcG9ydGFudH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5yb3c6bm90KC5tb2JpbGUpLC51aVtjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiY29tcHV0ZXIgb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImNvbXB1dGVyIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJjb21wdXRlciBvbmx5XFxcIl0ucm93Om5vdCgubW9iaWxlKSwudWlbY2xhc3MqPVxcXCJjb21wdXRlciBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0ucm93Om5vdCgubW9iaWxlKSwudWlbY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLnJvdzpub3QoLm1vYmlsZSksLnVpW2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uY29sdW1uOm5vdCgudGFibGV0KSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5jb2x1bW46bm90KC50YWJsZXQpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLnJvdzpub3QoLnRhYmxldCksLnVpW2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLnRhYmxldCl7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJjb21wdXRlciBvbmx5XFxcIl0uY29sdW1uOm5vdCgudGFibGV0KSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwiY29tcHV0ZXIgb25seVxcXCJdLmNvbHVtbjpub3QoLnRhYmxldCksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImNvbXB1dGVyIG9ubHlcXFwiXS5yb3c6bm90KC50YWJsZXQpLC51aVtjbGFzcyo9XFxcImNvbXB1dGVyIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLnRhYmxldCl7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5yb3c6bm90KC5tb2JpbGUpLC51aVtjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0ucm93Om5vdCgubW9iaWxlKSwudWlbY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLm1vYmlsZSl7ZGlzcGxheTpub25lIWltcG9ydGFudH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjk5MnB4KSBhbmQgKG1heC13aWR0aDoxMTk5cHgpey51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uY29sdW1uOm5vdCguY29tcHV0ZXIpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5yb3c6bm90KC5jb21wdXRlciksLnVpW2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLmNvbXB1dGVyKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uY29sdW1uOm5vdCguY29tcHV0ZXIpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5yb3c6bm90KC5jb21wdXRlciksLnVpW2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLmNvbXB1dGVyKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLnJvdzpub3QoLm1vYmlsZSksLnVpW2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLm1vYmlsZSl7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5yb3c6bm90KC5tb2JpbGUpLC51aVtjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KSBhbmQgKG1heC13aWR0aDoxOTE5cHgpey51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uY29sdW1uOm5vdCguY29tcHV0ZXIpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5yb3c6bm90KC5jb21wdXRlciksLnVpW2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLmNvbXB1dGVyKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uY29sdW1uOm5vdCguY29tcHV0ZXIpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5yb3c6bm90KC5jb21wdXRlciksLnVpW2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLmNvbXB1dGVyKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLnJvdzpub3QoLm1vYmlsZSksLnVpW2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxOTIwcHgpey51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uY29sdW1uOm5vdCguY29tcHV0ZXIpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5yb3c6bm90KC5jb21wdXRlciksLnVpW2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLmNvbXB1dGVyKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uY29sdW1uOm5vdCguY29tcHV0ZXIpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5yb3c6bm90KC5jb21wdXRlciksLnVpW2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLmNvbXB1dGVyKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX0udWkubWVudXtkaXNwbGF5OmZsZXg7bWFyZ2luOjFyZW0gMDtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7YmFja2dyb3VuZDojZmZmO2ZvbnQtd2VpZ2h0OjQwMDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO21pbi1oZWlnaHQ6Mi44NTcxNDI4NmVtfS51aS5tZW51OmFmdGVye2NvbnRlbnQ6Jyc7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtjbGVhcjpib3RoO3Zpc2liaWxpdHk6aGlkZGVufS51aS5tZW51OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkubWVudTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkubWVudSAubWVudXttYXJnaW46MH0udWkubWVudTpub3QoLnZlcnRpY2FsKT4ubWVudXtkaXNwbGF5OmZsZXh9LnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLml0ZW17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0udWkubWVudSAuaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bGluZS1oZWlnaHQ6MTt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZmxleDowIDAgYXV0bzstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtiYWNrZ3JvdW5kOjAgMDtwYWRkaW5nOi45Mjg1NzE0M2VtIDEuMTQyODU3MTRlbTt0ZXh0LXRyYW5zZm9ybTpub25lO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtmb250LXdlaWdodDo0MDA7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlfS51aS5tZW51Pi5pdGVtOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAuMjg1NzE0MjlyZW19LnVpLm1lbnUgLml0ZW06YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjA7cmlnaHQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxcHg7YmFja2dyb3VuZDpyZ2JhKDM0LDM2LDM4LC4xKX0udWkubWVudSAuaXRlbT5hOm5vdCgudWkpLC51aS5tZW51IC5pdGVtPnA6b25seS1jaGlsZCwudWkubWVudSAudGV4dC5pdGVtPip7LXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0Oy1tcy11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHQ7bGluZS1oZWlnaHQ6MS4zfS51aS5tZW51IC5pdGVtPnA6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5tZW51IC5pdGVtPnA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLm1lbnUgLml0ZW0+aS5pY29ue29wYWNpdHk6Ljk7ZmxvYXQ6bm9uZTttYXJnaW46MCAuMzU3MTQyODZlbSAwIDB9LnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLml0ZW0+LmJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDttYXJnaW46LS41ZW0gMDtwYWRkaW5nLWJvdHRvbTouNzg1NzE0MjllbTtwYWRkaW5nLXRvcDouNzg1NzE0MjllbTtmb250LXNpemU6MWVtfS51aS5tZW51Pi5jb250YWluZXIsLnVpLm1lbnU+LmdyaWR7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmluaGVyaXQ7ZmxleC1kaXJlY3Rpb246aW5oZXJpdH0udWkubWVudSAuaXRlbT4uaW5wdXR7d2lkdGg6MTAwJX0udWkubWVudTpub3QoLnZlcnRpY2FsKSAuaXRlbT4uaW5wdXR7cG9zaXRpb246cmVsYXRpdmU7dG9wOjA7bWFyZ2luOi0uNWVtIDB9LnVpLm1lbnUgLml0ZW0+LmlucHV0IGlucHV0e2ZvbnQtc2l6ZToxZW07cGFkZGluZy10b3A6LjU3MTQyODU3ZW07cGFkZGluZy1ib3R0b206LjU3MTQyODU3ZW19LnVpLm1lbnUgLmhlYWRlci5pdGVtLC51aS52ZXJ0aWNhbC5tZW51IC5oZWFkZXIuaXRlbXttYXJnaW46MDtiYWNrZ3JvdW5kOicnO3RleHQtdHJhbnNmb3JtOm5vcm1hbDtmb250LXdlaWdodDo3MDB9LnVpLnZlcnRpY2FsLm1lbnUgLml0ZW0+LmhlYWRlcjpub3QoLnVpKXttYXJnaW46MCAwIC41ZW07Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo3MDB9LnVpLm1lbnUgLml0ZW0+aS5kcm9wZG93bi5pY29ue3BhZGRpbmc6MDtmbG9hdDpyaWdodDttYXJnaW46MCAwIDAgMWVtfS51aS5tZW51IC5kcm9wZG93bi5pdGVtIC5tZW51e21pbi13aWR0aDpjYWxjKDEwMCUgLSAxcHgpO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW07YmFja2dyb3VuZDojZmZmO21hcmdpbjowIDAgMDstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JveC1zaGFkb3c6MCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbiFpbXBvcnRhbnR9LnVpLm1lbnUgLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVte21hcmdpbjowO3RleHQtYWxpZ246bGVmdDtmb250LXNpemU6MWVtIWltcG9ydGFudDtwYWRkaW5nOi43ODU3MTQyOWVtIDEuMTQyODU3MTRlbSFpbXBvcnRhbnQ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjg3KSFpbXBvcnRhbnQ7dGV4dC10cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7Zm9udC13ZWlnaHQ6NDAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDstd2Via2l0LXRyYW5zaXRpb246bm9uZSFpbXBvcnRhbnQ7dHJhbnNpdGlvbjpub25lIWltcG9ydGFudH0udWkubWVudSAudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSkhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjk1KSFpbXBvcnRhbnR9LnVpLm1lbnUgLnVpLmRyb3Bkb3duIC5tZW51Pi5zZWxlY3RlZC5pdGVte2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS5tZW51IC51aS5kcm9wZG93biAubWVudT4uYWN0aXZlLml0ZW17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMykhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OjcwMCFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkubWVudSAudWkuZHJvcGRvd24uaXRlbSAubWVudSAuaXRlbTpub3QoLmZpbHRlcmVkKXtkaXNwbGF5OmJsb2NrfS51aS5tZW51IC51aS5kcm9wZG93biAubWVudT4uaXRlbSAuaWNvbjpub3QoLmRyb3Bkb3duKXtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6MWVtIWltcG9ydGFudDtmbG9hdDpub25lO21hcmdpbjowIC43NWVtIDAgMCFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5tZW51IC5kcm9wZG93bi5pdGVtPi5tZW51LC51aS50ZXh0Lm1lbnUgLmRyb3Bkb3duLml0ZW0+Lm1lbnV7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07bWFyZ2luLXRvcDouMzU3MTQyODZlbX0udWkubWVudSAucG9pbnRpbmcuZHJvcGRvd24uaXRlbSAubWVudXttYXJnaW4tdG9wOi43NWVtfS51aS5pbnZlcnRlZC5tZW51IC5zZWFyY2guZHJvcGRvd24uaXRlbT4uc2VhcmNoLC51aS5pbnZlcnRlZC5tZW51IC5zZWFyY2guZHJvcGRvd24uaXRlbT4udGV4dHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkudmVydGljYWwubWVudSAuZHJvcGRvd24uaXRlbT4uaWNvbntmbG9hdDpyaWdodDtjb250ZW50OlxcXCJcXFxcZjBkYVxcXCI7bWFyZ2luLWxlZnQ6MWVtfS51aS52ZXJ0aWNhbC5tZW51IC5kcm9wZG93bi5pdGVtIC5tZW51e2xlZnQ6MTAwJTttaW4td2lkdGg6MDttYXJnaW46MDstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JveC1zaGFkb3c6MCAxcHggM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWkudmVydGljYWwubWVudSAuZHJvcGRvd24uaXRlbS51cHdhcmQgLm1lbnV7Ym90dG9tOjB9LnVpLnZlcnRpY2FsLm1lbnUgLmRyb3Bkb3duLml0ZW06bm90KC51cHdhcmQpIC5tZW51e3RvcDowfS51aS52ZXJ0aWNhbC5tZW51IC5hY3RpdmUuZHJvcGRvd24uaXRlbXtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLnZlcnRpY2FsLm1lbnUgLmRyb3Bkb3duLmFjdGl2ZS5pdGVtey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuaXRlbS5tZW51IC5kcm9wZG93biAubWVudSAuaXRlbXt3aWR0aDoxMDAlfS51aS5tZW51IC5pdGVtPi5sYWJlbHtiYWNrZ3JvdW5kOiM5OTk7Y29sb3I6I2ZmZjttYXJnaW4tbGVmdDoxZW07cGFkZGluZzouM2VtIC43ODU3MTQyOWVtfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtPi5sYWJlbHtiYWNrZ3JvdW5kOiM5OTk7Y29sb3I6I2ZmZjttYXJnaW4tdG9wOi0uMTVlbTttYXJnaW4tYm90dG9tOi0uMTVlbTtwYWRkaW5nOi4zZW0gLjc4NTcxNDI5ZW19LnVpLm1lbnUgLml0ZW0+LmZsb2F0aW5nLmxhYmVse3BhZGRpbmc6LjNlbSAuNzg1NzE0MjllbX0udWkubWVudSAuaXRlbT5pbWc6bm90KC51aSl7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbjotLjNlbSAwO3dpZHRoOjIuNWVtfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtPmltZzpub3QoLnVpKTpvbmx5LWNoaWxke2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOjEwMCU7d2lkdGg6YXV0b30udWkubWVudSAubGlzdCAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50fS51aS52ZXJ0aWNhbC5zaWRlYmFyLm1lbnU+Lml0ZW06Zmlyc3QtY2hpbGQ6YmVmb3Jle2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fS51aS52ZXJ0aWNhbC5zaWRlYmFyLm1lbnU+Lml0ZW06OmJlZm9yZXt0b3A6YXV0bztib3R0b206MH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5tZW51Pi51aS5jb250YWluZXJ7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpey51aS5tZW51Om5vdCguc2Vjb25kYXJ5KTpub3QoLnRleHQpOm5vdCgudGFidWxhcik6bm90KC5ib3JkZXJsZXNzKT4uY29udGFpbmVyPi5pdGVtOm5vdCgucmlnaHQpOm5vdCguYm9yZGVybGVzcyk6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpfX0udWkubGluay5tZW51IC5pdGVtOmhvdmVyLC51aS5tZW51IC5kcm9wZG93bi5pdGVtOmhvdmVyLC51aS5tZW51IC5saW5rLml0ZW06aG92ZXIsLnVpLm1lbnUgYS5pdGVtOmhvdmVye2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDMpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkubGluay5tZW51IC5pdGVtOmFjdGl2ZSwudWkubWVudSAubGluay5pdGVtOmFjdGl2ZSwudWkubWVudSBhLml0ZW06YWN0aXZle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDMpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpO2ZvbnQtd2VpZ2h0OjQwMDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLm1lbnUgLmFjdGl2ZS5pdGVtPmkuaWNvbntvcGFjaXR5OjF9LnVpLm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVyLC51aS52ZXJ0aWNhbC5tZW51IC5hY3RpdmUuaXRlbTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLm1lbnUgLml0ZW0uZGlzYWJsZWQsLnVpLm1lbnUgLml0ZW0uZGlzYWJsZWQ6aG92ZXJ7Y3Vyc29yOmRlZmF1bHQhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2NvbG9yOnJnYmEoNDAsNDAsNDAsLjMpIWltcG9ydGFudH0udWkubWVudTpub3QoLnZlcnRpY2FsKSAubGVmdC5pdGVtLC51aS5tZW51Om5vdCgudmVydGljYWwpIDpub3QoLmRyb3Bkb3duKT4ubGVmdC5tZW51e2Rpc3BsYXk6ZmxleDttYXJnaW4tcmlnaHQ6YXV0byFpbXBvcnRhbnR9LnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLnJpZ2h0Lml0ZW0sLnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLnJpZ2h0Lm1lbnV7ZGlzcGxheTpmbGV4O21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50fS51aS5tZW51IC5yaWdodC5pdGVtOjpiZWZvcmUsLnVpLm1lbnUgLnJpZ2h0Lm1lbnU+Lml0ZW06OmJlZm9yZXtyaWdodDphdXRvO2xlZnQ6MH0udWkudmVydGljYWwubWVudXtkaXNwbGF5OmJsb2NrO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkudmVydGljYWwubWVudSAuaXRlbXtkaXNwbGF5OmJsb2NrO2JhY2tncm91bmQ6MCAwO2JvcmRlci10b3A6bm9uZTtib3JkZXItcmlnaHQ6bm9uZX0udWkudmVydGljYWwubWVudT4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS52ZXJ0aWNhbC5tZW51Pi5pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWkudmVydGljYWwubWVudSAuaXRlbT4ubGFiZWx7ZmxvYXQ6cmlnaHQ7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLnZlcnRpY2FsLm1lbnUgLml0ZW0+aS5pY29ue3dpZHRoOjEuMThlbTtmbG9hdDpyaWdodDttYXJnaW46MCAwIDAgLjVlbX0udWkudmVydGljYWwubWVudSAuaXRlbT4ubGFiZWwraS5pY29ue2Zsb2F0Om5vbmU7bWFyZ2luOjAgLjVlbSAwIDB9LnVpLnZlcnRpY2FsLm1lbnUgLml0ZW06YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjFweDtiYWNrZ3JvdW5kOnJnYmEoMzQsMzYsMzgsLjEpfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtOmZpcnN0LWNoaWxkOmJlZm9yZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtPi5tZW51e21hcmdpbjouNWVtIC0xLjE0Mjg1NzE0ZW0gMH0udWkudmVydGljYWwubWVudSAubWVudSAuaXRlbXtiYWNrZ3JvdW5kOjAgMDtwYWRkaW5nOi41ZW0gMS4zMzMzMzMzM2VtO2ZvbnQtc2l6ZTouODU3MTQyODZlbTtjb2xvcjpyZ2JhKDAsMCwwLC41KX0udWkudmVydGljYWwubWVudSAuaXRlbSAubWVudSAubGluay5pdGVtOmhvdmVyLC51aS52ZXJ0aWNhbC5tZW51IC5pdGVtIC5tZW51IGEuaXRlbTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLnZlcnRpY2FsLm1lbnUgLm1lbnUgLml0ZW06YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkudmVydGljYWwubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkudmVydGljYWwubWVudT4uYWN0aXZlLml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkudmVydGljYWwubWVudT4uYWN0aXZlLml0ZW06bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS52ZXJ0aWNhbC5tZW51Pi5hY3RpdmUuaXRlbTpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS52ZXJ0aWNhbC5tZW51IC5hY3RpdmUuaXRlbSAubWVudSAuYWN0aXZlLml0ZW17Ym9yZGVyLWxlZnQ6bm9uZX0udWkudmVydGljYWwubWVudSAuaXRlbSAubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS50YWJ1bGFyLm1lbnV7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JvcmRlcjpub25lO2JhY2tncm91bmQ6bm9uZSB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZDRkNGQ1fS51aS50YWJ1bGFyLmZsdWlkLm1lbnV7d2lkdGg6Y2FsYygxMDAlICsgMnB4KSFpbXBvcnRhbnR9LnVpLnRhYnVsYXIubWVudSAuaXRlbXtiYWNrZ3JvdW5kOjAgMDtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDoycHggc29saWQgdHJhbnNwYXJlbnQ7cGFkZGluZzouOTI4NTcxNDNlbSAxLjQyODU3MTQzZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS50YWJ1bGFyLm1lbnUgLml0ZW06YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkudGFidWxhci5tZW51IC5pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnRhYnVsYXIubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZDpub25lICNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuOTUpO2JvcmRlci10b3Atd2lkdGg6MXB4O2JvcmRlci1jb2xvcjojZDRkNGQ1O2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tYm90dG9tOi0xcHg7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDAhaW1wb3J0YW50fS51aS50YWJ1bGFyLm1lbnUrLmF0dGFjaGVkOm5vdCgudG9wKS5zZWdtZW50LC51aS50YWJ1bGFyLm1lbnUrLmF0dGFjaGVkOm5vdCgudG9wKS5zZWdtZW50Ky5hdHRhY2hlZDpub3QoLnRvcCkuc2VnbWVudHtib3JkZXItdG9wOm5vbmU7bWFyZ2luLWxlZnQ6MDttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0OjA7d2lkdGg6MTAwJX0udG9wLmF0dGFjaGVkLnNlZ21lbnQrLnVpLmJvdHRvbS50YWJ1bGFyLm1lbnV7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6Y2FsYygxMDAlICsgMnB4KTtsZWZ0Oi0xcHh9LnVpLmJvdHRvbS50YWJ1bGFyLm1lbnV7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2Q0ZDRkNX0udWkuYm90dG9tLnRhYnVsYXIubWVudSAuaXRlbXtiYWNrZ3JvdW5kOjAgMDtib3JkZXItbGVmdDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wOm5vbmV9LnVpLmJvdHRvbS50YWJ1bGFyLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6bm9uZSAjZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTtib3JkZXItY29sb3I6I2Q0ZDRkNTttYXJnaW46LTFweCAwIDAgMDtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkudmVydGljYWwudGFidWxhci5tZW51e2JhY2tncm91bmQ6bm9uZSB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci1yaWdodDoxcHggc29saWQgI2Q0ZDRkNX0udWkudmVydGljYWwudGFidWxhci5tZW51IC5pdGVte2JhY2tncm91bmQ6MCAwO2JvcmRlci1sZWZ0OjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6bm9uZX0udWkudmVydGljYWwudGFidWxhci5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOm5vbmUgI2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7Ym9yZGVyLWNvbG9yOiNkNGQ0ZDU7bWFyZ2luOjAgLTFweCAwIDA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIC4yODU3MTQyOXJlbSFpbXBvcnRhbnR9LnVpLnZlcnRpY2FsLnJpZ2h0LnRhYnVsYXIubWVudXtiYWNrZ3JvdW5kOm5vbmUgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItbGVmdDoxcHggc29saWQgI2Q0ZDRkNX0udWkudmVydGljYWwucmlnaHQudGFidWxhci5tZW51IC5pdGVte2JhY2tncm91bmQ6MCAwO2JvcmRlci1yaWdodDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6bm9uZX0udWkudmVydGljYWwucmlnaHQudGFidWxhci5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOm5vbmUgI2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7Ym9yZGVyLWNvbG9yOiNkNGQ0ZDU7bWFyZ2luOjAgMCAwIC0xcHg7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCFpbXBvcnRhbnR9LnVpLnRhYnVsYXIubWVudSAuYWN0aXZlLmRyb3Bkb3duLml0ZW17bWFyZ2luLWJvdHRvbTowO2JvcmRlci1sZWZ0OjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6MnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206bm9uZX0udWkucGFnaW5hdGlvbi5tZW51e21hcmdpbjowO2Rpc3BsYXk6aW5saW5lLWZsZXg7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5wYWdpbmF0aW9uLm1lbnUgLml0ZW06bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aS5jb21wYWN0Lm1lbnUgLml0ZW06bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aS5wYWdpbmF0aW9uLm1lbnUgLml0ZW06bGFzdC1jaGlsZDpiZWZvcmV7ZGlzcGxheTpub25lfS51aS5wYWdpbmF0aW9uLm1lbnUgLml0ZW17bWluLXdpZHRoOjNlbTt0ZXh0LWFsaWduOmNlbnRlcn0udWkucGFnaW5hdGlvbi5tZW51IC5pY29uLml0ZW0gaS5pY29ue3ZlcnRpY2FsLWFsaWduOnRvcH0udWkucGFnaW5hdGlvbi5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItdG9wOm5vbmU7cGFkZGluZy10b3A6LjkyODU3MTQzZW07YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuc2Vjb25kYXJ5Lm1lbnV7YmFja2dyb3VuZDowIDA7bWFyZ2luLWxlZnQ6LS4zNTcxNDI4NmVtO21hcmdpbi1yaWdodDotLjM1NzE0Mjg2ZW07Ym9yZGVyLXJhZGl1czowO2JvcmRlcjpub25lOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuc2Vjb25kYXJ5Lm1lbnUgLml0ZW17YWxpZ24tc2VsZjpjZW50ZXI7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlcjpub25lO3BhZGRpbmc6Ljc4NTcxNDI5ZW0gLjkyODU3MTQzZW07bWFyZ2luOjAgLjM1NzE0Mjg2ZW07YmFja2dyb3VuZDowIDA7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnNlY29uZGFyeS5tZW51IC5pdGVtOmJlZm9yZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5zZWNvbmRhcnkubWVudSAuaGVhZGVyLml0ZW17Ym9yZGVyLXJhZGl1czowO2JvcmRlci1yaWdodDpub25lO2JhY2tncm91bmQ6bm9uZSB0cmFuc3BhcmVudH0udWkuc2Vjb25kYXJ5Lm1lbnUgLml0ZW0+aW1nOm5vdCgudWkpe21hcmdpbjowfS51aS5zZWNvbmRhcnkubWVudSAuZHJvcGRvd24uaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5Lm1lbnUgLmxpbmsuaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5Lm1lbnUgYS5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc2Vjb25kYXJ5Lm1lbnUgLmFjdGl2ZS5pdGVtey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnNlY29uZGFyeS5tZW51IC5hY3RpdmUuaXRlbTpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQubWVudSAubGluay5pdGVtLC51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQubWVudSBhLml0ZW17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNykhaW1wb3J0YW50fS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQubWVudSAuZHJvcGRvd24uaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5LmludmVydGVkLm1lbnUgLmxpbmsuaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5LmludmVydGVkLm1lbnUgYS5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSk7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5pdGVtLm1lbnV7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0udWkuc2Vjb25kYXJ5Lml0ZW0ubWVudSAuaXRlbTpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS51aS5zZWNvbmRhcnkuYXR0YWNoZWQubWVudXstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnZlcnRpY2FsLnNlY29uZGFyeS5tZW51IC5pdGVtOm5vdCguZHJvcGRvd24pPi5tZW51e21hcmdpbjowIC0uOTI4NTcxNDNlbX0udWkudmVydGljYWwuc2Vjb25kYXJ5Lm1lbnUgLml0ZW06bm90KC5kcm9wZG93bik+Lm1lbnU+Lml0ZW17bWFyZ2luOjA7cGFkZGluZzouNWVtIDEuMzMzMzMzMzNlbX0udWkuc2Vjb25kYXJ5LnZlcnRpY2FsLm1lbnU+Lml0ZW17Ym9yZGVyOm5vbmU7bWFyZ2luOjAgMCAuMzU3MTQyODZlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS52ZXJ0aWNhbC5tZW51Pi5oZWFkZXIuaXRlbXtib3JkZXItcmFkaXVzOjB9LnVpLnZlcnRpY2FsLnNlY29uZGFyeS5tZW51IC5pdGVtPi5tZW51IC5pdGVte2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5tZW51e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51e21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7Ym9yZGVyLWJvdHRvbToycHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAuaXRlbXtib3JkZXItYm90dG9tLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1ib3R0b20tc3R5bGU6c29saWQ7Ym9yZGVyLXJhZGl1czowO2FsaWduLXNlbGY6ZmxleC1lbmQ7bWFyZ2luOjAgMCAtMnB4O3BhZGRpbmc6Ljg1NzE0Mjg2ZW0gMS4xNDI4NTcxNGVtO2JvcmRlci1ib3R0b20td2lkdGg6MnB4Oy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlfS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAuaGVhZGVyLml0ZW17Y29sb3I6cmdiYSgwLDAsMCwuODUpIWltcG9ydGFudH0udWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLnRleHQuaXRlbXstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLml0ZW06YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAuZHJvcGRvd24uaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLmxpbmsuaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgYS5pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAuZHJvcGRvd24uaXRlbTphY3RpdmUsLnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5saW5rLml0ZW06YWN0aXZlLC51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSBhLml0ZW06YWN0aXZle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1jb2xvcjojMWIxYzFkO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTpob3Zlcntib3JkZXItY29sb3I6IzFiMWMxZDtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5hY3RpdmUuZHJvcGRvd24uaXRlbXtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LnVpLnNlY29uZGFyeS52ZXJ0aWNhbC5wb2ludGluZy5tZW51e2JvcmRlci1ib3R0b20td2lkdGg6MDtib3JkZXItcmlnaHQtd2lkdGg6MnB4O2JvcmRlci1yaWdodC1zdHlsZTpzb2xpZDtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWNvbmRhcnkudmVydGljYWwucG9pbnRpbmcubWVudSAuaXRlbXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjAhaW1wb3J0YW50O21hcmdpbjowIC0ycHggMCAwO2JvcmRlci1yaWdodC13aWR0aDoycHh9LnVpLnNlY29uZGFyeS52ZXJ0aWNhbC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6IzFiMWMxZH0udWkuc2Vjb25kYXJ5LmludmVydGVkLnBvaW50aW5nLm1lbnV7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQucG9pbnRpbmcubWVudXtib3JkZXItd2lkdGg6MnB4O2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5wb2ludGluZy5tZW51IC5pdGVte2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQucG9pbnRpbmcubWVudSAuaGVhZGVyLml0ZW17Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5wb2ludGluZy5tZW51IC5saW5rLml0ZW06aG92ZXIsLnVpLnNlY29uZGFyeS5pbnZlcnRlZC5wb2ludGluZy5tZW51IGEuaXRlbTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2ZmZjtjb2xvcjojZmZmfS51aS50ZXh0Lm1lbnV7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjFlbSAtLjVlbX0udWkudGV4dC5tZW51IC5pdGVte2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7YWxpZ24tc2VsZjpjZW50ZXI7bWFyZ2luOjAgMDtwYWRkaW5nOi4zNTcxNDI4NmVtIC41ZW07Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOnJnYmEoMCwwLDAsLjYpOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZX0udWkudGV4dC5tZW51IC5pdGVtOmJlZm9yZSwudWkudGV4dC5tZW51IC5tZW51IC5pdGVtOmJlZm9yZXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS50ZXh0Lm1lbnUgLmhlYWRlci5pdGVte2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7b3BhY2l0eToxO2NvbG9yOnJnYmEoMCwwLDAsLjg1KTtmb250LXNpemU6LjkyODU3MTQzZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2ZvbnQtd2VpZ2h0OjcwMH0udWkudGV4dC5tZW51IC5pdGVtPmltZzpub3QoLnVpKXttYXJnaW46MH0udWkudGV4dC5pdGVtLm1lbnUgLml0ZW17bWFyZ2luOjB9LnVpLnZlcnRpY2FsLnRleHQubWVudXttYXJnaW46MWVtIDB9LnVpLnZlcnRpY2FsLnRleHQubWVudTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnZlcnRpY2FsLnRleHQubWVudTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkudmVydGljYWwudGV4dC5tZW51IC5pdGVte21hcmdpbjouNTcxNDI4NTdlbSAwO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0udWkudmVydGljYWwudGV4dC5tZW51IC5pdGVtPmkuaWNvbntmbG9hdDpub25lO21hcmdpbjowIC4zNTcxNDI4NmVtIDAgMH0udWkudmVydGljYWwudGV4dC5tZW51IC5oZWFkZXIuaXRlbXttYXJnaW46LjU3MTQyODU3ZW0gMCAuNzE0Mjg1NzFlbX0udWkudmVydGljYWwudGV4dC5tZW51IC5pdGVtOm5vdCguZHJvcGRvd24pPi5tZW51e21hcmdpbjowfS51aS52ZXJ0aWNhbC50ZXh0Lm1lbnUgLml0ZW06bm90KC5kcm9wZG93bik+Lm1lbnU+Lml0ZW17bWFyZ2luOjA7cGFkZGluZzouNWVtIDB9LnVpLnRleHQubWVudSAuaXRlbTpob3ZlcntvcGFjaXR5OjE7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0udWkudGV4dC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjpub25lOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtmb250LXdlaWdodDo0MDA7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS50ZXh0Lm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLnRleHQucG9pbnRpbmcubWVudSAuYWN0aXZlLml0ZW06YWZ0ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS50ZXh0LmF0dGFjaGVkLm1lbnV7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC50ZXh0Lm1lbnUsLnVpLmludmVydGVkLnRleHQubWVudSAuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLnRleHQubWVudSAuaXRlbSwudWkuaW52ZXJ0ZWQudGV4dC5tZW51IC5pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5mbHVpZC50ZXh0Lm1lbnV7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0udWkudmVydGljYWwuaWNvbi5tZW51e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG99LnVpLmljb24ubWVudSAuaXRlbXtoZWlnaHQ6YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojMWIxYzFkfS51aS5pY29uLm1lbnUgLml0ZW0+Lmljb246bm90KC5kcm9wZG93bil7bWFyZ2luOjA7b3BhY2l0eToxfS51aS5pY29uLm1lbnUgLmljb246YmVmb3Jle29wYWNpdHk6MX0udWkubWVudSAuaWNvbi5pdGVtPi5pY29ue3dpZHRoOmF1dG87bWFyZ2luOjAgYXV0b30udWkudmVydGljYWwuaWNvbi5tZW51IC5pdGVtPi5pY29uOm5vdCguZHJvcGRvd24pe2Rpc3BsYXk6YmxvY2s7b3BhY2l0eToxO21hcmdpbjowIGF1dG87ZmxvYXQ6bm9uZX0udWkuaW52ZXJ0ZWQuaWNvbi5tZW51IC5pdGVte2NvbG9yOiNmZmZ9LnVpLmxhYmVsZWQuaWNvbi5tZW51e3RleHQtYWxpZ246Y2VudGVyfS51aS5sYWJlbGVkLmljb24ubWVudSAuaXRlbXttaW4td2lkdGg6NmVtO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWkubGFiZWxlZC5pY29uLm1lbnUgLml0ZW0+Lmljb246bm90KC5kcm9wZG93bil7aGVpZ2h0OjFlbTtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZToxLjcxNDI4NTcxZW0haW1wb3J0YW50O21hcmdpbjowIGF1dG8gLjVyZW0haW1wb3J0YW50fS51aS5mbHVpZC5sYWJlbGVkLmljb24ubWVudT4uaXRlbXttaW4td2lkdGg6MH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5zdGFja2FibGUubWVudXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnVpLnN0YWNrYWJsZS5tZW51IC5pdGVte3dpZHRoOjEwMCUhaW1wb3J0YW50fS51aS5zdGFja2FibGUubWVudSAuaXRlbTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6YXV0bztib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MXB4O2JhY2tncm91bmQ6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLnN0YWNrYWJsZS5tZW51IC5sZWZ0Lml0ZW0sLnVpLnN0YWNrYWJsZS5tZW51IC5sZWZ0Lm1lbnV7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50fS51aS5zdGFja2FibGUubWVudSAucmlnaHQuaXRlbSwudWkuc3RhY2thYmxlLm1lbnUgLnJpZ2h0Lm1lbnV7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnR9LnVpLnN0YWNrYWJsZS5tZW51IC5sZWZ0Lm1lbnUsLnVpLnN0YWNrYWJsZS5tZW51IC5yaWdodC5tZW51e2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn19LnVpLm1lbnUgLnJlZC5hY3RpdmUuaXRlbSwudWkucmVkLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojZGIyODI4IWltcG9ydGFudDtjb2xvcjojZGIyODI4IWltcG9ydGFudH0udWkubWVudSAub3JhbmdlLmFjdGl2ZS5pdGVtLC51aS5vcmFuZ2UubWVudSAuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiNmMjcxMWMhaW1wb3J0YW50O2NvbG9yOiNmMjcxMWMhaW1wb3J0YW50fS51aS5tZW51IC55ZWxsb3cuYWN0aXZlLml0ZW0sLnVpLnllbGxvdy5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Y29sb3I6I2ZiYmQwOCFpbXBvcnRhbnR9LnVpLm1lbnUgLm9saXZlLmFjdGl2ZS5pdGVtLC51aS5vbGl2ZS5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Y29sb3I6I2I1Y2MxOCFpbXBvcnRhbnR9LnVpLmdyZWVuLm1lbnUgLmFjdGl2ZS5pdGVtLC51aS5tZW51IC5ncmVlbi5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6IzIxYmE0NSFpbXBvcnRhbnQ7Y29sb3I6IzIxYmE0NSFpbXBvcnRhbnR9LnVpLm1lbnUgLnRlYWwuYWN0aXZlLml0ZW0sLnVpLnRlYWwubWVudSAuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiMwMGI1YWQhaW1wb3J0YW50O2NvbG9yOiMwMGI1YWQhaW1wb3J0YW50fS51aS5ibHVlLm1lbnUgLmFjdGl2ZS5pdGVtLC51aS5tZW51IC5ibHVlLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojMjE4NWQwIWltcG9ydGFudDtjb2xvcjojMjE4NWQwIWltcG9ydGFudH0udWkubWVudSAudmlvbGV0LmFjdGl2ZS5pdGVtLC51aS52aW9sZXQubWVudSAuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiM2NDM1YzkhaW1wb3J0YW50O2NvbG9yOiM2NDM1YzkhaW1wb3J0YW50fS51aS5tZW51IC5wdXJwbGUuYWN0aXZlLml0ZW0sLnVpLnB1cnBsZS5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Y29sb3I6I2EzMzNjOCFpbXBvcnRhbnR9LnVpLm1lbnUgLnBpbmsuYWN0aXZlLml0ZW0sLnVpLnBpbmsubWVudSAuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50O2NvbG9yOiNlMDM5OTchaW1wb3J0YW50fS51aS5icm93bi5tZW51IC5hY3RpdmUuaXRlbSwudWkubWVudSAuYnJvd24uYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiNhNTY3M2YhaW1wb3J0YW50O2NvbG9yOiNhNTY3M2YhaW1wb3J0YW50fS51aS5ncmV5Lm1lbnUgLmFjdGl2ZS5pdGVtLC51aS5tZW51IC5ncmV5LmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojNzY3Njc2IWltcG9ydGFudDtjb2xvcjojNzY3Njc2IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudXtib3JkZXI6MCBzb2xpZCB0cmFuc3BhcmVudDtiYWNrZ3JvdW5kOiMxYjFjMWQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5tZW51IC5pdGVtLC51aS5pbnZlcnRlZC5tZW51IC5pdGVtPmE6bm90KC51aSl7YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmludmVydGVkLm1lbnUgLml0ZW0ubWVudXtiYWNrZ3JvdW5kOjAgMH0udWkuaW52ZXJ0ZWQubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCl9LnVpLnZlcnRpY2FsLmludmVydGVkLm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpfS51aS52ZXJ0aWNhbC5pbnZlcnRlZC5tZW51IC5tZW51IC5pdGVtLC51aS52ZXJ0aWNhbC5pbnZlcnRlZC5tZW51IC5tZW51IC5pdGVtIGE6bm90KC51aSl7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9LnVpLmludmVydGVkLm1lbnUgLmhlYWRlci5pdGVte21hcmdpbjowO2JhY2tncm91bmQ6MCAwOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuaW52ZXJ0ZWQubWVudSAuaXRlbS5kaXNhYmxlZCwudWkuaW52ZXJ0ZWQubWVudSAuaXRlbS5kaXNhYmxlZDpob3Zlcntjb2xvcjpyZ2JhKDIyNSwyMjUsMjI1LC4zKX0udWkuaW52ZXJ0ZWQubWVudSAuZHJvcGRvd24uaXRlbTpob3ZlciwudWkuaW52ZXJ0ZWQubWVudSAubGluay5pdGVtOmhvdmVyLC51aS5pbnZlcnRlZC5tZW51IGEuaXRlbTpob3ZlciwudWkubGluay5pbnZlcnRlZC5tZW51IC5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmZ9LnVpLnZlcnRpY2FsLmludmVydGVkLm1lbnUgLml0ZW0gLm1lbnUgLmxpbmsuaXRlbTpob3ZlciwudWkudmVydGljYWwuaW52ZXJ0ZWQubWVudSAuaXRlbSAubWVudSBhLml0ZW06aG92ZXJ7YmFja2dyb3VuZDowIDA7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQubWVudSAubGluay5pdGVtOmFjdGl2ZSwudWkuaW52ZXJ0ZWQubWVudSBhLml0ZW06YWN0aXZle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTUpO2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC52ZXJ0aWNhbC5tZW51IC5pdGVtIC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOjAgMDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTphZnRlcntiYWNrZ3JvdW5kOiMzZDNlM2YhaW1wb3J0YW50O21hcmdpbjowIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3JkZXI6bm9uZSFpbXBvcnRhbnR9LnVpLmludmVydGVkLm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTUpO2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTpob3ZlcjphZnRlcntiYWNrZ3JvdW5kOiMzZDNlM2YhaW1wb3J0YW50fS51aS5mbG9hdGVkLm1lbnV7ZmxvYXQ6bGVmdDttYXJnaW46MCAuNXJlbSAwIDB9LnVpLmZsb2F0ZWQubWVudSAuaXRlbTpsYXN0LWNoaWxkOmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLnJpZ2h0LmZsb2F0ZWQubWVudXtmbG9hdDpyaWdodDttYXJnaW46MCAwIDAgLjVyZW19LnVpLmludmVydGVkLm1lbnUgLnJlZC5hY3RpdmUuaXRlbSwudWkuaW52ZXJ0ZWQucmVkLm1lbnV7YmFja2dyb3VuZC1jb2xvcjojZGIyODI4fS51aS5pbnZlcnRlZC5yZWQubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQucmVkLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5tZW51IC5vcmFuZ2UuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLm9yYW5nZS5tZW51e2JhY2tncm91bmQtY29sb3I6I2YyNzExY30udWkuaW52ZXJ0ZWQub3JhbmdlLm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLm9yYW5nZS5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudSAueWVsbG93LmFjdGl2ZS5pdGVtLC51aS5pbnZlcnRlZC55ZWxsb3cubWVudXtiYWNrZ3JvdW5kLWNvbG9yOiNmYmJkMDh9LnVpLmludmVydGVkLnllbGxvdy5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC55ZWxsb3cubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLm1lbnUgLm9saXZlLmFjdGl2ZS5pdGVtLC51aS5pbnZlcnRlZC5vbGl2ZS5tZW51e2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOH0udWkuaW52ZXJ0ZWQub2xpdmUubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQub2xpdmUubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZWVuLm1lbnUsLnVpLmludmVydGVkLm1lbnUgLmdyZWVuLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6IzIxYmE0NX0udWkuaW52ZXJ0ZWQuZ3JlZW4ubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQuZ3JlZW4ubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLm1lbnUgLnRlYWwuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLnRlYWwubWVudXtiYWNrZ3JvdW5kLWNvbG9yOiMwMGI1YWR9LnVpLmludmVydGVkLnRlYWwubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQudGVhbC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYmx1ZS5tZW51LC51aS5pbnZlcnRlZC5tZW51IC5ibHVlLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6IzIxODVkMH0udWkuaW52ZXJ0ZWQuYmx1ZS5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5ibHVlLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5tZW51IC52aW9sZXQuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLnZpb2xldC5tZW51e2JhY2tncm91bmQtY29sb3I6IzY0MzVjOX0udWkuaW52ZXJ0ZWQudmlvbGV0Lm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLnZpb2xldC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudSAucHVycGxlLmFjdGl2ZS5pdGVtLC51aS5pbnZlcnRlZC5wdXJwbGUubWVudXtiYWNrZ3JvdW5kLWNvbG9yOiNhMzMzYzh9LnVpLmludmVydGVkLnB1cnBsZS5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5wdXJwbGUubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLm1lbnUgLnBpbmsuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLnBpbmsubWVudXtiYWNrZ3JvdW5kLWNvbG9yOiNlMDM5OTd9LnVpLmludmVydGVkLnBpbmsubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQucGluay5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYnJvd24ubWVudSwudWkuaW52ZXJ0ZWQubWVudSAuYnJvd24uYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjojYTU2NzNmfS51aS5pbnZlcnRlZC5icm93bi5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5icm93bi5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JleS5tZW51LC51aS5pbnZlcnRlZC5tZW51IC5ncmV5LmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6Izc2NzY3Nn0udWkuaW52ZXJ0ZWQuZ3JleS5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5ncmV5Lm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5maXR0ZWQubWVudSAuaXRlbSwudWkuZml0dGVkLm1lbnUgLml0ZW0gLm1lbnUgLml0ZW0sLnVpLm1lbnUgLmZpdHRlZC5pdGVte3BhZGRpbmc6MH0udWkuaG9yaXpvbnRhbGx5LmZpdHRlZC5tZW51IC5pdGVtLC51aS5ob3Jpem9udGFsbHkuZml0dGVkLm1lbnUgLml0ZW0gLm1lbnUgLml0ZW0sLnVpLm1lbnUgLmhvcml6b250YWxseS5maXR0ZWQuaXRlbXtwYWRkaW5nLXRvcDouOTI4NTcxNDNlbTtwYWRkaW5nLWJvdHRvbTouOTI4NTcxNDNlbX0udWkubWVudSAudmVydGljYWxseS5maXR0ZWQuaXRlbSwudWkudmVydGljYWxseS5maXR0ZWQubWVudSAuaXRlbSwudWkudmVydGljYWxseS5maXR0ZWQubWVudSAuaXRlbSAubWVudSAuaXRlbXtwYWRkaW5nLWxlZnQ6MS4xNDI4NTcxNGVtO3BhZGRpbmctcmlnaHQ6MS4xNDI4NTcxNGVtfS51aS5ib3JkZXJsZXNzLm1lbnUgLml0ZW0gLm1lbnUgLml0ZW06YmVmb3JlLC51aS5ib3JkZXJsZXNzLm1lbnUgLml0ZW06YmVmb3JlLC51aS5tZW51IC5ib3JkZXJsZXNzLml0ZW06YmVmb3Jle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH0udWkuY29tcGFjdC5tZW51e2Rpc3BsYXk6aW5saW5lLWZsZXg7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5jb21wYWN0LnZlcnRpY2FsLm1lbnV7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLmNvbXBhY3QubWVudSAuaXRlbTpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDB9LnVpLmNvbXBhY3QubWVudSAuaXRlbTpsYXN0LWNoaWxkOmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLmNvbXBhY3QudmVydGljYWwubWVudXt3aWR0aDphdXRvIWltcG9ydGFudH0udWkuY29tcGFjdC52ZXJ0aWNhbC5tZW51IC5pdGVtOmxhc3QtY2hpbGQ6OmJlZm9yZXtkaXNwbGF5OmJsb2NrfS51aS5tZW51LmZsdWlkLC51aS52ZXJ0aWNhbC5tZW51LmZsdWlke3dpZHRoOjEwMCUhaW1wb3J0YW50fS51aS5pdGVtLm1lbnUsLnVpLml0ZW0ubWVudSAuaXRlbXt3aWR0aDoxMDAlO3BhZGRpbmctbGVmdDowIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjAhaW1wb3J0YW50O21hcmdpbi1yaWdodDowIWltcG9ydGFudDt0ZXh0LWFsaWduOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS51aS5hdHRhY2hlZC5pdGVtLm1lbnV7bWFyZ2luOjAgLTFweCFpbXBvcnRhbnR9LnVpLml0ZW0ubWVudSAuaXRlbTpsYXN0LWNoaWxkOmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLm1lbnUudHdvLml0ZW0gLml0ZW17d2lkdGg6NTAlfS51aS5tZW51LnRocmVlLml0ZW0gLml0ZW17d2lkdGg6MzMuMzMzJX0udWkubWVudS5mb3VyLml0ZW0gLml0ZW17d2lkdGg6MjUlfS51aS5tZW51LmZpdmUuaXRlbSAuaXRlbXt3aWR0aDoyMCV9LnVpLm1lbnUuc2l4Lml0ZW0gLml0ZW17d2lkdGg6MTYuNjY2JX0udWkubWVudS5zZXZlbi5pdGVtIC5pdGVte3dpZHRoOjE0LjI4NSV9LnVpLm1lbnUuZWlnaHQuaXRlbSAuaXRlbXt3aWR0aDoxMi41JX0udWkubWVudS5uaW5lLml0ZW0gLml0ZW17d2lkdGg6MTEuMTElfS51aS5tZW51LnRlbi5pdGVtIC5pdGVte3dpZHRoOjEwJX0udWkubWVudS5lbGV2ZW4uaXRlbSAuaXRlbXt3aWR0aDo5LjA5JX0udWkubWVudS50d2VsdmUuaXRlbSAuaXRlbXt3aWR0aDo4LjMzMyV9LnVpLm1lbnUuZml4ZWR7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDE7bWFyZ2luOjA7d2lkdGg6MTAwJX0udWkubWVudS5maXhlZCwudWkubWVudS5maXhlZCAuaXRlbTpmaXJzdC1jaGlsZCwudWkubWVudS5maXhlZCAuaXRlbTpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCFpbXBvcnRhbnR9LnVpLmZpeGVkLm1lbnUsLnVpW2NsYXNzKj1cXFwidG9wIGZpeGVkXFxcIl0ubWVudXt0b3A6MDtsZWZ0OjA7cmlnaHQ6YXV0bztib3R0b206YXV0b30udWlbY2xhc3MqPVxcXCJ0b3AgZml4ZWRcXFwiXS5tZW51e2JvcmRlci10b3A6bm9uZTtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lfS51aVtjbGFzcyo9XFxcInJpZ2h0IGZpeGVkXFxcIl0ubWVudXtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci1yaWdodDpub25lO3RvcDowO3JpZ2h0OjA7bGVmdDphdXRvO2JvdHRvbTphdXRvO3dpZHRoOmF1dG87aGVpZ2h0OjEwMCV9LnVpW2NsYXNzKj1cXFwiYm90dG9tIGZpeGVkXFxcIl0ubWVudXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3R0b206MDtsZWZ0OjA7dG9wOmF1dG87cmlnaHQ6YXV0b30udWlbY2xhc3MqPVxcXCJsZWZ0IGZpeGVkXFxcIl0ubWVudXtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci1sZWZ0Om5vbmU7dG9wOjA7bGVmdDowO3JpZ2h0OmF1dG87Ym90dG9tOmF1dG87d2lkdGg6YXV0bztoZWlnaHQ6MTAwJX0udWkuZml4ZWQubWVudSsudWkuZ3JpZHtwYWRkaW5nLXRvcDoyLjc1cmVtfS51aS5wb2ludGluZy5tZW51IC5pdGVtOmFmdGVye3Zpc2liaWxpdHk6aGlkZGVuO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjEwMCU7bGVmdDo1MCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO2JhY2tncm91bmQ6MCAwO21hcmdpbjouNXB4IDAgMDt3aWR0aDouNTcxNDI4NTdlbTtoZWlnaHQ6LjU3MTQyODU3ZW07Ym9yZGVyOm5vbmU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2Q0ZDRkNTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNkNGQ0ZDU7ei1pbmRleDoyOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZX0udWkudmVydGljYWwucG9pbnRpbmcubWVudSAuaXRlbTphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3JpZ2h0OjA7Ym90dG9tOmF1dG87bGVmdDphdXRvOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7bWFyZ2luOjAgLS41cHggMCAwO2JvcmRlcjpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkICNkNGQ0ZDU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZDRkNGQ1fS51aS5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTphZnRlcnt2aXNpYmlsaXR5OnZpc2libGV9LnVpLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5kcm9wZG93bi5pdGVtOmFmdGVye3Zpc2liaWxpdHk6aGlkZGVufS51aS5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbSAubWVudSAuYWN0aXZlLml0ZW06YWZ0ZXIsLnVpLnBvaW50aW5nLm1lbnUgLmRyb3Bkb3duLmFjdGl2ZS5pdGVtOmFmdGVye2Rpc3BsYXk6bm9uZX0udWkucG9pbnRpbmcubWVudSAuYWN0aXZlLml0ZW06aG92ZXI6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyfS51aS5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmYyZjJ9LnVpLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVyOmFmdGVye2JhY2tncm91bmQtY29sb3I6I2YyZjJmMn0udWkudmVydGljYWwucG9pbnRpbmcubWVudSAuYWN0aXZlLml0ZW06aG92ZXI6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyfS51aS52ZXJ0aWNhbC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmYyZjJ9LnVpLnZlcnRpY2FsLnBvaW50aW5nLm1lbnUgLm1lbnUgLmFjdGl2ZS5pdGVtOmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmZn0udWkuYXR0YWNoZWQubWVudXt0b3A6MDtib3R0b206MDtib3JkZXItcmFkaXVzOjA7bWFyZ2luOjAgLTFweDt3aWR0aDpjYWxjKDEwMCUgKyAycHgpO21heC13aWR0aDpjYWxjKDEwMCUgKyAycHgpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuYXR0YWNoZWQrLnVpLmF0dGFjaGVkLm1lbnU6bm90KC50b3Ape2JvcmRlci10b3A6bm9uZX0udWlbY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXS5tZW51e2JvdHRvbTowO21hcmdpbi1ib3R0b206MDt0b3A6MDttYXJnaW4tdG9wOjFyZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkubWVudVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWlbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS5tZW51e2JvdHRvbTowO21hcmdpbi10b3A6MDt0b3A6MDttYXJnaW4tYm90dG9tOjFyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSxub25lO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLG5vbmU7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWlbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS5tZW51Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS50b3AuYXR0YWNoZWQubWVudT4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgMH0udWkuYm90dG9tLmF0dGFjaGVkLm1lbnU+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgMCAuMjg1NzE0MjlyZW19LnVpLmF0dGFjaGVkLm1lbnU6bm90KC50YWJ1bGFyKXtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDV9LnVpLmF0dGFjaGVkLmludmVydGVkLm1lbnV7Ym9yZGVyOm5vbmV9LnVpLmF0dGFjaGVkLnRhYnVsYXIubWVudXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO3dpZHRoOjEwMCV9LnVpLm1pbmkubWVudXtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS5taW5pLnZlcnRpY2FsLm1lbnV7d2lkdGg6OXJlbX0udWkudGlueS5tZW51e2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnRpbnkudmVydGljYWwubWVudXt3aWR0aDoxMXJlbX0udWkuc21hbGwubWVudXtmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5zbWFsbC52ZXJ0aWNhbC5tZW51e3dpZHRoOjEzcmVtfS51aS5tZW51e2ZvbnQtc2l6ZToxcmVtfS51aS52ZXJ0aWNhbC5tZW51e3dpZHRoOjE1cmVtfS51aS5sYXJnZS5tZW51e2ZvbnQtc2l6ZToxLjA3MTQyODU3cmVtfS51aS5sYXJnZS52ZXJ0aWNhbC5tZW51e3dpZHRoOjE4cmVtfS51aS5odWdlLm1lbnV7Zm9udC1zaXplOjEuMjE0Mjg1NzFyZW19LnVpLmh1Z2UudmVydGljYWwubWVudXt3aWR0aDoyMnJlbX0udWkuYmlnLm1lbnV7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy52ZXJ0aWNhbC5tZW51e3dpZHRoOjIwcmVtfS51aS5tYXNzaXZlLm1lbnV7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLm1hc3NpdmUudmVydGljYWwubWVudXt3aWR0aDoyNXJlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTWVzc2FnZVxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLm1lc3NhZ2V7cG9zaXRpb246cmVsYXRpdmU7bWluLWhlaWdodDoxZW07bWFyZ2luOjFlbSAwO2JhY2tncm91bmQ6I2Y4ZjhmOTtwYWRkaW5nOjFlbSAxLjVlbTtsaW5lLWhlaWdodDoxLjQyODVlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJhY2tncm91bmQgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxiYWNrZ3JvdW5kIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJhY2tncm91bmQgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4yMikgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4yMikgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkubWVzc2FnZTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLm1lc3NhZ2U6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLm1lc3NhZ2UgLmhlYWRlcntkaXNwbGF5OmJsb2NrO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7bWFyZ2luOi0uMTQyODU3MTRlbSAwIDAgMH0udWkubWVzc2FnZSAuaGVhZGVyOm5vdCgudWkpe2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW19LnVpLm1lc3NhZ2UgcHtvcGFjaXR5Oi44NTttYXJnaW46Ljc1ZW0gMH0udWkubWVzc2FnZSBwOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkubWVzc2FnZSBwOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5tZXNzYWdlIC5oZWFkZXIrcHttYXJnaW4tdG9wOi4yNWVtfS51aS5tZXNzYWdlIC5saXN0Om5vdCgudWkpe3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjA7b3BhY2l0eTouODU7bGlzdC1zdHlsZS1wb3NpdGlvbjppbnNpZGU7bWFyZ2luOi41ZW0gMCAwfS51aS5tZXNzYWdlIC5saXN0Om5vdCgudWkpOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkubWVzc2FnZSAubGlzdDpub3QoLnVpKTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkubWVzc2FnZSAubGlzdDpub3QoLnVpKSBsaXtwb3NpdGlvbjpyZWxhdGl2ZTtsaXN0LXN0eWxlLXR5cGU6bm9uZTttYXJnaW46MCAwIC4zZW0gMWVtO3BhZGRpbmc6MH0udWkubWVzc2FnZSAubGlzdDpub3QoLnVpKSBsaTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDon4oCiJztsZWZ0Oi0xZW07aGVpZ2h0OjEwMCU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9LnVpLm1lc3NhZ2UgLmxpc3Q6bm90KC51aSkgbGk6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLm1lc3NhZ2U+Lmljb257bWFyZ2luLXJpZ2h0Oi42ZW19LnVpLm1lc3NhZ2U+LmNsb3NlLmljb257Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luOjA7dG9wOi43ODU3NWVtO3JpZ2h0Oi41ZW07b3BhY2l0eTouNzstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2V9LnVpLm1lc3NhZ2U+LmNsb3NlLmljb246aG92ZXJ7b3BhY2l0eToxfS51aS5tZXNzYWdlPjpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLm1lc3NhZ2U+Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5kcm9wZG93biAubWVudT4ubWVzc2FnZXttYXJnaW46MCAtMXB4fS51aS52aXNpYmxlLnZpc2libGUudmlzaWJsZS52aXNpYmxlLm1lc3NhZ2V7ZGlzcGxheTpibG9ja30udWkuaWNvbi52aXNpYmxlLnZpc2libGUudmlzaWJsZS52aXNpYmxlLm1lc3NhZ2V7ZGlzcGxheTpmbGV4fS51aS5oaWRkZW4uaGlkZGVuLmhpZGRlbi5oaWRkZW4ubWVzc2FnZXtkaXNwbGF5Om5vbmV9LnVpLmNvbXBhY3QubWVzc2FnZXtkaXNwbGF5OmlubGluZS1ibG9ja30udWkuY29tcGFjdC5pY29uLm1lc3NhZ2V7ZGlzcGxheTppbmxpbmUtZmxleH0udWkuYXR0YWNoZWQubWVzc2FnZXttYXJnaW4tYm90dG9tOi0xcHg7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7bWFyZ2luLWxlZnQ6LTFweDttYXJnaW4tcmlnaHQ6LTFweH0udWkuYXR0YWNoZWQrLnVpLmF0dGFjaGVkLm1lc3NhZ2U6bm90KC50b3ApOm5vdCguYm90dG9tKXttYXJnaW4tdG9wOi0xcHg7Ym9yZGVyLXJhZGl1czowfS51aS5ib3R0b20uYXR0YWNoZWQubWVzc2FnZXttYXJnaW4tdG9wOi0xcHg7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldCwwIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0LDAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuYm90dG9tLmF0dGFjaGVkLm1lc3NhZ2U6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjFlbX0udWkuYXR0YWNoZWQuaWNvbi5tZXNzYWdle3dpZHRoOmF1dG99LnVpLmljb24ubWVzc2FnZXtkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJTthbGlnbi1pdGVtczpjZW50ZXJ9LnVpLmljb24ubWVzc2FnZT4uaWNvbjpub3QoLmNsb3NlKXtkaXNwbGF5OmJsb2NrO2ZsZXg6MCAwIGF1dG87d2lkdGg6YXV0bztsaW5lLWhlaWdodDoxO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXNpemU6M2VtO29wYWNpdHk6Ljh9LnVpLmljb24ubWVzc2FnZT4uY29udGVudHtkaXNwbGF5OmJsb2NrO2ZsZXg6MSAxIGF1dG87dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5pY29uLm1lc3NhZ2UgLmljb246bm90KC5jbG9zZSkrLmNvbnRlbnR7cGFkZGluZy1sZWZ0OjB9LnVpLmljb24ubWVzc2FnZSAuY2lyY3VsYXIuaWNvbnt3aWR0aDoxZW19LnVpLmZsb2F0aW5nLm1lc3NhZ2V7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4yMikgaW5zZXQsMCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMjIpIGluc2V0LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ibGFjay5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6IzFiMWMxZDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkucG9zaXRpdmUubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmY2ZmZjU7Y29sb3I6IzJjNjYyZH0udWkuYXR0YWNoZWQucG9zaXRpdmUubWVzc2FnZSwudWkucG9zaXRpdmUubWVzc2FnZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhM2MyOTMgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTNjMjkzIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLnBvc2l0aXZlLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojMWE1MzFifS51aS5uZWdhdGl2ZS5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2ZmZjZmNjtjb2xvcjojOWYzYTM4fS51aS5hdHRhY2hlZC5uZWdhdGl2ZS5tZXNzYWdlLC51aS5uZWdhdGl2ZS5tZXNzYWdley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2UwYjRiNCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlMGI0YjQgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkubmVnYXRpdmUubWVzc2FnZSAuaGVhZGVye2NvbG9yOiM5MTJkMmJ9LnVpLmluZm8ubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmOGZmZmY7Y29sb3I6IzI3NmY4Nn0udWkuYXR0YWNoZWQuaW5mby5tZXNzYWdlLC51aS5pbmZvLm1lc3NhZ2V7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTlkNWRlIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2E5ZDVkZSBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5pbmZvLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojMGU1NjZjfS51aS53YXJuaW5nLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZmZmYWYzO2NvbG9yOiM1NzNhMDh9LnVpLmF0dGFjaGVkLndhcm5pbmcubWVzc2FnZSwudWkud2FybmluZy5tZXNzYWdley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2M5YmE5YiBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNjOWJhOWIgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkud2FybmluZy5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6Izc5NGIwMn0udWkuZXJyb3IubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY2ZjY7Y29sb3I6IzlmM2EzOH0udWkuYXR0YWNoZWQuZXJyb3IubWVzc2FnZSwudWkuZXJyb3IubWVzc2FnZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlMGI0YjQgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZTBiNGI0IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLmVycm9yLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojOTEyZDJifS51aS5zdWNjZXNzLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZmNmZmY1O2NvbG9yOiMyYzY2MmR9LnVpLmF0dGFjaGVkLnN1Y2Nlc3MubWVzc2FnZSwudWkuc3VjY2Vzcy5tZXNzYWdley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2EzYzI5MyBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNhM2MyOTMgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkuc3VjY2Vzcy5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzFhNTMxYn0udWkuYmxhY2subWVzc2FnZSwudWkuaW52ZXJ0ZWQubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLnJlZC5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2ZmZThlNjtjb2xvcjojZGIyODI4Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2RiMjgyOCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkYjI4MjggaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkucmVkLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojYzgyMTIxfS51aS5vcmFuZ2UubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmVkZGU7Y29sb3I6I2YyNzExYzstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNmMjcxMWMgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZjI3MTFjIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLm9yYW5nZS5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6I2U3NjQwZH0udWkueWVsbG93Lm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZmZmOGRiO2NvbG9yOiNiNTgxMDU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYjU4MTA1IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2I1ODEwNSBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS55ZWxsb3cubWVzc2FnZSAuaGVhZGVye2NvbG9yOiM5YzZmMDR9LnVpLm9saXZlLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZmJmZGVmO2NvbG9yOiM4YWJjMWU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOGFiYzFlIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzhhYmMxZSBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5vbGl2ZS5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzdhYTYxYX0udWkuZ3JlZW4ubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNlNWY5ZTc7Y29sb3I6IzFlYmMzMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxZWJjMzAgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMWViYzMwIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLmdyZWVuLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojMWFhNjJhfS51aS50ZWFsLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZTFmN2Y3O2NvbG9yOiMxMGEzYTM7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTBhM2EzIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzEwYTNhMyBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS50ZWFsLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojMGU4YzhjfS51aS5ibHVlLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZGZmMGZmO2NvbG9yOiMyMTg1ZDA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMjE4NWQwIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzIxODVkMCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5ibHVlLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojMWU3N2JhfS51aS52aW9sZXQubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNlYWU3ZmY7Y29sb3I6IzY0MzVjOTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM2NDM1YzkgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjNjQzNWM5IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLnZpb2xldC5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzVhMzBiNX0udWkucHVycGxlLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZjZlN2ZmO2NvbG9yOiNhMzMzYzg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTMzM2M4IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2EzMzNjOCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5wdXJwbGUubWVzc2FnZSAuaGVhZGVye2NvbG9yOiM5MjJlYjR9LnVpLnBpbmsubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmUzZmI7Y29sb3I6I2UwMzk5Nzstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlMDM5OTcgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZTAzOTk3IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLnBpbmsubWVzc2FnZSAuaGVhZGVye2NvbG9yOiNkZDIzOGJ9LnVpLmJyb3duLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZjFlMmQzO2NvbG9yOiNhNTY3M2Y7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTU2NzNmIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2E1NjczZiBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5icm93bi5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzkzNWIzOH0udWkubWluaS5tZXNzYWdle2ZvbnQtc2l6ZTouNzg1NzE0MjllbX0udWkudGlueS5tZXNzYWdle2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkuc21hbGwubWVzc2FnZXtmb250LXNpemU6LjkyODU3MTQzZW19LnVpLm1lc3NhZ2V7Zm9udC1zaXplOjFlbX0udWkubGFyZ2UubWVzc2FnZXtmb250LXNpemU6MS4xNDI4NTcxNGVtfS51aS5iaWcubWVzc2FnZXtmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5odWdlLm1lc3NhZ2V7Zm9udC1zaXplOjEuNDI4NTcxNDNlbX0udWkubWFzc2l2ZS5tZXNzYWdle2ZvbnQtc2l6ZToxLjcxNDI4NTcxZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFRhYmxlXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkudGFibGV7d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNmZmY7bWFyZ2luOjFlbSAwO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTt0ZXh0LWFsaWduOmxlZnQ7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTtib3JkZXItc3BhY2luZzowfS51aS50YWJsZTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnRhYmxlOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS50YWJsZSB0ZCwudWkudGFibGUgdGh7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlfS51aS50YWJsZSB0aGVhZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnRhYmxlIHRoZWFkIHRoe2N1cnNvcjphdXRvO2JhY2tncm91bmQ6I2Y5ZmFmYjt0ZXh0LWFsaWduOmluaGVyaXQ7Y29sb3I6cmdiYSgwLDAsMCwuODcpO3BhZGRpbmc6LjkyODU3MTQzZW0gLjc4NTcxNDI5ZW07dmVydGljYWwtYWxpZ246aW5oZXJpdDtmb250LXN0eWxlOm5vbmU7Zm9udC13ZWlnaHQ6NzAwO3RleHQtdHJhbnNmb3JtOm5vbmU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSk7Ym9yZGVyLWxlZnQ6bm9uZX0udWkudGFibGUgdGhlYWQgdHI+dGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkudGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQ+dGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIDB9LnVpLnRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkPnRoOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAwIDB9LnVpLnRhYmxlIHRoZWFkIHRyOmZpcnN0LWNoaWxkPnRoOm9ubHktY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkudGFibGUgdGZvb3R7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS50YWJsZSB0Zm9vdCB0aHtjdXJzb3I6YXV0bztib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7YmFja2dyb3VuZDojZjlmYWZiO3RleHQtYWxpZ246aW5oZXJpdDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7cGFkZGluZzouNzg1NzE0MjllbSAuNzg1NzE0MjllbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO3RleHQtdHJhbnNmb3JtOm5vbmV9LnVpLnRhYmxlIHRmb290IHRyPnRoOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0Om5vbmV9LnVpLnRhYmxlIHRmb290IHRyOmZpcnN0LWNoaWxkPnRoOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIDAgLjI4NTcxNDI5cmVtfS51aS50YWJsZSB0Zm9vdCB0cjpmaXJzdC1jaGlsZD50aDpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAwfS51aS50YWJsZSB0Zm9vdCB0cjpmaXJzdC1jaGlsZD50aDpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnRhYmxlIHRyIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpfS51aS50YWJsZSB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wOm5vbmV9LnVpLnRhYmxlIHRib2R5K3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRke2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpfS51aS50YWJsZSB0ZHtwYWRkaW5nOi43ODU3MTQyOWVtIC43ODU3MTQyOWVtO3RleHQtYWxpZ246aW5oZXJpdH0udWkudGFibGU+Lmljb257dmVydGljYWwtYWxpZ246YmFzZWxpbmV9LnVpLnRhYmxlPi5pY29uOm9ubHktY2hpbGR7bWFyZ2luOjB9LnVpLnRhYmxlLnNlZ21lbnR7cGFkZGluZzowfS51aS50YWJsZS5zZWdtZW50OmFmdGVye2Rpc3BsYXk6bm9uZX0udWkudGFibGUuc2VnbWVudC5zdGFja2VkOmFmdGVye2Rpc3BsYXk6YmxvY2t9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkudGFibGU6bm90KC51bnN0YWNrYWJsZSl7d2lkdGg6MTAwJX0udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdGJvZHksLnVpLnRhYmxlOm5vdCgudW5zdGFja2FibGUpIHRyLC51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0cj50ZCwudWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdHI+dGh7d2lkdGg6YXV0byFpbXBvcnRhbnQ7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LnVpLnRhYmxlOm5vdCgudW5zdGFja2FibGUpe3BhZGRpbmc6MH0udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdGhlYWR7ZGlzcGxheTpibG9ja30udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdGZvb3R7ZGlzcGxheTpibG9ja30udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdHJ7cGFkZGluZy10b3A6MWVtO3BhZGRpbmctYm90dG9tOjFlbTstd2Via2l0LWJveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDAsMCwwLC4xKSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIC0xcHggMCAwIHJnYmEoMCwwLDAsLjEpIGluc2V0IWltcG9ydGFudH0udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdHI+dGQsLnVpLnRhYmxlOm5vdCgudW5zdGFja2FibGUpIHRyPnRoe2JhY2tncm91bmQ6MCAwO2JvcmRlcjpub25lIWltcG9ydGFudDtwYWRkaW5nOi4yNWVtIC43NWVtIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdGQ6Zmlyc3QtY2hpbGQsLnVpLnRhYmxlOm5vdCgudW5zdGFja2FibGUpIHRoOmZpcnN0LWNoaWxke2ZvbnQtd2VpZ2h0OjcwMH0udWkuZGVmaW5pdGlvbi50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0aGVhZCB0aDpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH19LnVpLnRhYmxlIHRkIC5pbWFnZSwudWkudGFibGUgdGQgLmltYWdlIGltZywudWkudGFibGUgdGggLmltYWdlLC51aS50YWJsZSB0aCAuaW1hZ2UgaW1ne21heC13aWR0aDpub25lfS51aS5zdHJ1Y3R1cmVkLnRhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0udWkuc3RydWN0dXJlZC50YWJsZSB0aGVhZCB0aHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lfS51aS5zdHJ1Y3R1cmVkLnNvcnRhYmxlLnRhYmxlIHRoZWFkIHRoe2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnN0cnVjdHVyZWQuYmFzaWMudGFibGUgdGh7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZX0udWkuc3RydWN0dXJlZC5jZWxsZWQudGFibGUgdHIgdGQsLnVpLnN0cnVjdHVyZWQuY2VsbGVkLnRhYmxlIHRyIHRoe2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpfS51aS5kZWZpbml0aW9uLnRhYmxlIHRoZWFkOm5vdCguZnVsbC13aWR0aCkgdGg6Zmlyc3QtY2hpbGR7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kOjAgMDtmb250LXdlaWdodDo0MDA7Y29sb3I6cmdiYSgwLDAsMCwuNCk7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDFweCAjZmZmO2JveC1zaGFkb3c6LTFweCAtMXB4IDAgMXB4ICNmZmZ9LnVpLmRlZmluaXRpb24udGFibGUgdGZvb3Q6bm90KC5mdWxsLXdpZHRoKSB0aDpmaXJzdC1jaGlsZHtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQ6MCAwO2ZvbnQtd2VpZ2h0OnJnYmEoMCwwLDAsLjQpO2NvbG9yOm5vcm1hbDstd2Via2l0LWJveC1zaGFkb3c6MXB4IDFweCAwIDFweCAjZmZmO2JveC1zaGFkb3c6MXB4IDFweCAwIDFweCAjZmZmfS51aS5jZWxsZWQuZGVmaW5pdGlvbi50YWJsZSB0aGVhZDpub3QoLmZ1bGwtd2lkdGgpIHRoOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzowIC0xcHggMCAxcHggI2ZmZjtib3gtc2hhZG93OjAgLTFweCAwIDFweCAjZmZmfS51aS5jZWxsZWQuZGVmaW5pdGlvbi50YWJsZSB0Zm9vdDpub3QoLmZ1bGwtd2lkdGgpIHRoOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzowIDFweCAwIDFweCAjZmZmO2JveC1zaGFkb3c6MCAxcHggMCAxcHggI2ZmZn0udWkuZGVmaW5pdGlvbi50YWJsZSB0ciB0ZC5kZWZpbml0aW9uLC51aS5kZWZpbml0aW9uLnRhYmxlIHRyIHRkOmZpcnN0LWNoaWxkOm5vdCguaWdub3JlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMyk7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTt0ZXh0LXRyYW5zZm9ybTonJzstd2Via2l0LWJveC1zaGFkb3c6Jyc7Ym94LXNoYWRvdzonJzt0ZXh0LWFsaWduOicnO2ZvbnQtc2l6ZToxZW07cGFkZGluZy1sZWZ0OicnO3BhZGRpbmctcmlnaHQ6Jyd9LnVpLmRlZmluaXRpb24udGFibGUgdGhlYWQ6bm90KC5mdWxsLXdpZHRoKSB0aDpudGgtY2hpbGQoMil7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuZGVmaW5pdGlvbi50YWJsZSB0Zm9vdDpub3QoLmZ1bGwtd2lkdGgpIHRoOm50aC1jaGlsZCgyKXtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5kZWZpbml0aW9uLnRhYmxlIHRkOm50aC1jaGlsZCgyKXtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS50YWJsZSB0ZC5wb3NpdGl2ZSwudWkudGFibGUgdHIucG9zaXRpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwICNhM2MyOTMgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAjYTNjMjkzIGluc2V0fS51aS50YWJsZSB0ZC5wb3NpdGl2ZSwudWkudGFibGUgdHIucG9zaXRpdmV7YmFja2dyb3VuZDojZmNmZmY1IWltcG9ydGFudDtjb2xvcjojMmM2NjJkIWltcG9ydGFudH0udWkudGFibGUgdGQubmVnYXRpdmUsLnVpLnRhYmxlIHRyLm5lZ2F0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAjZTBiNGI0IGluc2V0O2JveC1zaGFkb3c6MCAwIDAgI2UwYjRiNCBpbnNldH0udWkudGFibGUgdGQubmVnYXRpdmUsLnVpLnRhYmxlIHRyLm5lZ2F0aXZle2JhY2tncm91bmQ6I2ZmZjZmNiFpbXBvcnRhbnQ7Y29sb3I6IzlmM2EzOCFpbXBvcnRhbnR9LnVpLnRhYmxlIHRkLmVycm9yLC51aS50YWJsZSB0ci5lcnJvcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgI2UwYjRiNCBpbnNldDtib3gtc2hhZG93OjAgMCAwICNlMGI0YjQgaW5zZXR9LnVpLnRhYmxlIHRkLmVycm9yLC51aS50YWJsZSB0ci5lcnJvcntiYWNrZ3JvdW5kOiNmZmY2ZjYhaW1wb3J0YW50O2NvbG9yOiM5ZjNhMzghaW1wb3J0YW50fS51aS50YWJsZSB0ZC53YXJuaW5nLC51aS50YWJsZSB0ci53YXJuaW5ney13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAjYzliYTliIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgI2M5YmE5YiBpbnNldH0udWkudGFibGUgdGQud2FybmluZywudWkudGFibGUgdHIud2FybmluZ3tiYWNrZ3JvdW5kOiNmZmZhZjMhaW1wb3J0YW50O2NvbG9yOiM1NzNhMDghaW1wb3J0YW50fS51aS50YWJsZSB0ZC5hY3RpdmUsLnVpLnRhYmxlIHRyLmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgcmdiYSgwLDAsMCwuODcpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgcmdiYSgwLDAsMCwuODcpIGluc2V0fS51aS50YWJsZSB0ZC5hY3RpdmUsLnVpLnRhYmxlIHRyLmFjdGl2ZXtiYWNrZ3JvdW5kOiNlMGUwZTAhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjg3KSFpbXBvcnRhbnR9LnVpLnRhYmxlIHRyIHRkLmRpc2FibGVkLC51aS50YWJsZSB0ci5kaXNhYmxlZCB0ZCwudWkudGFibGUgdHIuZGlzYWJsZWQ6aG92ZXIsLnVpLnRhYmxlIHRyOmhvdmVyIHRkLmRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmU7Y29sb3I6cmdiYSg0MCw0MCw0MCwuMyl9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUsLnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRib2R5LC51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS50YWJsZSB0ciwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdHI+dGQsLnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRyPnRoe3dpZHRoOjEwMCUhaW1wb3J0YW50O2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fS51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS50YWJsZXtwYWRkaW5nOjB9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRoZWFke2Rpc3BsYXk6YmxvY2t9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRmb290e2Rpc3BsYXk6YmxvY2t9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRye3BhZGRpbmctdG9wOjFlbTtwYWRkaW5nLWJvdHRvbToxZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgwLDAsMCwuMSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDAsMCwwLC4xKSBpbnNldCFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRyPnRkLC51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS50YWJsZSB0cj50aHtiYWNrZ3JvdW5kOjAgMDtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7cGFkZGluZzouMjVlbSAuNzVlbTstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuZGVmaW5pdGlvbltjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS50YWJsZSB0aGVhZCB0aDpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH19LnVpLnRhYmxlIFtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLC51aS50YWJsZVtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJde3RleHQtYWxpZ246bGVmdH0udWkudGFibGUgW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJde3RleHQtYWxpZ246Y2VudGVyfS51aS50YWJsZSBbY2xhc3MqPVxcXCJyaWdodCBhbGlnbmVkXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJde3RleHQtYWxpZ246cmlnaHR9LnVpLnRhYmxlIFtjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXXt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLnRhYmxlIFtjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXXt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLnRhYmxlIFtjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXXt2ZXJ0aWNhbC1hbGlnbjpib3R0b219LnVpLnRhYmxlIHRkLmNvbGxhcHNpbmcsLnVpLnRhYmxlIHRoLmNvbGxhcHNpbmd7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcH0udWkuZml4ZWQudGFibGV7dGFibGUtbGF5b3V0OmZpeGVkfS51aS5maXhlZC50YWJsZSB0ZCwudWkuZml4ZWQudGFibGUgdGh7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9LnVpLnNlbGVjdGFibGUudGFibGUgdGJvZHkgdHI6aG92ZXIsLnVpLnRhYmxlIHRib2R5IHRyIHRkLnNlbGVjdGFibGU6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSkhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjk1KSFpbXBvcnRhbnR9LnVpLmludmVydGVkLnRhYmxlIHRib2R5IHRyIHRkLnNlbGVjdGFibGU6aG92ZXIsLnVpLnNlbGVjdGFibGUuaW52ZXJ0ZWQudGFibGUgdGJvZHkgdHI6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCkhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS50YWJsZSB0Ym9keSB0ciB0ZC5zZWxlY3RhYmxle3BhZGRpbmc6MH0udWkudGFibGUgdGJvZHkgdHIgdGQuc2VsZWN0YWJsZT5hOm5vdCgudWkpe2Rpc3BsYXk6YmxvY2s7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOi43ODU3MTQyOWVtIC43ODU3MTQyOWVtfS51aS5zZWxlY3RhYmxlLnRhYmxlIHRyLmVycm9yOmhvdmVyLC51aS5zZWxlY3RhYmxlLnRhYmxlIHRyOmhvdmVyIHRkLmVycm9yLC51aS50YWJsZSB0ciB0ZC5zZWxlY3RhYmxlLmVycm9yOmhvdmVye2JhY2tncm91bmQ6I2ZmZTdlNyFpbXBvcnRhbnQ7Y29sb3I6Izk0MzYzNCFpbXBvcnRhbnR9LnVpLnNlbGVjdGFibGUudGFibGUgdHIud2FybmluZzpob3ZlciwudWkuc2VsZWN0YWJsZS50YWJsZSB0cjpob3ZlciB0ZC53YXJuaW5nLC51aS50YWJsZSB0ciB0ZC5zZWxlY3RhYmxlLndhcm5pbmc6aG92ZXJ7YmFja2dyb3VuZDojZmZmNGU0IWltcG9ydGFudDtjb2xvcjojNDkzMTA3IWltcG9ydGFudH0udWkuc2VsZWN0YWJsZS50YWJsZSB0ci5hY3RpdmU6aG92ZXIsLnVpLnNlbGVjdGFibGUudGFibGUgdHI6aG92ZXIgdGQuYWN0aXZlLC51aS50YWJsZSB0ciB0ZC5zZWxlY3RhYmxlLmFjdGl2ZTpob3ZlcntiYWNrZ3JvdW5kOiNlMGUwZTAhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjg3KSFpbXBvcnRhbnR9LnVpLnNlbGVjdGFibGUudGFibGUgdHIucG9zaXRpdmU6aG92ZXIsLnVpLnNlbGVjdGFibGUudGFibGUgdHI6aG92ZXIgdGQucG9zaXRpdmUsLnVpLnRhYmxlIHRyIHRkLnNlbGVjdGFibGUucG9zaXRpdmU6aG92ZXJ7YmFja2dyb3VuZDojZjdmZmU2IWltcG9ydGFudDtjb2xvcjojMjc1YjI4IWltcG9ydGFudH0udWkuc2VsZWN0YWJsZS50YWJsZSB0ci5uZWdhdGl2ZTpob3ZlciwudWkuc2VsZWN0YWJsZS50YWJsZSB0cjpob3ZlciB0ZC5uZWdhdGl2ZSwudWkudGFibGUgdHIgdGQuc2VsZWN0YWJsZS5uZWdhdGl2ZTpob3ZlcntiYWNrZ3JvdW5kOiNmZmU3ZTchaW1wb3J0YW50O2NvbG9yOiM5NDM2MzQhaW1wb3J0YW50fS51aS5hdHRhY2hlZC50YWJsZXt0b3A6MDtib3R0b206MDtib3JkZXItcmFkaXVzOjA7bWFyZ2luOjAgLTFweDt3aWR0aDpjYWxjKDEwMCUgKyAycHgpO21heC13aWR0aDpjYWxjKDEwMCUgKyAycHgpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDV9LnVpLmF0dGFjaGVkKy51aS5hdHRhY2hlZC50YWJsZTpub3QoLnRvcCl7Ym9yZGVyLXRvcDpub25lfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLnRhYmxle2JvdHRvbTowO21hcmdpbi1ib3R0b206MDt0b3A6MDttYXJnaW4tdG9wOjFlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS50YWJsZVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWlbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS50YWJsZXtib3R0b206MDttYXJnaW4tdG9wOjA7dG9wOjA7bWFyZ2luLWJvdHRvbToxZW07LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUsbm9uZTtib3gtc2hhZG93Om5vbmUsbm9uZTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLnRhYmxlOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5zdHJpcGVkLnRhYmxlIHRib2R5IHRyOm50aC1jaGlsZCgybiksLnVpLnN0cmlwZWQudGFibGU+dHI6bnRoLWNoaWxkKDJuKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDUwLC4wMil9LnVpLmludmVydGVkLnN0cmlwZWQudGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKSwudWkuaW52ZXJ0ZWQuc3RyaXBlZC50YWJsZT50cjpudGgtY2hpbGQoMm4pe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMDUpfS51aS5zdHJpcGVkLnNlbGVjdGFibGUuc2VsZWN0YWJsZS5zZWxlY3RhYmxlLnRhYmxlIHRib2R5IHRyLmFjdGl2ZTpob3ZlcntiYWNrZ3JvdW5kOiNlZmVmZWYhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjk1KSFpbXBvcnRhbnR9LnVpLnRhYmxlIFtjbGFzcyo9XFxcInNpbmdsZSBsaW5lXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwic2luZ2xlIGxpbmVcXFwiXXt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLnRhYmxlIFtjbGFzcyo9XFxcInNpbmdsZSBsaW5lXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwic2luZ2xlIGxpbmVcXFwiXXt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLnJlZC50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgI2RiMjgyOH0udWkuaW52ZXJ0ZWQucmVkLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2RiMjgyOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9yYW5nZS50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgI2YyNzExY30udWkuaW52ZXJ0ZWQub3JhbmdlLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnllbGxvdy50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgI2ZiYmQwOH0udWkuaW52ZXJ0ZWQueWVsbG93LnRhYmxle2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9saXZlLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjYjVjYzE4fS51aS5pbnZlcnRlZC5vbGl2ZS50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiNiNWNjMTghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ncmVlbi50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgIzIxYmE0NX0udWkuaW52ZXJ0ZWQuZ3JlZW4udGFibGV7YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkudGVhbC50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgIzAwYjVhZH0udWkuaW52ZXJ0ZWQudGVhbC50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMGI1YWQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibHVlLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjMjE4NWQwfS51aS5pbnZlcnRlZC5ibHVlLnRhYmxle2JhY2tncm91bmQtY29sb3I6IzIxODVkMCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnZpb2xldC50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgIzY0MzVjOX0udWkuaW52ZXJ0ZWQudmlvbGV0LnRhYmxle2JhY2tncm91bmQtY29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnB1cnBsZS50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgI2EzMzNjOH0udWkuaW52ZXJ0ZWQucHVycGxlLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnBpbmsudGFibGV7Ym9yZGVyLXRvcDouMmVtIHNvbGlkICNlMDM5OTd9LnVpLmludmVydGVkLnBpbmsudGFibGV7YmFja2dyb3VuZC1jb2xvcjojZTAzOTk3IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuYnJvd24udGFibGV7Ym9yZGVyLXRvcDouMmVtIHNvbGlkICNhNTY3M2Z9LnVpLmludmVydGVkLmJyb3duLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZXkudGFibGV7Ym9yZGVyLXRvcDouMmVtIHNvbGlkICM3Njc2NzZ9LnVpLmludmVydGVkLmdyZXkudGFibGV7YmFja2dyb3VuZC1jb2xvcjojNzY3Njc2IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuYmxhY2sudGFibGV7Ym9yZGVyLXRvcDouMmVtIHNvbGlkICMxYjFjMWR9LnVpLmludmVydGVkLmJsYWNrLnRhYmxle2JhY2tncm91bmQtY29sb3I6IzFiMWMxZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9uZS5jb2x1bW4udGFibGUgdGR7d2lkdGg6MTAwJX0udWkudHdvLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDo1MCV9LnVpLnRocmVlLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDozMy4zMzMzMzMzMyV9LnVpLmZvdXIuY29sdW1uLnRhYmxlIHRke3dpZHRoOjI1JX0udWkuZml2ZS5jb2x1bW4udGFibGUgdGR7d2lkdGg6MjAlfS51aS5zaXguY29sdW1uLnRhYmxlIHRke3dpZHRoOjE2LjY2NjY2NjY3JX0udWkuc2V2ZW4uY29sdW1uLnRhYmxlIHRke3dpZHRoOjE0LjI4NTcxNDI5JX0udWkuZWlnaHQuY29sdW1uLnRhYmxlIHRke3dpZHRoOjEyLjUlfS51aS5uaW5lLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDoxMS4xMTExMTExMSV9LnVpLnRlbi5jb2x1bW4udGFibGUgdGR7d2lkdGg6MTAlfS51aS5lbGV2ZW4uY29sdW1uLnRhYmxlIHRke3dpZHRoOjkuMDkwOTA5MDklfS51aS50d2VsdmUuY29sdW1uLnRhYmxlIHRke3dpZHRoOjguMzMzMzMzMzMlfS51aS50aGlydGVlbi5jb2x1bW4udGFibGUgdGR7d2lkdGg6Ny42OTIzMDc2OSV9LnVpLmZvdXJ0ZWVuLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDo3LjE0Mjg1NzE0JX0udWkuZmlmdGVlbi5jb2x1bW4udGFibGUgdGR7d2lkdGg6Ni42NjY2NjY2NyV9LnVpLnNpeHRlZW4uY29sdW1uLnRhYmxlIHRke3dpZHRoOjYuMjUlfS51aS50YWJsZSB0ZC5vbmUud2lkZSwudWkudGFibGUgdGgub25lLndpZGV7d2lkdGg6Ni4yNSV9LnVpLnRhYmxlIHRkLnR3by53aWRlLC51aS50YWJsZSB0aC50d28ud2lkZXt3aWR0aDoxMi41JX0udWkudGFibGUgdGQudGhyZWUud2lkZSwudWkudGFibGUgdGgudGhyZWUud2lkZXt3aWR0aDoxOC43NSV9LnVpLnRhYmxlIHRkLmZvdXIud2lkZSwudWkudGFibGUgdGguZm91ci53aWRle3dpZHRoOjI1JX0udWkudGFibGUgdGQuZml2ZS53aWRlLC51aS50YWJsZSB0aC5maXZlLndpZGV7d2lkdGg6MzEuMjUlfS51aS50YWJsZSB0ZC5zaXgud2lkZSwudWkudGFibGUgdGguc2l4LndpZGV7d2lkdGg6MzcuNSV9LnVpLnRhYmxlIHRkLnNldmVuLndpZGUsLnVpLnRhYmxlIHRoLnNldmVuLndpZGV7d2lkdGg6NDMuNzUlfS51aS50YWJsZSB0ZC5laWdodC53aWRlLC51aS50YWJsZSB0aC5laWdodC53aWRle3dpZHRoOjUwJX0udWkudGFibGUgdGQubmluZS53aWRlLC51aS50YWJsZSB0aC5uaW5lLndpZGV7d2lkdGg6NTYuMjUlfS51aS50YWJsZSB0ZC50ZW4ud2lkZSwudWkudGFibGUgdGgudGVuLndpZGV7d2lkdGg6NjIuNSV9LnVpLnRhYmxlIHRkLmVsZXZlbi53aWRlLC51aS50YWJsZSB0aC5lbGV2ZW4ud2lkZXt3aWR0aDo2OC43NSV9LnVpLnRhYmxlIHRkLnR3ZWx2ZS53aWRlLC51aS50YWJsZSB0aC50d2VsdmUud2lkZXt3aWR0aDo3NSV9LnVpLnRhYmxlIHRkLnRoaXJ0ZWVuLndpZGUsLnVpLnRhYmxlIHRoLnRoaXJ0ZWVuLndpZGV7d2lkdGg6ODEuMjUlfS51aS50YWJsZSB0ZC5mb3VydGVlbi53aWRlLC51aS50YWJsZSB0aC5mb3VydGVlbi53aWRle3dpZHRoOjg3LjUlfS51aS50YWJsZSB0ZC5maWZ0ZWVuLndpZGUsLnVpLnRhYmxlIHRoLmZpZnRlZW4ud2lkZXt3aWR0aDo5My43NSV9LnVpLnRhYmxlIHRkLnNpeHRlZW4ud2lkZSwudWkudGFibGUgdGguc2l4dGVlbi53aWRle3dpZHRoOjEwMCV9LnVpLnNvcnRhYmxlLnRhYmxlIHRoZWFkIHRoe2N1cnNvcjpwb2ludGVyO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguc29ydGVkLC51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aC5zb3J0ZWQ6aG92ZXJ7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnVpLnNvcnRhYmxlLnRhYmxlIHRoZWFkIHRoOmFmdGVye2Rpc3BsYXk6bm9uZTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7Y29udGVudDonJztoZWlnaHQ6MWVtO3dpZHRoOmF1dG87b3BhY2l0eTouODttYXJnaW46MCAwIDAgLjVlbTtmb250LWZhbWlseTpJY29uc30udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguYXNjZW5kaW5nOmFmdGVye2NvbnRlbnQ6J1xcXFxmMGQ4J30udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguZGVzY2VuZGluZzphZnRlcntjb250ZW50OidcXFxcZjBkNyd9LnVpLnNvcnRhYmxlLnRhYmxlIHRoLmRpc2FibGVkOmhvdmVye2N1cnNvcjphdXRvO2NvbG9yOnJnYmEoNDAsNDAsNDAsLjMpfS51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguc29ydGVke2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguc29ydGVkOmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aC5zb3J0ZWQ6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5pbnZlcnRlZC5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aC5zb3J0ZWR7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuMDUpKTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjE1KSAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCwgbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuc29ydGFibGUudGFibGUgdGhlYWQgdGg6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuMDUpKTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KSAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCwgbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuc29ydGFibGUudGFibGUgdGhlYWQgdGh7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS51aS5pbnZlcnRlZC50YWJsZXtiYWNrZ3JvdW5kOiMzMzM7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSk7Ym9yZGVyOm5vbmV9LnVpLmludmVydGVkLnRhYmxlIHRoe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTUpO2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKSFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC50YWJsZSB0ciB0ZHtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC50YWJsZSB0ciB0ZC5kaXNhYmxlZCwudWkuaW52ZXJ0ZWQudGFibGUgdHIuZGlzYWJsZWQgdGQsLnVpLmludmVydGVkLnRhYmxlIHRyLmRpc2FibGVkOmhvdmVyIHRkLC51aS5pbnZlcnRlZC50YWJsZSB0cjpob3ZlciB0ZC5kaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lO2NvbG9yOnJnYmEoMjI1LDIyNSwyMjUsLjMpfS51aS5pbnZlcnRlZC5kZWZpbml0aW9uLnRhYmxlIHRmb290Om5vdCguZnVsbC13aWR0aCkgdGg6Zmlyc3QtY2hpbGQsLnVpLmludmVydGVkLmRlZmluaXRpb24udGFibGUgdGhlYWQ6bm90KC5mdWxsLXdpZHRoKSB0aDpmaXJzdC1jaGlsZHtiYWNrZ3JvdW5kOiNmZmZ9LnVpLmludmVydGVkLmRlZmluaXRpb24udGFibGUgdHIgdGQ6Zmlyc3QtY2hpbGR7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wMik7Y29sb3I6I2ZmZn0udWkuY29sbGFwc2luZy50YWJsZXt3aWR0aDphdXRvfS51aS5iYXNpYy50YWJsZXtiYWNrZ3JvdW5kOjAgMDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnRhYmxlIHRmb290LC51aS5iYXNpYy50YWJsZSB0aGVhZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnRhYmxlIHRoe2JhY2tncm91bmQ6MCAwO2JvcmRlci1sZWZ0Om5vbmV9LnVpLmJhc2ljLnRhYmxlIHRib2R5IHRye2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEpfS51aS5iYXNpYy50YWJsZSB0ZHtiYWNrZ3JvdW5kOjAgMH0udWkuYmFzaWMuc3RyaXBlZC50YWJsZSB0Ym9keSB0cjpudGgtY2hpbGQoMm4pe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDUpIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGV7Ym9yZGVyOm5vbmV9LnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxlOm5vdCguc29ydGFibGUpOm5vdCguc3RyaXBlZCkgdGQsLnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxlOm5vdCguc29ydGFibGUpOm5vdCguc3RyaXBlZCkgdGh7cGFkZGluZzonJ30udWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGU6bm90KC5zb3J0YWJsZSk6bm90KC5zdHJpcGVkKSB0ZDpmaXJzdC1jaGlsZCwudWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGU6bm90KC5zb3J0YWJsZSk6bm90KC5zdHJpcGVkKSB0aDpmaXJzdC1jaGlsZHtwYWRkaW5nLWxlZnQ6MH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGU6bm90KC5zb3J0YWJsZSk6bm90KC5zdHJpcGVkKSB0ZDpsYXN0LWNoaWxkLC51aVtjbGFzcyo9XFxcInZlcnkgYmFzaWNcXFwiXS50YWJsZTpub3QoLnNvcnRhYmxlKTpub3QoLnN0cmlwZWQpIHRoOmxhc3QtY2hpbGR7cGFkZGluZy1yaWdodDowfS51aVtjbGFzcyo9XFxcInZlcnkgYmFzaWNcXFwiXS50YWJsZTpub3QoLnNvcnRhYmxlKTpub3QoLnN0cmlwZWQpIHRoZWFkIHRyOmZpcnN0LWNoaWxkIHRoe3BhZGRpbmctdG9wOjB9LnVpLmNlbGxlZC50YWJsZSB0ciB0ZCwudWkuY2VsbGVkLnRhYmxlIHRyIHRoe2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKX0udWkuY2VsbGVkLnRhYmxlIHRyIHRkOmZpcnN0LWNoaWxkLC51aS5jZWxsZWQudGFibGUgdHIgdGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkucGFkZGVkLnRhYmxlIHRoe3BhZGRpbmctbGVmdDoxZW07cGFkZGluZy1yaWdodDoxZW19LnVpLnBhZGRlZC50YWJsZSB0ZCwudWkucGFkZGVkLnRhYmxlIHRoe3BhZGRpbmc6MWVtIDFlbX0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHBhZGRlZFxcXCJdLnRhYmxlIHRoe3BhZGRpbmctbGVmdDoxLjVlbTtwYWRkaW5nLXJpZ2h0OjEuNWVtfS51aVtjbGFzcyo9XFxcInZlcnkgcGFkZGVkXFxcIl0udGFibGUgdGR7cGFkZGluZzoxLjVlbSAxLjVlbX0udWkuY29tcGFjdC50YWJsZSB0aHtwYWRkaW5nLWxlZnQ6LjdlbTtwYWRkaW5nLXJpZ2h0Oi43ZW19LnVpLmNvbXBhY3QudGFibGUgdGR7cGFkZGluZzouNWVtIC43ZW19LnVpW2NsYXNzKj1cXFwidmVyeSBjb21wYWN0XFxcIl0udGFibGUgdGh7cGFkZGluZy1sZWZ0Oi42ZW07cGFkZGluZy1yaWdodDouNmVtfS51aVtjbGFzcyo9XFxcInZlcnkgY29tcGFjdFxcXCJdLnRhYmxlIHRke3BhZGRpbmc6LjRlbSAuNmVtfS51aS5zbWFsbC50YWJsZXtmb250LXNpemU6LjllbX0udWkudGFibGV7Zm9udC1zaXplOjFlbX0udWkubGFyZ2UudGFibGV7Zm9udC1zaXplOjEuMWVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBBZFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogQ29weXJpZ2h0IDIwMTMgQ29udHJpYnV0b3JzXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmFke2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbjoxZW0gMH0udWkuYWQ6Zmlyc3QtY2hpbGR7bWFyZ2luOjB9LnVpLmFkOmxhc3QtY2hpbGR7bWFyZ2luOjB9LnVpLmFkIGlmcmFtZXttYXJnaW46MDtwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7b3ZlcmZsb3c6aGlkZGVufS51aS5sZWFkZXJib2FyZC5hZHt3aWR0aDo3MjhweDtoZWlnaHQ6OTBweH0udWlbY2xhc3MqPVxcXCJtZWRpdW0gcmVjdGFuZ2xlXFxcIl0uYWR7d2lkdGg6MzAwcHg7aGVpZ2h0OjI1MHB4fS51aVtjbGFzcyo9XFxcImxhcmdlIHJlY3RhbmdsZVxcXCJdLmFke3dpZHRoOjMzNnB4O2hlaWdodDoyODBweH0udWlbY2xhc3MqPVxcXCJoYWxmIHBhZ2VcXFwiXS5hZHt3aWR0aDozMDBweDtoZWlnaHQ6NjAwcHh9LnVpLnNxdWFyZS5hZHt3aWR0aDoyNTBweDtoZWlnaHQ6MjUwcHh9LnVpW2NsYXNzKj1cXFwic21hbGwgc3F1YXJlXFxcIl0uYWR7d2lkdGg6MjAwcHg7aGVpZ2h0OjIwMHB4fS51aVtjbGFzcyo9XFxcInNtYWxsIHJlY3RhbmdsZVxcXCJdLmFke3dpZHRoOjE4MHB4O2hlaWdodDoxNTBweH0udWlbY2xhc3MqPVxcXCJ2ZXJ0aWNhbCByZWN0YW5nbGVcXFwiXS5hZHt3aWR0aDoyNDBweDtoZWlnaHQ6NDAwcHh9LnVpLmJ1dHRvbi5hZHt3aWR0aDoxMjBweDtoZWlnaHQ6OTBweH0udWlbY2xhc3MqPVxcXCJzcXVhcmUgYnV0dG9uXFxcIl0uYWR7d2lkdGg6MTI1cHg7aGVpZ2h0OjEyNXB4fS51aVtjbGFzcyo9XFxcInNtYWxsIGJ1dHRvblxcXCJdLmFke3dpZHRoOjEyMHB4O2hlaWdodDo2MHB4fS51aS5za3lzY3JhcGVyLmFke3dpZHRoOjEyMHB4O2hlaWdodDo2MDBweH0udWlbY2xhc3MqPVxcXCJ3aWRlIHNreXNjcmFwZXJcXFwiXS5hZHt3aWR0aDoxNjBweH0udWkuYmFubmVyLmFke3dpZHRoOjQ2OHB4O2hlaWdodDo2MHB4fS51aVtjbGFzcyo9XFxcInZlcnRpY2FsIGJhbm5lclxcXCJdLmFke3dpZHRoOjEyMHB4O2hlaWdodDoyNDBweH0udWlbY2xhc3MqPVxcXCJ0b3AgYmFubmVyXFxcIl0uYWR7d2lkdGg6OTMwcHg7aGVpZ2h0OjE4MHB4fS51aVtjbGFzcyo9XFxcImhhbGYgYmFubmVyXFxcIl0uYWR7d2lkdGg6MjM0cHg7aGVpZ2h0OjYwcHh9LnVpW2NsYXNzKj1cXFwibGFyZ2UgbGVhZGVyYm9hcmRcXFwiXS5hZHt3aWR0aDo5NzBweDtoZWlnaHQ6OTBweH0udWkuYmlsbGJvYXJkLmFke3dpZHRoOjk3MHB4O2hlaWdodDoyNTBweH0udWkucGFub3JhbWEuYWR7d2lkdGg6OTgwcHg7aGVpZ2h0OjEyMHB4fS51aS5uZXRib2FyZC5hZHt3aWR0aDo1ODBweDtoZWlnaHQ6NDAwcHh9LnVpW2NsYXNzKj1cXFwibGFyZ2UgbW9iaWxlIGJhbm5lclxcXCJdLmFke3dpZHRoOjMyMHB4O2hlaWdodDoxMDBweH0udWlbY2xhc3MqPVxcXCJtb2JpbGUgbGVhZGVyYm9hcmRcXFwiXS5hZHt3aWR0aDozMjBweDtoZWlnaHQ6NTBweH0udWkubW9iaWxlLmFke2Rpc3BsYXk6bm9uZX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5tb2JpbGUuYWR7ZGlzcGxheTpibG9ja319LnVpLmNlbnRlcmVkLmFke21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLnRlc3QuYWR7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDojNTQ1NDU0fS51aS50ZXN0LmFkOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTtjb250ZW50OidBZCc7Y29sb3I6I2ZmZjtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjcwMH0udWkubW9iaWxlLnRlc3QuYWQ6YWZ0ZXJ7Zm9udC1zaXplOi44NTcxNDI4NmVtfS51aS50ZXN0LmFkW2RhdGEtdGV4dF06YWZ0ZXJ7Y29udGVudDphdHRyKGRhdGEtdGV4dCl9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEl0ZW1cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5jYXJkLC51aS5jYXJkcz4uY2FyZHttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjI5MHB4O21pbi1oZWlnaHQ6MDtiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzowO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAzcHggMCAjZDRkNGQ1LDAgMCAwIDFweCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAxcHggM3B4IDAgI2Q0ZDRkNSwwIDAgMCAxcHggI2Q0ZDRkNTstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSx0cmFuc2Zvcm0gLjFzIGVhc2U7dHJhbnNpdGlvbjpib3gtc2hhZG93IC4xcyBlYXNlLHRyYW5zZm9ybSAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2U7ei1pbmRleDonJ30udWkuY2FyZHttYXJnaW46MWVtIDB9LnVpLmNhcmQgYSwudWkuY2FyZHM+LmNhcmQgYXtjdXJzb3I6cG9pbnRlcn0udWkuY2FyZDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLmNhcmQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLmNhcmRze2Rpc3BsYXk6ZmxleDttYXJnaW46LS44NzVlbSAtLjVlbTtmbGV4LXdyYXA6d3JhcH0udWkuY2FyZHM+LmNhcmR7ZGlzcGxheTpmbGV4O21hcmdpbjouODc1ZW0gLjVlbTtmbG9hdDpub25lfS51aS5jYXJkOmFmdGVyLC51aS5jYXJkczphZnRlcntkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6JyAnO2hlaWdodDowO2NsZWFyOmJvdGg7b3ZlcmZsb3c6aGlkZGVuO3Zpc2liaWxpdHk6aGlkZGVufS51aS5jYXJkc34udWkuY2FyZHN7bWFyZ2luLXRvcDouODc1ZW19LnVpLmNhcmQ+OmZpcnN0LWNoaWxkLC51aS5jYXJkcz4uY2FyZD46Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMCFpbXBvcnRhbnQ7Ym9yZGVyLXRvcDpub25lIWltcG9ydGFudH0udWkuY2FyZD46bGFzdC1jaGlsZCwudWkuY2FyZHM+LmNhcmQ+Omxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSFpbXBvcnRhbnR9LnVpLmNhcmQ+Om9ubHktY2hpbGQsLnVpLmNhcmRzPi5jYXJkPjpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkuY2FyZD4uaW1hZ2UsLnVpLmNhcmRzPi5jYXJkPi5pbWFnZXtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2ZsZXg6MCAwIGF1dG87cGFkZGluZzowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpfS51aS5jYXJkPi5pbWFnZT5pbWcsLnVpLmNhcmRzPi5jYXJkPi5pbWFnZT5pbWd7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDphdXRvO2JvcmRlci1yYWRpdXM6aW5oZXJpdH0udWkuY2FyZD4uaW1hZ2U6bm90KC51aSk+aW1nLC51aS5jYXJkcz4uY2FyZD4uaW1hZ2U6bm90KC51aSk+aW1ne2JvcmRlcjpub25lfS51aS5jYXJkPi5jb250ZW50LC51aS5jYXJkcz4uY2FyZD4uY29udGVudHtmbGV4LWdyb3c6MTtib3JkZXI6bm9uZTtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKTtiYWNrZ3JvdW5kOjAgMDttYXJnaW46MDtwYWRkaW5nOjFlbSAxZW07LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2ZvbnQtc2l6ZToxZW07Ym9yZGVyLXJhZGl1czowfS51aS5jYXJkPi5jb250ZW50OmFmdGVyLC51aS5jYXJkcz4uY2FyZD4uY29udGVudDphZnRlcntkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6JyAnO2hlaWdodDowO2NsZWFyOmJvdGg7b3ZlcmZsb3c6aGlkZGVuO3Zpc2liaWxpdHk6aGlkZGVufS51aS5jYXJkPi5jb250ZW50Pi5oZWFkZXIsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50Pi5oZWFkZXJ7ZGlzcGxheTpibG9jazttYXJnaW46Jyc7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuY2FyZD4uY29udGVudD4uaGVhZGVyOm5vdCgudWkpLC51aS5jYXJkcz4uY2FyZD4uY29udGVudD4uaGVhZGVyOm5vdCgudWkpe2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MS4yODU3MTQyOWVtO21hcmdpbi10b3A6LS4yMTQyNWVtO2xpbmUtaGVpZ2h0OjEuMjg1NzE0MjllbX0udWkuY2FyZD4uY29udGVudD4uaGVhZGVyKy5kZXNjcmlwdGlvbiwudWkuY2FyZD4uY29udGVudD4ubWV0YSsuZGVzY3JpcHRpb24sLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50Pi5oZWFkZXIrLmRlc2NyaXB0aW9uLC51aS5jYXJkcz4uY2FyZD4uY29udGVudD4ubWV0YSsuZGVzY3JpcHRpb257bWFyZ2luLXRvcDouNWVtfS51aS5jYXJkIFtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJdLC51aS5jYXJkcz4uY2FyZCBbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXXtmbG9hdDpsZWZ0fS51aS5jYXJkIFtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXSwudWkuY2FyZHM+LmNhcmQgW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJde2Zsb2F0OnJpZ2h0fS51aS5jYXJkIFtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLC51aS5jYXJkcz4uY2FyZCBbY2xhc3MqPVxcXCJsZWZ0IGFsaWduZWRcXFwiXXt0ZXh0LWFsaWduOmxlZnR9LnVpLmNhcmQgW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXSwudWkuY2FyZHM+LmNhcmQgW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXXt0ZXh0LWFsaWduOmNlbnRlcn0udWkuY2FyZCBbY2xhc3MqPVxcXCJyaWdodCBhbGlnbmVkXFxcIl0sLnVpLmNhcmRzPi5jYXJkIFtjbGFzcyo9XFxcInJpZ2h0IGFsaWduZWRcXFwiXXt0ZXh0LWFsaWduOnJpZ2h0fS51aS5jYXJkIC5jb250ZW50IGltZywudWkuY2FyZHM+LmNhcmQgLmNvbnRlbnQgaW1ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aWR0aDonJ30udWkuY2FyZCAuYXZhdGFyIGltZywudWkuY2FyZCBpbWcuYXZhdGFyLC51aS5jYXJkcz4uY2FyZCAuYXZhdGFyIGltZywudWkuY2FyZHM+LmNhcmQgaW1nLmF2YXRhcnt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkuY2FyZD4uY29udGVudD4uZGVzY3JpcHRpb24sLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50Pi5kZXNjcmlwdGlvbntjbGVhcjpib3RoO2NvbG9yOnJnYmEoMCwwLDAsLjY4KX0udWkuY2FyZD4uY29udGVudCBwLC51aS5jYXJkcz4uY2FyZD4uY29udGVudCBwe21hcmdpbjowIDAgLjVlbX0udWkuY2FyZD4uY29udGVudCBwOmxhc3QtY2hpbGQsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IHA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLmNhcmQgLm1ldGEsLnVpLmNhcmRzPi5jYXJkIC5tZXRhe2ZvbnQtc2l6ZToxZW07Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLmNhcmQgLm1ldGEgKiwudWkuY2FyZHM+LmNhcmQgLm1ldGEgKnttYXJnaW4tcmlnaHQ6LjNlbX0udWkuY2FyZCAubWV0YSA6bGFzdC1jaGlsZCwudWkuY2FyZHM+LmNhcmQgLm1ldGEgOmxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LnVpLmNhcmQgLm1ldGEgW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLC51aS5jYXJkcz4uY2FyZCAubWV0YSBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl17bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6LjNlbX0udWkuY2FyZD4uY29udGVudCBhOm5vdCgudWkpLC51aS5jYXJkcz4uY2FyZD4uY29udGVudCBhOm5vdCgudWkpe2NvbG9yOicnOy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlfS51aS5jYXJkPi5jb250ZW50IGE6bm90KC51aSk6aG92ZXIsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IGE6bm90KC51aSk6aG92ZXJ7Y29sb3I6Jyd9LnVpLmNhcmQ+LmNvbnRlbnQ+YS5oZWFkZXIsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50PmEuaGVhZGVye2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuY2FyZD4uY29udGVudD5hLmhlYWRlcjpob3ZlciwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQ+YS5oZWFkZXI6aG92ZXJ7Y29sb3I6IzFlNzBiZn0udWkuY2FyZCAubWV0YT5hOm5vdCgudWkpLC51aS5jYXJkcz4uY2FyZCAubWV0YT5hOm5vdCgudWkpe2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5jYXJkIC5tZXRhPmE6bm90KC51aSk6aG92ZXIsLnVpLmNhcmRzPi5jYXJkIC5tZXRhPmE6bm90KC51aSk6aG92ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5jYXJkPi5idXR0b24sLnVpLmNhcmQ+LmJ1dHRvbnMsLnVpLmNhcmRzPi5jYXJkPi5idXR0b24sLnVpLmNhcmRzPi5jYXJkPi5idXR0b25ze21hcmdpbjowIC0xcHg7d2lkdGg6Y2FsYygxMDAlICsgMnB4KX0udWkuY2FyZCAuZGltbWVyLC51aS5jYXJkcz4uY2FyZCAuZGltbWVye2JhY2tncm91bmQtY29sb3I6Jyc7ei1pbmRleDoxMH0udWkuY2FyZD4uY29udGVudCAuc3Rhci5pY29uLC51aS5jYXJkcz4uY2FyZD4uY29udGVudCAuc3Rhci5pY29ue2N1cnNvcjpwb2ludGVyO29wYWNpdHk6Ljc1Oy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlfS51aS5jYXJkPi5jb250ZW50IC5zdGFyLmljb246aG92ZXIsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IC5zdGFyLmljb246aG92ZXJ7b3BhY2l0eToxO2NvbG9yOiNmZmI3MGF9LnVpLmNhcmQ+LmNvbnRlbnQgLmFjdGl2ZS5zdGFyLmljb24sLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IC5hY3RpdmUuc3Rhci5pY29ue2NvbG9yOiNmZmU2MjN9LnVpLmNhcmQ+LmNvbnRlbnQgLmxpa2UuaWNvbiwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQgLmxpa2UuaWNvbntjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi43NTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkuY2FyZD4uY29udGVudCAubGlrZS5pY29uOmhvdmVyLC51aS5jYXJkcz4uY2FyZD4uY29udGVudCAubGlrZS5pY29uOmhvdmVye29wYWNpdHk6MTtjb2xvcjojZmYyNzMzfS51aS5jYXJkPi5jb250ZW50IC5hY3RpdmUubGlrZS5pY29uLC51aS5jYXJkcz4uY2FyZD4uY29udGVudCAuYWN0aXZlLmxpa2UuaWNvbntjb2xvcjojZmYyNzMzfS51aS5jYXJkPi5leHRyYSwudWkuY2FyZHM+LmNhcmQ+LmV4dHJhe21heC13aWR0aDoxMDAlO21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7ZmxleC1ncm93OjA7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMDUpIWltcG9ydGFudDtwb3NpdGlvbjpzdGF0aWM7YmFja2dyb3VuZDowIDA7d2lkdGg6YXV0bzttYXJnaW46MCAwO3BhZGRpbmc6Ljc1ZW0gMWVtO3RvcDowO2xlZnQ6MDtjb2xvcjpyZ2JhKDAsMCwwLC40KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLmNhcmQ+LmV4dHJhIGE6bm90KC51aSksLnVpLmNhcmRzPi5jYXJkPi5leHRyYSBhOm5vdCgudWkpe2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5jYXJkPi5leHRyYSBhOm5vdCgudWkpOmhvdmVyLC51aS5jYXJkcz4uY2FyZD4uZXh0cmEgYTpub3QoLnVpKTpob3Zlcntjb2xvcjojMWU3MGJmfS51aS5yYWlzZWQuY2FyZCwudWkucmFpc2VkLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5saW5rLmNhcmRzIC5yYWlzZWQuY2FyZDpob3ZlciwudWkubGluay5yYWlzZWQuY2FyZDpob3ZlciwudWkucmFpc2VkLmNhcmRzIGEuY2FyZDpob3ZlcixhLnVpLnJhaXNlZC5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xNSksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjI1KTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMjUpfS51aS5yYWlzZWQuY2FyZCwudWkucmFpc2VkLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5jZW50ZXJlZC5jYXJkc3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS51aS5jZW50ZXJlZC5jYXJke21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLmZsdWlkLmNhcmR7d2lkdGg6MTAwJTttYXgtd2lkdGg6OTk5OXB4fS51aS5jYXJkcyBhLmNhcmQsLnVpLmxpbmsuY2FyZCwudWkubGluay5jYXJkcyAuY2FyZCxhLnVpLmNhcmR7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX0udWkuY2FyZHMgYS5jYXJkOmhvdmVyLC51aS5saW5rLmNhcmQ6aG92ZXIsLnVpLmxpbmsuY2FyZHMgLmNhcmQ6aG92ZXIsYS51aS5jYXJkOmhvdmVye2N1cnNvcjpwb2ludGVyO3otaW5kZXg6NTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDNweCAwICNiY2JkYmQsMCAwIDAgMXB4ICNkNGQ0ZDU7Ym94LXNoYWRvdzowIDFweCAzcHggMCAjYmNiZGJkLDAgMCAwIDFweCAjZDRkNGQ1Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTNweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTNweCl9LnVpLmNhcmRzPi5yZWQuY2FyZCwudWkucmVkLmNhcmQsLnVpLnJlZC5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNkYjI4MjgsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZGIyODI4LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5yZWQuY2FyZDpob3ZlciwudWkucmVkLmNhcmQ6aG92ZXIsLnVpLnJlZC5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNkMDE5MTksMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZDAxOTE5LDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi5vcmFuZ2UuY2FyZCwudWkub3JhbmdlLmNhcmQsLnVpLm9yYW5nZS5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNmMjcxMWMsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZjI3MTFjLDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5vcmFuZ2UuY2FyZDpob3ZlciwudWkub3JhbmdlLmNhcmQ6aG92ZXIsLnVpLm9yYW5nZS5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNmMjYyMDIsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZjI2MjAyLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi55ZWxsb3cuY2FyZCwudWkueWVsbG93LmNhcmQsLnVpLnllbGxvdy5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNmYmJkMDgsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZmJiZDA4LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi55ZWxsb3cuY2FyZDpob3ZlciwudWkueWVsbG93LmNhcmQ6aG92ZXIsLnVpLnllbGxvdy5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNlYWFlMDAsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZWFhZTAwLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi5vbGl2ZS5jYXJkLC51aS5vbGl2ZS5jYXJkLC51aS5vbGl2ZS5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNiNWNjMTgsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjYjVjYzE4LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5vbGl2ZS5jYXJkOmhvdmVyLC51aS5vbGl2ZS5jYXJkOmhvdmVyLC51aS5vbGl2ZS5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNhN2JkMGQsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjYTdiZDBkLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi5ncmVlbi5jYXJkLC51aS5ncmVlbi5jYXJkLC51aS5ncmVlbi5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMyMWJhNDUsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMjFiYTQ1LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5ncmVlbi5jYXJkOmhvdmVyLC51aS5ncmVlbi5jYXJkOmhvdmVyLC51aS5ncmVlbi5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMxNmFiMzksMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMTZhYjM5LDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi50ZWFsLmNhcmQsLnVpLnRlYWwuY2FyZCwudWkudGVhbC5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMwMGI1YWQsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMDBiNWFkLDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi50ZWFsLmNhcmQ6aG92ZXIsLnVpLnRlYWwuY2FyZDpob3ZlciwudWkudGVhbC5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMwMDljOTUsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMDA5Yzk1LDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmJsdWUuY2FyZCwudWkuYmx1ZS5jYXJkcz4uY2FyZCwudWkuY2FyZHM+LmJsdWUuY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMyMTg1ZDAsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMjE4NWQwLDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmJsdWUuY2FyZDpob3ZlciwudWkuYmx1ZS5jYXJkcz4uY2FyZDpob3ZlciwudWkuY2FyZHM+LmJsdWUuY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMxNjc4YzIsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMTY3OGMyLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi52aW9sZXQuY2FyZCwudWkudmlvbGV0LmNhcmQsLnVpLnZpb2xldC5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM2NDM1YzksMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjNjQzNWM5LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi52aW9sZXQuY2FyZDpob3ZlciwudWkudmlvbGV0LmNhcmQ6aG92ZXIsLnVpLnZpb2xldC5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM1ODI5YmIsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjNTgyOWJiLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi5wdXJwbGUuY2FyZCwudWkucHVycGxlLmNhcmQsLnVpLnB1cnBsZS5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNhMzMzYzgsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjYTMzM2M4LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5wdXJwbGUuY2FyZDpob3ZlciwudWkucHVycGxlLmNhcmQ6aG92ZXIsLnVpLnB1cnBsZS5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM5NjI3YmEsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjOTYyN2JhLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi5waW5rLmNhcmQsLnVpLnBpbmsuY2FyZCwudWkucGluay5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNlMDM5OTcsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZTAzOTk3LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5waW5rLmNhcmQ6aG92ZXIsLnVpLnBpbmsuY2FyZDpob3ZlciwudWkucGluay5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNlNjFhOGQsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjZTYxYThkLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmJyb3duLmNhcmQsLnVpLmJyb3duLmNhcmRzPi5jYXJkLC51aS5jYXJkcz4uYnJvd24uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNhNTY3M2YsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjYTU2NzNmLDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmJyb3duLmNhcmQ6aG92ZXIsLnVpLmJyb3duLmNhcmRzPi5jYXJkOmhvdmVyLC51aS5jYXJkcz4uYnJvd24uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM5NzViMzMsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjOTc1YjMzLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmNhcmRzPi5ncmV5LmNhcmQsLnVpLmdyZXkuY2FyZCwudWkuZ3JleS5jYXJkcz4uY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM3Njc2NzYsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjNzY3Njc2LDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmNhcmRzPi5ncmV5LmNhcmQ6aG92ZXIsLnVpLmdyZXkuY2FyZDpob3ZlciwudWkuZ3JleS5jYXJkcz4uY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM4MzgzODMsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjODM4MzgzLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLmJsYWNrLmNhcmQsLnVpLmJsYWNrLmNhcmRzPi5jYXJkLC51aS5jYXJkcz4uYmxhY2suY2FyZHstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMxYjFjMWQsMCAxcHggM3B4IDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMWIxYzFkLDAgMXB4IDNweCAwICNkNGQ0ZDV9LnVpLmJsYWNrLmNhcmQ6aG92ZXIsLnVpLmJsYWNrLmNhcmRzPi5jYXJkOmhvdmVyLC51aS5jYXJkcz4uYmxhY2suY2FyZDpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMyNzI5MmEsMCAxcHggM3B4IDAgI2JjYmRiZDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDAgMCAjMjcyOTJhLDAgMXB4IDNweCAwICNiY2JkYmR9LnVpLm9uZS5jYXJkc3ttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS51aS5vbmUuY2FyZHM+LmNhcmR7d2lkdGg6MTAwJX0udWkudHdvLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLnR3by5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDUwJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLnRocmVlLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLnRocmVlLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMzMuMzMzMzMzMzMlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuZm91ci5jYXJkc3ttYXJnaW4tbGVmdDotLjc1ZW07bWFyZ2luLXJpZ2h0Oi0uNzVlbX0udWkuZm91ci5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDI1JSAtIDEuNWVtKTttYXJnaW4tbGVmdDouNzVlbTttYXJnaW4tcmlnaHQ6Ljc1ZW19LnVpLmZpdmUuY2FyZHN7bWFyZ2luLWxlZnQ6LS43NWVtO21hcmdpbi1yaWdodDotLjc1ZW19LnVpLmZpdmUuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygyMCUgLSAxLjVlbSk7bWFyZ2luLWxlZnQ6Ljc1ZW07bWFyZ2luLXJpZ2h0Oi43NWVtfS51aS5zaXguY2FyZHN7bWFyZ2luLWxlZnQ6LS43NWVtO21hcmdpbi1yaWdodDotLjc1ZW19LnVpLnNpeC5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDE2LjY2NjY2NjY3JSAtIDEuNWVtKTttYXJnaW4tbGVmdDouNzVlbTttYXJnaW4tcmlnaHQ6Ljc1ZW19LnVpLnNldmVuLmNhcmRze21hcmdpbi1sZWZ0Oi0uNWVtO21hcmdpbi1yaWdodDotLjVlbX0udWkuc2V2ZW4uY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygxNC4yODU3MTQyOSUgLSAxZW0pO21hcmdpbi1sZWZ0Oi41ZW07bWFyZ2luLXJpZ2h0Oi41ZW19LnVpLmVpZ2h0LmNhcmRze21hcmdpbi1sZWZ0Oi0uNWVtO21hcmdpbi1yaWdodDotLjVlbX0udWkuZWlnaHQuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygxMi41JSAtIDFlbSk7bWFyZ2luLWxlZnQ6LjVlbTttYXJnaW4tcmlnaHQ6LjVlbTtmb250LXNpemU6MTFweH0udWkubmluZS5jYXJkc3ttYXJnaW4tbGVmdDotLjVlbTttYXJnaW4tcmlnaHQ6LS41ZW19LnVpLm5pbmUuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygxMS4xMTExMTExMSUgLSAxZW0pO21hcmdpbi1sZWZ0Oi41ZW07bWFyZ2luLXJpZ2h0Oi41ZW07Zm9udC1zaXplOjEwcHh9LnVpLnRlbi5jYXJkc3ttYXJnaW4tbGVmdDotLjVlbTttYXJnaW4tcmlnaHQ6LS41ZW19LnVpLnRlbi5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDEwJSAtIDFlbSk7bWFyZ2luLWxlZnQ6LjVlbTttYXJnaW4tcmlnaHQ6LjVlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS50d28uZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0udWkudHdvLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOjEwMCU7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0udWkudGhyZWUuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkudGhyZWUuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYyg1MCUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5mb3VyLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLmZvdXIuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYyg1MCUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5maXZlLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLmZpdmUuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYyg1MCUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5zaXguZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkuc2l4LmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoNTAlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuc2V2ZW4uZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkuc2V2ZW4uZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygzMy4zMzMzMzMzMyUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5laWdodC5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS5laWdodC5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDMzLjMzMzMzMzMzJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLm5pbmUuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkubmluZS5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDMzLjMzMzMzMzMzJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLnRlbi5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS50ZW4uZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygzMy4zMzMzMzMzMyUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkudHdvLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9LnVpLnR3by5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDoxMDAlO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9LnVpLnRocmVlLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLnRocmVlLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoNTAlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuZm91ci5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS5mb3VyLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoNTAlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuZml2ZS5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS5maXZlLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMzMuMzMzMzMzMzMlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuc2l4LmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLnNpeC5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDMzLjMzMzMzMzMzJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLmVpZ2h0LmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLmVpZ2h0LmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMzMuMzMzMzMzMzMlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuZWlnaHQuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LS43NWVtO21hcmdpbi1yaWdodDotLjc1ZW19LnVpLmVpZ2h0LmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMjUlIC0gMS41ZW0pO21hcmdpbi1sZWZ0Oi43NWVtO21hcmdpbi1yaWdodDouNzVlbX0udWkubmluZS5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotLjc1ZW07bWFyZ2luLXJpZ2h0Oi0uNzVlbX0udWkubmluZS5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDI1JSAtIDEuNWVtKTttYXJnaW4tbGVmdDouNzVlbTttYXJnaW4tcmlnaHQ6Ljc1ZW19LnVpLnRlbi5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotLjc1ZW07bWFyZ2luLXJpZ2h0Oi0uNzVlbX0udWkudGVuLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMjAlIC0gMS41ZW0pO21hcmdpbi1sZWZ0Oi43NWVtO21hcmdpbi1yaWdodDouNzVlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuc3RhY2thYmxlLmNhcmRze2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50fS51aS5zdGFja2FibGUuY2FyZHMgLmNhcmQ6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowIWltcG9ydGFudH0udWkuc3RhY2thYmxlLmNhcmRzPi5jYXJke2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50O2hlaWdodDphdXRvIWltcG9ydGFudDttYXJnaW46MWVtIDFlbTtwYWRkaW5nOjAhaW1wb3J0YW50O3dpZHRoOmNhbGMoMTAwJSAtIDJlbSkhaW1wb3J0YW50fX0udWkuY2FyZHM+LmNhcmR7Zm9udC1zaXplOjFlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gQ29tbWVudFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmNvbW1lbnRze21hcmdpbjoxLjVlbSAwO21heC13aWR0aDo2NTBweH0udWkuY29tbWVudHM6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5jb21tZW50czpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuY29tbWVudHMgLmNvbW1lbnR7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDowIDA7bWFyZ2luOi41ZW0gMCAwO3BhZGRpbmc6LjVlbSAwIDA7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpub25lO2xpbmUtaGVpZ2h0OjEuMn0udWkuY29tbWVudHMgLmNvbW1lbnQ6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowO3BhZGRpbmctdG9wOjB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5jb21tZW50c3ttYXJnaW46MCAwIC41ZW0gLjVlbTtwYWRkaW5nOjFlbSAwIDFlbSAxZW19LnVpLmNvbW1lbnRzIC5jb21tZW50IC5jb21tZW50czpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowfS51aS5jb21tZW50cyAuY29tbWVudCAuY29tbWVudHMgLmNvbW1lbnR7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpub25lO2JhY2tncm91bmQ6MCAwfS51aS5jb21tZW50cyAuY29tbWVudCAuYXZhdGFye2Rpc3BsYXk6YmxvY2s7d2lkdGg6Mi41ZW07aGVpZ2h0OmF1dG87ZmxvYXQ6bGVmdDttYXJnaW46LjJlbSAwIDB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5hdmF0YXIgaW1nLC51aS5jb21tZW50cyAuY29tbWVudCBpbWcuYXZhdGFye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgYXV0bzt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JvcmRlci1yYWRpdXM6LjI1cmVtfS51aS5jb21tZW50cyAuY29tbWVudD4uY29udGVudHtkaXNwbGF5OmJsb2NrfS51aS5jb21tZW50cyAuY29tbWVudD4uYXZhdGFyfi5jb250ZW50e21hcmdpbi1sZWZ0OjMuNWVtfS51aS5jb21tZW50cyAuY29tbWVudCAuYXV0aG9ye2ZvbnQtc2l6ZToxZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpO2ZvbnQtd2VpZ2h0OjcwMH0udWkuY29tbWVudHMgLmNvbW1lbnQgYS5hdXRob3J7Y3Vyc29yOnBvaW50ZXJ9LnVpLmNvbW1lbnRzIC5jb21tZW50IGEuYXV0aG9yOmhvdmVye2NvbG9yOiMxZTcwYmZ9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5tZXRhZGF0YXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDouNWVtO2NvbG9yOnJnYmEoMCwwLDAsLjQpO2ZvbnQtc2l6ZTouODc1ZW19LnVpLmNvbW1lbnRzIC5jb21tZW50IC5tZXRhZGF0YT4qe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIC41ZW0gMCAwfS51aS5jb21tZW50cyAuY29tbWVudCAubWV0YWRhdGE+Omxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC50ZXh0e21hcmdpbjouMjVlbSAwIC41ZW07Zm9udC1zaXplOjFlbTt3b3JkLXdyYXA6YnJlYWstd29yZDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7bGluZS1oZWlnaHQ6MS4zfS51aS5jb21tZW50cyAuY29tbWVudCAuYWN0aW9uc3tmb250LXNpemU6Ljg3NWVtfS51aS5jb21tZW50cyAuY29tbWVudCAuYWN0aW9ucyBhe2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIC43NWVtIDAgMDtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuY29tbWVudHMgLmNvbW1lbnQgLmFjdGlvbnMgYTpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS51aS5jb21tZW50cyAuY29tbWVudCAuYWN0aW9ucyBhLmFjdGl2ZSwudWkuY29tbWVudHMgLmNvbW1lbnQgLmFjdGlvbnMgYTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuY29tbWVudHM+LnJlcGx5LmZvcm17bWFyZ2luLXRvcDoxZW19LnVpLmNvbW1lbnRzIC5jb21tZW50IC5yZXBseS5mb3Jte3dpZHRoOjEwMCU7bWFyZ2luLXRvcDoxZW19LnVpLmNvbW1lbnRzIC5yZXBseS5mb3JtIHRleHRhcmVhe2ZvbnQtc2l6ZToxZW07aGVpZ2h0OjEyZW19LnVpLmNvbGxhcHNlZC5jb21tZW50cywudWkuY29tbWVudHMgLmNvbGxhcHNlZC5jb21tZW50LC51aS5jb21tZW50cyAuY29sbGFwc2VkLmNvbW1lbnRze2Rpc3BsYXk6bm9uZX0udWkudGhyZWFkZWQuY29tbWVudHMgLmNvbW1lbnQgLmNvbW1lbnRze21hcmdpbjotMS41ZW0gMCAtMWVtIDEuMjVlbTtwYWRkaW5nOjNlbSAwIDJlbSAyLjI1ZW07LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkubWluaW1hbC5jb21tZW50cyAuY29tbWVudCAuYWN0aW9uc3tvcGFjaXR5OjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDtsZWZ0OmF1dG87LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjJzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycyBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTouMXM7dHJhbnNpdGlvbi1kZWxheTouMXN9LnVpLm1pbmltYWwuY29tbWVudHMgLmNvbW1lbnQ+LmNvbnRlbnQ6aG92ZXI+LmFjdGlvbnN7b3BhY2l0eToxfS51aS5taW5pLmNvbW1lbnRze2ZvbnQtc2l6ZTouNzg1NzE0MjlyZW19LnVpLnRpbnkuY29tbWVudHN7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuY29tbWVudHN7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuY29tbWVudHN7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLmNvbW1lbnRze2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuY29tbWVudHN7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmh1Z2UuY29tbWVudHN7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLm1hc3NpdmUuY29tbWVudHN7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEZlZWRcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5mZWVke21hcmdpbjoxZW0gMH0udWkuZmVlZDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLmZlZWQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLmZlZWQ+LmV2ZW50e2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3c7d2lkdGg6MTAwJTtwYWRkaW5nOi4yMTQyODU3MXJlbSAwO21hcmdpbjowO2JhY2tncm91bmQ6MCAwO2JvcmRlci10b3A6bm9uZX0udWkuZmVlZD4uZXZlbnQ6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDowO3BhZGRpbmctdG9wOjB9LnVpLmZlZWQ+LmV2ZW50Omxhc3QtY2hpbGR7cGFkZGluZy1ib3R0b206MH0udWkuZmVlZD4uZXZlbnQ+LmxhYmVse2Rpc3BsYXk6YmxvY2s7ZmxleDowIDAgYXV0bzt3aWR0aDoyLjVlbTtoZWlnaHQ6YXV0bzthbGlnbi1zZWxmOnN0cmV0Y2g7dGV4dC1hbGlnbjpsZWZ0fS51aS5mZWVkPi5ldmVudD4ubGFiZWwgLmljb257b3BhY2l0eToxO2ZvbnQtc2l6ZToxLjVlbTt3aWR0aDoxMDAlO3BhZGRpbmc6LjI1ZW07YmFja2dyb3VuZDowIDA7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czpub25lO2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5mZWVkPi5ldmVudD4ubGFiZWwgaW1ne3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG87Ym9yZGVyLXJhZGl1czo1MDByZW19LnVpLmZlZWQ+LmV2ZW50Pi5sYWJlbCsuY29udGVudHttYXJnaW46LjVlbSAwIC4zNTcxNDI4NmVtIDEuMTQyODU3MTRlbX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnR7ZGlzcGxheTpibG9jaztmbGV4OjEgMSBhdXRvO2FsaWduLXNlbGY6c3RyZXRjaDt0ZXh0LWFsaWduOmxlZnQ7d29yZC13cmFwOmJyZWFrLXdvcmR9LnVpLmZlZWQ+LmV2ZW50Omxhc3QtY2hpbGQ+LmNvbnRlbnR7cGFkZGluZy1ib3R0b206MH0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgYXtjdXJzb3I6cG9pbnRlcn0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLmRhdGV7bWFyZ2luOi0uNXJlbSAwIDA7cGFkZGluZzowO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MWVtO2ZvbnQtc3R5bGU6bm9ybWFsO2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAuc3VtbWFyeXttYXJnaW46MDtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5zdW1tYXJ5IGltZ3tkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDphdXRvO2hlaWdodDoxMGVtO21hcmdpbjotLjI1ZW0gLjI1ZW0gMCAwO2JvcmRlci1yYWRpdXM6LjI1ZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAudXNlcntkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXdlaWdodDo3MDA7bWFyZ2luLXJpZ2h0OjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC51c2VyIGltZ3ttYXJnaW46LS4yNWVtIC4yNWVtIDAgMDt3aWR0aDphdXRvO2hlaWdodDoxMGVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLnN1bW1hcnk+LmRhdGV7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bm9uZTtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOi44NTcxNDI4NmVtO2ZvbnQtc3R5bGU6bm9ybWFsO21hcmdpbjowIDAgMCAuNWVtO3BhZGRpbmc6MDtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLmV4dHJhe21hcmdpbjouNWVtIDAgMDtiYWNrZ3JvdW5kOjAgMDtwYWRkaW5nOjA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAuZXh0cmEuaW1hZ2VzIGltZ3tkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAuMjVlbSAwIDA7d2lkdGg6NmVtfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAuZXh0cmEudGV4dHtwYWRkaW5nOjA7Ym9yZGVyLWxlZnQ6bm9uZTtmb250LXNpemU6MWVtO21heC13aWR0aDo1MDBweDtsaW5lLWhlaWdodDoxLjQyODVlbX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGF7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOi44NTcxNDI4NmVtO21hcmdpbjouNWVtIDAgMDtiYWNrZ3JvdW5kOjAgMDtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO3BhZGRpbmc6MDtjb2xvcjpyZ2JhKDAsMCwwLC42KX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGE+Kntwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tbGVmdDouNzVlbX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGE+OmFmdGVye2NvbnRlbnQ6Jyc7Y29sb3I6cmdiYSgwLDAsMCwuMik7dG9wOjA7bGVmdDotMWVtO29wYWNpdHk6MTtwb3NpdGlvbjphYnNvbHV0ZTt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhIC5saWtle2NvbG9yOicnOy13ZWJraXQtdHJhbnNpdGlvbjouMnMgY29sb3IgZWFzZTt0cmFuc2l0aW9uOi4ycyBjb2xvciBlYXNlfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YSAubGlrZTpob3ZlciAuaWNvbntjb2xvcjojZmYyNzMzfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YSAuYWN0aXZlLmxpa2UgLmljb257Y29sb3I6I2VmNDA0YX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGE+OmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0OjB9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhPjpmaXJzdC1jaGlsZDo6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YSBhLC51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YT4uaWNvbntjdXJzb3I6cG9pbnRlcjtvcGFjaXR5OjE7Y29sb3I6cmdiYSgwLDAsMCwuNSk7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhIGE6aG92ZXIsLnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhIGE6aG92ZXIgLmljb24sLnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhPi5pY29uOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc21hbGwuZmVlZHtmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5mZWVke2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5mZWVke2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBJdGVtXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuaXRlbXM+Lml0ZW17ZGlzcGxheTpmbGV4O21hcmdpbjoxZW0gMDt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MDtiYWNrZ3JvdW5kOjAgMDtwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2UsIC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3otaW5kZXg6Jyd9LnVpLml0ZW1zPi5pdGVtIGF7Y3Vyc29yOnBvaW50ZXJ9LnVpLml0ZW1ze21hcmdpbjoxLjVlbSAwfS51aS5pdGVtczpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjAhaW1wb3J0YW50fS51aS5pdGVtczpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MCFpbXBvcnRhbnR9LnVpLml0ZW1zPi5pdGVtOmFmdGVye2Rpc3BsYXk6YmxvY2s7Y29udGVudDonICc7aGVpZ2h0OjA7Y2xlYXI6Ym90aDtvdmVyZmxvdzpoaWRkZW47dmlzaWJpbGl0eTpoaWRkZW59LnVpLml0ZW1zPi5pdGVtOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuaXRlbXM+Lml0ZW06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLml0ZW1zPi5pdGVtPi5pbWFnZXtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjAgMCBhdXRvO2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bm9uZTttYXJnaW46MDtwYWRkaW5nOjA7bWF4LWhlaWdodDonJzthbGlnbi1zZWxmOnRvcH0udWkuaXRlbXM+Lml0ZW0+LmltYWdlPmltZ3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG87Ym9yZGVyLXJhZGl1czouMTI1cmVtO2JvcmRlcjpub25lfS51aS5pdGVtcz4uaXRlbT4uaW1hZ2U6b25seS1jaGlsZD5pbWd7Ym9yZGVyLXJhZGl1czowfS51aS5pdGVtcz4uaXRlbT4uY29udGVudHtkaXNwbGF5OmJsb2NrO2ZsZXg6MSAxIGF1dG87YmFja2dyb3VuZDowIDA7bWFyZ2luOjA7cGFkZGluZzowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtmb250LXNpemU6MWVtO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MH0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQ6YWZ0ZXJ7ZGlzcGxheTpibG9jaztjb250ZW50OicgJztoZWlnaHQ6MDtjbGVhcjpib3RoO292ZXJmbG93OmhpZGRlbjt2aXNpYmlsaXR5OmhpZGRlbn0udWkuaXRlbXM+Lml0ZW0+LmltYWdlKy5jb250ZW50e21pbi13aWR0aDowO3dpZHRoOmF1dG87ZGlzcGxheTpibG9jazttYXJnaW4tbGVmdDowO2FsaWduLXNlbGY6dG9wO3BhZGRpbmctbGVmdDoxLjVlbX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQ+LmhlYWRlcntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46LS4yMTQyNWVtIDAgMDtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQ+LmhlYWRlcjpub3QoLnVpKXtmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5pdGVtcz4uaXRlbSBbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXXtmbG9hdDpsZWZ0fS51aS5pdGVtcz4uaXRlbSBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl17ZmxvYXQ6cmlnaHR9LnVpLml0ZW1zPi5pdGVtIC5jb250ZW50IGltZ3thbGlnbi1zZWxmOm1pZGRsZTt3aWR0aDonJ30udWkuaXRlbXM+Lml0ZW0gLmF2YXRhciBpbWcsLnVpLml0ZW1zPi5pdGVtIGltZy5hdmF0YXJ7d2lkdGg6Jyc7aGVpZ2h0OicnO2JvcmRlci1yYWRpdXM6NTAwcmVtfS51aS5pdGVtcz4uaXRlbT4uY29udGVudD4uZGVzY3JpcHRpb257bWFyZ2luLXRvcDouNmVtO21heC13aWR0aDphdXRvO2ZvbnQtc2l6ZToxZW07bGluZS1oZWlnaHQ6MS40Mjg1ZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pdGVtcz4uaXRlbT4uY29udGVudCBwe21hcmdpbjowIDAgLjVlbX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgcDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuaXRlbXM+Lml0ZW0gLm1ldGF7bWFyZ2luOi41ZW0gMCAuNWVtO2ZvbnQtc2l6ZToxZW07bGluZS1oZWlnaHQ6MWVtO2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5pdGVtcz4uaXRlbSAubWV0YSAqe21hcmdpbi1yaWdodDouM2VtfS51aS5pdGVtcz4uaXRlbSAubWV0YSA6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udWkuaXRlbXM+Lml0ZW0gLm1ldGEgW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJde21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0Oi4zZW19LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IGE6bm90KC51aSl7Y29sb3I6Jyc7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IGE6bm90KC51aSk6aG92ZXJ7Y29sb3I6Jyd9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50PmEuaGVhZGVye2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQ+YS5oZWFkZXI6aG92ZXJ7Y29sb3I6IzFlNzBiZn0udWkuaXRlbXM+Lml0ZW0gLm1ldGE+YTpub3QoLnVpKXtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuaXRlbXM+Lml0ZW0gLm1ldGE+YTpub3QoLnVpKTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IC5mYXZvcml0ZS5pY29ue2N1cnNvcjpwb2ludGVyO29wYWNpdHk6Ljc1Oy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlfS51aS5pdGVtcz4uaXRlbT4uY29udGVudCAuZmF2b3JpdGUuaWNvbjpob3ZlcntvcGFjaXR5OjE7Y29sb3I6I2ZmYjcwYX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgLmFjdGl2ZS5mYXZvcml0ZS5pY29ue2NvbG9yOiNmZmU2MjN9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IC5saWtlLmljb257Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNzU7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IC5saWtlLmljb246aG92ZXJ7b3BhY2l0eToxO2NvbG9yOiNmZjI3MzN9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IC5hY3RpdmUubGlrZS5pY29ue2NvbG9yOiNmZjI3MzN9LnVpLml0ZW1zPi5pdGVtIC5leHRyYXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6MCAwO21hcmdpbjouNXJlbSAwIDA7d2lkdGg6MTAwJTtwYWRkaW5nOjAgMCAwO3RvcDowO2xlZnQ6MDtjb2xvcjpyZ2JhKDAsMCwwLC40KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7Ym9yZGVyLXRvcDpub25lfS51aS5pdGVtcz4uaXRlbSAuZXh0cmE+KnttYXJnaW46LjI1cmVtIC41cmVtIC4yNXJlbSAwfS51aS5pdGVtcz4uaXRlbSAuZXh0cmE+W2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJde21hcmdpbjouMjVyZW0gMCAuMjVyZW0gLjVyZW19LnVpLml0ZW1zPi5pdGVtIC5leHRyYTphZnRlcntkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6JyAnO2hlaWdodDowO2NsZWFyOmJvdGg7b3ZlcmZsb3c6aGlkZGVuO3Zpc2liaWxpdHk6aGlkZGVufS51aS5pdGVtcz4uaXRlbT4uaW1hZ2U6bm90KC51aSl7d2lkdGg6MTc1cHh9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LnVpLml0ZW1zPi5pdGVte21hcmdpbjoxZW0gMH0udWkuaXRlbXM+Lml0ZW0+LmltYWdlOm5vdCgudWkpe3dpZHRoOjE1MHB4fS51aS5pdGVtcz4uaXRlbT4uaW1hZ2UrLmNvbnRlbnR7ZGlzcGxheTpibG9jaztwYWRkaW5nOjAgMCAwIDFlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuaXRlbXM6bm90KC51bnN0YWNrYWJsZSk+Lml0ZW17ZmxleC1kaXJlY3Rpb246Y29sdW1uO21hcmdpbjoyZW0gMH0udWkuaXRlbXM6bm90KC51bnN0YWNrYWJsZSk+Lml0ZW0+LmltYWdle2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0b30udWkuaXRlbXM6bm90KC51bnN0YWNrYWJsZSk+Lml0ZW0+LmltYWdlLC51aS5pdGVtczpub3QoLnVuc3RhY2thYmxlKT4uaXRlbT4uaW1hZ2U+aW1ne21heC13aWR0aDoxMDAlIWltcG9ydGFudDt3aWR0aDphdXRvIWltcG9ydGFudDttYXgtaGVpZ2h0OjI1MHB4IWltcG9ydGFudH0udWkuaXRlbXM6bm90KC51bnN0YWNrYWJsZSk+Lml0ZW0+LmltYWdlKy5jb250ZW50e2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoxLjVlbSAwIDB9fS51aS5pdGVtcz4uaXRlbT4uaW1hZ2UrW2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXS5jb250ZW50e2FsaWduLXNlbGY6ZmxleC1zdGFydH0udWkuaXRlbXM+Lml0ZW0+LmltYWdlK1tjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0uY29udGVudHthbGlnbi1zZWxmOmNlbnRlcn0udWkuaXRlbXM+Lml0ZW0+LmltYWdlK1tjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0uY29udGVudHthbGlnbi1zZWxmOmZsZXgtZW5kfS51aS5yZWxheGVkLml0ZW1zPi5pdGVte21hcmdpbjoxLjVlbSAwfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLml0ZW1zPi5pdGVte21hcmdpbjoyZW0gMH0udWkuZGl2aWRlZC5pdGVtcz4uaXRlbXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7bWFyZ2luOjA7cGFkZGluZzoxZW0gMH0udWkuZGl2aWRlZC5pdGVtcz4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wOm5vbmU7bWFyZ2luLXRvcDowIWltcG9ydGFudDtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0udWkuZGl2aWRlZC5pdGVtcz4uaXRlbTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MCFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCFpbXBvcnRhbnR9LnVpLnJlbGF4ZWQuZGl2aWRlZC5pdGVtcz4uaXRlbXttYXJnaW46MDtwYWRkaW5nOjEuNWVtIDB9LnVpW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0uZGl2aWRlZC5pdGVtcz4uaXRlbXttYXJnaW46MDtwYWRkaW5nOjJlbSAwfS51aS5pdGVtcyBhLml0ZW06aG92ZXIsLnVpLmxpbmsuaXRlbXM+Lml0ZW06aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9LnVpLml0ZW1zIGEuaXRlbTpob3ZlciAuY29udGVudCAuaGVhZGVyLC51aS5saW5rLml0ZW1zPi5pdGVtOmhvdmVyIC5jb250ZW50IC5oZWFkZXJ7Y29sb3I6IzFlNzBiZn0udWkuaXRlbXM+Lml0ZW17Zm9udC1zaXplOjFlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS51bnN0YWNrYWJsZS5pdGVtcz4uaXRlbT4uaW1hZ2UsLnVpLnVuc3RhY2thYmxlLml0ZW1zPi5pdGVtPi5pbWFnZT5pbWd7d2lkdGg6MTI1cHghaW1wb3J0YW50fX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gU3RhdGlzdGljXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuc3RhdGlzdGlje2Rpc3BsYXk6aW5saW5lLWZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21hcmdpbjoxZW0gMDttYXgtd2lkdGg6YXV0b30udWkuc3RhdGlzdGljKy51aS5zdGF0aXN0aWN7bWFyZ2luOjAgMCAwIDEuNWVtfS51aS5zdGF0aXN0aWM6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5zdGF0aXN0aWM6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnN0YXRpc3RpY3N7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7ZmxleC13cmFwOndyYXB9LnVpLnN0YXRpc3RpY3M+LnN0YXRpc3RpY3tkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXg6MCAxIGF1dG87ZmxleC1kaXJlY3Rpb246Y29sdW1uO21hcmdpbjowIDEuNWVtIDFlbTttYXgtd2lkdGg6YXV0b30udWkuc3RhdGlzdGljc3tkaXNwbGF5OmZsZXg7bWFyZ2luOjFlbSAtMS41ZW0gLTFlbX0udWkuc3RhdGlzdGljczphZnRlcntkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6JyAnO2hlaWdodDowO2NsZWFyOmJvdGg7b3ZlcmZsb3c6aGlkZGVuO3Zpc2liaWxpdHk6aGlkZGVufS51aS5zdGF0aXN0aWNzOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjRyZW07Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjFlbTtjb2xvcjojMWIxYzFkO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LWFsaWduOmNlbnRlcn0udWkuc3RhdGlzdGljPi5sYWJlbCwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi5sYWJlbHtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTt0ZXh0LWFsaWduOmNlbnRlcn0udWkuc3RhdGlzdGljPi5sYWJlbH4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4ubGFiZWx+LnZhbHVle21hcmdpbi10b3A6MH0udWkuc3RhdGlzdGljPi52YWx1ZX4ubGFiZWwsLnVpLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV+LmxhYmVse21hcmdpbi10b3A6MH0udWkuc3RhdGlzdGljPi52YWx1ZSAuaWNvbiwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSAuaWNvbntvcGFjaXR5OjE7d2lkdGg6YXV0bzttYXJnaW46MH0udWkuc3RhdGlzdGljPi50ZXh0LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWV7bGluZS1oZWlnaHQ6MWVtO21pbi1oZWlnaHQ6MmVtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWFsaWduOmNlbnRlcn0udWkuc3RhdGlzdGljPi50ZXh0LnZhbHVlKy5sYWJlbCwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi50ZXh0LnZhbHVlKy5sYWJlbHt0ZXh0LWFsaWduOmNlbnRlcn0udWkuc3RhdGlzdGljPi52YWx1ZSBpbWcsLnVpLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUgaW1ne21heC1oZWlnaHQ6M3JlbTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkudGVuLnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS50ZW4uc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDoxMCU7bWFyZ2luOjAgMCAxZW19LnVpLm5pbmUuc3RhdGlzdGljc3ttYXJnaW46MCAwIC0xZW19LnVpLm5pbmUuc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDoxMS4xMTExMTExMSU7bWFyZ2luOjAgMCAxZW19LnVpLmVpZ2h0LnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS5laWdodC5zdGF0aXN0aWNzIC5zdGF0aXN0aWN7bWluLXdpZHRoOjEyLjUlO21hcmdpbjowIDAgMWVtfS51aS5zZXZlbi5zdGF0aXN0aWNze21hcmdpbjowIDAgLTFlbX0udWkuc2V2ZW4uc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDoxNC4yODU3MTQyOSU7bWFyZ2luOjAgMCAxZW19LnVpLnNpeC5zdGF0aXN0aWNze21hcmdpbjowIDAgLTFlbX0udWkuc2l4LnN0YXRpc3RpY3MgLnN0YXRpc3RpY3ttaW4td2lkdGg6MTYuNjY2NjY2NjclO21hcmdpbjowIDAgMWVtfS51aS5maXZlLnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS5maXZlLnN0YXRpc3RpY3MgLnN0YXRpc3RpY3ttaW4td2lkdGg6MjAlO21hcmdpbjowIDAgMWVtfS51aS5mb3VyLnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS5mb3VyLnN0YXRpc3RpY3MgLnN0YXRpc3RpY3ttaW4td2lkdGg6MjUlO21hcmdpbjowIDAgMWVtfS51aS50aHJlZS5zdGF0aXN0aWNze21hcmdpbjowIDAgLTFlbX0udWkudGhyZWUuc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDozMy4zMzMzMzMzMyU7bWFyZ2luOjAgMCAxZW19LnVpLnR3by5zdGF0aXN0aWNze21hcmdpbjowIDAgLTFlbX0udWkudHdvLnN0YXRpc3RpY3MgLnN0YXRpc3RpY3ttaW4td2lkdGg6NTAlO21hcmdpbjowIDAgMWVtfS51aS5vbmUuc3RhdGlzdGljc3ttYXJnaW46MCAwIC0xZW19LnVpLm9uZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWN7bWluLXdpZHRoOjEwMCU7bWFyZ2luOjAgMCAxZW19LnVpLmhvcml6b250YWwuc3RhdGlzdGlje2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXJ9LnVpLmhvcml6b250YWwuc3RhdGlzdGljc3tmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWFyZ2luOjA7bWF4LXdpZHRoOm5vbmV9LnVpLmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGlje2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7bWF4LXdpZHRoOm5vbmU7bWFyZ2luOjFlbSAwfS51aS5ob3Jpem9udGFsLnN0YXRpc3RpYz4udGV4dC52YWx1ZSwudWkuaG9yaXpvbnRhbC5zdGF0aXN0aWNzPi5zdGF0aXN0aWM+LnRleHQudmFsdWV7bWluLWhlaWdodDowIWltcG9ydGFudH0udWkuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnZhbHVlIC5pY29uLC51aS5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUgLmljb257d2lkdGg6MS4xOGVtfS51aS5ob3Jpem9udGFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmhvcml6b250YWwuc3RhdGlzdGljPi5sYWJlbCwudWkuaG9yaXpvbnRhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LmxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW46MCAwIDAgLjc1ZW19LnVpLnJlZC5zdGF0aXN0aWM+LnZhbHVlLC51aS5yZWQuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAucmVkLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2RiMjgyOH0udWkub3JhbmdlLnN0YXRpc3RpYz4udmFsdWUsLnVpLm9yYW5nZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5vcmFuZ2Uuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZjI3MTFjfS51aS5zdGF0aXN0aWNzIC55ZWxsb3cuc3RhdGlzdGljPi52YWx1ZSwudWkueWVsbG93LnN0YXRpc3RpYz4udmFsdWUsLnVpLnllbGxvdy5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNmYmJkMDh9LnVpLm9saXZlLnN0YXRpc3RpYz4udmFsdWUsLnVpLm9saXZlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLm9saXZlLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2I1Y2MxOH0udWkuZ3JlZW4uc3RhdGlzdGljPi52YWx1ZSwudWkuZ3JlZW4uc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuZ3JlZW4uc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojMjFiYTQ1fS51aS5zdGF0aXN0aWNzIC50ZWFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLnRlYWwuc3RhdGlzdGljPi52YWx1ZSwudWkudGVhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiMwMGI1YWR9LnVpLmJsdWUuc3RhdGlzdGljPi52YWx1ZSwudWkuYmx1ZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5ibHVlLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6IzIxODVkMH0udWkuc3RhdGlzdGljcyAudmlvbGV0LnN0YXRpc3RpYz4udmFsdWUsLnVpLnZpb2xldC5zdGF0aXN0aWM+LnZhbHVlLC51aS52aW9sZXQuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojNjQzNWM5fS51aS5wdXJwbGUuc3RhdGlzdGljPi52YWx1ZSwudWkucHVycGxlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLnB1cnBsZS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNhMzMzYzh9LnVpLnBpbmsuc3RhdGlzdGljPi52YWx1ZSwudWkucGluay5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5waW5rLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2UwMzk5N30udWkuYnJvd24uc3RhdGlzdGljPi52YWx1ZSwudWkuYnJvd24uc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuYnJvd24uc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojYTU2NzNmfS51aS5ncmV5LnN0YXRpc3RpYz4udmFsdWUsLnVpLmdyZXkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuZ3JleS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiM3Njc2NzZ9LnVpLmludmVydGVkLnN0YXRpc3RpYyAudmFsdWUsLnVpLmludmVydGVkLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuc3RhdGlzdGljIC5sYWJlbCwudWkuaW52ZXJ0ZWQuc3RhdGlzdGljcyAuc3RhdGlzdGljPi5sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkuaW52ZXJ0ZWQucmVkLnN0YXRpc3RpYz4udmFsdWUsLnVpLmludmVydGVkLnJlZC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5yZWQuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZmY2OTVlfS51aS5pbnZlcnRlZC5vcmFuZ2Uuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQub3JhbmdlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLm9yYW5nZS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNmZjg1MWJ9LnVpLmludmVydGVkLnllbGxvdy5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC55ZWxsb3cuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQueWVsbG93LnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2ZmZTIxZn0udWkuaW52ZXJ0ZWQub2xpdmUuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQub2xpdmUuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQub2xpdmUuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZDllNzc4fS51aS5pbnZlcnRlZC5ncmVlbi5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC5ncmVlbi5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5ncmVlbi5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiMyZWNjNDB9LnVpLmludmVydGVkLnRlYWwuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQudGVhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC50ZWFsLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6IzZkZmZmZn0udWkuaW52ZXJ0ZWQuYmx1ZS5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC5ibHVlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLmJsdWUuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojNTRjOGZmfS51aS5pbnZlcnRlZC52aW9sZXQuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQudmlvbGV0LnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLnZpb2xldC5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNhMjkxZmJ9LnVpLmludmVydGVkLnB1cnBsZS5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC5wdXJwbGUuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQucHVycGxlLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2RjNzNmZn0udWkuaW52ZXJ0ZWQucGluay5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC5waW5rLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLnBpbmsuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZmY4ZWRmfS51aS5pbnZlcnRlZC5icm93bi5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC5icm93bi5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5icm93bi5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNkNjdjMWN9LnVpLmludmVydGVkLmdyZXkuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQuZ3JleS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5ncmV5LnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2RjZGRkZX0udWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5zdGF0aXN0aWN7ZmxvYXQ6bGVmdDttYXJnaW46MCAyZW0gMWVtIDB9LnVpW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLnN0YXRpc3RpY3tmbG9hdDpyaWdodDttYXJnaW46MCAwIDFlbSAyZW19LnVpLmZsb2F0ZWQuc3RhdGlzdGljOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5taW5pLnN0YXRpc3RpYz4udmFsdWUsLnVpLm1pbmkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6MS41cmVtIWltcG9ydGFudH0udWkubWluaS5ob3Jpem9udGFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLm1pbmkuaG9yaXpvbnRhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZToxLjVyZW0haW1wb3J0YW50fS51aS5taW5pLnN0YXRpc3RpYz4udGV4dC52YWx1ZSwudWkubWluaS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWV7Zm9udC1zaXplOjFyZW0haW1wb3J0YW50fS51aS50aW55LnN0YXRpc3RpYz4udmFsdWUsLnVpLnRpbnkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6MnJlbSFpbXBvcnRhbnR9LnVpLnRpbnkuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnZhbHVlLC51aS50aW55Lmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6MnJlbSFpbXBvcnRhbnR9LnVpLnRpbnkuc3RhdGlzdGljPi50ZXh0LnZhbHVlLC51aS50aW55LnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udGV4dC52YWx1ZXtmb250LXNpemU6MXJlbSFpbXBvcnRhbnR9LnVpLnNtYWxsLnN0YXRpc3RpYz4udmFsdWUsLnVpLnNtYWxsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjNyZW0haW1wb3J0YW50fS51aS5zbWFsbC5ob3Jpem9udGFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLnNtYWxsLmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6MnJlbSFpbXBvcnRhbnR9LnVpLnNtYWxsLnN0YXRpc3RpYz4udGV4dC52YWx1ZSwudWkuc21hbGwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi50ZXh0LnZhbHVle2ZvbnQtc2l6ZToxcmVtIWltcG9ydGFudH0udWkuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6NHJlbSFpbXBvcnRhbnR9LnVpLmhvcml6b250YWwuc3RhdGlzdGljPi52YWx1ZSwudWkuaG9yaXpvbnRhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZTozcmVtIWltcG9ydGFudH0udWkuc3RhdGlzdGljPi50ZXh0LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWV7Zm9udC1zaXplOjJyZW0haW1wb3J0YW50fS51aS5sYXJnZS5zdGF0aXN0aWM+LnZhbHVlLC51aS5sYXJnZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZTo1cmVtIWltcG9ydGFudH0udWkubGFyZ2UuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnZhbHVlLC51aS5sYXJnZS5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjRyZW0haW1wb3J0YW50fS51aS5sYXJnZS5zdGF0aXN0aWM+LnRleHQudmFsdWUsLnVpLmxhcmdlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udGV4dC52YWx1ZXtmb250LXNpemU6Mi41cmVtIWltcG9ydGFudH0udWkuaHVnZS5zdGF0aXN0aWM+LnZhbHVlLC51aS5odWdlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjZyZW0haW1wb3J0YW50fS51aS5odWdlLmhvcml6b250YWwuc3RhdGlzdGljPi52YWx1ZSwudWkuaHVnZS5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjVyZW0haW1wb3J0YW50fS51aS5odWdlLnN0YXRpc3RpYz4udGV4dC52YWx1ZSwudWkuaHVnZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWV7Zm9udC1zaXplOjIuNXJlbSFpbXBvcnRhbnR9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEFjY29yZGlvblxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmFjY29yZGlvbiwudWkuYWNjb3JkaW9uIC5hY2NvcmRpb257bWF4LXdpZHRoOjEwMCV9LnVpLmFjY29yZGlvbiAuYWNjb3JkaW9ue21hcmdpbjoxZW0gMCAwO3BhZGRpbmc6MH0udWkuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlLC51aS5hY2NvcmRpb24gLnRpdGxle2N1cnNvcjpwb2ludGVyfS51aS5hY2NvcmRpb24gLnRpdGxlOm5vdCgudWkpe3BhZGRpbmc6LjVlbSAwO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6MWVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlfi5jb250ZW50LC51aS5hY2NvcmRpb24gLnRpdGxlfi5jb250ZW50e2Rpc3BsYXk6bm9uZX0udWkuYWNjb3JkaW9uOm5vdCguc3R5bGVkKSAuYWNjb3JkaW9uIC50aXRsZX4uY29udGVudDpub3QoLnVpKSwudWkuYWNjb3JkaW9uOm5vdCguc3R5bGVkKSAudGl0bGV+LmNvbnRlbnQ6bm90KC51aSl7bWFyZ2luOicnO3BhZGRpbmc6LjVlbSAwIDFlbX0udWkuYWNjb3JkaW9uOm5vdCguc3R5bGVkKSAudGl0bGV+LmNvbnRlbnQ6bm90KC51aSk6bGFzdC1jaGlsZHtwYWRkaW5nLWJvdHRvbTowfS51aS5hY2NvcmRpb24gLmFjY29yZGlvbiAudGl0bGUgLmRyb3Bkb3duLmljb24sLnVpLmFjY29yZGlvbiAudGl0bGUgLmRyb3Bkb3duLmljb257ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bm9uZTtvcGFjaXR5OjE7d2lkdGg6MS4yNWVtO2hlaWdodDoxZW07bWFyZ2luOjAgLjI1cmVtIDAgMDtwYWRkaW5nOjA7Zm9udC1zaXplOjFlbTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9LnVpLmFjY29yZGlvbi5tZW51IC5pdGVtIC50aXRsZXtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MH0udWkuYWNjb3JkaW9uLm1lbnUgLml0ZW0gLnRpdGxlPi5kcm9wZG93bi5pY29ue2Zsb2F0OnJpZ2h0O21hcmdpbjouMjE0MjVlbSAwIDAgMWVtOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX0udWkuYWNjb3JkaW9uIC51aS5oZWFkZXIgLmRyb3Bkb3duLmljb257Zm9udC1zaXplOjFlbTttYXJnaW46MCAuMjVyZW0gMCAwfS51aS5hY2NvcmRpb24gLmFjY29yZGlvbiAuYWN0aXZlLnRpdGxlIC5kcm9wZG93bi5pY29uLC51aS5hY2NvcmRpb24gLmFjdGl2ZS50aXRsZSAuZHJvcGRvd24uaWNvbnstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfS51aS5hY2NvcmRpb24ubWVudSAuaXRlbSAuYWN0aXZlLnRpdGxlPi5kcm9wZG93bi5pY29uey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9LnVpLnN0eWxlZC5hY2NvcmRpb257d2lkdGg6NjAwcHh9LnVpLnN0eWxlZC5hY2NvcmRpb24sLnVpLnN0eWxlZC5hY2NvcmRpb24gLmFjY29yZGlvbntib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnN0eWxlZC5hY2NvcmRpb24gLmFjY29yZGlvbiAudGl0bGUsLnVpLnN0eWxlZC5hY2NvcmRpb24gLnRpdGxle21hcmdpbjowO3BhZGRpbmc6Ljc1ZW0gMWVtO2NvbG9yOnJnYmEoMCwwLDAsLjQpO2ZvbnQtd2VpZ2h0OjcwMDtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlOmZpcnN0LWNoaWxkLC51aS5zdHlsZWQuYWNjb3JkaW9uPi50aXRsZTpmaXJzdC1jaGlsZHtib3JkZXItdG9wOm5vbmV9LnVpLnN0eWxlZC5hY2NvcmRpb24gLmFjY29yZGlvbiAuY29udGVudCwudWkuc3R5bGVkLmFjY29yZGlvbiAuY29udGVudHttYXJnaW46MDtwYWRkaW5nOi41ZW0gMWVtIDEuNWVtfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLmNvbnRlbnR7cGFkZGluZzowO3BhZGRpbmc6LjVlbSAxZW0gMS41ZW19LnVpLnN0eWxlZC5hY2NvcmRpb24gLmFjY29yZGlvbiAuYWN0aXZlLnRpdGxlLC51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlOmhvdmVyLC51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY3RpdmUudGl0bGUsLnVpLnN0eWxlZC5hY2NvcmRpb24gLnRpdGxlOmhvdmVye2JhY2tncm91bmQ6MCAwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuc3R5bGVkLmFjY29yZGlvbiAuYWNjb3JkaW9uIC5hY3RpdmUudGl0bGUsLnVpLnN0eWxlZC5hY2NvcmRpb24gLmFjY29yZGlvbiAudGl0bGU6aG92ZXJ7YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY3RpdmUudGl0bGV7YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLmFjdGl2ZS50aXRsZXtiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmFjY29yZGlvbiAuYWNjb3JkaW9uIC5hY3RpdmUuY29udGVudCwudWkuYWNjb3JkaW9uIC5hY3RpdmUuY29udGVudHtkaXNwbGF5OmJsb2NrfS51aS5mbHVpZC5hY2NvcmRpb24sLnVpLmZsdWlkLmFjY29yZGlvbiAuYWNjb3JkaW9ue3dpZHRoOjEwMCV9LnVpLmludmVydGVkLmFjY29yZGlvbiAudGl0bGU6bm90KC51aSl7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9QGZvbnQtZmFjZXtmb250LWZhbWlseTpBY2NvcmRpb247c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7Y2hhcnNldD11dGYtODtiYXNlNjQsQUFFQUFBQUxBSUFBQXdBd1QxTXZNZ2dqQjVBQUFBQzhBQUFBWUdOdFlYQVBmT0lLQUFBQkhBQUFBRXhuWVhOd0FBQUFFQUFBQVdnQUFBQUlaMng1WnJ5ajZIZ0FBQUZ3QUFBQXlHaGxZV1QvMEloSEFBQUNPQUFBQURab2FHVmhBcGtCNXdBQUFuQUFBQUFrYUcxMGVBSnVBQklBQUFLVUFBQUFHR3h2WTJFQWpBQldBQUFDckFBQUFBNXRZWGh3QUFnQUZnQUFBcndBQUFBZ2JtRnRaZkMxbjA0QUFBTGNBQUFCUEhCdmMzUUFBd0FBQUFBRUdBQUFBQ0FBQXdJQUFaQUFCUUFBQVV3QlpnQUFBRWNCVEFGbUFBQUE5UUFaQUlRQUFBQUFBQUFBQUFBQUFBQUFBQUFCRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFEdzJnSGcvK0QvNEFIZ0FDQUFBQUFCQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFDQUFBQUF3QUFBQlFBQXdBQkFBQUFGQUFFQURnQUFBQUtBQWdBQWdBQ0FBRUFJUERhLy8zLy93QUFBQUFBSVBEWi8vMy8vd0FCLytNUEt3QURBQUVBQUFBQUFBQUFBQUFBQUFFQUFmLy9BQThBQVFBQUFBQUFBQUFBQUFJQUFEYzVBUUFBQUFBQkFBQUFBQUFBQUFBQUFnQUFOemtCQUFBQUFBRUFBQUFBQUFBQUFBQUNBQUEzT1FFQUFBQUFBUUFTQUVrQXR3RnVBQk1BQURjMFB3RTJGellYRmgwQkZBY0dKd1l2QVNZMUVnYUFCUWdIQlFZR0JRY0lCWUFHMndjR2Z3Y0JBUWNFQ2Y4SUJBY0JBUWQvQmdZQUFBQUFBUUFBQUVrQXBRRnVBQk1BQURjUk5EYzJNeklmQVJZVkZBOEJCaU1pSnlZMUFBVUdCd2dGZ0FZR2dBVUlCd1lGV3dFQUNBVUdCb0FGQ0FjRmdBWUdCUWNBQUFBQkFBQUFBUUFBcVdZbHMxOFBQUFVBQ3dJQUFBQUFBTS85bys0QUFBQUF6LzJqN2dBQUFBQUF0d0Z1QUFBQUNBQUNBQUFBQUFBQUFBRUFBQUhnLytBQUFBSUFBQUFBQUFDM0FBRUFBQUFBQUFBQUFBQUFBQUFBQUFBR0FBQUFBQUFBQUFBQUFBQUFBUUFBQUFDM0FCSUF0d0FBQUFBQUFBQUtBQlFBSGdCQ0FHUUFBQUFCQUFBQUJnQVVBQUVBQUFBQUFBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEZ0N1QUFFQUFBQUFBQUVBREFBQUFBRUFBQUFBQUFJQURnQkFBQUVBQUFBQUFBTUFEQUFpQUFFQUFBQUFBQVFBREFCT0FBRUFBQUFBQUFVQUZnQU1BQUVBQUFBQUFBWUFCZ0F1QUFFQUFBQUFBQW9BTkFCYUFBTUFBUVFKQUFFQURBQUFBQU1BQVFRSkFBSUFEZ0JBQUFNQUFRUUpBQU1BREFBaUFBTUFBUVFKQUFRQURBQk9BQU1BQVFRSkFBVUFGZ0FNQUFNQUFRUUpBQVlBREFBMEFBTUFBUVFKQUFvQU5BQmFBSElBWVFCMEFHa0FiZ0JuQUZZQVpRQnlBSE1BYVFCdkFHNEFJQUF4QUM0QU1BQnlBR0VBZEFCcEFHNEFaM0poZEdsdVp3QnlBR0VBZEFCcEFHNEFad0JTQUdVQVp3QjFBR3dBWVFCeUFISUFZUUIwQUdrQWJnQm5BRVlBYndCdUFIUUFJQUJuQUdVQWJnQmxBSElBWVFCMEFHVUFaQUFnQUdJQWVRQWdBRWtBWXdCdkFFMEFid0J2QUc0QUxnQURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBKSBmb3JtYXQoJ3RydWV0eXBlJyksdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdSazlVVkU4QUFBU3dBQW9BQUFBQUJHZ0FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCRFJrWWdBQUFBOUFBQUFTMEFBQUV0RnBvdnVFOVRMeklBQUFJa0FBQUFZQUFBQUdBSUl3ZVFZMjFoY0FBQUFvUUFBQUJNQUFBQVRBOTg0Z3BuWVhOd0FBQUMwQUFBQUFnQUFBQUlBQUFBRUdobFlXUUFBQUxZQUFBQU5nQUFBRGIvMEloSGFHaGxZUUFBQXhBQUFBQWtBQUFBSkFLWkFlZG9iWFI0QUFBRE5BQUFBQmdBQUFBWUFtNEFFbTFoZUhBQUFBTk1BQUFBQmdBQUFBWUFCbEFBYm1GdFpRQUFBMVFBQUFFOEFBQUJQUEMxbjA1d2IzTjBBQUFFa0FBQUFDQUFBQUFnQUFNQUFBRUFCQVFBQVFFQkIzSmhkR2x1WndBQkFnQUJBRHI0SEFMNEd3UDRHQVFlQ2dBWlUvK0xpeDRLQUJsVC80dUxEQWVMYS9pVStIUUZIUUFBQUhrUEhRQUFBSDRSSFFBQUFBa2RBQUFCSkJJQUJ3RUJCdzBQRVJRWkhuSmhkR2x1WjNKaGRHbHVaM1V3ZFRGMU1qQjFSakJFT1hWR01FUkJBQUFDQVlrQUJBQUdBUUVFQndvTlZwMzhsQTc4bEE3OGxBNzdsQTc3M1ozM2J4V0xrSTJRajQ0STl4VDNGQVdPajVDTmtJdVFpNCtKam9lUGlJMkdpNFlJaS91VUJZdUdpWWVIaUlpSGg0bUdpNGFMaG8ySWp3ajdGUGNVQlllT2lZK0xrQWdPKzkyTDVoV0w5NVFGaTVDTmtJNk9qNCtQalpDTGtJdVFpWTZIQ1BjVSt4UUZqNGlOaG91R2k0YUpoNGVJQ1BzVSt4UUZpSWVHaVlhTGhvdUhqWWVQaUk2Smo0dVFDQTc0bEJUNGxCV0xEQW9BQUFBQUF3SUFBWkFBQlFBQUFVd0JaZ0FBQUVjQlRBRm1BQUFBOVFBWkFJUUFBQUFBQUFBQUFBQUFBQUFBQUFBQkVBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBRHcyZ0hnLytELzRBSGdBQ0FBQUFBQkFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQ0FBQUFBd0FBQUJRQUF3QUJBQUFBRkFBRUFEZ0FBQUFLQUFnQUFnQUNBQUVBSVBEYS8vMy8vd0FBQUFBQUlQRFovLzMvL3dBQi8rTVBLd0FEQUFFQUFBQUFBQUFBQUFBQUFBRUFBZi8vQUE4QUFRQUFBQUVBQURmWU9KWmZEenoxQUFzQ0FBQUFBQURQL2FQdUFBQUFBTS85bys0QUFBQUFBTGNCYmdBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFCNFAvZ0FBQUNBQUFBQUFBQXR3QUJBQUFBQUFBQUFBQUFBQUFBQUFBQUJnQUFBQUFBQUFBQUFBQUFBQUVBQUFBQXR3QVNBTGNBQUFBQVVBQUFCZ0FBQUFBQURnQ3VBQUVBQUFBQUFBRUFEQUFBQUFFQUFBQUFBQUlBRGdCQUFBRUFBQUFBQUFNQURBQWlBQUVBQUFBQUFBUUFEQUJPQUFFQUFBQUFBQVVBRmdBTUFBRUFBQUFBQUFZQUJnQXVBQUVBQUFBQUFBb0FOQUJhQUFNQUFRUUpBQUVBREFBQUFBTUFBUVFKQUFJQURnQkFBQU1BQVFRSkFBTUFEQUFpQUFNQUFRUUpBQVFBREFCT0FBTUFBUVFKQUFVQUZnQU1BQU1BQVFRSkFBWUFEQUEwQUFNQUFRUUpBQW9BTkFCYUFISUFZUUIwQUdrQWJnQm5BRllBWlFCeUFITUFhUUJ2QUc0QUlBQXhBQzRBTUFCeUFHRUFkQUJwQUc0QVozSmhkR2x1WndCeUFHRUFkQUJwQUc0QVp3QlNBR1VBWndCMUFHd0FZUUJ5QUhJQVlRQjBBR2tBYmdCbkFFWUFid0J1QUhRQUlBQm5BR1VBYmdCbEFISUFZUUIwQUdVQVpBQWdBR0lBZVFBZ0FFa0FZd0J2QUUwQWJ3QnZBRzRBTGdBREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIGZvcm1hdCgnd29mZicpO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbH0udWkuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlIC5kcm9wZG93bi5pY29uLC51aS5hY2NvcmRpb24gLnRpdGxlIC5kcm9wZG93bi5pY29ue2ZvbnQtZmFtaWx5OkFjY29yZGlvbjtsaW5lLWhlaWdodDoxOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtYWxpZ246Y2VudGVyfS51aS5hY2NvcmRpb24gLmFjY29yZGlvbiAudGl0bGUgLmRyb3Bkb3duLmljb246YmVmb3JlLC51aS5hY2NvcmRpb24gLnRpdGxlIC5kcm9wZG93bi5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjBkYSd9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIENoZWNrYm94XFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuY2hlY2tib3h7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtvdXRsaW5lOjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7Zm9udC1zdHlsZTpub3JtYWw7bWluLWhlaWdodDoxN3B4O2ZvbnQtc2l6ZToxcmVtO2xpbmUtaGVpZ2h0OjE3cHg7bWluLXdpZHRoOjE3cHh9LnVpLmNoZWNrYm94IGlucHV0W3R5cGU9Y2hlY2tib3hdLC51aS5jaGVja2JveCBpbnB1dFt0eXBlPXJhZGlvXXtjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7b3BhY2l0eTowIWltcG9ydGFudDtvdXRsaW5lOjA7ei1pbmRleDozO3dpZHRoOjE3cHg7aGVpZ2h0OjE3cHh9LnVpLmNoZWNrYm94IC5ib3gsLnVpLmNoZWNrYm94IGxhYmVse2N1cnNvcjphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7cGFkZGluZy1sZWZ0OjEuODU3MTRlbTtvdXRsaW5lOjA7Zm9udC1zaXplOjFlbX0udWkuY2hlY2tib3ggLmJveDpiZWZvcmUsLnVpLmNoZWNrYm94IGxhYmVsOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTdweDtoZWlnaHQ6MTdweDtjb250ZW50OicnO2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOi4yMTQyODU3MXJlbTstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsdHJhbnNmb3JtIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3JkZXIgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSx0cmFuc2Zvcm0gLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7Ym9yZGVyOjFweCBzb2xpZCAjZDRkNGQ1fS51aS5jaGVja2JveCAuYm94OmFmdGVyLC51aS5jaGVja2JveCBsYWJlbDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtmb250LXNpemU6MTRweDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTdweDtoZWlnaHQ6MTdweDt0ZXh0LWFsaWduOmNlbnRlcjtvcGFjaXR5OjA7Y29sb3I6cmdiYSgwLDAsMCwuODcpOy13ZWJraXQtdHJhbnNpdGlvbjpib3JkZXIgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3JkZXIgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3JkZXIgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSx0cmFuc2Zvcm0gLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJvcmRlciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLHRyYW5zZm9ybSAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZX0udWkuY2hlY2tib3ggbGFiZWwsLnVpLmNoZWNrYm94K2xhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkuY2hlY2tib3grbGFiZWx7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5jaGVja2JveCAuYm94OmhvdmVyOjpiZWZvcmUsLnVpLmNoZWNrYm94IGxhYmVsOmhvdmVyOjpiZWZvcmV7YmFja2dyb3VuZDojZmZmO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4zNSl9LnVpLmNoZWNrYm94IGxhYmVsOmhvdmVyLC51aS5jaGVja2JveCtsYWJlbDpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuY2hlY2tib3ggLmJveDphY3RpdmU6OmJlZm9yZSwudWkuY2hlY2tib3ggbGFiZWw6YWN0aXZlOjpiZWZvcmV7YmFja2dyb3VuZDojZjlmYWZiO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4zNSl9LnVpLmNoZWNrYm94IC5ib3g6YWN0aXZlOjphZnRlciwudWkuY2hlY2tib3ggbGFiZWw6YWN0aXZlOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmNoZWNrYm94IGlucHV0OmFjdGl2ZX5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmNoZWNrYm94IGlucHV0OmZvY3Vzfi5ib3g6YmVmb3JlLC51aS5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDpiZWZvcmV7YmFja2dyb3VuZDojZmZmO2JvcmRlci1jb2xvcjojOTZjOGRhfS51aS5jaGVja2JveCBpbnB1dDpmb2N1c34uYm94OmFmdGVyLC51aS5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmNoZWNrYm94IGlucHV0OmZvY3VzfmxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZDojZmZmO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4zNSl9LnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbDphZnRlcntvcGFjaXR5OjE7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5jaGVja2JveCBpbnB1dDpub3QoW3R5cGU9cmFkaW9dKTppbmRldGVybWluYXRlfi5ib3g6YmVmb3JlLC51aS5jaGVja2JveCBpbnB1dDpub3QoW3R5cGU9cmFkaW9dKTppbmRldGVybWluYXRlfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjM1KX0udWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZX4uYm94OmFmdGVyLC51aS5jaGVja2JveCBpbnB1dDpub3QoW3R5cGU9cmFkaW9dKTppbmRldGVybWluYXRlfmxhYmVsOmFmdGVye29wYWNpdHk6MTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWQ6Zm9jdXN+LmJveDpiZWZvcmUsLnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWQ6Zm9jdXN+bGFiZWw6YmVmb3JlLC51aS5jaGVja2JveCBpbnB1dDpub3QoW3R5cGU9cmFkaW9dKTppbmRldGVybWluYXRlOmZvY3Vzfi5ib3g6YmVmb3JlLC51aS5jaGVja2JveCBpbnB1dDpub3QoW3R5cGU9cmFkaW9dKTppbmRldGVybWluYXRlOmZvY3VzfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLWNvbG9yOiM5NmM4ZGF9LnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWQ6Zm9jdXN+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZDpmb2N1c35sYWJlbDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZTpmb2N1c34uYm94OmFmdGVyLC51aS5jaGVja2JveCBpbnB1dDpub3QoW3R5cGU9cmFkaW9dKTppbmRldGVybWluYXRlOmZvY3VzfmxhYmVsOmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkucmVhZC1vbmx5LmNoZWNrYm94LC51aS5yZWFkLW9ubHkuY2hlY2tib3ggbGFiZWx7Y3Vyc29yOmRlZmF1bHR9LnVpLmNoZWNrYm94IGlucHV0W2Rpc2FibGVkXX4uYm94OmFmdGVyLC51aS5jaGVja2JveCBpbnB1dFtkaXNhYmxlZF1+bGFiZWwsLnVpLmRpc2FibGVkLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLmRpc2FibGVkLmNoZWNrYm94IGxhYmVse2N1cnNvcjpkZWZhdWx0IWltcG9ydGFudDtvcGFjaXR5Oi41O2NvbG9yOiMwMDB9LnVpLmNoZWNrYm94IGlucHV0LmhpZGRlbnt6LWluZGV4Oi0xfS51aS5jaGVja2JveCBpbnB1dC5oaWRkZW4rbGFiZWx7Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnVpLnJhZGlvLmNoZWNrYm94e21pbi1oZWlnaHQ6MTVweH0udWkucmFkaW8uY2hlY2tib3ggLmJveCwudWkucmFkaW8uY2hlY2tib3ggbGFiZWx7cGFkZGluZy1sZWZ0OjEuODU3MTRlbX0udWkucmFkaW8uY2hlY2tib3ggLmJveDpiZWZvcmUsLnVpLnJhZGlvLmNoZWNrYm94IGxhYmVsOmJlZm9yZXtjb250ZW50OicnOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7d2lkdGg6MTVweDtoZWlnaHQ6MTVweDtib3JkZXItcmFkaXVzOjUwMHJlbTt0b3A6MXB4O2xlZnQ6MH0udWkucmFkaW8uY2hlY2tib3ggLmJveDphZnRlciwudWkucmFkaW8uY2hlY2tib3ggbGFiZWw6YWZ0ZXJ7Ym9yZGVyOm5vbmU7Y29udGVudDonJyFpbXBvcnRhbnQ7d2lkdGg6MTVweDtoZWlnaHQ6MTVweDtsaW5lLWhlaWdodDoxNXB4fS51aS5yYWRpby5jaGVja2JveCAuYm94OmFmdGVyLC51aS5yYWRpby5jaGVja2JveCBsYWJlbDphZnRlcnt0b3A6MXB4O2xlZnQ6MDt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2JvcmRlci1yYWRpdXM6NTAwcmVtOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC40NjY2NjY2Nyk7dHJhbnNmb3JtOnNjYWxlKC40NjY2NjY2Nyk7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3Vzfi5ib3g6YmVmb3JlLC51aS5yYWRpby5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS51aS5yYWRpby5jaGVja2JveCBpbnB1dDpmb2N1c34uYm94OmFmdGVyLC51aS5yYWRpby5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6aW5kZXRlcm1pbmF0ZX4uYm94OmFmdGVyLC51aS5yYWRpby5jaGVja2JveCBpbnB1dDppbmRldGVybWluYXRlfmxhYmVsOmFmdGVye29wYWNpdHk6MH0udWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS51aS5yYWRpby5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveDpiZWZvcmUsLnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2ZmZn0udWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Zm9jdXM6Y2hlY2tlZH4uYm94OmFmdGVyLC51aS5yYWRpby5jaGVja2JveCBpbnB1dDpmb2N1czpjaGVja2VkfmxhYmVsOmFmdGVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5zbGlkZXIuY2hlY2tib3h7bWluLWhlaWdodDoxLjI1cmVtfS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXR7d2lkdGg6My41cmVtO2hlaWdodDoxLjI1cmVtfS51aS5zbGlkZXIuY2hlY2tib3ggLmJveCwudWkuc2xpZGVyLmNoZWNrYm94IGxhYmVse3BhZGRpbmctbGVmdDo0LjVyZW07bGluZS1oZWlnaHQ6MXJlbTtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuc2xpZGVyLmNoZWNrYm94IC5ib3g6YmVmb3JlLC51aS5zbGlkZXIuY2hlY2tib3ggbGFiZWw6YmVmb3Jle2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJztib3JkZXI6bm9uZSFpbXBvcnRhbnQ7bGVmdDowO3otaW5kZXg6MTt0b3A6LjRyZW07YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNSk7d2lkdGg6My41cmVtO2hlaWdodDouMjE0Mjg1NzFyZW07LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtib3JkZXItcmFkaXVzOjUwMHJlbTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuM3MgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjNzIGVhc2V9LnVpLnNsaWRlci5jaGVja2JveCAuYm94OmFmdGVyLC51aS5zbGlkZXIuY2hlY2tib3ggbGFiZWw6YWZ0ZXJ7YmFja2dyb3VuZDojZmZmIC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20odHJhbnNwYXJlbnQpLHRvKHJnYmEoMCwwLDAsLjA1KSkpO2JhY2tncm91bmQ6I2ZmZiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO2JhY2tncm91bmQ6I2ZmZiAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCwgbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDojZmZmIGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6JychaW1wb3J0YW50O29wYWNpdHk6MTt6LWluZGV4OjI7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7d2lkdGg6MS41cmVtO2hlaWdodDoxLjVyZW07dG9wOi0uMjVyZW07bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7Ym9yZGVyLXJhZGl1czo1MDByZW07LXdlYmtpdC10cmFuc2l0aW9uOmxlZnQgLjNzIGVhc2U7dHJhbnNpdGlvbjpsZWZ0IC4zcyBlYXNlfS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Zm9jdXN+LmJveDpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xNSk7Ym9yZGVyOm5vbmV9LnVpLnNsaWRlci5jaGVja2JveCAuYm94OmhvdmVyLC51aS5zbGlkZXIuY2hlY2tib3ggbGFiZWw6aG92ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnNsaWRlci5jaGVja2JveCAuYm94OmhvdmVyOjpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBsYWJlbDpob3Zlcjo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTUpfS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94LC51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9LnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpjaGVja2VkfmxhYmVsOmFmdGVye2xlZnQ6MnJlbX0udWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveCwudWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+bGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveDpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpmb2N1czpjaGVja2VkfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAhaW1wb3J0YW50fS51aS50b2dnbGUuY2hlY2tib3h7bWluLWhlaWdodDoxLjVyZW19LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dHt3aWR0aDozLjVyZW07aGVpZ2h0OjEuNXJlbX0udWkudG9nZ2xlLmNoZWNrYm94IC5ib3gsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbHttaW4taGVpZ2h0OjEuNXJlbTtwYWRkaW5nLWxlZnQ6NC41cmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkudG9nZ2xlLmNoZWNrYm94IGxhYmVse3BhZGRpbmctdG9wOi4xNWVtfS51aS50b2dnbGUuY2hlY2tib3ggLmJveDpiZWZvcmUsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbDpiZWZvcmV7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3otaW5kZXg6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO2JvcmRlcjpub25lO3RvcDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTt3aWR0aDozLjVyZW07aGVpZ2h0OjEuNXJlbTtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkudG9nZ2xlLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbDphZnRlcntiYWNrZ3JvdW5kOiNmZmYgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDojZmZmIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7YmFja2dyb3VuZDojZmZmIC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSxmcm9tKHRyYW5zcGFyZW50KSx0byhyZ2JhKDAsMCwwLC4wNSkpKTtiYWNrZ3JvdW5kOiNmZmYgbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJyFpbXBvcnRhbnQ7b3BhY2l0eToxO3otaW5kZXg6Mjtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksMCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDt3aWR0aDoxLjVyZW07aGVpZ2h0OjEuNXJlbTt0b3A6MDtsZWZ0OjA7Ym9yZGVyLXJhZGl1czo1MDByZW07LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjNzIGVhc2UsbGVmdCAuM3MgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjNzIGVhc2UsbGVmdCAuM3MgZWFzZX0udWkudG9nZ2xlLmNoZWNrYm94IGlucHV0fi5ib3g6YWZ0ZXIsLnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dH5sYWJlbDphZnRlcntsZWZ0Oi0uMDVyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpmb2N1c34uYm94OmJlZm9yZSwudWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmZvY3VzfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjE1KTtib3JkZXI6bm9uZX0udWkudG9nZ2xlLmNoZWNrYm94IC5ib3g6aG92ZXI6OmJlZm9yZSwudWkudG9nZ2xlLmNoZWNrYm94IGxhYmVsOmhvdmVyOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xNSk7Ym9yZGVyOm5vbmV9LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3gsLnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpjaGVja2VkfmxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjk1KSFpbXBvcnRhbnR9LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YmVmb3JlLC51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwIWltcG9ydGFudH0udWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+LmJveDphZnRlciwudWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YWZ0ZXJ7bGVmdDoyLjE1cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksMCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Zm9jdXM6Y2hlY2tlZH4uYm94LC51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Zm9jdXM6Y2hlY2tlZH5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Zm9jdXM6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzBkNzFiYiFpbXBvcnRhbnR9LnVpLmZpdHRlZC5jaGVja2JveCAuYm94LC51aS5maXR0ZWQuY2hlY2tib3ggbGFiZWx7cGFkZGluZy1sZWZ0OjAhaW1wb3J0YW50fS51aS5maXR0ZWQudG9nZ2xlLmNoZWNrYm94e3dpZHRoOjMuNXJlbX0udWkuZml0dGVkLnNsaWRlci5jaGVja2JveHt3aWR0aDozLjVyZW19QGZvbnQtZmFjZXtmb250LWZhbWlseTpDaGVja2JveDtzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXR0ZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxBQUVBQUFBTEFJQUFBd0F3VDFNdk1nOFNCRDhBQUFDOEFBQUFZR050WVhBWVZ0Q0pBQUFCSEFBQUFGUm5ZWE53QUFBQUVBQUFBWEFBQUFBSVoyeDVabjRodXdVQUFBRjRBQUFCWUdobFlXUUdQZTFaQUFBQzJBQUFBRFpvYUdWaEIzMER5QUFBQXhBQUFBQWthRzEwZUJCS0FFVUFBQU0wQUFBQUhHeHZZMkVBbWdFU0FBQURVQUFBQUJCdFlYaHdBQWtBTHdBQUEyQUFBQUFnYm1GdFpTQzhJdWdBQUFPQUFBQUJrbkJ2YzNRQUF3QUFBQUFGRkFBQUFDQUFBd01UQVpBQUJRQUFBcGtDekFBQUFJOENtUUxNQUFBQjZ3QXpBUWtBQUFBQUFBQUFBQUFBQUFBQUFBQUJFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQURvQWdQQS84QUFRQVBBQUVBQUFBQUJBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQURBQUFBQXdBQUFCd0FBUUFEQUFBQUhBQURBQUVBQUFBY0FBUUFPQUFBQUFvQUNBQUNBQUlBQVFBZzZBTC8vZi8vQUFBQUFBQWc2QUQvL2YvL0FBSC80eGdFQUFNQUFRQUFBQUFBQUFBQUFBQUFBUUFCLy84QUR3QUJBQUFBQUFBQUFBQUFBZ0FBTnprQkFBQUFBQUVBQUFBQUFBQUFBQUFDQUFBM09RRUFBQUFBQVFBQUFBQUFBQUFBQUFJQUFEYzVBUUFBQUFBQkFFVUFVUU83QXZnQUdnQUFBUlFIQVFZaklpY0JKalUwUHdFMk16SWZBUUUyTXpJZkFSWVZBN3NRL2hRUUZoY1EvdU1RRUU0UUZ4Y1FxQUYyRUJjWEVFNFFBbk1XRVA0VUVCQUJIUkFYRmhCT0VCQ29BWGNRRUU0UUZ3QUFBQUFCQUFBQmJnTWxBa2tBRkFBQUFSVVVCd1lqSVNJbkpqMEJORGMyTXlFeUZ4WVZBeVVRRUJmOVNSY1FFQkFRRndLM0Z4QVFBaEp0RnhBUUVCQVhiUmNRRUJBUUZ3QUFBQUFCQUFBQVNRTWxBMjRBTEFBQUFSVVVCd1lyQVJVVUJ3WXJBU0luSmowQkl5SW5KajBCTkRjMk93RTFORGMyT3dFeUZ4WWRBVE15RnhZVkF5VVFFQmZ1RUJBWGJoWVFFTzRYRUJBUUVCZnVFQkFXYmhjUUVPNFhFQkFDRW0wWEVCRHVGeEFRRUJBWDdoQVFGMjBYRUJEdUZ4QVFFQkFYN2hBUUZ3QUFBUUFBQUFJQUFIUlN6VDlmRHp6MUFBc0VBQUFBQUFEUnNkUjNBQUFBQU5HeDFIY0FBQUFBQTdzRGJnQUFBQWdBQWdBQUFBQUFBQUFCQUFBRHdQL0FBQUFFQUFBQUFBQUR1d0FCQUFBQUFBQUFBQUFBQUFBQUFBQUFCd1FBQUFBQUFBQUFBQUFBQUFJQUFBQUVBQUJGQXlVQUFBTWxBQUFBQUFBQUFBb0FGQUFlQUU0QWNnQ3dBQUVBQUFBSEFDMEFBUUFBQUFBQUFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU9BSzRBQVFBQUFBQUFBUUFJQUFBQUFRQUFBQUFBQWdBSEFHa0FBUUFBQUFBQUF3QUlBRGtBQVFBQUFBQUFCQUFJQUg0QUFRQUFBQUFBQlFBTEFCZ0FBUUFBQUFBQUJnQUlBRkVBQVFBQUFBQUFDZ0FhQUpZQUF3QUJCQWtBQVFBUUFBZ0FBd0FCQkFrQUFnQU9BSEFBQXdBQkJBa0FBd0FRQUVFQUF3QUJCQWtBQkFBUUFJWUFBd0FCQkFrQUJRQVdBQ01BQXdBQkJBa0FCZ0FRQUZrQUF3QUJCQWtBQ2dBMEFMQkRhR1ZqYTJKdmVBQkRBR2dBWlFCakFHc0FZZ0J2QUhoV1pYSnphVzl1SURJdU1BQldBR1VBY2dCekFHa0Fid0J1QUNBQU1nQXVBREJEYUdWamEySnZlQUJEQUdnQVpRQmpBR3NBWWdCdkFIaERhR1ZqYTJKdmVBQkRBR2dBWlFCakFHc0FZZ0J2QUhoU1pXZDFiR0Z5QUZJQVpRQm5BSFVBYkFCaEFISkRhR1ZqYTJKdmVBQkRBR2dBWlFCakFHc0FZZ0J2QUhoR2IyNTBJR2RsYm1WeVlYUmxaQ0JpZVNCSlkyOU5iMjl1TGdCR0FHOEFiZ0IwQUNBQVp3QmxBRzRBWlFCeUFHRUFkQUJsQUdRQUlBQmlBSGtBSUFCSkFHTUFid0JOQUc4QWJ3QnVBQzRBQUFBREFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIGZvcm1hdCgndHJ1ZXR5cGUnKX0udWkuY2hlY2tib3ggLmJveDphZnRlciwudWkuY2hlY2tib3ggbGFiZWw6YWZ0ZXJ7Zm9udC1mYW1pbHk6Q2hlY2tib3h9LnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbDphZnRlcntjb250ZW50OidcXFxcZTgwMCd9LnVpLmNoZWNrYm94IGlucHV0OmluZGV0ZXJtaW5hdGV+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6aW5kZXRlcm1pbmF0ZX5sYWJlbDphZnRlcntmb250LXNpemU6MTJweDtjb250ZW50OidcXFxcZTgwMSd9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIERpbW1lclxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLmRpbW1hYmxlOm5vdChib2R5KXtwb3NpdGlvbjpyZWxhdGl2ZX0udWkuZGltbWVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MCFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtwYWRkaW5nOjFlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg1KTtvcGFjaXR5OjA7bGluZS1oZWlnaHQ6MTstd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6Ym90aDthbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246LjVzO2FuaW1hdGlvbi1kdXJhdGlvbjouNXM7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjVzIGxpbmVhcjt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjVzIGxpbmVhcjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7d2lsbC1jaGFuZ2U6b3BhY2l0eTt6LWluZGV4OjEwMDB9LnVpLmRpbW1lcj4uY29udGVudHstd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7LW1zLXVzZXItc2VsZWN0OnRleHQ7dXNlci1zZWxlY3Q6dGV4dDtjb2xvcjojZmZmfS51aS5zZWdtZW50Pi51aS5kaW1tZXJ7Ym9yZGVyLXJhZGl1czppbmhlcml0IWltcG9ydGFudH0udWkuZGltbWVyOm5vdCguaW52ZXJ0ZWQpOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS51aS5kaW1tZXI6bm90KC5pbnZlcnRlZCk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1ie2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMjUpfS51aS5kaW1tZXI6bm90KC5pbnZlcnRlZCk6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOndpbmRvdy1pbmFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjE1KX0udWkuZGltbWVyOm5vdCguaW52ZXJ0ZWQpOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjM1KX0uYW5pbWF0aW5nLmRpbW1hYmxlOm5vdChib2R5KSwuZGltbWVkLmRpbW1hYmxlOm5vdChib2R5KXtvdmVyZmxvdzpoaWRkZW59LmRpbW1lZC5kaW1tYWJsZT4udWkuYW5pbWF0aW5nLmRpbW1lciwuZGltbWVkLmRpbW1hYmxlPi51aS52aXNpYmxlLmRpbW1lciwudWkuYWN0aXZlLmRpbW1lcntkaXNwbGF5OmZsZXg7b3BhY2l0eToxfS51aS5kaXNhYmxlZC5kaW1tZXJ7d2lkdGg6MCFpbXBvcnRhbnQ7aGVpZ2h0OjAhaW1wb3J0YW50fS5kaW1tZWQuZGltbWFibGU+LnVpLmFuaW1hdGluZy5sZWdhY3kuZGltbWVyLC5kaW1tZWQuZGltbWFibGU+LnVpLnZpc2libGUubGVnYWN5LmRpbW1lciwudWkuYWN0aXZlLmxlZ2FjeS5kaW1tZXJ7ZGlzcGxheTpibG9ja30udWlbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdLmRpbW1lcntqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0udWlbY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdLmRpbW1lcntqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnVpLnBhZ2UuZGltbWVye3Bvc2l0aW9uOmZpeGVkOy13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOicnO3RyYW5zZm9ybS1zdHlsZTonJzstd2Via2l0LXBlcnNwZWN0aXZlOjIwMDBweDtwZXJzcGVjdGl2ZToyMDAwcHg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyfWJvZHkuYW5pbWF0aW5nLmluLmRpbW1hYmxlLGJvZHkuZGltbWVkLmRpbW1hYmxle292ZXJmbG93OmhpZGRlbn1ib2R5LmRpbW1hYmxlPi5kaW1tZXJ7cG9zaXRpb246Zml4ZWR9LmJsdXJyaW5nLmRpbW1hYmxlPjpub3QoLmRpbW1lcil7LXdlYmtpdC1maWx0ZXI6Ymx1cigwKSBncmF5c2NhbGUoMCk7ZmlsdGVyOmJsdXIoMCkgZ3JheXNjYWxlKDApOy13ZWJraXQtdHJhbnNpdGlvbjouOHMgLXdlYmtpdC1maWx0ZXIgZWFzZTt0cmFuc2l0aW9uOi44cyAtd2Via2l0LWZpbHRlciBlYXNlOy13ZWJraXQtdHJhbnNpdGlvbjouOHMgZmlsdGVyIGVhc2U7dHJhbnNpdGlvbjouOHMgZmlsdGVyIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uOi44cyBmaWx0ZXIgZWFzZSwuOHMgLXdlYmtpdC1maWx0ZXIgZWFzZTt0cmFuc2l0aW9uOi44cyBmaWx0ZXIgZWFzZSwuOHMgLXdlYmtpdC1maWx0ZXIgZWFzZX0uYmx1cnJpbmcuZGltbWVkLmRpbW1hYmxlPjpub3QoLmRpbW1lcil7LXdlYmtpdC1maWx0ZXI6Ymx1cig1cHgpIGdyYXlzY2FsZSguNyk7ZmlsdGVyOmJsdXIoNXB4KSBncmF5c2NhbGUoLjcpfS5ibHVycmluZy5kaW1tYWJsZT4uZGltbWVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9LmJsdXJyaW5nLmRpbW1hYmxlPi5pbnZlcnRlZC5kaW1tZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC42KX0udWkuZGltbWVyPi50b3AuYWxpZ25lZC5jb250ZW50Pip7dmVydGljYWwtYWxpZ246dG9wfS51aS5kaW1tZXI+LmJvdHRvbS5hbGlnbmVkLmNvbnRlbnQ+Knt2ZXJ0aWNhbC1hbGlnbjpib3R0b219LnVpLmludmVydGVkLmRpbW1lcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjg1KX0udWkuaW52ZXJ0ZWQuZGltbWVyPi5jb250ZW50Pip7Y29sb3I6I2ZmZn0udWkuc2ltcGxlLmRpbW1lcntkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtvcGFjaXR5OjE7d2lkdGg6MCU7aGVpZ2h0OjAlO3otaW5kZXg6LTEwMDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCl9LmRpbW1lZC5kaW1tYWJsZT4udWkuc2ltcGxlLmRpbW1lcntvdmVyZmxvdzp2aXNpYmxlO29wYWNpdHk6MTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODUpO3otaW5kZXg6MX0udWkuc2ltcGxlLmludmVydGVkLmRpbW1lcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMCl9LmRpbW1lZC5kaW1tYWJsZT4udWkuc2ltcGxlLmludmVydGVkLmRpbW1lcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjg1KX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gRHJvcGRvd25cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5kcm9wZG93bntjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztvdXRsaW5lOjA7dGV4dC1hbGlnbjpsZWZ0Oy13ZWJraXQtdHJhbnNpdGlvbjp3aWR0aCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjp3aWR0aCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3gtc2hhZG93IC4xcyBlYXNlLHdpZHRoIC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSx3aWR0aCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS51aS5kcm9wZG93biAubWVudXtjdXJzb3I6YXV0bztwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5Om5vbmU7b3V0bGluZTowO3RvcDoxMDAlO21pbi13aWR0aDotd2Via2l0LW1heC1jb250ZW50O21pbi13aWR0aDptYXgtY29udGVudDttYXJnaW46MDtwYWRkaW5nOjAgMDtiYWNrZ3JvdW5kOiNmZmY7Zm9udC1zaXplOjFlbTt0ZXh0LXNoYWRvdzpub25lO3RleHQtYWxpZ246bGVmdDstd2Via2l0LWJveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt6LWluZGV4OjExO3dpbGwtY2hhbmdlOnRyYW5zZm9ybSxvcGFjaXR5fS51aS5kcm9wZG93biAubWVudT4qe3doaXRlLXNwYWNlOm5vd3JhcH0udWkuZHJvcGRvd24+aW5wdXQ6bm90KC5zZWFyY2gpOmZpcnN0LWNoaWxkLC51aS5kcm9wZG93bj5zZWxlY3R7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZHJvcGRvd24+LmRyb3Bkb3duLmljb257cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6YXV0bztmb250LXNpemU6Ljg1NzE0Mjg2ZW07bWFyZ2luOjAgMCAwIDFlbX0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0gLmRyb3Bkb3duLmljb257d2lkdGg6YXV0bztmbG9hdDpyaWdodDttYXJnaW46MCAwIDAgMWVtfS51aS5kcm9wZG93biAubWVudT4uaXRlbSAuZHJvcGRvd24uaWNvbisudGV4dHttYXJnaW4tcmlnaHQ6MWVtfS51aS5kcm9wZG93bj4udGV4dHtkaXNwbGF5OmlubGluZS1ibG9jazstd2Via2l0LXRyYW5zaXRpb246bm9uZTt0cmFuc2l0aW9uOm5vbmV9LnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOm5vbmU7aGVpZ2h0OmF1dG87dGV4dC1hbGlnbjpsZWZ0O2JvcmRlci10b3A6bm9uZTtsaW5lLWhlaWdodDoxZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpO3BhZGRpbmc6Ljc4NTcxNDI5cmVtIDEuMTQyODU3MTRyZW0haW1wb3J0YW50O2ZvbnQtc2l6ZToxcmVtO3RleHQtdHJhbnNmb3JtOm5vbmU7Zm9udC13ZWlnaHQ6NDAwOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZX0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcC13aWR0aDowfS51aS5kcm9wZG93biAubWVudSAuaXRlbT5bY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0sLnVpLmRyb3Bkb3duPi50ZXh0PltjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXXtmbG9hdDpyaWdodCFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjFlbSFpbXBvcnRhbnR9LnVpLmRyb3Bkb3duIC5tZW51IC5pdGVtPltjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJdLC51aS5kcm9wZG93bj4udGV4dD5bY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXXtmbG9hdDpsZWZ0IWltcG9ydGFudDttYXJnaW4tbGVmdDowIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6MWVtIWltcG9ydGFudH0udWkuZHJvcGRvd24gLm1lbnUgLml0ZW0+LmZsYWcuZmxvYXRlZCwudWkuZHJvcGRvd24gLm1lbnUgLml0ZW0+Lmljb24uZmxvYXRlZCwudWkuZHJvcGRvd24gLm1lbnUgLml0ZW0+LmltYWdlLmZsb2F0ZWQsLnVpLmRyb3Bkb3duIC5tZW51IC5pdGVtPmltZy5mbG9hdGVke21hcmdpbi10b3A6MH0udWkuZHJvcGRvd24gLm1lbnU+LmhlYWRlcnttYXJnaW46MXJlbSAwIC43NXJlbTtwYWRkaW5nOjAgMS4xNDI4NTcxNHJlbTtjb2xvcjpyZ2JhKDAsMCwwLC44NSk7Zm9udC1zaXplOi43ODU3MTQyOWVtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9LnVpLmRyb3Bkb3duIC5tZW51Pi5kaXZpZGVye2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpO2hlaWdodDowO21hcmdpbjouNWVtIDB9LnVpLmRyb3Bkb3duLmRyb3Bkb3duIC5tZW51Pi5pbnB1dHt3aWR0aDphdXRvO2Rpc3BsYXk6ZmxleDttYXJnaW46MS4xNDI4NTcxNHJlbSAuNzg1NzE0MjlyZW07bWluLXdpZHRoOjEwcmVtfS51aS5kcm9wZG93biAubWVudT4uaGVhZGVyKy5pbnB1dHttYXJnaW4tdG9wOjB9LnVpLmRyb3Bkb3duIC5tZW51Pi5pbnB1dDpub3QoLnRyYW5zcGFyZW50KSBpbnB1dHtwYWRkaW5nOi41ZW0gMWVtfS51aS5kcm9wZG93biAubWVudT4uaW5wdXQ6bm90KC50cmFuc3BhcmVudCkgLmJ1dHRvbiwudWkuZHJvcGRvd24gLm1lbnU+LmlucHV0Om5vdCgudHJhbnNwYXJlbnQpIC5pY29uLC51aS5kcm9wZG93biAubWVudT4uaW5wdXQ6bm90KC50cmFuc3BhcmVudCkgLmxhYmVse3BhZGRpbmctdG9wOi41ZW07cGFkZGluZy1ib3R0b206LjVlbX0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+LmRlc2NyaXB0aW9uLC51aS5kcm9wZG93bj4udGV4dD4uZGVzY3JpcHRpb257ZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMCAwIDFlbTtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuZHJvcGRvd24gLm1lbnU+Lm1lc3NhZ2V7cGFkZGluZzouNzg1NzE0MjlyZW0gMS4xNDI4NTcxNHJlbTtmb250LXdlaWdodDo0MDB9LnVpLmRyb3Bkb3duIC5tZW51Pi5tZXNzYWdlOm5vdCgudWkpe2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5kcm9wZG93biAubWVudSAubWVudXt0b3A6MCFpbXBvcnRhbnQ7bGVmdDoxMDAlO3JpZ2h0OmF1dG87bWFyZ2luOjAgMCAwIC0uNWVtIWltcG9ydGFudDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSFpbXBvcnRhbnQ7ei1pbmRleDoyMSFpbXBvcnRhbnR9LnVpLmRyb3Bkb3duIC5tZW51IC5tZW51OmFmdGVye2Rpc3BsYXk6bm9uZX0udWkuZHJvcGRvd24+LnRleHQ+LmZsYWcsLnVpLmRyb3Bkb3duPi50ZXh0Pi5pY29uLC51aS5kcm9wZG93bj4udGV4dD4uaW1hZ2UsLnVpLmRyb3Bkb3duPi50ZXh0Pi5sYWJlbCwudWkuZHJvcGRvd24+LnRleHQ+aW1ne21hcmdpbi10b3A6MH0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+LmZsYWcsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5pY29uLC51aS5kcm9wZG93biAubWVudT4uaXRlbT4uaW1hZ2UsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5sYWJlbCwudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+aW1ne21hcmdpbi10b3A6MH0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+LmZsYWcsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5pY29uLC51aS5kcm9wZG93biAubWVudT4uaXRlbT4uaW1hZ2UsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5sYWJlbCwudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+aW1nLC51aS5kcm9wZG93bj4udGV4dD4uZmxhZywudWkuZHJvcGRvd24+LnRleHQ+Lmljb24sLnVpLmRyb3Bkb3duPi50ZXh0Pi5pbWFnZSwudWkuZHJvcGRvd24+LnRleHQ+LmxhYmVsLC51aS5kcm9wZG93bj4udGV4dD5pbWd7bWFyZ2luLWxlZnQ6MDtmbG9hdDpub25lO21hcmdpbi1yaWdodDouNzg1NzE0MjlyZW19LnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5pbWFnZSwudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+aW1nLC51aS5kcm9wZG93bj4udGV4dD4uaW1hZ2UsLnVpLmRyb3Bkb3duPi50ZXh0PmltZ3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6YXV0bzttYXJnaW4tdG9wOi0uNWVtO21hcmdpbi1ib3R0b206LS41ZW07bWF4LWhlaWdodDoyZW19LnVpLmRyb3Bkb3duIC51aS5tZW51Pi5pdGVtOmJlZm9yZSwudWkubWVudSAudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW06YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkubWVudSAudWkuZHJvcGRvd24gLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1sZWZ0Om5vbmV9LnVpLmJ1dHRvbnM+LnVpLmRyb3Bkb3duOmxhc3QtY2hpbGQgLm1lbnUsLnVpLm1lbnUgLnJpZ2h0LmRyb3Bkb3duLml0ZW0gLm1lbnUsLnVpLm1lbnUgLnJpZ2h0Lm1lbnUgLmRyb3Bkb3duOmxhc3QtY2hpbGQgLm1lbnV7bGVmdDphdXRvO3JpZ2h0OjB9LnVpLmxhYmVsLmRyb3Bkb3duIC5tZW51e21pbi13aWR0aDoxMDAlfS51aS5kcm9wZG93bi5pY29uLmJ1dHRvbj4uZHJvcGRvd24uaWNvbnttYXJnaW46MH0udWkuYnV0dG9uLmRyb3Bkb3duIC5tZW51e21pbi13aWR0aDoxMDAlfS51aS5zZWxlY3Rpb24uZHJvcGRvd257Y3Vyc29yOnBvaW50ZXI7d29yZC13cmFwOmJyZWFrLXdvcmQ7bGluZS1oZWlnaHQ6MWVtO3doaXRlLXNwYWNlOm5vcm1hbDtvdXRsaW5lOjA7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlWigwKTt0cmFuc2Zvcm06cm90YXRlWigwKTttaW4td2lkdGg6MTRlbTttaW4taGVpZ2h0OjIuNzE0Mjg1NzFlbTtiYWNrZ3JvdW5kOiNmZmY7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzouNzg1NzE0MjllbSAyLjFlbSAuNzg1NzE0MjllbSAxZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246d2lkdGggLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSx3aWR0aCAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2Usd2lkdGggLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlfS51aS5zZWxlY3Rpb24uZHJvcGRvd24uYWN0aXZlLC51aS5zZWxlY3Rpb24uZHJvcGRvd24udmlzaWJsZXt6LWluZGV4OjEwfXNlbGVjdC51aS5kcm9wZG93bntoZWlnaHQ6MzhweDtwYWRkaW5nOi41ZW07Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7dmlzaWJpbGl0eTp2aXNpYmxlfS51aS5zZWxlY3Rpb24uZHJvcGRvd24+LmRlbGV0ZS5pY29uLC51aS5zZWxlY3Rpb24uZHJvcGRvd24+LmRyb3Bkb3duLmljb24sLnVpLnNlbGVjdGlvbi5kcm9wZG93bj4uc2VhcmNoLmljb257Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bztsaW5lLWhlaWdodDoxLjIxNDI4NTcxZW07dG9wOi43ODU3MTQyOWVtO3JpZ2h0OjFlbTt6LWluZGV4OjM7bWFyZ2luOi0uNzg1NzE0MjllbTtwYWRkaW5nOi45MTY2NjY2N2VtO29wYWNpdHk6Ljg7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlfS51aS5jb21wYWN0LnNlbGVjdGlvbi5kcm9wZG93bnttaW4td2lkdGg6MH0udWkuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51e292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO2JvcmRlci10b3Atd2lkdGg6MCFpbXBvcnRhbnQ7d2lkdGg6YXV0bztvdXRsaW5lOjA7bWFyZ2luOjAgLTFweDttaW4td2lkdGg6Y2FsYygxMDAlICsgMnB4KTt3aWR0aDpjYWxjKDEwMCUgKyAycHgpO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2V9LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudTphZnRlciwudWkuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51OmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudT4ubWVzc2FnZXtwYWRkaW5nOi43ODU3MTQyOXJlbSAxLjE0Mjg1NzE0cmVtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjguMDE0Mjg1NzFyZW19fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjEwLjY4NTcxNDI5cmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5zZWxlY3Rpb24uZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoxNi4wMjg1NzE0M3JlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjIxLjM3MTQyODU3cmVtfX0udWkuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51Pi5pdGVte2JvcmRlci10b3A6MXB4IHNvbGlkICNmYWZhZmE7cGFkZGluZzouNzg1NzE0MjlyZW0gMS4xNDI4NTcxNHJlbSFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm9ybWFsO3dvcmQtd3JhcDpub3JtYWx9LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudT4uaGlkZGVuLmFkZGl0aW9uLml0ZW17ZGlzcGxheTpub25lfS51aS5zZWxlY3Rpb24uZHJvcGRvd246aG92ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjM1KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnNlbGVjdGlvbi5hY3RpdmUuZHJvcGRvd257Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VsZWN0aW9uLmFjdGl2ZS5kcm9wZG93biAubWVudXtib3JkZXItY29sb3I6Izk2YzhkYTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWxlY3Rpb24uZHJvcGRvd246Zm9jdXN7Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5zZWxlY3Rpb24uZHJvcGRvd246Zm9jdXMgLm1lbnV7Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VsZWN0aW9uLnZpc2libGUuZHJvcGRvd24+LnRleHQ6bm90KC5kZWZhdWx0KXtmb250LXdlaWdodDo0MDA7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnNlbGVjdGlvbi5hY3RpdmUuZHJvcGRvd246aG92ZXJ7Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VsZWN0aW9uLmFjdGl2ZS5kcm9wZG93bjpob3ZlciAubWVudXtib3JkZXItY29sb3I6Izk2YzhkYTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5hY3RpdmUuc2VsZWN0aW9uLmRyb3Bkb3duPi5kcm9wZG93bi5pY29uLC51aS52aXNpYmxlLnNlbGVjdGlvbi5kcm9wZG93bj4uZHJvcGRvd24uaWNvbntvcGFjaXR5OicnO3otaW5kZXg6M30udWkuYWN0aXZlLnNlbGVjdGlvbi5kcm9wZG93bntib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjAhaW1wb3J0YW50fS51aS5hY3RpdmUuZW1wdHkuc2VsZWN0aW9uLmRyb3Bkb3due2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuYWN0aXZlLmVtcHR5LnNlbGVjdGlvbi5kcm9wZG93biAubWVudXtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLnNlYXJjaC5kcm9wZG93bnttaW4td2lkdGg6Jyd9LnVpLnNlYXJjaC5kcm9wZG93bj5pbnB1dC5zZWFyY2h7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50IWltcG9ydGFudDtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y3Vyc29yOnRleHQ7dG9wOjA7bGVmdDoxcHg7d2lkdGg6MTAwJTtvdXRsaW5lOjA7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMCk7cGFkZGluZzppbmhlcml0fS51aS5zZWFyY2guZHJvcGRvd24+aW5wdXQuc2VhcmNoe3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mn0udWkuc2VhcmNoLmRyb3Bkb3duPi50ZXh0e2N1cnNvcjp0ZXh0O3Bvc2l0aW9uOnJlbGF0aXZlO2xlZnQ6MXB4O3otaW5kZXg6M30udWkuc2VhcmNoLnNlbGVjdGlvbi5kcm9wZG93bj5pbnB1dC5zZWFyY2h7bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtO3BhZGRpbmc6LjY3ODU3MTQzZW0gMi4xZW0gLjY3ODU3MTQzZW0gMWVtfS51aS5zZWFyY2guc2VsZWN0aW9uLmRyb3Bkb3duPnNwYW4uc2l6ZXJ7bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtO3BhZGRpbmc6LjY3ODU3MTQzZW0gMi4xZW0gLjY3ODU3MTQzZW0gMWVtO2Rpc3BsYXk6bm9uZTt3aGl0ZS1zcGFjZTpwcmV9LnVpLnNlYXJjaC5kcm9wZG93bi5hY3RpdmU+aW5wdXQuc2VhcmNoLC51aS5zZWFyY2guZHJvcGRvd24udmlzaWJsZT5pbnB1dC5zZWFyY2h7Y3Vyc29yOmF1dG99LnVpLnNlYXJjaC5kcm9wZG93bi5hY3RpdmU+LnRleHQsLnVpLnNlYXJjaC5kcm9wZG93bi52aXNpYmxlPi50ZXh0e3BvaW50ZXItZXZlbnRzOm5vbmV9LnVpLmFjdGl2ZS5zZWFyY2guZHJvcGRvd24gaW5wdXQuc2VhcmNoOmZvY3VzKy50ZXh0IC5mbGFnLC51aS5hY3RpdmUuc2VhcmNoLmRyb3Bkb3duIGlucHV0LnNlYXJjaDpmb2N1cysudGV4dCAuaWNvbntvcGFjaXR5Oi40NX0udWkuYWN0aXZlLnNlYXJjaC5kcm9wZG93biBpbnB1dC5zZWFyY2g6Zm9jdXMrLnRleHR7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpIWltcG9ydGFudH0udWkuc2VhcmNoLmRyb3Bkb3duIC5tZW51e292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnNlYXJjaC5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjguMDE0Mjg1NzFyZW19fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLnNlYXJjaC5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjEwLjY4NTcxNDI5cmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5zZWFyY2guZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoxNi4wMjg1NzE0M3JlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnNlYXJjaC5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjIxLjM3MTQyODU3cmVtfX0udWkubXVsdGlwbGUuZHJvcGRvd257cGFkZGluZzouMjI2MTkwNDhlbSAyLjFlbSAuMjI2MTkwNDhlbSAuMzU3MTQyODZlbX0udWkubXVsdGlwbGUuZHJvcGRvd24gLm1lbnV7Y3Vyc29yOmF1dG99LnVpLm11bHRpcGxlLnNlYXJjaC5kcm9wZG93biwudWkubXVsdGlwbGUuc2VhcmNoLmRyb3Bkb3duPmlucHV0LnNlYXJjaHtjdXJzb3I6dGV4dH0udWkubXVsdGlwbGUuZHJvcGRvd24+LmxhYmVsey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOnRvcDt3aGl0ZS1zcGFjZTpub3JtYWw7Zm9udC1zaXplOjFlbTtwYWRkaW5nOi4zNTcxNDI4NmVtIC43ODU3MTQyOWVtO21hcmdpbjouMTQyODU3MTRyZW0gLjI4NTcxNDI5cmVtIC4xNDI4NTcxNHJlbSAwOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkubXVsdGlwbGUuZHJvcGRvd24gLmRyb3Bkb3duLmljb257bWFyZ2luOicnO3BhZGRpbmc6Jyd9LnVpLm11bHRpcGxlLmRyb3Bkb3duPi50ZXh0e3Bvc2l0aW9uOnN0YXRpYztwYWRkaW5nOjA7bWF4LXdpZHRoOjEwMCU7bWFyZ2luOi40NTIzODA5NWVtIDAgLjQ1MjM4MDk1ZW0gLjY0Mjg1NzE0ZW07bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtfS51aS5tdWx0aXBsZS5kcm9wZG93bj4ubGFiZWx+aW5wdXQuc2VhcmNoe21hcmdpbi1sZWZ0Oi4xNDI4NTcxNGVtIWltcG9ydGFudH0udWkubXVsdGlwbGUuZHJvcGRvd24+LmxhYmVsfi50ZXh0e2Rpc3BsYXk6bm9uZX0udWkubXVsdGlwbGUuc2VhcmNoLmRyb3Bkb3duPi50ZXh0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtwYWRkaW5nOmluaGVyaXQ7bWFyZ2luOi40NTIzODA5NWVtIDAgLjQ1MjM4MDk1ZW0gLjY0Mjg1NzE0ZW07bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtfS51aS5tdWx0aXBsZS5zZWFyY2guZHJvcGRvd24+LmxhYmVsfi50ZXh0e2Rpc3BsYXk6bm9uZX0udWkubXVsdGlwbGUuc2VhcmNoLmRyb3Bkb3duPmlucHV0LnNlYXJjaHtwb3NpdGlvbjpzdGF0aWM7cGFkZGluZzowO21heC13aWR0aDoxMDAlO21hcmdpbjouNDUyMzgwOTVlbSAwIC40NTIzODA5NWVtIC42NDI4NTcxNGVtO3dpZHRoOjIuMmVtO2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbX0udWkuaW5saW5lLmRyb3Bkb3due2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2NvbG9yOmluaGVyaXR9LnVpLmlubGluZS5kcm9wZG93biAuZHJvcGRvd24uaWNvbnttYXJnaW46MCAuMjE0Mjg1NzFlbSAwIC4yMTQyODU3MWVtO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS51aS5pbmxpbmUuZHJvcGRvd24+LnRleHR7Zm9udC13ZWlnaHQ6NzAwfS51aS5pbmxpbmUuZHJvcGRvd24gLm1lbnV7Y3Vyc29yOmF1dG87bWFyZ2luLXRvcDouMjE0Mjg1NzFlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuZHJvcGRvd24gLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6MCAwO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO3otaW5kZXg6MTJ9LnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTt6LWluZGV4OjEzfS51aS5sb2FkaW5nLmRyb3Bkb3duPmkuaWNvbntoZWlnaHQ6MWVtIWltcG9ydGFudH0udWkubG9hZGluZy5zZWxlY3Rpb24uZHJvcGRvd24+aS5pY29ue3BhZGRpbmc6MS41ZW0gMS4yODU3MTQyOWVtIWltcG9ydGFudH0udWkubG9hZGluZy5kcm9wZG93bj5pLmljb246YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LS42NDI4NTcxNGVtIDAgMCAtLjY0Mjg1NzE0ZW07d2lkdGg6MS4yODU3MTQyOWVtO2hlaWdodDoxLjI4NTcxNDI5ZW07Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMSl9LnVpLmxvYWRpbmcuZHJvcGRvd24+aS5pY29uOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O21hcmdpbjotLjY0Mjg1NzE0ZW0gMCAwIC0uNjQyODU3MTRlbTt3aWR0aDoxLjI4NTcxNDI5ZW07aGVpZ2h0OjEuMjg1NzE0MjllbTstd2Via2l0LWFuaW1hdGlvbjpkcm9wZG93bi1zcGluIC42cyBsaW5lYXI7YW5pbWF0aW9uOmRyb3Bkb3duLXNwaW4gLjZzIGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTtib3JkZXItcmFkaXVzOjUwMHJlbTtib3JkZXItY29sb3I6Izc2NzY3NiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOi4yZW19LnVpLmxvYWRpbmcuZHJvcGRvd24uYnV0dG9uPmkuaWNvbjphZnRlciwudWkubG9hZGluZy5kcm9wZG93bi5idXR0b24+aS5pY29uOmJlZm9yZXtkaXNwbGF5Om5vbmV9QC13ZWJraXQta2V5ZnJhbWVzIGRyb3Bkb3duLXNwaW57ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgZHJvcGRvd24tc3Bpbntmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LnVpLmRlZmF1bHQuZHJvcGRvd246bm90KC5idXR0b24pPi50ZXh0LC51aS5kcm9wZG93bjpub3QoLmJ1dHRvbik+LmRlZmF1bHQudGV4dHtjb2xvcjpyZ2JhKDE5MSwxOTEsMTkxLC44Nyl9LnVpLmRlZmF1bHQuZHJvcGRvd246bm90KC5idXR0b24pPmlucHV0OmZvY3Vzfi50ZXh0LC51aS5kcm9wZG93bjpub3QoLmJ1dHRvbik+aW5wdXQ6Zm9jdXN+LmRlZmF1bHQudGV4dHtjb2xvcjpyZ2JhKDExNSwxMTUsMTE1LC44Nyl9LnVpLmxvYWRpbmcuZHJvcGRvd24+LnRleHR7LXdlYmtpdC10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lfS51aS5kcm9wZG93biAubG9hZGluZy5tZW51e2Rpc3BsYXk6YmxvY2s7dmlzaWJpbGl0eTpoaWRkZW47ei1pbmRleDotMX0udWkuZHJvcGRvd24+LmxvYWRpbmcubWVudXtsZWZ0OjAhaW1wb3J0YW50O3JpZ2h0OmF1dG8haW1wb3J0YW50fS51aS5kcm9wZG93bj4ubWVudSAubG9hZGluZy5tZW51e2xlZnQ6MTAwJSFpbXBvcnRhbnQ7cmlnaHQ6YXV0byFpbXBvcnRhbnR9LnVpLmRyb3Bkb3duIC5tZW51IC5zZWxlY3RlZC5pdGVtLC51aS5kcm9wZG93bi5zZWxlY3RlZHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjAzKTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmRyb3Bkb3duPi5maWx0ZXJlZC50ZXh0e3Zpc2liaWxpdHk6aGlkZGVufS51aS5kcm9wZG93biAuZmlsdGVyZWQuaXRlbXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5kcm9wZG93bi5lcnJvciwudWkuZHJvcGRvd24uZXJyb3I+LmRlZmF1bHQudGV4dCwudWkuZHJvcGRvd24uZXJyb3I+LnRleHR7Y29sb3I6IzlmM2EzOH0udWkuc2VsZWN0aW9uLmRyb3Bkb3duLmVycm9ye2JhY2tncm91bmQ6I2ZmZjZmNjtib3JkZXItY29sb3I6I2UwYjRiNH0udWkuc2VsZWN0aW9uLmRyb3Bkb3duLmVycm9yOmhvdmVye2JvcmRlci1jb2xvcjojZTBiNGI0fS51aS5kcm9wZG93bi5lcnJvcj4ubWVudSwudWkuZHJvcGRvd24uZXJyb3I+Lm1lbnUgLm1lbnV7Ym9yZGVyLWNvbG9yOiNlMGI0YjR9LnVpLmRyb3Bkb3duLmVycm9yPi5tZW51Pi5pdGVte2NvbG9yOiM5ZjNhMzh9LnVpLm11bHRpcGxlLnNlbGVjdGlvbi5lcnJvci5kcm9wZG93bj4ubGFiZWx7Ym9yZGVyLWNvbG9yOiNlMGI0YjR9LnVpLmRyb3Bkb3duLmVycm9yPi5tZW51Pi5pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZjJmMn0udWkuZHJvcGRvd24uZXJyb3I+Lm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6I2ZkY2ZjZn0udWkuZHJvcGRvd24+LmNsZWFyLmRyb3Bkb3duLmljb257b3BhY2l0eTouODstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2V9LnVpLmRyb3Bkb3duPi5jbGVhci5kcm9wZG93bi5pY29uOmhvdmVye29wYWNpdHk6MX0udWkuZGlzYWJsZWQuZHJvcGRvd24sLnVpLmRyb3Bkb3duIC5tZW51Pi5kaXNhYmxlZC5pdGVte2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTouNDV9LnVpLmRyb3Bkb3duIC5tZW51e2xlZnQ6MH0udWkuZHJvcGRvd24gLm1lbnUgLnJpZ2h0Lm1lbnUsLnVpLmRyb3Bkb3duIC5yaWdodC5tZW51Pi5tZW51e2xlZnQ6MTAwJSFpbXBvcnRhbnQ7cmlnaHQ6YXV0byFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS5kcm9wZG93bj4ubGVmdC5tZW51e2xlZnQ6YXV0byFpbXBvcnRhbnQ7cmlnaHQ6MCFpbXBvcnRhbnR9LnVpLmRyb3Bkb3duIC5tZW51IC5sZWZ0Lm1lbnUsLnVpLmRyb3Bkb3duPi5sZWZ0Lm1lbnUgLm1lbnV7bGVmdDphdXRvO3JpZ2h0OjEwMCU7bWFyZ2luOjAgLS41ZW0gMCAwIWltcG9ydGFudDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSFpbXBvcnRhbnR9LnVpLmRyb3Bkb3duIC5pdGVtIC5sZWZ0LmRyb3Bkb3duLmljb24sLnVpLmRyb3Bkb3duIC5sZWZ0Lm1lbnUgLml0ZW0gLmRyb3Bkb3duLmljb257d2lkdGg6YXV0bztmbG9hdDpsZWZ0O21hcmdpbjowfS51aS5kcm9wZG93biAuaXRlbSAubGVmdC5kcm9wZG93bi5pY29uLC51aS5kcm9wZG93biAubGVmdC5tZW51IC5pdGVtIC5kcm9wZG93bi5pY29ue3dpZHRoOmF1dG87ZmxvYXQ6bGVmdDttYXJnaW46MH0udWkuZHJvcGRvd24gLml0ZW0gLmxlZnQuZHJvcGRvd24uaWNvbisudGV4dCwudWkuZHJvcGRvd24gLmxlZnQubWVudSAuaXRlbSAuZHJvcGRvd24uaWNvbisudGV4dHttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjB9LnVpLnVwd2FyZC5kcm9wZG93bj4ubWVudXt0b3A6YXV0bztib3R0b206MTAwJTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDNweCAwIHJnYmEoMCwwLDAsLjA4KTtib3gtc2hhZG93OjAgMCAzcHggMCByZ2JhKDAsMCwwLC4wOCk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuZHJvcGRvd24gLnVwd2FyZC5tZW51e3RvcDphdXRvIWltcG9ydGFudDtib3R0b206MCFpbXBvcnRhbnR9LnVpLnNpbXBsZS51cHdhcmQuYWN0aXZlLmRyb3Bkb3duLC51aS5zaW1wbGUudXB3YXJkLmRyb3Bkb3duOmhvdmVye2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDAhaW1wb3J0YW50fS51aS51cHdhcmQuZHJvcGRvd24uYnV0dG9uOm5vdCgucG9pbnRpbmcpOm5vdCguZmxvYXRpbmcpLmFjdGl2ZXtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS51cHdhcmQuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51e2JvcmRlci10b3Atd2lkdGg6MXB4IWltcG9ydGFudDtib3JkZXItYm90dG9tLXdpZHRoOjAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIC0ycHggM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JveC1zaGFkb3c6MCAtMnB4IDNweCAwIHJnYmEoMCwwLDAsLjA4KX0udWkudXB3YXJkLnNlbGVjdGlvbi5kcm9wZG93bjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDJweCAwIHJnYmEoMCwwLDAsLjA1KTtib3gtc2hhZG93OjAgMCAycHggMCByZ2JhKDAsMCwwLC4wNSl9LnVpLmFjdGl2ZS51cHdhcmQuc2VsZWN0aW9uLmRyb3Bkb3due2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS51cHdhcmQuc2VsZWN0aW9uLmRyb3Bkb3duLnZpc2libGV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAzcHggMCByZ2JhKDAsMCwwLC4wOCk7Ym94LXNoYWRvdzowIDAgM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS51cHdhcmQuYWN0aXZlLnNlbGVjdGlvbi5kcm9wZG93bjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDNweCAwIHJnYmEoMCwwLDAsLjA1KTtib3gtc2hhZG93OjAgMCAzcHggMCByZ2JhKDAsMCwwLC4wNSl9LnVpLnVwd2FyZC5hY3RpdmUuc2VsZWN0aW9uLmRyb3Bkb3duOmhvdmVyIC5tZW51ey13ZWJraXQtYm94LXNoYWRvdzowIC0ycHggM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JveC1zaGFkb3c6MCAtMnB4IDNweCAwIHJnYmEoMCwwLDAsLjA4KX0udWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51LC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvfS51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7bWluLXdpZHRoOjEwMCUhaW1wb3J0YW50O3dpZHRoOmF1dG8haW1wb3J0YW50fS51aS5kcm9wZG93biAuc2Nyb2xsaW5nLm1lbnV7cG9zaXRpb246c3RhdGljO292ZXJmbG93LXk6YXV0bztib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3JkZXItcmFkaXVzOjAhaW1wb3J0YW50O21hcmdpbjowIWltcG9ydGFudDttaW4td2lkdGg6MTAwJSFpbXBvcnRhbnQ7d2lkdGg6YXV0byFpbXBvcnRhbnQ7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5kcm9wZG93biAuc2Nyb2xsaW5nLm1lbnU+Lml0ZW0uaXRlbS5pdGVtLC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnUgLml0ZW0uaXRlbS5pdGVte2JvcmRlci10b3A6bm9uZX0udWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51IC5pdGVtOmZpcnN0LWNoaWxkLC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnUgLml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDpub25lfS51aS5kcm9wZG93bj4uYW5pbWF0aW5nLm1lbnUgLnNjcm9sbGluZy5tZW51LC51aS5kcm9wZG93bj4udmlzaWJsZS5tZW51IC5zY3JvbGxpbmcubWVudXtkaXNwbGF5OmJsb2NrfUBtZWRpYSBhbGwgYW5kICgtbXMtaGlnaC1jb250cmFzdDpub25lKXsudWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51LC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7bWluLXdpZHRoOmNhbGMoMTAwJSAtIDE3cHgpfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5kcm9wZG93biAuc2Nyb2xsaW5nLm1lbnUsLnVpLnNjcm9sbGluZy5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjEwLjI4NTcxNDI5cmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpey51aS5kcm9wZG93biAuc2Nyb2xsaW5nLm1lbnUsLnVpLnNjcm9sbGluZy5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjE1LjQyODU3MTQzcmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5kcm9wZG93biAuc2Nyb2xsaW5nLm1lbnUsLnVpLnNjcm9sbGluZy5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjIwLjU3MTQyODU3cmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51LC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoyMC41NzE0Mjg1N3JlbX19LnVpLnNpbXBsZS5kcm9wZG93biAubWVudTphZnRlciwudWkuc2ltcGxlLmRyb3Bkb3duIC5tZW51OmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLnNpbXBsZS5kcm9wZG93biAubWVudXtwb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjt0b3A6LTk5OTlweCFpbXBvcnRhbnQ7b3BhY2l0eTowO3dpZHRoOjA7aGVpZ2h0OjA7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlfS51aS5zaW1wbGUuYWN0aXZlLmRyb3Bkb3duLC51aS5zaW1wbGUuZHJvcGRvd246aG92ZXJ7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowIWltcG9ydGFudDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowIWltcG9ydGFudH0udWkuc2ltcGxlLmFjdGl2ZS5kcm9wZG93bj4ubWVudSwudWkuc2ltcGxlLmRyb3Bkb3duOmhvdmVyPi5tZW51e292ZXJmbG93OnZpc2libGU7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzt0b3A6MTAwJSFpbXBvcnRhbnQ7b3BhY2l0eToxfS51aS5zaW1wbGUuZHJvcGRvd246aG92ZXI+Lm1lbnU+Lml0ZW06aG92ZXI+Lm1lbnUsLnVpLnNpbXBsZS5kcm9wZG93bj4ubWVudT4uaXRlbTphY3RpdmU+Lm1lbnV7b3ZlcmZsb3c6dmlzaWJsZTt3aWR0aDphdXRvO2hlaWdodDphdXRvO3RvcDowIWltcG9ydGFudDtsZWZ0OjEwMCUhaW1wb3J0YW50O29wYWNpdHk6MX0udWkuc2ltcGxlLmRpc2FibGVkLmRyb3Bkb3duOmhvdmVyIC5tZW51e2Rpc3BsYXk6bm9uZTtoZWlnaHQ6MDt3aWR0aDowO292ZXJmbG93OmhpZGRlbn0udWkuc2ltcGxlLnZpc2libGUuZHJvcGRvd24+Lm1lbnV7ZGlzcGxheTpibG9ja30udWkuZmx1aWQuZHJvcGRvd257ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi13aWR0aDowfS51aS5mbHVpZC5kcm9wZG93bj4uZHJvcGRvd24uaWNvbntmbG9hdDpyaWdodH0udWkuZmxvYXRpbmcuZHJvcGRvd24gLm1lbnV7bGVmdDowO3JpZ2h0OmF1dG87LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpIWltcG9ydGFudDtib3gtc2hhZG93OjAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpIWltcG9ydGFudDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSFpbXBvcnRhbnR9LnVpLmZsb2F0aW5nLmRyb3Bkb3duPi5tZW51e21hcmdpbi10b3A6LjVlbSFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS5wb2ludGluZy5kcm9wZG93bj4ubWVudXt0b3A6MTAwJTttYXJnaW4tdG9wOi43ODU3MTQyOXJlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czpub25lO2NvbnRlbnQ6Jyc7dmlzaWJpbGl0eTp2aXNpYmxlOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7d2lkdGg6LjVlbTtoZWlnaHQ6LjVlbTstd2Via2l0LWJveC1zaGFkb3c6LTFweCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtiYWNrZ3JvdW5kOiNmZmY7ei1pbmRleDoyfS51aS5wb2ludGluZy5kcm9wZG93bj4ubWVudTphZnRlcnt0b3A6LS4yNWVtO2xlZnQ6NTAlO21hcmdpbjowIDAgMCAtLjI1ZW19LnVpLnRvcC5sZWZ0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51e3RvcDoxMDAlO2JvdHRvbTphdXRvO2xlZnQ6MDtyaWdodDphdXRvO21hcmdpbjoxZW0gMCAwfS51aS50b3AubGVmdC5wb2ludGluZy5kcm9wZG93bj4ubWVudXt0b3A6MTAwJTtib3R0b206YXV0bztsZWZ0OjA7cmlnaHQ6YXV0bzttYXJnaW46MWVtIDAgMH0udWkudG9wLmxlZnQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7dG9wOi0uMjVlbTtsZWZ0OjFlbTtyaWdodDphdXRvO21hcmdpbjowOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LnVpLnRvcC5yaWdodC5wb2ludGluZy5kcm9wZG93bj4ubWVudXt0b3A6MTAwJTtib3R0b206YXV0bztyaWdodDowO2xlZnQ6YXV0bzttYXJnaW46MWVtIDAgMH0udWkudG9wLnBvaW50aW5nLmRyb3Bkb3duPi5sZWZ0Lm1lbnU6YWZ0ZXIsLnVpLnRvcC5yaWdodC5wb2ludGluZy5kcm9wZG93bj4ubWVudTphZnRlcnt0b3A6LS4yNWVtO2xlZnQ6YXV0byFpbXBvcnRhbnQ7cmlnaHQ6MWVtIWltcG9ydGFudDttYXJnaW46MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS51aS5sZWZ0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51e3RvcDowO2xlZnQ6MTAwJTtyaWdodDphdXRvO21hcmdpbjowIDAgMCAxZW19LnVpLmxlZnQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7dG9wOjFlbTtsZWZ0Oi0uMjVlbTttYXJnaW46MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC00NWRlZyl9LnVpLmxlZnQ6bm90KC50b3ApOm5vdCguYm90dG9tKS5wb2ludGluZy5kcm9wZG93bj4ubGVmdC5tZW51e2xlZnQ6YXV0byFpbXBvcnRhbnQ7cmlnaHQ6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luOjAgMWVtIDAgMH0udWkubGVmdDpub3QoLnRvcCk6bm90KC5ib3R0b20pLnBvaW50aW5nLmRyb3Bkb3duPi5sZWZ0Lm1lbnU6YWZ0ZXJ7dG9wOjFlbTtsZWZ0OmF1dG87cmlnaHQ6LS4yNWVtO21hcmdpbjowOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxMzVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTM1ZGVnKX0udWkucmlnaHQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnV7dG9wOjA7bGVmdDphdXRvO3JpZ2h0OjEwMCU7bWFyZ2luOjAgMWVtIDAgMH0udWkucmlnaHQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7dG9wOjFlbTtsZWZ0OmF1dG87cmlnaHQ6LS4yNWVtO21hcmdpbjowOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgxMzVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMTM1ZGVnKX0udWkuYm90dG9tLnBvaW50aW5nLmRyb3Bkb3duPi5tZW51e3RvcDphdXRvO2JvdHRvbToxMDAlO2xlZnQ6MDtyaWdodDphdXRvO21hcmdpbjowIDAgMWVtfS51aS5ib3R0b20ucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7dG9wOmF1dG87Ym90dG9tOi0uMjVlbTtyaWdodDphdXRvO21hcmdpbjowOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKC0xMzVkZWcpfS51aS5ib3R0b20ucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnUgLm1lbnV7dG9wOmF1dG8haW1wb3J0YW50O2JvdHRvbTowIWltcG9ydGFudH0udWkuYm90dG9tLmxlZnQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnV7bGVmdDowO3JpZ2h0OmF1dG99LnVpLmJvdHRvbS5sZWZ0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye2xlZnQ6MWVtO3JpZ2h0OmF1dG99LnVpLmJvdHRvbS5yaWdodC5wb2ludGluZy5kcm9wZG93bj4ubWVudXtyaWdodDowO2xlZnQ6YXV0b30udWkuYm90dG9tLnJpZ2h0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye2xlZnQ6YXV0bztyaWdodDoxZW19LnVpLnBvaW50aW5nLnVwd2FyZC5kcm9wZG93biAubWVudSwudWkudG9wLnBvaW50aW5nLnVwd2FyZC5kcm9wZG93biAubWVudXt0b3A6YXV0byFpbXBvcnRhbnQ7Ym90dG9tOjEwMCUhaW1wb3J0YW50O21hcmdpbjowIDAgLjc4NTcxNDI5cmVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS5wb2ludGluZy51cHdhcmQuZHJvcGRvd24gLm1lbnU6YWZ0ZXIsLnVpLnRvcC5wb2ludGluZy51cHdhcmQuZHJvcGRvd24gLm1lbnU6YWZ0ZXJ7dG9wOjEwMCUhaW1wb3J0YW50O2JvdHRvbTphdXRvIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MXB4IDFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MXB4IDFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO21hcmdpbjotLjI1ZW0gMCAwfS51aS5yaWdodC5wb2ludGluZy51cHdhcmQuZHJvcGRvd246bm90KC50b3ApOm5vdCguYm90dG9tKSAubWVudXt0b3A6YXV0byFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O21hcmdpbjowIDFlbSAwIDB9LnVpLnJpZ2h0LnBvaW50aW5nLnVwd2FyZC5kcm9wZG93bjpub3QoLnRvcCk6bm90KC5ib3R0b20pIC5tZW51OmFmdGVye3RvcDphdXRvIWltcG9ydGFudDtib3R0b206MCFpbXBvcnRhbnQ7bWFyZ2luOjAgMCAxZW0gMDstd2Via2l0LWJveC1zaGFkb3c6LTFweCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkubGVmdC5wb2ludGluZy51cHdhcmQuZHJvcGRvd246bm90KC50b3ApOm5vdCguYm90dG9tKSAubWVudXt0b3A6YXV0byFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O21hcmdpbjowIDAgMCAxZW19LnVpLmxlZnQucG9pbnRpbmcudXB3YXJkLmRyb3Bkb3duOm5vdCgudG9wKTpub3QoLmJvdHRvbSkgLm1lbnU6YWZ0ZXJ7dG9wOmF1dG8haW1wb3J0YW50O2JvdHRvbTowIWltcG9ydGFudDttYXJnaW46MCAwIDFlbSAwOy13ZWJraXQtYm94LXNoYWRvdzotMXB4IC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6RHJvcGRvd247c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUmdBQkFBQUFBQVZnQUE4QUFBQUFDRkFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkdSbFJOQUFBQldBQUFBQndBQUFBY2hHZ2FxMGRFUlVZQUFBRjBBQUFBSEFBQUFCNEFKd0FQVDFNdk1nQUFBWkFBQUFCREFBQUFWblc0VEpkamJXRndBQUFCMUFBQUFFc0FBQUZTOENjYXFtTjJkQ0FBQUFJZ0FBQUFCQUFBQUFRQUVRRkVaMkZ6Y0FBQUFpUUFBQUFJQUFBQUNQLy9BQU5uYkhsbUFBQUNMQUFBQVFvQUFBR2tyUkhQOVdobFlXUUFBQU00QUFBQU1BQUFBRFlQSzhZeWFHaGxZUUFBQTJnQUFBQWRBQUFBSkFOQ0FiMW9iWFI0QUFBRGlBQUFBQ0lBQUFBaUNCa0FPR3h2WTJFQUFBT3NBQUFBRkFBQUFCUUJuQUl5YldGNGNBQUFBOEFBQUFBZkFBQUFJQUVWQUY1dVlXMWxBQUFENEFBQUFUQUFBQUtNRkdsajVIQnZjM1FBQUFVUUFBQUFSZ0FBQUhKb2VkanFkMlZpWmdBQUJWZ0FBQUFHQUFBQUJyTzdXNVVBQUFBQkFBQUFBTlh1bFBVQUFBQUExcjRoZ0FBQUFBRFh1MlExZU5wallHUmdZT0FCWWpFZ1ptSmdCRUlPSUdZQjh4Z0FBL1lBTjNqYVkyQmt0R09jd01ES3dNSTRqVEdOZ1lIQkhVcC9aWkJrYUdGZ1lHSmdaV2JBQ2dMU1hGTVlIRlQvZkxqRmVPRC9BUVk5eGpNTWJrQmhScEFjQU40OERRWUFlTnBqWUdCZ1pvQmdHUVpHQmhEd0FmSVl3WHdXQmdNZ3pRR0VUQXdNcW44KzhINjQ5ZjgvbEhYOS8vOWI3UHpmK2ZXZ3VzQ0FrWTBCem1VRTZnSHBRd0dNRE1NZUFBQ2J4ZzdTQUFBUkFVUUFBQUFCLy84QUFuamFkWkJQU3NOQUdNWGZTK3lNcVlnT2hwU3VTbEthZG1VaGlWRWhFTVF6RkYyMm0xN0JiYnZ6Q2g1QlhDVW42RUc4Z2plUTREZXB3WW80aSsvZmZMOTVqNEVEQStDRkM3alF1S3lJZVZIckkzd2tsZXE5RjdYclNJbkt0ZU9lSGRkYThiT29hZWVwU2MwME5XUHovTFJlYzlHOEdhYnlHdEVkRjdoMTl6MDMzR0FNVEs3emJNNDJ4TkVacHpZb2YwUnRRNUNVSEFRSjczT3RWeXV0YyszYjdPdS8vYjhYTmxzUHgzamdqVWlmQUJkaEVvaEtKSkw1aU01cDM5dXFjN1gxK3NSUVNxbUdyVVZobHNKNGxwbUVVVnd5VDhTVVl0ZzBQOUR5TnpQQUREcyt0anJHVjZLUkNSZnN1aTNlSGNMNC9wOFpYdmZNbGNuRVUrQ0x2N2hEeWtPUCtBS1RQVHhiQUFCNDJtTmdaR0JnQUdLdWY1S1A0dmx0dmpMSU16R0F3TFY5aWcwZyt2cnVGRk1RemRqQUNPSnpNSUNsQVJoMENUSjQybU5nWkdCZ1BQRC9BSkQ4d2dBRWpBME1qQXlvZ0FNQWJPUUVBUUFBQUFDN0FCRUFBQUFBQUtvQUFBSDBBQUFCZ0FBQUFVQUFDQUZBQUFnQXdBQVhBQUFBQUFBQUFDb0FLZ0FxQURJQWJBQ0dBS0FBdWdEU2VOcGpZR1JnWU9Ca1VHRmdZZ0FCRU1rRmhBd00veG4wUUFJQURkVUJkQUI0MnFXUXZVb0RRUlNGdjNHamFJU1VRYXltU21HeEpvR0FzUkMwaVBZTHNVNTBZNkl4cnZsUnRQQ0pKS1VQSUJiK1BJSHY0RU40ZGpLdUtBcUNESGZtdStmZU9kd1pvTUNVQUpOYkFsWVVNemFVbE0xNGpqeGJuZ09xN0huT2lhODl6MVBrMXZNQ2E5eDd6dFBremZNeUpiUGorWkdpNlhwK29teHVQRCt6YUQ3bWVhRmc3bWI4R3JCcUhtaHd4b0F4bG0wdWlSa3BQOVg1bTI2cEtSb014VEdSMUQ0OUR2L1liLzkxbzZsOHFMNmV1NW4yaFpRem42OHV0UjltM0ZVMmNCNHQ5Y2RTTEcydXRJKzQ0RWgvUDlicUtPK29KL1d4bVhzc2o3N1lrcmphc1pRRDZTRmRkeXRoazNXdHpyZitVRjJwMDc2VWRsYTFWTnpzRVJQM2tralZSS2VsN21wMXVkWFljSHRaU2xWN1JmbUplMUdpRld2ZWx1YWVLRDUvTXVKY1NrOFRwbS92dndQSWJtSmxlTnBqWUdLQUFGWUc3SUNUZ1lHUmlaR1prWVdSbFpHTmtaMlJnNUdUTFQybnNpRERFRUlac1pmbVpScVp1am1EYURjREF4Y0k3V0lPcFMyZ3RDV1VkZ1FBWmtjU21RQUFBQUZibGJPNkFBQT0pIGZvcm1hdCgnd29mZicpO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbH0udWkuZHJvcGRvd24+LmRyb3Bkb3duLmljb257Zm9udC1mYW1pbHk6RHJvcGRvd247bGluZS1oZWlnaHQ6MTtoZWlnaHQ6MWVtO3dpZHRoOjEuMjNlbTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcn0udWkuZHJvcGRvd24+LmRyb3Bkb3duLmljb257d2lkdGg6YXV0b30udWkuZHJvcGRvd24+LmRyb3Bkb3duLmljb246YmVmb3Jle2NvbnRlbnQ6J1xcXFxmMGQ3J30udWkuZHJvcGRvd24gLm1lbnUgLml0ZW0gLmRyb3Bkb3duLmljb246YmVmb3Jle2NvbnRlbnQ6J1xcXFxmMGRhJ30udWkuZHJvcGRvd24gLml0ZW0gLmxlZnQuZHJvcGRvd24uaWNvbjpiZWZvcmUsLnVpLmRyb3Bkb3duIC5sZWZ0Lm1lbnUgLml0ZW0gLmRyb3Bkb3duLmljb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQ5XFxcIn0udWkudmVydGljYWwubWVudSAuZHJvcGRvd24uaXRlbT4uZHJvcGRvd24uaWNvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZGFcXFwifS51aS5kcm9wZG93bj4uY2xlYXIuaWNvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGRcXFwifS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBWaWRlb1xcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmVtYmVke3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlO2hlaWdodDowO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOiNkY2RkZGU7cGFkZGluZy1ib3R0b206NTYuMjUlfS51aS5lbWJlZCBlbWJlZCwudWkuZW1iZWQgaWZyYW1lLC51aS5lbWJlZCBvYmplY3R7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOm5vbmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7cGFkZGluZzowfS51aS5lbWJlZD4uZW1iZWR7ZGlzcGxheTpub25lfS51aS5lbWJlZD4ucGxhY2Vob2xkZXJ7cG9zaXRpb246YWJzb2x1dGU7Y3Vyc29yOnBvaW50ZXI7dG9wOjA7bGVmdDowO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOnJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCA0NSUscmdiYSgwLDAsMCwuMykpfS51aS5lbWJlZD4uaWNvbntjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjJ9LnVpLmVtYmVkPi5pY29uOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6Mztjb250ZW50OicnO2JhY2tncm91bmQ6LXdlYmtpdC1yYWRpYWwtZ3JhZGllbnQodHJhbnNwYXJlbnQgNDUlLHJnYmEoMCwwLDAsLjMpKTtiYWNrZ3JvdW5kOnJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCA0NSUscmdiYSgwLDAsMCwuMykpO29wYWNpdHk6LjU7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlfS51aS5lbWJlZD4uaWNvbjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTt6LWluZGV4OjQ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7Y29sb3I6I2ZmZjtmb250LXNpemU6NnJlbTt0ZXh0LXNoYWRvdzowIDJweCAxMHB4IHJnYmEoMzQsMzYsMzgsLjIpOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlLGNvbG9yIC41cyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZSxjb2xvciAuNXMgZWFzZTt6LWluZGV4OjEwfS51aS5lbWJlZCAuaWNvbjpob3ZlcjphZnRlcntiYWNrZ3JvdW5kOi13ZWJraXQtcmFkaWFsLWdyYWRpZW50KHRyYW5zcGFyZW50IDQ1JSxyZ2JhKDAsMCwwLC4zKSk7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQodHJhbnNwYXJlbnQgNDUlLHJnYmEoMCwwLDAsLjMpKTtvcGFjaXR5OjF9LnVpLmVtYmVkIC5pY29uOmhvdmVyOmJlZm9yZXtjb2xvcjojZmZmfS51aS5hY3RpdmUuZW1iZWQ+Lmljb24sLnVpLmFjdGl2ZS5lbWJlZD4ucGxhY2Vob2xkZXJ7ZGlzcGxheTpub25lfS51aS5hY3RpdmUuZW1iZWQ+LmVtYmVke2Rpc3BsYXk6YmxvY2t9LnVpLnNxdWFyZS5lbWJlZHtwYWRkaW5nLWJvdHRvbToxMDAlfS51aVtjbGFzcyo9XFxcIjQ6M1xcXCJdLmVtYmVke3BhZGRpbmctYm90dG9tOjc1JX0udWlbY2xhc3MqPVxcXCIxNjo5XFxcIl0uZW1iZWR7cGFkZGluZy1ib3R0b206NTYuMjUlfS51aVtjbGFzcyo9XFxcIjIxOjlcXFwiXS5lbWJlZHtwYWRkaW5nLWJvdHRvbTo0Mi44NTcxNDI4NiV9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIE1vZGFsXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubW9kYWx7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpub25lO3otaW5kZXg6MTAwMTt0ZXh0LWFsaWduOmxlZnQ7YmFja2dyb3VuZDojZmZmO2JvcmRlcjpub25lOy13ZWJraXQtYm94LXNoYWRvdzoxcHggM3B4IDNweCAwIHJnYmEoMCwwLDAsLjIpLDFweCAzcHggMTVweCAycHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzoxcHggM3B4IDNweCAwIHJnYmEoMCwwLDAsLjIpLDFweCAzcHggMTVweCAycHggcmdiYSgwLDAsMCwuMik7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOjUwJSAyNSU7dHJhbnNmb3JtLW9yaWdpbjo1MCUgMjUlO2ZsZXg6MCAwIGF1dG87Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0Oy1tcy11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHQ7d2lsbC1jaGFuZ2U6dG9wLGxlZnQsbWFyZ2luLHRyYW5zZm9ybSxvcGFjaXR5fS51aS5tb2RhbD4uaWNvbjpmaXJzdC1jaGlsZCsqLC51aS5tb2RhbD46Zmlyc3QtY2hpbGQ6bm90KC5pY29uKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLm1vZGFsPjpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkubW9kYWw+LmNsb3Nle2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMi41cmVtO3JpZ2h0Oi0yLjVyZW07ei1pbmRleDoxO29wYWNpdHk6Ljg7Zm9udC1zaXplOjEuMjVlbTtjb2xvcjojZmZmO3dpZHRoOjIuMjVyZW07aGVpZ2h0OjIuMjVyZW07cGFkZGluZzouNjI1cmVtIDAgMCAwfS51aS5tb2RhbD4uY2xvc2U6aG92ZXJ7b3BhY2l0eToxfS51aS5tb2RhbD4uaGVhZGVye2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6I2ZmZjttYXJnaW46MDtwYWRkaW5nOjEuMjVyZW0gMS41cmVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC44NSk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5tb2RhbD4uaGVhZGVyOm5vdCgudWkpe2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtO2xpbmUtaGVpZ2h0OjEuMjg1NzE0MjllbTtmb250LXdlaWdodDo3MDB9LnVpLm1vZGFsPi5jb250ZW50e2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtmb250LXNpemU6MWVtO2xpbmUtaGVpZ2h0OjEuNDtwYWRkaW5nOjEuNXJlbTtiYWNrZ3JvdW5kOiNmZmZ9LnVpLm1vZGFsPi5pbWFnZS5jb250ZW50e2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpyb3d9LnVpLm1vZGFsPi5jb250ZW50Pi5pbWFnZXtkaXNwbGF5OmJsb2NrO2ZsZXg6MCAxIGF1dG87d2lkdGg6Jyc7YWxpZ24tc2VsZjp0b3B9LnVpLm1vZGFsPltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl17YWxpZ24tc2VsZjp0b3B9LnVpLm1vZGFsPltjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl17YWxpZ24tc2VsZjptaWRkbGV9LnVpLm1vZGFsPltjbGFzcyo9c3RyZXRjaGVkXXthbGlnbi1zZWxmOnN0cmV0Y2h9LnVpLm1vZGFsPi5jb250ZW50Pi5kZXNjcmlwdGlvbntkaXNwbGF5OmJsb2NrO2ZsZXg6MSAwIGF1dG87bWluLXdpZHRoOjA7YWxpZ24tc2VsZjp0b3B9LnVpLm1vZGFsPi5jb250ZW50Pi5pY29uKy5kZXNjcmlwdGlvbiwudWkubW9kYWw+LmNvbnRlbnQ+LmltYWdlKy5kZXNjcmlwdGlvbntmbGV4OjAgMSBhdXRvO21pbi13aWR0aDonJzt3aWR0aDphdXRvO3BhZGRpbmctbGVmdDoyZW19LnVpLm1vZGFsPi5jb250ZW50Pi5pbWFnZT5pLmljb257bWFyZ2luOjA7b3BhY2l0eToxO3dpZHRoOmF1dG87bGluZS1oZWlnaHQ6MTtmb250LXNpemU6OHJlbX0udWkubW9kYWw+LmFjdGlvbnN7YmFja2dyb3VuZDojZjlmYWZiO3BhZGRpbmc6MXJlbSAxcmVtO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTt0ZXh0LWFsaWduOnJpZ2h0fS51aS5tb2RhbCAuYWN0aW9ucz4uYnV0dG9ue21hcmdpbi1sZWZ0Oi43NWVtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLm1vZGFse3dpZHRoOjk1JTttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KXsudWkubW9kYWx7d2lkdGg6ODglO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5tb2RhbHt3aWR0aDo4NTBweDttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEyMDBweCl7LnVpLm1vZGFse3dpZHRoOjkwMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkubW9kYWx7d2lkdGg6OTUwcHg7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo5OTFweCl7LnVpLm1vZGFsPi5oZWFkZXJ7cGFkZGluZy1yaWdodDoyLjI1cmVtfS51aS5tb2RhbD4uY2xvc2V7dG9wOjEuMDUzNXJlbTtyaWdodDoxcmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkubW9kYWw+LmhlYWRlcntwYWRkaW5nOi43NXJlbSAxcmVtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjIuMjVyZW0haW1wb3J0YW50fS51aS5tb2RhbD4uY29udGVudHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MXJlbSFpbXBvcnRhbnR9LnVpLm1vZGFsPi5jbG9zZXt0b3A6LjVyZW0haW1wb3J0YW50O3JpZ2h0Oi41cmVtIWltcG9ydGFudH0udWkubW9kYWwgLmltYWdlLmNvbnRlbnR7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS51aS5tb2RhbCAuY29udGVudD4uaW1hZ2V7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJTttYXJnaW46MCBhdXRvIWltcG9ydGFudDt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjAgMCAxcmVtIWltcG9ydGFudH0udWkubW9kYWw+LmNvbnRlbnQ+LmltYWdlPmkuaWNvbntmb250LXNpemU6NXJlbTt0ZXh0LWFsaWduOmNlbnRlcn0udWkubW9kYWwgLmNvbnRlbnQ+LmRlc2NyaXB0aW9ue2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MXJlbSAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLm1vZGFsPi5hY3Rpb25ze3BhZGRpbmc6MXJlbSAxcmVtIDAhaW1wb3J0YW50fS51aS5tb2RhbCAuYWN0aW9ucz4uYnV0dG9uLC51aS5tb2RhbCAuYWN0aW9ucz4uYnV0dG9uc3ttYXJnaW4tYm90dG9tOjFyZW19fS51aS5pbnZlcnRlZC5kaW1tZXI+LnVpLm1vZGFsey13ZWJraXQtYm94LXNoYWRvdzoxcHggM3B4IDEwcHggMnB4IHJnYmEoMCwwLDAsLjIpO2JveC1zaGFkb3c6MXB4IDNweCAxMHB4IDJweCByZ2JhKDAsMCwwLC4yKX0udWkuYmFzaWMubW9kYWx7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuYmFzaWMubW9kYWw+LmFjdGlvbnMsLnVpLmJhc2ljLm1vZGFsPi5jb250ZW50LC51aS5iYXNpYy5tb2RhbD4uaGVhZGVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLmJhc2ljLm1vZGFsPi5oZWFkZXJ7Y29sb3I6I2ZmZn0udWkuYmFzaWMubW9kYWw+LmNsb3Nle3RvcDoxcmVtO3JpZ2h0OjEuNXJlbX0udWkuaW52ZXJ0ZWQuZGltbWVyPi5iYXNpYy5tb2RhbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmludmVydGVkLmRpbW1lcj4udWkuYmFzaWMubW9kYWw+LmhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLmxlZ2FjeS5tb2RhbCwudWkubGVnYWN5LnBhZ2UuZGltbWVyPi51aS5tb2RhbHt0b3A6NTAlO2xlZnQ6NTAlfS51aS5sZWdhY3kucGFnZS5kaW1tZXI+LnVpLnNjcm9sbGluZy5tb2RhbCwudWkucGFnZS5kaW1tZXI+LnVpLnNjcm9sbGluZy5sZWdhY3kubW9kYWwsLnVpLnRvcC5hbGlnbmVkLmRpbW1lcj4udWkubGVnYWN5Lm1vZGFsLC51aS50b3AuYWxpZ25lZC5sZWdhY3kucGFnZS5kaW1tZXI+LnVpLm1vZGFse3RvcDphdXRvfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo5OTFweCl7LnVpLmJhc2ljLm1vZGFsPi5jbG9zZXtjb2xvcjojZmZmfX0udWkubG9hZGluZy5tb2RhbHtkaXNwbGF5OmJsb2NrO3Zpc2liaWxpdHk6aGlkZGVuO3otaW5kZXg6LTF9LnVpLmFjdGl2ZS5tb2RhbHtkaXNwbGF5OmJsb2NrfS5tb2RhbHMuZGltbWVyW2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXSAubW9kYWx7bWFyZ2luOjV2aCBhdXRvfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7Lm1vZGFscy5kaW1tZXJbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdIC5tb2RhbHttYXJnaW46MXJlbSBhdXRvfX0ubGVnYWN5Lm1vZGFscy5kaW1tZXJbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJde3BhZGRpbmctdG9wOjV2aH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey5sZWdhY3kubW9kYWxzLmRpbW1lcltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl17cGFkZGluZy10b3A6MXJlbX19LnNjcm9sbGluZy5kaW1tYWJsZS5kaW1tZWR7b3ZlcmZsb3c6aGlkZGVufS5zY3JvbGxpbmcuZGltbWFibGU+LmRpbW1lcntqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uc2Nyb2xsaW5nLmRpbW1hYmxlLmRpbW1lZD4uZGltbWVye292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnNjcm9sbGluZy5kaW1tYWJsZT4uZGltbWVye3Bvc2l0aW9uOmZpeGVkfS5tb2RhbHMuZGltbWVyIC51aS5zY3JvbGxpbmcubW9kYWx7bWFyZ2luOjFyZW0gYXV0b30uc2Nyb2xsaW5nLnVuZGV0YWNoZWQuZGltbWFibGUuZGltbWVke292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnNjcm9sbGluZy51bmRldGFjaGVkLmRpbW1hYmxlLmRpbW1lZD4uZGltbWVye292ZXJmbG93OmhpZGRlbn0uc2Nyb2xsaW5nLnVuZGV0YWNoZWQuZGltbWFibGUgLnVpLnNjcm9sbGluZy5tb2RhbHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTttYXJnaW4tdG9wOjFyZW0haW1wb3J0YW50fS51aS5tb2RhbCAuc2Nyb2xsaW5nLmNvbnRlbnR7bWF4LWhlaWdodDpjYWxjKDcwdmgpO292ZXJmbG93OmF1dG99LnVpLmZ1bGxzY3JlZW4ubW9kYWx7d2lkdGg6OTUlIWltcG9ydGFudDtsZWZ0OjAhaW1wb3J0YW50O21hcmdpbjoxZW0gYXV0b30udWkuZnVsbHNjcmVlbi5zY3JvbGxpbmcubW9kYWx7bGVmdDowIWltcG9ydGFudH0udWkuZnVsbHNjcmVlbi5tb2RhbD4uaGVhZGVye3BhZGRpbmctcmlnaHQ6Mi4yNXJlbX0udWkuZnVsbHNjcmVlbi5tb2RhbD4uY2xvc2V7dG9wOjEuMDUzNXJlbTtyaWdodDoxcmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkubW9kYWx7Zm9udC1zaXplOjFyZW19LnVpLm1pbmkubW9kYWw+LmhlYWRlcjpub3QoLnVpKXtmb250LXNpemU6MS4zZW19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkubWluaS5tb2RhbHt3aWR0aDo5NSU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLm1pbmkubW9kYWx7d2lkdGg6MzUuMiU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo5OTJweCl7LnVpLm1pbmkubW9kYWx7d2lkdGg6MzQwcHg7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMjAwcHgpey51aS5taW5pLm1vZGFse3dpZHRoOjM2MHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkubWluaS5tb2RhbHt3aWR0aDozODBweDttYXJnaW46MH19LnVpLnNtYWxsLm1vZGFsPi5oZWFkZXI6bm90KC51aSl7Zm9udC1zaXplOjEuM2VtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnRpbnkubW9kYWx7d2lkdGg6OTUlO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpey51aS50aW55Lm1vZGFse3dpZHRoOjUyLjglO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS50aW55Lm1vZGFse3dpZHRoOjUxMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KXsudWkudGlueS5tb2RhbHt3aWR0aDo1NDBweDttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnRpbnkubW9kYWx7d2lkdGg6NTcwcHg7bWFyZ2luOjB9fS51aS5zbWFsbC5tb2RhbD4uaGVhZGVyOm5vdCgudWkpe2ZvbnQtc2l6ZToxLjNlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5zbWFsbC5tb2RhbHt3aWR0aDo5NSU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLnNtYWxsLm1vZGFse3dpZHRoOjcwLjQlO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5zbWFsbC5tb2RhbHt3aWR0aDo2ODBweDttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEyMDBweCl7LnVpLnNtYWxsLm1vZGFse3dpZHRoOjcyMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkuc21hbGwubW9kYWx7d2lkdGg6NzYwcHg7bWFyZ2luOjB9fS51aS5sYXJnZS5tb2RhbD4uaGVhZGVye2ZvbnQtc2l6ZToxLjZlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5sYXJnZS5tb2RhbHt3aWR0aDo5NSU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLmxhcmdlLm1vZGFse3dpZHRoOjg4JTttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjk5MnB4KXsudWkubGFyZ2UubW9kYWx7d2lkdGg6MTAyMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KXsudWkubGFyZ2UubW9kYWx7d2lkdGg6MTA4MHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkubGFyZ2UubW9kYWx7d2lkdGg6MTE0MHB4O21hcmdpbjowfX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTmFnXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubmFne2Rpc3BsYXk6bm9uZTtvcGFjaXR5Oi45NTtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDtsZWZ0OjA7ei1pbmRleDo5OTk7bWluLWhlaWdodDowO3dpZHRoOjEwMCU7bWFyZ2luOjA7cGFkZGluZzouNzVlbSAxZW07YmFja2dyb3VuZDojNTU1Oy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDAsMCwwLC4yKTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMCwwLDAsLjIpO2ZvbnQtc2l6ZToxcmVtO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtOy13ZWJraXQtdHJhbnNpdGlvbjouMnMgYmFja2dyb3VuZCBlYXNlO3RyYW5zaXRpb246LjJzIGJhY2tncm91bmQgZWFzZX1hLnVpLm5hZ3tjdXJzb3I6cG9pbnRlcn0udWkubmFnPi50aXRsZXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAuNWVtO2NvbG9yOiNmZmZ9LnVpLm5hZz4uY2xvc2UuaWNvbntjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi40O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MWVtO2ZvbnQtc2l6ZToxZW07bWFyZ2luOi0uNWVtIDAgMDtjb2xvcjojZmZmOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4ycyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgZWFzZX0udWkubmFnOmhvdmVye2JhY2tncm91bmQ6IzU1NTtvcGFjaXR5OjF9LnVpLm5hZyAuY2xvc2U6aG92ZXJ7b3BhY2l0eToxfS51aS5vdmVybGF5Lm5hZ3twb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrfS51aS5maXhlZC5uYWd7cG9zaXRpb246Zml4ZWR9LnVpLmJvdHRvbS5uYWcsLnVpLmJvdHRvbS5uYWdze2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDA7dG9wOmF1dG87Ym90dG9tOjB9LnVpLmludmVydGVkLm5hZywudWkuaW52ZXJ0ZWQubmFncyAubmFne2JhY2tncm91bmQtY29sb3I6I2YzZjRmNTtjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLmludmVydGVkLm5hZyAuY2xvc2UsLnVpLmludmVydGVkLm5hZyAudGl0bGUsLnVpLmludmVydGVkLm5hZ3MgLm5hZyAuY2xvc2UsLnVpLmludmVydGVkLm5hZ3MgLm5hZyAudGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLm5hZ3MgLm5hZ3tib3JkZXItcmFkaXVzOjAhaW1wb3J0YW50fS51aS5uYWdzIC5uYWc6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5ib3R0b20ubmFncyAubmFnOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gUG9wdXBcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5wb3B1cHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDttaW4td2lkdGg6LXdlYmtpdC1taW4tY29udGVudDttaW4td2lkdGg6bWluLWNvbnRlbnQ7ei1pbmRleDoxOTAwO2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNTtsaW5lLWhlaWdodDoxLjQyODVlbTttYXgtd2lkdGg6MjUwcHg7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6LjgzM2VtIDFlbTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5wb3B1cD4uaGVhZGVye3BhZGRpbmc6MDtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEuMTQyODU3MTRlbTtsaW5lLWhlaWdodDoxLjI7Zm9udC13ZWlnaHQ6NzAwfS51aS5wb3B1cD4uaGVhZGVyKy5jb250ZW50e3BhZGRpbmctdG9wOi41ZW19LnVpLnBvcHVwOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3dpZHRoOi43MTQyODU3MWVtO2hlaWdodDouNzE0Mjg1NzFlbTtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt6LWluZGV4OjI7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAxcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzoxcHggMXB4IDAgMCAjYmFiYWJjfVtkYXRhLXRvb2x0aXBde3Bvc2l0aW9uOnJlbGF0aXZlfVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7Zm9udC1zaXplOjFyZW07d2lkdGg6LjcxNDI4NTcxZW07aGVpZ2h0Oi43MTQyODU3MWVtO2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3otaW5kZXg6Mjstd2Via2l0LWJveC1zaGFkb3c6MXB4IDFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93OjFweCAxcHggMCAwICNiYWJhYmN9W2RhdGEtdG9vbHRpcF06YWZ0ZXJ7cG9pbnRlci1ldmVudHM6bm9uZTtjb250ZW50OmF0dHIoZGF0YS10b29sdGlwKTtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtYWxpZ246bGVmdDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjFyZW07Ym9yZGVyOjFweCBzb2xpZCAjZDRkNGQ1O2xpbmUtaGVpZ2h0OjEuNDI4NWVtO21heC13aWR0aDpub25lO2JhY2tncm91bmQ6I2ZmZjtwYWRkaW5nOi44MzNlbSAxZW07Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTt6LWluZGV4OjF9W2RhdGEtdG9vbHRpcF06bm90KFtkYXRhLXBvc2l0aW9uXSk6YmVmb3Jle3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjEwMCU7bGVmdDo1MCU7YmFja2dyb3VuZDojZmZmO21hcmdpbi1sZWZ0Oi0uMDcxNDI4NTdyZW07bWFyZ2luLWJvdHRvbTouMTQyODU3MTRyZW19W2RhdGEtdG9vbHRpcF06bm90KFtkYXRhLXBvc2l0aW9uXSk6YWZ0ZXJ7bGVmdDo1MCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtib3R0b206MTAwJTttYXJnaW4tYm90dG9tOi41ZW19W2RhdGEtdG9vbHRpcF06YWZ0ZXIsW2RhdGEtdG9vbHRpcF06YmVmb3Jle3BvaW50ZXItZXZlbnRzOm5vbmU7dmlzaWJpbGl0eTpoaWRkZW59W2RhdGEtdG9vbHRpcF06YmVmb3Jle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpIHNjYWxlKDApIWltcG9ydGFudDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKSBzY2FsZSgwKSFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciB0b3A7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjFzIGVhc2U7dHJhbnNpdGlvbjphbGwgLjFzIGVhc2V9W2RhdGEtdG9vbHRpcF06YWZ0ZXJ7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4xcyBlYXNlO3RyYW5zaXRpb246YWxsIC4xcyBlYXNlfVtkYXRhLXRvb2x0aXBdOmhvdmVyOmFmdGVyLFtkYXRhLXRvb2x0aXBdOmhvdmVyOmJlZm9yZXt2aXNpYmlsaXR5OnZpc2libGU7cG9pbnRlci1ldmVudHM6YXV0b31bZGF0YS10b29sdGlwXTpob3ZlcjpiZWZvcmV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKSBzY2FsZSgxKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZykgc2NhbGUoMSkhaW1wb3J0YW50O29wYWNpdHk6MX1bZGF0YS10b29sdGlwXTphZnRlcixbZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gY2VudGVyXFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIGNlbnRlclxcXCJdOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgc2NhbGUoMCkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHNjYWxlKDApIWltcG9ydGFudH1bZGF0YS10b29sdGlwXTpob3ZlcjphZnRlcixbZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gY2VudGVyXFxcIl06aG92ZXI6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSBzY2FsZSgxKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgc2NhbGUoMSkhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwicmlnaHQgY2VudGVyXFxcIl06YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMCkhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl06aG92ZXI6YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwicmlnaHQgY2VudGVyXFxcIl06aG92ZXI6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgxKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMSkhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImJvdHRvbSBsZWZ0XFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIHJpZ2h0XFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIGxlZnRcXFwiXTphZnRlcixbZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJ0b3AgcmlnaHRcXFwiXTphZnRlcnstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnNjYWxlKDApIWltcG9ydGFudH1bZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gbGVmdFxcXCJdOmhvdmVyOmFmdGVyLFtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImJvdHRvbSByaWdodFxcXCJdOmhvdmVyOmFmdGVyLFtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcInRvcCBsZWZ0XFxcIl06aG92ZXI6YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIHJpZ2h0XFxcIl06aG92ZXI6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSkhaW1wb3J0YW50O3RyYW5zZm9ybTpzY2FsZSgxKSFpbXBvcnRhbnR9W2RhdGEtdG9vbHRpcF1bZGF0YS1pbnZlcnRlZF06YmVmb3Jley13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtaW52ZXJ0ZWRdOmJlZm9yZXtiYWNrZ3JvdW5kOiMxYjFjMWR9W2RhdGEtdG9vbHRpcF1bZGF0YS1pbnZlcnRlZF06YWZ0ZXJ7YmFja2dyb3VuZDojMWIxYzFkO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfVtkYXRhLXRvb2x0aXBdW2RhdGEtaW52ZXJ0ZWRdOmFmdGVyIC5oZWFkZXJ7YmFja2dyb3VuZC1jb2xvcjpub25lO2NvbG9yOiNmZmZ9W2RhdGEtcG9zaXRpb249XFxcInRvcCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye3RvcDphdXRvO3JpZ2h0OmF1dG87bGVmdDo1MCU7Ym90dG9tOjEwMCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTttYXJnaW4tYm90dG9tOi41ZW19W2RhdGEtcG9zaXRpb249XFxcInRvcCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbToxMDAlO2xlZnQ6NTAlO2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tbGVmdDotLjA3MTQyODU3cmVtO21hcmdpbi1ib3R0b206LjE0Mjg1NzE0cmVtfVtkYXRhLXBvc2l0aW9uPVxcXCJ0b3AgbGVmdFxcXCJdW2RhdGEtdG9vbHRpcF06YWZ0ZXJ7dG9wOmF1dG87cmlnaHQ6YXV0bztsZWZ0OjA7Ym90dG9tOjEwMCU7bWFyZ2luLWJvdHRvbTouNWVtfVtkYXRhLXBvc2l0aW9uPVxcXCJ0b3AgbGVmdFxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjEwMCU7bGVmdDoxZW07bWFyZ2luLWxlZnQ6LS4wNzE0Mjg1N3JlbTttYXJnaW4tYm90dG9tOi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIHJpZ2h0XFxcIl1bZGF0YS10b29sdGlwXTphZnRlcnt0b3A6YXV0bztsZWZ0OmF1dG87cmlnaHQ6MDtib3R0b206MTAwJTttYXJnaW4tYm90dG9tOi41ZW19W2RhdGEtcG9zaXRpb249XFxcInRvcCByaWdodFxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle3RvcDphdXRvO2xlZnQ6YXV0bztib3R0b206MTAwJTtyaWdodDoxZW07bWFyZ2luLWxlZnQ6LS4wNzE0Mjg1N3JlbTttYXJnaW4tYm90dG9tOi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIGNlbnRlclxcXCJdW2RhdGEtdG9vbHRpcF06YWZ0ZXJ7Ym90dG9tOmF1dG87cmlnaHQ6YXV0bztsZWZ0OjUwJTt0b3A6MTAwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO21hcmdpbi10b3A6LjVlbX1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIGNlbnRlclxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle2JvdHRvbTphdXRvO3JpZ2h0OmF1dG87dG9wOjEwMCU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LS4wNzE0Mjg1N3JlbTttYXJnaW4tdG9wOi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIGxlZnRcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye2xlZnQ6MDt0b3A6MTAwJTttYXJnaW4tdG9wOi41ZW19W2RhdGEtcG9zaXRpb249XFxcImJvdHRvbSBsZWZ0XFxcIl1bZGF0YS10b29sdGlwXTpiZWZvcmV7Ym90dG9tOmF1dG87cmlnaHQ6YXV0bzt0b3A6MTAwJTtsZWZ0OjFlbTttYXJnaW4tbGVmdDotLjA3MTQyODU3cmVtO21hcmdpbi10b3A6LjE0Mjg1NzE0cmVtfVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gcmlnaHRcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye3JpZ2h0OjA7dG9wOjEwMCU7bWFyZ2luLXRvcDouNWVtfVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gcmlnaHRcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtib3R0b206YXV0bztsZWZ0OmF1dG87dG9wOjEwMCU7cmlnaHQ6MWVtO21hcmdpbi1sZWZ0Oi0uMTQyODU3MTRyZW07bWFyZ2luLXRvcDouMDcxNDI4NTdyZW19W2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTphZnRlcntyaWdodDoxMDAlO3RvcDo1MCU7bWFyZ2luLXJpZ2h0Oi41ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1bZGF0YS1wb3NpdGlvbj1cXFwibGVmdCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtyaWdodDoxMDAlO3RvcDo1MCU7bWFyZ2luLXRvcDotLjE0Mjg1NzE0cmVtO21hcmdpbi1yaWdodDotLjA3MTQyODU3cmVtfVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye2xlZnQ6MTAwJTt0b3A6NTAlO21hcmdpbi1sZWZ0Oi41ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1bZGF0YS1wb3NpdGlvbj1cXFwicmlnaHQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTpiZWZvcmV7bGVmdDoxMDAlO3RvcDo1MCU7bWFyZ2luLXRvcDotLjA3MTQyODU3cmVtO21hcmdpbi1sZWZ0Oi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbn49Ym90dG9tXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiY31bZGF0YS1wb3NpdGlvbj1cXFwibGVmdCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAtMXB4IDAgMCAjYmFiYWJjO2JveC1zaGFkb3c6MXB4IC0xcHggMCAwICNiYWJhYmN9W2RhdGEtcG9zaXRpb249XFxcInJpZ2h0IGNlbnRlclxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6LTFweCAxcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IDFweCAwIDAgI2JhYmFiY31bZGF0YS1wb3NpdGlvbn49dG9wXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9W2RhdGEtaW52ZXJ0ZWRdW2RhdGEtcG9zaXRpb25+PWJvdHRvbV1bZGF0YS10b29sdGlwXTpiZWZvcmV7YmFja2dyb3VuZDojMWIxYzFkOy13ZWJraXQtYm94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmN9W2RhdGEtaW52ZXJ0ZWRdW2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTpiZWZvcmV7YmFja2dyb3VuZDojMWIxYzFkOy13ZWJraXQtYm94LXNoYWRvdzoxcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93OjFweCAtMXB4IDAgMCAjYmFiYWJjfVtkYXRhLWludmVydGVkXVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiMxYjFjMWQ7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggMXB4IDAgMCAjYmFiYWJjO2JveC1zaGFkb3c6LTFweCAxcHggMCAwICNiYWJhYmN9W2RhdGEtaW52ZXJ0ZWRdW2RhdGEtcG9zaXRpb25+PXRvcF1bZGF0YS10b29sdGlwXTpiZWZvcmV7YmFja2dyb3VuZDojMWIxYzFkfVtkYXRhLXBvc2l0aW9ufj1ib3R0b21dW2RhdGEtdG9vbHRpcF06YmVmb3Jley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbX1bZGF0YS1wb3NpdGlvbn49Ym90dG9tXVtkYXRhLXRvb2x0aXBdOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHRvcH1bZGF0YS1wb3NpdGlvbj1cXFwibGVmdCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXJ9W2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTphZnRlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyfS51aS5wb3B1cHttYXJnaW46MH0udWkudG9wLnBvcHVwe21hcmdpbjowIDAgLjcxNDI4NTcxZW19LnVpLnRvcC5sZWZ0LnBvcHVwey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfS51aS50b3AuY2VudGVyLnBvcHVwey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbX0udWkudG9wLnJpZ2h0LnBvcHVwey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219LnVpLmxlZnQuY2VudGVyLnBvcHVwe21hcmdpbjowIC43MTQyODU3MWVtIDAgMDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgNTAlO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgNTAlfS51aS5yaWdodC5jZW50ZXIucG9wdXB7bWFyZ2luOjAgMCAwIC43MTQyODU3MWVtOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IDUwJTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgNTAlfS51aS5ib3R0b20ucG9wdXB7bWFyZ2luOi43MTQyODU3MWVtIDAgMH0udWkuYm90dG9tLmxlZnQucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgdG9wO3RyYW5zZm9ybS1vcmlnaW46bGVmdCB0b3B9LnVpLmJvdHRvbS5jZW50ZXIucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciB0b3A7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wfS51aS5ib3R0b20ucmlnaHQucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IHRvcDt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IHRvcH0udWkuYm90dG9tLmNlbnRlci5wb3B1cDpiZWZvcmV7bWFyZ2luLWxlZnQ6LS4zMDcxNDI4NmVtO3RvcDotLjMwNzE0Mjg2ZW07bGVmdDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bzstd2Via2l0LWJveC1zaGFkb3c6LTFweCAtMXB4IDAgMCAjYmFiYWJjO2JveC1zaGFkb3c6LTFweCAtMXB4IDAgMCAjYmFiYWJjfS51aS5ib3R0b20ubGVmdC5wb3B1cHttYXJnaW4tbGVmdDowfS51aS5ib3R0b20ubGVmdC5wb3B1cDpiZWZvcmV7dG9wOi0uMzA3MTQyODZlbTtsZWZ0OjFlbTtyaWdodDphdXRvO2JvdHRvbTphdXRvO21hcmdpbi1sZWZ0OjA7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiY30udWkuYm90dG9tLnJpZ2h0LnBvcHVwe21hcmdpbi1yaWdodDowfS51aS5ib3R0b20ucmlnaHQucG9wdXA6YmVmb3Jle3RvcDotLjMwNzE0Mjg2ZW07cmlnaHQ6MWVtO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzttYXJnaW4tbGVmdDowOy13ZWJraXQtYm94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmN9LnVpLnRvcC5jZW50ZXIucG9wdXA6YmVmb3Jle3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOi0uMzA3MTQyODZlbTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotLjMwNzE0Mjg2ZW19LnVpLnRvcC5sZWZ0LnBvcHVwe21hcmdpbi1sZWZ0OjB9LnVpLnRvcC5sZWZ0LnBvcHVwOmJlZm9yZXtib3R0b206LS4zMDcxNDI4NmVtO2xlZnQ6MWVtO3RvcDphdXRvO3JpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6MH0udWkudG9wLnJpZ2h0LnBvcHVwe21hcmdpbi1yaWdodDowfS51aS50b3AucmlnaHQucG9wdXA6YmVmb3Jle2JvdHRvbTotLjMwNzE0Mjg2ZW07cmlnaHQ6MWVtO3RvcDphdXRvO2xlZnQ6YXV0bzttYXJnaW4tbGVmdDowfS51aS5sZWZ0LmNlbnRlci5wb3B1cDpiZWZvcmV7dG9wOjUwJTtyaWdodDotLjMwNzE0Mjg2ZW07Ym90dG9tOmF1dG87bGVmdDphdXRvO21hcmdpbi10b3A6LS4zMDcxNDI4NmVtOy13ZWJraXQtYm94LXNoYWRvdzoxcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93OjFweCAtMXB4IDAgMCAjYmFiYWJjfS51aS5yaWdodC5jZW50ZXIucG9wdXA6YmVmb3Jle3RvcDo1MCU7bGVmdDotLjMwNzE0Mjg2ZW07Ym90dG9tOmF1dG87cmlnaHQ6YXV0bzttYXJnaW4tdG9wOi0uMzA3MTQyODZlbTstd2Via2l0LWJveC1zaGFkb3c6LTFweCAxcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IDFweCAwIDAgI2JhYmFiY30udWkuYm90dG9tLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9LnVpLmxlZnQuY2VudGVyLnBvcHVwOmJlZm9yZSwudWkucmlnaHQuY2VudGVyLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9LnVpLnRvcC5wb3B1cDpiZWZvcmV7YmFja2dyb3VuZDojZmZmfS51aS5pbnZlcnRlZC5ib3R0b20ucG9wdXA6YmVmb3Jle2JhY2tncm91bmQ6IzFiMWMxZH0udWkuaW52ZXJ0ZWQubGVmdC5jZW50ZXIucG9wdXA6YmVmb3JlLC51aS5pbnZlcnRlZC5yaWdodC5jZW50ZXIucG9wdXA6YmVmb3Jle2JhY2tncm91bmQ6IzFiMWMxZH0udWkuaW52ZXJ0ZWQudG9wLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kOiMxYjFjMWR9LnVpLnBvcHVwPi51aS5ncmlkOm5vdCgucGFkZGVkKXt3aWR0aDpjYWxjKDEwMCUgKyAxLjc1cmVtKTttYXJnaW46LS43cmVtIC0uODc1cmVtfS51aS5sb2FkaW5nLnBvcHVwe2Rpc3BsYXk6YmxvY2s7dmlzaWJpbGl0eTpoaWRkZW47ei1pbmRleDotMX0udWkuYW5pbWF0aW5nLnBvcHVwLC51aS52aXNpYmxlLnBvcHVwe2Rpc3BsYXk6YmxvY2t9LnVpLnZpc2libGUucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS51aS5iYXNpYy5wb3B1cDpiZWZvcmV7ZGlzcGxheTpub25lfS51aS53aWRlLnBvcHVwe21heC13aWR0aDozNTBweH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHdpZGVcXFwiXS5wb3B1cHttYXgtd2lkdGg6NTUwcHh9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkud2lkZS5wb3B1cCwudWlbY2xhc3MqPVxcXCJ2ZXJ5IHdpZGVcXFwiXS5wb3B1cHttYXgtd2lkdGg6MjUwcHh9fS51aS5mbHVpZC5wb3B1cHt3aWR0aDoxMDAlO21heC13aWR0aDpub25lfS51aS5pbnZlcnRlZC5wb3B1cHtiYWNrZ3JvdW5kOiMxYjFjMWQ7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkLnBvcHVwIC5oZWFkZXJ7YmFja2dyb3VuZC1jb2xvcjpub25lO2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLmZsb3dpbmcucG9wdXB7bWF4LXdpZHRoOm5vbmV9LnVpLm1pbmkucG9wdXB7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5wb3B1cHtmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5wb3B1cHtmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5wb3B1cHtmb250LXNpemU6MXJlbX0udWkubGFyZ2UucG9wdXB7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmh1Z2UucG9wdXB7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFByb2dyZXNzIEJhclxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnByb2dyZXNze3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOjEwMCU7Ym9yZGVyOm5vbmU7bWFyZ2luOjFlbSAwIDIuNWVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEpO3BhZGRpbmc6MDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkucHJvZ3Jlc3M6Zmlyc3QtY2hpbGR7bWFyZ2luOjAgMCAyLjVlbX0udWkucHJvZ3Jlc3M6bGFzdC1jaGlsZHttYXJnaW46MCAwIDEuNWVtfS51aS5wcm9ncmVzcyAuYmFye2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6MTtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDowJTttaW4td2lkdGg6MmVtO2JhY2tncm91bmQ6Izg4ODtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOndpZHRoIC4xcyBlYXNlLGJhY2tncm91bmQtY29sb3IgLjFzIGVhc2V9LnVpLnByb2dyZXNzIC5iYXI+LnByb2dyZXNze3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO2ZvbnQtc2l6ZTouOTI4NTcxNDNlbTt0b3A6NTAlO3JpZ2h0Oi41ZW07bGVmdDphdXRvO2JvdHRvbTphdXRvO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO3RleHQtc2hhZG93Om5vbmU7bWFyZ2luLXRvcDotLjVlbTtmb250LXdlaWdodDo3MDA7dGV4dC1hbGlnbjpsZWZ0fS51aS5wcm9ncmVzcz4ubGFiZWx7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtmb250LXNpemU6MWVtO3RvcDoxMDAlO3JpZ2h0OmF1dG87bGVmdDowO2JvdHRvbTphdXRvO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtmb250LXdlaWdodDo3MDA7dGV4dC1zaGFkb3c6bm9uZTttYXJnaW4tdG9wOi4yZW07dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC40cyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjRzIGVhc2V9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiMVxcXCJdIC5iYXIsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiMlxcXCJdIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1YzVjfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjNcXFwiXSAuYmFye2JhY2tncm91bmQtY29sb3I6I2VmYmM3Mn0udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCI0XFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCI1XFxcIl0gLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNlNmJiNDh9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiNlxcXCJdIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZGRjOTI4fS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjdcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjhcXFwiXSAuYmFye2JhY2tncm91bmQtY29sb3I6I2I0ZDk1Y30udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCIxMDBcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjlcXFwiXSAuYmFye2JhY2tncm91bmQtY29sb3I6IzY2ZGE4MX0udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCIxXFxcIl0gLmxhYmVsLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjJcXFwiXSAubGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjNcXFwiXSAubGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjRcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiNVxcXCJdIC5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiNlxcXCJdIC5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiN1xcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCI4XFxcIl0gLmxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCIxMDBcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiOVxcXCJdIC5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCIxXFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjJcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiM1xcXCJdIC5iYXIsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI0XFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjVcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiNlxcXCJdIC5iYXIsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI3XFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjhcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiOVxcXCJdIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1YzVjfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiMVxcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjJcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCIzXFxcIl0gLmxhYmVsLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiNFxcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjVcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI2XFxcIl0gLmxhYmVsLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiN1xcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjhcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI5XFxcIl0gLmxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW5kaWNhdGluZy5wcm9ncmVzcy5zdWNjZXNzIC5sYWJlbHtjb2xvcjojMWE1MzFifS51aS5wcm9ncmVzcy5zdWNjZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1IWltcG9ydGFudH0udWkucHJvZ3Jlc3Muc3VjY2VzcyAuYmFyLC51aS5wcm9ncmVzcy5zdWNjZXNzIC5iYXI6OmFmdGVyey13ZWJraXQtYW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50O2FuaW1hdGlvbjpub25lIWltcG9ydGFudH0udWkucHJvZ3Jlc3Muc3VjY2Vzcz4ubGFiZWx7Y29sb3I6IzFhNTMxYn0udWkucHJvZ3Jlc3Mud2FybmluZyAuYmFye2JhY2tncm91bmQtY29sb3I6I2YyYzAzNyFpbXBvcnRhbnR9LnVpLnByb2dyZXNzLndhcm5pbmcgLmJhciwudWkucHJvZ3Jlc3Mud2FybmluZyAuYmFyOjphZnRlcnstd2Via2l0LWFuaW1hdGlvbjpub25lIWltcG9ydGFudDthbmltYXRpb246bm9uZSFpbXBvcnRhbnR9LnVpLnByb2dyZXNzLndhcm5pbmc+LmxhYmVse2NvbG9yOiM3OTRiMDJ9LnVpLnByb2dyZXNzLmVycm9yIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZGIyODI4IWltcG9ydGFudH0udWkucHJvZ3Jlc3MuZXJyb3IgLmJhciwudWkucHJvZ3Jlc3MuZXJyb3IgLmJhcjo6YWZ0ZXJ7LXdlYmtpdC1hbmltYXRpb246bm9uZSFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50fS51aS5wcm9ncmVzcy5lcnJvcj4ubGFiZWx7Y29sb3I6IzkxMmQyYn0udWkuYWN0aXZlLnByb2dyZXNzIC5iYXJ7cG9zaXRpb246cmVsYXRpdmU7bWluLXdpZHRoOjJlbX0udWkuYWN0aXZlLnByb2dyZXNzIC5iYXI6OmFmdGVye2NvbnRlbnQ6Jyc7b3BhY2l0eTowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWFuaW1hdGlvbjpwcm9ncmVzcy1hY3RpdmUgMnMgZWFzZSBpbmZpbml0ZTthbmltYXRpb246cHJvZ3Jlc3MtYWN0aXZlIDJzIGVhc2UgaW5maW5pdGV9QC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWFjdGl2ZXswJXtvcGFjaXR5Oi4zO3dpZHRoOjB9MTAwJXtvcGFjaXR5OjA7d2lkdGg6MTAwJX19QGtleWZyYW1lcyBwcm9ncmVzcy1hY3RpdmV7MCV7b3BhY2l0eTouMzt3aWR0aDowfTEwMCV7b3BhY2l0eTowO3dpZHRoOjEwMCV9fS51aS5kaXNhYmxlZC5wcm9ncmVzc3tvcGFjaXR5Oi4zNX0udWkuZGlzYWJsZWQucHJvZ3Jlc3MgLmJhciwudWkuZGlzYWJsZWQucHJvZ3Jlc3MgLmJhcjo6YWZ0ZXJ7LXdlYmtpdC1hbmltYXRpb246bm9uZSFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wcm9ncmVzc3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KTtib3JkZXI6bm9uZX0udWkuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kOiM4ODh9LnVpLmludmVydGVkLnByb2dyZXNzIC5iYXI+LnByb2dyZXNze2NvbG9yOiNmOWZhZmJ9LnVpLmludmVydGVkLnByb2dyZXNzPi5sYWJlbHtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5wcm9ncmVzcy5zdWNjZXNzPi5sYWJlbHtjb2xvcjojMjFiYTQ1fS51aS5pbnZlcnRlZC5wcm9ncmVzcy53YXJuaW5nPi5sYWJlbHtjb2xvcjojZjJjMDM3fS51aS5pbnZlcnRlZC5wcm9ncmVzcy5lcnJvcj4ubGFiZWx7Y29sb3I6I2RiMjgyOH0udWkucHJvZ3Jlc3MuYXR0YWNoZWR7YmFja2dyb3VuZDowIDA7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjB9LnVpLnByb2dyZXNzLmF0dGFjaGVkLC51aS5wcm9ncmVzcy5hdHRhY2hlZCAuYmFye2Rpc3BsYXk6YmxvY2s7aGVpZ2h0Oi4ycmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWkucHJvZ3Jlc3MuYXR0YWNoZWQgLmJhcntib3JkZXItcmFkaXVzOjB9LnVpLnByb2dyZXNzLnRvcC5hdHRhY2hlZCwudWkucHJvZ3Jlc3MudG9wLmF0dGFjaGVkIC5iYXJ7dG9wOjA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkucHJvZ3Jlc3MudG9wLmF0dGFjaGVkIC5iYXJ7Ym9yZGVyLXJhZGl1czowfS51aS5jYXJkPi51aS5hdHRhY2hlZC5wcm9ncmVzcywudWkuc2VnbWVudD4udWkuYXR0YWNoZWQucHJvZ3Jlc3N7cG9zaXRpb246YWJzb2x1dGU7dG9wOmF1dG87bGVmdDowO2JvdHRvbToxMDAlO3dpZHRoOjEwMCV9LnVpLmNhcmQ+LnVpLmJvdHRvbS5hdHRhY2hlZC5wcm9ncmVzcywudWkuc2VnbWVudD4udWkuYm90dG9tLmF0dGFjaGVkLnByb2dyZXNze3RvcDoxMDAlO2JvdHRvbTphdXRvfS51aS5yZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4Mjh9LnVpLnJlZC5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2ZmNjk1ZX0udWkub3JhbmdlLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjI3MTFjfS51aS5vcmFuZ2UuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjg1MWJ9LnVpLnllbGxvdy5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOH0udWkueWVsbG93LmludmVydGVkLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZlMjFmfS51aS5vbGl2ZS5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOH0udWkub2xpdmUuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkOWU3Nzh9LnVpLmdyZWVuLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1fS51aS5ncmVlbi5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzJlY2M0MH0udWkudGVhbC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzAwYjVhZH0udWkudGVhbC5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzZkZmZmZn0udWkuYmx1ZS5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzIxODVkMH0udWkuYmx1ZS5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzU0YzhmZn0udWkudmlvbGV0LnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojNjQzNWM5fS51aS52aW9sZXQuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNhMjkxZmJ9LnVpLnB1cnBsZS5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2EzMzNjOH0udWkucHVycGxlLmludmVydGVkLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZGM3M2ZmfS51aS5waW5rLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZTAzOTk3fS51aS5waW5rLmludmVydGVkLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmY4ZWRmfS51aS5icm93bi5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2E1NjczZn0udWkuYnJvd24uaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkNjdjMWN9LnVpLmdyZXkucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzZ9LnVpLmdyZXkuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkY2RkZGV9LnVpLmJsYWNrLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkfS51aS5ibGFjay5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzU0NTQ1NH0udWkudGlueS5wcm9ncmVzc3tmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS50aW55LnByb2dyZXNzIC5iYXJ7aGVpZ2h0Oi41ZW19LnVpLnNtYWxsLnByb2dyZXNze2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLnNtYWxsLnByb2dyZXNzIC5iYXJ7aGVpZ2h0OjFlbX0udWkucHJvZ3Jlc3N7Zm9udC1zaXplOjFyZW19LnVpLnByb2dyZXNzIC5iYXJ7aGVpZ2h0OjEuNzVlbX0udWkubGFyZ2UucHJvZ3Jlc3N7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmxhcmdlLnByb2dyZXNzIC5iYXJ7aGVpZ2h0OjIuNWVtfS51aS5iaWcucHJvZ3Jlc3N7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmJpZy5wcm9ncmVzcyAuYmFye2hlaWdodDozLjVlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gUmF0aW5nXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkucmF0aW5ne2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS51aS5yYXRpbmc6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udWkucmF0aW5nIC5pY29ue3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7ZmxleDoxIDAgYXV0bztjdXJzb3I6cG9pbnRlcjt3aWR0aDoxLjI1ZW07aGVpZ2h0OmF1dG87LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSx0ZXh0LXNoYWRvdyAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSx0ZXh0LXNoYWRvdyAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZX0udWkucmF0aW5nIC5pY29ue2JhY2tncm91bmQ6MCAwO2NvbG9yOnJnYmEoMCwwLDAsLjE1KX0udWkucmF0aW5nIC5hY3RpdmUuaWNvbntiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLnJhdGluZyAuaWNvbi5zZWxlY3RlZCwudWkucmF0aW5nIC5pY29uLnNlbGVjdGVkLmFjdGl2ZXtiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnN0YXIucmF0aW5nIC5pY29ue3dpZHRoOjEuMjVlbTtoZWlnaHQ6YXV0bztiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC4xNSk7dGV4dC1zaGFkb3c6bm9uZX0udWkuc3Rhci5yYXRpbmcgLmFjdGl2ZS5pY29ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDtjb2xvcjojZmZlNjIzIWltcG9ydGFudDt0ZXh0LXNoYWRvdzowIC0xcHggMCAjZGRjNTA3LC0xcHggMCAwICNkZGM1MDcsMCAxcHggMCAjZGRjNTA3LDFweCAwIDAgI2RkYzUwNyFpbXBvcnRhbnR9LnVpLnN0YXIucmF0aW5nIC5pY29uLnNlbGVjdGVkLC51aS5zdGFyLnJhdGluZyAuaWNvbi5zZWxlY3RlZC5hY3RpdmV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50O2NvbG9yOiNmYzAhaW1wb3J0YW50O3RleHQtc2hhZG93OjAgLTFweCAwICNlNmEyMDAsLTFweCAwIDAgI2U2YTIwMCwwIDFweCAwICNlNmEyMDAsMXB4IDAgMCAjZTZhMjAwIWltcG9ydGFudH0udWkuaGVhcnQucmF0aW5nIC5pY29ue3dpZHRoOjEuNGVtO2hlaWdodDphdXRvO2JhY2tncm91bmQ6MCAwO2NvbG9yOnJnYmEoMCwwLDAsLjE1KTt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuaGVhcnQucmF0aW5nIC5hY3RpdmUuaWNvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7Y29sb3I6I2ZmNmQ3NSFpbXBvcnRhbnQ7dGV4dC1zaGFkb3c6MCAtMXB4IDAgI2NkMDcwNywtMXB4IDAgMCAjY2QwNzA3LDAgMXB4IDAgI2NkMDcwNywxcHggMCAwICNjZDA3MDchaW1wb3J0YW50fS51aS5oZWFydC5yYXRpbmcgLmljb24uc2VsZWN0ZWQsLnVpLmhlYXJ0LnJhdGluZyAuaWNvbi5zZWxlY3RlZC5hY3RpdmV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50O2NvbG9yOiNmZjMwMDAhaW1wb3J0YW50O3RleHQtc2hhZG93OjAgLTFweCAwICNhYTAxMDEsLTFweCAwIDAgI2FhMDEwMSwwIDFweCAwICNhYTAxMDEsMXB4IDAgMCAjYWEwMTAxIWltcG9ydGFudH0udWkuZGlzYWJsZWQucmF0aW5nIC5pY29ue2N1cnNvcjpkZWZhdWx0fS51aS5yYXRpbmcuc2VsZWN0ZWQgLmFjdGl2ZS5pY29ue29wYWNpdHk6MX0udWkucmF0aW5nIC5pY29uLnNlbGVjdGVkLC51aS5yYXRpbmcuc2VsZWN0ZWQgLmljb24uc2VsZWN0ZWR7b3BhY2l0eToxfS51aS5taW5pLnJhdGluZ3tmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LnJhdGluZ3tmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5yYXRpbmd7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkucmF0aW5ne2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5yYXRpbmd7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmh1Z2UucmF0aW5ne2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLnJhdGluZ3tmb250LXNpemU6MnJlbX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OlJhdGluZztzcmM6dXJsKGRhdGE6YXBwbGljYXRpb24veC1mb250LXR0ZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxBQUVBQUFBTEFJQUFBd0F3VDFNdk1nZ2pDQnNBQUFDOEFBQUFZR050WVhDajJwbThBQUFCSEFBQUFLUm5ZWE53QUFBQUVBQUFBY0FBQUFBSVoyeDVabEpiWE1ZQUFBSElBQUFSbkdobFlXUUJHQWU1QUFBVFpBQUFBRFpvYUdWaEErSUIvUUFBRTV3QUFBQWthRzEwZUN6Z0FFTUFBQlBBQUFBQWNHeHZZMkV3WEN4T0FBQVVNQUFBQURwdFlYaHdBQ0lBbkFBQUZHd0FBQUFnYm1GdFpmQzFuMDRBQUJTTUFBQUJQSEJ2YzNRQUF3QUFBQUFWeUFBQUFDQUFBd0lBQVpBQUJRQUFBVXdCWmdBQUFFY0JUQUZtQUFBQTlRQVpBSVFBQUFBQUFBQUFBQUFBQUFBQUFBQUJFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUR4WlFIZy8rRC80QUhnQUNBQUFBQUJBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQUNBQUFBQXdBQUFCUUFBd0FCQUFBQUZBQUVBSkFBQUFBZ0FDQUFCQUFBQUFFQUlPWUY4QWJ3RGZBajhDN3didkJ3OElyd2wvQ2M4U1B4WmYvOS8vOEFBQUFBQUNEbUFQQUU4QXp3SS9BdThHN3djUENIOEpmd25QRWo4V1QvL2YvL0FBSC80eG9FRUFZUUFRL3NEK0lQb3craUQ0d1BnQTk4RHZZT3RnQURBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUgvL3dBUEFBRUFBQUFBQUFBQUFBQUNBQUEzT1FFQUFBQUFBUUFBQUFBQUFBQUFBQUlBQURjNUFRQUFBQUFCQUFBQUFBQUFBQUFBQWdBQU56a0JBQUFBQUFJQUFQL3RBZ0FCMHdBS0FCVUFBQUV2QVE4QkZ3YzNGeWMzQlFjM0p6OEJId0VIRnljQ0FMRlBUN0dBSHA2ZUhvRC9BSEFXVzMwNE9IMWJGbkFCR1JxZ29CcDhzRk5Uc0h5eU9ueFlFbkZ4RWxoOE9nQUFBQUFDQUFELzdRSUFBZE1BQ2dBU0FBQUJMd0VQQVJjSE54Y25Od1V4RVI4QkJ4Y25BZ0N4VDAreGdCNmVuaDZBL3dBNGZWc1djQUVaR3FDZ0dueXdVMU93ZkxJQkhYRVNXSHc2QUFBQUFRQUEvKzBDQUFIVEFBb0FBQUV2QVE4QkZ3YzNGeWMzQWdDeFQwK3hnQjZlbmg2QUFSa2FvS0FhZkxCVFU3QjhBQUFBQUFFQUFBQUFBZ0FCd0FBckFBQUJGQTRDQnpFSERnTWpJaTRDTHdFdUF6VTBQZ0l6TWg0Q0Z6NERNekllQWhVQ0FBY01FZ3VnQmd3TURBWUdEQXdNQnFBTEVnd0hGeWcySGhBZkd4a0tDaGtiSHhBZU5pZ1hBUzBRSHhzWkNxQUdDd2tHQlFrTEJxQUtHUnNmRUI0MktCY0hEQklMQ3hJTUJ4Y29OaDRBQUFBQUFnQUFBQUFDQUFIQUFDc0FXQUFBQVRRdUFpTWlEZ0lITGdNaklnNENGUlFlQWhjeEZ4NERNekkrQWo4QlBnTTFEd0VpRkNJR01UQW1JalFqSnk0RE5UUStBak15SGdJZkFUYytBek15SGdJVkZBNENCd0lBRnlnMkhoQWZHeGtLQ2hrYkh4QWVOaWdYQnd3U0M2QUdEQXdNQmdZTURBd0dvQXNTREFkYm9nRUJBUUVCQWFJR0NnY0VEUmNlRVFrUkVBNEdMeThHRGhBUkNSRWVGdzBFQndvR0FTMGVOaWdYQnd3U0N3c1NEQWNYS0RZZUVCOGJHUXFnQmdzSkJnVUpDd2FnQ2hrYkh4QStvZ0VCQVFHaUJnNFFFUWtSSGhjTkJBY0tCalEwQmdvSEJBMFhIaEVKRVJBT0JnQUJBQUFBQUFJQUFjQUFNUUFBQVJRT0FnY3hCdzRESXlJdUFpOEJMZ00xTkQ0Q016SWVBaGNIRndjM0p6YytBek15SGdJVkFnQUhEQklMb0FZTURBd0dCZ3dNREFhZ0N4SU1CeGNvTmg0S0ZSTVNDQzl3UUxCd0p3VUpDZ2tGSGpZb0Z3RXRFQjhiR1FxZ0Jnc0pCZ1VKQ3dhZ0Noa2JIeEFlTmlnWEF3VUlCVXRBb01CQU93RUNBUUVYS0RZZUFBQUJBQUFBQUFJQUFiY0FLZ0FBRXpRM05qTXlGeFlYRmhjV0Z6WTNOamMyTnpZek1oY1dGUlFQQVFZaklpOEJKaWNtSnlZbkppY21OUUFrSlVBUkV4SVFFQXNNQ2dvTUN4QVFFaE1SUUNVa1FiSUdCd2NHc2dNRkJRc0tDUWtHQndFeFB5TWtCZ1lMQ2drS0Nnb0tDUW9MQmdZa0l6OC9RYXdGQmF3Q0JnVU5EZzRPRlJRVEFBQUFBUUFBQUEwQjJ3SFNBQ1lBQUJNMFB3STJGellmQWhZVkZBOEJGeFFWRkFjR0J5WXZBUWNHQnlZbkpqVTBQd0VuSmpVQUVJOUJCUWtJQmtDUEVBZG9HUU1EQmdVR2dJRUdCUVlEQXdFWWFBY0JJd3NDRm9FTUFRRU1nUllDQ3dZSVpKQUJCUVVGQXdFQkFrVkZBZ0VCQXdVRkF3T1FaQWtGQUFBQUFBSUFBQUFOQWRzQjBnQWtBQzRBQUJNMFB3STJGellmQWhZVkZBOEJGeFFWRkFjbUx3RUhCZ2NtSnlZMU5EOEJKeVkxSHdFSE54Y25OeThCQndBUWowRUZDUWdHUUk4UUIyZ1pEQVVHZ0lFR0JRWURBd0VZYUFjL1dCVnNheFJYZURZMkFTTUxBaGFCREFFQkRJRVdBZ3NHQ0dTUUFRVU5BUUVDUlVVQ0FRRURCUVVEQTVCa0NRVVJWWGc0T0hoVkVXNXVBQUFCQUNNQUtRSGRBWHdBR2dBQU56US9BVFlYTmg4Qk56WVhOaDhCRmhVVUR3RUdCeVl2QVNZMUl3Z21DQXdMQ0ZTOENBc01DQ1lJQ1BVSURBc0lqZ2pTQ3drbUNRRUJDVlM3Q1FFQkNTWUpDZzBIOWdjQkFRZVBCd3dBQUFFQUh3QWZBWE1CY3dBc0FBQTNORDhCSnlZMU5EOEJOak15SHdFM05qTXlId0VXRlJRUEFSY1dGUlFQQVFZaklpOEJCd1lqSWk4QkpqVWZDRlJVQ0FnbkNBd0xDRlJVQ0F3TENDY0lDRlJVQ0FnbkNBc01DRlJVQ0FzTUNDY0lZZ3NJVkZRSURBc0lKd2dJVkZRSUNDY0lDd3dJVkZRSUN3d0lKd2dJVkZRSUNDY0lEQUFBQUFBQ0FBQUFKUUZKQWJjQUh3QXJBQUEzTlRRM05qc0JOVFEzTmpNeUZ4WWRBVE15RnhZZEFSUUhCaU1oSWljbU5UY3pOVFFuSmlNaUJ3WWRBUUFJQ0FzS0pTWTFOQ1ltQ1FzSUNBZ0lDLzd0Q3dnSVc1TVdGUjRmRlJaQXBRc0lDRGMwSmlZbUpqUTNDQWdMcFFzSUNBZ0lDOEEzSGhZVkZSWWVOd0FBQVFBQUFBY0JiZ0czQUNFQUFEY1JORGMyTnpZeklUSVhGaGNXRlJFVUJ3WUhCaU1pTHdFSEJpTWlKeVluSmpVQUJnVUtCZ1lCTEFZR0NnVUdCZ1VLQlFjT0NuNStDZzRHQmdvRkJpY0JjQW9JQ0FNREF3TUlDQXIra0FvSUNBUUNDWGw1Q1FJRUNBZ0tBQUFBQXdBQUFDVUNBQUZ1QUJnQU1RQktBQUEzTkRjMk56WXpNaGNXRnhZVkZBY0dCd1lqSWljbUp5WTFNeFlYRmpNeU56WTNKaWNXRlJRSEJpTWlKeVkxTkRjR0J6Y1VGeFl6TWpjMk5UUTNOak15TnpZMU5DY21JeUlIQmhVQUJpaERSRXRMUkVNb0JnWW9RMFJMUzBSREtBWWxKams1UTBNNU9TWXJRUkVtSlRVMUpTWVJRU3VFQkFRR0JnUUVFUkVaQmdRRUJBUUdKQmtheVFvS1FTZ29LQ2hCQ2dvS0NrRW9KeWNvUVFvS09pTWpJeU02UkNFZUlqVW1KU1VtTlNJZUlVUWxCZ1FFQkFRR0dCSVJCQVFHQmdRRUdob2pBQUFBQlFBQUFBa0NBQUdKQUN3QU9BQlJBR2dBY0FBQU56UTNOamMyTXpJWE56WXpNaGNXRnhZWEZoY1dGeFlWRkRFR0J3WVBBUVlqSWljbU5UUTNKaWNtSnlZMU14WVhOeVluSmpVME53WUhOeFFYRmpNeU56WTFORGMyTXpJM05qVTBKeVlqSWdjR0ZSYzNOamMyTnlZbk54WVhGaGNXRlJRSEJnY0dCd1lqUHdFV0ZSUUhCZ2NBQml0QlFVMFpHaEFEQlFFRUJBVUZCQVVFQlFFRUhqdzhIZzREQlFRaUJRMHBJeUlaQmlVdlN4WVpEZzRSUVN1RUJBUUdCZ1FFRVJFWkJnUUVCQVFHSkJrYVZ4VTlNelFpSURBU0d4a1pFQVlHQ3hRck9Eay9MbEFDRnhZbHlRc0pReWNuQlJ3RUFnRURBd0lEQXdJQkF3VUNObXhzTmhrRkZBTUZCQlVUSGg4bkNRdEtJU2dTSEJzZkloNGhSQ1VHQkFRRUJBWVlFaEVFQkFZR0JBUWFHaVBKSlFVaUlqWXpJU0FTR2hrYkNnb0tDaElYTVJzYlVaQU5DeWdoSUE4QUFBTUFBQUFBQWJjQjJ3QTVBRW9BbEFBQU56VTBOelk3QVRZM05qYzJOelkzTmpjMk16SVhGaGNXRlJRSE16SVhGaFVVQnhZVkZBY1VGUlFIRmdjR0t3RWlKeVluSmlzQklpY21OVGNVRnhZek1qYzJOVFFuSmlNaUJ3WVZGek15RnhZWEZoY1dGeFlYRmhjV093RXlOVFFuTmpjMk5UUW5OalUwSnlZbk5qYzJOVFFuSmlzQk5EYzJOVFFuSmlNR0J3WUhCZ2NHQndZSEJnY0dCd1lIQmdjR0J3WXJBUlVBQ3dvUVRnb2RFUTRHQkFNRkJnd0xEeGdURXdvS0RqTWRGaFlPQWdvUkFSa1pLQ1ViR3hzaklRWlNFQW9MSlFVRkNBY0dCUVVHQndnRkJVa0pCQVVGQkFRSEJ3TURCd2NDUENVak53SUpCUVVGRHdNREJBa0dCZ3NMRG1VT0Rnb0pHd2dEQXdZRkRBWVFBUVVHQXdRR0JnWUZCZ1VHQmdRSlNiY1BDd3NHSmhVUENCRVJFeE1NQ2drSkZCUWhHeHdXRlI0WkZRb0tGaE1HQmgwV0tCY1hCZ2NNREFvTER4SUhCUVlHQlFjSUJRWUdCUWdTQVFFQkFRSUNBUUVEQWdFVUx3Z0lCUW9MQ2dzSkRoUUhDUWtFQVEwTkNnOExDeEFkSFJFY0RRNElFQkVURXcwR0ZBRUhCd1VFQ0FnRkJRVUZBZ08zQUFBREFBRC8yd0czQWJjQVBBQk5BSmtBQURjMU5EYzJPd0V5TnpZM05qc0JNaGNXQnhVV0ZSUVZGaFVVQnhZVkZBY0dLd0VXRlJRSEJnY0dJeUluSmljbUp5WW5KaWNtSnlZbkl5SW5KalUzRkJjV016STNOalUwSnlZaklnY0dGUmN6TWhjV0Z4WVhGaGNXRnhZWEZoY1dGeFlYRmhjV0Z6STNOalUwSnlZMU16STNOalUwSnlZak5qYzJOVFFuTmpVMEp5WW5OalUwSnlZckFTSUhJZ2NHQndZSEJnY0dJd1lyQVJVQUN3b1FVZ1loSlJzYkhpQW9HUmtCRVFvQ0RoWVdIVE1PQ2dvVEV4Z1BDd29GQmdJQkJBTUZEaEVkQ2s0UUNnc2xCUVVJQndZRkJRWUhDQVVGU1FrRUJnWUZCZ1VHQmdZRUF3WUZBUkFHREFVR0F3TUlHd2tLRGc1bERnc0xCZ1lKQkFNRER3VUZCUWtDRGc0WkpTVThBZ2NIQXdNSEJ3UUVCUVVFQ2JlM0R3c0tEQXdIQmhjV0p3SVdIUVlHRXhZS0NoVVpIaFlWSFJvaUV4UUpDZ3NKRGc0TURBd05CZzRXSlFjTEN3K2tCd1VHQmdVSENBVUdCZ1VJcEFNQ0JRWUZCUWNJQkFVSEJ3SVRCd3dURXhFUkJ3ME9IQkVkSFJBTEN3OEtEUTBGQ1FrSEZBNEpDd29MQ2dVSUNCZ01DeFVEQWdFQkFnTUJBUUczQUFBQUFRQUFBQTBBN2dIU0FCUUFBQk0wUHdJMkZ4RUhCZ2NtSnlZMU5EOEJKeVkxQUJDUFFRVUpnUVlGQmdNREFSaG9Cd0VqQ3dJV2dRd0Ivb05GQWdFQkF3VUZBd09RWkFrRkFBQUFBQUlBQUFBQUFnQUJ0d0FxQUZrQUFCTTBOell6TWhjV0Z4WVhGaGMyTnpZM05qYzJNeklYRmhVVUR3RUdJeUl2QVNZbkppY21KeVluSmpVekZCOEJOelkxTkNjbUp5WW5KaWNtSXlJSEJnY0dCd1lIQmlNaUp5WW5KaWNtSnlZaklnY0dCd1lIQmdjR0ZRQWtKVUFSRXhJUUVBc01DZ29NQ3hBUUVoTVJRQ1VrUWJJR0J3Y0dzZ01GQlFzS0NRa0dCeVUxcHFZMUJnWUpDZzRORGcwUERoSVJEZzhLQ2djRkNRa0ZCd29LRHc0UkVnNFBEUTRORGdvSkJnWUJNVDhqSkFZR0N3b0pDZ29LQ2drS0N3WUdKQ00vUDBHc0JRV3NBZ1lGRFE0T0RoVVVFekExb0o4Mk1CY1NFZ29MQmdjQ0FnY0hDd3NLQ1FnSEJ3Z0pDZ3NMQndjQ0FnY0dDd29TRWhjQUFBQUNBQUFBQndGdUFiY0FJUUFvQUFBM0VUUTNOamMyTXlFeUZ4WVhGaFVSRkFjR0J3WWpJaThCQndZaklpY21KeVkxUHdFZkFSRWhFUUFHQlFvR0JnRXNCZ1lLQlFZR0JRb0ZCdzRLZm40S0RnWUdDZ1VHSlpJWmVmN2NKd0Z3Q2dnSUF3TURBd2dJQ3Y2UUNnZ0lCQUlKZVhrSkFnUUlDQW9JalJsMEFXUCtuUUFBQUFBQkFBQUFKUUhiQWJjQU1nQUFOelUwTnpZN0FUVTBOell6TWhjV0hRRVVCd1lyQVNJbkpqMEJOQ2NtSXlJSEJoMEJNeklYRmgwQkZBY0dJeUVpSnlZMUFBZ0lDOEFtSmpRMUppVUZCUWdTQ0FVRkZoVWZIaFVXSEFzSUNBZ0lDLzd0Q3dnSVFLVUxDQWczTlNVbUppVTFTUWdGQmdZRkNFa2VGaFVWRmg0M0NBZ0xwUXNJQ0FnSUN3QUFBQUlBQVFBTkFkc0IwZ0FpQUMwQUFCTTJQd0kyTXpJZkFoWVhGZzhCRnhZSEJpTWlMd0VIQmlNaUp5WS9BU2NtTng4Q0x3RS9BUzhDRXdFRERKQkFCZ2dKQlVHT0RnSURDbWNZQWdRQ0NBTUlmNElGQmdZRUFnRVphUWdDN2hCYkVnSU5TbmtJTGdFQkpnZ0NGWUlMQzRJVkFnZ0lDV1dQQ2dVRkEwUkVBd1VGQ285bENRaXBDVEJtRXcxSEVoRmMvdTBBQUFBREFBQUFBQUhKQWJjQUZBQWxBSGtBQURjMU5EYzJPd0V5RnhZZEFSUUhCaXNCSWljbU5UY1VGeFl6TWpjMk5UUW5KaU1pQndZVkZ6VTBOell6TmpjMk56WTNOamMyTnpZM05qYzJOelkzTmpNeUZ4WVhGaGNXRnhZWEZoVVVGUlFIQmdjR0J4UUhCZ2NHQnpNeUZ4WVZGQWNXRlJZSEZnY0dCeFlIQmdjaklpY21KeVluSmljaUp5WTFBQVVHQjFNSEJRWUdCUWRUQndZRkpRVUZDQWNHQlFVR0J3Z0ZCV1FGQlFnR0R3OE9GQWtGQkFRQkFRTUNBUUlFQkFZRkJ3NEtDZ2NIQlFRQ0F3RUJBZ01EQWdZQ0FnSUJBVThYRUJBUUJRRU9CUVVFQ3dNUkVpWWxFeFlYREF3V0pBb0hCUVkzdHdjR0JRVUdCN2NJQlFVRkJRZ2tCd1lGQlFZSENBVUdCZ1VJSkxjSEJRWUJFQkFUR1FrRkNRZ0dCUXdMQmdjSUNRVUdBd01GQkFjSEJnWUlDUVFFQndzTEN3WUdDZ0lEQkFNQ0JCRVFGaGtTREFvVkVoQVJFQXNnRkJVQkJBVUVCQWNNQVFVRkNBQUFBQUFEQUFELzJ3SEpBWklBRkFBbEFIa0FBRGNVRnhZWE54WTNOajBCTkNjbUJ5Y0dCd1lkQVRjME56WTNGaGNXRlJRSEJpY0dKeVkxRnpVME56WTNGamMyTnpZM05qY1hOaGNXQnhZWEZnY1dCeFFIRmhVVUJ3WUhKeFlYRmhjV0ZSWVhGaGNXRlJRVkZBY0dCd1lIQmdjR0J3WW5CaWNtSnlZbkppY21KeVluSmljbUp5WW5KaWNpSnlZMUFBVUdCMU1IQlFZR0JRZFRCd1lGSlFVRkNBY0dCUVVHQndnRkJXUUdCUWNLSkJZTURCY1dFeVVtRWhFREN3UUZCUTRCQlJBUUVCZFBBUUVDQWdJR0FnTURBZ0VCQXdJRUJRY0hDZ29PQndVR0JBUUNBUUlEQVFFRUJBVUpGQTRQRHdZSUJRV2xCd1lGQVFFQkJ3UUp0UWtFQndFQkFRVUdCN2VUQndZRUFRRUVCZ2NKQkFZQkFRWUVDWlM0QndZRUFnRU5Cd1VDQmdNQkFRRVhFeUVKRWhBUkVCY0lEaEFhRmhFUEFRRUZBZ1FDQlFFTEJRY0tEQWtJQkFVSENnVUdCd2dEQmdJRUFRRUhCUWtJQndVTUN3Y0VDZ2NHQ1JvUkVROENCZ1FJQUFBQUFRQUFBQUVBQUp0aDU3ZGZEenoxQUFzQ0FBQUFBQURQL0dPREFBQUFBTS84WTRNQUFQL2JBZ0FCMndBQUFBZ0FBZ0FBQUFBQUFBQUJBQUFCNFAvZ0FBQUNBQUFBQUFBQ0FBQUJBQUFBQUFBQUFBQUFBQUFBQUFBQUhBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFkd0FBQUhjQUFBQ0FBQWpBWk1BSHdGSkFBQUJiZ0FBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUVBQUFBQ0FBQUFBVzRBQUFIY0FBQUIzQUFCQWR3QUFBSGNBQUFBQUFBQUFBb0FGQUFlQUVvQWNBQ0tBTW9CUUFHSUFjd0NDZ0pVQW9JQ3hnTUVBem9EcGdSS0JSZ0Y3QVlTQnBnRzJnY2dCMm9JR0FqT0FBQUFBUUFBQUJ3QW1nQUZBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNEFyZ0FCQUFBQUFBQUJBQXdBQUFBQkFBQUFBQUFDQUE0QVFBQUJBQUFBQUFBREFBd0FJZ0FCQUFBQUFBQUVBQXdBVGdBQkFBQUFBQUFGQUJZQURBQUJBQUFBQUFBR0FBWUFMZ0FCQUFBQUFBQUtBRFFBV2dBREFBRUVDUUFCQUF3QUFBQURBQUVFQ1FBQ0FBNEFRQUFEQUFFRUNRQURBQXdBSWdBREFBRUVDUUFFQUF3QVRnQURBQUVFQ1FBRkFCWUFEQUFEQUFFRUNRQUdBQXdBTkFBREFBRUVDUUFLQURRQVdnQnlBR0VBZEFCcEFHNEFad0JXQUdVQWNnQnpBR2tBYndCdUFDQUFNUUF1QURBQWNnQmhBSFFBYVFCdUFHZHlZWFJwYm1jQWNnQmhBSFFBYVFCdUFHY0FVZ0JsQUdjQWRRQnNBR0VBY2dCeUFHRUFkQUJwQUc0QVp3QkdBRzhBYmdCMEFDQUFad0JsQUc0QVpRQnlBR0VBZEFCbEFHUUFJQUJpQUhrQUlBQkpBR01BYndCTkFHOEFid0J1QUM0QUF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBmb3JtYXQoJ3RydWV0eXBlJyksdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdSazlVVkU4QUFCY1VBQW9BQUFBQUZzd0FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCRFJrWWdBQUFBOUFBQUV1RUFBQkxobzZUdklFOVRMeklBQUJQWUFBQUFZQUFBQUdBSUl3Z2JZMjFoY0FBQUZEZ0FBQUNrQUFBQXBLUGFtYnhuWVhOd0FBQVUzQUFBQUFnQUFBQUlBQUFBRUdobFlXUUFBQlRrQUFBQU5nQUFBRFlCR0FlNWFHaGxZUUFBRlJ3QUFBQWtBQUFBSkFQaUFmMW9iWFI0QUFBVlFBQUFBSEFBQUFCd0xPQUFRMjFoZUhBQUFCV3dBQUFBQmdBQUFBWUFIRkFBYm1GdFpRQUFGYmdBQUFFOEFBQUJQUEMxbjA1d2IzTjBBQUFXOUFBQUFDQUFBQUFnQUFNQUFBRUFCQVFBQVFFQkIzSmhkR2x1WndBQkFnQUJBRHI0SEFMNEd3UDRHQVFlQ2dBWlUvK0xpeDRLQUJsVC80dUxEQWVMWnZpVStIUUZIUUFBQVAwUEhRQUFBUUlSSFFBQUFBa2RBQUFTMkJJQUhRRUJCdzBQRVJRWkhpTW9MVEkzUEVGR1MxQlZXbDlrYVc1emVIMkNoNHh5WVhScGJtZHlZWFJwYm1kMU1IVXhkVEl3ZFVVMk1EQjFSVFl3TVhWRk5qQXlkVVUyTUROMVJUWXdOSFZGTmpBMWRVWXdNRFIxUmpBd05YVkdNREEyZFVZd01FTjFSakF3UkhWR01ESXpkVVl3TWtWMVJqQTJSWFZHTURjd2RVWXdPRGQxUmpBNE9IVkdNRGc1ZFVZd09FRjFSakE1TjNWR01EbERkVVl4TWpOMVJqRTJOSFZHTVRZMUFBQUNBWWtBR2dBY0FnQUJBQVFBQndBS0FBMEFWZ0NXQUwwQkFnR01BZVFDYndMd0E0Y0Q1UVIwQlFNRmRnWmdCOE1Ka1F0eEM3b00yUTFqRGdnT21SQVlFWnI4bEE3OGxBNzhsQTc3bEE3NGxQZXRGZnRGcFR6M05EejdOUHRGY2ZjVSt4QnQrMFQzTXQ3M01qaHQ5MFQzRlBjUUJmdVUrMFlWK3dSUm9mY1FNT1AzRVozRDl3WEQrd1gzRVhrd002SDdFUHNFeFFVTytKVDNyUlg3UmFVODl6UTgrelQ3UlhIM0ZQc1FiZnRFOXpMZTl6STRiZmRFOXhUM0VBWDdsUHRHRll1TGkvZXh3L3NGOXhGNU1ET2greEQ3Qk1VRkR2aVU5NjBWKzBXbFBQYzBQUHMwKzBWeDl4VDdFRzM3UlBjeTN2Y3lPRzMzUlBjVTl4QUZEdmlVOThFVmkyQjRaRzV3Q0l1TCt6VDdOQVY3ZTN0N2U0dDdpM3ViZTVzSSt6VDNOQVZ1cG5peWk3YUwzTTNOM0l1Mmk3SjRwbTZtcUxLZXRvdmNpODFKaXpvSUR2aVU5OEVWaTl4SnpUcUxZSXRrZUhCdWNLaGtubUNMT290SlNZczZpMkNlWktod0NJdUw5elQ3TkFXYmU1dDdtNHViaTV1Ym01c0k5elQzTkFXb3BwNnlpN1lJTUUwVit6YjdOZ1dLaW9xS2lvdUtpNHFNaW93SSt6YjNOZ1Y2bTRHaGk2T0x1YkN3dVl1amk2R0JtM29JdWxlNnZ3V2JuS0dWbzR1NWk3Qm1pMTJMYzRGMWVuc0lEdmlVOThFVmkyQjRaRzV3Q0l1TCt6VDdOQVY3ZTN0N2U0dDdpM3ViZTVzSSt6VDNOQVZ1cG5peWk3YUwzTTNOM0l1bmk2V0RvWDRJWEVEM0JFdEwrelQzUlBkVSt3VExzc1lGbDQ2WWpaaUwzSXZOU1lzNkNBNkw5OFVWaTdXWHJLT2lvNk90bDdhTGxvdVhpWmlIbDRlV2haYUVsb1NVaFpLRms0U1NoWktFa3BLU2taT1NrcEdVa1phU0NKYVNscEdYajVpUGw0MldpN2FMclgramM2TjBsMnFMWVl0aGRXQmdZQWo3UnZ0QUJZZUloNG1HaTRhTGg0MkhqZ2o3UnZkQUJZbU5pWTJIajRpT2hwR0RsSVNVaFpXRmxJV1ZocGFIbVlhWWlaaUxtQWdPWjR2M3R4V0xrcENQbG8wSTl5T2d6UGNXQlk2U2tJK1JpNUNMa0llUGhBakwreGIzSTNZRmxvbVFoNHVFaTRhSmg0YUdDQ01tcFBzakJZdUtpNG1MaUl1SGlvaUppSW1JaUlxSGk0aUxoNHlIalFqN0ZNLzdGVWNGaDRtSGlvaUxoNHVJakltT2lZNktqb3VQaTR5TGpZeU9DS1AzSXlQd0JZYVFpWkNMandnT1o0djN0eFdMa3BDUGxvMEk5eU9nelBjV0JZNlNrSStSaTVDTGtJZVBoQWpMK3hiM0kzWUZsb21RaDR1RWk0YUpoNGFHQ0NNbXBQc2pCWXVLaTRtTGlJdUNoNGFEaTRpTGg0eUhqUWo3Rk0vN0ZVY0ZoNG1IaW9pTGg0dUlqSW1PaVk2S2pvdVBpNHlMall5T0NLUDNJeVB3QllhUWlaQ0xqd2pLZVJYak4zYjdEZmNBeFBaU2QvY040dC83REoxVjl3RlYrd0VGRHE3M1poV0xrNDJSa1pFSXNiSUZrWkNSanBPTGtvdVNpSkNHQ044MjkxRDNVQVdRa0pLT2tvdVRpNUdJa1lZSXNXUUZrWWFOaEl1RWk0T0poWVdGQ1B1Sis0a0ZoWVdGaVlPTGhJdUVqWWFSQ1BzaTl5SUZoWkNKa291U0NBNzdBYXJ0Rll1U2pwS1FrQWpmM3pmZkJZYVFpSktMazR1U2pwS1FrQWl5c2dXUmtKR09rNHVTaTVLSWtJWUkzemZmM3dXUWtKS09rNHVTaTVLSWtJWUlzbVFGa0lhT2hJdUVpNE9JaElhR0NEYzMzemNGa0lhT2hJdUVpNE9JaFlhRkNHUmtCWWFHaElpRWk0T0xoSTZHa0FnMzN6YzNCWWFHaElpRWk0T0xoWTZGa0Foa3NnV0drWWlSaTVNSUR2dExpOHNWaS9jNUJZdVNqcEtRa0pDUWtvNlNpd2lWaTR2Q0JZdXVsNm1rcEtTa3FwaXVpNjZMcVg2a2NxUnltRzJMYUFpTFZKU0xCWktMa29pUWhwQ0dqb1NMaEFpTCt6a0ZpNE9JaFlhR2hvV0VpWVNMQ1B1bml3V0VpNFNOaHBHR2tJaVJpNU1JNXZkVUZmY25pNHZDQll1ZmhKeDhtbjJaZXBKM2kzYUxlb1I5ZlgxOGczcUxkd2lMVkFVTyt5YUxzaFdMK0FRRmk1R05rWStSanBDUWo1S05qNDJQakkrTENQZkFpd1dQaTQrS2o0bVJpWkNIajRhUGhZMkZpNFVJaS93RUJZdUVpWVdIaG9lR2hvZUZpSWlLaG9xSGk0R0xoSTZFa1FqN0V2Y04reEw3RFFXRWhZT0lnb3VIaTRlTGg0MkVqb2FQaUpDSGtJbVJpNUlJRG92M1hSV0xrbzJSajVLbHRxK3Z1S1c0cGJ1WnZZdTlpN3Q5dUhHNGNhOW5wV0NQaEkyRmk0U0xoWW1FaDRSeFlHZG9YbkFJWG5GYmZsbUxXWXRibUY2bFhxWm5ybkcyaDVLSmtvdVJDTENMRmFSa3EyeXhkTEYwdEgrNGk3aUx0SmV4b3JHaXE2cWtzbTY0WjYxZ29aWjNrWGFMZEl0bmZtMXljbkp5Ylg5b2l3aG9pMjJYY3FSeXBINnBpNitMb3BHZ2xwOWdkV2RwYmw0STl4aXdGWXVIaklpT2lJNklqb3FQaTQrTGpveU9qbzJPalk2TGo0dWJrSm1YbDVlV21aR2JpNCtMam95T2pvMk9qWTZMandpTGo0bU9pWTZJallpTmg0dHppM2VDZW5wNmVvSjNpM01JRG92M1hSV0xrbzJTajVHb3VLK3V0cVczcGJxWXZvdWNpNXlKbklnSW02Y0ZqWTZOakkrTGpJdU5pNDJKallxT2lvK0pqb21PaVk2S2pvbU9pWTZKam9xTmlveUtqb21NaVl1SGk0cUxpb3VMQ0hkbmJWVmpRMk5EYlZWM1p3aDljZ1dKaUlpSmlJdUppMzZTZEppSWpZbU9pNDZMalkrVWxKbHZsM0tjZEo5MG9IZWllNldIa1ltU2k1SUlzSXNWcWxxMFo3MTFDS0d6QlhxWGZwcUNub0tkaHA2TG9JdWlrYUNXbjJCMVoybHVYZ2ozR0xBVmk0ZU1pSTZJam9pT2lvK0xqNHVPakk2T2pZNk5qb3VQaTV1UW1aZVhsNWFaa1p1TGo0dU9qSTZPalk2TmpvdVBDSXVQaVk2SmpvaU5pSTJIaTNPTGQ0SjZlbnA2Z25lTGN3amkrMTBWb0xBRnRJK3dtSzJocnFLbnFLS3ZkcTF3cDJ1aENKMnJCWjEvbkh5Y2VweDZtSHFXZVkrRWpZV0xoSXVFaVlXSGhJUi9nSDErZkc5cWFYSm1lV1Y1WTRKaGl3aTUzQlhiOXlRRmpJS01nNHVFaTNDRGMzeDFmSFYzZkhPQkNBNkwxQldMOTBzRmk1V1BsSktTa3BLVGo1YUxDTm1MQlpLUG1KcWVwSmFabFplVmxZK1FqNU9ObDQyV2pwZU9tSStZa1pXVGs1T1NrNDZWaTV1TG1ZaVloWmlGbElHU2ZnaVNmbzU1aTNXTGVZZDVnWGdJdm9zRm40dWNoSmw4bW4yU2VvdDNpM3FHZklKOWpZU0xoWXVFaTN5SWZvUitpNGVMaDR1SGkzZUdlbjk5aTNDRGRudDhDSHQ4ZFlOd2l3aG1pd1Y1aTNtTmVZOTVrSGVSYzVOMWszNlBoNHNJT1lzRmdJdURqb1NTaEpLSGxJdVZDTENkRll1R2pJZVBpSStIajRtUWk1Q0xqNDJQajQ2T2pZK0xrSXVRaVpDSWpvZVBoNDJHaTRhTGg0bUhoNGVJaW9hTGhnalVlUldVaXdXTmk0NkxqNHFPaTQrS2pZcU9pNCtLajRtUWlvNktqWXFOaW8rS2o0bVFpbzZLaklxemZxdUVwSXNJcm9zRnI0dWVtb3VyaTVDS2tZcVFrWTZRa0k2U2pwS05rb3VTaTVLSmtvaVJsWldRbG91WWk1Q0trSW1SaVpHSmo0aU9DSkdNa0krUGxJK1VqWktMa291VmlKT0RrNFNTZ28rQ2l3Z21pd1dMbHBDYWxKNlVucENiaTVhTG5vaVloSlNGbEgrUWVZdUdob2VEaVlDSmY0aC9oMytJZm9XQmc0S0hoNFNDZ0g0SWk0cUlpWWlHaDRhSWg0bUlpSWlJaDRlR2g0YUhoNGVIaUlpSGlJZUhpSWlIaUllS2g0bUlpb2lMQ0lLTGkvdExCUTZMOTBzVmkvZExCWXVWajVPU2s1S1NrNDZXaXdqZGl3V1BpNWlQb1pPa2s2Q1JuWkNkajU2Tm40c0lxNHNGcG91Z2c1eDhtM3lUZDR0eENJdUpCWmQ4a0h1TGQ0dUhpNGVMaDVKK2puNkxmSXVFaTRTSmhaUjlrSHlMZW90M2hIcDhmSDE5ZW9SM2l3aFlpd1dWZUk5NWkzbUxkSWg2aEg2RWZvS0Jmb1YraFgySGU0dUJpNE9QZzVLRmtZYVRoNVNIbFlpVGlwT0trNHFUaUpNSWlaU0lrWWlQZ1pTQmw0Q2FlS1IrbW9TUENEMkxCWUNMZzQrRWtvU1NoNVNMbFFpdzl6Z1ZpNGFNaDQrSWo0ZVBpWkNMa0l1UGpZK1BqbzZOajR1UWk1Q0prSWlPaDQrSGpZYUxob3VIaVllSGg0aUtob3VHQ05UN09CV1Vpd1dPaTQ2S2o0bVBpbytJam9pUGg0K0lqb2VQaUkrSGo0YVBobzZIam9pTmlJNkhqNGFPaG82SWk0cVdmcEtEajRZSWs0T1JnWTUrajM2T2dJMS9qWUNQZzVDR25ZdVhqNUdVa3BTT21ZdWVpNWFHbW9LZmdwNkdtb3VXQ1BDTEJaU0xsSStTa3BPVGpwT0xsWXVTaVpLSGxJZVVobytGaTQ2UGpZK05rWTJSakpDTGtJdVlocGFCbFk2UmpaS0xrZ2lMa29tU2lKS0lrb2FRaFk2TWtJeVJpNUNMbTRhWGdwT0JrbjZQZTRzSVpvc0Zjb3RyaEdOOWlvdUlpb2FKaDRxSGlvbUtpWXFJaW9hS2g0bUhpb2lLaVl1SGlvaUxoNHFJaTRtTENJS0xpL3RMQlE3N2xJdjN0eFdMa3BDUGxvMEk5eU9nelBjV0JZNlNrSStSaXdpTC9CTDdGVWNGaDRtSGlvaUxoNHVJakltT2lZNktqb3VQaTR5TGpZeU9DS1AzSXlQd0JZYVFpWkNMandnT2kvZkZGWXUxbDZ5am9xT2pyWmUyaTVhTGw0bVloNWVIbG9XV2hKYUVsSVdTaFpPRWtvV1NoSktTa3BHVGtwS1JsSkdXa2dpV2twYVJsNCtZajVlTmxvdTJpNjEvbzNPamRKZHFpMkdMWVhWZ1lHQUkrMGI3UUFXSGlJZUpob3VHaTRlTmg0NEkrMGIzUUFXSmpZbU5oNCtJam9hUmc1U0VsSVdWaFpTRmxZYVdoNW1HbUltWWk1Z0lzSXNWaTJ1Y2FhOW9DUGM2K3pUM092Y3pCYSt2bksyTHE0dWJpWmlIbDRlWGhwU0Zrb1NTZzVHQ2o0S1FnbzJDallPTmdZdUJpNEtMZ0lsL2hvQ0dnSVdDaEFpQmc0T0ZoSVNFaFlhRmhvYUlob2FKaFl1Rmk0YU5pSkNHa0lhUmhKR0Vrb09SZ1pPQ2tvQ1JnSkIva0lDTmdvc0lnWXVCaTRPSmdvbUNpWUtHZ29lRGhZU0VoWVNHZ29kL2gzK0pmb3Q3Q0E3N0pvdXlGWXY0QkFXTGtZMlJqNUdPa0pDUGtvMlBqWStNajRzSTk4Q0xCWStMajRxUGlaR0prSWVQaG8rRmpZV0xoUWlML0FRRmk0U0poWWVHaDRhR2g0V0lpSXFHaW9lTGdZdUVqb1NSQ1BzUzl3MzdFdnNOQllTRmc0aUNpNGVMaDR1SGpZU09obytJa0llUWlaR0xrZ2l3a3hYM0p2Y2hwSEwzRGZzSWkvZjMrN2lMaS92M0JRNW5pOHNWaS9jNUJZdVNqcEtRa0pDUWtvNlNpd2ozVkl1THdnV0xycGlwcEtTa3BLbVlyb3V2aTZsK3BIS2tjcGR0aTJnSWkwSUZpNGFLaG9lSWg0ZUhpWWFMQ0htTEJZYUxoNDJIajRlT2lwQ0xrQWlMMUFXTG40T2NmWnA5bVhxU2RvdDNpM3FFZlgxOGZJUjZpM2NJaTFTbml3V1NpNUtJa0lhUWhvNkVpNFFJaS9zNUJZdURpSVdHaG9hRmhJbUVpd2o3cDRzRmhJdUVqWWFSaHBDSWtZdVRDQTVualBlNkZZeVFrSTZValFqM0k2RE05eFlGajVLUGo1R0xrSXVRaDQrRUNNdjdGdmNqZGdXVWlaQ0lqWWFOaG9pRmhZVUlJeWFrK3lNRmpJV0tob21IaVlpSWlZYUxpSXVIakllTkNQc1V6L3NWUndXSGlZZUtpSXVIaTRlTmlZNkpqNHVRakpFSW8vY2pJL0FGaFpHSmtZMlFDUGVCK3owVm5JTGxXM3J4aUo2Wm1OVFMrd3lkZ3B4ZTU0djdwd1VPWjR2Q0ZZdjNTd1dMa0kyUGpvK1BqbytOa0lzSTNvc0ZrSXVQaVk2SWo0ZU5oNHVHQ0l2N1N3V0xob21IaDRlSWg0ZUtob3NJT0lzRmhvdUhqSWVQaUkrSmo0dVFDTEN2Rll1R2pJZVBoNDZJa0ltUWk1Q0xqNDJQam82UGpZK0xrSXVRaVpDSWpvZVBoNDJHaTRhTGhvbUloNGVJaW9hTGhnanZaeFdMOTBzRmk1Q05qNDZPajQrUGpaQ0xqNHlTa0pXV2xaYVZsNVNYbUp1Vmw1R1JqbzZPa0k2UmpaQ05rSXlQakk2TWtZMlRDSXlTakpHTWo0eVBqWkNPa1k2UmpwQ1BqbzZQajQyUWk1U0xrNHFTaVpLSmtZaVBpSkNJam9pUGhvNkdqWWVNaHdpTmg0eUdqSWFNaFl1SGk0aUxpSXVIaTRlTGc0dUVpWVNKaEltRmlZZUpoNG1GaDRXTGlvcUppb21KaUlxSmlva0lpNHFLaUlxSkNOcUxCWnFMbUlXV2dKYUFrSCtMZkl0NmhuMkFmNDZEallTTGhJdDloMzZDZjQrQmkzK0hnSW1BaFlLRWhJMTJobm1BZmdoL2ZYaURjb3NJWm9zRmZvdCtqSHlPZkk1L2pvT09nNDEvajMyUWM1TjhqNFNNaG91SGpZaU9oNCtKajR1UUNBNW5pL2M1Rll1R2pZYU9pSStIajRtUWl3amVpd1dRaTQrTmpvK1BqbzJRaTVBSWkvZEtCWXVRaVpDSGpvaVBoNDJHaXdnNGl3V0dpNGVKaDRlSWlJbUdpNFlJaS90S0JiRDNKaFdMa0l5UGo0K09qcENOa0l1UWk0K0pqNGlPaDQySGk0YUxob21IaUllSGg0ZUtob3VHaTRhTWlJK0hqNHFQaTVBSTcvc25GWXYzU3dXTGtJMlFqNDZPajQrTmtJdVNpNXFQbzVPWmtKZVBrNDZUalplT21vNmFqcGlNbUlzSXNJc0ZwSXVlZzVkOWxuNlFlb2wxa29TUmdvMkFqNENMZ0llQWxIK1Bmb3Q5aTRXSmhJaUNsb0NRZkl0N2kzeUZmb0dBQ0lDQWZvWjhpd2c4aXdXTWlJeUppNG1NaVl5SmpZbU1pSXlLaTRtUGhJMkdqWWVOaDQyR2pZT01oSXlFaTRTTGhvdUhpNGlMaVl1R2lvWUlpb1dLaG9tSGlvZUpoNGlHaDRlSWg0YUloNGlGaUlTSmhJbURpb0tMaG91SGpZaVBoNCtJajRpUmlKR0prSXFQQ0lxUGlwR0trb21UaXBHS2o0cU9pWkNKa1lpUWlKQ0lqb1dTZ1paK25JS1hnWmFCbG9HV2hKR0hpNGFMaDQySGp3aUlqb21RaTQ4SUR2aVVGUGlVRllzTUNnQUFBQUFEQWdBQmtBQUZBQUFCVEFGbUFBQUFSd0ZNQVdZQUFBRDFBQmtBaEFBQUFBQUFBQUFBQUFBQUFBQUFBQUVRQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQVBGbEFlRC80UC9nQWVBQUlBQUFBQUVBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUlBQUFBREFBQUFGQUFEQUFFQUFBQVVBQVFBa0FBQUFDQUFJQUFFQUFBQUFRQWc1Z1h3QnZBTjhDUHdMdkJ1OEhEd2l2Q1g4Snp4SS9GbC8vMy8vd0FBQUFBQUlPWUE4QVR3RFBBajhDN3didkJ3OElmd2wvQ2M4U1B4WlAvOS8vOEFBZi9qR2dRUUJoQUJEK3dQNGcrakQ2SVBqQStBRDN3TzlnNjJBQU1BQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQWYvL0FBOEFBUUFBQUFFQUFKclZsTEpmRHp6MUFBc0NBQUFBQUFEUC9HT0RBQUFBQU0vOFk0TUFBUC9iQWdBQjJ3QUFBQWdBQWdBQUFBQUFBQUFCQUFBQjRQL2dBQUFDQUFBQUFBQUNBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFIQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZHdBQUFIY0FBQUNBQUFqQVpNQUh3RkpBQUFCYmdBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFFQUFBQUNBQUFBQVc0QUFBSGNBQUFCM0FBQkFkd0FBQUhjQUFBQUFGQUFBQndBQUFBQUFBNEFyZ0FCQUFBQUFBQUJBQXdBQUFBQkFBQUFBQUFDQUE0QVFBQUJBQUFBQUFBREFBd0FJZ0FCQUFBQUFBQUVBQXdBVGdBQkFBQUFBQUFGQUJZQURBQUJBQUFBQUFBR0FBWUFMZ0FCQUFBQUFBQUtBRFFBV2dBREFBRUVDUUFCQUF3QUFBQURBQUVFQ1FBQ0FBNEFRQUFEQUFFRUNRQURBQXdBSWdBREFBRUVDUUFFQUF3QVRnQURBQUVFQ1FBRkFCWUFEQUFEQUFFRUNRQUdBQXdBTkFBREFBRUVDUUFLQURRQVdnQnlBR0VBZEFCcEFHNEFad0JXQUdVQWNnQnpBR2tBYndCdUFDQUFNUUF1QURBQWNnQmhBSFFBYVFCdUFHZHlZWFJwYm1jQWNnQmhBSFFBYVFCdUFHY0FVZ0JsQUdjQWRRQnNBR0VBY2dCeUFHRUFkQUJwQUc0QVp3QkdBRzhBYmdCMEFDQUFad0JsQUc0QVpRQnlBR0VBZEFCbEFHUUFJQUJpQUhrQUlBQkpBR01BYndCTkFHOEFid0J1QUM0QUF3QUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBmb3JtYXQoJ3dvZmYnKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWx9LnVpLnJhdGluZyAuaWNvbntmb250LWZhbWlseTpSYXRpbmc7bGluZS1oZWlnaHQ6MTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcn0udWkucmF0aW5nIC5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjAwNSd9LnVpLnJhdGluZyAuYWN0aXZlLmljb246YmVmb3Jle2NvbnRlbnQ6J1xcXFxmMDA1J30udWkuc3Rhci5yYXRpbmcgLmljb246YmVmb3Jle2NvbnRlbnQ6J1xcXFxmMDA1J30udWkuc3Rhci5yYXRpbmcgLmFjdGl2ZS5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjAwNSd9LnVpLnN0YXIucmF0aW5nIC5wYXJ0aWFsLmljb246YmVmb3Jle2NvbnRlbnQ6J1xcXFxmMDA2J30udWkuc3Rhci5yYXRpbmcgLnBhcnRpYWwuaWNvbntjb250ZW50OidcXFxcZjAwNSd9LnVpLmhlYXJ0LnJhdGluZyAuaWNvbjpiZWZvcmV7Y29udGVudDonXFxcXGYwMDQnfS51aS5oZWFydC5yYXRpbmcgLmFjdGl2ZS5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjAwNCd9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFNlYXJjaFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnNlYXJjaHtwb3NpdGlvbjpyZWxhdGl2ZX0udWkuc2VhcmNoPi5wcm9tcHR7bWFyZ2luOjA7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDApO3RleHQtc2hhZG93Om5vbmU7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbTtwYWRkaW5nOi42Nzg1NzE0M2VtIDFlbTtmb250LXNpemU6MWVtO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0Oy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2V9LnVpLnNlYXJjaCAucHJvbXB0e2JvcmRlci1yYWRpdXM6NTAwcmVtfS51aS5zZWFyY2ggLnByb21wdH4uc2VhcmNoLmljb257Y3Vyc29yOnBvaW50ZXJ9LnVpLnNlYXJjaD4ucmVzdWx0c3tkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwMCU7bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHRvcDt3aGl0ZS1zcGFjZTpub3JtYWw7dGV4dC1hbGlnbjpsZWZ0O3RleHQtdHJhbnNmb3JtOm5vbmU7YmFja2dyb3VuZDojZmZmO21hcmdpbi10b3A6LjVlbTt3aWR0aDoxOGVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNTt6LWluZGV4Ojk5OH0udWkuc2VhcmNoPi5yZXN1bHRzPjpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS5zZWFyY2g+LnJlc3VsdHM+Omxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHR7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47Zm9udC1zaXplOjFlbTtwYWRkaW5nOi44NTcxNDI4NmVtIDEuMTQyODU3MTRlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7bGluZS1oZWlnaHQ6MS4zMztib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKX0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQ6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOm5vbmUhaW1wb3J0YW50fS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdCAuaW1hZ2V7ZmxvYXQ6cmlnaHQ7b3ZlcmZsb3c6aGlkZGVuO2JhY2tncm91bmQ6MCAwO3dpZHRoOjVlbTtoZWlnaHQ6M2VtO2JvcmRlci1yYWRpdXM6LjI1ZW19LnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0IC5pbWFnZSBpbWd7ZGlzcGxheTpibG9jazt3aWR0aDphdXRvO2hlaWdodDoxMDAlfS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdCAuaW1hZ2UrLmNvbnRlbnR7bWFyZ2luOjAgNmVtIDAgMH0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQgLnRpdGxle21hcmdpbjotLjE0Mjg1NzE0ZW0gMCAwO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7Zm9udC1zaXplOjFlbTtjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0IC5kZXNjcmlwdGlvbnttYXJnaW4tdG9wOjA7Zm9udC1zaXplOi45Mjg1NzE0M2VtO2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdCAucHJpY2V7ZmxvYXQ6cmlnaHQ7Y29sb3I6IzIxYmE0NX0udWkuc2VhcmNoPi5yZXN1bHRzPi5tZXNzYWdle3BhZGRpbmc6MWVtIDFlbX0udWkuc2VhcmNoPi5yZXN1bHRzPi5tZXNzYWdlIC5oZWFkZXJ7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnNlYXJjaD4ucmVzdWx0cz4ubWVzc2FnZSAuZGVzY3JpcHRpb257bWFyZ2luLXRvcDouMjVyZW07Zm9udC1zaXplOjFlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnNlYXJjaD4ucmVzdWx0cz4uYWN0aW9ue2Rpc3BsYXk6YmxvY2s7Ym9yZGVyLXRvcDpub25lO2JhY2tncm91bmQ6I2YzZjRmNTtwYWRkaW5nOi45Mjg1NzE0M2VtIDFlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Zm9udC13ZWlnaHQ6NzAwO3RleHQtYWxpZ246Y2VudGVyfS51aS5zZWFyY2g+LnByb21wdDpmb2N1c3tib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMzUpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmxvYWRpbmcuc2VhcmNoIC5pbnB1dD5pLmljb246YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LS42NDI4NTcxNGVtIDAgMCAtLjY0Mjg1NzE0ZW07d2lkdGg6MS4yODU3MTQyOWVtO2hlaWdodDoxLjI4NTcxNDI5ZW07Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMSl9LnVpLmxvYWRpbmcuc2VhcmNoIC5pbnB1dD5pLmljb246YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjotLjY0Mjg1NzE0ZW0gMCAwIC0uNjQyODU3MTRlbTt3aWR0aDoxLjI4NTcxNDI5ZW07aGVpZ2h0OjEuMjg1NzE0MjllbTstd2Via2l0LWFuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50fS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5IC5yZXN1bHQ6aG92ZXIsLnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0OmhvdmVye2JhY2tncm91bmQ6I2Y5ZmFmYn0udWkuc2VhcmNoIC5hY3Rpb246aG92ZXJ7YmFja2dyb3VuZDojZTBlMGUwfS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5LmFjdGl2ZXtiYWNrZ3JvdW5kOiNmM2Y0ZjV9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnkuYWN0aXZlPi5uYW1le2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeSAucmVzdWx0LmFjdGl2ZSwudWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQuYWN0aXZle3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpO2JhY2tncm91bmQ6I2YzZjRmNTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0LmFjdGl2ZSAudGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdC5hY3RpdmUgLmRlc2NyaXB0aW9ue2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuZGlzYWJsZWQuc2VhcmNoe2N1cnNvcjpkZWZhdWx0O3BvaW50ZXItZXZlbnRzOm5vbmU7b3BhY2l0eTouNDV9LnVpLnNlYXJjaC5zZWxlY3Rpb24gLnByb21wdHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuc2VhcmNoLnNlbGVjdGlvbj4uaWNvbi5pbnB1dD4ucmVtb3ZlLmljb257cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OmF1dG87b3BhY2l0eTowO2NvbG9yOicnO3RvcDowO3JpZ2h0OjA7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlfS51aS5zZWFyY2guc2VsZWN0aW9uPi5pY29uLmlucHV0Pi5hY3RpdmUucmVtb3ZlLmljb257Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouODtwb2ludGVyLWV2ZW50czphdXRvfS51aS5zZWFyY2guc2VsZWN0aW9uPi5pY29uLmlucHV0Om5vdChbY2xhc3MqPVxcXCJsZWZ0IGljb25cXFwiXSk+Lmljb25+LnJlbW92ZS5pY29ue3JpZ2h0OjEuODU3MTRlbX0udWkuc2VhcmNoLnNlbGVjdGlvbj4uaWNvbi5pbnB1dD4ucmVtb3ZlLmljb246aG92ZXJ7b3BhY2l0eToxO2NvbG9yOiNkYjI4Mjh9LnVpLmNhdGVnb3J5LnNlYXJjaCAucmVzdWx0c3t3aWR0aDoyOGVtfS51aS5jYXRlZ29yeS5zZWFyY2ggLnJlc3VsdHMuYW5pbWF0aW5nLC51aS5jYXRlZ29yeS5zZWFyY2ggLnJlc3VsdHMudmlzaWJsZXtkaXNwbGF5OnRhYmxlfS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5e2Rpc3BsYXk6dGFibGUtcm93O2JhY2tncm91bmQ6I2YzZjRmNTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2V9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnk6bGFzdC1jaGlsZHtib3JkZXItYm90dG9tOm5vbmV9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnk6Zmlyc3QtY2hpbGQgLm5hbWUrLnJlc3VsdHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIDAgMH0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeTpsYXN0LWNoaWxkIC5yZXN1bHQ6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gMH0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeT4ubmFtZXtkaXNwbGF5OnRhYmxlLWNlbGw7dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aWR0aDoxMDBweDt3aGl0ZS1zcGFjZTpub3dyYXA7YmFja2dyb3VuZDowIDA7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxZW07cGFkZGluZzouNGVtIDFlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuNCk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSl9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnkgLnJlc3VsdHN7ZGlzcGxheTp0YWJsZS1jZWxsO2JhY2tncm91bmQ6I2ZmZjtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpfS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5IC5yZXN1bHR7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSk7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2U7cGFkZGluZzouODU3MTQyODZlbSAxLjE0Mjg1NzE0ZW19LnVpW2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0uc2VhcmNoPi5yZXN1bHRze3JpZ2h0OmF1dG87bGVmdDowfS51aVtjbGFzcyo9XFxcInJpZ2h0IGFsaWduZWRcXFwiXS5zZWFyY2g+LnJlc3VsdHN7cmlnaHQ6MDtsZWZ0OmF1dG99LnVpLmZsdWlkLnNlYXJjaCAucmVzdWx0c3t3aWR0aDoxMDAlfS51aS5taW5pLnNlYXJjaHtmb250LXNpemU6Ljc4NTcxNDI5ZW19LnVpLnNtYWxsLnNlYXJjaHtmb250LXNpemU6LjkyODU3MTQzZW19LnVpLnNlYXJjaHtmb250LXNpemU6MWVtfS51aS5sYXJnZS5zZWFyY2h7Zm9udC1zaXplOjEuMTQyODU3MTRlbX0udWkuYmlnLnNlYXJjaHtmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5odWdlLnNlYXJjaHtmb250LXNpemU6MS40Mjg1NzE0M2VtfS51aS5tYXNzaXZlLnNlYXJjaHtmb250LXNpemU6MS43MTQyODU3MWVtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnNlYXJjaCAucmVzdWx0c3ttYXgtd2lkdGg6Y2FsYygxMDB2dyAtIDJyZW0pfX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gU2hhcGVcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5zaGFwZXtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjp0b3A7ZGlzcGxheTppbmxpbmUtYmxvY2s7LXdlYmtpdC1wZXJzcGVjdGl2ZToyMDAwcHg7cGVyc3BlY3RpdmU6MjAwMHB4Oy13ZWJraXQtdHJhbnNpdGlvbjpsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dCwtd2Via2l0LXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dCwtd2Via2l0LXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0LGxlZnQgLjZzIGVhc2UtaW4tb3V0LHdpZHRoIC42cyBlYXNlLWluLW91dCxoZWlnaHQgLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246dHJhbnNmb3JtIC42cyBlYXNlLWluLW91dCxsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dCwtd2Via2l0LXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXR9LnVpLnNoYXBlIC5zaWRlc3std2Via2l0LXRyYW5zZm9ybS1zdHlsZTpwcmVzZXJ2ZS0zZDt0cmFuc2Zvcm0tc3R5bGU6cHJlc2VydmUtM2R9LnVpLnNoYXBlIC5zaWRle29wYWNpdHk6MTt3aWR0aDoxMDAlO21hcmdpbjowIWltcG9ydGFudDstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS51aS5zaGFwZSAuc2lkZXtkaXNwbGF5Om5vbmV9LnVpLnNoYXBlIC5zaWRlICp7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50O2JhY2tmYWNlLXZpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnR9LnVpLmN1YmUuc2hhcGUgLnNpZGV7bWluLXdpZHRoOjE1ZW07aGVpZ2h0OjE1ZW07cGFkZGluZzoyZW07YmFja2dyb3VuZC1jb2xvcjojZTZlNmU2O2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDJweCByZ2JhKDAsMCwwLC4zKTtib3gtc2hhZG93OjAgMCAycHggcmdiYSgwLDAsMCwuMyl9LnVpLmN1YmUuc2hhcGUgLnNpZGU+LmNvbnRlbnR7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtkaXNwbGF5OnRhYmxlO3RleHQtYWxpZ246Y2VudGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6dGV4dDstbXMtdXNlci1zZWxlY3Q6dGV4dDt1c2VyLXNlbGVjdDp0ZXh0fS51aS5jdWJlLnNoYXBlIC5zaWRlPi5jb250ZW50PmRpdntkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToyZW19LnVpLnRleHQuc2hhcGUuYW5pbWF0aW5nIC5zaWRlc3twb3NpdGlvbjpzdGF0aWN9LnVpLnRleHQuc2hhcGUgLnNpZGV7d2hpdGUtc3BhY2U6bm93cmFwfS51aS50ZXh0LnNoYXBlIC5zaWRlPip7d2hpdGUtc3BhY2U6bm9ybWFsfS51aS5sb2FkaW5nLnNoYXBle3Bvc2l0aW9uOmFic29sdXRlO3RvcDotOTk5OXB4O2xlZnQ6LTk5OTlweH0udWkuc2hhcGUgLmFuaW1hdGluZy5zaWRle3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtkaXNwbGF5OmJsb2NrO3otaW5kZXg6MTAwfS51aS5zaGFwZSAuaGlkZGVuLnNpZGV7b3BhY2l0eTouNn0udWkuc2hhcGUuYW5pbWF0aW5nIC5zaWRlc3twb3NpdGlvbjphYnNvbHV0ZX0udWkuc2hhcGUuYW5pbWF0aW5nIC5zaWRlc3std2Via2l0LXRyYW5zaXRpb246bGVmdCAuNnMgZWFzZS1pbi1vdXQsd2lkdGggLjZzIGVhc2UtaW4tb3V0LGhlaWdodCAuNnMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246bGVmdCAuNnMgZWFzZS1pbi1vdXQsd2lkdGggLjZzIGVhc2UtaW4tb3V0LGhlaWdodCAuNnMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246dHJhbnNmb3JtIC42cyBlYXNlLWluLW91dCxsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQsbGVmdCAuNnMgZWFzZS1pbi1vdXQsd2lkdGggLjZzIGVhc2UtaW4tb3V0LGhlaWdodCAuNnMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0fS51aS5zaGFwZS5hbmltYXRpbmcgLnNpZGV7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZS1pbi1vdXR9LnVpLnNoYXBlIC5hY3RpdmUuc2lkZXtkaXNwbGF5OmJsb2NrfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBTaWRlYmFyXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuc2lkZWJhcntwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb246bm9uZTt0cmFuc2l0aW9uOm5vbmU7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3Zpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO2hlaWdodDoxMDAlIWltcG9ydGFudDttYXgtaGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7b3ZlcmZsb3cteTphdXRvIWltcG9ydGFudDt6LWluZGV4OjEwMn0udWkuc2lkZWJhcj4qey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW59LnVpLmxlZnQuc2lkZWJhcntyaWdodDphdXRvO2xlZnQ6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTAwJSwwLDApfS51aS5yaWdodC5zaWRlYmFye3JpZ2h0OjAhaW1wb3J0YW50O2xlZnQ6YXV0byFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCl9LnVpLmJvdHRvbS5zaWRlYmFyLC51aS50b3Auc2lkZWJhcnt3aWR0aDoxMDAlIWltcG9ydGFudDtoZWlnaHQ6YXV0byFpbXBvcnRhbnR9LnVpLnRvcC5zaWRlYmFye3RvcDowIWltcG9ydGFudDtib3R0b206YXV0byFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTAwJSwwKX0udWkuYm90dG9tLnNpZGViYXJ7dG9wOmF1dG8haW1wb3J0YW50O2JvdHRvbTowIWltcG9ydGFudDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKX0ucHVzaGFibGV7aGVpZ2h0OjEwMCU7b3ZlcmZsb3cteDpoaWRkZW47cGFkZGluZzowIWltcG9ydGFudH1ib2R5LnB1c2hhYmxle2JhY2tncm91bmQ6IzU0NTQ1NCFpbXBvcnRhbnR9LnB1c2hhYmxlOm5vdChib2R5KXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0ucHVzaGFibGU6bm90KGJvZHkpPi5maXhlZCwucHVzaGFibGU6bm90KGJvZHkpPi5wdXNoZXI6YWZ0ZXIsLnB1c2hhYmxlOm5vdChib2R5KT4udWkuc2lkZWJhcntwb3NpdGlvbjphYnNvbHV0ZX0ucHVzaGFibGU+LmZpeGVke3Bvc2l0aW9uOmZpeGVkOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsIC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3dpbGwtY2hhbmdlOnRyYW5zZm9ybTt6LWluZGV4OjEwMX0ucHVzaGFibGU+LnB1c2hlcntwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO292ZXJmbG93OmhpZGRlbjttaW4taGVpZ2h0OjEwMCU7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsIC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3otaW5kZXg6Mn1ib2R5LnB1c2hhYmxlPi5wdXNoZXJ7YmFja2dyb3VuZDojZmZmfS5wdXNoYWJsZT4ucHVzaGVye2JhY2tncm91bmQ6aW5oZXJpdH0ucHVzaGFibGU+LnB1c2hlcjphZnRlcntwb3NpdGlvbjpmaXhlZDt0b3A6MDtyaWdodDowO2NvbnRlbnQ6Jyc7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40KTtvdmVyZmxvdzpoaWRkZW47b3BhY2l0eTowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41czt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzO3dpbGwtY2hhbmdlOm9wYWNpdHk7ei1pbmRleDoxMDAwfS51aS5zaWRlYmFyLm1lbnUgLml0ZW17Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudH0ucHVzaGFibGU+LnB1c2hlci5kaW1tZWQ6YWZ0ZXJ7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7aGVpZ2h0OjEwMCUhaW1wb3J0YW50O29wYWNpdHk6MSFpbXBvcnRhbnR9LnVpLmFuaW1hdGluZy5zaWRlYmFye3Zpc2liaWxpdHk6dmlzaWJsZX0udWkudmlzaWJsZS5zaWRlYmFye3Zpc2liaWxpdHk6dmlzaWJsZTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkubGVmdC52aXNpYmxlLnNpZGViYXIsLnVpLnJpZ2h0LnZpc2libGUuc2lkZWJhcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDIwcHggcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAwIDIwcHggcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ib3R0b20udmlzaWJsZS5zaWRlYmFyLC51aS50b3AudmlzaWJsZS5zaWRlYmFyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMjBweCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDAgMjBweCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnZpc2libGUubGVmdC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNjBweCwwLDApfS51aS52aXNpYmxlLnJpZ2h0LnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjYwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI2MHB4LDAsMCl9LnVpLnZpc2libGUudG9wLnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLnRvcC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzNnB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDM2cHgsMCl9LnVpLnZpc2libGUuYm90dG9tLnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLmJvdHRvbS5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzZweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzZweCwwKX0udWkudmlzaWJsZS5sZWZ0LnNpZGViYXJ+LnVpLnZpc2libGUucmlnaHQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUubGVmdC5zaWRlYmFyfi51aS52aXNpYmxlLnJpZ2h0LnNpZGViYXJ+LnB1c2hlciwudWkudmlzaWJsZS5yaWdodC5zaWRlYmFyfi51aS52aXNpYmxlLmxlZnQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUucmlnaHQuc2lkZWJhcn4udWkudmlzaWJsZS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudGhpbi5sZWZ0LnNpZGViYXIsLnVpLnRoaW4ucmlnaHQuc2lkZWJhcnt3aWR0aDoxNTBweH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHRoaW5cXFwiXS5sZWZ0LnNpZGViYXIsLnVpW2NsYXNzKj1cXFwidmVyeSB0aGluXFxcIl0ucmlnaHQuc2lkZWJhcnt3aWR0aDo2MHB4fS51aS5sZWZ0LnNpZGViYXIsLnVpLnJpZ2h0LnNpZGViYXJ7d2lkdGg6MjYwcHh9LnVpLndpZGUubGVmdC5zaWRlYmFyLC51aS53aWRlLnJpZ2h0LnNpZGViYXJ7d2lkdGg6MzUwcHh9LnVpW2NsYXNzKj1cXFwidmVyeSB3aWRlXFxcIl0ubGVmdC5zaWRlYmFyLC51aVtjbGFzcyo9XFxcInZlcnkgd2lkZVxcXCJdLnJpZ2h0LnNpZGViYXJ7d2lkdGg6NDc1cHh9LnVpLnZpc2libGUudGhpbi5sZWZ0LnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLnRoaW4ubGVmdC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTUwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTUwcHgsMCwwKX0udWkudmlzaWJsZVtjbGFzcyo9XFxcInZlcnkgdGhpblxcXCJdLmxlZnQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGVbY2xhc3MqPVxcXCJ2ZXJ5IHRoaW5cXFwiXS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCg2MHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDYwcHgsMCwwKX0udWkudmlzaWJsZS53aWRlLmxlZnQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUud2lkZS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzNTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgzNTBweCwwLDApfS51aS52aXNpYmxlW2NsYXNzKj1cXFwidmVyeSB3aWRlXFxcIl0ubGVmdC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZVtjbGFzcyo9XFxcInZlcnkgd2lkZVxcXCJdLmxlZnQuc2lkZWJhcn4ucHVzaGVyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDQ3NXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDQ3NXB4LDAsMCl9LnVpLnZpc2libGUudGhpbi5yaWdodC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZS50aGluLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTE1MHB4LDAsMCl9LnVpLnZpc2libGVbY2xhc3MqPVxcXCJ2ZXJ5IHRoaW5cXFwiXS5yaWdodC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZVtjbGFzcyo9XFxcInZlcnkgdGhpblxcXCJdLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNjBweCwwLDApfS51aS52aXNpYmxlLndpZGUucmlnaHQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUud2lkZS5yaWdodC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTM1MHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zNTBweCwwLDApfS51aS52aXNpYmxlW2NsYXNzKj1cXFwidmVyeSB3aWRlXFxcIl0ucmlnaHQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGVbY2xhc3MqPVxcXCJ2ZXJ5IHdpZGVcXFwiXS5yaWdodC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTQ3NXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC00NzVweCwwLDApfS51aS5vdmVybGF5LnNpZGViYXJ7ei1pbmRleDoxMDJ9LnVpLmxlZnQub3ZlcmxheS5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9LnVpLnJpZ2h0Lm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0udWkudG9wLm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfS51aS5ib3R0b20ub3ZlcmxheS5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfS5hbmltYXRpbmcudWkub3ZlcmxheS5zaWRlYmFyLC51aS52aXNpYmxlLm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwgLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2V9LnVpLnZpc2libGUubGVmdC5vdmVybGF5LnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9LnVpLnZpc2libGUucmlnaHQub3ZlcmxheS5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfS51aS52aXNpYmxlLnRvcC5vdmVybGF5LnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9LnVpLnZpc2libGUuYm90dG9tLm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudmlzaWJsZS5vdmVybGF5LnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLm92ZXJsYXkuc2lkZWJhcn4ucHVzaGVyey13ZWJraXQtdHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50O3RyYW5zZm9ybTpub25lIWltcG9ydGFudH0udWkucHVzaC5zaWRlYmFyey13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLCAtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt6LWluZGV4OjEwMn0udWkubGVmdC5wdXNoLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0udWkucmlnaHQucHVzaC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfS51aS50b3AucHVzaC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9LnVpLmJvdHRvbS5wdXNoLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9LnVpLnZpc2libGUucHVzaC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfS51aS51bmNvdmVyLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7ei1pbmRleDoxfS51aS52aXNpYmxlLnVuY292ZXIuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwgLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2V9LnVpLnNsaWRlLmFsb25nLnNpZGViYXJ7ei1pbmRleDoxfS51aS5sZWZ0LnNsaWRlLmFsb25nLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNTAlLDAsMCl9LnVpLnJpZ2h0LnNsaWRlLmFsb25nLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNTAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDUwJSwwLDApfS51aS50b3Auc2xpZGUuYWxvbmcuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01MCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTUwJSwwKX0udWkuYm90dG9tLnNsaWRlLmFsb25nLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1MCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNTAlLDApfS51aS5hbmltYXRpbmcuc2xpZGUuYWxvbmcuc2lkZWJhcnstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwgLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2V9LnVpLnZpc2libGUuc2xpZGUuYWxvbmcuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkuc2xpZGUub3V0LnNpZGViYXJ7ei1pbmRleDoxfS51aS5sZWZ0LnNsaWRlLm91dC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDUwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCg1MCUsMCwwKX0udWkucmlnaHQuc2xpZGUub3V0LnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNTAlLDAsMCl9LnVpLnRvcC5zbGlkZS5vdXQuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDUwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1MCUsMCl9LnVpLmJvdHRvbS5zbGlkZS5vdXQuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01MCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTUwJSwwKX0udWkuYW5pbWF0aW5nLnNsaWRlLm91dC5zaWRlYmFyey13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLCAtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZX0udWkudmlzaWJsZS5zbGlkZS5vdXQuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkuc2NhbGUuZG93bi5zaWRlYmFyey13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLCAtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt6LWluZGV4OjEwMn0udWkubGVmdC5zY2FsZS5kb3duLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0udWkucmlnaHQuc2NhbGUuZG93bi5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfS51aS50b3Auc2NhbGUuZG93bi5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9LnVpLmJvdHRvbS5zY2FsZS5kb3duLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9LnVpLnNjYWxlLmRvd24ubGVmdC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOjc1JSA1MCU7dHJhbnNmb3JtLW9yaWdpbjo3NSUgNTAlfS51aS5zY2FsZS5kb3duLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46MjUlIDUwJTt0cmFuc2Zvcm0tb3JpZ2luOjI1JSA1MCV9LnVpLnNjYWxlLmRvd24udG9wLnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46NTAlIDc1JTt0cmFuc2Zvcm0tb3JpZ2luOjUwJSA3NSV9LnVpLnNjYWxlLmRvd24uYm90dG9tLnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46NTAlIDI1JTt0cmFuc2Zvcm0tb3JpZ2luOjUwJSAyNSV9LnVpLmFuaW1hdGluZy5zY2FsZS5kb3duPi52aXNpYmxlLnVpLnNpZGViYXJ7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsIC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlfS51aS5hbmltYXRpbmcuc2NhbGUuZG93bi5zaWRlYmFyfi5wdXNoZXIsLnVpLnZpc2libGUuc2NhbGUuZG93bi5zaWRlYmFyfi5wdXNoZXJ7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW4haW1wb3J0YW50fS51aS52aXNpYmxlLnNjYWxlLmRvd24uc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudmlzaWJsZS5zY2FsZS5kb3duLnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNzUpO3RyYW5zZm9ybTpzY2FsZSguNzUpfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBTdGlja3lcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5zdGlja3l7cG9zaXRpb246c3RhdGljOy13ZWJraXQtdHJhbnNpdGlvbjpub25lO3RyYW5zaXRpb246bm9uZTt6LWluZGV4OjgwMH0udWkuc3RpY2t5LmJvdW5ke3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6YXV0bztyaWdodDphdXRvfS51aS5zdGlja3kuZml4ZWR7cG9zaXRpb246Zml4ZWQ7bGVmdDphdXRvO3JpZ2h0OmF1dG99LnVpLnN0aWNreS5ib3VuZC50b3AsLnVpLnN0aWNreS5maXhlZC50b3B7dG9wOjA7Ym90dG9tOmF1dG99LnVpLnN0aWNreS5ib3VuZC5ib3R0b20sLnVpLnN0aWNreS5maXhlZC5ib3R0b217dG9wOmF1dG87Ym90dG9tOjB9LnVpLm5hdGl2ZS5zdGlja3l7cG9zaXRpb246LW1vei1zdGlja3k7cG9zaXRpb246LW1zLXN0aWNreTtwb3NpdGlvbjotby1zdGlja3k7cG9zaXRpb246c3RpY2t5fS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBUYWJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS50YWJ7ZGlzcGxheTpub25lfS51aS50YWIuYWN0aXZlLC51aS50YWIub3BlbntkaXNwbGF5OmJsb2NrfS51aS50YWIubG9hZGluZ3twb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpibG9jazttaW4taGVpZ2h0OjI1MHB4fS51aS50YWIubG9hZGluZyAqe3Bvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudDtsZWZ0Oi0xMDAwMHB4IWltcG9ydGFudH0udWkudGFiLmxvYWRpbmcuc2VnbWVudDpiZWZvcmUsLnVpLnRhYi5sb2FkaW5nOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDoxMDBweDtsZWZ0OjUwJTttYXJnaW46LTEuMjVlbSAwIDAgLTEuMjVlbTt3aWR0aDoyLjVlbTtoZWlnaHQ6Mi41ZW07Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMSl9LnVpLnRhYi5sb2FkaW5nLnNlZ21lbnQ6YWZ0ZXIsLnVpLnRhYi5sb2FkaW5nOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjEwMHB4O2xlZnQ6NTAlO21hcmdpbjotMS4yNWVtIDAgMCAtMS4yNWVtO3dpZHRoOjIuNWVtO2hlaWdodDoyLjVlbTstd2Via2l0LWFuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50fS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBUcmFuc2l0aW9uXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OjE7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246LjNzO2FuaW1hdGlvbi1kdXJhdGlvbjouM3M7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjplYXNlOy13ZWJraXQtYW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoO2FuaW1hdGlvbi1maWxsLW1vZGU6Ym90aH0uYW5pbWF0aW5nLnRyYW5zaXRpb257LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjt2aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50fS5sb2FkaW5nLnRyYW5zaXRpb257cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5OXB4O2xlZnQ6LTk5OTk5cHh9LmhpZGRlbi50cmFuc2l0aW9ue2Rpc3BsYXk6bm9uZTt2aXNpYmlsaXR5OmhpZGRlbn0udmlzaWJsZS50cmFuc2l0aW9ue2Rpc3BsYXk6YmxvY2shaW1wb3J0YW50O3Zpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnR9LmRpc2FibGVkLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24tcGxheS1zdGF0ZTpwYXVzZWQ7YW5pbWF0aW9uLXBsYXktc3RhdGU6cGF1c2VkfS5sb29waW5nLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGV9LnRyYW5zaXRpb24uYnJvd3Nley13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi41czthbmltYXRpb24tZHVyYXRpb246LjVzfS50cmFuc2l0aW9uLmJyb3dzZS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJyb3dzZUluO2FuaW1hdGlvbi1uYW1lOmJyb3dzZUlufS50cmFuc2l0aW9uLmJyb3dzZS5sZWZ0Lm91dCwudHJhbnNpdGlvbi5icm93c2Uub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6YnJvd3NlT3V0TGVmdDthbmltYXRpb24tbmFtZTpicm93c2VPdXRMZWZ0fS50cmFuc2l0aW9uLmJyb3dzZS5yaWdodC5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpicm93c2VPdXRSaWdodDthbmltYXRpb24tbmFtZTpicm93c2VPdXRSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgYnJvd3NlSW57MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjgpIHRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnNjYWxlKC44KSB0cmFuc2xhdGVaKDApO3otaW5kZXg6LTF9MTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44KSB0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlWigwKTt6LWluZGV4Oi0xO29wYWNpdHk6Ljd9ODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMDUpIHRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnNjYWxlKDEuMDUpIHRyYW5zbGF0ZVooMCk7b3BhY2l0eToxO3otaW5kZXg6OTk5fTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSkgdHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06c2NhbGUoMSkgdHJhbnNsYXRlWigwKTt6LWluZGV4Ojk5OX19QGtleWZyYW1lcyBicm93c2VJbnswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06c2NhbGUoLjgpIHRyYW5zbGF0ZVooMCk7ei1pbmRleDotMX0xMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjgpIHRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnNjYWxlKC44KSB0cmFuc2xhdGVaKDApO3otaW5kZXg6LTE7b3BhY2l0eTouN304MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSkgdHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06c2NhbGUoMS4wNSkgdHJhbnNsYXRlWigwKTtvcGFjaXR5OjE7ei1pbmRleDo5OTl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKSB0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTpzY2FsZSgxKSB0cmFuc2xhdGVaKDApO3otaW5kZXg6OTk5fX1ALXdlYmtpdC1rZXlmcmFtZXMgYnJvd3NlT3V0TGVmdHswJXt6LWluZGV4Ojk5OTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCl9NTAle3otaW5kZXg6LTE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwNSUpIHJvdGF0ZVkoMzVkZWcpIHJvdGF0ZVgoMTBkZWcpIHRyYW5zbGF0ZVooLTEwcHgpfTgwJXtvcGFjaXR5OjF9MTAwJXt6LWluZGV4Oi0xOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApIHRyYW5zbGF0ZVooLTEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKSB0cmFuc2xhdGVaKC0xMHB4KTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgYnJvd3NlT3V0TGVmdHswJXt6LWluZGV4Ojk5OTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCl9NTAle3otaW5kZXg6LTE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwNSUpIHJvdGF0ZVkoMzVkZWcpIHJvdGF0ZVgoMTBkZWcpIHRyYW5zbGF0ZVooLTEwcHgpfTgwJXtvcGFjaXR5OjF9MTAwJXt6LWluZGV4Oi0xOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApIHRyYW5zbGF0ZVooLTEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKSB0cmFuc2xhdGVaKC0xMHB4KTtvcGFjaXR5OjB9fUAtd2Via2l0LWtleWZyYW1lcyBicm93c2VPdXRSaWdodHswJXt6LWluZGV4Ojk5OTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCl9NTAle3otaW5kZXg6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwNSUpIHJvdGF0ZVkoMzVkZWcpIHJvdGF0ZVgoMTBkZWcpIHRyYW5zbGF0ZVooLTEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwNSUpIHJvdGF0ZVkoMzVkZWcpIHJvdGF0ZVgoMTBkZWcpIHRyYW5zbGF0ZVooLTEwcHgpfTgwJXtvcGFjaXR5OjF9MTAwJXt6LWluZGV4OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCkgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApIHRyYW5zbGF0ZVooLTEwcHgpO29wYWNpdHk6MH19QGtleWZyYW1lcyBicm93c2VPdXRSaWdodHswJXt6LWluZGV4Ojk5OTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCl9NTAle3otaW5kZXg6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwNSUpIHJvdGF0ZVkoMzVkZWcpIHJvdGF0ZVgoMTBkZWcpIHRyYW5zbGF0ZVooLTEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwNSUpIHJvdGF0ZVkoMzVkZWcpIHJvdGF0ZVgoMTBkZWcpIHRyYW5zbGF0ZVooLTEwcHgpfTgwJXtvcGFjaXR5OjF9MTAwJXt6LWluZGV4OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCkgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApIHRyYW5zbGF0ZVooLTEwcHgpO29wYWNpdHk6MH19LmRyb3AudHJhbnNpdGlvbnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246LjRzO2FuaW1hdGlvbi1kdXJhdGlvbjouNHM7LXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMzQsMS42MSwuNywxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMzQsMS42MSwuNywxKX0uZHJvcC50cmFuc2l0aW9uLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZHJvcEluO2FuaW1hdGlvbi1uYW1lOmRyb3BJbn0uZHJvcC50cmFuc2l0aW9uLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmRyb3BPdXQ7YW5pbWF0aW9uLW5hbWU6ZHJvcE91dH1ALXdlYmtpdC1rZXlmcmFtZXMgZHJvcEluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIGRyb3BJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIGRyb3BPdXR7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9fUBrZXlmcmFtZXMgZHJvcE91dHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19LnRyYW5zaXRpb24uZmFkZS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbjthbmltYXRpb24tbmFtZTpmYWRlSW59LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmYWRlIHVwXFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5VcDthbmltYXRpb24tbmFtZTpmYWRlSW5VcH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZhZGUgZG93blxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluRG93bjthbmltYXRpb24tbmFtZTpmYWRlSW5Eb3dufS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmFkZSBsZWZ0XFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5MZWZ0O2FuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmYWRlIHJpZ2h0XFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5SaWdodDthbmltYXRpb24tbmFtZTpmYWRlSW5SaWdodH0udHJhbnNpdGlvbi5mYWRlLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZhZGUgdXBcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0VXA7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dFVwfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmFkZSBkb3duXFxcIl0ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd247YW5pbWF0aW9uLW5hbWU6ZmFkZU91dERvd259LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmYWRlIGxlZnRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdDthbmltYXRpb24tbmFtZTpmYWRlT3V0TGVmdH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZhZGUgcmlnaHRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0UmlnaHQ7YW5pbWF0aW9uLW5hbWU6ZmFkZU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW57MCV7b3BhY2l0eTowfTEwMCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5VcHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgxMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwJSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19QGtleWZyYW1lcyBmYWRlSW5VcHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgxMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwJSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwJSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19QGtleWZyYW1lcyBmYWRlSW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMCUpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5MZWZ0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAlKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGZhZGVJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMCUpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlSW5SaWdodHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAlKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfX1Aa2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMCUpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QGtleWZyYW1lcyBmYWRlT3V0ezAle29wYWNpdHk6MX0xMDAle29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRVcHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSg1JSl9fUBrZXlmcmFtZXMgZmFkZU91dFVwezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDUlKX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXREb3duezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNSUpfX1Aa2V5ZnJhbWVzIGZhZGVPdXREb3duezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNSUpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dExlZnR7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCg1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNSUpfX1Aa2V5ZnJhbWVzIGZhZGVPdXRMZWZ0ezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDUlKX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXRSaWdodHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUlKX19QGtleWZyYW1lcyBmYWRlT3V0UmlnaHR7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01JSl9fS5mbGlwLnRyYW5zaXRpb24uaW4sLmZsaXAudHJhbnNpdGlvbi5vdXR7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246LjZzO2FuaW1hdGlvbi1kdXJhdGlvbjouNnN9Lmhvcml6b250YWwuZmxpcC50cmFuc2l0aW9uLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6aG9yaXpvbnRhbEZsaXBJbjthbmltYXRpb24tbmFtZTpob3Jpem9udGFsRmxpcElufS5ob3Jpem9udGFsLmZsaXAudHJhbnNpdGlvbi5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpob3Jpem9udGFsRmxpcE91dDthbmltYXRpb24tbmFtZTpob3Jpem9udGFsRmxpcE91dH0udmVydGljYWwuZmxpcC50cmFuc2l0aW9uLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6dmVydGljYWxGbGlwSW47YW5pbWF0aW9uLW5hbWU6dmVydGljYWxGbGlwSW59LnZlcnRpY2FsLmZsaXAudHJhbnNpdGlvbi5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp2ZXJ0aWNhbEZsaXBPdXQ7YW5pbWF0aW9uLW5hbWU6dmVydGljYWxGbGlwT3V0fUAtd2Via2l0LWtleWZyYW1lcyBob3Jpem9udGFsRmxpcEluezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgwKTtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgaG9yaXpvbnRhbEZsaXBJbnswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKC05MGRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgdmVydGljYWxGbGlwSW57MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyB2ZXJ0aWNhbEZsaXBJbnswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgaG9yaXpvbnRhbEZsaXBPdXR7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDkwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgaG9yaXpvbnRhbEZsaXBPdXR7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDkwZGVnKTtvcGFjaXR5OjB9fUAtd2Via2l0LWtleWZyYW1lcyB2ZXJ0aWNhbEZsaXBPdXR7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyB2ZXJ0aWNhbEZsaXBPdXR7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO29wYWNpdHk6MH19LnNjYWxlLnRyYW5zaXRpb24uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzY2FsZUluO2FuaW1hdGlvbi1uYW1lOnNjYWxlSW59LnNjYWxlLnRyYW5zaXRpb24ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2NhbGVPdXQ7YW5pbWF0aW9uLW5hbWU6c2NhbGVPdXR9QC13ZWJraXQta2V5ZnJhbWVzIHNjYWxlSW57MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44KTt0cmFuc2Zvcm06c2NhbGUoLjgpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QGtleWZyYW1lcyBzY2FsZUluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOCk7dHJhbnNmb3JtOnNjYWxlKC44KX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fUAtd2Via2l0LWtleWZyYW1lcyBzY2FsZU91dHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC45KTt0cmFuc2Zvcm06c2NhbGUoLjkpfX1Aa2V5ZnJhbWVzIHNjYWxlT3V0ezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjkpO3RyYW5zZm9ybTpzY2FsZSguOSl9fS50cmFuc2l0aW9uLmZseXstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouNnM7YW5pbWF0aW9uLWR1cmF0aW9uOi42czstd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMjE1LC42MSwuMzU1LDEpfS50cmFuc2l0aW9uLmZseS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseUluO2FuaW1hdGlvbi1uYW1lOmZseUlufS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmx5IHVwXFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlJblVwO2FuaW1hdGlvbi1uYW1lOmZseUluVXB9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmbHkgZG93blxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmx5SW5Eb3duO2FuaW1hdGlvbi1uYW1lOmZseUluRG93bn0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZseSBsZWZ0XFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6Zmx5SW5MZWZ0fS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmx5IHJpZ2h0XFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlJblJpZ2h0O2FuaW1hdGlvbi1uYW1lOmZseUluUmlnaHR9LnRyYW5zaXRpb24uZmx5Lm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseU91dDthbmltYXRpb24tbmFtZTpmbHlPdXR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmbHkgdXBcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlPdXRVcDthbmltYXRpb24tbmFtZTpmbHlPdXRVcH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZseSBkb3duXFxcIl0ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmx5T3V0RG93bjthbmltYXRpb24tbmFtZTpmbHlPdXREb3dufS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmx5IGxlZnRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlPdXRMZWZ0O2FuaW1hdGlvbi1uYW1lOmZseU91dExlZnR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmbHkgcmlnaHRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlPdXRSaWdodDthbmltYXRpb24tbmFtZTpmbHlPdXRSaWdodH1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5SW57MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX0yMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjAzLDEuMDMsMS4wMyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpO3RyYW5zZm9ybTpzY2FsZTNkKC45NywuOTcsLjk3KX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9fUBrZXlmcmFtZXMgZmx5SW57MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX0yMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjAzLDEuMDMsMS4wMyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpO3RyYW5zZm9ybTpzY2FsZTNkKC45NywuOTcsLjk3KX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9fUAtd2Via2l0LWtleWZyYW1lcyBmbHlJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDE1MDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxNTAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19QGtleWZyYW1lcyBmbHlJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDE1MDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxNTAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZseUluRG93bnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTUwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNTAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmbHlJbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1MDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTUwMHB4LDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDVweCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUAtd2Via2l0LWtleWZyYW1lcyBmbHlJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDE1MDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNTAwcHgsMCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUBrZXlmcmFtZXMgZmx5SW5MZWZ0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNTAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTUwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5SW5SaWdodHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTE1MDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUwMHB4LDAsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwcHgsMCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmbHlJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNTAwcHgsMCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5T3V0ezIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KTt0cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSl9NTAlLDU1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpO3RyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKX19QGtleWZyYW1lcyBmbHlPdXR7MjAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX01MCUsNTUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5T3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTQwJSw0NSV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApfX1Aa2V5ZnJhbWVzIGZseU91dFVwezIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMHB4LDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZseU91dERvd257MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmx5T3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZseU91dFJpZ2h0ezIwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCl9fUBrZXlmcmFtZXMgZmx5T3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZseU91dExlZnR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX19QGtleWZyYW1lcyBmbHlPdXRMZWZ0ezIwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwcHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCl9fS50cmFuc2l0aW9uLnNsaWRlLmluLC50cmFuc2l0aW9uW2NsYXNzKj1cXFwic2xpZGUgZG93blxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJblk7YW5pbWF0aW9uLW5hbWU6c2xpZGVJblk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic2xpZGUgdXBcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5ZO2FuaW1hdGlvbi1uYW1lOnNsaWRlSW5ZOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGNlbnRlcn0udHJhbnNpdGlvbltjbGFzcyo9XFxcInNsaWRlIGxlZnRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlSW5YO2FuaW1hdGlvbi1uYW1lOnNsaWRlSW5YOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzbGlkZSByaWdodFxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJblg7YW5pbWF0aW9uLW5hbWU6c2xpZGVJblg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGxlZnR9LnRyYW5zaXRpb24uc2xpZGUub3V0LC50cmFuc2l0aW9uW2NsYXNzKj1cXFwic2xpZGUgZG93blxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0WTthbmltYXRpb24tbmFtZTpzbGlkZU91dFk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic2xpZGUgdXBcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dFk7YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRZOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGNlbnRlcn0udHJhbnNpdGlvbltjbGFzcyo9XFxcInNsaWRlIGxlZnRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZU91dFg7YW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRYOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzbGlkZSByaWdodFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0WDthbmltYXRpb24tbmFtZTpzbGlkZU91dFg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5ZezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoMCk7dHJhbnNmb3JtOnNjYWxlWSgwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoMSk7dHJhbnNmb3JtOnNjYWxlWSgxKX19QGtleWZyYW1lcyBzbGlkZUluWXswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVZKDApO3RyYW5zZm9ybTpzY2FsZVkoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVZKDEpO3RyYW5zZm9ybTpzY2FsZVkoMSl9fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZUluWHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDApO3RyYW5zZm9ybTpzY2FsZVgoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fUBrZXlmcmFtZXMgc2xpZGVJblh7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgwKTt0cmFuc2Zvcm06c2NhbGVYKDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfX1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXRZezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoMSk7dHJhbnNmb3JtOnNjYWxlWSgxKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoMCk7dHJhbnNmb3JtOnNjYWxlWSgwKX19QGtleWZyYW1lcyBzbGlkZU91dFl7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWSgxKTt0cmFuc2Zvcm06c2NhbGVZKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWSgwKTt0cmFuc2Zvcm06c2NhbGVZKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVPdXRYezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMCk7dHJhbnNmb3JtOnNjYWxlWCgwKX19QGtleWZyYW1lcyBzbGlkZU91dFh7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgwKTt0cmFuc2Zvcm06c2NhbGVYKDApfX0udHJhbnNpdGlvbi5zd2luZ3std2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouOHM7YW5pbWF0aW9uLWR1cmF0aW9uOi44c30udHJhbnNpdGlvbltjbGFzcyo9XFxcInN3aW5nIGRvd25cXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nSW5YO2FuaW1hdGlvbi1uYW1lOnN3aW5nSW5YOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcn0udHJhbnNpdGlvbltjbGFzcyo9XFxcInN3aW5nIHVwXFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZ0luWDthbmltYXRpb24tbmFtZTpzd2luZ0luWDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmJvdHRvbSBjZW50ZXJ9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzd2luZyBsZWZ0XFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZ0luWTthbmltYXRpb24tbmFtZTpzd2luZ0luWTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHJpZ2h0O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHJpZ2h0fS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic3dpbmcgcmlnaHRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nSW5ZO2FuaW1hdGlvbi1uYW1lOnN3aW5nSW5ZOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBsZWZ0fS50cmFuc2l0aW9uLnN3aW5nLm91dCwudHJhbnNpdGlvbltjbGFzcyo9XFxcInN3aW5nIGRvd25cXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZ091dFg7YW5pbWF0aW9uLW5hbWU6c3dpbmdPdXRYOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcn0udHJhbnNpdGlvbltjbGFzcyo9XFxcInN3aW5nIHVwXFxcIl0ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c3dpbmdPdXRYO2FuaW1hdGlvbi1uYW1lOnN3aW5nT3V0WDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmJvdHRvbSBjZW50ZXJ9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzd2luZyBsZWZ0XFxcIl0ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c3dpbmdPdXRZO2FuaW1hdGlvbi1uYW1lOnN3aW5nT3V0WTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHJpZ2h0O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHJpZ2h0fS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic3dpbmcgcmlnaHRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZ091dFk7YW5pbWF0aW9uLW5hbWU6c3dpbmdPdXRZOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBsZWZ0fUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ0luWHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtMzBkZWcpO29wYWNpdHk6MX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE1ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC03LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKX19QGtleWZyYW1lcyBzd2luZ0luWHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtMzBkZWcpO29wYWNpdHk6MX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE1ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE1ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC03LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3aW5nSW5ZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtvcGFjaXR5OjB9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgzMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgzMGRlZyk7b3BhY2l0eToxfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTE3LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTE3LjVkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDcuNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgwKX19QGtleWZyYW1lcyBzd2luZ0luWXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC05MGRlZyk7b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMzBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMzBkZWcpO29wYWNpdHk6MX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC0xNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC0xNy41ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSg3LjVkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMCl9fUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ091dFh7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMCl9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC03LjVkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMTcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgxNy41ZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtMzBkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCg5MGRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3aW5nT3V0WHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC03LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgxNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE3LjVkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTMwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDkwZGVnKTtvcGFjaXR5OjB9fUAtd2Via2l0LWtleWZyYW1lcyBzd2luZ091dFl7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMCl9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSg3LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoNy41ZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC0xMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtMTBkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMzBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMzBkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dpbmdPdXRZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDApfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDcuNWRlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtMTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTEwZGVnKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDMwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDMwZGVnKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC05MGRlZyk7b3BhY2l0eTowfX0udHJhbnNpdGlvbi56b29tLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbUluO2FuaW1hdGlvbi1uYW1lOnpvb21Jbn0udHJhbnNpdGlvbi56b29tLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnpvb21PdXQ7YW5pbWF0aW9uLW5hbWU6em9vbU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbUluezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHpvb21JbnswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHpvb21PdXR7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9fUBrZXlmcmFtZXMgem9vbU91dHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19LmZsYXNoLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246NzUwbXM7YW5pbWF0aW9uLWR1cmF0aW9uOjc1MG1zOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmxhc2g7YW5pbWF0aW9uLW5hbWU6Zmxhc2h9LnNoYWtlLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246NzUwbXM7YW5pbWF0aW9uLWR1cmF0aW9uOjc1MG1zOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2hha2U7YW5pbWF0aW9uLW5hbWU6c2hha2V9LmJvdW5jZS50cmFuc2l0aW9uey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjc1MG1zO2FuaW1hdGlvbi1kdXJhdGlvbjo3NTBtczstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJvdW5jZTthbmltYXRpb24tbmFtZTpib3VuY2V9LnRhZGEudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjo3NTBtczthbmltYXRpb24tZHVyYXRpb246NzUwbXM7LXdlYmtpdC1hbmltYXRpb24tbmFtZTp0YWRhO2FuaW1hdGlvbi1uYW1lOnRhZGF9LnB1bHNlLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246LjVzO2FuaW1hdGlvbi1kdXJhdGlvbjouNXM7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpwdWxzZTthbmltYXRpb24tbmFtZTpwdWxzZX0uamlnZ2xlLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246NzUwbXM7YW5pbWF0aW9uLWR1cmF0aW9uOjc1MG1zOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6amlnZ2xlO2FuaW1hdGlvbi1uYW1lOmppZ2dsZX0udHJhbnNpdGlvbi5nbG93ey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjJzO2FuaW1hdGlvbi1kdXJhdGlvbjoyczstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xOSwxLC4yMiwxKTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguMTksMSwuMjIsMSl9LnRyYW5zaXRpb24uZ2xvd3std2Via2l0LWFuaW1hdGlvbi1uYW1lOmdsb3c7YW5pbWF0aW9uLW5hbWU6Z2xvd31ALXdlYmtpdC1rZXlmcmFtZXMgZmxhc2h7MCUsMTAwJSw1MCV7b3BhY2l0eToxfTI1JSw3NSV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZsYXNoezAlLDEwMCUsNTAle29wYWNpdHk6MX0yNSUsNzUle29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHNoYWtlezAlLDEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMCUsMzAlLDUwJSw3MCUsOTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMHB4KX0yMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX19QGtleWZyYW1lcyBzaGFrZXswJSwxMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MTAlLDMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCl9MjAlLDQwJSw2MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTBweCl9fUAtd2Via2l0LWtleWZyYW1lcyBib3VuY2V7MCUsMTAwJSwyMCUsNTAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTQwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0zMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMzBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTE1cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xNXB4KX19QGtleWZyYW1lcyBib3VuY2V7MCUsMTAwJSwyMCUsNTAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTQwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0zMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMzBweCl9NjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTE1cHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xNXB4KX19QC13ZWJraXQta2V5ZnJhbWVzIHRhZGF7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjkpIHJvdGF0ZSgtM2RlZyk7dHJhbnNmb3JtOnNjYWxlKC45KSByb3RhdGUoLTNkZWcpfTMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjEpIHJvdGF0ZSgzZGVnKTt0cmFuc2Zvcm06c2NhbGUoMS4xKSByb3RhdGUoM2RlZyl9NDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xKSByb3RhdGUoLTNkZWcpO3RyYW5zZm9ybTpzY2FsZSgxLjEpIHJvdGF0ZSgtM2RlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKSByb3RhdGUoMCk7dHJhbnNmb3JtOnNjYWxlKDEpIHJvdGF0ZSgwKX19QGtleWZyYW1lcyB0YWRhezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0xMCUsMjAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC45KSByb3RhdGUoLTNkZWcpO3RyYW5zZm9ybTpzY2FsZSguOSkgcm90YXRlKC0zZGVnKX0zMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xKSByb3RhdGUoM2RlZyk7dHJhbnNmb3JtOnNjYWxlKDEuMSkgcm90YXRlKDNkZWcpfTQwJSw2MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUoMS4xKSByb3RhdGUoLTNkZWcpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSkgcm90YXRlKDApO3RyYW5zZm9ybTpzY2FsZSgxKSByb3RhdGUoMCl9fUAtd2Via2l0LWtleWZyYW1lcyBwdWxzZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOSk7dHJhbnNmb3JtOnNjYWxlKC45KTtvcGFjaXR5Oi43fTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QGtleWZyYW1lcyBwdWxzZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOSk7dHJhbnNmb3JtOnNjYWxlKC45KTtvcGFjaXR5Oi43fTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpO29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIGppZ2dsZXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9MzAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4yNSwuNzUsMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjc1LDEuMjUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjc1LDEuMjUsMSl9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4xNSwuODUsMSl9NjUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoLjk1LDEuMDUsMSl9NzUley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMS4wNSwuOTUsMSl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSl9fUBrZXlmcmFtZXMgamlnZ2xlezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKX02NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19QC13ZWJraXQta2V5ZnJhbWVzIGdsb3d7MCV7YmFja2dyb3VuZC1jb2xvcjojZmNmY2ZkfTMwJXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY2Y2R9MTAwJXtiYWNrZ3JvdW5kLWNvbG9yOiNmY2ZjZmR9fUBrZXlmcmFtZXMgZ2xvd3swJXtiYWNrZ3JvdW5kLWNvbG9yOiNmY2ZjZmR9MzAle2JhY2tncm91bmQtY29sb3I6I2ZmZjZjZH0xMDAle2JhY2tncm91bmQtY29sb3I6I2ZjZmNmZH19XCIsIFwiXCIse1widmVyc2lvblwiOjMsXCJzb3VyY2VzXCI6W1wid2VicGFjazovL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1jc3Mvc2VtYW50aWMubWluLmNzc1wiXSxcIm5hbWVzXCI6W10sXCJtYXBwaW5nc1wiOlwiQ0FBQzs7Ozs7Ozs7O0VBU0MsQ0FDaUc7Ozs7Ozs7O0VBUWpHLENBQUMsaUJBQWlCLDBCQUEwQixDQUFDLGtCQUFrQixDQUFDLEtBQUssNkJBQTZCLENBQUMscUJBQXFCLENBQUMsMkVBQTJFLHVCQUF1QixDQUFDLG9CQUFvQixDQUFDLDJFQUEyRSxDQUFDLEtBQUssZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMsS0FBSyxRQUFRLENBQUMsd0NBQXdDLGFBQWEsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyxPQUFPLGVBQWUsQ0FBQyxHQUFHLDhCQUE4QixDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLCtCQUErQixDQUFDLGFBQWEsQ0FBQyxFQUFFLDRCQUE0QixDQUFDLG9DQUFvQyxDQUFDLFlBQVksa0JBQWtCLENBQUMseUJBQXlCLENBQTBDLGdDQUFnQyxDQUFDLFNBQVMsbUJBQW1CLENBQUMsU0FBUyxrQkFBa0IsQ0FBQyxjQUFjLCtCQUErQixDQUFDLGFBQWEsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEtBQUsscUJBQXFCLENBQUMsVUFBVSxDQUFDLE1BQU0sYUFBYSxDQUFDLFFBQVEsYUFBYSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxZQUFZLG9CQUFvQixDQUFDLHNCQUFzQixZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksaUJBQWlCLENBQUMsZUFBZSxlQUFlLENBQUMsc0NBQXNDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxnQkFBZ0IsQ0FBQyxjQUFjLG1CQUFtQixDQUFDLHFEQUFxRCx5QkFBeUIsQ0FBQyx3SEFBd0gsaUJBQWlCLENBQUMsU0FBUyxDQUFDLDRHQUE0Ryw2QkFBNkIsQ0FBQyxTQUFTLDBCQUEwQixDQUFDLE9BQU8sNkJBQTZCLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLFNBQVMsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsU0FBUyxhQUFhLENBQUMsNkJBQTZCLDZCQUE2QixDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxrRkFBa0YsV0FBVyxDQUFDLGNBQWMsNEJBQTRCLENBQUMsbUJBQW1CLENBQUMscUZBQXFGLHVCQUF1QixDQUFDLDZCQUE2Qix5QkFBeUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxhQUFhLENBQUMsUUFBUSxpQkFBaUIsQ0FBQyxPQUFPLG9CQUFvQixDQUFDLFNBQVMsWUFBWSxDQUFDLFNBQVMsWUFBWSxDQUFDOzs7Ozs7OztFQVF6bEYsQ0FBQyxVQUFVLFdBQVcsQ0FBQyxLQUFLLGNBQWMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyw0REFBNEQsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsMEJBQTBCLENBQUMsZUFBZSw0REFBNEQsQ0FBQyx3QkFBd0IsQ0FBQyxzQ0FBc0MsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsZUFBZSxDQUFDLGNBQWMsQ0FBQyxHQUFHLHVCQUF1QixDQUFDLEdBQUcsdUJBQXVCLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLGNBQWMsQ0FBQywyRUFBMkUsWUFBWSxDQUFDLHNFQUFzRSxlQUFlLENBQUMsRUFBRSxjQUFjLENBQUMsb0JBQW9CLENBQUMsY0FBYyxZQUFZLENBQUMsYUFBYSxlQUFlLENBQUMsRUFBRSxhQUFhLENBQUMsb0JBQW9CLENBQUMsUUFBUSxhQUFhLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLHdCQUF3QixDQUFDLHFCQUFxQixDQUFpRSxZQUFZLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLHFEQUFxRCxxQ0FBcUMsQ0FBQyxxQkFBcUIsQ0FBNEcscUNBQXFDLHFDQUFxQyxDQUFDLHFCQUFxQixDQUFDLHlCQUF5Qix1QkFBdUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLCtCQUErQix5QkFBeUIsQ0FBQyxlQUFlLENBQUMsK0JBQStCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQywrQ0FBK0MsMEJBQTBCLENBQUMscUNBQXFDLCtCQUErQixDQUFDLDJDQUEyQywrQkFBK0IsQ0FBQywyQ0FBMkMsZ0NBQWdDLENBQUMsMkRBQTJELGdDQUFnQyxDQUFDLGlEQUFpRCxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7RUFRcm9FLENBQUMsV0FBVyxjQUFjLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsNERBQTRELENBQUMsa0JBQWtCLENBQUMscUNBQXFDLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQywrRUFBK0UsQ0FBQyx1RUFBdUUsQ0FBQyx3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsNEhBQTRILENBQUMsb0hBQW9ILENBQUMsNEdBQTRHLENBQUMsd0lBQXdJLENBQUMsY0FBYyxDQUFDLHVDQUF1QyxDQUFDLGlCQUFpQix3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQywrRUFBK0UsQ0FBQyx1RUFBdUUsQ0FBQyxvQkFBb0IsQ0FBQyx1QkFBdUIsV0FBVyxDQUFDLGlCQUFpQix3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsQ0FBQywrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsV0FBVyxDQUFDLDJDQUEyQyx3QkFBd0IsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyxrQkFBa0Isd0JBQXdCLENBQUMscUJBQXFCLENBQUMsOENBQThDLENBQUMsc0NBQXNDLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLHlCQUF5Qix3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQywyREFBMkQsaUJBQWlCLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQywwQkFBMEIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLHlDQUF5QyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLHNDQUFzQyw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsK0JBQStCLEtBQUssMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLHVCQUF1QixLQUFLLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQywrQ0FBK0MsMkJBQTJCLENBQUMsOENBQThDLHdCQUF3QixDQUFDLDBIQUEwSCxjQUFjLENBQUMscUJBQXFCLENBQUMsK0JBQStCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLENBQUMsc0NBQXNDLDhCQUE4QixDQUFDLG9CQUFvQixpQkFBaUIsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLDZCQUE2Qiw2QkFBNkIsQ0FBQyxxQ0FBcUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsb0NBQW9DLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyx5RUFBeUUsb0NBQW9DLENBQUMsNEJBQTRCLENBQUMscUNBQXFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsb0NBQW9DLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLHNGQUFzRixTQUFTLENBQUMsVUFBVSxDQUFDLG9GQUFvRixTQUFTLENBQUMsT0FBTyxDQUFDLDJGQUEyRiwwREFBMEQsQ0FBQyxrREFBa0QsQ0FBQywwQ0FBMEMsQ0FBQyxxRUFBcUUsQ0FBQyw4Q0FBOEMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLDZDQUE2QyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyx3R0FBd0csa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLHNHQUFzRyxPQUFPLENBQUMsVUFBVSxDQUFDLG1GQUFtRiw4REFBOEQsQ0FBQyxzREFBc0QsQ0FBQyw4Q0FBOEMsQ0FBQyx5RUFBeUUsQ0FBQywwQ0FBMEMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMseUNBQXlDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDLGdHQUFnRyxTQUFTLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsQ0FBQyw4RkFBOEYsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyw2QkFBNkIsaUJBQWlCLENBQUMseUNBQXlDLGFBQWEsQ0FBQyxzQ0FBc0MsaUJBQWlCLENBQUMsa0RBQWtELFlBQVksQ0FBQywwQkFBMEIsZUFBZSxDQUFDLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLG9CQUFvQixDQUFDLHFEQUFxRCxlQUFlLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsb0JBQW9CLENBQUMsaUNBQWlDLGtCQUFrQixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLG9CQUFvQixDQUFDLDhCQUFvRixtQkFBbUIsQ0FBbUYsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsMkJBQTJCLFFBQVEsQ0FBQywwQkFBa0UsWUFBWSxDQUFnRCxrQkFBa0IsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLHFDQUFxQyxZQUFZLENBQUMsYUFBYSxDQUFDLHdEQUF3RCx5QkFBeUIsQ0FBQyw0QkFBNEIsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsMkJBQTJCLENBQUMsMENBQTBDLHdCQUF3QixDQUFDLDJCQUEyQixDQUFDLHlDQUF5Qyx5QkFBeUIsQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0Isd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLDBCQUEwQix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLHlCQUF5Qix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLDZCQUE2Qix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsOEJBQThCLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0Isd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLDBCQUEwQix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsb0JBQW9CLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLHlCQUF5Qix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLDJCQUEyQix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLDJCQUEyQix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyxvQkFBb0Isd0JBQXdCLENBQUMsVUFBVSxDQUFDLHFCQUFxQix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsOEJBQThCLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsd0RBQXdELG1DQUFtQyxDQUFDLDhEQUE4RCxtQ0FBbUMsQ0FBQyxxRUFBcUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyx1RUFBdUUsV0FBVyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQywrQ0FBK0MsdUNBQXVDLENBQUMseURBQXlELDJDQUEyQyxDQUFDLHlFQUF5RSw0Q0FBNEMsQ0FBQyw4REFBOEQsc0JBQXNCLENBQUMsOERBQThELHNCQUFzQixDQUFDLGlFQUFpRSxzQkFBc0IsQ0FBQywrQ0FBK0MsY0FBYyxDQUFDLGlFQUFpRSx1QkFBdUIsQ0FBQywyREFBMkQsdUJBQXVCLENBQUMsOERBQThELHVCQUF1QixDQUFDLHVFQUF1RSx1QkFBdUIsQ0FBQyx5Q0FBeUMsMkNBQTJDLENBQUMscURBQXFELFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQywyQ0FBMkMscUNBQXFDLENBQUMsOEJBQThCLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLHFEQUFxRCxDQUFDLDZDQUE2QyxDQUFDLGtCQUFrQix1QkFBdUIsQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUMsMEJBQTBCLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyx1REFBdUQseUJBQXlCLENBQUMsOEJBQThCLENBQUMsc0ZBQXNGLENBQUMsOEVBQThFLENBQUMsdURBQXVELHlCQUF5QixDQUFDLDhCQUE4QixDQUFDLHNGQUFzRixDQUFDLDhFQUE4RSxDQUFDLHlEQUF5RCw0QkFBNEIsQ0FBQyw4QkFBOEIsQ0FBQyx1RkFBdUYsQ0FBQywrRUFBK0UsQ0FBQyx5REFBeUQsb0NBQW9DLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsK0JBQStCLENBQUMscUVBQXFFLGdDQUFnQyxDQUFDLGdDQUFnQyw0RkFBNEYsQ0FBQyxvRkFBb0YsQ0FBQyxpQ0FBaUMsNkZBQTZGLENBQUMscUZBQXFGLENBQUMsaUNBQWlDLCtCQUErQixDQUFDLHVCQUF1QixDQUFDLDZEQUE2RCxzQ0FBc0MsQ0FBQyx1QkFBdUIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyx5RUFBeUUsb0JBQW9CLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMseUVBQXlFLG9CQUFvQixDQUFDLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLDJFQUEyRSxnREFBZ0QsQ0FBQyxvQkFBb0IsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQywyRUFBMkUsc0NBQXNDLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHVEQUF1RCxDQUFDLCtDQUErQyxDQUFDLHVGQUF1RixzQ0FBc0MsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQywwQkFBMEIsd0NBQXdDLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1DQUFtQyxnQkFBZ0IsQ0FBQyxtQ0FBbUMsbUJBQW1CLENBQUMsdUNBQXVDLENBQUMsK0NBQStDLGtCQUFrQixDQUFDLHlEQUF5RCxpQkFBaUIsQ0FBQyxtQ0FBbUMsQ0FBQyw2QkFBNkIsQ0FBQyxxRUFBcUUsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsOEJBQThCLENBQUMsaUNBQWlDLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLGdDQUFnQyxDQUFDLFFBQVEsQ0FBQywrQ0FBK0MsQ0FBQyx1Q0FBdUMsQ0FBQyxxRUFBcUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyx3Q0FBd0Msb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsOENBQThDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLCtCQUErQixDQUFDLGtDQUFrQyxDQUFDLDhDQUE4QyxDQUFDLHNDQUFzQyxDQUFDLG9LQUFvSyxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLG1EQUFtRCxtQ0FBbUMsQ0FBQyxzQ0FBc0MsQ0FBQyxrREFBa0Qsb0NBQW9DLENBQUMsdUNBQXVDLENBQUMsNERBQTRELGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQywyREFBMkQsZUFBZSxDQUFDLHNDQUFzQyxDQUFDLDJGQUEyRiw0QkFBNEIsQ0FBQyw2QkFBNkIsQ0FBQyw2RkFBNkYsa0NBQWtDLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLGtDQUFrQyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixrQkFBa0IsQ0FBQywwQkFBMEIsU0FBUyxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLHVCQUF1QixpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsOENBQThDLENBQUMsc0NBQXNDLENBQUMsa0NBQWtDLHVCQUF1QixDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyw0QkFBNEIsWUFBWSxDQUFDLG9CQUFvQixpQkFBaUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyx5REFBeUQsQ0FBQyxpREFBaUQsQ0FBQyx3QkFBd0IsMkNBQTJDLENBQUMsMkJBQTJCLDJDQUEyQyxDQUFDLHlCQUF5QixvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQywyQ0FBMkMsQ0FBQywwQkFBMEIsb0JBQW9CLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLDJDQUEyQyxDQUFDLHFCQUFxQixpQkFBaUIsQ0FBeUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyx5Q0FBeUMsZUFBZSxDQUFDLHdDQUF3QyxlQUFlLENBQUMsbUNBQW1DLGtCQUFrQixDQUFDLDJDQUEyQyxDQUFDLHVEQUF1RCxnQ0FBZ0MsQ0FBQyxzREFBc0QsZ0NBQWdDLENBQUMsc0NBQXNDLGVBQWUsQ0FBQywyQ0FBMkMsQ0FBQywwREFBMEQsZ0NBQWdDLENBQUMseURBQXlELGdDQUFnQyxDQUFDLG9DQUEwRixtQkFBbUIsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsMkNBQTJDLENBQUMsd0RBQXdELGdCQUFnQixDQUFDLGdDQUFnQyxDQUFDLHVEQUF1RCxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxxQ0FBMkYsbUJBQW1CLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDJDQUEyQyxDQUFDLHlEQUF5RCxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsQ0FBQyx3REFBd0QsZ0JBQWdCLENBQUMsZ0NBQWdDLENBQUMsbUNBQW1DLFVBQVUsQ0FBQyxpQkFBaUIsYUFBYSxDQUFDLGdCQUFnQixVQUFVLENBQUMsd0JBQXdCLFNBQVMsQ0FBQyxrQkFBa0IsVUFBVSxDQUFDLDBCQUEwQixhQUFhLENBQUMsaUJBQWlCLFVBQVUsQ0FBQyx5QkFBeUIsU0FBUyxDQUFDLGlCQUFpQixVQUFVLENBQUMseUJBQXlCLFNBQVMsQ0FBQyxnQkFBZ0IsVUFBVSxDQUFDLHdCQUF3QixhQUFhLENBQUMsa0JBQWtCLFVBQVUsQ0FBQywwQkFBMEIsYUFBYSxDQUFDLGtCQUFrQixVQUFVLENBQUMsMEJBQTBCLFdBQVcsQ0FBQyxpQkFBaUIsVUFBVSxDQUFDLHlCQUF5QixZQUFZLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQyx3QkFBd0IsU0FBUyxDQUFDLG1CQUFtQixVQUFVLENBQUMsMkJBQTJCLFdBQVcsQ0FBQyxtQkFBbUIsVUFBVSxDQUFDLDJCQUEyQixhQUFhLENBQUMsOERBQXNHLFlBQVksQ0FBQyxVQUFVLENBQUMsaUNBQWlDLFVBQVUsQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLGtDQUFrQyxVQUFVLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxpQ0FBaUMsY0FBYyxDQUFDLG1DQUFtQyxjQUFjLENBQUMsbUNBQW1DLFlBQVksQ0FBQyxrQ0FBa0MsYUFBYSxDQUFDLGlDQUFpQyxVQUFVLENBQUMsb0NBQW9DLFlBQVksQ0FBQyxvQ0FBb0MsY0FBYyxDQUFDLDJDQUEyQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLHVEQUF1RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsdURBQXVELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHdJQUF3SSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsdURBQXVELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtRUFBbUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHFFQUFxRSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxpRUFBaUUsZ0JBQWdCLENBQUMsNkRBQTZELDRCQUE0QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLFVBQVUsQ0FBQyx3U0FBd1MsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLHlFQUF5RSxxQkFBcUIsQ0FBQyx5RUFBeUUscUJBQXFCLENBQUMsMkVBQTJFLHFCQUFxQixDQUFDLDJFQUEyRSxxQkFBcUIsQ0FBQyxrSEFBa0gsNEJBQTRCLENBQUMsaUVBQWlFLENBQUMseURBQXlELENBQUMsb0JBQW9CLENBQUMsb0lBQW9JLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLG9CQUFvQixDQUFDLHFGQUFxRixpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQyx1QkFBdUIsQ0FBQyx1SUFBdUksaURBQWlELENBQUMseUNBQXlDLENBQUMsb0JBQW9CLENBQUMsdUlBQXVJLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLG9CQUFvQixDQUFDLHlDQUF5Qyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLHFEQUFxRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscURBQXFELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLG9JQUFvSSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscURBQXFELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxpRUFBaUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxnRUFBZ0UsZ0JBQWdCLENBQUMsMkRBQTJELDRCQUE0QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLFVBQVUsQ0FBQyxnU0FBZ1MsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsdUVBQXVFLHdCQUF3QixDQUFDLHVFQUF1RSx3QkFBd0IsQ0FBQyx5RUFBeUUsd0JBQXdCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLCtHQUErRyw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyxpSUFBaUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsb0JBQW9CLENBQUMsbUZBQW1GLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG9JQUFvSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyxvQkFBb0IsQ0FBQyxvSUFBb0ksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsb0JBQW9CLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsdURBQXVELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHlEQUF5RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsd0lBQXdJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxxRUFBcUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSxnQkFBZ0IsQ0FBQyw2REFBNkQsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLHdTQUF3UyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLHlFQUF5RSx3QkFBd0IsQ0FBQywyRUFBMkUsd0JBQXdCLENBQUMsMkVBQTJFLHdCQUF3QixDQUFDLGtIQUFrSCw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyxvSUFBb0ksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUZBQXFGLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHVJQUF1SSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1SUFBdUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMseUNBQXlDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsbURBQW1ELENBQUMsMkNBQTJDLENBQUMscURBQXFELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBcUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHVEQUF1RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsb0lBQW9JLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBcUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsaUVBQWlFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtRUFBbUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGdFQUFnRSxnQkFBZ0IsQ0FBQywyREFBMkQsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLGdTQUFnUyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsdUVBQXVFLHdCQUF3QixDQUFDLHVFQUF1RSx3QkFBd0IsQ0FBQyx5RUFBeUUsd0JBQXdCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLCtHQUErRyw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyxpSUFBaUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUZBQW1GLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG9JQUFvSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxvSUFBb0ksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsdURBQXVELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHlEQUF5RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsd0lBQXdJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxxRUFBcUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSxnQkFBZ0IsQ0FBQyw2REFBNkQsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLHdTQUF3UyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLHlFQUF5RSx3QkFBd0IsQ0FBQywyRUFBMkUsd0JBQXdCLENBQUMsMkVBQTJFLHdCQUF3QixDQUFDLGtIQUFrSCw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyxvSUFBb0ksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUZBQXFGLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHVJQUF1SSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1SUFBdUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsNkNBQTZDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsbURBQW1ELENBQUMsMkNBQTJDLENBQUMseURBQXlELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLDJEQUEyRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNElBQTRJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHFFQUFxRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1RUFBdUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUVBQXVFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGtFQUFrRSxnQkFBZ0IsQ0FBQywrREFBK0QsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLGdUQUFnVCxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsMkVBQTJFLHdCQUF3QixDQUFDLDJFQUEyRSx3QkFBd0IsQ0FBQyw2RUFBNkUsd0JBQXdCLENBQUMsNkVBQTZFLHdCQUF3QixDQUFDLHFIQUFxSCw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyx1SUFBdUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUZBQXVGLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDBJQUEwSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywwSUFBMEksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMseUNBQXlDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsbURBQW1ELENBQUMsMkNBQTJDLENBQUMscURBQXFELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBcUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHVEQUF1RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsb0lBQW9JLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBcUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsaUVBQWlFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtRUFBbUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGdFQUFnRSxnQkFBZ0IsQ0FBQywyREFBMkQsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLGdTQUFnUyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsdUVBQXVFLHdCQUF3QixDQUFDLHVFQUF1RSx3QkFBd0IsQ0FBQyx5RUFBeUUsd0JBQXdCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLCtHQUErRyw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyxpSUFBaUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUZBQW1GLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG9JQUFvSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxvSUFBb0ksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsNkNBQTZDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsbURBQW1ELENBQUMsMkNBQTJDLENBQUMseURBQXlELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLDJEQUEyRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNElBQTRJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHFFQUFxRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1RUFBdUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUVBQXVFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGtFQUFrRSxnQkFBZ0IsQ0FBQywrREFBK0QsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLGdUQUFnVCxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsMkVBQTJFLHdCQUF3QixDQUFDLDJFQUEyRSx3QkFBd0IsQ0FBQyw2RUFBNkUsd0JBQXdCLENBQUMsNkVBQTZFLHdCQUF3QixDQUFDLHFIQUFxSCw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyx1SUFBdUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUZBQXVGLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDBJQUEwSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywwSUFBMEksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsNkNBQTZDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsbURBQW1ELENBQUMsMkNBQTJDLENBQUMseURBQXlELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLDJEQUEyRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNElBQTRJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx5REFBeUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHFFQUFxRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1RUFBdUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUVBQXVFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGtFQUFrRSxnQkFBZ0IsQ0FBQywrREFBK0QsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLGdUQUFnVCxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsMkVBQTJFLHdCQUF3QixDQUFDLDJFQUEyRSx3QkFBd0IsQ0FBQyw2RUFBNkUsd0JBQXdCLENBQUMsNkVBQTZFLHdCQUF3QixDQUFDLHFIQUFxSCw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyx1SUFBdUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUZBQXVGLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDBJQUEwSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywwSUFBMEksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUNBQXVDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLG1EQUFtRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsbURBQW1ELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxREFBcUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGdJQUFnSSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsbURBQW1ELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLCtEQUErRCx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywrREFBK0Qsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsaUVBQWlFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywrREFBK0QsZ0JBQWdCLENBQUMseURBQXlELDRCQUE0QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLGFBQWEsQ0FBQyx3UkFBd1IsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLHFFQUFxRSx3QkFBd0IsQ0FBQyxxRUFBcUUsd0JBQXdCLENBQUMsdUVBQXVFLHdCQUF3QixDQUFDLHVFQUF1RSx3QkFBd0IsQ0FBQyw0R0FBNEcsNEJBQTRCLENBQUMsaUVBQWlFLENBQUMseURBQXlELENBQUMsb0JBQW9CLENBQUMsOEhBQThILG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlGQUFpRixvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxpSUFBaUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsaUlBQWlJLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHlDQUF5Qyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLHFEQUFxRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscURBQXFELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLG9JQUFvSSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscURBQXFELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxpRUFBaUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxnRUFBZ0UsZ0JBQWdCLENBQUMsMkRBQTJELDRCQUE0QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLGFBQWEsQ0FBQyxnU0FBZ1MsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsdUVBQXVFLHdCQUF3QixDQUFDLHVFQUF1RSxxQkFBcUIsQ0FBQyx5RUFBeUUsd0JBQXdCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLCtHQUErRyw0QkFBNEIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxvQkFBb0IsQ0FBQyxpSUFBaUksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUZBQW1GLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLHVCQUF1QixDQUFDLG9JQUFvSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxvSUFBb0ksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsdURBQXVELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHlEQUF5RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsd0lBQXdJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBdUQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUVBQW1FLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxxRUFBcUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlFQUFpRSxnQkFBZ0IsQ0FBQyw2REFBNkQsNEJBQTRCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsYUFBYSxDQUFDLHdTQUF3UyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsQ0FBQyx5RUFBeUUsd0JBQXdCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLDJFQUEyRSx3QkFBd0IsQ0FBQywyRUFBMkUsd0JBQXdCLENBQUMsa0hBQWtILDRCQUE0QixDQUFDLGlFQUFpRSxDQUFDLHlEQUF5RCxDQUFDLG9CQUFvQixDQUFDLG9JQUFvSSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxxRkFBcUYsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsdUlBQXVJLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHVJQUF1SSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyw2Q0FBNkMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyx5REFBeUQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHlEQUF5RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkRBQTJELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyw0SUFBNEksd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHlEQUF5RCxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxxRUFBcUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMscUVBQXFFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHVFQUF1RSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1RUFBdUUsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsa0VBQWtFLGdCQUFnQixDQUFDLCtEQUErRCw0QkFBNEIsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyxhQUFhLENBQUMsZ1RBQWdULGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLG9CQUFvQixDQUFDLDJFQUEyRSx3QkFBd0IsQ0FBQywyRUFBMkUsd0JBQXdCLENBQUMsNkVBQTZFLHdCQUF3QixDQUFDLDZFQUE2RSx3QkFBd0IsQ0FBQyxxSEFBcUgsNEJBQTRCLENBQUMsaUVBQWlFLENBQUMseURBQXlELENBQUMsb0JBQW9CLENBQUMsdUlBQXVJLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHVGQUF1RixvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywwSUFBMEksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsMElBQTBJLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLCtDQUErQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLDJEQUEyRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkRBQTJELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyw2REFBNkQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGdKQUFnSix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkRBQTJELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHVFQUF1RSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx1RUFBdUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHlFQUF5RSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtRUFBbUUsZ0JBQWdCLENBQUMsaUVBQWlFLDRCQUE0QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLGFBQWEsQ0FBQyx3VEFBd1QsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLDZFQUE2RSx3QkFBd0IsQ0FBQyw2RUFBNkUsd0JBQXdCLENBQUMsK0VBQStFLHdCQUF3QixDQUFDLCtFQUErRSx3QkFBd0IsQ0FBQyx3SEFBd0gsNEJBQTRCLENBQUMsaUVBQWlFLENBQUMseURBQXlELENBQUMsb0JBQW9CLENBQUMsMElBQTBJLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHlGQUF5RixvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyw2SUFBNkksb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsNklBQTZJLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1EQUFtRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMscUJBQXFCLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLCtEQUErRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsK0RBQStELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxpRUFBaUUsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHdKQUF3Six3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsK0RBQStELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDJFQUEyRSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywyRUFBMkUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsNkVBQTZFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDZFQUE2RSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtRUFBbUUsZ0JBQWdCLENBQUMscUVBQXFFLDRCQUE0QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLGFBQWEsQ0FBQyx3VUFBd1UsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsVUFBVSxDQUFDLGlGQUFpRix3QkFBd0IsQ0FBQyxpRkFBaUYsd0JBQXdCLENBQUMsbUZBQW1GLHdCQUF3QixDQUFDLG1GQUFtRix3QkFBd0IsQ0FBQyw4SEFBOEgsNEJBQTRCLENBQUMsaUVBQWlFLENBQUMseURBQXlELENBQUMsb0JBQW9CLENBQUMsZ0pBQWdKLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDZGQUE2RixvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtSkFBbUosb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsbUpBQW1KLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLGlEQUFpRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLDZEQUE2RCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNkRBQTZELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQywrREFBK0Qsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLG9KQUFvSix3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsNkRBQTZELG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHlFQUF5RSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyx5RUFBeUUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsMkVBQTJFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLDJFQUEyRSxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQyxtRUFBbUUsZ0JBQWdCLENBQUMsaURBQWlELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsNkRBQTZELHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyw2REFBNkQsd0JBQXdCLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLCtEQUErRCx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsb0pBQW9KLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyw2REFBNkQsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMseUVBQXlFLHdCQUF3QixDQUFDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLHlFQUF5RSx3QkFBd0IsQ0FBQyxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyx1QkFBdUIsQ0FBQywyRUFBMkUsd0JBQXdCLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsdUJBQXVCLENBQUMsMkVBQTJFLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLHVCQUF1QixDQUFDLG1FQUFtRSxnQkFBZ0IsQ0FBQyxZQUFrRSxtQkFBbUIsQ0FBbUYsa0JBQWtCLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixDQUFDLHVDQUF1Qyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBeUQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGlHQUFpRywrRUFBK0UsQ0FBQyx1RUFBdUUsQ0FBQyxnQ0FBZ0MsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLG1DQUFtQyxDQUFDLHNDQUFzQyxDQUFDLCtCQUErQixvQ0FBb0MsQ0FBQyx1Q0FBdUMsQ0FBQyxxQkFBMkUsbUJBQW1CLENBQW9GLHFCQUFxQixDQUFDLDZCQUE2QixhQUFhLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyx5Q0FBeUMsbUNBQW1DLENBQUMsb0NBQW9DLENBQUMsd0NBQXdDLGVBQWUsQ0FBQyxzQ0FBc0MsQ0FBQyx1Q0FBdUMsQ0FBQyx3Q0FBd0MsMEJBQTBCLENBQUM7Ozs7Ozs7O0VBUWo3dkYsQ0FBQyxjQUFjLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyx5Q0FBeUMsY0FBYyxvQkFBb0IsQ0FBQyx5QkFBeUIsQ0FBQywwQkFBMEIsQ0FBQyxtQkFBbUIsb0JBQW9CLENBQUMsMkJBQTJCLG9CQUFvQixDQUFDLGdDQUFnQyxvQkFBb0IsQ0FBQyxDQUFDLCtEQUErRCxjQUFjLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsa0NBQWtDLENBQUMsMkJBQTJCLGtDQUFrQyxDQUFDLGdDQUFnQyxrQ0FBa0MsQ0FBQyxDQUFDLGdFQUFnRSxjQUFjLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsa0NBQWtDLENBQUMsMkJBQTJCLGtDQUFrQyxDQUFDLGdDQUFnQyxrQ0FBa0MsQ0FBQyxDQUFDLDBDQUEwQyxjQUFjLFlBQVksQ0FBQywwQkFBMEIsQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsbUNBQW1DLENBQUMsMkJBQTJCLG1DQUFtQyxDQUFDLGdDQUFnQyxtQ0FBbUMsQ0FBQyxDQUFDLG1CQUFtQiw0REFBNEQsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLHVCQUF1QixDQUFDLG9CQUFvQixVQUFVLENBQUMscUNBQXFDLGVBQWUsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMsc0NBQXNDLGdCQUFnQixDQUFDLHdCQUF3QixrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7Ozs7Ozs7O0VBUXB0RCxDQUFDLFlBQVksYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixDQUF1QixvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyx1Q0FBdUMsQ0FBQyw0Q0FBNEMsdUNBQXVDLENBQUMsNENBQTRDLENBQUMseURBQXlELFNBQVMsQ0FBQyx1QkFBdUIsYUFBYSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDJEQUEyRCxVQUFVLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQywyQkFBMkIsQ0FBQyw4QkFBOEIscUNBQXFDLENBQUMsNkJBQTZCLG9DQUFvQyxDQUFDLHFCQUFxQixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLHVEQUF1RCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyx3Q0FBd0MsQ0FBQywyQ0FBMkMsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsNEJBQTRCLFNBQVMsQ0FBQywyQkFBMkIsUUFBUSxDQUFDLFFBQVEsQ0FBQyx5Q0FBeUMscUZBQXFGLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLG9NQUFvTSxlQUFlLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLDJCQUEyQixDQUFDLG1HQUFtRyxxQ0FBcUMsQ0FBQyxpR0FBaUcsb0NBQW9DLENBQUMsQ0FBQyxrQkFBa0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLGtDQUFrQyxDQUFDLG1EQUFtRCxZQUFZLENBQUMsbUZBQW1GLFVBQVUsQ0FBQyw0RUFBNEUsNkNBQTZDLENBQUMsOENBQThDLENBQUMsbURBQW1ELENBQUMsa0RBQWtELENBQUMsbUJBQW1CLFFBQVEsQ0FBQyxxQkFBcUIsVUFBVSxDQUFDLG9CQUFvQixlQUFlLENBQUMsa0JBQWtCLENBQUMsWUFBWSxjQUFjLENBQUMsMkRBQTJELDR5Q0FBNHlDLENBQUMseUNBQXlDLG9NQUFvTSw0eUNBQTR5QyxDQUFDLENBQUM7Ozs7Ozs7O0VBUWx5TCxDQUFDLGtCQUFrQixvQkFBb0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyx5QkFBeUIsb0JBQW9CLENBQUMsVUFBVSxDQUFDLDJFQUErRSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsdUNBQXVDLHVCQUF1QixDQUFDLHNFQUFzRSwyQkFBMkIsQ0FBQywyQ0FBMkMsMkJBQTJCLENBQUMsdUNBQXVDLDJCQUEyQixDQUFDLHdDQUF3Qyw0QkFBNEIsQ0FBQyx1Q0FBdUMsNEJBQTRCLENBQUMsdUNBQXVDLDRCQUE0QixDQUFDLG9EQUFvRCw0QkFBNEIsQ0FBQyxzQ0FBc0MsNEJBQTRCLENBQUMseUNBQXlDLDRCQUE0QixDQUFDLDhDQUE4Qyw0QkFBNEIsQ0FBQyx1Q0FBdUMsNEJBQTRCLENBQUMseUNBQXlDLDRCQUE0QixDQUFDLHFDQUFxQyw0QkFBNEIsQ0FBQyw2Q0FBNkMsNEJBQTRCLENBQUMsMENBQTBDLDRCQUE0QixDQUFDLHNDQUFzQyw0QkFBNEIsQ0FBQyx3Q0FBd0MsNEJBQTRCLENBQUMsMENBQTBDLDRCQUE0QixDQUFDLHVDQUF1Qyw0QkFBNEIsQ0FBQyw0Q0FBNEMsNEJBQTRCLENBQUMsd0NBQXdDLDRCQUE0QixDQUFDLHVDQUF1Qyw0QkFBNEIsQ0FBQyx1Q0FBdUMsNEJBQTRCLENBQUMscUNBQXFDLDRCQUE0QixDQUFDLHVDQUF1Qyw0QkFBNEIsQ0FBQyxzQ0FBc0MsNEJBQTRCLENBQUMsdUNBQXVDLDRCQUE0QixDQUFDLHNDQUFzQyw0QkFBNEIsQ0FBQyx1Q0FBdUMsNEJBQTRCLENBQUMsc0NBQXNDLDRCQUE0QixDQUFDLDZDQUE2Qyw0QkFBNEIsQ0FBQyx3Q0FBd0MsNEJBQTRCLENBQUMsdUNBQXVDLDRCQUE0QixDQUFDLHNDQUFzQyw0QkFBNEIsQ0FBQyxzQ0FBc0MsNEJBQTRCLENBQUMsNkNBQTZDLDRCQUE0QixDQUFDLHFDQUFxQyw0QkFBNEIsQ0FBQyx3REFBd0QsNkJBQTZCLENBQUMsaURBQWlELDZCQUE2QixDQUFDLDJDQUEyQyw2QkFBNkIsQ0FBQyw0Q0FBNEMsNkJBQTZCLENBQUMsNENBQTRDLDZCQUE2QixDQUFDLHFDQUFxQyw2QkFBNkIsQ0FBQyx3Q0FBd0MsNkJBQTZCLENBQUMscUNBQXFDLDZCQUE2QixDQUFDLHdDQUF3Qyw2QkFBNkIsQ0FBQywwQ0FBMEMsNkJBQTZCLENBQUMsc0NBQXNDLDZCQUE2QixDQUFDLG9DQUFvQyw2QkFBNkIsQ0FBQywwQ0FBMEMsNkJBQTZCLENBQUMsZ0RBQWdELDZCQUE2QixDQUFDLHNDQUFzQyw2QkFBNkIsQ0FBQyw4Q0FBOEMsNkJBQTZCLENBQUMsdUNBQXVDLDZCQUE2QixDQUFDLHdDQUF3Qyw2QkFBNkIsQ0FBQyx1Q0FBdUMsNkJBQTZCLENBQUMsd0NBQXdDLDZCQUE2QixDQUFDLGtEQUFrRCw2QkFBNkIsQ0FBQyx1Q0FBdUMsNkJBQTZCLENBQUMsdUNBQXVDLDZCQUE2QixDQUFDLHVDQUF1Qyw2QkFBNkIsQ0FBQyxxQ0FBcUMsNkJBQTZCLENBQUMsOENBQThDLDZCQUE2QixDQUFDLDJDQUEyQyw2QkFBNkIsQ0FBQyx1Q0FBdUMsNkJBQTZCLENBQUMscUNBQXFDLDZCQUE2QixDQUFDLHdDQUF3Qyw2QkFBNkIsQ0FBQyw4Q0FBOEMsNkJBQTZCLENBQUMsdUNBQXVDLDZCQUE2QixDQUFDLG9DQUFvQyw2QkFBNkIsQ0FBQyxnREFBZ0QsNkJBQTZCLENBQUMsMENBQTBDLDZCQUE2QixDQUFDLDZDQUE2Qyw2QkFBNkIsQ0FBQyxzQ0FBc0MsNkJBQTZCLENBQUMscUNBQXFDLDJCQUEyQixDQUFDLCtEQUErRCwrQkFBK0IsQ0FBQyx1Q0FBdUMsK0JBQStCLENBQUMsdUNBQXVDLCtCQUErQixDQUFDLDZDQUE2QyxnQ0FBZ0MsQ0FBQyxxQ0FBcUMsZ0NBQWdDLENBQUMseUNBQXlDLGdDQUFnQyxDQUFDLHlDQUF5QyxnQ0FBZ0MsQ0FBQyxzQ0FBc0MsZ0NBQWdDLENBQUMsc0NBQXNDLGdDQUFnQyxDQUFDLDBDQUEwQyxnQ0FBZ0MsQ0FBQyxpREFBaUQsZ0NBQWdDLENBQUMsc0NBQXNDLGdDQUFnQyxDQUFDLGdEQUFnRCxnQ0FBZ0MsQ0FBQyx5Q0FBeUMsZ0NBQWdDLENBQUMsb0NBQW9DLGdDQUFnQyxDQUFDLDZDQUE2QyxnQ0FBZ0MsQ0FBQyxzQ0FBc0MsZ0NBQWdDLENBQUMseUNBQXlDLGdDQUFnQyxDQUFDLDRDQUE0QyxnQ0FBZ0MsQ0FBQyx3Q0FBd0MsZ0NBQWdDLENBQUMsdUNBQXVDLGdDQUFnQyxDQUFDLHFDQUFxQyxnQ0FBZ0MsQ0FBQyx1Q0FBdUMsZ0NBQWdDLENBQUMseUNBQXlDLGdDQUFnQyxDQUFDLHVDQUF1QyxnQ0FBZ0MsQ0FBQyxzQ0FBc0MsZ0NBQWdDLENBQUMscUNBQXFDLGdDQUFnQyxDQUFDLHNEQUFzRCxnQ0FBZ0MsQ0FBQyxvQ0FBb0MsZ0NBQWdDLENBQUMsb0NBQW9DLGdDQUFnQyxDQUFDLHVDQUF1QyxnQ0FBZ0MsQ0FBQyxxQ0FBcUMsZ0NBQWdDLENBQUMsdUNBQXVDLGdDQUFnQyxDQUFDLHNDQUFzQyxnQ0FBZ0MsQ0FBQyxxQ0FBcUMsZ0NBQWdDLENBQUMscUNBQXFDLGdDQUFnQyxDQUFDLDBDQUEwQyxnQ0FBZ0MsQ0FBQyx3Q0FBd0MsZ0NBQWdDLENBQUMsd0NBQXdDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyxxREFBcUQsaUNBQWlDLENBQUMsMkNBQTJDLGlDQUFpQyxDQUFDLDJDQUEyQyxpQ0FBaUMsQ0FBQyxzQ0FBc0MsaUNBQWlDLENBQUMsOENBQThDLGlDQUFpQyxDQUFDLDBDQUEwQyxpQ0FBaUMsQ0FBQyxvQ0FBb0MsaUNBQWlDLENBQUMsdUNBQXVDLGlDQUFpQyxDQUFDLDJDQUEyQyxpQ0FBaUMsQ0FBQyw2Q0FBNkMsaUNBQWlDLENBQUMseUNBQXlDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyx1Q0FBdUMsaUNBQWlDLENBQUMseUNBQXlDLGlDQUFpQyxDQUFDLDBDQUEwQyxpQ0FBaUMsQ0FBQyxzQ0FBc0MsaUNBQWlDLENBQUMscUNBQXFDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyxzQ0FBc0MsaUNBQWlDLENBQUMsdUNBQXVDLGlDQUFpQyxDQUFDLDBDQUEwQyxpQ0FBaUMsQ0FBQywwQ0FBMEMsaUNBQWlDLENBQUMsZ0RBQWdELGlDQUFpQyxDQUFDLHlDQUF5QyxpQ0FBaUMsQ0FBQyxvQ0FBb0MsaUNBQWlDLENBQUMsMkRBQTJELGlDQUFpQyxDQUFDLHdDQUF3QyxpQ0FBaUMsQ0FBQyxxQ0FBcUMsaUNBQWlDLENBQUMsd0RBQXdELGlDQUFpQyxDQUFDLDBDQUEwQyxpQ0FBaUMsQ0FBQywwQ0FBMEMsaUNBQWlDLENBQUMsMENBQTBDLGlDQUFpQyxDQUFDLHFDQUFxQyxpQ0FBaUMsQ0FBQyx5Q0FBeUMsaUNBQWlDLENBQUMsd0NBQXdDLGlDQUFpQyxDQUFDLHNDQUFzQyxpQ0FBaUMsQ0FBQyxzQ0FBc0MsMkJBQTJCLENBQUMsd0NBQXdDLCtCQUErQixDQUFDLDBDQUEwQywrQkFBK0IsQ0FBQyx1Q0FBdUMsK0JBQStCLENBQUMsNkNBQTZDLGdDQUFnQyxDQUFDLHFDQUFxQyxnQ0FBZ0MsQ0FBQyw4Q0FBOEMsZ0NBQWdDLENBQUMsdUNBQXVDLGdDQUFnQyxDQUFDLHlDQUF5QyxnQ0FBZ0MsQ0FBQywyQ0FBMkMsZ0NBQWdDLENBQUMsc0NBQXNDLGdDQUFnQyxDQUFDLHFDQUFxQyxnQ0FBZ0MsQ0FBQyxxQ0FBcUMsZ0NBQWdDLENBQUMsb0NBQW9DLGdDQUFnQyxDQUFDLDJDQUEyQyxnQ0FBZ0MsQ0FBQyxvQ0FBb0MsZ0NBQWdDLENBQUMsc0NBQXNDLGdDQUFnQyxDQUFDLG9DQUFvQyxnQ0FBZ0MsQ0FBQyxnREFBZ0QsZ0NBQWdDLENBQUMsMENBQTBDLGdDQUFnQyxDQUFDLDJDQUEyQyxnQ0FBZ0MsQ0FBQyx3Q0FBd0MsZ0NBQWdDLENBQUMsc0NBQXNDLGdDQUFnQyxDQUFDLDRDQUE0QyxnQ0FBZ0MsQ0FBQyxnREFBZ0QsZ0NBQWdDLENBQUMsMkNBQTJDLGdDQUFnQyxDQUFDLHlDQUF5QyxnQ0FBZ0MsQ0FBQyx3Q0FBd0MsZ0NBQWdDLENBQUMscUNBQXFDLGdDQUFnQyxDQUFDLHdDQUF3QyxnQ0FBZ0MsQ0FBQyxxQ0FBcUMsZ0NBQWdDLENBQUMsdUNBQXVDLGdDQUFnQyxDQUFDLHVDQUF1QyxnQ0FBZ0MsQ0FBQyxzQ0FBc0MsZ0NBQWdDLENBQUMsc0NBQXNDLGdDQUFnQyxDQUFDLHNDQUFzQyxnQ0FBZ0MsQ0FBQyw0Q0FBNEMsZ0NBQWdDLENBQUMsK0NBQStDLGdDQUFnQyxDQUFDLDBDQUEwQyxnQ0FBZ0MsQ0FBQyw0Q0FBNEMsaUNBQWlDLENBQUMscUNBQXFDLGlDQUFpQyxDQUFDLHNDQUFzQyxpQ0FBaUMsQ0FBQyx5Q0FBeUMsaUNBQWlDLENBQUMsNENBQTRDLGlDQUFpQyxDQUFDLHdDQUF3QyxpQ0FBaUMsQ0FBQyxnRUFBZ0UsaUNBQWlDLENBQUMsd0NBQXdDLGlDQUFpQyxDQUFDLDRDQUE0QyxpQ0FBaUMsQ0FBQywwQ0FBMEMsaUNBQWlDLENBQUMsdUNBQXVDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyx3Q0FBd0MsaUNBQWlDLENBQUMsd0NBQXdDLGlDQUFpQyxDQUFDLDJDQUEyQyxpQ0FBaUMsQ0FBQyxxQ0FBcUMsaUNBQWlDLENBQUMseUNBQXlDLGlDQUFpQyxDQUFDLDhDQUE4QyxpQ0FBaUMsQ0FBQyxvQ0FBb0MsaUNBQWlDLENBQUMsa0RBQWtELGlDQUFpQyxDQUFDLG9DQUFvQyxpQ0FBaUMsQ0FBQyx3Q0FBd0MsaUNBQWlDLENBQUMsMENBQTBDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQywwQ0FBMEMsaUNBQWlDLENBQUMsNENBQTRDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyxxQ0FBcUMsaUNBQWlDLENBQUMsc0NBQXNDLGlDQUFpQyxDQUFDLHdDQUF3QyxpQ0FBaUMsQ0FBQyxzQ0FBc0MsaUNBQWlDLENBQUMsc0NBQXNDLGlDQUFpQyxDQUFDLHdDQUF3QyxpQ0FBaUMsQ0FBQyx1Q0FBdUMsaUNBQWlDLENBQUMsc0NBQXNDLGlDQUFpQyxDQUFDLGdEQUFnRCxpQ0FBaUMsQ0FBQyxtRUFBbUUsaUNBQWlDLENBQUMsdUNBQXVDLGlDQUFpQyxDQUFDLDBDQUEwQyw0QkFBNEIsQ0FBQyw0Q0FBNEMsZ0NBQWdDLENBQUMsNkNBQTZDLGdDQUFnQyxDQUFDLHlDQUF5QyxnQ0FBZ0MsQ0FBQyxzREFBc0QsaUNBQWlDLENBQUMsaURBQWlELGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyx1Q0FBdUMsaUNBQWlDLENBQUMseUNBQXlDLGlDQUFpQyxDQUFDLGlEQUFpRCxpQ0FBaUMsQ0FBQyxxQ0FBcUMsaUNBQWlDLENBQUMscUNBQXFDLGlDQUFpQyxDQUFDLHVDQUF1QyxpQ0FBaUMsQ0FBQyw0Q0FBNEMsaUNBQWlDLENBQUMsc0NBQXNDLGlDQUFpQyxDQUFDLHdDQUF3QyxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7RUFRbCtqQixDQUFDLFdBQVcsV0FBVyxDQUFDLHNDQUFzQyxDQUFDLFdBQVcsQ0FBQyw0REFBNEQsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLHVCQUF1QixDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLDRCQUE0QixvQkFBb0IsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsNENBQTRDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsa0VBQWtFLG1CQUFtQixDQUFDLG9CQUFvQixvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxtREFBbUQsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsMEJBQTBCLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixZQUFZLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsYUFBYSxZQUFZLENBQUMsYUFBYSxjQUFjLENBQUMsYUFBYSx1QkFBdUIsQ0FBQyxhQUFhLHVCQUF1QixDQUFDLGFBQWEsdUJBQXVCLENBQUMsYUFBYSxjQUFjLENBQUMseUJBQXlCLHVCQUF1QixDQUFDLHlCQUF5Qix1QkFBdUIsQ0FBQyx5QkFBeUIsY0FBYyxDQUFDLHlCQUF5QixjQUFjLENBQUMseUJBQXlCLHNCQUFzQixDQUFDLGdCQUFnQixjQUFjLENBQUMsYUFBYSxDQUFDLGlCQUFpQixzQkFBc0IsQ0FBQyxrQkFBa0Isc0JBQXNCLENBQUMsaUJBQWlCLHNCQUFzQixDQUFDLGdCQUFnQixhQUFhLENBQUMsNEJBQTRCLHVCQUF1QixDQUFDLDZCQUE2Qix1QkFBdUIsQ0FBQyx1QkFBdUIsY0FBYyxDQUFDLDZCQUE2QixjQUFjLENBQUMsNEJBQTRCLHNCQUFzQixDQUFDLGVBQWUsU0FBUyxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMscUJBQXFCLHFCQUFxQixDQUFDLGVBQWUscUJBQXFCLENBQUMscUJBQXFCLHFCQUFxQixDQUFDLG9CQUFvQixhQUFhLENBQUMsZ0JBQWdCLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHNCQUFzQixVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLFlBQVksQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsYUFBYSxDQUFDLDZCQUE2QixhQUFhLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyx3QkFBd0IsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLG9CQUFvQixXQUFXLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxnQ0FBZ0MsMEJBQTBCLENBQUMsNkJBQTZCLHNHQUFzRyxDQUFDLHVFQUF1RSxDQUFDLHVHQUErRCxDQUEvRCwrREFBK0QsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsMEJBQTBCLHNHQUFzRyxDQUFDLHVFQUF1RSxDQUFDLHVHQUErRCxDQUEvRCwrREFBK0QsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLGtCQUFrQixDQUFDLGVBQWUsdUJBQXVCLENBQUMsc0JBQXNCLHVCQUF1QixDQUFDLHdCQUF3QiwrQkFBK0IsQ0FBQyx3QkFBd0IsdUJBQXVCLENBQUMsK0JBQStCLHVCQUF1QixDQUFDLGtCQUFrQix1QkFBdUIsQ0FBQyx5QkFBeUIsdUJBQXVCLENBQUMsMkJBQTJCLCtCQUErQixDQUFDLDJCQUEyQix1QkFBdUIsQ0FBQyxrQ0FBa0MsdUJBQXVCLENBQUMsaUJBQWlCLHVCQUF1QixDQUFDLHdCQUF3Qix1QkFBdUIsQ0FBQywwQkFBMEIsK0JBQStCLENBQUMsMEJBQTBCLHVCQUF1QixDQUFDLGlDQUFpQyx1QkFBdUIsQ0FBQyxrQkFBa0IsdUJBQXVCLENBQUMseUJBQXlCLHVCQUF1QixDQUFDLDJCQUEyQiwrQkFBK0IsQ0FBQywyQkFBMkIsdUJBQXVCLENBQUMsa0NBQWtDLHVCQUF1QixDQUFDLGlCQUFpQix1QkFBdUIsQ0FBQyx3QkFBd0IsdUJBQXVCLENBQUMsMEJBQTBCLCtCQUErQixDQUFDLDBCQUEwQix1QkFBdUIsQ0FBQyxpQ0FBaUMsdUJBQXVCLENBQUMsZ0JBQWdCLHVCQUF1QixDQUFDLHVCQUF1Qix1QkFBdUIsQ0FBQyx5QkFBeUIsK0JBQStCLENBQUMseUJBQXlCLHVCQUF1QixDQUFDLGdDQUFnQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsdUJBQXVCLENBQUMsdUJBQXVCLHVCQUF1QixDQUFDLHlCQUF5QiwrQkFBK0IsQ0FBQyx5QkFBeUIsdUJBQXVCLENBQUMsZ0NBQWdDLHVCQUF1QixDQUFDLGtCQUFrQix1QkFBdUIsQ0FBQyx5QkFBeUIsdUJBQXVCLENBQUMsMkJBQTJCLCtCQUErQixDQUFDLDJCQUEyQix1QkFBdUIsQ0FBQyxrQ0FBa0MsdUJBQXVCLENBQUMsa0JBQWtCLHVCQUF1QixDQUFDLHlCQUF5Qix1QkFBdUIsQ0FBQywyQkFBMkIsK0JBQStCLENBQUMsMkJBQTJCLHVCQUF1QixDQUFDLGtDQUFrQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsdUJBQXVCLENBQUMsdUJBQXVCLHVCQUF1QixDQUFDLHlCQUF5QiwrQkFBK0IsQ0FBQyx5QkFBeUIsdUJBQXVCLENBQUMsZ0NBQWdDLHVCQUF1QixDQUFDLGlCQUFpQix1QkFBdUIsQ0FBQyx3QkFBd0IsdUJBQXVCLENBQUMsMEJBQTBCLCtCQUErQixDQUFDLDBCQUEwQix1QkFBdUIsQ0FBQyxpQ0FBaUMsdUJBQXVCLENBQUMsZ0JBQWdCLHVCQUF1QixDQUFDLHVCQUF1Qix1QkFBdUIsQ0FBQyx5QkFBeUIsK0JBQStCLENBQUMseUJBQXlCLHVCQUF1QixDQUFDLGdDQUFnQyx1QkFBdUIsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHlCQUF5QixnQkFBZ0IsQ0FBQyw4Q0FBOEMsaUJBQWlCLENBQUMscUJBQXFCLGtCQUFrQixDQUFDLDJCQUEyQixvQkFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLHFEQUFxRCxVQUFVLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLG1DQUFtQyxXQUFXLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixTQUFTLENBQUMsb0JBQW9CLDJCQUEyQixDQUFDLDBDQUEwQyxDQUFDLGdDQUFnQywyQkFBMkIsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDZCQUE2Qix3Q0FBd0MsQ0FBQyxpQkFBaUIsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLHNCQUFzQixzQkFBc0IsQ0FBQyx1QkFBdUIsc0JBQXNCLENBQUMsaUVBQWlFLGNBQWMsQ0FBQyx1QkFBdUIsdUJBQXVCLENBQUMsc0JBQXNCLHVCQUF1QixDQUFDLG9CQUFvQixlQUFlLENBQUMseUJBQXlCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixrQkFBa0IsQ0FBQywyQ0FBMkMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsMkNBQTJDLENBQUMsMkJBQTJCLFlBQVksQ0FBQyxlQUFlLENBQUMsMkNBQTJDLENBQUMseUJBQXlCLHFCQUFxQixDQUFDLDBCQUEwQixxQkFBcUIsQ0FBQyxvRUFBb0UsYUFBYSxDQUFDLDBCQUEwQixzQkFBc0IsQ0FBQyx5QkFBeUIsc0JBQXNCLENBQUMsMkRBQTJELHNCQUFzQixDQUFDOzs7Ozs7OztFQVExL1EsQ0FBQyxXQUFXLGlCQUFpQixDQUFDLDJDQUE4QyxDQUFDLHVTQUFzVSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQUMsaUNBQWlDLENBQUMsa0NBQWtDLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsY0FBYyx3QkFBd0IsQ0FBQyxlQUFlLFVBQVUsQ0FBQyxhQUFhLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsZ0NBQWdDLEtBQUssMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLHdCQUF3QixLQUFLLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxhQUFhLG1CQUFtQixDQUFDLGNBQWMsbUJBQW1CLENBQUMsa0JBQWtCLG1CQUFtQixDQUFDLGdCQUFnQixxQkFBcUIsQ0FBQyxjQUFjLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyx5QkFBeUIsY0FBYyxDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQyxxQ0FBcUMsbUJBQW1CLENBQUMsZ0JBQWdCLDZCQUE2QixDQUFDLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLGtEQUFrRCxDQUFDLDBDQUEwQyxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLHlCQUF5QixXQUFXLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLDJDQUEyQyw2QkFBNkIsQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsNkJBQTZCLENBQUMscUJBQXFCLENBQUMsNkRBQTZELCtCQUErQixDQUFDLHVCQUF1QixDQUFDLG9EQUFvRCxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsa0RBQWtELENBQUMsMENBQTBDLENBQUMseUJBQXlCLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsa0RBQWtELGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixVQUFVLENBQUMsV0FBVyx1QkFBdUIsQ0FBQyxvQkFBb0IsdUJBQXVCLENBQUMsMERBQTBELGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsdUJBQXVCLENBQUMsdUJBQXVCLHVCQUF1QixDQUFDLGdFQUFnRSxrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLHVCQUF1QixDQUFDLHVCQUF1Qix1QkFBdUIsQ0FBQyxnRUFBZ0Usa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsYUFBYSx1QkFBdUIsQ0FBQyxzQkFBc0IsdUJBQXVCLENBQUMsOERBQThELGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsdUJBQXVCLENBQUMsc0JBQXNCLHVCQUF1QixDQUFDLDhEQUE4RCxrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLHVCQUF1QixDQUFDLHFCQUFxQix1QkFBdUIsQ0FBQyw0REFBNEQsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsWUFBWSx1QkFBdUIsQ0FBQyxxQkFBcUIsdUJBQXVCLENBQUMsNERBQTRELGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsdUJBQXVCLENBQUMsdUJBQXVCLHVCQUF1QixDQUFDLGdFQUFnRSxrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLHVCQUF1QixDQUFDLHVCQUF1Qix1QkFBdUIsQ0FBQyxnRUFBZ0Usa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsWUFBWSx1QkFBdUIsQ0FBQyxxQkFBcUIsdUJBQXVCLENBQUMsNERBQTRELGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGFBQWEsdUJBQXVCLENBQUMsc0JBQXNCLHVCQUF1QixDQUFDLDhEQUE4RCxrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLHVCQUF1QixDQUFDLHFCQUFxQix1QkFBdUIsQ0FBQyw0REFBNEQsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsYUFBYSx1QkFBdUIsQ0FBQyxzQkFBc0IsdUJBQXVCLENBQUMsOERBQThELGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLHlCQUF5QixhQUFhLENBQUMsY0FBYyxDQUFDLHlCQUF5QixhQUFhLENBQUMsY0FBYyxDQUFDLDJCQUEyQixhQUFhLENBQUMsZUFBZSxDQUFDLGVBQWUsYUFBYSxDQUFDLDJCQUEyQixhQUFhLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLHVCQUF1QixhQUFhLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLHlCQUF5QixhQUFhLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLCtCQUErQixhQUFhLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLFFBQVEsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGNBQWMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLDBCQUEwQixlQUFlLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLFFBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLDJFQUEyRSxDQUFDLCtCQUErQixLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsOEJBQThCLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQ0FBaUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsOEJBQThCLHVGQUF1RixDQUFDLDBCQUEwQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLGtEQUFrRCxlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDBDQUEwQyxlQUFlLENBQUMsMENBQTBDLGVBQWUsQ0FBQywyQ0FBMkMsZUFBZSxDQUFDLHdDQUF3QyxlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsMENBQTBDLGVBQWUsQ0FBQyx3Q0FBd0MsZUFBZSxDQUFDLDBDQUEwQyxlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLGlCQUFpQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHNDQUFzQyxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLHdDQUF3QyxlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsaUJBQWlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGlCQUFpQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG1DQUFtQyxlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHdDQUF3QyxlQUFlLENBQUMsd0NBQXdDLGVBQWUsQ0FBQyx5Q0FBeUMsZUFBZSxDQUFDLHNDQUFzQyxlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLG1DQUFtQyxlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLG1DQUFtQyxlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGlCQUFpQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLG1DQUFtQyxlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyx5Q0FBeUMsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG9DQUFvQyxlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGlCQUFpQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQ0FBcUMsZUFBZSxDQUFDLDJDQUEyQyxlQUFlLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLG9DQUFvQyxlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsMENBQTBDLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxvQ0FBb0MsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGlCQUFpQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsZ0JBQWdCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsdUNBQXVDLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLG9DQUFvQyxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLG1DQUFtQyxlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGlCQUFpQixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLG1CQUFtQixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLHdCQUF3QixlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLG9CQUFvQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLGdCQUFnQixlQUFlLENBQUMsaUJBQWlCLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLGtCQUFrQixlQUFlLENBQUMsa0JBQWtCLGVBQWUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHNDQUFzQyxlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsOEJBQThCLGVBQWUsQ0FBQyx1QkFBdUIsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLHlCQUF5QixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLHVCQUF1QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHFCQUFxQixlQUFlLENBQUMsc0JBQXNCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHNCQUFzQixlQUFlLENBQUMsdUJBQXVCLGVBQWUsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsb0JBQW9CLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLFdBQVcseUJBQXlCLENBQUMsMkNBQXNELENBQUMsMFNBQThXLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLGVBQWUseUJBQXlCLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLGtEQUFrRCxlQUFlLENBQUMsa0RBQWtELGVBQWUsQ0FBQyxtREFBbUQsZUFBZSxDQUFDLGdEQUFnRCxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLHlDQUF5QyxlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyxxQ0FBcUMsZUFBZSxDQUFDLG9DQUFvQyxlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyx3Q0FBd0MsZUFBZSxDQUFDLHdDQUF3QyxlQUFlLENBQUMseUNBQXlDLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLDZCQUE2QixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsd0NBQXdDLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHdDQUF3QyxlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLG9DQUFvQyxlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQywyQkFBMkIsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsaUNBQWlDLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLHVDQUF1QyxlQUFlLENBQUMsb0NBQW9DLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsb0NBQW9DLGVBQWUsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLCtCQUErQixlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDBCQUEwQixlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQywyQ0FBMkMsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLHFDQUFxQyxlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLGlDQUFpQyxlQUFlLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLDRCQUE0QixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyxrQ0FBa0MsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLHNDQUFzQyxlQUFlLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyxxQ0FBcUMsZUFBZSxDQUFDLDJCQUEyQixlQUFlLENBQUMscUNBQXFDLHlCQUF5QixDQUFDLDBCQUEwQixlQUFlLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxXQUFXLHVCQUF1QixDQUFDLDRDQUFvRCxDQUFDLDRTQUFvVyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxnNUtBQWc1Syx1QkFBdUIsQ0FBQzs7Ozs7Ozs7RUFRenVpRSxDQUFDLFVBQVUsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDLGFBQWEsYUFBYSxDQUFDLDRCQUE0QixhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxtQ0FBbUMsWUFBWSxDQUFDLHlEQUF5RCxhQUFhLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLHVDQUF1QyxjQUFjLENBQUMsV0FBVyxDQUFDLDJEQUEyRCxvQkFBb0IsQ0FBQyx3R0FBd0csb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsb0hBQW9ILG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLG9IQUFvSCxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyw0RkFBNEYscUJBQXFCLENBQUMsK0lBQStJLCtCQUErQixDQUFDLHVDQUF1QyxlQUFlLENBQUMsZ0dBQWdHLG9CQUFvQixDQUFDLG1IQUFtSCxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxnSUFBZ0ksa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsZ0NBQWdDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxpQ0FBaUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLHFDQUFxQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsaURBQWlELFdBQVcsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLDJEQUEyRCxlQUFlLENBQUMsdUNBQXVDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDhFQUE4RSxVQUFVLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLDhFQUE4RSxVQUFVLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLGtGQUFrRixXQUFXLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLHNGQUFzRixXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxrRkFBa0YsV0FBVyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQywwRUFBMEUsV0FBVyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyw4RUFBOEUsV0FBVyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQywwRkFBMEYsV0FBVyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxnREFBZ0Qsb0JBQW9CLENBQUMscUJBQXFCLENBQUM7Ozs7Ozs7O0VBUWwrRyxDQUFDLFVBQVUsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUF1RCxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsUUFBUSxDQUFDLGNBQWMsQ0FBc0MsYUFBYSxDQUFDLFNBQVMsQ0FBQywrQ0FBK0MsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsNERBQTRELENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1DQUFtQyxDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixDQUFDLG9FQUFvRSxDQUFDLDREQUE0RCxDQUFDLG9EQUFvRCxDQUFDLGdGQUFnRixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQywyQ0FBMkMsMkJBQTJCLENBQUMsa0NBQWtDLDJCQUEyQixDQUFDLHNDQUFzQywyQkFBMkIsQ0FBQyw0REFBNEQsV0FBVyxDQUFDLGtFQUFrRSxtQkFBbUIsQ0FBQyw0Q0FBNEMsMkJBQTJCLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHdDQUF3QyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxnQ0FBZ0MsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsMENBQTBDLENBQUMsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsNENBQTRDLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsNENBQTRDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsa0dBQWtHLDJCQUEyQixDQUFDLGdGQUFnRiwyQkFBMkIsQ0FBQyx3RkFBd0YsMkJBQTJCLENBQUMsc0JBQXNCLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsaURBQWlELGFBQWEsQ0FBQyx3Q0FBd0MsYUFBYSxDQUFDLDRDQUE0Qyx1QkFBdUIsQ0FBQyx1REFBdUQsYUFBYSxDQUFDLDhDQUE4QyxhQUFhLENBQUMsa0RBQWtELHVCQUF1QixDQUFDLDRCQUE0QixrQ0FBa0MsQ0FBQyxzQ0FBc0MsQ0FBQyxtQkFBbUIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyx5QkFBeUIsQ0FBQyxrQ0FBa0MsV0FBVyxDQUFDLGlDQUFpQyx3QkFBd0IsQ0FBQywyQkFBMkIsQ0FBQyxnREFBZ0QsMEJBQTBCLENBQUMseUJBQXlCLENBQUMsK0JBQStCLFVBQVUsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLGdFQUFnRSwwQkFBMEIsQ0FBQyx1REFBdUQsMEJBQTBCLENBQUMsMkRBQTJELDBCQUEwQixDQUFDLHNCQUFzQixjQUFjLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsMkNBQTJDLENBQUMsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsaUNBQWlDLG1CQUFtQixDQUFDLHFCQUFxQixvQ0FBb0MsQ0FBQyx5REFBeUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsMkJBQTJCLGNBQWMsQ0FBQywrQkFBK0IsU0FBUyxDQUFDLFVBQVUsQ0FBQyxxQ0FBcUMsVUFBVSxDQUFDLFFBQVEsQ0FBQywyQ0FBMkMsQ0FBQyw4Q0FBOEMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxvQ0FBb0MsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsa0NBQWtDLFNBQVMsQ0FBQyx5QkFBOEQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsc0NBQXNDLHVCQUF1QixDQUFDLDBCQUEwQixDQUFDLG9FQUFvRSx5QkFBeUIsQ0FBQyw0QkFBNEIsQ0FBQywwRUFBMEUsd0JBQXdCLENBQUMsMkJBQTJCLENBQUMsNkJBQTZCLENBQUMsZ0ZBQWdGLHlCQUF5QixDQUFDLHdDQUF3QyxtQ0FBbUMsQ0FBQyxzQ0FBc0MsQ0FBQyx3Q0FBd0MsQ0FBQywrQ0FBK0Msd0JBQXdCLENBQUMsMkJBQTJCLENBQUMsOENBQThDLG9DQUFvQyxDQUFDLGdDQUFnQyxPQUFPLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLGdDQUFnQyxDQUFDLHFGQUFxRiw2QkFBNkIsQ0FBQyxrRkFBa0YsOEJBQThCLENBQUMsa0ZBQWtGLG1CQUFtQixDQUFDLHNEQUFzRCw0QkFBNEIsQ0FBQyxtREFBbUQsNkJBQTZCLENBQUMsbURBQW1ELGtCQUFrQixDQUFDLDJCQUEyQixPQUFPLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1EQUEyRixZQUFZLENBQWdELGtCQUFrQixDQUFzQyxhQUFhLENBQUMsMkRBQTJELHVCQUF1QixDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxtREFBbUQsbUNBQW1DLENBQUMsc0NBQXNDLENBQUMsd0NBQXdDLENBQUMsZ09BQWdPLGVBQWUsQ0FBQywyTUFBMk0sMkNBQTJDLENBQUMseURBQXlELG9DQUFvQyxDQUFDLHNDQUFzQyxrQ0FBa0MsQ0FBQyxxQ0FBcUMsQ0FBQyx1Q0FBdUMsQ0FBQyxtSUFBbUksZUFBZSxDQUFDLHVLQUF1SywyQ0FBMkMsQ0FBQyw0Q0FBNEMsbUNBQW1DLENBQUMseUJBQXlCLFdBQVcsQ0FBQyxnQkFBd0QsWUFBWSxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxlQUFlLHFCQUFxQixDQUFDLGdCQUFnQixxQkFBcUIsQ0FBQyxVQUFVLGFBQWEsQ0FBQyxnQkFBZ0Isc0JBQXNCLENBQUMsY0FBYyxzQkFBc0IsQ0FBQyxlQUFlLHNCQUFzQixDQUFDLGtCQUFrQixzQkFBc0IsQ0FBQzs7Ozs7Ozs7RUFRdjBRLENBQUMsVUFBVSxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLDBCQUEwQixDQUFDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLHNCQUFzQixhQUFhLENBQUMscUJBQXFCLGNBQWMsQ0FBQyxXQUFXLGNBQWMsQ0FBQyxZQUFZLGNBQWMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixTQUFTLENBQUMsY0FBYyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxnQkFBZ0IsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0Isa0JBQWtCLENBQUMsNkNBQTZDLGNBQWMsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLDZCQUE2QixTQUFTLENBQUMsa0JBQWtCLG9CQUFvQixDQUFDLHFCQUFxQixvQkFBb0IsQ0FBQyx5R0FBeUcsd0JBQXdCLENBQUMsMkdBQTJHLHlCQUF5QixDQUFDLHdEQUF3RCwyQkFBMkIsQ0FBQyx5REFBeUQsNEJBQTRCLENBQUMscUdBQXFHLHlCQUF5QixDQUFDLGlFQUFpRSxZQUFZLENBQUMsNEJBQTRCLENBQUMsZ0JBQWdCLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsbUNBQW1DLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUMsMkNBQTJDLENBQUMsd0JBQXdCLHlCQUF5QixDQUFDLHFDQUFxQyxDQUFDLHNCQUFzQixDQUFDLDJDQUEyQyxDQUFDLG9DQUFvQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsMkNBQTJDLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGtEQUFrRCxpQkFBaUIsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxnREFBZ0QsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyw4Q0FBOEMsQ0FBQyxzQ0FBc0MsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLGlCQUFpQixzQ0FBc0MsQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsc0NBQXNDLENBQUMsOEJBQThCLENBQUMsa0NBQWtDLENBQUMsbUNBQW1DLENBQUMsK0JBQStCLENBQUMsMEJBQTBCLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsdUJBQXVCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLGtEQUFrRCxVQUFVLENBQUMsTUFBTSxDQUFDLDRCQUE0QixnQ0FBZ0MsQ0FBQyxrQ0FBa0MsQ0FBQyxpQ0FBaUMsQ0FBQywrQkFBK0IsQ0FBQyx3QkFBd0IsQ0FBQyw0QkFBNEIsaUJBQWlCLENBQUMsNkJBQTZCLFFBQVEsQ0FBQyxVQUFVLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBNEIscUJBQXFCLENBQUMsMkNBQTJDLENBQUMsNEJBQTRCLENBQUMsdUJBQXVCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLHdCQUF3QixDQUFDLG1CQUFtQixDQUFDLCtCQUErQixDQUFDLG1CQUFtQixDQUFDLGlDQUFpQyw4QkFBOEIsQ0FBQyxrQkFBa0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDJDQUEyQyxDQUFDLHVDQUF1QyxTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLHNEQUFzRCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsNERBQTRELHlCQUF5QixDQUFDLDRGQUE0RixpQ0FBaUMsQ0FBQyxtQkFBbUIsQ0FBQyw4QkFBOEIsK0JBQStCLENBQUMsOENBQThDLHFDQUFxQyxDQUFDLG1CQUFtQixDQUFDLG9EQUFvRCxVQUFVLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsMkNBQTJDLENBQUMsb0NBQW9DLFFBQVEsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUMsc0NBQXNDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQywyQ0FBMkMsQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsMkNBQTJDLENBQUMseUNBQXlDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDLDBDQUEwQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLDJDQUEyQyxDQUFDLG1CQUFtQixVQUFVLENBQUMsMENBQTBDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLHdEQUF3RCxvQkFBb0IsQ0FBQyxpQkFBaUIsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLHdEQUF3RCx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxrRkFBa0Ysd0JBQXdCLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsMkRBQTJELDhCQUE4QixDQUFDLDBDQUEwQyxzQkFBc0IsQ0FBQyxvQ0FBb0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsaURBQWlELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGdEQUFnRCxzQ0FBc0MsQ0FBQyxxQkFBcUIsOEJBQThCLENBQUMsb0JBQW9CLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLDhEQUE4RCwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQywwQ0FBMEMsa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsdURBQXVELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLHNEQUFzRCxzQ0FBc0MsQ0FBQyx3QkFBd0IsOEJBQThCLENBQUMsdUJBQXVCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLG9FQUFvRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQywwQ0FBMEMsa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsdURBQXVELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLHNEQUFzRCxzQ0FBc0MsQ0FBQyx3QkFBd0IsOEJBQThCLENBQUMsdUJBQXVCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLG9FQUFvRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyx3Q0FBd0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMscURBQXFELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLG9EQUFvRCxzQ0FBc0MsQ0FBQyx1QkFBdUIsOEJBQThCLENBQUMsc0JBQXNCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGtFQUFrRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyx3Q0FBd0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMscURBQXFELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLG9EQUFvRCxzQ0FBc0MsQ0FBQyx1QkFBdUIsOEJBQThCLENBQUMsc0JBQXNCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGtFQUFrRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxzQ0FBc0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsbURBQW1ELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGtEQUFrRCxzQ0FBc0MsQ0FBQyxzQkFBc0IsOEJBQThCLENBQUMscUJBQXFCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGdFQUFnRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxzQ0FBc0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsbURBQW1ELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGtEQUFrRCxzQ0FBc0MsQ0FBQyxzQkFBc0IsOEJBQThCLENBQUMscUJBQXFCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGdFQUFnRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQywwQ0FBMEMsa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsdURBQXVELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLHNEQUFzRCxzQ0FBc0MsQ0FBQyx3QkFBd0IsOEJBQThCLENBQUMsdUJBQXVCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLG9FQUFvRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQywwQ0FBMEMsa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsdURBQXVELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLHNEQUFzRCxzQ0FBc0MsQ0FBQyx3QkFBd0IsOEJBQThCLENBQUMsdUJBQXVCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLG9FQUFvRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxzQ0FBc0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsbURBQW1ELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGtEQUFrRCxzQ0FBc0MsQ0FBQyxzQkFBc0IsOEJBQThCLENBQUMscUJBQXFCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGdFQUFnRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyx3Q0FBd0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMscURBQXFELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLG9EQUFvRCxzQ0FBc0MsQ0FBQyx1QkFBdUIsOEJBQThCLENBQUMsc0JBQXNCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGtFQUFrRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxzQ0FBc0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsbURBQW1ELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLGtEQUFrRCxzQ0FBc0MsQ0FBQyxzQkFBc0IsOEJBQThCLENBQUMscUJBQXFCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGdFQUFnRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyx3Q0FBd0Msa0NBQWtDLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMscURBQXFELGtDQUFrQyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLG9EQUFvRCxzQ0FBc0MsQ0FBQyx1QkFBdUIsOEJBQThCLENBQUMsc0JBQXNCLDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLGtFQUFrRSwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0Isb0JBQW9CLENBQUMsbUNBQW1DLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHVCQUF1QixvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsK0NBQStDLENBQUMsdUNBQXVDLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGdDQUFnQyxvQkFBb0IsQ0FBQyx3Q0FBd0MsVUFBVSxDQUFDLDZCQUE2QixDQUFDLHFCQUFxQixDQUFDLDhDQUE4QyxvQ0FBb0MsQ0FBQyxrREFBa0QsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLDhDQUE4QyxhQUFhLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQywwREFBMEQsV0FBVyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsaUJBQWlCLENBQUMsNEJBQTRCLGlCQUFpQixDQUFDLDBCQUEwQix3QkFBd0IsQ0FBQyx3QkFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLCtCQUErQixDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLHNEQUFzRCxjQUFjLENBQUMsb0VBQW9FLHdCQUF3QixDQUFDLGlFQUFpRSxDQUFDLHlEQUF5RCxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsdUVBQXVFLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxxRkFBcUYsd0JBQXdCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxpRUFBaUUsQ0FBQyx5REFBeUQsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxZQUFZLENBQUMsbUJBQW1CLENBQUMseUNBQXlDLHdCQUF3QixDQUFDLGlFQUFpRSxDQUFDLHlEQUF5RCxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxtQ0FBbUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLDBDQUEwQyx3QkFBd0IsQ0FBQyxnRUFBZ0UsQ0FBQyx3REFBd0QsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0ZBQWdGLGVBQWUsQ0FBQyxpR0FBaUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsK0NBQStDLE9BQU8sQ0FBQyxTQUFTLENBQUMsZ0RBQWdELE9BQU8sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLHNDQUFzQyxzQkFBc0IsQ0FBQyxzQ0FBc0Msc0JBQXNCLENBQUMsd0NBQXdDLHNCQUFzQixDQUFDLDRCQUE0QixzQkFBc0IsQ0FBQyx3Q0FBd0MsY0FBYyxDQUFDLG9DQUFvQyx1QkFBdUIsQ0FBQyxzQ0FBc0MsdUJBQXVCLENBQUMsNENBQTRDLHVCQUF1QixDQUFDOzs7Ozs7OztFQVF0M21CLENBQUMsK0JBQStCLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsbUVBQW1FLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0VBQWdFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxnRUFBZ0UsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsMkJBQTJCLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsMEdBQTBHLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxnSEFBZ0gsYUFBYSxDQUFDLDRHQUE0RyxnQkFBZ0IsQ0FBQywyQ0FBMkMsVUFBVSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyx1REFBdUQscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsa0RBQWtELGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsd0VBQXdFLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLGtEQUFrRCxrQkFBa0IsQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsc0dBQXNHLGtCQUFrQixDQUFDLDBEQUEwRCxrQkFBa0IsQ0FBQyxnSUFBZ0ksb0JBQW9CLENBQUMsc0RBQXNELHdCQUF3QixDQUFDLHNJQUFzSSxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsMEVBQTBFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxrRUFBa0UsYUFBYSxDQUFDLGNBQWMsQ0FBQyxvREFBb0QsYUFBYSxDQUFDLFFBQVEsQ0FBQyw0REFBNEQsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsOERBQThELGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyx3Q0FBd0MsY0FBYyxDQUFDLHNDQUFzQyxjQUFjLENBQUMsYUFBYSxDQUFDLGtEQUFrRCxhQUFhLENBQUMsb0RBQW9ELG9CQUFvQixDQUFDLHNEQUFzRCxjQUFjLENBQUMsdUJBQXVCLENBQUMsa0VBQWtFLHVCQUF1QixDQUFDLGdDQUFnQyxVQUFVLENBQUMsaUNBQWlDLFdBQVcsQ0FBQyxvRkFBb0YsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHNGQUFzRixXQUFXLENBQUMsZ0JBQWdCLENBQUMsc0RBQXNELGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLG9FQUFvRSxXQUFXLENBQUMsY0FBYyxDQUFDLDhFQUE4RSxhQUFhLENBQUMsNEVBQTRFLGdCQUFnQixDQUFDLG9CQUFvQixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsbURBQW1ELHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixjQUFjLENBQUMsZ0JBQWdCLENBQUMsME5BQTBOLHFCQUFxQixDQUFDLDJFQUEyRSx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQyxpQ0FBaUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLHlFQUF5RSxVQUFVLENBQUMsb0JBQW9CLENBQUMsc0RBQXNELG1CQUFtQixDQUFDLGlDQUFpQyxDQUFDLHdFQUF3RSxvQ0FBb0MsQ0FBQyw4REFBOEQscUJBQXFCLENBQUMsb0VBQW9FLDBCQUEwQixDQUFDLHNFQUFzRSwwQkFBMEIsQ0FBQyxnRkFBZ0YsMEJBQTBCLENBQUMsd0RBQXdELGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxvRUFBb0UsYUFBYSxDQUFDLG1DQUFtQyxvQ0FBb0MsQ0FBQyx5Q0FBeUMsdUJBQXVCLENBQUMsOEdBQThHLDRCQUE0QixDQUFDLHVIQUF1SCwrQkFBK0IsQ0FBQyx1SEFBdUgsK0JBQStCLENBQUMsd0VBQXdFLG9CQUFvQixDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLDBFQUEwRSxvQkFBb0IsQ0FBQyw0RUFBNEUsb0JBQW9CLENBQUMsMkVBQTJFLHFCQUFxQixDQUFDLG1HQUFtRywwQkFBMEIsQ0FBQyw0RkFBNEYsVUFBVSxDQUFDLDhGQUE4RixVQUFVLENBQUMsOEZBQThGLFVBQVUsQ0FBQyx3REFBd0QsY0FBYyxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsaUZBQWlGLENBQUMseUVBQXlFLENBQUMsOEVBQThFLGVBQWUsQ0FBQyxtRUFBbUUsMEJBQTBCLENBQUMsb0JBQW9CLENBQUMsc0VBQXNFLDBCQUEwQixDQUFDLG9CQUFvQixDQUFDLHNFQUFzRSwwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsY0FBYyxDQUFDLDBCQUEwQixDQUFDLHdDQUF3QyxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMseUNBQXlDLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyx5Q0FBeUMsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLDhJQUE4SSxlQUFlLENBQUMsd0JBQXdCLGdHQUFnRyxDQUFDLHdGQUF3RixDQUFDLCtDQUErQyxnQkFBZ0IsQ0FBQyxrRkFBa0YsY0FBYyxDQUFDLGVBQWUsQ0FBQyxzRUFBc0UsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLG1CQUFtQixDQUFDLG9FQUFvRSxpQkFBaUIsQ0FBQyx5RkFBeUYsd0JBQXdCLENBQXVCLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLDJGQUEyRixxQkFBcUIsQ0FBQyxzQ0FBc0Msb0JBQW9CLENBQUMsNERBQTRELGFBQWEsQ0FBQyxxRUFBcUUsbUJBQW1CLENBQUMsNkZBQTZGLGFBQWEsQ0FBQyxxRkFBcUYscUJBQXFCLENBQUMsNkdBQTZHLFlBQVksQ0FBQyxpRUFBaUUscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsa0VBQWtFLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLHVGQUF1RixpQkFBaUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUF1QixvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyx5QkFBeUIsQ0FBQyxrQ0FBa0MsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsa0hBQWtILDBCQUEwQixDQUFDLDRFQUE0RSx3QkFBd0IsQ0FBQyw0QkFBNEIsbUJBQW1CLENBQUMscUNBQXFDLGVBQWUsQ0FBQyw0REFBNEQsZ0JBQWdCLENBQUMsa0RBQWtELGFBQWEsQ0FBQyx3SEFBd0gsZUFBZSxDQUFDLGlCQUFpQixDQUFDLHVCQUF1Qix1Q0FBdUMsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG1DQUFtQyxlQUFlLENBQUMsNEVBQTRFLGVBQWUsQ0FBQywwREFBMEQsb0JBQW9CLENBQUMsMkVBQTJFLGFBQWEsQ0FBQyxjQUFjLENBQUMsaURBQWlELG9CQUFvQixDQUFDLHlCQUF5QixhQUFhLENBQUMsb0VBQW9FLG9CQUFvQixDQUFDLHFDQUFxQyxhQUFhLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLDJDQUEyQyxnQkFBZ0IsQ0FBQyx3RUFBd0UsUUFBUSxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsYUFBYSxDQUFDLG9EQUFvRCxpQkFBaUIsQ0FBQyxtREFBbUQsa0JBQWtCLENBQUMsa0NBQWtDLGVBQWUsQ0FBQyx3Q0FBd0MsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLDhDQUE4QyxnQkFBZ0IsQ0FBQywyR0FBMkcsaUNBQWlDLENBQUMsNENBQTRDLHVDQUF1QyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGlDQUFpQywwQ0FBMEMsQ0FBQyxtRUFBbUUsdUJBQXVCLENBQUMsMEJBQTBCLENBQUMsa0NBQWtDLGNBQWMsQ0FBQyx3Q0FBd0Msa0JBQWtCLENBQUMseUJBQXlCLGFBQWEsQ0FBQyxvRUFBb0Usb0JBQW9CLENBQUMscUNBQXFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixDQUFDLHdCQUF3QixhQUFhLENBQUMsa0VBQWtFLG9CQUFvQixDQUFDLG9DQUFvQyxhQUFhLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLG9DQUFvQyxnQkFBZ0IsQ0FBQywyQkFBMkIsYUFBYSxDQUFDLHdFQUF3RSxlQUFlLENBQUMsd0NBQXdDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyw4RkFBOEYsa0JBQWtCLENBQUMseUNBQXlDLENBQUMsOERBQThELDJDQUEyQyxDQUFDLDBGQUEwRiwyQ0FBMkMsQ0FBQywwREFBMEQsdUJBQXVCLENBQUMseURBQXlELDBCQUEwQixDQUFDLDhHQUE4RyxpQkFBaUIsQ0FBQyw0R0FBNEcsa0JBQWtCLENBQUMseUVBQXlFLHVCQUF1QixDQUFDLHdFQUF3RSwwQkFBMEIsQ0FBQyw0SUFBNEksbUJBQW1CLENBQUMsMElBQTBJLG9CQUFvQixDQUFDLGNBQWMscUJBQXFCLENBQUMsY0FBYyxxQkFBcUIsQ0FBQyxlQUFlLHFCQUFxQixDQUFDLFNBQVMsYUFBYSxDQUFDLGVBQWUsc0JBQXNCLENBQUMsYUFBYSxzQkFBc0IsQ0FBQyxjQUFjLHNCQUFzQixDQUFDLGlCQUFpQixzQkFBc0IsQ0FBQyxvRUFBb0Usc0JBQXNCLENBQUMsb0VBQW9FLHNCQUFzQixDQUFDLHNFQUFzRSxzQkFBc0IsQ0FBQywwREFBMEQsY0FBYyxDQUFDLHNFQUFzRSx1QkFBdUIsQ0FBQyxrRUFBa0UsdUJBQXVCLENBQUMsb0VBQW9FLHVCQUF1QixDQUFDLDBFQUEwRSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7RUFRaGpmLENBQUMsV0FBVyxZQUFZLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLGtCQUFrQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLGlCQUFpQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLDRDQUE0QyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLDBCQUEwQixLQUFLLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxrQkFBa0IsS0FBSywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsNkNBQTZDLFVBQVUsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsNkNBQTZDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLCtDQUErQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxtQ0FBbUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsMkJBQTJCLENBQUMsK0NBQStDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLDJDQUEyQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQywyQkFBMkIsQ0FBQyw2Q0FBNkMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsMkJBQTJCLENBQUMsbURBQW1ELG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLDJCQUEyQixDQUFDLG1CQUFtQixhQUFhLENBQUMsc0JBQXNCLDBCQUEwQixDQUFDLDZCQUE2QixrQ0FBa0MsQ0FBQyw0QkFBNEIseUNBQXlDLENBQUMsK0JBQStCLHFCQUFxQixDQUFDLHNDQUFzQywyQkFBMkIsQ0FBQyxxQ0FBcUMsNENBQTRDLENBQUMsZ0JBQWdCLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLCtCQUErQiwyQkFBMkIsQ0FBQywrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLHNDQUFzQyxZQUFZLENBQUMsb0RBQW9ELFVBQVUsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsb0RBQW9ELG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLHNEQUFzRCxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBMEMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLHNEQUFzRCxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxrREFBa0QsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsc0JBQXNCLENBQUMsb0RBQW9ELG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLHNCQUFzQixDQUFDLDBEQUEwRCxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxzQkFBc0IsQ0FBQyxxQkFBcUIsY0FBYyxDQUFDLHlCQUF5QixDQUFDLHFCQUFxQix1QkFBdUIsQ0FBQyx5QkFBeUIsQ0FBQyxzQkFBc0IsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLHVCQUF1QixDQUFDLHlCQUF5QixDQUFDLHNCQUFzQix1QkFBdUIsQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsdUJBQXVCLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLHVCQUF1QixDQUFDLHlCQUF5QixDQUFDLHdCQUF3Qix1QkFBdUIsQ0FBQyx5QkFBeUIsQ0FBQyxvQkFBb0IsMEJBQTBCLENBQUMsMkJBQTJCLGtDQUFrQyxDQUFDLDBCQUEwQixxQkFBcUIsQ0FBQyxrQkFBa0IsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLG1EQUFtRCxvQkFBb0IsQ0FBQyxxRUFBcUUsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDOzs7Ozs7OztFQVFoN0ksQ0FBQyxnQkFBZ0IsZUFBZSxDQUFDLGVBQWUsQ0FBQyw4Q0FBOEMsQ0FBQyxzQ0FBc0MsQ0FBQywwQ0FBMEMsQ0FBQyxrQ0FBa0MsQ0FBQyxxQkFBcUIsQ0FBQyxrSkFBa0osQ0FBQyx3R0FBd0csQ0FBQyw4SkFBb0csQ0FBcEcsb0dBQW9HLENBQUMsMkJBQTJCLENBQUMsZUFBZSxDQUFDLHNDQUFzQyxHQUFHLDZCQUE2QixDQUFDLEtBQUssNEJBQTRCLENBQUMsQ0FBQyw4QkFBOEIsR0FBRyw2QkFBNkIsQ0FBQyxLQUFLLDRCQUE0QixDQUFDLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxnQ0FBZ0MsNEJBQTRCLENBQUMsb0JBQW9CLENBQUMsZ0RBQWdELDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLGdFQUFnRSw0QkFBNEIsQ0FBQyxvQkFBb0IsQ0FBQyxnRkFBZ0YsMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsOEhBQThILHFCQUFxQixDQUFDLDZDQUE2QyxZQUFZLENBQUMsMkNBQTJDLFFBQVEsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsZ0RBQWdELFFBQVEsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyx5REFBeUQsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsTUFBTSxDQUFDLDRCQUE0QixPQUFPLENBQUMsc0JBQXNCLGtCQUFrQixDQUFDLHlEQUF5RCxXQUFXLENBQUMsd0NBQXdDLGVBQWUsQ0FBQyx3QkFBd0IsaUJBQWlCLENBQUMsZUFBZSxDQUFDLHlDQUF5QyxRQUFRLENBQUMseUNBQXlDLFNBQVMsQ0FBQyx5Q0FBeUMsU0FBUyxDQUFDLHlDQUF5QyxTQUFTLENBQUMseUNBQXlDLFNBQVMsQ0FBQyw4QkFBOEIseUJBQXlCLENBQUMseUVBQXlFLGtCQUFrQixDQUFDLGdEQUFnRCxzQkFBc0IsQ0FBQyxvQ0FBb0MsU0FBUyxDQUFDLGlEQUFpRCxTQUFTLENBQUMsb0NBQW9DLGVBQWUsQ0FBQywyQ0FBMkMsa0JBQWtCLENBQUMsb0NBQW9DLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGdJQUFnSSxZQUFZLENBQUMscUpBQXFKLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMseUJBQXlCLG9LQUFvSyxDQUFDLDBIQUEwSCxDQUFDLGdMQUFxSCxDQUFySCxzSEFBc0gsQ0FBQywyS0FBMkssd0JBQXdCLENBQUMsMkNBQTJDLFFBQVEsQ0FBQyxnREFBZ0QsU0FBUyxDQUFDLDJDQUEyQyxTQUFTLENBQUMsNkNBQTZDLFNBQVMsQ0FBQyw0Q0FBNEMsU0FBUyxDQUFDLGlEQUFpRCxTQUFTLENBQUMsc0JBQXNCLGNBQWMsQ0FBQzs7Ozs7Ozs7RUFRdHJJLENBQUMsU0FBUyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxTQUFTLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHVCQUF1QixNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixTQUFTLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixhQUFhLENBQUMsdUJBQXVCLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLHlDQUF5QyxDQUFDLHdCQUF3Qix3Q0FBd0MsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLHVCQUF1QixDQUFDLG9CQUFvQixpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLHdCQUF3QixDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQywwQkFBMEIsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsK0NBQStDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxzQkFBc0IsQ0FBQyxjQUFjLHNCQUFzQixDQUFDLGVBQWUsc0JBQXNCLENBQUMsU0FBUyxjQUFjLENBQUMsZUFBZSx1QkFBdUIsQ0FBQyxhQUFhLHVCQUF1QixDQUFDLGNBQWMsdUJBQXVCLENBQUMsaUJBQWlCLHVCQUF1QixDQUFDOzs7Ozs7OztFQVFqd0MsQ0FBQyxXQUFXLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxxQkFBcUIsQ0FBQyw0QkFBNEIsMkJBQTJCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDJCQUEyQiwyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxxRUFBcUUsbUJBQW1CLENBQUMsaUJBQWlCLDJCQUEyQixDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixhQUFhLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsaUNBQWlDLENBQWpDLGlFQUFpQyxDQUFDLGdFQUFnRSxDQUFDLGtDQUFrQywyQkFBMkIsQ0FBQyxpQ0FBaUMsMkJBQTJCLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsNENBQTRDLENBQUMsb0NBQW9DLENBQUMsaUZBQWlGLDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLCtFQUErRSx5Q0FBeUMsQ0FBQyxpQ0FBaUMsQ0FBQyx3Q0FBd0MseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsdUNBQXVDLDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLDZGQUE2Riw0Q0FBNEMsQ0FBQyxvQ0FBb0MsQ0FBQywyRkFBMkYseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsb0NBQW9DLDRDQUE0QyxDQUFDLG9DQUFvQyxDQUFDLHVGQUF1Riw2Q0FBNkMsQ0FBQyxxQ0FBcUMsQ0FBQyxxRkFBcUYseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsc0NBQXNDLDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLDJGQUEyRiw0Q0FBNEMsQ0FBQyxvQ0FBb0MsQ0FBQyx5RkFBeUYseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsaUNBQWlDLFNBQVMsQ0FBQywrRUFBK0UsU0FBUyxDQUFDLGdCQUFnQiwyQkFBMkIsQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsMERBQTBELENBQTFELG1IQUEwRCxDQUFDLGtIQUFrSCxDQUFDLGlDQUFpQywyQkFBMkIsQ0FBQyxnQ0FBZ0MsMkJBQTJCLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsK0VBQStFLDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLDJGQUEyRiw0Q0FBNEMsQ0FBQyxvQ0FBb0MsQ0FBQyxxRkFBcUYsNkNBQTZDLENBQUMscUNBQXFDLENBQUMseUZBQXlGLDRDQUE0QyxDQUFDLG9DQUFvQyxDQUFDLG1DQUFtQywrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyw0RUFBNEUscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsa0xBQWtMLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLHdDQUF3QyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyw2RkFBNkYsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsbURBQW1ELHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxpREFBaUQsc0JBQXNCLENBQUMsNEJBQTRCLFNBQVMsQ0FBQyxtQkFBbUIsZ0JBQWdCLENBQUMsNEJBQTRCLHFDQUFxQyxDQUFDLDZCQUE2QixDQUFDLG9CQUFvQix3QkFBd0IsQ0FBQzs7Ozs7Ozs7RUFRMStLLENBQUMsWUFBWSxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxtQ0FBbUMsQ0FBQyx3QkFBd0IsWUFBWSxDQUFDLHVCQUF1QixlQUFlLENBQUMscUJBQXFCLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLDBDQUEwQyxDQUFDLGdDQUFnQyxrQkFBa0IsQ0FBQyxnQ0FBZ0MsVUFBVSxDQUFDLG9FQUFvRSx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQyxvRUFBb0UsMkJBQTJCLENBQUMsNEJBQTRCLENBQUMsMEVBQTBFLHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLDZFQUE2RSwyQkFBMkIsQ0FBQyw0QkFBNEIsQ0FBQyxtRkFBbUYsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixhQUFhLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLHdCQUFnRSxZQUFZLENBQW9GLHFCQUFxQixDQUE4QyxzQkFBc0IsQ0FBa0QsbUJBQW1CLENBQUMsY0FBaUIsQ0FBakIsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyx3REFBd0QsQ0FBQyxnREFBZ0QsQ0FBQyxpRUFBaUUsYUFBYSxDQUFDLGtJQUFrSSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsa0tBQWtLLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxnQ0FBMkQsaUJBQWlCLENBQUMsd0NBQXdDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxtREFBbUQsY0FBYyxDQUFDLHFDQUFxQyxZQUFZLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyw4QkFBOEIsWUFBWSxDQUFDLDZCQUE2QixlQUFlLENBQUMsb0dBQW9HLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLG1EQUFtRCxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLHlDQUF5QyxjQUFjLENBQUMsZUFBZSxDQUFDLHFEQUFxRCxZQUFZLENBQUMsNENBQTRDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyx1REFBdUQsZUFBZSxDQUFDLG9CQUFvQixvQkFBb0IsQ0FBQyw0R0FBNEcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsdUNBQXVDLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyx1REFBdUQsWUFBWSxDQUFDLGlFQUFpRSxhQUFhLENBQUMsUUFBUSxDQUFDLGdKQUFnSixnQ0FBZ0MsQ0FBQyx1Q0FBdUMsQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLGtDQUFrQyxXQUFXLENBQUMsK0VBQStFLGNBQWMsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLGFBQWEsQ0FBQyxxQkFBMkUsbUJBQW1CLENBQUMsNERBQTRELGFBQWEsQ0FBc0MsYUFBYSxDQUFDLHFCQUFxQixrQkFBa0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsdUNBQXVDLGlGQUFpRixDQUFDLHlFQUF5RSxDQUFDLGFBQWdHLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQywwQkFBMEIsQ0FBQyx5QkFBeUIsWUFBWSxDQUFDLHdCQUF3QixlQUFlLENBQUMsc0JBQXNCLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyx1Q0FBdUMsQ0FBQyxtREFBbUQsZUFBZSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxrREFBa0QsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLHNEQUFzRCxDQUFDLDhDQUE4QyxDQUFDLDJDQUEyQyxDQUFDLGtEQUFrRCwwQkFBMEIsQ0FBQywwQkFBMEIsdUNBQXVDLENBQUMsZ0JBQWdCLENBQUMsbUNBQW1DLGVBQWUsQ0FBQyxpREFBaUQsWUFBWSxDQUFDLHdCQUFnRSxZQUFZLENBQW1GLGtCQUFrQixDQUFDLDRCQUE0QixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsYUFBYSxDQUFDLDBCQUEwQixDQUFDLG1DQUFtQyxDQUFDLGtDQUFrQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsdUNBQXVDLENBQUMsaUNBQW9ELGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDRCQUE0QixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHdDQUF3QyxDQUFDLDhDQUE4QyxlQUFlLENBQUMsNkNBQTZDLGdCQUFnQixDQUFDLHFCQUFxQixXQUFXLENBQUMsdUJBQXVCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQywyQkFBMkIsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQywyQkFBMkIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsK0JBQStCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsMENBQTBDLENBQUMsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsaUVBQWlFLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLGdDQUFnQyxLQUFLLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyx3QkFBd0IsS0FBSywyQkFBMkIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsa0JBQWtCLDJCQUEyQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLDJCQUEyQixXQUFXLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsK0JBQStCLHNDQUFzQyxDQUFDLHlCQUF5QixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxrQ0FBa0Msc0NBQXNDLENBQUMsNEJBQTRCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGtDQUFrQyxzQ0FBc0MsQ0FBQyw0QkFBNEIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsaUNBQWlDLHNDQUFzQyxDQUFDLDJCQUEyQixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxpQ0FBaUMsc0NBQXNDLENBQUMsMkJBQTJCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxzQ0FBc0MsQ0FBQywwQkFBMEIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsZ0NBQWdDLHNDQUFzQyxDQUFDLDBCQUEwQixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxrQ0FBa0Msc0NBQXNDLENBQUMsNEJBQTRCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGtDQUFrQyxzQ0FBc0MsQ0FBQyw0QkFBNEIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsZ0NBQWdDLHNDQUFzQyxDQUFDLDBCQUEwQixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxpQ0FBaUMsc0NBQXNDLENBQUMsMkJBQTJCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxzQ0FBc0MsQ0FBQywwQkFBMEIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsaUNBQWlDLHNDQUFzQyxDQUFDLDJCQUEyQixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLG9DQUFvQyxnQkFBZ0IsQ0FBQyxxQ0FBcUMsaUJBQWlCLENBQUMsdURBQXVELFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxvQ0FBb0MsV0FBVyxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsV0FBVyxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxrREFBa0Qsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsOEJBQThCLHFCQUFxQixDQUFDLHVDQUF1QywwQkFBMEIsQ0FBQyw4QkFBOEIsaUJBQWlCLENBQUMsc0JBQXNCLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLCtCQUErQixvSEFBb0gsQ0FBQyw0RkFBNEYsQ0FBQyw4SEFBb0YsQ0FBcEYsb0ZBQW9GLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLDhCQUE4QixzSEFBc0gsQ0FBQyw4RkFBOEYsQ0FBQyxnSUFBc0YsQ0FBdEYsc0ZBQXNGLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsMERBQTBELGVBQWUsQ0FBQyxtQ0FBbUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLDJDQUEyQyxDQUFDLCtDQUErQyxZQUFZLENBQUMsc0NBQXNDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLHNEQUFzRCxDQUFDLDhDQUE4QyxDQUFDLDJDQUEyQyxDQUFDLGlEQUFpRCxlQUFlLENBQUMsNENBQTRDLHNCQUFzQixDQUFDLDRDQUE0QyxzQkFBc0IsQ0FBQyw4Q0FBOEMsc0JBQXNCLENBQUMsa0NBQWtDLGNBQWMsQ0FBQyw4Q0FBOEMsdUJBQXVCLENBQUMsMENBQTBDLHVCQUF1QixDQUFDLDRDQUE0Qyx1QkFBdUIsQ0FBQyxrREFBa0QsdUJBQXVCLENBQUM7Ozs7Ozs7O0VBUXR3YSxDQUFDLFVBQWdFLG1CQUFtQixDQUFtRixrQkFBa0IsQ0FBa0QsbUJBQW1CLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsMEJBQTBCLENBQUMsbUNBQW1DLENBQUMsc0JBQXNCLFlBQVksQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLGdCQUFnQixpQkFBaUIsQ0FBeUMsWUFBWSxDQUFzQyxhQUFhLENBQW9CLGNBQWMsQ0FBbUYsa0JBQWtCLENBQUMscUJBQXFCLENBQWdELGtCQUFrQixDQUE4QyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLHlDQUF5QyxDQUFDLHdHQUF3RyxDQUFDLGdHQUFnRyxDQUFDLHdGQUF3RixDQUFDLG9IQUFvSCxDQUFDLHNCQUFzQixZQUFZLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLCtCQUErQixDQUFDLHdCQUF3QixDQUFDLHdHQUF3RyxDQUFDLGdHQUFnRyxDQUFDLHdGQUF3RixDQUFDLG9IQUFvSCxDQUFDLGlFQUFpRSxDQUFDLHlEQUF5RCxDQUFDLDRCQUE0QixnQkFBZ0IsQ0FBQywyQ0FBMkMsQ0FBQywyQkFBMkIsMkNBQTJDLENBQUMsMkJBQTJCLGlCQUFpQixDQUFDLGNBQWMsQ0FBQywyQkFBMkIsMEJBQTBCLENBQUMsdUJBQXVCLDREQUE0RCxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLDZCQUE2QixlQUFlLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsNkJBQTZCLFVBQVUsQ0FBQyxvQ0FBb0MsZ0JBQWdCLENBQUMsc0JBQXNCLGFBQWEsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMscURBQXFELGFBQWEsQ0FBc0MsYUFBYSxDQUE0QixpQkFBaUIsQ0FBQywrQkFBb0Ysa0JBQWtCLENBQUMscUNBQXFDLFVBQVUsQ0FBQyxzQ0FBc0MsY0FBYyxDQUFDLGtCQUFrQixxQkFBcUIsQ0FBQywrQkFBK0IsYUFBYSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIsQ0FBNEIsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQywwQkFBMEIsYUFBYSxDQUE0QixpQkFBaUIsQ0FBQyxtQkFBeUUsbUJBQW1CLENBQW9GLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLHlCQUFvRSwwQkFBMEIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsaUJBQWlCLENBQUMsMENBQTBDLENBQUMscUNBQXFDLHdCQUF3QixDQUFDLDJDQUEyQyxDQUFDLG9DQUFvQyxrQkFBa0IsQ0FBQywyQ0FBMkMsQ0FBQyxvQ0FBb0MsMEJBQTBCLENBQUMsK0JBQStCLFlBQVksQ0FBQywrQkFBK0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsWUFBWSxDQUFDLHNDQUFzQyxhQUFhLENBQUMsMENBQTBDLFlBQVksQ0FBQyxpREFBaUQsYUFBYSxDQUFDLHlDQUF5Qyw0QkFBa0YsbUJBQW1CLENBQUMsZ0JBQWdCLENBQW9GLHFCQUFxQixDQUFDLGtDQUFrQyxvQkFBb0IsQ0FBb0YscUJBQXFCLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLDhDQUE4Qyx3QkFBd0IsQ0FBQywyQ0FBMkMsQ0FBQyw2Q0FBNkMsMkNBQTJDLENBQUMsd0NBQXdDLHNCQUFzQixDQUFDLDJDQUEyQyxpQkFBaUIsQ0FBQyx5RkFBeUYsaUJBQWlCLENBQUMsQ0FBQyxrSEFBa0gsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsc0hBQXNILGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLHVCQUF1QixXQUFXLENBQUMsa0JBQWtCLENBQUMsNkJBQTZCLGtCQUFrQixDQUFDLDhCQUE4QixhQUFhLENBQUMsbUVBQW1FLHFCQUFxQixDQUFDLHNCQUFzQixhQUFhLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxpQ0FBaUMsWUFBWSxDQUFDLHdDQUF3QyxZQUFZLENBQUMsOElBQThJLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxnRkFBZ0YsYUFBYSxDQUFDLHlCQUF5QixXQUFXLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLCtGQUErRix1QkFBdUIsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLHlDQUF5QyxxQ0FBMkYsbUJBQW1CLENBQUMsZ0JBQWdCLENBQW9GLHFCQUFxQixDQUFDLDJDQUE4SCxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsdURBQXVELHdCQUF3QixDQUFDLDJDQUEyQyxDQUFDLHNEQUFzRCwyQ0FBMkMsQ0FBQyxpREFBaUQsc0JBQXNCLENBQUMsb0RBQW9ELGlCQUFpQixDQUFDLDJHQUEyRyxpQkFBaUIsQ0FBQyxDQUFDLGdCQUF3RCxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixnQ0FBZ0MsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsMkNBQTJDLENBQUMscUNBQXFDLGdDQUFnQyxDQUFDLG9DQUFvQyxnQ0FBZ0MsQ0FBQywwQkFBMEIsZUFBZSxDQUFDLDJDQUEyQyxDQUFDLDRDQUE0QyxnQ0FBZ0MsQ0FBQywyQ0FBMkMsZ0NBQWdDLENBQUMsd0hBQXdILFVBQVUsQ0FBQyx3S0FBNkwsZ0JBQWdCLENBQUMsb0JBQW9CLFVBQVUsQ0FBQyxvQkFBb0IsU0FBUyxDQUFDLHNCQUFzQixhQUFhLENBQUMscUJBQXFCLFNBQVMsQ0FBQyxxQkFBcUIsU0FBUyxDQUFDLG9CQUFvQixhQUFhLENBQUMsc0JBQXNCLGFBQWEsQ0FBQyxzQkFBc0IsV0FBVyxDQUFDLG1DQUFtQyxzQkFBc0IsQ0FBQyxtQ0FBbUMsc0JBQXNCLENBQUMscUNBQXFDLHNCQUFzQixDQUFDLHlCQUF5QixjQUFjLENBQUMscUNBQXFDLHVCQUF1QixDQUFDLGlDQUFpQyx1QkFBdUIsQ0FBQyxtQ0FBbUMsdUJBQXVCLENBQUMseUNBQXlDLHVCQUF1QixDQUFDLFdBQVcsZ0JBQWdCLENBQUMsK3BTQUErcFMsQ0FBQyxnRkFBZ0YsZ0JBQWdCLENBQUMsZUFBZSxDQUFDOzs7Ozs7OztFQVF4amxCLENBQUMsZUFBZSxhQUFhLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLDJCQUEyQixZQUFZLENBQUMsMEJBQTBCLGVBQWUsQ0FBQyx3QkFBd0Isb0JBQW9CLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLGlCQUFpQixhQUFhLENBQUMsdUJBQXVCLGFBQWEsQ0FBQyw2QkFBNkIscUJBQXFCLENBQUMsdUJBQXVCLENBQUMseUJBQXlCLGNBQWMsQ0FBQyx3QkFBd0Isb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxvQkFBb0Isc0JBQXNCLENBQUMsb0JBQW9CLHNCQUFzQixDQUFDLHFCQUFxQixzQkFBc0IsQ0FBQyxlQUFlLGNBQWMsQ0FBQyxxQkFBcUIsdUJBQXVCLENBQUMsbUJBQW1CLHVCQUF1QixDQUFDLG9CQUFvQix1QkFBdUIsQ0FBQyx1QkFBdUIsdUJBQXVCLENBQUM7Ozs7Ozs7O0VBUXQvQixDQUFDLFNBQVMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFdBQVcsWUFBWSxDQUFDLGdCQUFnQixVQUFVLENBQUMsY0FBYyxDQUFDLDhEQUE4RCxlQUFlLENBQUMsd0JBQXdCLFVBQVUsQ0FBQyxRQUFRLENBQUMsc0JBQXNCLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLENBQUMsNFZBQTRWLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxzRUFBc0UsbUJBQW1CLENBQUMsMFVBQTBVLDREQUE0RCxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsdUNBQXVDLENBQUMsd0JBQXdCLENBQUMsdUJBQXVCLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsQ0FBQyw0Q0FBNEMsQ0FBQyxvQ0FBb0MsQ0FBQyx1REFBdUQsQ0FBQywrQ0FBK0MsQ0FBQyxrQkFBa0IsUUFBUSxDQUFDLHVCQUF1QixDQUFDLHVDQUF1QyxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsMEJBQTBCLENBQUMsNENBQTRDLENBQUMsb0NBQW9DLENBQUMsdURBQXVELENBQUMsK0NBQStDLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyw4QkFBOEIsV0FBVyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZ0RBQWdELGtCQUFrQixDQUFDLHdCQUF3QixVQUFVLENBQUMsZ0JBQWdCLGFBQWEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxtQ0FBbUMsQ0FBQywwQkFBMEIsQ0FBQyw0Q0FBNEMsQ0FBQyxvQ0FBb0MsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyx1REFBdUQsQ0FBQywrQ0FBK0MsQ0FBQyxvQ0FBb0MsVUFBVSxDQUFDLG1EQUFtRCxXQUFXLENBQUMsOEZBQThGLFVBQVUsQ0FBQyw0SEFBNEgsVUFBVSxDQUFDLDJGQUEyRixVQUFVLENBQUMsZ0dBQWdHLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyx3RUFBd0UsVUFBVSxDQUFDLDJYQUFnYSxhQUFhLENBQUMsT0FBTyxDQUFDLDRFQUE0RSxZQUFZLENBQUMsOEJBQThCLFlBQVksQ0FBQyw4QkFBOEIsa0JBQWtCLENBQUMseUJBQXlCLENBQUMsa0NBQWtDLENBQUMsdUJBQXVCLENBQUMsc0VBQXNFLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLG9GQUFvRix3QkFBd0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsNkNBQTZDLG9EQUFvRCxDQUFDLDRDQUE0QyxDQUFDLDhCQUE4QixDQUFDLG1EQUFtRCxvREFBb0QsQ0FBQyw0Q0FBNEMsQ0FBQyw4QkFBOEIsQ0FBQyw2Q0FBNkMsc0RBQXNELENBQUMsOENBQThDLENBQUMsOEJBQThCLENBQUMscUNBQXFDLDJCQUEyQixDQUFDLGdDQUFnQyxxQ0FBcUMsQ0FBQyw0QkFBNEIsMkJBQTJCLENBQUMsMkNBQTJDLDJCQUEyQixDQUFDLHNDQUFzQyxxQ0FBcUMsQ0FBQyxrQ0FBa0MsMkJBQTJCLENBQUMsNENBQTRDLGFBQWEsQ0FBQyx1Q0FBdUMsdUJBQXVCLENBQUMsbUNBQW1DLGFBQWEsQ0FBQyxrREFBa0QsYUFBYSxDQUFDLDZDQUE2Qyx1QkFBdUIsQ0FBQyx5Q0FBeUMsYUFBYSxDQUFDLGtaQUFrWixxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsd0JBQXdCLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyx1QkFBdUIsQ0FBQyw4Q0FBOEMsYUFBYSxDQUFDLHNEQUFzRCxvQkFBb0IsQ0FBQyxtREFBMkYsWUFBWSxDQUFDLDhDQUE4QyxhQUFhLENBQUMsc0RBQXNELG9CQUFvQixDQUFDLG1EQUEyRixZQUFZLENBQUMsMENBQTBDLGFBQWEsQ0FBQyxrREFBa0Qsb0JBQW9CLENBQUMsK0NBQXVGLFlBQVksQ0FBQyxrSUFBa0ksYUFBYSxDQUFDLGdGQUFnRixvQkFBb0IsQ0FBQyxVQUFVLENBQUMsb3JDQUFvckMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxzbkJBQXNuQixrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLDZCQUE2QixrQ0FBa0MsQ0FBQyxpTkFBaU4sa0JBQWtCLENBQUMsYUFBYSxDQUFDLDhFQUE4RSw4QkFBOEIsQ0FBQywwRkFBMEYsOEJBQThCLENBQUMsc0dBQXNHLG9CQUFvQixDQUFDLGtJQUFrSSx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsa0hBQWtILHdCQUF3QixDQUFDLHdIQUF3SCx3QkFBd0IsQ0FBQyxvSEFBb0gsa0NBQWtDLENBQUMsOFFBQThRLGFBQWEsQ0FBQywwU0FBMFMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsOExBQThMLGFBQWEsQ0FBQyxvRkFBb0YsbUJBQW1CLENBQUMsV0FBVyxDQUFDLCtEQUErRCxXQUFXLENBQUMsbUNBQW1DLFNBQVMsQ0FBQyxpQkFBaUIsaUJBQWlCLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQywwQ0FBMEMsQ0FBQyxrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxpRUFBaUUsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsNkJBQTZCLEtBQUssMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLHFCQUFxQixLQUFLLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxzUEFBc1AscUJBQXFCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyw4SUFBOEksb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsd0dBQXdHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsb2FBQW9hLDBCQUEwQixDQUFDLHNiQUFzYixlQUFlLENBQUMsaUNBQWlDLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHlCQUF5QixhQUFhLENBQUMsY0FBYyxDQUFDLG9DQUFvQyxlQUFlLENBQUMsK0JBQStCLHlCQUF5QixDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyx1RUFBdUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsaUJBQXlELFlBQVksQ0FBbUYsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsd0JBQTZELGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxvQ0FBb0MsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHlEQUF5RCxTQUFTLENBQUMsNkRBQTZELGtCQUFrQixDQUFDLDJEQUEyRCxTQUFTLENBQUMsMkRBQTJELFNBQVMsQ0FBQyx5REFBeUQsa0JBQWtCLENBQUMsNkRBQTZELGtCQUFrQixDQUFDLDZEQUE2RCxXQUFXLENBQUMsMkRBQTJELGtCQUFrQixDQUFDLHlEQUF5RCxTQUFTLENBQUMseUNBQXlDLGlCQUFvQyxjQUFjLENBQUMsNnlDQUE2eUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLENBQUMsNkJBQTZCLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyx5QkFBeUIscUJBQXFCLENBQUMseUJBQXlCLHFCQUFxQixDQUFDLDJCQUEyQixzQkFBc0IsQ0FBQywwQkFBMEIsbUJBQW1CLENBQUMsMEJBQTBCLHNCQUFzQixDQUFDLHlCQUF5QixxQkFBcUIsQ0FBQywyQkFBMkIsc0JBQXNCLENBQUMsMkJBQTJCLG1CQUFtQixDQUFDLDBCQUEwQixzQkFBc0IsQ0FBQyx5QkFBeUIscUJBQXFCLENBQUMsNEJBQTRCLHNCQUFzQixDQUFDLDRCQUE0QixtQkFBbUIsQ0FBQyw4QkFBOEIsc0JBQXNCLENBQUMsOEJBQThCLHFCQUFxQixDQUFDLDZCQUE2QixzQkFBc0IsQ0FBQyw2QkFBNkIsb0JBQW9CLENBQUMseUNBQXlDLHdqREFBd2pELG9CQUFvQixDQUFDLGlCQUFpQixlQUFlLENBQUMsQ0FBQyw0RkFBNEYsVUFBVSxDQUFzQyxhQUFhLENBQUMsd0JBQXdCLGNBQWMsQ0FBZ0Qsa0JBQWtCLENBQUMsK0JBQStCLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQywwSkFBMEosb0JBQW9CLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLG1CQUFtQixDQUFDLDhCQUE4Qix3QkFBd0IsQ0FBQyxzSUFBc0ksb0JBQW9CLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGdGQUFnRix3QkFBd0IsQ0FBQyw4RUFBOEUsUUFBUSxDQUFDLG9DQUE0RSxZQUFZLENBQWdELGtCQUFrQixDQUFDLHFGQUFxRixVQUFVLENBQUMsY0FBYyxzQkFBc0IsQ0FBQyxjQUFjLHNCQUFzQixDQUFDLGVBQWUsc0JBQXNCLENBQUMsU0FBUyxjQUFjLENBQUMsZUFBZSx1QkFBdUIsQ0FBQyxhQUFhLHVCQUF1QixDQUFDLGNBQWMsdUJBQXVCLENBQUMsaUJBQWlCLHVCQUF1QixDQUFDOzs7Ozs7OztFQVFwNXBCLENBQUMsU0FBaUQsWUFBWSxDQUFtRixrQkFBa0IsQ0FBb0IsY0FBYyxDQUFrRCxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsZ0NBQWdDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLGVBQWUsZUFBZSxDQUFDLGlEQUFpRCxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsV0FBVyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLGlCQUFpQixDQUF5QyxZQUFZLENBQW1GLGtCQUFrQixDQUFvQixjQUFjLENBQWdELHVCQUF1QixDQUFrRCxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsMkJBQTJCLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixZQUFZLENBQUMsZUFBZSxDQUFDLDRDQUE0QyxjQUFjLENBQUMsOEJBQThCLFlBQVksQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG1JQUFtSSxVQUFVLENBQUMsMEJBQWlFLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxzQ0FBc0MsdUJBQXVCLENBQUMscUdBQXFHLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyx5Q0FBeUMsY0FBYyxVQUFVLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsK0RBQStELGNBQWMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxnRUFBZ0UsY0FBYyxVQUFVLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxpRUFBaUUsY0FBYyxVQUFVLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLDBDQUEwQyxjQUFjLFVBQVUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsNkRBQTZELFVBQVUsQ0FBQywyRkFBMkYsVUFBVSxDQUFDLDJGQUEyRixTQUFTLENBQUMsK0ZBQStGLGtCQUFrQixDQUFDLDZGQUE2RixTQUFTLENBQUMsNkZBQTZGLFNBQVMsQ0FBQywyRkFBMkYsa0JBQWtCLENBQUMsK0ZBQStGLGtCQUFrQixDQUFDLCtGQUErRixXQUFXLENBQUMsNkZBQTZGLGtCQUFrQixDQUFDLDJGQUEyRixTQUFTLENBQUMsaUdBQWlHLGlCQUFpQixDQUFDLGlHQUFpRyxpQkFBaUIsQ0FBQyxxR0FBcUcsaUJBQWlCLENBQUMscUdBQXFHLGlCQUFpQixDQUFDLG1HQUFtRyxpQkFBaUIsQ0FBQyxtR0FBbUcsV0FBVyxDQUFDLDJDQUEyQyxvQkFBb0IsQ0FBQywyQ0FBMkMsbUJBQW1CLENBQUMsNkNBQTZDLDRCQUE0QixDQUFDLDRDQUE0QyxtQkFBbUIsQ0FBQyw0Q0FBNEMsbUJBQW1CLENBQUMsMkNBQTJDLDRCQUE0QixDQUFDLDZDQUE2Qyw0QkFBNEIsQ0FBQyw2Q0FBNkMscUJBQXFCLENBQUMsNENBQTRDLDRCQUE0QixDQUFDLDJDQUEyQyxtQkFBbUIsQ0FBQyw4Q0FBOEMsMkJBQTJCLENBQUMsOENBQThDLDJCQUEyQixDQUFDLGdEQUFnRCwyQkFBMkIsQ0FBQyxnREFBZ0QsMkJBQTJCLENBQUMsK0NBQStDLDJCQUEyQixDQUFDLCtDQUErQyxxQkFBcUIsQ0FBQyxxQkFBcUIsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHdLQUF3SyxxQkFBcUIsQ0FBQyx3S0FBd0sscUJBQXFCLENBQUMsZ0xBQWdMLHNCQUFzQixDQUFDLDRLQUE0SyxtQkFBbUIsQ0FBQyw0S0FBNEssc0JBQXNCLENBQUMsd0tBQXdLLHFCQUFxQixDQUFDLGdMQUFnTCxzQkFBc0IsQ0FBQyxnTEFBZ0wsbUJBQW1CLENBQUMsNEtBQTRLLHNCQUFzQixDQUFDLHdLQUF3SyxxQkFBcUIsQ0FBQyxvTEFBb0wsc0JBQXNCLENBQUMsb0xBQW9MLG1CQUFtQixDQUFDLDRMQUE0TCxzQkFBc0IsQ0FBQyw0TEFBNEwscUJBQXFCLENBQUMsd0xBQXdMLHNCQUFzQixDQUFDLHdMQUF3TCxvQkFBb0IsQ0FBQywrREFBK0Qsb01BQW9NLHFCQUFxQixDQUFDLG9NQUFvTSxxQkFBcUIsQ0FBQyw0TUFBNE0sc0JBQXNCLENBQUMsd01BQXdNLG1CQUFtQixDQUFDLHdNQUF3TSxzQkFBc0IsQ0FBQyxvTUFBb00scUJBQXFCLENBQUMsNE1BQTRNLHNCQUFzQixDQUFDLDRNQUE0TSxtQkFBbUIsQ0FBQyx3TUFBd00sc0JBQXNCLENBQUMsb01BQW9NLHFCQUFxQixDQUFDLGdOQUFnTixzQkFBc0IsQ0FBQyxnTkFBZ04sbUJBQW1CLENBQUMsd05BQXdOLHNCQUFzQixDQUFDLHdOQUF3TixxQkFBcUIsQ0FBQyxvTkFBb04sc0JBQXNCLENBQUMsb05BQW9OLG9CQUFvQixDQUFDLENBQUMsK0RBQStELG9NQUFvTSxxQkFBcUIsQ0FBQyxvTUFBb00scUJBQXFCLENBQUMsNE1BQTRNLHNCQUFzQixDQUFDLHdNQUF3TSxtQkFBbUIsQ0FBQyx3TUFBd00sc0JBQXNCLENBQUMsb01BQW9NLHFCQUFxQixDQUFDLDRNQUE0TSxzQkFBc0IsQ0FBQyw0TUFBNE0sbUJBQW1CLENBQUMsd01BQXdNLHNCQUFzQixDQUFDLG9NQUFvTSxxQkFBcUIsQ0FBQyxnTkFBZ04sc0JBQXNCLENBQUMsZ05BQWdOLG1CQUFtQixDQUFDLHdOQUF3TixzQkFBc0IsQ0FBQyx3TkFBd04scUJBQXFCLENBQUMsb05BQW9OLHNCQUFzQixDQUFDLG9OQUFvTixvQkFBb0IsQ0FBQyxDQUFDLHlDQUF5Qyw0TUFBNE0scUJBQXFCLENBQUMsNE1BQTRNLHFCQUFxQixDQUFDLG9OQUFvTixzQkFBc0IsQ0FBQyxnTkFBZ04sbUJBQW1CLENBQUMsZ05BQWdOLHNCQUFzQixDQUFDLDRNQUE0TSxxQkFBcUIsQ0FBQyxvTkFBb04sc0JBQXNCLENBQUMsb05BQW9OLG1CQUFtQixDQUFDLGdOQUFnTixzQkFBc0IsQ0FBQyw0TUFBNE0scUJBQXFCLENBQUMsd05BQXdOLHNCQUFzQixDQUFDLHdOQUF3TixtQkFBbUIsQ0FBQyxnT0FBZ08sc0JBQXNCLENBQUMsZ09BQWdPLHFCQUFxQixDQUFDLDROQUE0TixzQkFBc0IsQ0FBQyw0TkFBNE4sb0JBQW9CLENBQUMsQ0FBQyxpRUFBaUUsNE5BQTROLHFCQUFxQixDQUFDLDROQUE0TixxQkFBcUIsQ0FBQyxvT0FBb08sc0JBQXNCLENBQUMsZ09BQWdPLG1CQUFtQixDQUFDLGdPQUFnTyxzQkFBc0IsQ0FBQyw0TkFBNE4scUJBQXFCLENBQUMsb09BQW9PLHNCQUFzQixDQUFDLG9PQUFvTyxtQkFBbUIsQ0FBQyxnT0FBZ08sc0JBQXNCLENBQUMsNE5BQTROLHFCQUFxQixDQUFDLHdPQUF3TyxzQkFBc0IsQ0FBQyx3T0FBd08sbUJBQW1CLENBQUMsZ1BBQWdQLHNCQUFzQixDQUFDLGdQQUFnUCxxQkFBcUIsQ0FBQyw0T0FBNE8sc0JBQXNCLENBQUMsNE9BQTRPLG9CQUFvQixDQUFDLENBQUMsMENBQTBDLG9OQUFvTixxQkFBcUIsQ0FBQyxvTkFBb04scUJBQXFCLENBQUMsNE5BQTROLHNCQUFzQixDQUFDLHdOQUF3TixtQkFBbUIsQ0FBQyx3TkFBd04sc0JBQXNCLENBQUMsb05BQW9OLHFCQUFxQixDQUFDLDROQUE0TixzQkFBc0IsQ0FBQyw0TkFBNE4sbUJBQW1CLENBQUMsd05BQXdOLHNCQUFzQixDQUFDLG9OQUFvTixxQkFBcUIsQ0FBQyxnT0FBZ08sc0JBQXNCLENBQUMsZ09BQWdPLG1CQUFtQixDQUFDLHdPQUF3TyxzQkFBc0IsQ0FBQyx3T0FBd08scUJBQXFCLENBQUMsb09BQW9PLHNCQUFzQixDQUFDLG9PQUFvTyxvQkFBb0IsQ0FBQyxDQUFDLGdFQUFnRSxpQkFBaUIsQ0FBOEMsc0JBQXNCLENBQUMsNExBQTRMLGVBQWUsQ0FBQyx5REFBeUQsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLCtGQUErRixtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyw0SUFBNEksbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsb0VBQW9FLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLGtHQUFrRyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxvREFBb0Qsa0JBQWtCLENBQUMsdUNBQXVDLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLHFDQUFxQyxzQkFBc0IsQ0FBQyx5QkFBeUIsQ0FBQyx3Q0FBd0MsaUJBQWlCLENBQUMseUNBQXlDLGdCQUFnQixDQUFDLHVJQUF1SSxnREFBZ0QsQ0FBQyx3Q0FBd0MsQ0FBQywyR0FBMkcsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQywyQ0FBMkMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxxSkFBcUosdUJBQXVCLENBQUMsZUFBZSxDQUFDLCtEQUErRCxZQUFZLENBQUMsOEJBQThCLGdEQUFnRCxDQUFDLHdDQUF3QyxDQUFDLDBDQUEwQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsMkNBQTJDLGlCQUFpQixDQUFDLGtEQUFrRCxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdEQUFnRCxDQUFDLHdDQUF3QyxDQUFDLDJHQUEyRyxVQUFVLENBQUMsOERBQThELHVCQUF1QixDQUFDLGVBQWUsQ0FBQyx5SkFBeUosa0RBQWtELENBQUMsMENBQTBDLENBQUMsaUxBQWlMLHVCQUF1QixDQUFDLGVBQWUsQ0FBQywyREFBMkQsa0RBQWtELENBQUMsMENBQTBDLENBQUMsMERBQTBELGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLHVCQUF1QixDQUFDLHlFQUF5RSxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxnQkFBZ0IsVUFBVSxDQUFDLFlBQVksQ0FBQyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxxQkFBcUIsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQywrREFBK0QscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsNkVBQTZFLHVCQUF1QixDQUFDLGVBQWUsQ0FBQywrREFBK0QsV0FBVyxDQUFDLCtFQUErRSxhQUFhLENBQUMsNkdBQTZHLFdBQVcsQ0FBQyxxQ0FBcUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxzREFBc0QsdUJBQXVCLENBQUMsZUFBZSxDQUFDLDhEQUE4RCx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsc09BQXlULHFCQUFxQixDQUFDLGtCQUFrQixDQUFxQywrQkFBK0IsQ0FBQyxxUEFBd1UscUJBQXFCLENBQUMscUJBQXFCLENBQXNDLDJCQUEyQixDQUFDLHFQQUF3VSxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBbUMsNkJBQTZCLENBQUMsZ0tBQTBPLDZCQUE2QixDQUE2QixrQkFBa0IsQ0FBb0YscUJBQXFCLENBQUMsMEtBQWlOLFdBQVcsQ0FBQyxxT0FBcU8sZUFBZSxDQUE2QixrQkFBa0IsQ0FBQywrT0FBK08saUJBQWlCLENBQTZCLGtCQUFrQixDQUFDLGtDQUErRSxzQkFBc0IsQ0FBQywwT0FBME8sZ0JBQWdCLENBQTZCLGtCQUFrQixDQUFDLG9LQUFvSyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsMFdBQTBXLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLGlFQUFpRSxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsMEVBQTBFLGtDQUFrQyxDQUFDLFVBQVUsQ0FBQywwRUFBMEUsa0NBQWtDLENBQUMsVUFBVSxDQUFDLHVFQUF1RSxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsdUVBQXVFLGtDQUFrQyxDQUFDLFVBQVUsQ0FBQyxvRUFBb0Usa0NBQWtDLENBQUMsVUFBVSxDQUFDLG9FQUFvRSxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsMEVBQTBFLGtDQUFrQyxDQUFDLFVBQVUsQ0FBQywwRUFBMEUsa0NBQWtDLENBQUMsVUFBVSxDQUFDLG9FQUFvRSxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsdUVBQXVFLGtDQUFrQyxDQUFDLFVBQVUsQ0FBQyxvRUFBb0Usa0NBQWtDLENBQUMsVUFBVSxDQUFDLHVFQUF1RSxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMseUlBQXlJLG9CQUFvQixDQUF3QyxXQUFXLENBQUMsOElBQXFMLFdBQVcsQ0FBQyx5Q0FBeUMsbUhBQThNLDBCQUEwQixDQUFDLHNGQUFrTCw2QkFBNkIsQ0FBQyx5TUFBeU0sZ0RBQWdELENBQUMsd0NBQXdDLENBQUMsdU1BQXVNLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtR0FBbUcsZ0RBQWdELENBQUMsd0NBQXdDLENBQUMsa0dBQWtHLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtRUFBbUUscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsa0VBQWtFLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDLCtEQUErRCxtSEFBOE0sMEJBQTBCLENBQUMsOENBQTBJLDZCQUE2QixDQUFDLHlNQUF5TSxnREFBZ0QsQ0FBQyx3Q0FBd0MsQ0FBQyx1TUFBdU0sdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1HQUFtRyxnREFBZ0QsQ0FBQyx3Q0FBd0MsQ0FBQyxrR0FBa0csdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1FQUFtRSxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyxrRUFBa0UsdUJBQXVCLENBQUMsZUFBZSxDQUFDLENBQUMseUNBQXlDLHlIQUFvTiwwQkFBMEIsQ0FBQyxnREFBNEksNkJBQTZCLENBQUMsNk1BQTZNLGdEQUFnRCxDQUFDLHdDQUF3QyxDQUFDLDJNQUEyTSx1QkFBdUIsQ0FBQyxlQUFlLENBQUMscUdBQXFHLGdEQUFnRCxDQUFDLHdDQUF3QyxDQUFDLG9HQUFvRyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMscUVBQXFFLHFDQUFxQyxDQUFDLDZCQUE2QixDQUFDLG9FQUFvRSx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQywrREFBK0Qsa0JBQWtCLFVBQVUsQ0FBQyw4Q0FBOEMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsOERBQThELDhCQUE4QixDQUFDLDBCQUEwQixDQUFDLDZCQUE2QixDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxxS0FBcUssb0JBQW9CLENBQUMsMktBQTJLLG1CQUFtQixDQUFDLHdLQUF3SyxtQkFBbUIsQ0FBQyx3S0FBd0ssNEJBQTRCLENBQUMscUtBQXFLLDRCQUE0QixDQUFDLDJLQUEySyw0QkFBNEIsQ0FBQywyS0FBMkssbUJBQW1CLENBQUMsd0tBQXdLLG1CQUFtQixDQUFDLHFLQUFxSyxtQkFBbUIsQ0FBQyw4S0FBOEssbUJBQW1CLENBQUMsOEtBQThLLDRCQUE0QixDQUFDLG9MQUFvTCw0QkFBNEIsQ0FBQyxvTEFBb0wsNEJBQTRCLENBQUMsaUxBQWlMLDRCQUE0QixDQUFDLGlMQUFpTCxxQkFBcUIsQ0FBQyxDQUFDLHlDQUF5Qyw4Q0FBOEMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsOERBQThELDBCQUEwQixDQUFDLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLHFOQUFxTixvQkFBb0IsQ0FBQywyTkFBMk4sbUJBQW1CLENBQUMsd05BQXdOLG1CQUFtQixDQUFDLHdOQUF3TixtQkFBbUIsQ0FBQyxxTkFBcU4sbUJBQW1CLENBQUMsMk5BQTJOLG1CQUFtQixDQUFDLDJOQUEyTixtQkFBbUIsQ0FBQyx3TkFBd04sNEJBQTRCLENBQUMscU5BQXFOLDRCQUE0QixDQUFDLDhOQUE4Tiw0QkFBNEIsQ0FBQyw4TkFBOE4sNEJBQTRCLENBQUMsb09BQW9PLDRCQUE0QixDQUFDLG9PQUFvTyxtQkFBbUIsQ0FBQyxpT0FBaU8sbUJBQW1CLENBQUMsaU9BQWlPLG1CQUFtQixDQUFDLENBQUMseUNBQXlDLG1CQUFtQixVQUFVLENBQUMsdUJBQXVCLENBQUMsd0JBQXdCLENBQUMsbVFBQW1RLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixDQUFDLHlDQUF5QyxRQUFRLENBQUMsU0FBUyxDQUFDLHVGQUF1Rix3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQywrRUFBK0UsMkJBQTJCLENBQUMsNEJBQTRCLENBQUMsZ1BBQWdQLHlCQUF5QixDQUFDLDRNQUE0TSx5Q0FBeUMsQ0FBQywwTUFBME0sdUNBQXVDLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsMEJBQTBCLENBQUMsNkJBQTZCLENBQUMsK0JBQStCLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLHVIQUF1SCx3QkFBd0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLHlDQUF5QyxrUEFBa1Asc0JBQXNCLENBQUMsMFBBQTBQLHNCQUFzQixDQUFDLDBRQUEwUSxzQkFBc0IsQ0FBQyxrUUFBa1Esc0JBQXNCLENBQUMsQ0FBQywrREFBK0Qsa1BBQWtQLHNCQUFzQixDQUFDLDBQQUEwUCxzQkFBc0IsQ0FBQywwUUFBMFEsc0JBQXNCLENBQUMsa1FBQWtRLHNCQUFzQixDQUFDLENBQUMsZ0VBQWdFLDBQQUEwUCxzQkFBc0IsQ0FBQywwUEFBMFAsc0JBQXNCLENBQUMsMFFBQTBRLHNCQUFzQixDQUFDLGtRQUFrUSxzQkFBc0IsQ0FBQyxDQUFDLGlFQUFpRSwwUEFBMFAsc0JBQXNCLENBQUMsMFBBQTBQLHNCQUFzQixDQUFDLGtRQUFrUSxzQkFBc0IsQ0FBQyxDQUFDLDBDQUEwQywwUEFBMFAsc0JBQXNCLENBQUMsMFBBQTBQLHNCQUFzQixDQUFDLENBQUMsU0FBaUQsWUFBWSxDQUFDLGFBQWEsQ0FBQyw0REFBNEQsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLG1DQUFtQyxDQUFDLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLDBCQUEwQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixZQUFZLENBQUMsb0JBQW9CLGVBQWUsQ0FBQyxlQUFlLFFBQVEsQ0FBQyw4QkFBc0UsWUFBWSxDQUFDLDhCQUFzRSxZQUFZLENBQWdELGtCQUFrQixDQUFDLGVBQWUsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLHVDQUF1QyxDQUFzQyxhQUFhLENBQUMsd0JBQXdCLENBQXVCLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxnQ0FBZ0MsQ0FBQyxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsaUZBQWlGLENBQUMseUVBQXlFLENBQUMsaUVBQWlFLENBQUMsNkZBQTZGLENBQUMsMkJBQTJCLDJDQUEyQyxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLDRFQUE0RSx3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLDZCQUE2QixZQUFZLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxzQ0FBc0MsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxhQUFhLENBQUMsbUNBQTJFLFlBQVksQ0FBa0QsbUJBQW1CLENBQXFGLHNCQUFzQixDQUFDLHNCQUFzQixVQUFVLENBQUMscUNBQXFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsNEJBQTRCLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQyxxREFBcUQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMseUNBQXlDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLCtCQUErQixTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLDhCQUE4QiwwQkFBMEIsQ0FBQywyQ0FBMkMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLDhDQUE4QyxDQUFDLHNDQUFzQyxDQUFrSCwrQkFBK0IsQ0FBQyxrQ0FBa0MsUUFBUSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQywwQ0FBMEMsQ0FBQyx3QkFBd0IsQ0FBQywrQkFBK0IsQ0FBQyw2QkFBNkIsQ0FBQyx5QkFBeUIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyx3Q0FBd0Msb0NBQW9DLENBQUMsK0JBQStCLENBQUMsMkNBQTJDLG9DQUFvQyxDQUFDLCtCQUErQixDQUFDLHlDQUF5QyxvQ0FBb0MsQ0FBQyx5QkFBeUIsQ0FBQywrQkFBK0IsQ0FBQyxzREFBc0QsYUFBYSxDQUFDLHVEQUF1RCxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsMkVBQTJFLDBCQUEwQixDQUFDLHNCQUFzQixDQUFDLHVDQUF1QyxnQkFBZ0IsQ0FBQyw4RkFBOEYsMEJBQTBCLENBQUMsdUNBQXVDLFdBQVcsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLHVDQUF1QyxTQUFTLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxzQ0FBc0MsQ0FBQyxzREFBc0QsQ0FBQyw4Q0FBOEMsUUFBUSxDQUFDLG9EQUFvRCxLQUFLLENBQUMsd0NBQXdDLHlCQUF5QixDQUFDLDRCQUE0QixDQUFDLHdDQUF3Qyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsb0NBQW9DLFVBQVUsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsK0JBQStCLGVBQWUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLENBQUMsK0JBQStCLHdCQUF3QixDQUFDLDRCQUE0QixvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLGdEQUFnRCxhQUFhLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsd0JBQXdCLENBQUMsbURBQW1ELHVCQUF1QixDQUFDLHdDQUF3QyxRQUFRLENBQUMsUUFBUSxDQUFDLHlDQUF5Qyx1QkFBdUIsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsd0JBQXdCLENBQUMsQ0FBQyx5Q0FBeUMsNkhBQTZILHVDQUF1QyxDQUFDLENBQUMsd0dBQXdHLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQyw2RUFBNkUsMEJBQTBCLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLDBCQUEwQixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsNkJBQTZCLFNBQVMsQ0FBQyxpRUFBaUUsZ0NBQWdDLENBQUMscUJBQXFCLENBQUMsc0RBQXNELHdCQUF3QixDQUFDLHNDQUFzQyxDQUFDLGlDQUFpQyxDQUFDLHNGQUE4SCxZQUFZLENBQUMsMkJBQTJCLENBQUMsd0VBQWdILFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxnRUFBZ0UsVUFBVSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsYUFBYSxDQUFvRixxQkFBcUIsQ0FBQyxlQUFlLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsd0JBQXdCLGFBQWEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLG9DQUFvQywyQ0FBMkMsQ0FBQyxtQ0FBbUMsMkNBQTJDLENBQUMsK0JBQStCLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQywrQkFBK0IsWUFBWSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxzQ0FBc0MsVUFBVSxDQUFDLGlCQUFpQixDQUFDLCtCQUErQixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUFDLDJDQUEyQyxzQkFBc0IsQ0FBQyw4QkFBOEIsMkJBQTJCLENBQUMsOEJBQThCLGNBQWMsQ0FBQyx5QkFBeUIsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQywwRkFBMEYscUJBQXFCLENBQUMscUNBQXFDLFlBQVksQ0FBQywrQkFBK0IsMEJBQTBCLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQywyQ0FBMkMsMkNBQTJDLENBQUMsMENBQTBDLDJDQUEyQyxDQUFDLDBDQUEwQywwQkFBMEIsQ0FBQyxrREFBa0QsZ0JBQWdCLENBQUMsMkNBQTJDLDRCQUE0QixDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQywrQkFBK0IsQ0FBQyx1QkFBdUIsZ0NBQWdDLENBQUMsdUJBQXVCLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxpQ0FBaUMsQ0FBQyxrQ0FBa0MsQ0FBQyxnQ0FBZ0MsQ0FBQyxnQ0FBZ0MsQ0FBQyxxQkFBcUIsQ0FBQyw4QkFBOEIsWUFBWSxDQUFDLDZCQUE2Qiw0QkFBNEIsQ0FBQyxvQkFBb0IsQ0FBQyw4QkFBOEIsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxxREFBcUQsQ0FBQyxzSEFBc0gsZUFBZSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyw4Q0FBOEMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLHdCQUF3QiwyQkFBMkIsQ0FBQyxlQUFlLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsNEJBQTRCLENBQUMsOEJBQThCLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxrQ0FBa0MsQ0FBQyxtQ0FBbUMsQ0FBQyxlQUFlLENBQUMscUNBQXFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLHFEQUFxRCxDQUFDLDBCQUEwQiwyQkFBMkIsQ0FBQyxlQUFlLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsOEJBQThCLENBQUMsZ0NBQWdDLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxtQ0FBbUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxpQkFBaUIsQ0FBQyx1Q0FBdUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMscURBQXFELENBQUMsZ0NBQWdDLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsQ0FBQyxzQ0FBc0MsY0FBYyxDQUFDLGtDQUFrQyxDQUFDLG1DQUFtQyxDQUFDLGdDQUFnQyxDQUFDLGdCQUFnQixDQUFDLDZDQUE2QyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxxREFBcUQsQ0FBQyx1Q0FBdUMsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLGtDQUFrQyxDQUFDLGdDQUFnQyxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixRQUFRLENBQXVELG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLHFDQUFxQywyQ0FBMkMsQ0FBQyxrQ0FBa0MsMkNBQTJDLENBQUMsNENBQTRDLFlBQVksQ0FBQywwQkFBMEIsYUFBYSxDQUFDLGlCQUFpQixDQUFDLHNDQUFzQyxrQkFBa0IsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsY0FBYyxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHlCQUFvRCxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQywwQkFBMEIsQ0FBQyxnQ0FBZ0Msc0JBQXNCLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxzQ0FBc0MsUUFBUSxDQUFDLDRHQUE0RywwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQyxnQ0FBZ0MsdUJBQXVCLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixDQUFDLHNDQUFzQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLENBQUMsMEVBQTBFLG9DQUFvQyxDQUFDLHVJQUF1SSxnQ0FBZ0MsQ0FBQyxvQkFBb0IsQ0FBQyx5Q0FBeUMsZ0NBQWdDLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLGFBQWEsQ0FBQyxjQUFjLENBQUMseUNBQXlDLGNBQWMsQ0FBQyw0QkFBNEIsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHVEQUF1RCxxQkFBcUIsQ0FBQyw2REFBNkQsUUFBUSxDQUFDLHlCQUF5QixDQUFDLGtDQUFrQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsb0NBQW9DLENBQUMseUNBQXlDLGVBQWUsQ0FBQyw4Q0FBOEMsNEJBQTRCLENBQUMsNEJBQTRCLDRCQUE0QixDQUFDLDRCQUE0QixhQUFhLENBQUMsY0FBYyxDQUFDLDBDQUEwQyxDQUFDLGtDQUFrQywrQkFBK0IsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLENBQXlCLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxnQ0FBZ0MsQ0FBQyx1QkFBdUIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyx5Q0FBeUMsK0JBQStCLENBQUMsdUNBQXVDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLHdDQUF3QyxZQUFZLENBQUMsdUlBQXVJLDRCQUE0QixDQUFDLHFCQUFxQixDQUFDLDBJQUEwSSw0QkFBNEIsQ0FBQywrQkFBK0IsQ0FBQyx5Q0FBeUMsNEJBQTRCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQywrQ0FBK0Msb0JBQW9CLENBQUMscUJBQXFCLENBQUMsa0RBQWtELHdCQUF3QixDQUFDLHFDQUFxQyxxQkFBcUIsQ0FBQyxzQkFBc0IsQ0FBQyx3QkFBd0IsQ0FBQyxxQ0FBcUMsQ0FBQywyQ0FBMkMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsOEJBQThCLENBQUMseUJBQXlCLENBQUMsaUJBQWlCLENBQUMsc0JBQXNCLENBQUMsa0RBQWtELG9CQUFvQixDQUFDLHFDQUFxQyxpQ0FBaUMsQ0FBQyxxQ0FBcUMsZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsMkNBQTJDLDBCQUEwQixDQUFDLGtEQUFrRCxvQkFBb0IsQ0FBQyx3R0FBd0cscUJBQXFCLENBQUMsa0RBQWtELGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixlQUFlLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUE0QixpQkFBaUIsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDREQUE0RCxzQkFBc0IsQ0FBQywyQkFBMkIsNEJBQTRCLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLGVBQWUsQ0FBQyxpQ0FBaUMsUUFBUSxDQUFDLHlCQUF5QixRQUFRLENBQUMsdUJBQXVCLFlBQVksQ0FBQyxtQ0FBbUMsWUFBWSxDQUFDLGtDQUFrQyxlQUFlLENBQUMsNkJBQTZCLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsb0NBQW9DLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxvQ0FBb0MsZ0NBQWdDLENBQUMsa0RBQWtELFFBQVEsQ0FBQyx3REFBd0QsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsU0FBUyxDQUFDLDRCQUE0QixDQUFDLDJCQUEyQiw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQ0FBaUMsNEJBQTRCLENBQUMsMENBQTBDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsdUJBQXVCLENBQUMsZUFBZSxDQUFDLDJIQUEySCxzQ0FBc0MsQ0FBQyxvQkFBb0IsYUFBYSxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsb0JBQW9CLENBQUMsVUFBVSxDQUFDLG9CQUFvQixXQUFXLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHlDQUF5QyxRQUFRLENBQUMsU0FBUyxDQUFDLDJCQUEyQixTQUFTLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxhQUFhLENBQUMsa0RBQWtELGFBQWEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyw0QkFBNEIsYUFBYSxDQUFvRixxQkFBcUIsQ0FBQyxpREFBaUQsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyw2QkFBNkIsQ0FBQyxrQ0FBa0MsV0FBVyxDQUFDLHlDQUF5QyxtQkFBc0cscUJBQXFCLENBQUMseUJBQXlCLG9CQUFvQixDQUFDLGdDQUFnQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyw0REFBNEQsd0JBQXdCLENBQUMsOERBQThELHVCQUF1QixDQUFDLDZEQUFnSixxQkFBcUIsQ0FBQyxDQUFDLG9EQUFvRCw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQywwREFBMEQsOEJBQThCLENBQUMsdUJBQXVCLENBQUMsMERBQTBELDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLHdEQUF3RCw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyx3REFBd0QsOEJBQThCLENBQUMsdUJBQXVCLENBQUMsc0RBQXNELDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLHNEQUFzRCw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQywwREFBMEQsOEJBQThCLENBQUMsdUJBQXVCLENBQUMsMERBQTBELDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLHNEQUFzRCw4QkFBOEIsQ0FBQyx1QkFBdUIsQ0FBQyx3REFBd0QsOEJBQThCLENBQUMsdUJBQXVCLENBQUMsc0RBQXNELDhCQUE4QixDQUFDLHVCQUF1QixDQUFDLGtCQUFrQiwwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsMkRBQTJELGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyw2QkFBNkIsY0FBYyxDQUFDLCtCQUErQixnQ0FBZ0MsQ0FBQyx3Q0FBd0MsZ0NBQWdDLENBQUMseUZBQXlGLDBCQUEwQixDQUFDLCtCQUErQixRQUFRLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyx3RUFBd0UsMEJBQTBCLENBQUMsNElBQTRJLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyw0R0FBNEcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxvRUFBb0UsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLCtCQUErQixnQ0FBZ0MsQ0FBQyxvQkFBb0IsQ0FBQyxvREFBb0QsY0FBYyxDQUFDLFVBQVUsQ0FBQyw4Q0FBOEMsNEJBQTRCLENBQUMsa0JBQWtCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMscUJBQXFCLENBQUMscUNBQXFDLGdDQUFnQyxDQUFDLG9CQUFvQixDQUFDLG9EQUFvRCw0QkFBNEIsQ0FBQyxpQkFBaUIsVUFBVSxDQUFDLGtCQUFrQixDQUFDLHlDQUF5QyxZQUFZLENBQUMsdUJBQXVCLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyx5REFBeUQsd0JBQXdCLENBQUMsbUNBQW1DLGtDQUFrQyxDQUFDLG1DQUFtQyx5Q0FBeUMsQ0FBQywrREFBK0Qsd0JBQXdCLENBQUMsc0NBQXNDLGtDQUFrQyxDQUFDLHNDQUFzQyx5Q0FBeUMsQ0FBQywrREFBK0Qsd0JBQXdCLENBQUMsc0NBQXNDLGtDQUFrQyxDQUFDLHNDQUFzQyx5Q0FBeUMsQ0FBQyw2REFBNkQsd0JBQXdCLENBQUMscUNBQXFDLGtDQUFrQyxDQUFDLHFDQUFxQyx5Q0FBeUMsQ0FBQyw2REFBNkQsd0JBQXdCLENBQUMscUNBQXFDLGtDQUFrQyxDQUFDLHFDQUFxQyx5Q0FBeUMsQ0FBQywyREFBMkQsd0JBQXdCLENBQUMsb0NBQW9DLGtDQUFrQyxDQUFDLG9DQUFvQyx5Q0FBeUMsQ0FBQywyREFBMkQsd0JBQXdCLENBQUMsb0NBQW9DLGtDQUFrQyxDQUFDLG9DQUFvQyx5Q0FBeUMsQ0FBQywrREFBK0Qsd0JBQXdCLENBQUMsc0NBQXNDLGtDQUFrQyxDQUFDLHNDQUFzQyx5Q0FBeUMsQ0FBQywrREFBK0Qsd0JBQXdCLENBQUMsc0NBQXNDLGtDQUFrQyxDQUFDLHNDQUFzQyx5Q0FBeUMsQ0FBQywyREFBMkQsd0JBQXdCLENBQUMsb0NBQW9DLGtDQUFrQyxDQUFDLG9DQUFvQyx5Q0FBeUMsQ0FBQyw2REFBNkQsd0JBQXdCLENBQUMscUNBQXFDLGtDQUFrQyxDQUFDLHFDQUFxQyx5Q0FBeUMsQ0FBQywyREFBMkQsd0JBQXdCLENBQUMsb0NBQW9DLGtDQUFrQyxDQUFDLG9DQUFvQyx5Q0FBeUMsQ0FBQyw4RUFBOEUsU0FBUyxDQUFDLHFIQUFxSCx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQywrR0FBK0cseUJBQXlCLENBQUMsMEJBQTBCLENBQUMsK0dBQStHLHdCQUF3QixDQUFDLGlCQUF1RSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsMEJBQTBCLG9CQUFvQixDQUFDLGtDQUFrQywyQ0FBMkMsQ0FBQyx5Q0FBeUMsWUFBWSxDQUFDLDBCQUEwQixvQkFBb0IsQ0FBQyxtREFBbUQsYUFBYSxDQUFDLHVDQUF1QyxvQkFBb0IsQ0FBQyxrQ0FBa0MsVUFBVSxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUE4QyxzQkFBc0IsQ0FBQyx1QkFBdUIsdUJBQXVCLENBQUMsc0NBQXNDLFlBQVksQ0FBQyx3QkFBd0IsU0FBUyxDQUFDLDBCQUEwQixhQUFhLENBQUMseUJBQXlCLFNBQVMsQ0FBQyx5QkFBeUIsU0FBUyxDQUFDLHdCQUF3QixhQUFhLENBQUMsMEJBQTBCLGFBQWEsQ0FBQywwQkFBMEIsV0FBVyxDQUFDLHlCQUF5QixZQUFZLENBQUMsd0JBQXdCLFNBQVMsQ0FBQywyQkFBMkIsV0FBVyxDQUFDLDJCQUEyQixZQUFZLENBQUMsZUFBZSxjQUFjLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsZ0ZBQWdGLHlCQUF5QixDQUFDLDRDQUE0QyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdDQUFnQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsOEJBQThCLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsbUJBQW1CLENBQUMsOEJBQThCLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGlFQUFpRSxDQUFDLHlEQUF5RCxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLGdFQUFnRSxDQUFDLHdEQUF3RCxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQyw4QkFBOEIsQ0FBQyxxQ0FBcUMsa0JBQWtCLENBQUMsOENBQThDLGlCQUFpQixDQUFDLHNHQUFzRyxZQUFZLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLHFDQUFxQyx3QkFBd0IsQ0FBQywyQ0FBMkMsd0JBQXdCLENBQUMsb0RBQW9ELHdCQUF3QixDQUFDLDhDQUE4Qyx3QkFBd0IsQ0FBQyxvREFBb0QscUJBQXFCLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMseUNBQXlDLGVBQWUsQ0FBQyxnQ0FBZ0MsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLDJDQUEyQyxDQUFDLDRDQUE0QyxZQUFZLENBQUMsbUNBQW1DLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLHNEQUFzRCxDQUFDLDhDQUE4QyxDQUFDLDJDQUEyQyxDQUFDLDhDQUE4QyxlQUFlLENBQUMsd0NBQXdDLGdDQUFnQyxDQUFDLDJDQUEyQyxnQ0FBZ0MsQ0FBQyxnQ0FBZ0Msd0JBQXdCLENBQUMsMkJBQTJCLFdBQVcsQ0FBQywwQkFBMEIsYUFBYSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsY0FBYyxzQkFBc0IsQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLGNBQWMsc0JBQXNCLENBQUMsdUJBQXVCLFdBQVcsQ0FBQyxlQUFlLHNCQUFzQixDQUFDLHdCQUF3QixXQUFXLENBQUMsU0FBUyxjQUFjLENBQUMsa0JBQWtCLFdBQVcsQ0FBQyxlQUFlLHVCQUF1QixDQUFDLHdCQUF3QixXQUFXLENBQUMsY0FBYyx1QkFBdUIsQ0FBQyx1QkFBdUIsV0FBVyxDQUFDLGFBQWEsdUJBQXVCLENBQUMsc0JBQXNCLFdBQVcsQ0FBQyxpQkFBaUIsdUJBQXVCLENBQUMsMEJBQTBCLFdBQVcsQ0FBQzs7Ozs7Ozs7RUFRemp0RixDQUFDLFlBQVksaUJBQWlCLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxrR0FBa0csQ0FBQywwRkFBMEYsQ0FBQyxrRkFBa0YsQ0FBQyw4R0FBOEcsQ0FBQywwQkFBMEIsQ0FBQyx5RUFBeUUsQ0FBQyxpRUFBaUUsQ0FBQyx3QkFBd0IsWUFBWSxDQUFDLHVCQUF1QixlQUFlLENBQUMsb0JBQW9CLGFBQWEsQ0FBQyw0REFBNEQsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLHNCQUFzQixDQUFDLGNBQWMsV0FBVyxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsWUFBWSxDQUFDLHlCQUF5QixlQUFlLENBQUMsc0JBQXNCLGdCQUFnQixDQUFDLDJCQUEyQixlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsdUNBQXVDLFlBQVksQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLDhCQUE4QixpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMscUNBQXFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLHlDQUF5QyxlQUFlLENBQUMsa0JBQWtCLGlCQUFpQixDQUFDLHdCQUF3QixjQUFjLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDhCQUE4QixTQUFTLENBQUMseUJBQXlCLFlBQVksQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDRCQUE0QixhQUFhLENBQUMsNENBQTRDLGFBQWEsQ0FBQyxpREFBeUYsWUFBWSxDQUFDLHdDQUF3QyxZQUFZLENBQUMsb0JBQW9CLG9CQUFvQixDQUFDLHlCQUErRSxtQkFBbUIsQ0FBQyxxQkFBcUIsa0JBQWtCLENBQUMsMkNBQTJDLENBQUMscURBQXFELENBQUMsNkNBQTZDLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMseURBQXlELGVBQWUsQ0FBQyxlQUFlLENBQUMsNEJBQTRCLGVBQWUsQ0FBQywyQ0FBMkMsQ0FBQyxvRkFBb0YsQ0FBQyw0RUFBNEUsQ0FBQyw2Q0FBNkMsaUJBQWlCLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxpQkFBeUQsWUFBWSxDQUFDLFVBQVUsQ0FBZ0Qsa0JBQWtCLENBQUMsbUNBQW1DLGFBQWEsQ0FBc0MsYUFBYSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsYUFBYSxDQUFzQyxhQUFhLENBQUMscUJBQXFCLENBQUMsNENBQTRDLGNBQWMsQ0FBQyxnQ0FBZ0MsU0FBUyxDQUFDLHFCQUFxQixvSEFBb0gsQ0FBQyw0R0FBNEcsQ0FBQyxrQkFBa0Isd0JBQXdCLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxtREFBbUQsOERBQThELENBQUMsc0RBQXNELENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxxQkFBcUIsd0JBQXdCLENBQUMsYUFBYSxDQUFDLG1EQUFtRCw4REFBOEQsQ0FBQyxzREFBc0QsQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLGlCQUFpQix3QkFBd0IsQ0FBQyxhQUFhLENBQUMsMkNBQTJDLDhEQUE4RCxDQUFDLHNEQUFzRCxDQUFDLHlCQUF5QixhQUFhLENBQUMsb0JBQW9CLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxpREFBaUQsOERBQThELENBQUMsc0RBQXNELENBQUMsNEJBQTRCLGFBQWEsQ0FBQyxrQkFBa0Isd0JBQXdCLENBQUMsYUFBYSxDQUFDLDZDQUE2Qyw4REFBOEQsQ0FBQyxzREFBc0QsQ0FBQywwQkFBMEIsYUFBYSxDQUFDLG9CQUFvQix3QkFBd0IsQ0FBQyxhQUFhLENBQUMsaURBQWlELDhEQUE4RCxDQUFDLHNEQUFzRCxDQUFDLDRCQUE0QixhQUFhLENBQUMsdUNBQXVDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLGdCQUFnQix3QkFBd0IsQ0FBQyxhQUFhLENBQUMsOERBQThELENBQUMsc0RBQXNELENBQUMsd0JBQXdCLGFBQWEsQ0FBQyxtQkFBbUIsd0JBQXdCLENBQUMsYUFBYSxDQUFDLDhEQUE4RCxDQUFDLHNEQUFzRCxDQUFDLDJCQUEyQixhQUFhLENBQUMsbUJBQW1CLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyw4REFBOEQsQ0FBQyxzREFBc0QsQ0FBQywyQkFBMkIsYUFBYSxDQUFDLGtCQUFrQix3QkFBd0IsQ0FBQyxhQUFhLENBQUMsOERBQThELENBQUMsc0RBQXNELENBQUMsMEJBQTBCLGFBQWEsQ0FBQyxrQkFBa0Isd0JBQXdCLENBQUMsYUFBYSxDQUFDLDhEQUE4RCxDQUFDLHNEQUFzRCxDQUFDLDBCQUEwQixhQUFhLENBQUMsaUJBQWlCLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyw4REFBOEQsQ0FBQyxzREFBc0QsQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLGlCQUFpQix3QkFBd0IsQ0FBQyxhQUFhLENBQUMsOERBQThELENBQUMsc0RBQXNELENBQUMseUJBQXlCLGFBQWEsQ0FBQyxtQkFBbUIsd0JBQXdCLENBQUMsYUFBYSxDQUFDLDhEQUE4RCxDQUFDLHNEQUFzRCxDQUFDLDJCQUEyQixhQUFhLENBQUMsbUJBQW1CLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyw4REFBOEQsQ0FBQyxzREFBc0QsQ0FBQywyQkFBMkIsYUFBYSxDQUFDLGlCQUFpQix3QkFBd0IsQ0FBQyxhQUFhLENBQUMsOERBQThELENBQUMsc0RBQXNELENBQUMseUJBQXlCLGFBQWEsQ0FBQyxrQkFBa0Isd0JBQXdCLENBQUMsYUFBYSxDQUFDLDhEQUE4RCxDQUFDLHNEQUFzRCxDQUFDLDBCQUEwQixhQUFhLENBQUMsaUJBQWlCLHFCQUFxQixDQUFDLGlCQUFpQixxQkFBcUIsQ0FBQyxrQkFBa0IscUJBQXFCLENBQUMsWUFBWSxhQUFhLENBQUMsa0JBQWtCLHNCQUFzQixDQUFDLGdCQUFnQixzQkFBc0IsQ0FBQyxpQkFBaUIsc0JBQXNCLENBQUMsb0JBQW9CLHNCQUFzQixDQUFDOzs7Ozs7OztFQVFqL1AsQ0FBQyxVQUFVLFVBQVUsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLG1DQUFtQyxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLFlBQVksQ0FBQyxxQkFBcUIsZUFBZSxDQUFDLDBCQUEwQixxREFBcUQsQ0FBQyw2Q0FBNkMsQ0FBQyxnQkFBZ0IsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1CQUFtQixXQUFXLENBQUMsa0JBQWtCLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsK0JBQStCLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyx5Q0FBeUMsQ0FBQyxnQkFBZ0IsQ0FBQyxrQ0FBa0MsZ0JBQWdCLENBQUMsOENBQThDLGdDQUFnQyxDQUFDLDZDQUE2QyxnQ0FBZ0MsQ0FBQyw2Q0FBNkMsMkNBQTJDLENBQUMsZ0JBQWdCLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsV0FBVyxDQUFDLHVDQUF1QyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLCtCQUErQixDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxrQ0FBa0MsZ0JBQWdCLENBQUMsOENBQThDLGdDQUFnQyxDQUFDLDZDQUE2QyxnQ0FBZ0MsQ0FBQyw2Q0FBNkMsMkNBQTJDLENBQUMsZ0JBQWdCLHNDQUFzQyxDQUFDLDRCQUE0QixlQUFlLENBQUMsd0NBQXdDLHNDQUFzQyxDQUFDLGFBQWEsK0JBQStCLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLHVCQUF1QixDQUFDLDJCQUEyQixRQUFRLENBQUMsa0JBQWtCLFNBQVMsQ0FBQyx3QkFBd0IsWUFBWSxDQUFDLGdDQUFnQyxhQUFhLENBQUMseUNBQXlDLDRCQUE0QixVQUFVLENBQUMscUlBQXFJLG9CQUFvQixDQUFDLHVCQUF1QixDQUFDLDRCQUE0QixTQUFTLENBQUMsa0NBQWtDLGFBQWEsQ0FBQyxrQ0FBa0MsYUFBYSxDQUFDLCtCQUErQixlQUFlLENBQUMsa0JBQWtCLENBQUMsNERBQTRELENBQUMsb0RBQW9ELENBQUMsb0VBQW9FLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyw2QkFBNkIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxzRkFBc0YsZUFBZSxDQUFDLDREQUE0RCxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLHdGQUF3RixjQUFjLENBQUMscUJBQXFCLHdCQUF3QixDQUFDLDhCQUE4QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyx1Q0FBdUMsd0NBQXdDLENBQUMseUNBQXlDLENBQUMsOEJBQThCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLG9FQUFvRSx1Q0FBdUMsQ0FBQyx3Q0FBd0MsQ0FBQywyREFBMkQsbUJBQW1CLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyx1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQywyREFBMkQsbUJBQW1CLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyxrRUFBa0Usb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsa0VBQWtFLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDJGQUEyRiwwQkFBMEIsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLDREQUE0RCx3Q0FBd0MsQ0FBQyw0REFBNEQsd0NBQXdDLENBQUMscUNBQXFDLHdDQUF3QyxDQUFDLDRDQUE0QyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQyw0Q0FBNEMsNEJBQTRCLENBQUMsdUJBQXVCLENBQUMsNENBQTRDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLDRDQUE0Qyw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQyxzQ0FBc0Msc0NBQXNDLENBQUMsOEJBQThCLENBQUMsc0NBQXNDLDRCQUE0QixDQUFDLHVCQUF1QixDQUFDLDBDQUEwQyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQywwQ0FBMEMsNEJBQTRCLENBQUMsdUJBQXVCLENBQUMsd0NBQXdDLDhDQUE4QyxDQUFDLHNDQUFzQyxDQUFDLHdDQUF3Qyw0QkFBNEIsQ0FBQywrQkFBK0IsQ0FBQyw2R0FBNkcsbUJBQW1CLENBQUMsdUJBQXVCLENBQUMseUNBQXlDLDhNQUE4TSxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxxQ0FBcUMsU0FBUyxDQUFDLDJDQUEyQyxhQUFhLENBQUMsMkNBQTJDLGFBQWEsQ0FBQyx3Q0FBd0MsZUFBZSxDQUFDLGtCQUFrQixDQUFDLDREQUE0RCxDQUFDLG9EQUFvRCxDQUFDLHNGQUFzRixjQUFjLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMscUVBQXFFLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsbUVBQW1FLGVBQWUsQ0FBQyx1RUFBdUUsaUJBQWlCLENBQUMscUVBQXFFLGdCQUFnQixDQUFDLGlFQUFpRSxrQkFBa0IsQ0FBQyx1RUFBdUUscUJBQXFCLENBQUMsdUVBQXVFLHFCQUFxQixDQUFDLGdEQUFnRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLGtCQUFrQixDQUFDLHNDQUFzQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsMkVBQTJFLG9DQUFvQyxDQUFDLCtCQUErQixDQUFDLDZGQUE2RiwwQ0FBMEMsQ0FBQyxvQkFBb0IsQ0FBQyxpQ0FBaUMsU0FBUyxDQUFDLDRDQUE0QyxhQUFhLENBQUMsYUFBYSxDQUFDLCtCQUErQixDQUFDLGtIQUFrSCw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQyx3SEFBd0gsNEJBQTRCLENBQUMsdUJBQXVCLENBQUMscUhBQXFILDRCQUE0QixDQUFDLCtCQUErQixDQUFDLDJIQUEySCw0QkFBNEIsQ0FBQyx1QkFBdUIsQ0FBQywySEFBMkgsNEJBQTRCLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsMENBQTBDLGVBQWUsQ0FBQyxpQ0FBaUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLDJDQUEyQyxDQUFDLDZDQUE2QyxZQUFZLENBQUMsb0NBQW9DLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDLDJDQUEyQyxDQUFDLCtDQUErQyxlQUFlLENBQUMsNEVBQTRFLGlDQUFpQyxDQUFDLDhGQUE4RixzQ0FBc0MsQ0FBQyx5RUFBeUUsNEJBQTRCLENBQUMsK0JBQStCLENBQUMsaUVBQWlFLGtCQUFrQixDQUFDLGlFQUFpRSxrQkFBa0IsQ0FBQyxjQUFjLDZCQUE2QixDQUFDLHVCQUF1QixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsNkJBQTZCLENBQUMsMEJBQTBCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQiw2QkFBNkIsQ0FBQywwQkFBMEIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLDZCQUE2QixDQUFDLHlCQUF5QixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsNkJBQTZCLENBQUMseUJBQXlCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsNkJBQTZCLENBQUMsd0JBQXdCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsNkJBQTZCLENBQUMsd0JBQXdCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQiw2QkFBNkIsQ0FBQywwQkFBMEIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLDZCQUE2QixDQUFDLDBCQUEwQixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLDZCQUE2QixDQUFDLHdCQUF3QixrQ0FBa0MsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsNkJBQTZCLENBQUMseUJBQXlCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGVBQWUsNkJBQTZCLENBQUMsd0JBQXdCLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLGdCQUFnQiw2QkFBNkIsQ0FBQyx5QkFBeUIsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsd0JBQXdCLFVBQVUsQ0FBQyx3QkFBd0IsU0FBUyxDQUFDLDBCQUEwQixrQkFBa0IsQ0FBQyx5QkFBeUIsU0FBUyxDQUFDLHlCQUF5QixTQUFTLENBQUMsd0JBQXdCLGtCQUFrQixDQUFDLDBCQUEwQixrQkFBa0IsQ0FBQywwQkFBMEIsV0FBVyxDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyx3QkFBd0IsU0FBUyxDQUFDLDJCQUEyQixpQkFBaUIsQ0FBQywyQkFBMkIsaUJBQWlCLENBQUMsNkJBQTZCLGlCQUFpQixDQUFDLDZCQUE2QixpQkFBaUIsQ0FBQyw0QkFBNEIsaUJBQWlCLENBQUMsNEJBQTRCLFdBQVcsQ0FBQyw0Q0FBNEMsV0FBVyxDQUFDLDRDQUE0QyxXQUFXLENBQUMsZ0RBQWdELFlBQVksQ0FBQyw4Q0FBOEMsU0FBUyxDQUFDLDhDQUE4QyxZQUFZLENBQUMsNENBQTRDLFdBQVcsQ0FBQyxnREFBZ0QsWUFBWSxDQUFDLGdEQUFnRCxTQUFTLENBQUMsOENBQThDLFlBQVksQ0FBQyw0Q0FBNEMsV0FBVyxDQUFDLGtEQUFrRCxZQUFZLENBQUMsa0RBQWtELFNBQVMsQ0FBQyxzREFBc0QsWUFBWSxDQUFDLHNEQUFzRCxXQUFXLENBQUMsb0RBQW9ELFlBQVksQ0FBQyxvREFBb0QsVUFBVSxDQUFDLDRCQUE0QixjQUFjLENBQUMsa0JBQWtCLENBQUMsd0NBQXdDLENBQUMscUJBQXFCLENBQUMsd0NBQXdDLGdCQUFnQixDQUFDLDRFQUE0RSx3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsa0NBQWtDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLDRDQUE0QyxlQUFlLENBQUMsNkNBQTZDLGVBQWUsQ0FBQyxxQ0FBcUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLGtDQUFrQywwQkFBMEIsQ0FBQyxvQkFBb0IsQ0FBQyxtQ0FBbUMsMEJBQTBCLENBQUMscUJBQXFCLENBQUMseUNBQXlDLG9CQUFvQixDQUFDLHlDQUF5QywwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQyw0Q0FBNEMsb0hBQW9ILENBQUMscUZBQXFGLENBQUMscUhBQTZFLENBQTdFLDZFQUE2RSxDQUFDLFVBQVUsQ0FBQywyQ0FBMkMsb0hBQW9ILENBQUMscUZBQXFGLENBQUMscUhBQTZFLENBQTdFLDZFQUE2RSxDQUFDLFVBQVUsQ0FBQyxxQ0FBcUMsNkJBQTZCLENBQUMsOEJBQThCLENBQUMsbUJBQW1CLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsc0JBQXNCLGdDQUFnQyxDQUFDLDJDQUEyQyxDQUFDLG9DQUFvQyxDQUFDLHlCQUF5QiwyQ0FBMkMsQ0FBQyxvSkFBb0osbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsd0lBQXdJLGVBQWUsQ0FBQyxnREFBZ0QsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLHFCQUFxQixVQUFVLENBQUMsZ0JBQWdCLGNBQWMsQ0FBQyxtQ0FBbUMsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsNENBQTRDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsY0FBYyxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixzQ0FBc0MsQ0FBQyxtQkFBbUIsY0FBYyxDQUFDLCtDQUErQywwQ0FBMEMsQ0FBQywrQkFBK0IsV0FBVyxDQUFDLDhIQUE4SCxVQUFVLENBQUMsc0pBQXNKLGNBQWMsQ0FBQyxvSkFBb0osZUFBZSxDQUFDLG9GQUFvRixhQUFhLENBQUMsOENBQThDLHVDQUF1QyxDQUFDLHNFQUFzRSxnQkFBZ0IsQ0FBQyxvQkFBb0IsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsd0NBQXdDLGVBQWUsQ0FBQyxtQ0FBbUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsbUNBQW1DLG1CQUFtQixDQUFDLHFCQUFxQixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsaUJBQWlCLENBQUMsb0NBQW9DLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLG9DQUFvQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsY0FBYyxDQUFDLFVBQVUsYUFBYSxDQUFDLGdCQUFnQixlQUFlLENBQUM7Ozs7Ozs7OztFQVNwNmlCLENBQUMsT0FBTyxhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsUUFBUSxDQUFDLGtCQUFrQixRQUFRLENBQUMsY0FBYyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLFdBQVcsQ0FBQyxXQUFXLENBQUMsa0NBQWtDLFdBQVcsQ0FBQyxZQUFZLENBQUMsaUNBQWlDLFdBQVcsQ0FBQyxZQUFZLENBQUMsMkJBQTJCLFdBQVcsQ0FBQyxZQUFZLENBQUMsY0FBYyxXQUFXLENBQUMsWUFBWSxDQUFDLDhCQUE4QixXQUFXLENBQUMsWUFBWSxDQUFDLGlDQUFpQyxXQUFXLENBQUMsWUFBWSxDQUFDLG9DQUFvQyxXQUFXLENBQUMsWUFBWSxDQUFDLGNBQWMsV0FBVyxDQUFDLFdBQVcsQ0FBQywrQkFBK0IsV0FBVyxDQUFDLFlBQVksQ0FBQyw4QkFBOEIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQ0FBaUMsV0FBVyxDQUFDLGNBQWMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxpQ0FBaUMsV0FBVyxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsV0FBVyxDQUFDLFlBQVksQ0FBQyw2QkFBNkIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxtQ0FBbUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsV0FBVyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsV0FBVyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsV0FBVyxDQUFDLFlBQVksQ0FBQyxxQ0FBcUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxvQ0FBb0MsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLFlBQVksQ0FBQyx5Q0FBeUMsY0FBYyxhQUFhLENBQUMsQ0FBQyxnQkFBZ0IsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLHlCQUF5QixxQkFBcUIsQ0FBQyw2QkFBNkIsdUJBQXVCLENBQUM7Ozs7Ozs7O0VBUXgwRCxDQUFDLHlCQUF5QixjQUFjLENBQUMsaUJBQWlCLENBQXlDLFlBQVksQ0FBb0YscUJBQXFCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyx3REFBd0QsQ0FBQyxnREFBZ0QsQ0FBQyx5RUFBeUUsQ0FBQyxpRUFBaUUsQ0FBQyxpREFBaUQsQ0FBQyx3R0FBd0csQ0FBQyxVQUFVLENBQUMsU0FBUyxZQUFZLENBQUMsNkJBQTZCLGNBQWMsQ0FBQyxxQkFBcUIsWUFBWSxDQUFDLG9CQUFvQixlQUFlLENBQUMsVUFBa0QsWUFBWSxDQUFDLG9CQUFvQixDQUFvQixjQUFjLENBQUMsZ0JBQXdELFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsK0JBQStCLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLGlCQUFpQixDQUFDLG1EQUFtRCxxREFBcUQsQ0FBQyx5QkFBeUIsQ0FBQyxpREFBaUQscURBQXFELENBQUMsaURBQWlELG9DQUFvQyxDQUFDLHVDQUF1QyxpQkFBaUIsQ0FBQyxhQUFhLENBQXNDLGFBQWEsQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsK0NBQStDLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLGlFQUFpRSxXQUFXLENBQUMsMkNBQWtGLFdBQVcsQ0FBQyxXQUFXLENBQUMsc0NBQXNDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsdURBQXVELGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsMkRBQTJELGFBQWEsQ0FBQyxTQUFTLENBQUMsNERBQTRELENBQUMscUJBQXFCLENBQUMsNkVBQTZFLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyx3QkFBd0IsQ0FBQyxzS0FBc0ssZUFBZSxDQUFDLHlFQUF5RSxVQUFVLENBQUMsMkVBQTJFLFdBQVcsQ0FBQyx5RUFBeUUsZUFBZSxDQUFDLDZFQUE2RSxpQkFBaUIsQ0FBQywyRUFBMkUsZ0JBQWdCLENBQUMsbURBQW1ELG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxnR0FBZ0csU0FBUyxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxxRUFBcUUsVUFBVSxDQUFDLHFCQUFxQixDQUFDLCtDQUErQyxlQUFlLENBQUMscUVBQXFFLGVBQWUsQ0FBQyxxQ0FBcUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLHlDQUF5QyxpQkFBaUIsQ0FBQyw2REFBNkQsY0FBYyxDQUFDLHVGQUF1RixjQUFjLENBQUMsZ0JBQWdCLENBQUMsaUVBQWlFLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyw2RUFBNkUsUUFBUSxDQUFDLDZEQUE2RCxxQkFBcUIsQ0FBQyx5RUFBeUUsYUFBYSxDQUFDLDJEQUEyRCxvQkFBb0IsQ0FBQyx1RUFBdUUscUJBQXFCLENBQUMsb0ZBQW9GLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyx5Q0FBeUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLGlFQUFpRSxjQUFjLENBQUMsV0FBVyxDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLDZFQUE2RSxTQUFTLENBQUMsYUFBYSxDQUFDLCtFQUErRSxhQUFhLENBQUMsaUVBQWlFLGNBQWMsQ0FBQyxXQUFXLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsNkVBQTZFLFNBQVMsQ0FBQyxhQUFhLENBQUMsK0VBQStFLGFBQWEsQ0FBQyx1Q0FBdUMsY0FBYyxDQUFDLHNCQUFzQixDQUF3QyxXQUFXLENBQUMsOENBQThDLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLDZEQUE2RCxvQkFBb0IsQ0FBQyx5RUFBeUUsYUFBYSxDQUFDLHVDQUF1QyxtR0FBbUcsQ0FBQywyRkFBMkYsQ0FBQyxrSEFBa0gsbUdBQW1HLENBQUMsMkZBQTJGLENBQUMsdUNBQXVDLG1HQUFtRyxDQUFDLDJGQUEyRixDQUFDLG1CQUFnRSxzQkFBc0IsQ0FBQyxrQkFBa0IsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsOERBQThELHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxzRkFBc0YsY0FBYyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLHdEQUF3RCxDQUFDLGdEQUFnRCxDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLHFEQUFxRCwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyx1RUFBdUUsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsOERBQThELDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLGdGQUFnRiwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyw4REFBOEQsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsZ0ZBQWdGLDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLDJEQUEyRCwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyw2RUFBNkUsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsMkRBQTJELDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLDZFQUE2RSwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyx3REFBd0QsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsMEVBQTBFLDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLHdEQUF3RCwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQywwRUFBMEUsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsOERBQThELDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLGdGQUFnRiwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyw4REFBOEQsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsZ0ZBQWdGLDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLHdEQUF3RCwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQywwRUFBMEUsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsMkRBQTJELDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLDZFQUE2RSwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyx3REFBd0QsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsMEVBQTBFLDBFQUEwRSxDQUFDLGtFQUFrRSxDQUFDLDJEQUEyRCwwRUFBMEUsQ0FBQyxrRUFBa0UsQ0FBQyw2RUFBNkUsMEVBQTBFLENBQUMsa0VBQWtFLENBQUMsY0FBYyxhQUFhLENBQUMsY0FBYyxDQUFDLG9CQUFvQixVQUFVLENBQUMsY0FBYyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IscUJBQXFCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsOEJBQThCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLGdDQUFnQyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHNCQUFzQix1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxxQkFBcUIsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLGNBQWMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHlDQUF5Qyx1QkFBdUIsYUFBYSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMseUJBQXlCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLCtCQUErQixxQkFBcUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDhCQUE4QixxQkFBcUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDhCQUE4QixxQkFBcUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDZCQUE2QixxQkFBcUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLCtCQUErQiw4QkFBOEIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLCtCQUErQiw4QkFBOEIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDhCQUE4Qiw4QkFBOEIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLDZCQUE2Qiw4QkFBOEIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQywrREFBK0QsdUJBQXVCLGFBQWEsQ0FBQyxjQUFjLENBQUMsNkJBQTZCLFVBQVUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLHlCQUF5QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQywrQkFBK0IscUJBQXFCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIscUJBQXFCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHdCQUF3QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBOEIsOEJBQThCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyw2QkFBNkIsOEJBQThCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQywrQkFBK0IsOEJBQThCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQywrQkFBK0IsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLDhCQUE4Qix1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsNkJBQTZCLHVCQUF1QixDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLENBQUMseUNBQXlDLG9CQUFvQix1QkFBdUIsQ0FBQyxzQ0FBc0Msc0JBQXNCLENBQUMsMEJBQTBCLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLGdCQUFnQixhQUFhLENBQUM7Ozs7Ozs7O0VBUXQxaEIsQ0FBQyxhQUFhLGNBQWMsQ0FBQyxlQUFlLENBQUMseUJBQXlCLFlBQVksQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxZQUFZLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyx5Q0FBeUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsOEJBQThCLGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsbUVBQW1FLGFBQWEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQywrQkFBK0IsYUFBYSxDQUFDLHVDQUF1QyxpQkFBaUIsQ0FBQyw4QkFBOEIsYUFBYSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQywrQkFBK0IsY0FBYyxDQUFDLHFDQUFxQyxhQUFhLENBQUMsZ0NBQWdDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLGdCQUFnQixDQUFDLGtDQUFrQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyw0Q0FBNEMsY0FBYyxDQUFDLDRCQUE0QixtQkFBbUIsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLCtCQUErQixnQkFBZ0IsQ0FBQyxpQ0FBaUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDLDRDQUE0QyxjQUFjLENBQUMsK0VBQStFLG9CQUFvQixDQUFDLHlCQUF5QixjQUFjLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxjQUFjLENBQUMsa0NBQWtDLGFBQWEsQ0FBQyxXQUFXLENBQUMsd0ZBQXdGLFlBQVksQ0FBQyx5Q0FBeUMsMkJBQTJCLENBQUMsd0JBQXdCLENBQUMsOENBQThDLENBQUMsc0NBQXNDLENBQUMsdUNBQXVDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsQ0FBQyxzREFBc0QsU0FBUyxDQUFDLGtCQUFrQixzQkFBc0IsQ0FBQyxrQkFBa0Isc0JBQXNCLENBQUMsbUJBQW1CLHNCQUFzQixDQUFDLGFBQWEsY0FBYyxDQUFDLG1CQUFtQix1QkFBdUIsQ0FBQyxpQkFBaUIsdUJBQXVCLENBQUMsa0JBQWtCLHVCQUF1QixDQUFDLHFCQUFxQix1QkFBdUIsQ0FBQzs7Ozs7Ozs7RUFRbHRGLENBQUMsU0FBUyxZQUFZLENBQUMscUJBQXFCLFlBQVksQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLGdCQUF3RCxZQUFZLENBQW1GLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyw0QkFBNEIsWUFBWSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsdUJBQXVCLGFBQWEsQ0FBc0MsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQTZCLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyw2QkFBNkIsU0FBUyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLENBQUMsMkJBQTJCLFVBQVUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsZ0NBQWdDLHNDQUFzQyxDQUFDLHlCQUF5QixhQUFhLENBQXNDLGFBQWEsQ0FBNkIsa0JBQWtCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLG9DQUFvQyxnQkFBZ0IsQ0FBQywyQkFBMkIsY0FBYyxDQUFDLCtCQUErQixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxrQ0FBa0MsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsc0NBQXNDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMscUJBQXFCLENBQUMsK0JBQStCLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsbUNBQW1DLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsd0NBQXdDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxlQUFlLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQywyQ0FBMkMsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLHFDQUFxQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQywrQkFBK0Isb0JBQW9CLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsaUNBQWlDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLHNDQUFzQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMscUNBQXFDLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxpREFBaUQsYUFBYSxDQUFDLGtEQUFrRCxhQUFhLENBQUMsNENBQTRDLGFBQWEsQ0FBQyxtREFBbUQsWUFBWSxDQUFDLHNFQUFzRSxjQUFjLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLCtIQUErSCxxQkFBcUIsQ0FBQyxlQUFlLHNCQUFzQixDQUFDLFNBQVMsY0FBYyxDQUFDLGVBQWUsdUJBQXVCLENBQUM7Ozs7Ozs7O0VBUTExRyxDQUFDLGdCQUF3RCxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyw4Q0FBOEMsQ0FBQyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBOUIsMkRBQThCLENBQUMsMERBQTBELENBQUMsVUFBVSxDQUFDLGtCQUFrQixjQUFjLENBQUMsVUFBVSxjQUFjLENBQUMsc0JBQXNCLHNCQUFzQixDQUFDLHFCQUFxQix5QkFBeUIsQ0FBQyxzQkFBc0IsYUFBYSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyw0QkFBNEIsWUFBWSxDQUFDLDJCQUEyQixlQUFlLENBQUMsdUJBQXVCLGlCQUFpQixDQUFzQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBeUIsY0FBYyxDQUFDLDJCQUEyQixhQUFhLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsc0NBQXNDLGVBQWUsQ0FBQyx5QkFBeUIsYUFBYSxDQUFzQyxhQUFhLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLCtCQUErQixhQUFhLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGdDQUFnQyxXQUFXLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQXlCLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxpQ0FBaUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsNERBQTRELENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLDBDQUEwQyxzQkFBc0IsQ0FBQyx3Q0FBd0MsVUFBVSxDQUFDLHlDQUF5QyxXQUFXLENBQUMsNkJBQXdELGlCQUFpQixDQUFDLFFBQVEsQ0FBQyx1REFBdUQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsMkJBQTJCLGVBQWUsQ0FBQyxzQ0FBc0MsZUFBZSxDQUFDLHNCQUFzQixrQkFBa0IsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLHdCQUF3QixpQkFBaUIsQ0FBQyxrQ0FBa0MsY0FBYyxDQUFDLCtDQUErQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsb0NBQW9DLFFBQVEsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQywwQ0FBMEMsUUFBUSxDQUFDLGtDQUFrQyxxQkFBcUIsQ0FBQyx3Q0FBd0MsYUFBYSxDQUFDLGlDQUFpQyxvQkFBb0IsQ0FBQyx1Q0FBdUMscUJBQXFCLENBQUMsd0NBQXdDLGNBQWMsQ0FBQyxXQUFXLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsOENBQThDLFNBQVMsQ0FBQyxhQUFhLENBQUMsK0NBQStDLGFBQWEsQ0FBQyxvQ0FBb0MsY0FBYyxDQUFDLFdBQVcsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQywwQ0FBMEMsU0FBUyxDQUFDLGFBQWEsQ0FBQywyQ0FBMkMsYUFBYSxDQUFDLHVCQUF1QixhQUFhLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLHlCQUF5Qiw0QkFBNEIsQ0FBQyxnREFBZ0QsNEJBQTRCLENBQUMsNkJBQTZCLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsZ0NBQWdDLFdBQVcsQ0FBQywrREFBK0QsZ0JBQWdCLFlBQVksQ0FBQyxnQ0FBZ0MsV0FBVyxDQUFDLGdDQUFnQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyx5Q0FBeUMsa0NBQXFILHFCQUFxQixDQUFDLFlBQVksQ0FBQyx5Q0FBeUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLHNGQUFzRix3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxrREFBa0QsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMsc0RBQWdGLHFCQUFxQixDQUFDLHlEQUFvRixpQkFBaUIsQ0FBQyx5REFBaUYsbUJBQW1CLENBQUMsd0JBQXdCLGNBQWMsQ0FBQyx1Q0FBdUMsWUFBWSxDQUFDLHdCQUF3Qix1Q0FBdUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLG9DQUFvQyxlQUFlLENBQUMsc0JBQXNCLENBQUMsdUJBQXVCLENBQUMsbUNBQW1DLHlCQUF5QixDQUFDLDBCQUEwQixDQUFDLGdDQUFnQyxRQUFRLENBQUMsZUFBZSxDQUFDLCtDQUErQyxRQUFRLENBQUMsYUFBYSxDQUFDLGtEQUFrRCxjQUFjLENBQUMsb0ZBQW9GLGFBQWEsQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDLHlDQUF5QywwRUFBMEUscUJBQXFCLENBQUMsQ0FBQzs7Ozs7Ozs7RUFRcnJMLENBQUMsY0FBb0UsbUJBQW1CLENBQW9GLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLDBCQUEwQixZQUFZLENBQUMseUJBQXlCLGVBQWUsQ0FBQyxlQUF1RCxZQUFZLENBQThDLHNCQUFzQixDQUFvQixjQUFjLENBQUMsMEJBQWdGLG1CQUFtQixDQUFzQyxhQUFhLENBQW9GLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxlQUF1RCxZQUFZLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLGFBQWEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsMkJBQTJCLFlBQVksQ0FBQyxzREFBc0QsNERBQTRELENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLHNEQUFzRCw0REFBNEQsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLG9FQUFvRSxZQUFZLENBQUMsb0VBQW9FLFlBQVksQ0FBQyxrRUFBa0UsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0VBQWdFLGVBQWUsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLDhFQUE4RSxpQkFBaUIsQ0FBQyw4REFBOEQsZUFBZSxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixlQUFlLENBQUMsOEJBQThCLGFBQWEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLGVBQWUsQ0FBQywrQkFBK0Isc0JBQXNCLENBQUMsY0FBYyxDQUFDLHFCQUFxQixlQUFlLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyxjQUFjLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxnQ0FBZ0Msc0JBQXNCLENBQUMsY0FBYyxDQUFDLG1CQUFtQixlQUFlLENBQUMsOEJBQThCLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsZUFBZSxDQUFDLCtCQUErQixhQUFhLENBQUMsY0FBYyxDQUFDLG9CQUFvQixlQUFlLENBQUMsK0JBQStCLGFBQWEsQ0FBQyxjQUFjLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxnQ0FBZ0Msc0JBQXNCLENBQUMsY0FBYyxDQUFDLG1CQUFtQixlQUFlLENBQUMsOEJBQThCLGFBQWEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLGVBQWUsQ0FBQyw4QkFBOEIsY0FBYyxDQUFDLGNBQWMsQ0FBQyx5QkFBMkcsa0JBQWtCLENBQWdELGtCQUFrQixDQUFDLDBCQUE2RyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLHFDQUF1SCxrQkFBa0IsQ0FBZ0Qsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxzRkFBc0Ysc0JBQXNCLENBQUMsd0ZBQXdGLFlBQVksQ0FBQyw0RUFBNEUsb0JBQW9CLENBQUMscUJBQXFCLENBQUMsNEVBQTRFLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLG1HQUFtRyxhQUFhLENBQUMsNEdBQTRHLGFBQWEsQ0FBQyw0R0FBNEcsYUFBYSxDQUFDLHlHQUF5RyxhQUFhLENBQUMseUdBQXlHLGFBQWEsQ0FBQyxzR0FBc0csYUFBYSxDQUFDLHNHQUFzRyxhQUFhLENBQUMsNEdBQTRHLGFBQWEsQ0FBQyw0R0FBNEcsYUFBYSxDQUFDLHNHQUFzRyxhQUFhLENBQUMseUdBQXlHLGFBQWEsQ0FBQyxzR0FBc0csYUFBYSxDQUFDLHdFQUF3RSxVQUFVLENBQUMsd0VBQXdFLDBCQUEwQixDQUFDLDhIQUE4SCxhQUFhLENBQUMsdUlBQXVJLGFBQWEsQ0FBQyx1SUFBdUksYUFBYSxDQUFDLG9JQUFvSSxhQUFhLENBQUMsb0lBQW9JLGFBQWEsQ0FBQyxpSUFBaUksYUFBYSxDQUFDLGlJQUFpSSxhQUFhLENBQUMsdUlBQXVJLGFBQWEsQ0FBQyx1SUFBdUksYUFBYSxDQUFDLGlJQUFpSSxhQUFhLENBQUMsb0lBQW9JLGFBQWEsQ0FBQyxpSUFBaUksYUFBYSxDQUFDLHFDQUFxQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsc0NBQXNDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLGdFQUFnRSwwQkFBMEIsQ0FBQyxzRkFBc0YsMEJBQTBCLENBQUMsMEVBQTBFLHdCQUF3QixDQUFDLGdFQUFnRSx3QkFBd0IsQ0FBQyxzRkFBc0Ysd0JBQXdCLENBQUMsMEVBQTBFLHdCQUF3QixDQUFDLGtFQUFrRSx3QkFBd0IsQ0FBQyx3RkFBd0Ysd0JBQXdCLENBQUMsNEVBQTRFLHdCQUF3QixDQUFDLHNEQUFzRCx3QkFBd0IsQ0FBQyw0RUFBNEUsd0JBQXdCLENBQUMsZ0VBQWdFLHdCQUF3QixDQUFDLGtFQUFrRSx3QkFBd0IsQ0FBQyx3RkFBd0Ysd0JBQXdCLENBQUMsNEVBQTRFLDBCQUEwQixDQUFDLGdFQUFnRSx3QkFBd0IsQ0FBQyxzRkFBc0Ysd0JBQXdCLENBQUMsMEVBQTBFLDBCQUEwQixDQUFDOzs7Ozs7OztFQVF6c1MsQ0FBQyx1Q0FBdUMsY0FBYyxDQUFDLHlCQUF5QixjQUFjLENBQUMsU0FBUyxDQUFDLHFEQUFxRCxjQUFjLENBQUMsOEJBQThCLGNBQWMsQ0FBQyw0REFBNEQsQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsdUVBQXVFLFlBQVksQ0FBQyxtSEFBbUgsU0FBUyxDQUFDLGtCQUFrQixDQUFDLCtEQUErRCxnQkFBZ0IsQ0FBQyxtRkFBbUYsb0JBQW9CLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsOERBQThELENBQUMsc0RBQXNELENBQUMsOENBQThDLENBQUMseUVBQXlFLENBQUMsdUJBQXVCLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLGdDQUFnQyxhQUFhLENBQUMsU0FBUyxDQUFDLCtDQUErQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsd0NBQXdDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxpR0FBaUcsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsc0RBQXNELCtCQUErQixDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixXQUFXLENBQUMscURBQXFELDBCQUEwQixDQUFDLGVBQWUsQ0FBQyw4RUFBOEUsQ0FBQyxzRUFBc0UsQ0FBQyxtRUFBbUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyx1Q0FBdUMsQ0FBQyxxREFBcUQsQ0FBQyw2Q0FBNkMsQ0FBQywyRkFBMkYsZUFBZSxDQUFDLHVFQUF1RSxRQUFRLENBQUMsc0JBQXNCLENBQUMseUNBQXlDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxnS0FBZ0ssY0FBYyxDQUFDLHFCQUFxQixDQUFDLDJGQUEyRixjQUFjLENBQUMscUJBQXFCLENBQUMsbUNBQW1DLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyw4Q0FBOEMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLHVFQUF1RSxhQUFhLENBQUMsbURBQW1ELFVBQVUsQ0FBQyx1Q0FBdUMsMEJBQTBCLENBQUMsV0FBVyxxQkFBcUIsQ0FBQyxrbkdBQWtuRyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxtRkFBbUYscUJBQXFCLENBQUMsYUFBYSxDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxpR0FBaUcsZUFBZSxDQUFDOzs7Ozs7OztFQVExbk4sQ0FBQyxhQUFhLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxpRUFBaUUsY0FBYyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHFDQUFxQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsbURBQW1ELGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLDBHQUEwRyxDQUFDLGtHQUFrRyxDQUFDLGtGQUFrRixDQUFDLHlJQUF5SSxDQUFDLHdCQUF3QixDQUFDLGlEQUFpRCxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQywwR0FBMEcsQ0FBQyxrR0FBa0csQ0FBQyxrRkFBa0YsQ0FBQyx5SUFBeUksQ0FBQyxzQ0FBc0MscUJBQXFCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLHFCQUFxQixDQUFDLGlFQUFpRSxlQUFlLENBQUMsK0JBQStCLENBQUMsa0RBQWtELG9CQUFvQixDQUFDLG1FQUFtRSxrQkFBa0IsQ0FBQywrQkFBK0IsQ0FBQyxpRUFBaUUscUJBQXFCLENBQUMsZ0NBQWdDLHFCQUFxQixDQUFDLDJFQUEyRSxlQUFlLENBQUMsb0JBQW9CLENBQUMseUVBQXlFLHFCQUFxQixDQUFDLCtCQUErQixxQkFBcUIsQ0FBQywrRUFBK0UsZUFBZSxDQUFDLCtCQUErQixDQUFDLDZFQUE2RSxTQUFTLENBQUMscUJBQXFCLENBQUMsK0hBQStILGVBQWUsQ0FBQywrQkFBK0IsQ0FBQyw2SEFBNkgsU0FBUyxDQUFDLHFCQUFxQixDQUFDLHNPQUFzTyxlQUFlLENBQUMsb0JBQW9CLENBQUMsa09BQWtPLHFCQUFxQixDQUFDLG9EQUFvRCxjQUFjLENBQUMsd0lBQXdJLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLFVBQVUsQ0FBQyxnQ0FBZ0MsY0FBYyxDQUFDLHdCQUF3QixDQUF1QixvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLGlEQUFpRCxzQkFBc0IsQ0FBQywrREFBK0QsVUFBVSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsNkRBQTZELFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLDZEQUE2RCxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsZ0NBQWdDLENBQUMsdUZBQXVGLHFCQUFxQixDQUFDLHFGQUFxRixnQ0FBZ0MsQ0FBQyxxR0FBcUcsU0FBUyxDQUFDLDJGQUEyRixxQkFBcUIsQ0FBQyx5RkFBeUYsZ0NBQWdDLENBQUMsdUdBQXVHLHFCQUFxQixDQUFDLHFHQUFxRyxnQ0FBZ0MsQ0FBQyxvQkFBb0Isa0JBQWtCLENBQUMsMEJBQTBCLFlBQVksQ0FBQyxjQUFjLENBQUMsbURBQW1ELG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLGlFQUFpRSxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGdDQUFnQyxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsc0NBQXNDLENBQUMsOEJBQThCLENBQUMsK0RBQStELG1HQUFtRyxDQUFDLG9FQUFvRSxDQUFDLG9HQUE0RCxDQUE1RCw0REFBNEQsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxvRkFBb0YsQ0FBQyw0RUFBNEUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLHlGQUF5RixnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsK0RBQStELG9CQUFvQixDQUFDLCtFQUErRSwwQkFBMEIsQ0FBQywrRUFBK0UsK0JBQStCLENBQUMsNkZBQTZGLGtDQUFrQyxDQUFDLDJGQUEyRixTQUFTLENBQUMsMkZBQTJGLCtCQUErQixDQUFDLHlHQUF5RywrQkFBK0IsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsMEJBQTBCLFlBQVksQ0FBQyxhQUFhLENBQUMsbURBQW1ELGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixpQkFBaUIsQ0FBQyxpRUFBaUUsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsK0RBQStELG1HQUFtRyxDQUFDLG9FQUFvRSxDQUFDLG9HQUE0RCxDQUE1RCw0REFBNEQsQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxvRkFBb0YsQ0FBQyw0RUFBNEUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsb0RBQW9ELENBQUMsNENBQTRDLENBQUMsMkVBQTJFLFlBQVksQ0FBQyxvRkFBb0YsQ0FBQyw0RUFBNEUsQ0FBQyx5RkFBeUYsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLCtFQUErRSxnQ0FBZ0MsQ0FBQyxXQUFXLENBQUMsK0VBQStFLCtCQUErQixDQUFDLDZGQUE2RixrQ0FBa0MsQ0FBQywyRkFBMkYsWUFBWSxDQUFDLG9GQUFvRixDQUFDLDRFQUE0RSxDQUFDLDJGQUEyRiwrQkFBK0IsQ0FBQyx5R0FBeUcsa0NBQWtDLENBQUMsbURBQW1ELHdCQUF3QixDQUFDLDJCQUEyQixZQUFZLENBQUMsMkJBQTJCLFlBQVksQ0FBQyxXQUFXLG9CQUFvQixDQUFDLDZ6REFBNnpELENBQUMsaURBQWlELG9CQUFvQixDQUFDLDZFQUE2RSxlQUFlLENBQUMseUZBQXlGLGNBQWMsQ0FBQyxlQUFlLENBQUM7Ozs7Ozs7O0VBUXZ3WSxDQUFDLG9CQUFvQixpQkFBaUIsQ0FBQyxXQUFXLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsZ0NBQWdDLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyw4QkFBOEIsQ0FBQyxzQkFBc0IsQ0FBQyw4Q0FBOEMsQ0FBQyxzQ0FBc0MsQ0FBb0YscUJBQXFCLENBQWdELGtCQUFrQixDQUE4QyxzQkFBc0IsQ0FBQyx3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLG9CQUFvQix3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLHVCQUF1QiwrQkFBK0IsQ0FBQyxtREFBbUQsK0JBQStCLENBQUMsbURBQW1ELGdDQUFnQyxDQUFDLG1FQUFtRSxnQ0FBZ0MsQ0FBQyx5REFBeUQsZ0NBQWdDLENBQUMseURBQXlELGVBQWUsQ0FBQyw0RkFBb0ksWUFBWSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsaUhBQWlILGFBQWEsQ0FBQyxpQ0FBNEUsMEJBQTBCLENBQUMsb0NBQTJFLHdCQUF3QixDQUFDLGdCQUFnQixjQUFjLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsc0NBQXNDLENBQUMsOEJBQThCLENBQUMsZ0RBQWdELGVBQWUsQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLGlDQUFpQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQywwQ0FBMEMsQ0FBQyxrQ0FBa0MsQ0FBQyxrQ0FBMEIsQ0FBMUIsMEJBQTBCLENBQUMsMERBQWlELENBQWpELGtEQUFrRCxDQUFDLHdDQUF3QyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQywyQkFBMkIsK0JBQStCLENBQUMsb0NBQW9DLHFDQUFxQyxDQUFDLGtDQUFrQyxrQkFBa0IsQ0FBQyxxQ0FBcUMscUJBQXFCLENBQUMsb0JBQW9CLHNDQUFzQyxDQUFDLCtCQUErQixVQUFVLENBQUMsa0JBQWtCLGFBQWEsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLDhCQUE4QixDQUFDLG1DQUFtQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxnQ0FBZ0MsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLG9DQUFvQyxDQUFDLDRDQUE0QyxzQ0FBc0MsQ0FBQzs7Ozs7Ozs7RUFRL3dHLENBQUMsYUFBYSxjQUFjLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyw2REFBNkQsQ0FBQyxxREFBcUQsQ0FBQyw2Q0FBNkMsQ0FBQyx5RUFBeUUsQ0FBQyx1Q0FBdUMsQ0FBQyxtQkFBbUIsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLDZCQUE2QixDQUE0QixxQkFBcUIsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLG1DQUFtQyxDQUFDLDBCQUEwQixDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxxQkFBcUIsa0JBQWtCLENBQUMsZ0VBQWdFLHNCQUFzQixDQUFDLDRCQUE0QixpQkFBaUIsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsd0NBQXdDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsOENBQThDLGdCQUFnQixDQUFDLG1CQUFtQixvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMseUJBQXlCLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyw0Q0FBNEMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQywwQkFBMEIsQ0FBQyxxQ0FBcUMsa0JBQWtCLENBQUMsOEZBQThGLHFCQUFxQixDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixDQUFDLDRGQUE0RixvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQywwQkFBMEIsQ0FBQywySkFBMkosWUFBWSxDQUFDLDJCQUEyQixvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxxQkFBcUIsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsd0JBQXdCLENBQUMsNEJBQTRCLHNDQUFzQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsbUNBQW1DLFVBQVUsQ0FBeUMsWUFBWSxDQUFDLGlDQUFpQyxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsWUFBWSxDQUFDLGtEQUFrRCxnQkFBZ0IsQ0FBQyx5SkFBeUosZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsc0VBQXNFLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyw0QkFBNEIsa0NBQWtDLENBQUMsZUFBZSxDQUFDLHFDQUFxQyxvQkFBb0IsQ0FBQyx5QkFBeUIsZUFBZSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsb0NBQW9DLENBQUMsb0JBQW9CLENBQUMsK0JBQStCLFlBQVksQ0FBQyw2SEFBNkgsWUFBWSxDQUFDLDJKQUEySixZQUFZLENBQUMsd1JBQXdSLGFBQWEsQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsOEdBQThHLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsNEVBQTRFLFlBQVksQ0FBQyx5Q0FBeUMsZ0JBQWdCLENBQUMsOEhBQThILFNBQVMsQ0FBQyxPQUFPLENBQUMseUJBQXlCLGNBQWMsQ0FBQyx3Q0FBd0MsUUFBUSxDQUFDLDBCQUEwQixjQUFjLENBQUMsdUJBQXVCLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMseUNBQXlDLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1DQUFtQyxDQUFDLDBCQUEwQixDQUFDLDZEQUE2RCxDQUFDLHFEQUFxRCxDQUFDLDZDQUE2QyxDQUFDLHlFQUF5RSxDQUFDLDZEQUE2RCxVQUFVLENBQUMsbUJBQW1CLFdBQVcsQ0FBQyxZQUFZLENBQUMsbUNBQW1DLENBQUMsa0JBQWtCLENBQUMsOEdBQThHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQywrQkFBK0IsV0FBVyxDQUFDLDZCQUE2QixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsZ0NBQWdDLENBQUMsNEJBQTRCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUMsc0JBQXNCLENBQUMsMkNBQTJDLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsdUVBQXVFLFlBQVksQ0FBQyxzQ0FBc0Msa0NBQWtDLENBQUMseUNBQXlDLDZCQUE2Qix3QkFBd0IsQ0FBQyxDQUFDLHlDQUF5Qyw2QkFBNkIseUJBQXlCLENBQUMsQ0FBQyx5Q0FBeUMsNkJBQTZCLHlCQUF5QixDQUFDLENBQUMsMENBQTBDLDZCQUE2Qix5QkFBeUIsQ0FBQyxDQUFDLG1DQUFtQyw0QkFBNEIsQ0FBQyw0Q0FBNEMsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtREFBbUQsWUFBWSxDQUFDLDZCQUE2QiwrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsOEJBQThCLG9CQUFvQixDQUFDLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLG9DQUFvQyxvQkFBb0IsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQyw2QkFBNkIsb0JBQW9CLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLG1DQUFtQyxvQkFBb0IsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQyxtREFBbUQsZUFBZSxDQUFDLG9CQUFvQixDQUFDLG9DQUFvQyxvQkFBb0IsQ0FBQyxpREFBaUQsQ0FBQyx5Q0FBeUMsQ0FBQywwQ0FBMEMsb0JBQW9CLENBQUMsaURBQWlELENBQUMseUNBQXlDLENBQUMsMkZBQTJGLFVBQVUsQ0FBQyxTQUFTLENBQUMsOEJBQThCLHFDQUFxQyxDQUFDLHNDQUFzQyxDQUFDLG9DQUFvQyxvQ0FBb0MsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQywwQ0FBMEMscUJBQXFCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLFlBQVksQ0FBQyxpQ0FBaUMscUNBQXFDLENBQUMscUJBQXFCLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQywrQ0FBK0MsQ0FBQyxlQUFlLENBQUMsaUNBQWlDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQywwQkFBMEIsV0FBVyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsMkNBQTJDLHdCQUF3QixDQUFDLHlDQUF5QyxDQUFDLHlDQUF5Qyx3QkFBd0IsQ0FBQyx5Q0FBeUMsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLGlGQUFpRixXQUFXLENBQUMsbUVBQW1FLG1CQUFtQixDQUFDLG9IQUFvSCxXQUFXLENBQUMsb0RBQW9ELHFDQUFxQyxDQUFDLDBCQUEwQixpQkFBaUIsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsZ0NBQWdDLENBQUMseUNBQXlDLDBCQUEwQix3QkFBd0IsQ0FBQyxDQUFDLHlDQUF5QywwQkFBMEIseUJBQXlCLENBQUMsQ0FBQyx5Q0FBeUMsMEJBQTBCLHlCQUF5QixDQUFDLENBQUMsMENBQTBDLDBCQUEwQix5QkFBeUIsQ0FBQyxDQUFDLHNCQUFzQixpREFBaUQsQ0FBQyw0QkFBNEIsV0FBVyxDQUFDLHVFQUF1RSxXQUFXLENBQUMsNkJBQTZCLHdCQUF3QixDQUF1QixvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsK0JBQStCLENBQUMsK0NBQStDLENBQUMscURBQXFELENBQUMsNkNBQTZDLENBQUMscUNBQXFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLDRDQUE0QyxDQUFDLHdCQUF3QixDQUFDLDBDQUEwQyxpQ0FBaUMsQ0FBQyxtQ0FBbUMsWUFBWSxDQUFDLG1DQUFtQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyw0Q0FBNEMsQ0FBQyx3QkFBd0IsQ0FBQywwQ0FBMEMsWUFBWSxDQUFDLDBDQUEwQyxlQUFlLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyw0Q0FBNEMsQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsbUNBQW1DLGtDQUFrQyxDQUFDLHVCQUF1QixDQUFDLDBCQUEwQixlQUFlLENBQUMsMEJBQTBCLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyxnQ0FBZ0MsY0FBYyxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLCtCQUErQiwwQkFBMEIsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsNEJBQTRCLG9CQUFvQixDQUFDLHNDQUFzQyxvQ0FBb0MsQ0FBQyxtQ0FBbUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsZ0NBQWdDLENBQUMsa0NBQWtDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLG9DQUFvQyxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLDRDQUE0QyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLG1GQUFtRixZQUFZLENBQUMsaUNBQWlDLEtBQUssMkJBQTJCLENBQUMsbUJBQW1CLENBQUMsR0FBRyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLHlCQUF5QixLQUFLLDJCQUEyQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxnRkFBZ0YsMkJBQTJCLENBQUMsd0dBQXdHLDJCQUEyQixDQUFDLDJCQUEyQix1QkFBdUIsQ0FBQyxlQUFlLENBQUMsMkJBQTJCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsMkJBQTJCLGdCQUFnQixDQUFDLG9CQUFvQixDQUFDLGlDQUFpQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyx3REFBd0QsMEJBQTBCLENBQUMscUJBQXFCLENBQUMsNEJBQTRCLGlCQUFpQixDQUFDLDRCQUE0QixzQkFBc0IsQ0FBQyw2RUFBNkUsYUFBYSxDQUFDLDZCQUE2QixrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQyxtQ0FBbUMsb0JBQW9CLENBQUMsd0RBQXdELG9CQUFvQixDQUFDLCtCQUErQixhQUFhLENBQUMsNkNBQTZDLG9CQUFvQixDQUFDLHFDQUFxQyx3QkFBd0IsQ0FBQyxzQ0FBc0Msd0JBQXdCLENBQUMsa0NBQWtDLFVBQVUsQ0FBQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQyx3Q0FBd0MsU0FBUyxDQUFDLHdEQUF3RCxjQUFjLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLG1CQUFtQixNQUFNLENBQUMsOERBQThELG1CQUFtQixDQUFDLG9CQUFvQixDQUFDLG9DQUFvQyxDQUFDLHdCQUF3QixtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyw0REFBNEQsU0FBUyxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxvQ0FBb0MsQ0FBQyxvRkFBb0YsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0ZBQW9GLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGdHQUFnRyxlQUFlLENBQUMsY0FBYyxDQUFDLDBCQUEwQixRQUFRLENBQUMsV0FBVyxDQUFDLDRDQUE0QyxDQUFDLG9DQUFvQyxDQUFDLDJDQUEyQyxDQUFDLDBCQUEwQixrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxtRUFBbUUscURBQXFELENBQUMsZ0VBQWdFLDJDQUEyQyxDQUFDLG9DQUFvQyw4QkFBOEIsQ0FBQywrQkFBK0IsQ0FBQywrQ0FBK0MsQ0FBQyx1Q0FBdUMsQ0FBQyxvQ0FBb0MsNENBQTRDLENBQUMsb0NBQW9DLENBQUMscUNBQXFDLHFEQUFxRCxDQUFDLHNDQUFzQyw0Q0FBNEMsQ0FBQyxvQ0FBb0MsQ0FBQyxxREFBcUQsQ0FBQywyQ0FBMkMsNENBQTRDLENBQUMsb0NBQW9DLENBQUMsaURBQWlELCtDQUErQyxDQUFDLHVDQUF1QyxDQUFDLDBEQUEwRCxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsNkJBQTZCLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMseUJBQXlCLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLENBQUMsdUNBQXVDLENBQUMsMEZBQTBGLGVBQWUsQ0FBQyw4RkFBOEYsZUFBZSxDQUFDLHdGQUF3RixhQUFhLENBQUMsd0NBQXdDLDBEQUEwRCwyQkFBMkIsQ0FBQyxDQUFDLHlDQUF5QywwREFBMEQseUJBQXlCLENBQUMsQ0FBQyx5Q0FBeUMsMERBQTBELHlCQUF5QixDQUFDLENBQUMseUNBQXlDLDBEQUEwRCx5QkFBeUIsQ0FBQyxDQUFDLDBDQUEwQywwREFBMEQseUJBQXlCLENBQUMsQ0FBQyxpRUFBaUUsWUFBWSxDQUFDLDBCQUEwQixpQkFBaUIsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLHFEQUFxRCxxQ0FBcUMsQ0FBQyxzQ0FBc0MsQ0FBQyxpRUFBaUUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsK0ZBQStGLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyx5Q0FBeUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxhQUFhLENBQUMsbUJBQW1CLGFBQWEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGtDQUFrQyxXQUFXLENBQUMsNEJBQTRCLE1BQU0sQ0FBQyxVQUFVLENBQUMsMkZBQTJGLENBQUMsbUZBQW1GLENBQUMsb0NBQW9DLENBQUMsNEJBQTRCLHlCQUF5QixDQUFDLG9DQUFvQyxDQUFDLDRCQUE0QixRQUFRLENBQUMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUMsa0NBQWtDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLGtDQUFrQyxVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLHFDQUFxQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLDJDQUEyQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsc0NBQXNDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsdUZBQXVGLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsaUNBQWlDLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHVDQUF1QyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyw2REFBNkQsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsbUVBQW1FLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxrQ0FBa0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsd0NBQXdDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxtQ0FBbUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyx5Q0FBeUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLHlDQUF5QyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyx3Q0FBd0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyw4Q0FBOEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyx5Q0FBeUMsT0FBTyxDQUFDLFNBQVMsQ0FBQywrQ0FBK0MsU0FBUyxDQUFDLFNBQVMsQ0FBQywwRUFBMEUsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsdUJBQXVCLENBQUMsMEJBQTBCLENBQUMsc0ZBQXNGLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGlEQUFpRCxDQUFDLHlDQUF5QyxDQUFDLGlCQUFpQixDQUFDLGdFQUFnRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxzRUFBc0Usa0JBQWtCLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsbURBQW1ELENBQUMsMkNBQTJDLENBQUMsK0RBQStELGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLHFFQUFxRSxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxtREFBbUQsQ0FBQywyQ0FBMkMsQ0FBQyxXQUFXLG9CQUFvQixDQUFDLG8zREFBbzNELENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLDRCQUE0QixvQkFBb0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsNEJBQTRCLFVBQVUsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLCtDQUErQyxlQUFlLENBQUMsa0dBQWtHLGVBQWUsQ0FBQyx1REFBdUQsZUFBZSxDQUFDLGdDQUFnQyxlQUFlLENBQUM7Ozs7Ozs7O0VBUS81eEIsQ0FBQyxVQUFVLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGtEQUFrRCxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLFlBQVksQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsZ0VBQWdFLENBQUMsZ0JBQWdCLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLHNCQUFzQixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxrRUFBa0UsQ0FBQywwREFBMEQsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsdUJBQXVCLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLG1EQUFtRCxDQUFDLDJDQUEyQyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsd0NBQXdDLENBQUMsa0RBQWtELENBQUMsMENBQTBDLENBQUMsVUFBVSxDQUFDLDRCQUE0QixrRUFBa0UsQ0FBQywwREFBMEQsQ0FBQyxTQUFTLENBQUMsNkJBQTZCLFVBQVUsQ0FBQyxxREFBcUQsWUFBWSxDQUFDLHdCQUF3QixhQUFhLENBQUMsaUJBQWlCLG1CQUFtQixDQUFDLHdCQUF3QixrQkFBa0IsQ0FBQyx5QkFBeUIscUJBQXFCLENBQUMseUJBQXlCLDJCQUEyQixDQUFDOzs7Ozs7OztFQVEvbkQsQ0FBQyxVQUFVLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsK0VBQStFLENBQUMsdUVBQXVFLENBQUMsZ0NBQWdDLENBQUMsd0JBQXdCLENBQXNDLGFBQWEsQ0FBQywwQkFBMEIsQ0FBQyx3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsNkNBQTZDLENBQUMsZ0VBQWdFLG1DQUFtQyxDQUFDLG9DQUFvQyxDQUFDLHNCQUFzQixzQ0FBc0MsQ0FBQyx1Q0FBdUMsQ0FBQyxpQkFBaUIsY0FBYyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsU0FBUyxDQUFDLGtCQUFrQixhQUFhLENBQUMsNERBQTRELENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsMENBQTBDLENBQUMsMkJBQTJCLHVCQUF1QixDQUFDLHdCQUF3QixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMseUJBQWlFLFlBQVksQ0FBbUYsa0JBQWtCLENBQUMsMEJBQTBCLGFBQWEsQ0FBc0MsYUFBYSxDQUFDLFFBQVEsQ0FBeUIsY0FBYyxDQUFDLGlDQUF5RCxjQUFjLENBQUMsb0NBQStELGlCQUFpQixDQUFDLDZCQUF5RCxrQkFBa0IsQ0FBQyxnQ0FBZ0MsYUFBYSxDQUFzQyxhQUFhLENBQUMsV0FBVyxDQUF5QixjQUFjLENBQUMsNkVBQWtILGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGlDQUFpQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLG1CQUFtQixrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyx1Q0FBdUMsQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsaUJBQWlCLENBQUMseUNBQXlDLFVBQVUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlDQUF5QyxVQUFVLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyx5Q0FBeUMsVUFBVSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsMENBQTBDLFVBQVUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBDQUEwQyxVQUFVLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyx5Q0FBeUMsa0JBQWtCLHFCQUFxQixDQUFDLGlCQUFpQixhQUFhLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLENBQUMseUNBQXlDLGtCQUFrQiw2QkFBNkIsQ0FBQywrQkFBK0IsQ0FBQyxtQkFBbUIsYUFBYSxDQUFDLHNCQUFzQixDQUFDLGlCQUFpQixtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyx5QkFBNEcscUJBQXFCLENBQUMsMEJBQTBCLGFBQWEsQ0FBQyxjQUFjLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsMEJBQTBCLENBQUMsaUNBQWlDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxnQ0FBZ0MsYUFBYSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsNkJBQTZCLENBQUMsdURBQXVELGtCQUFrQixDQUFDLENBQUMsOEJBQThCLGtEQUFrRCxDQUFDLDBDQUEwQyxDQUFDLGdCQUFnQiw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLFVBQVUsQ0FBQywwRUFBMEUsNEJBQTRCLENBQUMsd0JBQXdCLFVBQVUsQ0FBQyx1QkFBdUIsUUFBUSxDQUFDLFlBQVksQ0FBQyxpQ0FBaUMscUJBQXFCLENBQUMsNENBQTRDLHFCQUFxQixDQUFDLGtEQUFrRCxPQUFPLENBQUMsUUFBUSxDQUFDLDJLQUEySyxRQUFRLENBQUMseUNBQXlDLHVCQUF1QixVQUFVLENBQUMsQ0FBQyxrQkFBa0IsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsYUFBYSxDQUFDLDRDQUE0QyxlQUFlLENBQUMseUNBQXlDLDRDQUE0QyxnQkFBZ0IsQ0FBQyxDQUFDLDRDQUE0QyxlQUFlLENBQUMseUNBQXlDLDRDQUE0QyxnQkFBZ0IsQ0FBQyxDQUFDLDJCQUEyQixlQUFlLENBQUMsNEJBQXVFLDBCQUEwQixDQUFDLG1DQUFtQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsNEJBQTRCLGNBQWMsQ0FBQyxtQ0FBbUMsZ0JBQWdCLENBQUMsc0NBQXNDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyw4Q0FBOEMsZUFBZSxDQUFDLG1EQUFtRCxpQkFBaUIsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsNkJBQTZCLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLCtCQUErQixnQkFBZ0IsQ0FBQyw2QkFBNkIscUJBQXFCLENBQUMsNEJBQTRCLGFBQWEsQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsVUFBVSxjQUFjLENBQUMsZ0NBQWdDLGVBQWUsQ0FBQyx5Q0FBeUMsZUFBZSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMseUNBQXlDLGVBQWUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlDQUF5QyxlQUFlLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQywwQ0FBMEMsZUFBZSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsMENBQTBDLGVBQWUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLGlDQUFpQyxlQUFlLENBQUMseUNBQXlDLGVBQWUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlDQUF5QyxlQUFlLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyx5Q0FBeUMsZUFBZSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsMENBQTBDLGVBQWUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBDQUEwQyxlQUFlLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxpQ0FBaUMsZUFBZSxDQUFDLHlDQUF5QyxnQkFBZ0IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlDQUF5QyxnQkFBZ0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHlDQUF5QyxnQkFBZ0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBDQUEwQyxnQkFBZ0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLDBDQUEwQyxnQkFBZ0IsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLHdCQUF3QixlQUFlLENBQUMseUNBQXlDLGdCQUFnQixTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMseUNBQXlDLGdCQUFnQixTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMseUNBQXlDLGdCQUFnQixZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsMENBQTBDLGdCQUFnQixZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsMENBQTBDLGdCQUFnQixZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7Ozs7O0VBUS9wUCxDQUFDLFFBQVEsWUFBWSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsNkNBQTZDLENBQUMscUNBQXFDLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLDJDQUEyQyxDQUFDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLFNBQVMsY0FBYyxDQUFDLGVBQWUsb0JBQW9CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsY0FBYyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsY0FBYyxlQUFlLENBQUMsU0FBUyxDQUFDLHFCQUFxQixTQUFTLENBQUMsZ0JBQWdCLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxjQUFjLGNBQWMsQ0FBQywrQkFBK0IsMkNBQTJDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0Msd0JBQXdCLENBQUMscUJBQXFCLENBQUMsNEdBQTRHLG9CQUFvQixDQUFDLGNBQWMseUJBQXlCLENBQUMseUJBQXlCLDJDQUEyQyxDQUFDLGdDQUFnQywyQ0FBMkMsQ0FBQzs7Ozs7Ozs7RUFRaHlDLENBQUMsVUFBVSxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBNEIscUJBQXFCLENBQUMsWUFBWSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixDQUFDLGlGQUFpRixDQUFDLHlFQUF5RSxDQUFDLGtCQUFrQixTQUFTLENBQUMsNERBQTRELENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQywyQkFBMkIsZ0JBQWdCLENBQUMsaUJBQWlCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLGVBQWUsaUJBQWlCLENBQUMsc0JBQXNCLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLCtCQUErQixDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQyxxQkFBcUIsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsQ0FBQyxpRkFBaUYsQ0FBQyx5RUFBeUUsQ0FBQyxTQUFTLENBQUMsMkNBQTJDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsMEJBQTBCLENBQUMsMENBQTBDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsMkNBQTJDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLHNCQUFzQixTQUFTLENBQUMsa0RBQWtELENBQUMsMENBQTBDLENBQUMsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQywrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyx1REFBdUQsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsNEJBQTRCLGtEQUFrRCxDQUFDLDBDQUEwQyxDQUFDLFNBQVMsQ0FBQywwSEFBMEgscURBQXFELENBQUMsNkNBQTZDLENBQUMscUZBQXFGLHFEQUFxRCxDQUFDLDZDQUE2QyxDQUFDLHFHQUFxRyxxREFBcUQsQ0FBQyw2Q0FBNkMsQ0FBQyxpSEFBaUgscURBQXFELENBQUMsNkNBQTZDLENBQUMsb01BQW9NLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLDROQUE0TixvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxxQ0FBcUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMscUNBQXFDLGtCQUFrQixDQUFDLG9DQUFvQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyw0Q0FBNEMscUJBQXFCLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsa0JBQWtCLENBQUMsa0RBQWtELFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsMEJBQTBCLENBQUMsK0NBQStDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxnREFBZ0QsUUFBUSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLDBCQUEwQixDQUFDLGdEQUFnRCxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsaURBQWlELFFBQVEsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQywwQkFBMEIsQ0FBQyxvREFBb0QsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxxREFBcUQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLGtEQUFrRCxNQUFNLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxtREFBbUQsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLG1EQUFtRCxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxvREFBb0QsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDLGtEQUFrRCxVQUFVLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLG1EQUFtRCxVQUFVLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLG1EQUFtRCxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLG9EQUFvRCxTQUFTLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLHdCQUF3QixDQUFDLDZDQUE2QyxlQUFlLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsbURBQW1ELGVBQWUsQ0FBQyx1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQyxvREFBb0QsZUFBZSxDQUFDLHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLDBDQUEwQyxlQUFlLENBQUMsNERBQTRELGtCQUFrQixDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLGtFQUFrRSxrQkFBa0IsQ0FBQyx1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQyxtRUFBbUUsa0JBQWtCLENBQUMsdUNBQXVDLENBQUMsK0JBQStCLENBQUMseURBQXlELGtCQUFrQixDQUFDLDZDQUE2QyxzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQyw0Q0FBNEMsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsbURBQW1ELG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLGtEQUFrRCxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyxvREFBb0QscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsbURBQW1ELG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLFVBQVUsUUFBUSxDQUFDLGNBQWMsc0JBQXNCLENBQUMsbUJBQW1CLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLHFCQUFxQixzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQyxvQkFBb0IscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsc0JBQXNCLHdCQUF3QixDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLHVCQUF1Qix3QkFBd0IsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsc0JBQXNCLENBQUMsc0JBQXNCLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLHdCQUF3QixtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQyx1QkFBdUIsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsK0JBQStCLHdCQUF3QixDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLHNCQUFzQixhQUFhLENBQUMsNkJBQTZCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyx1QkFBdUIsY0FBYyxDQUFDLDhCQUE4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsNEJBQTRCLFFBQVEsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLG1CQUFtQixhQUFhLENBQUMsMEJBQTBCLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsY0FBYyxDQUFDLDJCQUEyQixtQkFBbUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsNkJBQTZCLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLDhCQUE4QixPQUFPLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyx1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQyx3QkFBd0IsZUFBZSxDQUFDLDJEQUEyRCxlQUFlLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxpQ0FBaUMsa0JBQWtCLENBQUMsNkVBQTZFLGtCQUFrQixDQUFDLDhCQUE4QixrQkFBa0IsQ0FBQyxnQ0FBZ0MsMEJBQTBCLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsc0NBQXNDLGFBQWEsQ0FBQyxrQkFBa0IsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLFlBQVksQ0FBQyxlQUFlLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLHlDQUF5Qyw2Q0FBNkMsZUFBZSxDQUFDLENBQUMsZ0JBQWdCLFVBQVUsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLDJCQUEyQixxQkFBcUIsQ0FBQyxVQUFVLENBQUMsMEJBQTBCLHdCQUF3QixDQUFDLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLGtCQUFrQixjQUFjLENBQUMsZUFBZSxzQkFBc0IsQ0FBQyxlQUFlLHNCQUFzQixDQUFDLGdCQUFnQixzQkFBc0IsQ0FBQyxVQUFVLGNBQWMsQ0FBQyxnQkFBZ0IsdUJBQXVCLENBQUMsZUFBZSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7RUFRbmxYLENBQUMsYUFBYSxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLDBCQUEwQixDQUFDLHlCQUF5QixnQkFBZ0IsQ0FBQyx3QkFBd0IsZ0JBQWdCLENBQUMsa0JBQWtCLGFBQWEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsMkRBQTJELENBQUMsbURBQW1ELENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxnR0FBZ0csd0JBQXdCLENBQUMsZ0RBQWdELHdCQUF3QixDQUFDLGdHQUFnRyx3QkFBd0IsQ0FBQyxnREFBZ0Qsd0JBQXdCLENBQUMsZ0dBQWdHLHdCQUF3QixDQUFDLGtHQUFrRyx3QkFBd0IsQ0FBQyxvR0FBb0cscUJBQXFCLENBQUMsa0RBQWtELHFCQUFxQixDQUFDLG9HQUFvRyxxQkFBcUIsQ0FBQyxrREFBa0QscUJBQXFCLENBQUMsb0dBQW9HLHFCQUFxQixDQUFDLHNHQUFzRyxxQkFBcUIsQ0FBQyx1YUFBdWEsd0JBQXdCLENBQUMseWJBQXliLHFCQUFxQixDQUFDLHVDQUF1QyxhQUFhLENBQUMsMEJBQTBCLGtDQUFrQyxDQUFDLDJEQUEyRCxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyw0QkFBNEIsYUFBYSxDQUFDLDBCQUEwQixrQ0FBa0MsQ0FBQywyREFBMkQsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsNEJBQTRCLGFBQWEsQ0FBQyx3QkFBd0Isa0NBQWtDLENBQUMsdURBQXVELGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixhQUFhLENBQUMseUJBQXlCLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsVUFBVSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLGtEQUFrRCxDQUFDLDBDQUEwQyxDQUFDLG1DQUFtQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsMkJBQTJCLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxzQkFBc0IsV0FBVyxDQUFDLDZEQUE2RCxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxzQkFBc0IsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLDJCQUEyQixlQUFlLENBQUMscUNBQXFDLGFBQWEsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLHFDQUFxQyxhQUFhLENBQUMscUNBQXFDLGFBQWEsQ0FBQyxtQ0FBbUMsYUFBYSxDQUFDLHNCQUFzQixjQUFjLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxpREFBaUQsYUFBYSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLDJDQUEyQyxDQUFDLDJCQUEyQixlQUFlLENBQUMseURBQXlELEtBQUssQ0FBQywyQ0FBMkMsQ0FBQywrQkFBK0IsZUFBZSxDQUFDLGlFQUFpRSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsK0VBQStFLFFBQVEsQ0FBQyxXQUFXLENBQUMsc0JBQXNCLHdCQUF3QixDQUFDLCtCQUErQix3QkFBd0IsQ0FBQyx5QkFBeUIsd0JBQXdCLENBQUMsa0NBQWtDLHdCQUF3QixDQUFDLHlCQUF5Qix3QkFBd0IsQ0FBQyxrQ0FBa0Msd0JBQXdCLENBQUMsd0JBQXdCLHdCQUF3QixDQUFDLGlDQUFpQyx3QkFBd0IsQ0FBQyx3QkFBd0Isd0JBQXdCLENBQUMsaUNBQWlDLHdCQUF3QixDQUFDLHVCQUF1Qix3QkFBd0IsQ0FBQyxnQ0FBZ0Msd0JBQXdCLENBQUMsdUJBQXVCLHdCQUF3QixDQUFDLGdDQUFnQyx3QkFBd0IsQ0FBQyx5QkFBeUIsd0JBQXdCLENBQUMsa0NBQWtDLHdCQUF3QixDQUFDLHlCQUF5Qix3QkFBd0IsQ0FBQyxrQ0FBa0Msd0JBQXdCLENBQUMsdUJBQXVCLHdCQUF3QixDQUFDLGdDQUFnQyx3QkFBd0IsQ0FBQyx3QkFBd0Isd0JBQXdCLENBQUMsaUNBQWlDLHdCQUF3QixDQUFDLHVCQUF1Qix3QkFBd0IsQ0FBQyxnQ0FBZ0Msd0JBQXdCLENBQUMsd0JBQXdCLHdCQUF3QixDQUFDLGlDQUFpQyx3QkFBd0IsQ0FBQyxrQkFBa0Isc0JBQXNCLENBQUMsdUJBQXVCLFdBQVcsQ0FBQyxtQkFBbUIsc0JBQXNCLENBQUMsd0JBQXdCLFVBQVUsQ0FBQyxhQUFhLGNBQWMsQ0FBQyxrQkFBa0IsYUFBYSxDQUFDLG1CQUFtQix1QkFBdUIsQ0FBQyx3QkFBd0IsWUFBWSxDQUFDLGlCQUFpQix1QkFBdUIsQ0FBQyxzQkFBc0IsWUFBWSxDQUFDOzs7Ozs7OztFQVExa08sQ0FBQyxXQUFpRSxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLGlCQUFpQixTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBc0MsYUFBYSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLDJGQUEyRixDQUFDLG1GQUFtRixDQUFDLGlCQUFpQixjQUFjLENBQUMscUJBQXFCLENBQUMsd0JBQXdCLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQywyREFBMkQsY0FBYyxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsd0JBQXdCLENBQUMsdUJBQXVCLENBQUMsdUZBQXVGLENBQUMscUVBQXFFLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLHVGQUF1RixDQUFDLHVCQUF1QixXQUFXLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsQ0FBQyw4QkFBOEIsd0JBQXdCLENBQUMsdUJBQXVCLENBQUMsdUZBQXVGLENBQUMsdUVBQXVFLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLHVGQUF1RixDQUFDLDBCQUEwQixjQUFjLENBQUMsaUNBQWlDLFNBQVMsQ0FBQyw2REFBNkQsU0FBUyxDQUFDLGdCQUFnQixzQkFBc0IsQ0FBQyxnQkFBZ0Isc0JBQXNCLENBQUMsaUJBQWlCLHNCQUFzQixDQUFDLFdBQVcsY0FBYyxDQUFDLGlCQUFpQix1QkFBdUIsQ0FBQyxnQkFBZ0IsdUJBQXVCLENBQUMsbUJBQW1CLGNBQWMsQ0FBQyxXQUFXLGtCQUFrQixDQUFDLGtwZUFBa3BlLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixrQkFBa0IsQ0FBQyxhQUFhLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixlQUFlLENBQUMsK0JBQStCLGVBQWUsQ0FBQyw2QkFBNkIsZUFBZSxDQUFDLG9DQUFvQyxlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQyw4QkFBOEIsZUFBZSxDQUFDLDhCQUE4QixlQUFlLENBQUMscUNBQXFDLGVBQWUsQ0FBQzs7Ozs7Ozs7RUFRM3lqQixDQUFDLFdBQVcsaUJBQWlCLENBQUMsbUJBQW1CLFFBQVEsQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsK0NBQStDLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLHdCQUF3QixDQUFDLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsbUNBQW1DLENBQUMscUJBQXFCLENBQUMsNENBQTRDLENBQUMsb0NBQW9DLENBQUMsNkdBQTZHLENBQUMscUdBQXFHLENBQUMsNkZBQTZGLENBQUMseUhBQXlILENBQUMsbUJBQW1CLG9CQUFvQixDQUFDLGdDQUFnQyxjQUFjLENBQUMsb0JBQW9CLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxpRkFBaUYsQ0FBQyx5RUFBeUUsQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsaUNBQWlDLDJDQUEyQyxDQUFDLGdDQUFnQywyQ0FBMkMsQ0FBQyw0QkFBNEIsY0FBYyxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLGdDQUFnQyxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLHlDQUF5QyxDQUFDLHVDQUF1Qyw0QkFBNEIsQ0FBQyxtQ0FBbUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyx1Q0FBdUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsNENBQTRDLGdCQUFnQixDQUFDLG1DQUFtQyx1QkFBdUIsQ0FBQyw0REFBNEQsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLHlDQUF5QyxZQUFZLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsbUNBQW1DLFdBQVcsQ0FBQyxhQUFhLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyxxQ0FBcUMsNERBQTRELENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQywwQ0FBMEMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLDRCQUE0QixhQUFhLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyx5QkFBeUIsK0JBQStCLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHdDQUF3QyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxnQ0FBZ0MsQ0FBQyx1Q0FBdUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsMENBQTBDLENBQUMsa0NBQWtDLENBQUMsb0JBQW9CLENBQUMsNENBQTRDLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsdUZBQXVGLGtCQUFrQixDQUFDLHlCQUF5QixrQkFBa0IsQ0FBQyw4Q0FBOEMsa0JBQWtCLENBQUMsb0RBQW9ELHFCQUFxQixDQUFDLHlGQUF5RixpQkFBaUIsQ0FBQyxtQ0FBbUMsQ0FBQyxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsMENBQTBDLHFCQUFxQixDQUFDLGdEQUFnRCxxQkFBcUIsQ0FBQyxvQkFBb0IsY0FBYyxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyw2QkFBNkIsMEJBQTBCLENBQUMsOENBQThDLG1CQUFtQixDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0RBQWtELENBQUMsMENBQTBDLENBQUMscURBQXFELGNBQWMsQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsOEVBQThFLGVBQWUsQ0FBQyxvREFBb0QsU0FBUyxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsVUFBVSxDQUFDLDRFQUE0RSxhQUFhLENBQUMsdUNBQXVDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLGVBQWUsQ0FBQyw0REFBNEQsQ0FBQyxvREFBb0QsQ0FBQyxrREFBa0Qsa0JBQWtCLENBQUMsaUVBQWlFLGdDQUFnQyxDQUFDLHFFQUFxRSxnQ0FBZ0MsQ0FBQyw2Q0FBNkMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyw0REFBNEQsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLHlDQUF5QyxDQUFDLGdEQUFnRCxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsd0NBQXdDLENBQUMseUNBQXlDLENBQUMsK0NBQStDLHlDQUF5QyxDQUFDLDREQUE0RCxDQUFDLG9EQUFvRCxDQUFDLGdDQUFnQyxDQUFDLDJDQUEyQyxVQUFVLENBQUMsTUFBTSxDQUFDLDRDQUE0QyxPQUFPLENBQUMsU0FBUyxDQUFDLDBCQUEwQixVQUFVLENBQUMsZ0JBQWdCLHFCQUFxQixDQUFDLGlCQUFpQixxQkFBcUIsQ0FBQyxXQUFXLGFBQWEsQ0FBQyxpQkFBaUIsc0JBQXNCLENBQUMsZUFBZSxzQkFBc0IsQ0FBQyxnQkFBZ0Isc0JBQXNCLENBQUMsbUJBQW1CLHNCQUFzQixDQUFDLHlDQUF5QyxvQkFBb0IsNEJBQTRCLENBQUMsQ0FBQzs7Ozs7Ozs7RUFRN2pOLENBQUMsVUFBVSxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxzSEFBc0gsQ0FBQyw4R0FBOEcsQ0FBQyxzR0FBc0csQ0FBQyx3SUFBd0ksQ0FBQyxpQkFBaUIsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsZ0JBQWdCLFNBQVMsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsZ0JBQWdCLFlBQVksQ0FBQyxrQkFBa0IsNkNBQTZDLENBQUMscUNBQXFDLENBQUMscUJBQXFCLGNBQWMsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLHFCQUFxQixDQUFDLHlDQUF5QyxDQUFDLGlDQUFpQyxDQUFDLDhCQUE4QixVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBdUIsb0JBQW9CLENBQUMsZ0JBQWdCLENBQUMsa0NBQWtDLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsZUFBZSxDQUFDLHFCQUFxQixrQkFBa0IsQ0FBQyx1QkFBdUIsa0JBQWtCLENBQUMsa0JBQWtCLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsMEJBQTBCLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsVUFBVSxDQUFDLDJCQUEyQixpQkFBaUIsQ0FBQywyQkFBMkIsc0hBQXNILENBQUMsOEdBQThHLENBQUMsc0dBQXNHLENBQUMsd0lBQXdJLENBQUMsMEJBQTBCLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLHVCQUF1QixhQUFhLENBQUM7Ozs7Ozs7O0VBUTV5RSxDQUFDLFlBQVksY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLGlCQUFpQixDQUFDLGdDQUFnQyxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsQ0FBQyxrQkFBa0IsQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLENBQUMsY0FBYyxrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyxpQkFBaUIsVUFBVSxDQUFDLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyxrQkFBa0IsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsdUNBQXVDLENBQUMsK0JBQStCLENBQUMsbUNBQW1DLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixlQUFlLENBQUMscUJBQXFCLENBQUMsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsbUJBQW1CLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLFVBQVUsV0FBVyxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGNBQWMsNEJBQTRCLENBQUMsb0JBQW9CLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLDZGQUE2RixpQkFBaUIsQ0FBQyxpQkFBaUIsY0FBYyxDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLDZCQUE2QixDQUE3Qix5REFBNkIsQ0FBQyx3REFBd0QsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLGlCQUFpQixDQUFDLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsNkNBQTZDLENBQUMscUNBQXFDLENBQUMsNkJBQTZCLENBQTdCLHlEQUE2QixDQUFDLHdEQUF3RCxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsZUFBZSxDQUFDLGtCQUFrQixrQkFBa0IsQ0FBQyx3QkFBd0IsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLCtCQUErQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLHVCQUF1Qix5QkFBeUIsQ0FBQywrQkFBK0Isb0JBQW9CLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLGtCQUFrQixDQUFDLG9CQUFvQixrQkFBa0IsQ0FBQyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxtREFBbUQsOENBQThDLENBQUMsc0NBQXNDLENBQUMsbURBQW1ELDhDQUE4QyxDQUFDLHNDQUFzQyxDQUFDLGlFQUFpRSx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyxtRUFBbUUseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsK0RBQStELHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLHFFQUFxRSx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQywwT0FBME8sb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsNkNBQTZDLFdBQVcsQ0FBQywyRUFBMkUsVUFBVSxDQUFDLG1DQUFtQyxXQUFXLENBQUMsNkNBQTZDLFdBQVcsQ0FBQywyRUFBMkUsV0FBVyxDQUFDLDJFQUEyRSx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyx5R0FBeUcsdUNBQXVDLENBQUMsK0JBQStCLENBQUMsMkVBQTJFLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLHlHQUF5Ryx3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyw2RUFBNkUseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsMkdBQTJHLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLDZFQUE2RSx5Q0FBeUMsQ0FBQyxpQ0FBaUMsQ0FBQywyR0FBMkcseUNBQXlDLENBQUMsaUNBQWlDLENBQUMsb0JBQW9CLFdBQVcsQ0FBQyx5QkFBeUIsd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsMEJBQTBCLHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLHdCQUF3Qix3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQywyQkFBMkIsdUNBQXVDLENBQUMsK0JBQStCLENBQUMsMERBQTBELDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLDZCQUE2QixDQUE3Qix5REFBNkIsQ0FBQyx3REFBd0QsQ0FBQyxpQ0FBaUMsb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsa0NBQWtDLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLGdDQUFnQyxvQ0FBb0MsQ0FBQyw0QkFBNEIsQ0FBQyxtQ0FBbUMsb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsdUVBQXVFLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQiw2Q0FBNkMsQ0FBQyxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBN0IseURBQTZCLENBQUMsd0RBQXdELENBQUMsV0FBVyxDQUFDLHNCQUFzQix3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyx1QkFBdUIsdUNBQXVDLENBQUMsK0JBQStCLENBQUMscUJBQXFCLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLHdCQUF3Qix1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQyx5QkFBeUIsb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsb0JBQW9CLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsNkNBQTZDLENBQUMscUNBQXFDLENBQUMsNkJBQTZCLENBQTdCLHlEQUE2QixDQUFDLHdEQUF3RCxDQUFDLHdCQUF3QixTQUFTLENBQUMsNkJBQTZCLHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLDhCQUE4QixzQ0FBc0MsQ0FBQyw4QkFBOEIsQ0FBQyw0QkFBNEIsdUNBQXVDLENBQUMsK0JBQStCLENBQUMsK0JBQStCLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLGtDQUFrQyw2Q0FBNkMsQ0FBQyxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBN0IseURBQTZCLENBQUMsd0RBQXdELENBQUMsZ0NBQWdDLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLHNCQUFzQixTQUFTLENBQUMsMkJBQTJCLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLDRCQUE0Qix1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQywwQkFBMEIsc0NBQXNDLENBQUMsOEJBQThCLENBQUMsNkJBQTZCLHVDQUF1QyxDQUFDLCtCQUErQixDQUFDLGdDQUFnQyw2Q0FBNkMsQ0FBQyxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBN0IseURBQTZCLENBQUMsd0RBQXdELENBQUMsOEJBQThCLG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLHVCQUF1Qiw2Q0FBNkMsQ0FBQyxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBN0IseURBQTZCLENBQUMsd0RBQXdELENBQUMsV0FBVyxDQUFDLDRCQUE0Qix3Q0FBd0MsQ0FBQyxnQ0FBZ0MsQ0FBQyw2QkFBNkIsdUNBQXVDLENBQUMsK0JBQStCLENBQUMsMkJBQTJCLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLDhCQUE4Qix1Q0FBdUMsQ0FBQywrQkFBK0IsQ0FBQyxvQ0FBb0MsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMscUNBQXFDLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLG1DQUFtQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxzQ0FBc0MsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsNkNBQTZDLDZDQUE2QyxDQUFDLHFDQUFxQyxDQUFDLDZCQUE2QixDQUE3Qix5REFBNkIsQ0FBQyx3REFBd0QsQ0FBQyxnRkFBZ0YsdUJBQXVCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQywrQkFBK0Isb0NBQW9DLENBQUMsNEJBQTRCLENBQUMsdUNBQXVDLDRCQUE0QixDQUFDLG9CQUFvQixDQUFDOzs7Ozs7OztFQVF2elUsQ0FBQyxXQUFXLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLGlCQUFpQixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLGlCQUFpQixjQUFjLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQywwQ0FBMEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxnREFBZ0QsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBMEMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDOzs7Ozs7OztFQVFqYixDQUFDLFFBQVEsWUFBWSxDQUFDLDRCQUE0QixhQUFhLENBQUMsZ0JBQWdCLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLDJCQUEyQixDQUFDLHVCQUF1QixDQUFDLHNEQUFzRCxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGdDQUFnQyxDQUFDLG9EQUFvRCxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLG9CQUFvQixDQUFDLDRDQUE0QyxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDOzs7Ozs7OztFQVF4NEIsQ0FBQyxZQUFZLG1DQUFtQyxDQUFDLDJCQUEyQixDQUFDLDhCQUE4QixDQUFDLHNCQUFzQixDQUFDLHNDQUFzQyxDQUFDLDhCQUE4QixDQUFDLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLHNCQUFzQixrQ0FBa0MsQ0FBQywwQkFBMEIsQ0FBQyw0QkFBNEIsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsWUFBWSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQix1QkFBdUIsQ0FBQyw0QkFBNEIsQ0FBQyxxQkFBcUIsbUNBQW1DLENBQUMsMkJBQTJCLENBQUMsb0JBQW9CLDBDQUEwQyxDQUFDLGtDQUFrQyxDQUFDLG1CQUFtQiw4QkFBOEIsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsbURBQW1ELG9DQUFvQyxDQUFDLDRCQUE0QixDQUFDLDZCQUE2QixxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyw0QkFBNEIsR0FBRyx5Q0FBeUMsQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsSUFBSSx5Q0FBeUMsQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksMkNBQTJDLENBQUMsbUNBQW1DLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxLQUFLLHdDQUF3QyxDQUFDLGdDQUFnQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLG9CQUFvQixHQUFHLHlDQUF5QyxDQUFDLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLHlDQUF5QyxDQUFDLGlDQUFpQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSwyQ0FBMkMsQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEtBQUssd0NBQXdDLENBQUMsZ0NBQWdDLENBQUMsV0FBVyxDQUFDLENBQUMsaUNBQWlDLEdBQUcsV0FBVyxDQUFDLHFEQUFxRCxDQUFDLDZDQUE2QyxDQUFDLElBQUksVUFBVSxDQUFDLG1GQUFtRixDQUFDLDJFQUEyRSxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssVUFBVSxDQUFDLHVFQUF1RSxDQUFDLCtEQUErRCxDQUFDLFNBQVMsQ0FBQyxDQUFDLHlCQUF5QixHQUFHLFdBQVcsQ0FBQyxxREFBcUQsQ0FBQyw2Q0FBNkMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxtRkFBbUYsQ0FBQywyRUFBMkUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyx1RUFBdUUsQ0FBQywrREFBK0QsQ0FBQyxTQUFTLENBQUMsQ0FBQyxrQ0FBa0MsR0FBRyxXQUFXLENBQUMscURBQXFELENBQUMsNkNBQTZDLENBQUMsSUFBSSxTQUFTLENBQUMsa0ZBQWtGLENBQUMsMEVBQTBFLENBQUMsSUFBSSxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUMsdUVBQXVFLENBQUMsK0RBQStELENBQUMsU0FBUyxDQUFDLENBQUMsMEJBQTBCLEdBQUcsV0FBVyxDQUFDLHFEQUFxRCxDQUFDLDZDQUE2QyxDQUFDLElBQUksU0FBUyxDQUFDLGtGQUFrRixDQUFDLDBFQUEwRSxDQUFDLElBQUksU0FBUyxDQUFDLEtBQUssU0FBUyxDQUFDLHVFQUF1RSxDQUFDLCtEQUErRCxDQUFDLFNBQVMsQ0FBQyxDQUFDLGlCQUFpQixtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQyw4QkFBOEIsQ0FBQyxzQkFBc0IsQ0FBQyw2REFBNkQsQ0FBQyxxREFBcUQsQ0FBQyxvQkFBb0IsNkJBQTZCLENBQUMscUJBQXFCLENBQUMscUJBQXFCLDhCQUE4QixDQUFDLHNCQUFzQixDQUFDLDBCQUEwQixHQUFHLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLG9CQUFvQiw2QkFBNkIsQ0FBQyxxQkFBcUIsQ0FBQyxpQ0FBaUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsbUNBQW1DLGlDQUFpQyxDQUFDLHlCQUF5QixDQUFDLG1DQUFtQyxpQ0FBaUMsQ0FBQyx5QkFBeUIsQ0FBQyxvQ0FBb0Msa0NBQWtDLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLDhCQUE4QixDQUFDLHNCQUFzQixDQUFDLGtDQUFrQyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxvQ0FBb0Msa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsb0NBQW9DLGtDQUFrQyxDQUFDLDBCQUEwQixDQUFDLHFDQUFxQyxtQ0FBbUMsQ0FBQywyQkFBMkIsQ0FBQywwQkFBMEIsR0FBRyxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyw0QkFBNEIsR0FBRyxTQUFTLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyw4QkFBOEIsR0FBRyxTQUFTLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQywrQkFBK0IsR0FBRyxTQUFTLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUMsa0NBQWtDLENBQUMsMEJBQTBCLENBQUMsS0FBSyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsQ0FBQywyQkFBMkIsR0FBRyxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyw2QkFBNkIsR0FBRyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsS0FBSyxTQUFTLENBQUMsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsS0FBSyxTQUFTLENBQUMsZ0NBQWdDLENBQUMsd0JBQXdCLENBQUMsQ0FBQywrQkFBK0IsR0FBRyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsS0FBSyxTQUFTLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENBQUMsQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsS0FBSyxTQUFTLENBQUMsaUNBQWlDLENBQUMseUJBQXlCLENB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R0FBRyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLHFDQUFxQyxDQUFDLDZCQUE2QixDQUFDLElBQUkscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLHFDQUFxQyxDQUFDLDZCQUE2QixDQUFDLElBQUkscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsS0FBSyxnQ0FBZ0MsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLGtCQUFrQixHQUFHLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLElBQUkscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLHFDQUFxQyxDQUFDLDZCQUE2QixDQUFDLElBQUkscUNBQXFDLENBQUMsNkJBQTZCLENBQUMsSUFBSSxxQ0FBcUMsQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLGdDQUFnQyxDQUFDLHdCQUF3QixDQUFDLENBQUMsd0JBQXdCLEdBQUcsd0JBQXdCLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLHdCQUF3QixDQUFDLENBQUMsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLHdCQUF3QixDQUFDXCIsXCJzb3VyY2VzQ29udGVudFwiOltcIiAvKlxcbiAqICMgU2VtYW50aWMgVUkgLSAyLjQuMFxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUlcXG4gKiBodHRwOi8vd3d3LnNlbWFudGljLXVpLmNvbS9cXG4gKlxcbiAqIENvcHlyaWdodCAyMDE0IENvbnRyaWJ1dG9yc1xcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqL1xcbkBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1MYXRvOjQwMCw3MDAsNDAwaXRhbGljLDcwMGl0YWxpYyZzdWJzZXQ9bGF0aW4pOy8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBSZXNldFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovKiw6YWZ0ZXIsOmJlZm9yZXstd2Via2l0LWJveC1zaXppbmc6aW5oZXJpdDtib3gtc2l6aW5nOmluaGVyaXR9aHRtbHstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3h9aW5wdXRbdHlwZT1lbWFpbF0saW5wdXRbdHlwZT1wYXNzd29yZF0saW5wdXRbdHlwZT1zZWFyY2hdLGlucHV0W3R5cGU9dGV4dF17LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LyohIG5vcm1hbGl6ZS5jc3MgdjcuMC4wIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL2h0bWx7bGluZS1oZWlnaHQ6MS4xNTstbXMtdGV4dC1zaXplLWFkanVzdDoxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlfWJvZHl7bWFyZ2luOjB9YXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLG5hdixzZWN0aW9ue2Rpc3BsYXk6YmxvY2t9aDF7Zm9udC1zaXplOjJlbTttYXJnaW46LjY3ZW0gMH1maWdjYXB0aW9uLGZpZ3VyZSxtYWlue2Rpc3BsYXk6YmxvY2t9ZmlndXJle21hcmdpbjoxZW0gNDBweH1ocnstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtoZWlnaHQ6MDtvdmVyZmxvdzp2aXNpYmxlfXByZXtmb250LWZhbWlseTptb25vc3BhY2UsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxZW19YXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXA6b2JqZWN0c31hYmJyW3RpdGxlXXtib3JkZXItYm90dG9tOm5vbmU7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTstd2Via2l0LXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmUgZG90dGVkfWIsc3Ryb25ne2ZvbnQtd2VpZ2h0OmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXB7Zm9udC1mYW1pbHk6bW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6MWVtfWRmbntmb250LXN0eWxlOml0YWxpY31tYXJre2JhY2tncm91bmQtY29sb3I6I2ZmMDtjb2xvcjojMDAwfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX1hdWRpbyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja31hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lO2hlaWdodDowfWltZ3tib3JkZXItc3R5bGU6bm9uZX1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59YnV0dG9uLGlucHV0LG9wdGdyb3VwLHNlbGVjdCx0ZXh0YXJlYXtmb250LWZhbWlseTpzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMDAlO2xpbmUtaGVpZ2h0OjEuMTU7bWFyZ2luOjB9YnV0dG9uLGlucHV0e292ZXJmbG93OnZpc2libGV9YnV0dG9uLHNlbGVjdHt0ZXh0LXRyYW5zZm9ybTpub25lfVt0eXBlPXJlc2V0XSxbdHlwZT1zdWJtaXRdLGJ1dHRvbixodG1sIFt0eXBlPWJ1dHRvbl17LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbn1bdHlwZT1idXR0b25dOjotbW96LWZvY3VzLWlubmVyLFt0eXBlPXJlc2V0XTo6LW1vei1mb2N1cy1pbm5lcixbdHlwZT1zdWJtaXRdOjotbW96LWZvY3VzLWlubmVyLGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXItc3R5bGU6bm9uZTtwYWRkaW5nOjB9W3R5cGU9YnV0dG9uXTotbW96LWZvY3VzcmluZyxbdHlwZT1yZXNldF06LW1vei1mb2N1c3JpbmcsW3R5cGU9c3VibWl0XTotbW96LWZvY3VzcmluZyxidXR0b246LW1vei1mb2N1c3Jpbmd7b3V0bGluZToxcHggZG90dGVkIEJ1dHRvblRleHR9ZmllbGRzZXR7cGFkZGluZzouMzVlbSAuNzVlbSAuNjI1ZW19bGVnZW5key13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb2xvcjppbmhlcml0O2Rpc3BsYXk6dGFibGU7bWF4LXdpZHRoOjEwMCU7cGFkZGluZzowO3doaXRlLXNwYWNlOm5vcm1hbH1wcm9ncmVzc3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX10ZXh0YXJlYXtvdmVyZmxvdzphdXRvfVt0eXBlPWNoZWNrYm94XSxbdHlwZT1yYWRpb117LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH1bdHlwZT1udW1iZXJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFt0eXBlPW51bWJlcl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b257aGVpZ2h0OmF1dG99W3R5cGU9c2VhcmNoXXstd2Via2l0LWFwcGVhcmFuY2U6dGV4dGZpZWxkO291dGxpbmUtb2Zmc2V0Oi0ycHh9W3R5cGU9c2VhcmNoXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbixbdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uey13ZWJraXQtYXBwZWFyYW5jZTpub25lfTo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjtmb250OmluaGVyaXR9ZGV0YWlscyxtZW51e2Rpc3BsYXk6YmxvY2t9c3VtbWFyeXtkaXNwbGF5Omxpc3QtaXRlbX1jYW52YXN7ZGlzcGxheTppbmxpbmUtYmxvY2t9dGVtcGxhdGV7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gU2l0ZVxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovYm9keSxodG1se2hlaWdodDoxMDAlfWh0bWx7Zm9udC1zaXplOjE0cHh9Ym9keXttYXJnaW46MDtwYWRkaW5nOjA7b3ZlcmZsb3cteDpoaWRkZW47bWluLXdpZHRoOjMyMHB4O2JhY2tncm91bmQ6I2ZmZjtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS40Mjg1ZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpO2ZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkfWgxLGgyLGgzLGg0LGg1e2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtsaW5lLWhlaWdodDoxLjI4NTcxNDI5ZW07bWFyZ2luOmNhbGMoMnJlbSAtIC4xNDI4NTcxNGVtKSAwIDFyZW07Zm9udC13ZWlnaHQ6NzAwO3BhZGRpbmc6MH1oMXttaW4taGVpZ2h0OjFyZW07Zm9udC1zaXplOjJyZW19aDJ7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19aDN7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19aDR7Zm9udC1zaXplOjEuMDcxNDI4NTdyZW19aDV7Zm9udC1zaXplOjFyZW19aDE6Zmlyc3QtY2hpbGQsaDI6Zmlyc3QtY2hpbGQsaDM6Zmlyc3QtY2hpbGQsaDQ6Zmlyc3QtY2hpbGQsaDU6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfWgxOmxhc3QtY2hpbGQsaDI6bGFzdC1jaGlsZCxoMzpsYXN0LWNoaWxkLGg0Omxhc3QtY2hpbGQsaDU6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9cHttYXJnaW46MCAwIDFlbTtsaW5lLWhlaWdodDoxLjQyODVlbX1wOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH1wOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfWF7Y29sb3I6IzQxODNjNDt0ZXh0LWRlY29yYXRpb246bm9uZX1hOmhvdmVye2NvbG9yOiMxZTcwYmY7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Ojotd2Via2l0LXNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNjY2UyZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfTo6LW1vei1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjojY2NlMmZmO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX06OnNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNjY2UyZmY7Y29sb3I6cmdiYSgwLDAsMCwuODcpfWlucHV0Ojotd2Via2l0LXNlbGVjdGlvbix0ZXh0YXJlYTo6LXdlYmtpdC1zZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDEwMCwxMDAsMTAwLC40KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9aW5wdXQ6Oi1tb3otc2VsZWN0aW9uLHRleHRhcmVhOjotbW96LXNlbGVjdGlvbntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTAwLDEwMCwxMDAsLjQpO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX1pbnB1dDo6c2VsZWN0aW9uLHRleHRhcmVhOjpzZWxlY3Rpb257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDEwMCwxMDAsMTAwLC40KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Ym9keSA6Oi13ZWJraXQtc2Nyb2xsYmFyey13ZWJraXQtYXBwZWFyYW5jZTpub25lO3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHh9Ym9keSA6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNre2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMSk7Ym9yZGVyLXJhZGl1czowfWJvZHkgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntjdXJzb3I6cG9pbnRlcjtib3JkZXItcmFkaXVzOjVweDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjI1KTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjJzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMnMgZWFzZX1ib2R5IDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6d2luZG93LWluYWN0aXZle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTUpfWJvZHkgOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMTI4LDEzNSwxMzksLjgpfWJvZHkgLnVpLmludmVydGVkOjotd2Via2l0LXNjcm9sbGJhci10cmFja3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkgLnVpLmludmVydGVkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjI1KX1ib2R5IC51aS5pbnZlcnRlZDo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6d2luZG93LWluYWN0aXZle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTUpfWJvZHkgLnVpLmludmVydGVkOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjM1KX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gQnV0dG9uXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuYnV0dG9ue2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi1oZWlnaHQ6MWVtO291dGxpbmU6MDtib3JkZXI6bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTtiYWNrZ3JvdW5kOiNlMGUxZTIgbm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC42KTtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7bWFyZ2luOjAgLjI1ZW0gMCAwO3BhZGRpbmc6Ljc4NTcxNDI5ZW0gMS41ZW0gLjc4NTcxNDI5ZW07dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LXNoYWRvdzpub25lO2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxZW07Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxiYWNrZ3JvdW5kIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxiYWNrZ3JvdW5kIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLGJhY2tncm91bmQgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGJhY2tncm91bmQtY29sb3IgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSxiYWNrZ3JvdW5kIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt3aWxsLWNoYW5nZTonJzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNjYWNiY2Q7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLmJ1dHRvbjpob3ZlciAuaWNvbntvcGFjaXR5Oi44NX0udWkuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2NhY2JjZDtjb2xvcjpyZ2JhKDAsMCwwLC44KTtiYWNrZ3JvdW5kLWltYWdlOicnIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6JychaW1wb3J0YW50O2JveC1zaGFkb3c6JychaW1wb3J0YW50fS51aS5idXR0b246Zm9jdXMgLmljb257b3BhY2l0eTouODV9LnVpLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2JhYmJiYztiYWNrZ3JvdW5kLWltYWdlOicnO2NvbG9yOnJnYmEoMCwwLDAsLjkpOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQsbm9uZTtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldCxub25lfS51aS5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2MwYzFjMjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudCBpbnNldDtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmFjdGl2ZS5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzBjMWMyO2JhY2tncm91bmQtaW1hZ2U6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2MwYzFjMjtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLmxvYWRpbmcubG9hZGluZy5sb2FkaW5nLmxvYWRpbmcubG9hZGluZy5sb2FkaW5nLmJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTtjdXJzb3I6ZGVmYXVsdDt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAwcyBsaW5lYXIsb3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOmFsbCAwcyBsaW5lYXIsb3BhY2l0eSAuMXMgZWFzZX0udWkubG9hZGluZy5idXR0b246YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LS42NDI4NTcxNGVtIDAgMCAtLjY0Mjg1NzE0ZW07d2lkdGg6MS4yODU3MTQyOWVtO2hlaWdodDoxLjI4NTcxNDI5ZW07Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMTUpfS51aS5sb2FkaW5nLmJ1dHRvbjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0uNjQyODU3MTRlbSAwIDAgLS42NDI4NTcxNGVtO3dpZHRoOjEuMjg1NzE0MjllbTtoZWlnaHQ6MS4yODU3MTQyOWVtOy13ZWJraXQtYW5pbWF0aW9uOmJ1dHRvbi1zcGluIC42cyBsaW5lYXI7YW5pbWF0aW9uOmJ1dHRvbi1zcGluIC42cyBsaW5lYXI7LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyLWNvbG9yOiNmZmYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDouMmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnR9LnVpLmxhYmVsZWQuaWNvbi5sb2FkaW5nLmJ1dHRvbiAuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX1ALXdlYmtpdC1rZXlmcmFtZXMgYnV0dG9uLXNwaW57ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgYnV0dG9uLXNwaW57ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS51aS5iYXNpYy5sb2FkaW5nLmJ1dHRvbjpub3QoLmludmVydGVkKTpiZWZvcmV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS51aS5iYXNpYy5sb2FkaW5nLmJ1dHRvbjpub3QoLmludmVydGVkKTphZnRlcntib3JkZXItdG9wLWNvbG9yOiM3Njc2NzZ9LnVpLmJ1dHRvbjpkaXNhYmxlZCwudWkuYnV0dG9ucyAuZGlzYWJsZWQuYnV0dG9uLC51aS5kaXNhYmxlZC5hY3RpdmUuYnV0dG9uLC51aS5kaXNhYmxlZC5idXR0b24sLnVpLmRpc2FibGVkLmJ1dHRvbjpob3ZlcntjdXJzb3I6ZGVmYXVsdDtvcGFjaXR5Oi40NSFpbXBvcnRhbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lIWltcG9ydGFudH0udWkuYmFzaWMuYnV0dG9ucyAudWkuZGlzYWJsZWQuYnV0dG9ue2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC41KX0udWkuYW5pbWF0ZWQuYnV0dG9ue3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt6LWluZGV4OjF9LnVpLmFuaW1hdGVkLmJ1dHRvbiAuY29udGVudHt3aWxsLWNoYW5nZTp0cmFuc2Zvcm0sb3BhY2l0eX0udWkuYW5pbWF0ZWQuYnV0dG9uIC52aXNpYmxlLmNvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXJpZ2h0OjEuNWVtfS51aS5hbmltYXRlZC5idXR0b24gLmhpZGRlbi5jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCV9LnVpLmFuaW1hdGVkLmJ1dHRvbiAuaGlkZGVuLmNvbnRlbnQsLnVpLmFuaW1hdGVkLmJ1dHRvbiAudmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNpdGlvbjpyaWdodCAuM3MgZWFzZSAwczt0cmFuc2l0aW9uOnJpZ2h0IC4zcyBlYXNlIDBzfS51aS5hbmltYXRlZC5idXR0b24gLnZpc2libGUuY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6MH0udWkuYW5pbWF0ZWQuYnV0dG9uIC5oaWRkZW4uY29udGVudHt0b3A6NTAlO2xlZnQ6YXV0bztyaWdodDotMTAwJTttYXJnaW4tdG9wOi0uNWVtfS51aS5hbmltYXRlZC5idXR0b246Zm9jdXMgLnZpc2libGUuY29udGVudCwudWkuYW5pbWF0ZWQuYnV0dG9uOmhvdmVyIC52aXNpYmxlLmNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0OjIwMCV9LnVpLmFuaW1hdGVkLmJ1dHRvbjpmb2N1cyAuaGlkZGVuLmNvbnRlbnQsLnVpLmFuaW1hdGVkLmJ1dHRvbjpob3ZlciAuaGlkZGVuLmNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0OjB9LnVpLnZlcnRpY2FsLmFuaW1hdGVkLmJ1dHRvbiAuaGlkZGVuLmNvbnRlbnQsLnVpLnZlcnRpY2FsLmFuaW1hdGVkLmJ1dHRvbiAudmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNpdGlvbjp0b3AgLjNzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2U7dHJhbnNpdGlvbjp0b3AgLjNzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2U7dHJhbnNpdGlvbjp0b3AgLjNzIGVhc2UsdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246dG9wIC4zcyBlYXNlLHRyYW5zZm9ybSAuM3MgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZX0udWkudmVydGljYWwuYW5pbWF0ZWQuYnV0dG9uIC52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTtyaWdodDphdXRvfS51aS52ZXJ0aWNhbC5hbmltYXRlZC5idXR0b24gLmhpZGRlbi5jb250ZW50e3RvcDotNTAlO2xlZnQ6MDtyaWdodDphdXRvfS51aS52ZXJ0aWNhbC5hbmltYXRlZC5idXR0b246Zm9jdXMgLnZpc2libGUuY29udGVudCwudWkudmVydGljYWwuYW5pbWF0ZWQuYnV0dG9uOmhvdmVyIC52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgyMDAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgyMDAlKTtyaWdodDphdXRvfS51aS52ZXJ0aWNhbC5hbmltYXRlZC5idXR0b246Zm9jdXMgLmhpZGRlbi5jb250ZW50LC51aS52ZXJ0aWNhbC5hbmltYXRlZC5idXR0b246aG92ZXIgLmhpZGRlbi5jb250ZW50e3RvcDo1MCU7cmlnaHQ6YXV0b30udWkuZmFkZS5hbmltYXRlZC5idXR0b24gLmhpZGRlbi5jb250ZW50LC51aS5mYWRlLmFuaW1hdGVkLmJ1dHRvbiAudmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4zcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuM3MgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuM3MgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGVhc2UsdHJhbnNmb3JtIC4zcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuM3MgZWFzZSx0cmFuc2Zvcm0gLjNzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjNzIGVhc2V9LnVpLmZhZGUuYW5pbWF0ZWQuYnV0dG9uIC52aXNpYmxlLmNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0OmF1dG87b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0udWkuZmFkZS5hbmltYXRlZC5idXR0b24gLmhpZGRlbi5jb250ZW50e29wYWNpdHk6MDtsZWZ0OjA7cmlnaHQ6YXV0bzstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjUpO3RyYW5zZm9ybTpzY2FsZSgxLjUpfS51aS5mYWRlLmFuaW1hdGVkLmJ1dHRvbjpmb2N1cyAudmlzaWJsZS5jb250ZW50LC51aS5mYWRlLmFuaW1hdGVkLmJ1dHRvbjpob3ZlciAudmlzaWJsZS5jb250ZW50e2xlZnQ6YXV0bztyaWdodDphdXRvO29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguNzUpO3RyYW5zZm9ybTpzY2FsZSguNzUpfS51aS5mYWRlLmFuaW1hdGVkLmJ1dHRvbjpmb2N1cyAuaGlkZGVuLmNvbnRlbnQsLnVpLmZhZGUuYW5pbWF0ZWQuYnV0dG9uOmhvdmVyIC5oaWRkZW4uY29udGVudHtsZWZ0OjA7cmlnaHQ6YXV0bztvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfS51aS5pbnZlcnRlZC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IG5vbmU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYnV0dG9ucyAuYnV0dG9ue21hcmdpbjowIDAgMCAtMnB4fS51aS5pbnZlcnRlZC5idXR0b25zIC5idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0udWkuaW52ZXJ0ZWQudmVydGljYWwuYnV0dG9ucyAuYnV0dG9ue21hcmdpbjowIDAgLTJweCAwfS51aS5pbnZlcnRlZC52ZXJ0aWNhbC5idXR0b25zIC5idXR0b246Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5pbnZlcnRlZC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLmludmVydGVkLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuaW52ZXJ0ZWQuYnV0dG9uLmFjdGl2ZTpmb2N1c3tiYWNrZ3JvdW5kOiNkY2RkZGU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZGNkZGRlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZGNkZGRlIGluc2V0IWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkubGFiZWxlZC5idXR0b246bm90KC5pY29uKXtkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWJveDtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4Oy13ZWJraXQtYm94LW9yaWVudDpob3Jpem9udGFsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LWRpcmVjdGlvbjpyb3c7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS51aS5sYWJlbGVkLmJ1dHRvbj4uYnV0dG9ue21hcmdpbjowfS51aS5sYWJlbGVkLmJ1dHRvbj4ubGFiZWx7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW46MCAwIDAgLTFweCFpbXBvcnRhbnQ7cGFkZGluZzonJztmb250LXNpemU6MWVtO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmxhYmVsZWQuYnV0dG9uPi50YWcubGFiZWw6YmVmb3Jle3dpZHRoOjEuODVlbTtoZWlnaHQ6MS44NWVtfS51aS5sYWJlbGVkLmJ1dHRvbjpub3QoW2NsYXNzKj1cXFwibGVmdCBsYWJlbGVkXFxcIl0pPi5idXR0b257Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS51aS5sYWJlbGVkLmJ1dHRvbjpub3QoW2NsYXNzKj1cXFwibGVmdCBsYWJlbGVkXFxcIl0pPi5sYWJlbHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowfS51aVtjbGFzcyo9XFxcImxlZnQgbGFiZWxlZFxcXCJdLmJ1dHRvbj4uYnV0dG9ue2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjB9LnVpW2NsYXNzKj1cXFwibGVmdCBsYWJlbGVkXFxcIl0uYnV0dG9uPi5sYWJlbHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLmZhY2Vib29rLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMzYjU5OTg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuZmFjZWJvb2suYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzMwNGQ4YTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmZhY2Vib29rLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMmQ0MzczO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkudHdpdHRlci5idXR0b257YmFja2dyb3VuZC1jb2xvcjojNTVhY2VlO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnR3aXR0ZXIuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzM1YTJmNDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnR3aXR0ZXIuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMyNzk1ZTk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5nb29nbGUucGx1cy5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZGQ0YjM5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmdvb2dsZS5wbHVzLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlMDMyMWM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5nb29nbGUucGx1cy5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2MyMzMyMTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmxpbmtlZGluLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMxZjg4YmU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5saW5rZWRpbi5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTQ3YmFmO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkubGlua2VkaW4uYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxODY5OTI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS55b3V0dWJlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS55b3V0dWJlLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlNjAwMDA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS55b3V0dWJlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYzAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuaW5zdGFncmFtLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM0OTc2OWM7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuaW5zdGFncmFtLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzZDY5OGU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5pbnN0YWdyYW0uYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzOTVjNzk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5waW50ZXJlc3QuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2JkMDgxYztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5waW50ZXJlc3QuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2FjMDAxMztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnBpbnRlcmVzdC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzhjMDYxNTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnZrLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM0ZDcxOTg7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnZrLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM0MTY0OGE7Y29sb3I6I2ZmZn0udWkudmsuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzYzU4NzY7Y29sb3I6I2ZmZn0udWkuYnV0dG9uPi5pY29uOm5vdCguYnV0dG9uKXtoZWlnaHQ6Ljg1NzE0Mjg2ZW07b3BhY2l0eTouODttYXJnaW46MCAuNDI4NTcxNDNlbSAwIC0uMjE0Mjg1NzFlbTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dmVydGljYWwtYWxpZ246Jyc7Y29sb3I6Jyd9LnVpLmJ1dHRvbjpub3QoLmljb24pPi5pY29uOm5vdCguYnV0dG9uKTpub3QoLmRyb3Bkb3duKXttYXJnaW46MCAuNDI4NTcxNDNlbSAwIC0uMjE0Mjg1NzFlbX0udWkuYnV0dG9uOm5vdCguaWNvbik+LnJpZ2h0Lmljb246bm90KC5idXR0b24pOm5vdCguZHJvcGRvd24pe21hcmdpbjowIC0uMjE0Mjg1NzFlbSAwIC40Mjg1NzE0M2VtfS51aVtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJdLmJ1dHRvbiwudWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5idXR0b25ze2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6LjI1ZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmJ1dHRvbiwudWlbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0uYnV0dG9uc3tmbG9hdDpyaWdodDttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDouMjVlbX0udWkuY29tcGFjdC5idXR0b24sLnVpLmNvbXBhY3QuYnV0dG9ucyAuYnV0dG9ue3BhZGRpbmc6LjU4OTI4NTcxZW0gMS4xMjVlbSAuNTg5Mjg1NzFlbX0udWkuY29tcGFjdC5pY29uLmJ1dHRvbiwudWkuY29tcGFjdC5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwYWRkaW5nOi41ODkyODU3MWVtIC41ODkyODU3MWVtIC41ODkyODU3MWVtfS51aS5jb21wYWN0LmxhYmVsZWQuaWNvbi5idXR0b24sLnVpLmNvbXBhY3QubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwYWRkaW5nOi41ODkyODU3MWVtIDMuNjk2NDI4NTdlbSAuNTg5Mjg1NzFlbX0udWkubWluaS5idXR0b24sLnVpLm1pbmkuYnV0dG9ucyAuYnV0dG9uLC51aS5taW5pLmJ1dHRvbnMgLm9ye2ZvbnQtc2l6ZTouNzg1NzE0MjlyZW19LnVpLnRpbnkuYnV0dG9uLC51aS50aW55LmJ1dHRvbnMgLmJ1dHRvbiwudWkudGlueS5idXR0b25zIC5vcntmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5idXR0b24sLnVpLnNtYWxsLmJ1dHRvbnMgLmJ1dHRvbiwudWkuc21hbGwuYnV0dG9ucyAub3J7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuYnV0dG9uLC51aS5idXR0b25zIC5idXR0b24sLnVpLmJ1dHRvbnMgLm9ye2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5idXR0b24sLnVpLmxhcmdlLmJ1dHRvbnMgLmJ1dHRvbiwudWkubGFyZ2UuYnV0dG9ucyAub3J7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy5idXR0b24sLnVpLmJpZy5idXR0b25zIC5idXR0b24sLnVpLmJpZy5idXR0b25zIC5vcntmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5idXR0b24sLnVpLmh1Z2UuYnV0dG9ucyAuYnV0dG9uLC51aS5odWdlLmJ1dHRvbnMgLm9ye2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLmJ1dHRvbiwudWkubWFzc2l2ZS5idXR0b25zIC5idXR0b24sLnVpLm1hc3NpdmUuYnV0dG9ucyAub3J7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LnVpLmljb24uYnV0dG9uLC51aS5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwYWRkaW5nOi43ODU3MTQyOWVtIC43ODU3MTQyOWVtIC43ODU3MTQyOWVtfS51aS5pY29uLmJ1dHRvbj4uaWNvbiwudWkuaWNvbi5idXR0b25zIC5idXR0b24+Lmljb257b3BhY2l0eTouOTttYXJnaW46MCFpbXBvcnRhbnQ7dmVydGljYWwtYWxpZ246dG9wfS51aS5iYXNpYy5idXR0b24sLnVpLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IG5vbmUhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjYpIWltcG9ydGFudDtmb250LXdlaWdodDo0MDA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07dGV4dC10cmFuc2Zvcm06bm9uZTt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJhc2ljLmJ1dHRvbnN7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS5iYXNpYy5idXR0b25zIC5idXR0b257Ym9yZGVyLXJhZGl1czowfS51aS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOiNmZmYhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjgpIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4zNSkgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOCkhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldCwwIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kOiNmOGY4ZjghaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjkpIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMCwwLDAsLjE1KSBpbnNldCwwIDFweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMTUpIGluc2V0LDAgMXB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OicnIWltcG9ydGFudDtib3gtc2hhZG93OicnIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS5iYXNpYy5hY3RpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDUpfS51aS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4zNSkgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0LDAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0IGluc2V0fS51aS5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgwLDAsMCwuMTUpIGluc2V0LDAgMXB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldCBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDAsMCwwLC4xNSkgaW5zZXQsMCAxcHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0IGluc2V0fS51aS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzonJyFpbXBvcnRhbnQ7Ym94LXNoYWRvdzonJyFpbXBvcnRhbnR9LnVpLmJhc2ljLmludmVydGVkLmJ1dHRvbiwudWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2NvbG9yOiNmOWZhZmIhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudH0udWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5idXR0b246aG92ZXJ7Y29sb3I6I2ZmZiFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudH0udWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5idXR0b246Zm9jdXN7Y29sb3I6I2ZmZiFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZmIGluc2V0IWltcG9ydGFudH0udWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuaW52ZXJ0ZWQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjA4KSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC45KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuOSkgaW5zZXQhaW1wb3J0YW50fS51aS5iYXNpYy5pbnZlcnRlZC5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjcpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjcpIGluc2V0fS51aS5iYXNpYy5pbnZlcnRlZC5hY3RpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5pbnZlcnRlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZiBpbnNldCFpbXBvcnRhbnR9LnVpLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbntib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuYmFzaWMudmVydGljYWwuYnV0dG9ucyAuYnV0dG9ue2JvcmRlci1sZWZ0Om5vbmV9LnVpLmJhc2ljLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbntib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuYmFzaWMudmVydGljYWwuYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MH0udWkubGFiZWxlZC5pY29uLmJ1dHRvbiwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLWxlZnQ6NC4wNzE0Mjg1N2VtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjEuNWVtIWltcG9ydGFudH0udWkubGFiZWxlZC5pY29uLmJ1dHRvbj4uaWNvbiwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnM+LmJ1dHRvbj4uaWNvbntwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTtsaW5lLWhlaWdodDoxO2JvcmRlci1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czppbmhlcml0O3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO3dpZHRoOjIuNTcxNDI4NTdlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjonJzstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCB0cmFuc3BhcmVudCBpbnNldDtib3gtc2hhZG93Oi0xcHggMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXR9LnVpLmxhYmVsZWQuaWNvbi5idXR0b24+Lmljb24sLnVpLmxhYmVsZWQuaWNvbi5idXR0b25zPi5idXR0b24+Lmljb257dG9wOjA7bGVmdDowfS51aVtjbGFzcyo9XFxcInJpZ2h0IGxhYmVsZWRcXFwiXS5pY29uLmJ1dHRvbntwYWRkaW5nLXJpZ2h0OjQuMDcxNDI4NTdlbSFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjEuNWVtIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaWNvbi5idXR0b24+Lmljb257bGVmdDphdXRvO3JpZ2h0OjA7Ym9yZGVyLXJhZGl1czowO2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOmluaGVyaXQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6aW5oZXJpdDstd2Via2l0LWJveC1zaGFkb3c6MXB4IDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O2JveC1zaGFkb3c6MXB4IDAgMCAwIHRyYW5zcGFyZW50IGluc2V0fS51aS5sYWJlbGVkLmljb24uYnV0dG9uPi5pY29uOmFmdGVyLC51aS5sYWJlbGVkLmljb24uYnV0dG9uPi5pY29uOmJlZm9yZSwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnM+LmJ1dHRvbj4uaWNvbjphZnRlciwudWkubGFiZWxlZC5pY29uLmJ1dHRvbnM+LmJ1dHRvbj4uaWNvbjpiZWZvcmV7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3RvcDo1MCU7dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0udWkubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbj4uaWNvbntib3JkZXItcmFkaXVzOjB9LnVpLmxhYmVsZWQuaWNvbi5idXR0b25zIC5idXR0b246Zmlyc3QtY2hpbGQ+Lmljb257Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLmxhYmVsZWQuaWNvbi5idXR0b25zIC5idXR0b246bGFzdC1jaGlsZD4uaWNvbntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS52ZXJ0aWNhbC5sYWJlbGVkLmljb24uYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxkPi5pY29ue2JvcmRlci1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkudmVydGljYWwubGFiZWxlZC5pY29uLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxkPi5pY29ue2JvcmRlci1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuZmx1aWRbY2xhc3MqPVxcXCJsZWZ0IGxhYmVsZWRcXFwiXS5pY29uLmJ1dHRvbiwudWkuZmx1aWRbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaWNvbi5idXR0b257cGFkZGluZy1sZWZ0OjEuNWVtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjEuNWVtIWltcG9ydGFudH0udWkuYnV0dG9uLnRvZ2dsZS5hY3RpdmUsLnVpLmJ1dHRvbnMgLmJ1dHRvbi50b2dnbGUuYWN0aXZlLC51aS50b2dnbGUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O3RleHQtc2hhZG93Om5vbmU7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJ1dHRvbi50b2dnbGUuYWN0aXZlOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzE2YWIzOSFpbXBvcnRhbnQ7dGV4dC1zaGFkb3c6bm9uZTtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuY2lyY3VsYXIuYnV0dG9ue2JvcmRlci1yYWRpdXM6MTBlbX0udWkuY2lyY3VsYXIuYnV0dG9uPi5pY29ue3dpZHRoOjFlbTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkuYnV0dG9ucyAub3J7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6LjNlbTtoZWlnaHQ6Mi41NzE0Mjg1N2VtO3otaW5kZXg6M30udWkuYnV0dG9ucyAub3I6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1yYWRpdXM6NTAwcmVtO2NvbnRlbnQ6J29yJzt0b3A6NTAlO2xlZnQ6NTAlO2JhY2tncm91bmQtY29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO21hcmdpbi10b3A6LS44OTI4NTcxNGVtO21hcmdpbi1sZWZ0Oi0uODkyODU3MTRlbTt3aWR0aDoxLjc4NTcxNDI5ZW07aGVpZ2h0OjEuNzg1NzE0MjllbTtsaW5lLWhlaWdodDoxLjc4NTcxNDI5ZW07Y29sb3I6cmdiYSgwLDAsMCwuNCk7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC13ZWlnaHQ6NzAwOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXR9LnVpLmJ1dHRvbnMgLm9yW2RhdGEtdGV4dF06YmVmb3Jle2NvbnRlbnQ6YXR0cihkYXRhLXRleHQpfS51aS5mbHVpZC5idXR0b25zIC5vcnt3aWR0aDowIWltcG9ydGFudH0udWkuZmx1aWQuYnV0dG9ucyAub3I6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5hdHRhY2hlZC5idXR0b257cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSFpbXBvcnRhbnR9LnVpLmF0dGFjaGVkLnRvcC5idXR0b257Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuYXR0YWNoZWQuYm90dG9tLmJ1dHRvbntib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5sZWZ0LmF0dGFjaGVkLmJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItbGVmdDpub25lO3RleHQtYWxpZ246cmlnaHQ7cGFkZGluZy1yaWdodDouNzVlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgLjI4NTcxNDI5cmVtfS51aS5yaWdodC5hdHRhY2hlZC5idXR0b257ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmctbGVmdDouNzVlbTtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aS5hdHRhY2hlZC5idXR0b25ze3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7Ym9yZGVyLXJhZGl1czowO3dpZHRoOmF1dG8haW1wb3J0YW50O3otaW5kZXg6MjttYXJnaW4tbGVmdDotMXB4O21hcmdpbi1yaWdodDotMXB4fS51aS5hdHRhY2hlZC5idXR0b25zIC5idXR0b257bWFyZ2luOjB9LnVpLmF0dGFjaGVkLmJ1dHRvbnMgLmJ1dHRvbjpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOjB9LnVpLmF0dGFjaGVkLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MH0udWlbY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXS5idXR0b25ze21hcmdpbi1ib3R0b206LTFweDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLmJ1dHRvbnMgLmJ1dHRvbjpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgMH0udWlbY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXS5idXR0b25zIC5idXR0b246bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIDAgMH0udWlbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS5idXR0b25ze21hcmdpbi10b3A6LTFweDtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLmJ1dHRvbnMgLmJ1dHRvbjpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAwIC4yODU3MTQyOXJlbX0udWlbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS5idXR0b25zIC5idXR0b246bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gMH0udWlbY2xhc3MqPVxcXCJsZWZ0IGF0dGFjaGVkXFxcIl0uYnV0dG9uc3tkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWJveDtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4O21hcmdpbi1yaWdodDowO21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMH0udWlbY2xhc3MqPVxcXCJsZWZ0IGF0dGFjaGVkXFxcIl0uYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAwIDB9LnVpW2NsYXNzKj1cXFwibGVmdCBhdHRhY2hlZFxcXCJdLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIDB9LnVpW2NsYXNzKj1cXFwicmlnaHQgYXR0YWNoZWRcXFwiXS5idXR0b25ze2Rpc3BsYXk6LXdlYmtpdC1pbmxpbmUtYm94O2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94O2Rpc3BsYXk6aW5saW5lLWZsZXg7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6LTFweDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgLjI4NTcxNDI5cmVtfS51aVtjbGFzcyo9XFxcInJpZ2h0IGF0dGFjaGVkXFxcIl0uYnV0dG9ucyAuYnV0dG9uOmZpcnN0LWNoaWxke21hcmdpbi1sZWZ0Oi0xcHg7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIDB9LnVpW2NsYXNzKj1cXFwicmlnaHQgYXR0YWNoZWRcXFwiXS5idXR0b25zIC5idXR0b246bGFzdC1jaGlsZHttYXJnaW4tbGVmdDotMXB4O2JvcmRlci1yYWRpdXM6MCAwIDAgLjI4NTcxNDI5cmVtfS51aS5mbHVpZC5idXR0b24sLnVpLmZsdWlkLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkuZmx1aWQuYnV0dG9ue2Rpc3BsYXk6YmxvY2t9LnVpLnR3by5idXR0b25ze3dpZHRoOjEwMCV9LnVpLnR3by5idXR0b25zPi5idXR0b257d2lkdGg6NTAlfS51aS50aHJlZS5idXR0b25ze3dpZHRoOjEwMCV9LnVpLnRocmVlLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDozMy4zMzMlfS51aS5mb3VyLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkuZm91ci5idXR0b25zPi5idXR0b257d2lkdGg6MjUlfS51aS5maXZlLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkuZml2ZS5idXR0b25zPi5idXR0b257d2lkdGg6MjAlfS51aS5zaXguYnV0dG9uc3t3aWR0aDoxMDAlfS51aS5zaXguYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjE2LjY2NiV9LnVpLnNldmVuLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkuc2V2ZW4uYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjE0LjI4NSV9LnVpLmVpZ2h0LmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkuZWlnaHQuYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjEyLjUlfS51aS5uaW5lLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkubmluZS5idXR0b25zPi5idXR0b257d2lkdGg6MTEuMTElfS51aS50ZW4uYnV0dG9uc3t3aWR0aDoxMDAlfS51aS50ZW4uYnV0dG9ucz4uYnV0dG9ue3dpZHRoOjEwJX0udWkuZWxldmVuLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkuZWxldmVuLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDo5LjA5JX0udWkudHdlbHZlLmJ1dHRvbnN7d2lkdGg6MTAwJX0udWkudHdlbHZlLmJ1dHRvbnM+LmJ1dHRvbnt3aWR0aDo4LjMzMzMlfS51aS5mbHVpZC52ZXJ0aWNhbC5idXR0b25zLC51aS5mbHVpZC52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDt3aWR0aDphdXRvfS51aS50d28udmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDo1MCV9LnVpLnRocmVlLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6MzMuMzMzJX0udWkuZm91ci52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjI1JX0udWkuZml2ZS52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjIwJX0udWkuc2l4LnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6MTYuNjY2JX0udWkuc2V2ZW4udmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDoxNC4yODUlfS51aS5laWdodC52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjEyLjUlfS51aS5uaW5lLnZlcnRpY2FsLmJ1dHRvbnM+LmJ1dHRvbntoZWlnaHQ6MTEuMTElfS51aS50ZW4udmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDoxMCV9LnVpLmVsZXZlbi52ZXJ0aWNhbC5idXR0b25zPi5idXR0b257aGVpZ2h0OjkuMDklfS51aS50d2VsdmUudmVydGljYWwuYnV0dG9ucz4uYnV0dG9ue2hlaWdodDo4LjMzMzMlfS51aS5ibGFjay5idXR0b24sLnVpLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkuYmxhY2suYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5ibGFjay5idXR0b246aG92ZXIsLnVpLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMyNzI5MmE7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ibGFjay5idXR0b246Zm9jdXMsLnVpLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMyZjMwMzI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ibGFjay5idXR0b246YWN0aXZlLC51aS5ibGFjay5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzM0MzYzNztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJsYWNrLmFjdGl2ZS5idXR0b24sLnVpLmJsYWNrLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLmJsYWNrLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmJsYWNrLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzBmMGYxMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLmJsYWNrLmJ1dHRvbiwudWkuYmFzaWMuYmxhY2suYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzFiMWMxZCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzFiMWMxZCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzFiMWMxZCFpbXBvcnRhbnR9LnVpLmJhc2ljLmJsYWNrLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMuYmxhY2suYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyNzI5MmEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyNzI5MmEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyNzI5MmEhaW1wb3J0YW50fS51aS5iYXNpYy5ibGFjay5idXR0b246Zm9jdXMsLnVpLmJhc2ljLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMmYzMDMyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMmYzMDMyIGluc2V0IWltcG9ydGFudDtjb2xvcjojMjcyOTJhIWltcG9ydGFudH0udWkuYmFzaWMuYmxhY2suYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuYmxhY2suYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMGYwZjEwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMGYwZjEwIGluc2V0IWltcG9ydGFudDtjb2xvcjojMzQzNjM3IWltcG9ydGFudH0udWkuYmFzaWMuYmxhY2suYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuYmxhY2suYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMzNDM2MzcgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMzNDM2MzcgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMzNDM2MzchaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5ibGFjay5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9uLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkNGQ0ZDUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkNGQ0ZDUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibGFjay5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5ibGFjay5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9LnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzAwMH0udWkuaW52ZXJ0ZWQuYmxhY2suYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9LnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMDAwfS51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibGFjay5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzAwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzAwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYmxhY2suYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzAwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzAwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmJsYWNrLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmJsYWNrLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMDAwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMDAwIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYmxhY2suYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmxhY2suYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmxhY2suYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMwMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMwMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ncmV5LmJ1dHRvbiwudWkuZ3JleS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojNzY3Njc2O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLmdyZXkuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5ncmV5LmJ1dHRvbjpob3ZlciwudWkuZ3JleS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojODM4MzgzO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuZ3JleS5idXR0b246Zm9jdXMsLnVpLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzhhOGE4YTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmdyZXkuYnV0dG9uOmFjdGl2ZSwudWkuZ3JleS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzkwOTA5MDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmdyZXkuYWN0aXZlLmJ1dHRvbiwudWkuZ3JleS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5ncmV5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmdyZXkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNjk2OTY5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMuZ3JleS5idXR0b24sLnVpLmJhc2ljLmdyZXkuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzc2NzY3NiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzc2NzY3NiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6Izc2NzY3NiFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZXkuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5ncmV5LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjODM4MzgzIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjODM4MzgzIGluc2V0IWltcG9ydGFudDtjb2xvcjojODM4MzgzIWltcG9ydGFudH0udWkuYmFzaWMuZ3JleS5idXR0b246Zm9jdXMsLnVpLmJhc2ljLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM4YThhOGEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM4YThhOGEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM4MzgzODMhaW1wb3J0YW50fS51aS5iYXNpYy5ncmV5LmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLmdyZXkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjNjk2OTY5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjNjk2OTY5IGluc2V0IWltcG9ydGFudDtjb2xvcjojOTA5MDkwIWltcG9ydGFudH0udWkuYmFzaWMuZ3JleS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5ncmV5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOTA5MDkwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOTA5MDkwIGluc2V0IWltcG9ydGFudDtjb2xvcjojOTA5MDkwIWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMuZ3JleS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQuZ3JleS5idXR0b24sLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZDRkNGQ1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZDRkNGQ1IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZXkuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojY2ZkMGQyfS51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojYzdjOWNifS51aS5pbnZlcnRlZC5ncmV5LmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNjZmQwZDJ9LnVpLmludmVydGVkLmdyZXkuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2MyYzRjNX0udWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLmdyZXkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmdyZXkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ncmV5LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNjZmQwZDIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNjZmQwZDIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmV5LmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjYzdjOWNiIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjYzdjOWNiIGluc2V0IWltcG9ydGFudDtjb2xvcjojZGNkZGRlIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JleS5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ncmV5LmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmdyZXkuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNjZmQwZDIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNjZmQwZDIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmV5LmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZXkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JleS5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2MyYzRjNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2MyYzRjNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJyb3duLmJ1dHRvbiwudWkuYnJvd24uYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2E1NjczZjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5icm93bi5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJyb3duLmJ1dHRvbjpob3ZlciwudWkuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izk3NWIzMztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJyb3duLmJ1dHRvbjpmb2N1cywudWkuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzkwNTMyYjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJyb3duLmJ1dHRvbjphY3RpdmUsLnVpLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojODA1MDMxO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYnJvd24uYWN0aXZlLmJ1dHRvbiwudWkuYnJvd24uYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkuYnJvd24uYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuYnJvd24uYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojOTk1YTMxO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMuYnJvd24uYnV0dG9uLC51aS5iYXNpYy5icm93bi5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTU2NzNmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTU2NzNmIGluc2V0IWltcG9ydGFudDtjb2xvcjojYTU2NzNmIWltcG9ydGFudH0udWkuYmFzaWMuYnJvd24uYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5icm93bi5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzk3NWIzMyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzk3NWIzMyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6Izk3NWIzMyFpbXBvcnRhbnR9LnVpLmJhc2ljLmJyb3duLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM5MDUzMmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM5MDUzMmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM5NzViMzMhaW1wb3J0YW50fS51aS5iYXNpYy5icm93bi5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5icm93bi5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM5OTVhMzEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM5OTVhMzEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM4MDUwMzEhaW1wb3J0YW50fS51aS5iYXNpYy5icm93bi5idXR0b246YWN0aXZlLC51aS5iYXNpYy5icm93bi5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzgwNTAzMSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzgwNTAzMSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzgwNTAzMSFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLmJyb3duLmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5icm93bi5idXR0b24sLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Q2N2MxYyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Q2N2MxYyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q2N2MxY30udWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5icm93bi5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJyb3duLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLmJyb3duLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2M4NmYxMX0udWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojYzE2ODA4fS51aS5pbnZlcnRlZC5icm93bi5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2NjNmYwZH0udWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNhOTYyMTZ9LnVpLmludmVydGVkLmJyb3duLmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJyb3duLmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjYzg2ZjExIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjYzg2ZjExIGluc2V0IWltcG9ydGFudDtjb2xvcjojZDY3YzFjIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5icm93bi5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjYzE2ODA4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjYzE2ODA4IGluc2V0IWltcG9ydGFudDtjb2xvcjojZDY3YzFjIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYnJvd24uYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYnJvd24uYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNjYzZmMGQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNjYzZmMGQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkNjdjMWMhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5icm93bi5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5icm93bi5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5icm93bi5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2E5NjIxNiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2E5NjIxNiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q2N2MxYyFpbXBvcnRhbnR9LnVpLmJsdWUuYnV0dG9uLC51aS5ibHVlLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMyMTg1ZDA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkuYmx1ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJsdWUuYnV0dG9uOmhvdmVyLC51aS5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMxNjc4YzI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ibHVlLmJ1dHRvbjpmb2N1cywudWkuYmx1ZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojMGQ3MWJiO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmx1ZS5idXR0b246YWN0aXZlLC51aS5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMWE2OWE0O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmx1ZS5hY3RpdmUuYnV0dG9uLC51aS5ibHVlLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLmJsdWUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuYmx1ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxMjc5YzY7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5ibHVlLmJ1dHRvbiwudWkuYmFzaWMuYmx1ZS5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMjE4NWQwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMjE4NWQwIGluc2V0IWltcG9ydGFudDtjb2xvcjojMjE4NWQwIWltcG9ydGFudH0udWkuYmFzaWMuYmx1ZS5idXR0b246aG92ZXIsLnVpLmJhc2ljLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxNjc4YzIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxNjc4YzIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxNjc4YzIhaW1wb3J0YW50fS51aS5iYXNpYy5ibHVlLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMuYmx1ZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzBkNzFiYiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzBkNzFiYiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE2NzhjMiFpbXBvcnRhbnR9LnVpLmJhc2ljLmJsdWUuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuYmx1ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxMjc5YzYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxMjc5YzYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxYTY5YTQhaW1wb3J0YW50fS51aS5iYXNpYy5ibHVlLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxYTY5YTQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxYTY5YTQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxYTY5YTQhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5ibHVlLmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM1NGM4ZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM1NGM4ZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NGM4ZmZ9LnVpLmludmVydGVkLmJsdWUuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzNhYzBmZn0udWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzJiYmJmZn0udWkuaW52ZXJ0ZWQuYmx1ZS5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojM2FjMGZmfS51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMyMWI4ZmZ9LnVpLmludmVydGVkLmJsdWUuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsdWUuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuYmx1ZS5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjM2FjMGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjM2FjMGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYmx1ZS5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmJsdWUuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzJiYmJmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzJiYmJmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsdWUuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuYmx1ZS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5ibHVlLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjM2FjMGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjM2FjMGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuYmx1ZS5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ibHVlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmJsdWUuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMyMWI4ZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyMWI4ZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NGM4ZmYhaW1wb3J0YW50fS51aS5ncmVlbi5idXR0b24sLnVpLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkuZ3JlZW4uYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5ncmVlbi5idXR0b246aG92ZXIsLnVpLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMxNmFiMzk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ncmVlbi5idXR0b246Zm9jdXMsLnVpLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMwZWE0MzI7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5ncmVlbi5idXR0b246YWN0aXZlLC51aS5ncmVlbi5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzE5OGYzNTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmdyZWVuLmFjdGl2ZS5idXR0b24sLnVpLmdyZWVuLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLmdyZWVuLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmdyZWVuLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzEzYWUzODtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLmdyZWVuLmJ1dHRvbiwudWkuYmFzaWMuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzIxYmE0NSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzIxYmE0NSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzIxYmE0NSFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZWVuLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxNmFiMzkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxNmFiMzkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxNmFiMzkhaW1wb3J0YW50fS51aS5iYXNpYy5ncmVlbi5idXR0b246Zm9jdXMsLnVpLmJhc2ljLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMGVhNDMyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMGVhNDMyIGluc2V0IWltcG9ydGFudDtjb2xvcjojMTZhYjM5IWltcG9ydGFudH0udWkuYmFzaWMuZ3JlZW4uYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuZ3JlZW4uYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTNhZTM4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTNhZTM4IGluc2V0IWltcG9ydGFudDtjb2xvcjojMTk4ZjM1IWltcG9ydGFudH0udWkuYmFzaWMuZ3JlZW4uYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxOThmMzUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxOThmMzUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxOThmMzUhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5ncmVlbi5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9uLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMyZWNjNDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyZWNjNDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyZWNjNDB9LnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5ncmVlbi5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5ncmVlbi5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMyMmJlMzR9LnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzE5YjgyYn0udWkuaW52ZXJ0ZWQuZ3JlZW4uYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMxZmMyMzF9LnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMjVhMjMzfS51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmVlbi5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzIyYmUzNCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzIyYmUzNCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzJlY2M0MCFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuZ3JlZW4uYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzE5YjgyYiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzE5YjgyYiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzJlY2M0MCFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmdyZWVuLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLmdyZWVuLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMWZjMjMxIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMWZjMjMxIGluc2V0IWltcG9ydGFudDtjb2xvcjojMmVjYzQwIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JlZW4uYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JlZW4uYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuZ3JlZW4uYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMyNWEyMzMgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyNWEyMzMgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyZWNjNDAhaW1wb3J0YW50fS51aS5vcmFuZ2UuYnV0dG9uLC51aS5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2YyNzExYztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5vcmFuZ2UuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5vcmFuZ2UuYnV0dG9uOmhvdmVyLC51aS5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2YyNjIwMjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm9yYW5nZS5idXR0b246Zm9jdXMsLnVpLm9yYW5nZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZTU1YjAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkub3JhbmdlLmJ1dHRvbjphY3RpdmUsLnVpLm9yYW5nZS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2NmNTkwYztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm9yYW5nZS5hY3RpdmUuYnV0dG9uLC51aS5vcmFuZ2UuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkub3JhbmdlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLm9yYW5nZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTYxMDA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5vcmFuZ2UuYnV0dG9uLC51aS5iYXNpYy5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2YyNzExYyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2YyNzExYyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2YyNzExYyFpbXBvcnRhbnR9LnVpLmJhc2ljLm9yYW5nZS5idXR0b246aG92ZXIsLnVpLmJhc2ljLm9yYW5nZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2YyNjIwMiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2YyNjIwMiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2YyNjIwMiFpbXBvcnRhbnR9LnVpLmJhc2ljLm9yYW5nZS5idXR0b246Zm9jdXMsLnVpLmJhc2ljLm9yYW5nZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2U1NWIwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2U1NWIwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2YyNjIwMiFpbXBvcnRhbnR9LnVpLmJhc2ljLm9yYW5nZS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5vcmFuZ2UuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZjU2MTAwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZjU2MTAwIGluc2V0IWltcG9ydGFudDtjb2xvcjojY2Y1OTBjIWltcG9ydGFudH0udWkuYmFzaWMub3JhbmdlLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLm9yYW5nZS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2NmNTkwYyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2NmNTkwYyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2NmNTkwYyFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLm9yYW5nZS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmODUxYiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmODUxYiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmODUxYn0udWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjc3MDF9LnVpLmludmVydGVkLm9yYW5nZS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZjE3MDAwfS51aS5pbnZlcnRlZC5vcmFuZ2UuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZmY3NzAxfS51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQub3JhbmdlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZTc2YjAwfS51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmNzcwMSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmNzcwMSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmODUxYiFpbXBvcnRhbnR9LnVpLmludmVydGVkLm9yYW5nZS5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLm9yYW5nZS5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZjE3MDAwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZjE3MDAwIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY4NTFiIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLm9yYW5nZS5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5vcmFuZ2UuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjc3MDEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjc3MDEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjg1MWIhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vcmFuZ2UuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQub3JhbmdlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9yYW5nZS5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2U3NmIwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2U3NmIwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmODUxYiFpbXBvcnRhbnR9LnVpLnBpbmsuYnV0dG9uLC51aS5waW5rLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNlMDM5OTc7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkucGluay5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnBpbmsuYnV0dG9uOmhvdmVyLC51aS5waW5rLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlNjFhOGQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5waW5rLmJ1dHRvbjpmb2N1cywudWkucGluay5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZTEwZjg1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucGluay5idXR0b246YWN0aXZlLC51aS5waW5rLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYzcxZjdlO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucGluay5hY3RpdmUuYnV0dG9uLC51aS5waW5rLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLnBpbmsuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkucGluay5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNlYTE1OGQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5waW5rLmJ1dHRvbiwudWkuYmFzaWMucGluay5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZTAzOTk3IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZTAzOTk3IGluc2V0IWltcG9ydGFudDtjb2xvcjojZTAzOTk3IWltcG9ydGFudH0udWkuYmFzaWMucGluay5idXR0b246aG92ZXIsLnVpLmJhc2ljLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlNjFhOGQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlNjFhOGQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNlNjFhOGQhaW1wb3J0YW50fS51aS5iYXNpYy5waW5rLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMucGluay5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2UxMGY4NSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2UxMGY4NSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2U2MWE4ZCFpbXBvcnRhbnR9LnVpLmJhc2ljLnBpbmsuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMucGluay5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNlYTE1OGQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlYTE1OGQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNjNzFmN2UhaW1wb3J0YW50fS51aS5iYXNpYy5waW5rLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNjNzFmN2UgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNjNzFmN2UgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNjNzFmN2UhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5waW5rLmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjhlZGYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjhlZGYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjhlZGZ9LnVpLmludmVydGVkLnBpbmsuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQucGluay5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucGluay5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQucGluay5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmNzRkOH0udWkuaW52ZXJ0ZWQucGluay5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2ZmNjVkM30udWkuaW52ZXJ0ZWQucGluay5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZmY3NGQ4fS51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjViZDF9LnVpLmludmVydGVkLnBpbmsuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnBpbmsuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucGluay5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY3NGQ4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY3NGQ4IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY4ZWRmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucGluay5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnBpbmsuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmNjVkMyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmNjVkMyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmOGVkZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnBpbmsuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucGluay5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5waW5rLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY3NGQ4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY3NGQ4IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY4ZWRmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucGluay5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5waW5rLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnBpbmsuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjViZDEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjViZDEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjhlZGYhaW1wb3J0YW50fS51aS52aW9sZXQuYnV0dG9uLC51aS52aW9sZXQuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzY0MzVjOTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS52aW9sZXQuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS52aW9sZXQuYnV0dG9uOmhvdmVyLC51aS52aW9sZXQuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzU4MjliYjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnZpb2xldC5idXR0b246Zm9jdXMsLnVpLnZpb2xldC5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNGYyMGI1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkudmlvbGV0LmJ1dHRvbjphY3RpdmUsLnVpLnZpb2xldC5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzUwMmFhMTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnZpb2xldC5hY3RpdmUuYnV0dG9uLC51aS52aW9sZXQuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkudmlvbGV0LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLnZpb2xldC5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM1NjI2YmY7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy52aW9sZXQuYnV0dG9uLC51aS5iYXNpYy52aW9sZXQuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzY0MzVjOSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzY0MzVjOSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzY0MzVjOSFpbXBvcnRhbnR9LnVpLmJhc2ljLnZpb2xldC5idXR0b246aG92ZXIsLnVpLmJhc2ljLnZpb2xldC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzU4MjliYiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzU4MjliYiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU4MjliYiFpbXBvcnRhbnR9LnVpLmJhc2ljLnZpb2xldC5idXR0b246Zm9jdXMsLnVpLmJhc2ljLnZpb2xldC5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzRmMjBiNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzRmMjBiNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU4MjliYiFpbXBvcnRhbnR9LnVpLmJhc2ljLnZpb2xldC5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy52aW9sZXQuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjNTYyNmJmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjNTYyNmJmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTAyYWExIWltcG9ydGFudH0udWkuYmFzaWMudmlvbGV0LmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLnZpb2xldC5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzUwMmFhMSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzUwMmFhMSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzUwMmFhMSFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnZpb2xldC5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbiwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2EyOTFmYiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2EyOTFmYiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2EyOTFmYn0udWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnZpb2xldC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM4YTczZmZ9LnVpLmludmVydGVkLnZpb2xldC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojN2Q2NGZmfS51aS5pbnZlcnRlZC52aW9sZXQuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZC1jb2xvcjojOGE3M2ZmfS51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudmlvbGV0LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojNzg2MGY5fS51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9uLC51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzhhNzNmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzhhNzNmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2EyOTFmYiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnZpb2xldC5iYXNpYy5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnZpb2xldC5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjN2Q2NGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjN2Q2NGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojYTI5MWZiIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnZpb2xldC5iYXNpYy5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC52aW9sZXQuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM4YTczZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM4YTczZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNhMjkxZmIhaW1wb3J0YW50fS51aS5pbnZlcnRlZC52aW9sZXQuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudmlvbGV0LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnZpb2xldC5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzc4NjBmOSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzc4NjBmOSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2EyOTFmYiFpbXBvcnRhbnR9LnVpLnB1cnBsZS5idXR0b24sLnVpLnB1cnBsZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojYTMzM2M4O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnB1cnBsZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLnB1cnBsZS5idXR0b246aG92ZXIsLnVpLnB1cnBsZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojOTYyN2JhO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucHVycGxlLmJ1dHRvbjpmb2N1cywudWkucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiM4ZjFlYjQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5wdXJwbGUuYnV0dG9uOmFjdGl2ZSwudWkucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojODIyOTlmO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucHVycGxlLmFjdGl2ZS5idXR0b24sLnVpLnB1cnBsZS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5wdXJwbGUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkucHVycGxlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6Izk3MjRiZTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLmJhc2ljLnB1cnBsZS5idXR0b24sLnVpLmJhc2ljLnB1cnBsZS5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTMzM2M4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTMzM2M4IGluc2V0IWltcG9ydGFudDtjb2xvcjojYTMzM2M4IWltcG9ydGFudH0udWkuYmFzaWMucHVycGxlLmJ1dHRvbjpob3ZlciwudWkuYmFzaWMucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOTYyN2JhIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOTYyN2JhIGluc2V0IWltcG9ydGFudDtjb2xvcjojOTYyN2JhIWltcG9ydGFudH0udWkuYmFzaWMucHVycGxlLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjOGYxZWI0IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOGYxZWI0IGluc2V0IWltcG9ydGFudDtjb2xvcjojOTYyN2JhIWltcG9ydGFudH0udWkuYmFzaWMucHVycGxlLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnB1cnBsZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM5NzI0YmUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM5NzI0YmUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM4MjI5OWYhaW1wb3J0YW50fS51aS5iYXNpYy5wdXJwbGUuYnV0dG9uOmFjdGl2ZSwudWkuYmFzaWMucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjODIyOTlmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjODIyOTlmIGluc2V0IWltcG9ydGFudDtjb2xvcjojODIyOTlmIWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucHVycGxlLmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9uLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZGM3M2ZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZGM3M2ZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojZGM3M2ZmfS51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2Q2NWFmZn0udWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiNkMjRhZmZ9LnVpLmludmVydGVkLnB1cnBsZS5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNkNjVhZmZ9LnVpLmludmVydGVkLnB1cnBsZS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5wdXJwbGUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNjZjQwZmZ9LnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZDY1YWZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZDY1YWZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojZGM3M2ZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucHVycGxlLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucHVycGxlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNkMjRhZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNkMjRhZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkYzczZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucHVycGxlLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnB1cnBsZS5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Q2NWFmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Q2NWFmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2RjNzNmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnB1cnBsZS5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5wdXJwbGUuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHVycGxlLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjY2Y0MGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjY2Y0MGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojZGM3M2ZmIWltcG9ydGFudH0udWkucmVkLmJ1dHRvbiwudWkucmVkLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4Mjg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkucmVkLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkucmVkLmJ1dHRvbjpob3ZlciwudWkucmVkLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNkMDE5MTk7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5yZWQuYnV0dG9uOmZvY3VzLC51aS5yZWQuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2NhMTAxMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnJlZC5idXR0b246YWN0aXZlLC51aS5yZWQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiMjFlMWU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5yZWQuYWN0aXZlLmJ1dHRvbiwudWkucmVkLmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLnJlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5yZWQuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojZDQxNTE1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMucmVkLmJ1dHRvbiwudWkuYmFzaWMucmVkLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkYjI4MjggaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkYjI4MjggaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkYjI4MjghaW1wb3J0YW50fS51aS5iYXNpYy5yZWQuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5yZWQuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkMDE5MTkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkMDE5MTkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkMDE5MTkhaW1wb3J0YW50fS51aS5iYXNpYy5yZWQuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5yZWQuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNjYTEwMTAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNjYTEwMTAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkMDE5MTkhaW1wb3J0YW50fS51aS5iYXNpYy5yZWQuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMucmVkLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0MTUxNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2Q0MTUxNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2IyMWUxZSFpbXBvcnRhbnR9LnVpLmJhc2ljLnJlZC5idXR0b246YWN0aXZlLC51aS5iYXNpYy5yZWQuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNiMjFlMWUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNiMjFlMWUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNiMjFlMWUhaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5yZWQuYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi1sZWZ0Oi0xcHh9LnVpLmludmVydGVkLnJlZC5idXR0b24sLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjY5NWUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjY5NWUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjY5NWV9LnVpLmludmVydGVkLnJlZC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnJlZC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY1MTQ0fS51aS5pbnZlcnRlZC5yZWQuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2ZmNDMzNX0udWkuaW52ZXJ0ZWQucmVkLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2ZmNTE0NH0udWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnJlZC5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2ZmMzkyYn0udWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjUxNDQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjUxNDQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjY5NWUhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5yZWQuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5yZWQuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmNDMzNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmNDMzNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmNjk1ZSFpbXBvcnRhbnR9LnVpLmludmVydGVkLnJlZC5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5yZWQuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucmVkLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmY1MTQ0IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmY1MTQ0IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmY2OTVlIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucmVkLmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnJlZC5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5yZWQuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjM5MmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZjM5MmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZjY5NWUhaW1wb3J0YW50fS51aS50ZWFsLmJ1dHRvbiwudWkudGVhbC5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMDBiNWFkO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnRlYWwuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS50ZWFsLmJ1dHRvbjpob3ZlciwudWkudGVhbC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMDA5Yzk1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkudGVhbC5idXR0b246Zm9jdXMsLnVpLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzAwOGM4Njtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnRlYWwuYnV0dG9uOmFjdGl2ZSwudWkudGVhbC5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzAwODI3Yztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnRlYWwuYWN0aXZlLmJ1dHRvbiwudWkudGVhbC5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS50ZWFsLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLnRlYWwuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMDA5Yzk1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMudGVhbC5idXR0b24sLnVpLmJhc2ljLnRlYWwuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzAwYjVhZCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzAwYjVhZCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzAwYjVhZCFpbXBvcnRhbnR9LnVpLmJhc2ljLnRlYWwuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy50ZWFsLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMDA5Yzk1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMDA5Yzk1IGluc2V0IWltcG9ydGFudDtjb2xvcjojMDA5Yzk1IWltcG9ydGFudH0udWkuYmFzaWMudGVhbC5idXR0b246Zm9jdXMsLnVpLmJhc2ljLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMwMDhjODYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMwMDhjODYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMwMDljOTUhaW1wb3J0YW50fS51aS5iYXNpYy50ZWFsLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnRlYWwuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMDA5Yzk1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMDA5Yzk1IGluc2V0IWltcG9ydGFudDtjb2xvcjojMDA4MjdjIWltcG9ydGFudH0udWkuYmFzaWMudGVhbC5idXR0b246YWN0aXZlLC51aS5iYXNpYy50ZWFsLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMDA4MjdjIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMDA4MjdjIGluc2V0IWltcG9ydGFudDtjb2xvcjojMDA4MjdjIWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMudGVhbC5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQudGVhbC5idXR0b24sLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNmRmZmZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNmRmZmZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNmRmZmZmfS51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnRlYWwuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNTRmZmZmfS51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojNGZmfS51aS5pbnZlcnRlZC50ZWFsLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM1NGZmZmZ9LnVpLmludmVydGVkLnRlYWwuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzNhZmZmZn0udWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLnRlYWwuYmFzaWMuYnV0dG9ucyAuYnV0dG9uLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnRlYWwuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC50ZWFsLmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM1NGZmZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM1NGZmZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM2ZGZmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC50ZWFsLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5idXR0b25zIC5idXR0b246Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNmRmZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGVhbC5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC50ZWFsLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnRlYWwuYnV0dG9ucyAuYmFzaWMuYWN0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM1NGZmZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM1NGZmZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM2ZGZmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC50ZWFsLmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnRlYWwuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQudGVhbC5idXR0b25zIC5iYXNpYy5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzNhZmZmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzNhZmZmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzZkZmZmZiFpbXBvcnRhbnR9LnVpLm9saXZlLmJ1dHRvbiwudWkub2xpdmUuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2I1Y2MxODtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS5vbGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLm9saXZlLmJ1dHRvbjpob3ZlciwudWkub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2E3YmQwZDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm9saXZlLmJ1dHRvbjpmb2N1cywudWkub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2EwYjYwNTtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLm9saXZlLmJ1dHRvbjphY3RpdmUsLnVpLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojOGQ5ZTEzO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkub2xpdmUuYWN0aXZlLmJ1dHRvbiwudWkub2xpdmUuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkub2xpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkub2xpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojYWFjMTA5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMub2xpdmUuYnV0dG9uLC51aS5iYXNpYy5vbGl2ZS5idXR0b25zIC5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYjVjYzE4IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYjVjYzE4IGluc2V0IWltcG9ydGFudDtjb2xvcjojYjVjYzE4IWltcG9ydGFudH0udWkuYmFzaWMub2xpdmUuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5vbGl2ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2E3YmQwZCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2E3YmQwZCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2E3YmQwZCFpbXBvcnRhbnR9LnVpLmJhc2ljLm9saXZlLmJ1dHRvbjpmb2N1cywudWkuYmFzaWMub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhMGI2MDUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNhMGI2MDUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNhN2JkMGQhaW1wb3J0YW50fS51aS5iYXNpYy5vbGl2ZS5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy5vbGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhYWMxMDkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNhYWMxMDkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM4ZDllMTMhaW1wb3J0YW50fS51aS5iYXNpYy5vbGl2ZS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5vbGl2ZS5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzhkOWUxMyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzhkOWUxMyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzhkOWUxMyFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLm9saXZlLmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b24sLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Q5ZTc3OCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Q5ZTc3OCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q5ZTc3OH0udWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5pbnZlcnRlZC5vbGl2ZS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNkOGVhNWN9LnVpLmludmVydGVkLm9saXZlLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2RhZWY0N30udWkuaW52ZXJ0ZWQub2xpdmUuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiNkYWVkNTl9LnVpLmludmVydGVkLm9saXZlLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojY2RkZjRkfS51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vbGl2ZS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Q4ZWE1YyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Q4ZWE1YyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q5ZTc3OCFpbXBvcnRhbnR9LnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQub2xpdmUuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2RhZWY0NyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2RhZWY0NyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2Q5ZTc3OCFpbXBvcnRhbnR9LnVpLmludmVydGVkLm9saXZlLmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLm9saXZlLmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLm9saXZlLmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZGFlZDU5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZGFlZDU5IGluc2V0IWltcG9ydGFudDtjb2xvcjojZDllNzc4IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQub2xpdmUuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQub2xpdmUuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQub2xpdmUuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNjZGRmNGQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNjZGRmNGQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkOWU3NzghaW1wb3J0YW50fS51aS55ZWxsb3cuYnV0dG9uLC51aS55ZWxsb3cuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2ZiYmQwODtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmU7YmFja2dyb3VuZC1pbWFnZTpub25lfS51aS55ZWxsb3cuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS55ZWxsb3cuYnV0dG9uOmhvdmVyLC51aS55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2VhYWUwMDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnllbGxvdy5idXR0b246Zm9jdXMsLnVpLnllbGxvdy5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojZGFhMzAwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkueWVsbG93LmJ1dHRvbjphY3RpdmUsLnVpLnllbGxvdy5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2NkOTkwMztjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnllbGxvdy5hY3RpdmUuYnV0dG9uLC51aS55ZWxsb3cuYnV0dG9uIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZSwudWkueWVsbG93LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLnllbGxvdy5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNlYWFlMDA7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy55ZWxsb3cuYnV0dG9uLC51aS5iYXNpYy55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2ZiYmQwOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2ZiYmQwOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZiYmQwOCFpbXBvcnRhbnR9LnVpLmJhc2ljLnllbGxvdy5idXR0b246aG92ZXIsLnVpLmJhc2ljLnllbGxvdy5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2VhYWUwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2VhYWUwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2VhYWUwMCFpbXBvcnRhbnR9LnVpLmJhc2ljLnllbGxvdy5idXR0b246Zm9jdXMsLnVpLmJhc2ljLnllbGxvdy5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2RhYTMwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2RhYTMwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2VhYWUwMCFpbXBvcnRhbnR9LnVpLmJhc2ljLnllbGxvdy5hY3RpdmUuYnV0dG9uLC51aS5iYXNpYy55ZWxsb3cuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZWFhZTAwIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZWFhZTAwIGluc2V0IWltcG9ydGFudDtjb2xvcjojY2Q5OTAzIWltcG9ydGFudH0udWkuYmFzaWMueWVsbG93LmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLnllbGxvdy5idXR0b25zIC5idXR0b246YWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2NkOTkwMyBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2NkOTkwMyBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2NkOTkwMyFpbXBvcnRhbnR9LnVpLmJ1dHRvbnM6bm90KC52ZXJ0aWNhbCk+LmJhc2ljLnllbGxvdy5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbiwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2ZmZTIxZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2ZmZTIxZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZTIxZn0udWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnllbGxvdy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuNil9LnVpLmludmVydGVkLnllbGxvdy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZkZjA1fS51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6I2Y1ZDUwMH0udWkuaW52ZXJ0ZWQueWVsbG93LmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6I2ZmZGYwNX0udWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnllbGxvdy5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6I2ViY2QwMH0udWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbiwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNmZmRmMDUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNmZmRmMDUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmUyMWYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC55ZWxsb3cuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC55ZWxsb3cuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmZvY3Vzey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggI2Y1ZDUwMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggI2Y1ZDUwMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZTIxZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC55ZWxsb3cuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQueWVsbG93LmJ1dHRvbnMgLmJhc2ljLmFjdGl2ZS5idXR0b257LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjZmZkZjA1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjZmZkZjA1IGluc2V0IWltcG9ydGFudDtjb2xvcjojZmZlMjFmIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQueWVsbG93LmJhc2ljLmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnllbGxvdy5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC55ZWxsb3cuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICNlYmNkMDAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICNlYmNkMDAgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmUyMWYhaW1wb3J0YW50fS51aS5wcmltYXJ5LmJ1dHRvbiwudWkucHJpbWFyeS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnByaW1hcnkuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS5wcmltYXJ5LmJ1dHRvbjpob3ZlciwudWkucHJpbWFyeS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTY3OGMyO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucHJpbWFyeS5idXR0b246Zm9jdXMsLnVpLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzBkNzFiYjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnByaW1hcnkuYnV0dG9uOmFjdGl2ZSwudWkucHJpbWFyeS5idXR0b25zIC5idXR0b246YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzFhNjlhNDtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnByaW1hcnkuYWN0aXZlLmJ1dHRvbiwudWkucHJpbWFyeS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5wcmltYXJ5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLnByaW1hcnkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMTI3OWM2O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMucHJpbWFyeS5idXR0b24sLnVpLmJhc2ljLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzIxODVkMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzIxODVkMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzIxODVkMCFpbXBvcnRhbnR9LnVpLmJhc2ljLnByaW1hcnkuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTY3OGMyIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTY3OGMyIGluc2V0IWltcG9ydGFudDtjb2xvcjojMTY3OGMyIWltcG9ydGFudH0udWkuYmFzaWMucHJpbWFyeS5idXR0b246Zm9jdXMsLnVpLmJhc2ljLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMwZDcxYmIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMwZDcxYmIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxNjc4YzIhaW1wb3J0YW50fS51aS5iYXNpYy5wcmltYXJ5LmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnByaW1hcnkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTI3OWM2IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTI3OWM2IGluc2V0IWltcG9ydGFudDtjb2xvcjojMWE2OWE0IWltcG9ydGFudH0udWkuYmFzaWMucHJpbWFyeS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMWE2OWE0IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMWE2OWE0IGluc2V0IWltcG9ydGFudDtjb2xvcjojMWE2OWE0IWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucHJpbWFyeS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b24sLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNTRjOGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNTRjOGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmfS51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbi5hY3RpdmUsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzYWMwZmZ9LnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiMyYmJiZmZ9LnVpLmludmVydGVkLnByaW1hcnkuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5hY3RpdmUuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6IzNhYzBmZn0udWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMjFiOGZmfS51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYmFzaWMuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgyNTUsMjU1LDI1NSwuNSkgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmJ1dHRvbjpob3ZlciwudWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnByaW1hcnkuYnV0dG9ucyAuYmFzaWMuYnV0dG9uOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnByaW1hcnkuYmFzaWMuYnV0dG9uOmZvY3VzLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICMyYmJiZmYgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICMyYmJiZmYgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NGM4ZmYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wcmltYXJ5LmJhc2ljLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnByaW1hcnkuYmFzaWMuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQucHJpbWFyeS5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzNhYzBmZiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnByaW1hcnkuYmFzaWMuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQucHJpbWFyeS5iYXNpYy5idXR0b25zIC5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5wcmltYXJ5LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjMjFiOGZmIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjMjFiOGZmIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTRjOGZmIWltcG9ydGFudH0udWkuc2Vjb25kYXJ5LmJ1dHRvbiwudWkuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQ7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lO2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWkuc2Vjb25kYXJ5LmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkuc2Vjb25kYXJ5LmJ1dHRvbjpob3ZlciwudWkuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMyNzI5MmE7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5zZWNvbmRhcnkuYnV0dG9uOmZvY3VzLC51aS5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQtY29sb3I6IzJlMzAzMjtjb2xvcjojZmZmO3RleHQtc2hhZG93Om5vbmV9LnVpLnNlY29uZGFyeS5idXR0b246YWN0aXZlLC51aS5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMzNDM2Mzc7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5zZWNvbmRhcnkuYWN0aXZlLmJ1dHRvbiwudWkuc2Vjb25kYXJ5LmJ1dHRvbiAuYWN0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLnNlY29uZGFyeS5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5zZWNvbmRhcnkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjojMjcyOTJhO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbiwudWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxYjFjMWQgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxYjFjMWQgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMxYjFjMWQhaW1wb3J0YW50fS51aS5iYXNpYy5zZWNvbmRhcnkuYnV0dG9uOmhvdmVyLC51aS5iYXNpYy5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyNzI5MmEgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyNzI5MmEgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyNzI5MmEhaW1wb3J0YW50fS51aS5iYXNpYy5zZWNvbmRhcnkuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmZvY3Vze2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyZTMwMzIgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyZTMwMzIgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyNzI5MmEhaW1wb3J0YW50fS51aS5iYXNpYy5zZWNvbmRhcnkuYWN0aXZlLmJ1dHRvbiwudWkuYmFzaWMuc2Vjb25kYXJ5LmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzI3MjkyYSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzI3MjkyYSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzM0MzYzNyFpbXBvcnRhbnR9LnVpLmJhc2ljLnNlY29uZGFyeS5idXR0b246YWN0aXZlLC51aS5iYXNpYy5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMzNDM2MzcgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMzNDM2MzcgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMzNDM2MzchaW1wb3J0YW50fS51aS5idXR0b25zOm5vdCgudmVydGljYWwpPi5iYXNpYy5wcmltYXJ5LmJ1dHRvbjpub3QoOmZpcnN0LWNoaWxkKXttYXJnaW4tbGVmdDotMXB4fS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9uLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9ue2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNTQ1NDU0IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNTQ1NDU0IGluc2V0IWltcG9ydGFudDtjb2xvcjojNTQ1NDU0fS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9uLmFjdGl2ZSwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbjphY3RpdmUsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b246Zm9jdXMsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5idXR0b24uYWN0aXZlLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpob3Zlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9uOmhvdmVyLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzYxNjE2MX0udWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOiM2ODY4Njh9LnVpLmludmVydGVkLnNlY29uZGFyeS5hY3RpdmUuYnV0dG9uLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYWN0aXZlLmJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjF9LnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiM2ZTZlNmV9LnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b24sLnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b25zIC5idXR0b24sLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5iYXNpYy5idXR0b257YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4IHJnYmEoMjU1LDI1NSwyNTUsLjUpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCByZ2JhKDI1NSwyNTUsMjU1LC41KSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b25zIC5idXR0b246aG92ZXIsLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5iYXNpYy5idXR0b246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNjE2MTYxIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNjE2MTYxIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTQ1NDU0IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJhc2ljLmJ1dHRvbjpmb2N1cywudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJhc2ljLmJ1dHRvbnMgLmJ1dHRvbjpmb2N1c3std2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMnB4ICM2ODY4NjggaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMnB4ICM2ODY4NjggaW5zZXQhaW1wb3J0YW50O2NvbG9yOiM1NDU0NTQhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYWN0aXZlLmJ1dHRvbiwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJhc2ljLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b24sLnVpLmludmVydGVkLnNlY29uZGFyeS5idXR0b25zIC5iYXNpYy5hY3RpdmUuYnV0dG9uey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAycHggIzYxNjE2MSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAycHggIzYxNjE2MSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9LnVpLmludmVydGVkLnNlY29uZGFyeS5iYXNpYy5idXR0b246YWN0aXZlLC51aS5pbnZlcnRlZC5zZWNvbmRhcnkuYmFzaWMuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZSwudWkuaW52ZXJ0ZWQuc2Vjb25kYXJ5LmJ1dHRvbnMgLmJhc2ljLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDJweCAjNmU2ZTZlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDJweCAjNmU2ZTZlIGluc2V0IWltcG9ydGFudDtjb2xvcjojNTQ1NDU0IWltcG9ydGFudH0udWkucG9zaXRpdmUuYnV0dG9uLC51aS5wb3NpdGl2ZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLnBvc2l0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkucG9zaXRpdmUuYnV0dG9uOmhvdmVyLC51aS5wb3NpdGl2ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMTZhYjM5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucG9zaXRpdmUuYnV0dG9uOmZvY3VzLC51aS5wb3NpdGl2ZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojMGVhNDMyO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkucG9zaXRpdmUuYnV0dG9uOmFjdGl2ZSwudWkucG9zaXRpdmUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxOThmMzU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5wb3NpdGl2ZS5hY3RpdmUuYnV0dG9uLC51aS5wb3NpdGl2ZS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5wb3NpdGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5wb3NpdGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiMxM2FlMzg7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b24sLnVpLmJhc2ljLnBvc2l0aXZlLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyMWJhNDUgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMyMWJhNDUgaW5zZXQhaW1wb3J0YW50O2NvbG9yOiMyMWJhNDUhaW1wb3J0YW50fS51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b246aG92ZXIsLnVpLmJhc2ljLnBvc2l0aXZlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTZhYjM5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTZhYjM5IGluc2V0IWltcG9ydGFudDtjb2xvcjojMTZhYjM5IWltcG9ydGFudH0udWkuYmFzaWMucG9zaXRpdmUuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5wb3NpdGl2ZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzBlYTQzMiBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzBlYTQzMiBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE2YWIzOSFpbXBvcnRhbnR9LnVpLmJhc2ljLnBvc2l0aXZlLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLnBvc2l0aXZlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzEzYWUzOCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggIzEzYWUzOCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6IzE5OGYzNSFpbXBvcnRhbnR9LnVpLmJhc2ljLnBvc2l0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLnBvc2l0aXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjMTk4ZjM1IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTk4ZjM1IGluc2V0IWltcG9ydGFudDtjb2xvcjojMTk4ZjM1IWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucHJpbWFyeS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkubmVnYXRpdmUuYnV0dG9uLC51aS5uZWdhdGl2ZS5idXR0b25zIC5idXR0b257YmFja2dyb3VuZC1jb2xvcjojZGIyODI4O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLm5lZ2F0aXZlLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkubmVnYXRpdmUuYnV0dG9uOmhvdmVyLC51aS5uZWdhdGl2ZS5idXR0b25zIC5idXR0b246aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZDAxOTE5O2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkubmVnYXRpdmUuYnV0dG9uOmZvY3VzLC51aS5uZWdhdGl2ZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjojY2ExMDEwO2NvbG9yOiNmZmY7dGV4dC1zaGFkb3c6bm9uZX0udWkubmVnYXRpdmUuYnV0dG9uOmFjdGl2ZSwudWkubmVnYXRpdmUuYnV0dG9ucyAuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNiMjFlMWU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5uZWdhdGl2ZS5hY3RpdmUuYnV0dG9uLC51aS5uZWdhdGl2ZS5idXR0b24gLmFjdGl2ZS5idXR0b246YWN0aXZlLC51aS5uZWdhdGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uLC51aS5uZWdhdGl2ZS5idXR0b25zIC5hY3RpdmUuYnV0dG9uOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOiNkNDE1MTU7Y29sb3I6I2ZmZjt0ZXh0LXNoYWRvdzpub25lfS51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b24sLnVpLmJhc2ljLm5lZ2F0aXZlLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkYjI4MjggaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkYjI4MjggaW5zZXQhaW1wb3J0YW50O2NvbG9yOiNkYjI4MjghaW1wb3J0YW50fS51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b246aG92ZXIsLnVpLmJhc2ljLm5lZ2F0aXZlLmJ1dHRvbnMgLmJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZDAxOTE5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjZDAxOTE5IGluc2V0IWltcG9ydGFudDtjb2xvcjojZDAxOTE5IWltcG9ydGFudH0udWkuYmFzaWMubmVnYXRpdmUuYnV0dG9uOmZvY3VzLC51aS5iYXNpYy5uZWdhdGl2ZS5idXR0b25zIC5idXR0b246Zm9jdXN7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2NhMTAxMCBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2NhMTAxMCBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2QwMTkxOSFpbXBvcnRhbnR9LnVpLmJhc2ljLm5lZ2F0aXZlLmFjdGl2ZS5idXR0b24sLnVpLmJhc2ljLm5lZ2F0aXZlLmJ1dHRvbnMgLmFjdGl2ZS5idXR0b257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0MTUxNSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2Q0MTUxNSBpbnNldCFpbXBvcnRhbnQ7Y29sb3I6I2IyMWUxZSFpbXBvcnRhbnR9LnVpLmJhc2ljLm5lZ2F0aXZlLmJ1dHRvbjphY3RpdmUsLnVpLmJhc2ljLm5lZ2F0aXZlLmJ1dHRvbnMgLmJ1dHRvbjphY3RpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYjIxZTFlIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYjIxZTFlIGluc2V0IWltcG9ydGFudDtjb2xvcjojYjIxZTFlIWltcG9ydGFudH0udWkuYnV0dG9uczpub3QoLnZlcnRpY2FsKT4uYmFzaWMucHJpbWFyeS5idXR0b246bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLWxlZnQ6LTFweH0udWkuYnV0dG9uc3tkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWJveDtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4Oy13ZWJraXQtYm94LW9yaWVudDpob3Jpem9udGFsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LWRpcmVjdGlvbjpyb3c7Zm9udC1zaXplOjA7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7bWFyZ2luOjAgLjI1ZW0gMCAwfS51aS5idXR0b25zOm5vdCguYmFzaWMpOm5vdCguaW52ZXJ0ZWQpey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuYnV0dG9uczphZnRlcntjb250ZW50OlxcXCIuXFxcIjtkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59LnVpLmJ1dHRvbnMgLmJ1dHRvbnstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MSAwIGF1dG87ZmxleDoxIDAgYXV0bzttYXJnaW46MDtib3JkZXItcmFkaXVzOjA7bWFyZ2luOjB9LnVpLmJ1dHRvbnM6bm90KC5iYXNpYyk6bm90KC5pbnZlcnRlZCk+LmJ1dHRvbiwudWkuYnV0dG9ucz4udWkuYnV0dG9uOm5vdCguYmFzaWMpOm5vdCguaW52ZXJ0ZWQpey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQgaW5zZXQsMCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLmJ1dHRvbnMgLmJ1dHRvbjpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDpub25lO21hcmdpbi1sZWZ0OjA7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czouMjg1NzE0MjlyZW07Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLmJ1dHRvbnN7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWkudmVydGljYWwuYnV0dG9ucyAuYnV0dG9ue2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bm9uZTt3aWR0aDoxMDAlO21hcmdpbjowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXItcmFkaXVzOjB9LnVpLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbjpmaXJzdC1jaGlsZHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbjpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLmJ1dHRvbnMgLmJ1dHRvbjpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBDb250YWluZXJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5jb250YWluZXJ7ZGlzcGxheTpibG9jazttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnR9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuY29udGFpbmVye3dpZHRoOmF1dG8haW1wb3J0YW50O21hcmdpbi1sZWZ0OjFlbSFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjFlbSFpbXBvcnRhbnR9LnVpLmdyaWQuY29udGFpbmVye3dpZHRoOmF1dG8haW1wb3J0YW50fS51aS5yZWxheGVkLmdyaWQuY29udGFpbmVye3dpZHRoOmF1dG8haW1wb3J0YW50fS51aS52ZXJ5LnJlbGF4ZWQuZ3JpZC5jb250YWluZXJ7d2lkdGg6YXV0byFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS5jb250YWluZXJ7d2lkdGg6NzIzcHg7bWFyZ2luLWxlZnQ6YXV0byFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OmF1dG8haW1wb3J0YW50fS51aS5ncmlkLmNvbnRhaW5lcnt3aWR0aDpjYWxjKDcyM3B4ICsgMnJlbSkhaW1wb3J0YW50fS51aS5yZWxheGVkLmdyaWQuY29udGFpbmVye3dpZHRoOmNhbGMoNzIzcHggKyAzcmVtKSFpbXBvcnRhbnR9LnVpLnZlcnkucmVsYXhlZC5ncmlkLmNvbnRhaW5lcnt3aWR0aDpjYWxjKDcyM3B4ICsgNXJlbSkhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnVpLmNvbnRhaW5lcnt3aWR0aDo5MzNweDttYXJnaW4tbGVmdDphdXRvIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6YXV0byFpbXBvcnRhbnR9LnVpLmdyaWQuY29udGFpbmVye3dpZHRoOmNhbGMoOTMzcHggKyAycmVtKSFpbXBvcnRhbnR9LnVpLnJlbGF4ZWQuZ3JpZC5jb250YWluZXJ7d2lkdGg6Y2FsYyg5MzNweCArIDNyZW0pIWltcG9ydGFudH0udWkudmVyeS5yZWxheGVkLmdyaWQuY29udGFpbmVye3dpZHRoOmNhbGMoOTMzcHggKyA1cmVtKSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMjAwcHgpey51aS5jb250YWluZXJ7d2lkdGg6MTEyN3B4O21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50O21hcmdpbi1yaWdodDphdXRvIWltcG9ydGFudH0udWkuZ3JpZC5jb250YWluZXJ7d2lkdGg6Y2FsYygxMTI3cHggKyAycmVtKSFpbXBvcnRhbnR9LnVpLnJlbGF4ZWQuZ3JpZC5jb250YWluZXJ7d2lkdGg6Y2FsYygxMTI3cHggKyAzcmVtKSFpbXBvcnRhbnR9LnVpLnZlcnkucmVsYXhlZC5ncmlkLmNvbnRhaW5lcnt3aWR0aDpjYWxjKDExMjdweCArIDVyZW0pIWltcG9ydGFudH19LnVpLnRleHQuY29udGFpbmVye2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjttYXgtd2lkdGg6NzAwcHghaW1wb3J0YW50O2xpbmUtaGVpZ2h0OjEuNX0udWkudGV4dC5jb250YWluZXJ7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmZsdWlkLmNvbnRhaW5lcnt3aWR0aDoxMDAlfS51aVtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLmNvbnRhaW5lcnt0ZXh0LWFsaWduOmxlZnR9LnVpW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXS5jb250YWluZXJ7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmNvbnRhaW5lcnt0ZXh0LWFsaWduOnJpZ2h0fS51aS5qdXN0aWZpZWQuY29udGFpbmVye3RleHQtYWxpZ246anVzdGlmeTstd2Via2l0LWh5cGhlbnM6YXV0bzstbXMtaHlwaGVuczphdXRvO2h5cGhlbnM6YXV0b30vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gRGl2aWRlclxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmRpdmlkZXJ7bWFyZ2luOjFyZW0gMDtsaW5lLWhlaWdodDoxO2hlaWdodDowO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6LjA1ZW07Y29sb3I6cmdiYSgwLDAsMCwuODUpOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLmRpdmlkZXI6bm90KC52ZXJ0aWNhbCk6bm90KC5ob3Jpem9udGFsKXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLmdyaWQ+LmNvbHVtbisuZGl2aWRlciwudWkuZ3JpZD4ucm93Pi5jb2x1bW4rLmRpdmlkZXJ7bGVmdDphdXRvfS51aS5ob3Jpem9udGFsLmRpdmlkZXJ7ZGlzcGxheTp0YWJsZTt3aGl0ZS1zcGFjZTpub3dyYXA7aGVpZ2h0OmF1dG87bWFyZ2luOicnO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLmhvcml6b250YWwuZGl2aWRlcjphZnRlciwudWkuaG9yaXpvbnRhbC5kaXZpZGVyOmJlZm9yZXtjb250ZW50OicnO2Rpc3BsYXk6dGFibGUtY2VsbDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6NTAlO3dpZHRoOjUwJTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LnVpLmhvcml6b250YWwuZGl2aWRlcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCAxZW0gdG9wIDUwJX0udWkuaG9yaXpvbnRhbC5kaXZpZGVyOmFmdGVye2JhY2tncm91bmQtcG9zaXRpb246bGVmdCAxZW0gdG9wIDUwJX0udWkudmVydGljYWwuZGl2aWRlcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6YXV0bztoZWlnaHQ6NTAlO2xpbmUtaGVpZ2h0OjA7dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKX0udWkudmVydGljYWwuZGl2aWRlcjphZnRlciwudWkudmVydGljYWwuZGl2aWRlcjpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7Y29udGVudDonJzt6LWluZGV4OjM7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjEpO3dpZHRoOjAlO2hlaWdodDpjYWxjKDEwMCUgLSAxcmVtKX0udWkudmVydGljYWwuZGl2aWRlcjpiZWZvcmV7dG9wOi0xMDAlfS51aS52ZXJ0aWNhbC5kaXZpZGVyOmFmdGVye3RvcDphdXRvO2JvdHRvbTowfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLmdyaWQgLnN0YWNrYWJsZS5yb3cgLnVpLnZlcnRpY2FsLmRpdmlkZXIsLnVpLnN0YWNrYWJsZS5ncmlkIC51aS52ZXJ0aWNhbC5kaXZpZGVye2Rpc3BsYXk6dGFibGU7d2hpdGUtc3BhY2U6bm93cmFwO2hlaWdodDphdXRvO21hcmdpbjonJztvdmVyZmxvdzpoaWRkZW47bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9LnVpLmdyaWQgLnN0YWNrYWJsZS5yb3cgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YWZ0ZXIsLnVpLmdyaWQgLnN0YWNrYWJsZS5yb3cgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YmVmb3JlLC51aS5zdGFja2FibGUuZ3JpZCAudWkudmVydGljYWwuZGl2aWRlcjphZnRlciwudWkuc3RhY2thYmxlLmdyaWQgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YmVmb3Jle3Bvc2l0aW9uOnN0YXRpYztsZWZ0OjA7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtjb250ZW50OicnO2Rpc3BsYXk6dGFibGUtY2VsbDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6NTAlO3dpZHRoOjUwJTtiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXR9LnVpLmdyaWQgLnN0YWNrYWJsZS5yb3cgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YmVmb3JlLC51aS5zdGFja2FibGUuZ3JpZCAudWkudmVydGljYWwuZGl2aWRlcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjpyaWdodCAxZW0gdG9wIDUwJX0udWkuZ3JpZCAuc3RhY2thYmxlLnJvdyAudWkudmVydGljYWwuZGl2aWRlcjphZnRlciwudWkuc3RhY2thYmxlLmdyaWQgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YWZ0ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjpsZWZ0IDFlbSB0b3AgNTAlfX0udWkuZGl2aWRlcj4uaWNvbnttYXJnaW46MDtmb250LXNpemU6MXJlbTtoZWlnaHQ6MWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuaGlkZGVuLmRpdmlkZXJ7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuaGlkZGVuLmRpdmlkZXI6YWZ0ZXIsLnVpLmhpZGRlbi5kaXZpZGVyOmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLmRpdmlkZXIuaW52ZXJ0ZWQsLnVpLmhvcml6b250YWwuaW52ZXJ0ZWQuZGl2aWRlciwudWkudmVydGljYWwuaW52ZXJ0ZWQuZGl2aWRlcntjb2xvcjojZmZmfS51aS5kaXZpZGVyLmludmVydGVkLC51aS5kaXZpZGVyLmludmVydGVkOmFmdGVyLC51aS5kaXZpZGVyLmludmVydGVkOmJlZm9yZXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjE1KSFpbXBvcnRhbnQ7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpIWltcG9ydGFudDtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjE1KSFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjE1KSFpbXBvcnRhbnR9LnVpLmZpdHRlZC5kaXZpZGVye21hcmdpbjowfS51aS5jbGVhcmluZy5kaXZpZGVye2NsZWFyOmJvdGh9LnVpLnNlY3Rpb24uZGl2aWRlcnttYXJnaW4tdG9wOjJyZW07bWFyZ2luLWJvdHRvbToycmVtfS51aS5kaXZpZGVye2ZvbnQtc2l6ZToxcmVtfS51aS5ob3Jpem9udGFsLmRpdmlkZXI6YWZ0ZXIsLnVpLmhvcml6b250YWwuZGl2aWRlcjpiZWZvcmV7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUJhQUFBQUFDQ0FZQUFBQ3VUSHVLQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5RnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5TMWpNREUwSURjNUxqRTFNVFE0TVN3Z01qQXhNeTh3TXk4eE15MHhNam93T1RveE5TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJQ2hYYVc1a2IzZHpLU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG8xT1RoQlJEWTRPVU5ETVRZeE1VVTBPVUUzTlVWR09FSkRNek16TWpFMk55SWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzFPVGhCUkRZNFFVTkRNVFl4TVVVME9VRTNOVVZHT0VKRE16TXpNakUyTnlJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09qVTVPRUZFTmpnM1EwTXhOakV4UlRRNVFUYzFSVVk0UWtNek16TXlNVFkzSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2pVNU9FRkVOamc0UTBNeE5qRXhSVFE1UVRjMVJVWTRRa016TXpNeU1UWTNJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrVlU1MTNnQUFBRFZKUkVGVWVOcnMwREVOQUNBUUJEQklXTEdCSlFieS9tVWNKbjVzSlhRbU9RTUFBQUFBQUpxdCsycHJBQUFBQUFDZzJ4ZGdBTms2QkVWdUpneU1BQUFBQUVsRlRrU3VRbUNDKX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5ncmlkIC5zdGFja2FibGUucm93IC51aS52ZXJ0aWNhbC5kaXZpZGVyOmFmdGVyLC51aS5ncmlkIC5zdGFja2FibGUucm93IC51aS52ZXJ0aWNhbC5kaXZpZGVyOmJlZm9yZSwudWkuc3RhY2thYmxlLmdyaWQgLnVpLnZlcnRpY2FsLmRpdmlkZXI6YWZ0ZXIsLnVpLnN0YWNrYWJsZS5ncmlkIC51aS52ZXJ0aWNhbC5kaXZpZGVyOmJlZm9yZXtiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQmFBQUFBQUNDQVlBQUFDdVRIdUtBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlGcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1TlMxak1ERTBJRGM1TGpFMU1UUTRNU3dnTWpBeE15OHdNeTh4TXkweE1qb3dPVG94TlNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElDaFhhVzVrYjNkektTSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzFPVGhCUkRZNE9VTkRNVFl4TVVVME9VRTNOVVZHT0VKRE16TXpNakUyTnlJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvMU9UaEJSRFk0UVVORE1UWXhNVVUwT1VFM05VVkdPRUpETXpNek1qRTJOeUkrSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT2pVNU9FRkVOamczUTBNeE5qRXhSVFE1UVRjMVJVWTRRa016TXpNeU1UWTNJaUJ6ZEZKbFpqcGtiMk4xYldWdWRFbEVQU0o0YlhBdVpHbGtPalU1T0VGRU5qZzRRME14TmpFeFJUUTVRVGMxUlVZNFFrTXpNek15TVRZM0lpOCtJRHd2Y21SbU9rUmxjMk55YVhCMGFXOXVQaUE4TDNKa1pqcFNSRVkrSUR3dmVEcDRiWEJ0WlhSaFBpQThQM2h3WVdOclpYUWdaVzVrUFNKeUlqOCtWVTUxM2dBQUFEVkpSRUZVZU5yczBERU5BQ0FRQkRCSVdMR0JKUWJ5L21VY0puNXNKWFFtT1FNQUFBQUFBSnF0KzJwckFBQUFBQUNnMnhkZ0FOazZCRVZ1Smd5TUFBQUFBRWxGVGtTdVFtQ0MpfX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gRmxhZ1xcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovaS5mbGFnOm5vdCguaWNvbil7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTZweDtoZWlnaHQ6MTFweDtsaW5lLWhlaWdodDoxMXB4O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO21hcmdpbjowIC41ZW0gMCAwO3RleHQtZGVjb3JhdGlvbjppbmhlcml0O3NwZWFrOm5vbmU7Zm9udC1zbW9vdGhpbmc6YW50aWFsaWFzZWQ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbn1pLmZsYWc6bm90KC5pY29uKTpiZWZvcmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7Y29udGVudDonJztiYWNrZ3JvdW5kOnVybCh0aGVtZXMvZGVmYXVsdC9hc3NldHMvaW1hZ2VzL2ZsYWdzLnBuZykgbm8tcmVwZWF0IC0xMDhweCAtMTk3NnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjExcHh9aS5mbGFnLmFkOmJlZm9yZSxpLmZsYWcuYW5kb3JyYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9aS5mbGFnLmFlOmJlZm9yZSxpLmZsYWcudWFlOmJlZm9yZSxpLmZsYWcudW5pdGVkLmFyYWIuZW1pcmF0ZXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMjZweH1pLmZsYWcuYWY6YmVmb3JlLGkuZmxhZy5hZmdoYW5pc3RhbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC01MnB4fWkuZmxhZy5hZzpiZWZvcmUsaS5mbGFnLmFudGlndWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNzhweH1pLmZsYWcuYWk6YmVmb3JlLGkuZmxhZy5hbmd1aWxsYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMDRweH1pLmZsYWcuYWw6YmVmb3JlLGkuZmxhZy5hbGJhbmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEzMHB4fWkuZmxhZy5hbTpiZWZvcmUsaS5mbGFnLmFybWVuaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTU2cHh9aS5mbGFnLmFuOmJlZm9yZSxpLmZsYWcubmV0aGVybGFuZHMuYW50aWxsZXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTgycHh9aS5mbGFnLmFuZ29sYTpiZWZvcmUsaS5mbGFnLmFvOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIwOHB4fWkuZmxhZy5hcjpiZWZvcmUsaS5mbGFnLmFyZ2VudGluYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMzRweH1pLmZsYWcuYW1lcmljYW4uc2Ftb2E6YmVmb3JlLGkuZmxhZy5hczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yNjBweH1pLmZsYWcuYXQ6YmVmb3JlLGkuZmxhZy5hdXN0cmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTI4NnB4fWkuZmxhZy5hdTpiZWZvcmUsaS5mbGFnLmF1c3RyYWxpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0zMTJweH1pLmZsYWcuYXJ1YmE6YmVmb3JlLGkuZmxhZy5hdzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0zMzhweH1pLmZsYWcuYWxhbmQuaXNsYW5kczpiZWZvcmUsaS5mbGFnLmF4OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTM2NHB4fWkuZmxhZy5hejpiZWZvcmUsaS5mbGFnLmF6ZXJiYWlqYW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMzkwcHh9aS5mbGFnLmJhOmJlZm9yZSxpLmZsYWcuYm9zbmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQxNnB4fWkuZmxhZy5iYXJiYWRvczpiZWZvcmUsaS5mbGFnLmJiOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTQ0MnB4fWkuZmxhZy5iYW5nbGFkZXNoOmJlZm9yZSxpLmZsYWcuYmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNDY4cHh9aS5mbGFnLmJlOmJlZm9yZSxpLmZsYWcuYmVsZ2l1bTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC00OTRweH1pLmZsYWcuYmY6YmVmb3JlLGkuZmxhZy5idXJraW5hLmZhc286YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNTIwcHh9aS5mbGFnLmJnOmJlZm9yZSxpLmZsYWcuYnVsZ2FyaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNTQ2cHh9aS5mbGFnLmJhaHJhaW46YmVmb3JlLGkuZmxhZy5iaDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC01NzJweH1pLmZsYWcuYmk6YmVmb3JlLGkuZmxhZy5idXJ1bmRpOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTU5OHB4fWkuZmxhZy5iZW5pbjpiZWZvcmUsaS5mbGFnLmJqOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTYyNHB4fWkuZmxhZy5iZXJtdWRhOmJlZm9yZSxpLmZsYWcuYm06YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNjUwcHh9aS5mbGFnLmJuOmJlZm9yZSxpLmZsYWcuYnJ1bmVpOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTY3NnB4fWkuZmxhZy5ibzpiZWZvcmUsaS5mbGFnLmJvbGl2aWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNzAycHh9aS5mbGFnLmJyOmJlZm9yZSxpLmZsYWcuYnJhemlsOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTcyOHB4fWkuZmxhZy5iYWhhbWFzOmJlZm9yZSxpLmZsYWcuYnM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtNzU0cHh9aS5mbGFnLmJodXRhbjpiZWZvcmUsaS5mbGFnLmJ0OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTc4MHB4fWkuZmxhZy5ib3V2ZXQuaXNsYW5kOmJlZm9yZSxpLmZsYWcuYnY6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtODA2cHh9aS5mbGFnLmJvdHN3YW5hOmJlZm9yZSxpLmZsYWcuYnc6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtODMycHh9aS5mbGFnLmJlbGFydXM6YmVmb3JlLGkuZmxhZy5ieTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC04NThweH1pLmZsYWcuYmVsaXplOmJlZm9yZSxpLmZsYWcuYno6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtODg0cHh9aS5mbGFnLmNhOmJlZm9yZSxpLmZsYWcuY2FuYWRhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTkxMHB4fWkuZmxhZy5jYzpiZWZvcmUsaS5mbGFnLmNvY29zLmlzbGFuZHM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtOTYycHh9aS5mbGFnLmNkOmJlZm9yZSxpLmZsYWcuY29uZ286YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtOTg4cHh9aS5mbGFnLmNlbnRyYWwuYWZyaWNhbi5yZXB1YmxpYzpiZWZvcmUsaS5mbGFnLmNmOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEwMTRweH1pLmZsYWcuY2c6YmVmb3JlLGkuZmxhZy5jb25nby5icmF6emF2aWxsZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMDQwcHh9aS5mbGFnLmNoOmJlZm9yZSxpLmZsYWcuc3dpdHplcmxhbmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTA2NnB4fWkuZmxhZy5jaTpiZWZvcmUsaS5mbGFnLmNvdGUuZGl2b2lyZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMDkycHh9aS5mbGFnLmNrOmJlZm9yZSxpLmZsYWcuY29vay5pc2xhbmRzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExMThweH1pLmZsYWcuY2hpbGU6YmVmb3JlLGkuZmxhZy5jbDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMTQ0cHh9aS5mbGFnLmNhbWVyb29uOmJlZm9yZSxpLmZsYWcuY206YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTE3MHB4fWkuZmxhZy5jaGluYTpiZWZvcmUsaS5mbGFnLmNuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExOTZweH1pLmZsYWcuY286YmVmb3JlLGkuZmxhZy5jb2xvbWJpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMjIycHh9aS5mbGFnLmNvc3RhLnJpY2E6YmVmb3JlLGkuZmxhZy5jcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xMjQ4cHh9aS5mbGFnLmNzOmJlZm9yZSxpLmZsYWcuc2VyYmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEyNzRweH1pLmZsYWcuY3U6YmVmb3JlLGkuZmxhZy5jdWJhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEzMDBweH1pLmZsYWcuY2FwZS52ZXJkZTpiZWZvcmUsaS5mbGFnLmN2OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEzMjZweH1pLmZsYWcuY2hyaXN0bWFzLmlzbGFuZDpiZWZvcmUsaS5mbGFnLmN4OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTEzNTJweH1pLmZsYWcuY3k6YmVmb3JlLGkuZmxhZy5jeXBydXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTM3OHB4fWkuZmxhZy5jejpiZWZvcmUsaS5mbGFnLmN6ZWNoLnJlcHVibGljOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0MDRweH1pLmZsYWcuZGU6YmVmb3JlLGkuZmxhZy5nZXJtYW55OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE0MzBweH1pLmZsYWcuZGo6YmVmb3JlLGkuZmxhZy5kamlib3V0aTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNDU2cHh9aS5mbGFnLmRlbm1hcms6YmVmb3JlLGkuZmxhZy5kazpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNDgycHh9aS5mbGFnLmRtOmJlZm9yZSxpLmZsYWcuZG9taW5pY2E6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTUwOHB4fWkuZmxhZy5kbzpiZWZvcmUsaS5mbGFnLmRvbWluaWNhbi5yZXB1YmxpYzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNTM0cHh9aS5mbGFnLmFsZ2VyaWE6YmVmb3JlLGkuZmxhZy5kejpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNTYwcHh9aS5mbGFnLmVjOmJlZm9yZSxpLmZsYWcuZWN1YWRvcjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNTg2cHh9aS5mbGFnLmVlOmJlZm9yZSxpLmZsYWcuZXN0b25pYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNjEycHh9aS5mbGFnLmVnOmJlZm9yZSxpLmZsYWcuZWd5cHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTYzOHB4fWkuZmxhZy5laDpiZWZvcmUsaS5mbGFnLndlc3Rlcm4uc2FoYXJhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2NjRweH1pLmZsYWcuZW5nbGFuZDpiZWZvcmUsaS5mbGFnLmdiLmVuZzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNjkwcHh9aS5mbGFnLmVyOmJlZm9yZSxpLmZsYWcuZXJpdHJlYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzE2cHh9aS5mbGFnLmVzOmJlZm9yZSxpLmZsYWcuc3BhaW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246MCAtMTc0MnB4fWkuZmxhZy5ldDpiZWZvcmUsaS5mbGFnLmV0aGlvcGlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE3NjhweH1pLmZsYWcuZXU6YmVmb3JlLGkuZmxhZy5ldXJvcGVhbi51bmlvbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzk0cHh9aS5mbGFnLmZpOmJlZm9yZSxpLmZsYWcuZmlubGFuZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xODQ2cHh9aS5mbGFnLmZpamk6YmVmb3JlLGkuZmxhZy5majpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xODcycHh9aS5mbGFnLmZhbGtsYW5kLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy5mazpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xODk4cHh9aS5mbGFnLmZtOmJlZm9yZSxpLmZsYWcubWljcm9uZXNpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xOTI0cHh9aS5mbGFnLmZhcm9lLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy5mbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xOTUwcHh9aS5mbGFnLmZyOmJlZm9yZSxpLmZsYWcuZnJhbmNlOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE5NzZweH1pLmZsYWcuZ2E6YmVmb3JlLGkuZmxhZy5nYWJvbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAwfWkuZmxhZy5nYjpiZWZvcmUsaS5mbGFnLnVrOmJlZm9yZSxpLmZsYWcudW5pdGVkLmtpbmdkb206YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTI2cHh9aS5mbGFnLmdkOmJlZm9yZSxpLmZsYWcuZ3JlbmFkYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNTJweH1pLmZsYWcuZ2U6YmVmb3JlLGkuZmxhZy5nZW9yZ2lhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC03OHB4fWkuZmxhZy5mcmVuY2guZ3VpYW5hOmJlZm9yZSxpLmZsYWcuZ2Y6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEwNHB4fWkuZmxhZy5naDpiZWZvcmUsaS5mbGFnLmdoYW5hOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMzBweH1pLmZsYWcuZ2k6YmVmb3JlLGkuZmxhZy5naWJyYWx0YXI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE1NnB4fWkuZmxhZy5nbDpiZWZvcmUsaS5mbGFnLmdyZWVubGFuZDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTgycHh9aS5mbGFnLmdhbWJpYTpiZWZvcmUsaS5mbGFnLmdtOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0yMDhweH1pLmZsYWcuZ246YmVmb3JlLGkuZmxhZy5ndWluZWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTIzNHB4fWkuZmxhZy5ncDpiZWZvcmUsaS5mbGFnLmd1YWRlbG91cGU6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTI2MHB4fWkuZmxhZy5lcXVhdG9yaWFsLmd1aW5lYTpiZWZvcmUsaS5mbGFnLmdxOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0yODZweH1pLmZsYWcuZ3I6YmVmb3JlLGkuZmxhZy5ncmVlY2U6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTMxMnB4fWkuZmxhZy5nczpiZWZvcmUsaS5mbGFnLnNhbmR3aWNoLmlzbGFuZHM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTMzOHB4fWkuZmxhZy5ndDpiZWZvcmUsaS5mbGFnLmd1YXRlbWFsYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMzY0cHh9aS5mbGFnLmd1OmJlZm9yZSxpLmZsYWcuZ3VhbTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMzkwcHh9aS5mbGFnLmd1aW5lYS1iaXNzYXU6YmVmb3JlLGkuZmxhZy5ndzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNDE2cHh9aS5mbGFnLmd1eWFuYTpiZWZvcmUsaS5mbGFnLmd5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC00NDJweH1pLmZsYWcuaGs6YmVmb3JlLGkuZmxhZy5ob25nLmtvbmc6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTQ2OHB4fWkuZmxhZy5oZWFyZC5pc2xhbmQ6YmVmb3JlLGkuZmxhZy5obTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNDk0cHh9aS5mbGFnLmhuOmJlZm9yZSxpLmZsYWcuaG9uZHVyYXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTUyMHB4fWkuZmxhZy5jcm9hdGlhOmJlZm9yZSxpLmZsYWcuaHI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTU0NnB4fWkuZmxhZy5oYWl0aTpiZWZvcmUsaS5mbGFnLmh0OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC01NzJweH1pLmZsYWcuaHU6YmVmb3JlLGkuZmxhZy5odW5nYXJ5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC01OThweH1pLmZsYWcuaWQ6YmVmb3JlLGkuZmxhZy5pbmRvbmVzaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTYyNHB4fWkuZmxhZy5pZTpiZWZvcmUsaS5mbGFnLmlyZWxhbmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTY1MHB4fWkuZmxhZy5pbDpiZWZvcmUsaS5mbGFnLmlzcmFlbDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtNjc2cHh9aS5mbGFnLmluOmJlZm9yZSxpLmZsYWcuaW5kaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTcwMnB4fWkuZmxhZy5pbmRpYW4ub2NlYW4udGVycml0b3J5OmJlZm9yZSxpLmZsYWcuaW86YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTcyOHB4fWkuZmxhZy5pcTpiZWZvcmUsaS5mbGFnLmlyYXE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTc1NHB4fWkuZmxhZy5pcjpiZWZvcmUsaS5mbGFnLmlyYW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTc4MHB4fWkuZmxhZy5pY2VsYW5kOmJlZm9yZSxpLmZsYWcuaXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTgwNnB4fWkuZmxhZy5pdDpiZWZvcmUsaS5mbGFnLml0YWx5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC04MzJweH1pLmZsYWcuamFtYWljYTpiZWZvcmUsaS5mbGFnLmptOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC04NThweH1pLmZsYWcuam86YmVmb3JlLGkuZmxhZy5qb3JkYW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTg4NHB4fWkuZmxhZy5qYXBhbjpiZWZvcmUsaS5mbGFnLmpwOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC05MTBweH1pLmZsYWcua2U6YmVmb3JlLGkuZmxhZy5rZW55YTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtOTM2cHh9aS5mbGFnLmtnOmJlZm9yZSxpLmZsYWcua3lyZ3l6c3RhbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtOTYycHh9aS5mbGFnLmNhbWJvZGlhOmJlZm9yZSxpLmZsYWcua2g6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTk4OHB4fWkuZmxhZy5raTpiZWZvcmUsaS5mbGFnLmtpcmliYXRpOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMDE0cHh9aS5mbGFnLmNvbW9yb3M6YmVmb3JlLGkuZmxhZy5rbTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTA0MHB4fWkuZmxhZy5rbjpiZWZvcmUsaS5mbGFnLnNhaW50LmtpdHRzLmFuZC5uZXZpczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTA2NnB4fWkuZmxhZy5rcDpiZWZvcmUsaS5mbGFnLm5vcnRoLmtvcmVhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMDkycHh9aS5mbGFnLmtyOmJlZm9yZSxpLmZsYWcuc291dGgua29yZWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTExMThweH1pLmZsYWcua3V3YWl0OmJlZm9yZSxpLmZsYWcua3c6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTExNDRweH1pLmZsYWcuY2F5bWFuLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy5reTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTE3MHB4fWkuZmxhZy5rYXpha2hzdGFuOmJlZm9yZSxpLmZsYWcua3o6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTExOTZweH1pLmZsYWcubGE6YmVmb3JlLGkuZmxhZy5sYW9zOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMjIycHh9aS5mbGFnLmxiOmJlZm9yZSxpLmZsYWcubGViYW5vbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTI0OHB4fWkuZmxhZy5sYzpiZWZvcmUsaS5mbGFnLnNhaW50Lmx1Y2lhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMjc0cHh9aS5mbGFnLmxpOmJlZm9yZSxpLmZsYWcubGllY2h0ZW5zdGVpbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTMwMHB4fWkuZmxhZy5sazpiZWZvcmUsaS5mbGFnLnNyaS5sYW5rYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTMyNnB4fWkuZmxhZy5saWJlcmlhOmJlZm9yZSxpLmZsYWcubHI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTEzNTJweH1pLmZsYWcubGVzb3RobzpiZWZvcmUsaS5mbGFnLmxzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xMzc4cHh9aS5mbGFnLmxpdGh1YW5pYTpiZWZvcmUsaS5mbGFnLmx0OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNDA0cHh9aS5mbGFnLmx1OmJlZm9yZSxpLmZsYWcubHV4ZW1ib3VyZzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTQzMHB4fWkuZmxhZy5sYXR2aWE6YmVmb3JlLGkuZmxhZy5sdjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTQ1NnB4fWkuZmxhZy5saWJ5YTpiZWZvcmUsaS5mbGFnLmx5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNDgycHh9aS5mbGFnLm1hOmJlZm9yZSxpLmZsYWcubW9yb2NjbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTUwOHB4fWkuZmxhZy5tYzpiZWZvcmUsaS5mbGFnLm1vbmFjbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTUzNHB4fWkuZmxhZy5tZDpiZWZvcmUsaS5mbGFnLm1vbGRvdmE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE1NjBweH1pLmZsYWcubWU6YmVmb3JlLGkuZmxhZy5tb250ZW5lZ3JvOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNTg2cHh9aS5mbGFnLm1hZGFnYXNjYXI6YmVmb3JlLGkuZmxhZy5tZzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTYxM3B4fWkuZmxhZy5tYXJzaGFsbC5pc2xhbmRzOmJlZm9yZSxpLmZsYWcubWg6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE2MzlweH1pLmZsYWcubWFjZWRvbmlhOmJlZm9yZSxpLmZsYWcubWs6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE2NjVweH1pLmZsYWcubWFsaTpiZWZvcmUsaS5mbGFnLm1sOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xNjkxcHh9aS5mbGFnLmJ1cm1hOmJlZm9yZSxpLmZsYWcubW06YmVmb3JlLGkuZmxhZy5teWFubWFyOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03M3B4IC0xODIxcHh9aS5mbGFnLm1uOmJlZm9yZSxpLmZsYWcubW9uZ29saWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE3NDNweH1pLmZsYWcubWFjYXU6YmVmb3JlLGkuZmxhZy5tbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTc2OXB4fWkuZmxhZy5tcDpiZWZvcmUsaS5mbGFnLm5vcnRoZXJuLm1hcmlhbmEuaXNsYW5kczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTc5NXB4fWkuZmxhZy5tYXJ0aW5pcXVlOmJlZm9yZSxpLmZsYWcubXE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE4MjFweH1pLmZsYWcubWF1cml0YW5pYTpiZWZvcmUsaS5mbGFnLm1yOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xODQ3cHh9aS5mbGFnLm1vbnRzZXJyYXQ6YmVmb3JlLGkuZmxhZy5tczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzZweCAtMTg3M3B4fWkuZmxhZy5tYWx0YTpiZWZvcmUsaS5mbGFnLm10OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xODk5cHh9aS5mbGFnLm1hdXJpdGl1czpiZWZvcmUsaS5mbGFnLm11OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zNnB4IC0xOTI1cHh9aS5mbGFnLm1hbGRpdmVzOmJlZm9yZSxpLmZsYWcubXY6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE5NTFweH1pLmZsYWcubWFsYXdpOmJlZm9yZSxpLmZsYWcubXc6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTM2cHggLTE5NzdweH1pLmZsYWcubWV4aWNvOmJlZm9yZSxpLmZsYWcubXg6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggMH1pLmZsYWcubWFsYXlzaWE6YmVmb3JlLGkuZmxhZy5teTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMjZweH1pLmZsYWcubW96YW1iaXF1ZTpiZWZvcmUsaS5mbGFnLm16OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC01MnB4fWkuZmxhZy5uYTpiZWZvcmUsaS5mbGFnLm5hbWliaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTc4cHh9aS5mbGFnLm5jOmJlZm9yZSxpLmZsYWcubmV3LmNhbGVkb25pYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTA0cHh9aS5mbGFnLm5lOmJlZm9yZSxpLmZsYWcubmlnZXI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEzMHB4fWkuZmxhZy5uZjpiZWZvcmUsaS5mbGFnLm5vcmZvbGsuaXNsYW5kOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNTZweH1pLmZsYWcubmc6YmVmb3JlLGkuZmxhZy5uaWdlcmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xODJweH1pLmZsYWcubmk6YmVmb3JlLGkuZmxhZy5uaWNhcmFndWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTIwOHB4fWkuZmxhZy5uZXRoZXJsYW5kczpiZWZvcmUsaS5mbGFnLm5sOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0yMzRweH1pLmZsYWcubm86YmVmb3JlLGkuZmxhZy5ub3J3YXk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTI2MHB4fWkuZmxhZy5uZXBhbDpiZWZvcmUsaS5mbGFnLm5wOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0yODZweH1pLmZsYWcubmF1cnU6YmVmb3JlLGkuZmxhZy5ucjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMzEycHh9aS5mbGFnLm5pdWU6YmVmb3JlLGkuZmxhZy5udTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMzM4cHh9aS5mbGFnLm5ldy56ZWFsYW5kOmJlZm9yZSxpLmZsYWcubno6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTM2NHB4fWkuZmxhZy5vbTpiZWZvcmUsaS5mbGFnLm9tYW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTM5MHB4fWkuZmxhZy5wYTpiZWZvcmUsaS5mbGFnLnBhbmFtYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNDE2cHh9aS5mbGFnLnBlOmJlZm9yZSxpLmZsYWcucGVydTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNDQycHh9aS5mbGFnLmZyZW5jaC5wb2x5bmVzaWE6YmVmb3JlLGkuZmxhZy5wZjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNDY4cHh9aS5mbGFnLm5ldy5ndWluZWE6YmVmb3JlLGkuZmxhZy5wZzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNDk0cHh9aS5mbGFnLnBoOmJlZm9yZSxpLmZsYWcucGhpbGlwcGluZXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTUyMHB4fWkuZmxhZy5wYWtpc3RhbjpiZWZvcmUsaS5mbGFnLnBrOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC01NDZweH1pLmZsYWcucGw6YmVmb3JlLGkuZmxhZy5wb2xhbmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTU3MnB4fWkuZmxhZy5wbTpiZWZvcmUsaS5mbGFnLnNhaW50LnBpZXJyZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNTk4cHh9aS5mbGFnLnBpdGNhaXJuLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy5wbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNjI0cHh9aS5mbGFnLnByOmJlZm9yZSxpLmZsYWcucHVlcnRvLnJpY286YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTY1MHB4fWkuZmxhZy5wYWxlc3RpbmU6YmVmb3JlLGkuZmxhZy5wczpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNjc2cHh9aS5mbGFnLnBvcnR1Z2FsOmJlZm9yZSxpLmZsYWcucHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTcwMnB4fWkuZmxhZy5wYWxhdTpiZWZvcmUsaS5mbGFnLnB3OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC03MjhweH1pLmZsYWcucGFyYWd1YXk6YmVmb3JlLGkuZmxhZy5weTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtNzU0cHh9aS5mbGFnLnFhOmJlZm9yZSxpLmZsYWcucWF0YXI6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTc4MHB4fWkuZmxhZy5yZTpiZWZvcmUsaS5mbGFnLnJldW5pb246YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTgwNnB4fWkuZmxhZy5ybzpiZWZvcmUsaS5mbGFnLnJvbWFuaWE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTgzMnB4fWkuZmxhZy5yczpiZWZvcmUsaS5mbGFnLnNlcmJpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtODU4cHh9aS5mbGFnLnJ1OmJlZm9yZSxpLmZsYWcucnVzc2lhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC04ODRweH1pLmZsYWcucnc6YmVmb3JlLGkuZmxhZy5yd2FuZGE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTkxMHB4fWkuZmxhZy5zYTpiZWZvcmUsaS5mbGFnLnNhdWRpLmFyYWJpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtOTM2cHh9aS5mbGFnLnNiOmJlZm9yZSxpLmZsYWcuc29sb21vbi5pc2xhbmRzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC05NjJweH1pLmZsYWcuc2M6YmVmb3JlLGkuZmxhZy5zZXljaGVsbGVzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC05ODhweH1pLmZsYWcuZ2Iuc2N0OmJlZm9yZSxpLmZsYWcuc2NvdGxhbmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEwMTRweH1pLmZsYWcuc2Q6YmVmb3JlLGkuZmxhZy5zdWRhbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTA0MHB4fWkuZmxhZy5zZTpiZWZvcmUsaS5mbGFnLnN3ZWRlbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTA2NnB4fWkuZmxhZy5zZzpiZWZvcmUsaS5mbGFnLnNpbmdhcG9yZTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTA5MnB4fWkuZmxhZy5zYWludC5oZWxlbmE6YmVmb3JlLGkuZmxhZy5zaDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTExOHB4fWkuZmxhZy5zaTpiZWZvcmUsaS5mbGFnLnNsb3ZlbmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMTQ0cHh9aS5mbGFnLmphbi5tYXllbjpiZWZvcmUsaS5mbGFnLnNqOmJlZm9yZSxpLmZsYWcuc3ZhbGJhcmQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTExNzBweH1pLmZsYWcuc2s6YmVmb3JlLGkuZmxhZy5zbG92YWtpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTE5NnB4fWkuZmxhZy5zaWVycmEubGVvbmU6YmVmb3JlLGkuZmxhZy5zbDpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTIyMnB4fWkuZmxhZy5zYW4ubWFyaW5vOmJlZm9yZSxpLmZsYWcuc206YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEyNDhweH1pLmZsYWcuc2VuZWdhbDpiZWZvcmUsaS5mbGFnLnNuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMjc0cHh9aS5mbGFnLnNvOmJlZm9yZSxpLmZsYWcuc29tYWxpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTMwMHB4fWkuZmxhZy5zcjpiZWZvcmUsaS5mbGFnLnN1cmluYW1lOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xMzI2cHh9aS5mbGFnLnNhby50b21lOmJlZm9yZSxpLmZsYWcuc3Q6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTEzNTJweH1pLmZsYWcuZWwuc2FsdmFkb3I6YmVmb3JlLGkuZmxhZy5zdjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTM3OHB4fWkuZmxhZy5zeTpiZWZvcmUsaS5mbGFnLnN5cmlhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNDA0cHh9aS5mbGFnLnN3YXppbGFuZDpiZWZvcmUsaS5mbGFnLnN6OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNDMwcHh9aS5mbGFnLmNhaWNvcy5pc2xhbmRzOmJlZm9yZSxpLmZsYWcudGM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE0NTZweH1pLmZsYWcuY2hhZDpiZWZvcmUsaS5mbGFnLnRkOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNDgycHh9aS5mbGFnLmZyZW5jaC50ZXJyaXRvcmllczpiZWZvcmUsaS5mbGFnLnRmOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNTA4cHh9aS5mbGFnLnRnOmJlZm9yZSxpLmZsYWcudG9nbzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTUzNHB4fWkuZmxhZy50aDpiZWZvcmUsaS5mbGFnLnRoYWlsYW5kOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNTYwcHh9aS5mbGFnLnRhamlraXN0YW46YmVmb3JlLGkuZmxhZy50ajpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTU4NnB4fWkuZmxhZy50azpiZWZvcmUsaS5mbGFnLnRva2VsYXU6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE2MTJweH1pLmZsYWcudGltb3JsZXN0ZTpiZWZvcmUsaS5mbGFnLnRsOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNjM4cHh9aS5mbGFnLnRtOmJlZm9yZSxpLmZsYWcudHVya21lbmlzdGFuOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNjY0cHh9aS5mbGFnLnRuOmJlZm9yZSxpLmZsYWcudHVuaXNpYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTY5MHB4fWkuZmxhZy50bzpiZWZvcmUsaS5mbGFnLnRvbmdhOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNzE2cHh9aS5mbGFnLnRyOmJlZm9yZSxpLmZsYWcudHVya2V5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xNzQycHh9aS5mbGFnLnRyaW5pZGFkOmJlZm9yZSxpLmZsYWcudHQ6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE3NjhweH1pLmZsYWcudHV2YWx1OmJlZm9yZSxpLmZsYWcudHY6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE3OTRweH1pLmZsYWcudGFpd2FuOmJlZm9yZSxpLmZsYWcudHc6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE4MjBweH1pLmZsYWcudGFuemFuaWE6YmVmb3JlLGkuZmxhZy50ejpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotNzJweCAtMTg0NnB4fWkuZmxhZy51YTpiZWZvcmUsaS5mbGFnLnVrcmFpbmU6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE4NzJweH1pLmZsYWcudWc6YmVmb3JlLGkuZmxhZy51Z2FuZGE6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE4OThweH1pLmZsYWcudW06YmVmb3JlLGkuZmxhZy51cy5taW5vci5pc2xhbmRzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xOTI0cHh9aS5mbGFnLmFtZXJpY2E6YmVmb3JlLGkuZmxhZy51bml0ZWQuc3RhdGVzOmJlZm9yZSxpLmZsYWcudXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTcycHggLTE5NTBweH1pLmZsYWcudXJ1Z3VheTpiZWZvcmUsaS5mbGFnLnV5OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi03MnB4IC0xOTc2cHh9aS5mbGFnLnV6OmJlZm9yZSxpLmZsYWcudXpiZWtpc3RhbjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggMH1pLmZsYWcudmE6YmVmb3JlLGkuZmxhZy52YXRpY2FuLmNpdHk6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0yNnB4fWkuZmxhZy5zYWludC52aW5jZW50OmJlZm9yZSxpLmZsYWcudmM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC01MnB4fWkuZmxhZy52ZTpiZWZvcmUsaS5mbGFnLnZlbmV6dWVsYTpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTc4cHh9aS5mbGFnLmJyaXRpc2gudmlyZ2luLmlzbGFuZHM6YmVmb3JlLGkuZmxhZy52ZzpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTEwNHB4fWkuZmxhZy51cy52aXJnaW4uaXNsYW5kczpiZWZvcmUsaS5mbGFnLnZpOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMTMwcHh9aS5mbGFnLnZpZXRuYW06YmVmb3JlLGkuZmxhZy52bjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTE1NnB4fWkuZmxhZy52YW51YXR1OmJlZm9yZSxpLmZsYWcudnU6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0xODJweH1pLmZsYWcuZ2Iud2xzOmJlZm9yZSxpLmZsYWcud2FsZXM6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0yMDhweH1pLmZsYWcud2FsbGlzLmFuZC5mdXR1bmE6YmVmb3JlLGkuZmxhZy53ZjpiZWZvcmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTA4cHggLTIzNHB4fWkuZmxhZy5zYW1vYTpiZWZvcmUsaS5mbGFnLndzOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMjYwcHh9aS5mbGFnLnllOmJlZm9yZSxpLmZsYWcueWVtZW46YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0yODZweH1pLmZsYWcubWF5b3R0ZTpiZWZvcmUsaS5mbGFnLnl0OmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMzEycHh9aS5mbGFnLnNvdXRoLmFmcmljYTpiZWZvcmUsaS5mbGFnLnphOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMzM4cHh9aS5mbGFnLnphbWJpYTpiZWZvcmUsaS5mbGFnLnptOmJlZm9yZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDhweCAtMzY0cHh9aS5mbGFnLnppbWJhYndlOmJlZm9yZSxpLmZsYWcuenc6YmVmb3Jle2JhY2tncm91bmQtcG9zaXRpb246LTEwOHB4IC0zOTBweH0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gSGVhZGVyXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuaGVhZGVye2JvcmRlcjpub25lO21hcmdpbjpjYWxjKDJyZW0gLSAuMTQyODU3MTRlbSkgMCAxcmVtO3BhZGRpbmc6MCAwO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MS4yODU3MTQyOWVtO3RleHQtdHJhbnNmb3JtOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5oZWFkZXI6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDotLjE0Mjg1NzE0ZW19LnVpLmhlYWRlcjpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuaGVhZGVyIC5zdWIuaGVhZGVye2Rpc3BsYXk6YmxvY2s7Zm9udC13ZWlnaHQ6NDAwO3BhZGRpbmc6MDttYXJnaW46MDtmb250LXNpemU6MXJlbTtsaW5lLWhlaWdodDoxLjJlbTtjb2xvcjpyZ2JhKDAsMCwwLC42KX0udWkuaGVhZGVyPi5pY29ue2Rpc3BsYXk6dGFibGUtY2VsbDtvcGFjaXR5OjE7Zm9udC1zaXplOjEuNWVtO3BhZGRpbmctdG9wOjA7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5oZWFkZXIgLmljb246b25seS1jaGlsZHtkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nOjA7bWFyZ2luLXJpZ2h0Oi43NXJlbX0udWkuaGVhZGVyPi5pbWFnZTpub3QoLmljb24pLC51aS5oZWFkZXI+aW1ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6LjE0Mjg1NzE0ZW07d2lkdGg6Mi41ZW07aGVpZ2h0OmF1dG87dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5oZWFkZXI+LmltYWdlOm5vdCguaWNvbik6b25seS1jaGlsZCwudWkuaGVhZGVyPmltZzpvbmx5LWNoaWxke21hcmdpbi1yaWdodDouNzVyZW19LnVpLmhlYWRlciAuY29udGVudHtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmhlYWRlcj4uaW1hZ2UrLmNvbnRlbnQsLnVpLmhlYWRlcj5pbWcrLmNvbnRlbnR7cGFkZGluZy1sZWZ0Oi43NXJlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmhlYWRlcj4uaWNvbisuY29udGVudHtwYWRkaW5nLWxlZnQ6Ljc1cmVtO2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmhlYWRlciAudWkubGFiZWx7Zm9udC1zaXplOicnO21hcmdpbi1sZWZ0Oi41cmVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuaGVhZGVyK3B7bWFyZ2luLXRvcDowfWgxLnVpLmhlYWRlcntmb250LXNpemU6MnJlbX1oMi51aS5oZWFkZXJ7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19aDMudWkuaGVhZGVye2ZvbnQtc2l6ZToxLjI4NTcxNDI5cmVtfWg0LnVpLmhlYWRlcntmb250LXNpemU6MS4wNzE0Mjg1N3JlbX1oNS51aS5oZWFkZXJ7Zm9udC1zaXplOjFyZW19aDEudWkuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfWgyLnVpLmhlYWRlciAuc3ViLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNHJlbX1oMy51aS5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjFyZW19aDQudWkuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZToxcmVtfWg1LnVpLmhlYWRlciAuc3ViLmhlYWRlcntmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5odWdlLmhlYWRlcnttaW4taGVpZ2h0OjFlbTtmb250LXNpemU6MmVtfS51aS5sYXJnZS5oZWFkZXJ7Zm9udC1zaXplOjEuNzE0Mjg1NzFlbX0udWkubWVkaXVtLmhlYWRlcntmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5zbWFsbC5oZWFkZXJ7Zm9udC1zaXplOjEuMDcxNDI4NTdlbX0udWkudGlueS5oZWFkZXJ7Zm9udC1zaXplOjFlbX0udWkuaHVnZS5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmxhcmdlLmhlYWRlciAuc3ViLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZToxcmVtfS51aS5zbWFsbC5oZWFkZXIgLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjFyZW19LnVpLnRpbnkuaGVhZGVyIC5zdWIuaGVhZGVye2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLnN1Yi5oZWFkZXJ7cGFkZGluZzowO21hcmdpbi1ib3R0b206LjE0Mjg1NzE0cmVtO2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6Ljg1NzE0Mjg2ZW07dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2NvbG9yOicnfS51aS5zbWFsbC5zdWIuaGVhZGVye2ZvbnQtc2l6ZTouNzg1NzE0MjllbX0udWkuc3ViLmhlYWRlcntmb250LXNpemU6Ljg1NzE0Mjg2ZW19LnVpLmxhcmdlLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOi45Mjg1NzE0M2VtfS51aS5odWdlLnN1Yi5oZWFkZXJ7Zm9udC1zaXplOjFlbX0udWkuaWNvbi5oZWFkZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjJyZW0gMCAxcmVtfS51aS5pY29uLmhlYWRlcjphZnRlcntjb250ZW50OicnO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjA7Y2xlYXI6Ym90aDt2aXNpYmlsaXR5OmhpZGRlbn0udWkuaWNvbi5oZWFkZXI6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5pY29uLmhlYWRlciAuaWNvbntmbG9hdDpub25lO2Rpc3BsYXk6YmxvY2s7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bztsaW5lLWhlaWdodDoxO3BhZGRpbmc6MDtmb250LXNpemU6M2VtO21hcmdpbjowIGF1dG8gLjVyZW07b3BhY2l0eToxfS51aS5pY29uLmhlYWRlciAuY29udGVudHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MH0udWkuaWNvbi5oZWFkZXIgLmNpcmN1bGFyLmljb257Zm9udC1zaXplOjJlbX0udWkuaWNvbi5oZWFkZXIgLnNxdWFyZS5pY29ue2ZvbnQtc2l6ZToyZW19LnVpLmJsb2NrLmljb24uaGVhZGVyIC5pY29ue21hcmdpbi1ib3R0b206MH0udWkuaWNvbi5oZWFkZXIuYWxpZ25lZHttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvO2Rpc3BsYXk6YmxvY2t9LnVpLmRpc2FibGVkLmhlYWRlcntvcGFjaXR5Oi40NX0udWkuaW52ZXJ0ZWQuaGVhZGVye2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLmhlYWRlciAuc3ViLmhlYWRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX0udWkuaW52ZXJ0ZWQuYXR0YWNoZWQuaGVhZGVye2JhY2tncm91bmQ6IzU0NTQ1NCAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxmcm9tKHRyYW5zcGFyZW50KSx0byhyZ2JhKDAsMCwwLC4wNSkpKTtiYWNrZ3JvdW5kOiM1NDU0NTQgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuMDUpKTtiYWNrZ3JvdW5kOiM1NDU0NTQgbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0udWkuaW52ZXJ0ZWQuYmxvY2suaGVhZGVye2JhY2tncm91bmQ6IzU0NTQ1NCAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxmcm9tKHRyYW5zcGFyZW50KSx0byhyZ2JhKDAsMCwwLC4wNSkpKTtiYWNrZ3JvdW5kOiM1NDU0NTQgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuMDUpKTtiYWNrZ3JvdW5kOiM1NDU0NTQgbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5ibG9jay5oZWFkZXJ7Ym9yZGVyLWJvdHRvbTpub25lfS51aS5yZWQuaGVhZGVye2NvbG9yOiNkYjI4MjghaW1wb3J0YW50fWEudWkucmVkLmhlYWRlcjpob3Zlcntjb2xvcjojZDAxOTE5IWltcG9ydGFudH0udWkucmVkLmRpdmlkaW5nLmhlYWRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZGIyODI4fS51aS5pbnZlcnRlZC5yZWQuaGVhZGVye2NvbG9yOiNmZjY5NWUhaW1wb3J0YW50fWEudWkuaW52ZXJ0ZWQucmVkLmhlYWRlcjpob3Zlcntjb2xvcjojZmY1MTQ0IWltcG9ydGFudH0udWkub3JhbmdlLmhlYWRlcntjb2xvcjojZjI3MTFjIWltcG9ydGFudH1hLnVpLm9yYW5nZS5oZWFkZXI6aG92ZXJ7Y29sb3I6I2YyNjIwMiFpbXBvcnRhbnR9LnVpLm9yYW5nZS5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgI2YyNzExY30udWkuaW52ZXJ0ZWQub3JhbmdlLmhlYWRlcntjb2xvcjojZmY4NTFiIWltcG9ydGFudH1hLnVpLmludmVydGVkLm9yYW5nZS5oZWFkZXI6aG92ZXJ7Y29sb3I6I2ZmNzcwMSFpbXBvcnRhbnR9LnVpLm9saXZlLmhlYWRlcntjb2xvcjojYjVjYzE4IWltcG9ydGFudH1hLnVpLm9saXZlLmhlYWRlcjpob3Zlcntjb2xvcjojYTdiZDBkIWltcG9ydGFudH0udWkub2xpdmUuZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNiNWNjMTh9LnVpLmludmVydGVkLm9saXZlLmhlYWRlcntjb2xvcjojZDllNzc4IWltcG9ydGFudH1hLnVpLmludmVydGVkLm9saXZlLmhlYWRlcjpob3Zlcntjb2xvcjojZDhlYTVjIWltcG9ydGFudH0udWkueWVsbG93LmhlYWRlcntjb2xvcjojZmJiZDA4IWltcG9ydGFudH1hLnVpLnllbGxvdy5oZWFkZXI6aG92ZXJ7Y29sb3I6I2VhYWUwMCFpbXBvcnRhbnR9LnVpLnllbGxvdy5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgI2ZiYmQwOH0udWkuaW52ZXJ0ZWQueWVsbG93LmhlYWRlcntjb2xvcjojZmZlMjFmIWltcG9ydGFudH1hLnVpLmludmVydGVkLnllbGxvdy5oZWFkZXI6aG92ZXJ7Y29sb3I6I2ZmZGYwNSFpbXBvcnRhbnR9LnVpLmdyZWVuLmhlYWRlcntjb2xvcjojMjFiYTQ1IWltcG9ydGFudH1hLnVpLmdyZWVuLmhlYWRlcjpob3Zlcntjb2xvcjojMTZhYjM5IWltcG9ydGFudH0udWkuZ3JlZW4uZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICMyMWJhNDV9LnVpLmludmVydGVkLmdyZWVuLmhlYWRlcntjb2xvcjojMmVjYzQwIWltcG9ydGFudH1hLnVpLmludmVydGVkLmdyZWVuLmhlYWRlcjpob3Zlcntjb2xvcjojMjJiZTM0IWltcG9ydGFudH0udWkudGVhbC5oZWFkZXJ7Y29sb3I6IzAwYjVhZCFpbXBvcnRhbnR9YS51aS50ZWFsLmhlYWRlcjpob3Zlcntjb2xvcjojMDA5Yzk1IWltcG9ydGFudH0udWkudGVhbC5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzAwYjVhZH0udWkuaW52ZXJ0ZWQudGVhbC5oZWFkZXJ7Y29sb3I6IzZkZmZmZiFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC50ZWFsLmhlYWRlcjpob3Zlcntjb2xvcjojNTRmZmZmIWltcG9ydGFudH0udWkuYmx1ZS5oZWFkZXJ7Y29sb3I6IzIxODVkMCFpbXBvcnRhbnR9YS51aS5ibHVlLmhlYWRlcjpob3Zlcntjb2xvcjojMTY3OGMyIWltcG9ydGFudH0udWkuYmx1ZS5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzIxODVkMH0udWkuaW52ZXJ0ZWQuYmx1ZS5oZWFkZXJ7Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC5ibHVlLmhlYWRlcjpob3Zlcntjb2xvcjojM2FjMGZmIWltcG9ydGFudH0udWkudmlvbGV0LmhlYWRlcntjb2xvcjojNjQzNWM5IWltcG9ydGFudH1hLnVpLnZpb2xldC5oZWFkZXI6aG92ZXJ7Y29sb3I6IzU4MjliYiFpbXBvcnRhbnR9LnVpLnZpb2xldC5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbToycHggc29saWQgIzY0MzVjOX0udWkuaW52ZXJ0ZWQudmlvbGV0LmhlYWRlcntjb2xvcjojYTI5MWZiIWltcG9ydGFudH1hLnVpLmludmVydGVkLnZpb2xldC5oZWFkZXI6aG92ZXJ7Y29sb3I6IzhhNzNmZiFpbXBvcnRhbnR9LnVpLnB1cnBsZS5oZWFkZXJ7Y29sb3I6I2EzMzNjOCFpbXBvcnRhbnR9YS51aS5wdXJwbGUuaGVhZGVyOmhvdmVye2NvbG9yOiM5NjI3YmEhaW1wb3J0YW50fS51aS5wdXJwbGUuZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNhMzMzYzh9LnVpLmludmVydGVkLnB1cnBsZS5oZWFkZXJ7Y29sb3I6I2RjNzNmZiFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC5wdXJwbGUuaGVhZGVyOmhvdmVye2NvbG9yOiNkNjVhZmYhaW1wb3J0YW50fS51aS5waW5rLmhlYWRlcntjb2xvcjojZTAzOTk3IWltcG9ydGFudH1hLnVpLnBpbmsuaGVhZGVyOmhvdmVye2NvbG9yOiNlNjFhOGQhaW1wb3J0YW50fS51aS5waW5rLmRpdmlkaW5nLmhlYWRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZCAjZTAzOTk3fS51aS5pbnZlcnRlZC5waW5rLmhlYWRlcntjb2xvcjojZmY4ZWRmIWltcG9ydGFudH1hLnVpLmludmVydGVkLnBpbmsuaGVhZGVyOmhvdmVye2NvbG9yOiNmZjc0ZDghaW1wb3J0YW50fS51aS5icm93bi5oZWFkZXJ7Y29sb3I6I2E1NjczZiFpbXBvcnRhbnR9YS51aS5icm93bi5oZWFkZXI6aG92ZXJ7Y29sb3I6Izk3NWIzMyFpbXBvcnRhbnR9LnVpLmJyb3duLmRpdmlkaW5nLmhlYWRlcntib3JkZXItYm90dG9tOjJweCBzb2xpZCAjYTU2NzNmfS51aS5pbnZlcnRlZC5icm93bi5oZWFkZXJ7Y29sb3I6I2Q2N2MxYyFpbXBvcnRhbnR9YS51aS5pbnZlcnRlZC5icm93bi5oZWFkZXI6aG92ZXJ7Y29sb3I6I2M4NmYxMSFpbXBvcnRhbnR9LnVpLmdyZXkuaGVhZGVye2NvbG9yOiM3Njc2NzYhaW1wb3J0YW50fWEudWkuZ3JleS5oZWFkZXI6aG92ZXJ7Y29sb3I6IzgzODM4MyFpbXBvcnRhbnR9LnVpLmdyZXkuZGl2aWRpbmcuaGVhZGVye2JvcmRlci1ib3R0b206MnB4IHNvbGlkICM3Njc2NzZ9LnVpLmludmVydGVkLmdyZXkuaGVhZGVye2NvbG9yOiNkY2RkZGUhaW1wb3J0YW50fWEudWkuaW52ZXJ0ZWQuZ3JleS5oZWFkZXI6aG92ZXJ7Y29sb3I6I2NmZDBkMiFpbXBvcnRhbnR9LnVpLmxlZnQuYWxpZ25lZC5oZWFkZXJ7dGV4dC1hbGlnbjpsZWZ0fS51aS5yaWdodC5hbGlnbmVkLmhlYWRlcnt0ZXh0LWFsaWduOnJpZ2h0fS51aS5jZW50ZXIuYWxpZ25lZC5oZWFkZXIsLnVpLmNlbnRlcmVkLmhlYWRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udWkuanVzdGlmaWVkLmhlYWRlcnt0ZXh0LWFsaWduOmp1c3RpZnl9LnVpLmp1c3RpZmllZC5oZWFkZXI6YWZ0ZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7Y29udGVudDonJzt3aWR0aDoxMDAlfS51aS5mbG9hdGVkLmhlYWRlciwudWlbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5oZWFkZXJ7ZmxvYXQ6bGVmdDttYXJnaW4tdG9wOjA7bWFyZ2luLXJpZ2h0Oi41ZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmhlYWRlcntmbG9hdDpyaWdodDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6LjVlbX0udWkuZml0dGVkLmhlYWRlcntwYWRkaW5nOjB9LnVpLmRpdmlkaW5nLmhlYWRlcntwYWRkaW5nLWJvdHRvbTouMjE0Mjg1NzFyZW07Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5kaXZpZGluZy5oZWFkZXIgLnN1Yi5oZWFkZXJ7cGFkZGluZy1ib3R0b206LjIxNDI4NTcxcmVtfS51aS5kaXZpZGluZy5oZWFkZXIgLmljb257bWFyZ2luLWJvdHRvbTowfS51aS5pbnZlcnRlZC5kaXZpZGluZy5oZWFkZXJ7Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuYmxvY2suaGVhZGVye2JhY2tncm91bmQ6I2YzZjRmNTtwYWRkaW5nOi43ODU3MTQyOXJlbSAxcmVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDU7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnRpbnkuYmxvY2suaGVhZGVye2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLmJsb2NrLmhlYWRlcntmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5ibG9jay5oZWFkZXI6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpOm5vdChoNil7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLmJsb2NrLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuaHVnZS5ibG9jay5oZWFkZXJ7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLmF0dGFjaGVkLmhlYWRlcntiYWNrZ3JvdW5kOiNmZmY7cGFkZGluZzouNzg1NzE0MjlyZW0gMXJlbTttYXJnaW4tbGVmdDotMXB4O21hcmdpbi1yaWdodDotMXB4Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDV9LnVpLmF0dGFjaGVkLmJsb2NrLmhlYWRlcntiYWNrZ3JvdW5kOiNmM2Y0ZjV9LnVpLmF0dGFjaGVkOm5vdCgudG9wKTpub3QoLmJvdHRvbSkuaGVhZGVye21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1yYWRpdXM6MH0udWkudG9wLmF0dGFjaGVkLmhlYWRlcnttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuYm90dG9tLmF0dGFjaGVkLmhlYWRlcnttYXJnaW4tdG9wOjA7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnRpbnkuYXR0YWNoZWQuaGVhZGVye2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkuc21hbGwuYXR0YWNoZWQuaGVhZGVye2ZvbnQtc2l6ZTouOTI4NTcxNDNlbX0udWkuYXR0YWNoZWQuaGVhZGVyOm5vdChoMSk6bm90KGgyKTpub3QoaDMpOm5vdChoNCk6bm90KGg1KTpub3QoaDYpe2ZvbnQtc2l6ZToxZW19LnVpLmxhcmdlLmF0dGFjaGVkLmhlYWRlcntmb250LXNpemU6MS4xNDI4NTcxNGVtfS51aS5odWdlLmF0dGFjaGVkLmhlYWRlcntmb250LXNpemU6MS40Mjg1NzE0M2VtfS51aS5oZWFkZXI6bm90KGgxKTpub3QoaDIpOm5vdChoMyk6bm90KGg0KTpub3QoaDUpOm5vdChoNil7Zm9udC1zaXplOjEuMjg1NzE0MjllbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gSWNvblxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovQGZvbnQtZmFjZXtmb250LWZhbWlseTpJY29ucztzcmM6dXJsKHRoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9pY29ucy5lb3QpO3NyYzp1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2ljb25zLmVvdD8jaWVmaXgpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSx1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2ljb25zLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyksdXJsKHRoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9pY29ucy53b2ZmKSBmb3JtYXQoJ3dvZmYnKSx1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2ljb25zLnR0ZikgZm9ybWF0KCd0cnVldHlwZScpLHVybCh0aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvaWNvbnMuc3ZnI2ljb25zKSBmb3JtYXQoJ3N2ZycpO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjppbmhlcml0O3RleHQtdHJhbnNmb3JtOm5vbmV9aS5pY29ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO29wYWNpdHk6MTttYXJnaW46MCAuMjVyZW0gMCAwO3dpZHRoOjEuMThlbTtoZWlnaHQ6MWVtO2ZvbnQtZmFtaWx5Okljb25zO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDt0ZXh0LWRlY29yYXRpb246aW5oZXJpdDt0ZXh0LWFsaWduOmNlbnRlcjtzcGVhazpub25lO2ZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOmdyYXlzY2FsZTstd2Via2l0LWZvbnQtc21vb3RoaW5nOmFudGlhbGlhc2VkOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW59aS5pY29uOmJlZm9yZXtiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnR9aS5pY29uLmxvYWRpbmd7aGVpZ2h0OjFlbTtsaW5lLWhlaWdodDoxOy13ZWJraXQtYW5pbWF0aW9uOmljb24tbG9hZGluZyAycyBsaW5lYXIgaW5maW5pdGU7YW5pbWF0aW9uOmljb24tbG9hZGluZyAycyBsaW5lYXIgaW5maW5pdGV9QC13ZWJraXQta2V5ZnJhbWVzIGljb24tbG9hZGluZ3tmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBpY29uLWxvYWRpbmd7ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fWkuaWNvbi5ob3ZlcntvcGFjaXR5OjEhaW1wb3J0YW50fWkuaWNvbi5hY3RpdmV7b3BhY2l0eToxIWltcG9ydGFudH1pLmVtcGhhc2l6ZWQuaWNvbntvcGFjaXR5OjEhaW1wb3J0YW50fWkuZGlzYWJsZWQuaWNvbntvcGFjaXR5Oi40NSFpbXBvcnRhbnR9aS5maXR0ZWQuaWNvbnt3aWR0aDphdXRvO21hcmdpbjowIWltcG9ydGFudH1pLmxpbmsuaWNvbixpLmxpbmsuaWNvbnN7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouODstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2V9aS5saW5rLmljb246aG92ZXIsaS5saW5rLmljb25zOmhvdmVye29wYWNpdHk6MSFpbXBvcnRhbnR9aS5jaXJjdWxhci5pY29ue2JvcmRlci1yYWRpdXM6NTAwZW0haW1wb3J0YW50O2xpbmUtaGVpZ2h0OjEhaW1wb3J0YW50O3BhZGRpbmc6LjVlbSAwIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgLjFlbSByZ2JhKDAsMCwwLC4xKSBpbnNldDtib3gtc2hhZG93OjAgMCAwIC4xZW0gcmdiYSgwLDAsMCwuMSkgaW5zZXQ7d2lkdGg6MmVtIWltcG9ydGFudDtoZWlnaHQ6MmVtIWltcG9ydGFudH1pLmNpcmN1bGFyLmludmVydGVkLmljb257Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfWkuZmxpcHBlZC5pY29uLGkuaG9yaXpvbnRhbGx5LmZsaXBwZWQuaWNvbnstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm06c2NhbGUoLTEsMSl9aS52ZXJ0aWNhbGx5LmZsaXBwZWQuaWNvbnstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLC0xKTt0cmFuc2Zvcm06c2NhbGUoMSwtMSl9aS5jbG9ja3dpc2Uucm90YXRlZC5pY29uLGkucmlnaHQucm90YXRlZC5pY29uLGkucm90YXRlZC5pY29uey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9aS5jb3VudGVyY2xvY2t3aXNlLnJvdGF0ZWQuaWNvbixpLmxlZnQucm90YXRlZC5pY29uey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKX1pLmJvcmRlcmVkLmljb257bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aWR0aDoyZW07aGVpZ2h0OjJlbTtwYWRkaW5nOi41ZW0gMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIC4xZW0gcmdiYSgwLDAsMCwuMSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAuMWVtIHJnYmEoMCwwLDAsLjEpIGluc2V0fWkuYm9yZGVyZWQuaW52ZXJ0ZWQuaWNvbntib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9aS5pbnZlcnRlZC5ib3JkZXJlZC5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuaWNvbntjb2xvcjojZmZmfWkucmVkLmljb257Y29sb3I6I2RiMjgyOCFpbXBvcnRhbnR9aS5pbnZlcnRlZC5yZWQuaWNvbntjb2xvcjojZmY2OTVlIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLnJlZC5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIucmVkLmljb257YmFja2dyb3VuZC1jb2xvcjojZGIyODI4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLm9yYW5nZS5pY29ue2NvbG9yOiNmMjcxMWMhaW1wb3J0YW50fWkuaW52ZXJ0ZWQub3JhbmdlLmljb257Y29sb3I6I2ZmODUxYiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5vcmFuZ2UuaWNvbixpLmludmVydGVkLmNpcmN1bGFyLm9yYW5nZS5pY29ue2JhY2tncm91bmQtY29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS55ZWxsb3cuaWNvbntjb2xvcjojZmJiZDA4IWltcG9ydGFudH1pLmludmVydGVkLnllbGxvdy5pY29ue2NvbG9yOiNmZmUyMWYhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQueWVsbG93Lmljb24saS5pbnZlcnRlZC5jaXJjdWxhci55ZWxsb3cuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiNmYmJkMDghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkub2xpdmUuaWNvbntjb2xvcjojYjVjYzE4IWltcG9ydGFudH1pLmludmVydGVkLm9saXZlLmljb257Y29sb3I6I2Q5ZTc3OCFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5vbGl2ZS5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIub2xpdmUuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiNiNWNjMTghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkuZ3JlZW4uaWNvbntjb2xvcjojMjFiYTQ1IWltcG9ydGFudH1pLmludmVydGVkLmdyZWVuLmljb257Y29sb3I6IzJlY2M0MCFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5ncmVlbi5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIuZ3JlZW4uaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkudGVhbC5pY29ue2NvbG9yOiMwMGI1YWQhaW1wb3J0YW50fWkuaW52ZXJ0ZWQudGVhbC5pY29ue2NvbG9yOiM2ZGZmZmYhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQudGVhbC5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIudGVhbC5pY29ue2JhY2tncm91bmQtY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5ibHVlLmljb257Y29sb3I6IzIxODVkMCFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ibHVlLmljb257Y29sb3I6IzU0YzhmZiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5ibHVlLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5ibHVlLmljb257YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLnZpb2xldC5pY29ue2NvbG9yOiM2NDM1YzkhaW1wb3J0YW50fWkuaW52ZXJ0ZWQudmlvbGV0Lmljb257Y29sb3I6I2EyOTFmYiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC52aW9sZXQuaWNvbixpLmludmVydGVkLmNpcmN1bGFyLnZpb2xldC5pY29ue2JhY2tncm91bmQtY29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5wdXJwbGUuaWNvbntjb2xvcjojYTMzM2M4IWltcG9ydGFudH1pLmludmVydGVkLnB1cnBsZS5pY29ue2NvbG9yOiNkYzczZmYhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQucHVycGxlLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5wdXJwbGUuaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiNhMzMzYzghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fWkucGluay5pY29ue2NvbG9yOiNlMDM5OTchaW1wb3J0YW50fWkuaW52ZXJ0ZWQucGluay5pY29ue2NvbG9yOiNmZjhlZGYhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQucGluay5pY29uLGkuaW52ZXJ0ZWQuY2lyY3VsYXIucGluay5pY29ue2JhY2tncm91bmQtY29sb3I6I2UwMzk5NyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5icm93bi5pY29ue2NvbG9yOiNhNTY3M2YhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYnJvd24uaWNvbntjb2xvcjojZDY3YzFjIWltcG9ydGFudH1pLmludmVydGVkLmJvcmRlcmVkLmJyb3duLmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5icm93bi5pY29ue2JhY2tncm91bmQtY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9aS5ncmV5Lmljb257Y29sb3I6Izc2NzY3NiFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ncmV5Lmljb257Y29sb3I6I2RjZGRkZSFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ib3JkZXJlZC5ncmV5Lmljb24saS5pbnZlcnRlZC5jaXJjdWxhci5ncmV5Lmljb257YmFja2dyb3VuZC1jb2xvcjojNzY3Njc2IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLmJsYWNrLmljb257Y29sb3I6IzFiMWMxZCFpbXBvcnRhbnR9aS5pbnZlcnRlZC5ibGFjay5pY29ue2NvbG9yOiM1NDU0NTQhaW1wb3J0YW50fWkuaW52ZXJ0ZWQuYm9yZGVyZWQuYmxhY2suaWNvbixpLmludmVydGVkLmNpcmN1bGFyLmJsYWNrLmljb257YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH1pLm1pbmkuaWNvbixpLm1pbmkuaWNvbnN7bGluZS1oZWlnaHQ6MTtmb250LXNpemU6LjRlbX1pLnRpbnkuaWNvbixpLnRpbnkuaWNvbnN7bGluZS1oZWlnaHQ6MTtmb250LXNpemU6LjVlbX1pLnNtYWxsLmljb24saS5zbWFsbC5pY29uc3tsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZTouNzVlbX1pLmljb24saS5pY29uc3tmb250LXNpemU6MWVtfWkubGFyZ2UuaWNvbixpLmxhcmdlLmljb25ze2xpbmUtaGVpZ2h0OjE7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToxLjVlbX1pLmJpZy5pY29uLGkuYmlnLmljb25ze2xpbmUtaGVpZ2h0OjE7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZToyZW19aS5odWdlLmljb24saS5odWdlLmljb25ze2xpbmUtaGVpZ2h0OjE7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZTo0ZW19aS5tYXNzaXZlLmljb24saS5tYXNzaXZlLmljb25ze2xpbmUtaGVpZ2h0OjE7dmVydGljYWwtYWxpZ246bWlkZGxlO2ZvbnQtc2l6ZTo4ZW19aS5pY29uc3tkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtsaW5lLWhlaWdodDoxfWkuaWNvbnMgLmljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTttYXJnaW46MDttYXJnaW46MH1pLmljb25zIC5pY29uOmZpcnN0LWNoaWxke3Bvc2l0aW9uOnN0YXRpYzt3aWR0aDphdXRvO2hlaWdodDphdXRvO3ZlcnRpY2FsLWFsaWduOnRvcDstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO21hcmdpbi1yaWdodDouMjVyZW19aS5pY29ucyAuY29ybmVyLmljb257dG9wOmF1dG87bGVmdDphdXRvO3JpZ2h0OjA7Ym90dG9tOjA7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTtmb250LXNpemU6LjQ1ZW07dGV4dC1zaGFkb3c6LTFweCAtMXB4IDAgI2ZmZiwxcHggLTFweCAwICNmZmYsLTFweCAxcHggMCAjZmZmLDFweCAxcHggMCAjZmZmfWkuaWNvbnMgLnRvcC5yaWdodC5jb3JuZXIuaWNvbnt0b3A6MDtsZWZ0OmF1dG87cmlnaHQ6MDtib3R0b206YXV0b31pLmljb25zIC50b3AubGVmdC5jb3JuZXIuaWNvbnt0b3A6MDtsZWZ0OjA7cmlnaHQ6YXV0bztib3R0b206YXV0b31pLmljb25zIC5ib3R0b20ubGVmdC5jb3JuZXIuaWNvbnt0b3A6YXV0bztsZWZ0OjA7cmlnaHQ6YXV0bztib3R0b206MH1pLmljb25zIC5ib3R0b20ucmlnaHQuY29ybmVyLmljb257dG9wOmF1dG87bGVmdDphdXRvO3JpZ2h0OjA7Ym90dG9tOjB9aS5pY29ucyAuaW52ZXJ0ZWQuY29ybmVyLmljb257dGV4dC1zaGFkb3c6LTFweCAtMXB4IDAgIzFiMWMxZCwxcHggLTFweCAwICMxYjFjMWQsLTFweCAxcHggMCAjMWIxYzFkLDFweCAxcHggMCAjMWIxYzFkfWkuaWNvbi5saW5rZWRpbi5pbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTFcXFwifWkuaWNvbi56b29tLmluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZVxcXCJ9aS5pY29uLnpvb20ub3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxMFxcXCJ9aS5pY29uLnNpZ24uaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmY2XFxcIn1pLmljb24uaW4uY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMThcXFwifWkuaWNvbi5sb2cub3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmNVxcXCJ9aS5pY29uLnNpZ24ub3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJmNVxcXCJ9aS5pY29uLlxcXFwzNSAwMHB4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2ZVxcXCJ9aS5pY29uLmFjY2Vzc2libGUuaWNvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNjhcXFwifWkuaWNvbi5hY2N1c29mdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNjlcXFwifWkuaWNvbi5hZGRyZXNzLmJvb2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmI5XFxcIn1pLmljb24uYWRkcmVzcy5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiYlxcXCJ9aS5pY29uLmFkanVzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDJcXFwifWkuaWNvbi5hZG46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTcwXFxcIn1pLmljb24uYWR2ZXJzYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzZhXFxcIn1pLmljb24uYWZmaWxpYXRldGhlbWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzZiXFxcIn1pLmljb24uYWxnb2xpYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNmNcXFwifWkuaWNvbi5hbGlnbi5jZW50ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDM3XFxcIn1pLmljb24uYWxpZ24uanVzdGlmeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzlcXFwifWkuaWNvbi5hbGlnbi5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzNlxcXCJ9aS5pY29uLmFsaWduLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzOFxcXCJ9aS5pY29uLmFtYXpvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzBcXFwifWkuaWNvbi5hbWF6b24ucGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyY1xcXCJ9aS5pY29uLmFtYnVsYW5jZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjlcXFwifWkuaWNvbi5hbWVyaWNhbi5zaWduLmxhbmd1YWdlLmludGVycHJldGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTNcXFwifWkuaWNvbi5hbWlsaWE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzZkXFxcIn1pLmljb24uYW5jaG9yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzZFxcXCJ9aS5pY29uLmFuZHJvaWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTdiXFxcIn1pLmljb24uYW5nZWxsaXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwOVxcXCJ9aS5pY29uLmFuZ2xlLmRvdWJsZS5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwM1xcXCJ9aS5pY29uLmFuZ2xlLmRvdWJsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwMFxcXCJ9aS5pY29uLmFuZ2xlLmRvdWJsZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMDFcXFwifWkuaWNvbi5hbmdsZS5kb3VibGUudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTAyXFxcIn1pLmljb24uYW5nbGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMDdcXFwifWkuaWNvbi5hbmdsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwNFxcXCJ9aS5pY29uLmFuZ2xlLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwNVxcXCJ9aS5pY29uLmFuZ2xlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEwNlxcXCJ9aS5pY29uLmFuZ3J5Y3JlYXRpdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzZlXFxcIn1pLmljb24uYW5ndWxhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MjBcXFwifWkuaWNvbi5hcHAuc3RvcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzZmXFxcIn1pLmljb24uYXBwLnN0b3JlLmlvczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNzBcXFwifWkuaWNvbi5hcHBlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNzFcXFwifWkuaWNvbi5hcHBsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNzlcXFwifWkuaWNvbi5hcHBsZS5wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDE1XFxcIn1pLmljb24uYXJjaGl2ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODdcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzU4XFxcIn1pLmljb24uYXJyb3cuYWx0ZXJuYXRlLmNpcmNsZS5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1OVxcXCJ9aS5pY29uLmFycm93LmFsdGVybmF0ZS5jaXJjbGUucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzVhXFxcIn1pLmljb24uYXJyb3cuYWx0ZXJuYXRlLmNpcmNsZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNWJcXFwifWkuaWNvbi5hcnJvdy5jaXJjbGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYWJcXFwifWkuaWNvbi5hcnJvdy5jaXJjbGUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYThcXFwifWkuaWNvbi5hcnJvdy5jaXJjbGUucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE5XFxcIn1pLmljb24uYXJyb3cuY2lyY2xlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhYVxcXCJ9aS5pY29uLmFycm93LmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDYzXFxcIn1pLmljb24uYXJyb3cubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjBcXFwifWkuaWNvbi5hcnJvdy5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjFcXFwifWkuaWNvbi5hcnJvdy51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjJcXFwifWkuaWNvbi5hcnJvd3MuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBiMlxcXCJ9aS5pY29uLmFycm93cy5hbHRlcm5hdGUuaG9yaXpvbnRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMzdcXFwifWkuaWNvbi5hcnJvd3MuYWx0ZXJuYXRlLnZlcnRpY2FsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMzOFxcXCJ9aS5pY29uLmFzc2lzdGl2ZS5saXN0ZW5pbmcuc3lzdGVtczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTJcXFwifWkuaWNvbi5hc3RlcmlzazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjlcXFwifWkuaWNvbi5hc3ltbWV0cmlrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM3MlxcXCJ9aS5pY29uLmF0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmYVxcXCJ9aS5pY29uLmF1ZGlibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzczXFxcIn1pLmljb24uYXVkaW8uZGVzY3JpcHRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjllXFxcIn1pLmljb24uYXV0b3ByZWZpeGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxY1xcXCJ9aS5pY29uLmF2aWFuZXg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzc0XFxcIn1pLmljb24uYXZpYXRvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyMVxcXCJ9aS5pY29uLmF3czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNzVcXFwifWkuaWNvbi5iYWNrd2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNGFcXFwifWkuaWNvbi5iYWxhbmNlLnNjYWxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0ZVxcXCJ9aS5pY29uLmJhbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNWVcXFwifWkuaWNvbi5iYW5kLmFpZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NjJcXFwifWkuaWNvbi5iYW5kY2FtcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDVcXFwifWkuaWNvbi5iYXJjb2RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyYVxcXCJ9aS5pY29uLmJhcnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM5XFxcIn1pLmljb24uYmFzZWJhbGwuYmFsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MzNcXFwifWkuaWNvbi5iYXNrZXRiYWxsLmJhbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDM0XFxcIn1pLmljb24uYmF0aDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyY2RcXFwifWkuaWNvbi5iYXR0ZXJ5LmVtcHR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0NFxcXCJ9aS5pY29uLmJhdHRlcnkuZnVsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDBcXFwifWkuaWNvbi5iYXR0ZXJ5LmhhbGY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQyXFxcIn1pLmljb24uYmF0dGVyeS5xdWFydGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0M1xcXCJ9aS5pY29uLmJhdHRlcnkudGhyZWUucXVhcnRlcnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQxXFxcIn1pLmljb24uYmVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzNlxcXCJ9aS5pY29uLmJlZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZjXFxcIn1pLmljb24uYmVoYW5jZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjRcXFwifWkuaWNvbi5iZWhhbmNlLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjVcXFwifWkuaWNvbi5iZWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmM1xcXCJ9aS5pY29uLmJlbGwuc2xhc2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY2XFxcIn1pLmljb24uYmljeWNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDZcXFwifWkuaWNvbi5iaW1vYmplY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzc4XFxcIn1pLmljb24uYmlub2N1bGFyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTVcXFwifWkuaWNvbi5iaXJ0aGRheS5jYWtlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmZFxcXCJ9aS5pY29uLmJpdGJ1Y2tldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNzFcXFwifWkuaWNvbi5iaXRjb2luOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM3OVxcXCJ9aS5pY29uLmJpdHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzdhXFxcIn1pLmljb24uYmxhY2sudGllOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3ZVxcXCJ9aS5pY29uLmJsYWNrYmVycnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzdiXFxcIn1pLmljb24uYmxpbmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjlkXFxcIn1pLmljb24uYmxvZ2dlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzN2NcXFwifWkuaWNvbi5ibG9nZ2VyLmI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzdkXFxcIn1pLmljb24uYmx1ZXRvb3RoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5M1xcXCJ9aS5pY29uLmJsdWV0b290aC5iOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5NFxcXCJ9aS5pY29uLmJvbGQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDMyXFxcIn1pLmljb24uYm9sdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTdcXFwifWkuaWNvbi5ib21iOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlMlxcXCJ9aS5pY29uLmJvb2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDJkXFxcIn1pLmljb24uYm9va21hcms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDJlXFxcIn1pLmljb24uYm93bGluZy5iYWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQzNlxcXCJ9aS5pY29uLmJveDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NjZcXFwifWkuaWNvbi5ib3hlczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NjhcXFwifWkuaWNvbi5icmFpbGxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhMVxcXCJ9aS5pY29uLmJyaWVmY2FzZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYjFcXFwifWkuaWNvbi5idGM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTVhXFxcIn1pLmljb24uYnVnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4OFxcXCJ9aS5pY29uLmJ1aWxkaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhZFxcXCJ9aS5pY29uLmJ1bGxob3JuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhMVxcXCJ9aS5pY29uLmJ1bGxzZXllOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0MFxcXCJ9aS5pY29uLmJ1cm9tb2JlbGV4cGVydGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzdmXFxcIn1pLmljb24uYnVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwN1xcXCJ9aS5pY29uLmJ1eXNlbGxhZHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjBkXFxcIn1pLmljb24uY2FsY3VsYXRvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZWNcXFwifWkuaWNvbi5jYWxlbmRhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzNcXFwifWkuaWNvbi5jYWxlbmRhci5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDczXFxcIn1pLmljb24uY2FsZW5kYXIuY2hlY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjc0XFxcIn1pLmljb24uY2FsZW5kYXIubWludXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjcyXFxcIn1pLmljb24uY2FsZW5kYXIucGx1czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzFcXFwifWkuaWNvbi5jYWxlbmRhci50aW1lczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzNcXFwifWkuaWNvbi5jYW1lcmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDMwXFxcIn1pLmljb24uY2FtZXJhLnJldHJvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4M1xcXCJ9aS5pY29uLmNhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjlcXFwifWkuaWNvbi5jYXJldC5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkN1xcXCJ9aS5pY29uLmNhcmV0LmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQ5XFxcIn1pLmljb24uY2FyZXQucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRhXFxcIn1pLmljb24uY2FyZXQuc3F1YXJlLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUwXFxcIn1pLmljb24uY2FyZXQuc3F1YXJlLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTkxXFxcIn1pLmljb24uY2FyZXQuc3F1YXJlLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1MlxcXCJ9aS5pY29uLmNhcmV0LnNxdWFyZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTFcXFwifWkuaWNvbi5jYXJldC51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDhcXFwifWkuaWNvbi5jYXJ0LmFycm93LmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE4XFxcIn1pLmljb24uY2FydC5wbHVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxN1xcXCJ9aS5pY29uLmNjLmFtYXpvbi5wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDJkXFxcIn1pLmljb24uY2MuYW1leDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjNcXFwifWkuaWNvbi5jYy5hcHBsZS5wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDE2XFxcIn1pLmljb24uY2MuZGluZXJzLmNsdWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRjXFxcIn1pLmljb24uY2MuZGlzY292ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYyXFxcIn1pLmljb24uY2MuamNiOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0YlxcXCJ9aS5pY29uLmNjLm1hc3RlcmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYxXFxcIn1pLmljb24uY2MucGF5cGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmNFxcXCJ9aS5pY29uLmNjLnN0cmlwZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjVcXFwifWkuaWNvbi5jYy52aXNhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMFxcXCJ9aS5pY29uLmNlbnRlcmNvZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzgwXFxcIn1pLmljb24uY2VydGlmaWNhdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGEzXFxcIn1pLmljb24uY2hhcnQuYXJlYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZmVcXFwifWkuaWNvbi5jaGFydC5iYXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDgwXFxcIn1pLmljb24uY2hhcnQubGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDFcXFwifWkuaWNvbi5jaGFydC5waWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjAwXFxcIn1pLmljb24uY2hlY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBjXFxcIn1pLmljb24uY2hlY2suY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1OFxcXCJ9aS5pY29uLmNoZWNrLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGFcXFwifWkuaWNvbi5jaGVzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MzlcXFwifWkuaWNvbi5jaGVzcy5iaXNob3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDNhXFxcIn1pLmljb24uY2hlc3MuYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDNjXFxcIn1pLmljb24uY2hlc3Mua2luZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0M2ZcXFwifWkuaWNvbi5jaGVzcy5rbmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDQxXFxcIn1pLmljb24uY2hlc3MucGF3bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NDNcXFwifWkuaWNvbi5jaGVzcy5xdWVlbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NDVcXFwifWkuaWNvbi5jaGVzcy5yb29rOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ0N1xcXCJ9aS5pY29uLmNoZXZyb24uY2lyY2xlLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTNhXFxcIn1pLmljb24uY2hldnJvbi5jaXJjbGUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzdcXFwifWkuaWNvbi5jaGV2cm9uLmNpcmNsZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzhcXFwifWkuaWNvbi5jaGV2cm9uLmNpcmNsZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzlcXFwifWkuaWNvbi5jaGV2cm9uLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc4XFxcIn1pLmljb24uY2hldnJvbi5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1M1xcXCJ9aS5pY29uLmNoZXZyb24ucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU0XFxcIn1pLmljb24uY2hldnJvbi51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzdcXFwifWkuaWNvbi5jaGlsZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYWVcXFwifWkuaWNvbi5jaHJvbWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjY4XFxcIn1pLmljb24uY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExMVxcXCJ9aS5pY29uLmNpcmNsZS5ub3RjaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxY2VcXFwifWkuaWNvbi5jbGlwYm9hcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzI4XFxcIn1pLmljb24uY2xpcGJvYXJkLmNoZWNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ2Y1xcXCJ9aS5pY29uLmNsaXBib2FyZC5saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ2ZFxcXCJ9aS5pY29uLmNsb2NrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxN1xcXCJ9aS5pY29uLmNsb25lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0ZFxcXCJ9aS5pY29uLmNsb3NlZC5jYXB0aW9uaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwYVxcXCJ9aS5pY29uLmNsb3VkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjMlxcXCJ9aS5pY29uLmNsb3Vkc2NhbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzgzXFxcIn1pLmljb24uY2xvdWRzbWl0aDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzODRcXFwifWkuaWNvbi5jbG91ZHZlcnNpZnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzg1XFxcIn1pLmljb24uY29kZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjFcXFwifWkuaWNvbi5jb2RlLmJyYW5jaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjZcXFwifWkuaWNvbi5jb2RlcGVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjYlxcXCJ9aS5pY29uLmNvZGllcGllOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4NFxcXCJ9aS5pY29uLmNvZmZlZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjRcXFwifWkuaWNvbi5jb2c6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDEzXFxcIn1pLmljb24uY29nczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODVcXFwifWkuaWNvbi5jb2x1bW5zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkYlxcXCJ9aS5pY29uLmNvbW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc1XFxcIn1pLmljb24uY29tbWVudC5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjdhXFxcIn1pLmljb24uY29tbWVudHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg2XFxcIn1pLmljb24uY29tcGFzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGVcXFwifWkuaWNvbi5jb21wcmVzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjZcXFwifWkuaWNvbi5jb25uZWN0ZGV2ZWxvcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGVcXFwifWkuaWNvbi5jb250YW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjZkXFxcIn1pLmljb24uY29weTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzVcXFwifWkuaWNvbi5jb3B5cmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY5XFxcIn1pLmljb24uY3BhbmVsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4OFxcXCJ9aS5pY29uLmNyZWF0aXZlLmNvbW1vbnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjVlXFxcIn1pLmljb24uY3JlZGl0LmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDlkXFxcIn1pLmljb24uY3JvcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjVcXFwifWkuaWNvbi5jcm9zc2hhaXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1YlxcXCJ9aS5pY29uLmNzczM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTNjXFxcIn1pLmljb24uY3NzMy5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzhiXFxcIn1pLmljb24uY3ViZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjJcXFwifWkuaWNvbi5jdWJlczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjNcXFwifWkuaWNvbi5jdXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM0XFxcIn1pLmljb24uY3V0dGxlZmlzaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOGNcXFwifWkuaWNvbi5kLmFuZC5kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4ZFxcXCJ9aS5pY29uLmRhc2hjdWJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxMFxcXCJ9aS5pY29uLmRhdGFiYXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjMFxcXCJ9aS5pY29uLmRlYWY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmE0XFxcIn1pLmljb24uZGVsaWNpb3VzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhNVxcXCJ9aS5pY29uLmRlcGxveWRvZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOGVcXFwifWkuaWNvbi5kZXNrcHJvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM4ZlxcXCJ9aS5pY29uLmRlc2t0b3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTA4XFxcIn1pLmljb24uZGV2aWFudGFydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYmRcXFwifWkuaWNvbi5kaWdnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhNlxcXCJ9aS5pY29uLmRpZ2l0YWwub2NlYW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzkxXFxcIn1pLmljb24uZGlzY29yZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTJcXFwifWkuaWNvbi5kaXNjb3Vyc2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzkzXFxcIn1pLmljb24uZG5hOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ3MVxcXCJ9aS5pY29uLmRvY2h1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTRcXFwifWkuaWNvbi5kb2NrZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzk1XFxcIn1pLmljb24uZG9sbGFyLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU1XFxcIn1pLmljb24uZG9sbHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDcyXFxcIn1pLmljb24uZG9sbHkuZmxhdGJlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NzRcXFwifWkuaWNvbi5kb3QuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5MlxcXCJ9aS5pY29uLmRvd25sb2FkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxOVxcXCJ9aS5pY29uLmRyYWZ0MmRpZ2l0YWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzk2XFxcIn1pLmljb24uZHJpYmJibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTdkXFxcIn1pLmljb24uZHJpYmJibGUuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM5N1xcXCJ9aS5pY29uLmRyb3Bib3g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTZiXFxcIn1pLmljb24uZHJ1cGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhOVxcXCJ9aS5pY29uLmR5YWxvZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOTlcXFwifWkuaWNvbi5lYXJseWJpcmRzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM5YVxcXCJ9aS5pY29uLmVkZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjgyXFxcIn1pLmljb24uZWRpdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDRcXFwifWkuaWNvbi5lamVjdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTJcXFwifWkuaWNvbi5lbGVtZW50b3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDMwXFxcIn1pLmljb24uZWxsaXBzaXMuaG9yaXpvbnRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDFcXFwifWkuaWNvbi5lbGxpcHNpcy52ZXJ0aWNhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDJcXFwifWkuaWNvbi5lbWJlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MjNcXFwifWkuaWNvbi5lbXBpcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQxXFxcIn1pLmljb24uZW52ZWxvcGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGUwXFxcIn1pLmljb24uZW52ZWxvcGUub3BlbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjZcXFwifWkuaWNvbi5lbnZlbG9wZS5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTk5XFxcIn1pLmljb24uZW52aXJhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5OVxcXCJ9aS5pY29uLmVyYXNlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMmRcXFwifWkuaWNvbi5lcmxhbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzlkXFxcIn1pLmljb24uZXRoZXJldW06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDJlXFxcIn1pLmljb24uZXRzeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDdcXFwifWkuaWNvbi5ldXJvLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUzXFxcIn1pLmljb24uZXhjaGFuZ2UuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM2MlxcXCJ9aS5pY29uLmV4Y2xhbWF0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyYVxcXCJ9aS5pY29uLmV4Y2xhbWF0aW9uLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNmFcXFwifWkuaWNvbi5leGNsYW1hdGlvbi50cmlhbmdsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzFcXFwifWkuaWNvbi5leHBhbmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDY1XFxcIn1pLmljb24uZXhwYW5kLmFycm93cy5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzFlXFxcIn1pLmljb24uZXhwZWRpdGVkc3NsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzZVxcXCJ9aS5pY29uLmV4dGVybmFsLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNWRcXFwifWkuaWNvbi5leHRlcm5hbC5zcXVhcmUuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM2MFxcXCJ9aS5pY29uLmV5ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNmVcXFwifWkuaWNvbi5leWUuZHJvcHBlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZmJcXFwifWkuaWNvbi5leWUuc2xhc2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDcwXFxcIn1pLmljb24uZmFjZWJvb2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDlhXFxcIn1pLmljb24uZmFjZWJvb2suZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzOWVcXFwifWkuaWNvbi5mYWNlYm9vay5tZXNzZW5nZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzlmXFxcIn1pLmljb24uZmFjZWJvb2suc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4MlxcXCJ9aS5pY29uLmZhc3QuYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQ5XFxcIn1pLmljb24uZmFzdC5mb3J3YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1MFxcXCJ9aS5pY29uLmZheDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYWNcXFwifWkuaWNvbi5mZW1hbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTgyXFxcIn1pLmljb24uZmlnaHRlci5qZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZiXFxcIn1pLmljb24uZmlsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWJcXFwifWkuaWNvbi5maWxlLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWNcXFwifWkuaWNvbi5maWxlLmFyY2hpdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM2XFxcIn1pLmljb24uZmlsZS5hdWRpbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzdcXFwifWkuaWNvbi5maWxlLmNvZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM5XFxcIn1pLmljb24uZmlsZS5leGNlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzNcXFwifWkuaWNvbi5maWxlLmltYWdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjNVxcXCJ9aS5pY29uLmZpbGUucGRmOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjMVxcXCJ9aS5pY29uLmZpbGUucG93ZXJwb2ludDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzRcXFwifWkuaWNvbi5maWxlLnZpZGVvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjOFxcXCJ9aS5pY29uLmZpbGUud29yZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzJcXFwifWkuaWNvbi5maWxtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwOFxcXCJ9aS5pY29uLmZpbHRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYjBcXFwifWkuaWNvbi5maXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2ZFxcXCJ9aS5pY29uLmZpcmUuZXh0aW5ndWlzaGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzNFxcXCJ9aS5pY29uLmZpcmVmb3g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjY5XFxcIn1pLmljb24uZmlyc3QuYWlkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ3OVxcXCJ9aS5pY29uLmZpcnN0Lm9yZGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiMFxcXCJ9aS5pY29uLmZpcnN0ZHJhZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2ExXFxcIn1pLmljb24uZmxhZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjRcXFwifWkuaWNvbi5mbGFnLmNoZWNrZXJlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMWVcXFwifWkuaWNvbi5mbGFzazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzNcXFwifWkuaWNvbi5mbGlja3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTZlXFxcIn1pLmljb24uZmxpcGJvYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ0ZFxcXCJ9aS5pY29uLmZseTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTdcXFwifWkuaWNvbi5mb2xkZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDdiXFxcIn1pLmljb24uZm9sZGVyLm9wZW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDdjXFxcIn1pLmljb24uZm9udDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzFcXFwifWkuaWNvbi5mb250LmF3ZXNvbWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmI0XFxcIn1pLmljb24uZm9udC5hd2Vzb21lLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNWNcXFwifWkuaWNvbi5mb250LmF3ZXNvbWUuZmxhZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MjVcXFwifWkuaWNvbi5mb250aWNvbnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjgwXFxcIn1pLmljb24uZm9udGljb25zLmZpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhMlxcXCJ9aS5pY29uLmZvb3RiYWxsLmJhbGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDRlXFxcIn1pLmljb24uZm9ydC5hd2Vzb21lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4NlxcXCJ9aS5pY29uLmZvcnQuYXdlc29tZS5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2EzXFxcIn1pLmljb24uZm9ydW1iZWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjExXFxcIn1pLmljb24uZm9yd2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNGVcXFwifWkuaWNvbi5mb3Vyc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4MFxcXCJ9aS5pY29uLmZyZWUuY29kZS5jYW1wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjNVxcXCJ9aS5pY29uLmZyZWVic2Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2E0XFxcIn1pLmljb24uZnJvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTE5XFxcIn1pLmljb24uZnV0Ym9sOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlM1xcXCJ9aS5pY29uLmdhbWVwYWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTFiXFxcIn1pLmljb24uZ2F2ZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGUzXFxcIn1pLmljb24uZ2VtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhNVxcXCJ9aS5pY29uLmdlbmRlcmxlc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJkXFxcIn1pLmljb24uZ2V0LnBvY2tldDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjVcXFwifWkuaWNvbi5nZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjBcXFwifWkuaWNvbi5nZy5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjYxXFxcIn1pLmljb24uZ2lmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNmJcXFwifWkuaWNvbi5naXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQzXFxcIn1pLmljb24uZ2l0LnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDJcXFwifWkuaWNvbi5naXRodWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDliXFxcIn1pLmljb24uZ2l0aHViLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMTNcXFwifWkuaWNvbi5naXRodWIuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5MlxcXCJ9aS5pY29uLmdpdGtyYWtlbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTZcXFwifWkuaWNvbi5naXRsYWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk2XFxcIn1pLmljb24uZ2l0dGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQyNlxcXCJ9aS5pY29uLmdsYXNzLm1hcnRpbmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDAwXFxcIn1pLmljb24uZ2xpZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmE1XFxcIn1pLmljb24uZ2xpZGUuZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTZcXFwifWkuaWNvbi5nbG9iZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYWNcXFwifWkuaWNvbi5nb2ZvcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2E3XFxcIn1pLmljb24uZ29sZi5iYWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ1MFxcXCJ9aS5pY29uLmdvb2RyZWFkczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYThcXFwifWkuaWNvbi5nb29kcmVhZHMuZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTlcXFwifWkuaWNvbi5nb29nbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWEwXFxcIn1pLmljb24uZ29vZ2xlLmRyaXZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhYVxcXCJ9aS5pY29uLmdvb2dsZS5wbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhYlxcXCJ9aS5pY29uLmdvb2dsZS5wbHVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiM1xcXCJ9aS5pY29uLmdvb2dsZS5wbHVzLmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQ1XFxcIn1pLmljb24uZ29vZ2xlLnBsdXMuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkNFxcXCJ9aS5pY29uLmdvb2dsZS53YWxsZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWVlXFxcIn1pLmljb24uZ3JhZHVhdGlvbi5jYXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTlkXFxcIn1pLmljb24uZ3JhdGlwYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg0XFxcIn1pLmljb24uZ3JhdjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDZcXFwifWkuaWNvbi5ncmlwZmlyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYWNcXFwifWkuaWNvbi5ncnVudDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYWRcXFwifWkuaWNvbi5ndWxwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNhZVxcXCJ9aS5pY29uLmguc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmZFxcXCJ9aS5pY29uLmhhY2tlci5uZXdzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkNFxcXCJ9aS5pY29uLmhhY2tlci5uZXdzLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYWZcXFwifWkuaWNvbi5oYW5kLmxpemFyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNThcXFwifWkuaWNvbi5oYW5kLnBhcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1NlxcXCJ9aS5pY29uLmhhbmQucGVhY2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjViXFxcIn1pLmljb24uaGFuZC5wb2ludC5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhN1xcXCJ9aS5pY29uLmhhbmQucG9pbnQubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTVcXFwifWkuaWNvbi5oYW5kLnBvaW50LnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNFxcXCJ9aS5pY29uLmhhbmQucG9pbnQudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE2XFxcIn1pLmljb24uaGFuZC5wb2ludGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1YVxcXCJ9aS5pY29uLmhhbmQucm9jazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTVcXFwifWkuaWNvbi5oYW5kLnNjaXNzb3JzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1N1xcXCJ9aS5pY29uLmhhbmQuc3BvY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU5XFxcIn1pLmljb24uaGFuZHNoYWtlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiNVxcXCJ9aS5pY29uLmhhc2h0YWc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjkyXFxcIn1pLmljb24uaGRkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhMFxcXCJ9aS5pY29uLmhlYWRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWRjXFxcIn1pLmljb24uaGVhZHBob25lczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjVcXFwifWkuaWNvbi5oZWFydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDRcXFwifWkuaWNvbi5oZWFydGJlYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjFlXFxcIn1pLmljb24uaGlwczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NTJcXFwifWkuaWNvbi5oaXJlLmEuaGVscGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiMFxcXCJ9aS5pY29uLmhpc3Rvcnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWRhXFxcIn1pLmljb24uaG9ja2V5LnB1Y2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDUzXFxcIn1pLmljb24uaG9tZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTVcXFwifWkuaWNvbi5ob29saTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MjdcXFwifWkuaWNvbi5ob3NwaXRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjhcXFwifWkuaWNvbi5ob3NwaXRhbC5zeW1ib2w6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDdlXFxcIn1pLmljb24uaG90amFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiMVxcXCJ9aS5pY29uLmhvdXJnbGFzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTRcXFwifWkuaWNvbi5ob3VyZ2xhc3MuZW5kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1M1xcXCJ9aS5pY29uLmhvdXJnbGFzcy5oYWxmOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1MlxcXCJ9aS5pY29uLmhvdXJnbGFzcy5zdGFydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTFcXFwifWkuaWNvbi5ob3V6ejpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyN2NcXFwifWkuaWNvbi5odG1sNTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxM2JcXFwifWkuaWNvbi5odWJzcG90OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiMlxcXCJ9aS5pY29uLmkuY3Vyc29yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0NlxcXCJ9aS5pY29uLmlkLmJhZGdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjMVxcXCJ9aS5pY29uLmlkLmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmMyXFxcIn1pLmljb24uaW1hZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDNlXFxcIn1pLmljb24uaW1hZ2VzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwMlxcXCJ9aS5pY29uLmltZGI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQ4XFxcIn1pLmljb24uaW5ib3g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDFjXFxcIn1pLmljb24uaW5kZW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzY1xcXCJ9aS5pY29uLmluZHVzdHJ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3NVxcXCJ9aS5pY29uLmluZm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI5XFxcIn1pLmljb24uaW5mby5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDVhXFxcIn1pLmljb24uaW5zdGFncmFtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2ZFxcXCJ9aS5pY29uLmludGVybmV0LmV4cGxvcmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2YlxcXCJ9aS5pY29uLmlveGhvc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjA4XFxcIn1pLmljb24uaXRhbGljOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzM1xcXCJ9aS5pY29uLml0dW5lczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYjRcXFwifWkuaWNvbi5pdHVuZXMubm90ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYjVcXFwifWkuaWNvbi5qZW5raW5zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiNlxcXCJ9aS5pY29uLmpvZ2V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiN1xcXCJ9aS5pY29uLmpvb21sYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYWFcXFwifWkuaWNvbi5qczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYjhcXFwifWkuaWNvbi5qcy5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2I5XFxcIn1pLmljb24uanNmaWRkbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWNjXFxcIn1pLmljb24ua2V5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4NFxcXCJ9aS5pY29uLmtleWJvYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExY1xcXCJ9aS5pY29uLmtleWNkbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYmFcXFwifWkuaWNvbi5raWNrc3RhcnRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYmJcXFwifWkuaWNvbi5raWNrc3RhcnRlci5rOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiY1xcXCJ9aS5pY29uLmtvcnZ1ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MmZcXFwifWkuaWNvbi5sYW5ndWFnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYWJcXFwifWkuaWNvbi5sYXB0b3A6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTA5XFxcIn1pLmljb24ubGFyYXZlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYmRcXFwifWkuaWNvbi5sYXN0Zm06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjAyXFxcIn1pLmljb24ubGFzdGZtLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDNcXFwifWkuaWNvbi5sZWFmOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2Y1xcXCJ9aS5pY29uLmxlYW5wdWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjEyXFxcIn1pLmljb24ubGVtb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDk0XFxcIn1pLmljb24ubGVzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MWRcXFwifWkuaWNvbi5sZXZlbC5kb3duLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYmVcXFwifWkuaWNvbi5sZXZlbC51cC5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2JmXFxcIn1pLmljb24ubGlmZS5yaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjZFxcXCJ9aS5pY29uLmxpZ2h0YnVsYjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZWJcXFwifWkuaWNvbi5saW5lY2hhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYzBcXFwifWkuaWNvbi5saW5raWZ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjMVxcXCJ9aS5pY29uLmxpbmtlZGluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4Y1xcXCJ9aS5pY29uLmxpbmtlZGluLmFsdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTFcXFwifWkuaWNvbi5saW5vZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmI4XFxcIn1pLmljb24ubGludXg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTdjXFxcIn1pLmljb24ubGlyYS5zaWduOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5NVxcXCJ9aS5pY29uLmxpc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDNhXFxcIn1pLmljb24ubGlzdC5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDIyXFxcIn1pLmljb24ubGlzdC5vbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwY2JcXFwifWkuaWNvbi5saXN0LnVsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjYVxcXCJ9aS5pY29uLmxvY2F0aW9uLmFycm93OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyNFxcXCJ9aS5pY29uLmxvY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDIzXFxcIn1pLmljb24ubG9jay5vcGVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjMVxcXCJ9aS5pY29uLmxvbmcuYXJyb3cuYWx0ZXJuYXRlLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzA5XFxcIn1pLmljb24ubG9uZy5hcnJvdy5hbHRlcm5hdGUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMGFcXFwifWkuaWNvbi5sb25nLmFycm93LmFsdGVybmF0ZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMGJcXFwifWkuaWNvbi5sb25nLmFycm93LmFsdGVybmF0ZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMGNcXFwifWkuaWNvbi5sb3cudmlzaW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhOFxcXCJ9aS5pY29uLmx5ZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2MzXFxcIn1pLmljb24ubWFnZW50bzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYzRcXFwifWkuaWNvbi5tYWdpYzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDBcXFwifWkuaWNvbi5tYWduZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc2XFxcIn1pLmljb24ubWFsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODNcXFwifWkuaWNvbi5tYXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjc5XFxcIn1pLmljb24ubWFwLm1hcmtlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNDFcXFwifWkuaWNvbi5tYXAubWFya2VyLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYzVcXFwifWkuaWNvbi5tYXAucGluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3NlxcXCJ9aS5pY29uLm1hcC5zaWduczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzdcXFwifWkuaWNvbi5tYXJzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyMlxcXCJ9aS5pY29uLm1hcnMuZG91YmxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyN1xcXCJ9aS5pY29uLm1hcnMuc3Ryb2tlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyOVxcXCJ9aS5pY29uLm1hcnMuc3Ryb2tlLmhvcml6b250YWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJiXFxcIn1pLmljb24ubWFycy5zdHJva2UudmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJhXFxcIn1pLmljb24ubWF4Y2RuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzNlxcXCJ9aS5pY29uLm1lZGFwcHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2M2XFxcIn1pLmljb24ubWVkaXVtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzYVxcXCJ9aS5pY29uLm1lZGl1bS5tOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjN1xcXCJ9aS5pY29uLm1lZGtpdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmFcXFwifWkuaWNvbi5tZWRydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYzhcXFwifWkuaWNvbi5tZWV0dXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmUwXFxcIn1pLmljb24ubWVoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExYVxcXCJ9aS5pY29uLm1lcmN1cnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjIzXFxcIn1pLmljb24ubWljcm9jaGlwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkYlxcXCJ9aS5pY29uLm1pY3JvcGhvbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTMwXFxcIn1pLmljb24ubWljcm9waG9uZS5zbGFzaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzFcXFwifWkuaWNvbi5taWNyb3NvZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2NhXFxcIn1pLmljb24ubWludXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDY4XFxcIn1pLmljb24ubWludXMuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1NlxcXCJ9aS5pY29uLm1pbnVzLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDZcXFwifWkuaWNvbi5taXg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2NiXFxcIn1pLmljb24ubWl4Y2xvdWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjg5XFxcIn1pLmljb24ubWl6dW5pOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjY1xcXCJ9aS5pY29uLm1vYmlsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMGJcXFwifWkuaWNvbi5tb2JpbGUuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNjZFxcXCJ9aS5pY29uLm1vZHg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjg1XFxcIn1pLmljb24ubW9uZXJvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkMFxcXCJ9aS5pY29uLm1vbmV5LmJpbGwuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkMVxcXCJ9aS5pY29uLm1vb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg2XFxcIn1pLmljb24ubW90b3JjeWNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMWNcXFwifWkuaWNvbi5tb3VzZS5wb2ludGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0NVxcXCJ9aS5pY29uLm11c2ljOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwMVxcXCJ9aS5pY29uLm5hcHN0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2QyXFxcIn1pLmljb24ubmV1dGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyY1xcXCJ9aS5pY29uLm5ld3NwYXBlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZWFcXFwifWkuaWNvbi5uaW50ZW5kby5zd2l0Y2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDE4XFxcIn1pLmljb24ubm9kZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTlcXFwifWkuaWNvbi5ub2RlLmpzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkM1xcXCJ9aS5pY29uLm5wbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDRcXFwifWkuaWNvbi5uczg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Q1XFxcIn1pLmljb24ubnV0cml0aW9uaXg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Q2XFxcIn1pLmljb24ub2JqZWN0Lmdyb3VwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0N1xcXCJ9aS5pY29uLm9iamVjdC51bmdyb3VwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0OFxcXCJ9aS5pY29uLm9kbm9rbGFzc25pa2k6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjYzXFxcIn1pLmljb24ub2Rub2tsYXNzbmlraS5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjY0XFxcIn1pLmljb24ub3BlbmNhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNkXFxcIn1pLmljb24ub3BlbmlkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5YlxcXCJ9aS5pY29uLm9wZXJhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2YVxcXCJ9aS5pY29uLm9wdGluLm1vbnN0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNjXFxcIn1pLmljb24ub3NpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxYVxcXCJ9aS5pY29uLm91dGRlbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDNiXFxcIn1pLmljb24ucGFnZTQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Q3XFxcIn1pLmljb24ucGFnZWxpbmVzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4Y1xcXCJ9aS5pY29uLnBhaW50LmJydXNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmY1xcXCJ9aS5pY29uLnBhbGZlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDhcXFwifWkuaWNvbi5wYWxsZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDgyXFxcIn1pLmljb24ucGFwZXIucGxhbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQ4XFxcIn1pLmljb24ucGFwZXJjbGlwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjNlxcXCJ9aS5pY29uLnBhcmFncmFwaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZGRcXFwifWkuaWNvbi5wYXN0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZWFcXFwifWkuaWNvbi5wYXRyZW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNkOVxcXCJ9aS5pY29uLnBhdXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0Y1xcXCJ9aS5pY29uLnBhdXNlLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOGJcXFwifWkuaWNvbi5wYXc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWIwXFxcIn1pLmljb24ucGF5cGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlZFxcXCJ9aS5pY29uLnBlbi5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTRiXFxcIn1pLmljb24ucGVuY2lsLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMDNcXFwifWkuaWNvbi5wZXJjZW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5NVxcXCJ9aS5pY29uLnBlcmlzY29wZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZGFcXFwifWkuaWNvbi5waGFicmljYXRvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZGJcXFwifWkuaWNvbi5waG9lbml4LmZyYW1ld29yazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZGNcXFwifWkuaWNvbi5waG9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOTVcXFwifWkuaWNvbi5waG9uZS5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDk4XFxcIn1pLmljb24ucGhvbmUudm9sdW1lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhMFxcXCJ9aS5pY29uLnBocDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NTdcXFwifWkuaWNvbi5waWVkLnBpcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhZVxcXCJ9aS5pY29uLnBpZWQucGlwZXIuYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhOFxcXCJ9aS5pY29uLnBpZWQucGlwZXIucHA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWE3XFxcIn1pLmljb24ucGlsbHM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDg0XFxcIn1pLmljb24ucGludGVyZXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkMlxcXCJ9aS5pY29uLnBpbnRlcmVzdC5wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzMVxcXCJ9aS5pY29uLnBpbnRlcmVzdC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQzXFxcIn1pLmljb24ucGxhbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDcyXFxcIn1pLmljb24ucGxheTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNGJcXFwifWkuaWNvbi5wbGF5LmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNDRcXFwifWkuaWNvbi5wbGF5c3RhdGlvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZGZcXFwifWkuaWNvbi5wbHVnOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlNlxcXCJ9aS5pY29uLnBsdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDY3XFxcIn1pLmljb24ucGx1cy5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU1XFxcIn1pLmljb24ucGx1cy5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZlXFxcIn1pLmljb24ucG9kY2FzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyY2VcXFwifWkuaWNvbi5wb3VuZC5zaWduOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NFxcXCJ9aS5pY29uLnBvd2VyLm9mZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTFcXFwifWkuaWNvbi5wcmludDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmZcXFwifWkuaWNvbi5wcm9kdWN0Lmh1bnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjg4XFxcIn1pLmljb24ucHVzaGVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlMVxcXCJ9aS5pY29uLnB1enpsZS5waWVjZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMmVcXFwifWkuaWNvbi5weXRob246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2UyXFxcIn1pLmljb24ucXE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQ2XFxcIn1pLmljb24ucXJjb2RlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyOVxcXCJ9aS5pY29uLnF1ZXN0aW9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyOFxcXCJ9aS5pY29uLnF1ZXN0aW9uLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTlcXFwifWkuaWNvbi5xdWlkZGl0Y2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDU4XFxcIn1pLmljb24ucXVpbnNjYXBlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ1OVxcXCJ9aS5pY29uLnF1b3JhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjNFxcXCJ9aS5pY29uLnF1b3RlLmxlZnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTBkXFxcIn1pLmljb24ucXVvdGUucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTBlXFxcIn1pLmljb24ucmFuZG9tOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3NFxcXCJ9aS5pY29uLnJhdmVscnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQ5XFxcIn1pLmljb24ucmVhY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDFiXFxcIn1pLmljb24ucmViZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQwXFxcIn1pLmljb24ucmVjeWNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjhcXFwifWkuaWNvbi5yZWRyaXZlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZTNcXFwifWkuaWNvbi5yZWRkaXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWExXFxcIn1pLmljb24ucmVkZGl0LmFsaWVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4MVxcXCJ9aS5pY29uLnJlZGRpdC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWEyXFxcIn1pLmljb24ucmVkbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMWVcXFwifWkuaWNvbi5yZWRvLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjlcXFwifWkuaWNvbi5yZWdpc3RlcmVkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1ZFxcXCJ9aS5pY29uLnJlbmRhY3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2U0XFxcIn1pLmljb24ucmVucmVuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4YlxcXCJ9aS5pY29uLnJlcGx5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlNVxcXCJ9aS5pY29uLnJlcGx5LmFsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjJcXFwifWkuaWNvbi5yZXBseWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2U2XFxcIn1pLmljb24ucmVzb2x2aW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlN1xcXCJ9aS5pY29uLnJldHdlZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc5XFxcIn1pLmljb24ucm9hZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMThcXFwifWkuaWNvbi5yb2NrZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTM1XFxcIn1pLmljb24ucm9ja2V0Y2hhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZThcXFwifWkuaWNvbi5yb2Nrcm1zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNlOVxcXCJ9aS5pY29uLnJzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWVcXFwifWkuaWNvbi5yc3Muc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0M1xcXCJ9aS5pY29uLnJ1YmxlLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU4XFxcIn1pLmljb24ucnVwZWUuc2lnbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTZcXFwifWkuaWNvbi5zYWZhcmk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjY3XFxcIn1pLmljb24uc2FzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MWVcXFwifWkuaWNvbi5zYXZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjN1xcXCJ9aS5pY29uLnNjaGxpeDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWFcXFwifWkuaWNvbi5zY3JpYmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjhhXFxcIn1pLmljb24uc2VhcmNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwMlxcXCJ9aS5pY29uLnNlYXJjaC5taW51czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTBcXFwifWkuaWNvbi5zZWFyY2gucGx1czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGVcXFwifWkuaWNvbi5zZWFyY2hlbmdpbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWJcXFwifWkuaWNvbi5zZWxsY2FzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZGFcXFwifWkuaWNvbi5zZWxsc3k6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjEzXFxcIn1pLmljb24uc2VydmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzM1xcXCJ9aS5pY29uLnNlcnZpY2VzdGFjazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWNcXFwifWkuaWNvbi5zaGFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNjRcXFwifWkuaWNvbi5zaGFyZS5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWUwXFxcIn1pLmljb24uc2hhcmUuYWx0ZXJuYXRlLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTFcXFwifWkuaWNvbi5zaGFyZS5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTRkXFxcIn1pLmljb24uc2hla2VsLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjBiXFxcIn1pLmljb24uc2hpZWxkLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWRcXFwifWkuaWNvbi5zaGlwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxYVxcXCJ9aS5pY29uLnNoaXBwaW5nLmZhc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDhiXFxcIn1pLmljb24uc2hpcnRzaW5idWxrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxNFxcXCJ9aS5pY29uLnNob3BwaW5nLmJhZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTBcXFwifWkuaWNvbi5zaG9wcGluZy5iYXNrZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjkxXFxcIn1pLmljb24uc2hvcHBpbmcuY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwN2FcXFwifWkuaWNvbi5zaG93ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmNjXFxcIn1pLmljb24uc2lnbi5sYW5ndWFnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTdcXFwifWkuaWNvbi5zaWduYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDEyXFxcIn1pLmljb24uc2ltcGx5YnVpbHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE1XFxcIn1pLmljb24uc2lzdHJpeDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZWVcXFwifWkuaWNvbi5zaXRlbWFwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlOFxcXCJ9aS5pY29uLnNreWF0bGFzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxNlxcXCJ9aS5pY29uLnNreXBlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE3ZVxcXCJ9aS5pY29uLnNsYWNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5OFxcXCJ9aS5pY29uLnNsYWNrLmhhc2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2VmXFxcIn1pLmljb24uc2xpZGVycy5ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkZVxcXCJ9aS5pY29uLnNsaWRlc2hhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWU3XFxcIn1pLmljb24uc21pbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTE4XFxcIn1pLmljb24uc25hcGNoYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFiXFxcIn1pLmljb24uc25hcGNoYXQuZ2hvc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFjXFxcIn1pLmljb24uc25hcGNoYXQuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhZFxcXCJ9aS5pY29uLnNub3dmbGFrZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZGNcXFwifWkuaWNvbi5zb3J0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkY1xcXCJ9aS5pY29uLnNvcnQuYWxwaGFiZXQuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNWRcXFwifWkuaWNvbi5zb3J0LmFscGhhYmV0LnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1ZVxcXCJ9aS5pY29uLnNvcnQuYW1vdW50LmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYwXFxcIn1pLmljb24uc29ydC5hbW91bnQudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYxXFxcIn1pLmljb24uc29ydC5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkZFxcXCJ9aS5pY29uLnNvcnQubnVtZXJpYy5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE2MlxcXCJ9aS5pY29uLnNvcnQubnVtZXJpYy51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjNcXFwifWkuaWNvbi5zb3J0LnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkZVxcXCJ9aS5pY29uLnNvdW5kY2xvdWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWJlXFxcIn1pLmljb24uc3BhY2Uuc2h1dHRsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTdcXFwifWkuaWNvbi5zcGVha2FwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmM1xcXCJ9aS5pY29uLnNwaW5uZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTEwXFxcIn1pLmljb24uc3BvdGlmeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYmNcXFwifWkuaWNvbi5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM4XFxcIn1pLmljb24uc3F1YXJlLmZ1bGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDVjXFxcIn1pLmljb24uc3RhY2suZXhjaGFuZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMThkXFxcIn1pLmljb24uc3RhY2sub3ZlcmZsb3c6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTZjXFxcIn1pLmljb24uc3RhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDVcXFwifWkuaWNvbi5zdGFyLmhhbGY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg5XFxcIn1pLmljb24uc3RheWxpbmtlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZjVcXFwifWkuaWNvbi5zdGVhbTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYjZcXFwifWkuaWNvbi5zdGVhbS5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWI3XFxcIn1pLmljb24uc3RlYW0uc3ltYm9sOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmNlxcXCJ9aS5pY29uLnN0ZXAuYmFja3dhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQ4XFxcIn1pLmljb24uc3RlcC5mb3J3YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1MVxcXCJ9aS5pY29uLnN0ZXRob3Njb3BlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmMVxcXCJ9aS5pY29uLnN0aWNrZXIubXVsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZjdcXFwifWkuaWNvbi5zdGlja3kubm90ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDlcXFwifWkuaWNvbi5zdG9wOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0ZFxcXCJ9aS5pY29uLnN0b3AuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4ZFxcXCJ9aS5pY29uLnN0b3B3YXRjaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjJcXFwifWkuaWNvbi5zdHJhdmE6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDI4XFxcIn1pLmljb24uc3RyZWV0LnZpZXc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjFkXFxcIn1pLmljb24uc3RyaWtldGhyb3VnaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwY2NcXFwifWkuaWNvbi5zdHJpcGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDI5XFxcIn1pLmljb24uc3RyaXBlLnM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDJhXFxcIn1pLmljb24uc3R1ZGlvdmluYXJpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmOFxcXCJ9aS5pY29uLnN0dW1ibGV1cG9uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFhNFxcXCJ9aS5pY29uLnN0dW1ibGV1cG9uLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYTNcXFwifWkuaWNvbi5zdWJzY3JpcHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTJjXFxcIn1pLmljb24uc3Vid2F5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzOVxcXCJ9aS5pY29uLnN1aXRjYXNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmMlxcXCJ9aS5pY29uLnN1bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxODVcXFwifWkuaWNvbi5zdXBlcnBvd2VyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZGRcXFwifWkuaWNvbi5zdXBlcnNjcmlwdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMmJcXFwifWkuaWNvbi5zdXBwbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2Y5XFxcIn1pLmljb24uc3luYzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjFcXFwifWkuaWNvbi5zeW5jLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjFcXFwifWkuaWNvbi5zeXJpbmdlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ4ZVxcXCJ9aS5pY29uLnRhYmxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjZVxcXCJ9aS5pY29uLnRhYmxlLnRlbm5pczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NWRcXFwifWkuaWNvbi50YWJsZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTBhXFxcIn1pLmljb24udGFibGV0LmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZmFcXFwifWkuaWNvbi50YWNob21ldGVyLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZmRcXFwifWkuaWNvbi50YWc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDJiXFxcIn1pLmljb24udGFnczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmNcXFwifWkuaWNvbi50YXNrczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYWVcXFwifWkuaWNvbi50YXhpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFiYVxcXCJ9aS5pY29uLnRlbGVncmFtOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjNlxcXCJ9aS5pY29uLnRlbGVncmFtLnBsYW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmZVxcXCJ9aS5pY29uLnRlbmNlbnQud2VpYm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWQ1XFxcIn1pLmljb24udGVybWluYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTIwXFxcIn1pLmljb24udGV4dC5oZWlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDM0XFxcIn1pLmljb24udGV4dC53aWR0aDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzVcXFwifWkuaWNvbi50aDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGFcXFwifWkuaWNvbi50aC5sYXJnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDlcXFwifWkuaWNvbi50aC5saXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwYlxcXCJ9aS5pY29uLnRoZW1laXNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYjJcXFwifWkuaWNvbi50aGVybW9tZXRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0OTFcXFwifWkuaWNvbi50aGVybW9tZXRlci5lbXB0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyY2JcXFwifWkuaWNvbi50aGVybW9tZXRlci5mdWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjN1xcXCJ9aS5pY29uLnRoZXJtb21ldGVyLmhhbGY6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmM5XFxcIn1pLmljb24udGhlcm1vbWV0ZXIucXVhcnRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyY2FcXFwifWkuaWNvbi50aGVybW9tZXRlci50aHJlZS5xdWFydGVyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYzhcXFwifWkuaWNvbi50aHVtYnMuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjVcXFwifWkuaWNvbi50aHVtYnMudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTY0XFxcIn1pLmljb24udGh1bWJ0YWNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4ZFxcXCJ9aS5pY29uLnRpY2tldC5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2ZmXFxcIn1pLmljb24udGltZXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBkXFxcIn1pLmljb24udGltZXMuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1N1xcXCJ9aS5pY29uLnRpbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQzXFxcIn1pLmljb24udG9nZ2xlLm9mZjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDRcXFwifWkuaWNvbi50b2dnbGUub246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjA1XFxcIn1pLmljb24udHJhZGVtYXJrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1Y1xcXCJ9aS5pY29uLnRyYWluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzOFxcXCJ9aS5pY29uLnRyYW5zZ2VuZGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyNFxcXCJ9aS5pY29uLnRyYW5zZ2VuZGVyLmFsdGVybmF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjVcXFwifWkuaWNvbi50cmFzaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjhcXFwifWkuaWNvbi50cmFzaC5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmVkXFxcIn1pLmljb24udHJlZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYmJcXFwifWkuaWNvbi50cmVsbG86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTgxXFxcIn1pLmljb24udHJpcGFkdmlzb3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjYyXFxcIn1pLmljb24udHJvcGh5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5MVxcXCJ9aS5pY29uLnRydWNrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkMVxcXCJ9aS5pY29uLnR0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTRcXFwifWkuaWNvbi50dW1ibHI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTczXFxcIn1pLmljb24udHVtYmxyLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNzRcXFwifWkuaWNvbi50djpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNmNcXFwifWkuaWNvbi50d2l0Y2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWU4XFxcIn1pLmljb24udHdpdHRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOTlcXFwifWkuaWNvbi50d2l0dGVyLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODFcXFwifWkuaWNvbi50eXBvMzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MmJcXFwifWkuaWNvbi51YmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwMlxcXCJ9aS5pY29uLnVpa2l0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwM1xcXCJ9aS5pY29uLnVtYnJlbGxhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlOVxcXCJ9aS5pY29uLnVuZGVybGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwY2RcXFwifWkuaWNvbi51bmRvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlMlxcXCJ9aS5pY29uLnVuZG8uYWx0ZXJuYXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJlYVxcXCJ9aS5pY29uLnVuaXJlZ2lzdHJ5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwNFxcXCJ9aS5pY29uLnVuaXZlcnNhbC5hY2Nlc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjlhXFxcIn1pLmljb24udW5pdmVyc2l0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOWNcXFwifWkuaWNvbi51bmxpbms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI3XFxcIn1pLmljb24udW5sb2NrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5Y1xcXCJ9aS5pY29uLnVubG9jay5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTNlXFxcIn1pLmljb24udW50YXBwZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MDVcXFwifWkuaWNvbi51cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDkzXFxcIn1pLmljb24udXNiOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI4N1xcXCJ9aS5pY29uLnVzZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA3XFxcIn1pLmljb24udXNlci5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmJkXFxcIn1pLmljb24udXNlci5tZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjBcXFwifWkuaWNvbi51c2VyLnBsdXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM0XFxcIn1pLmljb24udXNlci5zZWNyZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjFiXFxcIn1pLmljb24udXNlci50aW1lczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzVcXFwifWkuaWNvbi51c2VyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzBcXFwifWkuaWNvbi51c3N1bm5haDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MDdcXFwifWkuaWNvbi51dGVuc2lsLnNwb29uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJlNVxcXCJ9aS5pY29uLnV0ZW5zaWxzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJlN1xcXCJ9aS5pY29uLnZhYWRpbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MDhcXFwifWkuaWNvbi52ZW51czpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjFcXFwifWkuaWNvbi52ZW51cy5kb3VibGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI2XFxcIn1pLmljb24udmVudXMubWFyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjhcXFwifWkuaWNvbi52aWFjb2luOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzN1xcXCJ9aS5pY29uLnZpYWRlbzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTlcXFwifWkuaWNvbi52aWFkZW8uc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhYVxcXCJ9aS5pY29uLnZpYmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwOVxcXCJ9aS5pY29uLnZpZGVvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzZFxcXCJ9aS5pY29uLnZpbWVvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwYVxcXCJ9aS5pY29uLnZpbWVvLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTRcXFwifWkuaWNvbi52aW1lby52OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3ZFxcXCJ9aS5pY29uLnZpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWNhXFxcIn1pLmljb24udms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg5XFxcIn1pLmljb24udm52OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQwYlxcXCJ9aS5pY29uLnZvbGxleWJhbGwuYmFsbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0NWZcXFwifWkuaWNvbi52b2x1bWUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjdcXFwifWkuaWNvbi52b2x1bWUub2ZmOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyNlxcXCJ9aS5pY29uLnZvbHVtZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjhcXFwifWkuaWNvbi52dWVqczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MWZcXFwifWkuaWNvbi53YXJlaG91c2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDk0XFxcIn1pLmljb24ud2VpYm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMThhXFxcIn1pLmljb24ud2VpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ5NlxcXCJ9aS5pY29uLndlaXhpbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDdcXFwifWkuaWNvbi53aGF0c2FwcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzJcXFwifWkuaWNvbi53aGF0c2FwcC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDBjXFxcIn1pLmljb24ud2hlZWxjaGFpcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTNcXFwifWkuaWNvbi53aG1jczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MGRcXFwifWkuaWNvbi53aWZpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlYlxcXCJ9aS5pY29uLndpa2lwZWRpYS53OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI2NlxcXCJ9aS5pY29uLndpbmRvdy5jbG9zZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTBcXFwifWkuaWNvbi53aW5kb3cubWF4aW1pemU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmQwXFxcIn1pLmljb24ud2luZG93Lm1pbmltaXplOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkMVxcXCJ9aS5pY29uLndpbmRvdy5yZXN0b3JlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkMlxcXCJ9aS5pY29uLndpbmRvd3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTdhXFxcIn1pLmljb24ud29uLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU5XFxcIn1pLmljb24ud29yZHByZXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5YVxcXCJ9aS5pY29uLndvcmRwcmVzcy5zaW1wbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDExXFxcIn1pLmljb24ud3BiZWdpbm5lcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTdcXFwifWkuaWNvbi53cGV4cGxvcmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkZVxcXCJ9aS5pY29uLndwZm9ybXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk4XFxcIn1pLmljb24ud3JlbmNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhZFxcXCJ9aS5pY29uLnhib3g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDEyXFxcIn1pLmljb24ueGluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjhcXFwifWkuaWNvbi54aW5nLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjlcXFwifWkuaWNvbi55LmNvbWJpbmF0b3I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNiXFxcIn1pLmljb24ueWFob286YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTllXFxcIn1pLmljb24ueWFuZGV4OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxM1xcXCJ9aS5pY29uLnlhbmRleC5pbnRlcm5hdGlvbmFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQxNFxcXCJ9aS5pY29uLnllbHA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWU5XFxcIn1pLmljb24ueWVuLnNpZ246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU3XFxcIn1pLmljb24ueW9hc3Q6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmIxXFxcIn1pLmljb24ueW91dHViZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjdcXFwifWkuaWNvbi55b3V0dWJlLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MzFcXFwifWkuaWNvbi5jaGVzcy5yb2NrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjQ0N1xcXCJ9aS5pY29uLm9yZGVyZWQubGlzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwY2JcXFwifWkuaWNvbi51bm9yZGVyZWQubGlzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwY2FcXFwifWkuaWNvbi51c2VyLmRvY3RvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjBcXFwifWkuaWNvbi5zaGllbGQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2VkXFxcIn1pLmljb24ucHV6emxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyZVxcXCJ9aS5pY29uLmNyZWRpdC5jYXJkLmFtYXpvbi5wYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmNDJkXFxcIn1pLmljb24uY3JlZGl0LmNhcmQuYW1lcmljYW4uZXhwcmVzczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjNcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5kaW5lcnMuY2x1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGNcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5kaXNjb3ZlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjJcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5qY2I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRiXFxcIn1pLmljb24uY3JlZGl0LmNhcmQubWFzdGVyY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjFcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5wYXlwYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY0XFxcIn1pLmljb24uY3JlZGl0LmNhcmQuc3RyaXBlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmNVxcXCJ9aS5pY29uLmNyZWRpdC5jYXJkLnZpc2E6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYwXFxcIn1pLmljb24uYWRkLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTVcXFwifWkuaWNvbi5hZGQuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmZVxcXCJ9aS5pY29uLmFkZC50by5jYWxlbmRhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzFcXFwifWkuaWNvbi5hZGQudG8uY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMTdcXFwifWkuaWNvbi5hZGQudXNlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMzRcXFwifWkuaWNvbi5hZGQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDY3XFxcIn1pLmljb24uYWxhcm0ubXV0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjZcXFwifWkuaWNvbi5hbGFybTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjNcXFwifWkuaWNvbi5hbGQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmEyXFxcIn1pLmljb24uYWxzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhMlxcXCJ9aS5pY29uLmFtZXJpY2FuLmV4cHJlc3MuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjNcXFwifWkuaWNvbi5hbWVyaWNhbi5leHByZXNzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmM1xcXCJ9aS5pY29uLmFtZXg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYzXFxcIn1pLmljb24uYW5ub3VuY2VtZW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhMVxcXCJ9aS5pY29uLmFyZWEuY2hhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWZlXFxcIn1pLmljb24uYXJlYS5ncmFwaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZmVcXFwifWkuaWNvbi5hcnJvdy5kb3duLmNhcnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjE4XFxcIn1pLmljb24uYXNleHVhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmRcXFwifWkuaWNvbi5hc2wuaW50ZXJwcmV0aW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhM1xcXCJ9aS5pY29uLmFzbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTNcXFwifWkuaWNvbi5hc3Npc3RpdmUubGlzdGVuaW5nLmRldmljZXM6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmEyXFxcIn1pLmljb24uYXR0YWNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjNlxcXCJ9aS5pY29uLmF0dGVudGlvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNmFcXFwifWkuaWNvbi5iYWxhbmNlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0ZVxcXCJ9aS5pY29uLmJhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZmNcXFwifWkuaWNvbi5iYXRodHViOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjZFxcXCJ9aS5pY29uLmJhdHRlcnkuZm91cjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDBcXFwifWkuaWNvbi5iYXR0ZXJ5LmhpZ2g6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQxXFxcIn1pLmljb24uYmF0dGVyeS5sb3c6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQzXFxcIn1pLmljb24uYmF0dGVyeS5tZWRpdW06YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQyXFxcIn1pLmljb24uYmF0dGVyeS5vbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQzXFxcIn1pLmljb24uYmF0dGVyeS50aHJlZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDFcXFwifWkuaWNvbi5iYXR0ZXJ5LnR3bzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDJcXFwifWkuaWNvbi5iYXR0ZXJ5Lnplcm86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ0XFxcIn1pLmljb24uYmlydGhkYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWZkXFxcIn1pLmljb24uYmxvY2subGF5b3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwOVxcXCJ9aS5pY29uLmJsdWV0b290aC5hbHRlcm5hdGl2ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTRcXFwifWkuaWNvbi5icm9rZW4uY2hhaW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI3XFxcIn1pLmljb24uYnJvd3NlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMjJcXFwifWkuaWNvbi5jYWxsLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOThcXFwifWkuaWNvbi5jYWxsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5NVxcXCJ9aS5pY29uLmNhbmNlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGRcXFwifWkuaWNvbi5jYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3YVxcXCJ9aS5pY29uLmNjOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwYVxcXCJ9aS5pY29uLmNoYWluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjMVxcXCJ9aS5pY29uLmNoYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDc1XFxcIn1pLmljb24uY2hlY2tlZC5jYWxlbmRhcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNzRcXFwifWkuaWNvbi5jaGVja21hcms6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBjXFxcIn1pLmljb24uY2lyY2xlLm5vdGNoZWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWNlXFxcIn1pLmljb24uY2xvc2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBkXFxcIn1pLmljb24uY255OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1N1xcXCJ9aS5pY29uLmNvY2t0YWlsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwMFxcXCJ9aS5pY29uLmNvbW1lbnRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjdhXFxcIn1pLmljb24uY29tcHV0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTA4XFxcIn1pLmljb24uY29uZmlndXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhZFxcXCJ9aS5pY29uLmNvbnRlbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM5XFxcIn1pLmljb24uZGVhZm5lc3M6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmE0XFxcIn1pLmljb24uZGVsZXRlLmNhbGVuZGFyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3M1xcXCJ9aS5pY29uLmRlbGV0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGRcXFwifWkuaWNvbi5kZXRlY3RpdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjFiXFxcIn1pLmljb24uZGluZXJzLmNsdWIuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGNcXFwifWkuaWNvbi5kaW5lcnMuY2x1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGNcXFwifWkuaWNvbi5kaXNjb3Zlci5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMlxcXCJ9aS5pY29uLmRpc2NvdmVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMlxcXCJ9aS5pY29uLmRpc2N1c3Npb25zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4NlxcXCJ9aS5pY29uLmRvY3RvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjBcXFwifWkuaWNvbi5kb2xsYXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU1XFxcIn1pLmljb24uZG9udDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNWVcXFwifWkuaWNvbi5kcmliYmxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE3ZFxcXCJ9aS5pY29uLmRyaXZlcnMubGljZW5zZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYzJcXFwifWkuaWNvbi5kcm9wZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDdcXFwifWkuaWNvbi5lZXJjYXN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkYVxcXCJ9aS5pY29uLmVtZXJnZW5jeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjlcXFwifWkuaWNvbi5lbnZpcmEuZ2FsbGVyeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOTlcXFwifWkuaWNvbi5lcmFzZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMmRcXFwifWkuaWNvbi5ldXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUzXFxcIn1pLmljb24uZXVybzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTNcXFwifWkuaWNvbi5leWVkcm9wcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmYlxcXCJ9aS5pY29uLmZhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiNFxcXCJ9aS5pY29uLmZhY3Rvcnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjc1XFxcIn1pLmljb24uZmF2b3JpdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA1XFxcIn1pLmljb24uZmVlZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOWVcXFwifWkuaWNvbi5mZW1hbGUuaG9tb3NleHVhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjZcXFwifWkuaWNvbi5maWxlLnRleHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTVjXFxcIn1pLmljb24uZmluZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTVcXFwifWkuaWNvbi5maXJzdC5haWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZhXFxcIn1pLmljb24uZml2ZS5odW5kcmVkLnBpeGVsczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNmVcXFwifWkuaWNvbi5mb3JrOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEyNlxcXCJ9aS5pY29uLmdhbWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTFiXFxcIn1pLmljb24uZ2F5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyN1xcXCJ9aS5pY29uLmdicDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTRcXFwifWkuaWNvbi5naXR0aXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg0XFxcIn1pLmljb24uZ29vZ2xlLnBsdXMuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiM1xcXCJ9aS5pY29uLmdvb2dsZS5wbHVzLm9mZmljaWFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiM1xcXCJ9aS5pY29uLmdyYWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU1XFxcIn1pLmljb24uZ3JhZHVhdGlvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOWRcXFwifWkuaWNvbi5ncmlkLmxheW91dDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGFcXFwifWkuaWNvbi5ncm91cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzBcXFwifWkuaWNvbi5oOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmZFxcXCJ9aS5pY29uLmhhbmQudmljdG9yeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWJcXFwifWkuaWNvbi5oYW5kaWNhcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTNcXFwifWkuaWNvbi5oYXJkLm9mLmhlYXJpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmE0XFxcIn1pLmljb24uaGVhZGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkY1xcXCJ9aS5pY29uLmhlbHAuY2lyY2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1OVxcXCJ9aS5pY29uLmhlbHA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTI4XFxcIn1pLmljb24uaGV0ZXJvc2V4dWFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyOFxcXCJ9aS5pY29uLmhpZGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDcwXFxcIn1pLmljb24uaG90ZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM2XFxcIn1pLmljb24uaG91cmdsYXNzLmZvdXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU0XFxcIn1pLmljb24uaG91cmdsYXNzLmZ1bGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU0XFxcIn1pLmljb24uaG91cmdsYXNzLm9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTFcXFwifWkuaWNvbi5ob3VyZ2xhc3MudGhyZWU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjUzXFxcIn1pLmljb24uaG91cmdsYXNzLnR3bzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTJcXFwifWkuaWNvbi5pZGVhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlYlxcXCJ9aS5pY29uLmlsczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGJcXFwifWkuaWNvbi5pbi1jYXJ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxOFxcXCJ9aS5pY29uLmlucjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTZcXFwifWkuaWNvbi5pbnRlcmdlbmRlcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjRcXFwifWkuaWNvbi5pbnRlcnNleDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjRcXFwifWkuaWNvbi5qYXBhbi5jcmVkaXQuYnVyZWF1LmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRiXFxcIn1pLmljb24uamFwYW4uY3JlZGl0LmJ1cmVhdTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGJcXFwifWkuaWNvbi5qY2I6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjRiXFxcIn1pLmljb24uanB5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1N1xcXCJ9aS5pY29uLmtydzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTlcXFwifWkuaWNvbi5sYWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGMzXFxcIn1pLmljb24ubGF3OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0ZVxcXCJ9aS5pY29uLmxlZ2FsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlM1xcXCJ9aS5pY29uLmxlc2JpYW46YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI2XFxcIn1pLmljb24ubGlnaHRuaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlN1xcXCJ9aS5pY29uLmxpa2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA0XFxcIn1pLmljb24ubGluZS5ncmFwaDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDFcXFwifWkuaWNvbi5saW5rZWRpbi5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDhjXFxcIn1pLmljb24ubGlua2lmeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzFcXFwifWkuaWNvbi5saXJhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5NVxcXCJ9aS5pY29uLmxpc3QubGF5b3V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwYlxcXCJ9aS5pY29uLm1hZ25pZnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBlXFxcIn1pLmljb24ubWFpbC5mb3J3YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2NFxcXCJ9aS5pY29uLm1haWwuc3F1YXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5OVxcXCJ9aS5pY29uLm1haWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGUwXFxcIn1pLmljb24ubWFsZS5ob21vc2V4dWFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyN1xcXCJ9aS5pY29uLm1hbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMjJcXFwifWkuaWNvbi5tYXJrZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQxXFxcIn1pLmljb24ubWFycy5hbHRlcm5hdGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjI5XFxcIn1pLmljb24ubWFycy5ob3Jpem9udGFsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyYlxcXCJ9aS5pY29uLm1hcnMudmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJhXFxcIn1pLmljb24ubWFzdGVyY2FyZC5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMVxcXCJ9aS5pY29uLm1hc3RlcmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWYxXFxcIn1pLmljb24ubWljcm9zb2Z0LmVkZ2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjgyXFxcIn1pLmljb24ubWlsaXRhcnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZiXFxcIn1pLmljb24ubXMuZWRnZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyODJcXFwifWkuaWNvbi5tdXRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjEzMVxcXCJ9aS5pY29uLm5ldy5waWVkLnBpcGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhZVxcXCJ9aS5pY29uLm5vbi5iaW5hcnkudHJhbnNnZW5kZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjIzXFxcIn1pLmljb24ubnVtYmVyZWQubGlzdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwY2JcXFwifWkuaWNvbi5vcHRpbm1vbnN0ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjNjXFxcIn1pLmljb24ub3B0aW9uczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZGVcXFwifWkuaWNvbi5vdGhlci5nZW5kZXIuaG9yaXpvbnRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMmJcXFwifWkuaWNvbi5vdGhlci5nZW5kZXIudmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjJhXFxcIn1pLmljb24ub3RoZXIuZ2VuZGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyOVxcXCJ9aS5pY29uLnBheW1lbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDlkXFxcIn1pLmljb24ucGF5cGFsLmNhcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWY0XFxcIn1pLmljb24ucGVuY2lsLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGJcXFwifWkuaWNvbi5waG90bzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMzBcXFwifWkuaWNvbi5waWN0dXJlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzZVxcXCJ9aS5pY29uLnBpZS5jaGFydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMDBcXFwifWkuaWNvbi5waWUuZ3JhcGg6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjAwXFxcIn1pLmljb24ucGllZC5waXBlci5oYXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmFlXFxcIn1pLmljb24ucGluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4ZFxcXCJ9aS5pY29uLnBsdXMuY2FydDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMTdcXFwifWkuaWNvbi5wb2NrZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjY1XFxcIn1pLmljb24ucG9pbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQxXFxcIn1pLmljb24ucG9pbnRpbmcuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTdcXFwifWkuaWNvbi5wb2ludGluZy5sZWZ0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNVxcXCJ9aS5pY29uLnBvaW50aW5nLnJpZ2h0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNFxcXCJ9aS5pY29uLnBvaW50aW5nLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNlxcXCJ9aS5pY29uLnBvdW5kOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NFxcXCJ9aS5pY29uLnBvd2VyLmNvcmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWU2XFxcIn1pLmljb24ucG93ZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDExXFxcIn1pLmljb24ucHJpdmFjeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODRcXFwifWkuaWNvbi5yLmNpcmNsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWRcXFwifWkuaWNvbi5yYWluOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBlOVxcXCJ9aS5pY29uLnJlY29yZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwM2RcXFwifWkuaWNvbi5yZWZyZXNoOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyMVxcXCJ9aS5pY29uLnJlbW92ZS5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU3XFxcIn1pLmljb24ucmVtb3ZlLmZyb20uY2FsZW5kYXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjcyXFxcIn1pLmljb24ucmVtb3ZlLnVzZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM1XFxcIn1pLmljb24ucmVtb3ZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZFxcXCJ9aS5pY29uLnJlcGVhdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMWVcXFwifWkuaWNvbi5ybWI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTU3XFxcIn1pLmljb24ucm91YmxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1OFxcXCJ9aS5pY29uLnJ1YjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNThcXFwifWkuaWNvbi5ydWJsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNThcXFwifWkuaWNvbi5ydXBlZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTZcXFwifWkuaWNvbi5zMTU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmNkXFxcIn1pLmljb24uc2VsZWN0ZWQucmFkaW86YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTkyXFxcIn1pLmljb24uc2VuZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDhcXFwifWkuaWNvbi5zZXR0aW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxM1xcXCJ9aS5pY29uLnNldHRpbmdzOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4NVxcXCJ9aS5pY29uLnNoZWtlbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyMGJcXFwifWkuaWNvbi5zaGVxZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjBiXFxcIn1pLmljb24uc2hpcHBpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQxXFxcIn1pLmljb24uc2hvcDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwN2FcXFwifWkuaWNvbi5zaHVmZmxlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3NFxcXCJ9aS5pY29uLnNodXRkb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAxMVxcXCJ9aS5pY29uLnNpZGViYXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGM5XFxcIn1pLmljb24uc2lnbmluZzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYTdcXFwifWkuaWNvbi5zaWdudXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQ0XFxcIn1pLmljb24uc2xpZGVyczpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZGVcXFwifWkuaWNvbi5zb2NjZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWUzXFxcIn1pLmljb24uc29ydC5hbHBoYWJldC5hc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTVkXFxcIn1pLmljb24uc29ydC5hbHBoYWJldC5kZXNjZW5kaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1ZVxcXCJ9aS5pY29uLnNvcnQuYXNjZW5kaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkZVxcXCJ9aS5pY29uLnNvcnQuY29udGVudC5hc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYwXFxcIn1pLmljb24uc29ydC5jb250ZW50LmRlc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYxXFxcIn1pLmljb24uc29ydC5kZXNjZW5kaW5nOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkZFxcXCJ9aS5pY29uLnNvcnQubnVtZXJpYy5hc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYyXFxcIn1pLmljb24uc29ydC5udW1lcmljLmRlc2NlbmRpbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTYzXFxcIn1pLmljb24uc291bmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDI1XFxcIn1pLmljb24uc3B5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIxYlxcXCJ9aS5pY29uLnN0cmlwZS5jYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmNVxcXCJ9aS5pY29uLnN0dWRlbnQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTlkXFxcIn1pLmljb24udGFsazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyN2FcXFwifWkuaWNvbi50YXJnZXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTQwXFxcIn1pLmljb24udGVsZXR5cGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWU0XFxcIn1pLmljb24udGVsZXZpc2lvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNmNcXFwifWkuaWNvbi50ZXh0LmN1cnNvcjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNDZcXFwifWkuaWNvbi50ZXh0LnRlbGVwaG9uZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTRcXFwifWkuaWNvbi50aGVtZS5pc2xlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiMlxcXCJ9aS5pY29uLnRoZW1lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA0M1xcXCJ9aS5pY29uLnRoZXJtb21ldGVyOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjN1xcXCJ9aS5pY29uLnRodW1iLnRhY2s6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDhkXFxcIn1pLmljb24udGltZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTdcXFwifWkuaWNvbi50bTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWNcXFwifWkuaWNvbi50b2dnbGUuZG93bjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTBcXFwifWkuaWNvbi50b2dnbGUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTFcXFwifWkuaWNvbi50b2dnbGUucmlnaHQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTUyXFxcIn1pLmljb24udG9nZ2xlLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1MVxcXCJ9aS5pY29uLnRyYW5zbGF0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYWJcXFwifWkuaWNvbi50cmF2ZWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGIxXFxcIn1pLmljb24udHJlYXRtZW50OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmMVxcXCJ9aS5pY29uLnRyaWFuZ2xlLmRvd246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGQ3XFxcIn1pLmljb24udHJpYW5nbGUubGVmdDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDlcXFwifWkuaWNvbi50cmlhbmdsZS5yaWdodDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZGFcXFwifWkuaWNvbi50cmlhbmdsZS51cDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZDhcXFwifWkuaWNvbi50cnk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTk1XFxcIn1pLmljb24udW5oaWRlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA2ZVxcXCJ9aS5pY29uLnVubGlua2lmeTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMjdcXFwifWkuaWNvbi51bm11dGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTMwXFxcIn1pLmljb24udXNkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1NVxcXCJ9aS5pY29uLnVzZXIuY2FuY2VsOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzNVxcXCJ9aS5pY29uLnVzZXIuY2xvc2U6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM1XFxcIn1pLmljb24udXNlci5kZWxldGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjM1XFxcIn1pLmljb24udXNlci54OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzNVxcXCJ9aS5pY29uLnZjYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiYlxcXCJ9aS5pY29uLnZpZGVvLmNhbWVyYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwM2RcXFwifWkuaWNvbi52aWRlby5wbGF5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0NFxcXCJ9aS5pY29uLnZpc2EuY2FyZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjBcXFwifWkuaWNvbi52aXNhOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFmMFxcXCJ9aS5pY29uLnZvbHVtZS5jb250cm9sLnBob25lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJhMFxcXCJ9aS5pY29uLndhaXQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDE3XFxcIn1pLmljb24ud2FybmluZy5jaXJjbGU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDZhXFxcIn1pLmljb24ud2FybmluZy5zaWduOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3MVxcXCJ9aS5pY29uLndhcm5pbmc6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTJhXFxcIn1pLmljb24ud2VjaGF0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFkN1xcXCJ9aS5pY29uLndpLWZpOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlYlxcXCJ9aS5pY29uLndpa2lwZWRpYTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNjZcXFwifWkuaWNvbi53aW5uZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDkxXFxcIn1pLmljb24ud2l6YXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkMFxcXCJ9aS5pY29uLndvbWFuOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIyMVxcXCJ9aS5pY29uLndvbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTlcXFwifWkuaWNvbi53b3JkcHJlc3MuYmVnaW5uZXI6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjk3XFxcIn1pLmljb24ud29yZHByZXNzLmZvcm1zOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI5OFxcXCJ9aS5pY29uLndvcmxkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhY1xcXCJ9aS5pY29uLndyaXRlLnNxdWFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGJcXFwifWkuaWNvbi54OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZFxcXCJ9aS5pY29uLnljOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzYlxcXCJ9aS5pY29uLnljb21iaW5hdG9yOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIzYlxcXCJ9aS5pY29uLnllbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTdcXFwifWkuaWNvbi56aXA6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg3XFxcIn1pLmljb24uem9vbS1pbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMGVcXFwifWkuaWNvbi56b29tLW91dDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMTBcXFwifWkuaWNvbi56b29tOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAwZVxcXCJ9aS5pY29uLmJpdGJ1Y2tldC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTcxXFxcIn1pLmljb24uY2hlY2ttYXJrLmJveDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGFcXFwifWkuaWNvbi5jaXJjbGUudGhpbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMTFcXFwifWkuaWNvbi5jbG91ZC5kb3dubG9hZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzODFcXFwifWkuaWNvbi5jbG91ZC51cGxvYWQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzgyXFxcIn1pLmljb24uY29tcG9zZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMDNcXFwifWkuaWNvbi5jb252ZXJzYXRpb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg2XFxcIn1pLmljb24uY3JlZGl0LmNhcmQuYWx0ZXJuYXRpdmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDlkXFxcIn1pLmljb24uY3VycmVuY3k6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2QxXFxcIn1pLmljb24uZGFzaGJvYXJkOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmZFxcXCJ9aS5pY29uLmRpYW1vbmQ6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2E1XFxcIn1pLmljb24uZGlzazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTBcXFwifWkuaWNvbi5leGNoYW5nZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNjJcXFwifWkuaWNvbi5leHRlcm5hbC5zaGFyZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGRcXFwifWkuaWNvbi5leHRlcm5hbC5zcXVhcmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzYwXFxcIn1pLmljb24uZXh0ZXJuYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzVkXFxcIn1pLmljb24uZmFjZWJvb2sub2ZmaWNpYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDgyXFxcIn1pLmljb24uZm9vZDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZTdcXFwifWkuaWNvbi5ob3VyZ2xhc3MuemVybzpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTNcXFwifWkuaWNvbi5sZXZlbC5kb3duOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiZVxcXCJ9aS5pY29uLmxldmVsLnVwOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNiZlxcXCJ9aS5pY29uLmxvZ291dDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjVcXFwifWkuaWNvbi5tZWFucGF0aDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzhcXFwifWkuaWNvbi5tb25leTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzZDFcXFwifWkuaWNvbi5tb3ZlOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBiMlxcXCJ9aS5pY29uLnBlbmNpbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMDNcXFwifWkuaWNvbi5wcm90ZWN0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyM1xcXCJ9aS5pY29uLnJhZGlvOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5MlxcXCJ9aS5pY29uLnJlbW92ZS5ib29rbWFyazpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMmVcXFwifWkuaWNvbi5yZXNpemUuaG9yaXpvbnRhbDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMzdcXFwifWkuaWNvbi5yZXNpemUudmVydGljYWw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzM4XFxcIn1pLmljb24uc2lnbi1pbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjZcXFwifWkuaWNvbi5zaWduLW91dDpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZjVcXFwifWkuaWNvbi5zcG9vbjpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZTVcXFwifWkuaWNvbi5zdGFyLmhhbGYuZW1wdHk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg5XFxcIn1pLmljb24uc3Rhci5oYWxmLmZ1bGw6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg5XFxcIn1pLmljb24udGlja2V0OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjNmZlxcXCJ9aS5pY29uLnRpbWVzLnJlY3RhbmdsZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTBcXFwifWkuaWNvbi53cml0ZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzMDNcXFwifWkuaWNvbi55b3V0dWJlLnBsYXk6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTY3XFxcIn1AZm9udC1mYWNle2ZvbnQtZmFtaWx5Om91dGxpbmUtaWNvbnM7c3JjOnVybCh0aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvb3V0bGluZS1pY29ucy5lb3QpO3NyYzp1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMuZW90PyNpZWZpeCkgZm9ybWF0KCdlbWJlZGRlZC1vcGVudHlwZScpLHVybCh0aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvb3V0bGluZS1pY29ucy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpLHVybCh0aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvb3V0bGluZS1pY29ucy53b2ZmKSBmb3JtYXQoJ3dvZmYnKSx1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL291dGxpbmUtaWNvbnMudHRmKSBmb3JtYXQoJ3RydWV0eXBlJyksdXJsKHRoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9vdXRsaW5lLWljb25zLnN2ZyNpY29ucykgZm9ybWF0KCdzdmcnKTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7Zm9udC12YXJpYW50Om5vcm1hbDt0ZXh0LWRlY29yYXRpb246aW5oZXJpdDt0ZXh0LXRyYW5zZm9ybTpub25lfWkuaWNvbi5vdXRsaW5le2ZvbnQtZmFtaWx5Om91dGxpbmUtaWNvbnN9aS5pY29uLmFkZHJlc3MuYm9vay5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiOVxcXCJ9aS5pY29uLmFkZHJlc3MuY2FyZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiYlxcXCJ9aS5pY29uLmFycm93LmFsdGVybmF0ZS5jaXJjbGUuZG93bi5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1OFxcXCJ9aS5pY29uLmFycm93LmFsdGVybmF0ZS5jaXJjbGUubGVmdC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjM1OVxcXCJ9aS5pY29uLmFycm93LmFsdGVybmF0ZS5jaXJjbGUucmlnaHQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzNWFcXFwifWkuaWNvbi5hcnJvdy5hbHRlcm5hdGUuY2lyY2xlLnVwLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMzViXFxcIn1pLmljb24uYmVsbC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBmM1xcXCJ9aS5pY29uLmJlbGwuc2xhc2gub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjZcXFwifWkuaWNvbi5ib29rbWFyay5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyZVxcXCJ9aS5pY29uLmJ1aWxkaW5nLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWFkXFxcIn1pLmljb24uY2FsZW5kYXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMzNcXFwifWkuaWNvbi5jYWxlbmRhci5hbHRlcm5hdGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzNcXFwifWkuaWNvbi5jYWxlbmRhci5jaGVjay5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3NFxcXCJ9aS5pY29uLmNhbGVuZGFyLm1pbnVzLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjcyXFxcIn1pLmljb24uY2FsZW5kYXIucGx1cy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3MVxcXCJ9aS5pY29uLmNhbGVuZGFyLnRpbWVzLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjczXFxcIn1pLmljb24uY2FyZXQuc3F1YXJlLmRvd24ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNTBcXFwifWkuaWNvbi5jYXJldC5zcXVhcmUubGVmdC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE5MVxcXCJ9aS5pY29uLmNhcmV0LnNxdWFyZS5yaWdodC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1MlxcXCJ9aS5pY29uLmNhcmV0LnNxdWFyZS51cC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1MVxcXCJ9aS5pY29uLmNoYXJ0LmJhci5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4MFxcXCJ9aS5pY29uLmNoZWNrLmNpcmNsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA1OFxcXCJ9aS5pY29uLmNoZWNrLnNxdWFyZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0YVxcXCJ9aS5pY29uLmNpcmNsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExMVxcXCJ9aS5pY29uLmNsaXBib2FyZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMyOFxcXCJ9aS5pY29uLmNsb2NrLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDE3XFxcIn1pLmljb24uY2xvbmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNGRcXFwifWkuaWNvbi5jbG9zZWQuY2FwdGlvbmluZy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjIwYVxcXCJ9aS5pY29uLmNvbW1lbnQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNzVcXFwifWkuaWNvbi5jb21tZW50LmFsdGVybmF0ZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3YVxcXCJ9aS5pY29uLmNvbW1lbnRzLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDg2XFxcIn1pLmljb24uY29tcGFzcy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0ZVxcXCJ9aS5pY29uLmNvcHkub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzVcXFwifWkuaWNvbi5jb3B5cmlnaHQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZjlcXFwifWkuaWNvbi5jcmVkaXQuY2FyZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA5ZFxcXCJ9aS5pY29uLmRvdC5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxOTJcXFwifWkuaWNvbi5lZGl0Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDQ0XFxcIn1pLmljb24uZW52ZWxvcGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZTBcXFwifWkuaWNvbi5lbnZlbG9wZS5vcGVuLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMmI2XFxcIn1pLmljb24uZXllLnNsYXNoLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDcwXFxcIn1pLmljb24uZmlsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE1YlxcXCJ9aS5pY29uLmZpbGUuYWx0ZXJuYXRlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTVjXFxcIn1pLmljb24uZmlsZS5hcmNoaXZlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM2XFxcIn1pLmljb24uZmlsZS5hdWRpby5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjN1xcXCJ9aS5pY29uLmZpbGUuY29kZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFjOVxcXCJ9aS5pY29uLmZpbGUuZXhjZWwub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzNcXFwifWkuaWNvbi5maWxlLmltYWdlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM1XFxcIn1pLmljb24uZmlsZS5wZGYub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzFcXFwifWkuaWNvbi5maWxlLnBvd2VycG9pbnQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxYzRcXFwifWkuaWNvbi5maWxlLnZpZGVvLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWM4XFxcIn1pLmljb24uZmlsZS53b3JkLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMWMyXFxcIn1pLmljb24uZmxhZy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyNFxcXCJ9aS5pY29uLmZvbGRlci5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA3YlxcXCJ9aS5pY29uLmZvbGRlci5vcGVuLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDdjXFxcIn1pLmljb24uZnJvd24ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxMTlcXFwifWkuaWNvbi5mdXRib2wub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZTNcXFwifWkuaWNvbi5nZW0ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYzYTVcXFwifWkuaWNvbi5oYW5kLmxpemFyZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1OFxcXCJ9aS5pY29uLmhhbmQucGFwZXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTZcXFwifWkuaWNvbi5oYW5kLnBlYWNlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjViXFxcIn1pLmljb24uaGFuZC5wb2ludC5kb3duLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE3XFxcIn1pLmljb24uaGFuZC5wb2ludC5sZWZ0Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGE1XFxcIn1pLmljb24uaGFuZC5wb2ludC5yaWdodC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhNFxcXCJ9aS5pY29uLmhhbmQucG9pbnQudXAub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTZcXFwifWkuaWNvbi5oYW5kLnBvaW50ZXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNWFcXFwifWkuaWNvbi5oYW5kLnJvY2sub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTVcXFwifWkuaWNvbi5oYW5kLnNjaXNzb3JzLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjU3XFxcIn1pLmljb24uaGFuZC5zcG9jay5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1OVxcXCJ9aS5pY29uLmhhbmRzaGFrZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJiNVxcXCJ9aS5pY29uLmhkZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBhMFxcXCJ9aS5pY29uLmhlYXJ0Lm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA0XFxcIn1pLmljb24uaG9zcGl0YWwub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZjhcXFwifWkuaWNvbi5ob3VyZ2xhc3Mub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyNTRcXFwifWkuaWNvbi5pZC5iYWRnZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJjMVxcXCJ9aS5pY29uLmlkLmNhcmQub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYzJcXFwifWkuaWNvbi5pbWFnZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAzZVxcXCJ9aS5pY29uLmltYWdlcy5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjMwMlxcXCJ9aS5pY29uLmtleWJvYXJkLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTFjXFxcIn1pLmljb24ubGVtb24ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwOTRcXFwifWkuaWNvbi5saWZlLnJpbmcub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxY2RcXFwifWkuaWNvbi5saWdodGJ1bGIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwZWJcXFwifWkuaWNvbi5saXN0LmFsdGVybmF0ZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjAyMlxcXCJ9aS5pY29uLm1hcC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI3OVxcXCJ9aS5pY29uLm1laC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExYVxcXCJ9aS5pY29uLm1pbnVzLnNxdWFyZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0NlxcXCJ9aS5pY29uLm1vbmV5LmJpbGwuYWx0ZXJuYXRlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmM2QxXFxcIn1pLmljb24ubW9vbi5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE4NlxcXCJ9aS5pY29uLm5ld3NwYXBlci5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjFlYVxcXCJ9aS5pY29uLm9iamVjdC5ncm91cC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0N1xcXCJ9aS5pY29uLm9iamVjdC51bmdyb3VwLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjQ4XFxcIn1pLmljb24ucGFwZXIucGxhbmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxZDhcXFwifWkuaWNvbi5wYXVzZS5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyOGJcXFwifWkuaWNvbi5wbGF5LmNpcmNsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjE0NFxcXCJ9aS5pY29uLnBsdXMuc3F1YXJlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGZlXFxcIn1pLmljb24ucXVlc3Rpb24uY2lyY2xlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDU5XFxcIn1pLmljb24ucmVnaXN0ZXJlZC5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI1ZFxcXCJ9aS5pY29uLnNhdmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYzdcXFwifWkuaWNvbi5zaGFyZS5zcXVhcmUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNGRcXFwifWkuaWNvbi5zbWlsZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjExOFxcXCJ9aS5pY29uLnNub3dmbGFrZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkY1xcXCJ9aS5pY29uLnNxdWFyZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBjOFxcXCJ9aS5pY29uLnN0YXIub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDVcXFwifWkuaWNvbi5zdGFyLmhhbGYub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwODlcXFwifWkuaWNvbi5zdGlja3kubm90ZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjI0OVxcXCJ9aS5pY29uLnN0b3AuY2lyY2xlLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMjhkXFxcIn1pLmljb24uc3VuLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMTg1XFxcIn1pLmljb24udGh1bWJzLmRvd24ub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjVcXFwifWkuaWNvbi50aHVtYnMudXAub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYxNjRcXFwifWkuaWNvbi50aW1lcy5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwNTdcXFwifWkuaWNvbi50cmFzaC5hbHRlcm5hdGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZWRcXFwifWkuaWNvbi51c2VyLm91dGxpbmU6YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDA3XFxcIn1pLmljb24udXNlci5jaXJjbGUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyYmRcXFwifWkuaWNvbi53aW5kb3cuY2xvc2Uub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGY0MTBcXFwifWkuaWNvbi53aW5kb3cubWF4aW1pemUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDBcXFwifWkuaWNvbi53aW5kb3cubWluaW1pemUub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYyZDFcXFwifWkuaWNvbi53aW5kb3cucmVzdG9yZS5vdXRsaW5lOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjJkMlxcXCJ9aS5pY29uLmRpc2sub3V0bGluZTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwYTBcXFwifWkuaWNvbi5oZWFydC5lbXB0eSxpLmljb24uc3Rhci5lbXB0eXtmb250LWZhbWlseTpvdXRsaW5lLWljb25zfWkuaWNvbi5oZWFydC5lbXB0eTpiZWZvcmV7Y29udGVudDpcXFwiXFxcXGYwMDRcXFwifWkuaWNvbi5zdGFyLmVtcHR5OmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjA4OVxcXCJ9QGZvbnQtZmFjZXtmb250LWZhbWlseTpicmFuZC1pY29ucztzcmM6dXJsKHRoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy5lb3QpO3NyYzp1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2JyYW5kLWljb25zLmVvdD8jaWVmaXgpIGZvcm1hdCgnZW1iZWRkZWQtb3BlbnR5cGUnKSx1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2JyYW5kLWljb25zLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyksdXJsKHRoZW1lcy9kZWZhdWx0L2Fzc2V0cy9mb250cy9icmFuZC1pY29ucy53b2ZmKSBmb3JtYXQoJ3dvZmYnKSx1cmwodGhlbWVzL2RlZmF1bHQvYXNzZXRzL2ZvbnRzL2JyYW5kLWljb25zLnR0ZikgZm9ybWF0KCd0cnVldHlwZScpLHVybCh0aGVtZXMvZGVmYXVsdC9hc3NldHMvZm9udHMvYnJhbmQtaWNvbnMuc3ZnI2ljb25zKSBmb3JtYXQoJ3N2ZycpO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXZhcmlhbnQ6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjppbmhlcml0O3RleHQtdHJhbnNmb3JtOm5vbmV9aS5pY29uLlxcXFwzNSAwMHB4LGkuaWNvbi5hY2Nlc3NpYmxlLmljb24saS5pY29uLmFjY3Vzb2Z0LGkuaWNvbi5hZG4saS5pY29uLmFkdmVyc2FsLGkuaWNvbi5hZmZpbGlhdGV0aGVtZSxpLmljb24uYWxnb2xpYSxpLmljb24uYW1hem9uLGkuaWNvbi5hbWF6b24ucGF5LGkuaWNvbi5hbWlsaWEsaS5pY29uLmFuZHJvaWQsaS5pY29uLmFuZ2VsbGlzdCxpLmljb24uYW5ncnljcmVhdGl2ZSxpLmljb24uYW5ndWxhcixpLmljb24uYXBwLnN0b3JlLGkuaWNvbi5hcHAuc3RvcmUuaW9zLGkuaWNvbi5hcHBlcixpLmljb24uYXBwbGUsaS5pY29uLmFwcGxlLnBheSxpLmljb24uYXN5bW1ldHJpayxpLmljb24uYXVkaWJsZSxpLmljb24uYXV0b3ByZWZpeGVyLGkuaWNvbi5hdmlhbmV4LGkuaWNvbi5hdmlhdG8saS5pY29uLmF3cyxpLmljb24uYmFuZGNhbXAsaS5pY29uLmJlaGFuY2UsaS5pY29uLmJlaGFuY2Uuc3F1YXJlLGkuaWNvbi5iaW1vYmplY3QsaS5pY29uLmJpdGJ1Y2tldCxpLmljb24uYml0Y29pbixpLmljb24uYml0eSxpLmljb24uYmxhY2sudGllLGkuaWNvbi5ibGFja2JlcnJ5LGkuaWNvbi5ibG9nZ2VyLGkuaWNvbi5ibG9nZ2VyLmIsaS5pY29uLmJsdWV0b290aCxpLmljb24uYmx1ZXRvb3RoLmIsaS5pY29uLmJ0YyxpLmljb24uYnVyb21vYmVsZXhwZXJ0ZSxpLmljb24uYnV5c2VsbGFkcyxpLmljb24uY2MuYW1hem9uLnBheSxpLmljb24uY2MuYW1leCxpLmljb24uY2MuYXBwbGUucGF5LGkuaWNvbi5jYy5kaW5lcnMuY2x1YixpLmljb24uY2MuZGlzY292ZXIsaS5pY29uLmNjLmpjYixpLmljb24uY2MubWFzdGVyY2FyZCxpLmljb24uY2MucGF5cGFsLGkuaWNvbi5jYy5zdHJpcGUsaS5pY29uLmNjLnZpc2EsaS5pY29uLmNlbnRlcmNvZGUsaS5pY29uLmNocm9tZSxpLmljb24uY2xvdWRzY2FsZSxpLmljb24uY2xvdWRzbWl0aCxpLmljb24uY2xvdWR2ZXJzaWZ5LGkuaWNvbi5jb2RlcGVuLGkuaWNvbi5jb2RpZXBpZSxpLmljb24uY29ubmVjdGRldmVsb3AsaS5pY29uLmNvbnRhbyxpLmljb24uY3BhbmVsLGkuaWNvbi5jcmVhdGl2ZS5jb21tb25zLGkuaWNvbi5jc3MzLGkuaWNvbi5jc3MzLmFsdGVybmF0ZSxpLmljb24uY3V0dGxlZmlzaCxpLmljb24uZC5hbmQuZCxpLmljb24uZGFzaGN1YmUsaS5pY29uLmRlbGljaW91cyxpLmljb24uZGVwbG95ZG9nLGkuaWNvbi5kZXNrcHJvLGkuaWNvbi5kZXZpYW50YXJ0LGkuaWNvbi5kaWdnLGkuaWNvbi5kaWdpdGFsLm9jZWFuLGkuaWNvbi5kaXNjb3JkLGkuaWNvbi5kaXNjb3Vyc2UsaS5pY29uLmRvY2h1YixpLmljb24uZG9ja2VyLGkuaWNvbi5kcmFmdDJkaWdpdGFsLGkuaWNvbi5kcmliYmJsZSxpLmljb24uZHJpYmJibGUuc3F1YXJlLGkuaWNvbi5kcm9wYm94LGkuaWNvbi5kcnVwYWwsaS5pY29uLmR5YWxvZyxpLmljb24uZWFybHliaXJkcyxpLmljb24uZWRnZSxpLmljb24uZWxlbWVudG9yLGkuaWNvbi5lbWJlcixpLmljb24uZW1waXJlLGkuaWNvbi5lbnZpcmEsaS5pY29uLmVybGFuZyxpLmljb24uZXRoZXJldW0saS5pY29uLmV0c3ksaS5pY29uLmV4cGVkaXRlZHNzbCxpLmljb24uZmFjZWJvb2ssaS5pY29uLmZhY2Vib29rLmYsaS5pY29uLmZhY2Vib29rLm1lc3NlbmdlcixpLmljb24uZmFjZWJvb2suc3F1YXJlLGkuaWNvbi5maXJlZm94LGkuaWNvbi5maXJzdC5vcmRlcixpLmljb24uZmlyc3RkcmFmdCxpLmljb24uZmxpY2tyLGkuaWNvbi5mbGlwYm9hcmQsaS5pY29uLmZseSxpLmljb24uZm9udC5hd2Vzb21lLGkuaWNvbi5mb250LmF3ZXNvbWUuYWx0ZXJuYXRlLGkuaWNvbi5mb250LmF3ZXNvbWUuZmxhZyxpLmljb24uZm9udGljb25zLGkuaWNvbi5mb250aWNvbnMuZmksaS5pY29uLmZvcnQuYXdlc29tZSxpLmljb24uZm9ydC5hd2Vzb21lLmFsdGVybmF0ZSxpLmljb24uZm9ydW1iZWUsaS5pY29uLmZvdXJzcXVhcmUsaS5pY29uLmZyZWUuY29kZS5jYW1wLGkuaWNvbi5mcmVlYnNkLGkuaWNvbi5nZXQucG9ja2V0LGkuaWNvbi5nZyxpLmljb24uZ2cuY2lyY2xlLGkuaWNvbi5naXQsaS5pY29uLmdpdC5zcXVhcmUsaS5pY29uLmdpdGh1YixpLmljb24uZ2l0aHViLmFsdGVybmF0ZSxpLmljb24uZ2l0aHViLnNxdWFyZSxpLmljb24uZ2l0a3Jha2VuLGkuaWNvbi5naXRsYWIsaS5pY29uLmdpdHRlcixpLmljb24uZ2xpZGUsaS5pY29uLmdsaWRlLmcsaS5pY29uLmdvZm9yZSxpLmljb24uZ29vZHJlYWRzLGkuaWNvbi5nb29kcmVhZHMuZyxpLmljb24uZ29vZ2xlLGkuaWNvbi5nb29nbGUuZHJpdmUsaS5pY29uLmdvb2dsZS5wbGF5LGkuaWNvbi5nb29nbGUucGx1cyxpLmljb24uZ29vZ2xlLnBsdXMuZyxpLmljb24uZ29vZ2xlLnBsdXMuc3F1YXJlLGkuaWNvbi5nb29nbGUud2FsbGV0LGkuaWNvbi5ncmF0aXBheSxpLmljb24uZ3JhdixpLmljb24uZ3JpcGZpcmUsaS5pY29uLmdydW50LGkuaWNvbi5ndWxwLGkuaWNvbi5oYWNrZXIubmV3cyxpLmljb24uaGFja2VyLm5ld3Muc3F1YXJlLGkuaWNvbi5oaXBzLGkuaWNvbi5oaXJlLmEuaGVscGVyLGkuaWNvbi5ob29saSxpLmljb24uaG90amFyLGkuaWNvbi5ob3V6eixpLmljb24uaHRtbDUsaS5pY29uLmh1YnNwb3QsaS5pY29uLmltZGIsaS5pY29uLmluc3RhZ3JhbSxpLmljb24uaW50ZXJuZXQuZXhwbG9yZXIsaS5pY29uLmlveGhvc3QsaS5pY29uLml0dW5lcyxpLmljb24uaXR1bmVzLm5vdGUsaS5pY29uLmplbmtpbnMsaS5pY29uLmpvZ2V0LGkuaWNvbi5qb29tbGEsaS5pY29uLmpzLGkuaWNvbi5qcy5zcXVhcmUsaS5pY29uLmpzZmlkZGxlLGkuaWNvbi5rZXljZG4saS5pY29uLmtpY2tzdGFydGVyLGkuaWNvbi5raWNrc3RhcnRlci5rLGkuaWNvbi5rb3J2dWUsaS5pY29uLmxhcmF2ZWwsaS5pY29uLmxhc3RmbSxpLmljb24ubGFzdGZtLnNxdWFyZSxpLmljb24ubGVhbnB1YixpLmljb24ubGVzcyxpLmljb24ubGluZWNoYXQsaS5pY29uLmxpbmtlZGluLGkuaWNvbi5saW5rZWRpbi5hbHRlcm5hdGUsaS5pY29uLmxpbmtlZGluLmluLGkuaWNvbi5saW5vZGUsaS5pY29uLmxpbnV4LGkuaWNvbi5seWZ0LGkuaWNvbi5tYWdlbnRvLGkuaWNvbi5tYXhjZG4saS5pY29uLm1lZGFwcHMsaS5pY29uLm1lZGl1bSxpLmljb24ubWVkaXVtLm0saS5pY29uLm1lZHJ0LGkuaWNvbi5tZWV0dXAsaS5pY29uLm1pY3Jvc29mdCxpLmljb24ubWl4LGkuaWNvbi5taXhjbG91ZCxpLmljb24ubWl6dW5pLGkuaWNvbi5tb2R4LGkuaWNvbi5tb25lcm8saS5pY29uLm5hcHN0ZXIsaS5pY29uLm5pbnRlbmRvLnN3aXRjaCxpLmljb24ubm9kZSxpLmljb24ubm9kZS5qcyxpLmljb24ubnBtLGkuaWNvbi5uczgsaS5pY29uLm51dHJpdGlvbml4LGkuaWNvbi5vZG5va2xhc3NuaWtpLGkuaWNvbi5vZG5va2xhc3NuaWtpLnNxdWFyZSxpLmljb24ub3BlbmNhcnQsaS5pY29uLm9wZW5pZCxpLmljb24ub3BlcmEsaS5pY29uLm9wdGluLm1vbnN0ZXIsaS5pY29uLm9zaSxpLmljb24ucGFnZTQsaS5pY29uLnBhZ2VsaW5lcyxpLmljb24ucGFsZmVkLGkuaWNvbi5wYXRyZW9uLGkuaWNvbi5wYXlwYWwsaS5pY29uLnBlcmlzY29wZSxpLmljb24ucGhhYnJpY2F0b3IsaS5pY29uLnBob2VuaXguZnJhbWV3b3JrLGkuaWNvbi5waHAsaS5pY29uLnBpZWQucGlwZXIsaS5pY29uLnBpZWQucGlwZXIuYWx0ZXJuYXRlLGkuaWNvbi5waWVkLnBpcGVyLnBwLGkuaWNvbi5waW50ZXJlc3QsaS5pY29uLnBpbnRlcmVzdC5wLGkuaWNvbi5waW50ZXJlc3Quc3F1YXJlLGkuaWNvbi5wbGF5c3RhdGlvbixpLmljb24ucHJvZHVjdC5odW50LGkuaWNvbi5wdXNoZWQsaS5pY29uLnB5dGhvbixpLmljb24ucXEsaS5pY29uLnF1aW5zY2FwZSxpLmljb24ucXVvcmEsaS5pY29uLnJhdmVscnksaS5pY29uLnJlYWN0LGkuaWNvbi5yZWJlbCxpLmljb24ucmVkZGl0LGkuaWNvbi5yZWRkaXQuYWxpZW4saS5pY29uLnJlZGRpdC5zcXVhcmUsaS5pY29uLnJlZHJpdmVyLGkuaWNvbi5yZW5kYWN0LGkuaWNvbi5yZW5yZW4saS5pY29uLnJlcGx5ZCxpLmljb24ucmVzb2x2aW5nLGkuaWNvbi5yb2NrZXRjaGF0LGkuaWNvbi5yb2Nrcm1zLGkuaWNvbi5zYWZhcmksaS5pY29uLnNhc3MsaS5pY29uLnNjaGxpeCxpLmljb24uc2NyaWJkLGkuaWNvbi5zZWFyY2hlbmdpbixpLmljb24uc2VsbGNhc3QsaS5pY29uLnNlbGxzeSxpLmljb24uc2VydmljZXN0YWNrLGkuaWNvbi5zaGlydHNpbmJ1bGssaS5pY29uLnNpbXBseWJ1aWx0LGkuaWNvbi5zaXN0cml4LGkuaWNvbi5za3lhdGxhcyxpLmljb24uc2t5cGUsaS5pY29uLnNsYWNrLGkuaWNvbi5zbGFjay5oYXNoLGkuaWNvbi5zbGlkZXNoYXJlLGkuaWNvbi5zbmFwY2hhdCxpLmljb24uc25hcGNoYXQuZ2hvc3QsaS5pY29uLnNuYXBjaGF0LnNxdWFyZSxpLmljb24uc291bmRjbG91ZCxpLmljb24uc3BlYWthcCxpLmljb24uc3BvdGlmeSxpLmljb24uc3RhY2suZXhjaGFuZ2UsaS5pY29uLnN0YWNrLm92ZXJmbG93LGkuaWNvbi5zdGF5bGlua2VkLGkuaWNvbi5zdGVhbSxpLmljb24uc3RlYW0uc3F1YXJlLGkuaWNvbi5zdGVhbS5zeW1ib2wsaS5pY29uLnN0aWNrZXIubXVsZSxpLmljb24uc3RyYXZhLGkuaWNvbi5zdHJpcGUsaS5pY29uLnN0cmlwZS5zLGkuaWNvbi5zdHVkaW92aW5hcmksaS5pY29uLnN0dW1ibGV1cG9uLGkuaWNvbi5zdHVtYmxldXBvbi5jaXJjbGUsaS5pY29uLnN1cGVycG93ZXJzLGkuaWNvbi5zdXBwbGUsaS5pY29uLnRlbGVncmFtLGkuaWNvbi50ZWxlZ3JhbS5wbGFuZSxpLmljb24udGVuY2VudC53ZWlibyxpLmljb24udGhlbWVpc2xlLGkuaWNvbi50cmVsbG8saS5pY29uLnRyaXBhZHZpc29yLGkuaWNvbi50dW1ibHIsaS5pY29uLnR1bWJsci5zcXVhcmUsaS5pY29uLnR3aXRjaCxpLmljb24udHdpdHRlcixpLmljb24udHdpdHRlci5zcXVhcmUsaS5pY29uLnR5cG8zLGkuaWNvbi51YmVyLGkuaWNvbi51aWtpdCxpLmljb24udW5pcmVnaXN0cnksaS5pY29uLnVudGFwcGQsaS5pY29uLnVzYixpLmljb24udXNzdW5uYWgsaS5pY29uLnZhYWRpbixpLmljb24udmlhY29pbixpLmljb24udmlhZGVvLGkuaWNvbi52aWFkZW8uc3F1YXJlLGkuaWNvbi52aWJlcixpLmljb24udmltZW8saS5pY29uLnZpbWVvLnNxdWFyZSxpLmljb24udmltZW8udixpLmljb24udmluZSxpLmljb24udmssaS5pY29uLnZudixpLmljb24udnVlanMsaS5pY29uLndlY2hhdCxpLmljb24ud2VpYm8saS5pY29uLndlaXhpbixpLmljb24ud2hhdHNhcHAsaS5pY29uLndoYXRzYXBwLnNxdWFyZSxpLmljb24ud2htY3MsaS5pY29uLndpa2lwZWRpYS53LGkuaWNvbi53aW5kb3dzLGkuaWNvbi53b3JkcHJlc3MsaS5pY29uLndvcmRwcmVzcy5zaW1wbGUsaS5pY29uLndwYmVnaW5uZXIsaS5pY29uLndwZXhwbG9yZXIsaS5pY29uLndwZm9ybXMsaS5pY29uLnhib3gsaS5pY29uLnhpbmcsaS5pY29uLnhpbmcuc3F1YXJlLGkuaWNvbi55LmNvbWJpbmF0b3IsaS5pY29uLnlhaG9vLGkuaWNvbi55YW5kZXgsaS5pY29uLnlhbmRleC5pbnRlcm5hdGlvbmFsLGkuaWNvbi55ZWxwLGkuaWNvbi55b2FzdCxpLmljb24ueW91dHViZSxpLmljb24ueW91dHViZS5zcXVhcmV7Zm9udC1mYW1pbHk6YnJhbmQtaWNvbnN9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEltYWdlXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuaW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO21heC13aWR0aDoxMDAlO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9aW1nLnVpLmltYWdle2Rpc3BsYXk6YmxvY2t9LnVpLmltYWdlIGltZywudWkuaW1hZ2Ugc3Zne2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99LnVpLmhpZGRlbi5pbWFnZSwudWkuaGlkZGVuLmltYWdlc3tkaXNwbGF5Om5vbmV9LnVpLmhpZGRlbi50cmFuc2l0aW9uLmltYWdlLC51aS5oaWRkZW4udHJhbnNpdGlvbi5pbWFnZXN7ZGlzcGxheTpibG9jazt2aXNpYmlsaXR5OmhpZGRlbn0udWkuaW1hZ2VzPi5oaWRkZW4udHJhbnNpdGlvbntkaXNwbGF5OmlubGluZS1ibG9jazt2aXNpYmlsaXR5OmhpZGRlbn0udWkuZGlzYWJsZWQuaW1hZ2UsLnVpLmRpc2FibGVkLmltYWdlc3tjdXJzb3I6ZGVmYXVsdDtvcGFjaXR5Oi40NX0udWkuaW5saW5lLmltYWdlLC51aS5pbmxpbmUuaW1hZ2UgaW1nLC51aS5pbmxpbmUuaW1hZ2Ugc3Zne2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS50b3AuYWxpZ25lZC5pbWFnZSwudWkudG9wLmFsaWduZWQuaW1hZ2UgaW1nLC51aS50b3AuYWxpZ25lZC5pbWFnZSBzdmcsLnVpLnRvcC5hbGlnbmVkLmltYWdlcyAuaW1hZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wfS51aS5taWRkbGUuYWxpZ25lZC5pbWFnZSwudWkubWlkZGxlLmFsaWduZWQuaW1hZ2UgaW1nLC51aS5taWRkbGUuYWxpZ25lZC5pbWFnZSBzdmcsLnVpLm1pZGRsZS5hbGlnbmVkLmltYWdlcyAuaW1hZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5ib3R0b20uYWxpZ25lZC5pbWFnZSwudWkuYm90dG9tLmFsaWduZWQuaW1hZ2UgaW1nLC51aS5ib3R0b20uYWxpZ25lZC5pbWFnZSBzdmcsLnVpLmJvdHRvbS5hbGlnbmVkLmltYWdlcyAuaW1hZ2V7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246Ym90dG9tfS51aS5yb3VuZGVkLmltYWdlLC51aS5yb3VuZGVkLmltYWdlPiosLnVpLnJvdW5kZWQuaW1hZ2VzIC5pbWFnZSwudWkucm91bmRlZC5pbWFnZXMgLmltYWdlPip7Ym9yZGVyLXJhZGl1czouMzEyNWVtfS51aS5ib3JkZXJlZC5pbWFnZSBpbWcsLnVpLmJvcmRlcmVkLmltYWdlIHN2ZywudWkuYm9yZGVyZWQuaW1hZ2VzIC5pbWFnZSwudWkuYm9yZGVyZWQuaW1hZ2VzIGltZywudWkuYm9yZGVyZWQuaW1hZ2VzIHN2ZyxpbWcudWkuYm9yZGVyZWQuaW1hZ2V7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKX0udWkuY2lyY3VsYXIuaW1hZ2UsLnVpLmNpcmN1bGFyLmltYWdlc3tvdmVyZmxvdzpoaWRkZW59LnVpLmNpcmN1bGFyLmltYWdlLC51aS5jaXJjdWxhci5pbWFnZT4qLC51aS5jaXJjdWxhci5pbWFnZXMgLmltYWdlLC51aS5jaXJjdWxhci5pbWFnZXMgLmltYWdlPip7Ym9yZGVyLXJhZGl1czo1MDByZW19LnVpLmZsdWlkLmltYWdlLC51aS5mbHVpZC5pbWFnZSBpbWcsLnVpLmZsdWlkLmltYWdlIHN2ZywudWkuZmx1aWQuaW1hZ2VzLC51aS5mbHVpZC5pbWFnZXMgaW1nLC51aS5mbHVpZC5pbWFnZXMgc3Zne2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtoZWlnaHQ6YXV0b30udWkuYXZhdGFyLmltYWdlLC51aS5hdmF0YXIuaW1hZ2UgaW1nLC51aS5hdmF0YXIuaW1hZ2Ugc3ZnLC51aS5hdmF0YXIuaW1hZ2VzIC5pbWFnZSwudWkuYXZhdGFyLmltYWdlcyBpbWcsLnVpLmF2YXRhci5pbWFnZXMgc3Zne21hcmdpbi1yaWdodDouMjVlbTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyZW07aGVpZ2h0OjJlbTtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkuc3BhY2VkLmltYWdle2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudDttYXJnaW4tbGVmdDouNWVtO21hcmdpbi1yaWdodDouNWVtfS51aVtjbGFzcyo9XFxcImxlZnQgc3BhY2VkXFxcIl0uaW1hZ2V7bWFyZ2luLWxlZnQ6LjVlbTttYXJnaW4tcmlnaHQ6MH0udWlbY2xhc3MqPVxcXCJyaWdodCBzcGFjZWRcXFwiXS5pbWFnZXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDouNWVtfS51aS5mbG9hdGVkLmltYWdlLC51aS5mbG9hdGVkLmltYWdlc3tmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxZW07bWFyZ2luLWJvdHRvbToxZW19LnVpLnJpZ2h0LmZsb2F0ZWQuaW1hZ2UsLnVpLnJpZ2h0LmZsb2F0ZWQuaW1hZ2Vze2Zsb2F0OnJpZ2h0O21hcmdpbi1yaWdodDowO21hcmdpbi1ib3R0b206MWVtO21hcmdpbi1sZWZ0OjFlbX0udWkuZmxvYXRlZC5pbWFnZTpsYXN0LWNoaWxkLC51aS5mbG9hdGVkLmltYWdlczpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuY2VudGVyZWQuaW1hZ2UsLnVpLmNlbnRlcmVkLmltYWdlc3ttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS51aS5taW5pLmltYWdlLC51aS5taW5pLmltYWdlcyAuaW1hZ2UsLnVpLm1pbmkuaW1hZ2VzIGltZywudWkubWluaS5pbWFnZXMgc3Zne3dpZHRoOjM1cHg7aGVpZ2h0OmF1dG87Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5pbWFnZSwudWkudGlueS5pbWFnZXMgLmltYWdlLC51aS50aW55LmltYWdlcyBpbWcsLnVpLnRpbnkuaW1hZ2VzIHN2Z3t3aWR0aDo4MHB4O2hlaWdodDphdXRvO2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLmltYWdlLC51aS5zbWFsbC5pbWFnZXMgLmltYWdlLC51aS5zbWFsbC5pbWFnZXMgaW1nLC51aS5zbWFsbC5pbWFnZXMgc3Zne3dpZHRoOjE1MHB4O2hlaWdodDphdXRvO2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLm1lZGl1bS5pbWFnZSwudWkubWVkaXVtLmltYWdlcyAuaW1hZ2UsLnVpLm1lZGl1bS5pbWFnZXMgaW1nLC51aS5tZWRpdW0uaW1hZ2VzIHN2Z3t3aWR0aDozMDBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MXJlbX0udWkubGFyZ2UuaW1hZ2UsLnVpLmxhcmdlLmltYWdlcyAuaW1hZ2UsLnVpLmxhcmdlLmltYWdlcyBpbWcsLnVpLmxhcmdlLmltYWdlcyBzdmd7d2lkdGg6NDUwcHg7aGVpZ2h0OmF1dG87Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy5pbWFnZSwudWkuYmlnLmltYWdlcyAuaW1hZ2UsLnVpLmJpZy5pbWFnZXMgaW1nLC51aS5iaWcuaW1hZ2VzIHN2Z3t3aWR0aDo2MDBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5pbWFnZSwudWkuaHVnZS5pbWFnZXMgLmltYWdlLC51aS5odWdlLmltYWdlcyBpbWcsLnVpLmh1Z2UuaW1hZ2VzIHN2Z3t3aWR0aDo4MDBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5pbWFnZSwudWkubWFzc2l2ZS5pbWFnZXMgLmltYWdlLC51aS5tYXNzaXZlLmltYWdlcyBpbWcsLnVpLm1hc3NpdmUuaW1hZ2VzIHN2Z3t3aWR0aDo5NjBweDtoZWlnaHQ6YXV0bztmb250LXNpemU6MS43MTQyODU3MXJlbX0udWkuaW1hZ2Vze2ZvbnQtc2l6ZTowO21hcmdpbjowIC0uMjVyZW0gMH0udWkuaW1hZ2VzIC5pbWFnZSwudWkuaW1hZ2VzPmltZywudWkuaW1hZ2VzPnN2Z3tkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAuMjVyZW0gLjVyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIElucHV0XFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuaW5wdXR7cG9zaXRpb246cmVsYXRpdmU7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2Rpc3BsYXk6LXdlYmtpdC1pbmxpbmUtYm94O2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94O2Rpc3BsYXk6aW5saW5lLWZsZXg7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbnB1dD5pbnB1dHttYXJnaW46MDttYXgtd2lkdGg6MTAwJTstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MSAwIGF1dG87ZmxleDoxIDAgYXV0bztvdXRsaW5lOjA7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMCk7dGV4dC1hbGlnbjpsZWZ0O2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbTtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7cGFkZGluZzouNjc4NTcxNDNlbSAxZW07YmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3gtc2hhZG93IC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmlucHV0PmlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTkxLDE5MSwxOTEsLjg3KX0udWkuaW5wdXQ+aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxOTEsMTkxLDE5MSwuODcpfS51aS5pbnB1dD5pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxOTEsMTkxLDE5MSwuODcpfS51aS5kaXNhYmxlZC5pbnB1dCwudWkuaW5wdXQ6bm90KC5kaXNhYmxlZCkgaW5wdXRbZGlzYWJsZWRde29wYWNpdHk6LjQ1fS51aS5kaXNhYmxlZC5pbnB1dD5pbnB1dCwudWkuaW5wdXQ6bm90KC5kaXNhYmxlZCkgaW5wdXRbZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LnVpLmlucHV0LmRvd24gaW5wdXQsLnVpLmlucHV0PmlucHV0OmFjdGl2ZXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMyk7YmFja2dyb3VuZDojZmFmYWZhO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmxvYWRpbmcubG9hZGluZy5pbnB1dD5pLmljb246YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LS42NDI4NTcxNGVtIDAgMCAtLjY0Mjg1NzE0ZW07d2lkdGg6MS4yODU3MTQyOWVtO2hlaWdodDoxLjI4NTcxNDI5ZW07Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMSl9LnVpLmxvYWRpbmcubG9hZGluZy5pbnB1dD5pLmljb246YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjotLjY0Mjg1NzE0ZW0gMCAwIC0uNjQyODU3MTRlbTt3aWR0aDoxLjI4NTcxNDI5ZW07aGVpZ2h0OjEuMjg1NzE0MjllbTstd2Via2l0LWFuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpidXR0b24tc3BpbiAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50fS51aS5pbnB1dC5mb2N1cz5pbnB1dCwudWkuaW5wdXQ+aW5wdXQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOiM4NWI3ZDk7YmFja2dyb3VuZDojZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjgpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuaW5wdXQuZm9jdXM+aW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIsLnVpLmlucHV0PmlucHV0OmZvY3VzOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTE1LDExNSwxMTUsLjg3KX0udWkuaW5wdXQuZm9jdXM+aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsLnVpLmlucHV0PmlucHV0OmZvY3VzOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTE1LDExNSwxMTUsLjg3KX0udWkuaW5wdXQuZm9jdXM+aW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyLC51aS5pbnB1dD5pbnB1dDpmb2N1czotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpfS51aS5pbnB1dC5lcnJvcj5pbnB1dHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY2ZjY7Ym9yZGVyLWNvbG9yOiNlMGI0YjQ7Y29sb3I6IzlmM2EzODstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmlucHV0LmVycm9yPmlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNlN2JkYmN9LnVpLmlucHV0LmVycm9yPmlucHV0OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOiNlN2JkYmN9LnVpLmlucHV0LmVycm9yPmlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojZTdiZGJjIWltcG9ydGFudH0udWkuaW5wdXQuZXJyb3I+aW5wdXQ6Zm9jdXM6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2RhOTc5Nn0udWkuaW5wdXQuZXJyb3I+aW5wdXQ6Zm9jdXM6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6I2RhOTc5Nn0udWkuaW5wdXQuZXJyb3I+aW5wdXQ6Zm9jdXM6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNkYTk3OTYhaW1wb3J0YW50fS51aS50cmFuc3BhcmVudC5pbnB1dD5pbnB1dHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudH0udWkudHJhbnNwYXJlbnQuaWNvbi5pbnB1dD5pLmljb257d2lkdGg6MS4xZW19LnVpLnRyYW5zcGFyZW50Lmljb24uaW5wdXQ+aW5wdXR7cGFkZGluZy1sZWZ0OjAhaW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MmVtIWltcG9ydGFudH0udWkudHJhbnNwYXJlbnRbY2xhc3MqPVxcXCJsZWZ0IGljb25cXFwiXS5pbnB1dD5pbnB1dHtwYWRkaW5nLWxlZnQ6MmVtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50fS51aS50cmFuc3BhcmVudC5pbnZlcnRlZC5pbnB1dHtjb2xvcjojZmZmfS51aS50cmFuc3BhcmVudC5pbnZlcnRlZC5pbnB1dD5pbnB1dHtjb2xvcjppbmhlcml0fS51aS50cmFuc3BhcmVudC5pbnZlcnRlZC5pbnB1dD5pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX0udWkudHJhbnNwYXJlbnQuaW52ZXJ0ZWQuaW5wdXQ+aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9LnVpLnRyYW5zcGFyZW50LmludmVydGVkLmlucHV0PmlucHV0Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX0udWkuaWNvbi5pbnB1dD5pLmljb257Y3Vyc29yOmRlZmF1bHQ7cG9zaXRpb246YWJzb2x1dGU7bGluZS1oZWlnaHQ6MTt0ZXh0LWFsaWduOmNlbnRlcjt0b3A6MDtyaWdodDowO21hcmdpbjowO2hlaWdodDoxMDAlO3dpZHRoOjIuNjcxNDI4NTdlbTtvcGFjaXR5Oi41O2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDA7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjNzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4zcyBlYXNlfS51aS5pY29uLmlucHV0PmkuaWNvbjpub3QoLmxpbmspe3BvaW50ZXItZXZlbnRzOm5vbmV9LnVpLmljb24uaW5wdXQ+aW5wdXR7cGFkZGluZy1yaWdodDoyLjY3MTQyODU3ZW0haW1wb3J0YW50fS51aS5pY29uLmlucHV0PmkuaWNvbjphZnRlciwudWkuaWNvbi5pbnB1dD5pLmljb246YmVmb3Jle2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjt0b3A6NTAlO3dpZHRoOjEwMCU7bWFyZ2luLXRvcDotLjVlbX0udWkuaWNvbi5pbnB1dD5pLmxpbmsuaWNvbntjdXJzb3I6cG9pbnRlcn0udWkuaWNvbi5pbnB1dD5pLmNpcmN1bGFyLmljb257dG9wOi4zNWVtO3JpZ2h0Oi41ZW19LnVpW2NsYXNzKj1cXFwibGVmdCBpY29uXFxcIl0uaW5wdXQ+aS5pY29ue3JpZ2h0OmF1dG87bGVmdDoxcHg7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIC4yODU3MTQyOXJlbX0udWlbY2xhc3MqPVxcXCJsZWZ0IGljb25cXFwiXS5pbnB1dD5pLmNpcmN1bGFyLmljb257cmlnaHQ6YXV0bztsZWZ0Oi41ZW19LnVpW2NsYXNzKj1cXFwibGVmdCBpY29uXFxcIl0uaW5wdXQ+aW5wdXR7cGFkZGluZy1sZWZ0OjIuNjcxNDI4NTdlbSFpbXBvcnRhbnQ7cGFkZGluZy1yaWdodDoxZW0haW1wb3J0YW50fS51aS5pY29uLmlucHV0PmlucHV0OmZvY3VzfmkuaWNvbntvcGFjaXR5OjF9LnVpLmxhYmVsZWQuaW5wdXQ+LmxhYmVsey13ZWJraXQtYm94LWZsZXg6MDstbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvO21hcmdpbjowO2ZvbnQtc2l6ZToxZW19LnVpLmxhYmVsZWQuaW5wdXQ+LmxhYmVsOm5vdCguY29ybmVyKXtwYWRkaW5nLXRvcDouNzg1NzE0MjllbTtwYWRkaW5nLWJvdHRvbTouNzg1NzE0MjllbX0udWkubGFiZWxlZC5pbnB1dDpub3QoW2NsYXNzKj1cXFwiY29ybmVyIGxhYmVsZWRcXFwiXSkgLmxhYmVsOmZpcnN0LWNoaWxke2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MH0udWkubGFiZWxlZC5pbnB1dDpub3QoW2NsYXNzKj1cXFwiY29ybmVyIGxhYmVsZWRcXFwiXSkgLmxhYmVsOmZpcnN0LWNoaWxkK2lucHV0e2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLWxlZnQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLmxhYmVsZWQuaW5wdXQ6bm90KFtjbGFzcyo9XFxcImNvcm5lciBsYWJlbGVkXFxcIl0pIC5sYWJlbDpmaXJzdC1jaGlsZCtpbnB1dDpmb2N1c3tib3JkZXItbGVmdC1jb2xvcjojODViN2Q5fS51aVtjbGFzcyo9XFxcInJpZ2h0IGxhYmVsZWRcXFwiXS5pbnB1dD5pbnB1dHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowIWltcG9ydGFudDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowIWltcG9ydGFudDtib3JkZXItcmlnaHQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aVtjbGFzcyo9XFxcInJpZ2h0IGxhYmVsZWRcXFwiXS5pbnB1dD5pbnB1dCsubGFiZWx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0udWlbY2xhc3MqPVxcXCJyaWdodCBsYWJlbGVkXFxcIl0uaW5wdXQ+aW5wdXQ6Zm9jdXN7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM4NWI3ZDkhaW1wb3J0YW50fS51aS5sYWJlbGVkLmlucHV0IC5jb3JuZXIubGFiZWx7dG9wOjFweDtyaWdodDoxcHg7Zm9udC1zaXplOi42NDI4NTcxNGVtO2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gMCAwfS51aVtjbGFzcyo9XFxcImNvcm5lciBsYWJlbGVkXFxcIl06bm90KFtjbGFzcyo9XFxcImxlZnQgY29ybmVyIGxhYmVsZWRcXFwiXSkubGFiZWxlZC5pbnB1dD5pbnB1dHtwYWRkaW5nLXJpZ2h0OjIuNWVtIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJjb3JuZXIgbGFiZWxlZFxcXCJdLmljb24uaW5wdXQ6bm90KFtjbGFzcyo9XFxcImxlZnQgY29ybmVyIGxhYmVsZWRcXFwiXSk+aW5wdXR7cGFkZGluZy1yaWdodDozLjI1ZW0haW1wb3J0YW50fS51aVtjbGFzcyo9XFxcImNvcm5lciBsYWJlbGVkXFxcIl0uaWNvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBjb3JuZXIgbGFiZWxlZFxcXCJdKT4uaWNvbnttYXJnaW4tcmlnaHQ6MS4yNWVtfS51aVtjbGFzcyo9XFxcImxlZnQgY29ybmVyIGxhYmVsZWRcXFwiXS5sYWJlbGVkLmlucHV0PmlucHV0e3BhZGRpbmctbGVmdDoyLjVlbSFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwibGVmdCBjb3JuZXIgbGFiZWxlZFxcXCJdLmljb24uaW5wdXQ+aW5wdXR7cGFkZGluZy1sZWZ0OjMuMjVlbSFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwibGVmdCBjb3JuZXIgbGFiZWxlZFxcXCJdLmljb24uaW5wdXQ+Lmljb257bWFyZ2luLWxlZnQ6MS4yNWVtfS51aS5pbnB1dD4udWkuY29ybmVyLmxhYmVse3RvcDoxcHg7cmlnaHQ6MXB4fS51aS5pbnB1dD4udWkubGVmdC5jb3JuZXIubGFiZWx7cmlnaHQ6YXV0bztsZWZ0OjFweH0udWkuYWN0aW9uLmlucHV0Pi5idXR0b24sLnVpLmFjdGlvbi5pbnB1dD4uYnV0dG9uc3tkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyOy13ZWJraXQtYm94LWZsZXg6MDstbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvfS51aS5hY3Rpb24uaW5wdXQ+LmJ1dHRvbiwudWkuYWN0aW9uLmlucHV0Pi5idXR0b25zPi5idXR0b257cGFkZGluZy10b3A6Ljc4NTcxNDI5ZW07cGFkZGluZy1ib3R0b206Ljc4NTcxNDI5ZW07bWFyZ2luOjB9LnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+aW5wdXR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuYWN0aW9uLmlucHV0Om5vdChbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdKT4uYnV0dG9uOm5vdCg6Zmlyc3QtY2hpbGQpLC51aS5hY3Rpb24uaW5wdXQ6bm90KFtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0pPi5idXR0b25zOm5vdCg6Zmlyc3QtY2hpbGQpPi5idXR0b24sLnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+LmRyb3Bkb3duOm5vdCg6Zmlyc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MH0udWkuYWN0aW9uLmlucHV0Om5vdChbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdKT4uYnV0dG9uOmxhc3QtY2hpbGQsLnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+LmJ1dHRvbnM6bGFzdC1jaGlsZD4uYnV0dG9uLC51aS5hY3Rpb24uaW5wdXQ6bm90KFtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0pPi5kcm9wZG93bjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDB9LnVpLmFjdGlvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXSk+aW5wdXQ6Zm9jdXN7Ym9yZGVyLXJpZ2h0LWNvbG9yOiM4NWI3ZDkhaW1wb3J0YW50fS51aVtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0uaW5wdXQ+aW5wdXR7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowIWltcG9ydGFudDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjAhaW1wb3J0YW50O2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdLmlucHV0Pi5idXR0b24sLnVpW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXS5pbnB1dD4uYnV0dG9ucz4uYnV0dG9uLC51aVtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0uaW5wdXQ+LmRyb3Bkb3due2JvcmRlci1yYWRpdXM6MH0udWlbY2xhc3MqPVxcXCJsZWZ0IGFjdGlvblxcXCJdLmlucHV0Pi5idXR0b246Zmlyc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXS5pbnB1dD4uYnV0dG9uczpmaXJzdC1jaGlsZD4uYnV0dG9uLC51aVtjbGFzcyo9XFxcImxlZnQgYWN0aW9uXFxcIl0uaW5wdXQ+LmRyb3Bkb3duOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwibGVmdCBhY3Rpb25cXFwiXS5pbnB1dD5pbnB1dDpmb2N1c3tib3JkZXItbGVmdC1jb2xvcjojODViN2Q5IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuaW5wdXQ+aW5wdXR7Ym9yZGVyOm5vbmV9LnVpLmZsdWlkLmlucHV0e2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXh9LnVpLmZsdWlkLmlucHV0PmlucHV0e3dpZHRoOjAhaW1wb3J0YW50fS51aS5taW5pLmlucHV0e2ZvbnQtc2l6ZTouNzg1NzE0MjllbX0udWkuc21hbGwuaW5wdXR7Zm9udC1zaXplOi45Mjg1NzE0M2VtfS51aS5pbnB1dHtmb250LXNpemU6MWVtfS51aS5sYXJnZS5pbnB1dHtmb250LXNpemU6MS4xNDI4NTcxNGVtfS51aS5iaWcuaW5wdXR7Zm9udC1zaXplOjEuMjg1NzE0MjllbX0udWkuaHVnZS5pbnB1dHtmb250LXNpemU6MS40Mjg1NzE0M2VtfS51aS5tYXNzaXZlLmlucHV0e2ZvbnQtc2l6ZToxLjcxNDI4NTcxZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIExhYmVsXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTttYXJnaW46MCAuMTQyODU3MTRlbTtiYWNrZ3JvdW5kLWNvbG9yOiNlOGU4ZTg7YmFja2dyb3VuZC1pbWFnZTpub25lO3BhZGRpbmc6LjU4MzNlbSAuODMzZW07Y29sb3I6cmdiYSgwLDAsMCwuNik7dGV4dC10cmFuc2Zvcm06bm9uZTtmb250LXdlaWdodDo3MDA7Ym9yZGVyOjAgc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlfS51aS5sYWJlbDpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS51aS5sYWJlbDpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfWEudWkubGFiZWx7Y3Vyc29yOnBvaW50ZXJ9LnVpLmxhYmVsPmF7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6aW5oZXJpdDtvcGFjaXR5Oi41Oy13ZWJraXQtdHJhbnNpdGlvbjouMXMgb3BhY2l0eSBlYXNlO3RyYW5zaXRpb246LjFzIG9wYWNpdHkgZWFzZX0udWkubGFiZWw+YTpob3ZlcntvcGFjaXR5OjF9LnVpLmxhYmVsPmltZ3t3aWR0aDphdXRvIWltcG9ydGFudDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7aGVpZ2h0OjIuMTY2NmVtIWltcG9ydGFudH0udWkubGFiZWw+Lmljb257d2lkdGg6YXV0bzttYXJnaW46MCAuNzVlbSAwIDB9LnVpLmxhYmVsPi5kZXRhaWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tbGVmdDoxZW07b3BhY2l0eTouOH0udWkubGFiZWw+LmRldGFpbCAuaWNvbnttYXJnaW46MCAuMjVlbSAwIDB9LnVpLmxhYmVsPi5jbG9zZS5pY29uLC51aS5sYWJlbD4uZGVsZXRlLmljb257Y3Vyc29yOnBvaW50ZXI7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6LjVlbTtmb250LXNpemU6LjkyODU3MTQzZW07b3BhY2l0eTouNTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2V9LnVpLmxhYmVsPi5kZWxldGUuaWNvbjpob3ZlcntvcGFjaXR5OjF9LnVpLmxhYmVscz4ubGFiZWx7bWFyZ2luOjAgLjVlbSAuNWVtIDB9LnVpLmhlYWRlcj4udWkubGFiZWx7bWFyZ2luLXRvcDotLjI5MTY1ZW19LnVpLmF0dGFjaGVkLnNlZ21lbnQ+LnVpLnRvcC5sZWZ0LmF0dGFjaGVkLmxhYmVsLC51aS5ib3R0b20uYXR0YWNoZWQuc2VnbWVudD4udWkudG9wLmxlZnQuYXR0YWNoZWQubGFiZWx7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czowfS51aS5hdHRhY2hlZC5zZWdtZW50Pi51aS50b3AucmlnaHQuYXR0YWNoZWQubGFiZWwsLnVpLmJvdHRvbS5hdHRhY2hlZC5zZWdtZW50Pi51aS50b3AucmlnaHQuYXR0YWNoZWQubGFiZWx7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0udWkudG9wLmF0dGFjaGVkLnNlZ21lbnQ+LnVpLmJvdHRvbS5sZWZ0LmF0dGFjaGVkLmxhYmVse2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MH0udWkudG9wLmF0dGFjaGVkLnNlZ21lbnQ+LnVpLmJvdHRvbS5yaWdodC5hdHRhY2hlZC5sYWJlbHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS51aS50b3AuYXR0YWNoZWQubGFiZWwrW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdKyosLnVpLnRvcC5hdHRhY2hlZC5sYWJlbDpmaXJzdC1jaGlsZCs6bm90KC5hdHRhY2hlZCl7bWFyZ2luLXRvcDoycmVtIWltcG9ydGFudH0udWkuYm90dG9tLmF0dGFjaGVkLmxhYmVsOmZpcnN0LWNoaWxkfjpsYXN0LWNoaWxkOm5vdCguYXR0YWNoZWQpe21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjJyZW0haW1wb3J0YW50fS51aS5pbWFnZS5sYWJlbHt3aWR0aDphdXRvIWltcG9ydGFudDttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO21heC13aWR0aDo5OTk5cHg7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC10cmFuc2Zvcm06bm9uZTtiYWNrZ3JvdW5kOiNlOGU4ZTg7cGFkZGluZzouNTgzM2VtIC44MzNlbSAuNTgzM2VtIC41ZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbWFnZS5sYWJlbCBpbWd7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wO2hlaWdodDoyLjE2NjZlbTttYXJnaW46LS41ODMzZW0gLjVlbSAtLjU4MzNlbSAtLjVlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgLjI4NTcxNDI5cmVtfS51aS5pbWFnZS5sYWJlbCAuZGV0YWlse2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMSk7bWFyZ2luOi0uNTgzM2VtIC0uODMzZW0gLS41ODMzZW0gLjVlbTtwYWRkaW5nOi41ODMzZW0gLjgzM2VtO2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDB9LnVpLnRhZy5sYWJlbCwudWkudGFnLmxhYmVscyAubGFiZWx7bWFyZ2luLWxlZnQ6MWVtO3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmctbGVmdDoxLjVlbTtwYWRkaW5nLXJpZ2h0OjEuNWVtO2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDA7LXdlYmtpdC10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lfS51aS50YWcubGFiZWw6YmVmb3JlLC51aS50YWcubGFiZWxzIC5sYWJlbDpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKDUwJSkgcm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgdHJhbnNsYXRlWCg1MCUpIHJvdGF0ZSgtNDVkZWcpO3RvcDo1MCU7cmlnaHQ6MTAwJTtjb250ZW50OicnO2JhY2tncm91bmQtY29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7d2lkdGg6MS41NmVtO2hlaWdodDoxLjU2ZW07LXdlYmtpdC10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lfS51aS50YWcubGFiZWw6YWZ0ZXIsLnVpLnRhZy5sYWJlbHMgLmxhYmVsOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0Oi0uMjVlbTttYXJnaW4tdG9wOi0uMjVlbTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O3dpZHRoOi41ZW07aGVpZ2h0Oi41ZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAxcHggMCByZ2JhKDAsMCwwLC4zKTtib3gtc2hhZG93OjAgLTFweCAxcHggMCByZ2JhKDAsMCwwLC4zKTtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkuY29ybmVyLmxhYmVse3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3JpZ2h0OjA7bWFyZ2luOjA7cGFkZGluZzowO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1jb2xvcjojZThlOGU4O3dpZHRoOjRlbTtoZWlnaHQ6NGVtO3otaW5kZXg6MTstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlfS51aS5jb3JuZXIubGFiZWx7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLmNvcm5lci5sYWJlbDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OlxcXCJcXFwiO3JpZ2h0OjA7dG9wOjA7ei1pbmRleDotMTt3aWR0aDowO2hlaWdodDowO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50O2JvcmRlci10b3A6MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NGVtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206NGVtIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0OjAgc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOmluaGVyaXQ7LXdlYmtpdC10cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMXMgZWFzZX0udWkuY29ybmVyLmxhYmVsIC5pY29ue2N1cnNvcjpkZWZhdWx0O3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDouNjQyODU3MTRlbTtsZWZ0Oi43ODU3MTQyOWVtO2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW07bWFyZ2luOjB9LnVpLmxlZnQuY29ybmVyLmxhYmVsLC51aS5sZWZ0LmNvcm5lci5sYWJlbDphZnRlcntyaWdodDphdXRvO2xlZnQ6MH0udWkubGVmdC5jb3JuZXIubGFiZWw6YWZ0ZXJ7Ym9yZGVyLXRvcDo0ZW0gc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjRlbSBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjAgc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWxlZnQ6MCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wLWNvbG9yOmluaGVyaXR9LnVpLmxlZnQuY29ybmVyLmxhYmVsIC5pY29ue2xlZnQ6LS43ODU3MTQyOWVtfS51aS5zZWdtZW50Pi51aS5jb3JuZXIubGFiZWx7dG9wOi0xcHg7cmlnaHQ6LTFweH0udWkuc2VnbWVudD4udWkubGVmdC5jb3JuZXIubGFiZWx7cmlnaHQ6YXV0bztsZWZ0Oi0xcHh9LnVpLnJpYmJvbi5sYWJlbHtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MDttaW4td2lkdGg6LXdlYmtpdC1tYXgtY29udGVudDttaW4td2lkdGg6LW1vei1tYXgtY29udGVudDttaW4td2lkdGg6bWF4LWNvbnRlbnQ7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMDtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTUpfS51aS5yaWJib24ubGFiZWw6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6MTAwJTtsZWZ0OjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDowIDEuMmVtIDEuMmVtIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yaWdodC1jb2xvcjppbmhlcml0O3dpZHRoOjA7aGVpZ2h0OjB9LnVpLnJpYmJvbi5sYWJlbHtsZWZ0OmNhbGMoLTFyZW0gLSAxLjJlbSk7bWFyZ2luLXJpZ2h0Oi0xLjJlbTtwYWRkaW5nLWxlZnQ6Y2FsYygxcmVtICsgMS4yZW0pO3BhZGRpbmctcmlnaHQ6MS4yZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgcmliYm9uXFxcIl0ubGFiZWx7bGVmdDpjYWxjKDEwMCUgKyAxcmVtICsgMS4yZW0pO3BhZGRpbmctbGVmdDoxLjJlbTtwYWRkaW5nLXJpZ2h0OmNhbGMoMXJlbSArIDEuMmVtKX0udWlbY2xhc3MqPVxcXCJyaWdodCByaWJib25cXFwiXS5sYWJlbHt0ZXh0LWFsaWduOmxlZnQ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwicmlnaHQgcmliYm9uXFxcIl0ubGFiZWw6YWZ0ZXJ7bGVmdDphdXRvO3JpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxLjJlbSAxLjJlbSAwIDA7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci10b3AtY29sb3I6aW5oZXJpdH0udWkuY2FyZCAuaW1hZ2U+LnJpYmJvbi5sYWJlbCwudWkuaW1hZ2U+LnJpYmJvbi5sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MXJlbX0udWkuY2FyZCAuaW1hZ2U+LnVpLnJpYmJvbi5sYWJlbCwudWkuaW1hZ2U+LnVpLnJpYmJvbi5sYWJlbHtsZWZ0OmNhbGMoLjA1cmVtIC0gMS4yZW0pfS51aS5jYXJkIC5pbWFnZT4udWlbY2xhc3MqPVxcXCJyaWdodCByaWJib25cXFwiXS5sYWJlbCwudWkuaW1hZ2U+LnVpW2NsYXNzKj1cXFwicmlnaHQgcmliYm9uXFxcIl0ubGFiZWx7bGVmdDpjYWxjKDEwMCUgKyAtLjA1cmVtICsgMS4yZW0pO3BhZGRpbmctbGVmdDouODMzZW19LnVpLnRhYmxlIHRkPi51aS5yaWJib24ubGFiZWx7bGVmdDpjYWxjKC0uNzg1NzE0MjllbSAtIDEuMmVtKX0udWkudGFibGUgdGQ+LnVpW2NsYXNzKj1cXFwicmlnaHQgcmliYm9uXFxcIl0ubGFiZWx7bGVmdDpjYWxjKDEwMCUgKyAuNzg1NzE0MjllbSArIDEuMmVtKTtwYWRkaW5nLWxlZnQ6LjgzM2VtfS51aS5hdHRhY2hlZC5sYWJlbCwudWlbY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXS5sYWJlbHt3aWR0aDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbjowO3RvcDowO2xlZnQ6MDtwYWRkaW5nOi43NWVtIDFlbTtib3JkZXItcmFkaXVzOi4yMTQyODU3MXJlbSAuMjE0Mjg1NzFyZW0gMCAwfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLmxhYmVse3RvcDphdXRvO2JvdHRvbTowO2JvcmRlci1yYWRpdXM6MCAwIC4yMTQyODU3MXJlbSAuMjE0Mjg1NzFyZW19LnVpW2NsYXNzKj1cXFwidG9wIGxlZnQgYXR0YWNoZWRcXFwiXS5sYWJlbHt3aWR0aDphdXRvO21hcmdpbi10b3A6MCFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czouMjE0Mjg1NzFyZW0gMCAuMjg1NzE0MjlyZW0gMH0udWlbY2xhc3MqPVxcXCJ0b3AgcmlnaHQgYXR0YWNoZWRcXFwiXS5sYWJlbHt3aWR0aDphdXRvO2xlZnQ6YXV0bztyaWdodDowO2JvcmRlci1yYWRpdXM6MCAuMjE0Mjg1NzFyZW0gMCAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwiYm90dG9tIGxlZnQgYXR0YWNoZWRcXFwiXS5sYWJlbHt3aWR0aDphdXRvO3RvcDphdXRvO2JvdHRvbTowO2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gMCAuMjE0Mjg1NzFyZW19LnVpW2NsYXNzKj1cXFwiYm90dG9tIHJpZ2h0IGF0dGFjaGVkXFxcIl0ubGFiZWx7dG9wOmF1dG87Ym90dG9tOjA7bGVmdDphdXRvO3JpZ2h0OjA7d2lkdGg6YXV0bztib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIC4yMTQyODU3MXJlbSAwfS51aS5sYWJlbC5kaXNhYmxlZHtvcGFjaXR5Oi41fWEudWkubGFiZWw6aG92ZXIsYS51aS5sYWJlbHMgLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtib3JkZXItY29sb3I6I2UwZTBlMDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLmxhYmVscyBhLmxhYmVsOmhvdmVyOmJlZm9yZSxhLnVpLmxhYmVsOmhvdmVyOmJlZm9yZXtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuYWN0aXZlLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2QwZDBkMDtib3JkZXItY29sb3I6I2QwZDBkMDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5hY3RpdmUubGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2QwZDBkMDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfWEudWkuYWN0aXZlLmxhYmVsOmhvdmVyLGEudWkubGFiZWxzIC5hY3RpdmUubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYzhjOGM4O2JvcmRlci1jb2xvcjojYzhjOGM4O2JhY2tncm91bmQtaW1hZ2U6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmxhYmVscyBhLmFjdGl2ZS5sYWJlbDpBY3RpdmVIb3ZlcjpiZWZvcmUsYS51aS5hY3RpdmUubGFiZWw6QWN0aXZlSG92ZXI6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6I2M4YzhjODtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5sYWJlbC52aXNpYmxlOm5vdCguZHJvcGRvd24pLC51aS5sYWJlbHMudmlzaWJsZSAubGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2shaW1wb3J0YW50fS51aS5sYWJlbC5oaWRkZW4sLnVpLmxhYmVscy5oaWRkZW4gLmxhYmVse2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLnJlZC5sYWJlbCwudWkucmVkLmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZGIyODI4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2RiMjgyOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnJlZC5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkucmVkLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2QwMTkxOSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNkMDE5MTkhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5yZWQuY29ybmVyLmxhYmVsLC51aS5yZWQuY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5yZWQucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojYjIxZTFlIWltcG9ydGFudH0udWkuYmFzaWMucmVkLmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojZGIyODI4IWltcG9ydGFudDtib3JkZXItY29sb3I6I2RiMjgyOCFpbXBvcnRhbnR9LnVpLmJhc2ljLnJlZC5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLnJlZC5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiNkMDE5MTkhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZDAxOTE5IWltcG9ydGFudH0udWkub3JhbmdlLmxhYmVsLC51aS5vcmFuZ2UubGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNmMjcxMWMhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZjI3MTFjIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub3JhbmdlLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS5vcmFuZ2UubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjI2MjAyIWltcG9ydGFudDtib3JkZXItY29sb3I6I2YyNjIwMiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9yYW5nZS5jb3JuZXIubGFiZWwsLnVpLm9yYW5nZS5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLm9yYW5nZS5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiNjZjU5MGMhaW1wb3J0YW50fS51aS5iYXNpYy5vcmFuZ2UubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiNmMjcxMWMhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZjI3MTFjIWltcG9ydGFudH0udWkuYmFzaWMub3JhbmdlLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMub3JhbmdlLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2YyNjIwMiFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNmMjYyMDIhaW1wb3J0YW50fS51aS55ZWxsb3cubGFiZWwsLnVpLnllbGxvdy5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNmYmJkMDghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS55ZWxsb3cubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLnllbGxvdy5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlYWFlMDAhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZWFhZTAwIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkueWVsbG93LmNvcm5lci5sYWJlbCwudWkueWVsbG93LmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkueWVsbG93LnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6I2NkOTkwMyFpbXBvcnRhbnR9LnVpLmJhc2ljLnllbGxvdy5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2ZiYmQwOCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNmYmJkMDghaW1wb3J0YW50fS51aS5iYXNpYy55ZWxsb3cubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy55ZWxsb3cubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojZWFhZTAwIWltcG9ydGFudDtib3JkZXItY29sb3I6I2VhYWUwMCFpbXBvcnRhbnR9LnVpLm9saXZlLmxhYmVsLC51aS5vbGl2ZS5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNiNWNjMTghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5vbGl2ZS5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkub2xpdmUubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojYTdiZDBkIWltcG9ydGFudDtib3JkZXItY29sb3I6I2E3YmQwZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLm9saXZlLmNvcm5lci5sYWJlbCwudWkub2xpdmUuY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5vbGl2ZS5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiMxOThmMzUhaW1wb3J0YW50fS51aS5iYXNpYy5vbGl2ZS5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNiNWNjMTghaW1wb3J0YW50fS51aS5iYXNpYy5vbGl2ZS5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLm9saXZlLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2E3YmQwZCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNhN2JkMGQhaW1wb3J0YW50fS51aS5ncmVlbi5sYWJlbCwudWkuZ3JlZW4ubGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMjFiYTQ1IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuZ3JlZW4ubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLmdyZWVuLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzE2YWIzOSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMxNmFiMzkhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ncmVlbi5jb3JuZXIubGFiZWwsLnVpLmdyZWVuLmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuZ3JlZW4ucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojMTk4ZjM1IWltcG9ydGFudH0udWkuYmFzaWMuZ3JlZW4ubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiMyMWJhNDUhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMjFiYTQ1IWltcG9ydGFudH0udWkuYmFzaWMuZ3JlZW4ubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy5ncmVlbi5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiMxNmFiMzkhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMTZhYjM5IWltcG9ydGFudH0udWkudGVhbC5sYWJlbCwudWkudGVhbC5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMwMGI1YWQhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS50ZWFsLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS50ZWFsLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzAwOWM5NSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMwMDljOTUhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS50ZWFsLmNvcm5lci5sYWJlbCwudWkudGVhbC5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLnRlYWwucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojMDA4MjdjIWltcG9ydGFudH0udWkuYmFzaWMudGVhbC5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMwMGI1YWQhaW1wb3J0YW50fS51aS5iYXNpYy50ZWFsLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMudGVhbC5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiMwMDljOTUhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMDA5Yzk1IWltcG9ydGFudH0udWkuYmx1ZS5sYWJlbCwudWkuYmx1ZS5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6IzIxODVkMCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMyMTg1ZDAhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibHVlLmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS5ibHVlLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzE2NzhjMiFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMxNjc4YzIhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibHVlLmNvcm5lci5sYWJlbCwudWkuYmx1ZS5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLmJsdWUucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojMWE2OWE0IWltcG9ydGFudH0udWkuYmFzaWMuYmx1ZS5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzIxODVkMCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMyMTg1ZDAhaW1wb3J0YW50fS51aS5iYXNpYy5ibHVlLmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMuYmx1ZS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiMxNjc4YzIhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMTY3OGMyIWltcG9ydGFudH0udWkudmlvbGV0LmxhYmVsLC51aS52aW9sZXQubGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiM2NDM1YzkhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojNjQzNWM5IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkudmlvbGV0LmxhYmVscyAubGFiZWw6aG92ZXIsYS51aS52aW9sZXQubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojNTgyOWJiIWltcG9ydGFudDtib3JkZXItY29sb3I6IzU4MjliYiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnZpb2xldC5jb3JuZXIubGFiZWwsLnVpLnZpb2xldC5jb3JuZXIubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLnZpb2xldC5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiM1MDJhYTEhaW1wb3J0YW50fS51aS5iYXNpYy52aW9sZXQubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiM2NDM1YzkhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojNjQzNWM5IWltcG9ydGFudH0udWkuYmFzaWMudmlvbGV0LmxhYmVscyBhLmxhYmVsOmhvdmVyLGEudWkuYmFzaWMudmlvbGV0LmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzU4MjliYiFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiM1ODI5YmIhaW1wb3J0YW50fS51aS5wdXJwbGUubGFiZWwsLnVpLnB1cnBsZS5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNhMzMzYzghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5wdXJwbGUubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLnB1cnBsZS5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM5NjI3YmEhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojOTYyN2JhIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucHVycGxlLmNvcm5lci5sYWJlbCwudWkucHVycGxlLmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkucHVycGxlLnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6IzgyMjk5ZiFpbXBvcnRhbnR9LnVpLmJhc2ljLnB1cnBsZS5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2EzMzNjOCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNhMzMzYzghaW1wb3J0YW50fS51aS5iYXNpYy5wdXJwbGUubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy5wdXJwbGUubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojOTYyN2JhIWltcG9ydGFudDtib3JkZXItY29sb3I6Izk2MjdiYSFpbXBvcnRhbnR9LnVpLnBpbmsubGFiZWwsLnVpLnBpbmsubGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZTAzOTk3IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucGluay5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkucGluay5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlNjFhOGQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZTYxYThkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucGluay5jb3JuZXIubGFiZWwsLnVpLnBpbmsuY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5waW5rLnJpYmJvbi5sYWJlbHtib3JkZXItY29sb3I6I2M3MWY3ZSFpbXBvcnRhbnR9LnVpLmJhc2ljLnBpbmsubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiNlMDM5OTchaW1wb3J0YW50O2JvcmRlci1jb2xvcjojZTAzOTk3IWltcG9ydGFudH0udWkuYmFzaWMucGluay5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLnBpbmsubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmIWltcG9ydGFudDtjb2xvcjojZTYxYThkIWltcG9ydGFudDtib3JkZXItY29sb3I6I2U2MWE4ZCFpbXBvcnRhbnR9LnVpLmJyb3duLmxhYmVsLC51aS5icm93bi5sYWJlbHMgLmxhYmVse2JhY2tncm91bmQtY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNhNTY3M2YhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5icm93bi5sYWJlbHMgLmxhYmVsOmhvdmVyLGEudWkuYnJvd24ubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojOTc1YjMzIWltcG9ydGFudDtib3JkZXItY29sb3I6Izk3NWIzMyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJyb3duLmNvcm5lci5sYWJlbCwudWkuYnJvd24uY29ybmVyLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQhaW1wb3J0YW50fS51aS5icm93bi5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiM4MDUwMzEhaW1wb3J0YW50fS51aS5iYXNpYy5icm93bi5sYWJlbHtiYWNrZ3JvdW5kOm5vbmUgI2ZmZiFpbXBvcnRhbnQ7Y29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNhNTY3M2YhaW1wb3J0YW50fS51aS5iYXNpYy5icm93bi5sYWJlbHMgYS5sYWJlbDpob3ZlcixhLnVpLmJhc2ljLmJyb3duLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6Izk3NWIzMyFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiM5NzViMzMhaW1wb3J0YW50fS51aS5ncmV5LmxhYmVsLC51aS5ncmV5LmxhYmVscyAubGFiZWx7YmFja2dyb3VuZC1jb2xvcjojNzY3Njc2IWltcG9ydGFudDtib3JkZXItY29sb3I6Izc2NzY3NiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZXkubGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLmdyZXkubGFiZWw6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojODM4MzgzIWltcG9ydGFudDtib3JkZXItY29sb3I6IzgzODM4MyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZXkuY29ybmVyLmxhYmVsLC51aS5ncmV5LmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuZ3JleS5yaWJib24ubGFiZWx7Ym9yZGVyLWNvbG9yOiM4MDUwMzEhaW1wb3J0YW50fS51aS5iYXNpYy5ncmV5LmxhYmVse2JhY2tncm91bmQ6bm9uZSAjZmZmIWltcG9ydGFudDtjb2xvcjojNzY3Njc2IWltcG9ydGFudDtib3JkZXItY29sb3I6Izc2NzY3NiFpbXBvcnRhbnR9LnVpLmJhc2ljLmdyZXkubGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy5ncmV5LmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZmZiFpbXBvcnRhbnQ7Y29sb3I6IzgzODM4MyFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiM4MzgzODMhaW1wb3J0YW50fS51aS5ibGFjay5sYWJlbCwudWkuYmxhY2subGFiZWxzIC5sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMWIxYzFkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuYmxhY2subGFiZWxzIC5sYWJlbDpob3ZlcixhLnVpLmJsYWNrLmxhYmVsOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzI3MjkyYSFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiMyNzI5MmEhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibGFjay5jb3JuZXIubGFiZWwsLnVpLmJsYWNrLmNvcm5lci5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudH0udWkuYmxhY2sucmliYm9uLmxhYmVse2JvcmRlci1jb2xvcjojODA1MDMxIWltcG9ydGFudH0udWkuYmFzaWMuYmxhY2subGFiZWx7YmFja2dyb3VuZDpub25lICNmZmYhaW1wb3J0YW50O2NvbG9yOiMxYjFjMWQhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMWIxYzFkIWltcG9ydGFudH0udWkuYmFzaWMuYmxhY2subGFiZWxzIGEubGFiZWw6aG92ZXIsYS51aS5iYXNpYy5ibGFjay5sYWJlbDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYhaW1wb3J0YW50O2NvbG9yOiMyNzI5MmEhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojMjcyOTJhIWltcG9ydGFudH0udWkuYmFzaWMubGFiZWx7YmFja2dyb3VuZDpub25lICNmZmY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Y29sb3I6cmdiYSgwLDAsMCwuODcpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX1hLnVpLmJhc2ljLmxhYmVsOmhvdmVye3RleHQtZGVjb3JhdGlvbjpub25lO2JhY2tncm91bmQ6bm9uZSAjZmZmO2NvbG9yOiMxZTcwYmY7LXdlYmtpdC1ib3gtc2hhZG93OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuYmFzaWMucG9pbnRpbmcubGFiZWw6YmVmb3Jle2JvcmRlci1jb2xvcjppbmhlcml0fS51aS5mbHVpZC5sYWJlbHM+LmxhYmVsLC51aS5sYWJlbC5mbHVpZHt3aWR0aDoxMDAlOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveH0udWkuaW52ZXJ0ZWQubGFiZWwsLnVpLmludmVydGVkLmxhYmVscyAubGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSkhaW1wb3J0YW50fS51aS5ob3Jpem9udGFsLmxhYmVsLC51aS5ob3Jpem9udGFsLmxhYmVscyAubGFiZWx7bWFyZ2luOjAgLjVlbSAwIDA7cGFkZGluZzouNGVtIC44MzNlbTttaW4td2lkdGg6M2VtO3RleHQtYWxpZ246Y2VudGVyfS51aS5jaXJjdWxhci5sYWJlbCwudWkuY2lyY3VsYXIubGFiZWxzIC5sYWJlbHttaW4td2lkdGg6MmVtO21pbi1oZWlnaHQ6MmVtO3BhZGRpbmc6LjVlbSFpbXBvcnRhbnQ7bGluZS1oZWlnaHQ6MWVtO3RleHQtYWxpZ246Y2VudGVyO2JvcmRlci1yYWRpdXM6NTAwcmVtfS51aS5lbXB0eS5jaXJjdWxhci5sYWJlbCwudWkuZW1wdHkuY2lyY3VsYXIubGFiZWxzIC5sYWJlbHttaW4td2lkdGg6MDttaW4taGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOi41ZW07aGVpZ2h0Oi41ZW07dmVydGljYWwtYWxpZ246YmFzZWxpbmV9LnVpLnBvaW50aW5nLmxhYmVse3Bvc2l0aW9uOnJlbGF0aXZlfS51aS5hdHRhY2hlZC5wb2ludGluZy5sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZX0udWkucG9pbnRpbmcubGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWltYWdlOmluaGVyaXQ7Ym9yZGVyLXdpZHRoOm5vbmU7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjppbmhlcml0fS51aS5wb2ludGluZy5sYWJlbDpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO2JhY2tncm91bmQtaW1hZ2U6bm9uZTt6LWluZGV4OjI7d2lkdGg6LjY2NjZlbTtoZWlnaHQ6LjY2NjZlbTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2V9LnVpLnBvaW50aW5nLmxhYmVsLC51aVtjbGFzcyo9XFxcInBvaW50aW5nIGFib3ZlXFxcIl0ubGFiZWx7bWFyZ2luLXRvcDoxZW19LnVpLnBvaW50aW5nLmxhYmVsOmJlZm9yZSwudWlbY2xhc3MqPVxcXCJwb2ludGluZyBhYm92ZVxcXCJdLmxhYmVsOmJlZm9yZXtib3JkZXItd2lkdGg6MXB4IDAgMCAxcHg7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO3RvcDowO2xlZnQ6NTAlfS51aVtjbGFzcyo9XFxcImJvdHRvbSBwb2ludGluZ1xcXCJdLmxhYmVsLC51aVtjbGFzcyo9XFxcInBvaW50aW5nIGJlbG93XFxcIl0ubGFiZWx7bWFyZ2luLXRvcDowO21hcmdpbi1ib3R0b206MWVtfS51aVtjbGFzcyo9XFxcImJvdHRvbSBwb2ludGluZ1xcXCJdLmxhYmVsOmJlZm9yZSwudWlbY2xhc3MqPVxcXCJwb2ludGluZyBiZWxvd1xcXCJdLmxhYmVsOmJlZm9yZXtib3JkZXItd2lkdGg6MCAxcHggMXB4IDA7dG9wOmF1dG87cmlnaHQ6YXV0bzstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7dG9wOjEwMCU7bGVmdDo1MCV9LnVpW2NsYXNzKj1cXFwibGVmdCBwb2ludGluZ1xcXCJdLmxhYmVse21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDouNjY2NmVtfS51aVtjbGFzcyo9XFxcImxlZnQgcG9pbnRpbmdcXFwiXS5sYWJlbDpiZWZvcmV7Ym9yZGVyLXdpZHRoOjAgMCAxcHggMXB4Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTtib3R0b206YXV0bztyaWdodDphdXRvO3RvcDo1MCU7bGVmdDowfS51aVtjbGFzcyo9XFxcInJpZ2h0IHBvaW50aW5nXFxcIl0ubGFiZWx7bWFyZ2luLXRvcDowO21hcmdpbi1yaWdodDouNjY2NmVtfS51aVtjbGFzcyo9XFxcInJpZ2h0IHBvaW50aW5nXFxcIl0ubGFiZWw6YmVmb3Jle2JvcmRlci13aWR0aDoxcHggMXB4IDAgMDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDUwJSkgdHJhbnNsYXRlWSgtNTAlKSByb3RhdGUoNDVkZWcpO3RvcDo1MCU7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG99LnVpLmJhc2ljLnBvaW50aW5nLmxhYmVsOmJlZm9yZSwudWkuYmFzaWNbY2xhc3MqPVxcXCJwb2ludGluZyBhYm92ZVxcXCJdLmxhYmVsOmJlZm9yZXttYXJnaW4tdG9wOi0xcHh9LnVpLmJhc2ljW2NsYXNzKj1cXFwiYm90dG9tIHBvaW50aW5nXFxcIl0ubGFiZWw6YmVmb3JlLC51aS5iYXNpY1tjbGFzcyo9XFxcInBvaW50aW5nIGJlbG93XFxcIl0ubGFiZWw6YmVmb3Jle2JvdHRvbTphdXRvO3RvcDoxMDAlO21hcmdpbi10b3A6MXB4fS51aS5iYXNpY1tjbGFzcyo9XFxcImxlZnQgcG9pbnRpbmdcXFwiXS5sYWJlbDpiZWZvcmV7dG9wOjUwJTtsZWZ0Oi0xcHh9LnVpLmJhc2ljW2NsYXNzKj1cXFwicmlnaHQgcG9pbnRpbmdcXFwiXS5sYWJlbDpiZWZvcmV7dG9wOjUwJTtyaWdodDotMXB4fS51aS5mbG9hdGluZy5sYWJlbHtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDt0b3A6LTFlbTtsZWZ0OjEwMCU7bWFyZ2luOjAgMCAwIC0xLjVlbSFpbXBvcnRhbnR9LnVpLm1pbmkubGFiZWwsLnVpLm1pbmkubGFiZWxzIC5sYWJlbHtmb250LXNpemU6LjY0Mjg1NzE0cmVtfS51aS50aW55LmxhYmVsLC51aS50aW55LmxhYmVscyAubGFiZWx7Zm9udC1zaXplOi43MTQyODU3MXJlbX0udWkuc21hbGwubGFiZWwsLnVpLnNtYWxsLmxhYmVscyAubGFiZWx7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkubGFiZWwsLnVpLmxhYmVscyAubGFiZWx7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkubGFyZ2UubGFiZWwsLnVpLmxhcmdlLmxhYmVscyAubGFiZWx7Zm9udC1zaXplOjFyZW19LnVpLmJpZy5sYWJlbCwudWkuYmlnLmxhYmVscyAubGFiZWx7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmh1Z2UubGFiZWwsLnVpLmh1Z2UubGFiZWxzIC5sYWJlbHtmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5sYWJlbCwudWkubWFzc2l2ZS5sYWJlbHMgLmxhYmVse2ZvbnQtc2l6ZToxLjcxNDI4NTcxcmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBMaXN0XFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubGlzdCxvbC51aS5saXN0LHVsLnVpLmxpc3R7bGlzdC1zdHlsZS10eXBlOm5vbmU7bWFyZ2luOjFlbSAwO3BhZGRpbmc6MCAwfS51aS5saXN0OmZpcnN0LWNoaWxkLG9sLnVpLmxpc3Q6Zmlyc3QtY2hpbGQsdWwudWkubGlzdDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjA7cGFkZGluZy10b3A6MH0udWkubGlzdDpsYXN0LWNoaWxkLG9sLnVpLmxpc3Q6bGFzdC1jaGlsZCx1bC51aS5saXN0Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowO3BhZGRpbmctYm90dG9tOjB9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmxpc3Q+Lml0ZW0sb2wudWkubGlzdCBsaSx1bC51aS5saXN0IGxpe2Rpc3BsYXk6bGlzdC1pdGVtO3RhYmxlLWxheW91dDpmaXhlZDtsaXN0LXN0eWxlLXR5cGU6bm9uZTtsaXN0LXN0eWxlLXBvc2l0aW9uOm91dHNpZGU7cGFkZGluZzouMjE0Mjg1NzFlbSAwO2xpbmUtaGVpZ2h0OjEuMTQyODU3MTRlbX0udWkubGlzdD4uaXRlbTphZnRlciwudWkubGlzdD4ubGlzdD4uaXRlbSxvbC51aS5saXN0PmxpOmZpcnN0LWNoaWxkOmFmdGVyLHVsLnVpLmxpc3Q+bGk6Zmlyc3QtY2hpbGQ6YWZ0ZXJ7Y29udGVudDonJztkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59LnVpLmxpc3QgLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGQsLnVpLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGQsb2wudWkubGlzdCBsaTpmaXJzdC1jaGlsZCx1bC51aS5saXN0IGxpOmZpcnN0LWNoaWxke3BhZGRpbmctdG9wOjB9LnVpLmxpc3QgLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZCwudWkubGlzdD4uaXRlbTpsYXN0LWNoaWxkLG9sLnVpLmxpc3QgbGk6bGFzdC1jaGlsZCx1bC51aS5saXN0IGxpOmxhc3QtY2hpbGR7cGFkZGluZy1ib3R0b206MH0udWkubGlzdCAubGlzdCxvbC51aS5saXN0IG9sLHVsLnVpLmxpc3QgdWx7Y2xlYXI6Ym90aDttYXJnaW46MDtwYWRkaW5nOi43NWVtIDAgLjI1ZW0gLjVlbX0udWkubGlzdCAubGlzdD4uaXRlbSxvbC51aS5saXN0IG9sIGxpLHVsLnVpLmxpc3QgdWwgbGl7cGFkZGluZzouMTQyODU3MTRlbSAwO2xpbmUtaGVpZ2h0OmluaGVyaXR9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+aS5pY29uLC51aS5saXN0Pi5pdGVtPmkuaWNvbntkaXNwbGF5OnRhYmxlLWNlbGw7bWFyZ2luOjA7cGFkZGluZy10b3A6MDtwYWRkaW5nLXJpZ2h0Oi4yODU3MTQyOWVtO3ZlcnRpY2FsLWFsaWduOnRvcDstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkubGlzdCAubGlzdD4uaXRlbT5pLmljb246b25seS1jaGlsZCwudWkubGlzdD4uaXRlbT5pLmljb246b25seS1jaGlsZHtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+LmltYWdlLC51aS5saXN0Pi5pdGVtPi5pbWFnZXtkaXNwbGF5OnRhYmxlLWNlbGw7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+LmltYWdlOm5vdCg6b25seS1jaGlsZCk6bm90KGltZyksLnVpLmxpc3Q+Lml0ZW0+LmltYWdlOm5vdCg6b25seS1jaGlsZCk6bm90KGltZyl7cGFkZGluZy1yaWdodDouNWVtfS51aS5saXN0IC5saXN0Pi5pdGVtPi5pbWFnZSBpbWcsLnVpLmxpc3Q+Lml0ZW0+LmltYWdlIGltZ3t2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+LmltYWdlOm9ubHktY2hpbGQsLnVpLmxpc3QgLmxpc3Q+Lml0ZW0+aW1nLmltYWdlLC51aS5saXN0Pi5pdGVtPi5pbWFnZTpvbmx5LWNoaWxkLC51aS5saXN0Pi5pdGVtPmltZy5pbWFnZXtkaXNwbGF5OmlubGluZS1ibG9ja30udWkubGlzdCAubGlzdD4uaXRlbT4uY29udGVudCwudWkubGlzdD4uaXRlbT4uY29udGVudHtsaW5lLWhlaWdodDoxLjE0Mjg1NzE0ZW19LnVpLmxpc3QgLmxpc3Q+Lml0ZW0+Lmljb24rLmNvbnRlbnQsLnVpLmxpc3QgLmxpc3Q+Lml0ZW0+LmltYWdlKy5jb250ZW50LC51aS5saXN0Pi5pdGVtPi5pY29uKy5jb250ZW50LC51aS5saXN0Pi5pdGVtPi5pbWFnZSsuY29udGVudHtkaXNwbGF5OnRhYmxlLWNlbGw7d2lkdGg6MTAwJTtwYWRkaW5nOjAgMCAwIC41ZW07dmVydGljYWwtYWxpZ246dG9wfS51aS5saXN0IC5saXN0Pi5pdGVtPmltZy5pbWFnZSsuY29udGVudCwudWkubGlzdD4uaXRlbT5pbWcuaW1hZ2UrLmNvbnRlbnR7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0b30udWkubGlzdCAubGlzdD4uaXRlbT4uY29udGVudD4ubGlzdCwudWkubGlzdD4uaXRlbT4uY29udGVudD4ubGlzdHttYXJnaW4tbGVmdDowO3BhZGRpbmctbGVmdDowfS51aS5saXN0IC5saXN0Pi5pdGVtIC5oZWFkZXIsLnVpLmxpc3Q+Lml0ZW0gLmhlYWRlcntkaXNwbGF5OmJsb2NrO21hcmdpbjowO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5saXN0IC5saXN0Pi5pdGVtIC5kZXNjcmlwdGlvbiwudWkubGlzdD4uaXRlbSAuZGVzY3JpcHRpb257ZGlzcGxheTpibG9jaztjb2xvcjpyZ2JhKDAsMCwwLC43KX0udWkubGlzdCAubGlzdD4uaXRlbSBhLC51aS5saXN0Pi5pdGVtIGF7Y3Vyc29yOnBvaW50ZXJ9LnVpLmxpc3QgLmxpc3Q+YS5pdGVtLC51aS5saXN0PmEuaXRlbXtjdXJzb3I6cG9pbnRlcjtjb2xvcjojNDE4M2M0fS51aS5saXN0IC5saXN0PmEuaXRlbTpob3ZlciwudWkubGlzdD5hLml0ZW06aG92ZXJ7Y29sb3I6IzFlNzBiZn0udWkubGlzdCAubGlzdD5hLml0ZW0gaS5pY29uLC51aS5saXN0PmEuaXRlbSBpLmljb257Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0gYS5oZWFkZXIsLnVpLmxpc3Q+Lml0ZW0gYS5oZWFkZXJ7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6IzQxODNjNCFpbXBvcnRhbnR9LnVpLmxpc3QgLmxpc3Q+Lml0ZW0gYS5oZWFkZXI6aG92ZXIsLnVpLmxpc3Q+Lml0ZW0gYS5oZWFkZXI6aG92ZXJ7Y29sb3I6IzFlNzBiZiFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwibGVmdCBmbG9hdGVkXFxcIl0ubGlzdHtmbG9hdDpsZWZ0fS51aVtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXS5saXN0e2Zsb2F0OnJpZ2h0fS51aS5saXN0IC5saXN0Pi5pdGVtIFtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJdLC51aS5saXN0Pi5pdGVtIFtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJde2Zsb2F0OmxlZnQ7bWFyZ2luOjAgMWVtIDAgMH0udWkubGlzdCAubGlzdD4uaXRlbSBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0sLnVpLmxpc3Q+Lml0ZW0gW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJde2Zsb2F0OnJpZ2h0O21hcmdpbjowIDAgMCAxZW19LnVpLm1lbnUgLnVpLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLm1lbnUgLnVpLmxpc3Q+Lml0ZW17ZGlzcGxheTpsaXN0LWl0ZW07dGFibGUtbGF5b3V0OmZpeGVkO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7bGlzdC1zdHlsZS10eXBlOm5vbmU7bGlzdC1zdHlsZS1wb3NpdGlvbjpvdXRzaWRlO3BhZGRpbmc6LjIxNDI4NTcxZW0gMDtsaW5lLWhlaWdodDoxLjE0Mjg1NzE0ZW19LnVpLm1lbnUgLnVpLmxpc3QgLmxpc3Q+Lml0ZW06YmVmb3JlLC51aS5tZW51IC51aS5saXN0Pi5pdGVtOmJlZm9yZXtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOjAgMH0udWkubWVudSAudWkubGlzdCAubGlzdD4uaXRlbTpmaXJzdC1jaGlsZCwudWkubWVudSAudWkubGlzdD4uaXRlbTpmaXJzdC1jaGlsZHtwYWRkaW5nLXRvcDowfS51aS5tZW51IC51aS5saXN0IC5saXN0Pi5pdGVtOmxhc3QtY2hpbGQsLnVpLm1lbnUgLnVpLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZHtwYWRkaW5nLWJvdHRvbTowfS51aS5ob3Jpem9udGFsLmxpc3R7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjB9LnVpLmhvcml6b250YWwubGlzdD4uaXRlbXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tbGVmdDoxZW07Zm9udC1zaXplOjFyZW19LnVpLmhvcml6b250YWwubGlzdDpub3QoLmNlbGxlZCk+Lml0ZW06Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnQ7cGFkZGluZy1sZWZ0OjAhaW1wb3J0YW50fS51aS5ob3Jpem9udGFsLmxpc3QgLmxpc3R7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1ib3R0b206MH0udWkuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtPi5jb250ZW50LC51aS5ob3Jpem9udGFsLmxpc3QgLmxpc3Q+Lml0ZW0+Lmljb24sLnVpLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbT4uaW1hZ2UsLnVpLmhvcml6b250YWwubGlzdD4uaXRlbT4uY29udGVudCwudWkuaG9yaXpvbnRhbC5saXN0Pi5pdGVtPi5pY29uLC51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW0+LmltYWdle3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuaG9yaXpvbnRhbC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxkLC51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZHtwYWRkaW5nLXRvcDouMjE0Mjg1NzFlbTtwYWRkaW5nLWJvdHRvbTouMjE0Mjg1NzFlbX0udWkuaG9yaXpvbnRhbC5saXN0Pi5pdGVtPmkuaWNvbnttYXJnaW46MDtwYWRkaW5nOjAgLjI1ZW0gMCAwfS51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW0+Lmljb24sLnVpLmhvcml6b250YWwubGlzdD4uaXRlbT4uaWNvbisuY29udGVudHtmbG9hdDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5saXN0IC5saXN0Pi5kaXNhYmxlZC5pdGVtLC51aS5saXN0Pi5kaXNhYmxlZC5pdGVte3BvaW50ZXItZXZlbnRzOm5vbmU7Y29sb3I6cmdiYSg0MCw0MCw0MCwuMykhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5saXN0IC5saXN0Pi5kaXNhYmxlZC5pdGVtLC51aS5pbnZlcnRlZC5saXN0Pi5kaXNhYmxlZC5pdGVte2NvbG9yOnJnYmEoMjI1LDIyNSwyMjUsLjMpIWltcG9ydGFudH0udWkubGlzdCAubGlzdD5hLml0ZW06aG92ZXIgLmljb24sLnVpLmxpc3Q+YS5pdGVtOmhvdmVyIC5pY29ue2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW52ZXJ0ZWQubGlzdCAubGlzdD5hLml0ZW0+Lmljb24sLnVpLmludmVydGVkLmxpc3Q+YS5pdGVtPi5pY29ue2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS51aS5pbnZlcnRlZC5saXN0IC5saXN0Pi5pdGVtIC5oZWFkZXIsLnVpLmludmVydGVkLmxpc3Q+Lml0ZW0gLmhlYWRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkuaW52ZXJ0ZWQubGlzdCAubGlzdD4uaXRlbSAuZGVzY3JpcHRpb24sLnVpLmludmVydGVkLmxpc3Q+Lml0ZW0gLmRlc2NyaXB0aW9ue2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfS51aS5pbnZlcnRlZC5saXN0IC5saXN0PmEuaXRlbSwudWkuaW52ZXJ0ZWQubGlzdD5hLml0ZW17Y3Vyc29yOnBvaW50ZXI7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmludmVydGVkLmxpc3QgLmxpc3Q+YS5pdGVtOmhvdmVyLC51aS5pbnZlcnRlZC5saXN0PmEuaXRlbTpob3Zlcntjb2xvcjojMWU3MGJmfS51aS5pbnZlcnRlZC5saXN0IC5pdGVtIGE6bm90KC51aSl7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5saXN0IC5pdGVtIGE6bm90KC51aSk6aG92ZXJ7Y29sb3I6IzFlNzBiZiFpbXBvcnRhbnR9LnVpLmxpc3QgW2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXSwudWkubGlzdFtjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0gLmNvbnRlbnQsLnVpLmxpc3RbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdIC5pbWFnZXt2ZXJ0aWNhbC1hbGlnbjp0b3AhaW1wb3J0YW50fS51aS5saXN0IFtjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0sLnVpLmxpc3RbY2xhc3MqPVxcXCJtaWRkbGUgYWxpZ25lZFxcXCJdIC5jb250ZW50LC51aS5saXN0W2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXSAuaW1hZ2V7dmVydGljYWwtYWxpZ246bWlkZGxlIWltcG9ydGFudH0udWkubGlzdCBbY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdLC51aS5saXN0W2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXSAuY29udGVudCwudWkubGlzdFtjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0gLmltYWdle3ZlcnRpY2FsLWFsaWduOmJvdHRvbSFpbXBvcnRhbnR9LnVpLmxpbmsubGlzdCAuaXRlbSwudWkubGluay5saXN0IC5pdGVtIGE6bm90KC51aSksLnVpLmxpbmsubGlzdCBhLml0ZW17Y29sb3I6cmdiYSgwLDAsMCwuNCk7LXdlYmtpdC10cmFuc2l0aW9uOi4xcyBjb2xvciBlYXNlO3RyYW5zaXRpb246LjFzIGNvbG9yIGVhc2V9LnVpLmxpbmsubGlzdC5saXN0IC5pdGVtIGE6bm90KC51aSk6aG92ZXIsLnVpLmxpbmsubGlzdC5saXN0IGEuaXRlbTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkubGluay5saXN0Lmxpc3QgLml0ZW0gYTpub3QoLnVpKTphY3RpdmUsLnVpLmxpbmsubGlzdC5saXN0IGEuaXRlbTphY3RpdmV7Y29sb3I6cmdiYSgwLDAsMCwuOSl9LnVpLmxpbmsubGlzdC5saXN0IC5hY3RpdmUuaXRlbSwudWkubGluay5saXN0Lmxpc3QgLmFjdGl2ZS5pdGVtIGE6bm90KC51aSl7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5pbnZlcnRlZC5saW5rLmxpc3QgLml0ZW0sLnVpLmludmVydGVkLmxpbmsubGlzdCAuaXRlbSBhOm5vdCgudWkpLC51aS5pbnZlcnRlZC5saW5rLmxpc3QgYS5pdGVte2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfS51aS5pbnZlcnRlZC5saW5rLmxpc3QubGlzdCAuaXRlbSBhOm5vdCgudWkpOmhvdmVyLC51aS5pbnZlcnRlZC5saW5rLmxpc3QubGlzdCBhLml0ZW06aG92ZXJ7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQubGluay5saXN0Lmxpc3QgLml0ZW0gYTpub3QoLnVpKTphY3RpdmUsLnVpLmludmVydGVkLmxpbmsubGlzdC5saXN0IGEuaXRlbTphY3RpdmV7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQubGluay5saXN0Lmxpc3QgLmFjdGl2ZS5pdGVtIGE6bm90KC51aSksLnVpLmludmVydGVkLmxpbmsubGlzdC5saXN0IGEuYWN0aXZlLml0ZW17Y29sb3I6I2ZmZn0udWkuc2VsZWN0aW9uLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLnNlbGVjdGlvbi5saXN0Pi5pdGVte2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6MCAwO3BhZGRpbmc6LjVlbSAuNWVtO21hcmdpbjowO2NvbG9yOnJnYmEoMCwwLDAsLjQpO2JvcmRlci1yYWRpdXM6LjVlbTstd2Via2l0LXRyYW5zaXRpb246LjFzIGNvbG9yIGVhc2UsLjFzIHBhZGRpbmctbGVmdCBlYXNlLC4xcyBiYWNrZ3JvdW5kLWNvbG9yIGVhc2U7dHJhbnNpdGlvbjouMXMgY29sb3IgZWFzZSwuMXMgcGFkZGluZy1sZWZ0IGVhc2UsLjFzIGJhY2tncm91bmQtY29sb3IgZWFzZX0udWkuc2VsZWN0aW9uLmxpc3QgLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZCwudWkuc2VsZWN0aW9uLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnNlbGVjdGlvbi5saXN0Lmxpc3Q+Lml0ZW06aG92ZXIsLnVpLnNlbGVjdGlvbi5saXN0Pi5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDMpO2NvbG9yOnJnYmEoMCwwLDAsLjgpfS51aS5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbTphY3RpdmUsLnVpLnNlbGVjdGlvbi5saXN0Pi5pdGVtOmFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45KX0udWkuc2VsZWN0aW9uLmxpc3QgLmxpc3Q+Lml0ZW0uYWN0aXZlLC51aS5zZWxlY3Rpb24ubGlzdD4uaXRlbS5hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5pbnZlcnRlZC5zZWxlY3Rpb24ubGlzdD4uaXRlbXtiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX0udWkuaW52ZXJ0ZWQuc2VsZWN0aW9uLmxpc3Q+Lml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wMik7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQuc2VsZWN0aW9uLmxpc3Q+Lml0ZW06YWN0aXZle2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpO2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVtLmFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KTtjb2xvcjojZmZmfS51aS5jZWxsZWQuc2VsZWN0aW9uLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5zZWxlY3Rpb24ubGlzdD4uaXRlbSwudWkuZGl2aWRlZC5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbSwudWkuZGl2aWRlZC5zZWxlY3Rpb24ubGlzdD4uaXRlbXtib3JkZXItcmFkaXVzOjB9LnVpLmFuaW1hdGVkLmxpc3Q+Lml0ZW17LXdlYmtpdC10cmFuc2l0aW9uOi4yNXMgY29sb3IgZWFzZSAuMXMsLjI1cyBwYWRkaW5nLWxlZnQgZWFzZSAuMXMsLjI1cyBiYWNrZ3JvdW5kLWNvbG9yIGVhc2UgLjFzO3RyYW5zaXRpb246LjI1cyBjb2xvciBlYXNlIC4xcywuMjVzIHBhZGRpbmctbGVmdCBlYXNlIC4xcywuMjVzIGJhY2tncm91bmQtY29sb3IgZWFzZSAuMXN9LnVpLmFuaW1hdGVkLmxpc3Q6bm90KC5ob3Jpem9udGFsKT4uaXRlbTpob3ZlcntwYWRkaW5nLWxlZnQ6MWVtfS51aS5maXR0ZWQubGlzdDpub3QoLnNlbGVjdGlvbikgLmxpc3Q+Lml0ZW0sLnVpLmZpdHRlZC5saXN0Om5vdCguc2VsZWN0aW9uKT4uaXRlbXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LnVpLmZpdHRlZC5zZWxlY3Rpb24ubGlzdCAubGlzdD4uaXRlbSwudWkuZml0dGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVte21hcmdpbi1sZWZ0Oi0uNWVtO21hcmdpbi1yaWdodDotLjVlbX0udWkuYnVsbGV0ZWQubGlzdCx1bC51aS5saXN0e21hcmdpbi1sZWZ0OjEuMjVyZW19LnVpLmJ1bGxldGVkLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmJ1bGxldGVkLmxpc3Q+Lml0ZW0sdWwudWkubGlzdCBsaXtwb3NpdGlvbjpyZWxhdGl2ZX0udWkuYnVsbGV0ZWQubGlzdCAubGlzdD4uaXRlbTpiZWZvcmUsLnVpLmJ1bGxldGVkLmxpc3Q+Lml0ZW06YmVmb3JlLHVsLnVpLmxpc3QgbGk6YmVmb3Jley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmFic29sdXRlO3RvcDphdXRvO2xlZnQ6YXV0bztmb250LXdlaWdodDo0MDA7bWFyZ2luLWxlZnQ6LTEuMjVyZW07Y29udGVudDon4oCiJztvcGFjaXR5OjE7Y29sb3I6aW5oZXJpdDt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmJ1bGxldGVkLmxpc3QgLmxpc3Q+YS5pdGVtOmJlZm9yZSwudWkuYnVsbGV0ZWQubGlzdD5hLml0ZW06YmVmb3JlLHVsLnVpLmxpc3QgbGk6YmVmb3Jle2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuYnVsbGV0ZWQubGlzdCAubGlzdCx1bC51aS5saXN0IHVse3BhZGRpbmctbGVmdDoxLjI1cmVtfS51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3QsdWwudWkuaG9yaXpvbnRhbC5idWxsZXRlZC5saXN0e21hcmdpbi1sZWZ0OjB9LnVpLmhvcml6b250YWwuYnVsbGV0ZWQubGlzdD4uaXRlbSx1bC51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3QgbGl7bWFyZ2luLWxlZnQ6MS43NXJlbX0udWkuaG9yaXpvbnRhbC5idWxsZXRlZC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxkLHVsLnVpLmhvcml6b250YWwuYnVsbGV0ZWQubGlzdCBsaTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowfS51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3Q+Lml0ZW06OmJlZm9yZSx1bC51aS5ob3Jpem9udGFsLmJ1bGxldGVkLmxpc3QgbGk6OmJlZm9yZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmhvcml6b250YWwuYnVsbGV0ZWQubGlzdD4uaXRlbTpmaXJzdC1jaGlsZDo6YmVmb3JlLHVsLnVpLmhvcml6b250YWwuYnVsbGV0ZWQubGlzdCBsaTpmaXJzdC1jaGlsZDo6YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkub3JkZXJlZC5saXN0LC51aS5vcmRlcmVkLmxpc3QgLmxpc3Qsb2wudWkubGlzdCxvbC51aS5saXN0IG9se2NvdW50ZXItcmVzZXQ6b3JkZXJlZDttYXJnaW4tbGVmdDoxLjI1cmVtO2xpc3Qtc3R5bGUtdHlwZTpub25lfS51aS5vcmRlcmVkLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLm9yZGVyZWQubGlzdD4uaXRlbSxvbC51aS5saXN0IGxpe2xpc3Qtc3R5bGUtdHlwZTpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS51aS5vcmRlcmVkLmxpc3QgLmxpc3Q+Lml0ZW06YmVmb3JlLC51aS5vcmRlcmVkLmxpc3Q+Lml0ZW06YmVmb3JlLG9sLnVpLmxpc3QgbGk6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO3RvcDphdXRvO2xlZnQ6YXV0bzstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9pbnRlci1ldmVudHM6bm9uZTttYXJnaW4tbGVmdDotMS4yNXJlbTtjb3VudGVyLWluY3JlbWVudDpvcmRlcmVkO2NvbnRlbnQ6Y291bnRlcnMob3JkZXJlZCwgXFxcIi5cXFwiKSBcXFwiIFxcXCI7dGV4dC1hbGlnbjpyaWdodDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7dmVydGljYWwtYWxpZ246bWlkZGxlO29wYWNpdHk6Ljh9LnVpLm9yZGVyZWQuaW52ZXJ0ZWQubGlzdCAubGlzdD4uaXRlbTpiZWZvcmUsLnVpLm9yZGVyZWQuaW52ZXJ0ZWQubGlzdD4uaXRlbTpiZWZvcmUsb2wudWkuaW52ZXJ0ZWQubGlzdCBsaTpiZWZvcmV7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9LnVpLm9yZGVyZWQubGlzdD4uaXRlbVtkYXRhLXZhbHVlXSwudWkub3JkZXJlZC5saXN0Pi5saXN0Pi5pdGVtW2RhdGEtdmFsdWVde2NvbnRlbnQ6YXR0cihkYXRhLXZhbHVlKX1vbC51aS5saXN0IGxpW3ZhbHVlXTpiZWZvcmV7Y29udGVudDphdHRyKHZhbHVlKX0udWkub3JkZXJlZC5saXN0IC5saXN0LG9sLnVpLmxpc3Qgb2x7bWFyZ2luLWxlZnQ6MWVtfS51aS5vcmRlcmVkLmxpc3QgLmxpc3Q+Lml0ZW06YmVmb3JlLG9sLnVpLmxpc3Qgb2wgbGk6YmVmb3Jle21hcmdpbi1sZWZ0Oi0yZW19LnVpLm9yZGVyZWQuaG9yaXpvbnRhbC5saXN0LG9sLnVpLmhvcml6b250YWwubGlzdHttYXJnaW4tbGVmdDowfS51aS5vcmRlcmVkLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbTpiZWZvcmUsLnVpLm9yZGVyZWQuaG9yaXpvbnRhbC5saXN0Pi5pdGVtOmJlZm9yZSxvbC51aS5ob3Jpem9udGFsLmxpc3QgbGk6YmVmb3Jle3Bvc2l0aW9uOnN0YXRpYzttYXJnaW46MCAuNWVtIDAgMH0udWkuZGl2aWRlZC5saXN0Pi5pdGVte2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuZGl2aWRlZC5saXN0IC5saXN0Pi5pdGVte2JvcmRlci10b3A6bm9uZX0udWkuZGl2aWRlZC5saXN0IC5pdGVtIC5saXN0Pi5pdGVte2JvcmRlci10b3A6bm9uZX0udWkuZGl2aWRlZC5saXN0IC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxkLC51aS5kaXZpZGVkLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDpub25lfS51aS5kaXZpZGVkLmxpc3Q6bm90KC5ob3Jpem9udGFsKSAubGlzdD4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLXdpZHRoOjFweH0udWkuZGl2aWRlZC5idWxsZXRlZC5saXN0IC5saXN0LC51aS5kaXZpZGVkLmJ1bGxldGVkLmxpc3Q6bm90KC5ob3Jpem9udGFsKXttYXJnaW4tbGVmdDowO3BhZGRpbmctbGVmdDowfS51aS5kaXZpZGVkLmJ1bGxldGVkLmxpc3Q+Lml0ZW06bm90KC5ob3Jpem9udGFsKXtwYWRkaW5nLWxlZnQ6MS4yNXJlbX0udWkuZGl2aWRlZC5vcmRlcmVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuZGl2aWRlZC5vcmRlcmVkLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmRpdmlkZWQub3JkZXJlZC5saXN0Pi5pdGVte3BhZGRpbmctbGVmdDoxLjI1cmVtfS51aS5kaXZpZGVkLm9yZGVyZWQubGlzdCAuaXRlbSAubGlzdHttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO3BhZGRpbmctYm90dG9tOi4yMTQyODU3MWVtfS51aS5kaXZpZGVkLm9yZGVyZWQubGlzdCAuaXRlbSAubGlzdD4uaXRlbXtwYWRkaW5nLWxlZnQ6MWVtfS51aS5kaXZpZGVkLnNlbGVjdGlvbi5saXN0IC5saXN0Pi5pdGVtLC51aS5kaXZpZGVkLnNlbGVjdGlvbi5saXN0Pi5pdGVte21hcmdpbjowO2JvcmRlci1yYWRpdXM6MH0udWkuZGl2aWRlZC5ob3Jpem9udGFsLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuZGl2aWRlZC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW06bm90KDpmaXJzdC1jaGlsZCl7cGFkZGluZy1sZWZ0Oi41ZW19LnVpLmRpdmlkZWQuaG9yaXpvbnRhbC5saXN0Pi5pdGVtOm5vdCg6bGFzdC1jaGlsZCl7cGFkZGluZy1yaWdodDouNWVtfS51aS5kaXZpZGVkLmhvcml6b250YWwubGlzdD4uaXRlbXtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46MDtsaW5lLWhlaWdodDouNn0udWkuaG9yaXpvbnRhbC5kaXZpZGVkLmxpc3Q+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkuZGl2aWRlZC5pbnZlcnRlZC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW0sLnVpLmRpdmlkZWQuaW52ZXJ0ZWQubGlzdD4uaXRlbSwudWkuZGl2aWRlZC5pbnZlcnRlZC5saXN0Pi5saXN0e2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuY2VsbGVkLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5saXN0Pi5saXN0e2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0Oi41ZW19LnVpLmNlbGxlZC5saXN0Pi5pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5jZWxsZWQubGlzdD4uaXRlbTpmaXJzdC1jaGlsZCwudWkuY2VsbGVkLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZHtwYWRkaW5nLXRvcDouMjE0Mjg1NzFlbTtwYWRkaW5nLWJvdHRvbTouMjE0Mjg1NzFlbX0udWkuY2VsbGVkLmxpc3QgLml0ZW0gLmxpc3Q+Lml0ZW17Ym9yZGVyLXdpZHRoOjB9LnVpLmNlbGxlZC5saXN0IC5saXN0Pi5pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3Atd2lkdGg6MH0udWkuY2VsbGVkLmJ1bGxldGVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuY2VsbGVkLmJ1bGxldGVkLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5idWxsZXRlZC5saXN0Pi5pdGVte3BhZGRpbmctbGVmdDoxLjI1cmVtfS51aS5jZWxsZWQuYnVsbGV0ZWQubGlzdCAuaXRlbSAubGlzdHttYXJnaW4tbGVmdDotMS4yNXJlbTttYXJnaW4tcmlnaHQ6LTEuMjVyZW07cGFkZGluZy1ib3R0b206LjIxNDI4NTcxZW19LnVpLmNlbGxlZC5vcmRlcmVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuY2VsbGVkLm9yZGVyZWQubGlzdCAubGlzdD4uaXRlbSwudWkuY2VsbGVkLm9yZGVyZWQubGlzdD4uaXRlbXtwYWRkaW5nLWxlZnQ6MS4yNXJlbX0udWkuY2VsbGVkLm9yZGVyZWQubGlzdCAuaXRlbSAubGlzdHttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO3BhZGRpbmctYm90dG9tOi4yMTQyODU3MWVtfS51aS5jZWxsZWQub3JkZXJlZC5saXN0IC5saXN0Pi5pdGVte3BhZGRpbmctbGVmdDoxZW19LnVpLmhvcml6b250YWwuY2VsbGVkLmxpc3R7bWFyZ2luLWxlZnQ6MH0udWkuaG9yaXpvbnRhbC5jZWxsZWQubGlzdCAubGlzdD4uaXRlbSwudWkuaG9yaXpvbnRhbC5jZWxsZWQubGlzdD4uaXRlbXtib3JkZXItdG9wOm5vbmU7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46MDtwYWRkaW5nLWxlZnQ6LjVlbTtwYWRkaW5nLXJpZ2h0Oi41ZW07bGluZS1oZWlnaHQ6LjZ9LnVpLmhvcml6b250YWwuY2VsbGVkLmxpc3QgLmxpc3Q+Lml0ZW06bGFzdC1jaGlsZCwudWkuaG9yaXpvbnRhbC5jZWxsZWQubGlzdD4uaXRlbTpsYXN0LWNoaWxke2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuY2VsbGVkLmludmVydGVkLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5pbnZlcnRlZC5saXN0Pi5saXN0e2JvcmRlci1jb2xvcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLmNlbGxlZC5pbnZlcnRlZC5ob3Jpem9udGFsLmxpc3QgLmxpc3Q+Lml0ZW0sLnVpLmNlbGxlZC5pbnZlcnRlZC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Ym9yZGVyLWNvbG9yOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkucmVsYXhlZC5saXN0Om5vdCguaG9yaXpvbnRhbCk+Lml0ZW06bm90KDpmaXJzdC1jaGlsZCl7cGFkZGluZy10b3A6LjQyODU3MTQzZW19LnVpLnJlbGF4ZWQubGlzdDpub3QoLmhvcml6b250YWwpPi5pdGVtOm5vdCg6bGFzdC1jaGlsZCl7cGFkZGluZy1ib3R0b206LjQyODU3MTQzZW19LnVpLmhvcml6b250YWwucmVsYXhlZC5saXN0IC5saXN0Pi5pdGVtOm5vdCg6Zmlyc3QtY2hpbGQpLC51aS5ob3Jpem9udGFsLnJlbGF4ZWQubGlzdD4uaXRlbTpub3QoOmZpcnN0LWNoaWxkKXtwYWRkaW5nLWxlZnQ6MXJlbX0udWkuaG9yaXpvbnRhbC5yZWxheGVkLmxpc3QgLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKSwudWkuaG9yaXpvbnRhbC5yZWxheGVkLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKXtwYWRkaW5nLXJpZ2h0OjFyZW19LnVpW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0ubGlzdDpub3QoLmhvcml6b250YWwpPi5pdGVtOm5vdCg6Zmlyc3QtY2hpbGQpe3BhZGRpbmctdG9wOi44NTcxNDI4NmVtfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3Q6bm90KC5ob3Jpem9udGFsKT4uaXRlbTpub3QoOmxhc3QtY2hpbGQpe3BhZGRpbmctYm90dG9tOi44NTcxNDI4NmVtfS51aS5ob3Jpem9udGFsW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0ubGlzdCAubGlzdD4uaXRlbTpub3QoOmZpcnN0LWNoaWxkKSwudWkuaG9yaXpvbnRhbFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3Q+Lml0ZW06bm90KDpmaXJzdC1jaGlsZCl7cGFkZGluZy1sZWZ0OjEuNXJlbX0udWkuaG9yaXpvbnRhbFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3QgLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKSwudWkuaG9yaXpvbnRhbFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmxpc3Q+Lml0ZW06bm90KDpsYXN0LWNoaWxkKXtwYWRkaW5nLXJpZ2h0OjEuNXJlbX0udWkubWluaS5saXN0e2ZvbnQtc2l6ZTouNzg1NzE0MjllbX0udWkudGlueS5saXN0e2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkuc21hbGwubGlzdHtmb250LXNpemU6LjkyODU3MTQzZW19LnVpLmxpc3R7Zm9udC1zaXplOjFlbX0udWkubGFyZ2UubGlzdHtmb250LXNpemU6MS4xNDI4NTcxNGVtfS51aS5iaWcubGlzdHtmb250LXNpemU6MS4yODU3MTQyOWVtfS51aS5odWdlLmxpc3R7Zm9udC1zaXplOjEuNDI4NTcxNDNlbX0udWkubWFzc2l2ZS5saXN0e2ZvbnQtc2l6ZToxLjcxNDI4NTcxZW19LnVpLm1pbmkuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5taW5pLmhvcml6b250YWwubGlzdD4uaXRlbXtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55Lmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbSwudWkudGlueS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5zbWFsbC5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbSwudWkubGFyZ2UuaG9yaXpvbnRhbC5saXN0Pi5pdGVte2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5iaWcuaG9yaXpvbnRhbC5saXN0Pi5pdGVte2ZvbnQtc2l6ZToxLjI4NTcxNDI5cmVtfS51aS5odWdlLmhvcml6b250YWwubGlzdCAubGlzdD4uaXRlbSwudWkuaHVnZS5ob3Jpem9udGFsLmxpc3Q+Lml0ZW17Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLm1hc3NpdmUuaG9yaXpvbnRhbC5saXN0IC5saXN0Pi5pdGVtLC51aS5tYXNzaXZlLmhvcml6b250YWwubGlzdD4uaXRlbXtmb250LXNpemU6MS43MTQyODU3MXJlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTG9hZGVyXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubG9hZGVye2Rpc3BsYXk6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO21hcmdpbjowO3RleHQtYWxpZ246Y2VudGVyO3otaW5kZXg6MTAwMDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKX0udWkubG9hZGVyOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDowO2xlZnQ6NTAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyOi4yZW0gc29saWQgcmdiYSgwLDAsMCwuMSl9LnVpLmxvYWRlcjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDowO2xlZnQ6NTAlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7LXdlYmtpdC1hbmltYXRpb246bG9hZGVyIC42cyBsaW5lYXI7YW5pbWF0aW9uOmxvYWRlciAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50fUAtd2Via2l0LWtleWZyYW1lcyBsb2FkZXJ7ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fUBrZXlmcmFtZXMgbG9hZGVye2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0udWkubWluaS5sb2FkZXI6YWZ0ZXIsLnVpLm1pbmkubG9hZGVyOmJlZm9yZXt3aWR0aDoxcmVtO2hlaWdodDoxcmVtO21hcmdpbjowIDAgMCAtLjVyZW19LnVpLnRpbnkubG9hZGVyOmFmdGVyLC51aS50aW55LmxvYWRlcjpiZWZvcmV7d2lkdGg6MS4xNDI4NTcxNHJlbTtoZWlnaHQ6MS4xNDI4NTcxNHJlbTttYXJnaW46MCAwIDAgLS41NzE0Mjg1N3JlbX0udWkuc21hbGwubG9hZGVyOmFmdGVyLC51aS5zbWFsbC5sb2FkZXI6YmVmb3Jle3dpZHRoOjEuNzE0Mjg1NzFyZW07aGVpZ2h0OjEuNzE0Mjg1NzFyZW07bWFyZ2luOjAgMCAwIC0uODU3MTQyODZyZW19LnVpLmxvYWRlcjphZnRlciwudWkubG9hZGVyOmJlZm9yZXt3aWR0aDoyLjI4NTcxNDI5cmVtO2hlaWdodDoyLjI4NTcxNDI5cmVtO21hcmdpbjowIDAgMCAtMS4xNDI4NTcxNHJlbX0udWkubGFyZ2UubG9hZGVyOmFmdGVyLC51aS5sYXJnZS5sb2FkZXI6YmVmb3Jle3dpZHRoOjMuNDI4NTcxNDNyZW07aGVpZ2h0OjMuNDI4NTcxNDNyZW07bWFyZ2luOjAgMCAwIC0xLjcxNDI4NTcxcmVtfS51aS5iaWcubG9hZGVyOmFmdGVyLC51aS5iaWcubG9hZGVyOmJlZm9yZXt3aWR0aDozLjcxNDI4NTcxcmVtO2hlaWdodDozLjcxNDI4NTcxcmVtO21hcmdpbjowIDAgMCAtMS44NTcxNDI4NnJlbX0udWkuaHVnZS5sb2FkZXI6YWZ0ZXIsLnVpLmh1Z2UubG9hZGVyOmJlZm9yZXt3aWR0aDo0LjE0Mjg1NzE0cmVtO2hlaWdodDo0LjE0Mjg1NzE0cmVtO21hcmdpbjowIDAgMCAtMi4wNzE0Mjg1N3JlbX0udWkubWFzc2l2ZS5sb2FkZXI6YWZ0ZXIsLnVpLm1hc3NpdmUubG9hZGVyOmJlZm9yZXt3aWR0aDo0LjU3MTQyODU3cmVtO2hlaWdodDo0LjU3MTQyODU3cmVtO21hcmdpbjowIDAgMCAtMi4yODU3MTQyOXJlbX0udWkuZGltbWVyIC5sb2FkZXJ7ZGlzcGxheTpibG9ja30udWkuZGltbWVyIC51aS5sb2FkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmRpbW1lciAudWkubG9hZGVyOmJlZm9yZXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTUpfS51aS5kaW1tZXIgLnVpLmxvYWRlcjphZnRlcntib3JkZXItY29sb3I6I2ZmZiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5sb2FkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmxvYWRlcjpiZWZvcmV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmxvYWRlcjphZnRlcntib3JkZXItY29sb3I6Izc2NzY3NiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudH0udWkudGV4dC5sb2FkZXJ7d2lkdGg6YXV0byFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8haW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc3R5bGU6bm9ybWFsfS51aS5pbmRldGVybWluYXRlLmxvYWRlcjphZnRlcnthbmltYXRpb24tZGlyZWN0aW9uOnJldmVyc2U7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MS4yczthbmltYXRpb24tZHVyYXRpb246MS4yc30udWkubG9hZGVyLmFjdGl2ZSwudWkubG9hZGVyLnZpc2libGV7ZGlzcGxheTpibG9ja30udWkubG9hZGVyLmRpc2FibGVkLC51aS5sb2FkZXIuaGlkZGVue2Rpc3BsYXk6bm9uZX0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5taW5pLmxvYWRlciwudWkubWluaS5sb2FkZXJ7d2lkdGg6MXJlbTtoZWlnaHQ6MXJlbTtmb250LXNpemU6Ljc4NTcxNDI5ZW19LnVpLmludmVydGVkLmRpbW1lciAudWkudGlueS5sb2FkZXIsLnVpLnRpbnkubG9hZGVye3dpZHRoOjEuMTQyODU3MTRyZW07aGVpZ2h0OjEuMTQyODU3MTRyZW07Zm9udC1zaXplOi44NTcxNDI4NmVtfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLnNtYWxsLmxvYWRlciwudWkuc21hbGwubG9hZGVye3dpZHRoOjEuNzE0Mjg1NzFyZW07aGVpZ2h0OjEuNzE0Mjg1NzFyZW07Zm9udC1zaXplOi45Mjg1NzE0M2VtfS51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmxvYWRlciwudWkubG9hZGVye3dpZHRoOjIuMjg1NzE0MjlyZW07aGVpZ2h0OjIuMjg1NzE0MjlyZW07Zm9udC1zaXplOjFlbX0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5sYXJnZS5sb2FkZXIsLnVpLmxhcmdlLmxvYWRlcnt3aWR0aDozLjQyODU3MTQzcmVtO2hlaWdodDozLjQyODU3MTQzcmVtO2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW19LnVpLmJpZy5sb2FkZXIsLnVpLmludmVydGVkLmRpbW1lciAudWkuYmlnLmxvYWRlcnt3aWR0aDozLjcxNDI4NTcxcmVtO2hlaWdodDozLjcxNDI4NTcxcmVtO2ZvbnQtc2l6ZToxLjI4NTcxNDI5ZW19LnVpLmh1Z2UubG9hZGVyLC51aS5pbnZlcnRlZC5kaW1tZXIgLnVpLmh1Z2UubG9hZGVye3dpZHRoOjQuMTQyODU3MTRyZW07aGVpZ2h0OjQuMTQyODU3MTRyZW07Zm9udC1zaXplOjEuNDI4NTcxNDNlbX0udWkuaW52ZXJ0ZWQuZGltbWVyIC51aS5tYXNzaXZlLmxvYWRlciwudWkubWFzc2l2ZS5sb2FkZXJ7d2lkdGg6NC41NzE0Mjg1N3JlbTtoZWlnaHQ6NC41NzE0Mjg1N3JlbTtmb250LXNpemU6MS43MTQyODU3MWVtfS51aS5taW5pLnRleHQubG9hZGVye21pbi13aWR0aDoxcmVtO3BhZGRpbmctdG9wOjEuNzg1NzE0MjlyZW19LnVpLnRpbnkudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjEuMTQyODU3MTRyZW07cGFkZGluZy10b3A6MS45Mjg1NzE0M3JlbX0udWkuc21hbGwudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjEuNzE0Mjg1NzFyZW07cGFkZGluZy10b3A6Mi41cmVtfS51aS50ZXh0LmxvYWRlcnttaW4td2lkdGg6Mi4yODU3MTQyOXJlbTtwYWRkaW5nLXRvcDozLjA3MTQyODU3cmVtfS51aS5sYXJnZS50ZXh0LmxvYWRlcnttaW4td2lkdGg6My40Mjg1NzE0M3JlbTtwYWRkaW5nLXRvcDo0LjIxNDI4NTcxcmVtfS51aS5iaWcudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjMuNzE0Mjg1NzFyZW07cGFkZGluZy10b3A6NC41cmVtfS51aS5odWdlLnRleHQubG9hZGVye21pbi13aWR0aDo0LjE0Mjg1NzE0cmVtO3BhZGRpbmctdG9wOjQuOTI4NTcxNDNyZW19LnVpLm1hc3NpdmUudGV4dC5sb2FkZXJ7bWluLXdpZHRoOjQuNTcxNDI4NTdyZW07cGFkZGluZy10b3A6NS4zNTcxNDI4NnJlbX0udWkuaW52ZXJ0ZWQubG9hZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5pbnZlcnRlZC5sb2FkZXI6YmVmb3Jle2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9LnVpLmludmVydGVkLmxvYWRlcjphZnRlcntib3JkZXItdG9wLWNvbG9yOiNmZmZ9LnVpLmlubGluZS5sb2FkZXJ7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO21hcmdpbjowO2xlZnQ6MDt0b3A6MDstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfS51aS5pbmxpbmUubG9hZGVyLmFjdGl2ZSwudWkuaW5saW5lLmxvYWRlci52aXNpYmxle2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5jZW50ZXJlZC5pbmxpbmUubG9hZGVyLmFjdGl2ZSwudWkuY2VudGVyZWQuaW5saW5lLmxvYWRlci52aXNpYmxle2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0b30vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTG9hZGVyXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkucGxhY2Vob2xkZXJ7cG9zaXRpb246c3RhdGljO292ZXJmbG93OmhpZGRlbjstd2Via2l0LWFuaW1hdGlvbjpwbGFjZWhvbGRlclNoaW1tZXIgMnMgbGluZWFyO2FuaW1hdGlvbjpwbGFjZWhvbGRlclNoaW1tZXIgMnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JhY2tncm91bmQtY29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IHRvcCxmcm9tKHJnYmEoMCwwLDAsLjA4KSksY29sb3Itc3RvcCgxNSUscmdiYSgwLDAsMCwuMTUpKSxjb2xvci1zdG9wKDMwJSxyZ2JhKDAsMCwwLC4wOCkpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQscmdiYSgwLDAsMCwuMDgpIDAscmdiYSgwLDAsMCwuMTUpIDE1JSxyZ2JhKDAsMCwwLC4wOCkgMzAlKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDAsMCwwLC4wOCkgMCxyZ2JhKDAsMCwwLC4xNSkgMTUlLHJnYmEoMCwwLDAsLjA4KSAzMCUpO2JhY2tncm91bmQtc2l6ZToxMjAwcHggMTAwJTttYXgtd2lkdGg6MzByZW19QC13ZWJraXQta2V5ZnJhbWVzIHBsYWNlaG9sZGVyU2hpbW1lcnswJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjAwcHggMH0xMDAle2JhY2tncm91bmQtcG9zaXRpb246MTIwMHB4IDB9fUBrZXlmcmFtZXMgcGxhY2Vob2xkZXJTaGltbWVyezAle2JhY2tncm91bmQtcG9zaXRpb246LTEyMDBweCAwfTEwMCV7YmFja2dyb3VuZC1wb3NpdGlvbjoxMjAwcHggMH19LnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcnttYXJnaW4tdG9wOjJyZW19LnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcnstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouMTVzO2FuaW1hdGlvbi1kZWxheTouMTVzfS51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXIrLnVpLnBsYWNlaG9sZGVyey13ZWJraXQtYW5pbWF0aW9uLWRlbGF5Oi4zczthbmltYXRpb24tZGVsYXk6LjNzfS51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXIrLnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcnstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouNDVzO2FuaW1hdGlvbi1kZWxheTouNDVzfS51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXIrLnVpLnBsYWNlaG9sZGVyKy51aS5wbGFjZWhvbGRlcisudWkucGxhY2Vob2xkZXJ7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LjZzO2FuaW1hdGlvbi1kZWxheTouNnN9LnVpLnBsYWNlaG9sZGVyLC51aS5wbGFjZWhvbGRlciAuaW1hZ2UuaGVhZGVyOmFmdGVyLC51aS5wbGFjZWhvbGRlciAubGluZSwudWkucGxhY2Vob2xkZXIgLmxpbmU6YWZ0ZXIsLnVpLnBsYWNlaG9sZGVyPjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS51aS5wbGFjZWhvbGRlciAuaW1hZ2U6bm90KC5oZWFkZXIpOm5vdCgudWkpe2hlaWdodDoxMDBweH0udWkucGxhY2Vob2xkZXIgLnNxdWFyZS5pbWFnZTpub3QoLmhlYWRlcil7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmctdG9wOjEwMCV9LnVpLnBsYWNlaG9sZGVyIC5yZWN0YW5ndWxhci5pbWFnZTpub3QoLmhlYWRlcil7aGVpZ2h0OjA7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmctdG9wOjc1JX0udWkucGxhY2Vob2xkZXIgLmxpbmV7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0Oi44NTcxNDI4NmVtfS51aS5wbGFjZWhvbGRlciAubGluZTphZnRlciwudWkucGxhY2Vob2xkZXIgLmxpbmU6YmVmb3Jle3RvcDoxMDAlO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0fS51aS5wbGFjZWhvbGRlciAubGluZTpiZWZvcmV7bGVmdDowfS51aS5wbGFjZWhvbGRlciAubGluZTphZnRlcntyaWdodDowfS51aS5wbGFjZWhvbGRlciAubGluZXttYXJnaW4tYm90dG9tOi41ZW19LnVpLnBsYWNlaG9sZGVyIC5saW5lOmFmdGVyLC51aS5wbGFjZWhvbGRlciAubGluZTpiZWZvcmV7aGVpZ2h0Oi41ZW19LnVpLnBsYWNlaG9sZGVyIC5saW5lOm5vdCg6Zmlyc3QtY2hpbGQpe21hcmdpbi10b3A6LjVlbX0udWkucGxhY2Vob2xkZXIgLmhlYWRlcntwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW59LnVpLnBsYWNlaG9sZGVyIC5saW5lOm50aC1jaGlsZCgxKTphZnRlcnt3aWR0aDowJX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDIpOmFmdGVye3dpZHRoOjUwJX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDMpOmFmdGVye3dpZHRoOjEwJX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDQpOmFmdGVye3dpZHRoOjM1JX0udWkucGxhY2Vob2xkZXIgLmxpbmU6bnRoLWNoaWxkKDUpOmFmdGVye3dpZHRoOjY1JX0udWkucGxhY2Vob2xkZXIgLmhlYWRlciAubGluZXttYXJnaW4tYm90dG9tOi42NDI4NTcxNGVtfS51aS5wbGFjZWhvbGRlciAuaGVhZGVyIC5saW5lOmFmdGVyLC51aS5wbGFjZWhvbGRlciAuaGVhZGVyIC5saW5lOmJlZm9yZXtoZWlnaHQ6LjY0Mjg1NzE0ZW19LnVpLnBsYWNlaG9sZGVyIC5oZWFkZXIgLmxpbmU6bm90KDpmaXJzdC1jaGlsZCl7bWFyZ2luLXRvcDouNjQyODU3MTRlbX0udWkucGxhY2Vob2xkZXIgLmhlYWRlciAubGluZTphZnRlcnt3aWR0aDoyMCV9LnVpLnBsYWNlaG9sZGVyIC5oZWFkZXIgLmxpbmU6bnRoLWNoaWxkKDIpOmFmdGVye3dpZHRoOjYwJX0udWkucGxhY2Vob2xkZXIgLmltYWdlLmhlYWRlciAubGluZXttYXJnaW4tbGVmdDozZW19LnVpLnBsYWNlaG9sZGVyIC5pbWFnZS5oZWFkZXIgLmxpbmU6YmVmb3Jle3dpZHRoOi43MTQyODU3MXJlbX0udWkucGxhY2Vob2xkZXIgLmltYWdlLmhlYWRlcjphZnRlcntkaXNwbGF5OmJsb2NrO2hlaWdodDouODU3MTQyODZlbTtjb250ZW50OicnO21hcmdpbi1sZWZ0OjNlbX0udWkucGxhY2Vob2xkZXIgLmhlYWRlciAubGluZTpmaXJzdC1jaGlsZCwudWkucGxhY2Vob2xkZXIgLmltYWdlIC5saW5lOmZpcnN0LWNoaWxkLC51aS5wbGFjZWhvbGRlciAucGFyYWdyYXBoIC5saW5lOmZpcnN0LWNoaWxke2hlaWdodDouMDFweH0udWkucGxhY2Vob2xkZXIgLmhlYWRlcjpub3QoOmZpcnN0LWNoaWxkKTpiZWZvcmUsLnVpLnBsYWNlaG9sZGVyIC5pbWFnZTpub3QoOmZpcnN0LWNoaWxkKTpiZWZvcmUsLnVpLnBsYWNlaG9sZGVyIC5wYXJhZ3JhcGg6bm90KDpmaXJzdC1jaGlsZCk6YmVmb3Jle2hlaWdodDoxLjQyODU3MTQzZW07Y29udGVudDonJztkaXNwbGF5OmJsb2NrfS51aS5pbnZlcnRlZC5wbGFjZWhvbGRlcntiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLHJpZ2h0IHRvcCxmcm9tKHJnYmEoMjU1LDI1NSwyNTUsLjA4KSksY29sb3Itc3RvcCgxNSUscmdiYSgyNTUsMjU1LDI1NSwuMTQpKSxjb2xvci1zdG9wKDMwJSxyZ2JhKDI1NSwyNTUsMjU1LC4wOCkpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQscmdiYSgyNTUsMjU1LDI1NSwuMDgpIDAscmdiYSgyNTUsMjU1LDI1NSwuMTQpIDE1JSxyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgMzAlKTtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCxyZ2JhKDI1NSwyNTUsMjU1LC4wOCkgMCxyZ2JhKDI1NSwyNTUsMjU1LC4xNCkgMTUlLHJnYmEoMjU1LDI1NSwyNTUsLjA4KSAzMCUpfS51aS5pbnZlcnRlZC5wbGFjZWhvbGRlciwudWkuaW52ZXJ0ZWQucGxhY2Vob2xkZXIgLmltYWdlLmhlYWRlcjphZnRlciwudWkuaW52ZXJ0ZWQucGxhY2Vob2xkZXIgLmxpbmUsLnVpLmludmVydGVkLnBsYWNlaG9sZGVyIC5saW5lOmFmdGVyLC51aS5pbnZlcnRlZC5wbGFjZWhvbGRlcj46YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzFiMWMxZH0udWkucGxhY2Vob2xkZXIgLmZ1bGwubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6MCV9LnVpLnBsYWNlaG9sZGVyIC52ZXJ5LmxvbmcubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6MTAlfS51aS5wbGFjZWhvbGRlciAubG9uZy5saW5lLmxpbmUubGluZTphZnRlcnt3aWR0aDozNSV9LnVpLnBsYWNlaG9sZGVyIC5tZWRpdW0ubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6NTAlfS51aS5wbGFjZWhvbGRlciAuc2hvcnQubGluZS5saW5lLmxpbmU6YWZ0ZXJ7d2lkdGg6NjUlfS51aS5wbGFjZWhvbGRlciAudmVyeS5zaG9ydC5saW5lLmxpbmUubGluZTphZnRlcnt3aWR0aDo4MCV9LnVpLmZsdWlkLnBsYWNlaG9sZGVye21heC13aWR0aDpub25lfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBSYWlsXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkucmFpbHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDt3aWR0aDozMDBweDtoZWlnaHQ6MTAwJX0udWkubGVmdC5yYWlse2xlZnQ6YXV0bztyaWdodDoxMDAlO3BhZGRpbmc6MCAycmVtIDAgMDttYXJnaW46MCAycmVtIDAgMH0udWkucmlnaHQucmFpbHtsZWZ0OjEwMCU7cmlnaHQ6YXV0bztwYWRkaW5nOjAgMCAwIDJyZW07bWFyZ2luOjAgMCAwIDJyZW19LnVpLmxlZnQuaW50ZXJuYWwucmFpbHtsZWZ0OjA7cmlnaHQ6YXV0bztwYWRkaW5nOjAgMCAwIDJyZW07bWFyZ2luOjAgMCAwIDJyZW19LnVpLnJpZ2h0LmludGVybmFsLnJhaWx7bGVmdDphdXRvO3JpZ2h0OjA7cGFkZGluZzowIDJyZW0gMCAwO21hcmdpbjowIDJyZW0gMCAwfS51aS5kaXZpZGluZy5yYWlse3dpZHRoOjMwMi41cHh9LnVpLmxlZnQuZGl2aWRpbmcucmFpbHtwYWRkaW5nOjAgMi41cmVtIDAgMDttYXJnaW46MCAyLjVyZW0gMCAwO2JvcmRlci1yaWdodDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5yaWdodC5kaXZpZGluZy5yYWlse2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7cGFkZGluZzowIDAgMCAyLjVyZW07bWFyZ2luOjAgMCAwIDIuNXJlbX0udWkuY2xvc2UucmFpbHt3aWR0aDpjYWxjKDMwMHB4ICsgMWVtKX0udWkuY2xvc2UubGVmdC5yYWlse3BhZGRpbmc6MCAxZW0gMCAwO21hcmdpbjowIDFlbSAwIDB9LnVpLmNsb3NlLnJpZ2h0LnJhaWx7cGFkZGluZzowIDAgMCAxZW07bWFyZ2luOjAgMCAwIDFlbX0udWkudmVyeS5jbG9zZS5yYWlse3dpZHRoOmNhbGMoMzAwcHggKyAuNWVtKX0udWkudmVyeS5jbG9zZS5sZWZ0LnJhaWx7cGFkZGluZzowIC41ZW0gMCAwO21hcmdpbjowIC41ZW0gMCAwfS51aS52ZXJ5LmNsb3NlLnJpZ2h0LnJhaWx7cGFkZGluZzowIDAgMCAuNWVtO21hcmdpbjowIDAgMCAuNWVtfS51aS5hdHRhY2hlZC5sZWZ0LnJhaWwsLnVpLmF0dGFjaGVkLnJpZ2h0LnJhaWx7cGFkZGluZzowO21hcmdpbjowfS51aS5taW5pLnJhaWx7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5yYWlse2ZvbnQtc2l6ZTouODU3MTQyODZyZW19LnVpLnNtYWxsLnJhaWx7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkucmFpbHtmb250LXNpemU6MXJlbX0udWkubGFyZ2UucmFpbHtmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuYmlnLnJhaWx7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmh1Z2UucmFpbHtmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5yYWlse2ZvbnQtc2l6ZToxLjcxNDI4NTcxcmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBSZXZlYWxcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5yZXZlYWx7ZGlzcGxheTppbmhlcml0O3Bvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudDtmb250LXNpemU6MCFpbXBvcnRhbnR9LnVpLnJldmVhbD4udmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlIWltcG9ydGFudDt0b3A6MCFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDt6LWluZGV4OjMhaW1wb3J0YW50Oy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjVzIGVhc2UgLjFzO3RyYW5zaXRpb246YWxsIC41cyBlYXNlIC4xc30udWkucmV2ZWFsPi5oaWRkZW4uY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZSFpbXBvcnRhbnQ7ei1pbmRleDoyIWltcG9ydGFudH0udWkuYWN0aXZlLnJldmVhbCAudmlzaWJsZS5jb250ZW50LC51aS5yZXZlYWw6aG92ZXIgLnZpc2libGUuY29udGVudHt6LWluZGV4OjQhaW1wb3J0YW50fS51aS5zbGlkZS5yZXZlYWx7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwfS51aS5zbGlkZS5yZXZlYWw+LmNvbnRlbnR7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vcm1hbDtmbG9hdDpsZWZ0O21hcmdpbjowOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZSAuMXM7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZSAuMXM7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UgLjFzO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlIC4xcywtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZSAuMXN9LnVpLnNsaWRlLnJldmVhbD4udmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOnJlbGF0aXZlIWltcG9ydGFudH0udWkuc2xpZGUucmV2ZWFsPi5oaWRkZW4uY29udGVudHtwb3NpdGlvbjphYnNvbHV0ZSFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDt3aWR0aDoxMDAlIWltcG9ydGFudDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpIWltcG9ydGFudDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMDAlKSFpbXBvcnRhbnR9LnVpLnNsaWRlLmFjdGl2ZS5yZXZlYWw+LnZpc2libGUuY29udGVudCwudWkuc2xpZGUucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKSFpbXBvcnRhbnR9LnVpLnNsaWRlLmFjdGl2ZS5yZXZlYWw+LmhpZGRlbi5jb250ZW50LC51aS5zbGlkZS5yZXZlYWw6aG92ZXI+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIWltcG9ydGFudH0udWkuc2xpZGUucmlnaHQucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkhaW1wb3J0YW50fS51aS5zbGlkZS5yaWdodC5yZXZlYWw+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwMCUpIWltcG9ydGFudDt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSkhaW1wb3J0YW50fS51aS5zbGlkZS5yaWdodC5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLnNsaWRlLnJpZ2h0LnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUucmlnaHQuYWN0aXZlLnJldmVhbD4uaGlkZGVuLmNvbnRlbnQsLnVpLnNsaWRlLnJpZ2h0LnJldmVhbDpob3Zlcj4uaGlkZGVuLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkhaW1wb3J0YW50fS51aS5zbGlkZS51cC5yZXZlYWw+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUudXAuYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5zbGlkZS51cC5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUudXAuYWN0aXZlLnJldmVhbD4uaGlkZGVuLmNvbnRlbnQsLnVpLnNsaWRlLnVwLnJldmVhbDpob3Zlcj4uaGlkZGVuLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkhaW1wb3J0YW50fS51aS5zbGlkZS5kb3duLnJldmVhbD4uaGlkZGVuLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKSFpbXBvcnRhbnR9LnVpLnNsaWRlLmRvd24uYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5zbGlkZS5kb3duLnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpIWltcG9ydGFudH0udWkuc2xpZGUuZG93bi5hY3RpdmUucmV2ZWFsPi5oaWRkZW4uY29udGVudCwudWkuc2xpZGUuZG93bi5yZXZlYWw6aG92ZXI+LmhpZGRlbi5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApIWltcG9ydGFudH0udWkuZmFkZS5yZXZlYWw+LnZpc2libGUuY29udGVudHtvcGFjaXR5OjF9LnVpLmZhZGUuYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5mYWRlLnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50e29wYWNpdHk6MH0udWkubW92ZS5yZXZlYWx7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm93cmFwfS51aS5tb3ZlLnJldmVhbD4uY29udGVudHtkaXNwbGF5OmJsb2NrO2Zsb2F0OmxlZnQ7d2hpdGUtc3BhY2U6bm9ybWFsO21hcmdpbjowOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgY3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSkgLjFzO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpIC4xczt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgY3ViaWMtYmV6aWVyKC4xNzUsLjg4NSwuMzIsMSkgLjFzO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBjdWJpYy1iZXppZXIoLjE3NSwuODg1LC4zMiwxKSAuMXMsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGN1YmljLWJlemllciguMTc1LC44ODUsLjMyLDEpIC4xc30udWkubW92ZS5yZXZlYWw+LnZpc2libGUuY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZSFpbXBvcnRhbnR9LnVpLm1vdmUucmV2ZWFsPi5oaWRkZW4uY29udGVudHtwb3NpdGlvbjphYnNvbHV0ZSFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDt3aWR0aDoxMDAlIWltcG9ydGFudH0udWkubW92ZS5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLm1vdmUucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDAlKSFpbXBvcnRhbnR9LnVpLm1vdmUucmlnaHQuYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5tb3ZlLnJpZ2h0LnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwMCUpIWltcG9ydGFudH0udWkubW92ZS51cC5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLm1vdmUudXAucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnR7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xMDAlKSFpbXBvcnRhbnR9LnVpLm1vdmUuZG93bi5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLm1vdmUuZG93bi5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDEwMCUpIWltcG9ydGFudDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKSFpbXBvcnRhbnR9LnVpLnJvdGF0ZS5yZXZlYWw+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246LjVzO3RyYW5zaXRpb24tZHVyYXRpb246LjVzOy13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfS51aS5yb3RhdGUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLnJvdGF0ZS5yaWdodC5yZXZlYWw+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Ym90dG9tIHJpZ2h0O3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tIHJpZ2h0fS51aS5yb3RhdGUuYWN0aXZlLnJldmVhbD4udmlzaWJsZS5jb250ZW50LC51aS5yb3RhdGUucmV2ZWFsOmhvdmVyPi52aXNpYmxlLmNvbnRlbnQsLnVpLnJvdGF0ZS5yaWdodC5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLnJvdGF0ZS5yaWdodC5yZXZlYWw6aG92ZXI+LnZpc2libGUuY29udGVudHstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMTEwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDExMGRlZyl9LnVpLnJvdGF0ZS5sZWZ0LnJldmVhbD4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpib3R0b20gbGVmdDt0cmFuc2Zvcm0tb3JpZ2luOmJvdHRvbSBsZWZ0fS51aS5yb3RhdGUubGVmdC5hY3RpdmUucmV2ZWFsPi52aXNpYmxlLmNvbnRlbnQsLnVpLnJvdGF0ZS5sZWZ0LnJldmVhbDpob3Zlcj4udmlzaWJsZS5jb250ZW50ey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgtMTEwZGVnKTt0cmFuc2Zvcm06cm90YXRlKC0xMTBkZWcpfS51aS5kaXNhYmxlZC5yZXZlYWw6aG92ZXI+LnZpc2libGUudmlzaWJsZS5jb250ZW50e3Bvc2l0aW9uOnN0YXRpYyFpbXBvcnRhbnQ7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7b3BhY2l0eToxIWltcG9ydGFudDt0b3A6MCFpbXBvcnRhbnQ7bGVmdDowIWltcG9ydGFudDtyaWdodDphdXRvIWltcG9ydGFudDtib3R0b206YXV0byFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7dHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50fS51aS5kaXNhYmxlZC5yZXZlYWw6aG92ZXI+LmhpZGRlbi5oaWRkZW4uY29udGVudHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5yZXZlYWw+LnVpLnJpYmJvbi5sYWJlbHt6LWluZGV4OjV9LnVpLnZpc2libGUucmV2ZWFse292ZXJmbG93OnZpc2libGV9LnVpLmluc3RhbnQucmV2ZWFsPi5jb250ZW50ey13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTowcyFpbXBvcnRhbnQ7dHJhbnNpdGlvbi1kZWxheTowcyFpbXBvcnRhbnR9LnVpLnJldmVhbD4uY29udGVudHtmb250LXNpemU6MXJlbSFpbXBvcnRhbnR9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFNlZ21lbnRcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5zZWdtZW50e3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO21hcmdpbjoxcmVtIDA7cGFkZGluZzoxZW0gMWVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWdtZW50OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuc2VnbWVudDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkudmVydGljYWwuc2VnbWVudHttYXJnaW46MDtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOm5vbmU7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS52ZXJ0aWNhbC5zZWdtZW50Omxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lfS51aS5pbnZlcnRlZC5zZWdtZW50Pi51aS5oZWFkZXJ7Y29sb3I6I2ZmZn0udWlbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXS5zZWdtZW50PltjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLmxhYmVse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6MDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czowfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLnNlZ21lbnQ+W2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl0ubGFiZWx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czowO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjB9LnVpLmF0dGFjaGVkLnNlZ21lbnQ6bm90KC50b3ApOm5vdCguYm90dG9tKT5bY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXS5sYWJlbHtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjA7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MH0udWkuYXR0YWNoZWQuc2VnbWVudDpub3QoLnRvcCk6bm90KC5ib3R0b20pPltjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLmxhYmVse2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS51aS5ncmlkPi5yb3c+LnVpLnNlZ21lbnQuY29sdW1uLC51aS5ncmlkPi51aS5zZWdtZW50LmNvbHVtbiwudWkucGFnZS5ncmlkLnNlZ21lbnR7cGFkZGluZy10b3A6MmVtO3BhZGRpbmctYm90dG9tOjJlbX0udWkuZ3JpZC5zZWdtZW50e21hcmdpbjoxcmVtIDA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLmJhc2ljLnRhYmxlLnNlZ21lbnR7YmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxlLnNlZ21lbnR7cGFkZGluZzoxZW0gMWVtfS51aS5wbGFjZWhvbGRlci5zZWdtZW50e2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LWJveC1hbGlnbjpzdHJldGNoOy1tcy1mbGV4LWFsaWduOnN0cmV0Y2g7YWxpZ24taXRlbXM6c3RyZXRjaDttYXgtd2lkdGg6aW5pdGlhbDstd2Via2l0LWFuaW1hdGlvbjpub25lO2FuaW1hdGlvbjpub25lO292ZXJmbG93OnZpc2libGU7cGFkZGluZzoxZW0gMWVtO21pbi1oZWlnaHQ6MThyZW07YmFja2dyb3VuZDojZjlmYWZiO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDI1cHggMCByZ2JhKDM0LDM2LDM4LC4wNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDJweCAyNXB4IDAgcmdiYSgzNCwzNiwzOCwuMDUpIGluc2V0fS51aS5wbGFjZWhvbGRlci5zZWdtZW50IC5idXR0b24sLnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQgdGV4dGFyZWF7ZGlzcGxheTpibG9ja30udWkucGxhY2Vob2xkZXIuc2VnbWVudCAuYnV0dG9uLC51aS5wbGFjZWhvbGRlci5zZWdtZW50IC5maWVsZCwudWkucGxhY2Vob2xkZXIuc2VnbWVudCB0ZXh0YXJlYSwudWkucGxhY2Vob2xkZXIuc2VnbWVudD4udWkuaW5wdXR7bWF4LXdpZHRoOjE1cmVtO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQgLmNvbHVtbiAuYnV0dG9uLC51aS5wbGFjZWhvbGRlci5zZWdtZW50IC5jb2x1bW4gLmZpZWxkLC51aS5wbGFjZWhvbGRlci5zZWdtZW50IC5jb2x1bW4gdGV4dGFyZWEsLnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQgLmNvbHVtbj4udWkuaW5wdXR7bWF4LXdpZHRoOjE1cmVtO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLnBsYWNlaG9sZGVyLnNlZ21lbnQ+LmlubGluZXstbXMtZmxleC1pdGVtLWFsaWduOmNlbnRlcjthbGlnbi1zZWxmOmNlbnRlcn0udWkucGxhY2Vob2xkZXIuc2VnbWVudD4uaW5saW5lPi5idXR0b257ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0bzttYXJnaW46MCAuMzU3MTQyODZyZW0gMCAwfS51aS5wbGFjZWhvbGRlci5zZWdtZW50Pi5pbmxpbmU+LmJ1dHRvbjpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS51aS5waWxlZC5zZWdtZW50LC51aS5waWxlZC5zZWdtZW50c3ttYXJnaW46M2VtIDA7LXdlYmtpdC1ib3gtc2hhZG93OicnO2JveC1zaGFkb3c6Jyc7ei1pbmRleDphdXRvfS51aS5waWxlZC5zZWdtZW50OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkucGlsZWQuc2VnbWVudDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkucGlsZWQuc2VnbWVudDphZnRlciwudWkucGlsZWQuc2VnbWVudDpiZWZvcmUsLnVpLnBpbGVkLnNlZ21lbnRzOmFmdGVyLC51aS5waWxlZC5zZWdtZW50czpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZmZmO3Zpc2liaWxpdHk6dmlzaWJsZTtjb250ZW50OicnO2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93OicnO2JveC1zaGFkb3c6Jyd9LnVpLnBpbGVkLnNlZ21lbnQ6YmVmb3JlLC51aS5waWxlZC5zZWdtZW50czpiZWZvcmV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC0xLjJkZWcpO3RyYW5zZm9ybTpyb3RhdGUoLTEuMmRlZyk7dG9wOjA7ei1pbmRleDotMn0udWkucGlsZWQuc2VnbWVudDphZnRlciwudWkucGlsZWQuc2VnbWVudHM6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDEuMmRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgxLjJkZWcpO3RvcDowO3otaW5kZXg6LTF9LnVpW2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl0ucGlsZWQuc2VnbWVudHttYXJnaW4tdG9wOjNlbTttYXJnaW4tYm90dG9tOjB9LnVpLnBpbGVkLnNlZ21lbnRbY2xhc3MqPVxcXCJ0b3AgYXR0YWNoZWRcXFwiXTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnBpbGVkLnNlZ21lbnRbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXXttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTozZW19LnVpLnBpbGVkLnNlZ21lbnRbY2xhc3MqPVxcXCJib3R0b20gYXR0YWNoZWRcXFwiXTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuc3RhY2tlZC5zZWdtZW50e3BhZGRpbmctYm90dG9tOjEuNGVtfS51aS5zdGFja2VkLnNlZ21lbnQ6YWZ0ZXIsLnVpLnN0YWNrZWQuc2VnbWVudDpiZWZvcmUsLnVpLnN0YWNrZWQuc2VnbWVudHM6YWZ0ZXIsLnVpLnN0YWNrZWQuc2VnbWVudHM6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOi0zcHg7bGVmdDowO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjAzKTt3aWR0aDoxMDAlO2hlaWdodDo2cHg7dmlzaWJpbGl0eTp2aXNpYmxlfS51aS5zdGFja2VkLnNlZ21lbnQ6YmVmb3JlLC51aS5zdGFja2VkLnNlZ21lbnRzOmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLnRhbGwuc3RhY2tlZC5zZWdtZW50OmJlZm9yZSwudWkudGFsbC5zdGFja2VkLnNlZ21lbnRzOmJlZm9yZXtkaXNwbGF5OmJsb2NrO2JvdHRvbTowfS51aS5zdGFja2VkLmludmVydGVkLnNlZ21lbnQ6YWZ0ZXIsLnVpLnN0YWNrZWQuaW52ZXJ0ZWQuc2VnbWVudDpiZWZvcmUsLnVpLnN0YWNrZWQuaW52ZXJ0ZWQuc2VnbWVudHM6YWZ0ZXIsLnVpLnN0YWNrZWQuaW52ZXJ0ZWQuc2VnbWVudHM6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDMpO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjM1KX0udWkucGFkZGVkLnNlZ21lbnR7cGFkZGluZzoxLjVlbX0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHBhZGRlZFxcXCJdLnNlZ21lbnR7cGFkZGluZzozZW19LnVpLnBhZGRlZC5zZWdtZW50LnZlcnRpY2FsLnNlZ21lbnQsLnVpW2NsYXNzKj1cXFwidmVyeSBwYWRkZWRcXFwiXS52ZXJ0aWNhbC5zZWdtZW50e3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0udWkuY29tcGFjdC5zZWdtZW50e2Rpc3BsYXk6dGFibGV9LnVpLmNvbXBhY3Quc2VnbWVudHN7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleH0udWkuY29tcGFjdC5zZWdtZW50cyAuc2VnbWVudCwudWkuc2VnbWVudHMgLmNvbXBhY3Quc2VnbWVudHtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYm94LWZsZXg6MDstbXMtZmxleDowIDEgYXV0bztmbGV4OjAgMSBhdXRvfS51aS5jaXJjdWxhci5zZWdtZW50e2Rpc3BsYXk6dGFibGUtY2VsbDtwYWRkaW5nOjJlbTt0ZXh0LWFsaWduOmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Ym9yZGVyLXJhZGl1czo1MDBlbX0udWkucmFpc2VkLnNlZ21lbnQsLnVpLnJhaXNlZC5zZWdtZW50c3std2Via2l0LWJveC1zaGFkb3c6MCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VnbWVudHN7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luOjFyZW0gMDtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS5zZWdtZW50czpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnNlZ21lbnRzOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5zZWdtZW50cz4uc2VnbWVudHt0b3A6MDtib3R0b206MDtib3JkZXItcmFkaXVzOjA7bWFyZ2luOjA7d2lkdGg6YXV0bzstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWdtZW50czpub3QoLmhvcml6b250YWwpPi5zZWdtZW50OmZpcnN0LWNoaWxke2JvcmRlci10b3A6bm9uZTttYXJnaW4tdG9wOjA7Ym90dG9tOjA7bWFyZ2luLWJvdHRvbTowO3RvcDowO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLnNlZ21lbnRzOm5vdCguaG9yaXpvbnRhbCk+LnNlZ21lbnQ6bGFzdC1jaGlsZHt0b3A6MDtib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksbm9uZTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSxub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnNlZ21lbnRzOm5vdCguaG9yaXpvbnRhbCk+LnNlZ21lbnQ6b25seS1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuc2VnbWVudHM+LnVpLnNlZ21lbnRze2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46MXJlbSAxcmVtfS51aS5zZWdtZW50cz4uc2VnbWVudHM6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDpub25lfS51aS5zZWdtZW50cz4uc2VnbWVudCsuc2VnbWVudHM6bm90KC5ob3Jpem9udGFsKXttYXJnaW4tdG9wOjB9LnVpLmhvcml6b250YWwuc2VnbWVudHN7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6aG9yaXpvbnRhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6MDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46MXJlbSAwO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWdtZW50cz4uaG9yaXpvbnRhbC5zZWdtZW50c3ttYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MDtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ob3Jpem9udGFsLnNlZ21lbnRzPi5zZWdtZW50ey13ZWJraXQtYm94LWZsZXg6MTtmbGV4OjEgMSBhdXRvOy1tcy1mbGV4OjEgMSAwcHg7bWFyZ2luOjA7bWluLXdpZHRoOjA7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjA7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnNlZ21lbnRzPi5ob3Jpem9udGFsLnNlZ21lbnRzOmZpcnN0LWNoaWxke2JvcmRlci10b3A6bm9uZX0udWkuaG9yaXpvbnRhbC5zZWdtZW50cz4uc2VnbWVudDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDpub25lfS51aS5kaXNhYmxlZC5zZWdtZW50e29wYWNpdHk6LjQ1O2NvbG9yOnJnYmEoNDAsNDAsNDAsLjMpfS51aS5sb2FkaW5nLnNlZ21lbnR7cG9zaXRpb246cmVsYXRpdmU7Y3Vyc29yOmRlZmF1bHQ7cG9pbnRlci1ldmVudHM6bm9uZTt0ZXh0LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2l0aW9uOmFsbCAwcyBsaW5lYXI7dHJhbnNpdGlvbjphbGwgMHMgbGluZWFyfS51aS5sb2FkaW5nLnNlZ21lbnQ6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjA7bGVmdDowO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuOCk7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTt6LWluZGV4OjEwMH0udWkubG9hZGluZy5zZWdtZW50OmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LTEuNWVtIDAgMCAtMS41ZW07d2lkdGg6M2VtO2hlaWdodDozZW07LXdlYmtpdC1hbmltYXRpb246c2VnbWVudC1zcGluIC42cyBsaW5lYXI7YW5pbWF0aW9uOnNlZ21lbnQtc3BpbiAuNnMgbGluZWFyOy13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlci1jb2xvcjojNzY3Njc2IHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6LjJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHRyYW5zcGFyZW50O3Zpc2liaWxpdHk6dmlzaWJsZTt6LWluZGV4OjEwMX1ALXdlYmtpdC1rZXlmcmFtZXMgc2VnbWVudC1zcGlue2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIHNlZ21lbnQtc3Bpbntmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19LnVpLmJhc2ljLnNlZ21lbnR7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOjB9LnVpLmNsZWFyaW5nLnNlZ21lbnQ6YWZ0ZXJ7Y29udGVudDpcXFwiLlxcXCI7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtjbGVhcjpib3RoO3Zpc2liaWxpdHk6aGlkZGVufS51aS5yZWQuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjZGIyODI4IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQucmVkLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojZGIyODI4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub3JhbmdlLnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgI2YyNzExYyFpbXBvcnRhbnR9LnVpLmludmVydGVkLm9yYW5nZS5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnllbGxvdy5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICNmYmJkMDghaW1wb3J0YW50fS51aS5pbnZlcnRlZC55ZWxsb3cuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmYmJkMDghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5vbGl2ZS5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICNiNWNjMTghaW1wb3J0YW50fS51aS5pbnZlcnRlZC5vbGl2ZS5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZWVuLnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgIzIxYmE0NSFpbXBvcnRhbnR9LnVpLmludmVydGVkLmdyZWVuLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkudGVhbC5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICMwMGI1YWQhaW1wb3J0YW50fS51aS5pbnZlcnRlZC50ZWFsLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojMDBiNWFkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuYmx1ZS5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICMyMTg1ZDAhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibHVlLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkudmlvbGV0LnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgIzY0MzVjOSFpbXBvcnRhbnR9LnVpLmludmVydGVkLnZpb2xldC5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnB1cnBsZS5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICNhMzMzYzghaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wdXJwbGUuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNhMzMzYzghaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5waW5rLnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgI2UwMzk5NyFpbXBvcnRhbnR9LnVpLmludmVydGVkLnBpbmsuc2VnbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5icm93bi5zZWdtZW50Om5vdCguaW52ZXJ0ZWQpe2JvcmRlci10b3A6MnB4IHNvbGlkICNhNTY3M2YhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5icm93bi5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZXkuc2VnbWVudDpub3QoLmludmVydGVkKXtib3JkZXItdG9wOjJweCBzb2xpZCAjNzY3Njc2IWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JleS5zZWdtZW50e2JhY2tncm91bmQtY29sb3I6Izc2NzY3NiFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJsYWNrLnNlZ21lbnQ6bm90KC5pbnZlcnRlZCl7Ym9yZGVyLXRvcDoycHggc29saWQgIzFiMWMxZCFpbXBvcnRhbnR9LnVpLmludmVydGVkLmJsYWNrLnNlZ21lbnR7YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJsZWZ0IGFsaWduZWRcXFwiXS5zZWdtZW50e3RleHQtYWxpZ246bGVmdH0udWlbY2xhc3MqPVxcXCJyaWdodCBhbGlnbmVkXFxcIl0uc2VnbWVudHt0ZXh0LWFsaWduOnJpZ2h0fS51aVtjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0uc2VnbWVudHt0ZXh0LWFsaWduOmNlbnRlcn0udWkuZmxvYXRlZC5zZWdtZW50LC51aVtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJdLnNlZ21lbnR7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MWVtfS51aVtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXS5zZWdtZW50e2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OjFlbX0udWkuaW52ZXJ0ZWQuc2VnbWVudHtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkLnNlZ21lbnQsLnVpLnByaW1hcnkuaW52ZXJ0ZWQuc2VnbWVudHtiYWNrZ3JvdW5kOiMxYjFjMWQ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmludmVydGVkLnNlZ21lbnQgLnNlZ21lbnR7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbnZlcnRlZC5zZWdtZW50IC5pbnZlcnRlZC5zZWdtZW50e2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5pbnZlcnRlZC5hdHRhY2hlZC5zZWdtZW50e2JvcmRlci1jb2xvcjojNTU1fS51aS5zZWNvbmRhcnkuc2VnbWVudHtiYWNrZ3JvdW5kOiNmM2Y0ZjU7Y29sb3I6cmdiYSgwLDAsMCwuNil9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5zZWdtZW50e2JhY2tncm91bmQ6IzRjNGY1MiAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxmcm9tKHJnYmEoMjU1LDI1NSwyNTUsLjIpKSx0byhyZ2JhKDI1NSwyNTUsMjU1LC4yKSkpO2JhY2tncm91bmQ6IzRjNGY1MiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChyZ2JhKDI1NSwyNTUsMjU1LC4yKSAwLHJnYmEoMjU1LDI1NSwyNTUsLjIpIDEwMCUpO2JhY2tncm91bmQ6IzRjNGY1MiBsaW5lYXItZ3JhZGllbnQocmdiYSgyNTUsMjU1LDI1NSwuMikgMCxyZ2JhKDI1NSwyNTUsMjU1LC4yKSAxMDAlKTtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC44KX0udWkudGVydGlhcnkuc2VnbWVudHtiYWNrZ3JvdW5kOiNkY2RkZGU7Y29sb3I6cmdiYSgwLDAsMCwuNil9LnVpLnRlcnRpYXJ5LmludmVydGVkLnNlZ21lbnR7YmFja2dyb3VuZDojNzE3NTc5IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20ocmdiYSgyNTUsMjU1LDI1NSwuMzUpKSx0byhyZ2JhKDI1NSwyNTUsMjU1LC4zNSkpKTtiYWNrZ3JvdW5kOiM3MTc1NzkgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQocmdiYSgyNTUsMjU1LDI1NSwuMzUpIDAscmdiYSgyNTUsMjU1LDI1NSwuMzUpIDEwMCUpO2JhY2tncm91bmQ6IzcxNzU3OSBsaW5lYXItZ3JhZGllbnQocmdiYSgyNTUsMjU1LDI1NSwuMzUpIDAscmdiYSgyNTUsMjU1LDI1NSwuMzUpIDEwMCUpO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjgpfS51aS5hdHRhY2hlZC5zZWdtZW50e3RvcDowO2JvdHRvbTowO2JvcmRlci1yYWRpdXM6MDttYXJnaW46MCAtMXB4O3dpZHRoOmNhbGMoMTAwJSArIDJweCk7bWF4LXdpZHRoOmNhbGMoMTAwJSArIDJweCk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNX0udWkuYXR0YWNoZWQ6bm90KC5tZXNzYWdlKSsudWkuYXR0YWNoZWQuc2VnbWVudDpub3QoLnRvcCl7Ym9yZGVyLXRvcDpub25lfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLnNlZ21lbnR7Ym90dG9tOjA7bWFyZ2luLWJvdHRvbTowO3RvcDowO21hcmdpbi10b3A6MXJlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS5zZWdtZW50W2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl06Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5zZWdtZW50W2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl17Ym90dG9tOjA7bWFyZ2luLXRvcDowO3RvcDowO21hcmdpbi1ib3R0b206MXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLG5vbmU7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksbm9uZTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5zZWdtZW50W2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLm1pbmkuc2VnbWVudCwudWkubWluaS5zZWdtZW50cyAuc2VnbWVudHtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LnNlZ21lbnQsLnVpLnRpbnkuc2VnbWVudHMgLnNlZ21lbnR7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuc2VnbWVudCwudWkuc21hbGwuc2VnbWVudHMgLnNlZ21lbnR7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuc2VnbWVudCwudWkuc2VnbWVudHMgLnNlZ21lbnR7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLnNlZ21lbnQsLnVpLmxhcmdlLnNlZ21lbnRzIC5zZWdtZW50e2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuc2VnbWVudCwudWkuYmlnLnNlZ21lbnRzIC5zZWdtZW50e2ZvbnQtc2l6ZToxLjI4NTcxNDI5cmVtfS51aS5odWdlLnNlZ21lbnQsLnVpLmh1Z2Uuc2VnbWVudHMgLnNlZ21lbnR7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLm1hc3NpdmUuc2VnbWVudCwudWkubWFzc2l2ZS5zZWdtZW50cyAuc2VnbWVudHtmb250LXNpemU6MS43MTQyODU3MXJlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gU3RlcFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnN0ZXBze2Rpc3BsYXk6LXdlYmtpdC1pbmxpbmUtYm94O2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94O2Rpc3BsYXk6aW5saW5lLWZsZXg7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdzstd2Via2l0LWJveC1hbGlnbjpzdHJldGNoOy1tcy1mbGV4LWFsaWduOnN0cmV0Y2g7YWxpZ24taXRlbXM6c3RyZXRjaDttYXJnaW46MWVtIDA7YmFja2dyb3VuZDonJzstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7bGluZS1oZWlnaHQ6MS4xNDI4NTcxNGVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zdGVwczpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnN0ZXBzOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5zdGVwcyAuc3RlcHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYm94LWZsZXg6MTstbXMtZmxleDoxIDAgYXV0bztmbGV4OjEgMCBhdXRvOy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcDstd2Via2l0LWJveC1vcmllbnQ6aG9yaXpvbnRhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93O3ZlcnRpY2FsLWFsaWduOm1pZGRsZTstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjstd2Via2l0LWJveC1wYWNrOmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowIDA7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1yYWRpdXM6MDtib3JkZXI6bm9uZTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZX0udWkuc3RlcHMgLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mjtjb250ZW50OicnO3RvcDo1MCU7cmlnaHQ6MDtib3JkZXI6bWVkaXVtIG5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmO3dpZHRoOjEuMTQyODU3MTRlbTtoZWlnaHQ6MS4xNDI4NTcxNGVtO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpO2JvcmRlci13aWR0aDowIDFweCAxcHggMDstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoNTAlKSByb3RhdGUoLTQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSB0cmFuc2xhdGVYKDUwJSkgcm90YXRlKC00NWRlZyl9LnVpLnN0ZXBzIC5zdGVwOmZpcnN0LWNoaWxke3BhZGRpbmctbGVmdDoyZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIC4yODU3MTQyOXJlbX0udWkuc3RlcHMgLnN0ZXA6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwfS51aS5zdGVwcyAuc3RlcDpsYXN0LWNoaWxke2JvcmRlci1yaWdodDpub25lO21hcmdpbi1yaWdodDowfS51aS5zdGVwcyAuc3RlcDpvbmx5LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtfS51aS5zdGVwcyAuc3RlcCAudGl0bGV7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW07Zm9udC13ZWlnaHQ6NzAwfS51aS5zdGVwcyAuc3RlcD4udGl0bGV7d2lkdGg6MTAwJX0udWkuc3RlcHMgLnN0ZXAgLmRlc2NyaXB0aW9ue2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6LjkyODU3MTQzZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zdGVwcyAuc3RlcD4uZGVzY3JpcHRpb257d2lkdGg6MTAwJX0udWkuc3RlcHMgLnN0ZXAgLnRpdGxlfi5kZXNjcmlwdGlvbnttYXJnaW4tdG9wOi4yNWVtfS51aS5zdGVwcyAuc3RlcD4uaWNvbntsaW5lLWhlaWdodDoxO2ZvbnQtc2l6ZToyLjVlbTttYXJnaW46MCAxcmVtIDAgMH0udWkuc3RlcHMgLnN0ZXA+Lmljb24sLnVpLnN0ZXBzIC5zdGVwPi5pY29ufi5jb250ZW50e2Rpc3BsYXk6YmxvY2s7LXdlYmtpdC1ib3gtZmxleDowOy1tcy1mbGV4OjAgMSBhdXRvO2ZsZXg6MCAxIGF1dG87LW1zLWZsZXgtaXRlbS1hbGlnbjptaWRkbGU7YWxpZ24tc2VsZjptaWRkbGV9LnVpLnN0ZXBzIC5zdGVwPi5pY29ufi5jb250ZW50ey13ZWJraXQtYm94LWZsZXg6MSAwIGF1dG87LW1zLWZsZXgtcG9zaXRpdmU6MSAwIGF1dG87ZmxleC1ncm93OjEgMCBhdXRvfS51aS5zdGVwczpub3QoLnZlcnRpY2FsKSAuc3RlcD4uaWNvbnt3aWR0aDphdXRvfS51aS5zdGVwcyAubGluay5zdGVwLC51aS5zdGVwcyBhLnN0ZXB7Y3Vyc29yOnBvaW50ZXJ9LnVpLm9yZGVyZWQuc3RlcHN7Y291bnRlci1yZXNldDpvcmRlcmVkfS51aS5vcmRlcmVkLnN0ZXBzIC5zdGVwOmJlZm9yZXtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnN0YXRpYzt0ZXh0LWFsaWduOmNlbnRlcjtjb250ZW50OmNvdW50ZXJzKG9yZGVyZWQsIFxcXCIuXFxcIik7LW1zLWZsZXgtaXRlbS1hbGlnbjptaWRkbGU7YWxpZ24tc2VsZjptaWRkbGU7bWFyZ2luLXJpZ2h0OjFyZW07Zm9udC1zaXplOjIuNWVtO2NvdW50ZXItaW5jcmVtZW50Om9yZGVyZWQ7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDo3MDB9LnVpLm9yZGVyZWQuc3RlcHMgLnN0ZXA+KntkaXNwbGF5OmJsb2NrOy1tcy1mbGV4LWl0ZW0tYWxpZ246bWlkZGxlO2FsaWduLXNlbGY6bWlkZGxlfS51aS52ZXJ0aWNhbC5zdGVwc3tkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWJveDtkaXNwbGF5Oi1tcy1pbmxpbmUtZmxleGJveDtkaXNwbGF5OmlubGluZS1mbGV4Oy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO292ZXJmbG93OnZpc2libGV9LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwey13ZWJraXQtYm94LXBhY2s6c3RhcnQ7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDtib3JkZXItcmFkaXVzOjA7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JvcmRlci1yaWdodDpub25lO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6Zmlyc3QtY2hpbGR7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwOmxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwOm9ubHktY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLnN0ZXBzIC5zdGVwOmFmdGVye2Rpc3BsYXk6bm9uZX0udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6YWZ0ZXJ7dG9wOjUwJTtyaWdodDowO2JvcmRlci13aWR0aDowIDFweCAxcHggMH0udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS52ZXJ0aWNhbC5zdGVwcyAuYWN0aXZlLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpibG9ja30udWkudmVydGljYWwuc3RlcHMgLnN0ZXA6bGFzdC1jaGlsZDphZnRlcntkaXNwbGF5Om5vbmV9LnVpLnZlcnRpY2FsLnN0ZXBzIC5hY3RpdmUuc3RlcDpsYXN0LWNoaWxkOmFmdGVye2Rpc3BsYXk6YmxvY2t9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuc3RlcHM6bm90KC51bnN0YWNrYWJsZSl7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleDtvdmVyZmxvdzp2aXNpYmxlOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufS51aS5zdGVwczpub3QoLnVuc3RhY2thYmxlKSAuc3RlcHt3aWR0aDoxMDAlIWltcG9ydGFudDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3JkZXItcmFkaXVzOjA7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtfS51aS5zdGVwczpub3QoLnVuc3RhY2thYmxlKSAuc3RlcDpmaXJzdC1jaGlsZHtwYWRkaW5nOjEuMTQyODU3MTRlbSAyZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuc3RlcHM6bm90KC51bnN0YWNrYWJsZSkgLnN0ZXA6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5zdGVwczpub3QoLnVuc3RhY2thYmxlKSAuc3RlcDphZnRlcntkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5zdGVwczpub3QoLnVuc3RhY2thYmxlKSAuc3RlcCAuY29udGVudHt0ZXh0LWFsaWduOmNlbnRlcn0udWkub3JkZXJlZC5zdGVwczpub3QoLnVuc3RhY2thYmxlKSAuc3RlcDpiZWZvcmUsLnVpLnN0ZXBzOm5vdCgudW5zdGFja2FibGUpIC5zdGVwPi5pY29ue21hcmdpbjowIDAgMXJlbSAwfX0udWkuc3RlcHMgLmxpbmsuc3RlcDpob3ZlciwudWkuc3RlcHMgLmxpbmsuc3RlcDpob3Zlcjo6YWZ0ZXIsLnVpLnN0ZXBzIGEuc3RlcDpob3ZlciwudWkuc3RlcHMgYS5zdGVwOmhvdmVyOjphZnRlcntiYWNrZ3JvdW5kOiNmOWZhZmI7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnN0ZXBzIC5saW5rLnN0ZXA6YWN0aXZlLC51aS5zdGVwcyAubGluay5zdGVwOmFjdGl2ZTo6YWZ0ZXIsLnVpLnN0ZXBzIGEuc3RlcDphY3RpdmUsLnVpLnN0ZXBzIGEuc3RlcDphY3RpdmU6OmFmdGVye2JhY2tncm91bmQ6I2YzZjRmNTtjb2xvcjpyZ2JhKDAsMCwwLC45KX0udWkuc3RlcHMgLnN0ZXAuYWN0aXZle2N1cnNvcjphdXRvO2JhY2tncm91bmQ6I2YzZjRmNX0udWkuc3RlcHMgLnN0ZXAuYWN0aXZlOmFmdGVye2JhY2tncm91bmQ6I2YzZjRmNX0udWkuc3RlcHMgLnN0ZXAuYWN0aXZlIC50aXRsZXtjb2xvcjojNDE4M2M0fS51aS5vcmRlcmVkLnN0ZXBzIC5zdGVwLmFjdGl2ZTpiZWZvcmUsLnVpLnN0ZXBzIC5hY3RpdmUuc3RlcCAuaWNvbntjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLnN0ZXBzIC5zdGVwOmFmdGVye2Rpc3BsYXk6YmxvY2t9LnVpLnN0ZXBzIC5hY3RpdmUuc3RlcDphZnRlcntkaXNwbGF5OmJsb2NrfS51aS5zdGVwcyAuc3RlcDpsYXN0LWNoaWxkOmFmdGVye2Rpc3BsYXk6bm9uZX0udWkuc3RlcHMgLmFjdGl2ZS5zdGVwOmxhc3QtY2hpbGQ6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5zdGVwcyAubGluay5hY3RpdmUuc3RlcDpob3ZlciwudWkuc3RlcHMgLmxpbmsuYWN0aXZlLnN0ZXA6aG92ZXI6OmFmdGVyLC51aS5zdGVwcyBhLmFjdGl2ZS5zdGVwOmhvdmVyLC51aS5zdGVwcyBhLmFjdGl2ZS5zdGVwOmhvdmVyOjphZnRlcntjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOiNkY2RkZGU7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5vcmRlcmVkLnN0ZXBzIC5zdGVwLmNvbXBsZXRlZDpiZWZvcmUsLnVpLnN0ZXBzIC5zdGVwLmNvbXBsZXRlZD4uaWNvbjpiZWZvcmV7Y29sb3I6IzIxYmE0NX0udWkuc3RlcHMgLmRpc2FibGVkLnN0ZXB7Y3Vyc29yOmF1dG87YmFja2dyb3VuZDojZmZmO3BvaW50ZXItZXZlbnRzOm5vbmV9LnVpLnN0ZXBzIC5kaXNhYmxlZC5zdGVwLC51aS5zdGVwcyAuZGlzYWJsZWQuc3RlcCAuZGVzY3JpcHRpb24sLnVpLnN0ZXBzIC5kaXNhYmxlZC5zdGVwIC50aXRsZXtjb2xvcjpyZ2JhKDQwLDQwLDQwLC4zKX0udWkuc3RlcHMgLmRpc2FibGVkLnN0ZXA6YWZ0ZXJ7YmFja2dyb3VuZDojZmZmfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo5OTFweCl7LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnN0ZXBze2Rpc3BsYXk6LXdlYmtpdC1pbmxpbmUtYm94O2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94O2Rpc3BsYXk6aW5saW5lLWZsZXg7b3ZlcmZsb3c6dmlzaWJsZTstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHMgLnN0ZXB7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ym9yZGVyLXJhZGl1czowO3BhZGRpbmc6MS4xNDI4NTcxNGVtIDJlbX0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHMgLnN0ZXA6Zmlyc3QtY2hpbGR7cGFkZGluZzoxLjE0Mjg1NzE0ZW0gMmVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnN0ZXBzIC5zdGVwOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHMgLnN0ZXA6YWZ0ZXJ7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0uc3RlcHMgLnN0ZXAgLmNvbnRlbnR7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLm9yZGVyZWQuc3RlcHMgLnN0ZXA6YmVmb3JlLC51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS5zdGVwcyAuc3RlcD4uaWNvbnttYXJnaW46MCAwIDFyZW0gMH19LnVpLmZsdWlkLnN0ZXBze2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJX0udWkuYXR0YWNoZWQuc3RlcHN7d2lkdGg6Y2FsYygxMDAlICsgMnB4KSFpbXBvcnRhbnQ7bWFyZ2luOjAgLTFweCAwO21heC13aWR0aDpjYWxjKDEwMCUgKyAycHgpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLmF0dGFjaGVkLnN0ZXBzIC5zdGVwOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAwfS51aS5hdHRhY2hlZC5zdGVwcyAuc3RlcDpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gMCAwfS51aS5ib3R0b20uYXR0YWNoZWQuc3RlcHN7bWFyZ2luOjAgLTFweCAwO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLmJvdHRvbS5hdHRhY2hlZC5zdGVwcyAuc3RlcDpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAwIC4yODU3MTQyOXJlbX0udWkuYm90dG9tLmF0dGFjaGVkLnN0ZXBzIC5zdGVwOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIDB9LnVpLmVpZ2h0LnN0ZXBzLC51aS5maXZlLnN0ZXBzLC51aS5mb3VyLnN0ZXBzLC51aS5vbmUuc3RlcHMsLnVpLnNldmVuLnN0ZXBzLC51aS5zaXguc3RlcHMsLnVpLnRocmVlLnN0ZXBzLC51aS50d28uc3RlcHN7d2lkdGg6MTAwJX0udWkuZWlnaHQuc3RlcHM+LnN0ZXAsLnVpLmZpdmUuc3RlcHM+LnN0ZXAsLnVpLmZvdXIuc3RlcHM+LnN0ZXAsLnVpLm9uZS5zdGVwcz4uc3RlcCwudWkuc2V2ZW4uc3RlcHM+LnN0ZXAsLnVpLnNpeC5zdGVwcz4uc3RlcCwudWkudGhyZWUuc3RlcHM+LnN0ZXAsLnVpLnR3by5zdGVwcz4uc3RlcHstbXMtZmxleC13cmFwOm5vd3JhcDtmbGV4LXdyYXA6bm93cmFwfS51aS5vbmUuc3RlcHM+LnN0ZXB7d2lkdGg6MTAwJX0udWkudHdvLnN0ZXBzPi5zdGVwe3dpZHRoOjUwJX0udWkudGhyZWUuc3RlcHM+LnN0ZXB7d2lkdGg6MzMuMzMzJX0udWkuZm91ci5zdGVwcz4uc3RlcHt3aWR0aDoyNSV9LnVpLmZpdmUuc3RlcHM+LnN0ZXB7d2lkdGg6MjAlfS51aS5zaXguc3RlcHM+LnN0ZXB7d2lkdGg6MTYuNjY2JX0udWkuc2V2ZW4uc3RlcHM+LnN0ZXB7d2lkdGg6MTQuMjg1JX0udWkuZWlnaHQuc3RlcHM+LnN0ZXB7d2lkdGg6MTIuNSV9LnVpLm1pbmkuc3RlcCwudWkubWluaS5zdGVwcyAuc3RlcHtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LnN0ZXAsLnVpLnRpbnkuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuc3RlcCwudWkuc21hbGwuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOi45Mjg1NzE0M3JlbX0udWkuc3RlcCwudWkuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLnN0ZXAsLnVpLmxhcmdlLnN0ZXBzIC5zdGVwe2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuc3RlcCwudWkuYmlnLnN0ZXBzIC5zdGVwe2ZvbnQtc2l6ZToxLjI4NTcxNDI5cmVtfS51aS5odWdlLnN0ZXAsLnVpLmh1Z2Uuc3RlcHMgLnN0ZXB7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LnVpLm1hc3NpdmUuc3RlcCwudWkubWFzc2l2ZS5zdGVwcyAuc3RlcHtmb250LXNpemU6MS43MTQyODU3MXJlbX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OlN0ZXA7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7Y2hhcnNldD11dGYtODs7YmFzZTY0LEFBRUFBQUFPQUlBQUF3QmdUMU12TWozaFNRRUFBQURzQUFBQVZtTnRZWERRRWhtM0FBQUJSQUFBQVVwamRuUWdCa24vbEFBQUJ1d0FBQUFjWm5CbmJZb0tlRHNBQUFjSUFBQUprV2RoYzNBQUFBQVFBQUFHNUFBQUFBaG5iSGxtMzJjRWRnQUFBcEFBQUFDMmFHVmhaQUVyUEhzQUFBTklBQUFBTm1ob1pXRUhVd05OQUFBRGdBQUFBQ1JvYlhSNEN5a0FBQUFBQTZRQUFBQU1iRzlqWVFBNEFGc0FBQU93QUFBQUNHMWhlSEFBcGdtOEFBQUR1QUFBQUNCdVlXMWx6SjBhSEFBQUE5Z0FBQUxOY0c5emRLNjlRSmdBQUFhb0FBQUFPM0J5WlhDU29aci9BQUFRbkFBQUFGWUFBUU80QVpBQUJRQUlBbm9DdkFBQUFJd0NlZ0s4QUFBQjRBQXhBUUlBQUFJQUJRTUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBVUdaRlpBQkE2QURvQVFOUy8yb0FXZ01MQUU4QUFBQUJBQUFBQUFBQUFBQUFBd0FBQUFNQUFBQWNBQUVBQUFBQUFFUUFBd0FCQUFBQUhBQUVBQ2dBQUFBR0FBUUFBUUFDQUFEb0FmLy9BQUFBQU9nQS8vOEFBQmdCQUFFQUFBQUFBQUFBQUFFR0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFRQUFBQUFEcEFLWUFCVUFIRUFaRHdFQUFRRkNBQUlCQW1vQUFRQUJhZ0FBQUdFVUZ4UURFaXNCRkFjQkJpSW5BU1kwUHdFMk1oOEJBVFl5SHdFV0E2UVAvaUFRTEJEKzZnOFBUQkFzRUtRQmJoQXNFRXdQQWhZV0VQNGdEdzhCRmhBc0VFd1FFS1VCYnhBUVRCQUFBQUgvL2YreEExOERDd0FNQUJKQUR3QUJBUXBEQUFBQUN3QkVGUk1DRVNzQkZBNEJJaTRDUGdFeUhnRURXWExHNk1odUJucTg5THArQVY1MXhIUjB4T3JFZEhURUFBQUFBQUVBQUFBQkFBRERlUnBkWHc4ODlRQUxBK2dBQUFBQXp6V1lqUUFBQUFEUE5XQk4vLzMvc1FPa0F3c0FBQUFJQUFJQUFBQUFBQUFBQVFBQUExTC9hZ0JhQStnQUFQLzNBNlFBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQU1ENkFBQUErZ0FBQU5aQUFBQUFBQUFBRGdBV3dBQkFBQUFBd0FXQUFFQUFBQUFBQUlBQmdBVEFHNEFBQUF0Q1pFQUFBQUFBQUFBRWdEZUFBRUFBQUFBQUFBQU5RQUFBQUVBQUFBQUFBRUFDQUExQUFFQUFBQUFBQUlBQndBOUFBRUFBQUFBQUFNQUNBQkVBQUVBQUFBQUFBUUFDQUJNQUFFQUFBQUFBQVVBQ3dCVUFBRUFBQUFBQUFZQUNBQmZBQUVBQUFBQUFBb0FLd0JuQUFFQUFBQUFBQXNBRXdDU0FBTUFBUVFKQUFBQWFnQ2xBQU1BQVFRSkFBRUFFQUVQQUFNQUFRUUpBQUlBRGdFZkFBTUFBUVFKQUFNQUVBRXRBQU1BQVFRSkFBUUFFQUU5QUFNQUFRUUpBQVVBRmdGTkFBTUFBUVFKQUFZQUVBRmpBQU1BQVFRSkFBb0FWZ0Z6QUFNQUFRUUpBQXNBSmdISlEyOXdlWEpwWjJoMElDaERLU0F5TURFMElHSjVJRzl5YVdkcGJtRnNJR0YxZEdodmNuTWdRQ0JtYjI1MFpXeHNieTVqYjIxbWIyNTBaV3hzYjFKbFozVnNZWEptYjI1MFpXeHNiMlp2Ym5SbGJHeHZWbVZ5YzJsdmJpQXhMakJtYjI1MFpXeHNiMGRsYm1WeVlYUmxaQ0JpZVNCemRtY3lkSFJtSUdaeWIyMGdSbTl1ZEdWc2JHOGdjSEp2YW1WamRDNW9kSFJ3T2k4dlptOXVkR1ZzYkc4dVkyOXRBRU1BYndCd0FIa0FjZ0JwQUdjQWFBQjBBQ0FBS0FCREFDa0FJQUF5QURBQU1RQTBBQ0FBWWdCNUFDQUFid0J5QUdrQVp3QnBBRzRBWVFCc0FDQUFZUUIxQUhRQWFBQnZBSElBY3dBZ0FFQUFJQUJtQUc4QWJnQjBBR1VBYkFCc0FHOEFMZ0JqQUc4QWJRQm1BRzhBYmdCMEFHVUFiQUJzQUc4QVVnQmxBR2NBZFFCc0FHRUFjZ0JtQUc4QWJnQjBBR1VBYkFCc0FHOEFaZ0J2QUc0QWRBQmxBR3dBYkFCdkFGWUFaUUJ5QUhNQWFRQnZBRzRBSUFBeEFDNEFNQUJtQUc4QWJnQjBBR1VBYkFCc0FHOEFSd0JsQUc0QVpRQnlBR0VBZEFCbEFHUUFJQUJpQUhrQUlBQnpBSFlBWndBeUFIUUFkQUJtQUNBQVpnQnlBRzhBYlFBZ0FFWUFid0J1QUhRQVpRQnNBR3dBYndBZ0FIQUFjZ0J2QUdvQVpRQmpBSFFBTGdCb0FIUUFkQUJ3QURvQUx3QXZBR1lBYndCdUFIUUFaUUJzQUd3QWJ3QXVBR01BYndCdEFBQUFBQUlBQUFBQUFBQUFDZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUF3QUFBUUlCQXdsamFHVmphMjFoY21zR1kybHlZMnhsQUFBQUFBRUFBZi8vQUE4QUFBQUFBQUFBQUFBQUFBQUFBQUFBQURJQU1nTUwvN0VEQy8reHNBQXNzQ0JnWmkyd0FTd2daQ0N3d0ZDd0JDWmFzQVJGVzFnaEl5RWJpbGdnc0ZCUVdDR3dRRmtiSUxBNFVGZ2hzRGhaV1NDd0NrVmhaTEFvVUZnaHNBcEZJTEF3VUZnaHNEQlpHeUN3d0ZCWUlHWWdpb3BoSUxBS1VGaGdHeUN3SUZCWUliQUtZQnNnc0RaUVdDR3dObUFiWUZsWldSdXdBQ3RaV1NPd0FGQllaVmxaTGJBQ0xDQkZJTEFFSldGa0lMQUZRMUJZc0FValFyQUdJMEliSVNGWnNBRmdMYkFETENNaEl5RWdaTEVGWWtJZ3NBWWpRcklLQUFJcUlTQ3dCa01naWlDS3NBQXJzVEFGSllwUldHQlFHMkZTV1ZnaldTRWdzRUJUV0xBQUt4c2hzRUJaSTdBQVVGaGxXUzJ3QkN5d0IwTXJzZ0FDQUVOZ1FpMndCU3l3QnlOQ0l5Q3dBQ05DWWJDQVlyQUJZTEFFS2kyd0Jpd2dJRVVnc0FKRlk3QUJSV0pnUkxBQllDMndCeXdnSUVVZ3NBQXJJN0VDQkNWZ0lFV0tJMkVnWkNDd0lGQllJYkFBRzdBd1VGaXdJQnV3UUZsWkk3QUFVRmhsV2JBREpTTmhSRVN3QVdBdHNBZ3NzUVVGUmJBQllVUXRzQWtzc0FGZ0lDQ3dDVU5Lc0FCUVdDQ3dDU05DV2JBS1EwcXdBRkpZSUxBS0kwSlpMYkFLTENDNEJBQmlJTGdFQUdPS0kyR3dDME5nSUlwZ0lMQUxJMElqTGJBTExFdFVXTEVIQVVSWkpMQU5aU040TGJBTUxFdFJXRXRUV0xFSEFVUlpHeUZaSkxBVFpTTjRMYkFOTExFQURFTlZXTEVNREVPd0FXRkNzQW9yV2JBQVE3QUNKVUt4Q1FJbFFyRUtBaVZDc0FFV0l5Q3dBeVZRV0xFQkFFTmdzQVFsUW9xS0lJb2pZYkFKS2lFanNBRmhJSW9qWWJBSktpRWJzUUVBUTJDd0FpVkNzQUlsWWJBSktpRlpzQWxEUjdBS1EwZGdzSUJpSUxBQ1JXT3dBVVZpWUxFQUFCTWpSTEFCUTdBQVBySUJBUUZEWUVJdHNBNHNzUUFGUlZSWUFMQU1JMElnWUxBQlliVU5EUUVBQ3dCQ1FvcGdzUTBGSzdCdEt4c2lXUzJ3RHl5eEFBNHJMYkFRTExFQkRpc3RzQkVzc1FJT0t5MndFaXl4QXc0ckxiQVRMTEVFRGlzdHNCUXNzUVVPS3kyd0ZTeXhCZzRyTGJBV0xMRUhEaXN0c0Jjc3NRZ09LeTJ3R0N5eENRNHJMYkFaTExBSUs3RUFCVVZVV0FDd0RDTkNJR0N3QVdHMURRMEJBQXNBUWtLS1lMRU5CU3V3YlNzYklsa3RzQm9zc1FBWkt5MndHeXl4QVJrckxiQWNMTEVDR1NzdHNCMHNzUU1aS3kyd0hpeXhCQmtyTGJBZkxMRUZHU3N0c0NBc3NRWVpLeTJ3SVN5eEJ4a3JMYkFpTExFSUdTc3RzQ01zc1FrWkt5MndKQ3dnUExBQllDMndKU3dnWUxBTllDQkRJN0FCWUVPd0FpVmhzQUZnc0NRcUlTMndKaXl3SlN1d0pTb3RzQ2NzSUNCSElDQ3dBa1Zqc0FGRlltQWpZVGdqSUlwVldDQkhJQ0N3QWtWanNBRkZZbUFqWVRnYklWa3RzQ2dzc1FBRlJWUllBTEFCRnJBbktyQUJGVEFiSWxrdHNDa3NzQWdyc1FBRlJWUllBTEFCRnJBbktyQUJGVEFiSWxrdHNDb3NJRFd3QVdBdHNDc3NBTEFEUldPd0FVVmlzQUFyc0FKRlk3QUJSV0t3QUN1d0FCYTBBQUFBQUFCRVBpTTRzU29CRlNvdHNDd3NJRHdnUnlDd0FrVmpzQUZGWW1Dd0FFTmhPQzJ3TFN3dUZ6d3RzQzRzSUR3Z1J5Q3dBa1Zqc0FGRlltQ3dBRU5oc0FGRFl6Z3RzQzhzc1FJQUZpVWdMaUJIc0FBalFyQUNKVW1LaWtjalJ5TmhJRmhpR3lGWnNBRWpRckl1QVFFVkZDb3RzREFzc0FBV3NBUWxzQVFsUnlOSEkyR3dCa1VyWllvdUl5QWdQSW80TGJBeExMQUFGckFFSmJBRUpTQXVSeU5ISTJFZ3NBUWpRckFHUlNzZ3NHQlFXQ0N3UUZGWXN3SWdBeUFic3dJbUF4cFpRa0lqSUxBSVF5Q0tJMGNqUnlOaEkwWmdzQVJEc0lCaVlDQ3dBQ3NnaW9waElMQUNRMkJrSTdBRFEyRmtVRml3QWtOaEc3QURRMkJac0FNbHNJQmlZU01nSUxBRUppTkdZVGdiSTdBSVEwYXdBaVd3Q0VOSEkwY2pZV0Fnc0FSRHNJQmlZQ01nc0FBckk3QUVRMkN3QUN1d0JTVmhzQVVsc0lCaXNBUW1ZU0N3QkNWZ1pDT3dBeVZnWkZCWUlSc2pJVmtqSUNDd0JDWWpSbUU0V1Myd01peXdBQllnSUNDd0JTWWdMa2NqUnlOaEl6dzRMYkF6TExBQUZpQ3dDQ05DSUNBZ1JpTkhzQUFySTJFNExiQTBMTEFBRnJBREpiQUNKVWNqUnlOaHNBQlVXQzRnUENNaEc3QUNKYkFDSlVjalJ5TmhJTEFGSmJBRUpVY2pSeU5oc0FZbHNBVWxTYkFDSldHd0FVVmpJeUJZWWhzaFdXT3dBVVZpWUNNdUl5QWdQSW80SXlGWkxiQTFMTEFBRmlDd0NFTWdMa2NqUnlOaElHQ3dJR0Jtc0lCaUl5QWdQSW80TGJBMkxDTWdMa2F3QWlWR1VsZ2dQRmt1c1NZQkZDc3RzRGNzSXlBdVJyQUNKVVpRV0NBOFdTNnhKZ0VVS3kyd09Dd2pJQzVHc0FJbFJsSllJRHhaSXlBdVJyQUNKVVpRV0NBOFdTNnhKZ0VVS3kyd09TeXdNQ3NqSUM1R3NBSWxSbEpZSUR4WkxyRW1BUlFyTGJBNkxMQXhLNG9nSUR5d0JDTkNpamdqSUM1R3NBSWxSbEpZSUR4WkxyRW1BUlFyc0FSRExyQW1LeTJ3T3l5d0FCYXdCQ1d3QkNZZ0xrY2pSeU5oc0FaRkt5TWdQQ0F1SXppeEpnRVVLeTJ3UEN5eENBUWxRckFBRnJBRUpiQUVKU0F1UnlOSEkyRWdzQVFqUXJBR1JTc2dzR0JRV0NDd1FGRllzd0lnQXlBYnN3SW1BeHBaUWtJaklFZXdCRU93Z0dKZ0lMQUFLeUNLaW1FZ3NBSkRZR1Fqc0FORFlXUlFXTEFDUTJFYnNBTkRZRm13QXlXd2dHSmhzQUlsUm1FNEl5QThJemdiSVNBZ1JpTkhzQUFySTJFNElWbXhKZ0VVS3kyd1BTeXdNQ3N1c1NZQkZDc3RzRDRzc0RFcklTTWdJRHl3QkNOQ0l6aXhKZ0VVSzdBRVF5NndKaXN0c0Q4c3NBQVZJRWV3QUNOQ3NnQUJBUlVVRXk2d0xDb3RzRUFzc0FBVklFZXdBQ05Dc2dBQkFSVVVFeTZ3TENvdHNFRXNzUUFCRkJPd0xTb3RzRUlzc0M4cUxiQkRMTEFBRmtVaklDNGdSb29qWVRpeEpnRVVLeTJ3UkN5d0NDTkNzRU1yTGJCRkxMSUFBRHdyTGJCR0xMSUFBVHdyTGJCSExMSUJBRHdyTGJCSUxMSUJBVHdyTGJCSkxMSUFBRDByTGJCS0xMSUFBVDByTGJCTExMSUJBRDByTGJCTUxMSUJBVDByTGJCTkxMSUFBRGtyTGJCT0xMSUFBVGtyTGJCUExMSUJBRGtyTGJCUUxMSUJBVGtyTGJCUkxMSUFBRHNyTGJCU0xMSUFBVHNyTGJCVExMSUJBRHNyTGJCVUxMSUJBVHNyTGJCVkxMSUFBRDRyTGJCV0xMSUFBVDRyTGJCWExMSUJBRDRyTGJCWUxMSUJBVDRyTGJCWkxMSUFBRG9yTGJCYUxMSUFBVG9yTGJCYkxMSUJBRG9yTGJCY0xMSUJBVG9yTGJCZExMQXlLeTZ4SmdFVUt5MndYaXl3TWl1d05pc3RzRjhzc0RJcnNEY3JMYkJnTExBQUZyQXlLN0E0S3kyd1lTeXdNeXN1c1NZQkZDc3RzR0lzc0RNcnNEWXJMYkJqTExBeks3QTNLeTJ3WkN5d015dXdPQ3N0c0dVc3NEUXJMckVtQVJRckxiQm1MTEEwSzdBMkt5MndaeXl3TkN1d055c3RzR2dzc0RRcnNEZ3JMYkJwTExBMUt5NnhKZ0VVS3kyd2FpeXdOU3V3TmlzdHNHc3NzRFVyc0RjckxiQnNMTEExSzdBNEt5MndiU3dyc0FobHNBTWtVSGl3QVJVd0xRQUFBRXU0QU1oU1dMRUJBWTVadVFnQUNBQmpJTEFCSTBTd0F5TndzZ1FvQ1VWU1JMSUtBZ2Nxc1FZQlJMRWtBWWhSV0xCQWlGaXhCZ05Fc1NZQmlGRll1QVFBaUZpeEJnRkVXVmxaV2JnQi80V3dCSTJ4QlFCRUFBQT0pIGZvcm1hdCgndHJ1ZXR5cGUnKSx1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUFvVUFBNEFBQUFBRVBRQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJQVXk4eUFBQUJSQUFBQUVRQUFBQldQZUZKQVdOdFlYQUFBQUdJQUFBQU9nQUFBVXJRRWhtM1kzWjBJQUFBQWNRQUFBQVVBQUFBSEFaSi81Um1jR2R0QUFBQjJBQUFCUGtBQUFtUmlncDRPMmRoYzNBQUFBYlVBQUFBQ0FBQUFBZ0FBQUFRWjJ4NVpnQUFCdHdBQUFDdUFBQUF0dDluQkhab1pXRmtBQUFIakFBQUFEVUFBQUEyQVNzOGUyaG9aV0VBQUFmRUFBQUFJQUFBQUNRSFV3Tk5hRzEwZUFBQUIrUUFBQUFNQUFBQURBc3BBQUJzYjJOaEFBQUg4QUFBQUFnQUFBQUlBRGdBVzIxaGVIQUFBQWY0QUFBQUlBQUFBQ0FBcGdtOGJtRnRaUUFBQ0JnQUFBRjNBQUFDemN5ZEdoeHdiM04wQUFBSmtBQUFBQ29BQUFBN3JyMUFtSEJ5WlhBQUFBbThBQUFBVmdBQUFGYVNvWnIvZUp4allHVGV3VGlCZ1pXQmc2bUthUThEQTBNUGhHWjh3R0RJeU1UQXdNVEF5c3lBRlFTa3VhWXdPTHhnZU1ISUhQUS9peUdLbVp2Qkh5ak1DSklEQVBlOUMyQjRuR05nWUdCbWdHQVpCa1lHRUhBQjhoakJmQllHRFNETkJxUVpHWmdZR0Y0dy92OFBVdkNDQVVSTE1FTFZBd0VqRzhPSUJ3Qms1QWF2QUFCNG5HTmdRQU5HREViTTNQODNnakFBRUxRRDRYaWNuVlhaZHROV0ZKVThaSEFTT21TZ29BN1gzRGhRNjhxRUtSZ3dhU3JGZGlFZEhBaXRCQjJrREhUa25jYys2MnVPUXJ0V0gvbTA3bjA5SkxSMHJiWXNscysrUjF0bjJEcm5SaHdqS24wYWlHdlVvWktYQTZtc1BaWks5MGxjMTNVdmo1VU1CbkZkdGhKUFNadW9uU1JLYXQzc1VDN3hXT3NxV1NkWUorUGxJRlpQVlo1bm9BemlGQjVsU1VRYlJCdXBseVpKNG9uako0a1daeEFmSlVrZ0phTVFwOUxJVUVJMUdzUlMxYUZNNmRDcjF4TngwMERLUnFNZWRWaFU5MFBGSjhjMXA5U3NBMFlxVnpuQ0ZldlZScjRicHdNdmU1REVPc0d6clljeEhuaXNmcFFxa0lxUjZjZy9ka3BPbElhQlZISFVvVmJpNkRDVFgvZVJUQ3JOUUthTVlrV2w3b0c0M2YxMDJ4WXhQWFE2dmk1S2xVYXF1cm5PS0pydDBmR29neWdQMmNicHBOelEyZmJ3NVJsVFZLdGRjYlB0UUdZTlhFckpiSFNmUkFBZEpsTGo2UUZPTlp3Q3FSbjFSOFhaNTg4QkVzbGNsS284VlRLSGVnT1pNenQ3Y1RIdGJpZXJzbkNrbndjeWIzWjI0NTJIUTZkWGgzL1IraGRNNGN4SGorSmlmajVDK2xCcWZpSk9KS1ZHV016eXA0WWZjVmNnUXJreGlBc1h5dUJUaERsMFJkclpabDNqdFRIMmhzLzVTcWxoUFFuYTZLUDRmZ3I5VGlRckhHZFJvL1ZJbk0xajEzV3QzR2RRUzdXN0Z6c3lyME9WSXU3dkN3dXVNK2VFWVo0V0MxVmZudm5lQlRUL0JvaG4vRURlTklWTCs1WXBTclJ2bTZKTXUyaUtDdTBTVktWZE5zVVU3WW9wcG1uUG1tS0c5aDFUek5LZU16TGovOHZjNTVIN0hON3hrSnYyWGVTbWZRKzVhZDlIYnRvUGtKdFdJVGR0SGJscEx5QTNyVVp1MmxXak9uWUVHZ1pwRjFJVlFkQTBzdnBoM0ZhYjlVRFdqRFI4YVdEeUxtTEkrdXBFUjUyMXRjb2Z4WDkxNGdzSGNtbWlwN3NpRjV2aUxxL2JGajQ4M2U2cmo1cEczYkRWK01hUjhqQWVSbm9jbXRCWitjM2h2KzFOM1M2YTdqS3FNdWdCRlV3S3dBQmw3VUFDMHpyYkNhVDFtcWY0OGdkZ1hJWjR6a3BEdFZTZk80YW03K1Y1WC9leE9mRyt4KzNHTHJkY2Qza0pXZFlOY21QMjhOOVNaS3JySCtVdHJWUW5SNndySjQ5VmF4aERLcndvdXI2U2xIdTB0UnUvS0tteThsNlUxc3JuazVDYlBZTWJRbHUyN21Hd0kweHB5aVVlWGxPbEtEM1VVbzZ5UXl4dktjbzg0SlNMQzFxR3hMZ09kUTlxYThUcG9Yb1lHd3NoaHFHMHZSQndTQ2xkRmQrMHluZnhIcXRyMk9qNHhSWGg2WHB5RWhHZjRpcjdVZkJVMTBiOTZBN2F2R2JkTW9NcFZhcW4rNHhQc2EvYjlsRlphYVNPc3hlM1ZBZlhOT3NhT1JYVFQrUnI0SFJ2T0dqZEF6MVVmRFJCSTFVMXgrakdLR00wbGpYbDN3UjBNVlordzJqVll2czkzRStkcEZXc3VVdVk3SnNUOStDMHUvMHErN1djVzBiVy9kY0d2VzNraXA4ak1iOHRDdnc3QjJLM1pBM1VPNU9CR0F2SVdkQVl4aFltZHhpdWcyM0ViZlkvSnFmLzM0YUZSWEpYT3hxN2VlckQxWk5SSlhmWjhyakxUWFpaMTZNMlI5Vk9HdnNJalMwUE4rYlk0WElzdHNSZ1FiYit3Zjh4N2dGM2FWRUM0TkRJWlppSTJuU2hudXJoNmg2cnNXMDRWeElCZHMyeDQzUUFlZ0F1UWQ4Y3U5YnpDWUQxM0NQbkxzQjljZ2gyeUNINGxCeUN6OGk1QmZBNU9RUmZrRU13SUlkZ2w1dzdBQS9JSVhoSURzRWVPUVNQeU5rRStKSWNncS9JSVlqSklVakl1UTN3bUJ5Q0orUVFmRTBPd1RkR3JrNWsvcFlIMlFENnpxS2JRS21kR2h6YU9HUkdyazNZK3p4WTlvRkZaQjlhUk9xUmtlc1Q2bE1lTFBWN2kwajl3U0pTZnpSeVkwTDlpUWRML2RraVVuK3hpTlJueHBlWkl5bXZEcDd6amc3K0JKZnFyVjRBQUFBQUFRQUIvLzhBRDNpY1kyQmtBQUxtSlV3ekdFUVpaQndrK1JrWkdCbWRHSmdZbWJJWWdNd3NvR1NpaUxnSXM1QTJvd2c3STV1U09xT2FpVDJqbVpFOEk1Z1FZMTdDLzA5QlFFZmczeXQrZmg4Z3ZZUXhEMGo2OERPSmlRbjhVK0RuWnhRRGNRVUVsakxtQ3dCcEJnYkcvMy8vYjJTT1orWm00R0VRY3VBSDJzYmxETFNFbThGRlZKaEpFR2dMSDZPU0hwTWRvNUVjSTNOazBiRVhKL0xZcXZaODJWWEhHRmQ2cEtUa3lDc1F3UUFBcStRa3FBQUFlSnhqWUdSZ1lBRGl3NVZTc2ZIOE5sOFp1SmxmQUVVWXpwdk82SVhRQ2I3Ly8vN2Z5THlFbVJ2STVXQmdBb2tDQUZiL0RKQUFBQUI0bkdOZ1pHQmdEdnFmeFJERi9JS0I0ZjkzNWlVTVFCRVV3QXdBaTVZRnBnUG9BQUFENkFBQUExa0FBQUFBQUFBQU9BQmJBQUVBQUFBREFCWUFBUUFBQUFBQUFnQUdBQk1BYmdBQUFDMEprUUFBQUFCNG5IV1F5MnJDUUJTRy8vSFNpMEpiV3VpMnN5cEthYnhnTjRJZ1dIVFRicVM0TFRIR0pCSXpNaGtGWDZQdjBJZnBTL1JaK3B1TXBTaE5tTXgzdmpsejVtUUFYT01iQXZuenhKR3p3Qm1qbkFzNFJjOXlrZjdaY29uOFlybU1LdDRzbjlDL1c2N2dBWUhsS203d3dRcWlkTTVvZ1UvTEFsZmkwbklCRitMT2NwSCswWEtKM0xOY3hxMTR0WHhDNzFtdVlDSlN5MVhjaTYrQldtMTFGSVJHMWdaMTJXNjJPbks2bFlvcVN0eFl1bXNUS3AzS3ZweXJ4UGh4ckJ4UExmYzg5b04xN09wOXVKOG52azRqbGNpVzA5eXJrWi80MmpYK2JGYzkzUVJ0WStaeXJ0VlNEbTJHWEdtMThEM2poTWFzdW8zRzMvTXdnTUlLVzJoRXZLb1FCaEkxMmpybk5wcG9vVU9hTWtNeU04K0trTUJGVE9OaXpSMWh0cEl5N25QTUdTVzBQak5pc2dPUDMrV1JINU1DN285WlJSK3RIc1lUMHU2TUtQT1NmVG5zN2pCclJFcXlURGV6czkvZVUyeDRXcHZXY05ldVM1MTFKVEU4cUNGNUg3dTFCWTFINzJTM1ltaTdhUEQ5NS85K0FOMWZoRXNBZUp4allHS0FBQzRHN0lDWmdZR1JpWkdaTXprak5UazdON0VvbXkwNXN5ZzVKNVdCQVFCRTFRWkJBQUJMdUFESVVsaXhBUUdPV2JrSUFBZ0FZeUN3QVNORXNBTWpjTElFS0FsRlVrU3lDZ0lIS3JFR0FVU3hKQUdJVVZpd1FJaFlzUVlEUkxFbUFZaFJXTGdFQUloWXNRWUJSRmxaV1ZtNEFmK0ZzQVNOc1FVQVJBQUEpIGZvcm1hdCgnd29mZicpfS51aS5vcmRlcmVkLnN0ZXBzIC5zdGVwLmNvbXBsZXRlZDpiZWZvcmUsLnVpLnN0ZXBzIC5zdGVwLmNvbXBsZXRlZD4uaWNvbjpiZWZvcmV7Zm9udC1mYW1pbHk6U3RlcDtjb250ZW50OidcXFxcZTgwMCd9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEJyZWFkY3J1bWJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5icmVhZGNydW1ie2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmJyZWFkY3J1bWI6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5icmVhZGNydW1iOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5icmVhZGNydW1iIC5kaXZpZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO29wYWNpdHk6Ljc7bWFyZ2luOjAgLjIxNDI4NTcxcmVtIDA7Zm9udC1zaXplOi45Mjg1NzE0M2VtO2NvbG9yOnJnYmEoMCwwLDAsLjQpO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS51aS5icmVhZGNydW1iIGF7Y29sb3I6IzQxODNjNH0udWkuYnJlYWRjcnVtYiBhOmhvdmVye2NvbG9yOiMxZTcwYmZ9LnVpLmJyZWFkY3J1bWIgLmljb24uZGl2aWRlcntmb250LXNpemU6Ljg1NzE0Mjg2ZW07dmVydGljYWwtYWxpZ246YmFzZWxpbmV9LnVpLmJyZWFkY3J1bWIgYS5zZWN0aW9ue2N1cnNvcjpwb2ludGVyfS51aS5icmVhZGNydW1iIC5zZWN0aW9ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowO3BhZGRpbmc6MH0udWkuYnJlYWRjcnVtYi5zZWdtZW50e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmc6Ljc4NTcxNDI5ZW0gMWVtfS51aS5icmVhZGNydW1iIC5hY3RpdmUuc2VjdGlvbntmb250LXdlaWdodDo3MDB9LnVpLm1pbmkuYnJlYWRjcnVtYntmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LmJyZWFkY3J1bWJ7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuYnJlYWRjcnVtYntmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5icmVhZGNydW1ie2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5icmVhZGNydW1ie2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuYnJlYWRjcnVtYntmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5icmVhZGNydW1ie2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLmJyZWFkY3J1bWJ7Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEZvcm1cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5mb3Jte3Bvc2l0aW9uOnJlbGF0aXZlO21heC13aWR0aDoxMDAlfS51aS5mb3JtPnB7bWFyZ2luOjFlbSAwfS51aS5mb3JtIC5maWVsZHtjbGVhcjpib3RoO21hcmdpbjowIDAgMWVtfS51aS5mb3JtIC5maWVsZDpsYXN0LWNoaWxkLC51aS5mb3JtIC5maWVsZHM6bGFzdC1jaGlsZCAuZmllbGR7bWFyZ2luLWJvdHRvbTowfS51aS5mb3JtIC5maWVsZHMgLmZpZWxke2NsZWFyOmJvdGg7bWFyZ2luOjB9LnVpLmZvcm0gLmZpZWxkPmxhYmVse2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgMCAuMjg1NzE0MjlyZW0gMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Zm9udC1zaXplOi45Mjg1NzE0M2VtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTpub25lfS51aS5mb3JtIGlucHV0Om5vdChbdHlwZV0pLC51aS5mb3JtIGlucHV0W3R5cGU9ZGF0ZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1lbWFpbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1maWxlXSwudWkuZm9ybSBpbnB1dFt0eXBlPW51bWJlcl0sLnVpLmZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1zZWFyY2hdLC51aS5mb3JtIGlucHV0W3R5cGU9dGVsXSwudWkuZm9ybSBpbnB1dFt0eXBlPXRleHRdLC51aS5mb3JtIGlucHV0W3R5cGU9dGltZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT11cmxdLC51aS5mb3JtIHRleHRhcmVhe3dpZHRoOjEwMCU7dmVydGljYWwtYWxpZ246dG9wfS51aS5mb3JtIDo6LXdlYmtpdC1kYXRldGltZS1lZGl0LC51aS5mb3JtIDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbntoZWlnaHQ6MS4yMTQyODU3MWVtfS51aS5mb3JtIGlucHV0Om5vdChbdHlwZV0pLC51aS5mb3JtIGlucHV0W3R5cGU9ZGF0ZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT1kYXRldGltZS1sb2NhbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1lbWFpbF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1maWxlXSwudWkuZm9ybSBpbnB1dFt0eXBlPW51bWJlcl0sLnVpLmZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0sLnVpLmZvcm0gaW5wdXRbdHlwZT1zZWFyY2hdLC51aS5mb3JtIGlucHV0W3R5cGU9dGVsXSwudWkuZm9ybSBpbnB1dFt0eXBlPXRleHRdLC51aS5mb3JtIGlucHV0W3R5cGU9dGltZV0sLnVpLmZvcm0gaW5wdXRbdHlwZT11cmxde2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjttYXJnaW46MDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7dGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDApO2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbTtwYWRkaW5nOi42Nzg1NzE0M2VtIDFlbTtmb250LXNpemU6MWVtO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0Oy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2V9LnVpLmZvcm0gdGV4dGFyZWF7bWFyZ2luOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7dGFwLWhpZ2hsaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LDApO3BhZGRpbmc6Ljc4NTcxNDI5ZW0gMWVtO2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtvdXRsaW5lOjA7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCB0cmFuc3BhcmVudCBpbnNldDstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO2ZvbnQtc2l6ZToxZW07bGluZS1oZWlnaHQ6MS4yODU3O3Jlc2l6ZTp2ZXJ0aWNhbH0udWkuZm9ybSB0ZXh0YXJlYTpub3QoW3Jvd3NdKXtoZWlnaHQ6MTJlbTttaW4taGVpZ2h0OjhlbTttYXgtaGVpZ2h0OjI0ZW19LnVpLmZvcm0gaW5wdXRbdHlwZT1jaGVja2JveF0sLnVpLmZvcm0gdGV4dGFyZWF7dmVydGljYWwtYWxpZ246dG9wfS51aS5mb3JtIGlucHV0LmF0dGFjaGVke3dpZHRoOmF1dG99LnVpLmZvcm0gc2VsZWN0e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OmF1dG87d2lkdGg6MTAwJTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDAgdHJhbnNwYXJlbnQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O3BhZGRpbmc6LjYyZW0gMWVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlfS51aS5mb3JtIC5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3due3dpZHRoOjEwMCV9LnVpLmZvcm0gLmZpZWxkPi5zZWxlY3Rpb24uZHJvcGRvd24+LmRyb3Bkb3duLmljb257ZmxvYXQ6cmlnaHR9LnVpLmZvcm0gLmlubGluZS5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3duLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3due3dpZHRoOmF1dG99LnVpLmZvcm0gLmlubGluZS5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3duPi5kcm9wZG93bi5pY29uLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD4uc2VsZWN0aW9uLmRyb3Bkb3duPi5kcm9wZG93bi5pY29ue2Zsb2F0Om5vbmV9LnVpLmZvcm0gLmZpZWxkIC51aS5pbnB1dCwudWkuZm9ybSAuZmllbGRzIC5maWVsZCAudWkuaW5wdXQsLnVpLmZvcm0gLndpZGUuZmllbGQgLnVpLmlucHV0e3dpZHRoOjEwMCV9LnVpLmZvcm0gLmlubGluZS5maWVsZDpub3QoLndpZGUpIC51aS5pbnB1dCwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQ6bm90KC53aWRlKSAudWkuaW5wdXR7d2lkdGg6YXV0bzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmZvcm0gLmZpZWxkIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuZmllbGRzIC5maWVsZCAudWkuaW5wdXQgaW5wdXR7d2lkdGg6YXV0b30udWkuZm9ybSAuZWlnaHQuZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuZml2ZS5maWVsZHMgLnVpLmlucHV0IGlucHV0LC51aS5mb3JtIC5mb3VyLmZpZWxkcyAudWkuaW5wdXQgaW5wdXQsLnVpLmZvcm0gLm5pbmUuZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuc2V2ZW4uZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAuc2l4LmZpZWxkcyAudWkuaW5wdXQgaW5wdXQsLnVpLmZvcm0gLnRlbi5maWVsZHMgLnVpLmlucHV0IGlucHV0LC51aS5mb3JtIC50aHJlZS5maWVsZHMgLnVpLmlucHV0IGlucHV0LC51aS5mb3JtIC50d28uZmllbGRzIC51aS5pbnB1dCBpbnB1dCwudWkuZm9ybSAud2lkZS5maWVsZCAudWkuaW5wdXQgaW5wdXR7LXdlYmtpdC1ib3gtZmxleDoxOy1tcy1mbGV4OjEgMCBhdXRvO2ZsZXg6MSAwIGF1dG87d2lkdGg6MH0udWkuZm9ybSAuZXJyb3IubWVzc2FnZSwudWkuZm9ybSAuc3VjY2Vzcy5tZXNzYWdlLC51aS5mb3JtIC53YXJuaW5nLm1lc3NhZ2V7ZGlzcGxheTpub25lfS51aS5mb3JtIC5tZXNzYWdlOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuZm9ybSAuZmllbGQgLnByb21wdC5sYWJlbHt3aGl0ZS1zcGFjZTpub3JtYWw7YmFja2dyb3VuZDojZmZmIWltcG9ydGFudDtib3JkZXI6MXB4IHNvbGlkICNlMGI0YjQhaW1wb3J0YW50O2NvbG9yOiM5ZjNhMzghaW1wb3J0YW50fS51aS5mb3JtIC5pbmxpbmUuZmllbGQgLnByb21wdCwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQgLnByb21wdHt2ZXJ0aWNhbC1hbGlnbjp0b3A7bWFyZ2luOi0uMjVlbSAwIC0uNWVtIC41ZW19LnVpLmZvcm0gLmlubGluZS5maWVsZCAucHJvbXB0OmJlZm9yZSwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQgLnByb21wdDpiZWZvcmV7Ym9yZGVyLXdpZHRoOjAgMCAxcHggMXB4O2JvdHRvbTphdXRvO3JpZ2h0OmF1dG87dG9wOjUwJTtsZWZ0OjB9LnVpLmZvcm0gLmZpZWxkLmZpZWxkIGlucHV0Oi13ZWJraXQtYXV0b2ZpbGx7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDEwMHB4IGl2b3J5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDEwMHB4IGl2b3J5IGluc2V0IWltcG9ydGFudDtib3JkZXItY29sb3I6I2U1ZGZhMSFpbXBvcnRhbnR9LnVpLmZvcm0gLmZpZWxkLmZpZWxkIGlucHV0Oi13ZWJraXQtYXV0b2ZpbGw6Zm9jdXN7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDEwMHB4IGl2b3J5IGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgMCAwIDEwMHB4IGl2b3J5IGluc2V0IWltcG9ydGFudDtib3JkZXItY29sb3I6I2Q1YzMxNSFpbXBvcnRhbnR9LnVpLmZvcm0gLmVycm9yLmVycm9yIGlucHV0Oi13ZWJraXQtYXV0b2ZpbGx7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDEwMHB4ICNmZmZhZjAgaW5zZXQhaW1wb3J0YW50O2JveC1zaGFkb3c6MCAwIDAgMTAwcHggI2ZmZmFmMCBpbnNldCFpbXBvcnRhbnQ7Ym9yZGVyLWNvbG9yOiNlMGI0YjQhaW1wb3J0YW50fS51aS5mb3JtIDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDE5MSwxOTEsMTkxLC44Nyl9LnVpLmZvcm0gOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDE5MSwxOTEsMTkxLC44NykhaW1wb3J0YW50fS51aS5mb3JtIDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDE5MSwxOTEsMTkxLC44Nyl9LnVpLmZvcm0gOmZvY3VzOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTE1LDExNSwxMTUsLjg3KX0udWkuZm9ybSA6Zm9jdXM6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTE1LDExNSwxMTUsLjg3KSFpbXBvcnRhbnR9LnVpLmZvcm0gOmZvY3VzOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMTE1LDExNSwxMTUsLjg3KX0udWkuZm9ybSAuZXJyb3IgOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOiNlN2JkYmN9LnVpLmZvcm0gLmVycm9yIDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2U3YmRiYyFpbXBvcnRhbnR9LnVpLmZvcm0gLmVycm9yIDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjojZTdiZGJjfS51aS5mb3JtIC5lcnJvciA6Zm9jdXM6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6I2RhOTc5Nn0udWkuZm9ybSAuZXJyb3IgOmZvY3VzOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjojZGE5Nzk2IWltcG9ydGFudH0udWkuZm9ybSAuZXJyb3IgOmZvY3VzOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOiNkYTk3OTZ9LnVpLmZvcm0gaW5wdXQ6bm90KFt0eXBlXSk6Zm9jdXMsLnVpLmZvcm0gaW5wdXRbdHlwZT1kYXRlXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPWVtYWlsXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPWZpbGVdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9bnVtYmVyXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPXBhc3N3b3JkXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPXNlYXJjaF06Zm9jdXMsLnVpLmZvcm0gaW5wdXRbdHlwZT10ZWxdOmZvY3VzLC51aS5mb3JtIGlucHV0W3R5cGU9dGV4dF06Zm9jdXMsLnVpLmZvcm0gaW5wdXRbdHlwZT10aW1lXTpmb2N1cywudWkuZm9ybSBpbnB1dFt0eXBlPXVybF06Zm9jdXN7Y29sb3I6cmdiYSgwLDAsMCwuOTUpO2JvcmRlci1jb2xvcjojODViN2Q5O2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4zNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldH0udWkuZm9ybSB0ZXh0YXJlYTpmb2N1c3tjb2xvcjpyZ2JhKDAsMCwwLC45NSk7Ym9yZGVyLWNvbG9yOiM4NWI3ZDk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHJnYmEoMzQsMzYsMzgsLjM1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDAgcmdiYSgzNCwzNiwzOCwuMzUpIGluc2V0Oy13ZWJraXQtYXBwZWFyYW5jZTpub25lfS51aS5mb3JtLnN1Y2Nlc3MgLnN1Y2Nlc3MubWVzc2FnZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrfS51aS5mb3JtLnN1Y2Nlc3MgLmNvbXBhY3Quc3VjY2Vzcy5tZXNzYWdlOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5mb3JtLnN1Y2Nlc3MgLmljb24uc3VjY2Vzcy5tZXNzYWdlOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXh9LnVpLmZvcm0ud2FybmluZyAud2FybmluZy5tZXNzYWdlOm5vdCg6ZW1wdHkpe2Rpc3BsYXk6YmxvY2t9LnVpLmZvcm0ud2FybmluZyAuY29tcGFjdC53YXJuaW5nLm1lc3NhZ2U6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLmZvcm0ud2FybmluZyAuaWNvbi53YXJuaW5nLm1lc3NhZ2U6bm90KDplbXB0eSl7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleH0udWkuZm9ybS5lcnJvciAuZXJyb3IubWVzc2FnZTpub3QoOmVtcHR5KXtkaXNwbGF5OmJsb2NrfS51aS5mb3JtLmVycm9yIC5jb21wYWN0LmVycm9yLm1lc3NhZ2U6bm90KDplbXB0eSl7ZGlzcGxheTppbmxpbmUtYmxvY2t9LnVpLmZvcm0uZXJyb3IgLmljb24uZXJyb3IubWVzc2FnZTpub3QoOmVtcHR5KXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4fS51aS5mb3JtIC5maWVsZC5lcnJvciAuaW5wdXQsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGxhYmVsLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC5pbnB1dCwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBsYWJlbHtjb2xvcjojOWYzYTM4fS51aS5mb3JtIC5maWVsZC5lcnJvciAuY29ybmVyLmxhYmVsLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC5jb3JuZXIubGFiZWx7Ym9yZGVyLWNvbG9yOiM5ZjNhMzg7Y29sb3I6I2ZmZn0udWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXQ6bm90KFt0eXBlXSksLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9ZGF0ZV0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPWVtYWlsXSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1maWxlXSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1udW1iZXJdLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXBhc3N3b3JkXSwudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1zZWFyY2hdLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXRlbF0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dGV4dF0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dGltZV0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9dXJsXSwudWkuZm9ybSAuZmllbGQuZXJyb3Igc2VsZWN0LC51aS5mb3JtIC5maWVsZC5lcnJvciB0ZXh0YXJlYSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBpbnB1dDpub3QoW3R5cGVdKSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBpbnB1dFt0eXBlPWRhdGVdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9ZW1haWxdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9ZmlsZV0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT1udW1iZXJdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9cGFzc3dvcmRdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9c2VhcmNoXSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBpbnB1dFt0eXBlPXRlbF0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgaW5wdXRbdHlwZT10ZXh0XSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBpbnB1dFt0eXBlPXRpbWVdLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIGlucHV0W3R5cGU9dXJsXSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCBzZWxlY3QsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgdGV4dGFyZWF7YmFja2dyb3VuZDojZmZmNmY2O2JvcmRlci1jb2xvcjojZTBiNGI0O2NvbG9yOiM5ZjNhMzg7Ym9yZGVyLXJhZGl1czonJzstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0Om5vdChbdHlwZV0pOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPWRhdGVdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1lbWFpbF06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9ZmlsZV06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9bnVtYmVyXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT1wYXNzd29yZF06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIGlucHV0W3R5cGU9c2VhcmNoXTpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgaW5wdXRbdHlwZT10ZWxdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXRleHRdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXRpbWVdOmZvY3VzLC51aS5mb3JtIC5maWVsZC5lcnJvciBpbnB1dFt0eXBlPXVybF06Zm9jdXMsLnVpLmZvcm0gLmZpZWxkLmVycm9yIHNlbGVjdDpmb2N1cywudWkuZm9ybSAuZmllbGQuZXJyb3IgdGV4dGFyZWE6Zm9jdXN7YmFja2dyb3VuZDojZmZmNmY2O2JvcmRlci1jb2xvcjojZTBiNGI0O2NvbG9yOiM5ZjNhMzg7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5mb3JtIC5maWVsZC5lcnJvciBzZWxlY3R7LXdlYmtpdC1hcHBlYXJhbmNlOm1lbnVsaXN0LWJ1dHRvbn0udWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLmRyb3Bkb3duLC51aS5mb3JtIC5maWVsZC5lcnJvciAudWkuZHJvcGRvd24gLml0ZW0sLnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5kcm9wZG93biAudGV4dCwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAudWkuZHJvcGRvd24sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLmRyb3Bkb3duIC5pdGVte2JhY2tncm91bmQ6I2ZmZjZmNjtjb2xvcjojOWYzYTM4fS51aS5mb3JtIC5maWVsZC5lcnJvciAudWkuZHJvcGRvd24sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLmRyb3Bkb3due2JvcmRlci1jb2xvcjojZTBiNGI0IWltcG9ydGFudH0udWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLmRyb3Bkb3duOmhvdmVyLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC51aS5kcm9wZG93bjpob3Zlcntib3JkZXItY29sb3I6I2UwYjRiNCFpbXBvcnRhbnR9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5kcm9wZG93bjpob3ZlciAubWVudSwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAudWkuZHJvcGRvd246aG92ZXIgLm1lbnV7Ym9yZGVyLWNvbG9yOiNlMGI0YjR9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5tdWx0aXBsZS5zZWxlY3Rpb24uZHJvcGRvd24+LmxhYmVsLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC51aS5tdWx0aXBsZS5zZWxlY3Rpb24uZHJvcGRvd24+LmxhYmVse2JhY2tncm91bmQtY29sb3I6I2VhY2JjYjtjb2xvcjojOWYzYTM4fS51aS5mb3JtIC5maWVsZC5lcnJvciAudWkuZHJvcGRvd24gLm1lbnUgLml0ZW06aG92ZXIsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLmRyb3Bkb3duIC5tZW51IC5pdGVtOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2ZiZTdlN30udWkuZm9ybSAuZmllbGQuZXJyb3IgLnVpLmRyb3Bkb3duIC5tZW51IC5zZWxlY3RlZC5pdGVtLC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC51aS5kcm9wZG93biAubWVudSAuc2VsZWN0ZWQuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOiNmYmU3ZTd9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC51aS5kcm9wZG93biAubWVudSAuYWN0aXZlLml0ZW0sLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLnVpLmRyb3Bkb3duIC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOiNmZGNmY2YhaW1wb3J0YW50fS51aS5mb3JtIC5maWVsZC5lcnJvciAuY2hlY2tib3g6bm90KC50b2dnbGUpOm5vdCguc2xpZGVyKSAuYm94LC51aS5mb3JtIC5maWVsZC5lcnJvciAuY2hlY2tib3g6bm90KC50b2dnbGUpOm5vdCguc2xpZGVyKSBsYWJlbCwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAuY2hlY2tib3g6bm90KC50b2dnbGUpOm5vdCguc2xpZGVyKSAuYm94LC51aS5mb3JtIC5maWVsZHMuZXJyb3IgLmZpZWxkIC5jaGVja2JveDpub3QoLnRvZ2dsZSk6bm90KC5zbGlkZXIpIGxhYmVse2NvbG9yOiM5ZjNhMzh9LnVpLmZvcm0gLmZpZWxkLmVycm9yIC5jaGVja2JveDpub3QoLnRvZ2dsZSk6bm90KC5zbGlkZXIpIC5ib3g6YmVmb3JlLC51aS5mb3JtIC5maWVsZC5lcnJvciAuY2hlY2tib3g6bm90KC50b2dnbGUpOm5vdCguc2xpZGVyKSBsYWJlbDpiZWZvcmUsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLmNoZWNrYm94Om5vdCgudG9nZ2xlKTpub3QoLnNsaWRlcikgLmJveDpiZWZvcmUsLnVpLmZvcm0gLmZpZWxkcy5lcnJvciAuZmllbGQgLmNoZWNrYm94Om5vdCgudG9nZ2xlKTpub3QoLnNsaWRlcikgbGFiZWw6YmVmb3Jle2JhY2tncm91bmQ6I2ZmZjZmNjtib3JkZXItY29sb3I6I2UwYjRiNH0udWkuZm9ybSAuZmllbGQuZXJyb3IgLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLmZvcm0gLmZpZWxkLmVycm9yIC5jaGVja2JveCBsYWJlbDphZnRlciwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAuY2hlY2tib3ggLmJveDphZnRlciwudWkuZm9ybSAuZmllbGRzLmVycm9yIC5maWVsZCAuY2hlY2tib3ggbGFiZWw6YWZ0ZXJ7Y29sb3I6IzlmM2EzOH0udWkuZm9ybSAuZGlzYWJsZWQuZmllbGQsLnVpLmZvcm0gLmRpc2FibGVkLmZpZWxkcyAuZmllbGQsLnVpLmZvcm0gLmZpZWxkIDpkaXNhYmxlZHtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6LjQ1fS51aS5mb3JtIC5maWVsZC5kaXNhYmxlZD5sYWJlbCwudWkuZm9ybSAuZmllbGRzLmRpc2FibGVkPmxhYmVse29wYWNpdHk6LjQ1fS51aS5mb3JtIC5maWVsZC5kaXNhYmxlZCA6ZGlzYWJsZWR7b3BhY2l0eToxfS51aS5sb2FkaW5nLmZvcm17cG9zaXRpb246cmVsYXRpdmU7Y3Vyc29yOmRlZmF1bHQ7cG9pbnRlci1ldmVudHM6bm9uZX0udWkubG9hZGluZy5mb3JtOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDowO2xlZnQ6MDtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjgpO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoxMDB9LnVpLmxvYWRpbmcuZm9ybTphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0xLjVlbSAwIDAgLTEuNWVtO3dpZHRoOjNlbTtoZWlnaHQ6M2VtOy13ZWJraXQtYW5pbWF0aW9uOmZvcm0tc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpmb3JtLXNwaW4gLjZzIGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTtib3JkZXItcmFkaXVzOjUwMHJlbTtib3JkZXItY29sb3I6Izc2NzY3NiByZ2JhKDAsMCwwLC4xKSByZ2JhKDAsMCwwLC4xKSByZ2JhKDAsMCwwLC4xKTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOi4yZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDt2aXNpYmlsaXR5OnZpc2libGU7ei1pbmRleDoxMDF9QC13ZWJraXQta2V5ZnJhbWVzIGZvcm0tc3Bpbntmcm9tey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgwKTt0cmFuc2Zvcm06cm90YXRlKDApfXRvey13ZWJraXQtdHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBmb3JtLXNwaW57ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS51aS5mb3JtIC5yZXF1aXJlZC5maWVsZD4uY2hlY2tib3g6YWZ0ZXIsLnVpLmZvcm0gLnJlcXVpcmVkLmZpZWxkPmxhYmVsOmFmdGVyLC51aS5mb3JtIC5yZXF1aXJlZC5maWVsZHMuZ3JvdXBlZD5sYWJlbDphZnRlciwudWkuZm9ybSAucmVxdWlyZWQuZmllbGRzOm5vdCguZ3JvdXBlZCk+LmZpZWxkPi5jaGVja2JveDphZnRlciwudWkuZm9ybSAucmVxdWlyZWQuZmllbGRzOm5vdCguZ3JvdXBlZCk+LmZpZWxkPmxhYmVsOmFmdGVye21hcmdpbjotLjJlbSAwIDAgLjJlbTtjb250ZW50OicqJztjb2xvcjojZGIyODI4fS51aS5mb3JtIC5yZXF1aXJlZC5maWVsZD5sYWJlbDphZnRlciwudWkuZm9ybSAucmVxdWlyZWQuZmllbGRzLmdyb3VwZWQ+bGFiZWw6YWZ0ZXIsLnVpLmZvcm0gLnJlcXVpcmVkLmZpZWxkczpub3QoLmdyb3VwZWQpPi5maWVsZD5sYWJlbDphZnRlcntkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmZvcm0gLnJlcXVpcmVkLmZpZWxkPi5jaGVja2JveDphZnRlciwudWkuZm9ybSAucmVxdWlyZWQuZmllbGRzOm5vdCguZ3JvdXBlZCk+LmZpZWxkPi5jaGVja2JveDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjEwMCV9LnVpLmZvcm0gLmludmVydGVkLnNlZ21lbnQgLnVpLmNoZWNrYm94IC5ib3gsLnVpLmZvcm0gLmludmVydGVkLnNlZ21lbnQgLnVpLmNoZWNrYm94IGxhYmVsLC51aS5mb3JtIC5pbnZlcnRlZC5zZWdtZW50IGxhYmVsLC51aS5pbnZlcnRlZC5mb3JtIC5pbmxpbmUuZmllbGQ+bGFiZWwsLnVpLmludmVydGVkLmZvcm0gLmlubGluZS5maWVsZD5wLC51aS5pbnZlcnRlZC5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD5sYWJlbCwudWkuaW52ZXJ0ZWQuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQ+cCwudWkuaW52ZXJ0ZWQuZm9ybSAuaW5saW5lLmZpZWxkcz5sYWJlbCwudWkuaW52ZXJ0ZWQuZm9ybSAudWkuY2hlY2tib3ggLmJveCwudWkuaW52ZXJ0ZWQuZm9ybSAudWkuY2hlY2tib3ggbGFiZWwsLnVpLmludmVydGVkLmZvcm0gbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmludmVydGVkLmZvcm0gaW5wdXQ6bm90KFt0eXBlXSksLnVpLmludmVydGVkLmZvcm0gaW5wdXRbdHlwZT1kYXRlXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPWRhdGV0aW1lLWxvY2FsXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPWVtYWlsXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPWZpbGVdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9bnVtYmVyXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPXBhc3N3b3JkXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPXNlYXJjaF0sLnVpLmludmVydGVkLmZvcm0gaW5wdXRbdHlwZT10ZWxdLC51aS5pbnZlcnRlZC5mb3JtIGlucHV0W3R5cGU9dGV4dF0sLnVpLmludmVydGVkLmZvcm0gaW5wdXRbdHlwZT10aW1lXSwudWkuaW52ZXJ0ZWQuZm9ybSBpbnB1dFt0eXBlPXVybF17YmFja2dyb3VuZDojZmZmO2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5mb3JtIC5ncm91cGVkLmZpZWxkc3tkaXNwbGF5OmJsb2NrO21hcmdpbjowIDAgMWVtfS51aS5mb3JtIC5ncm91cGVkLmZpZWxkczpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuZm9ybSAuZ3JvdXBlZC5maWVsZHM+bGFiZWx7bWFyZ2luOjAgMCAuMjg1NzE0MjlyZW0gMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Zm9udC1zaXplOi45Mjg1NzE0M2VtO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LXRyYW5zZm9ybTpub25lfS51aS5mb3JtIC5ncm91cGVkLmZpZWxkcyAuZmllbGQsLnVpLmZvcm0gLmdyb3VwZWQuaW5saW5lLmZpZWxkcyAuZmllbGR7ZGlzcGxheTpibG9jazttYXJnaW46LjVlbSAwO3BhZGRpbmc6MH0udWkuZm9ybSAuZmllbGRze2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdzttYXJnaW46MCAtLjVlbSAxZW19LnVpLmZvcm0gLmZpZWxkcz4uZmllbGR7LXdlYmtpdC1ib3gtZmxleDowOy1tcy1mbGV4OjAgMSBhdXRvO2ZsZXg6MCAxIGF1dG87cGFkZGluZy1sZWZ0Oi41ZW07cGFkZGluZy1yaWdodDouNWVtfS51aS5mb3JtIC5maWVsZHM+LmZpZWxkOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0Om5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5mb3JtIC50d28uZmllbGRzPi5maWVsZCwudWkuZm9ybSAudHdvLmZpZWxkcz4uZmllbGRze3dpZHRoOjUwJX0udWkuZm9ybSAudGhyZWUuZmllbGRzPi5maWVsZCwudWkuZm9ybSAudGhyZWUuZmllbGRzPi5maWVsZHN7d2lkdGg6MzMuMzMzMzMzMzMlfS51aS5mb3JtIC5mb3VyLmZpZWxkcz4uZmllbGQsLnVpLmZvcm0gLmZvdXIuZmllbGRzPi5maWVsZHN7d2lkdGg6MjUlfS51aS5mb3JtIC5maXZlLmZpZWxkcz4uZmllbGQsLnVpLmZvcm0gLmZpdmUuZmllbGRzPi5maWVsZHN7d2lkdGg6MjAlfS51aS5mb3JtIC5zaXguZmllbGRzPi5maWVsZCwudWkuZm9ybSAuc2l4LmZpZWxkcz4uZmllbGRze3dpZHRoOjE2LjY2NjY2NjY3JX0udWkuZm9ybSAuc2V2ZW4uZmllbGRzPi5maWVsZCwudWkuZm9ybSAuc2V2ZW4uZmllbGRzPi5maWVsZHN7d2lkdGg6MTQuMjg1NzE0MjklfS51aS5mb3JtIC5laWdodC5maWVsZHM+LmZpZWxkLC51aS5mb3JtIC5laWdodC5maWVsZHM+LmZpZWxkc3t3aWR0aDoxMi41JX0udWkuZm9ybSAubmluZS5maWVsZHM+LmZpZWxkLC51aS5mb3JtIC5uaW5lLmZpZWxkcz4uZmllbGRze3dpZHRoOjExLjExMTExMTExJX0udWkuZm9ybSAudGVuLmZpZWxkcz4uZmllbGQsLnVpLmZvcm0gLnRlbi5maWVsZHM+LmZpZWxkc3t3aWR0aDoxMCV9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuZm9ybSAuZmllbGRzey1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcH0udWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZWlnaHQuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZWlnaHQuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpdmUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZml2ZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZm91ci5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5mb3VyLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5uaW5lLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLm5pbmUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZHMsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnNldmVuLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnNldmVuLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5zaXguZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuc2l4LmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50ZW4uZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudGVuLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50aHJlZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50aHJlZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudHdvLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnR3by5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSBbY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpW2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM+LmZpZWxke3dpZHRoOjEwMCUhaW1wb3J0YW50O21hcmdpbjowIDAgMWVtfX0udWkuZm9ybSAuZmllbGRzIC53aWRlLmZpZWxke3dpZHRoOjYuMjUlO3BhZGRpbmctbGVmdDouNWVtO3BhZGRpbmctcmlnaHQ6LjVlbX0udWkuZm9ybSAub25lLndpZGUuZmllbGR7d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5mb3JtIC50d28ud2lkZS5maWVsZHt3aWR0aDoxMi41JSFpbXBvcnRhbnR9LnVpLmZvcm0gLnRocmVlLndpZGUuZmllbGR7d2lkdGg6MTguNzUlIWltcG9ydGFudH0udWkuZm9ybSAuZm91ci53aWRlLmZpZWxke3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmZvcm0gLmZpdmUud2lkZS5maWVsZHt3aWR0aDozMS4yNSUhaW1wb3J0YW50fS51aS5mb3JtIC5zaXgud2lkZS5maWVsZHt3aWR0aDozNy41JSFpbXBvcnRhbnR9LnVpLmZvcm0gLnNldmVuLndpZGUuZmllbGR7d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuZm9ybSAuZWlnaHQud2lkZS5maWVsZHt3aWR0aDo1MCUhaW1wb3J0YW50fS51aS5mb3JtIC5uaW5lLndpZGUuZmllbGR7d2lkdGg6NTYuMjUlIWltcG9ydGFudH0udWkuZm9ybSAudGVuLndpZGUuZmllbGR7d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5mb3JtIC5lbGV2ZW4ud2lkZS5maWVsZHt3aWR0aDo2OC43NSUhaW1wb3J0YW50fS51aS5mb3JtIC50d2VsdmUud2lkZS5maWVsZHt3aWR0aDo3NSUhaW1wb3J0YW50fS51aS5mb3JtIC50aGlydGVlbi53aWRlLmZpZWxke3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmZvcm0gLmZvdXJ0ZWVuLndpZGUuZmllbGR7d2lkdGg6ODcuNSUhaW1wb3J0YW50fS51aS5mb3JtIC5maWZ0ZWVuLndpZGUuZmllbGR7d2lkdGg6OTMuNzUlIWltcG9ydGFudH0udWkuZm9ybSAuc2l4dGVlbi53aWRlLmZpZWxke3dpZHRoOjEwMCUhaW1wb3J0YW50fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZWlnaHQud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5lbGV2ZW4ud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWZ0ZWVuLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZml2ZS53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZvdXIud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5mb3VydGVlbi53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+Lm5pbmUud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5zZXZlbi53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LnNpeC53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LnNpeHRlZW4ud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi50ZW4ud2lkZS5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi50aGlydGVlbi53aWRlLmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LnRocmVlLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4udHdlbHZlLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4udHdvLndpZGUuZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLmZpdmUuZmllbGRzOm5vdCgudW5zdGFja2FibGUpPi5maWVsZCwudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZml2ZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAuZm91ci5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC5mb3VyLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGRzLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50aHJlZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkLC51aS5mb3JtOm5vdCgudW5zdGFja2FibGUpIC50aHJlZS5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkcywudWkuZm9ybTpub3QoLnVuc3RhY2thYmxlKSAudHdvLmZpZWxkczpub3QoLnVuc3RhY2thYmxlKT4uZmllbGQsLnVpLmZvcm06bm90KC51bnN0YWNrYWJsZSkgLnR3by5maWVsZHM6bm90KC51bnN0YWNrYWJsZSk+LmZpZWxkc3t3aWR0aDoxMDAlIWltcG9ydGFudH0udWkuZm9ybSAuZmllbGRze21hcmdpbi1ib3R0b206MH19LnVpLmZvcm0gW2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5maWVsZHM+LmZpZWxkLC51aVtjbGFzcyo9XFxcImVxdWFsIHdpZHRoXFxcIl0uZm9ybSAuZmllbGRzPi5maWVsZHt3aWR0aDoxMDAlOy13ZWJraXQtYm94LWZsZXg6MTstbXMtZmxleDoxIDEgYXV0bztmbGV4OjEgMSBhdXRvfS51aS5mb3JtIC5pbmxpbmUuZmllbGRze21hcmdpbjowIDAgMWVtOy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZHttYXJnaW46MDtwYWRkaW5nOjAgMWVtIDAgMH0udWkuZm9ybSAuaW5saW5lLmZpZWxkPmxhYmVsLC51aS5mb3JtIC5pbmxpbmUuZmllbGQ+cCwudWkuZm9ybSAuaW5saW5lLmZpZWxkcyAuZmllbGQ+bGFiZWwsLnVpLmZvcm0gLmlubGluZS5maWVsZHMgLmZpZWxkPnAsLnVpLmZvcm0gLmlubGluZS5maWVsZHM+bGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0bzttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2ZvbnQtc2l6ZTouOTI4NTcxNDNlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpO3RleHQtdHJhbnNmb3JtOm5vbmV9LnVpLmZvcm0gLmlubGluZS5maWVsZHM+bGFiZWx7bWFyZ2luOi4wMzU3MTRlbSAxZW0gMCAwfS51aS5mb3JtIC5pbmxpbmUuZmllbGQ+aW5wdXQsLnVpLmZvcm0gLmlubGluZS5maWVsZD5zZWxlY3QsLnVpLmZvcm0gLmlubGluZS5maWVsZHMgLmZpZWxkPmlucHV0LC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD5zZWxlY3R7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0bzttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXNpemU6MWVtfS51aS5mb3JtIC5pbmxpbmUuZmllbGQ+OmZpcnN0LWNoaWxkLC51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC5maWVsZD46Zmlyc3QtY2hpbGR7bWFyZ2luOjAgLjg1NzE0Mjg2ZW0gMCAwfS51aS5mb3JtIC5pbmxpbmUuZmllbGQ+Om9ubHktY2hpbGQsLnVpLmZvcm0gLmlubGluZS5maWVsZHMgLmZpZWxkPjpvbmx5LWNoaWxke21hcmdpbjowfS51aS5mb3JtIC5pbmxpbmUuZmllbGRzIC53aWRlLmZpZWxke2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LnVpLmZvcm0gLmlubGluZS5maWVsZHMgLndpZGUuZmllbGQ+aW5wdXQsLnVpLmZvcm0gLmlubGluZS5maWVsZHMgLndpZGUuZmllbGQ+c2VsZWN0e3dpZHRoOjEwMCV9LnVpLm1pbmkuZm9ybXtmb250LXNpemU6Ljc4NTcxNDI5cmVtfS51aS50aW55LmZvcm17Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwuZm9ybXtmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5mb3Jte2ZvbnQtc2l6ZToxcmVtfS51aS5sYXJnZS5mb3Jte2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5iaWcuZm9ybXtmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5mb3Jte2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtfS51aS5tYXNzaXZlLmZvcm17Zm9udC1zaXplOjEuNzE0Mjg1NzFyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEdyaWRcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5ncmlke2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdzstbXMtZmxleC13cmFwOndyYXA7ZmxleC13cmFwOndyYXA7LXdlYmtpdC1ib3gtYWxpZ246c3RyZXRjaDstbXMtZmxleC1hbGlnbjpzdHJldGNoO2FsaWduLWl0ZW1zOnN0cmV0Y2g7cGFkZGluZzowfS51aS5ncmlke21hcmdpbi10b3A6LTFyZW07bWFyZ2luLWJvdHRvbTotMXJlbTttYXJnaW4tbGVmdDotMXJlbTttYXJnaW4tcmlnaHQ6LTFyZW19LnVpLnJlbGF4ZWQuZ3JpZHttYXJnaW4tbGVmdDotMS41cmVtO21hcmdpbi1yaWdodDotMS41cmVtfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmdyaWR7bWFyZ2luLWxlZnQ6LTIuNXJlbTttYXJnaW4tcmlnaHQ6LTIuNXJlbX0udWkuZ3JpZCsuZ3JpZHttYXJnaW4tdG9wOjFyZW19LnVpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLmdyaWQ+LnJvdz4uY29sdW1ue3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjYuMjUlO3BhZGRpbmctbGVmdDoxcmVtO3BhZGRpbmctcmlnaHQ6MXJlbTt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmdyaWQ+KntwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnVpLmdyaWQ+LnJvd3twb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYm94LW9yaWVudDpob3Jpem9udGFsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LWRpcmVjdGlvbjpyb3c7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwOy13ZWJraXQtYm94LXBhY2s6aW5oZXJpdDstbXMtZmxleC1wYWNrOmluaGVyaXQ7anVzdGlmeS1jb250ZW50OmluaGVyaXQ7LXdlYmtpdC1ib3gtYWxpZ246c3RyZXRjaDstbXMtZmxleC1hbGlnbjpzdHJldGNoO2FsaWduLWl0ZW1zOnN0cmV0Y2g7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7cGFkZGluZzowO3BhZGRpbmctdG9wOjFyZW07cGFkZGluZy1ib3R0b206MXJlbX0udWkuZ3JpZD4uY29sdW1uOm5vdCgucm93KXtwYWRkaW5nLXRvcDoxcmVtO3BhZGRpbmctYm90dG9tOjFyZW19LnVpLmdyaWQ+LnJvdz4uY29sdW1ue21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LnVpLmdyaWQ+LnJvdz4uY29sdW1uPmltZywudWkuZ3JpZD4ucm93PmltZ3ttYXgtd2lkdGg6MTAwJX0udWkuZ3JpZD4udWkuZ3JpZDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLmdyaWQ+LnVpLmdyaWQ6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLmFsaWduZWQuZ3JpZCAuY29sdW1uPi5zZWdtZW50Om5vdCguY29tcGFjdCk6bm90KC5hdHRhY2hlZCksLnVpLmdyaWQgLmFsaWduZWQucm93Pi5jb2x1bW4+LnNlZ21lbnQ6bm90KC5jb21wYWN0KTpub3QoLmF0dGFjaGVkKXt3aWR0aDoxMDAlfS51aS5ncmlkIC5yb3crLnVpLmRpdmlkZXJ7LXdlYmtpdC1ib3gtZmxleDoxOy1tcy1mbGV4LXBvc2l0aXZlOjE7ZmxleC1ncm93OjE7bWFyZ2luOjFyZW0gMXJlbX0udWkuZ3JpZCAuY29sdW1uKy51aS52ZXJ0aWNhbC5kaXZpZGVye2hlaWdodDpjYWxjKDUwJSAtIDFyZW0pfS51aS5ncmlkPi5jb2x1bW46bGFzdC1jaGlsZD4uaG9yaXpvbnRhbC5zZWdtZW50LC51aS5ncmlkPi5yb3c+LmNvbHVtbjpsYXN0LWNoaWxkPi5ob3Jpem9udGFsLnNlZ21lbnR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkucGFnZS5ncmlke3dpZHRoOmF1dG87bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MmVtO3BhZGRpbmctcmlnaHQ6MmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpIGFuZCAobWF4LXdpZHRoOjExOTlweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjMlO3BhZGRpbmctcmlnaHQ6MyV9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMjAwcHgpIGFuZCAobWF4LXdpZHRoOjE5MTlweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjE1JTtwYWRkaW5nLXJpZ2h0OjE1JX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnBhZ2UuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjIzJTtwYWRkaW5nLXJpZ2h0OjIzJX19LnVpLmdyaWQ+LmNvbHVtbjpvbmx5LWNoaWxkLC51aS5ncmlkPi5yb3c+LmNvbHVtbjpvbmx5LWNoaWxke3dpZHRoOjEwMCV9LnVpW2NsYXNzKj1cXFwib25lIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwib25lIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjEwMCV9LnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJX0udWlbY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInRocmVlIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJX0udWlbY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZm91ciBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyNSV9LnVpW2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImZpdmUgY29sdW1uXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjAlfS51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNi42NjY2NjY2NyV9LnVpW2NsYXNzKj1cXFwic2V2ZW4gY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJzZXZlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNC4yODU3MTQyOSV9LnVpW2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlaWdodCBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxMi41JX0udWlbY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwibmluZSBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxMS4xMTExMTExMSV9LnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjEwJX0udWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6OS4wOTA5MDkwOSV9LnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjguMzMzMzMzMzMlfS51aVtjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6Ny42OTIzMDc2OSV9LnVpW2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmb3VydGVlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo3LjE0Mjg1NzE0JX0udWlbY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZmlmdGVlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo2LjY2NjY2NjY3JX0udWlbY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwic2l4dGVlbiBjb2x1bW5cXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo2LjI1JX0udWkuZ3JpZD5bY2xhc3MqPVxcXCJvbmUgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5yb3c+LmNvbHVtbnt3aWR0aDoyMCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5yb3c+LmNvbHVtbnt3aWR0aDoxNi42NjY2NjY2NyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjE0LjI4NTcxNDI5JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTIuNSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcIm5pbmUgY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTEuMTExMTExMTElIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6MTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6OS4wOTA5MDkwOSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSBjb2x1bW5cXFwiXS5yb3c+LmNvbHVtbnt3aWR0aDo4LjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gY29sdW1uXFxcIl0ucm93Pi5jb2x1bW57d2lkdGg6Ny42OTIzMDc2OSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjcuMTQyODU3MTQlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjYuNjY2NjY2NjclIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLnJvdz4uY29sdW1ue3dpZHRoOjYuMjUlIWltcG9ydGFudH0udWkuY2VsbGVkLnBhZ2UuZ3JpZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcIm9uZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwib25lIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0d28gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInR3byB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjE4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91ciB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpdmUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeCB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwic2l4IHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6MzcuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjU2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGVuIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVsZXZlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGVcXFwiXS5jb2x1bW57d2lkdGg6NzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZVxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjkzLjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4dGVlbiB3aWRlXFxcIl0uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDozMjBweCkgYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo0My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm5pbmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo2Mi41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW57d2lkdGg6ODEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIG1vYmlsZVxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbW9iaWxlXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBtb2JpbGVcXFwiXS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo0My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm5pbmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo2Mi41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgdGFibGV0XFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW57d2lkdGg6ODEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHRhYmxldFxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgdGFibGV0XFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB0YWJsZXRcXFwiXS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo5OTJweCl7LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcIm9uZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwib25lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0d28gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInR3byB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjE4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91ciB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpdmUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwic2l4IHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6MzcuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjU2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW57d2lkdGg6NzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjkzLjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBjb21wdXRlclxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgY29tcHV0ZXJcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4dGVlbiB3aWRlIGNvbXB1dGVyXFxcIl0uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KSBhbmQgKG1heC13aWR0aDoxOTE5cHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwib25lIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo2LjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaXZlIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjMxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInNpeCB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo0My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcIm5pbmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcIm5pbmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo2Mi41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjY4Ljc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInR3ZWx2ZSB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6ODEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo4Ny41JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZpZnRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIGxhcmdlIHNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgbGFyZ2Ugc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSBsYXJnZSBzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxOTIwcHgpey51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJvbmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcIm9uZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJvbmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcIm9uZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0d28gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInR3byB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0d28gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInR3byB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MTIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGhyZWUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRocmVlIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDoxOC43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VyIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImZvdXIgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZpdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImZpdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6MzEuMjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2l4IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXggd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwic2l4IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXggd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjM3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwic2V2ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInNldmVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NDMuNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImVpZ2h0IHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJlaWdodCB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwibmluZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwibmluZSB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJuaW5lIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo1Ni4yNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcInRlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NjIuNSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5jb2x1bW4ucm93PltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJlbGV2ZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW57d2lkdGg6NjguNzUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidHdlbHZlIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0d2VsdmUgd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjc1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0aGlydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhpcnRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjgxLjI1JSFpbXBvcnRhbnR9LnVpLmNvbHVtbi5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmb3VydGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjg3LjUlIWltcG9ydGFudH0udWkuY29sdW1uLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LmNvbHVtbi5yb3c+W2NsYXNzKj1cXFwiZmlmdGVlbiB3aWRlIHdpZGVzY3JlZW5cXFwiXS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJmaWZ0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbnt3aWR0aDo5My43NSUhaW1wb3J0YW50fS51aS5jb2x1bW4uZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4uY29sdW1uLnJvdz5bY2xhc3MqPVxcXCJzaXh0ZWVuIHdpZGUgd2lkZXNjcmVlblxcXCJdLmNvbHVtbiwudWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gd2lkZSB3aWRlc2NyZWVuXFxcIl0uY29sdW1ue3dpZHRoOjEwMCUhaW1wb3J0YW50fX0udWkuY2VudGVyZWQuZ3JpZCwudWkuY2VudGVyZWQuZ3JpZD4ucm93LC51aS5ncmlkPi5jZW50ZXJlZC5yb3d7dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0udWkuY2VudGVyZWQuZ3JpZD4uY29sdW1uOm5vdCguYWxpZ25lZCk6bm90KC5qdXN0aWZpZWQpOm5vdCgucm93KSwudWkuY2VudGVyZWQuZ3JpZD4ucm93Pi5jb2x1bW46bm90KC5hbGlnbmVkKTpub3QoLmp1c3RpZmllZCksLnVpLmdyaWQgLmNlbnRlcmVkLnJvdz4uY29sdW1uOm5vdCguYWxpZ25lZCk6bm90KC5qdXN0aWZpZWQpe3RleHQtYWxpZ246bGVmdH0udWkuZ3JpZD4uY2VudGVyZWQuY29sdW1uLC51aS5ncmlkPi5yb3c+LmNlbnRlcmVkLmNvbHVtbntkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLmdyaWQ+LnJlbGF4ZWQucm93Pi5jb2x1bW4sLnVpLnJlbGF4ZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkucmVsYXhlZC5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nLWxlZnQ6MS41cmVtO3BhZGRpbmctcmlnaHQ6MS41cmVtfS51aS5ncmlkPltjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57cGFkZGluZy1sZWZ0OjIuNXJlbTtwYWRkaW5nLXJpZ2h0OjIuNXJlbX0udWkuZ3JpZCAucmVsYXhlZC5yb3crLnVpLmRpdmlkZXIsLnVpLnJlbGF4ZWQuZ3JpZCAucm93Ky51aS5kaXZpZGVye21hcmdpbi1sZWZ0OjEuNXJlbTttYXJnaW4tcmlnaHQ6MS41cmVtfS51aS5ncmlkIFtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLnJvdysudWkuZGl2aWRlciwudWlbY2xhc3MqPVxcXCJ2ZXJ5IHJlbGF4ZWRcXFwiXS5ncmlkIC5yb3crLnVpLmRpdmlkZXJ7bWFyZ2luLWxlZnQ6Mi41cmVtO21hcmdpbi1yaWdodDoyLjVyZW19LnVpLnBhZGRlZC5ncmlkOm5vdCgudmVydGljYWxseSk6bm90KC5ob3Jpem9udGFsbHkpe21hcmdpbjowIWltcG9ydGFudH1bY2xhc3MqPVxcXCJob3Jpem9udGFsbHkgcGFkZGVkXFxcIl0udWkuZ3JpZHttYXJnaW4tbGVmdDowIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6MCFpbXBvcnRhbnR9W2NsYXNzKj1cXFwidmVydGljYWxseSBwYWRkZWRcXFwiXS51aS5ncmlke21hcmdpbi10b3A6MCFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbTowIWltcG9ydGFudH0udWkuZ3JpZCBbY2xhc3MqPVxcXCJsZWZ0IGZsb2F0ZWRcXFwiXS5jb2x1bW57bWFyZ2luLXJpZ2h0OmF1dG99LnVpLmdyaWQgW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLmNvbHVtbnttYXJnaW4tbGVmdDphdXRvfS51aS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOm5vdCgucm93KSwudWkuZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aVtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57bWFyZ2luLXRvcDoxcmVtO21hcmdpbi1ib3R0b206MXJlbTtwYWRkaW5nLXRvcDowO3BhZGRpbmctYm90dG9tOjB9LnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93e21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LnVpLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5jb2x1bW46Zmlyc3QtY2hpbGQsLnVpLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmZpcnN0LWNoaWxkPi5jb2x1bW57bWFyZ2luLXRvcDowfS51aS5ncmlkPi5kaXZpZGVkLnJvdz4uY29sdW1uey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ncmlkPi5kaXZpZGVkLnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWlbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXS5ncmlkPi5yb3d7cG9zaXRpb246cmVsYXRpdmV9LnVpW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OlxcXCJcXFwiO3RvcDowO2xlZnQ6MDt3aWR0aDpjYWxjKDEwMCUgLSAycmVtKTtoZWlnaHQ6MXB4O21hcmdpbjowIDFyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnBhZGRlZC5kaXZpZGVkLmdyaWQ6bm90KC52ZXJ0aWNhbGx5KTpub3QoLmhvcml6b250YWxseSksW2NsYXNzKj1cXFwiaG9yaXpvbnRhbGx5IHBhZGRlZFxcXCJdLnVpLmRpdmlkZWQuZ3JpZHt3aWR0aDoxMDAlfS51aVtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdLmdyaWQ+LnJvdzpmaXJzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOm5vdCgucm93KSwudWkuaW52ZXJ0ZWQuZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMjU1LDI1NSwyNTUsLjEpO2JveC1zaGFkb3c6LTFweCAwIDAgMCByZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuaW52ZXJ0ZWQuZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LmNvbHVtbjpub3QoLnJvdyk6Zmlyc3QtY2hpbGQsLnVpLmludmVydGVkLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmJlZm9yZXstd2Via2l0LWJveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDI1NSwyNTUsMjU1LC4xKTtib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLnJlbGF4ZWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXS5ncmlkPi5yb3c6YmVmb3Jle21hcmdpbi1sZWZ0OjEuNXJlbTttYXJnaW4tcmlnaHQ6MS41cmVtO3dpZHRoOmNhbGMoMTAwJSAtIDNyZW0pfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0uZ3JpZD4ucm93OmJlZm9yZXttYXJnaW4tbGVmdDo1cmVtO21hcmdpbi1yaWdodDo1cmVtO3dpZHRoOmNhbGMoMTAwJSAtIDVyZW0pfS51aS5jZWxsZWQuZ3JpZHt3aWR0aDoxMDAlO21hcmdpbjoxZW0gMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDU7Ym94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNX0udWkuY2VsbGVkLmdyaWQ+LnJvd3t3aWR0aDoxMDAlIWltcG9ydGFudDttYXJnaW46MDtwYWRkaW5nOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgI2Q0ZDRkNTtib3gtc2hhZG93OjAgLTFweCAwIDAgI2Q0ZDRkNX0udWkuY2VsbGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbnstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1O2JveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1fS51aS5jZWxsZWQuZ3JpZD4uY29sdW1uOmZpcnN0LWNoaWxkLC51aS5jZWxsZWQuZ3JpZD4ucm93Pi5jb2x1bW46Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5jZWxsZWQuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1ue3BhZGRpbmc6MWVtfS51aS5yZWxheGVkLmNlbGxlZC5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aS5yZWxheGVkLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nOjEuNWVtfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmNlbGxlZC5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbntwYWRkaW5nOjJlbX0udWlbY2xhc3MqPVxcXCJpbnRlcm5hbGx5IGNlbGxlZFxcXCJdLmdyaWR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO21hcmdpbjowfS51aVtjbGFzcyo9XFxcImludGVybmFsbHkgY2VsbGVkXFxcIl0uZ3JpZD4ucm93OmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWlbY2xhc3MqPVxcXCJpbnRlcm5hbGx5IGNlbGxlZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uY29sdW1uOm5vdCgucm93KSwudWkuZ3JpZD5bY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1uey13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO3ZlcnRpY2FsLWFsaWduOnRvcDstbXMtZmxleC1pdGVtLWFsaWduOnN0YXJ0IWltcG9ydGFudDthbGlnbi1zZWxmOmZsZXgtc3RhcnQhaW1wb3J0YW50fS51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXS5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXS5jb2x1bW46bm90KC5yb3cpLC51aS5ncmlkPltjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0ucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47dmVydGljYWwtYWxpZ246bWlkZGxlOy1tcy1mbGV4LWl0ZW0tYWxpZ246Y2VudGVyIWltcG9ydGFudDthbGlnbi1zZWxmOmNlbnRlciFpbXBvcnRhbnR9LnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdLmNvbHVtbjpub3QoLnJvdyksLnVpLmdyaWQ+W2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXS5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt2ZXJ0aWNhbC1hbGlnbjpib3R0b207LW1zLWZsZXgtaXRlbS1hbGlnbjplbmQhaW1wb3J0YW50O2FsaWduLXNlbGY6ZmxleC1lbmQhaW1wb3J0YW50fS51aS5ncmlkPi5yb3c+LnN0cmV0Y2hlZC5jb2x1bW4sLnVpLmdyaWQ+LnN0cmV0Y2hlZC5jb2x1bW46bm90KC5yb3cpLC51aS5ncmlkPi5zdHJldGNoZWQucm93Pi5jb2x1bW4sLnVpLnN0cmV0Y2hlZC5ncmlkPi5jb2x1bW4sLnVpLnN0cmV0Y2hlZC5ncmlkPi5yb3c+LmNvbHVtbntkaXNwbGF5Oi13ZWJraXQtaW5saW5lLWJveCFpbXBvcnRhbnQ7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3ghaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lLWZsZXghaW1wb3J0YW50Oy1tcy1mbGV4LWl0ZW0tYWxpZ246c3RyZXRjaDthbGlnbi1zZWxmOnN0cmV0Y2g7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnVpLmdyaWQ+LnJvdz4uc3RyZXRjaGVkLmNvbHVtbj4qLC51aS5ncmlkPi5zdHJldGNoZWQuY29sdW1uOm5vdCgucm93KT4qLC51aS5ncmlkPi5zdHJldGNoZWQucm93Pi5jb2x1bW4+KiwudWkuc3RyZXRjaGVkLmdyaWQ+LmNvbHVtbj4qLC51aS5zdHJldGNoZWQuZ3JpZD4ucm93Pi5jb2x1bW4+Knstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXgtcG9zaXRpdmU6MTtmbGV4LWdyb3c6MX0udWkuZ3JpZD4ucm93PltjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0uY29sdW1uLmNvbHVtbiwudWkuZ3JpZD5bY2xhc3MqPVxcXCJsZWZ0IGFsaWduZWRcXFwiXS5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJsZWZ0IGFsaWduZWRcXFwiXS5ncmlkPi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0uZ3JpZD4ucm93Pi5jb2x1bW57dGV4dC1hbGlnbjpsZWZ0Oy1tcy1mbGV4LWl0ZW0tYWxpZ246aW5oZXJpdDthbGlnbi1zZWxmOmluaGVyaXR9LnVpLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJdLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXS5jb2x1bW4uY29sdW1uLC51aS5ncmlkPltjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0ucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXS5ncmlkPi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiY2VudGVyIGFsaWduZWRcXFwiXS5ncmlkPi5yb3c+LmNvbHVtbnt0ZXh0LWFsaWduOmNlbnRlcjstbXMtZmxleC1pdGVtLWFsaWduOmluaGVyaXQ7YWxpZ24tc2VsZjppbmhlcml0fS51aVtjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl0uZ3JpZHstd2Via2l0LWJveC1wYWNrOmNlbnRlcjstbXMtZmxleC1wYWNrOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS51aS5ncmlkPi5yb3c+W2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+W2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInJpZ2h0IGFsaWduZWRcXFwiXS5ncmlkPi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJdLmdyaWQ+LnJvdz4uY29sdW1ue3RleHQtYWxpZ246cmlnaHQ7LW1zLWZsZXgtaXRlbS1hbGlnbjppbmhlcml0O2FsaWduLXNlbGY6aW5oZXJpdH0udWkuZ3JpZD4uanVzdGlmaWVkLmNvbHVtbi5jb2x1bW4sLnVpLmdyaWQ+Lmp1c3RpZmllZC5yb3c+LmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5qdXN0aWZpZWQuY29sdW1uLmNvbHVtbiwudWkuanVzdGlmaWVkLmdyaWQ+LmNvbHVtbiwudWkuanVzdGlmaWVkLmdyaWQ+LnJvdz4uY29sdW1ue3RleHQtYWxpZ246anVzdGlmeTstd2Via2l0LWh5cGhlbnM6YXV0bzstbXMtaHlwaGVuczphdXRvO2h5cGhlbnM6YXV0b30udWkuZ3JpZD4ucm93Pi5ibGFjay5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4uYmx1ZS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4uYnJvd24uY29sdW1uLC51aS5ncmlkPi5yb3c+LmdyZWVuLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5ncmV5LmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5vbGl2ZS5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4ub3JhbmdlLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5waW5rLmNvbHVtbiwudWkuZ3JpZD4ucm93Pi5wdXJwbGUuY29sdW1uLC51aS5ncmlkPi5yb3c+LnJlZC5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4udGVhbC5jb2x1bW4sLnVpLmdyaWQ+LnJvdz4udmlvbGV0LmNvbHVtbiwudWkuZ3JpZD4ucm93Pi55ZWxsb3cuY29sdW1ue21hcmdpbi10b3A6LTFyZW07bWFyZ2luLWJvdHRvbTotMXJlbTtwYWRkaW5nLXRvcDoxcmVtO3BhZGRpbmctYm90dG9tOjFyZW19LnVpLmdyaWQ+LnJlZC5jb2x1bW4sLnVpLmdyaWQ+LnJlZC5yb3csLnVpLmdyaWQ+LnJvdz4ucmVkLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4MjghaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+Lm9yYW5nZS5jb2x1bW4sLnVpLmdyaWQ+Lm9yYW5nZS5yb3csLnVpLmdyaWQ+LnJvdz4ub3JhbmdlLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiNmMjcxMWMhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LnJvdz4ueWVsbG93LmNvbHVtbiwudWkuZ3JpZD4ueWVsbG93LmNvbHVtbiwudWkuZ3JpZD4ueWVsbG93LnJvd3tiYWNrZ3JvdW5kLWNvbG9yOiNmYmJkMDghaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+Lm9saXZlLmNvbHVtbiwudWkuZ3JpZD4ub2xpdmUucm93LC51aS5ncmlkPi5yb3c+Lm9saXZlLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiNiNWNjMTghaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LmdyZWVuLmNvbHVtbiwudWkuZ3JpZD4uZ3JlZW4ucm93LC51aS5ncmlkPi5yb3c+LmdyZWVuLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LnJvdz4udGVhbC5jb2x1bW4sLnVpLmdyaWQ+LnRlYWwuY29sdW1uLC51aS5ncmlkPi50ZWFsLnJvd3tiYWNrZ3JvdW5kLWNvbG9yOiMwMGI1YWQhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LmJsdWUuY29sdW1uLC51aS5ncmlkPi5ibHVlLnJvdywudWkuZ3JpZD4ucm93Pi5ibHVlLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiMyMTg1ZDAhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LnJvdz4udmlvbGV0LmNvbHVtbiwudWkuZ3JpZD4udmlvbGV0LmNvbHVtbiwudWkuZ3JpZD4udmlvbGV0LnJvd3tiYWNrZ3JvdW5kLWNvbG9yOiM2NDM1YzkhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LnB1cnBsZS5jb2x1bW4sLnVpLmdyaWQ+LnB1cnBsZS5yb3csLnVpLmdyaWQ+LnJvdz4ucHVycGxlLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiNhMzMzYzghaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LnBpbmsuY29sdW1uLC51aS5ncmlkPi5waW5rLnJvdywudWkuZ3JpZD4ucm93Pi5waW5rLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LmJyb3duLmNvbHVtbiwudWkuZ3JpZD4uYnJvd24ucm93LC51aS5ncmlkPi5yb3c+LmJyb3duLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiNhNTY3M2YhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LmdyZXkuY29sdW1uLC51aS5ncmlkPi5ncmV5LnJvdywudWkuZ3JpZD4ucm93Pi5ncmV5LmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+LmJsYWNrLmNvbHVtbiwudWkuZ3JpZD4uYmxhY2sucm93LC51aS5ncmlkPi5yb3c+LmJsYWNrLmNvbHVtbntiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQhaW1wb3J0YW50O2NvbG9yOiNmZmZ9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5ncmlkPi5yb3c+LmNvbHVtbntkaXNwbGF5OmlubGluZS1ibG9jazstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXgtcG9zaXRpdmU6MTtmbGV4LWdyb3c6MX0udWkuZ3JpZD5bY2xhc3MqPVxcXCJlcXVhbCB3aWR0aFxcXCJdLnJvdz4ud2lkZS5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZXF1YWwgd2lkdGhcXFwiXS5ncmlkPi5yb3c+LndpZGUuY29sdW1uLC51aVtjbGFzcyo9XFxcImVxdWFsIHdpZHRoXFxcIl0uZ3JpZD4ud2lkZS5jb2x1bW57LXdlYmtpdC1ib3gtZmxleDowOy1tcy1mbGV4LXBvc2l0aXZlOjA7ZmxleC1ncm93OjB9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuZ3JpZD5bY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXS5yb3csLnVpW2NsYXNzKj1cXFwibW9iaWxlIHJldmVyc2VkXFxcIl0uZ3JpZCwudWlbY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXS5ncmlkPi5yb3d7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOnJldmVyc2U7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlO2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlfS51aS5zdGFja2FibGVbY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXSwudWlbY2xhc3MqPVxcXCJtb2JpbGUgdmVydGljYWxseSByZXZlcnNlZFxcXCJdLmdyaWR7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpyZXZlcnNlOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0udWlbY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOmZpcnN0LWNoaWxkLC51aVtjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWlbY2xhc3MqPVxcXCJtb2JpbGUgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOmxhc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwibW9iaWxlIHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5ncmlkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl1bY2xhc3MqPVxcXCJtb2JpbGUgdmVydGljYWxseSByZXZlcnNlZFxcXCJdPi5yb3c6Zmlyc3QtY2hpbGQ6YmVmb3Jley13ZWJraXQtYm94LXNoYWRvdzowIC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ncmlkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl1bY2xhc3MqPVxcXCJtb2JpbGUgdmVydGljYWxseSByZXZlcnNlZFxcXCJdPi5yb3c6bGFzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aVtjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1O2JveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1fS51aVtjbGFzcyo9XFxcIm1vYmlsZSByZXZlcnNlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbjpsYXN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KSBhbmQgKG1heC13aWR0aDo5OTFweCl7LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0ucm93LC51aVtjbGFzcyo9XFxcInRhYmxldCByZXZlcnNlZFxcXCJdLmdyaWQsLnVpW2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0uZ3JpZD4ucm93ey13ZWJraXQtYm94LW9yaWVudDpob3Jpem9udGFsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpyZXZlcnNlOy1tcy1mbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZTtmbGV4LWRpcmVjdGlvbjpyb3ctcmV2ZXJzZX0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgdmVydGljYWxseSByZXZlcnNlZFxcXCJdLmdyaWR7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpyZXZlcnNlOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZTtmbGV4LWRpcmVjdGlvbjpjb2x1bW4tcmV2ZXJzZX0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOmZpcnN0LWNoaWxkLC51aVtjbGFzcyo9XFxcInRhYmxldCByZXZlcnNlZFxcXCJdLmRpdmlkZWQuZ3JpZDpub3QoW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl0pPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOmxhc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwidGFibGV0IHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5ncmlkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl1bY2xhc3MqPVxcXCJ0YWJsZXQgdmVydGljYWxseSByZXZlcnNlZFxcXCJdPi5yb3c6Zmlyc3QtY2hpbGQ6YmVmb3Jley13ZWJraXQtYm94LXNoYWRvdzowIC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ncmlkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl1bY2xhc3MqPVxcXCJ0YWJsZXQgdmVydGljYWxseSByZXZlcnNlZFxcXCJdPi5yb3c6bGFzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aVtjbGFzcyo9XFxcInRhYmxldCByZXZlcnNlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1O2JveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1fS51aVtjbGFzcyo9XFxcInRhYmxldCByZXZlcnNlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbjpsYXN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjk5MnB4KXsudWkuZ3JpZD5bY2xhc3MqPVxcXCJjb21wdXRlciByZXZlcnNlZFxcXCJdLnJvdywudWlbY2xhc3MqPVxcXCJjb21wdXRlciByZXZlcnNlZFxcXCJdLmdyaWQsLnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgcmV2ZXJzZWRcXFwiXS5ncmlkPi5yb3d7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOnJldmVyc2U7LW1zLWZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlO2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlfS51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHZlcnRpY2FsbHkgcmV2ZXJzZWRcXFwiXS5ncmlkey13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246cmV2ZXJzZTstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2U7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9LnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgcmV2ZXJzZWRcXFwiXS5kaXZpZGVkLmdyaWQ6bm90KFtjbGFzcyo9XFxcInZlcnRpY2FsbHkgZGl2aWRlZFxcXCJdKT4uY29sdW1uOmZpcnN0LWNoaWxkLC51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzotMXB4IDAgMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93Oi0xcHggMCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LmNvbHVtbjpsYXN0LWNoaWxkLC51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0uZGl2aWRlZC5ncmlkOm5vdChbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXSk+LnJvdz4uY29sdW1uOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5ncmlkW2NsYXNzKj1cXFwidmVydGljYWxseSBkaXZpZGVkXFxcIl1bY2xhc3MqPVxcXCJjb21wdXRlciB2ZXJ0aWNhbGx5IHJldmVyc2VkXFxcIl0+LnJvdzpmaXJzdC1jaGlsZDpiZWZvcmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmdyaWRbY2xhc3MqPVxcXCJ2ZXJ0aWNhbGx5IGRpdmlkZWRcXFwiXVtjbGFzcyo9XFxcImNvbXB1dGVyIHZlcnRpY2FsbHkgcmV2ZXJzZWRcXFwiXT4ucm93Omxhc3QtY2hpbGQ6YmVmb3Jley13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWlbY2xhc3MqPVxcXCJjb21wdXRlciByZXZlcnNlZFxcXCJdLmNlbGxlZC5ncmlkPi5yb3c+LmNvbHVtbjpmaXJzdC1jaGlsZHstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1O2JveC1zaGFkb3c6LTFweCAwIDAgMCAjZDRkNGQ1fS51aVtjbGFzcyo9XFxcImNvbXB1dGVyIHJldmVyc2VkXFxcIl0uY2VsbGVkLmdyaWQ+LnJvdz4uY29sdW1uOmxhc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkuZG91YmxpbmcuZ3JpZHt3aWR0aDphdXRvfS51aS5kb3VibGluZy5ncmlkPi5yb3csLnVpLmdyaWQ+LmRvdWJsaW5nLnJvd3ttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzowIWltcG9ydGFudH0udWkuZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW4sLnVpLmdyaWQ+LmRvdWJsaW5nLnJvdz4uY29sdW1ue2Rpc3BsYXk6aW5saW5lLWJsb2NrIWltcG9ydGFudDtwYWRkaW5nLXRvcDoxcmVtIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbToxcmVtIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDttYXJnaW46MH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0d28gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInR3byBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInR3byBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxMDAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidGhyZWUgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo1MCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZvdXIgY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImZvdXIgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZml2ZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImZpdmUgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXggY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDozMy4zMzMzMzMzMyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJzZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImVpZ2h0IGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJuaW5lIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwibmluZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyNSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInRlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjIwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZWxldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0d2VsdmUgY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInR3ZWx2ZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInR3ZWx2ZSBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNi42NjY2NjY2NyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0aGlydGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjE2LjY2NjY2NjY3JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImZvdXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MTQuMjg1NzE0MjklIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJmaWZ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZmlmdGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZy5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoxNC4yODU3MTQyOSUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcInNpeHRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmcucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInNpeHRlZW4gY29sdW1uXFxcIl0uZG91YmxpbmcuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjEyLjUlIWltcG9ydGFudH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuZG91YmxpbmcuZ3JpZD4ucm93LC51aS5ncmlkPi5kb3VibGluZy5yb3d7bWFyZ2luOjAhaW1wb3J0YW50O3BhZGRpbmc6MCFpbXBvcnRhbnR9LnVpLmRvdWJsaW5nLmdyaWQ+LnJvdz4uY29sdW1uLC51aS5ncmlkPi5kb3VibGluZy5yb3c+LmNvbHVtbntwYWRkaW5nLXRvcDoxcmVtIWltcG9ydGFudDtwYWRkaW5nLWJvdHRvbToxcmVtIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidHdvIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInR3byBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidGhyZWUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJ0aHJlZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZm91ciBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJmb3VyIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo1MCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZpdmUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJmaXZlIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcImZpdmUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwic2l4IGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwic2l4IGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNpeCBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6NTAlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJzZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInNldmVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDo1MCUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImVpZ2h0IGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZWlnaHQgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjUwJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwibmluZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcIm5pbmUgY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwibmluZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLnJvdy5yb3c+LmNvbHVtbiwudWlbY2xhc3MqPVxcXCJ0ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwidGVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDozMy4zMzMzMzMzMyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImVsZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImVsZXZlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJlbGV2ZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjMzLjMzMzMzMzMzJSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwidHdlbHZlIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInR3ZWx2ZSBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MzMuMzMzMzMzMzMlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJ0aGlydGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aVtjbGFzcyo9XFxcInRoaXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDozMy4zMzMzMzMzMyUhaW1wb3J0YW50fS51aS5ncmlkPltjbGFzcyo9XFxcImZvdXJ0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZm91cnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LnJvdz4uY29sdW1ue3dpZHRoOjI1JSFpbXBvcnRhbnR9LnVpLmdyaWQ+W2NsYXNzKj1cXFwiZmlmdGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkucm93LnJvdz4uY29sdW1uLC51aVtjbGFzcyo9XFxcImZpZnRlZW4gY29sdW1uXFxcIl0uZG91Ymxpbmc6bm90KC5zdGFja2FibGUpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpW2NsYXNzKj1cXFwiZmlmdGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4ucm93Pi5jb2x1bW57d2lkdGg6MjUlIWltcG9ydGFudH0udWkuZ3JpZD5bY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5yb3cucm93Pi5jb2x1bW4sLnVpW2NsYXNzKj1cXFwic2l4dGVlbiBjb2x1bW5cXFwiXS5kb3VibGluZzpub3QoLnN0YWNrYWJsZSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWlbY2xhc3MqPVxcXCJzaXh0ZWVuIGNvbHVtblxcXCJdLmRvdWJsaW5nOm5vdCguc3RhY2thYmxlKS5ncmlkPi5yb3c+LmNvbHVtbnt3aWR0aDoyNSUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5zdGFja2FibGUuZ3JpZHt3aWR0aDphdXRvO21hcmdpbi1sZWZ0OjAhaW1wb3J0YW50O21hcmdpbi1yaWdodDowIWltcG9ydGFudH0udWkuZ3JpZD4uc3RhY2thYmxlLnN0YWNrYWJsZS5yb3c+LmNvbHVtbiwudWkuc3RhY2thYmxlLmdyaWQ+LmNvbHVtbi5ncmlkPi5jb2x1bW4sLnVpLnN0YWNrYWJsZS5ncmlkPi5jb2x1bW4ucm93Pi5jb2x1bW4sLnVpLnN0YWNrYWJsZS5ncmlkPi5jb2x1bW46bm90KC5yb3cpLC51aS5zdGFja2FibGUuZ3JpZD4ucm93Pi5jb2x1bW4sLnVpLnN0YWNrYWJsZS5ncmlkPi5yb3c+LndpZGUuY29sdW1uLC51aS5zdGFja2FibGUuZ3JpZD4ud2lkZS5jb2x1bW57d2lkdGg6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luOjAgMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7cGFkZGluZzoxcmVtIDFyZW0haW1wb3J0YW50fS51aS5zdGFja2FibGUuZ3JpZDpub3QoLnZlcnRpY2FsbHkpPi5yb3d7bWFyZ2luOjA7cGFkZGluZzowfS51aS5jb250YWluZXI+LnVpLnN0YWNrYWJsZS5ncmlkPi5jb2x1bW4sLnVpLmNvbnRhaW5lcj4udWkuc3RhY2thYmxlLmdyaWQ+LnJvdz4uY29sdW1ue3BhZGRpbmctbGVmdDowIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjAhaW1wb3J0YW50fS51aS5ncmlkIC51aS5zdGFja2FibGUuZ3JpZCwudWkuc2VnbWVudDpub3QoLnZlcnRpY2FsKSAudWkuc3RhY2thYmxlLnBhZ2UuZ3JpZHttYXJnaW4tbGVmdDotMXJlbSFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0Oi0xcmVtIWltcG9ydGFudH0udWkuc3RhY2thYmxlLmNlbGxlZC5ncmlkPi5jb2x1bW46bm90KC5yb3cpOmZpcnN0LWNoaWxkLC51aS5zdGFja2FibGUuY2VsbGVkLmdyaWQ+LnJvdzpmaXJzdC1jaGlsZD4uY29sdW1uOmZpcnN0LWNoaWxkLC51aS5zdGFja2FibGUuZGl2aWRlZC5ncmlkPi5jb2x1bW46bm90KC5yb3cpOmZpcnN0LWNoaWxkLC51aS5zdGFja2FibGUuZGl2aWRlZC5ncmlkPi5yb3c6Zmlyc3QtY2hpbGQ+LmNvbHVtbjpmaXJzdC1jaGlsZHtib3JkZXItdG9wOm5vbmUhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5zdGFja2FibGUuY2VsbGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLmludmVydGVkLnN0YWNrYWJsZS5jZWxsZWQuZ3JpZD4ucm93Pi5jb2x1bW4sLnVpLmludmVydGVkLnN0YWNrYWJsZS5kaXZpZGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLmludmVydGVkLnN0YWNrYWJsZS5kaXZpZGVkLmdyaWQ+LnJvdz4uY29sdW1ue2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjEpfS51aS5zdGFja2FibGUuY2VsbGVkLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLnN0YWNrYWJsZS5jZWxsZWQuZ3JpZD4ucm93Pi5jb2x1bW4sLnVpLnN0YWNrYWJsZS5kaXZpZGVkOm5vdCgudmVydGljYWxseSkuZ3JpZD4uY29sdW1uOm5vdCgucm93KSwudWkuc3RhY2thYmxlLmRpdmlkZWQ6bm90KC52ZXJ0aWNhbGx5KS5ncmlkPi5yb3c+LmNvbHVtbntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7cGFkZGluZy10b3A6MnJlbSFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MnJlbSFpbXBvcnRhbnR9LnVpLnN0YWNrYWJsZS5jZWxsZWQuZ3JpZD4ucm93ey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS51aS5zdGFja2FibGUuZGl2aWRlZDpub3QoLnZlcnRpY2FsbHkpLmdyaWQ+LmNvbHVtbjpub3QoLnJvdyksLnVpLnN0YWNrYWJsZS5kaXZpZGVkOm5vdCgudmVydGljYWxseSkuZ3JpZD4ucm93Pi5jb2x1bW57cGFkZGluZy1sZWZ0OjAhaW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MCFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0ucm93Om5vdCgubW9iaWxlKSwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcImNvbXB1dGVyIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJjb21wdXRlciBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwiY29tcHV0ZXIgb25seVxcXCJdLnJvdzpub3QoLm1vYmlsZSksLnVpW2NsYXNzKj1cXFwiY29tcHV0ZXIgb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLnJvdzpub3QoLm1vYmlsZSksLnVpW2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLm1vYmlsZSl7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5yb3c6bm90KC5tb2JpbGUpLC51aVtjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLnRhYmxldCksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uY29sdW1uOm5vdCgudGFibGV0KSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5yb3c6bm90KC50YWJsZXQpLC51aVtjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC50YWJsZXQpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwiY29tcHV0ZXIgb25seVxcXCJdLmNvbHVtbjpub3QoLnRhYmxldCksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImNvbXB1dGVyIG9ubHlcXFwiXS5jb2x1bW46bm90KC50YWJsZXQpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJjb21wdXRlciBvbmx5XFxcIl0ucm93Om5vdCgudGFibGV0KSwudWlbY2xhc3MqPVxcXCJjb21wdXRlciBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC50YWJsZXQpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0ucm93Om5vdCgubW9iaWxlKSwudWlbY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5ncmlkLmdyaWQuZ3JpZD4ucm93PltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLnJvdzpub3QoLm1vYmlsZSksLnVpW2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo5OTJweCkgYW5kIChtYXgtd2lkdGg6MTE5OXB4KXsudWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5jb2x1bW46bm90KC5jb21wdXRlciksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0ucm93Om5vdCguY29tcHV0ZXIpLC51aVtjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5jb21wdXRlcil7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5jb2x1bW46bm90KC5jb21wdXRlciksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0ucm93Om5vdCguY29tcHV0ZXIpLC51aVtjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5jb21wdXRlcil7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJsYXJnZSBzY3JlZW4gb25seVxcXCJdLmNvbHVtbjpub3QoLm1vYmlsZSksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibGFyZ2Ugc2NyZWVuIG9ubHlcXFwiXS5yb3c6bm90KC5tb2JpbGUpLC51aVtjbGFzcyo9XFxcImxhcmdlIHNjcmVlbiBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5tb2JpbGUpe2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLmdyaWQuZ3JpZC5ncmlkPi5yb3c+W2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0uY29sdW1uOm5vdCgubW9iaWxlKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwid2lkZXNjcmVlbiBvbmx5XFxcIl0ucm93Om5vdCgubW9iaWxlKSwudWlbY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5ncmlkLmdyaWQuZ3JpZDpub3QoLm1vYmlsZSl7ZGlzcGxheTpub25lIWltcG9ydGFudH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEyMDBweCkgYW5kIChtYXgtd2lkdGg6MTkxOXB4KXsudWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5jb2x1bW46bm90KC5jb21wdXRlciksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0ucm93Om5vdCguY29tcHV0ZXIpLC51aVtjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5jb21wdXRlcil7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5jb2x1bW46bm90KC5jb21wdXRlciksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0ucm93Om5vdCguY29tcHV0ZXIpLC51aVtjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5jb21wdXRlcil7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5jb2x1bW46bm90KC5tb2JpbGUpLC51aS5ncmlkLmdyaWQuZ3JpZD5bY2xhc3MqPVxcXCJ3aWRlc2NyZWVuIG9ubHlcXFwiXS5yb3c6bm90KC5tb2JpbGUpLC51aVtjbGFzcyo9XFxcIndpZGVzY3JlZW4gb25seVxcXCJdLmdyaWQuZ3JpZC5ncmlkOm5vdCgubW9iaWxlKXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJtb2JpbGUgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwibW9iaWxlIG9ubHlcXFwiXS5jb2x1bW46bm90KC5jb21wdXRlciksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0ucm93Om5vdCguY29tcHV0ZXIpLC51aVtjbGFzcyo9XFxcIm1vYmlsZSBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5jb21wdXRlcil7ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZ3JpZC5ncmlkLmdyaWQ+LnJvdz5bY2xhc3MqPVxcXCJ0YWJsZXQgb25seVxcXCJdLmNvbHVtbjpub3QoLmNvbXB1dGVyKSwudWkuZ3JpZC5ncmlkLmdyaWQ+W2NsYXNzKj1cXFwidGFibGV0IG9ubHlcXFwiXS5jb2x1bW46bm90KC5jb21wdXRlciksLnVpLmdyaWQuZ3JpZC5ncmlkPltjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0ucm93Om5vdCguY29tcHV0ZXIpLC51aVtjbGFzcyo9XFxcInRhYmxldCBvbmx5XFxcIl0uZ3JpZC5ncmlkLmdyaWQ6bm90KC5jb21wdXRlcil7ZGlzcGxheTpub25lIWltcG9ydGFudH19LnVpLm1lbnV7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDttYXJnaW46MXJlbSAwO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtiYWNrZ3JvdW5kOiNmZmY7Zm9udC13ZWlnaHQ6NDAwO2JvcmRlcjoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07bWluLWhlaWdodDoyLjg1NzE0Mjg2ZW19LnVpLm1lbnU6YWZ0ZXJ7Y29udGVudDonJztkaXNwbGF5OmJsb2NrO2hlaWdodDowO2NsZWFyOmJvdGg7dmlzaWJpbGl0eTpoaWRkZW59LnVpLm1lbnU6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5tZW51Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5tZW51IC5tZW51e21hcmdpbjowfS51aS5tZW51Om5vdCgudmVydGljYWwpPi5tZW51e2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXh9LnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLml0ZW17ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0udWkubWVudSAuaXRlbXtwb3NpdGlvbjpyZWxhdGl2ZTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bGluZS1oZWlnaHQ6MTt0ZXh0LWRlY29yYXRpb246bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC1ib3gtZmxleDowOy1tcy1mbGV4OjAgMCBhdXRvO2ZsZXg6MCAwIGF1dG87LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2JhY2tncm91bmQ6MCAwO3BhZGRpbmc6LjkyODU3MTQzZW0gMS4xNDI4NTcxNGVtO3RleHQtdHJhbnNmb3JtOm5vbmU7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2ZvbnQtd2VpZ2h0OjQwMDstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2V9LnVpLm1lbnU+Lml0ZW06Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gMCAwIC4yODU3MTQyOXJlbX0udWkubWVudSAuaXRlbTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6MDtyaWdodDowO2hlaWdodDoxMDAlO3dpZHRoOjFweDtiYWNrZ3JvdW5kOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5tZW51IC5pdGVtPmE6bm90KC51aSksLnVpLm1lbnUgLml0ZW0+cDpvbmx5LWNoaWxkLC51aS5tZW51IC50ZXh0Lml0ZW0+Knstd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7LW1vei11c2VyLXNlbGVjdDp0ZXh0Oy1tcy11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHQ7bGluZS1oZWlnaHQ6MS4zfS51aS5tZW51IC5pdGVtPnA6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5tZW51IC5pdGVtPnA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLm1lbnUgLml0ZW0+aS5pY29ue29wYWNpdHk6Ljk7ZmxvYXQ6bm9uZTttYXJnaW46MCAuMzU3MTQyODZlbSAwIDB9LnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLml0ZW0+LmJ1dHRvbntwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDttYXJnaW46LS41ZW0gMDtwYWRkaW5nLWJvdHRvbTouNzg1NzE0MjllbTtwYWRkaW5nLXRvcDouNzg1NzE0MjllbTtmb250LXNpemU6MWVtfS51aS5tZW51Pi5jb250YWluZXIsLnVpLm1lbnU+LmdyaWR7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1hbGlnbjppbmhlcml0Oy1tcy1mbGV4LWFsaWduOmluaGVyaXQ7YWxpZ24taXRlbXM6aW5oZXJpdDstd2Via2l0LWJveC1vcmllbnQ6aW5oZXJpdDstd2Via2l0LWJveC1kaXJlY3Rpb246aW5oZXJpdDstbXMtZmxleC1kaXJlY3Rpb246aW5oZXJpdDtmbGV4LWRpcmVjdGlvbjppbmhlcml0fS51aS5tZW51IC5pdGVtPi5pbnB1dHt3aWR0aDoxMDAlfS51aS5tZW51Om5vdCgudmVydGljYWwpIC5pdGVtPi5pbnB1dHtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDttYXJnaW46LS41ZW0gMH0udWkubWVudSAuaXRlbT4uaW5wdXQgaW5wdXR7Zm9udC1zaXplOjFlbTtwYWRkaW5nLXRvcDouNTcxNDI4NTdlbTtwYWRkaW5nLWJvdHRvbTouNTcxNDI4NTdlbX0udWkubWVudSAuaGVhZGVyLml0ZW0sLnVpLnZlcnRpY2FsLm1lbnUgLmhlYWRlci5pdGVte21hcmdpbjowO2JhY2tncm91bmQ6Jyc7dGV4dC10cmFuc2Zvcm06bm9ybWFsO2ZvbnQtd2VpZ2h0OjcwMH0udWkudmVydGljYWwubWVudSAuaXRlbT4uaGVhZGVyOm5vdCgudWkpe21hcmdpbjowIDAgLjVlbTtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjcwMH0udWkubWVudSAuaXRlbT5pLmRyb3Bkb3duLmljb257cGFkZGluZzowO2Zsb2F0OnJpZ2h0O21hcmdpbjowIDAgMCAxZW19LnVpLm1lbnUgLmRyb3Bkb3duLml0ZW0gLm1lbnV7bWluLXdpZHRoOmNhbGMoMTAwJSAtIDFweCk7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbTtiYWNrZ3JvdW5kOiNmZmY7bWFyZ2luOjAgMCAwOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAzcHggMCByZ2JhKDAsMCwwLC4wOCk7Ym94LXNoYWRvdzowIDFweCAzcHggMCByZ2JhKDAsMCwwLC4wOCk7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsIWltcG9ydGFudDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsIWltcG9ydGFudDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uIWltcG9ydGFudDtmbGV4LWRpcmVjdGlvbjpjb2x1bW4haW1wb3J0YW50fS51aS5tZW51IC51aS5kcm9wZG93biAubWVudT4uaXRlbXttYXJnaW46MDt0ZXh0LWFsaWduOmxlZnQ7Zm9udC1zaXplOjFlbSFpbXBvcnRhbnQ7cGFkZGluZzouNzg1NzE0MjllbSAxLjE0Mjg1NzE0ZW0haW1wb3J0YW50O2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC44NykhaW1wb3J0YW50O3RleHQtdHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50O2ZvbnQtd2VpZ2h0OjQwMCFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50O3RyYW5zaXRpb246bm9uZSFpbXBvcnRhbnR9LnVpLm1lbnUgLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtOmhvdmVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpIWltcG9ydGFudDtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS5tZW51IC51aS5kcm9wZG93biAubWVudT4uc2VsZWN0ZWQuaXRlbXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KSFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkubWVudSAudWkuZHJvcGRvd24gLm1lbnU+LmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDMpIWltcG9ydGFudDtmb250LXdlaWdodDo3MDAhaW1wb3J0YW50O2NvbG9yOnJnYmEoMCwwLDAsLjk1KSFpbXBvcnRhbnR9LnVpLm1lbnUgLnVpLmRyb3Bkb3duLml0ZW0gLm1lbnUgLml0ZW06bm90KC5maWx0ZXJlZCl7ZGlzcGxheTpibG9ja30udWkubWVudSAudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0gLmljb246bm90KC5kcm9wZG93bil7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjFlbSFpbXBvcnRhbnQ7ZmxvYXQ6bm9uZTttYXJnaW46MCAuNzVlbSAwIDAhaW1wb3J0YW50fS51aS5zZWNvbmRhcnkubWVudSAuZHJvcGRvd24uaXRlbT4ubWVudSwudWkudGV4dC5tZW51IC5kcm9wZG93bi5pdGVtPi5tZW51e2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO21hcmdpbi10b3A6LjM1NzE0Mjg2ZW19LnVpLm1lbnUgLnBvaW50aW5nLmRyb3Bkb3duLml0ZW0gLm1lbnV7bWFyZ2luLXRvcDouNzVlbX0udWkuaW52ZXJ0ZWQubWVudSAuc2VhcmNoLmRyb3Bkb3duLml0ZW0+LnNlYXJjaCwudWkuaW52ZXJ0ZWQubWVudSAuc2VhcmNoLmRyb3Bkb3duLml0ZW0+LnRleHR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLnZlcnRpY2FsLm1lbnUgLmRyb3Bkb3duLml0ZW0+Lmljb257ZmxvYXQ6cmlnaHQ7Y29udGVudDpcXFwiXFxcXGYwZGFcXFwiO21hcmdpbi1sZWZ0OjFlbX0udWkudmVydGljYWwubWVudSAuZHJvcGRvd24uaXRlbSAubWVudXtsZWZ0OjEwMCU7bWluLXdpZHRoOjA7bWFyZ2luOjA7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDNweCAwIHJnYmEoMCwwLDAsLjA4KTtib3gtc2hhZG93OjAgMXB4IDNweCAwIHJnYmEoMCwwLDAsLjA4KTtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLm1lbnUgLmRyb3Bkb3duLml0ZW0udXB3YXJkIC5tZW51e2JvdHRvbTowfS51aS52ZXJ0aWNhbC5tZW51IC5kcm9wZG93bi5pdGVtOm5vdCgudXB3YXJkKSAubWVudXt0b3A6MH0udWkudmVydGljYWwubWVudSAuYWN0aXZlLmRyb3Bkb3duLml0ZW17Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czowfS51aS52ZXJ0aWNhbC5tZW51IC5kcm9wZG93bi5hY3RpdmUuaXRlbXstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLml0ZW0ubWVudSAuZHJvcGRvd24gLm1lbnUgLml0ZW17d2lkdGg6MTAwJX0udWkubWVudSAuaXRlbT4ubGFiZWx7YmFja2dyb3VuZDojOTk5O2NvbG9yOiNmZmY7bWFyZ2luLWxlZnQ6MWVtO3BhZGRpbmc6LjNlbSAuNzg1NzE0MjllbX0udWkudmVydGljYWwubWVudSAuaXRlbT4ubGFiZWx7YmFja2dyb3VuZDojOTk5O2NvbG9yOiNmZmY7bWFyZ2luLXRvcDotLjE1ZW07bWFyZ2luLWJvdHRvbTotLjE1ZW07cGFkZGluZzouM2VtIC43ODU3MTQyOWVtfS51aS5tZW51IC5pdGVtPi5mbG9hdGluZy5sYWJlbHtwYWRkaW5nOi4zZW0gLjc4NTcxNDI5ZW19LnVpLm1lbnUgLml0ZW0+aW1nOm5vdCgudWkpe2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW46LS4zZW0gMDt3aWR0aDoyLjVlbX0udWkudmVydGljYWwubWVudSAuaXRlbT5pbWc6bm90KC51aSk6b25seS1jaGlsZHtkaXNwbGF5OmJsb2NrO21heC13aWR0aDoxMDAlO3dpZHRoOmF1dG99LnVpLm1lbnUgLmxpc3QgLml0ZW06YmVmb3Jle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH0udWkudmVydGljYWwuc2lkZWJhci5tZW51Pi5pdGVtOmZpcnN0LWNoaWxkOmJlZm9yZXtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH0udWkudmVydGljYWwuc2lkZWJhci5tZW51Pi5pdGVtOjpiZWZvcmV7dG9wOmF1dG87Ym90dG9tOjB9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkubWVudT4udWkuY29udGFpbmVye3dpZHRoOjEwMCUhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjAhaW1wb3J0YW50O21hcmdpbi1yaWdodDowIWltcG9ydGFudH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KXsudWkubWVudTpub3QoLnNlY29uZGFyeSk6bm90KC50ZXh0KTpub3QoLnRhYnVsYXIpOm5vdCguYm9yZGVybGVzcyk+LmNvbnRhaW5lcj4uaXRlbTpub3QoLnJpZ2h0KTpub3QoLmJvcmRlcmxlc3MpOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKX19LnVpLmxpbmsubWVudSAuaXRlbTpob3ZlciwudWkubWVudSAuZHJvcGRvd24uaXRlbTpob3ZlciwudWkubWVudSAubGluay5pdGVtOmhvdmVyLC51aS5tZW51IGEuaXRlbTpob3ZlcntjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjAzKTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmxpbmsubWVudSAuaXRlbTphY3RpdmUsLnVpLm1lbnUgLmxpbmsuaXRlbTphY3RpdmUsLnVpLm1lbnUgYS5pdGVtOmFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjAzKTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTtmb250LXdlaWdodDo0MDA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5tZW51IC5hY3RpdmUuaXRlbT5pLmljb257b3BhY2l0eToxfS51aS5tZW51IC5hY3RpdmUuaXRlbTpob3ZlciwudWkudmVydGljYWwubWVudSAuYWN0aXZlLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5tZW51IC5pdGVtLmRpc2FibGVkLC51aS5tZW51IC5pdGVtLmRpc2FibGVkOmhvdmVye2N1cnNvcjpkZWZhdWx0IWltcG9ydGFudDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50IWltcG9ydGFudDtjb2xvcjpyZ2JhKDQwLDQwLDQwLC4zKSFpbXBvcnRhbnR9LnVpLm1lbnU6bm90KC52ZXJ0aWNhbCkgLmxlZnQuaXRlbSwudWkubWVudTpub3QoLnZlcnRpY2FsKSA6bm90KC5kcm9wZG93bik+LmxlZnQubWVudXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O21hcmdpbi1yaWdodDphdXRvIWltcG9ydGFudH0udWkubWVudTpub3QoLnZlcnRpY2FsKSAucmlnaHQuaXRlbSwudWkubWVudTpub3QoLnZlcnRpY2FsKSAucmlnaHQubWVudXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O21hcmdpbi1sZWZ0OmF1dG8haW1wb3J0YW50fS51aS5tZW51IC5yaWdodC5pdGVtOjpiZWZvcmUsLnVpLm1lbnUgLnJpZ2h0Lm1lbnU+Lml0ZW06OmJlZm9yZXtyaWdodDphdXRvO2xlZnQ6MH0udWkudmVydGljYWwubWVudXtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVte2Rpc3BsYXk6YmxvY2s7YmFja2dyb3VuZDowIDA7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1yaWdodDpub25lfS51aS52ZXJ0aWNhbC5tZW51Pi5pdGVtOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLnZlcnRpY2FsLm1lbnU+Lml0ZW06bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtPi5sYWJlbHtmbG9hdDpyaWdodDt0ZXh0LWFsaWduOmNlbnRlcn0udWkudmVydGljYWwubWVudSAuaXRlbT5pLmljb257d2lkdGg6MS4xOGVtO2Zsb2F0OnJpZ2h0O21hcmdpbjowIDAgMCAuNWVtfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtPi5sYWJlbCtpLmljb257ZmxvYXQ6bm9uZTttYXJnaW46MCAuNWVtIDAgMH0udWkudmVydGljYWwubWVudSAuaXRlbTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MXB4O2JhY2tncm91bmQ6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLnZlcnRpY2FsLm1lbnUgLml0ZW06Zmlyc3QtY2hpbGQ6YmVmb3Jle2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLnZlcnRpY2FsLm1lbnUgLml0ZW0+Lm1lbnV7bWFyZ2luOi41ZW0gLTEuMTQyODU3MTRlbSAwfS51aS52ZXJ0aWNhbC5tZW51IC5tZW51IC5pdGVte2JhY2tncm91bmQ6MCAwO3BhZGRpbmc6LjVlbSAxLjMzMzMzMzMzZW07Zm9udC1zaXplOi44NTcxNDI4NmVtO2NvbG9yOnJnYmEoMCwwLDAsLjUpfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtIC5tZW51IC5saW5rLml0ZW06aG92ZXIsLnVpLnZlcnRpY2FsLm1lbnUgLml0ZW0gLm1lbnUgYS5pdGVtOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkudmVydGljYWwubWVudSAubWVudSAuaXRlbTpiZWZvcmV7ZGlzcGxheTpub25lfS51aS52ZXJ0aWNhbC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS52ZXJ0aWNhbC5tZW51Pi5hY3RpdmUuaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS52ZXJ0aWNhbC5tZW51Pi5hY3RpdmUuaXRlbTpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLm1lbnU+LmFjdGl2ZS5pdGVtOm9ubHktY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnZlcnRpY2FsLm1lbnUgLmFjdGl2ZS5pdGVtIC5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItbGVmdDpub25lfS51aS52ZXJ0aWNhbC5tZW51IC5pdGVtIC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnRhYnVsYXIubWVudXtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkNGQ0ZDV9LnVpLnRhYnVsYXIuZmx1aWQubWVudXt3aWR0aDpjYWxjKDEwMCUgKyAycHgpIWltcG9ydGFudH0udWkudGFidWxhci5tZW51IC5pdGVte2JhY2tncm91bmQ6MCAwO2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItbGVmdDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wOjJweCBzb2xpZCB0cmFuc3BhcmVudDtwYWRkaW5nOi45Mjg1NzE0M2VtIDEuNDI4NTcxNDNlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnRhYnVsYXIubWVudSAuaXRlbTpiZWZvcmV7ZGlzcGxheTpub25lfS51aS50YWJ1bGFyLm1lbnUgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkudGFidWxhci5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOm5vbmUgI2ZmZjtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWNvbG9yOiNkNGQ0ZDU7Zm9udC13ZWlnaHQ6NzAwO21hcmdpbi1ib3R0b206LTFweDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMCFpbXBvcnRhbnR9LnVpLnRhYnVsYXIubWVudSsuYXR0YWNoZWQ6bm90KC50b3ApLnNlZ21lbnQsLnVpLnRhYnVsYXIubWVudSsuYXR0YWNoZWQ6bm90KC50b3ApLnNlZ21lbnQrLmF0dGFjaGVkOm5vdCgudG9wKS5zZWdtZW50e2JvcmRlci10b3A6bm9uZTttYXJnaW4tbGVmdDowO21hcmdpbi10b3A6MDttYXJnaW4tcmlnaHQ6MDt3aWR0aDoxMDAlfS50b3AuYXR0YWNoZWQuc2VnbWVudCsudWkuYm90dG9tLnRhYnVsYXIubWVudXtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDpjYWxjKDEwMCUgKyAycHgpO2xlZnQ6LTFweH0udWkuYm90dG9tLnRhYnVsYXIubWVudXtiYWNrZ3JvdW5kOm5vbmUgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOjFweCBzb2xpZCAjZDRkNGQ1fS51aS5ib3R0b20udGFidWxhci5tZW51IC5pdGVte2JhY2tncm91bmQ6MCAwO2JvcmRlci1sZWZ0OjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6bm9uZX0udWkuYm90dG9tLnRhYnVsYXIubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZDpub25lICNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuOTUpO2JvcmRlci1jb2xvcjojZDRkNGQ1O21hcmdpbjotMXB4IDAgMCAwO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS52ZXJ0aWNhbC50YWJ1bGFyLm1lbnV7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZDRkNGQ1fS51aS52ZXJ0aWNhbC50YWJ1bGFyLm1lbnUgLml0ZW17YmFja2dyb3VuZDowIDA7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDpub25lfS51aS52ZXJ0aWNhbC50YWJ1bGFyLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6bm9uZSAjZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTtib3JkZXItY29sb3I6I2Q0ZDRkNTttYXJnaW46MCAtMXB4IDAgMDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgLjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkudmVydGljYWwucmlnaHQudGFidWxhci5tZW51e2JhY2tncm91bmQ6bm9uZSB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZDRkNGQ1fS51aS52ZXJ0aWNhbC5yaWdodC50YWJ1bGFyLm1lbnUgLml0ZW17YmFja2dyb3VuZDowIDA7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItdG9wOjFweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItbGVmdDpub25lfS51aS52ZXJ0aWNhbC5yaWdodC50YWJ1bGFyLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6bm9uZSAjZmZmO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTtib3JkZXItY29sb3I6I2Q0ZDRkNTttYXJnaW46MCAwIDAgLTFweDtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIWltcG9ydGFudH0udWkudGFidWxhci5tZW51IC5hY3RpdmUuZHJvcGRvd24uaXRlbXttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDoxcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDoycHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTpub25lfS51aS5wYWdpbmF0aW9uLm1lbnV7bWFyZ2luOjA7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLnBhZ2luYXRpb24ubWVudSAuaXRlbTpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDB9LnVpLmNvbXBhY3QubWVudSAuaXRlbTpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDB9LnVpLnBhZ2luYXRpb24ubWVudSAuaXRlbTpsYXN0LWNoaWxkOmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLnBhZ2luYXRpb24ubWVudSAuaXRlbXttaW4td2lkdGg6M2VtO3RleHQtYWxpZ246Y2VudGVyfS51aS5wYWdpbmF0aW9uLm1lbnUgLmljb24uaXRlbSBpLmljb257dmVydGljYWwtYWxpZ246dG9wfS51aS5wYWdpbmF0aW9uLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci10b3A6bm9uZTtwYWRkaW5nLXRvcDouOTI4NTcxNDNlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5zZWNvbmRhcnkubWVudXtiYWNrZ3JvdW5kOjAgMDttYXJnaW4tbGVmdDotLjM1NzE0Mjg2ZW07bWFyZ2luLXJpZ2h0Oi0uMzU3MTQyODZlbTtib3JkZXItcmFkaXVzOjA7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5zZWNvbmRhcnkubWVudSAuaXRlbXstbXMtZmxleC1pdGVtLWFsaWduOmNlbnRlcjthbGlnbi1zZWxmOmNlbnRlcjstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyOm5vbmU7cGFkZGluZzouNzg1NzE0MjllbSAuOTI4NTcxNDNlbTttYXJnaW46MCAuMzU3MTQyODZlbTtiYWNrZ3JvdW5kOjAgMDstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuc2Vjb25kYXJ5Lm1lbnUgLml0ZW06YmVmb3Jle2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5tZW51IC5oZWFkZXIuaXRlbXtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXJpZ2h0Om5vbmU7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50fS51aS5zZWNvbmRhcnkubWVudSAuaXRlbT5pbWc6bm90KC51aSl7bWFyZ2luOjB9LnVpLnNlY29uZGFyeS5tZW51IC5kcm9wZG93bi5pdGVtOmhvdmVyLC51aS5zZWNvbmRhcnkubWVudSAubGluay5pdGVtOmhvdmVyLC51aS5zZWNvbmRhcnkubWVudSBhLml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5zZWNvbmRhcnkubWVudSAuYWN0aXZlLml0ZW17LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkuc2Vjb25kYXJ5Lm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5tZW51IC5saW5rLml0ZW0sLnVpLnNlY29uZGFyeS5pbnZlcnRlZC5tZW51IGEuaXRlbXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KSFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5tZW51IC5kcm9wZG93bi5pdGVtOmhvdmVyLC51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQubWVudSAubGluay5pdGVtOmhvdmVyLC51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQubWVudSBhLml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjE1KTtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuc2Vjb25kYXJ5Lml0ZW0ubWVudXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS51aS5zZWNvbmRhcnkuaXRlbS5tZW51IC5pdGVtOmxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LnVpLnNlY29uZGFyeS5hdHRhY2hlZC5tZW51ey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkudmVydGljYWwuc2Vjb25kYXJ5Lm1lbnUgLml0ZW06bm90KC5kcm9wZG93bik+Lm1lbnV7bWFyZ2luOjAgLS45Mjg1NzE0M2VtfS51aS52ZXJ0aWNhbC5zZWNvbmRhcnkubWVudSAuaXRlbTpub3QoLmRyb3Bkb3duKT4ubWVudT4uaXRlbXttYXJnaW46MDtwYWRkaW5nOi41ZW0gMS4zMzMzMzMzM2VtfS51aS5zZWNvbmRhcnkudmVydGljYWwubWVudT4uaXRlbXtib3JkZXI6bm9uZTttYXJnaW46MCAwIC4zNTcxNDI4NmVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkuc2Vjb25kYXJ5LnZlcnRpY2FsLm1lbnU+LmhlYWRlci5pdGVte2JvcmRlci1yYWRpdXM6MH0udWkudmVydGljYWwuc2Vjb25kYXJ5Lm1lbnUgLml0ZW0+Lm1lbnUgLml0ZW17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0udWkuc2Vjb25kYXJ5LmludmVydGVkLm1lbnV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0udWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnV7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItYm90dG9tOjJweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5pdGVte2JvcmRlci1ib3R0b20tY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbS1zdHlsZTpzb2xpZDtib3JkZXItcmFkaXVzOjA7LW1zLWZsZXgtaXRlbS1hbGlnbjplbmQ7YWxpZ24tc2VsZjpmbGV4LWVuZDttYXJnaW46MCAwIC0ycHg7cGFkZGluZzouODU3MTQyODZlbSAxLjE0Mjg1NzE0ZW07Ym9yZGVyLWJvdHRvbS13aWR0aDoycHg7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5oZWFkZXIuaXRlbXtjb2xvcjpyZ2JhKDAsMCwwLC44NSkhaW1wb3J0YW50fS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAudGV4dC5pdGVtey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAuaXRlbTphZnRlcntkaXNwbGF5Om5vbmV9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5kcm9wZG93bi5pdGVtOmhvdmVyLC51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAubGluay5pdGVtOmhvdmVyLC51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSBhLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IC5kcm9wZG93bi5pdGVtOmFjdGl2ZSwudWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLmxpbmsuaXRlbTphY3RpdmUsLnVpLnNlY29uZGFyeS5wb2ludGluZy5tZW51IGEuaXRlbTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWNvbmRhcnkucG9pbnRpbmcubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Ym9yZGVyLWNvbG9yOiMxYjFjMWQ7Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVye2JvcmRlci1jb2xvcjojMWIxYzFkO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc2Vjb25kYXJ5LnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5kcm9wZG93bi5pdGVte2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0udWkuc2Vjb25kYXJ5LnZlcnRpY2FsLnBvaW50aW5nLm1lbnV7Ym9yZGVyLWJvdHRvbS13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDoycHg7Ym9yZGVyLXJpZ2h0LXN0eWxlOnNvbGlkO2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnNlY29uZGFyeS52ZXJ0aWNhbC5wb2ludGluZy5tZW51IC5pdGVte2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yYWRpdXM6MCFpbXBvcnRhbnQ7bWFyZ2luOjAgLTJweCAwIDA7Ym9yZGVyLXJpZ2h0LXdpZHRoOjJweH0udWkuc2Vjb25kYXJ5LnZlcnRpY2FsLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojMWIxYzFkfS51aS5zZWNvbmRhcnkuaW52ZXJ0ZWQucG9pbnRpbmcubWVudXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5wb2ludGluZy5tZW51e2JvcmRlci13aWR0aDoycHg7Ym9yZGVyLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2Vjb25kYXJ5LmludmVydGVkLnBvaW50aW5nLm1lbnUgLml0ZW17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLnNlY29uZGFyeS5pbnZlcnRlZC5wb2ludGluZy5tZW51IC5oZWFkZXIuaXRlbXtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuc2Vjb25kYXJ5LmludmVydGVkLnBvaW50aW5nLm1lbnUgLmxpbmsuaXRlbTpob3ZlciwudWkuc2Vjb25kYXJ5LmludmVydGVkLnBvaW50aW5nLm1lbnUgYS5pdGVtOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc2Vjb25kYXJ5LmludmVydGVkLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojZmZmO2NvbG9yOiNmZmZ9LnVpLnRleHQubWVudXtiYWNrZ3JvdW5kOm5vbmUgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6bm9uZTttYXJnaW46MWVtIC0uNWVtfS51aS50ZXh0Lm1lbnUgLml0ZW17Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTstbXMtZmxleC1pdGVtLWFsaWduOmNlbnRlcjthbGlnbi1zZWxmOmNlbnRlcjttYXJnaW46MCAwO3BhZGRpbmc6LjM1NzE0Mjg2ZW0gLjVlbTtmb250LXdlaWdodDo0MDA7Y29sb3I6cmdiYSgwLDAsMCwuNik7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlfS51aS50ZXh0Lm1lbnUgLml0ZW06YmVmb3JlLC51aS50ZXh0Lm1lbnUgLm1lbnUgLml0ZW06YmVmb3Jle2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9LnVpLnRleHQubWVudSAuaGVhZGVyLml0ZW17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtvcGFjaXR5OjE7Y29sb3I6cmdiYSgwLDAsMCwuODUpO2ZvbnQtc2l6ZTouOTI4NTcxNDNlbTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC13ZWlnaHQ6NzAwfS51aS50ZXh0Lm1lbnUgLml0ZW0+aW1nOm5vdCgudWkpe21hcmdpbjowfS51aS50ZXh0Lml0ZW0ubWVudSAuaXRlbXttYXJnaW46MH0udWkudmVydGljYWwudGV4dC5tZW51e21hcmdpbjoxZW0gMH0udWkudmVydGljYWwudGV4dC5tZW51OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkudmVydGljYWwudGV4dC5tZW51Omxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS52ZXJ0aWNhbC50ZXh0Lm1lbnUgLml0ZW17bWFyZ2luOi41NzE0Mjg1N2VtIDA7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDowfS51aS52ZXJ0aWNhbC50ZXh0Lm1lbnUgLml0ZW0+aS5pY29ue2Zsb2F0Om5vbmU7bWFyZ2luOjAgLjM1NzE0Mjg2ZW0gMCAwfS51aS52ZXJ0aWNhbC50ZXh0Lm1lbnUgLmhlYWRlci5pdGVte21hcmdpbjouNTcxNDI4NTdlbSAwIC43MTQyODU3MWVtfS51aS52ZXJ0aWNhbC50ZXh0Lm1lbnUgLml0ZW06bm90KC5kcm9wZG93bik+Lm1lbnV7bWFyZ2luOjB9LnVpLnZlcnRpY2FsLnRleHQubWVudSAuaXRlbTpub3QoLmRyb3Bkb3duKT4ubWVudT4uaXRlbXttYXJnaW46MDtwYWRkaW5nOi41ZW0gMH0udWkudGV4dC5tZW51IC5pdGVtOmhvdmVye29wYWNpdHk6MTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS51aS50ZXh0Lm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnRleHQubWVudSAuYWN0aXZlLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0udWkudGV4dC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTphZnRlcnstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnRleHQuYXR0YWNoZWQubWVudXstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkLnRleHQubWVudSwudWkuaW52ZXJ0ZWQudGV4dC5tZW51IC5hY3RpdmUuaXRlbSwudWkuaW52ZXJ0ZWQudGV4dC5tZW51IC5pdGVtLC51aS5pbnZlcnRlZC50ZXh0Lm1lbnUgLml0ZW06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnR9LnVpLmZsdWlkLnRleHQubWVudXttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS51aS52ZXJ0aWNhbC5pY29uLm1lbnV7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6YXV0b30udWkuaWNvbi5tZW51IC5pdGVte2hlaWdodDphdXRvO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMxYjFjMWR9LnVpLmljb24ubWVudSAuaXRlbT4uaWNvbjpub3QoLmRyb3Bkb3duKXttYXJnaW46MDtvcGFjaXR5OjF9LnVpLmljb24ubWVudSAuaWNvbjpiZWZvcmV7b3BhY2l0eToxfS51aS5tZW51IC5pY29uLml0ZW0+Lmljb257d2lkdGg6YXV0bzttYXJnaW46MCBhdXRvfS51aS52ZXJ0aWNhbC5pY29uLm1lbnUgLml0ZW0+Lmljb246bm90KC5kcm9wZG93bil7ZGlzcGxheTpibG9jaztvcGFjaXR5OjE7bWFyZ2luOjAgYXV0bztmbG9hdDpub25lfS51aS5pbnZlcnRlZC5pY29uLm1lbnUgLml0ZW17Y29sb3I6I2ZmZn0udWkubGFiZWxlZC5pY29uLm1lbnV7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLmxhYmVsZWQuaWNvbi5tZW51IC5pdGVte21pbi13aWR0aDo2ZW07LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnVpLmxhYmVsZWQuaWNvbi5tZW51IC5pdGVtPi5pY29uOm5vdCguZHJvcGRvd24pe2hlaWdodDoxZW07ZGlzcGxheTpibG9jaztmb250LXNpemU6MS43MTQyODU3MWVtIWltcG9ydGFudDttYXJnaW46MCBhdXRvIC41cmVtIWltcG9ydGFudH0udWkuZmx1aWQubGFiZWxlZC5pY29uLm1lbnU+Lml0ZW17bWluLXdpZHRoOjB9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuc3RhY2thYmxlLm1lbnV7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnVpLnN0YWNrYWJsZS5tZW51IC5pdGVte3dpZHRoOjEwMCUhaW1wb3J0YW50fS51aS5zdGFja2FibGUubWVudSAuaXRlbTpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6YXV0bztib3R0b206MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MXB4O2JhY2tncm91bmQ6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLnN0YWNrYWJsZS5tZW51IC5sZWZ0Lml0ZW0sLnVpLnN0YWNrYWJsZS5tZW51IC5sZWZ0Lm1lbnV7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50fS51aS5zdGFja2FibGUubWVudSAucmlnaHQuaXRlbSwudWkuc3RhY2thYmxlLm1lbnUgLnJpZ2h0Lm1lbnV7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnR9LnVpLnN0YWNrYWJsZS5tZW51IC5sZWZ0Lm1lbnUsLnVpLnN0YWNrYWJsZS5tZW51IC5yaWdodC5tZW51ey13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1ufX0udWkubWVudSAucmVkLmFjdGl2ZS5pdGVtLC51aS5yZWQubWVudSAuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiNkYjI4MjghaW1wb3J0YW50O2NvbG9yOiNkYjI4MjghaW1wb3J0YW50fS51aS5tZW51IC5vcmFuZ2UuYWN0aXZlLml0ZW0sLnVpLm9yYW5nZS5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2YyNzExYyFpbXBvcnRhbnQ7Y29sb3I6I2YyNzExYyFpbXBvcnRhbnR9LnVpLm1lbnUgLnllbGxvdy5hY3RpdmUuaXRlbSwudWkueWVsbG93Lm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojZmJiZDA4IWltcG9ydGFudDtjb2xvcjojZmJiZDA4IWltcG9ydGFudH0udWkubWVudSAub2xpdmUuYWN0aXZlLml0ZW0sLnVpLm9saXZlLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojYjVjYzE4IWltcG9ydGFudDtjb2xvcjojYjVjYzE4IWltcG9ydGFudH0udWkuZ3JlZW4ubWVudSAuYWN0aXZlLml0ZW0sLnVpLm1lbnUgLmdyZWVuLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojMjFiYTQ1IWltcG9ydGFudDtjb2xvcjojMjFiYTQ1IWltcG9ydGFudH0udWkubWVudSAudGVhbC5hY3RpdmUuaXRlbSwudWkudGVhbC5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Y29sb3I6IzAwYjVhZCFpbXBvcnRhbnR9LnVpLmJsdWUubWVudSAuYWN0aXZlLml0ZW0sLnVpLm1lbnUgLmJsdWUuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiMyMTg1ZDAhaW1wb3J0YW50O2NvbG9yOiMyMTg1ZDAhaW1wb3J0YW50fS51aS5tZW51IC52aW9sZXQuYWN0aXZlLml0ZW0sLnVpLnZpb2xldC5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6IzY0MzVjOSFpbXBvcnRhbnQ7Y29sb3I6IzY0MzVjOSFpbXBvcnRhbnR9LnVpLm1lbnUgLnB1cnBsZS5hY3RpdmUuaXRlbSwudWkucHVycGxlLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1jb2xvcjojYTMzM2M4IWltcG9ydGFudDtjb2xvcjojYTMzM2M4IWltcG9ydGFudH0udWkubWVudSAucGluay5hY3RpdmUuaXRlbSwudWkucGluay5tZW51IC5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2UwMzk5NyFpbXBvcnRhbnQ7Y29sb3I6I2UwMzk5NyFpbXBvcnRhbnR9LnVpLmJyb3duLm1lbnUgLmFjdGl2ZS5pdGVtLC51aS5tZW51IC5icm93bi5hY3RpdmUuaXRlbXtib3JkZXItY29sb3I6I2E1NjczZiFpbXBvcnRhbnQ7Y29sb3I6I2E1NjczZiFpbXBvcnRhbnR9LnVpLmdyZXkubWVudSAuYWN0aXZlLml0ZW0sLnVpLm1lbnUgLmdyZXkuYWN0aXZlLml0ZW17Ym9yZGVyLWNvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2NvbG9yOiM3Njc2NzYhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5tZW51e2JvcmRlcjowIHNvbGlkIHRyYW5zcGFyZW50O2JhY2tncm91bmQ6IzFiMWMxZDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkLm1lbnUgLml0ZW0sLnVpLmludmVydGVkLm1lbnUgLml0ZW0+YTpub3QoLnVpKXtiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkuaW52ZXJ0ZWQubWVudSAuaXRlbS5tZW51e2JhY2tncm91bmQ6MCAwfS51aS5pbnZlcnRlZC5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KX0udWkudmVydGljYWwuaW52ZXJ0ZWQubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCl9LnVpLnZlcnRpY2FsLmludmVydGVkLm1lbnUgLm1lbnUgLml0ZW0sLnVpLnZlcnRpY2FsLmludmVydGVkLm1lbnUgLm1lbnUgLml0ZW0gYTpub3QoLnVpKXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX0udWkuaW52ZXJ0ZWQubWVudSAuaGVhZGVyLml0ZW17bWFyZ2luOjA7YmFja2dyb3VuZDowIDA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5pbnZlcnRlZC5tZW51IC5pdGVtLmRpc2FibGVkLC51aS5pbnZlcnRlZC5tZW51IC5pdGVtLmRpc2FibGVkOmhvdmVye2NvbG9yOnJnYmEoMjI1LDIyNSwyMjUsLjMpfS51aS5pbnZlcnRlZC5tZW51IC5kcm9wZG93bi5pdGVtOmhvdmVyLC51aS5pbnZlcnRlZC5tZW51IC5saW5rLml0ZW06aG92ZXIsLnVpLmludmVydGVkLm1lbnUgYS5pdGVtOmhvdmVyLC51aS5saW5rLmludmVydGVkLm1lbnUgLml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Y29sb3I6I2ZmZn0udWkudmVydGljYWwuaW52ZXJ0ZWQubWVudSAuaXRlbSAubWVudSAubGluay5pdGVtOmhvdmVyLC51aS52ZXJ0aWNhbC5pbnZlcnRlZC5tZW51IC5pdGVtIC5tZW51IGEuaXRlbTpob3ZlcntiYWNrZ3JvdW5kOjAgMDtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5tZW51IC5saW5rLml0ZW06YWN0aXZlLC51aS5pbnZlcnRlZC5tZW51IGEuaXRlbTphY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wOCk7Y29sb3I6I2ZmZn0udWkuaW52ZXJ0ZWQubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSk7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnZlcnRpY2FsLm1lbnUgLml0ZW0gLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQ6MCAwO2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmFmdGVye2JhY2tncm91bmQ6IzNkM2UzZiFpbXBvcnRhbnQ7bWFyZ2luOjAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JvcmRlcjpub25lIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudSAuYWN0aXZlLml0ZW06aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSk7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmludmVydGVkLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmhvdmVyOmFmdGVye2JhY2tncm91bmQ6IzNkM2UzZiFpbXBvcnRhbnR9LnVpLmZsb2F0ZWQubWVudXtmbG9hdDpsZWZ0O21hcmdpbjowIC41cmVtIDAgMH0udWkuZmxvYXRlZC5tZW51IC5pdGVtOmxhc3QtY2hpbGQ6YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkucmlnaHQuZmxvYXRlZC5tZW51e2Zsb2F0OnJpZ2h0O21hcmdpbjowIDAgMCAuNXJlbX0udWkuaW52ZXJ0ZWQubWVudSAucmVkLmFjdGl2ZS5pdGVtLC51aS5pbnZlcnRlZC5yZWQubWVudXtiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4Mjh9LnVpLmludmVydGVkLnJlZC5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5yZWQubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLm1lbnUgLm9yYW5nZS5hY3RpdmUuaXRlbSwudWkuaW52ZXJ0ZWQub3JhbmdlLm1lbnV7YmFja2dyb3VuZC1jb2xvcjojZjI3MTFjfS51aS5pbnZlcnRlZC5vcmFuZ2UubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQub3JhbmdlLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5tZW51IC55ZWxsb3cuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLnllbGxvdy5tZW51e2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOH0udWkuaW52ZXJ0ZWQueWVsbG93Lm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLnllbGxvdy5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudSAub2xpdmUuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLm9saXZlLm1lbnV7YmFja2dyb3VuZC1jb2xvcjojYjVjYzE4fS51aS5pbnZlcnRlZC5vbGl2ZS5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5vbGl2ZS5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQuZ3JlZW4ubWVudSwudWkuaW52ZXJ0ZWQubWVudSAuZ3JlZW4uYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1fS51aS5pbnZlcnRlZC5ncmVlbi5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5ncmVlbi5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudSAudGVhbC5hY3RpdmUuaXRlbSwudWkuaW52ZXJ0ZWQudGVhbC5tZW51e2JhY2tncm91bmQtY29sb3I6IzAwYjVhZH0udWkuaW52ZXJ0ZWQudGVhbC5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC50ZWFsLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ibHVlLm1lbnUsLnVpLmludmVydGVkLm1lbnUgLmJsdWUuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwfS51aS5pbnZlcnRlZC5ibHVlLm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLmJsdWUubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmludmVydGVkLm1lbnUgLnZpb2xldC5hY3RpdmUuaXRlbSwudWkuaW52ZXJ0ZWQudmlvbGV0Lm1lbnV7YmFja2dyb3VuZC1jb2xvcjojNjQzNWM5fS51aS5pbnZlcnRlZC52aW9sZXQubWVudSAuaXRlbTpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKX0udWkuaW52ZXJ0ZWQudmlvbGV0Lm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5tZW51IC5wdXJwbGUuYWN0aXZlLml0ZW0sLnVpLmludmVydGVkLnB1cnBsZS5tZW51e2JhY2tncm91bmQtY29sb3I6I2EzMzNjOH0udWkuaW52ZXJ0ZWQucHVycGxlLm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLnB1cnBsZS5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQubWVudSAucGluay5hY3RpdmUuaXRlbSwudWkuaW52ZXJ0ZWQucGluay5tZW51e2JhY2tncm91bmQtY29sb3I6I2UwMzk5N30udWkuaW52ZXJ0ZWQucGluay5tZW51IC5pdGVtOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjEpfS51aS5pbnZlcnRlZC5waW5rLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5icm93bi5tZW51LC51aS5pbnZlcnRlZC5tZW51IC5icm93bi5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOiNhNTY3M2Z9LnVpLmludmVydGVkLmJyb3duLm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLmJyb3duLm1lbnUgLmFjdGl2ZS5pdGVte2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSkhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5ncmV5Lm1lbnUsLnVpLmludmVydGVkLm1lbnUgLmdyZXkuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjojNzY3Njc2fS51aS5pbnZlcnRlZC5ncmV5Lm1lbnUgLml0ZW06YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgzNCwzNiwzOCwuMSl9LnVpLmludmVydGVkLmdyZXkubWVudSAuYWN0aXZlLml0ZW17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKSFpbXBvcnRhbnR9LnVpLmZpdHRlZC5tZW51IC5pdGVtLC51aS5maXR0ZWQubWVudSAuaXRlbSAubWVudSAuaXRlbSwudWkubWVudSAuZml0dGVkLml0ZW17cGFkZGluZzowfS51aS5ob3Jpem9udGFsbHkuZml0dGVkLm1lbnUgLml0ZW0sLnVpLmhvcml6b250YWxseS5maXR0ZWQubWVudSAuaXRlbSAubWVudSAuaXRlbSwudWkubWVudSAuaG9yaXpvbnRhbGx5LmZpdHRlZC5pdGVte3BhZGRpbmctdG9wOi45Mjg1NzE0M2VtO3BhZGRpbmctYm90dG9tOi45Mjg1NzE0M2VtfS51aS5tZW51IC52ZXJ0aWNhbGx5LmZpdHRlZC5pdGVtLC51aS52ZXJ0aWNhbGx5LmZpdHRlZC5tZW51IC5pdGVtLC51aS52ZXJ0aWNhbGx5LmZpdHRlZC5tZW51IC5pdGVtIC5tZW51IC5pdGVte3BhZGRpbmctbGVmdDoxLjE0Mjg1NzE0ZW07cGFkZGluZy1yaWdodDoxLjE0Mjg1NzE0ZW19LnVpLmJvcmRlcmxlc3MubWVudSAuaXRlbSAubWVudSAuaXRlbTpiZWZvcmUsLnVpLmJvcmRlcmxlc3MubWVudSAuaXRlbTpiZWZvcmUsLnVpLm1lbnUgLmJvcmRlcmxlc3MuaXRlbTpiZWZvcmV7YmFja2dyb3VuZDowIDAhaW1wb3J0YW50fS51aS5jb21wYWN0Lm1lbnV7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleDttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmNvbXBhY3QudmVydGljYWwubWVudXtkaXNwbGF5OmlubGluZS1ibG9ja30udWkuY29tcGFjdC5tZW51IC5pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMH0udWkuY29tcGFjdC5tZW51IC5pdGVtOmxhc3QtY2hpbGQ6YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkuY29tcGFjdC52ZXJ0aWNhbC5tZW51e3dpZHRoOmF1dG8haW1wb3J0YW50fS51aS5jb21wYWN0LnZlcnRpY2FsLm1lbnUgLml0ZW06bGFzdC1jaGlsZDo6YmVmb3Jle2Rpc3BsYXk6YmxvY2t9LnVpLm1lbnUuZmx1aWQsLnVpLnZlcnRpY2FsLm1lbnUuZmx1aWR7d2lkdGg6MTAwJSFpbXBvcnRhbnR9LnVpLml0ZW0ubWVudSwudWkuaXRlbS5tZW51IC5pdGVte3dpZHRoOjEwMCU7cGFkZGluZy1sZWZ0OjAhaW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MCFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjAhaW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyOy13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnVpLmF0dGFjaGVkLml0ZW0ubWVudXttYXJnaW46MCAtMXB4IWltcG9ydGFudH0udWkuaXRlbS5tZW51IC5pdGVtOmxhc3QtY2hpbGQ6YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkubWVudS50d28uaXRlbSAuaXRlbXt3aWR0aDo1MCV9LnVpLm1lbnUudGhyZWUuaXRlbSAuaXRlbXt3aWR0aDozMy4zMzMlfS51aS5tZW51LmZvdXIuaXRlbSAuaXRlbXt3aWR0aDoyNSV9LnVpLm1lbnUuZml2ZS5pdGVtIC5pdGVte3dpZHRoOjIwJX0udWkubWVudS5zaXguaXRlbSAuaXRlbXt3aWR0aDoxNi42NjYlfS51aS5tZW51LnNldmVuLml0ZW0gLml0ZW17d2lkdGg6MTQuMjg1JX0udWkubWVudS5laWdodC5pdGVtIC5pdGVte3dpZHRoOjEyLjUlfS51aS5tZW51Lm5pbmUuaXRlbSAuaXRlbXt3aWR0aDoxMS4xMSV9LnVpLm1lbnUudGVuLml0ZW0gLml0ZW17d2lkdGg6MTAlfS51aS5tZW51LmVsZXZlbi5pdGVtIC5pdGVte3dpZHRoOjkuMDklfS51aS5tZW51LnR3ZWx2ZS5pdGVtIC5pdGVte3dpZHRoOjguMzMzJX0udWkubWVudS5maXhlZHtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMTttYXJnaW46MDt3aWR0aDoxMDAlfS51aS5tZW51LmZpeGVkLC51aS5tZW51LmZpeGVkIC5pdGVtOmZpcnN0LWNoaWxkLC51aS5tZW51LmZpeGVkIC5pdGVtOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudH0udWkuZml4ZWQubWVudSwudWlbY2xhc3MqPVxcXCJ0b3AgZml4ZWRcXFwiXS5tZW51e3RvcDowO2xlZnQ6MDtyaWdodDphdXRvO2JvdHRvbTphdXRvfS51aVtjbGFzcyo9XFxcInRvcCBmaXhlZFxcXCJdLm1lbnV7Ym9yZGVyLXRvcDpub25lO2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmV9LnVpW2NsYXNzKj1cXFwicmlnaHQgZml4ZWRcXFwiXS5tZW51e2JvcmRlci10b3A6bm9uZTtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7dG9wOjA7cmlnaHQ6MDtsZWZ0OmF1dG87Ym90dG9tOmF1dG87d2lkdGg6YXV0bztoZWlnaHQ6MTAwJX0udWlbY2xhc3MqPVxcXCJib3R0b20gZml4ZWRcXFwiXS5tZW51e2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvdHRvbTowO2xlZnQ6MDt0b3A6YXV0bztyaWdodDphdXRvfS51aVtjbGFzcyo9XFxcImxlZnQgZml4ZWRcXFwiXS5tZW51e2JvcmRlci10b3A6bm9uZTtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLWxlZnQ6bm9uZTt0b3A6MDtsZWZ0OjA7cmlnaHQ6YXV0bztib3R0b206YXV0bzt3aWR0aDphdXRvO2hlaWdodDoxMDAlfS51aS5maXhlZC5tZW51Ky51aS5ncmlke3BhZGRpbmctdG9wOjIuNzVyZW19LnVpLnBvaW50aW5nLm1lbnUgLml0ZW06YWZ0ZXJ7dmlzaWJpbGl0eTpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6MTAwJTtsZWZ0OjUwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpIHJvdGF0ZSg0NWRlZyk7YmFja2dyb3VuZDowIDA7bWFyZ2luOi41cHggMCAwO3dpZHRoOi41NzE0Mjg1N2VtO2hlaWdodDouNTcxNDI4NTdlbTtib3JkZXI6bm9uZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZDRkNGQ1O2JvcmRlci1yaWdodDoxcHggc29saWQgI2Q0ZDRkNTt6LWluZGV4OjI7LXdlYmtpdC10cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlfS51aS52ZXJ0aWNhbC5wb2ludGluZy5tZW51IC5pdGVtOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MDtib3R0b206YXV0bztsZWZ0OmF1dG87LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCg1MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCg1MCUpIHRyYW5zbGF0ZVkoLTUwJSkgcm90YXRlKDQ1ZGVnKTttYXJnaW46MCAtLjVweCAwIDA7Ym9yZGVyOm5vbmU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2Q0ZDRkNTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNkNGQ0ZDV9LnVpLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmFmdGVye3Zpc2liaWxpdHk6dmlzaWJsZX0udWkucG9pbnRpbmcubWVudSAuYWN0aXZlLmRyb3Bkb3duLml0ZW06YWZ0ZXJ7dmlzaWJpbGl0eTpoaWRkZW59LnVpLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtIC5tZW51IC5hY3RpdmUuaXRlbTphZnRlciwudWkucG9pbnRpbmcubWVudSAuZHJvcGRvd24uYWN0aXZlLml0ZW06YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTpob3ZlcjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmYyZjJ9LnVpLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmFmdGVye2JhY2tncm91bmQtY29sb3I6I2YyZjJmMn0udWkucG9pbnRpbmcubWVudSAuYWN0aXZlLml0ZW06aG92ZXI6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjJmMmYyfS51aS52ZXJ0aWNhbC5wb2ludGluZy5tZW51IC5hY3RpdmUuaXRlbTpob3ZlcjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmMmYyZjJ9LnVpLnZlcnRpY2FsLnBvaW50aW5nLm1lbnUgLmFjdGl2ZS5pdGVtOmFmdGVye2JhY2tncm91bmQtY29sb3I6I2YyZjJmMn0udWkudmVydGljYWwucG9pbnRpbmcubWVudSAubWVudSAuYWN0aXZlLml0ZW06YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS51aS5hdHRhY2hlZC5tZW51e3RvcDowO2JvdHRvbTowO2JvcmRlci1yYWRpdXM6MDttYXJnaW46MCAtMXB4O3dpZHRoOmNhbGMoMTAwJSArIDJweCk7bWF4LXdpZHRoOmNhbGMoMTAwJSArIDJweCk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5hdHRhY2hlZCsudWkuYXR0YWNoZWQubWVudTpub3QoLnRvcCl7Ym9yZGVyLXRvcDpub25lfS51aVtjbGFzcyo9XFxcInRvcCBhdHRhY2hlZFxcXCJdLm1lbnV7Ym90dG9tOjA7bWFyZ2luLWJvdHRvbTowO3RvcDowO21hcmdpbi10b3A6MXJlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS5tZW51W2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl06Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLm1lbnV7Ym90dG9tOjA7bWFyZ2luLXRvcDowO3RvcDowO21hcmdpbi1ib3R0b206MXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLG5vbmU7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksbm9uZTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLm1lbnU6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnRvcC5hdHRhY2hlZC5tZW51Pi5pdGVtOmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIDAgMCAwfS51aS5ib3R0b20uYXR0YWNoZWQubWVudT4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAwIC4yODU3MTQyOXJlbX0udWkuYXR0YWNoZWQubWVudTpub3QoLnRhYnVsYXIpe2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNX0udWkuYXR0YWNoZWQuaW52ZXJ0ZWQubWVudXtib3JkZXI6bm9uZX0udWkuYXR0YWNoZWQudGFidWxhci5tZW51e21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7d2lkdGg6MTAwJX0udWkubWluaS5tZW51e2ZvbnQtc2l6ZTouNzg1NzE0MjlyZW19LnVpLm1pbmkudmVydGljYWwubWVudXt3aWR0aDo5cmVtfS51aS50aW55Lm1lbnV7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkudGlueS52ZXJ0aWNhbC5tZW51e3dpZHRoOjExcmVtfS51aS5zbWFsbC5tZW51e2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLnNtYWxsLnZlcnRpY2FsLm1lbnV7d2lkdGg6MTNyZW19LnVpLm1lbnV7Zm9udC1zaXplOjFyZW19LnVpLnZlcnRpY2FsLm1lbnV7d2lkdGg6MTVyZW19LnVpLmxhcmdlLm1lbnV7Zm9udC1zaXplOjEuMDcxNDI4NTdyZW19LnVpLmxhcmdlLnZlcnRpY2FsLm1lbnV7d2lkdGg6MThyZW19LnVpLmh1Z2UubWVudXtmb250LXNpemU6MS4yMTQyODU3MXJlbX0udWkuaHVnZS52ZXJ0aWNhbC5tZW51e3dpZHRoOjIycmVtfS51aS5iaWcubWVudXtmb250LXNpemU6MS4xNDI4NTcxNHJlbX0udWkuYmlnLnZlcnRpY2FsLm1lbnV7d2lkdGg6MjByZW19LnVpLm1hc3NpdmUubWVudXtmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkubWFzc2l2ZS52ZXJ0aWNhbC5tZW51e3dpZHRoOjI1cmVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBNZXNzYWdlXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubWVzc2FnZXtwb3NpdGlvbjpyZWxhdGl2ZTttaW4taGVpZ2h0OjFlbTttYXJnaW46MWVtIDA7YmFja2dyb3VuZDojZjhmOGY5O3BhZGRpbmc6MWVtIDEuNWVtO2xpbmUtaGVpZ2h0OjEuNDI4NWVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxiYWNrZ3JvdW5kIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlLGJhY2tncm91bmQgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZCAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjIyKSBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjIyKSBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5tZXNzYWdlOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkubWVzc2FnZTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkubWVzc2FnZSAuaGVhZGVye2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW46LS4xNDI4NTcxNGVtIDAgMCAwfS51aS5tZXNzYWdlIC5oZWFkZXI6bm90KC51aSl7Zm9udC1zaXplOjEuMTQyODU3MTRlbX0udWkubWVzc2FnZSBwe29wYWNpdHk6Ljg1O21hcmdpbjouNzVlbSAwfS51aS5tZXNzYWdlIHA6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5tZXNzYWdlIHA6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLm1lc3NhZ2UgLmhlYWRlcitwe21hcmdpbi10b3A6LjI1ZW19LnVpLm1lc3NhZ2UgLmxpc3Q6bm90KC51aSl7dGV4dC1hbGlnbjpsZWZ0O3BhZGRpbmc6MDtvcGFjaXR5Oi44NTtsaXN0LXN0eWxlLXBvc2l0aW9uOmluc2lkZTttYXJnaW46LjVlbSAwIDB9LnVpLm1lc3NhZ2UgLmxpc3Q6bm90KC51aSk6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5tZXNzYWdlIC5saXN0Om5vdCgudWkpOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5tZXNzYWdlIC5saXN0Om5vdCgudWkpIGxpe3Bvc2l0aW9uOnJlbGF0aXZlO2xpc3Qtc3R5bGUtdHlwZTpub25lO21hcmdpbjowIDAgLjNlbSAxZW07cGFkZGluZzowfS51aS5tZXNzYWdlIC5saXN0Om5vdCgudWkpIGxpOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OifigKInO2xlZnQ6LTFlbTtoZWlnaHQ6MTAwJTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkubWVzc2FnZSAubGlzdDpub3QoLnVpKSBsaTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkubWVzc2FnZT4uaWNvbnttYXJnaW4tcmlnaHQ6LjZlbX0udWkubWVzc2FnZT4uY2xvc2UuaWNvbntjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW46MDt0b3A6Ljc4NTc1ZW07cmlnaHQ6LjVlbTtvcGFjaXR5Oi43Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZX0udWkubWVzc2FnZT4uY2xvc2UuaWNvbjpob3ZlcntvcGFjaXR5OjF9LnVpLm1lc3NhZ2U+OmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkubWVzc2FnZT46bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLmRyb3Bkb3duIC5tZW51Pi5tZXNzYWdle21hcmdpbjowIC0xcHh9LnVpLnZpc2libGUudmlzaWJsZS52aXNpYmxlLnZpc2libGUubWVzc2FnZXtkaXNwbGF5OmJsb2NrfS51aS5pY29uLnZpc2libGUudmlzaWJsZS52aXNpYmxlLnZpc2libGUubWVzc2FnZXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4fS51aS5oaWRkZW4uaGlkZGVuLmhpZGRlbi5oaWRkZW4ubWVzc2FnZXtkaXNwbGF5Om5vbmV9LnVpLmNvbXBhY3QubWVzc2FnZXtkaXNwbGF5OmlubGluZS1ibG9ja30udWkuY29tcGFjdC5pY29uLm1lc3NhZ2V7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleH0udWkuYXR0YWNoZWQubWVzc2FnZXttYXJnaW4tYm90dG9tOi0xcHg7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7bWFyZ2luLWxlZnQ6LTFweDttYXJnaW4tcmlnaHQ6LTFweH0udWkuYXR0YWNoZWQrLnVpLmF0dGFjaGVkLm1lc3NhZ2U6bm90KC50b3ApOm5vdCguYm90dG9tKXttYXJnaW4tdG9wOi0xcHg7Ym9yZGVyLXJhZGl1czowfS51aS5ib3R0b20uYXR0YWNoZWQubWVzc2FnZXttYXJnaW4tdG9wOi0xcHg7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldCwwIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0LDAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuYm90dG9tLmF0dGFjaGVkLm1lc3NhZ2U6bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjFlbX0udWkuYXR0YWNoZWQuaWNvbi5tZXNzYWdle3dpZHRoOmF1dG99LnVpLmljb24ubWVzc2FnZXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O3dpZHRoOjEwMCU7LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9LnVpLmljb24ubWVzc2FnZT4uaWNvbjpub3QoLmNsb3NlKXtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYm94LWZsZXg6MDstbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvO3dpZHRoOmF1dG87bGluZS1oZWlnaHQ6MTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjNlbTtvcGFjaXR5Oi44fS51aS5pY29uLm1lc3NhZ2U+LmNvbnRlbnR7ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MSAxIGF1dG87ZmxleDoxIDEgYXV0bzt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmljb24ubWVzc2FnZSAuaWNvbjpub3QoLmNsb3NlKSsuY29udGVudHtwYWRkaW5nLWxlZnQ6MH0udWkuaWNvbi5tZXNzYWdlIC5jaXJjdWxhci5pY29ue3dpZHRoOjFlbX0udWkuZmxvYXRpbmcubWVzc2FnZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjIyKSBpbnNldCwwIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4yMikgaW5zZXQsMCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmJsYWNrLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfS51aS5wb3NpdGl2ZS5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2ZjZmZmNTtjb2xvcjojMmM2NjJkfS51aS5hdHRhY2hlZC5wb3NpdGl2ZS5tZXNzYWdlLC51aS5wb3NpdGl2ZS5tZXNzYWdley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2EzYzI5MyBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNhM2MyOTMgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkucG9zaXRpdmUubWVzc2FnZSAuaGVhZGVye2NvbG9yOiMxYTUzMWJ9LnVpLm5lZ2F0aXZlLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZmZmNmY2O2NvbG9yOiM5ZjNhMzh9LnVpLmF0dGFjaGVkLm5lZ2F0aXZlLm1lc3NhZ2UsLnVpLm5lZ2F0aXZlLm1lc3NhZ2V7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZTBiNGI0IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2UwYjRiNCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5uZWdhdGl2ZS5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzkxMmQyYn0udWkuaW5mby5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2Y4ZmZmZjtjb2xvcjojMjc2Zjg2fS51aS5hdHRhY2hlZC5pbmZvLm1lc3NhZ2UsLnVpLmluZm8ubWVzc2FnZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhOWQ1ZGUgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTlkNWRlIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLmluZm8ubWVzc2FnZSAuaGVhZGVye2NvbG9yOiMwZTU2NmN9LnVpLndhcm5pbmcubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZhZjM7Y29sb3I6IzU3M2EwOH0udWkuYXR0YWNoZWQud2FybmluZy5tZXNzYWdlLC51aS53YXJuaW5nLm1lc3NhZ2V7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYzliYTliIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2M5YmE5YiBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS53YXJuaW5nLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojNzk0YjAyfS51aS5lcnJvci5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2ZmZjZmNjtjb2xvcjojOWYzYTM4fS51aS5hdHRhY2hlZC5lcnJvci5tZXNzYWdlLC51aS5lcnJvci5tZXNzYWdley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2UwYjRiNCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlMGI0YjQgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkuZXJyb3IubWVzc2FnZSAuaGVhZGVye2NvbG9yOiM5MTJkMmJ9LnVpLnN1Y2Nlc3MubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmY2ZmZjU7Y29sb3I6IzJjNjYyZH0udWkuYXR0YWNoZWQuc3VjY2Vzcy5tZXNzYWdlLC51aS5zdWNjZXNzLm1lc3NhZ2V7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjYTNjMjkzIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2EzYzI5MyBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5zdWNjZXNzLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojMWE1MzFifS51aS5ibGFjay5tZXNzYWdlLC51aS5pbnZlcnRlZC5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6IzFiMWMxZDtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC45KX0udWkucmVkLm1lc3NhZ2V7YmFja2dyb3VuZC1jb2xvcjojZmZlOGU2O2NvbG9yOiNkYjI4Mjg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZGIyODI4IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggI2RiMjgyOCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50fS51aS5yZWQubWVzc2FnZSAuaGVhZGVye2NvbG9yOiNjODIxMjF9LnVpLm9yYW5nZS5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2ZmZWRkZTtjb2xvcjojZjI3MTFjOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2YyNzExYyBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNmMjcxMWMgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkub3JhbmdlLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojZTc2NDBkfS51aS55ZWxsb3cubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY4ZGI7Y29sb3I6I2I1ODEwNTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNiNTgxMDUgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYjU4MTA1IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLnllbGxvdy5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzljNmYwNH0udWkub2xpdmUubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmYmZkZWY7Y29sb3I6IzhhYmMxZTstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICM4YWJjMWUgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjOGFiYzFlIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLm9saXZlLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojN2FhNjFhfS51aS5ncmVlbi5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2U1ZjllNztjb2xvcjojMWViYzMwOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzFlYmMzMCBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICMxZWJjMzAgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkuZ3JlZW4ubWVzc2FnZSAuaGVhZGVye2NvbG9yOiMxYWE2MmF9LnVpLnRlYWwubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNlMWY3Zjc7Y29sb3I6IzEwYTNhMzstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMxMGEzYTMgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMTBhM2EzIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLnRlYWwubWVzc2FnZSAuaGVhZGVye2NvbG9yOiMwZThjOGN9LnVpLmJsdWUubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNkZmYwZmY7Y29sb3I6IzIxODVkMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICMyMTg1ZDAgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjMjE4NWQwIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLmJsdWUubWVzc2FnZSAuaGVhZGVye2NvbG9yOiMxZTc3YmF9LnVpLnZpb2xldC5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2VhZTdmZjtjb2xvcjojNjQzNWM5Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggIzY0MzVjOSBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICM2NDM1YzkgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkudmlvbGV0Lm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojNWEzMGI1fS51aS5wdXJwbGUubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNmU3ZmY7Y29sb3I6I2EzMzNjODstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhMzMzYzggaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTMzM2M4IGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLnB1cnBsZS5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6IzkyMmViNH0udWkucGluay5tZXNzYWdle2JhY2tncm91bmQtY29sb3I6I2ZmZTNmYjtjb2xvcjojZTAzOTk3Oy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2UwMzk5NyBpbnNldCwwIDAgMCAwIHRyYW5zcGFyZW50O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNlMDM5OTcgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudH0udWkucGluay5tZXNzYWdlIC5oZWFkZXJ7Y29sb3I6I2RkMjM4Yn0udWkuYnJvd24ubWVzc2FnZXtiYWNrZ3JvdW5kLWNvbG9yOiNmMWUyZDM7Y29sb3I6I2E1NjczZjstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4ICNhNTY3M2YgaW5zZXQsMCAwIDAgMCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCAjYTU2NzNmIGluc2V0LDAgMCAwIDAgdHJhbnNwYXJlbnR9LnVpLmJyb3duLm1lc3NhZ2UgLmhlYWRlcntjb2xvcjojOTM1YjM4fS51aS5taW5pLm1lc3NhZ2V7Zm9udC1zaXplOi43ODU3MTQyOWVtfS51aS50aW55Lm1lc3NhZ2V7Zm9udC1zaXplOi44NTcxNDI4NmVtfS51aS5zbWFsbC5tZXNzYWdle2ZvbnQtc2l6ZTouOTI4NTcxNDNlbX0udWkubWVzc2FnZXtmb250LXNpemU6MWVtfS51aS5sYXJnZS5tZXNzYWdle2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW19LnVpLmJpZy5tZXNzYWdle2ZvbnQtc2l6ZToxLjI4NTcxNDI5ZW19LnVpLmh1Z2UubWVzc2FnZXtmb250LXNpemU6MS40Mjg1NzE0M2VtfS51aS5tYXNzaXZlLm1lc3NhZ2V7Zm9udC1zaXplOjEuNzE0Mjg1NzFlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gVGFibGVcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS50YWJsZXt3aWR0aDoxMDAlO2JhY2tncm91bmQ6I2ZmZjttYXJnaW46MWVtIDA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtO3RleHQtYWxpZ246bGVmdDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlO2JvcmRlci1zcGFjaW5nOjB9LnVpLnRhYmxlOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkudGFibGU6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnRhYmxlIHRkLC51aS50YWJsZSB0aHstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2V9LnVpLnRhYmxlIHRoZWFkey13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkudGFibGUgdGhlYWQgdGh7Y3Vyc29yOmF1dG87YmFja2dyb3VuZDojZjlmYWZiO3RleHQtYWxpZ246aW5oZXJpdDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7cGFkZGluZzouOTI4NTcxNDNlbSAuNzg1NzE0MjllbTt2ZXJ0aWNhbC1hbGlnbjppbmhlcml0O2ZvbnQtc3R5bGU6bm9uZTtmb250LXdlaWdodDo3MDA7dGV4dC10cmFuc2Zvcm06bm9uZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKTtib3JkZXItbGVmdDpub25lfS51aS50YWJsZSB0aGVhZCB0cj50aDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDpub25lfS51aS50YWJsZSB0aGVhZCB0cjpmaXJzdC1jaGlsZD50aDpmaXJzdC1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAwIDAgMH0udWkudGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQ+dGg6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgLjI4NTcxNDI5cmVtIDAgMH0udWkudGFibGUgdGhlYWQgdHI6Zmlyc3QtY2hpbGQ+dGg6b25seS1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwfS51aS50YWJsZSB0Zm9vdHstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnRhYmxlIHRmb290IHRoe2N1cnNvcjphdXRvO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtiYWNrZ3JvdW5kOiNmOWZhZmI7dGV4dC1hbGlnbjppbmhlcml0O2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtwYWRkaW5nOi43ODU3MTQyOWVtIC43ODU3MTQyOWVtO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7dGV4dC10cmFuc2Zvcm06bm9uZX0udWkudGFibGUgdGZvb3QgdHI+dGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLWxlZnQ6bm9uZX0udWkudGFibGUgdGZvb3QgdHI6Zmlyc3QtY2hpbGQ+dGg6Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgMCAuMjg1NzE0MjlyZW19LnVpLnRhYmxlIHRmb290IHRyOmZpcnN0LWNoaWxkPnRoOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIDB9LnVpLnRhYmxlIHRmb290IHRyOmZpcnN0LWNoaWxkPnRoOm9ubHktY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWkudGFibGUgdHIgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSl9LnVpLnRhYmxlIHRyOmZpcnN0LWNoaWxkIHRke2JvcmRlci10b3A6bm9uZX0udWkudGFibGUgdGJvZHkrdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGR7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSl9LnVpLnRhYmxlIHRke3BhZGRpbmc6Ljc4NTcxNDI5ZW0gLjc4NTcxNDI5ZW07dGV4dC1hbGlnbjppbmhlcml0fS51aS50YWJsZT4uaWNvbnt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkudGFibGU+Lmljb246b25seS1jaGlsZHttYXJnaW46MH0udWkudGFibGUuc2VnbWVudHtwYWRkaW5nOjB9LnVpLnRhYmxlLnNlZ21lbnQ6YWZ0ZXJ7ZGlzcGxheTpub25lfS51aS50YWJsZS5zZWdtZW50LnN0YWNrZWQ6YWZ0ZXJ7ZGlzcGxheTpibG9ja31AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKXt3aWR0aDoxMDAlfS51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0Ym9keSwudWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdHIsLnVpLnRhYmxlOm5vdCgudW5zdGFja2FibGUpIHRyPnRkLC51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0cj50aHt3aWR0aDphdXRvIWltcG9ydGFudDtkaXNwbGF5OmJsb2NrIWltcG9ydGFudH0udWkudGFibGU6bm90KC51bnN0YWNrYWJsZSl7cGFkZGluZzowfS51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0aGVhZHtkaXNwbGF5OmJsb2NrfS51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0Zm9vdHtkaXNwbGF5OmJsb2NrfS51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0cntwYWRkaW5nLXRvcDoxZW07cGFkZGluZy1ib3R0b206MWVtOy13ZWJraXQtYm94LXNoYWRvdzowIC0xcHggMCAwIHJnYmEoMCwwLDAsLjEpIGluc2V0IWltcG9ydGFudDtib3gtc2hhZG93OjAgLTFweCAwIDAgcmdiYSgwLDAsMCwuMSkgaW5zZXQhaW1wb3J0YW50fS51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0cj50ZCwudWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdHI+dGh7YmFja2dyb3VuZDowIDA7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O3BhZGRpbmc6LjI1ZW0gLjc1ZW0haW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS51aS50YWJsZTpub3QoLnVuc3RhY2thYmxlKSB0ZDpmaXJzdC1jaGlsZCwudWkudGFibGU6bm90KC51bnN0YWNrYWJsZSkgdGg6Zmlyc3QtY2hpbGR7Zm9udC13ZWlnaHQ6NzAwfS51aS5kZWZpbml0aW9uLnRhYmxlOm5vdCgudW5zdGFja2FibGUpIHRoZWFkIHRoOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fX0udWkudGFibGUgdGQgLmltYWdlLC51aS50YWJsZSB0ZCAuaW1hZ2UgaW1nLC51aS50YWJsZSB0aCAuaW1hZ2UsLnVpLnRhYmxlIHRoIC5pbWFnZSBpbWd7bWF4LXdpZHRoOm5vbmV9LnVpLnN0cnVjdHVyZWQudGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS51aS5zdHJ1Y3R1cmVkLnRhYmxlIHRoZWFkIHRoe2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmV9LnVpLnN0cnVjdHVyZWQuc29ydGFibGUudGFibGUgdGhlYWQgdGh7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc3RydWN0dXJlZC5iYXNpYy50YWJsZSB0aHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lfS51aS5zdHJ1Y3R1cmVkLmNlbGxlZC50YWJsZSB0ciB0ZCwudWkuc3RydWN0dXJlZC5jZWxsZWQudGFibGUgdHIgdGh7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpO2JvcmRlci1yaWdodDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSl9LnVpLmRlZmluaXRpb24udGFibGUgdGhlYWQ6bm90KC5mdWxsLXdpZHRoKSB0aDpmaXJzdC1jaGlsZHtwb2ludGVyLWV2ZW50czpub25lO2JhY2tncm91bmQ6MCAwO2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjpyZ2JhKDAsMCwwLC40KTstd2Via2l0LWJveC1zaGFkb3c6LTFweCAtMXB4IDAgMXB4ICNmZmY7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAxcHggI2ZmZn0udWkuZGVmaW5pdGlvbi50YWJsZSB0Zm9vdDpub3QoLmZ1bGwtd2lkdGgpIHRoOmZpcnN0LWNoaWxke3BvaW50ZXItZXZlbnRzOm5vbmU7YmFja2dyb3VuZDowIDA7Zm9udC13ZWlnaHQ6cmdiYSgwLDAsMCwuNCk7Y29sb3I6bm9ybWFsOy13ZWJraXQtYm94LXNoYWRvdzoxcHggMXB4IDAgMXB4ICNmZmY7Ym94LXNoYWRvdzoxcHggMXB4IDAgMXB4ICNmZmZ9LnVpLmNlbGxlZC5kZWZpbml0aW9uLnRhYmxlIHRoZWFkOm5vdCguZnVsbC13aWR0aCkgdGg6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93OjAgLTFweCAwIDFweCAjZmZmO2JveC1zaGFkb3c6MCAtMXB4IDAgMXB4ICNmZmZ9LnVpLmNlbGxlZC5kZWZpbml0aW9uLnRhYmxlIHRmb290Om5vdCguZnVsbC13aWR0aCkgdGg6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDAgMXB4ICNmZmY7Ym94LXNoYWRvdzowIDFweCAwIDFweCAjZmZmfS51aS5kZWZpbml0aW9uLnRhYmxlIHRyIHRkLmRlZmluaXRpb24sLnVpLmRlZmluaXRpb24udGFibGUgdHIgdGQ6Zmlyc3QtY2hpbGQ6bm90KC5pZ25vcmVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjAzKTtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuOTUpO3RleHQtdHJhbnNmb3JtOicnOy13ZWJraXQtYm94LXNoYWRvdzonJztib3gtc2hhZG93OicnO3RleHQtYWxpZ246Jyc7Zm9udC1zaXplOjFlbTtwYWRkaW5nLWxlZnQ6Jyc7cGFkZGluZy1yaWdodDonJ30udWkuZGVmaW5pdGlvbi50YWJsZSB0aGVhZDpub3QoLmZ1bGwtd2lkdGgpIHRoOm50aC1jaGlsZCgyKXtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5kZWZpbml0aW9uLnRhYmxlIHRmb290Om5vdCguZnVsbC13aWR0aCkgdGg6bnRoLWNoaWxkKDIpe2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmRlZmluaXRpb24udGFibGUgdGQ6bnRoLWNoaWxkKDIpe2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnRhYmxlIHRkLnBvc2l0aXZlLC51aS50YWJsZSB0ci5wb3NpdGl2ZXstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgI2EzYzI5MyBpbnNldDtib3gtc2hhZG93OjAgMCAwICNhM2MyOTMgaW5zZXR9LnVpLnRhYmxlIHRkLnBvc2l0aXZlLC51aS50YWJsZSB0ci5wb3NpdGl2ZXtiYWNrZ3JvdW5kOiNmY2ZmZjUhaW1wb3J0YW50O2NvbG9yOiMyYzY2MmQhaW1wb3J0YW50fS51aS50YWJsZSB0ZC5uZWdhdGl2ZSwudWkudGFibGUgdHIubmVnYXRpdmV7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwICNlMGI0YjQgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAjZTBiNGI0IGluc2V0fS51aS50YWJsZSB0ZC5uZWdhdGl2ZSwudWkudGFibGUgdHIubmVnYXRpdmV7YmFja2dyb3VuZDojZmZmNmY2IWltcG9ydGFudDtjb2xvcjojOWYzYTM4IWltcG9ydGFudH0udWkudGFibGUgdGQuZXJyb3IsLnVpLnRhYmxlIHRyLmVycm9yey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAjZTBiNGI0IGluc2V0O2JveC1zaGFkb3c6MCAwIDAgI2UwYjRiNCBpbnNldH0udWkudGFibGUgdGQuZXJyb3IsLnVpLnRhYmxlIHRyLmVycm9ye2JhY2tncm91bmQ6I2ZmZjZmNiFpbXBvcnRhbnQ7Y29sb3I6IzlmM2EzOCFpbXBvcnRhbnR9LnVpLnRhYmxlIHRkLndhcm5pbmcsLnVpLnRhYmxlIHRyLndhcm5pbmd7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwICNjOWJhOWIgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCAjYzliYTliIGluc2V0fS51aS50YWJsZSB0ZC53YXJuaW5nLC51aS50YWJsZSB0ci53YXJuaW5ne2JhY2tncm91bmQ6I2ZmZmFmMyFpbXBvcnRhbnQ7Y29sb3I6IzU3M2EwOCFpbXBvcnRhbnR9LnVpLnRhYmxlIHRkLmFjdGl2ZSwudWkudGFibGUgdHIuYWN0aXZley13ZWJraXQtYm94LXNoYWRvdzowIDAgMCByZ2JhKDAsMCwwLC44NykgaW5zZXQ7Ym94LXNoYWRvdzowIDAgMCByZ2JhKDAsMCwwLC44NykgaW5zZXR9LnVpLnRhYmxlIHRkLmFjdGl2ZSwudWkudGFibGUgdHIuYWN0aXZle2JhY2tncm91bmQ6I2UwZTBlMCFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuODcpIWltcG9ydGFudH0udWkudGFibGUgdHIgdGQuZGlzYWJsZWQsLnVpLnRhYmxlIHRyLmRpc2FibGVkIHRkLC51aS50YWJsZSB0ci5kaXNhYmxlZDpob3ZlciwudWkudGFibGUgdHI6aG92ZXIgdGQuZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZTtjb2xvcjpyZ2JhKDQwLDQwLDQwLC4zKX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS50YWJsZSwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdGJvZHksLnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRyLC51aVtjbGFzcyo9XFxcInRhYmxldCBzdGFja2FibGVcXFwiXS50YWJsZSB0cj50ZCwudWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdHI+dGh7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxle3BhZGRpbmc6MH0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdGhlYWR7ZGlzcGxheTpibG9ja30udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdGZvb3R7ZGlzcGxheTpibG9ja30udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdHJ7cGFkZGluZy10b3A6MWVtO3BhZGRpbmctYm90dG9tOjFlbTstd2Via2l0LWJveC1zaGFkb3c6MCAtMXB4IDAgMCByZ2JhKDAsMCwwLC4xKSBpbnNldCFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIC0xcHggMCAwIHJnYmEoMCwwLDAsLjEpIGluc2V0IWltcG9ydGFudH0udWlbY2xhc3MqPVxcXCJ0YWJsZXQgc3RhY2thYmxlXFxcIl0udGFibGUgdHI+dGQsLnVpW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRyPnRoe2JhY2tncm91bmQ6MCAwO2JvcmRlcjpub25lIWltcG9ydGFudDtwYWRkaW5nOi4yNWVtIC43NWVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fS51aS5kZWZpbml0aW9uW2NsYXNzKj1cXFwidGFibGV0IHN0YWNrYWJsZVxcXCJdLnRhYmxlIHRoZWFkIHRoOmZpcnN0LWNoaWxkey13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fX0udWkudGFibGUgW2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0sLnVpLnRhYmxlW2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl17dGV4dC1hbGlnbjpsZWZ0fS51aS50YWJsZSBbY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJdLC51aS50YWJsZVtjbGFzcyo9XFxcImNlbnRlciBhbGlnbmVkXFxcIl17dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLnRhYmxlIFtjbGFzcyo9XFxcInJpZ2h0IGFsaWduZWRcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJyaWdodCBhbGlnbmVkXFxcIl17dGV4dC1hbGlnbjpyaWdodH0udWkudGFibGUgW2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJde3ZlcnRpY2FsLWFsaWduOnRvcH0udWkudGFibGUgW2NsYXNzKj1cXFwibWlkZGxlIGFsaWduZWRcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJtaWRkbGUgYWxpZ25lZFxcXCJde3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkudGFibGUgW2NsYXNzKj1cXFwiYm90dG9tIGFsaWduZWRcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJde3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0udWkudGFibGUgdGQuY29sbGFwc2luZywudWkudGFibGUgdGguY29sbGFwc2luZ3t3aWR0aDoxcHg7d2hpdGUtc3BhY2U6bm93cmFwfS51aS5maXhlZC50YWJsZXt0YWJsZS1sYXlvdXQ6Zml4ZWR9LnVpLmZpeGVkLnRhYmxlIHRkLC51aS5maXhlZC50YWJsZSB0aHtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30udWkuc2VsZWN0YWJsZS50YWJsZSB0Ym9keSB0cjpob3ZlciwudWkudGFibGUgdGJvZHkgdHIgdGQuc2VsZWN0YWJsZTpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KSFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGFibGUgdGJvZHkgdHIgdGQuc2VsZWN0YWJsZTpob3ZlciwudWkuc2VsZWN0YWJsZS5pbnZlcnRlZC50YWJsZSB0Ym9keSB0cjpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KSFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLnRhYmxlIHRib2R5IHRyIHRkLnNlbGVjdGFibGV7cGFkZGluZzowfS51aS50YWJsZSB0Ym9keSB0ciB0ZC5zZWxlY3RhYmxlPmE6bm90KC51aSl7ZGlzcGxheTpibG9jaztjb2xvcjppbmhlcml0O3BhZGRpbmc6Ljc4NTcxNDI5ZW0gLjc4NTcxNDI5ZW19LnVpLnNlbGVjdGFibGUudGFibGUgdHIuZXJyb3I6aG92ZXIsLnVpLnNlbGVjdGFibGUudGFibGUgdHI6aG92ZXIgdGQuZXJyb3IsLnVpLnRhYmxlIHRyIHRkLnNlbGVjdGFibGUuZXJyb3I6aG92ZXJ7YmFja2dyb3VuZDojZmZlN2U3IWltcG9ydGFudDtjb2xvcjojOTQzNjM0IWltcG9ydGFudH0udWkuc2VsZWN0YWJsZS50YWJsZSB0ci53YXJuaW5nOmhvdmVyLC51aS5zZWxlY3RhYmxlLnRhYmxlIHRyOmhvdmVyIHRkLndhcm5pbmcsLnVpLnRhYmxlIHRyIHRkLnNlbGVjdGFibGUud2FybmluZzpob3ZlcntiYWNrZ3JvdW5kOiNmZmY0ZTQhaW1wb3J0YW50O2NvbG9yOiM0OTMxMDchaW1wb3J0YW50fS51aS5zZWxlY3RhYmxlLnRhYmxlIHRyLmFjdGl2ZTpob3ZlciwudWkuc2VsZWN0YWJsZS50YWJsZSB0cjpob3ZlciB0ZC5hY3RpdmUsLnVpLnRhYmxlIHRyIHRkLnNlbGVjdGFibGUuYWN0aXZlOmhvdmVye2JhY2tncm91bmQ6I2UwZTBlMCFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuODcpIWltcG9ydGFudH0udWkuc2VsZWN0YWJsZS50YWJsZSB0ci5wb3NpdGl2ZTpob3ZlciwudWkuc2VsZWN0YWJsZS50YWJsZSB0cjpob3ZlciB0ZC5wb3NpdGl2ZSwudWkudGFibGUgdHIgdGQuc2VsZWN0YWJsZS5wb3NpdGl2ZTpob3ZlcntiYWNrZ3JvdW5kOiNmN2ZmZTYhaW1wb3J0YW50O2NvbG9yOiMyNzViMjghaW1wb3J0YW50fS51aS5zZWxlY3RhYmxlLnRhYmxlIHRyLm5lZ2F0aXZlOmhvdmVyLC51aS5zZWxlY3RhYmxlLnRhYmxlIHRyOmhvdmVyIHRkLm5lZ2F0aXZlLC51aS50YWJsZSB0ciB0ZC5zZWxlY3RhYmxlLm5lZ2F0aXZlOmhvdmVye2JhY2tncm91bmQ6I2ZmZTdlNyFpbXBvcnRhbnQ7Y29sb3I6Izk0MzYzNCFpbXBvcnRhbnR9LnVpLmF0dGFjaGVkLnRhYmxle3RvcDowO2JvdHRvbTowO2JvcmRlci1yYWRpdXM6MDttYXJnaW46MCAtMXB4O3dpZHRoOmNhbGMoMTAwJSArIDJweCk7bWF4LXdpZHRoOmNhbGMoMTAwJSArIDJweCk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNX0udWkuYXR0YWNoZWQrLnVpLmF0dGFjaGVkLnRhYmxlOm5vdCgudG9wKXtib3JkZXItdG9wOm5vbmV9LnVpW2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl0udGFibGV7Ym90dG9tOjA7bWFyZ2luLWJvdHRvbTowO3RvcDowO21hcmdpbi10b3A6MWVtO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLnRhYmxlW2NsYXNzKj1cXFwidG9wIGF0dGFjaGVkXFxcIl06Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aVtjbGFzcyo9XFxcImJvdHRvbSBhdHRhY2hlZFxcXCJdLnRhYmxle2JvdHRvbTowO21hcmdpbi10b3A6MDt0b3A6MDttYXJnaW4tYm90dG9tOjFlbTstd2Via2l0LWJveC1zaGFkb3c6bm9uZSxub25lO2JveC1zaGFkb3c6bm9uZSxub25lO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpW2NsYXNzKj1cXFwiYm90dG9tIGF0dGFjaGVkXFxcIl0udGFibGU6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLnN0cmlwZWQudGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKSwudWkuc3RyaXBlZC50YWJsZT50cjpudGgtY2hpbGQoMm4pe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsNTAsLjAyKX0udWkuaW52ZXJ0ZWQuc3RyaXBlZC50YWJsZSB0Ym9keSB0cjpudGgtY2hpbGQoMm4pLC51aS5pbnZlcnRlZC5zdHJpcGVkLnRhYmxlPnRyOm50aC1jaGlsZCgybil7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNSl9LnVpLnN0cmlwZWQuc2VsZWN0YWJsZS5zZWxlY3RhYmxlLnNlbGVjdGFibGUudGFibGUgdGJvZHkgdHIuYWN0aXZlOmhvdmVye2JhY2tncm91bmQ6I2VmZWZlZiFpbXBvcnRhbnQ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkudGFibGUgW2NsYXNzKj1cXFwic2luZ2xlIGxpbmVcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJzaW5nbGUgbGluZVxcXCJde3doaXRlLXNwYWNlOm5vd3JhcH0udWkudGFibGUgW2NsYXNzKj1cXFwic2luZ2xlIGxpbmVcXFwiXSwudWkudGFibGVbY2xhc3MqPVxcXCJzaW5nbGUgbGluZVxcXCJde3doaXRlLXNwYWNlOm5vd3JhcH0udWkucmVkLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjZGIyODI4fS51aS5pbnZlcnRlZC5yZWQudGFibGV7YmFja2dyb3VuZC1jb2xvcjojZGIyODI4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub3JhbmdlLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjZjI3MTFjfS51aS5pbnZlcnRlZC5vcmFuZ2UudGFibGV7YmFja2dyb3VuZC1jb2xvcjojZjI3MTFjIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkueWVsbG93LnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjZmJiZDA4fS51aS5pbnZlcnRlZC55ZWxsb3cudGFibGV7YmFja2dyb3VuZC1jb2xvcjojZmJiZDA4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub2xpdmUudGFibGV7Ym9yZGVyLXRvcDouMmVtIHNvbGlkICNiNWNjMTh9LnVpLmludmVydGVkLm9saXZlLnRhYmxle2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmdyZWVuLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjMjFiYTQ1fS51aS5pbnZlcnRlZC5ncmVlbi50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiMyMWJhNDUhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS50ZWFsLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjMDBiNWFkfS51aS5pbnZlcnRlZC50ZWFsLnRhYmxle2JhY2tncm91bmQtY29sb3I6IzAwYjVhZCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9LnVpLmJsdWUudGFibGV7Ym9yZGVyLXRvcDouMmVtIHNvbGlkICMyMTg1ZDB9LnVpLmludmVydGVkLmJsdWUudGFibGV7YmFja2dyb3VuZC1jb2xvcjojMjE4NWQwIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkudmlvbGV0LnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjNjQzNWM5fS51aS5pbnZlcnRlZC52aW9sZXQudGFibGV7YmFja2dyb3VuZC1jb2xvcjojNjQzNWM5IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucHVycGxlLnRhYmxle2JvcmRlci10b3A6LjJlbSBzb2xpZCAjYTMzM2M4fS51aS5pbnZlcnRlZC5wdXJwbGUudGFibGV7YmFja2dyb3VuZC1jb2xvcjojYTMzM2M4IWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkucGluay50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgI2UwMzk5N30udWkuaW52ZXJ0ZWQucGluay50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiNlMDM5OTchaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5icm93bi50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgI2E1NjczZn0udWkuaW52ZXJ0ZWQuYnJvd24udGFibGV7YmFja2dyb3VuZC1jb2xvcjojYTU2NzNmIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkuZ3JleS50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgIzc2NzY3Nn0udWkuaW52ZXJ0ZWQuZ3JleS50YWJsZXtiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzYhaW1wb3J0YW50O2NvbG9yOiNmZmYhaW1wb3J0YW50fS51aS5ibGFjay50YWJsZXtib3JkZXItdG9wOi4yZW0gc29saWQgIzFiMWMxZH0udWkuaW52ZXJ0ZWQuYmxhY2sudGFibGV7YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkIWltcG9ydGFudDtjb2xvcjojZmZmIWltcG9ydGFudH0udWkub25lLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDoxMDAlfS51aS50d28uY29sdW1uLnRhYmxlIHRke3dpZHRoOjUwJX0udWkudGhyZWUuY29sdW1uLnRhYmxlIHRke3dpZHRoOjMzLjMzMzMzMzMzJX0udWkuZm91ci5jb2x1bW4udGFibGUgdGR7d2lkdGg6MjUlfS51aS5maXZlLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDoyMCV9LnVpLnNpeC5jb2x1bW4udGFibGUgdGR7d2lkdGg6MTYuNjY2NjY2NjclfS51aS5zZXZlbi5jb2x1bW4udGFibGUgdGR7d2lkdGg6MTQuMjg1NzE0MjklfS51aS5laWdodC5jb2x1bW4udGFibGUgdGR7d2lkdGg6MTIuNSV9LnVpLm5pbmUuY29sdW1uLnRhYmxlIHRke3dpZHRoOjExLjExMTExMTExJX0udWkudGVuLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDoxMCV9LnVpLmVsZXZlbi5jb2x1bW4udGFibGUgdGR7d2lkdGg6OS4wOTA5MDkwOSV9LnVpLnR3ZWx2ZS5jb2x1bW4udGFibGUgdGR7d2lkdGg6OC4zMzMzMzMzMyV9LnVpLnRoaXJ0ZWVuLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDo3LjY5MjMwNzY5JX0udWkuZm91cnRlZW4uY29sdW1uLnRhYmxlIHRke3dpZHRoOjcuMTQyODU3MTQlfS51aS5maWZ0ZWVuLmNvbHVtbi50YWJsZSB0ZHt3aWR0aDo2LjY2NjY2NjY3JX0udWkuc2l4dGVlbi5jb2x1bW4udGFibGUgdGR7d2lkdGg6Ni4yNSV9LnVpLnRhYmxlIHRkLm9uZS53aWRlLC51aS50YWJsZSB0aC5vbmUud2lkZXt3aWR0aDo2LjI1JX0udWkudGFibGUgdGQudHdvLndpZGUsLnVpLnRhYmxlIHRoLnR3by53aWRle3dpZHRoOjEyLjUlfS51aS50YWJsZSB0ZC50aHJlZS53aWRlLC51aS50YWJsZSB0aC50aHJlZS53aWRle3dpZHRoOjE4Ljc1JX0udWkudGFibGUgdGQuZm91ci53aWRlLC51aS50YWJsZSB0aC5mb3VyLndpZGV7d2lkdGg6MjUlfS51aS50YWJsZSB0ZC5maXZlLndpZGUsLnVpLnRhYmxlIHRoLmZpdmUud2lkZXt3aWR0aDozMS4yNSV9LnVpLnRhYmxlIHRkLnNpeC53aWRlLC51aS50YWJsZSB0aC5zaXgud2lkZXt3aWR0aDozNy41JX0udWkudGFibGUgdGQuc2V2ZW4ud2lkZSwudWkudGFibGUgdGguc2V2ZW4ud2lkZXt3aWR0aDo0My43NSV9LnVpLnRhYmxlIHRkLmVpZ2h0LndpZGUsLnVpLnRhYmxlIHRoLmVpZ2h0LndpZGV7d2lkdGg6NTAlfS51aS50YWJsZSB0ZC5uaW5lLndpZGUsLnVpLnRhYmxlIHRoLm5pbmUud2lkZXt3aWR0aDo1Ni4yNSV9LnVpLnRhYmxlIHRkLnRlbi53aWRlLC51aS50YWJsZSB0aC50ZW4ud2lkZXt3aWR0aDo2Mi41JX0udWkudGFibGUgdGQuZWxldmVuLndpZGUsLnVpLnRhYmxlIHRoLmVsZXZlbi53aWRle3dpZHRoOjY4Ljc1JX0udWkudGFibGUgdGQudHdlbHZlLndpZGUsLnVpLnRhYmxlIHRoLnR3ZWx2ZS53aWRle3dpZHRoOjc1JX0udWkudGFibGUgdGQudGhpcnRlZW4ud2lkZSwudWkudGFibGUgdGgudGhpcnRlZW4ud2lkZXt3aWR0aDo4MS4yNSV9LnVpLnRhYmxlIHRkLmZvdXJ0ZWVuLndpZGUsLnVpLnRhYmxlIHRoLmZvdXJ0ZWVuLndpZGV7d2lkdGg6ODcuNSV9LnVpLnRhYmxlIHRkLmZpZnRlZW4ud2lkZSwudWkudGFibGUgdGguZmlmdGVlbi53aWRle3dpZHRoOjkzLjc1JX0udWkudGFibGUgdGQuc2l4dGVlbi53aWRlLC51aS50YWJsZSB0aC5zaXh0ZWVuLndpZGV7d2lkdGg6MTAwJX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGh7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aDpmaXJzdC1jaGlsZHtib3JkZXItbGVmdDpub25lfS51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aC5zb3J0ZWQsLnVpLnNvcnRhYmxlLnRhYmxlIHRoZWFkIHRoLnNvcnRlZDpob3Zlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LnVpLnNvcnRhYmxlLnRhYmxlIHRoZWFkIHRoOmFmdGVye2Rpc3BsYXk6bm9uZTtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXQ7Y29udGVudDonJztoZWlnaHQ6MWVtO3dpZHRoOmF1dG87b3BhY2l0eTouODttYXJnaW46MCAwIDAgLjVlbTtmb250LWZhbWlseTpJY29uc30udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguYXNjZW5kaW5nOmFmdGVye2NvbnRlbnQ6J1xcXFxmMGQ4J30udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguZGVzY2VuZGluZzphZnRlcntjb250ZW50OidcXFxcZjBkNyd9LnVpLnNvcnRhYmxlLnRhYmxlIHRoLmRpc2FibGVkOmhvdmVye2N1cnNvcjphdXRvO2NvbG9yOnJnYmEoNDAsNDAsNDAsLjMpfS51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC44KX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguc29ydGVke2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc29ydGFibGUudGFibGUgdGhlYWQgdGguc29ydGVkOmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrfS51aS5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aC5zb3J0ZWQ6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5pbnZlcnRlZC5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aC5zb3J0ZWR7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgLXdlYmtpdC1saW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuMDUpKTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjE1KSBsaW5lYXItZ3JhZGllbnQodHJhbnNwYXJlbnQscmdiYSgwLDAsMCwuMDUpKTtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5zb3J0YWJsZS50YWJsZSB0aGVhZCB0aDpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KSAtd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxmcm9tKHRyYW5zcGFyZW50KSx0byhyZ2JhKDAsMCwwLC4wNSkpKTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KSAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDgpIGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnNvcnRhYmxlLnRhYmxlIHRoZWFkIHRoe2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1yaWdodC1jb2xvcjp0cmFuc3BhcmVudH0udWkuaW52ZXJ0ZWQudGFibGV7YmFja2dyb3VuZDojMzMzO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpO2JvcmRlcjpub25lfS51aS5pbnZlcnRlZC50YWJsZSB0aHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjE1KTtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSkhaW1wb3J0YW50O2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGFibGUgdHIgdGR7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpIWltcG9ydGFudH0udWkuaW52ZXJ0ZWQudGFibGUgdHIgdGQuZGlzYWJsZWQsLnVpLmludmVydGVkLnRhYmxlIHRyLmRpc2FibGVkIHRkLC51aS5pbnZlcnRlZC50YWJsZSB0ci5kaXNhYmxlZDpob3ZlciB0ZCwudWkuaW52ZXJ0ZWQudGFibGUgdHI6aG92ZXIgdGQuZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZTtjb2xvcjpyZ2JhKDIyNSwyMjUsMjI1LC4zKX0udWkuaW52ZXJ0ZWQuZGVmaW5pdGlvbi50YWJsZSB0Zm9vdDpub3QoLmZ1bGwtd2lkdGgpIHRoOmZpcnN0LWNoaWxkLC51aS5pbnZlcnRlZC5kZWZpbml0aW9uLnRhYmxlIHRoZWFkOm5vdCguZnVsbC13aWR0aCkgdGg6Zmlyc3QtY2hpbGR7YmFja2dyb3VuZDojZmZmfS51aS5pbnZlcnRlZC5kZWZpbml0aW9uLnRhYmxlIHRyIHRkOmZpcnN0LWNoaWxke2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDIpO2NvbG9yOiNmZmZ9LnVpLmNvbGxhcHNpbmcudGFibGV7d2lkdGg6YXV0b30udWkuYmFzaWMudGFibGV7YmFja2dyb3VuZDowIDA7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5iYXNpYy50YWJsZSB0Zm9vdCwudWkuYmFzaWMudGFibGUgdGhlYWR7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5iYXNpYy50YWJsZSB0aHtiYWNrZ3JvdW5kOjAgMDtib3JkZXItbGVmdDpub25lfS51aS5iYXNpYy50YWJsZSB0Ym9keSB0cntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xKX0udWkuYmFzaWMudGFibGUgdGR7YmFja2dyb3VuZDowIDB9LnVpLmJhc2ljLnN0cmlwZWQudGFibGUgdGJvZHkgdHI6bnRoLWNoaWxkKDJuKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KSFpbXBvcnRhbnR9LnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxle2JvcmRlcjpub25lfS51aVtjbGFzcyo9XFxcInZlcnkgYmFzaWNcXFwiXS50YWJsZTpub3QoLnNvcnRhYmxlKTpub3QoLnN0cmlwZWQpIHRkLC51aVtjbGFzcyo9XFxcInZlcnkgYmFzaWNcXFwiXS50YWJsZTpub3QoLnNvcnRhYmxlKTpub3QoLnN0cmlwZWQpIHRoe3BhZGRpbmc6Jyd9LnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxlOm5vdCguc29ydGFibGUpOm5vdCguc3RyaXBlZCkgdGQ6Zmlyc3QtY2hpbGQsLnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxlOm5vdCguc29ydGFibGUpOm5vdCguc3RyaXBlZCkgdGg6Zmlyc3QtY2hpbGR7cGFkZGluZy1sZWZ0OjB9LnVpW2NsYXNzKj1cXFwidmVyeSBiYXNpY1xcXCJdLnRhYmxlOm5vdCguc29ydGFibGUpOm5vdCguc3RyaXBlZCkgdGQ6bGFzdC1jaGlsZCwudWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGU6bm90KC5zb3J0YWJsZSk6bm90KC5zdHJpcGVkKSB0aDpsYXN0LWNoaWxke3BhZGRpbmctcmlnaHQ6MH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IGJhc2ljXFxcIl0udGFibGU6bm90KC5zb3J0YWJsZSk6bm90KC5zdHJpcGVkKSB0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aHtwYWRkaW5nLXRvcDowfS51aS5jZWxsZWQudGFibGUgdHIgdGQsLnVpLmNlbGxlZC50YWJsZSB0ciB0aHtib3JkZXItbGVmdDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSl9LnVpLmNlbGxlZC50YWJsZSB0ciB0ZDpmaXJzdC1jaGlsZCwudWkuY2VsbGVkLnRhYmxlIHRyIHRoOmZpcnN0LWNoaWxke2JvcmRlci1sZWZ0Om5vbmV9LnVpLnBhZGRlZC50YWJsZSB0aHtwYWRkaW5nLWxlZnQ6MWVtO3BhZGRpbmctcmlnaHQ6MWVtfS51aS5wYWRkZWQudGFibGUgdGQsLnVpLnBhZGRlZC50YWJsZSB0aHtwYWRkaW5nOjFlbSAxZW19LnVpW2NsYXNzKj1cXFwidmVyeSBwYWRkZWRcXFwiXS50YWJsZSB0aHtwYWRkaW5nLWxlZnQ6MS41ZW07cGFkZGluZy1yaWdodDoxLjVlbX0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHBhZGRlZFxcXCJdLnRhYmxlIHRke3BhZGRpbmc6MS41ZW0gMS41ZW19LnVpLmNvbXBhY3QudGFibGUgdGh7cGFkZGluZy1sZWZ0Oi43ZW07cGFkZGluZy1yaWdodDouN2VtfS51aS5jb21wYWN0LnRhYmxlIHRke3BhZGRpbmc6LjVlbSAuN2VtfS51aVtjbGFzcyo9XFxcInZlcnkgY29tcGFjdFxcXCJdLnRhYmxlIHRoe3BhZGRpbmctbGVmdDouNmVtO3BhZGRpbmctcmlnaHQ6LjZlbX0udWlbY2xhc3MqPVxcXCJ2ZXJ5IGNvbXBhY3RcXFwiXS50YWJsZSB0ZHtwYWRkaW5nOi40ZW0gLjZlbX0udWkuc21hbGwudGFibGV7Zm9udC1zaXplOi45ZW19LnVpLnRhYmxle2ZvbnQtc2l6ZToxZW19LnVpLmxhcmdlLnRhYmxle2ZvbnQtc2l6ZToxLjFlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gQWRcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIENvcHlyaWdodCAyMDEzIENvbnRyaWJ1dG9yc1xcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5hZHtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjttYXJnaW46MWVtIDB9LnVpLmFkOmZpcnN0LWNoaWxke21hcmdpbjowfS51aS5hZDpsYXN0LWNoaWxke21hcmdpbjowfS51aS5hZCBpZnJhbWV7bWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjpub25lO292ZXJmbG93OmhpZGRlbn0udWkubGVhZGVyYm9hcmQuYWR7d2lkdGg6NzI4cHg7aGVpZ2h0OjkwcHh9LnVpW2NsYXNzKj1cXFwibWVkaXVtIHJlY3RhbmdsZVxcXCJdLmFke3dpZHRoOjMwMHB4O2hlaWdodDoyNTBweH0udWlbY2xhc3MqPVxcXCJsYXJnZSByZWN0YW5nbGVcXFwiXS5hZHt3aWR0aDozMzZweDtoZWlnaHQ6MjgwcHh9LnVpW2NsYXNzKj1cXFwiaGFsZiBwYWdlXFxcIl0uYWR7d2lkdGg6MzAwcHg7aGVpZ2h0OjYwMHB4fS51aS5zcXVhcmUuYWR7d2lkdGg6MjUwcHg7aGVpZ2h0OjI1MHB4fS51aVtjbGFzcyo9XFxcInNtYWxsIHNxdWFyZVxcXCJdLmFke3dpZHRoOjIwMHB4O2hlaWdodDoyMDBweH0udWlbY2xhc3MqPVxcXCJzbWFsbCByZWN0YW5nbGVcXFwiXS5hZHt3aWR0aDoxODBweDtoZWlnaHQ6MTUwcHh9LnVpW2NsYXNzKj1cXFwidmVydGljYWwgcmVjdGFuZ2xlXFxcIl0uYWR7d2lkdGg6MjQwcHg7aGVpZ2h0OjQwMHB4fS51aS5idXR0b24uYWR7d2lkdGg6MTIwcHg7aGVpZ2h0OjkwcHh9LnVpW2NsYXNzKj1cXFwic3F1YXJlIGJ1dHRvblxcXCJdLmFke3dpZHRoOjEyNXB4O2hlaWdodDoxMjVweH0udWlbY2xhc3MqPVxcXCJzbWFsbCBidXR0b25cXFwiXS5hZHt3aWR0aDoxMjBweDtoZWlnaHQ6NjBweH0udWkuc2t5c2NyYXBlci5hZHt3aWR0aDoxMjBweDtoZWlnaHQ6NjAwcHh9LnVpW2NsYXNzKj1cXFwid2lkZSBza3lzY3JhcGVyXFxcIl0uYWR7d2lkdGg6MTYwcHh9LnVpLmJhbm5lci5hZHt3aWR0aDo0NjhweDtoZWlnaHQ6NjBweH0udWlbY2xhc3MqPVxcXCJ2ZXJ0aWNhbCBiYW5uZXJcXFwiXS5hZHt3aWR0aDoxMjBweDtoZWlnaHQ6MjQwcHh9LnVpW2NsYXNzKj1cXFwidG9wIGJhbm5lclxcXCJdLmFke3dpZHRoOjkzMHB4O2hlaWdodDoxODBweH0udWlbY2xhc3MqPVxcXCJoYWxmIGJhbm5lclxcXCJdLmFke3dpZHRoOjIzNHB4O2hlaWdodDo2MHB4fS51aVtjbGFzcyo9XFxcImxhcmdlIGxlYWRlcmJvYXJkXFxcIl0uYWR7d2lkdGg6OTcwcHg7aGVpZ2h0OjkwcHh9LnVpLmJpbGxib2FyZC5hZHt3aWR0aDo5NzBweDtoZWlnaHQ6MjUwcHh9LnVpLnBhbm9yYW1hLmFke3dpZHRoOjk4MHB4O2hlaWdodDoxMjBweH0udWkubmV0Ym9hcmQuYWR7d2lkdGg6NTgwcHg7aGVpZ2h0OjQwMHB4fS51aVtjbGFzcyo9XFxcImxhcmdlIG1vYmlsZSBiYW5uZXJcXFwiXS5hZHt3aWR0aDozMjBweDtoZWlnaHQ6MTAwcHh9LnVpW2NsYXNzKj1cXFwibW9iaWxlIGxlYWRlcmJvYXJkXFxcIl0uYWR7d2lkdGg6MzIwcHg7aGVpZ2h0OjUwcHh9LnVpLm1vYmlsZS5hZHtkaXNwbGF5Om5vbmV9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkubW9iaWxlLmFke2Rpc3BsYXk6YmxvY2t9fS51aS5jZW50ZXJlZC5hZHttYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvfS51aS50ZXN0LmFke3Bvc2l0aW9uOnJlbGF0aXZlO2JhY2tncm91bmQ6IzU0NTQ1NH0udWkudGVzdC5hZDphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoLTUwJSk7Y29udGVudDonQWQnO2NvbG9yOiNmZmY7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDo3MDB9LnVpLm1vYmlsZS50ZXN0LmFkOmFmdGVye2ZvbnQtc2l6ZTouODU3MTQyODZlbX0udWkudGVzdC5hZFtkYXRhLXRleHRdOmFmdGVye2NvbnRlbnQ6YXR0cihkYXRhLXRleHQpfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBJdGVtXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuY2FyZCwudWkuY2FyZHM+LmNhcmR7bWF4LXdpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDoyOTBweDttaW4taGVpZ2h0OjA7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6MDtib3JkZXI6bm9uZTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggM3B4IDAgI2Q0ZDRkNSwwIDAgMCAxcHggI2Q0ZDRkNTtib3gtc2hhZG93OjAgMXB4IDNweCAwICNkNGQ0ZDUsMCAwIDAgMXB4ICNkNGQ0ZDU7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZTt0cmFuc2l0aW9uOi13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2UsdHJhbnNmb3JtIC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSx0cmFuc2Zvcm0gLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlO3otaW5kZXg6Jyd9LnVpLmNhcmR7bWFyZ2luOjFlbSAwfS51aS5jYXJkIGEsLnVpLmNhcmRzPi5jYXJkIGF7Y3Vyc29yOnBvaW50ZXJ9LnVpLmNhcmQ6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5jYXJkOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5jYXJkc3tkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O21hcmdpbjotLjg3NWVtIC0uNWVtOy1tcy1mbGV4LXdyYXA6d3JhcDtmbGV4LXdyYXA6d3JhcH0udWkuY2FyZHM+LmNhcmR7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDttYXJnaW46Ljg3NWVtIC41ZW07ZmxvYXQ6bm9uZX0udWkuY2FyZDphZnRlciwudWkuY2FyZHM6YWZ0ZXJ7ZGlzcGxheTpibG9jaztjb250ZW50OicgJztoZWlnaHQ6MDtjbGVhcjpib3RoO292ZXJmbG93OmhpZGRlbjt2aXNpYmlsaXR5OmhpZGRlbn0udWkuY2FyZHN+LnVpLmNhcmRze21hcmdpbi10b3A6Ljg3NWVtfS51aS5jYXJkPjpmaXJzdC1jaGlsZCwudWkuY2FyZHM+LmNhcmQ+OmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDAhaW1wb3J0YW50O2JvcmRlci10b3A6bm9uZSFpbXBvcnRhbnR9LnVpLmNhcmQ+Omxhc3QtY2hpbGQsLnVpLmNhcmRzPi5jYXJkPjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS5jYXJkPjpvbmx5LWNoaWxkLC51aS5jYXJkcz4uY2FyZD46b25seS1jaGlsZHtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSFpbXBvcnRhbnR9LnVpLmNhcmQ+LmltYWdlLC51aS5jYXJkcz4uY2FyZD4uaW1hZ2V7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1mbGV4OjA7LW1zLWZsZXg6MCAwIGF1dG87ZmxleDowIDAgYXV0bztwYWRkaW5nOjA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNSl9LnVpLmNhcmQ+LmltYWdlPmltZywudWkuY2FyZHM+LmNhcmQ+LmltYWdlPmltZ3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG87Ym9yZGVyLXJhZGl1czppbmhlcml0fS51aS5jYXJkPi5pbWFnZTpub3QoLnVpKT5pbWcsLnVpLmNhcmRzPi5jYXJkPi5pbWFnZTpub3QoLnVpKT5pbWd7Ym9yZGVyOm5vbmV9LnVpLmNhcmQ+LmNvbnRlbnQsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50ey13ZWJraXQtYm94LWZsZXg6MTstbXMtZmxleC1wb3NpdGl2ZToxO2ZsZXgtZ3JvdzoxO2JvcmRlcjpub25lO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpO2JhY2tncm91bmQ6MCAwO21hcmdpbjowO3BhZGRpbmc6MWVtIDFlbTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7Zm9udC1zaXplOjFlbTtib3JkZXItcmFkaXVzOjB9LnVpLmNhcmQ+LmNvbnRlbnQ6YWZ0ZXIsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50OmFmdGVye2Rpc3BsYXk6YmxvY2s7Y29udGVudDonICc7aGVpZ2h0OjA7Y2xlYXI6Ym90aDtvdmVyZmxvdzpoaWRkZW47dmlzaWJpbGl0eTpoaWRkZW59LnVpLmNhcmQ+LmNvbnRlbnQ+LmhlYWRlciwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQ+LmhlYWRlcntkaXNwbGF5OmJsb2NrO21hcmdpbjonJztmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5jYXJkPi5jb250ZW50Pi5oZWFkZXI6bm90KC51aSksLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50Pi5oZWFkZXI6bm90KC51aSl7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxLjI4NTcxNDI5ZW07bWFyZ2luLXRvcDotLjIxNDI1ZW07bGluZS1oZWlnaHQ6MS4yODU3MTQyOWVtfS51aS5jYXJkPi5jb250ZW50Pi5oZWFkZXIrLmRlc2NyaXB0aW9uLC51aS5jYXJkPi5jb250ZW50Pi5tZXRhKy5kZXNjcmlwdGlvbiwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQ+LmhlYWRlcisuZGVzY3JpcHRpb24sLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50Pi5tZXRhKy5kZXNjcmlwdGlvbnttYXJnaW4tdG9wOi41ZW19LnVpLmNhcmQgW2NsYXNzKj1cXFwibGVmdCBmbG9hdGVkXFxcIl0sLnVpLmNhcmRzPi5jYXJkIFtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJde2Zsb2F0OmxlZnR9LnVpLmNhcmQgW2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJdLC51aS5jYXJkcz4uY2FyZCBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl17ZmxvYXQ6cmlnaHR9LnVpLmNhcmQgW2NsYXNzKj1cXFwibGVmdCBhbGlnbmVkXFxcIl0sLnVpLmNhcmRzPi5jYXJkIFtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJde3RleHQtYWxpZ246bGVmdH0udWkuY2FyZCBbY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJdLC51aS5jYXJkcz4uY2FyZCBbY2xhc3MqPVxcXCJjZW50ZXIgYWxpZ25lZFxcXCJde3RleHQtYWxpZ246Y2VudGVyfS51aS5jYXJkIFtjbGFzcyo9XFxcInJpZ2h0IGFsaWduZWRcXFwiXSwudWkuY2FyZHM+LmNhcmQgW2NsYXNzKj1cXFwicmlnaHQgYWxpZ25lZFxcXCJde3RleHQtYWxpZ246cmlnaHR9LnVpLmNhcmQgLmNvbnRlbnQgaW1nLC51aS5jYXJkcz4uY2FyZCAuY29udGVudCBpbWd7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO3dpZHRoOicnfS51aS5jYXJkIC5hdmF0YXIgaW1nLC51aS5jYXJkIGltZy5hdmF0YXIsLnVpLmNhcmRzPi5jYXJkIC5hdmF0YXIgaW1nLC51aS5jYXJkcz4uY2FyZCBpbWcuYXZhdGFye3dpZHRoOjJlbTtoZWlnaHQ6MmVtO2JvcmRlci1yYWRpdXM6NTAwcmVtfS51aS5jYXJkPi5jb250ZW50Pi5kZXNjcmlwdGlvbiwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQ+LmRlc2NyaXB0aW9ue2NsZWFyOmJvdGg7Y29sb3I6cmdiYSgwLDAsMCwuNjgpfS51aS5jYXJkPi5jb250ZW50IHAsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IHB7bWFyZ2luOjAgMCAuNWVtfS51aS5jYXJkPi5jb250ZW50IHA6bGFzdC1jaGlsZCwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQgcDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuY2FyZCAubWV0YSwudWkuY2FyZHM+LmNhcmQgLm1ldGF7Zm9udC1zaXplOjFlbTtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuY2FyZCAubWV0YSAqLC51aS5jYXJkcz4uY2FyZCAubWV0YSAqe21hcmdpbi1yaWdodDouM2VtfS51aS5jYXJkIC5tZXRhIDpsYXN0LWNoaWxkLC51aS5jYXJkcz4uY2FyZCAubWV0YSA6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udWkuY2FyZCAubWV0YSBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl0sLnVpLmNhcmRzPi5jYXJkIC5tZXRhIFtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXXttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDouM2VtfS51aS5jYXJkPi5jb250ZW50IGE6bm90KC51aSksLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IGE6bm90KC51aSl7Y29sb3I6Jyc7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLmNhcmQ+LmNvbnRlbnQgYTpub3QoLnVpKTpob3ZlciwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQgYTpub3QoLnVpKTpob3Zlcntjb2xvcjonJ30udWkuY2FyZD4uY29udGVudD5hLmhlYWRlciwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQ+YS5oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5jYXJkPi5jb250ZW50PmEuaGVhZGVyOmhvdmVyLC51aS5jYXJkcz4uY2FyZD4uY29udGVudD5hLmhlYWRlcjpob3Zlcntjb2xvcjojMWU3MGJmfS51aS5jYXJkIC5tZXRhPmE6bm90KC51aSksLnVpLmNhcmRzPi5jYXJkIC5tZXRhPmE6bm90KC51aSl7Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLmNhcmQgLm1ldGE+YTpub3QoLnVpKTpob3ZlciwudWkuY2FyZHM+LmNhcmQgLm1ldGE+YTpub3QoLnVpKTpob3Zlcntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmNhcmQ+LmJ1dHRvbiwudWkuY2FyZD4uYnV0dG9ucywudWkuY2FyZHM+LmNhcmQ+LmJ1dHRvbiwudWkuY2FyZHM+LmNhcmQ+LmJ1dHRvbnN7bWFyZ2luOjAgLTFweDt3aWR0aDpjYWxjKDEwMCUgKyAycHgpfS51aS5jYXJkIC5kaW1tZXIsLnVpLmNhcmRzPi5jYXJkIC5kaW1tZXJ7YmFja2dyb3VuZC1jb2xvcjonJzt6LWluZGV4OjEwfS51aS5jYXJkPi5jb250ZW50IC5zdGFyLmljb24sLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IC5zdGFyLmljb257Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNzU7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLmNhcmQ+LmNvbnRlbnQgLnN0YXIuaWNvbjpob3ZlciwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQgLnN0YXIuaWNvbjpob3ZlcntvcGFjaXR5OjE7Y29sb3I6I2ZmYjcwYX0udWkuY2FyZD4uY29udGVudCAuYWN0aXZlLnN0YXIuaWNvbiwudWkuY2FyZHM+LmNhcmQ+LmNvbnRlbnQgLmFjdGl2ZS5zdGFyLmljb257Y29sb3I6I2ZmZTYyM30udWkuY2FyZD4uY29udGVudCAubGlrZS5pY29uLC51aS5jYXJkcz4uY2FyZD4uY29udGVudCAubGlrZS5pY29ue2N1cnNvcjpwb2ludGVyO29wYWNpdHk6Ljc1Oy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlfS51aS5jYXJkPi5jb250ZW50IC5saWtlLmljb246aG92ZXIsLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IC5saWtlLmljb246aG92ZXJ7b3BhY2l0eToxO2NvbG9yOiNmZjI3MzN9LnVpLmNhcmQ+LmNvbnRlbnQgLmFjdGl2ZS5saWtlLmljb24sLnVpLmNhcmRzPi5jYXJkPi5jb250ZW50IC5hY3RpdmUubGlrZS5pY29ue2NvbG9yOiNmZjI3MzN9LnVpLmNhcmQ+LmV4dHJhLC51aS5jYXJkcz4uY2FyZD4uZXh0cmF7bWF4LXdpZHRoOjEwMCU7bWluLWhlaWdodDowIWltcG9ydGFudDstd2Via2l0LWJveC1mbGV4OjA7LW1zLWZsZXgtcG9zaXRpdmU6MDtmbGV4LWdyb3c6MDtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4wNSkhaW1wb3J0YW50O3Bvc2l0aW9uOnN0YXRpYztiYWNrZ3JvdW5kOjAgMDt3aWR0aDphdXRvO21hcmdpbjowIDA7cGFkZGluZzouNzVlbSAxZW07dG9wOjA7bGVmdDowO2NvbG9yOnJnYmEoMCwwLDAsLjQpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkuY2FyZD4uZXh0cmEgYTpub3QoLnVpKSwudWkuY2FyZHM+LmNhcmQ+LmV4dHJhIGE6bm90KC51aSl7Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLmNhcmQ+LmV4dHJhIGE6bm90KC51aSk6aG92ZXIsLnVpLmNhcmRzPi5jYXJkPi5leHRyYSBhOm5vdCgudWkpOmhvdmVye2NvbG9yOiMxZTcwYmZ9LnVpLnJhaXNlZC5jYXJkLC51aS5yYWlzZWQuY2FyZHM+LmNhcmR7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmxpbmsuY2FyZHMgLnJhaXNlZC5jYXJkOmhvdmVyLC51aS5saW5rLnJhaXNlZC5jYXJkOmhvdmVyLC51aS5yYWlzZWQuY2FyZHMgYS5jYXJkOmhvdmVyLGEudWkucmFpc2VkLmNhcmQ6aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMjUpO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4yNSl9LnVpLnJhaXNlZC5jYXJkLC51aS5yYWlzZWQuY2FyZHM+LmNhcmR7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCAjZDRkNGQ1LDAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmNlbnRlcmVkLmNhcmRzey13ZWJraXQtYm94LXBhY2s6Y2VudGVyOy1tcy1mbGV4LXBhY2s6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9LnVpLmNlbnRlcmVkLmNhcmR7bWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0b30udWkuZmx1aWQuY2FyZHt3aWR0aDoxMDAlO21heC13aWR0aDo5OTk5cHh9LnVpLmNhcmRzIGEuY2FyZCwudWkubGluay5jYXJkLC51aS5saW5rLmNhcmRzIC5jYXJkLGEudWkuY2FyZHstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfS51aS5jYXJkcyBhLmNhcmQ6aG92ZXIsLnVpLmxpbmsuY2FyZDpob3ZlciwudWkubGluay5jYXJkcyAuY2FyZDpob3ZlcixhLnVpLmNhcmQ6aG92ZXJ7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDo1O2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggM3B4IDAgI2JjYmRiZCwwIDAgMCAxcHggI2Q0ZDRkNTtib3gtc2hhZG93OjAgMXB4IDNweCAwICNiY2JkYmQsMCAwIDAgMXB4ICNkNGQ0ZDU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtM3B4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtM3B4KX0udWkuY2FyZHM+LnJlZC5jYXJkLC51aS5yZWQuY2FyZCwudWkucmVkLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2RiMjgyOCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNkYjI4MjgsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LnJlZC5jYXJkOmhvdmVyLC51aS5yZWQuY2FyZDpob3ZlciwudWkucmVkLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2QwMTkxOSwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNkMDE5MTksMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+Lm9yYW5nZS5jYXJkLC51aS5vcmFuZ2UuY2FyZCwudWkub3JhbmdlLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2YyNzExYywwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNmMjcxMWMsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+Lm9yYW5nZS5jYXJkOmhvdmVyLC51aS5vcmFuZ2UuY2FyZDpob3ZlciwudWkub3JhbmdlLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2YyNjIwMiwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNmMjYyMDIsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LnllbGxvdy5jYXJkLC51aS55ZWxsb3cuY2FyZCwudWkueWVsbG93LmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2ZiYmQwOCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNmYmJkMDgsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LnllbGxvdy5jYXJkOmhvdmVyLC51aS55ZWxsb3cuY2FyZDpob3ZlciwudWkueWVsbG93LmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2VhYWUwMCwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNlYWFlMDAsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+Lm9saXZlLmNhcmQsLnVpLm9saXZlLmNhcmQsLnVpLm9saXZlLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2I1Y2MxOCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNiNWNjMTgsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+Lm9saXZlLmNhcmQ6aG92ZXIsLnVpLm9saXZlLmNhcmQ6aG92ZXIsLnVpLm9saXZlLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2E3YmQwZCwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNhN2JkMGQsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LmdyZWVuLmNhcmQsLnVpLmdyZWVuLmNhcmQsLnVpLmdyZWVuLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzIxYmE0NSwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMyMWJhNDUsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LmdyZWVuLmNhcmQ6aG92ZXIsLnVpLmdyZWVuLmNhcmQ6aG92ZXIsLnVpLmdyZWVuLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzE2YWIzOSwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMxNmFiMzksMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LnRlYWwuY2FyZCwudWkudGVhbC5jYXJkLC51aS50ZWFsLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzAwYjVhZCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMwMGI1YWQsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LnRlYWwuY2FyZDpob3ZlciwudWkudGVhbC5jYXJkOmhvdmVyLC51aS50ZWFsLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzAwOWM5NSwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMwMDljOTUsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuYmx1ZS5jYXJkLC51aS5ibHVlLmNhcmRzPi5jYXJkLC51aS5jYXJkcz4uYmx1ZS5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzIxODVkMCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMyMTg1ZDAsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuYmx1ZS5jYXJkOmhvdmVyLC51aS5ibHVlLmNhcmRzPi5jYXJkOmhvdmVyLC51aS5jYXJkcz4uYmx1ZS5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzE2NzhjMiwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMxNjc4YzIsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LnZpb2xldC5jYXJkLC51aS52aW9sZXQuY2FyZCwudWkudmlvbGV0LmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzY0MzVjOSwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM2NDM1YzksMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LnZpb2xldC5jYXJkOmhvdmVyLC51aS52aW9sZXQuY2FyZDpob3ZlciwudWkudmlvbGV0LmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzU4MjliYiwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM1ODI5YmIsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LnB1cnBsZS5jYXJkLC51aS5wdXJwbGUuY2FyZCwudWkucHVycGxlLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2EzMzNjOCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNhMzMzYzgsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LnB1cnBsZS5jYXJkOmhvdmVyLC51aS5wdXJwbGUuY2FyZDpob3ZlciwudWkucHVycGxlLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzk2MjdiYSwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM5NjI3YmEsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LnBpbmsuY2FyZCwudWkucGluay5jYXJkLC51aS5waW5rLmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2UwMzk5NywwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNlMDM5OTcsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LnBpbmsuY2FyZDpob3ZlciwudWkucGluay5jYXJkOmhvdmVyLC51aS5waW5rLmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2U2MWE4ZCwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNlNjFhOGQsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuYnJvd24uY2FyZCwudWkuYnJvd24uY2FyZHM+LmNhcmQsLnVpLmNhcmRzPi5icm93bi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgI2E1NjczZiwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICNhNTY3M2YsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuYnJvd24uY2FyZDpob3ZlciwudWkuYnJvd24uY2FyZHM+LmNhcmQ6aG92ZXIsLnVpLmNhcmRzPi5icm93bi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzk3NWIzMywwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM5NzViMzMsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuY2FyZHM+LmdyZXkuY2FyZCwudWkuZ3JleS5jYXJkLC51aS5ncmV5LmNhcmRzPi5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzc2NzY3NiwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM3Njc2NzYsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuY2FyZHM+LmdyZXkuY2FyZDpob3ZlciwudWkuZ3JleS5jYXJkOmhvdmVyLC51aS5ncmV5LmNhcmRzPi5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzgzODM4MywwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICM4MzgzODMsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkuYmxhY2suY2FyZCwudWkuYmxhY2suY2FyZHM+LmNhcmQsLnVpLmNhcmRzPi5ibGFjay5jYXJkey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzFiMWMxZCwwIDFweCAzcHggMCAjZDRkNGQ1O2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMxYjFjMWQsMCAxcHggM3B4IDAgI2Q0ZDRkNX0udWkuYmxhY2suY2FyZDpob3ZlciwudWkuYmxhY2suY2FyZHM+LmNhcmQ6aG92ZXIsLnVpLmNhcmRzPi5ibGFjay5jYXJkOmhvdmVyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggI2Q0ZDRkNSwwIDJweCAwIDAgIzI3MjkyYSwwIDFweCAzcHggMCAjYmNiZGJkO2JveC1zaGFkb3c6MCAwIDAgMXB4ICNkNGQ0ZDUsMCAycHggMCAwICMyNzI5MmEsMCAxcHggM3B4IDAgI2JjYmRiZH0udWkub25lLmNhcmRze21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjB9LnVpLm9uZS5jYXJkcz4uY2FyZHt3aWR0aDoxMDAlfS51aS50d28uY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkudHdvLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoNTAlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkudGhyZWUuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkudGhyZWUuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygzMy4zMzMzMzMzMyUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5mb3VyLmNhcmRze21hcmdpbi1sZWZ0Oi0uNzVlbTttYXJnaW4tcmlnaHQ6LS43NWVtfS51aS5mb3VyLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMjUlIC0gMS41ZW0pO21hcmdpbi1sZWZ0Oi43NWVtO21hcmdpbi1yaWdodDouNzVlbX0udWkuZml2ZS5jYXJkc3ttYXJnaW4tbGVmdDotLjc1ZW07bWFyZ2luLXJpZ2h0Oi0uNzVlbX0udWkuZml2ZS5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDIwJSAtIDEuNWVtKTttYXJnaW4tbGVmdDouNzVlbTttYXJnaW4tcmlnaHQ6Ljc1ZW19LnVpLnNpeC5jYXJkc3ttYXJnaW4tbGVmdDotLjc1ZW07bWFyZ2luLXJpZ2h0Oi0uNzVlbX0udWkuc2l4LmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMTYuNjY2NjY2NjclIC0gMS41ZW0pO21hcmdpbi1sZWZ0Oi43NWVtO21hcmdpbi1yaWdodDouNzVlbX0udWkuc2V2ZW4uY2FyZHN7bWFyZ2luLWxlZnQ6LS41ZW07bWFyZ2luLXJpZ2h0Oi0uNWVtfS51aS5zZXZlbi5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDE0LjI4NTcxNDI5JSAtIDFlbSk7bWFyZ2luLWxlZnQ6LjVlbTttYXJnaW4tcmlnaHQ6LjVlbX0udWkuZWlnaHQuY2FyZHN7bWFyZ2luLWxlZnQ6LS41ZW07bWFyZ2luLXJpZ2h0Oi0uNWVtfS51aS5laWdodC5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDEyLjUlIC0gMWVtKTttYXJnaW4tbGVmdDouNWVtO21hcmdpbi1yaWdodDouNWVtO2ZvbnQtc2l6ZToxMXB4fS51aS5uaW5lLmNhcmRze21hcmdpbi1sZWZ0Oi0uNWVtO21hcmdpbi1yaWdodDotLjVlbX0udWkubmluZS5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDExLjExMTExMTExJSAtIDFlbSk7bWFyZ2luLWxlZnQ6LjVlbTttYXJnaW4tcmlnaHQ6LjVlbTtmb250LXNpemU6MTBweH0udWkudGVuLmNhcmRze21hcmdpbi1sZWZ0Oi0uNWVtO21hcmdpbi1yaWdodDotLjVlbX0udWkudGVuLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMTAlIC0gMWVtKTttYXJnaW4tbGVmdDouNWVtO21hcmdpbi1yaWdodDouNWVtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnR3by5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS51aS50d28uZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6MTAwJTttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS51aS50aHJlZS5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS50aHJlZS5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDUwJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLmZvdXIuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkuZm91ci5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDUwJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLmZpdmUuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkuZml2ZS5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDUwJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLnNpeC5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS5zaXguZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYyg1MCUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5zZXZlbi5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS5zZXZlbi5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDMzLjMzMzMzMzMzJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19LnVpLmVpZ2h0LmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLmVpZ2h0LmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMzMuMzMzMzMzMzMlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkubmluZS5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotMWVtO21hcmdpbi1yaWdodDotMWVtfS51aS5uaW5lLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMzMuMzMzMzMzMzMlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkudGVuLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLnRlbi5kb3VibGluZy5jYXJkcz4uY2FyZHt3aWR0aDpjYWxjKDMzLjMzMzMzMzMzJSAtIDJlbSk7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDoxZW19fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCkgYW5kIChtYXgtd2lkdGg6OTkxcHgpey51aS50d28uZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0udWkudHdvLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOjEwMCU7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0udWkudGhyZWUuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkudGhyZWUuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYyg1MCUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5mb3VyLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLmZvdXIuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYyg1MCUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5maXZlLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0xZW07bWFyZ2luLXJpZ2h0Oi0xZW19LnVpLmZpdmUuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygzMy4zMzMzMzMzMyUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5zaXguZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkuc2l4LmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMzMuMzMzMzMzMzMlIC0gMmVtKTttYXJnaW4tbGVmdDoxZW07bWFyZ2luLXJpZ2h0OjFlbX0udWkuZWlnaHQuZG91YmxpbmcuY2FyZHN7bWFyZ2luLWxlZnQ6LTFlbTttYXJnaW4tcmlnaHQ6LTFlbX0udWkuZWlnaHQuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygzMy4zMzMzMzMzMyUgLSAyZW0pO21hcmdpbi1sZWZ0OjFlbTttYXJnaW4tcmlnaHQ6MWVtfS51aS5laWdodC5kb3VibGluZy5jYXJkc3ttYXJnaW4tbGVmdDotLjc1ZW07bWFyZ2luLXJpZ2h0Oi0uNzVlbX0udWkuZWlnaHQuZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygyNSUgLSAxLjVlbSk7bWFyZ2luLWxlZnQ6Ljc1ZW07bWFyZ2luLXJpZ2h0Oi43NWVtfS51aS5uaW5lLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0uNzVlbTttYXJnaW4tcmlnaHQ6LS43NWVtfS51aS5uaW5lLmRvdWJsaW5nLmNhcmRzPi5jYXJke3dpZHRoOmNhbGMoMjUlIC0gMS41ZW0pO21hcmdpbi1sZWZ0Oi43NWVtO21hcmdpbi1yaWdodDouNzVlbX0udWkudGVuLmRvdWJsaW5nLmNhcmRze21hcmdpbi1sZWZ0Oi0uNzVlbTttYXJnaW4tcmlnaHQ6LS43NWVtfS51aS50ZW4uZG91YmxpbmcuY2FyZHM+LmNhcmR7d2lkdGg6Y2FsYygyMCUgLSAxLjVlbSk7bWFyZ2luLWxlZnQ6Ljc1ZW07bWFyZ2luLXJpZ2h0Oi43NWVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5zdGFja2FibGUuY2FyZHN7ZGlzcGxheTpibG9jayFpbXBvcnRhbnR9LnVpLnN0YWNrYWJsZS5jYXJkcyAuY2FyZDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjAhaW1wb3J0YW50fS51aS5zdGFja2FibGUuY2FyZHM+LmNhcmR7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8haW1wb3J0YW50O21hcmdpbjoxZW0gMWVtO3BhZGRpbmc6MCFpbXBvcnRhbnQ7d2lkdGg6Y2FsYygxMDAlIC0gMmVtKSFpbXBvcnRhbnR9fS51aS5jYXJkcz4uY2FyZHtmb250LXNpemU6MWVtfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBDb21tZW50XFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuY29tbWVudHN7bWFyZ2luOjEuNWVtIDA7bWF4LXdpZHRoOjY1MHB4fS51aS5jb21tZW50czpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLmNvbW1lbnRzOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5jb21tZW50cyAuY29tbWVudHtwb3NpdGlvbjpyZWxhdGl2ZTtiYWNrZ3JvdW5kOjAgMDttYXJnaW46LjVlbSAwIDA7cGFkZGluZzouNWVtIDAgMDtib3JkZXI6bm9uZTtib3JkZXItdG9wOm5vbmU7bGluZS1oZWlnaHQ6MS4yfS51aS5jb21tZW50cyAuY29tbWVudDpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjA7cGFkZGluZy10b3A6MH0udWkuY29tbWVudHMgLmNvbW1lbnQgLmNvbW1lbnRze21hcmdpbjowIDAgLjVlbSAuNWVtO3BhZGRpbmc6MWVtIDAgMWVtIDFlbX0udWkuY29tbWVudHMgLmNvbW1lbnQgLmNvbW1lbnRzOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5jb21tZW50cyAuY29tbWVudHtib3JkZXI6bm9uZTtib3JkZXItdG9wOm5vbmU7YmFja2dyb3VuZDowIDB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5hdmF0YXJ7ZGlzcGxheTpibG9jazt3aWR0aDoyLjVlbTtoZWlnaHQ6YXV0bztmbG9hdDpsZWZ0O21hcmdpbjouMmVtIDAgMH0udWkuY29tbWVudHMgLmNvbW1lbnQgLmF2YXRhciBpbWcsLnVpLmNvbW1lbnRzIC5jb21tZW50IGltZy5hdmF0YXJ7ZGlzcGxheTpibG9jazttYXJnaW46MCBhdXRvO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyLXJhZGl1czouMjVyZW19LnVpLmNvbW1lbnRzIC5jb21tZW50Pi5jb250ZW50e2Rpc3BsYXk6YmxvY2t9LnVpLmNvbW1lbnRzIC5jb21tZW50Pi5hdmF0YXJ+LmNvbnRlbnR7bWFyZ2luLWxlZnQ6My41ZW19LnVpLmNvbW1lbnRzIC5jb21tZW50IC5hdXRob3J7Zm9udC1zaXplOjFlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7Zm9udC13ZWlnaHQ6NzAwfS51aS5jb21tZW50cyAuY29tbWVudCBhLmF1dGhvcntjdXJzb3I6cG9pbnRlcn0udWkuY29tbWVudHMgLmNvbW1lbnQgYS5hdXRob3I6aG92ZXJ7Y29sb3I6IzFlNzBiZn0udWkuY29tbWVudHMgLmNvbW1lbnQgLm1ldGFkYXRhe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1sZWZ0Oi41ZW07Y29sb3I6cmdiYSgwLDAsMCwuNCk7Zm9udC1zaXplOi44NzVlbX0udWkuY29tbWVudHMgLmNvbW1lbnQgLm1ldGFkYXRhPip7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgLjVlbSAwIDB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5tZXRhZGF0YT46bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udWkuY29tbWVudHMgLmNvbW1lbnQgLnRleHR7bWFyZ2luOi4yNWVtIDAgLjVlbTtmb250LXNpemU6MWVtO3dvcmQtd3JhcDpicmVhay13b3JkO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtsaW5lLWhlaWdodDoxLjN9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5hY3Rpb25ze2ZvbnQtc2l6ZTouODc1ZW19LnVpLmNvbW1lbnRzIC5jb21tZW50IC5hY3Rpb25zIGF7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luOjAgLjc1ZW0gMCAwO2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5jb21tZW50cyAuY29tbWVudCAuYWN0aW9ucyBhOmxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LnVpLmNvbW1lbnRzIC5jb21tZW50IC5hY3Rpb25zIGEuYWN0aXZlLC51aS5jb21tZW50cyAuY29tbWVudCAuYWN0aW9ucyBhOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjgpfS51aS5jb21tZW50cz4ucmVwbHkuZm9ybXttYXJnaW4tdG9wOjFlbX0udWkuY29tbWVudHMgLmNvbW1lbnQgLnJlcGx5LmZvcm17d2lkdGg6MTAwJTttYXJnaW4tdG9wOjFlbX0udWkuY29tbWVudHMgLnJlcGx5LmZvcm0gdGV4dGFyZWF7Zm9udC1zaXplOjFlbTtoZWlnaHQ6MTJlbX0udWkuY29sbGFwc2VkLmNvbW1lbnRzLC51aS5jb21tZW50cyAuY29sbGFwc2VkLmNvbW1lbnQsLnVpLmNvbW1lbnRzIC5jb2xsYXBzZWQuY29tbWVudHN7ZGlzcGxheTpub25lfS51aS50aHJlYWRlZC5jb21tZW50cyAuY29tbWVudCAuY29tbWVudHN7bWFyZ2luOi0xLjVlbSAwIC0xZW0gMS4yNWVtO3BhZGRpbmc6M2VtIDAgMmVtIDIuMjVlbTstd2Via2l0LWJveC1zaGFkb3c6LTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6LTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5taW5pbWFsLmNvbW1lbnRzIC5jb21tZW50IC5hY3Rpb25ze29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtyaWdodDowO2xlZnQ6YXV0bzstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMnMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjJzIGVhc2U7LXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5Oi4xczt0cmFuc2l0aW9uLWRlbGF5Oi4xc30udWkubWluaW1hbC5jb21tZW50cyAuY29tbWVudD4uY29udGVudDpob3Zlcj4uYWN0aW9uc3tvcGFjaXR5OjF9LnVpLm1pbmkuY29tbWVudHN7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5jb21tZW50c3tmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5jb21tZW50c3tmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5jb21tZW50c3tmb250LXNpemU6MXJlbX0udWkubGFyZ2UuY29tbWVudHN7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmJpZy5jb21tZW50c3tmb250LXNpemU6MS4yODU3MTQyOXJlbX0udWkuaHVnZS5jb21tZW50c3tmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5jb21tZW50c3tmb250LXNpemU6MS43MTQyODU3MXJlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gRmVlZFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmZlZWR7bWFyZ2luOjFlbSAwfS51aS5mZWVkOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuZmVlZDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuZmVlZD4uZXZlbnR7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDstd2Via2l0LWJveC1vcmllbnQ6aG9yaXpvbnRhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93O3dpZHRoOjEwMCU7cGFkZGluZzouMjE0Mjg1NzFyZW0gMDttYXJnaW46MDtiYWNrZ3JvdW5kOjAgMDtib3JkZXItdG9wOm5vbmV9LnVpLmZlZWQ+LmV2ZW50OmZpcnN0LWNoaWxke2JvcmRlci10b3A6MDtwYWRkaW5nLXRvcDowfS51aS5mZWVkPi5ldmVudDpsYXN0LWNoaWxke3BhZGRpbmctYm90dG9tOjB9LnVpLmZlZWQ+LmV2ZW50Pi5sYWJlbHtkaXNwbGF5OmJsb2NrOy13ZWJraXQtYm94LWZsZXg6MDstbXMtZmxleDowIDAgYXV0bztmbGV4OjAgMCBhdXRvO3dpZHRoOjIuNWVtO2hlaWdodDphdXRvOy1tcy1mbGV4LWl0ZW0tYWxpZ246c3RyZXRjaDthbGlnbi1zZWxmOnN0cmV0Y2g7dGV4dC1hbGlnbjpsZWZ0fS51aS5mZWVkPi5ldmVudD4ubGFiZWwgLmljb257b3BhY2l0eToxO2ZvbnQtc2l6ZToxLjVlbTt3aWR0aDoxMDAlO3BhZGRpbmc6LjI1ZW07YmFja2dyb3VuZDowIDA7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czpub25lO2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5mZWVkPi5ldmVudD4ubGFiZWwgaW1ne3dpZHRoOjEwMCU7aGVpZ2h0OmF1dG87Ym9yZGVyLXJhZGl1czo1MDByZW19LnVpLmZlZWQ+LmV2ZW50Pi5sYWJlbCsuY29udGVudHttYXJnaW46LjVlbSAwIC4zNTcxNDI4NmVtIDEuMTQyODU3MTRlbX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnR7ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MSAxIGF1dG87ZmxleDoxIDEgYXV0bzstbXMtZmxleC1pdGVtLWFsaWduOnN0cmV0Y2g7YWxpZ24tc2VsZjpzdHJldGNoO3RleHQtYWxpZ246bGVmdDt3b3JkLXdyYXA6YnJlYWstd29yZH0udWkuZmVlZD4uZXZlbnQ6bGFzdC1jaGlsZD4uY29udGVudHtwYWRkaW5nLWJvdHRvbTowfS51aS5mZWVkPi5ldmVudD4uY29udGVudCBhe2N1cnNvcjpwb2ludGVyfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAuZGF0ZXttYXJnaW46LS41cmVtIDAgMDtwYWRkaW5nOjA7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxZW07Zm9udC1zdHlsZTpub3JtYWw7Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5zdW1tYXJ5e21hcmdpbjowO2ZvbnQtc2l6ZToxZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLnN1bW1hcnkgaW1ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOmF1dG87aGVpZ2h0OjEwZW07bWFyZ2luOi0uMjVlbSAuMjVlbSAwIDA7Ym9yZGVyLXJhZGl1czouMjVlbTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC51c2Vye2Rpc3BsYXk6aW5saW5lLWJsb2NrO2ZvbnQtd2VpZ2h0OjcwMDttYXJnaW4tcmlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLnVzZXIgaW1ne21hcmdpbjotLjI1ZW0gLjI1ZW0gMCAwO3dpZHRoOmF1dG87aGVpZ2h0OjEwZW07dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAuc3VtbWFyeT4uZGF0ZXtkaXNwbGF5OmlubGluZS1ibG9jaztmbG9hdDpub25lO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6Ljg1NzE0Mjg2ZW07Zm9udC1zdHlsZTpub3JtYWw7bWFyZ2luOjAgMCAwIC41ZW07cGFkZGluZzowO2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAuZXh0cmF7bWFyZ2luOi41ZW0gMCAwO2JhY2tncm91bmQ6MCAwO3BhZGRpbmc6MDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5leHRyYS5pbWFnZXMgaW1ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjowIC4yNWVtIDAgMDt3aWR0aDo2ZW19LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5leHRyYS50ZXh0e3BhZGRpbmc6MDtib3JkZXItbGVmdDpub25lO2ZvbnQtc2l6ZToxZW07bWF4LXdpZHRoOjUwMHB4O2xpbmUtaGVpZ2h0OjEuNDI4NWVtfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YXtkaXNwbGF5OmlubGluZS1ibG9jaztmb250LXNpemU6Ljg1NzE0Mjg2ZW07bWFyZ2luOi41ZW0gMCAwO2JhY2tncm91bmQ6MCAwO2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmU7cGFkZGluZzowO2NvbG9yOnJnYmEoMCwwLDAsLjYpfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YT4qe3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi1sZWZ0Oi43NWVtfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YT46YWZ0ZXJ7Y29udGVudDonJztjb2xvcjpyZ2JhKDAsMCwwLC4yKTt0b3A6MDtsZWZ0Oi0xZW07b3BhY2l0eToxO3Bvc2l0aW9uOmFic29sdXRlO3ZlcnRpY2FsLWFsaWduOnRvcH0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGEgLmxpa2V7Y29sb3I6Jyc7LXdlYmtpdC10cmFuc2l0aW9uOi4ycyBjb2xvciBlYXNlO3RyYW5zaXRpb246LjJzIGNvbG9yIGVhc2V9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhIC5saWtlOmhvdmVyIC5pY29ue2NvbG9yOiNmZjI3MzN9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhIC5hY3RpdmUubGlrZSAuaWNvbntjb2xvcjojZWY0MDRhfS51aS5mZWVkPi5ldmVudD4uY29udGVudCAubWV0YT46Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MH0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGE+OmZpcnN0LWNoaWxkOjphZnRlcntkaXNwbGF5Om5vbmV9LnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhIGEsLnVpLmZlZWQ+LmV2ZW50Pi5jb250ZW50IC5tZXRhPi5pY29ue2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MTtjb2xvcjpyZ2JhKDAsMCwwLC41KTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGEgYTpob3ZlciwudWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGEgYTpob3ZlciAuaWNvbiwudWkuZmVlZD4uZXZlbnQ+LmNvbnRlbnQgLm1ldGE+Lmljb246aG92ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5zbWFsbC5mZWVke2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLmZlZWR7Zm9udC1zaXplOjFyZW19LnVpLmxhcmdlLmZlZWR7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIEl0ZW1cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5pdGVtcz4uaXRlbXtkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4O21hcmdpbjoxZW0gMDt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MDtiYWNrZ3JvdW5kOjAgMDtwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czowOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3otaW5kZXg6Jyd9LnVpLml0ZW1zPi5pdGVtIGF7Y3Vyc29yOnBvaW50ZXJ9LnVpLml0ZW1ze21hcmdpbjoxLjVlbSAwfS51aS5pdGVtczpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjAhaW1wb3J0YW50fS51aS5pdGVtczpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MCFpbXBvcnRhbnR9LnVpLml0ZW1zPi5pdGVtOmFmdGVye2Rpc3BsYXk6YmxvY2s7Y29udGVudDonICc7aGVpZ2h0OjA7Y2xlYXI6Ym90aDtvdmVyZmxvdzpoaWRkZW47dmlzaWJpbGl0eTpoaWRkZW59LnVpLml0ZW1zPi5pdGVtOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0udWkuaXRlbXM+Lml0ZW06bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOjB9LnVpLml0ZW1zPi5pdGVtPi5pbWFnZXtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LWJveC1mbGV4OjA7LW1zLWZsZXg6MCAwIGF1dG87ZmxleDowIDAgYXV0bztkaXNwbGF5OmJsb2NrO2Zsb2F0Om5vbmU7bWFyZ2luOjA7cGFkZGluZzowO21heC1oZWlnaHQ6Jyc7LW1zLWZsZXgtaXRlbS1hbGlnbjp0b3A7YWxpZ24tc2VsZjp0b3B9LnVpLml0ZW1zPi5pdGVtPi5pbWFnZT5pbWd7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2hlaWdodDphdXRvO2JvcmRlci1yYWRpdXM6LjEyNXJlbTtib3JkZXI6bm9uZX0udWkuaXRlbXM+Lml0ZW0+LmltYWdlOm9ubHktY2hpbGQ+aW1ne2JvcmRlci1yYWRpdXM6MH0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnR7ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MSAxIGF1dG87ZmxleDoxIDEgYXV0bztiYWNrZ3JvdW5kOjAgMDttYXJnaW46MDtwYWRkaW5nOjA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lO2ZvbnQtc2l6ZToxZW07Ym9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czowfS51aS5pdGVtcz4uaXRlbT4uY29udGVudDphZnRlcntkaXNwbGF5OmJsb2NrO2NvbnRlbnQ6JyAnO2hlaWdodDowO2NsZWFyOmJvdGg7b3ZlcmZsb3c6aGlkZGVuO3Zpc2liaWxpdHk6aGlkZGVufS51aS5pdGVtcz4uaXRlbT4uaW1hZ2UrLmNvbnRlbnR7bWluLXdpZHRoOjA7d2lkdGg6YXV0bztkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OjA7LW1zLWZsZXgtaXRlbS1hbGlnbjp0b3A7YWxpZ24tc2VsZjp0b3A7cGFkZGluZy1sZWZ0OjEuNWVtfS51aS5pdGVtcz4uaXRlbT4uY29udGVudD4uaGVhZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjotLjIxNDI1ZW0gMCAwO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5pdGVtcz4uaXRlbT4uY29udGVudD4uaGVhZGVyOm5vdCgudWkpe2ZvbnQtc2l6ZToxLjI4NTcxNDI5ZW19LnVpLml0ZW1zPi5pdGVtIFtjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJde2Zsb2F0OmxlZnR9LnVpLml0ZW1zPi5pdGVtIFtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXXtmbG9hdDpyaWdodH0udWkuaXRlbXM+Lml0ZW0gLmNvbnRlbnQgaW1ney1tcy1mbGV4LWl0ZW0tYWxpZ246bWlkZGxlO2FsaWduLXNlbGY6bWlkZGxlO3dpZHRoOicnfS51aS5pdGVtcz4uaXRlbSAuYXZhdGFyIGltZywudWkuaXRlbXM+Lml0ZW0gaW1nLmF2YXRhcnt3aWR0aDonJztoZWlnaHQ6Jyc7Ym9yZGVyLXJhZGl1czo1MDByZW19LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50Pi5kZXNjcmlwdGlvbnttYXJnaW4tdG9wOi42ZW07bWF4LXdpZHRoOmF1dG87Zm9udC1zaXplOjFlbTtsaW5lLWhlaWdodDoxLjQyODVlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IHB7bWFyZ2luOjAgMCAuNWVtfS51aS5pdGVtcz4uaXRlbT4uY29udGVudCBwOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfS51aS5pdGVtcz4uaXRlbSAubWV0YXttYXJnaW46LjVlbSAwIC41ZW07Zm9udC1zaXplOjFlbTtsaW5lLWhlaWdodDoxZW07Y29sb3I6cmdiYSgwLDAsMCwuNil9LnVpLml0ZW1zPi5pdGVtIC5tZXRhICp7bWFyZ2luLXJpZ2h0Oi4zZW19LnVpLml0ZW1zPi5pdGVtIC5tZXRhIDpsYXN0LWNoaWxke21hcmdpbi1yaWdodDowfS51aS5pdGVtcz4uaXRlbSAubWV0YSBbY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl17bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6LjNlbX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgYTpub3QoLnVpKXtjb2xvcjonJzstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgYTpub3QoLnVpKTpob3Zlcntjb2xvcjonJ30udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQ+YS5oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5pdGVtcz4uaXRlbT4uY29udGVudD5hLmhlYWRlcjpob3Zlcntjb2xvcjojMWU3MGJmfS51aS5pdGVtcz4uaXRlbSAubWV0YT5hOm5vdCgudWkpe2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5pdGVtcz4uaXRlbSAubWV0YT5hOm5vdCgudWkpOmhvdmVye2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgLmZhdm9yaXRlLmljb257Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNzU7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLml0ZW1zPi5pdGVtPi5jb250ZW50IC5mYXZvcml0ZS5pY29uOmhvdmVye29wYWNpdHk6MTtjb2xvcjojZmZiNzBhfS51aS5pdGVtcz4uaXRlbT4uY29udGVudCAuYWN0aXZlLmZhdm9yaXRlLmljb257Y29sb3I6I2ZmZTYyM30udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgLmxpa2UuaWNvbntjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi43NTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZX0udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgLmxpa2UuaWNvbjpob3ZlcntvcGFjaXR5OjE7Y29sb3I6I2ZmMjczM30udWkuaXRlbXM+Lml0ZW0+LmNvbnRlbnQgLmFjdGl2ZS5saWtlLmljb257Y29sb3I6I2ZmMjczM30udWkuaXRlbXM+Lml0ZW0gLmV4dHJhe2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZDowIDA7bWFyZ2luOi41cmVtIDAgMDt3aWR0aDoxMDAlO3BhZGRpbmc6MCAwIDA7dG9wOjA7bGVmdDowO2NvbG9yOnJnYmEoMCwwLDAsLjQpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZTtib3JkZXItdG9wOm5vbmV9LnVpLml0ZW1zPi5pdGVtIC5leHRyYT4qe21hcmdpbjouMjVyZW0gLjVyZW0gLjI1cmVtIDB9LnVpLml0ZW1zPi5pdGVtIC5leHRyYT5bY2xhc3MqPVxcXCJyaWdodCBmbG9hdGVkXFxcIl17bWFyZ2luOi4yNXJlbSAwIC4yNXJlbSAuNXJlbX0udWkuaXRlbXM+Lml0ZW0gLmV4dHJhOmFmdGVye2Rpc3BsYXk6YmxvY2s7Y29udGVudDonICc7aGVpZ2h0OjA7Y2xlYXI6Ym90aDtvdmVyZmxvdzpoaWRkZW47dmlzaWJpbGl0eTpoaWRkZW59LnVpLml0ZW1zPi5pdGVtPi5pbWFnZTpub3QoLnVpKXt3aWR0aDoxNzVweH1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkuaXRlbXM+Lml0ZW17bWFyZ2luOjFlbSAwfS51aS5pdGVtcz4uaXRlbT4uaW1hZ2U6bm90KC51aSl7d2lkdGg6MTUwcHh9LnVpLml0ZW1zPi5pdGVtPi5pbWFnZSsuY29udGVudHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MCAwIDAgMWVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5pdGVtczpub3QoLnVuc3RhY2thYmxlKT4uaXRlbXstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXJnaW46MmVtIDB9LnVpLml0ZW1zOm5vdCgudW5zdGFja2FibGUpPi5pdGVtPi5pbWFnZXtkaXNwbGF5OmJsb2NrO21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OmF1dG99LnVpLml0ZW1zOm5vdCgudW5zdGFja2FibGUpPi5pdGVtPi5pbWFnZSwudWkuaXRlbXM6bm90KC51bnN0YWNrYWJsZSk+Lml0ZW0+LmltYWdlPmltZ3ttYXgtd2lkdGg6MTAwJSFpbXBvcnRhbnQ7d2lkdGg6YXV0byFpbXBvcnRhbnQ7bWF4LWhlaWdodDoyNTBweCFpbXBvcnRhbnR9LnVpLml0ZW1zOm5vdCgudW5zdGFja2FibGUpPi5pdGVtPi5pbWFnZSsuY29udGVudHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MS41ZW0gMCAwfX0udWkuaXRlbXM+Lml0ZW0+LmltYWdlK1tjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uY29udGVudHstbXMtZmxleC1pdGVtLWFsaWduOnN0YXJ0O2FsaWduLXNlbGY6ZmxleC1zdGFydH0udWkuaXRlbXM+Lml0ZW0+LmltYWdlK1tjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl0uY29udGVudHstbXMtZmxleC1pdGVtLWFsaWduOmNlbnRlcjthbGlnbi1zZWxmOmNlbnRlcn0udWkuaXRlbXM+Lml0ZW0+LmltYWdlK1tjbGFzcyo9XFxcImJvdHRvbSBhbGlnbmVkXFxcIl0uY29udGVudHstbXMtZmxleC1pdGVtLWFsaWduOmVuZDthbGlnbi1zZWxmOmZsZXgtZW5kfS51aS5yZWxheGVkLml0ZW1zPi5pdGVte21hcmdpbjoxLjVlbSAwfS51aVtjbGFzcyo9XFxcInZlcnkgcmVsYXhlZFxcXCJdLml0ZW1zPi5pdGVte21hcmdpbjoyZW0gMH0udWkuZGl2aWRlZC5pdGVtcz4uaXRlbXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7bWFyZ2luOjA7cGFkZGluZzoxZW0gMH0udWkuZGl2aWRlZC5pdGVtcz4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wOm5vbmU7bWFyZ2luLXRvcDowIWltcG9ydGFudDtwYWRkaW5nLXRvcDowIWltcG9ydGFudH0udWkuZGl2aWRlZC5pdGVtcz4uaXRlbTpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MCFpbXBvcnRhbnQ7cGFkZGluZy1ib3R0b206MCFpbXBvcnRhbnR9LnVpLnJlbGF4ZWQuZGl2aWRlZC5pdGVtcz4uaXRlbXttYXJnaW46MDtwYWRkaW5nOjEuNWVtIDB9LnVpW2NsYXNzKj1cXFwidmVyeSByZWxheGVkXFxcIl0uZGl2aWRlZC5pdGVtcz4uaXRlbXttYXJnaW46MDtwYWRkaW5nOjJlbSAwfS51aS5pdGVtcyBhLml0ZW06aG92ZXIsLnVpLmxpbmsuaXRlbXM+Lml0ZW06aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9LnVpLml0ZW1zIGEuaXRlbTpob3ZlciAuY29udGVudCAuaGVhZGVyLC51aS5saW5rLml0ZW1zPi5pdGVtOmhvdmVyIC5jb250ZW50IC5oZWFkZXJ7Y29sb3I6IzFlNzBiZn0udWkuaXRlbXM+Lml0ZW17Zm9udC1zaXplOjFlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS51bnN0YWNrYWJsZS5pdGVtcz4uaXRlbT4uaW1hZ2UsLnVpLnVuc3RhY2thYmxlLml0ZW1zPi5pdGVtPi5pbWFnZT5pbWd7d2lkdGg6MTI1cHghaW1wb3J0YW50fX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gU3RhdGlzdGljXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuc3RhdGlzdGlje2Rpc3BsYXk6LXdlYmtpdC1pbmxpbmUtYm94O2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94O2Rpc3BsYXk6aW5saW5lLWZsZXg7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWFyZ2luOjFlbSAwO21heC13aWR0aDphdXRvfS51aS5zdGF0aXN0aWMrLnVpLnN0YXRpc3RpY3ttYXJnaW46MCAwIDAgMS41ZW19LnVpLnN0YXRpc3RpYzpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOjB9LnVpLnN0YXRpc3RpYzpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkuc3RhdGlzdGljc3tkaXNwbGF5Oi13ZWJraXQtYm94O2Rpc3BsYXk6LW1zLWZsZXhib3g7ZGlzcGxheTpmbGV4Oy13ZWJraXQtYm94LWFsaWduOnN0YXJ0Oy1tcy1mbGV4LWFsaWduOnN0YXJ0O2FsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7LW1zLWZsZXgtd3JhcDp3cmFwO2ZsZXgtd3JhcDp3cmFwfS51aS5zdGF0aXN0aWNzPi5zdGF0aXN0aWN7ZGlzcGxheTotd2Via2l0LWlubGluZS1ib3g7ZGlzcGxheTotbXMtaW5saW5lLWZsZXhib3g7ZGlzcGxheTppbmxpbmUtZmxleDstd2Via2l0LWJveC1mbGV4OjA7LW1zLWZsZXg6MCAxIGF1dG87ZmxleDowIDEgYXV0bzstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttYXJnaW46MCAxLjVlbSAxZW07bWF4LXdpZHRoOmF1dG99LnVpLnN0YXRpc3RpY3N7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDttYXJnaW46MWVtIC0xLjVlbSAtMWVtfS51aS5zdGF0aXN0aWNzOmFmdGVye2Rpc3BsYXk6YmxvY2s7Y29udGVudDonICc7aGVpZ2h0OjA7Y2xlYXI6Ym90aDtvdmVyZmxvdzpoaWRkZW47dmlzaWJpbGl0eTpoaWRkZW59LnVpLnN0YXRpc3RpY3M6Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfS51aS5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6NHJlbTtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MWVtO2NvbG9yOiMxYjFjMWQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtYWxpZ246Y2VudGVyfS51aS5zdGF0aXN0aWM+LmxhYmVsLC51aS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LmxhYmVse2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6MWVtO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO3RleHQtYWxpZ246Y2VudGVyfS51aS5zdGF0aXN0aWM+LmxhYmVsfi52YWx1ZSwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi5sYWJlbH4udmFsdWV7bWFyZ2luLXRvcDowfS51aS5zdGF0aXN0aWM+LnZhbHVlfi5sYWJlbCwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZX4ubGFiZWx7bWFyZ2luLXRvcDowfS51aS5zdGF0aXN0aWM+LnZhbHVlIC5pY29uLC51aS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlIC5pY29ue29wYWNpdHk6MTt3aWR0aDphdXRvO21hcmdpbjowfS51aS5zdGF0aXN0aWM+LnRleHQudmFsdWUsLnVpLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udGV4dC52YWx1ZXtsaW5lLWhlaWdodDoxZW07bWluLWhlaWdodDoyZW07Zm9udC13ZWlnaHQ6NzAwO3RleHQtYWxpZ246Y2VudGVyfS51aS5zdGF0aXN0aWM+LnRleHQudmFsdWUrLmxhYmVsLC51aS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWUrLmxhYmVse3RleHQtYWxpZ246Y2VudGVyfS51aS5zdGF0aXN0aWM+LnZhbHVlIGltZywudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSBpbWd7bWF4LWhlaWdodDozcmVtO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS51aS50ZW4uc3RhdGlzdGljc3ttYXJnaW46MCAwIC0xZW19LnVpLnRlbi5zdGF0aXN0aWNzIC5zdGF0aXN0aWN7bWluLXdpZHRoOjEwJTttYXJnaW46MCAwIDFlbX0udWkubmluZS5zdGF0aXN0aWNze21hcmdpbjowIDAgLTFlbX0udWkubmluZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWN7bWluLXdpZHRoOjExLjExMTExMTExJTttYXJnaW46MCAwIDFlbX0udWkuZWlnaHQuc3RhdGlzdGljc3ttYXJnaW46MCAwIC0xZW19LnVpLmVpZ2h0LnN0YXRpc3RpY3MgLnN0YXRpc3RpY3ttaW4td2lkdGg6MTIuNSU7bWFyZ2luOjAgMCAxZW19LnVpLnNldmVuLnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS5zZXZlbi5zdGF0aXN0aWNzIC5zdGF0aXN0aWN7bWluLXdpZHRoOjE0LjI4NTcxNDI5JTttYXJnaW46MCAwIDFlbX0udWkuc2l4LnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS5zaXguc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDoxNi42NjY2NjY2NyU7bWFyZ2luOjAgMCAxZW19LnVpLmZpdmUuc3RhdGlzdGljc3ttYXJnaW46MCAwIC0xZW19LnVpLmZpdmUuc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDoyMCU7bWFyZ2luOjAgMCAxZW19LnVpLmZvdXIuc3RhdGlzdGljc3ttYXJnaW46MCAwIC0xZW19LnVpLmZvdXIuc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDoyNSU7bWFyZ2luOjAgMCAxZW19LnVpLnRocmVlLnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS50aHJlZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWN7bWluLXdpZHRoOjMzLjMzMzMzMzMzJTttYXJnaW46MCAwIDFlbX0udWkudHdvLnN0YXRpc3RpY3N7bWFyZ2luOjAgMCAtMWVtfS51aS50d28uc3RhdGlzdGljcyAuc3RhdGlzdGlje21pbi13aWR0aDo1MCU7bWFyZ2luOjAgMCAxZW19LnVpLm9uZS5zdGF0aXN0aWNze21hcmdpbjowIDAgLTFlbX0udWkub25lLnN0YXRpc3RpY3MgLnN0YXRpc3RpY3ttaW4td2lkdGg6MTAwJTttYXJnaW46MCAwIDFlbX0udWkuaG9yaXpvbnRhbC5zdGF0aXN0aWN7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvdzstd2Via2l0LWJveC1hbGlnbjpjZW50ZXI7LW1zLWZsZXgtYWxpZ246Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcn0udWkuaG9yaXpvbnRhbC5zdGF0aXN0aWNzey13ZWJraXQtYm94LW9yaWVudDp2ZXJ0aWNhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpjb2x1bW47ZmxleC1kaXJlY3Rpb246Y29sdW1uO21hcmdpbjowO21heC13aWR0aDpub25lfS51aS5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpY3std2Via2l0LWJveC1vcmllbnQ6aG9yaXpvbnRhbDstd2Via2l0LWJveC1kaXJlY3Rpb246bm9ybWFsOy1tcy1mbGV4LWRpcmVjdGlvbjpyb3c7ZmxleC1kaXJlY3Rpb246cm93Oy13ZWJraXQtYm94LWFsaWduOmNlbnRlcjstbXMtZmxleC1hbGlnbjpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21heC13aWR0aDpub25lO21hcmdpbjoxZW0gMH0udWkuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnRleHQudmFsdWUsLnVpLmhvcml6b250YWwuc3RhdGlzdGljcz4uc3RhdGlzdGljPi50ZXh0LnZhbHVle21pbi1oZWlnaHQ6MCFpbXBvcnRhbnR9LnVpLmhvcml6b250YWwuc3RhdGlzdGljPi52YWx1ZSAuaWNvbiwudWkuaG9yaXpvbnRhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlIC5pY29ue3dpZHRoOjEuMThlbX0udWkuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnZhbHVlLC51aS5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlfS51aS5ob3Jpem9udGFsLnN0YXRpc3RpYz4ubGFiZWwsLnVpLmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi5sYWJlbHtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luOjAgMCAwIC43NWVtfS51aS5yZWQuc3RhdGlzdGljPi52YWx1ZSwudWkucmVkLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLnJlZC5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNkYjI4Mjh9LnVpLm9yYW5nZS5zdGF0aXN0aWM+LnZhbHVlLC51aS5vcmFuZ2Uuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAub3JhbmdlLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2YyNzExY30udWkuc3RhdGlzdGljcyAueWVsbG93LnN0YXRpc3RpYz4udmFsdWUsLnVpLnllbGxvdy5zdGF0aXN0aWM+LnZhbHVlLC51aS55ZWxsb3cuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZmJiZDA4fS51aS5vbGl2ZS5zdGF0aXN0aWM+LnZhbHVlLC51aS5vbGl2ZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5vbGl2ZS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNiNWNjMTh9LnVpLmdyZWVuLnN0YXRpc3RpYz4udmFsdWUsLnVpLmdyZWVuLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmdyZWVuLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6IzIxYmE0NX0udWkuc3RhdGlzdGljcyAudGVhbC5zdGF0aXN0aWM+LnZhbHVlLC51aS50ZWFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLnRlYWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojMDBiNWFkfS51aS5ibHVlLnN0YXRpc3RpYz4udmFsdWUsLnVpLmJsdWUuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuYmx1ZS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiMyMTg1ZDB9LnVpLnN0YXRpc3RpY3MgLnZpb2xldC5zdGF0aXN0aWM+LnZhbHVlLC51aS52aW9sZXQuc3RhdGlzdGljPi52YWx1ZSwudWkudmlvbGV0LnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6IzY0MzVjOX0udWkucHVycGxlLnN0YXRpc3RpYz4udmFsdWUsLnVpLnB1cnBsZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5wdXJwbGUuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojYTMzM2M4fS51aS5waW5rLnN0YXRpc3RpYz4udmFsdWUsLnVpLnBpbmsuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAucGluay5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNlMDM5OTd9LnVpLmJyb3duLnN0YXRpc3RpYz4udmFsdWUsLnVpLmJyb3duLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmJyb3duLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2E1NjczZn0udWkuZ3JleS5zdGF0aXN0aWM+LnZhbHVlLC51aS5ncmV5LnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmdyZXkuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojNzY3Njc2fS51aS5pbnZlcnRlZC5zdGF0aXN0aWMgLnZhbHVlLC51aS5pbnZlcnRlZC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnN0YXRpc3RpYyAubGFiZWwsLnVpLmludmVydGVkLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4ubGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuOSl9LnVpLmludmVydGVkLnJlZC5zdGF0aXN0aWM+LnZhbHVlLC51aS5pbnZlcnRlZC5yZWQuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQucmVkLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2ZmNjk1ZX0udWkuaW52ZXJ0ZWQub3JhbmdlLnN0YXRpc3RpYz4udmFsdWUsLnVpLmludmVydGVkLm9yYW5nZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5vcmFuZ2Uuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZmY4NTFifS51aS5pbnZlcnRlZC55ZWxsb3cuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQueWVsbG93LnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLnllbGxvdy5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNmZmUyMWZ9LnVpLmludmVydGVkLm9saXZlLnN0YXRpc3RpYz4udmFsdWUsLnVpLmludmVydGVkLm9saXZlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLm9saXZlLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2Q5ZTc3OH0udWkuaW52ZXJ0ZWQuZ3JlZW4uc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQuZ3JlZW4uc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQuZ3JlZW4uc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojMmVjYzQwfS51aS5pbnZlcnRlZC50ZWFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLmludmVydGVkLnRlYWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQudGVhbC5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiM2ZGZmZmZ9LnVpLmludmVydGVkLmJsdWUuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQuYmx1ZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5ibHVlLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6IzU0YzhmZn0udWkuaW52ZXJ0ZWQudmlvbGV0LnN0YXRpc3RpYz4udmFsdWUsLnVpLmludmVydGVkLnZpb2xldC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC52aW9sZXQuc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojYTI5MWZifS51aS5pbnZlcnRlZC5wdXJwbGUuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQucHVycGxlLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLmludmVydGVkLnB1cnBsZS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNkYzczZmZ9LnVpLmludmVydGVkLnBpbmsuc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQucGluay5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zdGF0aXN0aWNzIC5pbnZlcnRlZC5waW5rLnN0YXRpc3RpYz4udmFsdWV7Y29sb3I6I2ZmOGVkZn0udWkuaW52ZXJ0ZWQuYnJvd24uc3RhdGlzdGljPi52YWx1ZSwudWkuaW52ZXJ0ZWQuYnJvd24uc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQuYnJvd24uc3RhdGlzdGljPi52YWx1ZXtjb2xvcjojZDY3YzFjfS51aS5pbnZlcnRlZC5ncmV5LnN0YXRpc3RpYz4udmFsdWUsLnVpLmludmVydGVkLmdyZXkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZSwudWkuc3RhdGlzdGljcyAuaW52ZXJ0ZWQuZ3JleS5zdGF0aXN0aWM+LnZhbHVle2NvbG9yOiNkY2RkZGV9LnVpW2NsYXNzKj1cXFwibGVmdCBmbG9hdGVkXFxcIl0uc3RhdGlzdGlje2Zsb2F0OmxlZnQ7bWFyZ2luOjAgMmVtIDFlbSAwfS51aVtjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXS5zdGF0aXN0aWN7ZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMCAxZW0gMmVtfS51aS5mbG9hdGVkLnN0YXRpc3RpYzpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0udWkubWluaS5zdGF0aXN0aWM+LnZhbHVlLC51aS5taW5pLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjEuNXJlbSFpbXBvcnRhbnR9LnVpLm1pbmkuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnZhbHVlLC51aS5taW5pLmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6MS41cmVtIWltcG9ydGFudH0udWkubWluaS5zdGF0aXN0aWM+LnRleHQudmFsdWUsLnVpLm1pbmkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi50ZXh0LnZhbHVle2ZvbnQtc2l6ZToxcmVtIWltcG9ydGFudH0udWkudGlueS5zdGF0aXN0aWM+LnZhbHVlLC51aS50aW55LnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjJyZW0haW1wb3J0YW50fS51aS50aW55Lmhvcml6b250YWwuc3RhdGlzdGljPi52YWx1ZSwudWkudGlueS5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjJyZW0haW1wb3J0YW50fS51aS50aW55LnN0YXRpc3RpYz4udGV4dC52YWx1ZSwudWkudGlueS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWV7Zm9udC1zaXplOjFyZW0haW1wb3J0YW50fS51aS5zbWFsbC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zbWFsbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZTozcmVtIWltcG9ydGFudH0udWkuc21hbGwuaG9yaXpvbnRhbC5zdGF0aXN0aWM+LnZhbHVlLC51aS5zbWFsbC5ob3Jpem9udGFsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjJyZW0haW1wb3J0YW50fS51aS5zbWFsbC5zdGF0aXN0aWM+LnRleHQudmFsdWUsLnVpLnNtYWxsLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udGV4dC52YWx1ZXtmb250LXNpemU6MXJlbSFpbXBvcnRhbnR9LnVpLnN0YXRpc3RpYz4udmFsdWUsLnVpLnN0YXRpc3RpY3MgLnN0YXRpc3RpYz4udmFsdWV7Zm9udC1zaXplOjRyZW0haW1wb3J0YW50fS51aS5ob3Jpem9udGFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLmhvcml6b250YWwuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6M3JlbSFpbXBvcnRhbnR9LnVpLnN0YXRpc3RpYz4udGV4dC52YWx1ZSwudWkuc3RhdGlzdGljcyAuc3RhdGlzdGljPi50ZXh0LnZhbHVle2ZvbnQtc2l6ZToycmVtIWltcG9ydGFudH0udWkubGFyZ2Uuc3RhdGlzdGljPi52YWx1ZSwudWkubGFyZ2Uuc3RhdGlzdGljcyAuc3RhdGlzdGljPi52YWx1ZXtmb250LXNpemU6NXJlbSFpbXBvcnRhbnR9LnVpLmxhcmdlLmhvcml6b250YWwuc3RhdGlzdGljPi52YWx1ZSwudWkubGFyZ2UuaG9yaXpvbnRhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZTo0cmVtIWltcG9ydGFudH0udWkubGFyZ2Uuc3RhdGlzdGljPi50ZXh0LnZhbHVlLC51aS5sYXJnZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnRleHQudmFsdWV7Zm9udC1zaXplOjIuNXJlbSFpbXBvcnRhbnR9LnVpLmh1Z2Uuc3RhdGlzdGljPi52YWx1ZSwudWkuaHVnZS5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZTo2cmVtIWltcG9ydGFudH0udWkuaHVnZS5ob3Jpem9udGFsLnN0YXRpc3RpYz4udmFsdWUsLnVpLmh1Z2UuaG9yaXpvbnRhbC5zdGF0aXN0aWNzIC5zdGF0aXN0aWM+LnZhbHVle2ZvbnQtc2l6ZTo1cmVtIWltcG9ydGFudH0udWkuaHVnZS5zdGF0aXN0aWM+LnRleHQudmFsdWUsLnVpLmh1Z2Uuc3RhdGlzdGljcyAuc3RhdGlzdGljPi50ZXh0LnZhbHVle2ZvbnQtc2l6ZToyLjVyZW0haW1wb3J0YW50fS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBBY2NvcmRpb25cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5hY2NvcmRpb24sLnVpLmFjY29yZGlvbiAuYWNjb3JkaW9ue21heC13aWR0aDoxMDAlfS51aS5hY2NvcmRpb24gLmFjY29yZGlvbnttYXJnaW46MWVtIDAgMDtwYWRkaW5nOjB9LnVpLmFjY29yZGlvbiAuYWNjb3JkaW9uIC50aXRsZSwudWkuYWNjb3JkaW9uIC50aXRsZXtjdXJzb3I6cG9pbnRlcn0udWkuYWNjb3JkaW9uIC50aXRsZTpub3QoLnVpKXtwYWRkaW5nOi41ZW0gMDtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjFlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmFjY29yZGlvbiAuYWNjb3JkaW9uIC50aXRsZX4uY29udGVudCwudWkuYWNjb3JkaW9uIC50aXRsZX4uY29udGVudHtkaXNwbGF5Om5vbmV9LnVpLmFjY29yZGlvbjpub3QoLnN0eWxlZCkgLmFjY29yZGlvbiAudGl0bGV+LmNvbnRlbnQ6bm90KC51aSksLnVpLmFjY29yZGlvbjpub3QoLnN0eWxlZCkgLnRpdGxlfi5jb250ZW50Om5vdCgudWkpe21hcmdpbjonJztwYWRkaW5nOi41ZW0gMCAxZW19LnVpLmFjY29yZGlvbjpub3QoLnN0eWxlZCkgLnRpdGxlfi5jb250ZW50Om5vdCgudWkpOmxhc3QtY2hpbGR7cGFkZGluZy1ib3R0b206MH0udWkuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlIC5kcm9wZG93bi5pY29uLC51aS5hY2NvcmRpb24gLnRpdGxlIC5kcm9wZG93bi5pY29ue2Rpc3BsYXk6aW5saW5lLWJsb2NrO2Zsb2F0Om5vbmU7b3BhY2l0eToxO3dpZHRoOjEuMjVlbTtoZWlnaHQ6MWVtO21hcmdpbjowIC4yNXJlbSAwIDA7cGFkZGluZzowO2ZvbnQtc2l6ZToxZW07LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfS51aS5hY2NvcmRpb24ubWVudSAuaXRlbSAudGl0bGV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjB9LnVpLmFjY29yZGlvbi5tZW51IC5pdGVtIC50aXRsZT4uZHJvcGRvd24uaWNvbntmbG9hdDpyaWdodDttYXJnaW46LjIxNDI1ZW0gMCAwIDFlbTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9LnVpLmFjY29yZGlvbiAudWkuaGVhZGVyIC5kcm9wZG93bi5pY29ue2ZvbnQtc2l6ZToxZW07bWFyZ2luOjAgLjI1cmVtIDAgMH0udWkuYWNjb3JkaW9uIC5hY2NvcmRpb24gLmFjdGl2ZS50aXRsZSAuZHJvcGRvd24uaWNvbiwudWkuYWNjb3JkaW9uIC5hY3RpdmUudGl0bGUgLmRyb3Bkb3duLmljb257LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDkwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0udWkuYWNjb3JkaW9uLm1lbnUgLml0ZW0gLmFjdGl2ZS50aXRsZT4uZHJvcGRvd24uaWNvbnstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoOTBkZWcpO3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfS51aS5zdHlsZWQuYWNjb3JkaW9ue3dpZHRoOjYwMHB4fS51aS5zdHlsZWQuYWNjb3JkaW9uLC51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb257Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07YmFja2dyb3VuZDojZmZmOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksMCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlLC51aS5zdHlsZWQuYWNjb3JkaW9uIC50aXRsZXttYXJnaW46MDtwYWRkaW5nOi43NWVtIDFlbTtjb2xvcjpyZ2JhKDAsMCwwLC40KTtmb250LXdlaWdodDo3MDA7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZX0udWkuc3R5bGVkLmFjY29yZGlvbiAuYWNjb3JkaW9uIC50aXRsZTpmaXJzdC1jaGlsZCwudWkuc3R5bGVkLmFjY29yZGlvbj4udGl0bGU6Zmlyc3QtY2hpbGR7Ym9yZGVyLXRvcDpub25lfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLmNvbnRlbnQsLnVpLnN0eWxlZC5hY2NvcmRpb24gLmNvbnRlbnR7bWFyZ2luOjA7cGFkZGluZzouNWVtIDFlbSAxLjVlbX0udWkuc3R5bGVkLmFjY29yZGlvbiAuYWNjb3JkaW9uIC5jb250ZW50e3BhZGRpbmc6MDtwYWRkaW5nOi41ZW0gMWVtIDEuNWVtfS51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLmFjdGl2ZS50aXRsZSwudWkuc3R5bGVkLmFjY29yZGlvbiAuYWNjb3JkaW9uIC50aXRsZTpob3ZlciwudWkuc3R5bGVkLmFjY29yZGlvbiAuYWN0aXZlLnRpdGxlLC51aS5zdHlsZWQuYWNjb3JkaW9uIC50aXRsZTpob3ZlcntiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLnN0eWxlZC5hY2NvcmRpb24gLmFjY29yZGlvbiAuYWN0aXZlLnRpdGxlLC51aS5zdHlsZWQuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlOmhvdmVye2JhY2tncm91bmQ6MCAwO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuc3R5bGVkLmFjY29yZGlvbiAuYWN0aXZlLnRpdGxle2JhY2tncm91bmQ6MCAwO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuc3R5bGVkLmFjY29yZGlvbiAuYWNjb3JkaW9uIC5hY3RpdmUudGl0bGV7YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5hY2NvcmRpb24gLmFjY29yZGlvbiAuYWN0aXZlLmNvbnRlbnQsLnVpLmFjY29yZGlvbiAuYWN0aXZlLmNvbnRlbnR7ZGlzcGxheTpibG9ja30udWkuZmx1aWQuYWNjb3JkaW9uLC51aS5mbHVpZC5hY2NvcmRpb24gLmFjY29yZGlvbnt3aWR0aDoxMDAlfS51aS5pbnZlcnRlZC5hY2NvcmRpb24gLnRpdGxlOm5vdCgudWkpe2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjkpfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6QWNjb3JkaW9uO3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi94LWZvbnQtdHRmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LEFBRUFBQUFMQUlBQUF3QXdUMU12TWdnakI1QUFBQUM4QUFBQVlHTnRZWEFQZk9JS0FBQUJIQUFBQUV4bllYTndBQUFBRUFBQUFXZ0FBQUFJWjJ4NVpyeWo2SGdBQUFGd0FBQUF5R2hsWVdULzBJaEhBQUFDT0FBQUFEWm9hR1ZoQXBrQjV3QUFBbkFBQUFBa2FHMTBlQUp1QUJJQUFBS1VBQUFBR0d4dlkyRUFqQUJXQUFBQ3JBQUFBQTV0WVhod0FBZ0FGZ0FBQXJ3QUFBQWdibUZ0WmZDMW4wNEFBQUxjQUFBQlBIQnZjM1FBQXdBQUFBQUVHQUFBQUNBQUF3SUFBWkFBQlFBQUFVd0JaZ0FBQUVjQlRBRm1BQUFBOVFBWkFJUUFBQUFBQUFBQUFBQUFBQUFBQUFBQkVBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFBRHcyZ0hnLytELzRBSGdBQ0FBQUFBQkFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQ0FBQUFBd0FBQUJRQUF3QUJBQUFBRkFBRUFEZ0FBQUFLQUFnQUFnQUNBQUVBSVBEYS8vMy8vd0FBQUFBQUlQRFovLzMvL3dBQi8rTVBLd0FEQUFFQUFBQUFBQUFBQUFBQUFBRUFBZi8vQUE4QUFRQUFBQUFBQUFBQUFBSUFBRGM1QVFBQUFBQUJBQUFBQUFBQUFBQUFBZ0FBTnprQkFBQUFBQUVBQUFBQUFBQUFBQUFDQUFBM09RRUFBQUFBQVFBU0FFa0F0d0Z1QUJNQUFEYzBQd0UyRnpZWEZoMEJGQWNHSndZdkFTWTFFZ2FBQlFnSEJRWUdCUWNJQllBRzJ3Y0dmd2NCQVFjRUNmOElCQWNCQVFkL0JnWUFBQUFBQVFBQUFFa0FwUUZ1QUJNQUFEY1JORGMyTXpJZkFSWVZGQThCQmlNaUp5WTFBQVVHQndnRmdBWUdnQVVJQndZRld3RUFDQVVHQm9BRkNBY0ZnQVlHQlFjQUFBQUJBQUFBQVFBQXFXWWxzMThQUFBVQUN3SUFBQUFBQU0vOW8rNEFBQUFBei8yajdnQUFBQUFBdHdGdUFBQUFDQUFDQUFBQUFBQUFBQUVBQUFIZy8rQUFBQUlBQUFBQUFBQzNBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUdBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQzNBQklBdHdBQUFBQUFBQUFLQUJRQUhnQkNBR1FBQUFBQkFBQUFCZ0FVQUFFQUFBQUFBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRGdDdUFBRUFBQUFBQUFFQURBQUFBQUVBQUFBQUFBSUFEZ0JBQUFFQUFBQUFBQU1BREFBaUFBRUFBQUFBQUFRQURBQk9BQUVBQUFBQUFBVUFGZ0FNQUFFQUFBQUFBQVlBQmdBdUFBRUFBQUFBQUFvQU5BQmFBQU1BQVFRSkFBRUFEQUFBQUFNQUFRUUpBQUlBRGdCQUFBTUFBUVFKQUFNQURBQWlBQU1BQVFRSkFBUUFEQUJPQUFNQUFRUUpBQVVBRmdBTUFBTUFBUVFKQUFZQURBQTBBQU1BQVFRSkFBb0FOQUJhQUhJQVlRQjBBR2tBYmdCbkFGWUFaUUJ5QUhNQWFRQnZBRzRBSUFBeEFDNEFNQUJ5QUdFQWRBQnBBRzRBWjNKaGRHbHVad0J5QUdFQWRBQnBBRzRBWndCU0FHVUFad0IxQUd3QVlRQnlBSElBWVFCMEFHa0FiZ0JuQUVZQWJ3QnVBSFFBSUFCbkFHVUFiZ0JsQUhJQVlRQjBBR1VBWkFBZ0FHSUFlUUFnQUVrQVl3QnZBRTBBYndCdkFHNEFMZ0FEQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSkgZm9ybWF0KCd0cnVldHlwZScpLHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUms5VVZFOEFBQVN3QUFvQUFBQUFCR2dBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkRSa1lnQUFBQTlBQUFBUzBBQUFFdEZwb3Z1RTlUTHpJQUFBSWtBQUFBWUFBQUFHQUlJd2VRWTIxaGNBQUFBb1FBQUFCTUFBQUFUQTk4NGdwbllYTndBQUFDMEFBQUFBZ0FBQUFJQUFBQUVHaGxZV1FBQUFMWUFBQUFOZ0FBQURiLzBJaEhhR2hsWVFBQUF4QUFBQUFrQUFBQUpBS1pBZWRvYlhSNEFBQUROQUFBQUJnQUFBQVlBbTRBRW0xaGVIQUFBQU5NQUFBQUJnQUFBQVlBQmxBQWJtRnRaUUFBQTFRQUFBRThBQUFCUFBDMW4wNXdiM04wQUFBRWtBQUFBQ0FBQUFBZ0FBTUFBQUVBQkFRQUFRRUJCM0poZEdsdVp3QUJBZ0FCQURyNEhBTDRHd1A0R0FRZUNnQVpVLytMaXg0S0FCbFQvNHVMREFlTGEvaVUrSFFGSFFBQUFIa1BIUUFBQUg0UkhRQUFBQWtkQUFBQkpCSUFCd0VCQncwUEVSUVpIbkpoZEdsdVozSmhkR2x1WjNVd2RURjFNakIxUmpCRU9YVkdNRVJCQUFBQ0FZa0FCQUFHQVFFRUJ3b05WcDM4bEE3OGxBNzhsQTc3bEE3NzNaMzNieFdMa0kyUWo0NEk5eFQzRkFXT2o1Q05rSXVRaTQrSmpvZVBpSTJHaTRZSWkvdVVCWXVHaVllSGlJaUhoNG1HaTRhTGhvMklqd2o3RlBjVUJZZU9pWStMa0FnTys5Mkw1aFdMOTVRRmk1Q05rSTZPajQrUGpaQ0xrSXVRaVk2SENQY1UreFFGajRpTmhvdUdpNGFKaDRlSUNQc1UreFFGaUllR2lZYUxob3VIalllUGlJNkpqNHVRQ0E3NGxCVDRsQldMREFvQUFBQUFBd0lBQVpBQUJRQUFBVXdCWmdBQUFFY0JUQUZtQUFBQTlRQVpBSVFBQUFBQUFBQUFBQUFBQUFBQUFBQUJFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQUR3MmdIZy8rRC80QUhnQUNBQUFBQUJBQUFBQUFBQUFBQUFBQUFnQUFBQUFBQUNBQUFBQXdBQUFCUUFBd0FCQUFBQUZBQUVBRGdBQUFBS0FBZ0FBZ0FDQUFFQUlQRGEvLzMvL3dBQUFBQUFJUERaLy8zLy93QUIvK01QS3dBREFBRUFBQUFBQUFBQUFBQUFBQUVBQWYvL0FBOEFBUUFBQUFFQUFEZllPSlpmRHp6MUFBc0NBQUFBQUFEUC9hUHVBQUFBQU0vOW8rNEFBQUFBQUxjQmJnQUFBQWdBQWdBQUFBQUFBQUFCQUFBQjRQL2dBQUFDQUFBQUFBQUF0d0FCQUFBQUFBQUFBQUFBQUFBQUFBQUFCZ0FBQUFBQUFBQUFBQUFBQUFFQUFBQUF0d0FTQUxjQUFBQUFVQUFBQmdBQUFBQUFEZ0N1QUFFQUFBQUFBQUVBREFBQUFBRUFBQUFBQUFJQURnQkFBQUVBQUFBQUFBTUFEQUFpQUFFQUFBQUFBQVFBREFCT0FBRUFBQUFBQUFVQUZnQU1BQUVBQUFBQUFBWUFCZ0F1QUFFQUFBQUFBQW9BTkFCYUFBTUFBUVFKQUFFQURBQUFBQU1BQVFRSkFBSUFEZ0JBQUFNQUFRUUpBQU1BREFBaUFBTUFBUVFKQUFRQURBQk9BQU1BQVFRSkFBVUFGZ0FNQUFNQUFRUUpBQVlBREFBMEFBTUFBUVFKQUFvQU5BQmFBSElBWVFCMEFHa0FiZ0JuQUZZQVpRQnlBSE1BYVFCdkFHNEFJQUF4QUM0QU1BQnlBR0VBZEFCcEFHNEFaM0poZEdsdVp3QnlBR0VBZEFCcEFHNEFad0JTQUdVQVp3QjFBR3dBWVFCeUFISUFZUUIwQUdrQWJnQm5BRVlBYndCdUFIUUFJQUJuQUdVQWJnQmxBSElBWVFCMEFHVUFaQUFnQUdJQWVRQWdBRWtBWXdCdkFFMEFid0J2QUc0QUxnQURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBKSBmb3JtYXQoJ3dvZmYnKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWx9LnVpLmFjY29yZGlvbiAuYWNjb3JkaW9uIC50aXRsZSAuZHJvcGRvd24uaWNvbiwudWkuYWNjb3JkaW9uIC50aXRsZSAuZHJvcGRvd24uaWNvbntmb250LWZhbWlseTpBY2NvcmRpb247bGluZS1oZWlnaHQ6MTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2ZvbnQtd2VpZ2h0OjQwMDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWFsaWduOmNlbnRlcn0udWkuYWNjb3JkaW9uIC5hY2NvcmRpb24gLnRpdGxlIC5kcm9wZG93bi5pY29uOmJlZm9yZSwudWkuYWNjb3JkaW9uIC50aXRsZSAuZHJvcGRvd24uaWNvbjpiZWZvcmV7Y29udGVudDonXFxcXGYwZGEnfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBDaGVja2JveFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmNoZWNrYm94e3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrOy13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47YmFja2ZhY2UtdmlzaWJpbGl0eTpoaWRkZW47b3V0bGluZTowO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO2ZvbnQtc3R5bGU6bm9ybWFsO21pbi1oZWlnaHQ6MTdweDtmb250LXNpemU6MXJlbTtsaW5lLWhlaWdodDoxN3B4O21pbi13aWR0aDoxN3B4fS51aS5jaGVja2JveCBpbnB1dFt0eXBlPWNoZWNrYm94XSwudWkuY2hlY2tib3ggaW5wdXRbdHlwZT1yYWRpb117Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO29wYWNpdHk6MCFpbXBvcnRhbnQ7b3V0bGluZTowO3otaW5kZXg6Mzt3aWR0aDoxN3B4O2hlaWdodDoxN3B4fS51aS5jaGVja2JveCAuYm94LC51aS5jaGVja2JveCBsYWJlbHtjdXJzb3I6YXV0bztwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3BhZGRpbmctbGVmdDoxLjg1NzE0ZW07b3V0bGluZTowO2ZvbnQtc2l6ZToxZW19LnVpLmNoZWNrYm94IC5ib3g6YmVmb3JlLC51aS5jaGVja2JveCBsYWJlbDpiZWZvcmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjE3cHg7aGVpZ2h0OjE3cHg7Y29udGVudDonJztiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLXJhZGl1czouMjE0Mjg1NzFyZW07LXdlYmtpdC10cmFuc2l0aW9uOmJvcmRlciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJvcmRlciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJvcmRlciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlLHRyYW5zZm9ybSAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsdHJhbnNmb3JtIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNX0udWkuY2hlY2tib3ggLmJveDphZnRlciwudWkuY2hlY2tib3ggbGFiZWw6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Zm9udC1zaXplOjE0cHg7dG9wOjA7bGVmdDowO3dpZHRoOjE3cHg7aGVpZ2h0OjE3cHg7dGV4dC1hbGlnbjpjZW50ZXI7b3BhY2l0eTowO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTstd2Via2l0LXRyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym9yZGVyIC4xcyBlYXNlLG9wYWNpdHkgLjFzIGVhc2UsdHJhbnNmb3JtIC4xcyBlYXNlLGJveC1zaGFkb3cgLjFzIGVhc2U7dHJhbnNpdGlvbjpib3JkZXIgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZSx0cmFuc2Zvcm0gLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuMXMgZWFzZSwtd2Via2l0LWJveC1zaGFkb3cgLjFzIGVhc2V9LnVpLmNoZWNrYm94IGxhYmVsLC51aS5jaGVja2JveCtsYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2V9LnVpLmNoZWNrYm94K2xhYmVse3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWkuY2hlY2tib3ggLmJveDpob3Zlcjo6YmVmb3JlLC51aS5jaGVja2JveCBsYWJlbDpob3Zlcjo6YmVmb3Jle2JhY2tncm91bmQ6I2ZmZjtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMzUpfS51aS5jaGVja2JveCBsYWJlbDpob3ZlciwudWkuY2hlY2tib3grbGFiZWw6aG92ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLmNoZWNrYm94IC5ib3g6YWN0aXZlOjpiZWZvcmUsLnVpLmNoZWNrYm94IGxhYmVsOmFjdGl2ZTo6YmVmb3Jle2JhY2tncm91bmQ6I2Y5ZmFmYjtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMzUpfS51aS5jaGVja2JveCAuYm94OmFjdGl2ZTo6YWZ0ZXIsLnVpLmNoZWNrYm94IGxhYmVsOmFjdGl2ZTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5jaGVja2JveCBpbnB1dDphY3RpdmV+bGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5jaGVja2JveCBpbnB1dDpmb2N1c34uYm94OmJlZm9yZSwudWkuY2hlY2tib3ggaW5wdXQ6Zm9jdXN+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQ6I2ZmZjtib3JkZXItY29sb3I6Izk2YzhkYX0udWkuY2hlY2tib3ggaW5wdXQ6Zm9jdXN+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6Zm9jdXN+bGFiZWw6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+LmJveDpiZWZvcmUsLnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQ6I2ZmZjtib3JkZXItY29sb3I6cmdiYSgzNCwzNiwzOCwuMzUpfS51aS5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YWZ0ZXJ7b3BhY2l0eToxO2NvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZX4uYm94OmJlZm9yZSwudWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZX5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZDojZmZmO2JvcmRlci1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4zNSl9LnVpLmNoZWNrYm94IGlucHV0Om5vdChbdHlwZT1yYWRpb10pOmluZGV0ZXJtaW5hdGV+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZX5sYWJlbDphZnRlcntvcGFjaXR5OjE7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5jaGVja2JveCBpbnB1dDpjaGVja2VkOmZvY3Vzfi5ib3g6YmVmb3JlLC51aS5jaGVja2JveCBpbnB1dDpjaGVja2VkOmZvY3VzfmxhYmVsOmJlZm9yZSwudWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZTpmb2N1c34uYm94OmJlZm9yZSwudWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZTpmb2N1c35sYWJlbDpiZWZvcmV7YmFja2dyb3VuZDojZmZmO2JvcmRlci1jb2xvcjojOTZjOGRhfS51aS5jaGVja2JveCBpbnB1dDpjaGVja2VkOmZvY3Vzfi5ib3g6YWZ0ZXIsLnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWQ6Zm9jdXN+bGFiZWw6YWZ0ZXIsLnVpLmNoZWNrYm94IGlucHV0Om5vdChbdHlwZT1yYWRpb10pOmluZGV0ZXJtaW5hdGU6Zm9jdXN+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXQ6bm90KFt0eXBlPXJhZGlvXSk6aW5kZXRlcm1pbmF0ZTpmb2N1c35sYWJlbDphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnJlYWQtb25seS5jaGVja2JveCwudWkucmVhZC1vbmx5LmNoZWNrYm94IGxhYmVse2N1cnNvcjpkZWZhdWx0fS51aS5jaGVja2JveCBpbnB1dFtkaXNhYmxlZF1+LmJveDphZnRlciwudWkuY2hlY2tib3ggaW5wdXRbZGlzYWJsZWRdfmxhYmVsLC51aS5kaXNhYmxlZC5jaGVja2JveCAuYm94OmFmdGVyLC51aS5kaXNhYmxlZC5jaGVja2JveCBsYWJlbHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnQ7b3BhY2l0eTouNTtjb2xvcjojMDAwfS51aS5jaGVja2JveCBpbnB1dC5oaWRkZW57ei1pbmRleDotMX0udWkuY2hlY2tib3ggaW5wdXQuaGlkZGVuK2xhYmVse2N1cnNvcjpwb2ludGVyOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0udWkucmFkaW8uY2hlY2tib3h7bWluLWhlaWdodDoxNXB4fS51aS5yYWRpby5jaGVja2JveCAuYm94LC51aS5yYWRpby5jaGVja2JveCBsYWJlbHtwYWRkaW5nLWxlZnQ6MS44NTcxNGVtfS51aS5yYWRpby5jaGVja2JveCAuYm94OmJlZm9yZSwudWkucmFkaW8uY2hlY2tib3ggbGFiZWw6YmVmb3Jle2NvbnRlbnQ6Jyc7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZTt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2JvcmRlci1yYWRpdXM6NTAwcmVtO3RvcDoxcHg7bGVmdDowfS51aS5yYWRpby5jaGVja2JveCAuYm94OmFmdGVyLC51aS5yYWRpby5jaGVja2JveCBsYWJlbDphZnRlcntib3JkZXI6bm9uZTtjb250ZW50OicnIWltcG9ydGFudDt3aWR0aDoxNXB4O2hlaWdodDoxNXB4O2xpbmUtaGVpZ2h0OjE1cHh9LnVpLnJhZGlvLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLnJhZGlvLmNoZWNrYm94IGxhYmVsOmFmdGVye3RvcDoxcHg7bGVmdDowO3dpZHRoOjE1cHg7aGVpZ2h0OjE1cHg7Ym9yZGVyLXJhZGl1czo1MDByZW07LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjQ2NjY2NjY3KTt0cmFuc2Zvcm06c2NhbGUoLjQ2NjY2NjY3KTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Zm9jdXN+LmJveDpiZWZvcmUsLnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3VzfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3Vzfi5ib3g6YWZ0ZXIsLnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3VzfmxhYmVsOmFmdGVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5yYWRpby5jaGVja2JveCBpbnB1dDppbmRldGVybWluYXRlfi5ib3g6YWZ0ZXIsLnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmluZGV0ZXJtaW5hdGV+bGFiZWw6YWZ0ZXJ7b3BhY2l0eTowfS51aS5yYWRpby5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YmVmb3JlLC51aS5yYWRpby5jaGVja2JveCBpbnB1dDpjaGVja2VkfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+LmJveDphZnRlciwudWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbDphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjk1KX0udWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Zm9jdXM6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkucmFkaW8uY2hlY2tib3ggaW5wdXQ6Zm9jdXM6Y2hlY2tlZH5sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjojZmZmfS51aS5yYWRpby5jaGVja2JveCBpbnB1dDpmb2N1czpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLnJhZGlvLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+bGFiZWw6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC45NSl9LnVpLnNsaWRlci5jaGVja2JveHttaW4taGVpZ2h0OjEuMjVyZW19LnVpLnNsaWRlci5jaGVja2JveCBpbnB1dHt3aWR0aDozLjVyZW07aGVpZ2h0OjEuMjVyZW19LnVpLnNsaWRlci5jaGVja2JveCAuYm94LC51aS5zbGlkZXIuY2hlY2tib3ggbGFiZWx7cGFkZGluZy1sZWZ0OjQuNXJlbTtsaW5lLWhlaWdodDoxcmVtO2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5zbGlkZXIuY2hlY2tib3ggLmJveDpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBsYWJlbDpiZWZvcmV7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO2JvcmRlcjpub25lIWltcG9ydGFudDtsZWZ0OjA7ei1pbmRleDoxO3RvcDouNHJlbTtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA1KTt3aWR0aDozLjVyZW07aGVpZ2h0Oi4yMTQyODU3MXJlbTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO2JvcmRlci1yYWRpdXM6NTAwcmVtOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZCAuM3MgZWFzZX0udWkuc2xpZGVyLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLnNsaWRlci5jaGVja2JveCBsYWJlbDphZnRlcntiYWNrZ3JvdW5kOiNmZmYgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDojZmZmIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7YmFja2dyb3VuZDojZmZmIGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6JychaW1wb3J0YW50O29wYWNpdHk6MTt6LWluZGV4OjI7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7d2lkdGg6MS41cmVtO2hlaWdodDoxLjVyZW07dG9wOi0uMjVyZW07bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmU7Ym9yZGVyLXJhZGl1czo1MDByZW07LXdlYmtpdC10cmFuc2l0aW9uOmxlZnQgLjNzIGVhc2U7dHJhbnNpdGlvbjpsZWZ0IC4zcyBlYXNlfS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Zm9jdXN+LmJveDpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xNSk7Ym9yZGVyOm5vbmV9LnVpLnNsaWRlci5jaGVja2JveCAuYm94OmhvdmVyLC51aS5zbGlkZXIuY2hlY2tib3ggbGFiZWw6aG92ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnNsaWRlci5jaGVja2JveCAuYm94OmhvdmVyOjpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBsYWJlbDpob3Zlcjo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTUpfS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94LC51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS5zbGlkZXIuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzU0NTQ1NCFpbXBvcnRhbnR9LnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpjaGVja2VkfmxhYmVsOmFmdGVye2xlZnQ6MnJlbX0udWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveCwudWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+bGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkuc2xpZGVyLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveDpiZWZvcmUsLnVpLnNsaWRlci5jaGVja2JveCBpbnB1dDpmb2N1czpjaGVja2VkfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAhaW1wb3J0YW50fS51aS50b2dnbGUuY2hlY2tib3h7bWluLWhlaWdodDoxLjVyZW19LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dHt3aWR0aDozLjVyZW07aGVpZ2h0OjEuNXJlbX0udWkudG9nZ2xlLmNoZWNrYm94IC5ib3gsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbHttaW4taGVpZ2h0OjEuNXJlbTtwYWRkaW5nLWxlZnQ6NC41cmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkudG9nZ2xlLmNoZWNrYm94IGxhYmVse3BhZGRpbmctdG9wOi4xNWVtfS51aS50b2dnbGUuY2hlY2tib3ggLmJveDpiZWZvcmUsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbDpiZWZvcmV7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3otaW5kZXg6MTstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lO2JvcmRlcjpub25lO3RvcDowO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTt3aWR0aDozLjVyZW07aGVpZ2h0OjEuNXJlbTtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkudG9nZ2xlLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbDphZnRlcntiYWNrZ3JvdW5kOiNmZmYgLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sZnJvbSh0cmFuc3BhcmVudCksdG8ocmdiYSgwLDAsMCwuMDUpKSk7YmFja2dyb3VuZDojZmZmIC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LHJnYmEoMCwwLDAsLjA1KSk7YmFja2dyb3VuZDojZmZmIGxpbmVhci1ncmFkaWVudCh0cmFuc3BhcmVudCxyZ2JhKDAsMCwwLC4wNSkpO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6JychaW1wb3J0YW50O29wYWNpdHk6MTt6LWluZGV4OjI7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0O2JveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7d2lkdGg6MS41cmVtO2hlaWdodDoxLjVyZW07dG9wOjA7bGVmdDowO2JvcmRlci1yYWRpdXM6NTAwcmVtOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zcyBlYXNlLGxlZnQgLjNzIGVhc2U7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4zcyBlYXNlLGxlZnQgLjNzIGVhc2V9LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dH4uYm94OmFmdGVyLC51aS50b2dnbGUuY2hlY2tib3ggaW5wdXR+bGFiZWw6YWZ0ZXJ7bGVmdDotLjA1cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksMCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSwwIDAgMCAxcHggcmdiYSgzNCwzNiwzOCwuMTUpIGluc2V0fS51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Zm9jdXN+LmJveDpiZWZvcmUsLnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpmb2N1c35sYWJlbDpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xNSk7Ym9yZGVyOm5vbmV9LnVpLnRvZ2dsZS5jaGVja2JveCAuYm94OmhvdmVyOjpiZWZvcmUsLnVpLnRvZ2dsZS5jaGVja2JveCBsYWJlbDpob3Zlcjo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTUpO2JvcmRlcjpub25lfS51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94LC51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC45NSkhaW1wb3J0YW50fS51aS50b2dnbGUuY2hlY2tib3ggaW5wdXQ6Y2hlY2tlZH4uYm94OmJlZm9yZSwudWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzIxODVkMCFpbXBvcnRhbnR9LnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpjaGVja2VkfmxhYmVsOmFmdGVye2xlZnQ6Mi4xNXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAxcHggMnB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpLDAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXQ7Ym94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDM0LDM2LDM4LC4xNSksMCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldH0udWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveCwudWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+bGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuOTUpIWltcG9ydGFudH0udWkudG9nZ2xlLmNoZWNrYm94IGlucHV0OmZvY3VzOmNoZWNrZWR+LmJveDpiZWZvcmUsLnVpLnRvZ2dsZS5jaGVja2JveCBpbnB1dDpmb2N1czpjaGVja2VkfmxhYmVsOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMwZDcxYmIhaW1wb3J0YW50fS51aS5maXR0ZWQuY2hlY2tib3ggLmJveCwudWkuZml0dGVkLmNoZWNrYm94IGxhYmVse3BhZGRpbmctbGVmdDowIWltcG9ydGFudH0udWkuZml0dGVkLnRvZ2dsZS5jaGVja2JveHt3aWR0aDozLjVyZW19LnVpLmZpdHRlZC5zbGlkZXIuY2hlY2tib3h7d2lkdGg6My41cmVtfUBmb250LWZhY2V7Zm9udC1mYW1pbHk6Q2hlY2tib3g7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7Y2hhcnNldD11dGYtODtiYXNlNjQsQUFFQUFBQUxBSUFBQXdBd1QxTXZNZzhTQkQ4QUFBQzhBQUFBWUdOdFlYQVlWdENKQUFBQkhBQUFBRlJuWVhOd0FBQUFFQUFBQVhBQUFBQUlaMng1Wm40aHV3VUFBQUY0QUFBQllHaGxZV1FHUGUxWkFBQUMyQUFBQURab2FHVmhCMzBEeUFBQUF4QUFBQUFrYUcxMGVCQktBRVVBQUFNMEFBQUFIR3h2WTJFQW1nRVNBQUFEVUFBQUFCQnRZWGh3QUFrQUx3QUFBMkFBQUFBZ2JtRnRaU0M4SXVnQUFBT0FBQUFCa25CdmMzUUFBd0FBQUFBRkZBQUFBQ0FBQXdNVEFaQUFCUUFBQXBrQ3pBQUFBSThDbVFMTUFBQUI2d0F6QVFrQUFBQUFBQUFBQUFBQUFBQUFBQUFCRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFEb0FnUEEvOEFBUUFQQUFFQUFBQUFCQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFEQUFBQUF3QUFBQndBQVFBREFBQUFIQUFEQUFFQUFBQWNBQVFBT0FBQUFBb0FDQUFDQUFJQUFRQWc2QUwvL2YvL0FBQUFBQUFnNkFELy9mLy9BQUgvNHhnRUFBTUFBUUFBQUFBQUFBQUFBQUFBQVFBQi8vOEFEd0FCQUFBQUFBQUFBQUFBQWdBQU56a0JBQUFBQUFFQUFBQUFBQUFBQUFBQ0FBQTNPUUVBQUFBQUFRQUFBQUFBQUFBQUFBSUFBRGM1QVFBQUFBQUJBRVVBVVFPN0F2Z0FHZ0FBQVJRSEFRWWpJaWNCSmpVMFB3RTJNeklmQVFFMk16SWZBUllWQTdzUS9oUVFGaGNRL3VNUUVFNFFGeGNRcUFGMkVCY1hFRTRRQW5NV0VQNFVFQkFCSFJBWEZoQk9FQkNvQVhjUUVFNFFGd0FBQUFBQkFBQUJiZ01sQWtrQUZBQUFBUlVVQndZaklTSW5KajBCTkRjMk15RXlGeFlWQXlVUUVCZjlTUmNRRUJBUUZ3SzNGeEFRQWhKdEZ4QVFFQkFYYlJjUUVCQVFGd0FBQUFBQkFBQUFTUU1sQTI0QUxBQUFBUlVVQndZckFSVVVCd1lyQVNJbkpqMEJJeUluSmowQk5EYzJPd0UxTkRjMk93RXlGeFlkQVRNeUZ4WVZBeVVRRUJmdUVCQVhiaFlRRU80WEVCQVFFQmZ1RUJBV2JoY1FFTzRYRUJBQ0VtMFhFQkR1RnhBUUVCQVg3aEFRRjIwWEVCRHVGeEFRRUJBWDdoQVFGd0FBQVFBQUFBSUFBSFJTelQ5ZkR6ejFBQXNFQUFBQUFBRFJzZFIzQUFBQUFOR3gxSGNBQUFBQUE3c0RiZ0FBQUFnQUFnQUFBQUFBQUFBQkFBQUR3UC9BQUFBRUFBQUFBQUFEdXdBQkFBQUFBQUFBQUFBQUFBQUFBQUFBQndRQUFBQUFBQUFBQUFBQUFBSUFBQUFFQUFCRkF5VUFBQU1sQUFBQUFBQUFBQW9BRkFBZUFFNEFjZ0N3QUFFQUFBQUhBQzBBQVFBQUFBQUFBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFPQUs0QUFRQUFBQUFBQVFBSUFBQUFBUUFBQUFBQUFnQUhBR2tBQVFBQUFBQUFBd0FJQURrQUFRQUFBQUFBQkFBSUFINEFBUUFBQUFBQUJRQUxBQmdBQVFBQUFBQUFCZ0FJQUZFQUFRQUFBQUFBQ2dBYUFKWUFBd0FCQkFrQUFRQVFBQWdBQXdBQkJBa0FBZ0FPQUhBQUF3QUJCQWtBQXdBUUFFRUFBd0FCQkFrQUJBQVFBSVlBQXdBQkJBa0FCUUFXQUNNQUF3QUJCQWtBQmdBUUFGa0FBd0FCQkFrQUNnQTBBTEJEYUdWamEySnZlQUJEQUdnQVpRQmpBR3NBWWdCdkFIaFdaWEp6YVc5dUlESXVNQUJXQUdVQWNnQnpBR2tBYndCdUFDQUFNZ0F1QURCRGFHVmphMkp2ZUFCREFHZ0FaUUJqQUdzQVlnQnZBSGhEYUdWamEySnZlQUJEQUdnQVpRQmpBR3NBWWdCdkFIaFNaV2QxYkdGeUFGSUFaUUJuQUhVQWJBQmhBSEpEYUdWamEySnZlQUJEQUdnQVpRQmpBR3NBWWdCdkFIaEdiMjUwSUdkbGJtVnlZWFJsWkNCaWVTQkpZMjlOYjI5dUxnQkdBRzhBYmdCMEFDQUFad0JsQUc0QVpRQnlBR0VBZEFCbEFHUUFJQUJpQUhrQUlBQkpBR01BYndCTkFHOEFid0J1QUM0QUFBQURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBKSBmb3JtYXQoJ3RydWV0eXBlJyl9LnVpLmNoZWNrYm94IC5ib3g6YWZ0ZXIsLnVpLmNoZWNrYm94IGxhYmVsOmFmdGVye2ZvbnQtZmFtaWx5OkNoZWNrYm94fS51aS5jaGVja2JveCBpbnB1dDpjaGVja2Vkfi5ib3g6YWZ0ZXIsLnVpLmNoZWNrYm94IGlucHV0OmNoZWNrZWR+bGFiZWw6YWZ0ZXJ7Y29udGVudDonXFxcXGU4MDAnfS51aS5jaGVja2JveCBpbnB1dDppbmRldGVybWluYXRlfi5ib3g6YWZ0ZXIsLnVpLmNoZWNrYm94IGlucHV0OmluZGV0ZXJtaW5hdGV+bGFiZWw6YWZ0ZXJ7Zm9udC1zaXplOjEycHg7Y29udGVudDonXFxcXGU4MDEnfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBEaW1tZXJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy5kaW1tYWJsZTpub3QoYm9keSl7cG9zaXRpb246cmVsYXRpdmV9LnVpLmRpbW1lcntkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjAhaW1wb3J0YW50O2xlZnQ6MCFpbXBvcnRhbnQ7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7cGFkZGluZzoxZW07YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44NSk7b3BhY2l0eTowO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7YW5pbWF0aW9uLWZpbGwtbW9kZTpib3RoOy13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi41czthbmltYXRpb24tZHVyYXRpb246LjVzOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC41cyBsaW5lYXI7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC41cyBsaW5lYXI7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LXdlYmtpdC1ib3gtYWxpZ246Y2VudGVyOy1tcy1mbGV4LWFsaWduOmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC1ib3gtcGFjazpjZW50ZXI7LW1zLWZsZXgtcGFjazpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7d2lsbC1jaGFuZ2U6b3BhY2l0eTt6LWluZGV4OjEwMDB9LnVpLmRpbW1lcj4uY29udGVudHstd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7LW1vei11c2VyLXNlbGVjdDp0ZXh0Oy1tcy11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHQ7Y29sb3I6I2ZmZn0udWkuc2VnbWVudD4udWkuZGltbWVye2JvcmRlci1yYWRpdXM6aW5oZXJpdCFpbXBvcnRhbnR9LnVpLmRpbW1lcjpub3QoLmludmVydGVkKTo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2t7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0udWkuZGltbWVyOm5vdCguaW52ZXJ0ZWQpOjotd2Via2l0LXNjcm9sbGJhci10aHVtYntiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjI1KX0udWkuZGltbWVyOm5vdCguaW52ZXJ0ZWQpOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp3aW5kb3ctaW5hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9LnVpLmRpbW1lcjpub3QoLmludmVydGVkKTo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJ7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zNSl9LmFuaW1hdGluZy5kaW1tYWJsZTpub3QoYm9keSksLmRpbW1lZC5kaW1tYWJsZTpub3QoYm9keSl7b3ZlcmZsb3c6aGlkZGVufS5kaW1tZWQuZGltbWFibGU+LnVpLmFuaW1hdGluZy5kaW1tZXIsLmRpbW1lZC5kaW1tYWJsZT4udWkudmlzaWJsZS5kaW1tZXIsLnVpLmFjdGl2ZS5kaW1tZXJ7ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDtvcGFjaXR5OjF9LnVpLmRpc2FibGVkLmRpbW1lcnt3aWR0aDowIWltcG9ydGFudDtoZWlnaHQ6MCFpbXBvcnRhbnR9LmRpbW1lZC5kaW1tYWJsZT4udWkuYW5pbWF0aW5nLmxlZ2FjeS5kaW1tZXIsLmRpbW1lZC5kaW1tYWJsZT4udWkudmlzaWJsZS5sZWdhY3kuZGltbWVyLC51aS5hY3RpdmUubGVnYWN5LmRpbW1lcntkaXNwbGF5OmJsb2NrfS51aVtjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0uZGltbWVyey13ZWJraXQtYm94LXBhY2s6c3RhcnQ7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0udWlbY2xhc3MqPVxcXCJib3R0b20gYWxpZ25lZFxcXCJdLmRpbW1lcnstd2Via2l0LWJveC1wYWNrOmVuZDstbXMtZmxleC1wYWNrOmVuZDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9LnVpLnBhZ2UuZGltbWVye3Bvc2l0aW9uOmZpeGVkOy13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOicnO3RyYW5zZm9ybS1zdHlsZTonJzstd2Via2l0LXBlcnNwZWN0aXZlOjIwMDBweDtwZXJzcGVjdGl2ZToyMDAwcHg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgY2VudGVyfWJvZHkuYW5pbWF0aW5nLmluLmRpbW1hYmxlLGJvZHkuZGltbWVkLmRpbW1hYmxle292ZXJmbG93OmhpZGRlbn1ib2R5LmRpbW1hYmxlPi5kaW1tZXJ7cG9zaXRpb246Zml4ZWR9LmJsdXJyaW5nLmRpbW1hYmxlPjpub3QoLmRpbW1lcil7LXdlYmtpdC1maWx0ZXI6Ymx1cigwKSBncmF5c2NhbGUoMCk7ZmlsdGVyOmJsdXIoMCkgZ3JheXNjYWxlKDApOy13ZWJraXQtdHJhbnNpdGlvbjouOHMgLXdlYmtpdC1maWx0ZXIgZWFzZTt0cmFuc2l0aW9uOi44cyAtd2Via2l0LWZpbHRlciBlYXNlO3RyYW5zaXRpb246LjhzIGZpbHRlciBlYXNlO3RyYW5zaXRpb246LjhzIGZpbHRlciBlYXNlLC44cyAtd2Via2l0LWZpbHRlciBlYXNlfS5ibHVycmluZy5kaW1tZWQuZGltbWFibGU+Om5vdCguZGltbWVyKXstd2Via2l0LWZpbHRlcjpibHVyKDVweCkgZ3JheXNjYWxlKC43KTtmaWx0ZXI6Ymx1cig1cHgpIGdyYXlzY2FsZSguNyl9LmJsdXJyaW5nLmRpbW1hYmxlPi5kaW1tZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0uYmx1cnJpbmcuZGltbWFibGU+LmludmVydGVkLmRpbW1lcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjYpfS51aS5kaW1tZXI+LnRvcC5hbGlnbmVkLmNvbnRlbnQ+Knt2ZXJ0aWNhbC1hbGlnbjp0b3B9LnVpLmRpbW1lcj4uYm90dG9tLmFsaWduZWQuY29udGVudD4qe3ZlcnRpY2FsLWFsaWduOmJvdHRvbX0udWkuaW52ZXJ0ZWQuZGltbWVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuODUpfS51aS5pbnZlcnRlZC5kaW1tZXI+LmNvbnRlbnQ+Kntjb2xvcjojZmZmfS51aS5zaW1wbGUuZGltbWVye2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO29wYWNpdHk6MTt3aWR0aDowJTtoZWlnaHQ6MCU7ei1pbmRleDotMTAwO2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwwKX0uZGltbWVkLmRpbW1hYmxlPi51aS5zaW1wbGUuZGltbWVye292ZXJmbG93OnZpc2libGU7b3BhY2l0eToxO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44NSk7ei1pbmRleDoxfS51aS5zaW1wbGUuaW52ZXJ0ZWQuZGltbWVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwKX0uZGltbWVkLmRpbW1hYmxlPi51aS5zaW1wbGUuaW52ZXJ0ZWQuZGltbWVye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuODUpfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBEcm9wZG93blxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLmRyb3Bkb3due2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO291dGxpbmU6MDt0ZXh0LWFsaWduOmxlZnQ7LXdlYmtpdC10cmFuc2l0aW9uOndpZHRoIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOndpZHRoIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2Usd2lkdGggLjFzIGVhc2U7dHJhbnNpdGlvbjpib3gtc2hhZG93IC4xcyBlYXNlLHdpZHRoIC4xcyBlYXNlLC13ZWJraXQtYm94LXNoYWRvdyAuMXMgZWFzZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9LnVpLmRyb3Bkb3duIC5tZW51e2N1cnNvcjphdXRvO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6bm9uZTtvdXRsaW5lOjA7dG9wOjEwMCU7bWluLXdpZHRoOi13ZWJraXQtbWF4LWNvbnRlbnQ7bWluLXdpZHRoOi1tb3otbWF4LWNvbnRlbnQ7bWluLXdpZHRoOm1heC1jb250ZW50O21hcmdpbjowO3BhZGRpbmc6MCAwO2JhY2tncm91bmQ6I2ZmZjtmb250LXNpemU6MWVtO3RleHQtc2hhZG93Om5vbmU7dGV4dC1hbGlnbjpsZWZ0Oy13ZWJraXQtYm94LXNoYWRvdzowIDJweCAzcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDJweCAzcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW07LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlO3otaW5kZXg6MTE7d2lsbC1jaGFuZ2U6dHJhbnNmb3JtLG9wYWNpdHl9LnVpLmRyb3Bkb3duIC5tZW51Pip7d2hpdGUtc3BhY2U6bm93cmFwfS51aS5kcm9wZG93bj5pbnB1dDpub3QoLnNlYXJjaCk6Zmlyc3QtY2hpbGQsLnVpLmRyb3Bkb3duPnNlbGVjdHtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS51aS5kcm9wZG93bj4uZHJvcGRvd24uaWNvbntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDphdXRvO2ZvbnQtc2l6ZTouODU3MTQyODZlbTttYXJnaW46MCAwIDAgMWVtfS51aS5kcm9wZG93biAubWVudT4uaXRlbSAuZHJvcGRvd24uaWNvbnt3aWR0aDphdXRvO2Zsb2F0OnJpZ2h0O21hcmdpbjowIDAgMCAxZW19LnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtIC5kcm9wZG93bi5pY29uKy50ZXh0e21hcmdpbi1yaWdodDoxZW19LnVpLmRyb3Bkb3duPi50ZXh0e2Rpc3BsYXk6aW5saW5lLWJsb2NrOy13ZWJraXQtdHJhbnNpdGlvbjpub25lO3RyYW5zaXRpb246bm9uZX0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW17cG9zaXRpb246cmVsYXRpdmU7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpibG9jaztib3JkZXI6bm9uZTtoZWlnaHQ6YXV0bzt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLXRvcDpub25lO2xpbmUtaGVpZ2h0OjFlbTtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7cGFkZGluZzouNzg1NzE0MjlyZW0gMS4xNDI4NTcxNHJlbSFpbXBvcnRhbnQ7Zm9udC1zaXplOjFyZW07dGV4dC10cmFuc2Zvcm06bm9uZTtmb250LXdlaWdodDo0MDA7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lOy13ZWJraXQtdG91Y2gtY2FsbG91dDpub25lfS51aS5kcm9wZG93biAubWVudT4uaXRlbTpmaXJzdC1jaGlsZHtib3JkZXItdG9wLXdpZHRoOjB9LnVpLmRyb3Bkb3duIC5tZW51IC5pdGVtPltjbGFzcyo9XFxcInJpZ2h0IGZsb2F0ZWRcXFwiXSwudWkuZHJvcGRvd24+LnRleHQ+W2NsYXNzKj1cXFwicmlnaHQgZmxvYXRlZFxcXCJde2Zsb2F0OnJpZ2h0IWltcG9ydGFudDttYXJnaW4tcmlnaHQ6MCFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MWVtIWltcG9ydGFudH0udWkuZHJvcGRvd24gLm1lbnUgLml0ZW0+W2NsYXNzKj1cXFwibGVmdCBmbG9hdGVkXFxcIl0sLnVpLmRyb3Bkb3duPi50ZXh0PltjbGFzcyo9XFxcImxlZnQgZmxvYXRlZFxcXCJde2Zsb2F0OmxlZnQhaW1wb3J0YW50O21hcmdpbi1sZWZ0OjAhaW1wb3J0YW50O21hcmdpbi1yaWdodDoxZW0haW1wb3J0YW50fS51aS5kcm9wZG93biAubWVudSAuaXRlbT4uZmxhZy5mbG9hdGVkLC51aS5kcm9wZG93biAubWVudSAuaXRlbT4uaWNvbi5mbG9hdGVkLC51aS5kcm9wZG93biAubWVudSAuaXRlbT4uaW1hZ2UuZmxvYXRlZCwudWkuZHJvcGRvd24gLm1lbnUgLml0ZW0+aW1nLmZsb2F0ZWR7bWFyZ2luLXRvcDowfS51aS5kcm9wZG93biAubWVudT4uaGVhZGVye21hcmdpbjoxcmVtIDAgLjc1cmVtO3BhZGRpbmc6MCAxLjE0Mjg1NzE0cmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg1KTtmb250LXNpemU6Ljc4NTcxNDI5ZW07Zm9udC13ZWlnaHQ6NzAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0udWkuZHJvcGRvd24gLm1lbnU+LmRpdmlkZXJ7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSk7aGVpZ2h0OjA7bWFyZ2luOi41ZW0gMH0udWkuZHJvcGRvd24uZHJvcGRvd24gLm1lbnU+LmlucHV0e3dpZHRoOmF1dG87ZGlzcGxheTotd2Via2l0LWJveDtkaXNwbGF5Oi1tcy1mbGV4Ym94O2Rpc3BsYXk6ZmxleDttYXJnaW46MS4xNDI4NTcxNHJlbSAuNzg1NzE0MjlyZW07bWluLXdpZHRoOjEwcmVtfS51aS5kcm9wZG93biAubWVudT4uaGVhZGVyKy5pbnB1dHttYXJnaW4tdG9wOjB9LnVpLmRyb3Bkb3duIC5tZW51Pi5pbnB1dDpub3QoLnRyYW5zcGFyZW50KSBpbnB1dHtwYWRkaW5nOi41ZW0gMWVtfS51aS5kcm9wZG93biAubWVudT4uaW5wdXQ6bm90KC50cmFuc3BhcmVudCkgLmJ1dHRvbiwudWkuZHJvcGRvd24gLm1lbnU+LmlucHV0Om5vdCgudHJhbnNwYXJlbnQpIC5pY29uLC51aS5kcm9wZG93biAubWVudT4uaW5wdXQ6bm90KC50cmFuc3BhcmVudCkgLmxhYmVse3BhZGRpbmctdG9wOi41ZW07cGFkZGluZy1ib3R0b206LjVlbX0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+LmRlc2NyaXB0aW9uLC51aS5kcm9wZG93bj4udGV4dD4uZGVzY3JpcHRpb257ZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMCAwIDFlbTtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuZHJvcGRvd24gLm1lbnU+Lm1lc3NhZ2V7cGFkZGluZzouNzg1NzE0MjlyZW0gMS4xNDI4NTcxNHJlbTtmb250LXdlaWdodDo0MDB9LnVpLmRyb3Bkb3duIC5tZW51Pi5tZXNzYWdlOm5vdCgudWkpe2NvbG9yOnJnYmEoMCwwLDAsLjQpfS51aS5kcm9wZG93biAubWVudSAubWVudXt0b3A6MCFpbXBvcnRhbnQ7bGVmdDoxMDAlO3JpZ2h0OmF1dG87bWFyZ2luOjAgMCAwIC0uNWVtIWltcG9ydGFudDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSFpbXBvcnRhbnQ7ei1pbmRleDoyMSFpbXBvcnRhbnR9LnVpLmRyb3Bkb3duIC5tZW51IC5tZW51OmFmdGVye2Rpc3BsYXk6bm9uZX0udWkuZHJvcGRvd24+LnRleHQ+LmZsYWcsLnVpLmRyb3Bkb3duPi50ZXh0Pi5pY29uLC51aS5kcm9wZG93bj4udGV4dD4uaW1hZ2UsLnVpLmRyb3Bkb3duPi50ZXh0Pi5sYWJlbCwudWkuZHJvcGRvd24+LnRleHQ+aW1ne21hcmdpbi10b3A6MH0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+LmZsYWcsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5pY29uLC51aS5kcm9wZG93biAubWVudT4uaXRlbT4uaW1hZ2UsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5sYWJlbCwudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+aW1ne21hcmdpbi10b3A6MH0udWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+LmZsYWcsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5pY29uLC51aS5kcm9wZG93biAubWVudT4uaXRlbT4uaW1hZ2UsLnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5sYWJlbCwudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+aW1nLC51aS5kcm9wZG93bj4udGV4dD4uZmxhZywudWkuZHJvcGRvd24+LnRleHQ+Lmljb24sLnVpLmRyb3Bkb3duPi50ZXh0Pi5pbWFnZSwudWkuZHJvcGRvd24+LnRleHQ+LmxhYmVsLC51aS5kcm9wZG93bj4udGV4dD5pbWd7bWFyZ2luLWxlZnQ6MDtmbG9hdDpub25lO21hcmdpbi1yaWdodDouNzg1NzE0MjlyZW19LnVpLmRyb3Bkb3duIC5tZW51Pi5pdGVtPi5pbWFnZSwudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW0+aW1nLC51aS5kcm9wZG93bj4udGV4dD4uaW1hZ2UsLnVpLmRyb3Bkb3duPi50ZXh0PmltZ3tkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6YXV0bzttYXJnaW4tdG9wOi0uNWVtO21hcmdpbi1ib3R0b206LS41ZW07bWF4LWhlaWdodDoyZW19LnVpLmRyb3Bkb3duIC51aS5tZW51Pi5pdGVtOmJlZm9yZSwudWkubWVudSAudWkuZHJvcGRvd24gLm1lbnU+Lml0ZW06YmVmb3Jle2Rpc3BsYXk6bm9uZX0udWkubWVudSAudWkuZHJvcGRvd24gLm1lbnUgLmFjdGl2ZS5pdGVte2JvcmRlci1sZWZ0Om5vbmV9LnVpLmJ1dHRvbnM+LnVpLmRyb3Bkb3duOmxhc3QtY2hpbGQgLm1lbnUsLnVpLm1lbnUgLnJpZ2h0LmRyb3Bkb3duLml0ZW0gLm1lbnUsLnVpLm1lbnUgLnJpZ2h0Lm1lbnUgLmRyb3Bkb3duOmxhc3QtY2hpbGQgLm1lbnV7bGVmdDphdXRvO3JpZ2h0OjB9LnVpLmxhYmVsLmRyb3Bkb3duIC5tZW51e21pbi13aWR0aDoxMDAlfS51aS5kcm9wZG93bi5pY29uLmJ1dHRvbj4uZHJvcGRvd24uaWNvbnttYXJnaW46MH0udWkuYnV0dG9uLmRyb3Bkb3duIC5tZW51e21pbi13aWR0aDoxMDAlfS51aS5zZWxlY3Rpb24uZHJvcGRvd257Y3Vyc29yOnBvaW50ZXI7d29yZC13cmFwOmJyZWFrLXdvcmQ7bGluZS1oZWlnaHQ6MWVtO3doaXRlLXNwYWNlOm5vcm1hbDtvdXRsaW5lOjA7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlWigwKTt0cmFuc2Zvcm06cm90YXRlWigwKTttaW4td2lkdGg6MTRlbTttaW4taGVpZ2h0OjIuNzE0Mjg1NzFlbTtiYWNrZ3JvdW5kOiNmZmY7ZGlzcGxheTppbmxpbmUtYmxvY2s7cGFkZGluZzouNzg1NzE0MjllbSAyLjFlbSAuNzg1NzE0MjllbSAxZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246d2lkdGggLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSx3aWR0aCAuMXMgZWFzZTt0cmFuc2l0aW9uOmJveC1zaGFkb3cgLjFzIGVhc2Usd2lkdGggLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlfS51aS5zZWxlY3Rpb24uZHJvcGRvd24uYWN0aXZlLC51aS5zZWxlY3Rpb24uZHJvcGRvd24udmlzaWJsZXt6LWluZGV4OjEwfXNlbGVjdC51aS5kcm9wZG93bntoZWlnaHQ6MzhweDtwYWRkaW5nOi41ZW07Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7dmlzaWJpbGl0eTp2aXNpYmxlfS51aS5zZWxlY3Rpb24uZHJvcGRvd24+LmRlbGV0ZS5pY29uLC51aS5zZWxlY3Rpb24uZHJvcGRvd24+LmRyb3Bkb3duLmljb24sLnVpLnNlbGVjdGlvbi5kcm9wZG93bj4uc2VhcmNoLmljb257Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bztsaW5lLWhlaWdodDoxLjIxNDI4NTcxZW07dG9wOi43ODU3MTQyOWVtO3JpZ2h0OjFlbTt6LWluZGV4OjM7bWFyZ2luOi0uNzg1NzE0MjllbTtwYWRkaW5nOi45MTY2NjY2N2VtO29wYWNpdHk6Ljg7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlfS51aS5jb21wYWN0LnNlbGVjdGlvbi5kcm9wZG93bnttaW4td2lkdGg6MH0udWkuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51e292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO2JvcmRlci10b3Atd2lkdGg6MCFpbXBvcnRhbnQ7d2lkdGg6YXV0bztvdXRsaW5lOjA7bWFyZ2luOjAgLTFweDttaW4td2lkdGg6Y2FsYygxMDAlICsgMnB4KTt3aWR0aDpjYWxjKDEwMCUgKyAycHgpO2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2V9LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudTphZnRlciwudWkuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51OmJlZm9yZXtkaXNwbGF5Om5vbmV9LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudT4ubWVzc2FnZXtwYWRkaW5nOi43ODU3MTQyOXJlbSAxLjE0Mjg1NzE0cmVtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjguMDE0Mjg1NzFyZW19fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjEwLjY4NTcxNDI5cmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5zZWxlY3Rpb24uZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoxNi4wMjg1NzE0M3JlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjIxLjM3MTQyODU3cmVtfX0udWkuc2VsZWN0aW9uLmRyb3Bkb3duIC5tZW51Pi5pdGVte2JvcmRlci10b3A6MXB4IHNvbGlkICNmYWZhZmE7cGFkZGluZzouNzg1NzE0MjlyZW0gMS4xNDI4NTcxNHJlbSFpbXBvcnRhbnQ7d2hpdGUtc3BhY2U6bm9ybWFsO3dvcmQtd3JhcDpub3JtYWx9LnVpLnNlbGVjdGlvbi5kcm9wZG93biAubWVudT4uaGlkZGVuLmFkZGl0aW9uLml0ZW17ZGlzcGxheTpub25lfS51aS5zZWxlY3Rpb24uZHJvcGRvd246aG92ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjM1KTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLnNlbGVjdGlvbi5hY3RpdmUuZHJvcGRvd257Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VsZWN0aW9uLmFjdGl2ZS5kcm9wZG93biAubWVudXtib3JkZXItY29sb3I6Izk2YzhkYTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5zZWxlY3Rpb24uZHJvcGRvd246Zm9jdXN7Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5zZWxlY3Rpb24uZHJvcGRvd246Zm9jdXMgLm1lbnV7Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VsZWN0aW9uLnZpc2libGUuZHJvcGRvd24+LnRleHQ6bm90KC5kZWZhdWx0KXtmb250LXdlaWdodDo0MDA7Y29sb3I6cmdiYSgwLDAsMCwuOCl9LnVpLnNlbGVjdGlvbi5hY3RpdmUuZHJvcGRvd246aG92ZXJ7Ym9yZGVyLWNvbG9yOiM5NmM4ZGE7LXdlYmtpdC1ib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDNweCAwIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuc2VsZWN0aW9uLmFjdGl2ZS5kcm9wZG93bjpob3ZlciAubWVudXtib3JkZXItY29sb3I6Izk2YzhkYTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAycHggM3B4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5hY3RpdmUuc2VsZWN0aW9uLmRyb3Bkb3duPi5kcm9wZG93bi5pY29uLC51aS52aXNpYmxlLnNlbGVjdGlvbi5kcm9wZG93bj4uZHJvcGRvd24uaWNvbntvcGFjaXR5OicnO3otaW5kZXg6M30udWkuYWN0aXZlLnNlbGVjdGlvbi5kcm9wZG93bntib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjAhaW1wb3J0YW50O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjAhaW1wb3J0YW50fS51aS5hY3RpdmUuZW1wdHkuc2VsZWN0aW9uLmRyb3Bkb3due2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudH0udWkuYWN0aXZlLmVtcHR5LnNlbGVjdGlvbi5kcm9wZG93biAubWVudXtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLnNlYXJjaC5kcm9wZG93bnttaW4td2lkdGg6Jyd9LnVpLnNlYXJjaC5kcm9wZG93bj5pbnB1dC5zZWFyY2h7YmFja2dyb3VuZDpub25lIHRyYW5zcGFyZW50IWltcG9ydGFudDtib3JkZXI6bm9uZSFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Y3Vyc29yOnRleHQ7dG9wOjA7bGVmdDoxcHg7d2lkdGg6MTAwJTtvdXRsaW5lOjA7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsMCk7cGFkZGluZzppbmhlcml0fS51aS5zZWFyY2guZHJvcGRvd24+aW5wdXQuc2VhcmNoe3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6Mn0udWkuc2VhcmNoLmRyb3Bkb3duPi50ZXh0e2N1cnNvcjp0ZXh0O3Bvc2l0aW9uOnJlbGF0aXZlO2xlZnQ6MXB4O3otaW5kZXg6M30udWkuc2VhcmNoLnNlbGVjdGlvbi5kcm9wZG93bj5pbnB1dC5zZWFyY2h7bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtO3BhZGRpbmc6LjY3ODU3MTQzZW0gMi4xZW0gLjY3ODU3MTQzZW0gMWVtfS51aS5zZWFyY2guc2VsZWN0aW9uLmRyb3Bkb3duPnNwYW4uc2l6ZXJ7bGluZS1oZWlnaHQ6MS4yMTQyODU3MWVtO3BhZGRpbmc6LjY3ODU3MTQzZW0gMi4xZW0gLjY3ODU3MTQzZW0gMWVtO2Rpc3BsYXk6bm9uZTt3aGl0ZS1zcGFjZTpwcmV9LnVpLnNlYXJjaC5kcm9wZG93bi5hY3RpdmU+aW5wdXQuc2VhcmNoLC51aS5zZWFyY2guZHJvcGRvd24udmlzaWJsZT5pbnB1dC5zZWFyY2h7Y3Vyc29yOmF1dG99LnVpLnNlYXJjaC5kcm9wZG93bi5hY3RpdmU+LnRleHQsLnVpLnNlYXJjaC5kcm9wZG93bi52aXNpYmxlPi50ZXh0e3BvaW50ZXItZXZlbnRzOm5vbmV9LnVpLmFjdGl2ZS5zZWFyY2guZHJvcGRvd24gaW5wdXQuc2VhcmNoOmZvY3VzKy50ZXh0IC5mbGFnLC51aS5hY3RpdmUuc2VhcmNoLmRyb3Bkb3duIGlucHV0LnNlYXJjaDpmb2N1cysudGV4dCAuaWNvbntvcGFjaXR5Oi40NX0udWkuYWN0aXZlLnNlYXJjaC5kcm9wZG93biBpbnB1dC5zZWFyY2g6Zm9jdXMrLnRleHR7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpIWltcG9ydGFudH0udWkuc2VhcmNoLmRyb3Bkb3duIC5tZW51e292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnNlYXJjaC5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjguMDE0Mjg1NzFyZW19fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLnNlYXJjaC5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjEwLjY4NTcxNDI5cmVtfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5zZWFyY2guZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoxNi4wMjg1NzE0M3JlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnNlYXJjaC5kcm9wZG93biAubWVudXttYXgtaGVpZ2h0OjIxLjM3MTQyODU3cmVtfX0udWkubXVsdGlwbGUuZHJvcGRvd257cGFkZGluZzouMjI2MTkwNDhlbSAyLjFlbSAuMjI2MTkwNDhlbSAuMzU3MTQyODZlbX0udWkubXVsdGlwbGUuZHJvcGRvd24gLm1lbnV7Y3Vyc29yOmF1dG99LnVpLm11bHRpcGxlLnNlYXJjaC5kcm9wZG93biwudWkubXVsdGlwbGUuc2VhcmNoLmRyb3Bkb3duPmlucHV0LnNlYXJjaHtjdXJzb3I6dGV4dH0udWkubXVsdGlwbGUuZHJvcGRvd24+LmxhYmVsey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2hpdGUtc3BhY2U6bm9ybWFsO2ZvbnQtc2l6ZToxZW07cGFkZGluZzouMzU3MTQyODZlbSAuNzg1NzE0MjllbTttYXJnaW46LjE0Mjg1NzE0cmVtIC4yODU3MTQyOXJlbSAuMTQyODU3MTRyZW0gMDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMzQsMzYsMzgsLjE1KSBpbnNldDtib3gtc2hhZG93OjAgMCAwIDFweCByZ2JhKDM0LDM2LDM4LC4xNSkgaW5zZXR9LnVpLm11bHRpcGxlLmRyb3Bkb3duIC5kcm9wZG93bi5pY29ue21hcmdpbjonJztwYWRkaW5nOicnfS51aS5tdWx0aXBsZS5kcm9wZG93bj4udGV4dHtwb3NpdGlvbjpzdGF0aWM7cGFkZGluZzowO21heC13aWR0aDoxMDAlO21hcmdpbjouNDUyMzgwOTVlbSAwIC40NTIzODA5NWVtIC42NDI4NTcxNGVtO2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbX0udWkubXVsdGlwbGUuZHJvcGRvd24+LmxhYmVsfmlucHV0LnNlYXJjaHttYXJnaW4tbGVmdDouMTQyODU3MTRlbSFpbXBvcnRhbnR9LnVpLm11bHRpcGxlLmRyb3Bkb3duPi5sYWJlbH4udGV4dHtkaXNwbGF5Om5vbmV9LnVpLm11bHRpcGxlLnNlYXJjaC5kcm9wZG93bj4udGV4dHtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cGFkZGluZzppbmhlcml0O21hcmdpbjouNDUyMzgwOTVlbSAwIC40NTIzODA5NWVtIC42NDI4NTcxNGVtO2xpbmUtaGVpZ2h0OjEuMjE0Mjg1NzFlbX0udWkubXVsdGlwbGUuc2VhcmNoLmRyb3Bkb3duPi5sYWJlbH4udGV4dHtkaXNwbGF5Om5vbmV9LnVpLm11bHRpcGxlLnNlYXJjaC5kcm9wZG93bj5pbnB1dC5zZWFyY2h7cG9zaXRpb246c3RhdGljO3BhZGRpbmc6MDttYXgtd2lkdGg6MTAwJTttYXJnaW46LjQ1MjM4MDk1ZW0gMCAuNDUyMzgwOTVlbSAuNjQyODU3MTRlbTt3aWR0aDoyLjJlbTtsaW5lLWhlaWdodDoxLjIxNDI4NTcxZW19LnVpLmlubGluZS5kcm9wZG93bntjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztjb2xvcjppbmhlcml0fS51aS5pbmxpbmUuZHJvcGRvd24gLmRyb3Bkb3duLmljb257bWFyZ2luOjAgLjIxNDI4NTcxZW0gMCAuMjE0Mjg1NzFlbTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZX0udWkuaW5saW5lLmRyb3Bkb3duPi50ZXh0e2ZvbnQtd2VpZ2h0OjcwMH0udWkuaW5saW5lLmRyb3Bkb3duIC5tZW51e2N1cnNvcjphdXRvO21hcmdpbi10b3A6LjIxNDI4NTcxZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLmRyb3Bkb3duIC5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kOjAgMDtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuOTUpOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTt6LWluZGV4OjEyfS51aS5kcm9wZG93biAubWVudT4uaXRlbTpob3ZlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA1KTtjb2xvcjpyZ2JhKDAsMCwwLC45NSk7ei1pbmRleDoxM30udWkubG9hZGluZy5kcm9wZG93bj5pLmljb257aGVpZ2h0OjFlbSFpbXBvcnRhbnR9LnVpLmxvYWRpbmcuc2VsZWN0aW9uLmRyb3Bkb3duPmkuaWNvbntwYWRkaW5nOjEuNWVtIDEuMjg1NzE0MjllbSFpbXBvcnRhbnR9LnVpLmxvYWRpbmcuZHJvcGRvd24+aS5pY29uOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0uNjQyODU3MTRlbSAwIDAgLS42NDI4NTcxNGVtO3dpZHRoOjEuMjg1NzE0MjllbTtoZWlnaHQ6MS4yODU3MTQyOWVtO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlcjouMmVtIHNvbGlkIHJnYmEoMCwwLDAsLjEpfS51aS5sb2FkaW5nLmRyb3Bkb3duPmkuaWNvbjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDttYXJnaW46LS42NDI4NTcxNGVtIDAgMCAtLjY0Mjg1NzE0ZW07d2lkdGg6MS4yODU3MTQyOWVtO2hlaWdodDoxLjI4NTcxNDI5ZW07LXdlYmtpdC1hbmltYXRpb246ZHJvcGRvd24tc3BpbiAuNnMgbGluZWFyO2FuaW1hdGlvbjpkcm9wZG93bi1zcGluIC42cyBsaW5lYXI7LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyLWNvbG9yOiM3Njc2NzYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDouMmVtfS51aS5sb2FkaW5nLmRyb3Bkb3duLmJ1dHRvbj5pLmljb246YWZ0ZXIsLnVpLmxvYWRpbmcuZHJvcGRvd24uYnV0dG9uPmkuaWNvbjpiZWZvcmV7ZGlzcGxheTpub25lfUAtd2Via2l0LWtleWZyYW1lcyBkcm9wZG93bi1zcGlue2Zyb217LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDApO3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDM2MGRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIGRyb3Bkb3duLXNwaW57ZnJvbXstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMCk7dHJhbnNmb3JtOnJvdGF0ZSgwKX10b3std2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKTt0cmFuc2Zvcm06cm90YXRlKDM2MGRlZyl9fS51aS5kZWZhdWx0LmRyb3Bkb3duOm5vdCguYnV0dG9uKT4udGV4dCwudWkuZHJvcGRvd246bm90KC5idXR0b24pPi5kZWZhdWx0LnRleHR7Y29sb3I6cmdiYSgxOTEsMTkxLDE5MSwuODcpfS51aS5kZWZhdWx0LmRyb3Bkb3duOm5vdCguYnV0dG9uKT5pbnB1dDpmb2N1c34udGV4dCwudWkuZHJvcGRvd246bm90KC5idXR0b24pPmlucHV0OmZvY3Vzfi5kZWZhdWx0LnRleHR7Y29sb3I6cmdiYSgxMTUsMTE1LDExNSwuODcpfS51aS5sb2FkaW5nLmRyb3Bkb3duPi50ZXh0ey13ZWJraXQtdHJhbnNpdGlvbjpub25lO3RyYW5zaXRpb246bm9uZX0udWkuZHJvcGRvd24gLmxvYWRpbmcubWVudXtkaXNwbGF5OmJsb2NrO3Zpc2liaWxpdHk6aGlkZGVuO3otaW5kZXg6LTF9LnVpLmRyb3Bkb3duPi5sb2FkaW5nLm1lbnV7bGVmdDowIWltcG9ydGFudDtyaWdodDphdXRvIWltcG9ydGFudH0udWkuZHJvcGRvd24+Lm1lbnUgLmxvYWRpbmcubWVudXtsZWZ0OjEwMCUhaW1wb3J0YW50O3JpZ2h0OmF1dG8haW1wb3J0YW50fS51aS5kcm9wZG93biAubWVudSAuc2VsZWN0ZWQuaXRlbSwudWkuZHJvcGRvd24uc2VsZWN0ZWR7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wMyk7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5kcm9wZG93bj4uZmlsdGVyZWQudGV4dHt2aXNpYmlsaXR5OmhpZGRlbn0udWkuZHJvcGRvd24gLmZpbHRlcmVkLml0ZW17ZGlzcGxheTpub25lIWltcG9ydGFudH0udWkuZHJvcGRvd24uZXJyb3IsLnVpLmRyb3Bkb3duLmVycm9yPi5kZWZhdWx0LnRleHQsLnVpLmRyb3Bkb3duLmVycm9yPi50ZXh0e2NvbG9yOiM5ZjNhMzh9LnVpLnNlbGVjdGlvbi5kcm9wZG93bi5lcnJvcntiYWNrZ3JvdW5kOiNmZmY2ZjY7Ym9yZGVyLWNvbG9yOiNlMGI0YjR9LnVpLnNlbGVjdGlvbi5kcm9wZG93bi5lcnJvcjpob3Zlcntib3JkZXItY29sb3I6I2UwYjRiNH0udWkuZHJvcGRvd24uZXJyb3I+Lm1lbnUsLnVpLmRyb3Bkb3duLmVycm9yPi5tZW51IC5tZW51e2JvcmRlci1jb2xvcjojZTBiNGI0fS51aS5kcm9wZG93bi5lcnJvcj4ubWVudT4uaXRlbXtjb2xvcjojOWYzYTM4fS51aS5tdWx0aXBsZS5zZWxlY3Rpb24uZXJyb3IuZHJvcGRvd24+LmxhYmVse2JvcmRlci1jb2xvcjojZTBiNGI0fS51aS5kcm9wZG93bi5lcnJvcj4ubWVudT4uaXRlbTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmYyZjJ9LnVpLmRyb3Bkb3duLmVycm9yPi5tZW51IC5hY3RpdmUuaXRlbXtiYWNrZ3JvdW5kLWNvbG9yOiNmZGNmY2Z9LnVpLmRyb3Bkb3duPi5jbGVhci5kcm9wZG93bi5pY29ue29wYWNpdHk6Ljg7LXdlYmtpdC10cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlfS51aS5kcm9wZG93bj4uY2xlYXIuZHJvcGRvd24uaWNvbjpob3ZlcntvcGFjaXR5OjF9LnVpLmRpc2FibGVkLmRyb3Bkb3duLC51aS5kcm9wZG93biAubWVudT4uZGlzYWJsZWQuaXRlbXtjdXJzb3I6ZGVmYXVsdDtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6LjQ1fS51aS5kcm9wZG93biAubWVudXtsZWZ0OjB9LnVpLmRyb3Bkb3duIC5tZW51IC5yaWdodC5tZW51LC51aS5kcm9wZG93biAucmlnaHQubWVudT4ubWVudXtsZWZ0OjEwMCUhaW1wb3J0YW50O3JpZ2h0OmF1dG8haW1wb3J0YW50O2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkuZHJvcGRvd24+LmxlZnQubWVudXtsZWZ0OmF1dG8haW1wb3J0YW50O3JpZ2h0OjAhaW1wb3J0YW50fS51aS5kcm9wZG93biAubWVudSAubGVmdC5tZW51LC51aS5kcm9wZG93bj4ubGVmdC5tZW51IC5tZW51e2xlZnQ6YXV0bztyaWdodDoxMDAlO21hcmdpbjowIC0uNWVtIDAgMCFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS5kcm9wZG93biAuaXRlbSAubGVmdC5kcm9wZG93bi5pY29uLC51aS5kcm9wZG93biAubGVmdC5tZW51IC5pdGVtIC5kcm9wZG93bi5pY29ue3dpZHRoOmF1dG87ZmxvYXQ6bGVmdDttYXJnaW46MH0udWkuZHJvcGRvd24gLml0ZW0gLmxlZnQuZHJvcGRvd24uaWNvbiwudWkuZHJvcGRvd24gLmxlZnQubWVudSAuaXRlbSAuZHJvcGRvd24uaWNvbnt3aWR0aDphdXRvO2Zsb2F0OmxlZnQ7bWFyZ2luOjB9LnVpLmRyb3Bkb3duIC5pdGVtIC5sZWZ0LmRyb3Bkb3duLmljb24rLnRleHQsLnVpLmRyb3Bkb3duIC5sZWZ0Lm1lbnUgLml0ZW0gLmRyb3Bkb3duLmljb24rLnRleHR7bWFyZ2luLWxlZnQ6MWVtO21hcmdpbi1yaWdodDowfS51aS51cHdhcmQuZHJvcGRvd24+Lm1lbnV7dG9wOmF1dG87Ym90dG9tOjEwMCU7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAzcHggMCByZ2JhKDAsMCwwLC4wOCk7Ym94LXNoYWRvdzowIDAgM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDB9LnVpLmRyb3Bkb3duIC51cHdhcmQubWVudXt0b3A6YXV0byFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50fS51aS5zaW1wbGUudXB3YXJkLmFjdGl2ZS5kcm9wZG93biwudWkuc2ltcGxlLnVwd2FyZC5kcm9wZG93bjpob3Zlcntib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW0gMCAwIWltcG9ydGFudH0udWkudXB3YXJkLmRyb3Bkb3duLmJ1dHRvbjpub3QoLnBvaW50aW5nKTpub3QoLmZsb2F0aW5nKS5hY3RpdmV7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkudXB3YXJkLnNlbGVjdGlvbi5kcm9wZG93biAubWVudXtib3JkZXItdG9wLXdpZHRoOjFweCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS13aWR0aDowIWltcG9ydGFudDstd2Via2l0LWJveC1zaGFkb3c6MCAtMnB4IDNweCAwIHJnYmEoMCwwLDAsLjA4KTtib3gtc2hhZG93OjAgLTJweCAzcHggMCByZ2JhKDAsMCwwLC4wOCl9LnVpLnVwd2FyZC5zZWxlY3Rpb24uZHJvcGRvd246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAycHggMCByZ2JhKDAsMCwwLC4wNSk7Ym94LXNoYWRvdzowIDAgMnB4IDAgcmdiYSgwLDAsMCwuMDUpfS51aS5hY3RpdmUudXB3YXJkLnNlbGVjdGlvbi5kcm9wZG93bntib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkudXB3YXJkLnNlbGVjdGlvbi5kcm9wZG93bi52aXNpYmxley13ZWJraXQtYm94LXNoYWRvdzowIDAgM3B4IDAgcmdiYSgwLDAsMCwuMDgpO2JveC1zaGFkb3c6MCAwIDNweCAwIHJnYmEoMCwwLDAsLjA4KTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkudXB3YXJkLmFjdGl2ZS5zZWxlY3Rpb24uZHJvcGRvd246aG92ZXJ7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAzcHggMCByZ2JhKDAsMCwwLC4wNSk7Ym94LXNoYWRvdzowIDAgM3B4IDAgcmdiYSgwLDAsMCwuMDUpfS51aS51cHdhcmQuYWN0aXZlLnNlbGVjdGlvbi5kcm9wZG93bjpob3ZlciAubWVudXstd2Via2l0LWJveC1zaGFkb3c6MCAtMnB4IDNweCAwIHJnYmEoMCwwLDAsLjA4KTtib3gtc2hhZG93OjAgLTJweCAzcHggMCByZ2JhKDAsMCwwLC4wOCl9LnVpLmRyb3Bkb3duIC5zY3JvbGxpbmcubWVudSwudWkuc2Nyb2xsaW5nLmRyb3Bkb3duIC5tZW51e292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0b30udWkuc2Nyb2xsaW5nLmRyb3Bkb3duIC5tZW51e292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNoO21pbi13aWR0aDoxMDAlIWltcG9ydGFudDt3aWR0aDphdXRvIWltcG9ydGFudH0udWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51e3Bvc2l0aW9uOnN0YXRpYztvdmVyZmxvdy15OmF1dG87Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7bWluLXdpZHRoOjEwMCUhaW1wb3J0YW50O3dpZHRoOmF1dG8haW1wb3J0YW50O2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KX0udWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51Pi5pdGVtLml0ZW0uaXRlbSwudWkuc2Nyb2xsaW5nLmRyb3Bkb3duIC5tZW51IC5pdGVtLml0ZW0uaXRlbXtib3JkZXItdG9wOm5vbmV9LnVpLmRyb3Bkb3duIC5zY3JvbGxpbmcubWVudSAuaXRlbTpmaXJzdC1jaGlsZCwudWkuc2Nyb2xsaW5nLmRyb3Bkb3duIC5tZW51IC5pdGVtOmZpcnN0LWNoaWxke2JvcmRlci10b3A6bm9uZX0udWkuZHJvcGRvd24+LmFuaW1hdGluZy5tZW51IC5zY3JvbGxpbmcubWVudSwudWkuZHJvcGRvd24+LnZpc2libGUubWVudSAuc2Nyb2xsaW5nLm1lbnV7ZGlzcGxheTpibG9ja31AbWVkaWEgYWxsIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6bm9uZSl7LnVpLmRyb3Bkb3duIC5zY3JvbGxpbmcubWVudSwudWkuc2Nyb2xsaW5nLmRyb3Bkb3duIC5tZW51e21pbi13aWR0aDpjYWxjKDEwMCUgLSAxN3B4KX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51LC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoxMC4yODU3MTQyOXJlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KXsudWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51LC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoxNS40Mjg1NzE0M3JlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjk5MnB4KXsudWkuZHJvcGRvd24gLnNjcm9sbGluZy5tZW51LC51aS5zY3JvbGxpbmcuZHJvcGRvd24gLm1lbnV7bWF4LWhlaWdodDoyMC41NzE0Mjg1N3JlbX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLmRyb3Bkb3duIC5zY3JvbGxpbmcubWVudSwudWkuc2Nyb2xsaW5nLmRyb3Bkb3duIC5tZW51e21heC1oZWlnaHQ6MjAuNTcxNDI4NTdyZW19fS51aS5zaW1wbGUuZHJvcGRvd24gLm1lbnU6YWZ0ZXIsLnVpLnNpbXBsZS5kcm9wZG93biAubWVudTpiZWZvcmV7ZGlzcGxheTpub25lfS51aS5zaW1wbGUuZHJvcGRvd24gLm1lbnV7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47dG9wOi05OTk5cHghaW1wb3J0YW50O29wYWNpdHk6MDt3aWR0aDowO2hlaWdodDowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMXMgZWFzZX0udWkuc2ltcGxlLmFjdGl2ZS5kcm9wZG93biwudWkuc2ltcGxlLmRyb3Bkb3duOmhvdmVye2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6MCFpbXBvcnRhbnQ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6MCFpbXBvcnRhbnR9LnVpLnNpbXBsZS5hY3RpdmUuZHJvcGRvd24+Lm1lbnUsLnVpLnNpbXBsZS5kcm9wZG93bjpob3Zlcj4ubWVudXtvdmVyZmxvdzp2aXNpYmxlO3dpZHRoOmF1dG87aGVpZ2h0OmF1dG87dG9wOjEwMCUhaW1wb3J0YW50O29wYWNpdHk6MX0udWkuc2ltcGxlLmRyb3Bkb3duOmhvdmVyPi5tZW51Pi5pdGVtOmhvdmVyPi5tZW51LC51aS5zaW1wbGUuZHJvcGRvd24+Lm1lbnU+Lml0ZW06YWN0aXZlPi5tZW51e292ZXJmbG93OnZpc2libGU7d2lkdGg6YXV0bztoZWlnaHQ6YXV0bzt0b3A6MCFpbXBvcnRhbnQ7bGVmdDoxMDAlIWltcG9ydGFudDtvcGFjaXR5OjF9LnVpLnNpbXBsZS5kaXNhYmxlZC5kcm9wZG93bjpob3ZlciAubWVudXtkaXNwbGF5Om5vbmU7aGVpZ2h0OjA7d2lkdGg6MDtvdmVyZmxvdzpoaWRkZW59LnVpLnNpbXBsZS52aXNpYmxlLmRyb3Bkb3duPi5tZW51e2Rpc3BsYXk6YmxvY2t9LnVpLmZsdWlkLmRyb3Bkb3due2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4td2lkdGg6MH0udWkuZmx1aWQuZHJvcGRvd24+LmRyb3Bkb3duLmljb257ZmxvYXQ6cmlnaHR9LnVpLmZsb2F0aW5nLmRyb3Bkb3duIC5tZW51e2xlZnQ6MDtyaWdodDphdXRvOy13ZWJraXQtYm94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KSFpbXBvcnRhbnQ7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0haW1wb3J0YW50fS51aS5mbG9hdGluZy5kcm9wZG93bj4ubWVudXttYXJnaW4tdG9wOi41ZW0haW1wb3J0YW50O2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIWltcG9ydGFudH0udWkucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnV7dG9wOjEwMCU7bWFyZ2luLXRvcDouNzg1NzE0MjlyZW07Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtjb250ZW50OicnO3Zpc2liaWxpdHk6dmlzaWJsZTstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3dpZHRoOi41ZW07aGVpZ2h0Oi41ZW07LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6LTFweCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7YmFja2dyb3VuZDojZmZmO3otaW5kZXg6Mn0udWkucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7dG9wOi0uMjVlbTtsZWZ0OjUwJTttYXJnaW46MCAwIDAgLS4yNWVtfS51aS50b3AubGVmdC5wb2ludGluZy5kcm9wZG93bj4ubWVudXt0b3A6MTAwJTtib3R0b206YXV0bztsZWZ0OjA7cmlnaHQ6YXV0bzttYXJnaW46MWVtIDAgMH0udWkudG9wLmxlZnQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnV7dG9wOjEwMCU7Ym90dG9tOmF1dG87bGVmdDowO3JpZ2h0OmF1dG87bWFyZ2luOjFlbSAwIDB9LnVpLnRvcC5sZWZ0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye3RvcDotLjI1ZW07bGVmdDoxZW07cmlnaHQ6YXV0bzttYXJnaW46MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpfS51aS50b3AucmlnaHQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnV7dG9wOjEwMCU7Ym90dG9tOmF1dG87cmlnaHQ6MDtsZWZ0OmF1dG87bWFyZ2luOjFlbSAwIDB9LnVpLnRvcC5wb2ludGluZy5kcm9wZG93bj4ubGVmdC5tZW51OmFmdGVyLC51aS50b3AucmlnaHQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnU6YWZ0ZXJ7dG9wOi0uMjVlbTtsZWZ0OmF1dG8haW1wb3J0YW50O3JpZ2h0OjFlbSFpbXBvcnRhbnQ7bWFyZ2luOjA7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0udWkubGVmdC5wb2ludGluZy5kcm9wZG93bj4ubWVudXt0b3A6MDtsZWZ0OjEwMCU7cmlnaHQ6YXV0bzttYXJnaW46MCAwIDAgMWVtfS51aS5sZWZ0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye3RvcDoxZW07bGVmdDotLjI1ZW07bWFyZ2luOjA7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKC00NWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS51aS5sZWZ0Om5vdCgudG9wKTpub3QoLmJvdHRvbSkucG9pbnRpbmcuZHJvcGRvd24+LmxlZnQubWVudXtsZWZ0OmF1dG8haW1wb3J0YW50O3JpZ2h0OjEwMCUhaW1wb3J0YW50O21hcmdpbjowIDFlbSAwIDB9LnVpLmxlZnQ6bm90KC50b3ApOm5vdCguYm90dG9tKS5wb2ludGluZy5kcm9wZG93bj4ubGVmdC5tZW51OmFmdGVye3RvcDoxZW07bGVmdDphdXRvO3JpZ2h0Oi0uMjVlbTttYXJnaW46MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMTM1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDEzNWRlZyl9LnVpLnJpZ2h0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51e3RvcDowO2xlZnQ6YXV0bztyaWdodDoxMDAlO21hcmdpbjowIDFlbSAwIDB9LnVpLnJpZ2h0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye3RvcDoxZW07bGVmdDphdXRvO3JpZ2h0Oi0uMjVlbTttYXJnaW46MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoMTM1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDEzNWRlZyl9LnVpLmJvdHRvbS5wb2ludGluZy5kcm9wZG93bj4ubWVudXt0b3A6YXV0bztib3R0b206MTAwJTtsZWZ0OjA7cmlnaHQ6YXV0bzttYXJnaW46MCAwIDFlbX0udWkuYm90dG9tLnBvaW50aW5nLmRyb3Bkb3duPi5tZW51OmFmdGVye3RvcDphdXRvO2JvdHRvbTotLjI1ZW07cmlnaHQ6YXV0bzttYXJnaW46MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoLTEzNWRlZyk7dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0udWkuYm90dG9tLnBvaW50aW5nLmRyb3Bkb3duPi5tZW51IC5tZW51e3RvcDphdXRvIWltcG9ydGFudDtib3R0b206MCFpbXBvcnRhbnR9LnVpLmJvdHRvbS5sZWZ0LnBvaW50aW5nLmRyb3Bkb3duPi5tZW51e2xlZnQ6MDtyaWdodDphdXRvfS51aS5ib3R0b20ubGVmdC5wb2ludGluZy5kcm9wZG93bj4ubWVudTphZnRlcntsZWZ0OjFlbTtyaWdodDphdXRvfS51aS5ib3R0b20ucmlnaHQucG9pbnRpbmcuZHJvcGRvd24+Lm1lbnV7cmlnaHQ6MDtsZWZ0OmF1dG99LnVpLmJvdHRvbS5yaWdodC5wb2ludGluZy5kcm9wZG93bj4ubWVudTphZnRlcntsZWZ0OmF1dG87cmlnaHQ6MWVtfS51aS5wb2ludGluZy51cHdhcmQuZHJvcGRvd24gLm1lbnUsLnVpLnRvcC5wb2ludGluZy51cHdhcmQuZHJvcGRvd24gLm1lbnV7dG9wOmF1dG8haW1wb3J0YW50O2JvdHRvbToxMDAlIWltcG9ydGFudDttYXJnaW46MCAwIC43ODU3MTQyOXJlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkucG9pbnRpbmcudXB3YXJkLmRyb3Bkb3duIC5tZW51OmFmdGVyLC51aS50b3AucG9pbnRpbmcudXB3YXJkLmRyb3Bkb3duIC5tZW51OmFmdGVye3RvcDoxMDAlIWltcG9ydGFudDtib3R0b206YXV0byFpbXBvcnRhbnQ7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAxcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjFweCAxcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KTttYXJnaW46LS4yNWVtIDAgMH0udWkucmlnaHQucG9pbnRpbmcudXB3YXJkLmRyb3Bkb3duOm5vdCgudG9wKTpub3QoLmJvdHRvbSkgLm1lbnV7dG9wOmF1dG8haW1wb3J0YW50O2JvdHRvbTowIWltcG9ydGFudDttYXJnaW46MCAxZW0gMCAwfS51aS5yaWdodC5wb2ludGluZy51cHdhcmQuZHJvcGRvd246bm90KC50b3ApOm5vdCguYm90dG9tKSAubWVudTphZnRlcnt0b3A6YXV0byFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50O21hcmdpbjowIDAgMWVtIDA7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6LTFweCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLmxlZnQucG9pbnRpbmcudXB3YXJkLmRyb3Bkb3duOm5vdCgudG9wKTpub3QoLmJvdHRvbSkgLm1lbnV7dG9wOmF1dG8haW1wb3J0YW50O2JvdHRvbTowIWltcG9ydGFudDttYXJnaW46MCAwIDAgMWVtfS51aS5sZWZ0LnBvaW50aW5nLnVwd2FyZC5kcm9wZG93bjpub3QoLnRvcCk6bm90KC5ib3R0b20pIC5tZW51OmFmdGVye3RvcDphdXRvIWltcG9ydGFudDtib3R0b206MCFpbXBvcnRhbnQ7bWFyZ2luOjAgMCAxZW0gMDstd2Via2l0LWJveC1zaGFkb3c6LTFweCAtMXB4IDAgMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwIHJnYmEoMzQsMzYsMzgsLjE1KX1AZm9udC1mYWNle2ZvbnQtZmFtaWx5OkRyb3Bkb3duO3NyYzp1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUFWZ0FBOEFBQUFBQ0ZBQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJHUmxSTkFBQUJXQUFBQUJ3QUFBQWNoR2dhcTBkRVJVWUFBQUYwQUFBQUhBQUFBQjRBSndBUFQxTXZNZ0FBQVpBQUFBQkRBQUFBVm5XNFRKZGpiV0Z3QUFBQjFBQUFBRXNBQUFGUzhDY2FxbU4yZENBQUFBSWdBQUFBQkFBQUFBUUFFUUZFWjJGemNBQUFBaVFBQUFBSUFBQUFDUC8vQUFObmJIbG1BQUFDTEFBQUFRb0FBQUdrclJIUDlXaGxZV1FBQUFNNEFBQUFNQUFBQURZUEs4WXlhR2hsWVFBQUEyZ0FBQUFkQUFBQUpBTkNBYjFvYlhSNEFBQURpQUFBQUNJQUFBQWlDQmtBT0d4dlkyRUFBQU9zQUFBQUZBQUFBQlFCbkFJeWJXRjRjQUFBQThBQUFBQWZBQUFBSUFFVkFGNXVZVzFsQUFBRDRBQUFBVEFBQUFLTUZHbGo1SEJ2YzNRQUFBVVFBQUFBUmdBQUFISm9lZGpxZDJWaVpnQUFCVmdBQUFBR0FBQUFCck83VzVVQUFBQUJBQUFBQU5YdWxQVUFBQUFBMXI0aGdBQUFBQURYdTJRMWVOcGpZR1JnWU9BQllqRWdabUpnQkVJT0lHWUI4eGdBQS9ZQU4zamFZMkJrdEdPY3dNREt3TUk0alRHTmdZSEJIVXAvWlpCa2FHRmdZR0pnWldiQUNnTFNYRk1ZSEZUL2ZMakZlT0QvQVFZOXhqTU1ia0JoUnBBY0FONDhEUVlBZU5wallHQmdab0JnR1FaR0JoRHdBZklZd1h3V0JnTWd6UUdFVEF3TXFuOCs4SDY0OWY4L2xIWDkvLzliN1B6ZitmV2d1c0NBa1kwQnptVUU2Z0hwUXdHTURNTWVBQUNieGc3U0FBQVJBVVFBQUFBQi8vOEFBbmphZFpCUFNzTkFHTVhmUyt5TXFZZ09ocFN1U2xLYWRtVWhpVkVoRU1RekZGMjJtMTdCYmJ2ekNoNUJYQ1VuNkVHOGdqZVE0RGVwd1lvNGkrL2ZmTDk1ajRFREErQ0ZDN2pRdUt5SWVWSHJJM3drbGVxOUY3WHJTSW5LdGVPZUhkZGE4Yk9vYWVlcFNjMDBOV1B6L0xSZWM5RzhHYWJ5R3RFZEY3aDE5ejAzM0dBTVRLN3piTTQyeE5FWnB6WW9mMFJ0UTVDVUhBUUo3M090Vnl1dGMrM2I3T3UvL2I4WE5sc1B4M2pnalVpZkFCZGhFb2hLSkpMNWlNNXAzOXVxYzdYMStzUlFTcW1HclVWaGxzSjRscG1FVVZ3eVQ4U1VZdGcwUDlEeU56UEFERHMrdGpyR1Y2S1JDUmZzdWkzZUhjTDQvcDhaWHZmTWxjbkVVK0NMdjdoRHlrT1ArQUtUUFR4YkFBQjQybU5nWkdCZ0FHS3VmNUtQNHZsdHZqTElNekdBd0xWOWlnMGcrdnJ1RkZNUXpkakFDT0p6TUlDbEFSaDBDVEo0Mm1OZ1pHQmdQUEQvQUpEOHdnQUVqQTBNakF5b2dBTUFiT1FFQVFBQUFBQzdBQkVBQUFBQUFLb0FBQUgwQUFBQmdBQUFBVUFBQ0FGQUFBZ0F3QUFYQUFBQUFBQUFBQ29BS2dBcUFESUFiQUNHQUtBQXVnRFNlTnBqWUdSZ1lPQmtVR0ZnWWdBQkVNa0ZoQXdNL3huMFFBSUFEZFVCZEFCNDJxV1F2VW9EUVJTRnYzR2phSVNVUWF5bVNtR3hKb0dBc1JDMGlQWUxzVTUwWTZJeHJ2bFJ0UENKSktVUElCYitQSUh2NEVONGRqS3VLQXFDREhmbXUrZmVPZHdab01DVUFKTmJBbFlVTXphVWxNMTRqanhibmdPcTdIbk9pYTg5ejFQazF2TUNhOXg3enRQa3pmTXlKYlBqK1pHaTZYcCtvbXh1UEQremFEN21lYUZnN21iOEdyQnFIbWh3eG9BeGxtMHVpUmtwUDlYNW0yNnBLUm9NeFRHUjFENDlEdi9ZYi85MW82bDhxTDZldTVuMmhaUXpuNjh1dFI5bTNGVTJjQjR0OWNkU0xHMnV0SSs0NEVoL1A5YnFLTytvSi9XeG1Yc3NqNzdZa3JqYXNaUUQ2U0ZkZHl0aGszV3R6cmYrVUYycDA3NlVkbGExVk56c0VSUDNra2pWUktlbDdtcDF1ZFhZY0h0WlNsVjdSZm1KZTFHaUZXdmVsdWFlS0Q1L011SmNTazhUcG0vdnZ3UElibUpsZU5wallHS0FBRllHN0lDVGdZR1JpWkdaa1lXUmxaR05rWjJSZzVHVExUMm5zaURERUVJWnNaZm1aUnFadWptRGFEY0RBeGNJN1dJT3BTMmd0Q1dVZGdRQVprY1NtUUFBQUFGYmxiTzZBQUE9KSBmb3JtYXQoJ3dvZmYnKTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWx9LnVpLmRyb3Bkb3duPi5kcm9wZG93bi5pY29ue2ZvbnQtZmFtaWx5OkRyb3Bkb3duO2xpbmUtaGVpZ2h0OjE7aGVpZ2h0OjFlbTt3aWR0aDoxLjIzZW07LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLmRyb3Bkb3duPi5kcm9wZG93bi5pY29ue3dpZHRoOmF1dG99LnVpLmRyb3Bkb3duPi5kcm9wZG93bi5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjBkNyd9LnVpLmRyb3Bkb3duIC5tZW51IC5pdGVtIC5kcm9wZG93bi5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjBkYSd9LnVpLmRyb3Bkb3duIC5pdGVtIC5sZWZ0LmRyb3Bkb3duLmljb246YmVmb3JlLC51aS5kcm9wZG93biAubGVmdC5tZW51IC5pdGVtIC5kcm9wZG93bi5pY29uOmJlZm9yZXtjb250ZW50OlxcXCJcXFxcZjBkOVxcXCJ9LnVpLnZlcnRpY2FsLm1lbnUgLmRyb3Bkb3duLml0ZW0+LmRyb3Bkb3duLmljb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMGRhXFxcIn0udWkuZHJvcGRvd24+LmNsZWFyLmljb246YmVmb3Jle2NvbnRlbnQ6XFxcIlxcXFxmMDBkXFxcIn0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gVmlkZW9cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5lbWJlZHtwb3NpdGlvbjpyZWxhdGl2ZTttYXgtd2lkdGg6MTAwJTtoZWlnaHQ6MDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDojZGNkZGRlO3BhZGRpbmctYm90dG9tOjU2LjI1JX0udWkuZW1iZWQgZW1iZWQsLnVpLmVtYmVkIGlmcmFtZSwudWkuZW1iZWQgb2JqZWN0e3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlcjpub25lO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dG9wOjA7bGVmdDowO21hcmdpbjowO3BhZGRpbmc6MH0udWkuZW1iZWQ+LmVtYmVke2Rpc3BsYXk6bm9uZX0udWkuZW1iZWQ+LnBsYWNlaG9sZGVye3Bvc2l0aW9uOmFic29sdXRlO2N1cnNvcjpwb2ludGVyO3RvcDowO2xlZnQ6MDtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7YmFja2dyb3VuZC1jb2xvcjpyYWRpYWwtZ3JhZGllbnQodHJhbnNwYXJlbnQgNDUlLHJnYmEoMCwwLDAsLjMpKX0udWkuZW1iZWQ+Lmljb257Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ei1pbmRleDoyfS51aS5lbWJlZD4uaWNvbjphZnRlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt6LWluZGV4OjM7Y29udGVudDonJztiYWNrZ3JvdW5kOi13ZWJraXQtcmFkaWFsLWdyYWRpZW50KHRyYW5zcGFyZW50IDQ1JSxyZ2JhKDAsMCwwLC4zKSk7YmFja2dyb3VuZDpyYWRpYWwtZ3JhZGllbnQodHJhbnNwYXJlbnQgNDUlLHJnYmEoMCwwLDAsLjMpKTtvcGFjaXR5Oi41Oy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41cyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZX0udWkuZW1iZWQ+Lmljb246YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7bGVmdDo1MCU7ei1pbmRleDo0Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgdHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC01MCUpO2NvbG9yOiNmZmY7Zm9udC1zaXplOjZyZW07dGV4dC1zaGFkb3c6MCAycHggMTBweCByZ2JhKDM0LDM2LDM4LC4yKTstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuNXMgZWFzZSxjb2xvciAuNXMgZWFzZTt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzIGVhc2UsY29sb3IgLjVzIGVhc2U7ei1pbmRleDoxMH0udWkuZW1iZWQgLmljb246aG92ZXI6YWZ0ZXJ7YmFja2dyb3VuZDotd2Via2l0LXJhZGlhbC1ncmFkaWVudCh0cmFuc3BhcmVudCA0NSUscmdiYSgwLDAsMCwuMykpO2JhY2tncm91bmQ6cmFkaWFsLWdyYWRpZW50KHRyYW5zcGFyZW50IDQ1JSxyZ2JhKDAsMCwwLC4zKSk7b3BhY2l0eToxfS51aS5lbWJlZCAuaWNvbjpob3ZlcjpiZWZvcmV7Y29sb3I6I2ZmZn0udWkuYWN0aXZlLmVtYmVkPi5pY29uLC51aS5hY3RpdmUuZW1iZWQ+LnBsYWNlaG9sZGVye2Rpc3BsYXk6bm9uZX0udWkuYWN0aXZlLmVtYmVkPi5lbWJlZHtkaXNwbGF5OmJsb2NrfS51aS5zcXVhcmUuZW1iZWR7cGFkZGluZy1ib3R0b206MTAwJX0udWlbY2xhc3MqPVxcXCI0OjNcXFwiXS5lbWJlZHtwYWRkaW5nLWJvdHRvbTo3NSV9LnVpW2NsYXNzKj1cXFwiMTY6OVxcXCJdLmVtYmVke3BhZGRpbmctYm90dG9tOjU2LjI1JX0udWlbY2xhc3MqPVxcXCIyMTo5XFxcIl0uZW1iZWR7cGFkZGluZy1ib3R0b206NDIuODU3MTQyODYlfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBNb2RhbFxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLm1vZGFse3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6bm9uZTt6LWluZGV4OjEwMDE7dGV4dC1hbGlnbjpsZWZ0O2JhY2tncm91bmQ6I2ZmZjtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6MXB4IDNweCAzcHggMCByZ2JhKDAsMCwwLC4yKSwxcHggM3B4IDE1cHggMnB4IHJnYmEoMCwwLDAsLjIpO2JveC1zaGFkb3c6MXB4IDNweCAzcHggMCByZ2JhKDAsMCwwLC4yKSwxcHggM3B4IDE1cHggMnB4IHJnYmEoMCwwLDAsLjIpOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjo1MCUgMjUlO3RyYW5zZm9ybS1vcmlnaW46NTAlIDI1JTstd2Via2l0LWJveC1mbGV4OjA7LW1zLWZsZXg6MCAwIGF1dG87ZmxleDowIDAgYXV0bztib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7LW1vei11c2VyLXNlbGVjdDp0ZXh0Oy1tcy11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHQ7d2lsbC1jaGFuZ2U6dG9wLGxlZnQsbWFyZ2luLHRyYW5zZm9ybSxvcGFjaXR5fS51aS5tb2RhbD4uaWNvbjpmaXJzdC1jaGlsZCsqLC51aS5tb2RhbD46Zmlyc3QtY2hpbGQ6bm90KC5pY29uKXtib3JkZXItdG9wLWxlZnQtcmFkaXVzOi4yODU3MTQyOXJlbTtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czouMjg1NzE0MjlyZW19LnVpLm1vZGFsPjpsYXN0LWNoaWxke2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6LjI4NTcxNDI5cmVtO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOi4yODU3MTQyOXJlbX0udWkubW9kYWw+LmNsb3Nle2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOmFic29sdXRlO3RvcDotMi41cmVtO3JpZ2h0Oi0yLjVyZW07ei1pbmRleDoxO29wYWNpdHk6Ljg7Zm9udC1zaXplOjEuMjVlbTtjb2xvcjojZmZmO3dpZHRoOjIuMjVyZW07aGVpZ2h0OjIuMjVyZW07cGFkZGluZzouNjI1cmVtIDAgMCAwfS51aS5tb2RhbD4uY2xvc2U6aG92ZXJ7b3BhY2l0eToxfS51aS5tb2RhbD4uaGVhZGVye2Rpc3BsYXk6YmxvY2s7Zm9udC1mYW1pbHk6TGF0bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6I2ZmZjttYXJnaW46MDtwYWRkaW5nOjEuMjVyZW0gMS41cmVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtjb2xvcjpyZ2JhKDAsMCwwLC44NSk7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5tb2RhbD4uaGVhZGVyOm5vdCgudWkpe2ZvbnQtc2l6ZToxLjQyODU3MTQzcmVtO2xpbmUtaGVpZ2h0OjEuMjg1NzE0MjllbTtmb250LXdlaWdodDo3MDB9LnVpLm1vZGFsPi5jb250ZW50e2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtmb250LXNpemU6MWVtO2xpbmUtaGVpZ2h0OjEuNDtwYWRkaW5nOjEuNXJlbTtiYWNrZ3JvdW5kOiNmZmZ9LnVpLm1vZGFsPi5pbWFnZS5jb250ZW50e2Rpc3BsYXk6LXdlYmtpdC1ib3g7ZGlzcGxheTotbXMtZmxleGJveDtkaXNwbGF5OmZsZXg7LXdlYmtpdC1ib3gtb3JpZW50Omhvcml6b250YWw7LXdlYmtpdC1ib3gtZGlyZWN0aW9uOm5vcm1hbDstbXMtZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtZGlyZWN0aW9uOnJvd30udWkubW9kYWw+LmNvbnRlbnQ+LmltYWdle2Rpc3BsYXk6YmxvY2s7LXdlYmtpdC1ib3gtZmxleDowOy1tcy1mbGV4OjAgMSBhdXRvO2ZsZXg6MCAxIGF1dG87d2lkdGg6Jyc7LW1zLWZsZXgtaXRlbS1hbGlnbjp0b3A7YWxpZ24tc2VsZjp0b3B9LnVpLm1vZGFsPltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl17LW1zLWZsZXgtaXRlbS1hbGlnbjp0b3A7YWxpZ24tc2VsZjp0b3B9LnVpLm1vZGFsPltjbGFzcyo9XFxcIm1pZGRsZSBhbGlnbmVkXFxcIl17LW1zLWZsZXgtaXRlbS1hbGlnbjptaWRkbGU7YWxpZ24tc2VsZjptaWRkbGV9LnVpLm1vZGFsPltjbGFzcyo9c3RyZXRjaGVkXXstbXMtZmxleC1pdGVtLWFsaWduOnN0cmV0Y2g7YWxpZ24tc2VsZjpzdHJldGNofS51aS5tb2RhbD4uY29udGVudD4uZGVzY3JpcHRpb257ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1mbGV4OjE7LW1zLWZsZXg6MSAwIGF1dG87ZmxleDoxIDAgYXV0bzttaW4td2lkdGg6MDstbXMtZmxleC1pdGVtLWFsaWduOnRvcDthbGlnbi1zZWxmOnRvcH0udWkubW9kYWw+LmNvbnRlbnQ+Lmljb24rLmRlc2NyaXB0aW9uLC51aS5tb2RhbD4uY29udGVudD4uaW1hZ2UrLmRlc2NyaXB0aW9uey13ZWJraXQtYm94LWZsZXg6MDstbXMtZmxleDowIDEgYXV0bztmbGV4OjAgMSBhdXRvO21pbi13aWR0aDonJzt3aWR0aDphdXRvO3BhZGRpbmctbGVmdDoyZW19LnVpLm1vZGFsPi5jb250ZW50Pi5pbWFnZT5pLmljb257bWFyZ2luOjA7b3BhY2l0eToxO3dpZHRoOmF1dG87bGluZS1oZWlnaHQ6MTtmb250LXNpemU6OHJlbX0udWkubW9kYWw+LmFjdGlvbnN7YmFja2dyb3VuZDojZjlmYWZiO3BhZGRpbmc6MXJlbSAxcmVtO2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTt0ZXh0LWFsaWduOnJpZ2h0fS51aS5tb2RhbCAuYWN0aW9ucz4uYnV0dG9ue21hcmdpbi1sZWZ0Oi43NWVtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLm1vZGFse3dpZHRoOjk1JTttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjc2OHB4KXsudWkubW9kYWx7d2lkdGg6ODglO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5tb2RhbHt3aWR0aDo4NTBweDttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEyMDBweCl7LnVpLm1vZGFse3dpZHRoOjkwMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkubW9kYWx7d2lkdGg6OTUwcHg7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo5OTFweCl7LnVpLm1vZGFsPi5oZWFkZXJ7cGFkZGluZy1yaWdodDoyLjI1cmVtfS51aS5tb2RhbD4uY2xvc2V7dG9wOjEuMDUzNXJlbTtyaWdodDoxcmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkubW9kYWw+LmhlYWRlcntwYWRkaW5nOi43NXJlbSAxcmVtIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjIuMjVyZW0haW1wb3J0YW50fS51aS5tb2RhbD4uY29udGVudHtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MXJlbSFpbXBvcnRhbnR9LnVpLm1vZGFsPi5jbG9zZXt0b3A6LjVyZW0haW1wb3J0YW50O3JpZ2h0Oi41cmVtIWltcG9ydGFudH0udWkubW9kYWwgLmltYWdlLmNvbnRlbnR7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsOy13ZWJraXQtYm94LWRpcmVjdGlvbjpub3JtYWw7LW1zLWZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LnVpLm1vZGFsIC5jb250ZW50Pi5pbWFnZXtkaXNwbGF5OmJsb2NrO21heC13aWR0aDoxMDAlO21hcmdpbjowIGF1dG8haW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MCAwIDFyZW0haW1wb3J0YW50fS51aS5tb2RhbD4uY29udGVudD4uaW1hZ2U+aS5pY29ue2ZvbnQtc2l6ZTo1cmVtO3RleHQtYWxpZ246Y2VudGVyfS51aS5tb2RhbCAuY29udGVudD4uZGVzY3JpcHRpb257ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlIWltcG9ydGFudDttYXJnaW46MCFpbXBvcnRhbnQ7cGFkZGluZzoxcmVtIDAhaW1wb3J0YW50Oy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZX0udWkubW9kYWw+LmFjdGlvbnN7cGFkZGluZzoxcmVtIDFyZW0gMCFpbXBvcnRhbnR9LnVpLm1vZGFsIC5hY3Rpb25zPi5idXR0b24sLnVpLm1vZGFsIC5hY3Rpb25zPi5idXR0b25ze21hcmdpbi1ib3R0b206MXJlbX19LnVpLmludmVydGVkLmRpbW1lcj4udWkubW9kYWx7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAzcHggMTBweCAycHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzoxcHggM3B4IDEwcHggMnB4IHJnYmEoMCwwLDAsLjIpfS51aS5iYXNpYy5tb2RhbHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2JvcmRlci1yYWRpdXM6MDstd2Via2l0LWJveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnQ7Ym94LXNoYWRvdzpub25lIWltcG9ydGFudDtjb2xvcjojZmZmfS51aS5iYXNpYy5tb2RhbD4uYWN0aW9ucywudWkuYmFzaWMubW9kYWw+LmNvbnRlbnQsLnVpLmJhc2ljLm1vZGFsPi5oZWFkZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0udWkuYmFzaWMubW9kYWw+LmhlYWRlcntjb2xvcjojZmZmfS51aS5iYXNpYy5tb2RhbD4uY2xvc2V7dG9wOjFyZW07cmlnaHQ6MS41cmVtfS51aS5pbnZlcnRlZC5kaW1tZXI+LmJhc2ljLm1vZGFse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW52ZXJ0ZWQuZGltbWVyPi51aS5iYXNpYy5tb2RhbD4uaGVhZGVye2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkubGVnYWN5Lm1vZGFsLC51aS5sZWdhY3kucGFnZS5kaW1tZXI+LnVpLm1vZGFse3RvcDo1MCU7bGVmdDo1MCV9LnVpLmxlZ2FjeS5wYWdlLmRpbW1lcj4udWkuc2Nyb2xsaW5nLm1vZGFsLC51aS5wYWdlLmRpbW1lcj4udWkuc2Nyb2xsaW5nLmxlZ2FjeS5tb2RhbCwudWkudG9wLmFsaWduZWQuZGltbWVyPi51aS5sZWdhY3kubW9kYWwsLnVpLnRvcC5hbGlnbmVkLmxlZ2FjeS5wYWdlLmRpbW1lcj4udWkubW9kYWx7dG9wOmF1dG99QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjk5MXB4KXsudWkuYmFzaWMubW9kYWw+LmNsb3Nle2NvbG9yOiNmZmZ9fS51aS5sb2FkaW5nLm1vZGFse2Rpc3BsYXk6YmxvY2s7dmlzaWJpbGl0eTpoaWRkZW47ei1pbmRleDotMX0udWkuYWN0aXZlLm1vZGFse2Rpc3BsYXk6YmxvY2t9Lm1vZGFscy5kaW1tZXJbY2xhc3MqPVxcXCJ0b3AgYWxpZ25lZFxcXCJdIC5tb2RhbHttYXJnaW46NXZoIGF1dG99QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsubW9kYWxzLmRpbW1lcltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl0gLm1vZGFse21hcmdpbjoxcmVtIGF1dG99fS5sZWdhY3kubW9kYWxzLmRpbW1lcltjbGFzcyo9XFxcInRvcCBhbGlnbmVkXFxcIl17cGFkZGluZy10b3A6NXZofUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LmxlZ2FjeS5tb2RhbHMuZGltbWVyW2NsYXNzKj1cXFwidG9wIGFsaWduZWRcXFwiXXtwYWRkaW5nLXRvcDoxcmVtfX0uc2Nyb2xsaW5nLmRpbW1hYmxlLmRpbW1lZHtvdmVyZmxvdzpoaWRkZW59LnNjcm9sbGluZy5kaW1tYWJsZT4uZGltbWVyey13ZWJraXQtYm94LXBhY2s6c3RhcnQ7LW1zLWZsZXgtcGFjazpzdGFydDtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uc2Nyb2xsaW5nLmRpbW1hYmxlLmRpbW1lZD4uZGltbWVye292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnNjcm9sbGluZy5kaW1tYWJsZT4uZGltbWVye3Bvc2l0aW9uOmZpeGVkfS5tb2RhbHMuZGltbWVyIC51aS5zY3JvbGxpbmcubW9kYWx7bWFyZ2luOjFyZW0gYXV0b30uc2Nyb2xsaW5nLnVuZGV0YWNoZWQuZGltbWFibGUuZGltbWVke292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2h9LnNjcm9sbGluZy51bmRldGFjaGVkLmRpbW1hYmxlLmRpbW1lZD4uZGltbWVye292ZXJmbG93OmhpZGRlbn0uc2Nyb2xsaW5nLnVuZGV0YWNoZWQuZGltbWFibGUgLnVpLnNjcm9sbGluZy5tb2RhbHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjUwJTttYXJnaW4tdG9wOjFyZW0haW1wb3J0YW50fS51aS5tb2RhbCAuc2Nyb2xsaW5nLmNvbnRlbnR7bWF4LWhlaWdodDpjYWxjKDcwdmgpO292ZXJmbG93OmF1dG99LnVpLmZ1bGxzY3JlZW4ubW9kYWx7d2lkdGg6OTUlIWltcG9ydGFudDtsZWZ0OjAhaW1wb3J0YW50O21hcmdpbjoxZW0gYXV0b30udWkuZnVsbHNjcmVlbi5zY3JvbGxpbmcubW9kYWx7bGVmdDowIWltcG9ydGFudH0udWkuZnVsbHNjcmVlbi5tb2RhbD4uaGVhZGVye3BhZGRpbmctcmlnaHQ6Mi4yNXJlbX0udWkuZnVsbHNjcmVlbi5tb2RhbD4uY2xvc2V7dG9wOjEuMDUzNXJlbTtyaWdodDoxcmVtO2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkubW9kYWx7Zm9udC1zaXplOjFyZW19LnVpLm1pbmkubW9kYWw+LmhlYWRlcjpub3QoLnVpKXtmb250LXNpemU6MS4zZW19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkubWluaS5tb2RhbHt3aWR0aDo5NSU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLm1pbmkubW9kYWx7d2lkdGg6MzUuMiU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo5OTJweCl7LnVpLm1pbmkubW9kYWx7d2lkdGg6MzQwcHg7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDoxMjAwcHgpey51aS5taW5pLm1vZGFse3dpZHRoOjM2MHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkubWluaS5tb2RhbHt3aWR0aDozODBweDttYXJnaW46MH19LnVpLnNtYWxsLm1vZGFsPi5oZWFkZXI6bm90KC51aSl7Zm9udC1zaXplOjEuM2VtfUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo3NjdweCl7LnVpLnRpbnkubW9kYWx7d2lkdGg6OTUlO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6NzY4cHgpey51aS50aW55Lm1vZGFse3dpZHRoOjUyLjglO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS50aW55Lm1vZGFse3dpZHRoOjUxMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KXsudWkudGlueS5tb2RhbHt3aWR0aDo1NDBweDttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjE5MjBweCl7LnVpLnRpbnkubW9kYWx7d2lkdGg6NTcwcHg7bWFyZ2luOjB9fS51aS5zbWFsbC5tb2RhbD4uaGVhZGVyOm5vdCgudWkpe2ZvbnQtc2l6ZToxLjNlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5zbWFsbC5tb2RhbHt3aWR0aDo5NSU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLnNtYWxsLm1vZGFse3dpZHRoOjcwLjQlO21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6OTkycHgpey51aS5zbWFsbC5tb2RhbHt3aWR0aDo2ODBweDttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjEyMDBweCl7LnVpLnNtYWxsLm1vZGFse3dpZHRoOjcyMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkuc21hbGwubW9kYWx7d2lkdGg6NzYwcHg7bWFyZ2luOjB9fS51aS5sYXJnZS5tb2RhbD4uaGVhZGVye2ZvbnQtc2l6ZToxLjZlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5sYXJnZS5tb2RhbHt3aWR0aDo5NSU7bWFyZ2luOjB9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1pbi13aWR0aDo3NjhweCl7LnVpLmxhcmdlLm1vZGFse3dpZHRoOjg4JTttYXJnaW46MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjk5MnB4KXsudWkubGFyZ2UubW9kYWx7d2lkdGg6MTAyMHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTIwMHB4KXsudWkubGFyZ2UubW9kYWx7d2lkdGg6MTA4MHB4O21hcmdpbjowfX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtaW4td2lkdGg6MTkyMHB4KXsudWkubGFyZ2UubW9kYWx7d2lkdGg6MTE0MHB4O21hcmdpbjowfX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gTmFnXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkubmFne2Rpc3BsYXk6bm9uZTtvcGFjaXR5Oi45NTtwb3NpdGlvbjpyZWxhdGl2ZTt0b3A6MDtsZWZ0OjA7ei1pbmRleDo5OTk7bWluLWhlaWdodDowO3dpZHRoOjEwMCU7bWFyZ2luOjA7cGFkZGluZzouNzVlbSAxZW07YmFja2dyb3VuZDojNTU1Oy13ZWJraXQtYm94LXNoYWRvdzowIDFweCAycHggMCByZ2JhKDAsMCwwLC4yKTtib3gtc2hhZG93OjAgMXB4IDJweCAwIHJnYmEoMCwwLDAsLjIpO2ZvbnQtc2l6ZToxcmVtO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtOy13ZWJraXQtdHJhbnNpdGlvbjouMnMgYmFja2dyb3VuZCBlYXNlO3RyYW5zaXRpb246LjJzIGJhY2tncm91bmQgZWFzZX1hLnVpLm5hZ3tjdXJzb3I6cG9pbnRlcn0udWkubmFnPi50aXRsZXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW46MCAuNWVtO2NvbG9yOiNmZmZ9LnVpLm5hZz4uY2xvc2UuaWNvbntjdXJzb3I6cG9pbnRlcjtvcGFjaXR5Oi40O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MWVtO2ZvbnQtc2l6ZToxZW07bWFyZ2luOi0uNWVtIDAgMDtjb2xvcjojZmZmOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4ycyBlYXNlO3RyYW5zaXRpb246b3BhY2l0eSAuMnMgZWFzZX0udWkubmFnOmhvdmVye2JhY2tncm91bmQ6IzU1NTtvcGFjaXR5OjF9LnVpLm5hZyAuY2xvc2U6aG92ZXJ7b3BhY2l0eToxfS51aS5vdmVybGF5Lm5hZ3twb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmJsb2NrfS51aS5maXhlZC5uYWd7cG9zaXRpb246Zml4ZWR9LnVpLmJvdHRvbS5uYWcsLnVpLmJvdHRvbS5uYWdze2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbSAwIDA7dG9wOmF1dG87Ym90dG9tOjB9LnVpLmludmVydGVkLm5hZywudWkuaW52ZXJ0ZWQubmFncyAubmFne2JhY2tncm91bmQtY29sb3I6I2YzZjRmNTtjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLmludmVydGVkLm5hZyAuY2xvc2UsLnVpLmludmVydGVkLm5hZyAudGl0bGUsLnVpLmludmVydGVkLm5hZ3MgLm5hZyAuY2xvc2UsLnVpLmludmVydGVkLm5hZ3MgLm5hZyAudGl0bGV7Y29sb3I6cmdiYSgwLDAsMCwuNCl9LnVpLm5hZ3MgLm5hZ3tib3JkZXItcmFkaXVzOjAhaW1wb3J0YW50fS51aS5uYWdzIC5uYWc6bGFzdC1jaGlsZHtib3JkZXItcmFkaXVzOjAgMCAuMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtfS51aS5ib3R0b20ubmFncyAubmFnOmxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gUG9wdXBcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5wb3B1cHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7cmlnaHQ6MDttaW4td2lkdGg6LXdlYmtpdC1taW4tY29udGVudDttaW4td2lkdGg6LW1vei1taW4tY29udGVudDttaW4td2lkdGg6bWluLWNvbnRlbnQ7ei1pbmRleDoxOTAwO2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNTtsaW5lLWhlaWdodDoxLjQyODVlbTttYXgtd2lkdGg6MjUwcHg7YmFja2dyb3VuZDojZmZmO3BhZGRpbmc6LjgzM2VtIDFlbTtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7Y29sb3I6cmdiYSgwLDAsMCwuODcpO2JvcmRlci1yYWRpdXM6LjI4NTcxNDI5cmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3gtc2hhZG93OjAgMnB4IDRweCAwIHJnYmEoMzQsMzYsMzgsLjEyKSwwIDJweCAxMHB4IDAgcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5wb3B1cD4uaGVhZGVye3BhZGRpbmc6MDtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEuMTQyODU3MTRlbTtsaW5lLWhlaWdodDoxLjI7Zm9udC13ZWlnaHQ6NzAwfS51aS5wb3B1cD4uaGVhZGVyKy5jb250ZW50e3BhZGRpbmctdG9wOi41ZW19LnVpLnBvcHVwOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3dpZHRoOi43MTQyODU3MWVtO2hlaWdodDouNzE0Mjg1NzFlbTtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKTt6LWluZGV4OjI7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAxcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzoxcHggMXB4IDAgMCAjYmFiYWJjfVtkYXRhLXRvb2x0aXBde3Bvc2l0aW9uOnJlbGF0aXZlfVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtwb2ludGVyLWV2ZW50czpub25lO3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7Zm9udC1zaXplOjFyZW07d2lkdGg6LjcxNDI4NTcxZW07aGVpZ2h0Oi43MTQyODU3MWVtO2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3RyYW5zZm9ybTpyb3RhdGUoNDVkZWcpO3otaW5kZXg6Mjstd2Via2l0LWJveC1zaGFkb3c6MXB4IDFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93OjFweCAxcHggMCAwICNiYWJhYmN9W2RhdGEtdG9vbHRpcF06YWZ0ZXJ7cG9pbnRlci1ldmVudHM6bm9uZTtjb250ZW50OmF0dHIoZGF0YS10b29sdGlwKTtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LXRyYW5zZm9ybTpub25lO3RleHQtYWxpZ246bGVmdDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjFyZW07Ym9yZGVyOjFweCBzb2xpZCAjZDRkNGQ1O2xpbmUtaGVpZ2h0OjEuNDI4NWVtO21heC13aWR0aDpub25lO2JhY2tncm91bmQ6I2ZmZjtwYWRkaW5nOi44MzNlbSAxZW07Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTt6LWluZGV4OjF9W2RhdGEtdG9vbHRpcF06bm90KFtkYXRhLXBvc2l0aW9uXSk6YmVmb3Jle3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjEwMCU7bGVmdDo1MCU7YmFja2dyb3VuZDojZmZmO21hcmdpbi1sZWZ0Oi0uMDcxNDI4NTdyZW07bWFyZ2luLWJvdHRvbTouMTQyODU3MTRyZW19W2RhdGEtdG9vbHRpcF06bm90KFtkYXRhLXBvc2l0aW9uXSk6YWZ0ZXJ7bGVmdDo1MCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTtib3R0b206MTAwJTttYXJnaW4tYm90dG9tOi41ZW19W2RhdGEtdG9vbHRpcF06YWZ0ZXIsW2RhdGEtdG9vbHRpcF06YmVmb3Jle3BvaW50ZXItZXZlbnRzOm5vbmU7dmlzaWJpbGl0eTpoaWRkZW59W2RhdGEtdG9vbHRpcF06YmVmb3Jle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpyb3RhdGUoNDVkZWcpIHNjYWxlKDApIWltcG9ydGFudDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKSBzY2FsZSgwKSFpbXBvcnRhbnQ7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciB0b3A7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wOy13ZWJraXQtdHJhbnNpdGlvbjphbGwgLjFzIGVhc2U7dHJhbnNpdGlvbjphbGwgLjFzIGVhc2V9W2RhdGEtdG9vbHRpcF06YWZ0ZXJ7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbTstd2Via2l0LXRyYW5zaXRpb246YWxsIC4xcyBlYXNlO3RyYW5zaXRpb246YWxsIC4xcyBlYXNlfVtkYXRhLXRvb2x0aXBdOmhvdmVyOmFmdGVyLFtkYXRhLXRvb2x0aXBdOmhvdmVyOmJlZm9yZXt2aXNpYmlsaXR5OnZpc2libGU7cG9pbnRlci1ldmVudHM6YXV0b31bZGF0YS10b29sdGlwXTpob3ZlcjpiZWZvcmV7LXdlYmtpdC10cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKSBzY2FsZSgxKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZykgc2NhbGUoMSkhaW1wb3J0YW50O29wYWNpdHk6MX1bZGF0YS10b29sdGlwXTphZnRlcixbZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gY2VudGVyXFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIGNlbnRlclxcXCJdOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgc2NhbGUoMCkhaW1wb3J0YW50O3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpIHNjYWxlKDApIWltcG9ydGFudH1bZGF0YS10b29sdGlwXTpob3ZlcjphZnRlcixbZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gY2VudGVyXFxcIl06aG92ZXI6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKSBzY2FsZSgxKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSkgc2NhbGUoMSkhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwicmlnaHQgY2VudGVyXFxcIl06YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMCkhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl06aG92ZXI6YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwicmlnaHQgY2VudGVyXFxcIl06aG92ZXI6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKSBzY2FsZSgxKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSkgc2NhbGUoMSkhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImJvdHRvbSBsZWZ0XFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIHJpZ2h0XFxcIl06YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIGxlZnRcXFwiXTphZnRlcixbZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJ0b3AgcmlnaHRcXFwiXTphZnRlcnstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKSFpbXBvcnRhbnQ7dHJhbnNmb3JtOnNjYWxlKDApIWltcG9ydGFudH1bZGF0YS10b29sdGlwXVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gbGVmdFxcXCJdOmhvdmVyOmFmdGVyLFtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcImJvdHRvbSByaWdodFxcXCJdOmhvdmVyOmFmdGVyLFtkYXRhLXRvb2x0aXBdW2RhdGEtcG9zaXRpb249XFxcInRvcCBsZWZ0XFxcIl06aG92ZXI6YWZ0ZXIsW2RhdGEtdG9vbHRpcF1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIHJpZ2h0XFxcIl06aG92ZXI6YWZ0ZXJ7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSkhaW1wb3J0YW50O3RyYW5zZm9ybTpzY2FsZSgxKSFpbXBvcnRhbnR9W2RhdGEtdG9vbHRpcF1bZGF0YS1pbnZlcnRlZF06YmVmb3Jley13ZWJraXQtYm94LXNoYWRvdzpub25lIWltcG9ydGFudDtib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50fVtkYXRhLXRvb2x0aXBdW2RhdGEtaW52ZXJ0ZWRdOmJlZm9yZXtiYWNrZ3JvdW5kOiMxYjFjMWR9W2RhdGEtdG9vbHRpcF1bZGF0YS1pbnZlcnRlZF06YWZ0ZXJ7YmFja2dyb3VuZDojMWIxYzFkO2NvbG9yOiNmZmY7Ym9yZGVyOm5vbmU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfVtkYXRhLXRvb2x0aXBdW2RhdGEtaW52ZXJ0ZWRdOmFmdGVyIC5oZWFkZXJ7YmFja2dyb3VuZC1jb2xvcjpub25lO2NvbG9yOiNmZmZ9W2RhdGEtcG9zaXRpb249XFxcInRvcCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye3RvcDphdXRvO3JpZ2h0OmF1dG87bGVmdDo1MCU7Ym90dG9tOjEwMCU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNTAlKTttYXJnaW4tYm90dG9tOi41ZW19W2RhdGEtcG9zaXRpb249XFxcInRvcCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbToxMDAlO2xlZnQ6NTAlO2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tbGVmdDotLjA3MTQyODU3cmVtO21hcmdpbi1ib3R0b206LjE0Mjg1NzE0cmVtfVtkYXRhLXBvc2l0aW9uPVxcXCJ0b3AgbGVmdFxcXCJdW2RhdGEtdG9vbHRpcF06YWZ0ZXJ7dG9wOmF1dG87cmlnaHQ6YXV0bztsZWZ0OjA7Ym90dG9tOjEwMCU7bWFyZ2luLWJvdHRvbTouNWVtfVtkYXRhLXBvc2l0aW9uPVxcXCJ0b3AgbGVmdFxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOjEwMCU7bGVmdDoxZW07bWFyZ2luLWxlZnQ6LS4wNzE0Mjg1N3JlbTttYXJnaW4tYm90dG9tOi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbj1cXFwidG9wIHJpZ2h0XFxcIl1bZGF0YS10b29sdGlwXTphZnRlcnt0b3A6YXV0bztsZWZ0OmF1dG87cmlnaHQ6MDtib3R0b206MTAwJTttYXJnaW4tYm90dG9tOi41ZW19W2RhdGEtcG9zaXRpb249XFxcInRvcCByaWdodFxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle3RvcDphdXRvO2xlZnQ6YXV0bztib3R0b206MTAwJTtyaWdodDoxZW07bWFyZ2luLWxlZnQ6LS4wNzE0Mjg1N3JlbTttYXJnaW4tYm90dG9tOi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIGNlbnRlclxcXCJdW2RhdGEtdG9vbHRpcF06YWZ0ZXJ7Ym90dG9tOmF1dG87cmlnaHQ6YXV0bztsZWZ0OjUwJTt0b3A6MTAwJTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC01MCUpO21hcmdpbi10b3A6LjVlbX1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIGNlbnRlclxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle2JvdHRvbTphdXRvO3JpZ2h0OmF1dG87dG9wOjEwMCU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LS4wNzE0Mjg1N3JlbTttYXJnaW4tdG9wOi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbj1cXFwiYm90dG9tIGxlZnRcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye2xlZnQ6MDt0b3A6MTAwJTttYXJnaW4tdG9wOi41ZW19W2RhdGEtcG9zaXRpb249XFxcImJvdHRvbSBsZWZ0XFxcIl1bZGF0YS10b29sdGlwXTpiZWZvcmV7Ym90dG9tOmF1dG87cmlnaHQ6YXV0bzt0b3A6MTAwJTtsZWZ0OjFlbTttYXJnaW4tbGVmdDotLjA3MTQyODU3cmVtO21hcmdpbi10b3A6LjE0Mjg1NzE0cmVtfVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gcmlnaHRcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye3JpZ2h0OjA7dG9wOjEwMCU7bWFyZ2luLXRvcDouNWVtfVtkYXRhLXBvc2l0aW9uPVxcXCJib3R0b20gcmlnaHRcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtib3R0b206YXV0bztsZWZ0OmF1dG87dG9wOjEwMCU7cmlnaHQ6MWVtO21hcmdpbi1sZWZ0Oi0uMTQyODU3MTRyZW07bWFyZ2luLXRvcDouMDcxNDI4NTdyZW19W2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTphZnRlcntyaWdodDoxMDAlO3RvcDo1MCU7bWFyZ2luLXJpZ2h0Oi41ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1bZGF0YS1wb3NpdGlvbj1cXFwibGVmdCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtyaWdodDoxMDAlO3RvcDo1MCU7bWFyZ2luLXRvcDotLjE0Mjg1NzE0cmVtO21hcmdpbi1yaWdodDotLjA3MTQyODU3cmVtfVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVye2xlZnQ6MTAwJTt0b3A6NTAlO21hcmdpbi1sZWZ0Oi41ZW07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1bZGF0YS1wb3NpdGlvbj1cXFwicmlnaHQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTpiZWZvcmV7bGVmdDoxMDAlO3RvcDo1MCU7bWFyZ2luLXRvcDotLjA3MTQyODU3cmVtO21hcmdpbi1sZWZ0Oi4xNDI4NTcxNHJlbX1bZGF0YS1wb3NpdGlvbn49Ym90dG9tXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiY31bZGF0YS1wb3NpdGlvbj1cXFwibGVmdCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmY7LXdlYmtpdC1ib3gtc2hhZG93OjFweCAtMXB4IDAgMCAjYmFiYWJjO2JveC1zaGFkb3c6MXB4IC0xcHggMCAwICNiYWJhYmN9W2RhdGEtcG9zaXRpb249XFxcInJpZ2h0IGNlbnRlclxcXCJdW2RhdGEtdG9vbHRpcF06YmVmb3Jle2JhY2tncm91bmQ6I2ZmZjstd2Via2l0LWJveC1zaGFkb3c6LTFweCAxcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IDFweCAwIDAgI2JhYmFiY31bZGF0YS1wb3NpdGlvbn49dG9wXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9W2RhdGEtaW52ZXJ0ZWRdW2RhdGEtcG9zaXRpb25+PWJvdHRvbV1bZGF0YS10b29sdGlwXTpiZWZvcmV7YmFja2dyb3VuZDojMWIxYzFkOy13ZWJraXQtYm94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmN9W2RhdGEtaW52ZXJ0ZWRdW2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTpiZWZvcmV7YmFja2dyb3VuZDojMWIxYzFkOy13ZWJraXQtYm94LXNoYWRvdzoxcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93OjFweCAtMXB4IDAgMCAjYmFiYWJjfVtkYXRhLWludmVydGVkXVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXtiYWNrZ3JvdW5kOiMxYjFjMWQ7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggMXB4IDAgMCAjYmFiYWJjO2JveC1zaGFkb3c6LTFweCAxcHggMCAwICNiYWJhYmN9W2RhdGEtaW52ZXJ0ZWRdW2RhdGEtcG9zaXRpb25+PXRvcF1bZGF0YS10b29sdGlwXTpiZWZvcmV7YmFja2dyb3VuZDojMWIxYzFkfVtkYXRhLXBvc2l0aW9ufj1ib3R0b21dW2RhdGEtdG9vbHRpcF06YmVmb3Jley13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbX1bZGF0YS1wb3NpdGlvbn49Ym90dG9tXVtkYXRhLXRvb2x0aXBdOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHRvcH1bZGF0YS1wb3NpdGlvbj1cXFwibGVmdCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXJ9W2RhdGEtcG9zaXRpb249XFxcImxlZnQgY2VudGVyXFxcIl1bZGF0YS10b29sdGlwXTphZnRlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmJlZm9yZXstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgY2VudGVyfVtkYXRhLXBvc2l0aW9uPVxcXCJyaWdodCBjZW50ZXJcXFwiXVtkYXRhLXRvb2x0aXBdOmFmdGVyey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgY2VudGVyfS51aS5wb3B1cHttYXJnaW46MH0udWkudG9wLnBvcHVwe21hcmdpbjowIDAgLjcxNDI4NTcxZW19LnVpLnRvcC5sZWZ0LnBvcHVwey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IGJvdHRvbTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgYm90dG9tfS51aS50b3AuY2VudGVyLnBvcHVwey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgYm90dG9tO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGJvdHRvbX0udWkudG9wLnJpZ2h0LnBvcHVwey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b207dHJhbnNmb3JtLW9yaWdpbjpyaWdodCBib3R0b219LnVpLmxlZnQuY2VudGVyLnBvcHVwe21hcmdpbjowIC43MTQyODU3MWVtIDAgMDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46cmlnaHQgNTAlO3RyYW5zZm9ybS1vcmlnaW46cmlnaHQgNTAlfS51aS5yaWdodC5jZW50ZXIucG9wdXB7bWFyZ2luOjAgMCAwIC43MTQyODU3MWVtOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpsZWZ0IDUwJTt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQgNTAlfS51aS5ib3R0b20ucG9wdXB7bWFyZ2luOi43MTQyODU3MWVtIDAgMH0udWkuYm90dG9tLmxlZnQucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmxlZnQgdG9wO3RyYW5zZm9ybS1vcmlnaW46bGVmdCB0b3B9LnVpLmJvdHRvbS5jZW50ZXIucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciB0b3A7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgdG9wfS51aS5ib3R0b20ucmlnaHQucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IHRvcDt0cmFuc2Zvcm0tb3JpZ2luOnJpZ2h0IHRvcH0udWkuYm90dG9tLmNlbnRlci5wb3B1cDpiZWZvcmV7bWFyZ2luLWxlZnQ6LS4zMDcxNDI4NmVtO3RvcDotLjMwNzE0Mjg2ZW07bGVmdDo1MCU7cmlnaHQ6YXV0bztib3R0b206YXV0bzstd2Via2l0LWJveC1zaGFkb3c6LTFweCAtMXB4IDAgMCAjYmFiYWJjO2JveC1zaGFkb3c6LTFweCAtMXB4IDAgMCAjYmFiYWJjfS51aS5ib3R0b20ubGVmdC5wb3B1cHttYXJnaW4tbGVmdDowfS51aS5ib3R0b20ubGVmdC5wb3B1cDpiZWZvcmV7dG9wOi0uMzA3MTQyODZlbTtsZWZ0OjFlbTtyaWdodDphdXRvO2JvdHRvbTphdXRvO21hcmdpbi1sZWZ0OjA7LXdlYmtpdC1ib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93Oi0xcHggLTFweCAwIDAgI2JhYmFiY30udWkuYm90dG9tLnJpZ2h0LnBvcHVwe21hcmdpbi1yaWdodDowfS51aS5ib3R0b20ucmlnaHQucG9wdXA6YmVmb3Jle3RvcDotLjMwNzE0Mjg2ZW07cmlnaHQ6MWVtO2JvdHRvbTphdXRvO2xlZnQ6YXV0bzttYXJnaW4tbGVmdDowOy13ZWJraXQtYm94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IC0xcHggMCAwICNiYWJhYmN9LnVpLnRvcC5jZW50ZXIucG9wdXA6YmVmb3Jle3RvcDphdXRvO3JpZ2h0OmF1dG87Ym90dG9tOi0uMzA3MTQyODZlbTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotLjMwNzE0Mjg2ZW19LnVpLnRvcC5sZWZ0LnBvcHVwe21hcmdpbi1sZWZ0OjB9LnVpLnRvcC5sZWZ0LnBvcHVwOmJlZm9yZXtib3R0b206LS4zMDcxNDI4NmVtO2xlZnQ6MWVtO3RvcDphdXRvO3JpZ2h0OmF1dG87bWFyZ2luLWxlZnQ6MH0udWkudG9wLnJpZ2h0LnBvcHVwe21hcmdpbi1yaWdodDowfS51aS50b3AucmlnaHQucG9wdXA6YmVmb3Jle2JvdHRvbTotLjMwNzE0Mjg2ZW07cmlnaHQ6MWVtO3RvcDphdXRvO2xlZnQ6YXV0bzttYXJnaW4tbGVmdDowfS51aS5sZWZ0LmNlbnRlci5wb3B1cDpiZWZvcmV7dG9wOjUwJTtyaWdodDotLjMwNzE0Mjg2ZW07Ym90dG9tOmF1dG87bGVmdDphdXRvO21hcmdpbi10b3A6LS4zMDcxNDI4NmVtOy13ZWJraXQtYm94LXNoYWRvdzoxcHggLTFweCAwIDAgI2JhYmFiYztib3gtc2hhZG93OjFweCAtMXB4IDAgMCAjYmFiYWJjfS51aS5yaWdodC5jZW50ZXIucG9wdXA6YmVmb3Jle3RvcDo1MCU7bGVmdDotLjMwNzE0Mjg2ZW07Ym90dG9tOmF1dG87cmlnaHQ6YXV0bzttYXJnaW4tdG9wOi0uMzA3MTQyODZlbTstd2Via2l0LWJveC1zaGFkb3c6LTFweCAxcHggMCAwICNiYWJhYmM7Ym94LXNoYWRvdzotMXB4IDFweCAwIDAgI2JhYmFiY30udWkuYm90dG9tLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9LnVpLmxlZnQuY2VudGVyLnBvcHVwOmJlZm9yZSwudWkucmlnaHQuY2VudGVyLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kOiNmZmZ9LnVpLnRvcC5wb3B1cDpiZWZvcmV7YmFja2dyb3VuZDojZmZmfS51aS5pbnZlcnRlZC5ib3R0b20ucG9wdXA6YmVmb3Jle2JhY2tncm91bmQ6IzFiMWMxZH0udWkuaW52ZXJ0ZWQubGVmdC5jZW50ZXIucG9wdXA6YmVmb3JlLC51aS5pbnZlcnRlZC5yaWdodC5jZW50ZXIucG9wdXA6YmVmb3Jle2JhY2tncm91bmQ6IzFiMWMxZH0udWkuaW52ZXJ0ZWQudG9wLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kOiMxYjFjMWR9LnVpLnBvcHVwPi51aS5ncmlkOm5vdCgucGFkZGVkKXt3aWR0aDpjYWxjKDEwMCUgKyAxLjc1cmVtKTttYXJnaW46LS43cmVtIC0uODc1cmVtfS51aS5sb2FkaW5nLnBvcHVwe2Rpc3BsYXk6YmxvY2s7dmlzaWJpbGl0eTpoaWRkZW47ei1pbmRleDotMX0udWkuYW5pbWF0aW5nLnBvcHVwLC51aS52aXNpYmxlLnBvcHVwe2Rpc3BsYXk6YmxvY2t9LnVpLnZpc2libGUucG9wdXB7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKTstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS51aS5iYXNpYy5wb3B1cDpiZWZvcmV7ZGlzcGxheTpub25lfS51aS53aWRlLnBvcHVwe21heC13aWR0aDozNTBweH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHdpZGVcXFwiXS5wb3B1cHttYXgtd2lkdGg6NTUwcHh9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjc2N3B4KXsudWkud2lkZS5wb3B1cCwudWlbY2xhc3MqPVxcXCJ2ZXJ5IHdpZGVcXFwiXS5wb3B1cHttYXgtd2lkdGg6MjUwcHh9fS51aS5mbHVpZC5wb3B1cHt3aWR0aDoxMDAlO21heC13aWR0aDpub25lfS51aS5pbnZlcnRlZC5wb3B1cHtiYWNrZ3JvdW5kOiMxYjFjMWQ7Y29sb3I6I2ZmZjtib3JkZXI6bm9uZTstd2Via2l0LWJveC1zaGFkb3c6bm9uZTtib3gtc2hhZG93Om5vbmV9LnVpLmludmVydGVkLnBvcHVwIC5oZWFkZXJ7YmFja2dyb3VuZC1jb2xvcjpub25lO2NvbG9yOiNmZmZ9LnVpLmludmVydGVkLnBvcHVwOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMxYjFjMWQ7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmUhaW1wb3J0YW50O2JveC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLmZsb3dpbmcucG9wdXB7bWF4LXdpZHRoOm5vbmV9LnVpLm1pbmkucG9wdXB7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5wb3B1cHtmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS5zbWFsbC5wb3B1cHtmb250LXNpemU6LjkyODU3MTQzcmVtfS51aS5wb3B1cHtmb250LXNpemU6MXJlbX0udWkubGFyZ2UucG9wdXB7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmh1Z2UucG9wdXB7Zm9udC1zaXplOjEuNDI4NTcxNDNyZW19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFByb2dyZXNzIEJhclxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnByb2dyZXNze3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7bWF4LXdpZHRoOjEwMCU7Ym9yZGVyOm5vbmU7bWFyZ2luOjFlbSAwIDIuNWVtOy13ZWJraXQtYm94LXNoYWRvdzpub25lO2JveC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEpO3BhZGRpbmc6MDtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbX0udWkucHJvZ3Jlc3M6Zmlyc3QtY2hpbGR7bWFyZ2luOjAgMCAyLjVlbX0udWkucHJvZ3Jlc3M6bGFzdC1jaGlsZHttYXJnaW46MCAwIDEuNWVtfS51aS5wcm9ncmVzcyAuYmFye2Rpc3BsYXk6YmxvY2s7bGluZS1oZWlnaHQ6MTtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDowJTttaW4td2lkdGg6MmVtO2JhY2tncm91bmQ6Izg4ODtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LXRyYW5zaXRpb246d2lkdGggLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOndpZHRoIC4xcyBlYXNlLGJhY2tncm91bmQtY29sb3IgLjFzIGVhc2V9LnVpLnByb2dyZXNzIC5iYXI+LnByb2dyZXNze3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO2ZvbnQtc2l6ZTouOTI4NTcxNDNlbTt0b3A6NTAlO3JpZ2h0Oi41ZW07bGVmdDphdXRvO2JvdHRvbTphdXRvO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO3RleHQtc2hhZG93Om5vbmU7bWFyZ2luLXRvcDotLjVlbTtmb250LXdlaWdodDo3MDA7dGV4dC1hbGlnbjpsZWZ0fS51aS5wcm9ncmVzcz4ubGFiZWx7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTtmb250LXNpemU6MWVtO3RvcDoxMDAlO3JpZ2h0OmF1dG87bGVmdDowO2JvdHRvbTphdXRvO2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtmb250LXdlaWdodDo3MDA7dGV4dC1zaGFkb3c6bm9uZTttYXJnaW4tdG9wOi4yZW07dGV4dC1hbGlnbjpjZW50ZXI7LXdlYmtpdC10cmFuc2l0aW9uOmNvbG9yIC40cyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjRzIGVhc2V9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiMVxcXCJdIC5iYXIsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiMlxcXCJdIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1YzVjfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjNcXFwiXSAuYmFye2JhY2tncm91bmQtY29sb3I6I2VmYmM3Mn0udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCI0XFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCI1XFxcIl0gLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNlNmJiNDh9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiNlxcXCJdIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZGRjOTI4fS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjdcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjhcXFwiXSAuYmFye2JhY2tncm91bmQtY29sb3I6I2I0ZDk1Y30udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCIxMDBcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjlcXFwiXSAuYmFye2JhY2tncm91bmQtY29sb3I6IzY2ZGE4MX0udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCIxXFxcIl0gLmxhYmVsLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjJcXFwiXSAubGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjNcXFwiXSAubGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudF49XFxcIjRcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiNVxcXCJdIC5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiNlxcXCJdIC5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiN1xcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCI4XFxcIl0gLmxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnRePVxcXCIxMDBcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50Xj1cXFwiOVxcXCJdIC5sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCIxXFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjJcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiM1xcXCJdIC5iYXIsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI0XFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjVcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiNlxcXCJdIC5iYXIsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI3XFxcIl0gLmJhciwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjhcXFwiXSAuYmFyLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiOVxcXCJdIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZDk1YzVjfS51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiMVxcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjJcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCIzXFxcIl0gLmxhYmVsLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiNFxcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjVcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI2XFxcIl0gLmxhYmVsLC51aS5pbmRpY2F0aW5nLnByb2dyZXNzW2RhdGEtcGVyY2VudD1cXFwiN1xcXCJdIC5sYWJlbCwudWkuaW5kaWNhdGluZy5wcm9ncmVzc1tkYXRhLXBlcmNlbnQ9XFxcIjhcXFwiXSAubGFiZWwsLnVpLmluZGljYXRpbmcucHJvZ3Jlc3NbZGF0YS1wZXJjZW50PVxcXCI5XFxcIl0gLmxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0udWkuaW5kaWNhdGluZy5wcm9ncmVzcy5zdWNjZXNzIC5sYWJlbHtjb2xvcjojMWE1MzFifS51aS5wcm9ncmVzcy5zdWNjZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1IWltcG9ydGFudH0udWkucHJvZ3Jlc3Muc3VjY2VzcyAuYmFyLC51aS5wcm9ncmVzcy5zdWNjZXNzIC5iYXI6OmFmdGVyey13ZWJraXQtYW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50O2FuaW1hdGlvbjpub25lIWltcG9ydGFudH0udWkucHJvZ3Jlc3Muc3VjY2Vzcz4ubGFiZWx7Y29sb3I6IzFhNTMxYn0udWkucHJvZ3Jlc3Mud2FybmluZyAuYmFye2JhY2tncm91bmQtY29sb3I6I2YyYzAzNyFpbXBvcnRhbnR9LnVpLnByb2dyZXNzLndhcm5pbmcgLmJhciwudWkucHJvZ3Jlc3Mud2FybmluZyAuYmFyOjphZnRlcnstd2Via2l0LWFuaW1hdGlvbjpub25lIWltcG9ydGFudDthbmltYXRpb246bm9uZSFpbXBvcnRhbnR9LnVpLnByb2dyZXNzLndhcm5pbmc+LmxhYmVse2NvbG9yOiM3OTRiMDJ9LnVpLnByb2dyZXNzLmVycm9yIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZGIyODI4IWltcG9ydGFudH0udWkucHJvZ3Jlc3MuZXJyb3IgLmJhciwudWkucHJvZ3Jlc3MuZXJyb3IgLmJhcjo6YWZ0ZXJ7LXdlYmtpdC1hbmltYXRpb246bm9uZSFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50fS51aS5wcm9ncmVzcy5lcnJvcj4ubGFiZWx7Y29sb3I6IzkxMmQyYn0udWkuYWN0aXZlLnByb2dyZXNzIC5iYXJ7cG9zaXRpb246cmVsYXRpdmU7bWluLXdpZHRoOjJlbX0udWkuYWN0aXZlLnByb2dyZXNzIC5iYXI6OmFmdGVye2NvbnRlbnQ6Jyc7b3BhY2l0eTowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO2JhY2tncm91bmQ6I2ZmZjtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWFuaW1hdGlvbjpwcm9ncmVzcy1hY3RpdmUgMnMgZWFzZSBpbmZpbml0ZTthbmltYXRpb246cHJvZ3Jlc3MtYWN0aXZlIDJzIGVhc2UgaW5maW5pdGV9QC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzLWFjdGl2ZXswJXtvcGFjaXR5Oi4zO3dpZHRoOjB9MTAwJXtvcGFjaXR5OjA7d2lkdGg6MTAwJX19QGtleWZyYW1lcyBwcm9ncmVzcy1hY3RpdmV7MCV7b3BhY2l0eTouMzt3aWR0aDowfTEwMCV7b3BhY2l0eTowO3dpZHRoOjEwMCV9fS51aS5kaXNhYmxlZC5wcm9ncmVzc3tvcGFjaXR5Oi4zNX0udWkuZGlzYWJsZWQucHJvZ3Jlc3MgLmJhciwudWkuZGlzYWJsZWQucHJvZ3Jlc3MgLmJhcjo6YWZ0ZXJ7LXdlYmtpdC1hbmltYXRpb246bm9uZSFpbXBvcnRhbnQ7YW5pbWF0aW9uOm5vbmUhaW1wb3J0YW50fS51aS5pbnZlcnRlZC5wcm9ncmVzc3tiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA4KTtib3JkZXI6bm9uZX0udWkuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kOiM4ODh9LnVpLmludmVydGVkLnByb2dyZXNzIC5iYXI+LnByb2dyZXNze2NvbG9yOiNmOWZhZmJ9LnVpLmludmVydGVkLnByb2dyZXNzPi5sYWJlbHtjb2xvcjojZmZmfS51aS5pbnZlcnRlZC5wcm9ncmVzcy5zdWNjZXNzPi5sYWJlbHtjb2xvcjojMjFiYTQ1fS51aS5pbnZlcnRlZC5wcm9ncmVzcy53YXJuaW5nPi5sYWJlbHtjb2xvcjojZjJjMDM3fS51aS5pbnZlcnRlZC5wcm9ncmVzcy5lcnJvcj4ubGFiZWx7Y29sb3I6I2RiMjgyOH0udWkucHJvZ3Jlc3MuYXR0YWNoZWR7YmFja2dyb3VuZDowIDA7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyOm5vbmU7bWFyZ2luOjB9LnVpLnByb2dyZXNzLmF0dGFjaGVkLC51aS5wcm9ncmVzcy5hdHRhY2hlZCAuYmFye2Rpc3BsYXk6YmxvY2s7aGVpZ2h0Oi4ycmVtO3BhZGRpbmc6MDtvdmVyZmxvdzpoaWRkZW47Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIC4yODU3MTQyOXJlbX0udWkucHJvZ3Jlc3MuYXR0YWNoZWQgLmJhcntib3JkZXItcmFkaXVzOjB9LnVpLnByb2dyZXNzLnRvcC5hdHRhY2hlZCwudWkucHJvZ3Jlc3MudG9wLmF0dGFjaGVkIC5iYXJ7dG9wOjA7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkucHJvZ3Jlc3MudG9wLmF0dGFjaGVkIC5iYXJ7Ym9yZGVyLXJhZGl1czowfS51aS5jYXJkPi51aS5hdHRhY2hlZC5wcm9ncmVzcywudWkuc2VnbWVudD4udWkuYXR0YWNoZWQucHJvZ3Jlc3N7cG9zaXRpb246YWJzb2x1dGU7dG9wOmF1dG87bGVmdDowO2JvdHRvbToxMDAlO3dpZHRoOjEwMCV9LnVpLmNhcmQ+LnVpLmJvdHRvbS5hdHRhY2hlZC5wcm9ncmVzcywudWkuc2VnbWVudD4udWkuYm90dG9tLmF0dGFjaGVkLnByb2dyZXNze3RvcDoxMDAlO2JvdHRvbTphdXRvfS51aS5yZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkYjI4Mjh9LnVpLnJlZC5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2ZmNjk1ZX0udWkub3JhbmdlLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjI3MTFjfS51aS5vcmFuZ2UuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjg1MWJ9LnVpLnllbGxvdy5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2ZiYmQwOH0udWkueWVsbG93LmludmVydGVkLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZlMjFmfS51aS5vbGl2ZS5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2I1Y2MxOH0udWkub2xpdmUuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkOWU3Nzh9LnVpLmdyZWVuLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojMjFiYTQ1fS51aS5ncmVlbi5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzJlY2M0MH0udWkudGVhbC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzAwYjVhZH0udWkudGVhbC5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzZkZmZmZn0udWkuYmx1ZS5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzIxODVkMH0udWkuYmx1ZS5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzU0YzhmZn0udWkudmlvbGV0LnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojNjQzNWM5fS51aS52aW9sZXQuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNhMjkxZmJ9LnVpLnB1cnBsZS5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2EzMzNjOH0udWkucHVycGxlLmludmVydGVkLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZGM3M2ZmfS51aS5waW5rLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZTAzOTk3fS51aS5waW5rLmludmVydGVkLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmY4ZWRmfS51aS5icm93bi5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6I2E1NjczZn0udWkuYnJvd24uaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkNjdjMWN9LnVpLmdyZXkucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiM3Njc2NzZ9LnVpLmdyZXkuaW52ZXJ0ZWQucHJvZ3Jlc3MgLmJhcntiYWNrZ3JvdW5kLWNvbG9yOiNkY2RkZGV9LnVpLmJsYWNrLnByb2dyZXNzIC5iYXJ7YmFja2dyb3VuZC1jb2xvcjojMWIxYzFkfS51aS5ibGFjay5pbnZlcnRlZC5wcm9ncmVzcyAuYmFye2JhY2tncm91bmQtY29sb3I6IzU0NTQ1NH0udWkudGlueS5wcm9ncmVzc3tmb250LXNpemU6Ljg1NzE0Mjg2cmVtfS51aS50aW55LnByb2dyZXNzIC5iYXJ7aGVpZ2h0Oi41ZW19LnVpLnNtYWxsLnByb2dyZXNze2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLnNtYWxsLnByb2dyZXNzIC5iYXJ7aGVpZ2h0OjFlbX0udWkucHJvZ3Jlc3N7Zm9udC1zaXplOjFyZW19LnVpLnByb2dyZXNzIC5iYXJ7aGVpZ2h0OjEuNzVlbX0udWkubGFyZ2UucHJvZ3Jlc3N7Zm9udC1zaXplOjEuMTQyODU3MTRyZW19LnVpLmxhcmdlLnByb2dyZXNzIC5iYXJ7aGVpZ2h0OjIuNWVtfS51aS5iaWcucHJvZ3Jlc3N7Zm9udC1zaXplOjEuMjg1NzE0MjlyZW19LnVpLmJpZy5wcm9ncmVzcyAuYmFye2hlaWdodDozLjVlbX0vKiFcXG4gKiAjIFNlbWFudGljIFVJIDIuNC4wIC0gUmF0aW5nXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkucmF0aW5ne2Rpc3BsYXk6LXdlYmtpdC1pbmxpbmUtYm94O2Rpc3BsYXk6LW1zLWlubGluZS1mbGV4Ym94O2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS51aS5yYXRpbmc6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0udWkucmF0aW5nIC5pY29ue3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7LXdlYmtpdC1ib3gtZmxleDoxOy1tcy1mbGV4OjEgMCBhdXRvO2ZsZXg6MSAwIGF1dG87Y3Vyc29yOnBvaW50ZXI7d2lkdGg6MS4yNWVtO2hlaWdodDphdXRvOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGJhY2tncm91bmQgLjFzIGVhc2UsdGV4dC1zaGFkb3cgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2U7dHJhbnNpdGlvbjpvcGFjaXR5IC4xcyBlYXNlLGJhY2tncm91bmQgLjFzIGVhc2UsdGV4dC1zaGFkb3cgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2V9LnVpLnJhdGluZyAuaWNvbntiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC4xNSl9LnVpLnJhdGluZyAuYWN0aXZlLmljb257YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5yYXRpbmcgLmljb24uc2VsZWN0ZWQsLnVpLnJhdGluZyAuaWNvbi5zZWxlY3RlZC5hY3RpdmV7YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zdGFyLnJhdGluZyAuaWNvbnt3aWR0aDoxLjI1ZW07aGVpZ2h0OmF1dG87YmFja2dyb3VuZDowIDA7Y29sb3I6cmdiYSgwLDAsMCwuMTUpO3RleHQtc2hhZG93Om5vbmV9LnVpLnN0YXIucmF0aW5nIC5hY3RpdmUuaWNvbntiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnQ7Y29sb3I6I2ZmZTYyMyFpbXBvcnRhbnQ7dGV4dC1zaGFkb3c6MCAtMXB4IDAgI2RkYzUwNywtMXB4IDAgMCAjZGRjNTA3LDAgMXB4IDAgI2RkYzUwNywxcHggMCAwICNkZGM1MDchaW1wb3J0YW50fS51aS5zdGFyLnJhdGluZyAuaWNvbi5zZWxlY3RlZCwudWkuc3Rhci5yYXRpbmcgLmljb24uc2VsZWN0ZWQuYWN0aXZle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDtjb2xvcjojZmMwIWltcG9ydGFudDt0ZXh0LXNoYWRvdzowIC0xcHggMCAjZTZhMjAwLC0xcHggMCAwICNlNmEyMDAsMCAxcHggMCAjZTZhMjAwLDFweCAwIDAgI2U2YTIwMCFpbXBvcnRhbnR9LnVpLmhlYXJ0LnJhdGluZyAuaWNvbnt3aWR0aDoxLjRlbTtoZWlnaHQ6YXV0bztiYWNrZ3JvdW5kOjAgMDtjb2xvcjpyZ2JhKDAsMCwwLC4xNSk7dGV4dC1zaGFkb3c6bm9uZSFpbXBvcnRhbnR9LnVpLmhlYXJ0LnJhdGluZyAuYWN0aXZlLmljb257YmFja2dyb3VuZDowIDAhaW1wb3J0YW50O2NvbG9yOiNmZjZkNzUhaW1wb3J0YW50O3RleHQtc2hhZG93OjAgLTFweCAwICNjZDA3MDcsLTFweCAwIDAgI2NkMDcwNywwIDFweCAwICNjZDA3MDcsMXB4IDAgMCAjY2QwNzA3IWltcG9ydGFudH0udWkuaGVhcnQucmF0aW5nIC5pY29uLnNlbGVjdGVkLC51aS5oZWFydC5yYXRpbmcgLmljb24uc2VsZWN0ZWQuYWN0aXZle2JhY2tncm91bmQ6MCAwIWltcG9ydGFudDtjb2xvcjojZmYzMDAwIWltcG9ydGFudDt0ZXh0LXNoYWRvdzowIC0xcHggMCAjYWEwMTAxLC0xcHggMCAwICNhYTAxMDEsMCAxcHggMCAjYWEwMTAxLDFweCAwIDAgI2FhMDEwMSFpbXBvcnRhbnR9LnVpLmRpc2FibGVkLnJhdGluZyAuaWNvbntjdXJzb3I6ZGVmYXVsdH0udWkucmF0aW5nLnNlbGVjdGVkIC5hY3RpdmUuaWNvbntvcGFjaXR5OjF9LnVpLnJhdGluZyAuaWNvbi5zZWxlY3RlZCwudWkucmF0aW5nLnNlbGVjdGVkIC5pY29uLnNlbGVjdGVke29wYWNpdHk6MX0udWkubWluaS5yYXRpbmd7Zm9udC1zaXplOi43ODU3MTQyOXJlbX0udWkudGlueS5yYXRpbmd7Zm9udC1zaXplOi44NTcxNDI4NnJlbX0udWkuc21hbGwucmF0aW5ne2ZvbnQtc2l6ZTouOTI4NTcxNDNyZW19LnVpLnJhdGluZ3tmb250LXNpemU6MXJlbX0udWkubGFyZ2UucmF0aW5ne2ZvbnQtc2l6ZToxLjE0Mjg1NzE0cmVtfS51aS5odWdlLnJhdGluZ3tmb250LXNpemU6MS40Mjg1NzE0M3JlbX0udWkubWFzc2l2ZS5yYXRpbmd7Zm9udC1zaXplOjJyZW19QGZvbnQtZmFjZXtmb250LWZhbWlseTpSYXRpbmc7c3JjOnVybChkYXRhOmFwcGxpY2F0aW9uL3gtZm9udC10dGY7Y2hhcnNldD11dGYtODtiYXNlNjQsQUFFQUFBQUxBSUFBQXdBd1QxTXZNZ2dqQ0JzQUFBQzhBQUFBWUdOdFlYQ2oycG04QUFBQkhBQUFBS1JuWVhOd0FBQUFFQUFBQWNBQUFBQUlaMng1WmxKYlhNWUFBQUhJQUFBUm5HaGxZV1FCR0FlNUFBQVRaQUFBQURab2FHVmhBK0lCL1FBQUU1d0FBQUFrYUcxMGVDemdBRU1BQUJQQUFBQUFjR3h2WTJFd1hDeE9BQUFVTUFBQUFEcHRZWGh3QUNJQW5BQUFGR3dBQUFBZ2JtRnRaZkMxbjA0QUFCU01BQUFCUEhCdmMzUUFBd0FBQUFBVnlBQUFBQ0FBQXdJQUFaQUFCUUFBQVV3QlpnQUFBRWNCVEFGbUFBQUE5UUFaQUlRQUFBQUFBQUFBQUFBQUFBQUFBQUFCRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJBQUFEeFpRSGcvK0QvNEFIZ0FDQUFBQUFCQUFBQUFBQUFBQUFBQUFBZ0FBQUFBQUFDQUFBQUF3QUFBQlFBQXdBQkFBQUFGQUFFQUpBQUFBQWdBQ0FBQkFBQUFBRUFJT1lGOEFid0RmQWo4Qzd3YnZCdzhJcndsL0NjOFNQeFpmLzkvLzhBQUFBQUFDRG1BUEFFOEF6d0kvQXU4Rzd3Y1BDSDhKZnduUEVqOFdULy9mLy9BQUgvNHhvRUVBWVFBUS9zRCtJUG93K2lENHdQZ0E5OER2WU90Z0FEQUFFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCQUFILy93QVBBQUVBQUFBQUFBQUFBQUFDQUFBM09RRUFBQUFBQVFBQUFBQUFBQUFBQUFJQUFEYzVBUUFBQUFBQkFBQUFBQUFBQUFBQUFnQUFOemtCQUFBQUFBSUFBUC90QWdBQjB3QUtBQlVBQUFFdkFROEJGd2MzRnljM0JRYzNKejhCSHdFSEZ5Y0NBTEZQVDdHQUhwNmVIb0QvQUhBV1czMDRPSDFiRm5BQkdScWdvQnA4c0ZOVHNIeXlPbnhZRW5GeEVsaDhPZ0FBQUFBQ0FBRC83UUlBQWRNQUNnQVNBQUFCTHdFUEFSY0hOeGNuTndVeEVSOEJCeGNuQWdDeFQwK3hnQjZlbmg2QS93QTRmVnNXY0FFWkdxQ2dHbnl3VTFPd2ZMSUJIWEVTV0h3NkFBQUFBUUFBLyswQ0FBSFRBQW9BQUFFdkFROEJGd2MzRnljM0FnQ3hUMCt4Z0I2ZW5oNkFBUmthb0tBYWZMQlRVN0I4QUFBQUFBRUFBQUFBQWdBQndBQXJBQUFCRkE0Q0J6RUhEZ01qSWk0Q0x3RXVBelUwUGdJek1oNENGejRETXpJZUFoVUNBQWNNRWd1Z0Jnd01EQVlHREF3TUJxQUxFZ3dIRnlnMkhoQWZHeGtLQ2hrYkh4QWVOaWdYQVMwUUh4c1pDcUFHQ3drR0JRa0xCcUFLR1JzZkVCNDJLQmNIREJJTEN4SU1CeGNvTmg0QUFBQUFBZ0FBQUFBQ0FBSEFBQ3NBV0FBQUFUUXVBaU1pRGdJSExnTWpJZzRDRlJRZUFoY3hGeDRETXpJK0FqOEJQZ00xRHdFaUZDSUdNVEFtSWpRakp5NEROVFErQWpNeUhnSWZBVGMrQXpNeUhnSVZGQTRDQndJQUZ5ZzJIaEFmR3hrS0Noa2JIeEFlTmlnWEJ3d1NDNkFHREF3TUJnWU1EQXdHb0FzU0RBZGJvZ0VCQVFFQkFhSUdDZ2NFRFJjZUVRa1JFQTRHTHk4R0RoQVJDUkVlRncwRUJ3b0dBUzBlTmlnWEJ3d1NDd3NTREFjWEtEWWVFQjhiR1FxZ0Jnc0pCZ1VKQ3dhZ0Noa2JIeEErb2dFQkFRR2lCZzRRRVFrUkhoY05CQWNLQmpRMEJnb0hCQTBYSGhFSkVSQU9CZ0FCQUFBQUFBSUFBY0FBTVFBQUFSUU9BZ2N4Qnc0REl5SXVBaThCTGdNMU5ENENNekllQWhjSEZ3YzNKemMrQXpNeUhnSVZBZ0FIREJJTG9BWU1EQXdHQmd3TURBYWdDeElNQnhjb05oNEtGUk1TQ0M5d1FMQndKd1VKQ2drRkhqWW9Gd0V0RUI4YkdRcWdCZ3NKQmdVSkN3YWdDaGtiSHhBZU5pZ1hBd1VJQlV0QW9NQkFPd0VDQVFFWEtEWWVBQUFCQUFBQUFBSUFBYmNBS2dBQUV6UTNOak15RnhZWEZoY1dGelkzTmpjMk56WXpNaGNXRlJRUEFRWWpJaThCSmljbUp5WW5KaWNtTlFBa0pVQVJFeElRRUFzTUNnb01DeEFRRWhNUlFDVWtRYklHQndjR3NnTUZCUXNLQ1FrR0J3RXhQeU1rQmdZTENna0tDZ29LQ1FvTEJnWWtJejgvUWF3RkJhd0NCZ1VORGc0T0ZSUVRBQUFBQVFBQUFBMEIyd0hTQUNZQUFCTTBQd0kyRnpZZkFoWVZGQThCRnhRVkZBY0dCeVl2QVFjR0J5WW5KalUwUHdFbkpqVUFFSTlCQlFrSUJrQ1BFQWRvR1FNREJnVUdnSUVHQlFZREF3RVlhQWNCSXdzQ0ZvRU1BUUVNZ1JZQ0N3WUlaSkFCQlFVRkF3RUJBa1ZGQWdFQkF3VUZBd09RWkFrRkFBQUFBQUlBQUFBTkFkc0IwZ0FrQUM0QUFCTTBQd0kyRnpZZkFoWVZGQThCRnhRVkZBY21Md0VIQmdjbUp5WTFORDhCSnlZMUh3RUhOeGNuTnk4QkJ3QVFqMEVGQ1FnR1FJOFFCMmdaREFVR2dJRUdCUVlEQXdFWWFBYy9XQlZzYXhSWGVEWTJBU01MQWhhQkRBRUJESUVXQWdzR0NHU1FBUVVOQVFFQ1JVVUNBUUVEQlFVREE1QmtDUVVSVlhnNE9IaFZFVzV1QUFBQkFDTUFLUUhkQVh3QUdnQUFOelEvQVRZWE5oOEJOellYTmg4QkZoVVVEd0VHQnlZdkFTWTFJd2dtQ0F3TENGUzhDQXNNQ0NZSUNQVUlEQXNJamdqU0N3a21DUUVCQ1ZTN0NRRUJDU1lKQ2cwSDlnY0JBUWVQQnd3QUFBRUFId0FmQVhNQmN3QXNBQUEzTkQ4Qkp5WTFORDhCTmpNeUh3RTNOak15SHdFV0ZSUVBBUmNXRlJRUEFRWWpJaThCQndZaklpOEJKalVmQ0ZSVUNBZ25DQXdMQ0ZSVUNBd0xDQ2NJQ0ZSVUNBZ25DQXNNQ0ZSVUNBc01DQ2NJWWdzSVZGUUlEQXNJSndnSVZGUUlDQ2NJQ3d3SVZGUUlDd3dJSndnSVZGUUlDQ2NJREFBQUFBQUNBQUFBSlFGSkFiY0FId0FyQUFBM05UUTNOanNCTlRRM05qTXlGeFlkQVRNeUZ4WWRBUlFIQmlNaElpY21OVGN6TlRRbkppTWlCd1lkQVFBSUNBc0tKU1kxTkNZbUNRc0lDQWdJQy83dEN3Z0lXNU1XRlI0ZkZSWkFwUXNJQ0RjMEppWW1KalEzQ0FnTHBRc0lDQWdJQzhBM0hoWVZGUlllTndBQUFRQUFBQWNCYmdHM0FDRUFBRGNSTkRjMk56WXpJVElYRmhjV0ZSRVVCd1lIQmlNaUx3RUhCaU1pSnlZbkpqVUFCZ1VLQmdZQkxBWUdDZ1VHQmdVS0JRY09DbjUrQ2c0R0Jnb0ZCaWNCY0FvSUNBTURBd01JQ0FyK2tBb0lDQVFDQ1hsNUNRSUVDQWdLQUFBQUF3QUFBQ1VDQUFGdUFCZ0FNUUJLQUFBM05EYzJOell6TWhjV0Z4WVZGQWNHQndZaklpY21KeVkxTXhZWEZqTXlOelkzSmljV0ZSUUhCaU1pSnlZMU5EY0dCemNVRnhZek1qYzJOVFEzTmpNeU56WTFOQ2NtSXlJSEJoVUFCaWhEUkV0TFJFTW9CZ1lvUTBSTFMwUkRLQVlsSmprNVEwTTVPU1lyUVJFbUpUVTFKU1lSUVN1RUJBUUdCZ1FFRVJFWkJnUUVCQVFHSkJrYXlRb0tRU2dvS0NoQkNnb0tDa0VvSnljb1FRb0tPaU1qSXlNNlJDRWVJalVtSlNVbU5TSWVJVVFsQmdRRUJBUUdHQklSQkFRR0JnUUVHaG9qQUFBQUJRQUFBQWtDQUFHSkFDd0FPQUJSQUdnQWNBQUFOelEzTmpjMk16SVhOell6TWhjV0Z4WVhGaGNXRnhZVkZERUdCd1lQQVFZaklpY21OVFEzSmljbUp5WTFNeFlYTnlZbkpqVTBOd1lITnhRWEZqTXlOelkxTkRjMk16STNOalUwSnlZaklnY0dGUmMzTmpjMk55WW5OeFlYRmhjV0ZSUUhCZ2NHQndZalB3RVdGUlFIQmdjQUJpdEJRVTBaR2hBREJRRUVCQVVGQkFVRUJRRUVIanc4SGc0REJRUWlCUTBwSXlJWkJpVXZTeFlaRGc0UlFTdUVCQVFHQmdRRUVSRVpCZ1FFQkFRR0pCa2FWeFU5TXpRaUlEQVNHeGtaRUFZR0N4UXJPRGsvTGxBQ0Z4WWx5UXNKUXljbkJSd0VBZ0VEQXdJREF3SUJBd1VDTm14c05oa0ZGQU1GQkJVVEhoOG5DUXRLSVNnU0hCc2ZJaDRoUkNVR0JBUUVCQVlZRWhFRUJBWUdCQVFhR2lQSkpRVWlJall6SVNBU0doa2JDZ29LQ2hJWE1Sc2JVWkFOQ3lnaElBOEFBQU1BQUFBQUFiY0Iyd0E1QUVvQWxBQUFOelUwTnpZN0FUWTNOamMyTnpZM05qYzJNeklYRmhjV0ZSUUhNeklYRmhVVUJ4WVZGQWNVRlJRSEZnY0dLd0VpSnlZbkppc0JJaWNtTlRjVUZ4WXpNamMyTlRRbkppTWlCd1lWRnpNeUZ4WVhGaGNXRnhZWEZoY1dPd0V5TlRRbk5qYzJOVFFuTmpVMEp5WW5OamMyTlRRbkppc0JORGMyTlRRbkppTUdCd1lIQmdjR0J3WUhCZ2NHQndZSEJnY0dCd1lyQVJVQUN3b1FUZ29kRVE0R0JBTUZCZ3dMRHhnVEV3b0tEak1kRmhZT0Fnb1JBUmtaS0NVYkd4c2pJUVpTRUFvTEpRVUZDQWNHQlFVR0J3Z0ZCVWtKQkFVRkJBUUhCd01EQndjQ1BDVWpOd0lKQlFVRkR3TURCQWtHQmdzTERtVU9EZ29KR3dnREF3WUZEQVlRQVFVR0F3UUdCZ1lGQmdVR0JnUUpTYmNQQ3dzR0poVVBDQkVSRXhNTUNna0pGQlFoR3h3V0ZSNFpGUW9LRmhNR0JoMFdLQmNYQmdjTURBb0xEeElIQlFZR0JRY0lCUVlHQlFnU0FRRUJBUUlDQVFFREFnRVVMd2dJQlFvTENnc0pEaFFIQ1FrRUFRME5DZzhMQ3hBZEhSRWNEUTRJRUJFVEV3MEdGQUVIQndVRUNBZ0ZCUVVGQWdPM0FBQURBQUQvMndHM0FiY0FQQUJOQUprQUFEYzFORGMyT3dFeU56WTNOanNCTWhjV0J4VVdGUlFWRmhVVUJ4WVZGQWNHS3dFV0ZSUUhCZ2NHSXlJbkppY21KeVluSmljbUp5WW5JeUluSmpVM0ZCY1dNekkzTmpVMEp5WWpJZ2NHRlJjek1oY1dGeFlYRmhjV0Z4WVhGaGNXRnhZWEZoY1dGekkzTmpVMEp5WTFNekkzTmpVMEp5WWpOamMyTlRRbk5qVTBKeVluTmpVMEp5WXJBU0lISWdjR0J3WUhCZ2NHSXdZckFSVUFDd29RVWdZaEpSc2JIaUFvR1JrQkVRb0NEaFlXSFRNT0Nnb1RFeGdQQ3dvRkJnSUJCQU1GRGhFZENrNFFDZ3NsQlFVSUJ3WUZCUVlIQ0FVRlNRa0VCZ1lGQmdVR0JnWUVBd1lGQVJBR0RBVUdBd01JR3drS0RnNWxEZ3NMQmdZSkJBTUREd1VGQlFrQ0RnNFpKU1U4QWdjSEF3TUhCd1FFQlFVRUNiZTNEd3NLREF3SEJoY1dKd0lXSFFZR0V4WUtDaFVaSGhZVkhSb2lFeFFKQ2dzSkRnNE1EQXdOQmc0V0pRY0xDdytrQndVR0JnVUhDQVVHQmdVSXBBTUNCUVlGQlFjSUJBVUhCd0lUQnd3VEV4RVJCdzBPSEJFZEhSQUxDdzhLRFEwRkNRa0hGQTRKQ3dvTENnVUlDQmdNQ3hVREFnRUJBZ01CQVFHM0FBQUFBUUFBQUEwQTdnSFNBQlFBQUJNMFB3STJGeEVIQmdjbUp5WTFORDhCSnlZMUFCQ1BRUVVKZ1FZRkJnTURBUmhvQndFakN3SVdnUXdCL29ORkFnRUJBd1VGQXdPUVpBa0ZBQUFBQUFJQUFBQUFBZ0FCdHdBcUFGa0FBQk0wTnpZek1oY1dGeFlYRmhjMk56WTNOamMyTXpJWEZoVVVEd0VHSXlJdkFTWW5KaWNtSnlZbkpqVXpGQjhCTnpZMU5DY21KeVluSmljbUl5SUhCZ2NHQndZSEJpTWlKeVluSmljbUp5WWpJZ2NHQndZSEJnY0dGUUFrSlVBUkV4SVFFQXNNQ2dvTUN4QVFFaE1SUUNVa1FiSUdCd2NHc2dNRkJRc0tDUWtHQnlVMXBxWTFCZ1lKQ2c0TkRnMFBEaElSRGc4S0NnY0ZDUWtGQndvS0R3NFJFZzRQRFE0TkRnb0pCZ1lCTVQ4akpBWUdDd29KQ2dvS0Nna0tDd1lHSkNNL1AwR3NCUVdzQWdZRkRRNE9EaFVVRXpBMW9KODJNQmNTRWdvTEJnY0NBZ2NIQ3dzS0NRZ0hCd2dKQ2dzTEJ3Y0NBZ2NHQ3dvU0VoY0FBQUFDQUFBQUJ3RnVBYmNBSVFBb0FBQTNFVFEzTmpjMk15RXlGeFlYRmhVUkZBY0dCd1lqSWk4QkJ3WWpJaWNtSnlZMVB3RWZBUkVoRVFBR0JRb0dCZ0VzQmdZS0JRWUdCUW9GQnc0S2ZuNEtEZ1lHQ2dVR0paSVplZjdjSndGd0NnZ0lBd01EQXdnSUN2NlFDZ2dJQkFJSmVYa0pBZ1FJQ0FvSWpSbDBBV1ArblFBQUFBQUJBQUFBSlFIYkFiY0FNZ0FBTnpVME56WTdBVFUwTnpZek1oY1dIUUVVQndZckFTSW5KajBCTkNjbUl5SUhCaDBCTXpJWEZoMEJGQWNHSXlFaUp5WTFBQWdJQzhBbUpqUTFKaVVGQlFnU0NBVUZGaFVmSGhVV0hBc0lDQWdJQy83dEN3Z0lRS1VMQ0FnM05TVW1KaVUxU1FnRkJnWUZDRWtlRmhVVkZoNDNDQWdMcFFzSUNBZ0lDd0FBQUFJQUFRQU5BZHNCMGdBaUFDMEFBQk0yUHdJMk16SWZBaFlYRmc4QkZ4WUhCaU1pTHdFSEJpTWlKeVkvQVNjbU54OENMd0UvQVM4Q0V3RURESkJBQmdnSkJVR09EZ0lEQ21jWUFnUUNDQU1JZjRJRkJnWUVBZ0VaYVFnQzdoQmJFZ0lOU25rSUxnRUJKZ2dDRllJTEM0SVZBZ2dJQ1dXUENnVUZBMFJFQXdVRkNvOWxDUWlwQ1RCbUV3MUhFaEZjL3UwQUFBQURBQUFBQUFISkFiY0FGQUFsQUhrQUFEYzFORGMyT3dFeUZ4WWRBUlFIQmlzQklpY21OVGNVRnhZek1qYzJOVFFuSmlNaUJ3WVZGelUwTnpZek5qYzJOelkzTmpjMk56WTNOamMyTnpZM05qTXlGeFlYRmhjV0Z4WVhGaFVVRlJRSEJnY0dCeFFIQmdjR0J6TXlGeFlWRkFjV0ZSWUhGZ2NHQnhZSEJnY2pJaWNtSnlZbkppY2lKeVkxQUFVR0IxTUhCUVlHQlFkVEJ3WUZKUVVGQ0FjR0JRVUdCd2dGQldRRkJRZ0dEdzhPRkFrRkJBUUJBUU1DQVFJRUJBWUZCdzRLQ2djSEJRUUNBd0VCQWdNREFnWUNBZ0lCQVU4WEVCQVFCUUVPQlFVRUN3TVJFaVlsRXhZWERBd1dKQW9IQlFZM3R3Y0dCUVVHQjdjSUJRVUZCUWdrQndZRkJRWUhDQVVHQmdVSUpMY0hCUVlCRUJBVEdRa0ZDUWdHQlF3TEJnY0lDUVVHQXdNRkJBY0hCZ1lJQ1FRRUJ3c0xDd1lHQ2dJREJBTUNCQkVRRmhrU0RBb1ZFaEFSRUFzZ0ZCVUJCQVVFQkFjTUFRVUZDQUFBQUFBREFBRC8yd0hKQVpJQUZBQWxBSGtBQURjVUZ4WVhOeFkzTmowQk5DY21CeWNHQndZZEFUYzBOelkzRmhjV0ZSUUhCaWNHSnlZMUZ6VTBOelkzRmpjMk56WTNOamNYTmhjV0J4WVhGZ2NXQnhRSEZoVVVCd1lISnhZWEZoY1dGUllYRmhjV0ZSUVZGQWNHQndZSEJnY0dCd1luQmljbUp5WW5KaWNtSnlZbkppY21KeVluSmljaUp5WTFBQVVHQjFNSEJRWUdCUWRUQndZRkpRVUZDQWNHQlFVR0J3Z0ZCV1FHQlFjS0pCWU1EQmNXRXlVbUVoRURDd1FGQlE0QkJSQVFFQmRQQVFFQ0FnSUdBZ01EQWdFQkF3SUVCUWNIQ2dvT0J3VUdCQVFDQVFJREFRRUVCQVVKRkE0UER3WUlCUVdsQndZRkFRRUJCd1FKdFFrRUJ3RUJBUVVHQjdlVEJ3WUVBUUVFQmdjSkJBWUJBUVlFQ1pTNEJ3WUVBZ0VOQndVQ0JnTUJBUUVYRXlFSkVoQVJFQmNJRGhBYUZoRVBBUUVGQWdRQ0JRRUxCUWNLREFrSUJBVUhDZ1VHQndnREJnSUVBUUVIQlFrSUJ3VU1Dd2NFQ2djR0NSb1JFUThDQmdRSUFBQUFBUUFBQUFFQUFKdGg1N2RmRHp6MUFBc0NBQUFBQUFEUC9HT0RBQUFBQU0vOFk0TUFBUC9iQWdBQjJ3QUFBQWdBQWdBQUFBQUFBQUFCQUFBQjRQL2dBQUFDQUFBQUFBQUNBQUFCQUFBQUFBQUFBQUFBQUFBQUFBQUFIQUFBQUFBQUFBQUFBQUFBQUFFQUFBQUNBQUFBQWdBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZHdBQUFIY0FBQUNBQUFqQVpNQUh3RkpBQUFCYmdBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFFQUFBQUNBQUFBQVc0QUFBSGNBQUFCM0FBQkFkd0FBQUhjQUFBQUFBQUFBQW9BRkFBZUFFb0FjQUNLQU1vQlFBR0lBY3dDQ2dKVUFvSUN4Z01FQXpvRHBnUktCUmdGN0FZU0JwZ0cyZ2NnQjJvSUdBak9BQUFBQVFBQUFCd0FtZ0FGQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQTRBcmdBQkFBQUFBQUFCQUF3QUFBQUJBQUFBQUFBQ0FBNEFRQUFCQUFBQUFBQURBQXdBSWdBQkFBQUFBQUFFQUF3QVRnQUJBQUFBQUFBRkFCWUFEQUFCQUFBQUFBQUdBQVlBTGdBQkFBQUFBQUFLQURRQVdnQURBQUVFQ1FBQkFBd0FBQUFEQUFFRUNRQUNBQTRBUUFBREFBRUVDUUFEQUF3QUlnQURBQUVFQ1FBRUFBd0FUZ0FEQUFFRUNRQUZBQllBREFBREFBRUVDUUFHQUF3QU5BQURBQUVFQ1FBS0FEUUFXZ0J5QUdFQWRBQnBBRzRBWndCV0FHVUFjZ0J6QUdrQWJ3QnVBQ0FBTVFBdUFEQUFjZ0JoQUhRQWFRQnVBR2R5WVhScGJtY0FjZ0JoQUhRQWFRQnVBR2NBVWdCbEFHY0FkUUJzQUdFQWNnQnlBR0VBZEFCcEFHNEFad0JHQUc4QWJnQjBBQ0FBWndCbEFHNEFaUUJ5QUdFQWRBQmxBR1FBSUFCaUFIa0FJQUJKQUdNQWJ3Qk5BRzhBYndCdUFDNEFBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkgZm9ybWF0KCd0cnVldHlwZScpLHVybChkYXRhOmFwcGxpY2F0aW9uL2ZvbnQtd29mZjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxkMDlHUms5VVZFOEFBQmNVQUFvQUFBQUFGc3dBQVFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkRSa1lnQUFBQTlBQUFFdUVBQUJMaG82VHZJRTlUTHpJQUFCUFlBQUFBWUFBQUFHQUlJd2diWTIxaGNBQUFGRGdBQUFDa0FBQUFwS1BhbWJ4bllYTndBQUFVM0FBQUFBZ0FBQUFJQUFBQUVHaGxZV1FBQUJUa0FBQUFOZ0FBQURZQkdBZTVhR2hsWVFBQUZSd0FBQUFrQUFBQUpBUGlBZjFvYlhSNEFBQVZRQUFBQUhBQUFBQndMT0FBUTIxaGVIQUFBQld3QUFBQUJnQUFBQVlBSEZBQWJtRnRaUUFBRmJnQUFBRThBQUFCUFBDMW4wNXdiM04wQUFBVzlBQUFBQ0FBQUFBZ0FBTUFBQUVBQkFRQUFRRUJCM0poZEdsdVp3QUJBZ0FCQURyNEhBTDRHd1A0R0FRZUNnQVpVLytMaXg0S0FCbFQvNHVMREFlTFp2aVUrSFFGSFFBQUFQMFBIUUFBQVFJUkhRQUFBQWtkQUFBUzJCSUFIUUVCQncwUEVSUVpIaU1vTFRJM1BFRkdTMUJWV2w5a2FXNXplSDJDaDR4eVlYUnBibWR5WVhScGJtZDFNSFV4ZFRJd2RVVTJNREIxUlRZd01YVkZOakF5ZFVVMk1ETjFSVFl3TkhWRk5qQTFkVVl3TURSMVJqQXdOWFZHTURBMmRVWXdNRU4xUmpBd1JIVkdNREl6ZFVZd01rVjFSakEyUlhWR01EY3dkVVl3T0RkMVJqQTRPSFZHTURnNWRVWXdPRUYxUmpBNU4zVkdNRGxEZFVZeE1qTjFSakUyTkhWR01UWTFBQUFDQVlrQUdnQWNBZ0FCQUFRQUJ3QUtBQTBBVmdDV0FMMEJBZ0dNQWVRQ2J3THdBNGNENVFSMEJRTUZkZ1pnQjhNSmtRdHhDN29NMlExakRnZ09tUkFZRVpyOGxBNzhsQTc4bEE3N2xBNzRsUGV0RmZ0RnBUejNORHo3TlB0RmNmY1UreEJ0KzBUM010NzNNamh0OTBUM0ZQY1FCZnVVKzBZVit3UlJvZmNRTU9QM0VaM0Q5d1hEK3dYM0VYa3dNNkg3RVBzRXhRVU8rSlQzclJYN1JhVTg5elE4K3pUN1JYSDNGUHNRYmZ0RTl6TGU5ekk0YmZkRTl4VDNFQVg3bFB0R0ZZdUxpL2V4dy9zRjl4RjVNRE9oK3hEN0JNVUZEdmlVOTYwViswV2xQUGMwUFBzMCswVng5eFQ3RUczN1JQY3kzdmN5T0czM1JQY1U5eEFGRHZpVTk4RVZpMkI0Wkc1d0NJdUwrelQ3TkFWN2UzdDdlNHQ3aTN1YmU1c0krelQzTkFWdXBuaXlpN2FMM00zTjNJdTJpN0o0cG02bXFMS2V0b3ZjaTgxSml6b0lEdmlVOThFVmk5eEp6VHFMWUl0a2VIQnVjS2hrbm1DTE9vdEpTWXM2aTJDZVpLaHdDSXVMOXpUN05BV2JlNXQ3bTR1Ymk1dWJtNXNJOXpUM05BV29wcDZ5aTdZSU1FMFYremI3TmdXS2lvcUtpb3VLaTRxTWlvd0kremIzTmdWNm00R2hpNk9MdWJDd3VZdWppNkdCbTNvSXVsZTZ2d1dibktHVm80dTVpN0JtaTEyTGM0RjFlbnNJRHZpVTk4RVZpMkI0Wkc1d0NJdUwrelQ3TkFWN2UzdDdlNHQ3aTN1YmU1c0krelQzTkFWdXBuaXlpN2FMM00zTjNJdW5pNldEb1g0SVhFRDNCRXRMK3pUM1JQZFUrd1RMc3NZRmw0NllqWmlMM0l2TlNZczZDQTZMOThVVmk3V1hyS09pbzZPdGw3YUxsb3VYaVppSGw0ZVdoWmFFbG9TVWhaS0ZrNFNTaFpLRWtwS1NrWk9Ta3BHVWtaYVNDSmFTbHBHWGo1aVBsNDJXaTdhTHJYK2pjNk4wbDJxTFlZdGhkV0JnWUFqN1J2dEFCWWVJaDRtR2k0YUxoNDJIamdqN1J2ZEFCWW1OaVkySGo0aU9ocEdEbElTVWhaV0ZsSVdWaHBhSG1ZYVlpWmlMbUFnT1o0djN0eFdMa3BDUGxvMEk5eU9nelBjV0JZNlNrSStSaTVDTGtJZVBoQWpMK3hiM0kzWUZsb21RaDR1RWk0YUpoNGFHQ0NNbXBQc2pCWXVLaTRtTGlJdUhpb2lKaUltSWlJcUhpNGlMaDR5SGpRajdGTS83RlVjRmg0bUhpb2lMaDR1SWpJbU9pWTZLam91UGk0eUxqWXlPQ0tQM0l5UHdCWWFRaVpDTGp3Z09aNHYzdHhXTGtwQ1BsbzBJOXlPZ3pQY1dCWTZTa0krUmk1Q0xrSWVQaEFqTCt4YjNJM1lGbG9tUWg0dUVpNGFKaDRhR0NDTW1wUHNqQll1S2k0bUxpSXVDaDRhRGk0aUxoNHlIalFqN0ZNLzdGVWNGaDRtSGlvaUxoNHVJakltT2lZNktqb3VQaTR5TGpZeU9DS1AzSXlQd0JZYVFpWkNMandqS2VSWGpOM2I3RGZjQXhQWlNkL2NONHQvN0RKMVY5d0ZWK3dFRkRxNzNaaFdMazQyUmtaRUlzYklGa1pDUmpwT0xrb3VTaUpDR0NOODI5MUQzVUFXUWtKS09rb3VUaTVHSWtZWUlzV1FGa1lhTmhJdUVpNE9KaFlXRkNQdUorNGtGaFlXRmlZT0xoSXVFallhUkNQc2k5eUlGaFpDSmtvdVNDQTc3QWFydEZZdVNqcEtRa0FqZjN6ZmZCWWFRaUpLTGs0dVNqcEtRa0FpeXNnV1JrSkdPazR1U2k1S0lrSVlJM3pmZjN3V1FrSktPazR1U2k1S0lrSVlJc21RRmtJYU9oSXVFaTRPSWhJYUdDRGMzM3pjRmtJYU9oSXVFaTRPSWhZYUZDR1JrQllhR2hJaUVpNE9MaEk2R2tBZzMzemMzQllhR2hJaUVpNE9MaFk2RmtBaGtzZ1dHa1lpUmk1TUlEdnRMaThzVmkvYzVCWXVTanBLUWtKQ1FrbzZTaXdpVmk0dkNCWXV1bDZta3BLU2txcGl1aTY2THFYNmtjcVJ5bUcyTGFBaUxWSlNMQlpLTGtvaVFocENHam9TTGhBaUwremtGaTRPSWhZYUdob1dFaVlTTENQdW5pd1dFaTRTTmhwR0drSWlSaTVNSTV2ZFVGZmNuaTR2Q0JZdWZoSng4bW4yWmVwSjNpM2FMZW9SOWZYMThnM3FMZHdpTFZBVU8reWFMc2hXTCtBUUZpNUdOa1krUmpwQ1FqNUtOajQyUGpJK0xDUGZBaXdXUGk0K0tqNG1SaVpDSGo0YVBoWTJGaTRVSWkvd0VCWXVFaVlXSGhvZUdob2VGaUlpS2hvcUhpNEdMaEk2RWtRajdFdmNOK3hMN0RRV0VoWU9JZ291SGk0ZUxoNDJFam9hUGlKQ0hrSW1SaTVJSURvdjNYUldMa28yUmo1S2x0cSt2dUtXNHBidVp2WXU5aTd0OXVIRzRjYTlucFdDUGhJMkZpNFNMaFltRWg0UnhZR2RvWG5BSVhuRmJmbG1MV1l0Ym1GNmxYcVpucm5HMmg1S0prb3VSQ0xDTEZhUmtxMnl4ZExGMHRIKzRpN2lMdEpleG9yR2lxNnFrc202NFo2MWdvWloza1hhTGRJdG5mbTF5Y25KeWJYOW9pd2hvaTIyWGNxUnlwSDZwaTYrTG9wR2dscDlnZFdkcGJsNEk5eGl3Rll1SGpJaU9pSTZJam9xUGk0K0xqb3lPam8yT2pZNkxqNHVia0ptWGw1ZVdtWkdiaTQrTGpveU9qbzJPalk2TGp3aUxqNG1PaVk2SWpZaU5oNHR6aTNlQ2VucDZlb0ozaTNNSURvdjNYUldMa28yU2o1R291Syt1dHFXM3BicVl2b3VjaTV5Sm5JZ0ltNmNGalk2TmpJK0xqSXVOaTQySmpZcU9pbytKam9tT2lZNktqb21PaVk2SmpvcU5pb3lLam9tTWlZdUhpNHFMaW91TENIZG5iVlZqUTJORGJWVjNad2g5Y2dXSmlJaUppSXVKaTM2U2RKaUlqWW1PaTQ2TGpZK1VsSmx2bDNLY2RKOTBvSGVpZTZXSGtZbVNpNUlJc0lzVnFscTBaNzExQ0tHekJYcVhmcHFDbm9LZGhwNkxvSXVpa2FDV24yQjFaMmx1WGdqM0dMQVZpNGVNaUk2SWpvaU9pbytMajR1T2pJNk9qWTZOam91UGk1dVFtWmVYbDVhWmtadUxqNHVPakk2T2pZNk5qb3VQQ0l1UGlZNkpqb2lOaUkySGkzT0xkNEo2ZW5wNmduZUxjd2ppKzEwVm9MQUZ0SSt3bUsyaHJxS25xS0t2ZHExd3AydWhDSjJyQloxL25IeWNlcHg2bUhxV2VZK0VqWVdMaEl1RWlZV0hoSVIvZ0gxK2ZHOXFhWEptZVdWNVk0Smhpd2k1M0JYYjl5UUZqSUtNZzR1RWkzQ0RjM3gxZkhWM2ZIT0JDQTZMMUJXTDkwc0ZpNVdQbEpLU2twS1RqNWFMQ05tTEJaS1BtSnFlcEphWmxaZVZsWStRajVPTmw0MldqcGVPbUkrWWtaV1RrNU9TazQ2Vmk1dUxtWWlZaFppRmxJR1NmZ2lTZm81NWkzV0xlWWQ1Z1hnSXZvc0ZuNHVjaEpsOG1uMlNlb3QzaTNxR2ZJSjlqWVNMaFl1RWkzeUlmb1IraTRlTGg0dUhpM2VHZW45OWkzQ0RkbnQ4Q0h0OGRZTndpd2htaXdWNWkzbU5lWTk1a0hlUmM1TjFrMzZQaDRzSU9Zc0ZnSXVEam9TU2hKS0hsSXVWQ0xDZEZZdUdqSWVQaUkrSGo0bVFpNUNMajQyUGo0Nk9qWStMa0l1UWlaQ0lqb2VQaDQyR2k0YUxoNG1IaDRlSWlvYUxoZ2pVZVJXVWl3V05pNDZMajRxT2k0K0tqWXFPaTQrS2o0bVFpbzZLallxTmlvK0tqNG1RaW82S2pJcXpmcXVFcElzSXJvc0ZyNHVlbW91cmk1Q0trWXFRa1k2UWtJNlNqcEtOa291U2k1S0prb2lSbFpXUWxvdVlpNUNLa0ltUmlaR0pqNGlPQ0pHTWtJK1BsSStValpLTGtvdVZpSk9EazRTU2dvK0Npd2dtaXdXTGxwQ2FsSjZVbnBDYmk1YUxub2lZaEpTRmxIK1FlWXVHaG9lRGlZQ0pmNGgvaDMrSWZvV0JnNEtIaDRTQ2dINElpNHFJaVlpR2g0YUloNG1JaUlpSWg0ZUdoNGFIaDRlSGlJaUhpSWVIaUlpSGlJZUtoNG1JaW9pTENJS0xpL3RMQlE2TDkwc1ZpL2RMQll1Vmo1T1NrNUtTazQ2V2l3amRpd1dQaTVpUG9aT2trNkNSblpDZGo1Nk5uNHNJcTRzRnBvdWdnNXg4bTN5VGQ0dHhDSXVKQlpkOGtIdUxkNHVIaTRlTGg1SitqbjZMZkl1RWk0U0poWlI5a0h5TGVvdDNoSHA4ZkgxOWVvUjNpd2hZaXdXVmVJOTVpM21MZEloNmhINkVmb0tCZm9WK2hYMkhlNHVCaTRPUGc1S0ZrWWFUaDVTSGxZaVRpcE9LazRxVGlKTUlpWlNJa1lpUGdaU0JsNENhZUtSK21vU1BDRDJMQllDTGc0K0Vrb1NTaDVTTGxRaXc5emdWaTRhTWg0K0lqNGVQaVpDTGtJdVBqWStQam82Tmo0dVFpNUNKa0lpT2g0K0hqWWFMaG91SGlZZUhoNGlLaG91R0NOVDdPQldVaXdXT2k0NktqNG1QaW8rSWpvaVBoNCtJam9lUGlJK0hqNGFQaG82SGpvaU5pSTZIajRhT2hvNklpNHFXZnBLRGo0WUlrNE9SZ1k1K2ozNk9nSTEvallDUGc1Q0duWXVYajVHVWtwU09tWXVlaTVhR21vS2ZncDZHbW91V0NQQ0xCWlNMbEkrU2twT1RqcE9MbFl1U2laS0hsSWVVaG8rRmk0NlBqWStOa1kyUmpKQ0xrSXVZaHBhQmxZNlJqWktMa2dpTGtvbVNpSktJa29hUWhZNk1rSXlSaTVDTG00YVhncE9Ca242UGU0c0lab3NGY290cmhHTjlpb3VJaW9hSmg0cUhpb21LaVlxSWlvYUtoNG1IaW9pS2lZdUhpb2lMaDRxSWk0bUxDSUtMaS90TEJRNzdsSXYzdHhXTGtwQ1BsbzBJOXlPZ3pQY1dCWTZTa0krUml3aUwvQkw3RlVjRmg0bUhpb2lMaDR1SWpJbU9pWTZLam91UGk0eUxqWXlPQ0tQM0l5UHdCWWFRaVpDTGp3Z09pL2ZGRll1MWw2eWpvcU9qclplMmk1YUxsNG1ZaDVlSGxvV1doSmFFbElXU2haT0Vrb1dTaEpLU2twR1RrcEtSbEpHV2tnaVdrcGFSbDQrWWo1ZU5sb3UyaTYxL28zT2pkSmRxaTJHTFlYVmdZR0FJKzBiN1FBV0hpSWVKaG91R2k0ZU5oNDRJKzBiM1FBV0pqWW1OaDQrSWpvYVJnNVNFbElXVmhaU0ZsWWFXaDVtR21JbVlpNWdJc0lzVmkydWNhYTlvQ1BjNit6VDNPdmN6QmErdm5LMkxxNHViaVppSGw0ZVhocFNGa29TU2c1R0NqNEtRZ28yQ2pZT05nWXVCaTRLTGdJbC9ob0NHZ0lXQ2hBaUJnNE9GaElTRWhZYUZob2FJaG9hSmhZdUZpNGFOaUpDR2tJYVJoSkdFa29PUmdaT0Nrb0NSZ0pCL2tJQ05nb3NJZ1l1Qmk0T0pnb21DaVlLR2dvZURoWVNFaFlTR2dvZC9oMytKZm90N0NBNzdKb3V5Rll2NEJBV0xrWTJSajVHT2tKQ1BrbzJQalkrTWo0c0k5OENMQlkrTGo0cVBpWkdKa0llUGhvK0ZqWVdMaFFpTC9BUUZpNFNKaFllR2g0YUdoNFdJaUlxR2lvZUxnWXVFam9TUkNQc1M5dzM3RXZzTkJZU0ZnNGlDaTRlTGg0dUhqWVNPaG8rSWtJZVFpWkdMa2dpd2t4WDNKdmNocEhMM0Rmc0lpL2YzKzdpTGkvdjNCUTVuaThzVmkvYzVCWXVTanBLUWtKQ1FrbzZTaXdqM1ZJdUx3Z1dMcnBpcHBLU2twS21Zcm91dmk2bCtwSEtrY3BkdGkyZ0lpMElGaTRhS2hvZUloNGVIaVlhTENIbUxCWWFMaDQySGo0ZU9pcENMa0FpTDFBV0xuNE9jZlpwOW1YcVNkb3QzaTNxRWZYMThmSVI2aTNjSWkxU25pd1dTaTVLSWtJYVFobzZFaTRRSWkvczVCWXVEaUlXR2hvYUZoSW1FaXdqN3A0c0ZoSXVFallhUmhwQ0lrWXVUQ0E1bmpQZTZGWXlRa0k2VWpRajNJNkRNOXhZRmo1S1BqNUdMa0l1UWg0K0VDTXY3RnZjamRnV1VpWkNJallhTmhvaUZoWVVJSXlhayt5TUZqSVdLaG9tSGlZaUlpWWFMaUl1SGpJZU5DUHNVei9zVlJ3V0hpWWVLaUl1SGk0ZU5pWTZKajR1UWpKRUlvL2NqSS9BRmhaR0prWTJRQ1BlQit6MFZuSUxsVzNyeGlKNlptTlRTK3d5ZGdweGU1NHY3cHdVT1o0dkNGWXYzU3dXTGtJMlBqbytQam8rTmtJc0kzb3NGa0l1UGlZNklqNGVOaDR1R0NJdjdTd1dMaG9tSGg0ZUloNGVLaG9zSU9Jc0Zob3VIakllUGlJK0pqNHVRQ0xDdkZZdUdqSWVQaDQ2SWtJbVFpNUNMajQyUGpvNlBqWStMa0l1UWlaQ0lqb2VQaDQyR2k0YUxob21JaDRlSWlvYUxoZ2p2WnhXTDkwc0ZpNUNOajQ2T2o0K1BqWkNMajR5U2tKV1dsWmFWbDVTWG1KdVZsNUdSam82T2tJNlJqWkNOa0l5UGpJNk1rWTJUQ0l5U2pKR01qNHlQalpDT2tZNlJqcENQam82UGo0MlFpNVNMazRxU2laS0prWWlQaUpDSWpvaVBobzZHalllTWh3aU5oNHlHaklhTWhZdUhpNGlMaUl1SGk0ZUxnNHVFaVlTSmhJbUZpWWVKaDRtRmg0V0xpb3FKaW9tSmlJcUppb2tJaTRxS2lJcUpDTnFMQlpxTG1JV1dnSmFBa0grTGZJdDZobjJBZjQ2RGpZU0xoSXQ5aDM2Q2Y0K0JpMytIZ0ltQWhZS0VoSTEyaG5tQWZnaC9mWGlEY29zSVpvc0Zmb3Qrakh5T2ZJNS9qb09PZzQxL2ozMlFjNU44ajRTTWhvdUhqWWlPaDQrSmo0dVFDQTVuaS9jNUZZdUdqWWFPaUkrSGo0bVFpd2plaXdXUWk0K05qbytQam8yUWk1QUlpL2RLQll1UWlaQ0hqb2lQaDQyR2l3ZzRpd1dHaTRlSmg0ZUlpSW1HaTRZSWkvdEtCYkQzSmhXTGtJeVBqNCtPanBDTmtJdVFpNCtKajRpT2g0MkhpNGFMaG9tSGlJZUhoNGVLaG91R2k0YU1pSStIajRxUGk1QUk3L3NuRll2M1N3V0xrSTJRajQ2T2o0K05rSXVTaTVxUG81T1prSmVQazQ2VGpaZU9tbzZhanBpTW1Jc0lzSXNGcEl1ZWc1ZDlsbjZRZW9sMWtvU1JnbzJBajRDTGdJZUFsSCtQZm90OWk0V0poSWlDbG9DUWZJdDdpM3lGZm9HQUNJQ0Fmb1o4aXdnOGl3V01pSXlKaTRtTWlZeUpqWW1NaUl5S2k0bVBoSTJHalllTmg0MkdqWU9NaEl5RWk0U0xob3VIaTRpTGlZdUdpb1lJaW9XS2hvbUhpb2VKaDRpR2g0ZUloNGFJaDRpRmlJU0poSW1EaW9LTGhvdUhqWWlQaDQrSWo0aVJpSkdKa0lxUENJcVBpcEdLa29tVGlwR0tqNHFPaVpDSmtZaVFpSkNJam9XU2daWituSUtYZ1phQmxvR1doSkdIaTRhTGg0Mkhqd2lJam9tUWk0OElEdmlVRlBpVUZZc01DZ0FBQUFBREFnQUJrQUFGQUFBQlRBRm1BQUFBUndGTUFXWUFBQUQxQUJrQWhBQUFBQUFBQUFBQUFBQUFBQUFBQUFFUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFQRmxBZUQvNFAvZ0FlQUFJQUFBQUFFQUFBQUFBQUFBQUFBQUFDQUFBQUFBQUFJQUFBQURBQUFBRkFBREFBRUFBQUFVQUFRQWtBQUFBQ0FBSUFBRUFBQUFBUUFnNWdYd0J2QU44Q1B3THZCdThIRHdpdkNYOEp6eEkvRmwvLzMvL3dBQUFBQUFJT1lBOEFUd0RQQWo4Qzd3YnZCdzhJZndsL0NjOFNQeFpQLzkvLzhBQWYvakdnUVFCaEFCRCt3UDRnK2pENklQakErQUQzd085ZzYyQUFNQUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFQUFmLy9BQThBQVFBQUFBRUFBSnJWbExKZkR6ejFBQXNDQUFBQUFBRFAvR09EQUFBQUFNLzhZNE1BQVAvYkFnQUIyd0FBQUFnQUFnQUFBQUFBQUFBQkFBQUI0UC9nQUFBQ0FBQUFBQUFDQUFBQkFBQUFBQUFBQUFBQUFBQUFBQUFBSEFBQUFBQUFBQUFBQUFBQUFBRUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBZ0FBQUFJQUFBQUNBQUFBQWR3QUFBSGNBQUFDQUFBakFaTUFId0ZKQUFBQmJnQUFBZ0FBQUFJQUFBQUNBQUFBQWdBQUFBRUFBQUFDQUFBQUFXNEFBQUhjQUFBQjNBQUJBZHdBQUFIY0FBQUFBRkFBQUJ3QUFBQUFBQTRBcmdBQkFBQUFBQUFCQUF3QUFBQUJBQUFBQUFBQ0FBNEFRQUFCQUFBQUFBQURBQXdBSWdBQkFBQUFBQUFFQUF3QVRnQUJBQUFBQUFBRkFCWUFEQUFCQUFBQUFBQUdBQVlBTGdBQkFBQUFBQUFLQURRQVdnQURBQUVFQ1FBQkFBd0FBQUFEQUFFRUNRQUNBQTRBUUFBREFBRUVDUUFEQUF3QUlnQURBQUVFQ1FBRUFBd0FUZ0FEQUFFRUNRQUZBQllBREFBREFBRUVDUUFHQUF3QU5BQURBQUVFQ1FBS0FEUUFXZ0J5QUdFQWRBQnBBRzRBWndCV0FHVUFjZ0J6QUdrQWJ3QnVBQ0FBTVFBdUFEQUFjZ0JoQUhRQWFRQnVBR2R5WVhScGJtY0FjZ0JoQUhRQWFRQnVBR2NBVWdCbEFHY0FkUUJzQUdFQWNnQnlBR0VBZEFCcEFHNEFad0JHQUc4QWJnQjBBQ0FBWndCbEFHNEFaUUJ5QUdFQWRBQmxBR1FBSUFCaUFIa0FJQUJKQUdNQWJ3Qk5BRzhBYndCdUFDNEFBd0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkgZm9ybWF0KCd3b2ZmJyk7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc3R5bGU6bm9ybWFsfS51aS5yYXRpbmcgLmljb257Zm9udC1mYW1pbHk6UmF0aW5nO2xpbmUtaGVpZ2h0OjE7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtmb250LXdlaWdodDo0MDA7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1hbGlnbjpjZW50ZXJ9LnVpLnJhdGluZyAuaWNvbjpiZWZvcmV7Y29udGVudDonXFxcXGYwMDUnfS51aS5yYXRpbmcgLmFjdGl2ZS5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjAwNSd9LnVpLnN0YXIucmF0aW5nIC5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjAwNSd9LnVpLnN0YXIucmF0aW5nIC5hY3RpdmUuaWNvbjpiZWZvcmV7Y29udGVudDonXFxcXGYwMDUnfS51aS5zdGFyLnJhdGluZyAucGFydGlhbC5pY29uOmJlZm9yZXtjb250ZW50OidcXFxcZjAwNid9LnVpLnN0YXIucmF0aW5nIC5wYXJ0aWFsLmljb257Y29udGVudDonXFxcXGYwMDUnfS51aS5oZWFydC5yYXRpbmcgLmljb246YmVmb3Jle2NvbnRlbnQ6J1xcXFxmMDA0J30udWkuaGVhcnQucmF0aW5nIC5hY3RpdmUuaWNvbjpiZWZvcmV7Y29udGVudDonXFxcXGYwMDQnfS8qIVxcbiAqICMgU2VtYW50aWMgVUkgMi40LjAgLSBTZWFyY2hcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5zZWFyY2h7cG9zaXRpb246cmVsYXRpdmV9LnVpLnNlYXJjaD4ucHJvbXB0e21hcmdpbjowO291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwKTt0ZXh0LXNoYWRvdzpub25lO2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjIxNDI4NTcxZW07cGFkZGluZzouNjc4NTcxNDNlbSAxZW07Zm9udC1zaXplOjFlbTtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xNSk7Y29sb3I6cmdiYSgwLDAsMCwuODcpOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAwIHRyYW5zcGFyZW50IGluc2V0O2JveC1zaGFkb3c6MCAwIDAgMCB0cmFuc3BhcmVudCBpbnNldDstd2Via2l0LXRyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZSxjb2xvciAuMXMgZWFzZSxib3gtc2hhZG93IC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjFzIGVhc2UsY29sb3IgLjFzIGVhc2UsYm94LXNoYWRvdyAuMXMgZWFzZSxib3JkZXItY29sb3IgLjFzIGVhc2UsLXdlYmtpdC1ib3gtc2hhZG93IC4xcyBlYXNlfS51aS5zZWFyY2ggLnByb21wdHtib3JkZXItcmFkaXVzOjUwMHJlbX0udWkuc2VhcmNoIC5wcm9tcHR+LnNlYXJjaC5pY29ue2N1cnNvcjpwb2ludGVyfS51aS5zZWFyY2g+LnJlc3VsdHN7ZGlzcGxheTpub25lO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxMDAlO2xlZnQ6MDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIHRvcDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciB0b3A7d2hpdGUtc3BhY2U6bm9ybWFsO3RleHQtYWxpZ246bGVmdDt0ZXh0LXRyYW5zZm9ybTpub25lO2JhY2tncm91bmQ6I2ZmZjttYXJnaW4tdG9wOi41ZW07d2lkdGg6MThlbTtib3JkZXItcmFkaXVzOi4yODU3MTQyOXJlbTstd2Via2l0LWJveC1zaGFkb3c6MCAycHggNHB4IDAgcmdiYSgzNCwzNiwzOCwuMTIpLDAgMnB4IDEwcHggMCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDJweCA0cHggMCByZ2JhKDM0LDM2LDM4LC4xMiksMCAycHggMTBweCAwIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDU7ei1pbmRleDo5OTh9LnVpLnNlYXJjaD4ucmVzdWx0cz46Zmlyc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW0gLjI4NTcxNDI5cmVtIDAgMH0udWkuc2VhcmNoPi5yZXN1bHRzPjpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAwIC4yODU3MTQyOXJlbSAuMjg1NzE0MjlyZW19LnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0e2N1cnNvcjpwb2ludGVyO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtc2l6ZToxZW07cGFkZGluZzouODU3MTQyODZlbSAxLjE0Mjg1NzE0ZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpO2xpbmUtaGVpZ2h0OjEuMzM7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgzNCwzNiwzOCwuMSl9LnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0Omxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lIWltcG9ydGFudH0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQgLmltYWdle2Zsb2F0OnJpZ2h0O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kOjAgMDt3aWR0aDo1ZW07aGVpZ2h0OjNlbTtib3JkZXItcmFkaXVzOi4yNWVtfS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdCAuaW1hZ2UgaW1ne2Rpc3BsYXk6YmxvY2s7d2lkdGg6YXV0bztoZWlnaHQ6MTAwJX0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQgLmltYWdlKy5jb250ZW50e21hcmdpbjowIDZlbSAwIDB9LnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0IC50aXRsZXttYXJnaW46LS4xNDI4NTcxNGVtIDAgMDtmb250LWZhbWlseTpMYXRvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsSGVsdmV0aWNhLHNhbnMtc2VyaWY7Zm9udC13ZWlnaHQ6NzAwO2ZvbnQtc2l6ZToxZW07Y29sb3I6cmdiYSgwLDAsMCwuODUpfS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdCAuZGVzY3JpcHRpb257bWFyZ2luLXRvcDowO2ZvbnQtc2l6ZTouOTI4NTcxNDNlbTtjb2xvcjpyZ2JhKDAsMCwwLC40KX0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQgLnByaWNle2Zsb2F0OnJpZ2h0O2NvbG9yOiMyMWJhNDV9LnVpLnNlYXJjaD4ucmVzdWx0cz4ubWVzc2FnZXtwYWRkaW5nOjFlbSAxZW19LnVpLnNlYXJjaD4ucmVzdWx0cz4ubWVzc2FnZSAuaGVhZGVye2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6MXJlbTtmb250LXdlaWdodDo3MDA7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zZWFyY2g+LnJlc3VsdHM+Lm1lc3NhZ2UgLmRlc2NyaXB0aW9ue21hcmdpbi10b3A6LjI1cmVtO2ZvbnQtc2l6ZToxZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpfS51aS5zZWFyY2g+LnJlc3VsdHM+LmFjdGlvbntkaXNwbGF5OmJsb2NrO2JvcmRlci10b3A6bm9uZTtiYWNrZ3JvdW5kOiNmM2Y0ZjU7cGFkZGluZzouOTI4NTcxNDNlbSAxZW07Y29sb3I6cmdiYSgwLDAsMCwuODcpO2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWFsaWduOmNlbnRlcn0udWkuc2VhcmNoPi5wcm9tcHQ6Zm9jdXN7Ym9yZGVyLWNvbG9yOnJnYmEoMzQsMzYsMzgsLjM1KTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6cmdiYSgwLDAsMCwuOTUpfS51aS5sb2FkaW5nLnNlYXJjaCAuaW5wdXQ+aS5pY29uOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OicnO3RvcDo1MCU7bGVmdDo1MCU7bWFyZ2luOi0uNjQyODU3MTRlbSAwIDAgLS42NDI4NTcxNGVtO3dpZHRoOjEuMjg1NzE0MjllbTtoZWlnaHQ6MS4yODU3MTQyOWVtO2JvcmRlci1yYWRpdXM6NTAwcmVtO2JvcmRlcjouMmVtIHNvbGlkIHJnYmEoMCwwLDAsLjEpfS51aS5sb2FkaW5nLnNlYXJjaCAuaW5wdXQ+aS5pY29uOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjUwJTtsZWZ0OjUwJTttYXJnaW46LS42NDI4NTcxNGVtIDAgMCAtLjY0Mjg1NzE0ZW07d2lkdGg6MS4yODU3MTQyOWVtO2hlaWdodDoxLjI4NTcxNDI5ZW07LXdlYmtpdC1hbmltYXRpb246YnV0dG9uLXNwaW4gLjZzIGxpbmVhcjthbmltYXRpb246YnV0dG9uLXNwaW4gLjZzIGxpbmVhcjstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZTtib3JkZXItcmFkaXVzOjUwMHJlbTtib3JkZXItY29sb3I6Izc2NzY3NiB0cmFuc3BhcmVudCB0cmFuc3BhcmVudDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOi4yZW07LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudDtib3gtc2hhZG93OjAgMCAwIDFweCB0cmFuc3BhcmVudH0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeSAucmVzdWx0OmhvdmVyLC51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdDpob3ZlcntiYWNrZ3JvdW5kOiNmOWZhZmJ9LnVpLnNlYXJjaCAuYWN0aW9uOmhvdmVye2JhY2tncm91bmQ6I2UwZTBlMH0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeS5hY3RpdmV7YmFja2dyb3VuZDojZjNmNGY1fS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5LmFjdGl2ZT4ubmFtZXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnkgLnJlc3VsdC5hY3RpdmUsLnVpLnNlYXJjaD4ucmVzdWx0cyAucmVzdWx0LmFjdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDM0LDM2LDM4LC4xKTtiYWNrZ3JvdW5kOiNmM2Y0ZjU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lfS51aS5zZWFyY2g+LnJlc3VsdHMgLnJlc3VsdC5hY3RpdmUgLnRpdGxle2NvbG9yOnJnYmEoMCwwLDAsLjg1KX0udWkuc2VhcmNoPi5yZXN1bHRzIC5yZXN1bHQuYWN0aXZlIC5kZXNjcmlwdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44NSl9LnVpLmRpc2FibGVkLnNlYXJjaHtjdXJzb3I6ZGVmYXVsdDtwb2ludGVyLWV2ZW50czpub25lO29wYWNpdHk6LjQ1fS51aS5zZWFyY2guc2VsZWN0aW9uIC5wcm9tcHR7Ym9yZGVyLXJhZGl1czouMjg1NzE0MjlyZW19LnVpLnNlYXJjaC5zZWxlY3Rpb24+Lmljb24uaW5wdXQ+LnJlbW92ZS5pY29ue3BvaW50ZXItZXZlbnRzOm5vbmU7cG9zaXRpb246YWJzb2x1dGU7bGVmdDphdXRvO29wYWNpdHk6MDtjb2xvcjonJzt0b3A6MDtyaWdodDowOy13ZWJraXQtdHJhbnNpdGlvbjpjb2xvciAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlO3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZX0udWkuc2VhcmNoLnNlbGVjdGlvbj4uaWNvbi5pbnB1dD4uYWN0aXZlLnJlbW92ZS5pY29ue2N1cnNvcjpwb2ludGVyO29wYWNpdHk6Ljg7cG9pbnRlci1ldmVudHM6YXV0b30udWkuc2VhcmNoLnNlbGVjdGlvbj4uaWNvbi5pbnB1dDpub3QoW2NsYXNzKj1cXFwibGVmdCBpY29uXFxcIl0pPi5pY29ufi5yZW1vdmUuaWNvbntyaWdodDoxLjg1NzE0ZW19LnVpLnNlYXJjaC5zZWxlY3Rpb24+Lmljb24uaW5wdXQ+LnJlbW92ZS5pY29uOmhvdmVye29wYWNpdHk6MTtjb2xvcjojZGIyODI4fS51aS5jYXRlZ29yeS5zZWFyY2ggLnJlc3VsdHN7d2lkdGg6MjhlbX0udWkuY2F0ZWdvcnkuc2VhcmNoIC5yZXN1bHRzLmFuaW1hdGluZywudWkuY2F0ZWdvcnkuc2VhcmNoIC5yZXN1bHRzLnZpc2libGV7ZGlzcGxheTp0YWJsZX0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeXtkaXNwbGF5OnRhYmxlLXJvdztiYWNrZ3JvdW5kOiNmM2Y0ZjU7LXdlYmtpdC1ib3gtc2hhZG93Om5vbmU7Ym94LXNoYWRvdzpub25lOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlfS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5Omxhc3QtY2hpbGR7Ym9yZGVyLWJvdHRvbTpub25lfS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5OmZpcnN0LWNoaWxkIC5uYW1lKy5yZXN1bHR7Ym9yZGVyLXJhZGl1czowIC4yODU3MTQyOXJlbSAwIDB9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnk6bGFzdC1jaGlsZCAucmVzdWx0Omxhc3QtY2hpbGR7Ym9yZGVyLXJhZGl1czowIDAgLjI4NTcxNDI5cmVtIDB9LnVpLmNhdGVnb3J5LnNlYXJjaD4ucmVzdWx0cyAuY2F0ZWdvcnk+Lm5hbWV7ZGlzcGxheTp0YWJsZS1jZWxsO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2lkdGg6MTAwcHg7d2hpdGUtc3BhY2U6bm93cmFwO2JhY2tncm91bmQ6MCAwO2ZvbnQtZmFtaWx5OkxhdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxIZWx2ZXRpY2Esc2Fucy1zZXJpZjtmb250LXNpemU6MWVtO3BhZGRpbmc6LjRlbSAxZW07Zm9udC13ZWlnaHQ6NzAwO2NvbG9yOnJnYmEoMCwwLDAsLjQpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpfS51aS5jYXRlZ29yeS5zZWFyY2g+LnJlc3VsdHMgLmNhdGVnb3J5IC5yZXN1bHRze2Rpc3BsYXk6dGFibGUtY2VsbDtiYWNrZ3JvdW5kOiNmZmY7Ym9yZGVyLWxlZnQ6MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjE1KTtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDM0LDM2LDM4LC4xKX0udWkuY2F0ZWdvcnkuc2VhcmNoPi5yZXN1bHRzIC5jYXRlZ29yeSAucmVzdWx0e2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMzQsMzYsMzgsLjEpOy13ZWJraXQtdHJhbnNpdGlvbjpiYWNrZ3JvdW5kIC4xcyBlYXNlLGJvcmRlci1jb2xvciAuMXMgZWFzZTt0cmFuc2l0aW9uOmJhY2tncm91bmQgLjFzIGVhc2UsYm9yZGVyLWNvbG9yIC4xcyBlYXNlO3BhZGRpbmc6Ljg1NzE0Mjg2ZW0gMS4xNDI4NTcxNGVtfS51aVtjbGFzcyo9XFxcImxlZnQgYWxpZ25lZFxcXCJdLnNlYXJjaD4ucmVzdWx0c3tyaWdodDphdXRvO2xlZnQ6MH0udWlbY2xhc3MqPVxcXCJyaWdodCBhbGlnbmVkXFxcIl0uc2VhcmNoPi5yZXN1bHRze3JpZ2h0OjA7bGVmdDphdXRvfS51aS5mbHVpZC5zZWFyY2ggLnJlc3VsdHN7d2lkdGg6MTAwJX0udWkubWluaS5zZWFyY2h7Zm9udC1zaXplOi43ODU3MTQyOWVtfS51aS5zbWFsbC5zZWFyY2h7Zm9udC1zaXplOi45Mjg1NzE0M2VtfS51aS5zZWFyY2h7Zm9udC1zaXplOjFlbX0udWkubGFyZ2Uuc2VhcmNoe2ZvbnQtc2l6ZToxLjE0Mjg1NzE0ZW19LnVpLmJpZy5zZWFyY2h7Zm9udC1zaXplOjEuMjg1NzE0MjllbX0udWkuaHVnZS5zZWFyY2h7Zm9udC1zaXplOjEuNDI4NTcxNDNlbX0udWkubWFzc2l2ZS5zZWFyY2h7Zm9udC1zaXplOjEuNzE0Mjg1NzFlbX1AbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzY3cHgpey51aS5zZWFyY2ggLnJlc3VsdHN7bWF4LXdpZHRoOmNhbGMoMTAwdncgLSAycmVtKX19LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFNoYXBlXFxuICogaHR0cDovL2dpdGh1Yi5jb20vc2VtYW50aWMtb3JnL3NlbWFudGljLXVpL1xcbiAqXFxuICpcXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcXG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXFxuICpcXG4gKi8udWkuc2hhcGV7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246dG9wO2Rpc3BsYXk6aW5saW5lLWJsb2NrOy13ZWJraXQtcGVyc3BlY3RpdmU6MjAwMHB4O3BlcnNwZWN0aXZlOjIwMDBweDstd2Via2l0LXRyYW5zaXRpb246bGVmdCAuNnMgZWFzZS1pbi1vdXQsd2lkdGggLjZzIGVhc2UtaW4tb3V0LGhlaWdodCAuNnMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246bGVmdCAuNnMgZWFzZS1pbi1vdXQsd2lkdGggLjZzIGVhc2UtaW4tb3V0LGhlaWdodCAuNnMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246dHJhbnNmb3JtIC42cyBlYXNlLWluLW91dCxsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dDt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQsbGVmdCAuNnMgZWFzZS1pbi1vdXQsd2lkdGggLjZzIGVhc2UtaW4tb3V0LGhlaWdodCAuNnMgZWFzZS1pbi1vdXQsLXdlYmtpdC10cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0fS51aS5zaGFwZSAuc2lkZXN7LXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6cHJlc2VydmUtM2Q7dHJhbnNmb3JtLXN0eWxlOnByZXNlcnZlLTNkfS51aS5zaGFwZSAuc2lkZXtvcGFjaXR5OjE7d2lkdGg6MTAwJTttYXJnaW46MCFpbXBvcnRhbnQ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbn0udWkuc2hhcGUgLnNpZGV7ZGlzcGxheTpub25lfS51aS5zaGFwZSAuc2lkZSAqey13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudDtiYWNrZmFjZS12aXNpYmlsaXR5OnZpc2libGUhaW1wb3J0YW50fS51aS5jdWJlLnNoYXBlIC5zaWRle21pbi13aWR0aDoxNWVtO2hlaWdodDoxNWVtO3BhZGRpbmc6MmVtO2JhY2tncm91bmQtY29sb3I6I2U2ZTZlNjtjb2xvcjpyZ2JhKDAsMCwwLC44Nyk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAycHggcmdiYSgwLDAsMCwuMyk7Ym94LXNoYWRvdzowIDAgMnB4IHJnYmEoMCwwLDAsLjMpfS51aS5jdWJlLnNoYXBlIC5zaWRlPi5jb250ZW50e3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7ZGlzcGxheTp0YWJsZTt0ZXh0LWFsaWduOmNlbnRlcjstd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7LW1vei11c2VyLXNlbGVjdDp0ZXh0Oy1tcy11c2VyLXNlbGVjdDp0ZXh0O3VzZXItc2VsZWN0OnRleHR9LnVpLmN1YmUuc2hhcGUgLnNpZGU+LmNvbnRlbnQ+ZGl2e2Rpc3BsYXk6dGFibGUtY2VsbDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Zm9udC1zaXplOjJlbX0udWkudGV4dC5zaGFwZS5hbmltYXRpbmcgLnNpZGVze3Bvc2l0aW9uOnN0YXRpY30udWkudGV4dC5zaGFwZSAuc2lkZXt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLnRleHQuc2hhcGUgLnNpZGU+Knt3aGl0ZS1zcGFjZTpub3JtYWx9LnVpLmxvYWRpbmcuc2hhcGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOi05OTk5cHg7bGVmdDotOTk5OXB4fS51aS5zaGFwZSAuYW5pbWF0aW5nLnNpZGV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2Rpc3BsYXk6YmxvY2s7ei1pbmRleDoxMDB9LnVpLnNoYXBlIC5oaWRkZW4uc2lkZXtvcGFjaXR5Oi42fS51aS5zaGFwZS5hbmltYXRpbmcgLnNpZGVze3Bvc2l0aW9uOmFic29sdXRlfS51aS5zaGFwZS5hbmltYXRpbmcgLnNpZGVzey13ZWJraXQtdHJhbnNpdGlvbjpsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dCwtd2Via2l0LXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dCwtd2Via2l0LXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjZzIGVhc2UtaW4tb3V0LGxlZnQgLjZzIGVhc2UtaW4tb3V0LHdpZHRoIC42cyBlYXNlLWluLW91dCxoZWlnaHQgLjZzIGVhc2UtaW4tb3V0O3RyYW5zaXRpb246dHJhbnNmb3JtIC42cyBlYXNlLWluLW91dCxsZWZ0IC42cyBlYXNlLWluLW91dCx3aWR0aCAuNnMgZWFzZS1pbi1vdXQsaGVpZ2h0IC42cyBlYXNlLWluLW91dCwtd2Via2l0LXRyYW5zZm9ybSAuNnMgZWFzZS1pbi1vdXR9LnVpLnNoYXBlLmFuaW1hdGluZyAuc2lkZXstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAuNnMgZWFzZS1pbi1vdXQ7dHJhbnNpdGlvbjpvcGFjaXR5IC42cyBlYXNlLWluLW91dH0udWkuc2hhcGUgLmFjdGl2ZS5zaWRle2Rpc3BsYXk6YmxvY2t9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFNpZGViYXJcXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy51aS5zaWRlYmFye3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuOy13ZWJraXQtdHJhbnNpdGlvbjpub25lO3RyYW5zaXRpb246bm9uZTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm07LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dmlzaWJpbGl0eTpoaWRkZW47LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7aGVpZ2h0OjEwMCUhaW1wb3J0YW50O21heC1oZWlnaHQ6MTAwJTtib3JkZXItcmFkaXVzOjAhaW1wb3J0YW50O21hcmdpbjowIWltcG9ydGFudDtvdmVyZmxvdy15OmF1dG8haW1wb3J0YW50O3otaW5kZXg6MTAyfS51aS5zaWRlYmFyPip7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbn0udWkubGVmdC5zaWRlYmFye3JpZ2h0OmF1dG87bGVmdDowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9LnVpLnJpZ2h0LnNpZGViYXJ7cmlnaHQ6MCFpbXBvcnRhbnQ7bGVmdDphdXRvIWltcG9ydGFudDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0udWkuYm90dG9tLnNpZGViYXIsLnVpLnRvcC5zaWRlYmFye3dpZHRoOjEwMCUhaW1wb3J0YW50O2hlaWdodDphdXRvIWltcG9ydGFudH0udWkudG9wLnNpZGViYXJ7dG9wOjAhaW1wb3J0YW50O2JvdHRvbTphdXRvIWltcG9ydGFudDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfS51aS5ib3R0b20uc2lkZWJhcnt0b3A6YXV0byFpbXBvcnRhbnQ7Ym90dG9tOjAhaW1wb3J0YW50Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfS5wdXNoYWJsZXtoZWlnaHQ6MTAwJTtvdmVyZmxvdy14OmhpZGRlbjtwYWRkaW5nOjAhaW1wb3J0YW50fWJvZHkucHVzaGFibGV7YmFja2dyb3VuZDojNTQ1NDU0IWltcG9ydGFudH0ucHVzaGFibGU6bm90KGJvZHkpey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfS5wdXNoYWJsZTpub3QoYm9keSk+LmZpeGVkLC5wdXNoYWJsZTpub3QoYm9keSk+LnB1c2hlcjphZnRlciwucHVzaGFibGU6bm90KGJvZHkpPi51aS5zaWRlYmFye3Bvc2l0aW9uOmFic29sdXRlfS5wdXNoYWJsZT4uZml4ZWR7cG9zaXRpb246Zml4ZWQ7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt3aWxsLWNoYW5nZTp0cmFuc2Zvcm07ei1pbmRleDoxMDF9LnB1c2hhYmxlPi5wdXNoZXJ7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtiYWNrZmFjZS12aXNpYmlsaXR5OmhpZGRlbjtvdmVyZmxvdzpoaWRkZW47bWluLWhlaWdodDoxMDAlOy13ZWJraXQtdHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246dHJhbnNmb3JtIC41cyBlYXNlLC13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3otaW5kZXg6Mn1ib2R5LnB1c2hhYmxlPi5wdXNoZXJ7YmFja2dyb3VuZDojZmZmfS5wdXNoYWJsZT4ucHVzaGVye2JhY2tncm91bmQ6aW5oZXJpdH0ucHVzaGFibGU+LnB1c2hlcjphZnRlcntwb3NpdGlvbjpmaXhlZDt0b3A6MDtyaWdodDowO2NvbnRlbnQ6Jyc7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40KTtvdmVyZmxvdzpoaWRkZW47b3BhY2l0eTowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IC41czt0cmFuc2l0aW9uOm9wYWNpdHkgLjVzO3dpbGwtY2hhbmdlOm9wYWNpdHk7ei1pbmRleDoxMDAwfS51aS5zaWRlYmFyLm1lbnUgLml0ZW17Ym9yZGVyLXJhZGl1czowIWltcG9ydGFudH0ucHVzaGFibGU+LnB1c2hlci5kaW1tZWQ6YWZ0ZXJ7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7aGVpZ2h0OjEwMCUhaW1wb3J0YW50O29wYWNpdHk6MSFpbXBvcnRhbnR9LnVpLmFuaW1hdGluZy5zaWRlYmFye3Zpc2liaWxpdHk6dmlzaWJsZX0udWkudmlzaWJsZS5zaWRlYmFye3Zpc2liaWxpdHk6dmlzaWJsZTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkubGVmdC52aXNpYmxlLnNpZGViYXIsLnVpLnJpZ2h0LnZpc2libGUuc2lkZWJhcnstd2Via2l0LWJveC1zaGFkb3c6MCAwIDIwcHggcmdiYSgzNCwzNiwzOCwuMTUpO2JveC1zaGFkb3c6MCAwIDIwcHggcmdiYSgzNCwzNiwzOCwuMTUpfS51aS5ib3R0b20udmlzaWJsZS5zaWRlYmFyLC51aS50b3AudmlzaWJsZS5zaWRlYmFyey13ZWJraXQtYm94LXNoYWRvdzowIDAgMjBweCByZ2JhKDM0LDM2LDM4LC4xNSk7Ym94LXNoYWRvdzowIDAgMjBweCByZ2JhKDM0LDM2LDM4LC4xNSl9LnVpLnZpc2libGUubGVmdC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNjBweCwwLDApfS51aS52aXNpYmxlLnJpZ2h0LnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjYwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI2MHB4LDAsMCl9LnVpLnZpc2libGUudG9wLnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLnRvcC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwzNnB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDM2cHgsMCl9LnVpLnZpc2libGUuYm90dG9tLnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLmJvdHRvbS5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzZweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMzZweCwwKX0udWkudmlzaWJsZS5sZWZ0LnNpZGViYXJ+LnVpLnZpc2libGUucmlnaHQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUubGVmdC5zaWRlYmFyfi51aS52aXNpYmxlLnJpZ2h0LnNpZGViYXJ+LnB1c2hlciwudWkudmlzaWJsZS5yaWdodC5zaWRlYmFyfi51aS52aXNpYmxlLmxlZnQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUucmlnaHQuc2lkZWJhcn4udWkudmlzaWJsZS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudGhpbi5sZWZ0LnNpZGViYXIsLnVpLnRoaW4ucmlnaHQuc2lkZWJhcnt3aWR0aDoxNTBweH0udWlbY2xhc3MqPVxcXCJ2ZXJ5IHRoaW5cXFwiXS5sZWZ0LnNpZGViYXIsLnVpW2NsYXNzKj1cXFwidmVyeSB0aGluXFxcIl0ucmlnaHQuc2lkZWJhcnt3aWR0aDo2MHB4fS51aS5sZWZ0LnNpZGViYXIsLnVpLnJpZ2h0LnNpZGViYXJ7d2lkdGg6MjYwcHh9LnVpLndpZGUubGVmdC5zaWRlYmFyLC51aS53aWRlLnJpZ2h0LnNpZGViYXJ7d2lkdGg6MzUwcHh9LnVpW2NsYXNzKj1cXFwidmVyeSB3aWRlXFxcIl0ubGVmdC5zaWRlYmFyLC51aVtjbGFzcyo9XFxcInZlcnkgd2lkZVxcXCJdLnJpZ2h0LnNpZGViYXJ7d2lkdGg6NDc1cHh9LnVpLnZpc2libGUudGhpbi5sZWZ0LnNpZGViYXJ+LmZpeGVkLC51aS52aXNpYmxlLnRoaW4ubGVmdC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTUwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTUwcHgsMCwwKX0udWkudmlzaWJsZVtjbGFzcyo9XFxcInZlcnkgdGhpblxcXCJdLmxlZnQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGVbY2xhc3MqPVxcXCJ2ZXJ5IHRoaW5cXFwiXS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCg2MHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDYwcHgsMCwwKX0udWkudmlzaWJsZS53aWRlLmxlZnQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUud2lkZS5sZWZ0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgzNTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgzNTBweCwwLDApfS51aS52aXNpYmxlW2NsYXNzKj1cXFwidmVyeSB3aWRlXFxcIl0ubGVmdC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZVtjbGFzcyo9XFxcInZlcnkgd2lkZVxcXCJdLmxlZnQuc2lkZWJhcn4ucHVzaGVyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDQ3NXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDQ3NXB4LDAsMCl9LnVpLnZpc2libGUudGhpbi5yaWdodC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZS50aGluLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTE1MHB4LDAsMCl9LnVpLnZpc2libGVbY2xhc3MqPVxcXCJ2ZXJ5IHRoaW5cXFwiXS5yaWdodC5zaWRlYmFyfi5maXhlZCwudWkudmlzaWJsZVtjbGFzcyo9XFxcInZlcnkgdGhpblxcXCJdLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNjBweCwwLDApfS51aS52aXNpYmxlLndpZGUucmlnaHQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUud2lkZS5yaWdodC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTM1MHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0zNTBweCwwLDApfS51aS52aXNpYmxlW2NsYXNzKj1cXFwidmVyeSB3aWRlXFxcIl0ucmlnaHQuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGVbY2xhc3MqPVxcXCJ2ZXJ5IHdpZGVcXFwiXS5yaWdodC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTQ3NXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC00NzVweCwwLDApfS51aS5vdmVybGF5LnNpZGViYXJ7ei1pbmRleDoxMDJ9LnVpLmxlZnQub3ZlcmxheS5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9LnVpLnJpZ2h0Lm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0udWkudG9wLm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfS51aS5ib3R0b20ub3ZlcmxheS5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfS5hbmltYXRpbmcudWkub3ZlcmxheS5zaWRlYmFyLC51aS52aXNpYmxlLm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZX0udWkudmlzaWJsZS5sZWZ0Lm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudmlzaWJsZS5yaWdodC5vdmVybGF5LnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9LnVpLnZpc2libGUudG9wLm92ZXJsYXkuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudmlzaWJsZS5ib3R0b20ub3ZlcmxheS5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfS51aS52aXNpYmxlLm92ZXJsYXkuc2lkZWJhcn4uZml4ZWQsLnVpLnZpc2libGUub3ZlcmxheS5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm06bm9uZSFpbXBvcnRhbnQ7dHJhbnNmb3JtOm5vbmUhaW1wb3J0YW50fS51aS5wdXNoLnNpZGViYXJ7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7ei1pbmRleDoxMDJ9LnVpLmxlZnQucHVzaC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMDAlLDAsMCl9LnVpLnJpZ2h0LnB1c2guc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMDAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKX0udWkudG9wLnB1c2guc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMDAlLDApfS51aS5ib3R0b20ucHVzaC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApfS51aS52aXNpYmxlLnB1c2guc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKX0udWkudW5jb3Zlci5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3otaW5kZXg6MX0udWkudmlzaWJsZS51bmNvdmVyLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCk7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2V9LnVpLnNsaWRlLmFsb25nLnNpZGViYXJ7ei1pbmRleDoxfS51aS5sZWZ0LnNsaWRlLmFsb25nLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTUwJSwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNTAlLDAsMCl9LnVpLnJpZ2h0LnNsaWRlLmFsb25nLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNTAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDUwJSwwLDApfS51aS50b3Auc2xpZGUuYWxvbmcuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01MCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTUwJSwwKX0udWkuYm90dG9tLnNsaWRlLmFsb25nLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1MCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNTAlLDApfS51aS5hbmltYXRpbmcuc2xpZGUuYWxvbmcuc2lkZWJhcnstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZX0udWkudmlzaWJsZS5zbGlkZS5hbG9uZy5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfS51aS5zbGlkZS5vdXQuc2lkZWJhcnt6LWluZGV4OjF9LnVpLmxlZnQuc2xpZGUub3V0LnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoNTAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDUwJSwwLDApfS51aS5yaWdodC5zbGlkZS5vdXQuc2lkZWJhcnstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNTAlLDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01MCUsMCwwKX0udWkudG9wLnNsaWRlLm91dC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNTAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDUwJSwwKX0udWkuYm90dG9tLnNsaWRlLm91dC5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTUwJSwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtNTAlLDApfS51aS5hbmltYXRpbmcuc2xpZGUub3V0LnNpZGViYXJ7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2V9LnVpLnZpc2libGUuc2xpZGUub3V0LnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDAsMCl9LnVpLnNjYWxlLmRvd24uc2lkZWJhcnstd2Via2l0LXRyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjotd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuNXMgZWFzZSwtd2Via2l0LXRyYW5zZm9ybSAuNXMgZWFzZTt6LWluZGV4OjEwMn0udWkubGVmdC5zY2FsZS5kb3duLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTEwMCUsMCwwKX0udWkucmlnaHQuc2NhbGUuZG93bi5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwMCUsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTAwJSwwLDApfS51aS50b3Auc2NhbGUuZG93bi5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCl9LnVpLmJvdHRvbS5zY2FsZS5kb3duLnNpZGViYXJ7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMDAlLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwMCUsMCl9LnVpLnNjYWxlLmRvd24ubGVmdC5zaWRlYmFyfi5wdXNoZXJ7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOjc1JSA1MCU7dHJhbnNmb3JtLW9yaWdpbjo3NSUgNTAlfS51aS5zY2FsZS5kb3duLnJpZ2h0LnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46MjUlIDUwJTt0cmFuc2Zvcm0tb3JpZ2luOjI1JSA1MCV9LnVpLnNjYWxlLmRvd24udG9wLnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46NTAlIDc1JTt0cmFuc2Zvcm0tb3JpZ2luOjUwJSA3NSV9LnVpLnNjYWxlLmRvd24uYm90dG9tLnNpZGViYXJ+LnB1c2hlcnstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46NTAlIDI1JTt0cmFuc2Zvcm0tb3JpZ2luOjUwJSAyNSV9LnVpLmFuaW1hdGluZy5zY2FsZS5kb3duPi52aXNpYmxlLnVpLnNpZGViYXJ7LXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC41cyBlYXNlO3RyYW5zaXRpb246LXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2U7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzIGVhc2UsLXdlYmtpdC10cmFuc2Zvcm0gLjVzIGVhc2V9LnVpLmFuaW1hdGluZy5zY2FsZS5kb3duLnNpZGViYXJ+LnB1c2hlciwudWkudmlzaWJsZS5zY2FsZS5kb3duLnNpZGViYXJ+LnB1c2hlcntkaXNwbGF5OmJsb2NrIWltcG9ydGFudDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbiFpbXBvcnRhbnR9LnVpLnZpc2libGUuc2NhbGUuZG93bi5zaWRlYmFyey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfS51aS52aXNpYmxlLnNjYWxlLmRvd24uc2lkZWJhcn4ucHVzaGVyey13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC43NSk7dHJhbnNmb3JtOnNjYWxlKC43NSl9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFN0aWNreVxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnN0aWNreXtwb3NpdGlvbjpzdGF0aWM7LXdlYmtpdC10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lO3otaW5kZXg6ODAwfS51aS5zdGlja3kuYm91bmR7cG9zaXRpb246YWJzb2x1dGU7bGVmdDphdXRvO3JpZ2h0OmF1dG99LnVpLnN0aWNreS5maXhlZHtwb3NpdGlvbjpmaXhlZDtsZWZ0OmF1dG87cmlnaHQ6YXV0b30udWkuc3RpY2t5LmJvdW5kLnRvcCwudWkuc3RpY2t5LmZpeGVkLnRvcHt0b3A6MDtib3R0b206YXV0b30udWkuc3RpY2t5LmJvdW5kLmJvdHRvbSwudWkuc3RpY2t5LmZpeGVkLmJvdHRvbXt0b3A6YXV0bztib3R0b206MH0udWkubmF0aXZlLnN0aWNreXtwb3NpdGlvbjotd2Via2l0LXN0aWNreTtwb3NpdGlvbjotbW96LXN0aWNreTtwb3NpdGlvbjotbXMtc3RpY2t5O3Bvc2l0aW9uOi1vLXN0aWNreTtwb3NpdGlvbjpzdGlja3l9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFRhYlxcbiAqIGh0dHA6Ly9naXRodWIuY29tL3NlbWFudGljLW9yZy9zZW1hbnRpYy11aS9cXG4gKlxcbiAqXFxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXFxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxcbiAqXFxuICovLnVpLnRhYntkaXNwbGF5Om5vbmV9LnVpLnRhYi5hY3RpdmUsLnVpLnRhYi5vcGVue2Rpc3BsYXk6YmxvY2t9LnVpLnRhYi5sb2FkaW5ne3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmJsb2NrO21pbi1oZWlnaHQ6MjUwcHh9LnVpLnRhYi5sb2FkaW5nICp7cG9zaXRpb246cmVsYXRpdmUhaW1wb3J0YW50O2xlZnQ6LTEwMDAwcHghaW1wb3J0YW50fS51aS50YWIubG9hZGluZy5zZWdtZW50OmJlZm9yZSwudWkudGFiLmxvYWRpbmc6YmVmb3Jle3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6Jyc7dG9wOjEwMHB4O2xlZnQ6NTAlO21hcmdpbjotMS4yNWVtIDAgMCAtMS4yNWVtO3dpZHRoOjIuNWVtO2hlaWdodDoyLjVlbTtib3JkZXItcmFkaXVzOjUwMHJlbTtib3JkZXI6LjJlbSBzb2xpZCByZ2JhKDAsMCwwLC4xKX0udWkudGFiLmxvYWRpbmcuc2VnbWVudDphZnRlciwudWkudGFiLmxvYWRpbmc6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7Y29udGVudDonJzt0b3A6MTAwcHg7bGVmdDo1MCU7bWFyZ2luOi0xLjI1ZW0gMCAwIC0xLjI1ZW07d2lkdGg6Mi41ZW07aGVpZ2h0OjIuNWVtOy13ZWJraXQtYW5pbWF0aW9uOmJ1dHRvbi1zcGluIC42cyBsaW5lYXI7YW5pbWF0aW9uOmJ1dHRvbi1zcGluIC42cyBsaW5lYXI7LXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7Ym9yZGVyLXJhZGl1czo1MDByZW07Ym9yZGVyLWNvbG9yOiM3Njc2NzYgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDouMmVtOy13ZWJraXQtYm94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnQ7Ym94LXNoYWRvdzowIDAgMCAxcHggdHJhbnNwYXJlbnR9LyohXFxuICogIyBTZW1hbnRpYyBVSSAyLjQuMCAtIFRyYW5zaXRpb25cXG4gKiBodHRwOi8vZ2l0aHViLmNvbS9zZW1hbnRpYy1vcmcvc2VtYW50aWMtdWkvXFxuICpcXG4gKlxcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcXG4gKlxcbiAqLy50cmFuc2l0aW9uey13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDoxO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6MTstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouM3M7YW5pbWF0aW9uLWR1cmF0aW9uOi4zczstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2U7LXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOmJvdGg7YW5pbWF0aW9uLWZpbGwtbW9kZTpib3RofS5hbmltYXRpbmcudHJhbnNpdGlvbnstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO3Zpc2liaWxpdHk6dmlzaWJsZSFpbXBvcnRhbnR9LmxvYWRpbmcudHJhbnNpdGlvbntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTk5OTk5cHg7bGVmdDotOTk5OTlweH0uaGlkZGVuLnRyYW5zaXRpb257ZGlzcGxheTpub25lO3Zpc2liaWxpdHk6aGlkZGVufS52aXNpYmxlLnRyYW5zaXRpb257ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7dmlzaWJpbGl0eTp2aXNpYmxlIWltcG9ydGFudH0uZGlzYWJsZWQudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1wbGF5LXN0YXRlOnBhdXNlZDthbmltYXRpb24tcGxheS1zdGF0ZTpwYXVzZWR9Lmxvb3BpbmcudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6aW5maW5pdGU7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZX0udHJhbnNpdGlvbi5icm93c2V7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246LjVzO2FuaW1hdGlvbi1kdXJhdGlvbjouNXN9LnRyYW5zaXRpb24uYnJvd3NlLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6YnJvd3NlSW47YW5pbWF0aW9uLW5hbWU6YnJvd3NlSW59LnRyYW5zaXRpb24uYnJvd3NlLmxlZnQub3V0LC50cmFuc2l0aW9uLmJyb3dzZS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpicm93c2VPdXRMZWZ0O2FuaW1hdGlvbi1uYW1lOmJyb3dzZU91dExlZnR9LnRyYW5zaXRpb24uYnJvd3NlLnJpZ2h0Lm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmJyb3dzZU91dFJpZ2h0O2FuaW1hdGlvbi1uYW1lOmJyb3dzZU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBicm93c2VJbnswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06c2NhbGUoLjgpIHRyYW5zbGF0ZVooMCk7ei1pbmRleDotMX0xMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjgpIHRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnNjYWxlKC44KSB0cmFuc2xhdGVaKDApO3otaW5kZXg6LTE7b3BhY2l0eTouN304MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4wNSkgdHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06c2NhbGUoMS4wNSkgdHJhbnNsYXRlWigwKTtvcGFjaXR5OjE7ei1pbmRleDo5OTl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKSB0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTpzY2FsZSgxKSB0cmFuc2xhdGVaKDApO3otaW5kZXg6OTk5fX1Aa2V5ZnJhbWVzIGJyb3dzZUluezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44KSB0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlWigwKTt6LWluZGV4Oi0xfTEwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlWigwKTt0cmFuc2Zvcm06c2NhbGUoLjgpIHRyYW5zbGF0ZVooMCk7ei1pbmRleDotMTtvcGFjaXR5Oi43fTgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjA1KSB0cmFuc2xhdGVaKDApO3RyYW5zZm9ybTpzY2FsZSgxLjA1KSB0cmFuc2xhdGVaKDApO29wYWNpdHk6MTt6LWluZGV4Ojk5OX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpIHRyYW5zbGF0ZVooMCk7dHJhbnNmb3JtOnNjYWxlKDEpIHRyYW5zbGF0ZVooMCk7ei1pbmRleDo5OTl9fUAtd2Via2l0LWtleWZyYW1lcyBicm93c2VPdXRMZWZ0ezAle3otaW5kZXg6OTk5Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKX01MCV7ei1pbmRleDotMTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDUlKSByb3RhdGVZKDM1ZGVnKSByb3RhdGVYKDEwZGVnKSB0cmFuc2xhdGVaKC0xMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCl9ODAle29wYWNpdHk6MX0xMDAle3otaW5kZXg6LTE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCkgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApIHRyYW5zbGF0ZVooLTEwcHgpO29wYWNpdHk6MH19QGtleWZyYW1lcyBicm93c2VPdXRMZWZ0ezAle3otaW5kZXg6OTk5Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKX01MCV7ei1pbmRleDotMTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMDUlKSByb3RhdGVZKDM1ZGVnKSByb3RhdGVYKDEwZGVnKSB0cmFuc2xhdGVaKC0xMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCl9ODAle29wYWNpdHk6MX0xMDAle3otaW5kZXg6LTE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCkgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApIHRyYW5zbGF0ZVooLTEwcHgpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIGJyb3dzZU91dFJpZ2h0ezAle3otaW5kZXg6OTk5Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKX01MCV7ei1pbmRleDoxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCl9ODAle29wYWNpdHk6MX0xMDAle3otaW5kZXg6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKSB0cmFuc2xhdGVaKC0xMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCkgdHJhbnNsYXRlWigtMTBweCk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGJyb3dzZU91dFJpZ2h0ezAle3otaW5kZXg6OTk5Oy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCkgcm90YXRlWSgwKSByb3RhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKX01MCV7ei1pbmRleDoxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTA1JSkgcm90YXRlWSgzNWRlZykgcm90YXRlWCgxMGRlZykgdHJhbnNsYXRlWigtMTBweCl9ODAle29wYWNpdHk6MX0xMDAle3otaW5kZXg6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApIHJvdGF0ZVkoMCkgcm90YXRlWCgwKSB0cmFuc2xhdGVaKC0xMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKSByb3RhdGVZKDApIHJvdGF0ZVgoMCkgdHJhbnNsYXRlWigtMTBweCk7b3BhY2l0eTowfX0uZHJvcC50cmFuc2l0aW9uey13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouNHM7YW5pbWF0aW9uLWR1cmF0aW9uOi40czstd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4zNCwxLjYxLC43LDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4zNCwxLjYxLC43LDEpfS5kcm9wLnRyYW5zaXRpb24uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpkcm9wSW47YW5pbWF0aW9uLW5hbWU6ZHJvcElufS5kcm9wLnRyYW5zaXRpb24ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZHJvcE91dDthbmltYXRpb24tbmFtZTpkcm9wT3V0fUAtd2Via2l0LWtleWZyYW1lcyBkcm9wSW57MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fUBrZXlmcmFtZXMgZHJvcEluezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZHJvcE91dHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19QGtleWZyYW1lcyBkcm9wT3V0ezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfX0udHJhbnNpdGlvbi5mYWRlLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZUluO2FuaW1hdGlvbi1uYW1lOmZhZGVJbn0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZhZGUgdXBcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblVwO2FuaW1hdGlvbi1uYW1lOmZhZGVJblVwfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmFkZSBkb3duXFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlSW5Eb3duO2FuaW1hdGlvbi1uYW1lOmZhZGVJbkRvd259LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmYWRlIGxlZnRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJbkxlZnQ7YW5pbWF0aW9uLW5hbWU6ZmFkZUluTGVmdH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZhZGUgcmlnaHRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVJblJpZ2h0O2FuaW1hdGlvbi1uYW1lOmZhZGVJblJpZ2h0fS50cmFuc2l0aW9uLmZhZGUub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6ZmFkZU91dDthbmltYXRpb24tbmFtZTpmYWRlT3V0fS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmFkZSB1cFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRVcDthbmltYXRpb24tbmFtZTpmYWRlT3V0VXB9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmYWRlIGRvd25cXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmYWRlT3V0RG93bjthbmltYXRpb24tbmFtZTpmYWRlT3V0RG93bn0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZhZGUgbGVmdFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRMZWZ0O2FuaW1hdGlvbi1uYW1lOmZhZGVPdXRMZWZ0fS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmFkZSByaWdodFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZhZGVPdXRSaWdodDthbmltYXRpb24tbmFtZTpmYWRlT3V0UmlnaHR9QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbnswJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MH0xMDAle29wYWNpdHk6MX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDEwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAlKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfX1Aa2V5ZnJhbWVzIGZhZGVJblVwezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDEwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAlKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZUluRG93bnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAlKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfX1Aa2V5ZnJhbWVzIGZhZGVJbkRvd257MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEwJSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMTAlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMCUpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fUBrZXlmcmFtZXMgZmFkZUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwJSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMCUpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMCUpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9fUBrZXlmcmFtZXMgZmFkZUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwJSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwJSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX19QC13ZWJraXQta2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIGZhZGVPdXR7MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFVwezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVZKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKDUlKX19QGtleWZyYW1lcyBmYWRlT3V0VXB7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSg1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoNSUpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dERvd257MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01JSl9fUBrZXlmcmFtZXMgZmFkZU91dERvd257MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtNSUpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01JSl9fUAtd2Via2l0LWtleWZyYW1lcyBmYWRlT3V0TGVmdHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCg1JSl9fUBrZXlmcmFtZXMgZmFkZU91dExlZnR7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCg1JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoNSUpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmFkZU91dFJpZ2h0ezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUlKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgtNSUpfX1Aa2V5ZnJhbWVzIGZhZGVPdXRSaWdodHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKC01JSk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUlKX19LmZsaXAudHJhbnNpdGlvbi5pbiwuZmxpcC50cmFuc2l0aW9uLm91dHstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouNnM7YW5pbWF0aW9uLWR1cmF0aW9uOi42c30uaG9yaXpvbnRhbC5mbGlwLnRyYW5zaXRpb24uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpob3Jpem9udGFsRmxpcEluO2FuaW1hdGlvbi1uYW1lOmhvcml6b250YWxGbGlwSW59Lmhvcml6b250YWwuZmxpcC50cmFuc2l0aW9uLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmhvcml6b250YWxGbGlwT3V0O2FuaW1hdGlvbi1uYW1lOmhvcml6b250YWxGbGlwT3V0fS52ZXJ0aWNhbC5mbGlwLnRyYW5zaXRpb24uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTp2ZXJ0aWNhbEZsaXBJbjthbmltYXRpb24tbmFtZTp2ZXJ0aWNhbEZsaXBJbn0udmVydGljYWwuZmxpcC50cmFuc2l0aW9uLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnZlcnRpY2FsRmxpcE91dDthbmltYXRpb24tbmFtZTp2ZXJ0aWNhbEZsaXBPdXR9QC13ZWJraXQta2V5ZnJhbWVzIGhvcml6b250YWxGbGlwSW57MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKC05MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgtOTBkZWcpO29wYWNpdHk6MH0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVZKDApO29wYWNpdHk6MX19QGtleWZyYW1lcyBob3Jpem9udGFsRmxpcEluezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgwKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyB2ZXJ0aWNhbEZsaXBJbnswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7b3BhY2l0eTowfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHZlcnRpY2FsRmxpcEluezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoLTkwZGVnKTtvcGFjaXR5OjB9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgwKTtvcGFjaXR5OjF9fUAtd2Via2l0LWtleWZyYW1lcyBob3Jpem9udGFsRmxpcE91dHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgwKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBob3Jpem9udGFsRmxpcE91dHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWSgwKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVkoOTBkZWcpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHZlcnRpY2FsRmxpcE91dHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgwKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHZlcnRpY2FsRmxpcE91dHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDIwMDBweCkgcm90YXRlWCgwKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgyMDAwcHgpIHJvdGF0ZVgoLTkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMjAwMHB4KSByb3RhdGVYKC05MGRlZyk7b3BhY2l0eTowfX0uc2NhbGUudHJhbnNpdGlvbi5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNjYWxlSW47YW5pbWF0aW9uLW5hbWU6c2NhbGVJbn0uc2NhbGUudHJhbnNpdGlvbi5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzY2FsZU91dDthbmltYXRpb24tbmFtZTpzY2FsZU91dH1ALXdlYmtpdC1rZXlmcmFtZXMgc2NhbGVJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjgpO3RyYW5zZm9ybTpzY2FsZSguOCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHNjYWxlSW57MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44KTt0cmFuc2Zvcm06c2NhbGUoLjgpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHNjYWxlT3V0ezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjkpO3RyYW5zZm9ybTpzY2FsZSguOSl9fUBrZXlmcmFtZXMgc2NhbGVPdXR7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOSk7dHJhbnNmb3JtOnNjYWxlKC45KX19LnRyYW5zaXRpb24uZmx5ey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi42czthbmltYXRpb24tZHVyYXRpb246LjZzOy13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSk7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4yMTUsLjYxLC4zNTUsMSl9LnRyYW5zaXRpb24uZmx5Lmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmx5SW47YW5pbWF0aW9uLW5hbWU6Zmx5SW59LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmbHkgdXBcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseUluVXA7YW5pbWF0aW9uLW5hbWU6Zmx5SW5VcH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZseSBkb3duXFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlJbkRvd247YW5pbWF0aW9uLW5hbWU6Zmx5SW5Eb3dufS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmx5IGxlZnRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseUluTGVmdDthbmltYXRpb24tbmFtZTpmbHlJbkxlZnR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmbHkgcmlnaHRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseUluUmlnaHQ7YW5pbWF0aW9uLW5hbWU6Zmx5SW5SaWdodH0udHJhbnNpdGlvbi5mbHkub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Zmx5T3V0O2FuaW1hdGlvbi1uYW1lOmZseU91dH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZseSB1cFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseU91dFVwO2FuaW1hdGlvbi1uYW1lOmZseU91dFVwfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwiZmx5IGRvd25cXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbHlPdXREb3duO2FuaW1hdGlvbi1uYW1lOmZseU91dERvd259LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJmbHkgbGVmdFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseU91dExlZnQ7YW5pbWF0aW9uLW5hbWU6Zmx5T3V0TGVmdH0udHJhbnNpdGlvbltjbGFzcyo9XFxcImZseSByaWdodFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOmZseU91dFJpZ2h0O2FuaW1hdGlvbi1uYW1lOmZseU91dFJpZ2h0fUAtd2Via2l0LWtleWZyYW1lcyBmbHlJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyk7dHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19QGtleWZyYW1lcyBmbHlJbnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfTIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9NDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4wMywxLjAzLDEuMDMpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDMsMS4wMywxLjAzKX04MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTcsLjk3LC45Nyk7dHJhbnNmb3JtOnNjYWxlM2QoLjk3LC45NywuOTcpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19QC13ZWJraXQta2V5ZnJhbWVzIGZseUluVXB7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTUwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDE1MDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfX1Aa2V5ZnJhbWVzIGZseUluVXB7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTUwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDE1MDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC01cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTVweCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwwLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5SW5Eb3duezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNTAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTE1MDBweCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyNXB4LDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDVweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZseUluRG93bnswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTUwMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xNTAwcHgsMCl9NjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDI1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjVweCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX05MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCw1cHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsNXB4LDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QC13ZWJraXQta2V5ZnJhbWVzIGZseUluTGVmdHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTUwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDE1MDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI1cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTI1cHgsMCwwKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTVweCwwLDApfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06bm9uZTt0cmFuc2Zvcm06bm9uZX19QGtleWZyYW1lcyBmbHlJbkxlZnR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDE1MDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNTAwcHgsMCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDEwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMTBweCwwLDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtNXB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC01cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUAtd2Via2l0LWtleWZyYW1lcyBmbHlJblJpZ2h0ezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTUwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNTAwcHgsMCwwKX02MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDI1cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApfTc1JXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTBweCwwLDApfTkwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoNXB4LDAsMCl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpub25lO3RyYW5zZm9ybTpub25lfX1Aa2V5ZnJhbWVzIGZseUluUmlnaHR7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xNTAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTE1MDBweCwwLDApfTYwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyNXB4LDAsMCl9NzUley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0xMHB4LDAsMCl9OTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDVweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCg1cHgsMCwwKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOm5vbmU7dHJhbnNmb3JtOm5vbmV9fUAtd2Via2l0LWtleWZyYW1lcyBmbHlPdXR7MjAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpO3RyYW5zZm9ybTpzY2FsZTNkKC45LC45LC45KX01MCUsNTUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjEsMS4xLDEuMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyk7dHJhbnNmb3JtOnNjYWxlM2QoLjMsLjMsLjMpfX1Aa2V5ZnJhbWVzIGZseU91dHsyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOSwuOSwuOSk7dHJhbnNmb3JtOnNjYWxlM2QoLjksLjksLjkpfTUwJSw1NSV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMS4xLDEuMSwxLjEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMSwxLjEsMS4xKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC4zLC4zLC4zKTt0cmFuc2Zvcm06c2NhbGUzZCguMywuMywuMyl9fUAtd2Via2l0LWtleWZyYW1lcyBmbHlPdXRVcHsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDEwcHgsMCl9NDAlLDQ1JXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCl9fUBrZXlmcmFtZXMgZmx5T3V0VXB7MjAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwxMHB4LDApfTQwJSw0NSV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwcHgsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjAwMHB4LDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5T3V0RG93bnsyMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMTBweCwwKX00MCUsNDUle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLDIwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjBweCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0yMDAwcHgsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKX19QGtleWZyYW1lcyBmbHlPdXREb3duezIwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLC0xMHB4LDApfTQwJSw0NSV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsMjBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwyMHB4LDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsLTIwMDBweCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwtMjAwMHB4LDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5T3V0UmlnaHR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKX0xMDAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKX19QGtleWZyYW1lcyBmbHlPdXRSaWdodHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMDAwcHgsMCwwKTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoLTIwMDBweCwwLDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgZmx5T3V0TGVmdHsyMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKC0yMHB4LDAsMCl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMjAwMHB4LDAsMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApfX1Aa2V5ZnJhbWVzIGZseU91dExlZnR7MjAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMjBweCwwLDApfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDIwMDBweCwwLDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgyMDAwcHgsMCwwKX19LnRyYW5zaXRpb24uc2xpZGUuaW4sLnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzbGlkZSBkb3duXFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZUluWTthbmltYXRpb24tbmFtZTpzbGlkZUluWTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXJ9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzbGlkZSB1cFxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJblk7YW5pbWF0aW9uLW5hbWU6c2xpZGVJblk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmJvdHRvbSBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic2xpZGUgbGVmdFxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVJblg7YW5pbWF0aW9uLW5hbWU6c2xpZGVJblg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciByaWdodDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciByaWdodH0udHJhbnNpdGlvbltjbGFzcyo9XFxcInNsaWRlIHJpZ2h0XFxcIl0uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzbGlkZUluWDthbmltYXRpb24tbmFtZTpzbGlkZUluWDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGxlZnQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgbGVmdH0udHJhbnNpdGlvbi5zbGlkZS5vdXQsLnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzbGlkZSBkb3duXFxcIl0ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRZO2FuaW1hdGlvbi1uYW1lOnNsaWRlT3V0WTstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46dG9wIGNlbnRlcjt0cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXJ9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzbGlkZSB1cFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0WTthbmltYXRpb24tbmFtZTpzbGlkZU91dFk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmJvdHRvbSBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic2xpZGUgbGVmdFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnNsaWRlT3V0WDthbmltYXRpb24tbmFtZTpzbGlkZU91dFg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciByaWdodDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciByaWdodH0udHJhbnNpdGlvbltjbGFzcyo9XFxcInNsaWRlIHJpZ2h0XFxcIl0ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c2xpZGVPdXRYO2FuaW1hdGlvbi1uYW1lOnNsaWRlT3V0WDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGxlZnQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgbGVmdH1ALXdlYmtpdC1rZXlmcmFtZXMgc2xpZGVJbll7MCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWSgwKTt0cmFuc2Zvcm06c2NhbGVZKDApfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWSgxKTt0cmFuc2Zvcm06c2NhbGVZKDEpfX1Aa2V5ZnJhbWVzIHNsaWRlSW5ZezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoMCk7dHJhbnNmb3JtOnNjYWxlWSgwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVkoMSk7dHJhbnNmb3JtOnNjYWxlWSgxKX19QC13ZWJraXQta2V5ZnJhbWVzIHNsaWRlSW5YezAle29wYWNpdHk6MDstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMCk7dHJhbnNmb3JtOnNjYWxlWCgwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNmb3JtOnNjYWxlWCgxKX19QGtleWZyYW1lcyBzbGlkZUluWHswJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDApO3RyYW5zZm9ybTpzY2FsZVgoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dFl7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWSgxKTt0cmFuc2Zvcm06c2NhbGVZKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWSgwKTt0cmFuc2Zvcm06c2NhbGVZKDApfX1Aa2V5ZnJhbWVzIHNsaWRlT3V0WXswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVZKDEpO3RyYW5zZm9ybTpzY2FsZVkoMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVZKDApO3RyYW5zZm9ybTpzY2FsZVkoMCl9fUAtd2Via2l0LWtleWZyYW1lcyBzbGlkZU91dFh7MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgxKTt0cmFuc2Zvcm06c2NhbGVYKDEpfTEwMCV7b3BhY2l0eTowOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlWCgwKTt0cmFuc2Zvcm06c2NhbGVYKDApfX1Aa2V5ZnJhbWVzIHNsaWRlT3V0WHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDEpO3RyYW5zZm9ybTpzY2FsZVgoMSl9MTAwJXtvcGFjaXR5OjA7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGVYKDApO3RyYW5zZm9ybTpzY2FsZVgoMCl9fS50cmFuc2l0aW9uLnN3aW5ney13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOi44czthbmltYXRpb24tZHVyYXRpb246LjhzfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic3dpbmcgZG93blxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c3dpbmdJblg7YW5pbWF0aW9uLW5hbWU6c3dpbmdJblg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic3dpbmcgdXBcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nSW5YO2FuaW1hdGlvbi1uYW1lOnN3aW5nSW5YOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGNlbnRlcn0udHJhbnNpdGlvbltjbGFzcyo9XFxcInN3aW5nIGxlZnRcXFwiXS5pbnstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nSW5ZO2FuaW1hdGlvbi1uYW1lOnN3aW5nSW5ZOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzd2luZyByaWdodFxcXCJdLmluey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6c3dpbmdJblk7YW5pbWF0aW9uLW5hbWU6c3dpbmdJblk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGxlZnR9LnRyYW5zaXRpb24uc3dpbmcub3V0LC50cmFuc2l0aW9uW2NsYXNzKj1cXFwic3dpbmcgZG93blxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nT3V0WDthbmltYXRpb24tbmFtZTpzd2luZ091dFg7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOnRvcCBjZW50ZXI7dHJhbnNmb3JtLW9yaWdpbjp0b3AgY2VudGVyfS50cmFuc2l0aW9uW2NsYXNzKj1cXFwic3dpbmcgdXBcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZ091dFg7YW5pbWF0aW9uLW5hbWU6c3dpbmdPdXRYOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpib3R0b20gY2VudGVyO3RyYW5zZm9ybS1vcmlnaW46Ym90dG9tIGNlbnRlcn0udHJhbnNpdGlvbltjbGFzcyo9XFxcInN3aW5nIGxlZnRcXFwiXS5vdXR7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzd2luZ091dFk7YW5pbWF0aW9uLW5hbWU6c3dpbmdPdXRZOy13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXIgcmlnaHR9LnRyYW5zaXRpb25bY2xhc3MqPVxcXCJzd2luZyByaWdodFxcXCJdLm91dHstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnN3aW5nT3V0WTthbmltYXRpb24tbmFtZTpzd2luZ091dFk7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOmNlbnRlciBsZWZ0O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyIGxlZnR9QC13ZWJraXQta2V5ZnJhbWVzIHN3aW5nSW5YezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCg5MGRlZyk7b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTMwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7b3BhY2l0eToxfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMTVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMTVkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtNy41ZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDApfX1Aa2V5ZnJhbWVzIHN3aW5nSW5YezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCg5MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCg5MGRlZyk7b3BhY2l0eTowfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTMwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7b3BhY2l0eToxfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMTVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMTVkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtNy41ZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDApfX1ALXdlYmtpdC1rZXlmcmFtZXMgc3dpbmdJbll7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC05MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtOTBkZWcpO29wYWNpdHk6MH00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDMwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDMwZGVnKTtvcGFjaXR5OjF9NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtMTcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtMTcuNWRlZyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSg3LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoNy41ZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDApfX1Aa2V5ZnJhbWVzIHN3aW5nSW5ZezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtvcGFjaXR5OjB9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgzMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgzMGRlZyk7b3BhY2l0eToxfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTE3LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTE3LjVkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDcuNWRlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgwKX19QC13ZWJraXQta2V5ZnJhbWVzIHN3aW5nT3V0WHswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC03LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyl9NjAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgxNy41ZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE3LjVkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTMwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKC0zMGRlZyk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDkwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDkwZGVnKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dpbmdPdXRYezAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgwKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDApfTQwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtNy41ZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVYKDE3LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoMTcuNWRlZyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWCgtMzBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoLTMwZGVnKTtvcGFjaXR5OjF9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVgoOTBkZWcpO29wYWNpdHk6MH19QC13ZWJraXQta2V5ZnJhbWVzIHN3aW5nT3V0WXswJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMCk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgwKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDcuNWRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSg3LjVkZWcpfTYwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTEwZGVnKTt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC0xMGRlZyl9ODAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgzMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgzMGRlZyk7b3BhY2l0eToxfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC05MGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtOTBkZWcpO29wYWNpdHk6MH19QGtleWZyYW1lcyBzd2luZ091dFl7MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKDApO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMCl9NDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSg3LjVkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoNy41ZGVnKX02MCV7LXdlYmtpdC10cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwMHB4KSByb3RhdGVZKC0xMGRlZyk7dHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtMTBkZWcpfTgwJXstd2Via2l0LXRyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMzBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoMzBkZWcpO29wYWNpdHk6MX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnBlcnNwZWN0aXZlKDEwMDBweCkgcm90YXRlWSgtOTBkZWcpO3RyYW5zZm9ybTpwZXJzcGVjdGl2ZSgxMDAwcHgpIHJvdGF0ZVkoLTkwZGVnKTtvcGFjaXR5OjB9fS50cmFuc2l0aW9uLnpvb20uaW57LXdlYmtpdC1hbmltYXRpb24tbmFtZTp6b29tSW47YW5pbWF0aW9uLW5hbWU6em9vbUlufS50cmFuc2l0aW9uLnpvb20ub3V0ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6em9vbU91dDthbmltYXRpb24tbmFtZTp6b29tT3V0fUAtd2Via2l0LWtleWZyYW1lcyB6b29tSW57MCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX0xMDAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9fUBrZXlmcmFtZXMgem9vbUluezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgwKTt0cmFuc2Zvcm06c2NhbGUoMCl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfX1ALXdlYmtpdC1rZXlmcmFtZXMgem9vbU91dHswJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eToxOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDApO3RyYW5zZm9ybTpzY2FsZSgwKX19QGtleWZyYW1lcyB6b29tT3V0ezAle29wYWNpdHk6MTstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MTAwJXtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMCk7dHJhbnNmb3JtOnNjYWxlKDApfX0uZmxhc2gudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjo3NTBtczthbmltYXRpb24tZHVyYXRpb246NzUwbXM7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpmbGFzaDthbmltYXRpb24tbmFtZTpmbGFzaH0uc2hha2UudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjo3NTBtczthbmltYXRpb24tZHVyYXRpb246NzUwbXM7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpzaGFrZTthbmltYXRpb24tbmFtZTpzaGFrZX0uYm91bmNlLnRyYW5zaXRpb257LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246NzUwbXM7YW5pbWF0aW9uLWR1cmF0aW9uOjc1MG1zOy13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Ym91bmNlO2FuaW1hdGlvbi1uYW1lOmJvdW5jZX0udGFkYS50cmFuc2l0aW9uey13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOjc1MG1zO2FuaW1hdGlvbi1kdXJhdGlvbjo3NTBtczstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnRhZGE7YW5pbWF0aW9uLW5hbWU6dGFkYX0ucHVsc2UudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjouNXM7YW5pbWF0aW9uLWR1cmF0aW9uOi41czstd2Via2l0LWFuaW1hdGlvbi1uYW1lOnB1bHNlO2FuaW1hdGlvbi1uYW1lOnB1bHNlfS5qaWdnbGUudHJhbnNpdGlvbnstd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjo3NTBtczthbmltYXRpb24tZHVyYXRpb246NzUwbXM7LXdlYmtpdC1hbmltYXRpb24tbmFtZTpqaWdnbGU7YW5pbWF0aW9uLW5hbWU6amlnZ2xlfS50cmFuc2l0aW9uLmdsb3d7LXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246MnM7YW5pbWF0aW9uLWR1cmF0aW9uOjJzOy13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjE5LDEsLjIyLDEpO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKC4xOSwxLC4yMiwxKX0udHJhbnNpdGlvbi5nbG93ey13ZWJraXQtYW5pbWF0aW9uLW5hbWU6Z2xvdzthbmltYXRpb24tbmFtZTpnbG93fUAtd2Via2l0LWtleWZyYW1lcyBmbGFzaHswJSwxMDAlLDUwJXtvcGFjaXR5OjF9MjUlLDc1JXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgZmxhc2h7MCUsMTAwJSw1MCV7b3BhY2l0eToxfTI1JSw3NSV7b3BhY2l0eTowfX1ALXdlYmtpdC1rZXlmcmFtZXMgc2hha2V7MCUsMTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDApO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDApfTEwJSwzMCUsNTAlLDcwJSw5MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMTBweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpfTIwJSw0MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKDEwcHgpfX1Aa2V5ZnJhbWVzIHNoYWtlezAlLDEwMCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgwKTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgwKX0xMCUsMzAlLDUwJSw3MCUsOTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTEwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVYKC0xMHB4KX0yMCUsNDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KTt0cmFuc2Zvcm06dHJhbnNsYXRlWCgxMHB4KX19QC13ZWJraXQta2V5ZnJhbWVzIGJvdW5jZXswJSwxMDAlLDIwJSw1MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9NDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTMwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0zMHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTVweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTE1cHgpfX1Aa2V5ZnJhbWVzIGJvdW5jZXswJSwxMDAlLDIwJSw1MCUsODAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCl9NDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTMwcHgpO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0zMHB4KX02MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTVweCk7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTE1cHgpfX1ALXdlYmtpdC1rZXlmcmFtZXMgdGFkYXswJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSl9MTAlLDIwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSguOSkgcm90YXRlKC0zZGVnKTt0cmFuc2Zvcm06c2NhbGUoLjkpIHJvdGF0ZSgtM2RlZyl9MzAlLDUwJSw3MCUsOTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEuMSkgcm90YXRlKDNkZWcpO3RyYW5zZm9ybTpzY2FsZSgxLjEpIHJvdGF0ZSgzZGVnKX00MCUsNjAlLDgwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjEpIHJvdGF0ZSgtM2RlZyk7dHJhbnNmb3JtOnNjYWxlKDEuMSkgcm90YXRlKC0zZGVnKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpIHJvdGF0ZSgwKTt0cmFuc2Zvcm06c2NhbGUoMSkgcm90YXRlKDApfX1Aa2V5ZnJhbWVzIHRhZGF7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMSk7dHJhbnNmb3JtOnNjYWxlKDEpfTEwJSwyMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjkpIHJvdGF0ZSgtM2RlZyk7dHJhbnNmb3JtOnNjYWxlKC45KSByb3RhdGUoLTNkZWcpfTMwJSw1MCUsNzAlLDkwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxLjEpIHJvdGF0ZSgzZGVnKTt0cmFuc2Zvcm06c2NhbGUoMS4xKSByb3RhdGUoM2RlZyl9NDAlLDYwJSw4MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoMS4xKSByb3RhdGUoLTNkZWcpO3RyYW5zZm9ybTpzY2FsZSgxLjEpIHJvdGF0ZSgtM2RlZyl9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKSByb3RhdGUoMCk7dHJhbnNmb3JtOnNjYWxlKDEpIHJvdGF0ZSgwKX19QC13ZWJraXQta2V5ZnJhbWVzIHB1bHNlezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC45KTt0cmFuc2Zvcm06c2NhbGUoLjkpO29wYWNpdHk6Ljd9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIHB1bHNlezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKDEpO3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9NTAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC45KTt0cmFuc2Zvcm06c2NhbGUoLjkpO29wYWNpdHk6Ljd9MTAwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZSgxKTt0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfX1ALXdlYmtpdC1rZXlmcmFtZXMgamlnZ2xlezAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX0zMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjI1LC43NSwxKX00MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguNzUsMS4yNSwxKX01MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjE1LC44NSwxKX02NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKTt0cmFuc2Zvcm06c2NhbGUzZCguOTUsMS4wNSwxKX03NSV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKTt0cmFuc2Zvcm06c2NhbGUzZCgxLjA1LC45NSwxKX0xMDAley13ZWJraXQtdHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEsMSwxKX19QGtleWZyYW1lcyBqaWdnbGV7MCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfTMwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMjUsLjc1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMjUsLjc1LDEpfTQwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC43NSwxLjI1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKC43NSwxLjI1LDEpfTUwJXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMTUsLjg1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMTUsLjg1LDEpfTY1JXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKC45NSwxLjA1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKC45NSwxLjA1LDEpfTc1JXstd2Via2l0LXRyYW5zZm9ybTpzY2FsZTNkKDEuMDUsLjk1LDEpO3RyYW5zZm9ybTpzY2FsZTNkKDEuMDUsLjk1LDEpfTEwMCV7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUzZCgxLDEsMSk7dHJhbnNmb3JtOnNjYWxlM2QoMSwxLDEpfX1ALXdlYmtpdC1rZXlmcmFtZXMgZ2xvd3swJXtiYWNrZ3JvdW5kLWNvbG9yOiNmY2ZjZmR9MzAle2JhY2tncm91bmQtY29sb3I6I2ZmZjZjZH0xMDAle2JhY2tncm91bmQtY29sb3I6I2ZjZmNmZH19QGtleWZyYW1lcyBnbG93ezAle2JhY2tncm91bmQtY29sb3I6I2ZjZmNmZH0zMCV7YmFja2dyb3VuZC1jb2xvcjojZmZmNmNkfTEwMCV7YmFja2dyb3VuZC1jb2xvcjojZmNmY2ZkfX1cIl0sXCJzb3VyY2VSb290XCI6XCJcIn1dKTtcbi8vIEV4cG9ydHNcbmV4cG9ydCBkZWZhdWx0IF9fX0NTU19MT0FERVJfRVhQT1JUX19fO1xuIiwibW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgZT17OTE6ZnVuY3Rpb24oZSl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUscil7aWYoIXIpe3I9e319ZT1lJiZlLl9fZXNNb2R1bGU/ZS5kZWZhdWx0OmU7aWYodHlwZW9mIGUhPT1cInN0cmluZ1wiKXtyZXR1cm4gZX1pZigvXlsnXCJdLipbJ1wiXSQvLnRlc3QoZSkpe2U9ZS5zbGljZSgxLC0xKX1pZihyLmhhc2gpe2UrPXIuaGFzaH1pZigvW1wiJygpIFxcdFxcbl0vLnRlc3QoZSl8fHIubmVlZFF1b3Rlcyl7cmV0dXJuJ1wiJy5jb25jYXQoZS5yZXBsYWNlKC9cIi9nLCdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZyxcIlxcXFxuXCIpLCdcIicpfXJldHVybiBlfX19O3ZhciByPXt9O2Z1bmN0aW9uIF9fbmNjd3Bja19yZXF1aXJlX18odCl7aWYoclt0XSl7cmV0dXJuIHJbdF0uZXhwb3J0c312YXIgXz1yW3RdPXtleHBvcnRzOnt9fTt2YXIgbj10cnVlO3RyeXtlW3RdKF8sXy5leHBvcnRzLF9fbmNjd3Bja19yZXF1aXJlX18pO249ZmFsc2V9ZmluYWxseXtpZihuKWRlbGV0ZSByW3RdfXJldHVybiBfLmV4cG9ydHN9X19uY2N3cGNrX3JlcXVpcmVfXy5hYj1fX2Rpcm5hbWUrXCIvXCI7cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oOTEpfSgpOyIsIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbigpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDkzMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbE1vZHVsZSkge1xuXHRpZiAoIW9yaWdpbmFsTW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdHZhciBtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG9yaWdpbmFsTW9kdWxlKTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJleHBvcnRzXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oOTMxKTtcbi8qKioqKiovIH0pKClcbjsiLCJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA4ODA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oODgwKTtcbi8qKioqKiovIH0pKClcbjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmV4cG9ydCBjb25zdCBBbXBTdGF0ZUNvbnRleHQ6IFJlYWN0LkNvbnRleHQ8YW55PiA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEFtcFN0YXRlQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdBbXBTdGF0ZUNvbnRleHQnXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBBbXBTdGF0ZUNvbnRleHQgfSBmcm9tICcuL2FtcC1jb250ZXh0J1xuXG5leHBvcnQgZnVuY3Rpb24gaXNJbkFtcE1vZGUoe1xuICBhbXBGaXJzdCA9IGZhbHNlLFxuICBoeWJyaWQgPSBmYWxzZSxcbiAgaGFzUXVlcnkgPSBmYWxzZSxcbn0gPSB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYW1wRmlyc3QgfHwgKGh5YnJpZCAmJiBoYXNRdWVyeSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUFtcCgpOiBib29sZWFuIHtcbiAgLy8gRG9uJ3QgYXNzaWduIHRoZSBjb250ZXh0IHZhbHVlIHRvIGEgdmFyaWFibGUgdG8gc2F2ZSBieXRlc1xuICByZXR1cm4gaXNJbkFtcE1vZGUoUmVhY3QudXNlQ29udGV4dChBbXBTdGF0ZUNvbnRleHQpKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgY29uc3QgSGVhZE1hbmFnZXJDb250ZXh0OiBSZWFjdC5Db250ZXh0PHtcbiAgdXBkYXRlSGVhZD86IChzdGF0ZTogYW55KSA9PiB2b2lkXG4gIG1vdW50ZWRJbnN0YW5jZXM/OiBhbnlcbiAgdXBkYXRlU2NyaXB0cz86IChzdGF0ZTogYW55KSA9PiB2b2lkXG4gIHNjcmlwdHM/OiBhbnlcbn0+ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSlcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGVhZE1hbmFnZXJDb250ZXh0LmRpc3BsYXlOYW1lID0gJ0hlYWRNYW5hZ2VyQ29udGV4dCdcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgRWZmZWN0IGZyb20gJy4vc2lkZS1lZmZlY3QnXG5pbXBvcnQgeyBBbXBTdGF0ZUNvbnRleHQgfSBmcm9tICcuL2FtcC1jb250ZXh0J1xuaW1wb3J0IHsgSGVhZE1hbmFnZXJDb250ZXh0IH0gZnJvbSAnLi9oZWFkLW1hbmFnZXItY29udGV4dCdcbmltcG9ydCB7IGlzSW5BbXBNb2RlIH0gZnJvbSAnLi9hbXAnXG5cbnR5cGUgV2l0aEluQW1wTW9kZSA9IHtcbiAgaW5BbXBNb2RlPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEhlYWQoaW5BbXBNb2RlID0gZmFsc2UpOiBKU1guRWxlbWVudFtdIHtcbiAgY29uc3QgaGVhZCA9IFs8bWV0YSBjaGFyU2V0PVwidXRmLThcIiAvPl1cbiAgaWYgKCFpbkFtcE1vZGUpIHtcbiAgICBoZWFkLnB1c2goPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aFwiIC8+KVxuICB9XG4gIHJldHVybiBoZWFkXG59XG5cbmZ1bmN0aW9uIG9ubHlSZWFjdEVsZW1lbnQoXG4gIGxpc3Q6IEFycmF5PFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+PixcbiAgY2hpbGQ6IFJlYWN0LlJlYWN0Q2hpbGRcbik6IEFycmF5PFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+PiB7XG4gIC8vIFJlYWN0IGNoaWxkcmVuIGNhbiBiZSBcInN0cmluZ1wiIG9yIFwibnVtYmVyXCIgaW4gdGhpcyBjYXNlIHdlIGlnbm9yZSB0aGVtIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbGlzdFxuICB9XG4gIC8vIEFkZHMgc3VwcG9ydCBmb3IgUmVhY3QuRnJhZ21lbnRcbiAgaWYgKGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50KSB7XG4gICAgcmV0dXJuIGxpc3QuY29uY2F0KFxuICAgICAgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZC5wcm9wcy5jaGlsZHJlbikucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZnJhZ21lbnRMaXN0OiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55Pj4sXG4gICAgICAgICAgZnJhZ21lbnRDaGlsZDogUmVhY3QuUmVhY3RDaGlsZFxuICAgICAgICApOiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55Pj4gPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBmcmFnbWVudENoaWxkID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgdHlwZW9mIGZyYWdtZW50Q2hpbGQgPT09ICdudW1iZXInXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmcmFnbWVudExpc3QuY29uY2F0KGZyYWdtZW50Q2hpbGQpXG4gICAgICAgIH0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBsaXN0LmNvbmNhdChjaGlsZClcbn1cblxuY29uc3QgTUVUQVRZUEVTID0gWyduYW1lJywgJ2h0dHBFcXVpdicsICdjaGFyU2V0JywgJ2l0ZW1Qcm9wJ11cblxuLypcbiByZXR1cm5zIGEgZnVuY3Rpb24gZm9yIGZpbHRlcmluZyBoZWFkIGNoaWxkIGVsZW1lbnRzXG4gd2hpY2ggc2hvdWxkbid0IGJlIGR1cGxpY2F0ZWQsIGxpa2UgPHRpdGxlLz5cbiBBbHNvIGFkZHMgc3VwcG9ydCBmb3IgZGVkdXBsaWNhdGVkIGBrZXlgIHByb3BlcnRpZXNcbiovXG5mdW5jdGlvbiB1bmlxdWUoKSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KClcbiAgY29uc3QgdGFncyA9IG5ldyBTZXQoKVxuICBjb25zdCBtZXRhVHlwZXMgPSBuZXcgU2V0KClcbiAgY29uc3QgbWV0YUNhdGVnb3JpZXM6IHsgW21ldGF0eXBlOiBzdHJpbmddOiBTZXQ8c3RyaW5nPiB9ID0ge31cblxuICByZXR1cm4gKGg6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+KSA9PiB7XG4gICAgbGV0IGlzVW5pcXVlID0gdHJ1ZVxuICAgIGxldCBoYXNLZXkgPSBmYWxzZVxuXG4gICAgaWYgKGgua2V5ICYmIHR5cGVvZiBoLmtleSAhPT0gJ251bWJlcicgJiYgaC5rZXkuaW5kZXhPZignJCcpID4gMCkge1xuICAgICAgaGFzS2V5ID0gdHJ1ZVxuICAgICAgY29uc3Qga2V5ID0gaC5rZXkuc2xpY2UoaC5rZXkuaW5kZXhPZignJCcpICsgMSlcbiAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIGlzVW5pcXVlID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMuYWRkKGtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXG4gICAgc3dpdGNoIChoLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RpdGxlJzpcbiAgICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgICBpZiAodGFncy5oYXMoaC50eXBlKSkge1xuICAgICAgICAgIGlzVW5pcXVlID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWdzLmFkZChoLnR5cGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21ldGEnOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gTUVUQVRZUEVTLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBNRVRBVFlQRVNbaV1cbiAgICAgICAgICBpZiAoIWgucHJvcHMuaGFzT3duUHJvcGVydHkobWV0YXR5cGUpKSBjb250aW51ZVxuXG4gICAgICAgICAgaWYgKG1ldGF0eXBlID09PSAnY2hhclNldCcpIHtcbiAgICAgICAgICAgIGlmIChtZXRhVHlwZXMuaGFzKG1ldGF0eXBlKSkge1xuICAgICAgICAgICAgICBpc1VuaXF1ZSA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXRhVHlwZXMuYWRkKG1ldGF0eXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeSA9IGgucHJvcHNbbWV0YXR5cGVdXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gbWV0YUNhdGVnb3JpZXNbbWV0YXR5cGVdIHx8IG5ldyBTZXQoKVxuICAgICAgICAgICAgaWYgKChtZXRhdHlwZSAhPT0gJ25hbWUnIHx8ICFoYXNLZXkpICYmIGNhdGVnb3JpZXMuaGFzKGNhdGVnb3J5KSkge1xuICAgICAgICAgICAgICBpc1VuaXF1ZSA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYXRlZ29yaWVzLmFkZChjYXRlZ29yeSlcbiAgICAgICAgICAgICAgbWV0YUNhdGVnb3JpZXNbbWV0YXR5cGVdID0gY2F0ZWdvcmllc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiBpc1VuaXF1ZVxuICB9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBoZWFkRWxlbWVudHMgTGlzdCBvZiBtdWx0aXBsZSA8SGVhZD4gaW5zdGFuY2VzXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUNvbXBvbmVudHMoXG4gIGhlYWRFbGVtZW50czogQXJyYXk8UmVhY3QuUmVhY3RFbGVtZW50PGFueT4+LFxuICBwcm9wczogV2l0aEluQW1wTW9kZVxuKSB7XG4gIHJldHVybiBoZWFkRWxlbWVudHNcbiAgICAucmVkdWNlKFxuICAgICAgKGxpc3Q6IFJlYWN0LlJlYWN0Q2hpbGRbXSwgaGVhZEVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRFbGVtZW50Q2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KFxuICAgICAgICAgIGhlYWRFbGVtZW50LnByb3BzLmNoaWxkcmVuXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIGxpc3QuY29uY2F0KGhlYWRFbGVtZW50Q2hpbGRyZW4pXG4gICAgICB9LFxuICAgICAgW11cbiAgICApXG4gICAgLnJlZHVjZShvbmx5UmVhY3RFbGVtZW50LCBbXSlcbiAgICAucmV2ZXJzZSgpXG4gICAgLmNvbmNhdChkZWZhdWx0SGVhZChwcm9wcy5pbkFtcE1vZGUpKVxuICAgIC5maWx0ZXIodW5pcXVlKCkpXG4gICAgLnJldmVyc2UoKVxuICAgIC5tYXAoKGM6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+LCBpOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGMua2V5IHx8IGlcbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuX19ORVhUX09QVElNSVpFX0ZPTlRTICYmXG4gICAgICAgICFwcm9wcy5pbkFtcE1vZGVcbiAgICAgICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYy50eXBlID09PSAnbGluaycgJiZcbiAgICAgICAgICBjLnByb3BzWydocmVmJ10gJiZcbiAgICAgICAgICAvLyBUT0RPKHByYXRlZWtiaEApOiBSZXBsYWNlIHRoaXMgd2l0aCBjb25zdCBmcm9tIGBjb25zdGFudHNgIHdoZW4gdGhlIHRyZWUgc2hha2luZyB3b3Jrcy5cbiAgICAgICAgICBbJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzJ10uc29tZSgodXJsKSA9PlxuICAgICAgICAgICAgYy5wcm9wc1snaHJlZiddLnN0YXJ0c1dpdGgodXJsKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbmV3UHJvcHMgPSB7IC4uLihjLnByb3BzIHx8IHt9KSB9XG4gICAgICAgICAgbmV3UHJvcHNbJ2RhdGEtaHJlZiddID0gbmV3UHJvcHNbJ2hyZWYnXVxuICAgICAgICAgIG5ld1Byb3BzWydocmVmJ10gPSB1bmRlZmluZWRcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGMsIG5ld1Byb3BzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGMsIHsga2V5IH0pXG4gICAgfSlcbn1cblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBpbmplY3RzIGVsZW1lbnRzIHRvIGA8aGVhZD5gIG9mIHlvdXIgcGFnZS5cbiAqIFRvIGF2b2lkIGR1cGxpY2F0ZWQgYHRhZ3NgIGluIGA8aGVhZD5gIHlvdSBjYW4gdXNlIHRoZSBga2V5YCBwcm9wZXJ0eSwgd2hpY2ggd2lsbCBtYWtlIHN1cmUgZXZlcnkgdGFnIGlzIG9ubHkgcmVuZGVyZWQgb25jZS5cbiAqL1xuZnVuY3Rpb24gSGVhZCh7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IGFtcFN0YXRlID0gdXNlQ29udGV4dChBbXBTdGF0ZUNvbnRleHQpXG4gIGNvbnN0IGhlYWRNYW5hZ2VyID0gdXNlQ29udGV4dChIZWFkTWFuYWdlckNvbnRleHQpXG4gIHJldHVybiAoXG4gICAgPEVmZmVjdFxuICAgICAgcmVkdWNlQ29tcG9uZW50c1RvU3RhdGU9e3JlZHVjZUNvbXBvbmVudHN9XG4gICAgICBoZWFkTWFuYWdlcj17aGVhZE1hbmFnZXJ9XG4gICAgICBpbkFtcE1vZGU9e2lzSW5BbXBNb2RlKGFtcFN0YXRlKX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9FZmZlY3Q+XG4gIClcbn1cblxuLy8gVE9ETzogUmVtb3ZlIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2VcbkhlYWQucmV3aW5kID0gKCkgPT4ge31cblxuZXhwb3J0IGRlZmF1bHQgSGVhZFxuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZVBhdGgoXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4gIGxvY2FsZXM/OiBzdHJpbmdbXVxuKToge1xuICBkZXRlY3RlZExvY2FsZT86IHN0cmluZ1xuICBwYXRobmFtZTogc3RyaW5nXG59IHtcbiAgbGV0IGRldGVjdGVkTG9jYWxlOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgLy8gZmlyc3QgaXRlbSB3aWxsIGJlIGVtcHR5IHN0cmluZyBmcm9tIHNwbGl0dGluZyBhdCBmaXJzdCBjaGFyXG4gIGNvbnN0IHBhdGhuYW1lUGFydHMgPSBwYXRobmFtZS5zcGxpdCgnLycpXG5cbiAgOyhsb2NhbGVzIHx8IFtdKS5zb21lKChsb2NhbGUpID0+IHtcbiAgICBpZiAocGF0aG5hbWVQYXJ0c1sxXS50b0xvd2VyQ2FzZSgpID09PSBsb2NhbGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgZGV0ZWN0ZWRMb2NhbGUgPSBsb2NhbGVcbiAgICAgIHBhdGhuYW1lUGFydHMuc3BsaWNlKDEsIDEpXG4gICAgICBwYXRobmFtZSA9IHBhdGhuYW1lUGFydHMuam9pbignLycpIHx8ICcvJ1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBwYXRobmFtZSxcbiAgICBkZXRlY3RlZExvY2FsZSxcbiAgfVxufVxuIiwiLypcbk1JVCBMaWNlbnNlXG5cbkNvcHlyaWdodCAoYykgSmFzb24gTWlsbGVyIChodHRwczovL2phc29uZm9ybWF0LmNvbS8pXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiovXG5cbi8vIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZGV2ZWxvcGl0L21pdHQvYmxvYi92MS4xLjMvc3JjL2luZGV4LmpzXG4vLyBJdCdzIGJlZW4gZWRpdGVkIGZvciB0aGUgbmVlZHMgb2YgdGhpcyBzY3JpcHRcbi8vIFNlZSB0aGUgTElDRU5TRSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlXG5cbnR5cGUgSGFuZGxlciA9ICguLi5ldnRzOiBhbnlbXSkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBNaXR0RW1pdHRlciA9IHtcbiAgb24odHlwZTogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyKTogdm9pZFxuICBvZmYodHlwZTogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyKTogdm9pZFxuICBlbWl0KHR5cGU6IHN0cmluZywgLi4uZXZ0czogYW55W10pOiB2b2lkXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1pdHQoKTogTWl0dEVtaXR0ZXIge1xuICBjb25zdCBhbGw6IHsgW3M6IHN0cmluZ106IEhhbmRsZXJbXSB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuXG4gIHJldHVybiB7XG4gICAgb24odHlwZTogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyKSB7XG4gICAgICA7KGFsbFt0eXBlXSB8fCAoYWxsW3R5cGVdID0gW10pKS5wdXNoKGhhbmRsZXIpXG4gICAgfSxcblxuICAgIG9mZih0eXBlOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXIpIHtcbiAgICAgIGlmIChhbGxbdHlwZV0pIHtcbiAgICAgICAgYWxsW3R5cGVdLnNwbGljZShhbGxbdHlwZV0uaW5kZXhPZihoYW5kbGVyKSA+Pj4gMCwgMSlcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZW1pdCh0eXBlOiBzdHJpbmcsIC4uLmV2dHM6IGFueVtdKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYXJyYXktY2FsbGJhY2stcmV0dXJuXG4gICAgICA7KGFsbFt0eXBlXSB8fCBbXSkuc2xpY2UoKS5tYXAoKGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgaGFuZGxlciguLi5ldnRzKVxuICAgICAgfSlcbiAgICB9LFxuICB9XG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBOZXh0Um91dGVyIH0gZnJvbSAnLi9yb3V0ZXIvcm91dGVyJ1xuXG5leHBvcnQgY29uc3QgUm91dGVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8TmV4dFJvdXRlcj4obnVsbCBhcyBhbnkpXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFJvdXRlckNvbnRleHQuZGlzcGxheU5hbWUgPSAnUm91dGVyQ29udGV4dCdcbn1cbiIsIi8qIGdsb2JhbCBfX05FWFRfREFUQV9fICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG5pbXBvcnQgeyBQYXJzZWRVcmxRdWVyeSB9IGZyb20gJ3F1ZXJ5c3RyaW5nJ1xuaW1wb3J0IHsgQ29tcG9uZW50VHlwZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgVXJsT2JqZWN0IH0gZnJvbSAndXJsJ1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aFRyYWlsaW5nU2xhc2gsXG4gIHJlbW92ZVBhdGhUcmFpbGluZ1NsYXNoLFxufSBmcm9tICcuLi8uLi8uLi9jbGllbnQvbm9ybWFsaXplLXRyYWlsaW5nLXNsYXNoJ1xuaW1wb3J0IHsgR29vZFBhZ2VDYWNoZSwgU3R5bGVTaGVldFR1cGxlIH0gZnJvbSAnLi4vLi4vLi4vY2xpZW50L3BhZ2UtbG9hZGVyJ1xuaW1wb3J0IHtcbiAgZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCxcbiAgaXNBc3NldEVycm9yLFxuICBtYXJrQXNzZXRFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY2xpZW50L3JvdXRlLWxvYWRlcidcbmltcG9ydCB7IERvbWFpbkxvY2FsZXMgfSBmcm9tICcuLi8uLi9zZXJ2ZXIvY29uZmlnJ1xuaW1wb3J0IHsgZGVub3JtYWxpemVQYWdlUGF0aCB9IGZyb20gJy4uLy4uL3NlcnZlci9kZW5vcm1hbGl6ZS1wYWdlLXBhdGgnXG5pbXBvcnQgeyBub3JtYWxpemVMb2NhbGVQYXRoIH0gZnJvbSAnLi4vaTE4bi9ub3JtYWxpemUtbG9jYWxlLXBhdGgnXG5pbXBvcnQgbWl0dCwgeyBNaXR0RW1pdHRlciB9IGZyb20gJy4uL21pdHQnXG5pbXBvcnQge1xuICBBcHBDb250ZXh0VHlwZSxcbiAgZm9ybWF0V2l0aFZhbGlkYXRpb24sXG4gIGdldExvY2F0aW9uT3JpZ2luLFxuICBnZXRVUkwsXG4gIGxvYWRHZXRJbml0aWFsUHJvcHMsXG4gIE5leHRQYWdlQ29udGV4dCxcbiAgU1QsXG4gIE5FWFRfREFUQSxcbn0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgeyBpc0R5bmFtaWNSb3V0ZSB9IGZyb20gJy4vdXRpbHMvaXMtZHluYW1pYydcbmltcG9ydCB7IHBhcnNlUmVsYXRpdmVVcmwgfSBmcm9tICcuL3V0aWxzL3BhcnNlLXJlbGF0aXZlLXVybCdcbmltcG9ydCB7IHNlYXJjaFBhcmFtc1RvVXJsUXVlcnkgfSBmcm9tICcuL3V0aWxzL3F1ZXJ5c3RyaW5nJ1xuaW1wb3J0IHJlc29sdmVSZXdyaXRlcyBmcm9tICcuL3V0aWxzL3Jlc29sdmUtcmV3cml0ZXMnXG5pbXBvcnQgeyBnZXRSb3V0ZU1hdGNoZXIgfSBmcm9tICcuL3V0aWxzL3JvdXRlLW1hdGNoZXInXG5pbXBvcnQgeyBnZXRSb3V0ZVJlZ2V4IH0gZnJvbSAnLi91dGlscy9yb3V0ZS1yZWdleCdcblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAvKiBwcm9kICovXG4gICAgX19ORVhUX0RBVEFfXzogTkVYVF9EQVRBXG4gIH1cbn1cblxuaW50ZXJmYWNlIFJvdXRlUHJvcGVydGllcyB7XG4gIHNoYWxsb3c6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIFRyYW5zaXRpb25PcHRpb25zIHtcbiAgc2hhbGxvdz86IGJvb2xlYW5cbiAgbG9jYWxlPzogc3RyaW5nIHwgZmFsc2VcbiAgc2Nyb2xsPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgTmV4dEhpc3RvcnlTdGF0ZSB7XG4gIHVybDogc3RyaW5nXG4gIGFzOiBzdHJpbmdcbiAgb3B0aW9uczogVHJhbnNpdGlvbk9wdGlvbnNcbn1cblxudHlwZSBIaXN0b3J5U3RhdGUgPVxuICB8IG51bGxcbiAgfCB7IF9fTjogZmFsc2UgfVxuICB8ICh7IF9fTjogdHJ1ZTsgaWR4OiBudW1iZXIgfSAmIE5leHRIaXN0b3J5U3RhdGUpXG5cbmxldCBkZXRlY3REb21haW5Mb2NhbGU6IHR5cGVvZiBpbXBvcnQoJy4uL2kxOG4vZGV0ZWN0LWRvbWFpbi1sb2NhbGUnKS5kZXRlY3REb21haW5Mb2NhbGVcblxuaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgZGV0ZWN0RG9tYWluTG9jYWxlID0gcmVxdWlyZSgnLi4vaTE4bi9kZXRlY3QtZG9tYWluLWxvY2FsZScpXG4gICAgLmRldGVjdERvbWFpbkxvY2FsZVxufVxuXG5jb25zdCBiYXNlUGF0aCA9IChwcm9jZXNzLmVudi5fX05FWFRfUk9VVEVSX0JBU0VQQVRIIGFzIHN0cmluZykgfHwgJydcblxuZnVuY3Rpb24gYnVpbGRDYW5jZWxsYXRpb25FcnJvcigpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdSb3V0ZSBDYW5jZWxsZWQnKSwge1xuICAgIGNhbmNlbGxlZDogdHJ1ZSxcbiAgfSlcbn1cblxuZnVuY3Rpb24gYWRkUGF0aFByZWZpeChwYXRoOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZykge1xuICByZXR1cm4gcHJlZml4ICYmIHBhdGguc3RhcnRzV2l0aCgnLycpXG4gICAgPyBwYXRoID09PSAnLydcbiAgICAgID8gbm9ybWFsaXplUGF0aFRyYWlsaW5nU2xhc2gocHJlZml4KVxuICAgICAgOiBgJHtwcmVmaXh9JHtwYXRoTm9RdWVyeUhhc2gocGF0aCkgPT09ICcvJyA/IHBhdGguc3Vic3RyaW5nKDEpIDogcGF0aH1gXG4gICAgOiBwYXRoXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREb21haW5Mb2NhbGUoXG4gIHBhdGg6IHN0cmluZyxcbiAgbG9jYWxlPzogc3RyaW5nIHwgZmFsc2UsXG4gIGxvY2FsZXM/OiBzdHJpbmdbXSxcbiAgZG9tYWluTG9jYWxlcz86IERvbWFpbkxvY2FsZXNcbikge1xuICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgIGxvY2FsZSA9IGxvY2FsZSB8fCBub3JtYWxpemVMb2NhbGVQYXRoKHBhdGgsIGxvY2FsZXMpLmRldGVjdGVkTG9jYWxlXG5cbiAgICBjb25zdCBkZXRlY3RlZERvbWFpbiA9IGRldGVjdERvbWFpbkxvY2FsZShkb21haW5Mb2NhbGVzLCB1bmRlZmluZWQsIGxvY2FsZSlcblxuICAgIGlmIChkZXRlY3RlZERvbWFpbikge1xuICAgICAgcmV0dXJuIGBodHRwJHtkZXRlY3RlZERvbWFpbi5odHRwID8gJycgOiAncyd9Oi8vJHtkZXRlY3RlZERvbWFpbi5kb21haW59JHtcbiAgICAgICAgYmFzZVBhdGggfHwgJydcbiAgICAgIH0ke2xvY2FsZSA9PT0gZGV0ZWN0ZWREb21haW4uZGVmYXVsdExvY2FsZSA/ICcnIDogYC8ke2xvY2FsZX1gfSR7cGF0aH1gXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRMb2NhbGUoXG4gIHBhdGg6IHN0cmluZyxcbiAgbG9jYWxlPzogc3RyaW5nIHwgZmFsc2UsXG4gIGRlZmF1bHRMb2NhbGU/OiBzdHJpbmdcbikge1xuICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgIHJldHVybiBsb2NhbGUgJiZcbiAgICAgIGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSAmJlxuICAgICAgIXBhdGguc3RhcnRzV2l0aCgnLycgKyBsb2NhbGUgKyAnLycpICYmXG4gICAgICBwYXRoICE9PSAnLycgKyBsb2NhbGVcbiAgICAgID8gYWRkUGF0aFByZWZpeChwYXRoLCAnLycgKyBsb2NhbGUpXG4gICAgICA6IHBhdGhcbiAgfVxuICByZXR1cm4gcGF0aFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsTG9jYWxlKHBhdGg6IHN0cmluZywgbG9jYWxlPzogc3RyaW5nKSB7XG4gIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgcmV0dXJuIGxvY2FsZSAmJlxuICAgICAgKHBhdGguc3RhcnRzV2l0aCgnLycgKyBsb2NhbGUgKyAnLycpIHx8IHBhdGggPT09ICcvJyArIGxvY2FsZSlcbiAgICAgID8gcGF0aC5zdWJzdHIobG9jYWxlLmxlbmd0aCArIDEpIHx8ICcvJ1xuICAgICAgOiBwYXRoXG4gIH1cbiAgcmV0dXJuIHBhdGhcbn1cblxuZnVuY3Rpb24gcGF0aE5vUXVlcnlIYXNoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBxdWVyeUluZGV4ID0gcGF0aC5pbmRleE9mKCc/JylcbiAgY29uc3QgaGFzaEluZGV4ID0gcGF0aC5pbmRleE9mKCcjJylcblxuICBpZiAocXVlcnlJbmRleCA+IC0xIHx8IGhhc2hJbmRleCA+IC0xKSB7XG4gICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHF1ZXJ5SW5kZXggPiAtMSA/IHF1ZXJ5SW5kZXggOiBoYXNoSW5kZXgpXG4gIH1cbiAgcmV0dXJuIHBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0Jhc2VQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBwYXRoID0gcGF0aE5vUXVlcnlIYXNoKHBhdGgpXG4gIHJldHVybiBwYXRoID09PSBiYXNlUGF0aCB8fCBwYXRoLnN0YXJ0c1dpdGgoYmFzZVBhdGggKyAnLycpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRCYXNlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyB3ZSBvbmx5IGFkZCB0aGUgYmFzZXBhdGggb24gcmVsYXRpdmUgdXJsc1xuICByZXR1cm4gYWRkUGF0aFByZWZpeChwYXRoLCBiYXNlUGF0aClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbEJhc2VQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHBhdGggPSBwYXRoLnNsaWNlKGJhc2VQYXRoLmxlbmd0aClcbiAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgcGF0aCA9IGAvJHtwYXRofWBcbiAgcmV0dXJuIHBhdGhcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHdoZXRoZXIgYSBnaXZlbiB1cmwgaXMgcm91dGFibGUgYnkgdGhlIE5leHQuanMgcm91dGVyIChicm93c2VyIG9ubHkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMb2NhbFVSTCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyBwcmV2ZW50IGEgaHlkcmF0aW9uIG1pc21hdGNoIG9uIGhyZWYgZm9yIHVybCB3aXRoIGFuY2hvciByZWZzXG4gIGlmICh1cmwuc3RhcnRzV2l0aCgnLycpIHx8IHVybC5zdGFydHNXaXRoKCcjJykpIHJldHVybiB0cnVlXG4gIHRyeSB7XG4gICAgLy8gYWJzb2x1dGUgdXJscyBjYW4gYmUgbG9jYWwgaWYgdGhleSBhcmUgb24gdGhlIHNhbWUgb3JpZ2luXG4gICAgY29uc3QgbG9jYXRpb25PcmlnaW4gPSBnZXRMb2NhdGlvbk9yaWdpbigpXG4gICAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgVVJMKHVybCwgbG9jYXRpb25PcmlnaW4pXG4gICAgcmV0dXJuIHJlc29sdmVkLm9yaWdpbiA9PT0gbG9jYXRpb25PcmlnaW4gJiYgaGFzQmFzZVBhdGgocmVzb2x2ZWQucGF0aG5hbWUpXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG50eXBlIFVybCA9IFVybE9iamVjdCB8IHN0cmluZ1xuXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJwb2xhdGVBcyhcbiAgcm91dGU6IHN0cmluZyxcbiAgYXNQYXRobmFtZTogc3RyaW5nLFxuICBxdWVyeTogUGFyc2VkVXJsUXVlcnlcbikge1xuICBsZXQgaW50ZXJwb2xhdGVkUm91dGUgPSAnJ1xuXG4gIGNvbnN0IGR5bmFtaWNSZWdleCA9IGdldFJvdXRlUmVnZXgocm91dGUpXG4gIGNvbnN0IGR5bmFtaWNHcm91cHMgPSBkeW5hbWljUmVnZXguZ3JvdXBzXG4gIGNvbnN0IGR5bmFtaWNNYXRjaGVzID1cbiAgICAvLyBUcnkgdG8gbWF0Y2ggdGhlIGR5bmFtaWMgcm91dGUgYWdhaW5zdCB0aGUgYXNQYXRoXG4gICAgKGFzUGF0aG5hbWUgIT09IHJvdXRlID8gZ2V0Um91dGVNYXRjaGVyKGR5bmFtaWNSZWdleCkoYXNQYXRobmFtZSkgOiAnJykgfHxcbiAgICAvLyBGYWxsIGJhY2sgdG8gcmVhZGluZyB0aGUgdmFsdWVzIGZyb20gdGhlIGhyZWZcbiAgICAvLyBUT0RPOiBzaG91bGQgdGhpcyB0YWtlIHByaW9yaXR5OyBhbHNvIG5lZWQgdG8gY2hhbmdlIGluIHRoZSByb3V0ZXIuXG4gICAgcXVlcnlcblxuICBpbnRlcnBvbGF0ZWRSb3V0ZSA9IHJvdXRlXG4gIGNvbnN0IHBhcmFtcyA9IE9iamVjdC5rZXlzKGR5bmFtaWNHcm91cHMpXG5cbiAgaWYgKFxuICAgICFwYXJhbXMuZXZlcnkoKHBhcmFtKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBkeW5hbWljTWF0Y2hlc1twYXJhbV0gfHwgJydcbiAgICAgIGNvbnN0IHsgcmVwZWF0LCBvcHRpb25hbCB9ID0gZHluYW1pY0dyb3Vwc1twYXJhbV1cblxuICAgICAgLy8gc3VwcG9ydCBzaW5nbGUtbGV2ZWwgY2F0Y2gtYWxsXG4gICAgICAvLyBUT0RPOiBtb3JlIHJvYnVzdCBoYW5kbGluZyBmb3IgdXNlci1lcnJvciAocGFzc2luZyBgL2ApXG4gICAgICBsZXQgcmVwbGFjZWQgPSBgWyR7cmVwZWF0ID8gJy4uLicgOiAnJ30ke3BhcmFtfV1gXG4gICAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgICAgcmVwbGFjZWQgPSBgJHshdmFsdWUgPyAnLycgOiAnJ31bJHtyZXBsYWNlZH1dYFxuICAgICAgfVxuICAgICAgaWYgKHJlcGVhdCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHZhbHVlID0gW3ZhbHVlXVxuXG4gICAgICByZXR1cm4gKFxuICAgICAgICAob3B0aW9uYWwgfHwgcGFyYW0gaW4gZHluYW1pY01hdGNoZXMpICYmXG4gICAgICAgIC8vIEludGVycG9sYXRlIGdyb3VwIGludG8gZGF0YSBVUkwgaWYgcHJlc2VudFxuICAgICAgICAoaW50ZXJwb2xhdGVkUm91dGUgPVxuICAgICAgICAgIGludGVycG9sYXRlZFJvdXRlIS5yZXBsYWNlKFxuICAgICAgICAgICAgcmVwbGFjZWQsXG4gICAgICAgICAgICByZXBlYXRcbiAgICAgICAgICAgICAgPyAodmFsdWUgYXMgc3RyaW5nW10pXG4gICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSB2YWx1ZXMgc2hvdWxkIGJlIGZ1bGx5IGVuY29kZWQgaW5zdGVhZCBvZiBqdXN0XG4gICAgICAgICAgICAgICAgICAgIC8vIHBhdGggZGVsaW1pdGVyIGVzY2FwZWQgc2luY2UgdGhleSBhcmUgYmVpbmcgaW5zZXJ0ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgVVJMIGFuZCB3ZSBleHBlY3QgVVJMIGVuY29kZWQgc2VnbWVudHNcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBwYXJzaW5nIGR5bmFtaWMgcm91dGUgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgIChzZWdtZW50KSA9PiBlbmNvZGVVUklDb21wb25lbnQoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5qb2luKCcvJylcbiAgICAgICAgICAgICAgOiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUgYXMgc3RyaW5nKVxuICAgICAgICAgICkgfHwgJy8nKVxuICAgICAgKVxuICAgIH0pXG4gICkge1xuICAgIGludGVycG9sYXRlZFJvdXRlID0gJycgLy8gZGlkIG5vdCBzYXRpc2Z5IGFsbCByZXF1aXJlbWVudHNcblxuICAgIC8vIG4uYi4gV2UgaWdub3JlIHRoaXMgZXJyb3IgYmVjYXVzZSB3ZSBoYW5kbGUgd2FybmluZyBmb3IgdGhpcyBjYXNlIGluXG4gICAgLy8gZGV2ZWxvcG1lbnQgaW4gdGhlIGA8TGluaz5gIGNvbXBvbmVudCBkaXJlY3RseS5cbiAgfVxuICByZXR1cm4ge1xuICAgIHBhcmFtcyxcbiAgICByZXN1bHQ6IGludGVycG9sYXRlZFJvdXRlLFxuICB9XG59XG5cbmZ1bmN0aW9uIG9taXRQYXJtc0Zyb21RdWVyeShxdWVyeTogUGFyc2VkVXJsUXVlcnksIHBhcmFtczogc3RyaW5nW10pIHtcbiAgY29uc3QgZmlsdGVyZWRRdWVyeTogUGFyc2VkVXJsUXVlcnkgPSB7fVxuXG4gIE9iamVjdC5rZXlzKHF1ZXJ5KS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoIXBhcmFtcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBmaWx0ZXJlZFF1ZXJ5W2tleV0gPSBxdWVyeVtrZXldXG4gICAgfVxuICB9KVxuICByZXR1cm4gZmlsdGVyZWRRdWVyeVxufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgZ2l2ZW4gaHlwZXJsaW5rIHdpdGggYSBjZXJ0YWluIHJvdXRlciBzdGF0ZSAoYmFzZVBhdGggbm90IGluY2x1ZGVkKS5cbiAqIFByZXNlcnZlcyBhYnNvbHV0ZSB1cmxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUhyZWYoXG4gIGN1cnJlbnRQYXRoOiBzdHJpbmcsXG4gIGhyZWY6IFVybCxcbiAgcmVzb2x2ZUFzPzogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgLy8gd2UgdXNlIGEgZHVtbXkgYmFzZSB1cmwgZm9yIHJlbGF0aXZlIHVybHNcbiAgY29uc3QgYmFzZSA9IG5ldyBVUkwoY3VycmVudFBhdGgsICdodHRwOi8vbicpXG4gIGNvbnN0IHVybEFzU3RyaW5nID1cbiAgICB0eXBlb2YgaHJlZiA9PT0gJ3N0cmluZycgPyBocmVmIDogZm9ybWF0V2l0aFZhbGlkYXRpb24oaHJlZilcbiAgLy8gUmV0dXJuIGJlY2F1c2UgaXQgY2Fubm90IGJlIHJvdXRlZCBieSB0aGUgTmV4dC5qcyByb3V0ZXJcbiAgaWYgKCFpc0xvY2FsVVJMKHVybEFzU3RyaW5nKSkge1xuICAgIHJldHVybiAocmVzb2x2ZUFzID8gW3VybEFzU3RyaW5nXSA6IHVybEFzU3RyaW5nKSBhcyBzdHJpbmdcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGZpbmFsVXJsID0gbmV3IFVSTCh1cmxBc1N0cmluZywgYmFzZSlcbiAgICBmaW5hbFVybC5wYXRobmFtZSA9IG5vcm1hbGl6ZVBhdGhUcmFpbGluZ1NsYXNoKGZpbmFsVXJsLnBhdGhuYW1lKVxuICAgIGxldCBpbnRlcnBvbGF0ZWRBcyA9ICcnXG5cbiAgICBpZiAoXG4gICAgICBpc0R5bmFtaWNSb3V0ZShmaW5hbFVybC5wYXRobmFtZSkgJiZcbiAgICAgIGZpbmFsVXJsLnNlYXJjaFBhcmFtcyAmJlxuICAgICAgcmVzb2x2ZUFzXG4gICAgKSB7XG4gICAgICBjb25zdCBxdWVyeSA9IHNlYXJjaFBhcmFtc1RvVXJsUXVlcnkoZmluYWxVcmwuc2VhcmNoUGFyYW1zKVxuXG4gICAgICBjb25zdCB7IHJlc3VsdCwgcGFyYW1zIH0gPSBpbnRlcnBvbGF0ZUFzKFxuICAgICAgICBmaW5hbFVybC5wYXRobmFtZSxcbiAgICAgICAgZmluYWxVcmwucGF0aG5hbWUsXG4gICAgICAgIHF1ZXJ5XG4gICAgICApXG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVkQXMgPSBmb3JtYXRXaXRoVmFsaWRhdGlvbih7XG4gICAgICAgICAgcGF0aG5hbWU6IHJlc3VsdCxcbiAgICAgICAgICBoYXNoOiBmaW5hbFVybC5oYXNoLFxuICAgICAgICAgIHF1ZXJ5OiBvbWl0UGFybXNGcm9tUXVlcnkocXVlcnksIHBhcmFtcyksXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIG9yaWdpbiBkaWRuJ3QgY2hhbmdlLCBpdCBtZWFucyB3ZSByZWNlaXZlZCBhIHJlbGF0aXZlIGhyZWZcbiAgICBjb25zdCByZXNvbHZlZEhyZWYgPVxuICAgICAgZmluYWxVcmwub3JpZ2luID09PSBiYXNlLm9yaWdpblxuICAgICAgICA/IGZpbmFsVXJsLmhyZWYuc2xpY2UoZmluYWxVcmwub3JpZ2luLmxlbmd0aClcbiAgICAgICAgOiBmaW5hbFVybC5ocmVmXG5cbiAgICByZXR1cm4gKHJlc29sdmVBc1xuICAgICAgPyBbcmVzb2x2ZWRIcmVmLCBpbnRlcnBvbGF0ZWRBcyB8fCByZXNvbHZlZEhyZWZdXG4gICAgICA6IHJlc29sdmVkSHJlZikgYXMgc3RyaW5nXG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gKHJlc29sdmVBcyA/IFt1cmxBc1N0cmluZ10gOiB1cmxBc1N0cmluZykgYXMgc3RyaW5nXG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaXBPcmlnaW4odXJsOiBzdHJpbmcpIHtcbiAgY29uc3Qgb3JpZ2luID0gZ2V0TG9jYXRpb25PcmlnaW4oKVxuXG4gIHJldHVybiB1cmwuc3RhcnRzV2l0aChvcmlnaW4pID8gdXJsLnN1YnN0cmluZyhvcmlnaW4ubGVuZ3RoKSA6IHVybFxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVXJsQXMocm91dGVyOiBOZXh0Um91dGVyLCB1cmw6IFVybCwgYXM/OiBVcmwpIHtcbiAgLy8gSWYgdXJsIGFuZCBhcyBwcm92aWRlZCBhcyBhbiBvYmplY3QgcmVwcmVzZW50YXRpb24sXG4gIC8vIHdlJ2xsIGZvcm1hdCB0aGVtIGludG8gdGhlIHN0cmluZyB2ZXJzaW9uIGhlcmUuXG4gIGxldCBbcmVzb2x2ZWRIcmVmLCByZXNvbHZlZEFzXSA9IHJlc29sdmVIcmVmKHJvdXRlci5wYXRobmFtZSwgdXJsLCB0cnVlKVxuICBjb25zdCBvcmlnaW4gPSBnZXRMb2NhdGlvbk9yaWdpbigpXG4gIGNvbnN0IGhyZWZIYWRPcmlnaW4gPSByZXNvbHZlZEhyZWYuc3RhcnRzV2l0aChvcmlnaW4pXG4gIGNvbnN0IGFzSGFkT3JpZ2luID0gcmVzb2x2ZWRBcyAmJiByZXNvbHZlZEFzLnN0YXJ0c1dpdGgob3JpZ2luKVxuXG4gIHJlc29sdmVkSHJlZiA9IHN0cmlwT3JpZ2luKHJlc29sdmVkSHJlZilcbiAgcmVzb2x2ZWRBcyA9IHJlc29sdmVkQXMgPyBzdHJpcE9yaWdpbihyZXNvbHZlZEFzKSA6IHJlc29sdmVkQXNcblxuICBjb25zdCBwcmVwYXJlZFVybCA9IGhyZWZIYWRPcmlnaW4gPyByZXNvbHZlZEhyZWYgOiBhZGRCYXNlUGF0aChyZXNvbHZlZEhyZWYpXG4gIGNvbnN0IHByZXBhcmVkQXMgPSBhc1xuICAgID8gc3RyaXBPcmlnaW4ocmVzb2x2ZUhyZWYocm91dGVyLnBhdGhuYW1lLCBhcykpXG4gICAgOiByZXNvbHZlZEFzIHx8IHJlc29sdmVkSHJlZlxuXG4gIHJldHVybiB7XG4gICAgdXJsOiBwcmVwYXJlZFVybCxcbiAgICBhczogYXNIYWRPcmlnaW4gPyBwcmVwYXJlZEFzIDogYWRkQmFzZVBhdGgocHJlcGFyZWRBcyksXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUR5bmFtaWNSb3V0ZShwYXRobmFtZTogc3RyaW5nLCBwYWdlczogc3RyaW5nW10pIHtcbiAgY29uc3QgY2xlYW5QYXRobmFtZSA9IHJlbW92ZVBhdGhUcmFpbGluZ1NsYXNoKGRlbm9ybWFsaXplUGFnZVBhdGgocGF0aG5hbWUhKSlcblxuICBpZiAoY2xlYW5QYXRobmFtZSA9PT0gJy80MDQnIHx8IGNsZWFuUGF0aG5hbWUgPT09ICcvX2Vycm9yJykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgLy8gaGFuZGxlIHJlc29sdmluZyBocmVmIGZvciBkeW5hbWljIHJvdXRlc1xuICBpZiAoIXBhZ2VzLmluY2x1ZGVzKGNsZWFuUGF0aG5hbWUhKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBhcnJheS1jYWxsYmFjay1yZXR1cm5cbiAgICBwYWdlcy5zb21lKChwYWdlKSA9PiB7XG4gICAgICBpZiAoaXNEeW5hbWljUm91dGUocGFnZSkgJiYgZ2V0Um91dGVSZWdleChwYWdlKS5yZS50ZXN0KGNsZWFuUGF0aG5hbWUhKSkge1xuICAgICAgICBwYXRobmFtZSA9IHBhZ2VcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIHJldHVybiByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaChwYXRobmFtZSlcbn1cblxuZXhwb3J0IHR5cGUgQmFzZVJvdXRlciA9IHtcbiAgcm91dGU6IHN0cmluZ1xuICBwYXRobmFtZTogc3RyaW5nXG4gIHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeVxuICBhc1BhdGg6IHN0cmluZ1xuICBiYXNlUGF0aDogc3RyaW5nXG4gIGxvY2FsZT86IHN0cmluZ1xuICBsb2NhbGVzPzogc3RyaW5nW11cbiAgZGVmYXVsdExvY2FsZT86IHN0cmluZ1xuICBkb21haW5Mb2NhbGVzPzogRG9tYWluTG9jYWxlc1xuICBpc0xvY2FsZURvbWFpbjogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBOZXh0Um91dGVyID0gQmFzZVJvdXRlciAmXG4gIFBpY2s8XG4gICAgUm91dGVyLFxuICAgIHwgJ3B1c2gnXG4gICAgfCAncmVwbGFjZSdcbiAgICB8ICdyZWxvYWQnXG4gICAgfCAnYmFjaydcbiAgICB8ICdwcmVmZXRjaCdcbiAgICB8ICdiZWZvcmVQb3BTdGF0ZSdcbiAgICB8ICdldmVudHMnXG4gICAgfCAnaXNGYWxsYmFjaydcbiAgICB8ICdpc1JlYWR5J1xuICAgIHwgJ2lzUHJldmlldydcbiAgPlxuXG5leHBvcnQgdHlwZSBQcmVmZXRjaE9wdGlvbnMgPSB7XG4gIHByaW9yaXR5PzogYm9vbGVhblxuICBsb2NhbGU/OiBzdHJpbmcgfCBmYWxzZVxufVxuXG5leHBvcnQgdHlwZSBQcml2YXRlUm91dGVJbmZvID1cbiAgfCAoT21pdDxDb21wbGV0ZVByaXZhdGVSb3V0ZUluZm8sICdzdHlsZVNoZWV0cyc+ICYgeyBpbml0aWFsOiB0cnVlIH0pXG4gIHwgQ29tcGxldGVQcml2YXRlUm91dGVJbmZvXG5cbmV4cG9ydCB0eXBlIENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mbyA9IHtcbiAgQ29tcG9uZW50OiBDb21wb25lbnRUeXBlXG4gIHN0eWxlU2hlZXRzOiBTdHlsZVNoZWV0VHVwbGVbXVxuICBfX05fU1NHPzogYm9vbGVhblxuICBfX05fU1NQPzogYm9vbGVhblxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgZXJyPzogRXJyb3JcbiAgZXJyb3I/OiBhbnlcbn1cblxuZXhwb3J0IHR5cGUgQXBwUHJvcHMgPSBQaWNrPENvbXBsZXRlUHJpdmF0ZVJvdXRlSW5mbywgJ0NvbXBvbmVudCcgfCAnZXJyJz4gJiB7XG4gIHJvdXRlcjogUm91dGVyXG59ICYgUmVjb3JkPHN0cmluZywgYW55PlxuZXhwb3J0IHR5cGUgQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50VHlwZTxBcHBQcm9wcz5cblxudHlwZSBTdWJzY3JpcHRpb24gPSAoXG4gIGRhdGE6IFByaXZhdGVSb3V0ZUluZm8sXG4gIEFwcDogQXBwQ29tcG9uZW50LFxuICByZXNldFNjcm9sbDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbFxuKSA9PiBQcm9taXNlPHZvaWQ+XG5cbnR5cGUgQmVmb3JlUG9wU3RhdGVDYWxsYmFjayA9IChzdGF0ZTogTmV4dEhpc3RvcnlTdGF0ZSkgPT4gYm9vbGVhblxuXG50eXBlIENvbXBvbmVudExvYWRDYW5jZWwgPSAoKCkgPT4gdm9pZCkgfCBudWxsXG5cbnR5cGUgSGlzdG9yeU1ldGhvZCA9ICdyZXBsYWNlU3RhdGUnIHwgJ3B1c2hTdGF0ZSdcblxuY29uc3QgbWFudWFsU2Nyb2xsUmVzdG9yYXRpb24gPVxuICBwcm9jZXNzLmVudi5fX05FWFRfU0NST0xMX1JFU1RPUkFUSU9OICYmXG4gIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICdzY3JvbGxSZXN0b3JhdGlvbicgaW4gd2luZG93Lmhpc3RvcnkgJiZcbiAgISEoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICBsZXQgdiA9ICdfX25leHQnXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VxdWVuY2VzXG4gICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh2LCB2KSwgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh2KSwgdHJ1ZVxuICAgIH0gY2F0Y2ggKG4pIHt9XG4gIH0pKClcblxuY29uc3QgU1NHX0RBVEFfTk9UX0ZPVU5EID0gU3ltYm9sKCdTU0dfREFUQV9OT1RfRk9VTkQnKVxuXG5mdW5jdGlvbiBmZXRjaFJldHJ5KHVybDogc3RyaW5nLCBhdHRlbXB0czogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcbiAgcmV0dXJuIGZldGNoKHVybCwge1xuICAgIC8vIENvb2tpZXMgYXJlIHJlcXVpcmVkIHRvIGJlIHByZXNlbnQgZm9yIE5leHQuanMnIFNTRyBcIlByZXZpZXcgTW9kZVwiLlxuICAgIC8vIENvb2tpZXMgbWF5IGFsc28gYmUgcmVxdWlyZWQgZm9yIGBnZXRTZXJ2ZXJTaWRlUHJvcHNgLlxuICAgIC8vXG4gICAgLy8gPiBgZmV0Y2hgIHdvbuKAmXQgc2VuZCBjb29raWVzLCB1bmxlc3MgeW91IHNldCB0aGUgY3JlZGVudGlhbHMgaW5pdFxuICAgIC8vID4gb3B0aW9uLlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkvVXNpbmdfRmV0Y2hcbiAgICAvL1xuICAgIC8vID4gRm9yIG1heGltdW0gYnJvd3NlciBjb21wYXRpYmlsaXR5IHdoZW4gaXQgY29tZXMgdG8gc2VuZGluZyAmXG4gICAgLy8gPiByZWNlaXZpbmcgY29va2llcywgYWx3YXlzIHN1cHBseSB0aGUgYGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nYFxuICAgIC8vID4gb3B0aW9uIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgZGVmYXVsdC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2ZldGNoI2NhdmVhdHNcbiAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJyxcbiAgfSkudGhlbigocmVzKSA9PiB7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGlmIChhdHRlbXB0cyA+IDEgJiYgcmVzLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgcmV0dXJuIGZldGNoUmV0cnkodXJsLCBhdHRlbXB0cyAtIDEpXG4gICAgICB9XG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIHJldHVybiByZXMuanNvbigpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YS5ub3RGb3VuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbm90Rm91bmQ6IFNTR19EQVRBX05PVF9GT1VORCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgc3RhdGljIHByb3BzYClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgc3RhdGljIHByb3BzYClcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5qc29uKClcbiAgfSlcbn1cblxuZnVuY3Rpb24gZmV0Y2hOZXh0RGF0YShkYXRhSHJlZjogc3RyaW5nLCBpc1NlcnZlclJlbmRlcjogYm9vbGVhbikge1xuICByZXR1cm4gZmV0Y2hSZXRyeShkYXRhSHJlZiwgaXNTZXJ2ZXJSZW5kZXIgPyAzIDogMSkuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcbiAgICAvLyBXZSBzaG91bGQgb25seSB0cmlnZ2VyIGEgc2VydmVyLXNpZGUgdHJhbnNpdGlvbiBpZiB0aGlzIHdhcyBjYXVzZWRcbiAgICAvLyBvbiBhIGNsaWVudC1zaWRlIHRyYW5zaXRpb24uIE90aGVyd2lzZSwgd2UnZCBnZXQgaW50byBhbiBpbmZpbml0ZVxuICAgIC8vIGxvb3AuXG5cbiAgICBpZiAoIWlzU2VydmVyUmVuZGVyKSB7XG4gICAgICBtYXJrQXNzZXRFcnJvcihlcnIpXG4gICAgfVxuICAgIHRocm93IGVyclxuICB9KVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXIgaW1wbGVtZW50cyBCYXNlUm91dGVyIHtcbiAgcm91dGU6IHN0cmluZ1xuICBwYXRobmFtZTogc3RyaW5nXG4gIHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeVxuICBhc1BhdGg6IHN0cmluZ1xuICBiYXNlUGF0aDogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE1hcCBvZiBhbGwgY29tcG9uZW50cyBsb2FkZWQgaW4gYFJvdXRlcmBcbiAgICovXG4gIGNvbXBvbmVudHM6IHsgW3BhdGhuYW1lOiBzdHJpbmddOiBQcml2YXRlUm91dGVJbmZvIH1cbiAgLy8gU3RhdGljIERhdGEgQ2FjaGVcbiAgc2RjOiB7IFthc1BhdGg6IHN0cmluZ106IG9iamVjdCB9ID0ge31cbiAgLy8gSW4tZmxpZ2h0IFNlcnZlciBEYXRhIFJlcXVlc3RzLCBmb3IgZGVkdXBpbmdcbiAgc2RyOiB7IFthc1BhdGg6IHN0cmluZ106IFByb21pc2U8b2JqZWN0PiB9ID0ge31cblxuICBzdWI6IFN1YnNjcmlwdGlvblxuICBjbGM6IENvbXBvbmVudExvYWRDYW5jZWxcbiAgcGFnZUxvYWRlcjogYW55XG4gIF9icHM6IEJlZm9yZVBvcFN0YXRlQ2FsbGJhY2sgfCB1bmRlZmluZWRcbiAgZXZlbnRzOiBNaXR0RW1pdHRlclxuICBfd3JhcEFwcDogKEFwcDogQXBwQ29tcG9uZW50KSA9PiBhbnlcbiAgaXNTc3I6IGJvb2xlYW5cbiAgaXNGYWxsYmFjazogYm9vbGVhblxuICBfaW5GbGlnaHRSb3V0ZT86IHN0cmluZ1xuICBfc2hhbGxvdz86IGJvb2xlYW5cbiAgbG9jYWxlPzogc3RyaW5nXG4gIGxvY2FsZXM/OiBzdHJpbmdbXVxuICBkZWZhdWx0TG9jYWxlPzogc3RyaW5nXG4gIGRvbWFpbkxvY2FsZXM/OiBEb21haW5Mb2NhbGVzXG4gIGlzUmVhZHk6IGJvb2xlYW5cbiAgaXNQcmV2aWV3OiBib29sZWFuXG4gIGlzTG9jYWxlRG9tYWluOiBib29sZWFuXG5cbiAgcHJpdmF0ZSBfaWR4OiBudW1iZXIgPSAwXG5cbiAgc3RhdGljIGV2ZW50czogTWl0dEVtaXR0ZXIgPSBtaXR0KClcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwYXRobmFtZTogc3RyaW5nLFxuICAgIHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeSxcbiAgICBhczogc3RyaW5nLFxuICAgIHtcbiAgICAgIGluaXRpYWxQcm9wcyxcbiAgICAgIHBhZ2VMb2FkZXIsXG4gICAgICBBcHAsXG4gICAgICB3cmFwQXBwLFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgZXJyLFxuICAgICAgc3Vic2NyaXB0aW9uLFxuICAgICAgaXNGYWxsYmFjayxcbiAgICAgIGxvY2FsZSxcbiAgICAgIGxvY2FsZXMsXG4gICAgICBkZWZhdWx0TG9jYWxlLFxuICAgICAgZG9tYWluTG9jYWxlcyxcbiAgICAgIGlzUHJldmlldyxcbiAgICB9OiB7XG4gICAgICBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvblxuICAgICAgaW5pdGlhbFByb3BzOiBhbnlcbiAgICAgIHBhZ2VMb2FkZXI6IGFueVxuICAgICAgQ29tcG9uZW50OiBDb21wb25lbnRUeXBlXG4gICAgICBBcHA6IEFwcENvbXBvbmVudFxuICAgICAgd3JhcEFwcDogKEFwcDogQXBwQ29tcG9uZW50KSA9PiBhbnlcbiAgICAgIGVycj86IEVycm9yXG4gICAgICBpc0ZhbGxiYWNrOiBib29sZWFuXG4gICAgICBsb2NhbGU/OiBzdHJpbmdcbiAgICAgIGxvY2FsZXM/OiBzdHJpbmdbXVxuICAgICAgZGVmYXVsdExvY2FsZT86IHN0cmluZ1xuICAgICAgZG9tYWluTG9jYWxlcz86IERvbWFpbkxvY2FsZXNcbiAgICAgIGlzUHJldmlldz86IGJvb2xlYW5cbiAgICB9XG4gICkge1xuICAgIC8vIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tcG9uZW50IGtleVxuICAgIHRoaXMucm91dGUgPSByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaChwYXRobmFtZSlcblxuICAgIC8vIHNldCB1cCB0aGUgY29tcG9uZW50IGNhY2hlIChieSByb3V0ZSBrZXlzKVxuICAgIHRoaXMuY29tcG9uZW50cyA9IHt9XG4gICAgLy8gV2Ugc2hvdWxkIG5vdCBrZWVwIHRoZSBjYWNoZSwgaWYgdGhlcmUncyBhbiBlcnJvclxuICAgIC8vIE90aGVyd2lzZSwgdGhpcyBjYXVzZSBpc3N1ZXMgd2hlbiB3aGVuIGdvaW5nIGJhY2sgYW5kXG4gICAgLy8gY29tZSBhZ2FpbiB0byB0aGUgZXJyb3JlZCBwYWdlLlxuICAgIGlmIChwYXRobmFtZSAhPT0gJy9fZXJyb3InKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudHNbdGhpcy5yb3V0ZV0gPSB7XG4gICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgaW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgcHJvcHM6IGluaXRpYWxQcm9wcyxcbiAgICAgICAgZXJyLFxuICAgICAgICBfX05fU1NHOiBpbml0aWFsUHJvcHMgJiYgaW5pdGlhbFByb3BzLl9fTl9TU0csXG4gICAgICAgIF9fTl9TU1A6IGluaXRpYWxQcm9wcyAmJiBpbml0aWFsUHJvcHMuX19OX1NTUCxcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudHNbJy9fYXBwJ10gPSB7XG4gICAgICBDb21wb25lbnQ6IEFwcCBhcyBDb21wb25lbnRUeXBlLFxuICAgICAgc3R5bGVTaGVldHM6IFtcbiAgICAgICAgLyogL19hcHAgZG9lcyBub3QgbmVlZCBpdHMgc3R5bGVzaGVldHMgbWFuYWdlZCAqL1xuICAgICAgXSxcbiAgICB9XG5cbiAgICAvLyBCYWNrd2FyZHMgY29tcGF0IGZvciBSb3V0ZXIucm91dGVyLmV2ZW50c1xuICAgIC8vIFRPRE86IFNob3VsZCBiZSByZW1vdmUgdGhlIGZvbGxvd2luZyBtYWpvciB2ZXJzaW9uIGFzIGl0IHdhcyBuZXZlciBkb2N1bWVudGVkXG4gICAgdGhpcy5ldmVudHMgPSBSb3V0ZXIuZXZlbnRzXG5cbiAgICB0aGlzLnBhZ2VMb2FkZXIgPSBwYWdlTG9hZGVyXG4gICAgdGhpcy5wYXRobmFtZSA9IHBhdGhuYW1lXG4gICAgdGhpcy5xdWVyeSA9IHF1ZXJ5XG4gICAgLy8gaWYgYXV0byBwcmVyZW5kZXJlZCBhbmQgZHluYW1pYyByb3V0ZSB3YWl0IHRvIHVwZGF0ZSBhc1BhdGhcbiAgICAvLyB1bnRpbCBhZnRlciBtb3VudCB0byBwcmV2ZW50IGh5ZHJhdGlvbiBtaXNtYXRjaFxuICAgIGNvbnN0IGF1dG9FeHBvcnREeW5hbWljID1cbiAgICAgIGlzRHluYW1pY1JvdXRlKHBhdGhuYW1lKSAmJiBzZWxmLl9fTkVYVF9EQVRBX18uYXV0b0V4cG9ydFxuXG4gICAgdGhpcy5hc1BhdGggPSBhdXRvRXhwb3J0RHluYW1pYyA/IHBhdGhuYW1lIDogYXNcbiAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGhcbiAgICB0aGlzLnN1YiA9IHN1YnNjcmlwdGlvblxuICAgIHRoaXMuY2xjID0gbnVsbFxuICAgIHRoaXMuX3dyYXBBcHAgPSB3cmFwQXBwXG4gICAgLy8gbWFrZSBzdXJlIHRvIGlnbm9yZSBleHRyYSBwb3BTdGF0ZSBpbiBzYWZhcmkgb24gbmF2aWdhdGluZ1xuICAgIC8vIGJhY2sgZnJvbSBleHRlcm5hbCBzaXRlXG4gICAgdGhpcy5pc1NzciA9IHRydWVcblxuICAgIHRoaXMuaXNGYWxsYmFjayA9IGlzRmFsbGJhY2tcblxuICAgIHRoaXMuaXNSZWFkeSA9ICEhKFxuICAgICAgc2VsZi5fX05FWFRfREFUQV9fLmdzc3AgfHxcbiAgICAgIHNlbGYuX19ORVhUX0RBVEFfXy5naXAgfHxcbiAgICAgICghYXV0b0V4cG9ydER5bmFtaWMgJiYgIXNlbGYubG9jYXRpb24uc2VhcmNoKVxuICAgIClcbiAgICB0aGlzLmlzUHJldmlldyA9ICEhaXNQcmV2aWV3XG4gICAgdGhpcy5pc0xvY2FsZURvbWFpbiA9IGZhbHNlXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVcbiAgICAgIHRoaXMubG9jYWxlcyA9IGxvY2FsZXNcbiAgICAgIHRoaXMuZGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGVcbiAgICAgIHRoaXMuZG9tYWluTG9jYWxlcyA9IGRvbWFpbkxvY2FsZXNcbiAgICAgIHRoaXMuaXNMb2NhbGVEb21haW4gPSAhIWRldGVjdERvbWFpbkxvY2FsZShcbiAgICAgICAgZG9tYWluTG9jYWxlcyxcbiAgICAgICAgc2VsZi5sb2NhdGlvbi5ob3N0bmFtZVxuICAgICAgKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gbWFrZSBzdXJlIFwiYXNcIiBkb2Vzbid0IHN0YXJ0IHdpdGggZG91YmxlIHNsYXNoZXMgb3IgZWxzZSBpdCBjYW5cbiAgICAgIC8vIHRocm93IGFuIGVycm9yIGFzIGl0J3MgY29uc2lkZXJlZCBpbnZhbGlkXG4gICAgICBpZiAoYXMuc3Vic3RyKDAsIDIpICE9PSAnLy8nKSB7XG4gICAgICAgIC8vIGluIG9yZGVyIGZvciBgZS5zdGF0ZWAgdG8gd29yayBvbiB0aGUgYG9ucG9wc3RhdGVgIGV2ZW50XG4gICAgICAgIC8vIHdlIGhhdmUgdG8gcmVnaXN0ZXIgdGhlIGluaXRpYWwgcm91dGUgdXBvbiBpbml0aWFsaXphdGlvblxuICAgICAgICB0aGlzLmNoYW5nZVN0YXRlKFxuICAgICAgICAgICdyZXBsYWNlU3RhdGUnLFxuICAgICAgICAgIGZvcm1hdFdpdGhWYWxpZGF0aW9uKHsgcGF0aG5hbWU6IGFkZEJhc2VQYXRoKHBhdGhuYW1lKSwgcXVlcnkgfSksXG4gICAgICAgICAgZ2V0VVJMKCksXG4gICAgICAgICAgeyBsb2NhbGUgfVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIHRoaXMub25Qb3BTdGF0ZSlcblxuICAgICAgLy8gZW5hYmxlIGN1c3RvbSBzY3JvbGwgcmVzdG9yYXRpb24gaGFuZGxpbmcgd2hlbiBhdmFpbGFibGVcbiAgICAgIC8vIG90aGVyd2lzZSBmYWxsYmFjayB0byBicm93c2VyJ3MgZGVmYXVsdCBoYW5kbGluZ1xuICAgICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9TQ1JPTExfUkVTVE9SQVRJT04pIHtcbiAgICAgICAgaWYgKG1hbnVhbFNjcm9sbFJlc3RvcmF0aW9uKSB7XG4gICAgICAgICAgd2luZG93Lmhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24gPSAnbWFudWFsJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Qb3BTdGF0ZSA9IChlOiBQb3BTdGF0ZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBlLnN0YXRlIGFzIEhpc3RvcnlTdGF0ZVxuXG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgLy8gV2UgZ2V0IHN0YXRlIGFzIHVuZGVmaW5lZCBmb3IgdHdvIHJlYXNvbnMuXG4gICAgICAvLyAgMS4gV2l0aCBvbGRlciBzYWZhcmkgKDwgOCkgYW5kIG9sZGVyIGNocm9tZSAoPCAzNClcbiAgICAgIC8vICAyLiBXaGVuIHRoZSBVUkwgY2hhbmdlZCB3aXRoICNcbiAgICAgIC8vXG4gICAgICAvLyBJbiB0aGUgYm90aCBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0byBwcm9jZWVkIGFuZCBjaGFuZ2UgdGhlIHJvdXRlLlxuICAgICAgLy8gKGFzIGl0J3MgYWxyZWFkeSBjaGFuZ2VkKVxuICAgICAgLy8gQnV0IHdlIGNhbiBzaW1wbHkgcmVwbGFjZSB0aGUgc3RhdGUgd2l0aCB0aGUgbmV3IGNoYW5nZXMuXG4gICAgICAvLyBBY3R1YWxseSwgZm9yICgxKSB3ZSBkb24ndCBuZWVkIHRvIG5vdGhpbmcuIEJ1dCBpdCdzIGhhcmQgdG8gZGV0ZWN0IHRoYXQgZXZlbnQuXG4gICAgICAvLyBTbywgZG9pbmcgdGhlIGZvbGxvd2luZyBmb3IgKDEpIGRvZXMgbm8gaGFybS5cbiAgICAgIGNvbnN0IHsgcGF0aG5hbWUsIHF1ZXJ5IH0gPSB0aGlzXG4gICAgICB0aGlzLmNoYW5nZVN0YXRlKFxuICAgICAgICAncmVwbGFjZVN0YXRlJyxcbiAgICAgICAgZm9ybWF0V2l0aFZhbGlkYXRpb24oeyBwYXRobmFtZTogYWRkQmFzZVBhdGgocGF0aG5hbWUpLCBxdWVyeSB9KSxcbiAgICAgICAgZ2V0VVJMKClcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghc3RhdGUuX19OKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgZm9yY2VkU2Nyb2xsOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCB1bmRlZmluZWRcbiAgICBjb25zdCB7IHVybCwgYXMsIG9wdGlvbnMsIGlkeCB9ID0gc3RhdGVcbiAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX1NDUk9MTF9SRVNUT1JBVElPTikge1xuICAgICAgaWYgKG1hbnVhbFNjcm9sbFJlc3RvcmF0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9pZHggIT09IGlkeCkge1xuICAgICAgICAgIC8vIFNuYXBzaG90IGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uOlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgICAgICAnX19uZXh0X3Njcm9sbF8nICsgdGhpcy5faWR4LFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7IHg6IHNlbGYucGFnZVhPZmZzZXQsIHk6IHNlbGYucGFnZVlPZmZzZXQgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIG9sZCBzY3JvbGwgcG9zaXRpb246XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdfX25leHRfc2Nyb2xsXycgKyBpZHgpXG4gICAgICAgICAgICBmb3JjZWRTY3JvbGwgPSBKU09OLnBhcnNlKHYhKVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgZm9yY2VkU2Nyb2xsID0geyB4OiAwLCB5OiAwIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faWR4ID0gaWR4XG5cbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBwYXJzZVJlbGF0aXZlVXJsKHVybClcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCByZS1yZW5kZXIgb24gaW5pdGlhbCBsb2FkLFxuICAgIC8vIGNhbiBiZSBjYXVzZWQgYnkgbmF2aWdhdGluZyBiYWNrIGZyb20gYW4gZXh0ZXJuYWwgc2l0ZVxuICAgIGlmICh0aGlzLmlzU3NyICYmIGFzID09PSB0aGlzLmFzUGF0aCAmJiBwYXRobmFtZSA9PT0gdGhpcy5wYXRobmFtZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGRvd25zdHJlYW0gYXBwbGljYXRpb24gcmV0dXJucyBmYWxzeSwgcmV0dXJuLlxuICAgIC8vIFRoZXkgd2lsbCB0aGVuIGJlIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGUgZXZlbnQuXG4gICAgaWYgKHRoaXMuX2JwcyAmJiAhdGhpcy5fYnBzKHN0YXRlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jaGFuZ2UoXG4gICAgICAncmVwbGFjZVN0YXRlJyxcbiAgICAgIHVybCxcbiAgICAgIGFzLFxuICAgICAgT2JqZWN0LmFzc2lnbjx7fSwgVHJhbnNpdGlvbk9wdGlvbnMsIFRyYW5zaXRpb25PcHRpb25zPih7fSwgb3B0aW9ucywge1xuICAgICAgICBzaGFsbG93OiBvcHRpb25zLnNoYWxsb3cgJiYgdGhpcy5fc2hhbGxvdyxcbiAgICAgICAgbG9jYWxlOiBvcHRpb25zLmxvY2FsZSB8fCB0aGlzLmRlZmF1bHRMb2NhbGUsXG4gICAgICB9KSxcbiAgICAgIGZvcmNlZFNjcm9sbFxuICAgIClcbiAgfVxuXG4gIHJlbG9hZCgpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyBiYWNrIGluIGhpc3RvcnlcbiAgICovXG4gIGJhY2soKSB7XG4gICAgd2luZG93Lmhpc3RvcnkuYmFjaygpXG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSBgcHVzaFN0YXRlYCB3aXRoIGFyZ3VtZW50c1xuICAgKiBAcGFyYW0gdXJsIG9mIHRoZSByb3V0ZVxuICAgKiBAcGFyYW0gYXMgbWFza3MgYHVybGAgZm9yIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCB5b3UgY2FuIGRlZmluZSBgc2hhbGxvd2AgYW5kIG90aGVyIG9wdGlvbnNcbiAgICovXG4gIHB1c2godXJsOiBVcmwsIGFzPzogVXJsLCBvcHRpb25zOiBUcmFuc2l0aW9uT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9TQ1JPTExfUkVTVE9SQVRJT04pIHtcbiAgICAgIC8vIFRPRE86IHJlbW92ZSBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgdXBkYXRlIGhpc3RvcnkgYmVmb3JlIHJvdXRlIGNoYW5nZVxuICAgICAgLy8gaXMgY29tcGxldGUsIGFzIHRoZSBwb3BzdGF0ZSBldmVudCBzaG91bGQgaGFuZGxlIHRoaXMgY2FwdHVyZS5cbiAgICAgIGlmIChtYW51YWxTY3JvbGxSZXN0b3JhdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFNuYXBzaG90IHNjcm9sbCBwb3NpdGlvbiByaWdodCBiZWZvcmUgbmF2aWdhdGluZyB0byBhIG5ldyBwYWdlOlxuICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAnX19uZXh0X3Njcm9sbF8nICsgdGhpcy5faWR4LFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoeyB4OiBzZWxmLnBhZ2VYT2Zmc2V0LCB5OiBzZWxmLnBhZ2VZT2Zmc2V0IH0pXG4gICAgICAgICAgKVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfVxuICAgIDsoeyB1cmwsIGFzIH0gPSBwcmVwYXJlVXJsQXModGhpcywgdXJsLCBhcykpXG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlKCdwdXNoU3RhdGUnLCB1cmwsIGFzLCBvcHRpb25zKVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgYHJlcGxhY2VTdGF0ZWAgd2l0aCBhcmd1bWVudHNcbiAgICogQHBhcmFtIHVybCBvZiB0aGUgcm91dGVcbiAgICogQHBhcmFtIGFzIG1hc2tzIGB1cmxgIGZvciB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgeW91IGNhbiBkZWZpbmUgYHNoYWxsb3dgIGFuZCBvdGhlciBvcHRpb25zXG4gICAqL1xuICByZXBsYWNlKHVybDogVXJsLCBhcz86IFVybCwgb3B0aW9uczogVHJhbnNpdGlvbk9wdGlvbnMgPSB7fSkge1xuICAgIDsoeyB1cmwsIGFzIH0gPSBwcmVwYXJlVXJsQXModGhpcywgdXJsLCBhcykpXG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlKCdyZXBsYWNlU3RhdGUnLCB1cmwsIGFzLCBvcHRpb25zKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2UoXG4gICAgbWV0aG9kOiBIaXN0b3J5TWV0aG9kLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFzOiBzdHJpbmcsXG4gICAgb3B0aW9uczogVHJhbnNpdGlvbk9wdGlvbnMsXG4gICAgZm9yY2VkU2Nyb2xsPzogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaXNMb2NhbFVSTCh1cmwpKSB7XG4gICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybFxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gZm9yIHN0YXRpYyBwYWdlcyB3aXRoIHF1ZXJ5IHBhcmFtcyBpbiB0aGUgVVJMIHdlIGRlbGF5XG4gICAgLy8gbWFya2luZyB0aGUgcm91dGVyIHJlYWR5IHVudGlsIGFmdGVyIHRoZSBxdWVyeSBpcyB1cGRhdGVkXG4gICAgaWYgKChvcHRpb25zIGFzIGFueSkuX2gpIHtcbiAgICAgIHRoaXMuaXNSZWFkeSA9IHRydWVcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIHNjcm9sbCByZXNldCBiZWhhdmlvciB1bmxlc3MgZXhwbGljaXRseSBzcGVjaWZpZWQgdG8gYmVcbiAgICAvLyBgZmFsc2VgISBUaGlzIG1ha2VzIHRoZSBiZWhhdmlvciBiZXR3ZWVuIHVzaW5nIGBSb3V0ZXIjcHVzaGAgYW5kIGFcbiAgICAvLyBgPExpbmsgLz5gIGNvbnNpc3RlbnQuXG4gICAgb3B0aW9ucy5zY3JvbGwgPSAhIShvcHRpb25zLnNjcm9sbCA/PyB0cnVlKVxuXG4gICAgbGV0IGxvY2FsZUNoYW5nZSA9IG9wdGlvbnMubG9jYWxlICE9PSB0aGlzLmxvY2FsZVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgICAgIHRoaXMubG9jYWxlID1cbiAgICAgICAgb3B0aW9ucy5sb2NhbGUgPT09IGZhbHNlXG4gICAgICAgICAgPyB0aGlzLmRlZmF1bHRMb2NhbGVcbiAgICAgICAgICA6IG9wdGlvbnMubG9jYWxlIHx8IHRoaXMubG9jYWxlXG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5sb2NhbGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIG9wdGlvbnMubG9jYWxlID0gdGhpcy5sb2NhbGVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkQXMgPSBwYXJzZVJlbGF0aXZlVXJsKGhhc0Jhc2VQYXRoKGFzKSA/IGRlbEJhc2VQYXRoKGFzKSA6IGFzKVxuICAgICAgY29uc3QgbG9jYWxlUGF0aFJlc3VsdCA9IG5vcm1hbGl6ZUxvY2FsZVBhdGgoXG4gICAgICAgIHBhcnNlZEFzLnBhdGhuYW1lLFxuICAgICAgICB0aGlzLmxvY2FsZXNcbiAgICAgIClcblxuICAgICAgaWYgKGxvY2FsZVBhdGhSZXN1bHQuZGV0ZWN0ZWRMb2NhbGUpIHtcbiAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGVQYXRoUmVzdWx0LmRldGVjdGVkTG9jYWxlXG4gICAgICAgIHBhcnNlZEFzLnBhdGhuYW1lID0gYWRkQmFzZVBhdGgocGFyc2VkQXMucGF0aG5hbWUpXG4gICAgICAgIGFzID0gZm9ybWF0V2l0aFZhbGlkYXRpb24ocGFyc2VkQXMpXG4gICAgICAgIHVybCA9IGFkZEJhc2VQYXRoKFxuICAgICAgICAgIG5vcm1hbGl6ZUxvY2FsZVBhdGgoXG4gICAgICAgICAgICBoYXNCYXNlUGF0aCh1cmwpID8gZGVsQmFzZVBhdGgodXJsKSA6IHVybCxcbiAgICAgICAgICAgIHRoaXMubG9jYWxlc1xuICAgICAgICAgICkucGF0aG5hbWVcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgbGV0IGRpZE5hdmlnYXRlID0gZmFsc2VcblxuICAgICAgLy8gd2UgbmVlZCB0byB3cmFwIHRoaXMgaW4gdGhlIGVudiBjaGVjayBhZ2FpbiBzaW5jZSByZWdlbmVyYXRvciBydW50aW1lXG4gICAgICAvLyBtb3ZlcyB0aGlzIG9uIGl0cyBvd24gZHVlIHRvIHRoZSByZXR1cm5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgICAgIC8vIGlmIHRoZSBsb2NhbGUgaXNuJ3QgY29uZmlndXJlZCBoYXJkIG5hdmlnYXRlIHRvIHNob3cgNDA0IHBhZ2VcbiAgICAgICAgaWYgKCF0aGlzLmxvY2FsZXM/LmluY2x1ZGVzKHRoaXMubG9jYWxlISkpIHtcbiAgICAgICAgICBwYXJzZWRBcy5wYXRobmFtZSA9IGFkZExvY2FsZShwYXJzZWRBcy5wYXRobmFtZSwgdGhpcy5sb2NhbGUpXG4gICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBmb3JtYXRXaXRoVmFsaWRhdGlvbihwYXJzZWRBcylcbiAgICAgICAgICAvLyB0aGlzIHdhcyBwcmV2aW91c2x5IGEgcmV0dXJuIGJ1dCB3YXMgcmVtb3ZlZCBpbiBmYXZvclxuICAgICAgICAgIC8vIG9mIGJldHRlciBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2l0aCByZWdlbmVyYXRvciBydW50aW1lXG4gICAgICAgICAgZGlkTmF2aWdhdGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV0ZWN0ZWREb21haW4gPSBkZXRlY3REb21haW5Mb2NhbGUoXG4gICAgICAgIHRoaXMuZG9tYWluTG9jYWxlcyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0aGlzLmxvY2FsZVxuICAgICAgKVxuXG4gICAgICAvLyB3ZSBuZWVkIHRvIHdyYXAgdGhpcyBpbiB0aGUgZW52IGNoZWNrIGFnYWluIHNpbmNlIHJlZ2VuZXJhdG9yIHJ1bnRpbWVcbiAgICAgIC8vIG1vdmVzIHRoaXMgb24gaXRzIG93biBkdWUgdG8gdGhlIHJldHVyblxuICAgICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9JMThOX1NVUFBPUlQpIHtcbiAgICAgICAgLy8gaWYgd2UgYXJlIG5hdmlnYXRpbmcgdG8gYSBkb21haW4gbG9jYWxlIGVuc3VyZSB3ZSByZWRpcmVjdCB0byB0aGVcbiAgICAgICAgLy8gY29ycmVjdCBkb21haW5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFkaWROYXZpZ2F0ZSAmJlxuICAgICAgICAgIGRldGVjdGVkRG9tYWluICYmXG4gICAgICAgICAgdGhpcy5pc0xvY2FsZURvbWFpbiAmJlxuICAgICAgICAgIHNlbGYubG9jYXRpb24uaG9zdG5hbWUgIT09IGRldGVjdGVkRG9tYWluLmRvbWFpblxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBhc05vQmFzZVBhdGggPSBkZWxCYXNlUGF0aChhcylcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGBodHRwJHtkZXRlY3RlZERvbWFpbi5odHRwID8gJycgOiAncyd9Oi8vJHtcbiAgICAgICAgICAgIGRldGVjdGVkRG9tYWluLmRvbWFpblxuICAgICAgICAgIH0ke2FkZEJhc2VQYXRoKFxuICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgIHRoaXMubG9jYWxlID09PSBkZXRlY3RlZERvbWFpbi5kZWZhdWx0TG9jYWxlXG4gICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgIDogYC8ke3RoaXMubG9jYWxlfWBcbiAgICAgICAgICAgIH0ke2FzTm9CYXNlUGF0aCA9PT0gJy8nID8gJycgOiBhc05vQmFzZVBhdGh9YCB8fCAnLydcbiAgICAgICAgICApfWBcbiAgICAgICAgICAvLyB0aGlzIHdhcyBwcmV2aW91c2x5IGEgcmV0dXJuIGJ1dCB3YXMgcmVtb3ZlZCBpbiBmYXZvclxuICAgICAgICAgIC8vIG9mIGJldHRlciBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2l0aCByZWdlbmVyYXRvciBydW50aW1lXG4gICAgICAgICAgZGlkTmF2aWdhdGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRpZE5hdmlnYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKSA9PiB7fSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShvcHRpb25zIGFzIGFueSkuX2gpIHtcbiAgICAgIHRoaXMuaXNTc3IgPSBmYWxzZVxuICAgIH1cbiAgICAvLyBtYXJraW5nIHJvdXRlIGNoYW5nZXMgYXMgYSBuYXZpZ2F0aW9uIHN0YXJ0IGVudHJ5XG4gICAgaWYgKFNUKSB7XG4gICAgICBwZXJmb3JtYW5jZS5tYXJrKCdyb3V0ZUNoYW5nZScpXG4gICAgfVxuXG4gICAgY29uc3QgeyBzaGFsbG93ID0gZmFsc2UgfSA9IG9wdGlvbnNcbiAgICBjb25zdCByb3V0ZVByb3BzID0geyBzaGFsbG93IH1cblxuICAgIGlmICh0aGlzLl9pbkZsaWdodFJvdXRlKSB7XG4gICAgICB0aGlzLmFib3J0Q29tcG9uZW50TG9hZCh0aGlzLl9pbkZsaWdodFJvdXRlLCByb3V0ZVByb3BzKVxuICAgIH1cblxuICAgIGFzID0gYWRkQmFzZVBhdGgoXG4gICAgICBhZGRMb2NhbGUoXG4gICAgICAgIGhhc0Jhc2VQYXRoKGFzKSA/IGRlbEJhc2VQYXRoKGFzKSA6IGFzLFxuICAgICAgICBvcHRpb25zLmxvY2FsZSxcbiAgICAgICAgdGhpcy5kZWZhdWx0TG9jYWxlXG4gICAgICApXG4gICAgKVxuICAgIGNvbnN0IGNsZWFuZWRBcyA9IGRlbExvY2FsZShcbiAgICAgIGhhc0Jhc2VQYXRoKGFzKSA/IGRlbEJhc2VQYXRoKGFzKSA6IGFzLFxuICAgICAgdGhpcy5sb2NhbGVcbiAgICApXG4gICAgdGhpcy5faW5GbGlnaHRSb3V0ZSA9IGFzXG5cbiAgICAvLyBJZiB0aGUgdXJsIGNoYW5nZSBpcyBvbmx5IHJlbGF0ZWQgdG8gYSBoYXNoIGNoYW5nZVxuICAgIC8vIFdlIHNob3VsZCBub3QgcHJvY2VlZC4gV2Ugc2hvdWxkIG9ubHkgY2hhbmdlIHRoZSBzdGF0ZS5cblxuICAgIC8vIFdBUk5JTkc6IGBfaGAgaXMgYW4gaW50ZXJuYWwgb3B0aW9uIGZvciBoYW5kaW5nIE5leHQuanMgY2xpZW50LXNpZGVcbiAgICAvLyBoeWRyYXRpb24uIFlvdXIgYXBwIHNob3VsZCBfbmV2ZXJfIHVzZSB0aGlzIHByb3BlcnR5LiBJdCBtYXkgY2hhbmdlIGF0XG4gICAgLy8gYW55IHRpbWUgd2l0aG91dCBub3RpY2UuXG4gICAgaWYgKCEob3B0aW9ucyBhcyBhbnkpLl9oICYmIHRoaXMub25seUFIYXNoQ2hhbmdlKGNsZWFuZWRBcykpIHtcbiAgICAgIHRoaXMuYXNQYXRoID0gY2xlYW5lZEFzXG4gICAgICBSb3V0ZXIuZXZlbnRzLmVtaXQoJ2hhc2hDaGFuZ2VTdGFydCcsIGFzLCByb3V0ZVByb3BzKVxuICAgICAgLy8gVE9ETzogZG8gd2UgbmVlZCB0aGUgcmVzb2x2ZWQgaHJlZiB3aGVuIG9ubHkgYSBoYXNoIGNoYW5nZT9cbiAgICAgIHRoaXMuY2hhbmdlU3RhdGUobWV0aG9kLCB1cmwsIGFzLCBvcHRpb25zKVxuICAgICAgdGhpcy5zY3JvbGxUb0hhc2goY2xlYW5lZEFzKVxuICAgICAgdGhpcy5ub3RpZnkodGhpcy5jb21wb25lbnRzW3RoaXMucm91dGVdLCBudWxsKVxuICAgICAgUm91dGVyLmV2ZW50cy5lbWl0KCdoYXNoQ2hhbmdlQ29tcGxldGUnLCBhcywgcm91dGVQcm9wcylcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgbGV0IHBhcnNlZCA9IHBhcnNlUmVsYXRpdmVVcmwodXJsKVxuICAgIGxldCB7IHBhdGhuYW1lLCBxdWVyeSB9ID0gcGFyc2VkXG5cbiAgICAvLyBUaGUgYnVpbGQgbWFuaWZlc3QgbmVlZHMgdG8gYmUgbG9hZGVkIGJlZm9yZSBhdXRvLXN0YXRpYyBkeW5hbWljIHBhZ2VzXG4gICAgLy8gZ2V0IHRoZWlyIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gYWxsb3cgZW5zdXJpbmcgdGhleSBjYW4gYmUgcGFyc2VkIHByb3Blcmx5XG4gICAgLy8gd2hlbiByZXdyaXR0ZW4gdG9cbiAgICBsZXQgcGFnZXM6IGFueSwgcmV3cml0ZXM6IGFueVxuICAgIHRyeSB7XG4gICAgICBwYWdlcyA9IGF3YWl0IHRoaXMucGFnZUxvYWRlci5nZXRQYWdlTGlzdCgpXG4gICAgICA7KHsgX19yZXdyaXRlczogcmV3cml0ZXMgfSA9IGF3YWl0IGdldENsaWVudEJ1aWxkTWFuaWZlc3QoKSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIHdlIGZhaWwgdG8gcmVzb2x2ZSB0aGUgcGFnZSBsaXN0IG9yIGNsaWVudC1idWlsZCBtYW5pZmVzdCwgd2UgbXVzdFxuICAgICAgLy8gZG8gYSBzZXJ2ZXItc2lkZSB0cmFuc2l0aW9uOlxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhc1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgYXNrZWQgdG8gY2hhbmdlIHRoZSBjdXJyZW50IFVSTCB3ZSBzaG91bGQgcmVsb2FkIHRoZSBjdXJyZW50IHBhZ2VcbiAgICAvLyAobm90IGxvY2F0aW9uLnJlbG9hZCgpIGJ1dCByZWxvYWQgZ2V0SW5pdGlhbFByb3BzIGFuZCBvdGhlciBOZXh0LmpzIHN0dWZmcylcbiAgICAvLyBXZSBhbHNvIG5lZWQgdG8gc2V0IHRoZSBtZXRob2QgPSByZXBsYWNlU3RhdGUgYWx3YXlzXG4gICAgLy8gYXMgdGhpcyBzaG91bGQgbm90IGdvIGludG8gdGhlIGhpc3RvcnkgKFRoYXQncyBob3cgYnJvd3NlcnMgd29yaylcbiAgICAvLyBXZSBzaG91bGQgY29tcGFyZSB0aGUgbmV3IGFzUGF0aCB0byB0aGUgY3VycmVudCBhc1BhdGgsIG5vdCB0aGUgdXJsXG4gICAgaWYgKCF0aGlzLnVybElzTmV3KGNsZWFuZWRBcykgJiYgIWxvY2FsZUNoYW5nZSkge1xuICAgICAgbWV0aG9kID0gJ3JlcGxhY2VTdGF0ZSdcbiAgICB9XG5cbiAgICAvLyB3ZSBuZWVkIHRvIHJlc29sdmUgdGhlIGFzIHZhbHVlIHVzaW5nIHJld3JpdGVzIGZvciBkeW5hbWljIFNTR1xuICAgIC8vIHBhZ2VzIHRvIGFsbG93IGJ1aWxkaW5nIHRoZSBkYXRhIFVSTCBjb3JyZWN0bHlcbiAgICBsZXQgcmVzb2x2ZWRBcyA9IGFzXG5cbiAgICAvLyB1cmwgYW5kIGFzIHNob3VsZCBhbHdheXMgYmUgcHJlZml4ZWQgd2l0aCBiYXNlUGF0aCBieSB0aGlzXG4gICAgLy8gcG9pbnQgYnkgZWl0aGVyIG5leHQvbGluayBvciByb3V0ZXIucHVzaC9yZXBsYWNlIHNvIHN0cmlwIHRoZVxuICAgIC8vIGJhc2VQYXRoIGZyb20gdGhlIHBhdGhuYW1lIHRvIG1hdGNoIHRoZSBwYWdlcyBkaXIgMS10by0xXG4gICAgcGF0aG5hbWUgPSBwYXRobmFtZVxuICAgICAgPyByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaChkZWxCYXNlUGF0aChwYXRobmFtZSkpXG4gICAgICA6IHBhdGhuYW1lXG5cbiAgICBpZiAocGF0aG5hbWUgIT09ICcvX2Vycm9yJykge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9IQVNfUkVXUklURVMgJiYgYXMuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICAgIGNvbnN0IHJld3JpdGVzUmVzdWx0ID0gcmVzb2x2ZVJld3JpdGVzKFxuICAgICAgICAgIGFkZEJhc2VQYXRoKGFkZExvY2FsZShkZWxCYXNlUGF0aChhcyksIHRoaXMubG9jYWxlKSksXG4gICAgICAgICAgcGFnZXMsXG4gICAgICAgICAgcmV3cml0ZXMsXG4gICAgICAgICAgcXVlcnksXG4gICAgICAgICAgKHA6IHN0cmluZykgPT4gcmVzb2x2ZUR5bmFtaWNSb3V0ZShwLCBwYWdlcyksXG4gICAgICAgICAgdGhpcy5sb2NhbGVzXG4gICAgICAgIClcbiAgICAgICAgcmVzb2x2ZWRBcyA9IHJld3JpdGVzUmVzdWx0LmFzUGF0aFxuXG4gICAgICAgIGlmIChyZXdyaXRlc1Jlc3VsdC5tYXRjaGVkUGFnZSAmJiByZXdyaXRlc1Jlc3VsdC5yZXNvbHZlZEhyZWYpIHtcbiAgICAgICAgICAvLyBpZiB0aGlzIGRpcmVjdGx5IG1hdGNoZXMgYSBwYWdlIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBocmVmIHRvXG4gICAgICAgICAgLy8gYWxsb3cgdGhlIGNvcnJlY3QgcGFnZSBjaHVuayB0byBiZSBsb2FkZWRcbiAgICAgICAgICBwYXRobmFtZSA9IHJld3JpdGVzUmVzdWx0LnJlc29sdmVkSHJlZlxuICAgICAgICAgIHBhcnNlZC5wYXRobmFtZSA9IHBhdGhuYW1lXG4gICAgICAgICAgdXJsID0gZm9ybWF0V2l0aFZhbGlkYXRpb24ocGFyc2VkKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWQucGF0aG5hbWUgPSByZXNvbHZlRHluYW1pY1JvdXRlKHBhdGhuYW1lLCBwYWdlcylcblxuICAgICAgICBpZiAocGFyc2VkLnBhdGhuYW1lICE9PSBwYXRobmFtZSkge1xuICAgICAgICAgIHBhdGhuYW1lID0gcGFyc2VkLnBhdGhuYW1lXG4gICAgICAgICAgdXJsID0gZm9ybWF0V2l0aFZhbGlkYXRpb24ocGFyc2VkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGUgPSByZW1vdmVQYXRoVHJhaWxpbmdTbGFzaChwYXRobmFtZSlcblxuICAgIGlmICghaXNMb2NhbFVSTChhcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBocmVmOiBcIiR7dXJsfVwiIGFuZCBhczogXCIke2FzfVwiLCByZWNlaXZlZCByZWxhdGl2ZSBocmVmIGFuZCBleHRlcm5hbCBhc2AgK1xuICAgICAgICAgICAgYFxcblNlZSBtb3JlIGluZm86IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2ludmFsaWQtcmVsYXRpdmUtdXJsLWV4dGVybmFsLWFzYFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYXNcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJlc29sdmVkQXMgPSBkZWxMb2NhbGUoZGVsQmFzZVBhdGgocmVzb2x2ZWRBcyksIHRoaXMubG9jYWxlKVxuXG4gICAgaWYgKGlzRHluYW1pY1JvdXRlKHJvdXRlKSkge1xuICAgICAgY29uc3QgcGFyc2VkQXMgPSBwYXJzZVJlbGF0aXZlVXJsKHJlc29sdmVkQXMpXG4gICAgICBjb25zdCBhc1BhdGhuYW1lID0gcGFyc2VkQXMucGF0aG5hbWVcblxuICAgICAgY29uc3Qgcm91dGVSZWdleCA9IGdldFJvdXRlUmVnZXgocm91dGUpXG4gICAgICBjb25zdCByb3V0ZU1hdGNoID0gZ2V0Um91dGVNYXRjaGVyKHJvdXRlUmVnZXgpKGFzUGF0aG5hbWUpXG4gICAgICBjb25zdCBzaG91bGRJbnRlcnBvbGF0ZSA9IHJvdXRlID09PSBhc1BhdGhuYW1lXG4gICAgICBjb25zdCBpbnRlcnBvbGF0ZWRBcyA9IHNob3VsZEludGVycG9sYXRlXG4gICAgICAgID8gaW50ZXJwb2xhdGVBcyhyb3V0ZSwgYXNQYXRobmFtZSwgcXVlcnkpXG4gICAgICAgIDogKHt9IGFzIHsgcmVzdWx0OiB1bmRlZmluZWQ7IHBhcmFtczogdW5kZWZpbmVkIH0pXG5cbiAgICAgIGlmICghcm91dGVNYXRjaCB8fCAoc2hvdWxkSW50ZXJwb2xhdGUgJiYgIWludGVycG9sYXRlZEFzLnJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ1BhcmFtcyA9IE9iamVjdC5rZXlzKHJvdXRlUmVnZXguZ3JvdXBzKS5maWx0ZXIoXG4gICAgICAgICAgKHBhcmFtKSA9PiAhcXVlcnlbcGFyYW1dXG4gICAgICAgIClcblxuICAgICAgICBpZiAobWlzc2luZ1BhcmFtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgYCR7XG4gICAgICAgICAgICAgICAgc2hvdWxkSW50ZXJwb2xhdGVcbiAgICAgICAgICAgICAgICAgID8gYEludGVycG9sYXRpbmcgaHJlZmBcbiAgICAgICAgICAgICAgICAgIDogYE1pc21hdGNoaW5nIFxcYGFzXFxgIGFuZCBcXGBocmVmXFxgYFxuICAgICAgICAgICAgICB9IGZhaWxlZCB0byBtYW51YWxseSBwcm92aWRlIGAgK1xuICAgICAgICAgICAgICAgIGB0aGUgcGFyYW1zOiAke21pc3NpbmdQYXJhbXMuam9pbihcbiAgICAgICAgICAgICAgICAgICcsICdcbiAgICAgICAgICAgICAgICApfSBpbiB0aGUgXFxgaHJlZlxcYCdzIFxcYHF1ZXJ5XFxgYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIChzaG91bGRJbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICA/IGBUaGUgcHJvdmlkZWQgXFxgaHJlZlxcYCAoJHt1cmx9KSB2YWx1ZSBpcyBtaXNzaW5nIHF1ZXJ5IHZhbHVlcyAoJHttaXNzaW5nUGFyYW1zLmpvaW4oXG4gICAgICAgICAgICAgICAgICAnLCAnXG4gICAgICAgICAgICAgICAgKX0pIHRvIGJlIGludGVycG9sYXRlZCBwcm9wZXJseS4gYFxuICAgICAgICAgICAgICA6IGBUaGUgcHJvdmlkZWQgXFxgYXNcXGAgdmFsdWUgKCR7YXNQYXRobmFtZX0pIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBcXGBocmVmXFxgIHZhbHVlICgke3JvdXRlfSkuIGApICtcbiAgICAgICAgICAgICAgYFJlYWQgbW9yZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvbWVzc2FnZXMvJHtcbiAgICAgICAgICAgICAgICBzaG91bGRJbnRlcnBvbGF0ZVxuICAgICAgICAgICAgICAgICAgPyAnaHJlZi1pbnRlcnBvbGF0aW9uLWZhaWxlZCdcbiAgICAgICAgICAgICAgICAgIDogJ2luY29tcGF0aWJsZS1ocmVmLWFzJ1xuICAgICAgICAgICAgICB9YFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzaG91bGRJbnRlcnBvbGF0ZSkge1xuICAgICAgICBhcyA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oe30sIHBhcnNlZEFzLCB7XG4gICAgICAgICAgICBwYXRobmFtZTogaW50ZXJwb2xhdGVkQXMucmVzdWx0LFxuICAgICAgICAgICAgcXVlcnk6IG9taXRQYXJtc0Zyb21RdWVyeShxdWVyeSwgaW50ZXJwb2xhdGVkQXMucGFyYW1zISksXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTWVyZ2UgcGFyYW1zIGludG8gYHF1ZXJ5YCwgb3ZlcndyaXRpbmcgYW55IHNwZWNpZmllZCBpbiBzZWFyY2hcbiAgICAgICAgT2JqZWN0LmFzc2lnbihxdWVyeSwgcm91dGVNYXRjaClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSb3V0ZXIuZXZlbnRzLmVtaXQoJ3JvdXRlQ2hhbmdlU3RhcnQnLCBhcywgcm91dGVQcm9wcylcblxuICAgIHRyeSB7XG4gICAgICBsZXQgcm91dGVJbmZvID0gYXdhaXQgdGhpcy5nZXRSb3V0ZUluZm8oXG4gICAgICAgIHJvdXRlLFxuICAgICAgICBwYXRobmFtZSxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGFzLFxuICAgICAgICByZXNvbHZlZEFzLFxuICAgICAgICByb3V0ZVByb3BzXG4gICAgICApXG4gICAgICBsZXQgeyBlcnJvciwgcHJvcHMsIF9fTl9TU0csIF9fTl9TU1AgfSA9IHJvdXRlSW5mb1xuXG4gICAgICAvLyBoYW5kbGUgcmVkaXJlY3Qgb24gY2xpZW50LXRyYW5zaXRpb25cbiAgICAgIGlmICgoX19OX1NTRyB8fCBfX05fU1NQKSAmJiBwcm9wcykge1xuICAgICAgICBpZiAoKHByb3BzIGFzIGFueSkucGFnZVByb3BzICYmIChwcm9wcyBhcyBhbnkpLnBhZ2VQcm9wcy5fX05fUkVESVJFQ1QpIHtcbiAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IChwcm9wcyBhcyBhbnkpLnBhZ2VQcm9wcy5fX05fUkVESVJFQ1RcblxuICAgICAgICAgIC8vIGNoZWNrIGlmIGRlc3RpbmF0aW9uIGlzIGludGVybmFsIChyZXNvbHZlcyB0byBhIHBhZ2UpIGFuZCBhdHRlbXB0XG4gICAgICAgICAgLy8gY2xpZW50LW5hdmlnYXRpb24gaWYgaXQgaXMgZmFsbGluZyBiYWNrIHRvIGhhcmQgbmF2aWdhdGlvbiBpZlxuICAgICAgICAgIC8vIGl0J3Mgbm90XG4gICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkSHJlZiA9IHBhcnNlUmVsYXRpdmVVcmwoZGVzdGluYXRpb24pXG4gICAgICAgICAgICBwYXJzZWRIcmVmLnBhdGhuYW1lID0gcmVzb2x2ZUR5bmFtaWNSb3V0ZShcbiAgICAgICAgICAgICAgcGFyc2VkSHJlZi5wYXRobmFtZSxcbiAgICAgICAgICAgICAgcGFnZXNcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHBhZ2VzLmluY2x1ZGVzKHBhcnNlZEhyZWYucGF0aG5hbWUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgdXJsOiBuZXdVcmwsIGFzOiBuZXdBcyB9ID0gcHJlcGFyZVVybEFzKFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jaGFuZ2UobWV0aG9kLCBuZXdVcmwsIG5ld0FzLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZGVzdGluYXRpb25cbiAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKCkgPT4ge30pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzUHJldmlldyA9ICEhcHJvcHMuX19OX1BSRVZJRVdcblxuICAgICAgICAvLyBoYW5kbGUgU1NHIGRhdGEgNDA0XG4gICAgICAgIGlmIChwcm9wcy5ub3RGb3VuZCA9PT0gU1NHX0RBVEFfTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgbGV0IG5vdEZvdW5kUm91dGVcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29tcG9uZW50KCcvNDA0JylcbiAgICAgICAgICAgIG5vdEZvdW5kUm91dGUgPSAnLzQwNCdcbiAgICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgICBub3RGb3VuZFJvdXRlID0gJy9fZXJyb3InXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm91dGVJbmZvID0gYXdhaXQgdGhpcy5nZXRSb3V0ZUluZm8oXG4gICAgICAgICAgICBub3RGb3VuZFJvdXRlLFxuICAgICAgICAgICAgbm90Rm91bmRSb3V0ZSxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgYXMsXG4gICAgICAgICAgICByZXNvbHZlZEFzLFxuICAgICAgICAgICAgeyBzaGFsbG93OiBmYWxzZSB9XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIFJvdXRlci5ldmVudHMuZW1pdCgnYmVmb3JlSGlzdG9yeUNoYW5nZScsIGFzLCByb3V0ZVByb3BzKVxuICAgICAgdGhpcy5jaGFuZ2VTdGF0ZShtZXRob2QsIHVybCwgYXMsIG9wdGlvbnMpXG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGFwcENvbXA6IGFueSA9IHRoaXMuY29tcG9uZW50c1snL19hcHAnXS5Db21wb25lbnRcbiAgICAgICAgOyh3aW5kb3cgYXMgYW55KS5uZXh0LmlzUHJlcmVuZGVyZWQgPVxuICAgICAgICAgIGFwcENvbXAuZ2V0SW5pdGlhbFByb3BzID09PSBhcHBDb21wLm9yaWdHZXRJbml0aWFsUHJvcHMgJiZcbiAgICAgICAgICAhKHJvdXRlSW5mby5Db21wb25lbnQgYXMgYW55KS5nZXRJbml0aWFsUHJvcHNcbiAgICAgIH1cblxuICAgICAgLy8gc2hhbGxvdyByb3V0aW5nIGlzIG9ubHkgYWxsb3dlZCBmb3Igc2FtZSBwYWdlIFVSTCBjaGFuZ2VzLlxuICAgICAgY29uc3QgaXNWYWxpZFNoYWxsb3dSb3V0ZSA9IG9wdGlvbnMuc2hhbGxvdyAmJiB0aGlzLnJvdXRlID09PSByb3V0ZVxuXG4gICAgICBpZiAoXG4gICAgICAgIChvcHRpb25zIGFzIGFueSkuX2ggJiZcbiAgICAgICAgcGF0aG5hbWUgPT09ICcvX2Vycm9yJyAmJlxuICAgICAgICBzZWxmLl9fTkVYVF9EQVRBX18ucHJvcHM/LnBhZ2VQcm9wcz8uc3RhdHVzQ29kZSA9PT0gNTAwICYmXG4gICAgICAgIHByb3BzPy5wYWdlUHJvcHNcbiAgICAgICkge1xuICAgICAgICAvLyBlbnN1cmUgc3RhdHVzQ29kZSBpcyBzdGlsbCBjb3JyZWN0IGZvciBzdGF0aWMgNTAwIHBhZ2VcbiAgICAgICAgLy8gd2hlbiB1cGRhdGluZyBxdWVyeSBpbmZvcm1hdGlvblxuICAgICAgICBwcm9wcy5wYWdlUHJvcHMuc3RhdHVzQ29kZSA9IDUwMFxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnNldChcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHBhdGhuYW1lISxcbiAgICAgICAgcXVlcnksXG4gICAgICAgIGNsZWFuZWRBcyxcbiAgICAgICAgcm91dGVJbmZvLFxuICAgICAgICBmb3JjZWRTY3JvbGwgfHxcbiAgICAgICAgICAoaXNWYWxpZFNoYWxsb3dSb3V0ZSB8fCAhb3B0aW9ucy5zY3JvbGwgPyBudWxsIDogeyB4OiAwLCB5OiAwIH0pXG4gICAgICApLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGlmIChlLmNhbmNlbGxlZCkgZXJyb3IgPSBlcnJvciB8fCBlXG4gICAgICAgIGVsc2UgdGhyb3cgZVxuICAgICAgfSlcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIFJvdXRlci5ldmVudHMuZW1pdCgncm91dGVDaGFuZ2VFcnJvcicsIGVycm9yLCBjbGVhbmVkQXMsIHJvdXRlUHJvcHMpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5fX05FWFRfSTE4Tl9TVVBQT1JUKSB7XG4gICAgICAgIGlmICh0aGlzLmxvY2FsZSkge1xuICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sYW5nID0gdGhpcy5sb2NhbGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgUm91dGVyLmV2ZW50cy5lbWl0KCdyb3V0ZUNoYW5nZUNvbXBsZXRlJywgYXMsIHJvdXRlUHJvcHMpXG5cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLmNhbmNlbGxlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHRocm93IGVyclxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVN0YXRlKFxuICAgIG1ldGhvZDogSGlzdG9yeU1ldGhvZCxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhczogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFRyYW5zaXRpb25PcHRpb25zID0ge31cbiAgKTogdm9pZCB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lmhpc3RvcnkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFdhcm5pbmc6IHdpbmRvdy5oaXN0b3J5IGlzIG5vdCBhdmFpbGFibGUuYClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygd2luZG93Lmhpc3RvcnlbbWV0aG9kXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgV2FybmluZzogd2luZG93Lmhpc3RvcnkuJHttZXRob2R9IGlzIG5vdCBhdmFpbGFibGVgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kICE9PSAncHVzaFN0YXRlJyB8fCBnZXRVUkwoKSAhPT0gYXMpIHtcbiAgICAgIHRoaXMuX3NoYWxsb3cgPSBvcHRpb25zLnNoYWxsb3dcbiAgICAgIHdpbmRvdy5oaXN0b3J5W21ldGhvZF0oXG4gICAgICAgIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgYXMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBfX046IHRydWUsXG4gICAgICAgICAgaWR4OiB0aGlzLl9pZHggPSBtZXRob2QgIT09ICdwdXNoU3RhdGUnID8gdGhpcy5faWR4IDogdGhpcy5faWR4ICsgMSxcbiAgICAgICAgfSBhcyBIaXN0b3J5U3RhdGUsXG4gICAgICAgIC8vIE1vc3QgYnJvd3NlcnMgY3VycmVudGx5IGlnbm9yZXMgdGhpcyBwYXJhbWV0ZXIsIGFsdGhvdWdoIHRoZXkgbWF5IHVzZSBpdCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAvLyBQYXNzaW5nIHRoZSBlbXB0eSBzdHJpbmcgaGVyZSBzaG91bGQgYmUgc2FmZSBhZ2FpbnN0IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBtZXRob2QuXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9IaXN0b3J5L3JlcGxhY2VTdGF0ZVxuICAgICAgICAnJyxcbiAgICAgICAgYXNcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYW5kbGVSb3V0ZUluZm9FcnJvcihcbiAgICBlcnI6IEVycm9yICYgeyBjb2RlOiBhbnk7IGNhbmNlbGxlZDogYm9vbGVhbiB9LFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgcXVlcnk6IFBhcnNlZFVybFF1ZXJ5LFxuICAgIGFzOiBzdHJpbmcsXG4gICAgcm91dGVQcm9wczogUm91dGVQcm9wZXJ0aWVzLFxuICAgIGxvYWRFcnJvckZhaWw/OiBib29sZWFuXG4gICk6IFByb21pc2U8Q29tcGxldGVQcml2YXRlUm91dGVJbmZvPiB7XG4gICAgaWYgKGVyci5jYW5jZWxsZWQpIHtcbiAgICAgIC8vIGJ1YmJsZSB1cCBjYW5jZWxsYXRpb24gZXJyb3JzXG4gICAgICB0aHJvdyBlcnJcbiAgICB9XG5cbiAgICBpZiAoaXNBc3NldEVycm9yKGVycikgfHwgbG9hZEVycm9yRmFpbCkge1xuICAgICAgUm91dGVyLmV2ZW50cy5lbWl0KCdyb3V0ZUNoYW5nZUVycm9yJywgZXJyLCBhcywgcm91dGVQcm9wcylcblxuICAgICAgLy8gSWYgd2UgY2FuJ3QgbG9hZCB0aGUgcGFnZSBpdCBjb3VsZCBiZSBvbmUgb2YgZm9sbG93aW5nIHJlYXNvbnNcbiAgICAgIC8vICAxLiBQYWdlIGRvZXNuJ3QgZXhpc3RzXG4gICAgICAvLyAgMi4gUGFnZSBkb2VzIGV4aXN0IGluIGEgZGlmZmVyZW50IHpvbmVcbiAgICAgIC8vICAzLiBJbnRlcm5hbCBlcnJvciB3aGlsZSBsb2FkaW5nIHRoZSBwYWdlXG5cbiAgICAgIC8vIFNvLCBkb2luZyBhIGhhcmQgcmVsb2FkIGlzIHRoZSBwcm9wZXIgd2F5IHRvIGRlYWwgd2l0aCB0aGlzLlxuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhc1xuXG4gICAgICAvLyBDaGFuZ2luZyB0aGUgVVJMIGRvZXNuJ3QgYmxvY2sgZXhlY3V0aW5nIHRoZSBjdXJyZW50IGNvZGUgcGF0aC5cbiAgICAgIC8vIFNvIGxldCdzIHRocm93IGEgY2FuY2VsbGF0aW9uIGVycm9yIHN0b3AgdGhlIHJvdXRpbmcgbG9naWMuXG4gICAgICB0aHJvdyBidWlsZENhbmNlbGxhdGlvbkVycm9yKClcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IENvbXBvbmVudDogQ29tcG9uZW50VHlwZVxuICAgICAgbGV0IHN0eWxlU2hlZXRzOiBTdHlsZVNoZWV0VHVwbGVbXVxuICAgICAgbGV0IHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkXG5cbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIENvbXBvbmVudCEgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgIHR5cGVvZiBzdHlsZVNoZWV0cyEgPT09ICd1bmRlZmluZWQnXG4gICAgICApIHtcbiAgICAgICAgOyh7IHBhZ2U6IENvbXBvbmVudCwgc3R5bGVTaGVldHMgfSA9IGF3YWl0IHRoaXMuZmV0Y2hDb21wb25lbnQoXG4gICAgICAgICAgJy9fZXJyb3InXG4gICAgICAgICkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvdXRlSW5mbzogQ29tcGxldGVQcml2YXRlUm91dGVJbmZvID0ge1xuICAgICAgICBwcm9wcyxcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBzdHlsZVNoZWV0cyxcbiAgICAgICAgZXJyLFxuICAgICAgICBlcnJvcjogZXJyLFxuICAgICAgfVxuXG4gICAgICBpZiAoIXJvdXRlSW5mby5wcm9wcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJvdXRlSW5mby5wcm9wcyA9IGF3YWl0IHRoaXMuZ2V0SW5pdGlhbFByb3BzKENvbXBvbmVudCwge1xuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICB9IGFzIGFueSlcbiAgICAgICAgfSBjYXRjaCAoZ2lwRXJyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZXJyb3IgcGFnZSBgZ2V0SW5pdGlhbFByb3BzYDogJywgZ2lwRXJyKVxuICAgICAgICAgIHJvdXRlSW5mby5wcm9wcyA9IHt9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlSW5mb1xuICAgIH0gY2F0Y2ggKHJvdXRlSW5mb0Vycikge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlUm91dGVJbmZvRXJyb3IoXG4gICAgICAgIHJvdXRlSW5mb0VycixcbiAgICAgICAgcGF0aG5hbWUsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBhcyxcbiAgICAgICAgcm91dGVQcm9wcyxcbiAgICAgICAgdHJ1ZVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFJvdXRlSW5mbyhcbiAgICByb3V0ZTogc3RyaW5nLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgcXVlcnk6IGFueSxcbiAgICBhczogc3RyaW5nLFxuICAgIHJlc29sdmVkQXM6IHN0cmluZyxcbiAgICByb3V0ZVByb3BzOiBSb3V0ZVByb3BlcnRpZXNcbiAgKTogUHJvbWlzZTxQcml2YXRlUm91dGVJbmZvPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUm91dGVJbmZvOiBQcml2YXRlUm91dGVJbmZvIHwgdW5kZWZpbmVkID0gdGhpcy5jb21wb25lbnRzW1xuICAgICAgICByb3V0ZVxuICAgICAgXVxuICAgICAgaWYgKHJvdXRlUHJvcHMuc2hhbGxvdyAmJiBleGlzdGluZ1JvdXRlSW5mbyAmJiB0aGlzLnJvdXRlID09PSByb3V0ZSkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdSb3V0ZUluZm9cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FjaGVkUm91dGVJbmZvOiBDb21wbGV0ZVByaXZhdGVSb3V0ZUluZm8gfCB1bmRlZmluZWQgPVxuICAgICAgICBleGlzdGluZ1JvdXRlSW5mbyAmJiAnaW5pdGlhbCcgaW4gZXhpc3RpbmdSb3V0ZUluZm9cbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogZXhpc3RpbmdSb3V0ZUluZm9cbiAgICAgIGNvbnN0IHJvdXRlSW5mbzogQ29tcGxldGVQcml2YXRlUm91dGVJbmZvID0gY2FjaGVkUm91dGVJbmZvXG4gICAgICAgID8gY2FjaGVkUm91dGVJbmZvXG4gICAgICAgIDogYXdhaXQgdGhpcy5mZXRjaENvbXBvbmVudChyb3V0ZSkudGhlbigocmVzKSA9PiAoe1xuICAgICAgICAgICAgQ29tcG9uZW50OiByZXMucGFnZSxcbiAgICAgICAgICAgIHN0eWxlU2hlZXRzOiByZXMuc3R5bGVTaGVldHMsXG4gICAgICAgICAgICBfX05fU1NHOiByZXMubW9kLl9fTl9TU0csXG4gICAgICAgICAgICBfX05fU1NQOiByZXMubW9kLl9fTl9TU1AsXG4gICAgICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHsgQ29tcG9uZW50LCBfX05fU1NHLCBfX05fU1NQIH0gPSByb3V0ZUluZm9cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgY29uc3QgeyBpc1ZhbGlkRWxlbWVudFR5cGUgfSA9IHJlcXVpcmUoJ3JlYWN0LWlzJylcbiAgICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUaGUgZGVmYXVsdCBleHBvcnQgaXMgbm90IGEgUmVhY3QgQ29tcG9uZW50IGluIHBhZ2U6IFwiJHtwYXRobmFtZX1cImBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGRhdGFIcmVmOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICAgICAgaWYgKF9fTl9TU0cgfHwgX19OX1NTUCkge1xuICAgICAgICBkYXRhSHJlZiA9IHRoaXMucGFnZUxvYWRlci5nZXREYXRhSHJlZihcbiAgICAgICAgICBmb3JtYXRXaXRoVmFsaWRhdGlvbih7IHBhdGhuYW1lLCBxdWVyeSB9KSxcbiAgICAgICAgICByZXNvbHZlZEFzLFxuICAgICAgICAgIF9fTl9TU0csXG4gICAgICAgICAgdGhpcy5sb2NhbGVcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wcyA9IGF3YWl0IHRoaXMuX2dldERhdGE8Q29tcGxldGVQcml2YXRlUm91dGVJbmZvPigoKSA9PlxuICAgICAgICBfX05fU1NHXG4gICAgICAgICAgPyB0aGlzLl9nZXRTdGF0aWNEYXRhKGRhdGFIcmVmISlcbiAgICAgICAgICA6IF9fTl9TU1BcbiAgICAgICAgICA/IHRoaXMuX2dldFNlcnZlckRhdGEoZGF0YUhyZWYhKVxuICAgICAgICAgIDogdGhpcy5nZXRJbml0aWFsUHJvcHMoXG4gICAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgICAgLy8gd2UgcHJvdmlkZSBBcHBUcmVlIGxhdGVyIHNvIHRoaXMgbmVlZHMgdG8gYmUgYGFueWBcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhdGhuYW1lLFxuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIGFzUGF0aDogYXMsXG4gICAgICAgICAgICAgIH0gYXMgYW55XG4gICAgICAgICAgICApXG4gICAgICApXG5cbiAgICAgIHJvdXRlSW5mby5wcm9wcyA9IHByb3BzXG4gICAgICB0aGlzLmNvbXBvbmVudHNbcm91dGVdID0gcm91dGVJbmZvXG4gICAgICByZXR1cm4gcm91dGVJbmZvXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVSb3V0ZUluZm9FcnJvcihlcnIsIHBhdGhuYW1lLCBxdWVyeSwgYXMsIHJvdXRlUHJvcHMpXG4gICAgfVxuICB9XG5cbiAgc2V0KFxuICAgIHJvdXRlOiBzdHJpbmcsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBxdWVyeTogUGFyc2VkVXJsUXVlcnksXG4gICAgYXM6IHN0cmluZyxcbiAgICBkYXRhOiBQcml2YXRlUm91dGVJbmZvLFxuICAgIHJlc2V0U2Nyb2xsOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaXNGYWxsYmFjayA9IGZhbHNlXG5cbiAgICB0aGlzLnJvdXRlID0gcm91dGVcbiAgICB0aGlzLnBhdGhuYW1lID0gcGF0aG5hbWVcbiAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlcbiAgICB0aGlzLmFzUGF0aCA9IGFzXG4gICAgcmV0dXJuIHRoaXMubm90aWZ5KGRhdGEsIHJlc2V0U2Nyb2xsKVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGV4ZWN1dGUgYmVmb3JlIHJlcGxhY2luZyByb3V0ZXIgc3RhdGVcbiAgICogQHBhcmFtIGNiIGNhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkXG4gICAqL1xuICBiZWZvcmVQb3BTdGF0ZShjYjogQmVmb3JlUG9wU3RhdGVDYWxsYmFjaykge1xuICAgIHRoaXMuX2JwcyA9IGNiXG4gIH1cblxuICBvbmx5QUhhc2hDaGFuZ2UoYXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5hc1BhdGgpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IFtvbGRVcmxOb0hhc2gsIG9sZEhhc2hdID0gdGhpcy5hc1BhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IFtuZXdVcmxOb0hhc2gsIG5ld0hhc2hdID0gYXMuc3BsaXQoJyMnKVxuXG4gICAgLy8gTWFrZXMgc3VyZSB3ZSBzY3JvbGwgdG8gdGhlIHByb3ZpZGVkIGhhc2ggaWYgdGhlIHVybC9oYXNoIGFyZSB0aGUgc2FtZVxuICAgIGlmIChuZXdIYXNoICYmIG9sZFVybE5vSGFzaCA9PT0gbmV3VXJsTm9IYXNoICYmIG9sZEhhc2ggPT09IG5ld0hhc2gpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHVybHMgYXJlIGNoYW5nZSwgdGhlcmUncyBtb3JlIHRoYW4gYSBoYXNoIGNoYW5nZVxuICAgIGlmIChvbGRVcmxOb0hhc2ggIT09IG5ld1VybE5vSGFzaCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGhhc2ggaGFzIGNoYW5nZWQsIHRoZW4gaXQncyBhIGhhc2ggb25seSBjaGFuZ2UuXG4gICAgLy8gVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIGJvdGggdGhlIGVudGVyIGFuZFxuICAgIC8vIGxlYXZlIGhhc2ggPT09ICcnIGNhc2VzLiBUaGUgaWRlbnRpdHkgY2FzZSBmYWxscyB0aHJvdWdoXG4gICAgLy8gYW5kIGlzIHRyZWF0ZWQgYXMgYSBuZXh0IHJlbG9hZC5cbiAgICByZXR1cm4gb2xkSGFzaCAhPT0gbmV3SGFzaFxuICB9XG5cbiAgc2Nyb2xsVG9IYXNoKGFzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBoYXNoXSA9IGFzLnNwbGl0KCcjJylcbiAgICAvLyBTY3JvbGwgdG8gdG9wIGlmIHRoZSBoYXNoIGlzIGp1c3QgYCNgIHdpdGggbm8gdmFsdWUgb3IgYCN0b3BgXG4gICAgLy8gVG8gbWlycm9yIGJyb3dzZXJzXG4gICAgaWYgKGhhc2ggPT09ICcnIHx8IGhhc2ggPT09ICd0b3AnKSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEZpcnN0IHdlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGJ5IGlkIGlzIGZvdW5kXG4gICAgY29uc3QgaWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGhhc2gpXG4gICAgaWYgKGlkRWwpIHtcbiAgICAgIGlkRWwuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gZWxlbWVudCB3aXRoIHRoZSBpZCwgd2UgY2hlY2sgdGhlIGBuYW1lYCBwcm9wZXJ0eVxuICAgIC8vIFRvIG1pcnJvciBicm93c2Vyc1xuICAgIGNvbnN0IG5hbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKGhhc2gpWzBdXG4gICAgaWYgKG5hbWVFbCkge1xuICAgICAgbmFtZUVsLnNjcm9sbEludG9WaWV3KClcbiAgICB9XG4gIH1cblxuICB1cmxJc05ldyhhc1BhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFzUGF0aCAhPT0gYXNQYXRoXG4gIH1cblxuICAvKipcbiAgICogUHJlZmV0Y2ggcGFnZSBjb2RlLCB5b3UgbWF5IHdhaXQgZm9yIHRoZSBkYXRhIGR1cmluZyBwYWdlIHJlbmRlcmluZy5cbiAgICogVGhpcyBmZWF0dXJlIG9ubHkgd29ya3MgaW4gcHJvZHVjdGlvbiFcbiAgICogQHBhcmFtIHVybCB0aGUgaHJlZiBvZiBwcmVmZXRjaGVkIHBhZ2VcbiAgICogQHBhcmFtIGFzUGF0aCB0aGUgYXMgcGF0aCBvZiB0aGUgcHJlZmV0Y2hlZCBwYWdlXG4gICAqL1xuICBhc3luYyBwcmVmZXRjaChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhc1BhdGg6IHN0cmluZyA9IHVybCxcbiAgICBvcHRpb25zOiBQcmVmZXRjaE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgcGFyc2VkID0gcGFyc2VSZWxhdGl2ZVVybCh1cmwpXG5cbiAgICBsZXQgeyBwYXRobmFtZSB9ID0gcGFyc2VkXG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuX19ORVhUX0kxOE5fU1VQUE9SVCkge1xuICAgICAgaWYgKG9wdGlvbnMubG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICBwYXRobmFtZSA9IG5vcm1hbGl6ZUxvY2FsZVBhdGghKHBhdGhuYW1lLCB0aGlzLmxvY2FsZXMpLnBhdGhuYW1lXG4gICAgICAgIHBhcnNlZC5wYXRobmFtZSA9IHBhdGhuYW1lXG4gICAgICAgIHVybCA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKHBhcnNlZClcblxuICAgICAgICBsZXQgcGFyc2VkQXMgPSBwYXJzZVJlbGF0aXZlVXJsKGFzUGF0aClcbiAgICAgICAgY29uc3QgbG9jYWxlUGF0aFJlc3VsdCA9IG5vcm1hbGl6ZUxvY2FsZVBhdGghKFxuICAgICAgICAgIHBhcnNlZEFzLnBhdGhuYW1lLFxuICAgICAgICAgIHRoaXMubG9jYWxlc1xuICAgICAgICApXG4gICAgICAgIHBhcnNlZEFzLnBhdGhuYW1lID0gbG9jYWxlUGF0aFJlc3VsdC5wYXRobmFtZVxuICAgICAgICBvcHRpb25zLmxvY2FsZSA9IGxvY2FsZVBhdGhSZXN1bHQuZGV0ZWN0ZWRMb2NhbGUgfHwgdGhpcy5kZWZhdWx0TG9jYWxlXG4gICAgICAgIGFzUGF0aCA9IGZvcm1hdFdpdGhWYWxpZGF0aW9uKHBhcnNlZEFzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VzID0gYXdhaXQgdGhpcy5wYWdlTG9hZGVyLmdldFBhZ2VMaXN0KClcbiAgICBsZXQgcmVzb2x2ZWRBcyA9IGFzUGF0aFxuXG4gICAgaWYgKHByb2Nlc3MuZW52Ll9fTkVYVF9IQVNfUkVXUklURVMgJiYgYXNQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgbGV0IHJld3JpdGVzOiBhbnlcbiAgICAgIDsoeyBfX3Jld3JpdGVzOiByZXdyaXRlcyB9ID0gYXdhaXQgZ2V0Q2xpZW50QnVpbGRNYW5pZmVzdCgpKVxuXG4gICAgICBjb25zdCByZXdyaXRlc1Jlc3VsdCA9IHJlc29sdmVSZXdyaXRlcyhcbiAgICAgICAgYWRkQmFzZVBhdGgoYWRkTG9jYWxlKGFzUGF0aCwgdGhpcy5sb2NhbGUpKSxcbiAgICAgICAgcGFnZXMsXG4gICAgICAgIHJld3JpdGVzLFxuICAgICAgICBwYXJzZWQucXVlcnksXG4gICAgICAgIChwOiBzdHJpbmcpID0+IHJlc29sdmVEeW5hbWljUm91dGUocCwgcGFnZXMpLFxuICAgICAgICB0aGlzLmxvY2FsZXNcbiAgICAgIClcbiAgICAgIHJlc29sdmVkQXMgPSBkZWxMb2NhbGUoZGVsQmFzZVBhdGgocmV3cml0ZXNSZXN1bHQuYXNQYXRoKSwgdGhpcy5sb2NhbGUpXG5cbiAgICAgIGlmIChyZXdyaXRlc1Jlc3VsdC5tYXRjaGVkUGFnZSAmJiByZXdyaXRlc1Jlc3VsdC5yZXNvbHZlZEhyZWYpIHtcbiAgICAgICAgLy8gaWYgdGhpcyBkaXJlY3RseSBtYXRjaGVzIGEgcGFnZSB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgaHJlZiB0b1xuICAgICAgICAvLyBhbGxvdyB0aGUgY29ycmVjdCBwYWdlIGNodW5rIHRvIGJlIGxvYWRlZFxuICAgICAgICBwYXRobmFtZSA9IHJld3JpdGVzUmVzdWx0LnJlc29sdmVkSHJlZlxuICAgICAgICBwYXJzZWQucGF0aG5hbWUgPSBwYXRobmFtZVxuICAgICAgICB1cmwgPSBmb3JtYXRXaXRoVmFsaWRhdGlvbihwYXJzZWQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZC5wYXRobmFtZSA9IHJlc29sdmVEeW5hbWljUm91dGUocGFyc2VkLnBhdGhuYW1lLCBwYWdlcylcblxuICAgICAgaWYgKHBhcnNlZC5wYXRobmFtZSAhPT0gcGF0aG5hbWUpIHtcbiAgICAgICAgcGF0aG5hbWUgPSBwYXJzZWQucGF0aG5hbWVcbiAgICAgICAgdXJsID0gZm9ybWF0V2l0aFZhbGlkYXRpb24ocGFyc2VkKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByb3V0ZSA9IHJlbW92ZVBhdGhUcmFpbGluZ1NsYXNoKHBhdGhuYW1lKVxuXG4gICAgLy8gUHJlZmV0Y2ggaXMgbm90IHN1cHBvcnRlZCBpbiBkZXZlbG9wbWVudCBtb2RlIGJlY2F1c2UgaXQgd291bGQgdHJpZ2dlciBvbi1kZW1hbmQtZW50cmllc1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnBhZ2VMb2FkZXIuX2lzU3NnKHJvdXRlKS50aGVuKChpc1NzZzogYm9vbGVhbikgPT4ge1xuICAgICAgICByZXR1cm4gaXNTc2dcbiAgICAgICAgICA/IHRoaXMuX2dldFN0YXRpY0RhdGEoXG4gICAgICAgICAgICAgIHRoaXMucGFnZUxvYWRlci5nZXREYXRhSHJlZihcbiAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRBcyxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmxvY2FsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5sb2NhbGVcbiAgICAgICAgICAgICAgICAgIDogdGhpcy5sb2NhbGVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogZmFsc2VcbiAgICAgIH0pLFxuICAgICAgdGhpcy5wYWdlTG9hZGVyW29wdGlvbnMucHJpb3JpdHkgPyAnbG9hZFBhZ2UnIDogJ3ByZWZldGNoJ10ocm91dGUpLFxuICAgIF0pXG4gIH1cblxuICBhc3luYyBmZXRjaENvbXBvbmVudChyb3V0ZTogc3RyaW5nKTogUHJvbWlzZTxHb29kUGFnZUNhY2hlPiB7XG4gICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlXG4gICAgY29uc3QgY2FuY2VsID0gKHRoaXMuY2xjID0gKCkgPT4ge1xuICAgICAgY2FuY2VsbGVkID0gdHJ1ZVxuICAgIH0pXG5cbiAgICBjb25zdCBjb21wb25lbnRSZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2VMb2FkZXIubG9hZFBhZ2Uocm91dGUpXG5cbiAgICBpZiAoY2FuY2VsbGVkKSB7XG4gICAgICBjb25zdCBlcnJvcjogYW55ID0gbmV3IEVycm9yKFxuICAgICAgICBgQWJvcnQgZmV0Y2hpbmcgY29tcG9uZW50IGZvciByb3V0ZTogXCIke3JvdXRlfVwiYFxuICAgICAgKVxuICAgICAgZXJyb3IuY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBpZiAoY2FuY2VsID09PSB0aGlzLmNsYykge1xuICAgICAgdGhpcy5jbGMgPSBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudFJlc3VsdFxuICB9XG5cbiAgX2dldERhdGE8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2VcbiAgICBjb25zdCBjYW5jZWwgPSAoKSA9PiB7XG4gICAgICBjYW5jZWxsZWQgPSB0cnVlXG4gICAgfVxuICAgIHRoaXMuY2xjID0gY2FuY2VsXG4gICAgcmV0dXJuIGZuKCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgaWYgKGNhbmNlbCA9PT0gdGhpcy5jbGMpIHtcbiAgICAgICAgdGhpcy5jbGMgPSBudWxsXG4gICAgICB9XG5cbiAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IoJ0xvYWRpbmcgaW5pdGlhbCBwcm9wcyBjYW5jZWxsZWQnKVxuICAgICAgICBlcnIuY2FuY2VsbGVkID0gdHJ1ZVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9KVxuICB9XG5cbiAgX2dldFN0YXRpY0RhdGEoZGF0YUhyZWY6IHN0cmluZyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgeyBocmVmOiBjYWNoZUtleSB9ID0gbmV3IFVSTChkYXRhSHJlZiwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gICAgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyAmJlxuICAgICAgIXRoaXMuaXNQcmV2aWV3ICYmXG4gICAgICB0aGlzLnNkY1tjYWNoZUtleV1cbiAgICApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5zZGNbY2FjaGVLZXldKVxuICAgIH1cbiAgICByZXR1cm4gZmV0Y2hOZXh0RGF0YShkYXRhSHJlZiwgdGhpcy5pc1NzcikudGhlbigoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5zZGNbY2FjaGVLZXldID0gZGF0YVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9KVxuICB9XG5cbiAgX2dldFNlcnZlckRhdGEoZGF0YUhyZWY6IHN0cmluZyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgeyBocmVmOiByZXNvdXJjZUtleSB9ID0gbmV3IFVSTChkYXRhSHJlZiwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gICAgaWYgKHRoaXMuc2RyW3Jlc291cmNlS2V5XSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2RyW3Jlc291cmNlS2V5XVxuICAgIH1cbiAgICByZXR1cm4gKHRoaXMuc2RyW3Jlc291cmNlS2V5XSA9IGZldGNoTmV4dERhdGEoZGF0YUhyZWYsIHRoaXMuaXNTc3IpXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zZHJbcmVzb3VyY2VLZXldXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2RyW3Jlc291cmNlS2V5XVxuICAgICAgICB0aHJvdyBlcnJcbiAgICAgIH0pKVxuICB9XG5cbiAgZ2V0SW5pdGlhbFByb3BzKFxuICAgIENvbXBvbmVudDogQ29tcG9uZW50VHlwZSxcbiAgICBjdHg6IE5leHRQYWdlQ29udGV4dFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHsgQ29tcG9uZW50OiBBcHAgfSA9IHRoaXMuY29tcG9uZW50c1snL19hcHAnXVxuICAgIGNvbnN0IEFwcFRyZWUgPSB0aGlzLl93cmFwQXBwKEFwcCBhcyBBcHBDb21wb25lbnQpXG4gICAgY3R4LkFwcFRyZWUgPSBBcHBUcmVlXG4gICAgcmV0dXJuIGxvYWRHZXRJbml0aWFsUHJvcHM8QXBwQ29udGV4dFR5cGU8Um91dGVyPj4oQXBwLCB7XG4gICAgICBBcHBUcmVlLFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgcm91dGVyOiB0aGlzLFxuICAgICAgY3R4LFxuICAgIH0pXG4gIH1cblxuICBhYm9ydENvbXBvbmVudExvYWQoYXM6IHN0cmluZywgcm91dGVQcm9wczogUm91dGVQcm9wZXJ0aWVzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2xjKSB7XG4gICAgICBSb3V0ZXIuZXZlbnRzLmVtaXQoXG4gICAgICAgICdyb3V0ZUNoYW5nZUVycm9yJyxcbiAgICAgICAgYnVpbGRDYW5jZWxsYXRpb25FcnJvcigpLFxuICAgICAgICBhcyxcbiAgICAgICAgcm91dGVQcm9wc1xuICAgICAgKVxuICAgICAgdGhpcy5jbGMoKVxuICAgICAgdGhpcy5jbGMgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgbm90aWZ5KFxuICAgIGRhdGE6IFByaXZhdGVSb3V0ZUluZm8sXG4gICAgcmVzZXRTY3JvbGw6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc3ViKFxuICAgICAgZGF0YSxcbiAgICAgIHRoaXMuY29tcG9uZW50c1snL19hcHAnXS5Db21wb25lbnQgYXMgQXBwQ29tcG9uZW50LFxuICAgICAgcmVzZXRTY3JvbGxcbiAgICApXG4gIH1cbn1cbiIsIi8vIEZvcm1hdCBmdW5jdGlvbiBtb2RpZmllZCBmcm9tIG5vZGVqc1xuLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IFVybE9iamVjdCB9IGZyb20gJ3VybCdcbmltcG9ydCB7IFBhcnNlZFVybFF1ZXJ5IH0gZnJvbSAncXVlcnlzdHJpbmcnXG5pbXBvcnQgKiBhcyBxdWVyeXN0cmluZyBmcm9tICcuL3F1ZXJ5c3RyaW5nJ1xuXG5jb25zdCBzbGFzaGVkUHJvdG9jb2xzID0gL2h0dHBzP3xmdHB8Z29waGVyfGZpbGUvXG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVcmwodXJsT2JqOiBVcmxPYmplY3QpIHtcbiAgbGV0IHsgYXV0aCwgaG9zdG5hbWUgfSA9IHVybE9ialxuICBsZXQgcHJvdG9jb2wgPSB1cmxPYmoucHJvdG9jb2wgfHwgJydcbiAgbGV0IHBhdGhuYW1lID0gdXJsT2JqLnBhdGhuYW1lIHx8ICcnXG4gIGxldCBoYXNoID0gdXJsT2JqLmhhc2ggfHwgJydcbiAgbGV0IHF1ZXJ5ID0gdXJsT2JqLnF1ZXJ5IHx8ICcnXG4gIGxldCBob3N0OiBzdHJpbmcgfCBmYWxzZSA9IGZhbHNlXG5cbiAgYXV0aCA9IGF1dGggPyBlbmNvZGVVUklDb21wb25lbnQoYXV0aCkucmVwbGFjZSgvJTNBL2ksICc6JykgKyAnQCcgOiAnJ1xuXG4gIGlmICh1cmxPYmouaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgdXJsT2JqLmhvc3RcbiAgfSBlbHNlIGlmIChob3N0bmFtZSkge1xuICAgIGhvc3QgPSBhdXRoICsgKH5ob3N0bmFtZS5pbmRleE9mKCc6JykgPyBgWyR7aG9zdG5hbWV9XWAgOiBob3N0bmFtZSlcbiAgICBpZiAodXJsT2JqLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdXJsT2JqLnBvcnRcbiAgICB9XG4gIH1cblxuICBpZiAocXVlcnkgJiYgdHlwZW9mIHF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuICAgIHF1ZXJ5ID0gU3RyaW5nKHF1ZXJ5c3RyaW5nLnVybFF1ZXJ5VG9TZWFyY2hQYXJhbXMocXVlcnkgYXMgUGFyc2VkVXJsUXVlcnkpKVxuICB9XG5cbiAgbGV0IHNlYXJjaCA9IHVybE9iai5zZWFyY2ggfHwgKHF1ZXJ5ICYmIGA/JHtxdWVyeX1gKSB8fCAnJ1xuXG4gIGlmIChwcm90b2NvbCAmJiBwcm90b2NvbC5zdWJzdHIoLTEpICE9PSAnOicpIHByb3RvY29sICs9ICc6J1xuXG4gIGlmIChcbiAgICB1cmxPYmouc2xhc2hlcyB8fFxuICAgICgoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbHMudGVzdChwcm90b2NvbCkpICYmIGhvc3QgIT09IGZhbHNlKVxuICApIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKVxuICAgIGlmIChwYXRobmFtZSAmJiBwYXRobmFtZVswXSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lXG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJydcbiAgfVxuXG4gIGlmIChoYXNoICYmIGhhc2hbMF0gIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2hcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2hbMF0gIT09ICc/Jykgc2VhcmNoID0gJz8nICsgc2VhcmNoXG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGVuY29kZVVSSUNvbXBvbmVudClcbiAgc2VhcmNoID0gc2VhcmNoLnJlcGxhY2UoJyMnLCAnJTIzJylcblxuICByZXR1cm4gYCR7cHJvdG9jb2x9JHtob3N0fSR7cGF0aG5hbWV9JHtzZWFyY2h9JHtoYXNofWBcbn1cbiIsIi8vIFRyYW5zbGF0ZXMgYSBsb2dpY2FsIHJvdXRlIGludG8gaXRzIHBhZ2VzIGFzc2V0IHBhdGggKHJlbGF0aXZlIGZyb20gYSBjb21tb24gcHJlZml4KVxuLy8gXCJhc3NldCBwYXRoXCIgYmVpbmcgaXRzIGphdmFzY3JpcHQgZmlsZSwgZGF0YSBmaWxlLCBwcmVyZW5kZXJlZCBodG1sLC4uLlxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0QXNzZXRQYXRoRnJvbVJvdXRlKFxuICByb3V0ZTogc3RyaW5nLFxuICBleHQ6IHN0cmluZyA9ICcnXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID1cbiAgICByb3V0ZSA9PT0gJy8nXG4gICAgICA/ICcvaW5kZXgnXG4gICAgICA6IC9eXFwvaW5kZXgoXFwvfCQpLy50ZXN0KHJvdXRlKVxuICAgICAgPyBgL2luZGV4JHtyb3V0ZX1gXG4gICAgICA6IGAke3JvdXRlfWBcbiAgcmV0dXJuIHBhdGggKyBleHRcbn1cbiIsIi8vIElkZW50aWZ5IC9bcGFyYW1dLyBpbiByb3V0ZSBzdHJpbmdcbmNvbnN0IFRFU1RfUk9VVEUgPSAvXFwvXFxbW14vXSs/XFxdKD89XFwvfCQpL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEeW5hbWljUm91dGUocm91dGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gVEVTVF9ST1VURS50ZXN0KHJvdXRlKVxufVxuIiwiaW1wb3J0IHsgZ2V0TG9jYXRpb25PcmlnaW4gfSBmcm9tICcuLi8uLi91dGlscydcbmltcG9ydCB7IHNlYXJjaFBhcmFtc1RvVXJsUXVlcnkgfSBmcm9tICcuL3F1ZXJ5c3RyaW5nJ1xuXG4vKipcbiAqIFBhcnNlcyBwYXRoLXJlbGF0aXZlIHVybHMgKGUuZy4gYC9oZWxsby93b3JsZD9mb289YmFyYCkuIElmIHVybCBpc24ndCBwYXRoLXJlbGF0aXZlXG4gKiAoZS5nLiBgLi9oZWxsb2ApIHRoZW4gYXQgbGVhc3QgYmFzZSBtdXN0IGJlLlxuICogQWJzb2x1dGUgdXJscyBhcmUgcmVqZWN0ZWQgd2l0aCBvbmUgZXhjZXB0aW9uLCBpbiB0aGUgYnJvd3NlciwgYWJzb2x1dGUgdXJscyB0aGF0IGFyZSBvblxuICogdGhlIGN1cnJlbnQgb3JpZ2luIHdpbGwgYmUgcGFyc2VkIGFzIHJlbGF0aXZlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlbGF0aXZlVXJsKHVybDogc3RyaW5nLCBiYXNlPzogc3RyaW5nKSB7XG4gIGNvbnN0IGdsb2JhbEJhc2UgPSBuZXcgVVJMKFxuICAgIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gJ2h0dHA6Ly9uJyA6IGdldExvY2F0aW9uT3JpZ2luKClcbiAgKVxuICBjb25zdCByZXNvbHZlZEJhc2UgPSBiYXNlID8gbmV3IFVSTChiYXNlLCBnbG9iYWxCYXNlKSA6IGdsb2JhbEJhc2VcbiAgY29uc3QgeyBwYXRobmFtZSwgc2VhcmNoUGFyYW1zLCBzZWFyY2gsIGhhc2gsIGhyZWYsIG9yaWdpbiB9ID0gbmV3IFVSTChcbiAgICB1cmwsXG4gICAgcmVzb2x2ZWRCYXNlXG4gIClcbiAgaWYgKG9yaWdpbiAhPT0gZ2xvYmFsQmFzZS5vcmlnaW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFyaWFudDogaW52YWxpZCByZWxhdGl2ZSBVUkwsIHJvdXRlciByZWNlaXZlZCAke3VybH1gKVxuICB9XG4gIHJldHVybiB7XG4gICAgcGF0aG5hbWUsXG4gICAgcXVlcnk6IHNlYXJjaFBhcmFtc1RvVXJsUXVlcnkoc2VhcmNoUGFyYW1zKSxcbiAgICBzZWFyY2gsXG4gICAgaGFzaCxcbiAgICBocmVmOiBocmVmLnNsaWNlKGdsb2JhbEJhc2Uub3JpZ2luLmxlbmd0aCksXG4gIH1cbn1cbiIsImltcG9ydCB7IFBhcnNlZFVybFF1ZXJ5IH0gZnJvbSAncXVlcnlzdHJpbmcnXG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hQYXJhbXNUb1VybFF1ZXJ5KFxuICBzZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtc1xuKTogUGFyc2VkVXJsUXVlcnkge1xuICBjb25zdCBxdWVyeTogUGFyc2VkVXJsUXVlcnkgPSB7fVxuICBzZWFyY2hQYXJhbXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGlmICh0eXBlb2YgcXVlcnlba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHF1ZXJ5W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShxdWVyeVtrZXldKSkge1xuICAgICAgOyhxdWVyeVtrZXldIGFzIHN0cmluZ1tdKS5wdXNoKHZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeVtrZXldID0gW3F1ZXJ5W2tleV0gYXMgc3RyaW5nLCB2YWx1ZV1cbiAgICB9XG4gIH0pXG4gIHJldHVybiBxdWVyeVxufVxuXG5mdW5jdGlvbiBzdHJpbmdpZnlVcmxRdWVyeVBhcmFtKHBhcmFtOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoXG4gICAgdHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJyB8fFxuICAgICh0eXBlb2YgcGFyYW0gPT09ICdudW1iZXInICYmICFpc05hTihwYXJhbSkpIHx8XG4gICAgdHlwZW9mIHBhcmFtID09PSAnYm9vbGVhbidcbiAgKSB7XG4gICAgcmV0dXJuIFN0cmluZyhwYXJhbSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJydcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXJsUXVlcnlUb1NlYXJjaFBhcmFtcyhcbiAgdXJsUXVlcnk6IFBhcnNlZFVybFF1ZXJ5XG4pOiBVUkxTZWFyY2hQYXJhbXMge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgT2JqZWN0LmVudHJpZXModXJsUXVlcnkpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSkgPT4gcmVzdWx0LmFwcGVuZChrZXksIHN0cmluZ2lmeVVybFF1ZXJ5UGFyYW0oaXRlbSkpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuc2V0KGtleSwgc3RyaW5naWZ5VXJsUXVlcnlQYXJhbSh2YWx1ZSkpXG4gICAgfVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24oXG4gIHRhcmdldDogVVJMU2VhcmNoUGFyYW1zLFxuICAuLi5zZWFyY2hQYXJhbXNMaXN0OiBVUkxTZWFyY2hQYXJhbXNbXVxuKTogVVJMU2VhcmNoUGFyYW1zIHtcbiAgc2VhcmNoUGFyYW1zTGlzdC5mb3JFYWNoKChzZWFyY2hQYXJhbXMpID0+IHtcbiAgICBBcnJheS5mcm9tKHNlYXJjaFBhcmFtcy5rZXlzKCkpLmZvckVhY2goKGtleSkgPT4gdGFyZ2V0LmRlbGV0ZShrZXkpKVxuICAgIHNlYXJjaFBhcmFtcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB0YXJnZXQuYXBwZW5kKGtleSwgdmFsdWUpKVxuICB9KVxuICByZXR1cm4gdGFyZ2V0XG59XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZXNvbHZlUmV3cml0ZXMoKSB7fVxuIiwiaW1wb3J0IHsgZ2V0Um91dGVSZWdleCB9IGZyb20gJy4vcm91dGUtcmVnZXgnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZU1hdGNoZXIocm91dGVSZWdleDogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0Um91dGVSZWdleD4pIHtcbiAgY29uc3QgeyByZSwgZ3JvdXBzIH0gPSByb3V0ZVJlZ2V4XG4gIHJldHVybiAocGF0aG5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCByb3V0ZU1hdGNoID0gcmUuZXhlYyhwYXRobmFtZSEpXG4gICAgaWYgKCFyb3V0ZU1hdGNoKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvZGUgPSAocGFyYW06IHN0cmluZykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChwYXJhbSlcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgY29uc3QgZXJyOiBFcnJvciAmIHsgY29kZT86IHN0cmluZyB9ID0gbmV3IEVycm9yKFxuICAgICAgICAgICdmYWlsZWQgdG8gZGVjb2RlIHBhcmFtJ1xuICAgICAgICApXG4gICAgICAgIGVyci5jb2RlID0gJ0RFQ09ERV9GQUlMRUQnXG4gICAgICAgIHRocm93IGVyclxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwYXJhbXM6IHsgW3BhcmFtTmFtZTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW10gfSA9IHt9XG5cbiAgICBPYmplY3Qua2V5cyhncm91cHMpLmZvckVhY2goKHNsdWdOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGcgPSBncm91cHNbc2x1Z05hbWVdXG4gICAgICBjb25zdCBtID0gcm91dGVNYXRjaFtnLnBvc11cbiAgICAgIGlmIChtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFyYW1zW3NsdWdOYW1lXSA9IH5tLmluZGV4T2YoJy8nKVxuICAgICAgICAgID8gbS5zcGxpdCgnLycpLm1hcCgoZW50cnkpID0+IGRlY29kZShlbnRyeSkpXG4gICAgICAgICAgOiBnLnJlcGVhdFxuICAgICAgICAgID8gW2RlY29kZShtKV1cbiAgICAgICAgICA6IGRlY29kZShtKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIHBhcmFtc1xuICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIEdyb3VwIHtcbiAgcG9zOiBudW1iZXJcbiAgcmVwZWF0OiBib29sZWFuXG4gIG9wdGlvbmFsOiBib29sZWFuXG59XG5cbi8vIHRoaXMgaXNuJ3QgaW1wb3J0aW5nIHRoZSBlc2NhcGUtc3RyaW5nLXJlZ2V4IG1vZHVsZVxuLy8gdG8gcmVkdWNlIGJ5dGVzXG5mdW5jdGlvbiBlc2NhcGVSZWdleChzdHI6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL1t8XFxcXHt9KClbXFxdXiQrKj8uLV0vZywgJ1xcXFwkJicpXG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVyKHBhcmFtOiBzdHJpbmcpIHtcbiAgY29uc3Qgb3B0aW9uYWwgPSBwYXJhbS5zdGFydHNXaXRoKCdbJykgJiYgcGFyYW0uZW5kc1dpdGgoJ10nKVxuICBpZiAob3B0aW9uYWwpIHtcbiAgICBwYXJhbSA9IHBhcmFtLnNsaWNlKDEsIC0xKVxuICB9XG4gIGNvbnN0IHJlcGVhdCA9IHBhcmFtLnN0YXJ0c1dpdGgoJy4uLicpXG4gIGlmIChyZXBlYXQpIHtcbiAgICBwYXJhbSA9IHBhcmFtLnNsaWNlKDMpXG4gIH1cbiAgcmV0dXJuIHsga2V5OiBwYXJhbSwgcmVwZWF0LCBvcHRpb25hbCB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSb3V0ZVJlZ2V4KFxuICBub3JtYWxpemVkUm91dGU6IHN0cmluZ1xuKToge1xuICByZTogUmVnRXhwXG4gIG5hbWVkUmVnZXg/OiBzdHJpbmdcbiAgcm91dGVLZXlzPzogeyBbbmFtZWQ6IHN0cmluZ106IHN0cmluZyB9XG4gIGdyb3VwczogeyBbZ3JvdXBOYW1lOiBzdHJpbmddOiBHcm91cCB9XG59IHtcbiAgY29uc3Qgc2VnbWVudHMgPSAobm9ybWFsaXplZFJvdXRlLnJlcGxhY2UoL1xcLyQvLCAnJykgfHwgJy8nKVxuICAgIC5zbGljZSgxKVxuICAgIC5zcGxpdCgnLycpXG5cbiAgY29uc3QgZ3JvdXBzOiB7IFtncm91cE5hbWU6IHN0cmluZ106IEdyb3VwIH0gPSB7fVxuICBsZXQgZ3JvdXBJbmRleCA9IDFcbiAgY29uc3QgcGFyYW1ldGVyaXplZFJvdXRlID0gc2VnbWVudHNcbiAgICAubWFwKChzZWdtZW50KSA9PiB7XG4gICAgICBpZiAoc2VnbWVudC5zdGFydHNXaXRoKCdbJykgJiYgc2VnbWVudC5lbmRzV2l0aCgnXScpKSB7XG4gICAgICAgIGNvbnN0IHsga2V5LCBvcHRpb25hbCwgcmVwZWF0IH0gPSBwYXJzZVBhcmFtZXRlcihzZWdtZW50LnNsaWNlKDEsIC0xKSlcbiAgICAgICAgZ3JvdXBzW2tleV0gPSB7IHBvczogZ3JvdXBJbmRleCsrLCByZXBlYXQsIG9wdGlvbmFsIH1cbiAgICAgICAgcmV0dXJuIHJlcGVhdCA/IChvcHRpb25hbCA/ICcoPzovKC4rPykpPycgOiAnLyguKz8pJykgOiAnLyhbXi9dKz8pJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAvJHtlc2NhcGVSZWdleChzZWdtZW50KX1gXG4gICAgICB9XG4gICAgfSlcbiAgICAuam9pbignJylcblxuICAvLyBkZWFkIGNvZGUgZWxpbWluYXRlIGZvciBicm93c2VyIHNpbmNlIGl0J3Mgb25seSBuZWVkZWRcbiAgLy8gd2hpbGUgZ2VuZXJhdGluZyByb3V0ZXMtbWFuaWZlc3RcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgbGV0IHJvdXRlS2V5Q2hhckNvZGUgPSA5N1xuICAgIGxldCByb3V0ZUtleUNoYXJMZW5ndGggPSAxXG5cbiAgICAvLyBidWlsZHMgYSBtaW5pbWFsIHJvdXRlS2V5IHVzaW5nIG9ubHkgYS16IGFuZCBtaW5pbWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzXG4gICAgY29uc3QgZ2V0U2FmZVJvdXRlS2V5ID0gKCkgPT4ge1xuICAgICAgbGV0IHJvdXRlS2V5ID0gJydcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZUtleUNoYXJMZW5ndGg7IGkrKykge1xuICAgICAgICByb3V0ZUtleSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHJvdXRlS2V5Q2hhckNvZGUpXG4gICAgICAgIHJvdXRlS2V5Q2hhckNvZGUrK1xuXG4gICAgICAgIGlmIChyb3V0ZUtleUNoYXJDb2RlID4gMTIyKSB7XG4gICAgICAgICAgcm91dGVLZXlDaGFyTGVuZ3RoKytcbiAgICAgICAgICByb3V0ZUtleUNoYXJDb2RlID0gOTdcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJvdXRlS2V5XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGVLZXlzOiB7IFtuYW1lZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fVxuXG4gICAgbGV0IG5hbWVkUGFyYW1ldGVyaXplZFJvdXRlID0gc2VnbWVudHNcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aCgnWycpICYmIHNlZ21lbnQuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgIGNvbnN0IHsga2V5LCBvcHRpb25hbCwgcmVwZWF0IH0gPSBwYXJzZVBhcmFtZXRlcihzZWdtZW50LnNsaWNlKDEsIC0xKSlcbiAgICAgICAgICAvLyByZXBsYWNlIGFueSBub24td29yZCBjaGFyYWN0ZXJzIHNpbmNlIHRoZXkgY2FuIGJyZWFrXG4gICAgICAgICAgLy8gdGhlIG5hbWVkIHJlZ2V4XG4gICAgICAgICAgbGV0IGNsZWFuZWRLZXkgPSBrZXkucmVwbGFjZSgvXFxXL2csICcnKVxuICAgICAgICAgIGxldCBpbnZhbGlkS2V5ID0gZmFsc2VcblxuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBrZXkgaXMgc3RpbGwgaW52YWxpZCBhbmQgZmFsbGJhY2sgdG8gdXNpbmcgYSBrbm93blxuICAgICAgICAgIC8vIHNhZmUga2V5XG4gICAgICAgICAgaWYgKGNsZWFuZWRLZXkubGVuZ3RoID09PSAwIHx8IGNsZWFuZWRLZXkubGVuZ3RoID4gMzApIHtcbiAgICAgICAgICAgIGludmFsaWRLZXkgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNOYU4ocGFyc2VJbnQoY2xlYW5lZEtleS5zdWJzdHIoMCwgMSkpKSkge1xuICAgICAgICAgICAgaW52YWxpZEtleSA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoaW52YWxpZEtleSkge1xuICAgICAgICAgICAgY2xlYW5lZEtleSA9IGdldFNhZmVSb3V0ZUtleSgpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcm91dGVLZXlzW2NsZWFuZWRLZXldID0ga2V5XG4gICAgICAgICAgcmV0dXJuIHJlcGVhdFxuICAgICAgICAgICAgPyBvcHRpb25hbFxuICAgICAgICAgICAgICA/IGAoPzovKD88JHtjbGVhbmVkS2V5fT4uKz8pKT9gXG4gICAgICAgICAgICAgIDogYC8oPzwke2NsZWFuZWRLZXl9Pi4rPylgXG4gICAgICAgICAgICA6IGAvKD88JHtjbGVhbmVkS2V5fT5bXi9dKz8pYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgLyR7ZXNjYXBlUmVnZXgoc2VnbWVudCl9YFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpXG5cbiAgICByZXR1cm4ge1xuICAgICAgcmU6IG5ldyBSZWdFeHAoYF4ke3BhcmFtZXRlcml6ZWRSb3V0ZX0oPzovKT8kYCksXG4gICAgICBncm91cHMsXG4gICAgICByb3V0ZUtleXMsXG4gICAgICBuYW1lZFJlZ2V4OiBgXiR7bmFtZWRQYXJhbWV0ZXJpemVkUm91dGV9KD86Lyk/JGAsXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZTogbmV3IFJlZ0V4cChgXiR7cGFyYW1ldGVyaXplZFJvdXRlfSg/Oi8pPyRgKSxcbiAgICBncm91cHMsXG4gIH1cbn1cbiIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCdcblxuY29uc3QgaXNTZXJ2ZXIgPSB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJ1xuXG50eXBlIFN0YXRlID0gSlNYLkVsZW1lbnRbXSB8IHVuZGVmaW5lZFxuXG50eXBlIFNpZGVFZmZlY3RQcm9wcyA9IHtcbiAgcmVkdWNlQ29tcG9uZW50c1RvU3RhdGU6IDxUPihcbiAgICBjb21wb25lbnRzOiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55Pj4sXG4gICAgcHJvcHM6IFRcbiAgKSA9PiBTdGF0ZVxuICBoYW5kbGVTdGF0ZUNoYW5nZT86IChzdGF0ZTogU3RhdGUpID0+IHZvaWRcbiAgaGVhZE1hbmFnZXI6IGFueVxuICBpbkFtcE1vZGU/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQ29tcG9uZW50PFNpZGVFZmZlY3RQcm9wcz4ge1xuICBwcml2YXRlIF9oYXNIZWFkTWFuYWdlcjogYm9vbGVhblxuXG4gIGVtaXRDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKHRoaXMuX2hhc0hlYWRNYW5hZ2VyKSB7XG4gICAgICB0aGlzLnByb3BzLmhlYWRNYW5hZ2VyLnVwZGF0ZUhlYWQoXG4gICAgICAgIHRoaXMucHJvcHMucmVkdWNlQ29tcG9uZW50c1RvU3RhdGUoXG4gICAgICAgICAgWy4uLnRoaXMucHJvcHMuaGVhZE1hbmFnZXIubW91bnRlZEluc3RhbmNlc10sXG4gICAgICAgICAgdGhpcy5wcm9wc1xuICAgICAgICApXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IGFueSkge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMuX2hhc0hlYWRNYW5hZ2VyID1cbiAgICAgIHRoaXMucHJvcHMuaGVhZE1hbmFnZXIgJiYgdGhpcy5wcm9wcy5oZWFkTWFuYWdlci5tb3VudGVkSW5zdGFuY2VzXG5cbiAgICBpZiAoaXNTZXJ2ZXIgJiYgdGhpcy5faGFzSGVhZE1hbmFnZXIpIHtcbiAgICAgIHRoaXMucHJvcHMuaGVhZE1hbmFnZXIubW91bnRlZEluc3RhbmNlcy5hZGQodGhpcylcbiAgICAgIHRoaXMuZW1pdENoYW5nZSgpXG4gICAgfVxuICB9XG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGlmICh0aGlzLl9oYXNIZWFkTWFuYWdlcikge1xuICAgICAgdGhpcy5wcm9wcy5oZWFkTWFuYWdlci5tb3VudGVkSW5zdGFuY2VzLmFkZCh0aGlzKVxuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKVxuICB9XG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKVxuICB9XG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzLl9oYXNIZWFkTWFuYWdlcikge1xuICAgICAgdGhpcy5wcm9wcy5oZWFkTWFuYWdlci5tb3VudGVkSW5zdGFuY2VzLmRlbGV0ZSh0aGlzKVxuICAgIH1cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsImltcG9ydCB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tICdodHRwJ1xuaW1wb3J0IHsgUGFyc2VkVXJsUXVlcnkgfSBmcm9tICdxdWVyeXN0cmluZydcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFVybE9iamVjdCB9IGZyb20gJ3VybCdcbmltcG9ydCB7IGZvcm1hdFVybCB9IGZyb20gJy4vcm91dGVyL3V0aWxzL2Zvcm1hdC11cmwnXG5pbXBvcnQgeyBNYW5pZmVzdEl0ZW0gfSBmcm9tICcuLi9zZXJ2ZXIvbG9hZC1jb21wb25lbnRzJ1xuaW1wb3J0IHsgTmV4dFJvdXRlciB9IGZyb20gJy4vcm91dGVyL3JvdXRlcidcbmltcG9ydCB7IEVudiB9IGZyb20gJ0BuZXh0L2VudidcbmltcG9ydCB7IEJ1aWxkTWFuaWZlc3QgfSBmcm9tICcuLi9zZXJ2ZXIvZ2V0LXBhZ2UtZmlsZXMnXG5pbXBvcnQgeyBEb21haW5Mb2NhbGVzIH0gZnJvbSAnLi4vc2VydmVyL2NvbmZpZydcblxuLyoqXG4gKiBUeXBlcyB1c2VkIGJ5IGJvdGggbmV4dCBhbmQgbmV4dC1zZXJ2ZXJcbiAqL1xuXG5leHBvcnQgdHlwZSBOZXh0Q29tcG9uZW50VHlwZTxcbiAgQyBleHRlbmRzIEJhc2VDb250ZXh0ID0gTmV4dFBhZ2VDb250ZXh0LFxuICBJUCA9IHt9LFxuICBQID0ge31cbj4gPSBDb21wb25lbnRUeXBlPFA+ICYge1xuICAvKipcbiAgICogVXNlZCBmb3IgaW5pdGlhbCBwYWdlIGxvYWQgZGF0YSBwb3B1bGF0aW9uLiBEYXRhIHJldHVybmVkIGZyb20gYGdldEluaXRpYWxQcm9wc2AgaXMgc2VyaWFsaXplZCB3aGVuIHNlcnZlciByZW5kZXJlZC5cbiAgICogTWFrZSBzdXJlIHRvIHJldHVybiBwbGFpbiBgT2JqZWN0YCB3aXRob3V0IHVzaW5nIGBEYXRlYCwgYE1hcGAsIGBTZXRgLlxuICAgKiBAcGFyYW0gY3R4IENvbnRleHQgb2YgYHBhZ2VgXG4gICAqL1xuICBnZXRJbml0aWFsUHJvcHM/KGNvbnRleHQ6IEMpOiBJUCB8IFByb21pc2U8SVA+XG59XG5cbmV4cG9ydCB0eXBlIERvY3VtZW50VHlwZSA9IE5leHRDb21wb25lbnRUeXBlPFxuICBEb2N1bWVudENvbnRleHQsXG4gIERvY3VtZW50SW5pdGlhbFByb3BzLFxuICBEb2N1bWVudFByb3BzXG4+ICYge1xuICByZW5kZXJEb2N1bWVudChcbiAgICBEb2N1bWVudDogRG9jdW1lbnRUeXBlLFxuICAgIHByb3BzOiBEb2N1bWVudFByb3BzXG4gICk6IFJlYWN0LlJlYWN0RWxlbWVudFxufVxuXG5leHBvcnQgdHlwZSBBcHBUeXBlID0gTmV4dENvbXBvbmVudFR5cGU8XG4gIEFwcENvbnRleHRUeXBlLFxuICBBcHBJbml0aWFsUHJvcHMsXG4gIEFwcFByb3BzVHlwZVxuPlxuXG5leHBvcnQgdHlwZSBBcHBUcmVlVHlwZSA9IENvbXBvbmVudFR5cGU8XG4gIEFwcEluaXRpYWxQcm9wcyAmIHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4+XG5cbi8qKlxuICogV2ViIHZpdGFscyBwcm92aWRlZCB0byBfYXBwLnJlcG9ydFdlYlZpdGFscyBieSBDb3JlIFdlYiBWaXRhbHMgcGx1Z2luIGRldmVsb3BlZCBieSBHb29nbGUgQ2hyb21lIHRlYW0uXG4gKiBodHRwczovL25leHRqcy5vcmcvYmxvZy9uZXh0LTktNCNpbnRlZ3JhdGVkLXdlYi12aXRhbHMtcmVwb3J0aW5nXG4gKi9cbmV4cG9ydCB0eXBlIE5leHRXZWJWaXRhbHNNZXRyaWMgPSB7XG4gIGlkOiBzdHJpbmdcbiAgbGFiZWw6IHN0cmluZ1xuICBuYW1lOiBzdHJpbmdcbiAgc3RhcnRUaW1lOiBudW1iZXJcbiAgdmFsdWU6IG51bWJlclxufVxuXG5leHBvcnQgdHlwZSBFbmhhbmNlcjxDPiA9IChDb21wb25lbnQ6IEMpID0+IENcblxuZXhwb3J0IHR5cGUgQ29tcG9uZW50c0VuaGFuY2VyID1cbiAgfCB7XG4gICAgICBlbmhhbmNlQXBwPzogRW5oYW5jZXI8QXBwVHlwZT5cbiAgICAgIGVuaGFuY2VDb21wb25lbnQ/OiBFbmhhbmNlcjxOZXh0Q29tcG9uZW50VHlwZT5cbiAgICB9XG4gIHwgRW5oYW5jZXI8TmV4dENvbXBvbmVudFR5cGU+XG5cbmV4cG9ydCB0eXBlIFJlbmRlclBhZ2VSZXN1bHQgPSB7XG4gIGh0bWw6IHN0cmluZ1xuICBoZWFkPzogQXJyYXk8SlNYLkVsZW1lbnQgfCBudWxsPlxufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJQYWdlID0gKFxuICBvcHRpb25zPzogQ29tcG9uZW50c0VuaGFuY2VyXG4pID0+IFJlbmRlclBhZ2VSZXN1bHQgfCBQcm9taXNlPFJlbmRlclBhZ2VSZXN1bHQ+XG5cbmV4cG9ydCB0eXBlIEJhc2VDb250ZXh0ID0ge1xuICByZXM/OiBTZXJ2ZXJSZXNwb25zZVxuICBbazogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCB0eXBlIE5FWFRfREFUQSA9IHtcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgcGFnZTogc3RyaW5nXG4gIHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeVxuICBidWlsZElkOiBzdHJpbmdcbiAgYXNzZXRQcmVmaXg/OiBzdHJpbmdcbiAgcnVudGltZUNvbmZpZz86IHsgW2tleTogc3RyaW5nXTogYW55IH1cbiAgbmV4dEV4cG9ydD86IGJvb2xlYW5cbiAgYXV0b0V4cG9ydD86IGJvb2xlYW5cbiAgaXNGYWxsYmFjaz86IGJvb2xlYW5cbiAgZHluYW1pY0lkcz86IHN0cmluZ1tdXG4gIGVycj86IEVycm9yICYgeyBzdGF0dXNDb2RlPzogbnVtYmVyIH1cbiAgZ3NwPzogYm9vbGVhblxuICBnc3NwPzogYm9vbGVhblxuICBjdXN0b21TZXJ2ZXI/OiBib29sZWFuXG4gIGdpcD86IGJvb2xlYW5cbiAgYXBwR2lwPzogYm9vbGVhblxuICBsb2NhbGU/OiBzdHJpbmdcbiAgbG9jYWxlcz86IHN0cmluZ1tdXG4gIGRlZmF1bHRMb2NhbGU/OiBzdHJpbmdcbiAgZG9tYWluTG9jYWxlcz86IERvbWFpbkxvY2FsZXNcbiAgc2NyaXB0TG9hZGVyPzogYW55W11cbiAgaXNQcmV2aWV3PzogYm9vbGVhblxufVxuXG4vKipcbiAqIGBOZXh0YCBjb250ZXh0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dFBhZ2VDb250ZXh0IHtcbiAgLyoqXG4gICAqIEVycm9yIG9iamVjdCBpZiBlbmNvdW50ZXJlZCBkdXJpbmcgcmVuZGVyaW5nXG4gICAqL1xuICBlcnI/OiAoRXJyb3IgJiB7IHN0YXR1c0NvZGU/OiBudW1iZXIgfSkgfCBudWxsXG4gIC8qKlxuICAgKiBgSFRUUGAgcmVxdWVzdCBvYmplY3QuXG4gICAqL1xuICByZXE/OiBJbmNvbWluZ01lc3NhZ2VcbiAgLyoqXG4gICAqIGBIVFRQYCByZXNwb25zZSBvYmplY3QuXG4gICAqL1xuICByZXM/OiBTZXJ2ZXJSZXNwb25zZVxuICAvKipcbiAgICogUGF0aCBzZWN0aW9uIG9mIGBVUkxgLlxuICAgKi9cbiAgcGF0aG5hbWU6IHN0cmluZ1xuICAvKipcbiAgICogUXVlcnkgc3RyaW5nIHNlY3Rpb24gb2YgYFVSTGAgcGFyc2VkIGFzIGFuIG9iamVjdC5cbiAgICovXG4gIHF1ZXJ5OiBQYXJzZWRVcmxRdWVyeVxuICAvKipcbiAgICogYFN0cmluZ2Agb2YgdGhlIGFjdHVhbCBwYXRoIGluY2x1ZGluZyBxdWVyeS5cbiAgICovXG4gIGFzUGF0aD86IHN0cmluZ1xuICAvKipcbiAgICogYENvbXBvbmVudGAgdGhlIHRyZWUgb2YgdGhlIEFwcCB0byB1c2UgaWYgbmVlZGluZyB0byByZW5kZXIgc2VwYXJhdGVseVxuICAgKi9cbiAgQXBwVHJlZTogQXBwVHJlZVR5cGVcbn1cblxuZXhwb3J0IHR5cGUgQXBwQ29udGV4dFR5cGU8UiBleHRlbmRzIE5leHRSb3V0ZXIgPSBOZXh0Um91dGVyPiA9IHtcbiAgQ29tcG9uZW50OiBOZXh0Q29tcG9uZW50VHlwZTxOZXh0UGFnZUNvbnRleHQ+XG4gIEFwcFRyZWU6IEFwcFRyZWVUeXBlXG4gIGN0eDogTmV4dFBhZ2VDb250ZXh0XG4gIHJvdXRlcjogUlxufVxuXG5leHBvcnQgdHlwZSBBcHBJbml0aWFsUHJvcHMgPSB7XG4gIHBhZ2VQcm9wczogYW55XG59XG5cbmV4cG9ydCB0eXBlIEFwcFByb3BzVHlwZTxcbiAgUiBleHRlbmRzIE5leHRSb3V0ZXIgPSBOZXh0Um91dGVyLFxuICBQID0ge31cbj4gPSBBcHBJbml0aWFsUHJvcHMgJiB7XG4gIENvbXBvbmVudDogTmV4dENvbXBvbmVudFR5cGU8TmV4dFBhZ2VDb250ZXh0LCBhbnksIFA+XG4gIHJvdXRlcjogUlxuICBfX05fU1NHPzogYm9vbGVhblxuICBfX05fU1NQPzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBEb2N1bWVudENvbnRleHQgPSBOZXh0UGFnZUNvbnRleHQgJiB7XG4gIHJlbmRlclBhZ2U6IFJlbmRlclBhZ2Vcbn1cblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRJbml0aWFsUHJvcHMgPSBSZW5kZXJQYWdlUmVzdWx0ICYge1xuICBzdHlsZXM/OiBSZWFjdC5SZWFjdEVsZW1lbnRbXSB8IFJlYWN0LlJlYWN0RnJhZ21lbnRcbn1cblxuZXhwb3J0IHR5cGUgRG9jdW1lbnRQcm9wcyA9IERvY3VtZW50SW5pdGlhbFByb3BzICYge1xuICBfX05FWFRfREFUQV9fOiBORVhUX0RBVEFcbiAgZGFuZ2Vyb3VzQXNQYXRoOiBzdHJpbmdcbiAgZG9jQ29tcG9uZW50c1JlbmRlcmVkOiB7XG4gICAgSHRtbD86IGJvb2xlYW5cbiAgICBNYWluPzogYm9vbGVhblxuICAgIEhlYWQ/OiBib29sZWFuXG4gICAgTmV4dFNjcmlwdD86IGJvb2xlYW5cbiAgfVxuICBidWlsZE1hbmlmZXN0OiBCdWlsZE1hbmlmZXN0XG4gIGFtcFBhdGg6IHN0cmluZ1xuICBpbkFtcE1vZGU6IGJvb2xlYW5cbiAgaHlicmlkQW1wOiBib29sZWFuXG4gIGlzRGV2ZWxvcG1lbnQ6IGJvb2xlYW5cbiAgZHluYW1pY0ltcG9ydHM6IE1hbmlmZXN0SXRlbVtdXG4gIGFzc2V0UHJlZml4Pzogc3RyaW5nXG4gIGNhbm9uaWNhbEJhc2U6IHN0cmluZ1xuICBoZWFkVGFnczogYW55W11cbiAgdW5zdGFibGVfcnVudGltZUpTPzogZmFsc2VcbiAgdW5zdGFibGVfSnNQcmVsb2FkPzogZmFsc2VcbiAgZGV2T25seUNhY2hlQnVzdGVyUXVlcnlTdHJpbmc6IHN0cmluZ1xuICBzY3JpcHRMb2FkZXI6IHsgZGVmZXI/OiBzdHJpbmdbXTsgZWFnZXI/OiBhbnlbXSB9XG4gIGxvY2FsZT86IHN0cmluZ1xufVxuXG4vKipcbiAqIE5leHQgYEFQSWAgcm91dGUgcmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRBcGlSZXF1ZXN0IGV4dGVuZHMgSW5jb21pbmdNZXNzYWdlIHtcbiAgLyoqXG4gICAqIE9iamVjdCBvZiBgcXVlcnlgIHZhbHVlcyBmcm9tIHVybFxuICAgKi9cbiAgcXVlcnk6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBzdHJpbmdbXVxuICB9XG4gIC8qKlxuICAgKiBPYmplY3Qgb2YgYGNvb2tpZXNgIGZyb20gaGVhZGVyXG4gICAqL1xuICBjb29raWVzOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nXG4gIH1cblxuICBib2R5OiBhbnlcblxuICBlbnY6IEVudlxuXG4gIHByZXZpZXc/OiBib29sZWFuXG4gIC8qKlxuICAgKiBQcmV2aWV3IGRhdGEgc2V0IG9uIHRoZSByZXF1ZXN0LCBpZiBhbnlcbiAgICogKi9cbiAgcHJldmlld0RhdGE/OiBhbnlcbn1cblxuLyoqXG4gKiBTZW5kIGJvZHkgb2YgcmVzcG9uc2VcbiAqL1xudHlwZSBTZW5kPFQ+ID0gKGJvZHk6IFQpID0+IHZvaWRcblxuLyoqXG4gKiBOZXh0IGBBUElgIHJvdXRlIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCB0eXBlIE5leHRBcGlSZXNwb25zZTxUID0gYW55PiA9IFNlcnZlclJlc3BvbnNlICYge1xuICAvKipcbiAgICogU2VuZCBkYXRhIGBhbnlgIGRhdGEgaW4gcmVzcG9uc2VcbiAgICovXG4gIHNlbmQ6IFNlbmQ8VD5cbiAgLyoqXG4gICAqIFNlbmQgZGF0YSBganNvbmAgZGF0YSBpbiByZXNwb25zZVxuICAgKi9cbiAganNvbjogU2VuZDxUPlxuICBzdGF0dXM6IChzdGF0dXNDb2RlOiBudW1iZXIpID0+IE5leHRBcGlSZXNwb25zZTxUPlxuICByZWRpcmVjdCh1cmw6IHN0cmluZyk6IE5leHRBcGlSZXNwb25zZTxUPlxuICByZWRpcmVjdChzdGF0dXM6IG51bWJlciwgdXJsOiBzdHJpbmcpOiBOZXh0QXBpUmVzcG9uc2U8VD5cblxuICAvKipcbiAgICogU2V0IHByZXZpZXcgZGF0YSBmb3IgTmV4dC5qcycgcHJlcmVuZGVyIG1vZGVcbiAgICovXG4gIHNldFByZXZpZXdEYXRhOiAoXG4gICAgZGF0YTogb2JqZWN0IHwgc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICAvKipcbiAgICAgICAqIFNwZWNpZmllcyB0aGUgbnVtYmVyIChpbiBzZWNvbmRzKSBmb3IgdGhlIHByZXZpZXcgc2Vzc2lvbiB0byBsYXN0IGZvci5cbiAgICAgICAqIFRoZSBnaXZlbiBudW1iZXIgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBieSByb3VuZGluZyBkb3duLlxuICAgICAgICogQnkgZGVmYXVsdCwgbm8gbWF4aW11bSBhZ2UgaXMgc2V0IGFuZCB0aGUgcHJldmlldyBzZXNzaW9uIGZpbmlzaGVzXG4gICAgICAgKiB3aGVuIHRoZSBjbGllbnQgc2h1dHMgZG93biAoYnJvd3NlciBpcyBjbG9zZWQpLlxuICAgICAgICovXG4gICAgICBtYXhBZ2U/OiBudW1iZXJcbiAgICB9XG4gICkgPT4gTmV4dEFwaVJlc3BvbnNlPFQ+XG4gIGNsZWFyUHJldmlld0RhdGE6ICgpID0+IE5leHRBcGlSZXNwb25zZTxUPlxufVxuXG4vKipcbiAqIE5leHQgYEFQSWAgcm91dGUgaGFuZGxlclxuICovXG5leHBvcnQgdHlwZSBOZXh0QXBpSGFuZGxlcjxUID0gYW55PiA9IChcbiAgcmVxOiBOZXh0QXBpUmVxdWVzdCxcbiAgcmVzOiBOZXh0QXBpUmVzcG9uc2U8VD5cbikgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cblxuLyoqXG4gKiBVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY09uY2U8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gUmV0dXJuVHlwZTxUPj4oXG4gIGZuOiBUXG4pOiBUIHtcbiAgbGV0IHVzZWQgPSBmYWxzZVxuICBsZXQgcmVzdWx0OiBSZXR1cm5UeXBlPFQ+XG5cbiAgcmV0dXJuICgoLi4uYXJnczogYW55W10pID0+IHtcbiAgICBpZiAoIXVzZWQpIHtcbiAgICAgIHVzZWQgPSB0cnVlXG4gICAgICByZXN1bHQgPSBmbiguLi5hcmdzKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH0pIGFzIFRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2F0aW9uT3JpZ2luKCkge1xuICBjb25zdCB7IHByb3RvY29sLCBob3N0bmFtZSwgcG9ydCB9ID0gd2luZG93LmxvY2F0aW9uXG4gIHJldHVybiBgJHtwcm90b2NvbH0vLyR7aG9zdG5hbWV9JHtwb3J0ID8gJzonICsgcG9ydCA6ICcnfWBcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVSTCgpIHtcbiAgY29uc3QgeyBocmVmIH0gPSB3aW5kb3cubG9jYXRpb25cbiAgY29uc3Qgb3JpZ2luID0gZ2V0TG9jYXRpb25PcmlnaW4oKVxuICByZXR1cm4gaHJlZi5zdWJzdHJpbmcob3JpZ2luLmxlbmd0aClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3BsYXlOYW1lPFA+KENvbXBvbmVudDogQ29tcG9uZW50VHlwZTxQPikge1xuICByZXR1cm4gdHlwZW9mIENvbXBvbmVudCA9PT0gJ3N0cmluZydcbiAgICA/IENvbXBvbmVudFxuICAgIDogQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdVbmtub3duJ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNTZW50KHJlczogU2VydmVyUmVzcG9uc2UpIHtcbiAgcmV0dXJuIHJlcy5maW5pc2hlZCB8fCByZXMuaGVhZGVyc1NlbnRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRHZXRJbml0aWFsUHJvcHM8XG4gIEMgZXh0ZW5kcyBCYXNlQ29udGV4dCxcbiAgSVAgPSB7fSxcbiAgUCA9IHt9XG4+KEFwcDogTmV4dENvbXBvbmVudFR5cGU8QywgSVAsIFA+LCBjdHg6IEMpOiBQcm9taXNlPElQPiB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKEFwcC5wcm90b3R5cGU/LmdldEluaXRpYWxQcm9wcykge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBcIiR7Z2V0RGlzcGxheU5hbWUoXG4gICAgICAgIEFwcFxuICAgICAgKX0uZ2V0SW5pdGlhbFByb3BzKClcIiBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAtIHZpc2l0IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2dldC1pbml0aWFsLXByb3BzLWFzLWFuLWluc3RhbmNlLW1ldGhvZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSlcbiAgICB9XG4gIH1cbiAgLy8gd2hlbiBjYWxsZWQgZnJvbSBfYXBwIGBjdHhgIGlzIG5lc3RlZCBpbiBgY3R4YFxuICBjb25zdCByZXMgPSBjdHgucmVzIHx8IChjdHguY3R4ICYmIGN0eC5jdHgucmVzKVxuXG4gIGlmICghQXBwLmdldEluaXRpYWxQcm9wcykge1xuICAgIGlmIChjdHguY3R4ICYmIGN0eC5Db21wb25lbnQpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgcGFnZVByb3BzIGRlZmF1bHRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VQcm9wczogYXdhaXQgbG9hZEdldEluaXRpYWxQcm9wcyhjdHguQ29tcG9uZW50LCBjdHguY3R4KSxcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9IGFzIElQXG4gIH1cblxuICBjb25zdCBwcm9wcyA9IGF3YWl0IEFwcC5nZXRJbml0aWFsUHJvcHMoY3R4KVxuXG4gIGlmIChyZXMgJiYgaXNSZXNTZW50KHJlcykpIHtcbiAgICByZXR1cm4gcHJvcHNcbiAgfVxuXG4gIGlmICghcHJvcHMpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYFwiJHtnZXREaXNwbGF5TmFtZShcbiAgICAgIEFwcFxuICAgICl9LmdldEluaXRpYWxQcm9wcygpXCIgc2hvdWxkIHJlc29sdmUgdG8gYW4gb2JqZWN0LiBCdXQgZm91bmQgXCIke3Byb3BzfVwiIGluc3RlYWQuYFxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKVxuICB9XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoT2JqZWN0LmtleXMocHJvcHMpLmxlbmd0aCA9PT0gMCAmJiAhY3R4LmN0eCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtnZXREaXNwbGF5TmFtZShcbiAgICAgICAgICBBcHBcbiAgICAgICAgKX0gcmV0dXJuZWQgYW4gZW1wdHkgb2JqZWN0IGZyb20gXFxgZ2V0SW5pdGlhbFByb3BzXFxgLiBUaGlzIGRlLW9wdGltaXplcyBhbmQgcHJldmVudHMgYXV0b21hdGljIHN0YXRpYyBvcHRpbWl6YXRpb24uIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL21lc3NhZ2VzL2VtcHR5LW9iamVjdC1nZXRJbml0aWFsUHJvcHNgXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHByb3BzXG59XG5cbmV4cG9ydCBjb25zdCB1cmxPYmplY3RLZXlzID0gW1xuICAnYXV0aCcsXG4gICdoYXNoJyxcbiAgJ2hvc3QnLFxuICAnaG9zdG5hbWUnLFxuICAnaHJlZicsXG4gICdwYXRoJyxcbiAgJ3BhdGhuYW1lJyxcbiAgJ3BvcnQnLFxuICAncHJvdG9jb2wnLFxuICAncXVlcnknLFxuICAnc2VhcmNoJyxcbiAgJ3NsYXNoZXMnLFxuXVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0V2l0aFZhbGlkYXRpb24odXJsOiBVcmxPYmplY3QpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICBpZiAodXJsICE9PSBudWxsICYmIHR5cGVvZiB1cmwgPT09ICdvYmplY3QnKSB7XG4gICAgICBPYmplY3Qua2V5cyh1cmwpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAodXJsT2JqZWN0S2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFVua25vd24ga2V5IHBhc3NlZCB2aWEgdXJsT2JqZWN0IGludG8gdXJsLmZvcm1hdDogJHtrZXl9YFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm9ybWF0VXJsKHVybClcbn1cblxuZXhwb3J0IGNvbnN0IFNQID0gdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJ1xuZXhwb3J0IGNvbnN0IFNUID1cbiAgU1AgJiZcbiAgdHlwZW9mIHBlcmZvcm1hbmNlLm1hcmsgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIHBlcmZvcm1hbmNlLm1lYXN1cmUgPT09ICdmdW5jdGlvbidcbiIsIlwidXNlIHN0cmljdFwiO2V4cG9ydHMuX19lc01vZHVsZT10cnVlO2V4cG9ydHMubm9ybWFsaXplUGF0aFNlcD1ub3JtYWxpemVQYXRoU2VwO2V4cG9ydHMuZGVub3JtYWxpemVQYWdlUGF0aD1kZW5vcm1hbGl6ZVBhZ2VQYXRoO2Z1bmN0aW9uIG5vcm1hbGl6ZVBhdGhTZXAocGF0aCl7cmV0dXJuIHBhdGgucmVwbGFjZSgvXFxcXC9nLCcvJyk7fWZ1bmN0aW9uIGRlbm9ybWFsaXplUGFnZVBhdGgocGFnZSl7cGFnZT1ub3JtYWxpemVQYXRoU2VwKHBhZ2UpO2lmKHBhZ2Uuc3RhcnRzV2l0aCgnL2luZGV4LycpKXtwYWdlPXBhZ2Uuc2xpY2UoNik7fWVsc2UgaWYocGFnZT09PScvaW5kZXgnKXtwYWdlPScvJzt9cmV0dXJuIHBhZ2U7fVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGVub3JtYWxpemUtcGFnZS1wYXRoLmpzLm1hcCIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L25leHQtc2VydmVyL2xpYi9oZWFkJylcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xuZXhwb3J0cy5GcmFnbWVudCA9IDB4ZWFjYjtcbnZhciBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IDB4ZWFjZDtcbnZhciBSRUFDVF9DT05URVhUX1RZUEUgPSAweGVhY2U7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IDB4ZWFkMDtcbnZhciBSRUFDVF9TVVNQRU5TRV9UWVBFID0gMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSAweGVhZDk7XG52YXIgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSAweGVhZGE7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IDB4ZWFkNTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gMHhlYWQ3O1xudmFyIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gMHhlYWUwO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gMHhlYWUxO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gMHhlYWUyO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IDB4ZWFlMztcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5lbGVtZW50Jyk7XG4gIFJFQUNUX1BPUlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wb3J0YWwnKTtcbiAgZXhwb3J0cy5GcmFnbWVudCA9IHN5bWJvbEZvcigncmVhY3QuZnJhZ21lbnQnKTtcbiAgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbiAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucHJvZmlsZXInKTtcbiAgUkVBQ1RfUFJPVklERVJfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucHJvdmlkZXInKTtcbiAgUkVBQ1RfQ09OVEVYVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5jb250ZXh0Jyk7XG4gIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG4gIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG4gIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xuICBSRUFDVF9NRU1PX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm1lbW8nKTtcbiAgUkVBQ1RfTEFaWV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sYXp5Jyk7XG4gIFJFQUNUX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmJsb2NrJyk7XG4gIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zZXJ2ZXIuYmxvY2snKTtcbiAgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZnVuZGFtZW50YWwnKTtcbiAgUkVBQ1RfU0NPUEVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2NvcGUnKTtcbiAgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9wYXF1ZS5pZCcpO1xuICBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xuICBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG4gIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xufVxuXG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0gUmVhY3QuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ7XG5cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfVxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiAnJyArIGl0ZW07XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG4vLyBGaWx0ZXIgY2VydGFpbiBET00gYXR0cmlidXRlcyAoZS5nLiBzcmMsIGhyZWYpIGlmIHRoZWlyIHZhbHVlcyBhcmUgZW1wdHkgc3RyaW5ncy5cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFIHx8IGVuYWJsZVNjb3BlQVBJICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUgfHwgdHlwZVswXSA9PT0gUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgZXhwb3J0cy5GcmFnbWVudDpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICghZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDsgLy8gU2V0IHRoZSBkaXNwYXRjaGVyIGluIERFViBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgY2FsbCBpbiB0aGUgcmVuZGVyIGZ1bmN0aW9uXG4gICAgLy8gZm9yIHdhcm5pbmdzLlxuXG4gICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5fcmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd247XG52YXIgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG52YXIgZGlkV2FybkFib3V0U3RyaW5nUmVmcztcblxue1xuICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzID0ge307XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcucmVmICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkS2V5KGNvbmZpZykge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcblxuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBzZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBzZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB7XG4gICAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB7XG4gICAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdyZWYnLCB7XG4gICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZmNzL3B1bGwvMTA3XG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG5cbmZ1bmN0aW9uIGpzeERFVih0eXBlLCBjb25maWcsIG1heWJlS2V5LCBzb3VyY2UsIHNlbGYpIHtcbiAge1xuICAgIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gICAgdmFyIHByb3BzID0ge307XG4gICAgdmFyIGtleSA9IG51bGw7XG4gICAgdmFyIHJlZiA9IG51bGw7IC8vIEN1cnJlbnRseSwga2V5IGNhbiBiZSBzcHJlYWQgaW4gYXMgYSBwcm9wLiBUaGlzIGNhdXNlcyBhIHBvdGVudGlhbFxuICAgIC8vIGlzc3VlIGlmIGtleSBpcyBhbHNvIGV4cGxpY2l0bHkgZGVjbGFyZWQgKGllLiA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPlxuICAgIC8vIG9yIDxkaXYga2V5PVwiSGlcIiB7Li4ucHJvcHN9IC8+ICkuIFdlIHdhbnQgdG8gZGVwcmVjYXRlIGtleSBzcHJlYWQsXG4gICAgLy8gYnV0IGFzIGFuIGludGVybWVkaWFyeSBzdGVwLCB3ZSB3aWxsIHVzZSBqc3hERVYgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0XG4gICAgLy8gPGRpdiB7Li4ucHJvcHN9IGtleT1cIkhpXCIgLz4sIGJlY2F1c2Ugd2UgYXJlbid0IGN1cnJlbnRseSBhYmxlIHRvIHRlbGwgaWZcbiAgICAvLyBrZXkgaXMgZXhwbGljaXRseSBkZWNsYXJlZCB0byBiZSB1bmRlZmluZWQgb3Igbm90LlxuXG4gICAgaWYgKG1heWJlS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleSA9ICcnICsgbWF5YmVLZXk7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcsIHNlbGYpO1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuXG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG5cbiAgICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHtcbiAgICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAge1xuICAgIGlmIChSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQudHlwZSk7XG5cbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIHtcbiAgICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAge1xuICAgIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgICBpZiAoIWluZm8pIHtcbiAgICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZm87XG4gIH1cbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAge1xuICAgIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICAgIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAgIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gICAgfVxuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIG5vZGUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEVudHJ5IGl0ZXJhdG9ycyB1c2VkIHRvIHByb3ZpZGUgaW1wbGljaXQga2V5cyxcbiAgICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGpzeFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBrZXksIGlzU3RhdGljQ2hpbGRyZW4sIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKTtcblxuICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgICAgfVxuXG4gICAgICBlcnJvcignUmVhY3QuanN4OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50ID0ganN4REVWKHR5cGUsIHByb3BzLCBrZXksIHNvdXJjZSwgc2VsZik7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gICAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuXG4gICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoaXNTdGF0aWNDaGlsZHJlbikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpXSwgdHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRyZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvcignUmVhY3QuanN4OiBTdGF0aWMgY2hpbGRyZW4gc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheS4gJyArICdZb3UgYXJlIGxpa2VseSBleHBsaWNpdGx5IGNhbGxpbmcgUmVhY3QuanN4cyBvciBSZWFjdC5qc3hERVYuICcgKyAnVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IGV4cG9ydHMuRnJhZ21lbnQpIHtcbiAgICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cbn0gLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBleGlzdCB0byBzdGlsbCBnZXQgY2hpbGQgd2FybmluZ3MgaW4gZGV2XG5cbnZhciBqc3hERVYkMSA9ICBqc3hXaXRoVmFsaWRhdGlvbiA7XG5cbmV4cG9ydHMuanN4REVWID0ganN4REVWJDE7XG4gIH0pKCk7XG59XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE3LjAuMlxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxuLy8gVE9ETzogdGhpcyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZ2V0cyBpbXBvcnRlZCBkdXJpbmcgYnVpbGQuXG52YXIgUmVhY3RWZXJzaW9uID0gJzE3LjAuMic7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSAweGVhY2E7XG5leHBvcnRzLkZyYWdtZW50ID0gMHhlYWNiO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gMHhlYWNjO1xuZXhwb3J0cy5Qcm9maWxlciA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xuZXhwb3J0cy5TdXNwZW5zZSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIGV4cG9ydHMuRnJhZ21lbnQgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIGV4cG9ydHMuU3RyaWN0TW9kZSA9IHN5bWJvbEZvcigncmVhY3Quc3RyaWN0X21vZGUnKTtcbiAgZXhwb3J0cy5Qcm9maWxlciA9IHN5bWJvbEZvcigncmVhY3QucHJvZmlsZXInKTtcbiAgUkVBQ1RfUFJPVklERVJfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucHJvdmlkZXInKTtcbiAgUkVBQ1RfQ09OVEVYVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5jb250ZXh0Jyk7XG4gIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZvcndhcmRfcmVmJyk7XG4gIGV4cG9ydHMuU3VzcGVuc2UgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlJyk7XG4gIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpO1xuICBSRUFDVF9NRU1PX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm1lbW8nKTtcbiAgUkVBQ1RfTEFaWV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sYXp5Jyk7XG4gIFJFQUNUX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmJsb2NrJyk7XG4gIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zZXJ2ZXIuYmxvY2snKTtcbiAgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZnVuZGFtZW50YWwnKTtcbiAgUkVBQ1RfU0NPUEVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2NvcGUnKTtcbiAgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9wYXF1ZS5pZCcpO1xuICBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xuICBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG4gIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xufVxuXG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGVyLlxuICovXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJhdGNoJ3MgY29uZmlndXJhdGlvbiBzdWNoIGFzIGhvdyBsb25nIGFuIHVwZGF0ZVxuICogc2hvdWxkIHN1c3BlbmQgZm9yIGlmIGl0IG5lZWRzIHRvLlxuICovXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSB7XG4gIHRyYW5zaXRpb246IDBcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb3duZXIuXG4gKlxuICogVGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIGNvbXBvbmVudCB3aG8gc2hvdWxkIG93biBhbnkgY29tcG9uZW50cyB0aGF0IGFyZVxuICogY3VycmVudGx5IGJlaW5nIGNvbnN0cnVjdGVkLlxuICovXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxufTtcblxudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSB7fTtcbnZhciBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gbnVsbDtcbmZ1bmN0aW9uIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjaykge1xuICB7XG4gICAgY3VycmVudEV4dHJhU3RhY2tGcmFtZSA9IHN0YWNrO1xuICB9XG59XG5cbntcbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUgPSBmdW5jdGlvbiAoc3RhY2spIHtcbiAgICB7XG4gICAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gICAgfVxuICB9OyAvLyBTdGFjayBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCBieSB0aGUgY3VycmVudCByZW5kZXJlci5cblxuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcblxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YWNrID0gJyc7IC8vIEFkZCBhbiBleHRyYSB0b3AgZnJhbWUgd2hpbGUgYW4gZWxlbWVudCBpcyBiZWluZyB2YWxpZGF0ZWRcblxuICAgIGlmIChjdXJyZW50RXh0cmFTdGFja0ZyYW1lKSB7XG4gICAgICBzdGFjayArPSBjdXJyZW50RXh0cmFTdGFja0ZyYW1lO1xuICAgIH0gLy8gRGVsZWdhdGUgdG8gdGhlIGluamVjdGVkIHJlbmRlcmVyLXNwZWNpZmljIGltcGxlbWVudGF0aW9uXG5cblxuICAgIHZhciBpbXBsID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2s7XG5cbiAgICBpZiAoaW1wbCkge1xuICAgICAgc3RhY2sgKz0gaW1wbCgpIHx8ICcnO1xuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfTtcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IGFjdCgpIHRvIHRyYWNrIHdoZXRoZXIgeW91J3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZS5cbiAqL1xudmFyIElzU29tZVJlbmRlcmVyQWN0aW5nID0ge1xuICBjdXJyZW50OiBmYWxzZVxufTtcblxudmFyIFJlYWN0U2hhcmVkSW50ZXJuYWxzID0ge1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzogUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsXG4gIFJlYWN0Q3VycmVudE93bmVyOiBSZWFjdEN1cnJlbnRPd25lcixcbiAgSXNTb21lUmVuZGVyZXJBY3Rpbmc6IElzU29tZVJlbmRlcmVyQWN0aW5nLFxuICAvLyBVc2VkIGJ5IHJlbmRlcmVycyB0byBhdm9pZCBidW5kbGluZyBvYmplY3QtYXNzaWduIHR3aWNlIGluIFVNRCBidW5kbGVzOlxuICBhc3NpZ246IF9hc3NpZ25cbn07XG5cbntcbiAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG59XG5cbi8vIGJ5IGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYnkgYSBCYWJlbCBwbHVnaW4uXG4vL1xuLy8gSW4gUFJPRCAob3IgaW4gcGFja2FnZXMgd2l0aG91dCBhY2Nlc3MgdG8gUmVhY3QgaW50ZXJuYWxzKSxcbi8vIHRoZXkgYXJlIGxlZnQgYXMgdGhleSBhcmUgaW5zdGVhZC5cblxuZnVuY3Rpb24gd2Fybihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnd2FybicsIGZvcm1hdCwgYXJncyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCdlcnJvcicsIGZvcm1hdCwgYXJncyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGxldmVsLCBmb3JtYXQsIGFyZ3MpIHtcbiAgLy8gV2hlbiBjaGFuZ2luZyB0aGlzIGxvZ2ljLCB5b3UgbWlnaHQgd2FudCB0byBhbHNvXG4gIC8vIHVwZGF0ZSBjb25zb2xlV2l0aFN0YWNrRGV2Lnd3dy5qcyBhcyB3ZWxsLlxuICB7XG4gICAgdmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgaWYgKHN0YWNrICE9PSAnJykge1xuICAgICAgZm9ybWF0ICs9ICclcyc7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgfVxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiAnJyArIGl0ZW07XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge307XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHtcbiAgICB2YXIgX2NvbnN0cnVjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBfY29uc3RydWN0b3IgJiYgKF9jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCBfY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnO1xuICAgIHZhciB3YXJuaW5nS2V5ID0gY29tcG9uZW50TmFtZSArIFwiLlwiICsgY2FsbGVyTmFtZTtcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBlcnJvcihcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFwiICsgJ1RoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uICcgKyAnSW5zdGVhZCwgYXNzaWduIHRvIGB0aGlzLnN0YXRlYCBkaXJlY3RseSBvciBkZWZpbmUgYSBgc3RhdGUgPSB7fTtgICcgKyAnY2xhc3MgcHJvcGVydHkgd2l0aCB0aGUgZGVzaXJlZCBzdGF0ZSBpbiB0aGUgJXMgY29tcG9uZW50LicsIGNhbGxlck5hbWUsIGNvbXBvbmVudE5hbWUpO1xuXG4gICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gdHJ1ZTtcbiAgfVxufVxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xuXG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG52YXIgZW1wdHlPYmplY3QgPSB7fTtcblxue1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDsgLy8gV2UgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB1cGRhdGVyIGJ1dCB0aGUgcmVhbCBvbmUgZ2V0cyBpbmplY3RlZCBieSB0aGVcbiAgLy8gcmVuZGVyZXIuXG5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuQ29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5Db21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgaWYgKCEodHlwZW9mIHBhcnRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHBhcnRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCBwYXJ0aWFsU3RhdGUgPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJzZXRTdGF0ZSguLi4pOiB0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG59O1xuLyoqXG4gKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAqXG4gKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICpcbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuXG5Db21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcywgY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xufTtcbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG5cblxue1xuICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLFxuICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddXG4gIH07XG5cbiAgdmFyIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyA9IGZ1bmN0aW9uIChtZXRob2ROYW1lLCBpbmZvKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3YXJuKCclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pO1xuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG5cbkNvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4vKipcbiAqIENvbnZlbmllbmNlIGNvbXBvbmVudCB3aXRoIGRlZmF1bHQgc2hhbGxvdyBlcXVhbGl0eSBjaGVjayBmb3Igc0NVLlxuICovXG5cbmZ1bmN0aW9uIFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OyAvLyBJZiBhIGNvbXBvbmVudCBoYXMgc3RyaW5nIHJlZnMsIHdlIHdpbGwgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCBsYXRlci5cblxuICB0aGlzLnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxudmFyIHB1cmVDb21wb25lbnRQcm90b3R5cGUgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xucHVyZUNvbXBvbmVudFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFB1cmVDb21wb25lbnQ7IC8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLlxuXG5fYXNzaWduKHB1cmVDb21wb25lbnRQcm90b3R5cGUsIENvbXBvbmVudC5wcm90b3R5cGUpO1xuXG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxuLy8gYW4gaW1tdXRhYmxlIG9iamVjdCB3aXRoIGEgc2luZ2xlIG11dGFibGUgdmFsdWVcbmZ1bmN0aW9uIGNyZWF0ZVJlZigpIHtcbiAgdmFyIHJlZk9iamVjdCA9IHtcbiAgICBjdXJyZW50OiBudWxsXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZk9iamVjdCk7XG4gIH1cblxuICByZXR1cm4gcmVmT2JqZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBleHBvcnRzLkZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBleHBvcnRzLlByb2ZpbGVyOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIGV4cG9ydHMuU3RyaWN0TW9kZTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIGV4cG9ydHMuU3VzcGVuc2U6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKGNvbnRleHQpICsgJy5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgdmFyIHByb3ZpZGVyID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIGdldENvbnRleHROYW1lKHByb3ZpZGVyLl9jb250ZXh0KSArICcuUHJvdmlkZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRXcmFwcGVkTmFtZSh0eXBlLCB0eXBlLnJlbmRlciwgJ0ZvcndhcmRSZWYnKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUudHlwZSk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS5fcmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZShpbml0KHBheWxvYWQpKTtcbiAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdrZXknLCB7XG4gICAgZ2V0OiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ1JlZiA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHdhcm5JZlN0cmluZ1JlZkNhbm5vdEJlQXV0b0NvbnZlcnRlZChjb25maWcpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY29uZmlnLnJlZiA9PT0gJ3N0cmluZycgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBjb25maWcuX19zZWxmICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuc3RhdGVOb2RlICE9PSBjb25maWcuX19zZWxmKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGVycm9yKCdDb21wb25lbnQgXCIlc1wiIGNvbnRhaW5zIHRoZSBzdHJpbmcgcmVmIFwiJXNcIi4gJyArICdTdXBwb3J0IGZvciBzdHJpbmcgcmVmcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gJyArICdUaGlzIGNhc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uLiAnICsgJ1dlIGFzayB5b3UgdG8gbWFudWFsbHkgZml4IHRoaXMgY2FzZSBieSB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGNvbXBvbmVudE5hbWUsIGNvbmZpZy5yZWYpO1xuXG4gICAgICAgIGRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgbm90IHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0gcHJvcHNcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQGludGVybmFsXG4gKi9cblxuXG52YXIgUmVhY3RFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcykge1xuICB2YXIgZWxlbWVudCA9IHtcbiAgICAvLyBUaGlzIHRhZyBhbGxvd3MgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICAvLyBSZWNvcmQgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyBlbGVtZW50LlxuICAgIF9vd25lcjogb3duZXJcbiAgfTtcblxuICB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307IC8vIFRvIG1ha2UgY29tcGFyaW5nIFJlYWN0RWxlbWVudHMgZWFzaWVyIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3ZSBtYWtlXG4gICAgLy8gdGhlIHZhbGlkYXRpb24gZmxhZyBub24tZW51bWVyYWJsZSAod2hlcmUgcG9zc2libGUsIHdoaWNoIHNob3VsZFxuICAgIC8vIGluY2x1ZGUgZXZlcnkgZW52aXJvbm1lbnQgd2UgcnVuIHRlc3RzIGluKSwgc28gdGhlIHRlc3QgZnJhbWV3b3JrXG4gICAgLy8gaWdub3JlcyBpdC5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50Ll9zdG9yZSwgJ3ZhbGlkYXRlZCcsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgdmFsdWU6IGZhbHNlXG4gICAgfSk7IC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc2VsZlxuICAgIH0pOyAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vIGVxdWFsIGZvciB0ZXN0aW5nIHB1cnBvc2VzIGFuZCB0aGVyZWZvcmUgd2UgaGlkZSBpdCBmcm9tIGVudW1lcmF0aW9uLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc291cmNlJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNvdXJjZVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudC5wcm9wcyk7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufTtcbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjcmVhdGVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudCh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG4gIHZhciBwcm9wcyA9IHt9O1xuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG5cbiAgICAgIHtcbiAgICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICBzZWxmID0gY29uZmlnLl9fc2VsZiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NlbGY7XG4gICAgc291cmNlID0gY29uZmlnLl9fc291cmNlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc291cmNlOyAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZEFycmF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH0gLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG5cblxuICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAocHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKGtleSB8fCByZWYpIHtcbiAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmKSB7XG4gICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59XG5mdW5jdGlvbiBjbG9uZUFuZFJlcGxhY2VLZXkob2xkRWxlbWVudCwgbmV3S2V5KSB7XG4gIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50KG9sZEVsZW1lbnQudHlwZSwgbmV3S2V5LCBvbGRFbGVtZW50LnJlZiwgb2xkRWxlbWVudC5fc2VsZiwgb2xkRWxlbWVudC5fc291cmNlLCBvbGRFbGVtZW50Ll9vd25lciwgb2xkRWxlbWVudC5wcm9wcyk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjY2xvbmVlbGVtZW50XG4gKi9cblxuZnVuY3Rpb24gY2xvbmVFbGVtZW50KGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgaWYgKCEhKGVsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlJlYWN0LmNsb25lRWxlbWVudCguLi4pOiBUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICsgZWxlbWVudCArIFwiLlwiICk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3BOYW1lOyAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG5cbiAgdmFyIHByb3BzID0gX2Fzc2lnbih7fSwgZWxlbWVudC5wcm9wcyk7IC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcblxuXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmOyAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLlxuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjsgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG5cbiAgdmFyIHNvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTsgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuXG4gIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICAvLyBTaWxlbnRseSBzdGVhbCB0aGUgcmVmIGZyb20gdGhlIHBhcmVudC5cbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgICBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG5cblxuICAgIHZhciBkZWZhdWx0UHJvcHM7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuXG5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgfVxuXG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59XG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2lzdmFsaWRlbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgb2JqZWN0YCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIEBmaW5hbFxuICovXG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufVxuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6Jztcbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSBrZXkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gdGV4dC5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBlbGVtZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGVsZW1lbnQgQSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFbGVtZW50S2V5KGVsZW1lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdvYmplY3QnICYmIGVsZW1lbnQgIT09IG51bGwgJiYgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHJldHVybiBlc2NhcGUoJycgKyBlbGVtZW50LmtleSk7XG4gIH0gLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcblxuXG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbmZ1bmN0aW9uIG1hcEludG9BcnJheShjaGlsZHJlbiwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5hbWVTb0ZhciwgY2FsbGJhY2spIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgdmFyIF9jaGlsZCA9IGNoaWxkcmVuO1xuICAgIHZhciBtYXBwZWRDaGlsZCA9IGNhbGxiYWNrKF9jaGlsZCk7IC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93czpcblxuICAgIHZhciBjaGlsZEtleSA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRFbGVtZW50S2V5KF9jaGlsZCwgMCkgOiBuYW1lU29GYXI7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICAgIHZhciBlc2NhcGVkQ2hpbGRLZXkgPSAnJztcblxuICAgICAgaWYgKGNoaWxkS2V5ICE9IG51bGwpIHtcbiAgICAgICAgZXNjYXBlZENoaWxkS2V5ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KGNoaWxkS2V5KSArICcvJztcbiAgICAgIH1cblxuICAgICAgbWFwSW50b0FycmF5KG1hcHBlZENoaWxkLCBhcnJheSwgZXNjYXBlZENoaWxkS2V5LCAnJywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgcmV0dXJuIGM7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChtYXBwZWRDaGlsZCkpIHtcbiAgICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAgICBlc2NhcGVkUHJlZml4ICsgKCAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIFJlYWN0LlBvcnRhbCBkb2Vzbid0IGhhdmUgYSBrZXlcbiAgICAgICAgbWFwcGVkQ2hpbGQua2V5ICYmICghX2NoaWxkIHx8IF9jaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyAvLyAkRmxvd0ZpeE1lIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIGV4aXN0aW5nIGVsZW1lbnQncyBrZXkgY2FuIGJlIGEgbnVtYmVyXG4gICAgICAgIGVzY2FwZVVzZXJQcm92aWRlZEtleSgnJyArIG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgICB9XG5cbiAgICAgIGFycmF5LnB1c2gobWFwcGVkQ2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgaXRlcmFibGVDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuICAgICAgICBpZiAoaXRlcmF0b3JGbiA9PT0gaXRlcmFibGVDaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnVXNlIGFuIGFycmF5IG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGVDaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpaSA9IDA7XG5cbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0RWxlbWVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgIHN1YnRyZWVDb3VudCArPSBtYXBJbnRvQXJyYXkoY2hpbGQsIGFycmF5LCBlc2NhcGVkUHJlZml4LCBuZXh0TmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9ICcnICsgY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgKyAoY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nKSArIFwiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGNvdW50ID0gMDtcbiAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsICcnLCAnJywgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgY291bnQrKyk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXNcbiAqIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNvdW50Q2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIG4gPSAwO1xuICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIG4rKzsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nXG4gIH0pO1xuICByZXR1cm4gbjtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5mb3JlYWNoXG4gKlxuICogVGhlIHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZvckVhY2hGdW5jXG4gKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0LlxuICovXG5mdW5jdGlvbiBmb3JFYWNoQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgIGZvckVhY2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIERvbid0IHJldHVybiBhbnl0aGluZy5cbiAgfSwgZm9yRWFjaENvbnRleHQpO1xufVxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW50b2FycmF5XG4gKi9cblxuXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHJldHVybiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9KSB8fCBbXTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgY2hpbGQgaW4gYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuIGFuZCB2ZXJpZmllcyB0aGF0IHRoZXJlXG4gKiBpcyBvbmx5IG9uZSBjaGlsZCBpbiB0aGUgY29sbGVjdGlvbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cblxuXG5mdW5jdGlvbiBvbmx5Q2hpbGQoY2hpbGRyZW4pIHtcbiAgaWYgKCFpc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChkZWZhdWx0VmFsdWUsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKSB7XG4gIGlmIChjYWxjdWxhdGVDaGFuZ2VkQml0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIGlmIChjYWxjdWxhdGVDaGFuZ2VkQml0cyAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsY3VsYXRlQ2hhbmdlZEJpdHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ2NyZWF0ZUNvbnRleHQ6IEV4cGVjdGVkIHRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcycsIGNhbGN1bGF0ZUNoYW5nZWRCaXRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgY29udGV4dCA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY2FsY3VsYXRlQ2hhbmdlZEJpdHMsXG4gICAgLy8gQXMgYSB3b3JrYXJvdW5kIHRvIHN1cHBvcnQgbXVsdGlwbGUgY29uY3VycmVudCByZW5kZXJlcnMsIHdlIGNhdGVnb3JpemVcbiAgICAvLyBzb21lIHJlbmRlcmVycyBhcyBwcmltYXJ5IGFuZCBvdGhlcnMgYXMgc2Vjb25kYXJ5LiBXZSBvbmx5IGV4cGVjdFxuICAgIC8vIHRoZXJlIHRvIGJlIHR3byBjb25jdXJyZW50IHJlbmRlcmVycyBhdCBtb3N0OiBSZWFjdCBOYXRpdmUgKHByaW1hcnkpIGFuZFxuICAgIC8vIEZhYnJpYyAoc2Vjb25kYXJ5KTsgUmVhY3QgRE9NIChwcmltYXJ5KSBhbmQgUmVhY3QgQVJUIChzZWNvbmRhcnkpLlxuICAgIC8vIFNlY29uZGFyeSByZW5kZXJlcnMgc3RvcmUgdGhlaXIgY29udGV4dCB2YWx1ZXMgb24gc2VwYXJhdGUgZmllbGRzLlxuICAgIF9jdXJyZW50VmFsdWU6IGRlZmF1bHRWYWx1ZSxcbiAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgIC8vIFVzZWQgdG8gdHJhY2sgaG93IG1hbnkgY29uY3VycmVudCByZW5kZXJlcnMgdGhpcyBjb250ZXh0IGN1cnJlbnRseVxuICAgIC8vIHN1cHBvcnRzIHdpdGhpbiBpbiBhIHNpbmdsZSByZW5kZXJlci4gU3VjaCBhcyBwYXJhbGxlbCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgIF90aHJlYWRDb3VudDogMCxcbiAgICAvLyBUaGVzZSBhcmUgY2lyY3VsYXJcbiAgICBQcm92aWRlcjogbnVsbCxcbiAgICBDb25zdW1lcjogbnVsbFxuICB9O1xuICBjb250ZXh0LlByb3ZpZGVyID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9QUk9WSURFUl9UWVBFLFxuICAgIF9jb250ZXh0OiBjb250ZXh0XG4gIH07XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSBmYWxzZTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0RGlzcGxheU5hbWVPbkNvbnN1bWVyID0gZmFsc2U7XG5cbiAge1xuICAgIC8vIEEgc2VwYXJhdGUgb2JqZWN0LCBidXQgcHJveGllcyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0IG9iamVjdCBmb3JcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSXQgaGFzIGEgZGlmZmVyZW50ICQkdHlwZW9mLCBzbyB3ZSBjYW4gcHJvcGVybHlcbiAgICAvLyB3YXJuIGZvciB0aGUgaW5jb3JyZWN0IHVzYWdlIG9mIENvbnRleHQgYXMgYSBDb25zdW1lci5cbiAgICB2YXIgQ29uc3VtZXIgPSB7XG4gICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgX2NvbnRleHQ6IGNvbnRleHQsXG4gICAgICBfY2FsY3VsYXRlQ2hhbmdlZEJpdHM6IGNvbnRleHQuX2NhbGN1bGF0ZUNoYW5nZWRCaXRzXG4gICAgfTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbm90IHNldHRpbmcgYSB2YWx1ZSwgd2hpY2ggaXMgaW50ZW50aW9uYWwgaGVyZVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQ29uc3VtZXIsIHtcbiAgICAgIFByb3ZpZGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Qcm92aWRlcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Qcm92aWRlcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Qcm92aWRlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX1Byb3ZpZGVyKSB7XG4gICAgICAgICAgY29udGV4dC5Qcm92aWRlciA9IF9Qcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IF9jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlMjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlMjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX2N1cnJlbnRWYWx1ZTIpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUyID0gX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfdGhyZWFkQ291bnQ6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3RocmVhZENvdW50O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfdGhyZWFkQ291bnQpIHtcbiAgICAgICAgICBjb250ZXh0Ll90aHJlYWRDb3VudCA9IF90aHJlYWRDb3VudDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIENvbnN1bWVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMpIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gdHJ1ZTtcblxuICAgICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dC5Db25zdW1lci5Db25zdW1lcj4gaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY29udGV4dC5Db25zdW1lcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlOYW1lOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0LmRpc3BsYXlOYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChkaXNwbGF5TmFtZSkge1xuICAgICAgICAgIGlmICghaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIpIHtcbiAgICAgICAgICAgIHdhcm4oJ1NldHRpbmcgYGRpc3BsYXlOYW1lYCBvbiBDb250ZXh0LkNvbnN1bWVyIGhhcyBubyBlZmZlY3QuICcgKyBcIllvdSBzaG91bGQgc2V0IGl0IGRpcmVjdGx5IG9uIHRoZSBjb250ZXh0IHdpdGggQ29udGV4dC5kaXNwbGF5TmFtZSA9ICclcycuXCIsIGRpc3BsYXlOYW1lKTtcblxuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pOyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBtaXNzaW5nIHByb3BlcnRpZXMgYmVjYXVzZSBpdCBkb2Vzbid0IHVuZGVyc3RhbmQgZGVmaW5lUHJvcGVydHlcblxuICAgIGNvbnRleHQuQ29uc3VtZXIgPSBDb25zdW1lcjtcbiAgfVxuXG4gIHtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBudWxsO1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbnZhciBVbmluaXRpYWxpemVkID0gLTE7XG52YXIgUGVuZGluZyA9IDA7XG52YXIgUmVzb2x2ZWQgPSAxO1xudmFyIFJlamVjdGVkID0gMjtcblxuZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gVW5pbml0aWFsaXplZCkge1xuICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgIHZhciB0aGVuYWJsZSA9IGN0b3IoKTsgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cblxuICAgIHZhciBwZW5kaW5nID0gcGF5bG9hZDtcbiAgICBwZW5kaW5nLl9zdGF0dXMgPSBQZW5kaW5nO1xuICAgIHBlbmRpbmcuX3Jlc3VsdCA9IHRoZW5hYmxlO1xuICAgIHRoZW5hYmxlLnRoZW4oZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUGVuZGluZykge1xuICAgICAgICB2YXIgZGVmYXVsdEV4cG9ydCA9IG1vZHVsZU9iamVjdC5kZWZhdWx0O1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZGVmYXVsdEV4cG9ydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlcnJvcignbGF6eTogRXhwZWN0ZWQgdGhlIHJlc3VsdCBvZiBhIGR5bmFtaWMgaW1wb3J0KCkgY2FsbC4gJyArICdJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gICcgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgJ2NvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXAnICsgXCJvcnQoJy4vTXlDb21wb25lbnQnKSlcIiwgbW9kdWxlT2JqZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cblxuXG4gICAgICAgIHZhciByZXNvbHZlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlc29sdmVkLl9zdGF0dXMgPSBSZXNvbHZlZDtcbiAgICAgICAgcmVzb2x2ZWQuX3Jlc3VsdCA9IGRlZmF1bHRFeHBvcnQ7XG4gICAgICB9XG4gICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuXG4gICAgICAgIHZhciByZWplY3RlZCA9IHBheWxvYWQ7XG4gICAgICAgIHJlamVjdGVkLl9zdGF0dXMgPSBSZWplY3RlZDtcbiAgICAgICAgcmVqZWN0ZWQuX3Jlc3VsdCA9IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHBheWxvYWQuX3N0YXR1cyA9PT0gUmVzb2x2ZWQpIHtcbiAgICByZXR1cm4gcGF5bG9hZC5fcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHRocm93IHBheWxvYWQuX3Jlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIHBheWxvYWQgPSB7XG4gICAgLy8gV2UgdXNlIHRoZXNlIGZpZWxkcyB0byBzdG9yZSB0aGUgcmVzdWx0LlxuICAgIF9zdGF0dXM6IC0xLFxuICAgIF9yZXN1bHQ6IGN0b3JcbiAgfTtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX3BheWxvYWQ6IHBheWxvYWQsXG4gICAgX2luaXQ6IGxhenlJbml0aWFsaXplclxuICB9O1xuXG4gIHtcbiAgICAvLyBJbiBwcm9kdWN0aW9uLCB0aGlzIHdvdWxkIGp1c3Qgc2V0IGl0IG9uIHRoZSBvYmplY3QuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICB2YXIgcHJvcFR5cGVzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsYXp5VHlwZSwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9wcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3RGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYGRlZmF1bHRQcm9wc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIGRlZmF1bHRQcm9wcyA9IG5ld0RlZmF1bHRQcm9wczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG4gICAgICAgICAgLy8gJEZsb3dGaXhNZVxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAncHJvcFR5cGVzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbGF6eVR5cGU7XG59XG5cbmZ1bmN0aW9uIGZvcndhcmRSZWYocmVuZGVyKSB7XG4gIHtcbiAgICBpZiAocmVuZGVyICE9IG51bGwgJiYgcmVuZGVyLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCAnICsgJ2NvbXBvbmVudC4gSW5zdGVhZCBvZiBmb3J3YXJkUmVmKG1lbW8oLi4uKSksIHVzZSAnICsgJ21lbW8oZm9yd2FyZFJlZiguLi4pKS4nKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuJywgcmVuZGVyID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZW5kZXIubGVuZ3RoICE9PSAwICYmIHJlbmRlci5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBhY2NlcHQgZXhhY3RseSB0d28gcGFyYW1ldGVyczogcHJvcHMgYW5kIHJlZi4gJXMnLCByZW5kZXIubGVuZ3RoID09PSAxID8gJ0RpZCB5b3UgZm9yZ2V0IHRvIHVzZSB0aGUgcmVmIHBhcmFtZXRlcj8nIDogJ0FueSBhZGRpdGlvbmFsIHBhcmFtZXRlciB3aWxsIGJlIHVuZGVmaW5lZC4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZW5kZXIuZGVmYXVsdFByb3BzICE9IG51bGwgfHwgcmVuZGVyLnByb3BUeXBlcyAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdmb3J3YXJkUmVmIHJlbmRlciBmdW5jdGlvbnMgZG8gbm90IHN1cHBvcnQgcHJvcFR5cGVzIG9yIGRlZmF1bHRQcm9wcy4gJyArICdEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIGEgUmVhY3QgY29tcG9uZW50PycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7XG5cbiAgICAgICAgaWYgKHJlbmRlci5kaXNwbGF5TmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmVuZGVyLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG4vLyBGaWx0ZXIgY2VydGFpbiBET00gYXR0cmlidXRlcyAoZS5nLiBzcmMsIGhyZWYpIGlmIHRoZWlyIHZhbHVlcyBhcmUgZW1wdHkgc3RyaW5ncy5cblxudmFyIGVuYWJsZVNjb3BlQVBJID0gZmFsc2U7IC8vIEV4cGVyaW1lbnRhbCBDcmVhdGUgRXZlbnQgSGFuZGxlIEFQSS5cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9IC8vIE5vdGU6IHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIChlLmcuIGlmIGl0J3MgYSBwb2x5ZmlsbCkuXG5cblxuICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCB8fCB0eXBlID09PSBleHBvcnRzLlByb2ZpbGVyIHx8IHR5cGUgPT09IFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFIHx8IHR5cGUgPT09IGV4cG9ydHMuU3RyaWN0TW9kZSB8fCB0eXBlID09PSBleHBvcnRzLlN1c3BlbnNlIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBtZW1vKHR5cGUsIGNvbXBhcmUpIHtcbiAge1xuICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7XG4gICAgICBlcnJvcignbWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgJyArICdyZWNlaXZlZDogJXMnLCB0eXBlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50VHlwZSA9IHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfTUVNT19UWVBFLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgY29tcGFyZTogY29tcGFyZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbXBhcmVcbiAgfTtcblxuICB7XG4gICAgdmFyIG93bk5hbWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnRUeXBlLCAnZGlzcGxheU5hbWUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIG93bk5hbWUgPSBuYW1lO1xuXG4gICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lID09IG51bGwpIHtcbiAgICAgICAgICB0eXBlLmRpc3BsYXlOYW1lID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRUeXBlO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQ7XG5cbiAgaWYgKCEoZGlzcGF0Y2hlciAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG5cbiAge1xuICAgIGlmICh1bnN0YWJsZV9vYnNlcnZlZEJpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ3VzZUNvbnRleHQoKSBzZWNvbmQgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAnICsgJ3VzZSBpbiBSZWFjdC4gUGFzc2luZyBpdCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBwYXNzZWQ6ICVzLiVzJywgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzLCB0eXBlb2YgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzID09PSAnbnVtYmVyJyAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1syXSkgPyAnXFxuXFxuRGlkIHlvdSBjYWxsIGFycmF5Lm1hcCh1c2VDb250ZXh0KT8gJyArICdDYWxsaW5nIEhvb2tzIGluc2lkZSBhIGxvb3AgaXMgbm90IHN1cHBvcnRlZC4gJyArICdMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycgOiAnJyk7XG4gICAgfSAvLyBUT0RPOiBhZGQgYSBtb3JlIGdlbmVyaWMgd2FybmluZyBmb3IgaW52YWxpZCB2YWx1ZXMuXG5cblxuICAgIGlmIChDb250ZXh0Ll9jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhciByZWFsQ29udGV4dCA9IENvbnRleHQuX2NvbnRleHQ7IC8vIERvbid0IGRlZHVwbGljYXRlIGJlY2F1c2UgdGhpcyBsZWdpdGltYXRlbHkgY2F1c2VzIGJ1Z3NcbiAgICAgIC8vIGFuZCBub2JvZHkgc2hvdWxkIGJlIHVzaW5nIHRoaXMgaW4gZXhpc3RpbmcgY29kZS5cblxuICAgICAgaWYgKHJlYWxDb250ZXh0LkNvbnN1bWVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Db25zdW1lcikgaXMgbm90IHN1cHBvcnRlZCwgbWF5IGNhdXNlIGJ1Z3MsIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9IGVsc2UgaWYgKHJlYWxDb250ZXh0LlByb3ZpZGVyID09PSBDb250ZXh0KSB7XG4gICAgICAgIGVycm9yKCdDYWxsaW5nIHVzZUNvbnRleHQoQ29udGV4dC5Qcm92aWRlcikgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCB1c2VDb250ZXh0KENvbnRleHQpIGluc3RlYWQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0LCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMpO1xufVxuZnVuY3Rpb24gdXNlU3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlU3RhdGUoaW5pdGlhbFN0YXRlKTtcbn1cbmZ1bmN0aW9uIHVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG59XG5mdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVmKGluaXRpYWxWYWx1ZSk7XG59XG5mdW5jdGlvbiB1c2VFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZU1lbW8oY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAge1xuICAgIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2hlci51c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbik7XG4gIH1cbn1cblxuLy8gSGVscGVycyB0byBwYXRjaCBjb25zb2xlLmxvZ3MgdG8gYXZvaWQgbG9nZ2luZyBkdXJpbmcgc2lkZS1lZmZlY3QgZnJlZVxuLy8gcmVwbGF5aW5nIG9uIHJlbmRlciBmdW5jdGlvbi4gVGhpcyBjdXJyZW50bHkgb25seSBwYXRjaGVzIHRoZSBvYmplY3Rcbi8vIGxhemlseSB3aGljaCB3b24ndCBjb3ZlciBpZiB0aGUgbG9nIGZ1bmN0aW9uIHdhcyBleHRyYWN0ZWQgZWFnZXJseS5cbi8vIFdlIGNvdWxkIGFsc28gZWFnZXJseSBwYXRjaCB0aGUgbWV0aG9kLlxudmFyIGRpc2FibGVkRGVwdGggPSAwO1xudmFyIHByZXZMb2c7XG52YXIgcHJldkluZm87XG52YXIgcHJldldhcm47XG52YXIgcHJldkVycm9yO1xudmFyIHByZXZHcm91cDtcbnZhciBwcmV2R3JvdXBDb2xsYXBzZWQ7XG52YXIgcHJldkdyb3VwRW5kO1xuXG5mdW5jdGlvbiBkaXNhYmxlZExvZygpIHt9XG5cbmRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9IHRydWU7XG5mdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAge1xuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgIHByZXZJbmZvID0gY29uc29sZS5pbmZvO1xuICAgICAgcHJldldhcm4gPSBjb25zb2xlLndhcm47XG4gICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgcHJldkdyb3VwID0gY29uc29sZS5ncm91cDtcbiAgICAgIHByZXZHcm91cENvbGxhcHNlZCA9IGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQ7XG4gICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kOyAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5MDk5XG5cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGluZm86IHByb3BzLFxuICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICB3YXJuOiBwcm9wcyxcbiAgICAgICAgZXJyb3I6IHByb3BzLFxuICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBFbmQ6IHByb3BzXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgZGlzYWJsZWREZXB0aCsrO1xuICB9XG59XG5mdW5jdGlvbiByZWVuYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBkaXNhYmxlZERlcHRoLS07XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgbG9nOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2TG9nXG4gICAgICAgIH0pLFxuICAgICAgICBpbmZvOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2SW5mb1xuICAgICAgICB9KSxcbiAgICAgICAgd2FybjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldldhcm5cbiAgICAgICAgfSksXG4gICAgICAgIGVycm9yOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2RXJyb3JcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwQ29sbGFwc2VkOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWRcbiAgICAgICAgfSksXG4gICAgICAgIGdyb3VwRW5kOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2R3JvdXBFbmRcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWREZXB0aCA8IDApIHtcbiAgICAgIGVycm9yKCdkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG52YXIgcHJlZml4O1xuZnVuY3Rpb24gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSwgc291cmNlLCBvd25lckZuKSB7XG4gIHtcbiAgICBpZiAocHJlZml4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEV4dHJhY3QgdGhlIFZNIHNwZWNpZmljIHByZWZpeCB1c2VkIGJ5IGVhY2ggbGluZS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHguc3RhY2sudHJpbSgpLm1hdGNoKC9cXG4oICooYXQgKT8pLyk7XG4gICAgICAgIHByZWZpeCA9IG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xuICAgICAgfVxuICAgIH0gLy8gV2UgdXNlIHRoZSBwcmVmaXggdG8gZW5zdXJlIG91ciBzdGFja3MgbGluZSB1cCB3aXRoIG5hdGl2ZSBzdGFjayBmcmFtZXMuXG5cblxuICAgIHJldHVybiAnXFxuJyArIHByZWZpeCArIG5hbWU7XG4gIH1cbn1cbnZhciByZWVudHJ5ID0gZmFsc2U7XG52YXIgY29tcG9uZW50RnJhbWVDYWNoZTtcblxue1xuICB2YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuICBjb21wb25lbnRGcmFtZUNhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBjb25zdHJ1Y3QpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGFza2VkIGZvciBhIHN0YWNrIGluc2lkZSBhIGZha2UgcmVuZGVyLCBpdCBzaG91bGQgZ2V0IGlnbm9yZWQuXG4gIGlmICghZm4gfHwgcmVlbnRyeSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHtcbiAgICB2YXIgZnJhbWUgPSBjb21wb25lbnRGcmFtZUNhY2hlLmdldChmbik7XG5cbiAgICBpZiAoZnJhbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZyYW1lO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb250cm9sO1xuICByZWVudHJ5ID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2UgPSBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZTsgLy8gJEZsb3dGaXhNZSBJdCBkb2VzIGFjY2VwdCB1bmRlZmluZWQuXG5cbiAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB1bmRlZmluZWQ7XG4gIHZhciBwcmV2aW91c0Rpc3BhdGNoZXI7XG5cbiAge1xuICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IG51bGw7XG4gICAgZGlzYWJsZUxvZ3MoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBzaG91bGQgdGhyb3cuXG4gICAgaWYgKGNvbnN0cnVjdCkge1xuICAgICAgLy8gU29tZXRoaW5nIHNob3VsZCBiZSBzZXR0aW5nIHRoZSBwcm9wcyBpbiB0aGUgY29uc3RydWN0b3IuXG4gICAgICB2YXIgRmFrZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH07IC8vICRGbG93Rml4TWVcblxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRmFrZS5wcm90b3R5cGUsICdwcm9wcycsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gV2UgdXNlIGEgdGhyb3dpbmcgc2V0dGVyIGluc3RlYWQgb2YgZnJvemVuIG9yIG5vbi13cml0YWJsZSBwcm9wc1xuICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCB3b24ndCB0aHJvdyBpbiBhIG5vbi1zdHJpY3QgbW9kZSBmdW5jdGlvbi5cbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAnb2JqZWN0JyAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAvLyBXZSBjb25zdHJ1Y3QgYSBkaWZmZXJlbnQgY29udHJvbCBmb3IgdGhpcyBjYXNlIHRvIGluY2x1ZGUgYW55IGV4dHJhXG4gICAgICAgIC8vIGZyYW1lcyBhZGRlZCBieSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgfVxuXG4gICAgICBmbigpO1xuICAgIH1cbiAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgLy8gVGhpcyBpcyBpbmxpbmVkIG1hbnVhbGx5IGJlY2F1c2UgY2xvc3VyZSBkb2Vzbid0IGRvIGl0IGZvciB1cy5cbiAgICBpZiAoc2FtcGxlICYmIGNvbnRyb2wgJiYgdHlwZW9mIHNhbXBsZS5zdGFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlIGZpcnN0IGZyYW1lIGZyb20gdGhlIHNhbXBsZSB0aGF0IGlzbid0IGFsc28gaW4gdGhlIGNvbnRyb2wuXG4gICAgICAvLyBTa2lwcGluZyBvbmUgZnJhbWUgdGhhdCB3ZSBhc3N1bWUgaXMgdGhlIGZyYW1lIHRoYXQgY2FsbHMgdGhlIHR3by5cbiAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZS5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgY29udHJvbExpbmVzID0gY29udHJvbC5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICB2YXIgcyA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgYyA9IGNvbnRyb2xMaW5lcy5sZW5ndGggLSAxO1xuXG4gICAgICB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCAmJiBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgIC8vIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgc3RhY2sgZnJhbWUgdG8gYmUgc2hhcmVkLlxuICAgICAgICAvLyBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIHRoZSByb290IG1vc3Qgb25lLiBIb3dldmVyLCBzdGFjayBmcmFtZXMgbWF5IGJlXG4gICAgICAgIC8vIGN1dCBvZmYgZHVlIHRvIG1heGltdW0gc3RhY2sgbGltaXRzLiBJbiB0aGlzIGNhc2UsIG9uZSBtYXliZSBjdXQgb2ZmXG4gICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgb3RoZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGUgaXMgbG9uZ2VyIG9yIHRoZSBzYW1lXG4gICAgICAgIC8vIGFuZCB0aGVyZSBmb3IgY3V0IG9mZiBlYXJsaWVyLiBTbyB3ZSBzaG91bGQgZmluZCB0aGUgcm9vdCBtb3N0IGZyYW1lIGluXG4gICAgICAgIC8vIHRoZSBzYW1wbGUgc29tZXdoZXJlIGluIHRoZSBjb250cm9sLlxuICAgICAgICBjLS07XG4gICAgICB9XG5cbiAgICAgIGZvciAoOyBzID49IDEgJiYgYyA+PSAwOyBzLS0sIGMtLSkge1xuICAgICAgICAvLyBOZXh0IHdlIGZpbmQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHdoaWNoIHNob3VsZCBiZSB0aGVcbiAgICAgICAgLy8gZnJhbWUgdGhhdCBjYWxsZWQgb3VyIHNhbXBsZSBmdW5jdGlvbiBhbmQgdGhlIGNvbnRyb2wuXG4gICAgICAgIGlmIChzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgLy8gSW4gVjgsIHRoZSBmaXJzdCBsaW5lIGlzIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgYnV0IG90aGVyIFZNcyBkb24ndC5cbiAgICAgICAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byByZXR1cm4gdGhlIGZpcnN0IGxpbmUsIGFuZCB0aGUgY29udHJvbCBpcyBhbHNvIG9uIHRoZSBzYW1lXG4gICAgICAgICAgLy8gbGluZSwgdGhhdCdzIGEgcHJldHR5IGdvb2QgaW5kaWNhdG9yIHRoYXQgb3VyIHNhbXBsZSB0aHJldyBhdCBzYW1lIGxpbmUgYXNcbiAgICAgICAgICAvLyB0aGUgY29udHJvbC4gSS5lLiBiZWZvcmUgd2UgZW50ZXJlZCB0aGUgc2FtcGxlIGZyYW1lLiBTbyB3ZSBpZ25vcmUgdGhpcyByZXN1bHQuXG4gICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBwYXNzZWQgYSBjbGFzcyB0byBmdW5jdGlvbiBjb21wb25lbnQsIG9yIG5vbi1mdW5jdGlvbi5cbiAgICAgICAgICBpZiAocyAhPT0gMSB8fCBjICE9PSAxKSB7XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIHMtLTtcbiAgICAgICAgICAgICAgYy0tOyAvLyBXZSBtYXkgc3RpbGwgaGF2ZSBzaW1pbGFyIGludGVybWVkaWF0ZSBmcmFtZXMgZnJvbSB0aGUgY29uc3RydWN0IGNhbGwuXG4gICAgICAgICAgICAgIC8vIFRoZSBuZXh0IG9uZSB0aGF0IGlzbid0IHRoZSBzYW1lIHNob3VsZCBiZSBvdXIgbWF0Y2ggdGhvdWdoLlxuXG4gICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBzYW1wbGVMaW5lc1tzXSAhPT0gY29udHJvbExpbmVzW2NdKSB7XG4gICAgICAgICAgICAgICAgLy8gVjggYWRkcyBhIFwibmV3XCIgcHJlZml4IGZvciBuYXRpdmUgY2xhc3Nlcy4gTGV0J3MgcmVtb3ZlIGl0IHRvIG1ha2UgaXQgcHJldHRpZXIuXG4gICAgICAgICAgICAgICAgdmFyIF9mcmFtZSA9ICdcXG4nICsgc2FtcGxlTGluZXNbc10ucmVwbGFjZSgnIGF0IG5ldyAnLCAnIGF0ICcpO1xuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgX2ZyYW1lKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IC8vIFJldHVybiB0aGUgbGluZSB3ZSBmb3VuZC5cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mcmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSB3aGlsZSAocyA+PSAxICYmIGMgPj0gMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgcmVlbnRyeSA9IGZhbHNlO1xuXG4gICAge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2aW91c0Rpc3BhdGNoZXI7XG4gICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICB9XG5cbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXZpb3VzUHJlcGFyZVN0YWNrVHJhY2U7XG4gIH0gLy8gRmFsbGJhY2sgdG8ganVzdCB1c2luZyB0aGUgbmFtZSBpZiB3ZSBjb3VsZG4ndCBtYWtlIGl0IHRocm93LlxuXG5cbiAgdmFyIG5hbWUgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiAnJztcbiAgdmFyIHN5bnRoZXRpY0ZyYW1lID0gbmFtZSA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIDogJyc7XG5cbiAge1xuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBzeW50aGV0aWNGcmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN5bnRoZXRpY0ZyYW1lO1xufVxuZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZuLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZuLCBmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICB2YXIgcHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbiAgcmV0dXJuICEhKHByb3RvdHlwZSAmJiBwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLCBzb3VyY2UsIG93bmVyRm4pIHtcblxuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAge1xuICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUodHlwZSwgc2hvdWxkQ29uc3RydWN0KHR5cGUpKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBleHBvcnRzLlN1c3BlbnNlOlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZScpO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlTGlzdCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgIC8vIE1lbW8gbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgIHJldHVybiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZS50eXBlLCBzb3VyY2UsIG93bmVyRm4pO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5fcmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGF6eUNvbXBvbmVudCA9IHR5cGU7XG4gICAgICAgICAgdmFyIHBheWxvYWQgPSBsYXp5Q29tcG9uZW50Ll9wYXlsb2FkO1xuICAgICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBMYXp5IG1heSBjb250YWluIGFueSBjb21wb25lbnQgdHlwZSBzbyB3ZSByZWN1cnNpdmVseSByZXNvbHZlIGl0LlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihpbml0KHBheWxvYWQpLCBzb3VyY2UsIG93bmVyRm4pO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbnZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrUHJvcFR5cGVzKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCkge1xuICB7XG4gICAgLy8gJEZsb3dGaXhNZSBUaGlzIGlzIG9rYXkgYnV0IEZsb3cgZG9lc24ndCBrbm93IGl0LlxuICAgIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAoaGFzKHR5cGVTcGVjcywgdHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IkMSA9IHZvaWQgMDsgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogJyArIGxvY2F0aW9uICsgJyB0eXBlIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgJyArICdpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UsIGJ1dCByZWNlaXZlZCBgJyArIHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSArICdgLicgKyAnVGhpcyBvZnRlbiBoYXBwZW5zIGJlY2F1c2Ugb2YgdHlwb3Mgc3VjaCBhcyBgUHJvcFR5cGVzLmZ1bmN0aW9uYCBpbnN0ZWFkIG9mIGBQcm9wVHlwZXMuZnVuY2AuJyk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvciQxID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciQxID0gZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSAmJiAhKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzJyArICcgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yJDEpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IkMS5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvciQxLm1lc3NhZ2VdID0gdHJ1ZTtcbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgIGVycm9yKCdGYWlsZWQgJXMgdHlwZTogJXMnLCBsb2NhdGlvbiwgZXJyb3IkMS5tZXNzYWdlKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duO1xuXG57XG4gIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpIHtcbiAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKTtcblxuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgeW91ciBjb2RlIGF0ICcgKyBmaWxlTmFtZSArICc6JyArIGxpbmVOdW1iZXIgKyAnLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMoZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzLl9fc291cmNlKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG5cblxudmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICBpZiAoIWluZm8pIHtcbiAgICB2YXIgcGFyZW50TmFtZSA9IHR5cGVvZiBwYXJlbnRUeXBlID09PSAnc3RyaW5nJyA/IHBhcmVudFR5cGUgOiBwYXJlbnRUeXBlLmRpc3BsYXlOYW1lIHx8IHBhcmVudFR5cGUubmFtZTtcblxuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudE5hbWUgKyBcIj4uXCI7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gIGlmICghZWxlbWVudC5fc3RvcmUgfHwgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkIHx8IGVsZW1lbnQua2V5ICE9IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG5cbiAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5fb3duZXIgJiYgZWxlbWVudC5fb3duZXIgIT09IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICBjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBnZXRDb21wb25lbnROYW1lKGVsZW1lbnQuX293bmVyLnR5cGUpICsgXCIuXCI7XG4gIH1cblxuICB7XG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KTtcblxuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8sIGNoaWxkT3duZXIpO1xuXG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgfVxufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcblxuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFR5cGVzO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCAvLyBOb3RlOiBNZW1vIG9ubHkgY2hlY2tzIG91dGVyIHByb3BzIGhlcmUuXG4gICAgLy8gSW5uZXIgcHJvcHMgYXJlIGNoZWNrZWQgaW4gdGhlIHJlY29uY2lsZXIuXG4gICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSkge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcFR5cGVzKSB7XG4gICAgICAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuICAgICAgY2hlY2tQcm9wVHlwZXMocHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTsgLy8gSW50ZW50aW9uYWxseSBpbnNpZGUgdG8gYXZvaWQgdHJpZ2dlcmluZyBsYXp5IGluaXRpYWxpemVyczpcblxuICAgICAgdmFyIF9uYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIF9uYW1lIHx8ICdVbmtub3duJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiAhdHlwZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQpIHtcbiAgICAgIGVycm9yKCdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJyk7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdpdmVuIGEgZnJhZ21lbnQsIHZhbGlkYXRlIHRoYXQgaXQgY2FuIG9ubHkgYmUgcHJvdmlkZWQgd2l0aCBmcmFnbWVudCBwcm9wc1xuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGZyYWdtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZnJhZ21lbnQpIHtcbiAge1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGZyYWdtZW50KTtcblxuICAgICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIGByZWZgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuJyk7XG5cbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciB2YWxpZFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSk7IC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgXCJpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKHByb3BzKTtcblxuICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGVTdHJpbmc7XG5cbiAgICBpZiAodHlwZSA9PT0gbnVsbCkge1xuICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnYXJyYXknO1xuICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgdHlwZVN0cmluZyA9IFwiPFwiICsgKGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKSB8fCAnVW5rbm93bicpICsgXCIgLz5cIjtcbiAgICAgIGluZm8gPSAnIERpZCB5b3UgYWNjaWRlbnRhbGx5IGV4cG9ydCBhIEpTWCBsaXRlcmFsIGluc3RlYWQgb2YgYSBjb21wb25lbnQ/JztcbiAgICB9IGVsc2Uge1xuICAgICAgdHlwZVN0cmluZyA9IHR5cGVvZiB0eXBlO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGVTdHJpbmcsIGluZm8pO1xuICAgIH1cbiAgfVxuXG4gIHZhciBlbGVtZW50ID0gY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG5cblxuICBpZiAodmFsaWRUeXBlKSB7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGUgPT09IGV4cG9ydHMuRnJhZ21lbnQpIHtcbiAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbnZhciBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IGZhbHNlO1xuZnVuY3Rpb24gY3JlYXRlRmFjdG9yeVdpdGhWYWxpZGF0aW9uKHR5cGUpIHtcbiAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24uYmluZChudWxsLCB0eXBlKTtcbiAgdmFsaWRhdGVkRmFjdG9yeS50eXBlID0gdHlwZTtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSkge1xuICAgICAgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdSZWFjdC5jcmVhdGVGYWN0b3J5KCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gQ29uc2lkZXIgdXNpbmcgSlNYICcgKyAnb3IgdXNlIFJlYWN0LmNyZWF0ZUVsZW1lbnQoKSBkaXJlY3RseSBpbnN0ZWFkLicpO1xuICAgIH0gLy8gTGVnYWN5IGhvb2s6IHJlbW92ZSBpdFxuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsaWRhdGVkRmFjdG9yeSwgJ3R5cGUnLCB7XG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB3YXJuKCdGYWN0b3J5LnR5cGUgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHRoZSBjbGFzcyBkaXJlY3RseSAnICsgJ2JlZm9yZSBwYXNzaW5nIGl0IHRvIGNyZWF0ZUZhY3RvcnkuJyk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge1xuICAgICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5O1xufVxuZnVuY3Rpb24gY2xvbmVFbGVtZW50V2l0aFZhbGlkYXRpb24oZWxlbWVudCwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gIHZhciBuZXdFbGVtZW50ID0gY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQudHlwZSk7XG4gIH1cblxuICB2YWxpZGF0ZVByb3BUeXBlcyhuZXdFbGVtZW50KTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG5cbntcblxuICB0cnkge1xuICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1uZXcgKi9cblxuICAgIG5ldyBNYXAoW1tmcm96ZW5PYmplY3QsIG51bGxdXSk7XG4gICAgbmV3IFNldChbZnJvemVuT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbnZhciBjcmVhdGVFbGVtZW50JDEgPSAgY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjbG9uZUVsZW1lbnQkMSA9ICBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY3JlYXRlRmFjdG9yeSA9ICBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24gO1xudmFyIENoaWxkcmVuID0ge1xuICBtYXA6IG1hcENoaWxkcmVuLFxuICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sXG4gIGNvdW50OiBjb3VudENoaWxkcmVuLFxuICB0b0FycmF5OiB0b0FycmF5LFxuICBvbmx5OiBvbmx5Q2hpbGRcbn07XG5cbmV4cG9ydHMuQ2hpbGRyZW4gPSBDaGlsZHJlbjtcbmV4cG9ydHMuQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuZXhwb3J0cy5QdXJlQ29tcG9uZW50ID0gUHVyZUNvbXBvbmVudDtcbmV4cG9ydHMuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQgPSBSZWFjdFNoYXJlZEludGVybmFscztcbmV4cG9ydHMuY2xvbmVFbGVtZW50ID0gY2xvbmVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0O1xuZXhwb3J0cy5jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeTtcbmV4cG9ydHMuY3JlYXRlUmVmID0gY3JlYXRlUmVmO1xuZXhwb3J0cy5mb3J3YXJkUmVmID0gZm9yd2FyZFJlZjtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnQgPSBpc1ZhbGlkRWxlbWVudDtcbmV4cG9ydHMubGF6eSA9IGxhenk7XG5leHBvcnRzLm1lbW8gPSBtZW1vO1xuZXhwb3J0cy51c2VDYWxsYmFjayA9IHVzZUNhbGxiYWNrO1xuZXhwb3J0cy51c2VDb250ZXh0ID0gdXNlQ29udGV4dDtcbmV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IHVzZURlYnVnVmFsdWU7XG5leHBvcnRzLnVzZUVmZmVjdCA9IHVzZUVmZmVjdDtcbmV4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZSA9IHVzZUltcGVyYXRpdmVIYW5kbGU7XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IHVzZUxheW91dEVmZmVjdDtcbmV4cG9ydHMudXNlTWVtbyA9IHVzZU1lbW87XG5leHBvcnRzLnVzZVJlZHVjZXIgPSB1c2VSZWR1Y2VyO1xuZXhwb3J0cy51c2VSZWYgPSB1c2VSZWY7XG5leHBvcnRzLnVzZVN0YXRlID0gdXNlU3RhdGU7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiIsInZhciBhcGkgPSByZXF1aXJlKFwiIS4uL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1zdHlsZS1sb2FkZXIvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uL25leHQvZGlzdC9jb21waWxlZC9jc3MtbG9hZGVyL2Nqcy5qcz8/cmVmLS01LW9uZU9mLTUtMSEuLi9uZXh0L2Rpc3QvY29tcGlsZWQvcG9zdGNzcy1sb2FkZXIvY2pzLmpzPz9yZWYtLTUtb25lT2YtNS0yIS4vc2VtYW50aWMubWluLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IGZ1bmN0aW9uKGVsZW1lbnQpey8vIFRoZXNlIGVsZW1lbnRzIHNob3VsZCBhbHdheXMgZXhpc3QuIElmIHRoZXkgZG8gbm90LFxuLy8gdGhpcyBjb2RlIHNob3VsZCBmYWlsLlxudmFyIGFuY2hvckVsZW1lbnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI19fbmV4dF9jc3NfX0RPX05PVF9VU0VfXycpO3ZhciBwYXJlbnROb2RlPWFuY2hvckVsZW1lbnQucGFyZW50Tm9kZTsvLyBOb3JtYWxseSA8aGVhZD5cbi8vIEVhY2ggc3R5bGUgdGFnIHNob3VsZCBiZSBwbGFjZWQgcmlnaHQgYmVmb3JlIG91clxuLy8gYW5jaG9yLiBCeSBpbnNlcnRpbmcgYmVmb3JlIGFuZCBub3QgYWZ0ZXIsIHdlIGRvIG5vdFxuLy8gbmVlZCB0byB0cmFjayB0aGUgbGFzdCBpbnNlcnRlZCBlbGVtZW50LlxucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbWVudCxhbmNob3JFbGVtZW50KTt9O1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5pZiAobW9kdWxlLmhvdCkge1xuICBpZiAoIWNvbnRlbnQubG9jYWxzIHx8IG1vZHVsZS5ob3QuaW52YWxpZGF0ZSkge1xuICAgIHZhciBpc0VxdWFsTG9jYWxzID0gZnVuY3Rpb24gaXNFcXVhbExvY2FscyhhLGIsaXNOYW1lZEV4cG9ydCl7aWYoIWEmJmJ8fGEmJiFiKXtyZXR1cm4gZmFsc2U7fWxldCBwO2ZvcihwIGluIGEpe2lmKGlzTmFtZWRFeHBvcnQmJnA9PT0nZGVmYXVsdCcpey8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZVxuY29udGludWU7fWlmKGFbcF0hPT1iW3BdKXtyZXR1cm4gZmFsc2U7fX1mb3IocCBpbiBiKXtpZihpc05hbWVkRXhwb3J0JiZwPT09J2RlZmF1bHQnKXsvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udGludWVcbmNvbnRpbnVlO31pZighYVtwXSl7cmV0dXJuIGZhbHNlO319cmV0dXJuIHRydWU7fTtcbiAgICB2YXIgb2xkTG9jYWxzID0gY29udGVudC5sb2NhbHM7XG5cbiAgICBtb2R1bGUuaG90LmFjY2VwdChcbiAgICAgIFwiISEuLi9uZXh0L2Rpc3QvY29tcGlsZWQvY3NzLWxvYWRlci9janMuanM/P3JlZi0tNS1vbmVPZi01LTEhLi4vbmV4dC9kaXN0L2NvbXBpbGVkL3Bvc3Rjc3MtbG9hZGVyL2Nqcy5qcz8/cmVmLS01LW9uZU9mLTUtMiEuL3NlbWFudGljLm1pbi5jc3NcIixcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uL25leHQvZGlzdC9jb21waWxlZC9jc3MtbG9hZGVyL2Nqcy5qcz8/cmVmLS01LW9uZU9mLTUtMSEuLi9uZXh0L2Rpc3QvY29tcGlsZWQvcG9zdGNzcy1sb2FkZXIvY2pzLmpzPz9yZWYtLTUtb25lT2YtNS0yIS4vc2VtYW50aWMubWluLmNzc1wiKTtcblxuICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCFpc0VxdWFsTG9jYWxzKG9sZExvY2FscywgY29udGVudC5sb2NhbHMpKSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmhvdC5pbnZhbGlkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBvbGRMb2NhbHMgPSBjb250ZW50LmxvY2FscztcblxuICAgICAgICAgICAgICB1cGRhdGUoY29udGVudCk7XG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgbW9kdWxlLmhvdC5kaXNwb3NlKGZ1bmN0aW9uKCkge1xuICAgIHVwZGF0ZSgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwic3RhdGljL21lZGlhL2JyYW5kLWljb25zLmQ2OGZhM2U2N2RiYjY1M2ExM2NlYzQ0YjFiY2FiY2ZlLmVvdFwiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvbWVkaWEvYnJhbmQtaWNvbnMuNjcyOWQyOTc1M2UwMDBjMTc0ODllZDQzMTM1YmE4ZDUuc3ZnXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9icmFuZC1pY29ucy42NWEyZmI2ZDlhYWExNjRiNDFhMDM5MzAyMDkzOTk1Yi50dGZcIjsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwic3RhdGljL21lZGlhL2JyYW5kLWljb25zLmNhYzg3ZGMwMGM4N2E1ZDc0NzExZDAyNzY3MTM4MDhhLndvZmZcIjsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwic3RhdGljL21lZGlhL2JyYW5kLWljb25zLjI3ODE1NmU0MWUwYWQ5MDhjZjdmODQxYjE3MTMwNTAyLndvZmYyXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9pY29ucy5hMDFlM2YyZDZjODNkYzNhZWUxNzVlMjQ4MmIzZjc3Ny5lb3RcIjsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwic3RhdGljL21lZGlhL2ljb25zLjYyZDlkYWU0ZTAwNDBlODFjOTgwOTUwMDAzZGYwZTA3LnN2Z1wiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvbWVkaWEvaWNvbnMuYzY1NmI4Y2FhNDU0ZWQxOWI5YTJlZjdmNGY1YjhmZWEudHRmXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9pY29ucy40MjUzOTlmODFlNGNlN2NiZDk2NzY4NTQwMmJhMDI2MC53b2ZmXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9pY29ucy4zOGM2ZDhiYWIyNmRiNzdkOGM4MDY4MTNlMTQ5Nzc2My53b2ZmMlwiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvbWVkaWEvb3V0bGluZS1pY29ucy43NTI5MDVmYTVlZGYyMWZjNTJhMTBhMGMxY2E5YzdhNC5lb3RcIjsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwic3RhdGljL21lZGlhL291dGxpbmUtaWNvbnMuOWM0ODQ1YjRiNDFlZjQwYTIyZmFlZTc2MTQ0ZmE4MTYuc3ZnXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9vdXRsaW5lLWljb25zLjUzNjcxMDM1MTBiMjdiNzg0ODI3OTQ1OTBlMWNlM2IwLnR0ZlwiOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJzdGF0aWMvbWVkaWEvb3V0bGluZS1pY29ucy5kZGFlOWIxYmE5YjBiNDJmNTg4MDk5MDRiMGIyMTM0OS53b2ZmXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9vdXRsaW5lLWljb25zLjY4N2E0OTkwZWEyMmJiMWE0OWQ0NjlhNWQ5MzE5NzkwLndvZmYyXCI7IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcInN0YXRpYy9tZWRpYS9mbGFncy45OWY2M2FlN2E3NDNmMjFhYjMwODQ3ZWQwNmE2OThkOS5wbmdcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgdHlwZSB7IEFwcFByb3BzIH0gZnJvbSAnbmV4dC9hcHAnO1xyXG5pbXBvcnQgSGVhZCBmcm9tICduZXh0L2hlYWQnO1xyXG5pbXBvcnQgJ3NlbWFudGljLXVpLWNzcy9zZW1hbnRpYy5taW4uY3NzJ1xyXG5cclxuZnVuY3Rpb24gTXlBcHAoeyBDb21wb25lbnQsIHBhZ2VQcm9wcyB9OiBBcHBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgcmV0dXJuIChcclxuICAgIDw+XHJcbiAgICAgIDxIZWFkPlxyXG4gICAgICAgIDx0aXRsZT5Sb3BzdGVuIEZhdWNldDwvdGl0bGU+XHJcbiAgICAgIDwvSGVhZD5cclxuICAgICAgPENvbXBvbmVudCB7Li4ucGFnZVByb3BzfSAvPlxyXG4gICAgPC8+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTXlBcHA7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/static/chunks/pages/_error.js b/.next/static/chunks/pages/_error.js new file mode 100644 index 0000000..8c421de --- /dev/null +++ b/.next/static/chunks/pages/_error.js @@ -0,0 +1,3750 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["pages/_error"],{ + +/***/ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayLikeToArray.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +module.exports = _arrayLikeToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js"); + +function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return arrayLikeToArray(arr); +} + +module.exports = _arrayWithoutHoles; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/assertThisInitialized.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +module.exports = _assertThisInitialized; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/classCallCheck.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/classCallCheck.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +module.exports = _classCallCheck; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/createClass.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/createClass.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +module.exports = _createClass; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/defineProperty.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/defineProperty.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +module.exports = _defineProperty; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/getPrototypeOf.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _getPrototypeOf(o) { + module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +module.exports = _getPrototypeOf; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/inherits.js": +/*!*********************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/inherits.js ***! + \*********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js"); + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) setPrototypeOf(subClass, superClass); +} + +module.exports = _inherits; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/interopRequireDefault.js ***! + \**********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +module.exports = _interopRequireDefault; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/iterableToArray.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/iterableToArray.js ***! + \****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); +} + +module.exports = _iterableToArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/nonIterableSpread.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/nonIterableSpread.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +module.exports = _nonIterableSpread; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***! + \**************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "./node_modules/@babel/runtime/helpers/typeof.js"); + +var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); + +function _possibleConstructorReturn(self, call) { + if (call && (_typeof(call) === "object" || typeof call === "function")) { + return call; + } + + return assertThisInitialized(self); +} + +module.exports = _possibleConstructorReturn; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/setPrototypeOf.js": +/*!***************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/setPrototypeOf.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _setPrototypeOf(o, p) { + module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +module.exports = _setPrototypeOf; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/toConsumableArray.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/toConsumableArray.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js"); + +var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "./node_modules/@babel/runtime/helpers/iterableToArray.js"); + +var unsupportedIterableToArray = __webpack_require__(/*! ./unsupportedIterableToArray */ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js"); + +var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "./node_modules/@babel/runtime/helpers/nonIterableSpread.js"); + +function _toConsumableArray(arr) { + return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread(); +} + +module.exports = _toConsumableArray; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/typeof.js": +/*!*******************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/typeof.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + module.exports = _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + module.exports = _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +module.exports = _typeof; + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayLikeToArray = __webpack_require__(/*! ./arrayLikeToArray */ "./node_modules/@babel/runtime/helpers/arrayLikeToArray.js"); + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen); +} + +module.exports = _unsupportedIterableToArray; + +/***/ }), + +/***/ "./node_modules/next/dist/build/polyfills/object-assign.js": +/*!*****************************************************************!*\ + !*** ./node_modules/next/dist/build/polyfills/object-assign.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +var assign=Object.assign.bind(Object);module.exports=assign;module.exports.default=module.exports; +//# sourceMappingURL=object-assign.js.map + +/***/ }), + +/***/ "./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F_error&absolutePagePath=next%2Fdist%2Fpages%2F_error!./": +/*!***********************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F_error&absolutePagePath=next%2Fdist%2Fpages%2F_error ***! + \***********************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + + + (window.__NEXT_P = window.__NEXT_P || []).push([ + "/_error", + function () { + return __webpack_require__(/*! next/dist/pages/_error */ "./node_modules/next/dist/pages/_error.js"); + } + ]); + + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/module.js": +/*!***********************************!*\ + !*** (webpack)/webpack/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 880: +/***/ (function(module) { + +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(880); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/amp-context.js": +/*!***************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/amp-context.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.AmpStateContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var AmpStateContext = /*#__PURE__*/_react["default"].createContext({}); + +exports.AmpStateContext = AmpStateContext; + +if (true) { + AmpStateContext.displayName = 'AmpStateContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/amp.js": +/*!*******************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/amp.js ***! + \*******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _s = $RefreshSig$(); + +exports.__esModule = true; +exports.isInAmpMode = isInAmpMode; +exports.useAmp = useAmp; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _ampContext = __webpack_require__(/*! ./amp-context */ "./node_modules/next/dist/next-server/lib/amp-context.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +function isInAmpMode() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref$ampFirst = _ref.ampFirst, + ampFirst = _ref$ampFirst === void 0 ? false : _ref$ampFirst, + _ref$hybrid = _ref.hybrid, + hybrid = _ref$hybrid === void 0 ? false : _ref$hybrid, + _ref$hasQuery = _ref.hasQuery, + hasQuery = _ref$hasQuery === void 0 ? false : _ref$hasQuery; + + return ampFirst || hybrid && hasQuery; +} + +function useAmp() { + _s(); + + // Don't assign the context value to a variable to save bytes + return isInAmpMode(_react["default"].useContext(_ampContext.AmpStateContext)); +} + +_s(useAmp, "gDsCjeeItUuvgOWf1v4qoK9RF6k="); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/head-manager-context.js": +/*!************************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/head-manager-context.js ***! + \************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +exports.__esModule = true; +exports.HeadManagerContext = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +var HeadManagerContext = /*#__PURE__*/_react["default"].createContext({}); + +exports.HeadManagerContext = HeadManagerContext; + +if (true) { + HeadManagerContext.displayName = 'HeadManagerContext'; +} + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/head.js": +/*!********************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/head.js ***! + \********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _defineProperty = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/defineProperty */ "./node_modules/@babel/runtime/helpers/defineProperty.js"); + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +exports.__esModule = true; +exports.defaultHead = defaultHead; +exports["default"] = void 0; + +var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _sideEffect = _interopRequireDefault(__webpack_require__(/*! ./side-effect */ "./node_modules/next/dist/next-server/lib/side-effect.js")); + +var _ampContext = __webpack_require__(/*! ./amp-context */ "./node_modules/next/dist/next-server/lib/amp-context.js"); + +var _headManagerContext = __webpack_require__(/*! ./head-manager-context */ "./node_modules/next/dist/next-server/lib/head-manager-context.js"); + +var _amp = __webpack_require__(/*! ./amp */ "./node_modules/next/dist/next-server/lib/amp.js"); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { + "default": obj + }; +} + +function _getRequireWildcardCache() { + if (typeof WeakMap !== "function") return null; + var cache = new WeakMap(); + + _getRequireWildcardCache = function _getRequireWildcardCache() { + return cache; + }; + + return cache; +} + +function _interopRequireWildcard(obj) { + if (obj && obj.__esModule) { + return obj; + } + + if (obj === null || typeof obj !== "object" && typeof obj !== "function") { + return { + "default": obj + }; + } + + var cache = _getRequireWildcardCache(); + + if (cache && cache.has(obj)) { + return cache.get(obj); + } + + var newObj = {}; + var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; + + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; + + if (desc && (desc.get || desc.set)) { + Object.defineProperty(newObj, key, desc); + } else { + newObj[key] = obj[key]; + } + } + } + + newObj["default"] = obj; + + if (cache) { + cache.set(obj, newObj); + } + + return newObj; +} + +function defaultHead() { + var inAmpMode = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var head = [/*#__PURE__*/_react["default"].createElement("meta", { + charSet: "utf-8" + })]; + + if (!inAmpMode) { + head.push( /*#__PURE__*/_react["default"].createElement("meta", { + name: "viewport", + content: "width=device-width" + })); + } + + return head; +} + +function onlyReactElement(list, child) { + // React children can be "string" or "number" in this case we ignore them for backwards compat + if (typeof child === 'string' || typeof child === 'number') { + return list; + } // Adds support for React.Fragment + + + if (child.type === _react["default"].Fragment) { + return list.concat(_react["default"].Children.toArray(child.props.children).reduce(function (fragmentList, fragmentChild) { + if (typeof fragmentChild === 'string' || typeof fragmentChild === 'number') { + return fragmentList; + } + + return fragmentList.concat(fragmentChild); + }, [])); + } + + return list.concat(child); +} + +var METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp']; +/* +returns a function for filtering head child elements +which shouldn't be duplicated, like <title/> +Also adds support for deduplicated `key` properties +*/ + +function unique() { + var keys = new Set(); + var tags = new Set(); + var metaTypes = new Set(); + var metaCategories = {}; + return function (h) { + var isUnique = true; + var hasKey = false; + + if (h.key && typeof h.key !== 'number' && h.key.indexOf('$') > 0) { + hasKey = true; + var key = h.key.slice(h.key.indexOf('$') + 1); + + if (keys.has(key)) { + isUnique = false; + } else { + keys.add(key); + } + } // eslint-disable-next-line default-case + + + switch (h.type) { + case 'title': + case 'base': + if (tags.has(h.type)) { + isUnique = false; + } else { + tags.add(h.type); + } + + break; + + case 'meta': + for (var i = 0, len = METATYPES.length; i < len; i++) { + var metatype = METATYPES[i]; + if (!h.props.hasOwnProperty(metatype)) continue; + + if (metatype === 'charSet') { + if (metaTypes.has(metatype)) { + isUnique = false; + } else { + metaTypes.add(metatype); + } + } else { + var category = h.props[metatype]; + var categories = metaCategories[metatype] || new Set(); + + if ((metatype !== 'name' || !hasKey) && categories.has(category)) { + isUnique = false; + } else { + categories.add(category); + metaCategories[metatype] = categories; + } + } + } + + break; + } + + return isUnique; + }; +} +/** +* +* @param headElements List of multiple <Head> instances +*/ + + +function reduceComponents(headElements, props) { + return headElements.reduce(function (list, headElement) { + var headElementChildren = _react["default"].Children.toArray(headElement.props.children); + + return list.concat(headElementChildren); + }, []).reduce(onlyReactElement, []).reverse().concat(defaultHead(props.inAmpMode)).filter(unique()).reverse().map(function (c, i) { + var key = c.key || i; + + if (false) { var newProps; } + + return /*#__PURE__*/_react["default"].cloneElement(c, { + key: key + }); + }); +} +/** +* This component injects elements to `<head>` of your page. +* To avoid duplicated `tags` in `<head>` you can use the `key` property, which will make sure every tag is only rendered once. +*/ + + +function Head(_ref) { + var children = _ref.children; + var ampState = (0, _react.useContext)(_ampContext.AmpStateContext); + var headManager = (0, _react.useContext)(_headManagerContext.HeadManagerContext); + return /*#__PURE__*/_react["default"].createElement(_sideEffect["default"], { + reduceComponentsToState: reduceComponents, + headManager: headManager, + inAmpMode: (0, _amp.isInAmpMode)(ampState) + }, children); +} // TODO: Remove in the next major release + + +_c = Head; + +Head.rewind = function () {}; + +var _default = Head; +exports["default"] = _default; + +var _c; + +$RefreshReg$(_c, "Head"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/next-server/lib/side-effect.js": +/*!***************************************************************!*\ + !*** ./node_modules/next/dist/next-server/lib/side-effect.js ***! + \***************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _toConsumableArray = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/toConsumableArray */ "./node_modules/@babel/runtime/helpers/toConsumableArray.js"); + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _assertThisInitialized = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/assertThisInitialized.js"); + +var _inherits = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); + +var _possibleConstructorReturn = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); + +var _getPrototypeOf = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +exports.__esModule = true; +exports["default"] = void 0; + +var _react = __webpack_require__(/*! react */ "./node_modules/react/index.js"); + +var isServer = false; + +var _default = /*#__PURE__*/function (_react$Component) { + _inherits(_default, _react$Component); + + var _super = _createSuper(_default); + + function _default(props) { + var _this; + + _classCallCheck(this, _default); + + _this = _super.call(this, props); + _this._hasHeadManager = void 0; + + _this.emitChange = function () { + if (_this._hasHeadManager) { + _this.props.headManager.updateHead(_this.props.reduceComponentsToState(_toConsumableArray(_this.props.headManager.mountedInstances), _this.props)); + } + }; + + _this._hasHeadManager = _this.props.headManager && _this.props.headManager.mountedInstances; + + if (isServer && _this._hasHeadManager) { + _this.props.headManager.mountedInstances.add(_assertThisInitialized(_this)); + + _this.emitChange(); + } + + return _this; + } + + _createClass(_default, [{ + key: "componentDidMount", + value: function componentDidMount() { + if (this._hasHeadManager) { + this.props.headManager.mountedInstances.add(this); + } + + this.emitChange(); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate() { + this.emitChange(); + } + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + if (this._hasHeadManager) { + this.props.headManager.mountedInstances["delete"](this); + } + + this.emitChange(); + } + }, { + key: "render", + value: function render() { + return null; + } + }]); + + return _default; +}(_react.Component); + +exports["default"] = _default; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/pages/_error.js": +/*!************************************************!*\ + !*** ./node_modules/next/dist/pages/_error.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +var _classCallCheck = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/classCallCheck */ "./node_modules/@babel/runtime/helpers/classCallCheck.js"); + +var _createClass = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/createClass */ "./node_modules/@babel/runtime/helpers/createClass.js"); + +var _inherits = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/inherits */ "./node_modules/@babel/runtime/helpers/inherits.js"); + +var _possibleConstructorReturn = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/possibleConstructorReturn */ "./node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); + +var _getPrototypeOf = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/getPrototypeOf */ "./node_modules/@babel/runtime/helpers/getPrototypeOf.js"); + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "./node_modules/@babel/runtime/helpers/interopRequireDefault.js"); + +exports.__esModule = true; +exports["default"] = void 0; + +var _react = _interopRequireDefault(__webpack_require__(/*! react */ "./node_modules/react/index.js")); + +var _head = _interopRequireDefault(__webpack_require__(/*! ../next-server/lib/head */ "./node_modules/next/dist/next-server/lib/head.js")); + +var statusCodes = { + 400: 'Bad Request', + 404: 'This page could not be found', + 405: 'Method Not Allowed', + 500: 'Internal Server Error' +}; + +function _getInitialProps(_ref) { + var res = _ref.res, + err = _ref.err; + var statusCode = res && res.statusCode ? res.statusCode : err ? err.statusCode : 404; + return { + statusCode: statusCode + }; +} +/** +* `Error` component used for handling errors. +*/ + + +var Error = /*#__PURE__*/function (_react$default$Compon) { + _inherits(Error, _react$default$Compon); + + var _super = _createSuper(Error); + + function Error() { + _classCallCheck(this, Error); + + return _super.apply(this, arguments); + } + + _createClass(Error, [{ + key: "render", + value: function render() { + var statusCode = this.props.statusCode; + var title = this.props.title || statusCodes[statusCode] || 'An unexpected error has occurred'; + return /*#__PURE__*/_react["default"].createElement("div", { + style: styles.error + }, /*#__PURE__*/_react["default"].createElement(_head["default"], null, /*#__PURE__*/_react["default"].createElement("title", null, statusCode, ": ", title)), /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("style", { + dangerouslySetInnerHTML: { + __html: 'body { margin: 0 }' + } + }), statusCode ? /*#__PURE__*/_react["default"].createElement("h1", { + style: styles.h1 + }, statusCode) : null, /*#__PURE__*/_react["default"].createElement("div", { + style: styles.desc + }, /*#__PURE__*/_react["default"].createElement("h2", { + style: styles.h2 + }, title, ".")))); + } + }]); + + return Error; +}(_react["default"].Component); + +exports["default"] = Error; +Error.displayName = 'ErrorPage'; +Error.getInitialProps = _getInitialProps; +Error.origGetInitialProps = _getInitialProps; +var styles = { + error: { + color: '#000', + background: '#fff', + fontFamily: '-apple-system, BlinkMacSystemFont, Roboto, "Segoe UI", "Fira Sans", Avenir, "Helvetica Neue", "Lucida Grande", sans-serif', + height: '100vh', + textAlign: 'center', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center' + }, + desc: { + display: 'inline-block', + textAlign: 'left', + lineHeight: '49px', + height: '49px', + verticalAlign: 'middle' + }, + h1: { + display: 'inline-block', + borderRight: '1px solid rgba(0, 0, 0,.3)', + margin: 0, + marginRight: '20px', + padding: '10px 23px 10px 0', + fontSize: '24px', + fontWeight: 500, + verticalAlign: 'top' + }, + h2: { + fontSize: '14px', + fontWeight: 'normal', + lineHeight: 'inherit', + margin: 0, + padding: 0 + } +}; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/react/cjs/react.development.js": +/*!*****************************************************!*\ + !*** ./node_modules/react/cjs/react.development.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +// TODO: this is special because it gets imported during build. +var ReactVersion = '17.0.2'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +exports.Fragment = 0xeacb; +exports.StrictMode = 0xeacc; +exports.Profiler = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +exports.Suspense = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + exports.Fragment = symbolFor('react.fragment'); + exports.StrictMode = symbolFor('react.strict_mode'); + exports.Profiler = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + exports.Suspense = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +/** + * Keeps track of the current dispatcher. + */ +var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +/** + * Keeps track of the current batch's configuration such as how long an update + * should suspend for if it needs to. + */ +var ReactCurrentBatchConfig = { + transition: 0 +}; + +/** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ +var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +var ReactDebugCurrentFrame = {}; +var currentExtraStackFrame = null; +function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } +} + +{ + ReactDebugCurrentFrame.setExtraStackFrame = function (stack) { + { + currentExtraStackFrame = stack; + } + }; // Stack implementation injected by the current renderer. + + + ReactDebugCurrentFrame.getCurrentStack = null; + + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ''; // Add an extra top frame while an element is being validated + + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } // Delegate to the injected renderer-specific implementation + + + var impl = ReactDebugCurrentFrame.getCurrentStack; + + if (impl) { + stack += impl() || ''; + } + + return stack; + }; +} + +/** + * Used by act() to track whether you're inside an act() scope. + */ +var IsSomeRendererActing = { + current: false +}; + +var ReactSharedInternals = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentBatchConfig: ReactCurrentBatchConfig, + ReactCurrentOwner: ReactCurrentOwner, + IsSomeRendererActing: IsSomeRendererActing, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign: _assign +}; + +{ + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; +} + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } +} +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +var didWarnStateUpdateForUnmountedComponent = {}; + +function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; + + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); + + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } +} +/** + * This is the abstract API for an update queue. + */ + + +var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); + } +}; + +var emptyObject = {}; + +{ + Object.freeze(emptyObject); +} +/** + * Base class helpers for the updating state of a component. + */ + + +function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. + + this.updater = updater || ReactNoopUpdateQueue; +} + +Component.prototype.isReactComponent = {}; +/** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + +Component.prototype.setState = function (partialState, callback) { + if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { + { + throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." ); + } + } + + this.updater.enqueueSetState(this, partialState, callback, 'setState'); +}; +/** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + + +Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); +}; +/** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + + +{ + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; + + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); + + return undefined; + } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } +} + +function ComponentDummy() {} + +ComponentDummy.prototype = Component.prototype; +/** + * Convenience component with default shallow equality check for sCU. + */ + +function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; +} + +var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); +pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. + +_assign(pureComponentPrototype, Component.prototype); + +pureComponentPrototype.isPureReactComponent = true; + +// an immutable object with a single mutable value +function createRef() { + var refObject = { + current: null + }; + + { + Object.seal(refObject); + } + + return refObject; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case exports.Fragment: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case exports.Profiler: + return 'Profiler'; + + case exports.StrictMode: + return 'StrictMode'; + + case exports.Suspense: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); +} + +function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); +} + +function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ + +function createElement(type, config, children) { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + + if (hasValidKey(config)) { + key = '' + config.key; + } + + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + + props.children = childArray; + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); +} +function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; +} +/** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ + +function cloneElement(element, config, children) { + if (!!(element === null || element === undefined)) { + { + throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." ); + } + } + + var propName; // Original props are copied + + var props = _assign({}, element.props); // Reserved names are extracted + + + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. + + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + + var source = element._source; // Owner will be preserved, unless ref is overridden + + var owner = element._owner; + + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + + if (hasValidKey(config)) { + key = '' + config.key; + } // Remaining properties override existing props + + + var defaultProps; + + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} + +var SEPARATOR = '.'; +var SUBSEPARATOR = ':'; +/** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ + +function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; +} +/** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + +var didWarnAboutMaps = false; +var userProvidedKeyEscapeRegex = /\/+/g; + +function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, '$&/'); +} +/** + * Generate a key string that identifies a element within a set. + * + * @param {*} element A element that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + + +function getElementKey(element, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof element === 'object' && element !== null && element.key != null) { + // Explicit key + return escape('' + element.key); + } // Implicit key determined by the index in the set + + + return index.toString(36); +} + +function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + var invokeCallback = false; + + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; + + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + + } + } + + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows: + + var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + + if (Array.isArray(mappedChild)) { + var escapedChildKey = ''; + + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + '/'; + } + + mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); + } + + array.push(mappedChild); + } + + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var iterableChildren = children; + + { + // Warn about using Maps as children + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } + + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === 'object') { + var childrenString = '' + children; + + { + { + throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). If you meant to render a collection of children, use an array instead." ); + } + } + } + } + + return subtreeCount; +} + +/** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ +function mapChildren(children, func, context) { + if (children == null) { + return children; + } + + var result = []; + var count = 0; + mapIntoArray(children, result, '', '', function (child) { + return func.call(context, child, count++); + }); + return result; +} +/** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + + +function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; // Don't return anything + }); + return n; +} + +/** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ +function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function () { + forEachFunc.apply(this, arguments); // Don't return anything. + }, forEachContext); +} +/** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ + + +function toArray(children) { + return mapChildren(children, function (child) { + return child; + }) || []; +} +/** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ + + +function onlyChild(children) { + if (!isValidElement(children)) { + { + throw Error( "React.Children.only expected to receive a single React element child." ); + } + } + + return children; +} + +function createContext(defaultValue, calculateChangedBits) { + if (calculateChangedBits === undefined) { + calculateChangedBits = null; + } else { + { + if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') { + error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits); + } + } + } + + var context = { + $$typeof: REACT_CONTEXT_TYPE, + _calculateChangedBits: calculateChangedBits, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context, + _calculateChangedBits: context._calculateChangedBits + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + + error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } + + return context.Consumer; + } + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); + + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + + context.Consumer = Consumer; + } + + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + + return context; +} + +var Uninitialized = -1; +var Pending = 0; +var Resolved = 1; +var Rejected = 2; + +function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); // Transition to the next state. + + var pending = payload; + pending._status = Pending; + pending._result = thenable; + thenable.then(function (moduleObject) { + if (payload._status === Pending) { + var defaultExport = moduleObject.default; + + { + if (defaultExport === undefined) { + error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); + } + } // Transition to the next state. + + + var resolved = payload; + resolved._status = Resolved; + resolved._result = defaultExport; + } + }, function (error) { + if (payload._status === Pending) { + // Transition to the next state. + var rejected = payload; + rejected._status = Rejected; + rejected._result = error; + } + }); + } + + if (payload._status === Resolved) { + return payload._result; + } else { + throw payload._result; + } +} + +function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: -1, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + + { + // In production, this would just set it on the object. + var defaultProps; + var propTypes; // $FlowFixMe + + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); + } + } + }); + } + + return lazyType; +} + +function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); + } + } + + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); + } + } + } + + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (render.displayName == null) { + render.displayName = name; + } + } + }); + } + + return elementType; +} + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableScopeAPI = false; // Experimental Create Event Handle API. + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === exports.Fragment || type === exports.Profiler || type === REACT_DEBUG_TRACING_MODE_TYPE || type === exports.StrictMode || type === exports.Suspense || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { + return true; + } + } + + return false; +} + +function memo(type, compare) { + { + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } + } + + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (type.displayName == null) { + type.displayName = name; + } + } + }); + } + + return elementType; +} + +function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + + if (!(dispatcher !== null)) { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); + } + } + + return dispatcher; +} + +function useContext(Context, unstable_observedBits) { + var dispatcher = resolveDispatcher(); + + { + if (unstable_observedBits !== undefined) { + error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://reactjs.org/link/rules-of-hooks' : ''); + } // TODO: add a more generic warning for invalid values. + + + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. + + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); + } + } + } + + return dispatcher.useContext(Context, unstable_observedBits); +} +function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); +} +function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); +} +function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); +} +function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); +} +function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); +} +function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); +} +function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); +} +function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); +} +function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case exports.Suspense: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} + +function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentName(ReactCurrentOwner.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; +} + +function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; +} + +function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + + return ''; +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + } + + { + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentName(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentName(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} +function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } + + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === exports.Fragment) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; +} +var didWarnAboutDeprecatedCreateFactory = false; +function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it + + + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); + + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + + return validatedFactory; +} +function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + + validatePropTypes(newElement); + return newElement; +} + +{ + + try { + var frozenObject = Object.freeze({}); + /* eslint-disable no-new */ + + new Map([[frozenObject, null]]); + new Set([frozenObject]); + /* eslint-enable no-new */ + } catch (e) { + } +} + +var createElement$1 = createElementWithValidation ; +var cloneElement$1 = cloneElementWithValidation ; +var createFactory = createFactoryWithValidation ; +var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray: toArray, + only: onlyChild +}; + +exports.Children = Children; +exports.Component = Component; +exports.PureComponent = PureComponent; +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; +exports.cloneElement = cloneElement$1; +exports.createContext = createContext; +exports.createElement = createElement$1; +exports.createFactory = createFactory; +exports.createRef = createRef; +exports.forwardRef = forwardRef; +exports.isValidElement = isValidElement; +exports.lazy = lazy; +exports.memo = memo; +exports.useCallback = useCallback; +exports.useContext = useContext; +exports.useDebugValue = useDebugValue; +exports.useEffect = useEffect; +exports.useImperativeHandle = useImperativeHandle; +exports.useLayoutEffect = useLayoutEffect; +exports.useMemo = useMemo; +exports.useReducer = useReducer; +exports.useRef = useRef; +exports.useState = useState; +exports.version = ReactVersion; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react/index.js": +/*!*************************************!*\ + !*** ./node_modules/react/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react.development.js */ "./node_modules/react/cjs/react.development.js"); +} + + +/***/ }) + +},[["./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F_error&absolutePagePath=next%2Fdist%2Fpages%2F_error!./","webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlMaWtlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRob3V0SG9sZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZ2V0UHJvdG90eXBlT2YuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2luaGVyaXRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2l0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvbm9uSXRlcmFibGVTcHJlYWQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC9wb2x5ZmlsbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1jbGllbnQtcGFnZXMtbG9hZGVyLmpzP2Q3ZmIiLCJ3ZWJwYWNrOi8vX05fRS8od2VicGFjaykvd2VicGFjay9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvYW1wLWNvbnRleHQudHMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi8uLi9uZXh0LXNlcnZlci9saWIvYW1wLnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL2hlYWQtbWFuYWdlci1jb250ZXh0LnRzIiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL2hlYWQudHN4Iiwid2VicGFjazovL19OX0UvLi4vLi4vLi4vbmV4dC1zZXJ2ZXIvbGliL3NpZGUtZWZmZWN0LnRzeCIsIndlYnBhY2s6Ly9fTl9FLy4uLy4uL3BhZ2VzL19lcnJvci50c3giLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyJdLCJuYW1lcyI6WyJBbXBTdGF0ZUNvbnRleHQiLCJSZWFjdCIsImFtcEZpcnN0IiwiaHlicmlkIiwiaGFzUXVlcnkiLCJpc0luQW1wTW9kZSIsIkhlYWRNYW5hZ2VyQ29udGV4dCIsImluQW1wTW9kZSIsImhlYWQiLCJjaGlsZCIsImxpc3QiLCJmcmFnbWVudExpc3QiLCJNRVRBVFlQRVMiLCJrZXlzIiwidGFncyIsIm1ldGFUeXBlcyIsIm1ldGFDYXRlZ29yaWVzIiwiaCIsImlzVW5pcXVlIiwiaGFzS2V5Iiwia2V5IiwiaSIsImxlbiIsIm1ldGF0eXBlIiwiY2F0ZWdvcnkiLCJjYXRlZ29yaWVzIiwiaGVhZEVsZW1lbnRzIiwiaGVhZEVsZW1lbnRDaGlsZHJlbiIsImhlYWRFbGVtZW50IiwiZGVmYXVsdEhlYWQiLCJwcm9wcyIsInVuaXF1ZSIsImMiLCJwcm9jZXNzIiwiYW1wU3RhdGUiLCJoZWFkTWFuYWdlciIsIkhlYWQiLCJpc1NlcnZlciIsImNvbnN0cnVjdG9yIiwiX2hhc0hlYWRNYW5hZ2VyIiwiZW1pdENoYW5nZSIsImNvbXBvbmVudERpZE1vdW50IiwiY29tcG9uZW50RGlkVXBkYXRlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW5kZXIiLCJDb21wb25lbnQiLCJzdGF0dXNDb2RlcyIsInN0YXR1c0NvZGUiLCJyZXMiLCJlcnIiLCJ0aXRsZSIsInN0eWxlcyIsIl9faHRtbCIsIkVycm9yIiwiZGlzcGxheU5hbWUiLCJnZXRJbml0aWFsUHJvcHMiLCJfZ2V0SW5pdGlhbFByb3BzIiwib3JpZ0dldEluaXRpYWxQcm9wcyIsImVycm9yIiwiY29sb3IiLCJiYWNrZ3JvdW5kIiwiZm9udEZhbWlseSIsImhlaWdodCIsInRleHRBbGlnbiIsImRpc3BsYXkiLCJmbGV4RGlyZWN0aW9uIiwiYWxpZ25JdGVtcyIsImp1c3RpZnlDb250ZW50IiwiZGVzYyIsImxpbmVIZWlnaHQiLCJ2ZXJ0aWNhbEFsaWduIiwiaDEiLCJib3JkZXJSaWdodCIsIm1hcmdpbiIsIm1hcmdpblJpZ2h0IiwicGFkZGluZyIsImZvbnRTaXplIiwiZm9udFdlaWdodCIsImgyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFDQTs7QUFFQSx3Q0FBd0MsU0FBUztBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUM7Ozs7Ozs7Ozs7O0FDVkEsdUJBQXVCLG1CQUFPLENBQUMscUZBQW9COztBQUVuRDtBQUNBO0FBQ0E7O0FBRUEsb0M7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSx3Qzs7Ozs7Ozs7Ozs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDOzs7Ozs7Ozs7OztBQ05BO0FBQ0EsaUJBQWlCLGtCQUFrQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlDOzs7Ozs7Ozs7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQzs7Ozs7Ozs7Ozs7QUNQQSxxQkFBcUIsbUJBQU8sQ0FBQyxpRkFBa0I7O0FBRS9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLDJCOzs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDOzs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTs7QUFFQSxrQzs7Ozs7Ozs7Ozs7QUNKQTtBQUNBO0FBQ0E7O0FBRUEsb0M7Ozs7Ozs7Ozs7O0FDSkEsY0FBYyxtQkFBTyxDQUFDLHNGQUErQjs7QUFFckQsNEJBQTRCLG1CQUFPLENBQUMsK0ZBQXlC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QTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLGNBQWM7QUFDekIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7O0FBRVA7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7O0FBRWxCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4Qjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDJDQUEyQzs7QUFFM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4Qjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixpQkFBaUI7QUFDcEM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7O0FDNXhFYTs7QUFFYixJQUFJLEtBQXFDLEVBQUUsRUFFMUM7QUFDRCxtQkFBbUIsbUJBQU8sQ0FBQyxpRkFBNEI7QUFDdkQiLCJmaWxlIjoic3RhdGljL2NodW5rcy9wYWdlcy9fZXJyb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5XCIpO1xuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KGFycik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aG91dEhvbGVzOyIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZDsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc0NhbGxDaGVjazsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eTsiLCJmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7IiwidmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4vc2V0UHJvdG90eXBlT2ZcIik7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfaW5oZXJpdHM7IiwiZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHtcbiAgICBcImRlZmF1bHRcIjogb2JqXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdDsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09IFwidW5kZWZpbmVkXCIgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChpdGVyKSkgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheTsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVNwcmVhZDsiLCJ2YXIgX3R5cGVvZiA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIGFzc2VydFRoaXNJbml0aWFsaXplZCA9IHJlcXVpcmUoXCIuL2Fzc2VydFRoaXNJbml0aWFsaXplZFwiKTtcblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZihjYWxsKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgIHJldHVybiBjYWxsO1xuICB9XG5cbiAgcmV0dXJuIGFzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjsiLCJmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjsiLCJ2YXIgYXJyYXlXaXRob3V0SG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhvdXRIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5ID0gcmVxdWlyZShcIi4vdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXlcIik7XG5cbnZhciBub25JdGVyYWJsZVNwcmVhZCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlU3ByZWFkXCIpO1xuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBhcnJheVdpdGhvdXRIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IHVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgbm9uSXRlcmFibGVTcHJlYWQoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdG9Db25zdW1hYmxlQXJyYXk7IiwiZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mOyIsInZhciBhcnJheUxpa2VUb0FycmF5ID0gcmVxdWlyZShcIi4vYXJyYXlMaWtlVG9BcnJheVwiKTtcblxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xuICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKS5zbGljZSg4LCAtMSk7XG4gIGlmIChuID09PSBcIk9iamVjdFwiICYmIG8uY29uc3RydWN0b3IpIG4gPSBvLmNvbnN0cnVjdG9yLm5hbWU7XG4gIGlmIChuID09PSBcIk1hcFwiIHx8IG4gPT09IFwiU2V0XCIpIHJldHVybiBBcnJheS5mcm9tKG8pO1xuICBpZiAobiA9PT0gXCJBcmd1bWVudHNcIiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXk7IiwiXCJ1c2Ugc3RyaWN0XCI7dmFyIGFzc2lnbj1PYmplY3QuYXNzaWduLmJpbmQoT2JqZWN0KTttb2R1bGUuZXhwb3J0cz1hc3NpZ247bW9kdWxlLmV4cG9ydHMuZGVmYXVsdD1tb2R1bGUuZXhwb3J0cztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW9iamVjdC1hc3NpZ24uanMubWFwIiwiXG4gICAgKHdpbmRvdy5fX05FWFRfUCA9IHdpbmRvdy5fX05FWFRfUCB8fCBbXSkucHVzaChbXG4gICAgICBcIi9fZXJyb3JcIixcbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmUoXCJuZXh0L2Rpc3QvcGFnZXMvX2Vycm9yXCIpO1xuICAgICAgfVxuICAgIF0pO1xuICAiLCJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA4ODA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oODgwKTtcbi8qKioqKiovIH0pKClcbjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmV4cG9ydCBjb25zdCBBbXBTdGF0ZUNvbnRleHQ6IFJlYWN0LkNvbnRleHQ8YW55PiA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe30pXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEFtcFN0YXRlQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdBbXBTdGF0ZUNvbnRleHQnXG59XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBBbXBTdGF0ZUNvbnRleHQgfSBmcm9tICcuL2FtcC1jb250ZXh0J1xuXG5leHBvcnQgZnVuY3Rpb24gaXNJbkFtcE1vZGUoe1xuICBhbXBGaXJzdCA9IGZhbHNlLFxuICBoeWJyaWQgPSBmYWxzZSxcbiAgaGFzUXVlcnkgPSBmYWxzZSxcbn0gPSB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYW1wRmlyc3QgfHwgKGh5YnJpZCAmJiBoYXNRdWVyeSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUFtcCgpOiBib29sZWFuIHtcbiAgLy8gRG9uJ3QgYXNzaWduIHRoZSBjb250ZXh0IHZhbHVlIHRvIGEgdmFyaWFibGUgdG8gc2F2ZSBieXRlc1xuICByZXR1cm4gaXNJbkFtcE1vZGUoUmVhY3QudXNlQ29udGV4dChBbXBTdGF0ZUNvbnRleHQpKVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgY29uc3QgSGVhZE1hbmFnZXJDb250ZXh0OiBSZWFjdC5Db250ZXh0PHtcbiAgdXBkYXRlSGVhZD86IChzdGF0ZTogYW55KSA9PiB2b2lkXG4gIG1vdW50ZWRJbnN0YW5jZXM/OiBhbnlcbiAgdXBkYXRlU2NyaXB0cz86IChzdGF0ZTogYW55KSA9PiB2b2lkXG4gIHNjcmlwdHM/OiBhbnlcbn0+ID0gUmVhY3QuY3JlYXRlQ29udGV4dCh7fSlcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgSGVhZE1hbmFnZXJDb250ZXh0LmRpc3BsYXlOYW1lID0gJ0hlYWRNYW5hZ2VyQ29udGV4dCdcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgRWZmZWN0IGZyb20gJy4vc2lkZS1lZmZlY3QnXG5pbXBvcnQgeyBBbXBTdGF0ZUNvbnRleHQgfSBmcm9tICcuL2FtcC1jb250ZXh0J1xuaW1wb3J0IHsgSGVhZE1hbmFnZXJDb250ZXh0IH0gZnJvbSAnLi9oZWFkLW1hbmFnZXItY29udGV4dCdcbmltcG9ydCB7IGlzSW5BbXBNb2RlIH0gZnJvbSAnLi9hbXAnXG5cbnR5cGUgV2l0aEluQW1wTW9kZSA9IHtcbiAgaW5BbXBNb2RlPzogYm9vbGVhblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEhlYWQoaW5BbXBNb2RlID0gZmFsc2UpOiBKU1guRWxlbWVudFtdIHtcbiAgY29uc3QgaGVhZCA9IFs8bWV0YSBjaGFyU2V0PVwidXRmLThcIiAvPl1cbiAgaWYgKCFpbkFtcE1vZGUpIHtcbiAgICBoZWFkLnB1c2goPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aFwiIC8+KVxuICB9XG4gIHJldHVybiBoZWFkXG59XG5cbmZ1bmN0aW9uIG9ubHlSZWFjdEVsZW1lbnQoXG4gIGxpc3Q6IEFycmF5PFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+PixcbiAgY2hpbGQ6IFJlYWN0LlJlYWN0Q2hpbGRcbik6IEFycmF5PFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+PiB7XG4gIC8vIFJlYWN0IGNoaWxkcmVuIGNhbiBiZSBcInN0cmluZ1wiIG9yIFwibnVtYmVyXCIgaW4gdGhpcyBjYXNlIHdlIGlnbm9yZSB0aGVtIGZvciBiYWNrd2FyZHMgY29tcGF0XG4gIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbGlzdFxuICB9XG4gIC8vIEFkZHMgc3VwcG9ydCBmb3IgUmVhY3QuRnJhZ21lbnRcbiAgaWYgKGNoaWxkLnR5cGUgPT09IFJlYWN0LkZyYWdtZW50KSB7XG4gICAgcmV0dXJuIGxpc3QuY29uY2F0KFxuICAgICAgUmVhY3QuQ2hpbGRyZW4udG9BcnJheShjaGlsZC5wcm9wcy5jaGlsZHJlbikucmVkdWNlKFxuICAgICAgICAoXG4gICAgICAgICAgZnJhZ21lbnRMaXN0OiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55Pj4sXG4gICAgICAgICAgZnJhZ21lbnRDaGlsZDogUmVhY3QuUmVhY3RDaGlsZFxuICAgICAgICApOiBBcnJheTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55Pj4gPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBmcmFnbWVudENoaWxkID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgdHlwZW9mIGZyYWdtZW50Q2hpbGQgPT09ICdudW1iZXInXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZnJhZ21lbnRMaXN0XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmcmFnbWVudExpc3QuY29uY2F0KGZyYWdtZW50Q2hpbGQpXG4gICAgICAgIH0sXG4gICAgICAgIFtdXG4gICAgICApXG4gICAgKVxuICB9XG4gIHJldHVybiBsaXN0LmNvbmNhdChjaGlsZClcbn1cblxuY29uc3QgTUVUQVRZUEVTID0gWyduYW1lJywgJ2h0dHBFcXVpdicsICdjaGFyU2V0JywgJ2l0ZW1Qcm9wJ11cblxuLypcbiByZXR1cm5zIGEgZnVuY3Rpb24gZm9yIGZpbHRlcmluZyBoZWFkIGNoaWxkIGVsZW1lbnRzXG4gd2hpY2ggc2hvdWxkbid0IGJlIGR1cGxpY2F0ZWQsIGxpa2UgPHRpdGxlLz5cbiBBbHNvIGFkZHMgc3VwcG9ydCBmb3IgZGVkdXBsaWNhdGVkIGBrZXlgIHByb3BlcnRpZXNcbiovXG5mdW5jdGlvbiB1bmlxdWUoKSB7XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KClcbiAgY29uc3QgdGFncyA9IG5ldyBTZXQoKVxuICBjb25zdCBtZXRhVHlwZXMgPSBuZXcgU2V0KClcbiAgY29uc3QgbWV0YUNhdGVnb3JpZXM6IHsgW21ldGF0eXBlOiBzdHJpbmddOiBTZXQ8c3RyaW5nPiB9ID0ge31cblxuICByZXR1cm4gKGg6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+KSA9PiB7XG4gICAgbGV0IGlzVW5pcXVlID0gdHJ1ZVxuICAgIGxldCBoYXNLZXkgPSBmYWxzZVxuXG4gICAgaWYgKGgua2V5ICYmIHR5cGVvZiBoLmtleSAhPT0gJ251bWJlcicgJiYgaC5rZXkuaW5kZXhPZignJCcpID4gMCkge1xuICAgICAgaGFzS2V5ID0gdHJ1ZVxuICAgICAgY29uc3Qga2V5ID0gaC5rZXkuc2xpY2UoaC5rZXkuaW5kZXhPZignJCcpICsgMSlcbiAgICAgIGlmIChrZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgIGlzVW5pcXVlID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMuYWRkKGtleSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVmYXVsdC1jYXNlXG4gICAgc3dpdGNoIChoLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3RpdGxlJzpcbiAgICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgICBpZiAodGFncy5oYXMoaC50eXBlKSkge1xuICAgICAgICAgIGlzVW5pcXVlID0gZmFsc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWdzLmFkZChoLnR5cGUpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ21ldGEnOlxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gTUVUQVRZUEVTLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgbWV0YXR5cGUgPSBNRVRBVFlQRVNbaV1cbiAgICAgICAgICBpZiAoIWgucHJvcHMuaGFzT3duUHJvcGVydHkobWV0YXR5cGUpKSBjb250aW51ZVxuXG4gICAgICAgICAgaWYgKG1ldGF0eXBlID09PSAnY2hhclNldCcpIHtcbiAgICAgICAgICAgIGlmIChtZXRhVHlwZXMuaGFzKG1ldGF0eXBlKSkge1xuICAgICAgICAgICAgICBpc1VuaXF1ZSA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXRhVHlwZXMuYWRkKG1ldGF0eXBlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeSA9IGgucHJvcHNbbWV0YXR5cGVdXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gbWV0YUNhdGVnb3JpZXNbbWV0YXR5cGVdIHx8IG5ldyBTZXQoKVxuICAgICAgICAgICAgaWYgKChtZXRhdHlwZSAhPT0gJ25hbWUnIHx8ICFoYXNLZXkpICYmIGNhdGVnb3JpZXMuaGFzKGNhdGVnb3J5KSkge1xuICAgICAgICAgICAgICBpc1VuaXF1ZSA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjYXRlZ29yaWVzLmFkZChjYXRlZ29yeSlcbiAgICAgICAgICAgICAgbWV0YUNhdGVnb3JpZXNbbWV0YXR5cGVdID0gY2F0ZWdvcmllc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHJldHVybiBpc1VuaXF1ZVxuICB9XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBoZWFkRWxlbWVudHMgTGlzdCBvZiBtdWx0aXBsZSA8SGVhZD4gaW5zdGFuY2VzXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUNvbXBvbmVudHMoXG4gIGhlYWRFbGVtZW50czogQXJyYXk8UmVhY3QuUmVhY3RFbGVtZW50PGFueT4+LFxuICBwcm9wczogV2l0aEluQW1wTW9kZVxuKSB7XG4gIHJldHVybiBoZWFkRWxlbWVudHNcbiAgICAucmVkdWNlKFxuICAgICAgKGxpc3Q6IFJlYWN0LlJlYWN0Q2hpbGRbXSwgaGVhZEVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+KSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRFbGVtZW50Q2hpbGRyZW4gPSBSZWFjdC5DaGlsZHJlbi50b0FycmF5KFxuICAgICAgICAgIGhlYWRFbGVtZW50LnByb3BzLmNoaWxkcmVuXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIGxpc3QuY29uY2F0KGhlYWRFbGVtZW50Q2hpbGRyZW4pXG4gICAgICB9LFxuICAgICAgW11cbiAgICApXG4gICAgLnJlZHVjZShvbmx5UmVhY3RFbGVtZW50LCBbXSlcbiAgICAucmV2ZXJzZSgpXG4gICAgLmNvbmNhdChkZWZhdWx0SGVhZChwcm9wcy5pbkFtcE1vZGUpKVxuICAgIC5maWx0ZXIodW5pcXVlKCkpXG4gICAgLnJldmVyc2UoKVxuICAgIC5tYXAoKGM6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+LCBpOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGMua2V5IHx8IGlcbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdkZXZlbG9wbWVudCcgJiZcbiAgICAgICAgcHJvY2Vzcy5lbnYuX19ORVhUX09QVElNSVpFX0ZPTlRTICYmXG4gICAgICAgICFwcm9wcy5pbkFtcE1vZGVcbiAgICAgICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYy50eXBlID09PSAnbGluaycgJiZcbiAgICAgICAgICBjLnByb3BzWydocmVmJ10gJiZcbiAgICAgICAgICAvLyBUT0RPKHByYXRlZWtiaEApOiBSZXBsYWNlIHRoaXMgd2l0aCBjb25zdCBmcm9tIGBjb25zdGFudHNgIHdoZW4gdGhlIHRyZWUgc2hha2luZyB3b3Jrcy5cbiAgICAgICAgICBbJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzJ10uc29tZSgodXJsKSA9PlxuICAgICAgICAgICAgYy5wcm9wc1snaHJlZiddLnN0YXJ0c1dpdGgodXJsKVxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbmV3UHJvcHMgPSB7IC4uLihjLnByb3BzIHx8IHt9KSB9XG4gICAgICAgICAgbmV3UHJvcHNbJ2RhdGEtaHJlZiddID0gbmV3UHJvcHNbJ2hyZWYnXVxuICAgICAgICAgIG5ld1Byb3BzWydocmVmJ10gPSB1bmRlZmluZWRcbiAgICAgICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGMsIG5ld1Byb3BzKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KGMsIHsga2V5IH0pXG4gICAgfSlcbn1cblxuLyoqXG4gKiBUaGlzIGNvbXBvbmVudCBpbmplY3RzIGVsZW1lbnRzIHRvIGA8aGVhZD5gIG9mIHlvdXIgcGFnZS5cbiAqIFRvIGF2b2lkIGR1cGxpY2F0ZWQgYHRhZ3NgIGluIGA8aGVhZD5gIHlvdSBjYW4gdXNlIHRoZSBga2V5YCBwcm9wZXJ0eSwgd2hpY2ggd2lsbCBtYWtlIHN1cmUgZXZlcnkgdGFnIGlzIG9ubHkgcmVuZGVyZWQgb25jZS5cbiAqL1xuZnVuY3Rpb24gSGVhZCh7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IGFtcFN0YXRlID0gdXNlQ29udGV4dChBbXBTdGF0ZUNvbnRleHQpXG4gIGNvbnN0IGhlYWRNYW5hZ2VyID0gdXNlQ29udGV4dChIZWFkTWFuYWdlckNvbnRleHQpXG4gIHJldHVybiAoXG4gICAgPEVmZmVjdFxuICAgICAgcmVkdWNlQ29tcG9uZW50c1RvU3RhdGU9e3JlZHVjZUNvbXBvbmVudHN9XG4gICAgICBoZWFkTWFuYWdlcj17aGVhZE1hbmFnZXJ9XG4gICAgICBpbkFtcE1vZGU9e2lzSW5BbXBNb2RlKGFtcFN0YXRlKX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9FZmZlY3Q+XG4gIClcbn1cblxuLy8gVE9ETzogUmVtb3ZlIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2VcbkhlYWQucmV3aW5kID0gKCkgPT4ge31cblxuZXhwb3J0IGRlZmF1bHQgSGVhZFxuIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0J1xuXG5jb25zdCBpc1NlcnZlciA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnXG5cbnR5cGUgU3RhdGUgPSBKU1guRWxlbWVudFtdIHwgdW5kZWZpbmVkXG5cbnR5cGUgU2lkZUVmZmVjdFByb3BzID0ge1xuICByZWR1Y2VDb21wb25lbnRzVG9TdGF0ZTogPFQ+KFxuICAgIGNvbXBvbmVudHM6IEFycmF5PFJlYWN0LlJlYWN0RWxlbWVudDxhbnk+PixcbiAgICBwcm9wczogVFxuICApID0+IFN0YXRlXG4gIGhhbmRsZVN0YXRlQ2hhbmdlPzogKHN0YXRlOiBTdGF0ZSkgPT4gdm9pZFxuICBoZWFkTWFuYWdlcjogYW55XG4gIGluQW1wTW9kZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBDb21wb25lbnQ8U2lkZUVmZmVjdFByb3BzPiB7XG4gIHByaXZhdGUgX2hhc0hlYWRNYW5hZ2VyOiBib29sZWFuXG5cbiAgZW1pdENoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5faGFzSGVhZE1hbmFnZXIpIHtcbiAgICAgIHRoaXMucHJvcHMuaGVhZE1hbmFnZXIudXBkYXRlSGVhZChcbiAgICAgICAgdGhpcy5wcm9wcy5yZWR1Y2VDb21wb25lbnRzVG9TdGF0ZShcbiAgICAgICAgICBbLi4udGhpcy5wcm9wcy5oZWFkTWFuYWdlci5tb3VudGVkSW5zdGFuY2VzXSxcbiAgICAgICAgICB0aGlzLnByb3BzXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm9wczogYW55KSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5faGFzSGVhZE1hbmFnZXIgPVxuICAgICAgdGhpcy5wcm9wcy5oZWFkTWFuYWdlciAmJiB0aGlzLnByb3BzLmhlYWRNYW5hZ2VyLm1vdW50ZWRJbnN0YW5jZXNcblxuICAgIGlmIChpc1NlcnZlciAmJiB0aGlzLl9oYXNIZWFkTWFuYWdlcikge1xuICAgICAgdGhpcy5wcm9wcy5oZWFkTWFuYWdlci5tb3VudGVkSW5zdGFuY2VzLmFkZCh0aGlzKVxuICAgICAgdGhpcy5lbWl0Q2hhbmdlKClcbiAgICB9XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKHRoaXMuX2hhc0hlYWRNYW5hZ2VyKSB7XG4gICAgICB0aGlzLnByb3BzLmhlYWRNYW5hZ2VyLm1vdW50ZWRJbnN0YW5jZXMuYWRkKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuZW1pdENoYW5nZSgpXG4gIH1cbiAgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHRoaXMuZW1pdENoYW5nZSgpXG4gIH1cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMuX2hhc0hlYWRNYW5hZ2VyKSB7XG4gICAgICB0aGlzLnByb3BzLmhlYWRNYW5hZ2VyLm1vdW50ZWRJbnN0YW5jZXMuZGVsZXRlKHRoaXMpXG4gICAgfVxuICAgIHRoaXMuZW1pdENoYW5nZSgpXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IEhlYWQgZnJvbSAnLi4vbmV4dC1zZXJ2ZXIvbGliL2hlYWQnXG5pbXBvcnQgeyBOZXh0UGFnZUNvbnRleHQgfSBmcm9tICcuLi9uZXh0LXNlcnZlci9saWIvdXRpbHMnXG5cbmNvbnN0IHN0YXR1c0NvZGVzOiB7IFtjb2RlOiBudW1iZXJdOiBzdHJpbmcgfSA9IHtcbiAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICA0MDQ6ICdUaGlzIHBhZ2UgY291bGQgbm90IGJlIGZvdW5kJyxcbiAgNDA1OiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbn1cblxuZXhwb3J0IHR5cGUgRXJyb3JQcm9wcyA9IHtcbiAgc3RhdHVzQ29kZTogbnVtYmVyXG4gIHRpdGxlPzogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIF9nZXRJbml0aWFsUHJvcHMoe1xuICByZXMsXG4gIGVycixcbn06IE5leHRQYWdlQ29udGV4dCk6IFByb21pc2U8RXJyb3JQcm9wcz4gfCBFcnJvclByb3BzIHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9XG4gICAgcmVzICYmIHJlcy5zdGF0dXNDb2RlID8gcmVzLnN0YXR1c0NvZGUgOiBlcnIgPyBlcnIuc3RhdHVzQ29kZSEgOiA0MDRcbiAgcmV0dXJuIHsgc3RhdHVzQ29kZSB9XG59XG5cbi8qKlxuICogYEVycm9yYCBjb21wb25lbnQgdXNlZCBmb3IgaGFuZGxpbmcgZXJyb3JzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFcnJvcjxQID0ge30+IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PFAgJiBFcnJvclByb3BzPiB7XG4gIHN0YXRpYyBkaXNwbGF5TmFtZSA9ICdFcnJvclBhZ2UnXG5cbiAgc3RhdGljIGdldEluaXRpYWxQcm9wcyA9IF9nZXRJbml0aWFsUHJvcHNcbiAgc3RhdGljIG9yaWdHZXRJbml0aWFsUHJvcHMgPSBfZ2V0SW5pdGlhbFByb3BzXG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgc3RhdHVzQ29kZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHRpdGxlID1cbiAgICAgIHRoaXMucHJvcHMudGl0bGUgfHxcbiAgICAgIHN0YXR1c0NvZGVzW3N0YXR1c0NvZGVdIHx8XG4gICAgICAnQW4gdW5leHBlY3RlZCBlcnJvciBoYXMgb2NjdXJyZWQnXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17c3R5bGVzLmVycm9yfT5cbiAgICAgICAgPEhlYWQ+XG4gICAgICAgICAgPHRpdGxlPlxuICAgICAgICAgICAge3N0YXR1c0NvZGV9OiB7dGl0bGV9XG4gICAgICAgICAgPC90aXRsZT5cbiAgICAgICAgPC9IZWFkPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxzdHlsZSBkYW5nZXJvdXNseVNldElubmVySFRNTD17eyBfX2h0bWw6ICdib2R5IHsgbWFyZ2luOiAwIH0nIH19IC8+XG4gICAgICAgICAge3N0YXR1c0NvZGUgPyA8aDEgc3R5bGU9e3N0eWxlcy5oMX0+e3N0YXR1c0NvZGV9PC9oMT4gOiBudWxsfVxuICAgICAgICAgIDxkaXYgc3R5bGU9e3N0eWxlcy5kZXNjfT5cbiAgICAgICAgICAgIDxoMiBzdHlsZT17c3R5bGVzLmgyfT57dGl0bGV9LjwvaDI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbmNvbnN0IHN0eWxlczogeyBbazogc3RyaW5nXTogUmVhY3QuQ1NTUHJvcGVydGllcyB9ID0ge1xuICBlcnJvcjoge1xuICAgIGNvbG9yOiAnIzAwMCcsXG4gICAgYmFja2dyb3VuZDogJyNmZmYnLFxuICAgIGZvbnRGYW1pbHk6XG4gICAgICAnLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBSb2JvdG8sIFwiU2Vnb2UgVUlcIiwgXCJGaXJhIFNhbnNcIiwgQXZlbmlyLCBcIkhlbHZldGljYSBOZXVlXCIsIFwiTHVjaWRhIEdyYW5kZVwiLCBzYW5zLXNlcmlmJyxcbiAgICBoZWlnaHQ6ICcxMDB2aCcsXG4gICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICB9LFxuXG4gIGRlc2M6IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICB0ZXh0QWxpZ246ICdsZWZ0JyxcbiAgICBsaW5lSGVpZ2h0OiAnNDlweCcsXG4gICAgaGVpZ2h0OiAnNDlweCcsXG4gICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gIH0sXG5cbiAgaDE6IHtcbiAgICBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJyxcbiAgICBib3JkZXJSaWdodDogJzFweCBzb2xpZCByZ2JhKDAsIDAsIDAsLjMpJyxcbiAgICBtYXJnaW46IDAsXG4gICAgbWFyZ2luUmlnaHQ6ICcyMHB4JyxcbiAgICBwYWRkaW5nOiAnMTBweCAyM3B4IDEwcHggMCcsXG4gICAgZm9udFNpemU6ICcyNHB4JyxcbiAgICBmb250V2VpZ2h0OiA1MDAsXG4gICAgdmVydGljYWxBbGlnbjogJ3RvcCcsXG4gIH0sXG5cbiAgaDI6IHtcbiAgICBmb250U2l6ZTogJzE0cHgnLFxuICAgIGZvbnRXZWlnaHQ6ICdub3JtYWwnLFxuICAgIGxpbmVIZWlnaHQ6ICdpbmhlcml0JyxcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgfSxcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbmV4cG9ydHMuRnJhZ21lbnQgPSAweGVhY2I7XG5leHBvcnRzLlN0cmljdE1vZGUgPSAweGVhY2M7XG5leHBvcnRzLlByb2ZpbGVyID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG5leHBvcnRzLlN1c3BlbnNlID0gMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSAweGVhZDk7XG52YXIgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSAweGVhZGE7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IDB4ZWFkNTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gMHhlYWQ3O1xudmFyIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gMHhlYWUwO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gMHhlYWUxO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gMHhlYWUyO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IDB4ZWFlMztcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5lbGVtZW50Jyk7XG4gIFJFQUNUX1BPUlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wb3J0YWwnKTtcbiAgZXhwb3J0cy5GcmFnbWVudCA9IHN5bWJvbEZvcigncmVhY3QuZnJhZ21lbnQnKTtcbiAgZXhwb3J0cy5TdHJpY3RNb2RlID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBleHBvcnRzLlByb2ZpbGVyID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgZXhwb3J0cy5TdXNwZW5zZSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogMFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vKipcbiAqIFVzZWQgYnkgYWN0KCkgdG8gdHJhY2sgd2hldGhlciB5b3UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlLlxuICovXG52YXIgSXNTb21lUmVuZGVyZXJBY3RpbmcgPSB7XG4gIGN1cnJlbnQ6IGZhbHNlXG59O1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyLFxuICBJc1NvbWVSZW5kZXJlckFjdGluZzogSXNTb21lUmVuZGVyZXJBY3RpbmcsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OyAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cblxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAoISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLlwiICk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbl9hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5cbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIGV4cG9ydHMuUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdHJpY3RNb2RlOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdXNwZW5zZTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24sIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGVsZW1lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBBIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIGVzY2FwZSgnJyArIGVsZW1lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW47XG4gICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzOlxuXG4gICAgdmFyIGNoaWxkS2V5ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldEVsZW1lbnRLZXkoX2NoaWxkLCAwKSA6IG5hbWVTb0ZhcjtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgICAgdmFyIGVzY2FwZWRDaGlsZEtleSA9ICcnO1xuXG4gICAgICBpZiAoY2hpbGRLZXkgIT0gbnVsbCkge1xuICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nO1xuICAgICAgfVxuXG4gICAgICBtYXBJbnRvQXJyYXkobWFwcGVkQ2hpbGQsIGFycmF5LCBlc2NhcGVkQ2hpbGRLZXksICcnLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICAgIH1cblxuICAgICAgYXJyYXkucHVzaChtYXBwZWRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBpdGVyYWJsZUNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICAgIHdhcm4oJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZUNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gJycgKyBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcpICsgXCIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpIHtcbiAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWxjdWxhdGVDaGFuZ2VkQml0cyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSBudWxsICYmIHR5cGVvZiBjYWxjdWxhdGVDaGFuZ2VkQml0cyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignY3JlYXRlQ29udGV4dDogRXhwZWN0ZWQgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjYWxjdWxhdGVDaGFuZ2VkQml0cyxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTtcblxuICB7XG4gICAgLy8gQSBzZXBhcmF0ZSBvYmplY3QsIGJ1dCBwcm94aWVzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgb2JqZWN0IGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBoYXMgYSBkaWZmZXJlbnQgJCR0eXBlb2YsIHNvIHdlIGNhbiBwcm9wZXJseVxuICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLlxuICAgIHZhciBDb25zdW1lciA9IHtcbiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHNcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG4gICAgdmFyIHBlbmRpbmcgPSBwYXlsb2FkO1xuICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChkZWZhdWx0RXhwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG5cbiAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVzb2x2ZWQuX3N0YXR1cyA9IFJlc29sdmVkO1xuICAgICAgICByZXNvbHZlZC5fcmVzdWx0ID0gZGVmYXVsdEV4cG9ydDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlamVjdGVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVqZWN0ZWQuX3N0YXR1cyA9IFJlamVjdGVkO1xuICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHJldHVybiBwYXlsb2FkLl9yZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhenkoY3Rvcikge1xuICB2YXIgcGF5bG9hZCA9IHtcbiAgICAvLyBXZSB1c2UgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogLTEsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTtcblxuICAgICAgICBpZiAocmVuZGVyLmRpc3BsYXlOYW1lID09IG51bGwpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IGV4cG9ydHMuUHJvZmlsZXIgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gZXhwb3J0cy5TdHJpY3RNb2RlIHx8IHR5cGUgPT09IGV4cG9ydHMuU3VzcGVuc2UgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFIHx8IHR5cGVbMF0gPT09IFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7XG5cbiAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICBpZiAoIShkaXNwYXRjaGVyICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIHVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgaWYgKHVuc3RhYmxlX29ic2VydmVkQml0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcigndXNlQ29udGV4dCgpIHNlY29uZCBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlICcgKyAndXNlIGluIFJlYWN0LiBQYXNzaW5nIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHBhc3NlZDogJXMuJXMnLCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMsIHR5cGVvZiB1bnN0YWJsZV9vYnNlcnZlZEJpdHMgPT09ICdudW1iZXInICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzJdKSA/ICdcXG5cXG5EaWQgeW91IGNhbGwgYXJyYXkubWFwKHVzZUNvbnRleHQpPyAnICsgJ0NhbGxpbmcgSG9va3MgaW5zaWRlIGEgbG9vcCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0xlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyA6ICcnKTtcbiAgICB9IC8vIFRPRE86IGFkZCBhIG1vcmUgZ2VuZXJpYyB3YXJuaW5nIGZvciBpbnZhbGlkIHZhbHVlcy5cblxuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cyk7XG59XG5mdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xufVxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cbmZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTWVtbyhjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICB7XG4gICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgfVxufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuU3VzcGVuc2U6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxue1xuXG4gIHRyeSB7XG4gICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW2Zyb3plbk9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtmcm96ZW5PYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.next/static/chunks/pages/index.js b/.next/static/chunks/pages/index.js new file mode 100644 index 0000000..74c6ddb --- /dev/null +++ b/.next/static/chunks/pages/index.js @@ -0,0 +1,103517 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["pages/index"],{ + +/***/ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.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 _assertThisInitialized; }); +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.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 _asyncToGenerator; }); +function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +} + +function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + + _next(undefined); + }); + }; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/createClass.js": +/*!****************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/createClass.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 _createClass; }); +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/extends.js": +/*!************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/extends.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 _extends; }); +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); +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js": +/*!******************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/inheritsLoose.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 _inheritsLoose; }); +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.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 _objectWithoutPropertiesLoose; }); +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +/***/ }), + +/***/ "./node_modules/@babel/runtime/regenerator/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@babel/runtime/regenerator/index.js ***! + \**********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +module.exports = __webpack_require__(/*! regenerator-runtime */ "./node_modules/regenerator-runtime/runtime.js"); + + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/_version.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/_version.js ***! + \*************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "abi/5.0.12"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/abi-coder.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/abi-coder.js ***! + \**************************************************************/ +/*! exports provided: AbiCoder, defaultAbiCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AbiCoder", function() { return AbiCoder; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultAbiCoder", function() { return defaultAbiCoder; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/abi/lib.esm/_version.js"); +/* harmony import */ var _coders_abstract_coder__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./coders/abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); +/* harmony import */ var _coders_address__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./coders/address */ "./node_modules/@ethersproject/abi/lib.esm/coders/address.js"); +/* harmony import */ var _coders_array__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coders/array */ "./node_modules/@ethersproject/abi/lib.esm/coders/array.js"); +/* harmony import */ var _coders_boolean__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coders/boolean */ "./node_modules/@ethersproject/abi/lib.esm/coders/boolean.js"); +/* harmony import */ var _coders_bytes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./coders/bytes */ "./node_modules/@ethersproject/abi/lib.esm/coders/bytes.js"); +/* harmony import */ var _coders_fixed_bytes__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./coders/fixed-bytes */ "./node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js"); +/* harmony import */ var _coders_null__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./coders/null */ "./node_modules/@ethersproject/abi/lib.esm/coders/null.js"); +/* harmony import */ var _coders_number__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./coders/number */ "./node_modules/@ethersproject/abi/lib.esm/coders/number.js"); +/* harmony import */ var _coders_string__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./coders/string */ "./node_modules/@ethersproject/abi/lib.esm/coders/string.js"); +/* harmony import */ var _coders_tuple__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./coders/tuple */ "./node_modules/@ethersproject/abi/lib.esm/coders/tuple.js"); +/* harmony import */ var _fragments__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./fragments */ "./node_modules/@ethersproject/abi/lib.esm/fragments.js"); + +// See: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"](_version__WEBPACK_IMPORTED_MODULE_3__["version"]); + + + + + + + + + + + +const paramTypeBytes = new RegExp(/^bytes([0-9]*)$/); +const paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/); +class AbiCoder { + constructor(coerceFunc) { + logger.checkNew(new.target, AbiCoder); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "coerceFunc", coerceFunc || null); + } + _getCoder(param) { + switch (param.baseType) { + case "address": + return new _coders_address__WEBPACK_IMPORTED_MODULE_5__["AddressCoder"](param.name); + case "bool": + return new _coders_boolean__WEBPACK_IMPORTED_MODULE_7__["BooleanCoder"](param.name); + case "string": + return new _coders_string__WEBPACK_IMPORTED_MODULE_12__["StringCoder"](param.name); + case "bytes": + return new _coders_bytes__WEBPACK_IMPORTED_MODULE_8__["BytesCoder"](param.name); + case "array": + return new _coders_array__WEBPACK_IMPORTED_MODULE_6__["ArrayCoder"](this._getCoder(param.arrayChildren), param.arrayLength, param.name); + case "tuple": + return new _coders_tuple__WEBPACK_IMPORTED_MODULE_13__["TupleCoder"]((param.components || []).map((component) => { + return this._getCoder(component); + }), param.name); + case "": + return new _coders_null__WEBPACK_IMPORTED_MODULE_10__["NullCoder"](param.name); + } + // u?int[0-9]* + let match = param.type.match(paramTypeNumber); + if (match) { + let size = parseInt(match[2] || "256"); + if (size === 0 || size > 256 || (size % 8) !== 0) { + logger.throwArgumentError("invalid " + match[1] + " bit length", "param", param); + } + return new _coders_number__WEBPACK_IMPORTED_MODULE_11__["NumberCoder"](size / 8, (match[1] === "int"), param.name); + } + // bytes[0-9]+ + match = param.type.match(paramTypeBytes); + if (match) { + let size = parseInt(match[1]); + if (size === 0 || size > 32) { + logger.throwArgumentError("invalid bytes length", "param", param); + } + return new _coders_fixed_bytes__WEBPACK_IMPORTED_MODULE_9__["FixedBytesCoder"](size, param.name); + } + return logger.throwArgumentError("invalid type", "type", param.type); + } + _getWordSize() { return 32; } + _getReader(data, allowLoose) { + return new _coders_abstract_coder__WEBPACK_IMPORTED_MODULE_4__["Reader"](data, this._getWordSize(), this.coerceFunc, allowLoose); + } + _getWriter() { + return new _coders_abstract_coder__WEBPACK_IMPORTED_MODULE_4__["Writer"](this._getWordSize()); + } + getDefaultValue(types) { + const coders = types.map((type) => this._getCoder(_fragments__WEBPACK_IMPORTED_MODULE_14__["ParamType"].from(type))); + const coder = new _coders_tuple__WEBPACK_IMPORTED_MODULE_13__["TupleCoder"](coders, "_"); + return coder.defaultValue(); + } + encode(types, values) { + if (types.length !== values.length) { + logger.throwError("types/values length mismatch", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.INVALID_ARGUMENT, { + count: { types: types.length, values: values.length }, + value: { types: types, values: values } + }); + } + const coders = types.map((type) => this._getCoder(_fragments__WEBPACK_IMPORTED_MODULE_14__["ParamType"].from(type))); + const coder = (new _coders_tuple__WEBPACK_IMPORTED_MODULE_13__["TupleCoder"](coders, "_")); + const writer = this._getWriter(); + coder.encode(writer, values); + return writer.data; + } + decode(types, data, loose) { + const coders = types.map((type) => this._getCoder(_fragments__WEBPACK_IMPORTED_MODULE_14__["ParamType"].from(type))); + const coder = new _coders_tuple__WEBPACK_IMPORTED_MODULE_13__["TupleCoder"](coders, "_"); + return coder.decode(this._getReader(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(data), loose)); + } +} +const defaultAbiCoder = new AbiCoder(); +//# sourceMappingURL=abi-coder.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js ***! + \**************************************************************************/ +/*! exports provided: checkResultErrors, Coder, Writer, Reader */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkResultErrors", function() { return checkResultErrors; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Coder", function() { return Coder; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Writer", function() { return Writer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Reader", function() { return Reader; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../_version */ "./node_modules/@ethersproject/abi/lib.esm/_version.js"); + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"](_version__WEBPACK_IMPORTED_MODULE_4__["version"]); +function checkResultErrors(result) { + // Find the first error (if any) + const errors = []; + const checkErrors = function (path, object) { + if (!Array.isArray(object)) { + return; + } + for (let key in object) { + const childPath = path.slice(); + childPath.push(key); + try { + checkErrors(childPath, object[key]); + } + catch (error) { + errors.push({ path: childPath, error: error }); + } + } + }; + checkErrors([], result); + return errors; +} +class Coder { + constructor(name, type, localName, dynamic) { + // @TODO: defineReadOnly these + this.name = name; + this.type = type; + this.localName = localName; + this.dynamic = dynamic; + } + _throwError(message, value) { + logger.throwArgumentError(message, this.localName, value); + } +} +class Writer { + constructor(wordSize) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "wordSize", wordSize || 32); + this._data = []; + this._dataLength = 0; + this._padding = new Uint8Array(wordSize); + } + get data() { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexConcat"])(this._data); + } + get length() { return this._dataLength; } + _writeData(data) { + this._data.push(data); + this._dataLength += data.length; + return data.length; + } + appendWriter(writer) { + return this._writeData(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["concat"])(writer._data)); + } + // Arrayish items; padded on the right to wordSize + writeBytes(value) { + let bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(value); + const paddingOffset = bytes.length % this.wordSize; + if (paddingOffset) { + bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["concat"])([bytes, this._padding.slice(paddingOffset)]); + } + return this._writeData(bytes); + } + _getValue(value) { + let bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value)); + if (bytes.length > this.wordSize) { + logger.throwError("value out-of-bounds", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"].errors.BUFFER_OVERRUN, { + length: this.wordSize, + offset: bytes.length + }); + } + if (bytes.length % this.wordSize) { + bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["concat"])([this._padding.slice(bytes.length % this.wordSize), bytes]); + } + return bytes; + } + // BigNumberish items; padded on the left to wordSize + writeValue(value) { + return this._writeData(this._getValue(value)); + } + writeUpdatableValue() { + const offset = this._data.length; + this._data.push(this._padding); + this._dataLength += this.wordSize; + return (value) => { + this._data[offset] = this._getValue(value); + }; + } +} +class Reader { + constructor(data, wordSize, coerceFunc, allowLoose) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "_data", Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(data)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "wordSize", wordSize || 32); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "_coerceFunc", coerceFunc); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "allowLoose", allowLoose); + this._offset = 0; + } + get data() { return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(this._data); } + get consumed() { return this._offset; } + // The default Coerce function + static coerce(name, value) { + let match = name.match("^u?int([0-9]+)$"); + if (match && parseInt(match[1]) <= 48) { + value = value.toNumber(); + } + return value; + } + coerce(name, value) { + if (this._coerceFunc) { + return this._coerceFunc(name, value); + } + return Reader.coerce(name, value); + } + _peekBytes(offset, length, loose) { + let alignedLength = Math.ceil(length / this.wordSize) * this.wordSize; + if (this._offset + alignedLength > this._data.length) { + if (this.allowLoose && loose && this._offset + length <= this._data.length) { + alignedLength = length; + } + else { + logger.throwError("data out-of-bounds", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"].errors.BUFFER_OVERRUN, { + length: this._data.length, + offset: this._offset + alignedLength + }); + } + } + return this._data.slice(this._offset, this._offset + alignedLength); + } + subReader(offset) { + return new Reader(this._data.slice(this._offset + offset), this.wordSize, this._coerceFunc, this.allowLoose); + } + readBytes(length, loose) { + let bytes = this._peekBytes(0, length, !!loose); + this._offset += bytes.length; + // @TODO: Make sure the length..end bytes are all 0? + return bytes.slice(0, length); + } + readValue() { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(this.readBytes(this.wordSize)); + } +} +//# sourceMappingURL=abstract-coder.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/address.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/address.js ***! + \*******************************************************************/ +/*! exports provided: AddressCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddressCoder", function() { return AddressCoder; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + + + +class AddressCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_2__["Coder"] { + constructor(localName) { + super("address", "address", localName, false); + } + defaultValue() { + return "0x0000000000000000000000000000000000000000"; + } + encode(writer, value) { + try { + Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(value); + } + catch (error) { + this._throwError(error.message, value); + } + return writer.writeValue(value); + } + decode(reader) { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexZeroPad"])(reader.readValue().toHexString(), 20)); + } +} +//# sourceMappingURL=address.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js ***! + \*********************************************************************/ +/*! exports provided: AnonymousCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousCoder", function() { return AnonymousCoder; }); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + +// Clones the functionality of an existing Coder, but without a localName +class AnonymousCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_0__["Coder"] { + constructor(coder) { + super(coder.name, coder.type, undefined, coder.dynamic); + this.coder = coder; + } + defaultValue() { + return this.coder.defaultValue(); + } + encode(writer, value) { + return this.coder.encode(writer, value); + } + decode(reader) { + return this.coder.decode(reader); + } +} +//# sourceMappingURL=anonymous.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/array.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/array.js ***! + \*****************************************************************/ +/*! exports provided: pack, unpack, ArrayCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pack", function() { return pack; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unpack", function() { return unpack; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArrayCoder", function() { return ArrayCoder; }); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../_version */ "./node_modules/@ethersproject/abi/lib.esm/_version.js"); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); +/* harmony import */ var _anonymous__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./anonymous */ "./node_modules/@ethersproject/abi/lib.esm/coders/anonymous.js"); + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"](_version__WEBPACK_IMPORTED_MODULE_1__["version"]); + + +function pack(writer, coders, values) { + let arrayValues = null; + if (Array.isArray(values)) { + arrayValues = values; + } + else if (values && typeof (values) === "object") { + let unique = {}; + arrayValues = coders.map((coder) => { + const name = coder.localName; + if (!name) { + logger.throwError("cannot encode object for signature with missing names", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"].errors.INVALID_ARGUMENT, { + argument: "values", + coder: coder, + value: values + }); + } + if (unique[name]) { + logger.throwError("cannot encode object for signature with duplicate names", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"].errors.INVALID_ARGUMENT, { + argument: "values", + coder: coder, + value: values + }); + } + unique[name] = true; + return values[name]; + }); + } + else { + logger.throwArgumentError("invalid tuple value", "tuple", values); + } + if (coders.length !== arrayValues.length) { + logger.throwArgumentError("types/value length mismatch", "tuple", values); + } + let staticWriter = new _abstract_coder__WEBPACK_IMPORTED_MODULE_2__["Writer"](writer.wordSize); + let dynamicWriter = new _abstract_coder__WEBPACK_IMPORTED_MODULE_2__["Writer"](writer.wordSize); + let updateFuncs = []; + coders.forEach((coder, index) => { + let value = arrayValues[index]; + if (coder.dynamic) { + // Get current dynamic offset (for the future pointer) + let dynamicOffset = dynamicWriter.length; + // Encode the dynamic value into the dynamicWriter + coder.encode(dynamicWriter, value); + // Prepare to populate the correct offset once we are done + let updateFunc = staticWriter.writeUpdatableValue(); + updateFuncs.push((baseOffset) => { + updateFunc(baseOffset + dynamicOffset); + }); + } + else { + coder.encode(staticWriter, value); + } + }); + // Backfill all the dynamic offsets, now that we know the static length + updateFuncs.forEach((func) => { func(staticWriter.length); }); + let length = writer.appendWriter(staticWriter); + length += writer.appendWriter(dynamicWriter); + return length; +} +function unpack(reader, coders) { + let values = []; + // A reader anchored to this base + let baseReader = reader.subReader(0); + coders.forEach((coder) => { + let value = null; + if (coder.dynamic) { + let offset = reader.readValue(); + let offsetReader = baseReader.subReader(offset.toNumber()); + try { + value = coder.decode(offsetReader); + } + catch (error) { + // Cannot recover from this + if (error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"].errors.BUFFER_OVERRUN) { + throw error; + } + value = error; + value.baseType = coder.name; + value.name = coder.localName; + value.type = coder.type; + } + } + else { + try { + value = coder.decode(reader); + } + catch (error) { + // Cannot recover from this + if (error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"].errors.BUFFER_OVERRUN) { + throw error; + } + value = error; + value.baseType = coder.name; + value.name = coder.localName; + value.type = coder.type; + } + } + if (value != undefined) { + values.push(value); + } + }); + // We only output named properties for uniquely named coders + const uniqueNames = coders.reduce((accum, coder) => { + const name = coder.localName; + if (name) { + if (!accum[name]) { + accum[name] = 0; + } + accum[name]++; + } + return accum; + }, {}); + // Add any named parameters (i.e. tuples) + coders.forEach((coder, index) => { + let name = coder.localName; + if (!name || uniqueNames[name] !== 1) { + return; + } + if (name === "length") { + name = "_length"; + } + if (values[name] != null) { + return; + } + const value = values[index]; + if (value instanceof Error) { + Object.defineProperty(values, name, { + get: () => { throw value; } + }); + } + else { + values[name] = value; + } + }); + for (let i = 0; i < values.length; i++) { + const value = values[i]; + if (value instanceof Error) { + Object.defineProperty(values, i, { + get: () => { throw value; } + }); + } + } + return Object.freeze(values); +} +class ArrayCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_2__["Coder"] { + constructor(coder, length, localName) { + const type = (coder.type + "[" + (length >= 0 ? length : "") + "]"); + const dynamic = (length === -1 || coder.dynamic); + super("array", type, localName, dynamic); + this.coder = coder; + this.length = length; + } + defaultValue() { + // Verifies the child coder is valid (even if the array is dynamic or 0-length) + const defaultChild = this.coder.defaultValue(); + const result = []; + for (let i = 0; i < this.length; i++) { + result.push(defaultChild); + } + return result; + } + encode(writer, value) { + if (!Array.isArray(value)) { + this._throwError("expected array value", value); + } + let count = this.length; + if (count === -1) { + count = value.length; + writer.writeValue(value.length); + } + logger.checkArgumentCount(value.length, count, "coder array" + (this.localName ? (" " + this.localName) : "")); + let coders = []; + for (let i = 0; i < value.length; i++) { + coders.push(this.coder); + } + return pack(writer, coders, value); + } + decode(reader) { + let count = this.length; + if (count === -1) { + count = reader.readValue().toNumber(); + } + let coders = []; + for (let i = 0; i < count; i++) { + coders.push(new _anonymous__WEBPACK_IMPORTED_MODULE_3__["AnonymousCoder"](this.coder)); + } + return reader.coerce(this.name, unpack(reader, coders)); + } +} +//# sourceMappingURL=array.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/boolean.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/boolean.js ***! + \*******************************************************************/ +/*! exports provided: BooleanCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BooleanCoder", function() { return BooleanCoder; }); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + +class BooleanCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_0__["Coder"] { + constructor(localName) { + super("bool", "bool", localName, false); + } + defaultValue() { + return false; + } + encode(writer, value) { + return writer.writeValue(value ? 1 : 0); + } + decode(reader) { + return reader.coerce(this.type, !reader.readValue().isZero()); + } +} +//# sourceMappingURL=boolean.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/bytes.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/bytes.js ***! + \*****************************************************************/ +/*! exports provided: DynamicBytesCoder, BytesCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DynamicBytesCoder", function() { return DynamicBytesCoder; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BytesCoder", function() { return BytesCoder; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + + +class DynamicBytesCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_1__["Coder"] { + constructor(type, localName) { + super(type, type, localName, true); + } + defaultValue() { + return "0x"; + } + encode(writer, value) { + value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(value); + let length = writer.writeValue(value.length); + length += writer.writeBytes(value); + return length; + } + decode(reader) { + return reader.readBytes(reader.readValue().toNumber(), true); + } +} +class BytesCoder extends DynamicBytesCoder { + constructor(localName) { + super("bytes", localName); + } + decode(reader) { + return reader.coerce(this.name, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(super.decode(reader))); + } +} +//# sourceMappingURL=bytes.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/fixed-bytes.js ***! + \***********************************************************************/ +/*! exports provided: FixedBytesCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FixedBytesCoder", function() { return FixedBytesCoder; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + + +// @TODO: Merge this with bytes +class FixedBytesCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_1__["Coder"] { + constructor(size, localName) { + let name = "bytes" + String(size); + super(name, name, localName, false); + this.size = size; + } + defaultValue() { + return ("0x0000000000000000000000000000000000000000000000000000000000000000").substring(0, 2 + this.size * 2); + } + encode(writer, value) { + let data = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(value); + if (data.length !== this.size) { + this._throwError("incorrect data length", value); + } + return writer.writeBytes(data); + } + decode(reader) { + return reader.coerce(this.name, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(reader.readBytes(this.size))); + } +} +//# sourceMappingURL=fixed-bytes.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/null.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/null.js ***! + \****************************************************************/ +/*! exports provided: NullCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NullCoder", function() { return NullCoder; }); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + +class NullCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_0__["Coder"] { + constructor(localName) { + super("null", "", localName, false); + } + defaultValue() { + return null; + } + encode(writer, value) { + if (value != null) { + this._throwError("not null", value); + } + return writer.writeBytes([]); + } + decode(reader) { + reader.readBytes(0); + return reader.coerce(this.name, null); + } +} +//# sourceMappingURL=null.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/number.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/number.js ***! + \******************************************************************/ +/*! exports provided: NumberCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NumberCoder", function() { return NumberCoder; }); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/constants */ "./node_modules/@ethersproject/constants/lib.esm/index.js"); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); + + + + +class NumberCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_2__["Coder"] { + constructor(size, signed, localName) { + const name = ((signed ? "int" : "uint") + (size * 8)); + super(name, name, localName, false); + this.size = size; + this.signed = signed; + } + defaultValue() { + return 0; + } + encode(writer, value) { + let v = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(value); + // Check bounds are safe for encoding + let maxUintValue = _ethersproject_constants__WEBPACK_IMPORTED_MODULE_1__["MaxUint256"].mask(writer.wordSize * 8); + if (this.signed) { + let bounds = maxUintValue.mask(this.size * 8 - 1); + if (v.gt(bounds) || v.lt(bounds.add(_ethersproject_constants__WEBPACK_IMPORTED_MODULE_1__["One"]).mul(_ethersproject_constants__WEBPACK_IMPORTED_MODULE_1__["NegativeOne"]))) { + this._throwError("value out-of-bounds", value); + } + } + else if (v.lt(_ethersproject_constants__WEBPACK_IMPORTED_MODULE_1__["Zero"]) || v.gt(maxUintValue.mask(this.size * 8))) { + this._throwError("value out-of-bounds", value); + } + v = v.toTwos(this.size * 8).mask(this.size * 8); + if (this.signed) { + v = v.fromTwos(this.size * 8).toTwos(8 * writer.wordSize); + } + return writer.writeValue(v); + } + decode(reader) { + let value = reader.readValue().mask(this.size * 8); + if (this.signed) { + value = value.fromTwos(this.size * 8); + } + return reader.coerce(this.name, value); + } +} +//# sourceMappingURL=number.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/string.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/string.js ***! + \******************************************************************/ +/*! exports provided: StringCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StringCoder", function() { return StringCoder; }); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bytes */ "./node_modules/@ethersproject/abi/lib.esm/coders/bytes.js"); + + + +class StringCoder extends _bytes__WEBPACK_IMPORTED_MODULE_1__["DynamicBytesCoder"] { + constructor(localName) { + super("string", localName); + } + defaultValue() { + return ""; + } + encode(writer, value) { + return super.encode(writer, Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8Bytes"])(value)); + } + decode(reader) { + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])(super.decode(reader)); + } +} +//# sourceMappingURL=string.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/coders/tuple.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/coders/tuple.js ***! + \*****************************************************************/ +/*! exports provided: TupleCoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TupleCoder", function() { return TupleCoder; }); +/* harmony import */ var _abstract_coder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); +/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/@ethersproject/abi/lib.esm/coders/array.js"); + + + +class TupleCoder extends _abstract_coder__WEBPACK_IMPORTED_MODULE_0__["Coder"] { + constructor(coders, localName) { + let dynamic = false; + const types = []; + coders.forEach((coder) => { + if (coder.dynamic) { + dynamic = true; + } + types.push(coder.type); + }); + const type = ("tuple(" + types.join(",") + ")"); + super("tuple", type, localName, dynamic); + this.coders = coders; + } + defaultValue() { + const values = []; + this.coders.forEach((coder) => { + values.push(coder.defaultValue()); + }); + // We only output named properties for uniquely named coders + const uniqueNames = this.coders.reduce((accum, coder) => { + const name = coder.localName; + if (name) { + if (!accum[name]) { + accum[name] = 0; + } + accum[name]++; + } + return accum; + }, {}); + // Add named values + this.coders.forEach((coder, index) => { + let name = coder.localName; + if (!name || uniqueNames[name] !== 1) { + return; + } + if (name === "length") { + name = "_length"; + } + if (values[name] != null) { + return; + } + values[name] = values[index]; + }); + return Object.freeze(values); + } + encode(writer, value) { + return Object(_array__WEBPACK_IMPORTED_MODULE_1__["pack"])(writer, this.coders, value); + } + decode(reader) { + return reader.coerce(this.name, Object(_array__WEBPACK_IMPORTED_MODULE_1__["unpack"])(reader, this.coders)); + } +} +//# sourceMappingURL=tuple.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/fragments.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/fragments.js ***! + \**************************************************************/ +/*! exports provided: FormatTypes, ParamType, Fragment, EventFragment, ConstructorFragment, FunctionFragment */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FormatTypes", function() { return FormatTypes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ParamType", function() { return ParamType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Fragment", function() { return Fragment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventFragment", function() { return EventFragment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConstructorFragment", function() { return ConstructorFragment; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FunctionFragment", function() { return FunctionFragment; }); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/abi/lib.esm/_version.js"); + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"](_version__WEBPACK_IMPORTED_MODULE_3__["version"]); +; +const _constructorGuard = {}; +let ModifiersBytes = { calldata: true, memory: true, storage: true }; +let ModifiersNest = { calldata: true, memory: true }; +function checkModifier(type, name) { + if (type === "bytes" || type === "string") { + if (ModifiersBytes[name]) { + return true; + } + } + else if (type === "address") { + if (name === "payable") { + return true; + } + } + else if (type.indexOf("[") >= 0 || type === "tuple") { + if (ModifiersNest[name]) { + return true; + } + } + if (ModifiersBytes[name] || name === "payable") { + logger.throwArgumentError("invalid modifier", "name", name); + } + return false; +} +// @TODO: Make sure that children of an indexed tuple are marked with a null indexed +function parseParamType(param, allowIndexed) { + let originalParam = param; + function throwError(i) { + logger.throwArgumentError(`unexpected character at position ${i}`, "param", param); + } + param = param.replace(/\s/g, " "); + function newNode(parent) { + let node = { type: "", name: "", parent: parent, state: { allowType: true } }; + if (allowIndexed) { + node.indexed = false; + } + return node; + } + let parent = { type: "", name: "", state: { allowType: true } }; + let node = parent; + for (let i = 0; i < param.length; i++) { + let c = param[i]; + switch (c) { + case "(": + if (node.state.allowType && node.type === "") { + node.type = "tuple"; + } + else if (!node.state.allowParams) { + throwError(i); + } + node.state.allowType = false; + node.type = verifyType(node.type); + node.components = [newNode(node)]; + node = node.components[0]; + break; + case ")": + delete node.state; + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(i); + } + node.indexed = true; + node.name = ""; + } + if (checkModifier(node.type, node.name)) { + node.name = ""; + } + node.type = verifyType(node.type); + let child = node; + node = node.parent; + if (!node) { + throwError(i); + } + delete child.parent; + node.state.allowParams = false; + node.state.allowName = true; + node.state.allowArray = true; + break; + case ",": + delete node.state; + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(i); + } + node.indexed = true; + node.name = ""; + } + if (checkModifier(node.type, node.name)) { + node.name = ""; + } + node.type = verifyType(node.type); + let sibling = newNode(node.parent); + //{ type: "", name: "", parent: node.parent, state: { allowType: true } }; + node.parent.components.push(sibling); + delete node.parent; + node = sibling; + break; + // Hit a space... + case " ": + // If reading type, the type is done and may read a param or name + if (node.state.allowType) { + if (node.type !== "") { + node.type = verifyType(node.type); + delete node.state.allowType; + node.state.allowName = true; + node.state.allowParams = true; + } + } + // If reading name, the name is done + if (node.state.allowName) { + if (node.name !== "") { + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(i); + } + if (node.indexed) { + throwError(i); + } + node.indexed = true; + node.name = ""; + } + else if (checkModifier(node.type, node.name)) { + node.name = ""; + } + else { + node.state.allowName = false; + } + } + } + break; + case "[": + if (!node.state.allowArray) { + throwError(i); + } + node.type += c; + node.state.allowArray = false; + node.state.allowName = false; + node.state.readArray = true; + break; + case "]": + if (!node.state.readArray) { + throwError(i); + } + node.type += c; + node.state.readArray = false; + node.state.allowArray = true; + node.state.allowName = true; + break; + default: + if (node.state.allowType) { + node.type += c; + node.state.allowParams = true; + node.state.allowArray = true; + } + else if (node.state.allowName) { + node.name += c; + delete node.state.allowArray; + } + else if (node.state.readArray) { + node.type += c; + } + else { + throwError(i); + } + } + } + if (node.parent) { + logger.throwArgumentError("unexpected eof", "param", param); + } + delete parent.state; + if (node.name === "indexed") { + if (!allowIndexed) { + throwError(originalParam.length - 7); + } + if (node.indexed) { + throwError(originalParam.length - 7); + } + node.indexed = true; + node.name = ""; + } + else if (checkModifier(node.type, node.name)) { + node.name = ""; + } + parent.type = verifyType(parent.type); + return parent; +} +function populate(object, params) { + for (let key in params) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(object, key, params[key]); + } +} +const FormatTypes = Object.freeze({ + // Bare formatting, as is needed for computing a sighash of an event or function + sighash: "sighash", + // Human-Readable with Minimal spacing and without names (compact human-readable) + minimal: "minimal", + // Human-Readble with nice spacing, including all names + full: "full", + // JSON-format a la Solidity + json: "json" +}); +const paramTypeArray = new RegExp(/^(.*)\[([0-9]*)\]$/); +class ParamType { + constructor(constructorGuard, params) { + if (constructorGuard !== _constructorGuard) { + logger.throwError("use fromString", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new ParamType()" + }); + } + populate(this, params); + let match = this.type.match(paramTypeArray); + if (match) { + populate(this, { + arrayLength: parseInt(match[2] || "-1"), + arrayChildren: ParamType.fromObject({ + type: match[1], + components: this.components + }), + baseType: "array" + }); + } + else { + populate(this, { + arrayLength: null, + arrayChildren: null, + baseType: ((this.components != null) ? "tuple" : this.type) + }); + } + this._isParamType = true; + Object.freeze(this); + } + // Format the parameter fragment + // - sighash: "(uint256,address)" + // - minimal: "tuple(uint256,address) indexed" + // - full: "tuple(uint256 foo, addres bar) indexed baz" + format(format) { + if (!format) { + format = FormatTypes.sighash; + } + if (!FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === FormatTypes.json) { + let result = { + type: ((this.baseType === "tuple") ? "tuple" : this.type), + name: (this.name || undefined) + }; + if (typeof (this.indexed) === "boolean") { + result.indexed = this.indexed; + } + if (this.components) { + result.components = this.components.map((comp) => JSON.parse(comp.format(format))); + } + return JSON.stringify(result); + } + let result = ""; + // Array + if (this.baseType === "array") { + result += this.arrayChildren.format(format); + result += "[" + (this.arrayLength < 0 ? "" : String(this.arrayLength)) + "]"; + } + else { + if (this.baseType === "tuple") { + if (format !== FormatTypes.sighash) { + result += this.type; + } + result += "(" + this.components.map((comp) => comp.format(format)).join((format === FormatTypes.full) ? ", " : ",") + ")"; + } + else { + result += this.type; + } + } + if (format !== FormatTypes.sighash) { + if (this.indexed === true) { + result += " indexed"; + } + if (format === FormatTypes.full && this.name) { + result += " " + this.name; + } + } + return result; + } + static from(value, allowIndexed) { + if (typeof (value) === "string") { + return ParamType.fromString(value, allowIndexed); + } + return ParamType.fromObject(value); + } + static fromObject(value) { + if (ParamType.isParamType(value)) { + return value; + } + return new ParamType(_constructorGuard, { + name: (value.name || null), + type: verifyType(value.type), + indexed: ((value.indexed == null) ? null : !!value.indexed), + components: (value.components ? value.components.map(ParamType.fromObject) : null) + }); + } + static fromString(value, allowIndexed) { + function ParamTypify(node) { + return ParamType.fromObject({ + name: node.name, + type: node.type, + indexed: node.indexed, + components: node.components + }); + } + return ParamTypify(parseParamType(value, !!allowIndexed)); + } + static isParamType(value) { + return !!(value != null && value._isParamType); + } +} +; +function parseParams(value, allowIndex) { + return splitNesting(value).map((param) => ParamType.fromString(param, allowIndex)); +} +class Fragment { + constructor(constructorGuard, params) { + if (constructorGuard !== _constructorGuard) { + logger.throwError("use a static from method", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new Fragment()" + }); + } + populate(this, params); + this._isFragment = true; + Object.freeze(this); + } + static from(value) { + if (Fragment.isFragment(value)) { + return value; + } + if (typeof (value) === "string") { + return Fragment.fromString(value); + } + return Fragment.fromObject(value); + } + static fromObject(value) { + if (Fragment.isFragment(value)) { + return value; + } + switch (value.type) { + case "function": + return FunctionFragment.fromObject(value); + case "event": + return EventFragment.fromObject(value); + case "constructor": + return ConstructorFragment.fromObject(value); + case "fallback": + case "receive": + // @TODO: Something? Maybe return a FunctionFragment? A custom DefaultFunctionFragment? + return null; + } + return logger.throwArgumentError("invalid fragment object", "value", value); + } + static fromString(value) { + // Make sure the "returns" is surrounded by a space and all whitespace is exactly one space + value = value.replace(/\s/g, " "); + value = value.replace(/\(/g, " (").replace(/\)/g, ") ").replace(/\s+/g, " "); + value = value.trim(); + if (value.split(" ")[0] === "event") { + return EventFragment.fromString(value.substring(5).trim()); + } + else if (value.split(" ")[0] === "function") { + return FunctionFragment.fromString(value.substring(8).trim()); + } + else if (value.split("(")[0].trim() === "constructor") { + return ConstructorFragment.fromString(value.trim()); + } + return logger.throwArgumentError("unsupported fragment", "value", value); + } + static isFragment(value) { + return !!(value && value._isFragment); + } +} +class EventFragment extends Fragment { + format(format) { + if (!format) { + format = FormatTypes.sighash; + } + if (!FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === FormatTypes.json) { + return JSON.stringify({ + type: "event", + anonymous: this.anonymous, + name: this.name, + inputs: this.inputs.map((input) => JSON.parse(input.format(format))) + }); + } + let result = ""; + if (format !== FormatTypes.sighash) { + result += "event "; + } + result += this.name + "(" + this.inputs.map((input) => input.format(format)).join((format === FormatTypes.full) ? ", " : ",") + ") "; + if (format !== FormatTypes.sighash) { + if (this.anonymous) { + result += "anonymous "; + } + } + return result.trim(); + } + static from(value) { + if (typeof (value) === "string") { + return EventFragment.fromString(value); + } + return EventFragment.fromObject(value); + } + static fromObject(value) { + if (EventFragment.isEventFragment(value)) { + return value; + } + if (value.type !== "event") { + logger.throwArgumentError("invalid event object", "value", value); + } + const params = { + name: verifyIdentifier(value.name), + anonymous: value.anonymous, + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []), + type: "event" + }; + return new EventFragment(_constructorGuard, params); + } + static fromString(value) { + let match = value.match(regexParen); + if (!match) { + logger.throwArgumentError("invalid event string", "value", value); + } + let anonymous = false; + match[3].split(" ").forEach((modifier) => { + switch (modifier.trim()) { + case "anonymous": + anonymous = true; + break; + case "": + break; + default: + logger.warn("unknown modifier: " + modifier); + } + }); + return EventFragment.fromObject({ + name: match[1].trim(), + anonymous: anonymous, + inputs: parseParams(match[2], true), + type: "event" + }); + } + static isEventFragment(value) { + return (value && value._isFragment && value.type === "event"); + } +} +function parseGas(value, params) { + params.gas = null; + let comps = value.split("@"); + if (comps.length !== 1) { + if (comps.length > 2) { + logger.throwArgumentError("invalid human-readable ABI signature", "value", value); + } + if (!comps[1].match(/^[0-9]+$/)) { + logger.throwArgumentError("invalid human-readable ABI signature gas", "value", value); + } + params.gas = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(comps[1]); + return comps[0]; + } + return value; +} +function parseModifiers(value, params) { + params.constant = false; + params.payable = false; + params.stateMutability = "nonpayable"; + value.split(" ").forEach((modifier) => { + switch (modifier.trim()) { + case "constant": + params.constant = true; + break; + case "payable": + params.payable = true; + params.stateMutability = "payable"; + break; + case "nonpayable": + params.payable = false; + params.stateMutability = "nonpayable"; + break; + case "pure": + params.constant = true; + params.stateMutability = "pure"; + break; + case "view": + params.constant = true; + params.stateMutability = "view"; + break; + case "external": + case "public": + case "": + break; + default: + console.log("unknown modifier: " + modifier); + } + }); +} +function verifyState(value) { + let result = { + constant: false, + payable: true, + stateMutability: "payable" + }; + if (value.stateMutability != null) { + result.stateMutability = value.stateMutability; + // Set (and check things are consistent) the constant property + result.constant = (result.stateMutability === "view" || result.stateMutability === "pure"); + if (value.constant != null) { + if ((!!value.constant) !== result.constant) { + logger.throwArgumentError("cannot have constant function with mutability " + result.stateMutability, "value", value); + } + } + // Set (and check things are consistent) the payable property + result.payable = (result.stateMutability === "payable"); + if (value.payable != null) { + if ((!!value.payable) !== result.payable) { + logger.throwArgumentError("cannot have payable function with mutability " + result.stateMutability, "value", value); + } + } + } + else if (value.payable != null) { + result.payable = !!value.payable; + // If payable we can assume non-constant; otherwise we can't assume + if (value.constant == null && !result.payable && value.type !== "constructor") { + logger.throwArgumentError("unable to determine stateMutability", "value", value); + } + result.constant = !!value.constant; + if (result.constant) { + result.stateMutability = "view"; + } + else { + result.stateMutability = (result.payable ? "payable" : "nonpayable"); + } + if (result.payable && result.constant) { + logger.throwArgumentError("cannot have constant payable function", "value", value); + } + } + else if (value.constant != null) { + result.constant = !!value.constant; + result.payable = !result.constant; + result.stateMutability = (result.constant ? "view" : "payable"); + } + else if (value.type !== "constructor") { + logger.throwArgumentError("unable to determine stateMutability", "value", value); + } + return result; +} +class ConstructorFragment extends Fragment { + format(format) { + if (!format) { + format = FormatTypes.sighash; + } + if (!FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === FormatTypes.json) { + return JSON.stringify({ + type: "constructor", + stateMutability: ((this.stateMutability !== "nonpayable") ? this.stateMutability : undefined), + payable: this.payable, + gas: (this.gas ? this.gas.toNumber() : undefined), + inputs: this.inputs.map((input) => JSON.parse(input.format(format))) + }); + } + if (format === FormatTypes.sighash) { + logger.throwError("cannot format a constructor for sighash", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "format(sighash)" + }); + } + let result = "constructor(" + this.inputs.map((input) => input.format(format)).join((format === FormatTypes.full) ? ", " : ",") + ") "; + if (this.stateMutability && this.stateMutability !== "nonpayable") { + result += this.stateMutability + " "; + } + return result.trim(); + } + static from(value) { + if (typeof (value) === "string") { + return ConstructorFragment.fromString(value); + } + return ConstructorFragment.fromObject(value); + } + static fromObject(value) { + if (ConstructorFragment.isConstructorFragment(value)) { + return value; + } + if (value.type !== "constructor") { + logger.throwArgumentError("invalid constructor object", "value", value); + } + let state = verifyState(value); + if (state.constant) { + logger.throwArgumentError("constructor cannot be constant", "value", value); + } + const params = { + name: null, + type: value.type, + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []), + payable: state.payable, + stateMutability: state.stateMutability, + gas: (value.gas ? _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(value.gas) : null) + }; + return new ConstructorFragment(_constructorGuard, params); + } + static fromString(value) { + let params = { type: "constructor" }; + value = parseGas(value, params); + let parens = value.match(regexParen); + if (!parens || parens[1].trim() !== "constructor") { + logger.throwArgumentError("invalid constructor string", "value", value); + } + params.inputs = parseParams(parens[2].trim(), false); + parseModifiers(parens[3].trim(), params); + return ConstructorFragment.fromObject(params); + } + static isConstructorFragment(value) { + return (value && value._isFragment && value.type === "constructor"); + } +} +class FunctionFragment extends ConstructorFragment { + format(format) { + if (!format) { + format = FormatTypes.sighash; + } + if (!FormatTypes[format]) { + logger.throwArgumentError("invalid format type", "format", format); + } + if (format === FormatTypes.json) { + return JSON.stringify({ + type: "function", + name: this.name, + constant: this.constant, + stateMutability: ((this.stateMutability !== "nonpayable") ? this.stateMutability : undefined), + payable: this.payable, + gas: (this.gas ? this.gas.toNumber() : undefined), + inputs: this.inputs.map((input) => JSON.parse(input.format(format))), + outputs: this.outputs.map((output) => JSON.parse(output.format(format))), + }); + } + let result = ""; + if (format !== FormatTypes.sighash) { + result += "function "; + } + result += this.name + "(" + this.inputs.map((input) => input.format(format)).join((format === FormatTypes.full) ? ", " : ",") + ") "; + if (format !== FormatTypes.sighash) { + if (this.stateMutability) { + if (this.stateMutability !== "nonpayable") { + result += (this.stateMutability + " "); + } + } + else if (this.constant) { + result += "view "; + } + if (this.outputs && this.outputs.length) { + result += "returns (" + this.outputs.map((output) => output.format(format)).join(", ") + ") "; + } + if (this.gas != null) { + result += "@" + this.gas.toString() + " "; + } + } + return result.trim(); + } + static from(value) { + if (typeof (value) === "string") { + return FunctionFragment.fromString(value); + } + return FunctionFragment.fromObject(value); + } + static fromObject(value) { + if (FunctionFragment.isFunctionFragment(value)) { + return value; + } + if (value.type !== "function") { + logger.throwArgumentError("invalid function object", "value", value); + } + let state = verifyState(value); + const params = { + type: value.type, + name: verifyIdentifier(value.name), + constant: state.constant, + inputs: (value.inputs ? value.inputs.map(ParamType.fromObject) : []), + outputs: (value.outputs ? value.outputs.map(ParamType.fromObject) : []), + payable: state.payable, + stateMutability: state.stateMutability, + gas: (value.gas ? _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(value.gas) : null) + }; + return new FunctionFragment(_constructorGuard, params); + } + static fromString(value) { + let params = { type: "function" }; + value = parseGas(value, params); + let comps = value.split(" returns "); + if (comps.length > 2) { + logger.throwArgumentError("invalid function string", "value", value); + } + let parens = comps[0].match(regexParen); + if (!parens) { + logger.throwArgumentError("invalid function signature", "value", value); + } + params.name = parens[1].trim(); + if (params.name) { + verifyIdentifier(params.name); + } + params.inputs = parseParams(parens[2], false); + parseModifiers(parens[3].trim(), params); + // We have outputs + if (comps.length > 1) { + let returns = comps[1].match(regexParen); + if (returns[1].trim() != "" || returns[3].trim() != "") { + logger.throwArgumentError("unexpected tokens", "value", value); + } + params.outputs = parseParams(returns[2], false); + } + else { + params.outputs = []; + } + return FunctionFragment.fromObject(params); + } + static isFunctionFragment(value) { + return (value && value._isFragment && value.type === "function"); + } +} +//export class ErrorFragment extends Fragment { +//} +//export class StructFragment extends Fragment { +//} +function verifyType(type) { + // These need to be transformed to their full description + if (type.match(/^uint($|[^1-9])/)) { + type = "uint256" + type.substring(4); + } + else if (type.match(/^int($|[^1-9])/)) { + type = "int256" + type.substring(3); + } + // @TODO: more verification + return type; +} +const regexIdentifier = new RegExp("^[A-Za-z_][A-Za-z0-9_]*$"); +function verifyIdentifier(value) { + if (!value || !value.match(regexIdentifier)) { + logger.throwArgumentError(`invalid identifier "${value}"`, "value", value); + } + return value; +} +const regexParen = new RegExp("^([^)(]*)\\((.*)\\)([^)(]*)$"); +function splitNesting(value) { + value = value.trim(); + let result = []; + let accum = ""; + let depth = 0; + for (let offset = 0; offset < value.length; offset++) { + let c = value[offset]; + if (c === "," && depth === 0) { + result.push(accum); + accum = ""; + } + else { + accum += c; + if (c === "(") { + depth++; + } + else if (c === ")") { + depth--; + if (depth === -1) { + logger.throwArgumentError("unbalanced parenthesis", "value", value); + } + } + } + } + if (accum) { + result.push(accum); + } + return result; +} +//# sourceMappingURL=fragments.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/index.js ***! + \**********************************************************/ +/*! exports provided: ConstructorFragment, EventFragment, Fragment, FunctionFragment, ParamType, FormatTypes, AbiCoder, defaultAbiCoder, Interface, Indexed, checkResultErrors, LogDescription, TransactionDescription */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _fragments__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fragments */ "./node_modules/@ethersproject/abi/lib.esm/fragments.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConstructorFragment", function() { return _fragments__WEBPACK_IMPORTED_MODULE_0__["ConstructorFragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EventFragment", function() { return _fragments__WEBPACK_IMPORTED_MODULE_0__["EventFragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Fragment", function() { return _fragments__WEBPACK_IMPORTED_MODULE_0__["Fragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FunctionFragment", function() { return _fragments__WEBPACK_IMPORTED_MODULE_0__["FunctionFragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ParamType", function() { return _fragments__WEBPACK_IMPORTED_MODULE_0__["ParamType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormatTypes", function() { return _fragments__WEBPACK_IMPORTED_MODULE_0__["FormatTypes"]; }); + +/* harmony import */ var _abi_coder__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./abi-coder */ "./node_modules/@ethersproject/abi/lib.esm/abi-coder.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbiCoder", function() { return _abi_coder__WEBPACK_IMPORTED_MODULE_1__["AbiCoder"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultAbiCoder", function() { return _abi_coder__WEBPACK_IMPORTED_MODULE_1__["defaultAbiCoder"]; }); + +/* harmony import */ var _interface__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./interface */ "./node_modules/@ethersproject/abi/lib.esm/interface.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Interface", function() { return _interface__WEBPACK_IMPORTED_MODULE_2__["Interface"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Indexed", function() { return _interface__WEBPACK_IMPORTED_MODULE_2__["Indexed"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "checkResultErrors", function() { return _interface__WEBPACK_IMPORTED_MODULE_2__["checkResultErrors"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogDescription", function() { return _interface__WEBPACK_IMPORTED_MODULE_2__["LogDescription"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransactionDescription", function() { return _interface__WEBPACK_IMPORTED_MODULE_2__["TransactionDescription"]; }); + + + + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abi/lib.esm/interface.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/abi/lib.esm/interface.js ***! + \**************************************************************/ +/*! exports provided: checkResultErrors, LogDescription, TransactionDescription, Indexed, Interface */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogDescription", function() { return LogDescription; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransactionDescription", function() { return TransactionDescription; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Indexed", function() { return Indexed; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Interface", function() { return Interface; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/hash */ "./node_modules/@ethersproject/hash/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _abi_coder__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./abi-coder */ "./node_modules/@ethersproject/abi/lib.esm/abi-coder.js"); +/* harmony import */ var _coders_abstract_coder__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coders/abstract-coder */ "./node_modules/@ethersproject/abi/lib.esm/coders/abstract-coder.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "checkResultErrors", function() { return _coders_abstract_coder__WEBPACK_IMPORTED_MODULE_7__["checkResultErrors"]; }); + +/* harmony import */ var _fragments__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fragments */ "./node_modules/@ethersproject/abi/lib.esm/fragments.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/abi/lib.esm/_version.js"); + + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__["Logger"](_version__WEBPACK_IMPORTED_MODULE_10__["version"]); + +class LogDescription extends _ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["Description"] { +} +class TransactionDescription extends _ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["Description"] { +} +class Indexed extends _ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["Description"] { + static isIndexed(value) { + return !!(value && value._isIndexed); + } +} +function wrapAccessError(property, error) { + const wrap = new Error(`deferred error during ABI decoding triggered accessing ${property}`); + wrap.error = error; + return wrap; +} +/* +function checkNames(fragment: Fragment, type: "input" | "output", params: Array<ParamType>): void { + params.reduce((accum, param) => { + if (param.name) { + if (accum[param.name]) { + logger.throwArgumentError(`duplicate ${ type } parameter ${ JSON.stringify(param.name) } in ${ fragment.format("full") }`, "fragment", fragment); + } + accum[param.name] = true; + } + return accum; + }, <{ [ name: string ]: boolean }>{ }); +} +*/ +class Interface { + constructor(fragments) { + logger.checkNew(new.target, Interface); + let abi = []; + if (typeof (fragments) === "string") { + abi = JSON.parse(fragments); + } + else { + abi = fragments; + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "fragments", abi.map((fragment) => { + return _fragments__WEBPACK_IMPORTED_MODULE_8__["Fragment"].from(fragment); + }).filter((fragment) => (fragment != null))); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "_abiCoder", Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["getStatic"])((new.target), "getAbiCoder")()); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "functions", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "errors", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "events", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "structs", {}); + // Add all fragments by their signature + this.fragments.forEach((fragment) => { + let bucket = null; + switch (fragment.type) { + case "constructor": + if (this.deploy) { + logger.warn("duplicate definition - constructor"); + return; + } + //checkNames(fragment, "input", fragment.inputs); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "deploy", fragment); + return; + case "function": + //checkNames(fragment, "input", fragment.inputs); + //checkNames(fragment, "output", (<FunctionFragment>fragment).outputs); + bucket = this.functions; + break; + case "event": + //checkNames(fragment, "input", fragment.inputs); + bucket = this.events; + break; + default: + return; + } + let signature = fragment.format(); + if (bucket[signature]) { + logger.warn("duplicate definition - " + signature); + return; + } + bucket[signature] = fragment; + }); + // If we do not have a constructor add a default + if (!this.deploy) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "deploy", _fragments__WEBPACK_IMPORTED_MODULE_8__["ConstructorFragment"].from({ + payable: false, + type: "constructor" + })); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "_isInterface", true); + } + format(format) { + if (!format) { + format = _fragments__WEBPACK_IMPORTED_MODULE_8__["FormatTypes"].full; + } + if (format === _fragments__WEBPACK_IMPORTED_MODULE_8__["FormatTypes"].sighash) { + logger.throwArgumentError("interface does not support formatting sighash", "format", format); + } + const abi = this.fragments.map((fragment) => fragment.format(format)); + // We need to re-bundle the JSON fragments a bit + if (format === _fragments__WEBPACK_IMPORTED_MODULE_8__["FormatTypes"].json) { + return JSON.stringify(abi.map((j) => JSON.parse(j))); + } + return abi; + } + // Sub-classes can override these to handle other blockchains + static getAbiCoder() { + return _abi_coder__WEBPACK_IMPORTED_MODULE_6__["defaultAbiCoder"]; + } + static getAddress(address) { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(address); + } + static getSighash(functionFragment) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexDataSlice"])(Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__["id"])(functionFragment.format()), 0, 4); + } + static getEventTopic(eventFragment) { + return Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__["id"])(eventFragment.format()); + } + // Find a function definition by any means necessary (unless it is ambiguous) + getFunction(nameOrSignatureOrSighash) { + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(nameOrSignatureOrSighash)) { + for (const name in this.functions) { + if (nameOrSignatureOrSighash === this.getSighash(name)) { + return this.functions[name]; + } + } + logger.throwArgumentError("no matching function", "sighash", nameOrSignatureOrSighash); + } + // It is a bare name, look up the function (will return null if ambiguous) + if (nameOrSignatureOrSighash.indexOf("(") === -1) { + const name = nameOrSignatureOrSighash.trim(); + const matching = Object.keys(this.functions).filter((f) => (f.split("(" /* fix:) */)[0] === name)); + if (matching.length === 0) { + logger.throwArgumentError("no matching function", "name", name); + } + else if (matching.length > 1) { + logger.throwArgumentError("multiple matching functions", "name", name); + } + return this.functions[matching[0]]; + } + // Normlize the signature and lookup the function + const result = this.functions[_fragments__WEBPACK_IMPORTED_MODULE_8__["FunctionFragment"].fromString(nameOrSignatureOrSighash).format()]; + if (!result) { + logger.throwArgumentError("no matching function", "signature", nameOrSignatureOrSighash); + } + return result; + } + // Find an event definition by any means necessary (unless it is ambiguous) + getEvent(nameOrSignatureOrTopic) { + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(nameOrSignatureOrTopic)) { + const topichash = nameOrSignatureOrTopic.toLowerCase(); + for (const name in this.events) { + if (topichash === this.getEventTopic(name)) { + return this.events[name]; + } + } + logger.throwArgumentError("no matching event", "topichash", topichash); + } + // It is a bare name, look up the function (will return null if ambiguous) + if (nameOrSignatureOrTopic.indexOf("(") === -1) { + const name = nameOrSignatureOrTopic.trim(); + const matching = Object.keys(this.events).filter((f) => (f.split("(" /* fix:) */)[0] === name)); + if (matching.length === 0) { + logger.throwArgumentError("no matching event", "name", name); + } + else if (matching.length > 1) { + logger.throwArgumentError("multiple matching events", "name", name); + } + return this.events[matching[0]]; + } + // Normlize the signature and lookup the function + const result = this.events[_fragments__WEBPACK_IMPORTED_MODULE_8__["EventFragment"].fromString(nameOrSignatureOrTopic).format()]; + if (!result) { + logger.throwArgumentError("no matching event", "signature", nameOrSignatureOrTopic); + } + return result; + } + // Get the sighash (the bytes4 selector) used by Solidity to identify a function + getSighash(functionFragment) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + return Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["getStatic"])(this.constructor, "getSighash")(functionFragment); + } + // Get the topic (the bytes32 hash) used by Solidity to identify an event + getEventTopic(eventFragment) { + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + return Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["getStatic"])(this.constructor, "getEventTopic")(eventFragment); + } + _decodeParams(params, data) { + return this._abiCoder.decode(params, data); + } + _encodeParams(params, values) { + return this._abiCoder.encode(params, values); + } + encodeDeploy(values) { + return this._encodeParams(this.deploy.inputs, values || []); + } + // Decode the data for a function call (e.g. tx.data) + decodeFunctionData(functionFragment, data) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(data); + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(bytes.slice(0, 4)) !== this.getSighash(functionFragment)) { + logger.throwArgumentError(`data signature does not match function ${functionFragment.name}.`, "data", Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(bytes)); + } + return this._decodeParams(functionFragment.inputs, bytes.slice(4)); + } + // Encode the data for a function call (e.g. tx.data) + encodeFunctionData(functionFragment, values) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["concat"])([ + this.getSighash(functionFragment), + this._encodeParams(functionFragment.inputs, values || []) + ])); + } + // Decode the result from a function call (e.g. from eth_call) + decodeFunctionResult(functionFragment, data) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + let bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(data); + let reason = null; + let errorSignature = null; + switch (bytes.length % this._abiCoder._getWordSize()) { + case 0: + try { + return this._abiCoder.decode(functionFragment.outputs, bytes); + } + catch (error) { } + break; + case 4: + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(bytes.slice(0, 4)) === "0x08c379a0") { + errorSignature = "Error(string)"; + reason = this._abiCoder.decode(["string"], bytes.slice(4))[0]; + } + break; + } + return logger.throwError("call revert exception", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__["Logger"].errors.CALL_EXCEPTION, { + method: functionFragment.format(), + errorSignature: errorSignature, + errorArgs: [reason], + reason: reason + }); + } + // Encode the result for a function call (e.g. for eth_call) + encodeFunctionResult(functionFragment, values) { + if (typeof (functionFragment) === "string") { + functionFragment = this.getFunction(functionFragment); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(this._abiCoder.encode(functionFragment.outputs, values || [])); + } + // Create the filter for the event with search criteria (e.g. for eth_filterLog) + encodeFilterTopics(eventFragment, values) { + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + if (values.length > eventFragment.inputs.length) { + logger.throwError("too many arguments for " + eventFragment.format(), _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__["Logger"].errors.UNEXPECTED_ARGUMENT, { + argument: "values", + value: values + }); + } + let topics = []; + if (!eventFragment.anonymous) { + topics.push(this.getEventTopic(eventFragment)); + } + const encodeTopic = (param, value) => { + if (param.type === "string") { + return Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__["id"])(value); + } + else if (param.type === "bytes") { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(value)); + } + // Check addresses are valid + if (param.type === "address") { + this._abiCoder.encode(["address"], [value]); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(value), 32); + }; + values.forEach((value, index) => { + let param = eventFragment.inputs[index]; + if (!param.indexed) { + if (value != null) { + logger.throwArgumentError("cannot filter non-indexed parameters; must be null", ("contract." + param.name), value); + } + return; + } + if (value == null) { + topics.push(null); + } + else if (param.baseType === "array" || param.baseType === "tuple") { + logger.throwArgumentError("filtering with tuples or arrays not supported", ("contract." + param.name), value); + } + else if (Array.isArray(value)) { + topics.push(value.map((value) => encodeTopic(param, value))); + } + else { + topics.push(encodeTopic(param, value)); + } + }); + // Trim off trailing nulls + while (topics.length && topics[topics.length - 1] === null) { + topics.pop(); + } + return topics; + } + encodeEventLog(eventFragment, values) { + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + const topics = []; + const dataTypes = []; + const dataValues = []; + if (!eventFragment.anonymous) { + topics.push(this.getEventTopic(eventFragment)); + } + if (values.length !== eventFragment.inputs.length) { + logger.throwArgumentError("event arguments/values mismatch", "values", values); + } + eventFragment.inputs.forEach((param, index) => { + const value = values[index]; + if (param.indexed) { + if (param.type === "string") { + topics.push(Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__["id"])(value)); + } + else if (param.type === "bytes") { + topics.push(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__["keccak256"])(value)); + } + else if (param.baseType === "tuple" || param.baseType === "array") { + // @TOOD + throw new Error("not implemented"); + } + else { + topics.push(this._abiCoder.encode([param.type], [value])); + } + } + else { + dataTypes.push(param); + dataValues.push(value); + } + }); + return { + data: this._abiCoder.encode(dataTypes, dataValues), + topics: topics + }; + } + // Decode a filter for the event and the search criteria + decodeEventLog(eventFragment, data, topics) { + if (typeof (eventFragment) === "string") { + eventFragment = this.getEvent(eventFragment); + } + if (topics != null && !eventFragment.anonymous) { + let topicHash = this.getEventTopic(eventFragment); + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(topics[0], 32) || topics[0].toLowerCase() !== topicHash) { + logger.throwError("fragment/topic mismatch", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__["Logger"].errors.INVALID_ARGUMENT, { argument: "topics[0]", expected: topicHash, value: topics[0] }); + } + topics = topics.slice(1); + } + let indexed = []; + let nonIndexed = []; + let dynamic = []; + eventFragment.inputs.forEach((param, index) => { + if (param.indexed) { + if (param.type === "string" || param.type === "bytes" || param.baseType === "tuple" || param.baseType === "array") { + indexed.push(_fragments__WEBPACK_IMPORTED_MODULE_8__["ParamType"].fromObject({ type: "bytes32", name: param.name })); + dynamic.push(true); + } + else { + indexed.push(param); + dynamic.push(false); + } + } + else { + nonIndexed.push(param); + dynamic.push(false); + } + }); + let resultIndexed = (topics != null) ? this._abiCoder.decode(indexed, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["concat"])(topics)) : null; + let resultNonIndexed = this._abiCoder.decode(nonIndexed, data, true); + let result = []; + let nonIndexedIndex = 0, indexedIndex = 0; + eventFragment.inputs.forEach((param, index) => { + if (param.indexed) { + if (resultIndexed == null) { + result[index] = new Indexed({ _isIndexed: true, hash: null }); + } + else if (dynamic[index]) { + result[index] = new Indexed({ _isIndexed: true, hash: resultIndexed[indexedIndex++] }); + } + else { + try { + result[index] = resultIndexed[indexedIndex++]; + } + catch (error) { + result[index] = error; + } + } + } + else { + try { + result[index] = resultNonIndexed[nonIndexedIndex++]; + } + catch (error) { + result[index] = error; + } + } + // Add the keyword argument if named and safe + if (param.name && result[param.name] == null) { + const value = result[index]; + // Make error named values throw on access + if (value instanceof Error) { + Object.defineProperty(result, param.name, { + get: () => { throw wrapAccessError(`property ${JSON.stringify(param.name)}`, value); } + }); + } + else { + result[param.name] = value; + } + } + }); + // Make all error indexed values throw on access + for (let i = 0; i < result.length; i++) { + const value = result[i]; + if (value instanceof Error) { + Object.defineProperty(result, i, { + get: () => { throw wrapAccessError(`index ${i}`, value); } + }); + } + } + return Object.freeze(result); + } + // Given a transaction, find the matching function fragment (if any) and + // determine all its properties and call parameters + parseTransaction(tx) { + let fragment = this.getFunction(tx.data.substring(0, 10).toLowerCase()); + if (!fragment) { + return null; + } + return new TransactionDescription({ + args: this._abiCoder.decode(fragment.inputs, "0x" + tx.data.substring(10)), + functionFragment: fragment, + name: fragment.name, + signature: fragment.format(), + sighash: this.getSighash(fragment), + value: _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(tx.value || "0"), + }); + } + // Given an event log, find the matching event fragment (if any) and + // determine all its properties and values + parseLog(log) { + let fragment = this.getEvent(log.topics[0]); + if (!fragment || fragment.anonymous) { + return null; + } + // @TODO: If anonymous, and the only method, and the input count matches, should we parse? + // Probably not, because just because it is the only event in the ABI does + // not mean we have the full ABI; maybe jsut a fragment? + return new LogDescription({ + eventFragment: fragment, + name: fragment.name, + signature: fragment.format(), + topic: this.getEventTopic(fragment), + args: this.decodeEventLog(fragment, log.data, log.topics) + }); + } + /* + static from(value: Array<Fragment | string | JsonAbi> | string | Interface) { + if (Interface.isInterface(value)) { + return value; + } + if (typeof(value) === "string") { + return new Interface(JSON.parse(value)); + } + return new Interface(value); + } + */ + static isInterface(value) { + return !!(value && value._isInterface); + } +} +//# sourceMappingURL=interface.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abstract-provider/lib.esm/_version.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@ethersproject/abstract-provider/lib.esm/_version.js ***! + \***************************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "abstract-provider/5.0.9"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abstract-provider/lib.esm/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ethersproject/abstract-provider/lib.esm/index.js ***! + \************************************************************************/ +/*! exports provided: ForkEvent, BlockForkEvent, TransactionForkEvent, TransactionOrderForkEvent, Provider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ForkEvent", function() { return ForkEvent; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BlockForkEvent", function() { return BlockForkEvent; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransactionForkEvent", function() { return TransactionForkEvent; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TransactionOrderForkEvent", function() { return TransactionOrderForkEvent; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Provider", function() { return Provider; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/abstract-provider/lib.esm/_version.js"); + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"](_version__WEBPACK_IMPORTED_MODULE_3__["version"]); +; +; +//export type CallTransactionable = { +// call(transaction: TransactionRequest): Promise<TransactionResponse>; +//}; +class ForkEvent extends _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["Description"] { + static isForkEvent(value) { + return !!(value && value._isForkEvent); + } +} +class BlockForkEvent extends ForkEvent { + constructor(blockHash, expiry) { + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isHexString"])(blockHash, 32)) { + logger.throwArgumentError("invalid blockHash", "blockHash", blockHash); + } + super({ + _isForkEvent: true, + _isBlockForkEvent: true, + expiry: (expiry || 0), + blockHash: blockHash + }); + } +} +class TransactionForkEvent extends ForkEvent { + constructor(hash, expiry) { + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isHexString"])(hash, 32)) { + logger.throwArgumentError("invalid transaction hash", "hash", hash); + } + super({ + _isForkEvent: true, + _isTransactionForkEvent: true, + expiry: (expiry || 0), + hash: hash + }); + } +} +class TransactionOrderForkEvent extends ForkEvent { + constructor(beforeHash, afterHash, expiry) { + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isHexString"])(beforeHash, 32)) { + logger.throwArgumentError("invalid transaction hash", "beforeHash", beforeHash); + } + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isHexString"])(afterHash, 32)) { + logger.throwArgumentError("invalid transaction hash", "afterHash", afterHash); + } + super({ + _isForkEvent: true, + _isTransactionOrderForkEvent: true, + expiry: (expiry || 0), + beforeHash: beforeHash, + afterHash: afterHash + }); + } +} +/////////////////////////////// +// Exported Abstracts +class Provider { + constructor() { + logger.checkAbstract(new.target, Provider); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_isProvider", true); + } + // Alias for "on" + addListener(eventName, listener) { + return this.on(eventName, listener); + } + // Alias for "off" + removeListener(eventName, listener) { + return this.off(eventName, listener); + } + static isProvider(value) { + return !!(value && value._isProvider); + } +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abstract-signer/lib.esm/_version.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@ethersproject/abstract-signer/lib.esm/_version.js ***! + \*************************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "abstract-signer/5.0.13"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/abstract-signer/lib.esm/index.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@ethersproject/abstract-signer/lib.esm/index.js ***! + \**********************************************************************/ +/*! exports provided: Signer, VoidSigner */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Signer", function() { return Signer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VoidSigner", function() { return VoidSigner; }); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/abstract-signer/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +const allowedTransactionKeys = [ + "chainId", "data", "from", "gasLimit", "gasPrice", "nonce", "to", "value" +]; +const forwardErrors = [ + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.INSUFFICIENT_FUNDS, + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.NONCE_EXPIRED, + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.REPLACEMENT_UNDERPRICED, +]; +; +; +class Signer { + /////////////////// + // Sub-classes MUST call super + constructor() { + logger.checkAbstract(new.target, Signer); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "_isSigner", true); + } + /////////////////// + // Sub-classes MAY override these + getBalance(blockTag) { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("getBalance"); + return yield this.provider.getBalance(this.getAddress(), blockTag); + }); + } + getTransactionCount(blockTag) { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("getTransactionCount"); + return yield this.provider.getTransactionCount(this.getAddress(), blockTag); + }); + } + // Populates "from" if unspecified, and estimates the gas for the transation + estimateGas(transaction) { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("estimateGas"); + const tx = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["resolveProperties"])(this.checkTransaction(transaction)); + return yield this.provider.estimateGas(tx); + }); + } + // Populates "from" if unspecified, and calls with the transation + call(transaction, blockTag) { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("call"); + const tx = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["resolveProperties"])(this.checkTransaction(transaction)); + return yield this.provider.call(tx, blockTag); + }); + } + // Populates all fields in a transaction, signs it and sends it to the network + sendTransaction(transaction) { + this._checkProvider("sendTransaction"); + return this.populateTransaction(transaction).then((tx) => { + return this.signTransaction(tx).then((signedTx) => { + return this.provider.sendTransaction(signedTx); + }); + }); + } + getChainId() { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("getChainId"); + const network = yield this.provider.getNetwork(); + return network.chainId; + }); + } + getGasPrice() { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("getGasPrice"); + return yield this.provider.getGasPrice(); + }); + } + resolveName(name) { + return __awaiter(this, void 0, void 0, function* () { + this._checkProvider("resolveName"); + return yield this.provider.resolveName(name); + }); + } + // Checks a transaction does not contain invalid keys and if + // no "from" is provided, populates it. + // - does NOT require a provider + // - adds "from" is not present + // - returns a COPY (safe to mutate the result) + // By default called from: (overriding these prevents it) + // - call + // - estimateGas + // - populateTransaction (and therefor sendTransaction) + checkTransaction(transaction) { + for (const key in transaction) { + if (allowedTransactionKeys.indexOf(key) === -1) { + logger.throwArgumentError("invalid transaction key: " + key, "transaction", transaction); + } + } + const tx = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["shallowCopy"])(transaction); + if (tx.from == null) { + tx.from = this.getAddress(); + } + else { + // Make sure any provided address matches this signer + tx.from = Promise.all([ + Promise.resolve(tx.from), + this.getAddress() + ]).then((result) => { + if (result[0].toLowerCase() !== result[1].toLowerCase()) { + logger.throwArgumentError("from address mismatch", "transaction", transaction); + } + return result[0]; + }); + } + return tx; + } + // Populates ALL keys for a transaction and checks that "from" matches + // this Signer. Should be used by sendTransaction but NOT by signTransaction. + // By default called from: (overriding these prevents it) + // - sendTransaction + populateTransaction(transaction) { + return __awaiter(this, void 0, void 0, function* () { + const tx = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["resolveProperties"])(this.checkTransaction(transaction)); + if (tx.to != null) { + tx.to = Promise.resolve(tx.to).then((to) => __awaiter(this, void 0, void 0, function* () { + if (to == null) { + return null; + } + const address = yield this.resolveName(to); + if (address == null) { + logger.throwArgumentError("provided ENS name resolves to null", "tx.to", to); + } + return address; + })); + } + if (tx.gasPrice == null) { + tx.gasPrice = this.getGasPrice(); + } + if (tx.nonce == null) { + tx.nonce = this.getTransactionCount("pending"); + } + if (tx.gasLimit == null) { + tx.gasLimit = this.estimateGas(tx).catch((error) => { + if (forwardErrors.indexOf(error.code) >= 0) { + throw error; + } + return logger.throwError("cannot estimate gas; transaction may fail or may require manual gas limit", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNPREDICTABLE_GAS_LIMIT, { + error: error, + tx: tx + }); + }); + } + if (tx.chainId == null) { + tx.chainId = this.getChainId(); + } + else { + tx.chainId = Promise.all([ + Promise.resolve(tx.chainId), + this.getChainId() + ]).then((results) => { + if (results[1] !== 0 && results[0] !== results[1]) { + logger.throwArgumentError("chainId address mismatch", "transaction", transaction); + } + return results[0]; + }); + } + return yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["resolveProperties"])(tx); + }); + } + /////////////////// + // Sub-classes SHOULD leave these alone + _checkProvider(operation) { + if (!this.provider) { + logger.throwError("missing provider", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: (operation || "_checkProvider") + }); + } + } + static isSigner(value) { + return !!(value && value._isSigner); + } +} +class VoidSigner extends Signer { + constructor(address, provider) { + logger.checkNew(new.target, VoidSigner); + super(); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "address", address); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "provider", provider || null); + } + getAddress() { + return Promise.resolve(this.address); + } + _fail(message, operation) { + return Promise.resolve().then(() => { + logger.throwError(message, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: operation }); + }); + } + signMessage(message) { + return this._fail("VoidSigner cannot sign messages", "signMessage"); + } + signTransaction(transaction) { + return this._fail("VoidSigner cannot sign transactions", "signTransaction"); + } + _signTypedData(domain, types, value) { + return this._fail("VoidSigner cannot sign typed data", "signTypedData"); + } + connect(provider) { + return new VoidSigner(this.address, provider); + } +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/address/lib.esm/_version.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/address/lib.esm/_version.js ***! + \*****************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "address/5.0.10"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/address/lib.esm/index.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/address/lib.esm/index.js ***! + \**************************************************************/ +/*! exports provided: getAddress, isAddress, getIcapAddress, getContractAddress, getCreate2Address */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAddress", function() { return getAddress; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isAddress", function() { return isAddress; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getIcapAddress", function() { return getIcapAddress; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getContractAddress", function() { return getContractAddress; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCreate2Address", function() { return getCreate2Address; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/rlp */ "./node_modules/@ethersproject/rlp/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/address/lib.esm/_version.js"); + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"](_version__WEBPACK_IMPORTED_MODULE_5__["version"]); +function getChecksumAddress(address) { + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isHexString"])(address, 20)) { + logger.throwArgumentError("invalid address", "address", address); + } + address = address.toLowerCase(); + const chars = address.substring(2).split(""); + const expanded = new Uint8Array(40); + for (let i = 0; i < 40; i++) { + expanded[i] = chars[i].charCodeAt(0); + } + const hashed = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__["keccak256"])(expanded)); + for (let i = 0; i < 40; i += 2) { + if ((hashed[i >> 1] >> 4) >= 8) { + chars[i] = chars[i].toUpperCase(); + } + if ((hashed[i >> 1] & 0x0f) >= 8) { + chars[i + 1] = chars[i + 1].toUpperCase(); + } + } + return "0x" + chars.join(""); +} +// Shims for environments that are missing some required constants and functions +const MAX_SAFE_INTEGER = 0x1fffffffffffff; +function log10(x) { + if (Math.log10) { + return Math.log10(x); + } + return Math.log(x) / Math.LN10; +} +// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number +// Create lookup table +const ibanLookup = {}; +for (let i = 0; i < 10; i++) { + ibanLookup[String(i)] = String(i); +} +for (let i = 0; i < 26; i++) { + ibanLookup[String.fromCharCode(65 + i)] = String(10 + i); +} +// How many decimal digits can we process? (for 64-bit float, this is 15) +const safeDigits = Math.floor(log10(MAX_SAFE_INTEGER)); +function ibanChecksum(address) { + address = address.toUpperCase(); + address = address.substring(4) + address.substring(0, 2) + "00"; + let expanded = address.split("").map((c) => { return ibanLookup[c]; }).join(""); + // Javascript can handle integers safely up to 15 (decimal) digits + while (expanded.length >= safeDigits) { + let block = expanded.substring(0, safeDigits); + expanded = parseInt(block, 10) % 97 + expanded.substring(block.length); + } + let checksum = String(98 - (parseInt(expanded, 10) % 97)); + while (checksum.length < 2) { + checksum = "0" + checksum; + } + return checksum; +} +; +function getAddress(address) { + let result = null; + if (typeof (address) !== "string") { + logger.throwArgumentError("invalid address", "address", address); + } + if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) { + // Missing the 0x prefix + if (address.substring(0, 2) !== "0x") { + address = "0x" + address; + } + result = getChecksumAddress(address); + // It is a checksummed address with a bad checksum + if (address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) && result !== address) { + logger.throwArgumentError("bad address checksum", "address", address); + } + // Maybe ICAP? (we only support direct mode) + } + else if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) { + // It is an ICAP address with a bad checksum + if (address.substring(2, 4) !== ibanChecksum(address)) { + logger.throwArgumentError("bad icap checksum", "address", address); + } + result = Object(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["_base36To16"])(address.substring(4)); + while (result.length < 40) { + result = "0" + result; + } + result = getChecksumAddress("0x" + result); + } + else { + logger.throwArgumentError("invalid address", "address", address); + } + return result; +} +function isAddress(address) { + try { + getAddress(address); + return true; + } + catch (error) { } + return false; +} +function getIcapAddress(address) { + let base36 = Object(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["_base16To36"])(getAddress(address).substring(2)).toUpperCase(); + while (base36.length < 30) { + base36 = "0" + base36; + } + return "XE" + ibanChecksum("XE00" + base36) + base36; +} +// http://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed +function getContractAddress(transaction) { + let from = null; + try { + from = getAddress(transaction.from); + } + catch (error) { + logger.throwArgumentError("missing from address", "transaction", transaction); + } + const nonce = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["stripZeros"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(transaction.nonce).toHexString())); + return getAddress(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexDataSlice"])(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__["keccak256"])(Object(_ethersproject_rlp__WEBPACK_IMPORTED_MODULE_3__["encode"])([from, nonce])), 12)); +} +function getCreate2Address(from, salt, initCodeHash) { + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexDataLength"])(salt) !== 32) { + logger.throwArgumentError("salt must be 32 bytes", "salt", salt); + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexDataLength"])(initCodeHash) !== 32) { + logger.throwArgumentError("initCodeHash must be 32 bytes", "initCodeHash", initCodeHash); + } + return getAddress(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexDataSlice"])(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["concat"])(["0xff", getAddress(from), salt, initCodeHash])), 12)); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/base64/lib.esm/base64.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/base64/lib.esm/base64.js ***! + \**************************************************************/ +/*! exports provided: decode, encode */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decode", function() { return decode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encode", function() { return encode; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); + + +function decode(textData) { + textData = atob(textData); + const data = []; + for (let i = 0; i < textData.length; i++) { + data.push(textData.charCodeAt(i)); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(data); +} +function encode(data) { + data = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(data); + let textData = ""; + for (let i = 0; i < data.length; i++) { + textData += String.fromCharCode(data[i]); + } + return btoa(textData); +} +//# sourceMappingURL=base64.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/base64/lib.esm/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/base64/lib.esm/index.js ***! + \*************************************************************/ +/*! exports provided: decode, encode */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _base64__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./base64 */ "./node_modules/@ethersproject/base64/lib.esm/base64.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "decode", function() { return _base64__WEBPACK_IMPORTED_MODULE_0__["decode"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "encode", function() { return _base64__WEBPACK_IMPORTED_MODULE_0__["encode"]; }); + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/basex/lib.esm/index.js": +/*!************************************************************!*\ + !*** ./node_modules/@ethersproject/basex/lib.esm/index.js ***! + \************************************************************/ +/*! exports provided: BaseX, Base32, Base58 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseX", function() { return BaseX; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Base32", function() { return Base32; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Base58", function() { return Base58; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/** + * var basex = require("base-x"); + * + * This implementation is heavily based on base-x. The main reason to + * deviate was to prevent the dependency of Buffer. + * + * Contributors: + * + * base-x encoding + * Forked from https://github.com/cryptocoinjs/bs58 + * Originally written by Mike Hearn for BitcoinJ + * Copyright (c) 2011 Google Inc + * Ported to JavaScript by Stefan Thomas + * Merged Buffer refactorings from base58-native by Stephen Pair + * Copyright (c) 2013 BitPay Inc + * + * The MIT License (MIT) + * + * Copyright base-x contributors (c) 2016 + * + * 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. + * + */ + + +class BaseX { + constructor(alphabet) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "alphabet", alphabet); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "base", alphabet.length); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_alphabetMap", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_leader", alphabet.charAt(0)); + // pre-compute lookup table + for (let i = 0; i < alphabet.length; i++) { + this._alphabetMap[alphabet.charAt(i)] = i; + } + } + encode(value) { + let source = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(value); + if (source.length === 0) { + return ""; + } + let digits = [0]; + for (let i = 0; i < source.length; ++i) { + let carry = source[i]; + for (let j = 0; j < digits.length; ++j) { + carry += digits[j] << 8; + digits[j] = carry % this.base; + carry = (carry / this.base) | 0; + } + while (carry > 0) { + digits.push(carry % this.base); + carry = (carry / this.base) | 0; + } + } + let string = ""; + // deal with leading zeros + for (let k = 0; source[k] === 0 && k < source.length - 1; ++k) { + string += this._leader; + } + // convert digits to a string + for (let q = digits.length - 1; q >= 0; --q) { + string += this.alphabet[digits[q]]; + } + return string; + } + decode(value) { + if (typeof (value) !== "string") { + throw new TypeError("Expected String"); + } + let bytes = []; + if (value.length === 0) { + return new Uint8Array(bytes); + } + bytes.push(0); + for (let i = 0; i < value.length; i++) { + let byte = this._alphabetMap[value[i]]; + if (byte === undefined) { + throw new Error("Non-base" + this.base + " character"); + } + let carry = byte; + for (let j = 0; j < bytes.length; ++j) { + carry += bytes[j] * this.base; + bytes[j] = carry & 0xff; + carry >>= 8; + } + while (carry > 0) { + bytes.push(carry & 0xff); + carry >>= 8; + } + } + // deal with leading zeros + for (let k = 0; value[k] === this._leader && k < value.length - 1; ++k) { + bytes.push(0); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(new Uint8Array(bytes.reverse())); + } +} +const Base32 = new BaseX("abcdefghijklmnopqrstuvwxyz234567"); +const Base58 = new BaseX("123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"); + +//console.log(Base58.decode("Qmd2V777o5XvJbYMeMb8k2nU5f8d3ciUQ5YpYuWhzv8iDj")) +//console.log(Base58.encode(Base58.decode("Qmd2V777o5XvJbYMeMb8k2nU5f8d3ciUQ5YpYuWhzv8iDj"))) +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/bignumber/lib.esm/_version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/bignumber/lib.esm/_version.js ***! + \*******************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "bignumber/5.0.14"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/bignumber/lib.esm/bignumber.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ethersproject/bignumber/lib.esm/bignumber.js ***! + \********************************************************************/ +/*! exports provided: isBigNumberish, BigNumber, _base36To16, _base16To36 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isBigNumberish", function() { return isBigNumberish; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BigNumber", function() { return BigNumber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_base36To16", function() { return _base36To16; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_base16To36", function() { return _base16To36; }); +/* harmony import */ var bn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); +/* harmony import */ var bn_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bn_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/bignumber/lib.esm/_version.js"); + +/** + * BigNumber + * + * A wrapper around the BN.js object. We use the BN.js library + * because it is used by elliptic, so it is required regardless. + * + */ + +var BN = bn_js__WEBPACK_IMPORTED_MODULE_0___default.a.BN; + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"](_version__WEBPACK_IMPORTED_MODULE_3__["version"]); +const _constructorGuard = {}; +const MAX_SAFE = 0x1fffffffffffff; +function isBigNumberish(value) { + return (value != null) && (BigNumber.isBigNumber(value) || + (typeof (value) === "number" && (value % 1) === 0) || + (typeof (value) === "string" && !!value.match(/^-?[0-9]+$/)) || + Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["isHexString"])(value) || + (typeof (value) === "bigint") || + Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["isBytes"])(value)); +} +// Only warn about passing 10 into radix once +let _warnedToStringRadix = false; +class BigNumber { + constructor(constructorGuard, hex) { + logger.checkNew(new.target, BigNumber); + if (constructorGuard !== _constructorGuard) { + logger.throwError("cannot call constructor directly; use BigNumber.from", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new (BigNumber)" + }); + } + this._hex = hex; + this._isBigNumber = true; + Object.freeze(this); + } + fromTwos(value) { + return toBigNumber(toBN(this).fromTwos(value)); + } + toTwos(value) { + return toBigNumber(toBN(this).toTwos(value)); + } + abs() { + if (this._hex[0] === "-") { + return BigNumber.from(this._hex.substring(1)); + } + return this; + } + add(other) { + return toBigNumber(toBN(this).add(toBN(other))); + } + sub(other) { + return toBigNumber(toBN(this).sub(toBN(other))); + } + div(other) { + const o = BigNumber.from(other); + if (o.isZero()) { + throwFault("division by zero", "div"); + } + return toBigNumber(toBN(this).div(toBN(other))); + } + mul(other) { + return toBigNumber(toBN(this).mul(toBN(other))); + } + mod(other) { + const value = toBN(other); + if (value.isNeg()) { + throwFault("cannot modulo negative values", "mod"); + } + return toBigNumber(toBN(this).umod(value)); + } + pow(other) { + const value = toBN(other); + if (value.isNeg()) { + throwFault("cannot raise to negative values", "pow"); + } + return toBigNumber(toBN(this).pow(value)); + } + and(other) { + const value = toBN(other); + if (this.isNegative() || value.isNeg()) { + throwFault("cannot 'and' negative values", "and"); + } + return toBigNumber(toBN(this).and(value)); + } + or(other) { + const value = toBN(other); + if (this.isNegative() || value.isNeg()) { + throwFault("cannot 'or' negative values", "or"); + } + return toBigNumber(toBN(this).or(value)); + } + xor(other) { + const value = toBN(other); + if (this.isNegative() || value.isNeg()) { + throwFault("cannot 'xor' negative values", "xor"); + } + return toBigNumber(toBN(this).xor(value)); + } + mask(value) { + if (this.isNegative() || value < 0) { + throwFault("cannot mask negative values", "mask"); + } + return toBigNumber(toBN(this).maskn(value)); + } + shl(value) { + if (this.isNegative() || value < 0) { + throwFault("cannot shift negative values", "shl"); + } + return toBigNumber(toBN(this).shln(value)); + } + shr(value) { + if (this.isNegative() || value < 0) { + throwFault("cannot shift negative values", "shr"); + } + return toBigNumber(toBN(this).shrn(value)); + } + eq(other) { + return toBN(this).eq(toBN(other)); + } + lt(other) { + return toBN(this).lt(toBN(other)); + } + lte(other) { + return toBN(this).lte(toBN(other)); + } + gt(other) { + return toBN(this).gt(toBN(other)); + } + gte(other) { + return toBN(this).gte(toBN(other)); + } + isNegative() { + return (this._hex[0] === "-"); + } + isZero() { + return toBN(this).isZero(); + } + toNumber() { + try { + return toBN(this).toNumber(); + } + catch (error) { + throwFault("overflow", "toNumber", this.toString()); + } + return null; + } + toString() { + // Lots of people expect this, which we do not support, so check (See: #889) + if (arguments.length > 0) { + if (arguments[0] === 10) { + if (!_warnedToStringRadix) { + _warnedToStringRadix = true; + logger.warn("BigNumber.toString does not accept any parameters; base-10 is assumed"); + } + } + else if (arguments[0] === 16) { + logger.throwError("BigNumber.toString does not accept any parameters; use bigNumber.toHexString()", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.UNEXPECTED_ARGUMENT, {}); + } + else { + logger.throwError("BigNumber.toString does not accept parameters", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.UNEXPECTED_ARGUMENT, {}); + } + } + return toBN(this).toString(10); + } + toHexString() { + return this._hex; + } + toJSON(key) { + return { type: "BigNumber", hex: this.toHexString() }; + } + static from(value) { + if (value instanceof BigNumber) { + return value; + } + if (typeof (value) === "string") { + if (value.match(/^-?0x[0-9a-f]+$/i)) { + return new BigNumber(_constructorGuard, toHex(value)); + } + if (value.match(/^-?[0-9]+$/)) { + return new BigNumber(_constructorGuard, toHex(new BN(value))); + } + return logger.throwArgumentError("invalid BigNumber string", "value", value); + } + if (typeof (value) === "number") { + if (value % 1) { + throwFault("underflow", "BigNumber.from", value); + } + if (value >= MAX_SAFE || value <= -MAX_SAFE) { + throwFault("overflow", "BigNumber.from", value); + } + return BigNumber.from(String(value)); + } + const anyValue = value; + if (typeof (anyValue) === "bigint") { + return BigNumber.from(anyValue.toString()); + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["isBytes"])(anyValue)) { + return BigNumber.from(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(anyValue)); + } + if (anyValue) { + // Hexable interface (takes piority) + if (anyValue.toHexString) { + const hex = anyValue.toHexString(); + if (typeof (hex) === "string") { + return BigNumber.from(hex); + } + } + else { + // For now, handle legacy JSON-ified values (goes away in v6) + let hex = anyValue._hex; + // New-form JSON + if (hex == null && anyValue.type === "BigNumber") { + hex = anyValue.hex; + } + if (typeof (hex) === "string") { + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["isHexString"])(hex) || (hex[0] === "-" && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["isHexString"])(hex.substring(1)))) { + return BigNumber.from(hex); + } + } + } + } + return logger.throwArgumentError("invalid BigNumber value", "value", value); + } + static isBigNumber(value) { + return !!(value && value._isBigNumber); + } +} +// Normalize the hex string +function toHex(value) { + // For BN, call on the hex string + if (typeof (value) !== "string") { + return toHex(value.toString(16)); + } + // If negative, prepend the negative sign to the normalized positive value + if (value[0] === "-") { + // Strip off the negative sign + value = value.substring(1); + // Cannot have mulitple negative signs (e.g. "--0x04") + if (value[0] === "-") { + logger.throwArgumentError("invalid hex", "value", value); + } + // Call toHex on the positive component + value = toHex(value); + // Do not allow "-0x00" + if (value === "0x00") { + return value; + } + // Negate the value + return "-" + value; + } + // Add a "0x" prefix if missing + if (value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + // Normalize zero + if (value === "0x") { + return "0x00"; + } + // Make the string even length + if (value.length % 2) { + value = "0x0" + value.substring(2); + } + // Trim to smallest even-length string + while (value.length > 4 && value.substring(0, 4) === "0x00") { + value = "0x" + value.substring(4); + } + return value; +} +function toBigNumber(value) { + return BigNumber.from(toHex(value)); +} +function toBN(value) { + const hex = BigNumber.from(value).toHexString(); + if (hex[0] === "-") { + return (new BN("-" + hex.substring(3), 16)); + } + return new BN(hex.substring(2), 16); +} +function throwFault(fault, operation, value) { + const params = { fault: fault, operation: operation }; + if (value != null) { + params.value = value; + } + return logger.throwError(fault, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"].errors.NUMERIC_FAULT, params); +} +// value should have no prefix +function _base36To16(value) { + return (new BN(value, 36)).toString(16); +} +// value should have no prefix +function _base16To36(value) { + return (new BN(value, 16)).toString(36); +} +//# sourceMappingURL=bignumber.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/bignumber/lib.esm/fixednumber.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@ethersproject/bignumber/lib.esm/fixednumber.js ***! + \**********************************************************************/ +/*! exports provided: formatFixed, parseFixed, FixedFormat, FixedNumber */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatFixed", function() { return formatFixed; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseFixed", function() { return parseFixed; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FixedFormat", function() { return FixedFormat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FixedNumber", function() { return FixedNumber; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/bignumber/lib.esm/_version.js"); +/* harmony import */ var _bignumber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/bignumber.js"); + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); + +const _constructorGuard = {}; +const Zero = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(0); +const NegativeOne = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(-1); +function throwFault(message, fault, operation, value) { + const params = { fault: fault, operation: operation }; + if (value !== undefined) { + params.value = value; + } + return logger.throwError(message, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.NUMERIC_FAULT, params); +} +// Constant to pull zeros from for multipliers +let zeros = "0"; +while (zeros.length < 256) { + zeros += zeros; +} +// Returns a string "1" followed by decimal "0"s +function getMultiplier(decimals) { + if (typeof (decimals) !== "number") { + try { + decimals = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(decimals).toNumber(); + } + catch (e) { } + } + if (typeof (decimals) === "number" && decimals >= 0 && decimals <= 256 && !(decimals % 1)) { + return ("1" + zeros.substring(0, decimals)); + } + return logger.throwArgumentError("invalid decimal size", "decimals", decimals); +} +function formatFixed(value, decimals) { + if (decimals == null) { + decimals = 0; + } + const multiplier = getMultiplier(decimals); + // Make sure wei is a big number (convert as necessary) + value = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(value); + const negative = value.lt(Zero); + if (negative) { + value = value.mul(NegativeOne); + } + let fraction = value.mod(multiplier).toString(); + while (fraction.length < multiplier.length - 1) { + fraction = "0" + fraction; + } + // Strip training 0 + fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1]; + const whole = value.div(multiplier).toString(); + value = whole + "." + fraction; + if (negative) { + value = "-" + value; + } + return value; +} +function parseFixed(value, decimals) { + if (decimals == null) { + decimals = 0; + } + const multiplier = getMultiplier(decimals); + if (typeof (value) !== "string" || !value.match(/^-?[0-9.,]+$/)) { + logger.throwArgumentError("invalid decimal value", "value", value); + } + if (multiplier.length - 1 === 0) { + return _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(value); + } + // Is it negative? + const negative = (value.substring(0, 1) === "-"); + if (negative) { + value = value.substring(1); + } + if (value === ".") { + logger.throwArgumentError("missing value", "value", value); + } + // Split it into a whole and fractional part + const comps = value.split("."); + if (comps.length > 2) { + logger.throwArgumentError("too many decimal points", "value", value); + } + let whole = comps[0], fraction = comps[1]; + if (!whole) { + whole = "0"; + } + if (!fraction) { + fraction = "0"; + } + // Prevent underflow + if (fraction.length > multiplier.length - 1) { + throwFault("fractional component exceeds decimals", "underflow", "parseFixed"); + } + // Fully pad the string with zeros to get to wei + while (fraction.length < multiplier.length - 1) { + fraction += "0"; + } + const wholeValue = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(whole); + const fractionValue = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(fraction); + let wei = (wholeValue.mul(multiplier)).add(fractionValue); + if (negative) { + wei = wei.mul(NegativeOne); + } + return wei; +} +class FixedFormat { + constructor(constructorGuard, signed, width, decimals) { + if (constructorGuard !== _constructorGuard) { + logger.throwError("cannot use FixedFormat constructor; use FixedFormat.from", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new FixedFormat" + }); + } + this.signed = signed; + this.width = width; + this.decimals = decimals; + this.name = (signed ? "" : "u") + "fixed" + String(width) + "x" + String(decimals); + this._multiplier = getMultiplier(decimals); + Object.freeze(this); + } + static from(value) { + if (value instanceof FixedFormat) { + return value; + } + let signed = true; + let width = 128; + let decimals = 18; + if (typeof (value) === "string") { + if (value === "fixed") { + // defaults... + } + else if (value === "ufixed") { + signed = false; + } + else if (value != null) { + const match = value.match(/^(u?)fixed([0-9]+)x([0-9]+)$/); + if (!match) { + logger.throwArgumentError("invalid fixed format", "format", value); + } + signed = (match[1] !== "u"); + width = parseInt(match[2]); + decimals = parseInt(match[3]); + } + } + else if (value) { + const check = (key, type, defaultValue) => { + if (value[key] == null) { + return defaultValue; + } + if (typeof (value[key]) !== type) { + logger.throwArgumentError("invalid fixed format (" + key + " not " + type + ")", "format." + key, value[key]); + } + return value[key]; + }; + signed = check("signed", "boolean", signed); + width = check("width", "number", width); + decimals = check("decimals", "number", decimals); + } + if (width % 8) { + logger.throwArgumentError("invalid fixed format width (not byte aligned)", "format.width", width); + } + if (decimals > 80) { + logger.throwArgumentError("invalid fixed format (decimals too large)", "format.decimals", decimals); + } + return new FixedFormat(_constructorGuard, signed, width, decimals); + } +} +class FixedNumber { + constructor(constructorGuard, hex, value, format) { + logger.checkNew(new.target, FixedNumber); + if (constructorGuard !== _constructorGuard) { + logger.throwError("cannot use FixedNumber constructor; use FixedNumber.from", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new FixedFormat" + }); + } + this.format = format; + this._hex = hex; + this._value = value; + this._isFixedNumber = true; + Object.freeze(this); + } + _checkFormat(other) { + if (this.format.name !== other.format.name) { + logger.throwArgumentError("incompatible format; use fixedNumber.toFormat", "other", other); + } + } + addUnsafe(other) { + this._checkFormat(other); + const a = parseFixed(this._value, this.format.decimals); + const b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.add(b), this.format.decimals, this.format); + } + subUnsafe(other) { + this._checkFormat(other); + const a = parseFixed(this._value, this.format.decimals); + const b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.sub(b), this.format.decimals, this.format); + } + mulUnsafe(other) { + this._checkFormat(other); + const a = parseFixed(this._value, this.format.decimals); + const b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.mul(b).div(this.format._multiplier), this.format.decimals, this.format); + } + divUnsafe(other) { + this._checkFormat(other); + const a = parseFixed(this._value, this.format.decimals); + const b = parseFixed(other._value, other.format.decimals); + return FixedNumber.fromValue(a.mul(this.format._multiplier).div(b), this.format.decimals, this.format); + } + floor() { + let comps = this.toString().split("."); + let result = FixedNumber.from(comps[0], this.format); + const hasFraction = !comps[1].match(/^(0*)$/); + if (this.isNegative() && hasFraction) { + result = result.subUnsafe(ONE); + } + return result; + } + ceiling() { + let comps = this.toString().split("."); + let result = FixedNumber.from(comps[0], this.format); + const hasFraction = !comps[1].match(/^(0*)$/); + if (!this.isNegative() && hasFraction) { + result = result.addUnsafe(ONE); + } + return result; + } + // @TODO: Support other rounding algorithms + round(decimals) { + if (decimals == null) { + decimals = 0; + } + // If we are already in range, we're done + let comps = this.toString().split("."); + if (decimals < 0 || decimals > 80 || (decimals % 1)) { + logger.throwArgumentError("invalid decimal count", "decimals", decimals); + } + if (comps[1].length <= decimals) { + return this; + } + const factor = FixedNumber.from("1" + zeros.substring(0, decimals)); + return this.mulUnsafe(factor).addUnsafe(BUMP).floor().divUnsafe(factor); + } + isZero() { + return (this._value === "0.0"); + } + isNegative() { + return (this._value[0] === "-"); + } + toString() { return this._value; } + toHexString(width) { + if (width == null) { + return this._hex; + } + if (width % 8) { + logger.throwArgumentError("invalid byte width", "width", width); + } + const hex = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(this._hex).fromTwos(this.format.width).toTwos(width).toHexString(); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexZeroPad"])(hex, width / 8); + } + toUnsafeFloat() { return parseFloat(this.toString()); } + toFormat(format) { + return FixedNumber.fromString(this._value, format); + } + static fromValue(value, decimals, format) { + // If decimals looks more like a format, and there is no format, shift the parameters + if (format == null && decimals != null && !Object(_bignumber__WEBPACK_IMPORTED_MODULE_3__["isBigNumberish"])(decimals)) { + format = decimals; + decimals = null; + } + if (decimals == null) { + decimals = 0; + } + if (format == null) { + format = "fixed"; + } + return FixedNumber.fromString(formatFixed(value, decimals), FixedFormat.from(format)); + } + static fromString(value, format) { + if (format == null) { + format = "fixed"; + } + const fixedFormat = FixedFormat.from(format); + const numeric = parseFixed(value, fixedFormat.decimals); + if (!fixedFormat.signed && numeric.lt(Zero)) { + throwFault("unsigned value cannot be negative", "overflow", "value", value); + } + let hex = null; + if (fixedFormat.signed) { + hex = numeric.toTwos(fixedFormat.width).toHexString(); + } + else { + hex = numeric.toHexString(); + hex = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexZeroPad"])(hex, fixedFormat.width / 8); + } + const decimal = formatFixed(numeric, fixedFormat.decimals); + return new FixedNumber(_constructorGuard, hex, decimal, fixedFormat); + } + static fromBytes(value, format) { + if (format == null) { + format = "fixed"; + } + const fixedFormat = FixedFormat.from(format); + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(value).length > fixedFormat.width / 8) { + throw new Error("overflow"); + } + let numeric = _bignumber__WEBPACK_IMPORTED_MODULE_3__["BigNumber"].from(value); + if (fixedFormat.signed) { + numeric = numeric.fromTwos(fixedFormat.width); + } + const hex = numeric.toTwos((fixedFormat.signed ? 0 : 1) + fixedFormat.width).toHexString(); + const decimal = formatFixed(numeric, fixedFormat.decimals); + return new FixedNumber(_constructorGuard, hex, decimal, fixedFormat); + } + static from(value, format) { + if (typeof (value) === "string") { + return FixedNumber.fromString(value, format); + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isBytes"])(value)) { + return FixedNumber.fromBytes(value, format); + } + try { + return FixedNumber.fromValue(value, 0, format); + } + catch (error) { + // Allow NUMERIC_FAULT to bubble up + if (error.code !== _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.INVALID_ARGUMENT) { + throw error; + } + } + return logger.throwArgumentError("invalid FixedNumber value", "value", value); + } + static isFixedNumber(value) { + return !!(value && value._isFixedNumber); + } +} +const ONE = FixedNumber.from(1); +const BUMP = FixedNumber.from("0.5"); +//# sourceMappingURL=fixednumber.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/bignumber/lib.esm/index.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/bignumber/lib.esm/index.js ***! + \****************************************************************/ +/*! exports provided: BigNumber, formatFixed, FixedFormat, FixedNumber, parseFixed, _base16To36, _base36To16 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/bignumber.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BigNumber", function() { return _bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"]; }); + +/* harmony import */ var _fixednumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fixednumber */ "./node_modules/@ethersproject/bignumber/lib.esm/fixednumber.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatFixed", function() { return _fixednumber__WEBPACK_IMPORTED_MODULE_1__["formatFixed"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FixedFormat", function() { return _fixednumber__WEBPACK_IMPORTED_MODULE_1__["FixedFormat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FixedNumber", function() { return _fixednumber__WEBPACK_IMPORTED_MODULE_1__["FixedNumber"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseFixed", function() { return _fixednumber__WEBPACK_IMPORTED_MODULE_1__["parseFixed"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_base16To36", function() { return _bignumber__WEBPACK_IMPORTED_MODULE_0__["_base16To36"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_base36To16", function() { return _bignumber__WEBPACK_IMPORTED_MODULE_0__["_base36To16"]; }); + + + +// Internal methods used by address + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/bytes/lib.esm/_version.js": +/*!***************************************************************!*\ + !*** ./node_modules/@ethersproject/bytes/lib.esm/_version.js ***! + \***************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "bytes/5.0.10"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/bytes/lib.esm/index.js": +/*!************************************************************!*\ + !*** ./node_modules/@ethersproject/bytes/lib.esm/index.js ***! + \************************************************************/ +/*! exports provided: isBytesLike, isBytes, arrayify, concat, stripZeros, zeroPad, isHexString, hexlify, hexDataLength, hexDataSlice, hexConcat, hexValue, hexStripZeros, hexZeroPad, splitSignature, joinSignature */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isBytesLike", function() { return isBytesLike; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isBytes", function() { return isBytes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arrayify", function() { return arrayify; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stripZeros", function() { return stripZeros; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zeroPad", function() { return zeroPad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHexString", function() { return isHexString; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexlify", function() { return hexlify; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexDataLength", function() { return hexDataLength; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexDataSlice", function() { return hexDataSlice; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexConcat", function() { return hexConcat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexValue", function() { return hexValue; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexStripZeros", function() { return hexStripZeros; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hexZeroPad", function() { return hexZeroPad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitSignature", function() { return splitSignature; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "joinSignature", function() { return joinSignature; }); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/bytes/lib.esm/_version.js"); + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"](_version__WEBPACK_IMPORTED_MODULE_1__["version"]); +/////////////////////////////// +function isHexable(value) { + return !!(value.toHexString); +} +function addSlice(array) { + if (array.slice) { + return array; + } + array.slice = function () { + const args = Array.prototype.slice.call(arguments); + return addSlice(new Uint8Array(Array.prototype.slice.apply(array, args))); + }; + return array; +} +function isBytesLike(value) { + return ((isHexString(value) && !(value.length % 2)) || isBytes(value)); +} +function isBytes(value) { + if (value == null) { + return false; + } + if (value.constructor === Uint8Array) { + return true; + } + if (typeof (value) === "string") { + return false; + } + if (value.length == null) { + return false; + } + for (let i = 0; i < value.length; i++) { + const v = value[i]; + if (typeof (v) !== "number" || v < 0 || v >= 256 || (v % 1)) { + return false; + } + } + return true; +} +function arrayify(value, options) { + if (!options) { + options = {}; + } + if (typeof (value) === "number") { + logger.checkSafeUint53(value, "invalid arrayify value"); + const result = []; + while (value) { + result.unshift(value & 0xff); + value = parseInt(String(value / 256)); + } + if (result.length === 0) { + result.push(0); + } + return addSlice(new Uint8Array(result)); + } + if (options.allowMissingPrefix && typeof (value) === "string" && value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + if (isHexable(value)) { + value = value.toHexString(); + } + if (isHexString(value)) { + let hex = value.substring(2); + if (hex.length % 2) { + if (options.hexPad === "left") { + hex = "0x0" + hex.substring(2); + } + else if (options.hexPad === "right") { + hex += "0"; + } + else { + logger.throwArgumentError("hex data is odd-length", "value", value); + } + } + const result = []; + for (let i = 0; i < hex.length; i += 2) { + result.push(parseInt(hex.substring(i, i + 2), 16)); + } + return addSlice(new Uint8Array(result)); + } + if (isBytes(value)) { + return addSlice(new Uint8Array(value)); + } + return logger.throwArgumentError("invalid arrayify value", "value", value); +} +function concat(items) { + const objects = items.map(item => arrayify(item)); + const length = objects.reduce((accum, item) => (accum + item.length), 0); + const result = new Uint8Array(length); + objects.reduce((offset, object) => { + result.set(object, offset); + return offset + object.length; + }, 0); + return addSlice(result); +} +function stripZeros(value) { + let result = arrayify(value); + if (result.length === 0) { + return result; + } + // Find the first non-zero entry + let start = 0; + while (start < result.length && result[start] === 0) { + start++; + } + // If we started with zeros, strip them + if (start) { + result = result.slice(start); + } + return result; +} +function zeroPad(value, length) { + value = arrayify(value); + if (value.length > length) { + logger.throwArgumentError("value out of range", "value", arguments[0]); + } + const result = new Uint8Array(length); + result.set(value, length - value.length); + return addSlice(result); +} +function isHexString(value, length) { + if (typeof (value) !== "string" || !value.match(/^0x[0-9A-Fa-f]*$/)) { + return false; + } + if (length && value.length !== 2 + 2 * length) { + return false; + } + return true; +} +const HexCharacters = "0123456789abcdef"; +function hexlify(value, options) { + if (!options) { + options = {}; + } + if (typeof (value) === "number") { + logger.checkSafeUint53(value, "invalid hexlify value"); + let hex = ""; + while (value) { + hex = HexCharacters[value & 0x0f] + hex; + value = Math.floor(value / 16); + } + if (hex.length) { + if (hex.length % 2) { + hex = "0" + hex; + } + return "0x" + hex; + } + return "0x00"; + } + if (options.allowMissingPrefix && typeof (value) === "string" && value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + if (isHexable(value)) { + return value.toHexString(); + } + if (isHexString(value)) { + if (value.length % 2) { + if (options.hexPad === "left") { + value = "0x0" + value.substring(2); + } + else if (options.hexPad === "right") { + value += "0"; + } + else { + logger.throwArgumentError("hex data is odd-length", "value", value); + } + } + return value.toLowerCase(); + } + if (isBytes(value)) { + let result = "0x"; + for (let i = 0; i < value.length; i++) { + let v = value[i]; + result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f]; + } + return result; + } + return logger.throwArgumentError("invalid hexlify value", "value", value); +} +/* +function unoddify(value: BytesLike | Hexable | number): BytesLike | Hexable | number { + if (typeof(value) === "string" && value.length % 2 && value.substring(0, 2) === "0x") { + return "0x0" + value.substring(2); + } + return value; +} +*/ +function hexDataLength(data) { + if (typeof (data) !== "string") { + data = hexlify(data); + } + else if (!isHexString(data) || (data.length % 2)) { + return null; + } + return (data.length - 2) / 2; +} +function hexDataSlice(data, offset, endOffset) { + if (typeof (data) !== "string") { + data = hexlify(data); + } + else if (!isHexString(data) || (data.length % 2)) { + logger.throwArgumentError("invalid hexData", "value", data); + } + offset = 2 + 2 * offset; + if (endOffset != null) { + return "0x" + data.substring(offset, 2 + 2 * endOffset); + } + return "0x" + data.substring(offset); +} +function hexConcat(items) { + let result = "0x"; + items.forEach((item) => { + result += hexlify(item).substring(2); + }); + return result; +} +function hexValue(value) { + const trimmed = hexStripZeros(hexlify(value, { hexPad: "left" })); + if (trimmed === "0x") { + return "0x0"; + } + return trimmed; +} +function hexStripZeros(value) { + if (typeof (value) !== "string") { + value = hexlify(value); + } + if (!isHexString(value)) { + logger.throwArgumentError("invalid hex string", "value", value); + } + value = value.substring(2); + let offset = 0; + while (offset < value.length && value[offset] === "0") { + offset++; + } + return "0x" + value.substring(offset); +} +function hexZeroPad(value, length) { + if (typeof (value) !== "string") { + value = hexlify(value); + } + else if (!isHexString(value)) { + logger.throwArgumentError("invalid hex string", "value", value); + } + if (value.length > 2 * length + 2) { + logger.throwArgumentError("value out of range", "value", arguments[1]); + } + while (value.length < 2 * length + 2) { + value = "0x0" + value.substring(2); + } + return value; +} +function splitSignature(signature) { + const result = { + r: "0x", + s: "0x", + _vs: "0x", + recoveryParam: 0, + v: 0 + }; + if (isBytesLike(signature)) { + const bytes = arrayify(signature); + if (bytes.length !== 65) { + logger.throwArgumentError("invalid signature string; must be 65 bytes", "signature", signature); + } + // Get the r, s and v + result.r = hexlify(bytes.slice(0, 32)); + result.s = hexlify(bytes.slice(32, 64)); + result.v = bytes[64]; + // Allow a recid to be used as the v + if (result.v < 27) { + if (result.v === 0 || result.v === 1) { + result.v += 27; + } + else { + logger.throwArgumentError("signature invalid v byte", "signature", signature); + } + } + // Compute recoveryParam from v + result.recoveryParam = 1 - (result.v % 2); + // Compute _vs from recoveryParam and s + if (result.recoveryParam) { + bytes[32] |= 0x80; + } + result._vs = hexlify(bytes.slice(32, 64)); + } + else { + result.r = signature.r; + result.s = signature.s; + result.v = signature.v; + result.recoveryParam = signature.recoveryParam; + result._vs = signature._vs; + // If the _vs is available, use it to populate missing s, v and recoveryParam + // and verify non-missing s, v and recoveryParam + if (result._vs != null) { + const vs = zeroPad(arrayify(result._vs), 32); + result._vs = hexlify(vs); + // Set or check the recid + const recoveryParam = ((vs[0] >= 128) ? 1 : 0); + if (result.recoveryParam == null) { + result.recoveryParam = recoveryParam; + } + else if (result.recoveryParam !== recoveryParam) { + logger.throwArgumentError("signature recoveryParam mismatch _vs", "signature", signature); + } + // Set or check the s + vs[0] &= 0x7f; + const s = hexlify(vs); + if (result.s == null) { + result.s = s; + } + else if (result.s !== s) { + logger.throwArgumentError("signature v mismatch _vs", "signature", signature); + } + } + // Use recid and v to populate each other + if (result.recoveryParam == null) { + if (result.v == null) { + logger.throwArgumentError("signature missing v and recoveryParam", "signature", signature); + } + else { + result.recoveryParam = 1 - (result.v % 2); + } + } + else { + if (result.v == null) { + result.v = 27 + result.recoveryParam; + } + else if (result.recoveryParam !== (1 - (result.v % 2))) { + logger.throwArgumentError("signature recoveryParam mismatch v", "signature", signature); + } + } + if (result.r == null || !isHexString(result.r)) { + logger.throwArgumentError("signature missing or invalid r", "signature", signature); + } + else { + result.r = hexZeroPad(result.r, 32); + } + if (result.s == null || !isHexString(result.s)) { + logger.throwArgumentError("signature missing or invalid s", "signature", signature); + } + else { + result.s = hexZeroPad(result.s, 32); + } + const vs = arrayify(result.s); + if (vs[0] >= 128) { + logger.throwArgumentError("signature s out of range", "signature", signature); + } + if (result.recoveryParam) { + vs[0] |= 0x80; + } + const _vs = hexlify(vs); + if (result._vs) { + if (!isHexString(result._vs)) { + logger.throwArgumentError("signature invalid _vs", "signature", signature); + } + result._vs = hexZeroPad(result._vs, 32); + } + // Set or check the _vs + if (result._vs == null) { + result._vs = _vs; + } + else if (result._vs !== _vs) { + logger.throwArgumentError("signature _vs mismatch v and s", "signature", signature); + } + } + return result; +} +function joinSignature(signature) { + signature = splitSignature(signature); + return hexlify(concat([ + signature.r, + signature.s, + (signature.recoveryParam ? "0x1c" : "0x1b") + ])); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/constants/lib.esm/addresses.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ethersproject/constants/lib.esm/addresses.js ***! + \********************************************************************/ +/*! exports provided: AddressZero */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AddressZero", function() { return AddressZero; }); +const AddressZero = "0x0000000000000000000000000000000000000000"; +//# sourceMappingURL=addresses.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/constants/lib.esm/bignumbers.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ethersproject/constants/lib.esm/bignumbers.js ***! + \*********************************************************************/ +/*! exports provided: NegativeOne, Zero, One, Two, WeiPerEther, MaxUint256 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NegativeOne", function() { return NegativeOne; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Zero", function() { return Zero; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "One", function() { return One; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Two", function() { return Two; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WeiPerEther", function() { return WeiPerEther; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MaxUint256", function() { return MaxUint256; }); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); + +const NegativeOne = ( /*#__PURE__*/_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(-1)); +const Zero = ( /*#__PURE__*/_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(0)); +const One = ( /*#__PURE__*/_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(1)); +const Two = ( /*#__PURE__*/_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(2)); +const WeiPerEther = ( /*#__PURE__*/_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from("1000000000000000000")); +const MaxUint256 = ( /*#__PURE__*/_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); + +//# sourceMappingURL=bignumbers.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/constants/lib.esm/hashes.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/constants/lib.esm/hashes.js ***! + \*****************************************************************/ +/*! exports provided: HashZero */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HashZero", function() { return HashZero; }); +const HashZero = "0x0000000000000000000000000000000000000000000000000000000000000000"; +//# sourceMappingURL=hashes.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/constants/lib.esm/index.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/constants/lib.esm/index.js ***! + \****************************************************************/ +/*! exports provided: AddressZero, NegativeOne, Zero, One, Two, WeiPerEther, MaxUint256, HashZero, EtherSymbol */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _addresses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./addresses */ "./node_modules/@ethersproject/constants/lib.esm/addresses.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AddressZero", function() { return _addresses__WEBPACK_IMPORTED_MODULE_0__["AddressZero"]; }); + +/* harmony import */ var _bignumbers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bignumbers */ "./node_modules/@ethersproject/constants/lib.esm/bignumbers.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NegativeOne", function() { return _bignumbers__WEBPACK_IMPORTED_MODULE_1__["NegativeOne"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Zero", function() { return _bignumbers__WEBPACK_IMPORTED_MODULE_1__["Zero"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "One", function() { return _bignumbers__WEBPACK_IMPORTED_MODULE_1__["One"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Two", function() { return _bignumbers__WEBPACK_IMPORTED_MODULE_1__["Two"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WeiPerEther", function() { return _bignumbers__WEBPACK_IMPORTED_MODULE_1__["WeiPerEther"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MaxUint256", function() { return _bignumbers__WEBPACK_IMPORTED_MODULE_1__["MaxUint256"]; }); + +/* harmony import */ var _hashes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hashes */ "./node_modules/@ethersproject/constants/lib.esm/hashes.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HashZero", function() { return _hashes__WEBPACK_IMPORTED_MODULE_2__["HashZero"]; }); + +/* harmony import */ var _strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./strings */ "./node_modules/@ethersproject/constants/lib.esm/strings.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EtherSymbol", function() { return _strings__WEBPACK_IMPORTED_MODULE_3__["EtherSymbol"]; }); + + + + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/constants/lib.esm/strings.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/constants/lib.esm/strings.js ***! + \******************************************************************/ +/*! exports provided: EtherSymbol */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EtherSymbol", function() { return EtherSymbol; }); +// NFKC (composed) // (decomposed) +const EtherSymbol = "\u039e"; // "\uD835\uDF63"; +//# sourceMappingURL=strings.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/contracts/lib.esm/_version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/contracts/lib.esm/_version.js ***! + \*******************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "contracts/5.0.11"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/contracts/lib.esm/index.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/contracts/lib.esm/index.js ***! + \****************************************************************/ +/*! exports provided: Contract, ContractFactory */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Contract", function() { return Contract; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ContractFactory", function() { return ContractFactory; }); +/* harmony import */ var _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/abi */ "./node_modules/@ethersproject/abi/lib.esm/index.js"); +/* harmony import */ var _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/abstract-provider */ "./node_modules/@ethersproject/abstract-provider/lib.esm/index.js"); +/* harmony import */ var _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/abstract-signer */ "./node_modules/@ethersproject/abstract-signer/lib.esm/index.js"); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/contracts/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + +// @TOOD remove dependences transactions + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"](_version__WEBPACK_IMPORTED_MODULE_8__["version"]); +; +; +/////////////////////////////// +const allowedTransactionKeys = { + chainId: true, data: true, from: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true +}; +function resolveName(resolver, nameOrPromise) { + return __awaiter(this, void 0, void 0, function* () { + const name = yield nameOrPromise; + // If it is already an address, just use it (after adding checksum) + try { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_3__["getAddress"])(name); + } + catch (error) { } + if (!resolver) { + logger.throwError("a provider or signer is needed to resolve ENS names", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "resolveName" + }); + } + const address = yield resolver.resolveName(name); + if (address == null) { + logger.throwArgumentError("resolver or addr is not configured for ENS name", "name", name); + } + return address; + }); +} +// Recursively replaces ENS names with promises to resolve the name and resolves all properties +function resolveAddresses(resolver, value, paramType) { + return __awaiter(this, void 0, void 0, function* () { + if (Array.isArray(paramType)) { + return yield Promise.all(paramType.map((paramType, index) => { + return resolveAddresses(resolver, ((Array.isArray(value)) ? value[index] : value[paramType.name]), paramType); + })); + } + if (paramType.type === "address") { + return yield resolveName(resolver, value); + } + if (paramType.type === "tuple") { + return yield resolveAddresses(resolver, value, paramType.components); + } + if (paramType.baseType === "array") { + if (!Array.isArray(value)) { + return Promise.reject(new Error("invalid value for array")); + } + return yield Promise.all(value.map((v) => resolveAddresses(resolver, v, paramType.arrayChildren))); + } + return value; + }); +} +function populateTransaction(contract, fragment, args) { + return __awaiter(this, void 0, void 0, function* () { + // If an extra argument is given, it is overrides + let overrides = {}; + if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { + overrides = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["shallowCopy"])(args.pop()); + } + // Make sure the parameter count matches + logger.checkArgumentCount(args.length, fragment.inputs.length, "passed to contract"); + // Populate "from" override (allow promises) + if (contract.signer) { + if (overrides.from) { + // Contracts with a Signer are from the Signer's frame-of-reference; + // but we allow overriding "from" if it matches the signer + overrides.from = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["resolveProperties"])({ + override: resolveName(contract.signer, overrides.from), + signer: contract.signer.getAddress() + }).then((check) => __awaiter(this, void 0, void 0, function* () { + if (Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_3__["getAddress"])(check.signer) !== check.override) { + logger.throwError("Contract with a Signer cannot override from", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "overrides.from" + }); + } + return check.override; + })); + } + else { + overrides.from = contract.signer.getAddress(); + } + } + else if (overrides.from) { + overrides.from = resolveName(contract.provider, overrides.from); + //} else { + // Contracts without a signer can override "from", and if + // unspecified the zero address is used + //overrides.from = AddressZero; + } + // Wait for all dependencies to be resolved (prefer the signer over the provider) + const resolved = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["resolveProperties"])({ + args: resolveAddresses(contract.signer || contract.provider, args, fragment.inputs), + address: contract.resolvedAddress, + overrides: (Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["resolveProperties"])(overrides) || {}) + }); + // The ABI coded transaction + const data = contract.interface.encodeFunctionData(fragment, resolved.args); + const tx = { + data: data, + to: resolved.address + }; + // Resolved Overrides + const ro = resolved.overrides; + // Populate simple overrides + if (ro.nonce != null) { + tx.nonce = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_4__["BigNumber"].from(ro.nonce).toNumber(); + } + if (ro.gasLimit != null) { + tx.gasLimit = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_4__["BigNumber"].from(ro.gasLimit); + } + if (ro.gasPrice != null) { + tx.gasPrice = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_4__["BigNumber"].from(ro.gasPrice); + } + if (ro.from != null) { + tx.from = ro.from; + } + // If there was no "gasLimit" override, but the ABI specifies a default, use it + if (tx.gasLimit == null && fragment.gas != null) { + // Conmpute the intrinisic gas cost for this transaction + // @TODO: This is based on the yellow paper as of Petersburg; this is something + // we may wish to parameterize in v6 as part of the Network object. Since this + // is always a non-nil to address, we can ignore G_create, but may wish to add + // similar logic to the ContractFactory. + let intrinsic = 21000; + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["arrayify"])(data); + for (let i = 0; i < bytes.length; i++) { + intrinsic += 4; + if (bytes[i]) { + intrinsic += 64; + } + } + tx.gasLimit = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_4__["BigNumber"].from(fragment.gas).add(intrinsic); + } + // Populate "value" override + if (ro.value) { + const roValue = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_4__["BigNumber"].from(ro.value); + if (!roValue.isZero() && !fragment.payable) { + logger.throwError("non-payable method cannot override value", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "overrides.value", + value: overrides.value + }); + } + tx.value = roValue; + } + // Remvoe the overrides + delete overrides.nonce; + delete overrides.gasLimit; + delete overrides.gasPrice; + delete overrides.from; + delete overrides.value; + // Make sure there are no stray overrides, which may indicate a + // typo or using an unsupported key. + const leftovers = Object.keys(overrides).filter((key) => (overrides[key] != null)); + if (leftovers.length) { + logger.throwError(`cannot override ${leftovers.map((l) => JSON.stringify(l)).join(",")}`, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "overrides", + overrides: leftovers + }); + } + return tx; + }); +} +function buildPopulate(contract, fragment) { + return function (...args) { + return populateTransaction(contract, fragment, args); + }; +} +function buildEstimate(contract, fragment) { + const signerOrProvider = (contract.signer || contract.provider); + return function (...args) { + return __awaiter(this, void 0, void 0, function* () { + if (!signerOrProvider) { + logger.throwError("estimate require a provider or signer", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "estimateGas" + }); + } + const tx = yield populateTransaction(contract, fragment, args); + return yield signerOrProvider.estimateGas(tx); + }); + }; +} +function buildCall(contract, fragment, collapseSimple) { + const signerOrProvider = (contract.signer || contract.provider); + return function (...args) { + return __awaiter(this, void 0, void 0, function* () { + // Extract the "blockTag" override if present + let blockTag = undefined; + if (args.length === fragment.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { + const overrides = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["shallowCopy"])(args.pop()); + if (overrides.blockTag != null) { + blockTag = yield overrides.blockTag; + } + delete overrides.blockTag; + args.push(overrides); + } + // If the contract was just deployed, wait until it is mined + if (contract.deployTransaction != null) { + yield contract._deployed(blockTag); + } + // Call a node and get the result + const tx = yield populateTransaction(contract, fragment, args); + const result = yield signerOrProvider.call(tx, blockTag); + try { + let value = contract.interface.decodeFunctionResult(fragment, result); + if (collapseSimple && fragment.outputs.length === 1) { + value = value[0]; + } + return value; + } + catch (error) { + if (error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.CALL_EXCEPTION) { + error.address = contract.address; + error.args = args; + error.transaction = tx; + } + throw error; + } + }); + }; +} +function buildSend(contract, fragment) { + return function (...args) { + return __awaiter(this, void 0, void 0, function* () { + if (!contract.signer) { + logger.throwError("sending a transaction requires a signer", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "sendTransaction" + }); + } + // If the contract was just deployed, wait until it is minded + if (contract.deployTransaction != null) { + yield contract._deployed(); + } + const txRequest = yield populateTransaction(contract, fragment, args); + const tx = yield contract.signer.sendTransaction(txRequest); + // Tweak the tw.wait so the receipt has extra properties + const wait = tx.wait.bind(tx); + tx.wait = (confirmations) => { + return wait(confirmations).then((receipt) => { + receipt.events = receipt.logs.map((log) => { + let event = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["deepCopy"])(log); + let parsed = null; + try { + parsed = contract.interface.parseLog(log); + } + catch (e) { } + // Successfully parsed the event log; include it + if (parsed) { + event.args = parsed.args; + event.decode = (data, topics) => { + return contract.interface.decodeEventLog(parsed.eventFragment, data, topics); + }; + event.event = parsed.name; + event.eventSignature = parsed.signature; + } + // Useful operations + event.removeListener = () => { return contract.provider; }; + event.getBlock = () => { + return contract.provider.getBlock(receipt.blockHash); + }; + event.getTransaction = () => { + return contract.provider.getTransaction(receipt.transactionHash); + }; + event.getTransactionReceipt = () => { + return Promise.resolve(receipt); + }; + return event; + }); + return receipt; + }); + }; + return tx; + }); + }; +} +function buildDefault(contract, fragment, collapseSimple) { + if (fragment.constant) { + return buildCall(contract, fragment, collapseSimple); + } + return buildSend(contract, fragment); +} +function getEventTag(filter) { + if (filter.address && (filter.topics == null || filter.topics.length === 0)) { + return "*"; + } + return (filter.address || "*") + "@" + (filter.topics ? filter.topics.map((topic) => { + if (Array.isArray(topic)) { + return topic.join("|"); + } + return topic; + }).join(":") : ""); +} +class RunningEvent { + constructor(tag, filter) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "tag", tag); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "filter", filter); + this._listeners = []; + } + addListener(listener, once) { + this._listeners.push({ listener: listener, once: once }); + } + removeListener(listener) { + let done = false; + this._listeners = this._listeners.filter((item) => { + if (done || item.listener !== listener) { + return true; + } + done = true; + return false; + }); + } + removeAllListeners() { + this._listeners = []; + } + listeners() { + return this._listeners.map((i) => i.listener); + } + listenerCount() { + return this._listeners.length; + } + run(args) { + const listenerCount = this.listenerCount(); + this._listeners = this._listeners.filter((item) => { + const argsCopy = args.slice(); + // Call the callback in the next event loop + setTimeout(() => { + item.listener.apply(this, argsCopy); + }, 0); + // Reschedule it if it not "once" + return !(item.once); + }); + return listenerCount; + } + prepareEvent(event) { + } + // Returns the array that will be applied to an emit + getEmit(event) { + return [event]; + } +} +class ErrorRunningEvent extends RunningEvent { + constructor() { + super("error", null); + } +} +// @TODO Fragment should inherit Wildcard? and just override getEmit? +// or have a common abstract super class, with enough constructor +// options to configure both. +// A Fragment Event will populate all the properties that Wildcard +// will, and additioanlly dereference the arguments when emitting +class FragmentRunningEvent extends RunningEvent { + constructor(address, contractInterface, fragment, topics) { + const filter = { + address: address + }; + let topic = contractInterface.getEventTopic(fragment); + if (topics) { + if (topic !== topics[0]) { + logger.throwArgumentError("topic mismatch", "topics", topics); + } + filter.topics = topics.slice(); + } + else { + filter.topics = [topic]; + } + super(getEventTag(filter), filter); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "address", address); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "interface", contractInterface); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "fragment", fragment); + } + prepareEvent(event) { + super.prepareEvent(event); + event.event = this.fragment.name; + event.eventSignature = this.fragment.format(); + event.decode = (data, topics) => { + return this.interface.decodeEventLog(this.fragment, data, topics); + }; + try { + event.args = this.interface.decodeEventLog(this.fragment, event.data, event.topics); + } + catch (error) { + event.args = null; + event.decodeError = error; + } + } + getEmit(event) { + const errors = Object(_ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["checkResultErrors"])(event.args); + if (errors.length) { + throw errors[0].error; + } + const args = (event.args || []).slice(); + args.push(event); + return args; + } +} +// A Wildard Event will attempt to populate: +// - event The name of the event name +// - eventSignature The full signature of the event +// - decode A function to decode data and topics +// - args The decoded data and topics +class WildcardRunningEvent extends RunningEvent { + constructor(address, contractInterface) { + super("*", { address: address }); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "address", address); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "interface", contractInterface); + } + prepareEvent(event) { + super.prepareEvent(event); + try { + const parsed = this.interface.parseLog(event); + event.event = parsed.name; + event.eventSignature = parsed.signature; + event.decode = (data, topics) => { + return this.interface.decodeEventLog(parsed.eventFragment, data, topics); + }; + event.args = parsed.args; + } + catch (error) { + // No matching event + } + } +} +class Contract { + constructor(addressOrName, contractInterface, signerOrProvider) { + logger.checkNew(new.target, Contract); + // @TODO: Maybe still check the addressOrName looks like a valid address or name? + //address = getAddress(address); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "interface", Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["getStatic"])((new.target), "getInterface")(contractInterface)); + if (signerOrProvider == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "provider", null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "signer", null); + } + else if (_ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__["Signer"].isSigner(signerOrProvider)) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "provider", signerOrProvider.provider || null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "signer", signerOrProvider); + } + else if (_ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_1__["Provider"].isProvider(signerOrProvider)) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "provider", signerOrProvider); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "signer", null); + } + else { + logger.throwArgumentError("invalid signer or provider", "signerOrProvider", signerOrProvider); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "callStatic", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "estimateGas", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "functions", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "populateTransaction", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "filters", {}); + { + const uniqueFilters = {}; + Object.keys(this.interface.events).forEach((eventSignature) => { + const event = this.interface.events[eventSignature]; + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.filters, eventSignature, (...args) => { + return { + address: this.address, + topics: this.interface.encodeFilterTopics(event, args) + }; + }); + if (!uniqueFilters[event.name]) { + uniqueFilters[event.name] = []; + } + uniqueFilters[event.name].push(eventSignature); + }); + Object.keys(uniqueFilters).forEach((name) => { + const filters = uniqueFilters[name]; + if (filters.length === 1) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.filters, name, this.filters[filters[0]]); + } + else { + logger.warn(`Duplicate definition of ${name} (${filters.join(", ")})`); + } + }); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "_runningEvents", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "_wrappedEmits", {}); + if (addressOrName == null) { + logger.throwArgumentError("invalid contract address or ENS name", "addressOrName", addressOrName); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "address", addressOrName); + if (this.provider) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "resolvedAddress", resolveName(this.provider, addressOrName)); + } + else { + try { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "resolvedAddress", Promise.resolve(Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_3__["getAddress"])(addressOrName))); + } + catch (error) { + // Without a provider, we cannot use ENS names + logger.throwError("provider is required to use ENS name as contract address", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new Contract" + }); + } + } + const uniqueNames = {}; + const uniqueSignatures = {}; + Object.keys(this.interface.functions).forEach((signature) => { + const fragment = this.interface.functions[signature]; + // Check that the signature is unique; if not the ABI generation has + // not been cleaned or may be incorrectly generated + if (uniqueSignatures[signature]) { + logger.warn(`Duplicate ABI entry for ${JSON.stringify(name)}`); + return; + } + uniqueSignatures[signature] = true; + // Track unique names; we only expose bare named functions if they + // are ambiguous + { + const name = fragment.name; + if (!uniqueNames[name]) { + uniqueNames[name] = []; + } + uniqueNames[name].push(signature); + } + if (this[signature] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, signature, buildDefault(this, fragment, true)); + } + // We do not collapse simple calls on this bucket, which allows + // frameworks to safely use this without introspection as well as + // allows decoding error recovery. + if (this.functions[signature] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.functions, signature, buildDefault(this, fragment, false)); + } + if (this.callStatic[signature] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.callStatic, signature, buildCall(this, fragment, true)); + } + if (this.populateTransaction[signature] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.populateTransaction, signature, buildPopulate(this, fragment)); + } + if (this.estimateGas[signature] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.estimateGas, signature, buildEstimate(this, fragment)); + } + }); + Object.keys(uniqueNames).forEach((name) => { + // Ambiguous names to not get attached as bare names + const signatures = uniqueNames[name]; + if (signatures.length > 1) { + return; + } + const signature = signatures[0]; + if (this[name] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, name, this[signature]); + } + if (this.functions[name] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.functions, name, this.functions[signature]); + } + if (this.callStatic[name] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.callStatic, name, this.callStatic[signature]); + } + if (this.populateTransaction[name] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.populateTransaction, name, this.populateTransaction[signature]); + } + if (this.estimateGas[name] == null) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this.estimateGas, name, this.estimateGas[signature]); + } + }); + } + static getContractAddress(transaction) { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_3__["getContractAddress"])(transaction); + } + static getInterface(contractInterface) { + if (_ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["Interface"].isInterface(contractInterface)) { + return contractInterface; + } + return new _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["Interface"](contractInterface); + } + // @TODO: Allow timeout? + deployed() { + return this._deployed(); + } + _deployed(blockTag) { + if (!this._deployedPromise) { + // If we were just deployed, we know the transaction we should occur in + if (this.deployTransaction) { + this._deployedPromise = this.deployTransaction.wait().then(() => { + return this; + }); + } + else { + // @TODO: Once we allow a timeout to be passed in, we will wait + // up to that many blocks for getCode + // Otherwise, poll for our code to be deployed + this._deployedPromise = this.provider.getCode(this.address, blockTag).then((code) => { + if (code === "0x") { + logger.throwError("contract not deployed", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + contractAddress: this.address, + operation: "getDeployed" + }); + } + return this; + }); + } + } + return this._deployedPromise; + } + // @TODO: + // estimateFallback(overrides?: TransactionRequest): Promise<BigNumber> + // @TODO: + // estimateDeploy(bytecode: string, ...args): Promise<BigNumber> + fallback(overrides) { + if (!this.signer) { + logger.throwError("sending a transactions require a signer", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: "sendTransaction(fallback)" }); + } + const tx = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["shallowCopy"])(overrides || {}); + ["from", "to"].forEach(function (key) { + if (tx[key] == null) { + return; + } + logger.throwError("cannot override " + key, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: key }); + }); + tx.to = this.resolvedAddress; + return this.deployed().then(() => { + return this.signer.sendTransaction(tx); + }); + } + // Reconnect to a different signer or provider + connect(signerOrProvider) { + if (typeof (signerOrProvider) === "string") { + signerOrProvider = new _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__["VoidSigner"](signerOrProvider, this.provider); + } + const contract = new (this.constructor)(this.address, this.interface, signerOrProvider); + if (this.deployTransaction) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(contract, "deployTransaction", this.deployTransaction); + } + return contract; + } + // Re-attach to a different on-chain instance of this contract + attach(addressOrName) { + return new (this.constructor)(addressOrName, this.interface, this.signer || this.provider); + } + static isIndexed(value) { + return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["Indexed"].isIndexed(value); + } + _normalizeRunningEvent(runningEvent) { + // Already have an instance of this event running; we can re-use it + if (this._runningEvents[runningEvent.tag]) { + return this._runningEvents[runningEvent.tag]; + } + return runningEvent; + } + _getRunningEvent(eventName) { + if (typeof (eventName) === "string") { + // Listen for "error" events (if your contract has an error event, include + // the full signature to bypass this special event keyword) + if (eventName === "error") { + return this._normalizeRunningEvent(new ErrorRunningEvent()); + } + // Listen for any event that is registered + if (eventName === "event") { + return this._normalizeRunningEvent(new RunningEvent("event", null)); + } + // Listen for any event + if (eventName === "*") { + return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface)); + } + // Get the event Fragment (throws if ambiguous/unknown event) + const fragment = this.interface.getEvent(eventName); + return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment)); + } + // We have topics to filter by... + if (eventName.topics && eventName.topics.length > 0) { + // Is it a known topichash? (throws if no matching topichash) + try { + const topic = eventName.topics[0]; + if (typeof (topic) !== "string") { + throw new Error("invalid topic"); // @TODO: May happen for anonymous events + } + const fragment = this.interface.getEvent(topic); + return this._normalizeRunningEvent(new FragmentRunningEvent(this.address, this.interface, fragment, eventName.topics)); + } + catch (error) { } + // Filter by the unknown topichash + const filter = { + address: this.address, + topics: eventName.topics + }; + return this._normalizeRunningEvent(new RunningEvent(getEventTag(filter), filter)); + } + return this._normalizeRunningEvent(new WildcardRunningEvent(this.address, this.interface)); + } + _checkRunningEvents(runningEvent) { + if (runningEvent.listenerCount() === 0) { + delete this._runningEvents[runningEvent.tag]; + // If we have a poller for this, remove it + const emit = this._wrappedEmits[runningEvent.tag]; + if (emit) { + this.provider.off(runningEvent.filter, emit); + delete this._wrappedEmits[runningEvent.tag]; + } + } + } + // Subclasses can override this to gracefully recover + // from parse errors if they wish + _wrapEvent(runningEvent, log, listener) { + const event = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["deepCopy"])(log); + event.removeListener = () => { + if (!listener) { + return; + } + runningEvent.removeListener(listener); + this._checkRunningEvents(runningEvent); + }; + event.getBlock = () => { return this.provider.getBlock(log.blockHash); }; + event.getTransaction = () => { return this.provider.getTransaction(log.transactionHash); }; + event.getTransactionReceipt = () => { return this.provider.getTransactionReceipt(log.transactionHash); }; + // This may throw if the topics and data mismatch the signature + runningEvent.prepareEvent(event); + return event; + } + _addEventListener(runningEvent, listener, once) { + if (!this.provider) { + logger.throwError("events require a provider or a signer with a provider", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: "once" }); + } + runningEvent.addListener(listener, once); + // Track this running event and its listeners (may already be there; but no hard in updating) + this._runningEvents[runningEvent.tag] = runningEvent; + // If we are not polling the provider, start polling + if (!this._wrappedEmits[runningEvent.tag]) { + const wrappedEmit = (log) => { + let event = this._wrapEvent(runningEvent, log, listener); + // Try to emit the result for the parameterized event... + if (event.decodeError == null) { + try { + const args = runningEvent.getEmit(event); + this.emit(runningEvent.filter, ...args); + } + catch (error) { + event.decodeError = error.error; + } + } + // Always emit "event" for fragment-base events + if (runningEvent.filter != null) { + this.emit("event", event); + } + // Emit "error" if there was an error + if (event.decodeError != null) { + this.emit("error", event.decodeError, event); + } + }; + this._wrappedEmits[runningEvent.tag] = wrappedEmit; + // Special events, like "error" do not have a filter + if (runningEvent.filter != null) { + this.provider.on(runningEvent.filter, wrappedEmit); + } + } + } + queryFilter(event, fromBlockOrBlockhash, toBlock) { + const runningEvent = this._getRunningEvent(event); + const filter = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["shallowCopy"])(runningEvent.filter); + if (typeof (fromBlockOrBlockhash) === "string" && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["isHexString"])(fromBlockOrBlockhash, 32)) { + if (toBlock != null) { + logger.throwArgumentError("cannot specify toBlock with blockhash", "toBlock", toBlock); + } + filter.blockHash = fromBlockOrBlockhash; + } + else { + filter.fromBlock = ((fromBlockOrBlockhash != null) ? fromBlockOrBlockhash : 0); + filter.toBlock = ((toBlock != null) ? toBlock : "latest"); + } + return this.provider.getLogs(filter).then((logs) => { + return logs.map((log) => this._wrapEvent(runningEvent, log, null)); + }); + } + on(event, listener) { + this._addEventListener(this._getRunningEvent(event), listener, false); + return this; + } + once(event, listener) { + this._addEventListener(this._getRunningEvent(event), listener, true); + return this; + } + emit(eventName, ...args) { + if (!this.provider) { + return false; + } + const runningEvent = this._getRunningEvent(eventName); + const result = (runningEvent.run(args) > 0); + // May have drained all the "once" events; check for living events + this._checkRunningEvents(runningEvent); + return result; + } + listenerCount(eventName) { + if (!this.provider) { + return 0; + } + if (eventName == null) { + return Object.keys(this._runningEvents).reduce((accum, key) => { + return accum + this._runningEvents[key].listenerCount(); + }, 0); + } + return this._getRunningEvent(eventName).listenerCount(); + } + listeners(eventName) { + if (!this.provider) { + return []; + } + if (eventName == null) { + const result = []; + for (let tag in this._runningEvents) { + this._runningEvents[tag].listeners().forEach((listener) => { + result.push(listener); + }); + } + return result; + } + return this._getRunningEvent(eventName).listeners(); + } + removeAllListeners(eventName) { + if (!this.provider) { + return this; + } + if (eventName == null) { + for (const tag in this._runningEvents) { + const runningEvent = this._runningEvents[tag]; + runningEvent.removeAllListeners(); + this._checkRunningEvents(runningEvent); + } + return this; + } + // Delete any listeners + const runningEvent = this._getRunningEvent(eventName); + runningEvent.removeAllListeners(); + this._checkRunningEvents(runningEvent); + return this; + } + off(eventName, listener) { + if (!this.provider) { + return this; + } + const runningEvent = this._getRunningEvent(eventName); + runningEvent.removeListener(listener); + this._checkRunningEvents(runningEvent); + return this; + } + removeListener(eventName, listener) { + return this.off(eventName, listener); + } +} +class ContractFactory { + constructor(contractInterface, bytecode, signer) { + let bytecodeHex = null; + if (typeof (bytecode) === "string") { + bytecodeHex = bytecode; + } + else if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["isBytes"])(bytecode)) { + bytecodeHex = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["hexlify"])(bytecode); + } + else if (bytecode && typeof (bytecode.object) === "string") { + // Allow the bytecode object from the Solidity compiler + bytecodeHex = bytecode.object; + } + else { + // Crash in the next verification step + bytecodeHex = "!"; + } + // Make sure it is 0x prefixed + if (bytecodeHex.substring(0, 2) !== "0x") { + bytecodeHex = "0x" + bytecodeHex; + } + // Make sure the final result is valid bytecode + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["isHexString"])(bytecodeHex) || (bytecodeHex.length % 2)) { + logger.throwArgumentError("invalid bytecode", "bytecode", bytecode); + } + // If we have a signer, make sure it is valid + if (signer && !_ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__["Signer"].isSigner(signer)) { + logger.throwArgumentError("invalid signer", "signer", signer); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "bytecode", bytecodeHex); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "interface", Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["getStatic"])((new.target), "getInterface")(contractInterface)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(this, "signer", signer || null); + } + // @TODO: Future; rename to populteTransaction? + getDeployTransaction(...args) { + let tx = {}; + // If we have 1 additional argument, we allow transaction overrides + if (args.length === this.interface.deploy.inputs.length + 1 && typeof (args[args.length - 1]) === "object") { + tx = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["shallowCopy"])(args.pop()); + for (const key in tx) { + if (!allowedTransactionKeys[key]) { + throw new Error("unknown transaction override " + key); + } + } + } + // Do not allow these to be overridden in a deployment transaction + ["data", "from", "to"].forEach((key) => { + if (tx[key] == null) { + return; + } + logger.throwError("cannot override " + key, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: key }); + }); + // Make sure the call matches the constructor signature + logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, " in Contract constructor"); + // Set the data to the bytecode + the encoded constructor arguments + tx.data = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["hexlify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_5__["concat"])([ + this.bytecode, + this.interface.encodeDeploy(args) + ])); + return tx; + } + deploy(...args) { + return __awaiter(this, void 0, void 0, function* () { + let overrides = {}; + // If 1 extra parameter was passed in, it contains overrides + if (args.length === this.interface.deploy.inputs.length + 1) { + overrides = args.pop(); + } + // Make sure the call matches the constructor signature + logger.checkArgumentCount(args.length, this.interface.deploy.inputs.length, " in Contract constructor"); + // Resolve ENS names and promises in the arguments + const params = yield resolveAddresses(this.signer, args, this.interface.deploy.inputs); + params.push(overrides); + // Get the deployment transaction (with optional overrides) + const unsignedTx = this.getDeployTransaction(...params); + // Send the deployment transaction + const tx = yield this.signer.sendTransaction(unsignedTx); + const address = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["getStatic"])(this.constructor, "getContractAddress")(tx); + const contract = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["getStatic"])(this.constructor, "getContract")(address, this.interface, this.signer); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["defineReadOnly"])(contract, "deployTransaction", tx); + return contract; + }); + } + attach(address) { + return (this.constructor).getContract(address, this.interface, this.signer); + } + connect(signer) { + return new (this.constructor)(this.interface, this.bytecode, signer); + } + static fromSolidity(compilerOutput, signer) { + if (compilerOutput == null) { + logger.throwError("missing compiler output", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.MISSING_ARGUMENT, { argument: "compilerOutput" }); + } + if (typeof (compilerOutput) === "string") { + compilerOutput = JSON.parse(compilerOutput); + } + const abi = compilerOutput.abi; + let bytecode = null; + if (compilerOutput.bytecode) { + bytecode = compilerOutput.bytecode; + } + else if (compilerOutput.evm && compilerOutput.evm.bytecode) { + bytecode = compilerOutput.evm.bytecode; + } + return new this(abi, bytecode, signer); + } + static getInterface(contractInterface) { + return Contract.getInterface(contractInterface); + } + static getContractAddress(tx) { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_3__["getContractAddress"])(tx); + } + static getContract(address, contractInterface, signer) { + return new Contract(address, contractInterface, signer); + } +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hash/lib.esm/_version.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/hash/lib.esm/_version.js ***! + \**************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "hash/5.0.11"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hash/lib.esm/id.js": +/*!********************************************************!*\ + !*** ./node_modules/@ethersproject/hash/lib.esm/id.js ***! + \********************************************************/ +/*! exports provided: id */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "id", function() { return id; }); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); + + +function id(text) { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_0__["keccak256"])(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8Bytes"])(text)); +} +//# sourceMappingURL=id.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hash/lib.esm/index.js": +/*!***********************************************************!*\ + !*** ./node_modules/@ethersproject/hash/lib.esm/index.js ***! + \***********************************************************/ +/*! exports provided: id, namehash, isValidName, messagePrefix, hashMessage, _TypedDataEncoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _id__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./id */ "./node_modules/@ethersproject/hash/lib.esm/id.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "id", function() { return _id__WEBPACK_IMPORTED_MODULE_0__["id"]; }); + +/* harmony import */ var _namehash__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namehash */ "./node_modules/@ethersproject/hash/lib.esm/namehash.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namehash", function() { return _namehash__WEBPACK_IMPORTED_MODULE_1__["namehash"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isValidName", function() { return _namehash__WEBPACK_IMPORTED_MODULE_1__["isValidName"]; }); + +/* harmony import */ var _message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./message */ "./node_modules/@ethersproject/hash/lib.esm/message.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "messagePrefix", function() { return _message__WEBPACK_IMPORTED_MODULE_2__["messagePrefix"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hashMessage", function() { return _message__WEBPACK_IMPORTED_MODULE_2__["hashMessage"]; }); + +/* harmony import */ var _typed_data__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typed-data */ "./node_modules/@ethersproject/hash/lib.esm/typed-data.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_TypedDataEncoder", function() { return _typed_data__WEBPACK_IMPORTED_MODULE_3__["TypedDataEncoder"]; }); + + + + + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hash/lib.esm/message.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/hash/lib.esm/message.js ***! + \*************************************************************/ +/*! exports provided: messagePrefix, hashMessage */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "messagePrefix", function() { return messagePrefix; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hashMessage", function() { return hashMessage; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); + + + +const messagePrefix = "\x19Ethereum Signed Message:\n"; +function hashMessage(message) { + if (typeof (message) === "string") { + message = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_2__["toUtf8Bytes"])(message); + } + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_1__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["concat"])([ + Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_2__["toUtf8Bytes"])(messagePrefix), + Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_2__["toUtf8Bytes"])(String(message.length)), + message + ])); +} +//# sourceMappingURL=message.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hash/lib.esm/namehash.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/hash/lib.esm/namehash.js ***! + \**************************************************************/ +/*! exports provided: isValidName, namehash */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isValidName", function() { return isValidName; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "namehash", function() { return namehash; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/hash/lib.esm/_version.js"); + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"](_version__WEBPACK_IMPORTED_MODULE_4__["version"]); +const Zeros = new Uint8Array(32); +Zeros.fill(0); +const Partition = new RegExp("^((.*)\\.)?([^.]+)$"); +function isValidName(name) { + try { + const comps = name.split("."); + for (let i = 0; i < comps.length; i++) { + if (Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["nameprep"])(comps[i]).length === 0) { + throw new Error("empty"); + } + } + return true; + } + catch (error) { } + return false; +} +function namehash(name) { + /* istanbul ignore if */ + if (typeof (name) !== "string") { + logger.throwArgumentError("invalid address - " + String(name), "name", name); + } + let result = Zeros; + while (name.length) { + const partition = name.match(Partition); + const label = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8Bytes"])(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["nameprep"])(partition[3])); + result = Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["concat"])([result, Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__["keccak256"])(label)])); + name = partition[2] || ""; + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(result); +} +//# sourceMappingURL=namehash.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hash/lib.esm/typed-data.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/hash/lib.esm/typed-data.js ***! + \****************************************************************/ +/*! exports provided: TypedDataEncoder */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TypedDataEncoder", function() { return TypedDataEncoder; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/hash/lib.esm/_version.js"); +/* harmony import */ var _id__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./id */ "./node_modules/@ethersproject/hash/lib.esm/id.js"); +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_5__["Logger"](_version__WEBPACK_IMPORTED_MODULE_6__["version"]); + +const padding = new Uint8Array(32); +padding.fill(0); +const NegativeOne = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(-1); +const Zero = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(0); +const One = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(1); +const MaxUint256 = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); +function hexPadRight(value) { + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(value); + const padOffset = bytes.length % 32; + if (padOffset) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexConcat"])([bytes, padding.slice(padOffset)]); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(bytes); +} +const hexTrue = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(One.toHexString(), 32); +const hexFalse = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(Zero.toHexString(), 32); +const domainFieldTypes = { + name: "string", + version: "string", + chainId: "uint256", + verifyingContract: "address", + salt: "bytes32" +}; +const domainFieldNames = [ + "name", "version", "chainId", "verifyingContract", "salt" +]; +function checkString(key) { + return function (value) { + if (typeof (value) !== "string") { + logger.throwArgumentError(`invalid domain value for ${JSON.stringify(key)}`, `domain.${key}`, value); + } + return value; + }; +} +const domainChecks = { + name: checkString("name"), + version: checkString("version"), + chainId: function (value) { + try { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value).toString(); + } + catch (error) { } + return logger.throwArgumentError(`invalid domain value for "chainId"`, "domain.chainId", value); + }, + verifyingContract: function (value) { + try { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(value).toLowerCase(); + } + catch (error) { } + return logger.throwArgumentError(`invalid domain value "verifyingContract"`, "domain.verifyingContract", value); + }, + salt: function (value) { + try { + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(value); + if (bytes.length !== 32) { + throw new Error("bad length"); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(bytes); + } + catch (error) { } + return logger.throwArgumentError(`invalid domain value "salt"`, "domain.salt", value); + } +}; +function getBaseEncoder(type) { + // intXX and uintXX + { + const match = type.match(/^(u?)int(\d*)$/); + if (match) { + const signed = (match[1] === ""); + const width = parseInt(match[2] || "256"); + if (width % 8 !== 0 || width > 256 || (match[2] && match[2] !== String(width))) { + logger.throwArgumentError("invalid numeric width", "type", type); + } + const boundsUpper = MaxUint256.mask(signed ? (width - 1) : width); + const boundsLower = signed ? boundsUpper.add(One).mul(NegativeOne) : Zero; + return function (value) { + const v = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value); + if (v.lt(boundsLower) || v.gt(boundsUpper)) { + logger.throwArgumentError(`value out-of-bounds for ${type}`, "value", value); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(v.toTwos(256).toHexString(), 32); + }; + } + } + // bytesXX + { + const match = type.match(/^bytes(\d+)$/); + if (match) { + const width = parseInt(match[1]); + if (width === 0 || width > 32 || match[1] !== String(width)) { + logger.throwArgumentError("invalid bytes width", "type", type); + } + return function (value) { + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(value); + if (bytes.length !== width) { + logger.throwArgumentError(`invalid length for ${type}`, "value", value); + } + return hexPadRight(value); + }; + } + } + switch (type) { + case "address": return function (value) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(value), 32); + }; + case "bool": return function (value) { + return ((!value) ? hexFalse : hexTrue); + }; + case "bytes": return function (value) { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"])(value); + }; + case "string": return function (value) { + return Object(_id__WEBPACK_IMPORTED_MODULE_7__["id"])(value); + }; + } + return null; +} +function encodeType(name, fields) { + return `${name}(${fields.map(({ name, type }) => (type + " " + name)).join(",")})`; +} +class TypedDataEncoder { + constructor(types) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "types", Object.freeze(Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["deepCopy"])(types))); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "_encoderCache", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "_types", {}); + // Link struct types to their direct child structs + const links = {}; + // Link structs to structs which contain them as a child + const parents = {}; + // Link all subtypes within a given struct + const subtypes = {}; + Object.keys(types).forEach((type) => { + links[type] = {}; + parents[type] = []; + subtypes[type] = {}; + }); + for (const name in types) { + const uniqueNames = {}; + types[name].forEach((field) => { + // Check each field has a unique name + if (uniqueNames[field.name]) { + logger.throwArgumentError(`duplicate variable name ${JSON.stringify(field.name)} in ${JSON.stringify(name)}`, "types", types); + } + uniqueNames[field.name] = true; + // Get the base type (drop any array specifiers) + const baseType = field.type.match(/^([^\x5b]*)(\x5b|$)/)[1]; + if (baseType === name) { + logger.throwArgumentError(`circular type reference to ${JSON.stringify(baseType)}`, "types", types); + } + // Is this a base encoding type? + const encoder = getBaseEncoder(baseType); + if (encoder) { + return; + } + if (!parents[baseType]) { + logger.throwArgumentError(`unknown type ${JSON.stringify(baseType)}`, "types", types); + } + // Add linkage + parents[baseType].push(name); + links[name][baseType] = true; + }); + } + // Deduce the primary type + const primaryTypes = Object.keys(parents).filter((n) => (parents[n].length === 0)); + if (primaryTypes.length === 0) { + logger.throwArgumentError("missing primary type", "types", types); + } + else if (primaryTypes.length > 1) { + logger.throwArgumentError(`ambiguous primary types or unused types: ${primaryTypes.map((t) => (JSON.stringify(t))).join(", ")}`, "types", types); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "primaryType", primaryTypes[0]); + // Check for circular type references + function checkCircular(type, found) { + if (found[type]) { + logger.throwArgumentError(`circular type reference to ${JSON.stringify(type)}`, "types", types); + } + found[type] = true; + Object.keys(links[type]).forEach((child) => { + if (!parents[child]) { + return; + } + // Recursively check children + checkCircular(child, found); + // Mark all ancestors as having this decendant + Object.keys(found).forEach((subtype) => { + subtypes[subtype][child] = true; + }); + }); + delete found[type]; + } + checkCircular(this.primaryType, {}); + // Compute each fully describe type + for (const name in subtypes) { + const st = Object.keys(subtypes[name]); + st.sort(); + this._types[name] = encodeType(name, types[name]) + st.map((t) => encodeType(t, types[t])).join(""); + } + } + getEncoder(type) { + let encoder = this._encoderCache[type]; + if (!encoder) { + encoder = this._encoderCache[type] = this._getEncoder(type); + } + return encoder; + } + _getEncoder(type) { + // Basic encoder type (address, bool, uint256, etc) + { + const encoder = getBaseEncoder(type); + if (encoder) { + return encoder; + } + } + // Array + const match = type.match(/^(.*)(\x5b(\d*)\x5d)$/); + if (match) { + const subtype = match[1]; + const subEncoder = this.getEncoder(subtype); + const length = parseInt(match[3]); + return (value) => { + if (length >= 0 && value.length !== length) { + logger.throwArgumentError("array length mismatch; expected length ${ arrayLength }", "value", value); + } + let result = value.map(subEncoder); + if (this._types[subtype]) { + result = result.map(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"]); + } + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexConcat"])(result)); + }; + } + // Struct + const fields = this.types[type]; + if (fields) { + const encodedType = Object(_id__WEBPACK_IMPORTED_MODULE_7__["id"])(this._types[type]); + return (value) => { + const values = fields.map(({ name, type }) => { + const result = this.getEncoder(type)(value[name]); + if (this._types[type]) { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"])(result); + } + return result; + }); + values.unshift(encodedType); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexConcat"])(values); + }; + } + return logger.throwArgumentError(`unknown type: ${type}`, "type", type); + } + encodeType(name) { + const result = this._types[name]; + if (!result) { + logger.throwArgumentError(`unknown type: ${JSON.stringify(name)}`, "name", name); + } + return result; + } + encodeData(type, value) { + return this.getEncoder(type)(value); + } + hashStruct(name, value) { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"])(this.encodeData(name, value)); + } + encode(value) { + return this.encodeData(this.primaryType, value); + } + hash(value) { + return this.hashStruct(this.primaryType, value); + } + _visit(type, value, callback) { + // Basic encoder type (address, bool, uint256, etc) + { + const encoder = getBaseEncoder(type); + if (encoder) { + return callback(type, value); + } + } + // Array + const match = type.match(/^(.*)(\x5b(\d*)\x5d)$/); + if (match) { + const subtype = match[1]; + const length = parseInt(match[3]); + if (length >= 0 && value.length !== length) { + logger.throwArgumentError("array length mismatch; expected length ${ arrayLength }", "value", value); + } + return value.map((v) => this._visit(subtype, v, callback)); + } + // Struct + const fields = this.types[type]; + if (fields) { + return fields.reduce((accum, { name, type }) => { + accum[name] = this._visit(type, value[name], callback); + return accum; + }, {}); + } + return logger.throwArgumentError(`unknown type: ${type}`, "type", type); + } + visit(value, callback) { + return this._visit(this.primaryType, value, callback); + } + static from(types) { + return new TypedDataEncoder(types); + } + static getPrimaryType(types) { + return TypedDataEncoder.from(types).primaryType; + } + static hashStruct(name, types, value) { + return TypedDataEncoder.from(types).hashStruct(name, value); + } + static hashDomain(domain) { + const domainFields = []; + for (const name in domain) { + const type = domainFieldTypes[name]; + if (!type) { + logger.throwArgumentError(`invalid typed-data domain key: ${JSON.stringify(name)}`, "domain", domain); + } + domainFields.push({ name, type }); + } + domainFields.sort((a, b) => { + return domainFieldNames.indexOf(a.name) - domainFieldNames.indexOf(b.name); + }); + return TypedDataEncoder.hashStruct("EIP712Domain", { EIP712Domain: domainFields }, domain); + } + static encode(domain, types, value) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexConcat"])([ + "0x1901", + TypedDataEncoder.hashDomain(domain), + TypedDataEncoder.from(types).hash(value) + ]); + } + static hash(domain, types, value) { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"])(TypedDataEncoder.encode(domain, types, value)); + } + // Replaces all address types with ENS names with their looked up address + static resolveNames(domain, types, value, resolveName) { + return __awaiter(this, void 0, void 0, function* () { + // Make a copy to isolate it from the object passed in + domain = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(domain); + // Look up all ENS names + const ensCache = {}; + // Do we need to look up the domain's verifyingContract? + if (domain.verifyingContract && !Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(domain.verifyingContract, 20)) { + ensCache[domain.verifyingContract] = "0x"; + } + // We are going to use the encoder to visit all the base values + const encoder = TypedDataEncoder.from(types); + // Get a list of all the addresses + encoder.visit(value, (type, value) => { + if (type === "address" && !Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(value, 20)) { + ensCache[value] = "0x"; + } + return value; + }); + // Lookup each name + for (const name in ensCache) { + ensCache[name] = yield resolveName(name); + } + // Replace the domain verifyingContract if needed + if (domain.verifyingContract && ensCache[domain.verifyingContract]) { + domain.verifyingContract = ensCache[domain.verifyingContract]; + } + // Replace all ENS names with their address + value = encoder.visit(value, (type, value) => { + if (type === "address" && ensCache[value]) { + return ensCache[value]; + } + return value; + }); + return { domain, value }; + }); + } + static getPayload(domain, types, value) { + // Validate the domain fields + TypedDataEncoder.hashDomain(domain); + // Derive the EIP712Domain Struct reference type + const domainValues = {}; + const domainTypes = []; + domainFieldNames.forEach((name) => { + const value = domain[name]; + if (value == null) { + return; + } + domainValues[name] = domainChecks[name](value); + domainTypes.push({ name, type: domainFieldTypes[name] }); + }); + const encoder = TypedDataEncoder.from(types); + const typesWithDomain = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(types); + if (typesWithDomain.EIP712Domain) { + logger.throwArgumentError("types must not contain EIP712Domain type", "types.EIP712Domain", types); + } + else { + typesWithDomain.EIP712Domain = domainTypes; + } + // Validate the data structures and types + encoder.encode(value); + return { + types: typesWithDomain, + domain: domainValues, + primaryType: encoder.primaryType, + message: encoder.visit(value, (type, value) => { + // bytes + if (type.match(/^bytes(\d*)/)) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(value)); + } + // uint or int + if (type.match(/^u?int/)) { + let prefix = ""; + let v = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value); + if (v.isNegative()) { + prefix = "-"; + v = v.mul(-1); + } + return prefix + Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexValue"])(v.toHexString()); + } + switch (type) { + case "address": + return value.toLowerCase(); + case "bool": + return !!value; + case "string": + if (typeof (value) !== "string") { + logger.throwArgumentError(`invalid string`, "value", value); + } + return value; + } + return logger.throwArgumentError("unsupported type", "type", type); + }) + }; + } +} +//# sourceMappingURL=typed-data.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hdnode/lib.esm/_version.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/hdnode/lib.esm/_version.js ***! + \****************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "hdnode/5.0.9"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/hdnode/lib.esm/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/hdnode/lib.esm/index.js ***! + \*************************************************************/ +/*! exports provided: defaultPath, HDNode, mnemonicToSeed, mnemonicToEntropy, entropyToMnemonic, isValidMnemonic */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultPath", function() { return defaultPath; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HDNode", function() { return HDNode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mnemonicToSeed", function() { return mnemonicToSeed; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mnemonicToEntropy", function() { return mnemonicToEntropy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "entropyToMnemonic", function() { return entropyToMnemonic; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isValidMnemonic", function() { return isValidMnemonic; }); +/* harmony import */ var _ethersproject_basex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/basex */ "./node_modules/@ethersproject/basex/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _ethersproject_pbkdf2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/pbkdf2 */ "./node_modules/@ethersproject/pbkdf2/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/signing-key */ "./node_modules/@ethersproject/signing-key/lib.esm/index.js"); +/* harmony import */ var _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/sha2 */ "./node_modules/@ethersproject/sha2/lib.esm/index.js"); +/* harmony import */ var _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/transactions */ "./node_modules/@ethersproject/transactions/lib.esm/index.js"); +/* harmony import */ var _ethersproject_wordlists__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ethersproject/wordlists */ "./node_modules/@ethersproject/wordlists/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/hdnode/lib.esm/_version.js"); + + + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_10__["Logger"](_version__WEBPACK_IMPORTED_MODULE_11__["version"]); +const N = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"); +// "Bitcoin seed" +const MasterSecret = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8Bytes"])("Bitcoin seed"); +const HardenedBit = 0x80000000; +// Returns a byte with the MSB bits set +function getUpperMask(bits) { + return ((1 << bits) - 1) << (8 - bits); +} +// Returns a byte with the LSB bits set +function getLowerMask(bits) { + return (1 << bits) - 1; +} +function bytes32(value) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexZeroPad"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(value), 32); +} +function base58check(data) { + return _ethersproject_basex__WEBPACK_IMPORTED_MODULE_0__["Base58"].encode(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["concat"])([data, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexDataSlice"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["sha256"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["sha256"])(data)), 0, 4)])); +} +function getWordlist(wordlist) { + if (wordlist == null) { + return _ethersproject_wordlists__WEBPACK_IMPORTED_MODULE_9__["wordlists"]["en"]; + } + if (typeof (wordlist) === "string") { + const words = _ethersproject_wordlists__WEBPACK_IMPORTED_MODULE_9__["wordlists"][wordlist]; + if (words == null) { + logger.throwArgumentError("unknown locale", "wordlist", wordlist); + } + return words; + } + return wordlist; +} +const _constructorGuard = {}; +const defaultPath = "m/44'/60'/0'/0/0"; +; +class HDNode { + /** + * This constructor should not be called directly. + * + * Please use: + * - fromMnemonic + * - fromSeed + */ + constructor(constructorGuard, privateKey, publicKey, parentFingerprint, chainCode, index, depth, mnemonicOrPath) { + logger.checkNew(new.target, HDNode); + /* istanbul ignore if */ + if (constructorGuard !== _constructorGuard) { + throw new Error("HDNode constructor cannot be called directly"); + } + if (privateKey) { + const signingKey = new _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_6__["SigningKey"](privateKey); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "privateKey", signingKey.privateKey); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "publicKey", signingKey.compressedPublicKey); + } + else { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "privateKey", null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "publicKey", Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(publicKey)); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "parentFingerprint", parentFingerprint); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "fingerprint", Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexDataSlice"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["ripemd160"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["sha256"])(this.publicKey)), 0, 4)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "address", Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_8__["computeAddress"])(this.publicKey)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "chainCode", chainCode); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "index", index); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "depth", depth); + if (mnemonicOrPath == null) { + // From a source that does not preserve the path (e.g. extended keys) + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "mnemonic", null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "path", null); + } + else if (typeof (mnemonicOrPath) === "string") { + // From a source that does not preserve the mnemonic (e.g. neutered) + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "mnemonic", null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "path", mnemonicOrPath); + } + else { + // From a fully qualified source + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "mnemonic", mnemonicOrPath); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["defineReadOnly"])(this, "path", mnemonicOrPath.path); + } + } + get extendedKey() { + // We only support the mainnet values for now, but if anyone needs + // testnet values, let me know. I believe current senitment is that + // we should always use mainnet, and use BIP-44 to derive the network + // - Mainnet: public=0x0488B21E, private=0x0488ADE4 + // - Testnet: public=0x043587CF, private=0x04358394 + if (this.depth >= 256) { + throw new Error("Depth too large!"); + } + return base58check(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["concat"])([ + ((this.privateKey != null) ? "0x0488ADE4" : "0x0488B21E"), + Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(this.depth), + this.parentFingerprint, + Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexZeroPad"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(this.index), 4), + this.chainCode, + ((this.privateKey != null) ? Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["concat"])(["0x00", this.privateKey]) : this.publicKey), + ])); + } + neuter() { + return new HDNode(_constructorGuard, null, this.publicKey, this.parentFingerprint, this.chainCode, this.index, this.depth, this.path); + } + _derive(index) { + if (index > 0xffffffff) { + throw new Error("invalid index - " + String(index)); + } + // Base path + let path = this.path; + if (path) { + path += "/" + (index & ~HardenedBit); + } + const data = new Uint8Array(37); + if (index & HardenedBit) { + if (!this.privateKey) { + throw new Error("cannot derive child of neutered node"); + } + // Data = 0x00 || ser_256(k_par) + data.set(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(this.privateKey), 1); + // Hardened path + if (path) { + path += "'"; + } + } + else { + // Data = ser_p(point(k_par)) + data.set(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(this.publicKey)); + } + // Data += ser_32(i) + for (let i = 24; i >= 0; i -= 8) { + data[33 + (i >> 3)] = ((index >> (24 - i)) & 0xff); + } + const I = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["computeHmac"])(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["SupportedAlgorithm"].sha512, this.chainCode, data)); + const IL = I.slice(0, 32); + const IR = I.slice(32); + // The private key + let ki = null; + // The public key + let Ki = null; + if (this.privateKey) { + ki = bytes32(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(IL).add(this.privateKey).mod(N)); + } + else { + const ek = new _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_6__["SigningKey"](Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(IL)); + Ki = ek._addPoint(this.publicKey); + } + let mnemonicOrPath = path; + const srcMnemonic = this.mnemonic; + if (srcMnemonic) { + mnemonicOrPath = Object.freeze({ + phrase: srcMnemonic.phrase, + path: path, + locale: (srcMnemonic.locale || "en") + }); + } + return new HDNode(_constructorGuard, ki, Ki, this.fingerprint, bytes32(IR), index, this.depth + 1, mnemonicOrPath); + } + derivePath(path) { + const components = path.split("/"); + if (components.length === 0 || (components[0] === "m" && this.depth !== 0)) { + throw new Error("invalid path - " + path); + } + if (components[0] === "m") { + components.shift(); + } + let result = this; + for (let i = 0; i < components.length; i++) { + const component = components[i]; + if (component.match(/^[0-9]+'$/)) { + const index = parseInt(component.substring(0, component.length - 1)); + if (index >= HardenedBit) { + throw new Error("invalid path index - " + component); + } + result = result._derive(HardenedBit + index); + } + else if (component.match(/^[0-9]+$/)) { + const index = parseInt(component); + if (index >= HardenedBit) { + throw new Error("invalid path index - " + component); + } + result = result._derive(index); + } + else { + throw new Error("invalid path component - " + component); + } + } + return result; + } + static _fromSeed(seed, mnemonic) { + const seedArray = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(seed); + if (seedArray.length < 16 || seedArray.length > 64) { + throw new Error("invalid seed"); + } + const I = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["computeHmac"])(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["SupportedAlgorithm"].sha512, MasterSecret, seedArray)); + return new HDNode(_constructorGuard, bytes32(I.slice(0, 32)), null, "0x00000000", bytes32(I.slice(32)), 0, 0, mnemonic); + } + static fromMnemonic(mnemonic, password, wordlist) { + // If a locale name was passed in, find the associated wordlist + wordlist = getWordlist(wordlist); + // Normalize the case and spacing in the mnemonic (throws if the mnemonic is invalid) + mnemonic = entropyToMnemonic(mnemonicToEntropy(mnemonic, wordlist), wordlist); + return HDNode._fromSeed(mnemonicToSeed(mnemonic, password), { + phrase: mnemonic, + path: "m", + locale: wordlist.locale + }); + } + static fromSeed(seed) { + return HDNode._fromSeed(seed, null); + } + static fromExtendedKey(extendedKey) { + const bytes = _ethersproject_basex__WEBPACK_IMPORTED_MODULE_0__["Base58"].decode(extendedKey); + if (bytes.length !== 82 || base58check(bytes.slice(0, 78)) !== extendedKey) { + logger.throwArgumentError("invalid extended key", "extendedKey", "[REDACTED]"); + } + const depth = bytes[4]; + const parentFingerprint = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(bytes.slice(5, 9)); + const index = parseInt(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(bytes.slice(9, 13)).substring(2), 16); + const chainCode = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(bytes.slice(13, 45)); + const key = bytes.slice(45, 78); + switch (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(bytes.slice(0, 4))) { + // Public Key + case "0x0488b21e": + case "0x043587cf": + return new HDNode(_constructorGuard, null, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(key), parentFingerprint, chainCode, index, depth, null); + // Private Key + case "0x0488ade4": + case "0x04358394 ": + if (key[0] !== 0) { + break; + } + return new HDNode(_constructorGuard, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(key.slice(1)), null, parentFingerprint, chainCode, index, depth, null); + } + return logger.throwArgumentError("invalid extended key", "extendedKey", "[REDACTED]"); + } +} +function mnemonicToSeed(mnemonic, password) { + if (!password) { + password = ""; + } + const salt = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8Bytes"])("mnemonic" + password, _ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["UnicodeNormalizationForm"].NFKD); + return Object(_ethersproject_pbkdf2__WEBPACK_IMPORTED_MODULE_4__["pbkdf2"])(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8Bytes"])(mnemonic, _ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["UnicodeNormalizationForm"].NFKD), salt, 2048, 64, "sha512"); +} +function mnemonicToEntropy(mnemonic, wordlist) { + wordlist = getWordlist(wordlist); + logger.checkNormalize(); + const words = wordlist.split(mnemonic); + if ((words.length % 3) !== 0) { + throw new Error("invalid mnemonic"); + } + const entropy = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(new Uint8Array(Math.ceil(11 * words.length / 8))); + let offset = 0; + for (let i = 0; i < words.length; i++) { + let index = wordlist.getWordIndex(words[i].normalize("NFKD")); + if (index === -1) { + throw new Error("invalid mnemonic"); + } + for (let bit = 0; bit < 11; bit++) { + if (index & (1 << (10 - bit))) { + entropy[offset >> 3] |= (1 << (7 - (offset % 8))); + } + offset++; + } + } + const entropyBits = 32 * words.length / 3; + const checksumBits = words.length / 3; + const checksumMask = getUpperMask(checksumBits); + const checksum = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["sha256"])(entropy.slice(0, entropyBits / 8)))[0] & checksumMask; + if (checksum !== (entropy[entropy.length - 1] & checksumMask)) { + throw new Error("invalid checksum"); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(entropy.slice(0, entropyBits / 8)); +} +function entropyToMnemonic(entropy, wordlist) { + wordlist = getWordlist(wordlist); + entropy = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(entropy); + if ((entropy.length % 4) !== 0 || entropy.length < 16 || entropy.length > 32) { + throw new Error("invalid entropy"); + } + const indices = [0]; + let remainingBits = 11; + for (let i = 0; i < entropy.length; i++) { + // Consume the whole byte (with still more to go) + if (remainingBits > 8) { + indices[indices.length - 1] <<= 8; + indices[indices.length - 1] |= entropy[i]; + remainingBits -= 8; + // This byte will complete an 11-bit index + } + else { + indices[indices.length - 1] <<= remainingBits; + indices[indices.length - 1] |= entropy[i] >> (8 - remainingBits); + // Start the next word + indices.push(entropy[i] & getLowerMask(8 - remainingBits)); + remainingBits += 3; + } + } + // Compute the checksum bits + const checksumBits = entropy.length / 4; + const checksum = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_7__["sha256"])(entropy))[0] & getUpperMask(checksumBits); + // Shift the checksum into the word indices + indices[indices.length - 1] <<= checksumBits; + indices[indices.length - 1] |= (checksum >> (8 - checksumBits)); + return wordlist.join(indices.map((index) => wordlist.getWord(index))); +} +function isValidMnemonic(mnemonic, wordlist) { + try { + mnemonicToEntropy(mnemonic, wordlist); + return true; + } + catch (error) { } + return false; +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/json-wallets/lib.esm/_version.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@ethersproject/json-wallets/lib.esm/_version.js ***! + \**********************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "json-wallets/5.0.11"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/json-wallets/lib.esm/crowdsale.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@ethersproject/json-wallets/lib.esm/crowdsale.js ***! + \***********************************************************************/ +/*! exports provided: CrowdsaleAccount, decrypt */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CrowdsaleAccount", function() { return CrowdsaleAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decrypt", function() { return decrypt; }); +/* harmony import */ var aes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! aes-js */ "./node_modules/aes-js/index.js"); +/* harmony import */ var aes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(aes_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_pbkdf2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/pbkdf2 */ "./node_modules/@ethersproject/pbkdf2/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/json-wallets/lib.esm/_version.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils */ "./node_modules/@ethersproject/json-wallets/lib.esm/utils.js"); + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"](_version__WEBPACK_IMPORTED_MODULE_8__["version"]); + +class CrowdsaleAccount extends _ethersproject_properties__WEBPACK_IMPORTED_MODULE_6__["Description"] { + isCrowdsaleAccount(value) { + return !!(value && value._isCrowdsaleAccount); + } +} +// See: https://github.com/ethereum/pyethsaletool +function decrypt(json, password) { + const data = JSON.parse(json); + password = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getPassword"])(password); + // Ethereum Address + const ethaddr = Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_1__["getAddress"])(Object(_utils__WEBPACK_IMPORTED_MODULE_9__["searchPath"])(data, "ethaddr")); + // Encrypted Seed + const encseed = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_9__["searchPath"])(data, "encseed")); + if (!encseed || (encseed.length % 16) !== 0) { + logger.throwArgumentError("invalid encseed", "json", json); + } + const key = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(Object(_ethersproject_pbkdf2__WEBPACK_IMPORTED_MODULE_4__["pbkdf2"])(password, password, 2000, 32, "sha256")).slice(0, 16); + const iv = encseed.slice(0, 16); + const encryptedSeed = encseed.slice(16); + // Decrypt the seed + const aesCbc = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.ModeOfOperation.cbc(key, iv); + const seed = aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.padding.pkcs7.strip(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(aesCbc.decrypt(encryptedSeed))); + // This wallet format is weird... Convert the binary encoded hex to a string. + let seedHex = ""; + for (let i = 0; i < seed.length; i++) { + seedHex += String.fromCharCode(seed[i]); + } + const seedHexBytes = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_5__["toUtf8Bytes"])(seedHex); + const privateKey = Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_3__["keccak256"])(seedHexBytes); + return new CrowdsaleAccount({ + _isCrowdsaleAccount: true, + address: ethaddr, + privateKey: privateKey + }); +} +//# sourceMappingURL=crowdsale.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/json-wallets/lib.esm/index.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/json-wallets/lib.esm/index.js ***! + \*******************************************************************/ +/*! exports provided: decryptCrowdsale, decryptKeystore, decryptKeystoreSync, encryptKeystore, isCrowdsaleWallet, isKeystoreWallet, getJsonWalletAddress, decryptJsonWallet, decryptJsonWalletSync */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptJsonWallet", function() { return decryptJsonWallet; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptJsonWalletSync", function() { return decryptJsonWalletSync; }); +/* harmony import */ var _crowdsale__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./crowdsale */ "./node_modules/@ethersproject/json-wallets/lib.esm/crowdsale.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "decryptCrowdsale", function() { return _crowdsale__WEBPACK_IMPORTED_MODULE_0__["decrypt"]; }); + +/* harmony import */ var _inspect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./inspect */ "./node_modules/@ethersproject/json-wallets/lib.esm/inspect.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isCrowdsaleWallet", function() { return _inspect__WEBPACK_IMPORTED_MODULE_1__["isCrowdsaleWallet"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isKeystoreWallet", function() { return _inspect__WEBPACK_IMPORTED_MODULE_1__["isKeystoreWallet"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getJsonWalletAddress", function() { return _inspect__WEBPACK_IMPORTED_MODULE_1__["getJsonWalletAddress"]; }); + +/* harmony import */ var _keystore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keystore */ "./node_modules/@ethersproject/json-wallets/lib.esm/keystore.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "decryptKeystore", function() { return _keystore__WEBPACK_IMPORTED_MODULE_2__["decrypt"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "decryptKeystoreSync", function() { return _keystore__WEBPACK_IMPORTED_MODULE_2__["decryptSync"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "encryptKeystore", function() { return _keystore__WEBPACK_IMPORTED_MODULE_2__["encrypt"]; }); + + + + + +function decryptJsonWallet(json, password, progressCallback) { + if (Object(_inspect__WEBPACK_IMPORTED_MODULE_1__["isCrowdsaleWallet"])(json)) { + if (progressCallback) { + progressCallback(0); + } + const account = Object(_crowdsale__WEBPACK_IMPORTED_MODULE_0__["decrypt"])(json, password); + if (progressCallback) { + progressCallback(1); + } + return Promise.resolve(account); + } + if (Object(_inspect__WEBPACK_IMPORTED_MODULE_1__["isKeystoreWallet"])(json)) { + return Object(_keystore__WEBPACK_IMPORTED_MODULE_2__["decrypt"])(json, password, progressCallback); + } + return Promise.reject(new Error("invalid JSON wallet")); +} +function decryptJsonWalletSync(json, password) { + if (Object(_inspect__WEBPACK_IMPORTED_MODULE_1__["isCrowdsaleWallet"])(json)) { + return Object(_crowdsale__WEBPACK_IMPORTED_MODULE_0__["decrypt"])(json, password); + } + if (Object(_inspect__WEBPACK_IMPORTED_MODULE_1__["isKeystoreWallet"])(json)) { + return Object(_keystore__WEBPACK_IMPORTED_MODULE_2__["decryptSync"])(json, password); + } + throw new Error("invalid JSON wallet"); +} + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/json-wallets/lib.esm/inspect.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ethersproject/json-wallets/lib.esm/inspect.js ***! + \*********************************************************************/ +/*! exports provided: isCrowdsaleWallet, isKeystoreWallet, getJsonWalletAddress */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCrowdsaleWallet", function() { return isCrowdsaleWallet; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isKeystoreWallet", function() { return isKeystoreWallet; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getJsonWalletAddress", function() { return getJsonWalletAddress; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); + + +function isCrowdsaleWallet(json) { + let data = null; + try { + data = JSON.parse(json); + } + catch (error) { + return false; + } + return (data.encseed && data.ethaddr); +} +function isKeystoreWallet(json) { + let data = null; + try { + data = JSON.parse(json); + } + catch (error) { + return false; + } + if (!data.version || parseInt(data.version) !== data.version || parseInt(data.version) !== 3) { + return false; + } + // @TODO: Put more checks to make sure it has kdf, iv and all that good stuff + return true; +} +//export function isJsonWallet(json: string): boolean { +// return (isSecretStorageWallet(json) || isCrowdsaleWallet(json)); +//} +function getJsonWalletAddress(json) { + if (isCrowdsaleWallet(json)) { + try { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(JSON.parse(json).ethaddr); + } + catch (error) { + return null; + } + } + if (isKeystoreWallet(json)) { + try { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(JSON.parse(json).address); + } + catch (error) { + return null; + } + } + return null; +} +//# sourceMappingURL=inspect.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/json-wallets/lib.esm/keystore.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@ethersproject/json-wallets/lib.esm/keystore.js ***! + \**********************************************************************/ +/*! exports provided: KeystoreAccount, decryptSync, decrypt, encrypt */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KeystoreAccount", function() { return KeystoreAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptSync", function() { return decryptSync; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decrypt", function() { return decrypt; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encrypt", function() { return encrypt; }); +/* harmony import */ var aes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! aes-js */ "./node_modules/aes-js/index.js"); +/* harmony import */ var aes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(aes_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var scrypt_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! scrypt-js */ "./node_modules/scrypt-js/scrypt.js"); +/* harmony import */ var scrypt_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(scrypt_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/hdnode */ "./node_modules/@ethersproject/hdnode/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_pbkdf2__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/pbkdf2 */ "./node_modules/@ethersproject/pbkdf2/lib.esm/index.js"); +/* harmony import */ var _ethersproject_random__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/random */ "./node_modules/@ethersproject/random/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ethersproject/transactions */ "./node_modules/@ethersproject/transactions/lib.esm/index.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils */ "./node_modules/@ethersproject/json-wallets/lib.esm/utils.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/json-wallets/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_11__["Logger"](_version__WEBPACK_IMPORTED_MODULE_12__["version"]); +// Exported Types +function hasMnemonic(value) { + return (value != null && value.mnemonic && value.mnemonic.phrase); +} +class KeystoreAccount extends _ethersproject_properties__WEBPACK_IMPORTED_MODULE_8__["Description"] { + isKeystoreAccount(value) { + return !!(value && value._isKeystoreAccount); + } +} +function _decrypt(data, key, ciphertext) { + const cipher = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/cipher"); + if (cipher === "aes-128-ctr") { + const iv = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/cipherparams/iv")); + const counter = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.Counter(iv); + const aesCtr = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.ModeOfOperation.ctr(key, counter); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(aesCtr.decrypt(ciphertext)); + } + return null; +} +function _getAccount(data, key) { + const ciphertext = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/ciphertext")); + const computedMAC = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_5__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([key.slice(16, 32), ciphertext]))).substring(2); + if (computedMAC !== Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/mac").toLowerCase()) { + throw new Error("invalid password"); + } + const privateKey = _decrypt(data, key.slice(0, 16), ciphertext); + if (!privateKey) { + logger.throwError("unsupported cipher", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_11__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "decrypt" + }); + } + const mnemonicKey = key.slice(32, 64); + const address = Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_9__["computeAddress"])(privateKey); + if (data.address) { + let check = data.address.toLowerCase(); + if (check.substring(0, 2) !== "0x") { + check = "0x" + check; + } + if (Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_2__["getAddress"])(check) !== address) { + throw new Error("address mismatch"); + } + } + const account = { + _isKeystoreAccount: true, + address: address, + privateKey: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(privateKey) + }; + // Version 0.1 x-ethers metadata must contain an encrypted mnemonic phrase + if (Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "x-ethers/version") === "0.1") { + const mnemonicCiphertext = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "x-ethers/mnemonicCiphertext")); + const mnemonicIv = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "x-ethers/mnemonicCounter")); + const mnemonicCounter = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.Counter(mnemonicIv); + const mnemonicAesCtr = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter); + const path = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "x-ethers/path") || _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["defaultPath"]; + const locale = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "x-ethers/locale") || "en"; + const entropy = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(mnemonicAesCtr.decrypt(mnemonicCiphertext)); + try { + const mnemonic = Object(_ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["entropyToMnemonic"])(entropy, locale); + const node = _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["HDNode"].fromMnemonic(mnemonic, null, locale).derivePath(path); + if (node.privateKey != account.privateKey) { + throw new Error("mnemonic mismatch"); + } + account.mnemonic = node.mnemonic; + } + catch (error) { + // If we don't have the locale wordlist installed to + // read this mnemonic, just bail and don't set the + // mnemonic + if (error.code !== _ethersproject_logger__WEBPACK_IMPORTED_MODULE_11__["Logger"].errors.INVALID_ARGUMENT || error.argument !== "wordlist") { + throw error; + } + } + } + return new KeystoreAccount(account); +} +function pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(Object(_ethersproject_pbkdf2__WEBPACK_IMPORTED_MODULE_6__["pbkdf2"])(passwordBytes, salt, count, dkLen, prfFunc)); +} +function pbkdf2(passwordBytes, salt, count, dkLen, prfFunc) { + return Promise.resolve(pbkdf2Sync(passwordBytes, salt, count, dkLen, prfFunc)); +} +function _computeKdfKey(data, password, pbkdf2Func, scryptFunc, progressCallback) { + const passwordBytes = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["getPassword"])(password); + const kdf = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdf"); + if (kdf && typeof (kdf) === "string") { + const throwError = function (name, value) { + return logger.throwArgumentError("invalid key-derivation function parameters", name, value); + }; + if (kdf.toLowerCase() === "scrypt") { + const salt = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/salt")); + const N = parseInt(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/n")); + const r = parseInt(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/r")); + const p = parseInt(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/p")); + // Check for all required parameters + if (!N || !r || !p) { + throwError("kdf", kdf); + } + // Make sure N is a power of 2 + if ((N & (N - 1)) !== 0) { + throwError("N", N); + } + const dkLen = parseInt(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/dklen")); + if (dkLen !== 32) { + throwError("dklen", dkLen); + } + return scryptFunc(passwordBytes, salt, N, r, p, 64, progressCallback); + } + else if (kdf.toLowerCase() === "pbkdf2") { + const salt = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["looseArrayify"])(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/salt")); + let prfFunc = null; + const prf = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/prf"); + if (prf === "hmac-sha256") { + prfFunc = "sha256"; + } + else if (prf === "hmac-sha512") { + prfFunc = "sha512"; + } + else { + throwError("prf", prf); + } + const count = parseInt(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/c")); + const dkLen = parseInt(Object(_utils__WEBPACK_IMPORTED_MODULE_10__["searchPath"])(data, "crypto/kdfparams/dklen")); + if (dkLen !== 32) { + throwError("dklen", dkLen); + } + return pbkdf2Func(passwordBytes, salt, count, dkLen, prfFunc); + } + } + return logger.throwArgumentError("unsupported key-derivation function", "kdf", kdf); +} +function decryptSync(json, password) { + const data = JSON.parse(json); + const key = _computeKdfKey(data, password, pbkdf2Sync, scrypt_js__WEBPACK_IMPORTED_MODULE_1___default.a.syncScrypt); + return _getAccount(data, key); +} +function decrypt(json, password, progressCallback) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.parse(json); + const key = yield _computeKdfKey(data, password, pbkdf2, scrypt_js__WEBPACK_IMPORTED_MODULE_1___default.a.scrypt, progressCallback); + return _getAccount(data, key); + }); +} +function encrypt(account, password, options, progressCallback) { + try { + // Check the address matches the private key + if (Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_2__["getAddress"])(account.address) !== Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_9__["computeAddress"])(account.privateKey)) { + throw new Error("address/privateKey mismatch"); + } + // Check the mnemonic (if any) matches the private key + if (hasMnemonic(account)) { + const mnemonic = account.mnemonic; + const node = _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["HDNode"].fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path || _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["defaultPath"]); + if (node.privateKey != account.privateKey) { + throw new Error("mnemonic mismatch"); + } + } + } + catch (e) { + return Promise.reject(e); + } + // The options are optional, so adjust the call as needed + if (typeof (options) === "function" && !progressCallback) { + progressCallback = options; + options = {}; + } + if (!options) { + options = {}; + } + const privateKey = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(account.privateKey); + const passwordBytes = Object(_utils__WEBPACK_IMPORTED_MODULE_10__["getPassword"])(password); + let entropy = null; + let path = null; + let locale = null; + if (hasMnemonic(account)) { + const srcMnemonic = account.mnemonic; + entropy = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(Object(_ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["mnemonicToEntropy"])(srcMnemonic.phrase, srcMnemonic.locale || "en")); + path = srcMnemonic.path || _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_4__["defaultPath"]; + locale = srcMnemonic.locale || "en"; + } + let client = options.client; + if (!client) { + client = "ethers.js"; + } + // Check/generate the salt + let salt = null; + if (options.salt) { + salt = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(options.salt); + } + else { + salt = Object(_ethersproject_random__WEBPACK_IMPORTED_MODULE_7__["randomBytes"])(32); + ; + } + // Override initialization vector + let iv = null; + if (options.iv) { + iv = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(options.iv); + if (iv.length !== 16) { + throw new Error("invalid iv"); + } + } + else { + iv = Object(_ethersproject_random__WEBPACK_IMPORTED_MODULE_7__["randomBytes"])(16); + } + // Override the uuid + let uuidRandom = null; + if (options.uuid) { + uuidRandom = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(options.uuid); + if (uuidRandom.length !== 16) { + throw new Error("invalid uuid"); + } + } + else { + uuidRandom = Object(_ethersproject_random__WEBPACK_IMPORTED_MODULE_7__["randomBytes"])(16); + } + // Override the scrypt password-based key derivation function parameters + let N = (1 << 17), r = 8, p = 1; + if (options.scrypt) { + if (options.scrypt.N) { + N = options.scrypt.N; + } + if (options.scrypt.r) { + r = options.scrypt.r; + } + if (options.scrypt.p) { + p = options.scrypt.p; + } + } + // We take 64 bytes: + // - 32 bytes As normal for the Web3 secret storage (derivedKey, macPrefix) + // - 32 bytes AES key to encrypt mnemonic with (required here to be Ethers Wallet) + return scrypt_js__WEBPACK_IMPORTED_MODULE_1___default.a.scrypt(passwordBytes, salt, N, r, p, 64, progressCallback).then((key) => { + key = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(key); + // This will be used to encrypt the wallet (as per Web3 secret storage) + const derivedKey = key.slice(0, 16); + const macPrefix = key.slice(16, 32); + // This will be used to encrypt the mnemonic phrase (if any) + const mnemonicKey = key.slice(32, 64); + // Encrypt the private key + const counter = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.Counter(iv); + const aesCtr = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.ModeOfOperation.ctr(derivedKey, counter); + const ciphertext = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(aesCtr.encrypt(privateKey)); + // Compute the message authentication code, used to check the password + const mac = Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_5__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([macPrefix, ciphertext])); + // See: https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition + const data = { + address: account.address.substring(2).toLowerCase(), + id: Object(_utils__WEBPACK_IMPORTED_MODULE_10__["uuidV4"])(uuidRandom), + version: 3, + Crypto: { + cipher: "aes-128-ctr", + cipherparams: { + iv: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(iv).substring(2), + }, + ciphertext: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(ciphertext).substring(2), + kdf: "scrypt", + kdfparams: { + salt: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(salt).substring(2), + n: N, + dklen: 32, + p: p, + r: r + }, + mac: mac.substring(2) + } + }; + // If we have a mnemonic, encrypt it into the JSON wallet + if (entropy) { + const mnemonicIv = Object(_ethersproject_random__WEBPACK_IMPORTED_MODULE_7__["randomBytes"])(16); + const mnemonicCounter = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.Counter(mnemonicIv); + const mnemonicAesCtr = new aes_js__WEBPACK_IMPORTED_MODULE_0___default.a.ModeOfOperation.ctr(mnemonicKey, mnemonicCounter); + const mnemonicCiphertext = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(mnemonicAesCtr.encrypt(entropy)); + const now = new Date(); + const timestamp = (now.getUTCFullYear() + "-" + + Object(_utils__WEBPACK_IMPORTED_MODULE_10__["zpad"])(now.getUTCMonth() + 1, 2) + "-" + + Object(_utils__WEBPACK_IMPORTED_MODULE_10__["zpad"])(now.getUTCDate(), 2) + "T" + + Object(_utils__WEBPACK_IMPORTED_MODULE_10__["zpad"])(now.getUTCHours(), 2) + "-" + + Object(_utils__WEBPACK_IMPORTED_MODULE_10__["zpad"])(now.getUTCMinutes(), 2) + "-" + + Object(_utils__WEBPACK_IMPORTED_MODULE_10__["zpad"])(now.getUTCSeconds(), 2) + ".0Z"); + data["x-ethers"] = { + client: client, + gethFilename: ("UTC--" + timestamp + "--" + data.address), + mnemonicCounter: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(mnemonicIv).substring(2), + mnemonicCiphertext: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(mnemonicCiphertext).substring(2), + path: path, + locale: locale, + version: "0.1" + }; + } + return JSON.stringify(data); + }); +} +//# sourceMappingURL=keystore.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/json-wallets/lib.esm/utils.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/json-wallets/lib.esm/utils.js ***! + \*******************************************************************/ +/*! exports provided: looseArrayify, zpad, getPassword, searchPath, uuidV4 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "looseArrayify", function() { return looseArrayify; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zpad", function() { return zpad; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getPassword", function() { return getPassword; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "searchPath", function() { return searchPath; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidV4", function() { return uuidV4; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); + + + +function looseArrayify(hexString) { + if (typeof (hexString) === 'string' && hexString.substring(0, 2) !== '0x') { + hexString = '0x' + hexString; + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(hexString); +} +function zpad(value, length) { + value = String(value); + while (value.length < length) { + value = '0' + value; + } + return value; +} +function getPassword(password) { + if (typeof (password) === 'string') { + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8Bytes"])(password, _ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["UnicodeNormalizationForm"].NFKC); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(password); +} +function searchPath(object, path) { + let currentChild = object; + const comps = path.toLowerCase().split('/'); + for (let i = 0; i < comps.length; i++) { + // Search for a child object with a case-insensitive matching key + let matchingChild = null; + for (const key in currentChild) { + if (key.toLowerCase() === comps[i]) { + matchingChild = currentChild[key]; + break; + } + } + // Didn't find one. :'( + if (matchingChild === null) { + return null; + } + // Now check this child... + currentChild = matchingChild; + } + return currentChild; +} +// See: https://www.ietf.org/rfc/rfc4122.txt (Section 4.4) +function uuidV4(randomBytes) { + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(randomBytes); + // Section: 4.1.3: + // - time_hi_and_version[12:16] = 0b0100 + bytes[6] = (bytes[6] & 0x0f) | 0x40; + // Section 4.4 + // - clock_seq_hi_and_reserved[6] = 0b0 + // - clock_seq_hi_and_reserved[7] = 0b1 + bytes[8] = (bytes[8] & 0x3f) | 0x80; + const value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(bytes); + return [ + value.substring(2, 10), + value.substring(10, 14), + value.substring(14, 18), + value.substring(18, 22), + value.substring(22, 34), + ].join("-"); +} +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/keccak256/lib.esm/index.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/keccak256/lib.esm/index.js ***! + \****************************************************************/ +/*! exports provided: keccak256 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keccak256", function() { return keccak256; }); +/* harmony import */ var js_sha3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! js-sha3 */ "./node_modules/js-sha3/src/sha3.js"); +/* harmony import */ var js_sha3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(js_sha3__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); + + + +function keccak256(data) { + return '0x' + js_sha3__WEBPACK_IMPORTED_MODULE_0___default.a.keccak_256(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(data)); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/logger/lib.esm/_version.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/logger/lib.esm/_version.js ***! + \****************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "logger/5.0.9"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/logger/lib.esm/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/logger/lib.esm/index.js ***! + \*************************************************************/ +/*! exports provided: LogLevel, ErrorCode, Logger */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LogLevel", function() { return LogLevel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ErrorCode", function() { return ErrorCode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Logger", function() { return Logger; }); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/logger/lib.esm/_version.js"); + +let _permanentCensorErrors = false; +let _censorErrors = false; +const LogLevels = { debug: 1, "default": 2, info: 2, warning: 3, error: 4, off: 5 }; +let _logLevel = LogLevels["default"]; + +let _globalLogger = null; +function _checkNormalize() { + try { + const missing = []; + // Make sure all forms of normalization are supported + ["NFD", "NFC", "NFKD", "NFKC"].forEach((form) => { + try { + if ("test".normalize(form) !== "test") { + throw new Error("bad normalize"); + } + ; + } + catch (error) { + missing.push(form); + } + }); + if (missing.length) { + throw new Error("missing " + missing.join(", ")); + } + if (String.fromCharCode(0xe9).normalize("NFD") !== String.fromCharCode(0x65, 0x0301)) { + throw new Error("broken implementation"); + } + } + catch (error) { + return error.message; + } + return null; +} +const _normalizeError = _checkNormalize(); +var LogLevel; +(function (LogLevel) { + LogLevel["DEBUG"] = "DEBUG"; + LogLevel["INFO"] = "INFO"; + LogLevel["WARNING"] = "WARNING"; + LogLevel["ERROR"] = "ERROR"; + LogLevel["OFF"] = "OFF"; +})(LogLevel || (LogLevel = {})); +var ErrorCode; +(function (ErrorCode) { + /////////////////// + // Generic Errors + // Unknown Error + ErrorCode["UNKNOWN_ERROR"] = "UNKNOWN_ERROR"; + // Not Implemented + ErrorCode["NOT_IMPLEMENTED"] = "NOT_IMPLEMENTED"; + // Unsupported Operation + // - operation + ErrorCode["UNSUPPORTED_OPERATION"] = "UNSUPPORTED_OPERATION"; + // Network Error (i.e. Ethereum Network, such as an invalid chain ID) + // - event ("noNetwork" is not re-thrown in provider.ready; otherwise thrown) + ErrorCode["NETWORK_ERROR"] = "NETWORK_ERROR"; + // Some sort of bad response from the server + ErrorCode["SERVER_ERROR"] = "SERVER_ERROR"; + // Timeout + ErrorCode["TIMEOUT"] = "TIMEOUT"; + /////////////////// + // Operational Errors + // Buffer Overrun + ErrorCode["BUFFER_OVERRUN"] = "BUFFER_OVERRUN"; + // Numeric Fault + // - operation: the operation being executed + // - fault: the reason this faulted + ErrorCode["NUMERIC_FAULT"] = "NUMERIC_FAULT"; + /////////////////// + // Argument Errors + // Missing new operator to an object + // - name: The name of the class + ErrorCode["MISSING_NEW"] = "MISSING_NEW"; + // Invalid argument (e.g. value is incompatible with type) to a function: + // - argument: The argument name that was invalid + // - value: The value of the argument + ErrorCode["INVALID_ARGUMENT"] = "INVALID_ARGUMENT"; + // Missing argument to a function: + // - count: The number of arguments received + // - expectedCount: The number of arguments expected + ErrorCode["MISSING_ARGUMENT"] = "MISSING_ARGUMENT"; + // Too many arguments + // - count: The number of arguments received + // - expectedCount: The number of arguments expected + ErrorCode["UNEXPECTED_ARGUMENT"] = "UNEXPECTED_ARGUMENT"; + /////////////////// + // Blockchain Errors + // Call exception + // - transaction: the transaction + // - address?: the contract address + // - args?: The arguments passed into the function + // - method?: The Solidity method signature + // - errorSignature?: The EIP848 error signature + // - errorArgs?: The EIP848 error parameters + // - reason: The reason (only for EIP848 "Error(string)") + ErrorCode["CALL_EXCEPTION"] = "CALL_EXCEPTION"; + // Insufficien funds (< value + gasLimit * gasPrice) + // - transaction: the transaction attempted + ErrorCode["INSUFFICIENT_FUNDS"] = "INSUFFICIENT_FUNDS"; + // Nonce has already been used + // - transaction: the transaction attempted + ErrorCode["NONCE_EXPIRED"] = "NONCE_EXPIRED"; + // The replacement fee for the transaction is too low + // - transaction: the transaction attempted + ErrorCode["REPLACEMENT_UNDERPRICED"] = "REPLACEMENT_UNDERPRICED"; + // The gas limit could not be estimated + // - transaction: the transaction passed to estimateGas + ErrorCode["UNPREDICTABLE_GAS_LIMIT"] = "UNPREDICTABLE_GAS_LIMIT"; +})(ErrorCode || (ErrorCode = {})); +; +class Logger { + constructor(version) { + Object.defineProperty(this, "version", { + enumerable: true, + value: version, + writable: false + }); + } + _log(logLevel, args) { + const level = logLevel.toLowerCase(); + if (LogLevels[level] == null) { + this.throwArgumentError("invalid log level name", "logLevel", logLevel); + } + if (_logLevel > LogLevels[level]) { + return; + } + console.log.apply(console, args); + } + debug(...args) { + this._log(Logger.levels.DEBUG, args); + } + info(...args) { + this._log(Logger.levels.INFO, args); + } + warn(...args) { + this._log(Logger.levels.WARNING, args); + } + makeError(message, code, params) { + // Errors are being censored + if (_censorErrors) { + return this.makeError("censored error", code, {}); + } + if (!code) { + code = Logger.errors.UNKNOWN_ERROR; + } + if (!params) { + params = {}; + } + const messageDetails = []; + Object.keys(params).forEach((key) => { + try { + messageDetails.push(key + "=" + JSON.stringify(params[key])); + } + catch (error) { + messageDetails.push(key + "=" + JSON.stringify(params[key].toString())); + } + }); + messageDetails.push(`code=${code}`); + messageDetails.push(`version=${this.version}`); + const reason = message; + if (messageDetails.length) { + message += " (" + messageDetails.join(", ") + ")"; + } + // @TODO: Any?? + const error = new Error(message); + error.reason = reason; + error.code = code; + Object.keys(params).forEach(function (key) { + error[key] = params[key]; + }); + return error; + } + throwError(message, code, params) { + throw this.makeError(message, code, params); + } + throwArgumentError(message, name, value) { + return this.throwError(message, Logger.errors.INVALID_ARGUMENT, { + argument: name, + value: value + }); + } + assert(condition, message, code, params) { + if (!!condition) { + return; + } + this.throwError(message, code, params); + } + assertArgument(condition, message, name, value) { + if (!!condition) { + return; + } + this.throwArgumentError(message, name, value); + } + checkNormalize(message) { + if (message == null) { + message = "platform missing String.prototype.normalize"; + } + if (_normalizeError) { + this.throwError("platform missing String.prototype.normalize", Logger.errors.UNSUPPORTED_OPERATION, { + operation: "String.prototype.normalize", form: _normalizeError + }); + } + } + checkSafeUint53(value, message) { + if (typeof (value) !== "number") { + return; + } + if (message == null) { + message = "value not safe"; + } + if (value < 0 || value >= 0x1fffffffffffff) { + this.throwError(message, Logger.errors.NUMERIC_FAULT, { + operation: "checkSafeInteger", + fault: "out-of-safe-range", + value: value + }); + } + if (value % 1) { + this.throwError(message, Logger.errors.NUMERIC_FAULT, { + operation: "checkSafeInteger", + fault: "non-integer", + value: value + }); + } + } + checkArgumentCount(count, expectedCount, message) { + if (message) { + message = ": " + message; + } + else { + message = ""; + } + if (count < expectedCount) { + this.throwError("missing argument" + message, Logger.errors.MISSING_ARGUMENT, { + count: count, + expectedCount: expectedCount + }); + } + if (count > expectedCount) { + this.throwError("too many arguments" + message, Logger.errors.UNEXPECTED_ARGUMENT, { + count: count, + expectedCount: expectedCount + }); + } + } + checkNew(target, kind) { + if (target === Object || target == null) { + this.throwError("missing new", Logger.errors.MISSING_NEW, { name: kind.name }); + } + } + checkAbstract(target, kind) { + if (target === kind) { + this.throwError("cannot instantiate abstract class " + JSON.stringify(kind.name) + " directly; use a sub-class", Logger.errors.UNSUPPORTED_OPERATION, { name: target.name, operation: "new" }); + } + else if (target === Object || target == null) { + this.throwError("missing new", Logger.errors.MISSING_NEW, { name: kind.name }); + } + } + static globalLogger() { + if (!_globalLogger) { + _globalLogger = new Logger(_version__WEBPACK_IMPORTED_MODULE_0__["version"]); + } + return _globalLogger; + } + static setCensorship(censorship, permanent) { + if (!censorship && permanent) { + this.globalLogger().throwError("cannot permanently disable censorship", Logger.errors.UNSUPPORTED_OPERATION, { + operation: "setCensorship" + }); + } + if (_permanentCensorErrors) { + if (!censorship) { + return; + } + this.globalLogger().throwError("error censorship permanent", Logger.errors.UNSUPPORTED_OPERATION, { + operation: "setCensorship" + }); + } + _censorErrors = !!censorship; + _permanentCensorErrors = !!permanent; + } + static setLogLevel(logLevel) { + const level = LogLevels[logLevel.toLowerCase()]; + if (level == null) { + Logger.globalLogger().warn("invalid log level - " + logLevel); + return; + } + _logLevel = level; + } + static from(version) { + return new Logger(version); + } +} +Logger.errors = ErrorCode; +Logger.levels = LogLevel; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/networks/lib.esm/_version.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/networks/lib.esm/_version.js ***! + \******************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "networks/5.0.8"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/networks/lib.esm/index.js": +/*!***************************************************************!*\ + !*** ./node_modules/@ethersproject/networks/lib.esm/index.js ***! + \***************************************************************/ +/*! exports provided: getNetwork */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNetwork", function() { return getNetwork; }); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/networks/lib.esm/_version.js"); + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"](_version__WEBPACK_IMPORTED_MODULE_1__["version"]); +; +function isRenetworkable(value) { + return (value && typeof (value.renetwork) === "function"); +} +function ethDefaultProvider(network) { + const func = function (providers, options) { + if (options == null) { + options = {}; + } + const providerList = []; + if (providers.InfuraProvider) { + try { + providerList.push(new providers.InfuraProvider(network, options.infura)); + } + catch (error) { } + } + if (providers.EtherscanProvider) { + try { + providerList.push(new providers.EtherscanProvider(network, options.etherscan)); + } + catch (error) { } + } + if (providers.AlchemyProvider) { + try { + providerList.push(new providers.AlchemyProvider(network, options.alchemy)); + } + catch (error) { } + } + if (providers.PocketProvider) { + try { + providerList.push(new providers.PocketProvider(network)); + } + catch (error) { } + } + if (providers.CloudflareProvider) { + try { + providerList.push(new providers.CloudflareProvider(network)); + } + catch (error) { } + } + if (providerList.length === 0) { + return null; + } + if (providers.FallbackProvider) { + let quorum = 1; + if (options.quorum != null) { + quorum = options.quorum; + } + else if (network === "homestead") { + quorum = 2; + } + return new providers.FallbackProvider(providerList, quorum); + } + return providerList[0]; + }; + func.renetwork = function (network) { + return ethDefaultProvider(network); + }; + return func; +} +function etcDefaultProvider(url, network) { + const func = function (providers, options) { + if (providers.JsonRpcProvider) { + return new providers.JsonRpcProvider(url, network); + } + return null; + }; + func.renetwork = function (network) { + return etcDefaultProvider(url, network); + }; + return func; +} +const homestead = { + chainId: 1, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "homestead", + _defaultProvider: ethDefaultProvider("homestead") +}; +const ropsten = { + chainId: 3, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "ropsten", + _defaultProvider: ethDefaultProvider("ropsten") +}; +const classicMordor = { + chainId: 63, + name: "classicMordor", + _defaultProvider: etcDefaultProvider("https://www.ethercluster.com/mordor", "classicMordor") +}; +const networks = { + unspecified: { + chainId: 0, + name: "unspecified" + }, + homestead: homestead, + mainnet: homestead, + morden: { + chainId: 2, + name: "morden" + }, + ropsten: ropsten, + testnet: ropsten, + rinkeby: { + chainId: 4, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "rinkeby", + _defaultProvider: ethDefaultProvider("rinkeby") + }, + kovan: { + chainId: 42, + name: "kovan", + _defaultProvider: ethDefaultProvider("kovan") + }, + goerli: { + chainId: 5, + ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", + name: "goerli", + _defaultProvider: ethDefaultProvider("goerli") + }, + // ETC (See: #351) + classic: { + chainId: 61, + name: "classic", + _defaultProvider: etcDefaultProvider("https://www.ethercluster.com/etc", "classic") + }, + classicMorden: { + chainId: 62, + name: "classicMorden", + }, + classicMordor: classicMordor, + classicTestnet: classicMordor, + classicKotti: { + chainId: 6, + name: "classicKotti", + _defaultProvider: etcDefaultProvider("https://www.ethercluster.com/kotti", "classicKotti") + }, +}; +/** + * getNetwork + * + * Converts a named common networks or chain ID (network ID) to a Network + * and verifies a network is a valid Network.. + */ +function getNetwork(network) { + // No network (null) + if (network == null) { + return null; + } + if (typeof (network) === "number") { + for (const name in networks) { + const standard = networks[name]; + if (standard.chainId === network) { + return { + name: standard.name, + chainId: standard.chainId, + ensAddress: (standard.ensAddress || null), + _defaultProvider: (standard._defaultProvider || null) + }; + } + } + return { + chainId: network, + name: "unknown" + }; + } + if (typeof (network) === "string") { + const standard = networks[network]; + if (standard == null) { + return null; + } + return { + name: standard.name, + chainId: standard.chainId, + ensAddress: standard.ensAddress, + _defaultProvider: (standard._defaultProvider || null) + }; + } + const standard = networks[network.name]; + // Not a standard network; check that it is a valid network in general + if (!standard) { + if (typeof (network.chainId) !== "number") { + logger.throwArgumentError("invalid network chainId", "network", network); + } + return network; + } + // Make sure the chainId matches the expected network chainId (or is 0; disable EIP-155) + if (network.chainId !== 0 && network.chainId !== standard.chainId) { + logger.throwArgumentError("network chainId mismatch", "network", network); + } + // @TODO: In the next major version add an attach function to a defaultProvider + // class and move the _defaultProvider internal to this file (extend Network) + let defaultProvider = network._defaultProvider || null; + if (defaultProvider == null && standard._defaultProvider) { + if (isRenetworkable(standard._defaultProvider)) { + defaultProvider = standard._defaultProvider.renetwork(network); + } + else { + defaultProvider = standard._defaultProvider; + } + } + // Standard Network (allow overriding the ENS address) + return { + name: network.name, + chainId: standard.chainId, + ensAddress: (network.ensAddress || standard.ensAddress || null), + _defaultProvider: defaultProvider + }; +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/pbkdf2/lib.esm/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/pbkdf2/lib.esm/index.js ***! + \*************************************************************/ +/*! exports provided: pbkdf2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _pbkdf2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pbkdf2 */ "./node_modules/@ethersproject/pbkdf2/lib.esm/pbkdf2.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pbkdf2", function() { return _pbkdf2__WEBPACK_IMPORTED_MODULE_0__["pbkdf2"]; }); + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/pbkdf2/lib.esm/pbkdf2.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/pbkdf2/lib.esm/pbkdf2.js ***! + \**************************************************************/ +/*! exports provided: pbkdf2 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pbkdf2", function() { return pbkdf2; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/sha2 */ "./node_modules/@ethersproject/sha2/lib.esm/index.js"); + + + +function pbkdf2(password, salt, iterations, keylen, hashAlgorithm) { + password = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(password); + salt = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(salt); + let hLen; + let l = 1; + const DK = new Uint8Array(keylen); + const block1 = new Uint8Array(salt.length + 4); + block1.set(salt); + //salt.copy(block1, 0, 0, salt.length) + let r; + let T; + for (let i = 1; i <= l; i++) { + //block1.writeUInt32BE(i, salt.length) + block1[salt.length] = (i >> 24) & 0xff; + block1[salt.length + 1] = (i >> 16) & 0xff; + block1[salt.length + 2] = (i >> 8) & 0xff; + block1[salt.length + 3] = i & 0xff; + //let U = createHmac(password).update(block1).digest(); + let U = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_1__["computeHmac"])(hashAlgorithm, password, block1)); + if (!hLen) { + hLen = U.length; + T = new Uint8Array(hLen); + l = Math.ceil(keylen / hLen); + r = keylen - (l - 1) * hLen; + } + //U.copy(T, 0, 0, hLen) + T.set(U); + for (let j = 1; j < iterations; j++) { + //U = createHmac(password).update(U).digest(); + U = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_1__["computeHmac"])(hashAlgorithm, password, U)); + for (let k = 0; k < hLen; k++) + T[k] ^= U[k]; + } + const destPos = (i - 1) * hLen; + const len = (i === l ? r : hLen); + //T.copy(DK, destPos, 0, len) + DK.set(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(T).slice(0, len), destPos); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(DK); +} +//# sourceMappingURL=pbkdf2.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/properties/lib.esm/_version.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ethersproject/properties/lib.esm/_version.js ***! + \********************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "properties/5.0.8"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/properties/lib.esm/index.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/properties/lib.esm/index.js ***! + \*****************************************************************/ +/*! exports provided: defineReadOnly, getStatic, resolveProperties, checkProperties, shallowCopy, deepCopy, Description */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defineReadOnly", function() { return defineReadOnly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStatic", function() { return getStatic; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolveProperties", function() { return resolveProperties; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkProperties", function() { return checkProperties; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shallowCopy", function() { return shallowCopy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deepCopy", function() { return deepCopy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Description", function() { return Description; }); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/properties/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"](_version__WEBPACK_IMPORTED_MODULE_1__["version"]); +function defineReadOnly(object, name, value) { + Object.defineProperty(object, name, { + enumerable: true, + value: value, + writable: false, + }); +} +// Crawl up the constructor chain to find a static method +function getStatic(ctor, key) { + for (let i = 0; i < 32; i++) { + if (ctor[key]) { + return ctor[key]; + } + if (!ctor.prototype || typeof (ctor.prototype) !== "object") { + break; + } + ctor = Object.getPrototypeOf(ctor.prototype).constructor; + } + return null; +} +function resolveProperties(object) { + return __awaiter(this, void 0, void 0, function* () { + const promises = Object.keys(object).map((key) => { + const value = object[key]; + return Promise.resolve(value).then((v) => ({ key: key, value: v })); + }); + const results = yield Promise.all(promises); + return results.reduce((accum, result) => { + accum[(result.key)] = result.value; + return accum; + }, {}); + }); +} +function checkProperties(object, properties) { + if (!object || typeof (object) !== "object") { + logger.throwArgumentError("invalid object", "object", object); + } + Object.keys(object).forEach((key) => { + if (!properties[key]) { + logger.throwArgumentError("invalid object key - " + key, "transaction:" + key, object); + } + }); +} +function shallowCopy(object) { + const result = {}; + for (const key in object) { + result[key] = object[key]; + } + return result; +} +const opaque = { bigint: true, boolean: true, "function": true, number: true, string: true }; +function _isFrozen(object) { + // Opaque objects are not mutable, so safe to copy by assignment + if (object === undefined || object === null || opaque[typeof (object)]) { + return true; + } + if (Array.isArray(object) || typeof (object) === "object") { + if (!Object.isFrozen(object)) { + return false; + } + const keys = Object.keys(object); + for (let i = 0; i < keys.length; i++) { + if (!_isFrozen(object[keys[i]])) { + return false; + } + } + return true; + } + return logger.throwArgumentError(`Cannot deepCopy ${typeof (object)}`, "object", object); +} +// Returns a new copy of object, such that no properties may be replaced. +// New properties may be added only to objects. +function _deepCopy(object) { + if (_isFrozen(object)) { + return object; + } + // Arrays are mutable, so we need to create a copy + if (Array.isArray(object)) { + return Object.freeze(object.map((item) => deepCopy(item))); + } + if (typeof (object) === "object") { + const result = {}; + for (const key in object) { + const value = object[key]; + if (value === undefined) { + continue; + } + defineReadOnly(result, key, deepCopy(value)); + } + return result; + } + return logger.throwArgumentError(`Cannot deepCopy ${typeof (object)}`, "object", object); +} +function deepCopy(object) { + return _deepCopy(object); +} +class Description { + constructor(info) { + for (const key in info) { + this[key] = deepCopy(info[key]); + } + } +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/_version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/_version.js ***! + \*******************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "providers/5.0.23"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/alchemy-provider.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/alchemy-provider.js ***! + \***************************************************************************/ +/*! exports provided: AlchemyWebSocketProvider, AlchemyProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AlchemyWebSocketProvider", function() { return AlchemyWebSocketProvider; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AlchemyProvider", function() { return AlchemyProvider; }); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatter */ "./node_modules/@ethersproject/providers/lib.esm/formatter.js"); +/* harmony import */ var _websocket_provider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./websocket-provider */ "./node_modules/@ethersproject/providers/lib.esm/websocket-provider.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./url-json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js"); + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"](_version__WEBPACK_IMPORTED_MODULE_4__["version"]); + +// This key was provided to ethers.js by Alchemy to be used by the +// default provider, but it is recommended that for your own +// production environments, that you acquire your own API key at: +// https://dashboard.alchemyapi.io +const defaultApiKey = "_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; +class AlchemyWebSocketProvider extends _websocket_provider__WEBPACK_IMPORTED_MODULE_2__["WebSocketProvider"] { + constructor(network, apiKey) { + const provider = new AlchemyProvider(network, apiKey); + const url = provider.connection.url.replace(/^http/i, "ws") + .replace(".alchemyapi.", ".ws.alchemyapi."); + super(url, provider.network); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "apiKey", provider.apiKey); + } + isCommunityResource() { + return (this.apiKey === defaultApiKey); + } +} +class AlchemyProvider extends _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_5__["UrlJsonRpcProvider"] { + static getWebSocketProvider(network, apiKey) { + return new AlchemyWebSocketProvider(network, apiKey); + } + static getApiKey(apiKey) { + if (apiKey == null) { + return defaultApiKey; + } + if (apiKey && typeof (apiKey) !== "string") { + logger.throwArgumentError("invalid apiKey", "apiKey", apiKey); + } + return apiKey; + } + static getUrl(network, apiKey) { + let host = null; + switch (network.name) { + case "homestead": + host = "eth-mainnet.alchemyapi.io/v2/"; + break; + case "ropsten": + host = "eth-ropsten.alchemyapi.io/v2/"; + break; + case "rinkeby": + host = "eth-rinkeby.alchemyapi.io/v2/"; + break; + case "goerli": + host = "eth-goerli.alchemyapi.io/v2/"; + break; + case "kovan": + host = "eth-kovan.alchemyapi.io/v2/"; + break; + default: + logger.throwArgumentError("unsupported network", "network", arguments[0]); + } + return { + allowGzip: true, + url: ("https:/" + "/" + host + apiKey), + throttleCallback: (attempt, url) => { + if (apiKey === defaultApiKey) { + Object(_formatter__WEBPACK_IMPORTED_MODULE_1__["showThrottleMessage"])(); + } + return Promise.resolve(true); + } + }; + } + isCommunityResource() { + return (this.apiKey === defaultApiKey); + } +} +//# sourceMappingURL=alchemy-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/base-provider.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/base-provider.js ***! + \************************************************************************/ +/*! exports provided: Event, Resolver, BaseProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Event", function() { return Event; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Resolver", function() { return Resolver; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseProvider", function() { return BaseProvider; }); +/* harmony import */ var _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/abstract-provider */ "./node_modules/@ethersproject/abstract-provider/lib.esm/index.js"); +/* harmony import */ var _ethersproject_basex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/basex */ "./node_modules/@ethersproject/basex/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/constants */ "./node_modules/@ethersproject/constants/lib.esm/index.js"); +/* harmony import */ var _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/hash */ "./node_modules/@ethersproject/hash/lib.esm/index.js"); +/* harmony import */ var _ethersproject_networks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/networks */ "./node_modules/@ethersproject/networks/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/sha2 */ "./node_modules/@ethersproject/sha2/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _ethersproject_web__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @ethersproject/web */ "./node_modules/@ethersproject/web/lib.esm/index.js"); +/* harmony import */ var bech32__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! bech32 */ "./node_modules/bech32/index.js"); +/* harmony import */ var bech32__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(bech32__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./formatter */ "./node_modules/@ethersproject/providers/lib.esm/formatter.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"](_version__WEBPACK_IMPORTED_MODULE_13__["version"]); + +////////////////////////////// +// Event Serializeing +function checkTopic(topic) { + if (topic == null) { + return "null"; + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataLength"])(topic) !== 32) { + logger.throwArgumentError("invalid topic", "topic", topic); + } + return topic.toLowerCase(); +} +function serializeTopics(topics) { + // Remove trailing null AND-topics; they are redundant + topics = topics.slice(); + while (topics.length > 0 && topics[topics.length - 1] == null) { + topics.pop(); + } + return topics.map((topic) => { + if (Array.isArray(topic)) { + // Only track unique OR-topics + const unique = {}; + topic.forEach((topic) => { + unique[checkTopic(topic)] = true; + }); + // The order of OR-topics does not matter + const sorted = Object.keys(unique); + sorted.sort(); + return sorted.join("|"); + } + else { + return checkTopic(topic); + } + }).join("&"); +} +function deserializeTopics(data) { + if (data === "") { + return []; + } + return data.split(/&/g).map((topic) => { + if (topic === "") { + return []; + } + const comps = topic.split("|").map((topic) => { + return ((topic === "null") ? null : topic); + }); + return ((comps.length === 1) ? comps[0] : comps); + }); +} +function getEventTag(eventName) { + if (typeof (eventName) === "string") { + eventName = eventName.toLowerCase(); + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataLength"])(eventName) === 32) { + return "tx:" + eventName; + } + if (eventName.indexOf(":") === -1) { + return eventName; + } + } + else if (Array.isArray(eventName)) { + return "filter:*:" + serializeTopics(eventName); + } + else if (_ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__["ForkEvent"].isForkEvent(eventName)) { + logger.warn("not implemented"); + throw new Error("not implemented"); + } + else if (eventName && typeof (eventName) === "object") { + return "filter:" + (eventName.address || "*") + ":" + serializeTopics(eventName.topics || []); + } + throw new Error("invalid event - " + eventName); +} +////////////////////////////// +// Helper Object +function getTime() { + return (new Date()).getTime(); +} +function stall(duration) { + return new Promise((resolve) => { + setTimeout(resolve, duration); + }); +} +////////////////////////////// +// Provider Object +/** + * EventType + * - "block" + * - "poll" + * - "didPoll" + * - "pending" + * - "error" + * - "network" + * - filter + * - topics array + * - transaction hash + */ +const PollableEvents = ["block", "network", "pending", "poll"]; +class Event { + constructor(tag, listener, once) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "tag", tag); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "listener", listener); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "once", once); + } + get event() { + switch (this.type) { + case "tx": + return this.hash; + case "filter": + return this.filter; + } + return this.tag; + } + get type() { + return this.tag.split(":")[0]; + } + get hash() { + const comps = this.tag.split(":"); + if (comps[0] !== "tx") { + return null; + } + return comps[1]; + } + get filter() { + const comps = this.tag.split(":"); + if (comps[0] !== "filter") { + return null; + } + const address = comps[1]; + const topics = deserializeTopics(comps[2]); + const filter = {}; + if (topics.length > 0) { + filter.topics = topics; + } + if (address && address !== "*") { + filter.address = address; + } + return filter; + } + pollable() { + return (this.tag.indexOf(":") >= 0 || PollableEvents.indexOf(this.tag) >= 0); + } +} +; +// https://github.com/satoshilabs/slips/blob/master/slip-0044.md +const coinInfos = { + "0": { symbol: "btc", p2pkh: 0x00, p2sh: 0x05, prefix: "bc" }, + "2": { symbol: "ltc", p2pkh: 0x30, p2sh: 0x32, prefix: "ltc" }, + "3": { symbol: "doge", p2pkh: 0x1e, p2sh: 0x16 }, + "60": { symbol: "eth", ilk: "eth" }, + "61": { symbol: "etc", ilk: "eth" }, + "700": { symbol: "xdai", ilk: "eth" }, +}; +function bytes32ify(value) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexZeroPad"])(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(value).toHexString(), 32); +} +// Compute the Base58Check encoded data (checksum is first 4 bytes of sha256d) +function base58Encode(data) { + return _ethersproject_basex__WEBPACK_IMPORTED_MODULE_1__["Base58"].encode(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([data, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataSlice"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_8__["sha256"])(Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_8__["sha256"])(data)), 0, 4)])); +} +class Resolver { + constructor(provider, address, name) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "provider", provider); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "name", name); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "address", provider.formatter.address(address)); + } + _fetchBytes(selector, parameters) { + return __awaiter(this, void 0, void 0, function* () { + // keccak256("addr(bytes32,uint256)") + const transaction = { + to: this.address, + data: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexConcat"])([selector, Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["namehash"])(this.name), (parameters || "0x")]) + }; + const result = yield this.provider.call(transaction); + if (result === "0x") { + return null; + } + const offset = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataSlice"])(result, 0, 32)).toNumber(); + const length = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataSlice"])(result, offset, offset + 32)).toNumber(); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataSlice"])(result, offset + 32, offset + 32 + length); + }); + } + _getAddress(coinType, hexBytes) { + const coinInfo = coinInfos[String(coinType)]; + if (coinInfo == null) { + logger.throwError(`unsupported coin type: ${coinType}`, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: `getAddress(${coinType})` + }); + } + if (coinInfo.ilk === "eth") { + return this.provider.formatter.address(hexBytes); + } + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(hexBytes); + // P2PKH: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG + if (coinInfo.p2pkh != null) { + const p2pkh = hexBytes.match(/^0x76a9([0-9a-f][0-9a-f])([0-9a-f]*)88ac$/); + if (p2pkh) { + const length = parseInt(p2pkh[1], 16); + if (p2pkh[2].length === length * 2 && length >= 1 && length <= 75) { + return base58Encode(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([[coinInfo.p2pkh], ("0x" + p2pkh[2])])); + } + } + } + // P2SH: OP_HASH160 <scriptHash> OP_EQUAL + if (coinInfo.p2sh != null) { + const p2sh = hexBytes.match(/^0xa9([0-9a-f][0-9a-f])([0-9a-f]*)87$/); + if (p2sh) { + const length = parseInt(p2sh[1], 16); + if (p2sh[2].length === length * 2 && length >= 1 && length <= 75) { + return base58Encode(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([[coinInfo.p2sh], ("0x" + p2sh[2])])); + } + } + } + // Bech32 + if (coinInfo.prefix != null) { + const length = bytes[1]; + // https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#witness-program + let version = bytes[0]; + if (version === 0x00) { + if (length !== 20 && length !== 32) { + version = -1; + } + } + else { + version = -1; + } + if (version >= 0 && bytes.length === 2 + length && length >= 1 && length <= 75) { + const words = bech32__WEBPACK_IMPORTED_MODULE_11___default.a.toWords(bytes.slice(2)); + words.unshift(version); + return bech32__WEBPACK_IMPORTED_MODULE_11___default.a.encode(coinInfo.prefix, words); + } + } + return null; + } + getAddress(coinType) { + return __awaiter(this, void 0, void 0, function* () { + if (coinType == null) { + coinType = 60; + } + // If Ethereum, use the standard `addr(bytes32)` + if (coinType === 60) { + // keccak256("addr(bytes32)") + const transaction = { + to: this.address, + data: ("0x3b3b57de" + Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["namehash"])(this.name).substring(2)) + }; + const hexBytes = yield this.provider.call(transaction); + // No address + if (hexBytes === "0x" || hexBytes === _ethersproject_constants__WEBPACK_IMPORTED_MODULE_4__["HashZero"]) { + return null; + } + return this.provider.formatter.callAddress(hexBytes); + } + // keccak256("addr(bytes32,uint256") + const hexBytes = yield this._fetchBytes("0xf1cb7e06", bytes32ify(coinType)); + // No address + if (hexBytes == null || hexBytes === "0x") { + return null; + } + // Compute the address + const address = this._getAddress(coinType, hexBytes); + if (address == null) { + logger.throwError(`invalid or unsupported coin data`, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: `getAddress(${coinType})`, + coinType: coinType, + data: hexBytes + }); + } + return address; + }); + } + getContentHash() { + return __awaiter(this, void 0, void 0, function* () { + // keccak256("contenthash()") + const hexBytes = yield this._fetchBytes("0xbc1c58d1"); + // No contenthash + if (hexBytes == null || hexBytes === "0x") { + return null; + } + // IPFS (CID: 1, Type: DAG-PB) + const ipfs = hexBytes.match(/^0xe3010170(([0-9a-f][0-9a-f])([0-9a-f][0-9a-f])([0-9a-f]*))$/); + if (ipfs) { + const length = parseInt(ipfs[3], 16); + if (ipfs[4].length === length * 2) { + return "ipfs:/\/" + _ethersproject_basex__WEBPACK_IMPORTED_MODULE_1__["Base58"].encode("0x" + ipfs[1]); + } + } + // Swarm (CID: 1, Type: swarm-manifest; hash/length hard-coded to keccak256/32) + const swarm = hexBytes.match(/^0xe40101fa011b20([0-9a-f]*)$/); + if (swarm) { + if (swarm[1].length === (32 * 2)) { + return "bzz:/\/" + swarm[1]; + } + } + return logger.throwError(`invalid or unsupported content hash data`, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "getContentHash()", + data: hexBytes + }); + }); + } + getText(key) { + return __awaiter(this, void 0, void 0, function* () { + // The key encoded as parameter to fetchBytes + let keyBytes = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_9__["toUtf8Bytes"])(key); + // The nodehash consumes the first slot, so the string pointer targets + // offset 64, with the length at offset 64 and data starting at offset 96 + keyBytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([bytes32ify(64), bytes32ify(keyBytes.length), keyBytes]); + // Pad to word-size (32 bytes) + if ((keyBytes.length % 32) !== 0) { + keyBytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([keyBytes, Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexZeroPad"])("0x", 32 - (key.length % 32))]); + } + const hexBytes = yield this._fetchBytes("0x59d1d43c", Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(keyBytes)); + if (hexBytes == null || hexBytes === "0x") { + return null; + } + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_9__["toUtf8String"])(hexBytes); + }); + } +} +let defaultFormatter = null; +let nextPollId = 1; +class BaseProvider extends _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__["Provider"] { + /** + * ready + * + * A Promise<Network> that resolves only once the provider is ready. + * + * Sub-classes that call the super with a network without a chainId + * MUST set this. Standard named networks have a known chainId. + * + */ + constructor(network) { + logger.checkNew(new.target, _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__["Provider"]); + super(); + // Events being listened to + this._events = []; + this._emitted = { block: -2 }; + this.formatter = new.target.getFormatter(); + // If network is any, this Provider allows the underlying + // network to change dynamically, and we auto-detect the + // current network + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "anyNetwork", (network === "any")); + if (this.anyNetwork) { + network = this.detectNetwork(); + } + if (network instanceof Promise) { + this._networkPromise = network; + // Squash any "unhandled promise" errors; that do not need to be handled + network.catch((error) => { }); + // Trigger initial network setting (async) + this._ready().catch((error) => { }); + } + else { + const knownNetwork = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["getStatic"])((new.target), "getNetwork")(network); + if (knownNetwork) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_network", knownNetwork); + this.emit("network", knownNetwork, null); + } + else { + logger.throwArgumentError("invalid network", "network", network); + } + } + this._maxInternalBlockNumber = -1024; + this._lastBlockNumber = -2; + this._pollingInterval = 4000; + this._fastQueryDate = 0; + } + _ready() { + return __awaiter(this, void 0, void 0, function* () { + if (this._network == null) { + let network = null; + if (this._networkPromise) { + try { + network = yield this._networkPromise; + } + catch (error) { } + } + // Try the Provider's network detection (this MUST throw if it cannot) + if (network == null) { + network = yield this.detectNetwork(); + } + // This should never happen; every Provider sub-class should have + // suggested a network by here (or have thrown). + if (!network) { + logger.throwError("no network detected", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNKNOWN_ERROR, {}); + } + // Possible this call stacked so do not call defineReadOnly again + if (this._network == null) { + if (this.anyNetwork) { + this._network = network; + } + else { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_network", network); + } + this.emit("network", network, null); + } + } + return this._network; + }); + } + // This will always return the most recently established network. + // For "any", this can change (a "network" event is emitted before + // any change is refelcted); otherwise this cannot change + get ready() { + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_10__["poll"])(() => { + return this._ready().then((network) => { + return network; + }, (error) => { + // If the network isn't running yet, we will wait + if (error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.NETWORK_ERROR && error.event === "noNetwork") { + return undefined; + } + throw error; + }); + }); + } + // @TODO: Remove this and just create a singleton formatter + static getFormatter() { + if (defaultFormatter == null) { + defaultFormatter = new _formatter__WEBPACK_IMPORTED_MODULE_14__["Formatter"](); + } + return defaultFormatter; + } + // @TODO: Remove this and just use getNetwork + static getNetwork(network) { + return Object(_ethersproject_networks__WEBPACK_IMPORTED_MODULE_6__["getNetwork"])((network == null) ? "homestead" : network); + } + // Fetches the blockNumber, but will reuse any result that is less + // than maxAge old or has been requested since the last request + _getInternalBlockNumber(maxAge) { + return __awaiter(this, void 0, void 0, function* () { + yield this._ready(); + // Allowing stale data up to maxAge old + if (maxAge > 0) { + // While there are pending internal block requests... + while (this._internalBlockNumber) { + // ..."remember" which fetch we started with + const internalBlockNumber = this._internalBlockNumber; + try { + // Check the result is not too stale + const result = yield internalBlockNumber; + if ((getTime() - result.respTime) <= maxAge) { + return result.blockNumber; + } + // Too old; fetch a new value + break; + } + catch (error) { + // The fetch rejected; if we are the first to get the + // rejection, drop through so we replace it with a new + // fetch; all others blocked will then get that fetch + // which won't match the one they "remembered" and loop + if (this._internalBlockNumber === internalBlockNumber) { + break; + } + } + } + } + const reqTime = getTime(); + const checkInternalBlockNumber = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + blockNumber: this.perform("getBlockNumber", {}), + networkError: this.getNetwork().then((network) => (null), (error) => (error)) + }).then(({ blockNumber, networkError }) => { + if (networkError) { + // Unremember this bad internal block number + if (this._internalBlockNumber === checkInternalBlockNumber) { + this._internalBlockNumber = null; + } + throw networkError; + } + const respTime = getTime(); + blockNumber = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(blockNumber).toNumber(); + if (blockNumber < this._maxInternalBlockNumber) { + blockNumber = this._maxInternalBlockNumber; + } + this._maxInternalBlockNumber = blockNumber; + this._setFastBlockNumber(blockNumber); // @TODO: Still need this? + return { blockNumber, reqTime, respTime }; + }); + this._internalBlockNumber = checkInternalBlockNumber; + // Swallow unhandled exceptions; if needed they are handled else where + checkInternalBlockNumber.catch((error) => { + // Don't null the dead (rejected) fetch, if it has already been updated + if (this._internalBlockNumber === checkInternalBlockNumber) { + this._internalBlockNumber = null; + } + }); + return (yield checkInternalBlockNumber).blockNumber; + }); + } + poll() { + return __awaiter(this, void 0, void 0, function* () { + const pollId = nextPollId++; + // Track all running promises, so we can trigger a post-poll once they are complete + const runners = []; + let blockNumber = null; + try { + blockNumber = yield this._getInternalBlockNumber(100 + this.pollingInterval / 2); + } + catch (error) { + this.emit("error", error); + return; + } + this._setFastBlockNumber(blockNumber); + // Emit a poll event after we have the latest (fast) block number + this.emit("poll", pollId, blockNumber); + // If the block has not changed, meh. + if (blockNumber === this._lastBlockNumber) { + this.emit("didPoll", pollId); + return; + } + // First polling cycle, trigger a "block" events + if (this._emitted.block === -2) { + this._emitted.block = blockNumber - 1; + } + if (Math.abs((this._emitted.block) - blockNumber) > 1000) { + logger.warn("network block skew detected; skipping block events"); + this.emit("error", logger.makeError("network block skew detected", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.NETWORK_ERROR, { + blockNumber: blockNumber, + event: "blockSkew", + previousBlockNumber: this._emitted.block + })); + this.emit("block", blockNumber); + } + else { + // Notify all listener for each block that has passed + for (let i = this._emitted.block + 1; i <= blockNumber; i++) { + this.emit("block", i); + } + } + // The emitted block was updated, check for obsolete events + if (this._emitted.block !== blockNumber) { + this._emitted.block = blockNumber; + Object.keys(this._emitted).forEach((key) => { + // The block event does not expire + if (key === "block") { + return; + } + // The block we were at when we emitted this event + const eventBlockNumber = this._emitted[key]; + // We cannot garbage collect pending transactions or blocks here + // They should be garbage collected by the Provider when setting + // "pending" events + if (eventBlockNumber === "pending") { + return; + } + // Evict any transaction hashes or block hashes over 12 blocks + // old, since they should not return null anyways + if (blockNumber - eventBlockNumber > 12) { + delete this._emitted[key]; + } + }); + } + // First polling cycle + if (this._lastBlockNumber === -2) { + this._lastBlockNumber = blockNumber - 1; + } + // Find all transaction hashes we are waiting on + this._events.forEach((event) => { + switch (event.type) { + case "tx": { + const hash = event.hash; + let runner = this.getTransactionReceipt(hash).then((receipt) => { + if (!receipt || receipt.blockNumber == null) { + return null; + } + this._emitted["t:" + hash] = receipt.blockNumber; + this.emit(hash, receipt); + return null; + }).catch((error) => { this.emit("error", error); }); + runners.push(runner); + break; + } + case "filter": { + const filter = event.filter; + filter.fromBlock = this._lastBlockNumber + 1; + filter.toBlock = blockNumber; + const runner = this.getLogs(filter).then((logs) => { + if (logs.length === 0) { + return; + } + logs.forEach((log) => { + this._emitted["b:" + log.blockHash] = log.blockNumber; + this._emitted["t:" + log.transactionHash] = log.blockNumber; + this.emit(filter, log); + }); + }).catch((error) => { this.emit("error", error); }); + runners.push(runner); + break; + } + } + }); + this._lastBlockNumber = blockNumber; + // Once all events for this loop have been processed, emit "didPoll" + Promise.all(runners).then(() => { + this.emit("didPoll", pollId); + }).catch((error) => { this.emit("error", error); }); + return; + }); + } + // Deprecated; do not use this + resetEventsBlock(blockNumber) { + this._lastBlockNumber = blockNumber - 1; + if (this.polling) { + this.poll(); + } + } + get network() { + return this._network; + } + // This method should query the network if the underlying network + // can change, such as when connected to a JSON-RPC backend + detectNetwork() { + return __awaiter(this, void 0, void 0, function* () { + return logger.throwError("provider does not support network detection", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "provider.detectNetwork" + }); + }); + } + getNetwork() { + return __awaiter(this, void 0, void 0, function* () { + const network = yield this._ready(); + // Make sure we are still connected to the same network; this is + // only an external call for backends which can have the underlying + // network change spontaneously + const currentNetwork = yield this.detectNetwork(); + if (network.chainId !== currentNetwork.chainId) { + // We are allowing network changes, things can get complex fast; + // make sure you know what you are doing if you use "any" + if (this.anyNetwork) { + this._network = currentNetwork; + // Reset all internal block number guards and caches + this._lastBlockNumber = -2; + this._fastBlockNumber = null; + this._fastBlockNumberPromise = null; + this._fastQueryDate = 0; + this._emitted.block = -2; + this._maxInternalBlockNumber = -1024; + this._internalBlockNumber = null; + // The "network" event MUST happen before this method resolves + // so any events have a chance to unregister, so we stall an + // additional event loop before returning from /this/ call + this.emit("network", currentNetwork, network); + yield stall(0); + return this._network; + } + const error = logger.makeError("underlying network changed", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.NETWORK_ERROR, { + event: "changed", + network: network, + detectedNetwork: currentNetwork + }); + this.emit("error", error); + throw error; + } + return network; + }); + } + get blockNumber() { + this._getInternalBlockNumber(100 + this.pollingInterval / 2).then((blockNumber) => { + this._setFastBlockNumber(blockNumber); + }, (error) => { }); + return (this._fastBlockNumber != null) ? this._fastBlockNumber : -1; + } + get polling() { + return (this._poller != null); + } + set polling(value) { + if (value && !this._poller) { + this._poller = setInterval(() => { this.poll(); }, this.pollingInterval); + if (!this._bootstrapPoll) { + this._bootstrapPoll = setTimeout(() => { + this.poll(); + // We block additional polls until the polling interval + // is done, to prevent overwhelming the poll function + this._bootstrapPoll = setTimeout(() => { + // If polling was disabled, something may require a poke + // since starting the bootstrap poll and it was disabled + if (!this._poller) { + this.poll(); + } + // Clear out the bootstrap so we can do another + this._bootstrapPoll = null; + }, this.pollingInterval); + }, 0); + } + } + else if (!value && this._poller) { + clearInterval(this._poller); + this._poller = null; + } + } + get pollingInterval() { + return this._pollingInterval; + } + set pollingInterval(value) { + if (typeof (value) !== "number" || value <= 0 || parseInt(String(value)) != value) { + throw new Error("invalid polling interval"); + } + this._pollingInterval = value; + if (this._poller) { + clearInterval(this._poller); + this._poller = setInterval(() => { this.poll(); }, this._pollingInterval); + } + } + _getFastBlockNumber() { + const now = getTime(); + // Stale block number, request a newer value + if ((now - this._fastQueryDate) > 2 * this._pollingInterval) { + this._fastQueryDate = now; + this._fastBlockNumberPromise = this.getBlockNumber().then((blockNumber) => { + if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) { + this._fastBlockNumber = blockNumber; + } + return this._fastBlockNumber; + }); + } + return this._fastBlockNumberPromise; + } + _setFastBlockNumber(blockNumber) { + // Older block, maybe a stale request + if (this._fastBlockNumber != null && blockNumber < this._fastBlockNumber) { + return; + } + // Update the time we updated the blocknumber + this._fastQueryDate = getTime(); + // Newer block number, use it + if (this._fastBlockNumber == null || blockNumber > this._fastBlockNumber) { + this._fastBlockNumber = blockNumber; + this._fastBlockNumberPromise = Promise.resolve(blockNumber); + } + } + waitForTransaction(transactionHash, confirmations, timeout) { + return __awaiter(this, void 0, void 0, function* () { + if (confirmations == null) { + confirmations = 1; + } + const receipt = yield this.getTransactionReceipt(transactionHash); + // Receipt is already good + if ((receipt ? receipt.confirmations : 0) >= confirmations) { + return receipt; + } + // Poll until the receipt is good... + return new Promise((resolve, reject) => { + let timer = null; + let done = false; + const handler = (receipt) => { + if (receipt.confirmations < confirmations) { + return; + } + if (timer) { + clearTimeout(timer); + } + if (done) { + return; + } + done = true; + this.removeListener(transactionHash, handler); + resolve(receipt); + }; + this.on(transactionHash, handler); + if (typeof (timeout) === "number" && timeout > 0) { + timer = setTimeout(() => { + if (done) { + return; + } + timer = null; + done = true; + this.removeListener(transactionHash, handler); + reject(logger.makeError("timeout exceeded", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.TIMEOUT, { timeout: timeout })); + }, timeout); + if (timer.unref) { + timer.unref(); + } + } + }); + }); + } + getBlockNumber() { + return __awaiter(this, void 0, void 0, function* () { + return this._getInternalBlockNumber(0); + }); + } + getGasPrice() { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const result = yield this.perform("getGasPrice", {}); + try { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(result); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "getGasPrice", + result, error + }); + } + }); + } + getBalance(addressOrName, blockTag) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag) + }); + const result = yield this.perform("getBalance", params); + try { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(result); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "getBalance", + params, result, error + }); + } + }); + } + getTransactionCount(addressOrName, blockTag) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag) + }); + const result = yield this.perform("getTransactionCount", params); + try { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(result).toNumber(); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "getTransactionCount", + params, result, error + }); + } + }); + } + getCode(addressOrName, blockTag) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag) + }); + const result = yield this.perform("getCode", params); + try { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(result); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "getCode", + params, result, error + }); + } + }); + } + getStorageAt(addressOrName, position, blockTag) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + address: this._getAddress(addressOrName), + blockTag: this._getBlockTag(blockTag), + position: Promise.resolve(position).then((p) => Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexValue"])(p)) + }); + const result = yield this.perform("getStorageAt", params); + try { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(result); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "getStorageAt", + params, result, error + }); + } + }); + } + // This should be called by any subclass wrapping a TransactionResponse + _wrapTransaction(tx, hash) { + if (hash != null && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataLength"])(hash) !== 32) { + throw new Error("invalid response - sendTransaction"); + } + const result = tx; + // Check the hash we expect is the same as the hash the server reported + if (hash != null && tx.hash !== hash) { + logger.throwError("Transaction hash mismatch from Provider.sendTransaction.", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNKNOWN_ERROR, { expectedHash: tx.hash, returnedHash: hash }); + } + // @TODO: (confirmations? number, timeout? number) + result.wait = (confirmations) => __awaiter(this, void 0, void 0, function* () { + // We know this transaction *must* exist (whether it gets mined is + // another story), so setting an emitted value forces us to + // wait even if the node returns null for the receipt + if (confirmations !== 0) { + this._emitted["t:" + tx.hash] = "pending"; + } + const receipt = yield this.waitForTransaction(tx.hash, confirmations); + if (receipt == null && confirmations === 0) { + return null; + } + // No longer pending, allow the polling loop to garbage collect this + this._emitted["t:" + tx.hash] = receipt.blockNumber; + if (receipt.status === 0) { + logger.throwError("transaction failed", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.CALL_EXCEPTION, { + transactionHash: tx.hash, + transaction: tx, + receipt: receipt + }); + } + return receipt; + }); + return result; + } + sendTransaction(signedTransaction) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const hexTx = yield Promise.resolve(signedTransaction).then(t => Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(t)); + const tx = this.formatter.transaction(signedTransaction); + try { + const hash = yield this.perform("sendTransaction", { signedTransaction: hexTx }); + return this._wrapTransaction(tx, hash); + } + catch (error) { + error.transaction = tx; + error.transactionHash = tx.hash; + throw error; + } + }); + } + _getTransactionRequest(transaction) { + return __awaiter(this, void 0, void 0, function* () { + const values = yield transaction; + const tx = {}; + ["from", "to"].forEach((key) => { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then((v) => (v ? this._getAddress(v) : null)); + }); + ["gasLimit", "gasPrice", "value"].forEach((key) => { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then((v) => (v ? _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(v) : null)); + }); + ["data"].forEach((key) => { + if (values[key] == null) { + return; + } + tx[key] = Promise.resolve(values[key]).then((v) => (v ? Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(v) : null)); + }); + return this.formatter.transactionRequest(yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])(tx)); + }); + } + _getFilter(filter) { + return __awaiter(this, void 0, void 0, function* () { + filter = yield filter; + const result = {}; + if (filter.address != null) { + result.address = this._getAddress(filter.address); + } + ["blockHash", "topics"].forEach((key) => { + if (filter[key] == null) { + return; + } + result[key] = filter[key]; + }); + ["fromBlock", "toBlock"].forEach((key) => { + if (filter[key] == null) { + return; + } + result[key] = this._getBlockTag(filter[key]); + }); + return this.formatter.filter(yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])(result)); + }); + } + call(transaction, blockTag) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + transaction: this._getTransactionRequest(transaction), + blockTag: this._getBlockTag(blockTag) + }); + const result = yield this.perform("call", params); + try { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexlify"])(result); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "call", + params, result, error + }); + } + }); + } + estimateGas(transaction) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ + transaction: this._getTransactionRequest(transaction) + }); + const result = yield this.perform("estimateGas", params); + try { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(result); + } + catch (error) { + return logger.throwError("bad result from backend", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.SERVER_ERROR, { + method: "estimateGas", + params, result, error + }); + } + }); + } + _getAddress(addressOrName) { + return __awaiter(this, void 0, void 0, function* () { + const address = yield this.resolveName(addressOrName); + if (address == null) { + logger.throwError("ENS name not configured", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: `resolveName(${JSON.stringify(addressOrName)})` + }); + } + return address; + }); + } + _getBlock(blockHashOrBlockTag, includeTransactions) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + blockHashOrBlockTag = yield blockHashOrBlockTag; + // If blockTag is a number (not "latest", etc), this is the block number + let blockNumber = -128; + const params = { + includeTransactions: !!includeTransactions + }; + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["isHexString"])(blockHashOrBlockTag, 32)) { + params.blockHash = blockHashOrBlockTag; + } + else { + try { + params.blockTag = this.formatter.blockTag(yield this._getBlockTag(blockHashOrBlockTag)); + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["isHexString"])(params.blockTag)) { + blockNumber = parseInt(params.blockTag.substring(2), 16); + } + } + catch (error) { + logger.throwArgumentError("invalid block hash or block tag", "blockHashOrBlockTag", blockHashOrBlockTag); + } + } + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_10__["poll"])(() => __awaiter(this, void 0, void 0, function* () { + const block = yield this.perform("getBlock", params); + // Block was not found + if (block == null) { + // For blockhashes, if we didn't say it existed, that blockhash may + // not exist. If we did see it though, perhaps from a log, we know + // it exists, and this node is just not caught up yet. + if (params.blockHash != null) { + if (this._emitted["b:" + params.blockHash] == null) { + return null; + } + } + // For block tags, if we are asking for a future block, we return null + if (params.blockTag != null) { + if (blockNumber > this._emitted.block) { + return null; + } + } + // Retry on the next block + return undefined; + } + // Add transactions + if (includeTransactions) { + let blockNumber = null; + for (let i = 0; i < block.transactions.length; i++) { + const tx = block.transactions[i]; + if (tx.blockNumber == null) { + tx.confirmations = 0; + } + else if (tx.confirmations == null) { + if (blockNumber == null) { + blockNumber = yield this._getInternalBlockNumber(100 + 2 * this.pollingInterval); + } + // Add the confirmations using the fast block number (pessimistic) + let confirmations = (blockNumber - tx.blockNumber) + 1; + if (confirmations <= 0) { + confirmations = 1; + } + tx.confirmations = confirmations; + } + } + return this.formatter.blockWithTransactions(block); + } + return this.formatter.block(block); + }), { oncePoll: this }); + }); + } + getBlock(blockHashOrBlockTag) { + return (this._getBlock(blockHashOrBlockTag, false)); + } + getBlockWithTransactions(blockHashOrBlockTag) { + return (this._getBlock(blockHashOrBlockTag, true)); + } + getTransaction(transactionHash) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + transactionHash = yield transactionHash; + const params = { transactionHash: this.formatter.hash(transactionHash, true) }; + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_10__["poll"])(() => __awaiter(this, void 0, void 0, function* () { + const result = yield this.perform("getTransaction", params); + if (result == null) { + if (this._emitted["t:" + transactionHash] == null) { + return null; + } + return undefined; + } + const tx = this.formatter.transactionResponse(result); + if (tx.blockNumber == null) { + tx.confirmations = 0; + } + else if (tx.confirmations == null) { + const blockNumber = yield this._getInternalBlockNumber(100 + 2 * this.pollingInterval); + // Add the confirmations using the fast block number (pessimistic) + let confirmations = (blockNumber - tx.blockNumber) + 1; + if (confirmations <= 0) { + confirmations = 1; + } + tx.confirmations = confirmations; + } + return this._wrapTransaction(tx); + }), { oncePoll: this }); + }); + } + getTransactionReceipt(transactionHash) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + transactionHash = yield transactionHash; + const params = { transactionHash: this.formatter.hash(transactionHash, true) }; + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_10__["poll"])(() => __awaiter(this, void 0, void 0, function* () { + const result = yield this.perform("getTransactionReceipt", params); + if (result == null) { + if (this._emitted["t:" + transactionHash] == null) { + return null; + } + return undefined; + } + // "geth-etc" returns receipts before they are ready + if (result.blockHash == null) { + return undefined; + } + const receipt = this.formatter.receipt(result); + if (receipt.blockNumber == null) { + receipt.confirmations = 0; + } + else if (receipt.confirmations == null) { + const blockNumber = yield this._getInternalBlockNumber(100 + 2 * this.pollingInterval); + // Add the confirmations using the fast block number (pessimistic) + let confirmations = (blockNumber - receipt.blockNumber) + 1; + if (confirmations <= 0) { + confirmations = 1; + } + receipt.confirmations = confirmations; + } + return receipt; + }), { oncePoll: this }); + }); + } + getLogs(filter) { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + const params = yield Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])({ filter: this._getFilter(filter) }); + const logs = yield this.perform("getLogs", params); + logs.forEach((log) => { + if (log.removed == null) { + log.removed = false; + } + }); + return _formatter__WEBPACK_IMPORTED_MODULE_14__["Formatter"].arrayOf(this.formatter.filterLog.bind(this.formatter))(logs); + }); + } + getEtherPrice() { + return __awaiter(this, void 0, void 0, function* () { + yield this.getNetwork(); + return this.perform("getEtherPrice", {}); + }); + } + _getBlockTag(blockTag) { + return __awaiter(this, void 0, void 0, function* () { + blockTag = yield blockTag; + if (typeof (blockTag) === "number" && blockTag < 0) { + if (blockTag % 1) { + logger.throwArgumentError("invalid BlockTag", "blockTag", blockTag); + } + let blockNumber = yield this._getInternalBlockNumber(100 + 2 * this.pollingInterval); + blockNumber += blockTag; + if (blockNumber < 0) { + blockNumber = 0; + } + return this.formatter.blockTag(blockNumber); + } + return this.formatter.blockTag(blockTag); + }); + } + getResolver(name) { + return __awaiter(this, void 0, void 0, function* () { + const address = yield this._getResolver(name); + if (address == null) { + return null; + } + return new Resolver(this, address, name); + }); + } + _getResolver(name) { + return __awaiter(this, void 0, void 0, function* () { + // Get the resolver from the blockchain + const network = yield this.getNetwork(); + // No ENS... + if (!network.ensAddress) { + logger.throwError("network does not support ENS", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: "ENS", network: network.name }); + } + // keccak256("resolver(bytes32)") + const transaction = { + to: network.ensAddress, + data: ("0x0178b8bf" + Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["namehash"])(name).substring(2)) + }; + return this.formatter.callAddress(yield this.call(transaction)); + }); + } + resolveName(name) { + return __awaiter(this, void 0, void 0, function* () { + name = yield name; + // If it is already an address, nothing to resolve + try { + return Promise.resolve(this.formatter.address(name)); + } + catch (error) { + // If is is a hexstring, the address is bad (See #694) + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["isHexString"])(name)) { + throw error; + } + } + if (typeof (name) !== "string") { + logger.throwArgumentError("invalid ENS name", "name", name); + } + // Get the addr from the resovler + const resolver = yield this.getResolver(name); + if (!resolver) { + return null; + } + return yield resolver.getAddress(); + }); + } + lookupAddress(address) { + return __awaiter(this, void 0, void 0, function* () { + address = yield address; + address = this.formatter.address(address); + const reverseName = address.substring(2).toLowerCase() + ".addr.reverse"; + const resolverAddress = yield this._getResolver(reverseName); + if (!resolverAddress) { + return null; + } + // keccak("name(bytes32)") + let bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(yield this.call({ + to: resolverAddress, + data: ("0x691f3431" + Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["namehash"])(reverseName).substring(2)) + })); + // Strip off the dynamic string pointer (0x20) + if (bytes.length < 32 || !_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(bytes.slice(0, 32)).eq(32)) { + return null; + } + bytes = bytes.slice(32); + // Not a length-prefixed string + if (bytes.length < 32) { + return null; + } + // Get the length of the string (from the length-prefix) + const length = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_2__["BigNumber"].from(bytes.slice(0, 32)).toNumber(); + bytes = bytes.slice(32); + // Length longer than available data + if (length > bytes.length) { + return null; + } + const name = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_9__["toUtf8String"])(bytes.slice(0, length)); + // Make sure the reverse record matches the foward record + const addr = yield this.resolveName(name); + if (addr != address) { + return null; + } + return name; + }); + } + perform(method, params) { + return logger.throwError(method + " not implemented", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.NOT_IMPLEMENTED, { operation: method }); + } + _startEvent(event) { + this.polling = (this._events.filter((e) => e.pollable()).length > 0); + } + _stopEvent(event) { + this.polling = (this._events.filter((e) => e.pollable()).length > 0); + } + _addEventListener(eventName, listener, once) { + const event = new Event(getEventTag(eventName), listener, once); + this._events.push(event); + this._startEvent(event); + return this; + } + on(eventName, listener) { + return this._addEventListener(eventName, listener, false); + } + once(eventName, listener) { + return this._addEventListener(eventName, listener, true); + } + emit(eventName, ...args) { + let result = false; + let stopped = []; + let eventTag = getEventTag(eventName); + this._events = this._events.filter((event) => { + if (event.tag !== eventTag) { + return true; + } + setTimeout(() => { + event.listener.apply(this, args); + }, 0); + result = true; + if (event.once) { + stopped.push(event); + return false; + } + return true; + }); + stopped.forEach((event) => { this._stopEvent(event); }); + return result; + } + listenerCount(eventName) { + if (!eventName) { + return this._events.length; + } + let eventTag = getEventTag(eventName); + return this._events.filter((event) => { + return (event.tag === eventTag); + }).length; + } + listeners(eventName) { + if (eventName == null) { + return this._events.map((event) => event.listener); + } + let eventTag = getEventTag(eventName); + return this._events + .filter((event) => (event.tag === eventTag)) + .map((event) => event.listener); + } + off(eventName, listener) { + if (listener == null) { + return this.removeAllListeners(eventName); + } + const stopped = []; + let found = false; + let eventTag = getEventTag(eventName); + this._events = this._events.filter((event) => { + if (event.tag !== eventTag || event.listener != listener) { + return true; + } + if (found) { + return true; + } + found = true; + stopped.push(event); + return false; + }); + stopped.forEach((event) => { this._stopEvent(event); }); + return this; + } + removeAllListeners(eventName) { + let stopped = []; + if (eventName == null) { + stopped = this._events; + this._events = []; + } + else { + const eventTag = getEventTag(eventName); + this._events = this._events.filter((event) => { + if (event.tag !== eventTag) { + return true; + } + stopped.push(event); + return false; + }); + } + stopped.forEach((event) => { this._stopEvent(event); }); + return this; + } +} +//# sourceMappingURL=base-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/cloudflare-provider.js": +/*!******************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/cloudflare-provider.js ***! + \******************************************************************************/ +/*! exports provided: CloudflareProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CloudflareProvider", function() { return CloudflareProvider; }); +/* harmony import */ var _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./url-json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +class CloudflareProvider extends _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_0__["UrlJsonRpcProvider"] { + static getApiKey(apiKey) { + if (apiKey != null) { + logger.throwArgumentError("apiKey not supported for cloudflare", "apiKey", apiKey); + } + return null; + } + static getUrl(network, apiKey) { + let host = null; + switch (network.name) { + case "homestead": + host = "https://cloudflare-eth.com/"; + break; + default: + logger.throwArgumentError("unsupported network", "network", arguments[0]); + } + return host; + } + perform(method, params) { + const _super = Object.create(null, { + perform: { get: () => super.perform } + }); + return __awaiter(this, void 0, void 0, function* () { + // The Cloudflare provider does not support eth_blockNumber, + // so we get the latest block and pull it from that + if (method === "getBlockNumber") { + const block = yield _super.perform.call(this, "getBlock", { blockTag: "latest" }); + return block.number; + } + return _super.perform.call(this, method, params); + }); + } +} +//# sourceMappingURL=cloudflare-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/etherscan-provider.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/etherscan-provider.js ***! + \*****************************************************************************/ +/*! exports provided: EtherscanProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EtherscanProvider", function() { return EtherscanProvider; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_web__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/web */ "./node_modules/@ethersproject/web/lib.esm/index.js"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./formatter */ "./node_modules/@ethersproject/providers/lib.esm/formatter.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _base_provider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base-provider */ "./node_modules/@ethersproject/providers/lib.esm/base-provider.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"](_version__WEBPACK_IMPORTED_MODULE_5__["version"]); + +// The transaction has already been sanitized by the calls in Provider +function getTransactionPostData(transaction) { + const result = {}; + for (let key in transaction) { + if (transaction[key] == null) { + continue; + } + let value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(transaction[key]); + // Quantity-types require no leading zero, unless 0 + if ({ gasLimit: true, gasPrice: true, nonce: true, value: true }[key]) { + value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexValue"])(value); + } + result[key] = value; + } + return result; +} +function getResult(result) { + // getLogs, getHistory have weird success responses + if (result.status == 0 && (result.message === "No records found" || result.message === "No transactions found")) { + return result.result; + } + if (result.status != 1 || result.message != "OK") { + const error = new Error("invalid response"); + error.result = JSON.stringify(result); + if ((result.result || "").toLowerCase().indexOf("rate limit") >= 0) { + error.throttleRetry = true; + } + throw error; + } + return result.result; +} +function getJsonResult(result) { + // This response indicates we are being throttled + if (result && result.status == 0 && result.message == "NOTOK" && (result.result || "").toLowerCase().indexOf("rate limit") >= 0) { + const error = new Error("throttled response"); + error.result = JSON.stringify(result); + error.throttleRetry = true; + throw error; + } + if (result.jsonrpc != "2.0") { + // @TODO: not any + const error = new Error("invalid response"); + error.result = JSON.stringify(result); + throw error; + } + if (result.error) { + // @TODO: not any + const error = new Error(result.error.message || "unknown error"); + if (result.error.code) { + error.code = result.error.code; + } + if (result.error.data) { + error.data = result.error.data; + } + throw error; + } + return result.result; +} +// The blockTag was normalized as a string by the Provider pre-perform operations +function checkLogTag(blockTag) { + if (blockTag === "pending") { + throw new Error("pending not supported"); + } + if (blockTag === "latest") { + return blockTag; + } + return parseInt(blockTag.substring(2), 16); +} +const defaultApiKey = "9D13ZE7XSBTJ94N9BNJ2MA33VMAY2YPIRB"; +function checkError(method, error, transaction) { + // Undo the "convenience" some nodes are attempting to prevent backwards + // incompatibility; maybe for v6 consider forwarding reverts as errors + if (method === "call" && error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR) { + const e = error.error; + if (e && e.message.match("reverted") && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isHexString"])(e.data)) { + return e.data; + } + } + // Get the message from any nested error structure + let message = error.message; + if (error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR) { + if (error.error && typeof (error.error.message) === "string") { + message = error.error.message; + } + else if (typeof (error.body) === "string") { + message = error.body; + } + else if (typeof (error.responseText) === "string") { + message = error.responseText; + } + } + message = (message || "").toLowerCase(); + // "Insufficient funds. The account you tried to send transaction from does not have enough funds. Required 21464000000000 and got: 0" + if (message.match(/insufficient funds/)) { + logger.throwError("insufficient funds for intrinsic transaction cost", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.INSUFFICIENT_FUNDS, { + error, method, transaction + }); + } + // "Transaction with the same hash was already imported." + if (message.match(/same hash was already imported|transaction nonce is too low/)) { + logger.throwError("nonce has already been used", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.NONCE_EXPIRED, { + error, method, transaction + }); + } + // "Transaction gas price is too low. There is another transaction with same nonce in the queue. Try increasing the gas price or incrementing the nonce." + if (message.match(/another transaction with same nonce/)) { + logger.throwError("replacement fee too low", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.REPLACEMENT_UNDERPRICED, { + error, method, transaction + }); + } + if (message.match(/execution failed due to an exception/)) { + logger.throwError("cannot estimate gas; transaction may fail or may require manual gas limit", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNPREDICTABLE_GAS_LIMIT, { + error, method, transaction + }); + } + throw error; +} +class EtherscanProvider extends _base_provider__WEBPACK_IMPORTED_MODULE_6__["BaseProvider"] { + constructor(network, apiKey) { + logger.checkNew(new.target, EtherscanProvider); + super(network); + let name = "invalid"; + if (this.network) { + name = this.network.name; + } + let baseUrl = null; + switch (name) { + case "homestead": + baseUrl = "https://api.etherscan.io"; + break; + case "ropsten": + baseUrl = "https://api-ropsten.etherscan.io"; + break; + case "rinkeby": + baseUrl = "https://api-rinkeby.etherscan.io"; + break; + case "kovan": + baseUrl = "https://api-kovan.etherscan.io"; + break; + case "goerli": + baseUrl = "https://api-goerli.etherscan.io"; + break; + default: + throw new Error("unsupported network"); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "baseUrl", baseUrl); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "apiKey", apiKey || defaultApiKey); + } + detectNetwork() { + return __awaiter(this, void 0, void 0, function* () { + return this.network; + }); + } + perform(method, params) { + const _super = Object.create(null, { + perform: { get: () => super.perform } + }); + return __awaiter(this, void 0, void 0, function* () { + let url = this.baseUrl + "/api"; + let apiKey = ""; + if (this.apiKey) { + apiKey += "&apikey=" + this.apiKey; + } + const get = (url, payload, procFunc) => __awaiter(this, void 0, void 0, function* () { + this.emit("debug", { + action: "request", + request: url, + provider: this + }); + const connection = { + url: url, + throttleSlotInterval: 1000, + throttleCallback: (attempt, url) => { + if (this.isCommunityResource()) { + Object(_formatter__WEBPACK_IMPORTED_MODULE_3__["showThrottleMessage"])(); + } + return Promise.resolve(true); + } + }; + let payloadStr = null; + if (payload) { + connection.headers = { "content-type": "application/x-www-form-urlencoded; charset=UTF-8" }; + payloadStr = Object.keys(payload).map((key) => { + return `${key}=${payload[key]}`; + }).join("&"); + } + const result = yield Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_2__["fetchJson"])(connection, payloadStr, procFunc || getJsonResult); + this.emit("debug", { + action: "response", + request: url, + response: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["deepCopy"])(result), + provider: this + }); + return result; + }); + switch (method) { + case "getBlockNumber": + url += "?module=proxy&action=eth_blockNumber" + apiKey; + return get(url, null); + case "getGasPrice": + url += "?module=proxy&action=eth_gasPrice" + apiKey; + return get(url, null); + case "getBalance": + // Returns base-10 result + url += "?module=account&action=balance&address=" + params.address; + url += "&tag=" + params.blockTag + apiKey; + return get(url, null, getResult); + case "getTransactionCount": + url += "?module=proxy&action=eth_getTransactionCount&address=" + params.address; + url += "&tag=" + params.blockTag + apiKey; + return get(url, null); + case "getCode": + url += "?module=proxy&action=eth_getCode&address=" + params.address; + url += "&tag=" + params.blockTag + apiKey; + return get(url, null); + case "getStorageAt": + url += "?module=proxy&action=eth_getStorageAt&address=" + params.address; + url += "&position=" + params.position; + url += "&tag=" + params.blockTag + apiKey; + return get(url, null); + case "sendTransaction": + return get(url, { + module: "proxy", + action: "eth_sendRawTransaction", + hex: params.signedTransaction, + apikey: this.apiKey + }).catch((error) => { + return checkError("sendTransaction", error, params.signedTransaction); + }); + case "getBlock": + if (params.blockTag) { + url += "?module=proxy&action=eth_getBlockByNumber&tag=" + params.blockTag; + if (params.includeTransactions) { + url += "&boolean=true"; + } + else { + url += "&boolean=false"; + } + url += apiKey; + return get(url, null); + } + throw new Error("getBlock by blockHash not implemented"); + case "getTransaction": + url += "?module=proxy&action=eth_getTransactionByHash&txhash=" + params.transactionHash; + url += apiKey; + return get(url, null); + case "getTransactionReceipt": + url += "?module=proxy&action=eth_getTransactionReceipt&txhash=" + params.transactionHash; + url += apiKey; + return get(url, null); + case "call": { + if (params.blockTag !== "latest") { + throw new Error("EtherscanProvider does not support blockTag for call"); + } + const postData = getTransactionPostData(params.transaction); + postData.module = "proxy"; + postData.action = "eth_call"; + postData.apikey = this.apiKey; + try { + return yield get(url, postData); + } + catch (error) { + return checkError("call", error, params.transaction); + } + } + case "estimateGas": { + const postData = getTransactionPostData(params.transaction); + postData.module = "proxy"; + postData.action = "eth_estimateGas"; + postData.apikey = this.apiKey; + try { + return yield get(url, postData); + } + catch (error) { + return checkError("estimateGas", error, params.transaction); + } + } + case "getLogs": { + url += "?module=logs&action=getLogs"; + if (params.filter.fromBlock) { + url += "&fromBlock=" + checkLogTag(params.filter.fromBlock); + } + if (params.filter.toBlock) { + url += "&toBlock=" + checkLogTag(params.filter.toBlock); + } + if (params.filter.address) { + url += "&address=" + params.filter.address; + } + // @TODO: We can handle slightly more complicated logs using the logs API + if (params.filter.topics && params.filter.topics.length > 0) { + if (params.filter.topics.length > 1) { + logger.throwError("unsupported topic count", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNSUPPORTED_OPERATION, { topics: params.filter.topics }); + } + if (params.filter.topics.length === 1) { + const topic0 = params.filter.topics[0]; + if (typeof (topic0) !== "string" || topic0.length !== 66) { + logger.throwError("unsupported topic format", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNSUPPORTED_OPERATION, { topic0: topic0 }); + } + url += "&topic0=" + topic0; + } + } + url += apiKey; + const logs = yield get(url, null, getResult); + // Cache txHash => blockHash + let blocks = {}; + // Add any missing blockHash to the logs + for (let i = 0; i < logs.length; i++) { + const log = logs[i]; + if (log.blockHash != null) { + continue; + } + if (blocks[log.blockNumber] == null) { + const block = yield this.getBlock(log.blockNumber); + if (block) { + blocks[log.blockNumber] = block.hash; + } + } + log.blockHash = blocks[log.blockNumber]; + } + return logs; + } + case "getEtherPrice": + if (this.network.name !== "homestead") { + return 0.0; + } + url += "?module=stats&action=ethprice"; + url += apiKey; + return parseFloat((yield get(url, null, getResult)).ethusd); + default: + break; + } + return _super.perform.call(this, method, params); + }); + } + // @TODO: Allow startBlock and endBlock to be Promises + getHistory(addressOrName, startBlock, endBlock) { + let url = this.baseUrl; + let apiKey = ""; + if (this.apiKey) { + apiKey += "&apikey=" + this.apiKey; + } + if (startBlock == null) { + startBlock = 0; + } + if (endBlock == null) { + endBlock = 99999999; + } + return this.resolveName(addressOrName).then((address) => { + url += "/api?module=account&action=txlist&address=" + address; + url += "&startblock=" + startBlock; + url += "&endblock=" + endBlock; + url += "&sort=asc" + apiKey; + this.emit("debug", { + action: "request", + request: url, + provider: this + }); + const connection = { + url: url, + throttleSlotInterval: 1000, + throttleCallback: (attempt, url) => { + if (this.apiKey === defaultApiKey) { + Object(_formatter__WEBPACK_IMPORTED_MODULE_3__["showThrottleMessage"])(); + } + return Promise.resolve(true); + } + }; + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_2__["fetchJson"])(connection, null, getResult).then((result) => { + this.emit("debug", { + action: "response", + request: url, + response: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["deepCopy"])(result), + provider: this + }); + let output = []; + result.forEach((tx) => { + ["contractAddress", "to"].forEach(function (key) { + if (tx[key] == "") { + delete tx[key]; + } + }); + if (tx.creates == null && tx.contractAddress != null) { + tx.creates = tx.contractAddress; + } + let item = this.formatter.transactionResponse(tx); + if (tx.timeStamp) { + item.timestamp = parseInt(tx.timeStamp); + } + output.push(item); + }); + return output; + }); + }); + } + isCommunityResource() { + return (this.apiKey === defaultApiKey); + } +} +//# sourceMappingURL=etherscan-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/fallback-provider.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/fallback-provider.js ***! + \****************************************************************************/ +/*! exports provided: FallbackProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FallbackProvider", function() { return FallbackProvider; }); +/* harmony import */ var _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/abstract-provider */ "./node_modules/@ethersproject/abstract-provider/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_random__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/random */ "./node_modules/@ethersproject/random/lib.esm/index.js"); +/* harmony import */ var _ethersproject_web__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/web */ "./node_modules/@ethersproject/web/lib.esm/index.js"); +/* harmony import */ var _base_provider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base-provider */ "./node_modules/@ethersproject/providers/lib.esm/base-provider.js"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./formatter */ "./node_modules/@ethersproject/providers/lib.esm/formatter.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"](_version__WEBPACK_IMPORTED_MODULE_9__["version"]); +function now() { return (new Date()).getTime(); } +// Returns to network as long as all agree, or null if any is null. +// Throws an error if any two networks do not match. +function checkNetworks(networks) { + let result = null; + for (let i = 0; i < networks.length; i++) { + const network = networks[i]; + // Null! We do not know our network; bail. + if (network == null) { + return null; + } + if (result) { + // Make sure the network matches the previous networks + if (!(result.name === network.name && result.chainId === network.chainId && + ((result.ensAddress === network.ensAddress) || (result.ensAddress == null && network.ensAddress == null)))) { + logger.throwArgumentError("provider mismatch", "networks", networks); + } + } + else { + result = network; + } + } + return result; +} +function median(values, maxDelta) { + values = values.slice().sort(); + const middle = Math.floor(values.length / 2); + // Odd length; take the middle + if (values.length % 2) { + return values[middle]; + } + // Even length; take the average of the two middle + const a = values[middle - 1], b = values[middle]; + if (maxDelta != null && Math.abs(a - b) > maxDelta) { + return null; + } + return (a + b) / 2; +} +function serialize(value) { + if (value === null) { + return "null"; + } + else if (typeof (value) === "number" || typeof (value) === "boolean") { + return JSON.stringify(value); + } + else if (typeof (value) === "string") { + return value; + } + else if (_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].isBigNumber(value)) { + return value.toString(); + } + else if (Array.isArray(value)) { + return JSON.stringify(value.map((i) => serialize(i))); + } + else if (typeof (value) === "object") { + const keys = Object.keys(value); + keys.sort(); + return "{" + keys.map((key) => { + let v = value[key]; + if (typeof (v) === "function") { + v = "[function]"; + } + else { + v = serialize(v); + } + return JSON.stringify(key) + ":" + v; + }).join(",") + "}"; + } + throw new Error("unknown value type: " + typeof (value)); +} +// Next request ID to use for emitting debug info +let nextRid = 1; +; +function stall(duration) { + let cancel = null; + let timer = null; + let promise = (new Promise((resolve) => { + cancel = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + resolve(); + }; + timer = setTimeout(cancel, duration); + })); + const wait = (func) => { + promise = promise.then(func); + return promise; + }; + function getPromise() { + return promise; + } + return { cancel, getPromise, wait }; +} +const ForwardErrors = [ + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.CALL_EXCEPTION, + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.INSUFFICIENT_FUNDS, + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.NONCE_EXPIRED, + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.REPLACEMENT_UNDERPRICED, + _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.UNPREDICTABLE_GAS_LIMIT +]; +const ForwardProperties = [ + "address", + "args", + "errorArgs", + "errorSignature", + "method", + "transaction", +]; +; +function exposeDebugConfig(config, now) { + const result = { + weight: config.weight + }; + Object.defineProperty(result, "provider", { get: () => config.provider }); + if (config.start) { + result.start = config.start; + } + if (now) { + result.duration = (now - config.start); + } + if (config.done) { + if (config.error) { + result.error = config.error; + } + else { + result.result = config.result || null; + } + } + return result; +} +function normalizedTally(normalize, quorum) { + return function (configs) { + // Count the votes for each result + const tally = {}; + configs.forEach((c) => { + const value = normalize(c.result); + if (!tally[value]) { + tally[value] = { count: 0, result: c.result }; + } + tally[value].count++; + }); + // Check for a quorum on any given result + const keys = Object.keys(tally); + for (let i = 0; i < keys.length; i++) { + const check = tally[keys[i]]; + if (check.count >= quorum) { + return check.result; + } + } + // No quroum + return undefined; + }; +} +function getProcessFunc(provider, method, params) { + let normalize = serialize; + switch (method) { + case "getBlockNumber": + // Return the median value, unless there is (median + 1) is also + // present, in which case that is probably true and the median + // is going to be stale soon. In the event of a malicious node, + // the lie will be true soon enough. + return function (configs) { + const values = configs.map((c) => c.result); + // Get the median block number + let blockNumber = median(configs.map((c) => c.result), 2); + if (blockNumber == null) { + return undefined; + } + blockNumber = Math.ceil(blockNumber); + // If the next block height is present, its prolly safe to use + if (values.indexOf(blockNumber + 1) >= 0) { + blockNumber++; + } + // Don't ever roll back the blockNumber + if (blockNumber >= provider._highestBlockNumber) { + provider._highestBlockNumber = blockNumber; + } + return provider._highestBlockNumber; + }; + case "getGasPrice": + // Return the middle (round index up) value, similar to median + // but do not average even entries and choose the higher. + // Malicious actors must compromise 50% of the nodes to lie. + return function (configs) { + const values = configs.map((c) => c.result); + values.sort(); + return values[Math.floor(values.length / 2)]; + }; + case "getEtherPrice": + // Returns the median price. Malicious actors must compromise at + // least 50% of the nodes to lie (in a meaningful way). + return function (configs) { + return median(configs.map((c) => c.result)); + }; + // No additional normalizing required; serialize is enough + case "getBalance": + case "getTransactionCount": + case "getCode": + case "getStorageAt": + case "call": + case "estimateGas": + case "getLogs": + break; + // We drop the confirmations from transactions as it is approximate + case "getTransaction": + case "getTransactionReceipt": + normalize = function (tx) { + if (tx == null) { + return null; + } + tx = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["shallowCopy"])(tx); + tx.confirmations = -1; + return serialize(tx); + }; + break; + // We drop the confirmations from transactions as it is approximate + case "getBlock": + // We drop the confirmations from transactions as it is approximate + if (params.includeTransactions) { + normalize = function (block) { + if (block == null) { + return null; + } + block = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["shallowCopy"])(block); + block.transactions = block.transactions.map((tx) => { + tx = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["shallowCopy"])(tx); + tx.confirmations = -1; + return tx; + }); + return serialize(block); + }; + } + else { + normalize = function (block) { + if (block == null) { + return null; + } + return serialize(block); + }; + } + break; + default: + throw new Error("unknown method: " + method); + } + // Return the result if and only if the expected quorum is + // satisfied and agreed upon for the final result. + return normalizedTally(normalize, provider.quorum); +} +// If we are doing a blockTag query, we need to make sure the backend is +// caught up to the FallbackProvider, before sending a request to it. +function waitForSync(config, blockNumber) { + return __awaiter(this, void 0, void 0, function* () { + const provider = (config.provider); + if ((provider.blockNumber != null && provider.blockNumber >= blockNumber) || blockNumber === -1) { + return provider; + } + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_5__["poll"])(() => { + return new Promise((resolve, reject) => { + setTimeout(function () { + // We are synced + if (provider.blockNumber >= blockNumber) { + return resolve(provider); + } + // We're done; just quit + if (config.cancelled) { + return resolve(null); + } + // Try again, next block + return resolve(undefined); + }, 0); + }); + }, { oncePoll: provider }); + }); +} +function getRunner(config, currentBlockNumber, method, params) { + return __awaiter(this, void 0, void 0, function* () { + let provider = config.provider; + switch (method) { + case "getBlockNumber": + case "getGasPrice": + return provider[method](); + case "getEtherPrice": + if (provider.getEtherPrice) { + return provider.getEtherPrice(); + } + break; + case "getBalance": + case "getTransactionCount": + case "getCode": + if (params.blockTag && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(params.blockTag)) { + provider = yield waitForSync(config, currentBlockNumber); + } + return provider[method](params.address, params.blockTag || "latest"); + case "getStorageAt": + if (params.blockTag && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(params.blockTag)) { + provider = yield waitForSync(config, currentBlockNumber); + } + return provider.getStorageAt(params.address, params.position, params.blockTag || "latest"); + case "getBlock": + if (params.blockTag && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(params.blockTag)) { + provider = yield waitForSync(config, currentBlockNumber); + } + return provider[(params.includeTransactions ? "getBlockWithTransactions" : "getBlock")](params.blockTag || params.blockHash); + case "call": + case "estimateGas": + if (params.blockTag && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(params.blockTag)) { + provider = yield waitForSync(config, currentBlockNumber); + } + return provider[method](params.transaction); + case "getTransaction": + case "getTransactionReceipt": + return provider[method](params.transactionHash); + case "getLogs": { + let filter = params.filter; + if ((filter.fromBlock && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(filter.fromBlock)) || (filter.toBlock && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(filter.toBlock))) { + provider = yield waitForSync(config, currentBlockNumber); + } + return provider.getLogs(filter); + } + } + return logger.throwError("unknown method error", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.UNKNOWN_ERROR, { + method: method, + params: params + }); + }); +} +class FallbackProvider extends _base_provider__WEBPACK_IMPORTED_MODULE_6__["BaseProvider"] { + constructor(providers, quorum) { + logger.checkNew(new.target, FallbackProvider); + if (providers.length === 0) { + logger.throwArgumentError("missing providers", "providers", providers); + } + const providerConfigs = providers.map((configOrProvider, index) => { + if (_ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__["Provider"].isProvider(configOrProvider)) { + const stallTimeout = Object(_formatter__WEBPACK_IMPORTED_MODULE_7__["isCommunityResource"])(configOrProvider) ? 2000 : 750; + const priority = 1; + return Object.freeze({ provider: configOrProvider, weight: 1, stallTimeout, priority }); + } + const config = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["shallowCopy"])(configOrProvider); + if (config.priority == null) { + config.priority = 1; + } + if (config.stallTimeout == null) { + config.stallTimeout = Object(_formatter__WEBPACK_IMPORTED_MODULE_7__["isCommunityResource"])(configOrProvider) ? 2000 : 750; + } + if (config.weight == null) { + config.weight = 1; + } + const weight = config.weight; + if (weight % 1 || weight > 512 || weight < 1) { + logger.throwArgumentError("invalid weight; must be integer in [1, 512]", `providers[${index}].weight`, weight); + } + return Object.freeze(config); + }); + const total = providerConfigs.reduce((accum, c) => (accum + c.weight), 0); + if (quorum == null) { + quorum = total / 2; + } + else if (quorum > total) { + logger.throwArgumentError("quorum will always fail; larger than total weight", "quorum", quorum); + } + // Are all providers' networks are known + let networkOrReady = checkNetworks(providerConfigs.map((c) => (c.provider).network)); + // Not all networks are known; we must stall + if (networkOrReady == null) { + networkOrReady = new Promise((resolve, reject) => { + setTimeout(() => { + this.detectNetwork().then(resolve, reject); + }, 0); + }); + } + super(networkOrReady); + // Preserve a copy, so we do not get mutated + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["defineReadOnly"])(this, "providerConfigs", Object.freeze(providerConfigs)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["defineReadOnly"])(this, "quorum", quorum); + this._highestBlockNumber = -1; + } + detectNetwork() { + return __awaiter(this, void 0, void 0, function* () { + const networks = yield Promise.all(this.providerConfigs.map((c) => c.provider.getNetwork())); + return checkNetworks(networks); + }); + } + perform(method, params) { + return __awaiter(this, void 0, void 0, function* () { + // Sending transactions is special; always broadcast it to all backends + if (method === "sendTransaction") { + const results = yield Promise.all(this.providerConfigs.map((c) => { + return c.provider.sendTransaction(params.signedTransaction).then((result) => { + return result.hash; + }, (error) => { + return error; + }); + })); + // Any success is good enough (other errors are likely "already seen" errors + for (let i = 0; i < results.length; i++) { + const result = results[i]; + if (typeof (result) === "string") { + return result; + } + } + // They were all an error; pick the first error + throw results[0]; + } + // We need to make sure we are in sync with our backends, so we need + // to know this before we can make a lot of calls + if (this._highestBlockNumber === -1 && method !== "getBlockNumber") { + yield this.getBlockNumber(); + } + const processFunc = getProcessFunc(this, method, params); + // Shuffle the providers and then sort them by their priority; we + // shallowCopy them since we will store the result in them too + const configs = Object(_ethersproject_random__WEBPACK_IMPORTED_MODULE_4__["shuffled"])(this.providerConfigs.map(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["shallowCopy"])); + configs.sort((a, b) => (a.priority - b.priority)); + const currentBlockNumber = this._highestBlockNumber; + let i = 0; + let first = true; + while (true) { + const t0 = now(); + // Compute the inflight weight (exclude anything past) + let inflightWeight = configs.filter((c) => (c.runner && ((t0 - c.start) < c.stallTimeout))) + .reduce((accum, c) => (accum + c.weight), 0); + // Start running enough to meet quorum + while (inflightWeight < this.quorum && i < configs.length) { + const config = configs[i++]; + const rid = nextRid++; + config.start = now(); + config.staller = stall(config.stallTimeout); + config.staller.wait(() => { config.staller = null; }); + config.runner = getRunner(config, currentBlockNumber, method, params).then((result) => { + config.done = true; + config.result = result; + if (this.listenerCount("debug")) { + this.emit("debug", { + action: "request", + rid: rid, + backend: exposeDebugConfig(config, now()), + request: { method: method, params: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["deepCopy"])(params) }, + provider: this + }); + } + }, (error) => { + config.done = true; + config.error = error; + if (this.listenerCount("debug")) { + this.emit("debug", { + action: "request", + rid: rid, + backend: exposeDebugConfig(config, now()), + request: { method: method, params: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["deepCopy"])(params) }, + provider: this + }); + } + }); + if (this.listenerCount("debug")) { + this.emit("debug", { + action: "request", + rid: rid, + backend: exposeDebugConfig(config, null), + request: { method: method, params: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_3__["deepCopy"])(params) }, + provider: this + }); + } + inflightWeight += config.weight; + } + // Wait for anything meaningful to finish or stall out + const waiting = []; + configs.forEach((c) => { + if (c.done || !c.runner) { + return; + } + waiting.push(c.runner); + if (c.staller) { + waiting.push(c.staller.getPromise()); + } + }); + if (waiting.length) { + yield Promise.race(waiting); + } + // Check the quorum and process the results; the process function + // may additionally decide the quorum is not met + const results = configs.filter((c) => (c.done && c.error == null)); + if (results.length >= this.quorum) { + const result = processFunc(results); + if (result !== undefined) { + // Shut down any stallers + configs.forEach(c => { + if (c.staller) { + c.staller.cancel(); + } + c.cancelled = true; + }); + return result; + } + if (!first) { + yield stall(100).getPromise(); + } + first = false; + } + // No result, check for errors that should be forwarded + const errors = configs.reduce((accum, c) => { + if (!c.done || c.error == null) { + return accum; + } + const code = (c.error).code; + if (ForwardErrors.indexOf(code) >= 0) { + if (!accum[code]) { + accum[code] = { error: c.error, weight: 0 }; + } + accum[code].weight += c.weight; + } + return accum; + }, ({})); + Object.keys(errors).forEach((errorCode) => { + const tally = errors[errorCode]; + if (tally.weight < this.quorum) { + return; + } + // Shut down any stallers + configs.forEach(c => { + if (c.staller) { + c.staller.cancel(); + } + c.cancelled = true; + }); + const e = (tally.error); + const props = {}; + ForwardProperties.forEach((name) => { + if (e[name] == null) { + return; + } + props[name] = e[name]; + }); + logger.throwError(e.reason || e.message, errorCode, props); + }); + // All configs have run to completion; we will never get more data + if (configs.filter((c) => !c.done).length === 0) { + break; + } + } + // Shut down any stallers; shouldn't be any + configs.forEach(c => { + if (c.staller) { + c.staller.cancel(); + } + c.cancelled = true; + }); + return logger.throwError("failed to meet quorum", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"].errors.SERVER_ERROR, { + method: method, + params: params, + //results: configs.map((c) => c.result), + //errors: configs.map((c) => c.error), + results: configs.map((c) => exposeDebugConfig(c)), + provider: this + }); + }); + } +} +//# sourceMappingURL=fallback-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/formatter.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/formatter.js ***! + \********************************************************************/ +/*! exports provided: Formatter, isCommunityResourcable, isCommunityResource, showThrottleMessage */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Formatter", function() { return Formatter; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCommunityResourcable", function() { return isCommunityResourcable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isCommunityResource", function() { return isCommunityResource; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showThrottleMessage", function() { return showThrottleMessage; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/constants */ "./node_modules/@ethersproject/constants/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/transactions */ "./node_modules/@ethersproject/transactions/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_6__["Logger"](_version__WEBPACK_IMPORTED_MODULE_7__["version"]); +class Formatter { + constructor() { + logger.checkNew(new.target, Formatter); + this.formats = this.getDefaultFormats(); + } + getDefaultFormats() { + const formats = ({}); + const address = this.address.bind(this); + const bigNumber = this.bigNumber.bind(this); + const blockTag = this.blockTag.bind(this); + const data = this.data.bind(this); + const hash = this.hash.bind(this); + const hex = this.hex.bind(this); + const number = this.number.bind(this); + const strictData = (v) => { return this.data(v, true); }; + formats.transaction = { + hash: hash, + blockHash: Formatter.allowNull(hash, null), + blockNumber: Formatter.allowNull(number, null), + transactionIndex: Formatter.allowNull(number, null), + confirmations: Formatter.allowNull(number, null), + from: address, + gasPrice: bigNumber, + gasLimit: bigNumber, + to: Formatter.allowNull(address, null), + value: bigNumber, + nonce: number, + data: data, + r: Formatter.allowNull(this.uint256), + s: Formatter.allowNull(this.uint256), + v: Formatter.allowNull(number), + creates: Formatter.allowNull(address, null), + raw: Formatter.allowNull(data), + }; + formats.transactionRequest = { + from: Formatter.allowNull(address), + nonce: Formatter.allowNull(number), + gasLimit: Formatter.allowNull(bigNumber), + gasPrice: Formatter.allowNull(bigNumber), + to: Formatter.allowNull(address), + value: Formatter.allowNull(bigNumber), + data: Formatter.allowNull(strictData), + }; + formats.receiptLog = { + transactionIndex: number, + blockNumber: number, + transactionHash: hash, + address: address, + topics: Formatter.arrayOf(hash), + data: data, + logIndex: number, + blockHash: hash, + }; + formats.receipt = { + to: Formatter.allowNull(this.address, null), + from: Formatter.allowNull(this.address, null), + contractAddress: Formatter.allowNull(address, null), + transactionIndex: number, + // should be allowNull(hash), but broken-EIP-658 support is handled in receipt + root: Formatter.allowNull(hex), + gasUsed: bigNumber, + logsBloom: Formatter.allowNull(data), + blockHash: hash, + transactionHash: hash, + logs: Formatter.arrayOf(this.receiptLog.bind(this)), + blockNumber: number, + confirmations: Formatter.allowNull(number, null), + cumulativeGasUsed: bigNumber, + status: Formatter.allowNull(number) + }; + formats.block = { + hash: hash, + parentHash: hash, + number: number, + timestamp: number, + nonce: Formatter.allowNull(hex), + difficulty: this.difficulty.bind(this), + gasLimit: bigNumber, + gasUsed: bigNumber, + miner: address, + extraData: data, + transactions: Formatter.allowNull(Formatter.arrayOf(hash)), + }; + formats.blockWithTransactions = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(formats.block); + formats.blockWithTransactions.transactions = Formatter.allowNull(Formatter.arrayOf(this.transactionResponse.bind(this))); + formats.filter = { + fromBlock: Formatter.allowNull(blockTag, undefined), + toBlock: Formatter.allowNull(blockTag, undefined), + blockHash: Formatter.allowNull(hash, undefined), + address: Formatter.allowNull(address, undefined), + topics: Formatter.allowNull(this.topics.bind(this), undefined), + }; + formats.filterLog = { + blockNumber: Formatter.allowNull(number), + blockHash: Formatter.allowNull(hash), + transactionIndex: number, + removed: Formatter.allowNull(this.boolean.bind(this)), + address: address, + data: Formatter.allowFalsish(data, "0x"), + topics: Formatter.arrayOf(hash), + transactionHash: hash, + logIndex: number, + }; + return formats; + } + // Requires a BigNumberish that is within the IEEE754 safe integer range; returns a number + // Strict! Used on input. + number(number) { + if (number === "0x") { + return 0; + } + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(number).toNumber(); + } + // Strict! Used on input. + bigNumber(value) { + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value); + } + // Requires a boolean, "true" or "false"; returns a boolean + boolean(value) { + if (typeof (value) === "boolean") { + return value; + } + if (typeof (value) === "string") { + value = value.toLowerCase(); + if (value === "true") { + return true; + } + if (value === "false") { + return false; + } + } + throw new Error("invalid boolean - " + value); + } + hex(value, strict) { + if (typeof (value) === "string") { + if (!strict && value.substring(0, 2) !== "0x") { + value = "0x" + value; + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(value)) { + return value.toLowerCase(); + } + } + return logger.throwArgumentError("invalid hash", "value", value); + } + data(value, strict) { + const result = this.hex(value, strict); + if ((result.length % 2) !== 0) { + throw new Error("invalid data; odd-length - " + value); + } + return result; + } + // Requires an address + // Strict! Used on input. + address(value) { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(value); + } + callAddress(value) { + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(value, 32)) { + return null; + } + const address = Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexDataSlice"])(value, 12)); + return (address === _ethersproject_constants__WEBPACK_IMPORTED_MODULE_3__["AddressZero"]) ? null : address; + } + contractAddress(value) { + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getContractAddress"])(value); + } + // Strict! Used on input. + blockTag(blockTag) { + if (blockTag == null) { + return "latest"; + } + if (blockTag === "earliest") { + return "0x0"; + } + if (blockTag === "latest" || blockTag === "pending") { + return blockTag; + } + if (typeof (blockTag) === "number" || Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(blockTag)) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexValue"])(blockTag); + } + throw new Error("invalid blockTag"); + } + // Requires a hash, optionally requires 0x prefix; returns prefixed lowercase hash. + hash(value, strict) { + const result = this.hex(value, strict); + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexDataLength"])(result) !== 32) { + return logger.throwArgumentError("invalid hash", "value", value); + } + return result; + } + // Returns the difficulty as a number, or if too large (i.e. PoA network) null + difficulty(value) { + if (value == null) { + return null; + } + const v = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value); + try { + return v.toNumber(); + } + catch (error) { } + return null; + } + uint256(value) { + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(value)) { + throw new Error("invalid uint256"); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(value, 32); + } + _block(value, format) { + if (value.author != null && value.miner == null) { + value.miner = value.author; + } + return Formatter.check(format, value); + } + block(value) { + return this._block(value, this.formats.block); + } + blockWithTransactions(value) { + return this._block(value, this.formats.blockWithTransactions); + } + // Strict! Used on input. + transactionRequest(value) { + return Formatter.check(this.formats.transactionRequest, value); + } + transactionResponse(transaction) { + // Rename gas to gasLimit + if (transaction.gas != null && transaction.gasLimit == null) { + transaction.gasLimit = transaction.gas; + } + // Some clients (TestRPC) do strange things like return 0x0 for the + // 0 address; correct this to be a real address + if (transaction.to && _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(transaction.to).isZero()) { + transaction.to = "0x0000000000000000000000000000000000000000"; + } + // Rename input to data + if (transaction.input != null && transaction.data == null) { + transaction.data = transaction.input; + } + // If to and creates are empty, populate the creates from the transaction + if (transaction.to == null && transaction.creates == null) { + transaction.creates = this.contractAddress(transaction); + } + // @TODO: use transaction.serialize? Have to add support for including v, r, and s... + /* + if (!transaction.raw) { + + // Very loose providers (e.g. TestRPC) do not provide a signature or raw + if (transaction.v && transaction.r && transaction.s) { + let raw = [ + stripZeros(hexlify(transaction.nonce)), + stripZeros(hexlify(transaction.gasPrice)), + stripZeros(hexlify(transaction.gasLimit)), + (transaction.to || "0x"), + stripZeros(hexlify(transaction.value || "0x")), + hexlify(transaction.data || "0x"), + stripZeros(hexlify(transaction.v || "0x")), + stripZeros(hexlify(transaction.r)), + stripZeros(hexlify(transaction.s)), + ]; + + transaction.raw = rlpEncode(raw); + } + } + */ + const result = Formatter.check(this.formats.transaction, transaction); + if (transaction.chainId != null) { + let chainId = transaction.chainId; + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(chainId)) { + chainId = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(chainId).toNumber(); + } + result.chainId = chainId; + } + else { + let chainId = transaction.networkId; + // geth-etc returns chainId + if (chainId == null && result.v == null) { + chainId = transaction.chainId; + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(chainId)) { + chainId = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(chainId).toNumber(); + } + if (typeof (chainId) !== "number" && result.v != null) { + chainId = (result.v - 35) / 2; + if (chainId < 0) { + chainId = 0; + } + chainId = parseInt(chainId); + } + if (typeof (chainId) !== "number") { + chainId = 0; + } + result.chainId = chainId; + } + // 0x0000... should actually be null + if (result.blockHash && result.blockHash.replace(/0/g, "") === "x") { + result.blockHash = null; + } + return result; + } + transaction(value) { + return Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_5__["parse"])(value); + } + receiptLog(value) { + return Formatter.check(this.formats.receiptLog, value); + } + receipt(value) { + const result = Formatter.check(this.formats.receipt, value); + // RSK incorrectly implemented EIP-658, so we munge things a bit here for it + if (result.root != null) { + if (result.root.length <= 4) { + // Could be 0x00, 0x0, 0x01 or 0x1 + const value = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(result.root).toNumber(); + if (value === 0 || value === 1) { + // Make sure if both are specified, they match + if (result.status != null && (result.status !== value)) { + logger.throwArgumentError("alt-root-status/status mismatch", "value", { root: result.root, status: result.status }); + } + result.status = value; + delete result.root; + } + else { + logger.throwArgumentError("invalid alt-root-status", "value.root", result.root); + } + } + else if (result.root.length !== 66) { + // Must be a valid bytes32 + logger.throwArgumentError("invalid root hash", "value.root", result.root); + } + } + if (result.status != null) { + result.byzantium = true; + } + return result; + } + topics(value) { + if (Array.isArray(value)) { + return value.map((v) => this.topics(v)); + } + else if (value != null) { + return this.hash(value, true); + } + return null; + } + filter(value) { + return Formatter.check(this.formats.filter, value); + } + filterLog(value) { + return Formatter.check(this.formats.filterLog, value); + } + static check(format, object) { + const result = {}; + for (const key in format) { + try { + const value = format[key](object[key]); + if (value !== undefined) { + result[key] = value; + } + } + catch (error) { + error.checkKey = key; + error.checkValue = object[key]; + throw error; + } + } + return result; + } + // if value is null-ish, nullValue is returned + static allowNull(format, nullValue) { + return (function (value) { + if (value == null) { + return nullValue; + } + return format(value); + }); + } + // If value is false-ish, replaceValue is returned + static allowFalsish(format, replaceValue) { + return (function (value) { + if (!value) { + return replaceValue; + } + return format(value); + }); + } + // Requires an Array satisfying check + static arrayOf(format) { + return (function (array) { + if (!Array.isArray(array)) { + throw new Error("not an array"); + } + const result = []; + array.forEach(function (value) { + result.push(format(value)); + }); + return result; + }); + } +} +function isCommunityResourcable(value) { + return (value && typeof (value.isCommunityResource) === "function"); +} +function isCommunityResource(value) { + return (isCommunityResourcable(value) && value.isCommunityResource()); +} +// Show the throttle message only once +let throttleMessage = false; +function showThrottleMessage() { + if (throttleMessage) { + return; + } + throttleMessage = true; + console.log("========= NOTICE ========="); + console.log("Request-Rate Exceeded (this message will not be repeated)"); + console.log(""); + console.log("The default API keys for each service are provided as a highly-throttled,"); + console.log("community resource for low-traffic projects and early prototyping."); + console.log(""); + console.log("While your application will continue to function, we highly recommended"); + console.log("signing up for your own API keys to improve performance, increase your"); + console.log("request rate/limit and enable other perks, such as metrics and advanced APIs."); + console.log(""); + console.log("For more details: https:/\/docs.ethers.io/api-keys/"); + console.log("=========================="); +} +//# sourceMappingURL=formatter.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/index.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/index.js ***! + \****************************************************************/ +/*! exports provided: Provider, BaseProvider, Resolver, UrlJsonRpcProvider, FallbackProvider, AlchemyProvider, AlchemyWebSocketProvider, CloudflareProvider, EtherscanProvider, InfuraProvider, InfuraWebSocketProvider, JsonRpcProvider, NodesmithProvider, PocketProvider, StaticJsonRpcProvider, Web3Provider, WebSocketProvider, IpcProvider, JsonRpcSigner, getDefaultProvider, getNetwork, isCommunityResource, isCommunityResourcable, showThrottleMessage, Formatter */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDefaultProvider", function() { return getDefaultProvider; }); +/* harmony import */ var _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/abstract-provider */ "./node_modules/@ethersproject/abstract-provider/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Provider", function() { return _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_0__["Provider"]; }); + +/* harmony import */ var _ethersproject_networks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/networks */ "./node_modules/@ethersproject/networks/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getNetwork", function() { return _ethersproject_networks__WEBPACK_IMPORTED_MODULE_1__["getNetwork"]; }); + +/* harmony import */ var _base_provider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./base-provider */ "./node_modules/@ethersproject/providers/lib.esm/base-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseProvider", function() { return _base_provider__WEBPACK_IMPORTED_MODULE_2__["BaseProvider"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Resolver", function() { return _base_provider__WEBPACK_IMPORTED_MODULE_2__["Resolver"]; }); + +/* harmony import */ var _alchemy_provider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./alchemy-provider */ "./node_modules/@ethersproject/providers/lib.esm/alchemy-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AlchemyProvider", function() { return _alchemy_provider__WEBPACK_IMPORTED_MODULE_3__["AlchemyProvider"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AlchemyWebSocketProvider", function() { return _alchemy_provider__WEBPACK_IMPORTED_MODULE_3__["AlchemyWebSocketProvider"]; }); + +/* harmony import */ var _cloudflare_provider__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./cloudflare-provider */ "./node_modules/@ethersproject/providers/lib.esm/cloudflare-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CloudflareProvider", function() { return _cloudflare_provider__WEBPACK_IMPORTED_MODULE_4__["CloudflareProvider"]; }); + +/* harmony import */ var _etherscan_provider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./etherscan-provider */ "./node_modules/@ethersproject/providers/lib.esm/etherscan-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EtherscanProvider", function() { return _etherscan_provider__WEBPACK_IMPORTED_MODULE_5__["EtherscanProvider"]; }); + +/* harmony import */ var _fallback_provider__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./fallback-provider */ "./node_modules/@ethersproject/providers/lib.esm/fallback-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FallbackProvider", function() { return _fallback_provider__WEBPACK_IMPORTED_MODULE_6__["FallbackProvider"]; }); + +/* harmony import */ var _ipc_provider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ipc-provider */ "./node_modules/@ethersproject/providers/lib.esm/ipc-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IpcProvider", function() { return _ipc_provider__WEBPACK_IMPORTED_MODULE_7__["IpcProvider"]; }); + +/* harmony import */ var _infura_provider__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./infura-provider */ "./node_modules/@ethersproject/providers/lib.esm/infura-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "InfuraProvider", function() { return _infura_provider__WEBPACK_IMPORTED_MODULE_8__["InfuraProvider"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "InfuraWebSocketProvider", function() { return _infura_provider__WEBPACK_IMPORTED_MODULE_8__["InfuraWebSocketProvider"]; }); + +/* harmony import */ var _json_rpc_provider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "JsonRpcProvider", function() { return _json_rpc_provider__WEBPACK_IMPORTED_MODULE_9__["JsonRpcProvider"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "JsonRpcSigner", function() { return _json_rpc_provider__WEBPACK_IMPORTED_MODULE_9__["JsonRpcSigner"]; }); + +/* harmony import */ var _nodesmith_provider__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./nodesmith-provider */ "./node_modules/@ethersproject/providers/lib.esm/nodesmith-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NodesmithProvider", function() { return _nodesmith_provider__WEBPACK_IMPORTED_MODULE_10__["NodesmithProvider"]; }); + +/* harmony import */ var _pocket_provider__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./pocket-provider */ "./node_modules/@ethersproject/providers/lib.esm/pocket-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PocketProvider", function() { return _pocket_provider__WEBPACK_IMPORTED_MODULE_11__["PocketProvider"]; }); + +/* harmony import */ var _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./url-json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UrlJsonRpcProvider", function() { return _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_12__["UrlJsonRpcProvider"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StaticJsonRpcProvider", function() { return _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_12__["StaticJsonRpcProvider"]; }); + +/* harmony import */ var _web3_provider__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./web3-provider */ "./node_modules/@ethersproject/providers/lib.esm/web3-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Web3Provider", function() { return _web3_provider__WEBPACK_IMPORTED_MODULE_13__["Web3Provider"]; }); + +/* harmony import */ var _websocket_provider__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./websocket-provider */ "./node_modules/@ethersproject/providers/lib.esm/websocket-provider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WebSocketProvider", function() { return _websocket_provider__WEBPACK_IMPORTED_MODULE_14__["WebSocketProvider"]; }); + +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./formatter */ "./node_modules/@ethersproject/providers/lib.esm/formatter.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isCommunityResource", function() { return _formatter__WEBPACK_IMPORTED_MODULE_15__["isCommunityResource"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isCommunityResourcable", function() { return _formatter__WEBPACK_IMPORTED_MODULE_15__["isCommunityResourcable"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "showThrottleMessage", function() { return _formatter__WEBPACK_IMPORTED_MODULE_15__["showThrottleMessage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Formatter", function() { return _formatter__WEBPACK_IMPORTED_MODULE_15__["Formatter"]; }); + +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); + + + + + + + + + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_16__["Logger"](_version__WEBPACK_IMPORTED_MODULE_17__["version"]); +//////////////////////// +// Helper Functions +function getDefaultProvider(network, options) { + if (network == null) { + network = "homestead"; + } + // If passed a URL, figure out the right type of provider based on the scheme + if (typeof (network) === "string") { + // @TODO: Add support for IpcProvider; maybe if it ends in ".ipc"? + // Handle http and ws (and their secure variants) + const match = network.match(/^(ws|http)s?:/i); + if (match) { + switch (match[1]) { + case "http": + return new _json_rpc_provider__WEBPACK_IMPORTED_MODULE_9__["JsonRpcProvider"](network); + case "ws": + return new _websocket_provider__WEBPACK_IMPORTED_MODULE_14__["WebSocketProvider"](network); + default: + logger.throwArgumentError("unsupported URL scheme", "network", network); + } + } + } + const n = Object(_ethersproject_networks__WEBPACK_IMPORTED_MODULE_1__["getNetwork"])(network); + if (!n || !n._defaultProvider) { + logger.throwError("unsupported getDefaultProvider network", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_16__["Logger"].errors.NETWORK_ERROR, { + operation: "getDefaultProvider", + network: network + }); + } + return n._defaultProvider({ + FallbackProvider: _fallback_provider__WEBPACK_IMPORTED_MODULE_6__["FallbackProvider"], + AlchemyProvider: _alchemy_provider__WEBPACK_IMPORTED_MODULE_3__["AlchemyProvider"], + CloudflareProvider: _cloudflare_provider__WEBPACK_IMPORTED_MODULE_4__["CloudflareProvider"], + EtherscanProvider: _etherscan_provider__WEBPACK_IMPORTED_MODULE_5__["EtherscanProvider"], + InfuraProvider: _infura_provider__WEBPACK_IMPORTED_MODULE_8__["InfuraProvider"], + JsonRpcProvider: _json_rpc_provider__WEBPACK_IMPORTED_MODULE_9__["JsonRpcProvider"], + NodesmithProvider: _nodesmith_provider__WEBPACK_IMPORTED_MODULE_10__["NodesmithProvider"], + PocketProvider: _pocket_provider__WEBPACK_IMPORTED_MODULE_11__["PocketProvider"], + Web3Provider: _web3_provider__WEBPACK_IMPORTED_MODULE_13__["Web3Provider"], + IpcProvider: _ipc_provider__WEBPACK_IMPORTED_MODULE_7__["IpcProvider"], + }, options); +} +//////////////////////// +// Exports + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/infura-provider.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/infura-provider.js ***! + \**************************************************************************/ +/*! exports provided: InfuraWebSocketProvider, InfuraProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InfuraWebSocketProvider", function() { return InfuraWebSocketProvider; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InfuraProvider", function() { return InfuraProvider; }); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _websocket_provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./websocket-provider */ "./node_modules/@ethersproject/providers/lib.esm/websocket-provider.js"); +/* harmony import */ var _formatter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formatter */ "./node_modules/@ethersproject/providers/lib.esm/formatter.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./url-json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js"); + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"](_version__WEBPACK_IMPORTED_MODULE_4__["version"]); + +const defaultProjectId = "84842078b09946638c03157f83405213"; +class InfuraWebSocketProvider extends _websocket_provider__WEBPACK_IMPORTED_MODULE_1__["WebSocketProvider"] { + constructor(network, apiKey) { + const provider = new InfuraProvider(network, apiKey); + const connection = provider.connection; + if (connection.password) { + logger.throwError("INFURA WebSocket project secrets unsupported", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "InfuraProvider.getWebSocketProvider()" + }); + } + const url = connection.url.replace(/^http/i, "ws").replace("/v3/", "/ws/v3/"); + super(url, network); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "apiKey", provider.projectId); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "projectId", provider.projectId); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "projectSecret", provider.projectSecret); + } + isCommunityResource() { + return (this.projectId === defaultProjectId); + } +} +class InfuraProvider extends _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_5__["UrlJsonRpcProvider"] { + static getWebSocketProvider(network, apiKey) { + return new InfuraWebSocketProvider(network, apiKey); + } + static getApiKey(apiKey) { + const apiKeyObj = { + apiKey: defaultProjectId, + projectId: defaultProjectId, + projectSecret: null + }; + if (apiKey == null) { + return apiKeyObj; + } + if (typeof (apiKey) === "string") { + apiKeyObj.projectId = apiKey; + } + else if (apiKey.projectSecret != null) { + logger.assertArgument((typeof (apiKey.projectId) === "string"), "projectSecret requires a projectId", "projectId", apiKey.projectId); + logger.assertArgument((typeof (apiKey.projectSecret) === "string"), "invalid projectSecret", "projectSecret", "[REDACTED]"); + apiKeyObj.projectId = apiKey.projectId; + apiKeyObj.projectSecret = apiKey.projectSecret; + } + else if (apiKey.projectId) { + apiKeyObj.projectId = apiKey.projectId; + } + apiKeyObj.apiKey = apiKeyObj.projectId; + return apiKeyObj; + } + static getUrl(network, apiKey) { + let host = null; + switch (network ? network.name : "unknown") { + case "homestead": + host = "mainnet.infura.io"; + break; + case "ropsten": + host = "ropsten.infura.io"; + break; + case "rinkeby": + host = "rinkeby.infura.io"; + break; + case "kovan": + host = "kovan.infura.io"; + break; + case "goerli": + host = "goerli.infura.io"; + break; + default: + logger.throwError("unsupported network", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"].errors.INVALID_ARGUMENT, { + argument: "network", + value: network + }); + } + const connection = { + allowGzip: true, + url: ("https:/" + "/" + host + "/v3/" + apiKey.projectId), + throttleCallback: (attempt, url) => { + if (apiKey.projectId === defaultProjectId) { + Object(_formatter__WEBPACK_IMPORTED_MODULE_2__["showThrottleMessage"])(); + } + return Promise.resolve(true); + } + }; + if (apiKey.projectSecret != null) { + connection.user = ""; + connection.password = apiKey.projectSecret; + } + return connection; + } + isCommunityResource() { + return (this.projectId === defaultProjectId); + } +} +//# sourceMappingURL=infura-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/ipc-provider.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/ipc-provider.js ***! + \***********************************************************************/ +/*! exports provided: IpcProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IpcProvider", function() { return IpcProvider; }); + +const IpcProvider = null; + +//# sourceMappingURL=ipc-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js ***! + \****************************************************************************/ +/*! exports provided: JsonRpcSigner, JsonRpcProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "JsonRpcSigner", function() { return JsonRpcSigner; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "JsonRpcProvider", function() { return JsonRpcProvider; }); +/* harmony import */ var _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/abstract-signer */ "./node_modules/@ethersproject/abstract-signer/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/hash */ "./node_modules/@ethersproject/hash/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _ethersproject_web__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/web */ "./node_modules/@ethersproject/web/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _base_provider__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./base-provider */ "./node_modules/@ethersproject/providers/lib.esm/base-provider.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"](_version__WEBPACK_IMPORTED_MODULE_8__["version"]); + +const errorGas = ["call", "estimateGas"]; +function checkError(method, error, params) { + // Undo the "convenience" some nodes are attempting to prevent backwards + // incompatibility; maybe for v6 consider forwarding reverts as errors + if (method === "call" && error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.SERVER_ERROR) { + const e = error.error; + if (e && e.message.match("reverted") && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isHexString"])(e.data)) { + return e.data; + } + } + let message = error.message; + if (error.code === _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.SERVER_ERROR && error.error && typeof (error.error.message) === "string") { + message = error.error.message; + } + else if (typeof (error.body) === "string") { + message = error.body; + } + else if (typeof (error.responseText) === "string") { + message = error.responseText; + } + message = (message || "").toLowerCase(); + const transaction = params.transaction || params.signedTransaction; + // "insufficient funds for gas * price + value + cost(data)" + if (message.match(/insufficient funds/)) { + logger.throwError("insufficient funds for intrinsic transaction cost", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.INSUFFICIENT_FUNDS, { + error, method, transaction + }); + } + // "nonce too low" + if (message.match(/nonce too low/)) { + logger.throwError("nonce has already been used", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.NONCE_EXPIRED, { + error, method, transaction + }); + } + // "replacement transaction underpriced" + if (message.match(/replacement transaction underpriced/)) { + logger.throwError("replacement fee too low", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.REPLACEMENT_UNDERPRICED, { + error, method, transaction + }); + } + if (errorGas.indexOf(method) >= 0 && message.match(/gas required exceeds allowance|always failing transaction|execution reverted/)) { + logger.throwError("cannot estimate gas; transaction may fail or may require manual gas limit", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNPREDICTABLE_GAS_LIMIT, { + error, method, transaction + }); + } + throw error; +} +function timer(timeout) { + return new Promise(function (resolve) { + setTimeout(resolve, timeout); + }); +} +function getResult(payload) { + if (payload.error) { + // @TODO: not any + const error = new Error(payload.error.message); + error.code = payload.error.code; + error.data = payload.error.data; + throw error; + } + return payload.result; +} +function getLowerCase(value) { + if (value) { + return value.toLowerCase(); + } + return value; +} +const _constructorGuard = {}; +class JsonRpcSigner extends _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_0__["Signer"] { + constructor(constructorGuard, provider, addressOrIndex) { + logger.checkNew(new.target, JsonRpcSigner); + super(); + if (constructorGuard !== _constructorGuard) { + throw new Error("do not call the JsonRpcSigner constructor directly; use provider.getSigner"); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "provider", provider); + if (addressOrIndex == null) { + addressOrIndex = 0; + } + if (typeof (addressOrIndex) === "string") { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "_address", this.provider.formatter.address(addressOrIndex)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "_index", null); + } + else if (typeof (addressOrIndex) === "number") { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "_index", addressOrIndex); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "_address", null); + } + else { + logger.throwArgumentError("invalid address or index", "addressOrIndex", addressOrIndex); + } + } + connect(provider) { + return logger.throwError("cannot alter JSON-RPC Signer connection", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "connect" + }); + } + connectUnchecked() { + return new UncheckedJsonRpcSigner(_constructorGuard, this.provider, this._address || this._index); + } + getAddress() { + if (this._address) { + return Promise.resolve(this._address); + } + return this.provider.send("eth_accounts", []).then((accounts) => { + if (accounts.length <= this._index) { + logger.throwError("unknown account #" + this._index, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "getAddress" + }); + } + return this.provider.formatter.address(accounts[this._index]); + }); + } + sendUncheckedTransaction(transaction) { + transaction = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(transaction); + const fromAddress = this.getAddress().then((address) => { + if (address) { + address = address.toLowerCase(); + } + return address; + }); + // The JSON-RPC for eth_sendTransaction uses 90000 gas; if the user + // wishes to use this, it is easy to specify explicitly, otherwise + // we look it up for them. + if (transaction.gasLimit == null) { + const estimate = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(transaction); + estimate.from = fromAddress; + transaction.gasLimit = this.provider.estimateGas(estimate); + } + return Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["resolveProperties"])({ + tx: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["resolveProperties"])(transaction), + sender: fromAddress + }).then(({ tx, sender }) => { + if (tx.from != null) { + if (tx.from.toLowerCase() !== sender) { + logger.throwArgumentError("from address mismatch", "transaction", transaction); + } + } + else { + tx.from = sender; + } + const hexTx = this.provider.constructor.hexlifyTransaction(tx, { from: true }); + return this.provider.send("eth_sendTransaction", [hexTx]).then((hash) => { + return hash; + }, (error) => { + return checkError("sendTransaction", error, hexTx); + }); + }); + } + signTransaction(transaction) { + return logger.throwError("signing transactions is unsupported", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "signTransaction" + }); + } + sendTransaction(transaction) { + return this.sendUncheckedTransaction(transaction).then((hash) => { + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_6__["poll"])(() => { + return this.provider.getTransaction(hash).then((tx) => { + if (tx === null) { + return undefined; + } + return this.provider._wrapTransaction(tx, hash); + }); + }, { onceBlock: this.provider }).catch((error) => { + error.transactionHash = hash; + throw error; + }); + }); + } + signMessage(message) { + return __awaiter(this, void 0, void 0, function* () { + const data = ((typeof (message) === "string") ? Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_5__["toUtf8Bytes"])(message) : message); + const address = yield this.getAddress(); + // https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign + return yield this.provider.send("eth_sign", [address.toLowerCase(), Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(data)]); + }); + } + _signTypedData(domain, types, value) { + return __awaiter(this, void 0, void 0, function* () { + // Populate any ENS names (in-place) + const populated = yield _ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__["_TypedDataEncoder"].resolveNames(domain, types, value, (name) => { + return this.provider.resolveName(name); + }); + const address = yield this.getAddress(); + return yield this.provider.send("eth_signTypedData_v4", [ + address.toLowerCase(), + JSON.stringify(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_3__["_TypedDataEncoder"].getPayload(populated.domain, types, populated.value)) + ]); + }); + } + unlock(password) { + return __awaiter(this, void 0, void 0, function* () { + const provider = this.provider; + const address = yield this.getAddress(); + return provider.send("personal_unlockAccount", [address.toLowerCase(), password, null]); + }); + } +} +class UncheckedJsonRpcSigner extends JsonRpcSigner { + sendTransaction(transaction) { + return this.sendUncheckedTransaction(transaction).then((hash) => { + return { + hash: hash, + nonce: null, + gasLimit: null, + gasPrice: null, + data: null, + value: null, + chainId: null, + confirmations: 0, + from: null, + wait: (confirmations) => { return this.provider.waitForTransaction(hash, confirmations); } + }; + }); + } +} +const allowedTransactionKeys = { + chainId: true, data: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true +}; +class JsonRpcProvider extends _base_provider__WEBPACK_IMPORTED_MODULE_9__["BaseProvider"] { + constructor(url, network) { + logger.checkNew(new.target, JsonRpcProvider); + let networkOrReady = network; + // The network is unknown, query the JSON-RPC for it + if (networkOrReady == null) { + networkOrReady = new Promise((resolve, reject) => { + setTimeout(() => { + this.detectNetwork().then((network) => { + resolve(network); + }, (error) => { + reject(error); + }); + }, 0); + }); + } + super(networkOrReady); + // Default URL + if (!url) { + url = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["getStatic"])(this.constructor, "defaultUrl")(); + } + if (typeof (url) === "string") { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "connection", Object.freeze({ + url: url + })); + } + else { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["defineReadOnly"])(this, "connection", Object.freeze(Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(url))); + } + this._nextId = 42; + } + static defaultUrl() { + return "http:/\/localhost:8545"; + } + detectNetwork() { + return __awaiter(this, void 0, void 0, function* () { + yield timer(0); + let chainId = null; + try { + chainId = yield this.send("eth_chainId", []); + } + catch (error) { + try { + chainId = yield this.send("net_version", []); + } + catch (error) { } + } + if (chainId != null) { + const getNetwork = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["getStatic"])(this.constructor, "getNetwork"); + try { + return getNetwork(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(chainId).toNumber()); + } + catch (error) { + return logger.throwError("could not detect network", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.NETWORK_ERROR, { + chainId: chainId, + event: "invalidNetwork", + serverError: error + }); + } + } + return logger.throwError("could not detect network", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.NETWORK_ERROR, { + event: "noNetwork" + }); + }); + } + getSigner(addressOrIndex) { + return new JsonRpcSigner(_constructorGuard, this, addressOrIndex); + } + getUncheckedSigner(addressOrIndex) { + return this.getSigner(addressOrIndex).connectUnchecked(); + } + listAccounts() { + return this.send("eth_accounts", []).then((accounts) => { + return accounts.map((a) => this.formatter.address(a)); + }); + } + send(method, params) { + const request = { + method: method, + params: params, + id: (this._nextId++), + jsonrpc: "2.0" + }; + this.emit("debug", { + action: "request", + request: Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["deepCopy"])(request), + provider: this + }); + return Object(_ethersproject_web__WEBPACK_IMPORTED_MODULE_6__["fetchJson"])(this.connection, JSON.stringify(request), getResult).then((result) => { + this.emit("debug", { + action: "response", + request: request, + response: result, + provider: this + }); + return result; + }, (error) => { + this.emit("debug", { + action: "response", + error: error, + request: request, + provider: this + }); + throw error; + }); + } + prepareRequest(method, params) { + switch (method) { + case "getBlockNumber": + return ["eth_blockNumber", []]; + case "getGasPrice": + return ["eth_gasPrice", []]; + case "getBalance": + return ["eth_getBalance", [getLowerCase(params.address), params.blockTag]]; + case "getTransactionCount": + return ["eth_getTransactionCount", [getLowerCase(params.address), params.blockTag]]; + case "getCode": + return ["eth_getCode", [getLowerCase(params.address), params.blockTag]]; + case "getStorageAt": + return ["eth_getStorageAt", [getLowerCase(params.address), params.position, params.blockTag]]; + case "sendTransaction": + return ["eth_sendRawTransaction", [params.signedTransaction]]; + case "getBlock": + if (params.blockTag) { + return ["eth_getBlockByNumber", [params.blockTag, !!params.includeTransactions]]; + } + else if (params.blockHash) { + return ["eth_getBlockByHash", [params.blockHash, !!params.includeTransactions]]; + } + return null; + case "getTransaction": + return ["eth_getTransactionByHash", [params.transactionHash]]; + case "getTransactionReceipt": + return ["eth_getTransactionReceipt", [params.transactionHash]]; + case "call": { + const hexlifyTransaction = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["getStatic"])(this.constructor, "hexlifyTransaction"); + return ["eth_call", [hexlifyTransaction(params.transaction, { from: true }), params.blockTag]]; + } + case "estimateGas": { + const hexlifyTransaction = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["getStatic"])(this.constructor, "hexlifyTransaction"); + return ["eth_estimateGas", [hexlifyTransaction(params.transaction, { from: true })]]; + } + case "getLogs": + if (params.filter && params.filter.address != null) { + params.filter.address = getLowerCase(params.filter.address); + } + return ["eth_getLogs", [params.filter]]; + default: + break; + } + return null; + } + perform(method, params) { + return __awaiter(this, void 0, void 0, function* () { + const args = this.prepareRequest(method, params); + if (args == null) { + logger.throwError(method + " not implemented", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_7__["Logger"].errors.NOT_IMPLEMENTED, { operation: method }); + } + try { + return yield this.send(args[0], args[1]); + } + catch (error) { + return checkError(method, error, params); + } + }); + } + _startEvent(event) { + if (event.tag === "pending") { + this._startPending(); + } + super._startEvent(event); + } + _startPending() { + if (this._pendingFilter != null) { + return; + } + const self = this; + const pendingFilter = this.send("eth_newPendingTransactionFilter", []); + this._pendingFilter = pendingFilter; + pendingFilter.then(function (filterId) { + function poll() { + self.send("eth_getFilterChanges", [filterId]).then(function (hashes) { + if (self._pendingFilter != pendingFilter) { + return null; + } + let seq = Promise.resolve(); + hashes.forEach(function (hash) { + // @TODO: This should be garbage collected at some point... How? When? + self._emitted["t:" + hash.toLowerCase()] = "pending"; + seq = seq.then(function () { + return self.getTransaction(hash).then(function (tx) { + self.emit("pending", tx); + return null; + }); + }); + }); + return seq.then(function () { + return timer(1000); + }); + }).then(function () { + if (self._pendingFilter != pendingFilter) { + self.send("eth_uninstallFilter", [filterId]); + return; + } + setTimeout(function () { poll(); }, 0); + return null; + }).catch((error) => { }); + } + poll(); + return filterId; + }).catch((error) => { }); + } + _stopEvent(event) { + if (event.tag === "pending" && this.listenerCount("pending") === 0) { + this._pendingFilter = null; + } + super._stopEvent(event); + } + // Convert an ethers.js transaction into a JSON-RPC transaction + // - gasLimit => gas + // - All values hexlified + // - All numeric values zero-striped + // - All addresses are lowercased + // NOTE: This allows a TransactionRequest, but all values should be resolved + // before this is called + // @TODO: This will likely be removed in future versions and prepareRequest + // will be the preferred method for this. + static hexlifyTransaction(transaction, allowExtra) { + // Check only allowed properties are given + const allowed = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["shallowCopy"])(allowedTransactionKeys); + if (allowExtra) { + for (const key in allowExtra) { + if (allowExtra[key]) { + allowed[key] = true; + } + } + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_4__["checkProperties"])(transaction, allowed); + const result = {}; + // Some nodes (INFURA ropsten; INFURA mainnet is fine) do not like leading zeros. + ["gasLimit", "gasPrice", "nonce", "value"].forEach(function (key) { + if (transaction[key] == null) { + return; + } + const value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexValue"])(transaction[key]); + if (key === "gasLimit") { + key = "gas"; + } + result[key] = value; + }); + ["from", "to", "data"].forEach(function (key) { + if (transaction[key] == null) { + return; + } + result[key] = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(transaction[key]); + }); + return result; + } +} +//# sourceMappingURL=json-rpc-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/nodesmith-provider.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/nodesmith-provider.js ***! + \*****************************************************************************/ +/*! exports provided: NodesmithProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodesmithProvider", function() { return NodesmithProvider; }); +/* harmony import */ var _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./url-json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* istanbul ignore file */ + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +// Special API key provided by Nodesmith for ethers.js +const defaultApiKey = "ETHERS_JS_SHARED"; +class NodesmithProvider extends _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_0__["UrlJsonRpcProvider"] { + static getApiKey(apiKey) { + if (apiKey && typeof (apiKey) !== "string") { + logger.throwArgumentError("invalid apiKey", "apiKey", apiKey); + } + return apiKey || defaultApiKey; + } + static getUrl(network, apiKey) { + logger.warn("NodeSmith will be discontinued on 2019-12-20; please migrate to another platform."); + let host = null; + switch (network.name) { + case "homestead": + host = "https://ethereum.api.nodesmith.io/v1/mainnet/jsonrpc"; + break; + case "ropsten": + host = "https://ethereum.api.nodesmith.io/v1/ropsten/jsonrpc"; + break; + case "rinkeby": + host = "https://ethereum.api.nodesmith.io/v1/rinkeby/jsonrpc"; + break; + case "goerli": + host = "https://ethereum.api.nodesmith.io/v1/goerli/jsonrpc"; + break; + case "kovan": + host = "https://ethereum.api.nodesmith.io/v1/kovan/jsonrpc"; + break; + default: + logger.throwArgumentError("unsupported network", "network", arguments[0]); + } + return (host + "?apiKey=" + apiKey); + } +} +//# sourceMappingURL=nodesmith-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/pocket-provider.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/pocket-provider.js ***! + \**************************************************************************/ +/*! exports provided: PocketProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PocketProvider", function() { return PocketProvider; }); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./url-json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js"); + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); + +// These are load-balancer-based applicatoin IDs +const defaultApplicationIds = { + homestead: "6004bcd10040261633ade990", + ropsten: "6004bd4d0040261633ade991", + rinkeby: "6004bda20040261633ade994", + goerli: "6004bd860040261633ade992", +}; +class PocketProvider extends _url_json_rpc_provider__WEBPACK_IMPORTED_MODULE_3__["UrlJsonRpcProvider"] { + constructor(network, apiKey) { + // We need a bit of creativity in the constructor because + // Pocket uses different default API keys based on the network + if (apiKey == null) { + const n = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["getStatic"])((new.target), "getNetwork")(network); + if (n) { + const applicationId = defaultApplicationIds[n.name]; + if (applicationId) { + apiKey = { + applicationId: applicationId, + loadBalancer: true + }; + } + } + // If there was any issue above, we don't know this network + if (apiKey == null) { + logger.throwError("unsupported network", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.INVALID_ARGUMENT, { + argument: "network", + value: network + }); + } + } + super(network, apiKey); + } + static getApiKey(apiKey) { + // Most API Providers allow null to get the default configuration, but + // Pocket requires the network to decide the default provider, so we + // rely on hijacking the constructor to add a sensible default for us + if (apiKey == null) { + logger.throwArgumentError("PocketProvider.getApiKey does not support null apiKey", "apiKey", apiKey); + } + const apiKeyObj = { + applicationId: null, + loadBalancer: false, + applicationSecretKey: null + }; + // Parse applicationId and applicationSecretKey + if (typeof (apiKey) === "string") { + apiKeyObj.applicationId = apiKey; + } + else if (apiKey.applicationSecretKey != null) { + logger.assertArgument((typeof (apiKey.applicationId) === "string"), "applicationSecretKey requires an applicationId", "applicationId", apiKey.applicationId); + logger.assertArgument((typeof (apiKey.applicationSecretKey) === "string"), "invalid applicationSecretKey", "applicationSecretKey", "[REDACTED]"); + apiKeyObj.applicationId = apiKey.applicationId; + apiKeyObj.applicationSecretKey = apiKey.applicationSecretKey; + apiKeyObj.loadBalancer = !!apiKey.loadBalancer; + } + else if (apiKey.applicationId) { + logger.assertArgument((typeof (apiKey.applicationId) === "string"), "apiKey.applicationId must be a string", "apiKey.applicationId", apiKey.applicationId); + apiKeyObj.applicationId = apiKey.applicationId; + apiKeyObj.loadBalancer = !!apiKey.loadBalancer; + } + else { + logger.throwArgumentError("unsupported PocketProvider apiKey", "apiKey", apiKey); + } + return apiKeyObj; + } + static getUrl(network, apiKey) { + let host = null; + switch (network ? network.name : "unknown") { + case "homestead": + host = "eth-mainnet.gateway.pokt.network"; + break; + case "ropsten": + host = "eth-ropsten.gateway.pokt.network"; + break; + case "rinkeby": + host = "eth-rinkeby.gateway.pokt.network"; + break; + case "goerli": + host = "eth-goerli.gateway.pokt.network"; + break; + default: + logger.throwError("unsupported network", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.INVALID_ARGUMENT, { + argument: "network", + value: network + }); + } + let url = null; + if (apiKey.loadBalancer) { + url = `https:/\/${host}/v1/lb/${apiKey.applicationId}`; + } + else { + url = `https:/\/${host}/v1/${apiKey.applicationId}`; + } + const connection = { url }; + // Initialize empty headers + connection.headers = {}; + // Apply application secret key + if (apiKey.applicationSecretKey != null) { + connection.user = ""; + connection.password = apiKey.applicationSecretKey; + } + return connection; + } + isCommunityResource() { + return (this.applicationId === defaultApplicationIds[this.network.name]); + } +} +//# sourceMappingURL=pocket-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/url-json-rpc-provider.js ***! + \********************************************************************************/ +/*! exports provided: StaticJsonRpcProvider, UrlJsonRpcProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StaticJsonRpcProvider", function() { return StaticJsonRpcProvider; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UrlJsonRpcProvider", function() { return UrlJsonRpcProvider; }); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _json_rpc_provider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); + +// A StaticJsonRpcProvider is useful when you *know* for certain that +// the backend will never change, as it never calls eth_chainId to +// verify its backend. However, if the backend does change, the effects +// are undefined and may include: +// - inconsistent results +// - locking up the UI +// - block skew warnings +// - wrong results +// If the network is not explicit (i.e. auto-detection is expected), the +// node MUST be running and available to respond to requests BEFORE this +// is instantiated. +class StaticJsonRpcProvider extends _json_rpc_provider__WEBPACK_IMPORTED_MODULE_3__["JsonRpcProvider"] { + detectNetwork() { + const _super = Object.create(null, { + detectNetwork: { get: () => super.detectNetwork } + }); + return __awaiter(this, void 0, void 0, function* () { + let network = this.network; + if (network == null) { + network = yield _super.detectNetwork.call(this); + if (!network) { + logger.throwError("no network detected", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNKNOWN_ERROR, {}); + } + // If still not set, set it + if (this._network == null) { + // A static network does not support "any" + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "_network", network); + this.emit("network", network, null); + } + } + return network; + }); + } +} +class UrlJsonRpcProvider extends StaticJsonRpcProvider { + constructor(network, apiKey) { + logger.checkAbstract(new.target, UrlJsonRpcProvider); + // Normalize the Network and API Key + network = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["getStatic"])((new.target), "getNetwork")(network); + apiKey = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["getStatic"])((new.target), "getApiKey")(apiKey); + const connection = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["getStatic"])((new.target), "getUrl")(network, apiKey); + super(connection, network); + if (typeof (apiKey) === "string") { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "apiKey", apiKey); + } + else if (apiKey != null) { + Object.keys(apiKey).forEach((key) => { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, key, apiKey[key]); + }); + } + } + _startPending() { + logger.warn("WARNING: API provider does not support pending filters"); + } + isCommunityResource() { + return false; + } + getSigner(address) { + return logger.throwError("API provider does not support signing", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNSUPPORTED_OPERATION, { operation: "getSigner" }); + } + listAccounts() { + return Promise.resolve([]); + } + // Return a defaultApiKey if null, otherwise validate the API key + static getApiKey(apiKey) { + return apiKey; + } + // Returns the url or connection for the given network and API key. The + // API key will have been sanitized by the getApiKey first, so any validation + // or transformations can be done there. + static getUrl(network, apiKey) { + return logger.throwError("not implemented; sub-classes must override getUrl", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.NOT_IMPLEMENTED, { + operation: "getUrl" + }); + } +} +//# sourceMappingURL=url-json-rpc-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/web3-provider.js": +/*!************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/web3-provider.js ***! + \************************************************************************/ +/*! exports provided: Web3Provider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Web3Provider", function() { return Web3Provider; }); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); +/* harmony import */ var _json_rpc_provider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js"); + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); + +let _nextId = 1; +function buildWeb3LegacyFetcher(provider, sendFunc) { + return function (method, params) { + // Metamask complains about eth_sign (and on some versions hangs) + if (method == "eth_sign" && (provider.isMetaMask || provider.isStatus)) { + // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign + method = "personal_sign"; + params = [params[1], params[0]]; + } + const request = { + method: method, + params: params, + id: (_nextId++), + jsonrpc: "2.0" + }; + return new Promise((resolve, reject) => { + sendFunc(request, function (error, result) { + if (error) { + return reject(error); + } + if (result.error) { + const error = new Error(result.error.message); + error.code = result.error.code; + error.data = result.error.data; + return reject(error); + } + resolve(result.result); + }); + }); + }; +} +function buildEip1193Fetcher(provider) { + return function (method, params) { + if (params == null) { + params = []; + } + // Metamask complains about eth_sign (and on some versions hangs) + if (method == "eth_sign" && (provider.isMetaMask || provider.isStatus)) { + // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign + method = "personal_sign"; + params = [params[1], params[0]]; + } + return provider.request({ method, params }); + }; +} +class Web3Provider extends _json_rpc_provider__WEBPACK_IMPORTED_MODULE_3__["JsonRpcProvider"] { + constructor(provider, network) { + logger.checkNew(new.target, Web3Provider); + if (provider == null) { + logger.throwArgumentError("missing provider", "provider", provider); + } + let path = null; + let jsonRpcFetchFunc = null; + let subprovider = null; + if (typeof (provider) === "function") { + path = "unknown:"; + jsonRpcFetchFunc = provider; + } + else { + path = provider.host || provider.path || ""; + if (!path && provider.isMetaMask) { + path = "metamask"; + } + subprovider = provider; + if (provider.request) { + if (path === "") { + path = "eip-1193:"; + } + jsonRpcFetchFunc = buildEip1193Fetcher(provider); + } + else if (provider.sendAsync) { + jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.sendAsync.bind(provider)); + } + else if (provider.send) { + jsonRpcFetchFunc = buildWeb3LegacyFetcher(provider, provider.send.bind(provider)); + } + else { + logger.throwArgumentError("unsupported provider", "provider", provider); + } + if (!path) { + path = "unknown:"; + } + } + super(path, network); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "jsonRpcFetchFunc", jsonRpcFetchFunc); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_0__["defineReadOnly"])(this, "provider", subprovider); + } + send(method, params) { + return this.jsonRpcFetchFunc(method, params); + } +} +//# sourceMappingURL=web3-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/websocket-provider.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/websocket-provider.js ***! + \*****************************************************************************/ +/*! exports provided: WebSocketProvider */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WebSocketProvider", function() { return WebSocketProvider; }); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _json_rpc_provider__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./json-rpc-provider */ "./node_modules/@ethersproject/providers/lib.esm/json-rpc-provider.js"); +/* harmony import */ var _ws__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ws */ "./node_modules/@ethersproject/providers/lib.esm/ws.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"](_version__WEBPACK_IMPORTED_MODULE_5__["version"]); +/** + * Notes: + * + * This provider differs a bit from the polling providers. One main + * difference is how it handles consistency. The polling providers + * will stall responses to ensure a consistent state, while this + * WebSocket provider assumes the connected backend will manage this. + * + * For example, if a polling provider emits an event which indicats + * the event occurred in blockhash XXX, a call to fetch that block by + * its hash XXX, if not present will retry until it is present. This + * can occur when querying a pool of nodes that are mildly out of sync + * with each other. + */ +let NextId = 1; +// For more info about the Real-time Event API see: +// https://geth.ethereum.org/docs/rpc/pubsub +class WebSocketProvider extends _json_rpc_provider__WEBPACK_IMPORTED_MODULE_2__["JsonRpcProvider"] { + constructor(url, network) { + // This will be added in the future; please open an issue to expedite + if (network === "any") { + logger.throwError("WebSocketProvider does not support 'any' network yet", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "network:any" + }); + } + super(url, network); + this._pollingInterval = -1; + this._wsReady = false; + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_websocket", new _ws__WEBPACK_IMPORTED_MODULE_3__["WebSocket"](this.connection.url)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_requests", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_subs", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_subIds", {}); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "_detectNetwork", super.detectNetwork()); + // Stall sending requests until the socket is open... + this._websocket.onopen = () => { + this._wsReady = true; + Object.keys(this._requests).forEach((id) => { + this._websocket.send(this._requests[id].payload); + }); + }; + this._websocket.onmessage = (messageEvent) => { + const data = messageEvent.data; + const result = JSON.parse(data); + if (result.id != null) { + const id = String(result.id); + const request = this._requests[id]; + delete this._requests[id]; + if (result.result !== undefined) { + request.callback(null, result.result); + this.emit("debug", { + action: "response", + request: JSON.parse(request.payload), + response: result.result, + provider: this + }); + } + else { + let error = null; + if (result.error) { + error = new Error(result.error.message || "unknown error"); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(error, "code", result.error.code || null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(error, "response", data); + } + else { + error = new Error("unknown error"); + } + request.callback(error, undefined); + this.emit("debug", { + action: "response", + error: error, + request: JSON.parse(request.payload), + provider: this + }); + } + } + else if (result.method === "eth_subscription") { + // Subscription... + const sub = this._subs[result.params.subscription]; + if (sub) { + //this.emit.apply(this, ); + sub.processFunc(result.params.result); + } + } + else { + console.warn("this should not happen"); + } + }; + // This Provider does not actually poll, but we want to trigger + // poll events for things that depend on them (like stalling for + // block and transaction lookups) + const fauxPoll = setInterval(() => { + this.emit("poll"); + }, 1000); + if (fauxPoll.unref) { + fauxPoll.unref(); + } + } + detectNetwork() { + return this._detectNetwork; + } + get pollingInterval() { + return 0; + } + resetEventsBlock(blockNumber) { + logger.throwError("cannot reset events block on WebSocketProvider", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "resetEventBlock" + }); + } + set pollingInterval(value) { + logger.throwError("cannot set polling interval on WebSocketProvider", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "setPollingInterval" + }); + } + poll() { + return __awaiter(this, void 0, void 0, function* () { + return null; + }); + } + set polling(value) { + if (!value) { + return; + } + logger.throwError("cannot set polling on WebSocketProvider", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "setPolling" + }); + } + send(method, params) { + const rid = NextId++; + return new Promise((resolve, reject) => { + function callback(error, result) { + if (error) { + return reject(error); + } + return resolve(result); + } + const payload = JSON.stringify({ + method: method, + params: params, + id: rid, + jsonrpc: "2.0" + }); + this.emit("debug", { + action: "request", + request: JSON.parse(payload), + provider: this + }); + this._requests[String(rid)] = { callback, payload }; + if (this._wsReady) { + this._websocket.send(payload); + } + }); + } + static defaultUrl() { + return "ws:/\/localhost:8546"; + } + _subscribe(tag, param, processFunc) { + return __awaiter(this, void 0, void 0, function* () { + let subIdPromise = this._subIds[tag]; + if (subIdPromise == null) { + subIdPromise = Promise.all(param).then((param) => { + return this.send("eth_subscribe", param); + }); + this._subIds[tag] = subIdPromise; + } + const subId = yield subIdPromise; + this._subs[subId] = { tag, processFunc }; + }); + } + _startEvent(event) { + switch (event.type) { + case "block": + this._subscribe("block", ["newHeads"], (result) => { + const blockNumber = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(result.number).toNumber(); + this._emitted.block = blockNumber; + this.emit("block", blockNumber); + }); + break; + case "pending": + this._subscribe("pending", ["newPendingTransactions"], (result) => { + this.emit("pending", result); + }); + break; + case "filter": + this._subscribe(event.tag, ["logs", this._getFilter(event.filter)], (result) => { + if (result.removed == null) { + result.removed = false; + } + this.emit(event.filter, this.formatter.filterLog(result)); + }); + break; + case "tx": { + const emitReceipt = (event) => { + const hash = event.hash; + this.getTransactionReceipt(hash).then((receipt) => { + if (!receipt) { + return; + } + this.emit(hash, receipt); + }); + }; + // In case it is already mined + emitReceipt(event); + // To keep things simple, we start up a single newHeads subscription + // to keep an eye out for transactions we are watching for. + // Starting a subscription for an event (i.e. "tx") that is already + // running is (basically) a nop. + this._subscribe("tx", ["newHeads"], (result) => { + this._events.filter((e) => (e.type === "tx")).forEach(emitReceipt); + }); + break; + } + // Nothing is needed + case "debug": + case "poll": + case "willPoll": + case "didPoll": + case "error": + break; + default: + console.log("unhandled:", event); + break; + } + } + _stopEvent(event) { + let tag = event.tag; + if (event.type === "tx") { + // There are remaining transaction event listeners + if (this._events.filter((e) => (e.type === "tx")).length) { + return; + } + tag = "tx"; + } + else if (this.listenerCount(event.event)) { + // There are remaining event listeners + return; + } + const subId = this._subIds[tag]; + if (!subId) { + return; + } + delete this._subIds[tag]; + subId.then((subId) => { + if (!this._subs[subId]) { + return; + } + delete this._subs[subId]; + this.send("eth_unsubscribe", [subId]); + }); + } + destroy() { + return __awaiter(this, void 0, void 0, function* () { + // Wait until we have connected before trying to disconnect + if (this._websocket.readyState === _ws__WEBPACK_IMPORTED_MODULE_3__["WebSocket"].CONNECTING) { + yield (new Promise((resolve) => { + this._websocket.onopen = function () { + resolve(true); + }; + this._websocket.onerror = function () { + resolve(false); + }; + })); + } + // Hangup + // See: https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes + this._websocket.close(1000); + }); + } +} +//# sourceMappingURL=websocket-provider.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/providers/lib.esm/ws.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/providers/lib.esm/ws.js ***! + \*************************************************************/ +/*! exports provided: WebSocket */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WebSocket", function() { return WS; }); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/providers/lib.esm/_version.js"); + + + +let WS = null; +try { + WS = WebSocket; + if (WS == null) { + throw new Error("inject please"); + } +} +catch (error) { + const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"](_version__WEBPACK_IMPORTED_MODULE_1__["version"]); + WS = function () { + logger.throwError("WebSockets not supported in this environment", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_0__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "new WebSocket()" + }); + }; +} +//export default WS; +//module.exports = WS; + +//# sourceMappingURL=ws.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/random/lib.esm/_version.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/random/lib.esm/_version.js ***! + \****************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "random/5.0.8"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/random/lib.esm/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/random/lib.esm/index.js ***! + \*************************************************************/ +/*! exports provided: randomBytes, shuffled */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./random */ "./node_modules/@ethersproject/random/lib.esm/random.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomBytes", function() { return _random__WEBPACK_IMPORTED_MODULE_0__["randomBytes"]; }); + +/* harmony import */ var _shuffle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shuffle */ "./node_modules/@ethersproject/random/lib.esm/shuffle.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shuffled", function() { return _shuffle__WEBPACK_IMPORTED_MODULE_1__["shuffled"]; }); + + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/random/lib.esm/random.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/random/lib.esm/random.js ***! + \**************************************************************/ +/*! exports provided: randomBytes */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "randomBytes", function() { return randomBytes; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/random/lib.esm/_version.js"); + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +let anyGlobal = null; +try { + anyGlobal = window; + if (anyGlobal == null) { + throw new Error("try next"); + } +} +catch (error) { + try { + anyGlobal = global; + if (anyGlobal == null) { + throw new Error("try next"); + } + } + catch (error) { + anyGlobal = {}; + } +} +let crypto = anyGlobal.crypto || anyGlobal.msCrypto; +if (!crypto || !crypto.getRandomValues) { + logger.warn("WARNING: Missing strong random number source"); + crypto = { + getRandomValues: function (buffer) { + return logger.throwError("no secure random source avaialble", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "crypto.getRandomValues" + }); + } + }; +} +function randomBytes(length) { + if (length <= 0 || length > 1024 || (length % 1)) { + logger.throwArgumentError("invalid length", "length", length); + } + const result = new Uint8Array(length); + crypto.getRandomValues(result); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(result); +} +; +//# sourceMappingURL=random.js.map +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../next/dist/compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/@ethersproject/random/lib.esm/shuffle.js": +/*!***************************************************************!*\ + !*** ./node_modules/@ethersproject/random/lib.esm/shuffle.js ***! + \***************************************************************/ +/*! exports provided: shuffled */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffled", function() { return shuffled; }); + +function shuffled(array) { + array = array.slice(); + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + const tmp = array[i]; + array[i] = array[j]; + array[j] = tmp; + } + return array; +} +//# sourceMappingURL=shuffle.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/rlp/lib.esm/_version.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/rlp/lib.esm/_version.js ***! + \*************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "rlp/5.0.8"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/rlp/lib.esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@ethersproject/rlp/lib.esm/index.js ***! + \**********************************************************/ +/*! exports provided: encode, decode */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encode", function() { return encode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decode", function() { return decode; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/rlp/lib.esm/_version.js"); + +//See: https://github.com/ethereum/wiki/wiki/RLP + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +function arrayifyInteger(value) { + const result = []; + while (value) { + result.unshift(value & 0xff); + value >>= 8; + } + return result; +} +function unarrayifyInteger(data, offset, length) { + let result = 0; + for (let i = 0; i < length; i++) { + result = (result * 256) + data[offset + i]; + } + return result; +} +function _encode(object) { + if (Array.isArray(object)) { + let payload = []; + object.forEach(function (child) { + payload = payload.concat(_encode(child)); + }); + if (payload.length <= 55) { + payload.unshift(0xc0 + payload.length); + return payload; + } + const length = arrayifyInteger(payload.length); + length.unshift(0xf7 + length.length); + return length.concat(payload); + } + if (!Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["isBytesLike"])(object)) { + logger.throwArgumentError("RLP object must be BytesLike", "object", object); + } + const data = Array.prototype.slice.call(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(object)); + if (data.length === 1 && data[0] <= 0x7f) { + return data; + } + else if (data.length <= 55) { + data.unshift(0x80 + data.length); + return data; + } + const length = arrayifyInteger(data.length); + length.unshift(0xb7 + length.length); + return length.concat(data); +} +function encode(object) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(_encode(object)); +} +function _decodeChildren(data, offset, childOffset, length) { + const result = []; + while (childOffset < offset + 1 + length) { + const decoded = _decode(data, childOffset); + result.push(decoded.result); + childOffset += decoded.consumed; + if (childOffset > offset + 1 + length) { + logger.throwError("child data too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + } + return { consumed: (1 + length), result: result }; +} +// returns { consumed: number, result: Object } +function _decode(data, offset) { + if (data.length === 0) { + logger.throwError("data too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + // Array with extra length prefix + if (data[offset] >= 0xf8) { + const lengthLength = data[offset] - 0xf7; + if (offset + 1 + lengthLength > data.length) { + logger.throwError("data short segment too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + const length = unarrayifyInteger(data, offset + 1, lengthLength); + if (offset + 1 + lengthLength + length > data.length) { + logger.throwError("data long segment too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + return _decodeChildren(data, offset, offset + 1 + lengthLength, lengthLength + length); + } + else if (data[offset] >= 0xc0) { + const length = data[offset] - 0xc0; + if (offset + 1 + length > data.length) { + logger.throwError("data array too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + return _decodeChildren(data, offset, offset + 1, length); + } + else if (data[offset] >= 0xb8) { + const lengthLength = data[offset] - 0xb7; + if (offset + 1 + lengthLength > data.length) { + logger.throwError("data array too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + const length = unarrayifyInteger(data, offset + 1, lengthLength); + if (offset + 1 + lengthLength + length > data.length) { + logger.throwError("data array too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + const result = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(data.slice(offset + 1 + lengthLength, offset + 1 + lengthLength + length)); + return { consumed: (1 + lengthLength + length), result: result }; + } + else if (data[offset] >= 0x80) { + const length = data[offset] - 0x80; + if (offset + 1 + length > data.length) { + logger.throwError("data too short", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"].errors.BUFFER_OVERRUN, {}); + } + const result = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(data.slice(offset + 1, offset + 1 + length)); + return { consumed: (1 + length), result: result }; + } + return { consumed: 1, result: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(data[offset]) }; +} +function decode(data) { + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(data); + const decoded = _decode(bytes, 0); + if (decoded.consumed !== bytes.length) { + logger.throwArgumentError("invalid rlp data", "data", data); + } + return decoded.result; +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/lib.esm/_version.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/lib.esm/_version.js ***! + \**************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "sha2/5.0.8"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/lib.esm/index.js": +/*!***********************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/lib.esm/index.js ***! + \***********************************************************/ +/*! exports provided: computeHmac, ripemd160, sha256, sha512, SupportedAlgorithm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _sha2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sha2 */ "./node_modules/@ethersproject/sha2/lib.esm/sha2.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeHmac", function() { return _sha2__WEBPACK_IMPORTED_MODULE_0__["computeHmac"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ripemd160", function() { return _sha2__WEBPACK_IMPORTED_MODULE_0__["ripemd160"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sha256", function() { return _sha2__WEBPACK_IMPORTED_MODULE_0__["sha256"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sha512", function() { return _sha2__WEBPACK_IMPORTED_MODULE_0__["sha512"]; }); + +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types */ "./node_modules/@ethersproject/sha2/lib.esm/types.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SupportedAlgorithm", function() { return _types__WEBPACK_IMPORTED_MODULE_1__["SupportedAlgorithm"]; }); + + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/lib.esm/sha2.js": +/*!**********************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/lib.esm/sha2.js ***! + \**********************************************************/ +/*! exports provided: ripemd160, sha256, sha512, computeHmac */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ripemd160", function() { return ripemd160; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sha256", function() { return sha256; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sha512", function() { return sha512; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeHmac", function() { return computeHmac; }); +/* harmony import */ var hash_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! hash.js */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash.js"); +/* harmony import */ var hash_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(hash_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./types */ "./node_modules/@ethersproject/sha2/lib.esm/types.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/sha2/lib.esm/_version.js"); + + +//const _ripemd160 = _hash.ripemd160; + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"](_version__WEBPACK_IMPORTED_MODULE_4__["version"]); +function ripemd160(data) { + return "0x" + (hash_js__WEBPACK_IMPORTED_MODULE_0___default.a.ripemd160().update(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(data)).digest("hex")); +} +function sha256(data) { + return "0x" + (hash_js__WEBPACK_IMPORTED_MODULE_0___default.a.sha256().update(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(data)).digest("hex")); +} +function sha512(data) { + return "0x" + (hash_js__WEBPACK_IMPORTED_MODULE_0___default.a.sha512().update(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(data)).digest("hex")); +} +function computeHmac(algorithm, key, data) { + if (!_types__WEBPACK_IMPORTED_MODULE_2__["SupportedAlgorithm"][algorithm]) { + logger.throwError("unsupported algorithm " + algorithm, _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "hmac", + algorithm: algorithm + }); + } + return "0x" + hash_js__WEBPACK_IMPORTED_MODULE_0___default.a.hmac(hash_js__WEBPACK_IMPORTED_MODULE_0___default.a[algorithm], Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(key)).update(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(data)).digest("hex"); +} +//# sourceMappingURL=sha2.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/lib.esm/types.js": +/*!***********************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/lib.esm/types.js ***! + \***********************************************************/ +/*! exports provided: SupportedAlgorithm */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SupportedAlgorithm", function() { return SupportedAlgorithm; }); +var SupportedAlgorithm; +(function (SupportedAlgorithm) { + SupportedAlgorithm["sha256"] = "sha256"; + SupportedAlgorithm["sha512"] = "sha512"; +})(SupportedAlgorithm || (SupportedAlgorithm = {})); +; +//# sourceMappingURL=types.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash.js ***! + \***************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var hash = exports; + +hash.utils = __webpack_require__(/*! ./hash/utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +hash.common = __webpack_require__(/*! ./hash/common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js"); +hash.sha = __webpack_require__(/*! ./hash/sha */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha.js"); +hash.ripemd = __webpack_require__(/*! ./hash/ripemd */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/ripemd.js"); +hash.hmac = __webpack_require__(/*! ./hash/hmac */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/hmac.js"); + +// Proxy hash functions to the main object +hash.sha1 = hash.sha.sha1; +hash.sha256 = hash.sha.sha256; +hash.sha224 = hash.sha.sha224; +hash.sha384 = hash.sha.sha384; +hash.sha512 = hash.sha.sha512; +hash.ripemd160 = hash.ripemd.ripemd160; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js ***! + \**********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +function BlockHash() { + this.pending = null; + this.pendingTotal = 0; + this.blockSize = this.constructor.blockSize; + this.outSize = this.constructor.outSize; + this.hmacStrength = this.constructor.hmacStrength; + this.padLength = this.constructor.padLength / 8; + this.endian = 'big'; + + this._delta8 = this.blockSize / 8; + this._delta32 = this.blockSize / 32; +} +exports.BlockHash = BlockHash; + +BlockHash.prototype.update = function update(msg, enc) { + // Convert message to array, pad it, and join into 32bit blocks + msg = utils.toArray(msg, enc); + if (!this.pending) + this.pending = msg; + else + this.pending = this.pending.concat(msg); + this.pendingTotal += msg.length; + + // Enough data, try updating + if (this.pending.length >= this._delta8) { + msg = this.pending; + + // Process pending data in blocks + var r = msg.length % this._delta8; + this.pending = msg.slice(msg.length - r, msg.length); + if (this.pending.length === 0) + this.pending = null; + + msg = utils.join32(msg, 0, msg.length - r, this.endian); + for (var i = 0; i < msg.length; i += this._delta32) + this._update(msg, i, i + this._delta32); + } + + return this; +}; + +BlockHash.prototype.digest = function digest(enc) { + this.update(this._pad()); + assert(this.pending === null); + + return this._digest(enc); +}; + +BlockHash.prototype._pad = function pad() { + var len = this.pendingTotal; + var bytes = this._delta8; + var k = bytes - ((len + this.padLength) % bytes); + var res = new Array(k + this.padLength); + res[0] = 0x80; + for (var i = 1; i < k; i++) + res[i] = 0; + + // Append length + len <<= 3; + if (this.endian === 'big') { + for (var t = 8; t < this.padLength; t++) + res[i++] = 0; + + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = (len >>> 24) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = len & 0xff; + } else { + res[i++] = len & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 24) & 0xff; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + + for (t = 8; t < this.padLength; t++) + res[i++] = 0; + } + + return res; +}; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/hmac.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/hmac.js ***! + \********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +function Hmac(hash, key, enc) { + if (!(this instanceof Hmac)) + return new Hmac(hash, key, enc); + this.Hash = hash; + this.blockSize = hash.blockSize / 8; + this.outSize = hash.outSize / 8; + this.inner = null; + this.outer = null; + + this._init(utils.toArray(key, enc)); +} +module.exports = Hmac; + +Hmac.prototype._init = function init(key) { + // Shorten key, if needed + if (key.length > this.blockSize) + key = new this.Hash().update(key).digest(); + assert(key.length <= this.blockSize); + + // Add padding to key + for (var i = key.length; i < this.blockSize; i++) + key.push(0); + + for (i = 0; i < key.length; i++) + key[i] ^= 0x36; + this.inner = new this.Hash().update(key); + + // 0x36 ^ 0x5c = 0x6a + for (i = 0; i < key.length; i++) + key[i] ^= 0x6a; + this.outer = new this.Hash().update(key); +}; + +Hmac.prototype.update = function update(msg, enc) { + this.inner.update(msg, enc); + return this; +}; + +Hmac.prototype.digest = function digest(enc) { + this.outer.update(this.inner.digest()); + return this.outer.digest(enc); +}; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/ripemd.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/ripemd.js ***! + \**********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ./common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js"); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_3 = utils.sum32_3; +var sum32_4 = utils.sum32_4; +var BlockHash = common.BlockHash; + +function RIPEMD160() { + if (!(this instanceof RIPEMD160)) + return new RIPEMD160(); + + BlockHash.call(this); + + this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; + this.endian = 'little'; +} +utils.inherits(RIPEMD160, BlockHash); +exports.ripemd160 = RIPEMD160; + +RIPEMD160.blockSize = 512; +RIPEMD160.outSize = 160; +RIPEMD160.hmacStrength = 192; +RIPEMD160.padLength = 64; + +RIPEMD160.prototype._update = function update(msg, start) { + var A = this.h[0]; + var B = this.h[1]; + var C = this.h[2]; + var D = this.h[3]; + var E = this.h[4]; + var Ah = A; + var Bh = B; + var Ch = C; + var Dh = D; + var Eh = E; + for (var j = 0; j < 80; j++) { + var T = sum32( + rotl32( + sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), + s[j]), + E); + A = E; + E = D; + D = rotl32(C, 10); + C = B; + B = T; + T = sum32( + rotl32( + sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), + sh[j]), + Eh); + Ah = Eh; + Eh = Dh; + Dh = rotl32(Ch, 10); + Ch = Bh; + Bh = T; + } + T = sum32_3(this.h[1], C, Dh); + this.h[1] = sum32_3(this.h[2], D, Eh); + this.h[2] = sum32_3(this.h[3], E, Ah); + this.h[3] = sum32_3(this.h[4], A, Bh); + this.h[4] = sum32_3(this.h[0], B, Ch); + this.h[0] = T; +}; + +RIPEMD160.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'little'); + else + return utils.split32(this.h, 'little'); +}; + +function f(j, x, y, z) { + if (j <= 15) + return x ^ y ^ z; + else if (j <= 31) + return (x & y) | ((~x) & z); + else if (j <= 47) + return (x | (~y)) ^ z; + else if (j <= 63) + return (x & z) | (y & (~z)); + else + return x ^ (y | (~z)); +} + +function K(j) { + if (j <= 15) + return 0x00000000; + else if (j <= 31) + return 0x5a827999; + else if (j <= 47) + return 0x6ed9eba1; + else if (j <= 63) + return 0x8f1bbcdc; + else + return 0xa953fd4e; +} + +function Kh(j) { + if (j <= 15) + return 0x50a28be6; + else if (j <= 31) + return 0x5c4dd124; + else if (j <= 47) + return 0x6d703ef3; + else if (j <= 63) + return 0x7a6d76e9; + else + return 0x00000000; +} + +var r = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +]; + +var rh = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +]; + +var s = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +]; + +var sh = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +]; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha.js ***! + \*******************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.sha1 = __webpack_require__(/*! ./sha/1 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/1.js"); +exports.sha224 = __webpack_require__(/*! ./sha/224 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/224.js"); +exports.sha256 = __webpack_require__(/*! ./sha/256 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/256.js"); +exports.sha384 = __webpack_require__(/*! ./sha/384 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/384.js"); +exports.sha512 = __webpack_require__(/*! ./sha/512 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/512.js"); + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/1.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/1.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ../common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js"); +var shaCommon = __webpack_require__(/*! ./common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/common.js"); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_5 = utils.sum32_5; +var ft_1 = shaCommon.ft_1; +var BlockHash = common.BlockHash; + +var sha1_K = [ + 0x5A827999, 0x6ED9EBA1, + 0x8F1BBCDC, 0xCA62C1D6 +]; + +function SHA1() { + if (!(this instanceof SHA1)) + return new SHA1(); + + BlockHash.call(this); + this.h = [ + 0x67452301, 0xefcdab89, 0x98badcfe, + 0x10325476, 0xc3d2e1f0 ]; + this.W = new Array(80); +} + +utils.inherits(SHA1, BlockHash); +module.exports = SHA1; + +SHA1.blockSize = 512; +SHA1.outSize = 160; +SHA1.hmacStrength = 80; +SHA1.padLength = 64; + +SHA1.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + + for(; i < W.length; i++) + W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + + for (i = 0; i < W.length; i++) { + var s = ~~(i / 20); + var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); + e = d; + d = c; + c = rotl32(b, 30); + b = a; + a = t; + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); +}; + +SHA1.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/224.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/224.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var SHA256 = __webpack_require__(/*! ./256 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/256.js"); + +function SHA224() { + if (!(this instanceof SHA224)) + return new SHA224(); + + SHA256.call(this); + this.h = [ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; +} +utils.inherits(SHA224, SHA256); +module.exports = SHA224; + +SHA224.blockSize = 512; +SHA224.outSize = 224; +SHA224.hmacStrength = 192; +SHA224.padLength = 64; + +SHA224.prototype._digest = function digest(enc) { + // Just truncate output + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 7), 'big'); + else + return utils.split32(this.h.slice(0, 7), 'big'); +}; + + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/256.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/256.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ../common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js"); +var shaCommon = __webpack_require__(/*! ./common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/common.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +var sum32 = utils.sum32; +var sum32_4 = utils.sum32_4; +var sum32_5 = utils.sum32_5; +var ch32 = shaCommon.ch32; +var maj32 = shaCommon.maj32; +var s0_256 = shaCommon.s0_256; +var s1_256 = shaCommon.s1_256; +var g0_256 = shaCommon.g0_256; +var g1_256 = shaCommon.g1_256; + +var BlockHash = common.BlockHash; + +var sha256_K = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; + +function SHA256() { + if (!(this instanceof SHA256)) + return new SHA256(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ]; + this.k = sha256_K; + this.W = new Array(64); +} +utils.inherits(SHA256, BlockHash); +module.exports = SHA256; + +SHA256.blockSize = 512; +SHA256.outSize = 256; +SHA256.hmacStrength = 192; +SHA256.padLength = 64; + +SHA256.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + var f = this.h[5]; + var g = this.h[6]; + var h = this.h[7]; + + assert(this.k.length === W.length); + for (i = 0; i < W.length; i++) { + var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); + var T2 = sum32(s0_256(a), maj32(a, b, c)); + h = g; + g = f; + f = e; + e = sum32(d, T1); + d = c; + c = b; + b = a; + a = sum32(T1, T2); + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + this.h[5] = sum32(this.h[5], f); + this.h[6] = sum32(this.h[6], g); + this.h[7] = sum32(this.h[7], h); +}; + +SHA256.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/384.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/384.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); + +var SHA512 = __webpack_require__(/*! ./512 */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/512.js"); + +function SHA384() { + if (!(this instanceof SHA384)) + return new SHA384(); + + SHA512.call(this); + this.h = [ + 0xcbbb9d5d, 0xc1059ed8, + 0x629a292a, 0x367cd507, + 0x9159015a, 0x3070dd17, + 0x152fecd8, 0xf70e5939, + 0x67332667, 0xffc00b31, + 0x8eb44a87, 0x68581511, + 0xdb0c2e0d, 0x64f98fa7, + 0x47b5481d, 0xbefa4fa4 ]; +} +utils.inherits(SHA384, SHA512); +module.exports = SHA384; + +SHA384.blockSize = 1024; +SHA384.outSize = 384; +SHA384.hmacStrength = 192; +SHA384.padLength = 128; + +SHA384.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 12), 'big'); + else + return utils.split32(this.h.slice(0, 12), 'big'); +}; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/512.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/512.js ***! + \***********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ../common */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/common.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +var rotr64_hi = utils.rotr64_hi; +var rotr64_lo = utils.rotr64_lo; +var shr64_hi = utils.shr64_hi; +var shr64_lo = utils.shr64_lo; +var sum64 = utils.sum64; +var sum64_hi = utils.sum64_hi; +var sum64_lo = utils.sum64_lo; +var sum64_4_hi = utils.sum64_4_hi; +var sum64_4_lo = utils.sum64_4_lo; +var sum64_5_hi = utils.sum64_5_hi; +var sum64_5_lo = utils.sum64_5_lo; + +var BlockHash = common.BlockHash; + +var sha512_K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function SHA512() { + if (!(this instanceof SHA512)) + return new SHA512(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xf3bcc908, + 0xbb67ae85, 0x84caa73b, + 0x3c6ef372, 0xfe94f82b, + 0xa54ff53a, 0x5f1d36f1, + 0x510e527f, 0xade682d1, + 0x9b05688c, 0x2b3e6c1f, + 0x1f83d9ab, 0xfb41bd6b, + 0x5be0cd19, 0x137e2179 ]; + this.k = sha512_K; + this.W = new Array(160); +} +utils.inherits(SHA512, BlockHash); +module.exports = SHA512; + +SHA512.blockSize = 1024; +SHA512.outSize = 512; +SHA512.hmacStrength = 192; +SHA512.padLength = 128; + +SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { + var W = this.W; + + // 32 x 32bit words + for (var i = 0; i < 32; i++) + W[i] = msg[start + i]; + for (; i < W.length; i += 2) { + var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 + var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); + var c1_hi = W[i - 14]; // i - 7 + var c1_lo = W[i - 13]; + var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 + var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); + var c3_hi = W[i - 32]; // i - 16 + var c3_lo = W[i - 31]; + + W[i] = sum64_4_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + W[i + 1] = sum64_4_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + } +}; + +SHA512.prototype._update = function _update(msg, start) { + this._prepareBlock(msg, start); + + var W = this.W; + + var ah = this.h[0]; + var al = this.h[1]; + var bh = this.h[2]; + var bl = this.h[3]; + var ch = this.h[4]; + var cl = this.h[5]; + var dh = this.h[6]; + var dl = this.h[7]; + var eh = this.h[8]; + var el = this.h[9]; + var fh = this.h[10]; + var fl = this.h[11]; + var gh = this.h[12]; + var gl = this.h[13]; + var hh = this.h[14]; + var hl = this.h[15]; + + assert(this.k.length === W.length); + for (var i = 0; i < W.length; i += 2) { + var c0_hi = hh; + var c0_lo = hl; + var c1_hi = s1_512_hi(eh, el); + var c1_lo = s1_512_lo(eh, el); + var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); + var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); + var c3_hi = this.k[i]; + var c3_lo = this.k[i + 1]; + var c4_hi = W[i]; + var c4_lo = W[i + 1]; + + var T1_hi = sum64_5_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + var T1_lo = sum64_5_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + + c0_hi = s0_512_hi(ah, al); + c0_lo = s0_512_lo(ah, al); + c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); + c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + + var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); + var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + + hh = gh; + hl = gl; + + gh = fh; + gl = fl; + + fh = eh; + fl = el; + + eh = sum64_hi(dh, dl, T1_hi, T1_lo); + el = sum64_lo(dl, dl, T1_hi, T1_lo); + + dh = ch; + dl = cl; + + ch = bh; + cl = bl; + + bh = ah; + bl = al; + + ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); + al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); + } + + sum64(this.h, 0, ah, al); + sum64(this.h, 2, bh, bl); + sum64(this.h, 4, ch, cl); + sum64(this.h, 6, dh, dl); + sum64(this.h, 8, eh, el); + sum64(this.h, 10, fh, fl); + sum64(this.h, 12, gh, gl); + sum64(this.h, 14, hh, hl); +}; + +SHA512.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +function ch64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ ((~xh) & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function ch64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ ((~xl) & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 28); + var c1_hi = rotr64_hi(xl, xh, 2); // 34 + var c2_hi = rotr64_hi(xl, xh, 7); // 39 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 28); + var c1_lo = rotr64_lo(xl, xh, 2); // 34 + var c2_lo = rotr64_lo(xl, xh, 7); // 39 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 14); + var c1_hi = rotr64_hi(xh, xl, 18); + var c2_hi = rotr64_hi(xl, xh, 9); // 41 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 14); + var c1_lo = rotr64_lo(xh, xl, 18); + var c2_lo = rotr64_lo(xl, xh, 9); // 41 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 1); + var c1_hi = rotr64_hi(xh, xl, 8); + var c2_hi = shr64_hi(xh, xl, 7); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 1); + var c1_lo = rotr64_lo(xh, xl, 8); + var c2_lo = shr64_lo(xh, xl, 7); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 19); + var c1_hi = rotr64_hi(xl, xh, 29); // 61 + var c2_hi = shr64_hi(xh, xl, 6); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 19); + var c1_lo = rotr64_lo(xl, xh, 29); // 61 + var c2_lo = shr64_lo(xh, xl, 6); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/common.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/sha/common.js ***! + \**************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js"); +var rotr32 = utils.rotr32; + +function ft_1(s, x, y, z) { + if (s === 0) + return ch32(x, y, z); + if (s === 1 || s === 3) + return p32(x, y, z); + if (s === 2) + return maj32(x, y, z); +} +exports.ft_1 = ft_1; + +function ch32(x, y, z) { + return (x & y) ^ ((~x) & z); +} +exports.ch32 = ch32; + +function maj32(x, y, z) { + return (x & y) ^ (x & z) ^ (y & z); +} +exports.maj32 = maj32; + +function p32(x, y, z) { + return x ^ y ^ z; +} +exports.p32 = p32; + +function s0_256(x) { + return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); +} +exports.s0_256 = s0_256; + +function s1_256(x) { + return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); +} +exports.s1_256 = s1_256; + +function g0_256(x) { + return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); +} +exports.g0_256 = g0_256; + +function g1_256(x) { + return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); +} +exports.g1_256 = g1_256; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/@ethersproject/sha2/node_modules/hash.js/lib/hash/utils.js ***! + \*********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); +var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); + +exports.inherits = inherits; + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg === 'string') { + if (!enc) { + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + var hi = c >> 8; + var lo = c & 0xff; + if (hi) + res.push(hi, lo); + else + res.push(lo); + } + } else if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } + } else { + for (i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + } + return res; +} +exports.toArray = toArray; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +exports.toHex = toHex; + +function htonl(w) { + var res = (w >>> 24) | + ((w >>> 8) & 0xff00) | + ((w << 8) & 0xff0000) | + ((w & 0xff) << 24); + return res >>> 0; +} +exports.htonl = htonl; + +function toHex32(msg, endian) { + var res = ''; + for (var i = 0; i < msg.length; i++) { + var w = msg[i]; + if (endian === 'little') + w = htonl(w); + res += zero8(w.toString(16)); + } + return res; +} +exports.toHex32 = toHex32; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +exports.zero2 = zero2; + +function zero8(word) { + if (word.length === 7) + return '0' + word; + else if (word.length === 6) + return '00' + word; + else if (word.length === 5) + return '000' + word; + else if (word.length === 4) + return '0000' + word; + else if (word.length === 3) + return '00000' + word; + else if (word.length === 2) + return '000000' + word; + else if (word.length === 1) + return '0000000' + word; + else + return word; +} +exports.zero8 = zero8; + +function join32(msg, start, end, endian) { + var len = end - start; + assert(len % 4 === 0); + var res = new Array(len / 4); + for (var i = 0, k = start; i < res.length; i++, k += 4) { + var w; + if (endian === 'big') + w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; + else + w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; + res[i] = w >>> 0; + } + return res; +} +exports.join32 = join32; + +function split32(msg, endian) { + var res = new Array(msg.length * 4); + for (var i = 0, k = 0; i < msg.length; i++, k += 4) { + var m = msg[i]; + if (endian === 'big') { + res[k] = m >>> 24; + res[k + 1] = (m >>> 16) & 0xff; + res[k + 2] = (m >>> 8) & 0xff; + res[k + 3] = m & 0xff; + } else { + res[k + 3] = m >>> 24; + res[k + 2] = (m >>> 16) & 0xff; + res[k + 1] = (m >>> 8) & 0xff; + res[k] = m & 0xff; + } + } + return res; +} +exports.split32 = split32; + +function rotr32(w, b) { + return (w >>> b) | (w << (32 - b)); +} +exports.rotr32 = rotr32; + +function rotl32(w, b) { + return (w << b) | (w >>> (32 - b)); +} +exports.rotl32 = rotl32; + +function sum32(a, b) { + return (a + b) >>> 0; +} +exports.sum32 = sum32; + +function sum32_3(a, b, c) { + return (a + b + c) >>> 0; +} +exports.sum32_3 = sum32_3; + +function sum32_4(a, b, c, d) { + return (a + b + c + d) >>> 0; +} +exports.sum32_4 = sum32_4; + +function sum32_5(a, b, c, d, e) { + return (a + b + c + d + e) >>> 0; +} +exports.sum32_5 = sum32_5; + +function sum64(buf, pos, ah, al) { + var bh = buf[pos]; + var bl = buf[pos + 1]; + + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + buf[pos] = hi >>> 0; + buf[pos + 1] = lo; +} +exports.sum64 = sum64; + +function sum64_hi(ah, al, bh, bl) { + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + return hi >>> 0; +} +exports.sum64_hi = sum64_hi; + +function sum64_lo(ah, al, bh, bl) { + var lo = al + bl; + return lo >>> 0; +} +exports.sum64_lo = sum64_lo; + +function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + + var hi = ah + bh + ch + dh + carry; + return hi >>> 0; +} +exports.sum64_4_hi = sum64_4_hi; + +function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { + var lo = al + bl + cl + dl; + return lo >>> 0; +} +exports.sum64_4_lo = sum64_4_lo; + +function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + lo = (lo + el) >>> 0; + carry += lo < el ? 1 : 0; + + var hi = ah + bh + ch + dh + eh + carry; + return hi >>> 0; +} +exports.sum64_5_hi = sum64_5_hi; + +function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var lo = al + bl + cl + dl + el; + + return lo >>> 0; +} +exports.sum64_5_lo = sum64_5_lo; + +function rotr64_hi(ah, al, num) { + var r = (al << (32 - num)) | (ah >>> num); + return r >>> 0; +} +exports.rotr64_hi = rotr64_hi; + +function rotr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.rotr64_lo = rotr64_lo; + +function shr64_hi(ah, al, num) { + return ah >>> num; +} +exports.shr64_hi = shr64_hi; + +function shr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.shr64_lo = shr64_lo; + + +/***/ }), + +/***/ "./node_modules/@ethersproject/signing-key/lib.esm/_version.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ethersproject/signing-key/lib.esm/_version.js ***! + \*********************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "signing-key/5.0.10"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/signing-key/lib.esm/elliptic.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@ethersproject/signing-key/lib.esm/elliptic.js ***! + \*********************************************************************/ +/*! exports provided: EC */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EC", function() { return EC$1; }); +/* harmony import */ var bn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! bn.js */ "./node_modules/bn.js/lib/bn.js"); +/* harmony import */ var bn_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(bn_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var hash_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! hash.js */ "./node_modules/hash.js/lib/hash.js"); +/* harmony import */ var hash_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(hash_js__WEBPACK_IMPORTED_MODULE_1__); + + + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function getDefaultExportFromCjs (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; +} + +function createCommonjsModule(fn, basedir, module) { + return module = { + path: basedir, + exports: {}, + require: function (path, base) { + return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); + } + }, fn(module, module.exports), module.exports; +} + +function getDefaultExportFromNamespaceIfPresent (n) { + return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n; +} + +function getDefaultExportFromNamespaceIfNotNamed (n) { + return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n; +} + +function getAugmentedNamespace(n) { + if (n.__esModule) return n; + var a = Object.defineProperty({}, '__esModule', {value: true}); + Object.keys(n).forEach(function (k) { + var d = Object.getOwnPropertyDescriptor(n, k); + Object.defineProperty(a, k, d.get ? d : { + enumerable: true, + get: function () { + return n[k]; + } + }); + }); + return a; +} + +function commonjsRequire () { + throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); +} + +var minimalisticAssert = assert; + +function assert(val, msg) { + if (!val) + throw new Error(msg || 'Assertion failed'); +} + +assert.equal = function assertEqual(l, r, msg) { + if (l != r) + throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); +}; + +var utils_1 = createCommonjsModule(function (module, exports) { +'use strict'; + +var utils = exports; + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg !== 'string') { + for (var i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + return res; + } + if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (var i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } else { + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + var hi = c >> 8; + var lo = c & 0xff; + if (hi) + res.push(hi, lo); + else + res.push(lo); + } + } + return res; +} +utils.toArray = toArray; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +utils.zero2 = zero2; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +utils.toHex = toHex; + +utils.encode = function encode(arr, enc) { + if (enc === 'hex') + return toHex(arr); + else + return arr; +}; +}); + +var utils_1$1 = createCommonjsModule(function (module, exports) { +'use strict'; + +var utils = exports; + + + + +utils.assert = minimalisticAssert; +utils.toArray = utils_1.toArray; +utils.zero2 = utils_1.zero2; +utils.toHex = utils_1.toHex; +utils.encode = utils_1.encode; + +// Represent num in a w-NAF form +function getNAF(num, w, bits) { + var naf = new Array(Math.max(num.bitLength(), bits) + 1); + naf.fill(0); + + var ws = 1 << (w + 1); + var k = num.clone(); + + for (var i = 0; i < naf.length; i++) { + var z; + var mod = k.andln(ws - 1); + if (k.isOdd()) { + if (mod > (ws >> 1) - 1) + z = (ws >> 1) - mod; + else + z = mod; + k.isubn(z); + } else { + z = 0; + } + + naf[i] = z; + k.iushrn(1); + } + + return naf; +} +utils.getNAF = getNAF; + +// Represent k1, k2 in a Joint Sparse Form +function getJSF(k1, k2) { + var jsf = [ + [], + [], + ]; + + k1 = k1.clone(); + k2 = k2.clone(); + var d1 = 0; + var d2 = 0; + var m8; + while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { + // First phase + var m14 = (k1.andln(3) + d1) & 3; + var m24 = (k2.andln(3) + d2) & 3; + if (m14 === 3) + m14 = -1; + if (m24 === 3) + m24 = -1; + var u1; + if ((m14 & 1) === 0) { + u1 = 0; + } else { + m8 = (k1.andln(7) + d1) & 7; + if ((m8 === 3 || m8 === 5) && m24 === 2) + u1 = -m14; + else + u1 = m14; + } + jsf[0].push(u1); + + var u2; + if ((m24 & 1) === 0) { + u2 = 0; + } else { + m8 = (k2.andln(7) + d2) & 7; + if ((m8 === 3 || m8 === 5) && m14 === 2) + u2 = -m24; + else + u2 = m24; + } + jsf[1].push(u2); + + // Second phase + if (2 * d1 === u1 + 1) + d1 = 1 - d1; + if (2 * d2 === u2 + 1) + d2 = 1 - d2; + k1.iushrn(1); + k2.iushrn(1); + } + + return jsf; +} +utils.getJSF = getJSF; + +function cachedProperty(obj, name, computer) { + var key = '_' + name; + obj.prototype[name] = function cachedProperty() { + return this[key] !== undefined ? this[key] : + this[key] = computer.call(this); + }; +} +utils.cachedProperty = cachedProperty; + +function parseBytes(bytes) { + return typeof bytes === 'string' ? utils.toArray(bytes, 'hex') : + bytes; +} +utils.parseBytes = parseBytes; + +function intFromLE(bytes) { + return new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(bytes, 'hex', 'le'); +} +utils.intFromLE = intFromLE; +}); + +'use strict'; + + + +var getNAF = utils_1$1.getNAF; +var getJSF = utils_1$1.getJSF; +var assert$1 = utils_1$1.assert; + +function BaseCurve(type, conf) { + this.type = type; + this.p = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(conf.p, 16); + + // Use Montgomery, when there is no fast reduction for the prime + this.red = conf.prime ? bn_js__WEBPACK_IMPORTED_MODULE_0___default.a.red(conf.prime) : bn_js__WEBPACK_IMPORTED_MODULE_0___default.a.mont(this.p); + + // Useful for many curves + this.zero = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(0).toRed(this.red); + this.one = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(1).toRed(this.red); + this.two = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(2).toRed(this.red); + + // Curve configuration, optional + this.n = conf.n && new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(conf.n, 16); + this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); + + // Temporary arrays + this._wnafT1 = new Array(4); + this._wnafT2 = new Array(4); + this._wnafT3 = new Array(4); + this._wnafT4 = new Array(4); + + this._bitLength = this.n ? this.n.bitLength() : 0; + + // Generalized Greg Maxwell's trick + var adjustCount = this.n && this.p.div(this.n); + if (!adjustCount || adjustCount.cmpn(100) > 0) { + this.redN = null; + } else { + this._maxwellTrick = true; + this.redN = this.n.toRed(this.red); + } +} +var base = BaseCurve; + +BaseCurve.prototype.point = function point() { + throw new Error('Not implemented'); +}; + +BaseCurve.prototype.validate = function validate() { + throw new Error('Not implemented'); +}; + +BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { + assert$1(p.precomputed); + var doubles = p._getDoubles(); + + var naf = getNAF(k, 1, this._bitLength); + var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); + I /= 3; + + // Translate into more windowed form + var repr = []; + var j; + var nafW; + for (j = 0; j < naf.length; j += doubles.step) { + nafW = 0; + for (var l = j + doubles.step - 1; l >= j; l--) + nafW = (nafW << 1) + naf[l]; + repr.push(nafW); + } + + var a = this.jpoint(null, null, null); + var b = this.jpoint(null, null, null); + for (var i = I; i > 0; i--) { + for (j = 0; j < repr.length; j++) { + nafW = repr[j]; + if (nafW === i) + b = b.mixedAdd(doubles.points[j]); + else if (nafW === -i) + b = b.mixedAdd(doubles.points[j].neg()); + } + a = a.add(b); + } + return a.toP(); +}; + +BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { + var w = 4; + + // Precompute window + var nafPoints = p._getNAFPoints(w); + w = nafPoints.wnd; + var wnd = nafPoints.points; + + // Get NAF form + var naf = getNAF(k, w, this._bitLength); + + // Add `this`*(N+1) for every w-NAF index + var acc = this.jpoint(null, null, null); + for (var i = naf.length - 1; i >= 0; i--) { + // Count zeroes + for (var l = 0; i >= 0 && naf[i] === 0; i--) + l++; + if (i >= 0) + l++; + acc = acc.dblp(l); + + if (i < 0) + break; + var z = naf[i]; + assert$1(z !== 0); + if (p.type === 'affine') { + // J +- P + if (z > 0) + acc = acc.mixedAdd(wnd[(z - 1) >> 1]); + else + acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); + } else { + // J +- J + if (z > 0) + acc = acc.add(wnd[(z - 1) >> 1]); + else + acc = acc.add(wnd[(-z - 1) >> 1].neg()); + } + } + return p.type === 'affine' ? acc.toP() : acc; +}; + +BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, + points, + coeffs, + len, + jacobianResult) { + var wndWidth = this._wnafT1; + var wnd = this._wnafT2; + var naf = this._wnafT3; + + // Fill all arrays + var max = 0; + var i; + var j; + var p; + for (i = 0; i < len; i++) { + p = points[i]; + var nafPoints = p._getNAFPoints(defW); + wndWidth[i] = nafPoints.wnd; + wnd[i] = nafPoints.points; + } + + // Comb small window NAFs + for (i = len - 1; i >= 1; i -= 2) { + var a = i - 1; + var b = i; + if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { + naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength); + naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength); + max = Math.max(naf[a].length, max); + max = Math.max(naf[b].length, max); + continue; + } + + var comb = [ + points[a], /* 1 */ + null, /* 3 */ + null, /* 5 */ + points[b], /* 7 */ + ]; + + // Try to avoid Projective points, if possible + if (points[a].y.cmp(points[b].y) === 0) { + comb[1] = points[a].add(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].add(points[b].neg()); + } else { + comb[1] = points[a].toJ().mixedAdd(points[b]); + comb[2] = points[a].toJ().mixedAdd(points[b].neg()); + } + + var index = [ + -3, /* -1 -1 */ + -1, /* -1 0 */ + -5, /* -1 1 */ + -7, /* 0 -1 */ + 0, /* 0 0 */ + 7, /* 0 1 */ + 5, /* 1 -1 */ + 1, /* 1 0 */ + 3, /* 1 1 */ + ]; + + var jsf = getJSF(coeffs[a], coeffs[b]); + max = Math.max(jsf[0].length, max); + naf[a] = new Array(max); + naf[b] = new Array(max); + for (j = 0; j < max; j++) { + var ja = jsf[0][j] | 0; + var jb = jsf[1][j] | 0; + + naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; + naf[b][j] = 0; + wnd[a] = comb; + } + } + + var acc = this.jpoint(null, null, null); + var tmp = this._wnafT4; + for (i = max; i >= 0; i--) { + var k = 0; + + while (i >= 0) { + var zero = true; + for (j = 0; j < len; j++) { + tmp[j] = naf[j][i] | 0; + if (tmp[j] !== 0) + zero = false; + } + if (!zero) + break; + k++; + i--; + } + if (i >= 0) + k++; + acc = acc.dblp(k); + if (i < 0) + break; + + for (j = 0; j < len; j++) { + var z = tmp[j]; + p; + if (z === 0) + continue; + else if (z > 0) + p = wnd[j][(z - 1) >> 1]; + else if (z < 0) + p = wnd[j][(-z - 1) >> 1].neg(); + + if (p.type === 'affine') + acc = acc.mixedAdd(p); + else + acc = acc.add(p); + } + } + // Zeroify references + for (i = 0; i < len; i++) + wnd[i] = null; + + if (jacobianResult) + return acc; + else + return acc.toP(); +}; + +function BasePoint(curve, type) { + this.curve = curve; + this.type = type; + this.precomputed = null; +} +BaseCurve.BasePoint = BasePoint; + +BasePoint.prototype.eq = function eq(/*other*/) { + throw new Error('Not implemented'); +}; + +BasePoint.prototype.validate = function validate() { + return this.curve.validate(this); +}; + +BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { + bytes = utils_1$1.toArray(bytes, enc); + + var len = this.p.byteLength(); + + // uncompressed, hybrid-odd, hybrid-even + if ((bytes[0] === 0x04 || bytes[0] === 0x06 || bytes[0] === 0x07) && + bytes.length - 1 === 2 * len) { + if (bytes[0] === 0x06) + assert$1(bytes[bytes.length - 1] % 2 === 0); + else if (bytes[0] === 0x07) + assert$1(bytes[bytes.length - 1] % 2 === 1); + + var res = this.point(bytes.slice(1, 1 + len), + bytes.slice(1 + len, 1 + 2 * len)); + + return res; + } else if ((bytes[0] === 0x02 || bytes[0] === 0x03) && + bytes.length - 1 === len) { + return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 0x03); + } + throw new Error('Unknown point format'); +}; + +BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { + return this.encode(enc, true); +}; + +BasePoint.prototype._encode = function _encode(compact) { + var len = this.curve.p.byteLength(); + var x = this.getX().toArray('be', len); + + if (compact) + return [ this.getY().isEven() ? 0x02 : 0x03 ].concat(x); + + return [ 0x04 ].concat(x, this.getY().toArray('be', len)); +}; + +BasePoint.prototype.encode = function encode(enc, compact) { + return utils_1$1.encode(this._encode(compact), enc); +}; + +BasePoint.prototype.precompute = function precompute(power) { + if (this.precomputed) + return this; + + var precomputed = { + doubles: null, + naf: null, + beta: null, + }; + precomputed.naf = this._getNAFPoints(8); + precomputed.doubles = this._getDoubles(4, power); + precomputed.beta = this._getBeta(); + this.precomputed = precomputed; + + return this; +}; + +BasePoint.prototype._hasDoubles = function _hasDoubles(k) { + if (!this.precomputed) + return false; + + var doubles = this.precomputed.doubles; + if (!doubles) + return false; + + return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); +}; + +BasePoint.prototype._getDoubles = function _getDoubles(step, power) { + if (this.precomputed && this.precomputed.doubles) + return this.precomputed.doubles; + + var doubles = [ this ]; + var acc = this; + for (var i = 0; i < power; i += step) { + for (var j = 0; j < step; j++) + acc = acc.dbl(); + doubles.push(acc); + } + return { + step: step, + points: doubles, + }; +}; + +BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { + if (this.precomputed && this.precomputed.naf) + return this.precomputed.naf; + + var res = [ this ]; + var max = (1 << wnd) - 1; + var dbl = max === 1 ? null : this.dbl(); + for (var i = 1; i < max; i++) + res[i] = res[i - 1].add(dbl); + return { + wnd: wnd, + points: res, + }; +}; + +BasePoint.prototype._getBeta = function _getBeta() { + return null; +}; + +BasePoint.prototype.dblp = function dblp(k) { + var r = this; + for (var i = 0; i < k; i++) + r = r.dbl(); + return r; +}; + +var inherits_browser = createCommonjsModule(function (module) { +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + }; +} +}); + +'use strict'; + + + + + + +var assert$2 = utils_1$1.assert; + +function ShortCurve(conf) { + base.call(this, 'short', conf); + + this.a = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(conf.a, 16).toRed(this.red); + this.b = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(conf.b, 16).toRed(this.red); + this.tinv = this.two.redInvm(); + + this.zeroA = this.a.fromRed().cmpn(0) === 0; + this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; + + // If the curve is endomorphic, precalculate beta and lambda + this.endo = this._getEndomorphism(conf); + this._endoWnafT1 = new Array(4); + this._endoWnafT2 = new Array(4); +} +inherits_browser(ShortCurve, base); +var short_1 = ShortCurve; + +ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { + // No efficient endomorphism + if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) + return; + + // Compute beta and lambda, that lambda * P = (beta * Px; Py) + var beta; + var lambda; + if (conf.beta) { + beta = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(conf.beta, 16).toRed(this.red); + } else { + var betas = this._getEndoRoots(this.p); + // Choose the smallest beta + beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; + beta = beta.toRed(this.red); + } + if (conf.lambda) { + lambda = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(conf.lambda, 16); + } else { + // Choose the lambda that is matching selected beta + var lambdas = this._getEndoRoots(this.n); + if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { + lambda = lambdas[0]; + } else { + lambda = lambdas[1]; + assert$2(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); + } + } + + // Get basis vectors, used for balanced length-two representation + var basis; + if (conf.basis) { + basis = conf.basis.map(function(vec) { + return { + a: new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(vec.a, 16), + b: new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(vec.b, 16), + }; + }); + } else { + basis = this._getEndoBasis(lambda); + } + + return { + beta: beta, + lambda: lambda, + basis: basis, + }; +}; + +ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { + // Find roots of for x^2 + x + 1 in F + // Root = (-1 +- Sqrt(-3)) / 2 + // + var red = num === this.p ? this.red : bn_js__WEBPACK_IMPORTED_MODULE_0___default.a.mont(num); + var tinv = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(2).toRed(red).redInvm(); + var ntinv = tinv.redNeg(); + + var s = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(3).toRed(red).redNeg().redSqrt().redMul(tinv); + + var l1 = ntinv.redAdd(s).fromRed(); + var l2 = ntinv.redSub(s).fromRed(); + return [ l1, l2 ]; +}; + +ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { + // aprxSqrt >= sqrt(this.n) + var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); + + // 3.74 + // Run EGCD, until r(L + 1) < aprxSqrt + var u = lambda; + var v = this.n.clone(); + var x1 = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(1); + var y1 = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(0); + var x2 = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(0); + var y2 = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(1); + + // NOTE: all vectors are roots of: a + b * lambda = 0 (mod n) + var a0; + var b0; + // First vector + var a1; + var b1; + // Second vector + var a2; + var b2; + + var prevR; + var i = 0; + var r; + var x; + while (u.cmpn(0) !== 0) { + var q = v.div(u); + r = v.sub(q.mul(u)); + x = x2.sub(q.mul(x1)); + var y = y2.sub(q.mul(y1)); + + if (!a1 && r.cmp(aprxSqrt) < 0) { + a0 = prevR.neg(); + b0 = x1; + a1 = r.neg(); + b1 = x; + } else if (a1 && ++i === 2) { + break; + } + prevR = r; + + v = u; + u = r; + x2 = x1; + x1 = x; + y2 = y1; + y1 = y; + } + a2 = r.neg(); + b2 = x; + + var len1 = a1.sqr().add(b1.sqr()); + var len2 = a2.sqr().add(b2.sqr()); + if (len2.cmp(len1) >= 0) { + a2 = a0; + b2 = b0; + } + + // Normalize signs + if (a1.negative) { + a1 = a1.neg(); + b1 = b1.neg(); + } + if (a2.negative) { + a2 = a2.neg(); + b2 = b2.neg(); + } + + return [ + { a: a1, b: b1 }, + { a: a2, b: b2 }, + ]; +}; + +ShortCurve.prototype._endoSplit = function _endoSplit(k) { + var basis = this.endo.basis; + var v1 = basis[0]; + var v2 = basis[1]; + + var c1 = v2.b.mul(k).divRound(this.n); + var c2 = v1.b.neg().mul(k).divRound(this.n); + + var p1 = c1.mul(v1.a); + var p2 = c2.mul(v2.a); + var q1 = c1.mul(v1.b); + var q2 = c2.mul(v2.b); + + // Calculate answer + var k1 = k.sub(p1).sub(p2); + var k2 = q1.add(q2).neg(); + return { k1: k1, k2: k2 }; +}; + +ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { + x = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(x, 16); + if (!x.red) + x = x.toRed(this.red); + + var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); + var y = y2.redSqrt(); + if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) + throw new Error('invalid point'); + + // XXX Is there any way to tell if the number is odd without converting it + // to non-red form? + var isOdd = y.fromRed().isOdd(); + if (odd && !isOdd || !odd && isOdd) + y = y.redNeg(); + + return this.point(x, y); +}; + +ShortCurve.prototype.validate = function validate(point) { + if (point.inf) + return true; + + var x = point.x; + var y = point.y; + + var ax = this.a.redMul(x); + var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); + return y.redSqr().redISub(rhs).cmpn(0) === 0; +}; + +ShortCurve.prototype._endoWnafMulAdd = + function _endoWnafMulAdd(points, coeffs, jacobianResult) { + var npoints = this._endoWnafT1; + var ncoeffs = this._endoWnafT2; + for (var i = 0; i < points.length; i++) { + var split = this._endoSplit(coeffs[i]); + var p = points[i]; + var beta = p._getBeta(); + + if (split.k1.negative) { + split.k1.ineg(); + p = p.neg(true); + } + if (split.k2.negative) { + split.k2.ineg(); + beta = beta.neg(true); + } + + npoints[i * 2] = p; + npoints[i * 2 + 1] = beta; + ncoeffs[i * 2] = split.k1; + ncoeffs[i * 2 + 1] = split.k2; + } + var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); + + // Clean-up references to points and coefficients + for (var j = 0; j < i * 2; j++) { + npoints[j] = null; + ncoeffs[j] = null; + } + return res; + }; + +function Point(curve, x, y, isRed) { + base.BasePoint.call(this, curve, 'affine'); + if (x === null && y === null) { + this.x = null; + this.y = null; + this.inf = true; + } else { + this.x = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(x, 16); + this.y = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(y, 16); + // Force redgomery representation when loading from JSON + if (isRed) { + this.x.forceRed(this.curve.red); + this.y.forceRed(this.curve.red); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + this.inf = false; + } +} +inherits_browser(Point, base.BasePoint); + +ShortCurve.prototype.point = function point(x, y, isRed) { + return new Point(this, x, y, isRed); +}; + +ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { + return Point.fromJSON(this, obj, red); +}; + +Point.prototype._getBeta = function _getBeta() { + if (!this.curve.endo) + return; + + var pre = this.precomputed; + if (pre && pre.beta) + return pre.beta; + + var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); + if (pre) { + var curve = this.curve; + var endoMul = function(p) { + return curve.point(p.x.redMul(curve.endo.beta), p.y); + }; + pre.beta = beta; + beta.precomputed = { + beta: null, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(endoMul), + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(endoMul), + }, + }; + } + return beta; +}; + +Point.prototype.toJSON = function toJSON() { + if (!this.precomputed) + return [ this.x, this.y ]; + + return [ this.x, this.y, this.precomputed && { + doubles: this.precomputed.doubles && { + step: this.precomputed.doubles.step, + points: this.precomputed.doubles.points.slice(1), + }, + naf: this.precomputed.naf && { + wnd: this.precomputed.naf.wnd, + points: this.precomputed.naf.points.slice(1), + }, + } ]; +}; + +Point.fromJSON = function fromJSON(curve, obj, red) { + if (typeof obj === 'string') + obj = JSON.parse(obj); + var res = curve.point(obj[0], obj[1], red); + if (!obj[2]) + return res; + + function obj2point(obj) { + return curve.point(obj[0], obj[1], red); + } + + var pre = obj[2]; + res.precomputed = { + beta: null, + doubles: pre.doubles && { + step: pre.doubles.step, + points: [ res ].concat(pre.doubles.points.map(obj2point)), + }, + naf: pre.naf && { + wnd: pre.naf.wnd, + points: [ res ].concat(pre.naf.points.map(obj2point)), + }, + }; + return res; +}; + +Point.prototype.inspect = function inspect() { + if (this.isInfinity()) + return '<EC Point Infinity>'; + return '<EC Point x: ' + this.x.fromRed().toString(16, 2) + + ' y: ' + this.y.fromRed().toString(16, 2) + '>'; +}; + +Point.prototype.isInfinity = function isInfinity() { + return this.inf; +}; + +Point.prototype.add = function add(p) { + // O + P = P + if (this.inf) + return p; + + // P + O = P + if (p.inf) + return this; + + // P + P = 2P + if (this.eq(p)) + return this.dbl(); + + // P + (-P) = O + if (this.neg().eq(p)) + return this.curve.point(null, null); + + // P + Q = O + if (this.x.cmp(p.x) === 0) + return this.curve.point(null, null); + + var c = this.y.redSub(p.y); + if (c.cmpn(0) !== 0) + c = c.redMul(this.x.redSub(p.x).redInvm()); + var nx = c.redSqr().redISub(this.x).redISub(p.x); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.dbl = function dbl() { + if (this.inf) + return this; + + // 2P = O + var ys1 = this.y.redAdd(this.y); + if (ys1.cmpn(0) === 0) + return this.curve.point(null, null); + + var a = this.curve.a; + + var x2 = this.x.redSqr(); + var dyinv = ys1.redInvm(); + var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); + + var nx = c.redSqr().redISub(this.x.redAdd(this.x)); + var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); + return this.curve.point(nx, ny); +}; + +Point.prototype.getX = function getX() { + return this.x.fromRed(); +}; + +Point.prototype.getY = function getY() { + return this.y.fromRed(); +}; + +Point.prototype.mul = function mul(k) { + k = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(k, 16); + if (this.isInfinity()) + return this; + else if (this._hasDoubles(k)) + return this.curve._fixedNafMul(this, k); + else if (this.curve.endo) + return this.curve._endoWnafMulAdd([ this ], [ k ]); + else + return this.curve._wnafMul(this, k); +}; + +Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2); +}; + +Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { + var points = [ this, p2 ]; + var coeffs = [ k1, k2 ]; + if (this.curve.endo) + return this.curve._endoWnafMulAdd(points, coeffs, true); + else + return this.curve._wnafMulAdd(1, points, coeffs, 2, true); +}; + +Point.prototype.eq = function eq(p) { + return this === p || + this.inf === p.inf && + (this.inf || this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0); +}; + +Point.prototype.neg = function neg(_precompute) { + if (this.inf) + return this; + + var res = this.curve.point(this.x, this.y.redNeg()); + if (_precompute && this.precomputed) { + var pre = this.precomputed; + var negate = function(p) { + return p.neg(); + }; + res.precomputed = { + naf: pre.naf && { + wnd: pre.naf.wnd, + points: pre.naf.points.map(negate), + }, + doubles: pre.doubles && { + step: pre.doubles.step, + points: pre.doubles.points.map(negate), + }, + }; + } + return res; +}; + +Point.prototype.toJ = function toJ() { + if (this.inf) + return this.curve.jpoint(null, null, null); + + var res = this.curve.jpoint(this.x, this.y, this.curve.one); + return res; +}; + +function JPoint(curve, x, y, z) { + base.BasePoint.call(this, curve, 'jacobian'); + if (x === null && y === null && z === null) { + this.x = this.curve.one; + this.y = this.curve.one; + this.z = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(0); + } else { + this.x = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(x, 16); + this.y = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(y, 16); + this.z = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(z, 16); + } + if (!this.x.red) + this.x = this.x.toRed(this.curve.red); + if (!this.y.red) + this.y = this.y.toRed(this.curve.red); + if (!this.z.red) + this.z = this.z.toRed(this.curve.red); + + this.zOne = this.z === this.curve.one; +} +inherits_browser(JPoint, base.BasePoint); + +ShortCurve.prototype.jpoint = function jpoint(x, y, z) { + return new JPoint(this, x, y, z); +}; + +JPoint.prototype.toP = function toP() { + if (this.isInfinity()) + return this.curve.point(null, null); + + var zinv = this.z.redInvm(); + var zinv2 = zinv.redSqr(); + var ax = this.x.redMul(zinv2); + var ay = this.y.redMul(zinv2).redMul(zinv); + + return this.curve.point(ax, ay); +}; + +JPoint.prototype.neg = function neg() { + return this.curve.jpoint(this.x, this.y.redNeg(), this.z); +}; + +JPoint.prototype.add = function add(p) { + // O + P = P + if (this.isInfinity()) + return p; + + // P + O = P + if (p.isInfinity()) + return this; + + // 12M + 4S + 7A + var pz2 = p.z.redSqr(); + var z2 = this.z.redSqr(); + var u1 = this.x.redMul(pz2); + var u2 = p.x.redMul(z2); + var s1 = this.y.redMul(pz2.redMul(p.z)); + var s2 = p.y.redMul(z2.redMul(this.z)); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(p.z).redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mixedAdd = function mixedAdd(p) { + // O + P = P + if (this.isInfinity()) + return p.toJ(); + + // P + O = P + if (p.isInfinity()) + return this; + + // 8M + 3S + 7A + var z2 = this.z.redSqr(); + var u1 = this.x; + var u2 = p.x.redMul(z2); + var s1 = this.y; + var s2 = p.y.redMul(z2).redMul(this.z); + + var h = u1.redSub(u2); + var r = s1.redSub(s2); + if (h.cmpn(0) === 0) { + if (r.cmpn(0) !== 0) + return this.curve.jpoint(null, null, null); + else + return this.dbl(); + } + + var h2 = h.redSqr(); + var h3 = h2.redMul(h); + var v = u1.redMul(h2); + + var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); + var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); + var nz = this.z.redMul(h); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.dblp = function dblp(pow) { + if (pow === 0) + return this; + if (this.isInfinity()) + return this; + if (!pow) + return this.dbl(); + + var i; + if (this.curve.zeroA || this.curve.threeA) { + var r = this; + for (i = 0; i < pow; i++) + r = r.dbl(); + return r; + } + + // 1M + 2S + 1A + N * (4S + 5M + 8A) + // N = 1 => 6M + 6S + 9A + var a = this.curve.a; + var tinv = this.curve.tinv; + + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + // Reuse results + var jyd = jy.redAdd(jy); + for (i = 0; i < pow; i++) { + var jx2 = jx.redSqr(); + var jyd2 = jyd.redSqr(); + var jyd4 = jyd2.redSqr(); + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var t1 = jx.redMul(jyd2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + var dny = c.redMul(t2); + dny = dny.redIAdd(dny).redISub(jyd4); + var nz = jyd.redMul(jz); + if (i + 1 < pow) + jz4 = jz4.redMul(jyd4); + + jx = nx; + jz = nz; + jyd = dny; + } + + return this.curve.jpoint(jx, jyd.redMul(tinv), jz); +}; + +JPoint.prototype.dbl = function dbl() { + if (this.isInfinity()) + return this; + + if (this.curve.zeroA) + return this._zeroDbl(); + else if (this.curve.threeA) + return this._threeDbl(); + else + return this._dbl(); +}; + +JPoint.prototype._zeroDbl = function _zeroDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 14A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // T = M ^ 2 - 2*S + var t = m.redSqr().redISub(s).redISub(s); + + // 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2*Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html + // #doubling-dbl-2009-l + // 2M + 5S + 13A + + // A = X1^2 + var a = this.x.redSqr(); + // B = Y1^2 + var b = this.y.redSqr(); + // C = B^2 + var c = b.redSqr(); + // D = 2 * ((X1 + B)^2 - A - C) + var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); + d = d.redIAdd(d); + // E = 3 * A + var e = a.redAdd(a).redIAdd(a); + // F = E^2 + var f = e.redSqr(); + + // 8 * C + var c8 = c.redIAdd(c); + c8 = c8.redIAdd(c8); + c8 = c8.redIAdd(c8); + + // X3 = F - 2 * D + nx = f.redISub(d).redISub(d); + // Y3 = E * (D - X3) - 8 * C + ny = e.redMul(d.redISub(nx)).redISub(c8); + // Z3 = 2 * Y1 * Z1 + nz = this.y.redMul(this.z); + nz = nz.redIAdd(nz); + } + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype._threeDbl = function _threeDbl() { + var nx; + var ny; + var nz; + // Z = 1 + if (this.zOne) { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html + // #doubling-mdbl-2007-bl + // 1M + 5S + 15A + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // S = 2 * ((X1 + YY)^2 - XX - YYYY) + var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + s = s.redIAdd(s); + // M = 3 * XX + a + var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); + // T = M^2 - 2 * S + var t = m.redSqr().redISub(s).redISub(s); + // X3 = T + nx = t; + // Y3 = M * (S - T) - 8 * YYYY + var yyyy8 = yyyy.redIAdd(yyyy); + yyyy8 = yyyy8.redIAdd(yyyy8); + yyyy8 = yyyy8.redIAdd(yyyy8); + ny = m.redMul(s.redISub(t)).redISub(yyyy8); + // Z3 = 2 * Y1 + nz = this.y.redAdd(this.y); + } else { + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b + // 3M + 5S + + // delta = Z1^2 + var delta = this.z.redSqr(); + // gamma = Y1^2 + var gamma = this.y.redSqr(); + // beta = X1 * gamma + var beta = this.x.redMul(gamma); + // alpha = 3 * (X1 - delta) * (X1 + delta) + var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); + alpha = alpha.redAdd(alpha).redIAdd(alpha); + // X3 = alpha^2 - 8 * beta + var beta4 = beta.redIAdd(beta); + beta4 = beta4.redIAdd(beta4); + var beta8 = beta4.redAdd(beta4); + nx = alpha.redSqr().redISub(beta8); + // Z3 = (Y1 + Z1)^2 - gamma - delta + nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); + // Y3 = alpha * (4 * beta - X3) - 8 * gamma^2 + var ggamma8 = gamma.redSqr(); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ggamma8 = ggamma8.redIAdd(ggamma8); + ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); + } + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype._dbl = function _dbl() { + var a = this.curve.a; + + // 4M + 6S + 10A + var jx = this.x; + var jy = this.y; + var jz = this.z; + var jz4 = jz.redSqr().redSqr(); + + var jx2 = jx.redSqr(); + var jy2 = jy.redSqr(); + + var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); + + var jxd4 = jx.redAdd(jx); + jxd4 = jxd4.redIAdd(jxd4); + var t1 = jxd4.redMul(jy2); + var nx = c.redSqr().redISub(t1.redAdd(t1)); + var t2 = t1.redISub(nx); + + var jyd8 = jy2.redSqr(); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + jyd8 = jyd8.redIAdd(jyd8); + var ny = c.redMul(t2).redISub(jyd8); + var nz = jy.redAdd(jy).redMul(jz); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.trpl = function trpl() { + if (!this.curve.zeroA) + return this.dbl().add(this); + + // hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#tripling-tpl-2007-bl + // 5M + 10S + ... + + // XX = X1^2 + var xx = this.x.redSqr(); + // YY = Y1^2 + var yy = this.y.redSqr(); + // ZZ = Z1^2 + var zz = this.z.redSqr(); + // YYYY = YY^2 + var yyyy = yy.redSqr(); + // M = 3 * XX + a * ZZ2; a = 0 + var m = xx.redAdd(xx).redIAdd(xx); + // MM = M^2 + var mm = m.redSqr(); + // E = 6 * ((X1 + YY)^2 - XX - YYYY) - MM + var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); + e = e.redIAdd(e); + e = e.redAdd(e).redIAdd(e); + e = e.redISub(mm); + // EE = E^2 + var ee = e.redSqr(); + // T = 16*YYYY + var t = yyyy.redIAdd(yyyy); + t = t.redIAdd(t); + t = t.redIAdd(t); + t = t.redIAdd(t); + // U = (M + E)^2 - MM - EE - T + var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); + // X3 = 4 * (X1 * EE - 4 * YY * U) + var yyu4 = yy.redMul(u); + yyu4 = yyu4.redIAdd(yyu4); + yyu4 = yyu4.redIAdd(yyu4); + var nx = this.x.redMul(ee).redISub(yyu4); + nx = nx.redIAdd(nx); + nx = nx.redIAdd(nx); + // Y3 = 8 * Y1 * (U * (T - U) - E * EE) + var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + ny = ny.redIAdd(ny); + // Z3 = (Z1 + E)^2 - ZZ - EE + var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); + + return this.curve.jpoint(nx, ny, nz); +}; + +JPoint.prototype.mul = function mul(k, kbase) { + k = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(k, kbase); + + return this.curve._wnafMul(this, k); +}; + +JPoint.prototype.eq = function eq(p) { + if (p.type === 'affine') + return this.eq(p.toJ()); + + if (this === p) + return true; + + // x1 * z2^2 == x2 * z1^2 + var z2 = this.z.redSqr(); + var pz2 = p.z.redSqr(); + if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) + return false; + + // y1 * z2^3 == y2 * z1^3 + var z3 = z2.redMul(this.z); + var pz3 = pz2.redMul(p.z); + return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; +}; + +JPoint.prototype.eqXToP = function eqXToP(x) { + var zs = this.z.redSqr(); + var rx = x.toRed(this.curve.red).redMul(zs); + if (this.x.cmp(rx) === 0) + return true; + + var xc = x.clone(); + var t = this.curve.redN.redMul(zs); + for (;;) { + xc.iadd(this.curve.n); + if (xc.cmp(this.curve.p) >= 0) + return false; + + rx.redIAdd(t); + if (this.x.cmp(rx) === 0) + return true; + } +}; + +JPoint.prototype.inspect = function inspect() { + if (this.isInfinity()) + return '<EC JPoint Infinity>'; + return '<EC JPoint x: ' + this.x.toString(16, 2) + + ' y: ' + this.y.toString(16, 2) + + ' z: ' + this.z.toString(16, 2) + '>'; +}; + +JPoint.prototype.isInfinity = function isInfinity() { + // XXX This code assumes that zero is always zero in red + return this.z.cmpn(0) === 0; +}; + +var curve_1 = createCommonjsModule(function (module, exports) { +'use strict'; + +var curve = exports; + +curve.base = base; +curve.short = short_1; +curve.mont = /*RicMoo:ethers:require(./mont)*/(null); +curve.edwards = /*RicMoo:ethers:require(./edwards)*/(null); +}); + +var curves_1 = createCommonjsModule(function (module, exports) { +'use strict'; + +var curves = exports; + + + + + +var assert = utils_1$1.assert; + +function PresetCurve(options) { + if (options.type === 'short') + this.curve = new curve_1.short(options); + else if (options.type === 'edwards') + this.curve = new curve_1.edwards(options); + else + this.curve = new curve_1.mont(options); + this.g = this.curve.g; + this.n = this.curve.n; + this.hash = options.hash; + + assert(this.g.validate(), 'Invalid curve'); + assert(this.g.mul(this.n).isInfinity(), 'Invalid curve, G*N != O'); +} +curves.PresetCurve = PresetCurve; + +function defineCurve(name, options) { + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + get: function() { + var curve = new PresetCurve(options); + Object.defineProperty(curves, name, { + configurable: true, + enumerable: true, + value: curve, + }); + return curve; + }, + }); +} + +defineCurve('p192', { + type: 'short', + prime: 'p192', + p: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc', + b: '64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1', + n: 'ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha256, + gRed: false, + g: [ + '188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012', + '07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811', + ], +}); + +defineCurve('p224', { + type: 'short', + prime: 'p224', + p: 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001', + a: 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe', + b: 'b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4', + n: 'ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha256, + gRed: false, + g: [ + 'b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21', + 'bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34', + ], +}); + +defineCurve('p256', { + type: 'short', + prime: null, + p: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff', + a: 'ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc', + b: '5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b', + n: 'ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha256, + gRed: false, + g: [ + '6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296', + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5', + ], +}); + +defineCurve('p384', { + type: 'short', + prime: null, + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 ffffffff', + a: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'fffffffe ffffffff 00000000 00000000 fffffffc', + b: 'b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f ' + + '5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef', + n: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 ' + + 'f4372ddf 581a0db2 48b0a77a ecec196a ccc52973', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha384, + gRed: false, + g: [ + 'aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 ' + + '5502f25d bf55296c 3a545e38 72760ab7', + '3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 ' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f', + ], +}); + +defineCurve('p521', { + type: 'short', + prime: null, + p: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff', + a: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff ffffffff ffffffff fffffffc', + b: '00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b ' + + '99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd ' + + '3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00', + n: '000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ' + + 'ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 ' + + 'f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha512, + gRed: false, + g: [ + '000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 ' + + '053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 ' + + 'a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66', + '00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 ' + + '579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 ' + + '3fad0761 353c7086 a272c240 88be9476 9fd16650', + ], +}); + +defineCurve('curve25519', { + type: 'mont', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '76d06', + b: '1', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha256, + gRed: false, + g: [ + '9', + ], +}); + +defineCurve('ed25519', { + type: 'edwards', + prime: 'p25519', + p: '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed', + a: '-1', + c: '1', + // -121665 * (121666^(-1)) (mod P) + d: '52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3', + n: '1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha256, + gRed: false, + g: [ + '216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a', + + // 4/5 + '6666666666666666666666666666666666666666666666666666666666666658', + ], +}); + +var pre; +try { + pre = /*RicMoo:ethers:require(./precomputed/secp256k1)*/(null).crash(); +} catch (e) { + pre = undefined; +} + +defineCurve('secp256k1', { + type: 'short', + prime: 'k256', + p: 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f', + a: '0', + b: '7', + n: 'ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141', + h: '1', + hash: hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.sha256, + + // Precomputed endomorphism + beta: '7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee', + lambda: '5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72', + basis: [ + { + a: '3086d221a7d46bcde86c90e49284eb15', + b: '-e4437ed6010e88286f547fa90abfe4c3', + }, + { + a: '114ca50f7a8e2f3f657c1108d9d44cfd8', + b: '3086d221a7d46bcde86c90e49284eb15', + }, + ], + + gRed: false, + g: [ + '79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798', + '483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8', + pre, + ], +}); +}); + +'use strict'; + + + + + +function HmacDRBG(options) { + if (!(this instanceof HmacDRBG)) + return new HmacDRBG(options); + this.hash = options.hash; + this.predResist = !!options.predResist; + + this.outLen = this.hash.outSize; + this.minEntropy = options.minEntropy || this.hash.hmacStrength; + + this._reseed = null; + this.reseedInterval = null; + this.K = null; + this.V = null; + + var entropy = utils_1.toArray(options.entropy, options.entropyEnc || 'hex'); + var nonce = utils_1.toArray(options.nonce, options.nonceEnc || 'hex'); + var pers = utils_1.toArray(options.pers, options.persEnc || 'hex'); + minimalisticAssert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + this._init(entropy, nonce, pers); +} +var hmacDrbg = HmacDRBG; + +HmacDRBG.prototype._init = function init(entropy, nonce, pers) { + var seed = entropy.concat(nonce).concat(pers); + + this.K = new Array(this.outLen / 8); + this.V = new Array(this.outLen / 8); + for (var i = 0; i < this.V.length; i++) { + this.K[i] = 0x00; + this.V[i] = 0x01; + } + + this._update(seed); + this._reseed = 1; + this.reseedInterval = 0x1000000000000; // 2^48 +}; + +HmacDRBG.prototype._hmac = function hmac() { + return new hash_js__WEBPACK_IMPORTED_MODULE_1___default.a.hmac(this.hash, this.K); +}; + +HmacDRBG.prototype._update = function update(seed) { + var kmac = this._hmac() + .update(this.V) + .update([ 0x00 ]); + if (seed) + kmac = kmac.update(seed); + this.K = kmac.digest(); + this.V = this._hmac().update(this.V).digest(); + if (!seed) + return; + + this.K = this._hmac() + .update(this.V) + .update([ 0x01 ]) + .update(seed) + .digest(); + this.V = this._hmac().update(this.V).digest(); +}; + +HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { + // Optional entropy enc + if (typeof entropyEnc !== 'string') { + addEnc = add; + add = entropyEnc; + entropyEnc = null; + } + + entropy = utils_1.toArray(entropy, entropyEnc); + add = utils_1.toArray(add, addEnc); + + minimalisticAssert(entropy.length >= (this.minEntropy / 8), + 'Not enough entropy. Minimum is: ' + this.minEntropy + ' bits'); + + this._update(entropy.concat(add || [])); + this._reseed = 1; +}; + +HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { + if (this._reseed > this.reseedInterval) + throw new Error('Reseed is required'); + + // Optional encoding + if (typeof enc !== 'string') { + addEnc = add; + add = enc; + enc = null; + } + + // Optional additional data + if (add) { + add = utils_1.toArray(add, addEnc || 'hex'); + this._update(add); + } + + var temp = []; + while (temp.length < len) { + this.V = this._hmac().update(this.V).digest(); + temp = temp.concat(this.V); + } + + var res = temp.slice(0, len); + this._update(add); + this._reseed++; + return utils_1.encode(res, enc); +}; + +'use strict'; + + + +var assert$3 = utils_1$1.assert; + +function KeyPair(ec, options) { + this.ec = ec; + this.priv = null; + this.pub = null; + + // KeyPair(ec, { priv: ..., pub: ... }) + if (options.priv) + this._importPrivate(options.priv, options.privEnc); + if (options.pub) + this._importPublic(options.pub, options.pubEnc); +} +var key = KeyPair; + +KeyPair.fromPublic = function fromPublic(ec, pub, enc) { + if (pub instanceof KeyPair) + return pub; + + return new KeyPair(ec, { + pub: pub, + pubEnc: enc, + }); +}; + +KeyPair.fromPrivate = function fromPrivate(ec, priv, enc) { + if (priv instanceof KeyPair) + return priv; + + return new KeyPair(ec, { + priv: priv, + privEnc: enc, + }); +}; + +KeyPair.prototype.validate = function validate() { + var pub = this.getPublic(); + + if (pub.isInfinity()) + return { result: false, reason: 'Invalid public key' }; + if (!pub.validate()) + return { result: false, reason: 'Public key is not a point' }; + if (!pub.mul(this.ec.curve.n).isInfinity()) + return { result: false, reason: 'Public key * N != O' }; + + return { result: true, reason: null }; +}; + +KeyPair.prototype.getPublic = function getPublic(compact, enc) { + // compact is optional argument + if (typeof compact === 'string') { + enc = compact; + compact = null; + } + + if (!this.pub) + this.pub = this.ec.g.mul(this.priv); + + if (!enc) + return this.pub; + + return this.pub.encode(enc, compact); +}; + +KeyPair.prototype.getPrivate = function getPrivate(enc) { + if (enc === 'hex') + return this.priv.toString(16, 2); + else + return this.priv; +}; + +KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { + this.priv = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(key, enc || 16); + + // Ensure that the priv won't be bigger than n, otherwise we may fail + // in fixed multiplication method + this.priv = this.priv.umod(this.ec.curve.n); +}; + +KeyPair.prototype._importPublic = function _importPublic(key, enc) { + if (key.x || key.y) { + // Montgomery points only have an `x` coordinate. + // Weierstrass/Edwards points on the other hand have both `x` and + // `y` coordinates. + if (this.ec.curve.type === 'mont') { + assert$3(key.x, 'Need x coordinate'); + } else if (this.ec.curve.type === 'short' || + this.ec.curve.type === 'edwards') { + assert$3(key.x && key.y, 'Need both x and y coordinate'); + } + this.pub = this.ec.curve.point(key.x, key.y); + return; + } + this.pub = this.ec.curve.decodePoint(key, enc); +}; + +// ECDH +KeyPair.prototype.derive = function derive(pub) { + if(!pub.validate()) { + assert$3(pub.validate(), 'public point not validated'); + } + return pub.mul(this.priv).getX(); +}; + +// ECDSA +KeyPair.prototype.sign = function sign(msg, enc, options) { + return this.ec.sign(msg, this, enc, options); +}; + +KeyPair.prototype.verify = function verify(msg, signature) { + return this.ec.verify(msg, signature, this); +}; + +KeyPair.prototype.inspect = function inspect() { + return '<Key priv: ' + (this.priv && this.priv.toString(16, 2)) + + ' pub: ' + (this.pub && this.pub.inspect()) + ' >'; +}; + +'use strict'; + + + + +var assert$4 = utils_1$1.assert; + +function Signature(options, enc) { + if (options instanceof Signature) + return options; + + if (this._importDER(options, enc)) + return; + + assert$4(options.r && options.s, 'Signature without r or s'); + this.r = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(options.r, 16); + this.s = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(options.s, 16); + if (options.recoveryParam === undefined) + this.recoveryParam = null; + else + this.recoveryParam = options.recoveryParam; +} +var signature = Signature; + +function Position() { + this.place = 0; +} + +function getLength(buf, p) { + var initial = buf[p.place++]; + if (!(initial & 0x80)) { + return initial; + } + var octetLen = initial & 0xf; + + // Indefinite length or overflow + if (octetLen === 0 || octetLen > 4) { + return false; + } + + var val = 0; + for (var i = 0, off = p.place; i < octetLen; i++, off++) { + val <<= 8; + val |= buf[off]; + val >>>= 0; + } + + // Leading zeroes + if (val <= 0x7f) { + return false; + } + + p.place = off; + return val; +} + +function rmPadding(buf) { + var i = 0; + var len = buf.length - 1; + while (!buf[i] && !(buf[i + 1] & 0x80) && i < len) { + i++; + } + if (i === 0) { + return buf; + } + return buf.slice(i); +} + +Signature.prototype._importDER = function _importDER(data, enc) { + data = utils_1$1.toArray(data, enc); + var p = new Position(); + if (data[p.place++] !== 0x30) { + return false; + } + var len = getLength(data, p); + if (len === false) { + return false; + } + if ((len + p.place) !== data.length) { + return false; + } + if (data[p.place++] !== 0x02) { + return false; + } + var rlen = getLength(data, p); + if (rlen === false) { + return false; + } + var r = data.slice(p.place, rlen + p.place); + p.place += rlen; + if (data[p.place++] !== 0x02) { + return false; + } + var slen = getLength(data, p); + if (slen === false) { + return false; + } + if (data.length !== slen + p.place) { + return false; + } + var s = data.slice(p.place, slen + p.place); + if (r[0] === 0) { + if (r[1] & 0x80) { + r = r.slice(1); + } else { + // Leading zeroes + return false; + } + } + if (s[0] === 0) { + if (s[1] & 0x80) { + s = s.slice(1); + } else { + // Leading zeroes + return false; + } + } + + this.r = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(r); + this.s = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(s); + this.recoveryParam = null; + + return true; +}; + +function constructLength(arr, len) { + if (len < 0x80) { + arr.push(len); + return; + } + var octets = 1 + (Math.log(len) / Math.LN2 >>> 3); + arr.push(octets | 0x80); + while (--octets) { + arr.push((len >>> (octets << 3)) & 0xff); + } + arr.push(len); +} + +Signature.prototype.toDER = function toDER(enc) { + var r = this.r.toArray(); + var s = this.s.toArray(); + + // Pad values + if (r[0] & 0x80) + r = [ 0 ].concat(r); + // Pad values + if (s[0] & 0x80) + s = [ 0 ].concat(s); + + r = rmPadding(r); + s = rmPadding(s); + + while (!s[0] && !(s[1] & 0x80)) { + s = s.slice(1); + } + var arr = [ 0x02 ]; + constructLength(arr, r.length); + arr = arr.concat(r); + arr.push(0x02); + constructLength(arr, s.length); + var backHalf = arr.concat(s); + var res = [ 0x30 ]; + constructLength(res, backHalf.length); + res = res.concat(backHalf); + return utils_1$1.encode(res, enc); +}; + +'use strict'; + + + + + +var rand = /*RicMoo:ethers:require(brorand)*/(function() { throw new Error('unsupported'); }); +var assert$5 = utils_1$1.assert; + + + + +function EC(options) { + if (!(this instanceof EC)) + return new EC(options); + + // Shortcut `elliptic.ec(curve-name)` + if (typeof options === 'string') { + assert$5(Object.prototype.hasOwnProperty.call(curves_1, options), + 'Unknown curve ' + options); + + options = curves_1[options]; + } + + // Shortcut for `elliptic.ec(elliptic.curves.curveName)` + if (options instanceof curves_1.PresetCurve) + options = { curve: options }; + + this.curve = options.curve.curve; + this.n = this.curve.n; + this.nh = this.n.ushrn(1); + this.g = this.curve.g; + + // Point on curve + this.g = options.curve.g; + this.g.precompute(options.curve.n.bitLength() + 1); + + // Hash for function for DRBG + this.hash = options.hash || options.curve.hash; +} +var ec = EC; + +EC.prototype.keyPair = function keyPair(options) { + return new key(this, options); +}; + +EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { + return key.fromPrivate(this, priv, enc); +}; + +EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { + return key.fromPublic(this, pub, enc); +}; + +EC.prototype.genKeyPair = function genKeyPair(options) { + if (!options) + options = {}; + + // Instantiate Hmac_DRBG + var drbg = new hmacDrbg({ + hash: this.hash, + pers: options.pers, + persEnc: options.persEnc || 'utf8', + entropy: options.entropy || rand(this.hash.hmacStrength), + entropyEnc: options.entropy && options.entropyEnc || 'utf8', + nonce: this.n.toArray(), + }); + + var bytes = this.n.byteLength(); + var ns2 = this.n.sub(new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(2)); + for (;;) { + var priv = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(drbg.generate(bytes)); + if (priv.cmp(ns2) > 0) + continue; + + priv.iaddn(1); + return this.keyFromPrivate(priv); + } +}; + +EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) { + var delta = msg.byteLength() * 8 - this.n.bitLength(); + if (delta > 0) + msg = msg.ushrn(delta); + if (!truncOnly && msg.cmp(this.n) >= 0) + return msg.sub(this.n); + else + return msg; +}; + +EC.prototype.sign = function sign(msg, key, enc, options) { + if (typeof enc === 'object') { + options = enc; + enc = null; + } + if (!options) + options = {}; + + key = this.keyFromPrivate(key, enc); + msg = this._truncateToN(new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(msg, 16)); + + // Zero-extend key to provide enough entropy + var bytes = this.n.byteLength(); + var bkey = key.getPrivate().toArray('be', bytes); + + // Zero-extend nonce to have the same byte size as N + var nonce = msg.toArray('be', bytes); + + // Instantiate Hmac_DRBG + var drbg = new hmacDrbg({ + hash: this.hash, + entropy: bkey, + nonce: nonce, + pers: options.pers, + persEnc: options.persEnc || 'utf8', + }); + + // Number of bytes to generate + var ns1 = this.n.sub(new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(1)); + + for (var iter = 0; ; iter++) { + var k = options.k ? + options.k(iter) : + new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(drbg.generate(this.n.byteLength())); + k = this._truncateToN(k, true); + if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) + continue; + + var kp = this.g.mul(k); + if (kp.isInfinity()) + continue; + + var kpX = kp.getX(); + var r = kpX.umod(this.n); + if (r.cmpn(0) === 0) + continue; + + var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); + s = s.umod(this.n); + if (s.cmpn(0) === 0) + continue; + + var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | + (kpX.cmp(r) !== 0 ? 2 : 0); + + // Use complement of `s`, if it is > `n / 2` + if (options.canonical && s.cmp(this.nh) > 0) { + s = this.n.sub(s); + recoveryParam ^= 1; + } + + return new signature({ r: r, s: s, recoveryParam: recoveryParam }); + } +}; + +EC.prototype.verify = function verify(msg, signature$1, key, enc) { + msg = this._truncateToN(new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(msg, 16)); + key = this.keyFromPublic(key, enc); + signature$1 = new signature(signature$1, 'hex'); + + // Perform primitive values validation + var r = signature$1.r; + var s = signature$1.s; + if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) + return false; + if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) + return false; + + // Validate signature + var sinv = s.invm(this.n); + var u1 = sinv.mul(msg).umod(this.n); + var u2 = sinv.mul(r).umod(this.n); + var p; + + if (!this.curve._maxwellTrick) { + p = this.g.mulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + return p.getX().umod(this.n).cmp(r) === 0; + } + + // NOTE: Greg Maxwell's trick, inspired by: + // https://git.io/vad3K + + p = this.g.jmulAdd(u1, key.getPublic(), u2); + if (p.isInfinity()) + return false; + + // Compare `p.x` of Jacobian point with `r`, + // this will do `p.x == r * p.z^2` instead of multiplying `p.x` by the + // inverse of `p.z^2` + return p.eqXToP(r); +}; + +EC.prototype.recoverPubKey = function(msg, signature$1, j, enc) { + assert$5((3 & j) === j, 'The recovery param is more than two bits'); + signature$1 = new signature(signature$1, enc); + + var n = this.n; + var e = new bn_js__WEBPACK_IMPORTED_MODULE_0___default.a(msg); + var r = signature$1.r; + var s = signature$1.s; + + // A set LSB signifies that the y-coordinate is odd + var isYOdd = j & 1; + var isSecondKey = j >> 1; + if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) + throw new Error('Unable to find sencond key candinate'); + + // 1.1. Let x = r + jn. + if (isSecondKey) + r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); + else + r = this.curve.pointFromX(r, isYOdd); + + var rInv = signature$1.r.invm(n); + var s1 = n.sub(e).mul(rInv).umod(n); + var s2 = s.mul(rInv).umod(n); + + // 1.6.1 Compute Q = r^-1 (sR - eG) + // Q = r^-1 (sR + -eG) + return this.g.mulAdd(s1, r, s2); +}; + +EC.prototype.getKeyRecoveryParam = function(e, signature$1, Q, enc) { + signature$1 = new signature(signature$1, enc); + if (signature$1.recoveryParam !== null) + return signature$1.recoveryParam; + + for (var i = 0; i < 4; i++) { + var Qprime; + try { + Qprime = this.recoverPubKey(e, signature$1, i); + } catch (e) { + continue; + } + + if (Qprime.eq(Q)) + return i; + } + throw new Error('Unable to find valid recovery factor'); +}; + +var elliptic_1 = createCommonjsModule(function (module, exports) { +'use strict'; + +var elliptic = exports; + +elliptic.version = /*RicMoo:ethers*/{ version: "6.5.4" }.version; +elliptic.utils = utils_1$1; +elliptic.rand = /*RicMoo:ethers:require(brorand)*/(function() { throw new Error('unsupported'); }); +elliptic.curve = curve_1; +elliptic.curves = curves_1; + +// Protocols +elliptic.ec = ec; +elliptic.eddsa = /*RicMoo:ethers:require(./elliptic/eddsa)*/(null); +}); + +var EC$1 = elliptic_1.ec; + + +//# sourceMappingURL=browser-elliptic.js.map + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../next/dist/compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/@ethersproject/signing-key/lib.esm/index.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/signing-key/lib.esm/index.js ***! + \******************************************************************/ +/*! exports provided: SigningKey, recoverPublicKey, computePublicKey */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SigningKey", function() { return SigningKey; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "recoverPublicKey", function() { return recoverPublicKey; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computePublicKey", function() { return computePublicKey; }); +/* harmony import */ var _elliptic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./elliptic */ "./node_modules/@ethersproject/signing-key/lib.esm/elliptic.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/signing-key/lib.esm/_version.js"); + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_3__["Logger"](_version__WEBPACK_IMPORTED_MODULE_4__["version"]); +let _curve = null; +function getCurve() { + if (!_curve) { + _curve = new _elliptic__WEBPACK_IMPORTED_MODULE_0__["EC"]("secp256k1"); + } + return _curve; +} +class SigningKey { + constructor(privateKey) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "curve", "secp256k1"); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "privateKey", Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(privateKey)); + const keyPair = getCurve().keyFromPrivate(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(this.privateKey)); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "publicKey", "0x" + keyPair.getPublic(false, "hex")); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "compressedPublicKey", "0x" + keyPair.getPublic(true, "hex")); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["defineReadOnly"])(this, "_isSigningKey", true); + } + _addPoint(other) { + const p0 = getCurve().keyFromPublic(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(this.publicKey)); + const p1 = getCurve().keyFromPublic(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(other)); + return "0x" + p0.pub.add(p1.pub).encodeCompressed("hex"); + } + signDigest(digest) { + const keyPair = getCurve().keyFromPrivate(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(this.privateKey)); + const digestBytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(digest); + if (digestBytes.length !== 32) { + logger.throwArgumentError("bad digest length", "digest", digest); + } + const signature = keyPair.sign(digestBytes, { canonical: true }); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["splitSignature"])({ + recoveryParam: signature.recoveryParam, + r: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexZeroPad"])("0x" + signature.r.toString(16), 32), + s: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexZeroPad"])("0x" + signature.s.toString(16), 32), + }); + } + computeSharedSecret(otherKey) { + const keyPair = getCurve().keyFromPrivate(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(this.privateKey)); + const otherKeyPair = getCurve().keyFromPublic(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(computePublicKey(otherKey))); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexZeroPad"])("0x" + keyPair.derive(otherKeyPair.getPublic()).toString(16), 32); + } + static isSigningKey(value) { + return !!(value && value._isSigningKey); + } +} +function recoverPublicKey(digest, signature) { + const sig = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["splitSignature"])(signature); + const rs = { r: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(sig.r), s: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(sig.s) }; + return "0x" + getCurve().recoverPubKey(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(digest), rs, sig.recoveryParam).encode("hex", false); +} +function computePublicKey(key, compressed) { + const bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(key); + if (bytes.length === 32) { + const signingKey = new SigningKey(bytes); + if (compressed) { + return "0x" + getCurve().keyFromPrivate(bytes).getPublic(true, "hex"); + } + return signingKey.publicKey; + } + else if (bytes.length === 33) { + if (compressed) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(bytes); + } + return "0x" + getCurve().keyFromPublic(bytes).getPublic(false, "hex"); + } + else if (bytes.length === 65) { + if (!compressed) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(bytes); + } + return "0x" + getCurve().keyFromPublic(bytes).getPublic(true, "hex"); + } + return logger.throwArgumentError("invalid public or private key", "key", "[REDACTED]"); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/solidity/lib.esm/index.js": +/*!***************************************************************!*\ + !*** ./node_modules/@ethersproject/solidity/lib.esm/index.js ***! + \***************************************************************/ +/*! exports provided: pack, keccak256, sha256 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pack", function() { return pack; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keccak256", function() { return keccak256; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sha256", function() { return sha256; }); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/sha2 */ "./node_modules/@ethersproject/sha2/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); + + + + + + +const regexBytes = new RegExp("^bytes([0-9]+)$"); +const regexNumber = new RegExp("^(u?int)([0-9]*)$"); +const regexArray = new RegExp("^(.*)\\[([0-9]*)\\]$"); +const Zeros = "0000000000000000000000000000000000000000000000000000000000000000"; +function _pack(type, value, isArray) { + switch (type) { + case "address": + if (isArray) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["zeroPad"])(value, 32); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(value); + case "string": + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_4__["toUtf8Bytes"])(value); + case "bytes": + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(value); + case "bool": + value = (value ? "0x01" : "0x00"); + if (isArray) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["zeroPad"])(value, 32); + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(value); + } + let match = type.match(regexNumber); + if (match) { + //let signed = (match[1] === "int") + let size = parseInt(match[2] || "256"); + if ((match[2] && String(size) !== match[2]) || (size % 8 !== 0) || size === 0 || size > 256) { + throw new Error("invalid number type - " + type); + } + if (isArray) { + size = 256; + } + value = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["BigNumber"].from(value).toTwos(size); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["zeroPad"])(value, size / 8); + } + match = type.match(regexBytes); + if (match) { + const size = parseInt(match[1]); + if (String(size) !== match[1] || size === 0 || size > 32) { + throw new Error("invalid bytes type - " + type); + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(value).byteLength !== size) { + throw new Error("invalid value for " + type); + } + if (isArray) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])((value + Zeros).substring(0, 66)); + } + return value; + } + match = type.match(regexArray); + if (match && Array.isArray(value)) { + const baseType = match[1]; + const count = parseInt(match[2] || String(value.length)); + if (count != value.length) { + throw new Error("invalid value for " + type); + } + const result = []; + value.forEach(function (value) { + result.push(_pack(baseType, value, true)); + }); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["concat"])(result); + } + throw new Error("invalid type - " + type); +} +// @TODO: Array Enum +function pack(types, values) { + if (types.length != values.length) { + throw new Error("type/value count mismatch"); + } + const tight = []; + types.forEach(function (type, index) { + tight.push(_pack(type, values[index])); + }); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["concat"])(tight)); +} +function keccak256(types, values) { + return Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_2__["keccak256"])(pack(types, values)); +} +function sha256(types, values) { + return Object(_ethersproject_sha2__WEBPACK_IMPORTED_MODULE_3__["sha256"])(pack(types, values)); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/strings/lib.esm/_version.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@ethersproject/strings/lib.esm/_version.js ***! + \*****************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "strings/5.0.9"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/strings/lib.esm/bytes32.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/strings/lib.esm/bytes32.js ***! + \****************************************************************/ +/*! exports provided: formatBytes32String, parseBytes32String */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatBytes32String", function() { return formatBytes32String; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseBytes32String", function() { return parseBytes32String; }); +/* harmony import */ var _ethersproject_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/constants */ "./node_modules/@ethersproject/constants/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _utf8__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utf8 */ "./node_modules/@ethersproject/strings/lib.esm/utf8.js"); + + + + +function formatBytes32String(text) { + // Get the bytes + const bytes = Object(_utf8__WEBPACK_IMPORTED_MODULE_2__["toUtf8Bytes"])(text); + // Check we have room for null-termination + if (bytes.length > 31) { + throw new Error("bytes32 string must be less than 32 bytes"); + } + // Zero-pad (implicitly null-terminates) + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["concat"])([bytes, _ethersproject_constants__WEBPACK_IMPORTED_MODULE_0__["HashZero"]]).slice(0, 32)); +} +function parseBytes32String(bytes) { + const data = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["arrayify"])(bytes); + // Must be 32 bytes with a null-termination + if (data.length !== 32) { + throw new Error("invalid bytes32 - not 32 bytes long"); + } + if (data[31] !== 0) { + throw new Error("invalid bytes32 string - no null terminator"); + } + // Find the null termination + let length = 31; + while (data[length - 1] === 0) { + length--; + } + // Determine the string value + return Object(_utf8__WEBPACK_IMPORTED_MODULE_2__["toUtf8String"])(data.slice(0, length)); +} +//# sourceMappingURL=bytes32.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/strings/lib.esm/idna.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/strings/lib.esm/idna.js ***! + \*************************************************************/ +/*! exports provided: _nameprepTableA1, _nameprepTableB2, _nameprepTableC, nameprep */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_nameprepTableA1", function() { return _nameprepTableA1; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_nameprepTableB2", function() { return _nameprepTableB2; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_nameprepTableC", function() { return _nameprepTableC; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nameprep", function() { return nameprep; }); +/* harmony import */ var _utf8__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utf8 */ "./node_modules/@ethersproject/strings/lib.esm/utf8.js"); + + +function bytes2(data) { + if ((data.length % 4) !== 0) { + throw new Error("bad data"); + } + let result = []; + for (let i = 0; i < data.length; i += 4) { + result.push(parseInt(data.substring(i, i + 4), 16)); + } + return result; +} +function createTable(data, func) { + if (!func) { + func = function (value) { return [parseInt(value, 16)]; }; + } + let lo = 0; + let result = {}; + data.split(",").forEach((pair) => { + let comps = pair.split(":"); + lo += parseInt(comps[0], 16); + result[lo] = func(comps[1]); + }); + return result; +} +function createRangeTable(data) { + let hi = 0; + return data.split(",").map((v) => { + let comps = v.split("-"); + if (comps.length === 1) { + comps[1] = "0"; + } + else if (comps[1] === "") { + comps[1] = "1"; + } + let lo = hi + parseInt(comps[0], 16); + hi = parseInt(comps[1], 16); + return { l: lo, h: hi }; + }); +} +function matchMap(value, ranges) { + let lo = 0; + for (let i = 0; i < ranges.length; i++) { + let range = ranges[i]; + lo += range.l; + if (value >= lo && value <= lo + range.h && ((value - lo) % (range.d || 1)) === 0) { + if (range.e && range.e.indexOf(value - lo) !== -1) { + continue; + } + return range; + } + } + return null; +} +const Table_A_1_ranges = createRangeTable("221,13-1b,5f-,40-10,51-f,11-3,3-3,2-2,2-4,8,2,15,2d,28-8,88,48,27-,3-5,11-20,27-,8,28,3-5,12,18,b-a,1c-4,6-16,2-d,2-2,2,1b-4,17-9,8f-,10,f,1f-2,1c-34,33-14e,4,36-,13-,6-2,1a-f,4,9-,3-,17,8,2-2,5-,2,8-,3-,4-8,2-3,3,6-,16-6,2-,7-3,3-,17,8,3,3,3-,2,6-3,3-,4-a,5,2-6,10-b,4,8,2,4,17,8,3,6-,b,4,4-,2-e,2-4,b-10,4,9-,3-,17,8,3-,5-,9-2,3-,4-7,3-3,3,4-3,c-10,3,7-2,4,5-2,3,2,3-2,3-2,4-2,9,4-3,6-2,4,5-8,2-e,d-d,4,9,4,18,b,6-3,8,4,5-6,3-8,3-3,b-11,3,9,4,18,b,6-3,8,4,5-6,3-6,2,3-3,b-11,3,9,4,18,11-3,7-,4,5-8,2-7,3-3,b-11,3,13-2,19,a,2-,8-2,2-3,7,2,9-11,4-b,3b-3,1e-24,3,2-,3,2-,2-5,5,8,4,2,2-,3,e,4-,6,2,7-,b-,3-21,49,23-5,1c-3,9,25,10-,2-2f,23,6,3,8-2,5-5,1b-45,27-9,2a-,2-3,5b-4,45-4,53-5,8,40,2,5-,8,2,5-,28,2,5-,20,2,5-,8,2,5-,8,8,18,20,2,5-,8,28,14-5,1d-22,56-b,277-8,1e-2,52-e,e,8-a,18-8,15-b,e,4,3-b,5e-2,b-15,10,b-5,59-7,2b-555,9d-3,5b-5,17-,7-,27-,7-,9,2,2,2,20-,36,10,f-,7,14-,4,a,54-3,2-6,6-5,9-,1c-10,13-1d,1c-14,3c-,10-6,32-b,240-30,28-18,c-14,a0,115-,3,66-,b-76,5,5-,1d,24,2,5-2,2,8-,35-2,19,f-10,1d-3,311-37f,1b,5a-b,d7-19,d-3,41,57-,68-4,29-3,5f,29-37,2e-2,25-c,2c-2,4e-3,30,78-3,64-,20,19b7-49,51a7-59,48e-2,38-738,2ba5-5b,222f-,3c-94,8-b,6-4,1b,6,2,3,3,6d-20,16e-f,41-,37-7,2e-2,11-f,5-b,18-,b,14,5-3,6,88-,2,bf-2,7-,7-,7-,4-2,8,8-9,8-2ff,20,5-b,1c-b4,27-,27-cbb1,f7-9,28-2,b5-221,56,48,3-,2-,3-,5,d,2,5,3,42,5-,9,8,1d,5,6,2-2,8,153-3,123-3,33-27fd,a6da-5128,21f-5df,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3-fffd,3,2-1d,61-ff7d"); +// @TODO: Make this relative... +const Table_B_1_flags = "ad,34f,1806,180b,180c,180d,200b,200c,200d,2060,feff".split(",").map((v) => parseInt(v, 16)); +const Table_B_2_ranges = [ + { h: 25, s: 32, l: 65 }, + { h: 30, s: 32, e: [23], l: 127 }, + { h: 54, s: 1, e: [48], l: 64, d: 2 }, + { h: 14, s: 1, l: 57, d: 2 }, + { h: 44, s: 1, l: 17, d: 2 }, + { h: 10, s: 1, e: [2, 6, 8], l: 61, d: 2 }, + { h: 16, s: 1, l: 68, d: 2 }, + { h: 84, s: 1, e: [18, 24, 66], l: 19, d: 2 }, + { h: 26, s: 32, e: [17], l: 435 }, + { h: 22, s: 1, l: 71, d: 2 }, + { h: 15, s: 80, l: 40 }, + { h: 31, s: 32, l: 16 }, + { h: 32, s: 1, l: 80, d: 2 }, + { h: 52, s: 1, l: 42, d: 2 }, + { h: 12, s: 1, l: 55, d: 2 }, + { h: 40, s: 1, e: [38], l: 15, d: 2 }, + { h: 14, s: 1, l: 48, d: 2 }, + { h: 37, s: 48, l: 49 }, + { h: 148, s: 1, l: 6351, d: 2 }, + { h: 88, s: 1, l: 160, d: 2 }, + { h: 15, s: 16, l: 704 }, + { h: 25, s: 26, l: 854 }, + { h: 25, s: 32, l: 55915 }, + { h: 37, s: 40, l: 1247 }, + { h: 25, s: -119711, l: 53248 }, + { h: 25, s: -119763, l: 52 }, + { h: 25, s: -119815, l: 52 }, + { h: 25, s: -119867, e: [1, 4, 5, 7, 8, 11, 12, 17], l: 52 }, + { h: 25, s: -119919, l: 52 }, + { h: 24, s: -119971, e: [2, 7, 8, 17], l: 52 }, + { h: 24, s: -120023, e: [2, 7, 13, 15, 16, 17], l: 52 }, + { h: 25, s: -120075, l: 52 }, + { h: 25, s: -120127, l: 52 }, + { h: 25, s: -120179, l: 52 }, + { h: 25, s: -120231, l: 52 }, + { h: 25, s: -120283, l: 52 }, + { h: 25, s: -120335, l: 52 }, + { h: 24, s: -119543, e: [17], l: 56 }, + { h: 24, s: -119601, e: [17], l: 58 }, + { h: 24, s: -119659, e: [17], l: 58 }, + { h: 24, s: -119717, e: [17], l: 58 }, + { h: 24, s: -119775, e: [17], l: 58 } +]; +const Table_B_2_lut_abs = createTable("b5:3bc,c3:ff,7:73,2:253,5:254,3:256,1:257,5:259,1:25b,3:260,1:263,2:269,1:268,5:26f,1:272,2:275,7:280,3:283,5:288,3:28a,1:28b,5:292,3f:195,1:1bf,29:19e,125:3b9,8b:3b2,1:3b8,1:3c5,3:3c6,1:3c0,1a:3ba,1:3c1,1:3c3,2:3b8,1:3b5,1bc9:3b9,1c:1f76,1:1f77,f:1f7a,1:1f7b,d:1f78,1:1f79,1:1f7c,1:1f7d,107:63,5:25b,4:68,1:68,1:68,3:69,1:69,1:6c,3:6e,4:70,1:71,1:72,1:72,1:72,7:7a,2:3c9,2:7a,2:6b,1:e5,1:62,1:63,3:65,1:66,2:6d,b:3b3,1:3c0,6:64,1b574:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3,20:3b8,1a:3c3"); +const Table_B_2_lut_rel = createTable("179:1,2:1,2:1,5:1,2:1,a:4f,a:1,8:1,2:1,2:1,3:1,5:1,3:1,4:1,2:1,3:1,4:1,8:2,1:1,2:2,1:1,2:2,27:2,195:26,2:25,1:25,1:25,2:40,2:3f,1:3f,33:1,11:-6,1:-9,1ac7:-3a,6d:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,b:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,c:-8,2:-8,2:-8,2:-8,9:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,1:-8,49:-8,1:-8,1:-4a,1:-4a,d:-56,1:-56,1:-56,1:-56,d:-8,1:-8,f:-8,1:-8,3:-7"); +const Table_B_2_complex = createTable("df:00730073,51:00690307,19:02BC006E,a7:006A030C,18a:002003B9,16:03B903080301,20:03C503080301,1d7:05650582,190f:00680331,1:00740308,1:0077030A,1:0079030A,1:006102BE,b6:03C50313,2:03C503130300,2:03C503130301,2:03C503130342,2a:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F0003B9,1:1F0103B9,1:1F0203B9,1:1F0303B9,1:1F0403B9,1:1F0503B9,1:1F0603B9,1:1F0703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F2003B9,1:1F2103B9,1:1F2203B9,1:1F2303B9,1:1F2403B9,1:1F2503B9,1:1F2603B9,1:1F2703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,1:1F6003B9,1:1F6103B9,1:1F6203B9,1:1F6303B9,1:1F6403B9,1:1F6503B9,1:1F6603B9,1:1F6703B9,3:1F7003B9,1:03B103B9,1:03AC03B9,2:03B10342,1:03B1034203B9,5:03B103B9,6:1F7403B9,1:03B703B9,1:03AE03B9,2:03B70342,1:03B7034203B9,5:03B703B9,6:03B903080300,1:03B903080301,3:03B90342,1:03B903080342,b:03C503080300,1:03C503080301,1:03C10313,2:03C50342,1:03C503080342,b:1F7C03B9,1:03C903B9,1:03CE03B9,2:03C90342,1:03C9034203B9,5:03C903B9,ac:00720073,5b:00B00063,6:00B00066,d:006E006F,a:0073006D,1:00740065006C,1:0074006D,124f:006800700061,2:00610075,2:006F0076,b:00700061,1:006E0061,1:03BC0061,1:006D0061,1:006B0061,1:006B0062,1:006D0062,1:00670062,3:00700066,1:006E0066,1:03BC0066,4:0068007A,1:006B0068007A,1:006D0068007A,1:00670068007A,1:00740068007A,15:00700061,1:006B00700061,1:006D00700061,1:006700700061,8:00700076,1:006E0076,1:03BC0076,1:006D0076,1:006B0076,1:006D0076,1:00700077,1:006E0077,1:03BC0077,1:006D0077,1:006B0077,1:006D0077,1:006B03C9,1:006D03C9,2:00620071,3:00632215006B0067,1:0063006F002E,1:00640062,1:00670079,2:00680070,2:006B006B,1:006B006D,9:00700068,2:00700070006D,1:00700072,2:00730076,1:00770062,c723:00660066,1:00660069,1:0066006C,1:006600660069,1:00660066006C,1:00730074,1:00730074,d:05740576,1:05740565,1:0574056B,1:057E0576,1:0574056D", bytes2); +const Table_C_ranges = createRangeTable("80-20,2a0-,39c,32,f71,18e,7f2-f,19-7,30-4,7-5,f81-b,5,a800-20ff,4d1-1f,110,fa-6,d174-7,2e84-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,ffff-,2,1f-5f,ff7f-20001"); +function flatten(values) { + return values.reduce((accum, value) => { + value.forEach((value) => { accum.push(value); }); + return accum; + }, []); +} +function _nameprepTableA1(codepoint) { + return !!matchMap(codepoint, Table_A_1_ranges); +} +function _nameprepTableB2(codepoint) { + let range = matchMap(codepoint, Table_B_2_ranges); + if (range) { + return [codepoint + range.s]; + } + let codes = Table_B_2_lut_abs[codepoint]; + if (codes) { + return codes; + } + let shift = Table_B_2_lut_rel[codepoint]; + if (shift) { + return [codepoint + shift[0]]; + } + let complex = Table_B_2_complex[codepoint]; + if (complex) { + return complex; + } + return null; +} +function _nameprepTableC(codepoint) { + return !!matchMap(codepoint, Table_C_ranges); +} +function nameprep(value) { + // This allows platforms with incomplete normalize to bypass + // it for very basic names which the built-in toLowerCase + // will certainly handle correctly + if (value.match(/^[a-z0-9-]*$/i) && value.length <= 59) { + return value.toLowerCase(); + } + // Get the code points (keeping the current normalization) + let codes = Object(_utf8__WEBPACK_IMPORTED_MODULE_0__["toUtf8CodePoints"])(value); + codes = flatten(codes.map((code) => { + // Substitute Table B.1 (Maps to Nothing) + if (Table_B_1_flags.indexOf(code) >= 0) { + return []; + } + if (code >= 0xfe00 && code <= 0xfe0f) { + return []; + } + // Substitute Table B.2 (Case Folding) + let codesTableB2 = _nameprepTableB2(code); + if (codesTableB2) { + return codesTableB2; + } + // No Substitution + return [code]; + })); + // Normalize using form KC + codes = Object(_utf8__WEBPACK_IMPORTED_MODULE_0__["toUtf8CodePoints"])(Object(_utf8__WEBPACK_IMPORTED_MODULE_0__["_toUtf8String"])(codes), _utf8__WEBPACK_IMPORTED_MODULE_0__["UnicodeNormalizationForm"].NFKC); + // Prohibit Tables C.1.2, C.2.2, C.3, C.4, C.5, C.6, C.7, C.8, C.9 + codes.forEach((code) => { + if (_nameprepTableC(code)) { + throw new Error("STRINGPREP_CONTAINS_PROHIBITED"); + } + }); + // Prohibit Unassigned Code Points (Table A.1) + codes.forEach((code) => { + if (_nameprepTableA1(code)) { + throw new Error("STRINGPREP_CONTAINS_UNASSIGNED"); + } + }); + // IDNA extras + let name = Object(_utf8__WEBPACK_IMPORTED_MODULE_0__["_toUtf8String"])(codes); + // IDNA: 4.2.3.1 + if (name.substring(0, 1) === "-" || name.substring(2, 4) === "--" || name.substring(name.length - 1) === "-") { + throw new Error("invalid hyphen"); + } + // IDNA: 4.2.4 + if (name.length > 63) { + throw new Error("too long"); + } + return name; +} +//# sourceMappingURL=idna.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/strings/lib.esm/index.js": +/*!**************************************************************!*\ + !*** ./node_modules/@ethersproject/strings/lib.esm/index.js ***! + \**************************************************************/ +/*! exports provided: _toEscapedUtf8String, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, Utf8ErrorReason, UnicodeNormalizationForm, formatBytes32String, parseBytes32String, nameprep */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _bytes32__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bytes32 */ "./node_modules/@ethersproject/strings/lib.esm/bytes32.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatBytes32String", function() { return _bytes32__WEBPACK_IMPORTED_MODULE_0__["formatBytes32String"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseBytes32String", function() { return _bytes32__WEBPACK_IMPORTED_MODULE_0__["parseBytes32String"]; }); + +/* harmony import */ var _idna__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./idna */ "./node_modules/@ethersproject/strings/lib.esm/idna.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nameprep", function() { return _idna__WEBPACK_IMPORTED_MODULE_1__["nameprep"]; }); + +/* harmony import */ var _utf8__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utf8 */ "./node_modules/@ethersproject/strings/lib.esm/utf8.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_toEscapedUtf8String", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["_toEscapedUtf8String"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toUtf8Bytes", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["toUtf8Bytes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toUtf8CodePoints", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["toUtf8CodePoints"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toUtf8String", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["toUtf8String"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Utf8ErrorFuncs", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["Utf8ErrorFuncs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Utf8ErrorReason", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["Utf8ErrorReason"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnicodeNormalizationForm", function() { return _utf8__WEBPACK_IMPORTED_MODULE_2__["UnicodeNormalizationForm"]; }); + + + + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/strings/lib.esm/utf8.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/strings/lib.esm/utf8.js ***! + \*************************************************************/ +/*! exports provided: UnicodeNormalizationForm, Utf8ErrorReason, Utf8ErrorFuncs, toUtf8Bytes, _toEscapedUtf8String, _toUtf8String, toUtf8String, toUtf8CodePoints */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "UnicodeNormalizationForm", function() { return UnicodeNormalizationForm; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Utf8ErrorReason", function() { return Utf8ErrorReason; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Utf8ErrorFuncs", function() { return Utf8ErrorFuncs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toUtf8Bytes", function() { return toUtf8Bytes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_toEscapedUtf8String", function() { return _toEscapedUtf8String; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_toUtf8String", function() { return _toUtf8String; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toUtf8String", function() { return toUtf8String; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toUtf8CodePoints", function() { return toUtf8CodePoints; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/strings/lib.esm/_version.js"); + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +/////////////////////////////// +var UnicodeNormalizationForm; +(function (UnicodeNormalizationForm) { + UnicodeNormalizationForm["current"] = ""; + UnicodeNormalizationForm["NFC"] = "NFC"; + UnicodeNormalizationForm["NFD"] = "NFD"; + UnicodeNormalizationForm["NFKC"] = "NFKC"; + UnicodeNormalizationForm["NFKD"] = "NFKD"; +})(UnicodeNormalizationForm || (UnicodeNormalizationForm = {})); +; +var Utf8ErrorReason; +(function (Utf8ErrorReason) { + // A continuation byte was present where there was nothing to continue + // - offset = the index the codepoint began in + Utf8ErrorReason["UNEXPECTED_CONTINUE"] = "unexpected continuation byte"; + // An invalid (non-continuation) byte to start a UTF-8 codepoint was found + // - offset = the index the codepoint began in + Utf8ErrorReason["BAD_PREFIX"] = "bad codepoint prefix"; + // The string is too short to process the expected codepoint + // - offset = the index the codepoint began in + Utf8ErrorReason["OVERRUN"] = "string overrun"; + // A missing continuation byte was expected but not found + // - offset = the index the continuation byte was expected at + Utf8ErrorReason["MISSING_CONTINUE"] = "missing continuation byte"; + // The computed code point is outside the range for UTF-8 + // - offset = start of this codepoint + // - badCodepoint = the computed codepoint; outside the UTF-8 range + Utf8ErrorReason["OUT_OF_RANGE"] = "out of UTF-8 range"; + // UTF-8 strings may not contain UTF-16 surrogate pairs + // - offset = start of this codepoint + // - badCodepoint = the computed codepoint; inside the UTF-16 surrogate range + Utf8ErrorReason["UTF16_SURROGATE"] = "UTF-16 surrogate"; + // The string is an overlong reperesentation + // - offset = start of this codepoint + // - badCodepoint = the computed codepoint; already bounds checked + Utf8ErrorReason["OVERLONG"] = "overlong representation"; +})(Utf8ErrorReason || (Utf8ErrorReason = {})); +; +function errorFunc(reason, offset, bytes, output, badCodepoint) { + return logger.throwArgumentError(`invalid codepoint at offset ${offset}; ${reason}`, "bytes", bytes); +} +function ignoreFunc(reason, offset, bytes, output, badCodepoint) { + // If there is an invalid prefix (including stray continuation), skip any additional continuation bytes + if (reason === Utf8ErrorReason.BAD_PREFIX || reason === Utf8ErrorReason.UNEXPECTED_CONTINUE) { + let i = 0; + for (let o = offset + 1; o < bytes.length; o++) { + if (bytes[o] >> 6 !== 0x02) { + break; + } + i++; + } + return i; + } + // This byte runs us past the end of the string, so just jump to the end + // (but the first byte was read already read and therefore skipped) + if (reason === Utf8ErrorReason.OVERRUN) { + return bytes.length - offset - 1; + } + // Nothing to skip + return 0; +} +function replaceFunc(reason, offset, bytes, output, badCodepoint) { + // Overlong representations are otherwise "valid" code points; just non-deistingtished + if (reason === Utf8ErrorReason.OVERLONG) { + output.push(badCodepoint); + return 0; + } + // Put the replacement character into the output + output.push(0xfffd); + // Otherwise, process as if ignoring errors + return ignoreFunc(reason, offset, bytes, output, badCodepoint); +} +// Common error handing strategies +const Utf8ErrorFuncs = Object.freeze({ + error: errorFunc, + ignore: ignoreFunc, + replace: replaceFunc +}); +// http://stackoverflow.com/questions/13356493/decode-utf-8-with-javascript#13691499 +function getUtf8CodePoints(bytes, onError) { + if (onError == null) { + onError = Utf8ErrorFuncs.error; + } + bytes = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(bytes); + const result = []; + let i = 0; + // Invalid bytes are ignored + while (i < bytes.length) { + const c = bytes[i++]; + // 0xxx xxxx + if (c >> 7 === 0) { + result.push(c); + continue; + } + // Multibyte; how many bytes left for this character? + let extraLength = null; + let overlongMask = null; + // 110x xxxx 10xx xxxx + if ((c & 0xe0) === 0xc0) { + extraLength = 1; + overlongMask = 0x7f; + // 1110 xxxx 10xx xxxx 10xx xxxx + } + else if ((c & 0xf0) === 0xe0) { + extraLength = 2; + overlongMask = 0x7ff; + // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx + } + else if ((c & 0xf8) === 0xf0) { + extraLength = 3; + overlongMask = 0xffff; + } + else { + if ((c & 0xc0) === 0x80) { + i += onError(Utf8ErrorReason.UNEXPECTED_CONTINUE, i - 1, bytes, result); + } + else { + i += onError(Utf8ErrorReason.BAD_PREFIX, i - 1, bytes, result); + } + continue; + } + // Do we have enough bytes in our data? + if (i - 1 + extraLength >= bytes.length) { + i += onError(Utf8ErrorReason.OVERRUN, i - 1, bytes, result); + continue; + } + // Remove the length prefix from the char + let res = c & ((1 << (8 - extraLength - 1)) - 1); + for (let j = 0; j < extraLength; j++) { + let nextChar = bytes[i]; + // Invalid continuation byte + if ((nextChar & 0xc0) != 0x80) { + i += onError(Utf8ErrorReason.MISSING_CONTINUE, i, bytes, result); + res = null; + break; + } + ; + res = (res << 6) | (nextChar & 0x3f); + i++; + } + // See above loop for invalid contimuation byte + if (res === null) { + continue; + } + // Maximum code point + if (res > 0x10ffff) { + i += onError(Utf8ErrorReason.OUT_OF_RANGE, i - 1 - extraLength, bytes, result, res); + continue; + } + // Reserved for UTF-16 surrogate halves + if (res >= 0xd800 && res <= 0xdfff) { + i += onError(Utf8ErrorReason.UTF16_SURROGATE, i - 1 - extraLength, bytes, result, res); + continue; + } + // Check for overlong sequences (more bytes than needed) + if (res <= overlongMask) { + i += onError(Utf8ErrorReason.OVERLONG, i - 1 - extraLength, bytes, result, res); + continue; + } + result.push(res); + } + return result; +} +// http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array +function toUtf8Bytes(str, form = UnicodeNormalizationForm.current) { + if (form != UnicodeNormalizationForm.current) { + logger.checkNormalize(); + str = str.normalize(form); + } + let result = []; + for (let i = 0; i < str.length; i++) { + const c = str.charCodeAt(i); + if (c < 0x80) { + result.push(c); + } + else if (c < 0x800) { + result.push((c >> 6) | 0xc0); + result.push((c & 0x3f) | 0x80); + } + else if ((c & 0xfc00) == 0xd800) { + i++; + const c2 = str.charCodeAt(i); + if (i >= str.length || (c2 & 0xfc00) !== 0xdc00) { + throw new Error("invalid utf-8 string"); + } + // Surrogate Pair + const pair = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff); + result.push((pair >> 18) | 0xf0); + result.push(((pair >> 12) & 0x3f) | 0x80); + result.push(((pair >> 6) & 0x3f) | 0x80); + result.push((pair & 0x3f) | 0x80); + } + else { + result.push((c >> 12) | 0xe0); + result.push(((c >> 6) & 0x3f) | 0x80); + result.push((c & 0x3f) | 0x80); + } + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(result); +} +; +function escapeChar(value) { + const hex = ("0000" + value.toString(16)); + return "\\u" + hex.substring(hex.length - 4); +} +function _toEscapedUtf8String(bytes, onError) { + return '"' + getUtf8CodePoints(bytes, onError).map((codePoint) => { + if (codePoint < 256) { + switch (codePoint) { + case 8: return "\\b"; + case 9: return "\\t"; + case 10: return "\\n"; + case 13: return "\\r"; + case 34: return "\\\""; + case 92: return "\\\\"; + } + if (codePoint >= 32 && codePoint < 127) { + return String.fromCharCode(codePoint); + } + } + if (codePoint <= 0xffff) { + return escapeChar(codePoint); + } + codePoint -= 0x10000; + return escapeChar(((codePoint >> 10) & 0x3ff) + 0xd800) + escapeChar((codePoint & 0x3ff) + 0xdc00); + }).join("") + '"'; +} +function _toUtf8String(codePoints) { + return codePoints.map((codePoint) => { + if (codePoint <= 0xffff) { + return String.fromCharCode(codePoint); + } + codePoint -= 0x10000; + return String.fromCharCode((((codePoint >> 10) & 0x3ff) + 0xd800), ((codePoint & 0x3ff) + 0xdc00)); + }).join(""); +} +function toUtf8String(bytes, onError) { + return _toUtf8String(getUtf8CodePoints(bytes, onError)); +} +function toUtf8CodePoints(str, form = UnicodeNormalizationForm.current) { + return getUtf8CodePoints(toUtf8Bytes(str, form)); +} +//# sourceMappingURL=utf8.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/transactions/lib.esm/_version.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@ethersproject/transactions/lib.esm/_version.js ***! + \**********************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "transactions/5.0.10"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/transactions/lib.esm/index.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/transactions/lib.esm/index.js ***! + \*******************************************************************/ +/*! exports provided: computeAddress, recoverAddress, serialize, parse */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeAddress", function() { return computeAddress; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "recoverAddress", function() { return recoverAddress; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "serialize", function() { return serialize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parse", function() { return parse; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/constants */ "./node_modules/@ethersproject/constants/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/rlp */ "./node_modules/@ethersproject/rlp/lib.esm/index.js"); +/* harmony import */ var _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/signing-key */ "./node_modules/@ethersproject/signing-key/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/transactions/lib.esm/_version.js"); + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"](_version__WEBPACK_IMPORTED_MODULE_9__["version"]); +/////////////////////////////// +function handleAddress(value) { + if (value === "0x") { + return null; + } + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(value); +} +function handleNumber(value) { + if (value === "0x") { + return _ethersproject_constants__WEBPACK_IMPORTED_MODULE_3__["Zero"]; + } + return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(value); +} +const transactionFields = [ + { name: "nonce", maxLength: 32, numeric: true }, + { name: "gasPrice", maxLength: 32, numeric: true }, + { name: "gasLimit", maxLength: 32, numeric: true }, + { name: "to", length: 20 }, + { name: "value", maxLength: 32, numeric: true }, + { name: "data" }, +]; +const allowedTransactionKeys = { + chainId: true, data: true, gasLimit: true, gasPrice: true, nonce: true, to: true, value: true +}; +function computeAddress(key) { + const publicKey = Object(_ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_7__["computePublicKey"])(key); + return Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexDataSlice"])(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexDataSlice"])(publicKey, 1)), 12)); +} +function recoverAddress(digest, signature) { + return computeAddress(Object(_ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_7__["recoverPublicKey"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(digest), signature)); +} +function serialize(transaction, signature) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_5__["checkProperties"])(transaction, allowedTransactionKeys); + const raw = []; + transactionFields.forEach(function (fieldInfo) { + let value = transaction[fieldInfo.name] || ([]); + const options = {}; + if (fieldInfo.numeric) { + options.hexPad = "left"; + } + value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(value, options)); + // Fixed-width field + if (fieldInfo.length && value.length !== fieldInfo.length && value.length > 0) { + logger.throwArgumentError("invalid length for " + fieldInfo.name, ("transaction:" + fieldInfo.name), value); + } + // Variable-width (with a maximum) + if (fieldInfo.maxLength) { + value = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["stripZeros"])(value); + if (value.length > fieldInfo.maxLength) { + logger.throwArgumentError("invalid length for " + fieldInfo.name, ("transaction:" + fieldInfo.name), value); + } + } + raw.push(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(value)); + }); + let chainId = 0; + if (transaction.chainId != null) { + // A chainId was provided; if non-zero we'll use EIP-155 + chainId = transaction.chainId; + if (typeof (chainId) !== "number") { + logger.throwArgumentError("invalid transaction.chainId", "transaction", transaction); + } + } + else if (signature && !Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["isBytesLike"])(signature) && signature.v > 28) { + // No chainId provided, but the signature is signing with EIP-155; derive chainId + chainId = Math.floor((signature.v - 35) / 2); + } + // We have an EIP-155 transaction (chainId was specified and non-zero) + if (chainId !== 0) { + raw.push(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(chainId)); // @TODO: hexValue? + raw.push("0x"); + raw.push("0x"); + } + // Requesting an unsigned transation + if (!signature) { + return _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_6__["encode"](raw); + } + // The splitSignature will ensure the transaction has a recoveryParam in the + // case that the signTransaction function only adds a v. + const sig = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["splitSignature"])(signature); + // We pushed a chainId and null r, s on for hashing only; remove those + let v = 27 + sig.recoveryParam; + if (chainId !== 0) { + raw.pop(); + raw.pop(); + raw.pop(); + v += chainId * 2 + 8; + // If an EIP-155 v (directly or indirectly; maybe _vs) was provided, check it! + if (sig.v > 28 && sig.v !== v) { + logger.throwArgumentError("transaction.chainId/signature.v mismatch", "signature", signature); + } + } + else if (sig.v !== v) { + logger.throwArgumentError("transaction.chainId/signature.v mismatch", "signature", signature); + } + raw.push(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(v)); + raw.push(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["stripZeros"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(sig.r))); + raw.push(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["stripZeros"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["arrayify"])(sig.s))); + return _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_6__["encode"](raw); +} +function parse(rawTransaction) { + const transaction = _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_6__["decode"](rawTransaction); + if (transaction.length !== 9 && transaction.length !== 6) { + logger.throwArgumentError("invalid raw transaction", "rawTransaction", rawTransaction); + } + const tx = { + nonce: handleNumber(transaction[0]).toNumber(), + gasPrice: handleNumber(transaction[1]), + gasLimit: handleNumber(transaction[2]), + to: handleAddress(transaction[3]), + value: handleNumber(transaction[4]), + data: transaction[5], + chainId: 0 + }; + // Legacy unsigned transaction + if (transaction.length === 6) { + return tx; + } + try { + tx.v = _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(transaction[6]).toNumber(); + } + catch (error) { + console.log(error); + return tx; + } + tx.r = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(transaction[7], 32); + tx.s = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexZeroPad"])(transaction[8], 32); + if (_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(tx.r).isZero() && _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"].from(tx.s).isZero()) { + // EIP-155 unsigned transaction + tx.chainId = tx.v; + tx.v = 0; + } + else { + // Signed Tranasaction + tx.chainId = Math.floor((tx.v - 35) / 2); + if (tx.chainId < 0) { + tx.chainId = 0; + } + let recoveryParam = tx.v - 27; + const raw = transaction.slice(0, 6); + if (tx.chainId !== 0) { + raw.push(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(tx.chainId)); + raw.push("0x"); + raw.push("0x"); + recoveryParam -= tx.chainId * 2 + 8; + } + const digest = Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__["keccak256"])(_ethersproject_rlp__WEBPACK_IMPORTED_MODULE_6__["encode"](raw)); + try { + tx.from = recoverAddress(digest, { r: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(tx.r), s: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_2__["hexlify"])(tx.s), recoveryParam: recoveryParam }); + } + catch (error) { + console.log(error); + } + tx.hash = Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_4__["keccak256"])(rawTransaction); + } + return tx; +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/units/lib.esm/_version.js": +/*!***************************************************************!*\ + !*** ./node_modules/@ethersproject/units/lib.esm/_version.js ***! + \***************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "units/5.0.10"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/units/lib.esm/index.js": +/*!************************************************************!*\ + !*** ./node_modules/@ethersproject/units/lib.esm/index.js ***! + \************************************************************/ +/*! exports provided: commify, formatUnits, parseUnits, formatEther, parseEther */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commify", function() { return commify; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatUnits", function() { return formatUnits; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseUnits", function() { return parseUnits; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatEther", function() { return formatEther; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseEther", function() { return parseEther; }); +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/units/lib.esm/_version.js"); + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_1__["Logger"](_version__WEBPACK_IMPORTED_MODULE_2__["version"]); +const names = [ + "wei", + "kwei", + "mwei", + "gwei", + "szabo", + "finney", + "ether", +]; +// Some environments have issues with RegEx that contain back-tracking, so we cannot +// use them. +function commify(value) { + const comps = String(value).split("."); + if (comps.length > 2 || !comps[0].match(/^-?[0-9]*$/) || (comps[1] && !comps[1].match(/^[0-9]*$/)) || value === "." || value === "-.") { + logger.throwArgumentError("invalid value", "value", value); + } + // Make sure we have at least one whole digit (0 if none) + let whole = comps[0]; + let negative = ""; + if (whole.substring(0, 1) === "-") { + negative = "-"; + whole = whole.substring(1); + } + // Make sure we have at least 1 whole digit with no leading zeros + while (whole.substring(0, 1) === "0") { + whole = whole.substring(1); + } + if (whole === "") { + whole = "0"; + } + let suffix = ""; + if (comps.length === 2) { + suffix = "." + (comps[1] || "0"); + } + while (suffix.length > 2 && suffix[suffix.length - 1] === "0") { + suffix = suffix.substring(0, suffix.length - 1); + } + const formatted = []; + while (whole.length) { + if (whole.length <= 3) { + formatted.unshift(whole); + break; + } + else { + const index = whole.length - 3; + formatted.unshift(whole.substring(index)); + whole = whole.substring(0, index); + } + } + return negative + formatted.join(",") + suffix; +} +function formatUnits(value, unitName) { + if (typeof (unitName) === "string") { + const index = names.indexOf(unitName); + if (index !== -1) { + unitName = 3 * index; + } + } + return Object(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["formatFixed"])(value, (unitName != null) ? unitName : 18); +} +function parseUnits(value, unitName) { + if (typeof (value) !== "string") { + logger.throwArgumentError("value must be a string", "value", value); + } + if (typeof (unitName) === "string") { + const index = names.indexOf(unitName); + if (index !== -1) { + unitName = 3 * index; + } + } + return Object(_ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_0__["parseFixed"])(value, (unitName != null) ? unitName : 18); +} +function formatEther(wei) { + return formatUnits(wei, 18); +} +function parseEther(ether) { + return parseUnits(ether, 18); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wallet/lib.esm/_version.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/wallet/lib.esm/_version.js ***! + \****************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "wallet/5.0.11"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wallet/lib.esm/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/wallet/lib.esm/index.js ***! + \*************************************************************/ +/*! exports provided: Wallet, verifyMessage, verifyTypedData */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Wallet", function() { return Wallet; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "verifyMessage", function() { return verifyMessage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "verifyTypedData", function() { return verifyTypedData; }); +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony import */ var _ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/abstract-provider */ "./node_modules/@ethersproject/abstract-provider/lib.esm/index.js"); +/* harmony import */ var _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/abstract-signer */ "./node_modules/@ethersproject/abstract-signer/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_hash__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/hash */ "./node_modules/@ethersproject/hash/lib.esm/index.js"); +/* harmony import */ var _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/hdnode */ "./node_modules/@ethersproject/hdnode/lib.esm/index.js"); +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_random__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/random */ "./node_modules/@ethersproject/random/lib.esm/index.js"); +/* harmony import */ var _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ethersproject/signing-key */ "./node_modules/@ethersproject/signing-key/lib.esm/index.js"); +/* harmony import */ var _ethersproject_json_wallets__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @ethersproject/json-wallets */ "./node_modules/@ethersproject/json-wallets/lib.esm/index.js"); +/* harmony import */ var _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @ethersproject/transactions */ "./node_modules/@ethersproject/transactions/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/wallet/lib.esm/_version.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + + + + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"](_version__WEBPACK_IMPORTED_MODULE_13__["version"]); +function isAccount(value) { + return (value != null && Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["isHexString"])(value.privateKey, 32) && value.address != null); +} +function hasMnemonic(value) { + const mnemonic = value.mnemonic; + return (mnemonic && mnemonic.phrase); +} +class Wallet extends _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__["Signer"] { + constructor(privateKey, provider) { + logger.checkNew(new.target, Wallet); + super(); + if (isAccount(privateKey)) { + const signingKey = new _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_9__["SigningKey"](privateKey.privateKey); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_signingKey", () => signingKey); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "address", Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["computeAddress"])(this.publicKey)); + if (this.address !== Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(privateKey.address)) { + logger.throwArgumentError("privateKey/address mismatch", "privateKey", "[REDACTED]"); + } + if (hasMnemonic(privateKey)) { + const srcMnemonic = privateKey.mnemonic; + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_mnemonic", () => ({ + phrase: srcMnemonic.phrase, + path: srcMnemonic.path || _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_5__["defaultPath"], + locale: srcMnemonic.locale || "en" + })); + const mnemonic = this.mnemonic; + const node = _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_5__["HDNode"].fromMnemonic(mnemonic.phrase, null, mnemonic.locale).derivePath(mnemonic.path); + if (Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["computeAddress"])(node.privateKey) !== this.address) { + logger.throwArgumentError("mnemonic/address mismatch", "privateKey", "[REDACTED]"); + } + } + else { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_mnemonic", () => null); + } + } + else { + if (_ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_9__["SigningKey"].isSigningKey(privateKey)) { + /* istanbul ignore if */ + if (privateKey.curve !== "secp256k1") { + logger.throwArgumentError("unsupported curve; must be secp256k1", "privateKey", "[REDACTED]"); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_signingKey", () => privateKey); + } + else { + // A lot of common tools do not prefix private keys with a 0x (see: #1166) + if (typeof (privateKey) === "string") { + if (privateKey.match(/^[0-9a-f]*$/i) && privateKey.length === 64) { + privateKey = "0x" + privateKey; + } + } + const signingKey = new _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_9__["SigningKey"](privateKey); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_signingKey", () => signingKey); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "_mnemonic", () => null); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "address", Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["computeAddress"])(this.publicKey)); + } + /* istanbul ignore if */ + if (provider && !_ethersproject_abstract_provider__WEBPACK_IMPORTED_MODULE_1__["Provider"].isProvider(provider)) { + logger.throwArgumentError("invalid provider", "provider", provider); + } + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["defineReadOnly"])(this, "provider", provider || null); + } + get mnemonic() { return this._mnemonic(); } + get privateKey() { return this._signingKey().privateKey; } + get publicKey() { return this._signingKey().publicKey; } + getAddress() { + return Promise.resolve(this.address); + } + connect(provider) { + return new Wallet(this, provider); + } + signTransaction(transaction) { + return Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_7__["resolveProperties"])(transaction).then((tx) => { + if (tx.from != null) { + if (Object(_ethersproject_address__WEBPACK_IMPORTED_MODULE_0__["getAddress"])(tx.from) !== this.address) { + logger.throwArgumentError("transaction from address mismatch", "transaction.from", transaction.from); + } + delete tx.from; + } + const signature = this._signingKey().signDigest(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_6__["keccak256"])(Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["serialize"])(tx))); + return Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["serialize"])(tx, signature); + }); + } + signMessage(message) { + return __awaiter(this, void 0, void 0, function* () { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["joinSignature"])(this._signingKey().signDigest(Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_4__["hashMessage"])(message))); + }); + } + _signTypedData(domain, types, value) { + return __awaiter(this, void 0, void 0, function* () { + // Populate any ENS names + const populated = yield _ethersproject_hash__WEBPACK_IMPORTED_MODULE_4__["_TypedDataEncoder"].resolveNames(domain, types, value, (name) => { + if (this.provider == null) { + logger.throwError("cannot resolve ENS names without a provider", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_12__["Logger"].errors.UNSUPPORTED_OPERATION, { + operation: "resolveName", + value: name + }); + } + return this.provider.resolveName(name); + }); + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["joinSignature"])(this._signingKey().signDigest(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_4__["_TypedDataEncoder"].hash(populated.domain, types, populated.value))); + }); + } + encrypt(password, options, progressCallback) { + if (typeof (options) === "function" && !progressCallback) { + progressCallback = options; + options = {}; + } + if (progressCallback && typeof (progressCallback) !== "function") { + throw new Error("invalid callback"); + } + if (!options) { + options = {}; + } + return Object(_ethersproject_json_wallets__WEBPACK_IMPORTED_MODULE_10__["encryptKeystore"])(this, password, options, progressCallback); + } + /** + * Static methods to create Wallet instances. + */ + static createRandom(options) { + let entropy = Object(_ethersproject_random__WEBPACK_IMPORTED_MODULE_8__["randomBytes"])(16); + if (!options) { + options = {}; + } + if (options.extraEntropy) { + entropy = Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["arrayify"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["hexDataSlice"])(Object(_ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_6__["keccak256"])(Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_3__["concat"])([entropy, options.extraEntropy])), 0, 16)); + } + const mnemonic = Object(_ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_5__["entropyToMnemonic"])(entropy, options.locale); + return Wallet.fromMnemonic(mnemonic, options.path, options.locale); + } + static fromEncryptedJson(json, password, progressCallback) { + return Object(_ethersproject_json_wallets__WEBPACK_IMPORTED_MODULE_10__["decryptJsonWallet"])(json, password, progressCallback).then((account) => { + return new Wallet(account); + }); + } + static fromEncryptedJsonSync(json, password) { + return new Wallet(Object(_ethersproject_json_wallets__WEBPACK_IMPORTED_MODULE_10__["decryptJsonWalletSync"])(json, password)); + } + static fromMnemonic(mnemonic, path, wordlist) { + if (!path) { + path = _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_5__["defaultPath"]; + } + return new Wallet(_ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_5__["HDNode"].fromMnemonic(mnemonic, null, wordlist).derivePath(path)); + } +} +function verifyMessage(message, signature) { + return Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["recoverAddress"])(Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_4__["hashMessage"])(message), signature); +} +function verifyTypedData(domain, types, value, signature) { + return Object(_ethersproject_transactions__WEBPACK_IMPORTED_MODULE_11__["recoverAddress"])(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_4__["_TypedDataEncoder"].hash(domain, types, value), signature); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/web/lib.esm/_version.js": +/*!*************************************************************!*\ + !*** ./node_modules/@ethersproject/web/lib.esm/_version.js ***! + \*************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "web/5.0.13"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/web/lib.esm/geturl.js": +/*!***********************************************************!*\ + !*** ./node_modules/@ethersproject/web/lib.esm/geturl.js ***! + \***********************************************************/ +/*! exports provided: getUrl */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getUrl", function() { return getUrl; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + +function getUrl(href, options) { + return __awaiter(this, void 0, void 0, function* () { + if (options == null) { + options = {}; + } + const request = { + method: (options.method || "GET"), + headers: (options.headers || {}), + body: (options.body || undefined), + mode: "cors", + cache: "no-cache", + credentials: "same-origin", + redirect: "follow", + referrer: "client", + }; + const response = yield fetch(href, request); + const body = yield response.arrayBuffer(); + const headers = {}; + if (response.headers.forEach) { + response.headers.forEach((value, key) => { + headers[key.toLowerCase()] = value; + }); + } + else { + ((response.headers).keys)().forEach((key) => { + headers[key.toLowerCase()] = response.headers.get(key); + }); + } + return { + headers: headers, + statusCode: response.status, + statusMessage: response.statusText, + body: Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["arrayify"])(new Uint8Array(body)), + }; + }); +} +//# sourceMappingURL=geturl.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/web/lib.esm/index.js": +/*!**********************************************************!*\ + !*** ./node_modules/@ethersproject/web/lib.esm/index.js ***! + \**********************************************************/ +/*! exports provided: _fetchData, fetchJson, poll */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_fetchData", function() { return _fetchData; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchJson", function() { return fetchJson; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "poll", function() { return poll; }); +/* harmony import */ var _ethersproject_base64__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/base64 */ "./node_modules/@ethersproject/base64/lib.esm/index.js"); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/web/lib.esm/_version.js"); +/* harmony import */ var _geturl__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./geturl */ "./node_modules/@ethersproject/web/lib.esm/geturl.js"); + +var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"](_version__WEBPACK_IMPORTED_MODULE_5__["version"]); + +function staller(duration) { + return new Promise((resolve) => { + setTimeout(resolve, duration); + }); +} +function bodyify(value, type) { + if (value == null) { + return null; + } + if (typeof (value) === "string") { + return value; + } + if (Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["isBytesLike"])(value)) { + if (type && (type.split("/")[0] === "text" || type.split(";")[0].trim() === "application/json")) { + try { + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8String"])(value); + } + catch (error) { } + ; + } + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_1__["hexlify"])(value); + } + return value; +} +// This API is still a work in progress; the future changes will likely be: +// - ConnectionInfo => FetchDataRequest<T = any> +// - FetchDataRequest.body? = string | Uint8Array | { contentType: string, data: string | Uint8Array } +// - If string => text/plain, Uint8Array => application/octet-stream (if content-type unspecified) +// - FetchDataRequest.processFunc = (body: Uint8Array, response: FetchDataResponse) => T +// For this reason, it should be considered internal until the API is finalized +function _fetchData(connection, body, processFunc) { + // How many times to retry in the event of a throttle + const attemptLimit = (typeof (connection) === "object" && connection.throttleLimit != null) ? connection.throttleLimit : 12; + logger.assertArgument((attemptLimit > 0 && (attemptLimit % 1) === 0), "invalid connection throttle limit", "connection.throttleLimit", attemptLimit); + const throttleCallback = ((typeof (connection) === "object") ? connection.throttleCallback : null); + const throttleSlotInterval = ((typeof (connection) === "object" && typeof (connection.throttleSlotInterval) === "number") ? connection.throttleSlotInterval : 100); + logger.assertArgument((throttleSlotInterval > 0 && (throttleSlotInterval % 1) === 0), "invalid connection throttle slot interval", "connection.throttleSlotInterval", throttleSlotInterval); + const headers = {}; + let url = null; + // @TODO: Allow ConnectionInfo to override some of these values + const options = { + method: "GET", + }; + let allow304 = false; + let timeout = 2 * 60 * 1000; + if (typeof (connection) === "string") { + url = connection; + } + else if (typeof (connection) === "object") { + if (connection == null || connection.url == null) { + logger.throwArgumentError("missing URL", "connection.url", connection); + } + url = connection.url; + if (typeof (connection.timeout) === "number" && connection.timeout > 0) { + timeout = connection.timeout; + } + if (connection.headers) { + for (const key in connection.headers) { + headers[key.toLowerCase()] = { key: key, value: String(connection.headers[key]) }; + if (["if-none-match", "if-modified-since"].indexOf(key.toLowerCase()) >= 0) { + allow304 = true; + } + } + } + options.allowGzip = !!connection.allowGzip; + if (connection.user != null && connection.password != null) { + if (url.substring(0, 6) !== "https:" && connection.allowInsecureAuthentication !== true) { + logger.throwError("basic authentication requires a secure https url", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.INVALID_ARGUMENT, { argument: "url", url: url, user: connection.user, password: "[REDACTED]" }); + } + const authorization = connection.user + ":" + connection.password; + headers["authorization"] = { + key: "Authorization", + value: "Basic " + Object(_ethersproject_base64__WEBPACK_IMPORTED_MODULE_0__["encode"])(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8Bytes"])(authorization)) + }; + } + } + if (body) { + options.method = "POST"; + options.body = body; + if (headers["content-type"] == null) { + headers["content-type"] = { key: "Content-Type", value: "application/octet-stream" }; + } + if (headers["content-length"] == null) { + headers["content-length"] = { key: "Content-Length", value: String(body.length) }; + } + } + const flatHeaders = {}; + Object.keys(headers).forEach((key) => { + const header = headers[key]; + flatHeaders[header.key] = header.value; + }); + options.headers = flatHeaders; + const runningTimeout = (function () { + let timer = null; + const promise = new Promise(function (resolve, reject) { + if (timeout) { + timer = setTimeout(() => { + if (timer == null) { + return; + } + timer = null; + reject(logger.makeError("timeout", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.TIMEOUT, { + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + timeout: timeout, + url: url + })); + }, timeout); + } + }); + const cancel = function () { + if (timer == null) { + return; + } + clearTimeout(timer); + timer = null; + }; + return { promise, cancel }; + })(); + const runningFetch = (function () { + return __awaiter(this, void 0, void 0, function* () { + for (let attempt = 0; attempt < attemptLimit; attempt++) { + let response = null; + try { + response = yield Object(_geturl__WEBPACK_IMPORTED_MODULE_6__["getUrl"])(url, options); + // Exponential back-off throttling + if (response.statusCode === 429 && attempt < attemptLimit) { + let tryAgain = true; + if (throttleCallback) { + tryAgain = yield throttleCallback(attempt, url); + } + if (tryAgain) { + let stall = 0; + const retryAfter = response.headers["retry-after"]; + if (typeof (retryAfter) === "string" && retryAfter.match(/^[1-9][0-9]*$/)) { + stall = parseInt(retryAfter) * 1000; + } + else { + stall = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt))); + } + //console.log("Stalling 429"); + yield staller(stall); + continue; + } + } + } + catch (error) { + response = error.response; + if (response == null) { + runningTimeout.cancel(); + logger.throwError("missing response", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR, { + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + serverError: error, + url: url + }); + } + } + let body = response.body; + if (allow304 && response.statusCode === 304) { + body = null; + } + else if (response.statusCode < 200 || response.statusCode >= 300) { + runningTimeout.cancel(); + logger.throwError("bad response", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR, { + status: response.statusCode, + headers: response.headers, + body: bodyify(body, ((response.headers) ? response.headers["content-type"] : null)), + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + url: url + }); + } + if (processFunc) { + try { + const result = yield processFunc(body, response); + runningTimeout.cancel(); + return result; + } + catch (error) { + // Allow the processFunc to trigger a throttle + if (error.throttleRetry && attempt < attemptLimit) { + let tryAgain = true; + if (throttleCallback) { + tryAgain = yield throttleCallback(attempt, url); + } + if (tryAgain) { + const timeout = throttleSlotInterval * parseInt(String(Math.random() * Math.pow(2, attempt))); + //console.log("Stalling callback"); + yield staller(timeout); + continue; + } + } + runningTimeout.cancel(); + logger.throwError("processing response error", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR, { + body: bodyify(body, ((response.headers) ? response.headers["content-type"] : null)), + error: error, + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + url: url + }); + } + } + runningTimeout.cancel(); + // If we had a processFunc, it eitehr returned a T or threw above. + // The "body" is now a Uint8Array. + return body; + } + return logger.throwError("failed response", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR, { + requestBody: bodyify(options.body, flatHeaders["content-type"]), + requestMethod: options.method, + url: url + }); + }); + })(); + return Promise.race([runningTimeout.promise, runningFetch]); +} +function fetchJson(connection, json, processFunc) { + let processJsonFunc = (value, response) => { + let result = null; + if (value != null) { + try { + result = JSON.parse(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8String"])(value)); + } + catch (error) { + logger.throwError("invalid JSON", _ethersproject_logger__WEBPACK_IMPORTED_MODULE_4__["Logger"].errors.SERVER_ERROR, { + body: value, + error: error + }); + } + } + if (processFunc) { + result = processFunc(result, response); + } + return result; + }; + // If we have json to send, we must + // - add content-type of application/json (unless already overridden) + // - convert the json to bytes + let body = null; + if (json != null) { + body = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_3__["toUtf8Bytes"])(json); + // Create a connection with the content-type set for JSON + const updated = (typeof (connection) === "string") ? ({ url: connection }) : Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["shallowCopy"])(connection); + if (updated.headers) { + const hasContentType = (Object.keys(updated.headers).filter((k) => (k.toLowerCase() === "content-type")).length) !== 0; + if (!hasContentType) { + updated.headers = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["shallowCopy"])(updated.headers); + updated.headers["content-type"] = "application/json"; + } + } + else { + updated.headers = { "content-type": "application/json" }; + } + connection = updated; + } + return _fetchData(connection, body, processJsonFunc); +} +function poll(func, options) { + if (!options) { + options = {}; + } + options = Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_2__["shallowCopy"])(options); + if (options.floor == null) { + options.floor = 0; + } + if (options.ceiling == null) { + options.ceiling = 10000; + } + if (options.interval == null) { + options.interval = 250; + } + return new Promise(function (resolve, reject) { + let timer = null; + let done = false; + // Returns true if cancel was successful. Unsuccessful cancel means we're already done. + const cancel = () => { + if (done) { + return false; + } + done = true; + if (timer) { + clearTimeout(timer); + } + return true; + }; + if (options.timeout) { + timer = setTimeout(() => { + if (cancel()) { + reject(new Error("timeout")); + } + }, options.timeout); + } + const retryLimit = options.retryLimit; + let attempt = 0; + function check() { + return func().then(function (result) { + // If we have a result, or are allowed null then we're done + if (result !== undefined) { + if (cancel()) { + resolve(result); + } + } + else if (options.oncePoll) { + options.oncePoll.once("poll", check); + } + else if (options.onceBlock) { + options.onceBlock.once("block", check); + // Otherwise, exponential back-off (up to 10s) our next request + } + else if (!done) { + attempt++; + if (attempt > retryLimit) { + if (cancel()) { + reject(new Error("retry limit reached")); + } + return; + } + let timeout = options.interval * parseInt(String(Math.random() * Math.pow(2, attempt))); + if (timeout < options.floor) { + timeout = options.floor; + } + if (timeout > options.ceiling) { + timeout = options.ceiling; + } + setTimeout(check, timeout); + } + return null; + }, function (error) { + if (cancel()) { + reject(error); + } + }); + } + check(); + }); +} +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/_version.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/_version.js ***! + \*******************************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "wordlists/5.0.9"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/index.js": +/*!****************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/index.js ***! + \****************************************************************/ +/*! exports provided: logger, Wordlist, wordlists */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return _wordlist__WEBPACK_IMPORTED_MODULE_0__["logger"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Wordlist", function() { return _wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"]; }); + +/* harmony import */ var _wordlists__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wordlists */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlists.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wordlists", function() { return _wordlists__WEBPACK_IMPORTED_MODULE_1__["wordlists"]; }); + + +// Wordlists +// See: https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md + + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-cz.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-cz.js ***! + \******************************************************************/ +/*! exports provided: langCz */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langCz", function() { return langCz; }); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + +const words = "AbdikaceAbecedaAdresaAgreseAkceAktovkaAlejAlkoholAmputaceAnanasAndulkaAnekdotaAnketaAntikaAnulovatArchaAroganceAsfaltAsistentAspiraceAstmaAstronomAtlasAtletikaAtolAutobusAzylBabkaBachorBacilBaculkaBadatelBagetaBagrBahnoBakterieBaladaBaletkaBalkonBalonekBalvanBalzaBambusBankomatBarbarBaretBarmanBarokoBarvaBaterkaBatohBavlnaBazalkaBazilikaBazukaBednaBeranBesedaBestieBetonBezinkaBezmocBeztakBicyklBidloBiftekBikinyBilanceBiografBiologBitvaBizonBlahobytBlatouchBlechaBleduleBleskBlikatBliznaBlokovatBlouditBludBobekBobrBodlinaBodnoutBohatostBojkotBojovatBokorysBolestBorecBoroviceBotaBoubelBouchatBoudaBouleBouratBoxerBradavkaBramboraBrankaBratrBreptaBriketaBrkoBrlohBronzBroskevBrunetkaBrusinkaBrzdaBrzyBublinaBubnovatBuchtaBuditelBudkaBudovaBufetBujarostBukviceBuldokBulvaBundaBunkrBurzaButikBuvolBuzolaBydletBylinaBytovkaBzukotCapartCarevnaCedrCeduleCejchCejnCelaCelerCelkemCelniceCeninaCennostCenovkaCentrumCenzorCestopisCetkaChalupaChapadloCharitaChataChechtatChemieChichotChirurgChladChlebaChlubitChmelChmuraChobotChocholChodbaCholeraChomoutChopitChorobaChovChrapotChrlitChrtChrupChtivostChudinaChutnatChvatChvilkaChvostChybaChystatChytitCibuleCigaretaCihelnaCihlaCinkotCirkusCisternaCitaceCitrusCizinecCizostClonaCokolivCouvatCtitelCtnostCudnostCuketaCukrCupotCvaknoutCvalCvikCvrkotCyklistaDalekoDarebaDatelDatumDceraDebataDechovkaDecibelDeficitDeflaceDeklDekretDemokratDepreseDerbyDeskaDetektivDikobrazDiktovatDiodaDiplomDiskDisplejDivadloDivochDlahaDlouhoDluhopisDnesDobroDobytekDocentDochutitDodnesDohledDohodaDohraDojemDojniceDokladDokolaDoktorDokumentDolarDolevaDolinaDomaDominantDomluvitDomovDonutitDopadDopisDoplnitDoposudDoprovodDopustitDorazitDorostDortDosahDoslovDostatekDosudDosytaDotazDotekDotknoutDoufatDoutnatDovozceDozaduDoznatDozorceDrahotaDrakDramatikDravecDrazeDrdolDrobnostDrogerieDrozdDrsnostDrtitDrzostDubenDuchovnoDudekDuhaDuhovkaDusitDusnoDutostDvojiceDvorecDynamitEkologEkonomieElektronElipsaEmailEmiseEmoceEmpatieEpizodaEpochaEpopejEposEsejEsenceEskortaEskymoEtiketaEuforieEvoluceExekuceExkurzeExpediceExplozeExportExtraktFackaFajfkaFakultaFanatikFantazieFarmacieFavoritFazoleFederaceFejetonFenkaFialkaFigurantFilozofFiltrFinanceFintaFixaceFjordFlanelFlirtFlotilaFondFosforFotbalFotkaFotonFrakceFreskaFrontaFukarFunkceFyzikaGalejeGarantGenetikaGeologGilotinaGlazuraGlejtGolemGolfistaGotikaGrafGramofonGranuleGrepGrilGrogGroteskaGumaHadiceHadrHalaHalenkaHanbaHanopisHarfaHarpunaHavranHebkostHejkalHejnoHejtmanHektarHelmaHematomHerecHernaHesloHezkyHistorikHladovkaHlasivkyHlavaHledatHlenHlodavecHlohHloupostHltatHlubinaHluchotaHmatHmotaHmyzHnisHnojivoHnoutHoblinaHobojHochHodinyHodlatHodnotaHodovatHojnostHokejHolinkaHolkaHolubHomoleHonitbaHonoraceHoralHordaHorizontHorkoHorlivecHormonHorninaHoroskopHorstvoHospodaHostinaHotovostHoubaHoufHoupatHouskaHovorHradbaHraniceHravostHrazdaHrbolekHrdinaHrdloHrdostHrnekHrobkaHromadaHrotHroudaHrozenHrstkaHrubostHryzatHubenostHubnoutHudbaHukotHumrHusitaHustotaHvozdHybnostHydrantHygienaHymnaHysterikIdylkaIhnedIkonaIluzeImunitaInfekceInflaceInkasoInovaceInspekceInternetInvalidaInvestorInzerceIronieJablkoJachtaJahodaJakmileJakostJalovecJantarJarmarkJaroJasanJasnoJatkaJavorJazykJedinecJedleJednatelJehlanJekotJelenJelitoJemnostJenomJepiceJeseterJevitJezdecJezeroJinakJindyJinochJiskraJistotaJitrniceJizvaJmenovatJogurtJurtaKabaretKabelKabinetKachnaKadetKadidloKahanKajakKajutaKakaoKaktusKalamitaKalhotyKalibrKalnostKameraKamkolivKamnaKanibalKanoeKantorKapalinaKapelaKapitolaKapkaKapleKapotaKaprKapustaKapybaraKaramelKarotkaKartonKasaKatalogKatedraKauceKauzaKavalecKazajkaKazetaKazivostKdekolivKdesiKedlubenKempKeramikaKinoKlacekKladivoKlamKlapotKlasikaKlaunKlecKlenbaKlepatKlesnoutKlidKlimaKlisnaKloboukKlokanKlopaKloubKlubovnaKlusatKluzkostKmenKmitatKmotrKnihaKnotKoaliceKoberecKobkaKoblihaKobylaKocourKohoutKojenecKokosKoktejlKolapsKoledaKolizeKoloKomandoKometaKomikKomnataKomoraKompasKomunitaKonatKonceptKondiceKonecKonfeseKongresKoninaKonkursKontaktKonzervaKopanecKopieKopnoutKoprovkaKorbelKorektorKormidloKoroptevKorpusKorunaKorytoKorzetKosatecKostkaKotelKotletaKotoulKoukatKoupelnaKousekKouzloKovbojKozaKozorohKrabiceKrachKrajinaKralovatKrasopisKravataKreditKrejcarKresbaKrevetaKriketKritikKrizeKrkavecKrmelecKrmivoKrocanKrokKronikaKropitKroupaKrovkaKrtekKruhadloKrupiceKrutostKrvinkaKrychleKryptaKrystalKrytKudlankaKufrKujnostKuklaKulajdaKulichKulkaKulometKulturaKunaKupodivuKurtKurzorKutilKvalitaKvasinkaKvestorKynologKyselinaKytaraKyticeKytkaKytovecKyvadloLabradorLachtanLadnostLaikLakomecLamelaLampaLanovkaLasiceLasoLasturaLatinkaLavinaLebkaLeckdyLedenLedniceLedovkaLedvinaLegendaLegieLegraceLehceLehkostLehnoutLektvarLenochodLentilkaLepenkaLepidloLetadloLetecLetmoLetokruhLevhartLevitaceLevobokLibraLichotkaLidojedLidskostLihovinaLijavecLilekLimetkaLinieLinkaLinoleumListopadLitinaLitovatLobistaLodivodLogikaLogopedLokalitaLoketLomcovatLopataLopuchLordLososLotrLoudalLouhLoukaLouskatLovecLstivostLucernaLuciferLumpLuskLustraceLviceLyraLyrikaLysinaMadamMadloMagistrMahagonMajetekMajitelMajoritaMakakMakoviceMakrelaMalbaMalinaMalovatMalviceMaminkaMandleMankoMarnostMasakrMaskotMasopustMaticeMatrikaMaturitaMazanecMazivoMazlitMazurkaMdlobaMechanikMeditaceMedovinaMelasaMelounMentolkaMetlaMetodaMetrMezeraMigraceMihnoutMihuleMikinaMikrofonMilenecMilimetrMilostMimikaMincovnaMinibarMinometMinulostMiskaMistrMixovatMladostMlhaMlhovinaMlokMlsatMluvitMnichMnohemMobilMocnostModelkaModlitbaMohylaMokroMolekulaMomentkaMonarchaMonoklMonstrumMontovatMonzunMosazMoskytMostMotivaceMotorkaMotykaMouchaMoudrostMozaikaMozekMozolMramorMravenecMrkevMrtvolaMrzetMrzutostMstitelMudrcMuflonMulatMumieMuniceMusetMutaceMuzeumMuzikantMyslivecMzdaNabouratNachytatNadaceNadbytekNadhozNadobroNadpisNahlasNahnatNahodileNahraditNaivitaNajednouNajistoNajmoutNaklonitNakonecNakrmitNalevoNamazatNamluvitNanometrNaokoNaopakNaostroNapadatNapevnoNaplnitNapnoutNaposledNaprostoNaroditNarubyNarychloNasaditNasekatNaslepoNastatNatolikNavenekNavrchNavzdoryNazvatNebeNechatNeckyNedalekoNedbatNeduhNegaceNehetNehodaNejenNejprveNeklidNelibostNemilostNemocNeochotaNeonkaNepokojNerostNervNesmyslNesouladNetvorNeuronNevinaNezvykleNicotaNijakNikamNikdyNiklNikterakNitroNoclehNohaviceNominaceNoraNorekNositelNosnostNouzeNovinyNovotaNozdraNudaNudleNugetNutitNutnostNutrieNymfaObalObarvitObavaObdivObecObehnatObejmoutObezitaObhajobaObilniceObjasnitObjektObklopitOblastOblekOblibaOblohaObludaObnosObohatitObojekOboutObrazecObrnaObrubaObrysObsahObsluhaObstaratObuvObvazObvinitObvodObvykleObyvatelObzorOcasOcelOcenitOchladitOchotaOchranaOcitnoutOdbojOdbytOdchodOdcizitOdebratOdeslatOdevzdatOdezvaOdhadceOdhoditOdjetOdjinudOdkazOdkoupitOdlivOdlukaOdmlkaOdolnostOdpadOdpisOdploutOdporOdpustitOdpykatOdrazkaOdsouditOdstupOdsunOdtokOdtudOdvahaOdvetaOdvolatOdvracetOdznakOfinaOfsajdOhlasOhniskoOhradaOhrozitOhryzekOkapOkeniceOklikaOknoOkouzlitOkovyOkrasaOkresOkrsekOkruhOkupantOkurkaOkusitOlejninaOlizovatOmakOmeletaOmezitOmladinaOmlouvatOmluvaOmylOnehdyOpakovatOpasekOperaceOpiceOpilostOpisovatOporaOpoziceOpravduOprotiOrbitalOrchestrOrgieOrliceOrlojOrtelOsadaOschnoutOsikaOsivoOslavaOslepitOslnitOslovitOsnovaOsobaOsolitOspalecOstenOstrahaOstudaOstychOsvojitOteplitOtiskOtopOtrhatOtrlostOtrokOtrubyOtvorOvanoutOvarOvesOvlivnitOvoceOxidOzdobaPachatelPacientPadouchPahorekPaktPalandaPalecPalivoPalubaPamfletPamlsekPanenkaPanikaPannaPanovatPanstvoPantoflePaprikaParketaParodiePartaParukaParybaPasekaPasivitaPastelkaPatentPatronaPavoukPaznehtPazourekPeckaPedagogPejsekPekloPelotonPenaltaPendrekPenzePeriskopPeroPestrostPetardaPeticePetrolejPevninaPexesoPianistaPihaPijavicePiklePiknikPilinaPilnostPilulkaPinzetaPipetaPisatelPistolePitevnaPivnicePivovarPlacentaPlakatPlamenPlanetaPlastikaPlatitPlavidloPlazPlechPlemenoPlentaPlesPletivoPlevelPlivatPlnitPlnoPlochaPlodinaPlombaPloutPlukPlynPobavitPobytPochodPocitPoctivecPodatPodcenitPodepsatPodhledPodivitPodkladPodmanitPodnikPodobaPodporaPodrazPodstataPodvodPodzimPoeziePohankaPohnutkaPohovorPohromaPohybPointaPojistkaPojmoutPokazitPoklesPokojPokrokPokutaPokynPolednePolibekPolknoutPolohaPolynomPomaluPominoutPomlkaPomocPomstaPomysletPonechatPonorkaPonurostPopadatPopelPopisekPoplachPoprositPopsatPopudPoradcePorcePorodPoruchaPoryvPosaditPosedPosilaPoskokPoslanecPosouditPospoluPostavaPosudekPosypPotahPotkanPotleskPotomekPotravaPotupaPotvoraPoukazPoutoPouzdroPovahaPovidlaPovlakPovozPovrchPovstatPovykPovzdechPozdravPozemekPoznatekPozorPozvatPracovatPrahoryPraktikaPralesPraotecPraporekPrasePravdaPrincipPrknoProbuditProcentoProdejProfeseProhraProjektProlomitPromilePronikatPropadProrokProsbaProtonProutekProvazPrskavkaPrstenPrudkostPrutPrvekPrvohoryPsanecPsovodPstruhPtactvoPubertaPuchPudlPukavecPuklinaPukrlePultPumpaPuncPupenPusaPusinkaPustinaPutovatPutykaPyramidaPyskPytelRacekRachotRadiaceRadniceRadonRaftRagbyRaketaRakovinaRamenoRampouchRandeRarachRaritaRasovnaRastrRatolestRazanceRazidloReagovatReakceReceptRedaktorReferentReflexRejnokReklamaRekordRekrutRektorReputaceRevizeRevmaRevolverRezervaRiskovatRizikoRobotikaRodokmenRohovkaRokleRokokoRomanetoRopovodRopuchaRorejsRosolRostlinaRotmistrRotopedRotundaRoubenkaRouchoRoupRouraRovinaRovniceRozborRozchodRozdatRozeznatRozhodceRozinkaRozjezdRozkazRozlohaRozmarRozpadRozruchRozsahRoztokRozumRozvodRubrikaRuchadloRukaviceRukopisRybaRybolovRychlostRydloRypadloRytinaRyzostSadistaSahatSakoSamecSamizdatSamotaSanitkaSardinkaSasankaSatelitSazbaSazeniceSborSchovatSebrankaSeceseSedadloSedimentSedloSehnatSejmoutSekeraSektaSekundaSekvojeSemenoSenoServisSesaditSeshoraSeskokSeslatSestraSesuvSesypatSetbaSetinaSetkatSetnoutSetrvatSeverSeznamShodaShrnoutSifonSilniceSirkaSirotekSirupSituaceSkafandrSkaliskoSkanzenSkautSkeptikSkicaSkladbaSkleniceSkloSkluzSkobaSkokanSkoroSkriptaSkrzSkupinaSkvostSkvrnaSlabikaSladidloSlaninaSlastSlavnostSledovatSlepecSlevaSlezinaSlibSlinaSlizniceSlonSloupekSlovoSluchSluhaSlunceSlupkaSlzaSmaragdSmetanaSmilstvoSmlouvaSmogSmradSmrkSmrtkaSmutekSmyslSnadSnahaSnobSobotaSochaSodovkaSokolSopkaSotvaSoubojSoucitSoudceSouhlasSouladSoumrakSoupravaSousedSoutokSouvisetSpalovnaSpasitelSpisSplavSpodekSpojenecSpoluSponzorSpornostSpoustaSprchaSpustitSrandaSrazSrdceSrnaSrnecSrovnatSrpenSrstSrubStaniceStarostaStatikaStavbaStehnoStezkaStodolaStolekStopaStornoStoupatStrachStresStrhnoutStromStrunaStudnaStupniceStvolStykSubjektSubtropySucharSudostSuknoSundatSunoutSurikataSurovinaSvahSvalstvoSvetrSvatbaSvazekSvisleSvitekSvobodaSvodidloSvorkaSvrabSykavkaSykotSynekSynovecSypatSypkostSyrovostSyselSytostTabletkaTabuleTahounTajemnoTajfunTajgaTajitTajnostTaktikaTamhleTamponTancovatTanecTankerTapetaTaveninaTazatelTechnikaTehdyTekutinaTelefonTemnotaTendenceTenistaTenorTeplotaTepnaTeprveTerapieTermoskaTextilTichoTiskopisTitulekTkadlecTkaninaTlapkaTleskatTlukotTlupaTmelToaletaTopinkaTopolTorzoTouhaToulecTradiceTraktorTrampTrasaTraverzaTrefitTrestTrezorTrhavinaTrhlinaTrochuTrojiceTroskaTroubaTrpceTrpitelTrpkostTrubecTruchlitTruhliceTrusTrvatTudyTuhnoutTuhostTundraTuristaTurnajTuzemskoTvarohTvorbaTvrdostTvrzTygrTykevUbohostUbozeUbratUbrousekUbrusUbytovnaUchoUctivostUdivitUhraditUjednatUjistitUjmoutUkazatelUklidnitUklonitUkotvitUkrojitUliceUlitaUlovitUmyvadloUnavitUniformaUniknoutUpadnoutUplatnitUplynoutUpoutatUpravitUranUrazitUsednoutUsilovatUsmrtitUsnadnitUsnoutUsouditUstlatUstrnoutUtahovatUtkatUtlumitUtonoutUtopenecUtrousitUvalitUvolnitUvozovkaUzdravitUzelUzeninaUzlinaUznatVagonValchaValounVanaVandalVanilkaVaranVarhanyVarovatVcelkuVchodVdovaVedroVegetaceVejceVelbloudVeletrhVelitelVelmocVelrybaVenkovVerandaVerzeVeselkaVeskrzeVesniceVespoduVestaVeterinaVeverkaVibraceVichrVideohraVidinaVidleVilaViniceVisetVitalitaVizeVizitkaVjezdVkladVkusVlajkaVlakVlasecVlevoVlhkostVlivVlnovkaVloupatVnucovatVnukVodaVodivostVodoznakVodstvoVojenskyVojnaVojskoVolantVolbaVolitVolnoVoskovkaVozidloVozovnaVpravoVrabecVracetVrahVrataVrbaVrcholekVrhatVrstvaVrtuleVsaditVstoupitVstupVtipVybavitVybratVychovatVydatVydraVyfotitVyhledatVyhnoutVyhoditVyhraditVyhubitVyjasnitVyjetVyjmoutVyklopitVykonatVylekatVymazatVymezitVymizetVymysletVynechatVynikatVynutitVypadatVyplatitVypravitVypustitVyrazitVyrovnatVyrvatVyslovitVysokoVystavitVysunoutVysypatVytasitVytesatVytratitVyvinoutVyvolatVyvrhelVyzdobitVyznatVzaduVzbuditVzchopitVzdorVzduchVzdychatVzestupVzhledemVzkazVzlykatVznikVzorekVzpouraVztahVztekXylofonZabratZabydletZachovatZadarmoZadusitZafoukatZahltitZahoditZahradaZahynoutZajatecZajetZajistitZaklepatZakoupitZalepitZamezitZamotatZamysletZanechatZanikatZaplatitZapojitZapsatZarazitZastavitZasunoutZatajitZatemnitZatknoutZaujmoutZavalitZaveletZavinitZavolatZavrtatZazvonitZbavitZbrusuZbudovatZbytekZdalekaZdarmaZdatnostZdivoZdobitZdrojZdvihZdymadloZeleninaZemanZeminaZeptatZezaduZezdolaZhatitZhltnoutZhlubokaZhotovitZhrubaZimaZimniceZjemnitZklamatZkoumatZkratkaZkumavkaZlatoZlehkaZlobaZlomZlostZlozvykZmapovatZmarZmatekZmijeZmizetZmocnitZmodratZmrzlinaZmutovatZnakZnalostZnamenatZnovuZobrazitZotavitZoubekZoufaleZploditZpomalitZpravaZprostitZprudkaZprvuZradaZranitZrcadloZrnitostZrnoZrovnaZrychlitZrzavostZtichaZtratitZubovinaZubrZvednoutZvenkuZveselaZvonZvratZvukovodZvyk"; +let wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" "); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"].check(lang) !== "0x25f44555f4af25b51a711136e1c7d6e50ce9f8917d39d6b1f076b2bb4d2fac1a") { + wordlist = null; + throw new Error("BIP39 Wordlist for en (English) FAILED"); + } +} +class LangCz extends _wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"] { + constructor() { + super("cz"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return wordlist.indexOf(word); + } +} +const langCz = new LangCz(); +_wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"].register(langCz); + +//# sourceMappingURL=lang-cz.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-en.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-en.js ***! + \******************************************************************/ +/*! exports provided: langEn */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langEn", function() { return langEn; }); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + +const words = "AbandonAbilityAbleAboutAboveAbsentAbsorbAbstractAbsurdAbuseAccessAccidentAccountAccuseAchieveAcidAcousticAcquireAcrossActActionActorActressActualAdaptAddAddictAddressAdjustAdmitAdultAdvanceAdviceAerobicAffairAffordAfraidAgainAgeAgentAgreeAheadAimAirAirportAisleAlarmAlbumAlcoholAlertAlienAllAlleyAllowAlmostAloneAlphaAlreadyAlsoAlterAlwaysAmateurAmazingAmongAmountAmusedAnalystAnchorAncientAngerAngleAngryAnimalAnkleAnnounceAnnualAnotherAnswerAntennaAntiqueAnxietyAnyApartApologyAppearAppleApproveAprilArchArcticAreaArenaArgueArmArmedArmorArmyAroundArrangeArrestArriveArrowArtArtefactArtistArtworkAskAspectAssaultAssetAssistAssumeAsthmaAthleteAtomAttackAttendAttitudeAttractAuctionAuditAugustAuntAuthorAutoAutumnAverageAvocadoAvoidAwakeAwareAwayAwesomeAwfulAwkwardAxisBabyBachelorBaconBadgeBagBalanceBalconyBallBambooBananaBannerBarBarelyBargainBarrelBaseBasicBasketBattleBeachBeanBeautyBecauseBecomeBeefBeforeBeginBehaveBehindBelieveBelowBeltBenchBenefitBestBetrayBetterBetweenBeyondBicycleBidBikeBindBiologyBirdBirthBitterBlackBladeBlameBlanketBlastBleakBlessBlindBloodBlossomBlouseBlueBlurBlushBoardBoatBodyBoilBombBoneBonusBookBoostBorderBoringBorrowBossBottomBounceBoxBoyBracketBrainBrandBrassBraveBreadBreezeBrickBridgeBriefBrightBringBriskBroccoliBrokenBronzeBroomBrotherBrownBrushBubbleBuddyBudgetBuffaloBuildBulbBulkBulletBundleBunkerBurdenBurgerBurstBusBusinessBusyButterBuyerBuzzCabbageCabinCableCactusCageCakeCallCalmCameraCampCanCanalCancelCandyCannonCanoeCanvasCanyonCapableCapitalCaptainCarCarbonCardCargoCarpetCarryCartCaseCashCasinoCastleCasualCatCatalogCatchCategoryCattleCaughtCauseCautionCaveCeilingCeleryCementCensusCenturyCerealCertainChairChalkChampionChangeChaosChapterChargeChaseChatCheapCheckCheeseChefCherryChestChickenChiefChildChimneyChoiceChooseChronicChuckleChunkChurnCigarCinnamonCircleCitizenCityCivilClaimClapClarifyClawClayCleanClerkCleverClickClientCliffClimbClinicClipClockClogCloseClothCloudClownClubClumpClusterClutchCoachCoastCoconutCodeCoffeeCoilCoinCollectColorColumnCombineComeComfortComicCommonCompanyConcertConductConfirmCongressConnectConsiderControlConvinceCookCoolCopperCopyCoralCoreCornCorrectCostCottonCouchCountryCoupleCourseCousinCoverCoyoteCrackCradleCraftCramCraneCrashCraterCrawlCrazyCreamCreditCreekCrewCricketCrimeCrispCriticCropCrossCrouchCrowdCrucialCruelCruiseCrumbleCrunchCrushCryCrystalCubeCultureCupCupboardCuriousCurrentCurtainCurveCushionCustomCuteCycleDadDamageDampDanceDangerDaringDashDaughterDawnDayDealDebateDebrisDecadeDecemberDecideDeclineDecorateDecreaseDeerDefenseDefineDefyDegreeDelayDeliverDemandDemiseDenialDentistDenyDepartDependDepositDepthDeputyDeriveDescribeDesertDesignDeskDespairDestroyDetailDetectDevelopDeviceDevoteDiagramDialDiamondDiaryDiceDieselDietDifferDigitalDignityDilemmaDinnerDinosaurDirectDirtDisagreeDiscoverDiseaseDishDismissDisorderDisplayDistanceDivertDivideDivorceDizzyDoctorDocumentDogDollDolphinDomainDonateDonkeyDonorDoorDoseDoubleDoveDraftDragonDramaDrasticDrawDreamDressDriftDrillDrinkDripDriveDropDrumDryDuckDumbDuneDuringDustDutchDutyDwarfDynamicEagerEagleEarlyEarnEarthEasilyEastEasyEchoEcologyEconomyEdgeEditEducateEffortEggEightEitherElbowElderElectricElegantElementElephantElevatorEliteElseEmbarkEmbodyEmbraceEmergeEmotionEmployEmpowerEmptyEnableEnactEndEndlessEndorseEnemyEnergyEnforceEngageEngineEnhanceEnjoyEnlistEnoughEnrichEnrollEnsureEnterEntireEntryEnvelopeEpisodeEqualEquipEraEraseErodeErosionErrorEruptEscapeEssayEssenceEstateEternalEthicsEvidenceEvilEvokeEvolveExactExampleExcessExchangeExciteExcludeExcuseExecuteExerciseExhaustExhibitExileExistExitExoticExpandExpectExpireExplainExposeExpressExtendExtraEyeEyebrowFabricFaceFacultyFadeFaintFaithFallFalseFameFamilyFamousFanFancyFantasyFarmFashionFatFatalFatherFatigueFaultFavoriteFeatureFebruaryFederalFeeFeedFeelFemaleFenceFestivalFetchFeverFewFiberFictionFieldFigureFileFilmFilterFinalFindFineFingerFinishFireFirmFirstFiscalFishFitFitnessFixFlagFlameFlashFlatFlavorFleeFlightFlipFloatFlockFloorFlowerFluidFlushFlyFoamFocusFogFoilFoldFollowFoodFootForceForestForgetForkFortuneForumForwardFossilFosterFoundFoxFragileFrameFrequentFreshFriendFringeFrogFrontFrostFrownFrozenFruitFuelFunFunnyFurnaceFuryFutureGadgetGainGalaxyGalleryGameGapGarageGarbageGardenGarlicGarmentGasGaspGateGatherGaugeGazeGeneralGeniusGenreGentleGenuineGestureGhostGiantGiftGiggleGingerGiraffeGirlGiveGladGlanceGlareGlassGlideGlimpseGlobeGloomGloryGloveGlowGlueGoatGoddessGoldGoodGooseGorillaGospelGossipGovernGownGrabGraceGrainGrantGrapeGrassGravityGreatGreenGridGriefGritGroceryGroupGrowGruntGuardGuessGuideGuiltGuitarGunGymHabitHairHalfHammerHamsterHandHappyHarborHardHarshHarvestHatHaveHawkHazardHeadHealthHeartHeavyHedgehogHeightHelloHelmetHelpHenHeroHiddenHighHillHintHipHireHistoryHobbyHockeyHoldHoleHolidayHollowHomeHoneyHoodHopeHornHorrorHorseHospitalHostHotelHourHoverHubHugeHumanHumbleHumorHundredHungryHuntHurdleHurryHurtHusbandHybridIceIconIdeaIdentifyIdleIgnoreIllIllegalIllnessImageImitateImmenseImmuneImpactImposeImproveImpulseInchIncludeIncomeIncreaseIndexIndicateIndoorIndustryInfantInflictInformInhaleInheritInitialInjectInjuryInmateInnerInnocentInputInquiryInsaneInsectInsideInspireInstallIntactInterestIntoInvestInviteInvolveIronIslandIsolateIssueItemIvoryJacketJaguarJarJazzJealousJeansJellyJewelJobJoinJokeJourneyJoyJudgeJuiceJumpJungleJuniorJunkJustKangarooKeenKeepKetchupKeyKickKidKidneyKindKingdomKissKitKitchenKiteKittenKiwiKneeKnifeKnockKnowLabLabelLaborLadderLadyLakeLampLanguageLaptopLargeLaterLatinLaughLaundryLavaLawLawnLawsuitLayerLazyLeaderLeafLearnLeaveLectureLeftLegLegalLegendLeisureLemonLendLengthLensLeopardLessonLetterLevelLiarLibertyLibraryLicenseLifeLiftLightLikeLimbLimitLinkLionLiquidListLittleLiveLizardLoadLoanLobsterLocalLockLogicLonelyLongLoopLotteryLoudLoungeLoveLoyalLuckyLuggageLumberLunarLunchLuxuryLyricsMachineMadMagicMagnetMaidMailMainMajorMakeMammalManManageMandateMangoMansionManualMapleMarbleMarchMarginMarineMarketMarriageMaskMassMasterMatchMaterialMathMatrixMatterMaximumMazeMeadowMeanMeasureMeatMechanicMedalMediaMelodyMeltMemberMemoryMentionMenuMercyMergeMeritMerryMeshMessageMetalMethodMiddleMidnightMilkMillionMimicMindMinimumMinorMinuteMiracleMirrorMiseryMissMistakeMixMixedMixtureMobileModelModifyMomMomentMonitorMonkeyMonsterMonthMoonMoralMoreMorningMosquitoMotherMotionMotorMountainMouseMoveMovieMuchMuffinMuleMultiplyMuscleMuseumMushroomMusicMustMutualMyselfMysteryMythNaiveNameNapkinNarrowNastyNationNatureNearNeckNeedNegativeNeglectNeitherNephewNerveNestNetNetworkNeutralNeverNewsNextNiceNightNobleNoiseNomineeNoodleNormalNorthNoseNotableNoteNothingNoticeNovelNowNuclearNumberNurseNutOakObeyObjectObligeObscureObserveObtainObviousOccurOceanOctoberOdorOffOfferOfficeOftenOilOkayOldOliveOlympicOmitOnceOneOnionOnlineOnlyOpenOperaOpinionOpposeOptionOrangeOrbitOrchardOrderOrdinaryOrganOrientOriginalOrphanOstrichOtherOutdoorOuterOutputOutsideOvalOvenOverOwnOwnerOxygenOysterOzonePactPaddlePagePairPalacePalmPandaPanelPanicPantherPaperParadeParentParkParrotPartyPassPatchPathPatientPatrolPatternPausePavePaymentPeacePeanutPearPeasantPelicanPenPenaltyPencilPeoplePepperPerfectPermitPersonPetPhonePhotoPhrasePhysicalPianoPicnicPicturePiecePigPigeonPillPilotPinkPioneerPipePistolPitchPizzaPlacePlanetPlasticPlatePlayPleasePledgePluckPlugPlungePoemPoetPointPolarPolePolicePondPonyPoolPopularPortionPositionPossiblePostPotatoPotteryPovertyPowderPowerPracticePraisePredictPreferPreparePresentPrettyPreventPricePridePrimaryPrintPriorityPrisonPrivatePrizeProblemProcessProduceProfitProgramProjectPromoteProofPropertyProsperProtectProudProvidePublicPuddingPullPulpPulsePumpkinPunchPupilPuppyPurchasePurityPurposePursePushPutPuzzlePyramidQualityQuantumQuarterQuestionQuickQuitQuizQuoteRabbitRaccoonRaceRackRadarRadioRailRainRaiseRallyRampRanchRandomRangeRapidRareRateRatherRavenRawRazorReadyRealReasonRebelRebuildRecallReceiveRecipeRecordRecycleReduceReflectReformRefuseRegionRegretRegularRejectRelaxReleaseReliefRelyRemainRememberRemindRemoveRenderRenewRentReopenRepairRepeatReplaceReportRequireRescueResembleResistResourceResponseResultRetireRetreatReturnReunionRevealReviewRewardRhythmRibRibbonRiceRichRideRidgeRifleRightRigidRingRiotRippleRiskRitualRivalRiverRoadRoastRobotRobustRocketRomanceRoofRookieRoomRoseRotateRoughRoundRouteRoyalRubberRudeRugRuleRunRunwayRuralSadSaddleSadnessSafeSailSaladSalmonSalonSaltSaluteSameSampleSandSatisfySatoshiSauceSausageSaveSayScaleScanScareScatterSceneSchemeSchoolScienceScissorsScorpionScoutScrapScreenScriptScrubSeaSearchSeasonSeatSecondSecretSectionSecuritySeedSeekSegmentSelectSellSeminarSeniorSenseSentenceSeriesServiceSessionSettleSetupSevenShadowShaftShallowShareShedShellSheriffShieldShiftShineShipShiverShockShoeShootShopShortShoulderShoveShrimpShrugShuffleShySiblingSickSideSiegeSightSignSilentSilkSillySilverSimilarSimpleSinceSingSirenSisterSituateSixSizeSkateSketchSkiSkillSkinSkirtSkullSlabSlamSleepSlenderSliceSlideSlightSlimSloganSlotSlowSlushSmallSmartSmileSmokeSmoothSnackSnakeSnapSniffSnowSoapSoccerSocialSockSodaSoftSolarSoldierSolidSolutionSolveSomeoneSongSoonSorrySortSoulSoundSoupSourceSouthSpaceSpareSpatialSpawnSpeakSpecialSpeedSpellSpendSphereSpiceSpiderSpikeSpinSpiritSplitSpoilSponsorSpoonSportSpotSpraySpreadSpringSpySquareSqueezeSquirrelStableStadiumStaffStageStairsStampStandStartStateStaySteakSteelStemStepStereoStickStillStingStockStomachStoneStoolStoryStoveStrategyStreetStrikeStrongStruggleStudentStuffStumbleStyleSubjectSubmitSubwaySuccessSuchSuddenSufferSugarSuggestSuitSummerSunSunnySunsetSuperSupplySupremeSureSurfaceSurgeSurpriseSurroundSurveySuspectSustainSwallowSwampSwapSwarmSwearSweetSwiftSwimSwingSwitchSwordSymbolSymptomSyrupSystemTableTackleTagTailTalentTalkTankTapeTargetTaskTasteTattooTaxiTeachTeamTellTenTenantTennisTentTermTestTextThankThatThemeThenTheoryThereTheyThingThisThoughtThreeThriveThrowThumbThunderTicketTideTigerTiltTimberTimeTinyTipTiredTissueTitleToastTobaccoTodayToddlerToeTogetherToiletTokenTomatoTomorrowToneTongueTonightToolToothTopTopicToppleTorchTornadoTortoiseTossTotalTouristTowardTowerTownToyTrackTradeTrafficTragicTrainTransferTrapTrashTravelTrayTreatTreeTrendTrialTribeTrickTriggerTrimTripTrophyTroubleTruckTrueTrulyTrumpetTrustTruthTryTubeTuitionTumbleTunaTunnelTurkeyTurnTurtleTwelveTwentyTwiceTwinTwistTwoTypeTypicalUglyUmbrellaUnableUnawareUncleUncoverUnderUndoUnfairUnfoldUnhappyUniformUniqueUnitUniverseUnknownUnlockUntilUnusualUnveilUpdateUpgradeUpholdUponUpperUpsetUrbanUrgeUsageUseUsedUsefulUselessUsualUtilityVacantVacuumVagueValidValleyValveVanVanishVaporVariousVastVaultVehicleVelvetVendorVentureVenueVerbVerifyVersionVeryVesselVeteranViableVibrantViciousVictoryVideoViewVillageVintageViolinVirtualVirusVisaVisitVisualVitalVividVocalVoiceVoidVolcanoVolumeVoteVoyageWageWagonWaitWalkWallWalnutWantWarfareWarmWarriorWashWaspWasteWaterWaveWayWealthWeaponWearWeaselWeatherWebWeddingWeekendWeirdWelcomeWestWetWhaleWhatWheatWheelWhenWhereWhipWhisperWideWidthWifeWildWillWinWindowWineWingWinkWinnerWinterWireWisdomWiseWishWitnessWolfWomanWonderWoodWoolWordWorkWorldWorryWorthWrapWreckWrestleWristWriteWrongYardYearYellowYouYoungYouthZebraZeroZoneZoo"; +let wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" "); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"].check(lang) !== "0x3c8acc1e7b08d8e76f9fda015ef48dc8c710a73cb7e0f77b2c18a9b5a7adde60") { + wordlist = null; + throw new Error("BIP39 Wordlist for en (English) FAILED"); + } +} +class LangEn extends _wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"] { + constructor() { + super("en"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return wordlist.indexOf(word); + } +} +const langEn = new LangEn(); +_wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"].register(langEn); + +//# sourceMappingURL=lang-en.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-es.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-es.js ***! + \******************************************************************/ +/*! exports provided: langEs */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langEs", function() { return langEs; }); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + + +const words = "A/bacoAbdomenAbejaAbiertoAbogadoAbonoAbortoAbrazoAbrirAbueloAbusoAcabarAcademiaAccesoAccio/nAceiteAcelgaAcentoAceptarA/cidoAclararAcne/AcogerAcosoActivoActoActrizActuarAcudirAcuerdoAcusarAdictoAdmitirAdoptarAdornoAduanaAdultoAe/reoAfectarAficio/nAfinarAfirmarA/gilAgitarAgoni/aAgostoAgotarAgregarAgrioAguaAgudoA/guilaAgujaAhogoAhorroAireAislarAjedrezAjenoAjusteAlacra/nAlambreAlarmaAlbaA/lbumAlcaldeAldeaAlegreAlejarAlertaAletaAlfilerAlgaAlgodo/nAliadoAlientoAlivioAlmaAlmejaAlmi/barAltarAltezaAltivoAltoAlturaAlumnoAlzarAmableAmanteAmapolaAmargoAmasarA/mbarA/mbitoAmenoAmigoAmistadAmorAmparoAmplioAnchoAncianoAnclaAndarAnde/nAnemiaA/nguloAnilloA/nimoAni/sAnotarAntenaAntiguoAntojoAnualAnularAnuncioA~adirA~ejoA~oApagarAparatoApetitoApioAplicarApodoAporteApoyoAprenderAprobarApuestaApuroAradoAra~aArarA/rbitroA/rbolArbustoArchivoArcoArderArdillaArduoA/reaA/ridoAriesArmoni/aArne/sAromaArpaArpo/nArregloArrozArrugaArteArtistaAsaAsadoAsaltoAscensoAsegurarAseoAsesorAsientoAsiloAsistirAsnoAsombroA/speroAstillaAstroAstutoAsumirAsuntoAtajoAtaqueAtarAtentoAteoA/ticoAtletaA/tomoAtraerAtrozAtu/nAudazAudioAugeAulaAumentoAusenteAutorAvalAvanceAvaroAveAvellanaAvenaAvestruzAvio/nAvisoAyerAyudaAyunoAzafra/nAzarAzoteAzu/carAzufreAzulBabaBaborBacheBahi/aBaileBajarBalanzaBalco/nBaldeBambu/BancoBandaBa~oBarbaBarcoBarnizBarroBa/sculaBasto/nBasuraBatallaBateri/aBatirBatutaBau/lBazarBebe/BebidaBelloBesarBesoBestiaBichoBienBingoBlancoBloqueBlusaBoaBobinaBoboBocaBocinaBodaBodegaBoinaBolaBoleroBolsaBombaBondadBonitoBonoBonsa/iBordeBorrarBosqueBoteBoti/nBo/vedaBozalBravoBrazoBrechaBreveBrilloBrincoBrisaBrocaBromaBronceBroteBrujaBruscoBrutoBuceoBucleBuenoBueyBufandaBufo/nBu/hoBuitreBultoBurbujaBurlaBurroBuscarButacaBuzo/nCaballoCabezaCabinaCabraCacaoCada/verCadenaCaerCafe/Cai/daCaima/nCajaCajo/nCalCalamarCalcioCaldoCalidadCalleCalmaCalorCalvoCamaCambioCamelloCaminoCampoCa/ncerCandilCanelaCanguroCanicaCantoCa~aCa~o/nCaobaCaosCapazCapita/nCapoteCaptarCapuchaCaraCarbo/nCa/rcelCaretaCargaCari~oCarneCarpetaCarroCartaCasaCascoCaseroCaspaCastorCatorceCatreCaudalCausaCazoCebollaCederCedroCeldaCe/lebreCelosoCe/lulaCementoCenizaCentroCercaCerdoCerezaCeroCerrarCertezaCe/spedCetroChacalChalecoChampu/ChanclaChapaCharlaChicoChisteChivoChoqueChozaChuletaChuparCiclo/nCiegoCieloCienCiertoCifraCigarroCimaCincoCineCintaCipre/sCircoCiruelaCisneCitaCiudadClamorClanClaroClaseClaveClienteClimaCli/nicaCobreCoccio/nCochinoCocinaCocoCo/digoCodoCofreCogerCoheteCoji/nCojoColaColchaColegioColgarColinaCollarColmoColumnaCombateComerComidaCo/modoCompraCondeConejoCongaConocerConsejoContarCopaCopiaCorazo/nCorbataCorchoCordo/nCoronaCorrerCoserCosmosCostaCra/neoCra/terCrearCrecerCrei/doCremaCri/aCrimenCriptaCrisisCromoCro/nicaCroquetaCrudoCruzCuadroCuartoCuatroCuboCubrirCucharaCuelloCuentoCuerdaCuestaCuevaCuidarCulebraCulpaCultoCumbreCumplirCunaCunetaCuotaCupo/nCu/pulaCurarCuriosoCursoCurvaCutisDamaDanzaDarDardoDa/tilDeberDe/bilDe/cadaDecirDedoDefensaDefinirDejarDelfi/nDelgadoDelitoDemoraDensoDentalDeporteDerechoDerrotaDesayunoDeseoDesfileDesnudoDestinoDesvi/oDetalleDetenerDeudaDi/aDiabloDiademaDiamanteDianaDiarioDibujoDictarDienteDietaDiezDifi/cilDignoDilemaDiluirDineroDirectoDirigirDiscoDise~oDisfrazDivaDivinoDobleDoceDolorDomingoDonDonarDoradoDormirDorsoDosDosisDrago/nDrogaDuchaDudaDueloDue~oDulceDu/oDuqueDurarDurezaDuroE/banoEbrioEcharEcoEcuadorEdadEdicio/nEdificioEditorEducarEfectoEficazEjeEjemploElefanteElegirElementoElevarElipseE/liteElixirElogioEludirEmbudoEmitirEmocio/nEmpateEmpe~oEmpleoEmpresaEnanoEncargoEnchufeEnci/aEnemigoEneroEnfadoEnfermoEnga~oEnigmaEnlaceEnormeEnredoEnsayoEnse~arEnteroEntrarEnvaseEnvi/oE/pocaEquipoErizoEscalaEscenaEscolarEscribirEscudoEsenciaEsferaEsfuerzoEspadaEspejoEspi/aEsposaEspumaEsqui/EstarEsteEstiloEstufaEtapaEternoE/ticaEtniaEvadirEvaluarEventoEvitarExactoExamenExcesoExcusaExentoExigirExilioExistirE/xitoExpertoExplicarExponerExtremoFa/bricaFa/bulaFachadaFa/cilFactorFaenaFajaFaldaFalloFalsoFaltarFamaFamiliaFamosoFarao/nFarmaciaFarolFarsaFaseFatigaFaunaFavorFaxFebreroFechaFelizFeoFeriaFerozFe/rtilFervorFesti/nFiableFianzaFiarFibraFiccio/nFichaFideoFiebreFielFieraFiestaFiguraFijarFijoFilaFileteFilialFiltroFinFincaFingirFinitoFirmaFlacoFlautaFlechaFlorFlotaFluirFlujoFlu/orFobiaFocaFogataFogo/nFolioFolletoFondoFormaForroFortunaForzarFosaFotoFracasoFra/gilFranjaFraseFraudeFrei/rFrenoFresaFri/oFritoFrutaFuegoFuenteFuerzaFugaFumarFuncio/nFundaFurgo/nFuriaFusilFu/tbolFuturoGacelaGafasGaitaGajoGalaGaleri/aGalloGambaGanarGanchoGangaGansoGarajeGarzaGasolinaGastarGatoGavila/nGemeloGemirGenGe/neroGenioGenteGeranioGerenteGermenGestoGiganteGimnasioGirarGiroGlaciarGloboGloriaGolGolfoGolosoGolpeGomaGordoGorilaGorraGotaGoteoGozarGradaGra/ficoGranoGrasaGratisGraveGrietaGrilloGripeGrisGritoGrosorGru/aGruesoGrumoGrupoGuanteGuapoGuardiaGuerraGui/aGui~oGuionGuisoGuitarraGusanoGustarHaberHa/bilHablarHacerHachaHadaHallarHamacaHarinaHazHaza~aHebillaHebraHechoHeladoHelioHembraHerirHermanoHe/roeHervirHieloHierroHi/gadoHigieneHijoHimnoHistoriaHocicoHogarHogueraHojaHombreHongoHonorHonraHoraHormigaHornoHostilHoyoHuecoHuelgaHuertaHuesoHuevoHuidaHuirHumanoHu/medoHumildeHumoHundirHuraca/nHurtoIconoIdealIdiomaI/doloIglesiaIglu/IgualIlegalIlusio/nImagenIma/nImitarImparImperioImponerImpulsoIncapazI/ndiceInerteInfielInformeIngenioInicioInmensoInmuneInnatoInsectoInstanteIntere/sI/ntimoIntuirInu/tilInviernoIraIrisIroni/aIslaIsloteJabali/Jabo/nJamo/nJarabeJardi/nJarraJaulaJazmi/nJefeJeringaJineteJornadaJorobaJovenJoyaJuergaJuevesJuezJugadorJugoJugueteJuicioJuncoJunglaJunioJuntarJu/piterJurarJustoJuvenilJuzgarKiloKoalaLabioLacioLacraLadoLadro/nLagartoLa/grimaLagunaLaicoLamerLa/minaLa/mparaLanaLanchaLangostaLanzaLa/pizLargoLarvaLa/stimaLataLa/texLatirLaurelLavarLazoLealLeccio/nLecheLectorLeerLegio/nLegumbreLejanoLenguaLentoLe~aLeo/nLeopardoLesio/nLetalLetraLeveLeyendaLibertadLibroLicorLi/derLidiarLienzoLigaLigeroLimaLi/miteLimo/nLimpioLinceLindoLi/neaLingoteLinoLinternaLi/quidoLisoListaLiteraLitioLitroLlagaLlamaLlantoLlaveLlegarLlenarLlevarLlorarLloverLluviaLoboLocio/nLocoLocuraLo/gicaLogroLombrizLomoLonjaLoteLuchaLucirLugarLujoLunaLunesLupaLustroLutoLuzMacetaMachoMaderaMadreMaduroMaestroMafiaMagiaMagoMai/zMaldadMaletaMallaMaloMama/MamboMamutMancoMandoManejarMangaManiqui/ManjarManoMansoMantaMa~anaMapaMa/quinaMarMarcoMareaMarfilMargenMaridoMa/rmolMarro/nMartesMarzoMasaMa/scaraMasivoMatarMateriaMatizMatrizMa/ximoMayorMazorcaMechaMedallaMedioMe/dulaMejillaMejorMelenaMelo/nMemoriaMenorMensajeMenteMenu/MercadoMerengueMe/ritoMesMeso/nMetaMeterMe/todoMetroMezclaMiedoMielMiembroMigaMilMilagroMilitarMillo/nMimoMinaMineroMi/nimoMinutoMiopeMirarMisaMiseriaMisilMismoMitadMitoMochilaMocio/nModaModeloMohoMojarMoldeMolerMolinoMomentoMomiaMonarcaMonedaMonjaMontoMo~oMoradaMorderMorenoMorirMorroMorsaMortalMoscaMostrarMotivoMoverMo/vilMozoMuchoMudarMuebleMuelaMuerteMuestraMugreMujerMulaMuletaMultaMundoMu~ecaMuralMuroMu/sculoMuseoMusgoMu/sicaMusloNa/carNacio/nNadarNaipeNaranjaNarizNarrarNasalNatalNativoNaturalNa/useaNavalNaveNavidadNecioNe/ctarNegarNegocioNegroNeo/nNervioNetoNeutroNevarNeveraNichoNidoNieblaNietoNi~ezNi~oNi/tidoNivelNoblezaNocheNo/minaNoriaNormaNorteNotaNoticiaNovatoNovelaNovioNubeNucaNu/cleoNudilloNudoNueraNueveNuezNuloNu/meroNutriaOasisObesoObispoObjetoObraObreroObservarObtenerObvioOcaOcasoOce/anoOchentaOchoOcioOcreOctavoOctubreOcultoOcuparOcurrirOdiarOdioOdiseaOesteOfensaOfertaOficioOfrecerOgroOi/doOi/rOjoOlaOleadaOlfatoOlivoOllaOlmoOlorOlvidoOmbligoOndaOnzaOpacoOpcio/nO/peraOpinarOponerOptarO/pticaOpuestoOracio/nOradorOralO/rbitaOrcaOrdenOrejaO/rganoOrgi/aOrgulloOrienteOrigenOrillaOroOrquestaOrugaOsadi/aOscuroOseznoOsoOstraOto~oOtroOvejaO/vuloO/xidoOxi/genoOyenteOzonoPactoPadrePaellaPa/ginaPagoPai/sPa/jaroPalabraPalcoPaletaPa/lidoPalmaPalomaPalparPanPanalPa/nicoPanteraPa~ueloPapa/PapelPapillaPaquetePararParcelaParedParirParoPa/rpadoParquePa/rrafoPartePasarPaseoPasio/nPasoPastaPataPatioPatriaPausaPautaPavoPayasoPeato/nPecadoPeceraPechoPedalPedirPegarPeinePelarPelda~oPeleaPeligroPellejoPeloPelucaPenaPensarPe~o/nPeo/nPeorPepinoPeque~oPeraPerchaPerderPerezaPerfilPericoPerlaPermisoPerroPersonaPesaPescaPe/simoPesta~aPe/taloPetro/leoPezPezu~aPicarPicho/nPiePiedraPiernaPiezaPijamaPilarPilotoPimientaPinoPintorPinzaPi~aPiojoPipaPirataPisarPiscinaPisoPistaPito/nPizcaPlacaPlanPlataPlayaPlazaPleitoPlenoPlomoPlumaPluralPobrePocoPoderPodioPoemaPoesi/aPoetaPolenPolici/aPolloPolvoPomadaPomeloPomoPompaPonerPorcio/nPortalPosadaPoseerPosiblePostePotenciaPotroPozoPradoPrecozPreguntaPremioPrensaPresoPrevioPrimoPri/ncipePrisio/nPrivarProaProbarProcesoProductoProezaProfesorProgramaProlePromesaProntoPropioPro/ximoPruebaPu/blicoPucheroPudorPuebloPuertaPuestoPulgaPulirPulmo/nPulpoPulsoPumaPuntoPu~alPu~oPupaPupilaPure/QuedarQuejaQuemarQuererQuesoQuietoQui/micaQuinceQuitarRa/banoRabiaRaboRacio/nRadicalRai/zRamaRampaRanchoRangoRapazRa/pidoRaptoRasgoRaspaRatoRayoRazaRazo/nReaccio/nRealidadReba~oReboteRecaerRecetaRechazoRecogerRecreoRectoRecursoRedRedondoReducirReflejoReformaRefra/nRefugioRegaloRegirReglaRegresoRehe/nReinoRei/rRejaRelatoRelevoRelieveRellenoRelojRemarRemedioRemoRencorRendirRentaRepartoRepetirReposoReptilResRescateResinaRespetoRestoResumenRetiroRetornoRetratoReunirReve/sRevistaReyRezarRicoRiegoRiendaRiesgoRifaRi/gidoRigorRinco/nRi~o/nRi/oRiquezaRisaRitmoRitoRizoRobleRoceRociarRodarRodeoRodillaRoerRojizoRojoRomeroRomperRonRoncoRondaRopaRoperoRosaRoscaRostroRotarRubi/RuborRudoRuedaRugirRuidoRuinaRuletaRuloRumboRumorRupturaRutaRutinaSa/badoSaberSabioSableSacarSagazSagradoSalaSaldoSaleroSalirSalmo/nSalo/nSalsaSaltoSaludSalvarSambaSancio/nSandi/aSanearSangreSanidadSanoSantoSapoSaqueSardinaSarte/nSastreSata/nSaunaSaxofo/nSeccio/nSecoSecretoSectaSedSeguirSeisSelloSelvaSemanaSemillaSendaSensorSe~alSe~orSepararSepiaSequi/aSerSerieSermo/nServirSesentaSesio/nSetaSetentaSeveroSexoSextoSidraSiestaSieteSigloSignoSi/labaSilbarSilencioSillaSi/mboloSimioSirenaSistemaSitioSituarSobreSocioSodioSolSolapaSoldadoSoledadSo/lidoSoltarSolucio/nSombraSondeoSonidoSonoroSonrisaSopaSoplarSoporteSordoSorpresaSorteoSoste/nSo/tanoSuaveSubirSucesoSudorSuegraSueloSue~oSuerteSufrirSujetoSulta/nSumarSuperarSuplirSuponerSupremoSurSurcoSure~oSurgirSustoSutilTabacoTabiqueTablaTabu/TacoTactoTajoTalarTalcoTalentoTallaTalo/nTama~oTamborTangoTanqueTapaTapeteTapiaTapo/nTaquillaTardeTareaTarifaTarjetaTarotTarroTartaTatuajeTauroTazaTazo/nTeatroTechoTeclaTe/cnicaTejadoTejerTejidoTelaTele/fonoTemaTemorTemploTenazTenderTenerTenisTensoTeori/aTerapiaTercoTe/rminoTernuraTerrorTesisTesoroTestigoTeteraTextoTezTibioTiburo/nTiempoTiendaTierraTiesoTigreTijeraTildeTimbreTi/midoTimoTintaTi/oTi/picoTipoTiraTiro/nTita/nTi/tereTi/tuloTizaToallaTobilloTocarTocinoTodoTogaToldoTomarTonoTontoToparTopeToqueTo/raxToreroTormentaTorneoToroTorpedoTorreTorsoTortugaTosToscoToserTo/xicoTrabajoTractorTraerTra/ficoTragoTrajeTramoTranceTratoTraumaTrazarTre/bolTreguaTreintaTrenTreparTresTribuTrigoTripaTristeTriunfoTrofeoTrompaTroncoTropaTroteTrozoTrucoTruenoTrufaTuberi/aTuboTuertoTumbaTumorTu/nelTu/nicaTurbinaTurismoTurnoTutorUbicarU/lceraUmbralUnidadUnirUniversoUnoUntarU~aUrbanoUrbeUrgenteUrnaUsarUsuarioU/tilUtopi/aUvaVacaVaci/oVacunaVagarVagoVainaVajillaValeVa/lidoValleValorVa/lvulaVampiroVaraVariarVaro/nVasoVecinoVectorVehi/culoVeinteVejezVelaVeleroVelozVenaVencerVendaVenenoVengarVenirVentaVenusVerVeranoVerboVerdeVeredaVerjaVersoVerterVi/aViajeVibrarVicioVi/ctimaVidaVi/deoVidrioViejoViernesVigorVilVillaVinagreVinoVi~edoVioli/nViralVirgoVirtudVisorVi/speraVistaVitaminaViudoVivazViveroVivirVivoVolca/nVolumenVolverVorazVotarVotoVozVueloVulgarYacerYateYeguaYemaYernoYesoYodoYogaYogurZafiroZanjaZapatoZarzaZonaZorroZumoZurdo"; +const lookup = {}; +let wordlist = null; +function dropDiacritic(word) { + _wordlist__WEBPACK_IMPORTED_MODULE_1__["logger"].checkNormalize(); + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])(Array.prototype.filter.call(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8Bytes"])(word.normalize("NFD").toLowerCase()), (c) => { + return ((c >= 65 && c <= 90) || (c >= 97 && c <= 123)); + })); +} +function expand(word) { + const output = []; + Array.prototype.forEach.call(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8Bytes"])(word), (c) => { + // Acute accent + if (c === 47) { + output.push(204); + output.push(129); + // n-tilde + } + else if (c === 126) { + output.push(110); + output.push(204); + output.push(131); + } + else { + output.push(c); + } + }); + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])(output); +} +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" ").map((w) => expand(w)); + wordlist.forEach((word, index) => { + lookup[dropDiacritic(word)] = index; + }); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].check(lang) !== "0xf74fb7092aeacdfbf8959557de22098da512207fb9f109cb526994938cf40300") { + wordlist = null; + throw new Error("BIP39 Wordlist for es (Spanish) FAILED"); + } +} +class LangEs extends _wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"] { + constructor() { + super("es"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return lookup[dropDiacritic(word)]; + } +} +const langEs = new LangEs(); +_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].register(langEs); + +//# sourceMappingURL=lang-es.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-fr.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-fr.js ***! + \******************************************************************/ +/*! exports provided: langFr */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langFr", function() { return langFr; }); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + + +const words = "AbaisserAbandonAbdiquerAbeilleAbolirAborderAboutirAboyerAbrasifAbreuverAbriterAbrogerAbruptAbsenceAbsoluAbsurdeAbusifAbyssalAcade/mieAcajouAcarienAccablerAccepterAcclamerAccoladeAccrocheAccuserAcerbeAchatAcheterAcidulerAcierAcompteAcque/rirAcronymeActeurActifActuelAdepteAde/quatAdhe/sifAdjectifAdjugerAdmettreAdmirerAdopterAdorerAdoucirAdresseAdroitAdulteAdverbeAe/rerAe/ronefAffaireAffecterAfficheAffreuxAffublerAgacerAgencerAgileAgiterAgraferAgre/ableAgrumeAiderAiguilleAilierAimableAisanceAjouterAjusterAlarmerAlchimieAlerteAlge-breAlgueAlie/nerAlimentAlle/gerAlliageAllouerAllumerAlourdirAlpagaAltesseAlve/oleAmateurAmbiguAmbreAme/nagerAmertumeAmidonAmiralAmorcerAmourAmovibleAmphibieAmpleurAmusantAnalyseAnaphoreAnarchieAnatomieAncienAne/antirAngleAngoisseAnguleuxAnimalAnnexerAnnonceAnnuelAnodinAnomalieAnonymeAnormalAntenneAntidoteAnxieuxApaiserApe/ritifAplanirApologieAppareilAppelerApporterAppuyerAquariumAqueducArbitreArbusteArdeurArdoiseArgentArlequinArmatureArmementArmoireArmureArpenterArracherArriverArroserArsenicArte/rielArticleAspectAsphalteAspirerAssautAsservirAssietteAssocierAssurerAsticotAstreAstuceAtelierAtomeAtriumAtroceAttaqueAttentifAttirerAttraperAubaineAubergeAudaceAudibleAugurerAuroreAutomneAutrucheAvalerAvancerAvariceAvenirAverseAveugleAviateurAvideAvionAviserAvoineAvouerAvrilAxialAxiomeBadgeBafouerBagageBaguetteBaignadeBalancerBalconBaleineBalisageBambinBancaireBandageBanlieueBannie-reBanquierBarbierBarilBaronBarqueBarrageBassinBastionBatailleBateauBatterieBaudrierBavarderBeletteBe/lierBeloteBe/ne/ficeBerceauBergerBerlineBermudaBesaceBesogneBe/tailBeurreBiberonBicycleBiduleBijouBilanBilingueBillardBinaireBiologieBiopsieBiotypeBiscuitBisonBistouriBitumeBizarreBlafardBlagueBlanchirBlessantBlinderBlondBloquerBlousonBobardBobineBoireBoiserBolideBonbonBondirBonheurBonifierBonusBordureBorneBotteBoucleBoueuxBougieBoulonBouquinBourseBoussoleBoutiqueBoxeurBrancheBrasierBraveBrebisBre-cheBreuvageBricolerBrigadeBrillantBriocheBriqueBrochureBroderBronzerBrousseBroyeurBrumeBrusqueBrutalBruyantBuffleBuissonBulletinBureauBurinBustierButinerButoirBuvableBuvetteCabanonCabineCachetteCadeauCadreCafe/ineCaillouCaissonCalculerCalepinCalibreCalmerCalomnieCalvaireCamaradeCame/raCamionCampagneCanalCanetonCanonCantineCanularCapableCaporalCapriceCapsuleCapterCapucheCarabineCarboneCaresserCaribouCarnageCarotteCarreauCartonCascadeCasierCasqueCassureCauserCautionCavalierCaverneCaviarCe/dilleCeintureCe/lesteCelluleCendrierCensurerCentralCercleCe/re/bralCeriseCernerCerveauCesserChagrinChaiseChaleurChambreChanceChapitreCharbonChasseurChatonChaussonChavirerChemiseChenilleChe/quierChercherChevalChienChiffreChignonChime-reChiotChlorureChocolatChoisirChoseChouetteChromeChuteCigareCigogneCimenterCine/maCintrerCirculerCirerCirqueCiterneCitoyenCitronCivilClaironClameurClaquerClasseClavierClientClignerClimatClivageClocheClonageCloporteCobaltCobraCocasseCocotierCoderCodifierCoffreCognerCohe/sionCoifferCoincerCole-reColibriCollineColmaterColonelCombatCome/dieCommandeCompactConcertConduireConfierCongelerConnoterConsonneContactConvexeCopainCopieCorailCorbeauCordageCornicheCorpusCorrectCorte-geCosmiqueCostumeCotonCoudeCoupureCourageCouteauCouvrirCoyoteCrabeCrainteCravateCrayonCre/atureCre/diterCre/meuxCreuserCrevetteCriblerCrierCristalCrite-reCroireCroquerCrotaleCrucialCruelCrypterCubiqueCueillirCuille-reCuisineCuivreCulminerCultiverCumulerCupideCuratifCurseurCyanureCycleCylindreCyniqueDaignerDamierDangerDanseurDauphinDe/battreDe/biterDe/borderDe/briderDe/butantDe/calerDe/cembreDe/chirerDe/ciderDe/clarerDe/corerDe/crireDe/cuplerDe/daleDe/ductifDe/esseDe/fensifDe/filerDe/frayerDe/gagerDe/givrerDe/glutirDe/graferDe/jeunerDe/liceDe/logerDemanderDemeurerDe/molirDe/nicherDe/nouerDentelleDe/nuderDe/partDe/penserDe/phaserDe/placerDe/poserDe/rangerDe/roberDe/sastreDescenteDe/sertDe/signerDe/sobe/irDessinerDestrierDe/tacherDe/testerDe/tourerDe/tresseDevancerDevenirDevinerDevoirDiableDialogueDiamantDicterDiffe/rerDige/rerDigitalDigneDiluerDimancheDiminuerDioxydeDirectifDirigerDiscuterDisposerDissiperDistanceDivertirDiviserDocileDocteurDogmeDoigtDomaineDomicileDompterDonateurDonjonDonnerDopamineDortoirDorureDosageDoseurDossierDotationDouanierDoubleDouceurDouterDoyenDragonDraperDresserDribblerDroitureDuperieDuplexeDurableDurcirDynastieE/blouirE/carterE/charpeE/chelleE/clairerE/clipseE/cloreE/cluseE/coleE/conomieE/corceE/couterE/craserE/cre/merE/crivainE/crouE/cumeE/cureuilE/difierE/duquerEffacerEffectifEffigieEffortEffrayerEffusionE/galiserE/garerE/jecterE/laborerE/largirE/lectronE/le/gantE/le/phantE/le-veE/ligibleE/litismeE/logeE/luciderE/luderEmballerEmbellirEmbryonE/meraudeE/missionEmmenerE/motionE/mouvoirEmpereurEmployerEmporterEmpriseE/mulsionEncadrerEnche-reEnclaveEncocheEndiguerEndosserEndroitEnduireE/nergieEnfanceEnfermerEnfouirEngagerEnginEngloberE/nigmeEnjamberEnjeuEnleverEnnemiEnnuyeuxEnrichirEnrobageEnseigneEntasserEntendreEntierEntourerEntraverE/nume/rerEnvahirEnviableEnvoyerEnzymeE/olienE/paissirE/pargneE/patantE/pauleE/picerieE/pide/mieE/pierE/pilogueE/pineE/pisodeE/pitapheE/poqueE/preuveE/prouverE/puisantE/querreE/quipeE/rigerE/rosionErreurE/ruptionEscalierEspadonEspe-ceEspie-gleEspoirEspritEsquiverEssayerEssenceEssieuEssorerEstimeEstomacEstradeE/tage-reE/talerE/tancheE/tatiqueE/teindreE/tendoirE/ternelE/thanolE/thiqueEthnieE/tirerE/tofferE/toileE/tonnantE/tourdirE/trangeE/troitE/tudeEuphorieE/valuerE/vasionE/ventailE/videnceE/viterE/volutifE/voquerExactExage/rerExaucerExcellerExcitantExclusifExcuseExe/cuterExempleExercerExhalerExhorterExigenceExilerExisterExotiqueExpe/dierExplorerExposerExprimerExquisExtensifExtraireExulterFableFabuleuxFacetteFacileFactureFaiblirFalaiseFameuxFamilleFarceurFarfeluFarineFaroucheFascinerFatalFatigueFauconFautifFaveurFavoriFe/brileFe/conderFe/de/rerFe/linFemmeFe/murFendoirFe/odalFermerFe/roceFerveurFestivalFeuilleFeutreFe/vrierFiascoFicelerFictifFide-leFigureFilatureFiletageFilie-reFilleulFilmerFilouFiltrerFinancerFinirFioleFirmeFissureFixerFlairerFlammeFlasqueFlatteurFle/auFle-cheFleurFlexionFloconFloreFluctuerFluideFluvialFolieFonderieFongibleFontaineForcerForgeronFormulerFortuneFossileFoudreFouge-reFouillerFoulureFourmiFragileFraiseFranchirFrapperFrayeurFre/gateFreinerFrelonFre/mirFre/ne/sieFre-reFriableFrictionFrissonFrivoleFroidFromageFrontalFrotterFruitFugitifFuiteFureurFurieuxFurtifFusionFuturGagnerGalaxieGalerieGambaderGarantirGardienGarnirGarrigueGazelleGazonGe/antGe/latineGe/luleGendarmeGe/ne/ralGe/nieGenouGentilGe/ologieGe/ome-treGe/raniumGermeGestuelGeyserGibierGiclerGirafeGivreGlaceGlaiveGlisserGlobeGloireGlorieuxGolfeurGommeGonflerGorgeGorilleGoudronGouffreGoulotGoupilleGourmandGoutteGraduelGraffitiGraineGrandGrappinGratuitGravirGrenatGriffureGrillerGrimperGrognerGronderGrotteGroupeGrugerGrutierGruye-reGue/pardGuerrierGuideGuimauveGuitareGustatifGymnasteGyrostatHabitudeHachoirHalteHameauHangarHannetonHaricotHarmonieHarponHasardHe/liumHe/matomeHerbeHe/rissonHermineHe/ronHe/siterHeureuxHibernerHibouHilarantHistoireHiverHomardHommageHomoge-neHonneurHonorerHonteuxHordeHorizonHorlogeHormoneHorribleHouleuxHousseHublotHuileuxHumainHumbleHumideHumourHurlerHydromelHygie-neHymneHypnoseIdylleIgnorerIguaneIlliciteIllusionImageImbiberImiterImmenseImmobileImmuableImpactImpe/rialImplorerImposerImprimerImputerIncarnerIncendieIncidentInclinerIncoloreIndexerIndiceInductifIne/ditIneptieInexactInfiniInfligerInformerInfusionInge/rerInhalerInhiberInjecterInjureInnocentInoculerInonderInscrireInsecteInsigneInsoliteInspirerInstinctInsulterIntactIntenseIntimeIntrigueIntuitifInutileInvasionInventerInviterInvoquerIroniqueIrradierIrre/elIrriterIsolerIvoireIvresseJaguarJaillirJambeJanvierJardinJaugerJauneJavelotJetableJetonJeudiJeunesseJoindreJoncherJonglerJoueurJouissifJournalJovialJoyauJoyeuxJubilerJugementJuniorJuponJuristeJusticeJuteuxJuve/nileKayakKimonoKiosqueLabelLabialLabourerLace/rerLactoseLaguneLaineLaisserLaitierLambeauLamelleLampeLanceurLangageLanterneLapinLargeurLarmeLaurierLavaboLavoirLectureLe/galLe/gerLe/gumeLessiveLettreLevierLexiqueLe/zardLiasseLibe/rerLibreLicenceLicorneLie-geLie-vreLigatureLigoterLigueLimerLimiteLimonadeLimpideLine/aireLingotLionceauLiquideLisie-reListerLithiumLitigeLittoralLivreurLogiqueLointainLoisirLombricLoterieLouerLourdLoutreLouveLoyalLubieLucideLucratifLueurLugubreLuisantLumie-reLunaireLundiLuronLutterLuxueuxMachineMagasinMagentaMagiqueMaigreMaillonMaintienMairieMaisonMajorerMalaxerMale/ficeMalheurMaliceMalletteMammouthMandaterManiableManquantManteauManuelMarathonMarbreMarchandMardiMaritimeMarqueurMarronMartelerMascotteMassifMate/rielMatie-reMatraqueMaudireMaussadeMauveMaximalMe/chantMe/connuMe/dailleMe/decinMe/diterMe/duseMeilleurMe/langeMe/lodieMembreMe/moireMenacerMenerMenhirMensongeMentorMercrediMe/riteMerleMessagerMesureMe/talMe/te/oreMe/thodeMe/tierMeubleMiaulerMicrobeMietteMignonMigrerMilieuMillionMimiqueMinceMine/ralMinimalMinorerMinuteMiracleMiroiterMissileMixteMobileModerneMoelleuxMondialMoniteurMonnaieMonotoneMonstreMontagneMonumentMoqueurMorceauMorsureMortierMoteurMotifMoucheMoufleMoulinMoussonMoutonMouvantMultipleMunitionMurailleMure-neMurmureMuscleMuse/umMusicienMutationMuterMutuelMyriadeMyrtilleMyste-reMythiqueNageurNappeNarquoisNarrerNatationNationNatureNaufrageNautiqueNavireNe/buleuxNectarNe/fasteNe/gationNe/gligerNe/gocierNeigeNerveuxNettoyerNeuroneNeutronNeveuNicheNickelNitrateNiveauNobleNocifNocturneNoirceurNoisetteNomadeNombreuxNommerNormatifNotableNotifierNotoireNourrirNouveauNovateurNovembreNoviceNuageNuancerNuireNuisibleNume/roNuptialNuqueNutritifObe/irObjectifObligerObscurObserverObstacleObtenirObturerOccasionOccuperOce/anOctobreOctroyerOctuplerOculaireOdeurOdorantOffenserOfficierOffrirOgiveOiseauOisillonOlfactifOlivierOmbrageOmettreOnctueuxOndulerOne/reuxOniriqueOpaleOpaqueOpe/rerOpinionOpportunOpprimerOpterOptiqueOrageuxOrangeOrbiteOrdonnerOreilleOrganeOrgueilOrificeOrnementOrqueOrtieOscillerOsmoseOssatureOtarieOuraganOursonOutilOutragerOuvrageOvationOxydeOxyge-neOzonePaisiblePalacePalmare-sPalourdePalperPanachePandaPangolinPaniquerPanneauPanoramaPantalonPapayePapierPapoterPapyrusParadoxeParcelleParesseParfumerParlerParoleParrainParsemerPartagerParureParvenirPassionPaste-quePaternelPatiencePatronPavillonPavoiserPayerPaysagePeignePeintrePelagePe/licanPellePelousePeluchePendulePe/ne/trerPe/niblePensifPe/nuriePe/pitePe/plumPerdrixPerforerPe/riodePermuterPerplexePersilPertePeserPe/talePetitPe/trirPeuplePharaonPhobiePhoquePhotonPhrasePhysiquePianoPicturalPie-cePierrePieuvrePilotePinceauPipettePiquerPiroguePiscinePistonPivoterPixelPizzaPlacardPlafondPlaisirPlanerPlaquePlastronPlateauPleurerPlexusPliagePlombPlongerPluiePlumagePochettePoe/siePoe-tePointePoirierPoissonPoivrePolairePolicierPollenPolygonePommadePompierPonctuelPonde/rerPoneyPortiquePositionPosse/derPosturePotagerPoteauPotionPoucePoulainPoumonPourprePoussinPouvoirPrairiePratiquePre/cieuxPre/direPre/fixePre/ludePre/nomPre/sencePre/textePre/voirPrimitifPrincePrisonPriverProble-meProce/derProdigeProfondProgre-sProieProjeterProloguePromenerPropreProspe-reProte/gerProuesseProverbePrudencePruneauPsychosePublicPuceronPuiserPulpePulsarPunaisePunitifPupitrePurifierPuzzlePyramideQuasarQuerelleQuestionQuie/tudeQuitterQuotientRacineRaconterRadieuxRagondinRaideurRaisinRalentirRallongeRamasserRapideRasageRatisserRavagerRavinRayonnerRe/actifRe/agirRe/aliserRe/animerRecevoirRe/citerRe/clamerRe/colterRecruterReculerRecyclerRe/digerRedouterRefaireRe/flexeRe/formerRefrainRefugeRe/galienRe/gionRe/glageRe/gulierRe/ite/rerRejeterRejouerRelatifReleverReliefRemarqueReme-deRemiseRemonterRemplirRemuerRenardRenfortReniflerRenoncerRentrerRenvoiReplierReporterRepriseReptileRequinRe/serveRe/sineuxRe/soudreRespectResterRe/sultatRe/tablirRetenirRe/ticuleRetomberRetracerRe/unionRe/ussirRevancheRevivreRe/volteRe/vulsifRichesseRideauRieurRigideRigolerRincerRiposterRisibleRisqueRituelRivalRivie-reRocheuxRomanceRompreRonceRondinRoseauRosierRotatifRotorRotuleRougeRouilleRouleauRoutineRoyaumeRubanRubisRucheRuelleRugueuxRuinerRuisseauRuserRustiqueRythmeSablerSaboterSabreSacocheSafariSagesseSaisirSaladeSaliveSalonSaluerSamediSanctionSanglierSarcasmeSardineSaturerSaugrenuSaumonSauterSauvageSavantSavonnerScalpelScandaleSce/le/ratSce/narioSceptreSche/maScienceScinderScoreScrutinSculpterSe/anceSe/cableSe/cherSecouerSe/cre/terSe/datifSe/duireSeigneurSe/jourSe/lectifSemaineSemblerSemenceSe/minalSe/nateurSensibleSentenceSe/parerSe/quenceSereinSergentSe/rieuxSerrureSe/rumServiceSe/sameSe/virSevrageSextupleSide/ralSie-cleSie/gerSifflerSigleSignalSilenceSiliciumSimpleSince-reSinistreSiphonSiropSismiqueSituerSkierSocialSocleSodiumSoigneuxSoldatSoleilSolitudeSolubleSombreSommeilSomnolerSondeSongeurSonnetteSonoreSorcierSortirSosieSottiseSoucieuxSoudureSouffleSouleverSoupapeSourceSoutirerSouvenirSpacieuxSpatialSpe/cialSphe-reSpiralStableStationSternumStimulusStipulerStrictStudieuxStupeurStylisteSublimeSubstratSubtilSubvenirSucce-sSucreSuffixeSugge/rerSuiveurSulfateSuperbeSupplierSurfaceSuricateSurmenerSurpriseSursautSurvieSuspectSyllabeSymboleSyme/trieSynapseSyntaxeSyste-meTabacTablierTactileTaillerTalentTalismanTalonnerTambourTamiserTangibleTapisTaquinerTarderTarifTartineTasseTatamiTatouageTaupeTaureauTaxerTe/moinTemporelTenailleTendreTeneurTenirTensionTerminerTerneTerribleTe/tineTexteThe-meThe/orieThe/rapieThoraxTibiaTie-deTimideTirelireTiroirTissuTitaneTitreTituberTobogganTole/rantTomateToniqueTonneauToponymeTorcheTordreTornadeTorpilleTorrentTorseTortueTotemToucherTournageTousserToxineTractionTraficTragiqueTrahirTrainTrancherTravailTre-fleTremperTre/sorTreuilTriageTribunalTricoterTrilogieTriompheTriplerTriturerTrivialTromboneTroncTropicalTroupeauTuileTulipeTumulteTunnelTurbineTuteurTutoyerTuyauTympanTyphonTypiqueTyranUbuesqueUltimeUltrasonUnanimeUnifierUnionUniqueUnitaireUniversUraniumUrbainUrticantUsageUsineUsuelUsureUtileUtopieVacarmeVaccinVagabondVagueVaillantVaincreVaisseauValableValiseVallonValveVampireVanilleVapeurVarierVaseuxVassalVasteVecteurVedetteVe/ge/talVe/hiculeVeinardVe/loceVendrediVe/ne/rerVengerVenimeuxVentouseVerdureVe/rinVernirVerrouVerserVertuVestonVe/te/ranVe/tusteVexantVexerViaducViandeVictoireVidangeVide/oVignetteVigueurVilainVillageVinaigreViolonVipe-reVirementVirtuoseVirusVisageViseurVisionVisqueuxVisuelVitalVitesseViticoleVitrineVivaceVivipareVocationVoguerVoileVoisinVoitureVolailleVolcanVoltigerVolumeVoraceVortexVoterVouloirVoyageVoyelleWagonXe/nonYachtZe-breZe/nithZesteZoologie"; +let wordlist = null; +const lookup = {}; +function dropDiacritic(word) { + _wordlist__WEBPACK_IMPORTED_MODULE_1__["logger"].checkNormalize(); + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])(Array.prototype.filter.call(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8Bytes"])(word.normalize("NFD").toLowerCase()), (c) => { + return ((c >= 65 && c <= 90) || (c >= 97 && c <= 123)); + })); +} +function expand(word) { + const output = []; + Array.prototype.forEach.call(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8Bytes"])(word), (c) => { + // Acute accent + if (c === 47) { + output.push(204); + output.push(129); + // Grave accent + } + else if (c === 45) { + output.push(204); + output.push(128); + } + else { + output.push(c); + } + }); + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])(output); +} +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" ").map((w) => expand(w)); + wordlist.forEach((word, index) => { + lookup[dropDiacritic(word)] = index; + }); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].check(lang) !== "0x51deb7ae009149dc61a6bd18a918eb7ac78d2775726c68e598b92d002519b045") { + wordlist = null; + throw new Error("BIP39 Wordlist for fr (French) FAILED"); + } +} +class LangFr extends _wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"] { + constructor() { + super("fr"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return lookup[dropDiacritic(word)]; + } +} +const langFr = new LangFr(); +_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].register(langFr); + +//# sourceMappingURL=lang-fr.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-it.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-it.js ***! + \******************************************************************/ +/*! exports provided: langIt */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langIt", function() { return langIt; }); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + +const words = "AbacoAbbaglioAbbinatoAbeteAbissoAbolireAbrasivoAbrogatoAccadereAccennoAccusatoAcetoneAchilleAcidoAcquaAcreAcrilicoAcrobataAcutoAdagioAddebitoAddomeAdeguatoAderireAdipeAdottareAdulareAffabileAffettoAffissoAffrantoAforismaAfosoAfricanoAgaveAgenteAgevoleAggancioAgireAgitareAgonismoAgricoloAgrumetoAguzzoAlabardaAlatoAlbatroAlberatoAlboAlbumeAlceAlcolicoAlettoneAlfaAlgebraAlianteAlibiAlimentoAllagatoAllegroAllievoAllodolaAllusivoAlmenoAlogenoAlpacaAlpestreAltalenaAlternoAlticcioAltroveAlunnoAlveoloAlzareAmalgamaAmanitaAmarenaAmbitoAmbratoAmebaAmericaAmetistaAmicoAmmassoAmmendaAmmirareAmmonitoAmoreAmpioAmpliareAmuletoAnacardoAnagrafeAnalistaAnarchiaAnatraAncaAncellaAncoraAndareAndreaAnelloAngeloAngolareAngustoAnimaAnnegareAnnidatoAnnoAnnuncioAnonimoAnticipoAnziApaticoAperturaApodeApparireAppetitoAppoggioApprodoAppuntoAprileArabicaArachideAragostaAraldicaArancioAraturaArazzoArbitroArchivioArditoArenileArgentoArgineArgutoAriaArmoniaArneseArredatoArringaArrostoArsenicoArsoArteficeArzilloAsciuttoAscoltoAsepsiAsetticoAsfaltoAsinoAsolaAspiratoAsproAssaggioAsseAssolutoAssurdoAstaAstenutoAsticeAstrattoAtavicoAteismoAtomicoAtonoAttesaAttivareAttornoAttritoAttualeAusilioAustriaAutistaAutonomoAutunnoAvanzatoAvereAvvenireAvvisoAvvolgereAzioneAzotoAzzimoAzzurroBabeleBaccanoBacinoBacoBadessaBadilataBagnatoBaitaBalconeBaldoBalenaBallataBalzanoBambinoBandireBaraondaBarbaroBarcaBaritonoBarlumeBaroccoBasilicoBassoBatostaBattutoBauleBavaBavosaBeccoBeffaBelgioBelvaBendaBenevoleBenignoBenzinaBereBerlinaBetaBibitaBiciBidoneBifidoBigaBilanciaBimboBinocoloBiologoBipedeBipolareBirbanteBirraBiscottoBisestoBisnonnoBisonteBisturiBizzarroBlandoBlattaBollitoBonificoBordoBoscoBotanicoBottinoBozzoloBraccioBradipoBramaBrancaBravuraBretellaBrevettoBrezzaBrigliaBrillanteBrindareBroccoloBrodoBronzinaBrulloBrunoBubboneBucaBudinoBuffoneBuioBulboBuonoBurloneBurrascaBussolaBustaCadettoCaducoCalamaroCalcoloCalesseCalibroCalmoCaloriaCambusaCamerataCamiciaCamminoCamolaCampaleCanapaCandelaCaneCaninoCanottoCantinaCapaceCapelloCapitoloCapogiroCapperoCapraCapsulaCarapaceCarcassaCardoCarismaCarovanaCarrettoCartolinaCasaccioCascataCasermaCasoCassoneCastelloCasualeCatastaCatenaCatrameCautoCavilloCedibileCedrataCefaloCelebreCellulareCenaCenoneCentesimoCeramicaCercareCertoCerumeCervelloCesoiaCespoCetoChelaChiaroChiccaChiedereChimeraChinaChirurgoChitarraCiaoCiclismoCifrareCignoCilindroCiottoloCircaCirrosiCitricoCittadinoCiuffoCivettaCivileClassicoClinicaCloroCoccoCodardoCodiceCoerenteCognomeCollareColmatoColoreColposoColtivatoColzaComaCometaCommandoComodoComputerComuneConcisoCondurreConfermaCongelareConiugeConnessoConoscereConsumoContinuoConvegnoCopertoCopioneCoppiaCopricapoCorazzaCordataCoricatoCorniceCorollaCorpoCorredoCorsiaCorteseCosmicoCostanteCotturaCovatoCratereCravattaCreatoCredereCremosoCrescitaCretaCricetoCrinaleCrisiCriticoCroceCronacaCrostataCrucialeCruscaCucireCuculoCuginoCullatoCupolaCuratoreCursoreCurvoCuscinoCustodeDadoDainoDalmataDamerinoDanielaDannosoDanzareDatatoDavantiDavveroDebuttoDecennioDecisoDeclinoDecolloDecretoDedicatoDefinitoDeformeDegnoDelegareDelfinoDelirioDeltaDemenzaDenotatoDentroDepositoDerapataDerivareDerogaDescrittoDesertoDesiderioDesumereDetersivoDevotoDiametroDicembreDiedroDifesoDiffusoDigerireDigitaleDiluvioDinamicoDinnanziDipintoDiplomaDipoloDiradareDireDirottoDirupoDisagioDiscretoDisfareDisgeloDispostoDistanzaDisumanoDitoDivanoDiveltoDividereDivoratoDobloneDocenteDoganaleDogmaDolceDomatoDomenicaDominareDondoloDonoDormireDoteDottoreDovutoDozzinaDragoDruidoDubbioDubitareDucaleDunaDuomoDupliceDuraturoEbanoEccessoEccoEclissiEconomiaEderaEdicolaEdileEditoriaEducareEgemoniaEgliEgoismoEgregioElaboratoElargireEleganteElencatoElettoElevareElficoElicaElmoElsaElusoEmanatoEmblemaEmessoEmiroEmotivoEmozioneEmpiricoEmuloEndemicoEnduroEnergiaEnfasiEnotecaEntrareEnzimaEpatiteEpilogoEpisodioEpocaleEppureEquatoreErarioErbaErbosoEredeEremitaErigereErmeticoEroeErosivoErranteEsagonoEsameEsanimeEsaudireEscaEsempioEsercitoEsibitoEsigenteEsistereEsitoEsofagoEsortatoEsosoEspansoEspressoEssenzaEssoEstesoEstimareEstoniaEstrosoEsultareEtilicoEtnicoEtruscoEttoEuclideoEuropaEvasoEvidenzaEvitatoEvolutoEvvivaFabbricaFaccendaFachiroFalcoFamigliaFanaleFanfaraFangoFantasmaFareFarfallaFarinosoFarmacoFasciaFastosoFasulloFaticareFatoFavolosoFebbreFecolaFedeFegatoFelpaFeltroFemminaFendereFenomenoFermentoFerroFertileFessuraFestivoFettaFeudoFiabaFiduciaFifaFiguratoFiloFinanzaFinestraFinireFioreFiscaleFisicoFiumeFlaconeFlamencoFleboFlemmaFloridoFluenteFluoroFobicoFocacciaFocosoFoderatoFoglioFolataFolcloreFolgoreFondenteFoneticoFoniaFontanaForbitoForchettaForestaFormicaFornaioForoFortezzaForzareFosfatoFossoFracassoFranaFrassinoFratelloFreccettaFrenataFrescoFrigoFrollinoFrondeFrugaleFruttaFucilataFucsiaFuggenteFulmineFulvoFumanteFumettoFumosoFuneFunzioneFuocoFurboFurgoneFuroreFusoFutileGabbianoGaffeGalateoGallinaGaloppoGamberoGammaGaranziaGarboGarofanoGarzoneGasdottoGasolioGastricoGattoGaudioGazeboGazzellaGecoGelatinaGelsoGemelloGemmatoGeneGenitoreGennaioGenotipoGergoGhepardoGhiaccioGhisaGialloGildaGineproGiocareGioielloGiornoGioveGiratoGironeGittataGiudizioGiuratoGiustoGlobuloGlutineGnomoGobbaGolfGomitoGommoneGonfioGonnaGovernoGracileGradoGraficoGrammoGrandeGrattareGravosoGraziaGrecaGreggeGrifoneGrigioGrinzaGrottaGruppoGuadagnoGuaioGuantoGuardareGufoGuidareIbernatoIconaIdenticoIdillioIdoloIdraIdricoIdrogenoIgieneIgnaroIgnoratoIlareIllesoIllogicoIlludereImballoImbevutoImboccoImbutoImmaneImmersoImmolatoImpaccoImpetoImpiegoImportoImprontaInalareInarcareInattivoIncantoIncendioInchinoIncisivoInclusoIncontroIncrocioIncuboIndagineIndiaIndoleIneditoInfattiInfilareInflittoIngaggioIngegnoIngleseIngordoIngrossoInnescoInodoreInoltrareInondatoInsanoInsettoInsiemeInsonniaInsulinaIntasatoInteroIntonacoIntuitoInumidireInvalidoInveceInvitoIperboleIpnoticoIpotesiIppicaIrideIrlandaIronicoIrrigatoIrrorareIsolatoIsotopoIstericoIstitutoIstriceItaliaIterareLabbroLabirintoLaccaLaceratoLacrimaLacunaLaddoveLagoLampoLancettaLanternaLardosoLargaLaringeLastraLatenzaLatinoLattugaLavagnaLavoroLegaleLeggeroLemboLentezzaLenzaLeoneLepreLesivoLessatoLestoLetteraleLevaLevigatoLiberoLidoLievitoLillaLimaturaLimitareLimpidoLineareLinguaLiquidoLiraLiricaLiscaLiteLitigioLivreaLocandaLodeLogicaLombareLondraLongevoLoquaceLorenzoLotoLotteriaLuceLucidatoLumacaLuminosoLungoLupoLuppoloLusingaLussoLuttoMacabroMacchinaMaceroMacinatoMadamaMagicoMagliaMagneteMagroMaiolicaMalafedeMalgradoMalintesoMalsanoMaltoMalumoreManaManciaMandorlaMangiareManifestoMannaroManovraMansardaMantideManubrioMappaMaratonaMarcireMarettaMarmoMarsupioMascheraMassaiaMastinoMaterassoMatricolaMattoneMaturoMazurcaMeandroMeccanicoMecenateMedesimoMeditareMegaMelassaMelisMelodiaMeningeMenoMensolaMercurioMerendaMerloMeschinoMeseMessereMestoloMetalloMetodoMettereMiagolareMicaMicelioMicheleMicroboMidolloMieleMiglioreMilanoMiliteMimosaMineraleMiniMinoreMirinoMirtilloMiscelaMissivaMistoMisurareMitezzaMitigareMitraMittenteMnemonicoModelloModificaModuloMoganoMogioMoleMolossoMonasteroMoncoMondinaMonetarioMonileMonotonoMonsoneMontatoMonvisoMoraMordereMorsicatoMostroMotivatoMotosegaMottoMovenzaMovimentoMozzoMuccaMucosaMuffaMughettoMugnaioMulattoMulinelloMultiploMummiaMuntoMuovereMuraleMusaMuscoloMusicaMutevoleMutoNababboNaftaNanometroNarcisoNariceNarratoNascereNastrareNaturaleNauticaNaviglioNebulosaNecrosiNegativoNegozioNemmenoNeofitaNerettoNervoNessunoNettunoNeutraleNeveNevroticoNicchiaNinfaNitidoNobileNocivoNodoNomeNominaNordicoNormaleNorvegeseNostranoNotareNotiziaNotturnoNovellaNucleoNullaNumeroNuovoNutrireNuvolaNuzialeOasiObbedireObbligoObeliscoOblioOboloObsoletoOccasioneOcchioOccidenteOccorrereOccultareOcraOculatoOdiernoOdorareOffertaOffrireOffuscatoOggettoOggiOgnunoOlandeseOlfattoOliatoOlivaOlogrammaOltreOmaggioOmbelicoOmbraOmegaOmissioneOndosoOnereOniceOnnivoroOnorevoleOntaOperatoOpinioneOppostoOracoloOrafoOrdineOrecchinoOreficeOrfanoOrganicoOrigineOrizzonteOrmaOrmeggioOrnativoOrologioOrrendoOrribileOrtensiaOrticaOrzataOrzoOsareOscurareOsmosiOspedaleOspiteOssaOssidareOstacoloOsteOtiteOtreOttagonoOttimoOttobreOvaleOvestOvinoOviparoOvocitoOvunqueOvviareOzioPacchettoPacePacificoPadellaPadronePaesePagaPaginaPalazzinaPalesarePallidoPaloPaludePandoroPannelloPaoloPaonazzoPapricaParabolaParcellaParerePargoloPariParlatoParolaPartireParvenzaParzialePassivoPasticcaPataccaPatologiaPattumePavonePeccatoPedalarePedonalePeggioPelosoPenarePendicePenisolaPennutoPenombraPensarePentolaPepePepitaPerbenePercorsoPerdonatoPerforarePergamenaPeriodoPermessoPernoPerplessoPersuasoPertugioPervasoPesatorePesistaPesoPestiferoPetaloPettinePetulantePezzoPiacerePiantaPiattinoPiccinoPicozzaPiegaPietraPifferoPigiamaPigolioPigroPilaPiliferoPillolaPilotaPimpantePinetaPinnaPinoloPioggiaPiomboPiramidePireticoPiritePirolisiPitonePizzicoPlaceboPlanarePlasmaPlatanoPlenarioPochezzaPoderosoPodismoPoesiaPoggiarePolentaPoligonoPollicePolmonitePolpettaPolsoPoltronaPolverePomicePomodoroPontePopolosoPorfidoPorosoPorporaPorrePortataPosaPositivoPossessoPostulatoPotassioPoterePranzoPrassiPraticaPreclusoPredicaPrefissoPregiatoPrelievoPremerePrenotarePreparatoPresenzaPretestoPrevalsoPrimaPrincipePrivatoProblemaProcuraProdurreProfumoProgettoProlungaPromessaPronomePropostaProrogaProtesoProvaPrudentePrugnaPruritoPsichePubblicoPudicaPugilatoPugnoPulcePulitoPulsantePuntarePupazzoPupillaPuroQuadroQualcosaQuasiQuerelaQuotaRaccoltoRaddoppioRadicaleRadunatoRafficaRagazzoRagioneRagnoRamarroRamingoRamoRandagioRantolareRapatoRapinaRappresoRasaturaRaschiatoRasenteRassegnaRastrelloRataRavvedutoRealeRecepireRecintoReclutaReconditoRecuperoRedditoRedimereRegalatoRegistroRegolaRegressoRelazioneRemareRemotoRennaReplicaReprimereReputareResaResidenteResponsoRestauroReteRetinaRetoricaRettificaRevocatoRiassuntoRibadireRibelleRibrezzoRicaricaRiccoRicevereRiciclatoRicordoRicredutoRidicoloRidurreRifasareRiflessoRiformaRifugioRigareRigettatoRighelloRilassatoRilevatoRimanereRimbalzoRimedioRimorchioRinascitaRincaroRinforzoRinnovoRinomatoRinsavitoRintoccoRinunciaRinvenireRiparatoRipetutoRipienoRiportareRipresaRipulireRisataRischioRiservaRisibileRisoRispettoRistoroRisultatoRisvoltoRitardoRitegnoRitmicoRitrovoRiunioneRivaRiversoRivincitaRivoltoRizomaRobaRoboticoRobustoRocciaRocoRodaggioRodereRoditoreRogitoRollioRomanticoRompereRonzioRosolareRospoRotanteRotondoRotulaRovescioRubizzoRubricaRugaRullinoRumineRumorosoRuoloRupeRussareRusticoSabatoSabbiareSabotatoSagomaSalassoSaldaturaSalgemmaSalivareSalmoneSaloneSaltareSalutoSalvoSapereSapidoSaporitoSaracenoSarcasmoSartoSassosoSatelliteSatiraSatolloSaturnoSavanaSavioSaziatoSbadiglioSbalzoSbancatoSbarraSbattereSbavareSbendareSbirciareSbloccatoSbocciatoSbrinareSbruffoneSbuffareScabrosoScadenzaScalaScambiareScandaloScapolaScarsoScatenareScavatoSceltoScenicoScettroSchedaSchienaSciarpaScienzaScindereScippoSciroppoScivoloSclerareScodellaScolpitoScompartoSconfortoScoprireScortaScossoneScozzeseScribaScrollareScrutinioScuderiaScultoreScuolaScuroScusareSdebitareSdoganareSeccaturaSecondoSedanoSeggiolaSegnalatoSegregatoSeguitoSelciatoSelettivoSellaSelvaggioSemaforoSembrareSemeSeminatoSempreSensoSentireSepoltoSequenzaSerataSerbatoSerenoSerioSerpenteSerraglioServireSestinaSetolaSettimanaSfaceloSfaldareSfamatoSfarzosoSfaticatoSferaSfidaSfilatoSfingeSfocatoSfoderareSfogoSfoltireSforzatoSfrattoSfruttatoSfuggitoSfumareSfusoSgabelloSgarbatoSgonfiareSgorbioSgrassatoSguardoSibiloSiccomeSierraSiglaSignoreSilenzioSillabaSimboloSimpaticoSimulatoSinfoniaSingoloSinistroSinoSintesiSinusoideSiparioSismaSistoleSituatoSlittaSlogaturaSlovenoSmarritoSmemoratoSmentitoSmeraldoSmilzoSmontareSmottatoSmussatoSnellireSnervatoSnodoSobbalzoSobrioSoccorsoSocialeSodaleSoffittoSognoSoldatoSolenneSolidoSollazzoSoloSolubileSolventeSomaticoSommaSondaSonettoSonniferoSopireSoppesoSopraSorgereSorpassoSorrisoSorsoSorteggioSorvolatoSospiroSostaSottileSpadaSpallaSpargereSpatolaSpaventoSpazzolaSpecieSpedireSpegnereSpelaturaSperanzaSpessoreSpettraleSpezzatoSpiaSpigolosoSpillatoSpinosoSpiraleSplendidoSportivoSposoSprangaSprecareSpronatoSpruzzoSpuntinoSquilloSradicareSrotolatoStabileStaccoStaffaStagnareStampatoStantioStarnutoStaseraStatutoSteloSteppaSterzoStilettoStimaStirpeStivaleStizzosoStonatoStoricoStrappoStregatoStriduloStrozzareStruttoStuccareStufoStupendoSubentroSuccosoSudoreSuggeritoSugoSultanoSuonareSuperboSupportoSurgelatoSurrogatoSussurroSuturaSvagareSvedeseSveglioSvelareSvenutoSveziaSviluppoSvistaSvizzeraSvoltaSvuotareTabaccoTabulatoTacciareTaciturnoTaleTalismanoTamponeTanninoTaraTardivoTargatoTariffaTarpareTartarugaTastoTatticoTavernaTavolataTazzaTecaTecnicoTelefonoTemerarioTempoTemutoTendoneTeneroTensioneTentacoloTeoremaTermeTerrazzoTerzettoTesiTesseratoTestatoTetroTettoiaTifareTigellaTimbroTintoTipicoTipografoTiraggioTiroTitanioTitoloTitubanteTizioTizzoneToccareTollerareToltoTombolaTomoTonfoTonsillaTopazioTopologiaToppaTorbaTornareTorroneTortoraToscanoTossireTostaturaTotanoTraboccoTracheaTrafilaTragediaTralcioTramontoTransitoTrapanoTrarreTraslocoTrattatoTraveTrecciaTremolioTrespoloTributoTrichecoTrifoglioTrilloTrinceaTrioTristezzaTrituratoTrivellaTrombaTronoTroppoTrottolaTrovareTruccatoTubaturaTuffatoTulipanoTumultoTunisiaTurbareTurchinoTutaTutelaUbicatoUccelloUccisoreUdireUditivoUffaUfficioUgualeUlisseUltimatoUmanoUmileUmorismoUncinettoUngereUnghereseUnicornoUnificatoUnisonoUnitarioUnteUovoUpupaUraganoUrgenzaUrloUsanzaUsatoUscitoUsignoloUsuraioUtensileUtilizzoUtopiaVacanteVaccinatoVagabondoVagliatoValangaValgoValicoVallettaValorosoValutareValvolaVampataVangareVanitosoVanoVantaggioVanveraVaporeVaranoVarcatoVarianteVascaVedettaVedovaVedutoVegetaleVeicoloVelcroVelinaVellutoVeloceVenatoVendemmiaVentoVeraceVerbaleVergognaVerificaVeroVerrucaVerticaleVescicaVessilloVestaleVeteranoVetrinaVetustoViandanteVibranteVicendaVichingoVicinanzaVidimareVigiliaVignetoVigoreVileVillanoViminiVincitoreViolaViperaVirgolaVirologoVirulentoViscosoVisioneVispoVissutoVisuraVitaVitelloVittimaVivandaVividoViziareVoceVogaVolatileVolereVolpeVoragineVulcanoZampognaZannaZappatoZatteraZavorraZefiroZelanteZeloZenzeroZerbinoZibettoZincoZirconeZittoZollaZoticoZuccheroZufoloZuluZuppa"; +let wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = words.replace(/([A-Z])/g, " $1").toLowerCase().substring(1).split(" "); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"].check(lang) !== "0x5c1362d88fd4cf614a96f3234941d29f7d37c08c5292fde03bf62c2db6ff7620") { + wordlist = null; + throw new Error("BIP39 Wordlist for it (Italian) FAILED"); + } +} +class LangIt extends _wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"] { + constructor() { + super("it"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return wordlist.indexOf(word); + } +} +const langIt = new LangIt(); +_wordlist__WEBPACK_IMPORTED_MODULE_0__["Wordlist"].register(langIt); + +//# sourceMappingURL=lang-it.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-ja.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-ja.js ***! + \******************************************************************/ +/*! exports provided: langJa */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langJa", function() { return langJa; }); +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + + + +const data = [ + // 4-kana words + "AQRASRAGBAGUAIRAHBAghAURAdBAdcAnoAMEAFBAFCBKFBQRBSFBCXBCDBCHBGFBEQBpBBpQBIkBHNBeOBgFBVCBhBBhNBmOBmRBiHBiFBUFBZDBvFBsXBkFBlcBjYBwDBMBBTBBTRBWBBWXXaQXaRXQWXSRXCFXYBXpHXOQXHRXhRXuRXmXXbRXlXXwDXTRXrCXWQXWGaBWaKcaYgasFadQalmaMBacAKaRKKBKKXKKjKQRKDRKCYKCRKIDKeVKHcKlXKjHKrYNAHNBWNaRNKcNIBNIONmXNsXNdXNnBNMBNRBNrXNWDNWMNFOQABQAHQBrQXBQXFQaRQKXQKDQKOQKFQNBQNDQQgQCXQCDQGBQGDQGdQYXQpBQpQQpHQLXQHuQgBQhBQhCQuFQmXQiDQUFQZDQsFQdRQkHQbRQlOQlmQPDQjDQwXQMBQMDQcFQTBQTHQrDDXQDNFDGBDGQDGRDpFDhFDmXDZXDbRDMYDRdDTRDrXSAhSBCSBrSGQSEQSHBSVRShYShkSyQSuFSiBSdcSoESocSlmSMBSFBSFKSFNSFdSFcCByCaRCKcCSBCSRCCrCGbCEHCYXCpBCpQCIBCIHCeNCgBCgFCVECVcCmkCmwCZXCZFCdRClOClmClFCjDCjdCnXCwBCwXCcRCFQCFjGXhGNhGDEGDMGCDGCHGIFGgBGVXGVEGVRGmXGsXGdYGoSGbRGnXGwXGwDGWRGFNGFLGFOGFdGFkEABEBDEBFEXOEaBEKSENBENDEYXEIgEIkEgBEgQEgHEhFEudEuFEiBEiHEiFEZDEvBEsXEsFEdXEdREkFEbBEbRElFEPCEfkEFNYAEYAhYBNYQdYDXYSRYCEYYoYgQYgRYuRYmCYZTYdBYbEYlXYjQYRbYWRpKXpQopQnpSFpCXpIBpISphNpdBpdRpbRpcZpFBpFNpFDpFopFrLADLBuLXQLXcLaFLCXLEhLpBLpFLHXLeVLhILdHLdRLoDLbRLrXIABIBQIBCIBsIBoIBMIBRIXaIaRIKYIKRINBINuICDIGBIIDIIkIgRIxFIyQIiHIdRIbYIbRIlHIwRIMYIcRIRVITRIFBIFNIFQOABOAFOBQOaFONBONMOQFOSFOCDOGBOEQOpBOLXOIBOIFOgQOgFOyQOycOmXOsXOdIOkHOMEOMkOWWHBNHXNHXWHNXHDuHDRHSuHSRHHoHhkHmRHdRHkQHlcHlRHwBHWcgAEgAggAkgBNgBQgBEgXOgYcgLXgHjgyQgiBgsFgdagMYgWSgFQgFEVBTVXEVKBVKNVKDVKYVKRVNBVNYVDBVDxVSBVSRVCjVGNVLXVIFVhBVhcVsXVdRVbRVlRhBYhKYhDYhGShxWhmNhdahdkhbRhjohMXhTRxAXxXSxKBxNBxEQxeNxeQxhXxsFxdbxlHxjcxFBxFNxFQxFOxFoyNYyYoybcyMYuBQuBRuBruDMuCouHBudQukkuoBulVuMXuFEmCYmCRmpRmeDmiMmjdmTFmFQiADiBOiaRiKRiNBiNRiSFiGkiGFiERipRiLFiIFihYibHijBijEiMXiWBiFBiFCUBQUXFUaRUNDUNcUNRUNFUDBUSHUCDUGBUGFUEqULNULoUIRUeEUeYUgBUhFUuRUiFUsXUdFUkHUbBUjSUjYUwXUMDUcHURdUTBUrBUrXUrQZAFZXZZaRZKFZNBZQFZCXZGBZYdZpBZLDZIFZHXZHNZeQZVRZVFZmXZiBZvFZdFZkFZbHZbFZwXZcCZcRZRBvBQvBGvBLvBWvCovMYsAFsBDsaRsKFsNFsDrsSHsSFsCXsCRsEBsEHsEfspBsLBsLDsIgsIRseGsbRsFBsFQsFSdNBdSRdCVdGHdYDdHcdVbdySduDdsXdlRdwXdWYdWcdWRkBMkXOkaRkNIkNFkSFkCFkYBkpRkeNkgBkhVkmXksFklVkMBkWDkFNoBNoaQoaFoNBoNXoNaoNEoSRoEroYXoYCoYbopRopFomXojkowXorFbBEbEIbdBbjYlaRlDElMXlFDjKjjSRjGBjYBjYkjpRjLXjIBjOFjeVjbRjwBnXQnSHnpFnLXnINnMBnTRwXBwXNwXYwNFwQFwSBwGFwLXwLDweNwgBwuHwjDwnXMBXMpFMIBMeNMTHcaQcNBcDHcSFcCXcpBcLXcLDcgFcuFcnXcwXccDcTQcrFTQErXNrCHrpFrgFrbFrTHrFcWNYWNbWEHWMXWTR", + // 5-kana words + "ABGHABIJAEAVAYJQALZJAIaRAHNXAHdcAHbRAZJMAZJRAZTRAdVJAklmAbcNAjdRAMnRAMWYAWpRAWgRAFgBAFhBAFdcBNJBBNJDBQKBBQhcBQlmBDEJBYJkBYJTBpNBBpJFBIJBBIJDBIcABOKXBOEJBOVJBOiJBOZJBepBBeLXBeIFBegBBgGJBVJXBuocBiJRBUJQBlXVBlITBwNFBMYVBcqXBTlmBWNFBWiJBWnRBFGHBFwXXKGJXNJBXNZJXDTTXSHSXSVRXSlHXCJDXGQJXEhXXYQJXYbRXOfXXeNcXVJFXhQJXhEJXdTRXjdXXMhBXcQTXRGBXTEBXTnQXFCXXFOFXFgFaBaFaBNJaBCJaBpBaBwXaNJKaNJDaQIBaDpRaEPDaHMFamDJalEJaMZJaFaFaFNBaFQJaFLDaFVHKBCYKBEBKBHDKXaFKXGdKXEJKXpHKXIBKXZDKXwXKKwLKNacKNYJKNJoKNWcKDGdKDTRKChXKGaRKGhBKGbRKEBTKEaRKEPTKLMDKLWRKOHDKVJcKdBcKlIBKlOPKFSBKFEPKFpFNBNJNJBQNBGHNBEPNBHXNBgFNBVXNBZDNBsXNBwXNNaRNNJDNNJENNJkNDCJNDVDNGJRNJiDNZJNNsCJNJFNNFSBNFCXNFEPNFLXNFIFQJBFQCaRQJEQQLJDQLJFQIaRQOqXQHaFQHHQQVJXQVJDQhNJQmEIQZJFQsJXQJrFQWbRDJABDBYJDXNFDXCXDXLXDXZDDXsJDQqXDSJFDJCXDEPkDEqXDYmQDpSJDOCkDOGQDHEIDVJDDuDuDWEBDJFgSBNDSBSFSBGHSBIBSBTQSKVYSJQNSJQiSJCXSEqXSJYVSIiJSOMYSHAHSHaQSeCFSepQSegBSHdHSHrFShSJSJuHSJUFSkNRSrSrSWEBSFaHSJFQSFCXSFGDSFYXSFODSFgBSFVXSFhBSFxFSFkFSFbBSFMFCADdCJXBCXaFCXKFCXNFCXCXCXGBCXEJCXYBCXLDCXIBCXOPCXHXCXgBCXhBCXiBCXlDCXcHCJNBCJNFCDCJCDGBCDVXCDhBCDiDCDJdCCmNCpJFCIaRCOqXCHCHCHZJCViJCuCuCmddCJiFCdNBCdHhClEJCnUJCreSCWlgCWTRCFBFCFNBCFYBCFVFCFhFCFdSCFTBCFWDGBNBGBQFGJBCGBEqGBpBGBgQGNBEGNJYGNkOGNJRGDUFGJpQGHaBGJeNGJeEGVBlGVKjGiJDGvJHGsVJGkEBGMIJGWjNGFBFGFCXGFGBGFYXGFpBGFMFEASJEAWpEJNFECJVEIXSEIQJEOqXEOcFEeNcEHEJEHlFEJgFEhlmEmDJEmZJEiMBEUqXEoSREPBFEPXFEPKFEPSFEPEFEPpFEPLXEPIBEJPdEPcFEPTBEJnXEqlHEMpREFCXEFODEFcFYASJYJAFYBaBYBVXYXpFYDhBYCJBYJGFYYbRYeNcYJeVYiIJYZJcYvJgYvJRYJsXYsJFYMYMYreVpBNHpBEJpBwXpQxFpYEJpeNDpJeDpeSFpeCHpHUJpHbBpHcHpmUJpiiJpUJrpsJuplITpFaBpFQqpFGBpFEfpFYBpFpBpFLJpFIDpFgBpFVXpFyQpFuFpFlFpFjDpFnXpFwXpJFMpFTBLXCJLXEFLXhFLXUJLXbFLalmLNJBLSJQLCLCLGJBLLDJLHaFLeNFLeSHLeCXLepFLhaRLZsJLsJDLsJrLocaLlLlLMdbLFNBLFSBLFEHLFkFIBBFIBXFIBaQIBKXIBSFIBpHIBLXIBgBIBhBIBuHIBmXIBiFIBZXIBvFIBbFIBjQIBwXIBWFIKTRIQUJIDGFICjQIYSRIINXIJeCIVaRImEkIZJFIvJRIsJXIdCJIJoRIbBQIjYBIcqXITFVIreVIFKFIFSFIFCJIFGFIFLDIFIBIJFOIFgBIFVXIJFhIFxFIFmXIFdHIFbBIJFrIJFWOBGBOQfXOOKjOUqXOfXBOqXEOcqXORVJOFIBOFlDHBIOHXiFHNTRHCJXHIaRHHJDHHEJHVbRHZJYHbIBHRsJHRkDHWlmgBKFgBSBgBCDgBGHgBpBgBIBgBVJgBuBgBvFgKDTgQVXgDUJgGSJgOqXgmUMgZIJgTUJgWIEgFBFgFNBgFDJgFSFgFGBgFYXgJFOgFgQgFVXgFhBgFbHgJFWVJABVQKcVDgFVOfXVeDFVhaRVmGdViJYVMaRVFNHhBNDhBCXhBEqhBpFhBLXhNJBhSJRheVXhhKEhxlmhZIJhdBQhkIJhbMNhMUJhMZJxNJgxQUJxDEkxDdFxSJRxplmxeSBxeCXxeGFxeYXxepQxegBxWVcxFEQxFLXxFIBxFgBxFxDxFZtxFdcxFbBxFwXyDJXyDlcuASJuDJpuDIBuCpJuGSJuIJFueEFuZIJusJXudWEuoIBuWGJuFBcuFKEuFNFuFQFuFDJuFGJuFVJuFUtuFdHuFTBmBYJmNJYmQhkmLJDmLJomIdXmiJYmvJRmsJRmklmmMBymMuCmclmmcnQiJABiJBNiJBDiBSFiBCJiBEFiBYBiBpFiBLXiBTHiJNciDEfiCZJiECJiJEqiOkHiHKFieNDiHJQieQcieDHieSFieCXieGFieEFieIHiegFihUJixNoioNXiFaBiFKFiFNDiFEPiFYXitFOitFHiFgBiFVEiFmXiFitiFbBiFMFiFrFUCXQUIoQUIJcUHQJUeCEUHwXUUJDUUqXUdWcUcqXUrnQUFNDUFSHUFCFUFEfUFLXUtFOZBXOZXSBZXpFZXVXZEQJZEJkZpDJZOqXZeNHZeCDZUqXZFBQZFEHZFLXvBAFvBKFvBCXvBEPvBpHvBIDvBgFvBuHvQNJvFNFvFGBvFIBvJFcsXCDsXLXsXsXsXlFsXcHsQqXsJQFsEqXseIFsFEHsFjDdBxOdNpRdNJRdEJbdpJRdhZJdnSJdrjNdFNJdFQHdFhNkNJDkYaRkHNRkHSRkVbRkuMRkjSJkcqDoSJFoEiJoYZJoOfXohEBoMGQocqXbBAFbBXFbBaFbBNDbBGBbBLXbBTBbBWDbGJYbIJHbFQqbFpQlDgQlOrFlVJRjGEBjZJRnXvJnXbBnEfHnOPDngJRnxfXnUJWwXEJwNpJwDpBwEfXwrEBMDCJMDGHMDIJMLJDcQGDcQpHcqXccqNFcqCXcFCJRBSBRBGBRBEJRBpQTBNFTBQJTBpBTBVXTFABTFSBTFCFTFGBTFMDrXCJrXLDrDNJrEfHrFQJrFitWNjdWNTR", + // 6-kana words + "AKLJMANOPFASNJIAEJWXAYJNRAIIbRAIcdaAeEfDAgidRAdjNYAMYEJAMIbRAFNJBAFpJFBBIJYBDZJFBSiJhBGdEBBEJfXBEJqXBEJWRBpaUJBLXrXBIYJMBOcfXBeEfFBestXBjNJRBcDJOBFEqXXNvJRXDMBhXCJNYXOAWpXONJWXHDEBXeIaRXhYJDXZJSJXMDJOXcASJXFVJXaBQqXaBZJFasXdQaFSJQaFEfXaFpJHaFOqXKBNSRKXvJBKQJhXKEJQJKEJGFKINJBKIJjNKgJNSKVElmKVhEBKiJGFKlBgJKjnUJKwsJYKMFIJKFNJDKFIJFKFOfXNJBSFNJBCXNBpJFNJBvQNJBMBNJLJXNJOqXNJeCXNJeGFNdsJCNbTKFNwXUJQNFEPQDiJcQDMSJQSFpBQGMQJQJeOcQyCJEQUJEBQJFBrQFEJqDXDJFDJXpBDJXIMDGiJhDIJGRDJeYcDHrDJDVXgFDkAWpDkIgRDjDEqDMvJRDJFNFDJFIBSKclmSJQOFSJQVHSJQjDSJGJBSJGJFSECJoSHEJqSJHTBSJVJDSViJYSZJNBSJsJDSFSJFSFEfXSJFLXCBUJVCJXSBCJXpBCXVJXCJXsXCJXdFCJNJHCLIJgCHiJFCVNJMChCJhCUHEJCsJTRCJdYcCoQJCCFEfXCFIJgCFUJxCFstFGJBaQGJBIDGQJqXGYJNRGJHKFGeQqDGHEJFGJeLXGHIiJGHdBlGUJEBGkIJTGFQPDGJFEqEAGegEJIJBEJVJXEhQJTEiJNcEJZJFEJoEqEjDEqEPDsXEPGJBEPOqXEPeQFEfDiDEJfEFEfepQEfMiJEqXNBEqDIDEqeSFEqVJXEMvJRYXNJDYXEJHYKVJcYYJEBYJeEcYJUqXYFpJFYFstXpAZJMpBSJFpNBNFpeQPDpHLJDpHIJFpHgJFpeitFpHZJFpJFADpFSJFpJFCJpFOqXpFitBpJFZJLXIJFLIJgRLVNJWLVHJMLwNpJLFGJBLFLJDLFOqXLJFUJIBDJXIBGJBIJBYQIJBIBIBOqXIBcqDIEGJFILNJTIIJEBIOiJhIJeNBIJeIBIhiJIIWoTRIJFAHIJFpBIJFuHIFUtFIJFTHOSBYJOEcqXOHEJqOvBpFOkVJrObBVJOncqDOcNJkHhNJRHuHJuHdMhBgBUqXgBsJXgONJBgHNJDgHHJQgJeitgHsJXgJyNagyDJBgZJDrgsVJQgkEJNgkjSJgJFAHgFCJDgFZtMVJXNFVXQfXVJXDJVXoQJVQVJQVDEfXVDvJHVEqNFVeQfXVHpJFVHxfXVVJSRVVmaRVlIJOhCXVJhHjYkhxCJVhWVUJhWiJcxBNJIxeEqDxfXBFxcFEPxFSJFxFYJXyBDQJydaUJyFOPDuYCJYuLvJRuHLJXuZJLDuFOPDuFZJHuFcqXmKHJdmCQJcmOsVJiJAGFitLCFieOfXiestXiZJMEikNJQirXzFiFQqXiFIJFiFZJFiFvtFUHpJFUteIcUteOcUVCJkUhdHcUbEJEUJqXQUMNJhURjYkUFitFZDGJHZJIxDZJVJXZJFDJZJFpQvBNJBvBSJFvJxBrseQqDsVFVJdFLJDkEJNBkmNJYkFLJDoQJOPoGsJRoEAHBoEJfFbBQqDbBZJHbFVJXlFIJBjYIrXjeitcjjCEBjWMNBwXQfXwXOaFwDsJXwCJTRwrCZJMDNJQcDDJFcqDOPRYiJFTBsJXTQIJBTFEfXTFLJDrXEJFrEJXMrFZJFWEJdEWYTlm", + // 7-kana words + "ABCDEFACNJTRAMBDJdAcNJVXBLNJEBXSIdWRXErNJkXYDJMBXZJCJaXMNJaYKKVJKcKDEJqXKDcNJhKVJrNYKbgJVXKFVJSBNBYBwDNJeQfXNJeEqXNhGJWENJFiJRQlIJbEQJfXxDQqXcfXQFNDEJQFwXUJDYcnUJDJIBgQDIUJTRDJFEqDSJQSJFSJQIJFSOPeZtSJFZJHCJXQfXCTDEqFGJBSJFGJBOfXGJBcqXGJHNJDGJRLiJEJfXEqEJFEJPEFpBEJYJBZJFYBwXUJYiJMEBYJZJyTYTONJXpQMFXFpeGIDdpJFstXpJFcPDLBVSJRLHQJqXLJFZJFIJBNJDIJBUqXIBkFDJIJEJPTIYJGWRIJeQPDIJeEfHIJFsJXOqGDSFHXEJqXgJCsJCgGQJqXgdQYJEgFMFNBgJFcqDVJwXUJVJFZJchIgJCCxOEJqXxOwXUJyDJBVRuscisciJBiJBieUtqXiJFDJkiFsJXQUGEZJcUJFsJXZtXIrXZDZJDrZJFNJDZJFstXvJFQqXvJFCJEsJXQJqkhkNGBbDJdTRbYJMEBlDwXUJMEFiJFcfXNJDRcNJWMTBLJXC", + // 8-kana words + "BraFUtHBFSJFdbNBLJXVJQoYJNEBSJBEJfHSJHwXUJCJdAZJMGjaFVJXEJPNJBlEJfFiJFpFbFEJqIJBVJCrIBdHiJhOPFChvJVJZJNJWxGFNIFLueIBQJqUHEJfUFstOZJDrlXEASJRlXVJXSFwVJNJWD", + // 9-kana words + "QJEJNNJDQJEJIBSFQJEJxegBQJEJfHEPSJBmXEJFSJCDEJqXLXNJFQqXIcQsFNJFIFEJqXUJgFsJXIJBUJEJfHNFvJxEqXNJnXUJFQqD", + // 10-kana words + "IJBEJqXZJ" +]; +// Maps each character into its kana value (the index) +const mapping = "~~AzB~X~a~KN~Q~D~S~C~G~E~Y~p~L~I~O~eH~g~V~hxyumi~~U~~Z~~v~~s~~dkoblPjfnqwMcRTr~W~~~F~~~~~Jt"; +let wordlist = null; +function hex(word) { + return Object(_ethersproject_bytes__WEBPACK_IMPORTED_MODULE_0__["hexlify"])(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8Bytes"])(word)); +} +const KiYoKu = "0xe3818de38284e3818f"; +const KyoKu = "0xe3818de38283e3818f"; +function loadWords(lang) { + if (wordlist !== null) { + return; + } + wordlist = []; + // Transforms for normalizing (sort is a not quite UTF-8) + const transform = {}; + // Delete the diacritic marks + transform[Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 154])] = false; + transform[Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 153])] = false; + // Some simple transforms that sort out most of the order + transform[Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 133])] = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 134]); + transform[Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 129, 163])] = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 129, 164]); + transform[Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 131])] = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 132]); + transform[Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 135])] = Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])([227, 130, 136]); + // Normalize words using the transform + function normalize(word) { + let result = ""; + for (let i = 0; i < word.length; i++) { + let kana = word[i]; + const target = transform[kana]; + if (target === false) { + continue; + } + if (target) { + kana = target; + } + result += kana; + } + return result; + } + // Sort how the Japanese list is sorted + function sortJapanese(a, b) { + a = normalize(a); + b = normalize(b); + if (a < b) { + return -1; + } + if (a > b) { + return 1; + } + return 0; + } + // Load all the words + for (let length = 3; length <= 9; length++) { + const d = data[length - 3]; + for (let offset = 0; offset < d.length; offset += length) { + const word = []; + for (let i = 0; i < length; i++) { + const k = mapping.indexOf(d[offset + i]); + word.push(227); + word.push((k & 0x40) ? 130 : 129); + word.push((k & 0x3f) + 128); + } + wordlist.push(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_1__["toUtf8String"])(word)); + } + } + wordlist.sort(sortJapanese); + // For some reason kyoku and kiyoku are flipped in node (!!). + // The order SHOULD be: + // - kyoku + // - kiyoku + // This should ignore "if", but that doesn't work here?? + /* istanbul ignore next */ + if (hex(wordlist[442]) === KiYoKu && hex(wordlist[443]) === KyoKu) { + const tmp = wordlist[442]; + wordlist[442] = wordlist[443]; + wordlist[443] = tmp; + } + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_2__["Wordlist"].check(lang) !== "0xcb36b09e6baa935787fd762ce65e80b0c6a8dabdfbc3a7f86ac0e2c4fd111600") { + wordlist = null; + throw new Error("BIP39 Wordlist for ja (Japanese) FAILED"); + } +} +class LangJa extends _wordlist__WEBPACK_IMPORTED_MODULE_2__["Wordlist"] { + constructor() { + super("ja"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return wordlist.indexOf(word); + } + split(mnemonic) { + _wordlist__WEBPACK_IMPORTED_MODULE_2__["logger"].checkNormalize(); + return mnemonic.split(/(?:\u3000| )+/g); + } + join(words) { + return words.join("\u3000"); + } +} +const langJa = new LangJa(); +_wordlist__WEBPACK_IMPORTED_MODULE_2__["Wordlist"].register(langJa); + +//# sourceMappingURL=lang-ja.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-ko.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-ko.js ***! + \******************************************************************/ +/*! exports provided: langKo */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langKo", function() { return langKo; }); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + + +const data = [ + "OYAa", + "ATAZoATBl3ATCTrATCl8ATDloATGg3ATHT8ATJT8ATJl3ATLlvATLn4ATMT8ATMX8ATMboATMgoAToLbAToMTATrHgATvHnAT3AnAT3JbAT3MTAT8DbAT8JTAT8LmAT8MYAT8MbAT#LnAUHT8AUHZvAUJXrAUJX8AULnrAXJnvAXLUoAXLgvAXMn6AXRg3AXrMbAX3JTAX3QbAYLn3AZLgvAZrSUAZvAcAZ8AaAZ8AbAZ8AnAZ8HnAZ8LgAZ8MYAZ8MgAZ8OnAaAboAaDTrAaFTrAaJTrAaJboAaLVoAaMXvAaOl8AaSeoAbAUoAbAg8AbAl4AbGnrAbMT8AbMXrAbMn4AbQb8AbSV8AbvRlAb8AUAb8AnAb8HgAb8JTAb8NTAb8RbAcGboAcLnvAcMT8AcMX8AcSToAcrAaAcrFnAc8AbAc8MgAfGgrAfHboAfJnvAfLV8AfLkoAfMT8AfMnoAfQb8AfScrAfSgrAgAZ8AgFl3AgGX8AgHZvAgHgrAgJXoAgJX8AgJboAgLZoAgLn4AgOX8AgoATAgoAnAgoCUAgoJgAgoLXAgoMYAgoSeAgrDUAgrJTAhrFnAhrLjAhrQgAjAgoAjJnrAkMX8AkOnoAlCTvAlCV8AlClvAlFg4AlFl6AlFn3AloSnAlrAXAlrAfAlrFUAlrFbAlrGgAlrOXAlvKnAlvMTAl3AbAl3MnAnATrAnAcrAnCZ3AnCl8AnDg8AnFboAnFl3AnHX4AnHbrAnHgrAnIl3AnJgvAnLXoAnLX4AnLbrAnLgrAnLhrAnMXoAnMgrAnOn3AnSbrAnSeoAnvLnAn3OnCTGgvCTSlvCTvAUCTvKnCTvNTCT3CZCT3GUCT3MTCT8HnCUCZrCULf8CULnvCU3HnCU3JUCY6NUCbDb8CbFZoCbLnrCboOTCboScCbrFnCbvLnCb8AgCb8HgCb$LnCkLfoClBn3CloDUDTHT8DTLl3DTSU8DTrAaDTrLXDTrLjDTrOYDTrOgDTvFXDTvFnDT3HUDT3LfDUCT9DUDT4DUFVoDUFV8DUFkoDUGgrDUJnrDULl8DUMT8DUMXrDUMX4DUMg8DUOUoDUOgvDUOg8DUSToDUSZ8DbDXoDbDgoDbGT8DbJn3DbLg3DbLn4DbMXrDbMg8DbOToDboJXGTClvGTDT8GTFZrGTLVoGTLlvGTLl3GTMg8GTOTvGTSlrGToCUGTrDgGTrJYGTrScGTtLnGTvAnGTvQgGUCZrGUDTvGUFZoGUHXrGULnvGUMT8GUoMgGXoLnGXrMXGXrMnGXvFnGYLnvGZOnvGZvOnGZ8LaGZ8LmGbAl3GbDYvGbDlrGbHX3GbJl4GbLV8GbLn3GbMn4GboJTGboRfGbvFUGb3GUGb4JnGgDX3GgFl$GgJlrGgLX6GgLZoGgLf8GgOXoGgrAgGgrJXGgrMYGgrScGgvATGgvOYGnAgoGnJgvGnLZoGnLg3GnLnrGnQn8GnSbrGnrMgHTClvHTDToHTFT3HTQT8HToJTHToJgHTrDUHTrMnHTvFYHTvRfHT8MnHT8SUHUAZ8HUBb4HUDTvHUoMYHXFl6HXJX6HXQlrHXrAUHXrMnHXrSbHXvFYHXvKXHX3LjHX3MeHYvQlHZrScHZvDbHbAcrHbFT3HbFl3HbJT8HbLTrHbMT8HbMXrHbMbrHbQb8HbSX3HboDbHboJTHbrFUHbrHgHbrJTHb8JTHb8MnHb8QgHgAlrHgDT3HgGgrHgHgrHgJTrHgJT8HgLX@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!Ln$CTGXMnCToLZ4CTrHT8CT3JTrCT3RZrCT#GTvCU6GgvCU8Db8CU8GZrCU8HT8CboLl3CbrGgrCbrMU8Cb8DT3Cb8GnrCb8LX4Cb8MT8Cb8ObrCgrGgvCgrKX4Cl8FZoDTrAbvDTrDboDTrGT6DTrJgrDTrMX3DTrRZrDTrRg8DTvAVvDTvFZoDT3DT8DT3Ln3DT4HZrDT4MT8DT8AlrDT8MT8DUAkGbDUDbJnDYLnQlDbDUOYDbMTAnDbMXSnDboAT3DboFn4DboLnvDj6JTrGTCgFTGTGgFnGTJTMnGTLnPlGToJT8GTrCT3GTrLVoGTrLnvGTrMX3GTrMboGTvKl3GZClFnGZrDT3GZ8DTrGZ8FZ8GZ8MXvGZ8On8GZ8ST3GbCnQXGbMbFnGboFboGboJg3GboMXoGb3JTvGb3JboGb3Mn6Gb3Qb8GgDXLjGgMnAUGgrDloGgrHX4GgrSToGgvAXrGgvAZvGgvFbrGgvLl3GgvMnvGnDnLXGnrATrGnrMboGnuLl3HTATMnHTAgCnHTCTCTHTrGTvHTrHTvHTrJX8HTrLl8HTrMT8HTrMgoHTrOTrHTuOn3HTvAZrHTvDTvHTvGboHTvJU8HTvLl3HTvMXrHTvQb4HT4GT6HT4JT8HT4Jb#HT8Al3HT8GZrHT8GgrHT8HX4HT8Jb8HT8JnoHT8LTrHT8LgvHT8SToHT8SV8HUoJUoHUoJX8HUoLnrHXrLZoHXvAl3HX3LnrHX4FkvHX4LhrHX4MXoHX4OnoHZrAZ8HZrDb8HZrGZ8HZrJnrHZvGZ8HZvLnvHZ8JnvHZ8LhrHbCXJlHbMTAnHboJl4HbpLl3HbrJX8HbrLnrHbrMnvHbvRYrHgoSTrHgrFV8HgrGZ8HgrJXoHgrRnvHgvBb!HgvGTrHgvHX4HgvHn!HgvLTrHgvSU8HnDnLbHnFbJbHnvDn8Hn6GgvHn!BTvJTCTLnJTQgFnJTrAnvJTrLX4JTrOUoJTvFn3JTvLnrJTvNToJT3AgoJT3Jn4JT3LhvJT3ObrJT8AcrJT8Al3JT8JT8JT8JnoJT8LX4JT8LnrJT8MX3JT8Rg3JT8Sc8JUoBTvJU8AToJU8GZ8JU8GgvJU8JTrJU8JXrJU8JnrJU8LnvJU8ScvJXHnJlJXrGgvJXrJU8JXrLhrJXrMT8JXrMXrJXrQUoJXvCTvJXvGZ8JXvGgrJXvQT8JX8Ab8JX8DT8JX8GZ8JX8HZvJX8LnrJX8MT8JX8MXoJX8MnvJX8ST3JYGnCTJbAkGbJbCTAnJbLTAcJboDT3JboLb6JbrAnvJbrCn3JbrDl8JbrGboJbrIZoJbrJnvJbrMnvJbrQb4Jb8RZrJeAbAnJgJnFbJgScAnJgrATrJgvHZ8JgvMn4JlJlFbJlLiQXJlLjOnJlRbOlJlvNXoJlvRl3Jl4AcrJl8AUoJl8MnrJnFnMlJnHgGbJnoDT8JnoFV8JnoGgvJnoIT8JnoQToJnoRg3JnrCZ3JnrGgrJnrHTvJnrLf8JnrOX8JnvAT3JnvFZoJnvGT8JnvJl4JnvMT8JnvMX8JnvOXrJnvPX6JnvSX3JnvSZrJn3MT8Jn3MX8Jn3RTrLTATKnLTJnLTLTMXKnLTRTQlLToGb8LTrAZ8LTrCZ8LTrDb8LTrHT8LT3PX6LT4FZoLT$CTvLT$GgrLUvHX3LVoATrLVoAgoLVoJboLVoMX3LVoRg3LV8CZ3LV8FZoLV8GTvLXrDXoLXrFbrLXvAgvLXvFlrLXvLl3LXvRn6LX4Mb8LX8GT8LYCXMnLYrMnrLZoSTvLZrAZvLZrAloLZrFToLZrJXvLZrJboLZrJl4LZrLnrLZrMT8LZrOgvLZrRnvLZrST4LZvMX8LZvSlvLZ8AgoLZ8CT3LZ8JT8LZ8LV8LZ8LZoLZ8Lg8LZ8SV8LZ8SbrLZ$HT8LZ$Mn4La6CTvLbFbMnLbRYFTLbSnFZLboJT8LbrAT9LbrGb3LbrQb8LcrJX8LcrMXrLerHTvLerJbrLerNboLgrDb8LgrGZ8LgrHTrLgrMXrLgrSU8LgvJTrLgvLl3Lg6Ll3LhrLnrLhrMT8LhvAl4LiLnQXLkoAgrLkoJT8LkoJn4LlrSU8Ll3FZoLl3HTrLl3JX8Ll3JnoLl3LToLmLeFbLnDUFbLnLVAnLnrATrLnrAZoLnrAb8LnrAlrLnrGgvLnrJU8LnrLZrLnrLhrLnrMb8LnrOXrLnrSZ8LnvAb4LnvDTrLnvDl8LnvHTrLnvHbrLnvJT8LnvJU8LnvJbrLnvLhvLnvMX8LnvMb8LnvNnoLnvSU8Ln3Al3Ln4FZoLn4GT6Ln4JgvLn4LhrLn4MT8Ln4SToMToCZrMToJX8MToLX4MToLf8MToRg3MTrEloMTvGb6MT3BTrMT3Lb6MT8AcrMT8AgrMT8GZrMT8JnoMT8LnrMT8MX3MUOUAnMXAbFnMXoAloMXoJX8MXoLf8MXoLl8MXrAb8MXrDTvMXrGT8MXrGgrMXrHTrMXrLf8MXrMU8MXrOXvMXrQb8MXvGT8MXvHTrMXvLVoMX3AX3MX3Jn3MX3LhrMX3MX3MX4AlrMX4OboMX8GTvMX8GZrMX8GgrMX8JT8MX8JX8MX8LhrMX8MT8MYDUFbMYMgDbMbGnFfMbvLX4MbvLl3Mb8Mb8Mb8ST4MgGXCnMg8ATrMg8AgoMg8CZrMg8DTrMg8DboMg8HTrMg8JgrMg8LT8MloJXoMl8AhrMl8JT8MnLgAUMnoJXrMnoLX4MnoLhrMnoMT8MnrAl4MnrDb8MnrOTvMnrOgvMnrQb8MnrSU8MnvGgrMnvHZ8Mn3MToMn4DTrMn4LTrMn4Mg8NnBXAnOTFTFnOToAToOTrGgvOTrJX8OT3JXoOT6MTrOT8GgrOT8HTpOT8MToOUoHT8OUoJT8OUoLn3OXrAgoOXrDg8OXrMT8OXvSToOX6CTvOX8CZrOX8OgrOb6HgvOb8AToOb8MT8OcvLZ8OgvAlrOgvHTvOgvJTrOgvJnrOgvLZrOgvLn4OgvMT8OgvRTrOg8AZoOg8DbvOnrOXoOnvJn4OnvLhvOnvRTrOn3GgoOn3JnvOn6JbvOn8OTrPTGYFTPbBnFnPbGnDnPgDYQTPlrAnvPlrETvPlrLnvPlrMXvPlvFX4QTMTAnQTrJU8QYCnJlQYJlQlQbGTQbQb8JnrQb8LZoQb8LnvQb8MT8Qb8Ml8Qb8ST4QloAl4QloHZvQloJX8QloMn8QnJZOlRTrAZvRTrDTrRTvJn4RTvLhvRT4Jb8RZrAZrRZ8AkrRZ8JU8RZ8LV8RZ8LnvRbJlQXRg3GboRg3MnvRg8AZ8Rg8JboRg8Jl4RnLTCbRnvFl3RnvQb8SToAl4SToCZrSToFZoSToHXrSToJU8SToJgvSToJl4SToLhrSToMX3STrAlvSTrCT9STrCgrSTrGgrSTrHXrSTrHboSTrJnoSTrNboSTvLnrST4AZoST8Ab8ST8JT8SUoJn3SU6HZ#SU6JTvSU8Db8SU8HboSU8LgrSV8JT8SZrAcrSZrAl3SZrJT8SZrJnvSZrMT8SZvLUoSZ4FZoSZ8JnoSZ8RZrScoLnrScoMT8ScoMX8ScrAT4ScrAZ8ScrLZ8ScrLkvScvDb8ScvLf8ScvNToSgrFZrShvKnrSloHUoSloLnrSlrMXoSl8HgrSmrJUoSn3BX6", + "ATFlOn3ATLgrDYAT4MTAnAT8LTMnAYJnRTrAbGgJnrAbLV8LnAbvNTAnAeFbLg3AgOYMXoAlQbFboAnDboAfAnJgoJTBToDgAnBUJbAl3BboDUAnCTDlvLnCTFTrSnCYoQTLnDTwAbAnDUDTrSnDUHgHgrDX8LXFnDbJXAcrETvLTLnGTFTQbrGTMnGToGT3DUFbGUJlPX3GbQg8LnGboJbFnGb3GgAYGgAg8ScGgMbAXrGgvAbAnGnJTLnvGnvATFgHTDT6ATHTrDlJnHYLnMn8HZrSbJTHZ8LTFnHbFTJUoHgSeMT8HgrLjAnHgvAbAnHlFUrDlHnDgvAnHnHTFT3HnQTGnrJTAaMXvJTGbCn3JTOgrAnJXvAXMnJbMg8SnJbMnRg3Jb8LTMnJnAl3OnJnGYrQlJnJlQY3LTDlCn3LTJjLg3LTLgvFXLTMg3GTLV8HUOgLXFZLg3LXNXrMnLX8QXFnLX9AlMYLYLXPXrLZAbJU8LZDUJU8LZMXrSnLZ$AgFnLaPXrDULbFYrMnLbMn8LXLboJgJgLeFbLg3LgLZrSnLgOYAgoLhrRnJlLkCTrSnLkOnLhrLnFX%AYLnFZoJXLnHTvJbLnLloAbMTATLf8MTHgJn3MTMXrAXMT3MTFnMUITvFnMXFX%AYMXMXvFbMXrFTDbMYAcMX3MbLf8SnMb8JbFnMgMXrMTMgvAXFnMgvGgCmMnAloSnMnFnJTrOXvMXSnOX8HTMnObJT8ScObLZFl3ObMXCZoPTLgrQXPUFnoQXPU3RXJlPX3RkQXPbrJXQlPlrJbFnQUAhrDbQXGnCXvQYLnHlvQbLfLnvRTOgvJbRXJYrQlRYLnrQlRbLnrQlRlFT8JlRlFnrQXSTClCn3STHTrAnSTLZQlrSTMnGTrSToHgGbSTrGTDnSTvGXCnST3HgFbSU3HXAXSbAnJn3SbFT8LnScLfLnv", + "AT3JgJX8AT8FZoSnAT8JgFV8AT8LhrDbAZ8JT8DbAb8GgLhrAb8SkLnvAe8MT8SnAlMYJXLVAl3GYDTvAl3LfLnvBUDTvLl3CTOn3HTrCT3DUGgrCU8MT8AbCbFTrJUoCgrDb8MTDTLV8JX8DTLnLXQlDT8LZrSnDUQb8FZ8DUST4JnvDb8ScOUoDj6GbJl4GTLfCYMlGToAXvFnGboAXvLnGgAcrJn3GgvFnSToGnLf8JnvGn#HTDToHTLnFXJlHTvATFToHTvHTDToHTvMTAgoHT3STClvHT4AlFl6HT8HTDToHUoDgJTrHUoScMX3HbRZrMXoHboJg8LTHgDb8JTrHgMToLf8HgvLnLnoHnHn3HT4Hn6MgvAnJTJU8ScvJT3AaQT8JT8HTrAnJXrRg8AnJbAloMXoJbrATFToJbvMnoSnJgDb6GgvJgDb8MXoJgSX3JU8JguATFToJlPYLnQlJlQkDnLbJlQlFYJlJl8Lf8OTJnCTFnLbJnLTHXMnJnLXGXCnJnoFfRg3JnrMYRg3Jn3HgFl3KT8Dg8LnLTRlFnPTLTvPbLbvLVoSbrCZLXMY6HT3LXNU7DlrLXNXDTATLX8DX8LnLZDb8JU8LZMnoLhrLZSToJU8LZrLaLnrLZvJn3SnLZ8LhrSnLaJnoMT8LbFlrHTvLbrFTLnrLbvATLlvLb6OTFn3LcLnJZOlLeAT6Mn4LeJT3ObrLg6LXFlrLhrJg8LnLhvDlPX4LhvLfLnvLj6JTFT3LnFbrMXoLnQluCTvLnrQXCY6LnvLfLnvLnvMgLnvLnvSeLf8MTMbrJn3MT3JgST3MT8AnATrMT8LULnrMUMToCZrMUScvLf8MXoDT8SnMX6ATFToMX8AXMT8MX8FkMT8MX8HTrDUMX8ScoSnMYJT6CTvMgAcrMXoMg8SToAfMlvAXLg3MnFl3AnvOT3AnFl3OUoATHT8OU3RnLXrOXrOXrSnObPbvFn6Og8HgrSnOg8OX8DbPTvAgoJgPU3RYLnrPXrDnJZrPb8CTGgvPlrLTDlvPlvFUJnoQUvFXrQlQeMnoAl3QlrQlrSnRTFTrJUoSTDlLiLXSTFg6HT3STJgoMn4STrFTJTrSTrLZFl3ST4FnMXoSUrDlHUoScvHTvSnSfLkvMXo", + "AUoAcrMXoAZ8HboAg8AbOg6ATFgAg8AloMXoAl3AT8JTrAl8MX8MXoCT3SToJU8Cl8Db8MXoDT8HgrATrDboOT8MXoGTOTrATMnGT8LhrAZ8GnvFnGnQXHToGgvAcrHTvAXvLl3HbrAZoMXoHgBlFXLg3HgMnFXrSnHgrSb8JUoHn6HT8LgvITvATrJUoJUoLZrRnvJU8HT8Jb8JXvFX8QT8JXvLToJTrJYrQnGnQXJgrJnoATrJnoJU8ScvJnvMnvMXoLTCTLgrJXLTJlRTvQlLbRnJlQYvLbrMb8LnvLbvFn3RnoLdCVSTGZrLeSTvGXCnLg3MnoLn3MToLlrETvMT8SToAl3MbrDU6GTvMb8LX4LhrPlrLXGXCnSToLf8Rg3STrDb8LTrSTvLTHXMnSb3RYLnMnSgOg6ATFg", + "HUDlGnrQXrJTrHgLnrAcJYMb8DULc8LTvFgGnCk3Mg8JbAnLX4QYvFYHnMXrRUoJnGnvFnRlvFTJlQnoSTrBXHXrLYSUJgLfoMT8Se8DTrHbDb", + "AbDl8SToJU8An3RbAb8ST8DUSTrGnrAgoLbFU6Db8LTrMg8AaHT8Jb8ObDl8SToJU8Pb3RlvFYoJl" +]; +const codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*"; +function getHangul(code) { + if (code >= 40) { + code = code + 168 - 40; + } + else if (code >= 19) { + code = code + 97 - 19; + } + return Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])([225, (code >> 6) + 132, (code & 0x3f) + 128]); +} +let wordlist = null; +function loadWords(lang) { + if (wordlist != null) { + return; + } + wordlist = []; + data.forEach((data, length) => { + length += 4; + for (let i = 0; i < data.length; i += length) { + let word = ""; + for (let j = 0; j < length; j++) { + word += getHangul(codes.indexOf(data[i + j])); + } + wordlist.push(word); + } + }); + wordlist.sort(); + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].check(lang) !== "0xf9eddeace9c5d3da9c93cf7d3cd38f6a13ed3affb933259ae865714e8a3ae71a") { + wordlist = null; + throw new Error("BIP39 Wordlist for ko (Korean) FAILED"); + } +} +class LangKo extends _wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"] { + constructor() { + super("ko"); + } + getWord(index) { + loadWords(this); + return wordlist[index]; + } + getWordIndex(word) { + loadWords(this); + return wordlist.indexOf(word); + } +} +const langKo = new LangKo(); +_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].register(langKo); + +//# sourceMappingURL=lang-ko.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/lang-zh.js": +/*!******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/lang-zh.js ***! + \******************************************************************/ +/*! exports provided: langZhCn, langZhTw */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langZhCn", function() { return langZhCn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "langZhTw", function() { return langZhTw; }); +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony import */ var _wordlist__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wordlist */ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js"); + + + +const data = "}aE#4A=Yv&co#4N#6G=cJ&SM#66|/Z#4t&kn~46#4K~4q%b9=IR#7l,mB#7W_X2*dl}Uo~7s}Uf&Iw#9c&cw~6O&H6&wx&IG%v5=IQ~8a&Pv#47$PR&50%Ko&QM&3l#5f,D9#4L|/H&tQ;v0~6n]nN<di,AM=W5%QO&ka&ua,hM^tm=zV=JA=wR&+X]7P&NB#4J#5L|/b[dA}tJ<Do&6m&u2[U1&Kb.HM&mC=w0&MW<rY,Hq#6M}QG,13&wP}Jp]Ow%ue&Kg<HP<D9~4k~9T&I2_c6$9T#9/[C5~7O~4a=cs&O7=KK=An&l9$6U$8A&uD&QI|/Y&bg}Ux&F2#6b}E2&JN&kW&kp=U/&bb=Xl<Cj}k+~5J#6L&5z&9i}b4&Fo,ho(X0_g3~4O$Fz&QE<HN=Ww]6/%GF-Vw=tj&/D&PN#9g=YO}cL&Of&PI~5I&Ip=vU=IW#9G;0o-wU}ss&QR<BT&R9=tk$PY_dh&Pq-yh]7T,nj.Xu=EP&76=cI&Fs*Xg}z7$Gb&+I=DF,AF=cA}rL#7j=Dz&3y<Aa$52=PQ}b0(iY$Fa}oL&xV#6U=ec=WZ,xh%RY<dp#9N&Fl&44=WH*A7=sh&TB&8P=07;u+&PK}uh}J5#72)V/=xC,AB$k0&f6;1E|+5=1B,3v]6n&wR%b+&xx]7f=Ol}fl;+D^wG]7E;nB;uh^Ir&l5=JL,nS=cf=g5;u6|/Q$Gc=MH%Hg#5d%M6^86=U+$Gz,l/,ir^5y&Ba&/F-IY&FI&be%IZ#77&PW_Nu$kE(Yf&NX]7Z,Jy&FJ(Xo&Nz#/d=y7&MX<Ag}Z+;nE]Dt(iG#4D=13&Pj~4c%v8&Zo%OL&/X#4W<HR&ie~6J_1O(Y2=y5=Ad*cv_eB#6k&PX:BU#7A;uk&Ft&Fx_dD=U2;vB=U5=4F}+O&GN.HH:9s=b0%NV(jO&IH=JT}Z9=VZ<Af,Kx^4m&uJ%c6,6r;9m#+L}cf%Kh&F3~4H=vP}bu,Hz|++,1w]nv}k6;uu$jw*Kl*WX&uM[x7&Fr[m7$NO&QN]hu=JN}nR^8g#/h(ps|KC;vd}xz=V0}p6&FD$G1#7K<bG_4p~8g&cf;u4=tl}+k%5/}fz;uw<cA=u1}gU}VM=LJ=eX&+L&Pr#4U}p2:nC,2K]7H:jF&9x}uX#9O=MB<fz~8X~5m&4D&kN&u5%E/(h7(ZF&VG<de(qM|/e-Wt=3x(a+,/R]f/&ND$Ro&nU}0g=KA%kH&NK$Ke<dS}cB&IX~5g$TN]6m=Uv,Is&Py=Ef%Kz#+/%bi&+A<F4$OG&4C&FL#9V<Zk=2I_eE&6c]nw&kq$HG}y+&A8$P3}OH=XP]70%IS(AJ_gH%GZ&tY&AZ=vb~6y&/r=VI=Wv<Zi=fl=xf&eL}c8}OL=MJ=g8$F7=YT}9u=0+^xC}JH&nL^N0~4T]K2,Cy%OC#6s;vG(AC^xe^cG&MF}Br#9P;wD-7h$O/&xA}Fn^PC]6i]7G&8V$Qs;vl(TB~73~4l<mW&6V=2y&uY&+3)aP}XF;LP&kx$wU=t7;uy<FN&lz)7E=Oo*Y+;wI}9q}le;J6&Ri&4t&Qr#8B=cb&vG=J5|Ql(h5<Yy~4+}QD,Lx=wn%K/&RK=dO&Pw,Q9=co%4u;9u}g0@6a^4I%b0=zo|/c&tX=dQ=OS#+b=yz_AB&wB&Pm=W9$HP_gR=62=AO=ti=hI,oA&jr&dH=tm&b6$P2(x8=zi;nG~7F;05]0n[Ix&3m}rg=Xp=cd&uz]7t;97=cN;vV<jf&FF&F1=6Q&Ik*Kk&P4,2z=fQ]7D&3u,H0=d/}Uw<ZN<7R}Kv;0f$H7,MD]7n$F0#88~9Z%da=by;+T#/u=VF&fO&kr^kf<AB]sU,I5$Ng&Pz;0i&QD&vM=Yl:BM;nJ_xJ]U7&Kf&30,3f|Z9*dC)je_jA&Q4&Kp$NH(Yz#6S&Id%Ib=KX,AD=KV%dP}tW&Pk^+E_Ni=cq,3R}VZ(Si=b+}rv;0j}rZ]uA,/w(Sx&Jv$w9&4d&wE,NJ$Gy=J/]Ls#7k<ZQ<Y/&uj]Ov$PM;v3,2F&+u:up=On&3e,Jv;90=J+&Qm]6q}bK#+d~8Y(h2]hA;99&AS=I/}qB&dQ}yJ-VM}Vl&ui,iB&G3|Dc]7d=eQ%dX%JC_1L~4d^NP;vJ&/1)ZI#7N]9X[bQ&PL=0L(UZ,Lm&kc&IR}n7(iR<AQ<dg=33=vN}ft}au]7I,Ba=x9=dR~6R&Tq=Xi,3d$Nr&Bc}DI&ku&vf]Dn,/F&iD,Ll&Nw=0y&I7=Ls=/A&tU=Qe}Ua&uk&+F=g4=gh=Vj#+1&Qn}Uy*44#5F,Pc&Rz*Xn=oh=5W;0n_Nf(iE<Y7=vr=Zu]oz#5Z%mI=kN=Bv_Jp(T2;vt_Ml<FS&uI=L/&6P]64$M7}86<bo%QX(SI%IY&VK=Al&Ux;vv;ut*E/%uh<ZE|O3,M2(yc]yu=Wk&tp:Ex}hr,Cl&WE)+Z=8U}I2_4Q,hA_si=iw=OM=tM=yZ%Ia=U7;wT}b+;uo=Za}yS!5x}HD}fb#5O_dA;Nv%uB(yB;01(Sf}Fk;v7}Pt#8v<mZ#7L,/r&Pl~4w&f5=Ph$Fw_LF&8m,bL=yJ&BH}p/*Jn}tU~5Q;wB(h6]Df]8p^+B;E4&Wc=d+;Ea&bw$8C&FN,DM=Yf}mP~5w=fT#6V=mC=Fi=AV}jB&AN}lW}aH#/D)dZ;hl;vE}/7,CJ;31&w8,hj%u9_Js=jJ&4M~8k=TN&eC}nL&uc-wi&lX}dj=Mv=e2#6u=cr$uq$6G]8W}Jb:nm=Yg<b3(UA;vX&6n&xF=KT,jC,De&R8&oY=Zv&oB]7/=Z2&Oa}bf,hh(4h^tZ&72&Nx;D2&xL~5h~40)ZG)h+=OJ&RA]Bv$yB=Oq=df,AQ%Jn}OJ;11,3z&Tl&tj;v+^Hv,Dh(id=s+]7N&N3)9Q~8f,S4=uW=w4&uX,LX&3d]CJ&yp&8x<b2_do&lP=y/<cy_dG=Oi=7R(VH(lt_1T,Iq_AA;12^6T%k6#8K[B1{oO<AU[Bt;1b$9S&Ps<8T=St{bY,jB(Zp&63&Uv$9V,PM]6v&Af}zW[bW_oq}sm}nB&Kq&gC&ff_eq_2m&5F&TI}rf}Gf;Zr_z9;ER&jk}iz_sn<BN~+n&vo=Vi%97|ZR=Wc,WE&6t]6z%85(ly#84=KY)6m_5/=aX,N3}Tm&he&6K]tR_B2-I3;u/&hU&lH<AP=iB&IA=XL;/5&Nh=wv<BH#79=vS=zl<AA=0X_RG}Bw&9p$NW,AX&kP_Lp&/Z(Tc]Mu}hs#6I}5B&cI<bq&H9#6m=K9}vH(Y1(Y0#4B&w6,/9&gG<bE,/O=zb}I4_l8<B/;wL%Qo<HO[Mq=XX}0v&BP&F4(mG}0i}nm,EC=9u{I3,xG&/9=JY*DK&hR)BX=EI=cx=b/{6k}yX%A+&wa}Xb=la;wi^lL;0t}jo&Qb=xg=XB}iO<qo{bR=NV&8f=a0&Jy;0v=uK)HK;vN#6h&jB(h/%ud&NI%wY.X7=Pt}Cu-uL&Gs_hl%mH,tm]78=Lb^Q0#7Y=1u<Bt&+Q=Co_RH,w3;1e}ux<aU;ui}U3&Q5%bt]63&UQ|0l&uL}O7&3o,AV&dm|Nj(Xt*5+(Uu&Hh(p7(UF=VR=Bp^Jl&Hd[ix)9/=Iq]C8<67]66}mB%6f}bb}JI]8T$HA}db=YM&pa=2J}tS&Y0=PS&y4=cX$6E,hX,XP&nR;04,FQ&l0&Vm_Dv#5Y~8Z=Bi%MA]6x=JO:+p,Az&9q,Hj~6/}SD=K1:EJ}nA;Qo#/E]9R,Ie&6X%W3]61&v4=xX_MC=0q;06(Xq=fs}IG}Dv=0l}o7$iZ;9v&LH&DP-7a&OY,SZ,Kz,Cv&dh=fx|Nh,F/~7q=XF&w+;9n&Gw;0h}Z7<7O&JK(S7&LS<AD<ac=wo<Dt&zw%4B=4v#8P;9o~6p*vV=Tm,Or&I6=1q}nY=P0=gq&Bl&Uu,Ch%yb}UY=zh}dh}rl(T4_xk(YA#8R*xH,IN}Jn]7V}C4&Ty}j3]7p=cL=3h&wW%Qv<Z3=f0&RI&+S(ic_zq}oN&/Y=z1;Td=LW=0e=OI(Vc,+b^ju(UL;0r:Za%8v=Rp=zw&58&73&wK}qX]6y&8E)a2}WR=wP^ur&nQ<cH}Re=Aq&wk}Q0&+q=PP,Gc|/d^k5,Fw]8Y}Pg]p3=ju=ed}r5_yf&Cs]7z$/G<Cm&Jp&54_1G_gP_Ll}JZ;0u]k8_7k(Sg]65{9i=LN&Sx&WK,iW&fD&Lk{9a}Em-9c#8N&io=sy]8d&nT&IK(lx#7/$lW(Td<s8~49,3o<7Y=MW(T+_Jr&Wd,iL}Ct=xh&5V;v4&8n%Kx=iF&l2_0B{B+,If(J0,Lv;u8=Kx-vB=HC&vS=Z6&fU&vE^xK;3D=4h=MR#45:Jw;0d}iw=LU}I5=I0]gB*im,K9}GU,1k_4U&Tt=Vs(iX&lU(TF#7y,ZO}oA&m5#5P}PN}Uz=hM<B1&FB<aG,e6~7T<tP(UQ_ZT=wu&F8)aQ]iN,1r_Lo&/g:CD}84{J1_Ki&Na&3n$jz&FE=dc;uv;va}in}ll=fv(h1&3h}fp=Cy}BM(+E~8m}lo%v7=hC(T6$cj=BQ=Bw(DR,2j=Ks,NS|F+;00=fU=70}Mb(YU;+G&m7&hr=Sk%Co]t+(X5_Jw}0r}gC(AS-IP&QK<Z2#8Q$WC]WX}T2&pG_Ka,HC=R4&/N;Z+;ch(C7,D4$3p_Mk&B2$8D=n9%Ky#5z(CT&QJ#7B]DC]gW}nf~5M;Iw#80}Tc_1F#4Z-aC}Hl=ph=fz,/3=aW}JM}nn;DG;vm}wn,4P}T3;wx&RG$u+}zK=0b;+J_Ek{re<aZ=AS}yY#5D]7q,Cp}xN=VP*2C}GZ}aG~+m_Cs=OY#6r]6g<GS}LC(UB=3A=Bo}Jy<c4}Is;1P<AG}Op<Z1}ld}nS=1Z,yM&95&98=CJ(4t:2L$Hk=Zo}Vc;+I}np&N1}9y=iv}CO*7p=jL)px]tb^zh&GS&Vl%v/;vR=14=zJ&49|/f]hF}WG;03=8P}o/&Gg&rp;DB,Kv}Ji&Pb;aA^ll(4j%yt}+K$Ht#4y&hY]7Y<F1,eN}bG(Uh%6Z]t5%G7;+F_RE;it}tL=LS&Da=Xx(S+(4f=8G=yI}cJ}WP=37=jS}pX}hd)fp<A8=Jt~+o$HJ=M6}iX=g9}CS=dv=Cj(mP%Kd,xq|+9&LD(4/=Xm&QP=Lc}LX&fL;+K=Op(lu=Qs.qC:+e&L+=Jj#8w;SL]7S(b+#4I=c1&nG_Lf&uH;+R)ZV<bV%B/,TE&0H&Jq&Ah%OF&Ss(p2,Wv&I3=Wl}Vq;1L&lJ#9b_1H=8r=b8=JH(SZ=hD=J2#7U,/U#/X~6P,FU<eL=jx,mG=hG=CE&PU=Se(qX&LY=X6=y4&tk&QQ&tf=4g&xI}W+&mZ=Dc#7w}Lg;DA;wQ_Kb(cJ=hR%yX&Yb,hw{bX_4X;EP;1W_2M}Uc=b5(YF,CM&Tp^OJ{DD]6s=vF=Yo~8q}XH}Fu%P5(SJ=Qt;MO]s8<F3&B3&8T(Ul-BS*dw&dR<87}/8]62$PZ]Lx<Au}9Q]7c=ja=KR,Go,Us&v6(qk}pG&G2=ev^GM%w4&H4]7F&dv]J6}Ew:9w=sj-ZL}Ym$+h(Ut(Um~4n=Xs(U7%eE=Qc_JR<CA#6t<Fv|/I,IS,EG<F2(Xy$/n<Fa(h9}+9_2o&N4#7X<Zq|+f_Dp=dt&na,Ca=NJ)jY=8C=YG=s6&Q+<DO}D3=xB&R1(lw;Qn<bF(Cu|/B}HV=SS&n7,10&u0]Dm%A6^4Q=WR(TD=Xo<GH,Rj(l8)bP&n/=LM&CF,F5&ml=PJ;0k=LG=tq,Rh,D6@4i=1p&+9=YC%er_Mh;nI;0q=Fw]80=xq=FM$Gv;v6&nc;wK%H2&Kj;vs,AA=YP,66}bI(qR~5U=6q~4b$Ni=K5.X3$So&Iu(p+]8G=Cf=RY(TS_O3(iH&57=fE=Dg_Do#9z#7H;FK{qd_2k%JR}en&gh_z8;Rx}9p<cN_Ne,DO;LN_7o~/p=NF=5Y}gN<ce<C1,QE]Wv=3u<BC}GK]yq}DY&u/_hj=II(pz&rC,jV&+Z}ut=NQ;Cg-SR_ZS,+o=u/;Oy_RK_QF(Fx&xP}Wr&TA,Uh&g1=yr{ax[VF$Pg(YB;Ox=Vy;+W(Sp}XV%dd&33(l/]l4#4Y}OE=6c=bw(A7&9t%wd&N/&mo,JH&Qe)fm=Ao}fu=tH"; +const deltaData = "FAZDC6BALcLZCA+GBARCW8wNCcDDZ8LVFBOqqDUiou+M42TFAyERXFb7EjhP+vmBFpFrUpfDV2F7eB+eCltCHJFWLFCED+pWTojEIHFXc3aFn4F68zqjEuKidS1QBVPDEhE7NA4mhMF7oThD49ot3FgtzHFCK0acW1x8DH1EmLoIlrWFBLE+y5+NA3Cx65wJHTaEZVaK1mWAmPGxgYCdxwOjTDIt/faOEhTl1vqNsKtJCOhJWuio2g07KLZEQsFBUpNtwEByBgxFslFheFbiEPvi61msDvApxCzB6rBCzox7joYA5UdDc+Cb4FSgIabpXFAj3bjkmFAxCZE+mD/SFf/0ELecYCt3nLoxC6WEZf2tKDB4oZvrEmqFkKk7BwILA7gtYBpsTq//D4jD0F0wEB9pyQ1BD5Ba0oYHDI+sbDFhvrHXdDHfgFEIJLi5r8qercNFBgFLC4bo5ERJtamWBDFy73KCEb6M8VpmEt330ygCTK58EIIFkYgF84gtGA9Uyh3m68iVrFbWFbcbqiCYHZ9J1jeRPbL8yswhMiDbhEhdNoSwFbZrLT740ABEqgCkO8J1BLd1VhKKR4sD1yUo0z+FF59Mvg71CFbyEhbHSFBKEIKyoQNgQppq9T0KAqePu0ZFGrXOHdKJqkoTFhYvpDNyuuznrN84thJbsCoO6Cu6Xlvntvy0QYuAExQEYtTUBf3CoCqwgGFZ4u1HJFzDVwEy3cjcpV4QvsPaBC3rCGyCF23o4K3pp2gberGgFEJEHo4nHICtyKH2ZqyxhN05KBBJIQlKh/Oujv/DH32VrlqFdIFC7Fz9Ct4kaqFME0UETLprnN9kfy+kFmtQBB0+5CFu0N9Ij8l/VvJDh2oq3hT6EzjTHKFN7ZjZwoTsAZ4Exsko6Fpa6WC+sduz8jyrLpegTv2h1EBeYpLpm2czQW0KoCcS0bCVXCmuWJDBjN1nQNLdF58SFJ0h7i3pC3oEOKy/FjBklL70XvBEEIWp2yZ04xObzAWDDJG7f+DbqBEA7LyiR95j7MDVdDViz2RE5vWlBMv5e4+VfhP3aXNPhvLSynb9O2x4uFBV+3jqu6d5pCG28/sETByvmu/+IJ0L3wb4rj9DNOLBF6XPIODr4L19U9RRofAG6Nxydi8Bki8BhGJbBAJKzbJxkZSlF9Q2Cu8oKqggB9hBArwLLqEBWEtFowy8XK8bEyw9snT+BeyFk1ZCSrdmgfEwFePTgCjELBEnIbjaDDPJm36rG9pztcEzT8dGk23SBhXBB1H4z+OWze0ooFzz8pDBYFvp9j9tvFByf9y4EFdVnz026CGR5qMr7fxMHN8UUdlyJAzlTBDRC28k+L4FB8078ljyD91tUj1ocnTs8vdEf7znbzm+GIjEZnoZE5rnLL700Xc7yHfz05nWxy03vBB9YGHYOWxgMQGBCR24CVYNE1hpfKxN0zKnfJDmmMgMmBWqNbjfSyFCBWSCGCgR8yFXiHyEj+VtD1FB3FpC1zI0kFbzifiKTLm9yq5zFmur+q8FHqjoOBWsBPiDbnCC2ErunV6cJ6TygXFYHYp7MKN9RUlSIS8/xBAGYLzeqUnBF4QbsTuUkUqGs6CaiDWKWjQK9EJkjpkTmNCPYXL"; +// @TODO: Load lazily +const wordlist = { + zh_cn: null, + zh_tw: null +}; +const Checks = { + zh_cn: "0x17bcc4d8547e5a7135e365d1ab443aaae95e76d8230c2782c67305d4f21497a1", + zh_tw: "0x51e720e90c7b87bec1d70eb6e74a21a449bd3ec9c020b01d3a40ed991b60ce5d" +}; +const codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +const style = "~!@#$%^&*_-=[]{}|;:,.()<>?"; +function loadWords(lang) { + if (wordlist[lang.locale] !== null) { + return; + } + wordlist[lang.locale] = []; + let deltaOffset = 0; + for (let i = 0; i < 2048; i++) { + const s = style.indexOf(data[i * 3]); + const bytes = [ + 228 + (s >> 2), + 128 + codes.indexOf(data[i * 3 + 1]), + 128 + codes.indexOf(data[i * 3 + 2]), + ]; + if (lang.locale === "zh_tw") { + const common = s % 4; + for (let i = common; i < 3; i++) { + bytes[i] = codes.indexOf(deltaData[deltaOffset++]) + ((i == 0) ? 228 : 128); + } + } + wordlist[lang.locale].push(Object(_ethersproject_strings__WEBPACK_IMPORTED_MODULE_0__["toUtf8String"])(bytes)); + } + // Verify the computed list matches the official list + /* istanbul ignore if */ + if (_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].check(lang) !== Checks[lang.locale]) { + wordlist[lang.locale] = null; + throw new Error("BIP39 Wordlist for " + lang.locale + " (Chinese) FAILED"); + } +} +class LangZh extends _wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"] { + constructor(country) { + super("zh_" + country); + } + getWord(index) { + loadWords(this); + return wordlist[this.locale][index]; + } + getWordIndex(word) { + loadWords(this); + return wordlist[this.locale].indexOf(word); + } + split(mnemonic) { + mnemonic = mnemonic.replace(/(?:\u3000| )+/g, ""); + return mnemonic.split(""); + } +} +const langZhCn = new LangZh("cn"); +_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].register(langZhCn); +_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].register(langZhCn, "zh"); +const langZhTw = new LangZh("tw"); +_wordlist__WEBPACK_IMPORTED_MODULE_1__["Wordlist"].register(langZhTw); + +//# sourceMappingURL=lang-zh.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/wordlist.js ***! + \*******************************************************************/ +/*! exports provided: logger, Wordlist */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Wordlist", function() { return Wordlist; }); +/* harmony import */ var _ethersproject_hash__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/hash */ "./node_modules/@ethersproject/hash/lib.esm/index.js"); +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_version */ "./node_modules/@ethersproject/wordlists/lib.esm/_version.js"); + +// This gets overridden by rollup +const exportWordlist = false; + + + + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_2__["Logger"](_version__WEBPACK_IMPORTED_MODULE_3__["version"]); +class Wordlist { + constructor(locale) { + logger.checkAbstract(new.target, Wordlist); + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(this, "locale", locale); + } + // Subclasses may override this + split(mnemonic) { + return mnemonic.toLowerCase().split(/ +/g); + } + // Subclasses may override this + join(words) { + return words.join(" "); + } + static check(wordlist) { + const words = []; + for (let i = 0; i < 2048; i++) { + const word = wordlist.getWord(i); + /* istanbul ignore if */ + if (i !== wordlist.getWordIndex(word)) { + return "0x"; + } + words.push(word); + } + return Object(_ethersproject_hash__WEBPACK_IMPORTED_MODULE_0__["id"])(words.join("\n") + "\n"); + } + static register(lang, name) { + if (!name) { + name = lang.locale; + } + /* istanbul ignore if */ + if (exportWordlist) { + try { + const anyGlobal = window; + if (anyGlobal._ethers && anyGlobal._ethers.wordlists) { + if (!anyGlobal._ethers.wordlists[name]) { + Object(_ethersproject_properties__WEBPACK_IMPORTED_MODULE_1__["defineReadOnly"])(anyGlobal._ethers.wordlists, name, lang); + } + } + } + catch (error) { } + } + } +} +//# sourceMappingURL=wordlist.js.map + +/***/ }), + +/***/ "./node_modules/@ethersproject/wordlists/lib.esm/wordlists.js": +/*!********************************************************************!*\ + !*** ./node_modules/@ethersproject/wordlists/lib.esm/wordlists.js ***! + \********************************************************************/ +/*! exports provided: wordlists */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wordlists", function() { return wordlists; }); +/* harmony import */ var _lang_cz__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lang-cz */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-cz.js"); +/* harmony import */ var _lang_en__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lang-en */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-en.js"); +/* harmony import */ var _lang_es__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lang-es */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-es.js"); +/* harmony import */ var _lang_fr__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lang-fr */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-fr.js"); +/* harmony import */ var _lang_ja__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lang-ja */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-ja.js"); +/* harmony import */ var _lang_ko__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lang-ko */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-ko.js"); +/* harmony import */ var _lang_it__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lang-it */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-it.js"); +/* harmony import */ var _lang_zh__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./lang-zh */ "./node_modules/@ethersproject/wordlists/lib.esm/lang-zh.js"); + + + + + + + + +const wordlists = { + cz: _lang_cz__WEBPACK_IMPORTED_MODULE_0__["langCz"], + en: _lang_en__WEBPACK_IMPORTED_MODULE_1__["langEn"], + es: _lang_es__WEBPACK_IMPORTED_MODULE_2__["langEs"], + fr: _lang_fr__WEBPACK_IMPORTED_MODULE_3__["langFr"], + it: _lang_it__WEBPACK_IMPORTED_MODULE_6__["langIt"], + ja: _lang_ja__WEBPACK_IMPORTED_MODULE_4__["langJa"], + ko: _lang_ko__WEBPACK_IMPORTED_MODULE_5__["langKo"], + zh: _lang_zh__WEBPACK_IMPORTED_MODULE_7__["langZhCn"], + zh_cn: _lang_zh__WEBPACK_IMPORTED_MODULE_7__["langZhCn"], + zh_tw: _lang_zh__WEBPACK_IMPORTED_MODULE_7__["langZhTw"] +}; +//# sourceMappingURL=wordlists.js.map + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-event-listener/dist/es/EventListener.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-event-listener/dist/es/EventListener.js ***! + \****************************************************************************************/ +/*! exports provided: EventListener */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EventListener", function() { return EventListener; }); +/* harmony import */ var _useEventListener__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./useEventListener */ "./node_modules/@fluentui/react-component-event-listener/dist/es/useEventListener.js"); + +var EventListener = /*#__PURE__*/function () { + function EventListener(props) { + Object(_useEventListener__WEBPACK_IMPORTED_MODULE_0__["useEventListener"])(props); + return null; + } + + EventListener.defaultProps = { + capture: false + }; + return EventListener; +}(); +//# sourceMappingURL=EventListener.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-event-listener/dist/es/index.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-event-listener/dist/es/index.js ***! + \********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "documentRef", function() { return documentRef; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowRef", function() { return windowRef; }); +/* harmony import */ var _EventListener__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./EventListener */ "./node_modules/@fluentui/react-component-event-listener/dist/es/EventListener.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EventListener", function() { return _EventListener__WEBPACK_IMPORTED_MODULE_0__["EventListener"]; }); + +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types */ "./node_modules/@fluentui/react-component-event-listener/dist/es/types.js"); +/* harmony import */ var _types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _types__WEBPACK_IMPORTED_MODULE_1__) if(["default","documentRef","windowRef","EventListener","useEventListener"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _types__WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__)); +/* harmony import */ var _useEventListener__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./useEventListener */ "./node_modules/@fluentui/react-component-event-listener/dist/es/useEventListener.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useEventListener", function() { return _useEventListener__WEBPACK_IMPORTED_MODULE_2__["useEventListener"]; }); + +var documentRef = { + current: typeof document === 'undefined' ? null : document +}; +var windowRef = { + current: typeof window === 'undefined' ? null : window +}; + + + +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-event-listener/dist/es/types.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-event-listener/dist/es/types.js ***! + \********************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + + +//# sourceMappingURL=types.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-event-listener/dist/es/useEventListener.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-event-listener/dist/es/useEventListener.js ***! + \*******************************************************************************************/ +/*! exports provided: useEventListener */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useEventListener", function() { return useEventListener; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + + +var isActionSupported = function isActionSupported(element, method) { + return element ? !!element[method] : false; +}; + +var useEventListener = function useEventListener(options) { + var capture = options.capture, + listener = options.listener, + type = options.type, + target = options.target, + targetRef = options.targetRef; + var latestListener = react__WEBPACK_IMPORTED_MODULE_0__["useRef"](listener); + latestListener.current = listener; + var eventHandler = react__WEBPACK_IMPORTED_MODULE_0__["useCallback"](function (event) { + return latestListener.current(event); + }, []); + + if (true) { + // This is fine to violate there conditional rule as environment variables will never change during component + // lifecycle + // eslint-disable-next-line react-hooks/rules-of-hooks + react__WEBPACK_IMPORTED_MODULE_0__["useEffect"](function () { + if (typeof target !== 'undefined' && typeof targetRef !== 'undefined') { + throw new Error('`target` and `targetRef` props are mutually exclusive, please use one of them.'); + } + + if (typeof target === 'undefined' && typeof targetRef === 'undefined') { + throw new Error("`target` and `targetRef` props are `undefined`, it' required to use one of them."); + } + }, [target, targetRef]); + } + + react__WEBPACK_IMPORTED_MODULE_0__["useEffect"](function () { + var element = typeof targetRef === 'undefined' ? target : targetRef.current; // Store the current event to avoid triggering handlers immediately + // Note this depends on a deprecated but extremely well supported quirk of the web platform + // https://github.com/facebook/react/issues/20074 + + var currentEvent = window.event; + + var conditionalHandler = function conditionalHandler(event) { + // Skip if this event is the same as the one running when we added the handlers + if (event === currentEvent) { + currentEvent = undefined; + return; + } + + eventHandler(event); + }; + + if (isActionSupported(element, 'addEventListener')) { + element.addEventListener(type, conditionalHandler, capture); + } else if (true) { + throw new Error('@fluentui/react-component-event-listener: Passed `element` is not valid or does not support `addEventListener()` method.'); + } + + return function () { + if (isActionSupported(element, 'removeEventListener')) { + element.removeEventListener(type, conditionalHandler, capture); + } else if (true) { + throw new Error('@fluentui/react-component-event-listener: Passed `element` is not valid or does not support `removeEventListener()` method.'); + } + }; + }, [capture, eventHandler, target, targetRef, type]); +}; +//# sourceMappingURL=useEventListener.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-ref/dist/es/Ref.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-ref/dist/es/Ref.js ***! + \*******************************************************************/ +/*! exports provided: Ref */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Ref", function() { return Ref; }); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); +/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _RefFindNode__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RefFindNode */ "./node_modules/@fluentui/react-component-ref/dist/es/RefFindNode.js"); +/* harmony import */ var _RefForward__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RefForward */ "./node_modules/@fluentui/react-component-ref/dist/es/RefForward.js"); + + + + + +var Ref = function Ref(props) { + var children = props.children, + innerRef = props.innerRef, + rest = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(props, ["children", "innerRef"]); + + var child = react__WEBPACK_IMPORTED_MODULE_1__["Children"].only(children); + var ElementType = react_is__WEBPACK_IMPORTED_MODULE_2__["isForwardRef"](child) ? _RefForward__WEBPACK_IMPORTED_MODULE_4__["RefForward"] : _RefFindNode__WEBPACK_IMPORTED_MODULE_3__["RefFindNode"]; + var childWithProps = child && rest && Object.keys(rest).length > 0 ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__["cloneElement"](child, rest) : child; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__["createElement"](ElementType, { + innerRef: innerRef + }, childWithProps); +}; +//# sourceMappingURL=Ref.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-ref/dist/es/RefFindNode.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-ref/dist/es/RefFindNode.js ***! + \***************************************************************************/ +/*! exports provided: RefFindNode */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RefFindNode", function() { return RefFindNode; }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js"); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./node_modules/@fluentui/react-component-ref/dist/es/utils.js"); + + + + // ======================================================== +// react/packages/react-reconciler/src/ReactFiber.js +// ======================================================== + +/** + * Detects if a passed element is a Fiber object instead of an element. Is needed as `ReactDOM.findDOMNode()` returns + * a Fiber in `react-test-renderer` that can cause issues with tests. Is used only in non-production env. + * + * @see https://github.com/facebook/react/issues/7371#issuecomment-317396864 + * @see https://github.com/Semantic-Org/Semantic-UI-React/issues/4061#issuecomment-694895617 + */ +function isFiberRef(node) { + if (node === null) { + return false; + } + + if (node instanceof Element || node instanceof Text) { + return false; + } + + return !!(node.type && node.tag); +} + +var RefFindNode = /*#__PURE__*/function (_React$Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(RefFindNode, _React$Component); + + function RefFindNode() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this; + _this.prevNode = null; + return _this; + } + + var _proto = RefFindNode.prototype; + + _proto.componentDidMount = function componentDidMount() { + var currentNode = react_dom__WEBPACK_IMPORTED_MODULE_2__["findDOMNode"](this); + + if (true) { + if (isFiberRef(currentNode)) { + currentNode = null; + } + } + + this.prevNode = currentNode; + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["handleRef"])(this.props.innerRef, currentNode); + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps) { + var currentNode = react_dom__WEBPACK_IMPORTED_MODULE_2__["findDOMNode"](this); + + if (true) { + if (isFiberRef(currentNode)) { + currentNode = null; + } + } + + if (this.prevNode !== currentNode) { + this.prevNode = currentNode; + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["handleRef"])(this.props.innerRef, currentNode); + } + + if (prevProps.innerRef !== this.props.innerRef) { + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["handleRef"])(this.props.innerRef, currentNode); + } + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["handleRef"])(this.props.innerRef, null); + delete this.prevNode; + }; + + _proto.render = function render() { + var children = this.props.children; + return children; + }; + + return RefFindNode; +}(react__WEBPACK_IMPORTED_MODULE_1__["Component"]); +//# sourceMappingURL=RefFindNode.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-ref/dist/es/RefForward.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-ref/dist/es/RefForward.js ***! + \**************************************************************************/ +/*! exports provided: RefForward */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RefForward", function() { return RefForward; }); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./node_modules/@fluentui/react-component-ref/dist/es/utils.js"); + + + +var RefForward = /*#__PURE__*/function (_React$Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(RefForward, _React$Component); + + function RefForward() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this; + _this.currentNode = null; + + _this.handleRefOverride = function (node) { + var _this$props = _this.props, + children = _this$props.children, + innerRef = _this$props.innerRef; + Object(_utils__WEBPACK_IMPORTED_MODULE_2__["handleRef"])(children.ref, node); + Object(_utils__WEBPACK_IMPORTED_MODULE_2__["handleRef"])(innerRef, node); + _this.currentNode = node; + }; + + return _this; + } + + var _proto = RefForward.prototype; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps) { + if (prevProps.innerRef !== this.props.innerRef) { + Object(_utils__WEBPACK_IMPORTED_MODULE_2__["handleRef"])(this.props.innerRef, this.currentNode); + } + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + delete this.currentNode; + }; + + _proto.render = function render() { + var children = this.props.children; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__["cloneElement"](children, { + ref: this.handleRefOverride + }); + }; + + return RefForward; +}(react__WEBPACK_IMPORTED_MODULE_1__["Component"]); +//# sourceMappingURL=RefForward.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-ref/dist/es/index.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-ref/dist/es/index.js ***! + \*********************************************************************/ +/*! exports provided: Ref, RefFindNode, RefForward, handleRef, isRefObject */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Ref__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Ref */ "./node_modules/@fluentui/react-component-ref/dist/es/Ref.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Ref", function() { return _Ref__WEBPACK_IMPORTED_MODULE_0__["Ref"]; }); + +/* harmony import */ var _RefFindNode__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RefFindNode */ "./node_modules/@fluentui/react-component-ref/dist/es/RefFindNode.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RefFindNode", function() { return _RefFindNode__WEBPACK_IMPORTED_MODULE_1__["RefFindNode"]; }); + +/* harmony import */ var _RefForward__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./RefForward */ "./node_modules/@fluentui/react-component-ref/dist/es/RefForward.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RefForward", function() { return _RefForward__WEBPACK_IMPORTED_MODULE_2__["RefForward"]; }); + +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./node_modules/@fluentui/react-component-ref/dist/es/utils.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "handleRef", function() { return _utils__WEBPACK_IMPORTED_MODULE_3__["handleRef"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isRefObject", function() { return _utils__WEBPACK_IMPORTED_MODULE_3__["isRefObject"]; }); + + + + + +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ "./node_modules/@fluentui/react-component-ref/dist/es/utils.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@fluentui/react-component-ref/dist/es/utils.js ***! + \*********************************************************************/ +/*! exports provided: handleRef, isRefObject */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "handleRef", function() { return handleRef; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRefObject", function() { return isRefObject; }); +/** + * The function that correctly handles passing refs. + * + * @param ref - An ref object or function + * @param node - A node that should be passed by ref + */ +var handleRef = function handleRef(ref, node) { + if (true) { + if (typeof ref === 'string') { + throw new Error('We do not support refs as string, this is a legacy API and will be likely to be removed in one of the future releases of React.'); + } + } + + if (typeof ref === 'function') { + ref(node); + return; + } + + if (ref !== null && typeof ref === 'object') { + // The `current` property is defined as readonly, however it's a valid way because + // `ref` is a mutable object + ref.current = node; + } +}; +/** Checks that the passed object is a valid React ref object. */ + +var isRefObject = function isRefObject(ref) { + return (// https://github.com/facebook/react/blob/v16.8.2/packages/react-reconciler/src/ReactFiberCommitWork.js#L665 + ref !== null && typeof ref === 'object' && ref.hasOwnProperty('current') + ); +}; +//# sourceMappingURL=utils.js.map + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/createPopper.js": +/*!*********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/createPopper.js ***! + \*********************************************************/ +/*! exports provided: popperGenerator, createPopper, detectOverflow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "popperGenerator", function() { return popperGenerator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPopper", function() { return createPopper; }); +/* harmony import */ var _dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dom-utils/getCompositeRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js"); +/* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); +/* harmony import */ var _dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dom-utils/listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dom-utils/getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils/orderModifiers.js */ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js"); +/* harmony import */ var _utils_debounce_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils/debounce.js */ "./node_modules/@popperjs/core/lib/utils/debounce.js"); +/* harmony import */ var _utils_validateModifiers_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils/validateModifiers.js */ "./node_modules/@popperjs/core/lib/utils/validateModifiers.js"); +/* harmony import */ var _utils_uniqueBy_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/uniqueBy.js */ "./node_modules/@popperjs/core/lib/utils/uniqueBy.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/mergeByName.js */ "./node_modules/@popperjs/core/lib/utils/mergeByName.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "detectOverflow", function() { return _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_11__["default"]; }); + +/* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + + + + + + + + + + + + + +var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; +var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; +var DEFAULT_OPTIONS = { + placement: 'bottom', + modifiers: [], + strategy: 'absolute' +}; + +function areValidElements() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return !args.some(function (element) { + return !(element && typeof element.getBoundingClientRect === 'function'); + }); +} + +function popperGenerator(generatorOptions) { + if (generatorOptions === void 0) { + generatorOptions = {}; + } + + var _generatorOptions = generatorOptions, + _generatorOptions$def = _generatorOptions.defaultModifiers, + defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, + _generatorOptions$def2 = _generatorOptions.defaultOptions, + defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; + return function createPopper(reference, popper, options) { + if (options === void 0) { + options = defaultOptions; + } + + var state = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), + modifiersData: {}, + elements: { + reference: reference, + popper: popper + }, + attributes: {}, + styles: {} + }; + var effectCleanupFns = []; + var isDestroyed = false; + var instance = { + state: state, + setOptions: function setOptions(options) { + cleanupModifierEffects(); + state.options = Object.assign({}, defaultOptions, state.options, options); + state.scrollParents = { + reference: Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_12__["isElement"])(reference) ? Object(_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__["default"])(reference) : reference.contextElement ? Object(_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__["default"])(reference.contextElement) : [], + popper: Object(_dom_utils_listScrollParents_js__WEBPACK_IMPORTED_MODULE_2__["default"])(popper) + }; // Orders the modifiers based on their dependencies and `phase` + // properties + + var orderedModifiers = Object(_utils_orderModifiers_js__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_utils_mergeByName_js__WEBPACK_IMPORTED_MODULE_10__["default"])([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers + + state.orderedModifiers = orderedModifiers.filter(function (m) { + return m.enabled; + }); // Validate the provided modifiers so that the consumer will get warned + // if one of the modifiers is invalid for any reason + + if (true) { + var modifiers = Object(_utils_uniqueBy_js__WEBPACK_IMPORTED_MODULE_8__["default"])([].concat(orderedModifiers, state.options.modifiers), function (_ref) { + var name = _ref.name; + return name; + }); + Object(_utils_validateModifiers_js__WEBPACK_IMPORTED_MODULE_7__["default"])(modifiers); + + if (Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_9__["default"])(state.options.placement) === _enums_js__WEBPACK_IMPORTED_MODULE_13__["auto"]) { + var flipModifier = state.orderedModifiers.find(function (_ref2) { + var name = _ref2.name; + return name === 'flip'; + }); + + if (!flipModifier) { + console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); + } + } + + var _getComputedStyle = Object(_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(popper), + marginTop = _getComputedStyle.marginTop, + marginRight = _getComputedStyle.marginRight, + marginBottom = _getComputedStyle.marginBottom, + marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can + // cause bugs with positioning, so we'll warn the consumer + + + if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { + return parseFloat(margin); + })) { + console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); + } + } + + runModifierEffects(); + return instance.update(); + }, + // Sync update – it will always be executed, even if not necessary. This + // is useful for low frequency updates where sync behavior simplifies the + // logic. + // For high frequency updates (e.g. `resize` and `scroll` events), always + // prefer the async Popper#update method + forceUpdate: function forceUpdate() { + if (isDestroyed) { + return; + } + + var _state$elements = state.elements, + reference = _state$elements.reference, + popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements + // anymore + + if (!areValidElements(reference, popper)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + + return; + } // Store the reference and popper rects to be read by modifiers + + + state.rects = { + reference: Object(_dom_utils_getCompositeRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(reference, Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper), state.options.strategy === 'fixed'), + popper: Object(_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(popper) + }; // Modifiers have the ability to reset the current update cycle. The + // most common use case for this is the `flip` modifier changing the + // placement, which then needs to re-run all the modifiers, because the + // logic was previously ran for the previous placement and is therefore + // stale/incorrect + + state.reset = false; + state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier + // is filled with the initial data specified by the modifier. This means + // it doesn't persist and is fresh on each update. + // To ensure persistent data, use `${name}#persistent` + + state.orderedModifiers.forEach(function (modifier) { + return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); + }); + var __debug_loops__ = 0; + + for (var index = 0; index < state.orderedModifiers.length; index++) { + if (true) { + __debug_loops__ += 1; + + if (__debug_loops__ > 100) { + console.error(INFINITE_LOOP_ERROR); + break; + } + } + + if (state.reset === true) { + state.reset = false; + index = -1; + continue; + } + + var _state$orderedModifie = state.orderedModifiers[index], + fn = _state$orderedModifie.fn, + _state$orderedModifie2 = _state$orderedModifie.options, + _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, + name = _state$orderedModifie.name; + + if (typeof fn === 'function') { + state = fn({ + state: state, + options: _options, + name: name, + instance: instance + }) || state; + } + } + }, + // Async and optimistically optimized update – it will not be executed if + // not necessary (debounced to run at most once-per-tick) + update: Object(_utils_debounce_js__WEBPACK_IMPORTED_MODULE_6__["default"])(function () { + return new Promise(function (resolve) { + instance.forceUpdate(); + resolve(state); + }); + }), + destroy: function destroy() { + cleanupModifierEffects(); + isDestroyed = true; + } + }; + + if (!areValidElements(reference, popper)) { + if (true) { + console.error(INVALID_ELEMENT_ERROR); + } + + return instance; + } + + instance.setOptions(options).then(function (state) { + if (!isDestroyed && options.onFirstUpdate) { + options.onFirstUpdate(state); + } + }); // Modifiers have the ability to execute arbitrary code before the first + // update cycle runs. They will be executed in the same order as the update + // cycle. This is useful when a modifier adds some persistent data that + // other modifiers need to use, but the modifier is run after the dependent + // one. + + function runModifierEffects() { + state.orderedModifiers.forEach(function (_ref3) { + var name = _ref3.name, + _ref3$options = _ref3.options, + options = _ref3$options === void 0 ? {} : _ref3$options, + effect = _ref3.effect; + + if (typeof effect === 'function') { + var cleanupFn = effect({ + state: state, + name: name, + instance: instance, + options: options + }); + + var noopFn = function noopFn() {}; + + effectCleanupFns.push(cleanupFn || noopFn); + } + }); + } + + function cleanupModifierEffects() { + effectCleanupFns.forEach(function (fn) { + return fn(); + }); + effectCleanupFns = []; + } + + return instance; + }; +} +var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/contains.js": +/*!***************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/contains.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 contains; }); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + +function contains(parent, child) { + var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method + + if (parent.contains(child)) { + return true; + } // then fallback to custom implementation with Shadow DOM support + else if (rootNode && Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__["isShadowRoot"])(rootNode)) { + var next = child; + + do { + if (next && parent.isSameNode(next)) { + return true; + } // $FlowFixMe[prop-missing]: need a better way to handle this... + + + next = next.parentNode || next.host; + } while (next); + } // Give up, the result is false + + + return false; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js": +/*!****************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.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 getBoundingClientRect; }); +function getBoundingClientRect(element) { + var rect = element.getBoundingClientRect(); + return { + width: rect.width, + height: rect.height, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + left: rect.left, + x: rect.left, + y: rect.top + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.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 getClippingRect; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _getViewportRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getViewportRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js"); +/* harmony import */ var _getDocumentRect_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getDocumentRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js"); +/* harmony import */ var _listScrollParents_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./listScrollParents.js */ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js"); +/* harmony import */ var _getOffsetParent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); +/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../utils/rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js"); +/* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); + + + + + + + + + + + + + + + +function getInnerBoundingClientRect(element) { + var rect = Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_8__["default"])(element); + rect.top = rect.top + element.clientTop; + rect.left = rect.left + element.clientLeft; + rect.bottom = rect.top + element.clientHeight; + rect.right = rect.left + element.clientWidth; + rect.width = element.clientWidth; + rect.height = element.clientHeight; + rect.x = rect.left; + rect.y = rect.top; + return rect; +} + +function getClientRectFromMixedType(element, clippingParent) { + return clippingParent === _enums_js__WEBPACK_IMPORTED_MODULE_0__["viewport"] ? Object(_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_12__["default"])(Object(_getViewportRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)) : Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isHTMLElement"])(clippingParent) ? getInnerBoundingClientRect(clippingParent) : Object(_utils_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_12__["default"])(Object(_getDocumentRect_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element))); +} // A "clipping parent" is an overflowable container with the characteristic of +// clipping (or hiding) overflowing elements with a position different from +// `initial` + + +function getClippingParents(element) { + var clippingParents = Object(_listScrollParents_js__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_getParentNode_js__WEBPACK_IMPORTED_MODULE_9__["default"])(element)); + var canEscapeClipping = ['absolute', 'fixed'].indexOf(Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element).position) >= 0; + var clipperElement = canEscapeClipping && Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isHTMLElement"])(element) ? Object(_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element) : element; + + if (!Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isElement"])(clipperElement)) { + return []; + } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 + + + return clippingParents.filter(function (clippingParent) { + return Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_7__["isElement"])(clippingParent) && Object(_contains_js__WEBPACK_IMPORTED_MODULE_10__["default"])(clippingParent, clipperElement) && Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_11__["default"])(clippingParent) !== 'body'; + }); +} // Gets the maximum area that the element is visible in due to any number of +// clipping parents + + +function getClippingRect(element, boundary, rootBoundary) { + var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); + var clippingParents = [].concat(mainClippingParents, [rootBoundary]); + var firstClippingParent = clippingParents[0]; + var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { + var rect = getClientRectFromMixedType(element, clippingParent); + accRect.top = Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_13__["max"])(rect.top, accRect.top); + accRect.right = Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_13__["min"])(rect.right, accRect.right); + accRect.bottom = Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_13__["min"])(rect.bottom, accRect.bottom); + accRect.left = Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_13__["max"])(rect.left, accRect.left); + return accRect; + }, getClientRectFromMixedType(element, firstClippingParent)); + clippingRect.width = clippingRect.right - clippingRect.left; + clippingRect.height = clippingRect.bottom - clippingRect.top; + clippingRect.x = clippingRect.left; + clippingRect.y = clippingRect.top; + return clippingRect; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.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 getCompositeRect; }); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _getNodeScroll_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getNodeScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"); + + + + + + + // Returns the composite rect of an element relative to its offsetParent. +// Composite means it takes into account transforms as well as layout. + +function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { + if (isFixed === void 0) { + isFixed = false; + } + + var documentElement = Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(offsetParent); + var rect = Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrVirtualElement); + var isOffsetParentAnElement = Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(offsetParent); + var scroll = { + scrollLeft: 0, + scrollTop: 0 + }; + var offsets = { + x: 0, + y: 0 + }; + + if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { + if (Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 + Object(_isScrollParent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(documentElement)) { + scroll = Object(_getNodeScroll_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent); + } + + if (Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(offsetParent)) { + offsets = Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(offsetParent); + offsets.x += offsetParent.clientLeft; + offsets.y += offsetParent.clientTop; + } else if (documentElement) { + offsets.x = Object(_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_4__["default"])(documentElement); + } + } + + return { + x: rect.left + scroll.scrollLeft - offsets.x, + y: rect.top + scroll.scrollTop - offsets.y, + width: rect.width, + height: rect.height + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.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 getComputedStyle; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +function getComputedStyle(element) { + return Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element).getComputedStyle(element); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js": +/*!*************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.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 getDocumentElement; }); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + +function getDocumentElement(element) { + // $FlowFixMe[incompatible-return]: assume body is always available + return ((Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_0__["isElement"])(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] + element.document) || window.document).documentElement; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.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 getDocumentRect; }); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); +/* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); +/* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); + + + + + // Gets the entire size of the scrollable document area, even extending outside +// of the `<html>` and `<body>` rect bounds if horizontally scrollable + +function getDocumentRect(element) { + var _element$ownerDocumen; + + var html = Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var winScroll = Object(_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element); + var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; + var width = Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_4__["max"])(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); + var height = Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_4__["max"])(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); + var x = -winScroll.scrollLeft + Object(_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element); + var y = -winScroll.scrollTop; + + if (Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(body || html).direction === 'rtl') { + x += Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_4__["max"])(html.clientWidth, body ? body.clientWidth : 0) - width; + } + + return { + width: width, + height: height, + x: x, + y: y + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.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 getHTMLElementScroll; }); +function getHTMLElementScroll(element) { + return { + scrollLeft: element.scrollLeft, + scrollTop: element.scrollTop + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.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 getLayoutRect; }); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); + // Returns the layout rect of an element relative to its offsetParent. Layout +// means it doesn't take into account transforms. + +function getLayoutRect(element) { + var clientRect = Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); // Use the clientRect sizes if it's not been transformed. + // Fixes https://github.com/popperjs/popper-core/issues/1223 + + var width = element.offsetWidth; + var height = element.offsetHeight; + + if (Math.abs(clientRect.width - width) <= 1) { + width = clientRect.width; + } + + if (Math.abs(clientRect.height - height) <= 1) { + height = clientRect.height; + } + + return { + x: element.offsetLeft, + y: element.offsetTop, + width: width, + height: height + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js": +/*!******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.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 getNodeName; }); +function getNodeName(element) { + return element ? (element.nodeName || '').toLowerCase() : null; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.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 getNodeScroll; }); +/* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getHTMLElementScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js"); + + + + +function getNodeScroll(node) { + if (node === Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node) || !Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_2__["isHTMLElement"])(node)) { + return Object(_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node); + } else { + return Object(_getHTMLElementScroll_js__WEBPACK_IMPORTED_MODULE_3__["default"])(node); + } +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.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 getOffsetParent; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _isTableElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isTableElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js"); +/* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); + + + + + + + +function getTrueOffsetParent(element) { + if (!Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(element) || // https://github.com/popperjs/popper-core/issues/837 + Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element).position === 'fixed') { + return null; + } + + return element.offsetParent; +} // `.offsetParent` reports `null` for fixed elements, while absolute elements +// return the containing block + + +function getContainingBlock(element) { + var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; + var isIE = navigator.userAgent.indexOf('Trident') !== -1; + + if (isIE && Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(element)) { + // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport + var elementCss = Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element); + + if (elementCss.position === 'fixed') { + return null; + } + } + + var currentNode = Object(_getParentNode_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element); + + while (Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(currentNode) && ['html', 'body'].indexOf(Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(currentNode)) < 0) { + var css = Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentNode); // This is non-exhaustive but covers the most common CSS properties that + // create a containing block. + // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block + + if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { + return currentNode; + } else { + currentNode = currentNode.parentNode; + } + } + + return null; +} // Gets the closest ancestor positioned element. Handles some edge cases, +// such as table ancestors and cross browser bugs. + + +function getOffsetParent(element) { + var window = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var offsetParent = getTrueOffsetParent(element); + + while (offsetParent && Object(_isTableElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent) && Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent).position === 'static') { + offsetParent = getTrueOffsetParent(offsetParent); + } + + if (offsetParent && (Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent) === 'html' || Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_1__["default"])(offsetParent) === 'body' && Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(offsetParent).position === 'static')) { + return window; + } + + return offsetParent || getContainingBlock(element) || window; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.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 getParentNode; }); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + + + +function getParentNode(element) { + if (Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element) === 'html') { + return element; + } + + return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle + // $FlowFixMe[incompatible-return] + // $FlowFixMe[prop-missing] + element.assignedSlot || // step into the shadow DOM of the parent of a slotted node + element.parentNode || ( // DOM Element detected + Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_2__["isShadowRoot"])(element) ? element.host : null) || // ShadowRoot detected + // $FlowFixMe[incompatible-call]: HTMLElement is a Node + Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element) // fallback + + ); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.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 getScrollParent; }); +/* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); +/* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _instanceOf_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + + + + +function getScrollParent(node) { + if (['html', 'body', '#document'].indexOf(Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(node)) >= 0) { + // $FlowFixMe[incompatible-return]: assume body is always available + return node.ownerDocument.body; + } + + if (Object(_instanceOf_js__WEBPACK_IMPORTED_MODULE_3__["isHTMLElement"])(node) && Object(_isScrollParent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node)) { + return node; + } + + return getScrollParent(Object(_getParentNode_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node)); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.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 getViewportRect; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScrollBarX.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js"); + + + +function getViewportRect(element) { + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var html = Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element); + var visualViewport = win.visualViewport; + var width = html.clientWidth; + var height = html.clientHeight; + var x = 0; + var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper + // can be obscured underneath it. + // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even + // if it isn't open, so if this isn't available, the popper will be detected + // to overflow the bottom of the screen too early. + + if (visualViewport) { + width = visualViewport.width; + height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) + // In Chrome, it returns a value very close to 0 (+/-) but contains rounding + // errors due to floating point numbers, so we need to check precision. + // Safari returns a number <= 0, usually < -1 when pinch-zoomed + // Feature detection fails in mobile emulation mode in Chrome. + // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < + // 0.001 + // Fallback here: "Not Safari" userAgent + + if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + x = visualViewport.offsetLeft; + y = visualViewport.offsetTop; + } + } + + return { + width: width, + height: height, + x: x + Object(_getWindowScrollBarX_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element), + y: y + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js": +/*!****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindow.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 getWindow; }); +function getWindow(node) { + if (node == null) { + return window; + } + + if (node.toString() !== '[object Window]') { + var ownerDocument = node.ownerDocument; + return ownerDocument ? ownerDocument.defaultView || window : window; + } + + return node; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.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 getWindowScroll; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + +function getWindowScroll(node) { + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node); + var scrollLeft = win.pageXOffset; + var scrollTop = win.pageYOffset; + return { + scrollLeft: scrollLeft, + scrollTop: scrollTop + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js": +/*!**************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.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 getWindowScrollBarX; }); +/* harmony import */ var _getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindowScroll.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js"); + + + +function getWindowScrollBarX(element) { + // If <html> has a CSS width greater than the viewport, then this will be + // incorrect for RTL. + // Popper 1 is broken in this case and never had a bug report so let's assume + // it's not an issue. I don't think anyone ever specifies width on <html> + // anyway. + // Browsers where the left scrollbar doesn't cause an issue report `0` for + // this (e.g. Edge 2019, IE11, Safari) + return Object(_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element)).left + Object(_getWindowScroll_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element).scrollLeft; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js ***! + \*****************************************************************/ +/*! exports provided: isElement, isHTMLElement, isShadowRoot */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isElement", function() { return isElement; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isHTMLElement", function() { return isHTMLElement; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isShadowRoot", function() { return isShadowRoot; }); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + + +function isElement(node) { + var OwnElement = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).Element; + return node instanceof OwnElement || node instanceof Element; +} + +function isHTMLElement(node) { + var OwnElement = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).HTMLElement; + return node instanceof OwnElement || node instanceof HTMLElement; +} + +function isShadowRoot(node) { + // IE 11 has no ShadowRoot + if (typeof ShadowRoot === 'undefined') { + return false; + } + + var OwnElement = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(node).ShadowRoot; + return node instanceof OwnElement || node instanceof ShadowRoot; +} + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.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 isScrollParent; }); +/* harmony import */ var _getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); + +function isScrollParent(element) { + // Firefox wants us to check `-x` and `-y` variations as well + var _getComputedStyle = Object(_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element), + overflow = _getComputedStyle.overflow, + overflowX = _getComputedStyle.overflowX, + overflowY = _getComputedStyle.overflowY; + + return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.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 isTableElement; }); +/* harmony import */ var _getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); + +function isTableElement(element) { + return ['table', 'td', 'th'].indexOf(Object(_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) >= 0; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js": +/*!************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.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 listScrollParents; }); +/* harmony import */ var _getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js"); +/* harmony import */ var _getParentNode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getParentNode.js */ "./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js"); +/* harmony import */ var _getWindow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _isScrollParent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isScrollParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js"); + + + + +/* +given a DOM element, return the list of all scroll parents, up the list of ancesors +until we get to the top window object. This list is what we attach scroll listeners +to, because if any of these parent elements scroll, we'll need to re-calculate the +reference element's position. +*/ + +function listScrollParents(element, list) { + var _element$ownerDocumen; + + if (list === void 0) { + list = []; + } + + var scrollParent = Object(_getScrollParent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element); + var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); + var win = Object(_getWindow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(scrollParent); + var target = isBody ? [win].concat(win.visualViewport || [], Object(_isScrollParent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(scrollParent) ? scrollParent : []) : scrollParent; + var updatedList = list.concat(target); + return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here + updatedList.concat(listScrollParents(Object(_getParentNode_js__WEBPACK_IMPORTED_MODULE_1__["default"])(target))); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/enums.js": +/*!**************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/enums.js ***! + \**************************************************/ +/*! exports provided: top, bottom, right, left, auto, basePlacements, start, end, clippingParents, viewport, popper, reference, variationPlacements, placements, beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite, modifierPhases */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "top", function() { return top; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bottom", function() { return bottom; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "right", function() { return right; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "left", function() { return left; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auto", function() { return auto; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basePlacements", function() { return basePlacements; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "start", function() { return start; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "end", function() { return end; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clippingParents", function() { return clippingParents; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "viewport", function() { return viewport; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "popper", function() { return popper; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reference", function() { return reference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "variationPlacements", function() { return variationPlacements; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "placements", function() { return placements; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beforeRead", function() { return beforeRead; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "read", function() { return read; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "afterRead", function() { return afterRead; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beforeMain", function() { return beforeMain; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "main", function() { return main; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "afterMain", function() { return afterMain; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beforeWrite", function() { return beforeWrite; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "write", function() { return write; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "afterWrite", function() { return afterWrite; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modifierPhases", function() { return modifierPhases; }); +var top = 'top'; +var bottom = 'bottom'; +var right = 'right'; +var left = 'left'; +var auto = 'auto'; +var basePlacements = [top, bottom, right, left]; +var start = 'start'; +var end = 'end'; +var clippingParents = 'clippingParents'; +var viewport = 'viewport'; +var popper = 'popper'; +var reference = 'reference'; +var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { + return acc.concat([placement + "-" + start, placement + "-" + end]); +}, []); +var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { + return acc.concat([placement, placement + "-" + start, placement + "-" + end]); +}, []); // modifiers that need to read the DOM + +var beforeRead = 'beforeRead'; +var read = 'read'; +var afterRead = 'afterRead'; // pure-logic modifiers + +var beforeMain = 'beforeMain'; +var main = 'main'; +var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) + +var beforeWrite = 'beforeWrite'; +var write = 'write'; +var afterWrite = 'afterWrite'; +var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/index.js": +/*!**************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/index.js ***! + \**************************************************/ +/*! exports provided: top, bottom, right, left, auto, basePlacements, start, end, clippingParents, viewport, popper, reference, variationPlacements, placements, beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite, modifierPhases, applyStyles, arrow, computeStyles, eventListeners, flip, hide, offset, popperOffsets, preventOverflow, popperGenerator, detectOverflow, createPopperBase, createPopper, createPopperLite */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "top", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bottom", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "right", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "left", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auto", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["auto"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "basePlacements", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["basePlacements"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "start", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["start"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "end", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["end"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clippingParents", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["clippingParents"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "viewport", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["viewport"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popper", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["popper"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reference", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["reference"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variationPlacements", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["variationPlacements"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "placements", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["placements"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "beforeRead", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["beforeRead"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "read", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["read"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "afterRead", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["afterRead"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "beforeMain", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["beforeMain"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "main", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["main"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "afterMain", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["afterMain"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "beforeWrite", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["beforeWrite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "write", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["write"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "afterWrite", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["afterWrite"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "modifierPhases", function() { return _enums_js__WEBPACK_IMPORTED_MODULE_0__["modifierPhases"]; }); + +/* harmony import */ var _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/index.js */ "./node_modules/@popperjs/core/lib/modifiers/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "applyStyles", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["applyStyles"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arrow", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["arrow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeStyles", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["computeStyles"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventListeners", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["eventListeners"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flip", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["flip"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hide", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["hide"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "offset", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["offset"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperOffsets", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["popperOffsets"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "preventOverflow", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_1__["preventOverflow"]; }); + +/* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperGenerator", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_2__["popperGenerator"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "detectOverflow", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_2__["detectOverflow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createPopperBase", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_2__["createPopper"]; }); + +/* harmony import */ var _popper_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./popper.js */ "./node_modules/@popperjs/core/lib/popper.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createPopper", function() { return _popper_js__WEBPACK_IMPORTED_MODULE_3__["createPopper"]; }); + +/* harmony import */ var _popper_lite_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./popper-lite.js */ "./node_modules/@popperjs/core/lib/popper-lite.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createPopperLite", function() { return _popper_lite_js__WEBPACK_IMPORTED_MODULE_4__["createPopper"]; }); + + + // eslint-disable-next-line import/no-unused-modules + + // eslint-disable-next-line import/no-unused-modules + + // eslint-disable-next-line import/no-unused-modules + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js": +/*!******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/applyStyles.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getNodeName.js */ "./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js"); +/* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + + // This modifier takes the styles prepared by the `computeStyles` modifier +// and applies them to the HTMLElements such as popper and arrow + +function applyStyles(_ref) { + var state = _ref.state; + Object.keys(state.elements).forEach(function (name) { + var style = state.styles[name] || {}; + var attributes = state.attributes[name] || {}; + var element = state.elements[name]; // arrow is optional + virtual elements + + if (!Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__["isHTMLElement"])(element) || !Object(_dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) { + return; + } // Flow doesn't support to extend this property, but it's the most + // effective way to apply styles to an HTMLElement + // $FlowFixMe[cannot-write] + + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (name) { + var value = attributes[name]; + + if (value === false) { + element.removeAttribute(name); + } else { + element.setAttribute(name, value === true ? '' : value); + } + }); + }); +} + +function effect(_ref2) { + var state = _ref2.state; + var initialStyles = { + popper: { + position: state.options.strategy, + left: '0', + top: '0', + margin: '0' + }, + arrow: { + position: 'absolute' + }, + reference: {} + }; + Object.assign(state.elements.popper.style, initialStyles.popper); + state.styles = initialStyles; + + if (state.elements.arrow) { + Object.assign(state.elements.arrow.style, initialStyles.arrow); + } + + return function () { + Object.keys(state.elements).forEach(function (name) { + var element = state.elements[name]; + var attributes = state.attributes[name] || {}; + var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them + + var style = styleProperties.reduce(function (style, property) { + style[property] = ''; + return style; + }, {}); // arrow is optional + virtual elements + + if (!Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_1__["isHTMLElement"])(element) || !Object(_dom_utils_getNodeName_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element)) { + return; + } + + Object.assign(element.style, style); + Object.keys(attributes).forEach(function (attribute) { + element.removeAttribute(attribute); + }); + }); + }; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'applyStyles', + enabled: true, + phase: 'write', + fn: applyStyles, + effect: effect, + requires: ['computeStyles'] +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/arrow.js": +/*!************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/arrow.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); +/* harmony import */ var _dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/contains.js */ "./node_modules/@popperjs/core/lib/dom-utils/contains.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); +/* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js"); +/* harmony import */ var _utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"); +/* harmony import */ var _utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); + + + + + + + + + + // eslint-disable-next-line import/no-unused-modules + +var toPaddingObject = function toPaddingObject(padding, state) { + padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { + placement: state.placement + })) : padding; + return Object(_utils_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_6__["default"])(typeof padding !== 'number' ? padding : Object(_utils_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_7__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_8__["basePlacements"])); +}; + +function arrow(_ref) { + var _state$modifiersData$; + + var state = _ref.state, + name = _ref.name, + options = _ref.options; + var arrowElement = state.elements.arrow; + var popperOffsets = state.modifiersData.popperOffsets; + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state.placement); + var axis = Object(_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(basePlacement); + var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_8__["left"], _enums_js__WEBPACK_IMPORTED_MODULE_8__["right"]].indexOf(basePlacement) >= 0; + var len = isVertical ? 'height' : 'width'; + + if (!arrowElement || !popperOffsets) { + return; + } + + var paddingObject = toPaddingObject(options.padding, state); + var arrowRect = Object(_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(arrowElement); + var minProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_8__["top"] : _enums_js__WEBPACK_IMPORTED_MODULE_8__["left"]; + var maxProp = axis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_8__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_8__["right"]; + var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; + var startDiff = popperOffsets[axis] - state.rects.reference[axis]; + var arrowOffsetParent = Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(arrowElement); + var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; + var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is + // outside of the popper bounds + + var min = paddingObject[minProp]; + var max = clientSize - arrowRect[len] - paddingObject[maxProp]; + var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; + var offset = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_5__["default"])(min, center, max); // Prevents breaking syntax highlighting... + + var axisProp = axis; + state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); +} + +function effect(_ref2) { + var state = _ref2.state, + options = _ref2.options; + var _options$element = options.element, + arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; + + if (arrowElement == null) { + return; + } // CSS selector + + + if (typeof arrowElement === 'string') { + arrowElement = state.elements.popper.querySelector(arrowElement); + + if (!arrowElement) { + return; + } + } + + if (true) { + if (!Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_9__["isHTMLElement"])(arrowElement)) { + console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' ')); + } + } + + if (!Object(_dom_utils_contains_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state.elements.popper, arrowElement)) { + if (true) { + console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); + } + + return; + } + + state.elements.arrow = arrowElement; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'arrow', + enabled: true, + phase: 'main', + fn: arrow, + effect: effect, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'] +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js ***! + \********************************************************************/ +/*! exports provided: mapToStyles, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapToStyles", function() { return mapToStyles; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); +/* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../dom-utils/getComputedStyle.js */ "./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); + + + + + + + // eslint-disable-next-line import/no-unused-modules + +var unsetSides = { + top: 'auto', + right: 'auto', + bottom: 'auto', + left: 'auto' +}; // Round the offsets to the nearest suitable subpixel based on the DPR. +// Zooming can change the DPR, but it seems to report a value that will +// cleanly divide the values into the appropriate subpixels. + +function roundOffsetsByDPR(_ref) { + var x = _ref.x, + y = _ref.y; + var win = window; + var dpr = win.devicePixelRatio || 1; + return { + x: Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_6__["round"])(Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_6__["round"])(x * dpr) / dpr) || 0, + y: Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_6__["round"])(Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_6__["round"])(y * dpr) / dpr) || 0 + }; +} + +function mapToStyles(_ref2) { + var _Object$assign2; + + var popper = _ref2.popper, + popperRect = _ref2.popperRect, + placement = _ref2.placement, + offsets = _ref2.offsets, + position = _ref2.position, + gpuAcceleration = _ref2.gpuAcceleration, + adaptive = _ref2.adaptive, + roundOffsets = _ref2.roundOffsets; + + var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets, + _ref3$x = _ref3.x, + x = _ref3$x === void 0 ? 0 : _ref3$x, + _ref3$y = _ref3.y, + y = _ref3$y === void 0 ? 0 : _ref3$y; + + var hasX = offsets.hasOwnProperty('x'); + var hasY = offsets.hasOwnProperty('y'); + var sideX = _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; + var sideY = _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"]; + var win = window; + + if (adaptive) { + var offsetParent = Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(popper); + var heightProp = 'clientHeight'; + var widthProp = 'clientWidth'; + + if (offsetParent === Object(_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(popper)) { + offsetParent = Object(_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(popper); + + if (Object(_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(offsetParent).position !== 'static') { + heightProp = 'scrollHeight'; + widthProp = 'scrollWidth'; + } + } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it + + + offsetParent = offsetParent; + + if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"]) { + sideY = _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"]; // $FlowFixMe[prop-missing] + + y -= offsetParent[heightProp] - popperRect.height; + y *= gpuAcceleration ? 1 : -1; + } + + if (placement === _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]) { + sideX = _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; // $FlowFixMe[prop-missing] + + x -= offsetParent[widthProp] - popperRect.width; + x *= gpuAcceleration ? 1 : -1; + } + } + + var commonStyles = Object.assign({ + position: position + }, adaptive && unsetSides); + + if (gpuAcceleration) { + var _Object$assign; + + return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); + } + + return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); +} + +function computeStyles(_ref4) { + var state = _ref4.state, + options = _ref4.options; + var _options$gpuAccelerat = options.gpuAcceleration, + gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, + _options$adaptive = options.adaptive, + adaptive = _options$adaptive === void 0 ? true : _options$adaptive, + _options$roundOffsets = options.roundOffsets, + roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; + + if (true) { + var transitionProperty = Object(_dom_utils_getComputedStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"])(state.elements.popper).transitionProperty || ''; + + if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { + return transitionProperty.indexOf(property) >= 0; + })) { + console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); + } + } + + var commonStyles = { + placement: Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(state.placement), + popper: state.elements.popper, + popperRect: state.rects.popper, + gpuAcceleration: gpuAcceleration + }; + + if (state.modifiersData.popperOffsets != null) { + state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.popperOffsets, + position: state.options.strategy, + adaptive: adaptive, + roundOffsets: roundOffsets + }))); + } + + if (state.modifiersData.arrow != null) { + state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { + offsets: state.modifiersData.arrow, + position: 'absolute', + adaptive: false, + roundOffsets: roundOffsets + }))); + } + + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-placement': state.placement + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'computeStyles', + enabled: true, + phase: 'beforeWrite', + fn: computeStyles, + data: {} +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getWindow.js */ "./node_modules/@popperjs/core/lib/dom-utils/getWindow.js"); + // eslint-disable-next-line import/no-unused-modules + +var passive = { + passive: true +}; + +function effect(_ref) { + var state = _ref.state, + instance = _ref.instance, + options = _ref.options; + var _options$scroll = options.scroll, + scroll = _options$scroll === void 0 ? true : _options$scroll, + _options$resize = options.resize, + resize = _options$resize === void 0 ? true : _options$resize; + var window = Object(_dom_utils_getWindow_js__WEBPACK_IMPORTED_MODULE_0__["default"])(state.elements.popper); + var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); + + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.addEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.addEventListener('resize', instance.update, passive); + } + + return function () { + if (scroll) { + scrollParents.forEach(function (scrollParent) { + scrollParent.removeEventListener('scroll', instance.update, passive); + }); + } + + if (resize) { + window.removeEventListener('resize', instance.update, passive); + } + }; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'eventListeners', + enabled: true, + phase: 'write', + fn: function fn() {}, + effect: effect, + data: {} +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/flip.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/flip.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getOppositePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getOppositeVariationPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony import */ var _utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/computeAutoPlacement.js */ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); + + + + + + + // eslint-disable-next-line import/no-unused-modules + +function getExpandedFallbackPlacements(placement) { + if (Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_5__["auto"]) { + return []; + } + + var oppositePlacement = Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); + return [Object(_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(placement), oppositePlacement, Object(_utils_getOppositeVariationPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(oppositePlacement)]; +} + +function flip(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + + if (state.modifiersData[name]._skip) { + return; + } + + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, + specifiedFallbackPlacements = options.fallbackPlacements, + padding = options.padding, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + _options$flipVariatio = options.flipVariations, + flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, + allowedAutoPlacements = options.allowedAutoPlacements; + var preferredPlacement = state.options.placement; + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(preferredPlacement); + var isBasePlacement = basePlacement === preferredPlacement; + var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); + var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { + return acc.concat(Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_5__["auto"] ? Object(_utils_computeAutoPlacement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + flipVariations: flipVariations, + allowedAutoPlacements: allowedAutoPlacements + }) : placement); + }, []); + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var checksMap = new Map(); + var makeFallbackChecks = true; + var firstFittingPlacement = placements[0]; + + for (var i = 0; i < placements.length; i++) { + var placement = placements[i]; + + var _basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement); + + var isStartVariation = Object(_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_6__["default"])(placement) === _enums_js__WEBPACK_IMPORTED_MODULE_5__["start"]; + var isVertical = [_enums_js__WEBPACK_IMPORTED_MODULE_5__["top"], _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"]].indexOf(_basePlacement) >= 0; + var len = isVertical ? 'width' : 'height'; + var overflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_3__["default"])(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + altBoundary: altBoundary, + padding: padding + }); + var mainVariationSide = isVertical ? isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["right"] : _enums_js__WEBPACK_IMPORTED_MODULE_5__["left"] : isStartVariation ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_5__["top"]; + + if (referenceRect[len] > popperRect[len]) { + mainVariationSide = Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(mainVariationSide); + } + + var altVariationSide = Object(_utils_getOppositePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(mainVariationSide); + var checks = []; + + if (checkMainAxis) { + checks.push(overflow[_basePlacement] <= 0); + } + + if (checkAltAxis) { + checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); + } + + if (checks.every(function (check) { + return check; + })) { + firstFittingPlacement = placement; + makeFallbackChecks = false; + break; + } + + checksMap.set(placement, checks); + } + + if (makeFallbackChecks) { + // `2` may be desired in some cases – research later + var numberOfChecks = flipVariations ? 3 : 1; + + var _loop = function _loop(_i) { + var fittingPlacement = placements.find(function (placement) { + var checks = checksMap.get(placement); + + if (checks) { + return checks.slice(0, _i).every(function (check) { + return check; + }); + } + }); + + if (fittingPlacement) { + firstFittingPlacement = fittingPlacement; + return "break"; + } + }; + + for (var _i = numberOfChecks; _i > 0; _i--) { + var _ret = _loop(_i); + + if (_ret === "break") break; + } + } + + if (state.placement !== firstFittingPlacement) { + state.modifiersData[name]._skip = true; + state.placement = firstFittingPlacement; + state.reset = true; + } +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'flip', + enabled: true, + phase: 'main', + fn: flip, + requiresIfExists: ['offset'], + data: { + _skip: false + } +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/hide.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/hide.js ***! + \***********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); + + + +function getSideOffsets(overflow, rect, preventedOffsets) { + if (preventedOffsets === void 0) { + preventedOffsets = { + x: 0, + y: 0 + }; + } + + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x + }; +} + +function isAnySideFullyClipped(overflow) { + return [_enums_js__WEBPACK_IMPORTED_MODULE_0__["top"], _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"], _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"], _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]].some(function (side) { + return overflow[side] >= 0; + }); +} + +function hide(_ref) { + var state = _ref.state, + name = _ref.name; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var preventedOffsets = state.modifiersData.preventOverflow; + var referenceOverflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { + elementContext: 'reference' + }); + var popperAltOverflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state, { + altBoundary: true + }); + var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); + var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); + var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + state.modifiersData[name] = { + referenceClippingOffsets: referenceClippingOffsets, + popperEscapeOffsets: popperEscapeOffsets, + isReferenceHidden: isReferenceHidden, + hasPopperEscaped: hasPopperEscaped + }; + state.attributes.popper = Object.assign({}, state.attributes.popper, { + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/index.js": +/*!************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/index.js ***! + \************************************************************/ +/*! exports provided: applyStyles, arrow, computeStyles, eventListeners, flip, hide, offset, popperOffsets, preventOverflow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _applyStyles_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "applyStyles", function() { return _applyStyles_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + +/* harmony import */ var _arrow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./arrow.js */ "./node_modules/@popperjs/core/lib/modifiers/arrow.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arrow", function() { return _arrow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); + +/* harmony import */ var _computeStyles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeStyles", function() { return _computeStyles_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); + +/* harmony import */ var _eventListeners_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventListeners", function() { return _eventListeners_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); + +/* harmony import */ var _flip_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./flip.js */ "./node_modules/@popperjs/core/lib/modifiers/flip.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flip", function() { return _flip_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); + +/* harmony import */ var _hide_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./hide.js */ "./node_modules/@popperjs/core/lib/modifiers/hide.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hide", function() { return _hide_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }); + +/* harmony import */ var _offset_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./offset.js */ "./node_modules/@popperjs/core/lib/modifiers/offset.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "offset", function() { return _offset_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }); + +/* harmony import */ var _popperOffsets_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperOffsets", function() { return _popperOffsets_js__WEBPACK_IMPORTED_MODULE_7__["default"]; }); + +/* harmony import */ var _preventOverflow_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./preventOverflow.js */ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "preventOverflow", function() { return _preventOverflow_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }); + + + + + + + + + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/offset.js": +/*!*************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/offset.js ***! + \*************************************************************/ +/*! exports provided: distanceAndSkiddingToXY, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distanceAndSkiddingToXY", function() { return distanceAndSkiddingToXY; }); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + +function distanceAndSkiddingToXY(placement, rects, offset) { + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); + var invertDistance = [_enums_js__WEBPACK_IMPORTED_MODULE_1__["left"], _enums_js__WEBPACK_IMPORTED_MODULE_1__["top"]].indexOf(basePlacement) >= 0 ? -1 : 1; + + var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { + placement: placement + })) : offset, + skidding = _ref[0], + distance = _ref[1]; + + skidding = skidding || 0; + distance = (distance || 0) * invertDistance; + return [_enums_js__WEBPACK_IMPORTED_MODULE_1__["left"], _enums_js__WEBPACK_IMPORTED_MODULE_1__["right"]].indexOf(basePlacement) >= 0 ? { + x: distance, + y: skidding + } : { + x: skidding, + y: distance + }; +} + +function offset(_ref2) { + var state = _ref2.state, + options = _ref2.options, + name = _ref2.name; + var _options$offset = options.offset, + offset = _options$offset === void 0 ? [0, 0] : _options$offset; + var data = _enums_js__WEBPACK_IMPORTED_MODULE_1__["placements"].reduce(function (acc, placement) { + acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); + return acc; + }, {}); + var _data$state$placement = data[state.placement], + x = _data$state$placement.x, + y = _data$state$placement.y; + + if (state.modifiersData.popperOffsets != null) { + state.modifiersData.popperOffsets.x += x; + state.modifiersData.popperOffsets.y += y; + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'offset', + enabled: true, + phase: 'main', + requires: ['popperOffsets'], + fn: offset +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js"); + + +function popperOffsets(_ref) { + var state = _ref.state, + name = _ref.name; + // Offsets are the actual position the popper needs to have to be + // properly positioned near its reference element + // This is the most basic placement, and will be adjusted by + // the modifiers in the next step + state.modifiersData[name] = Object(_utils_computeOffsets_js__WEBPACK_IMPORTED_MODULE_0__["default"])({ + reference: state.rects.reference, + element: state.rects.popper, + strategy: 'absolute', + placement: state.placement + }); +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'popperOffsets', + enabled: true, + phase: 'read', + fn: popperOffsets, + data: {} +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js": +/*!**********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); +/* harmony import */ var _utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils/getAltAxis.js */ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js"); +/* harmony import */ var _utils_within_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/within.js */ "./node_modules/@popperjs/core/lib/utils/within.js"); +/* harmony import */ var _dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../dom-utils/getLayoutRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js"); +/* harmony import */ var _dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/getOffsetParent.js */ "./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js"); +/* harmony import */ var _utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony import */ var _utils_getVariation_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); +/* harmony import */ var _utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"); +/* harmony import */ var _utils_math_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../utils/math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); + + + + + + + + + + + + +function preventOverflow(_ref) { + var state = _ref.state, + options = _ref.options, + name = _ref.name; + var _options$mainAxis = options.mainAxis, + checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, + _options$altAxis = options.altAxis, + checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, + boundary = options.boundary, + rootBoundary = options.rootBoundary, + altBoundary = options.altBoundary, + padding = options.padding, + _options$tether = options.tether, + tether = _options$tether === void 0 ? true : _options$tether, + _options$tetherOffset = options.tetherOffset, + tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; + var overflow = Object(_utils_detectOverflow_js__WEBPACK_IMPORTED_MODULE_7__["default"])(state, { + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding, + altBoundary: altBoundary + }); + var basePlacement = Object(_utils_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(state.placement); + var variation = Object(_utils_getVariation_js__WEBPACK_IMPORTED_MODULE_8__["default"])(state.placement); + var isBasePlacement = !variation; + var mainAxis = Object(_utils_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(basePlacement); + var altAxis = Object(_utils_getAltAxis_js__WEBPACK_IMPORTED_MODULE_3__["default"])(mainAxis); + var popperOffsets = state.modifiersData.popperOffsets; + var referenceRect = state.rects.reference; + var popperRect = state.rects.popper; + var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { + placement: state.placement + })) : tetherOffset; + var data = { + x: 0, + y: 0 + }; + + if (!popperOffsets) { + return; + } + + if (checkMainAxis || checkAltAxis) { + var mainSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; + var altSide = mainAxis === 'y' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; + var len = mainAxis === 'y' ? 'height' : 'width'; + var offset = popperOffsets[mainAxis]; + var min = popperOffsets[mainAxis] + overflow[mainSide]; + var max = popperOffsets[mainAxis] - overflow[altSide]; + var additive = tether ? -popperRect[len] / 2 : 0; + var minLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_0__["start"] ? referenceRect[len] : popperRect[len]; + var maxLen = variation === _enums_js__WEBPACK_IMPORTED_MODULE_0__["start"] ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go + // outside the reference bounds + + var arrowElement = state.elements.arrow; + var arrowRect = tether && arrowElement ? Object(_dom_utils_getLayoutRect_js__WEBPACK_IMPORTED_MODULE_5__["default"])(arrowElement) : { + width: 0, + height: 0 + }; + var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : Object(_utils_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_9__["default"])(); + var arrowPaddingMin = arrowPaddingObject[mainSide]; + var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want + // to include its full size in the calculation. If the reference is small + // and near the edge of a boundary, the popper can overflow even if the + // reference is not overflowing as well (e.g. virtual elements with no + // width or height) + + var arrowLen = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_4__["default"])(0, referenceRect[len], arrowRect[len]); + var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue; + var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue; + var arrowOffsetParent = state.elements.arrow && Object(_dom_utils_getOffsetParent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(state.elements.arrow); + var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; + var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0; + var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset; + var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue; + + if (checkMainAxis) { + var preventedOffset = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_4__["default"])(tether ? Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_10__["min"])(min, tetherMin) : min, offset, tether ? Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_10__["max"])(max, tetherMax) : max); + popperOffsets[mainAxis] = preventedOffset; + data[mainAxis] = preventedOffset - offset; + } + + if (checkAltAxis) { + var _mainSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["top"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["left"]; + + var _altSide = mainAxis === 'x' ? _enums_js__WEBPACK_IMPORTED_MODULE_0__["bottom"] : _enums_js__WEBPACK_IMPORTED_MODULE_0__["right"]; + + var _offset = popperOffsets[altAxis]; + + var _min = _offset + overflow[_mainSide]; + + var _max = _offset - overflow[_altSide]; + + var _preventedOffset = Object(_utils_within_js__WEBPACK_IMPORTED_MODULE_4__["default"])(tether ? Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_10__["min"])(_min, tetherMin) : _min, _offset, tether ? Object(_utils_math_js__WEBPACK_IMPORTED_MODULE_10__["max"])(_max, tetherMax) : _max); + + popperOffsets[altAxis] = _preventedOffset; + data[altAxis] = _preventedOffset - _offset; + } + } + + state.modifiersData[name] = data; +} // eslint-disable-next-line import/no-unused-modules + + +/* harmony default export */ __webpack_exports__["default"] = ({ + name: 'preventOverflow', + enabled: true, + phase: 'main', + fn: preventOverflow, + requiresIfExists: ['offset'] +}); + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/popper-lite.js": +/*!********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/popper-lite.js ***! + \********************************************************/ +/*! exports provided: createPopper, popperGenerator, defaultModifiers, detectOverflow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPopper", function() { return createPopper; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultModifiers", function() { return defaultModifiers; }); +/* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperGenerator", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_0__["popperGenerator"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "detectOverflow", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_0__["detectOverflow"]; }); + +/* harmony import */ var _modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js"); +/* harmony import */ var _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifiers/popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"); +/* harmony import */ var _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiers/computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js"); +/* harmony import */ var _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modifiers/applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js"); + + + + + +var defaultModifiers = [_modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_1__["default"], _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_2__["default"], _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_3__["default"], _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_4__["default"]]; +var createPopper = /*#__PURE__*/Object(_createPopper_js__WEBPACK_IMPORTED_MODULE_0__["popperGenerator"])({ + defaultModifiers: defaultModifiers +}); // eslint-disable-next-line import/no-unused-modules + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/popper.js": +/*!***************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/popper.js ***! + \***************************************************/ +/*! exports provided: createPopper, popperGenerator, defaultModifiers, detectOverflow, createPopperLite, applyStyles, arrow, computeStyles, eventListeners, flip, hide, offset, popperOffsets, preventOverflow */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPopper", function() { return createPopper; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultModifiers", function() { return defaultModifiers; }); +/* harmony import */ var _createPopper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createPopper.js */ "./node_modules/@popperjs/core/lib/createPopper.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperGenerator", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_0__["popperGenerator"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "detectOverflow", function() { return _createPopper_js__WEBPACK_IMPORTED_MODULE_0__["detectOverflow"]; }); + +/* harmony import */ var _modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modifiers/eventListeners.js */ "./node_modules/@popperjs/core/lib/modifiers/eventListeners.js"); +/* harmony import */ var _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modifiers/popperOffsets.js */ "./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js"); +/* harmony import */ var _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modifiers/computeStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/computeStyles.js"); +/* harmony import */ var _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modifiers/applyStyles.js */ "./node_modules/@popperjs/core/lib/modifiers/applyStyles.js"); +/* harmony import */ var _modifiers_offset_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modifiers/offset.js */ "./node_modules/@popperjs/core/lib/modifiers/offset.js"); +/* harmony import */ var _modifiers_flip_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modifiers/flip.js */ "./node_modules/@popperjs/core/lib/modifiers/flip.js"); +/* harmony import */ var _modifiers_preventOverflow_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modifiers/preventOverflow.js */ "./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js"); +/* harmony import */ var _modifiers_arrow_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modifiers/arrow.js */ "./node_modules/@popperjs/core/lib/modifiers/arrow.js"); +/* harmony import */ var _modifiers_hide_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modifiers/hide.js */ "./node_modules/@popperjs/core/lib/modifiers/hide.js"); +/* harmony import */ var _popper_lite_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./popper-lite.js */ "./node_modules/@popperjs/core/lib/popper-lite.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createPopperLite", function() { return _popper_lite_js__WEBPACK_IMPORTED_MODULE_10__["createPopper"]; }); + +/* harmony import */ var _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modifiers/index.js */ "./node_modules/@popperjs/core/lib/modifiers/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "applyStyles", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["applyStyles"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arrow", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["arrow"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeStyles", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["computeStyles"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventListeners", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["eventListeners"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flip", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["flip"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hide", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["hide"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "offset", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["offset"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "popperOffsets", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["popperOffsets"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "preventOverflow", function() { return _modifiers_index_js__WEBPACK_IMPORTED_MODULE_11__["preventOverflow"]; }); + + + + + + + + + + + +var defaultModifiers = [_modifiers_eventListeners_js__WEBPACK_IMPORTED_MODULE_1__["default"], _modifiers_popperOffsets_js__WEBPACK_IMPORTED_MODULE_2__["default"], _modifiers_computeStyles_js__WEBPACK_IMPORTED_MODULE_3__["default"], _modifiers_applyStyles_js__WEBPACK_IMPORTED_MODULE_4__["default"], _modifiers_offset_js__WEBPACK_IMPORTED_MODULE_5__["default"], _modifiers_flip_js__WEBPACK_IMPORTED_MODULE_6__["default"], _modifiers_preventOverflow_js__WEBPACK_IMPORTED_MODULE_7__["default"], _modifiers_arrow_js__WEBPACK_IMPORTED_MODULE_8__["default"], _modifiers_hide_js__WEBPACK_IMPORTED_MODULE_9__["default"]]; +var createPopper = /*#__PURE__*/Object(_createPopper_js__WEBPACK_IMPORTED_MODULE_0__["popperGenerator"])({ + defaultModifiers: defaultModifiers +}); // eslint-disable-next-line import/no-unused-modules + + // eslint-disable-next-line import/no-unused-modules + + // eslint-disable-next-line import/no-unused-modules + + + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.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 computeAutoPlacement; }); +/* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./detectOverflow.js */ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js"); +/* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); + + + + +function computeAutoPlacement(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + placement = _options.placement, + boundary = _options.boundary, + rootBoundary = _options.rootBoundary, + padding = _options.padding, + flipVariations = _options.flipVariations, + _options$allowedAutoP = _options.allowedAutoPlacements, + allowedAutoPlacements = _options$allowedAutoP === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_1__["placements"] : _options$allowedAutoP; + var variation = Object(_getVariation_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement); + var placements = variation ? flipVariations ? _enums_js__WEBPACK_IMPORTED_MODULE_1__["variationPlacements"] : _enums_js__WEBPACK_IMPORTED_MODULE_1__["variationPlacements"].filter(function (placement) { + return Object(_getVariation_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) === variation; + }) : _enums_js__WEBPACK_IMPORTED_MODULE_1__["basePlacements"]; + var allowedPlacements = placements.filter(function (placement) { + return allowedAutoPlacements.indexOf(placement) >= 0; + }); + + if (allowedPlacements.length === 0) { + allowedPlacements = placements; + + if (true) { + console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' ')); + } + } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... + + + var overflows = allowedPlacements.reduce(function (acc, placement) { + acc[placement] = Object(_detectOverflow_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state, { + placement: placement, + boundary: boundary, + rootBoundary: rootBoundary, + padding: padding + })[Object(_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(placement)]; + return acc; + }, {}); + return Object.keys(overflows).sort(function (a, b) { + return overflows[a] - overflows[b]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/computeOffsets.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 computeOffsets; }); +/* harmony import */ var _getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getBasePlacement.js */ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js"); +/* harmony import */ var _getVariation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVariation.js */ "./node_modules/@popperjs/core/lib/utils/getVariation.js"); +/* harmony import */ var _getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getMainAxisFromPlacement.js */ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + + + +function computeOffsets(_ref) { + var reference = _ref.reference, + element = _ref.element, + placement = _ref.placement; + var basePlacement = placement ? Object(_getBasePlacement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(placement) : null; + var variation = placement ? Object(_getVariation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(placement) : null; + var commonX = reference.x + reference.width / 2 - element.width / 2; + var commonY = reference.y + reference.height / 2 - element.height / 2; + var offsets; + + switch (basePlacement) { + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["top"]: + offsets = { + x: commonX, + y: reference.y - element.height + }; + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["bottom"]: + offsets = { + x: commonX, + y: reference.y + reference.height + }; + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["right"]: + offsets = { + x: reference.x + reference.width, + y: commonY + }; + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["left"]: + offsets = { + x: reference.x - element.width, + y: commonY + }; + break; + + default: + offsets = { + x: reference.x, + y: reference.y + }; + } + + var mainAxis = basePlacement ? Object(_getMainAxisFromPlacement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(basePlacement) : null; + + if (mainAxis != null) { + var len = mainAxis === 'y' ? 'height' : 'width'; + + switch (variation) { + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["start"]: + offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); + break; + + case _enums_js__WEBPACK_IMPORTED_MODULE_3__["end"]: + offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); + break; + + default: + } + } + + return offsets; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/debounce.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/debounce.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 debounce; }); +function debounce(fn) { + var pending; + return function () { + if (!pending) { + pending = new Promise(function (resolve) { + Promise.resolve().then(function () { + pending = undefined; + resolve(fn()); + }); + }); + } + + return pending; + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/detectOverflow.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/detectOverflow.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 detectOverflow; }); +/* harmony import */ var _dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../dom-utils/getBoundingClientRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js"); +/* harmony import */ var _dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../dom-utils/getClippingRect.js */ "./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js"); +/* harmony import */ var _dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../dom-utils/getDocumentElement.js */ "./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js"); +/* harmony import */ var _computeOffsets_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./computeOffsets.js */ "./node_modules/@popperjs/core/lib/utils/computeOffsets.js"); +/* harmony import */ var _rectToClientRect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./rectToClientRect.js */ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); +/* harmony import */ var _dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../dom-utils/instanceOf.js */ "./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js"); +/* harmony import */ var _mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./mergePaddingObject.js */ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js"); +/* harmony import */ var _expandToHashMap_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./expandToHashMap.js */ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js"); + + + + + + + + + // eslint-disable-next-line import/no-unused-modules + +function detectOverflow(state, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$placement = _options.placement, + placement = _options$placement === void 0 ? state.placement : _options$placement, + _options$boundary = _options.boundary, + boundary = _options$boundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["clippingParents"] : _options$boundary, + _options$rootBoundary = _options.rootBoundary, + rootBoundary = _options$rootBoundary === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["viewport"] : _options$rootBoundary, + _options$elementConte = _options.elementContext, + elementContext = _options$elementConte === void 0 ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] : _options$elementConte, + _options$altBoundary = _options.altBoundary, + altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, + _options$padding = _options.padding, + padding = _options$padding === void 0 ? 0 : _options$padding; + var paddingObject = Object(_mergePaddingObject_js__WEBPACK_IMPORTED_MODULE_7__["default"])(typeof padding !== 'number' ? padding : Object(_expandToHashMap_js__WEBPACK_IMPORTED_MODULE_8__["default"])(padding, _enums_js__WEBPACK_IMPORTED_MODULE_5__["basePlacements"])); + var altContext = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] ? _enums_js__WEBPACK_IMPORTED_MODULE_5__["reference"] : _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"]; + var referenceElement = state.elements.reference; + var popperRect = state.rects.popper; + var element = state.elements[altBoundary ? altContext : elementContext]; + var clippingClientRect = Object(_dom_utils_getClippingRect_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_dom_utils_instanceOf_js__WEBPACK_IMPORTED_MODULE_6__["isElement"])(element) ? element : element.contextElement || Object(_dom_utils_getDocumentElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(state.elements.popper), boundary, rootBoundary); + var referenceClientRect = Object(_dom_utils_getBoundingClientRect_js__WEBPACK_IMPORTED_MODULE_0__["default"])(referenceElement); + var popperOffsets = Object(_computeOffsets_js__WEBPACK_IMPORTED_MODULE_3__["default"])({ + reference: referenceClientRect, + element: popperRect, + strategy: 'absolute', + placement: placement + }); + var popperClientRect = Object(_rectToClientRect_js__WEBPACK_IMPORTED_MODULE_4__["default"])(Object.assign({}, popperRect, popperOffsets)); + var elementClientRect = elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect + // 0 or negative = within the clipping rect + + var overflowOffsets = { + top: clippingClientRect.top - elementClientRect.top + paddingObject.top, + bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, + left: clippingClientRect.left - elementClientRect.left + paddingObject.left, + right: elementClientRect.right - clippingClientRect.right + paddingObject.right + }; + var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element + + if (elementContext === _enums_js__WEBPACK_IMPORTED_MODULE_5__["popper"] && offsetData) { + var offset = offsetData[placement]; + Object.keys(overflowOffsets).forEach(function (key) { + var multiply = [_enums_js__WEBPACK_IMPORTED_MODULE_5__["right"], _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"]].indexOf(key) >= 0 ? 1 : -1; + var axis = [_enums_js__WEBPACK_IMPORTED_MODULE_5__["top"], _enums_js__WEBPACK_IMPORTED_MODULE_5__["bottom"]].indexOf(key) >= 0 ? 'y' : 'x'; + overflowOffsets[key] += offset[axis] * multiply; + }); + } + + return overflowOffsets; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/expandToHashMap.js": +/*!******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/expandToHashMap.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 expandToHashMap; }); +function expandToHashMap(value, keys) { + return keys.reduce(function (hashMap, key) { + hashMap[key] = value; + return hashMap; + }, {}); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/format.js": +/*!*********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/format.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 format; }); +function format(str) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return [].concat(args).reduce(function (p, c) { + return p.replace(/%s/, c); + }, str); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getAltAxis.js": +/*!*************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getAltAxis.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 getAltAxis; }); +function getAltAxis(axis) { + return axis === 'x' ? 'y' : 'x'; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getBasePlacement.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getBasePlacement.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 getBasePlacement; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + +function getBasePlacement(placement) { + return placement.split('-')[0]; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.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 getFreshSideObject; }); +function getFreshSideObject() { + return { + top: 0, + right: 0, + bottom: 0, + left: 0 + }; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js": +/*!***************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.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 getMainAxisFromPlacement; }); +function getMainAxisFromPlacement(placement) { + return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js": +/*!***********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.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 getOppositePlacement; }); +var hash = { + left: 'right', + right: 'left', + bottom: 'top', + top: 'bottom' +}; +function getOppositePlacement(placement) { + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js": +/*!********************************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.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 getOppositeVariationPlacement; }); +var hash = { + start: 'end', + end: 'start' +}; +function getOppositeVariationPlacement(placement) { + return placement.replace(/start|end/g, function (matched) { + return hash[matched]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/getVariation.js": +/*!***************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/getVariation.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 getVariation; }); +function getVariation(placement) { + return placement.split('-')[1]; +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/math.js": +/*!*******************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/math.js ***! + \*******************************************************/ +/*! exports provided: max, min, round */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "round", function() { return round; }); +var max = Math.max; +var min = Math.min; +var round = Math.round; + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/mergeByName.js": +/*!**************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/mergeByName.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 mergeByName; }); +function mergeByName(modifiers) { + var merged = modifiers.reduce(function (merged, current) { + var existing = merged[current.name]; + merged[current.name] = existing ? Object.assign({}, existing, current, { + options: Object.assign({}, existing.options, current.options), + data: Object.assign({}, existing.data, current.data) + }) : current; + return merged; + }, {}); // IE11 does not support Object.values + + return Object.keys(merged).map(function (key) { + return merged[key]; + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js": +/*!*********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.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 mergePaddingObject; }); +/* harmony import */ var _getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getFreshSideObject.js */ "./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js"); + +function mergePaddingObject(paddingObject) { + return Object.assign({}, Object(_getFreshSideObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(), paddingObject); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/orderModifiers.js": +/*!*****************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/orderModifiers.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 orderModifiers; }); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + // source: https://stackoverflow.com/questions/49875255 + +function order(modifiers) { + var map = new Map(); + var visited = new Set(); + var result = []; + modifiers.forEach(function (modifier) { + map.set(modifier.name, modifier); + }); // On visiting object, check for its dependencies and visit them recursively + + function sort(modifier) { + visited.add(modifier.name); + var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); + requires.forEach(function (dep) { + if (!visited.has(dep)) { + var depModifier = map.get(dep); + + if (depModifier) { + sort(depModifier); + } + } + }); + result.push(modifier); + } + + modifiers.forEach(function (modifier) { + if (!visited.has(modifier.name)) { + // check for visited object + sort(modifier); + } + }); + return result; +} + +function orderModifiers(modifiers) { + // order based on dependencies + var orderedModifiers = order(modifiers); // order based on phase + + return _enums_js__WEBPACK_IMPORTED_MODULE_0__["modifierPhases"].reduce(function (acc, phase) { + return acc.concat(orderedModifiers.filter(function (modifier) { + return modifier.phase === phase; + })); + }, []); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/rectToClientRect.js": +/*!*******************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/rectToClientRect.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 rectToClientRect; }); +function rectToClientRect(rect) { + return Object.assign({}, rect, { + left: rect.x, + top: rect.y, + right: rect.x + rect.width, + bottom: rect.y + rect.height + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/uniqueBy.js": +/*!***********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/uniqueBy.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 uniqueBy; }); +function uniqueBy(arr, fn) { + var identifiers = new Set(); + return arr.filter(function (item) { + var identifier = fn(item); + + if (!identifiers.has(identifier)) { + identifiers.add(identifier); + return true; + } + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/validateModifiers.js": +/*!********************************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/validateModifiers.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 validateModifiers; }); +/* harmony import */ var _format_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./format.js */ "./node_modules/@popperjs/core/lib/utils/format.js"); +/* harmony import */ var _enums_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../enums.js */ "./node_modules/@popperjs/core/lib/enums.js"); + + +var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; +var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; +var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; +function validateModifiers(modifiers) { + modifiers.forEach(function (modifier) { + Object.keys(modifier).forEach(function (key) { + switch (key) { + case 'name': + if (typeof modifier.name !== 'string') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); + } + + break; + + case 'enabled': + if (typeof modifier.enabled !== 'boolean') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); + } + + case 'phase': + if (_enums_js__WEBPACK_IMPORTED_MODULE_1__["modifierPhases"].indexOf(modifier.phase) < 0) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + _enums_js__WEBPACK_IMPORTED_MODULE_1__["modifierPhases"].join(', '), "\"" + String(modifier.phase) + "\"")); + } + + break; + + case 'fn': + if (typeof modifier.fn !== 'function') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); + } + + break; + + case 'effect': + if (typeof modifier.effect !== 'function') { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); + } + + break; + + case 'requires': + if (!Array.isArray(modifier.requires)) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); + } + + break; + + case 'requiresIfExists': + if (!Array.isArray(modifier.requiresIfExists)) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); + } + + break; + + case 'options': + case 'data': + break; + + default: + console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { + return "\"" + s + "\""; + }).join(', ') + "; but \"" + key + "\" was provided."); + } + + modifier.requires && modifier.requires.forEach(function (requirement) { + if (modifiers.find(function (mod) { + return mod.name === requirement; + }) == null) { + console.error(Object(_format_js__WEBPACK_IMPORTED_MODULE_0__["default"])(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); + } + }); + }); + }); +} + +/***/ }), + +/***/ "./node_modules/@popperjs/core/lib/utils/within.js": +/*!*********************************************************!*\ + !*** ./node_modules/@popperjs/core/lib/utils/within.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 within; }); +/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/@popperjs/core/lib/utils/math.js"); + +function within(min, value, max) { + return Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["max"])(min, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["min"])(value, max)); +} + +/***/ }), + +/***/ "./node_modules/@semantic-ui-react/event-stack/lib/cjs/event-stack.development.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/@semantic-ui-react/event-stack/lib/cjs/event-stack.development.js ***! + \****************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, '__esModule', { value: true }); + +var env = __webpack_require__(/*! exenv */ "./node_modules/exenv/index.js"); +var PropTypes = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +var React = __webpack_require__(/*! react */ "./node_modules/react/index.js"); + +function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } + + return _assertThisInitialized(self); +} + +/** + * The current implementation was chosen by performance and compatibility reasons, feel free to play + * with benchmarks and submit PR with faster alternative. Each method contains links to benchmarks. + */ +var EventSet = +/*#__PURE__*/ +function () { + /** + * @see https://jsperf.com/suir-eventset-constructor + */ + function EventSet(eventHandlers) { + _classCallCheck(this, EventSet); + + _defineProperty(this, "handlers", void 0); + + this.handlers = eventHandlers.slice(0); + } + /** + * @see https://jsperf.com/suir-eventset-addhandlers + */ + + + _createClass(EventSet, [{ + key: "addHandlers", + value: function addHandlers(additionalHandlers) { + var newHandlers = this.handlers.slice(0); + var length = additionalHandlers.length; // Heads up! + // Previously we use Set there, it granted uniqueness of handlers, now dispatchEvent() is + // responsible for this. + + for (var i = 0; i < length; i += 1) { + newHandlers.push(additionalHandlers[i]); + } + + return new EventSet(newHandlers); + } + /** + * @see https://jsperf.com/suir-eventset-dispatchsingle + * @see https://jsperf.com/suir-eventset-dispatchmultiple2 + */ + + }, { + key: "dispatchEvent", + value: function dispatchEvent(event, dispatchAll) { + var count = this.handlers.length - 1; + + if (!dispatchAll) { + // Heads up! + // We don't use .pop() there because it will mutate the array. + var recentHandler = this.handlers[count]; + recentHandler(event); + return; + } + + for (var i = count; i >= 0; i -= 1) { + if (!this.handlers[i].called) { + this.handlers[i].called = true; + this.handlers[i](event); + } + } + + for (var _i = count; _i >= 0; _i -= 1) { + this.handlers[_i].called = false; + } + } + }, { + key: "hasHandlers", + value: function hasHandlers() { + return this.handlers.length > 0; + } + /** + * @see https://jsperf.com/suir-eventset-removehandlers + */ + + }, { + key: "removeHandlers", + value: function removeHandlers(removalHandlers) { + var newHandlers = []; + var length = this.handlers.length; + + for (var i = 0; i < length; i += 1) { + var handler = this.handlers[i]; + + if (removalHandlers.indexOf(handler) === -1) { + newHandlers.push(handler); + } + } + + return new EventSet(newHandlers); + } + }]); + + return EventSet; +}(); + +/** + * An IE11-compatible function. + * + * @see https://jsperf.com/suir-clone-map + */ +function cloneMap(map) { + var newMap = new Map(); + map.forEach(function (value, key) { + newMap.set(key, value); + }); + return newMap; +} +function normalizeHandlers(handlers) { + return Array.isArray(handlers) ? handlers : [handlers]; +} +/** + * Asserts that the passed value is React.RefObject + * + * @see https://github.com/facebook/react/blob/v16.8.2/packages/react-reconciler/src/ReactFiberCommitWork.js#L665 + */ + +var isRefObject = function isRefObject(ref // eslint-disable-next-line +) { + return ref !== null && _typeof(ref) === 'object' && ref.hasOwnProperty('current'); +}; +/** + * Normalizes `target` for EventStack, because `target` can be passed as `boolean` or `string`. + * + * @see https://jsperf.com/suir-normalize-target + */ + +function normalizeTarget(target) { + if (target === 'document') return document; + if (target === 'window') return window; + if (isRefObject(target)) return target.current || document; + return target || document; +} + +var EventPool = +/*#__PURE__*/ +function () { + function EventPool(poolName, handlerSets) { + _classCallCheck(this, EventPool); + + _defineProperty(this, "handlerSets", void 0); + + _defineProperty(this, "poolName", void 0); + + this.handlerSets = handlerSets; + this.poolName = poolName; + } + + _createClass(EventPool, [{ + key: "addHandlers", + value: function addHandlers(eventType, eventHandlers) { + var handlerSets = cloneMap(this.handlerSets); + + if (handlerSets.has(eventType)) { + var eventSet = handlerSets.get(eventType); + handlerSets.set(eventType, eventSet.addHandlers(eventHandlers)); + } else { + handlerSets.set(eventType, new EventSet(eventHandlers)); + } + + return new EventPool(this.poolName, handlerSets); + } + }, { + key: "dispatchEvent", + value: function dispatchEvent(eventType, event) { + var handlerSet = this.handlerSets.get(eventType); + var shouldDispatchAll = this.poolName === 'default'; + + if (handlerSet) { + handlerSet.dispatchEvent(event, shouldDispatchAll); + } + } + }, { + key: "hasHandlers", + value: function hasHandlers(eventType) { + if (!eventType) { + return this.handlerSets.size > 0; + } + + var eventSet = this.handlerSets.get(eventType); + + if (eventSet) { + return eventSet.hasHandlers(); + } + + return false; + } + }, { + key: "removeHandlers", + value: function removeHandlers(eventType, eventHandlers) { + var handlerSets = cloneMap(this.handlerSets); + + if (!handlerSets.has(eventType)) { + return new EventPool(this.poolName, handlerSets); + } + + var currentSet = handlerSets.get(eventType); + var nextSet = currentSet.removeHandlers(eventHandlers); + + if (nextSet.hasHandlers()) { + handlerSets.set(eventType, nextSet); + } else { + handlerSets.delete(eventType); + } + + return new EventPool(this.poolName, handlerSets); + } + }]); + + return EventPool; +}(); + +_defineProperty(EventPool, "createByType", function (poolName, eventType, eventHandlers) { + var handlerSets = new Map(); + handlerSets.set(eventType, new EventSet(eventHandlers)); + return new EventPool(poolName, handlerSets); +}); + +var EventTarget = +/*#__PURE__*/ +function () { + function EventTarget(target) { + var _this = this; + + _classCallCheck(this, EventTarget); + + _defineProperty(this, "handlers", new Map()); + + _defineProperty(this, "pools", new Map()); + + _defineProperty(this, "target", void 0); + + _defineProperty(this, "createEmitter", function (eventType) { + return function (event) { + _this.pools.forEach(function (pool) { + pool.dispatchEvent(eventType, event); + }); + }; + }); + + this.target = target; + } + + _createClass(EventTarget, [{ + key: "addHandlers", + value: function addHandlers(poolName, eventType, eventHandlers) { + if (this.pools.has(poolName)) { + var eventPool = this.pools.get(poolName); + this.pools.set(poolName, eventPool.addHandlers(eventType, eventHandlers)); + } else { + this.pools.set(poolName, EventPool.createByType(poolName, eventType, eventHandlers)); + } + + if (!this.handlers.has(eventType)) { + this.addTargetHandler(eventType); + } + } + }, { + key: "hasHandlers", + value: function hasHandlers() { + return this.handlers.size > 0; + } + }, { + key: "removeHandlers", + value: function removeHandlers(poolName, eventType, eventHandlers) { + if (!this.pools.has(poolName)) { + return; + } + + var pool = this.pools.get(poolName); + var newPool = pool.removeHandlers(eventType, eventHandlers); + + if (newPool.hasHandlers()) { + this.pools.set(poolName, newPool); + } else { + this.pools.delete(poolName); + } + + var hasHandlers = false; + this.pools.forEach(function (pool) { + return hasHandlers = hasHandlers || pool.hasHandlers(eventType); + }); + + if (!hasHandlers) { + this.removeTargetHandler(eventType); + } + } + }, { + key: "addTargetHandler", + value: function addTargetHandler(eventType) { + var handler = this.createEmitter(eventType); + this.handlers.set(eventType, handler); + this.target.addEventListener(eventType, handler, true); + } + }, { + key: "removeTargetHandler", + value: function removeTargetHandler(eventType) { + if (this.handlers.has(eventType)) { + this.target.removeEventListener(eventType, this.handlers.get(eventType), true); + this.handlers.delete(eventType); + } + } + }]); + + return EventTarget; +}(); + +var EventStack = +/*#__PURE__*/ +function () { + function EventStack() { + var _this = this; + + _classCallCheck(this, EventStack); + + _defineProperty(this, "targets", new Map()); + + _defineProperty(this, "getTarget", function (target) { + var autoCreate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var normalized = normalizeTarget(target); + + if (_this.targets.has(normalized)) { + return _this.targets.get(normalized); + } + + if (!autoCreate) return null; + var eventTarget = new EventTarget(normalized); + + _this.targets.set(normalized, eventTarget); + + return eventTarget; + }); + + _defineProperty(this, "removeTarget", function (target) { + _this.targets.delete(normalizeTarget(target)); + }); + } + + _createClass(EventStack, [{ + key: "sub", + value: function sub(eventName, eventHandlers) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (!env.canUseDOM) return; + var _options$target = options.target, + target = _options$target === void 0 ? document : _options$target, + _options$pool = options.pool, + pool = _options$pool === void 0 ? 'default' : _options$pool; + var eventTarget = this.getTarget(target); + eventTarget.addHandlers(pool, eventName, normalizeHandlers(eventHandlers)); + } + }, { + key: "unsub", + value: function unsub(eventName, eventHandlers) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + if (!env.canUseDOM) return; + var _options$target2 = options.target, + target = _options$target2 === void 0 ? document : _options$target2, + _options$pool2 = options.pool, + pool = _options$pool2 === void 0 ? 'default' : _options$pool2; + var eventTarget = this.getTarget(target, false); + + if (eventTarget) { + eventTarget.removeHandlers(pool, eventName, normalizeHandlers(eventHandlers)); + if (!eventTarget.hasHandlers()) this.removeTarget(target); + } + } + }]); + + return EventStack; +}(); + +var instance = new EventStack(); + +/** + * This component exposes the EventStack API as public and provides a declarative way to manage it. + */ +var EventStack$1 = +/*#__PURE__*/ +function (_React$PureComponent) { + _inherits(EventStack, _React$PureComponent); + + function EventStack() { + _classCallCheck(this, EventStack); + + return _possibleConstructorReturn(this, _getPrototypeOf(EventStack).apply(this, arguments)); + } + + _createClass(EventStack, [{ + key: "componentDidMount", + value: function componentDidMount() { + this.subscribe(this.props); + } + }, { + key: "componentDidUpdate", + value: function componentDidUpdate(prevProps) { + this.unsubscribe(prevProps); + this.subscribe(this.props); + } + }, { + key: "componentWillUnmount", + value: function componentWillUnmount() { + this.unsubscribe(this.props); + } + }, { + key: "subscribe", + value: function subscribe(props) { + var name = props.name, + on = props.on, + pool = props.pool, + target = props.target; + instance.sub(name, on, { + pool: pool, + target: target + }); + } + }, { + key: "unsubscribe", + value: function unsubscribe(props) { + var name = props.name, + on = props.on, + pool = props.pool, + target = props.target; + instance.unsub(name, on, { + pool: pool, + target: target + }); + } + }, { + key: "render", + value: function render() { + return null; + } + }]); + + return EventStack; +}(React.PureComponent); + +_defineProperty(EventStack$1, "defaultProps", { + pool: 'default', + target: 'document' +}); +EventStack$1.propTypes = { + /** An event name on which we will subscribe. */ + name: PropTypes.string.isRequired, + + /** An event handler or array of event handlers. */ + on: PropTypes.oneOfType([PropTypes.func, PropTypes.arrayOf(PropTypes.func)]).isRequired, + + /** A name of pool. */ + pool: PropTypes.string, + + /** A DOM element on which we will subscribe. */ + target: PropTypes.oneOfType([PropTypes.oneOf(['document', 'window']), // Heads up! + // This condition for SSR safety. + PropTypes.instanceOf(env.canUseDOM ? HTMLElement : Object), PropTypes.shape({ + current: PropTypes.object + })]) +}; + +exports.instance = instance; +exports.default = EventStack$1; + + +/***/ }), + +/***/ "./node_modules/@semantic-ui-react/event-stack/lib/index.js": +/*!******************************************************************!*\ + !*** ./node_modules/@semantic-ui-react/event-stack/lib/index.js ***! + \******************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + + +var stack; + +if (false) {} else { + stack = __webpack_require__(/*! ./cjs/event-stack.development.js */ "./node_modules/@semantic-ui-react/event-stack/lib/cjs/event-stack.development.js"); +} + +module.exports = stack.default; +module.exports.instance = stack.instance; + + +/***/ }), + +/***/ "./node_modules/aes-js/index.js": +/*!**************************************!*\ + !*** ./node_modules/aes-js/index.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +(function(root) { + + function checkInt(value) { + return (parseInt(value) === value); + } + + function checkInts(arrayish) { + if (!checkInt(arrayish.length)) { return false; } + + for (var i = 0; i < arrayish.length; i++) { + if (!checkInt(arrayish[i]) || arrayish[i] < 0 || arrayish[i] > 255) { + return false; + } + } + + return true; + } + + function coerceArray(arg, copy) { + + // ArrayBuffer view + if (arg.buffer && ArrayBuffer.isView(arg) && arg.name === 'Uint8Array') { + + if (copy) { + if (arg.slice) { + arg = arg.slice(); + } else { + arg = Array.prototype.slice.call(arg); + } + } + + return arg; + } + + // It's an array; check it is a valid representation of a byte + if (Array.isArray(arg)) { + if (!checkInts(arg)) { + throw new Error('Array contains invalid value: ' + arg); + } + + return new Uint8Array(arg); + } + + // Something else, but behaves like an array (maybe a Buffer? Arguments?) + if (checkInt(arg.length) && checkInts(arg)) { + return new Uint8Array(arg); + } + + throw new Error('unsupported array-like object'); + } + + function createArray(length) { + return new Uint8Array(length); + } + + function copyArray(sourceArray, targetArray, targetStart, sourceStart, sourceEnd) { + if (sourceStart != null || sourceEnd != null) { + if (sourceArray.slice) { + sourceArray = sourceArray.slice(sourceStart, sourceEnd); + } else { + sourceArray = Array.prototype.slice.call(sourceArray, sourceStart, sourceEnd); + } + } + targetArray.set(sourceArray, targetStart); + } + + + + var convertUtf8 = (function() { + function toBytes(text) { + var result = [], i = 0; + text = encodeURI(text); + while (i < text.length) { + var c = text.charCodeAt(i++); + + // if it is a % sign, encode the following 2 bytes as a hex value + if (c === 37) { + result.push(parseInt(text.substr(i, 2), 16)) + i += 2; + + // otherwise, just the actual byte + } else { + result.push(c) + } + } + + return coerceArray(result); + } + + function fromBytes(bytes) { + var result = [], i = 0; + + while (i < bytes.length) { + var c = bytes[i]; + + if (c < 128) { + result.push(String.fromCharCode(c)); + i++; + } else if (c > 191 && c < 224) { + result.push(String.fromCharCode(((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f))); + i += 2; + } else { + result.push(String.fromCharCode(((c & 0x0f) << 12) | ((bytes[i + 1] & 0x3f) << 6) | (bytes[i + 2] & 0x3f))); + i += 3; + } + } + + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } + })(); + + var convertHex = (function() { + function toBytes(text) { + var result = []; + for (var i = 0; i < text.length; i += 2) { + result.push(parseInt(text.substr(i, 2), 16)); + } + + return result; + } + + // http://ixti.net/development/javascript/2011/11/11/base64-encodedecode-of-utf8-in-browser-with-js.html + var Hex = '0123456789abcdef'; + + function fromBytes(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i++) { + var v = bytes[i]; + result.push(Hex[(v & 0xf0) >> 4] + Hex[v & 0x0f]); + } + return result.join(''); + } + + return { + toBytes: toBytes, + fromBytes: fromBytes, + } + })(); + + + // Number of rounds by keysize + var numberOfRounds = {16: 10, 24: 12, 32: 14} + + // Round constant words + var rcon = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91]; + + // S-box and Inverse S-box (S is for Substitution) + var S = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]; + var Si =[0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]; + + // Transformations for encryption + var T1 = [0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a]; + var T2 = [0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616]; + var T3 = [0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16]; + var T4 = [0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c]; + + // Transformations for decryption + var T5 = [0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742]; + var T6 = [0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857]; + var T7 = [0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8]; + var T8 = [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]; + + // Transformations for decryption key expansion + var U1 = [0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]; + var U2 = [0x00000000, 0x0b0e090d, 0x161c121a, 0x1d121b17, 0x2c382434, 0x27362d39, 0x3a24362e, 0x312a3f23, 0x58704868, 0x537e4165, 0x4e6c5a72, 0x4562537f, 0x74486c5c, 0x7f466551, 0x62547e46, 0x695a774b, 0xb0e090d0, 0xbbee99dd, 0xa6fc82ca, 0xadf28bc7, 0x9cd8b4e4, 0x97d6bde9, 0x8ac4a6fe, 0x81caaff3, 0xe890d8b8, 0xe39ed1b5, 0xfe8ccaa2, 0xf582c3af, 0xc4a8fc8c, 0xcfa6f581, 0xd2b4ee96, 0xd9bae79b, 0x7bdb3bbb, 0x70d532b6, 0x6dc729a1, 0x66c920ac, 0x57e31f8f, 0x5ced1682, 0x41ff0d95, 0x4af10498, 0x23ab73d3, 0x28a57ade, 0x35b761c9, 0x3eb968c4, 0x0f9357e7, 0x049d5eea, 0x198f45fd, 0x12814cf0, 0xcb3bab6b, 0xc035a266, 0xdd27b971, 0xd629b07c, 0xe7038f5f, 0xec0d8652, 0xf11f9d45, 0xfa119448, 0x934be303, 0x9845ea0e, 0x8557f119, 0x8e59f814, 0xbf73c737, 0xb47dce3a, 0xa96fd52d, 0xa261dc20, 0xf6ad766d, 0xfda37f60, 0xe0b16477, 0xebbf6d7a, 0xda955259, 0xd19b5b54, 0xcc894043, 0xc787494e, 0xaedd3e05, 0xa5d33708, 0xb8c12c1f, 0xb3cf2512, 0x82e51a31, 0x89eb133c, 0x94f9082b, 0x9ff70126, 0x464de6bd, 0x4d43efb0, 0x5051f4a7, 0x5b5ffdaa, 0x6a75c289, 0x617bcb84, 0x7c69d093, 0x7767d99e, 0x1e3daed5, 0x1533a7d8, 0x0821bccf, 0x032fb5c2, 0x32058ae1, 0x390b83ec, 0x241998fb, 0x2f1791f6, 0x8d764dd6, 0x867844db, 0x9b6a5fcc, 0x906456c1, 0xa14e69e2, 0xaa4060ef, 0xb7527bf8, 0xbc5c72f5, 0xd50605be, 0xde080cb3, 0xc31a17a4, 0xc8141ea9, 0xf93e218a, 0xf2302887, 0xef223390, 0xe42c3a9d, 0x3d96dd06, 0x3698d40b, 0x2b8acf1c, 0x2084c611, 0x11aef932, 0x1aa0f03f, 0x07b2eb28, 0x0cbce225, 0x65e6956e, 0x6ee89c63, 0x73fa8774, 0x78f48e79, 0x49deb15a, 0x42d0b857, 0x5fc2a340, 0x54ccaa4d, 0xf741ecda, 0xfc4fe5d7, 0xe15dfec0, 0xea53f7cd, 0xdb79c8ee, 0xd077c1e3, 0xcd65daf4, 0xc66bd3f9, 0xaf31a4b2, 0xa43fadbf, 0xb92db6a8, 0xb223bfa5, 0x83098086, 0x8807898b, 0x9515929c, 0x9e1b9b91, 0x47a17c0a, 0x4caf7507, 0x51bd6e10, 0x5ab3671d, 0x6b99583e, 0x60975133, 0x7d854a24, 0x768b4329, 0x1fd13462, 0x14df3d6f, 0x09cd2678, 0x02c32f75, 0x33e91056, 0x38e7195b, 0x25f5024c, 0x2efb0b41, 0x8c9ad761, 0x8794de6c, 0x9a86c57b, 0x9188cc76, 0xa0a2f355, 0xabacfa58, 0xb6bee14f, 0xbdb0e842, 0xd4ea9f09, 0xdfe49604, 0xc2f68d13, 0xc9f8841e, 0xf8d2bb3d, 0xf3dcb230, 0xeecea927, 0xe5c0a02a, 0x3c7a47b1, 0x37744ebc, 0x2a6655ab, 0x21685ca6, 0x10426385, 0x1b4c6a88, 0x065e719f, 0x0d507892, 0x640a0fd9, 0x6f0406d4, 0x72161dc3, 0x791814ce, 0x48322bed, 0x433c22e0, 0x5e2e39f7, 0x552030fa, 0x01ec9ab7, 0x0ae293ba, 0x17f088ad, 0x1cfe81a0, 0x2dd4be83, 0x26dab78e, 0x3bc8ac99, 0x30c6a594, 0x599cd2df, 0x5292dbd2, 0x4f80c0c5, 0x448ec9c8, 0x75a4f6eb, 0x7eaaffe6, 0x63b8e4f1, 0x68b6edfc, 0xb10c0a67, 0xba02036a, 0xa710187d, 0xac1e1170, 0x9d342e53, 0x963a275e, 0x8b283c49, 0x80263544, 0xe97c420f, 0xe2724b02, 0xff605015, 0xf46e5918, 0xc544663b, 0xce4a6f36, 0xd3587421, 0xd8567d2c, 0x7a37a10c, 0x7139a801, 0x6c2bb316, 0x6725ba1b, 0x560f8538, 0x5d018c35, 0x40139722, 0x4b1d9e2f, 0x2247e964, 0x2949e069, 0x345bfb7e, 0x3f55f273, 0x0e7fcd50, 0x0571c45d, 0x1863df4a, 0x136dd647, 0xcad731dc, 0xc1d938d1, 0xdccb23c6, 0xd7c52acb, 0xe6ef15e8, 0xede11ce5, 0xf0f307f2, 0xfbfd0eff, 0x92a779b4, 0x99a970b9, 0x84bb6bae, 0x8fb562a3, 0xbe9f5d80, 0xb591548d, 0xa8834f9a, 0xa38d4697]; + var U3 = [0x00000000, 0x0d0b0e09, 0x1a161c12, 0x171d121b, 0x342c3824, 0x3927362d, 0x2e3a2436, 0x23312a3f, 0x68587048, 0x65537e41, 0x724e6c5a, 0x7f456253, 0x5c74486c, 0x517f4665, 0x4662547e, 0x4b695a77, 0xd0b0e090, 0xddbbee99, 0xcaa6fc82, 0xc7adf28b, 0xe49cd8b4, 0xe997d6bd, 0xfe8ac4a6, 0xf381caaf, 0xb8e890d8, 0xb5e39ed1, 0xa2fe8cca, 0xaff582c3, 0x8cc4a8fc, 0x81cfa6f5, 0x96d2b4ee, 0x9bd9bae7, 0xbb7bdb3b, 0xb670d532, 0xa16dc729, 0xac66c920, 0x8f57e31f, 0x825ced16, 0x9541ff0d, 0x984af104, 0xd323ab73, 0xde28a57a, 0xc935b761, 0xc43eb968, 0xe70f9357, 0xea049d5e, 0xfd198f45, 0xf012814c, 0x6bcb3bab, 0x66c035a2, 0x71dd27b9, 0x7cd629b0, 0x5fe7038f, 0x52ec0d86, 0x45f11f9d, 0x48fa1194, 0x03934be3, 0x0e9845ea, 0x198557f1, 0x148e59f8, 0x37bf73c7, 0x3ab47dce, 0x2da96fd5, 0x20a261dc, 0x6df6ad76, 0x60fda37f, 0x77e0b164, 0x7aebbf6d, 0x59da9552, 0x54d19b5b, 0x43cc8940, 0x4ec78749, 0x05aedd3e, 0x08a5d337, 0x1fb8c12c, 0x12b3cf25, 0x3182e51a, 0x3c89eb13, 0x2b94f908, 0x269ff701, 0xbd464de6, 0xb04d43ef, 0xa75051f4, 0xaa5b5ffd, 0x896a75c2, 0x84617bcb, 0x937c69d0, 0x9e7767d9, 0xd51e3dae, 0xd81533a7, 0xcf0821bc, 0xc2032fb5, 0xe132058a, 0xec390b83, 0xfb241998, 0xf62f1791, 0xd68d764d, 0xdb867844, 0xcc9b6a5f, 0xc1906456, 0xe2a14e69, 0xefaa4060, 0xf8b7527b, 0xf5bc5c72, 0xbed50605, 0xb3de080c, 0xa4c31a17, 0xa9c8141e, 0x8af93e21, 0x87f23028, 0x90ef2233, 0x9de42c3a, 0x063d96dd, 0x0b3698d4, 0x1c2b8acf, 0x112084c6, 0x3211aef9, 0x3f1aa0f0, 0x2807b2eb, 0x250cbce2, 0x6e65e695, 0x636ee89c, 0x7473fa87, 0x7978f48e, 0x5a49deb1, 0x5742d0b8, 0x405fc2a3, 0x4d54ccaa, 0xdaf741ec, 0xd7fc4fe5, 0xc0e15dfe, 0xcdea53f7, 0xeedb79c8, 0xe3d077c1, 0xf4cd65da, 0xf9c66bd3, 0xb2af31a4, 0xbfa43fad, 0xa8b92db6, 0xa5b223bf, 0x86830980, 0x8b880789, 0x9c951592, 0x919e1b9b, 0x0a47a17c, 0x074caf75, 0x1051bd6e, 0x1d5ab367, 0x3e6b9958, 0x33609751, 0x247d854a, 0x29768b43, 0x621fd134, 0x6f14df3d, 0x7809cd26, 0x7502c32f, 0x5633e910, 0x5b38e719, 0x4c25f502, 0x412efb0b, 0x618c9ad7, 0x6c8794de, 0x7b9a86c5, 0x769188cc, 0x55a0a2f3, 0x58abacfa, 0x4fb6bee1, 0x42bdb0e8, 0x09d4ea9f, 0x04dfe496, 0x13c2f68d, 0x1ec9f884, 0x3df8d2bb, 0x30f3dcb2, 0x27eecea9, 0x2ae5c0a0, 0xb13c7a47, 0xbc37744e, 0xab2a6655, 0xa621685c, 0x85104263, 0x881b4c6a, 0x9f065e71, 0x920d5078, 0xd9640a0f, 0xd46f0406, 0xc372161d, 0xce791814, 0xed48322b, 0xe0433c22, 0xf75e2e39, 0xfa552030, 0xb701ec9a, 0xba0ae293, 0xad17f088, 0xa01cfe81, 0x832dd4be, 0x8e26dab7, 0x993bc8ac, 0x9430c6a5, 0xdf599cd2, 0xd25292db, 0xc54f80c0, 0xc8448ec9, 0xeb75a4f6, 0xe67eaaff, 0xf163b8e4, 0xfc68b6ed, 0x67b10c0a, 0x6aba0203, 0x7da71018, 0x70ac1e11, 0x539d342e, 0x5e963a27, 0x498b283c, 0x44802635, 0x0fe97c42, 0x02e2724b, 0x15ff6050, 0x18f46e59, 0x3bc54466, 0x36ce4a6f, 0x21d35874, 0x2cd8567d, 0x0c7a37a1, 0x017139a8, 0x166c2bb3, 0x1b6725ba, 0x38560f85, 0x355d018c, 0x22401397, 0x2f4b1d9e, 0x642247e9, 0x692949e0, 0x7e345bfb, 0x733f55f2, 0x500e7fcd, 0x5d0571c4, 0x4a1863df, 0x47136dd6, 0xdccad731, 0xd1c1d938, 0xc6dccb23, 0xcbd7c52a, 0xe8e6ef15, 0xe5ede11c, 0xf2f0f307, 0xfffbfd0e, 0xb492a779, 0xb999a970, 0xae84bb6b, 0xa38fb562, 0x80be9f5d, 0x8db59154, 0x9aa8834f, 0x97a38d46]; + var U4 = [0x00000000, 0x090d0b0e, 0x121a161c, 0x1b171d12, 0x24342c38, 0x2d392736, 0x362e3a24, 0x3f23312a, 0x48685870, 0x4165537e, 0x5a724e6c, 0x537f4562, 0x6c5c7448, 0x65517f46, 0x7e466254, 0x774b695a, 0x90d0b0e0, 0x99ddbbee, 0x82caa6fc, 0x8bc7adf2, 0xb4e49cd8, 0xbde997d6, 0xa6fe8ac4, 0xaff381ca, 0xd8b8e890, 0xd1b5e39e, 0xcaa2fe8c, 0xc3aff582, 0xfc8cc4a8, 0xf581cfa6, 0xee96d2b4, 0xe79bd9ba, 0x3bbb7bdb, 0x32b670d5, 0x29a16dc7, 0x20ac66c9, 0x1f8f57e3, 0x16825ced, 0x0d9541ff, 0x04984af1, 0x73d323ab, 0x7ade28a5, 0x61c935b7, 0x68c43eb9, 0x57e70f93, 0x5eea049d, 0x45fd198f, 0x4cf01281, 0xab6bcb3b, 0xa266c035, 0xb971dd27, 0xb07cd629, 0x8f5fe703, 0x8652ec0d, 0x9d45f11f, 0x9448fa11, 0xe303934b, 0xea0e9845, 0xf1198557, 0xf8148e59, 0xc737bf73, 0xce3ab47d, 0xd52da96f, 0xdc20a261, 0x766df6ad, 0x7f60fda3, 0x6477e0b1, 0x6d7aebbf, 0x5259da95, 0x5b54d19b, 0x4043cc89, 0x494ec787, 0x3e05aedd, 0x3708a5d3, 0x2c1fb8c1, 0x2512b3cf, 0x1a3182e5, 0x133c89eb, 0x082b94f9, 0x01269ff7, 0xe6bd464d, 0xefb04d43, 0xf4a75051, 0xfdaa5b5f, 0xc2896a75, 0xcb84617b, 0xd0937c69, 0xd99e7767, 0xaed51e3d, 0xa7d81533, 0xbccf0821, 0xb5c2032f, 0x8ae13205, 0x83ec390b, 0x98fb2419, 0x91f62f17, 0x4dd68d76, 0x44db8678, 0x5fcc9b6a, 0x56c19064, 0x69e2a14e, 0x60efaa40, 0x7bf8b752, 0x72f5bc5c, 0x05bed506, 0x0cb3de08, 0x17a4c31a, 0x1ea9c814, 0x218af93e, 0x2887f230, 0x3390ef22, 0x3a9de42c, 0xdd063d96, 0xd40b3698, 0xcf1c2b8a, 0xc6112084, 0xf93211ae, 0xf03f1aa0, 0xeb2807b2, 0xe2250cbc, 0x956e65e6, 0x9c636ee8, 0x877473fa, 0x8e7978f4, 0xb15a49de, 0xb85742d0, 0xa3405fc2, 0xaa4d54cc, 0xecdaf741, 0xe5d7fc4f, 0xfec0e15d, 0xf7cdea53, 0xc8eedb79, 0xc1e3d077, 0xdaf4cd65, 0xd3f9c66b, 0xa4b2af31, 0xadbfa43f, 0xb6a8b92d, 0xbfa5b223, 0x80868309, 0x898b8807, 0x929c9515, 0x9b919e1b, 0x7c0a47a1, 0x75074caf, 0x6e1051bd, 0x671d5ab3, 0x583e6b99, 0x51336097, 0x4a247d85, 0x4329768b, 0x34621fd1, 0x3d6f14df, 0x267809cd, 0x2f7502c3, 0x105633e9, 0x195b38e7, 0x024c25f5, 0x0b412efb, 0xd7618c9a, 0xde6c8794, 0xc57b9a86, 0xcc769188, 0xf355a0a2, 0xfa58abac, 0xe14fb6be, 0xe842bdb0, 0x9f09d4ea, 0x9604dfe4, 0x8d13c2f6, 0x841ec9f8, 0xbb3df8d2, 0xb230f3dc, 0xa927eece, 0xa02ae5c0, 0x47b13c7a, 0x4ebc3774, 0x55ab2a66, 0x5ca62168, 0x63851042, 0x6a881b4c, 0x719f065e, 0x78920d50, 0x0fd9640a, 0x06d46f04, 0x1dc37216, 0x14ce7918, 0x2bed4832, 0x22e0433c, 0x39f75e2e, 0x30fa5520, 0x9ab701ec, 0x93ba0ae2, 0x88ad17f0, 0x81a01cfe, 0xbe832dd4, 0xb78e26da, 0xac993bc8, 0xa59430c6, 0xd2df599c, 0xdbd25292, 0xc0c54f80, 0xc9c8448e, 0xf6eb75a4, 0xffe67eaa, 0xe4f163b8, 0xedfc68b6, 0x0a67b10c, 0x036aba02, 0x187da710, 0x1170ac1e, 0x2e539d34, 0x275e963a, 0x3c498b28, 0x35448026, 0x420fe97c, 0x4b02e272, 0x5015ff60, 0x5918f46e, 0x663bc544, 0x6f36ce4a, 0x7421d358, 0x7d2cd856, 0xa10c7a37, 0xa8017139, 0xb3166c2b, 0xba1b6725, 0x8538560f, 0x8c355d01, 0x97224013, 0x9e2f4b1d, 0xe9642247, 0xe0692949, 0xfb7e345b, 0xf2733f55, 0xcd500e7f, 0xc45d0571, 0xdf4a1863, 0xd647136d, 0x31dccad7, 0x38d1c1d9, 0x23c6dccb, 0x2acbd7c5, 0x15e8e6ef, 0x1ce5ede1, 0x07f2f0f3, 0x0efffbfd, 0x79b492a7, 0x70b999a9, 0x6bae84bb, 0x62a38fb5, 0x5d80be9f, 0x548db591, 0x4f9aa883, 0x4697a38d]; + + function convertToInt32(bytes) { + var result = []; + for (var i = 0; i < bytes.length; i += 4) { + result.push( + (bytes[i ] << 24) | + (bytes[i + 1] << 16) | + (bytes[i + 2] << 8) | + bytes[i + 3] + ); + } + return result; + } + + var AES = function(key) { + if (!(this instanceof AES)) { + throw Error('AES must be instanitated with `new`'); + } + + Object.defineProperty(this, 'key', { + value: coerceArray(key, true) + }); + + this._prepare(); + } + + + AES.prototype._prepare = function() { + + var rounds = numberOfRounds[this.key.length]; + if (rounds == null) { + throw new Error('invalid key size (must be 16, 24 or 32 bytes)'); + } + + // encryption round keys + this._Ke = []; + + // decryption round keys + this._Kd = []; + + for (var i = 0; i <= rounds; i++) { + this._Ke.push([0, 0, 0, 0]); + this._Kd.push([0, 0, 0, 0]); + } + + var roundKeyCount = (rounds + 1) * 4; + var KC = this.key.length / 4; + + // convert the key into ints + var tk = convertToInt32(this.key); + + // copy values into round key arrays + var index; + for (var i = 0; i < KC; i++) { + index = i >> 2; + this._Ke[index][i % 4] = tk[i]; + this._Kd[rounds - index][i % 4] = tk[i]; + } + + // key expansion (fips-197 section 5.2) + var rconpointer = 0; + var t = KC, tt; + while (t < roundKeyCount) { + tt = tk[KC - 1]; + tk[0] ^= ((S[(tt >> 16) & 0xFF] << 24) ^ + (S[(tt >> 8) & 0xFF] << 16) ^ + (S[ tt & 0xFF] << 8) ^ + S[(tt >> 24) & 0xFF] ^ + (rcon[rconpointer] << 24)); + rconpointer += 1; + + // key expansion (for non-256 bit) + if (KC != 8) { + for (var i = 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + + // key expansion for 256-bit keys is "slightly different" (fips-197) + } else { + for (var i = 1; i < (KC / 2); i++) { + tk[i] ^= tk[i - 1]; + } + tt = tk[(KC / 2) - 1]; + + tk[KC / 2] ^= (S[ tt & 0xFF] ^ + (S[(tt >> 8) & 0xFF] << 8) ^ + (S[(tt >> 16) & 0xFF] << 16) ^ + (S[(tt >> 24) & 0xFF] << 24)); + + for (var i = (KC / 2) + 1; i < KC; i++) { + tk[i] ^= tk[i - 1]; + } + } + + // copy values into round key arrays + var i = 0, r, c; + while (i < KC && t < roundKeyCount) { + r = t >> 2; + c = t % 4; + this._Ke[r][c] = tk[i]; + this._Kd[rounds - r][c] = tk[i++]; + t++; + } + } + + // inverse-cipher-ify the decryption round key (fips-197 section 5.3) + for (var r = 1; r < rounds; r++) { + for (var c = 0; c < 4; c++) { + tt = this._Kd[r][c]; + this._Kd[r][c] = (U1[(tt >> 24) & 0xFF] ^ + U2[(tt >> 16) & 0xFF] ^ + U3[(tt >> 8) & 0xFF] ^ + U4[ tt & 0xFF]); + } + } + } + + AES.prototype.encrypt = function(plaintext) { + if (plaintext.length != 16) { + throw new Error('invalid plaintext size (must be 16 bytes)'); + } + + var rounds = this._Ke.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(plaintext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Ke[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T1[(t[ i ] >> 24) & 0xff] ^ + T2[(t[(i + 1) % 4] >> 16) & 0xff] ^ + T3[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T4[ t[(i + 3) % 4] & 0xff] ^ + this._Ke[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Ke[rounds][i]; + result[4 * i ] = (S[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (S[(t[(i + 1) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (S[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (S[ t[(i + 3) % 4] & 0xff] ^ tt ) & 0xff; + } + + return result; + } + + AES.prototype.decrypt = function(ciphertext) { + if (ciphertext.length != 16) { + throw new Error('invalid ciphertext size (must be 16 bytes)'); + } + + var rounds = this._Kd.length - 1; + var a = [0, 0, 0, 0]; + + // convert plaintext to (ints ^ key) + var t = convertToInt32(ciphertext); + for (var i = 0; i < 4; i++) { + t[i] ^= this._Kd[0][i]; + } + + // apply round transforms + for (var r = 1; r < rounds; r++) { + for (var i = 0; i < 4; i++) { + a[i] = (T5[(t[ i ] >> 24) & 0xff] ^ + T6[(t[(i + 3) % 4] >> 16) & 0xff] ^ + T7[(t[(i + 2) % 4] >> 8) & 0xff] ^ + T8[ t[(i + 1) % 4] & 0xff] ^ + this._Kd[r][i]); + } + t = a.slice(); + } + + // the last round is special + var result = createArray(16), tt; + for (var i = 0; i < 4; i++) { + tt = this._Kd[rounds][i]; + result[4 * i ] = (Si[(t[ i ] >> 24) & 0xff] ^ (tt >> 24)) & 0xff; + result[4 * i + 1] = (Si[(t[(i + 3) % 4] >> 16) & 0xff] ^ (tt >> 16)) & 0xff; + result[4 * i + 2] = (Si[(t[(i + 2) % 4] >> 8) & 0xff] ^ (tt >> 8)) & 0xff; + result[4 * i + 3] = (Si[ t[(i + 1) % 4] & 0xff] ^ tt ) & 0xff; + } + + return result; + } + + + /** + * Mode Of Operation - Electonic Codebook (ECB) + */ + var ModeOfOperationECB = function(key) { + if (!(this instanceof ModeOfOperationECB)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Electronic Code Block"; + this.name = "ecb"; + + this._aes = new AES(key); + } + + ModeOfOperationECB.prototype.encrypt = function(plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + block = this._aes.encrypt(block); + copyArray(block, ciphertext, i); + } + + return ciphertext; + } + + ModeOfOperationECB.prototype.decrypt = function(ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + copyArray(block, plaintext, i); + } + + return plaintext; + } + + + /** + * Mode Of Operation - Cipher Block Chaining (CBC) + */ + var ModeOfOperationCBC = function(key, iv) { + if (!(this instanceof ModeOfOperationCBC)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Cipher Block Chaining"; + this.name = "cbc"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } + + this._lastCipherblock = coerceArray(iv, true); + + this._aes = new AES(key); + } + + ModeOfOperationCBC.prototype.encrypt = function(plaintext) { + plaintext = coerceArray(plaintext); + + if ((plaintext.length % 16) !== 0) { + throw new Error('invalid plaintext size (must be multiple of 16 bytes)'); + } + + var ciphertext = createArray(plaintext.length); + var block = createArray(16); + + for (var i = 0; i < plaintext.length; i += 16) { + copyArray(plaintext, block, 0, i, i + 16); + + for (var j = 0; j < 16; j++) { + block[j] ^= this._lastCipherblock[j]; + } + + this._lastCipherblock = this._aes.encrypt(block); + copyArray(this._lastCipherblock, ciphertext, i); + } + + return ciphertext; + } + + ModeOfOperationCBC.prototype.decrypt = function(ciphertext) { + ciphertext = coerceArray(ciphertext); + + if ((ciphertext.length % 16) !== 0) { + throw new Error('invalid ciphertext size (must be multiple of 16 bytes)'); + } + + var plaintext = createArray(ciphertext.length); + var block = createArray(16); + + for (var i = 0; i < ciphertext.length; i += 16) { + copyArray(ciphertext, block, 0, i, i + 16); + block = this._aes.decrypt(block); + + for (var j = 0; j < 16; j++) { + plaintext[i + j] = block[j] ^ this._lastCipherblock[j]; + } + + copyArray(ciphertext, this._lastCipherblock, 0, i, i + 16); + } + + return plaintext; + } + + + /** + * Mode Of Operation - Cipher Feedback (CFB) + */ + var ModeOfOperationCFB = function(key, iv, segmentSize) { + if (!(this instanceof ModeOfOperationCFB)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Cipher Feedback"; + this.name = "cfb"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 size)'); + } + + if (!segmentSize) { segmentSize = 1; } + + this.segmentSize = segmentSize; + + this._shiftRegister = coerceArray(iv, true); + + this._aes = new AES(key); + } + + ModeOfOperationCFB.prototype.encrypt = function(plaintext) { + if ((plaintext.length % this.segmentSize) != 0) { + throw new Error('invalid plaintext size (must be segmentSize bytes)'); + } + + var encrypted = coerceArray(plaintext, true); + + var xorSegment; + for (var i = 0; i < encrypted.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + for (var j = 0; j < this.segmentSize; j++) { + encrypted[i + j] ^= xorSegment[j]; + } + + // Shift the register + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(encrypted, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } + + return encrypted; + } + + ModeOfOperationCFB.prototype.decrypt = function(ciphertext) { + if ((ciphertext.length % this.segmentSize) != 0) { + throw new Error('invalid ciphertext size (must be segmentSize bytes)'); + } + + var plaintext = coerceArray(ciphertext, true); + + var xorSegment; + for (var i = 0; i < plaintext.length; i += this.segmentSize) { + xorSegment = this._aes.encrypt(this._shiftRegister); + + for (var j = 0; j < this.segmentSize; j++) { + plaintext[i + j] ^= xorSegment[j]; + } + + // Shift the register + copyArray(this._shiftRegister, this._shiftRegister, 0, this.segmentSize); + copyArray(ciphertext, this._shiftRegister, 16 - this.segmentSize, i, i + this.segmentSize); + } + + return plaintext; + } + + /** + * Mode Of Operation - Output Feedback (OFB) + */ + var ModeOfOperationOFB = function(key, iv) { + if (!(this instanceof ModeOfOperationOFB)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Output Feedback"; + this.name = "ofb"; + + if (!iv) { + iv = createArray(16); + + } else if (iv.length != 16) { + throw new Error('invalid initialation vector size (must be 16 bytes)'); + } + + this._lastPrecipher = coerceArray(iv, true); + this._lastPrecipherIndex = 16; + + this._aes = new AES(key); + } + + ModeOfOperationOFB.prototype.encrypt = function(plaintext) { + var encrypted = coerceArray(plaintext, true); + + for (var i = 0; i < encrypted.length; i++) { + if (this._lastPrecipherIndex === 16) { + this._lastPrecipher = this._aes.encrypt(this._lastPrecipher); + this._lastPrecipherIndex = 0; + } + encrypted[i] ^= this._lastPrecipher[this._lastPrecipherIndex++]; + } + + return encrypted; + } + + // Decryption is symetric + ModeOfOperationOFB.prototype.decrypt = ModeOfOperationOFB.prototype.encrypt; + + + /** + * Counter object for CTR common mode of operation + */ + var Counter = function(initialValue) { + if (!(this instanceof Counter)) { + throw Error('Counter must be instanitated with `new`'); + } + + // We allow 0, but anything false-ish uses the default 1 + if (initialValue !== 0 && !initialValue) { initialValue = 1; } + + if (typeof(initialValue) === 'number') { + this._counter = createArray(16); + this.setValue(initialValue); + + } else { + this.setBytes(initialValue); + } + } + + Counter.prototype.setValue = function(value) { + if (typeof(value) !== 'number' || parseInt(value) != value) { + throw new Error('invalid counter value (must be an integer)'); + } + + for (var index = 15; index >= 0; --index) { + this._counter[index] = value % 256; + value = value >> 8; + } + } + + Counter.prototype.setBytes = function(bytes) { + bytes = coerceArray(bytes, true); + + if (bytes.length != 16) { + throw new Error('invalid counter bytes size (must be 16 bytes)'); + } + + this._counter = bytes; + }; + + Counter.prototype.increment = function() { + for (var i = 15; i >= 0; i--) { + if (this._counter[i] === 255) { + this._counter[i] = 0; + } else { + this._counter[i]++; + break; + } + } + } + + + /** + * Mode Of Operation - Counter (CTR) + */ + var ModeOfOperationCTR = function(key, counter) { + if (!(this instanceof ModeOfOperationCTR)) { + throw Error('AES must be instanitated with `new`'); + } + + this.description = "Counter"; + this.name = "ctr"; + + if (!(counter instanceof Counter)) { + counter = new Counter(counter) + } + + this._counter = counter; + + this._remainingCounter = null; + this._remainingCounterIndex = 16; + + this._aes = new AES(key); + } + + ModeOfOperationCTR.prototype.encrypt = function(plaintext) { + var encrypted = coerceArray(plaintext, true); + + for (var i = 0; i < encrypted.length; i++) { + if (this._remainingCounterIndex === 16) { + this._remainingCounter = this._aes.encrypt(this._counter._counter); + this._remainingCounterIndex = 0; + this._counter.increment(); + } + encrypted[i] ^= this._remainingCounter[this._remainingCounterIndex++]; + } + + return encrypted; + } + + // Decryption is symetric + ModeOfOperationCTR.prototype.decrypt = ModeOfOperationCTR.prototype.encrypt; + + + /////////////////////// + // Padding + + // See:https://tools.ietf.org/html/rfc2315 + function pkcs7pad(data) { + data = coerceArray(data, true); + var padder = 16 - (data.length % 16); + var result = createArray(data.length + padder); + copyArray(data, result); + for (var i = data.length; i < result.length; i++) { + result[i] = padder; + } + return result; + } + + function pkcs7strip(data) { + data = coerceArray(data, true); + if (data.length < 16) { throw new Error('PKCS#7 invalid length'); } + + var padder = data[data.length - 1]; + if (padder > 16) { throw new Error('PKCS#7 padding byte out of range'); } + + var length = data.length - padder; + for (var i = 0; i < padder; i++) { + if (data[length + i] !== padder) { + throw new Error('PKCS#7 invalid padding byte'); + } + } + + var result = createArray(length); + copyArray(data, result, 0, 0, length); + return result; + } + + /////////////////////// + // Exporting + + + // The block cipher + var aesjs = { + AES: AES, + Counter: Counter, + + ModeOfOperation: { + ecb: ModeOfOperationECB, + cbc: ModeOfOperationCBC, + cfb: ModeOfOperationCFB, + ofb: ModeOfOperationOFB, + ctr: ModeOfOperationCTR + }, + + utils: { + hex: convertHex, + utf8: convertUtf8 + }, + + padding: { + pkcs7: { + pad: pkcs7pad, + strip: pkcs7strip + } + }, + + _arrayTest: { + coerceArray: coerceArray, + createArray: createArray, + copyArray: copyArray, + } + }; + + + // node.js + if (true) { + module.exports = aesjs + + // RequireJS/AMD + // http://www.requirejs.org/docs/api.html + // https://github.com/amdjs/amdjs-api/wiki/AMD + } else {} + + +})(this); + + +/***/ }), + +/***/ "./node_modules/bech32/index.js": +/*!**************************************!*\ + !*** ./node_modules/bech32/index.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var ALPHABET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' + +// pre-compute lookup table +var ALPHABET_MAP = {} +for (var z = 0; z < ALPHABET.length; z++) { + var x = ALPHABET.charAt(z) + + if (ALPHABET_MAP[x] !== undefined) throw new TypeError(x + ' is ambiguous') + ALPHABET_MAP[x] = z +} + +function polymodStep (pre) { + var b = pre >> 25 + return ((pre & 0x1FFFFFF) << 5) ^ + (-((b >> 0) & 1) & 0x3b6a57b2) ^ + (-((b >> 1) & 1) & 0x26508e6d) ^ + (-((b >> 2) & 1) & 0x1ea119fa) ^ + (-((b >> 3) & 1) & 0x3d4233dd) ^ + (-((b >> 4) & 1) & 0x2a1462b3) +} + +function prefixChk (prefix) { + var chk = 1 + for (var i = 0; i < prefix.length; ++i) { + var c = prefix.charCodeAt(i) + if (c < 33 || c > 126) return 'Invalid prefix (' + prefix + ')' + + chk = polymodStep(chk) ^ (c >> 5) + } + chk = polymodStep(chk) + + for (i = 0; i < prefix.length; ++i) { + var v = prefix.charCodeAt(i) + chk = polymodStep(chk) ^ (v & 0x1f) + } + return chk +} + +function encode (prefix, words, LIMIT) { + LIMIT = LIMIT || 90 + if ((prefix.length + 7 + words.length) > LIMIT) throw new TypeError('Exceeds length limit') + + prefix = prefix.toLowerCase() + + // determine chk mod + var chk = prefixChk(prefix) + if (typeof chk === 'string') throw new Error(chk) + + var result = prefix + '1' + for (var i = 0; i < words.length; ++i) { + var x = words[i] + if ((x >> 5) !== 0) throw new Error('Non 5-bit word') + + chk = polymodStep(chk) ^ x + result += ALPHABET.charAt(x) + } + + for (i = 0; i < 6; ++i) { + chk = polymodStep(chk) + } + chk ^= 1 + + for (i = 0; i < 6; ++i) { + var v = (chk >> ((5 - i) * 5)) & 0x1f + result += ALPHABET.charAt(v) + } + + return result +} + +function __decode (str, LIMIT) { + LIMIT = LIMIT || 90 + if (str.length < 8) return str + ' too short' + if (str.length > LIMIT) return 'Exceeds length limit' + + // don't allow mixed case + var lowered = str.toLowerCase() + var uppered = str.toUpperCase() + if (str !== lowered && str !== uppered) return 'Mixed-case string ' + str + str = lowered + + var split = str.lastIndexOf('1') + if (split === -1) return 'No separator character for ' + str + if (split === 0) return 'Missing prefix for ' + str + + var prefix = str.slice(0, split) + var wordChars = str.slice(split + 1) + if (wordChars.length < 6) return 'Data too short' + + var chk = prefixChk(prefix) + if (typeof chk === 'string') return chk + + var words = [] + for (var i = 0; i < wordChars.length; ++i) { + var c = wordChars.charAt(i) + var v = ALPHABET_MAP[c] + if (v === undefined) return 'Unknown character ' + c + chk = polymodStep(chk) ^ v + + // not in the checksum? + if (i + 6 >= wordChars.length) continue + words.push(v) + } + + if (chk !== 1) return 'Invalid checksum for ' + str + return { prefix: prefix, words: words } +} + +function decodeUnsafe () { + var res = __decode.apply(null, arguments) + if (typeof res === 'object') return res +} + +function decode (str) { + var res = __decode.apply(null, arguments) + if (typeof res === 'object') return res + + throw new Error(res) +} + +function convert (data, inBits, outBits, pad) { + var value = 0 + var bits = 0 + var maxV = (1 << outBits) - 1 + + var result = [] + for (var i = 0; i < data.length; ++i) { + value = (value << inBits) | data[i] + bits += inBits + + while (bits >= outBits) { + bits -= outBits + result.push((value >> bits) & maxV) + } + } + + if (pad) { + if (bits > 0) { + result.push((value << (outBits - bits)) & maxV) + } + } else { + if (bits >= inBits) return 'Excess padding' + if ((value << (outBits - bits)) & maxV) return 'Non-zero padding' + } + + return result +} + +function toWordsUnsafe (bytes) { + var res = convert(bytes, 8, 5, true) + if (Array.isArray(res)) return res +} + +function toWords (bytes) { + var res = convert(bytes, 8, 5, true) + if (Array.isArray(res)) return res + + throw new Error(res) +} + +function fromWordsUnsafe (words) { + var res = convert(words, 5, 8, false) + if (Array.isArray(res)) return res +} + +function fromWords (words) { + var res = convert(words, 5, 8, false) + if (Array.isArray(res)) return res + + throw new Error(res) +} + +module.exports = { + decodeUnsafe: decodeUnsafe, + decode: decode, + encode: encode, + toWordsUnsafe: toWordsUnsafe, + toWords: toWords, + fromWordsUnsafe: fromWordsUnsafe, + fromWords: fromWords +} + + +/***/ }), + +/***/ "./node_modules/bn.js/lib/bn.js": +/*!**************************************!*\ + !*** ./node_modules/bn.js/lib/bn.js ***! + \**************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module) {(function (module, exports) { + 'use strict'; + + // Utils + function assert (val, msg) { + if (!val) throw new Error(msg || 'Assertion failed'); + } + + // Could use `inherits` module, but don't want to move from single file + // architecture yet. + function inherits (ctor, superCtor) { + ctor.super_ = superCtor; + var TempCtor = function () {}; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + + // BN + + function BN (number, base, endian) { + if (BN.isBN(number)) { + return number; + } + + this.negative = 0; + this.words = null; + this.length = 0; + + // Reduction context + this.red = null; + + if (number !== null) { + if (base === 'le' || base === 'be') { + endian = base; + base = 10; + } + + this._init(number || 0, base || 10, endian || 'be'); + } + } + if (typeof module === 'object') { + module.exports = BN; + } else { + exports.BN = BN; + } + + BN.BN = BN; + BN.wordSize = 26; + + var Buffer; + try { + Buffer = __webpack_require__(/*! buffer */ 1).Buffer; + } catch (e) { + } + + BN.isBN = function isBN (num) { + if (num instanceof BN) { + return true; + } + + return num !== null && typeof num === 'object' && + num.constructor.wordSize === BN.wordSize && Array.isArray(num.words); + }; + + BN.max = function max (left, right) { + if (left.cmp(right) > 0) return left; + return right; + }; + + BN.min = function min (left, right) { + if (left.cmp(right) < 0) return left; + return right; + }; + + BN.prototype._init = function init (number, base, endian) { + if (typeof number === 'number') { + return this._initNumber(number, base, endian); + } + + if (typeof number === 'object') { + return this._initArray(number, base, endian); + } + + if (base === 'hex') { + base = 16; + } + assert(base === (base | 0) && base >= 2 && base <= 36); + + number = number.toString().replace(/\s+/g, ''); + var start = 0; + if (number[0] === '-') { + start++; + } + + if (base === 16) { + this._parseHex(number, start); + } else { + this._parseBase(number, base, start); + } + + if (number[0] === '-') { + this.negative = 1; + } + + this.strip(); + + if (endian !== 'le') return; + + this._initArray(this.toArray(), base, endian); + }; + + BN.prototype._initNumber = function _initNumber (number, base, endian) { + if (number < 0) { + this.negative = 1; + number = -number; + } + if (number < 0x4000000) { + this.words = [ number & 0x3ffffff ]; + this.length = 1; + } else if (number < 0x10000000000000) { + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff + ]; + this.length = 2; + } else { + assert(number < 0x20000000000000); // 2 ^ 53 (unsafe) + this.words = [ + number & 0x3ffffff, + (number / 0x4000000) & 0x3ffffff, + 1 + ]; + this.length = 3; + } + + if (endian !== 'le') return; + + // Reverse the bytes + this._initArray(this.toArray(), base, endian); + }; + + BN.prototype._initArray = function _initArray (number, base, endian) { + // Perhaps a Uint8Array + assert(typeof number.length === 'number'); + if (number.length <= 0) { + this.words = [ 0 ]; + this.length = 1; + return this; + } + + this.length = Math.ceil(number.length / 3); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + + var j, w; + var off = 0; + if (endian === 'be') { + for (i = number.length - 1, j = 0; i >= 0; i -= 3) { + w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } else if (endian === 'le') { + for (i = 0, j = 0; i < number.length; i += 3) { + w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + } + return this.strip(); + }; + + function parseHex (str, start, end) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + + r <<= 4; + + // 'a' - 'f' + if (c >= 49 && c <= 54) { + r |= c - 49 + 0xa; + + // 'A' - 'F' + } else if (c >= 17 && c <= 22) { + r |= c - 17 + 0xa; + + // '0' - '9' + } else { + r |= c & 0xf; + } + } + return r; + } + + BN.prototype._parseHex = function _parseHex (number, start) { + // Create possibly bigger array to ensure that it fits the number + this.length = Math.ceil((number.length - start) / 6); + this.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + this.words[i] = 0; + } + + var j, w; + // Scan 24-bit chunks and add them to the number + var off = 0; + for (i = number.length - 6, j = 0; i >= start; i -= 6) { + w = parseHex(number, i, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + // NOTE: `0x3fffff` is intentional here, 26bits max shift + 24bit hex limb + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + off += 24; + if (off >= 26) { + off -= 26; + j++; + } + } + if (i + 6 !== start) { + w = parseHex(number, start, i + 6); + this.words[j] |= (w << off) & 0x3ffffff; + this.words[j + 1] |= w >>> (26 - off) & 0x3fffff; + } + this.strip(); + }; + + function parseBase (str, start, end, mul) { + var r = 0; + var len = Math.min(str.length, end); + for (var i = start; i < len; i++) { + var c = str.charCodeAt(i) - 48; + + r *= mul; + + // 'a' + if (c >= 49) { + r += c - 49 + 0xa; + + // 'A' + } else if (c >= 17) { + r += c - 17 + 0xa; + + // '0' - '9' + } else { + r += c; + } + } + return r; + } + + BN.prototype._parseBase = function _parseBase (number, base, start) { + // Initialize as zero + this.words = [ 0 ]; + this.length = 1; + + // Find length of limb in base + for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) { + limbLen++; + } + limbLen--; + limbPow = (limbPow / base) | 0; + + var total = number.length - start; + var mod = total % limbLen; + var end = Math.min(total, total - mod) + start; + + var word = 0; + for (var i = start; i < end; i += limbLen) { + word = parseBase(number, i, i + limbLen, base); + + this.imuln(limbPow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + + if (mod !== 0) { + var pow = 1; + word = parseBase(number, i, number.length, base); + + for (i = 0; i < mod; i++) { + pow *= base; + } + + this.imuln(pow); + if (this.words[0] + word < 0x4000000) { + this.words[0] += word; + } else { + this._iaddn(word); + } + } + }; + + BN.prototype.copy = function copy (dest) { + dest.words = new Array(this.length); + for (var i = 0; i < this.length; i++) { + dest.words[i] = this.words[i]; + } + dest.length = this.length; + dest.negative = this.negative; + dest.red = this.red; + }; + + BN.prototype.clone = function clone () { + var r = new BN(null); + this.copy(r); + return r; + }; + + BN.prototype._expand = function _expand (size) { + while (this.length < size) { + this.words[this.length++] = 0; + } + return this; + }; + + // Remove leading `0` from `this` + BN.prototype.strip = function strip () { + while (this.length > 1 && this.words[this.length - 1] === 0) { + this.length--; + } + return this._normSign(); + }; + + BN.prototype._normSign = function _normSign () { + // -0 = 0 + if (this.length === 1 && this.words[0] === 0) { + this.negative = 0; + } + return this; + }; + + BN.prototype.inspect = function inspect () { + return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>'; + }; + + /* + + var zeros = []; + var groupSizes = []; + var groupBases = []; + + var s = ''; + var i = -1; + while (++i < BN.wordSize) { + zeros[i] = s; + s += '0'; + } + groupSizes[0] = 0; + groupSizes[1] = 0; + groupBases[0] = 0; + groupBases[1] = 0; + var base = 2 - 1; + while (++base < 36 + 1) { + var groupSize = 0; + var groupBase = 1; + while (groupBase < (1 << BN.wordSize) / base) { + groupBase *= base; + groupSize += 1; + } + groupSizes[base] = groupSize; + groupBases[base] = groupBase; + } + + */ + + var zeros = [ + '', + '0', + '00', + '000', + '0000', + '00000', + '000000', + '0000000', + '00000000', + '000000000', + '0000000000', + '00000000000', + '000000000000', + '0000000000000', + '00000000000000', + '000000000000000', + '0000000000000000', + '00000000000000000', + '000000000000000000', + '0000000000000000000', + '00000000000000000000', + '000000000000000000000', + '0000000000000000000000', + '00000000000000000000000', + '000000000000000000000000', + '0000000000000000000000000' + ]; + + var groupSizes = [ + 0, 0, + 25, 16, 12, 11, 10, 9, 8, + 8, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 5, 5, + 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5 + ]; + + var groupBases = [ + 0, 0, + 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, + 43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625, + 16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632, + 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, + 24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176 + ]; + + BN.prototype.toString = function toString (base, padding) { + base = base || 10; + padding = padding | 0 || 1; + + var out; + if (base === 16 || base === 'hex') { + out = ''; + var off = 0; + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = this.words[i]; + var word = (((w << off) | carry) & 0xffffff).toString(16); + carry = (w >>> (24 - off)) & 0xffffff; + if (carry !== 0 || i !== this.length - 1) { + out = zeros[6 - word.length] + word + out; + } else { + out = word + out; + } + off += 2; + if (off >= 26) { + off -= 26; + i--; + } + } + if (carry !== 0) { + out = carry.toString(16) + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } + + if (base === (base | 0) && base >= 2 && base <= 36) { + // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base)); + var groupSize = groupSizes[base]; + // var groupBase = Math.pow(base, groupSize); + var groupBase = groupBases[base]; + out = ''; + var c = this.clone(); + c.negative = 0; + while (!c.isZero()) { + var r = c.modn(groupBase).toString(base); + c = c.idivn(groupBase); + + if (!c.isZero()) { + out = zeros[groupSize - r.length] + r + out; + } else { + out = r + out; + } + } + if (this.isZero()) { + out = '0' + out; + } + while (out.length % padding !== 0) { + out = '0' + out; + } + if (this.negative !== 0) { + out = '-' + out; + } + return out; + } + + assert(false, 'Base should be between 2 and 36'); + }; + + BN.prototype.toNumber = function toNumber () { + var ret = this.words[0]; + if (this.length === 2) { + ret += this.words[1] * 0x4000000; + } else if (this.length === 3 && this.words[2] === 0x01) { + // NOTE: at this stage it is known that the top bit is set + ret += 0x10000000000000 + (this.words[1] * 0x4000000); + } else if (this.length > 2) { + assert(false, 'Number can only safely store up to 53 bits'); + } + return (this.negative !== 0) ? -ret : ret; + }; + + BN.prototype.toJSON = function toJSON () { + return this.toString(16); + }; + + BN.prototype.toBuffer = function toBuffer (endian, length) { + assert(typeof Buffer !== 'undefined'); + return this.toArrayLike(Buffer, endian, length); + }; + + BN.prototype.toArray = function toArray (endian, length) { + return this.toArrayLike(Array, endian, length); + }; + + BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) { + var byteLength = this.byteLength(); + var reqLength = length || Math.max(1, byteLength); + assert(byteLength <= reqLength, 'byte array longer than desired length'); + assert(reqLength > 0, 'Requested array length <= 0'); + + this.strip(); + var littleEndian = endian === 'le'; + var res = new ArrayType(reqLength); + + var b, i; + var q = this.clone(); + if (!littleEndian) { + // Assume big-endian + for (i = 0; i < reqLength - byteLength; i++) { + res[i] = 0; + } + + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); + + res[reqLength - i - 1] = b; + } + } else { + for (i = 0; !q.isZero(); i++) { + b = q.andln(0xff); + q.iushrn(8); + + res[i] = b; + } + + for (; i < reqLength; i++) { + res[i] = 0; + } + } + + return res; + }; + + if (Math.clz32) { + BN.prototype._countBits = function _countBits (w) { + return 32 - Math.clz32(w); + }; + } else { + BN.prototype._countBits = function _countBits (w) { + var t = w; + var r = 0; + if (t >= 0x1000) { + r += 13; + t >>>= 13; + } + if (t >= 0x40) { + r += 7; + t >>>= 7; + } + if (t >= 0x8) { + r += 4; + t >>>= 4; + } + if (t >= 0x02) { + r += 2; + t >>>= 2; + } + return r + t; + }; + } + + BN.prototype._zeroBits = function _zeroBits (w) { + // Short-cut + if (w === 0) return 26; + + var t = w; + var r = 0; + if ((t & 0x1fff) === 0) { + r += 13; + t >>>= 13; + } + if ((t & 0x7f) === 0) { + r += 7; + t >>>= 7; + } + if ((t & 0xf) === 0) { + r += 4; + t >>>= 4; + } + if ((t & 0x3) === 0) { + r += 2; + t >>>= 2; + } + if ((t & 0x1) === 0) { + r++; + } + return r; + }; + + // Return number of used bits in a BN + BN.prototype.bitLength = function bitLength () { + var w = this.words[this.length - 1]; + var hi = this._countBits(w); + return (this.length - 1) * 26 + hi; + }; + + function toBitArray (num) { + var w = new Array(num.bitLength()); + + for (var bit = 0; bit < w.length; bit++) { + var off = (bit / 26) | 0; + var wbit = bit % 26; + + w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; + } + + return w; + } + + // Number of trailing zero bits + BN.prototype.zeroBits = function zeroBits () { + if (this.isZero()) return 0; + + var r = 0; + for (var i = 0; i < this.length; i++) { + var b = this._zeroBits(this.words[i]); + r += b; + if (b !== 26) break; + } + return r; + }; + + BN.prototype.byteLength = function byteLength () { + return Math.ceil(this.bitLength() / 8); + }; + + BN.prototype.toTwos = function toTwos (width) { + if (this.negative !== 0) { + return this.abs().inotn(width).iaddn(1); + } + return this.clone(); + }; + + BN.prototype.fromTwos = function fromTwos (width) { + if (this.testn(width - 1)) { + return this.notn(width).iaddn(1).ineg(); + } + return this.clone(); + }; + + BN.prototype.isNeg = function isNeg () { + return this.negative !== 0; + }; + + // Return negative clone of `this` + BN.prototype.neg = function neg () { + return this.clone().ineg(); + }; + + BN.prototype.ineg = function ineg () { + if (!this.isZero()) { + this.negative ^= 1; + } + + return this; + }; + + // Or `num` with `this` in-place + BN.prototype.iuor = function iuor (num) { + while (this.length < num.length) { + this.words[this.length++] = 0; + } + + for (var i = 0; i < num.length; i++) { + this.words[i] = this.words[i] | num.words[i]; + } + + return this.strip(); + }; + + BN.prototype.ior = function ior (num) { + assert((this.negative | num.negative) === 0); + return this.iuor(num); + }; + + // Or `num` with `this` + BN.prototype.or = function or (num) { + if (this.length > num.length) return this.clone().ior(num); + return num.clone().ior(this); + }; + + BN.prototype.uor = function uor (num) { + if (this.length > num.length) return this.clone().iuor(num); + return num.clone().iuor(this); + }; + + // And `num` with `this` in-place + BN.prototype.iuand = function iuand (num) { + // b = min-length(num, this) + var b; + if (this.length > num.length) { + b = num; + } else { + b = this; + } + + for (var i = 0; i < b.length; i++) { + this.words[i] = this.words[i] & num.words[i]; + } + + this.length = b.length; + + return this.strip(); + }; + + BN.prototype.iand = function iand (num) { + assert((this.negative | num.negative) === 0); + return this.iuand(num); + }; + + // And `num` with `this` + BN.prototype.and = function and (num) { + if (this.length > num.length) return this.clone().iand(num); + return num.clone().iand(this); + }; + + BN.prototype.uand = function uand (num) { + if (this.length > num.length) return this.clone().iuand(num); + return num.clone().iuand(this); + }; + + // Xor `num` with `this` in-place + BN.prototype.iuxor = function iuxor (num) { + // a.length > b.length + var a; + var b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + for (var i = 0; i < b.length; i++) { + this.words[i] = a.words[i] ^ b.words[i]; + } + + if (this !== a) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + this.length = a.length; + + return this.strip(); + }; + + BN.prototype.ixor = function ixor (num) { + assert((this.negative | num.negative) === 0); + return this.iuxor(num); + }; + + // Xor `num` with `this` + BN.prototype.xor = function xor (num) { + if (this.length > num.length) return this.clone().ixor(num); + return num.clone().ixor(this); + }; + + BN.prototype.uxor = function uxor (num) { + if (this.length > num.length) return this.clone().iuxor(num); + return num.clone().iuxor(this); + }; + + // Not ``this`` with ``width`` bitwidth + BN.prototype.inotn = function inotn (width) { + assert(typeof width === 'number' && width >= 0); + + var bytesNeeded = Math.ceil(width / 26) | 0; + var bitsLeft = width % 26; + + // Extend the buffer with leading zeroes + this._expand(bytesNeeded); + + if (bitsLeft > 0) { + bytesNeeded--; + } + + // Handle complete words + for (var i = 0; i < bytesNeeded; i++) { + this.words[i] = ~this.words[i] & 0x3ffffff; + } + + // Handle the residue + if (bitsLeft > 0) { + this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft)); + } + + // And remove leading zeroes + return this.strip(); + }; + + BN.prototype.notn = function notn (width) { + return this.clone().inotn(width); + }; + + // Set `bit` of `this` + BN.prototype.setn = function setn (bit, val) { + assert(typeof bit === 'number' && bit >= 0); + + var off = (bit / 26) | 0; + var wbit = bit % 26; + + this._expand(off + 1); + + if (val) { + this.words[off] = this.words[off] | (1 << wbit); + } else { + this.words[off] = this.words[off] & ~(1 << wbit); + } + + return this.strip(); + }; + + // Add `num` to `this` in-place + BN.prototype.iadd = function iadd (num) { + var r; + + // negative + positive + if (this.negative !== 0 && num.negative === 0) { + this.negative = 0; + r = this.isub(num); + this.negative ^= 1; + return this._normSign(); + + // positive + negative + } else if (this.negative === 0 && num.negative !== 0) { + num.negative = 0; + r = this.isub(num); + num.negative = 1; + return r._normSign(); + } + + // a.length > b.length + var a, b; + if (this.length > num.length) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) + (b.words[i] | 0) + carry; + this.words[i] = r & 0x3ffffff; + carry = r >>> 26; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + this.words[i] = r & 0x3ffffff; + carry = r >>> 26; + } + + this.length = a.length; + if (carry !== 0) { + this.words[this.length] = carry; + this.length++; + // Copy the rest of the words + } else if (a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + return this; + }; + + // Add `num` to `this` + BN.prototype.add = function add (num) { + var res; + if (num.negative !== 0 && this.negative === 0) { + num.negative = 0; + res = this.sub(num); + num.negative ^= 1; + return res; + } else if (num.negative === 0 && this.negative !== 0) { + this.negative = 0; + res = num.sub(this); + this.negative = 1; + return res; + } + + if (this.length > num.length) return this.clone().iadd(num); + + return num.clone().iadd(this); + }; + + // Subtract `num` from `this` in-place + BN.prototype.isub = function isub (num) { + // this - (-num) = this + num + if (num.negative !== 0) { + num.negative = 0; + var r = this.iadd(num); + num.negative = 1; + return r._normSign(); + + // -this - num = -(this + num) + } else if (this.negative !== 0) { + this.negative = 0; + this.iadd(num); + this.negative = 1; + return this._normSign(); + } + + // At this point both numbers are positive + var cmp = this.cmp(num); + + // Optimization - zeroify + if (cmp === 0) { + this.negative = 0; + this.length = 1; + this.words[0] = 0; + return this; + } + + // a > b + var a, b; + if (cmp > 0) { + a = this; + b = num; + } else { + a = num; + b = this; + } + + var carry = 0; + for (var i = 0; i < b.length; i++) { + r = (a.words[i] | 0) - (b.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 0x3ffffff; + } + for (; carry !== 0 && i < a.length; i++) { + r = (a.words[i] | 0) + carry; + carry = r >> 26; + this.words[i] = r & 0x3ffffff; + } + + // Copy rest of the words + if (carry === 0 && i < a.length && a !== this) { + for (; i < a.length; i++) { + this.words[i] = a.words[i]; + } + } + + this.length = Math.max(this.length, i); + + if (a !== this) { + this.negative = 1; + } + + return this.strip(); + }; + + // Subtract `num` from `this` + BN.prototype.sub = function sub (num) { + return this.clone().isub(num); + }; + + function smallMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + var len = (self.length + num.length) | 0; + out.length = len; + len = (len - 1) | 0; + + // Peel one iteration (compiler can't do it, because of code complexity) + var a = self.words[0] | 0; + var b = num.words[0] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + var carry = (r / 0x4000000) | 0; + out.words[0] = lo; + + for (var k = 1; k < len; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = carry >>> 26; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = (k - j) | 0; + a = self.words[i] | 0; + b = num.words[j] | 0; + r = a * b + rword; + ncarry += (r / 0x4000000) | 0; + rword = r & 0x3ffffff; + } + out.words[k] = rword | 0; + carry = ncarry | 0; + } + if (carry !== 0) { + out.words[k] = carry | 0; + } else { + out.length--; + } + + return out.strip(); + } + + // TODO(indutny): it may be reasonable to omit it for users who don't need + // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit + // multiplication (like elliptic secp256k1). + var comb10MulTo = function comb10MulTo (self, num, out) { + var a = self.words; + var b = num.words; + var o = out.words; + var c = 0; + var lo; + var mid; + var hi; + var a0 = a[0] | 0; + var al0 = a0 & 0x1fff; + var ah0 = a0 >>> 13; + var a1 = a[1] | 0; + var al1 = a1 & 0x1fff; + var ah1 = a1 >>> 13; + var a2 = a[2] | 0; + var al2 = a2 & 0x1fff; + var ah2 = a2 >>> 13; + var a3 = a[3] | 0; + var al3 = a3 & 0x1fff; + var ah3 = a3 >>> 13; + var a4 = a[4] | 0; + var al4 = a4 & 0x1fff; + var ah4 = a4 >>> 13; + var a5 = a[5] | 0; + var al5 = a5 & 0x1fff; + var ah5 = a5 >>> 13; + var a6 = a[6] | 0; + var al6 = a6 & 0x1fff; + var ah6 = a6 >>> 13; + var a7 = a[7] | 0; + var al7 = a7 & 0x1fff; + var ah7 = a7 >>> 13; + var a8 = a[8] | 0; + var al8 = a8 & 0x1fff; + var ah8 = a8 >>> 13; + var a9 = a[9] | 0; + var al9 = a9 & 0x1fff; + var ah9 = a9 >>> 13; + var b0 = b[0] | 0; + var bl0 = b0 & 0x1fff; + var bh0 = b0 >>> 13; + var b1 = b[1] | 0; + var bl1 = b1 & 0x1fff; + var bh1 = b1 >>> 13; + var b2 = b[2] | 0; + var bl2 = b2 & 0x1fff; + var bh2 = b2 >>> 13; + var b3 = b[3] | 0; + var bl3 = b3 & 0x1fff; + var bh3 = b3 >>> 13; + var b4 = b[4] | 0; + var bl4 = b4 & 0x1fff; + var bh4 = b4 >>> 13; + var b5 = b[5] | 0; + var bl5 = b5 & 0x1fff; + var bh5 = b5 >>> 13; + var b6 = b[6] | 0; + var bl6 = b6 & 0x1fff; + var bh6 = b6 >>> 13; + var b7 = b[7] | 0; + var bl7 = b7 & 0x1fff; + var bh7 = b7 >>> 13; + var b8 = b[8] | 0; + var bl8 = b8 & 0x1fff; + var bh8 = b8 >>> 13; + var b9 = b[9] | 0; + var bl9 = b9 & 0x1fff; + var bh9 = b9 >>> 13; + + out.negative = self.negative ^ num.negative; + out.length = 19; + /* k = 0 */ + lo = Math.imul(al0, bl0); + mid = Math.imul(al0, bh0); + mid = (mid + Math.imul(ah0, bl0)) | 0; + hi = Math.imul(ah0, bh0); + var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; + w0 &= 0x3ffffff; + /* k = 1 */ + lo = Math.imul(al1, bl0); + mid = Math.imul(al1, bh0); + mid = (mid + Math.imul(ah1, bl0)) | 0; + hi = Math.imul(ah1, bh0); + lo = (lo + Math.imul(al0, bl1)) | 0; + mid = (mid + Math.imul(al0, bh1)) | 0; + mid = (mid + Math.imul(ah0, bl1)) | 0; + hi = (hi + Math.imul(ah0, bh1)) | 0; + var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; + w1 &= 0x3ffffff; + /* k = 2 */ + lo = Math.imul(al2, bl0); + mid = Math.imul(al2, bh0); + mid = (mid + Math.imul(ah2, bl0)) | 0; + hi = Math.imul(ah2, bh0); + lo = (lo + Math.imul(al1, bl1)) | 0; + mid = (mid + Math.imul(al1, bh1)) | 0; + mid = (mid + Math.imul(ah1, bl1)) | 0; + hi = (hi + Math.imul(ah1, bh1)) | 0; + lo = (lo + Math.imul(al0, bl2)) | 0; + mid = (mid + Math.imul(al0, bh2)) | 0; + mid = (mid + Math.imul(ah0, bl2)) | 0; + hi = (hi + Math.imul(ah0, bh2)) | 0; + var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; + w2 &= 0x3ffffff; + /* k = 3 */ + lo = Math.imul(al3, bl0); + mid = Math.imul(al3, bh0); + mid = (mid + Math.imul(ah3, bl0)) | 0; + hi = Math.imul(ah3, bh0); + lo = (lo + Math.imul(al2, bl1)) | 0; + mid = (mid + Math.imul(al2, bh1)) | 0; + mid = (mid + Math.imul(ah2, bl1)) | 0; + hi = (hi + Math.imul(ah2, bh1)) | 0; + lo = (lo + Math.imul(al1, bl2)) | 0; + mid = (mid + Math.imul(al1, bh2)) | 0; + mid = (mid + Math.imul(ah1, bl2)) | 0; + hi = (hi + Math.imul(ah1, bh2)) | 0; + lo = (lo + Math.imul(al0, bl3)) | 0; + mid = (mid + Math.imul(al0, bh3)) | 0; + mid = (mid + Math.imul(ah0, bl3)) | 0; + hi = (hi + Math.imul(ah0, bh3)) | 0; + var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; + w3 &= 0x3ffffff; + /* k = 4 */ + lo = Math.imul(al4, bl0); + mid = Math.imul(al4, bh0); + mid = (mid + Math.imul(ah4, bl0)) | 0; + hi = Math.imul(ah4, bh0); + lo = (lo + Math.imul(al3, bl1)) | 0; + mid = (mid + Math.imul(al3, bh1)) | 0; + mid = (mid + Math.imul(ah3, bl1)) | 0; + hi = (hi + Math.imul(ah3, bh1)) | 0; + lo = (lo + Math.imul(al2, bl2)) | 0; + mid = (mid + Math.imul(al2, bh2)) | 0; + mid = (mid + Math.imul(ah2, bl2)) | 0; + hi = (hi + Math.imul(ah2, bh2)) | 0; + lo = (lo + Math.imul(al1, bl3)) | 0; + mid = (mid + Math.imul(al1, bh3)) | 0; + mid = (mid + Math.imul(ah1, bl3)) | 0; + hi = (hi + Math.imul(ah1, bh3)) | 0; + lo = (lo + Math.imul(al0, bl4)) | 0; + mid = (mid + Math.imul(al0, bh4)) | 0; + mid = (mid + Math.imul(ah0, bl4)) | 0; + hi = (hi + Math.imul(ah0, bh4)) | 0; + var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; + w4 &= 0x3ffffff; + /* k = 5 */ + lo = Math.imul(al5, bl0); + mid = Math.imul(al5, bh0); + mid = (mid + Math.imul(ah5, bl0)) | 0; + hi = Math.imul(ah5, bh0); + lo = (lo + Math.imul(al4, bl1)) | 0; + mid = (mid + Math.imul(al4, bh1)) | 0; + mid = (mid + Math.imul(ah4, bl1)) | 0; + hi = (hi + Math.imul(ah4, bh1)) | 0; + lo = (lo + Math.imul(al3, bl2)) | 0; + mid = (mid + Math.imul(al3, bh2)) | 0; + mid = (mid + Math.imul(ah3, bl2)) | 0; + hi = (hi + Math.imul(ah3, bh2)) | 0; + lo = (lo + Math.imul(al2, bl3)) | 0; + mid = (mid + Math.imul(al2, bh3)) | 0; + mid = (mid + Math.imul(ah2, bl3)) | 0; + hi = (hi + Math.imul(ah2, bh3)) | 0; + lo = (lo + Math.imul(al1, bl4)) | 0; + mid = (mid + Math.imul(al1, bh4)) | 0; + mid = (mid + Math.imul(ah1, bl4)) | 0; + hi = (hi + Math.imul(ah1, bh4)) | 0; + lo = (lo + Math.imul(al0, bl5)) | 0; + mid = (mid + Math.imul(al0, bh5)) | 0; + mid = (mid + Math.imul(ah0, bl5)) | 0; + hi = (hi + Math.imul(ah0, bh5)) | 0; + var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; + w5 &= 0x3ffffff; + /* k = 6 */ + lo = Math.imul(al6, bl0); + mid = Math.imul(al6, bh0); + mid = (mid + Math.imul(ah6, bl0)) | 0; + hi = Math.imul(ah6, bh0); + lo = (lo + Math.imul(al5, bl1)) | 0; + mid = (mid + Math.imul(al5, bh1)) | 0; + mid = (mid + Math.imul(ah5, bl1)) | 0; + hi = (hi + Math.imul(ah5, bh1)) | 0; + lo = (lo + Math.imul(al4, bl2)) | 0; + mid = (mid + Math.imul(al4, bh2)) | 0; + mid = (mid + Math.imul(ah4, bl2)) | 0; + hi = (hi + Math.imul(ah4, bh2)) | 0; + lo = (lo + Math.imul(al3, bl3)) | 0; + mid = (mid + Math.imul(al3, bh3)) | 0; + mid = (mid + Math.imul(ah3, bl3)) | 0; + hi = (hi + Math.imul(ah3, bh3)) | 0; + lo = (lo + Math.imul(al2, bl4)) | 0; + mid = (mid + Math.imul(al2, bh4)) | 0; + mid = (mid + Math.imul(ah2, bl4)) | 0; + hi = (hi + Math.imul(ah2, bh4)) | 0; + lo = (lo + Math.imul(al1, bl5)) | 0; + mid = (mid + Math.imul(al1, bh5)) | 0; + mid = (mid + Math.imul(ah1, bl5)) | 0; + hi = (hi + Math.imul(ah1, bh5)) | 0; + lo = (lo + Math.imul(al0, bl6)) | 0; + mid = (mid + Math.imul(al0, bh6)) | 0; + mid = (mid + Math.imul(ah0, bl6)) | 0; + hi = (hi + Math.imul(ah0, bh6)) | 0; + var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; + w6 &= 0x3ffffff; + /* k = 7 */ + lo = Math.imul(al7, bl0); + mid = Math.imul(al7, bh0); + mid = (mid + Math.imul(ah7, bl0)) | 0; + hi = Math.imul(ah7, bh0); + lo = (lo + Math.imul(al6, bl1)) | 0; + mid = (mid + Math.imul(al6, bh1)) | 0; + mid = (mid + Math.imul(ah6, bl1)) | 0; + hi = (hi + Math.imul(ah6, bh1)) | 0; + lo = (lo + Math.imul(al5, bl2)) | 0; + mid = (mid + Math.imul(al5, bh2)) | 0; + mid = (mid + Math.imul(ah5, bl2)) | 0; + hi = (hi + Math.imul(ah5, bh2)) | 0; + lo = (lo + Math.imul(al4, bl3)) | 0; + mid = (mid + Math.imul(al4, bh3)) | 0; + mid = (mid + Math.imul(ah4, bl3)) | 0; + hi = (hi + Math.imul(ah4, bh3)) | 0; + lo = (lo + Math.imul(al3, bl4)) | 0; + mid = (mid + Math.imul(al3, bh4)) | 0; + mid = (mid + Math.imul(ah3, bl4)) | 0; + hi = (hi + Math.imul(ah3, bh4)) | 0; + lo = (lo + Math.imul(al2, bl5)) | 0; + mid = (mid + Math.imul(al2, bh5)) | 0; + mid = (mid + Math.imul(ah2, bl5)) | 0; + hi = (hi + Math.imul(ah2, bh5)) | 0; + lo = (lo + Math.imul(al1, bl6)) | 0; + mid = (mid + Math.imul(al1, bh6)) | 0; + mid = (mid + Math.imul(ah1, bl6)) | 0; + hi = (hi + Math.imul(ah1, bh6)) | 0; + lo = (lo + Math.imul(al0, bl7)) | 0; + mid = (mid + Math.imul(al0, bh7)) | 0; + mid = (mid + Math.imul(ah0, bl7)) | 0; + hi = (hi + Math.imul(ah0, bh7)) | 0; + var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; + w7 &= 0x3ffffff; + /* k = 8 */ + lo = Math.imul(al8, bl0); + mid = Math.imul(al8, bh0); + mid = (mid + Math.imul(ah8, bl0)) | 0; + hi = Math.imul(ah8, bh0); + lo = (lo + Math.imul(al7, bl1)) | 0; + mid = (mid + Math.imul(al7, bh1)) | 0; + mid = (mid + Math.imul(ah7, bl1)) | 0; + hi = (hi + Math.imul(ah7, bh1)) | 0; + lo = (lo + Math.imul(al6, bl2)) | 0; + mid = (mid + Math.imul(al6, bh2)) | 0; + mid = (mid + Math.imul(ah6, bl2)) | 0; + hi = (hi + Math.imul(ah6, bh2)) | 0; + lo = (lo + Math.imul(al5, bl3)) | 0; + mid = (mid + Math.imul(al5, bh3)) | 0; + mid = (mid + Math.imul(ah5, bl3)) | 0; + hi = (hi + Math.imul(ah5, bh3)) | 0; + lo = (lo + Math.imul(al4, bl4)) | 0; + mid = (mid + Math.imul(al4, bh4)) | 0; + mid = (mid + Math.imul(ah4, bl4)) | 0; + hi = (hi + Math.imul(ah4, bh4)) | 0; + lo = (lo + Math.imul(al3, bl5)) | 0; + mid = (mid + Math.imul(al3, bh5)) | 0; + mid = (mid + Math.imul(ah3, bl5)) | 0; + hi = (hi + Math.imul(ah3, bh5)) | 0; + lo = (lo + Math.imul(al2, bl6)) | 0; + mid = (mid + Math.imul(al2, bh6)) | 0; + mid = (mid + Math.imul(ah2, bl6)) | 0; + hi = (hi + Math.imul(ah2, bh6)) | 0; + lo = (lo + Math.imul(al1, bl7)) | 0; + mid = (mid + Math.imul(al1, bh7)) | 0; + mid = (mid + Math.imul(ah1, bl7)) | 0; + hi = (hi + Math.imul(ah1, bh7)) | 0; + lo = (lo + Math.imul(al0, bl8)) | 0; + mid = (mid + Math.imul(al0, bh8)) | 0; + mid = (mid + Math.imul(ah0, bl8)) | 0; + hi = (hi + Math.imul(ah0, bh8)) | 0; + var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; + w8 &= 0x3ffffff; + /* k = 9 */ + lo = Math.imul(al9, bl0); + mid = Math.imul(al9, bh0); + mid = (mid + Math.imul(ah9, bl0)) | 0; + hi = Math.imul(ah9, bh0); + lo = (lo + Math.imul(al8, bl1)) | 0; + mid = (mid + Math.imul(al8, bh1)) | 0; + mid = (mid + Math.imul(ah8, bl1)) | 0; + hi = (hi + Math.imul(ah8, bh1)) | 0; + lo = (lo + Math.imul(al7, bl2)) | 0; + mid = (mid + Math.imul(al7, bh2)) | 0; + mid = (mid + Math.imul(ah7, bl2)) | 0; + hi = (hi + Math.imul(ah7, bh2)) | 0; + lo = (lo + Math.imul(al6, bl3)) | 0; + mid = (mid + Math.imul(al6, bh3)) | 0; + mid = (mid + Math.imul(ah6, bl3)) | 0; + hi = (hi + Math.imul(ah6, bh3)) | 0; + lo = (lo + Math.imul(al5, bl4)) | 0; + mid = (mid + Math.imul(al5, bh4)) | 0; + mid = (mid + Math.imul(ah5, bl4)) | 0; + hi = (hi + Math.imul(ah5, bh4)) | 0; + lo = (lo + Math.imul(al4, bl5)) | 0; + mid = (mid + Math.imul(al4, bh5)) | 0; + mid = (mid + Math.imul(ah4, bl5)) | 0; + hi = (hi + Math.imul(ah4, bh5)) | 0; + lo = (lo + Math.imul(al3, bl6)) | 0; + mid = (mid + Math.imul(al3, bh6)) | 0; + mid = (mid + Math.imul(ah3, bl6)) | 0; + hi = (hi + Math.imul(ah3, bh6)) | 0; + lo = (lo + Math.imul(al2, bl7)) | 0; + mid = (mid + Math.imul(al2, bh7)) | 0; + mid = (mid + Math.imul(ah2, bl7)) | 0; + hi = (hi + Math.imul(ah2, bh7)) | 0; + lo = (lo + Math.imul(al1, bl8)) | 0; + mid = (mid + Math.imul(al1, bh8)) | 0; + mid = (mid + Math.imul(ah1, bl8)) | 0; + hi = (hi + Math.imul(ah1, bh8)) | 0; + lo = (lo + Math.imul(al0, bl9)) | 0; + mid = (mid + Math.imul(al0, bh9)) | 0; + mid = (mid + Math.imul(ah0, bl9)) | 0; + hi = (hi + Math.imul(ah0, bh9)) | 0; + var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; + w9 &= 0x3ffffff; + /* k = 10 */ + lo = Math.imul(al9, bl1); + mid = Math.imul(al9, bh1); + mid = (mid + Math.imul(ah9, bl1)) | 0; + hi = Math.imul(ah9, bh1); + lo = (lo + Math.imul(al8, bl2)) | 0; + mid = (mid + Math.imul(al8, bh2)) | 0; + mid = (mid + Math.imul(ah8, bl2)) | 0; + hi = (hi + Math.imul(ah8, bh2)) | 0; + lo = (lo + Math.imul(al7, bl3)) | 0; + mid = (mid + Math.imul(al7, bh3)) | 0; + mid = (mid + Math.imul(ah7, bl3)) | 0; + hi = (hi + Math.imul(ah7, bh3)) | 0; + lo = (lo + Math.imul(al6, bl4)) | 0; + mid = (mid + Math.imul(al6, bh4)) | 0; + mid = (mid + Math.imul(ah6, bl4)) | 0; + hi = (hi + Math.imul(ah6, bh4)) | 0; + lo = (lo + Math.imul(al5, bl5)) | 0; + mid = (mid + Math.imul(al5, bh5)) | 0; + mid = (mid + Math.imul(ah5, bl5)) | 0; + hi = (hi + Math.imul(ah5, bh5)) | 0; + lo = (lo + Math.imul(al4, bl6)) | 0; + mid = (mid + Math.imul(al4, bh6)) | 0; + mid = (mid + Math.imul(ah4, bl6)) | 0; + hi = (hi + Math.imul(ah4, bh6)) | 0; + lo = (lo + Math.imul(al3, bl7)) | 0; + mid = (mid + Math.imul(al3, bh7)) | 0; + mid = (mid + Math.imul(ah3, bl7)) | 0; + hi = (hi + Math.imul(ah3, bh7)) | 0; + lo = (lo + Math.imul(al2, bl8)) | 0; + mid = (mid + Math.imul(al2, bh8)) | 0; + mid = (mid + Math.imul(ah2, bl8)) | 0; + hi = (hi + Math.imul(ah2, bh8)) | 0; + lo = (lo + Math.imul(al1, bl9)) | 0; + mid = (mid + Math.imul(al1, bh9)) | 0; + mid = (mid + Math.imul(ah1, bl9)) | 0; + hi = (hi + Math.imul(ah1, bh9)) | 0; + var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; + w10 &= 0x3ffffff; + /* k = 11 */ + lo = Math.imul(al9, bl2); + mid = Math.imul(al9, bh2); + mid = (mid + Math.imul(ah9, bl2)) | 0; + hi = Math.imul(ah9, bh2); + lo = (lo + Math.imul(al8, bl3)) | 0; + mid = (mid + Math.imul(al8, bh3)) | 0; + mid = (mid + Math.imul(ah8, bl3)) | 0; + hi = (hi + Math.imul(ah8, bh3)) | 0; + lo = (lo + Math.imul(al7, bl4)) | 0; + mid = (mid + Math.imul(al7, bh4)) | 0; + mid = (mid + Math.imul(ah7, bl4)) | 0; + hi = (hi + Math.imul(ah7, bh4)) | 0; + lo = (lo + Math.imul(al6, bl5)) | 0; + mid = (mid + Math.imul(al6, bh5)) | 0; + mid = (mid + Math.imul(ah6, bl5)) | 0; + hi = (hi + Math.imul(ah6, bh5)) | 0; + lo = (lo + Math.imul(al5, bl6)) | 0; + mid = (mid + Math.imul(al5, bh6)) | 0; + mid = (mid + Math.imul(ah5, bl6)) | 0; + hi = (hi + Math.imul(ah5, bh6)) | 0; + lo = (lo + Math.imul(al4, bl7)) | 0; + mid = (mid + Math.imul(al4, bh7)) | 0; + mid = (mid + Math.imul(ah4, bl7)) | 0; + hi = (hi + Math.imul(ah4, bh7)) | 0; + lo = (lo + Math.imul(al3, bl8)) | 0; + mid = (mid + Math.imul(al3, bh8)) | 0; + mid = (mid + Math.imul(ah3, bl8)) | 0; + hi = (hi + Math.imul(ah3, bh8)) | 0; + lo = (lo + Math.imul(al2, bl9)) | 0; + mid = (mid + Math.imul(al2, bh9)) | 0; + mid = (mid + Math.imul(ah2, bl9)) | 0; + hi = (hi + Math.imul(ah2, bh9)) | 0; + var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; + w11 &= 0x3ffffff; + /* k = 12 */ + lo = Math.imul(al9, bl3); + mid = Math.imul(al9, bh3); + mid = (mid + Math.imul(ah9, bl3)) | 0; + hi = Math.imul(ah9, bh3); + lo = (lo + Math.imul(al8, bl4)) | 0; + mid = (mid + Math.imul(al8, bh4)) | 0; + mid = (mid + Math.imul(ah8, bl4)) | 0; + hi = (hi + Math.imul(ah8, bh4)) | 0; + lo = (lo + Math.imul(al7, bl5)) | 0; + mid = (mid + Math.imul(al7, bh5)) | 0; + mid = (mid + Math.imul(ah7, bl5)) | 0; + hi = (hi + Math.imul(ah7, bh5)) | 0; + lo = (lo + Math.imul(al6, bl6)) | 0; + mid = (mid + Math.imul(al6, bh6)) | 0; + mid = (mid + Math.imul(ah6, bl6)) | 0; + hi = (hi + Math.imul(ah6, bh6)) | 0; + lo = (lo + Math.imul(al5, bl7)) | 0; + mid = (mid + Math.imul(al5, bh7)) | 0; + mid = (mid + Math.imul(ah5, bl7)) | 0; + hi = (hi + Math.imul(ah5, bh7)) | 0; + lo = (lo + Math.imul(al4, bl8)) | 0; + mid = (mid + Math.imul(al4, bh8)) | 0; + mid = (mid + Math.imul(ah4, bl8)) | 0; + hi = (hi + Math.imul(ah4, bh8)) | 0; + lo = (lo + Math.imul(al3, bl9)) | 0; + mid = (mid + Math.imul(al3, bh9)) | 0; + mid = (mid + Math.imul(ah3, bl9)) | 0; + hi = (hi + Math.imul(ah3, bh9)) | 0; + var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; + w12 &= 0x3ffffff; + /* k = 13 */ + lo = Math.imul(al9, bl4); + mid = Math.imul(al9, bh4); + mid = (mid + Math.imul(ah9, bl4)) | 0; + hi = Math.imul(ah9, bh4); + lo = (lo + Math.imul(al8, bl5)) | 0; + mid = (mid + Math.imul(al8, bh5)) | 0; + mid = (mid + Math.imul(ah8, bl5)) | 0; + hi = (hi + Math.imul(ah8, bh5)) | 0; + lo = (lo + Math.imul(al7, bl6)) | 0; + mid = (mid + Math.imul(al7, bh6)) | 0; + mid = (mid + Math.imul(ah7, bl6)) | 0; + hi = (hi + Math.imul(ah7, bh6)) | 0; + lo = (lo + Math.imul(al6, bl7)) | 0; + mid = (mid + Math.imul(al6, bh7)) | 0; + mid = (mid + Math.imul(ah6, bl7)) | 0; + hi = (hi + Math.imul(ah6, bh7)) | 0; + lo = (lo + Math.imul(al5, bl8)) | 0; + mid = (mid + Math.imul(al5, bh8)) | 0; + mid = (mid + Math.imul(ah5, bl8)) | 0; + hi = (hi + Math.imul(ah5, bh8)) | 0; + lo = (lo + Math.imul(al4, bl9)) | 0; + mid = (mid + Math.imul(al4, bh9)) | 0; + mid = (mid + Math.imul(ah4, bl9)) | 0; + hi = (hi + Math.imul(ah4, bh9)) | 0; + var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; + w13 &= 0x3ffffff; + /* k = 14 */ + lo = Math.imul(al9, bl5); + mid = Math.imul(al9, bh5); + mid = (mid + Math.imul(ah9, bl5)) | 0; + hi = Math.imul(ah9, bh5); + lo = (lo + Math.imul(al8, bl6)) | 0; + mid = (mid + Math.imul(al8, bh6)) | 0; + mid = (mid + Math.imul(ah8, bl6)) | 0; + hi = (hi + Math.imul(ah8, bh6)) | 0; + lo = (lo + Math.imul(al7, bl7)) | 0; + mid = (mid + Math.imul(al7, bh7)) | 0; + mid = (mid + Math.imul(ah7, bl7)) | 0; + hi = (hi + Math.imul(ah7, bh7)) | 0; + lo = (lo + Math.imul(al6, bl8)) | 0; + mid = (mid + Math.imul(al6, bh8)) | 0; + mid = (mid + Math.imul(ah6, bl8)) | 0; + hi = (hi + Math.imul(ah6, bh8)) | 0; + lo = (lo + Math.imul(al5, bl9)) | 0; + mid = (mid + Math.imul(al5, bh9)) | 0; + mid = (mid + Math.imul(ah5, bl9)) | 0; + hi = (hi + Math.imul(ah5, bh9)) | 0; + var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; + w14 &= 0x3ffffff; + /* k = 15 */ + lo = Math.imul(al9, bl6); + mid = Math.imul(al9, bh6); + mid = (mid + Math.imul(ah9, bl6)) | 0; + hi = Math.imul(ah9, bh6); + lo = (lo + Math.imul(al8, bl7)) | 0; + mid = (mid + Math.imul(al8, bh7)) | 0; + mid = (mid + Math.imul(ah8, bl7)) | 0; + hi = (hi + Math.imul(ah8, bh7)) | 0; + lo = (lo + Math.imul(al7, bl8)) | 0; + mid = (mid + Math.imul(al7, bh8)) | 0; + mid = (mid + Math.imul(ah7, bl8)) | 0; + hi = (hi + Math.imul(ah7, bh8)) | 0; + lo = (lo + Math.imul(al6, bl9)) | 0; + mid = (mid + Math.imul(al6, bh9)) | 0; + mid = (mid + Math.imul(ah6, bl9)) | 0; + hi = (hi + Math.imul(ah6, bh9)) | 0; + var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; + w15 &= 0x3ffffff; + /* k = 16 */ + lo = Math.imul(al9, bl7); + mid = Math.imul(al9, bh7); + mid = (mid + Math.imul(ah9, bl7)) | 0; + hi = Math.imul(ah9, bh7); + lo = (lo + Math.imul(al8, bl8)) | 0; + mid = (mid + Math.imul(al8, bh8)) | 0; + mid = (mid + Math.imul(ah8, bl8)) | 0; + hi = (hi + Math.imul(ah8, bh8)) | 0; + lo = (lo + Math.imul(al7, bl9)) | 0; + mid = (mid + Math.imul(al7, bh9)) | 0; + mid = (mid + Math.imul(ah7, bl9)) | 0; + hi = (hi + Math.imul(ah7, bh9)) | 0; + var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; + w16 &= 0x3ffffff; + /* k = 17 */ + lo = Math.imul(al9, bl8); + mid = Math.imul(al9, bh8); + mid = (mid + Math.imul(ah9, bl8)) | 0; + hi = Math.imul(ah9, bh8); + lo = (lo + Math.imul(al8, bl9)) | 0; + mid = (mid + Math.imul(al8, bh9)) | 0; + mid = (mid + Math.imul(ah8, bl9)) | 0; + hi = (hi + Math.imul(ah8, bh9)) | 0; + var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; + w17 &= 0x3ffffff; + /* k = 18 */ + lo = Math.imul(al9, bl9); + mid = Math.imul(al9, bh9); + mid = (mid + Math.imul(ah9, bl9)) | 0; + hi = Math.imul(ah9, bh9); + var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0; + c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; + w18 &= 0x3ffffff; + o[0] = w0; + o[1] = w1; + o[2] = w2; + o[3] = w3; + o[4] = w4; + o[5] = w5; + o[6] = w6; + o[7] = w7; + o[8] = w8; + o[9] = w9; + o[10] = w10; + o[11] = w11; + o[12] = w12; + o[13] = w13; + o[14] = w14; + o[15] = w15; + o[16] = w16; + o[17] = w17; + o[18] = w18; + if (c !== 0) { + o[19] = c; + out.length++; + } + return out; + }; + + // Polyfill comb + if (!Math.imul) { + comb10MulTo = smallMulTo; + } + + function bigMulTo (self, num, out) { + out.negative = num.negative ^ self.negative; + out.length = self.length + num.length; + + var carry = 0; + var hncarry = 0; + for (var k = 0; k < out.length - 1; k++) { + // Sum all words with the same `i + j = k` and accumulate `ncarry`, + // note that ncarry could be >= 0x3ffffff + var ncarry = hncarry; + hncarry = 0; + var rword = carry & 0x3ffffff; + var maxJ = Math.min(k, num.length - 1); + for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) { + var i = k - j; + var a = self.words[i] | 0; + var b = num.words[j] | 0; + var r = a * b; + + var lo = r & 0x3ffffff; + ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0; + lo = (lo + rword) | 0; + rword = lo & 0x3ffffff; + ncarry = (ncarry + (lo >>> 26)) | 0; + + hncarry += ncarry >>> 26; + ncarry &= 0x3ffffff; + } + out.words[k] = rword; + carry = ncarry; + ncarry = hncarry; + } + if (carry !== 0) { + out.words[k] = carry; + } else { + out.length--; + } + + return out.strip(); + } + + function jumboMulTo (self, num, out) { + var fftm = new FFTM(); + return fftm.mulp(self, num, out); + } + + BN.prototype.mulTo = function mulTo (num, out) { + var res; + var len = this.length + num.length; + if (this.length === 10 && num.length === 10) { + res = comb10MulTo(this, num, out); + } else if (len < 63) { + res = smallMulTo(this, num, out); + } else if (len < 1024) { + res = bigMulTo(this, num, out); + } else { + res = jumboMulTo(this, num, out); + } + + return res; + }; + + // Cooley-Tukey algorithm for FFT + // slightly revisited to rely on looping instead of recursion + + function FFTM (x, y) { + this.x = x; + this.y = y; + } + + FFTM.prototype.makeRBT = function makeRBT (N) { + var t = new Array(N); + var l = BN.prototype._countBits(N) - 1; + for (var i = 0; i < N; i++) { + t[i] = this.revBin(i, l, N); + } + + return t; + }; + + // Returns binary-reversed representation of `x` + FFTM.prototype.revBin = function revBin (x, l, N) { + if (x === 0 || x === N - 1) return x; + + var rb = 0; + for (var i = 0; i < l; i++) { + rb |= (x & 1) << (l - i - 1); + x >>= 1; + } + + return rb; + }; + + // Performs "tweedling" phase, therefore 'emulating' + // behaviour of the recursive algorithm + FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) { + for (var i = 0; i < N; i++) { + rtws[i] = rws[rbt[i]]; + itws[i] = iws[rbt[i]]; + } + }; + + FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) { + this.permute(rbt, rws, iws, rtws, itws, N); + + for (var s = 1; s < N; s <<= 1) { + var l = s << 1; + + var rtwdf = Math.cos(2 * Math.PI / l); + var itwdf = Math.sin(2 * Math.PI / l); + + for (var p = 0; p < N; p += l) { + var rtwdf_ = rtwdf; + var itwdf_ = itwdf; + + for (var j = 0; j < s; j++) { + var re = rtws[p + j]; + var ie = itws[p + j]; + + var ro = rtws[p + j + s]; + var io = itws[p + j + s]; + + var rx = rtwdf_ * ro - itwdf_ * io; + + io = rtwdf_ * io + itwdf_ * ro; + ro = rx; + + rtws[p + j] = re + ro; + itws[p + j] = ie + io; + + rtws[p + j + s] = re - ro; + itws[p + j + s] = ie - io; + + /* jshint maxdepth : false */ + if (j !== l) { + rx = rtwdf * rtwdf_ - itwdf * itwdf_; + + itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; + rtwdf_ = rx; + } + } + } + } + }; + + FFTM.prototype.guessLen13b = function guessLen13b (n, m) { + var N = Math.max(m, n) | 1; + var odd = N & 1; + var i = 0; + for (N = N / 2 | 0; N; N = N >>> 1) { + i++; + } + + return 1 << i + 1 + odd; + }; + + FFTM.prototype.conjugate = function conjugate (rws, iws, N) { + if (N <= 1) return; + + for (var i = 0; i < N / 2; i++) { + var t = rws[i]; + + rws[i] = rws[N - i - 1]; + rws[N - i - 1] = t; + + t = iws[i]; + + iws[i] = -iws[N - i - 1]; + iws[N - i - 1] = -t; + } + }; + + FFTM.prototype.normalize13b = function normalize13b (ws, N) { + var carry = 0; + for (var i = 0; i < N / 2; i++) { + var w = Math.round(ws[2 * i + 1] / N) * 0x2000 + + Math.round(ws[2 * i] / N) + + carry; + + ws[i] = w & 0x3ffffff; + + if (w < 0x4000000) { + carry = 0; + } else { + carry = w / 0x4000000 | 0; + } + } + + return ws; + }; + + FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) { + var carry = 0; + for (var i = 0; i < len; i++) { + carry = carry + (ws[i] | 0); + + rws[2 * i] = carry & 0x1fff; carry = carry >>> 13; + rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13; + } + + // Pad with zeroes + for (i = 2 * len; i < N; ++i) { + rws[i] = 0; + } + + assert(carry === 0); + assert((carry & ~0x1fff) === 0); + }; + + FFTM.prototype.stub = function stub (N) { + var ph = new Array(N); + for (var i = 0; i < N; i++) { + ph[i] = 0; + } + + return ph; + }; + + FFTM.prototype.mulp = function mulp (x, y, out) { + var N = 2 * this.guessLen13b(x.length, y.length); + + var rbt = this.makeRBT(N); + + var _ = this.stub(N); + + var rws = new Array(N); + var rwst = new Array(N); + var iwst = new Array(N); + + var nrws = new Array(N); + var nrwst = new Array(N); + var niwst = new Array(N); + + var rmws = out.words; + rmws.length = N; + + this.convert13b(x.words, x.length, rws, N); + this.convert13b(y.words, y.length, nrws, N); + + this.transform(rws, _, rwst, iwst, N, rbt); + this.transform(nrws, _, nrwst, niwst, N, rbt); + + for (var i = 0; i < N; i++) { + var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; + iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; + rwst[i] = rx; + } + + this.conjugate(rwst, iwst, N); + this.transform(rwst, iwst, rmws, _, N, rbt); + this.conjugate(rmws, _, N); + this.normalize13b(rmws, N); + + out.negative = x.negative ^ y.negative; + out.length = x.length + y.length; + return out.strip(); + }; + + // Multiply `this` by `num` + BN.prototype.mul = function mul (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return this.mulTo(num, out); + }; + + // Multiply employing FFT + BN.prototype.mulf = function mulf (num) { + var out = new BN(null); + out.words = new Array(this.length + num.length); + return jumboMulTo(this, num, out); + }; + + // In-place Multiplication + BN.prototype.imul = function imul (num) { + return this.clone().mulTo(num, this); + }; + + BN.prototype.imuln = function imuln (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + + // Carry + var carry = 0; + for (var i = 0; i < this.length; i++) { + var w = (this.words[i] | 0) * num; + var lo = (w & 0x3ffffff) + (carry & 0x3ffffff); + carry >>= 26; + carry += (w / 0x4000000) | 0; + // NOTE: lo is 27bit maximum + carry += lo >>> 26; + this.words[i] = lo & 0x3ffffff; + } + + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + + return this; + }; + + BN.prototype.muln = function muln (num) { + return this.clone().imuln(num); + }; + + // `this` * `this` + BN.prototype.sqr = function sqr () { + return this.mul(this); + }; + + // `this` * `this` in-place + BN.prototype.isqr = function isqr () { + return this.imul(this.clone()); + }; + + // Math.pow(`this`, `num`) + BN.prototype.pow = function pow (num) { + var w = toBitArray(num); + if (w.length === 0) return new BN(1); + + // Skip leading zeroes + var res = this; + for (var i = 0; i < w.length; i++, res = res.sqr()) { + if (w[i] !== 0) break; + } + + if (++i < w.length) { + for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { + if (w[i] === 0) continue; + + res = res.mul(q); + } + } + + return res; + }; + + // Shift-left in-place + BN.prototype.iushln = function iushln (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r); + var i; + + if (r !== 0) { + var carry = 0; + + for (i = 0; i < this.length; i++) { + var newCarry = this.words[i] & carryMask; + var c = ((this.words[i] | 0) - newCarry) << r; + this.words[i] = c | carry; + carry = newCarry >>> (26 - r); + } + + if (carry) { + this.words[i] = carry; + this.length++; + } + } + + if (s !== 0) { + for (i = this.length - 1; i >= 0; i--) { + this.words[i + s] = this.words[i]; + } + + for (i = 0; i < s; i++) { + this.words[i] = 0; + } + + this.length += s; + } + + return this.strip(); + }; + + BN.prototype.ishln = function ishln (bits) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushln(bits); + }; + + // Shift-right in-place + // NOTE: `hint` is a lowest bit before trailing zeroes + // NOTE: if `extended` is present - it will be filled with destroyed bits + BN.prototype.iushrn = function iushrn (bits, hint, extended) { + assert(typeof bits === 'number' && bits >= 0); + var h; + if (hint) { + h = (hint - (hint % 26)) / 26; + } else { + h = 0; + } + + var r = bits % 26; + var s = Math.min((bits - r) / 26, this.length); + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + var maskedWords = extended; + + h -= s; + h = Math.max(0, h); + + // Extended mode, copy masked part + if (maskedWords) { + for (var i = 0; i < s; i++) { + maskedWords.words[i] = this.words[i]; + } + maskedWords.length = s; + } + + if (s === 0) { + // No-op, we should not move anything at all + } else if (this.length > s) { + this.length -= s; + for (i = 0; i < this.length; i++) { + this.words[i] = this.words[i + s]; + } + } else { + this.words[0] = 0; + this.length = 1; + } + + var carry = 0; + for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { + var word = this.words[i] | 0; + this.words[i] = (carry << (26 - r)) | (word >>> r); + carry = word & mask; + } + + // Push carried bits as a mask + if (maskedWords && carry !== 0) { + maskedWords.words[maskedWords.length++] = carry; + } + + if (this.length === 0) { + this.words[0] = 0; + this.length = 1; + } + + return this.strip(); + }; + + BN.prototype.ishrn = function ishrn (bits, hint, extended) { + // TODO(indutny): implement me + assert(this.negative === 0); + return this.iushrn(bits, hint, extended); + }; + + // Shift-left + BN.prototype.shln = function shln (bits) { + return this.clone().ishln(bits); + }; + + BN.prototype.ushln = function ushln (bits) { + return this.clone().iushln(bits); + }; + + // Shift-right + BN.prototype.shrn = function shrn (bits) { + return this.clone().ishrn(bits); + }; + + BN.prototype.ushrn = function ushrn (bits) { + return this.clone().iushrn(bits); + }; + + // Test if n bit is set + BN.prototype.testn = function testn (bit) { + assert(typeof bit === 'number' && bit >= 0); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) return false; + + // Check bit and return + var w = this.words[s]; + + return !!(w & q); + }; + + // Return only lowers bits of number (in-place) + BN.prototype.imaskn = function imaskn (bits) { + assert(typeof bits === 'number' && bits >= 0); + var r = bits % 26; + var s = (bits - r) / 26; + + assert(this.negative === 0, 'imaskn works only with positive numbers'); + + if (this.length <= s) { + return this; + } + + if (r !== 0) { + s++; + } + this.length = Math.min(s, this.length); + + if (r !== 0) { + var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r); + this.words[this.length - 1] &= mask; + } + + return this.strip(); + }; + + // Return only lowers bits of number + BN.prototype.maskn = function maskn (bits) { + return this.clone().imaskn(bits); + }; + + // Add plain number `num` to `this` + BN.prototype.iaddn = function iaddn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.isubn(-num); + + // Possible sign change + if (this.negative !== 0) { + if (this.length === 1 && (this.words[0] | 0) < num) { + this.words[0] = num - (this.words[0] | 0); + this.negative = 0; + return this; + } + + this.negative = 0; + this.isubn(num); + this.negative = 1; + return this; + } + + // Add without checks + return this._iaddn(num); + }; + + BN.prototype._iaddn = function _iaddn (num) { + this.words[0] += num; + + // Carry + for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) { + this.words[i] -= 0x4000000; + if (i === this.length - 1) { + this.words[i + 1] = 1; + } else { + this.words[i + 1]++; + } + } + this.length = Math.max(this.length, i + 1); + + return this; + }; + + // Subtract plain number `num` from `this` + BN.prototype.isubn = function isubn (num) { + assert(typeof num === 'number'); + assert(num < 0x4000000); + if (num < 0) return this.iaddn(-num); + + if (this.negative !== 0) { + this.negative = 0; + this.iaddn(num); + this.negative = 1; + return this; + } + + this.words[0] -= num; + + if (this.length === 1 && this.words[0] < 0) { + this.words[0] = -this.words[0]; + this.negative = 1; + } else { + // Carry + for (var i = 0; i < this.length && this.words[i] < 0; i++) { + this.words[i] += 0x4000000; + this.words[i + 1] -= 1; + } + } + + return this.strip(); + }; + + BN.prototype.addn = function addn (num) { + return this.clone().iaddn(num); + }; + + BN.prototype.subn = function subn (num) { + return this.clone().isubn(num); + }; + + BN.prototype.iabs = function iabs () { + this.negative = 0; + + return this; + }; + + BN.prototype.abs = function abs () { + return this.clone().iabs(); + }; + + BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) { + var len = num.length + shift; + var i; + + this._expand(len); + + var w; + var carry = 0; + for (i = 0; i < num.length; i++) { + w = (this.words[i + shift] | 0) + carry; + var right = (num.words[i] | 0) * mul; + w -= right & 0x3ffffff; + carry = (w >> 26) - ((right / 0x4000000) | 0); + this.words[i + shift] = w & 0x3ffffff; + } + for (; i < this.length - shift; i++) { + w = (this.words[i + shift] | 0) + carry; + carry = w >> 26; + this.words[i + shift] = w & 0x3ffffff; + } + + if (carry === 0) return this.strip(); + + // Subtraction overflow + assert(carry === -1); + carry = 0; + for (i = 0; i < this.length; i++) { + w = -(this.words[i] | 0) + carry; + carry = w >> 26; + this.words[i] = w & 0x3ffffff; + } + this.negative = 1; + + return this.strip(); + }; + + BN.prototype._wordDiv = function _wordDiv (num, mode) { + var shift = this.length - num.length; + + var a = this.clone(); + var b = num; + + // Normalize + var bhi = b.words[b.length - 1] | 0; + var bhiBits = this._countBits(bhi); + shift = 26 - bhiBits; + if (shift !== 0) { + b = b.ushln(shift); + a.iushln(shift); + bhi = b.words[b.length - 1] | 0; + } + + // Initialize quotient + var m = a.length - b.length; + var q; + + if (mode !== 'mod') { + q = new BN(null); + q.length = m + 1; + q.words = new Array(q.length); + for (var i = 0; i < q.length; i++) { + q.words[i] = 0; + } + } + + var diff = a.clone()._ishlnsubmul(b, 1, m); + if (diff.negative === 0) { + a = diff; + if (q) { + q.words[m] = 1; + } + } + + for (var j = m - 1; j >= 0; j--) { + var qj = (a.words[b.length + j] | 0) * 0x4000000 + + (a.words[b.length + j - 1] | 0); + + // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max + // (0x7ffffff) + qj = Math.min((qj / bhi) | 0, 0x3ffffff); + + a._ishlnsubmul(b, qj, j); + while (a.negative !== 0) { + qj--; + a.negative = 0; + a._ishlnsubmul(b, 1, j); + if (!a.isZero()) { + a.negative ^= 1; + } + } + if (q) { + q.words[j] = qj; + } + } + if (q) { + q.strip(); + } + a.strip(); + + // Denormalize + if (mode !== 'div' && shift !== 0) { + a.iushrn(shift); + } + + return { + div: q || null, + mod: a + }; + }; + + // NOTE: 1) `mode` can be set to `mod` to request mod only, + // to `div` to request div only, or be absent to + // request both div & mod + // 2) `positive` is true if unsigned mod is requested + BN.prototype.divmod = function divmod (num, mode, positive) { + assert(!num.isZero()); + + if (this.isZero()) { + return { + div: new BN(0), + mod: new BN(0) + }; + } + + var div, mod, res; + if (this.negative !== 0 && num.negative === 0) { + res = this.neg().divmod(num, mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.iadd(num); + } + } + + return { + div: div, + mod: mod + }; + } + + if (this.negative === 0 && num.negative !== 0) { + res = this.divmod(num.neg(), mode); + + if (mode !== 'mod') { + div = res.div.neg(); + } + + return { + div: div, + mod: res.mod + }; + } + + if ((this.negative & num.negative) !== 0) { + res = this.neg().divmod(num.neg(), mode); + + if (mode !== 'div') { + mod = res.mod.neg(); + if (positive && mod.negative !== 0) { + mod.isub(num); + } + } + + return { + div: res.div, + mod: mod + }; + } + + // Both numbers are positive at this point + + // Strip both numbers to approximate shift value + if (num.length > this.length || this.cmp(num) < 0) { + return { + div: new BN(0), + mod: this + }; + } + + // Very short reduction + if (num.length === 1) { + if (mode === 'div') { + return { + div: this.divn(num.words[0]), + mod: null + }; + } + + if (mode === 'mod') { + return { + div: null, + mod: new BN(this.modn(num.words[0])) + }; + } + + return { + div: this.divn(num.words[0]), + mod: new BN(this.modn(num.words[0])) + }; + } + + return this._wordDiv(num, mode); + }; + + // Find `this` / `num` + BN.prototype.div = function div (num) { + return this.divmod(num, 'div', false).div; + }; + + // Find `this` % `num` + BN.prototype.mod = function mod (num) { + return this.divmod(num, 'mod', false).mod; + }; + + BN.prototype.umod = function umod (num) { + return this.divmod(num, 'mod', true).mod; + }; + + // Find Round(`this` / `num`) + BN.prototype.divRound = function divRound (num) { + var dm = this.divmod(num); + + // Fast case - exact division + if (dm.mod.isZero()) return dm.div; + + var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; + + var half = num.ushrn(1); + var r2 = num.andln(1); + var cmp = mod.cmp(half); + + // Round down + if (cmp < 0 || r2 === 1 && cmp === 0) return dm.div; + + // Round up + return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); + }; + + BN.prototype.modn = function modn (num) { + assert(num <= 0x3ffffff); + var p = (1 << 26) % num; + + var acc = 0; + for (var i = this.length - 1; i >= 0; i--) { + acc = (p * acc + (this.words[i] | 0)) % num; + } + + return acc; + }; + + // In-place division by number + BN.prototype.idivn = function idivn (num) { + assert(num <= 0x3ffffff); + + var carry = 0; + for (var i = this.length - 1; i >= 0; i--) { + var w = (this.words[i] | 0) + carry * 0x4000000; + this.words[i] = (w / num) | 0; + carry = w % num; + } + + return this.strip(); + }; + + BN.prototype.divn = function divn (num) { + return this.clone().idivn(num); + }; + + BN.prototype.egcd = function egcd (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var x = this; + var y = p.clone(); + + if (x.negative !== 0) { + x = x.umod(p); + } else { + x = x.clone(); + } + + // A * x + B * y = x + var A = new BN(1); + var B = new BN(0); + + // C * x + D * y = y + var C = new BN(0); + var D = new BN(1); + + var g = 0; + + while (x.isEven() && y.isEven()) { + x.iushrn(1); + y.iushrn(1); + ++g; + } + + var yp = y.clone(); + var xp = x.clone(); + + while (!x.isZero()) { + for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + x.iushrn(i); + while (i-- > 0) { + if (A.isOdd() || B.isOdd()) { + A.iadd(yp); + B.isub(xp); + } + + A.iushrn(1); + B.iushrn(1); + } + } + + for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + y.iushrn(j); + while (j-- > 0) { + if (C.isOdd() || D.isOdd()) { + C.iadd(yp); + D.isub(xp); + } + + C.iushrn(1); + D.iushrn(1); + } + } + + if (x.cmp(y) >= 0) { + x.isub(y); + A.isub(C); + B.isub(D); + } else { + y.isub(x); + C.isub(A); + D.isub(B); + } + } + + return { + a: C, + b: D, + gcd: y.iushln(g) + }; + }; + + // This is reduced incarnation of the binary EEA + // above, designated to invert members of the + // _prime_ fields F(p) at a maximal speed + BN.prototype._invmp = function _invmp (p) { + assert(p.negative === 0); + assert(!p.isZero()); + + var a = this; + var b = p.clone(); + + if (a.negative !== 0) { + a = a.umod(p); + } else { + a = a.clone(); + } + + var x1 = new BN(1); + var x2 = new BN(0); + + var delta = b.clone(); + + while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { + for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); + if (i > 0) { + a.iushrn(i); + while (i-- > 0) { + if (x1.isOdd()) { + x1.iadd(delta); + } + + x1.iushrn(1); + } + } + + for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); + if (j > 0) { + b.iushrn(j); + while (j-- > 0) { + if (x2.isOdd()) { + x2.iadd(delta); + } + + x2.iushrn(1); + } + } + + if (a.cmp(b) >= 0) { + a.isub(b); + x1.isub(x2); + } else { + b.isub(a); + x2.isub(x1); + } + } + + var res; + if (a.cmpn(1) === 0) { + res = x1; + } else { + res = x2; + } + + if (res.cmpn(0) < 0) { + res.iadd(p); + } + + return res; + }; + + BN.prototype.gcd = function gcd (num) { + if (this.isZero()) return num.abs(); + if (num.isZero()) return this.abs(); + + var a = this.clone(); + var b = num.clone(); + a.negative = 0; + b.negative = 0; + + // Remove common factor of two + for (var shift = 0; a.isEven() && b.isEven(); shift++) { + a.iushrn(1); + b.iushrn(1); + } + + do { + while (a.isEven()) { + a.iushrn(1); + } + while (b.isEven()) { + b.iushrn(1); + } + + var r = a.cmp(b); + if (r < 0) { + // Swap `a` and `b` to make `a` always bigger than `b` + var t = a; + a = b; + b = t; + } else if (r === 0 || b.cmpn(1) === 0) { + break; + } + + a.isub(b); + } while (true); + + return b.iushln(shift); + }; + + // Invert number in the field F(num) + BN.prototype.invm = function invm (num) { + return this.egcd(num).a.umod(num); + }; + + BN.prototype.isEven = function isEven () { + return (this.words[0] & 1) === 0; + }; + + BN.prototype.isOdd = function isOdd () { + return (this.words[0] & 1) === 1; + }; + + // And first word and num + BN.prototype.andln = function andln (num) { + return this.words[0] & num; + }; + + // Increment at the bit position in-line + BN.prototype.bincn = function bincn (bit) { + assert(typeof bit === 'number'); + var r = bit % 26; + var s = (bit - r) / 26; + var q = 1 << r; + + // Fast case: bit is much higher than all existing words + if (this.length <= s) { + this._expand(s + 1); + this.words[s] |= q; + return this; + } + + // Add bit and propagate, if needed + var carry = q; + for (var i = s; carry !== 0 && i < this.length; i++) { + var w = this.words[i] | 0; + w += carry; + carry = w >>> 26; + w &= 0x3ffffff; + this.words[i] = w; + } + if (carry !== 0) { + this.words[i] = carry; + this.length++; + } + return this; + }; + + BN.prototype.isZero = function isZero () { + return this.length === 1 && this.words[0] === 0; + }; + + BN.prototype.cmpn = function cmpn (num) { + var negative = num < 0; + + if (this.negative !== 0 && !negative) return -1; + if (this.negative === 0 && negative) return 1; + + this.strip(); + + var res; + if (this.length > 1) { + res = 1; + } else { + if (negative) { + num = -num; + } + + assert(num <= 0x3ffffff, 'Number is too big'); + + var w = this.words[0] | 0; + res = w === num ? 0 : w < num ? -1 : 1; + } + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Compare two numbers and return: + // 1 - if `this` > `num` + // 0 - if `this` == `num` + // -1 - if `this` < `num` + BN.prototype.cmp = function cmp (num) { + if (this.negative !== 0 && num.negative === 0) return -1; + if (this.negative === 0 && num.negative !== 0) return 1; + + var res = this.ucmp(num); + if (this.negative !== 0) return -res | 0; + return res; + }; + + // Unsigned comparison + BN.prototype.ucmp = function ucmp (num) { + // At this point both numbers have the same sign + if (this.length > num.length) return 1; + if (this.length < num.length) return -1; + + var res = 0; + for (var i = this.length - 1; i >= 0; i--) { + var a = this.words[i] | 0; + var b = num.words[i] | 0; + + if (a === b) continue; + if (a < b) { + res = -1; + } else if (a > b) { + res = 1; + } + break; + } + return res; + }; + + BN.prototype.gtn = function gtn (num) { + return this.cmpn(num) === 1; + }; + + BN.prototype.gt = function gt (num) { + return this.cmp(num) === 1; + }; + + BN.prototype.gten = function gten (num) { + return this.cmpn(num) >= 0; + }; + + BN.prototype.gte = function gte (num) { + return this.cmp(num) >= 0; + }; + + BN.prototype.ltn = function ltn (num) { + return this.cmpn(num) === -1; + }; + + BN.prototype.lt = function lt (num) { + return this.cmp(num) === -1; + }; + + BN.prototype.lten = function lten (num) { + return this.cmpn(num) <= 0; + }; + + BN.prototype.lte = function lte (num) { + return this.cmp(num) <= 0; + }; + + BN.prototype.eqn = function eqn (num) { + return this.cmpn(num) === 0; + }; + + BN.prototype.eq = function eq (num) { + return this.cmp(num) === 0; + }; + + // + // A reduce context, could be using montgomery or something better, depending + // on the `m` itself. + // + BN.red = function red (num) { + return new Red(num); + }; + + BN.prototype.toRed = function toRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + assert(this.negative === 0, 'red works only with positives'); + return ctx.convertTo(this)._forceRed(ctx); + }; + + BN.prototype.fromRed = function fromRed () { + assert(this.red, 'fromRed works only with numbers in reduction context'); + return this.red.convertFrom(this); + }; + + BN.prototype._forceRed = function _forceRed (ctx) { + this.red = ctx; + return this; + }; + + BN.prototype.forceRed = function forceRed (ctx) { + assert(!this.red, 'Already a number in reduction context'); + return this._forceRed(ctx); + }; + + BN.prototype.redAdd = function redAdd (num) { + assert(this.red, 'redAdd works only with red numbers'); + return this.red.add(this, num); + }; + + BN.prototype.redIAdd = function redIAdd (num) { + assert(this.red, 'redIAdd works only with red numbers'); + return this.red.iadd(this, num); + }; + + BN.prototype.redSub = function redSub (num) { + assert(this.red, 'redSub works only with red numbers'); + return this.red.sub(this, num); + }; + + BN.prototype.redISub = function redISub (num) { + assert(this.red, 'redISub works only with red numbers'); + return this.red.isub(this, num); + }; + + BN.prototype.redShl = function redShl (num) { + assert(this.red, 'redShl works only with red numbers'); + return this.red.shl(this, num); + }; + + BN.prototype.redMul = function redMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.mul(this, num); + }; + + BN.prototype.redIMul = function redIMul (num) { + assert(this.red, 'redMul works only with red numbers'); + this.red._verify2(this, num); + return this.red.imul(this, num); + }; + + BN.prototype.redSqr = function redSqr () { + assert(this.red, 'redSqr works only with red numbers'); + this.red._verify1(this); + return this.red.sqr(this); + }; + + BN.prototype.redISqr = function redISqr () { + assert(this.red, 'redISqr works only with red numbers'); + this.red._verify1(this); + return this.red.isqr(this); + }; + + // Square root over p + BN.prototype.redSqrt = function redSqrt () { + assert(this.red, 'redSqrt works only with red numbers'); + this.red._verify1(this); + return this.red.sqrt(this); + }; + + BN.prototype.redInvm = function redInvm () { + assert(this.red, 'redInvm works only with red numbers'); + this.red._verify1(this); + return this.red.invm(this); + }; + + // Return negative clone of `this` % `red modulo` + BN.prototype.redNeg = function redNeg () { + assert(this.red, 'redNeg works only with red numbers'); + this.red._verify1(this); + return this.red.neg(this); + }; + + BN.prototype.redPow = function redPow (num) { + assert(this.red && !num.red, 'redPow(normalNum)'); + this.red._verify1(this); + return this.red.pow(this, num); + }; + + // Prime numbers with efficient reduction + var primes = { + k256: null, + p224: null, + p192: null, + p25519: null + }; + + // Pseudo-Mersenne prime + function MPrime (name, p) { + // P = 2 ^ N - K + this.name = name; + this.p = new BN(p, 16); + this.n = this.p.bitLength(); + this.k = new BN(1).iushln(this.n).isub(this.p); + + this.tmp = this._tmp(); + } + + MPrime.prototype._tmp = function _tmp () { + var tmp = new BN(null); + tmp.words = new Array(Math.ceil(this.n / 13)); + return tmp; + }; + + MPrime.prototype.ireduce = function ireduce (num) { + // Assumes that `num` is less than `P^2` + // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P) + var r = num; + var rlen; + + do { + this.split(r, this.tmp); + r = this.imulK(r); + r = r.iadd(this.tmp); + rlen = r.bitLength(); + } while (rlen > this.n); + + var cmp = rlen < this.n ? -1 : r.ucmp(this.p); + if (cmp === 0) { + r.words[0] = 0; + r.length = 1; + } else if (cmp > 0) { + r.isub(this.p); + } else { + if (r.strip !== undefined) { + // r is BN v4 instance + r.strip(); + } else { + // r is BN v5 instance + r._strip(); + } + } + + return r; + }; + + MPrime.prototype.split = function split (input, out) { + input.iushrn(this.n, 0, out); + }; + + MPrime.prototype.imulK = function imulK (num) { + return num.imul(this.k); + }; + + function K256 () { + MPrime.call( + this, + 'k256', + 'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f'); + } + inherits(K256, MPrime); + + K256.prototype.split = function split (input, output) { + // 256 = 9 * 26 + 22 + var mask = 0x3fffff; + + var outLen = Math.min(input.length, 9); + for (var i = 0; i < outLen; i++) { + output.words[i] = input.words[i]; + } + output.length = outLen; + + if (input.length <= 9) { + input.words[0] = 0; + input.length = 1; + return; + } + + // Shift by 9 limbs + var prev = input.words[9]; + output.words[output.length++] = prev & mask; + + for (i = 10; i < input.length; i++) { + var next = input.words[i] | 0; + input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); + prev = next; + } + prev >>>= 22; + input.words[i - 10] = prev; + if (prev === 0 && input.length > 10) { + input.length -= 10; + } else { + input.length -= 9; + } + }; + + K256.prototype.imulK = function imulK (num) { + // K = 0x1000003d1 = [ 0x40, 0x3d1 ] + num.words[num.length] = 0; + num.words[num.length + 1] = 0; + num.length += 2; + + // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390 + var lo = 0; + for (var i = 0; i < num.length; i++) { + var w = num.words[i] | 0; + lo += w * 0x3d1; + num.words[i] = lo & 0x3ffffff; + lo = w * 0x40 + ((lo / 0x4000000) | 0); + } + + // Fast length reduction + if (num.words[num.length - 1] === 0) { + num.length--; + if (num.words[num.length - 1] === 0) { + num.length--; + } + } + return num; + }; + + function P224 () { + MPrime.call( + this, + 'p224', + 'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001'); + } + inherits(P224, MPrime); + + function P192 () { + MPrime.call( + this, + 'p192', + 'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff'); + } + inherits(P192, MPrime); + + function P25519 () { + // 2 ^ 255 - 19 + MPrime.call( + this, + '25519', + '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed'); + } + inherits(P25519, MPrime); + + P25519.prototype.imulK = function imulK (num) { + // K = 0x13 + var carry = 0; + for (var i = 0; i < num.length; i++) { + var hi = (num.words[i] | 0) * 0x13 + carry; + var lo = hi & 0x3ffffff; + hi >>>= 26; + + num.words[i] = lo; + carry = hi; + } + if (carry !== 0) { + num.words[num.length++] = carry; + } + return num; + }; + + // Exported mostly for testing purposes, use plain name instead + BN._prime = function prime (name) { + // Cached version of prime + if (primes[name]) return primes[name]; + + var prime; + if (name === 'k256') { + prime = new K256(); + } else if (name === 'p224') { + prime = new P224(); + } else if (name === 'p192') { + prime = new P192(); + } else if (name === 'p25519') { + prime = new P25519(); + } else { + throw new Error('Unknown prime ' + name); + } + primes[name] = prime; + + return prime; + }; + + // + // Base reduction engine + // + function Red (m) { + if (typeof m === 'string') { + var prime = BN._prime(m); + this.m = prime.p; + this.prime = prime; + } else { + assert(m.gtn(1), 'modulus must be greater than 1'); + this.m = m; + this.prime = null; + } + } + + Red.prototype._verify1 = function _verify1 (a) { + assert(a.negative === 0, 'red works only with positives'); + assert(a.red, 'red works only with red numbers'); + }; + + Red.prototype._verify2 = function _verify2 (a, b) { + assert((a.negative | b.negative) === 0, 'red works only with positives'); + assert(a.red && a.red === b.red, + 'red works only with red numbers'); + }; + + Red.prototype.imod = function imod (a) { + if (this.prime) return this.prime.ireduce(a)._forceRed(this); + return a.umod(this.m)._forceRed(this); + }; + + Red.prototype.neg = function neg (a) { + if (a.isZero()) { + return a.clone(); + } + + return this.m.sub(a)._forceRed(this); + }; + + Red.prototype.add = function add (a, b) { + this._verify2(a, b); + + var res = a.add(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.iadd = function iadd (a, b) { + this._verify2(a, b); + + var res = a.iadd(b); + if (res.cmp(this.m) >= 0) { + res.isub(this.m); + } + return res; + }; + + Red.prototype.sub = function sub (a, b) { + this._verify2(a, b); + + var res = a.sub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res._forceRed(this); + }; + + Red.prototype.isub = function isub (a, b) { + this._verify2(a, b); + + var res = a.isub(b); + if (res.cmpn(0) < 0) { + res.iadd(this.m); + } + return res; + }; + + Red.prototype.shl = function shl (a, num) { + this._verify1(a); + return this.imod(a.ushln(num)); + }; + + Red.prototype.imul = function imul (a, b) { + this._verify2(a, b); + return this.imod(a.imul(b)); + }; + + Red.prototype.mul = function mul (a, b) { + this._verify2(a, b); + return this.imod(a.mul(b)); + }; + + Red.prototype.isqr = function isqr (a) { + return this.imul(a, a.clone()); + }; + + Red.prototype.sqr = function sqr (a) { + return this.mul(a, a); + }; + + Red.prototype.sqrt = function sqrt (a) { + if (a.isZero()) return a.clone(); + + var mod3 = this.m.andln(3); + assert(mod3 % 2 === 1); + + // Fast case + if (mod3 === 3) { + var pow = this.m.add(new BN(1)).iushrn(2); + return this.pow(a, pow); + } + + // Tonelli-Shanks algorithm (Totally unoptimized and slow) + // + // Find Q and S, that Q * 2 ^ S = (P - 1) + var q = this.m.subn(1); + var s = 0; + while (!q.isZero() && q.andln(1) === 0) { + s++; + q.iushrn(1); + } + assert(!q.isZero()); + + var one = new BN(1).toRed(this); + var nOne = one.redNeg(); + + // Find quadratic non-residue + // NOTE: Max is such because of generalized Riemann hypothesis. + var lpow = this.m.subn(1).iushrn(1); + var z = this.m.bitLength(); + z = new BN(2 * z * z).toRed(this); + + while (this.pow(z, lpow).cmp(nOne) !== 0) { + z.redIAdd(nOne); + } + + var c = this.pow(z, q); + var r = this.pow(a, q.addn(1).iushrn(1)); + var t = this.pow(a, q); + var m = s; + while (t.cmp(one) !== 0) { + var tmp = t; + for (var i = 0; tmp.cmp(one) !== 0; i++) { + tmp = tmp.redSqr(); + } + assert(i < m); + var b = this.pow(c, new BN(1).iushln(m - i - 1)); + + r = r.redMul(b); + c = b.redSqr(); + t = t.redMul(c); + m = i; + } + + return r; + }; + + Red.prototype.invm = function invm (a) { + var inv = a._invmp(this.m); + if (inv.negative !== 0) { + inv.negative = 0; + return this.imod(inv).redNeg(); + } else { + return this.imod(inv); + } + }; + + Red.prototype.pow = function pow (a, num) { + if (num.isZero()) return new BN(1).toRed(this); + if (num.cmpn(1) === 0) return a.clone(); + + var windowSize = 4; + var wnd = new Array(1 << windowSize); + wnd[0] = new BN(1).toRed(this); + wnd[1] = a; + for (var i = 2; i < wnd.length; i++) { + wnd[i] = this.mul(wnd[i - 1], a); + } + + var res = wnd[0]; + var current = 0; + var currentLen = 0; + var start = num.bitLength() % 26; + if (start === 0) { + start = 26; + } + + for (i = num.length - 1; i >= 0; i--) { + var word = num.words[i]; + for (var j = start - 1; j >= 0; j--) { + var bit = (word >> j) & 1; + if (res !== wnd[0]) { + res = this.sqr(res); + } + + if (bit === 0 && current === 0) { + currentLen = 0; + continue; + } + + current <<= 1; + current |= bit; + currentLen++; + if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; + + res = this.mul(res, wnd[current]); + currentLen = 0; + current = 0; + } + start = 26; + } + + return res; + }; + + Red.prototype.convertTo = function convertTo (num) { + var r = num.umod(this.m); + + return r === num ? r.clone() : r; + }; + + Red.prototype.convertFrom = function convertFrom (num) { + var res = num.clone(); + res.red = null; + return res; + }; + + // + // Montgomery method engine + // + + BN.mont = function mont (num) { + return new Mont(num); + }; + + function Mont (m) { + Red.call(this, m); + + this.shift = this.m.bitLength(); + if (this.shift % 26 !== 0) { + this.shift += 26 - (this.shift % 26); + } + + this.r = new BN(1).iushln(this.shift); + this.r2 = this.imod(this.r.sqr()); + this.rinv = this.r._invmp(this.m); + + this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); + this.minv = this.minv.umod(this.r); + this.minv = this.r.sub(this.minv); + } + inherits(Mont, Red); + + Mont.prototype.convertTo = function convertTo (num) { + return this.imod(num.ushln(this.shift)); + }; + + Mont.prototype.convertFrom = function convertFrom (num) { + var r = this.imod(num.mul(this.rinv)); + r.red = null; + return r; + }; + + Mont.prototype.imul = function imul (a, b) { + if (a.isZero() || b.isZero()) { + a.words[0] = 0; + a.length = 1; + return a; + } + + var t = a.imul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + + return res._forceRed(this); + }; + + Mont.prototype.mul = function mul (a, b) { + if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); + + var t = a.mul(b); + var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); + var u = t.isub(c).iushrn(this.shift); + var res = u; + if (u.cmp(this.m) >= 0) { + res = u.isub(this.m); + } else if (u.cmpn(0) < 0) { + res = u.iadd(this.m); + } + + return res._forceRed(this); + }; + + Mont.prototype.invm = function invm (a) { + // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R + var res = this.imod(a._invmp(this.m).mul(this.r2)); + return res._forceRed(this); + }; +})( false || module, this); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../next/dist/compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/clsx/dist/clsx.m.js": +/*!******************************************!*\ + !*** ./node_modules/clsx/dist/clsx.m.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +function toVal(mix) { + var k, y, str=''; + + if (typeof mix === 'string' || typeof mix === 'number') { + str += mix; + } else if (typeof mix === 'object') { + if (Array.isArray(mix)) { + for (k=0; k < mix.length; k++) { + if (mix[k]) { + if (y = toVal(mix[k])) { + str && (str += ' '); + str += y; + } + } + } + } else { + for (k in mix) { + if (mix[k]) { + str && (str += ' '); + str += k; + } + } + } + } + + return str; +} + +/* harmony default export */ __webpack_exports__["default"] = (function () { + var i=0, tmp, x, str=''; + while (i < arguments.length) { + if (tmp = arguments[i++]) { + if (x = toVal(tmp)) { + str && (str += ' '); + str += x + } + } + } + return str; +}); + + +/***/ }), + +/***/ "./node_modules/ethers/lib.esm/_version.js": +/*!*************************************************!*\ + !*** ./node_modules/ethers/lib.esm/_version.js ***! + \*************************************************/ +/*! exports provided: version */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; }); +const version = "ethers/5.0.31"; +//# sourceMappingURL=_version.js.map + +/***/ }), + +/***/ "./node_modules/ethers/lib.esm/ethers.js": +/*!***********************************************!*\ + !*** ./node_modules/ethers/lib.esm/ethers.js ***! + \***********************************************/ +/*! exports provided: Signer, Wallet, VoidSigner, getDefaultProvider, providers, Contract, ContractFactory, BigNumber, FixedNumber, constants, errors, logger, utils, wordlists, version, Wordlist */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; }); +/* harmony import */ var _ethersproject_contracts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/contracts */ "./node_modules/@ethersproject/contracts/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Contract", function() { return _ethersproject_contracts__WEBPACK_IMPORTED_MODULE_0__["Contract"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ContractFactory", function() { return _ethersproject_contracts__WEBPACK_IMPORTED_MODULE_0__["ContractFactory"]; }); + +/* harmony import */ var _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/bignumber */ "./node_modules/@ethersproject/bignumber/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BigNumber", function() { return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["BigNumber"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FixedNumber", function() { return _ethersproject_bignumber__WEBPACK_IMPORTED_MODULE_1__["FixedNumber"]; }); + +/* harmony import */ var _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/abstract-signer */ "./node_modules/@ethersproject/abstract-signer/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Signer", function() { return _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__["Signer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VoidSigner", function() { return _ethersproject_abstract_signer__WEBPACK_IMPORTED_MODULE_2__["VoidSigner"]; }); + +/* harmony import */ var _ethersproject_wallet__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/wallet */ "./node_modules/@ethersproject/wallet/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Wallet", function() { return _ethersproject_wallet__WEBPACK_IMPORTED_MODULE_3__["Wallet"]; }); + +/* harmony import */ var _ethersproject_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/constants */ "./node_modules/@ethersproject/constants/lib.esm/index.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "constants", function() { return _ethersproject_constants__WEBPACK_IMPORTED_MODULE_4__; }); +/* harmony import */ var _ethersproject_providers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/providers */ "./node_modules/@ethersproject/providers/lib.esm/index.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "providers", function() { return _ethersproject_providers__WEBPACK_IMPORTED_MODULE_5__; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDefaultProvider", function() { return _ethersproject_providers__WEBPACK_IMPORTED_MODULE_5__["getDefaultProvider"]; }); + +/* harmony import */ var _ethersproject_wordlists__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/wordlists */ "./node_modules/@ethersproject/wordlists/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wordlists", function() { return _ethersproject_wordlists__WEBPACK_IMPORTED_MODULE_6__["wordlists"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Wordlist", function() { return _ethersproject_wordlists__WEBPACK_IMPORTED_MODULE_6__["Wordlist"]; }); + +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./utils */ "./node_modules/ethers/lib.esm/utils.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "utils", function() { return _utils__WEBPACK_IMPORTED_MODULE_7__; }); +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "errors", function() { return _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["ErrorCode"]; }); + +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./_version */ "./node_modules/ethers/lib.esm/_version.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version", function() { return _version__WEBPACK_IMPORTED_MODULE_9__["version"]; }); + + + + + + + + + + + + +//////////////////////// +// Compile-Time Constants +// This is generated by "npm run dist" + +const logger = new _ethersproject_logger__WEBPACK_IMPORTED_MODULE_8__["Logger"](_version__WEBPACK_IMPORTED_MODULE_9__["version"]); +//////////////////////// +// Exports + +//# sourceMappingURL=ethers.js.map + +/***/ }), + +/***/ "./node_modules/ethers/lib.esm/index.js": +/*!**********************************************!*\ + !*** ./node_modules/ethers/lib.esm/index.js ***! + \**********************************************/ +/*! exports provided: ethers, Signer, Wallet, VoidSigner, getDefaultProvider, providers, Contract, ContractFactory, BigNumber, FixedNumber, constants, errors, logger, utils, wordlists, version, Wordlist */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ethers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ethers */ "./node_modules/ethers/lib.esm/ethers.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "ethers", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Signer", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["Signer"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Wallet", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["Wallet"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VoidSigner", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["VoidSigner"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDefaultProvider", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["getDefaultProvider"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "providers", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["providers"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Contract", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["Contract"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ContractFactory", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["ContractFactory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BigNumber", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["BigNumber"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FixedNumber", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["FixedNumber"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "constants", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["constants"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "errors", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["errors"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["logger"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utils", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["utils"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wordlists", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["wordlists"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["version"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Wordlist", function() { return _ethers__WEBPACK_IMPORTED_MODULE_0__["Wordlist"]; }); + + +// To modify this file, you must update ./misc/admin/lib/cmds/update-exports.js + +try { + const anyGlobal = window; + if (anyGlobal._ethers == null) { + anyGlobal._ethers = _ethers__WEBPACK_IMPORTED_MODULE_0__; + } +} +catch (error) { } + + +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ "./node_modules/ethers/lib.esm/utils.js": +/*!**********************************************!*\ + !*** ./node_modules/ethers/lib.esm/utils.js ***! + \**********************************************/ +/*! exports provided: AbiCoder, defaultAbiCoder, Fragment, EventFragment, FunctionFragment, ParamType, FormatTypes, checkResultErrors, Logger, RLP, _fetchData, fetchJson, poll, checkProperties, deepCopy, defineReadOnly, getStatic, resolveProperties, shallowCopy, arrayify, concat, stripZeros, zeroPad, isBytes, isBytesLike, defaultPath, HDNode, SigningKey, Interface, LogDescription, TransactionDescription, base58, base64, hexlify, isHexString, hexConcat, hexStripZeros, hexValue, hexZeroPad, hexDataLength, hexDataSlice, nameprep, _toEscapedUtf8String, toUtf8Bytes, toUtf8CodePoints, toUtf8String, Utf8ErrorFuncs, formatBytes32String, parseBytes32String, hashMessage, namehash, isValidName, id, _TypedDataEncoder, getAddress, getIcapAddress, getContractAddress, getCreate2Address, isAddress, formatEther, parseEther, formatUnits, parseUnits, commify, computeHmac, keccak256, ripemd160, sha256, sha512, randomBytes, shuffled, solidityPack, solidityKeccak256, soliditySha256, splitSignature, joinSignature, parseTransaction, serializeTransaction, getJsonWalletAddress, computeAddress, recoverAddress, computePublicKey, recoverPublicKey, verifyMessage, verifyTypedData, mnemonicToEntropy, entropyToMnemonic, isValidMnemonic, mnemonicToSeed, SupportedAlgorithm, UnicodeNormalizationForm, Utf8ErrorReason, Indexed */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @ethersproject/abi */ "./node_modules/@ethersproject/abi/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AbiCoder", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["AbiCoder"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultAbiCoder", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["defaultAbiCoder"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Fragment", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["Fragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EventFragment", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["EventFragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FunctionFragment", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["FunctionFragment"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ParamType", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["ParamType"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormatTypes", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["FormatTypes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "checkResultErrors", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["checkResultErrors"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Interface", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["Interface"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LogDescription", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["LogDescription"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransactionDescription", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["TransactionDescription"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Indexed", function() { return _ethersproject_abi__WEBPACK_IMPORTED_MODULE_0__["Indexed"]; }); + +/* harmony import */ var _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @ethersproject/address */ "./node_modules/@ethersproject/address/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getAddress", function() { return _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__["getAddress"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getIcapAddress", function() { return _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__["getIcapAddress"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getContractAddress", function() { return _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__["getContractAddress"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCreate2Address", function() { return _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__["getCreate2Address"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isAddress", function() { return _ethersproject_address__WEBPACK_IMPORTED_MODULE_1__["isAddress"]; }); + +/* harmony import */ var _ethersproject_base64__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @ethersproject/base64 */ "./node_modules/@ethersproject/base64/lib.esm/index.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "base64", function() { return _ethersproject_base64__WEBPACK_IMPORTED_MODULE_2__; }); +/* harmony import */ var _ethersproject_basex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @ethersproject/basex */ "./node_modules/@ethersproject/basex/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "base58", function() { return _ethersproject_basex__WEBPACK_IMPORTED_MODULE_3__["Base58"]; }); + +/* harmony import */ var _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @ethersproject/bytes */ "./node_modules/@ethersproject/bytes/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arrayify", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["arrayify"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["concat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stripZeros", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["stripZeros"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zeroPad", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["zeroPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isBytes", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["isBytes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isBytesLike", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["isBytesLike"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexlify", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexlify"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isHexString", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["isHexString"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexConcat", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexConcat"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexStripZeros", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexStripZeros"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexValue", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexValue"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexZeroPad", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexZeroPad"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexDataLength", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexDataLength"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hexDataSlice", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["hexDataSlice"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "splitSignature", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["splitSignature"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "joinSignature", function() { return _ethersproject_bytes__WEBPACK_IMPORTED_MODULE_4__["joinSignature"]; }); + +/* harmony import */ var _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @ethersproject/hash */ "./node_modules/@ethersproject/hash/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hashMessage", function() { return _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["hashMessage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namehash", function() { return _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["namehash"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isValidName", function() { return _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["isValidName"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "id", function() { return _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["id"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_TypedDataEncoder", function() { return _ethersproject_hash__WEBPACK_IMPORTED_MODULE_5__["_TypedDataEncoder"]; }); + +/* harmony import */ var _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @ethersproject/hdnode */ "./node_modules/@ethersproject/hdnode/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultPath", function() { return _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__["defaultPath"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HDNode", function() { return _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__["HDNode"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mnemonicToEntropy", function() { return _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__["mnemonicToEntropy"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "entropyToMnemonic", function() { return _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__["entropyToMnemonic"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isValidMnemonic", function() { return _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__["isValidMnemonic"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mnemonicToSeed", function() { return _ethersproject_hdnode__WEBPACK_IMPORTED_MODULE_6__["mnemonicToSeed"]; }); + +/* harmony import */ var _ethersproject_json_wallets__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @ethersproject/json-wallets */ "./node_modules/@ethersproject/json-wallets/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getJsonWalletAddress", function() { return _ethersproject_json_wallets__WEBPACK_IMPORTED_MODULE_7__["getJsonWalletAddress"]; }); + +/* harmony import */ var _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @ethersproject/keccak256 */ "./node_modules/@ethersproject/keccak256/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keccak256", function() { return _ethersproject_keccak256__WEBPACK_IMPORTED_MODULE_8__["keccak256"]; }); + +/* harmony import */ var _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @ethersproject/logger */ "./node_modules/@ethersproject/logger/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Logger", function() { return _ethersproject_logger__WEBPACK_IMPORTED_MODULE_9__["Logger"]; }); + +/* harmony import */ var _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @ethersproject/sha2 */ "./node_modules/@ethersproject/sha2/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeHmac", function() { return _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_10__["computeHmac"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ripemd160", function() { return _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_10__["ripemd160"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sha256", function() { return _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_10__["sha256"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sha512", function() { return _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_10__["sha512"]; }); + +/* harmony import */ var _ethersproject_solidity__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @ethersproject/solidity */ "./node_modules/@ethersproject/solidity/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "solidityPack", function() { return _ethersproject_solidity__WEBPACK_IMPORTED_MODULE_11__["pack"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "solidityKeccak256", function() { return _ethersproject_solidity__WEBPACK_IMPORTED_MODULE_11__["keccak256"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "soliditySha256", function() { return _ethersproject_solidity__WEBPACK_IMPORTED_MODULE_11__["sha256"]; }); + +/* harmony import */ var _ethersproject_random__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @ethersproject/random */ "./node_modules/@ethersproject/random/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomBytes", function() { return _ethersproject_random__WEBPACK_IMPORTED_MODULE_12__["randomBytes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shuffled", function() { return _ethersproject_random__WEBPACK_IMPORTED_MODULE_12__["shuffled"]; }); + +/* harmony import */ var _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @ethersproject/properties */ "./node_modules/@ethersproject/properties/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "checkProperties", function() { return _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__["checkProperties"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "deepCopy", function() { return _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__["deepCopy"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defineReadOnly", function() { return _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__["defineReadOnly"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getStatic", function() { return _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__["getStatic"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resolveProperties", function() { return _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__["resolveProperties"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shallowCopy", function() { return _ethersproject_properties__WEBPACK_IMPORTED_MODULE_13__["shallowCopy"]; }); + +/* harmony import */ var _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @ethersproject/rlp */ "./node_modules/@ethersproject/rlp/lib.esm/index.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "RLP", function() { return _ethersproject_rlp__WEBPACK_IMPORTED_MODULE_14__; }); +/* harmony import */ var _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @ethersproject/signing-key */ "./node_modules/@ethersproject/signing-key/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SigningKey", function() { return _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_15__["SigningKey"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computePublicKey", function() { return _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_15__["computePublicKey"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "recoverPublicKey", function() { return _ethersproject_signing_key__WEBPACK_IMPORTED_MODULE_15__["recoverPublicKey"]; }); + +/* harmony import */ var _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @ethersproject/strings */ "./node_modules/@ethersproject/strings/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nameprep", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["nameprep"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_toEscapedUtf8String", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["_toEscapedUtf8String"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toUtf8Bytes", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["toUtf8Bytes"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toUtf8CodePoints", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["toUtf8CodePoints"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toUtf8String", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["toUtf8String"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Utf8ErrorFuncs", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["Utf8ErrorFuncs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatBytes32String", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["formatBytes32String"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseBytes32String", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["parseBytes32String"]; }); + +/* harmony import */ var _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @ethersproject/transactions */ "./node_modules/@ethersproject/transactions/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseTransaction", function() { return _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_17__["parse"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "serializeTransaction", function() { return _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_17__["serialize"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "computeAddress", function() { return _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_17__["computeAddress"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "recoverAddress", function() { return _ethersproject_transactions__WEBPACK_IMPORTED_MODULE_17__["recoverAddress"]; }); + +/* harmony import */ var _ethersproject_units__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @ethersproject/units */ "./node_modules/@ethersproject/units/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatEther", function() { return _ethersproject_units__WEBPACK_IMPORTED_MODULE_18__["formatEther"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseEther", function() { return _ethersproject_units__WEBPACK_IMPORTED_MODULE_18__["parseEther"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatUnits", function() { return _ethersproject_units__WEBPACK_IMPORTED_MODULE_18__["formatUnits"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "parseUnits", function() { return _ethersproject_units__WEBPACK_IMPORTED_MODULE_18__["parseUnits"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "commify", function() { return _ethersproject_units__WEBPACK_IMPORTED_MODULE_18__["commify"]; }); + +/* harmony import */ var _ethersproject_wallet__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @ethersproject/wallet */ "./node_modules/@ethersproject/wallet/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "verifyMessage", function() { return _ethersproject_wallet__WEBPACK_IMPORTED_MODULE_19__["verifyMessage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "verifyTypedData", function() { return _ethersproject_wallet__WEBPACK_IMPORTED_MODULE_19__["verifyTypedData"]; }); + +/* harmony import */ var _ethersproject_web__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @ethersproject/web */ "./node_modules/@ethersproject/web/lib.esm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "_fetchData", function() { return _ethersproject_web__WEBPACK_IMPORTED_MODULE_20__["_fetchData"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fetchJson", function() { return _ethersproject_web__WEBPACK_IMPORTED_MODULE_20__["fetchJson"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "poll", function() { return _ethersproject_web__WEBPACK_IMPORTED_MODULE_20__["poll"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SupportedAlgorithm", function() { return _ethersproject_sha2__WEBPACK_IMPORTED_MODULE_10__["SupportedAlgorithm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnicodeNormalizationForm", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["UnicodeNormalizationForm"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Utf8ErrorReason", function() { return _ethersproject_strings__WEBPACK_IMPORTED_MODULE_16__["Utf8ErrorReason"]; }); + + + + + + + + + + + + + + + + + + + + + + + +//////////////////////// +// Enums + + +//////////////////////// +// Exports + +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ "./node_modules/exenv/index.js": +/*!*************************************!*\ + !*** ./node_modules/exenv/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_RESULT__;/*! + Copyright (c) 2015 Jed Watson. + Based on code that is Copyright 2013-2015, Facebook, Inc. + All rights reserved. +*/ +/* global define */ + +(function () { + 'use strict'; + + var canUseDOM = !!( + typeof window !== 'undefined' && + window.document && + window.document.createElement + ); + + var ExecutionEnvironment = { + + canUseDOM: canUseDOM, + + canUseWorkers: typeof Worker !== 'undefined', + + canUseEventListeners: + canUseDOM && !!(window.addEventListener || window.attachEvent), + + canUseViewport: canUseDOM && !!window.screen + + }; + + if (true) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { + return ExecutionEnvironment; + }).call(exports, __webpack_require__, exports, module), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else {} + +}()); + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash.js": +/*!******************************************!*\ + !*** ./node_modules/hash.js/lib/hash.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +var hash = exports; + +hash.utils = __webpack_require__(/*! ./hash/utils */ "./node_modules/hash.js/lib/hash/utils.js"); +hash.common = __webpack_require__(/*! ./hash/common */ "./node_modules/hash.js/lib/hash/common.js"); +hash.sha = __webpack_require__(/*! ./hash/sha */ "./node_modules/hash.js/lib/hash/sha.js"); +hash.ripemd = __webpack_require__(/*! ./hash/ripemd */ "./node_modules/hash.js/lib/hash/ripemd.js"); +hash.hmac = __webpack_require__(/*! ./hash/hmac */ "./node_modules/hash.js/lib/hash/hmac.js"); + +// Proxy hash functions to the main object +hash.sha1 = hash.sha.sha1; +hash.sha256 = hash.sha.sha256; +hash.sha224 = hash.sha.sha224; +hash.sha384 = hash.sha.sha384; +hash.sha512 = hash.sha.sha512; +hash.ripemd160 = hash.ripemd.ripemd160; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/common.js": +/*!*************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/common.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +function BlockHash() { + this.pending = null; + this.pendingTotal = 0; + this.blockSize = this.constructor.blockSize; + this.outSize = this.constructor.outSize; + this.hmacStrength = this.constructor.hmacStrength; + this.padLength = this.constructor.padLength / 8; + this.endian = 'big'; + + this._delta8 = this.blockSize / 8; + this._delta32 = this.blockSize / 32; +} +exports.BlockHash = BlockHash; + +BlockHash.prototype.update = function update(msg, enc) { + // Convert message to array, pad it, and join into 32bit blocks + msg = utils.toArray(msg, enc); + if (!this.pending) + this.pending = msg; + else + this.pending = this.pending.concat(msg); + this.pendingTotal += msg.length; + + // Enough data, try updating + if (this.pending.length >= this._delta8) { + msg = this.pending; + + // Process pending data in blocks + var r = msg.length % this._delta8; + this.pending = msg.slice(msg.length - r, msg.length); + if (this.pending.length === 0) + this.pending = null; + + msg = utils.join32(msg, 0, msg.length - r, this.endian); + for (var i = 0; i < msg.length; i += this._delta32) + this._update(msg, i, i + this._delta32); + } + + return this; +}; + +BlockHash.prototype.digest = function digest(enc) { + this.update(this._pad()); + assert(this.pending === null); + + return this._digest(enc); +}; + +BlockHash.prototype._pad = function pad() { + var len = this.pendingTotal; + var bytes = this._delta8; + var k = bytes - ((len + this.padLength) % bytes); + var res = new Array(k + this.padLength); + res[0] = 0x80; + for (var i = 1; i < k; i++) + res[i] = 0; + + // Append length + len <<= 3; + if (this.endian === 'big') { + for (var t = 8; t < this.padLength; t++) + res[i++] = 0; + + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = (len >>> 24) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = len & 0xff; + } else { + res[i++] = len & 0xff; + res[i++] = (len >>> 8) & 0xff; + res[i++] = (len >>> 16) & 0xff; + res[i++] = (len >>> 24) & 0xff; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + res[i++] = 0; + + for (t = 8; t < this.padLength; t++) + res[i++] = 0; + } + + return res; +}; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/hmac.js": +/*!***********************************************!*\ + !*** ./node_modules/hash.js/lib/hash/hmac.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +function Hmac(hash, key, enc) { + if (!(this instanceof Hmac)) + return new Hmac(hash, key, enc); + this.Hash = hash; + this.blockSize = hash.blockSize / 8; + this.outSize = hash.outSize / 8; + this.inner = null; + this.outer = null; + + this._init(utils.toArray(key, enc)); +} +module.exports = Hmac; + +Hmac.prototype._init = function init(key) { + // Shorten key, if needed + if (key.length > this.blockSize) + key = new this.Hash().update(key).digest(); + assert(key.length <= this.blockSize); + + // Add padding to key + for (var i = key.length; i < this.blockSize; i++) + key.push(0); + + for (i = 0; i < key.length; i++) + key[i] ^= 0x36; + this.inner = new this.Hash().update(key); + + // 0x36 ^ 0x5c = 0x6a + for (i = 0; i < key.length; i++) + key[i] ^= 0x6a; + this.outer = new this.Hash().update(key); +}; + +Hmac.prototype.update = function update(msg, enc) { + this.inner.update(msg, enc); + return this; +}; + +Hmac.prototype.digest = function digest(enc) { + this.outer.update(this.inner.digest()); + return this.outer.digest(enc); +}; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/ripemd.js": +/*!*************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/ripemd.js ***! + \*************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ./utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ./common */ "./node_modules/hash.js/lib/hash/common.js"); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_3 = utils.sum32_3; +var sum32_4 = utils.sum32_4; +var BlockHash = common.BlockHash; + +function RIPEMD160() { + if (!(this instanceof RIPEMD160)) + return new RIPEMD160(); + + BlockHash.call(this); + + this.h = [ 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0 ]; + this.endian = 'little'; +} +utils.inherits(RIPEMD160, BlockHash); +exports.ripemd160 = RIPEMD160; + +RIPEMD160.blockSize = 512; +RIPEMD160.outSize = 160; +RIPEMD160.hmacStrength = 192; +RIPEMD160.padLength = 64; + +RIPEMD160.prototype._update = function update(msg, start) { + var A = this.h[0]; + var B = this.h[1]; + var C = this.h[2]; + var D = this.h[3]; + var E = this.h[4]; + var Ah = A; + var Bh = B; + var Ch = C; + var Dh = D; + var Eh = E; + for (var j = 0; j < 80; j++) { + var T = sum32( + rotl32( + sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), + s[j]), + E); + A = E; + E = D; + D = rotl32(C, 10); + C = B; + B = T; + T = sum32( + rotl32( + sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), + sh[j]), + Eh); + Ah = Eh; + Eh = Dh; + Dh = rotl32(Ch, 10); + Ch = Bh; + Bh = T; + } + T = sum32_3(this.h[1], C, Dh); + this.h[1] = sum32_3(this.h[2], D, Eh); + this.h[2] = sum32_3(this.h[3], E, Ah); + this.h[3] = sum32_3(this.h[4], A, Bh); + this.h[4] = sum32_3(this.h[0], B, Ch); + this.h[0] = T; +}; + +RIPEMD160.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'little'); + else + return utils.split32(this.h, 'little'); +}; + +function f(j, x, y, z) { + if (j <= 15) + return x ^ y ^ z; + else if (j <= 31) + return (x & y) | ((~x) & z); + else if (j <= 47) + return (x | (~y)) ^ z; + else if (j <= 63) + return (x & z) | (y & (~z)); + else + return x ^ (y | (~z)); +} + +function K(j) { + if (j <= 15) + return 0x00000000; + else if (j <= 31) + return 0x5a827999; + else if (j <= 47) + return 0x6ed9eba1; + else if (j <= 63) + return 0x8f1bbcdc; + else + return 0xa953fd4e; +} + +function Kh(j) { + if (j <= 15) + return 0x50a28be6; + else if (j <= 31) + return 0x5c4dd124; + else if (j <= 47) + return 0x6d703ef3; + else if (j <= 63) + return 0x7a6d76e9; + else + return 0x00000000; +} + +var r = [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 +]; + +var rh = [ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 +]; + +var s = [ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 +]; + +var sh = [ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 +]; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha.js": +/*!**********************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha.js ***! + \**********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.sha1 = __webpack_require__(/*! ./sha/1 */ "./node_modules/hash.js/lib/hash/sha/1.js"); +exports.sha224 = __webpack_require__(/*! ./sha/224 */ "./node_modules/hash.js/lib/hash/sha/224.js"); +exports.sha256 = __webpack_require__(/*! ./sha/256 */ "./node_modules/hash.js/lib/hash/sha/256.js"); +exports.sha384 = __webpack_require__(/*! ./sha/384 */ "./node_modules/hash.js/lib/hash/sha/384.js"); +exports.sha512 = __webpack_require__(/*! ./sha/512 */ "./node_modules/hash.js/lib/hash/sha/512.js"); + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha/1.js": +/*!************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha/1.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ../common */ "./node_modules/hash.js/lib/hash/common.js"); +var shaCommon = __webpack_require__(/*! ./common */ "./node_modules/hash.js/lib/hash/sha/common.js"); + +var rotl32 = utils.rotl32; +var sum32 = utils.sum32; +var sum32_5 = utils.sum32_5; +var ft_1 = shaCommon.ft_1; +var BlockHash = common.BlockHash; + +var sha1_K = [ + 0x5A827999, 0x6ED9EBA1, + 0x8F1BBCDC, 0xCA62C1D6 +]; + +function SHA1() { + if (!(this instanceof SHA1)) + return new SHA1(); + + BlockHash.call(this); + this.h = [ + 0x67452301, 0xefcdab89, 0x98badcfe, + 0x10325476, 0xc3d2e1f0 ]; + this.W = new Array(80); +} + +utils.inherits(SHA1, BlockHash); +module.exports = SHA1; + +SHA1.blockSize = 512; +SHA1.outSize = 160; +SHA1.hmacStrength = 80; +SHA1.padLength = 64; + +SHA1.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + + for(; i < W.length; i++) + W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + + for (i = 0; i < W.length; i++) { + var s = ~~(i / 20); + var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); + e = d; + d = c; + c = rotl32(b, 30); + b = a; + a = t; + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); +}; + +SHA1.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha/224.js": +/*!**************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha/224.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var SHA256 = __webpack_require__(/*! ./256 */ "./node_modules/hash.js/lib/hash/sha/256.js"); + +function SHA224() { + if (!(this instanceof SHA224)) + return new SHA224(); + + SHA256.call(this); + this.h = [ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 ]; +} +utils.inherits(SHA224, SHA256); +module.exports = SHA224; + +SHA224.blockSize = 512; +SHA224.outSize = 224; +SHA224.hmacStrength = 192; +SHA224.padLength = 64; + +SHA224.prototype._digest = function digest(enc) { + // Just truncate output + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 7), 'big'); + else + return utils.split32(this.h.slice(0, 7), 'big'); +}; + + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha/256.js": +/*!**************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha/256.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ../common */ "./node_modules/hash.js/lib/hash/common.js"); +var shaCommon = __webpack_require__(/*! ./common */ "./node_modules/hash.js/lib/hash/sha/common.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +var sum32 = utils.sum32; +var sum32_4 = utils.sum32_4; +var sum32_5 = utils.sum32_5; +var ch32 = shaCommon.ch32; +var maj32 = shaCommon.maj32; +var s0_256 = shaCommon.s0_256; +var s1_256 = shaCommon.s1_256; +var g0_256 = shaCommon.g0_256; +var g1_256 = shaCommon.g1_256; + +var BlockHash = common.BlockHash; + +var sha256_K = [ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +]; + +function SHA256() { + if (!(this instanceof SHA256)) + return new SHA256(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + ]; + this.k = sha256_K; + this.W = new Array(64); +} +utils.inherits(SHA256, BlockHash); +module.exports = SHA256; + +SHA256.blockSize = 512; +SHA256.outSize = 256; +SHA256.hmacStrength = 192; +SHA256.padLength = 64; + +SHA256.prototype._update = function _update(msg, start) { + var W = this.W; + + for (var i = 0; i < 16; i++) + W[i] = msg[start + i]; + for (; i < W.length; i++) + W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); + + var a = this.h[0]; + var b = this.h[1]; + var c = this.h[2]; + var d = this.h[3]; + var e = this.h[4]; + var f = this.h[5]; + var g = this.h[6]; + var h = this.h[7]; + + assert(this.k.length === W.length); + for (i = 0; i < W.length; i++) { + var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); + var T2 = sum32(s0_256(a), maj32(a, b, c)); + h = g; + g = f; + f = e; + e = sum32(d, T1); + d = c; + c = b; + b = a; + a = sum32(T1, T2); + } + + this.h[0] = sum32(this.h[0], a); + this.h[1] = sum32(this.h[1], b); + this.h[2] = sum32(this.h[2], c); + this.h[3] = sum32(this.h[3], d); + this.h[4] = sum32(this.h[4], e); + this.h[5] = sum32(this.h[5], f); + this.h[6] = sum32(this.h[6], g); + this.h[7] = sum32(this.h[7], h); +}; + +SHA256.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha/384.js": +/*!**************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha/384.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); + +var SHA512 = __webpack_require__(/*! ./512 */ "./node_modules/hash.js/lib/hash/sha/512.js"); + +function SHA384() { + if (!(this instanceof SHA384)) + return new SHA384(); + + SHA512.call(this); + this.h = [ + 0xcbbb9d5d, 0xc1059ed8, + 0x629a292a, 0x367cd507, + 0x9159015a, 0x3070dd17, + 0x152fecd8, 0xf70e5939, + 0x67332667, 0xffc00b31, + 0x8eb44a87, 0x68581511, + 0xdb0c2e0d, 0x64f98fa7, + 0x47b5481d, 0xbefa4fa4 ]; +} +utils.inherits(SHA384, SHA512); +module.exports = SHA384; + +SHA384.blockSize = 1024; +SHA384.outSize = 384; +SHA384.hmacStrength = 192; +SHA384.padLength = 128; + +SHA384.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h.slice(0, 12), 'big'); + else + return utils.split32(this.h.slice(0, 12), 'big'); +}; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha/512.js": +/*!**************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha/512.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var common = __webpack_require__(/*! ../common */ "./node_modules/hash.js/lib/hash/common.js"); +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); + +var rotr64_hi = utils.rotr64_hi; +var rotr64_lo = utils.rotr64_lo; +var shr64_hi = utils.shr64_hi; +var shr64_lo = utils.shr64_lo; +var sum64 = utils.sum64; +var sum64_hi = utils.sum64_hi; +var sum64_lo = utils.sum64_lo; +var sum64_4_hi = utils.sum64_4_hi; +var sum64_4_lo = utils.sum64_4_lo; +var sum64_5_hi = utils.sum64_5_hi; +var sum64_5_lo = utils.sum64_5_lo; + +var BlockHash = common.BlockHash; + +var sha512_K = [ + 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, + 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, + 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, + 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, + 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, + 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, + 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, + 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, + 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, + 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, + 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, + 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, + 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, + 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, + 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, + 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, + 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, + 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, + 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, + 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, + 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, + 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, + 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, + 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, + 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, + 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, + 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, + 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, + 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, + 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, + 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, + 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, + 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, + 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, + 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, + 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, + 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, + 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, + 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, + 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 +]; + +function SHA512() { + if (!(this instanceof SHA512)) + return new SHA512(); + + BlockHash.call(this); + this.h = [ + 0x6a09e667, 0xf3bcc908, + 0xbb67ae85, 0x84caa73b, + 0x3c6ef372, 0xfe94f82b, + 0xa54ff53a, 0x5f1d36f1, + 0x510e527f, 0xade682d1, + 0x9b05688c, 0x2b3e6c1f, + 0x1f83d9ab, 0xfb41bd6b, + 0x5be0cd19, 0x137e2179 ]; + this.k = sha512_K; + this.W = new Array(160); +} +utils.inherits(SHA512, BlockHash); +module.exports = SHA512; + +SHA512.blockSize = 1024; +SHA512.outSize = 512; +SHA512.hmacStrength = 192; +SHA512.padLength = 128; + +SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { + var W = this.W; + + // 32 x 32bit words + for (var i = 0; i < 32; i++) + W[i] = msg[start + i]; + for (; i < W.length; i += 2) { + var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); // i - 2 + var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); + var c1_hi = W[i - 14]; // i - 7 + var c1_lo = W[i - 13]; + var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); // i - 15 + var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); + var c3_hi = W[i - 32]; // i - 16 + var c3_lo = W[i - 31]; + + W[i] = sum64_4_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + W[i + 1] = sum64_4_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo); + } +}; + +SHA512.prototype._update = function _update(msg, start) { + this._prepareBlock(msg, start); + + var W = this.W; + + var ah = this.h[0]; + var al = this.h[1]; + var bh = this.h[2]; + var bl = this.h[3]; + var ch = this.h[4]; + var cl = this.h[5]; + var dh = this.h[6]; + var dl = this.h[7]; + var eh = this.h[8]; + var el = this.h[9]; + var fh = this.h[10]; + var fl = this.h[11]; + var gh = this.h[12]; + var gl = this.h[13]; + var hh = this.h[14]; + var hl = this.h[15]; + + assert(this.k.length === W.length); + for (var i = 0; i < W.length; i += 2) { + var c0_hi = hh; + var c0_lo = hl; + var c1_hi = s1_512_hi(eh, el); + var c1_lo = s1_512_lo(eh, el); + var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); + var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); + var c3_hi = this.k[i]; + var c3_lo = this.k[i + 1]; + var c4_hi = W[i]; + var c4_lo = W[i + 1]; + + var T1_hi = sum64_5_hi( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + var T1_lo = sum64_5_lo( + c0_hi, c0_lo, + c1_hi, c1_lo, + c2_hi, c2_lo, + c3_hi, c3_lo, + c4_hi, c4_lo); + + c0_hi = s0_512_hi(ah, al); + c0_lo = s0_512_lo(ah, al); + c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); + c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); + + var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); + var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); + + hh = gh; + hl = gl; + + gh = fh; + gl = fl; + + fh = eh; + fl = el; + + eh = sum64_hi(dh, dl, T1_hi, T1_lo); + el = sum64_lo(dl, dl, T1_hi, T1_lo); + + dh = ch; + dl = cl; + + ch = bh; + cl = bl; + + bh = ah; + bl = al; + + ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); + al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); + } + + sum64(this.h, 0, ah, al); + sum64(this.h, 2, bh, bl); + sum64(this.h, 4, ch, cl); + sum64(this.h, 6, dh, dl); + sum64(this.h, 8, eh, el); + sum64(this.h, 10, fh, fl); + sum64(this.h, 12, gh, gl); + sum64(this.h, 14, hh, hl); +}; + +SHA512.prototype._digest = function digest(enc) { + if (enc === 'hex') + return utils.toHex32(this.h, 'big'); + else + return utils.split32(this.h, 'big'); +}; + +function ch64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ ((~xh) & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function ch64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ ((~xl) & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_hi(xh, xl, yh, yl, zh) { + var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); + if (r < 0) + r += 0x100000000; + return r; +} + +function maj64_lo(xh, xl, yh, yl, zh, zl) { + var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 28); + var c1_hi = rotr64_hi(xl, xh, 2); // 34 + var c2_hi = rotr64_hi(xl, xh, 7); // 39 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 28); + var c1_lo = rotr64_lo(xl, xh, 2); // 34 + var c2_lo = rotr64_lo(xl, xh, 7); // 39 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 14); + var c1_hi = rotr64_hi(xh, xl, 18); + var c2_hi = rotr64_hi(xl, xh, 9); // 41 + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function s1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 14); + var c1_lo = rotr64_lo(xh, xl, 18); + var c2_lo = rotr64_lo(xl, xh, 9); // 41 + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 1); + var c1_hi = rotr64_hi(xh, xl, 8); + var c2_hi = shr64_hi(xh, xl, 7); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g0_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 1); + var c1_lo = rotr64_lo(xh, xl, 8); + var c2_lo = shr64_lo(xh, xl, 7); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_hi(xh, xl) { + var c0_hi = rotr64_hi(xh, xl, 19); + var c1_hi = rotr64_hi(xl, xh, 29); // 61 + var c2_hi = shr64_hi(xh, xl, 6); + + var r = c0_hi ^ c1_hi ^ c2_hi; + if (r < 0) + r += 0x100000000; + return r; +} + +function g1_512_lo(xh, xl) { + var c0_lo = rotr64_lo(xh, xl, 19); + var c1_lo = rotr64_lo(xl, xh, 29); // 61 + var c2_lo = shr64_lo(xh, xl, 6); + + var r = c0_lo ^ c1_lo ^ c2_lo; + if (r < 0) + r += 0x100000000; + return r; +} + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/sha/common.js": +/*!*****************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/sha/common.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var utils = __webpack_require__(/*! ../utils */ "./node_modules/hash.js/lib/hash/utils.js"); +var rotr32 = utils.rotr32; + +function ft_1(s, x, y, z) { + if (s === 0) + return ch32(x, y, z); + if (s === 1 || s === 3) + return p32(x, y, z); + if (s === 2) + return maj32(x, y, z); +} +exports.ft_1 = ft_1; + +function ch32(x, y, z) { + return (x & y) ^ ((~x) & z); +} +exports.ch32 = ch32; + +function maj32(x, y, z) { + return (x & y) ^ (x & z) ^ (y & z); +} +exports.maj32 = maj32; + +function p32(x, y, z) { + return x ^ y ^ z; +} +exports.p32 = p32; + +function s0_256(x) { + return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); +} +exports.s0_256 = s0_256; + +function s1_256(x) { + return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); +} +exports.s1_256 = s1_256; + +function g0_256(x) { + return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); +} +exports.g0_256 = g0_256; + +function g1_256(x) { + return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); +} +exports.g1_256 = g1_256; + + +/***/ }), + +/***/ "./node_modules/hash.js/lib/hash/utils.js": +/*!************************************************!*\ + !*** ./node_modules/hash.js/lib/hash/utils.js ***! + \************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var assert = __webpack_require__(/*! minimalistic-assert */ "./node_modules/minimalistic-assert/index.js"); +var inherits = __webpack_require__(/*! inherits */ "./node_modules/inherits/inherits_browser.js"); + +exports.inherits = inherits; + +function isSurrogatePair(msg, i) { + if ((msg.charCodeAt(i) & 0xFC00) !== 0xD800) { + return false; + } + if (i < 0 || i + 1 >= msg.length) { + return false; + } + return (msg.charCodeAt(i + 1) & 0xFC00) === 0xDC00; +} + +function toArray(msg, enc) { + if (Array.isArray(msg)) + return msg.slice(); + if (!msg) + return []; + var res = []; + if (typeof msg === 'string') { + if (!enc) { + // Inspired by stringToUtf8ByteArray() in closure-library by Google + // https://github.com/google/closure-library/blob/8598d87242af59aac233270742c8984e2b2bdbe0/closure/goog/crypt/crypt.js#L117-L143 + // Apache License 2.0 + // https://github.com/google/closure-library/blob/master/LICENSE + var p = 0; + for (var i = 0; i < msg.length; i++) { + var c = msg.charCodeAt(i); + if (c < 128) { + res[p++] = c; + } else if (c < 2048) { + res[p++] = (c >> 6) | 192; + res[p++] = (c & 63) | 128; + } else if (isSurrogatePair(msg, i)) { + c = 0x10000 + ((c & 0x03FF) << 10) + (msg.charCodeAt(++i) & 0x03FF); + res[p++] = (c >> 18) | 240; + res[p++] = ((c >> 12) & 63) | 128; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } else { + res[p++] = (c >> 12) | 224; + res[p++] = ((c >> 6) & 63) | 128; + res[p++] = (c & 63) | 128; + } + } + } else if (enc === 'hex') { + msg = msg.replace(/[^a-z0-9]+/ig, ''); + if (msg.length % 2 !== 0) + msg = '0' + msg; + for (i = 0; i < msg.length; i += 2) + res.push(parseInt(msg[i] + msg[i + 1], 16)); + } + } else { + for (i = 0; i < msg.length; i++) + res[i] = msg[i] | 0; + } + return res; +} +exports.toArray = toArray; + +function toHex(msg) { + var res = ''; + for (var i = 0; i < msg.length; i++) + res += zero2(msg[i].toString(16)); + return res; +} +exports.toHex = toHex; + +function htonl(w) { + var res = (w >>> 24) | + ((w >>> 8) & 0xff00) | + ((w << 8) & 0xff0000) | + ((w & 0xff) << 24); + return res >>> 0; +} +exports.htonl = htonl; + +function toHex32(msg, endian) { + var res = ''; + for (var i = 0; i < msg.length; i++) { + var w = msg[i]; + if (endian === 'little') + w = htonl(w); + res += zero8(w.toString(16)); + } + return res; +} +exports.toHex32 = toHex32; + +function zero2(word) { + if (word.length === 1) + return '0' + word; + else + return word; +} +exports.zero2 = zero2; + +function zero8(word) { + if (word.length === 7) + return '0' + word; + else if (word.length === 6) + return '00' + word; + else if (word.length === 5) + return '000' + word; + else if (word.length === 4) + return '0000' + word; + else if (word.length === 3) + return '00000' + word; + else if (word.length === 2) + return '000000' + word; + else if (word.length === 1) + return '0000000' + word; + else + return word; +} +exports.zero8 = zero8; + +function join32(msg, start, end, endian) { + var len = end - start; + assert(len % 4 === 0); + var res = new Array(len / 4); + for (var i = 0, k = start; i < res.length; i++, k += 4) { + var w; + if (endian === 'big') + w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; + else + w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; + res[i] = w >>> 0; + } + return res; +} +exports.join32 = join32; + +function split32(msg, endian) { + var res = new Array(msg.length * 4); + for (var i = 0, k = 0; i < msg.length; i++, k += 4) { + var m = msg[i]; + if (endian === 'big') { + res[k] = m >>> 24; + res[k + 1] = (m >>> 16) & 0xff; + res[k + 2] = (m >>> 8) & 0xff; + res[k + 3] = m & 0xff; + } else { + res[k + 3] = m >>> 24; + res[k + 2] = (m >>> 16) & 0xff; + res[k + 1] = (m >>> 8) & 0xff; + res[k] = m & 0xff; + } + } + return res; +} +exports.split32 = split32; + +function rotr32(w, b) { + return (w >>> b) | (w << (32 - b)); +} +exports.rotr32 = rotr32; + +function rotl32(w, b) { + return (w << b) | (w >>> (32 - b)); +} +exports.rotl32 = rotl32; + +function sum32(a, b) { + return (a + b) >>> 0; +} +exports.sum32 = sum32; + +function sum32_3(a, b, c) { + return (a + b + c) >>> 0; +} +exports.sum32_3 = sum32_3; + +function sum32_4(a, b, c, d) { + return (a + b + c + d) >>> 0; +} +exports.sum32_4 = sum32_4; + +function sum32_5(a, b, c, d, e) { + return (a + b + c + d + e) >>> 0; +} +exports.sum32_5 = sum32_5; + +function sum64(buf, pos, ah, al) { + var bh = buf[pos]; + var bl = buf[pos + 1]; + + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + buf[pos] = hi >>> 0; + buf[pos + 1] = lo; +} +exports.sum64 = sum64; + +function sum64_hi(ah, al, bh, bl) { + var lo = (al + bl) >>> 0; + var hi = (lo < al ? 1 : 0) + ah + bh; + return hi >>> 0; +} +exports.sum64_hi = sum64_hi; + +function sum64_lo(ah, al, bh, bl) { + var lo = al + bl; + return lo >>> 0; +} +exports.sum64_lo = sum64_lo; + +function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + + var hi = ah + bh + ch + dh + carry; + return hi >>> 0; +} +exports.sum64_4_hi = sum64_4_hi; + +function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { + var lo = al + bl + cl + dl; + return lo >>> 0; +} +exports.sum64_4_lo = sum64_4_lo; + +function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var carry = 0; + var lo = al; + lo = (lo + bl) >>> 0; + carry += lo < al ? 1 : 0; + lo = (lo + cl) >>> 0; + carry += lo < cl ? 1 : 0; + lo = (lo + dl) >>> 0; + carry += lo < dl ? 1 : 0; + lo = (lo + el) >>> 0; + carry += lo < el ? 1 : 0; + + var hi = ah + bh + ch + dh + eh + carry; + return hi >>> 0; +} +exports.sum64_5_hi = sum64_5_hi; + +function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { + var lo = al + bl + cl + dl + el; + + return lo >>> 0; +} +exports.sum64_5_lo = sum64_5_lo; + +function rotr64_hi(ah, al, num) { + var r = (al << (32 - num)) | (ah >>> num); + return r >>> 0; +} +exports.rotr64_hi = rotr64_hi; + +function rotr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.rotr64_lo = rotr64_lo; + +function shr64_hi(ah, al, num) { + return ah >>> num; +} +exports.shr64_hi = shr64_hi; + +function shr64_lo(ah, al, num) { + var r = (ah << (32 - num)) | (al >>> num); + return r >>> 0; +} +exports.shr64_lo = shr64_lo; + + +/***/ }), + +/***/ "./node_modules/inherits/inherits_browser.js": +/*!***************************************************!*\ + !*** ./node_modules/inherits/inherits_browser.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + + +/***/ }), + +/***/ "./node_modules/js-sha3/src/sha3.js": +/*!******************************************!*\ + !*** ./node_modules/js-sha3/src/sha3.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(process, global) {/** + * [js-sha3]{@link https://github.com/emn178/js-sha3} + * + * @version 0.5.7 + * @author Chen, Yi-Cyuan [emn178@gmail.com] + * @copyright Chen, Yi-Cyuan 2015-2016 + * @license MIT + */ +/*jslint bitwise: true */ +(function () { + 'use strict'; + + var root = typeof window === 'object' ? window : {}; + var NODE_JS = !root.JS_SHA3_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; + if (NODE_JS) { + root = global; + } + var COMMON_JS = !root.JS_SHA3_NO_COMMON_JS && typeof module === 'object' && module.exports; + var HEX_CHARS = '0123456789abcdef'.split(''); + var SHAKE_PADDING = [31, 7936, 2031616, 520093696]; + var KECCAK_PADDING = [1, 256, 65536, 16777216]; + var PADDING = [6, 1536, 393216, 100663296]; + var SHIFT = [0, 8, 16, 24]; + var RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649, + 0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, + 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, + 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, + 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648]; + var BITS = [224, 256, 384, 512]; + var SHAKE_BITS = [128, 256]; + var OUTPUT_TYPES = ['hex', 'buffer', 'arrayBuffer', 'array']; + + var createOutputMethod = function (bits, padding, outputType) { + return function (message) { + return new Keccak(bits, padding, bits).update(message)[outputType](); + }; + }; + + var createShakeOutputMethod = function (bits, padding, outputType) { + return function (message, outputBits) { + return new Keccak(bits, padding, outputBits).update(message)[outputType](); + }; + }; + + var createMethod = function (bits, padding) { + var method = createOutputMethod(bits, padding, 'hex'); + method.create = function () { + return new Keccak(bits, padding, bits); + }; + method.update = function (message) { + return method.create().update(message); + }; + for (var i = 0; i < OUTPUT_TYPES.length; ++i) { + var type = OUTPUT_TYPES[i]; + method[type] = createOutputMethod(bits, padding, type); + } + return method; + }; + + var createShakeMethod = function (bits, padding) { + var method = createShakeOutputMethod(bits, padding, 'hex'); + method.create = function (outputBits) { + return new Keccak(bits, padding, outputBits); + }; + method.update = function (message, outputBits) { + return method.create(outputBits).update(message); + }; + for (var i = 0; i < OUTPUT_TYPES.length; ++i) { + var type = OUTPUT_TYPES[i]; + method[type] = createShakeOutputMethod(bits, padding, type); + } + return method; + }; + + var algorithms = [ + {name: 'keccak', padding: KECCAK_PADDING, bits: BITS, createMethod: createMethod}, + {name: 'sha3', padding: PADDING, bits: BITS, createMethod: createMethod}, + {name: 'shake', padding: SHAKE_PADDING, bits: SHAKE_BITS, createMethod: createShakeMethod} + ]; + + var methods = {}, methodNames = []; + + for (var i = 0; i < algorithms.length; ++i) { + var algorithm = algorithms[i]; + var bits = algorithm.bits; + for (var j = 0; j < bits.length; ++j) { + var methodName = algorithm.name +'_' + bits[j]; + methodNames.push(methodName); + methods[methodName] = algorithm.createMethod(bits[j], algorithm.padding); + } + } + + function Keccak(bits, padding, outputBits) { + this.blocks = []; + this.s = []; + this.padding = padding; + this.outputBits = outputBits; + this.reset = true; + this.block = 0; + this.start = 0; + this.blockCount = (1600 - (bits << 1)) >> 5; + this.byteCount = this.blockCount << 2; + this.outputBlocks = outputBits >> 5; + this.extraBytes = (outputBits & 31) >> 3; + + for (var i = 0; i < 50; ++i) { + this.s[i] = 0; + } + } + + Keccak.prototype.update = function (message) { + var notString = typeof message !== 'string'; + if (notString && message.constructor === ArrayBuffer) { + message = new Uint8Array(message); + } + var length = message.length, blocks = this.blocks, byteCount = this.byteCount, + blockCount = this.blockCount, index = 0, s = this.s, i, code; + + while (index < length) { + if (this.reset) { + this.reset = false; + blocks[0] = this.block; + for (i = 1; i < blockCount + 1; ++i) { + blocks[i] = 0; + } + } + if (notString) { + for (i = this.start; index < length && i < byteCount; ++index) { + blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; + } + } else { + for (i = this.start; index < length && i < byteCount; ++index) { + code = message.charCodeAt(index); + if (code < 0x80) { + blocks[i >> 2] |= code << SHIFT[i++ & 3]; + } else if (code < 0x800) { + blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else if (code < 0xd800 || code >= 0xe000) { + blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } else { + code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); + blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; + blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; + } + } + } + this.lastByteIndex = i; + if (i >= byteCount) { + this.start = i - byteCount; + this.block = blocks[blockCount]; + for (i = 0; i < blockCount; ++i) { + s[i] ^= blocks[i]; + } + f(s); + this.reset = true; + } else { + this.start = i; + } + } + return this; + }; + + Keccak.prototype.finalize = function () { + var blocks = this.blocks, i = this.lastByteIndex, blockCount = this.blockCount, s = this.s; + blocks[i >> 2] |= this.padding[i & 3]; + if (this.lastByteIndex === this.byteCount) { + blocks[0] = blocks[blockCount]; + for (i = 1; i < blockCount + 1; ++i) { + blocks[i] = 0; + } + } + blocks[blockCount - 1] |= 0x80000000; + for (i = 0; i < blockCount; ++i) { + s[i] ^= blocks[i]; + } + f(s); + }; + + Keccak.prototype.toString = Keccak.prototype.hex = function () { + this.finalize(); + + var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, + extraBytes = this.extraBytes, i = 0, j = 0; + var hex = '', block; + while (j < outputBlocks) { + for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { + block = s[i]; + hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F] + + HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F] + + HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F] + + HEX_CHARS[(block >> 28) & 0x0F] + HEX_CHARS[(block >> 24) & 0x0F]; + } + if (j % blockCount === 0) { + f(s); + i = 0; + } + } + if (extraBytes) { + block = s[i]; + if (extraBytes > 0) { + hex += HEX_CHARS[(block >> 4) & 0x0F] + HEX_CHARS[block & 0x0F]; + } + if (extraBytes > 1) { + hex += HEX_CHARS[(block >> 12) & 0x0F] + HEX_CHARS[(block >> 8) & 0x0F]; + } + if (extraBytes > 2) { + hex += HEX_CHARS[(block >> 20) & 0x0F] + HEX_CHARS[(block >> 16) & 0x0F]; + } + } + return hex; + }; + + Keccak.prototype.arrayBuffer = function () { + this.finalize(); + + var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, + extraBytes = this.extraBytes, i = 0, j = 0; + var bytes = this.outputBits >> 3; + var buffer; + if (extraBytes) { + buffer = new ArrayBuffer((outputBlocks + 1) << 2); + } else { + buffer = new ArrayBuffer(bytes); + } + var array = new Uint32Array(buffer); + while (j < outputBlocks) { + for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { + array[j] = s[i]; + } + if (j % blockCount === 0) { + f(s); + } + } + if (extraBytes) { + array[i] = s[i]; + buffer = buffer.slice(0, bytes); + } + return buffer; + }; + + Keccak.prototype.buffer = Keccak.prototype.arrayBuffer; + + Keccak.prototype.digest = Keccak.prototype.array = function () { + this.finalize(); + + var blockCount = this.blockCount, s = this.s, outputBlocks = this.outputBlocks, + extraBytes = this.extraBytes, i = 0, j = 0; + var array = [], offset, block; + while (j < outputBlocks) { + for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { + offset = j << 2; + block = s[i]; + array[offset] = block & 0xFF; + array[offset + 1] = (block >> 8) & 0xFF; + array[offset + 2] = (block >> 16) & 0xFF; + array[offset + 3] = (block >> 24) & 0xFF; + } + if (j % blockCount === 0) { + f(s); + } + } + if (extraBytes) { + offset = j << 2; + block = s[i]; + if (extraBytes > 0) { + array[offset] = block & 0xFF; + } + if (extraBytes > 1) { + array[offset + 1] = (block >> 8) & 0xFF; + } + if (extraBytes > 2) { + array[offset + 2] = (block >> 16) & 0xFF; + } + } + return array; + }; + + var f = function (s) { + var h, l, n, c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, + b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, + b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31, b32, b33, + b34, b35, b36, b37, b38, b39, b40, b41, b42, b43, b44, b45, b46, b47, b48, b49; + for (n = 0; n < 48; n += 2) { + c0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40]; + c1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41]; + c2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42]; + c3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43]; + c4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44]; + c5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45]; + c6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46]; + c7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47]; + c8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48]; + c9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49]; + + h = c8 ^ ((c2 << 1) | (c3 >>> 31)); + l = c9 ^ ((c3 << 1) | (c2 >>> 31)); + s[0] ^= h; + s[1] ^= l; + s[10] ^= h; + s[11] ^= l; + s[20] ^= h; + s[21] ^= l; + s[30] ^= h; + s[31] ^= l; + s[40] ^= h; + s[41] ^= l; + h = c0 ^ ((c4 << 1) | (c5 >>> 31)); + l = c1 ^ ((c5 << 1) | (c4 >>> 31)); + s[2] ^= h; + s[3] ^= l; + s[12] ^= h; + s[13] ^= l; + s[22] ^= h; + s[23] ^= l; + s[32] ^= h; + s[33] ^= l; + s[42] ^= h; + s[43] ^= l; + h = c2 ^ ((c6 << 1) | (c7 >>> 31)); + l = c3 ^ ((c7 << 1) | (c6 >>> 31)); + s[4] ^= h; + s[5] ^= l; + s[14] ^= h; + s[15] ^= l; + s[24] ^= h; + s[25] ^= l; + s[34] ^= h; + s[35] ^= l; + s[44] ^= h; + s[45] ^= l; + h = c4 ^ ((c8 << 1) | (c9 >>> 31)); + l = c5 ^ ((c9 << 1) | (c8 >>> 31)); + s[6] ^= h; + s[7] ^= l; + s[16] ^= h; + s[17] ^= l; + s[26] ^= h; + s[27] ^= l; + s[36] ^= h; + s[37] ^= l; + s[46] ^= h; + s[47] ^= l; + h = c6 ^ ((c0 << 1) | (c1 >>> 31)); + l = c7 ^ ((c1 << 1) | (c0 >>> 31)); + s[8] ^= h; + s[9] ^= l; + s[18] ^= h; + s[19] ^= l; + s[28] ^= h; + s[29] ^= l; + s[38] ^= h; + s[39] ^= l; + s[48] ^= h; + s[49] ^= l; + + b0 = s[0]; + b1 = s[1]; + b32 = (s[11] << 4) | (s[10] >>> 28); + b33 = (s[10] << 4) | (s[11] >>> 28); + b14 = (s[20] << 3) | (s[21] >>> 29); + b15 = (s[21] << 3) | (s[20] >>> 29); + b46 = (s[31] << 9) | (s[30] >>> 23); + b47 = (s[30] << 9) | (s[31] >>> 23); + b28 = (s[40] << 18) | (s[41] >>> 14); + b29 = (s[41] << 18) | (s[40] >>> 14); + b20 = (s[2] << 1) | (s[3] >>> 31); + b21 = (s[3] << 1) | (s[2] >>> 31); + b2 = (s[13] << 12) | (s[12] >>> 20); + b3 = (s[12] << 12) | (s[13] >>> 20); + b34 = (s[22] << 10) | (s[23] >>> 22); + b35 = (s[23] << 10) | (s[22] >>> 22); + b16 = (s[33] << 13) | (s[32] >>> 19); + b17 = (s[32] << 13) | (s[33] >>> 19); + b48 = (s[42] << 2) | (s[43] >>> 30); + b49 = (s[43] << 2) | (s[42] >>> 30); + b40 = (s[5] << 30) | (s[4] >>> 2); + b41 = (s[4] << 30) | (s[5] >>> 2); + b22 = (s[14] << 6) | (s[15] >>> 26); + b23 = (s[15] << 6) | (s[14] >>> 26); + b4 = (s[25] << 11) | (s[24] >>> 21); + b5 = (s[24] << 11) | (s[25] >>> 21); + b36 = (s[34] << 15) | (s[35] >>> 17); + b37 = (s[35] << 15) | (s[34] >>> 17); + b18 = (s[45] << 29) | (s[44] >>> 3); + b19 = (s[44] << 29) | (s[45] >>> 3); + b10 = (s[6] << 28) | (s[7] >>> 4); + b11 = (s[7] << 28) | (s[6] >>> 4); + b42 = (s[17] << 23) | (s[16] >>> 9); + b43 = (s[16] << 23) | (s[17] >>> 9); + b24 = (s[26] << 25) | (s[27] >>> 7); + b25 = (s[27] << 25) | (s[26] >>> 7); + b6 = (s[36] << 21) | (s[37] >>> 11); + b7 = (s[37] << 21) | (s[36] >>> 11); + b38 = (s[47] << 24) | (s[46] >>> 8); + b39 = (s[46] << 24) | (s[47] >>> 8); + b30 = (s[8] << 27) | (s[9] >>> 5); + b31 = (s[9] << 27) | (s[8] >>> 5); + b12 = (s[18] << 20) | (s[19] >>> 12); + b13 = (s[19] << 20) | (s[18] >>> 12); + b44 = (s[29] << 7) | (s[28] >>> 25); + b45 = (s[28] << 7) | (s[29] >>> 25); + b26 = (s[38] << 8) | (s[39] >>> 24); + b27 = (s[39] << 8) | (s[38] >>> 24); + b8 = (s[48] << 14) | (s[49] >>> 18); + b9 = (s[49] << 14) | (s[48] >>> 18); + + s[0] = b0 ^ (~b2 & b4); + s[1] = b1 ^ (~b3 & b5); + s[10] = b10 ^ (~b12 & b14); + s[11] = b11 ^ (~b13 & b15); + s[20] = b20 ^ (~b22 & b24); + s[21] = b21 ^ (~b23 & b25); + s[30] = b30 ^ (~b32 & b34); + s[31] = b31 ^ (~b33 & b35); + s[40] = b40 ^ (~b42 & b44); + s[41] = b41 ^ (~b43 & b45); + s[2] = b2 ^ (~b4 & b6); + s[3] = b3 ^ (~b5 & b7); + s[12] = b12 ^ (~b14 & b16); + s[13] = b13 ^ (~b15 & b17); + s[22] = b22 ^ (~b24 & b26); + s[23] = b23 ^ (~b25 & b27); + s[32] = b32 ^ (~b34 & b36); + s[33] = b33 ^ (~b35 & b37); + s[42] = b42 ^ (~b44 & b46); + s[43] = b43 ^ (~b45 & b47); + s[4] = b4 ^ (~b6 & b8); + s[5] = b5 ^ (~b7 & b9); + s[14] = b14 ^ (~b16 & b18); + s[15] = b15 ^ (~b17 & b19); + s[24] = b24 ^ (~b26 & b28); + s[25] = b25 ^ (~b27 & b29); + s[34] = b34 ^ (~b36 & b38); + s[35] = b35 ^ (~b37 & b39); + s[44] = b44 ^ (~b46 & b48); + s[45] = b45 ^ (~b47 & b49); + s[6] = b6 ^ (~b8 & b0); + s[7] = b7 ^ (~b9 & b1); + s[16] = b16 ^ (~b18 & b10); + s[17] = b17 ^ (~b19 & b11); + s[26] = b26 ^ (~b28 & b20); + s[27] = b27 ^ (~b29 & b21); + s[36] = b36 ^ (~b38 & b30); + s[37] = b37 ^ (~b39 & b31); + s[46] = b46 ^ (~b48 & b40); + s[47] = b47 ^ (~b49 & b41); + s[8] = b8 ^ (~b0 & b2); + s[9] = b9 ^ (~b1 & b3); + s[18] = b18 ^ (~b10 & b12); + s[19] = b19 ^ (~b11 & b13); + s[28] = b28 ^ (~b20 & b22); + s[29] = b29 ^ (~b21 & b23); + s[38] = b38 ^ (~b30 & b32); + s[39] = b39 ^ (~b31 & b33); + s[48] = b48 ^ (~b40 & b42); + s[49] = b49 ^ (~b41 & b43); + + s[0] ^= RC[n]; + s[1] ^= RC[n + 1]; + } + }; + + if (COMMON_JS) { + module.exports = methods; + } else { + for (var i = 0; i < methodNames.length; ++i) { + root[methodNames[i]] = methods[methodNames[i]]; + } + } +})(); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../next/dist/compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/keyboard-key/src/keyboardKey.js": +/*!******************************************************!*\ + !*** ./node_modules/keyboard-key/src/keyboardKey.js ***! + \******************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isObject = function isObject(val) { + return val !== null && !Array.isArray(val) && typeof val === 'object' +} + +var codes = { + // ---------------------------------------- + // By Code + // ---------------------------------------- + 3: 'Cancel', + 6: 'Help', + 8: 'Backspace', + 9: 'Tab', + 12: 'Clear', + 13: 'Enter', + 16: 'Shift', + 17: 'Control', + 18: 'Alt', + 19: 'Pause', + 20: 'CapsLock', + 27: 'Escape', + 28: 'Convert', + 29: 'NonConvert', + 30: 'Accept', + 31: 'ModeChange', + 32: ' ', + 33: 'PageUp', + 34: 'PageDown', + 35: 'End', + 36: 'Home', + 37: 'ArrowLeft', + 38: 'ArrowUp', + 39: 'ArrowRight', + 40: 'ArrowDown', + 41: 'Select', + 42: 'Print', + 43: 'Execute', + 44: 'PrintScreen', + 45: 'Insert', + 46: 'Delete', + 48: ['0', ')'], + 49: ['1', '!'], + 50: ['2', '@'], + 51: ['3', '#'], + 52: ['4', '$'], + 53: ['5', '%'], + 54: ['6', '^'], + 55: ['7', '&'], + 56: ['8', '*'], + 57: ['9', '('], + 91: 'OS', + 93: 'ContextMenu', + 144: 'NumLock', + 145: 'ScrollLock', + 181: 'VolumeMute', + 182: 'VolumeDown', + 183: 'VolumeUp', + 186: [';', ':'], + 187: ['=', '+'], + 188: [',', '<'], + 189: ['-', '_'], + 190: ['.', '>'], + 191: ['/', '?'], + 192: ['`', '~'], + 219: ['[', '{'], + 220: ['\\', '|'], + 221: [']', '}'], + 222: ["'", '"'], + 224: 'Meta', + 225: 'AltGraph', + 246: 'Attn', + 247: 'CrSel', + 248: 'ExSel', + 249: 'EraseEof', + 250: 'Play', + 251: 'ZoomOut', +} + +// Function Keys (F1-24) +for (var i = 0; i < 24; i += 1) { + codes[112 + i] = 'F' + (i + 1) +} + +// Alphabet (a-Z) +for (var j = 0; j < 26; j += 1) { + var n = j + 65 + codes[n] = [String.fromCharCode(n + 32), String.fromCharCode(n)] +} + +var keyboardKey = { + codes: codes, + + /** + * Get the `keyCode` or `which` value from a keyboard event or `key` name. + * @param {string|object} eventOrKey A keyboard event-like object or `key` name. + * @param {string} [eventOrKey.key] If object, it must have one of these keys. + * @param {number} [eventOrKey.keyCode] If object, it must have one of these keys. + * @param {number} [eventOrKey.which] If object, it must have one of these keys. + * @returns {number|undefined} + */ + getCode: function getCode(eventOrKey) { + if (isObject(eventOrKey)) { + return eventOrKey.keyCode || eventOrKey.which || this[eventOrKey.key] + } + return this[eventOrKey] + }, + + /** + * Get the key name from a keyboard event, `keyCode`, or `which` value. + * @param {number|object} eventOrCode A keyboard event-like object or key code. + * @param {string} [eventOrCode.key] If object with a `key` name, it will be returned. + * @param {number} [eventOrCode.keyCode] If object, it must have one of these keys. + * @param {number} [eventOrCode.which] If object, it must have one of these keys. + * @param {boolean} [eventOrCode.shiftKey] If object, it must have one of these keys. + * @returns {string|undefined} + */ + getKey: function getKey(eventOrCode) { + var isEvent = isObject(eventOrCode) + + // handle events with a `key` already defined + if (isEvent && eventOrCode.key) { + return eventOrCode.key + } + + var name = codes[isEvent ? eventOrCode.keyCode || eventOrCode.which : eventOrCode] + + if (Array.isArray(name)) { + if (isEvent) { + name = name[eventOrCode.shiftKey ? 1 : 0] + } else { + name = name[0] + } + } + + return name + }, + + // ---------------------------------------- + // By Name + // ---------------------------------------- + // declare these manually for static analysis + Cancel: 3, + Help: 6, + Backspace: 8, + Tab: 9, + Clear: 12, + Enter: 13, + Shift: 16, + Control: 17, + Alt: 18, + Pause: 19, + CapsLock: 20, + Escape: 27, + Convert: 28, + NonConvert: 29, + Accept: 30, + ModeChange: 31, + ' ': 32, + PageUp: 33, + PageDown: 34, + End: 35, + Home: 36, + ArrowLeft: 37, + ArrowUp: 38, + ArrowRight: 39, + ArrowDown: 40, + Select: 41, + Print: 42, + Execute: 43, + PrintScreen: 44, + Insert: 45, + Delete: 46, + 0: 48, + ')': 48, + 1: 49, + '!': 49, + 2: 50, + '@': 50, + 3: 51, + '#': 51, + 4: 52, + $: 52, + 5: 53, + '%': 53, + 6: 54, + '^': 54, + 7: 55, + '&': 55, + 8: 56, + '*': 56, + 9: 57, + '(': 57, + a: 65, + A: 65, + b: 66, + B: 66, + c: 67, + C: 67, + d: 68, + D: 68, + e: 69, + E: 69, + f: 70, + F: 70, + g: 71, + G: 71, + h: 72, + H: 72, + i: 73, + I: 73, + j: 74, + J: 74, + k: 75, + K: 75, + l: 76, + L: 76, + m: 77, + M: 77, + n: 78, + N: 78, + o: 79, + O: 79, + p: 80, + P: 80, + q: 81, + Q: 81, + r: 82, + R: 82, + s: 83, + S: 83, + t: 84, + T: 84, + u: 85, + U: 85, + v: 86, + V: 86, + w: 87, + W: 87, + x: 88, + X: 88, + y: 89, + Y: 89, + z: 90, + Z: 90, + OS: 91, + ContextMenu: 93, + F1: 112, + F2: 113, + F3: 114, + F4: 115, + F5: 116, + F6: 117, + F7: 118, + F8: 119, + F9: 120, + F10: 121, + F11: 122, + F12: 123, + F13: 124, + F14: 125, + F15: 126, + F16: 127, + F17: 128, + F18: 129, + F19: 130, + F20: 131, + F21: 132, + F22: 133, + F23: 134, + F24: 135, + NumLock: 144, + ScrollLock: 145, + VolumeMute: 181, + VolumeDown: 182, + VolumeUp: 183, + ';': 186, + ':': 186, + '=': 187, + '+': 187, + ',': 188, + '<': 188, + '-': 189, + _: 189, + '.': 190, + '>': 190, + '/': 191, + '?': 191, + '`': 192, + '~': 192, + '[': 219, + '{': 219, + '\\': 220, + '|': 220, + ']': 221, + '}': 221, + "'": 222, + '"': 222, + Meta: 224, + AltGraph: 225, + Attn: 246, + CrSel: 247, + ExSel: 248, + EraseEof: 249, + Play: 250, + ZoomOut: 251, +} + +// ---------------------------------------- +// By Alias +// ---------------------------------------- +// provide dot-notation accessible keys for all key names +keyboardKey.Spacebar = keyboardKey[' '] +keyboardKey.Digit0 = keyboardKey['0'] +keyboardKey.Digit1 = keyboardKey['1'] +keyboardKey.Digit2 = keyboardKey['2'] +keyboardKey.Digit3 = keyboardKey['3'] +keyboardKey.Digit4 = keyboardKey['4'] +keyboardKey.Digit5 = keyboardKey['5'] +keyboardKey.Digit6 = keyboardKey['6'] +keyboardKey.Digit7 = keyboardKey['7'] +keyboardKey.Digit8 = keyboardKey['8'] +keyboardKey.Digit9 = keyboardKey['9'] +keyboardKey.Tilde = keyboardKey['~'] +keyboardKey.GraveAccent = keyboardKey['`'] +keyboardKey.ExclamationPoint = keyboardKey['!'] +keyboardKey.AtSign = keyboardKey['@'] +keyboardKey.PoundSign = keyboardKey['#'] +keyboardKey.PercentSign = keyboardKey['%'] +keyboardKey.Caret = keyboardKey['^'] +keyboardKey.Ampersand = keyboardKey['&'] +keyboardKey.PlusSign = keyboardKey['+'] +keyboardKey.MinusSign = keyboardKey['-'] +keyboardKey.EqualsSign = keyboardKey['='] +keyboardKey.DivisionSign = keyboardKey['/'] +keyboardKey.MultiplicationSign = keyboardKey['*'] +keyboardKey.Comma = keyboardKey[','] +keyboardKey.Decimal = keyboardKey['.'] +keyboardKey.Colon = keyboardKey[':'] +keyboardKey.Semicolon = keyboardKey[';'] +keyboardKey.Pipe = keyboardKey['|'] +keyboardKey.BackSlash = keyboardKey['\\'] +keyboardKey.QuestionMark = keyboardKey['?'] +keyboardKey.SingleQuote = keyboardKey["'"] +keyboardKey.DoubleQuote = keyboardKey['"'] +keyboardKey.LeftCurlyBrace = keyboardKey['{'] +keyboardKey.RightCurlyBrace = keyboardKey['}'] +keyboardKey.LeftParenthesis = keyboardKey['('] +keyboardKey.RightParenthesis = keyboardKey[')'] +keyboardKey.LeftAngleBracket = keyboardKey['<'] +keyboardKey.RightAngleBracket = keyboardKey['>'] +keyboardKey.LeftSquareBracket = keyboardKey['['] +keyboardKey.RightSquareBracket = keyboardKey[']'] + +module.exports = keyboardKey + + +/***/ }), + +/***/ "./node_modules/lodash-es/_DataView.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_DataView.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + +/* Built-in method references that are verified to be native. */ +var DataView = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_root_js__WEBPACK_IMPORTED_MODULE_1__["default"], 'DataView'); + +/* harmony default export */ __webpack_exports__["default"] = (DataView); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Hash.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/_Hash.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _hashClear_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_hashClear.js */ "./node_modules/lodash-es/_hashClear.js"); +/* harmony import */ var _hashDelete_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hashDelete.js */ "./node_modules/lodash-es/_hashDelete.js"); +/* harmony import */ var _hashGet_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_hashGet.js */ "./node_modules/lodash-es/_hashGet.js"); +/* harmony import */ var _hashHas_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_hashHas.js */ "./node_modules/lodash-es/_hashHas.js"); +/* harmony import */ var _hashSet_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_hashSet.js */ "./node_modules/lodash-es/_hashSet.js"); + + + + + + +/** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `Hash`. +Hash.prototype.clear = _hashClear_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +Hash.prototype['delete'] = _hashDelete_js__WEBPACK_IMPORTED_MODULE_1__["default"]; +Hash.prototype.get = _hashGet_js__WEBPACK_IMPORTED_MODULE_2__["default"]; +Hash.prototype.has = _hashHas_js__WEBPACK_IMPORTED_MODULE_3__["default"]; +Hash.prototype.set = _hashSet_js__WEBPACK_IMPORTED_MODULE_4__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (Hash); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_LazyWrapper.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_LazyWrapper.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseCreate.js */ "./node_modules/lodash-es/_baseCreate.js"); +/* harmony import */ var _baseLodash_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseLodash.js */ "./node_modules/lodash-es/_baseLodash.js"); + + + +/** Used as references for the maximum length and index of an array. */ +var MAX_ARRAY_LENGTH = 4294967295; + +/** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ +function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; +} + +// Ensure `LazyWrapper` is an instance of `baseLodash`. +LazyWrapper.prototype = Object(_baseCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_baseLodash_js__WEBPACK_IMPORTED_MODULE_1__["default"].prototype); +LazyWrapper.prototype.constructor = LazyWrapper; + +/* harmony default export */ __webpack_exports__["default"] = (LazyWrapper); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_ListCache.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_ListCache.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _listCacheClear_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_listCacheClear.js */ "./node_modules/lodash-es/_listCacheClear.js"); +/* harmony import */ var _listCacheDelete_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_listCacheDelete.js */ "./node_modules/lodash-es/_listCacheDelete.js"); +/* harmony import */ var _listCacheGet_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_listCacheGet.js */ "./node_modules/lodash-es/_listCacheGet.js"); +/* harmony import */ var _listCacheHas_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_listCacheHas.js */ "./node_modules/lodash-es/_listCacheHas.js"); +/* harmony import */ var _listCacheSet_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_listCacheSet.js */ "./node_modules/lodash-es/_listCacheSet.js"); + + + + + + +/** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `ListCache`. +ListCache.prototype.clear = _listCacheClear_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +ListCache.prototype['delete'] = _listCacheDelete_js__WEBPACK_IMPORTED_MODULE_1__["default"]; +ListCache.prototype.get = _listCacheGet_js__WEBPACK_IMPORTED_MODULE_2__["default"]; +ListCache.prototype.has = _listCacheHas_js__WEBPACK_IMPORTED_MODULE_3__["default"]; +ListCache.prototype.set = _listCacheSet_js__WEBPACK_IMPORTED_MODULE_4__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (ListCache); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_LodashWrapper.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_LodashWrapper.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseCreate.js */ "./node_modules/lodash-es/_baseCreate.js"); +/* harmony import */ var _baseLodash_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseLodash.js */ "./node_modules/lodash-es/_baseLodash.js"); + + + +/** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ +function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; +} + +LodashWrapper.prototype = Object(_baseCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_baseLodash_js__WEBPACK_IMPORTED_MODULE_1__["default"].prototype); +LodashWrapper.prototype.constructor = LodashWrapper; + +/* harmony default export */ __webpack_exports__["default"] = (LodashWrapper); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Map.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/_Map.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + +/* Built-in method references that are verified to be native. */ +var Map = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_root_js__WEBPACK_IMPORTED_MODULE_1__["default"], 'Map'); + +/* harmony default export */ __webpack_exports__["default"] = (Map); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_MapCache.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_MapCache.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _mapCacheClear_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_mapCacheClear.js */ "./node_modules/lodash-es/_mapCacheClear.js"); +/* harmony import */ var _mapCacheDelete_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_mapCacheDelete.js */ "./node_modules/lodash-es/_mapCacheDelete.js"); +/* harmony import */ var _mapCacheGet_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_mapCacheGet.js */ "./node_modules/lodash-es/_mapCacheGet.js"); +/* harmony import */ var _mapCacheHas_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_mapCacheHas.js */ "./node_modules/lodash-es/_mapCacheHas.js"); +/* harmony import */ var _mapCacheSet_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_mapCacheSet.js */ "./node_modules/lodash-es/_mapCacheSet.js"); + + + + + + +/** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } +} + +// Add methods to `MapCache`. +MapCache.prototype.clear = _mapCacheClear_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +MapCache.prototype['delete'] = _mapCacheDelete_js__WEBPACK_IMPORTED_MODULE_1__["default"]; +MapCache.prototype.get = _mapCacheGet_js__WEBPACK_IMPORTED_MODULE_2__["default"]; +MapCache.prototype.has = _mapCacheHas_js__WEBPACK_IMPORTED_MODULE_3__["default"]; +MapCache.prototype.set = _mapCacheSet_js__WEBPACK_IMPORTED_MODULE_4__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (MapCache); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Promise.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_Promise.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + +/* Built-in method references that are verified to be native. */ +var Promise = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_root_js__WEBPACK_IMPORTED_MODULE_1__["default"], 'Promise'); + +/* harmony default export */ __webpack_exports__["default"] = (Promise); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Set.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/_Set.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + +/* Built-in method references that are verified to be native. */ +var Set = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_root_js__WEBPACK_IMPORTED_MODULE_1__["default"], 'Set'); + +/* harmony default export */ __webpack_exports__["default"] = (Set); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_SetCache.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_SetCache.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _MapCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_MapCache.js */ "./node_modules/lodash-es/_MapCache.js"); +/* harmony import */ var _setCacheAdd_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setCacheAdd.js */ "./node_modules/lodash-es/_setCacheAdd.js"); +/* harmony import */ var _setCacheHas_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setCacheHas.js */ "./node_modules/lodash-es/_setCacheHas.js"); + + + + +/** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ +function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new _MapCache_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + while (++index < length) { + this.add(values[index]); + } +} + +// Add methods to `SetCache`. +SetCache.prototype.add = SetCache.prototype.push = _setCacheAdd_js__WEBPACK_IMPORTED_MODULE_1__["default"]; +SetCache.prototype.has = _setCacheHas_js__WEBPACK_IMPORTED_MODULE_2__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (SetCache); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Stack.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/_Stack.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ListCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_ListCache.js */ "./node_modules/lodash-es/_ListCache.js"); +/* harmony import */ var _stackClear_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_stackClear.js */ "./node_modules/lodash-es/_stackClear.js"); +/* harmony import */ var _stackDelete_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_stackDelete.js */ "./node_modules/lodash-es/_stackDelete.js"); +/* harmony import */ var _stackGet_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_stackGet.js */ "./node_modules/lodash-es/_stackGet.js"); +/* harmony import */ var _stackHas_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_stackHas.js */ "./node_modules/lodash-es/_stackHas.js"); +/* harmony import */ var _stackSet_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_stackSet.js */ "./node_modules/lodash-es/_stackSet.js"); + + + + + + + +/** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ +function Stack(entries) { + var data = this.__data__ = new _ListCache_js__WEBPACK_IMPORTED_MODULE_0__["default"](entries); + this.size = data.size; +} + +// Add methods to `Stack`. +Stack.prototype.clear = _stackClear_js__WEBPACK_IMPORTED_MODULE_1__["default"]; +Stack.prototype['delete'] = _stackDelete_js__WEBPACK_IMPORTED_MODULE_2__["default"]; +Stack.prototype.get = _stackGet_js__WEBPACK_IMPORTED_MODULE_3__["default"]; +Stack.prototype.has = _stackHas_js__WEBPACK_IMPORTED_MODULE_4__["default"]; +Stack.prototype.set = _stackSet_js__WEBPACK_IMPORTED_MODULE_5__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (Stack); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Symbol.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/_Symbol.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + +/** Built-in value references. */ +var Symbol = _root_js__WEBPACK_IMPORTED_MODULE_0__["default"].Symbol; + +/* harmony default export */ __webpack_exports__["default"] = (Symbol); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_Uint8Array.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_Uint8Array.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + +/** Built-in value references. */ +var Uint8Array = _root_js__WEBPACK_IMPORTED_MODULE_0__["default"].Uint8Array; + +/* harmony default export */ __webpack_exports__["default"] = (Uint8Array); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_WeakMap.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_WeakMap.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + +/* Built-in method references that are verified to be native. */ +var WeakMap = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_root_js__WEBPACK_IMPORTED_MODULE_1__["default"], 'WeakMap'); + +/* harmony default export */ __webpack_exports__["default"] = (WeakMap); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_apply.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/_apply.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ +function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); +} + +/* harmony default export */ __webpack_exports__["default"] = (apply); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayAggregator.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_arrayAggregator.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ +function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayAggregator); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayEach.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_arrayEach.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ +function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayEach); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayEvery.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_arrayEvery.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ +function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayEvery); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayFilter.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_arrayFilter.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ +function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayFilter); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayIncludes.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_arrayIncludes.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIndexOf.js */ "./node_modules/lodash-es/_baseIndexOf.js"); + + +/** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ +function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && Object(_baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, value, 0) > -1; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayIncludes); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayIncludesWith.js": +/*!******************************************************!*\ + !*** ./node_modules/lodash-es/_arrayIncludesWith.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ +function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayIncludesWith); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayLikeKeys.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_arrayLikeKeys.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseTimes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseTimes.js */ "./node_modules/lodash-es/_baseTimes.js"); +/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArguments.js */ "./node_modules/lodash-es/isArguments.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isBuffer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isBuffer.js */ "./node_modules/lodash-es/isBuffer.js"); +/* harmony import */ var _isIndex_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_isIndex.js */ "./node_modules/lodash-es/_isIndex.js"); +/* harmony import */ var _isTypedArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isTypedArray.js */ "./node_modules/lodash-es/isTypedArray.js"); + + + + + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ +function arrayLikeKeys(value, inherited) { + var isArr = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value), + isArg = !isArr && Object(_isArguments_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value), + isBuff = !isArr && !isArg && Object(_isBuffer_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value), + isType = !isArr && !isArg && !isBuff && Object(_isTypedArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? Object(_baseTimes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + Object(_isIndex_js__WEBPACK_IMPORTED_MODULE_4__["default"])(key, length) + ))) { + result.push(key); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayLikeKeys); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayMap.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_arrayMap.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayMap); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayPush.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_arrayPush.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ +function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayPush); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arrayReduce.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_arrayReduce.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ +function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; +} + +/* harmony default export */ __webpack_exports__["default"] = (arrayReduce); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_arraySome.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_arraySome.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; +} + +/* harmony default export */ __webpack_exports__["default"] = (arraySome); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_asciiSize.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_asciiSize.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseProperty.js */ "./node_modules/lodash-es/_baseProperty.js"); + + +/** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ +var asciiSize = Object(_baseProperty_js__WEBPACK_IMPORTED_MODULE_0__["default"])('length'); + +/* harmony default export */ __webpack_exports__["default"] = (asciiSize); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_asciiToArray.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_asciiToArray.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ +function asciiToArray(string) { + return string.split(''); +} + +/* harmony default export */ __webpack_exports__["default"] = (asciiToArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_asciiWords.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_asciiWords.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to match words composed of alphanumeric characters. */ +var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + +/** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ +function asciiWords(string) { + return string.match(reAsciiWord) || []; +} + +/* harmony default export */ __webpack_exports__["default"] = (asciiWords); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_assignValue.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_assignValue.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseAssignValue_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseAssignValue.js */ "./node_modules/lodash-es/_baseAssignValue.js"); +/* harmony import */ var _eq_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./eq.js */ "./node_modules/lodash-es/eq.js"); + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && Object(_eq_js__WEBPACK_IMPORTED_MODULE_1__["default"])(objValue, value)) || + (value === undefined && !(key in object))) { + Object(_baseAssignValue_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, key, value); + } +} + +/* harmony default export */ __webpack_exports__["default"] = (assignValue); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_assocIndexOf.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_assocIndexOf.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _eq_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./eq.js */ "./node_modules/lodash-es/eq.js"); + + +/** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (Object(_eq_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array[length][0], key)) { + return length; + } + } + return -1; +} + +/* harmony default export */ __webpack_exports__["default"] = (assocIndexOf); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseAggregator.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_baseAggregator.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); + + +/** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ +function baseAggregator(collection, setter, iteratee, accumulator) { + Object(_baseEach_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseAggregator); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseAssignValue.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_baseAssignValue.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _defineProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_defineProperty.js */ "./node_modules/lodash-es/_defineProperty.js"); + + +/** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ +function baseAssignValue(object, key, value) { + if (key == '__proto__' && _defineProperty_js__WEBPACK_IMPORTED_MODULE_0__["default"]) { + Object(_defineProperty_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } +} + +/* harmony default export */ __webpack_exports__["default"] = (baseAssignValue); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseClamp.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseClamp.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ +function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseClamp); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseCreate.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseCreate.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); + + +/** Built-in value references. */ +var objectCreate = Object.create; + +/** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ +var baseCreate = (function() { + function object() {} + return function(proto) { + if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; +}()); + +/* harmony default export */ __webpack_exports__["default"] = (baseCreate); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseDifference.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_baseDifference.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _SetCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_SetCache.js */ "./node_modules/lodash-es/_SetCache.js"); +/* harmony import */ var _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arrayIncludes.js */ "./node_modules/lodash-es/_arrayIncludes.js"); +/* harmony import */ var _arrayIncludesWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_arrayIncludesWith.js */ "./node_modules/lodash-es/_arrayIncludesWith.js"); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _baseUnary_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_baseUnary.js */ "./node_modules/lodash-es/_baseUnary.js"); +/* harmony import */ var _cacheHas_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_cacheHas.js */ "./node_modules/lodash-es/_cacheHas.js"); + + + + + + + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ +function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__["default"], + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_3__["default"])(values, Object(_baseUnary_js__WEBPACK_IMPORTED_MODULE_4__["default"])(iteratee)); + } + if (comparator) { + includes = _arrayIncludesWith_js__WEBPACK_IMPORTED_MODULE_2__["default"]; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = _cacheHas_js__WEBPACK_IMPORTED_MODULE_5__["default"]; + isCommon = false; + values = new _SetCache_js__WEBPACK_IMPORTED_MODULE_0__["default"](values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseDifference); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseEach.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_baseEach.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseForOwn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseForOwn.js */ "./node_modules/lodash-es/_baseForOwn.js"); +/* harmony import */ var _createBaseEach_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createBaseEach.js */ "./node_modules/lodash-es/_createBaseEach.js"); + + + +/** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ +var baseEach = Object(_createBaseEach_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_baseForOwn_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (baseEach); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseEvery.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseEvery.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); + + +/** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ +function baseEvery(collection, predicate) { + var result = true; + Object(_baseEach_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseEvery); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseExtremum.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_baseExtremum.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isSymbol.js */ "./node_modules/lodash-es/isSymbol.js"); + + +/** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ +function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_0__["default"])(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseExtremum); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseFilter.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseFilter.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); + + +/** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ +function baseFilter(collection, predicate) { + var result = []; + Object(_baseEach_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseFilter); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseFindIndex.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_baseFindIndex.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseFindIndex); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseFlatten.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseFlatten.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayPush_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayPush.js */ "./node_modules/lodash-es/_arrayPush.js"); +/* harmony import */ var _isFlattenable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isFlattenable.js */ "./node_modules/lodash-es/_isFlattenable.js"); + + + +/** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ +function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = _isFlattenable_js__WEBPACK_IMPORTED_MODULE_1__["default"]); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + Object(_arrayPush_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseFlatten); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseFor.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_baseFor.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createBaseFor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createBaseFor.js */ "./node_modules/lodash-es/_createBaseFor.js"); + + +/** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ +var baseFor = Object(_createBaseFor_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); + +/* harmony default export */ __webpack_exports__["default"] = (baseFor); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseForOwn.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseForOwn.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseFor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseFor.js */ "./node_modules/lodash-es/_baseFor.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ "./node_modules/lodash-es/keys.js"); + + + +/** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ +function baseForOwn(object, iteratee) { + return object && Object(_baseFor_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, iteratee, _keys_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseForOwn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseGet.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_baseGet.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _castPath_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_castPath.js */ "./node_modules/lodash-es/_castPath.js"); +/* harmony import */ var _toKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_toKey.js */ "./node_modules/lodash-es/_toKey.js"); + + + +/** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ +function baseGet(object, path) { + path = Object(_castPath_js__WEBPACK_IMPORTED_MODULE_0__["default"])(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[Object(_toKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(path[index++])]; + } + return (index && index == length) ? object : undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseGet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseGetAllKeys.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_baseGetAllKeys.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayPush_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayPush.js */ "./node_modules/lodash-es/_arrayPush.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + +/** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ +function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return Object(_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object) ? result : Object(_arrayPush_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result, symbolsFunc(object)); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseGetAllKeys); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseGetTag.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseGetTag.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Symbol.js */ "./node_modules/lodash-es/_Symbol.js"); +/* harmony import */ var _getRawTag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getRawTag.js */ "./node_modules/lodash-es/_getRawTag.js"); +/* harmony import */ var _objectToString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_objectToString.js */ "./node_modules/lodash-es/_objectToString.js"); + + + + +/** `Object#toString` result references. */ +var nullTag = '[object Null]', + undefinedTag = '[object Undefined]'; + +/** Built-in value references. */ +var symToStringTag = _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"].toStringTag : undefined; + +/** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? Object(_getRawTag_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) + : Object(_objectToString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseGetTag); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseHas.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_baseHas.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseHasIn.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseHasIn.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ +function baseHasIn(object, key) { + return object != null && key in Object(object); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseHasIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseInRange.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseInRange.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max, + nativeMin = Math.min; + +/** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ +function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseInRange); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIndexOf.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseIndexOf.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseFindIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseFindIndex.js */ "./node_modules/lodash-es/_baseFindIndex.js"); +/* harmony import */ var _baseIsNaN_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIsNaN.js */ "./node_modules/lodash-es/_baseIsNaN.js"); +/* harmony import */ var _strictIndexOf_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_strictIndexOf.js */ "./node_modules/lodash-es/_strictIndexOf.js"); + + + + +/** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseIndexOf(array, value, fromIndex) { + return value === value + ? Object(_strictIndexOf_js__WEBPACK_IMPORTED_MODULE_2__["default"])(array, value, fromIndex) + : Object(_baseFindIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, _baseIsNaN_js__WEBPACK_IMPORTED_MODULE_1__["default"], fromIndex); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIndexOf); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIntersection.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_baseIntersection.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _SetCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_SetCache.js */ "./node_modules/lodash-es/_SetCache.js"); +/* harmony import */ var _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arrayIncludes.js */ "./node_modules/lodash-es/_arrayIncludes.js"); +/* harmony import */ var _arrayIncludesWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_arrayIncludesWith.js */ "./node_modules/lodash-es/_arrayIncludesWith.js"); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _baseUnary_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_baseUnary.js */ "./node_modules/lodash-es/_baseUnary.js"); +/* harmony import */ var _cacheHas_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_cacheHas.js */ "./node_modules/lodash-es/_cacheHas.js"); + + + + + + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ +function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? _arrayIncludesWith_js__WEBPACK_IMPORTED_MODULE_2__["default"] : _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__["default"], + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_3__["default"])(array, Object(_baseUnary_js__WEBPACK_IMPORTED_MODULE_4__["default"])(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new _SetCache_js__WEBPACK_IMPORTED_MODULE_0__["default"](othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? Object(_cacheHas_js__WEBPACK_IMPORTED_MODULE_5__["default"])(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? Object(_cacheHas_js__WEBPACK_IMPORTED_MODULE_5__["default"])(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIntersection); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseInverter.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_baseInverter.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseForOwn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseForOwn.js */ "./node_modules/lodash-es/_baseForOwn.js"); + + +/** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ +function baseInverter(object, setter, iteratee, accumulator) { + Object(_baseForOwn_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseInverter); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseInvoke.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseInvoke.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _apply_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_apply.js */ "./node_modules/lodash-es/_apply.js"); +/* harmony import */ var _castPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_castPath.js */ "./node_modules/lodash-es/_castPath.js"); +/* harmony import */ var _last_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./last.js */ "./node_modules/lodash-es/last.js"); +/* harmony import */ var _parent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_parent.js */ "./node_modules/lodash-es/_parent.js"); +/* harmony import */ var _toKey_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_toKey.js */ "./node_modules/lodash-es/_toKey.js"); + + + + + + +/** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ +function baseInvoke(object, path, args) { + path = Object(_castPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])(path, object); + object = Object(_parent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object, path); + var func = object == null ? object : object[Object(_toKey_js__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_last_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path))]; + return func == null ? undefined : Object(_apply_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func, object, args); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseInvoke); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsArguments.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_baseIsArguments.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]'; + +/** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ +function baseIsArguments(value) { + return Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) == argsTag; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsArguments); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsEqual.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseIsEqual.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsEqualDeep_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsEqualDeep.js */ "./node_modules/lodash-es/_baseIsEqualDeep.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ +function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && !Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(other))) { + return value !== value && other !== other; + } + return Object(_baseIsEqualDeep_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value, other, bitmask, customizer, baseIsEqual, stack); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsEqual); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsEqualDeep.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_baseIsEqualDeep.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Stack_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Stack.js */ "./node_modules/lodash-es/_Stack.js"); +/* harmony import */ var _equalArrays_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_equalArrays.js */ "./node_modules/lodash-es/_equalArrays.js"); +/* harmony import */ var _equalByTag_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_equalByTag.js */ "./node_modules/lodash-es/_equalByTag.js"); +/* harmony import */ var _equalObjects_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_equalObjects.js */ "./node_modules/lodash-es/_equalObjects.js"); +/* harmony import */ var _getTag_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_getTag.js */ "./node_modules/lodash-es/_getTag.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isBuffer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isBuffer.js */ "./node_modules/lodash-es/isBuffer.js"); +/* harmony import */ var _isTypedArray_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./isTypedArray.js */ "./node_modules/lodash-es/isTypedArray.js"); + + + + + + + + + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1; + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(object), + othIsArr = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(other), + objTag = objIsArr ? arrayTag : Object(_getTag_js__WEBPACK_IMPORTED_MODULE_4__["default"])(object), + othTag = othIsArr ? arrayTag : Object(_getTag_js__WEBPACK_IMPORTED_MODULE_4__["default"])(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && Object(_isBuffer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(object)) { + if (!Object(_isBuffer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new _Stack_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + return (objIsArr || Object(_isTypedArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(object)) + ? Object(_equalArrays_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, other, bitmask, customizer, equalFunc, stack) + : Object(_equalByTag_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new _Stack_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new _Stack_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + return Object(_equalObjects_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object, other, bitmask, customizer, equalFunc, stack); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsEqualDeep); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsMatch.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseIsMatch.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Stack_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Stack.js */ "./node_modules/lodash-es/_Stack.js"); +/* harmony import */ var _baseIsEqual_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIsEqual.js */ "./node_modules/lodash-es/_baseIsEqual.js"); + + + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ +function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new _Stack_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? Object(_baseIsEqual_js__WEBPACK_IMPORTED_MODULE_1__["default"])(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsMatch); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsNaN.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseIsNaN.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ +function baseIsNaN(value) { + return value !== value; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsNaN); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsNative.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_baseIsNative.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isFunction.js */ "./node_modules/lodash-es/isFunction.js"); +/* harmony import */ var _isMasked_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isMasked.js */ "./node_modules/lodash-es/_isMasked.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); +/* harmony import */ var _toSource_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_toSource.js */ "./node_modules/lodash-es/_toSource.js"); + + + + + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + +/** Used to detect host constructors (Safari). */ +var reIsHostCtor = /^\[object .+?Constructor\]$/; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to detect if a method is native. */ +var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' +); + +/** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ +function baseIsNative(value) { + if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value) || Object(_isMasked_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value)) { + return false; + } + var pattern = Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) ? reIsNative : reIsHostCtor; + return pattern.test(Object(_toSource_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value)); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsNative); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIsTypedArray.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_baseIsTypedArray.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isLength.js */ "./node_modules/lodash-es/isLength.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value) && + Object(_isLength_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value.length) && !!typedArrayTags[Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value)]; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIsTypedArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseIteratee.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_baseIteratee.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseMatches_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseMatches.js */ "./node_modules/lodash-es/_baseMatches.js"); +/* harmony import */ var _baseMatchesProperty_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseMatchesProperty.js */ "./node_modules/lodash-es/_baseMatchesProperty.js"); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _property_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./property.js */ "./node_modules/lodash-es/property.js"); + + + + + + +/** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ +function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return _identity_js__WEBPACK_IMPORTED_MODULE_2__["default"]; + } + if (typeof value == 'object') { + return Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value) + ? Object(_baseMatchesProperty_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value[0], value[1]) + : Object(_baseMatches_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); + } + return Object(_property_js__WEBPACK_IMPORTED_MODULE_4__["default"])(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseIteratee); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseKeys.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_baseKeys.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isPrototype_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isPrototype.js */ "./node_modules/lodash-es/_isPrototype.js"); +/* harmony import */ var _nativeKeys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_nativeKeys.js */ "./node_modules/lodash-es/_nativeKeys.js"); + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeys(object) { + if (!Object(_isPrototype_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object)) { + return Object(_nativeKeys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseKeys); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseKeysIn.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseKeysIn.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); +/* harmony import */ var _isPrototype_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isPrototype.js */ "./node_modules/lodash-es/_isPrototype.js"); +/* harmony import */ var _nativeKeysIn_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_nativeKeysIn.js */ "./node_modules/lodash-es/_nativeKeysIn.js"); + + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function baseKeysIn(object) { + if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object)) { + return Object(_nativeKeysIn_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object); + } + var isProto = Object(_isPrototype_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseKeysIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseLodash.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseLodash.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ +function baseLodash() { + // No operation performed. +} + +/* harmony default export */ __webpack_exports__["default"] = (baseLodash); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseLt.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/_baseLt.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ +function baseLt(value, other) { + return value < other; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseLt); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseMap.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_baseMap.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); + + + +/** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ +function baseMap(collection, iteratee) { + var index = -1, + result = Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(collection) ? Array(collection.length) : []; + + Object(_baseEach_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseMap); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseMatches.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseMatches.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsMatch_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsMatch.js */ "./node_modules/lodash-es/_baseIsMatch.js"); +/* harmony import */ var _getMatchData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getMatchData.js */ "./node_modules/lodash-es/_getMatchData.js"); +/* harmony import */ var _matchesStrictComparable_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_matchesStrictComparable.js */ "./node_modules/lodash-es/_matchesStrictComparable.js"); + + + + +/** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatches(source) { + var matchData = Object(_getMatchData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(source); + if (matchData.length == 1 && matchData[0][2]) { + return Object(_matchesStrictComparable_js__WEBPACK_IMPORTED_MODULE_2__["default"])(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || Object(_baseIsMatch_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, source, matchData); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseMatches); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseMatchesProperty.js": +/*!********************************************************!*\ + !*** ./node_modules/lodash-es/_baseMatchesProperty.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsEqual_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsEqual.js */ "./node_modules/lodash-es/_baseIsEqual.js"); +/* harmony import */ var _get_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./get.js */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var _hasIn_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hasIn.js */ "./node_modules/lodash-es/hasIn.js"); +/* harmony import */ var _isKey_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_isKey.js */ "./node_modules/lodash-es/_isKey.js"); +/* harmony import */ var _isStrictComparable_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_isStrictComparable.js */ "./node_modules/lodash-es/_isStrictComparable.js"); +/* harmony import */ var _matchesStrictComparable_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_matchesStrictComparable.js */ "./node_modules/lodash-es/_matchesStrictComparable.js"); +/* harmony import */ var _toKey_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_toKey.js */ "./node_modules/lodash-es/_toKey.js"); + + + + + + + + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function baseMatchesProperty(path, srcValue) { + if (Object(_isKey_js__WEBPACK_IMPORTED_MODULE_3__["default"])(path) && Object(_isStrictComparable_js__WEBPACK_IMPORTED_MODULE_4__["default"])(srcValue)) { + return Object(_matchesStrictComparable_js__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_toKey_js__WEBPACK_IMPORTED_MODULE_6__["default"])(path), srcValue); + } + return function(object) { + var objValue = Object(_get_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, path); + return (objValue === undefined && objValue === srcValue) + ? Object(_hasIn_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object, path) + : Object(_baseIsEqual_js__WEBPACK_IMPORTED_MODULE_0__["default"])(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseMatchesProperty); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseOrderBy.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseOrderBy.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _baseGet_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseGet.js */ "./node_modules/lodash-es/_baseGet.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _baseMap_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_baseMap.js */ "./node_modules/lodash-es/_baseMap.js"); +/* harmony import */ var _baseSortBy_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_baseSortBy.js */ "./node_modules/lodash-es/_baseSortBy.js"); +/* harmony import */ var _baseUnary_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_baseUnary.js */ "./node_modules/lodash-es/_baseUnary.js"); +/* harmony import */ var _compareMultiple_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_compareMultiple.js */ "./node_modules/lodash-es/_compareMultiple.js"); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + + + + + + + +/** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ +function baseOrderBy(collection, iteratees, orders) { + if (iteratees.length) { + iteratees = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"])(iteratees, function(iteratee) { + if (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_8__["default"])(iteratee)) { + return function(value) { + return Object(_baseGet_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value, iteratee.length === 1 ? iteratee[0] : iteratee); + } + } + return iteratee; + }); + } else { + iteratees = [_identity_js__WEBPACK_IMPORTED_MODULE_7__["default"]]; + } + + var index = -1; + iteratees = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"])(iteratees, Object(_baseUnary_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__["default"])); + + var result = Object(_baseMap_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection, function(value, key, collection) { + var criteria = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"])(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return Object(_baseSortBy_js__WEBPACK_IMPORTED_MODULE_4__["default"])(result, function(object, other) { + return Object(_compareMultiple_js__WEBPACK_IMPORTED_MODULE_6__["default"])(object, other, orders); + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseOrderBy); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_basePick.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_basePick.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _basePickBy_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_basePickBy.js */ "./node_modules/lodash-es/_basePickBy.js"); +/* harmony import */ var _hasIn_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hasIn.js */ "./node_modules/lodash-es/hasIn.js"); + + + +/** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ +function basePick(object, paths) { + return Object(_basePickBy_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, paths, function(value, path) { + return Object(_hasIn_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, path); + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (basePick); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_basePickBy.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_basePickBy.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGet.js */ "./node_modules/lodash-es/_baseGet.js"); +/* harmony import */ var _baseSet_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseSet.js */ "./node_modules/lodash-es/_baseSet.js"); +/* harmony import */ var _castPath_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_castPath.js */ "./node_modules/lodash-es/_castPath.js"); + + + + +/** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ +function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = Object(_baseGet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, path); + + if (predicate(value, path)) { + Object(_baseSet_js__WEBPACK_IMPORTED_MODULE_1__["default"])(result, Object(_castPath_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path, object), value); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (basePickBy); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseProperty.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_baseProperty.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseProperty); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_basePropertyDeep.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_basePropertyDeep.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGet.js */ "./node_modules/lodash-es/_baseGet.js"); + + +/** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyDeep(path) { + return function(object) { + return Object(_baseGet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, path); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (basePropertyDeep); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_basePropertyOf.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_basePropertyOf.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ +function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (basePropertyOf); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseRange.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseRange.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeCeil = Math.ceil, + nativeMax = Math.max; + +/** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ +function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseRange); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseReduce.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseReduce.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ +function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseReduce); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseRest.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_baseRest.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); +/* harmony import */ var _overRest_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_overRest.js */ "./node_modules/lodash-es/_overRest.js"); +/* harmony import */ var _setToString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setToString.js */ "./node_modules/lodash-es/_setToString.js"); + + + + +/** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ +function baseRest(func, start) { + return Object(_setToString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_overRest_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func, start, _identity_js__WEBPACK_IMPORTED_MODULE_0__["default"]), func + ''); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseRest); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSet.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_baseSet.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _assignValue_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_assignValue.js */ "./node_modules/lodash-es/_assignValue.js"); +/* harmony import */ var _castPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_castPath.js */ "./node_modules/lodash-es/_castPath.js"); +/* harmony import */ var _isIndex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isIndex.js */ "./node_modules/lodash-es/_isIndex.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); +/* harmony import */ var _toKey_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_toKey.js */ "./node_modules/lodash-es/_toKey.js"); + + + + + + +/** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ +function baseSet(object, path, value, customizer) { + if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object)) { + return object; + } + path = Object(_castPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = Object(_toKey_js__WEBPACK_IMPORTED_MODULE_4__["default"])(path[index]), + newValue = value; + + if (key === '__proto__' || key === 'constructor' || key === 'prototype') { + return object; + } + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = Object(_isObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(objValue) + ? objValue + : (Object(_isIndex_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path[index + 1]) ? [] : {}); + } + } + Object(_assignValue_js__WEBPACK_IMPORTED_MODULE_0__["default"])(nested, key, newValue); + nested = nested[key]; + } + return object; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseSet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSetData.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_baseSetData.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); +/* harmony import */ var _metaMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_metaMap.js */ "./node_modules/lodash-es/_metaMap.js"); + + + +/** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ +var baseSetData = !_metaMap_js__WEBPACK_IMPORTED_MODULE_1__["default"] ? _identity_js__WEBPACK_IMPORTED_MODULE_0__["default"] : function(func, data) { + _metaMap_js__WEBPACK_IMPORTED_MODULE_1__["default"].set(func, data); + return func; +}; + +/* harmony default export */ __webpack_exports__["default"] = (baseSetData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSetToString.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_baseSetToString.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant.js */ "./node_modules/lodash-es/constant.js"); +/* harmony import */ var _defineProperty_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_defineProperty.js */ "./node_modules/lodash-es/_defineProperty.js"); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); + + + + +/** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var baseSetToString = !_defineProperty_js__WEBPACK_IMPORTED_MODULE_1__["default"] ? _identity_js__WEBPACK_IMPORTED_MODULE_2__["default"] : function(func, string) { + return Object(_defineProperty_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(string), + 'writable': true + }); +}; + +/* harmony default export */ __webpack_exports__["default"] = (baseSetToString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSlice.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseSlice.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ +function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseSlice); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSome.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_baseSome.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); + + +/** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ +function baseSome(collection, predicate) { + var result; + + Object(_baseEach_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseSome); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSortBy.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseSortBy.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ +function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseSortBy); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseSum.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_baseSum.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ +function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseSum); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseTimes.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseTimes.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ +function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseTimes); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseToString.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_baseToString.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Symbol.js */ "./node_modules/lodash-es/_Symbol.js"); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isSymbol.js */ "./node_modules/lodash-es/isSymbol.js"); + + + + + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"].prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + +/** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ +function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value)) { + // Recursively convert values (susceptible to call stack limits). + return Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value, baseToString) + ''; + } + if (Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseToString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseTrim.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_baseTrim.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _trimmedEndIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_trimmedEndIndex.js */ "./node_modules/lodash-es/_trimmedEndIndex.js"); + + +/** Used to match leading whitespace. */ +var reTrimStart = /^\s+/; + +/** + * The base implementation of `_.trim`. + * + * @private + * @param {string} string The string to trim. + * @returns {string} Returns the trimmed string. + */ +function baseTrim(string) { + return string + ? string.slice(0, Object(_trimmedEndIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(string) + 1).replace(reTrimStart, '') + : string; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseTrim); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseUnary.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_baseUnary.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ +function baseUnary(func) { + return function(value) { + return func(value); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseUnary); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseUniq.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_baseUniq.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _SetCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_SetCache.js */ "./node_modules/lodash-es/_SetCache.js"); +/* harmony import */ var _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arrayIncludes.js */ "./node_modules/lodash-es/_arrayIncludes.js"); +/* harmony import */ var _arrayIncludesWith_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_arrayIncludesWith.js */ "./node_modules/lodash-es/_arrayIncludesWith.js"); +/* harmony import */ var _cacheHas_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_cacheHas.js */ "./node_modules/lodash-es/_cacheHas.js"); +/* harmony import */ var _createSet_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_createSet.js */ "./node_modules/lodash-es/_createSet.js"); +/* harmony import */ var _setToArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_setToArray.js */ "./node_modules/lodash-es/_setToArray.js"); + + + + + + + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ +function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__["default"], + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = _arrayIncludesWith_js__WEBPACK_IMPORTED_MODULE_2__["default"]; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : Object(_createSet_js__WEBPACK_IMPORTED_MODULE_4__["default"])(array); + if (set) { + return Object(_setToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(set); + } + isCommon = false; + includes = _cacheHas_js__WEBPACK_IMPORTED_MODULE_3__["default"]; + seen = new _SetCache_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (baseUniq); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_baseValues.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_baseValues.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); + + +/** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ +function baseValues(object, props) { + return Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"])(props, function(key) { + return object[key]; + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (baseValues); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_cacheHas.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_cacheHas.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function cacheHas(cache, key) { + return cache.has(key); +} + +/* harmony default export */ __webpack_exports__["default"] = (cacheHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_castArrayLikeObject.js": +/*!********************************************************!*\ + !*** ./node_modules/lodash-es/_castArrayLikeObject.js ***! + \********************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isArrayLikeObject.js */ "./node_modules/lodash-es/isArrayLikeObject.js"); + + +/** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ +function castArrayLikeObject(value) { + return Object(_isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) ? value : []; +} + +/* harmony default export */ __webpack_exports__["default"] = (castArrayLikeObject); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_castFunction.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_castFunction.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); + + +/** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ +function castFunction(value) { + return typeof value == 'function' ? value : _identity_js__WEBPACK_IMPORTED_MODULE_0__["default"]; +} + +/* harmony default export */ __webpack_exports__["default"] = (castFunction); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_castPath.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_castPath.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isKey_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isKey.js */ "./node_modules/lodash-es/_isKey.js"); +/* harmony import */ var _stringToPath_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_stringToPath.js */ "./node_modules/lodash-es/_stringToPath.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + + + + +/** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ +function castPath(value, object) { + if (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value)) { + return value; + } + return Object(_isKey_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value, object) ? [value] : Object(_stringToPath_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value)); +} + +/* harmony default export */ __webpack_exports__["default"] = (castPath); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_castSlice.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_castSlice.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSlice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSlice.js */ "./node_modules/lodash-es/_baseSlice.js"); + + +/** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ +function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : Object(_baseSlice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, start, end); +} + +/* harmony default export */ __webpack_exports__["default"] = (castSlice); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_charsEndIndex.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_charsEndIndex.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIndexOf.js */ "./node_modules/lodash-es/_baseIndexOf.js"); + + +/** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ +function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && Object(_baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(chrSymbols, strSymbols[index], 0) > -1) {} + return index; +} + +/* harmony default export */ __webpack_exports__["default"] = (charsEndIndex); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_charsStartIndex.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_charsStartIndex.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIndexOf.js */ "./node_modules/lodash-es/_baseIndexOf.js"); + + +/** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ +function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && Object(_baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(chrSymbols, strSymbols[index], 0) > -1) {} + return index; +} + +/* harmony default export */ __webpack_exports__["default"] = (charsStartIndex); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_compareAscending.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_compareAscending.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isSymbol.js */ "./node_modules/lodash-es/isSymbol.js"); + + +/** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ +function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_0__["default"])(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (compareAscending); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_compareMultiple.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_compareMultiple.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _compareAscending_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_compareAscending.js */ "./node_modules/lodash-es/_compareAscending.js"); + + +/** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ +function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = Object(_compareAscending_js__WEBPACK_IMPORTED_MODULE_0__["default"])(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; +} + +/* harmony default export */ __webpack_exports__["default"] = (compareMultiple); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_composeArgs.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_composeArgs.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ +function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (composeArgs); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_composeArgsRight.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_composeArgsRight.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ +function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (composeArgsRight); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_copyArray.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_copyArray.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ +function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; +} + +/* harmony default export */ __webpack_exports__["default"] = (copyArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_coreJsData.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_coreJsData.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + +/** Used to detect overreaching core-js shims. */ +var coreJsData = _root_js__WEBPACK_IMPORTED_MODULE_0__["default"]['__core-js_shared__']; + +/* harmony default export */ __webpack_exports__["default"] = (coreJsData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_countHolders.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_countHolders.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ +function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (countHolders); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createAggregator.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_createAggregator.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayAggregator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayAggregator.js */ "./node_modules/lodash-es/_arrayAggregator.js"); +/* harmony import */ var _baseAggregator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseAggregator.js */ "./node_modules/lodash-es/_baseAggregator.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + + +/** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ +function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? _arrayAggregator_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseAggregator_js__WEBPACK_IMPORTED_MODULE_1__["default"], + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__["default"])(iteratee, 2), accumulator); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createAggregator); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createBaseEach.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_createBaseEach.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); + + +/** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createBaseEach); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createBaseFor.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_createBaseFor.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ +function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createBaseFor); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createBind.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_createBind.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createCtor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createCtor.js */ "./node_modules/lodash-es/_createCtor.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1; + +/** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = Object(_createCtor_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func); + + function wrapper() { + var fn = (this && this !== _root_js__WEBPACK_IMPORTED_MODULE_1__["default"] && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; +} + +/* harmony default export */ __webpack_exports__["default"] = (createBind); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createCaseFirst.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_createCaseFirst.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _castSlice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_castSlice.js */ "./node_modules/lodash-es/_castSlice.js"); +/* harmony import */ var _hasUnicode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasUnicode.js */ "./node_modules/lodash-es/_hasUnicode.js"); +/* harmony import */ var _stringToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_stringToArray.js */ "./node_modules/lodash-es/_stringToArray.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + + + + +/** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ +function createCaseFirst(methodName) { + return function(string) { + string = Object(_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(string); + + var strSymbols = Object(_hasUnicode_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string) + ? Object(_stringToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? Object(_castSlice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createCaseFirst); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createCompounder.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/_createCompounder.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayReduce.js */ "./node_modules/lodash-es/_arrayReduce.js"); +/* harmony import */ var _deburr_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./deburr.js */ "./node_modules/lodash-es/deburr.js"); +/* harmony import */ var _words_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./words.js */ "./node_modules/lodash-es/words.js"); + + + + +/** Used to compose unicode capture groups. */ +var rsApos = "['\u2019]"; + +/** Used to match apostrophes. */ +var reApos = RegExp(rsApos, 'g'); + +/** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ +function createCompounder(callback) { + return function(string) { + return Object(_arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_words_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_deburr_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string).replace(reApos, '')), callback, ''); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createCompounder); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createCtor.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_createCtor.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseCreate.js */ "./node_modules/lodash-es/_baseCreate.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); + + + +/** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ +function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = Object(_baseCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(result) ? result : thisBinding; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createCtor); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createCurry.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_createCurry.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _apply_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_apply.js */ "./node_modules/lodash-es/_apply.js"); +/* harmony import */ var _createCtor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createCtor.js */ "./node_modules/lodash-es/_createCtor.js"); +/* harmony import */ var _createHybrid_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_createHybrid.js */ "./node_modules/lodash-es/_createHybrid.js"); +/* harmony import */ var _createRecurry_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_createRecurry.js */ "./node_modules/lodash-es/_createRecurry.js"); +/* harmony import */ var _getHolder_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_getHolder.js */ "./node_modules/lodash-es/_getHolder.js"); +/* harmony import */ var _replaceHolders_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_replaceHolders.js */ "./node_modules/lodash-es/_replaceHolders.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + + + + + + +/** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createCurry(func, bitmask, arity) { + var Ctor = Object(_createCtor_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = Object(_getHolder_js__WEBPACK_IMPORTED_MODULE_4__["default"])(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : Object(_replaceHolders_js__WEBPACK_IMPORTED_MODULE_5__["default"])(args, placeholder); + + length -= holders.length; + if (length < arity) { + return Object(_createRecurry_js__WEBPACK_IMPORTED_MODULE_3__["default"])( + func, bitmask, _createHybrid_js__WEBPACK_IMPORTED_MODULE_2__["default"], wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== _root_js__WEBPACK_IMPORTED_MODULE_6__["default"] && this instanceof wrapper) ? Ctor : func; + return Object(_apply_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn, this, args); + } + return wrapper; +} + +/* harmony default export */ __webpack_exports__["default"] = (createCurry); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createFind.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_createFind.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ "./node_modules/lodash-es/keys.js"); + + + + +/** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ +function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(collection)) { + var iteratee = Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_0__["default"])(predicate, 3); + collection = Object(_keys_js__WEBPACK_IMPORTED_MODULE_2__["default"])(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createFind); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createHybrid.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_createHybrid.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _composeArgs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_composeArgs.js */ "./node_modules/lodash-es/_composeArgs.js"); +/* harmony import */ var _composeArgsRight_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_composeArgsRight.js */ "./node_modules/lodash-es/_composeArgsRight.js"); +/* harmony import */ var _countHolders_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_countHolders.js */ "./node_modules/lodash-es/_countHolders.js"); +/* harmony import */ var _createCtor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_createCtor.js */ "./node_modules/lodash-es/_createCtor.js"); +/* harmony import */ var _createRecurry_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_createRecurry.js */ "./node_modules/lodash-es/_createRecurry.js"); +/* harmony import */ var _getHolder_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_getHolder.js */ "./node_modules/lodash-es/_getHolder.js"); +/* harmony import */ var _reorder_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_reorder.js */ "./node_modules/lodash-es/_reorder.js"); +/* harmony import */ var _replaceHolders_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./_replaceHolders.js */ "./node_modules/lodash-es/_replaceHolders.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + + + + + + + + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_ARY_FLAG = 128, + WRAP_FLIP_FLAG = 512; + +/** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : Object(_createCtor_js__WEBPACK_IMPORTED_MODULE_3__["default"])(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = Object(_getHolder_js__WEBPACK_IMPORTED_MODULE_5__["default"])(wrapper), + holdersCount = Object(_countHolders_js__WEBPACK_IMPORTED_MODULE_2__["default"])(args, placeholder); + } + if (partials) { + args = Object(_composeArgs_js__WEBPACK_IMPORTED_MODULE_0__["default"])(args, partials, holders, isCurried); + } + if (partialsRight) { + args = Object(_composeArgsRight_js__WEBPACK_IMPORTED_MODULE_1__["default"])(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = Object(_replaceHolders_js__WEBPACK_IMPORTED_MODULE_7__["default"])(args, placeholder); + return Object(_createRecurry_js__WEBPACK_IMPORTED_MODULE_4__["default"])( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = Object(_reorder_js__WEBPACK_IMPORTED_MODULE_6__["default"])(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== _root_js__WEBPACK_IMPORTED_MODULE_8__["default"] && this instanceof wrapper) { + fn = Ctor || Object(_createCtor_js__WEBPACK_IMPORTED_MODULE_3__["default"])(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; +} + +/* harmony default export */ __webpack_exports__["default"] = (createHybrid); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createInverter.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_createInverter.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseInverter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseInverter.js */ "./node_modules/lodash-es/_baseInverter.js"); + + +/** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ +function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return Object(_baseInverter_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, setter, toIteratee(iteratee), {}); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createInverter); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createPartial.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_createPartial.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _apply_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_apply.js */ "./node_modules/lodash-es/_apply.js"); +/* harmony import */ var _createCtor_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createCtor.js */ "./node_modules/lodash-es/_createCtor.js"); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); + + + + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1; + +/** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ +function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = Object(_createCtor_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== _root_js__WEBPACK_IMPORTED_MODULE_2__["default"] && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return Object(_apply_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fn, isBind ? thisArg : this, args); + } + return wrapper; +} + +/* harmony default export */ __webpack_exports__["default"] = (createPartial); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createRange.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_createRange.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseRange_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseRange.js */ "./node_modules/lodash-es/_baseRange.js"); +/* harmony import */ var _isIterateeCall_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isIterateeCall.js */ "./node_modules/lodash-es/_isIterateeCall.js"); +/* harmony import */ var _toFinite_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toFinite.js */ "./node_modules/lodash-es/toFinite.js"); + + + + +/** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ +function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && Object(_isIterateeCall_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = Object(_toFinite_js__WEBPACK_IMPORTED_MODULE_2__["default"])(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = Object(_toFinite_js__WEBPACK_IMPORTED_MODULE_2__["default"])(end); + } + step = step === undefined ? (start < end ? 1 : -1) : Object(_toFinite_js__WEBPACK_IMPORTED_MODULE_2__["default"])(step); + return Object(_baseRange_js__WEBPACK_IMPORTED_MODULE_0__["default"])(start, end, step, fromRight); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createRange); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createRecurry.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_createRecurry.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isLaziable_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isLaziable.js */ "./node_modules/lodash-es/_isLaziable.js"); +/* harmony import */ var _setData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_setData.js */ "./node_modules/lodash-es/_setData.js"); +/* harmony import */ var _setWrapToString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setWrapToString.js */ "./node_modules/lodash-es/_setWrapToString.js"); + + + + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64; + +/** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (Object(_isLaziable_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func)) { + Object(_setData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(result, newData); + } + result.placeholder = placeholder; + return Object(_setWrapToString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(result, func, bitmask); +} + +/* harmony default export */ __webpack_exports__["default"] = (createRecurry); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createRound.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_createRound.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); +/* harmony import */ var _toNumber_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toNumber.js */ "./node_modules/lodash-es/toNumber.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + + + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsFinite = _root_js__WEBPACK_IMPORTED_MODULE_0__["default"].isFinite, + nativeMin = Math.min; + +/** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ +function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = Object(_toNumber_js__WEBPACK_IMPORTED_MODULE_2__["default"])(number); + precision = precision == null ? 0 : nativeMin(Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(precision), 292); + if (precision && nativeIsFinite(number)) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (Object(_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (Object(_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (createRound); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createSet.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_createSet.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Set_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Set.js */ "./node_modules/lodash-es/_Set.js"); +/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./noop.js */ "./node_modules/lodash-es/noop.js"); +/* harmony import */ var _setToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setToArray.js */ "./node_modules/lodash-es/_setToArray.js"); + + + + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ +var createSet = !(_Set_js__WEBPACK_IMPORTED_MODULE_0__["default"] && (1 / Object(_setToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(new _Set_js__WEBPACK_IMPORTED_MODULE_0__["default"]([,-0]))[1]) == INFINITY) ? _noop_js__WEBPACK_IMPORTED_MODULE_1__["default"] : function(values) { + return new _Set_js__WEBPACK_IMPORTED_MODULE_0__["default"](values); +}; + +/* harmony default export */ __webpack_exports__["default"] = (createSet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_createWrap.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_createWrap.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSetData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSetData.js */ "./node_modules/lodash-es/_baseSetData.js"); +/* harmony import */ var _createBind_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createBind.js */ "./node_modules/lodash-es/_createBind.js"); +/* harmony import */ var _createCurry_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_createCurry.js */ "./node_modules/lodash-es/_createCurry.js"); +/* harmony import */ var _createHybrid_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_createHybrid.js */ "./node_modules/lodash-es/_createHybrid.js"); +/* harmony import */ var _createPartial_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_createPartial.js */ "./node_modules/lodash-es/_createPartial.js"); +/* harmony import */ var _getData_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_getData.js */ "./node_modules/lodash-es/_getData.js"); +/* harmony import */ var _mergeData_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_mergeData.js */ "./node_modules/lodash-es/_mergeData.js"); +/* harmony import */ var _setData_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./_setData.js */ "./node_modules/lodash-es/_setData.js"); +/* harmony import */ var _setWrapToString_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./_setWrapToString.js */ "./node_modules/lodash-es/_setWrapToString.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); + + + + + + + + + + + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ +function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_9__["default"])(ary), 0); + arity = arity === undefined ? arity : Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_9__["default"])(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : Object(_getData_js__WEBPACK_IMPORTED_MODULE_5__["default"])(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + Object(_mergeData_js__WEBPACK_IMPORTED_MODULE_6__["default"])(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = Object(_createBind_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = Object(_createCurry_js__WEBPACK_IMPORTED_MODULE_2__["default"])(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = Object(_createPartial_js__WEBPACK_IMPORTED_MODULE_4__["default"])(func, bitmask, thisArg, partials); + } else { + result = _createHybrid_js__WEBPACK_IMPORTED_MODULE_3__["default"].apply(undefined, newData); + } + var setter = data ? _baseSetData_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _setData_js__WEBPACK_IMPORTED_MODULE_7__["default"]; + return Object(_setWrapToString_js__WEBPACK_IMPORTED_MODULE_8__["default"])(setter(result, newData), func, bitmask); +} + +/* harmony default export */ __webpack_exports__["default"] = (createWrap); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_deburrLetter.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_deburrLetter.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _basePropertyOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_basePropertyOf.js */ "./node_modules/lodash-es/_basePropertyOf.js"); + + +/** Used to map Latin Unicode letters to basic Latin letters. */ +var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' +}; + +/** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ +var deburrLetter = Object(_basePropertyOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(deburredLetters); + +/* harmony default export */ __webpack_exports__["default"] = (deburrLetter); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_defineProperty.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_defineProperty.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); + + +var defineProperty = (function() { + try { + var func = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} +}()); + +/* harmony default export */ __webpack_exports__["default"] = (defineProperty); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_equalArrays.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_equalArrays.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _SetCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_SetCache.js */ "./node_modules/lodash-es/_SetCache.js"); +/* harmony import */ var _arraySome_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arraySome.js */ "./node_modules/lodash-es/_arraySome.js"); +/* harmony import */ var _cacheHas_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_cacheHas.js */ "./node_modules/lodash-es/_cacheHas.js"); + + + + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ +function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Check that cyclic values are equal. + var arrStacked = stack.get(array); + var othStacked = stack.get(other); + if (arrStacked && othStacked) { + return arrStacked == other && othStacked == array; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new _SetCache_js__WEBPACK_IMPORTED_MODULE_0__["default"] : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!Object(_arraySome_js__WEBPACK_IMPORTED_MODULE_1__["default"])(other, function(othValue, othIndex) { + if (!Object(_cacheHas_js__WEBPACK_IMPORTED_MODULE_2__["default"])(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (equalArrays); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_equalByTag.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_equalByTag.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Symbol.js */ "./node_modules/lodash-es/_Symbol.js"); +/* harmony import */ var _Uint8Array_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_Uint8Array.js */ "./node_modules/lodash-es/_Uint8Array.js"); +/* harmony import */ var _eq_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./eq.js */ "./node_modules/lodash-es/eq.js"); +/* harmony import */ var _equalArrays_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_equalArrays.js */ "./node_modules/lodash-es/_equalArrays.js"); +/* harmony import */ var _mapToArray_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_mapToArray.js */ "./node_modules/lodash-es/_mapToArray.js"); +/* harmony import */ var _setToArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_setToArray.js */ "./node_modules/lodash-es/_setToArray.js"); + + + + + + + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + mapTag = '[object Map]', + numberTag = '[object Number]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]'; + +/** Used to convert symbols to primitives and strings. */ +var symbolProto = _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"].prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined; + +/** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new _Uint8Array_js__WEBPACK_IMPORTED_MODULE_1__["default"](object), new _Uint8Array_js__WEBPACK_IMPORTED_MODULE_1__["default"](other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return Object(_eq_js__WEBPACK_IMPORTED_MODULE_2__["default"])(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = _mapToArray_js__WEBPACK_IMPORTED_MODULE_4__["default"]; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = _setToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"]); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = Object(_equalArrays_js__WEBPACK_IMPORTED_MODULE_3__["default"])(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; +} + +/* harmony default export */ __webpack_exports__["default"] = (equalByTag); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_equalObjects.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_equalObjects.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getAllKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getAllKeys.js */ "./node_modules/lodash-es/_getAllKeys.js"); + + +/** Used to compose bitmasks for value comparisons. */ +var COMPARE_PARTIAL_FLAG = 1; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ +function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = Object(_getAllKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object), + objLength = objProps.length, + othProps = Object(_getAllKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Check that cyclic values are equal. + var objStacked = stack.get(object); + var othStacked = stack.get(other); + if (objStacked && othStacked) { + return objStacked == other && othStacked == object; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (equalObjects); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_flatRest.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_flatRest.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _flatten_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./flatten.js */ "./node_modules/lodash-es/flatten.js"); +/* harmony import */ var _overRest_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_overRest.js */ "./node_modules/lodash-es/_overRest.js"); +/* harmony import */ var _setToString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setToString.js */ "./node_modules/lodash-es/_setToString.js"); + + + + +/** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ +function flatRest(func) { + return Object(_setToString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_overRest_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func, undefined, _flatten_js__WEBPACK_IMPORTED_MODULE_0__["default"]), func + ''); +} + +/* harmony default export */ __webpack_exports__["default"] = (flatRest); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_freeGlobal.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_freeGlobal.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +/* harmony default export */ __webpack_exports__["default"] = (freeGlobal); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../next/dist/compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/lodash-es/_getAllKeys.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_getAllKeys.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetAllKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetAllKeys.js */ "./node_modules/lodash-es/_baseGetAllKeys.js"); +/* harmony import */ var _getSymbols_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getSymbols.js */ "./node_modules/lodash-es/_getSymbols.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keys.js */ "./node_modules/lodash-es/keys.js"); + + + + +/** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeys(object) { + return Object(_baseGetAllKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, _keys_js__WEBPACK_IMPORTED_MODULE_2__["default"], _getSymbols_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +} + +/* harmony default export */ __webpack_exports__["default"] = (getAllKeys); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getAllKeysIn.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_getAllKeysIn.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetAllKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetAllKeys.js */ "./node_modules/lodash-es/_baseGetAllKeys.js"); +/* harmony import */ var _getSymbolsIn_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getSymbolsIn.js */ "./node_modules/lodash-es/_getSymbolsIn.js"); +/* harmony import */ var _keysIn_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keysIn.js */ "./node_modules/lodash-es/keysIn.js"); + + + + +/** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ +function getAllKeysIn(object) { + return Object(_baseGetAllKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, _keysIn_js__WEBPACK_IMPORTED_MODULE_2__["default"], _getSymbolsIn_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +} + +/* harmony default export */ __webpack_exports__["default"] = (getAllKeysIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getData.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_getData.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _metaMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_metaMap.js */ "./node_modules/lodash-es/_metaMap.js"); +/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./noop.js */ "./node_modules/lodash-es/noop.js"); + + + +/** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ +var getData = !_metaMap_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? _noop_js__WEBPACK_IMPORTED_MODULE_1__["default"] : function(func) { + return _metaMap_js__WEBPACK_IMPORTED_MODULE_0__["default"].get(func); +}; + +/* harmony default export */ __webpack_exports__["default"] = (getData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getFuncName.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_getFuncName.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _realNames_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_realNames.js */ "./node_modules/lodash-es/_realNames.js"); + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ +function getFuncName(func) { + var result = (func.name + ''), + array = _realNames_js__WEBPACK_IMPORTED_MODULE_0__["default"][result], + length = hasOwnProperty.call(_realNames_js__WEBPACK_IMPORTED_MODULE_0__["default"], result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (getFuncName); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getHolder.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_getHolder.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ +function getHolder(func) { + var object = func; + return object.placeholder; +} + +/* harmony default export */ __webpack_exports__["default"] = (getHolder); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getMapData.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_getMapData.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isKeyable_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isKeyable.js */ "./node_modules/lodash-es/_isKeyable.js"); + + +/** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ +function getMapData(map, key) { + var data = map.__data__; + return Object(_isKeyable_js__WEBPACK_IMPORTED_MODULE_0__["default"])(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; +} + +/* harmony default export */ __webpack_exports__["default"] = (getMapData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getMatchData.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_getMatchData.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isStrictComparable_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_isStrictComparable.js */ "./node_modules/lodash-es/_isStrictComparable.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ "./node_modules/lodash-es/keys.js"); + + + +/** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ +function getMatchData(object) { + var result = Object(_keys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, Object(_isStrictComparable_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value)]; + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (getMatchData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getNative.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_getNative.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsNative.js */ "./node_modules/lodash-es/_baseIsNative.js"); +/* harmony import */ var _getValue_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getValue.js */ "./node_modules/lodash-es/_getValue.js"); + + + +/** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ +function getNative(object, key) { + var value = Object(_getValue_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, key); + return Object(_baseIsNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) ? value : undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (getNative); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getPrototype.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_getPrototype.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _overArg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_overArg.js */ "./node_modules/lodash-es/_overArg.js"); + + +/** Built-in value references. */ +var getPrototype = Object(_overArg_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object.getPrototypeOf, Object); + +/* harmony default export */ __webpack_exports__["default"] = (getPrototype); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getRawTag.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_getRawTag.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Symbol.js */ "./node_modules/lodash-es/_Symbol.js"); + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** Built-in value references. */ +var symToStringTag = _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"].toStringTag : undefined; + +/** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ +function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (getRawTag); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getSymbols.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_getSymbols.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayFilter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayFilter.js */ "./node_modules/lodash-es/_arrayFilter.js"); +/* harmony import */ var _stubArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stubArray.js */ "./node_modules/lodash-es/stubArray.js"); + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; + +/** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbols = !nativeGetSymbols ? _stubArray_js__WEBPACK_IMPORTED_MODULE_1__["default"] : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return Object(_arrayFilter_js__WEBPACK_IMPORTED_MODULE_0__["default"])(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); +}; + +/* harmony default export */ __webpack_exports__["default"] = (getSymbols); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getSymbolsIn.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_getSymbolsIn.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayPush_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayPush.js */ "./node_modules/lodash-es/_arrayPush.js"); +/* harmony import */ var _getPrototype_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getPrototype.js */ "./node_modules/lodash-es/_getPrototype.js"); +/* harmony import */ var _getSymbols_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_getSymbols.js */ "./node_modules/lodash-es/_getSymbols.js"); +/* harmony import */ var _stubArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stubArray.js */ "./node_modules/lodash-es/stubArray.js"); + + + + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeGetSymbols = Object.getOwnPropertySymbols; + +/** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ +var getSymbolsIn = !nativeGetSymbols ? _stubArray_js__WEBPACK_IMPORTED_MODULE_3__["default"] : function(object) { + var result = []; + while (object) { + Object(_arrayPush_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result, Object(_getSymbols_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object)); + object = Object(_getPrototype_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object); + } + return result; +}; + +/* harmony default export */ __webpack_exports__["default"] = (getSymbolsIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getTag.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/_getTag.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _DataView_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_DataView.js */ "./node_modules/lodash-es/_DataView.js"); +/* harmony import */ var _Map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_Map.js */ "./node_modules/lodash-es/_Map.js"); +/* harmony import */ var _Promise_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_Promise.js */ "./node_modules/lodash-es/_Promise.js"); +/* harmony import */ var _Set_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_Set.js */ "./node_modules/lodash-es/_Set.js"); +/* harmony import */ var _WeakMap_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_WeakMap.js */ "./node_modules/lodash-es/_WeakMap.js"); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _toSource_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_toSource.js */ "./node_modules/lodash-es/_toSource.js"); + + + + + + + + +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + setTag = '[object Set]', + weakMapTag = '[object WeakMap]'; + +var dataViewTag = '[object DataView]'; + +/** Used to detect maps, sets, and weakmaps. */ +var dataViewCtorString = Object(_toSource_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_DataView_js__WEBPACK_IMPORTED_MODULE_0__["default"]), + mapCtorString = Object(_toSource_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_Map_js__WEBPACK_IMPORTED_MODULE_1__["default"]), + promiseCtorString = Object(_toSource_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_Promise_js__WEBPACK_IMPORTED_MODULE_2__["default"]), + setCtorString = Object(_toSource_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_Set_js__WEBPACK_IMPORTED_MODULE_3__["default"]), + weakMapCtorString = Object(_toSource_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_WeakMap_js__WEBPACK_IMPORTED_MODULE_4__["default"]); + +/** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +var getTag = _baseGetTag_js__WEBPACK_IMPORTED_MODULE_5__["default"]; + +// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. +if ((_DataView_js__WEBPACK_IMPORTED_MODULE_0__["default"] && getTag(new _DataView_js__WEBPACK_IMPORTED_MODULE_0__["default"](new ArrayBuffer(1))) != dataViewTag) || + (_Map_js__WEBPACK_IMPORTED_MODULE_1__["default"] && getTag(new _Map_js__WEBPACK_IMPORTED_MODULE_1__["default"]) != mapTag) || + (_Promise_js__WEBPACK_IMPORTED_MODULE_2__["default"] && getTag(_Promise_js__WEBPACK_IMPORTED_MODULE_2__["default"].resolve()) != promiseTag) || + (_Set_js__WEBPACK_IMPORTED_MODULE_3__["default"] && getTag(new _Set_js__WEBPACK_IMPORTED_MODULE_3__["default"]) != setTag) || + (_WeakMap_js__WEBPACK_IMPORTED_MODULE_4__["default"] && getTag(new _WeakMap_js__WEBPACK_IMPORTED_MODULE_4__["default"]) != weakMapTag)) { + getTag = function(value) { + var result = Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_5__["default"])(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? Object(_toSource_js__WEBPACK_IMPORTED_MODULE_6__["default"])(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (getTag); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getValue.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_getValue.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ +function getValue(object, key) { + return object == null ? undefined : object[key]; +} + +/* harmony default export */ __webpack_exports__["default"] = (getValue); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_getWrapDetails.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_getWrapDetails.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to match wrap detail comments. */ +var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + +/** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ +function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; +} + +/* harmony default export */ __webpack_exports__["default"] = (getWrapDetails); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hasPath.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_hasPath.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _castPath_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_castPath.js */ "./node_modules/lodash-es/_castPath.js"); +/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArguments.js */ "./node_modules/lodash-es/isArguments.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isIndex_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_isIndex.js */ "./node_modules/lodash-es/_isIndex.js"); +/* harmony import */ var _isLength_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isLength.js */ "./node_modules/lodash-es/isLength.js"); +/* harmony import */ var _toKey_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_toKey.js */ "./node_modules/lodash-es/_toKey.js"); + + + + + + + +/** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ +function hasPath(object, path, hasFunc) { + path = Object(_castPath_js__WEBPACK_IMPORTED_MODULE_0__["default"])(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = Object(_toKey_js__WEBPACK_IMPORTED_MODULE_5__["default"])(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && Object(_isLength_js__WEBPACK_IMPORTED_MODULE_4__["default"])(length) && Object(_isIndex_js__WEBPACK_IMPORTED_MODULE_3__["default"])(key, length) && + (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object) || Object(_isArguments_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object)); +} + +/* harmony default export */ __webpack_exports__["default"] = (hasPath); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hasUnicode.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_hasUnicode.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; + +/** Used to compose unicode capture groups. */ +var rsZWJ = '\\u200d'; + +/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ +var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + +/** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ +function hasUnicode(string) { + return reHasUnicode.test(string); +} + +/* harmony default export */ __webpack_exports__["default"] = (hasUnicode); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hasUnicodeWord.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_hasUnicodeWord.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to detect strings that need a more robust regexp to match words. */ +var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + +/** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ +function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); +} + +/* harmony default export */ __webpack_exports__["default"] = (hasUnicodeWord); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hashClear.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_hashClear.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_nativeCreate.js */ "./node_modules/lodash-es/_nativeCreate.js"); + + +/** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ +function hashClear() { + this.__data__ = _nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? Object(_nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(null) : {}; + this.size = 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (hashClear); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hashDelete.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_hashDelete.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (hashDelete); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hashGet.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_hashGet.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_nativeCreate.js */ "./node_modules/lodash-es/_nativeCreate.js"); + + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function hashGet(key) { + var data = this.__data__; + if (_nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"]) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (hashGet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hashHas.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_hashHas.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_nativeCreate.js */ "./node_modules/lodash-es/_nativeCreate.js"); + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function hashHas(key) { + var data = this.__data__; + return _nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? (data[key] !== undefined) : hasOwnProperty.call(data, key); +} + +/* harmony default export */ __webpack_exports__["default"] = (hashHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_hashSet.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_hashSet.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_nativeCreate.js */ "./node_modules/lodash-es/_nativeCreate.js"); + + +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ +function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (_nativeCreate_js__WEBPACK_IMPORTED_MODULE_0__["default"] && value === undefined) ? HASH_UNDEFINED : value; + return this; +} + +/* harmony default export */ __webpack_exports__["default"] = (hashSet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_insertWrapDetails.js": +/*!******************************************************!*\ + !*** ./node_modules/lodash-es/_insertWrapDetails.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to match wrap detail comments. */ +var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/; + +/** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ +function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); +} + +/* harmony default export */ __webpack_exports__["default"] = (insertWrapDetails); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isFlattenable.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_isFlattenable.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Symbol.js */ "./node_modules/lodash-es/_Symbol.js"); +/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArguments.js */ "./node_modules/lodash-es/isArguments.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + +/** Built-in value references. */ +var spreadableSymbol = _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"] ? _Symbol_js__WEBPACK_IMPORTED_MODULE_0__["default"].isConcatSpreadable : undefined; + +/** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ +function isFlattenable(value) { + return Object(_isArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value) || Object(_isArguments_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); +} + +/* harmony default export */ __webpack_exports__["default"] = (isFlattenable); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isIndex.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_isIndex.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** Used to detect unsigned integer values. */ +var reIsUint = /^(?:0|[1-9]\d*)$/; + +/** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ +function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); +} + +/* harmony default export */ __webpack_exports__["default"] = (isIndex); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isIterateeCall.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_isIterateeCall.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _eq_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./eq.js */ "./node_modules/lodash-es/eq.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); +/* harmony import */ var _isIndex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isIndex.js */ "./node_modules/lodash-es/_isIndex.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); + + + + + +/** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ +function isIterateeCall(value, index, object) { + if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object) && Object(_isIndex_js__WEBPACK_IMPORTED_MODULE_2__["default"])(index, object.length)) + : (type == 'string' && index in object) + ) { + return Object(_eq_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object[index], value); + } + return false; +} + +/* harmony default export */ __webpack_exports__["default"] = (isIterateeCall); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isKey.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/_isKey.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isSymbol.js */ "./node_modules/lodash-es/isSymbol.js"); + + + +/** Used to match property names within property paths. */ +var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/; + +/** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ +function isKey(value, object) { + if (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); +} + +/* harmony default export */ __webpack_exports__["default"] = (isKey); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isKeyable.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_isKeyable.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ +function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); +} + +/* harmony default export */ __webpack_exports__["default"] = (isKeyable); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isLaziable.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_isLaziable.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _LazyWrapper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_LazyWrapper.js */ "./node_modules/lodash-es/_LazyWrapper.js"); +/* harmony import */ var _getData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getData.js */ "./node_modules/lodash-es/_getData.js"); +/* harmony import */ var _getFuncName_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_getFuncName.js */ "./node_modules/lodash-es/_getFuncName.js"); +/* harmony import */ var _wrapperLodash_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./wrapperLodash.js */ "./node_modules/lodash-es/wrapperLodash.js"); + + + + + +/** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ +function isLaziable(func) { + var funcName = Object(_getFuncName_js__WEBPACK_IMPORTED_MODULE_2__["default"])(func), + other = _wrapperLodash_js__WEBPACK_IMPORTED_MODULE_3__["default"][funcName]; + + if (typeof other != 'function' || !(funcName in _LazyWrapper_js__WEBPACK_IMPORTED_MODULE_0__["default"].prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = Object(_getData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(other); + return !!data && func === data[0]; +} + +/* harmony default export */ __webpack_exports__["default"] = (isLaziable); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isMasked.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_isMasked.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _coreJsData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_coreJsData.js */ "./node_modules/lodash-es/_coreJsData.js"); + + +/** Used to detect methods masquerading as native. */ +var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(_coreJsData_js__WEBPACK_IMPORTED_MODULE_0__["default"] && _coreJsData_js__WEBPACK_IMPORTED_MODULE_0__["default"].keys && _coreJsData_js__WEBPACK_IMPORTED_MODULE_0__["default"].keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; +}()); + +/** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ +function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); +} + +/* harmony default export */ __webpack_exports__["default"] = (isMasked); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isPrototype.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_isPrototype.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ +function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; +} + +/* harmony default export */ __webpack_exports__["default"] = (isPrototype); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_isStrictComparable.js": +/*!*******************************************************!*\ + !*** ./node_modules/lodash-es/_isStrictComparable.js ***! + \*******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); + + +/** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ +function isStrictComparable(value) { + return value === value && !Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (isStrictComparable); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_listCacheClear.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_listCacheClear.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ +function listCacheClear() { + this.__data__ = []; + this.size = 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (listCacheClear); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_listCacheDelete.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_listCacheDelete.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_assocIndexOf.js */ "./node_modules/lodash-es/_assocIndexOf.js"); + + +/** Used for built-in method references. */ +var arrayProto = Array.prototype; + +/** Built-in value references. */ +var splice = arrayProto.splice; + +/** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function listCacheDelete(key) { + var data = this.__data__, + index = Object(_assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; +} + +/* harmony default export */ __webpack_exports__["default"] = (listCacheDelete); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_listCacheGet.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_listCacheGet.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_assocIndexOf.js */ "./node_modules/lodash-es/_assocIndexOf.js"); + + +/** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function listCacheGet(key) { + var data = this.__data__, + index = Object(_assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(data, key); + + return index < 0 ? undefined : data[index][1]; +} + +/* harmony default export */ __webpack_exports__["default"] = (listCacheGet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_listCacheHas.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_listCacheHas.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_assocIndexOf.js */ "./node_modules/lodash-es/_assocIndexOf.js"); + + +/** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function listCacheHas(key) { + return Object(_assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this.__data__, key) > -1; +} + +/* harmony default export */ __webpack_exports__["default"] = (listCacheHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_listCacheSet.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_listCacheSet.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_assocIndexOf.js */ "./node_modules/lodash-es/_assocIndexOf.js"); + + +/** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ +function listCacheSet(key, value) { + var data = this.__data__, + index = Object(_assocIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; +} + +/* harmony default export */ __webpack_exports__["default"] = (listCacheSet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mapCacheClear.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_mapCacheClear.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Hash_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_Hash.js */ "./node_modules/lodash-es/_Hash.js"); +/* harmony import */ var _ListCache_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_ListCache.js */ "./node_modules/lodash-es/_ListCache.js"); +/* harmony import */ var _Map_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_Map.js */ "./node_modules/lodash-es/_Map.js"); + + + + +/** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ +function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new _Hash_js__WEBPACK_IMPORTED_MODULE_0__["default"], + 'map': new (_Map_js__WEBPACK_IMPORTED_MODULE_2__["default"] || _ListCache_js__WEBPACK_IMPORTED_MODULE_1__["default"]), + 'string': new _Hash_js__WEBPACK_IMPORTED_MODULE_0__["default"] + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (mapCacheClear); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mapCacheDelete.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_mapCacheDelete.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getMapData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getMapData.js */ "./node_modules/lodash-es/_getMapData.js"); + + +/** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function mapCacheDelete(key) { + var result = Object(_getMapData_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (mapCacheDelete); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mapCacheGet.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_mapCacheGet.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getMapData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getMapData.js */ "./node_modules/lodash-es/_getMapData.js"); + + +/** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function mapCacheGet(key) { + return Object(_getMapData_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this, key).get(key); +} + +/* harmony default export */ __webpack_exports__["default"] = (mapCacheGet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mapCacheHas.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_mapCacheHas.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getMapData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getMapData.js */ "./node_modules/lodash-es/_getMapData.js"); + + +/** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function mapCacheHas(key) { + return Object(_getMapData_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this, key).has(key); +} + +/* harmony default export */ __webpack_exports__["default"] = (mapCacheHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mapCacheSet.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_mapCacheSet.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getMapData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getMapData.js */ "./node_modules/lodash-es/_getMapData.js"); + + +/** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ +function mapCacheSet(key, value) { + var data = Object(_getMapData_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; +} + +/* harmony default export */ __webpack_exports__["default"] = (mapCacheSet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mapToArray.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_mapToArray.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ +function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (mapToArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_matchesStrictComparable.js": +/*!************************************************************!*\ + !*** ./node_modules/lodash-es/_matchesStrictComparable.js ***! + \************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ +function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (matchesStrictComparable); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_memoizeCapped.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_memoizeCapped.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _memoize_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./memoize.js */ "./node_modules/lodash-es/memoize.js"); + + +/** Used as the maximum memoize cache size. */ +var MAX_MEMOIZE_SIZE = 500; + +/** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ +function memoizeCapped(func) { + var result = Object(_memoize_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (memoizeCapped); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_mergeData.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_mergeData.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _composeArgs_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_composeArgs.js */ "./node_modules/lodash-es/_composeArgs.js"); +/* harmony import */ var _composeArgsRight_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_composeArgsRight.js */ "./node_modules/lodash-es/_composeArgsRight.js"); +/* harmony import */ var _replaceHolders_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_replaceHolders.js */ "./node_modules/lodash-es/_replaceHolders.js"); + + + + +/** Used as the internal argument placeholder. */ +var PLACEHOLDER = '__lodash_placeholder__'; + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ +function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? Object(_composeArgs_js__WEBPACK_IMPORTED_MODULE_0__["default"])(partials, value, source[4]) : value; + data[4] = partials ? Object(_replaceHolders_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? Object(_composeArgsRight_js__WEBPACK_IMPORTED_MODULE_1__["default"])(partials, value, source[6]) : value; + data[6] = partials ? Object(_replaceHolders_js__WEBPACK_IMPORTED_MODULE_2__["default"])(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; +} + +/* harmony default export */ __webpack_exports__["default"] = (mergeData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_metaMap.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_metaMap.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _WeakMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_WeakMap.js */ "./node_modules/lodash-es/_WeakMap.js"); + + +/** Used to store function metadata. */ +var metaMap = _WeakMap_js__WEBPACK_IMPORTED_MODULE_0__["default"] && new _WeakMap_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (metaMap); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_nativeCreate.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_nativeCreate.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getNative_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getNative.js */ "./node_modules/lodash-es/_getNative.js"); + + +/* Built-in method references that are verified to be native. */ +var nativeCreate = Object(_getNative_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object, 'create'); + +/* harmony default export */ __webpack_exports__["default"] = (nativeCreate); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_nativeKeys.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_nativeKeys.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _overArg_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_overArg.js */ "./node_modules/lodash-es/_overArg.js"); + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeKeys = Object(_overArg_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object.keys, Object); + +/* harmony default export */ __webpack_exports__["default"] = (nativeKeys); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_nativeKeysIn.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_nativeKeysIn.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ +function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (nativeKeysIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_nodeUtil.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_nodeUtil.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony import */ var _freeGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_freeGlobal.js */ "./node_modules/lodash-es/_freeGlobal.js"); + + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && _freeGlobal_js__WEBPACK_IMPORTED_MODULE_0__["default"].process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} +}()); + +/* harmony default export */ __webpack_exports__["default"] = (nodeUtil); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }), + +/***/ "./node_modules/lodash-es/_objectToString.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_objectToString.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ +function objectToString(value) { + return nativeObjectToString.call(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (objectToString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_overArg.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_overArg.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (overArg); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_overRest.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_overRest.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _apply_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_apply.js */ "./node_modules/lodash-es/_apply.js"); + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ +function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return Object(_apply_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func, this, otherArgs); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (overRest); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_parent.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/_parent.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGet.js */ "./node_modules/lodash-es/_baseGet.js"); +/* harmony import */ var _baseSlice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseSlice.js */ "./node_modules/lodash-es/_baseSlice.js"); + + + +/** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ +function parent(object, path) { + return path.length < 2 ? object : Object(_baseGet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, Object(_baseSlice_js__WEBPACK_IMPORTED_MODULE_1__["default"])(path, 0, -1)); +} + +/* harmony default export */ __webpack_exports__["default"] = (parent); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_realNames.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/_realNames.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to lookup unminified function names. */ +var realNames = {}; + +/* harmony default export */ __webpack_exports__["default"] = (realNames); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_reorder.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_reorder.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _copyArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_copyArray.js */ "./node_modules/lodash-es/_copyArray.js"); +/* harmony import */ var _isIndex_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_isIndex.js */ "./node_modules/lodash-es/_isIndex.js"); + + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ +function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = Object(_copyArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array); + + while (length--) { + var index = indexes[length]; + array[length] = Object(_isIndex_js__WEBPACK_IMPORTED_MODULE_1__["default"])(index, arrLength) ? oldArray[index] : undefined; + } + return array; +} + +/* harmony default export */ __webpack_exports__["default"] = (reorder); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_replaceHolders.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_replaceHolders.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used as the internal argument placeholder. */ +var PLACEHOLDER = '__lodash_placeholder__'; + +/** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ +function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (replaceHolders); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_root.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/_root.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _freeGlobal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_freeGlobal.js */ "./node_modules/lodash-es/_freeGlobal.js"); + + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + +/** Used as a reference to the global object. */ +var root = _freeGlobal_js__WEBPACK_IMPORTED_MODULE_0__["default"] || freeSelf || Function('return this')(); + +/* harmony default export */ __webpack_exports__["default"] = (root); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_setCacheAdd.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_setCacheAdd.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to stand-in for `undefined` hash values. */ +var HASH_UNDEFINED = '__lodash_hash_undefined__'; + +/** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ +function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; +} + +/* harmony default export */ __webpack_exports__["default"] = (setCacheAdd); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_setCacheHas.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_setCacheHas.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ +function setCacheHas(value) { + return this.__data__.has(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (setCacheHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_setData.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/_setData.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSetData_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSetData.js */ "./node_modules/lodash-es/_baseSetData.js"); +/* harmony import */ var _shortOut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_shortOut.js */ "./node_modules/lodash-es/_shortOut.js"); + + + +/** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ +var setData = Object(_shortOut_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_baseSetData_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (setData); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_setToArray.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_setToArray.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ +function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (setToArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_setToString.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_setToString.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSetToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSetToString.js */ "./node_modules/lodash-es/_baseSetToString.js"); +/* harmony import */ var _shortOut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_shortOut.js */ "./node_modules/lodash-es/_shortOut.js"); + + + +/** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ +var setToString = Object(_shortOut_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_baseSetToString_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (setToString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_setWrapToString.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_setWrapToString.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _getWrapDetails_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_getWrapDetails.js */ "./node_modules/lodash-es/_getWrapDetails.js"); +/* harmony import */ var _insertWrapDetails_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_insertWrapDetails.js */ "./node_modules/lodash-es/_insertWrapDetails.js"); +/* harmony import */ var _setToString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_setToString.js */ "./node_modules/lodash-es/_setToString.js"); +/* harmony import */ var _updateWrapDetails_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_updateWrapDetails.js */ "./node_modules/lodash-es/_updateWrapDetails.js"); + + + + + +/** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ +function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return Object(_setToString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(wrapper, Object(_insertWrapDetails_js__WEBPACK_IMPORTED_MODULE_1__["default"])(source, Object(_updateWrapDetails_js__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_getWrapDetails_js__WEBPACK_IMPORTED_MODULE_0__["default"])(source), bitmask))); +} + +/* harmony default export */ __webpack_exports__["default"] = (setWrapToString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_shortOut.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_shortOut.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to detect hot functions by number of calls within a span of milliseconds. */ +var HOT_COUNT = 800, + HOT_SPAN = 16; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeNow = Date.now; + +/** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ +function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (shortOut); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stackClear.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_stackClear.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ListCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_ListCache.js */ "./node_modules/lodash-es/_ListCache.js"); + + +/** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ +function stackClear() { + this.__data__ = new _ListCache_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + this.size = 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (stackClear); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stackDelete.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_stackDelete.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ +function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (stackDelete); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stackGet.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_stackGet.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ +function stackGet(key) { + return this.__data__.get(key); +} + +/* harmony default export */ __webpack_exports__["default"] = (stackGet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stackHas.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_stackHas.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ +function stackHas(key) { + return this.__data__.has(key); +} + +/* harmony default export */ __webpack_exports__["default"] = (stackHas); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stackSet.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_stackSet.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ListCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_ListCache.js */ "./node_modules/lodash-es/_ListCache.js"); +/* harmony import */ var _Map_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_Map.js */ "./node_modules/lodash-es/_Map.js"); +/* harmony import */ var _MapCache_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_MapCache.js */ "./node_modules/lodash-es/_MapCache.js"); + + + + +/** Used as the size to enable large array optimizations. */ +var LARGE_ARRAY_SIZE = 200; + +/** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ +function stackSet(key, value) { + var data = this.__data__; + if (data instanceof _ListCache_js__WEBPACK_IMPORTED_MODULE_0__["default"]) { + var pairs = data.__data__; + if (!_Map_js__WEBPACK_IMPORTED_MODULE_1__["default"] || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new _MapCache_js__WEBPACK_IMPORTED_MODULE_2__["default"](pairs); + } + data.set(key, value); + this.size = data.size; + return this; +} + +/* harmony default export */ __webpack_exports__["default"] = (stackSet); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_strictIndexOf.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_strictIndexOf.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; +} + +/* harmony default export */ __webpack_exports__["default"] = (strictIndexOf); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stringSize.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/_stringSize.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _asciiSize_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_asciiSize.js */ "./node_modules/lodash-es/_asciiSize.js"); +/* harmony import */ var _hasUnicode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasUnicode.js */ "./node_modules/lodash-es/_hasUnicode.js"); +/* harmony import */ var _unicodeSize_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_unicodeSize.js */ "./node_modules/lodash-es/_unicodeSize.js"); + + + + +/** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ +function stringSize(string) { + return Object(_hasUnicode_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string) + ? Object(_unicodeSize_js__WEBPACK_IMPORTED_MODULE_2__["default"])(string) + : Object(_asciiSize_js__WEBPACK_IMPORTED_MODULE_0__["default"])(string); +} + +/* harmony default export */ __webpack_exports__["default"] = (stringSize); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stringToArray.js": +/*!**************************************************!*\ + !*** ./node_modules/lodash-es/_stringToArray.js ***! + \**************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _asciiToArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_asciiToArray.js */ "./node_modules/lodash-es/_asciiToArray.js"); +/* harmony import */ var _hasUnicode_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasUnicode.js */ "./node_modules/lodash-es/_hasUnicode.js"); +/* harmony import */ var _unicodeToArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_unicodeToArray.js */ "./node_modules/lodash-es/_unicodeToArray.js"); + + + + +/** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ +function stringToArray(string) { + return Object(_hasUnicode_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string) + ? Object(_unicodeToArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(string) + : Object(_asciiToArray_js__WEBPACK_IMPORTED_MODULE_0__["default"])(string); +} + +/* harmony default export */ __webpack_exports__["default"] = (stringToArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_stringToPath.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_stringToPath.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _memoizeCapped_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_memoizeCapped.js */ "./node_modules/lodash-es/_memoizeCapped.js"); + + +/** Used to match property names within property paths. */ +var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + +/** Used to match backslashes in property paths. */ +var reEscapeChar = /\\(\\)?/g; + +/** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ +var stringToPath = Object(_memoizeCapped_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; +}); + +/* harmony default export */ __webpack_exports__["default"] = (stringToPath); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_toKey.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/_toKey.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isSymbol.js */ "./node_modules/lodash-es/isSymbol.js"); + + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0; + +/** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ +function toKey(value) { + if (typeof value == 'string' || Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; +} + +/* harmony default export */ __webpack_exports__["default"] = (toKey); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_toSource.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/_toSource.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used for built-in method references. */ +var funcProto = Function.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ +function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; +} + +/* harmony default export */ __webpack_exports__["default"] = (toSource); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_trimmedEndIndex.js": +/*!****************************************************!*\ + !*** ./node_modules/lodash-es/_trimmedEndIndex.js ***! + \****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to match a single whitespace character. */ +var reWhitespace = /\s/; + +/** + * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace + * character of `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the index of the last non-whitespace character. + */ +function trimmedEndIndex(string) { + var index = string.length; + + while (index-- && reWhitespace.test(string.charAt(index))) {} + return index; +} + +/* harmony default export */ __webpack_exports__["default"] = (trimmedEndIndex); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_unicodeSize.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/_unicodeSize.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; + +/** Used to compose unicode capture groups. */ +var rsAstral = '[' + rsAstralRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsZWJ = '\\u200d'; + +/** Used to compose unicode regexes. */ +var reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + +/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ +var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + +/** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ +function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (unicodeSize); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_unicodeToArray.js": +/*!***************************************************!*\ + !*** ./node_modules/lodash-es/_unicodeToArray.js ***! + \***************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsVarRange = '\\ufe0e\\ufe0f'; + +/** Used to compose unicode capture groups. */ +var rsAstral = '[' + rsAstralRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsZWJ = '\\u200d'; + +/** Used to compose unicode regexes. */ +var reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + +/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ +var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + +/** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ +function unicodeToArray(string) { + return string.match(reUnicode) || []; +} + +/* harmony default export */ __webpack_exports__["default"] = (unicodeToArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_unicodeWords.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_unicodeWords.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used to compose unicode character classes. */ +var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + +/** Used to compose unicode capture groups. */ +var rsApos = "['\u2019]", + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + +/** Used to compose unicode regexes. */ +var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq; + +/** Used to match complex or compound words. */ +var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji +].join('|'), 'g'); + +/** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ +function unicodeWords(string) { + return string.match(reUnicodeWord) || []; +} + +/* harmony default export */ __webpack_exports__["default"] = (unicodeWords); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_updateWrapDetails.js": +/*!******************************************************!*\ + !*** ./node_modules/lodash-es/_updateWrapDetails.js ***! + \******************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayEach.js */ "./node_modules/lodash-es/_arrayEach.js"); +/* harmony import */ var _arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_arrayIncludes.js */ "./node_modules/lodash-es/_arrayIncludes.js"); + + + +/** Used to compose bitmasks for function metadata. */ +var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + +/** Used to associate wrap methods with their bit flags. */ +var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] +]; + +/** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ +function updateWrapDetails(details, bitmask) { + Object(_arrayEach_js__WEBPACK_IMPORTED_MODULE_0__["default"])(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !Object(_arrayIncludes_js__WEBPACK_IMPORTED_MODULE_1__["default"])(details, value)) { + details.push(value); + } + }); + return details.sort(); +} + +/* harmony default export */ __webpack_exports__["default"] = (updateWrapDetails); + + +/***/ }), + +/***/ "./node_modules/lodash-es/_wrapperClone.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/_wrapperClone.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _LazyWrapper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_LazyWrapper.js */ "./node_modules/lodash-es/_LazyWrapper.js"); +/* harmony import */ var _LodashWrapper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_LodashWrapper.js */ "./node_modules/lodash-es/_LodashWrapper.js"); +/* harmony import */ var _copyArray_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_copyArray.js */ "./node_modules/lodash-es/_copyArray.js"); + + + + +/** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ +function wrapperClone(wrapper) { + if (wrapper instanceof _LazyWrapper_js__WEBPACK_IMPORTED_MODULE_0__["default"]) { + return wrapper.clone(); + } + var result = new _LodashWrapper_js__WEBPACK_IMPORTED_MODULE_1__["default"](wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = Object(_copyArray_js__WEBPACK_IMPORTED_MODULE_2__["default"])(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (wrapperClone); + + +/***/ }), + +/***/ "./node_modules/lodash-es/clamp.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/clamp.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseClamp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseClamp.js */ "./node_modules/lodash-es/_baseClamp.js"); +/* harmony import */ var _toNumber_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toNumber.js */ "./node_modules/lodash-es/toNumber.js"); + + + +/** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ +function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = Object(_toNumber_js__WEBPACK_IMPORTED_MODULE_1__["default"])(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = Object(_toNumber_js__WEBPACK_IMPORTED_MODULE_1__["default"])(lower); + lower = lower === lower ? lower : 0; + } + return Object(_baseClamp_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_toNumber_js__WEBPACK_IMPORTED_MODULE_1__["default"])(number), lower, upper); +} + +/* harmony default export */ __webpack_exports__["default"] = (clamp); + + +/***/ }), + +/***/ "./node_modules/lodash-es/compact.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/compact.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ +function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (compact); + + +/***/ }), + +/***/ "./node_modules/lodash-es/constant.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/constant.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Creates a function that returns `value`. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {*} value The value to return from the new function. + * @returns {Function} Returns the new constant function. + * @example + * + * var objects = _.times(2, _.constant({ 'a': 1 })); + * + * console.log(objects); + * // => [{ 'a': 1 }, { 'a': 1 }] + * + * console.log(objects[0] === objects[1]); + * // => true + */ +function constant(value) { + return function() { + return value; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (constant); + + +/***/ }), + +/***/ "./node_modules/lodash-es/deburr.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/deburr.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _deburrLetter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_deburrLetter.js */ "./node_modules/lodash-es/_deburrLetter.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + + +/** Used to match Latin Unicode letters (excluding mathematical operators). */ +var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + +/** Used to compose unicode character classes. */ +var rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange; + +/** Used to compose unicode capture groups. */ +var rsCombo = '[' + rsComboRange + ']'; + +/** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ +var reComboMark = RegExp(rsCombo, 'g'); + +/** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ +function deburr(string) { + string = Object(_toString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string); + return string && string.replace(reLatin, _deburrLetter_js__WEBPACK_IMPORTED_MODULE_0__["default"]).replace(reComboMark, ''); +} + +/* harmony default export */ __webpack_exports__["default"] = (deburr); + + +/***/ }), + +/***/ "./node_modules/lodash-es/difference.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/difference.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseDifference_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseDifference.js */ "./node_modules/lodash-es/_baseDifference.js"); +/* harmony import */ var _baseFlatten_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseFlatten.js */ "./node_modules/lodash-es/_baseFlatten.js"); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); +/* harmony import */ var _isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArrayLikeObject.js */ "./node_modules/lodash-es/isArrayLikeObject.js"); + + + + + +/** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ +var difference = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function(array, values) { + return Object(_isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__["default"])(array) + ? Object(_baseDifference_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, Object(_baseFlatten_js__WEBPACK_IMPORTED_MODULE_1__["default"])(values, 1, _isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__["default"], true)) + : []; +}); + +/* harmony default export */ __webpack_exports__["default"] = (difference); + + +/***/ }), + +/***/ "./node_modules/lodash-es/dropRight.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/dropRight.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSlice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSlice.js */ "./node_modules/lodash-es/_baseSlice.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); + + + +/** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ +function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(n); + n = length - n; + return Object(_baseSlice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, 0, n < 0 ? 0 : n); +} + +/* harmony default export */ __webpack_exports__["default"] = (dropRight); + + +/***/ }), + +/***/ "./node_modules/lodash-es/each.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/each.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _forEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./forEach.js */ "./node_modules/lodash-es/forEach.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _forEach_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/lodash-es/eq.js": +/*!**************************************!*\ + !*** ./node_modules/lodash-es/eq.js ***! + \**************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ +function eq(value, other) { + return value === other || (value !== value && other !== other); +} + +/* harmony default export */ __webpack_exports__["default"] = (eq); + + +/***/ }), + +/***/ "./node_modules/lodash-es/escapeRegExp.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/escapeRegExp.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + +/** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ +var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + +/** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ +function escapeRegExp(string) { + string = Object(_toString_js__WEBPACK_IMPORTED_MODULE_0__["default"])(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; +} + +/* harmony default export */ __webpack_exports__["default"] = (escapeRegExp); + + +/***/ }), + +/***/ "./node_modules/lodash-es/every.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/every.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayEvery_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayEvery.js */ "./node_modules/lodash-es/_arrayEvery.js"); +/* harmony import */ var _baseEvery_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseEvery.js */ "./node_modules/lodash-es/_baseEvery.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isIterateeCall_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_isIterateeCall.js */ "./node_modules/lodash-es/_isIterateeCall.js"); + + + + + + +/** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ +function every(collection, predicate, guard) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? _arrayEvery_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseEvery_js__WEBPACK_IMPORTED_MODULE_1__["default"]; + if (guard && Object(_isIterateeCall_js__WEBPACK_IMPORTED_MODULE_4__["default"])(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__["default"])(predicate, 3)); +} + +/* harmony default export */ __webpack_exports__["default"] = (every); + + +/***/ }), + +/***/ "./node_modules/lodash-es/filter.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/filter.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayFilter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayFilter.js */ "./node_modules/lodash-es/_arrayFilter.js"); +/* harmony import */ var _baseFilter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseFilter.js */ "./node_modules/lodash-es/_baseFilter.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + + +/** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + * + * // Combining several predicates using `_.overEvery` or `_.overSome`. + * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]])); + * // => objects for ['fred', 'barney'] + */ +function filter(collection, predicate) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? _arrayFilter_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseFilter_js__WEBPACK_IMPORTED_MODULE_1__["default"]; + return func(collection, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__["default"])(predicate, 3)); +} + +/* harmony default export */ __webpack_exports__["default"] = (filter); + + +/***/ }), + +/***/ "./node_modules/lodash-es/find.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/find.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createFind_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createFind.js */ "./node_modules/lodash-es/_createFind.js"); +/* harmony import */ var _findIndex_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./findIndex.js */ "./node_modules/lodash-es/findIndex.js"); + + + +/** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ +var find = Object(_createFind_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_findIndex_js__WEBPACK_IMPORTED_MODULE_1__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (find); + + +/***/ }), + +/***/ "./node_modules/lodash-es/findIndex.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/findIndex.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseFindIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseFindIndex.js */ "./node_modules/lodash-es/_baseFindIndex.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); + + + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ +function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return Object(_baseFindIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__["default"])(predicate, 3), index); +} + +/* harmony default export */ __webpack_exports__["default"] = (findIndex); + + +/***/ }), + +/***/ "./node_modules/lodash-es/first.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/first.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _head_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./head.js */ "./node_modules/lodash-es/head.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _head_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/lodash-es/flatten.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/flatten.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseFlatten_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseFlatten.js */ "./node_modules/lodash-es/_baseFlatten.js"); + + +/** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ +function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? Object(_baseFlatten_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, 1) : []; +} + +/* harmony default export */ __webpack_exports__["default"] = (flatten); + + +/***/ }), + +/***/ "./node_modules/lodash-es/forEach.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/forEach.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayEach.js */ "./node_modules/lodash-es/_arrayEach.js"); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); +/* harmony import */ var _castFunction_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_castFunction.js */ "./node_modules/lodash-es/_castFunction.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + + +/** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ +function forEach(collection, iteratee) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? _arrayEach_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseEach_js__WEBPACK_IMPORTED_MODULE_1__["default"]; + return func(collection, Object(_castFunction_js__WEBPACK_IMPORTED_MODULE_2__["default"])(iteratee)); +} + +/* harmony default export */ __webpack_exports__["default"] = (forEach); + + +/***/ }), + +/***/ "./node_modules/lodash-es/get.js": +/*!***************************************!*\ + !*** ./node_modules/lodash-es/get.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGet.js */ "./node_modules/lodash-es/_baseGet.js"); + + +/** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ +function get(object, path, defaultValue) { + var result = object == null ? undefined : Object(_baseGet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, path); + return result === undefined ? defaultValue : result; +} + +/* harmony default export */ __webpack_exports__["default"] = (get); + + +/***/ }), + +/***/ "./node_modules/lodash-es/has.js": +/*!***************************************!*\ + !*** ./node_modules/lodash-es/has.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseHas_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseHas.js */ "./node_modules/lodash-es/_baseHas.js"); +/* harmony import */ var _hasPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasPath.js */ "./node_modules/lodash-es/_hasPath.js"); + + + +/** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ +function has(object, path) { + return object != null && Object(_hasPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, path, _baseHas_js__WEBPACK_IMPORTED_MODULE_0__["default"]); +} + +/* harmony default export */ __webpack_exports__["default"] = (has); + + +/***/ }), + +/***/ "./node_modules/lodash-es/hasIn.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/hasIn.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseHasIn_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseHasIn.js */ "./node_modules/lodash-es/_baseHasIn.js"); +/* harmony import */ var _hasPath_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasPath.js */ "./node_modules/lodash-es/_hasPath.js"); + + + +/** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ +function hasIn(object, path) { + return object != null && Object(_hasPath_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, path, _baseHasIn_js__WEBPACK_IMPORTED_MODULE_0__["default"]); +} + +/* harmony default export */ __webpack_exports__["default"] = (hasIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/head.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/head.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ +function head(array) { + return (array && array.length) ? array[0] : undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (head); + + +/***/ }), + +/***/ "./node_modules/lodash-es/identity.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/identity.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * This method returns the first argument it receives. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {*} value Any value. + * @returns {*} Returns `value`. + * @example + * + * var object = { 'a': 1 }; + * + * console.log(_.identity(object) === object); + * // => true + */ +function identity(value) { + return value; +} + +/* harmony default export */ __webpack_exports__["default"] = (identity); + + +/***/ }), + +/***/ "./node_modules/lodash-es/inRange.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/inRange.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseInRange_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseInRange.js */ "./node_modules/lodash-es/_baseInRange.js"); +/* harmony import */ var _toFinite_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toFinite.js */ "./node_modules/lodash-es/toFinite.js"); +/* harmony import */ var _toNumber_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toNumber.js */ "./node_modules/lodash-es/toNumber.js"); + + + + +/** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ +function inRange(number, start, end) { + start = Object(_toFinite_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = Object(_toFinite_js__WEBPACK_IMPORTED_MODULE_1__["default"])(end); + } + number = Object(_toNumber_js__WEBPACK_IMPORTED_MODULE_2__["default"])(number); + return Object(_baseInRange_js__WEBPACK_IMPORTED_MODULE_0__["default"])(number, start, end); +} + +/* harmony default export */ __webpack_exports__["default"] = (inRange); + + +/***/ }), + +/***/ "./node_modules/lodash-es/includes.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/includes.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIndexOf.js */ "./node_modules/lodash-es/_baseIndexOf.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); +/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isString.js */ "./node_modules/lodash-es/isString.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); +/* harmony import */ var _values_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./values.js */ "./node_modules/lodash-es/values.js"); + + + + + + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMax = Math.max; + +/** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ +function includes(collection, value, fromIndex, guard) { + collection = Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(collection) ? collection : Object(_values_js__WEBPACK_IMPORTED_MODULE_4__["default"])(collection); + fromIndex = (fromIndex && !guard) ? Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_3__["default"])(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return Object(_isString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && Object(_baseIndexOf_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection, value, fromIndex) > -1); +} + +/* harmony default export */ __webpack_exports__["default"] = (includes); + + +/***/ }), + +/***/ "./node_modules/lodash-es/intersection.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/intersection.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _baseIntersection_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIntersection.js */ "./node_modules/lodash-es/_baseIntersection.js"); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); +/* harmony import */ var _castArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_castArrayLikeObject.js */ "./node_modules/lodash-es/_castArrayLikeObject.js"); + + + + + +/** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ +var intersection = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function(arrays) { + var mapped = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arrays, _castArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__["default"]); + return (mapped.length && mapped[0] === arrays[0]) + ? Object(_baseIntersection_js__WEBPACK_IMPORTED_MODULE_1__["default"])(mapped) + : []; +}); + +/* harmony default export */ __webpack_exports__["default"] = (intersection); + + +/***/ }), + +/***/ "./node_modules/lodash-es/invert.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/invert.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant.js */ "./node_modules/lodash-es/constant.js"); +/* harmony import */ var _createInverter_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createInverter.js */ "./node_modules/lodash-es/_createInverter.js"); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); + + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ +var nativeObjectToString = objectProto.toString; + +/** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ +var invert = Object(_createInverter_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; +}, Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_identity_js__WEBPACK_IMPORTED_MODULE_2__["default"])); + +/* harmony default export */ __webpack_exports__["default"] = (invert); + + +/***/ }), + +/***/ "./node_modules/lodash-es/invoke.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/invoke.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseInvoke_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseInvoke.js */ "./node_modules/lodash-es/_baseInvoke.js"); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); + + + +/** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ +var invoke = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_baseInvoke_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + +/* harmony default export */ __webpack_exports__["default"] = (invoke); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isArguments.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/isArguments.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsArguments_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsArguments.js */ "./node_modules/lodash-es/_baseIsArguments.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Built-in value references. */ +var propertyIsEnumerable = objectProto.propertyIsEnumerable; + +/** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ +var isArguments = Object(_baseIsArguments_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function() { return arguments; }()) ? _baseIsArguments_js__WEBPACK_IMPORTED_MODULE_0__["default"] : function(value) { + return Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); +}; + +/* harmony default export */ __webpack_exports__["default"] = (isArguments); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isArray.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/isArray.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ +var isArray = Array.isArray; + +/* harmony default export */ __webpack_exports__["default"] = (isArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isArrayLike.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/isArrayLike.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isFunction.js */ "./node_modules/lodash-es/isFunction.js"); +/* harmony import */ var _isLength_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isLength.js */ "./node_modules/lodash-es/isLength.js"); + + + +/** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ +function isArrayLike(value) { + return value != null && Object(_isLength_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value.length) && !Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (isArrayLike); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isArrayLikeObject.js": +/*!*****************************************************!*\ + !*** ./node_modules/lodash-es/isArrayLikeObject.js ***! + \*****************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ +function isArrayLikeObject(value) { + return Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (isArrayLikeObject); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isBoolean.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/isBoolean.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** `Object#toString` result references. */ +var boolTag = '[object Boolean]'; + +/** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ +function isBoolean(value) { + return value === true || value === false || + (Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) == boolTag); +} + +/* harmony default export */ __webpack_exports__["default"] = (isBoolean); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isBuffer.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/isBuffer.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_root.js */ "./node_modules/lodash-es/_root.js"); +/* harmony import */ var _stubFalse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stubFalse.js */ "./node_modules/lodash-es/stubFalse.js"); + + + +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Built-in value references. */ +var Buffer = moduleExports ? _root_js__WEBPACK_IMPORTED_MODULE_0__["default"].Buffer : undefined; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined; + +/** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ +var isBuffer = nativeIsBuffer || _stubFalse_js__WEBPACK_IMPORTED_MODULE_1__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (isBuffer); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }), + +/***/ "./node_modules/lodash-es/isEmpty.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/isEmpty.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseKeys.js */ "./node_modules/lodash-es/_baseKeys.js"); +/* harmony import */ var _getTag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getTag.js */ "./node_modules/lodash-es/_getTag.js"); +/* harmony import */ var _isArguments_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArguments.js */ "./node_modules/lodash-es/isArguments.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); +/* harmony import */ var _isBuffer_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isBuffer.js */ "./node_modules/lodash-es/isBuffer.js"); +/* harmony import */ var _isPrototype_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./_isPrototype.js */ "./node_modules/lodash-es/_isPrototype.js"); +/* harmony import */ var _isTypedArray_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./isTypedArray.js */ "./node_modules/lodash-es/isTypedArray.js"); + + + + + + + + + +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + setTag = '[object Set]'; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ +function isEmpty(value) { + if (value == null) { + return true; + } + if (Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_4__["default"])(value) && + (Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value) || typeof value == 'string' || typeof value.splice == 'function' || + Object(_isBuffer_js__WEBPACK_IMPORTED_MODULE_5__["default"])(value) || Object(_isTypedArray_js__WEBPACK_IMPORTED_MODULE_7__["default"])(value) || Object(_isArguments_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value))) { + return !value.length; + } + var tag = Object(_getTag_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (Object(_isPrototype_js__WEBPACK_IMPORTED_MODULE_6__["default"])(value)) { + return !Object(_baseKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; +} + +/* harmony default export */ __webpack_exports__["default"] = (isEmpty); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isEqual.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/isEqual.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsEqual_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsEqual.js */ "./node_modules/lodash-es/_baseIsEqual.js"); + + +/** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ +function isEqual(value, other) { + return Object(_baseIsEqual_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value, other); +} + +/* harmony default export */ __webpack_exports__["default"] = (isEqual); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isFunction.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/isFunction.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); + + + +/** `Object#toString` result references. */ +var asyncTag = '[object AsyncFunction]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + proxyTag = '[object Proxy]'; + +/** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ +function isFunction(value) { + if (!Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; +} + +/* harmony default export */ __webpack_exports__["default"] = (isFunction); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isLength.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/isLength.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ +function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; +} + +/* harmony default export */ __webpack_exports__["default"] = (isLength); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isNil.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/isNil.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ +function isNil(value) { + return value == null; +} + +/* harmony default export */ __webpack_exports__["default"] = (isNil); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isNumber.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/isNumber.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** `Object#toString` result references. */ +var numberTag = '[object Number]'; + +/** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ +function isNumber(value) { + return typeof value == 'number' || + (Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) == numberTag); +} + +/* harmony default export */ __webpack_exports__["default"] = (isNumber); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isObject.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/isObject.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ +function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); +} + +/* harmony default export */ __webpack_exports__["default"] = (isObject); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isObjectLike.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/isObjectLike.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ +function isObjectLike(value) { + return value != null && typeof value == 'object'; +} + +/* harmony default export */ __webpack_exports__["default"] = (isObjectLike); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isPlainObject.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/isPlainObject.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _getPrototype_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getPrototype.js */ "./node_modules/lodash-es/_getPrototype.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + + +/** `Object#toString` result references. */ +var objectTag = '[object Object]'; + +/** Used for built-in method references. */ +var funcProto = Function.prototype, + objectProto = Object.prototype; + +/** Used to resolve the decompiled source of functions. */ +var funcToString = funcProto.toString; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** Used to infer the `Object` constructor. */ +var objectCtorString = funcToString.call(Object); + +/** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ +function isPlainObject(value) { + if (!Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value) || Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) != objectTag) { + return false; + } + var proto = Object(_getPrototype_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; +} + +/* harmony default export */ __webpack_exports__["default"] = (isPlainObject); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isString.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/isString.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + + +/** `Object#toString` result references. */ +var stringTag = '[object String]'; + +/** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ +function isString(value) { + return typeof value == 'string' || + (!Object(_isArray_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value) && Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) == stringTag); +} + +/* harmony default export */ __webpack_exports__["default"] = (isString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isSymbol.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/isSymbol.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseGetTag.js */ "./node_modules/lodash-es/_baseGetTag.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); + + + +/** `Object#toString` result references. */ +var symbolTag = '[object Symbol]'; + +/** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ +function isSymbol(value) { + return typeof value == 'symbol' || + (Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value) && Object(_baseGetTag_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) == symbolTag); +} + +/* harmony default export */ __webpack_exports__["default"] = (isSymbol); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isTypedArray.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/isTypedArray.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseIsTypedArray_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseIsTypedArray.js */ "./node_modules/lodash-es/_baseIsTypedArray.js"); +/* harmony import */ var _baseUnary_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseUnary.js */ "./node_modules/lodash-es/_baseUnary.js"); +/* harmony import */ var _nodeUtil_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_nodeUtil.js */ "./node_modules/lodash-es/_nodeUtil.js"); + + + + +/* Node.js helper references. */ +var nodeIsTypedArray = _nodeUtil_js__WEBPACK_IMPORTED_MODULE_2__["default"] && _nodeUtil_js__WEBPACK_IMPORTED_MODULE_2__["default"].isTypedArray; + +/** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ +var isTypedArray = nodeIsTypedArray ? Object(_baseUnary_js__WEBPACK_IMPORTED_MODULE_1__["default"])(nodeIsTypedArray) : _baseIsTypedArray_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (isTypedArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/isUndefined.js": +/*!***********************************************!*\ + !*** ./node_modules/lodash-es/isUndefined.js ***! + \***********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ +function isUndefined(value) { + return value === undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (isUndefined); + + +/***/ }), + +/***/ "./node_modules/lodash-es/keyBy.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/keyBy.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseAssignValue_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseAssignValue.js */ "./node_modules/lodash-es/_baseAssignValue.js"); +/* harmony import */ var _createAggregator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createAggregator.js */ "./node_modules/lodash-es/_createAggregator.js"); + + + +/** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ +var keyBy = Object(_createAggregator_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function(result, value, key) { + Object(_baseAssignValue_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result, key, value); +}); + +/* harmony default export */ __webpack_exports__["default"] = (keyBy); + + +/***/ }), + +/***/ "./node_modules/lodash-es/keys.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/keys.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayLikeKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayLikeKeys.js */ "./node_modules/lodash-es/_arrayLikeKeys.js"); +/* harmony import */ var _baseKeys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseKeys.js */ "./node_modules/lodash-es/_baseKeys.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); + + + + +/** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ +function keys(object) { + return Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object) ? Object(_arrayLikeKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object) : Object(_baseKeys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object); +} + +/* harmony default export */ __webpack_exports__["default"] = (keys); + + +/***/ }), + +/***/ "./node_modules/lodash-es/keysIn.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/keysIn.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayLikeKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayLikeKeys.js */ "./node_modules/lodash-es/_arrayLikeKeys.js"); +/* harmony import */ var _baseKeysIn_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseKeysIn.js */ "./node_modules/lodash-es/_baseKeysIn.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); + + + + +/** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ +function keysIn(object) { + return Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object) ? Object(_arrayLikeKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, true) : Object(_baseKeysIn_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object); +} + +/* harmony default export */ __webpack_exports__["default"] = (keysIn); + + +/***/ }), + +/***/ "./node_modules/lodash-es/last.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/last.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ +function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (last); + + +/***/ }), + +/***/ "./node_modules/lodash-es/map.js": +/*!***************************************!*\ + !*** ./node_modules/lodash-es/map.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _baseMap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseMap.js */ "./node_modules/lodash-es/_baseMap.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + + +/** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ +function map(collection, iteratee) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? _arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseMap_js__WEBPACK_IMPORTED_MODULE_2__["default"]; + return func(collection, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__["default"])(iteratee, 3)); +} + +/* harmony default export */ __webpack_exports__["default"] = (map); + + +/***/ }), + +/***/ "./node_modules/lodash-es/mapValues.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/mapValues.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseAssignValue_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseAssignValue.js */ "./node_modules/lodash-es/_baseAssignValue.js"); +/* harmony import */ var _baseForOwn_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseForOwn.js */ "./node_modules/lodash-es/_baseForOwn.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); + + + + +/** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ +function mapValues(object, iteratee) { + var result = {}; + iteratee = Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__["default"])(iteratee, 3); + + Object(_baseForOwn_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, function(value, key, object) { + Object(_baseAssignValue_js__WEBPACK_IMPORTED_MODULE_0__["default"])(result, key, iteratee(value, key, object)); + }); + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (mapValues); + + +/***/ }), + +/***/ "./node_modules/lodash-es/memoize.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/memoize.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _MapCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_MapCache.js */ "./node_modules/lodash-es/_MapCache.js"); + + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ +function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || _MapCache_js__WEBPACK_IMPORTED_MODULE_0__["default"]); + return memoized; +} + +// Expose `MapCache`. +memoize.Cache = _MapCache_js__WEBPACK_IMPORTED_MODULE_0__["default"]; + +/* harmony default export */ __webpack_exports__["default"] = (memoize); + + +/***/ }), + +/***/ "./node_modules/lodash-es/min.js": +/*!***************************************!*\ + !*** ./node_modules/lodash-es/min.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseExtremum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseExtremum.js */ "./node_modules/lodash-es/_baseExtremum.js"); +/* harmony import */ var _baseLt_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseLt.js */ "./node_modules/lodash-es/_baseLt.js"); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); + + + + +/** + * Computes the minimum value of `array`. If `array` is empty or falsey, + * `undefined` is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Math + * @param {Array} array The array to iterate over. + * @returns {*} Returns the minimum value. + * @example + * + * _.min([4, 2, 8, 6]); + * // => 2 + * + * _.min([]); + * // => undefined + */ +function min(array) { + return (array && array.length) + ? Object(_baseExtremum_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, _identity_js__WEBPACK_IMPORTED_MODULE_2__["default"], _baseLt_js__WEBPACK_IMPORTED_MODULE_1__["default"]) + : undefined; +} + +/* harmony default export */ __webpack_exports__["default"] = (min); + + +/***/ }), + +/***/ "./node_modules/lodash-es/noop.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/noop.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * This method returns `undefined`. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Util + * @example + * + * _.times(2, _.noop); + * // => [undefined, undefined] + */ +function noop() { + // No operation performed. +} + +/* harmony default export */ __webpack_exports__["default"] = (noop); + + +/***/ }), + +/***/ "./node_modules/lodash-es/partialRight.js": +/*!************************************************!*\ + !*** ./node_modules/lodash-es/partialRight.js ***! + \************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); +/* harmony import */ var _createWrap_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_createWrap.js */ "./node_modules/lodash-es/_createWrap.js"); +/* harmony import */ var _getHolder_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_getHolder.js */ "./node_modules/lodash-es/_getHolder.js"); +/* harmony import */ var _replaceHolders_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_replaceHolders.js */ "./node_modules/lodash-es/_replaceHolders.js"); + + + + + +/** Used to compose bitmasks for function metadata. */ +var WRAP_PARTIAL_RIGHT_FLAG = 64; + +/** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ +var partialRight = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(func, partials) { + var holders = Object(_replaceHolders_js__WEBPACK_IMPORTED_MODULE_3__["default"])(partials, Object(_getHolder_js__WEBPACK_IMPORTED_MODULE_2__["default"])(partialRight)); + return Object(_createWrap_js__WEBPACK_IMPORTED_MODULE_1__["default"])(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); +}); + +// Assign default placeholders. +partialRight.placeholder = {}; + +/* harmony default export */ __webpack_exports__["default"] = (partialRight); + + +/***/ }), + +/***/ "./node_modules/lodash-es/pick.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/pick.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _basePick_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_basePick.js */ "./node_modules/lodash-es/_basePick.js"); +/* harmony import */ var _flatRest_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_flatRest.js */ "./node_modules/lodash-es/_flatRest.js"); + + + +/** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ +var pick = Object(_flatRest_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function(object, paths) { + return object == null ? {} : Object(_basePick_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, paths); +}); + +/* harmony default export */ __webpack_exports__["default"] = (pick); + + +/***/ }), + +/***/ "./node_modules/lodash-es/pickBy.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/pickBy.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayMap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayMap.js */ "./node_modules/lodash-es/_arrayMap.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _basePickBy_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_basePickBy.js */ "./node_modules/lodash-es/_basePickBy.js"); +/* harmony import */ var _getAllKeysIn_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_getAllKeysIn.js */ "./node_modules/lodash-es/_getAllKeysIn.js"); + + + + + +/** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ +function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = Object(_arrayMap_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_getAllKeysIn_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object), function(prop) { + return [prop]; + }); + predicate = Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__["default"])(predicate); + return Object(_basePickBy_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object, props, function(value, path) { + return predicate(value, path[0]); + }); +} + +/* harmony default export */ __webpack_exports__["default"] = (pickBy); + + +/***/ }), + +/***/ "./node_modules/lodash-es/property.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/property.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseProperty_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseProperty.js */ "./node_modules/lodash-es/_baseProperty.js"); +/* harmony import */ var _basePropertyDeep_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_basePropertyDeep.js */ "./node_modules/lodash-es/_basePropertyDeep.js"); +/* harmony import */ var _isKey_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_isKey.js */ "./node_modules/lodash-es/_isKey.js"); +/* harmony import */ var _toKey_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_toKey.js */ "./node_modules/lodash-es/_toKey.js"); + + + + + +/** + * Creates a function that returns the value at `path` of a given object. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Util + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + * @example + * + * var objects = [ + * { 'a': { 'b': 2 } }, + * { 'a': { 'b': 1 } } + * ]; + * + * _.map(objects, _.property('a.b')); + * // => [2, 1] + * + * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); + * // => [1, 2] + */ +function property(path) { + return Object(_isKey_js__WEBPACK_IMPORTED_MODULE_2__["default"])(path) ? Object(_baseProperty_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_toKey_js__WEBPACK_IMPORTED_MODULE_3__["default"])(path)) : Object(_basePropertyDeep_js__WEBPACK_IMPORTED_MODULE_1__["default"])(path); +} + +/* harmony default export */ __webpack_exports__["default"] = (property); + + +/***/ }), + +/***/ "./node_modules/lodash-es/range.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/range.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createRange_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createRange.js */ "./node_modules/lodash-es/_createRange.js"); + + +/** + * Creates an array of numbers (positive and/or negative) progressing from + * `start` up to, but not including, `end`. A step of `-1` is used if a negative + * `start` is specified without an `end` or `step`. If `end` is not specified, + * it's set to `start` with `start` then set to `0`. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @param {number} [step=1] The value to increment or decrement by. + * @returns {Array} Returns the range of numbers. + * @see _.inRange, _.rangeRight + * @example + * + * _.range(4); + * // => [0, 1, 2, 3] + * + * _.range(-4); + * // => [0, -1, -2, -3] + * + * _.range(1, 5); + * // => [1, 2, 3, 4] + * + * _.range(0, 20, 5); + * // => [0, 5, 10, 15] + * + * _.range(0, -4, -1); + * // => [0, -1, -2, -3] + * + * _.range(1, 4, 0); + * // => [1, 1, 1] + * + * _.range(0); + * // => [] + */ +var range = Object(_createRange_js__WEBPACK_IMPORTED_MODULE_0__["default"])(); + +/* harmony default export */ __webpack_exports__["default"] = (range); + + +/***/ }), + +/***/ "./node_modules/lodash-es/reduce.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/reduce.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayReduce.js */ "./node_modules/lodash-es/_arrayReduce.js"); +/* harmony import */ var _baseEach_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseEach.js */ "./node_modules/lodash-es/_baseEach.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _baseReduce_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_baseReduce.js */ "./node_modules/lodash-es/_baseReduce.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); + + + + + + +/** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ +function reduce(collection, iteratee, accumulator) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_4__["default"])(collection) ? _arrayReduce_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseReduce_js__WEBPACK_IMPORTED_MODULE_3__["default"], + initAccum = arguments.length < 3; + + return func(collection, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_2__["default"])(iteratee, 4), accumulator, initAccum, _baseEach_js__WEBPACK_IMPORTED_MODULE_1__["default"]); +} + +/* harmony default export */ __webpack_exports__["default"] = (reduce); + + +/***/ }), + +/***/ "./node_modules/lodash-es/round.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/round.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createRound_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createRound.js */ "./node_modules/lodash-es/_createRound.js"); + + +/** + * Computes `number` rounded to `precision`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Math + * @param {number} number The number to round. + * @param {number} [precision=0] The precision to round to. + * @returns {number} Returns the rounded number. + * @example + * + * _.round(4.006); + * // => 4 + * + * _.round(4.006, 2); + * // => 4.01 + * + * _.round(4060, -2); + * // => 4100 + */ +var round = Object(_createRound_js__WEBPACK_IMPORTED_MODULE_0__["default"])('round'); + +/* harmony default export */ __webpack_exports__["default"] = (round); + + +/***/ }), + +/***/ "./node_modules/lodash-es/set.js": +/*!***************************************!*\ + !*** ./node_modules/lodash-es/set.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSet_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSet.js */ "./node_modules/lodash-es/_baseSet.js"); + + +/** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ +function set(object, path, value) { + return object == null ? object : Object(_baseSet_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, path, value); +} + +/* harmony default export */ __webpack_exports__["default"] = (set); + + +/***/ }), + +/***/ "./node_modules/lodash-es/size.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/size.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseKeys_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseKeys.js */ "./node_modules/lodash-es/_baseKeys.js"); +/* harmony import */ var _getTag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_getTag.js */ "./node_modules/lodash-es/_getTag.js"); +/* harmony import */ var _isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArrayLike.js */ "./node_modules/lodash-es/isArrayLike.js"); +/* harmony import */ var _isString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isString.js */ "./node_modules/lodash-es/isString.js"); +/* harmony import */ var _stringSize_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_stringSize.js */ "./node_modules/lodash-es/_stringSize.js"); + + + + + + +/** `Object#toString` result references. */ +var mapTag = '[object Map]', + setTag = '[object Set]'; + +/** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ +function size(collection) { + if (collection == null) { + return 0; + } + if (Object(_isArrayLike_js__WEBPACK_IMPORTED_MODULE_2__["default"])(collection)) { + return Object(_isString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? Object(_stringSize_js__WEBPACK_IMPORTED_MODULE_4__["default"])(collection) : collection.length; + } + var tag = Object(_getTag_js__WEBPACK_IMPORTED_MODULE_1__["default"])(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return Object(_baseKeys_js__WEBPACK_IMPORTED_MODULE_0__["default"])(collection).length; +} + +/* harmony default export */ __webpack_exports__["default"] = (size); + + +/***/ }), + +/***/ "./node_modules/lodash-es/some.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/some.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arraySome_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arraySome.js */ "./node_modules/lodash-es/_arraySome.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _baseSome_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseSome.js */ "./node_modules/lodash-es/_baseSome.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isIterateeCall_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_isIterateeCall.js */ "./node_modules/lodash-es/_isIterateeCall.js"); + + + + + + +/** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ +function some(collection, predicate, guard) { + var func = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection) ? _arraySome_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseSome_js__WEBPACK_IMPORTED_MODULE_2__["default"]; + if (guard && Object(_isIterateeCall_js__WEBPACK_IMPORTED_MODULE_4__["default"])(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_1__["default"])(predicate, 3)); +} + +/* harmony default export */ __webpack_exports__["default"] = (some); + + +/***/ }), + +/***/ "./node_modules/lodash-es/sortBy.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/sortBy.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseFlatten_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseFlatten.js */ "./node_modules/lodash-es/_baseFlatten.js"); +/* harmony import */ var _baseOrderBy_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseOrderBy.js */ "./node_modules/lodash-es/_baseOrderBy.js"); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); +/* harmony import */ var _isIterateeCall_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_isIterateeCall.js */ "./node_modules/lodash-es/_isIterateeCall.js"); + + + + + +/** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 30 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]] + */ +var sortBy = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_2__["default"])(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && Object(_isIterateeCall_js__WEBPACK_IMPORTED_MODULE_3__["default"])(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && Object(_isIterateeCall_js__WEBPACK_IMPORTED_MODULE_3__["default"])(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return Object(_baseOrderBy_js__WEBPACK_IMPORTED_MODULE_1__["default"])(collection, Object(_baseFlatten_js__WEBPACK_IMPORTED_MODULE_0__["default"])(iteratees, 1), []); +}); + +/* harmony default export */ __webpack_exports__["default"] = (sortBy); + + +/***/ }), + +/***/ "./node_modules/lodash-es/startCase.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/startCase.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createCompounder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createCompounder.js */ "./node_modules/lodash-es/_createCompounder.js"); +/* harmony import */ var _upperFirst_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./upperFirst.js */ "./node_modules/lodash-es/upperFirst.js"); + + + +/** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ +var startCase = Object(_createCompounder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(result, word, index) { + return result + (index ? ' ' : '') + Object(_upperFirst_js__WEBPACK_IMPORTED_MODULE_1__["default"])(word); +}); + +/* harmony default export */ __webpack_exports__["default"] = (startCase); + + +/***/ }), + +/***/ "./node_modules/lodash-es/startsWith.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/startsWith.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseClamp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseClamp.js */ "./node_modules/lodash-es/_baseClamp.js"); +/* harmony import */ var _baseToString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseToString.js */ "./node_modules/lodash-es/_baseToString.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + + + + +/** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ +function startsWith(string, target, position) { + string = Object(_toString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(string); + position = position == null + ? 0 + : Object(_baseClamp_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(position), 0, string.length); + + target = Object(_baseToString_js__WEBPACK_IMPORTED_MODULE_1__["default"])(target); + return string.slice(position, position + target.length) == target; +} + +/* harmony default export */ __webpack_exports__["default"] = (startsWith); + + +/***/ }), + +/***/ "./node_modules/lodash-es/stubArray.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/stubArray.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * This method returns a new empty array. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {Array} Returns the new empty array. + * @example + * + * var arrays = _.times(2, _.stubArray); + * + * console.log(arrays); + * // => [[], []] + * + * console.log(arrays[0] === arrays[1]); + * // => false + */ +function stubArray() { + return []; +} + +/* harmony default export */ __webpack_exports__["default"] = (stubArray); + + +/***/ }), + +/***/ "./node_modules/lodash-es/stubFalse.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/stubFalse.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * This method returns `false`. + * + * @static + * @memberOf _ + * @since 4.13.0 + * @category Util + * @returns {boolean} Returns `false`. + * @example + * + * _.times(2, _.stubFalse); + * // => [false, false] + */ +function stubFalse() { + return false; +} + +/* harmony default export */ __webpack_exports__["default"] = (stubFalse); + + +/***/ }), + +/***/ "./node_modules/lodash-es/sum.js": +/*!***************************************!*\ + !*** ./node_modules/lodash-es/sum.js ***! + \***************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSum.js */ "./node_modules/lodash-es/_baseSum.js"); +/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./identity.js */ "./node_modules/lodash-es/identity.js"); + + + +/** + * Computes the sum of the values in `array`. + * + * @static + * @memberOf _ + * @since 3.4.0 + * @category Math + * @param {Array} array The array to iterate over. + * @returns {number} Returns the sum. + * @example + * + * _.sum([4, 2, 8, 6]); + * // => 20 + */ +function sum(array) { + return (array && array.length) + ? Object(_baseSum_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]) + : 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (sum); + + +/***/ }), + +/***/ "./node_modules/lodash-es/take.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/take.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseSlice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseSlice.js */ "./node_modules/lodash-es/_baseSlice.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); + + + +/** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ +function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_1__["default"])(n); + return Object(_baseSlice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, 0, n < 0 ? 0 : n); +} + +/* harmony default export */ __webpack_exports__["default"] = (take); + + +/***/ }), + +/***/ "./node_modules/lodash-es/times.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/times.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseTimes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseTimes.js */ "./node_modules/lodash-es/_baseTimes.js"); +/* harmony import */ var _castFunction_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_castFunction.js */ "./node_modules/lodash-es/_castFunction.js"); +/* harmony import */ var _toInteger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toInteger.js */ "./node_modules/lodash-es/toInteger.js"); + + + + +/** Used as references for various `Number` constants. */ +var MAX_SAFE_INTEGER = 9007199254740991; + +/** Used as references for the maximum length and index of an array. */ +var MAX_ARRAY_LENGTH = 4294967295; + +/* Built-in method references for those with the same name as other `lodash` methods. */ +var nativeMin = Math.min; + +/** + * Invokes the iteratee `n` times, returning an array of the results of + * each invocation. The iteratee is invoked with one argument; (index). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Util + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of results. + * @example + * + * _.times(3, String); + * // => ['0', '1', '2'] + * + * _.times(4, _.constant(0)); + * // => [0, 0, 0, 0] + */ +function times(n, iteratee) { + n = Object(_toInteger_js__WEBPACK_IMPORTED_MODULE_2__["default"])(n); + if (n < 1 || n > MAX_SAFE_INTEGER) { + return []; + } + var index = MAX_ARRAY_LENGTH, + length = nativeMin(n, MAX_ARRAY_LENGTH); + + iteratee = Object(_castFunction_js__WEBPACK_IMPORTED_MODULE_1__["default"])(iteratee); + n -= MAX_ARRAY_LENGTH; + + var result = Object(_baseTimes_js__WEBPACK_IMPORTED_MODULE_0__["default"])(length, iteratee); + while (++index < n) { + iteratee(index); + } + return result; +} + +/* harmony default export */ __webpack_exports__["default"] = (times); + + +/***/ }), + +/***/ "./node_modules/lodash-es/toFinite.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/toFinite.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _toNumber_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toNumber.js */ "./node_modules/lodash-es/toNumber.js"); + + +/** Used as references for various `Number` constants. */ +var INFINITY = 1 / 0, + MAX_INTEGER = 1.7976931348623157e+308; + +/** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ +function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = Object(_toNumber_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (toFinite); + + +/***/ }), + +/***/ "./node_modules/lodash-es/toInteger.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/toInteger.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _toFinite_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./toFinite.js */ "./node_modules/lodash-es/toFinite.js"); + + +/** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ +function toInteger(value) { + var result = Object(_toFinite_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; +} + +/* harmony default export */ __webpack_exports__["default"] = (toInteger); + + +/***/ }), + +/***/ "./node_modules/lodash-es/toNumber.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/toNumber.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseTrim_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseTrim.js */ "./node_modules/lodash-es/_baseTrim.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); +/* harmony import */ var _isSymbol_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isSymbol.js */ "./node_modules/lodash-es/isSymbol.js"); + + + + +/** Used as references for various `Number` constants. */ +var NAN = 0 / 0; + +/** Used to detect bad signed hexadecimal string values. */ +var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + +/** Used to detect binary string values. */ +var reIsBinary = /^0b[01]+$/i; + +/** Used to detect octal string values. */ +var reIsOctal = /^0o[0-7]+$/i; + +/** Built-in method references without a dependency on `root`. */ +var freeParseInt = parseInt; + +/** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ +function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (Object(_isSymbol_js__WEBPACK_IMPORTED_MODULE_2__["default"])(value)) { + return NAN; + } + if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = Object(_baseTrim_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); +} + +/* harmony default export */ __webpack_exports__["default"] = (toNumber); + + +/***/ }), + +/***/ "./node_modules/lodash-es/toString.js": +/*!********************************************!*\ + !*** ./node_modules/lodash-es/toString.js ***! + \********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseToString.js */ "./node_modules/lodash-es/_baseToString.js"); + + +/** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ +function toString(value) { + return value == null ? '' : Object(_baseToString_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value); +} + +/* harmony default export */ __webpack_exports__["default"] = (toString); + + +/***/ }), + +/***/ "./node_modules/lodash-es/transform.js": +/*!*********************************************!*\ + !*** ./node_modules/lodash-es/transform.js ***! + \*********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _arrayEach_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_arrayEach.js */ "./node_modules/lodash-es/_arrayEach.js"); +/* harmony import */ var _baseCreate_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseCreate.js */ "./node_modules/lodash-es/_baseCreate.js"); +/* harmony import */ var _baseForOwn_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseForOwn.js */ "./node_modules/lodash-es/_baseForOwn.js"); +/* harmony import */ var _baseIteratee_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_baseIteratee.js */ "./node_modules/lodash-es/_baseIteratee.js"); +/* harmony import */ var _getPrototype_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_getPrototype.js */ "./node_modules/lodash-es/_getPrototype.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isBuffer_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./isBuffer.js */ "./node_modules/lodash-es/isBuffer.js"); +/* harmony import */ var _isFunction_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./isFunction.js */ "./node_modules/lodash-es/isFunction.js"); +/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./isObject.js */ "./node_modules/lodash-es/isObject.js"); +/* harmony import */ var _isTypedArray_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./isTypedArray.js */ "./node_modules/lodash-es/isTypedArray.js"); + + + + + + + + + + + +/** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ +function transform(object, iteratee, accumulator) { + var isArr = Object(_isArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(object), + isArrLike = isArr || Object(_isBuffer_js__WEBPACK_IMPORTED_MODULE_6__["default"])(object) || Object(_isTypedArray_js__WEBPACK_IMPORTED_MODULE_9__["default"])(object); + + iteratee = Object(_baseIteratee_js__WEBPACK_IMPORTED_MODULE_3__["default"])(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_8__["default"])(object)) { + accumulator = Object(_isFunction_js__WEBPACK_IMPORTED_MODULE_7__["default"])(Ctor) ? Object(_baseCreate_js__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_getPrototype_js__WEBPACK_IMPORTED_MODULE_4__["default"])(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? _arrayEach_js__WEBPACK_IMPORTED_MODULE_0__["default"] : _baseForOwn_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; +} + +/* harmony default export */ __webpack_exports__["default"] = (transform); + + +/***/ }), + +/***/ "./node_modules/lodash-es/trim.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/trim.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseToString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseToString.js */ "./node_modules/lodash-es/_baseToString.js"); +/* harmony import */ var _baseTrim_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseTrim.js */ "./node_modules/lodash-es/_baseTrim.js"); +/* harmony import */ var _castSlice_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_castSlice.js */ "./node_modules/lodash-es/_castSlice.js"); +/* harmony import */ var _charsEndIndex_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_charsEndIndex.js */ "./node_modules/lodash-es/_charsEndIndex.js"); +/* harmony import */ var _charsStartIndex_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./_charsStartIndex.js */ "./node_modules/lodash-es/_charsStartIndex.js"); +/* harmony import */ var _stringToArray_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_stringToArray.js */ "./node_modules/lodash-es/_stringToArray.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); + + + + + + + + +/** + * Removes leading and trailing whitespace or specified characters from `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to trim. + * @param {string} [chars=whitespace] The characters to trim. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the trimmed string. + * @example + * + * _.trim(' abc '); + * // => 'abc' + * + * _.trim('-_-abc-_-', '_-'); + * // => 'abc' + * + * _.map([' foo ', ' bar '], _.trim); + * // => ['foo', 'bar'] + */ +function trim(string, chars, guard) { + string = Object(_toString_js__WEBPACK_IMPORTED_MODULE_6__["default"])(string); + if (string && (guard || chars === undefined)) { + return Object(_baseTrim_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string); + } + if (!string || !(chars = Object(_baseToString_js__WEBPACK_IMPORTED_MODULE_0__["default"])(chars))) { + return string; + } + var strSymbols = Object(_stringToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(string), + chrSymbols = Object(_stringToArray_js__WEBPACK_IMPORTED_MODULE_5__["default"])(chars), + start = Object(_charsStartIndex_js__WEBPACK_IMPORTED_MODULE_4__["default"])(strSymbols, chrSymbols), + end = Object(_charsEndIndex_js__WEBPACK_IMPORTED_MODULE_3__["default"])(strSymbols, chrSymbols) + 1; + + return Object(_castSlice_js__WEBPACK_IMPORTED_MODULE_2__["default"])(strSymbols, start, end).join(''); +} + +/* harmony default export */ __webpack_exports__["default"] = (trim); + + +/***/ }), + +/***/ "./node_modules/lodash-es/union.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/union.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseFlatten_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseFlatten.js */ "./node_modules/lodash-es/_baseFlatten.js"); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); +/* harmony import */ var _baseUniq_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseUniq.js */ "./node_modules/lodash-es/_baseUniq.js"); +/* harmony import */ var _isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArrayLikeObject.js */ "./node_modules/lodash-es/isArrayLikeObject.js"); + + + + + +/** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ +var union = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function(arrays) { + return Object(_baseUniq_js__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_baseFlatten_js__WEBPACK_IMPORTED_MODULE_0__["default"])(arrays, 1, _isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_3__["default"], true)); +}); + +/* harmony default export */ __webpack_exports__["default"] = (union); + + +/***/ }), + +/***/ "./node_modules/lodash-es/uniq.js": +/*!****************************************!*\ + !*** ./node_modules/lodash-es/uniq.js ***! + \****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseUniq_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseUniq.js */ "./node_modules/lodash-es/_baseUniq.js"); + + +/** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ +function uniq(array) { + return (array && array.length) ? Object(_baseUniq_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array) : []; +} + +/* harmony default export */ __webpack_exports__["default"] = (uniq); + + +/***/ }), + +/***/ "./node_modules/lodash-es/upperFirst.js": +/*!**********************************************!*\ + !*** ./node_modules/lodash-es/upperFirst.js ***! + \**********************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createCaseFirst_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_createCaseFirst.js */ "./node_modules/lodash-es/_createCaseFirst.js"); + + +/** + * Converts the first character of `string` to upper case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.upperFirst('fred'); + * // => 'Fred' + * + * _.upperFirst('FRED'); + * // => 'FRED' + */ +var upperFirst = Object(_createCaseFirst_js__WEBPACK_IMPORTED_MODULE_0__["default"])('toUpperCase'); + +/* harmony default export */ __webpack_exports__["default"] = (upperFirst); + + +/***/ }), + +/***/ "./node_modules/lodash-es/values.js": +/*!******************************************!*\ + !*** ./node_modules/lodash-es/values.js ***! + \******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseValues_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseValues.js */ "./node_modules/lodash-es/_baseValues.js"); +/* harmony import */ var _keys_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./keys.js */ "./node_modules/lodash-es/keys.js"); + + + +/** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ +function values(object) { + return object == null ? [] : Object(_baseValues_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, Object(_keys_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object)); +} + +/* harmony default export */ __webpack_exports__["default"] = (values); + + +/***/ }), + +/***/ "./node_modules/lodash-es/without.js": +/*!*******************************************!*\ + !*** ./node_modules/lodash-es/without.js ***! + \*******************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _baseDifference_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_baseDifference.js */ "./node_modules/lodash-es/_baseDifference.js"); +/* harmony import */ var _baseRest_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_baseRest.js */ "./node_modules/lodash-es/_baseRest.js"); +/* harmony import */ var _isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isArrayLikeObject.js */ "./node_modules/lodash-es/isArrayLikeObject.js"); + + + + +/** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ +var without = Object(_baseRest_js__WEBPACK_IMPORTED_MODULE_1__["default"])(function(array, values) { + return Object(_isArrayLikeObject_js__WEBPACK_IMPORTED_MODULE_2__["default"])(array) + ? Object(_baseDifference_js__WEBPACK_IMPORTED_MODULE_0__["default"])(array, values) + : []; +}); + +/* harmony default export */ __webpack_exports__["default"] = (without); + + +/***/ }), + +/***/ "./node_modules/lodash-es/words.js": +/*!*****************************************!*\ + !*** ./node_modules/lodash-es/words.js ***! + \*****************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _asciiWords_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_asciiWords.js */ "./node_modules/lodash-es/_asciiWords.js"); +/* harmony import */ var _hasUnicodeWord_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_hasUnicodeWord.js */ "./node_modules/lodash-es/_hasUnicodeWord.js"); +/* harmony import */ var _toString_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./toString.js */ "./node_modules/lodash-es/toString.js"); +/* harmony import */ var _unicodeWords_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./_unicodeWords.js */ "./node_modules/lodash-es/_unicodeWords.js"); + + + + + +/** + * Splits `string` into an array of its words. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {RegExp|string} [pattern] The pattern to match words. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the words of `string`. + * @example + * + * _.words('fred, barney, & pebbles'); + * // => ['fred', 'barney', 'pebbles'] + * + * _.words('fred, barney, & pebbles', /[^, ]+/g); + * // => ['fred', 'barney', '&', 'pebbles'] + */ +function words(string, pattern, guard) { + string = Object(_toString_js__WEBPACK_IMPORTED_MODULE_2__["default"])(string); + pattern = guard ? undefined : pattern; + + if (pattern === undefined) { + return Object(_hasUnicodeWord_js__WEBPACK_IMPORTED_MODULE_1__["default"])(string) ? Object(_unicodeWords_js__WEBPACK_IMPORTED_MODULE_3__["default"])(string) : Object(_asciiWords_js__WEBPACK_IMPORTED_MODULE_0__["default"])(string); + } + return string.match(pattern) || []; +} + +/* harmony default export */ __webpack_exports__["default"] = (words); + + +/***/ }), + +/***/ "./node_modules/lodash-es/wrapperLodash.js": +/*!*************************************************!*\ + !*** ./node_modules/lodash-es/wrapperLodash.js ***! + \*************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _LazyWrapper_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_LazyWrapper.js */ "./node_modules/lodash-es/_LazyWrapper.js"); +/* harmony import */ var _LodashWrapper_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_LodashWrapper.js */ "./node_modules/lodash-es/_LodashWrapper.js"); +/* harmony import */ var _baseLodash_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_baseLodash.js */ "./node_modules/lodash-es/_baseLodash.js"); +/* harmony import */ var _isArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isArray.js */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var _isObjectLike_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./isObjectLike.js */ "./node_modules/lodash-es/isObjectLike.js"); +/* harmony import */ var _wrapperClone_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./_wrapperClone.js */ "./node_modules/lodash-es/_wrapperClone.js"); + + + + + + + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** Used to check objects for own properties. */ +var hasOwnProperty = objectProto.hasOwnProperty; + +/** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ +function lodash(value) { + if (Object(_isObjectLike_js__WEBPACK_IMPORTED_MODULE_4__["default"])(value) && !Object(_isArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(value) && !(value instanceof _LazyWrapper_js__WEBPACK_IMPORTED_MODULE_0__["default"])) { + if (value instanceof _LodashWrapper_js__WEBPACK_IMPORTED_MODULE_1__["default"]) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return Object(_wrapperClone_js__WEBPACK_IMPORTED_MODULE_5__["default"])(value); + } + } + return new _LodashWrapper_js__WEBPACK_IMPORTED_MODULE_1__["default"](value); +} + +// Ensure wrappers are instances of `baseLodash`. +lodash.prototype = _baseLodash_js__WEBPACK_IMPORTED_MODULE_2__["default"].prototype; +lodash.prototype.constructor = lodash; + +/* harmony default export */ __webpack_exports__["default"] = (lodash); + + +/***/ }), + +/***/ "./node_modules/minimalistic-assert/index.js": +/*!***************************************************!*\ + !*** ./node_modules/minimalistic-assert/index.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +module.exports = assert; + +function assert(val, msg) { + if (!val) + throw new Error(msg || 'Assertion failed'); +} + +assert.equal = function assertEqual(l, r, msg) { + if (l != r) + throw new Error(msg || ('Assertion failed: ' + l + ' != ' + r)); +}; + + +/***/ }), + +/***/ "./node_modules/next/dist/build/polyfills/object-assign.js": +/*!*****************************************************************!*\ + !*** ./node_modules/next/dist/build/polyfills/object-assign.js ***! + \*****************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +var assign=Object.assign.bind(Object);module.exports=assign;module.exports.default=module.exports; +//# sourceMappingURL=object-assign.js.map + +/***/ }), + +/***/ "./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F&absolutePagePath=G%3A%5Ctypescript-solidity-dev-starter-kit%5Csrc%5Cpages%5Cindex.tsx!./": +/*!*********************************************************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F&absolutePagePath=G%3A%5Ctypescript-solidity-dev-starter-kit%5Csrc%5Cpages%5Cindex.tsx ***! + \*********************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + + + (window.__NEXT_P = window.__NEXT_P || []).push([ + "/", + function () { + return __webpack_require__(/*! ./src/pages/index.tsx */ "./src/pages/index.tsx"); + } + ]); + + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/global.js": +/*!***********************************!*\ + !*** (webpack)/webpack/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 149: +/***/ (function(module) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(149); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/harmony-module.js": +/*!*******************************************!*\ + !*** (webpack)/webpack/harmony-module.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 931: +/***/ (function(module) { + +module.exports = function(originalModule) { + if (!originalModule.webpackPolyfill) { + var module = Object.create(originalModule); + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + Object.defineProperty(module, "exports", { + enumerable: true + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(931); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/module.js": +/*!***********************************!*\ + !*** (webpack)/webpack/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 880: +/***/ (function(module) { + +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(880); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/process/browser.js": +/*!*****************************************!*\ + !*** ./node_modules/process/browser.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + + +/***/ }), + +/***/ "./node_modules/prop-types/checkPropTypes.js": +/*!***************************************************!*\ + !*** ./node_modules/prop-types/checkPropTypes.js ***! + \***************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +var printWarning = function() {}; + +if (true) { + var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); + var loggedTypeFailures = {}; + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} + +/** + * Assert that the values match with the type specs. + * Error messages are memorized and will only be shown once. + * + * @param {object} typeSpecs Map of name to a ReactPropType + * @param {object} values Runtime values that need to be type-checked + * @param {string} location e.g. "prop", "context", "child context" + * @param {string} componentName Name of the component for error messages. + * @param {?Function} getStack Returns the component stack. + * @private + */ +function checkPropTypes(typeSpecs, values, location, componentName, getStack) { + if (true) { + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error; + // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error( + (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + ); + err.name = 'Invariant Violation'; + throw err; + } + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); + } catch (ex) { + error = ex; + } + if (error && !(error instanceof Error)) { + printWarning( + (componentName || 'React class') + ': type specification of ' + + location + ' `' + typeSpecName + '` is invalid; the type checker ' + + 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + + 'You may have forgotten to pass an argument to the type checker ' + + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + + 'shape all require an argument).' + ); + } + if (error instanceof Error && !(error.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error.message] = true; + + var stack = getStack ? getStack() : ''; + + printWarning( + 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') + ); + } + } + } + } +} + +/** + * Resets warning cache when testing. + * + * @private + */ +checkPropTypes.resetWarningCache = function() { + if (true) { + loggedTypeFailures = {}; + } +} + +module.exports = checkPropTypes; + + +/***/ }), + +/***/ "./node_modules/prop-types/factoryWithTypeCheckers.js": +/*!************************************************************!*\ + !*** ./node_modules/prop-types/factoryWithTypeCheckers.js ***! + \************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +var ReactIs = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); +var assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"); +var checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ "./node_modules/prop-types/checkPropTypes.js"); + +var has = Function.call.bind(Object.prototype.hasOwnProperty); +var printWarning = function() {}; + +if (true) { + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} + +function emptyFunctionThatReturnsNull() { + return null; +} + +module.exports = function(isValidElement, throwOnDirectAccess) { + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } + } + + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ + + var ANONYMOUS = '<<anonymous>>'; + + // Important! + // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + symbol: createPrimitiveTypeChecker('symbol'), + + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + elementType: createElementTypeTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker, + exact: createStrictShapeTypeChecker, + }; + + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + /*eslint-disable no-self-compare*/ + function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return x !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } + } + /*eslint-enable no-self-compare*/ + + /** + * We use an Error-like object for backward compatibility as people may call + * PropTypes directly and inspect their output. However, we don't use real + * Errors anymore. We don't inspect their stack anyway, and creating them + * is prohibitively expensive if they are created too often, such as what + * happens in oneOfType() for any type before the one that matched. + */ + function PropTypeError(message) { + this.message = message; + this.stack = ''; + } + // Make `instanceof Error` still work for returned errors. + PropTypeError.prototype = Error.prototype; + + function createChainableTypeChecker(validate) { + if (true) { + var manualPropTypeCallCache = {}; + var manualPropTypeWarningCount = 0; + } + function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + + if (secret !== ReactPropTypesSecret) { + if (throwOnDirectAccess) { + // New behavior only for users of `prop-types` package + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use `PropTypes.checkPropTypes()` to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + } else if ( true && typeof console !== 'undefined') { + // Old behavior for people using React.PropTypes + var cacheKey = componentName + ':' + propName; + if ( + !manualPropTypeCallCache[cacheKey] && + // Avoid spamming the console because they are often not actionable except for lib authors + manualPropTypeWarningCount < 3 + ) { + printWarning( + 'You are manually calling a React.PropTypes validation ' + + 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + + 'and will throw in the standalone `prop-types` package. ' + + 'You may be seeing this warning due to a third-party PropTypes ' + + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' + ); + manualPropTypeCallCache[cacheKey] = true; + manualPropTypeWarningCount++; + } + } + } + if (props[propName] == null) { + if (isRequired) { + if (props[propName] === null) { + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); + } + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } + + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); + + return chainedCheckType; + } + + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName, secret) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); + + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunctionThatReturnsNull); + } + + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); + } + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!isValidElement(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createElementTypeTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!ReactIs.isValidElementType(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + if (true) { + if (arguments.length > 1) { + printWarning( + 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + + 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' + ); + } else { + printWarning('Invalid argument supplied to oneOf, expected an array.'); + } + } + return emptyFunctionThatReturnsNull; + } + + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (is(propValue, expectedValues[i])) { + return null; + } + } + + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + var type = getPreciseType(value); + if (type === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); + } + + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); + } + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (has(propValue, key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : undefined; + return emptyFunctionThatReturnsNull; + } + + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (typeof checker !== 'function') { + printWarning( + 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + + 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' + ); + return emptyFunctionThatReturnsNull; + } + } + + function validate(props, propName, componentName, location, propFullName) { + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) { + return null; + } + } + + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.')); + } + return createChainableTypeChecker(validate); + } + + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (!checker) { + continue; + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } + + function createStrictShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + // We need to check all keys in case some are required but missing from + // props. + var allKeys = assign({}, props[propName], shapeTypes); + for (var key in allKeys) { + var checker = shapeTypes[key]; + if (!checker) { + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + + '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + + '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') + ); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } + + return createChainableTypeChecker(validate); + } + + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || isValidElement(propValue)) { + return true; + } + + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } + + return true; + default: + return false; + } + } + + function isSymbol(propType, propValue) { + // Native Symbol. + if (propType === 'symbol') { + return true; + } + + // falsy value can't be a Symbol + if (!propValue) { + return false; + } + + // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' + if (propValue['@@toStringTag'] === 'Symbol') { + return true; + } + + // Fallback for non-spec compliant Symbols which are polyfilled. + if (typeof Symbol === 'function' && propValue instanceof Symbol) { + return true; + } + + return false; + } + + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + if (isSymbol(propType, propValue)) { + return 'symbol'; + } + return propType; + } + + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + if (typeof propValue === 'undefined' || propValue === null) { + return '' + propValue; + } + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } + + // Returns a string that is postfixed to a warning about an invalid type. + // For example, "undefined" or "of type array" + function getPostfixForTypeWarning(value) { + var type = getPreciseType(value); + switch (type) { + case 'array': + case 'object': + return 'an ' + type; + case 'boolean': + case 'date': + case 'regexp': + return 'a ' + type; + default: + return type; + } + } + + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return ANONYMOUS; + } + return propValue.constructor.name; + } + + ReactPropTypes.checkPropTypes = checkPropTypes; + ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; + ReactPropTypes.PropTypes = ReactPropTypes; + + return ReactPropTypes; +}; + + +/***/ }), + +/***/ "./node_modules/prop-types/index.js": +/*!******************************************!*\ + !*** ./node_modules/prop-types/index.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +if (true) { + var ReactIs = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = __webpack_require__(/*! ./factoryWithTypeCheckers */ "./node_modules/prop-types/factoryWithTypeCheckers.js")(ReactIs.isElement, throwOnDirectAccess); +} else {} + + +/***/ }), + +/***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js": +/*!*************************************************************!*\ + !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; + +module.exports = ReactPropTypesSecret; + + +/***/ }), + +/***/ "./node_modules/react-dom/cjs/react-dom.development.js": +/*!*************************************************************!*\ + !*** ./node_modules/react-dom/cjs/react-dom.development.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react-dom.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var React = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); +var Scheduler = __webpack_require__(/*! scheduler */ "./node_modules/scheduler/index.js"); +var tracing = __webpack_require__(/*! scheduler/tracing */ "./node_modules/scheduler/tracing.js"); + +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } +} +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +if (!React) { + { + throw Error( "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM." ); + } +} + +var FunctionComponent = 0; +var ClassComponent = 1; +var IndeterminateComponent = 2; // Before we know whether it is function or class + +var HostRoot = 3; // Root of a host tree. Could be nested inside another node. + +var HostPortal = 4; // A subtree. Could be an entry point to a different renderer. + +var HostComponent = 5; +var HostText = 6; +var Fragment = 7; +var Mode = 8; +var ContextConsumer = 9; +var ContextProvider = 10; +var ForwardRef = 11; +var Profiler = 12; +var SuspenseComponent = 13; +var MemoComponent = 14; +var SimpleMemoComponent = 15; +var LazyComponent = 16; +var IncompleteClassComponent = 17; +var DehydratedFragment = 18; +var SuspenseListComponent = 19; +var FundamentalComponent = 20; +var ScopeComponent = 21; +var Block = 22; +var OffscreenComponent = 23; +var LegacyHiddenComponent = 24; + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableProfilerTimer = true; // Record durations for commit and passive effects phases. + +var enableFundamentalAPI = false; // Experimental Scope support. +var enableNewReconciler = false; // Errors that are thrown while unmounting (or after in the case of passive effects) +var warnAboutStringRefs = false; + +var allNativeEvents = new Set(); +/** + * Mapping from registration name to event name + */ + + +var registrationNameDependencies = {}; +/** + * Mapping from lowercase registration names to the properly cased version, + * used to warn in the case of missing event handlers. Available + * only in true. + * @type {Object} + */ + +var possibleRegistrationNames = {} ; // Trust the developer to only use possibleRegistrationNames in true + +function registerTwoPhaseEvent(registrationName, dependencies) { + registerDirectEvent(registrationName, dependencies); + registerDirectEvent(registrationName + 'Capture', dependencies); +} +function registerDirectEvent(registrationName, dependencies) { + { + if (registrationNameDependencies[registrationName]) { + error('EventRegistry: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName); + } + } + + registrationNameDependencies[registrationName] = dependencies; + + { + var lowerCasedName = registrationName.toLowerCase(); + possibleRegistrationNames[lowerCasedName] = registrationName; + + if (registrationName === 'onDoubleClick') { + possibleRegistrationNames.ondblclick = registrationName; + } + } + + for (var i = 0; i < dependencies.length; i++) { + allNativeEvents.add(dependencies[i]); + } +} + +var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined'); + +// A reserved attribute. +// It is handled by React separately and shouldn't be written to the DOM. +var RESERVED = 0; // A simple string attribute. +// Attributes that aren't in the filter are presumed to have this type. + +var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called +// "enumerated" attributes with "true" and "false" as possible values. +// When true, it should be set to a "true" string. +// When false, it should be set to a "false" string. + +var BOOLEANISH_STRING = 2; // A real boolean attribute. +// When true, it should be present (set either to an empty string or its name). +// When false, it should be omitted. + +var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value. +// When true, it should be present (set either to an empty string or its name). +// When false, it should be omitted. +// For any other value, should be present with that value. + +var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric. +// When falsy, it should be removed. + +var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric. +// When falsy, it should be removed. + +var POSITIVE_NUMERIC = 6; + +/* eslint-disable max-len */ +var ATTRIBUTE_NAME_START_CHAR = ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; +/* eslint-enable max-len */ + +var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; +var ROOT_ATTRIBUTE_NAME = 'data-reactroot'; +var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$'); +var hasOwnProperty = Object.prototype.hasOwnProperty; +var illegalAttributeNameCache = {}; +var validatedAttributeNameCache = {}; +function isAttributeNameSafe(attributeName) { + if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) { + return true; + } + + if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) { + return false; + } + + if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { + validatedAttributeNameCache[attributeName] = true; + return true; + } + + illegalAttributeNameCache[attributeName] = true; + + { + error('Invalid attribute name: `%s`', attributeName); + } + + return false; +} +function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null) { + return propertyInfo.type === RESERVED; + } + + if (isCustomComponentTag) { + return false; + } + + if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) { + return true; + } + + return false; +} +function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) { + if (propertyInfo !== null && propertyInfo.type === RESERVED) { + return false; + } + + switch (typeof value) { + case 'function': // $FlowIssue symbol is perfectly valid here + + case 'symbol': + // eslint-disable-line + return true; + + case 'boolean': + { + if (isCustomComponentTag) { + return false; + } + + if (propertyInfo !== null) { + return !propertyInfo.acceptsBooleans; + } else { + var prefix = name.toLowerCase().slice(0, 5); + return prefix !== 'data-' && prefix !== 'aria-'; + } + } + + default: + return false; + } +} +function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) { + if (value === null || typeof value === 'undefined') { + return true; + } + + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) { + return true; + } + + if (isCustomComponentTag) { + return false; + } + + if (propertyInfo !== null) { + + switch (propertyInfo.type) { + case BOOLEAN: + return !value; + + case OVERLOADED_BOOLEAN: + return value === false; + + case NUMERIC: + return isNaN(value); + + case POSITIVE_NUMERIC: + return isNaN(value) || value < 1; + } + } + + return false; +} +function getPropertyInfo(name) { + return properties.hasOwnProperty(name) ? properties[name] : null; +} + +function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) { + this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN; + this.attributeName = attributeName; + this.attributeNamespace = attributeNamespace; + this.mustUseProperty = mustUseProperty; + this.propertyName = name; + this.type = type; + this.sanitizeURL = sanitizeURL; + this.removeEmptyString = removeEmptyString; +} // When adding attributes to this list, be sure to also add them to +// the `possibleStandardNames` module to ensure casing and incorrect +// name warnings. + + +var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM. + +var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular +// elements (not just inputs). Now that ReactDOMInput assigns to the +// defaultValue property -- do we need this? +'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style']; +reservedProps.forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // A few React string attributes have a different name. +// This is a mapping from React prop names to the attribute names. + +[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) { + var name = _ref[0], + attributeName = _ref[1]; + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are "enumerated" HTML attributes that accept "true" and "false". +// In React, we let users pass `true` and `false` even though technically +// these aren't boolean attributes (they are coerced to strings). + +['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are "enumerated" SVG attributes that accept "true" and "false". +// In React, we let users pass `true` and `false` even though technically +// these aren't boolean attributes (they are coerced to strings). +// Since these are SVG attributes, their attribute names are case-sensitive. + +['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML boolean attributes. + +['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM +// on the client side because the browsers are inconsistent. Instead we call focus(). +'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata +'itemScope'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are the few React props that we set as DOM properties +// rather than attributes. These are all booleans. + +['checked', // Note: `option.selected` is not updated if `select.multiple` is +// disabled with `removeAttribute`. We have special logic for handling this. +'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that are "overloaded booleans": they behave like +// booleans, but can also accept a string value. + +['capture', 'download' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that must be positive numbers. + +['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty + name, // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These are HTML attributes that must be numbers. + +['rowSpan', 'start'].forEach(function (name) { + properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty + name.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); +var CAMELIZE = /[\-\:]([a-z])/g; + +var capitalize = function (token) { + return token[1].toUpperCase(); +}; // This is a list of all SVG attributes that need special casing, namespacing, +// or boolean value assignment. Regular attributes that just accept strings +// and have the same names are omitted, just like in the HTML attribute filter. +// Some of these attributes can be hard to find. This list was created by +// scraping the MDN documentation. + + +['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'xmlns:xlink', 'x-height' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, null, // attributeNamespace + false, // sanitizeURL + false); +}); // String SVG attributes with the xlink namespace. + +['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL + false); +}); // String SVG attributes with the xml namespace. + +['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list, +// you'll need to set attributeName to name.toLowerCase() +// instead in the assignment below. +].forEach(function (attributeName) { + var name = attributeName.replace(CAMELIZE, capitalize); + properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty + attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL + false); +}); // These attribute exists both in HTML and SVG. +// The attribute name is case-sensitive in SVG so we can't just use +// the React name like we do for attributes that exist only in HTML. + +['tabIndex', 'crossOrigin'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + false, // sanitizeURL + false); +}); // These attributes accept URLs. These must not allow javascript: URLS. +// These will also need to accept Trusted Types object in the future. + +var xlinkHref = 'xlinkHref'; +properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty +'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL +false); +['src', 'href', 'action', 'formAction'].forEach(function (attributeName) { + properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty + attributeName.toLowerCase(), // attributeName + null, // attributeNamespace + true, // sanitizeURL + true); +}); + +// and any newline or tab are filtered out as if they're not part of the URL. +// https://url.spec.whatwg.org/#url-parsing +// Tab or newline are defined as \r\n\t: +// https://infra.spec.whatwg.org/#ascii-tab-or-newline +// A C0 control is a code point in the range \u0000 NULL to \u001F +// INFORMATION SEPARATOR ONE, inclusive: +// https://infra.spec.whatwg.org/#c0-control-or-space + +/* eslint-disable max-len */ + +var isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i; +var didWarn = false; + +function sanitizeURL(url) { + { + if (!didWarn && isJavaScriptProtocol.test(url)) { + didWarn = true; + + error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url)); + } + } +} + +/** + * Get the value for a property on a node. Only used in DEV for SSR validation. + * The "expected" argument is used as a hint of what the expected value is. + * Some properties have multiple equivalent values. + */ +function getValueForProperty(node, name, expected, propertyInfo) { + { + if (propertyInfo.mustUseProperty) { + var propertyName = propertyInfo.propertyName; + return node[propertyName]; + } else { + if ( propertyInfo.sanitizeURL) { + // If we haven't fully disabled javascript: URLs, and if + // the hydration is successful of a javascript: URL, we + // still want to warn on the client. + sanitizeURL('' + expected); + } + + var attributeName = propertyInfo.attributeName; + var stringValue = null; + + if (propertyInfo.type === OVERLOADED_BOOLEAN) { + if (node.hasAttribute(attributeName)) { + var value = node.getAttribute(attributeName); + + if (value === '') { + return true; + } + + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return value; + } + + if (value === '' + expected) { + return expected; + } + + return value; + } + } else if (node.hasAttribute(attributeName)) { + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + // We had an attribute but shouldn't have had one, so read it + // for the error message. + return node.getAttribute(attributeName); + } + + if (propertyInfo.type === BOOLEAN) { + // If this was a boolean, it doesn't matter what the value is + // the fact that we have it is the same as the expected. + return expected; + } // Even if this property uses a namespace we use getAttribute + // because we assume its namespaced name is the same as our config. + // To use getAttributeNS we need the local name which we don't have + // in our config atm. + + + stringValue = node.getAttribute(attributeName); + } + + if (shouldRemoveAttribute(name, expected, propertyInfo, false)) { + return stringValue === null ? expected : stringValue; + } else if (stringValue === '' + expected) { + return expected; + } else { + return stringValue; + } + } + } +} +/** + * Get the value for a attribute on a node. Only used in DEV for SSR validation. + * The third argument is used as a hint of what the expected value is. Some + * attributes have multiple equivalent values. + */ + +function getValueForAttribute(node, name, expected) { + { + if (!isAttributeNameSafe(name)) { + return; + } // If the object is an opaque reference ID, it's expected that + // the next prop is different than the server value, so just return + // expected + + + if (isOpaqueHydratingObject(expected)) { + return expected; + } + + if (!node.hasAttribute(name)) { + return expected === undefined ? undefined : null; + } + + var value = node.getAttribute(name); + + if (value === '' + expected) { + return expected; + } + + return value; + } +} +/** + * Sets the value for a property on a node. + * + * @param {DOMElement} node + * @param {string} name + * @param {*} value + */ + +function setValueForProperty(node, name, value, isCustomComponentTag) { + var propertyInfo = getPropertyInfo(name); + + if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) { + return; + } + + if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) { + value = null; + } // If the prop isn't in the special list, treat it as a simple attribute. + + + if (isCustomComponentTag || propertyInfo === null) { + if (isAttributeNameSafe(name)) { + var _attributeName = name; + + if (value === null) { + node.removeAttribute(_attributeName); + } else { + node.setAttribute(_attributeName, '' + value); + } + } + + return; + } + + var mustUseProperty = propertyInfo.mustUseProperty; + + if (mustUseProperty) { + var propertyName = propertyInfo.propertyName; + + if (value === null) { + var type = propertyInfo.type; + node[propertyName] = type === BOOLEAN ? false : ''; + } else { + // Contrary to `setAttribute`, object properties are properly + // `toString`ed by IE8/9. + node[propertyName] = value; + } + + return; + } // The rest are treated as attributes with special cases. + + + var attributeName = propertyInfo.attributeName, + attributeNamespace = propertyInfo.attributeNamespace; + + if (value === null) { + node.removeAttribute(attributeName); + } else { + var _type = propertyInfo.type; + var attributeValue; + + if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) { + // If attribute type is boolean, we know for sure it won't be an execution sink + // and we won't require Trusted Type here. + attributeValue = ''; + } else { + // `setAttribute` with objects becomes only `[object]` in IE8/9, + // ('' + value) makes it output the correct toString()-value. + { + attributeValue = '' + value; + } + + if (propertyInfo.sanitizeURL) { + sanitizeURL(attributeValue.toString()); + } + } + + if (attributeNamespace) { + node.setAttributeNS(attributeNamespace, attributeName, attributeValue); + } else { + node.setAttribute(attributeName, attributeValue); + } + } +} + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +var REACT_FRAGMENT_TYPE = 0xeacb; +var REACT_STRICT_MODE_TYPE = 0xeacc; +var REACT_PROFILER_TYPE = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +var REACT_SUSPENSE_TYPE = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + REACT_FRAGMENT_TYPE = symbolFor('react.fragment'); + REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); + REACT_PROFILER_TYPE = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} + +function describeClassComponentFrame(ctor, source, ownerFn) { + { + return describeNativeComponentFrame(ctor, true); + } +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +function describeFiber(fiber) { + var owner = fiber._debugOwner ? fiber._debugOwner.type : null ; + var source = fiber._debugSource ; + + switch (fiber.tag) { + case HostComponent: + return describeBuiltInComponentFrame(fiber.type); + + case LazyComponent: + return describeBuiltInComponentFrame('Lazy'); + + case SuspenseComponent: + return describeBuiltInComponentFrame('Suspense'); + + case SuspenseListComponent: + return describeBuiltInComponentFrame('SuspenseList'); + + case FunctionComponent: + case IndeterminateComponent: + case SimpleMemoComponent: + return describeFunctionComponentFrame(fiber.type); + + case ForwardRef: + return describeFunctionComponentFrame(fiber.type.render); + + case Block: + return describeFunctionComponentFrame(fiber.type._render); + + case ClassComponent: + return describeClassComponentFrame(fiber.type); + + default: + return ''; + } +} + +function getStackByFiberInDevAndProd(workInProgress) { + try { + var info = ''; + var node = workInProgress; + + do { + info += describeFiber(node); + node = node.return; + } while (node); + + return info; + } catch (x) { + return '\nError generating stack: ' + x.message + '\n' + x.stack; + } +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case REACT_FRAGMENT_TYPE: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; +var current = null; +var isRendering = false; +function getCurrentFiberOwnerNameInDevOrNull() { + { + if (current === null) { + return null; + } + + var owner = current._debugOwner; + + if (owner !== null && typeof owner !== 'undefined') { + return getComponentName(owner.type); + } + } + + return null; +} + +function getCurrentFiberStackInDev() { + { + if (current === null) { + return ''; + } // Safe because if current fiber exists, we are reconciling, + // and it is guaranteed to be the work-in-progress version. + + + return getStackByFiberInDevAndProd(current); + } +} + +function resetCurrentFiber() { + { + ReactDebugCurrentFrame.getCurrentStack = null; + current = null; + isRendering = false; + } +} +function setCurrentFiber(fiber) { + { + ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev; + current = fiber; + isRendering = false; + } +} +function setIsRendering(rendering) { + { + isRendering = rendering; + } +} +function getIsRendering() { + { + return isRendering; + } +} + +// Flow does not allow string concatenation of most non-string types. To work +// around this limitation, we use an opaque type that can only be obtained by +// passing the value through getToStringValue first. +function toString(value) { + return '' + value; +} +function getToStringValue(value) { + switch (typeof value) { + case 'boolean': + case 'number': + case 'object': + case 'string': + case 'undefined': + return value; + + default: + // function, symbol are assigned as empty strings + return ''; + } +} + +var hasReadOnlyValue = { + button: true, + checkbox: true, + image: true, + hidden: true, + radio: true, + reset: true, + submit: true +}; +function checkControlledValueProps(tagName, props) { + { + if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) { + error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + + if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) { + error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.'); + } + } +} + +function isCheckable(elem) { + var type = elem.type; + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio'); +} + +function getTracker(node) { + return node._valueTracker; +} + +function detachTracker(node) { + node._valueTracker = null; +} + +function getValueFromNode(node) { + var value = ''; + + if (!node) { + return value; + } + + if (isCheckable(node)) { + value = node.checked ? 'true' : 'false'; + } else { + value = node.value; + } + + return value; +} + +function trackValueOnNode(node) { + var valueField = isCheckable(node) ? 'checked' : 'value'; + var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); + var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail + // and don't track value will cause over reporting of changes, + // but it's better then a hard failure + // (needed for certain tests that spyOn input values and Safari) + + if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { + return; + } + + var get = descriptor.get, + set = descriptor.set; + Object.defineProperty(node, valueField, { + configurable: true, + get: function () { + return get.call(this); + }, + set: function (value) { + currentValue = '' + value; + set.call(this, value); + } + }); // We could've passed this the first time + // but it triggers a bug in IE11 and Edge 14/15. + // Calling defineProperty() again should be equivalent. + // https://github.com/facebook/react/issues/11768 + + Object.defineProperty(node, valueField, { + enumerable: descriptor.enumerable + }); + var tracker = { + getValue: function () { + return currentValue; + }, + setValue: function (value) { + currentValue = '' + value; + }, + stopTracking: function () { + detachTracker(node); + delete node[valueField]; + } + }; + return tracker; +} + +function track(node) { + if (getTracker(node)) { + return; + } // TODO: Once it's just Fiber we can move this to node._wrapperState + + + node._valueTracker = trackValueOnNode(node); +} +function updateValueIfChanged(node) { + if (!node) { + return false; + } + + var tracker = getTracker(node); // if there is no tracker at this point it's unlikely + // that trying again will succeed + + if (!tracker) { + return true; + } + + var lastValue = tracker.getValue(); + var nextValue = getValueFromNode(node); + + if (nextValue !== lastValue) { + tracker.setValue(nextValue); + return true; + } + + return false; +} + +function getActiveElement(doc) { + doc = doc || (typeof document !== 'undefined' ? document : undefined); + + if (typeof doc === 'undefined') { + return null; + } + + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; + } +} + +var didWarnValueDefaultValue = false; +var didWarnCheckedDefaultChecked = false; +var didWarnControlledToUncontrolled = false; +var didWarnUncontrolledToControlled = false; + +function isControlled(props) { + var usesChecked = props.type === 'checkbox' || props.type === 'radio'; + return usesChecked ? props.checked != null : props.value != null; +} +/** + * Implements an <input> host component that allows setting these optional + * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. + * + * If `checked` or `value` are not supplied (or null/undefined), user actions + * that affect the checked state or value will trigger updates to the element. + * + * If they are supplied (and not null/undefined), the rendered element will not + * trigger updates to the element. Instead, the props must change in order for + * the rendered element to be updated. + * + * The rendered element will be initialized as unchecked (or `defaultChecked`) + * with an empty value (or `defaultValue`). + * + * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html + */ + + +function getHostProps(element, props) { + var node = element; + var checked = props.checked; + + var hostProps = _assign({}, props, { + defaultChecked: undefined, + defaultValue: undefined, + value: undefined, + checked: checked != null ? checked : node._wrapperState.initialChecked + }); + + return hostProps; +} +function initWrapperState(element, props) { + { + checkControlledValueProps('input', props); + + if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) { + error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); + + didWarnCheckedDefaultChecked = true; + } + + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) { + error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type); + + didWarnValueDefaultValue = true; + } + } + + var node = element; + var defaultValue = props.defaultValue == null ? '' : props.defaultValue; + node._wrapperState = { + initialChecked: props.checked != null ? props.checked : props.defaultChecked, + initialValue: getToStringValue(props.value != null ? props.value : defaultValue), + controlled: isControlled(props) + }; +} +function updateChecked(element, props) { + var node = element; + var checked = props.checked; + + if (checked != null) { + setValueForProperty(node, 'checked', checked, false); + } +} +function updateWrapper(element, props) { + var node = element; + + { + var controlled = isControlled(props); + + if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { + error('A component is changing an uncontrolled input to be controlled. ' + 'This is likely caused by the value changing from undefined to ' + 'a defined value, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components'); + + didWarnUncontrolledToControlled = true; + } + + if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { + error('A component is changing a controlled input to be uncontrolled. ' + 'This is likely caused by the value changing from a defined to ' + 'undefined, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components'); + + didWarnControlledToUncontrolled = true; + } + } + + updateChecked(element, props); + var value = getToStringValue(props.value); + var type = props.type; + + if (value != null) { + if (type === 'number') { + if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible. + // eslint-disable-next-line + node.value != value) { + node.value = toString(value); + } + } else if (node.value !== toString(value)) { + node.value = toString(value); + } + } else if (type === 'submit' || type === 'reset') { + // Submit/reset inputs need the attribute removed completely to avoid + // blank-text buttons. + node.removeAttribute('value'); + return; + } + + { + // When syncing the value attribute, the value comes from a cascade of + // properties: + // 1. The value React property + // 2. The defaultValue React property + // 3. Otherwise there should be no change + if (props.hasOwnProperty('value')) { + setDefaultValue(node, props.type, value); + } else if (props.hasOwnProperty('defaultValue')) { + setDefaultValue(node, props.type, getToStringValue(props.defaultValue)); + } + } + + { + // When syncing the checked attribute, it only changes when it needs + // to be removed, such as transitioning from a checkbox into a text input + if (props.checked == null && props.defaultChecked != null) { + node.defaultChecked = !!props.defaultChecked; + } + } +} +function postMountWrapper(element, props, isHydrating) { + var node = element; // Do not assign value if it is already set. This prevents user text input + // from being lost during SSR hydration. + + if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) { + var type = props.type; + var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the + // default value provided by the browser. See: #12872 + + if (isButton && (props.value === undefined || props.value === null)) { + return; + } + + var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input + // from being lost during SSR hydration. + + if (!isHydrating) { + { + // When syncing the value attribute, the value property should use + // the wrapperState._initialValue property. This uses: + // + // 1. The value React property when present + // 2. The defaultValue React property when present + // 3. An empty string + if (initialValue !== node.value) { + node.value = initialValue; + } + } + } + + { + // Otherwise, the value attribute is synchronized to the property, + // so we assign defaultValue to the same thing as the value property + // assignment step above. + node.defaultValue = initialValue; + } + } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug + // this is needed to work around a chrome bug where setting defaultChecked + // will sometimes influence the value of checked (even after detachment). + // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416 + // We need to temporarily unset name to avoid disrupting radio button groups. + + + var name = node.name; + + if (name !== '') { + node.name = ''; + } + + { + // When syncing the checked attribute, both the checked property and + // attribute are assigned at the same time using defaultChecked. This uses: + // + // 1. The checked React property when present + // 2. The defaultChecked React property when present + // 3. Otherwise, false + node.defaultChecked = !node.defaultChecked; + node.defaultChecked = !!node._wrapperState.initialChecked; + } + + if (name !== '') { + node.name = name; + } +} +function restoreControlledState(element, props) { + var node = element; + updateWrapper(node, props); + updateNamedCousins(node, props); +} + +function updateNamedCousins(rootNode, props) { + var name = props.name; + + if (props.type === 'radio' && name != null) { + var queryRoot = rootNode; + + while (queryRoot.parentNode) { + queryRoot = queryRoot.parentNode; + } // If `rootNode.form` was non-null, then we could try `form.elements`, + // but that sometimes behaves strangely in IE8. We could also try using + // `form.getElementsByName`, but that will only return direct children + // and won't include inputs that use the HTML5 `form=` attribute. Since + // the input might not even be in a form. It might not even be in the + // document. Let's just use the local `querySelectorAll` to ensure we don't + // miss anything. + + + var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); + + for (var i = 0; i < group.length; i++) { + var otherNode = group[i]; + + if (otherNode === rootNode || otherNode.form !== rootNode.form) { + continue; + } // This will throw if radio buttons rendered by different copies of React + // and the same name are rendered into the same form (same as #1939). + // That's probably okay; we don't support it just as we don't support + // mixing React radio buttons with non-React ones. + + + var otherProps = getFiberCurrentPropsFromNode(otherNode); + + if (!otherProps) { + { + throw Error( "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported." ); + } + } // We need update the tracked value on the named cousin since the value + // was changed but the input saw no event or value set + + + updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that + // was previously checked to update will cause it to be come re-checked + // as appropriate. + + updateWrapper(otherNode, otherProps); + } + } +} // In Chrome, assigning defaultValue to certain input types triggers input validation. +// For number inputs, the display value loses trailing decimal points. For email inputs, +// Chrome raises "The specified value <x> is not a valid email address". +// +// Here we check to see if the defaultValue has actually changed, avoiding these problems +// when the user is inputting text +// +// https://github.com/facebook/react/issues/7253 + + +function setDefaultValue(node, type, value) { + if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js + type !== 'number' || getActiveElement(node.ownerDocument) !== node) { + if (value == null) { + node.defaultValue = toString(node._wrapperState.initialValue); + } else if (node.defaultValue !== toString(value)) { + node.defaultValue = toString(value); + } + } +} + +var didWarnSelectedSetOnOption = false; +var didWarnInvalidChild = false; + +function flattenChildren(children) { + var content = ''; // Flatten children. We'll warn if they are invalid + // during validateProps() which runs for hydration too. + // Note that this would throw on non-element objects. + // Elements are stringified (which is normally irrelevant + // but matters for <fbt>). + + React.Children.forEach(children, function (child) { + if (child == null) { + return; + } + + content += child; // Note: we don't warn about invalid children here. + // Instead, this is done separately below so that + // it happens during the hydration code path too. + }); + return content; +} +/** + * Implements an <option> host component that warns when `selected` is set. + */ + + +function validateProps(element, props) { + { + // This mirrors the code path above, but runs for hydration too. + // Warn about invalid children here so that client and hydration are consistent. + // TODO: this seems like it could cause a DEV-only throw for hydration + // if children contains a non-element object. We should try to avoid that. + if (typeof props.children === 'object' && props.children !== null) { + React.Children.forEach(props.children, function (child) { + if (child == null) { + return; + } + + if (typeof child === 'string' || typeof child === 'number') { + return; + } + + if (typeof child.type !== 'string') { + return; + } + + if (!didWarnInvalidChild) { + didWarnInvalidChild = true; + + error('Only strings and numbers are supported as <option> children.'); + } + }); + } // TODO: Remove support for `selected` in <option>. + + + if (props.selected != null && !didWarnSelectedSetOnOption) { + error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.'); + + didWarnSelectedSetOnOption = true; + } + } +} +function postMountWrapper$1(element, props) { + // value="" should make a value attribute (#6219) + if (props.value != null) { + element.setAttribute('value', toString(getToStringValue(props.value))); + } +} +function getHostProps$1(element, props) { + var hostProps = _assign({ + children: undefined + }, props); + + var content = flattenChildren(props.children); + + if (content) { + hostProps.children = content; + } + + return hostProps; +} + +var didWarnValueDefaultValue$1; + +{ + didWarnValueDefaultValue$1 = false; +} + +function getDeclarationErrorAddendum() { + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + + if (ownerName) { + return '\n\nCheck the render method of `' + ownerName + '`.'; + } + + return ''; +} + +var valuePropNames = ['value', 'defaultValue']; +/** + * Validation function for `value` and `defaultValue`. + */ + +function checkSelectPropTypes(props) { + { + checkControlledValueProps('select', props); + + for (var i = 0; i < valuePropNames.length; i++) { + var propName = valuePropNames[i]; + + if (props[propName] == null) { + continue; + } + + var isArray = Array.isArray(props[propName]); + + if (props.multiple && !isArray) { + error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum()); + } else if (!props.multiple && isArray) { + error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum()); + } + } + } +} + +function updateOptions(node, multiple, propValue, setDefaultSelected) { + var options = node.options; + + if (multiple) { + var selectedValues = propValue; + var selectedValue = {}; + + for (var i = 0; i < selectedValues.length; i++) { + // Prefix to avoid chaos with special keys. + selectedValue['$' + selectedValues[i]] = true; + } + + for (var _i = 0; _i < options.length; _i++) { + var selected = selectedValue.hasOwnProperty('$' + options[_i].value); + + if (options[_i].selected !== selected) { + options[_i].selected = selected; + } + + if (selected && setDefaultSelected) { + options[_i].defaultSelected = true; + } + } + } else { + // Do not set `select.value` as exact behavior isn't consistent across all + // browsers for all cases. + var _selectedValue = toString(getToStringValue(propValue)); + + var defaultSelected = null; + + for (var _i2 = 0; _i2 < options.length; _i2++) { + if (options[_i2].value === _selectedValue) { + options[_i2].selected = true; + + if (setDefaultSelected) { + options[_i2].defaultSelected = true; + } + + return; + } + + if (defaultSelected === null && !options[_i2].disabled) { + defaultSelected = options[_i2]; + } + } + + if (defaultSelected !== null) { + defaultSelected.selected = true; + } + } +} +/** + * Implements a <select> host component that allows optionally setting the + * props `value` and `defaultValue`. If `multiple` is false, the prop must be a + * stringable. If `multiple` is true, the prop must be an array of stringables. + * + * If `value` is not supplied (or null/undefined), user actions that change the + * selected option will trigger updates to the rendered options. + * + * If it is supplied (and not null/undefined), the rendered options will not + * update in response to user actions. Instead, the `value` prop must change in + * order for the rendered options to update. + * + * If `defaultValue` is provided, any options with the supplied values will be + * selected. + */ + + +function getHostProps$2(element, props) { + return _assign({}, props, { + value: undefined + }); +} +function initWrapperState$1(element, props) { + var node = element; + + { + checkSelectPropTypes(props); + } + + node._wrapperState = { + wasMultiple: !!props.multiple + }; + + { + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) { + error('Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components'); + + didWarnValueDefaultValue$1 = true; + } + } +} +function postMountWrapper$2(element, props) { + var node = element; + node.multiple = !!props.multiple; + var value = props.value; + + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } else if (props.defaultValue != null) { + updateOptions(node, !!props.multiple, props.defaultValue, true); + } +} +function postUpdateWrapper(element, props) { + var node = element; + var wasMultiple = node._wrapperState.wasMultiple; + node._wrapperState.wasMultiple = !!props.multiple; + var value = props.value; + + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } else if (wasMultiple !== !!props.multiple) { + // For simplicity, reapply `defaultValue` if `multiple` is toggled. + if (props.defaultValue != null) { + updateOptions(node, !!props.multiple, props.defaultValue, true); + } else { + // Revert the select back to its default unselected state. + updateOptions(node, !!props.multiple, props.multiple ? [] : '', false); + } + } +} +function restoreControlledState$1(element, props) { + var node = element; + var value = props.value; + + if (value != null) { + updateOptions(node, !!props.multiple, value, false); + } +} + +var didWarnValDefaultVal = false; + +/** + * Implements a <textarea> host component that allows setting `value`, and + * `defaultValue`. This differs from the traditional DOM API because value is + * usually set as PCDATA children. + * + * If `value` is not supplied (or null/undefined), user actions that affect the + * value will trigger updates to the element. + * + * If `value` is supplied (and not null/undefined), the rendered element will + * not trigger updates to the element. Instead, the `value` prop must change in + * order for the rendered element to be updated. + * + * The rendered element will be initialized with an empty value, the prop + * `defaultValue` if specified, or the children content (deprecated). + */ +function getHostProps$3(element, props) { + var node = element; + + if (!(props.dangerouslySetInnerHTML == null)) { + { + throw Error( "`dangerouslySetInnerHTML` does not make sense on <textarea>." ); + } + } // Always set children to the same thing. In IE9, the selection range will + // get reset if `textContent` is mutated. We could add a check in setTextContent + // to only set the value if/when the value differs from the node value (which would + // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this + // solution. The value can be a boolean or object so that's why it's forced + // to be a string. + + + var hostProps = _assign({}, props, { + value: undefined, + defaultValue: undefined, + children: toString(node._wrapperState.initialValue) + }); + + return hostProps; +} +function initWrapperState$2(element, props) { + var node = element; + + { + checkControlledValueProps('textarea', props); + + if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) { + error('%s contains a textarea with both value and defaultValue props. ' + 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component'); + + didWarnValDefaultVal = true; + } + } + + var initialValue = props.value; // Only bother fetching default value if we're going to use it + + if (initialValue == null) { + var children = props.children, + defaultValue = props.defaultValue; + + if (children != null) { + { + error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.'); + } + + { + if (!(defaultValue == null)) { + { + throw Error( "If you supply `defaultValue` on a <textarea>, do not pass children." ); + } + } + + if (Array.isArray(children)) { + if (!(children.length <= 1)) { + { + throw Error( "<textarea> can only have at most one child." ); + } + } + + children = children[0]; + } + + defaultValue = children; + } + } + + if (defaultValue == null) { + defaultValue = ''; + } + + initialValue = defaultValue; + } + + node._wrapperState = { + initialValue: getToStringValue(initialValue) + }; +} +function updateWrapper$1(element, props) { + var node = element; + var value = getToStringValue(props.value); + var defaultValue = getToStringValue(props.defaultValue); + + if (value != null) { + // Cast `value` to a string to ensure the value is set correctly. While + // browsers typically do this as necessary, jsdom doesn't. + var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed + + if (newValue !== node.value) { + node.value = newValue; + } + + if (props.defaultValue == null && node.defaultValue !== newValue) { + node.defaultValue = newValue; + } + } + + if (defaultValue != null) { + node.defaultValue = toString(defaultValue); + } +} +function postMountWrapper$3(element, props) { + var node = element; // This is in postMount because we need access to the DOM node, which is not + // available until after the component has mounted. + + var textContent = node.textContent; // Only set node.value if textContent is equal to the expected + // initial value. In IE10/IE11 there is a bug where the placeholder attribute + // will populate textContent as well. + // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/ + + if (textContent === node._wrapperState.initialValue) { + if (textContent !== '' && textContent !== null) { + node.value = textContent; + } + } +} +function restoreControlledState$2(element, props) { + // DOM component is still mounted; update + updateWrapper$1(element, props); +} + +var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'; +var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML'; +var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; +var Namespaces = { + html: HTML_NAMESPACE, + mathml: MATH_NAMESPACE, + svg: SVG_NAMESPACE +}; // Assumes there is no parent namespace. + +function getIntrinsicNamespace(type) { + switch (type) { + case 'svg': + return SVG_NAMESPACE; + + case 'math': + return MATH_NAMESPACE; + + default: + return HTML_NAMESPACE; + } +} +function getChildNamespace(parentNamespace, type) { + if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) { + // No (or default) parent namespace: potential entry point. + return getIntrinsicNamespace(type); + } + + if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') { + // We're leaving SVG. + return HTML_NAMESPACE; + } // By default, pass namespace below. + + + return parentNamespace; +} + +/* globals MSApp */ + +/** + * Create a function which has 'unsafe' privileges (required by windows8 apps) + */ +var createMicrosoftUnsafeLocalFunction = function (func) { + if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { + return function (arg0, arg1, arg2, arg3) { + MSApp.execUnsafeLocalFunction(function () { + return func(arg0, arg1, arg2, arg3); + }); + }; + } else { + return func; + } +}; + +var reusableSVGContainer; +/** + * Set the innerHTML property of a node + * + * @param {DOMElement} node + * @param {string} html + * @internal + */ + +var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) { + if (node.namespaceURI === Namespaces.svg) { + + if (!('innerHTML' in node)) { + // IE does not have innerHTML for SVG nodes, so instead we inject the + // new markup in a temp node and then move the child nodes across into + // the target node + reusableSVGContainer = reusableSVGContainer || document.createElement('div'); + reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>'; + var svgNode = reusableSVGContainer.firstChild; + + while (node.firstChild) { + node.removeChild(node.firstChild); + } + + while (svgNode.firstChild) { + node.appendChild(svgNode.firstChild); + } + + return; + } + } + + node.innerHTML = html; +}); + +/** + * HTML nodeType values that represent the type of the node + */ +var ELEMENT_NODE = 1; +var TEXT_NODE = 3; +var COMMENT_NODE = 8; +var DOCUMENT_NODE = 9; +var DOCUMENT_FRAGMENT_NODE = 11; + +/** + * Set the textContent property of a node. For text updates, it's faster + * to set the `nodeValue` of the Text node directly instead of using + * `.textContent` which will remove the existing node and create a new one. + * + * @param {DOMElement} node + * @param {string} text + * @internal + */ + +var setTextContent = function (node, text) { + if (text) { + var firstChild = node.firstChild; + + if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) { + firstChild.nodeValue = text; + return; + } + } + + node.textContent = text; +}; + +// List derived from Gecko source code: +// https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js +var shorthandToLonghand = { + animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'], + background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'], + backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'], + border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'], + borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'], + borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'], + borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'], + borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'], + borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'], + borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'], + borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'], + borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'], + borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'], + borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'], + borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'], + borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'], + borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'], + columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'], + columns: ['columnCount', 'columnWidth'], + flex: ['flexBasis', 'flexGrow', 'flexShrink'], + flexFlow: ['flexDirection', 'flexWrap'], + font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'], + fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'], + gap: ['columnGap', 'rowGap'], + grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], + gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'], + gridColumn: ['gridColumnEnd', 'gridColumnStart'], + gridColumnGap: ['columnGap'], + gridGap: ['columnGap', 'rowGap'], + gridRow: ['gridRowEnd', 'gridRowStart'], + gridRowGap: ['rowGap'], + gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'], + listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'], + margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'], + marker: ['markerEnd', 'markerMid', 'markerStart'], + mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'], + maskPosition: ['maskPositionX', 'maskPositionY'], + outline: ['outlineColor', 'outlineStyle', 'outlineWidth'], + overflow: ['overflowX', 'overflowY'], + padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'], + placeContent: ['alignContent', 'justifyContent'], + placeItems: ['alignItems', 'justifyItems'], + placeSelf: ['alignSelf', 'justifySelf'], + textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'], + textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'], + transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'], + wordWrap: ['overflowWrap'] +}; + +/** + * CSS properties which accept numbers but are not in units of "px". + */ +var isUnitlessNumber = { + animationIterationCount: true, + borderImageOutset: true, + borderImageSlice: true, + borderImageWidth: true, + boxFlex: true, + boxFlexGroup: true, + boxOrdinalGroup: true, + columnCount: true, + columns: true, + flex: true, + flexGrow: true, + flexPositive: true, + flexShrink: true, + flexNegative: true, + flexOrder: true, + gridArea: true, + gridRow: true, + gridRowEnd: true, + gridRowSpan: true, + gridRowStart: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnSpan: true, + gridColumnStart: true, + fontWeight: true, + lineClamp: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + tabSize: true, + widows: true, + zIndex: true, + zoom: true, + // SVG-related properties + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeDasharray: true, + strokeDashoffset: true, + strokeMiterlimit: true, + strokeOpacity: true, + strokeWidth: true +}; +/** + * @param {string} prefix vendor-specific prefix, eg: Webkit + * @param {string} key style name, eg: transitionDuration + * @return {string} style name prefixed with `prefix`, properly camelCased, eg: + * WebkitTransitionDuration + */ + +function prefixKey(prefix, key) { + return prefix + key.charAt(0).toUpperCase() + key.substring(1); +} +/** + * Support style names that may come passed in prefixed by adding permutations + * of vendor prefixes. + */ + + +var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an +// infinite loop, because it iterates over the newly added props too. + +Object.keys(isUnitlessNumber).forEach(function (prop) { + prefixes.forEach(function (prefix) { + isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; + }); +}); + +/** + * Convert a value into the proper css writable value. The style name `name` + * should be logical (no hyphens), as specified + * in `CSSProperty.isUnitlessNumber`. + * + * @param {string} name CSS property name such as `topMargin`. + * @param {*} value CSS property value such as `10px`. + * @return {string} Normalized style value with dimensions applied. + */ + +function dangerousStyleValue(name, value, isCustomProperty) { + // Note that we've removed escapeTextForBrowser() calls here since the + // whole string will be escaped when the attribute is injected into + // the markup. If you provide unsafe user data here they can inject + // arbitrary CSS which may be problematic (I couldn't repro this): + // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ + // This is not an XSS hole but instead a potential CSS injection issue + // which has lead to a greater discussion about how we're going to + // trust URLs moving forward. See #2115901 + var isEmpty = value == null || typeof value === 'boolean' || value === ''; + + if (isEmpty) { + return ''; + } + + if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) { + return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers + } + + return ('' + value).trim(); +} + +var uppercasePattern = /([A-Z])/g; +var msPattern = /^ms-/; +/** + * Hyphenates a camelcased CSS property name, for example: + * + * > hyphenateStyleName('backgroundColor') + * < "background-color" + * > hyphenateStyleName('MozTransition') + * < "-moz-transition" + * > hyphenateStyleName('msTransition') + * < "-ms-transition" + * + * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix + * is converted to `-ms-`. + */ + +function hyphenateStyleName(name) { + return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-'); +} + +var warnValidStyle = function () {}; + +{ + // 'msTransform' is correct, but the other prefixes should be capitalized + var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; + var msPattern$1 = /^-ms-/; + var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon + + var badStyleValueWithSemicolonPattern = /;\s*$/; + var warnedStyleNames = {}; + var warnedStyleValues = {}; + var warnedForNaNValue = false; + var warnedForInfinityValue = false; + + var camelize = function (string) { + return string.replace(hyphenPattern, function (_, character) { + return character.toUpperCase(); + }); + }; + + var warnHyphenatedStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + + error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests + // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix + // is converted to lowercase `ms`. + camelize(name.replace(msPattern$1, 'ms-'))); + }; + + var warnBadVendoredStyleName = function (name) { + if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { + return; + } + + warnedStyleNames[name] = true; + + error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1)); + }; + + var warnStyleValueWithSemicolon = function (name, value) { + if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { + return; + } + + warnedStyleValues[value] = true; + + error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, '')); + }; + + var warnStyleValueIsNaN = function (name, value) { + if (warnedForNaNValue) { + return; + } + + warnedForNaNValue = true; + + error('`NaN` is an invalid value for the `%s` css style property.', name); + }; + + var warnStyleValueIsInfinity = function (name, value) { + if (warnedForInfinityValue) { + return; + } + + warnedForInfinityValue = true; + + error('`Infinity` is an invalid value for the `%s` css style property.', name); + }; + + warnValidStyle = function (name, value) { + if (name.indexOf('-') > -1) { + warnHyphenatedStyleName(name); + } else if (badVendoredStyleNamePattern.test(name)) { + warnBadVendoredStyleName(name); + } else if (badStyleValueWithSemicolonPattern.test(value)) { + warnStyleValueWithSemicolon(name, value); + } + + if (typeof value === 'number') { + if (isNaN(value)) { + warnStyleValueIsNaN(name, value); + } else if (!isFinite(value)) { + warnStyleValueIsInfinity(name, value); + } + } + }; +} + +var warnValidStyle$1 = warnValidStyle; + +/** + * Operations for dealing with CSS properties. + */ + +/** + * This creates a string that is expected to be equivalent to the style + * attribute generated by server-side rendering. It by-passes warnings and + * security checks so it's not safe to use this value for anything other than + * comparison. It is only used in DEV for SSR validation. + */ + +function createDangerousStringForStyles(styles) { + { + var serialized = ''; + var delimiter = ''; + + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + + var styleValue = styles[styleName]; + + if (styleValue != null) { + var isCustomProperty = styleName.indexOf('--') === 0; + serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':'; + serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty); + delimiter = ';'; + } + } + + return serialized || null; + } +} +/** + * Sets the value for multiple styles on a node. If a value is specified as + * '' (empty string), the corresponding style property will be unset. + * + * @param {DOMElement} node + * @param {object} styles + */ + +function setValueForStyles(node, styles) { + var style = node.style; + + for (var styleName in styles) { + if (!styles.hasOwnProperty(styleName)) { + continue; + } + + var isCustomProperty = styleName.indexOf('--') === 0; + + { + if (!isCustomProperty) { + warnValidStyle$1(styleName, styles[styleName]); + } + } + + var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty); + + if (styleName === 'float') { + styleName = 'cssFloat'; + } + + if (isCustomProperty) { + style.setProperty(styleName, styleValue); + } else { + style[styleName] = styleValue; + } + } +} + +function isValueEmpty(value) { + return value == null || typeof value === 'boolean' || value === ''; +} +/** + * Given {color: 'red', overflow: 'hidden'} returns { + * color: 'color', + * overflowX: 'overflow', + * overflowY: 'overflow', + * }. This can be read as "the overflowY property was set by the overflow + * shorthand". That is, the values are the property that each was derived from. + */ + + +function expandShorthandMap(styles) { + var expanded = {}; + + for (var key in styles) { + var longhands = shorthandToLonghand[key] || [key]; + + for (var i = 0; i < longhands.length; i++) { + expanded[longhands[i]] = key; + } + } + + return expanded; +} +/** + * When mixing shorthand and longhand property names, we warn during updates if + * we expect an incorrect result to occur. In particular, we warn for: + * + * Updating a shorthand property (longhand gets overwritten): + * {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'} + * becomes .style.font = 'baz' + * Removing a shorthand property (longhand gets lost too): + * {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'} + * becomes .style.font = '' + * Removing a longhand property (should revert to shorthand; doesn't): + * {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'} + * becomes .style.fontVariant = '' + */ + + +function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) { + { + if (!nextStyles) { + return; + } + + var expandedUpdates = expandShorthandMap(styleUpdates); + var expandedStyles = expandShorthandMap(nextStyles); + var warnedAbout = {}; + + for (var key in expandedUpdates) { + var originalKey = expandedUpdates[key]; + var correctOriginalKey = expandedStyles[key]; + + if (correctOriginalKey && originalKey !== correctOriginalKey) { + var warningKey = originalKey + ',' + correctOriginalKey; + + if (warnedAbout[warningKey]) { + continue; + } + + warnedAbout[warningKey] = true; + + error('%s a style property during rerender (%s) when a ' + 'conflicting property is set (%s) can lead to styling bugs. To ' + "avoid this, don't mix shorthand and non-shorthand properties " + 'for the same value; instead, replace the shorthand with ' + 'separate values.', isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', originalKey, correctOriginalKey); + } + } + } +} + +// For HTML, certain tags should omit their close tag. We keep a list for +// those special-case tags. +var omittedCloseTags = { + area: true, + base: true, + br: true, + col: true, + embed: true, + hr: true, + img: true, + input: true, + keygen: true, + link: true, + meta: true, + param: true, + source: true, + track: true, + wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems. + +}; + +// `omittedCloseTags` except that `menuitem` should still have its closing tag. + +var voidElementTags = _assign({ + menuitem: true +}, omittedCloseTags); + +var HTML = '__html'; + +function assertValidProps(tag, props) { + if (!props) { + return; + } // Note the use of `==` which checks for null or undefined. + + + if (voidElementTags[tag]) { + if (!(props.children == null && props.dangerouslySetInnerHTML == null)) { + { + throw Error( tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`." ); + } + } + } + + if (props.dangerouslySetInnerHTML != null) { + if (!(props.children == null)) { + { + throw Error( "Can only set one of `children` or `props.dangerouslySetInnerHTML`." ); + } + } + + if (!(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML)) { + { + throw Error( "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://reactjs.org/link/dangerously-set-inner-html for more information." ); + } + } + } + + { + if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) { + error('A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.'); + } + } + + if (!(props.style == null || typeof props.style === 'object')) { + { + throw Error( "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX." ); + } + } +} + +function isCustomComponent(tagName, props) { + if (tagName.indexOf('-') === -1) { + return typeof props.is === 'string'; + } + + switch (tagName) { + // These are reserved SVG and MathML elements. + // We don't mind this list too much because we expect it to never grow. + // The alternative is to track the namespace in a few places which is convoluted. + // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts + case 'annotation-xml': + case 'color-profile': + case 'font-face': + case 'font-face-src': + case 'font-face-uri': + case 'font-face-format': + case 'font-face-name': + case 'missing-glyph': + return false; + + default: + return true; + } +} + +// When adding attributes to the HTML or SVG allowed attribute list, be sure to +// also add them to this module to ensure casing and incorrect name +// warnings. +var possibleStandardNames = { + // HTML + accept: 'accept', + acceptcharset: 'acceptCharset', + 'accept-charset': 'acceptCharset', + accesskey: 'accessKey', + action: 'action', + allowfullscreen: 'allowFullScreen', + alt: 'alt', + as: 'as', + async: 'async', + autocapitalize: 'autoCapitalize', + autocomplete: 'autoComplete', + autocorrect: 'autoCorrect', + autofocus: 'autoFocus', + autoplay: 'autoPlay', + autosave: 'autoSave', + capture: 'capture', + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing', + challenge: 'challenge', + charset: 'charSet', + checked: 'checked', + children: 'children', + cite: 'cite', + class: 'className', + classid: 'classID', + classname: 'className', + cols: 'cols', + colspan: 'colSpan', + content: 'content', + contenteditable: 'contentEditable', + contextmenu: 'contextMenu', + controls: 'controls', + controlslist: 'controlsList', + coords: 'coords', + crossorigin: 'crossOrigin', + dangerouslysetinnerhtml: 'dangerouslySetInnerHTML', + data: 'data', + datetime: 'dateTime', + default: 'default', + defaultchecked: 'defaultChecked', + defaultvalue: 'defaultValue', + defer: 'defer', + dir: 'dir', + disabled: 'disabled', + disablepictureinpicture: 'disablePictureInPicture', + disableremoteplayback: 'disableRemotePlayback', + download: 'download', + draggable: 'draggable', + enctype: 'encType', + enterkeyhint: 'enterKeyHint', + for: 'htmlFor', + form: 'form', + formmethod: 'formMethod', + formaction: 'formAction', + formenctype: 'formEncType', + formnovalidate: 'formNoValidate', + formtarget: 'formTarget', + frameborder: 'frameBorder', + headers: 'headers', + height: 'height', + hidden: 'hidden', + high: 'high', + href: 'href', + hreflang: 'hrefLang', + htmlfor: 'htmlFor', + httpequiv: 'httpEquiv', + 'http-equiv': 'httpEquiv', + icon: 'icon', + id: 'id', + innerhtml: 'innerHTML', + inputmode: 'inputMode', + integrity: 'integrity', + is: 'is', + itemid: 'itemID', + itemprop: 'itemProp', + itemref: 'itemRef', + itemscope: 'itemScope', + itemtype: 'itemType', + keyparams: 'keyParams', + keytype: 'keyType', + kind: 'kind', + label: 'label', + lang: 'lang', + list: 'list', + loop: 'loop', + low: 'low', + manifest: 'manifest', + marginwidth: 'marginWidth', + marginheight: 'marginHeight', + max: 'max', + maxlength: 'maxLength', + media: 'media', + mediagroup: 'mediaGroup', + method: 'method', + min: 'min', + minlength: 'minLength', + multiple: 'multiple', + muted: 'muted', + name: 'name', + nomodule: 'noModule', + nonce: 'nonce', + novalidate: 'noValidate', + open: 'open', + optimum: 'optimum', + pattern: 'pattern', + placeholder: 'placeholder', + playsinline: 'playsInline', + poster: 'poster', + preload: 'preload', + profile: 'profile', + radiogroup: 'radioGroup', + readonly: 'readOnly', + referrerpolicy: 'referrerPolicy', + rel: 'rel', + required: 'required', + reversed: 'reversed', + role: 'role', + rows: 'rows', + rowspan: 'rowSpan', + sandbox: 'sandbox', + scope: 'scope', + scoped: 'scoped', + scrolling: 'scrolling', + seamless: 'seamless', + selected: 'selected', + shape: 'shape', + size: 'size', + sizes: 'sizes', + span: 'span', + spellcheck: 'spellCheck', + src: 'src', + srcdoc: 'srcDoc', + srclang: 'srcLang', + srcset: 'srcSet', + start: 'start', + step: 'step', + style: 'style', + summary: 'summary', + tabindex: 'tabIndex', + target: 'target', + title: 'title', + type: 'type', + usemap: 'useMap', + value: 'value', + width: 'width', + wmode: 'wmode', + wrap: 'wrap', + // SVG + about: 'about', + accentheight: 'accentHeight', + 'accent-height': 'accentHeight', + accumulate: 'accumulate', + additive: 'additive', + alignmentbaseline: 'alignmentBaseline', + 'alignment-baseline': 'alignmentBaseline', + allowreorder: 'allowReorder', + alphabetic: 'alphabetic', + amplitude: 'amplitude', + arabicform: 'arabicForm', + 'arabic-form': 'arabicForm', + ascent: 'ascent', + attributename: 'attributeName', + attributetype: 'attributeType', + autoreverse: 'autoReverse', + azimuth: 'azimuth', + basefrequency: 'baseFrequency', + baselineshift: 'baselineShift', + 'baseline-shift': 'baselineShift', + baseprofile: 'baseProfile', + bbox: 'bbox', + begin: 'begin', + bias: 'bias', + by: 'by', + calcmode: 'calcMode', + capheight: 'capHeight', + 'cap-height': 'capHeight', + clip: 'clip', + clippath: 'clipPath', + 'clip-path': 'clipPath', + clippathunits: 'clipPathUnits', + cliprule: 'clipRule', + 'clip-rule': 'clipRule', + color: 'color', + colorinterpolation: 'colorInterpolation', + 'color-interpolation': 'colorInterpolation', + colorinterpolationfilters: 'colorInterpolationFilters', + 'color-interpolation-filters': 'colorInterpolationFilters', + colorprofile: 'colorProfile', + 'color-profile': 'colorProfile', + colorrendering: 'colorRendering', + 'color-rendering': 'colorRendering', + contentscripttype: 'contentScriptType', + contentstyletype: 'contentStyleType', + cursor: 'cursor', + cx: 'cx', + cy: 'cy', + d: 'd', + datatype: 'datatype', + decelerate: 'decelerate', + descent: 'descent', + diffuseconstant: 'diffuseConstant', + direction: 'direction', + display: 'display', + divisor: 'divisor', + dominantbaseline: 'dominantBaseline', + 'dominant-baseline': 'dominantBaseline', + dur: 'dur', + dx: 'dx', + dy: 'dy', + edgemode: 'edgeMode', + elevation: 'elevation', + enablebackground: 'enableBackground', + 'enable-background': 'enableBackground', + end: 'end', + exponent: 'exponent', + externalresourcesrequired: 'externalResourcesRequired', + fill: 'fill', + fillopacity: 'fillOpacity', + 'fill-opacity': 'fillOpacity', + fillrule: 'fillRule', + 'fill-rule': 'fillRule', + filter: 'filter', + filterres: 'filterRes', + filterunits: 'filterUnits', + floodopacity: 'floodOpacity', + 'flood-opacity': 'floodOpacity', + floodcolor: 'floodColor', + 'flood-color': 'floodColor', + focusable: 'focusable', + fontfamily: 'fontFamily', + 'font-family': 'fontFamily', + fontsize: 'fontSize', + 'font-size': 'fontSize', + fontsizeadjust: 'fontSizeAdjust', + 'font-size-adjust': 'fontSizeAdjust', + fontstretch: 'fontStretch', + 'font-stretch': 'fontStretch', + fontstyle: 'fontStyle', + 'font-style': 'fontStyle', + fontvariant: 'fontVariant', + 'font-variant': 'fontVariant', + fontweight: 'fontWeight', + 'font-weight': 'fontWeight', + format: 'format', + from: 'from', + fx: 'fx', + fy: 'fy', + g1: 'g1', + g2: 'g2', + glyphname: 'glyphName', + 'glyph-name': 'glyphName', + glyphorientationhorizontal: 'glyphOrientationHorizontal', + 'glyph-orientation-horizontal': 'glyphOrientationHorizontal', + glyphorientationvertical: 'glyphOrientationVertical', + 'glyph-orientation-vertical': 'glyphOrientationVertical', + glyphref: 'glyphRef', + gradienttransform: 'gradientTransform', + gradientunits: 'gradientUnits', + hanging: 'hanging', + horizadvx: 'horizAdvX', + 'horiz-adv-x': 'horizAdvX', + horizoriginx: 'horizOriginX', + 'horiz-origin-x': 'horizOriginX', + ideographic: 'ideographic', + imagerendering: 'imageRendering', + 'image-rendering': 'imageRendering', + in2: 'in2', + in: 'in', + inlist: 'inlist', + intercept: 'intercept', + k1: 'k1', + k2: 'k2', + k3: 'k3', + k4: 'k4', + k: 'k', + kernelmatrix: 'kernelMatrix', + kernelunitlength: 'kernelUnitLength', + kerning: 'kerning', + keypoints: 'keyPoints', + keysplines: 'keySplines', + keytimes: 'keyTimes', + lengthadjust: 'lengthAdjust', + letterspacing: 'letterSpacing', + 'letter-spacing': 'letterSpacing', + lightingcolor: 'lightingColor', + 'lighting-color': 'lightingColor', + limitingconeangle: 'limitingConeAngle', + local: 'local', + markerend: 'markerEnd', + 'marker-end': 'markerEnd', + markerheight: 'markerHeight', + markermid: 'markerMid', + 'marker-mid': 'markerMid', + markerstart: 'markerStart', + 'marker-start': 'markerStart', + markerunits: 'markerUnits', + markerwidth: 'markerWidth', + mask: 'mask', + maskcontentunits: 'maskContentUnits', + maskunits: 'maskUnits', + mathematical: 'mathematical', + mode: 'mode', + numoctaves: 'numOctaves', + offset: 'offset', + opacity: 'opacity', + operator: 'operator', + order: 'order', + orient: 'orient', + orientation: 'orientation', + origin: 'origin', + overflow: 'overflow', + overlineposition: 'overlinePosition', + 'overline-position': 'overlinePosition', + overlinethickness: 'overlineThickness', + 'overline-thickness': 'overlineThickness', + paintorder: 'paintOrder', + 'paint-order': 'paintOrder', + panose1: 'panose1', + 'panose-1': 'panose1', + pathlength: 'pathLength', + patterncontentunits: 'patternContentUnits', + patterntransform: 'patternTransform', + patternunits: 'patternUnits', + pointerevents: 'pointerEvents', + 'pointer-events': 'pointerEvents', + points: 'points', + pointsatx: 'pointsAtX', + pointsaty: 'pointsAtY', + pointsatz: 'pointsAtZ', + prefix: 'prefix', + preservealpha: 'preserveAlpha', + preserveaspectratio: 'preserveAspectRatio', + primitiveunits: 'primitiveUnits', + property: 'property', + r: 'r', + radius: 'radius', + refx: 'refX', + refy: 'refY', + renderingintent: 'renderingIntent', + 'rendering-intent': 'renderingIntent', + repeatcount: 'repeatCount', + repeatdur: 'repeatDur', + requiredextensions: 'requiredExtensions', + requiredfeatures: 'requiredFeatures', + resource: 'resource', + restart: 'restart', + result: 'result', + results: 'results', + rotate: 'rotate', + rx: 'rx', + ry: 'ry', + scale: 'scale', + security: 'security', + seed: 'seed', + shaperendering: 'shapeRendering', + 'shape-rendering': 'shapeRendering', + slope: 'slope', + spacing: 'spacing', + specularconstant: 'specularConstant', + specularexponent: 'specularExponent', + speed: 'speed', + spreadmethod: 'spreadMethod', + startoffset: 'startOffset', + stddeviation: 'stdDeviation', + stemh: 'stemh', + stemv: 'stemv', + stitchtiles: 'stitchTiles', + stopcolor: 'stopColor', + 'stop-color': 'stopColor', + stopopacity: 'stopOpacity', + 'stop-opacity': 'stopOpacity', + strikethroughposition: 'strikethroughPosition', + 'strikethrough-position': 'strikethroughPosition', + strikethroughthickness: 'strikethroughThickness', + 'strikethrough-thickness': 'strikethroughThickness', + string: 'string', + stroke: 'stroke', + strokedasharray: 'strokeDasharray', + 'stroke-dasharray': 'strokeDasharray', + strokedashoffset: 'strokeDashoffset', + 'stroke-dashoffset': 'strokeDashoffset', + strokelinecap: 'strokeLinecap', + 'stroke-linecap': 'strokeLinecap', + strokelinejoin: 'strokeLinejoin', + 'stroke-linejoin': 'strokeLinejoin', + strokemiterlimit: 'strokeMiterlimit', + 'stroke-miterlimit': 'strokeMiterlimit', + strokewidth: 'strokeWidth', + 'stroke-width': 'strokeWidth', + strokeopacity: 'strokeOpacity', + 'stroke-opacity': 'strokeOpacity', + suppresscontenteditablewarning: 'suppressContentEditableWarning', + suppresshydrationwarning: 'suppressHydrationWarning', + surfacescale: 'surfaceScale', + systemlanguage: 'systemLanguage', + tablevalues: 'tableValues', + targetx: 'targetX', + targety: 'targetY', + textanchor: 'textAnchor', + 'text-anchor': 'textAnchor', + textdecoration: 'textDecoration', + 'text-decoration': 'textDecoration', + textlength: 'textLength', + textrendering: 'textRendering', + 'text-rendering': 'textRendering', + to: 'to', + transform: 'transform', + typeof: 'typeof', + u1: 'u1', + u2: 'u2', + underlineposition: 'underlinePosition', + 'underline-position': 'underlinePosition', + underlinethickness: 'underlineThickness', + 'underline-thickness': 'underlineThickness', + unicode: 'unicode', + unicodebidi: 'unicodeBidi', + 'unicode-bidi': 'unicodeBidi', + unicoderange: 'unicodeRange', + 'unicode-range': 'unicodeRange', + unitsperem: 'unitsPerEm', + 'units-per-em': 'unitsPerEm', + unselectable: 'unselectable', + valphabetic: 'vAlphabetic', + 'v-alphabetic': 'vAlphabetic', + values: 'values', + vectoreffect: 'vectorEffect', + 'vector-effect': 'vectorEffect', + version: 'version', + vertadvy: 'vertAdvY', + 'vert-adv-y': 'vertAdvY', + vertoriginx: 'vertOriginX', + 'vert-origin-x': 'vertOriginX', + vertoriginy: 'vertOriginY', + 'vert-origin-y': 'vertOriginY', + vhanging: 'vHanging', + 'v-hanging': 'vHanging', + videographic: 'vIdeographic', + 'v-ideographic': 'vIdeographic', + viewbox: 'viewBox', + viewtarget: 'viewTarget', + visibility: 'visibility', + vmathematical: 'vMathematical', + 'v-mathematical': 'vMathematical', + vocab: 'vocab', + widths: 'widths', + wordspacing: 'wordSpacing', + 'word-spacing': 'wordSpacing', + writingmode: 'writingMode', + 'writing-mode': 'writingMode', + x1: 'x1', + x2: 'x2', + x: 'x', + xchannelselector: 'xChannelSelector', + xheight: 'xHeight', + 'x-height': 'xHeight', + xlinkactuate: 'xlinkActuate', + 'xlink:actuate': 'xlinkActuate', + xlinkarcrole: 'xlinkArcrole', + 'xlink:arcrole': 'xlinkArcrole', + xlinkhref: 'xlinkHref', + 'xlink:href': 'xlinkHref', + xlinkrole: 'xlinkRole', + 'xlink:role': 'xlinkRole', + xlinkshow: 'xlinkShow', + 'xlink:show': 'xlinkShow', + xlinktitle: 'xlinkTitle', + 'xlink:title': 'xlinkTitle', + xlinktype: 'xlinkType', + 'xlink:type': 'xlinkType', + xmlbase: 'xmlBase', + 'xml:base': 'xmlBase', + xmllang: 'xmlLang', + 'xml:lang': 'xmlLang', + xmlns: 'xmlns', + 'xml:space': 'xmlSpace', + xmlnsxlink: 'xmlnsXlink', + 'xmlns:xlink': 'xmlnsXlink', + xmlspace: 'xmlSpace', + y1: 'y1', + y2: 'y2', + y: 'y', + ychannelselector: 'yChannelSelector', + z: 'z', + zoomandpan: 'zoomAndPan' +}; + +var ariaProperties = { + 'aria-current': 0, + // state + 'aria-details': 0, + 'aria-disabled': 0, + // state + 'aria-hidden': 0, + // state + 'aria-invalid': 0, + // state + 'aria-keyshortcuts': 0, + 'aria-label': 0, + 'aria-roledescription': 0, + // Widget Attributes + 'aria-autocomplete': 0, + 'aria-checked': 0, + 'aria-expanded': 0, + 'aria-haspopup': 0, + 'aria-level': 0, + 'aria-modal': 0, + 'aria-multiline': 0, + 'aria-multiselectable': 0, + 'aria-orientation': 0, + 'aria-placeholder': 0, + 'aria-pressed': 0, + 'aria-readonly': 0, + 'aria-required': 0, + 'aria-selected': 0, + 'aria-sort': 0, + 'aria-valuemax': 0, + 'aria-valuemin': 0, + 'aria-valuenow': 0, + 'aria-valuetext': 0, + // Live Region Attributes + 'aria-atomic': 0, + 'aria-busy': 0, + 'aria-live': 0, + 'aria-relevant': 0, + // Drag-and-Drop Attributes + 'aria-dropeffect': 0, + 'aria-grabbed': 0, + // Relationship Attributes + 'aria-activedescendant': 0, + 'aria-colcount': 0, + 'aria-colindex': 0, + 'aria-colspan': 0, + 'aria-controls': 0, + 'aria-describedby': 0, + 'aria-errormessage': 0, + 'aria-flowto': 0, + 'aria-labelledby': 0, + 'aria-owns': 0, + 'aria-posinset': 0, + 'aria-rowcount': 0, + 'aria-rowindex': 0, + 'aria-rowspan': 0, + 'aria-setsize': 0 +}; + +var warnedProperties = {}; +var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); +var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); +var hasOwnProperty$1 = Object.prototype.hasOwnProperty; + +function validateProperty(tagName, name) { + { + if (hasOwnProperty$1.call(warnedProperties, name) && warnedProperties[name]) { + return true; + } + + if (rARIACamel.test(name)) { + var ariaName = 'aria-' + name.slice(4).toLowerCase(); + var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. + + if (correctName == null) { + error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name); + + warnedProperties[name] = true; + return true; + } // aria-* attributes should be lowercase; suggest the lowercase version. + + + if (name !== correctName) { + error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName); + + warnedProperties[name] = true; + return true; + } + } + + if (rARIA.test(name)) { + var lowerCasedName = name.toLowerCase(); + var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM + // DOM properties, then it is an invalid aria-* attribute. + + if (standardName == null) { + warnedProperties[name] = true; + return false; + } // aria-* attributes should be lowercase; suggest the lowercase version. + + + if (name !== standardName) { + error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName); + + warnedProperties[name] = true; + return true; + } + } + } + + return true; +} + +function warnInvalidARIAProps(type, props) { + { + var invalidProps = []; + + for (var key in props) { + var isValid = validateProperty(type, key); + + if (!isValid) { + invalidProps.push(key); + } + } + + var unknownPropString = invalidProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); + + if (invalidProps.length === 1) { + error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); + } else if (invalidProps.length > 1) { + error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type); + } + } +} + +function validateProperties(type, props) { + if (isCustomComponent(type, props)) { + return; + } + + warnInvalidARIAProps(type, props); +} + +var didWarnValueNull = false; +function validateProperties$1(type, props) { + { + if (type !== 'input' && type !== 'textarea' && type !== 'select') { + return; + } + + if (props != null && props.value === null && !didWarnValueNull) { + didWarnValueNull = true; + + if (type === 'select' && props.multiple) { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.', type); + } else { + error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type); + } + } + } +} + +var validateProperty$1 = function () {}; + +{ + var warnedProperties$1 = {}; + var _hasOwnProperty = Object.prototype.hasOwnProperty; + var EVENT_NAME_REGEX = /^on./; + var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/; + var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$'); + var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$'); + + validateProperty$1 = function (tagName, name, value, eventRegistry) { + if (_hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) { + return true; + } + + var lowerCasedName = name.toLowerCase(); + + if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') { + error('React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.'); + + warnedProperties$1[name] = true; + return true; + } // We can't rely on the event system being injected on the server. + + + if (eventRegistry != null) { + var registrationNameDependencies = eventRegistry.registrationNameDependencies, + possibleRegistrationNames = eventRegistry.possibleRegistrationNames; + + if (registrationNameDependencies.hasOwnProperty(name)) { + return true; + } + + var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null; + + if (registrationName != null) { + error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName); + + warnedProperties$1[name] = true; + return true; + } + + if (EVENT_NAME_REGEX.test(name)) { + error('Unknown event handler property `%s`. It will be ignored.', name); + + warnedProperties$1[name] = true; + return true; + } + } else if (EVENT_NAME_REGEX.test(name)) { + // If no event plugins have been injected, we are in a server environment. + // So we can't tell if the event name is correct for sure, but we can filter + // out known bad ones like `onclick`. We can't suggest a specific replacement though. + if (INVALID_EVENT_NAME_REGEX.test(name)) { + error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name); + } + + warnedProperties$1[name] = true; + return true; + } // Let the ARIA attribute hook validate ARIA attributes + + + if (rARIA$1.test(name) || rARIACamel$1.test(name)) { + return true; + } + + if (lowerCasedName === 'innerhtml') { + error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.'); + + warnedProperties$1[name] = true; + return true; + } + + if (lowerCasedName === 'aria') { + error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.'); + + warnedProperties$1[name] = true; + return true; + } + + if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') { + error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value); + + warnedProperties$1[name] = true; + return true; + } + + if (typeof value === 'number' && isNaN(value)) { + error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name); + + warnedProperties$1[name] = true; + return true; + } + + var propertyInfo = getPropertyInfo(name); + var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config. + + if (possibleStandardNames.hasOwnProperty(lowerCasedName)) { + var standardName = possibleStandardNames[lowerCasedName]; + + if (standardName !== name) { + error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName); + + warnedProperties$1[name] = true; + return true; + } + } else if (!isReserved && name !== lowerCasedName) { + // Unknown attributes should have lowercase casing since that's how they + // will be cased anyway with server rendering. + error('React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.', name, lowerCasedName); + + warnedProperties$1[name] = true; + return true; + } + + if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + if (value) { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.', value, name, name, value, name); + } else { + error('Received `%s` for a non-boolean attribute `%s`.\n\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s="%s" or %s={value.toString()}.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', value, name, name, value, name, name, name); + } + + warnedProperties$1[name] = true; + return true; + } // Now that we've validated casing, do not validate + // data types for reserved props + + + if (isReserved) { + return true; + } // Warn when a known attribute is a bad type + + + if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) { + warnedProperties$1[name] = true; + return false; + } // Warn when passing the strings 'false' or 'true' into a boolean prop + + + if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) { + error('Received the string `%s` for the boolean attribute `%s`. ' + '%s ' + 'Did you mean %s={%s}?', value, name, value === 'false' ? 'The browser will interpret it as a truthy value.' : 'Although this works, it will not work as expected if you pass the string "false".', name, value); + + warnedProperties$1[name] = true; + return true; + } + + return true; + }; +} + +var warnUnknownProperties = function (type, props, eventRegistry) { + { + var unknownProps = []; + + for (var key in props) { + var isValid = validateProperty$1(type, key, props[key], eventRegistry); + + if (!isValid) { + unknownProps.push(key); + } + } + + var unknownPropString = unknownProps.map(function (prop) { + return '`' + prop + '`'; + }).join(', '); + + if (unknownProps.length === 1) { + error('Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); + } else if (unknownProps.length > 1) { + error('Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://reactjs.org/link/attribute-behavior ', unknownPropString, type); + } + } +}; + +function validateProperties$2(type, props, eventRegistry) { + if (isCustomComponent(type, props)) { + return; + } + + warnUnknownProperties(type, props, eventRegistry); +} + +var IS_EVENT_HANDLE_NON_MANAGED_NODE = 1; +var IS_NON_DELEGATED = 1 << 1; +var IS_CAPTURE_PHASE = 1 << 2; +var IS_REPLAYED = 1 << 4; +// set to LEGACY_FB_SUPPORT. LEGACY_FB_SUPPORT only gets set when +// we call willDeferLaterForLegacyFBSupport, thus not bailing out +// will result in endless cycles like an infinite loop. +// We also don't want to defer during event replaying. + +var SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS = IS_EVENT_HANDLE_NON_MANAGED_NODE | IS_NON_DELEGATED | IS_CAPTURE_PHASE; + +/** + * Gets the target node from a native browser event by accounting for + * inconsistencies in browser DOM APIs. + * + * @param {object} nativeEvent Native browser event. + * @return {DOMEventTarget} Target node. + */ + +function getEventTarget(nativeEvent) { + // Fallback to nativeEvent.srcElement for IE9 + // https://github.com/facebook/react/issues/12506 + var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963 + + if (target.correspondingUseElement) { + target = target.correspondingUseElement; + } // Safari may fire events on text nodes (Node.TEXT_NODE is 3). + // @see http://www.quirksmode.org/js/events_properties.html + + + return target.nodeType === TEXT_NODE ? target.parentNode : target; +} + +var restoreImpl = null; +var restoreTarget = null; +var restoreQueue = null; + +function restoreStateOfTarget(target) { + // We perform this translation at the end of the event loop so that we + // always receive the correct fiber here + var internalInstance = getInstanceFromNode(target); + + if (!internalInstance) { + // Unmounted + return; + } + + if (!(typeof restoreImpl === 'function')) { + { + throw Error( "setRestoreImplementation() needs to be called to handle a target for controlled events. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted. + + if (stateNode) { + var _props = getFiberCurrentPropsFromNode(stateNode); + + restoreImpl(internalInstance.stateNode, internalInstance.type, _props); + } +} + +function setRestoreImplementation(impl) { + restoreImpl = impl; +} +function enqueueStateRestore(target) { + if (restoreTarget) { + if (restoreQueue) { + restoreQueue.push(target); + } else { + restoreQueue = [target]; + } + } else { + restoreTarget = target; + } +} +function needsStateRestore() { + return restoreTarget !== null || restoreQueue !== null; +} +function restoreStateIfNeeded() { + if (!restoreTarget) { + return; + } + + var target = restoreTarget; + var queuedTargets = restoreQueue; + restoreTarget = null; + restoreQueue = null; + restoreStateOfTarget(target); + + if (queuedTargets) { + for (var i = 0; i < queuedTargets.length; i++) { + restoreStateOfTarget(queuedTargets[i]); + } + } +} + +// the renderer. Such as when we're dispatching events or if third party +// libraries need to call batchedUpdates. Eventually, this API will go away when +// everything is batched by default. We'll then have a similar API to opt-out of +// scheduled work and instead do synchronous work. +// Defaults + +var batchedUpdatesImpl = function (fn, bookkeeping) { + return fn(bookkeeping); +}; + +var discreteUpdatesImpl = function (fn, a, b, c, d) { + return fn(a, b, c, d); +}; + +var flushDiscreteUpdatesImpl = function () {}; + +var batchedEventUpdatesImpl = batchedUpdatesImpl; +var isInsideEventHandler = false; +var isBatchingEventUpdates = false; + +function finishEventHandler() { + // Here we wait until all updates have propagated, which is important + // when using controlled components within layers: + // https://github.com/facebook/react/issues/1698 + // Then we restore state of any controlled component. + var controlledComponentsHavePendingUpdates = needsStateRestore(); + + if (controlledComponentsHavePendingUpdates) { + // If a controlled event was fired, we may need to restore the state of + // the DOM node back to the controlled value. This is necessary when React + // bails out of the update without touching the DOM. + flushDiscreteUpdatesImpl(); + restoreStateIfNeeded(); + } +} + +function batchedUpdates(fn, bookkeeping) { + if (isInsideEventHandler) { + // If we are currently inside another batch, we need to wait until it + // fully completes before restoring state. + return fn(bookkeeping); + } + + isInsideEventHandler = true; + + try { + return batchedUpdatesImpl(fn, bookkeeping); + } finally { + isInsideEventHandler = false; + finishEventHandler(); + } +} +function batchedEventUpdates(fn, a, b) { + if (isBatchingEventUpdates) { + // If we are currently inside another batch, we need to wait until it + // fully completes before restoring state. + return fn(a, b); + } + + isBatchingEventUpdates = true; + + try { + return batchedEventUpdatesImpl(fn, a, b); + } finally { + isBatchingEventUpdates = false; + finishEventHandler(); + } +} +function discreteUpdates(fn, a, b, c, d) { + var prevIsInsideEventHandler = isInsideEventHandler; + isInsideEventHandler = true; + + try { + return discreteUpdatesImpl(fn, a, b, c, d); + } finally { + isInsideEventHandler = prevIsInsideEventHandler; + + if (!isInsideEventHandler) { + finishEventHandler(); + } + } +} +function flushDiscreteUpdatesIfNeeded(timeStamp) { + { + if (!isInsideEventHandler) { + flushDiscreteUpdatesImpl(); + } + } +} +function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushDiscreteUpdatesImpl, _batchedEventUpdatesImpl) { + batchedUpdatesImpl = _batchedUpdatesImpl; + discreteUpdatesImpl = _discreteUpdatesImpl; + flushDiscreteUpdatesImpl = _flushDiscreteUpdatesImpl; + batchedEventUpdatesImpl = _batchedEventUpdatesImpl; +} + +function isInteractive(tag) { + return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea'; +} + +function shouldPreventMouseEvent(name, type, props) { + switch (name) { + case 'onClick': + case 'onClickCapture': + case 'onDoubleClick': + case 'onDoubleClickCapture': + case 'onMouseDown': + case 'onMouseDownCapture': + case 'onMouseMove': + case 'onMouseMoveCapture': + case 'onMouseUp': + case 'onMouseUpCapture': + case 'onMouseEnter': + return !!(props.disabled && isInteractive(type)); + + default: + return false; + } +} +/** + * @param {object} inst The instance, which is the source of events. + * @param {string} registrationName Name of listener (e.g. `onClick`). + * @return {?function} The stored callback. + */ + + +function getListener(inst, registrationName) { + var stateNode = inst.stateNode; + + if (stateNode === null) { + // Work in progress (ex: onload events in incremental mode). + return null; + } + + var props = getFiberCurrentPropsFromNode(stateNode); + + if (props === null) { + // Work in progress. + return null; + } + + var listener = props[registrationName]; + + if (shouldPreventMouseEvent(registrationName, inst.type, props)) { + return null; + } + + if (!(!listener || typeof listener === 'function')) { + { + throw Error( "Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type." ); + } + } + + return listener; +} + +var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners +// https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + +if (canUseDOM) { + try { + var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value + + Object.defineProperty(options, 'passive', { + get: function () { + passiveBrowserEventsSupported = true; + } + }); + window.addEventListener('test', options, options); + window.removeEventListener('test', options, options); + } catch (e) { + passiveBrowserEventsSupported = false; + } +} + +function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) { + var funcArgs = Array.prototype.slice.call(arguments, 3); + + try { + func.apply(context, funcArgs); + } catch (error) { + this.onError(error); + } +} + +var invokeGuardedCallbackImpl = invokeGuardedCallbackProd; + +{ + // In DEV mode, we swap out invokeGuardedCallback for a special version + // that plays more nicely with the browser's DevTools. The idea is to preserve + // "Pause on exceptions" behavior. Because React wraps all user-provided + // functions in invokeGuardedCallback, and the production version of + // invokeGuardedCallback uses a try-catch, all user exceptions are treated + // like caught exceptions, and the DevTools won't pause unless the developer + // takes the extra step of enabling pause on caught exceptions. This is + // unintuitive, though, because even though React has caught the error, from + // the developer's perspective, the error is uncaught. + // + // To preserve the expected "Pause on exceptions" behavior, we don't use a + // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake + // DOM node, and call the user-provided callback from inside an event handler + // for that fake event. If the callback throws, the error is "captured" using + // a global event handler. But because the error happens in a different + // event loop context, it does not interrupt the normal program flow. + // Effectively, this gives us try-catch behavior without actually using + // try-catch. Neat! + // Check that the browser supports the APIs we need to implement our special + // DEV version of invokeGuardedCallback + if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { + var fakeNode = document.createElement('react'); + + invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) { + // If document doesn't exist we know for sure we will crash in this method + // when we call document.createEvent(). However this can cause confusing + // errors: https://github.com/facebookincubator/create-react-app/issues/3482 + // So we preemptively throw with a better message instead. + if (!(typeof document !== 'undefined')) { + { + throw Error( "The `document` global was defined when React was initialized, but is not defined anymore. This can happen in a test environment if a component schedules an update from an asynchronous callback, but the test has already finished running. To solve this, you can either unmount the component at the end of your test (and ensure that any asynchronous operations get canceled in `componentWillUnmount`), or you can change the test itself to be asynchronous." ); + } + } + + var evt = document.createEvent('Event'); + var didCall = false; // Keeps track of whether the user-provided callback threw an error. We + // set this to true at the beginning, then set it to false right after + // calling the function. If the function errors, `didError` will never be + // set to false. This strategy works even if the browser is flaky and + // fails to call our global error handler, because it doesn't rely on + // the error event at all. + + var didError = true; // Keeps track of the value of window.event so that we can reset it + // during the callback to let user code access window.event in the + // browsers that support it. + + var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event + // dispatching: https://github.com/facebook/react/issues/13688 + + var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event'); + + function restoreAfterDispatch() { + // We immediately remove the callback from event listeners so that + // nested `invokeGuardedCallback` calls do not clash. Otherwise, a + // nested call would trigger the fake event handlers of any call higher + // in the stack. + fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the + // window.event assignment in both IE <= 10 as they throw an error + // "Member not found" in strict mode, and in Firefox which does not + // support window.event. + + if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) { + window.event = windowEvent; + } + } // Create an event handler for our fake event. We will synchronously + // dispatch our fake event using `dispatchEvent`. Inside the handler, we + // call the user-provided callback. + + + var funcArgs = Array.prototype.slice.call(arguments, 3); + + function callCallback() { + didCall = true; + restoreAfterDispatch(); + func.apply(context, funcArgs); + didError = false; + } // Create a global error event handler. We use this to capture the value + // that was thrown. It's possible that this error handler will fire more + // than once; for example, if non-React code also calls `dispatchEvent` + // and a handler for that event throws. We should be resilient to most of + // those cases. Even if our error event handler fires more than once, the + // last error event is always used. If the callback actually does error, + // we know that the last error event is the correct one, because it's not + // possible for anything else to have happened in between our callback + // erroring and the code that follows the `dispatchEvent` call below. If + // the callback doesn't error, but the error event was fired, we know to + // ignore it because `didError` will be false, as described above. + + + var error; // Use this to track whether the error event is ever called. + + var didSetError = false; + var isCrossOriginError = false; + + function handleWindowError(event) { + error = event.error; + didSetError = true; + + if (error === null && event.colno === 0 && event.lineno === 0) { + isCrossOriginError = true; + } + + if (event.defaultPrevented) { + // Some other error handler has prevented default. + // Browsers silence the error report if this happens. + // We'll remember this to later decide whether to log it or not. + if (error != null && typeof error === 'object') { + try { + error._suppressLogging = true; + } catch (inner) {// Ignore. + } + } + } + } // Create a fake event type. + + + var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers + + window.addEventListener('error', handleWindowError); + fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function + // errors, it will trigger our global error handler. + + evt.initEvent(evtType, false, false); + fakeNode.dispatchEvent(evt); + + if (windowEventDescriptor) { + Object.defineProperty(window, 'event', windowEventDescriptor); + } + + if (didCall && didError) { + if (!didSetError) { + // The callback errored, but the error event never fired. + error = new Error('An error was thrown inside one of your components, but React ' + "doesn't know what it was. This is likely due to browser " + 'flakiness. React does its best to preserve the "Pause on ' + 'exceptions" behavior of the DevTools, which requires some ' + "DEV-mode only tricks. It's possible that these don't work in " + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.'); + } else if (isCrossOriginError) { + error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://reactjs.org/link/crossorigin-error for more information.'); + } + + this.onError(error); + } // Remove our event listeners + + + window.removeEventListener('error', handleWindowError); + + if (!didCall) { + // Something went really wrong, and our event was not dispatched. + // https://github.com/facebook/react/issues/16734 + // https://github.com/facebook/react/issues/16585 + // Fall back to the production implementation. + restoreAfterDispatch(); + return invokeGuardedCallbackProd.apply(this, arguments); + } + }; + } +} + +var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl; + +var hasError = false; +var caughtError = null; // Used by event system to capture/rethrow the first error. + +var hasRethrowError = false; +var rethrowError = null; +var reporter = { + onError: function (error) { + hasError = true; + caughtError = error; + } +}; +/** + * Call a function while guarding against errors that happens within it. + * Returns an error if it throws, otherwise null. + * + * In production, this is implemented using a try-catch. The reason we don't + * use a try-catch directly is so that we can swap out a different + * implementation in DEV mode. + * + * @param {String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} context The context to use when calling the function + * @param {...*} args Arguments for function + */ + +function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) { + hasError = false; + caughtError = null; + invokeGuardedCallbackImpl$1.apply(reporter, arguments); +} +/** + * Same as invokeGuardedCallback, but instead of returning an error, it stores + * it in a global so it can be rethrown by `rethrowCaughtError` later. + * TODO: See if caughtError and rethrowError can be unified. + * + * @param {String} name of the guard to use for logging or debugging + * @param {Function} func The function to invoke + * @param {*} context The context to use when calling the function + * @param {...*} args Arguments for function + */ + +function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) { + invokeGuardedCallback.apply(this, arguments); + + if (hasError) { + var error = clearCaughtError(); + + if (!hasRethrowError) { + hasRethrowError = true; + rethrowError = error; + } + } +} +/** + * During execution of guarded functions we will capture the first error which + * we will rethrow to be handled by the top level error handler. + */ + +function rethrowCaughtError() { + if (hasRethrowError) { + var error = rethrowError; + hasRethrowError = false; + rethrowError = null; + throw error; + } +} +function hasCaughtError() { + return hasError; +} +function clearCaughtError() { + if (hasError) { + var error = caughtError; + hasError = false; + caughtError = null; + return error; + } else { + { + { + throw Error( "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } +} + +/** + * `ReactInstanceMap` maintains a mapping from a public facing stateful + * instance (key) and the internal representation (value). This allows public + * methods to accept the user facing instance as an argument and map them back + * to internal methods. + * + * Note that this module is currently shared and assumed to be stateless. + * If this becomes an actual Map, that will break. + */ +function get(key) { + return key._reactInternals; +} +function has(key) { + return key._reactInternals !== undefined; +} +function set(key, value) { + key._reactInternals = value; +} + +// Don't change these two values. They're used by React Dev Tools. +var NoFlags = +/* */ +0; +var PerformedWork = +/* */ +1; // You can change the rest (and add more). + +var Placement = +/* */ +2; +var Update = +/* */ +4; +var PlacementAndUpdate = +/* */ +6; +var Deletion = +/* */ +8; +var ContentReset = +/* */ +16; +var Callback = +/* */ +32; +var DidCapture = +/* */ +64; +var Ref = +/* */ +128; +var Snapshot = +/* */ +256; +var Passive = +/* */ +512; // TODO (effects) Remove this bit once the new reconciler is synced to the old. + +var PassiveUnmountPendingDev = +/* */ +8192; +var Hydrating = +/* */ +1024; +var HydratingAndUpdate = +/* */ +1028; // Passive & Update & Callback & Ref & Snapshot + +var LifecycleEffectMask = +/* */ +932; // Union of all host effects + +var HostEffectMask = +/* */ +2047; // These are not really side effects, but we still reuse this field. + +var Incomplete = +/* */ +2048; +var ShouldCapture = +/* */ +4096; +var ForceUpdateForLegacySuspense = +/* */ +16384; // Static tags describe aspects of a fiber that are not specific to a render, + +var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; +function getNearestMountedFiber(fiber) { + var node = fiber; + var nearestMounted = fiber; + + if (!fiber.alternate) { + // If there is no alternate, this might be a new tree that isn't inserted + // yet. If it is, then it will have a pending insertion effect on it. + var nextNode = node; + + do { + node = nextNode; + + if ((node.flags & (Placement | Hydrating)) !== NoFlags) { + // This is an insertion or in-progress hydration. The nearest possible + // mounted fiber is the parent but we need to continue to figure out + // if that one is still mounted. + nearestMounted = node.return; + } + + nextNode = node.return; + } while (nextNode); + } else { + while (node.return) { + node = node.return; + } + } + + if (node.tag === HostRoot) { + // TODO: Check if this was a nested HostRoot when used with + // renderContainerIntoSubtree. + return nearestMounted; + } // If we didn't hit the root, that means that we're in an disconnected tree + // that has been unmounted. + + + return null; +} +function getSuspenseInstanceFromFiber(fiber) { + if (fiber.tag === SuspenseComponent) { + var suspenseState = fiber.memoizedState; + + if (suspenseState === null) { + var current = fiber.alternate; + + if (current !== null) { + suspenseState = current.memoizedState; + } + } + + if (suspenseState !== null) { + return suspenseState.dehydrated; + } + } + + return null; +} +function getContainerFromFiber(fiber) { + return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null; +} +function isFiberMounted(fiber) { + return getNearestMountedFiber(fiber) === fiber; +} +function isMounted(component) { + { + var owner = ReactCurrentOwner.current; + + if (owner !== null && owner.tag === ClassComponent) { + var ownerFiber = owner; + var instance = ownerFiber.stateNode; + + if (!instance._warnedAboutRefsInRender) { + error('%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber.type) || 'A component'); + } + + instance._warnedAboutRefsInRender = true; + } + } + + var fiber = get(component); + + if (!fiber) { + return false; + } + + return getNearestMountedFiber(fiber) === fiber; +} + +function assertIsMounted(fiber) { + if (!(getNearestMountedFiber(fiber) === fiber)) { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } +} + +function findCurrentFiberUsingSlowPath(fiber) { + var alternate = fiber.alternate; + + if (!alternate) { + // If there is no alternate, then we only need to check if it is mounted. + var nearestMounted = getNearestMountedFiber(fiber); + + if (!(nearestMounted !== null)) { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + + if (nearestMounted !== fiber) { + return null; + } + + return fiber; + } // If we have two possible branches, we'll walk backwards up to the root + // to see what path the root points to. On the way we may hit one of the + // special cases and we'll deal with them. + + + var a = fiber; + var b = alternate; + + while (true) { + var parentA = a.return; + + if (parentA === null) { + // We're at the root. + break; + } + + var parentB = parentA.alternate; + + if (parentB === null) { + // There is no alternate. This is an unusual case. Currently, it only + // happens when a Suspense component is hidden. An extra fragment fiber + // is inserted in between the Suspense fiber and its children. Skip + // over this extra fragment fiber and proceed to the next parent. + var nextParent = parentA.return; + + if (nextParent !== null) { + a = b = nextParent; + continue; + } // If there's no parent, we're at the root. + + + break; + } // If both copies of the parent fiber point to the same child, we can + // assume that the child is current. This happens when we bailout on low + // priority: the bailed out fiber's child reuses the current child. + + + if (parentA.child === parentB.child) { + var child = parentA.child; + + while (child) { + if (child === a) { + // We've determined that A is the current branch. + assertIsMounted(parentA); + return fiber; + } + + if (child === b) { + // We've determined that B is the current branch. + assertIsMounted(parentA); + return alternate; + } + + child = child.sibling; + } // We should never have an alternate for any mounting node. So the only + // way this could possibly happen is if this was unmounted, if at all. + + + { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + } + + if (a.return !== b.return) { + // The return pointer of A and the return pointer of B point to different + // fibers. We assume that return pointers never criss-cross, so A must + // belong to the child set of A.return, and B must belong to the child + // set of B.return. + a = parentA; + b = parentB; + } else { + // The return pointers point to the same fiber. We'll have to use the + // default, slow path: scan the child sets of each parent alternate to see + // which child belongs to which set. + // + // Search parent A's child set + var didFindChild = false; + var _child = parentA.child; + + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentA; + b = parentB; + break; + } + + if (_child === b) { + didFindChild = true; + b = parentA; + a = parentB; + break; + } + + _child = _child.sibling; + } + + if (!didFindChild) { + // Search parent B's child set + _child = parentB.child; + + while (_child) { + if (_child === a) { + didFindChild = true; + a = parentB; + b = parentA; + break; + } + + if (_child === b) { + didFindChild = true; + b = parentB; + a = parentA; + break; + } + + _child = _child.sibling; + } + + if (!didFindChild) { + { + throw Error( "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue." ); + } + } + } + } + + if (!(a.alternate === b)) { + { + throw Error( "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } // If the root is not a host container, we're in a disconnected tree. I.e. + // unmounted. + + + if (!(a.tag === HostRoot)) { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + + if (a.stateNode.current === a) { + // We've determined that A is the current branch. + return fiber; + } // Otherwise B has to be current branch. + + + return alternate; +} +function findCurrentHostFiber(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); + + if (!currentParent) { + return null; + } // Next we'll drill down this component to find the first HostComponent/Text. + + + var node = currentParent; + + while (true) { + if (node.tag === HostComponent || node.tag === HostText) { + return node; + } else if (node.child) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === currentParent) { + return null; + } + + while (!node.sibling) { + if (!node.return || node.return === currentParent) { + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } // Flow needs the return null here, but ESLint complains about it. + // eslint-disable-next-line no-unreachable + + + return null; +} +function findCurrentHostFiberWithNoPortals(parent) { + var currentParent = findCurrentFiberUsingSlowPath(parent); + + if (!currentParent) { + return null; + } // Next we'll drill down this component to find the first HostComponent/Text. + + + var node = currentParent; + + while (true) { + if (node.tag === HostComponent || node.tag === HostText || enableFundamentalAPI ) { + return node; + } else if (node.child && node.tag !== HostPortal) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === currentParent) { + return null; + } + + while (!node.sibling) { + if (!node.return || node.return === currentParent) { + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } // Flow needs the return null here, but ESLint complains about it. + // eslint-disable-next-line no-unreachable + + + return null; +} +function doesFiberContain(parentFiber, childFiber) { + var node = childFiber; + var parentFiberAlternate = parentFiber.alternate; + + while (node !== null) { + if (node === parentFiber || node === parentFiberAlternate) { + return true; + } + + node = node.return; + } + + return false; +} + +var attemptUserBlockingHydration; +function setAttemptUserBlockingHydration(fn) { + attemptUserBlockingHydration = fn; +} +var attemptContinuousHydration; +function setAttemptContinuousHydration(fn) { + attemptContinuousHydration = fn; +} +var attemptHydrationAtCurrentPriority; +function setAttemptHydrationAtCurrentPriority(fn) { + attemptHydrationAtCurrentPriority = fn; +} +var attemptHydrationAtPriority; +function setAttemptHydrationAtPriority(fn) { + attemptHydrationAtPriority = fn; +} // TODO: Upgrade this definition once we're on a newer version of Flow that +var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed. + +var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout. +// if the last target was dehydrated. + +var queuedFocus = null; +var queuedDrag = null; +var queuedMouse = null; // For pointer events there can be one latest event per pointerId. + +var queuedPointers = new Map(); +var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too. + +var queuedExplicitHydrationTargets = []; +function hasQueuedDiscreteEvents() { + return queuedDiscreteEvents.length > 0; +} +var discreteReplayableEvents = ['mousedown', 'mouseup', 'touchcancel', 'touchend', 'touchstart', 'auxclick', 'dblclick', 'pointercancel', 'pointerdown', 'pointerup', 'dragend', 'dragstart', 'drop', 'compositionend', 'compositionstart', 'keydown', 'keypress', 'keyup', 'input', 'textInput', // Intentionally camelCase +'copy', 'cut', 'paste', 'click', 'change', 'contextmenu', 'reset', 'submit']; +function isReplayableDiscreteEvent(eventType) { + return discreteReplayableEvents.indexOf(eventType) > -1; +} + +function createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + return { + blockedOn: blockedOn, + domEventName: domEventName, + eventSystemFlags: eventSystemFlags | IS_REPLAYED, + nativeEvent: nativeEvent, + targetContainers: [targetContainer] + }; +} + +function queueDiscreteEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent); + queuedDiscreteEvents.push(queuedEvent); +} // Resets the replaying for this type of continuous event to no event. + +function clearIfContinuousEvent(domEventName, nativeEvent) { + switch (domEventName) { + case 'focusin': + case 'focusout': + queuedFocus = null; + break; + + case 'dragenter': + case 'dragleave': + queuedDrag = null; + break; + + case 'mouseover': + case 'mouseout': + queuedMouse = null; + break; + + case 'pointerover': + case 'pointerout': + { + var pointerId = nativeEvent.pointerId; + queuedPointers.delete(pointerId); + break; + } + + case 'gotpointercapture': + case 'lostpointercapture': + { + var _pointerId = nativeEvent.pointerId; + queuedPointerCaptures.delete(_pointerId); + break; + } + } +} + +function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) { + var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent); + + if (blockedOn !== null) { + var _fiber2 = getInstanceFromNode(blockedOn); + + if (_fiber2 !== null) { + // Attempt to increase the priority of this target. + attemptContinuousHydration(_fiber2); + } + } + + return queuedEvent; + } // If we have already queued this exact event, then it's because + // the different event systems have different DOM event listeners. + // We can accumulate the flags, and the targetContainers, and + // store a single event to be replayed. + + + existingQueuedEvent.eventSystemFlags |= eventSystemFlags; + var targetContainers = existingQueuedEvent.targetContainers; + + if (targetContainer !== null && targetContainers.indexOf(targetContainer) === -1) { + targetContainers.push(targetContainer); + } + + return existingQueuedEvent; +} + +function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) { + // These set relatedTarget to null because the replayed event will be treated as if we + // moved from outside the window (no target) onto the target once it hydrates. + // Instead of mutating we could clone the event. + switch (domEventName) { + case 'focusin': + { + var focusEvent = nativeEvent; + queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, focusEvent); + return true; + } + + case 'dragenter': + { + var dragEvent = nativeEvent; + queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, dragEvent); + return true; + } + + case 'mouseover': + { + var mouseEvent = nativeEvent; + queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, mouseEvent); + return true; + } + + case 'pointerover': + { + var pointerEvent = nativeEvent; + var pointerId = pointerEvent.pointerId; + queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, pointerEvent)); + return true; + } + + case 'gotpointercapture': + { + var _pointerEvent = nativeEvent; + var _pointerId2 = _pointerEvent.pointerId; + queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, _pointerEvent)); + return true; + } + } + + return false; +} // Check if this target is unblocked. Returns true if it's unblocked. + +function attemptExplicitHydrationTarget(queuedTarget) { + // TODO: This function shares a lot of logic with attemptToDispatchEvent. + // Try to unify them. It's a bit tricky since it would require two return + // values. + var targetInst = getClosestInstanceFromNode(queuedTarget.target); + + if (targetInst !== null) { + var nearestMounted = getNearestMountedFiber(targetInst); + + if (nearestMounted !== null) { + var tag = nearestMounted.tag; + + if (tag === SuspenseComponent) { + var instance = getSuspenseInstanceFromFiber(nearestMounted); + + if (instance !== null) { + // We're blocked on hydrating this boundary. + // Increase its priority. + queuedTarget.blockedOn = instance; + attemptHydrationAtPriority(queuedTarget.lanePriority, function () { + Scheduler.unstable_runWithPriority(queuedTarget.priority, function () { + attemptHydrationAtCurrentPriority(nearestMounted); + }); + }); + return; + } + } else if (tag === HostRoot) { + var root = nearestMounted.stateNode; + + if (root.hydrate) { + queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of + // a root other than sync. + + return; + } + } + } + } + + queuedTarget.blockedOn = null; +} + +function attemptReplayContinuousQueuedEvent(queuedEvent) { + if (queuedEvent.blockedOn !== null) { + return false; + } + + var targetContainers = queuedEvent.targetContainers; + + while (targetContainers.length > 0) { + var targetContainer = targetContainers[0]; + var nextBlockedOn = attemptToDispatchEvent(queuedEvent.domEventName, queuedEvent.eventSystemFlags, targetContainer, queuedEvent.nativeEvent); + + if (nextBlockedOn !== null) { + // We're still blocked. Try again later. + var _fiber3 = getInstanceFromNode(nextBlockedOn); + + if (_fiber3 !== null) { + attemptContinuousHydration(_fiber3); + } + + queuedEvent.blockedOn = nextBlockedOn; + return false; + } // This target container was successfully dispatched. Try the next. + + + targetContainers.shift(); + } + + return true; +} + +function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) { + if (attemptReplayContinuousQueuedEvent(queuedEvent)) { + map.delete(key); + } +} + +function replayUnblockedEvents() { + hasScheduledReplayAttempt = false; // First replay discrete events. + + while (queuedDiscreteEvents.length > 0) { + var nextDiscreteEvent = queuedDiscreteEvents[0]; + + if (nextDiscreteEvent.blockedOn !== null) { + // We're still blocked. + // Increase the priority of this boundary to unblock + // the next discrete event. + var _fiber4 = getInstanceFromNode(nextDiscreteEvent.blockedOn); + + if (_fiber4 !== null) { + attemptUserBlockingHydration(_fiber4); + } + + break; + } + + var targetContainers = nextDiscreteEvent.targetContainers; + + while (targetContainers.length > 0) { + var targetContainer = targetContainers[0]; + var nextBlockedOn = attemptToDispatchEvent(nextDiscreteEvent.domEventName, nextDiscreteEvent.eventSystemFlags, targetContainer, nextDiscreteEvent.nativeEvent); + + if (nextBlockedOn !== null) { + // We're still blocked. Try again later. + nextDiscreteEvent.blockedOn = nextBlockedOn; + break; + } // This target container was successfully dispatched. Try the next. + + + targetContainers.shift(); + } + + if (nextDiscreteEvent.blockedOn === null) { + // We've successfully replayed the first event. Let's try the next one. + queuedDiscreteEvents.shift(); + } + } // Next replay any continuous events. + + + if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) { + queuedFocus = null; + } + + if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) { + queuedDrag = null; + } + + if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) { + queuedMouse = null; + } + + queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap); + queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap); +} + +function scheduleCallbackIfUnblocked(queuedEvent, unblocked) { + if (queuedEvent.blockedOn === unblocked) { + queuedEvent.blockedOn = null; + + if (!hasScheduledReplayAttempt) { + hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are + // now unblocked. This first might not actually be unblocked yet. + // We could check it early to avoid scheduling an unnecessary callback. + + Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents); + } + } +} + +function retryIfBlockedOn(unblocked) { + // Mark anything that was blocked on this as no longer blocked + // and eligible for a replay. + if (queuedDiscreteEvents.length > 0) { + scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's + // worth it because we expect very few discrete events to queue up and once + // we are actually fully unblocked it will be fast to replay them. + + for (var i = 1; i < queuedDiscreteEvents.length; i++) { + var queuedEvent = queuedDiscreteEvents[i]; + + if (queuedEvent.blockedOn === unblocked) { + queuedEvent.blockedOn = null; + } + } + } + + if (queuedFocus !== null) { + scheduleCallbackIfUnblocked(queuedFocus, unblocked); + } + + if (queuedDrag !== null) { + scheduleCallbackIfUnblocked(queuedDrag, unblocked); + } + + if (queuedMouse !== null) { + scheduleCallbackIfUnblocked(queuedMouse, unblocked); + } + + var unblock = function (queuedEvent) { + return scheduleCallbackIfUnblocked(queuedEvent, unblocked); + }; + + queuedPointers.forEach(unblock); + queuedPointerCaptures.forEach(unblock); + + for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) { + var queuedTarget = queuedExplicitHydrationTargets[_i]; + + if (queuedTarget.blockedOn === unblocked) { + queuedTarget.blockedOn = null; + } + } + + while (queuedExplicitHydrationTargets.length > 0) { + var nextExplicitTarget = queuedExplicitHydrationTargets[0]; + + if (nextExplicitTarget.blockedOn !== null) { + // We're still blocked. + break; + } else { + attemptExplicitHydrationTarget(nextExplicitTarget); + + if (nextExplicitTarget.blockedOn === null) { + // We're unblocked. + queuedExplicitHydrationTargets.shift(); + } + } + } +} + +var DiscreteEvent = 0; +var UserBlockingEvent = 1; +var ContinuousEvent = 2; + +/** + * Generate a mapping of standard vendor prefixes using the defined style property and event name. + * + * @param {string} styleProp + * @param {string} eventName + * @returns {object} + */ + +function makePrefixMap(styleProp, eventName) { + var prefixes = {}; + prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); + prefixes['Webkit' + styleProp] = 'webkit' + eventName; + prefixes['Moz' + styleProp] = 'moz' + eventName; + return prefixes; +} +/** + * A list of event names to a configurable list of vendor prefixes. + */ + + +var vendorPrefixes = { + animationend: makePrefixMap('Animation', 'AnimationEnd'), + animationiteration: makePrefixMap('Animation', 'AnimationIteration'), + animationstart: makePrefixMap('Animation', 'AnimationStart'), + transitionend: makePrefixMap('Transition', 'TransitionEnd') +}; +/** + * Event names that have already been detected and prefixed (if applicable). + */ + +var prefixedEventNames = {}; +/** + * Element to check for prefixes on. + */ + +var style = {}; +/** + * Bootstrap if a DOM exists. + */ + +if (canUseDOM) { + style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x, + // the un-prefixed "animation" and "transition" properties are defined on the + // style object but the events that fire will still be prefixed, so we need + // to check if the un-prefixed events are usable, and if not remove them from the map. + + if (!('AnimationEvent' in window)) { + delete vendorPrefixes.animationend.animation; + delete vendorPrefixes.animationiteration.animation; + delete vendorPrefixes.animationstart.animation; + } // Same as above + + + if (!('TransitionEvent' in window)) { + delete vendorPrefixes.transitionend.transition; + } +} +/** + * Attempts to determine the correct vendor prefixed event name. + * + * @param {string} eventName + * @returns {string} + */ + + +function getVendorPrefixedEventName(eventName) { + if (prefixedEventNames[eventName]) { + return prefixedEventNames[eventName]; + } else if (!vendorPrefixes[eventName]) { + return eventName; + } + + var prefixMap = vendorPrefixes[eventName]; + + for (var styleProp in prefixMap) { + if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) { + return prefixedEventNames[eventName] = prefixMap[styleProp]; + } + } + + return eventName; +} + +var ANIMATION_END = getVendorPrefixedEventName('animationend'); +var ANIMATION_ITERATION = getVendorPrefixedEventName('animationiteration'); +var ANIMATION_START = getVendorPrefixedEventName('animationstart'); +var TRANSITION_END = getVendorPrefixedEventName('transitionend'); + +var topLevelEventsToReactNames = new Map(); +var eventPriorities = new Map(); // We store most of the events in this module in pairs of two strings so we can re-use +// the code required to apply the same logic for event prioritization and that of the +// SimpleEventPlugin. This complicates things slightly, but the aim is to reduce code +// duplication (for which there would be quite a bit). For the events that are not needed +// for the SimpleEventPlugin (otherDiscreteEvents) we process them separately as an +// array of top level events. +// Lastly, we ignore prettier so we can keep the formatting sane. +// prettier-ignore + +var discreteEventPairsForSimpleEventPlugin = ['cancel', 'cancel', 'click', 'click', 'close', 'close', 'contextmenu', 'contextMenu', 'copy', 'copy', 'cut', 'cut', 'auxclick', 'auxClick', 'dblclick', 'doubleClick', // Careful! +'dragend', 'dragEnd', 'dragstart', 'dragStart', 'drop', 'drop', 'focusin', 'focus', // Careful! +'focusout', 'blur', // Careful! +'input', 'input', 'invalid', 'invalid', 'keydown', 'keyDown', 'keypress', 'keyPress', 'keyup', 'keyUp', 'mousedown', 'mouseDown', 'mouseup', 'mouseUp', 'paste', 'paste', 'pause', 'pause', 'play', 'play', 'pointercancel', 'pointerCancel', 'pointerdown', 'pointerDown', 'pointerup', 'pointerUp', 'ratechange', 'rateChange', 'reset', 'reset', 'seeked', 'seeked', 'submit', 'submit', 'touchcancel', 'touchCancel', 'touchend', 'touchEnd', 'touchstart', 'touchStart', 'volumechange', 'volumeChange']; +var otherDiscreteEvents = ['change', 'selectionchange', 'textInput', 'compositionstart', 'compositionend', 'compositionupdate']; + + +var userBlockingPairsForSimpleEventPlugin = ['drag', 'drag', 'dragenter', 'dragEnter', 'dragexit', 'dragExit', 'dragleave', 'dragLeave', 'dragover', 'dragOver', 'mousemove', 'mouseMove', 'mouseout', 'mouseOut', 'mouseover', 'mouseOver', 'pointermove', 'pointerMove', 'pointerout', 'pointerOut', 'pointerover', 'pointerOver', 'scroll', 'scroll', 'toggle', 'toggle', 'touchmove', 'touchMove', 'wheel', 'wheel']; // prettier-ignore + +var continuousPairsForSimpleEventPlugin = ['abort', 'abort', ANIMATION_END, 'animationEnd', ANIMATION_ITERATION, 'animationIteration', ANIMATION_START, 'animationStart', 'canplay', 'canPlay', 'canplaythrough', 'canPlayThrough', 'durationchange', 'durationChange', 'emptied', 'emptied', 'encrypted', 'encrypted', 'ended', 'ended', 'error', 'error', 'gotpointercapture', 'gotPointerCapture', 'load', 'load', 'loadeddata', 'loadedData', 'loadedmetadata', 'loadedMetadata', 'loadstart', 'loadStart', 'lostpointercapture', 'lostPointerCapture', 'playing', 'playing', 'progress', 'progress', 'seeking', 'seeking', 'stalled', 'stalled', 'suspend', 'suspend', 'timeupdate', 'timeUpdate', TRANSITION_END, 'transitionEnd', 'waiting', 'waiting']; +/** + * Turns + * ['abort', ...] + * + * into + * + * topLevelEventsToReactNames = new Map([ + * ['abort', 'onAbort'], + * ]); + * + * and registers them. + */ + +function registerSimplePluginEventsAndSetTheirPriorities(eventTypes, priority) { + // As the event types are in pairs of two, we need to iterate + // through in twos. The events are in pairs of two to save code + // and improve init perf of processing this array, as it will + // result in far fewer object allocations and property accesses + // if we only use three arrays to process all the categories of + // instead of tuples. + for (var i = 0; i < eventTypes.length; i += 2) { + var topEvent = eventTypes[i]; + var event = eventTypes[i + 1]; + var capitalizedEvent = event[0].toUpperCase() + event.slice(1); + var reactName = 'on' + capitalizedEvent; + eventPriorities.set(topEvent, priority); + topLevelEventsToReactNames.set(topEvent, reactName); + registerTwoPhaseEvent(reactName, [topEvent]); + } +} + +function setEventPriorities(eventTypes, priority) { + for (var i = 0; i < eventTypes.length; i++) { + eventPriorities.set(eventTypes[i], priority); + } +} + +function getEventPriorityForPluginSystem(domEventName) { + var priority = eventPriorities.get(domEventName); // Default to a ContinuousEvent. Note: we might + // want to warn if we can't detect the priority + // for the event. + + return priority === undefined ? ContinuousEvent : priority; +} +function registerSimpleEvents() { + registerSimplePluginEventsAndSetTheirPriorities(discreteEventPairsForSimpleEventPlugin, DiscreteEvent); + registerSimplePluginEventsAndSetTheirPriorities(userBlockingPairsForSimpleEventPlugin, UserBlockingEvent); + registerSimplePluginEventsAndSetTheirPriorities(continuousPairsForSimpleEventPlugin, ContinuousEvent); + setEventPriorities(otherDiscreteEvents, DiscreteEvent); +} + +var Scheduler_now = Scheduler.unstable_now; + +{ + // Provide explicit error message when production+profiling bundle of e.g. + // react-dom is used with production (non-profiling) bundle of + // scheduler/tracing + if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) { + { + throw Error( "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://reactjs.org/link/profiling" ); + } + } +} +// ascending numbers so we can compare them like numbers. They start at 90 to +// avoid clashing with Scheduler's priorities. + +var ImmediatePriority = 99; +var UserBlockingPriority = 98; +var NormalPriority = 97; +var LowPriority = 96; +var IdlePriority = 95; // NoPriority is the absence of priority. Also React-only. + +var NoPriority = 90; +var initialTimeMs = Scheduler_now(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly. + +var SyncLanePriority = 15; +var SyncBatchedLanePriority = 14; +var InputDiscreteHydrationLanePriority = 13; +var InputDiscreteLanePriority = 12; +var InputContinuousHydrationLanePriority = 11; +var InputContinuousLanePriority = 10; +var DefaultHydrationLanePriority = 9; +var DefaultLanePriority = 8; +var TransitionHydrationPriority = 7; +var TransitionPriority = 6; +var RetryLanePriority = 5; +var SelectiveHydrationLanePriority = 4; +var IdleHydrationLanePriority = 3; +var IdleLanePriority = 2; +var OffscreenLanePriority = 1; +var NoLanePriority = 0; +var TotalLanes = 31; +var NoLanes = +/* */ +0; +var NoLane = +/* */ +0; +var SyncLane = +/* */ +1; +var SyncBatchedLane = +/* */ +2; +var InputDiscreteHydrationLane = +/* */ +4; +var InputDiscreteLanes = +/* */ +24; +var InputContinuousHydrationLane = +/* */ +32; +var InputContinuousLanes = +/* */ +192; +var DefaultHydrationLane = +/* */ +256; +var DefaultLanes = +/* */ +3584; +var TransitionHydrationLane = +/* */ +4096; +var TransitionLanes = +/* */ +4186112; +var RetryLanes = +/* */ +62914560; +var SomeRetryLane = +/* */ +33554432; +var SelectiveHydrationLane = +/* */ +67108864; +var NonIdleLanes = +/* */ +134217727; +var IdleHydrationLane = +/* */ +134217728; +var IdleLanes = +/* */ +805306368; +var OffscreenLane = +/* */ +1073741824; +var NoTimestamp = -1; +function setCurrentUpdateLanePriority(newLanePriority) { +} // "Registers" used to "return" multiple values +// Used by getHighestPriorityLanes and getNextLanes: + +var return_highestLanePriority = DefaultLanePriority; + +function getHighestPriorityLanes(lanes) { + if ((SyncLane & lanes) !== NoLanes) { + return_highestLanePriority = SyncLanePriority; + return SyncLane; + } + + if ((SyncBatchedLane & lanes) !== NoLanes) { + return_highestLanePriority = SyncBatchedLanePriority; + return SyncBatchedLane; + } + + if ((InputDiscreteHydrationLane & lanes) !== NoLanes) { + return_highestLanePriority = InputDiscreteHydrationLanePriority; + return InputDiscreteHydrationLane; + } + + var inputDiscreteLanes = InputDiscreteLanes & lanes; + + if (inputDiscreteLanes !== NoLanes) { + return_highestLanePriority = InputDiscreteLanePriority; + return inputDiscreteLanes; + } + + if ((lanes & InputContinuousHydrationLane) !== NoLanes) { + return_highestLanePriority = InputContinuousHydrationLanePriority; + return InputContinuousHydrationLane; + } + + var inputContinuousLanes = InputContinuousLanes & lanes; + + if (inputContinuousLanes !== NoLanes) { + return_highestLanePriority = InputContinuousLanePriority; + return inputContinuousLanes; + } + + if ((lanes & DefaultHydrationLane) !== NoLanes) { + return_highestLanePriority = DefaultHydrationLanePriority; + return DefaultHydrationLane; + } + + var defaultLanes = DefaultLanes & lanes; + + if (defaultLanes !== NoLanes) { + return_highestLanePriority = DefaultLanePriority; + return defaultLanes; + } + + if ((lanes & TransitionHydrationLane) !== NoLanes) { + return_highestLanePriority = TransitionHydrationPriority; + return TransitionHydrationLane; + } + + var transitionLanes = TransitionLanes & lanes; + + if (transitionLanes !== NoLanes) { + return_highestLanePriority = TransitionPriority; + return transitionLanes; + } + + var retryLanes = RetryLanes & lanes; + + if (retryLanes !== NoLanes) { + return_highestLanePriority = RetryLanePriority; + return retryLanes; + } + + if (lanes & SelectiveHydrationLane) { + return_highestLanePriority = SelectiveHydrationLanePriority; + return SelectiveHydrationLane; + } + + if ((lanes & IdleHydrationLane) !== NoLanes) { + return_highestLanePriority = IdleHydrationLanePriority; + return IdleHydrationLane; + } + + var idleLanes = IdleLanes & lanes; + + if (idleLanes !== NoLanes) { + return_highestLanePriority = IdleLanePriority; + return idleLanes; + } + + if ((OffscreenLane & lanes) !== NoLanes) { + return_highestLanePriority = OffscreenLanePriority; + return OffscreenLane; + } + + { + error('Should have found matching lanes. This is a bug in React.'); + } // This shouldn't be reachable, but as a fallback, return the entire bitmask. + + + return_highestLanePriority = DefaultLanePriority; + return lanes; +} + +function schedulerPriorityToLanePriority(schedulerPriorityLevel) { + switch (schedulerPriorityLevel) { + case ImmediatePriority: + return SyncLanePriority; + + case UserBlockingPriority: + return InputContinuousLanePriority; + + case NormalPriority: + case LowPriority: + // TODO: Handle LowSchedulerPriority, somehow. Maybe the same lane as hydration. + return DefaultLanePriority; + + case IdlePriority: + return IdleLanePriority; + + default: + return NoLanePriority; + } +} +function lanePriorityToSchedulerPriority(lanePriority) { + switch (lanePriority) { + case SyncLanePriority: + case SyncBatchedLanePriority: + return ImmediatePriority; + + case InputDiscreteHydrationLanePriority: + case InputDiscreteLanePriority: + case InputContinuousHydrationLanePriority: + case InputContinuousLanePriority: + return UserBlockingPriority; + + case DefaultHydrationLanePriority: + case DefaultLanePriority: + case TransitionHydrationPriority: + case TransitionPriority: + case SelectiveHydrationLanePriority: + case RetryLanePriority: + return NormalPriority; + + case IdleHydrationLanePriority: + case IdleLanePriority: + case OffscreenLanePriority: + return IdlePriority; + + case NoLanePriority: + return NoPriority; + + default: + { + { + throw Error( "Invalid update priority: " + lanePriority + ". This is a bug in React." ); + } + } + + } +} +function getNextLanes(root, wipLanes) { + // Early bailout if there's no pending work left. + var pendingLanes = root.pendingLanes; + + if (pendingLanes === NoLanes) { + return_highestLanePriority = NoLanePriority; + return NoLanes; + } + + var nextLanes = NoLanes; + var nextLanePriority = NoLanePriority; + var expiredLanes = root.expiredLanes; + var suspendedLanes = root.suspendedLanes; + var pingedLanes = root.pingedLanes; // Check if any work has expired. + + if (expiredLanes !== NoLanes) { + nextLanes = expiredLanes; + nextLanePriority = return_highestLanePriority = SyncLanePriority; + } else { + // Do not work on any idle work until all the non-idle work has finished, + // even if the work is suspended. + var nonIdlePendingLanes = pendingLanes & NonIdleLanes; + + if (nonIdlePendingLanes !== NoLanes) { + var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes; + + if (nonIdleUnblockedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes); + nextLanePriority = return_highestLanePriority; + } else { + var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes; + + if (nonIdlePingedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(nonIdlePingedLanes); + nextLanePriority = return_highestLanePriority; + } + } + } else { + // The only remaining work is Idle. + var unblockedLanes = pendingLanes & ~suspendedLanes; + + if (unblockedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(unblockedLanes); + nextLanePriority = return_highestLanePriority; + } else { + if (pingedLanes !== NoLanes) { + nextLanes = getHighestPriorityLanes(pingedLanes); + nextLanePriority = return_highestLanePriority; + } + } + } + } + + if (nextLanes === NoLanes) { + // This should only be reachable if we're suspended + // TODO: Consider warning in this path if a fallback timer is not scheduled. + return NoLanes; + } // If there are higher priority lanes, we'll include them even if they + // are suspended. + + + nextLanes = pendingLanes & getEqualOrHigherPriorityLanes(nextLanes); // If we're already in the middle of a render, switching lanes will interrupt + // it and we'll lose our progress. We should only do this if the new lanes are + // higher priority. + + if (wipLanes !== NoLanes && wipLanes !== nextLanes && // If we already suspended with a delay, then interrupting is fine. Don't + // bother waiting until the root is complete. + (wipLanes & suspendedLanes) === NoLanes) { + getHighestPriorityLanes(wipLanes); + var wipLanePriority = return_highestLanePriority; + + if (nextLanePriority <= wipLanePriority) { + return wipLanes; + } else { + return_highestLanePriority = nextLanePriority; + } + } // Check for entangled lanes and add them to the batch. + // + // A lane is said to be entangled with another when it's not allowed to render + // in a batch that does not also include the other lane. Typically we do this + // when multiple updates have the same source, and we only want to respond to + // the most recent event from that source. + // + // Note that we apply entanglements *after* checking for partial work above. + // This means that if a lane is entangled during an interleaved event while + // it's already rendering, we won't interrupt it. This is intentional, since + // entanglement is usually "best effort": we'll try our best to render the + // lanes in the same batch, but it's not worth throwing out partially + // completed work in order to do it. + // + // For those exceptions where entanglement is semantically important, like + // useMutableSource, we should ensure that there is no partial work at the + // time we apply the entanglement. + + + var entangledLanes = root.entangledLanes; + + if (entangledLanes !== NoLanes) { + var entanglements = root.entanglements; + var lanes = nextLanes & entangledLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + nextLanes |= entanglements[index]; + lanes &= ~lane; + } + } + + return nextLanes; +} +function getMostRecentEventTime(root, lanes) { + var eventTimes = root.eventTimes; + var mostRecentEventTime = NoTimestamp; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + var eventTime = eventTimes[index]; + + if (eventTime > mostRecentEventTime) { + mostRecentEventTime = eventTime; + } + + lanes &= ~lane; + } + + return mostRecentEventTime; +} + +function computeExpirationTime(lane, currentTime) { + // TODO: Expiration heuristic is constant per lane, so could use a map. + getHighestPriorityLanes(lane); + var priority = return_highestLanePriority; + + if (priority >= InputContinuousLanePriority) { + // User interactions should expire slightly more quickly. + // + // NOTE: This is set to the corresponding constant as in Scheduler.js. When + // we made it larger, a product metric in www regressed, suggesting there's + // a user interaction that's being starved by a series of synchronous + // updates. If that theory is correct, the proper solution is to fix the + // starvation. However, this scenario supports the idea that expiration + // times are an important safeguard when starvation does happen. + // + // Also note that, in the case of user input specifically, this will soon no + // longer be an issue because we plan to make user input synchronous by + // default (until you enter `startTransition`, of course.) + // + // If weren't planning to make these updates synchronous soon anyway, I + // would probably make this number a configurable parameter. + return currentTime + 250; + } else if (priority >= TransitionPriority) { + return currentTime + 5000; + } else { + // Anything idle priority or lower should never expire. + return NoTimestamp; + } +} + +function markStarvedLanesAsExpired(root, currentTime) { + // TODO: This gets called every time we yield. We can optimize by storing + // the earliest expiration time on the root. Then use that to quickly bail out + // of this function. + var pendingLanes = root.pendingLanes; + var suspendedLanes = root.suspendedLanes; + var pingedLanes = root.pingedLanes; + var expirationTimes = root.expirationTimes; // Iterate through the pending lanes and check if we've reached their + // expiration time. If so, we'll assume the update is being starved and mark + // it as expired to force it to finish. + + var lanes = pendingLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + var expirationTime = expirationTimes[index]; + + if (expirationTime === NoTimestamp) { + // Found a pending lane with no expiration time. If it's not suspended, or + // if it's pinged, assume it's CPU-bound. Compute a new expiration time + // using the current time. + if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) { + // Assumes timestamps are monotonically increasing. + expirationTimes[index] = computeExpirationTime(lane, currentTime); + } + } else if (expirationTime <= currentTime) { + // This lane expired + root.expiredLanes |= lane; + } + + lanes &= ~lane; + } +} // This returns the highest priority pending lanes regardless of whether they +function getLanesToRetrySynchronouslyOnError(root) { + var everythingButOffscreen = root.pendingLanes & ~OffscreenLane; + + if (everythingButOffscreen !== NoLanes) { + return everythingButOffscreen; + } + + if (everythingButOffscreen & OffscreenLane) { + return OffscreenLane; + } + + return NoLanes; +} +function returnNextLanesPriority() { + return return_highestLanePriority; +} +function includesNonIdleWork(lanes) { + return (lanes & NonIdleLanes) !== NoLanes; +} +function includesOnlyRetries(lanes) { + return (lanes & RetryLanes) === lanes; +} +function includesOnlyTransitions(lanes) { + return (lanes & TransitionLanes) === lanes; +} // To ensure consistency across multiple updates in the same event, this should +// be a pure function, so that it always returns the same lane for given inputs. + +function findUpdateLane(lanePriority, wipLanes) { + switch (lanePriority) { + case NoLanePriority: + break; + + case SyncLanePriority: + return SyncLane; + + case SyncBatchedLanePriority: + return SyncBatchedLane; + + case InputDiscreteLanePriority: + { + var _lane = pickArbitraryLane(InputDiscreteLanes & ~wipLanes); + + if (_lane === NoLane) { + // Shift to the next priority level + return findUpdateLane(InputContinuousLanePriority, wipLanes); + } + + return _lane; + } + + case InputContinuousLanePriority: + { + var _lane2 = pickArbitraryLane(InputContinuousLanes & ~wipLanes); + + if (_lane2 === NoLane) { + // Shift to the next priority level + return findUpdateLane(DefaultLanePriority, wipLanes); + } + + return _lane2; + } + + case DefaultLanePriority: + { + var _lane3 = pickArbitraryLane(DefaultLanes & ~wipLanes); + + if (_lane3 === NoLane) { + // If all the default lanes are already being worked on, look for a + // lane in the transition range. + _lane3 = pickArbitraryLane(TransitionLanes & ~wipLanes); + + if (_lane3 === NoLane) { + // All the transition lanes are taken, too. This should be very + // rare, but as a last resort, pick a default lane. This will have + // the effect of interrupting the current work-in-progress render. + _lane3 = pickArbitraryLane(DefaultLanes); + } + } + + return _lane3; + } + + case TransitionPriority: // Should be handled by findTransitionLane instead + + case RetryLanePriority: + // Should be handled by findRetryLane instead + break; + + case IdleLanePriority: + var lane = pickArbitraryLane(IdleLanes & ~wipLanes); + + if (lane === NoLane) { + lane = pickArbitraryLane(IdleLanes); + } + + return lane; + } + + { + { + throw Error( "Invalid update priority: " + lanePriority + ". This is a bug in React." ); + } + } +} // To ensure consistency across multiple updates in the same event, this should +// be pure function, so that it always returns the same lane for given inputs. + +function findTransitionLane(wipLanes, pendingLanes) { + // First look for lanes that are completely unclaimed, i.e. have no + // pending work. + var lane = pickArbitraryLane(TransitionLanes & ~pendingLanes); + + if (lane === NoLane) { + // If all lanes have pending work, look for a lane that isn't currently + // being worked on. + lane = pickArbitraryLane(TransitionLanes & ~wipLanes); + + if (lane === NoLane) { + // If everything is being worked on, pick any lane. This has the + // effect of interrupting the current work-in-progress. + lane = pickArbitraryLane(TransitionLanes); + } + } + + return lane; +} // To ensure consistency across multiple updates in the same event, this should +// be pure function, so that it always returns the same lane for given inputs. + +function findRetryLane(wipLanes) { + // This is a fork of `findUpdateLane` designed specifically for Suspense + // "retries" — a special update that attempts to flip a Suspense boundary + // from its placeholder state to its primary/resolved state. + var lane = pickArbitraryLane(RetryLanes & ~wipLanes); + + if (lane === NoLane) { + lane = pickArbitraryLane(RetryLanes); + } + + return lane; +} + +function getHighestPriorityLane(lanes) { + return lanes & -lanes; +} + +function getLowestPriorityLane(lanes) { + // This finds the most significant non-zero bit. + var index = 31 - clz32(lanes); + return index < 0 ? NoLanes : 1 << index; +} + +function getEqualOrHigherPriorityLanes(lanes) { + return (getLowestPriorityLane(lanes) << 1) - 1; +} + +function pickArbitraryLane(lanes) { + // This wrapper function gets inlined. Only exists so to communicate that it + // doesn't matter which bit is selected; you can pick any bit without + // affecting the algorithms where its used. Here I'm using + // getHighestPriorityLane because it requires the fewest operations. + return getHighestPriorityLane(lanes); +} + +function pickArbitraryLaneIndex(lanes) { + return 31 - clz32(lanes); +} + +function laneToIndex(lane) { + return pickArbitraryLaneIndex(lane); +} + +function includesSomeLane(a, b) { + return (a & b) !== NoLanes; +} +function isSubsetOfLanes(set, subset) { + return (set & subset) === subset; +} +function mergeLanes(a, b) { + return a | b; +} +function removeLanes(set, subset) { + return set & ~subset; +} // Seems redundant, but it changes the type from a single lane (used for +// updates) to a group of lanes (used for flushing work). + +function laneToLanes(lane) { + return lane; +} +function higherPriorityLane(a, b) { + // This works because the bit ranges decrease in priority as you go left. + return a !== NoLane && a < b ? a : b; +} +function createLaneMap(initial) { + // Intentionally pushing one by one. + // https://v8.dev/blog/elements-kinds#avoid-creating-holes + var laneMap = []; + + for (var i = 0; i < TotalLanes; i++) { + laneMap.push(initial); + } + + return laneMap; +} +function markRootUpdated(root, updateLane, eventTime) { + root.pendingLanes |= updateLane; // TODO: Theoretically, any update to any lane can unblock any other lane. But + // it's not practical to try every single possible combination. We need a + // heuristic to decide which lanes to attempt to render, and in which batches. + // For now, we use the same heuristic as in the old ExpirationTimes model: + // retry any lane at equal or lower priority, but don't try updates at higher + // priority without also including the lower priority updates. This works well + // when considering updates across different priority levels, but isn't + // sufficient for updates within the same priority, since we want to treat + // those updates as parallel. + // Unsuspend any update at equal or lower priority. + + var higherPriorityLanes = updateLane - 1; // Turns 0b1000 into 0b0111 + + root.suspendedLanes &= higherPriorityLanes; + root.pingedLanes &= higherPriorityLanes; + var eventTimes = root.eventTimes; + var index = laneToIndex(updateLane); // We can always overwrite an existing timestamp because we prefer the most + // recent event, and we assume time is monotonically increasing. + + eventTimes[index] = eventTime; +} +function markRootSuspended(root, suspendedLanes) { + root.suspendedLanes |= suspendedLanes; + root.pingedLanes &= ~suspendedLanes; // The suspended lanes are no longer CPU-bound. Clear their expiration times. + + var expirationTimes = root.expirationTimes; + var lanes = suspendedLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + expirationTimes[index] = NoTimestamp; + lanes &= ~lane; + } +} +function markRootPinged(root, pingedLanes, eventTime) { + root.pingedLanes |= root.suspendedLanes & pingedLanes; +} +function markDiscreteUpdatesExpired(root) { + root.expiredLanes |= InputDiscreteLanes & root.pendingLanes; +} +function hasDiscreteLanes(lanes) { + return (lanes & InputDiscreteLanes) !== NoLanes; +} +function markRootMutableRead(root, updateLane) { + root.mutableReadLanes |= updateLane & root.pendingLanes; +} +function markRootFinished(root, remainingLanes) { + var noLongerPendingLanes = root.pendingLanes & ~remainingLanes; + root.pendingLanes = remainingLanes; // Let's try everything again + + root.suspendedLanes = 0; + root.pingedLanes = 0; + root.expiredLanes &= remainingLanes; + root.mutableReadLanes &= remainingLanes; + root.entangledLanes &= remainingLanes; + var entanglements = root.entanglements; + var eventTimes = root.eventTimes; + var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work + + var lanes = noLongerPendingLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + entanglements[index] = NoLanes; + eventTimes[index] = NoTimestamp; + expirationTimes[index] = NoTimestamp; + lanes &= ~lane; + } +} +function markRootEntangled(root, entangledLanes) { + root.entangledLanes |= entangledLanes; + var entanglements = root.entanglements; + var lanes = entangledLanes; + + while (lanes > 0) { + var index = pickArbitraryLaneIndex(lanes); + var lane = 1 << index; + entanglements[index] |= entangledLanes; + lanes &= ~lane; + } +} +var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros. Only used on lanes, so assume input is an integer. +// Based on: +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +var log = Math.log; +var LN2 = Math.LN2; + +function clz32Fallback(lanes) { + if (lanes === 0) { + return 32; + } + + return 31 - (log(lanes) / LN2 | 0) | 0; +} + +// Intentionally not named imports because Rollup would use dynamic dispatch for +var UserBlockingPriority$1 = Scheduler.unstable_UserBlockingPriority, + runWithPriority = Scheduler.unstable_runWithPriority; // TODO: can we stop exporting these? + +var _enabled = true; // This is exported in FB builds for use by legacy FB layer infra. +// We'd like to remove this but it's not clear if this is safe. + +function setEnabled(enabled) { + _enabled = !!enabled; +} +function isEnabled() { + return _enabled; +} +function createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags) { + var eventPriority = getEventPriorityForPluginSystem(domEventName); + var listenerWrapper; + + switch (eventPriority) { + case DiscreteEvent: + listenerWrapper = dispatchDiscreteEvent; + break; + + case UserBlockingEvent: + listenerWrapper = dispatchUserBlockingUpdate; + break; + + case ContinuousEvent: + default: + listenerWrapper = dispatchEvent; + break; + } + + return listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer); +} + +function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) { + { + flushDiscreteUpdatesIfNeeded(nativeEvent.timeStamp); + } + + discreteUpdates(dispatchEvent, domEventName, eventSystemFlags, container, nativeEvent); +} + +function dispatchUserBlockingUpdate(domEventName, eventSystemFlags, container, nativeEvent) { + { + runWithPriority(UserBlockingPriority$1, dispatchEvent.bind(null, domEventName, eventSystemFlags, container, nativeEvent)); + } +} + +function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) { + if (!_enabled) { + return; + } + + var allowReplay = true; + + { + // TODO: replaying capture phase events is currently broken + // because we used to do it during top-level native bubble handlers + // but now we use different bubble and capture handlers. + // In eager mode, we attach capture listeners early, so we need + // to filter them out until we fix the logic to handle them correctly. + // This could've been outside the flag but I put it inside to reduce risk. + allowReplay = (eventSystemFlags & IS_CAPTURE_PHASE) === 0; + } + + if (allowReplay && hasQueuedDiscreteEvents() && isReplayableDiscreteEvent(domEventName)) { + // If we already have a queue of discrete events, and this is another discrete + // event, then we can't dispatch it regardless of its target, since they + // need to dispatch in order. + queueDiscreteEvent(null, // Flags that we're not actually blocked on anything as far as we know. + domEventName, eventSystemFlags, targetContainer, nativeEvent); + return; + } + + var blockedOn = attemptToDispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent); + + if (blockedOn === null) { + // We successfully dispatched this event. + if (allowReplay) { + clearIfContinuousEvent(domEventName, nativeEvent); + } + + return; + } + + if (allowReplay) { + if (isReplayableDiscreteEvent(domEventName)) { + // This this to be replayed later once the target is available. + queueDiscreteEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent); + return; + } + + if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) { + return; + } // We need to clear only if we didn't queue because + // queueing is accummulative. + + + clearIfContinuousEvent(domEventName, nativeEvent); + } // This is not replayable so we'll invoke it but without a target, + // in case the event system needs to trace it. + + + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer); +} // Attempt dispatching an event. Returns a SuspenseInstance or Container if it's blocked. + +function attemptToDispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) { + // TODO: Warn if _enabled is false. + var nativeEventTarget = getEventTarget(nativeEvent); + var targetInst = getClosestInstanceFromNode(nativeEventTarget); + + if (targetInst !== null) { + var nearestMounted = getNearestMountedFiber(targetInst); + + if (nearestMounted === null) { + // This tree has been unmounted already. Dispatch without a target. + targetInst = null; + } else { + var tag = nearestMounted.tag; + + if (tag === SuspenseComponent) { + var instance = getSuspenseInstanceFromFiber(nearestMounted); + + if (instance !== null) { + // Queue the event to be replayed later. Abort dispatching since we + // don't want this event dispatched twice through the event system. + // TODO: If this is the first discrete event in the queue. Schedule an increased + // priority for this boundary. + return instance; + } // This shouldn't happen, something went wrong but to avoid blocking + // the whole system, dispatch the event without a target. + // TODO: Warn. + + + targetInst = null; + } else if (tag === HostRoot) { + var root = nearestMounted.stateNode; + + if (root.hydrate) { + // If this happens during a replay something went wrong and it might block + // the whole system. + return getContainerFromFiber(nearestMounted); + } + + targetInst = null; + } else if (nearestMounted !== targetInst) { + // If we get an event (ex: img onload) before committing that + // component's mount, ignore it for now (that is, treat it as if it was an + // event on a non-React tree). We might also consider queueing events and + // dispatching them after the mount. + targetInst = null; + } + } + } + + dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer); // We're not blocked on anything. + + return null; +} + +function addEventBubbleListener(target, eventType, listener) { + target.addEventListener(eventType, listener, false); + return listener; +} +function addEventCaptureListener(target, eventType, listener) { + target.addEventListener(eventType, listener, true); + return listener; +} +function addEventCaptureListenerWithPassiveFlag(target, eventType, listener, passive) { + target.addEventListener(eventType, listener, { + capture: true, + passive: passive + }); + return listener; +} +function addEventBubbleListenerWithPassiveFlag(target, eventType, listener, passive) { + target.addEventListener(eventType, listener, { + passive: passive + }); + return listener; +} + +/** + * These variables store information about text content of a target node, + * allowing comparison of content before and after a given event. + * + * Identify the node where selection currently begins, then observe + * both its text content and its current position in the DOM. Since the + * browser may natively replace the target node during composition, we can + * use its position to find its replacement. + * + * + */ +var root = null; +var startText = null; +var fallbackText = null; +function initialize(nativeEventTarget) { + root = nativeEventTarget; + startText = getText(); + return true; +} +function reset() { + root = null; + startText = null; + fallbackText = null; +} +function getData() { + if (fallbackText) { + return fallbackText; + } + + var start; + var startValue = startText; + var startLength = startValue.length; + var end; + var endValue = getText(); + var endLength = endValue.length; + + for (start = 0; start < startLength; start++) { + if (startValue[start] !== endValue[start]) { + break; + } + } + + var minEnd = startLength - start; + + for (end = 1; end <= minEnd; end++) { + if (startValue[startLength - end] !== endValue[endLength - end]) { + break; + } + } + + var sliceTail = end > 1 ? 1 - end : undefined; + fallbackText = endValue.slice(start, sliceTail); + return fallbackText; +} +function getText() { + if ('value' in root) { + return root.value; + } + + return root.textContent; +} + +/** + * `charCode` represents the actual "character code" and is safe to use with + * `String.fromCharCode`. As such, only keys that correspond to printable + * characters produce a valid `charCode`, the only exception to this is Enter. + * The Tab-key is considered non-printable and does not have a `charCode`, + * presumably because it does not produce a tab-character in browsers. + * + * @param {object} nativeEvent Native browser event. + * @return {number} Normalized `charCode` property. + */ +function getEventCharCode(nativeEvent) { + var charCode; + var keyCode = nativeEvent.keyCode; + + if ('charCode' in nativeEvent) { + charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`. + + if (charCode === 0 && keyCode === 13) { + charCode = 13; + } + } else { + // IE8 does not implement `charCode`, but `keyCode` has the correct value. + charCode = keyCode; + } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux) + // report Enter as charCode 10 when ctrl is pressed. + + + if (charCode === 10) { + charCode = 13; + } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. + // Must not discard the (non-)printable Enter-key. + + + if (charCode >= 32 || charCode === 13) { + return charCode; + } + + return 0; +} + +function functionThatReturnsTrue() { + return true; +} + +function functionThatReturnsFalse() { + return false; +} // This is intentionally a factory so that we have different returned constructors. +// If we had a single constructor, it would be megamorphic and engines would deopt. + + +function createSyntheticEvent(Interface) { + /** + * Synthetic events are dispatched by event plugins, typically in response to a + * top-level event delegation handler. + * + * These systems should generally use pooling to reduce the frequency of garbage + * collection. The system should check `isPersistent` to determine whether the + * event should be released into the pool after being dispatched. Users that + * need a persisted event should invoke `persist`. + * + * Synthetic events (and subclasses) implement the DOM Level 3 Events API by + * normalizing browser quirks. Subclasses do not necessarily have to implement a + * DOM interface; custom application-specific events can also subclass this. + */ + function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) { + this._reactName = reactName; + this._targetInst = targetInst; + this.type = reactEventType; + this.nativeEvent = nativeEvent; + this.target = nativeEventTarget; + this.currentTarget = null; + + for (var _propName in Interface) { + if (!Interface.hasOwnProperty(_propName)) { + continue; + } + + var normalize = Interface[_propName]; + + if (normalize) { + this[_propName] = normalize(nativeEvent); + } else { + this[_propName] = nativeEvent[_propName]; + } + } + + var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false; + + if (defaultPrevented) { + this.isDefaultPrevented = functionThatReturnsTrue; + } else { + this.isDefaultPrevented = functionThatReturnsFalse; + } + + this.isPropagationStopped = functionThatReturnsFalse; + return this; + } + + _assign(SyntheticBaseEvent.prototype, { + preventDefault: function () { + this.defaultPrevented = true; + var event = this.nativeEvent; + + if (!event) { + return; + } + + if (event.preventDefault) { + event.preventDefault(); // $FlowFixMe - flow is not aware of `unknown` in IE + } else if (typeof event.returnValue !== 'unknown') { + event.returnValue = false; + } + + this.isDefaultPrevented = functionThatReturnsTrue; + }, + stopPropagation: function () { + var event = this.nativeEvent; + + if (!event) { + return; + } + + if (event.stopPropagation) { + event.stopPropagation(); // $FlowFixMe - flow is not aware of `unknown` in IE + } else if (typeof event.cancelBubble !== 'unknown') { + // The ChangeEventPlugin registers a "propertychange" event for + // IE. This event does not support bubbling or cancelling, and + // any references to cancelBubble throw "Member not found". A + // typeof check of "unknown" circumvents this issue (and is also + // IE specific). + event.cancelBubble = true; + } + + this.isPropagationStopped = functionThatReturnsTrue; + }, + + /** + * We release all dispatched `SyntheticEvent`s after each event loop, adding + * them back into the pool. This allows a way to hold onto a reference that + * won't be added back into the pool. + */ + persist: function () {// Modern event system doesn't use pooling. + }, + + /** + * Checks if this event should be released back into the pool. + * + * @return {boolean} True if this should not be released, false otherwise. + */ + isPersistent: functionThatReturnsTrue + }); + + return SyntheticBaseEvent; +} +/** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + + +var EventInterface = { + eventPhase: 0, + bubbles: 0, + cancelable: 0, + timeStamp: function (event) { + return event.timeStamp || Date.now(); + }, + defaultPrevented: 0, + isTrusted: 0 +}; +var SyntheticEvent = createSyntheticEvent(EventInterface); + +var UIEventInterface = _assign({}, EventInterface, { + view: 0, + detail: 0 +}); + +var SyntheticUIEvent = createSyntheticEvent(UIEventInterface); +var lastMovementX; +var lastMovementY; +var lastMouseEvent; + +function updateMouseMovementPolyfillState(event) { + if (event !== lastMouseEvent) { + if (lastMouseEvent && event.type === 'mousemove') { + lastMovementX = event.screenX - lastMouseEvent.screenX; + lastMovementY = event.screenY - lastMouseEvent.screenY; + } else { + lastMovementX = 0; + lastMovementY = 0; + } + + lastMouseEvent = event; + } +} +/** + * @interface MouseEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + + +var MouseEventInterface = _assign({}, UIEventInterface, { + screenX: 0, + screenY: 0, + clientX: 0, + clientY: 0, + pageX: 0, + pageY: 0, + ctrlKey: 0, + shiftKey: 0, + altKey: 0, + metaKey: 0, + getModifierState: getEventModifierState, + button: 0, + buttons: 0, + relatedTarget: function (event) { + if (event.relatedTarget === undefined) return event.fromElement === event.srcElement ? event.toElement : event.fromElement; + return event.relatedTarget; + }, + movementX: function (event) { + if ('movementX' in event) { + return event.movementX; + } + + updateMouseMovementPolyfillState(event); + return lastMovementX; + }, + movementY: function (event) { + if ('movementY' in event) { + return event.movementY; + } // Don't need to call updateMouseMovementPolyfillState() here + // because it's guaranteed to have already run when movementX + // was copied. + + + return lastMovementY; + } +}); + +var SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface); +/** + * @interface DragEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + +var DragEventInterface = _assign({}, MouseEventInterface, { + dataTransfer: 0 +}); + +var SyntheticDragEvent = createSyntheticEvent(DragEventInterface); +/** + * @interface FocusEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + +var FocusEventInterface = _assign({}, UIEventInterface, { + relatedTarget: 0 +}); + +var SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface + * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent + */ + +var AnimationEventInterface = _assign({}, EventInterface, { + animationName: 0, + elapsedTime: 0, + pseudoElement: 0 +}); + +var SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/clipboard-apis/ + */ + +var ClipboardEventInterface = _assign({}, EventInterface, { + clipboardData: function (event) { + return 'clipboardData' in event ? event.clipboardData : window.clipboardData; + } +}); + +var SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents + */ + +var CompositionEventInterface = _assign({}, EventInterface, { + data: 0 +}); + +var SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 + * /#events-inputevents + */ +// Happens to share the same list for now. + +var SyntheticInputEvent = SyntheticCompositionEvent; +/** + * Normalization of deprecated HTML5 `key` values + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + +var normalizeKey = { + Esc: 'Escape', + Spacebar: ' ', + Left: 'ArrowLeft', + Up: 'ArrowUp', + Right: 'ArrowRight', + Down: 'ArrowDown', + Del: 'Delete', + Win: 'OS', + Menu: 'ContextMenu', + Apps: 'ContextMenu', + Scroll: 'ScrollLock', + MozPrintableKey: 'Unidentified' +}; +/** + * Translation from legacy `keyCode` to HTML5 `key` + * Only special keys supported, all others depend on keyboard layout or browser + * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names + */ + +var translateToKey = { + '8': 'Backspace', + '9': 'Tab', + '12': 'Clear', + '13': 'Enter', + '16': 'Shift', + '17': 'Control', + '18': 'Alt', + '19': 'Pause', + '20': 'CapsLock', + '27': 'Escape', + '32': ' ', + '33': 'PageUp', + '34': 'PageDown', + '35': 'End', + '36': 'Home', + '37': 'ArrowLeft', + '38': 'ArrowUp', + '39': 'ArrowRight', + '40': 'ArrowDown', + '45': 'Insert', + '46': 'Delete', + '112': 'F1', + '113': 'F2', + '114': 'F3', + '115': 'F4', + '116': 'F5', + '117': 'F6', + '118': 'F7', + '119': 'F8', + '120': 'F9', + '121': 'F10', + '122': 'F11', + '123': 'F12', + '144': 'NumLock', + '145': 'ScrollLock', + '224': 'Meta' +}; +/** + * @param {object} nativeEvent Native browser event. + * @return {string} Normalized `key` property. + */ + +function getEventKey(nativeEvent) { + if (nativeEvent.key) { + // Normalize inconsistent values reported by browsers due to + // implementations of a working draft specification. + // FireFox implements `key` but returns `MozPrintableKey` for all + // printable characters (normalized to `Unidentified`), ignore it. + var key = normalizeKey[nativeEvent.key] || nativeEvent.key; + + if (key !== 'Unidentified') { + return key; + } + } // Browser does not implement `key`, polyfill as much of it as we can. + + + if (nativeEvent.type === 'keypress') { + var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can + // thus be captured by `keypress`, no other non-printable key should. + + return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); + } + + if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { + // While user keyboard layout determines the actual meaning of each + // `keyCode` value, almost all function keys have a universal value. + return translateToKey[nativeEvent.keyCode] || 'Unidentified'; + } + + return ''; +} +/** + * Translation from modifier key to the associated property in the event. + * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers + */ + + +var modifierKeyToProp = { + Alt: 'altKey', + Control: 'ctrlKey', + Meta: 'metaKey', + Shift: 'shiftKey' +}; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support +// getModifierState. If getModifierState is not supported, we map it to a set of +// modifier keys exposed by the event. In this case, Lock-keys are not supported. + +function modifierStateGetter(keyArg) { + var syntheticEvent = this; + var nativeEvent = syntheticEvent.nativeEvent; + + if (nativeEvent.getModifierState) { + return nativeEvent.getModifierState(keyArg); + } + + var keyProp = modifierKeyToProp[keyArg]; + return keyProp ? !!nativeEvent[keyProp] : false; +} + +function getEventModifierState(nativeEvent) { + return modifierStateGetter; +} +/** + * @interface KeyboardEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + + +var KeyboardEventInterface = _assign({}, UIEventInterface, { + key: getEventKey, + code: 0, + location: 0, + ctrlKey: 0, + shiftKey: 0, + altKey: 0, + metaKey: 0, + repeat: 0, + locale: 0, + getModifierState: getEventModifierState, + // Legacy Interface + charCode: function (event) { + // `charCode` is the result of a KeyPress event and represents the value of + // the actual printable character. + // KeyPress is deprecated, but its replacement is not yet final and not + // implemented in any major browser. Only KeyPress has charCode. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + + return 0; + }, + keyCode: function (event) { + // `keyCode` is the result of a KeyDown/Up event and represents the value of + // physical keyboard key. + // The actual meaning of the value depends on the users' keyboard layout + // which cannot be detected. Assuming that it is a US keyboard layout + // provides a surprisingly accurate mapping for US and European users. + // Due to this, it is left to the user to implement at this time. + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + + return 0; + }, + which: function (event) { + // `which` is an alias for either `keyCode` or `charCode` depending on the + // type of the event. + if (event.type === 'keypress') { + return getEventCharCode(event); + } + + if (event.type === 'keydown' || event.type === 'keyup') { + return event.keyCode; + } + + return 0; + } +}); + +var SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface); +/** + * @interface PointerEvent + * @see http://www.w3.org/TR/pointerevents/ + */ + +var PointerEventInterface = _assign({}, MouseEventInterface, { + pointerId: 0, + width: 0, + height: 0, + pressure: 0, + tangentialPressure: 0, + tiltX: 0, + tiltY: 0, + twist: 0, + pointerType: 0, + isPrimary: 0 +}); + +var SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface); +/** + * @interface TouchEvent + * @see http://www.w3.org/TR/touch-events/ + */ + +var TouchEventInterface = _assign({}, UIEventInterface, { + touches: 0, + targetTouches: 0, + changedTouches: 0, + altKey: 0, + metaKey: 0, + ctrlKey: 0, + shiftKey: 0, + getModifierState: getEventModifierState +}); + +var SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface); +/** + * @interface Event + * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- + * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent + */ + +var TransitionEventInterface = _assign({}, EventInterface, { + propertyName: 0, + elapsedTime: 0, + pseudoElement: 0 +}); + +var SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface); +/** + * @interface WheelEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ + +var WheelEventInterface = _assign({}, MouseEventInterface, { + deltaX: function (event) { + return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). + 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; + }, + deltaY: function (event) { + return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). + 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). + 'wheelDelta' in event ? -event.wheelDelta : 0; + }, + deltaZ: 0, + // Browsers without "deltaMode" is reporting in raw wheel delta where one + // notch on the scroll is always +/- 120, roughly equivalent to pixels. + // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or + // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. + deltaMode: 0 +}); + +var SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface); + +var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space + +var START_KEYCODE = 229; +var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window; +var documentMode = null; + +if (canUseDOM && 'documentMode' in document) { + documentMode = document.documentMode; +} // Webkit offers a very useful `textInput` event that can be used to +// directly represent `beforeInput`. The IE `textinput` event is not as +// useful, so we don't use it. + + +var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied +// by the native compositionend event may be incorrect. Japanese ideographic +// spaces, for instance (\u3000) are not recorded correctly. + +var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); +var SPACEBAR_CODE = 32; +var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); + +function registerEvents() { + registerTwoPhaseEvent('onBeforeInput', ['compositionend', 'keypress', 'textInput', 'paste']); + registerTwoPhaseEvent('onCompositionEnd', ['compositionend', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']); + registerTwoPhaseEvent('onCompositionStart', ['compositionstart', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']); + registerTwoPhaseEvent('onCompositionUpdate', ['compositionupdate', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']); +} // Track whether we've ever handled a keypress on the space key. + + +var hasSpaceKeypress = false; +/** + * Return whether a native keypress event is assumed to be a command. + * This is required because Firefox fires `keypress` events for key commands + * (cut, copy, select-all, etc.) even though no character is inserted. + */ + +function isKeypressCommand(nativeEvent) { + return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command. + !(nativeEvent.ctrlKey && nativeEvent.altKey); +} +/** + * Translate native top level events into event types. + */ + + +function getCompositionEventType(domEventName) { + switch (domEventName) { + case 'compositionstart': + return 'onCompositionStart'; + + case 'compositionend': + return 'onCompositionEnd'; + + case 'compositionupdate': + return 'onCompositionUpdate'; + } +} +/** + * Does our fallback best-guess model think this event signifies that + * composition has begun? + */ + + +function isFallbackCompositionStart(domEventName, nativeEvent) { + return domEventName === 'keydown' && nativeEvent.keyCode === START_KEYCODE; +} +/** + * Does our fallback mode think that this event is the end of composition? + */ + + +function isFallbackCompositionEnd(domEventName, nativeEvent) { + switch (domEventName) { + case 'keyup': + // Command keys insert or clear IME input. + return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; + + case 'keydown': + // Expect IME keyCode on each keydown. If we get any other + // code we must have exited earlier. + return nativeEvent.keyCode !== START_KEYCODE; + + case 'keypress': + case 'mousedown': + case 'focusout': + // Events are not possible without cancelling IME. + return true; + + default: + return false; + } +} +/** + * Google Input Tools provides composition data via a CustomEvent, + * with the `data` property populated in the `detail` object. If this + * is available on the event object, use it. If not, this is a plain + * composition event and we have nothing special to extract. + * + * @param {object} nativeEvent + * @return {?string} + */ + + +function getDataFromCustomEvent(nativeEvent) { + var detail = nativeEvent.detail; + + if (typeof detail === 'object' && 'data' in detail) { + return detail.data; + } + + return null; +} +/** + * Check if a composition event was triggered by Korean IME. + * Our fallback mode does not work well with IE's Korean IME, + * so just use native composition events when Korean IME is used. + * Although CompositionEvent.locale property is deprecated, + * it is available in IE, where our fallback mode is enabled. + * + * @param {object} nativeEvent + * @return {boolean} + */ + + +function isUsingKoreanIME(nativeEvent) { + return nativeEvent.locale === 'ko'; +} // Track the current IME composition status, if any. + + +var isComposing = false; +/** + * @return {?object} A SyntheticCompositionEvent. + */ + +function extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) { + var eventType; + var fallbackData; + + if (canUseCompositionEvent) { + eventType = getCompositionEventType(domEventName); + } else if (!isComposing) { + if (isFallbackCompositionStart(domEventName, nativeEvent)) { + eventType = 'onCompositionStart'; + } + } else if (isFallbackCompositionEnd(domEventName, nativeEvent)) { + eventType = 'onCompositionEnd'; + } + + if (!eventType) { + return null; + } + + if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) { + // The current composition is stored statically and must not be + // overwritten while composition continues. + if (!isComposing && eventType === 'onCompositionStart') { + isComposing = initialize(nativeEventTarget); + } else if (eventType === 'onCompositionEnd') { + if (isComposing) { + fallbackData = getData(); + } + } + } + + var listeners = accumulateTwoPhaseListeners(targetInst, eventType); + + if (listeners.length > 0) { + var event = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + + if (fallbackData) { + // Inject data generated from fallback path into the synthetic event. + // This matches the property of native CompositionEventInterface. + event.data = fallbackData; + } else { + var customData = getDataFromCustomEvent(nativeEvent); + + if (customData !== null) { + event.data = customData; + } + } + } +} + +function getNativeBeforeInputChars(domEventName, nativeEvent) { + switch (domEventName) { + case 'compositionend': + return getDataFromCustomEvent(nativeEvent); + + case 'keypress': + /** + * If native `textInput` events are available, our goal is to make + * use of them. However, there is a special case: the spacebar key. + * In Webkit, preventing default on a spacebar `textInput` event + * cancels character insertion, but it *also* causes the browser + * to fall back to its default spacebar behavior of scrolling the + * page. + * + * Tracking at: + * https://code.google.com/p/chromium/issues/detail?id=355103 + * + * To avoid this issue, use the keypress event as if no `textInput` + * event is available. + */ + var which = nativeEvent.which; + + if (which !== SPACEBAR_CODE) { + return null; + } + + hasSpaceKeypress = true; + return SPACEBAR_CHAR; + + case 'textInput': + // Record the characters to be added to the DOM. + var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled + // it at the keypress level and bail immediately. Android Chrome + // doesn't give us keycodes, so we need to ignore it. + + if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { + return null; + } + + return chars; + + default: + // For other native event types, do nothing. + return null; + } +} +/** + * For browsers that do not provide the `textInput` event, extract the + * appropriate string to use for SyntheticInputEvent. + */ + + +function getFallbackBeforeInputChars(domEventName, nativeEvent) { + // If we are currently composing (IME) and using a fallback to do so, + // try to extract the composed characters from the fallback object. + // If composition event is available, we extract a string only at + // compositionevent, otherwise extract it at fallback events. + if (isComposing) { + if (domEventName === 'compositionend' || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent)) { + var chars = getData(); + reset(); + isComposing = false; + return chars; + } + + return null; + } + + switch (domEventName) { + case 'paste': + // If a paste event occurs after a keypress, throw out the input + // chars. Paste events should not lead to BeforeInput events. + return null; + + case 'keypress': + /** + * As of v27, Firefox may fire keypress events even when no character + * will be inserted. A few possibilities: + * + * - `which` is `0`. Arrow keys, Esc key, etc. + * + * - `which` is the pressed key code, but no char is available. + * Ex: 'AltGr + d` in Polish. There is no modified character for + * this key combination and no character is inserted into the + * document, but FF fires the keypress for char code `100` anyway. + * No `input` event will occur. + * + * - `which` is the pressed key code, but a command combination is + * being used. Ex: `Cmd+C`. No character is inserted, and no + * `input` event will occur. + */ + if (!isKeypressCommand(nativeEvent)) { + // IE fires the `keypress` event when a user types an emoji via + // Touch keyboard of Windows. In such a case, the `char` property + // holds an emoji character like `\uD83D\uDE0A`. Because its length + // is 2, the property `which` does not represent an emoji correctly. + // In such a case, we directly return the `char` property instead of + // using `which`. + if (nativeEvent.char && nativeEvent.char.length > 1) { + return nativeEvent.char; + } else if (nativeEvent.which) { + return String.fromCharCode(nativeEvent.which); + } + } + + return null; + + case 'compositionend': + return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data; + + default: + return null; + } +} +/** + * Extract a SyntheticInputEvent for `beforeInput`, based on either native + * `textInput` or fallback behavior. + * + * @return {?object} A SyntheticInputEvent. + */ + + +function extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) { + var chars; + + if (canUseTextInputEvent) { + chars = getNativeBeforeInputChars(domEventName, nativeEvent); + } else { + chars = getFallbackBeforeInputChars(domEventName, nativeEvent); + } // If no characters are being inserted, no BeforeInput event should + // be fired. + + + if (!chars) { + return null; + } + + var listeners = accumulateTwoPhaseListeners(targetInst, 'onBeforeInput'); + + if (listeners.length > 0) { + var event = new SyntheticInputEvent('onBeforeInput', 'beforeinput', null, nativeEvent, nativeEventTarget); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + event.data = chars; + } +} +/** + * Create an `onBeforeInput` event to match + * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. + * + * This event plugin is based on the native `textInput` event + * available in Chrome, Safari, Opera, and IE. This event fires after + * `onKeyPress` and `onCompositionEnd`, but before `onInput`. + * + * `beforeInput` is spec'd but not implemented in any browsers, and + * the `input` event does not provide any useful information about what has + * actually been added, contrary to the spec. Thus, `textInput` is the best + * available event to identify the characters that have actually been inserted + * into the target node. + * + * This plugin is also responsible for emitting `composition` events, thus + * allowing us to share composition fallback code for both `beforeInput` and + * `composition` event types. + */ + + +function extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); +} + +/** + * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary + */ +var supportedInputTypes = { + color: true, + date: true, + datetime: true, + 'datetime-local': true, + email: true, + month: true, + number: true, + password: true, + range: true, + search: true, + tel: true, + text: true, + time: true, + url: true, + week: true +}; + +function isTextInputElement(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + + if (nodeName === 'input') { + return !!supportedInputTypes[elem.type]; + } + + if (nodeName === 'textarea') { + return true; + } + + return false; +} + +/** + * Checks if an event is supported in the current execution environment. + * + * NOTE: This will not work correctly for non-generic events such as `change`, + * `reset`, `load`, `error`, and `select`. + * + * Borrows from Modernizr. + * + * @param {string} eventNameSuffix Event name, e.g. "click". + * @return {boolean} True if the event is supported. + * @internal + * @license Modernizr 3.0.0pre (Custom Build) | MIT + */ + +function isEventSupported(eventNameSuffix) { + if (!canUseDOM) { + return false; + } + + var eventName = 'on' + eventNameSuffix; + var isSupported = (eventName in document); + + if (!isSupported) { + var element = document.createElement('div'); + element.setAttribute(eventName, 'return;'); + isSupported = typeof element[eventName] === 'function'; + } + + return isSupported; +} + +function registerEvents$1() { + registerTwoPhaseEvent('onChange', ['change', 'click', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'selectionchange']); +} + +function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) { + // Flag this event loop as needing state restore. + enqueueStateRestore(target); + var listeners = accumulateTwoPhaseListeners(inst, 'onChange'); + + if (listeners.length > 0) { + var event = new SyntheticEvent('onChange', 'change', null, nativeEvent, target); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + } +} +/** + * For IE shims + */ + + +var activeElement = null; +var activeElementInst = null; +/** + * SECTION: handle `change` event + */ + +function shouldUseChangeEvent(elem) { + var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; +} + +function manualDispatchChangeEvent(nativeEvent) { + var dispatchQueue = []; + createAndAccumulateChangeEvent(dispatchQueue, activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the + // other events and have it go through ReactBrowserEventEmitter. Since it + // doesn't, we manually listen for the events and so we have to enqueue and + // process the abstract event manually. + // + // Batching is necessary here in order to ensure that all event handlers run + // before the next rerender (including event handlers attached to ancestor + // elements instead of directly on the input). Without this, controlled + // components don't work properly in conjunction with event bubbling because + // the component is rerendered and the value reverted before all the event + // handlers can run. See https://github.com/facebook/react/issues/708. + + batchedUpdates(runEventInBatch, dispatchQueue); +} + +function runEventInBatch(dispatchQueue) { + processDispatchQueue(dispatchQueue, 0); +} + +function getInstIfValueChanged(targetInst) { + var targetNode = getNodeFromInstance(targetInst); + + if (updateValueIfChanged(targetNode)) { + return targetInst; + } +} + +function getTargetInstForChangeEvent(domEventName, targetInst) { + if (domEventName === 'change') { + return targetInst; + } +} +/** + * SECTION: handle `input` event + */ + + +var isInputEventSupported = false; + +if (canUseDOM) { + // IE9 claims to support the input event but fails to trigger it when + // deleting text, so we ignore its input events. + isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9); +} +/** + * (For IE <=9) Starts tracking propertychange events on the passed-in element + * and override the value property so that we can distinguish user events from + * value changes in JS. + */ + + +function startWatchingForValueChange(target, targetInst) { + activeElement = target; + activeElementInst = targetInst; + activeElement.attachEvent('onpropertychange', handlePropertyChange); +} +/** + * (For IE <=9) Removes the event listeners from the currently-tracked element, + * if any exists. + */ + + +function stopWatchingForValueChange() { + if (!activeElement) { + return; + } + + activeElement.detachEvent('onpropertychange', handlePropertyChange); + activeElement = null; + activeElementInst = null; +} +/** + * (For IE <=9) Handles a propertychange event, sending a `change` event if + * the value of the active element has changed. + */ + + +function handlePropertyChange(nativeEvent) { + if (nativeEvent.propertyName !== 'value') { + return; + } + + if (getInstIfValueChanged(activeElementInst)) { + manualDispatchChangeEvent(nativeEvent); + } +} + +function handleEventsForInputEventPolyfill(domEventName, target, targetInst) { + if (domEventName === 'focusin') { + // In IE9, propertychange fires for most input events but is buggy and + // doesn't fire when text is deleted, but conveniently, selectionchange + // appears to fire in all of the remaining cases so we catch those and + // forward the event if the value has changed + // In either case, we don't want to call the event handler if the value + // is changed from JS so we redefine a setter for `.value` that updates + // our activeElementValue variable, allowing us to ignore those changes + // + // stopWatching() should be a noop here but we call it just in case we + // missed a blur event somehow. + stopWatchingForValueChange(); + startWatchingForValueChange(target, targetInst); + } else if (domEventName === 'focusout') { + stopWatchingForValueChange(); + } +} // For IE8 and IE9. + + +function getTargetInstForInputEventPolyfill(domEventName, targetInst) { + if (domEventName === 'selectionchange' || domEventName === 'keyup' || domEventName === 'keydown') { + // On the selectionchange event, the target is just document which isn't + // helpful for us so just check activeElement instead. + // + // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire + // propertychange on the first input event after setting `value` from a + // script and fires only keydown, keypress, keyup. Catching keyup usually + // gets it and catching keydown lets us fire an event for the first + // keystroke if user does a key repeat (it'll be a little delayed: right + // before the second keystroke). Other input methods (e.g., paste) seem to + // fire selectionchange normally. + return getInstIfValueChanged(activeElementInst); + } +} +/** + * SECTION: handle `click` event + */ + + +function shouldUseClickEvent(elem) { + // Use the `click` event to detect changes to checkbox and radio inputs. + // This approach works across all browsers, whereas `change` does not fire + // until `blur` in IE8. + var nodeName = elem.nodeName; + return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); +} + +function getTargetInstForClickEvent(domEventName, targetInst) { + if (domEventName === 'click') { + return getInstIfValueChanged(targetInst); + } +} + +function getTargetInstForInputOrChangeEvent(domEventName, targetInst) { + if (domEventName === 'input' || domEventName === 'change') { + return getInstIfValueChanged(targetInst); + } +} + +function handleControlledInputBlur(node) { + var state = node._wrapperState; + + if (!state || !state.controlled || node.type !== 'number') { + return; + } + + { + // If controlled, assign the value attribute to the current value on blur + setDefaultValue(node, 'number', node.value); + } +} +/** + * This plugin creates an `onChange` event that normalizes change events + * across form elements. This event fires at a time when it's possible to + * change the element's value without seeing a flicker. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - select + */ + + +function extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + var targetNode = targetInst ? getNodeFromInstance(targetInst) : window; + var getTargetInstFunc, handleEventFunc; + + if (shouldUseChangeEvent(targetNode)) { + getTargetInstFunc = getTargetInstForChangeEvent; + } else if (isTextInputElement(targetNode)) { + if (isInputEventSupported) { + getTargetInstFunc = getTargetInstForInputOrChangeEvent; + } else { + getTargetInstFunc = getTargetInstForInputEventPolyfill; + handleEventFunc = handleEventsForInputEventPolyfill; + } + } else if (shouldUseClickEvent(targetNode)) { + getTargetInstFunc = getTargetInstForClickEvent; + } + + if (getTargetInstFunc) { + var inst = getTargetInstFunc(domEventName, targetInst); + + if (inst) { + createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, nativeEventTarget); + return; + } + } + + if (handleEventFunc) { + handleEventFunc(domEventName, targetNode, targetInst); + } // When blurring, set the value attribute for number inputs + + + if (domEventName === 'focusout') { + handleControlledInputBlur(targetNode); + } +} + +function registerEvents$2() { + registerDirectEvent('onMouseEnter', ['mouseout', 'mouseover']); + registerDirectEvent('onMouseLeave', ['mouseout', 'mouseover']); + registerDirectEvent('onPointerEnter', ['pointerout', 'pointerover']); + registerDirectEvent('onPointerLeave', ['pointerout', 'pointerover']); +} +/** + * For almost every interaction we care about, there will be both a top-level + * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that + * we do not extract duplicate events. However, moving the mouse into the + * browser from outside will not fire a `mouseout` event. In this case, we use + * the `mouseover` top-level event. + */ + + +function extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + var isOverEvent = domEventName === 'mouseover' || domEventName === 'pointerover'; + var isOutEvent = domEventName === 'mouseout' || domEventName === 'pointerout'; + + if (isOverEvent && (eventSystemFlags & IS_REPLAYED) === 0) { + // If this is an over event with a target, we might have already dispatched + // the event in the out event of the other target. If this is replayed, + // then it's because we couldn't dispatch against this target previously + // so we have to do it now instead. + var related = nativeEvent.relatedTarget || nativeEvent.fromElement; + + if (related) { + // If the related node is managed by React, we can assume that we have + // already dispatched the corresponding events during its mouseout. + if (getClosestInstanceFromNode(related) || isContainerMarkedAsRoot(related)) { + return; + } + } + } + + if (!isOutEvent && !isOverEvent) { + // Must not be a mouse or pointer in or out - ignoring. + return; + } + + var win; // TODO: why is this nullable in the types but we read from it? + + if (nativeEventTarget.window === nativeEventTarget) { + // `nativeEventTarget` is probably a window object. + win = nativeEventTarget; + } else { + // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. + var doc = nativeEventTarget.ownerDocument; + + if (doc) { + win = doc.defaultView || doc.parentWindow; + } else { + win = window; + } + } + + var from; + var to; + + if (isOutEvent) { + var _related = nativeEvent.relatedTarget || nativeEvent.toElement; + + from = targetInst; + to = _related ? getClosestInstanceFromNode(_related) : null; + + if (to !== null) { + var nearestMounted = getNearestMountedFiber(to); + + if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) { + to = null; + } + } + } else { + // Moving to a node from outside the window. + from = null; + to = targetInst; + } + + if (from === to) { + // Nothing pertains to our managed components. + return; + } + + var SyntheticEventCtor = SyntheticMouseEvent; + var leaveEventType = 'onMouseLeave'; + var enterEventType = 'onMouseEnter'; + var eventTypePrefix = 'mouse'; + + if (domEventName === 'pointerout' || domEventName === 'pointerover') { + SyntheticEventCtor = SyntheticPointerEvent; + leaveEventType = 'onPointerLeave'; + enterEventType = 'onPointerEnter'; + eventTypePrefix = 'pointer'; + } + + var fromNode = from == null ? win : getNodeFromInstance(from); + var toNode = to == null ? win : getNodeFromInstance(to); + var leave = new SyntheticEventCtor(leaveEventType, eventTypePrefix + 'leave', from, nativeEvent, nativeEventTarget); + leave.target = fromNode; + leave.relatedTarget = toNode; + var enter = null; // We should only process this nativeEvent if we are processing + // the first ancestor. Next time, we will ignore the event. + + var nativeTargetInst = getClosestInstanceFromNode(nativeEventTarget); + + if (nativeTargetInst === targetInst) { + var enterEvent = new SyntheticEventCtor(enterEventType, eventTypePrefix + 'enter', to, nativeEvent, nativeEventTarget); + enterEvent.target = toNode; + enterEvent.relatedTarget = fromNode; + enter = enterEvent; + } + + accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leave, enter, from, to); +} + +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare + ; +} + +var objectIs = typeof Object.is === 'function' ? Object.is : is; + +var hasOwnProperty$2 = Object.prototype.hasOwnProperty; +/** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ + +function shallowEqual(objA, objB) { + if (objectIs(objA, objB)) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } // Test for A's keys different from B. + + + for (var i = 0; i < keysA.length; i++) { + if (!hasOwnProperty$2.call(objB, keysA[i]) || !objectIs(objA[keysA[i]], objB[keysA[i]])) { + return false; + } + } + + return true; +} + +/** + * Given any node return the first leaf node without children. + * + * @param {DOMElement|DOMTextNode} node + * @return {DOMElement|DOMTextNode} + */ + +function getLeafNode(node) { + while (node && node.firstChild) { + node = node.firstChild; + } + + return node; +} +/** + * Get the next sibling within a container. This will walk up the + * DOM if a node's siblings have been exhausted. + * + * @param {DOMElement|DOMTextNode} node + * @return {?DOMElement|DOMTextNode} + */ + + +function getSiblingNode(node) { + while (node) { + if (node.nextSibling) { + return node.nextSibling; + } + + node = node.parentNode; + } +} +/** + * Get object describing the nodes which contain characters at offset. + * + * @param {DOMElement|DOMTextNode} root + * @param {number} offset + * @return {?object} + */ + + +function getNodeForCharacterOffset(root, offset) { + var node = getLeafNode(root); + var nodeStart = 0; + var nodeEnd = 0; + + while (node) { + if (node.nodeType === TEXT_NODE) { + nodeEnd = nodeStart + node.textContent.length; + + if (nodeStart <= offset && nodeEnd >= offset) { + return { + node: node, + offset: offset - nodeStart + }; + } + + nodeStart = nodeEnd; + } + + node = getLeafNode(getSiblingNode(node)); + } +} + +/** + * @param {DOMElement} outerNode + * @return {?object} + */ + +function getOffsets(outerNode) { + var ownerDocument = outerNode.ownerDocument; + var win = ownerDocument && ownerDocument.defaultView || window; + var selection = win.getSelection && win.getSelection(); + + if (!selection || selection.rangeCount === 0) { + return null; + } + + var anchorNode = selection.anchorNode, + anchorOffset = selection.anchorOffset, + focusNode = selection.focusNode, + focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the + // up/down buttons on an <input type="number">. Anonymous divs do not seem to + // expose properties, triggering a "Permission denied error" if any of its + // properties are accessed. The only seemingly possible way to avoid erroring + // is to access a property that typically works for non-anonymous divs and + // catch any error that may otherwise arise. See + // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 + + try { + /* eslint-disable no-unused-expressions */ + anchorNode.nodeType; + focusNode.nodeType; + /* eslint-enable no-unused-expressions */ + } catch (e) { + return null; + } + + return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset); +} +/** + * Returns {start, end} where `start` is the character/codepoint index of + * (anchorNode, anchorOffset) within the textContent of `outerNode`, and + * `end` is the index of (focusNode, focusOffset). + * + * Returns null if you pass in garbage input but we should probably just crash. + * + * Exported only for testing. + */ + +function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) { + var length = 0; + var start = -1; + var end = -1; + var indexWithinAnchor = 0; + var indexWithinFocus = 0; + var node = outerNode; + var parentNode = null; + + outer: while (true) { + var next = null; + + while (true) { + if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) { + start = length + anchorOffset; + } + + if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) { + end = length + focusOffset; + } + + if (node.nodeType === TEXT_NODE) { + length += node.nodeValue.length; + } + + if ((next = node.firstChild) === null) { + break; + } // Moving from `node` to its first child `next`. + + + parentNode = node; + node = next; + } + + while (true) { + if (node === outerNode) { + // If `outerNode` has children, this is always the second time visiting + // it. If it has no children, this is still the first loop, and the only + // valid selection is anchorNode and focusNode both equal to this node + // and both offsets 0, in which case we will have handled above. + break outer; + } + + if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) { + start = length; + } + + if (parentNode === focusNode && ++indexWithinFocus === focusOffset) { + end = length; + } + + if ((next = node.nextSibling) !== null) { + break; + } + + node = parentNode; + parentNode = node.parentNode; + } // Moving from `node` to its next sibling `next`. + + + node = next; + } + + if (start === -1 || end === -1) { + // This should never happen. (Would happen if the anchor/focus nodes aren't + // actually inside the passed-in node.) + return null; + } + + return { + start: start, + end: end + }; +} +/** + * In modern non-IE browsers, we can support both forward and backward + * selections. + * + * Note: IE10+ supports the Selection object, but it does not support + * the `extend` method, which means that even in modern IE, it's not possible + * to programmatically create a backward selection. Thus, for all IE + * versions, we use the old IE API to create our selections. + * + * @param {DOMElement|DOMTextNode} node + * @param {object} offsets + */ + +function setOffsets(node, offsets) { + var doc = node.ownerDocument || document; + var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios. + // (For instance: TinyMCE editor used in a list component that supports pasting to add more, + // fails when pasting 100+ items) + + if (!win.getSelection) { + return; + } + + var selection = win.getSelection(); + var length = node.textContent.length; + var start = Math.min(offsets.start, length); + var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method. + // Flip backward selections, so we can set with a single range. + + if (!selection.extend && start > end) { + var temp = end; + end = start; + start = temp; + } + + var startMarker = getNodeForCharacterOffset(node, start); + var endMarker = getNodeForCharacterOffset(node, end); + + if (startMarker && endMarker) { + if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) { + return; + } + + var range = doc.createRange(); + range.setStart(startMarker.node, startMarker.offset); + selection.removeAllRanges(); + + if (start > end) { + selection.addRange(range); + selection.extend(endMarker.node, endMarker.offset); + } else { + range.setEnd(endMarker.node, endMarker.offset); + selection.addRange(range); + } + } +} + +function isTextNode(node) { + return node && node.nodeType === TEXT_NODE; +} + +function containsNode(outerNode, innerNode) { + if (!outerNode || !innerNode) { + return false; + } else if (outerNode === innerNode) { + return true; + } else if (isTextNode(outerNode)) { + return false; + } else if (isTextNode(innerNode)) { + return containsNode(outerNode, innerNode.parentNode); + } else if ('contains' in outerNode) { + return outerNode.contains(innerNode); + } else if (outerNode.compareDocumentPosition) { + return !!(outerNode.compareDocumentPosition(innerNode) & 16); + } else { + return false; + } +} + +function isInDocument(node) { + return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node); +} + +function isSameOriginFrame(iframe) { + try { + // Accessing the contentDocument of a HTMLIframeElement can cause the browser + // to throw, e.g. if it has a cross-origin src attribute. + // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g: + // iframe.contentDocument.defaultView; + // A safety way is to access one of the cross origin properties: Window or Location + // Which might result in "SecurityError" DOM Exception and it is compatible to Safari. + // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl + return typeof iframe.contentWindow.location.href === 'string'; + } catch (err) { + return false; + } +} + +function getActiveElementDeep() { + var win = window; + var element = getActiveElement(); + + while (element instanceof win.HTMLIFrameElement) { + if (isSameOriginFrame(element)) { + win = element.contentWindow; + } else { + return element; + } + + element = getActiveElement(win.document); + } + + return element; +} +/** + * @ReactInputSelection: React input selection module. Based on Selection.js, + * but modified to be suitable for react and has a couple of bug fixes (doesn't + * assume buttons have range selections allowed). + * Input selection module for React. + */ + +/** + * @hasSelectionCapabilities: we get the element types that support selection + * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart` + * and `selectionEnd` rows. + */ + + +function hasSelectionCapabilities(elem) { + var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); + return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true'); +} +function getSelectionInformation() { + var focusedElem = getActiveElementDeep(); + return { + focusedElem: focusedElem, + selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null + }; +} +/** + * @restoreSelection: If any selection information was potentially lost, + * restore it. This is useful when performing operations that could remove dom + * nodes and place them back in, resulting in focus being lost. + */ + +function restoreSelection(priorSelectionInformation) { + var curFocusedElem = getActiveElementDeep(); + var priorFocusedElem = priorSelectionInformation.focusedElem; + var priorSelectionRange = priorSelectionInformation.selectionRange; + + if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { + if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) { + setSelection(priorFocusedElem, priorSelectionRange); + } // Focusing a node can change the scroll position, which is undesirable + + + var ancestors = []; + var ancestor = priorFocusedElem; + + while (ancestor = ancestor.parentNode) { + if (ancestor.nodeType === ELEMENT_NODE) { + ancestors.push({ + element: ancestor, + left: ancestor.scrollLeft, + top: ancestor.scrollTop + }); + } + } + + if (typeof priorFocusedElem.focus === 'function') { + priorFocusedElem.focus(); + } + + for (var i = 0; i < ancestors.length; i++) { + var info = ancestors[i]; + info.element.scrollLeft = info.left; + info.element.scrollTop = info.top; + } + } +} +/** + * @getSelection: Gets the selection bounds of a focused textarea, input or + * contentEditable node. + * -@input: Look up selection bounds of this input + * -@return {start: selectionStart, end: selectionEnd} + */ + +function getSelection(input) { + var selection; + + if ('selectionStart' in input) { + // Modern browser with input or textarea. + selection = { + start: input.selectionStart, + end: input.selectionEnd + }; + } else { + // Content editable or old IE textarea. + selection = getOffsets(input); + } + + return selection || { + start: 0, + end: 0 + }; +} +/** + * @setSelection: Sets the selection bounds of a textarea or input and focuses + * the input. + * -@input Set selection bounds of this input or textarea + * -@offsets Object of same form that is returned from get* + */ + +function setSelection(input, offsets) { + var start = offsets.start; + var end = offsets.end; + + if (end === undefined) { + end = start; + } + + if ('selectionStart' in input) { + input.selectionStart = start; + input.selectionEnd = Math.min(end, input.value.length); + } else { + setOffsets(input, offsets); + } +} + +var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11; + +function registerEvents$3() { + registerTwoPhaseEvent('onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin', 'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']); +} + +var activeElement$1 = null; +var activeElementInst$1 = null; +var lastSelection = null; +var mouseDown = false; +/** + * Get an object which is a unique representation of the current selection. + * + * The return value will not be consistent across nodes or browsers, but + * two identical selections on the same node will return identical objects. + */ + +function getSelection$1(node) { + if ('selectionStart' in node && hasSelectionCapabilities(node)) { + return { + start: node.selectionStart, + end: node.selectionEnd + }; + } else { + var win = node.ownerDocument && node.ownerDocument.defaultView || window; + var selection = win.getSelection(); + return { + anchorNode: selection.anchorNode, + anchorOffset: selection.anchorOffset, + focusNode: selection.focusNode, + focusOffset: selection.focusOffset + }; + } +} +/** + * Get document associated with the event target. + */ + + +function getEventTargetDocument(eventTarget) { + return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument; +} +/** + * Poll selection to see whether it's changed. + * + * @param {object} nativeEvent + * @param {object} nativeEventTarget + * @return {?SyntheticEvent} + */ + + +function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) { + // Ensure we have the right element, and that the user is not dragging a + // selection (this matches native `select` event behavior). In HTML5, select + // fires only on input and textarea thus if there's no focused element we + // won't dispatch. + var doc = getEventTargetDocument(nativeEventTarget); + + if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) { + return; + } // Only fire when selection has actually changed. + + + var currentSelection = getSelection$1(activeElement$1); + + if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { + lastSelection = currentSelection; + var listeners = accumulateTwoPhaseListeners(activeElementInst$1, 'onSelect'); + + if (listeners.length > 0) { + var event = new SyntheticEvent('onSelect', 'select', null, nativeEvent, nativeEventTarget); + dispatchQueue.push({ + event: event, + listeners: listeners + }); + event.target = activeElement$1; + } + } +} +/** + * This plugin creates an `onSelect` event that normalizes select events + * across form elements. + * + * Supported elements are: + * - input (see `isTextInputElement`) + * - textarea + * - contentEditable + * + * This differs from native browser implementations in the following ways: + * - Fires on contentEditable fields as well as inputs. + * - Fires for collapsed selection. + * - Fires after user input. + */ + + +function extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + + var targetNode = targetInst ? getNodeFromInstance(targetInst) : window; + + switch (domEventName) { + // Track the input node that has focus. + case 'focusin': + if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') { + activeElement$1 = targetNode; + activeElementInst$1 = targetInst; + lastSelection = null; + } + + break; + + case 'focusout': + activeElement$1 = null; + activeElementInst$1 = null; + lastSelection = null; + break; + // Don't fire the event while the user is dragging. This matches the + // semantics of the native select event. + + case 'mousedown': + mouseDown = true; + break; + + case 'contextmenu': + case 'mouseup': + case 'dragend': + mouseDown = false; + constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); + break; + // Chrome and IE fire non-standard event when selection is changed (and + // sometimes when it hasn't). IE's event fires out of order with respect + // to key and input events on deletion, so we discard it. + // + // Firefox doesn't support selectionchange, so check selection status + // after each key entry. The selection changes after keydown and before + // keyup, but we check on keydown as well in the case of holding down a + // key, when multiple keydown events are fired but only one keyup is. + // This is also our approach for IE handling, for the reason above. + + case 'selectionchange': + if (skipSelectionChangeEvent) { + break; + } + + // falls through + + case 'keydown': + case 'keyup': + constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget); + } +} + +function extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + var reactName = topLevelEventsToReactNames.get(domEventName); + + if (reactName === undefined) { + return; + } + + var SyntheticEventCtor = SyntheticEvent; + var reactEventType = domEventName; + + switch (domEventName) { + case 'keypress': + // Firefox creates a keypress event for function keys too. This removes + // the unwanted keypress events. Enter is however both printable and + // non-printable. One would expect Tab to be as well (but it isn't). + if (getEventCharCode(nativeEvent) === 0) { + return; + } + + /* falls through */ + + case 'keydown': + case 'keyup': + SyntheticEventCtor = SyntheticKeyboardEvent; + break; + + case 'focusin': + reactEventType = 'focus'; + SyntheticEventCtor = SyntheticFocusEvent; + break; + + case 'focusout': + reactEventType = 'blur'; + SyntheticEventCtor = SyntheticFocusEvent; + break; + + case 'beforeblur': + case 'afterblur': + SyntheticEventCtor = SyntheticFocusEvent; + break; + + case 'click': + // Firefox creates a click event on right mouse clicks. This removes the + // unwanted click events. + if (nativeEvent.button === 2) { + return; + } + + /* falls through */ + + case 'auxclick': + case 'dblclick': + case 'mousedown': + case 'mousemove': + case 'mouseup': // TODO: Disabled elements should not respond to mouse events + + /* falls through */ + + case 'mouseout': + case 'mouseover': + case 'contextmenu': + SyntheticEventCtor = SyntheticMouseEvent; + break; + + case 'drag': + case 'dragend': + case 'dragenter': + case 'dragexit': + case 'dragleave': + case 'dragover': + case 'dragstart': + case 'drop': + SyntheticEventCtor = SyntheticDragEvent; + break; + + case 'touchcancel': + case 'touchend': + case 'touchmove': + case 'touchstart': + SyntheticEventCtor = SyntheticTouchEvent; + break; + + case ANIMATION_END: + case ANIMATION_ITERATION: + case ANIMATION_START: + SyntheticEventCtor = SyntheticAnimationEvent; + break; + + case TRANSITION_END: + SyntheticEventCtor = SyntheticTransitionEvent; + break; + + case 'scroll': + SyntheticEventCtor = SyntheticUIEvent; + break; + + case 'wheel': + SyntheticEventCtor = SyntheticWheelEvent; + break; + + case 'copy': + case 'cut': + case 'paste': + SyntheticEventCtor = SyntheticClipboardEvent; + break; + + case 'gotpointercapture': + case 'lostpointercapture': + case 'pointercancel': + case 'pointerdown': + case 'pointermove': + case 'pointerout': + case 'pointerover': + case 'pointerup': + SyntheticEventCtor = SyntheticPointerEvent; + break; + } + + var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0; + + { + // Some events don't bubble in the browser. + // In the past, React has always bubbled them, but this can be surprising. + // We're going to try aligning closer to the browser behavior by not bubbling + // them in React either. We'll start by not bubbling onScroll, and then expand. + var accumulateTargetOnly = !inCapturePhase && // TODO: ideally, we'd eventually add all events from + // nonDelegatedEvents list in DOMPluginEventSystem. + // Then we can remove this special list. + // This is a breaking change that can wait until React 18. + domEventName === 'scroll'; + + var _listeners = accumulateSinglePhaseListeners(targetInst, reactName, nativeEvent.type, inCapturePhase, accumulateTargetOnly); + + if (_listeners.length > 0) { + // Intentionally create event lazily. + var _event = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget); + + dispatchQueue.push({ + event: _event, + listeners: _listeners + }); + } + } +} + +// TODO: remove top-level side effect. +registerSimpleEvents(); +registerEvents$2(); +registerEvents$1(); +registerEvents$3(); +registerEvents(); + +function extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) { + // TODO: we should remove the concept of a "SimpleEventPlugin". + // This is the basic functionality of the event system. All + // the other plugins are essentially polyfills. So the plugin + // should probably be inlined somewhere and have its logic + // be core the to event system. This would potentially allow + // us to ship builds of React without the polyfilled plugins below. + extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + var shouldProcessPolyfillPlugins = (eventSystemFlags & SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS) === 0; // We don't process these events unless we are in the + // event's native "bubble" phase, which means that we're + // not in the capture phase. That's because we emulate + // the capture phase here still. This is a trade-off, + // because in an ideal world we would not emulate and use + // the phases properly, like we do with the SimpleEvent + // plugin. However, the plugins below either expect + // emulation (EnterLeave) or use state localized to that + // plugin (BeforeInput, Change, Select). The state in + // these modules complicates things, as you'll essentially + // get the case where the capture phase event might change + // state, only for the following bubble event to come in + // later and not trigger anything as the state now + // invalidates the heuristics of the event plugin. We + // could alter all these plugins to work in such ways, but + // that might cause other unknown side-effects that we + // can't forsee right now. + + if (shouldProcessPolyfillPlugins) { + extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget); + } +} // List of events that need to be individually attached to media elements. + + +var mediaEventTypes = ['abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'encrypted', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting']; // We should not delegate these events to the container, but rather +// set them on the actual target element itself. This is primarily +// because these events do not consistently bubble in the DOM. + +var nonDelegatedEvents = new Set(['cancel', 'close', 'invalid', 'load', 'scroll', 'toggle'].concat(mediaEventTypes)); + +function executeDispatch(event, listener, currentTarget) { + var type = event.type || 'unknown-event'; + event.currentTarget = currentTarget; + invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event); + event.currentTarget = null; +} + +function processDispatchQueueItemsInOrder(event, dispatchListeners, inCapturePhase) { + var previousInstance; + + if (inCapturePhase) { + for (var i = dispatchListeners.length - 1; i >= 0; i--) { + var _dispatchListeners$i = dispatchListeners[i], + instance = _dispatchListeners$i.instance, + currentTarget = _dispatchListeners$i.currentTarget, + listener = _dispatchListeners$i.listener; + + if (instance !== previousInstance && event.isPropagationStopped()) { + return; + } + + executeDispatch(event, listener, currentTarget); + previousInstance = instance; + } + } else { + for (var _i = 0; _i < dispatchListeners.length; _i++) { + var _dispatchListeners$_i = dispatchListeners[_i], + _instance = _dispatchListeners$_i.instance, + _currentTarget = _dispatchListeners$_i.currentTarget, + _listener = _dispatchListeners$_i.listener; + + if (_instance !== previousInstance && event.isPropagationStopped()) { + return; + } + + executeDispatch(event, _listener, _currentTarget); + previousInstance = _instance; + } + } +} + +function processDispatchQueue(dispatchQueue, eventSystemFlags) { + var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0; + + for (var i = 0; i < dispatchQueue.length; i++) { + var _dispatchQueue$i = dispatchQueue[i], + event = _dispatchQueue$i.event, + listeners = _dispatchQueue$i.listeners; + processDispatchQueueItemsInOrder(event, listeners, inCapturePhase); // event system doesn't use pooling. + } // This would be a good time to rethrow if any of the event handlers threw. + + + rethrowCaughtError(); +} + +function dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) { + var nativeEventTarget = getEventTarget(nativeEvent); + var dispatchQueue = []; + extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags); + processDispatchQueue(dispatchQueue, eventSystemFlags); +} + +function listenToNonDelegatedEvent(domEventName, targetElement) { + var isCapturePhaseListener = false; + var listenerSet = getEventListenerSet(targetElement); + var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener); + + if (!listenerSet.has(listenerSetKey)) { + addTrappedEventListener(targetElement, domEventName, IS_NON_DELEGATED, isCapturePhaseListener); + listenerSet.add(listenerSetKey); + } +} +var listeningMarker = '_reactListening' + Math.random().toString(36).slice(2); +function listenToAllSupportedEvents(rootContainerElement) { + { + if (rootContainerElement[listeningMarker]) { + // Performance optimization: don't iterate through events + // for the same portal container or root node more than once. + // TODO: once we remove the flag, we may be able to also + // remove some of the bookkeeping maps used for laziness. + return; + } + + rootContainerElement[listeningMarker] = true; + allNativeEvents.forEach(function (domEventName) { + if (!nonDelegatedEvents.has(domEventName)) { + listenToNativeEvent(domEventName, false, rootContainerElement, null); + } + + listenToNativeEvent(domEventName, true, rootContainerElement, null); + }); + } +} +function listenToNativeEvent(domEventName, isCapturePhaseListener, rootContainerElement, targetElement) { + var eventSystemFlags = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var target = rootContainerElement; // selectionchange needs to be attached to the document + // otherwise it won't capture incoming events that are only + // triggered on the document directly. + + if (domEventName === 'selectionchange' && rootContainerElement.nodeType !== DOCUMENT_NODE) { + target = rootContainerElement.ownerDocument; + } // If the event can be delegated (or is capture phase), we can + // register it to the root container. Otherwise, we should + // register the event to the target element and mark it as + // a non-delegated event. + + + if (targetElement !== null && !isCapturePhaseListener && nonDelegatedEvents.has(domEventName)) { + // For all non-delegated events, apart from scroll, we attach + // their event listeners to the respective elements that their + // events fire on. That means we can skip this step, as event + // listener has already been added previously. However, we + // special case the scroll event because the reality is that any + // element can scroll. + // TODO: ideally, we'd eventually apply the same logic to all + // events from the nonDelegatedEvents list. Then we can remove + // this special case and use the same logic for all events. + if (domEventName !== 'scroll') { + return; + } + + eventSystemFlags |= IS_NON_DELEGATED; + target = targetElement; + } + + var listenerSet = getEventListenerSet(target); + var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener); // If the listener entry is empty or we should upgrade, then + // we need to trap an event listener onto the target. + + if (!listenerSet.has(listenerSetKey)) { + if (isCapturePhaseListener) { + eventSystemFlags |= IS_CAPTURE_PHASE; + } + + addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener); + listenerSet.add(listenerSetKey); + } +} + +function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener, isDeferredListenerForLegacyFBSupport) { + var listener = createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags); // If passive option is not supported, then the event will be + // active and not passive. + + var isPassiveListener = undefined; + + if (passiveBrowserEventsSupported) { + // Browsers introduced an intervention, making these events + // passive by default on document. React doesn't bind them + // to document anymore, but changing this now would undo + // the performance wins from the change. So we emulate + // the existing behavior manually on the roots now. + // https://github.com/facebook/react/issues/19651 + if (domEventName === 'touchstart' || domEventName === 'touchmove' || domEventName === 'wheel') { + isPassiveListener = true; + } + } + + targetContainer = targetContainer; + var unsubscribeListener; // When legacyFBSupport is enabled, it's for when we + + + if (isCapturePhaseListener) { + if (isPassiveListener !== undefined) { + unsubscribeListener = addEventCaptureListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener); + } else { + unsubscribeListener = addEventCaptureListener(targetContainer, domEventName, listener); + } + } else { + if (isPassiveListener !== undefined) { + unsubscribeListener = addEventBubbleListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener); + } else { + unsubscribeListener = addEventBubbleListener(targetContainer, domEventName, listener); + } + } +} + +function isMatchingRootContainer(grandContainer, targetContainer) { + return grandContainer === targetContainer || grandContainer.nodeType === COMMENT_NODE && grandContainer.parentNode === targetContainer; +} + +function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) { + var ancestorInst = targetInst; + + if ((eventSystemFlags & IS_EVENT_HANDLE_NON_MANAGED_NODE) === 0 && (eventSystemFlags & IS_NON_DELEGATED) === 0) { + var targetContainerNode = targetContainer; // If we are using the legacy FB support flag, we + + if (targetInst !== null) { + // The below logic attempts to work out if we need to change + // the target fiber to a different ancestor. We had similar logic + // in the legacy event system, except the big difference between + // systems is that the modern event system now has an event listener + // attached to each React Root and React Portal Root. Together, + // the DOM nodes representing these roots are the "rootContainer". + // To figure out which ancestor instance we should use, we traverse + // up the fiber tree from the target instance and attempt to find + // root boundaries that match that of our current "rootContainer". + // If we find that "rootContainer", we find the parent fiber + // sub-tree for that root and make that our ancestor instance. + var node = targetInst; + + mainLoop: while (true) { + if (node === null) { + return; + } + + var nodeTag = node.tag; + + if (nodeTag === HostRoot || nodeTag === HostPortal) { + var container = node.stateNode.containerInfo; + + if (isMatchingRootContainer(container, targetContainerNode)) { + break; + } + + if (nodeTag === HostPortal) { + // The target is a portal, but it's not the rootContainer we're looking for. + // Normally portals handle their own events all the way down to the root. + // So we should be able to stop now. However, we don't know if this portal + // was part of *our* root. + var grandNode = node.return; + + while (grandNode !== null) { + var grandTag = grandNode.tag; + + if (grandTag === HostRoot || grandTag === HostPortal) { + var grandContainer = grandNode.stateNode.containerInfo; + + if (isMatchingRootContainer(grandContainer, targetContainerNode)) { + // This is the rootContainer we're looking for and we found it as + // a parent of the Portal. That means we can ignore it because the + // Portal will bubble through to us. + return; + } + } + + grandNode = grandNode.return; + } + } // Now we need to find it's corresponding host fiber in the other + // tree. To do this we can use getClosestInstanceFromNode, but we + // need to validate that the fiber is a host instance, otherwise + // we need to traverse up through the DOM till we find the correct + // node that is from the other tree. + + + while (container !== null) { + var parentNode = getClosestInstanceFromNode(container); + + if (parentNode === null) { + return; + } + + var parentTag = parentNode.tag; + + if (parentTag === HostComponent || parentTag === HostText) { + node = ancestorInst = parentNode; + continue mainLoop; + } + + container = container.parentNode; + } + } + + node = node.return; + } + } + } + + batchedEventUpdates(function () { + return dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, ancestorInst); + }); +} + +function createDispatchListener(instance, listener, currentTarget) { + return { + instance: instance, + listener: listener, + currentTarget: currentTarget + }; +} + +function accumulateSinglePhaseListeners(targetFiber, reactName, nativeEventType, inCapturePhase, accumulateTargetOnly) { + var captureName = reactName !== null ? reactName + 'Capture' : null; + var reactEventName = inCapturePhase ? captureName : reactName; + var listeners = []; + var instance = targetFiber; + var lastHostComponent = null; // Accumulate all instances and listeners via the target -> root path. + + while (instance !== null) { + var _instance2 = instance, + stateNode = _instance2.stateNode, + tag = _instance2.tag; // Handle listeners that are on HostComponents (i.e. <div>) + + if (tag === HostComponent && stateNode !== null) { + lastHostComponent = stateNode; // createEventHandle listeners + + + if (reactEventName !== null) { + var listener = getListener(instance, reactEventName); + + if (listener != null) { + listeners.push(createDispatchListener(instance, listener, lastHostComponent)); + } + } + } // If we are only accumulating events for the target, then we don't + // continue to propagate through the React fiber tree to find other + // listeners. + + + if (accumulateTargetOnly) { + break; + } + + instance = instance.return; + } + + return listeners; +} // We should only use this function for: +// - BeforeInputEventPlugin +// - ChangeEventPlugin +// - SelectEventPlugin +// This is because we only process these plugins +// in the bubble phase, so we need to accumulate two +// phase event listeners (via emulation). + +function accumulateTwoPhaseListeners(targetFiber, reactName) { + var captureName = reactName + 'Capture'; + var listeners = []; + var instance = targetFiber; // Accumulate all instances and listeners via the target -> root path. + + while (instance !== null) { + var _instance3 = instance, + stateNode = _instance3.stateNode, + tag = _instance3.tag; // Handle listeners that are on HostComponents (i.e. <div>) + + if (tag === HostComponent && stateNode !== null) { + var currentTarget = stateNode; + var captureListener = getListener(instance, captureName); + + if (captureListener != null) { + listeners.unshift(createDispatchListener(instance, captureListener, currentTarget)); + } + + var bubbleListener = getListener(instance, reactName); + + if (bubbleListener != null) { + listeners.push(createDispatchListener(instance, bubbleListener, currentTarget)); + } + } + + instance = instance.return; + } + + return listeners; +} + +function getParent(inst) { + if (inst === null) { + return null; + } + + do { + inst = inst.return; // TODO: If this is a HostRoot we might want to bail out. + // That is depending on if we want nested subtrees (layers) to bubble + // events to their parent. We could also go through parentNode on the + // host node but that wouldn't work for React Native and doesn't let us + // do the portal feature. + } while (inst && inst.tag !== HostComponent); + + if (inst) { + return inst; + } + + return null; +} +/** + * Return the lowest common ancestor of A and B, or null if they are in + * different trees. + */ + + +function getLowestCommonAncestor(instA, instB) { + var nodeA = instA; + var nodeB = instB; + var depthA = 0; + + for (var tempA = nodeA; tempA; tempA = getParent(tempA)) { + depthA++; + } + + var depthB = 0; + + for (var tempB = nodeB; tempB; tempB = getParent(tempB)) { + depthB++; + } // If A is deeper, crawl up. + + + while (depthA - depthB > 0) { + nodeA = getParent(nodeA); + depthA--; + } // If B is deeper, crawl up. + + + while (depthB - depthA > 0) { + nodeB = getParent(nodeB); + depthB--; + } // Walk in lockstep until we find a match. + + + var depth = depthA; + + while (depth--) { + if (nodeA === nodeB || nodeB !== null && nodeA === nodeB.alternate) { + return nodeA; + } + + nodeA = getParent(nodeA); + nodeB = getParent(nodeB); + } + + return null; +} + +function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) { + var registrationName = event._reactName; + var listeners = []; + var instance = target; + + while (instance !== null) { + if (instance === common) { + break; + } + + var _instance4 = instance, + alternate = _instance4.alternate, + stateNode = _instance4.stateNode, + tag = _instance4.tag; + + if (alternate !== null && alternate === common) { + break; + } + + if (tag === HostComponent && stateNode !== null) { + var currentTarget = stateNode; + + if (inCapturePhase) { + var captureListener = getListener(instance, registrationName); + + if (captureListener != null) { + listeners.unshift(createDispatchListener(instance, captureListener, currentTarget)); + } + } else if (!inCapturePhase) { + var bubbleListener = getListener(instance, registrationName); + + if (bubbleListener != null) { + listeners.push(createDispatchListener(instance, bubbleListener, currentTarget)); + } + } + } + + instance = instance.return; + } + + if (listeners.length !== 0) { + dispatchQueue.push({ + event: event, + listeners: listeners + }); + } +} // We should only use this function for: +// - EnterLeaveEventPlugin +// This is because we only process this plugin +// in the bubble phase, so we need to accumulate two +// phase event listeners. + + +function accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leaveEvent, enterEvent, from, to) { + var common = from && to ? getLowestCommonAncestor(from, to) : null; + + if (from !== null) { + accumulateEnterLeaveListenersForEvent(dispatchQueue, leaveEvent, from, common, false); + } + + if (to !== null && enterEvent !== null) { + accumulateEnterLeaveListenersForEvent(dispatchQueue, enterEvent, to, common, true); + } +} +function getListenerSetKey(domEventName, capture) { + return domEventName + "__" + (capture ? 'capture' : 'bubble'); +} + +var didWarnInvalidHydration = false; +var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML'; +var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning'; +var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning'; +var AUTOFOCUS = 'autoFocus'; +var CHILDREN = 'children'; +var STYLE = 'style'; +var HTML$1 = '__html'; +var HTML_NAMESPACE$1 = Namespaces.html; +var warnedUnknownTags; +var suppressHydrationWarning; +var validatePropertiesInDevelopment; +var warnForTextDifference; +var warnForPropDifference; +var warnForExtraAttributes; +var warnForInvalidEventListener; +var canDiffStyleForHydrationWarning; +var normalizeMarkupForTextOrAttribute; +var normalizeHTML; + +{ + warnedUnknownTags = { + // There are working polyfills for <dialog>. Let people use it. + dialog: true, + // Electron ships a custom <webview> tag to display external web content in + // an isolated frame and process. + // This tag is not present in non Electron environments such as JSDom which + // is often used for testing purposes. + // @see https://electronjs.org/docs/api/webview-tag + webview: true + }; + + validatePropertiesInDevelopment = function (type, props) { + validateProperties(type, props); + validateProperties$1(type, props); + validateProperties$2(type, props, { + registrationNameDependencies: registrationNameDependencies, + possibleRegistrationNames: possibleRegistrationNames + }); + }; // IE 11 parses & normalizes the style attribute as opposed to other + // browsers. It adds spaces and sorts the properties in some + // non-alphabetical order. Handling that would require sorting CSS + // properties in the client & server versions or applying + // `expectedStyle` to a temporary DOM node to read its `style` attribute + // normalized. Since it only affects IE, we're skipping style warnings + // in that browser completely in favor of doing all that work. + // See https://github.com/facebook/react/issues/11807 + + + canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode; // HTML parsing normalizes CR and CRLF to LF. + // It also can turn \u0000 into \uFFFD inside attributes. + // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream + // If we have a mismatch, it might be caused by that. + // We will still patch up in this case but not fire the warning. + + var NORMALIZE_NEWLINES_REGEX = /\r\n?/g; + var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g; + + normalizeMarkupForTextOrAttribute = function (markup) { + var markupString = typeof markup === 'string' ? markup : '' + markup; + return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, ''); + }; + + warnForTextDifference = function (serverText, clientText) { + if (didWarnInvalidHydration) { + return; + } + + var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText); + var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText); + + if (normalizedServerText === normalizedClientText) { + return; + } + + didWarnInvalidHydration = true; + + error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText); + }; + + warnForPropDifference = function (propName, serverValue, clientValue) { + if (didWarnInvalidHydration) { + return; + } + + var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue); + var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue); + + if (normalizedServerValue === normalizedClientValue) { + return; + } + + didWarnInvalidHydration = true; + + error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue)); + }; + + warnForExtraAttributes = function (attributeNames) { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + var names = []; + attributeNames.forEach(function (name) { + names.push(name); + }); + + error('Extra attributes from the server: %s', names); + }; + + warnForInvalidEventListener = function (registrationName, listener) { + if (listener === false) { + error('Expected `%s` listener to be a function, instead got `false`.\n\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.', registrationName, registrationName, registrationName); + } else { + error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener); + } + }; // Parse the HTML and read it back to normalize the HTML string so that it + // can be used for comparison. + + + normalizeHTML = function (parent, html) { + // We could have created a separate document here to avoid + // re-initializing custom elements if they exist. But this breaks + // how <noscript> is being handled. So we use the same document. + // See the discussion in https://github.com/facebook/react/pull/11157. + var testElement = parent.namespaceURI === HTML_NAMESPACE$1 ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName); + testElement.innerHTML = html; + return testElement.innerHTML; + }; +} + +function getOwnerDocumentFromRootContainer(rootContainerElement) { + return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument; +} + +function noop() {} + +function trapClickOnNonInteractiveElement(node) { + // Mobile Safari does not fire properly bubble click events on + // non-interactive elements, which means delegated click listeners do not + // fire. The workaround for this bug involves attaching an empty click + // listener on the target node. + // https://www.quirksmode.org/blog/archives/2010/09/click_event_del.html + // Just set it using the onclick property so that we don't have to manage any + // bookkeeping for it. Not sure if we need to clear it when the listener is + // removed. + // TODO: Only do this for the relevant Safaris maybe? + node.onclick = noop; +} + +function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) { + for (var propKey in nextProps) { + if (!nextProps.hasOwnProperty(propKey)) { + continue; + } + + var nextProp = nextProps[propKey]; + + if (propKey === STYLE) { + { + if (nextProp) { + // Freeze the next style object so that we can assume it won't be + // mutated. We have already warned for this in the past. + Object.freeze(nextProp); + } + } // Relies on `updateStylesByID` not mutating `styleUpdates`. + + + setValueForStyles(domElement, nextProp); + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + + if (nextHtml != null) { + setInnerHTML(domElement, nextHtml); + } + } else if (propKey === CHILDREN) { + if (typeof nextProp === 'string') { + // Avoid setting initial textContent when the text is empty. In IE11 setting + // textContent on a <textarea> will cause the placeholder to not + // show within the <textarea> until it has been focused and blurred again. + // https://github.com/facebook/react/issues/6731#issuecomment-254874553 + var canSetTextContent = tag !== 'textarea' || nextProp !== ''; + + if (canSetTextContent) { + setTextContent(domElement, nextProp); + } + } else if (typeof nextProp === 'number') { + setTextContent(domElement, '' + nextProp); + } + } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) { + if (nextProp != null) { + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } + + if (propKey === 'onScroll') { + listenToNonDelegatedEvent('scroll', domElement); + } + } + } else if (nextProp != null) { + setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag); + } + } +} + +function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) { + // TODO: Handle wasCustomComponentTag + for (var i = 0; i < updatePayload.length; i += 2) { + var propKey = updatePayload[i]; + var propValue = updatePayload[i + 1]; + + if (propKey === STYLE) { + setValueForStyles(domElement, propValue); + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + setInnerHTML(domElement, propValue); + } else if (propKey === CHILDREN) { + setTextContent(domElement, propValue); + } else { + setValueForProperty(domElement, propKey, propValue, isCustomComponentTag); + } + } +} + +function createElement(type, props, rootContainerElement, parentNamespace) { + var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML + // tags get no namespace. + + var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement); + var domElement; + var namespaceURI = parentNamespace; + + if (namespaceURI === HTML_NAMESPACE$1) { + namespaceURI = getIntrinsicNamespace(type); + } + + if (namespaceURI === HTML_NAMESPACE$1) { + { + isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to + // allow <SVG> or <mATH>. + + if (!isCustomComponentTag && type !== type.toLowerCase()) { + error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type); + } + } + + if (type === 'script') { + // Create the script via .innerHTML so its "parser-inserted" flag is + // set to true and it does not execute + var div = ownerDocument.createElement('div'); + + div.innerHTML = '<script><' + '/script>'; // eslint-disable-line + // This is guaranteed to yield a script element. + + var firstChild = div.firstChild; + domElement = div.removeChild(firstChild); + } else if (typeof props.is === 'string') { + // $FlowIssue `createElement` should be updated for Web Components + domElement = ownerDocument.createElement(type, { + is: props.is + }); + } else { + // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug. + // See discussion in https://github.com/facebook/react/pull/6896 + // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240 + domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size` + // attributes on `select`s needs to be added before `option`s are inserted. + // This prevents: + // - a bug where the `select` does not scroll to the correct option because singular + // `select` elements automatically pick the first item #13222 + // - a bug where the `select` set the first item as selected despite the `size` attribute #14239 + // See https://github.com/facebook/react/issues/13222 + // and https://github.com/facebook/react/issues/14239 + + if (type === 'select') { + var node = domElement; + + if (props.multiple) { + node.multiple = true; + } else if (props.size) { + // Setting a size greater than 1 causes a select to behave like `multiple=true`, where + // it is possible that no option is selected. + // + // This is only necessary when a select in "single selection mode". + node.size = props.size; + } + } + } + } else { + domElement = ownerDocument.createElementNS(namespaceURI, type); + } + + { + if (namespaceURI === HTML_NAMESPACE$1) { + if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) { + warnedUnknownTags[type] = true; + + error('The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type); + } + } + } + + return domElement; +} +function createTextNode(text, rootContainerElement) { + return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text); +} +function setInitialProperties(domElement, tag, rawProps, rootContainerElement) { + var isCustomComponentTag = isCustomComponent(tag, rawProps); + + { + validatePropertiesInDevelopment(tag, rawProps); + } // TODO: Make sure that we check isMounted before firing any of these events. + + + var props; + + switch (tag) { + case 'dialog': + listenToNonDelegatedEvent('cancel', domElement); + listenToNonDelegatedEvent('close', domElement); + props = rawProps; + break; + + case 'iframe': + case 'object': + case 'embed': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the load event. + listenToNonDelegatedEvent('load', domElement); + props = rawProps; + break; + + case 'video': + case 'audio': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for all the media events. + for (var i = 0; i < mediaEventTypes.length; i++) { + listenToNonDelegatedEvent(mediaEventTypes[i], domElement); + } + + props = rawProps; + break; + + case 'source': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the error event. + listenToNonDelegatedEvent('error', domElement); + props = rawProps; + break; + + case 'img': + case 'image': + case 'link': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for error and load events. + listenToNonDelegatedEvent('error', domElement); + listenToNonDelegatedEvent('load', domElement); + props = rawProps; + break; + + case 'details': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the toggle event. + listenToNonDelegatedEvent('toggle', domElement); + props = rawProps; + break; + + case 'input': + initWrapperState(domElement, rawProps); + props = getHostProps(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'option': + validateProps(domElement, rawProps); + props = getHostProps$1(domElement, rawProps); + break; + + case 'select': + initWrapperState$1(domElement, rawProps); + props = getHostProps$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'textarea': + initWrapperState$2(domElement, rawProps); + props = getHostProps$3(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + default: + props = rawProps; + } + + assertValidProps(tag, props); + setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag); + + switch (tag) { + case 'input': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper(domElement, rawProps, false); + break; + + case 'textarea': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper$3(domElement); + break; + + case 'option': + postMountWrapper$1(domElement, rawProps); + break; + + case 'select': + postMountWrapper$2(domElement, rawProps); + break; + + default: + if (typeof props.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } + + break; + } +} // Calculate the diff between the two objects. + +function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) { + { + validatePropertiesInDevelopment(tag, nextRawProps); + } + + var updatePayload = null; + var lastProps; + var nextProps; + + switch (tag) { + case 'input': + lastProps = getHostProps(domElement, lastRawProps); + nextProps = getHostProps(domElement, nextRawProps); + updatePayload = []; + break; + + case 'option': + lastProps = getHostProps$1(domElement, lastRawProps); + nextProps = getHostProps$1(domElement, nextRawProps); + updatePayload = []; + break; + + case 'select': + lastProps = getHostProps$2(domElement, lastRawProps); + nextProps = getHostProps$2(domElement, nextRawProps); + updatePayload = []; + break; + + case 'textarea': + lastProps = getHostProps$3(domElement, lastRawProps); + nextProps = getHostProps$3(domElement, nextRawProps); + updatePayload = []; + break; + + default: + lastProps = lastRawProps; + nextProps = nextRawProps; + + if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } + + break; + } + + assertValidProps(tag, nextProps); + var propKey; + var styleName; + var styleUpdates = null; + + for (propKey in lastProps) { + if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) { + continue; + } + + if (propKey === STYLE) { + var lastStyle = lastProps[propKey]; + + for (styleName in lastStyle) { + if (lastStyle.hasOwnProperty(styleName)) { + if (!styleUpdates) { + styleUpdates = {}; + } + + styleUpdates[styleName] = ''; + } + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) { + // This is a special case. If any listener updates we need to ensure + // that the "current" fiber pointer gets updated so we need a commit + // to update this element. + if (!updatePayload) { + updatePayload = []; + } + } else { + // For all other deleted properties we add it to the queue. We use + // the allowed property list in the commit phase instead. + (updatePayload = updatePayload || []).push(propKey, null); + } + } + + for (propKey in nextProps) { + var nextProp = nextProps[propKey]; + var lastProp = lastProps != null ? lastProps[propKey] : undefined; + + if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) { + continue; + } + + if (propKey === STYLE) { + { + if (nextProp) { + // Freeze the next style object so that we can assume it won't be + // mutated. We have already warned for this in the past. + Object.freeze(nextProp); + } + } + + if (lastProp) { + // Unset styles on `lastProp` but not on `nextProp`. + for (styleName in lastProp) { + if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { + if (!styleUpdates) { + styleUpdates = {}; + } + + styleUpdates[styleName] = ''; + } + } // Update styles that changed since `lastProp`. + + + for (styleName in nextProp) { + if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { + if (!styleUpdates) { + styleUpdates = {}; + } + + styleUpdates[styleName] = nextProp[styleName]; + } + } + } else { + // Relies on `updateStylesByID` not mutating `styleUpdates`. + if (!styleUpdates) { + if (!updatePayload) { + updatePayload = []; + } + + updatePayload.push(propKey, styleUpdates); + } + + styleUpdates = nextProp; + } + } else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + var lastHtml = lastProp ? lastProp[HTML$1] : undefined; + + if (nextHtml != null) { + if (lastHtml !== nextHtml) { + (updatePayload = updatePayload || []).push(propKey, nextHtml); + } + } + } else if (propKey === CHILDREN) { + if (typeof nextProp === 'string' || typeof nextProp === 'number') { + (updatePayload = updatePayload || []).push(propKey, '' + nextProp); + } + } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) { + if (nextProp != null) { + // We eagerly listen to this even though we haven't committed yet. + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } + + if (propKey === 'onScroll') { + listenToNonDelegatedEvent('scroll', domElement); + } + } + + if (!updatePayload && lastProp !== nextProp) { + // This is a special case. If any listener updates we need to ensure + // that the "current" props pointer gets updated so we need a commit + // to update this element. + updatePayload = []; + } + } else if (typeof nextProp === 'object' && nextProp !== null && nextProp.$$typeof === REACT_OPAQUE_ID_TYPE) { + // If we encounter useOpaqueReference's opaque object, this means we are hydrating. + // In this case, call the opaque object's toString function which generates a new client + // ID so client and server IDs match and throws to rerender. + nextProp.toString(); + } else { + // For any other property we always add it to the queue and then we + // filter it out using the allowed property list during the commit. + (updatePayload = updatePayload || []).push(propKey, nextProp); + } + } + + if (styleUpdates) { + { + validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]); + } + + (updatePayload = updatePayload || []).push(STYLE, styleUpdates); + } + + return updatePayload; +} // Apply the diff. + +function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) { + // Update checked *before* name. + // In the middle of an update, it is possible to have multiple checked. + // When a checked radio tries to change name, browser makes another radio's checked false. + if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) { + updateChecked(domElement, nextRawProps); + } + + var wasCustomComponentTag = isCustomComponent(tag, lastRawProps); + var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff. + + updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props + // changed. + + switch (tag) { + case 'input': + // Update the wrapper around inputs *after* updating props. This has to + // happen after `updateDOMProperties`. Otherwise HTML5 input validations + // raise warnings and prevent the new value from being assigned. + updateWrapper(domElement, nextRawProps); + break; + + case 'textarea': + updateWrapper$1(domElement, nextRawProps); + break; + + case 'select': + // <select> value update needs to occur after <option> children + // reconciliation + postUpdateWrapper(domElement, nextRawProps); + break; + } +} + +function getPossibleStandardName(propName) { + { + var lowerCasedName = propName.toLowerCase(); + + if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) { + return null; + } + + return possibleStandardNames[lowerCasedName] || null; + } +} + +function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement) { + var isCustomComponentTag; + var extraAttributeNames; + + { + suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING] === true; + isCustomComponentTag = isCustomComponent(tag, rawProps); + validatePropertiesInDevelopment(tag, rawProps); + } // TODO: Make sure that we check isMounted before firing any of these events. + + + switch (tag) { + case 'dialog': + listenToNonDelegatedEvent('cancel', domElement); + listenToNonDelegatedEvent('close', domElement); + break; + + case 'iframe': + case 'object': + case 'embed': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the load event. + listenToNonDelegatedEvent('load', domElement); + break; + + case 'video': + case 'audio': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for all the media events. + for (var i = 0; i < mediaEventTypes.length; i++) { + listenToNonDelegatedEvent(mediaEventTypes[i], domElement); + } + + break; + + case 'source': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the error event. + listenToNonDelegatedEvent('error', domElement); + break; + + case 'img': + case 'image': + case 'link': + // We listen to these events in case to ensure emulated bubble + // listeners still fire for error and load events. + listenToNonDelegatedEvent('error', domElement); + listenToNonDelegatedEvent('load', domElement); + break; + + case 'details': + // We listen to this event in case to ensure emulated bubble + // listeners still fire for the toggle event. + listenToNonDelegatedEvent('toggle', domElement); + break; + + case 'input': + initWrapperState(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'option': + validateProps(domElement, rawProps); + break; + + case 'select': + initWrapperState$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + + case 'textarea': + initWrapperState$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble + // listeners still fire for the invalid event. + + listenToNonDelegatedEvent('invalid', domElement); + + break; + } + + assertValidProps(tag, rawProps); + + { + extraAttributeNames = new Set(); + var attributes = domElement.attributes; + + for (var _i = 0; _i < attributes.length; _i++) { + var name = attributes[_i].name.toLowerCase(); + + switch (name) { + // Built-in SSR attribute is allowed + case 'data-reactroot': + break; + // Controlled attributes are not validated + // TODO: Only ignore them on controlled tags. + + case 'value': + break; + + case 'checked': + break; + + case 'selected': + break; + + default: + // Intentionally use the original name. + // See discussion in https://github.com/facebook/react/pull/10676. + extraAttributeNames.add(attributes[_i].name); + } + } + } + + var updatePayload = null; + + for (var propKey in rawProps) { + if (!rawProps.hasOwnProperty(propKey)) { + continue; + } + + var nextProp = rawProps[propKey]; + + if (propKey === CHILDREN) { + // For text content children we compare against textContent. This + // might match additional HTML that is hidden when we read it using + // textContent. E.g. "foo" will match "f<span>oo</span>" but that still + // satisfies our requirement. Our requirement is not to produce perfect + // HTML and attributes. Ideally we should preserve structure but it's + // ok not to if the visible content is still enough to indicate what + // even listeners these nodes might be wired up to. + // TODO: Warn if there is more than a single textNode as a child. + // TODO: Should we use domElement.firstChild.nodeValue to compare? + if (typeof nextProp === 'string') { + if (domElement.textContent !== nextProp) { + if ( !suppressHydrationWarning) { + warnForTextDifference(domElement.textContent, nextProp); + } + + updatePayload = [CHILDREN, nextProp]; + } + } else if (typeof nextProp === 'number') { + if (domElement.textContent !== '' + nextProp) { + if ( !suppressHydrationWarning) { + warnForTextDifference(domElement.textContent, nextProp); + } + + updatePayload = [CHILDREN, '' + nextProp]; + } + } + } else if (registrationNameDependencies.hasOwnProperty(propKey)) { + if (nextProp != null) { + if ( typeof nextProp !== 'function') { + warnForInvalidEventListener(propKey, nextProp); + } + + if (propKey === 'onScroll') { + listenToNonDelegatedEvent('scroll', domElement); + } + } + } else if ( // Convince Flow we've calculated it (it's DEV-only in this method.) + typeof isCustomComponentTag === 'boolean') { + // Validate that the properties correspond to their expected values. + var serverValue = void 0; + var propertyInfo = getPropertyInfo(propKey); + + if (suppressHydrationWarning) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated + // TODO: Only ignore them on controlled tags. + propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) { + var serverHTML = domElement.innerHTML; + var nextHtml = nextProp ? nextProp[HTML$1] : undefined; + + if (nextHtml != null) { + var expectedHTML = normalizeHTML(domElement, nextHtml); + + if (expectedHTML !== serverHTML) { + warnForPropDifference(propKey, serverHTML, expectedHTML); + } + } + } else if (propKey === STYLE) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey); + + if (canDiffStyleForHydrationWarning) { + var expectedStyle = createDangerousStringForStyles(nextProp); + serverValue = domElement.getAttribute('style'); + + if (expectedStyle !== serverValue) { + warnForPropDifference(propKey, serverValue, expectedStyle); + } + } + } else if (isCustomComponentTag) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey.toLowerCase()); + serverValue = getValueForAttribute(domElement, propKey, nextProp); + + if (nextProp !== serverValue) { + warnForPropDifference(propKey, serverValue, nextProp); + } + } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) { + var isMismatchDueToBadCasing = false; + + if (propertyInfo !== null) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propertyInfo.attributeName); + serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo); + } else { + var ownNamespace = parentNamespace; + + if (ownNamespace === HTML_NAMESPACE$1) { + ownNamespace = getIntrinsicNamespace(tag); + } + + if (ownNamespace === HTML_NAMESPACE$1) { + // $FlowFixMe - Should be inferred as not undefined. + extraAttributeNames.delete(propKey.toLowerCase()); + } else { + var standardName = getPossibleStandardName(propKey); + + if (standardName !== null && standardName !== propKey) { + // If an SVG prop is supplied with bad casing, it will + // be successfully parsed from HTML, but will produce a mismatch + // (and would be incorrectly rendered on the client). + // However, we already warn about bad casing elsewhere. + // So we'll skip the misleading extra mismatch warning in this case. + isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined. + + extraAttributeNames.delete(standardName); + } // $FlowFixMe - Should be inferred as not undefined. + + + extraAttributeNames.delete(propKey); + } + + serverValue = getValueForAttribute(domElement, propKey, nextProp); + } + + if (nextProp !== serverValue && !isMismatchDueToBadCasing) { + warnForPropDifference(propKey, serverValue, nextProp); + } + } + } + } + + { + // $FlowFixMe - Should be inferred as not undefined. + if (extraAttributeNames.size > 0 && !suppressHydrationWarning) { + // $FlowFixMe - Should be inferred as not undefined. + warnForExtraAttributes(extraAttributeNames); + } + } + + switch (tag) { + case 'input': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper(domElement, rawProps, true); + break; + + case 'textarea': + // TODO: Make sure we check if this is still unmounted or do any clean + // up necessary since we never stop tracking anymore. + track(domElement); + postMountWrapper$3(domElement); + break; + + case 'select': + case 'option': + // For input and textarea we current always set the value property at + // post mount to force it to diverge from attributes. However, for + // option and select we don't quite do the same thing and select + // is not resilient to the DOM state changing so we don't do that here. + // TODO: Consider not doing this for input and textarea. + break; + + default: + if (typeof rawProps.onClick === 'function') { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(domElement); + } + + break; + } + + return updatePayload; +} +function diffHydratedText(textNode, text) { + var isDifferent = textNode.nodeValue !== text; + return isDifferent; +} +function warnForUnmatchedText(textNode, text) { + { + warnForTextDifference(textNode.nodeValue, text); + } +} +function warnForDeletedHydratableElement(parentNode, child) { + { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase()); + } +} +function warnForDeletedHydratableText(parentNode, child) { + { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase()); + } +} +function warnForInsertedHydratedElement(parentNode, tag, props) { + { + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase()); + } +} +function warnForInsertedHydratedText(parentNode, text) { + { + if (text === '') { + // We expect to insert empty text nodes since they're not represented in + // the HTML. + // TODO: Remove this special case if we can just avoid inserting empty + // text nodes. + return; + } + + if (didWarnInvalidHydration) { + return; + } + + didWarnInvalidHydration = true; + + error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase()); + } +} +function restoreControlledState$3(domElement, tag, props) { + switch (tag) { + case 'input': + restoreControlledState(domElement, props); + return; + + case 'textarea': + restoreControlledState$2(domElement, props); + return; + + case 'select': + restoreControlledState$1(domElement, props); + return; + } +} + +var validateDOMNesting = function () {}; + +var updatedAncestorInfo = function () {}; + +{ + // This validation code was written based on the HTML5 parsing spec: + // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + // + // Note: this does not catch all invalid nesting, nor does it try to (as it's + // not clear what practical benefit doing so provides); instead, we warn only + // for cases where the parser will give a parse tree differing from what React + // intended. For example, <b><div></div></b> is invalid but we don't warn + // because it still parses correctly; we do warn for other cases like nested + // <p> tags where the beginning of the second element implicitly closes the + // first, causing a confusing mess. + // https://html.spec.whatwg.org/multipage/syntax.html#special + var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + + var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point + // TODO: Distinguish by namespace here -- for <title>, including it here + // errs on the side of fewer warnings + 'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope + + var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags + + var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; + var emptyAncestorInfo = { + current: null, + formTag: null, + aTagInScope: null, + buttonTagInScope: null, + nobrTagInScope: null, + pTagInButtonScope: null, + listItemTagAutoclosing: null, + dlItemTagAutoclosing: null + }; + + updatedAncestorInfo = function (oldInfo, tag) { + var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo); + + var info = { + tag: tag + }; + + if (inScopeTags.indexOf(tag) !== -1) { + ancestorInfo.aTagInScope = null; + ancestorInfo.buttonTagInScope = null; + ancestorInfo.nobrTagInScope = null; + } + + if (buttonScopeTags.indexOf(tag) !== -1) { + ancestorInfo.pTagInButtonScope = null; + } // See rules for 'li', 'dd', 'dt' start tags in + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + + + if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { + ancestorInfo.listItemTagAutoclosing = null; + ancestorInfo.dlItemTagAutoclosing = null; + } + + ancestorInfo.current = info; + + if (tag === 'form') { + ancestorInfo.formTag = info; + } + + if (tag === 'a') { + ancestorInfo.aTagInScope = info; + } + + if (tag === 'button') { + ancestorInfo.buttonTagInScope = info; + } + + if (tag === 'nobr') { + ancestorInfo.nobrTagInScope = info; + } + + if (tag === 'p') { + ancestorInfo.pTagInButtonScope = info; + } + + if (tag === 'li') { + ancestorInfo.listItemTagAutoclosing = info; + } + + if (tag === 'dd' || tag === 'dt') { + ancestorInfo.dlItemTagAutoclosing = info; + } + + return ancestorInfo; + }; + /** + * Returns whether + */ + + + var isTagValidWithParent = function (tag, parentTag) { + // First, let's check if we're in an unusual parsing mode... + switch (parentTag) { + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect + case 'select': + return tag === 'option' || tag === 'optgroup' || tag === '#text'; + + case 'optgroup': + return tag === 'option' || tag === '#text'; + // Strictly speaking, seeing an <option> doesn't mean we're in a <select> + // but + + case 'option': + return tag === '#text'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption + // No special behavior since these rules fall back to "in body" mode for + // all except special table nodes which cause bad parsing behavior anyway. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr + + case 'tr': + return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody + + case 'tbody': + case 'thead': + case 'tfoot': + return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup + + case 'colgroup': + return tag === 'col' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable + + case 'table': + return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead + + case 'head': + return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; + // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element + + case 'html': + return tag === 'head' || tag === 'body' || tag === 'frameset'; + + case 'frameset': + return tag === 'frame'; + + case '#document': + return tag === 'html'; + } // Probably in the "in body" parsing mode, so we outlaw only tag combos + // where the parsing rules cause implicit opens or closes to be added. + // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody + + + switch (tag) { + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; + + case 'rp': + case 'rt': + return impliedEndTags.indexOf(parentTag) === -1; + + case 'body': + case 'caption': + case 'col': + case 'colgroup': + case 'frameset': + case 'frame': + case 'head': + case 'html': + case 'tbody': + case 'td': + case 'tfoot': + case 'th': + case 'thead': + case 'tr': + // These tags are only valid with a few parents that have special child + // parsing rules -- if we're down here, then none of those matched and + // so we allow it only if we don't know what the parent is, as all other + // cases are invalid. + return parentTag == null; + } + + return true; + }; + /** + * Returns whether + */ + + + var findInvalidAncestorForTag = function (tag, ancestorInfo) { + switch (tag) { + case 'address': + case 'article': + case 'aside': + case 'blockquote': + case 'center': + case 'details': + case 'dialog': + case 'dir': + case 'div': + case 'dl': + case 'fieldset': + case 'figcaption': + case 'figure': + case 'footer': + case 'header': + case 'hgroup': + case 'main': + case 'menu': + case 'nav': + case 'ol': + case 'p': + case 'section': + case 'summary': + case 'ul': + case 'pre': + case 'listing': + case 'table': + case 'hr': + case 'xmp': + case 'h1': + case 'h2': + case 'h3': + case 'h4': + case 'h5': + case 'h6': + return ancestorInfo.pTagInButtonScope; + + case 'form': + return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; + + case 'li': + return ancestorInfo.listItemTagAutoclosing; + + case 'dd': + case 'dt': + return ancestorInfo.dlItemTagAutoclosing; + + case 'button': + return ancestorInfo.buttonTagInScope; + + case 'a': + // Spec says something about storing a list of markers, but it sounds + // equivalent to this check. + return ancestorInfo.aTagInScope; + + case 'nobr': + return ancestorInfo.nobrTagInScope; + } + + return null; + }; + + var didWarn$1 = {}; + + validateDOMNesting = function (childTag, childText, ancestorInfo) { + ancestorInfo = ancestorInfo || emptyAncestorInfo; + var parentInfo = ancestorInfo.current; + var parentTag = parentInfo && parentInfo.tag; + + if (childText != null) { + if (childTag != null) { + error('validateDOMNesting: when childText is passed, childTag should be null'); + } + + childTag = '#text'; + } + + var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; + var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); + var invalidParentOrAncestor = invalidParent || invalidAncestor; + + if (!invalidParentOrAncestor) { + return; + } + + var ancestorTag = invalidParentOrAncestor.tag; + var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag; + + if (didWarn$1[warnKey]) { + return; + } + + didWarn$1[warnKey] = true; + var tagDisplayName = childTag; + var whitespaceInfo = ''; + + if (childTag === '#text') { + if (/\S/.test(childText)) { + tagDisplayName = 'Text nodes'; + } else { + tagDisplayName = 'Whitespace text nodes'; + whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.'; + } + } else { + tagDisplayName = '<' + childTag + '>'; + } + + if (invalidParent) { + var info = ''; + + if (ancestorTag === 'table' && childTag === 'tr') { + info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.'; + } + + error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info); + } else { + error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag); + } + }; +} + +var SUPPRESS_HYDRATION_WARNING$1; + +{ + SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning'; +} + +var SUSPENSE_START_DATA = '$'; +var SUSPENSE_END_DATA = '/$'; +var SUSPENSE_PENDING_START_DATA = '$?'; +var SUSPENSE_FALLBACK_START_DATA = '$!'; +var STYLE$1 = 'style'; +var eventsEnabled = null; +var selectionInformation = null; + +function shouldAutoFocusHostComponent(type, props) { + switch (type) { + case 'button': + case 'input': + case 'select': + case 'textarea': + return !!props.autoFocus; + } + + return false; +} +function getRootHostContext(rootContainerInstance) { + var type; + var namespace; + var nodeType = rootContainerInstance.nodeType; + + switch (nodeType) { + case DOCUMENT_NODE: + case DOCUMENT_FRAGMENT_NODE: + { + type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment'; + var root = rootContainerInstance.documentElement; + namespace = root ? root.namespaceURI : getChildNamespace(null, ''); + break; + } + + default: + { + var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance; + var ownNamespace = container.namespaceURI || null; + type = container.tagName; + namespace = getChildNamespace(ownNamespace, type); + break; + } + } + + { + var validatedTag = type.toLowerCase(); + var ancestorInfo = updatedAncestorInfo(null, validatedTag); + return { + namespace: namespace, + ancestorInfo: ancestorInfo + }; + } +} +function getChildHostContext(parentHostContext, type, rootContainerInstance) { + { + var parentHostContextDev = parentHostContext; + var namespace = getChildNamespace(parentHostContextDev.namespace, type); + var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type); + return { + namespace: namespace, + ancestorInfo: ancestorInfo + }; + } +} +function getPublicInstance(instance) { + return instance; +} +function prepareForCommit(containerInfo) { + eventsEnabled = isEnabled(); + selectionInformation = getSelectionInformation(); + var activeInstance = null; + + setEnabled(false); + return activeInstance; +} +function resetAfterCommit(containerInfo) { + restoreSelection(selectionInformation); + setEnabled(eventsEnabled); + eventsEnabled = null; + selectionInformation = null; +} +function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + var parentNamespace; + + { + // TODO: take namespace into account when validating. + var hostContextDev = hostContext; + validateDOMNesting(type, null, hostContextDev.ancestorInfo); + + if (typeof props.children === 'string' || typeof props.children === 'number') { + var string = '' + props.children; + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); + validateDOMNesting(null, string, ownAncestorInfo); + } + + parentNamespace = hostContextDev.namespace; + } + + var domElement = createElement(type, props, rootContainerInstance, parentNamespace); + precacheFiberNode(internalInstanceHandle, domElement); + updateFiberProps(domElement, props); + return domElement; +} +function appendInitialChild(parentInstance, child) { + parentInstance.appendChild(child); +} +function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) { + setInitialProperties(domElement, type, props, rootContainerInstance); + return shouldAutoFocusHostComponent(type, props); +} +function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) { + { + var hostContextDev = hostContext; + + if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) { + var string = '' + newProps.children; + var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type); + validateDOMNesting(null, string, ownAncestorInfo); + } + } + + return diffProperties(domElement, type, oldProps, newProps); +} +function shouldSetTextContent(type, props) { + return type === 'textarea' || type === 'option' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null; +} +function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) { + { + var hostContextDev = hostContext; + validateDOMNesting(null, text, hostContextDev.ancestorInfo); + } + + var textNode = createTextNode(text, rootContainerInstance); + precacheFiberNode(internalInstanceHandle, textNode); + return textNode; +} +// if a component just imports ReactDOM (e.g. for findDOMNode). +// Some environments might not have setTimeout or clearTimeout. + +var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined; +var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined; +var noTimeout = -1; // ------------------- +function commitMount(domElement, type, newProps, internalInstanceHandle) { + // Despite the naming that might imply otherwise, this method only + // fires if there is an `Update` effect scheduled during mounting. + // This happens if `finalizeInitialChildren` returns `true` (which it + // does to implement the `autoFocus` attribute on the client). But + // there are also other cases when this might happen (such as patching + // up text content during hydration mismatch). So we'll check this again. + if (shouldAutoFocusHostComponent(type, newProps)) { + domElement.focus(); + } +} +function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) { + // Update the props handle so that we know which props are the ones with + // with current event handlers. + updateFiberProps(domElement, newProps); // Apply the diff to the DOM node. + + updateProperties(domElement, updatePayload, type, oldProps, newProps); +} +function resetTextContent(domElement) { + setTextContent(domElement, ''); +} +function commitTextUpdate(textInstance, oldText, newText) { + textInstance.nodeValue = newText; +} +function appendChild(parentInstance, child) { + parentInstance.appendChild(child); +} +function appendChildToContainer(container, child) { + var parentNode; + + if (container.nodeType === COMMENT_NODE) { + parentNode = container.parentNode; + parentNode.insertBefore(child, container); + } else { + parentNode = container; + parentNode.appendChild(child); + } // This container might be used for a portal. + // If something inside a portal is clicked, that click should bubble + // through the React tree. However, on Mobile Safari the click would + // never bubble through the *DOM* tree unless an ancestor with onclick + // event exists. So we wouldn't see it and dispatch it. + // This is why we ensure that non React root containers have inline onclick + // defined. + // https://github.com/facebook/react/issues/11918 + + + var reactRootContainer = container._reactRootContainer; + + if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) { + // TODO: This cast may not be sound for SVG, MathML or custom elements. + trapClickOnNonInteractiveElement(parentNode); + } +} +function insertBefore(parentInstance, child, beforeChild) { + parentInstance.insertBefore(child, beforeChild); +} +function insertInContainerBefore(container, child, beforeChild) { + if (container.nodeType === COMMENT_NODE) { + container.parentNode.insertBefore(child, beforeChild); + } else { + container.insertBefore(child, beforeChild); + } +} + +function removeChild(parentInstance, child) { + parentInstance.removeChild(child); +} +function removeChildFromContainer(container, child) { + if (container.nodeType === COMMENT_NODE) { + container.parentNode.removeChild(child); + } else { + container.removeChild(child); + } +} +function hideInstance(instance) { + // TODO: Does this work for all element types? What about MathML? Should we + // pass host context to this method? + instance = instance; + var style = instance.style; + + if (typeof style.setProperty === 'function') { + style.setProperty('display', 'none', 'important'); + } else { + style.display = 'none'; + } +} +function hideTextInstance(textInstance) { + textInstance.nodeValue = ''; +} +function unhideInstance(instance, props) { + instance = instance; + var styleProp = props[STYLE$1]; + var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null; + instance.style.display = dangerousStyleValue('display', display); +} +function unhideTextInstance(textInstance, text) { + textInstance.nodeValue = text; +} +function clearContainer(container) { + if (container.nodeType === ELEMENT_NODE) { + container.textContent = ''; + } else if (container.nodeType === DOCUMENT_NODE) { + var body = container.body; + + if (body != null) { + body.textContent = ''; + } + } +} // ------------------- +function canHydrateInstance(instance, type, props) { + if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) { + return null; + } // This has now been refined to an element node. + + + return instance; +} +function canHydrateTextInstance(instance, text) { + if (text === '' || instance.nodeType !== TEXT_NODE) { + // Empty strings are not parsed by HTML so there won't be a correct match here. + return null; + } // This has now been refined to a text node. + + + return instance; +} +function isSuspenseInstancePending(instance) { + return instance.data === SUSPENSE_PENDING_START_DATA; +} +function isSuspenseInstanceFallback(instance) { + return instance.data === SUSPENSE_FALLBACK_START_DATA; +} + +function getNextHydratable(node) { + // Skip non-hydratable nodes. + for (; node != null; node = node.nextSibling) { + var nodeType = node.nodeType; + + if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) { + break; + } + } + + return node; +} + +function getNextHydratableSibling(instance) { + return getNextHydratable(instance.nextSibling); +} +function getFirstHydratableChild(parentInstance) { + return getNextHydratable(parentInstance.firstChild); +} +function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) { + precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events + // get attached. + + updateFiberProps(instance, props); + var parentNamespace; + + { + var hostContextDev = hostContext; + parentNamespace = hostContextDev.namespace; + } + + return diffHydratedProperties(instance, type, props, parentNamespace); +} +function hydrateTextInstance(textInstance, text, internalInstanceHandle) { + precacheFiberNode(internalInstanceHandle, textInstance); + return diffHydratedText(textInstance, text); +} +function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) { + var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary. + // There might be nested nodes so we need to keep track of how + // deep we are and only break out when we're back on top. + + var depth = 0; + + while (node) { + if (node.nodeType === COMMENT_NODE) { + var data = node.data; + + if (data === SUSPENSE_END_DATA) { + if (depth === 0) { + return getNextHydratableSibling(node); + } else { + depth--; + } + } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { + depth++; + } + } + + node = node.nextSibling; + } // TODO: Warn, we didn't find the end comment boundary. + + + return null; +} // Returns the SuspenseInstance if this node is a direct child of a +// SuspenseInstance. I.e. if its previous sibling is a Comment with +// SUSPENSE_x_START_DATA. Otherwise, null. + +function getParentSuspenseInstance(targetInstance) { + var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary. + // There might be nested nodes so we need to keep track of how + // deep we are and only break out when we're back on top. + + var depth = 0; + + while (node) { + if (node.nodeType === COMMENT_NODE) { + var data = node.data; + + if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) { + if (depth === 0) { + return node; + } else { + depth--; + } + } else if (data === SUSPENSE_END_DATA) { + depth++; + } + } + + node = node.previousSibling; + } + + return null; +} +function commitHydratedContainer(container) { + // Retry if any event replaying was blocked on this. + retryIfBlockedOn(container); +} +function commitHydratedSuspenseInstance(suspenseInstance) { + // Retry if any event replaying was blocked on this. + retryIfBlockedOn(suspenseInstance); +} +function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text) { + { + warnForUnmatchedText(textInstance, text); + } +} +function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForUnmatchedText(textInstance, text); + } +} +function didNotHydrateContainerInstance(parentContainer, instance) { + { + if (instance.nodeType === ELEMENT_NODE) { + warnForDeletedHydratableElement(parentContainer, instance); + } else if (instance.nodeType === COMMENT_NODE) ; else { + warnForDeletedHydratableText(parentContainer, instance); + } + } +} +function didNotHydrateInstance(parentType, parentProps, parentInstance, instance) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + if (instance.nodeType === ELEMENT_NODE) { + warnForDeletedHydratableElement(parentInstance, instance); + } else if (instance.nodeType === COMMENT_NODE) ; else { + warnForDeletedHydratableText(parentInstance, instance); + } + } +} +function didNotFindHydratableContainerInstance(parentContainer, type, props) { + { + warnForInsertedHydratedElement(parentContainer, type); + } +} +function didNotFindHydratableContainerTextInstance(parentContainer, text) { + { + warnForInsertedHydratedText(parentContainer, text); + } +} +function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForInsertedHydratedElement(parentInstance, type); + } +} +function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) { + warnForInsertedHydratedText(parentInstance, text); + } +} +function didNotFindHydratableSuspenseInstance(parentType, parentProps, parentInstance) { + if ( parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) ; +} +var clientId = 0; +function makeClientIdInDEV(warnOnAccessInDEV) { + var id = 'r:' + (clientId++).toString(36); + return { + toString: function () { + warnOnAccessInDEV(); + return id; + }, + valueOf: function () { + warnOnAccessInDEV(); + return id; + } + }; +} +function isOpaqueHydratingObject(value) { + return value !== null && typeof value === 'object' && value.$$typeof === REACT_OPAQUE_ID_TYPE; +} +function makeOpaqueHydratingObject(attemptToReadValue) { + return { + $$typeof: REACT_OPAQUE_ID_TYPE, + toString: attemptToReadValue, + valueOf: attemptToReadValue + }; +} +function preparePortalMount(portalInstance) { + { + listenToAllSupportedEvents(portalInstance); + } +} + +var randomKey = Math.random().toString(36).slice(2); +var internalInstanceKey = '__reactFiber$' + randomKey; +var internalPropsKey = '__reactProps$' + randomKey; +var internalContainerInstanceKey = '__reactContainer$' + randomKey; +var internalEventHandlersKey = '__reactEvents$' + randomKey; +function precacheFiberNode(hostInst, node) { + node[internalInstanceKey] = hostInst; +} +function markContainerAsRoot(hostRoot, node) { + node[internalContainerInstanceKey] = hostRoot; +} +function unmarkContainerAsRoot(node) { + node[internalContainerInstanceKey] = null; +} +function isContainerMarkedAsRoot(node) { + return !!node[internalContainerInstanceKey]; +} // Given a DOM node, return the closest HostComponent or HostText fiber ancestor. +// If the target node is part of a hydrated or not yet rendered subtree, then +// this may also return a SuspenseComponent or HostRoot to indicate that. +// Conceptually the HostRoot fiber is a child of the Container node. So if you +// pass the Container node as the targetNode, you will not actually get the +// HostRoot back. To get to the HostRoot, you need to pass a child of it. +// The same thing applies to Suspense boundaries. + +function getClosestInstanceFromNode(targetNode) { + var targetInst = targetNode[internalInstanceKey]; + + if (targetInst) { + // Don't return HostRoot or SuspenseComponent here. + return targetInst; + } // If the direct event target isn't a React owned DOM node, we need to look + // to see if one of its parents is a React owned DOM node. + + + var parentNode = targetNode.parentNode; + + while (parentNode) { + // We'll check if this is a container root that could include + // React nodes in the future. We need to check this first because + // if we're a child of a dehydrated container, we need to first + // find that inner container before moving on to finding the parent + // instance. Note that we don't check this field on the targetNode + // itself because the fibers are conceptually between the container + // node and the first child. It isn't surrounding the container node. + // If it's not a container, we check if it's an instance. + targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]; + + if (targetInst) { + // Since this wasn't the direct target of the event, we might have + // stepped past dehydrated DOM nodes to get here. However they could + // also have been non-React nodes. We need to answer which one. + // If we the instance doesn't have any children, then there can't be + // a nested suspense boundary within it. So we can use this as a fast + // bailout. Most of the time, when people add non-React children to + // the tree, it is using a ref to a child-less DOM node. + // Normally we'd only need to check one of the fibers because if it + // has ever gone from having children to deleting them or vice versa + // it would have deleted the dehydrated boundary nested inside already. + // However, since the HostRoot starts out with an alternate it might + // have one on the alternate so we need to check in case this was a + // root. + var alternate = targetInst.alternate; + + if (targetInst.child !== null || alternate !== null && alternate.child !== null) { + // Next we need to figure out if the node that skipped past is + // nested within a dehydrated boundary and if so, which one. + var suspenseInstance = getParentSuspenseInstance(targetNode); + + while (suspenseInstance !== null) { + // We found a suspense instance. That means that we haven't + // hydrated it yet. Even though we leave the comments in the + // DOM after hydrating, and there are boundaries in the DOM + // that could already be hydrated, we wouldn't have found them + // through this pass since if the target is hydrated it would + // have had an internalInstanceKey on it. + // Let's get the fiber associated with the SuspenseComponent + // as the deepest instance. + var targetSuspenseInst = suspenseInstance[internalInstanceKey]; + + if (targetSuspenseInst) { + return targetSuspenseInst; + } // If we don't find a Fiber on the comment, it might be because + // we haven't gotten to hydrate it yet. There might still be a + // parent boundary that hasn't above this one so we need to find + // the outer most that is known. + + + suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent + // host component also hasn't hydrated yet. We can return it + // below since it will bail out on the isMounted check later. + } + } + + return targetInst; + } + + targetNode = parentNode; + parentNode = targetNode.parentNode; + } + + return null; +} +/** + * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent + * instance, or null if the node was not rendered by this React. + */ + +function getInstanceFromNode(node) { + var inst = node[internalInstanceKey] || node[internalContainerInstanceKey]; + + if (inst) { + if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) { + return inst; + } else { + return null; + } + } + + return null; +} +/** + * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding + * DOM node. + */ + +function getNodeFromInstance(inst) { + if (inst.tag === HostComponent || inst.tag === HostText) { + // In Fiber this, is just the state node right now. We assume it will be + // a host component or host text. + return inst.stateNode; + } // Without this first invariant, passing a non-DOM-component triggers the next + // invariant for a missing parent, which is super confusing. + + + { + { + throw Error( "getNodeFromInstance: Invalid argument." ); + } + } +} +function getFiberCurrentPropsFromNode(node) { + return node[internalPropsKey] || null; +} +function updateFiberProps(node, props) { + node[internalPropsKey] = props; +} +function getEventListenerSet(node) { + var elementListenerSet = node[internalEventHandlersKey]; + + if (elementListenerSet === undefined) { + elementListenerSet = node[internalEventHandlersKey] = new Set(); + } + + return elementListenerSet; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +var valueStack = []; +var fiberStack; + +{ + fiberStack = []; +} + +var index = -1; + +function createCursor(defaultValue) { + return { + current: defaultValue + }; +} + +function pop(cursor, fiber) { + if (index < 0) { + { + error('Unexpected pop.'); + } + + return; + } + + { + if (fiber !== fiberStack[index]) { + error('Unexpected Fiber popped.'); + } + } + + cursor.current = valueStack[index]; + valueStack[index] = null; + + { + fiberStack[index] = null; + } + + index--; +} + +function push(cursor, value, fiber) { + index++; + valueStack[index] = cursor.current; + + { + fiberStack[index] = fiber; + } + + cursor.current = value; +} + +var warnedAboutMissingGetChildContext; + +{ + warnedAboutMissingGetChildContext = {}; +} + +var emptyContextObject = {}; + +{ + Object.freeze(emptyContextObject); +} // A cursor to the current merged context object on the stack. + + +var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed. + +var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack. +// We use this to get access to the parent context after we have already +// pushed the next context provider, and now need to merge their contexts. + +var previousContext = emptyContextObject; + +function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) { + { + if (didPushOwnContextIfProvider && isContextProvider(Component)) { + // If the fiber is a context provider itself, when we read its context + // we may have already pushed its own child context on the stack. A context + // provider should not "see" its own child context. Therefore we read the + // previous (parent) context instead for a context provider. + return previousContext; + } + + return contextStackCursor.current; + } +} + +function cacheContext(workInProgress, unmaskedContext, maskedContext) { + { + var instance = workInProgress.stateNode; + instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext; + instance.__reactInternalMemoizedMaskedChildContext = maskedContext; + } +} + +function getMaskedContext(workInProgress, unmaskedContext) { + { + var type = workInProgress.type; + var contextTypes = type.contextTypes; + + if (!contextTypes) { + return emptyContextObject; + } // Avoid recreating masked context unless unmasked context has changed. + // Failing to do this will result in unnecessary calls to componentWillReceiveProps. + // This may trigger infinite loops if componentWillReceiveProps calls setState. + + + var instance = workInProgress.stateNode; + + if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) { + return instance.__reactInternalMemoizedMaskedChildContext; + } + + var context = {}; + + for (var key in contextTypes) { + context[key] = unmaskedContext[key]; + } + + { + var name = getComponentName(type) || 'Unknown'; + checkPropTypes(contextTypes, context, 'context', name); + } // Cache unmasked context so we can avoid recreating masked context unless necessary. + // Context is created before the class component is instantiated so check for instance. + + + if (instance) { + cacheContext(workInProgress, unmaskedContext, context); + } + + return context; + } +} + +function hasContextChanged() { + { + return didPerformWorkStackCursor.current; + } +} + +function isContextProvider(type) { + { + var childContextTypes = type.childContextTypes; + return childContextTypes !== null && childContextTypes !== undefined; + } +} + +function popContext(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } +} + +function popTopLevelContextObject(fiber) { + { + pop(didPerformWorkStackCursor, fiber); + pop(contextStackCursor, fiber); + } +} + +function pushTopLevelContextObject(fiber, context, didChange) { + { + if (!(contextStackCursor.current === emptyContextObject)) { + { + throw Error( "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + push(contextStackCursor, context, fiber); + push(didPerformWorkStackCursor, didChange, fiber); + } +} + +function processChildContext(fiber, type, parentContext) { + { + var instance = fiber.stateNode; + var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future. + // It has only been added in Fiber to match the (unintentional) behavior in Stack. + + if (typeof instance.getChildContext !== 'function') { + { + var componentName = getComponentName(type) || 'Unknown'; + + if (!warnedAboutMissingGetChildContext[componentName]) { + warnedAboutMissingGetChildContext[componentName] = true; + + error('%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName); + } + } + + return parentContext; + } + + var childContext = instance.getChildContext(); + + for (var contextKey in childContext) { + if (!(contextKey in childContextTypes)) { + { + throw Error( (getComponentName(type) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes." ); + } + } + } + + { + var name = getComponentName(type) || 'Unknown'; + checkPropTypes(childContextTypes, childContext, 'child context', name); + } + + return _assign({}, parentContext, childContext); + } +} + +function pushContextProvider(workInProgress) { + { + var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity. + // If the instance does not exist yet, we will push null at first, + // and replace it on the stack later when invalidating the context. + + var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later. + // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates. + + previousContext = contextStackCursor.current; + push(contextStackCursor, memoizedMergedChildContext, workInProgress); + push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress); + return true; + } +} + +function invalidateContextProvider(workInProgress, type, didChange) { + { + var instance = workInProgress.stateNode; + + if (!instance) { + { + throw Error( "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + if (didChange) { + // Merge parent and own context. + // Skip this if we're not updating due to sCU. + // This avoids unnecessarily recomputing memoized values. + var mergedContext = processChildContext(workInProgress, type, previousContext); + instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one. + // It is important to unwind the context in the reverse order. + + pop(didPerformWorkStackCursor, workInProgress); + pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed. + + push(contextStackCursor, mergedContext, workInProgress); + push(didPerformWorkStackCursor, didChange, workInProgress); + } else { + pop(didPerformWorkStackCursor, workInProgress); + push(didPerformWorkStackCursor, didChange, workInProgress); + } + } +} + +function findCurrentUnmaskedContext(fiber) { + { + // Currently this is only used with renderSubtreeIntoContainer; not sure if it + // makes sense elsewhere + if (!(isFiberMounted(fiber) && fiber.tag === ClassComponent)) { + { + throw Error( "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var node = fiber; + + do { + switch (node.tag) { + case HostRoot: + return node.stateNode.context; + + case ClassComponent: + { + var Component = node.type; + + if (isContextProvider(Component)) { + return node.stateNode.__reactInternalMemoizedMergedChildContext; + } + + break; + } + } + + node = node.return; + } while (node !== null); + + { + { + throw Error( "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } +} + +var LegacyRoot = 0; +var BlockingRoot = 1; +var ConcurrentRoot = 2; + +var rendererID = null; +var injectedHook = null; +var hasLoggedError = false; +var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined'; +function injectInternals(internals) { + if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { + // No DevTools + return false; + } + + var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__; + + if (hook.isDisabled) { + // This isn't a real property on the hook, but it can be set to opt out + // of DevTools integration and associated warnings and logs. + // https://github.com/facebook/react/issues/3877 + return true; + } + + if (!hook.supportsFiber) { + { + error('The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://reactjs.org/link/react-devtools'); + } // DevTools exists, even though it doesn't support Fiber. + + + return true; + } + + try { + rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks. + + injectedHook = hook; + } catch (err) { + // Catch all errors because it is unsafe to throw during initialization. + { + error('React instrumentation encountered an error: %s.', err); + } + } // DevTools exists + + + return true; +} +function onScheduleRoot(root, children) { + { + if (injectedHook && typeof injectedHook.onScheduleFiberRoot === 'function') { + try { + injectedHook.onScheduleFiberRoot(rendererID, root, children); + } catch (err) { + if ( !hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } + } + } +} +function onCommitRoot(root, priorityLevel) { + if (injectedHook && typeof injectedHook.onCommitFiberRoot === 'function') { + try { + var didError = (root.current.flags & DidCapture) === DidCapture; + + if (enableProfilerTimer) { + injectedHook.onCommitFiberRoot(rendererID, root, priorityLevel, didError); + } else { + injectedHook.onCommitFiberRoot(rendererID, root, undefined, didError); + } + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } + } + } +} +function onCommitUnmount(fiber) { + if (injectedHook && typeof injectedHook.onCommitFiberUnmount === 'function') { + try { + injectedHook.onCommitFiberUnmount(rendererID, fiber); + } catch (err) { + { + if (!hasLoggedError) { + hasLoggedError = true; + + error('React instrumentation encountered an error: %s', err); + } + } + } + } +} + +var Scheduler_runWithPriority = Scheduler.unstable_runWithPriority, + Scheduler_scheduleCallback = Scheduler.unstable_scheduleCallback, + Scheduler_cancelCallback = Scheduler.unstable_cancelCallback, + Scheduler_shouldYield = Scheduler.unstable_shouldYield, + Scheduler_requestPaint = Scheduler.unstable_requestPaint, + Scheduler_now$1 = Scheduler.unstable_now, + Scheduler_getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel, + Scheduler_ImmediatePriority = Scheduler.unstable_ImmediatePriority, + Scheduler_UserBlockingPriority = Scheduler.unstable_UserBlockingPriority, + Scheduler_NormalPriority = Scheduler.unstable_NormalPriority, + Scheduler_LowPriority = Scheduler.unstable_LowPriority, + Scheduler_IdlePriority = Scheduler.unstable_IdlePriority; + +{ + // Provide explicit error message when production+profiling bundle of e.g. + // react-dom is used with production (non-profiling) bundle of + // scheduler/tracing + if (!(tracing.__interactionsRef != null && tracing.__interactionsRef.current != null)) { + { + throw Error( "It is not supported to run the profiling version of a renderer (for example, `react-dom/profiling`) without also replacing the `scheduler/tracing` module with `scheduler/tracing-profiling`. Your bundler might have a setting for aliasing both modules. Learn more at https://reactjs.org/link/profiling" ); + } + } +} + +var fakeCallbackNode = {}; // Except for NoPriority, these correspond to Scheduler priorities. We use +// ascending numbers so we can compare them like numbers. They start at 90 to +// avoid clashing with Scheduler's priorities. + +var ImmediatePriority$1 = 99; +var UserBlockingPriority$2 = 98; +var NormalPriority$1 = 97; +var LowPriority$1 = 96; +var IdlePriority$1 = 95; // NoPriority is the absence of priority. Also React-only. + +var NoPriority$1 = 90; +var shouldYield = Scheduler_shouldYield; +var requestPaint = // Fall back gracefully if we're running an older version of Scheduler. +Scheduler_requestPaint !== undefined ? Scheduler_requestPaint : function () {}; +var syncQueue = null; +var immediateQueueCallbackNode = null; +var isFlushingSyncQueue = false; +var initialTimeMs$1 = Scheduler_now$1(); // If the initial timestamp is reasonably small, use Scheduler's `now` directly. +// This will be the case for modern browsers that support `performance.now`. In +// older browsers, Scheduler falls back to `Date.now`, which returns a Unix +// timestamp. In that case, subtract the module initialization time to simulate +// the behavior of performance.now and keep our times small enough to fit +// within 32 bits. +// TODO: Consider lifting this into Scheduler. + +var now = initialTimeMs$1 < 10000 ? Scheduler_now$1 : function () { + return Scheduler_now$1() - initialTimeMs$1; +}; +function getCurrentPriorityLevel() { + switch (Scheduler_getCurrentPriorityLevel()) { + case Scheduler_ImmediatePriority: + return ImmediatePriority$1; + + case Scheduler_UserBlockingPriority: + return UserBlockingPriority$2; + + case Scheduler_NormalPriority: + return NormalPriority$1; + + case Scheduler_LowPriority: + return LowPriority$1; + + case Scheduler_IdlePriority: + return IdlePriority$1; + + default: + { + { + throw Error( "Unknown priority level." ); + } + } + + } +} + +function reactPriorityToSchedulerPriority(reactPriorityLevel) { + switch (reactPriorityLevel) { + case ImmediatePriority$1: + return Scheduler_ImmediatePriority; + + case UserBlockingPriority$2: + return Scheduler_UserBlockingPriority; + + case NormalPriority$1: + return Scheduler_NormalPriority; + + case LowPriority$1: + return Scheduler_LowPriority; + + case IdlePriority$1: + return Scheduler_IdlePriority; + + default: + { + { + throw Error( "Unknown priority level." ); + } + } + + } +} + +function runWithPriority$1(reactPriorityLevel, fn) { + var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); + return Scheduler_runWithPriority(priorityLevel, fn); +} +function scheduleCallback(reactPriorityLevel, callback, options) { + var priorityLevel = reactPriorityToSchedulerPriority(reactPriorityLevel); + return Scheduler_scheduleCallback(priorityLevel, callback, options); +} +function scheduleSyncCallback(callback) { + // Push this callback into an internal queue. We'll flush these either in + // the next tick, or earlier if something calls `flushSyncCallbackQueue`. + if (syncQueue === null) { + syncQueue = [callback]; // Flush the queue in the next tick, at the earliest. + + immediateQueueCallbackNode = Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueueImpl); + } else { + // Push onto existing queue. Don't need to schedule a callback because + // we already scheduled one when we created the queue. + syncQueue.push(callback); + } + + return fakeCallbackNode; +} +function cancelCallback(callbackNode) { + if (callbackNode !== fakeCallbackNode) { + Scheduler_cancelCallback(callbackNode); + } +} +function flushSyncCallbackQueue() { + if (immediateQueueCallbackNode !== null) { + var node = immediateQueueCallbackNode; + immediateQueueCallbackNode = null; + Scheduler_cancelCallback(node); + } + + flushSyncCallbackQueueImpl(); +} + +function flushSyncCallbackQueueImpl() { + if (!isFlushingSyncQueue && syncQueue !== null) { + // Prevent re-entrancy. + isFlushingSyncQueue = true; + var i = 0; + + { + try { + var _isSync2 = true; + var _queue = syncQueue; + runWithPriority$1(ImmediatePriority$1, function () { + for (; i < _queue.length; i++) { + var callback = _queue[i]; + + do { + callback = callback(_isSync2); + } while (callback !== null); + } + }); + syncQueue = null; + } catch (error) { + // If something throws, leave the remaining callbacks on the queue. + if (syncQueue !== null) { + syncQueue = syncQueue.slice(i + 1); + } // Resume flushing in the next tick + + + Scheduler_scheduleCallback(Scheduler_ImmediatePriority, flushSyncCallbackQueue); + throw error; + } finally { + isFlushingSyncQueue = false; + } + } + } +} + +// TODO: this is special because it gets imported during build. +var ReactVersion = '17.0.2'; + +var NoMode = 0; +var StrictMode = 1; // TODO: Remove BlockingMode and ConcurrentMode by reading from the root +// tag instead + +var BlockingMode = 2; +var ConcurrentMode = 4; +var ProfileMode = 8; +var DebugTracingMode = 16; + +var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; +var NoTransition = 0; +function requestCurrentTransition() { + return ReactCurrentBatchConfig.transition; +} + +var ReactStrictModeWarnings = { + recordUnsafeLifecycleWarnings: function (fiber, instance) {}, + flushPendingUnsafeLifecycleWarnings: function () {}, + recordLegacyContextWarning: function (fiber, instance) {}, + flushLegacyContextWarning: function () {}, + discardPendingWarnings: function () {} +}; + +{ + var findStrictRoot = function (fiber) { + var maybeStrictRoot = null; + var node = fiber; + + while (node !== null) { + if (node.mode & StrictMode) { + maybeStrictRoot = node; + } + + node = node.return; + } + + return maybeStrictRoot; + }; + + var setToSortedString = function (set) { + var array = []; + set.forEach(function (value) { + array.push(value); + }); + return array.sort().join(', '); + }; + + var pendingComponentWillMountWarnings = []; + var pendingUNSAFE_ComponentWillMountWarnings = []; + var pendingComponentWillReceivePropsWarnings = []; + var pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + var pendingComponentWillUpdateWarnings = []; + var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about. + + var didWarnAboutUnsafeLifecycles = new Set(); + + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) { + // Dedup strategy: Warn once per component. + if (didWarnAboutUnsafeLifecycles.has(fiber.type)) { + return; + } + + if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components. + instance.componentWillMount.__suppressDeprecationWarning !== true) { + pendingComponentWillMountWarnings.push(fiber); + } + + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillMount === 'function') { + pendingUNSAFE_ComponentWillMountWarnings.push(fiber); + } + + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + pendingComponentWillReceivePropsWarnings.push(fiber); + } + + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber); + } + + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + pendingComponentWillUpdateWarnings.push(fiber); + } + + if (fiber.mode & StrictMode && typeof instance.UNSAFE_componentWillUpdate === 'function') { + pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber); + } + }; + + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () { + // We do an initial pass to gather component names + var componentWillMountUniqueNames = new Set(); + + if (pendingComponentWillMountWarnings.length > 0) { + pendingComponentWillMountWarnings.forEach(function (fiber) { + componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillMountWarnings = []; + } + + var UNSAFE_componentWillMountUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) { + pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) { + UNSAFE_componentWillMountUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillMountWarnings = []; + } + + var componentWillReceivePropsUniqueNames = new Set(); + + if (pendingComponentWillReceivePropsWarnings.length > 0) { + pendingComponentWillReceivePropsWarnings.forEach(function (fiber) { + componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillReceivePropsWarnings = []; + } + + var UNSAFE_componentWillReceivePropsUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) { + pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) { + UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + } + + var componentWillUpdateUniqueNames = new Set(); + + if (pendingComponentWillUpdateWarnings.length > 0) { + pendingComponentWillUpdateWarnings.forEach(function (fiber) { + componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingComponentWillUpdateWarnings = []; + } + + var UNSAFE_componentWillUpdateUniqueNames = new Set(); + + if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) { + pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) { + UNSAFE_componentWillUpdateUniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutUnsafeLifecycles.add(fiber.type); + }); + pendingUNSAFE_ComponentWillUpdateWarnings = []; + } // Finally, we flush all the warnings + // UNSAFE_ ones before the deprecated ones, since they'll be 'louder' + + + if (UNSAFE_componentWillMountUniqueNames.size > 0) { + var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames); + + error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '\nPlease update the following components: %s', sortedNames); + } + + if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames); + + error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, " + 'refactor your code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '\nPlease update the following components: %s', _sortedNames); + } + + if (UNSAFE_componentWillUpdateUniqueNames.size > 0) { + var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames); + + error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2); + } + + if (componentWillMountUniqueNames.size > 0) { + var _sortedNames3 = setToSortedString(componentWillMountUniqueNames); + + warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move code with side effects to componentDidMount, and set initial state in the constructor.\n' + '* Rename componentWillMount to UNSAFE_componentWillMount to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames3); + } + + if (componentWillReceivePropsUniqueNames.size > 0) { + var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames); + + warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + "* If you're updating state whenever props change, refactor your " + 'code to use memoization techniques or move it to ' + 'static getDerivedStateFromProps. Learn more at: https://reactjs.org/link/derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames4); + } + + if (componentWillUpdateUniqueNames.size > 0) { + var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames); + + warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress ' + 'this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. ' + 'To rename all deprecated lifecycles to their new names, you can run ' + '`npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n' + '\nPlease update the following components: %s', _sortedNames5); + } + }; + + var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about. + + var didWarnAboutLegacyContext = new Set(); + + ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) { + var strictRoot = findStrictRoot(fiber); + + if (strictRoot === null) { + error('Expected to find a StrictMode component in a strict mode tree. ' + 'This error is likely caused by a bug in React. Please file an issue.'); + + return; + } // Dedup strategy: Warn once per component. + + + if (didWarnAboutLegacyContext.has(fiber.type)) { + return; + } + + var warningsForRoot = pendingLegacyContextWarning.get(strictRoot); + + if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') { + if (warningsForRoot === undefined) { + warningsForRoot = []; + pendingLegacyContextWarning.set(strictRoot, warningsForRoot); + } + + warningsForRoot.push(fiber); + } + }; + + ReactStrictModeWarnings.flushLegacyContextWarning = function () { + pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) { + if (fiberArray.length === 0) { + return; + } + + var firstFiber = fiberArray[0]; + var uniqueNames = new Set(); + fiberArray.forEach(function (fiber) { + uniqueNames.add(getComponentName(fiber.type) || 'Component'); + didWarnAboutLegacyContext.add(fiber.type); + }); + var sortedNames = setToSortedString(uniqueNames); + + try { + setCurrentFiber(firstFiber); + + error('Legacy context API has been detected within a strict-mode tree.' + '\n\nThe old API will be supported in all 16.x releases, but applications ' + 'using it should migrate to the new version.' + '\n\nPlease update the following components: %s' + '\n\nLearn more about this warning here: https://reactjs.org/link/legacy-context', sortedNames); + } finally { + resetCurrentFiber(); + } + }); + }; + + ReactStrictModeWarnings.discardPendingWarnings = function () { + pendingComponentWillMountWarnings = []; + pendingUNSAFE_ComponentWillMountWarnings = []; + pendingComponentWillReceivePropsWarnings = []; + pendingUNSAFE_ComponentWillReceivePropsWarnings = []; + pendingComponentWillUpdateWarnings = []; + pendingUNSAFE_ComponentWillUpdateWarnings = []; + pendingLegacyContextWarning = new Map(); + }; +} + +function resolveDefaultProps(Component, baseProps) { + if (Component && Component.defaultProps) { + // Resolve default props. Taken from ReactElement + var props = _assign({}, baseProps); + + var defaultProps = Component.defaultProps; + + for (var propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + + return props; + } + + return baseProps; +} + +// Max 31 bit integer. The max integer size in V8 for 32-bit systems. +// Math.pow(2, 30) - 1 +// 0b111111111111111111111111111111 +var MAX_SIGNED_31_BIT_INT = 1073741823; + +var valueCursor = createCursor(null); +var rendererSigil; + +{ + // Use this to detect multiple renderers using the same context + rendererSigil = {}; +} + +var currentlyRenderingFiber = null; +var lastContextDependency = null; +var lastContextWithAllBitsObserved = null; +var isDisallowedContextReadInDEV = false; +function resetContextDependencies() { + // This is called right before React yields execution, to ensure `readContext` + // cannot be called outside the render phase. + currentlyRenderingFiber = null; + lastContextDependency = null; + lastContextWithAllBitsObserved = null; + + { + isDisallowedContextReadInDEV = false; + } +} +function enterDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = true; + } +} +function exitDisallowedContextReadInDEV() { + { + isDisallowedContextReadInDEV = false; + } +} +function pushProvider(providerFiber, nextValue) { + var context = providerFiber.type._context; + + { + push(valueCursor, context._currentValue, providerFiber); + context._currentValue = nextValue; + + { + if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) { + error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.'); + } + + context._currentRenderer = rendererSigil; + } + } +} +function popProvider(providerFiber) { + var currentValue = valueCursor.current; + pop(valueCursor, providerFiber); + var context = providerFiber.type._context; + + { + context._currentValue = currentValue; + } +} +function calculateChangedBits(context, newValue, oldValue) { + if (objectIs(oldValue, newValue)) { + // No change + return 0; + } else { + var changedBits = typeof context._calculateChangedBits === 'function' ? context._calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT; + + { + if ((changedBits & MAX_SIGNED_31_BIT_INT) !== changedBits) { + error('calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits); + } + } + + return changedBits | 0; + } +} +function scheduleWorkOnParentPath(parent, renderLanes) { + // Update the child lanes of all the ancestors, including the alternates. + var node = parent; + + while (node !== null) { + var alternate = node.alternate; + + if (!isSubsetOfLanes(node.childLanes, renderLanes)) { + node.childLanes = mergeLanes(node.childLanes, renderLanes); + + if (alternate !== null) { + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes); + } + } else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes)) { + alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes); + } else { + // Neither alternate was updated, which means the rest of the + // ancestor path already has sufficient priority. + break; + } + + node = node.return; + } +} +function propagateContextChange(workInProgress, context, changedBits, renderLanes) { + var fiber = workInProgress.child; + + if (fiber !== null) { + // Set the return pointer of the child to the work-in-progress fiber. + fiber.return = workInProgress; + } + + while (fiber !== null) { + var nextFiber = void 0; // Visit this fiber. + + var list = fiber.dependencies; + + if (list !== null) { + nextFiber = fiber.child; + var dependency = list.firstContext; + + while (dependency !== null) { + // Check if the context matches. + if (dependency.context === context && (dependency.observedBits & changedBits) !== 0) { + // Match! Schedule an update on this fiber. + if (fiber.tag === ClassComponent) { + // Schedule a force update on the work-in-progress. + var update = createUpdate(NoTimestamp, pickArbitraryLane(renderLanes)); + update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the + // update to the current fiber, too, which means it will persist even if + // this render is thrown away. Since it's a race condition, not sure it's + // worth fixing. + + enqueueUpdate(fiber, update); + } + + fiber.lanes = mergeLanes(fiber.lanes, renderLanes); + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, renderLanes); + } + + scheduleWorkOnParentPath(fiber.return, renderLanes); // Mark the updated lanes on the list, too. + + list.lanes = mergeLanes(list.lanes, renderLanes); // Since we already found a match, we can stop traversing the + // dependency list. + + break; + } + + dependency = dependency.next; + } + } else if (fiber.tag === ContextProvider) { + // Don't scan deeper if this is a matching provider + nextFiber = fiber.type === workInProgress.type ? null : fiber.child; + } else { + // Traverse down. + nextFiber = fiber.child; + } + + if (nextFiber !== null) { + // Set the return pointer of the child to the work-in-progress fiber. + nextFiber.return = fiber; + } else { + // No child. Traverse to next sibling. + nextFiber = fiber; + + while (nextFiber !== null) { + if (nextFiber === workInProgress) { + // We're back to the root of this subtree. Exit. + nextFiber = null; + break; + } + + var sibling = nextFiber.sibling; + + if (sibling !== null) { + // Set the return pointer of the sibling to the work-in-progress fiber. + sibling.return = nextFiber.return; + nextFiber = sibling; + break; + } // No more siblings. Traverse up. + + + nextFiber = nextFiber.return; + } + } + + fiber = nextFiber; + } +} +function prepareToReadContext(workInProgress, renderLanes) { + currentlyRenderingFiber = workInProgress; + lastContextDependency = null; + lastContextWithAllBitsObserved = null; + var dependencies = workInProgress.dependencies; + + if (dependencies !== null) { + var firstContext = dependencies.firstContext; + + if (firstContext !== null) { + if (includesSomeLane(dependencies.lanes, renderLanes)) { + // Context list has a pending update. Mark that this fiber performed work. + markWorkInProgressReceivedUpdate(); + } // Reset the work-in-progress list + + + dependencies.firstContext = null; + } + } +} +function readContext(context, observedBits) { + { + // This warning would fire if you read context inside a Hook like useMemo. + // Unlike the class check below, it's not enforced in production for perf. + if (isDisallowedContextReadInDEV) { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + } + } + + if (lastContextWithAllBitsObserved === context) ; else if (observedBits === false || observedBits === 0) ; else { + var resolvedObservedBits; // Avoid deopting on observable arguments or heterogeneous types. + + if (typeof observedBits !== 'number' || observedBits === MAX_SIGNED_31_BIT_INT) { + // Observe all updates. + lastContextWithAllBitsObserved = context; + resolvedObservedBits = MAX_SIGNED_31_BIT_INT; + } else { + resolvedObservedBits = observedBits; + } + + var contextItem = { + context: context, + observedBits: resolvedObservedBits, + next: null + }; + + if (lastContextDependency === null) { + if (!(currentlyRenderingFiber !== null)) { + { + throw Error( "Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo()." ); + } + } // This is the first dependency for this component. Create a new list. + + + lastContextDependency = contextItem; + currentlyRenderingFiber.dependencies = { + lanes: NoLanes, + firstContext: contextItem, + responders: null + }; + } else { + // Append a new context item. + lastContextDependency = lastContextDependency.next = contextItem; + } + } + + return context._currentValue ; +} + +var UpdateState = 0; +var ReplaceState = 1; +var ForceUpdate = 2; +var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`. +// It should only be read right after calling `processUpdateQueue`, via +// `checkHasForceUpdateAfterProcessing`. + +var hasForceUpdate = false; +var didWarnUpdateInsideUpdate; +var currentlyProcessingQueue; + +{ + didWarnUpdateInsideUpdate = false; + currentlyProcessingQueue = null; +} + +function initializeUpdateQueue(fiber) { + var queue = { + baseState: fiber.memoizedState, + firstBaseUpdate: null, + lastBaseUpdate: null, + shared: { + pending: null + }, + effects: null + }; + fiber.updateQueue = queue; +} +function cloneUpdateQueue(current, workInProgress) { + // Clone the update queue from current. Unless it's already a clone. + var queue = workInProgress.updateQueue; + var currentQueue = current.updateQueue; + + if (queue === currentQueue) { + var clone = { + baseState: currentQueue.baseState, + firstBaseUpdate: currentQueue.firstBaseUpdate, + lastBaseUpdate: currentQueue.lastBaseUpdate, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress.updateQueue = clone; + } +} +function createUpdate(eventTime, lane) { + var update = { + eventTime: eventTime, + lane: lane, + tag: UpdateState, + payload: null, + callback: null, + next: null + }; + return update; +} +function enqueueUpdate(fiber, update) { + var updateQueue = fiber.updateQueue; + + if (updateQueue === null) { + // Only occurs if the fiber has been unmounted. + return; + } + + var sharedQueue = updateQueue.shared; + var pending = sharedQueue.pending; + + if (pending === null) { + // This is the first update. Create a circular list. + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + + sharedQueue.pending = update; + + { + if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) { + error('An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.'); + + didWarnUpdateInsideUpdate = true; + } + } +} +function enqueueCapturedUpdate(workInProgress, capturedUpdate) { + // Captured updates are updates that are thrown by a child during the render + // phase. They should be discarded if the render is aborted. Therefore, + // we should only put them on the work-in-progress queue, not the current one. + var queue = workInProgress.updateQueue; // Check if the work-in-progress queue is a clone. + + var current = workInProgress.alternate; + + if (current !== null) { + var currentQueue = current.updateQueue; + + if (queue === currentQueue) { + // The work-in-progress queue is the same as current. This happens when + // we bail out on a parent fiber that then captures an error thrown by + // a child. Since we want to append the update only to the work-in + // -progress queue, we need to clone the updates. We usually clone during + // processUpdateQueue, but that didn't happen in this case because we + // skipped over the parent when we bailed out. + var newFirst = null; + var newLast = null; + var firstBaseUpdate = queue.firstBaseUpdate; + + if (firstBaseUpdate !== null) { + // Loop through the updates and clone them. + var update = firstBaseUpdate; + + do { + var clone = { + eventTime: update.eventTime, + lane: update.lane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + + if (newLast === null) { + newFirst = newLast = clone; + } else { + newLast.next = clone; + newLast = clone; + } + + update = update.next; + } while (update !== null); // Append the captured update the end of the cloned list. + + + if (newLast === null) { + newFirst = newLast = capturedUpdate; + } else { + newLast.next = capturedUpdate; + newLast = capturedUpdate; + } + } else { + // There are no base updates. + newFirst = newLast = capturedUpdate; + } + + queue = { + baseState: currentQueue.baseState, + firstBaseUpdate: newFirst, + lastBaseUpdate: newLast, + shared: currentQueue.shared, + effects: currentQueue.effects + }; + workInProgress.updateQueue = queue; + return; + } + } // Append the update to the end of the list. + + + var lastBaseUpdate = queue.lastBaseUpdate; + + if (lastBaseUpdate === null) { + queue.firstBaseUpdate = capturedUpdate; + } else { + lastBaseUpdate.next = capturedUpdate; + } + + queue.lastBaseUpdate = capturedUpdate; +} + +function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) { + switch (update.tag) { + case ReplaceState: + { + var payload = update.payload; + + if (typeof payload === 'function') { + // Updater function + { + enterDisallowedContextReadInDEV(); + } + + var nextState = payload.call(instance, prevState, nextProps); + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + payload.call(instance, prevState, nextProps); + } finally { + reenableLogs(); + } + } + + exitDisallowedContextReadInDEV(); + } + + return nextState; + } // State object + + + return payload; + } + + case CaptureUpdate: + { + workInProgress.flags = workInProgress.flags & ~ShouldCapture | DidCapture; + } + // Intentional fallthrough + + case UpdateState: + { + var _payload = update.payload; + var partialState; + + if (typeof _payload === 'function') { + // Updater function + { + enterDisallowedContextReadInDEV(); + } + + partialState = _payload.call(instance, prevState, nextProps); + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + _payload.call(instance, prevState, nextProps); + } finally { + reenableLogs(); + } + } + + exitDisallowedContextReadInDEV(); + } + } else { + // Partial state object + partialState = _payload; + } + + if (partialState === null || partialState === undefined) { + // Null and undefined are treated as no-ops. + return prevState; + } // Merge the partial state and the previous state. + + + return _assign({}, prevState, partialState); + } + + case ForceUpdate: + { + hasForceUpdate = true; + return prevState; + } + } + + return prevState; +} + +function processUpdateQueue(workInProgress, props, instance, renderLanes) { + // This is always non-null on a ClassComponent or HostRoot + var queue = workInProgress.updateQueue; + hasForceUpdate = false; + + { + currentlyProcessingQueue = queue.shared; + } + + var firstBaseUpdate = queue.firstBaseUpdate; + var lastBaseUpdate = queue.lastBaseUpdate; // Check if there are pending updates. If so, transfer them to the base queue. + + var pendingQueue = queue.shared.pending; + + if (pendingQueue !== null) { + queue.shared.pending = null; // The pending queue is circular. Disconnect the pointer between first + // and last so that it's non-circular. + + var lastPendingUpdate = pendingQueue; + var firstPendingUpdate = lastPendingUpdate.next; + lastPendingUpdate.next = null; // Append pending updates to base queue + + if (lastBaseUpdate === null) { + firstBaseUpdate = firstPendingUpdate; + } else { + lastBaseUpdate.next = firstPendingUpdate; + } + + lastBaseUpdate = lastPendingUpdate; // If there's a current queue, and it's different from the base queue, then + // we need to transfer the updates to that queue, too. Because the base + // queue is a singly-linked list with no cycles, we can append to both + // lists and take advantage of structural sharing. + // TODO: Pass `current` as argument + + var current = workInProgress.alternate; + + if (current !== null) { + // This is always non-null on a ClassComponent or HostRoot + var currentQueue = current.updateQueue; + var currentLastBaseUpdate = currentQueue.lastBaseUpdate; + + if (currentLastBaseUpdate !== lastBaseUpdate) { + if (currentLastBaseUpdate === null) { + currentQueue.firstBaseUpdate = firstPendingUpdate; + } else { + currentLastBaseUpdate.next = firstPendingUpdate; + } + + currentQueue.lastBaseUpdate = lastPendingUpdate; + } + } + } // These values may change as we process the queue. + + + if (firstBaseUpdate !== null) { + // Iterate through the list of updates to compute the result. + var newState = queue.baseState; // TODO: Don't need to accumulate this. Instead, we can remove renderLanes + // from the original lanes. + + var newLanes = NoLanes; + var newBaseState = null; + var newFirstBaseUpdate = null; + var newLastBaseUpdate = null; + var update = firstBaseUpdate; + + do { + var updateLane = update.lane; + var updateEventTime = update.eventTime; + + if (!isSubsetOfLanes(renderLanes, updateLane)) { + // Priority is insufficient. Skip this update. If this is the first + // skipped update, the previous update/state is the new base + // update/state. + var clone = { + eventTime: updateEventTime, + lane: updateLane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + + if (newLastBaseUpdate === null) { + newFirstBaseUpdate = newLastBaseUpdate = clone; + newBaseState = newState; + } else { + newLastBaseUpdate = newLastBaseUpdate.next = clone; + } // Update the remaining priority in the queue. + + + newLanes = mergeLanes(newLanes, updateLane); + } else { + // This update does have sufficient priority. + if (newLastBaseUpdate !== null) { + var _clone = { + eventTime: updateEventTime, + // This update is going to be committed so we never want uncommit + // it. Using NoLane works because 0 is a subset of all bitmasks, so + // this will never be skipped by the check above. + lane: NoLane, + tag: update.tag, + payload: update.payload, + callback: update.callback, + next: null + }; + newLastBaseUpdate = newLastBaseUpdate.next = _clone; + } // Process this update. + + + newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance); + var callback = update.callback; + + if (callback !== null) { + workInProgress.flags |= Callback; + var effects = queue.effects; + + if (effects === null) { + queue.effects = [update]; + } else { + effects.push(update); + } + } + } + + update = update.next; + + if (update === null) { + pendingQueue = queue.shared.pending; + + if (pendingQueue === null) { + break; + } else { + // An update was scheduled from inside a reducer. Add the new + // pending updates to the end of the list and keep processing. + var _lastPendingUpdate = pendingQueue; // Intentionally unsound. Pending updates form a circular list, but we + // unravel them when transferring them to the base queue. + + var _firstPendingUpdate = _lastPendingUpdate.next; + _lastPendingUpdate.next = null; + update = _firstPendingUpdate; + queue.lastBaseUpdate = _lastPendingUpdate; + queue.shared.pending = null; + } + } + } while (true); + + if (newLastBaseUpdate === null) { + newBaseState = newState; + } + + queue.baseState = newBaseState; + queue.firstBaseUpdate = newFirstBaseUpdate; + queue.lastBaseUpdate = newLastBaseUpdate; // Set the remaining expiration time to be whatever is remaining in the queue. + // This should be fine because the only two other things that contribute to + // expiration time are props and context. We're already in the middle of the + // begin phase by the time we start processing the queue, so we've already + // dealt with the props. Context in components that specify + // shouldComponentUpdate is tricky; but we'll have to account for + // that regardless. + + markSkippedUpdateLanes(newLanes); + workInProgress.lanes = newLanes; + workInProgress.memoizedState = newState; + } + + { + currentlyProcessingQueue = null; + } +} + +function callCallback(callback, context) { + if (!(typeof callback === 'function')) { + { + throw Error( "Invalid argument passed as callback. Expected a function. Instead received: " + callback ); + } + } + + callback.call(context); +} + +function resetHasForceUpdateBeforeProcessing() { + hasForceUpdate = false; +} +function checkHasForceUpdateAfterProcessing() { + return hasForceUpdate; +} +function commitUpdateQueue(finishedWork, finishedQueue, instance) { + // Commit the effects + var effects = finishedQueue.effects; + finishedQueue.effects = null; + + if (effects !== null) { + for (var i = 0; i < effects.length; i++) { + var effect = effects[i]; + var callback = effect.callback; + + if (callback !== null) { + effect.callback = null; + callCallback(callback, instance); + } + } + } +} + +var fakeInternalInstance = {}; +var isArray = Array.isArray; // React.Component uses a shared frozen object by default. +// We'll use it to determine whether we need to initialize legacy refs. + +var emptyRefsObject = new React.Component().refs; +var didWarnAboutStateAssignmentForComponent; +var didWarnAboutUninitializedState; +var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate; +var didWarnAboutLegacyLifecyclesAndDerivedState; +var didWarnAboutUndefinedDerivedState; +var warnOnUndefinedDerivedState; +var warnOnInvalidCallback; +var didWarnAboutDirectlyAssigningPropsToState; +var didWarnAboutContextTypeAndContextTypes; +var didWarnAboutInvalidateContextType; + +{ + didWarnAboutStateAssignmentForComponent = new Set(); + didWarnAboutUninitializedState = new Set(); + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set(); + didWarnAboutLegacyLifecyclesAndDerivedState = new Set(); + didWarnAboutDirectlyAssigningPropsToState = new Set(); + didWarnAboutUndefinedDerivedState = new Set(); + didWarnAboutContextTypeAndContextTypes = new Set(); + didWarnAboutInvalidateContextType = new Set(); + var didWarnOnInvalidCallback = new Set(); + + warnOnInvalidCallback = function (callback, callerName) { + if (callback === null || typeof callback === 'function') { + return; + } + + var key = callerName + '_' + callback; + + if (!didWarnOnInvalidCallback.has(key)) { + didWarnOnInvalidCallback.add(key); + + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); + } + }; + + warnOnUndefinedDerivedState = function (type, partialState) { + if (partialState === undefined) { + var componentName = getComponentName(type) || 'Component'; + + if (!didWarnAboutUndefinedDerivedState.has(componentName)) { + didWarnAboutUndefinedDerivedState.add(componentName); + + error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName); + } + } + }; // This is so gross but it's at least non-critical and can be removed if + // it causes problems. This is meant to give a nicer error message for + // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component, + // ...)) which otherwise throws a "_processChildContext is not a function" + // exception. + + + Object.defineProperty(fakeInternalInstance, '_processChildContext', { + enumerable: false, + value: function () { + { + { + throw Error( "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)." ); + } + } + } + }); + Object.freeze(fakeInternalInstance); +} + +function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) { + var prevState = workInProgress.memoizedState; + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + // Invoke the function an extra time to help detect side-effects. + getDerivedStateFromProps(nextProps, prevState); + } finally { + reenableLogs(); + } + } + } + + var partialState = getDerivedStateFromProps(nextProps, prevState); + + { + warnOnUndefinedDerivedState(ctor, partialState); + } // Merge the partial state and the previous state. + + + var memoizedState = partialState === null || partialState === undefined ? prevState : _assign({}, prevState, partialState); + workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the + // base state. + + if (workInProgress.lanes === NoLanes) { + // Queue is always non-null for classes + var updateQueue = workInProgress.updateQueue; + updateQueue.baseState = memoizedState; + } +} +var classComponentUpdater = { + isMounted: isMounted, + enqueueSetState: function (inst, payload, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.payload = payload; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'setState'); + } + + update.callback = callback; + } + + enqueueUpdate(fiber, update); + scheduleUpdateOnFiber(fiber, lane, eventTime); + }, + enqueueReplaceState: function (inst, payload, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.tag = ReplaceState; + update.payload = payload; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'replaceState'); + } + + update.callback = callback; + } + + enqueueUpdate(fiber, update); + scheduleUpdateOnFiber(fiber, lane, eventTime); + }, + enqueueForceUpdate: function (inst, callback) { + var fiber = get(inst); + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = createUpdate(eventTime, lane); + update.tag = ForceUpdate; + + if (callback !== undefined && callback !== null) { + { + warnOnInvalidCallback(callback, 'forceUpdate'); + } + + update.callback = callback; + } + + enqueueUpdate(fiber, update); + scheduleUpdateOnFiber(fiber, lane, eventTime); + } +}; + +function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) { + var instance = workInProgress.stateNode; + + if (typeof instance.shouldComponentUpdate === 'function') { + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + // Invoke the function an extra time to help detect side-effects. + instance.shouldComponentUpdate(newProps, newState, nextContext); + } finally { + reenableLogs(); + } + } + } + + var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext); + + { + if (shouldUpdate === undefined) { + error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(ctor) || 'Component'); + } + } + + return shouldUpdate; + } + + if (ctor.prototype && ctor.prototype.isPureReactComponent) { + return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState); + } + + return true; +} + +function checkClassInstance(workInProgress, ctor, newProps) { + var instance = workInProgress.stateNode; + + { + var name = getComponentName(ctor) || 'Component'; + var renderPresent = instance.render; + + if (!renderPresent) { + if (ctor.prototype && typeof ctor.prototype.render === 'function') { + error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name); + } else { + error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name); + } + } + + if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) { + error('getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name); + } + + if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) { + error('getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name); + } + + if (instance.propTypes) { + error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name); + } + + if (instance.contextType) { + error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name); + } + + { + if (instance.contextTypes) { + error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name); + } + + if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) { + didWarnAboutContextTypeAndContextTypes.add(ctor); + + error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name); + } + } + + if (typeof instance.componentShouldUpdate === 'function') { + error('%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name); + } + + if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') { + error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(ctor) || 'A pure component'); + } + + if (typeof instance.componentDidUnmount === 'function') { + error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name); + } + + if (typeof instance.componentDidReceiveProps === 'function') { + error('%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name); + } + + if (typeof instance.componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name); + } + + if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') { + error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name); + } + + var hasMutatedProps = instance.props !== newProps; + + if (instance.props !== undefined && hasMutatedProps) { + error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name); + } + + if (instance.defaultProps) { + error('Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name); + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) { + didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor); + + error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentName(ctor)); + } + + if (typeof instance.getDerivedStateFromProps === 'function') { + error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + + if (typeof instance.getDerivedStateFromError === 'function') { + error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name); + } + + if (typeof ctor.getSnapshotBeforeUpdate === 'function') { + error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name); + } + + var _state = instance.state; + + if (_state && (typeof _state !== 'object' || isArray(_state))) { + error('%s.state: must be set to an object or null', name); + } + + if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') { + error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name); + } + } +} + +function adoptClassInstance(workInProgress, instance) { + instance.updater = classComponentUpdater; + workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates + + set(instance, workInProgress); + + { + instance._reactInternalInstance = fakeInternalInstance; + } +} + +function constructClassInstance(workInProgress, ctor, props) { + var isLegacyContextConsumer = false; + var unmaskedContext = emptyContextObject; + var context = emptyContextObject; + var contextType = ctor.contextType; + + { + if ('contextType' in ctor) { + var isValid = // Allow null for conditional declaration + contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer> + + if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) { + didWarnAboutInvalidateContextType.add(ctor); + var addendum = ''; + + if (contextType === undefined) { + addendum = ' However, it is set to undefined. ' + 'This can be caused by a typo or by mixing up named and default imports. ' + 'This can also happen due to a circular dependency, so ' + 'try moving the createContext() call to a separate file.'; + } else if (typeof contextType !== 'object') { + addendum = ' However, it is set to a ' + typeof contextType + '.'; + } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) { + addendum = ' Did you accidentally pass the Context.Provider instead?'; + } else if (contextType._context !== undefined) { + // <Context.Consumer> + addendum = ' Did you accidentally pass the Context.Consumer instead?'; + } else { + addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.'; + } + + error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentName(ctor) || 'Component', addendum); + } + } + } + + if (typeof contextType === 'object' && contextType !== null) { + context = readContext(contextType); + } else { + unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + var contextTypes = ctor.contextTypes; + isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined; + context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject; + } // Instantiate twice to help detect side-effects. + + + { + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + new ctor(props, context); // eslint-disable-line no-new + } finally { + reenableLogs(); + } + } + } + + var instance = new ctor(props, context); + var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null; + adoptClassInstance(workInProgress, instance); + + { + if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) { + var componentName = getComponentName(ctor) || 'Component'; + + if (!didWarnAboutUninitializedState.has(componentName)) { + didWarnAboutUninitializedState.add(componentName); + + error('`%s` uses `getDerivedStateFromProps` but its initial state is ' + '%s. This is not recommended. Instead, define the initial state by ' + 'assigning an object to `this.state` in the constructor of `%s`. ' + 'This ensures that `getDerivedStateFromProps` arguments have a consistent shape.', componentName, instance.state === null ? 'null' : 'undefined', componentName); + } + } // If new component APIs are defined, "unsafe" lifecycles won't be called. + // Warn about these lifecycles if they are present. + // Don't warn about react-lifecycles-compat polyfilled methods though. + + + if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') { + var foundWillMountName = null; + var foundWillReceivePropsName = null; + var foundWillUpdateName = null; + + if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) { + foundWillMountName = 'componentWillMount'; + } else if (typeof instance.UNSAFE_componentWillMount === 'function') { + foundWillMountName = 'UNSAFE_componentWillMount'; + } + + if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) { + foundWillReceivePropsName = 'componentWillReceiveProps'; + } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps'; + } + + if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) { + foundWillUpdateName = 'componentWillUpdate'; + } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + foundWillUpdateName = 'UNSAFE_componentWillUpdate'; + } + + if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) { + var _componentName = getComponentName(ctor) || 'Component'; + + var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()'; + + if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) { + didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName); + + error('Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n' + '%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\n' + 'The above lifecycles should be removed. Learn more about this warning here:\n' + 'https://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n " + foundWillUpdateName : ''); + } + } + } + } // Cache unmasked context so we can avoid recreating masked context unless necessary. + // ReactFiberContext usually updates this cache but can't for newly-created instances. + + + if (isLegacyContextConsumer) { + cacheContext(workInProgress, unmaskedContext, context); + } + + return instance; +} + +function callComponentWillMount(workInProgress, instance) { + var oldState = instance.state; + + if (typeof instance.componentWillMount === 'function') { + instance.componentWillMount(); + } + + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); + } + + if (oldState !== instance.state) { + { + error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentName(workInProgress.type) || 'Component'); + } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } +} + +function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) { + var oldState = instance.state; + + if (typeof instance.componentWillReceiveProps === 'function') { + instance.componentWillReceiveProps(newProps, nextContext); + } + + if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') { + instance.UNSAFE_componentWillReceiveProps(newProps, nextContext); + } + + if (instance.state !== oldState) { + { + var componentName = getComponentName(workInProgress.type) || 'Component'; + + if (!didWarnAboutStateAssignmentForComponent.has(componentName)) { + didWarnAboutStateAssignmentForComponent.add(componentName); + + error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName); + } + } + + classComponentUpdater.enqueueReplaceState(instance, instance.state, null); + } +} // Invokes the mount life-cycles on a previously never rendered instance. + + +function mountClassInstance(workInProgress, ctor, newProps, renderLanes) { + { + checkClassInstance(workInProgress, ctor, newProps); + } + + var instance = workInProgress.stateNode; + instance.props = newProps; + instance.state = workInProgress.memoizedState; + instance.refs = emptyRefsObject; + initializeUpdateQueue(workInProgress); + var contextType = ctor.contextType; + + if (typeof contextType === 'object' && contextType !== null) { + instance.context = readContext(contextType); + } else { + var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + instance.context = getMaskedContext(workInProgress, unmaskedContext); + } + + { + if (instance.state === newProps) { + var componentName = getComponentName(ctor) || 'Component'; + + if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) { + didWarnAboutDirectlyAssigningPropsToState.add(componentName); + + error('%s: It is not recommended to assign props directly to state ' + "because updates to props won't be reflected in state. " + 'In most cases, it is better to use props directly.', componentName); + } + } + + if (workInProgress.mode & StrictMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance); + } + + { + ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance); + } + } + + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + instance.state = workInProgress.memoizedState; + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + instance.state = workInProgress.memoizedState; + } // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + + if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's + // process them now. + + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + instance.state = workInProgress.memoizedState; + } + + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } +} + +function resumeMountClassInstance(workInProgress, ctor, newProps, renderLanes) { + var instance = workInProgress.stateNode; + var oldProps = workInProgress.memoizedProps; + instance.props = oldProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + + if (typeof contextType === 'object' && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext); + } + + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what + // ever the previously attempted to render - not the "current". However, + // during componentDidUpdate we pass the "current" props. + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { + if (oldProps !== newProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + } + } + + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + newState = workInProgress.memoizedState; + + if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } + + return false; + } + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress.memoizedState; + } + + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); + + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) { + if (typeof instance.componentWillMount === 'function') { + instance.componentWillMount(); + } + + if (typeof instance.UNSAFE_componentWillMount === 'function') { + instance.UNSAFE_componentWillMount(); + } + } + + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } + } else { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidMount === 'function') { + workInProgress.flags |= Update; + } // If shouldComponentUpdate returned false, we should still update the + // memoized state to indicate that this work can be reused. + + + workInProgress.memoizedProps = newProps; + workInProgress.memoizedState = newState; + } // Update the existing instance's state, props, and context pointers even + // if shouldComponentUpdate returns false. + + + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; +} // Invokes the update life-cycles and returns false if it shouldn't rerender. + + +function updateClassInstance(current, workInProgress, ctor, newProps, renderLanes) { + var instance = workInProgress.stateNode; + cloneUpdateQueue(current, workInProgress); + var unresolvedOldProps = workInProgress.memoizedProps; + var oldProps = workInProgress.type === workInProgress.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress.type, unresolvedOldProps); + instance.props = oldProps; + var unresolvedNewProps = workInProgress.pendingProps; + var oldContext = instance.context; + var contextType = ctor.contextType; + var nextContext = emptyContextObject; + + if (typeof contextType === 'object' && contextType !== null) { + nextContext = readContext(contextType); + } else { + var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true); + nextContext = getMaskedContext(workInProgress, nextUnmaskedContext); + } + + var getDerivedStateFromProps = ctor.getDerivedStateFromProps; + var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what + // ever the previously attempted to render - not the "current". However, + // during componentDidUpdate we pass the "current" props. + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) { + if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) { + callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext); + } + } + + resetHasForceUpdateBeforeProcessing(); + var oldState = workInProgress.memoizedState; + var newState = instance.state = oldState; + processUpdateQueue(workInProgress, newProps, instance, renderLanes); + newState = workInProgress.memoizedState; + + if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Update; + } + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Snapshot; + } + } + + return false; + } + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps); + newState = workInProgress.memoizedState; + } + + var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext); + + if (shouldUpdate) { + // In order to support react-lifecycles-compat polyfilled components, + // Unsafe lifecycles should not be invoked for components using the new APIs. + if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) { + if (typeof instance.componentWillUpdate === 'function') { + instance.componentWillUpdate(newProps, newState, nextContext); + } + + if (typeof instance.UNSAFE_componentWillUpdate === 'function') { + instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext); + } + } + + if (typeof instance.componentDidUpdate === 'function') { + workInProgress.flags |= Update; + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + workInProgress.flags |= Snapshot; + } + } else { + // If an update was already in progress, we should schedule an Update + // effect even though we're bailing out, so that cWU/cDU are called. + if (typeof instance.componentDidUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Update; + } + } + + if (typeof instance.getSnapshotBeforeUpdate === 'function') { + if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) { + workInProgress.flags |= Snapshot; + } + } // If shouldComponentUpdate returned false, we should still update the + // memoized props/state to indicate that this work can be reused. + + + workInProgress.memoizedProps = newProps; + workInProgress.memoizedState = newState; + } // Update the existing instance's state, props, and context pointers even + // if shouldComponentUpdate returns false. + + + instance.props = newProps; + instance.state = newState; + instance.context = nextContext; + return shouldUpdate; +} + +var didWarnAboutMaps; +var didWarnAboutGenerators; +var didWarnAboutStringRefs; +var ownerHasKeyUseWarning; +var ownerHasFunctionTypeWarning; + +var warnForMissingKey = function (child, returnFiber) {}; + +{ + didWarnAboutMaps = false; + didWarnAboutGenerators = false; + didWarnAboutStringRefs = {}; + /** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + ownerHasKeyUseWarning = {}; + ownerHasFunctionTypeWarning = {}; + + warnForMissingKey = function (child, returnFiber) { + if (child === null || typeof child !== 'object') { + return; + } + + if (!child._store || child._store.validated || child.key != null) { + return; + } + + if (!(typeof child._store === 'object')) { + { + throw Error( "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + child._store.validated = true; + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (ownerHasKeyUseWarning[componentName]) { + return; + } + + ownerHasKeyUseWarning[componentName] = true; + + error('Each child in a list should have a unique ' + '"key" prop. See https://reactjs.org/link/warning-keys for ' + 'more information.'); + }; +} + +var isArray$1 = Array.isArray; + +function coerceRef(returnFiber, current, element) { + var mixedRef = element.ref; + + if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') { + { + // TODO: Clean this up once we turn on the string ref warning for + // everyone, because the strict mode case will no longer be relevant + if ((returnFiber.mode & StrictMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs + // because these cannot be automatically converted to an arrow function + // using a codemod. Therefore, we don't have to warn about string refs again. + !(element._owner && element._self && element._owner.stateNode !== element._self)) { + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (!didWarnAboutStringRefs[componentName]) { + { + error('A string ref, "%s", has been found within a strict mode tree. ' + 'String refs are a source of potential bugs and should be avoided. ' + 'We recommend using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', mixedRef); + } + + didWarnAboutStringRefs[componentName] = true; + } + } + } + + if (element._owner) { + var owner = element._owner; + var inst; + + if (owner) { + var ownerFiber = owner; + + if (!(ownerFiber.tag === ClassComponent)) { + { + throw Error( "Function components cannot have string refs. We recommend using useRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref" ); + } + } + + inst = ownerFiber.stateNode; + } + + if (!inst) { + { + throw Error( "Missing owner for string ref " + mixedRef + ". This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref + + if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) { + return current.ref; + } + + var ref = function (value) { + var refs = inst.refs; + + if (refs === emptyRefsObject) { + // This is a lazy pooled frozen object, so we need to initialize. + refs = inst.refs = {}; + } + + if (value === null) { + delete refs[stringRef]; + } else { + refs[stringRef] = value; + } + }; + + ref._stringRef = stringRef; + return ref; + } else { + if (!(typeof mixedRef === 'string')) { + { + throw Error( "Expected ref to be a function, a string, an object returned by React.createRef(), or null." ); + } + } + + if (!element._owner) { + { + throw Error( "Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of the following reasons:\n1. You may be adding a ref to a function component\n2. You may be adding a ref to a component that was not created inside a component's render method\n3. You have multiple copies of React loaded\nSee https://reactjs.org/link/refs-must-have-owner for more information." ); + } + } + } + } + + return mixedRef; +} + +function throwOnInvalidObjectType(returnFiber, newChild) { + if (returnFiber.type !== 'textarea') { + { + { + throw Error( "Objects are not valid as a React child (found: " + (Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild) + "). If you meant to render a collection of children, use an array instead." ); + } + } + } +} + +function warnOnFunctionType(returnFiber) { + { + var componentName = getComponentName(returnFiber.type) || 'Component'; + + if (ownerHasFunctionTypeWarning[componentName]) { + return; + } + + ownerHasFunctionTypeWarning[componentName] = true; + + error('Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.'); + } +} // We avoid inlining this to avoid potential deopts from using try/catch. +// to be able to optimize each path individually by branching early. This needs +// a compiler or we can do it manually. Helpers that don't need this branching +// live outside of this function. + + +function ChildReconciler(shouldTrackSideEffects) { + function deleteChild(returnFiber, childToDelete) { + if (!shouldTrackSideEffects) { + // Noop. + return; + } // Deletions are added in reversed order so we add it to the front. + // At this point, the return fiber's effect list is empty except for + // deletions, so we can just append the deletion to the list. The remaining + // effects aren't added until the complete phase. Once we implement + // resuming, this may not be true. + + + var last = returnFiber.lastEffect; + + if (last !== null) { + last.nextEffect = childToDelete; + returnFiber.lastEffect = childToDelete; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; + } + + childToDelete.nextEffect = null; + childToDelete.flags = Deletion; + } + + function deleteRemainingChildren(returnFiber, currentFirstChild) { + if (!shouldTrackSideEffects) { + // Noop. + return null; + } // TODO: For the shouldClone case, this could be micro-optimized a bit by + // assuming that after the first child we've already added everything. + + + var childToDelete = currentFirstChild; + + while (childToDelete !== null) { + deleteChild(returnFiber, childToDelete); + childToDelete = childToDelete.sibling; + } + + return null; + } + + function mapRemainingChildren(returnFiber, currentFirstChild) { + // Add the remaining children to a temporary map so that we can find them by + // keys quickly. Implicit (null) keys get added to this set with their index + // instead. + var existingChildren = new Map(); + var existingChild = currentFirstChild; + + while (existingChild !== null) { + if (existingChild.key !== null) { + existingChildren.set(existingChild.key, existingChild); + } else { + existingChildren.set(existingChild.index, existingChild); + } + + existingChild = existingChild.sibling; + } + + return existingChildren; + } + + function useFiber(fiber, pendingProps) { + // We currently set sibling to null and index to 0 here because it is easy + // to forget to do before returning it. E.g. for the single child case. + var clone = createWorkInProgress(fiber, pendingProps); + clone.index = 0; + clone.sibling = null; + return clone; + } + + function placeChild(newFiber, lastPlacedIndex, newIndex) { + newFiber.index = newIndex; + + if (!shouldTrackSideEffects) { + // Noop. + return lastPlacedIndex; + } + + var current = newFiber.alternate; + + if (current !== null) { + var oldIndex = current.index; + + if (oldIndex < lastPlacedIndex) { + // This is a move. + newFiber.flags = Placement; + return lastPlacedIndex; + } else { + // This item can stay in place. + return oldIndex; + } + } else { + // This is an insertion. + newFiber.flags = Placement; + return lastPlacedIndex; + } + } + + function placeSingleChild(newFiber) { + // This is simpler for the single child case. We only need to do a + // placement for inserting new children. + if (shouldTrackSideEffects && newFiber.alternate === null) { + newFiber.flags = Placement; + } + + return newFiber; + } + + function updateTextNode(returnFiber, current, textContent, lanes) { + if (current === null || current.tag !== HostText) { + // Insert + var created = createFiberFromText(textContent, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, textContent); + existing.return = returnFiber; + return existing; + } + } + + function updateElement(returnFiber, current, element, lanes) { + if (current !== null) { + if (current.elementType === element.type || ( // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(current, element) )) { + // Move based on index + var existing = useFiber(current, element.props); + existing.ref = coerceRef(returnFiber, current, element); + existing.return = returnFiber; + + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } + + return existing; + } + } // Insert + + + var created = createFiberFromElement(element, returnFiber.mode, lanes); + created.ref = coerceRef(returnFiber, current, element); + created.return = returnFiber; + return created; + } + + function updatePortal(returnFiber, current, portal, lanes) { + if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) { + // Insert + var created = createFiberFromPortal(portal, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, portal.children || []); + existing.return = returnFiber; + return existing; + } + } + + function updateFragment(returnFiber, current, fragment, lanes, key) { + if (current === null || current.tag !== Fragment) { + // Insert + var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key); + created.return = returnFiber; + return created; + } else { + // Update + var existing = useFiber(current, fragment); + existing.return = returnFiber; + return existing; + } + } + + function createChild(returnFiber, newChild, lanes) { + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys. If the previous node is implicitly keyed + // we can continue to replace it without aborting even if it is not a text + // node. + var created = createFiberFromText('' + newChild, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var _created = createFiberFromElement(newChild, returnFiber.mode, lanes); + + _created.ref = coerceRef(returnFiber, null, newChild); + _created.return = returnFiber; + return _created; + } + + case REACT_PORTAL_TYPE: + { + var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes); + + _created2.return = returnFiber; + return _created2; + } + } + + if (isArray$1(newChild) || getIteratorFn(newChild)) { + var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null); + + _created3.return = returnFiber; + return _created3; + } + + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + return null; + } + + function updateSlot(returnFiber, oldFiber, newChild, lanes) { + // Update the fiber if the keys match, otherwise return null. + var key = oldFiber !== null ? oldFiber.key : null; + + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys. If the previous node is implicitly keyed + // we can continue to replace it without aborting even if it is not a text + // node. + if (key !== null) { + return null; + } + + return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes); + } + + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + if (newChild.key === key) { + if (newChild.type === REACT_FRAGMENT_TYPE) { + return updateFragment(returnFiber, oldFiber, newChild.props.children, lanes, key); + } + + return updateElement(returnFiber, oldFiber, newChild, lanes); + } else { + return null; + } + } + + case REACT_PORTAL_TYPE: + { + if (newChild.key === key) { + return updatePortal(returnFiber, oldFiber, newChild, lanes); + } else { + return null; + } + } + } + + if (isArray$1(newChild) || getIteratorFn(newChild)) { + if (key !== null) { + return null; + } + + return updateFragment(returnFiber, oldFiber, newChild, lanes, null); + } + + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + return null; + } + + function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) { + if (typeof newChild === 'string' || typeof newChild === 'number') { + // Text nodes don't have keys, so we neither have to check the old nor + // new node for the key. If both are text nodes, they match. + var matchedFiber = existingChildren.get(newIdx) || null; + return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes); + } + + if (typeof newChild === 'object' && newChild !== null) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + { + var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + + if (newChild.type === REACT_FRAGMENT_TYPE) { + return updateFragment(returnFiber, _matchedFiber, newChild.props.children, lanes, newChild.key); + } + + return updateElement(returnFiber, _matchedFiber, newChild, lanes); + } + + case REACT_PORTAL_TYPE: + { + var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null; + + return updatePortal(returnFiber, _matchedFiber2, newChild, lanes); + } + + } + + if (isArray$1(newChild) || getIteratorFn(newChild)) { + var _matchedFiber3 = existingChildren.get(newIdx) || null; + + return updateFragment(returnFiber, _matchedFiber3, newChild, lanes, null); + } + + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + return null; + } + /** + * Warns if there is a duplicate or missing key + */ + + + function warnOnInvalidKey(child, knownKeys, returnFiber) { + { + if (typeof child !== 'object' || child === null) { + return knownKeys; + } + + switch (child.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + warnForMissingKey(child, returnFiber); + var key = child.key; + + if (typeof key !== 'string') { + break; + } + + if (knownKeys === null) { + knownKeys = new Set(); + knownKeys.add(key); + break; + } + + if (!knownKeys.has(key)) { + knownKeys.add(key); + break; + } + + error('Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.', key); + + break; + } + } + + return knownKeys; + } + + function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) { + // This algorithm can't optimize by searching from both ends since we + // don't have backpointers on fibers. I'm trying to see how far we can get + // with that model. If it ends up not being worth the tradeoffs, we can + // add it later. + // Even with a two ended optimization, we'd want to optimize for the case + // where there are few changes and brute force the comparison instead of + // going for the Map. It'd like to explore hitting that path first in + // forward-only mode and only go for the Map once we notice that we need + // lots of look ahead. This doesn't handle reversal as well as two ended + // search but that's unusual. Besides, for the two ended optimization to + // work on Iterables, we'd need to copy the whole set. + // In this first iteration, we'll just live with hitting the bad case + // (adding everything to a Map) in for every insert/move. + // If you change this code, also update reconcileChildrenIterator() which + // uses the same algorithm. + { + // First, validate keys. + var knownKeys = null; + + for (var i = 0; i < newChildren.length; i++) { + var child = newChildren[i]; + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber); + } + } + + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + + for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } + + var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes); + + if (newFiber === null) { + // TODO: This breaks on empty slots like null children. That's + // unfortunate because it triggers the slow path all the time. We need + // a better way to communicate whether this was a miss or null, + // boolean, undefined, etc. + if (oldFiber === null) { + oldFiber = nextOldFiber; + } + + break; + } + + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + // We matched the slot, but we didn't reuse the existing fiber, so we + // need to delete the existing child. + deleteChild(returnFiber, oldFiber); + } + } + + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = newFiber; + } else { + // TODO: Defer siblings if we're not at the right index for this slot. + // I.e. if we had null values before, then we want to defer this + // for each null value. However, we also don't want to call updateSlot + // with the previous one. + previousNewFiber.sibling = newFiber; + } + + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } + + if (newIdx === newChildren.length) { + // We've reached the end of the new children. We can delete the rest. + deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; + } + + if (oldFiber === null) { + // If we don't have any more existing children we can choose a fast path + // since the rest will all be insertions. + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes); + + if (_newFiber === null) { + continue; + } + + lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = _newFiber; + } else { + previousNewFiber.sibling = _newFiber; + } + + previousNewFiber = _newFiber; + } + + return resultingFirstChild; + } // Add all children to a key map for quick lookups. + + + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + + for (; newIdx < newChildren.length; newIdx++) { + var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes); + + if (_newFiber2 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber2.alternate !== null) { + // The new fiber is a work in progress, but if there exists a + // current, that means that we reused the fiber. We need to delete + // it from the child list so that we don't add it to the deletion + // list. + existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key); + } + } + + lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + resultingFirstChild = _newFiber2; + } else { + previousNewFiber.sibling = _newFiber2; + } + + previousNewFiber = _newFiber2; + } + } + + if (shouldTrackSideEffects) { + // Any existing children that weren't consumed above were deleted. We need + // to add them to the deletion list. + existingChildren.forEach(function (child) { + return deleteChild(returnFiber, child); + }); + } + + return resultingFirstChild; + } + + function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) { + // This is the same implementation as reconcileChildrenArray(), + // but using the iterator instead. + var iteratorFn = getIteratorFn(newChildrenIterable); + + if (!(typeof iteratorFn === 'function')) { + { + throw Error( "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + { + // We don't support rendering Generators because it's a mutation. + // See https://github.com/facebook/react/issues/12995 + if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag + newChildrenIterable[Symbol.toStringTag] === 'Generator') { + if (!didWarnAboutGenerators) { + error('Using Generators as children is unsupported and will likely yield ' + 'unexpected results because enumerating a generator mutates it. ' + 'You may convert it to an array with `Array.from()` or the ' + '`[...spread]` operator before rendering. Keep in mind ' + 'you might need to polyfill these features for older browsers.'); + } + + didWarnAboutGenerators = true; + } // Warn about using Maps as children + + + if (newChildrenIterable.entries === iteratorFn) { + if (!didWarnAboutMaps) { + error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } // First, validate keys. + // We'll get a different iterator later for the main pass. + + + var _newChildren = iteratorFn.call(newChildrenIterable); + + if (_newChildren) { + var knownKeys = null; + + var _step = _newChildren.next(); + + for (; !_step.done; _step = _newChildren.next()) { + var child = _step.value; + knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber); + } + } + } + + var newChildren = iteratorFn.call(newChildrenIterable); + + if (!(newChildren != null)) { + { + throw Error( "An iterable object provided no iterator." ); + } + } + + var resultingFirstChild = null; + var previousNewFiber = null; + var oldFiber = currentFirstChild; + var lastPlacedIndex = 0; + var newIdx = 0; + var nextOldFiber = null; + var step = newChildren.next(); + + for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) { + if (oldFiber.index > newIdx) { + nextOldFiber = oldFiber; + oldFiber = null; + } else { + nextOldFiber = oldFiber.sibling; + } + + var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes); + + if (newFiber === null) { + // TODO: This breaks on empty slots like null children. That's + // unfortunate because it triggers the slow path all the time. We need + // a better way to communicate whether this was a miss or null, + // boolean, undefined, etc. + if (oldFiber === null) { + oldFiber = nextOldFiber; + } + + break; + } + + if (shouldTrackSideEffects) { + if (oldFiber && newFiber.alternate === null) { + // We matched the slot, but we didn't reuse the existing fiber, so we + // need to delete the existing child. + deleteChild(returnFiber, oldFiber); + } + } + + lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = newFiber; + } else { + // TODO: Defer siblings if we're not at the right index for this slot. + // I.e. if we had null values before, then we want to defer this + // for each null value. However, we also don't want to call updateSlot + // with the previous one. + previousNewFiber.sibling = newFiber; + } + + previousNewFiber = newFiber; + oldFiber = nextOldFiber; + } + + if (step.done) { + // We've reached the end of the new children. We can delete the rest. + deleteRemainingChildren(returnFiber, oldFiber); + return resultingFirstChild; + } + + if (oldFiber === null) { + // If we don't have any more existing children we can choose a fast path + // since the rest will all be insertions. + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber3 = createChild(returnFiber, step.value, lanes); + + if (_newFiber3 === null) { + continue; + } + + lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + // TODO: Move out of the loop. This only happens for the first run. + resultingFirstChild = _newFiber3; + } else { + previousNewFiber.sibling = _newFiber3; + } + + previousNewFiber = _newFiber3; + } + + return resultingFirstChild; + } // Add all children to a key map for quick lookups. + + + var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves. + + for (; !step.done; newIdx++, step = newChildren.next()) { + var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes); + + if (_newFiber4 !== null) { + if (shouldTrackSideEffects) { + if (_newFiber4.alternate !== null) { + // The new fiber is a work in progress, but if there exists a + // current, that means that we reused the fiber. We need to delete + // it from the child list so that we don't add it to the deletion + // list. + existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key); + } + } + + lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx); + + if (previousNewFiber === null) { + resultingFirstChild = _newFiber4; + } else { + previousNewFiber.sibling = _newFiber4; + } + + previousNewFiber = _newFiber4; + } + } + + if (shouldTrackSideEffects) { + // Any existing children that weren't consumed above were deleted. We need + // to add them to the deletion list. + existingChildren.forEach(function (child) { + return deleteChild(returnFiber, child); + }); + } + + return resultingFirstChild; + } + + function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) { + // There's no need to check for keys on text nodes since we don't have a + // way to define them. + if (currentFirstChild !== null && currentFirstChild.tag === HostText) { + // We already have an existing node so let's just update it and delete + // the rest. + deleteRemainingChildren(returnFiber, currentFirstChild.sibling); + var existing = useFiber(currentFirstChild, textContent); + existing.return = returnFiber; + return existing; + } // The existing first child is not a text node so we need to create one + // and delete the existing ones. + + + deleteRemainingChildren(returnFiber, currentFirstChild); + var created = createFiberFromText(textContent, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } + + function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) { + var key = element.key; + var child = currentFirstChild; + + while (child !== null) { + // TODO: If key === null and child.key === null, then this only applies to + // the first item in the list. + if (child.key === key) { + switch (child.tag) { + case Fragment: + { + if (element.type === REACT_FRAGMENT_TYPE) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, element.props.children); + existing.return = returnFiber; + + { + existing._debugSource = element._source; + existing._debugOwner = element._owner; + } + + return existing; + } + + break; + } + + case Block: + + // We intentionally fallthrough here if enableBlocksAPI is not on. + // eslint-disable-next-lined no-fallthrough + + default: + { + if (child.elementType === element.type || ( // Keep this check inline so it only runs on the false path: + isCompatibleFamilyForHotReloading(child, element) )) { + deleteRemainingChildren(returnFiber, child.sibling); + + var _existing3 = useFiber(child, element.props); + + _existing3.ref = coerceRef(returnFiber, child, element); + _existing3.return = returnFiber; + + { + _existing3._debugSource = element._source; + _existing3._debugOwner = element._owner; + } + + return _existing3; + } + + break; + } + } // Didn't match. + + + deleteRemainingChildren(returnFiber, child); + break; + } else { + deleteChild(returnFiber, child); + } + + child = child.sibling; + } + + if (element.type === REACT_FRAGMENT_TYPE) { + var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key); + created.return = returnFiber; + return created; + } else { + var _created4 = createFiberFromElement(element, returnFiber.mode, lanes); + + _created4.ref = coerceRef(returnFiber, currentFirstChild, element); + _created4.return = returnFiber; + return _created4; + } + } + + function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) { + var key = portal.key; + var child = currentFirstChild; + + while (child !== null) { + // TODO: If key === null and child.key === null, then this only applies to + // the first item in the list. + if (child.key === key) { + if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) { + deleteRemainingChildren(returnFiber, child.sibling); + var existing = useFiber(child, portal.children || []); + existing.return = returnFiber; + return existing; + } else { + deleteRemainingChildren(returnFiber, child); + break; + } + } else { + deleteChild(returnFiber, child); + } + + child = child.sibling; + } + + var created = createFiberFromPortal(portal, returnFiber.mode, lanes); + created.return = returnFiber; + return created; + } // This API will tag the children with the side-effect of the reconciliation + // itself. They will be added to the side-effect list as we pass through the + // children and the parent. + + + function reconcileChildFibers(returnFiber, currentFirstChild, newChild, lanes) { + // This function is not recursive. + // If the top level item is an array, we treat it as a set of children, + // not as a fragment. Nested arrays on the other hand will be treated as + // fragment nodes. Recursion happens at the normal flow. + // Handle top level unkeyed fragments as if they were arrays. + // This leads to an ambiguity between <>{[...]}</> and <>...</>. + // We treat the ambiguous cases above the same. + var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null; + + if (isUnkeyedTopLevelFragment) { + newChild = newChild.props.children; + } // Handle object types + + + var isObject = typeof newChild === 'object' && newChild !== null; + + if (isObject) { + switch (newChild.$$typeof) { + case REACT_ELEMENT_TYPE: + return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes)); + + case REACT_PORTAL_TYPE: + return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes)); + + } + } + + if (typeof newChild === 'string' || typeof newChild === 'number') { + return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, lanes)); + } + + if (isArray$1(newChild)) { + return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes); + } + + if (getIteratorFn(newChild)) { + return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes); + } + + if (isObject) { + throwOnInvalidObjectType(returnFiber, newChild); + } + + { + if (typeof newChild === 'function') { + warnOnFunctionType(returnFiber); + } + } + + if (typeof newChild === 'undefined' && !isUnkeyedTopLevelFragment) { + // If the new child is undefined, and the return fiber is a composite + // component, throw an error. If Fiber return types are disabled, + // we already threw above. + switch (returnFiber.tag) { + case ClassComponent: + { + { + var instance = returnFiber.stateNode; + + if (instance.render._isMockFunction) { + // We allow auto-mocks to proceed as if they're returning null. + break; + } + } + } + // Intentionally fall through to the next case, which handles both + // functions and classes + // eslint-disable-next-lined no-fallthrough + + case Block: + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + { + { + { + throw Error( (getComponentName(returnFiber.type) || 'Component') + "(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null." ); + } + } + } + } + } // Remaining cases are all treated as empty. + + + return deleteRemainingChildren(returnFiber, currentFirstChild); + } + + return reconcileChildFibers; +} + +var reconcileChildFibers = ChildReconciler(true); +var mountChildFibers = ChildReconciler(false); +function cloneChildFibers(current, workInProgress) { + if (!(current === null || workInProgress.child === current.child)) { + { + throw Error( "Resuming work not yet implemented." ); + } + } + + if (workInProgress.child === null) { + return; + } + + var currentChild = workInProgress.child; + var newChild = createWorkInProgress(currentChild, currentChild.pendingProps); + workInProgress.child = newChild; + newChild.return = workInProgress; + + while (currentChild.sibling !== null) { + currentChild = currentChild.sibling; + newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps); + newChild.return = workInProgress; + } + + newChild.sibling = null; +} // Reset a workInProgress child set to prepare it for a second pass. + +function resetChildFibers(workInProgress, lanes) { + var child = workInProgress.child; + + while (child !== null) { + resetWorkInProgress(child, lanes); + child = child.sibling; + } +} + +var NO_CONTEXT = {}; +var contextStackCursor$1 = createCursor(NO_CONTEXT); +var contextFiberStackCursor = createCursor(NO_CONTEXT); +var rootInstanceStackCursor = createCursor(NO_CONTEXT); + +function requiredContext(c) { + if (!(c !== NO_CONTEXT)) { + { + throw Error( "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + return c; +} + +function getRootHostContainer() { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + return rootInstance; +} + +function pushHostContainer(fiber, nextRootInstance) { + // Push current root instance onto the stack; + // This allows us to reset root when portals are popped. + push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it. + // This enables us to pop only Fibers that provide unique contexts. + + push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack. + // However, we can't just call getRootHostContext() and push it because + // we'd have a different number of entries on the stack depending on + // whether getRootHostContext() throws somewhere in renderer code or not. + // So we push an empty value first. This lets us safely unwind on errors. + + push(contextStackCursor$1, NO_CONTEXT, fiber); + var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it. + + pop(contextStackCursor$1, fiber); + push(contextStackCursor$1, nextRootContext, fiber); +} + +function popHostContainer(fiber) { + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); + pop(rootInstanceStackCursor, fiber); +} + +function getHostContext() { + var context = requiredContext(contextStackCursor$1.current); + return context; +} + +function pushHostContext(fiber) { + var rootInstance = requiredContext(rootInstanceStackCursor.current); + var context = requiredContext(contextStackCursor$1.current); + var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique. + + if (context === nextContext) { + return; + } // Track the context and the Fiber that provided it. + // This enables us to pop only Fibers that provide unique contexts. + + + push(contextFiberStackCursor, fiber, fiber); + push(contextStackCursor$1, nextContext, fiber); +} + +function popHostContext(fiber) { + // Do not pop unless this Fiber provided the current context. + // pushHostContext() only pushes Fibers that provide unique contexts. + if (contextFiberStackCursor.current !== fiber) { + return; + } + + pop(contextStackCursor$1, fiber); + pop(contextFiberStackCursor, fiber); +} + +var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is +// inherited deeply down the subtree. The upper bits only affect +// this immediate suspense boundary and gets reset each new +// boundary or suspense list. + +var SubtreeSuspenseContextMask = 1; // Subtree Flags: +// InvisibleParentSuspenseContext indicates that one of our parent Suspense +// boundaries is not currently showing visible main content. +// Either because it is already showing a fallback or is not mounted at all. +// We can use this to determine if it is desirable to trigger a fallback at +// the parent. If not, then we might need to trigger undesirable boundaries +// and/or suspend the commit to avoid hiding the parent content. + +var InvisibleParentSuspenseContext = 1; // Shallow Flags: +// ForceSuspenseFallback can be used by SuspenseList to force newly added +// items into their fallback state during one of the render passes. + +var ForceSuspenseFallback = 2; +var suspenseStackCursor = createCursor(DefaultSuspenseContext); +function hasSuspenseContext(parentContext, flag) { + return (parentContext & flag) !== 0; +} +function setDefaultShallowSuspenseContext(parentContext) { + return parentContext & SubtreeSuspenseContextMask; +} +function setShallowSuspenseContext(parentContext, shallowContext) { + return parentContext & SubtreeSuspenseContextMask | shallowContext; +} +function addSubtreeSuspenseContext(parentContext, subtreeContext) { + return parentContext | subtreeContext; +} +function pushSuspenseContext(fiber, newContext) { + push(suspenseStackCursor, newContext, fiber); +} +function popSuspenseContext(fiber) { + pop(suspenseStackCursor, fiber); +} + +function shouldCaptureSuspense(workInProgress, hasInvisibleParent) { + // If it was the primary children that just suspended, capture and render the + // fallback. Otherwise, don't capture and bubble to the next boundary. + var nextState = workInProgress.memoizedState; + + if (nextState !== null) { + if (nextState.dehydrated !== null) { + // A dehydrated boundary always captures. + return true; + } + + return false; + } + + var props = workInProgress.memoizedProps; // In order to capture, the Suspense component must have a fallback prop. + + if (props.fallback === undefined) { + return false; + } // Regular boundaries always capture. + + + if (props.unstable_avoidThisFallback !== true) { + return true; + } // If it's a boundary we should avoid, then we prefer to bubble up to the + // parent boundary if it is currently invisible. + + + if (hasInvisibleParent) { + return false; + } // If the parent is not able to handle it, we must handle it. + + + return true; +} +function findFirstSuspended(row) { + var node = row; + + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + + if (state !== null) { + var dehydrated = state.dehydrated; + + if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) { + return node; + } + } + } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't + // keep track of whether it suspended or not. + node.memoizedProps.revealOrder !== undefined) { + var didSuspend = (node.flags & DidCapture) !== NoFlags; + + if (didSuspend) { + return node; + } + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === row) { + return null; + } + + while (node.sibling === null) { + if (node.return === null || node.return === row) { + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + + return null; +} + +var NoFlags$1 = +/* */ +0; // Represents whether effect should fire. + +var HasEffect = +/* */ +1; // Represents the phase in which the effect (not the clean-up) fires. + +var Layout = +/* */ +2; +var Passive$1 = +/* */ +4; + +// This may have been an insertion or a hydration. + +var hydrationParentFiber = null; +var nextHydratableInstance = null; +var isHydrating = false; + +function enterHydrationState(fiber) { + + var parentInstance = fiber.stateNode.containerInfo; + nextHydratableInstance = getFirstHydratableChild(parentInstance); + hydrationParentFiber = fiber; + isHydrating = true; + return true; +} + +function deleteHydratableInstance(returnFiber, instance) { + { + switch (returnFiber.tag) { + case HostRoot: + didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance); + break; + + case HostComponent: + didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance); + break; + } + } + + var childToDelete = createFiberFromHostInstanceForDeletion(); + childToDelete.stateNode = instance; + childToDelete.return = returnFiber; + childToDelete.flags = Deletion; // This might seem like it belongs on progressedFirstDeletion. However, + // these children are not part of the reconciliation list of children. + // Even if we abort and rereconcile the children, that will try to hydrate + // again and the nodes are still in the host tree so these will be + // recreated. + + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = childToDelete; + returnFiber.lastEffect = childToDelete; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = childToDelete; + } +} + +function insertNonHydratedInstance(returnFiber, fiber) { + fiber.flags = fiber.flags & ~Hydrating | Placement; + + { + switch (returnFiber.tag) { + case HostRoot: + { + var parentContainer = returnFiber.stateNode.containerInfo; + + switch (fiber.tag) { + case HostComponent: + var type = fiber.type; + var props = fiber.pendingProps; + didNotFindHydratableContainerInstance(parentContainer, type); + break; + + case HostText: + var text = fiber.pendingProps; + didNotFindHydratableContainerTextInstance(parentContainer, text); + break; + } + + break; + } + + case HostComponent: + { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + + switch (fiber.tag) { + case HostComponent: + var _type = fiber.type; + var _props = fiber.pendingProps; + didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type); + break; + + case HostText: + var _text = fiber.pendingProps; + didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text); + break; + + case SuspenseComponent: + didNotFindHydratableSuspenseInstance(parentType, parentProps); + break; + } + + break; + } + + default: + return; + } + } +} + +function tryHydrate(fiber, nextInstance) { + switch (fiber.tag) { + case HostComponent: + { + var type = fiber.type; + var props = fiber.pendingProps; + var instance = canHydrateInstance(nextInstance, type); + + if (instance !== null) { + fiber.stateNode = instance; + return true; + } + + return false; + } + + case HostText: + { + var text = fiber.pendingProps; + var textInstance = canHydrateTextInstance(nextInstance, text); + + if (textInstance !== null) { + fiber.stateNode = textInstance; + return true; + } + + return false; + } + + case SuspenseComponent: + { + + return false; + } + + default: + return false; + } +} + +function tryToClaimNextHydratableInstance(fiber) { + if (!isHydrating) { + return; + } + + var nextInstance = nextHydratableInstance; + + if (!nextInstance) { + // Nothing to hydrate. Make it an insertion. + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } + + var firstAttemptedInstance = nextInstance; + + if (!tryHydrate(fiber, nextInstance)) { + // If we can't hydrate this instance let's try the next one. + // We use this as a heuristic. It's based on intuition and not data so it + // might be flawed or unnecessary. + nextInstance = getNextHydratableSibling(firstAttemptedInstance); + + if (!nextInstance || !tryHydrate(fiber, nextInstance)) { + // Nothing to hydrate. Make it an insertion. + insertNonHydratedInstance(hydrationParentFiber, fiber); + isHydrating = false; + hydrationParentFiber = fiber; + return; + } // We matched the next one, we'll now assume that the first one was + // superfluous and we'll delete it. Since we can't eagerly delete it + // we'll have to schedule a deletion. To do that, this node needs a dummy + // fiber associated with it. + + + deleteHydratableInstance(hydrationParentFiber, firstAttemptedInstance); + } + + hydrationParentFiber = fiber; + nextHydratableInstance = getFirstHydratableChild(nextInstance); +} + +function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) { + + var instance = fiber.stateNode; + var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber); // TODO: Type this specific to this type of component. + + fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there + // is a new ref we mark this as an update. + + if (updatePayload !== null) { + return true; + } + + return false; +} + +function prepareToHydrateHostTextInstance(fiber) { + + var textInstance = fiber.stateNode; + var textContent = fiber.memoizedProps; + var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber); + + { + if (shouldUpdate) { + // We assume that prepareToHydrateHostTextInstance is called in a context where the + // hydration parent is the parent host component of this host text. + var returnFiber = hydrationParentFiber; + + if (returnFiber !== null) { + switch (returnFiber.tag) { + case HostRoot: + { + var parentContainer = returnFiber.stateNode.containerInfo; + didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent); + break; + } + + case HostComponent: + { + var parentType = returnFiber.type; + var parentProps = returnFiber.memoizedProps; + var parentInstance = returnFiber.stateNode; + didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent); + break; + } + } + } + } + } + + return shouldUpdate; +} + +function skipPastDehydratedSuspenseInstance(fiber) { + + var suspenseState = fiber.memoizedState; + var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null; + + if (!suspenseInstance) { + { + throw Error( "Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance); +} + +function popToNextHostParent(fiber) { + var parent = fiber.return; + + while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) { + parent = parent.return; + } + + hydrationParentFiber = parent; +} + +function popHydrationState(fiber) { + + if (fiber !== hydrationParentFiber) { + // We're deeper than the current hydration context, inside an inserted + // tree. + return false; + } + + if (!isHydrating) { + // If we're not currently hydrating but we're in a hydration context, then + // we were an insertion and now need to pop up reenter hydration of our + // siblings. + popToNextHostParent(fiber); + isHydrating = true; + return false; + } + + var type = fiber.type; // If we have any remaining hydratable nodes, we need to delete them now. + // We only do this deeper than head and body since they tend to have random + // other nodes in them. We also ignore components with pure text content in + // side of them. + // TODO: Better heuristic. + + if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) { + var nextInstance = nextHydratableInstance; + + while (nextInstance) { + deleteHydratableInstance(fiber, nextInstance); + nextInstance = getNextHydratableSibling(nextInstance); + } + } + + popToNextHostParent(fiber); + + if (fiber.tag === SuspenseComponent) { + nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber); + } else { + nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null; + } + + return true; +} + +function resetHydrationState() { + + hydrationParentFiber = null; + nextHydratableInstance = null; + isHydrating = false; +} + +function getIsHydrating() { + return isHydrating; +} + +// and should be reset before starting a new render. +// This tracks which mutable sources need to be reset after a render. + +var workInProgressSources = []; +var rendererSigil$1; + +{ + // Used to detect multiple renderers using the same mutable source. + rendererSigil$1 = {}; +} + +function markSourceAsDirty(mutableSource) { + workInProgressSources.push(mutableSource); +} +function resetWorkInProgressVersions() { + for (var i = 0; i < workInProgressSources.length; i++) { + var mutableSource = workInProgressSources[i]; + + { + mutableSource._workInProgressVersionPrimary = null; + } + } + + workInProgressSources.length = 0; +} +function getWorkInProgressVersion(mutableSource) { + { + return mutableSource._workInProgressVersionPrimary; + } +} +function setWorkInProgressVersion(mutableSource, version) { + { + mutableSource._workInProgressVersionPrimary = version; + } + + workInProgressSources.push(mutableSource); +} +function warnAboutMultipleRenderersDEV(mutableSource) { + { + { + if (mutableSource._currentPrimaryRenderer == null) { + mutableSource._currentPrimaryRenderer = rendererSigil$1; + } else if (mutableSource._currentPrimaryRenderer !== rendererSigil$1) { + error('Detected multiple renderers concurrently rendering the ' + 'same mutable source. This is currently unsupported.'); + } + } + } +} // Eager reads the version of a mutable source and stores it on the root. + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher, + ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig; +var didWarnAboutMismatchedHooksForComponent; +var didWarnAboutUseOpaqueIdentifier; + +{ + didWarnAboutUseOpaqueIdentifier = {}; + didWarnAboutMismatchedHooksForComponent = new Set(); +} + +// These are set right before calling the component. +var renderLanes = NoLanes; // The work-in-progress fiber. I've named it differently to distinguish it from +// the work-in-progress hook. + +var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The +// current hook list is the list that belongs to the current fiber. The +// work-in-progress hook list is a new list that will be added to the +// work-in-progress fiber. + +var currentHook = null; +var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This +// does not get reset if we do another render pass; only when we're completely +// finished evaluating this component. This is an optimization so we know +// whether we need to clear render phase updates after a throw. + +var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only during the current render pass. This +// gets reset after each attempt. +// TODO: Maybe there's some way to consolidate this with +// `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`. + +var didScheduleRenderPhaseUpdateDuringThisPass = false; +var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook + +var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders. +// The list stores the order of hooks used during the initial render (mount). +// Subsequent renders (updates) reference this list. + +var hookTypesDev = null; +var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore +// the dependencies for Hooks that need them (e.g. useEffect or useMemo). +// When true, such Hooks will always be "remounted". Only used during hot reload. + +var ignorePreviousDependencies = false; + +function mountHookTypesDev() { + { + var hookName = currentHookNameInDev; + + if (hookTypesDev === null) { + hookTypesDev = [hookName]; + } else { + hookTypesDev.push(hookName); + } + } +} + +function updateHookTypesDev() { + { + var hookName = currentHookNameInDev; + + if (hookTypesDev !== null) { + hookTypesUpdateIndexDev++; + + if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) { + warnOnHookMismatchInDev(hookName); + } + } + } +} + +function checkDepsAreArrayDev(deps) { + { + if (deps !== undefined && deps !== null && !Array.isArray(deps)) { + // Verify deps, but only on mount to avoid extra checks. + // It's unlikely their type would change as usually you define them inline. + error('%s received a final argument that is not an array (instead, received `%s`). When ' + 'specified, the final argument must be an array.', currentHookNameInDev, typeof deps); + } + } +} + +function warnOnHookMismatchInDev(currentHookName) { + { + var componentName = getComponentName(currentlyRenderingFiber$1.type); + + if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) { + didWarnAboutMismatchedHooksForComponent.add(componentName); + + if (hookTypesDev !== null) { + var table = ''; + var secondColumnStart = 30; + + for (var i = 0; i <= hookTypesUpdateIndexDev; i++) { + var oldHookName = hookTypesDev[i]; + var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName; + var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up + // lol @ IE not supporting String#repeat + + while (row.length < secondColumnStart) { + row += ' '; + } + + row += newHookName + '\n'; + table += row; + } + + error('React has detected a change in the order of Hooks called by %s. ' + 'This will lead to bugs and errors if not fixed. ' + 'For more information, read the Rules of Hooks: https://reactjs.org/link/rules-of-hooks\n\n' + ' Previous render Next render\n' + ' ------------------------------------------------------\n' + '%s' + ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table); + } + } + } +} + +function throwInvalidHookError() { + { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); + } + } +} + +function areHookInputsEqual(nextDeps, prevDeps) { + { + if (ignorePreviousDependencies) { + // Only true when this component is being hot reloaded. + return false; + } + } + + if (prevDeps === null) { + { + error('%s received a final argument during this render, but not during ' + 'the previous render. Even though the final argument is optional, ' + 'its type cannot change between renders.', currentHookNameInDev); + } + + return false; + } + + { + // Don't bother comparing lengths in prod because these arrays should be + // passed inline. + if (nextDeps.length !== prevDeps.length) { + error('The final argument passed to %s changed size between renders. The ' + 'order and size of this array must remain constant.\n\n' + 'Previous: %s\n' + 'Incoming: %s', currentHookNameInDev, "[" + prevDeps.join(', ') + "]", "[" + nextDeps.join(', ') + "]"); + } + } + + for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { + if (objectIs(nextDeps[i], prevDeps[i])) { + continue; + } + + return false; + } + + return true; +} + +function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) { + renderLanes = nextRenderLanes; + currentlyRenderingFiber$1 = workInProgress; + + { + hookTypesDev = current !== null ? current._debugHookTypes : null; + hookTypesUpdateIndexDev = -1; // Used for hot reloading: + + ignorePreviousDependencies = current !== null && current.type !== workInProgress.type; + } + + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; + workInProgress.lanes = NoLanes; // The following should have already been reset + // currentHook = null; + // workInProgressHook = null; + // didScheduleRenderPhaseUpdate = false; + // TODO Warn if no hooks are used at all during mount, then some are used during update. + // Currently we will identify the update render as a mount because memoizedState === null. + // This is tricky because it's valid for certain types of components (e.g. React.lazy) + // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used. + // Non-stateful hooks (e.g. context) don't get added to memoizedState, + // so memoizedState would be null during updates and mounts. + + { + if (current !== null && current.memoizedState !== null) { + ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV; + } else if (hookTypesDev !== null) { + // This dispatcher handles an edge case where a component is updating, + // but no stateful hooks have been used. + // We want to match the production code behavior (which will use HooksDispatcherOnMount), + // but with the extra DEV validation to ensure hooks ordering hasn't changed. + // This dispatcher does that. + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV; + } else { + ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV; + } + } + + var children = Component(props, secondArg); // Check if there was a render phase update + + if (didScheduleRenderPhaseUpdateDuringThisPass) { + // Keep rendering in a loop for as long as render phase updates continue to + // be scheduled. Use a counter to prevent infinite loops. + var numberOfReRenders = 0; + + do { + didScheduleRenderPhaseUpdateDuringThisPass = false; + + if (!(numberOfReRenders < RE_RENDER_LIMIT)) { + { + throw Error( "Too many re-renders. React limits the number of renders to prevent an infinite loop." ); + } + } + + numberOfReRenders += 1; + + { + // Even when hot reloading, allow dependencies to stabilize + // after first render to prevent infinite render phase updates. + ignorePreviousDependencies = false; + } // Start over from the beginning of the list + + + currentHook = null; + workInProgressHook = null; + workInProgress.updateQueue = null; + + { + // Also validate hook order for cascading updates. + hookTypesUpdateIndexDev = -1; + } + + ReactCurrentDispatcher$1.current = HooksDispatcherOnRerenderInDEV ; + children = Component(props, secondArg); + } while (didScheduleRenderPhaseUpdateDuringThisPass); + } // We can assume the previous dispatcher is always this one, since we set it + // at the beginning of the render phase and there's no re-entrancy. + + + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; + + { + workInProgress._debugHookTypes = hookTypesDev; + } // This check uses currentHook so that it works the same in DEV and prod bundles. + // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles. + + + var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null; + renderLanes = NoLanes; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; + + { + currentHookNameInDev = null; + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + } + + didScheduleRenderPhaseUpdate = false; + + if (!!didRenderTooFewHooks) { + { + throw Error( "Rendered fewer hooks than expected. This may be caused by an accidental early return statement." ); + } + } + + return children; +} +function bailoutHooks(current, workInProgress, lanes) { + workInProgress.updateQueue = current.updateQueue; + workInProgress.flags &= ~(Passive | Update); + current.lanes = removeLanes(current.lanes, lanes); +} +function resetHooksAfterThrow() { + // We can assume the previous dispatcher is always this one, since we set it + // at the beginning of the render phase and there's no re-entrancy. + ReactCurrentDispatcher$1.current = ContextOnlyDispatcher; + + if (didScheduleRenderPhaseUpdate) { + // There were render phase updates. These are only valid for this render + // phase, which we are now aborting. Remove the updates from the queues so + // they do not persist to the next render. Do not remove updates from hooks + // that weren't processed. + // + // Only reset the updates from the queue if it has a clone. If it does + // not have a clone, that means it wasn't processed, and the updates were + // scheduled before we entered the render phase. + var hook = currentlyRenderingFiber$1.memoizedState; + + while (hook !== null) { + var queue = hook.queue; + + if (queue !== null) { + queue.pending = null; + } + + hook = hook.next; + } + + didScheduleRenderPhaseUpdate = false; + } + + renderLanes = NoLanes; + currentlyRenderingFiber$1 = null; + currentHook = null; + workInProgressHook = null; + + { + hookTypesDev = null; + hookTypesUpdateIndexDev = -1; + currentHookNameInDev = null; + isUpdatingOpaqueValueInRenderPhase = false; + } + + didScheduleRenderPhaseUpdateDuringThisPass = false; +} + +function mountWorkInProgressHook() { + var hook = { + memoizedState: null, + baseState: null, + baseQueue: null, + queue: null, + next: null + }; + + if (workInProgressHook === null) { + // This is the first hook in the list + currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook; + } else { + // Append to the end of the list + workInProgressHook = workInProgressHook.next = hook; + } + + return workInProgressHook; +} + +function updateWorkInProgressHook() { + // This function is used both for updates and for re-renders triggered by a + // render phase update. It assumes there is either a current hook we can + // clone, or a work-in-progress hook from a previous render pass that we can + // use as a base. When we reach the end of the base list, we must switch to + // the dispatcher used for mounts. + var nextCurrentHook; + + if (currentHook === null) { + var current = currentlyRenderingFiber$1.alternate; + + if (current !== null) { + nextCurrentHook = current.memoizedState; + } else { + nextCurrentHook = null; + } + } else { + nextCurrentHook = currentHook.next; + } + + var nextWorkInProgressHook; + + if (workInProgressHook === null) { + nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState; + } else { + nextWorkInProgressHook = workInProgressHook.next; + } + + if (nextWorkInProgressHook !== null) { + // There's already a work-in-progress. Reuse it. + workInProgressHook = nextWorkInProgressHook; + nextWorkInProgressHook = workInProgressHook.next; + currentHook = nextCurrentHook; + } else { + // Clone from the current hook. + if (!(nextCurrentHook !== null)) { + { + throw Error( "Rendered more hooks than during the previous render." ); + } + } + + currentHook = nextCurrentHook; + var newHook = { + memoizedState: currentHook.memoizedState, + baseState: currentHook.baseState, + baseQueue: currentHook.baseQueue, + queue: currentHook.queue, + next: null + }; + + if (workInProgressHook === null) { + // This is the first hook in the list. + currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook; + } else { + // Append to the end of the list. + workInProgressHook = workInProgressHook.next = newHook; + } + } + + return workInProgressHook; +} + +function createFunctionComponentUpdateQueue() { + return { + lastEffect: null + }; +} + +function basicStateReducer(state, action) { + // $FlowFixMe: Flow doesn't like mixed types + return typeof action === 'function' ? action(state) : action; +} + +function mountReducer(reducer, initialArg, init) { + var hook = mountWorkInProgressHook(); + var initialState; + + if (init !== undefined) { + initialState = init(initialArg); + } else { + initialState = initialArg; + } + + hook.memoizedState = hook.baseState = initialState; + var queue = hook.queue = { + pending: null, + dispatch: null, + lastRenderedReducer: reducer, + lastRenderedState: initialState + }; + var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; +} + +function updateReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + + if (!(queue !== null)) { + { + throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." ); + } + } + + queue.lastRenderedReducer = reducer; + var current = currentHook; // The last rebase update that is NOT part of the base state. + + var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet. + + var pendingQueue = queue.pending; + + if (pendingQueue !== null) { + // We have new updates that haven't been processed yet. + // We'll add them to the base queue. + if (baseQueue !== null) { + // Merge the pending queue and the base queue. + var baseFirst = baseQueue.next; + var pendingFirst = pendingQueue.next; + baseQueue.next = pendingFirst; + pendingQueue.next = baseFirst; + } + + { + if (current.baseQueue !== baseQueue) { + // Internal invariant that should never happen, but feasibly could in + // the future if we implement resuming, or some form of that. + error('Internal error: Expected work-in-progress queue to be a clone. ' + 'This is a bug in React.'); + } + } + + current.baseQueue = baseQueue = pendingQueue; + queue.pending = null; + } + + if (baseQueue !== null) { + // We have a queue to process. + var first = baseQueue.next; + var newState = current.baseState; + var newBaseState = null; + var newBaseQueueFirst = null; + var newBaseQueueLast = null; + var update = first; + + do { + var updateLane = update.lane; + + if (!isSubsetOfLanes(renderLanes, updateLane)) { + // Priority is insufficient. Skip this update. If this is the first + // skipped update, the previous update/state is the new base + // update/state. + var clone = { + lane: updateLane, + action: update.action, + eagerReducer: update.eagerReducer, + eagerState: update.eagerState, + next: null + }; + + if (newBaseQueueLast === null) { + newBaseQueueFirst = newBaseQueueLast = clone; + newBaseState = newState; + } else { + newBaseQueueLast = newBaseQueueLast.next = clone; + } // Update the remaining priority in the queue. + // TODO: Don't need to accumulate this. Instead, we can remove + // renderLanes from the original lanes. + + + currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane); + markSkippedUpdateLanes(updateLane); + } else { + // This update does have sufficient priority. + if (newBaseQueueLast !== null) { + var _clone = { + // This update is going to be committed so we never want uncommit + // it. Using NoLane works because 0 is a subset of all bitmasks, so + // this will never be skipped by the check above. + lane: NoLane, + action: update.action, + eagerReducer: update.eagerReducer, + eagerState: update.eagerState, + next: null + }; + newBaseQueueLast = newBaseQueueLast.next = _clone; + } // Process this update. + + + if (update.eagerReducer === reducer) { + // If this update was processed eagerly, and its reducer matches the + // current reducer, we can use the eagerly computed state. + newState = update.eagerState; + } else { + var action = update.action; + newState = reducer(newState, action); + } + } + + update = update.next; + } while (update !== null && update !== first); + + if (newBaseQueueLast === null) { + newBaseState = newState; + } else { + newBaseQueueLast.next = newBaseQueueFirst; + } // Mark that the fiber performed work, but only if the new state is + // different from the current state. + + + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + + hook.memoizedState = newState; + hook.baseState = newBaseState; + hook.baseQueue = newBaseQueueLast; + queue.lastRenderedState = newState; + } + + var dispatch = queue.dispatch; + return [hook.memoizedState, dispatch]; +} + +function rerenderReducer(reducer, initialArg, init) { + var hook = updateWorkInProgressHook(); + var queue = hook.queue; + + if (!(queue !== null)) { + { + throw Error( "Should have a queue. This is likely a bug in React. Please file an issue." ); + } + } + + queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous + // work-in-progress hook. + + var dispatch = queue.dispatch; + var lastRenderPhaseUpdate = queue.pending; + var newState = hook.memoizedState; + + if (lastRenderPhaseUpdate !== null) { + // The queue doesn't persist past this render pass. + queue.pending = null; + var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next; + var update = firstRenderPhaseUpdate; + + do { + // Process this render phase update. We don't have to check the + // priority because it will always be the same as the current + // render's. + var action = update.action; + newState = reducer(newState, action); + update = update.next; + } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is + // different from the current state. + + + if (!objectIs(newState, hook.memoizedState)) { + markWorkInProgressReceivedUpdate(); + } + + hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to + // the base state unless the queue is empty. + // TODO: Not sure if this is the desired semantics, but it's what we + // do for gDSFP. I can't remember why. + + if (hook.baseQueue === null) { + hook.baseState = newState; + } + + queue.lastRenderedState = newState; + } + + return [newState, dispatch]; +} + +function readFromUnsubcribedMutableSource(root, source, getSnapshot) { + { + warnAboutMultipleRenderersDEV(source); + } + + var getVersion = source._getVersion; + var version = getVersion(source._source); // Is it safe for this component to read from this source during the current render? + + var isSafeToReadFromSource = false; // Check the version first. + // If this render has already been started with a specific version, + // we can use it alone to determine if we can safely read from the source. + + var currentRenderVersion = getWorkInProgressVersion(source); + + if (currentRenderVersion !== null) { + // It's safe to read if the store hasn't been mutated since the last time + // we read something. + isSafeToReadFromSource = currentRenderVersion === version; + } else { + // If there's no version, then this is the first time we've read from the + // source during the current render pass, so we need to do a bit more work. + // What we need to determine is if there are any hooks that already + // subscribed to the source, and if so, whether there are any pending + // mutations that haven't been synchronized yet. + // + // If there are no pending mutations, then `root.mutableReadLanes` will be + // empty, and we know we can safely read. + // + // If there *are* pending mutations, we may still be able to safely read + // if the currently rendering lanes are inclusive of the pending mutation + // lanes, since that guarantees that the value we're about to read from + // the source is consistent with the values that we read during the most + // recent mutation. + isSafeToReadFromSource = isSubsetOfLanes(renderLanes, root.mutableReadLanes); + + if (isSafeToReadFromSource) { + // If it's safe to read from this source during the current render, + // store the version in case other components read from it. + // A changed version number will let those components know to throw and restart the render. + setWorkInProgressVersion(source, version); + } + } + + if (isSafeToReadFromSource) { + var snapshot = getSnapshot(source._source); + + { + if (typeof snapshot === 'function') { + error('Mutable source should not return a function as the snapshot value. ' + 'Functions may close over mutable values and cause tearing.'); + } + } + + return snapshot; + } else { + // This handles the special case of a mutable source being shared between renderers. + // In that case, if the source is mutated between the first and second renderer, + // The second renderer don't know that it needs to reset the WIP version during unwind, + // (because the hook only marks sources as dirty if it's written to their WIP version). + // That would cause this tear check to throw again and eventually be visible to the user. + // We can avoid this infinite loop by explicitly marking the source as dirty. + // + // This can lead to tearing in the first renderer when it resumes, + // but there's nothing we can do about that (short of throwing here and refusing to continue the render). + markSourceAsDirty(source); + + { + { + throw Error( "Cannot read from mutable source during the current render without tearing. This is a bug in React. Please file an issue." ); + } + } + } +} + +function useMutableSource(hook, source, getSnapshot, subscribe) { + var root = getWorkInProgressRoot(); + + if (!(root !== null)) { + { + throw Error( "Expected a work-in-progress root. This is a bug in React. Please file an issue." ); + } + } + + var getVersion = source._getVersion; + var version = getVersion(source._source); + var dispatcher = ReactCurrentDispatcher$1.current; // eslint-disable-next-line prefer-const + + var _dispatcher$useState = dispatcher.useState(function () { + return readFromUnsubcribedMutableSource(root, source, getSnapshot); + }), + currentSnapshot = _dispatcher$useState[0], + setSnapshot = _dispatcher$useState[1]; + + var snapshot = currentSnapshot; // Grab a handle to the state hook as well. + // We use it to clear the pending update queue if we have a new source. + + var stateHook = workInProgressHook; + var memoizedState = hook.memoizedState; + var refs = memoizedState.refs; + var prevGetSnapshot = refs.getSnapshot; + var prevSource = memoizedState.source; + var prevSubscribe = memoizedState.subscribe; + var fiber = currentlyRenderingFiber$1; + hook.memoizedState = { + refs: refs, + source: source, + subscribe: subscribe + }; // Sync the values needed by our subscription handler after each commit. + + dispatcher.useEffect(function () { + refs.getSnapshot = getSnapshot; // Normally the dispatch function for a state hook never changes, + // but this hook recreates the queue in certain cases to avoid updates from stale sources. + // handleChange() below needs to reference the dispatch function without re-subscribing, + // so we use a ref to ensure that it always has the latest version. + + refs.setSnapshot = setSnapshot; // Check for a possible change between when we last rendered now. + + var maybeNewVersion = getVersion(source._source); + + if (!objectIs(version, maybeNewVersion)) { + var maybeNewSnapshot = getSnapshot(source._source); + + { + if (typeof maybeNewSnapshot === 'function') { + error('Mutable source should not return a function as the snapshot value. ' + 'Functions may close over mutable values and cause tearing.'); + } + } + + if (!objectIs(snapshot, maybeNewSnapshot)) { + setSnapshot(maybeNewSnapshot); + var lane = requestUpdateLane(fiber); + markRootMutableRead(root, lane); + } // If the source mutated between render and now, + // there may be state updates already scheduled from the old source. + // Entangle the updates so that they render in the same batch. + + + markRootEntangled(root, root.mutableReadLanes); + } + }, [getSnapshot, source, subscribe]); // If we got a new source or subscribe function, re-subscribe in a passive effect. + + dispatcher.useEffect(function () { + var handleChange = function () { + var latestGetSnapshot = refs.getSnapshot; + var latestSetSnapshot = refs.setSnapshot; + + try { + latestSetSnapshot(latestGetSnapshot(source._source)); // Record a pending mutable source update with the same expiration time. + + var lane = requestUpdateLane(fiber); + markRootMutableRead(root, lane); + } catch (error) { + // A selector might throw after a source mutation. + // e.g. it might try to read from a part of the store that no longer exists. + // In this case we should still schedule an update with React. + // Worst case the selector will throw again and then an error boundary will handle it. + latestSetSnapshot(function () { + throw error; + }); + } + }; + + var unsubscribe = subscribe(source._source, handleChange); + + { + if (typeof unsubscribe !== 'function') { + error('Mutable source subscribe function must return an unsubscribe function.'); + } + } + + return unsubscribe; + }, [source, subscribe]); // If any of the inputs to useMutableSource change, reading is potentially unsafe. + // + // If either the source or the subscription have changed we can't can't trust the update queue. + // Maybe the source changed in a way that the old subscription ignored but the new one depends on. + // + // If the getSnapshot function changed, we also shouldn't rely on the update queue. + // It's possible that the underlying source was mutated between the when the last "change" event fired, + // and when the current render (with the new getSnapshot function) is processed. + // + // In both cases, we need to throw away pending updates (since they are no longer relevant) + // and treat reading from the source as we do in the mount case. + + if (!objectIs(prevGetSnapshot, getSnapshot) || !objectIs(prevSource, source) || !objectIs(prevSubscribe, subscribe)) { + // Create a new queue and setState method, + // So if there are interleaved updates, they get pushed to the older queue. + // When this becomes current, the previous queue and dispatch method will be discarded, + // including any interleaving updates that occur. + var newQueue = { + pending: null, + dispatch: null, + lastRenderedReducer: basicStateReducer, + lastRenderedState: snapshot + }; + newQueue.dispatch = setSnapshot = dispatchAction.bind(null, currentlyRenderingFiber$1, newQueue); + stateHook.queue = newQueue; + stateHook.baseQueue = null; + snapshot = readFromUnsubcribedMutableSource(root, source, getSnapshot); + stateHook.memoizedState = stateHook.baseState = snapshot; + } + + return snapshot; +} + +function mountMutableSource(source, getSnapshot, subscribe) { + var hook = mountWorkInProgressHook(); + hook.memoizedState = { + refs: { + getSnapshot: getSnapshot, + setSnapshot: null + }, + source: source, + subscribe: subscribe + }; + return useMutableSource(hook, source, getSnapshot, subscribe); +} + +function updateMutableSource(source, getSnapshot, subscribe) { + var hook = updateWorkInProgressHook(); + return useMutableSource(hook, source, getSnapshot, subscribe); +} + +function mountState(initialState) { + var hook = mountWorkInProgressHook(); + + if (typeof initialState === 'function') { + // $FlowFixMe: Flow doesn't like mixed types + initialState = initialState(); + } + + hook.memoizedState = hook.baseState = initialState; + var queue = hook.queue = { + pending: null, + dispatch: null, + lastRenderedReducer: basicStateReducer, + lastRenderedState: initialState + }; + var dispatch = queue.dispatch = dispatchAction.bind(null, currentlyRenderingFiber$1, queue); + return [hook.memoizedState, dispatch]; +} + +function updateState(initialState) { + return updateReducer(basicStateReducer); +} + +function rerenderState(initialState) { + return rerenderReducer(basicStateReducer); +} + +function pushEffect(tag, create, destroy, deps) { + var effect = { + tag: tag, + create: create, + destroy: destroy, + deps: deps, + // Circular + next: null + }; + var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue; + + if (componentUpdateQueue === null) { + componentUpdateQueue = createFunctionComponentUpdateQueue(); + currentlyRenderingFiber$1.updateQueue = componentUpdateQueue; + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var lastEffect = componentUpdateQueue.lastEffect; + + if (lastEffect === null) { + componentUpdateQueue.lastEffect = effect.next = effect; + } else { + var firstEffect = lastEffect.next; + lastEffect.next = effect; + effect.next = firstEffect; + componentUpdateQueue.lastEffect = effect; + } + } + + return effect; +} + +function mountRef(initialValue) { + var hook = mountWorkInProgressHook(); + var ref = { + current: initialValue + }; + + { + Object.seal(ref); + } + + hook.memoizedState = ref; + return ref; +} + +function updateRef(initialValue) { + var hook = updateWorkInProgressHook(); + return hook.memoizedState; +} + +function mountEffectImpl(fiberFlags, hookFlags, create, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + currentlyRenderingFiber$1.flags |= fiberFlags; + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, undefined, nextDeps); +} + +function updateEffectImpl(fiberFlags, hookFlags, create, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var destroy = undefined; + + if (currentHook !== null) { + var prevEffect = currentHook.memoizedState; + destroy = prevEffect.destroy; + + if (nextDeps !== null) { + var prevDeps = prevEffect.deps; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + pushEffect(hookFlags, create, destroy, nextDeps); + return; + } + } + } + + currentlyRenderingFiber$1.flags |= fiberFlags; + hook.memoizedState = pushEffect(HasEffect | hookFlags, create, destroy, nextDeps); +} + +function mountEffect(create, deps) { + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + } + } + + return mountEffectImpl(Update | Passive, Passive$1, create, deps); +} + +function updateEffect(create, deps) { + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotCurrentlyActingEffectsInDEV(currentlyRenderingFiber$1); + } + } + + return updateEffectImpl(Update | Passive, Passive$1, create, deps); +} + +function mountLayoutEffect(create, deps) { + return mountEffectImpl(Update, Layout, create, deps); +} + +function updateLayoutEffect(create, deps) { + return updateEffectImpl(Update, Layout, create, deps); +} + +function imperativeHandleEffect(create, ref) { + if (typeof ref === 'function') { + var refCallback = ref; + + var _inst = create(); + + refCallback(_inst); + return function () { + refCallback(null); + }; + } else if (ref !== null && ref !== undefined) { + var refObject = ref; + + { + if (!refObject.hasOwnProperty('current')) { + error('Expected useImperativeHandle() first argument to either be a ' + 'ref callback or React.createRef() object. Instead received: %s.', 'an object with keys {' + Object.keys(refObject).join(', ') + '}'); + } + } + + var _inst2 = create(); + + refObject.current = _inst2; + return function () { + refObject.current = null; + }; + } +} + +function mountImperativeHandle(ref, create, deps) { + { + if (typeof create !== 'function') { + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null'); + } + } // TODO: If deps are provided, should we skip comparing the ref itself? + + + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; + return mountEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); +} + +function updateImperativeHandle(ref, create, deps) { + { + if (typeof create !== 'function') { + error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null'); + } + } // TODO: If deps are provided, should we skip comparing the ref itself? + + + var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null; + return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps); +} + +function mountDebugValue(value, formatterFn) {// This hook is normally a no-op. + // The react-debug-hooks package injects its own implementation + // so that e.g. DevTools can display custom hook values. +} + +var updateDebugValue = mountDebugValue; + +function mountCallback(callback, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + hook.memoizedState = [callback, nextDeps]; + return callback; +} + +function updateCallback(callback, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var prevState = hook.memoizedState; + + if (prevState !== null) { + if (nextDeps !== null) { + var prevDeps = prevState[1]; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + + hook.memoizedState = [callback, nextDeps]; + return callback; +} + +function mountMemo(nextCreate, deps) { + var hook = mountWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; +} + +function updateMemo(nextCreate, deps) { + var hook = updateWorkInProgressHook(); + var nextDeps = deps === undefined ? null : deps; + var prevState = hook.memoizedState; + + if (prevState !== null) { + // Assume these are defined. If they're not, areHookInputsEqual will warn. + if (nextDeps !== null) { + var prevDeps = prevState[1]; + + if (areHookInputsEqual(nextDeps, prevDeps)) { + return prevState[0]; + } + } + } + + var nextValue = nextCreate(); + hook.memoizedState = [nextValue, nextDeps]; + return nextValue; +} + +function mountDeferredValue(value) { + var _mountState = mountState(value), + prevValue = _mountState[0], + setValue = _mountState[1]; + + mountEffect(function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }, [value]); + return prevValue; +} + +function updateDeferredValue(value) { + var _updateState = updateState(), + prevValue = _updateState[0], + setValue = _updateState[1]; + + updateEffect(function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }, [value]); + return prevValue; +} + +function rerenderDeferredValue(value) { + var _rerenderState = rerenderState(), + prevValue = _rerenderState[0], + setValue = _rerenderState[1]; + + updateEffect(function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setValue(value); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }, [value]); + return prevValue; +} + +function startTransition(setPending, callback) { + var priorityLevel = getCurrentPriorityLevel(); + + { + runWithPriority$1(priorityLevel < UserBlockingPriority$2 ? UserBlockingPriority$2 : priorityLevel, function () { + setPending(true); + }); + runWithPriority$1(priorityLevel > NormalPriority$1 ? NormalPriority$1 : priorityLevel, function () { + var prevTransition = ReactCurrentBatchConfig$1.transition; + ReactCurrentBatchConfig$1.transition = 1; + + try { + setPending(false); + callback(); + } finally { + ReactCurrentBatchConfig$1.transition = prevTransition; + } + }); + } +} + +function mountTransition() { + var _mountState2 = mountState(false), + isPending = _mountState2[0], + setPending = _mountState2[1]; // The `start` method can be stored on a ref, since `setPending` + // never changes. + + + var start = startTransition.bind(null, setPending); + mountRef(start); + return [start, isPending]; +} + +function updateTransition() { + var _updateState2 = updateState(), + isPending = _updateState2[0]; + + var startRef = updateRef(); + var start = startRef.current; + return [start, isPending]; +} + +function rerenderTransition() { + var _rerenderState2 = rerenderState(), + isPending = _rerenderState2[0]; + + var startRef = updateRef(); + var start = startRef.current; + return [start, isPending]; +} + +var isUpdatingOpaqueValueInRenderPhase = false; +function getIsUpdatingOpaqueValueInRenderPhaseInDEV() { + { + return isUpdatingOpaqueValueInRenderPhase; + } +} + +function warnOnOpaqueIdentifierAccessInDEV(fiber) { + { + // TODO: Should warn in effects and callbacks, too + var name = getComponentName(fiber.type) || 'Unknown'; + + if (getIsRendering() && !didWarnAboutUseOpaqueIdentifier[name]) { + error('The object passed back from useOpaqueIdentifier is meant to be ' + 'passed through to attributes only. Do not read the ' + 'value directly.'); + + didWarnAboutUseOpaqueIdentifier[name] = true; + } + } +} + +function mountOpaqueIdentifier() { + var makeId = makeClientIdInDEV.bind(null, warnOnOpaqueIdentifierAccessInDEV.bind(null, currentlyRenderingFiber$1)) ; + + if (getIsHydrating()) { + var didUpgrade = false; + var fiber = currentlyRenderingFiber$1; + + var readValue = function () { + if (!didUpgrade) { + // Only upgrade once. This works even inside the render phase because + // the update is added to a shared queue, which outlasts the + // in-progress render. + didUpgrade = true; + + { + isUpdatingOpaqueValueInRenderPhase = true; + setId(makeId()); + isUpdatingOpaqueValueInRenderPhase = false; + warnOnOpaqueIdentifierAccessInDEV(fiber); + } + } + + { + { + throw Error( "The object passed back from useOpaqueIdentifier is meant to be passed through to attributes only. Do not read the value directly." ); + } + } + }; + + var id = makeOpaqueHydratingObject(readValue); + var setId = mountState(id)[1]; + + if ((currentlyRenderingFiber$1.mode & BlockingMode) === NoMode) { + currentlyRenderingFiber$1.flags |= Update | Passive; + pushEffect(HasEffect | Passive$1, function () { + setId(makeId()); + }, undefined, null); + } + + return id; + } else { + var _id = makeId(); + + mountState(_id); + return _id; + } +} + +function updateOpaqueIdentifier() { + var id = updateState()[0]; + return id; +} + +function rerenderOpaqueIdentifier() { + var id = rerenderState()[0]; + return id; +} + +function dispatchAction(fiber, queue, action) { + { + if (typeof arguments[3] === 'function') { + error("State updates from the useState() and useReducer() Hooks don't support the " + 'second callback argument. To execute a side effect after ' + 'rendering, declare it in the component body with useEffect().'); + } + } + + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + var update = { + lane: lane, + action: action, + eagerReducer: null, + eagerState: null, + next: null + }; // Append the update to the end of the list. + + var pending = queue.pending; + + if (pending === null) { + // This is the first update. Create a circular list. + update.next = update; + } else { + update.next = pending.next; + pending.next = update; + } + + queue.pending = update; + var alternate = fiber.alternate; + + if (fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1) { + // This is a render phase update. Stash it in a lazily-created map of + // queue -> linked list of updates. After this render pass, we'll restart + // and apply the stashed updates on top of the work-in-progress hook. + didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true; + } else { + if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) { + // The queue is currently empty, which means we can eagerly compute the + // next state before entering the render phase. If the new state is the + // same as the current state, we may be able to bail out entirely. + var lastRenderedReducer = queue.lastRenderedReducer; + + if (lastRenderedReducer !== null) { + var prevDispatcher; + + { + prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + } + + try { + var currentState = queue.lastRenderedState; + var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute + // it, on the update object. If the reducer hasn't changed by the + // time we enter the render phase, then the eager state can be used + // without calling the reducer again. + + update.eagerReducer = lastRenderedReducer; + update.eagerState = eagerState; + + if (objectIs(eagerState, currentState)) { + // Fast path. We can bail out without scheduling React to re-render. + // It's still possible that we'll need to rebase this update later, + // if the component re-renders for a different reason and by that + // time the reducer has changed. + return; + } + } catch (error) {// Suppress the error. It will throw again in the render phase. + } finally { + { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + } + } + } + + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfNotScopedWithMatchingAct(fiber); + warnIfNotCurrentlyActingUpdatesInDev(fiber); + } + } + + scheduleUpdateOnFiber(fiber, lane, eventTime); + } +} + +var ContextOnlyDispatcher = { + readContext: readContext, + useCallback: throwInvalidHookError, + useContext: throwInvalidHookError, + useEffect: throwInvalidHookError, + useImperativeHandle: throwInvalidHookError, + useLayoutEffect: throwInvalidHookError, + useMemo: throwInvalidHookError, + useReducer: throwInvalidHookError, + useRef: throwInvalidHookError, + useState: throwInvalidHookError, + useDebugValue: throwInvalidHookError, + useDeferredValue: throwInvalidHookError, + useTransition: throwInvalidHookError, + useMutableSource: throwInvalidHookError, + useOpaqueIdentifier: throwInvalidHookError, + unstable_isNewReconciler: enableNewReconciler +}; +var HooksDispatcherOnMountInDEV = null; +var HooksDispatcherOnMountWithHookTypesInDEV = null; +var HooksDispatcherOnUpdateInDEV = null; +var HooksDispatcherOnRerenderInDEV = null; +var InvalidNestedHooksDispatcherOnMountInDEV = null; +var InvalidNestedHooksDispatcherOnUpdateInDEV = null; +var InvalidNestedHooksDispatcherOnRerenderInDEV = null; + +{ + var warnInvalidContextAccess = function () { + error('Context can only be read while React is rendering. ' + 'In classes, you can read it in the render method or getDerivedStateFromProps. ' + 'In function components, you can read it directly in the function body, but not ' + 'inside Hooks like useReducer() or useMemo().'); + }; + + var warnInvalidHookAccess = function () { + error('Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. ' + 'You can only call Hooks at the top level of your React function. ' + 'For more information, see ' + 'https://reactjs.org/link/rules-of-hooks'); + }; + + HooksDispatcherOnMountInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + mountHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + mountHookTypesDev(); + checkDepsAreArrayDev(deps); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + mountHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + mountHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + mountHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + mountHookTypesDev(); + return mountMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + mountHookTypesDev(); + return mountOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnMountWithHookTypesInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + updateHookTypesDev(); + return mountMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + updateHookTypesDev(); + return mountOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnUpdateInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return updateDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return updateTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + updateHookTypesDev(); + return updateOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + HooksDispatcherOnRerenderInDEV = { + readContext: function (context, observedBits) { + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV; + + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + updateHookTypesDev(); + return rerenderDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + updateHookTypesDev(); + return rerenderTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + updateHookTypesDev(); + return rerenderOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnMountInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountRef(initialValue); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + mountHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV; + + try { + return mountState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + warnInvalidHookAccess(); + mountHookTypesDev(); + return mountOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnUpdateInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; + InvalidNestedHooksDispatcherOnRerenderInDEV = { + readContext: function (context, observedBits) { + warnInvalidContextAccess(); + return readContext(context, observedBits); + }, + useCallback: function (callback, deps) { + currentHookNameInDev = 'useCallback'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateCallback(callback, deps); + }, + useContext: function (context, observedBits) { + currentHookNameInDev = 'useContext'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return readContext(context, observedBits); + }, + useEffect: function (create, deps) { + currentHookNameInDev = 'useEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateEffect(create, deps); + }, + useImperativeHandle: function (ref, create, deps) { + currentHookNameInDev = 'useImperativeHandle'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateImperativeHandle(ref, create, deps); + }, + useLayoutEffect: function (create, deps) { + currentHookNameInDev = 'useLayoutEffect'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateLayoutEffect(create, deps); + }, + useMemo: function (create, deps) { + currentHookNameInDev = 'useMemo'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return updateMemo(create, deps); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useReducer: function (reducer, initialArg, init) { + currentHookNameInDev = 'useReducer'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return rerenderReducer(reducer, initialArg, init); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useRef: function (initialValue) { + currentHookNameInDev = 'useRef'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateRef(); + }, + useState: function (initialState) { + currentHookNameInDev = 'useState'; + warnInvalidHookAccess(); + updateHookTypesDev(); + var prevDispatcher = ReactCurrentDispatcher$1.current; + ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV; + + try { + return rerenderState(initialState); + } finally { + ReactCurrentDispatcher$1.current = prevDispatcher; + } + }, + useDebugValue: function (value, formatterFn) { + currentHookNameInDev = 'useDebugValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateDebugValue(); + }, + useDeferredValue: function (value) { + currentHookNameInDev = 'useDeferredValue'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderDeferredValue(value); + }, + useTransition: function () { + currentHookNameInDev = 'useTransition'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderTransition(); + }, + useMutableSource: function (source, getSnapshot, subscribe) { + currentHookNameInDev = 'useMutableSource'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return updateMutableSource(source, getSnapshot, subscribe); + }, + useOpaqueIdentifier: function () { + currentHookNameInDev = 'useOpaqueIdentifier'; + warnInvalidHookAccess(); + updateHookTypesDev(); + return rerenderOpaqueIdentifier(); + }, + unstable_isNewReconciler: enableNewReconciler + }; +} + +var now$1 = Scheduler.unstable_now; +var commitTime = 0; +var profilerStartTime = -1; + +function getCommitTime() { + return commitTime; +} + +function recordCommitTime() { + + commitTime = now$1(); +} + +function startProfilerTimer(fiber) { + + profilerStartTime = now$1(); + + if (fiber.actualStartTime < 0) { + fiber.actualStartTime = now$1(); + } +} + +function stopProfilerTimerIfRunning(fiber) { + + profilerStartTime = -1; +} + +function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) { + + if (profilerStartTime >= 0) { + var elapsedTime = now$1() - profilerStartTime; + fiber.actualDuration += elapsedTime; + + if (overrideBaseTime) { + fiber.selfBaseDuration = elapsedTime; + } + + profilerStartTime = -1; + } +} + +function transferActualDuration(fiber) { + // Transfer time spent rendering these children so we don't lose it + // after we rerender. This is used as a helper in special cases + // where we should count the work of multiple passes. + var child = fiber.child; + + while (child) { + fiber.actualDuration += child.actualDuration; + child = child.sibling; + } +} + +var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; +var didReceiveUpdate = false; +var didWarnAboutBadClass; +var didWarnAboutModulePatternComponent; +var didWarnAboutContextTypeOnFunctionComponent; +var didWarnAboutGetDerivedStateOnFunctionComponent; +var didWarnAboutFunctionRefs; +var didWarnAboutReassigningProps; +var didWarnAboutRevealOrder; +var didWarnAboutTailOptions; + +{ + didWarnAboutBadClass = {}; + didWarnAboutModulePatternComponent = {}; + didWarnAboutContextTypeOnFunctionComponent = {}; + didWarnAboutGetDerivedStateOnFunctionComponent = {}; + didWarnAboutFunctionRefs = {}; + didWarnAboutReassigningProps = false; + didWarnAboutRevealOrder = {}; + didWarnAboutTailOptions = {}; +} + +function reconcileChildren(current, workInProgress, nextChildren, renderLanes) { + if (current === null) { + // If this is a fresh new component that hasn't been rendered yet, we + // won't update its child set by applying minimal side-effects. Instead, + // we will add them all to the child before it gets rendered. That means + // we can optimize this reconciliation pass by not tracking side-effects. + workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderLanes); + } else { + // If the current child is the same as the work in progress, it means that + // we haven't yet started any work on these children. Therefore, we use + // the clone algorithm to create a copy of all the current children. + // If we had any progressed work already, that is invalid at this point so + // let's throw it out. + workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes); + } +} + +function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes) { + // This function is fork of reconcileChildren. It's used in cases where we + // want to reconcile without matching against the existing set. This has the + // effect of all current children being unmounted; even if the type and key + // are the same, the old child is unmounted and a new child is created. + // + // To do this, we're going to go through the reconcile algorithm twice. In + // the first pass, we schedule a deletion for all the current children by + // passing null. + workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes); // In the second pass, we mount the new children. The trick here is that we + // pass null in place of where we usually pass the current child set. This has + // the effect of remounting all children regardless of whether their + // identities match. + + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes); +} + +function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) { + // TODO: current can be non-null here even if the component + // hasn't yet mounted. This happens after the first render suspends. + // We'll need to figure out if this is fine or can cause issues. + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; + + if (innerPropTypes) { + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component)); + } + } + } + + var render = Component.render; + var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent + + var nextChildren; + prepareToReadContext(workInProgress, renderLanes); + + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes); + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes); + } finally { + reenableLogs(); + } + } + + setIsRendering(false); + } + + if (current !== null && !didReceiveUpdate) { + bailoutHooks(current, workInProgress, renderLanes); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateMemoComponent(current, workInProgress, Component, nextProps, updateLanes, renderLanes) { + if (current === null) { + var type = Component.type; + + if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either. + Component.defaultProps === undefined) { + var resolvedType = type; + + { + resolvedType = resolveFunctionForHotReloading(type); + } // If this is a plain function component without default props, + // and with only the default shallow comparison, we upgrade it + // to a SimpleMemoComponent to allow fast path updates. + + + workInProgress.tag = SimpleMemoComponent; + workInProgress.type = resolvedType; + + { + validateFunctionComponentInDev(workInProgress, type); + } + + return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, updateLanes, renderLanes); + } + + { + var innerPropTypes = type.propTypes; + + if (innerPropTypes) { + // Inner memo component props aren't currently validated in createElement. + // We could move it there, but we'd still need this for lazy code path. + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(type)); + } + } + + var child = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes); + child.ref = workInProgress.ref; + child.return = workInProgress; + workInProgress.child = child; + return child; + } + + { + var _type = Component.type; + var _innerPropTypes = _type.propTypes; + + if (_innerPropTypes) { + // Inner memo component props aren't currently validated in createElement. + // We could move it there, but we'd still need this for lazy code path. + checkPropTypes(_innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(_type)); + } + } + + var currentChild = current.child; // This is always exactly one child + + if (!includesSomeLane(updateLanes, renderLanes)) { + // This will be the props with resolved defaultProps, + // unlike current.memoizedProps which will be the unresolved ones. + var prevProps = currentChild.memoizedProps; // Default to shallow comparison + + var compare = Component.compare; + compare = compare !== null ? compare : shallowEqual; + + if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) { + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + var newChild = createWorkInProgress(currentChild, nextProps); + newChild.ref = workInProgress.ref; + newChild.return = workInProgress; + workInProgress.child = newChild; + return newChild; +} + +function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, updateLanes, renderLanes) { + // TODO: current can be non-null here even if the component + // hasn't yet mounted. This happens when the inner render suspends. + // We'll need to figure out if this is fine or can cause issues. + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var outerMemoType = workInProgress.elementType; + + if (outerMemoType.$$typeof === REACT_LAZY_TYPE) { + // We warn when you define propTypes on lazy() + // so let's just skip over it to find memo() outer wrapper. + // Inner props for memo are validated later. + var lazyComponent = outerMemoType; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + outerMemoType = init(payload); + } catch (x) { + outerMemoType = null; + } // Inner propTypes will be validated in the function component path. + + + var outerPropTypes = outerMemoType && outerMemoType.propTypes; + + if (outerPropTypes) { + checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps) + 'prop', getComponentName(outerMemoType)); + } + } + } + } + + if (current !== null) { + var prevProps = current.memoizedProps; + + if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload. + workInProgress.type === current.type )) { + didReceiveUpdate = false; + + if (!includesSomeLane(renderLanes, updateLanes)) { + // The pending lanes were cleared at the beginning of beginWork. We're + // about to bail out, but there might be other lanes that weren't + // included in the current render. Usually, the priority level of the + // remaining updates is accumlated during the evaluation of the + // component (i.e. when processing the update queue). But since since + // we're bailing out early *without* evaluating the component, we need + // to account for it here, too. Reset to the value of the current fiber. + // NOTE: This only applies to SimpleMemoComponent, not MemoComponent, + // because a MemoComponent fiber does not have hooks or an update queue; + // rather, it wraps around an inner component, which may or may not + // contains hooks. + // TODO: Move the reset at in beginWork out of the common path so that + // this is no longer necessary. + workInProgress.lanes = current.lanes; + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } else if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) { + // This is a special case that only exists for legacy mode. + // See https://github.com/facebook/react/pull/19216. + didReceiveUpdate = true; + } + } + } + + return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes); +} + +function updateOffscreenComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps; + var nextChildren = nextProps.children; + var prevState = current !== null ? current.memoizedState : null; + + if (nextProps.mode === 'hidden' || nextProps.mode === 'unstable-defer-without-hiding') { + if ((workInProgress.mode & ConcurrentMode) === NoMode) { + // In legacy sync mode, don't defer the subtree. Render it now. + // TODO: Figure out what we should do in Blocking mode. + var nextState = { + baseLanes: NoLanes + }; + workInProgress.memoizedState = nextState; + pushRenderLanes(workInProgress, renderLanes); + } else if (!includesSomeLane(renderLanes, OffscreenLane)) { + var nextBaseLanes; + + if (prevState !== null) { + var prevBaseLanes = prevState.baseLanes; + nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes); + } else { + nextBaseLanes = renderLanes; + } // Schedule this fiber to re-render at offscreen priority. Then bailout. + + + { + markSpawnedWork(OffscreenLane); + } + + workInProgress.lanes = workInProgress.childLanes = laneToLanes(OffscreenLane); + var _nextState = { + baseLanes: nextBaseLanes + }; + workInProgress.memoizedState = _nextState; // We're about to bail out, but we need to push this to the stack anyway + // to avoid a push/pop misalignment. + + pushRenderLanes(workInProgress, nextBaseLanes); + return null; + } else { + // Rendering at offscreen, so we can clear the base lanes. + var _nextState2 = { + baseLanes: NoLanes + }; + workInProgress.memoizedState = _nextState2; // Push the lanes that were skipped when we bailed out. + + var subtreeRenderLanes = prevState !== null ? prevState.baseLanes : renderLanes; + pushRenderLanes(workInProgress, subtreeRenderLanes); + } + } else { + var _subtreeRenderLanes; + + if (prevState !== null) { + _subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes); // Since we're not hidden anymore, reset the state + + workInProgress.memoizedState = null; + } else { + // We weren't previously hidden, and we still aren't, so there's nothing + // special to do. Need to push to the stack regardless, though, to avoid + // a push/pop misalignment. + _subtreeRenderLanes = renderLanes; + } + + pushRenderLanes(workInProgress, _subtreeRenderLanes); + } + + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} // Note: These happen to have identical begin phases, for now. We shouldn't hold +// ourselves to this constraint, though. If the behavior diverges, we should +// fork the function. + + +var updateLegacyHiddenComponent = updateOffscreenComponent; + +function updateFragment(current, workInProgress, renderLanes) { + var nextChildren = workInProgress.pendingProps; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateMode(current, workInProgress, renderLanes) { + var nextChildren = workInProgress.pendingProps.children; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateProfiler(current, workInProgress, renderLanes) { + { + workInProgress.flags |= Update; // Reset effect durations for the next eventual effect phase. + // These are reset during render to allow the DevTools commit hook a chance to read them, + + var stateNode = workInProgress.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + + var nextProps = workInProgress.pendingProps; + var nextChildren = nextProps.children; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function markRef(current, workInProgress) { + var ref = workInProgress.ref; + + if (current === null && ref !== null || current !== null && current.ref !== ref) { + // Schedule a Ref effect + workInProgress.flags |= Ref; + } +} + +function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) { + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; + + if (innerPropTypes) { + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component)); + } + } + } + + var context; + + { + var unmaskedContext = getUnmaskedContext(workInProgress, Component, true); + context = getMaskedContext(workInProgress, unmaskedContext); + } + + var nextChildren; + prepareToReadContext(workInProgress, renderLanes); + + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes); + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes); + } finally { + reenableLogs(); + } + } + + setIsRendering(false); + } + + if (current !== null && !didReceiveUpdate) { + bailoutHooks(current, workInProgress, renderLanes); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) { + { + if (workInProgress.type !== workInProgress.elementType) { + // Lazy component props can't be validated in createElement + // because they're only guaranteed to be resolved here. + var innerPropTypes = Component.propTypes; + + if (innerPropTypes) { + checkPropTypes(innerPropTypes, nextProps, // Resolved props + 'prop', getComponentName(Component)); + } + } + } // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + + var hasContext; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } + + prepareToReadContext(workInProgress, renderLanes); + var instance = workInProgress.stateNode; + var shouldUpdate; + + if (instance === null) { + if (current !== null) { + // A class component without an instance only mounts if it suspended + // inside a non-concurrent tree, in an inconsistent state. We want to + // treat it like a new mount, even though an empty version of it already + // committed. Disconnect the alternate pointers. + current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } // In the initial pass we might need to construct the instance. + + + constructClassInstance(workInProgress, Component, nextProps); + mountClassInstance(workInProgress, Component, nextProps, renderLanes); + shouldUpdate = true; + } else if (current === null) { + // In a resume, we'll already have an instance we can reuse. + shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderLanes); + } else { + shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderLanes); + } + + var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes); + + { + var inst = workInProgress.stateNode; + + if (shouldUpdate && inst.props !== nextProps) { + if (!didWarnAboutReassigningProps) { + error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentName(workInProgress.type) || 'a component'); + } + + didWarnAboutReassigningProps = true; + } + } + + return nextUnitOfWork; +} + +function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes) { + // Refs should update even if shouldComponentUpdate returns false + markRef(current, workInProgress); + var didCaptureError = (workInProgress.flags & DidCapture) !== NoFlags; + + if (!shouldUpdate && !didCaptureError) { + // Context providers should defer to sCU for rendering + if (hasContext) { + invalidateContextProvider(workInProgress, Component, false); + } + + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + + var instance = workInProgress.stateNode; // Rerender + + ReactCurrentOwner$1.current = workInProgress; + var nextChildren; + + if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') { + // If we captured an error, but getDerivedStateFromError is not defined, + // unmount all the children. componentDidCatch will schedule an update to + // re-render a fallback. This is temporary until we migrate everyone to + // the new API. + // TODO: Warn in a future release. + nextChildren = null; + + { + stopProfilerTimerIfRunning(); + } + } else { + { + setIsRendering(true); + nextChildren = instance.render(); + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + instance.render(); + } finally { + reenableLogs(); + } + } + + setIsRendering(false); + } + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + + if (current !== null && didCaptureError) { + // If we're recovering from an error, reconcile without reusing any of + // the existing children. Conceptually, the normal children and the children + // that are shown on error are two different sets, so we shouldn't reuse + // normal children even if their identities match. + forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes); + } else { + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + } // Memoize state using the values we just used to render. + // TODO: Restructure so we never read values from the instance. + + + workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it. + + if (hasContext) { + invalidateContextProvider(workInProgress, Component, true); + } + + return workInProgress.child; +} + +function pushHostRootContext(workInProgress) { + var root = workInProgress.stateNode; + + if (root.pendingContext) { + pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context); + } else if (root.context) { + // Should always be set + pushTopLevelContextObject(workInProgress, root.context, false); + } + + pushHostContainer(workInProgress, root.containerInfo); +} + +function updateHostRoot(current, workInProgress, renderLanes) { + pushHostRootContext(workInProgress); + var updateQueue = workInProgress.updateQueue; + + if (!(current !== null && updateQueue !== null)) { + { + throw Error( "If the root does not have an updateQueue, we should have already bailed out. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var nextProps = workInProgress.pendingProps; + var prevState = workInProgress.memoizedState; + var prevChildren = prevState !== null ? prevState.element : null; + cloneUpdateQueue(current, workInProgress); + processUpdateQueue(workInProgress, nextProps, null, renderLanes); + var nextState = workInProgress.memoizedState; // Caution: React DevTools currently depends on this property + // being called "element". + + var nextChildren = nextState.element; + + if (nextChildren === prevChildren) { + resetHydrationState(); + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + + var root = workInProgress.stateNode; + + if (root.hydrate && enterHydrationState(workInProgress)) { + // If we don't have any current children this might be the first pass. + // We always try to hydrate. If this isn't a hydration pass there won't + // be any children to hydrate which is effectively the same thing as + // not hydrating. + { + var mutableSourceEagerHydrationData = root.mutableSourceEagerHydrationData; + + if (mutableSourceEagerHydrationData != null) { + for (var i = 0; i < mutableSourceEagerHydrationData.length; i += 2) { + var mutableSource = mutableSourceEagerHydrationData[i]; + var version = mutableSourceEagerHydrationData[i + 1]; + setWorkInProgressVersion(mutableSource, version); + } + } + } + + var child = mountChildFibers(workInProgress, null, nextChildren, renderLanes); + workInProgress.child = child; + var node = child; + + while (node) { + // Mark each child as hydrating. This is a fast path to know whether this + // tree is part of a hydrating tree. This is used to determine if a child + // node has fully mounted yet, and for scheduling event replaying. + // Conceptually this is similar to Placement in that a new subtree is + // inserted into the React tree here. It just happens to not need DOM + // mutations because it already exists. + node.flags = node.flags & ~Placement | Hydrating; + node = node.sibling; + } + } else { + // Otherwise reset hydration state in case we aborted and resumed another + // root. + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + resetHydrationState(); + } + + return workInProgress.child; +} + +function updateHostComponent(current, workInProgress, renderLanes) { + pushHostContext(workInProgress); + + if (current === null) { + tryToClaimNextHydratableInstance(workInProgress); + } + + var type = workInProgress.type; + var nextProps = workInProgress.pendingProps; + var prevProps = current !== null ? current.memoizedProps : null; + var nextChildren = nextProps.children; + var isDirectTextChild = shouldSetTextContent(type, nextProps); + + if (isDirectTextChild) { + // We special case a direct text child of a host node. This is a common + // case. We won't handle it as a reified child. We will instead handle + // this in the host environment that also has access to this prop. That + // avoids allocating another HostText fiber and traversing it. + nextChildren = null; + } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) { + // If we're switching from a direct text child to a normal child, or to + // empty, we need to schedule the text content to be reset. + workInProgress.flags |= ContentReset; + } + + markRef(current, workInProgress); + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + return workInProgress.child; +} + +function updateHostText(current, workInProgress) { + if (current === null) { + tryToClaimNextHydratableInstance(workInProgress); + } // Nothing to do here. This is terminal. We'll do the completion step + // immediately after. + + + return null; +} + +function mountLazyComponent(_current, workInProgress, elementType, updateLanes, renderLanes) { + if (_current !== null) { + // A lazy component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } + + var props = workInProgress.pendingProps; + var lazyComponent = elementType; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + var Component = init(payload); // Store the unwrapped component in the type. + + workInProgress.type = Component; + var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component); + var resolvedProps = resolveDefaultProps(Component, props); + var child; + + switch (resolvedTag) { + case FunctionComponent: + { + { + validateFunctionComponentInDev(workInProgress, Component); + workInProgress.type = Component = resolveFunctionForHotReloading(Component); + } + + child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderLanes); + return child; + } + + case ClassComponent: + { + { + workInProgress.type = Component = resolveClassForHotReloading(Component); + } + + child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderLanes); + return child; + } + + case ForwardRef: + { + { + workInProgress.type = Component = resolveForwardRefForHotReloading(Component); + } + + child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderLanes); + return child; + } + + case MemoComponent: + { + { + if (workInProgress.type !== workInProgress.elementType) { + var outerPropTypes = Component.propTypes; + + if (outerPropTypes) { + checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only + 'prop', getComponentName(Component)); + } + } + } + + child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too + updateLanes, renderLanes); + return child; + } + } + + var hint = ''; + + { + if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) { + hint = ' Did you wrap a component in React.lazy() more than once?'; + } + } // This message intentionally doesn't mention ForwardRef or MemoComponent + // because the fact that it's a separate type of work is an + // implementation detail. + + + { + { + throw Error( "Element type is invalid. Received a promise that resolves to: " + Component + ". Lazy element type must resolve to a class or function." + hint ); + } + } +} + +function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderLanes) { + if (_current !== null) { + // An incomplete component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } // Promote the fiber to a class and try rendering again. + + + workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent` + // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + var hasContext; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } + + prepareToReadContext(workInProgress, renderLanes); + constructClassInstance(workInProgress, Component, nextProps); + mountClassInstance(workInProgress, Component, nextProps, renderLanes); + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes); +} + +function mountIndeterminateComponent(_current, workInProgress, Component, renderLanes) { + if (_current !== null) { + // An indeterminate component only mounts if it suspended inside a non- + // concurrent tree, in an inconsistent state. We want to treat it like + // a new mount, even though an empty version of it already committed. + // Disconnect the alternate pointers. + _current.alternate = null; + workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect + + workInProgress.flags |= Placement; + } + + var props = workInProgress.pendingProps; + var context; + + { + var unmaskedContext = getUnmaskedContext(workInProgress, Component, false); + context = getMaskedContext(workInProgress, unmaskedContext); + } + + prepareToReadContext(workInProgress, renderLanes); + var value; + + { + if (Component.prototype && typeof Component.prototype.render === 'function') { + var componentName = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutBadClass[componentName]) { + error("The <%s /> component appears to have a render method, but doesn't extend React.Component. " + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName); + + didWarnAboutBadClass[componentName] = true; + } + } + + if (workInProgress.mode & StrictMode) { + ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null); + } + + setIsRendering(true); + ReactCurrentOwner$1.current = workInProgress; + value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes); + setIsRendering(false); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + + { + // Support for module components is deprecated and is removed behind a flag. + // Whether or not it would crash later, we want to show a good message in DEV first. + if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + var _componentName = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutModulePatternComponent[_componentName]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName, _componentName, _componentName); + + didWarnAboutModulePatternComponent[_componentName] = true; + } + } + } + + if ( // Run these checks in production only if the flag is off. + // Eventually we'll delete this branch altogether. + typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) { + { + var _componentName2 = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutModulePatternComponent[_componentName2]) { + error('The <%s /> component appears to be a function component that returns a class instance. ' + 'Change %s to a class that extends React.Component instead. ' + "If you can't use a class try assigning the prototype on the function as a workaround. " + "`%s.prototype = React.Component.prototype`. Don't use an arrow function since it " + 'cannot be called with `new` by React.', _componentName2, _componentName2, _componentName2); + + didWarnAboutModulePatternComponent[_componentName2] = true; + } + } // Proceed under the assumption that this is a class instance + + + workInProgress.tag = ClassComponent; // Throw out any hooks that were used. + + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches. + // During mounting we don't know the child context yet as the instance doesn't exist. + // We will invalidate the child context in finishClassComponent() right after rendering. + + var hasContext = false; + + if (isContextProvider(Component)) { + hasContext = true; + pushContextProvider(workInProgress); + } else { + hasContext = false; + } + + workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null; + initializeUpdateQueue(workInProgress); + var getDerivedStateFromProps = Component.getDerivedStateFromProps; + + if (typeof getDerivedStateFromProps === 'function') { + applyDerivedStateFromProps(workInProgress, Component, getDerivedStateFromProps, props); + } + + adoptClassInstance(workInProgress, value); + mountClassInstance(workInProgress, Component, props, renderLanes); + return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes); + } else { + // Proceed under the assumption that this is a function component + workInProgress.tag = FunctionComponent; + + { + + if ( workInProgress.mode & StrictMode) { + disableLogs(); + + try { + value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes); + } finally { + reenableLogs(); + } + } + } + + reconcileChildren(null, workInProgress, value, renderLanes); + + { + validateFunctionComponentInDev(workInProgress, Component); + } + + return workInProgress.child; + } +} + +function validateFunctionComponentInDev(workInProgress, Component) { + { + if (Component) { + if (Component.childContextTypes) { + error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component'); + } + } + + if (workInProgress.ref !== null) { + var info = ''; + var ownerName = getCurrentFiberOwnerNameInDevOrNull(); + + if (ownerName) { + info += '\n\nCheck the render method of `' + ownerName + '`.'; + } + + var warningKey = ownerName || workInProgress._debugID || ''; + var debugSource = workInProgress._debugSource; + + if (debugSource) { + warningKey = debugSource.fileName + ':' + debugSource.lineNumber; + } + + if (!didWarnAboutFunctionRefs[warningKey]) { + didWarnAboutFunctionRefs[warningKey] = true; + + error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info); + } + } + + if (typeof Component.getDerivedStateFromProps === 'function') { + var _componentName3 = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) { + error('%s: Function components do not support getDerivedStateFromProps.', _componentName3); + + didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true; + } + } + + if (typeof Component.contextType === 'object' && Component.contextType !== null) { + var _componentName4 = getComponentName(Component) || 'Unknown'; + + if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) { + error('%s: Function components do not support contextType.', _componentName4); + + didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true; + } + } + } +} + +var SUSPENDED_MARKER = { + dehydrated: null, + retryLane: NoLane +}; + +function mountSuspenseOffscreenState(renderLanes) { + return { + baseLanes: renderLanes + }; +} + +function updateSuspenseOffscreenState(prevOffscreenState, renderLanes) { + return { + baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes) + }; +} // TODO: Probably should inline this back + + +function shouldRemainOnFallback(suspenseContext, current, workInProgress, renderLanes) { + // If we're already showing a fallback, there are cases where we need to + // remain on that fallback regardless of whether the content has resolved. + // For example, SuspenseList coordinates when nested content appears. + if (current !== null) { + var suspenseState = current.memoizedState; + + if (suspenseState === null) { + // Currently showing content. Don't hide it, even if ForceSuspenseFallack + // is true. More precise name might be "ForceRemainSuspenseFallback". + // Note: This is a factoring smell. Can't remain on a fallback if there's + // no fallback to remain on. + return false; + } + } // Not currently showing content. Consult the Suspense context. + + + return hasSuspenseContext(suspenseContext, ForceSuspenseFallback); +} + +function getRemainingWorkInPrimaryTree(current, renderLanes) { + // TODO: Should not remove render lanes that were pinged during this render + return removeLanes(current.childLanes, renderLanes); +} + +function updateSuspenseComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend. + + { + if (shouldSuspend(workInProgress)) { + workInProgress.flags |= DidCapture; + } + } + + var suspenseContext = suspenseStackCursor.current; + var showFallback = false; + var didSuspend = (workInProgress.flags & DidCapture) !== NoFlags; + + if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) { + // Something in this boundary's subtree already suspended. Switch to + // rendering the fallback children. + showFallback = true; + workInProgress.flags &= ~DidCapture; + } else { + // Attempting the main content + if (current === null || current.memoizedState !== null) { + // This is a new mount or this boundary is already showing a fallback state. + // Mark this subtree context as having at least one invisible parent that could + // handle the fallback state. + // Boundaries without fallbacks or should be avoided are not considered since + // they cannot handle preferred fallback states. + if (nextProps.fallback !== undefined && nextProps.unstable_avoidThisFallback !== true) { + suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext); + } + } + } + + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + pushSuspenseContext(workInProgress, suspenseContext); // OK, the next part is confusing. We're about to reconcile the Suspense + // boundary's children. This involves some custom reconcilation logic. Two + // main reasons this is so complicated. + // + // First, Legacy Mode has different semantics for backwards compatibility. The + // primary tree will commit in an inconsistent state, so when we do the + // second pass to render the fallback, we do some exceedingly, uh, clever + // hacks to make that not totally break. Like transferring effects and + // deletions from hidden tree. In Concurrent Mode, it's much simpler, + // because we bailout on the primary tree completely and leave it in its old + // state, no effects. Same as what we do for Offscreen (except that + // Offscreen doesn't have the first render pass). + // + // Second is hydration. During hydration, the Suspense fiber has a slightly + // different layout, where the child points to a dehydrated fragment, which + // contains the DOM rendered by the server. + // + // Third, even if you set all that aside, Suspense is like error boundaries in + // that we first we try to render one tree, and if that fails, we render again + // and switch to a different tree. Like a try/catch block. So we have to track + // which branch we're currently rendering. Ideally we would model this using + // a stack. + + if (current === null) { + // Initial mount + // If we're currently hydrating, try to hydrate this boundary. + // But only if this has a fallback. + if (nextProps.fallback !== undefined) { + tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component. + } + + var nextPrimaryChildren = nextProps.children; + var nextFallbackChildren = nextProps.fallback; + + if (showFallback) { + var fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes); + var primaryChildFragment = workInProgress.child; + primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes); + workInProgress.memoizedState = SUSPENDED_MARKER; + return fallbackFragment; + } else if (typeof nextProps.unstable_expectedLoadTime === 'number') { + // This is a CPU-bound tree. Skip this tree and show a placeholder to + // unblock the surrounding content. Then immediately retry after the + // initial commit. + var _fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes); + + var _primaryChildFragment = workInProgress.child; + _primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes); + workInProgress.memoizedState = SUSPENDED_MARKER; // Since nothing actually suspended, there will nothing to ping this to + // get it started back up to attempt the next item. While in terms of + // priority this work has the same priority as this current render, it's + // not part of the same transition once the transition has committed. If + // it's sync, we still want to yield so that it can be painted. + // Conceptually, this is really the same as pinging. We can use any + // RetryLane even if it's the one currently rendering since we're leaving + // it behind on this node. + + workInProgress.lanes = SomeRetryLane; + + { + markSpawnedWork(SomeRetryLane); + } + + return _fallbackFragment; + } else { + return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren, renderLanes); + } + } else { + // This is an update. + // If the current fiber has a SuspenseState, that means it's already showing + // a fallback. + var prevState = current.memoizedState; + + if (prevState !== null) { + + if (showFallback) { + var _nextFallbackChildren2 = nextProps.fallback; + var _nextPrimaryChildren2 = nextProps.children; + + var _fallbackChildFragment = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren2, _nextFallbackChildren2, renderLanes); + + var _primaryChildFragment3 = workInProgress.child; + var prevOffscreenState = current.child.memoizedState; + _primaryChildFragment3.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes); + _primaryChildFragment3.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes); + workInProgress.memoizedState = SUSPENDED_MARKER; + return _fallbackChildFragment; + } else { + var _nextPrimaryChildren3 = nextProps.children; + + var _primaryChildFragment4 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren3, renderLanes); + + workInProgress.memoizedState = null; + return _primaryChildFragment4; + } + } else { + // The current tree is not already showing a fallback. + if (showFallback) { + // Timed out. + var _nextFallbackChildren3 = nextProps.fallback; + var _nextPrimaryChildren4 = nextProps.children; + + var _fallbackChildFragment2 = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren4, _nextFallbackChildren3, renderLanes); + + var _primaryChildFragment5 = workInProgress.child; + var _prevOffscreenState = current.child.memoizedState; + _primaryChildFragment5.memoizedState = _prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(_prevOffscreenState, renderLanes); + _primaryChildFragment5.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes); // Skip the primary children, and continue working on the + // fallback children. + + workInProgress.memoizedState = SUSPENDED_MARKER; + return _fallbackChildFragment2; + } else { + // Still haven't timed out. Continue rendering the children, like we + // normally do. + var _nextPrimaryChildren5 = nextProps.children; + + var _primaryChildFragment6 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren5, renderLanes); + + workInProgress.memoizedState = null; + return _primaryChildFragment6; + } + } + } +} + +function mountSuspensePrimaryChildren(workInProgress, primaryChildren, renderLanes) { + var mode = workInProgress.mode; + var primaryChildProps = { + mode: 'visible', + children: primaryChildren + }; + var primaryChildFragment = createFiberFromOffscreen(primaryChildProps, mode, renderLanes, null); + primaryChildFragment.return = workInProgress; + workInProgress.child = primaryChildFragment; + return primaryChildFragment; +} + +function mountSuspenseFallbackChildren(workInProgress, primaryChildren, fallbackChildren, renderLanes) { + var mode = workInProgress.mode; + var progressedPrimaryFragment = workInProgress.child; + var primaryChildProps = { + mode: 'hidden', + children: primaryChildren + }; + var primaryChildFragment; + var fallbackChildFragment; + + if ((mode & BlockingMode) === NoMode && progressedPrimaryFragment !== null) { + // In legacy mode, we commit the primary tree as if it successfully + // completed, even though it's in an inconsistent state. + primaryChildFragment = progressedPrimaryFragment; + primaryChildFragment.childLanes = NoLanes; + primaryChildFragment.pendingProps = primaryChildProps; + + if ( workInProgress.mode & ProfileMode) { + // Reset the durations from the first pass so they aren't included in the + // final amounts. This seems counterintuitive, since we're intentionally + // not measuring part of the render phase, but this makes it match what we + // do in Concurrent Mode. + primaryChildFragment.actualDuration = 0; + primaryChildFragment.actualStartTime = -1; + primaryChildFragment.selfBaseDuration = 0; + primaryChildFragment.treeBaseDuration = 0; + } + + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); + } else { + primaryChildFragment = createFiberFromOffscreen(primaryChildProps, mode, NoLanes, null); + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); + } + + primaryChildFragment.return = workInProgress; + fallbackChildFragment.return = workInProgress; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress.child = primaryChildFragment; + return fallbackChildFragment; +} + +function createWorkInProgressOffscreenFiber(current, offscreenProps) { + // The props argument to `createWorkInProgress` is `any` typed, so we use this + // wrapper function to constrain it. + return createWorkInProgress(current, offscreenProps); +} + +function updateSuspensePrimaryChildren(current, workInProgress, primaryChildren, renderLanes) { + var currentPrimaryChildFragment = current.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var primaryChildFragment = createWorkInProgressOffscreenFiber(currentPrimaryChildFragment, { + mode: 'visible', + children: primaryChildren + }); + + if ((workInProgress.mode & BlockingMode) === NoMode) { + primaryChildFragment.lanes = renderLanes; + } + + primaryChildFragment.return = workInProgress; + primaryChildFragment.sibling = null; + + if (currentFallbackChildFragment !== null) { + // Delete the fallback child fragment + currentFallbackChildFragment.nextEffect = null; + currentFallbackChildFragment.flags = Deletion; + workInProgress.firstEffect = workInProgress.lastEffect = currentFallbackChildFragment; + } + + workInProgress.child = primaryChildFragment; + return primaryChildFragment; +} + +function updateSuspenseFallbackChildren(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) { + var mode = workInProgress.mode; + var currentPrimaryChildFragment = current.child; + var currentFallbackChildFragment = currentPrimaryChildFragment.sibling; + var primaryChildProps = { + mode: 'hidden', + children: primaryChildren + }; + var primaryChildFragment; + + if ( // In legacy mode, we commit the primary tree as if it successfully + // completed, even though it's in an inconsistent state. + (mode & BlockingMode) === NoMode && // Make sure we're on the second pass, i.e. the primary child fragment was + // already cloned. In legacy mode, the only case where this isn't true is + // when DevTools forces us to display a fallback; we skip the first render + // pass entirely and go straight to rendering the fallback. (In Concurrent + // Mode, SuspenseList can also trigger this scenario, but this is a legacy- + // only codepath.) + workInProgress.child !== currentPrimaryChildFragment) { + var progressedPrimaryFragment = workInProgress.child; + primaryChildFragment = progressedPrimaryFragment; + primaryChildFragment.childLanes = NoLanes; + primaryChildFragment.pendingProps = primaryChildProps; + + if ( workInProgress.mode & ProfileMode) { + // Reset the durations from the first pass so they aren't included in the + // final amounts. This seems counterintuitive, since we're intentionally + // not measuring part of the render phase, but this makes it match what we + // do in Concurrent Mode. + primaryChildFragment.actualDuration = 0; + primaryChildFragment.actualStartTime = -1; + primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration; + primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration; + } // The fallback fiber was added as a deletion effect during the first pass. + // However, since we're going to remain on the fallback, we no longer want + // to delete it. So we need to remove it from the list. Deletions are stored + // on the same list as effects. We want to keep the effects from the primary + // tree. So we copy the primary child fragment's effect list, which does not + // include the fallback deletion effect. + + + var progressedLastEffect = primaryChildFragment.lastEffect; + + if (progressedLastEffect !== null) { + workInProgress.firstEffect = primaryChildFragment.firstEffect; + workInProgress.lastEffect = progressedLastEffect; + progressedLastEffect.nextEffect = null; + } else { + // TODO: Reset this somewhere else? Lol legacy mode is so weird. + workInProgress.firstEffect = workInProgress.lastEffect = null; + } + } else { + primaryChildFragment = createWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps); + } + + var fallbackChildFragment; + + if (currentFallbackChildFragment !== null) { + fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren); + } else { + fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); // Needs a placement effect because the parent (the Suspense boundary) already + // mounted but this is a new fiber. + + fallbackChildFragment.flags |= Placement; + } + + fallbackChildFragment.return = workInProgress; + primaryChildFragment.return = workInProgress; + primaryChildFragment.sibling = fallbackChildFragment; + workInProgress.child = primaryChildFragment; + return fallbackChildFragment; +} + +function scheduleWorkOnFiber(fiber, renderLanes) { + fiber.lanes = mergeLanes(fiber.lanes, renderLanes); + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, renderLanes); + } + + scheduleWorkOnParentPath(fiber.return, renderLanes); +} + +function propagateSuspenseContextChange(workInProgress, firstChild, renderLanes) { + // Mark any Suspense boundaries with fallbacks as having work to do. + // If they were previously forced into fallbacks, they may now be able + // to unblock. + var node = firstChild; + + while (node !== null) { + if (node.tag === SuspenseComponent) { + var state = node.memoizedState; + + if (state !== null) { + scheduleWorkOnFiber(node, renderLanes); + } + } else if (node.tag === SuspenseListComponent) { + // If the tail is hidden there might not be an Suspense boundaries + // to schedule work on. In this case we have to schedule it on the + // list itself. + // We don't have to traverse to the children of the list since + // the list will propagate the change when it rerenders. + scheduleWorkOnFiber(node, renderLanes); + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === workInProgress) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } +} + +function findLastContentRow(firstChild) { + // This is going to find the last row among these children that is already + // showing content on the screen, as opposed to being in fallback state or + // new. If a row has multiple Suspense boundaries, any of them being in the + // fallback state, counts as the whole row being in a fallback state. + // Note that the "rows" will be workInProgress, but any nested children + // will still be current since we haven't rendered them yet. The mounted + // order may not be the same as the new order. We use the new order. + var row = firstChild; + var lastContentRow = null; + + while (row !== null) { + var currentRow = row.alternate; // New rows can't be content rows. + + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + lastContentRow = row; + } + + row = row.sibling; + } + + return lastContentRow; +} + +function validateRevealOrder(revealOrder) { + { + if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) { + didWarnAboutRevealOrder[revealOrder] = true; + + if (typeof revealOrder === 'string') { + switch (revealOrder.toLowerCase()) { + case 'together': + case 'forwards': + case 'backwards': + { + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase()); + + break; + } + + case 'forward': + case 'backward': + { + error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'React uses the -s suffix in the spelling. Use "%ss" instead.', revealOrder, revealOrder.toLowerCase()); + + break; + } + + default: + error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + + break; + } + } else { + error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder); + } + } + } +} + +function validateTailOptions(tailMode, revealOrder) { + { + if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) { + if (tailMode !== 'collapsed' && tailMode !== 'hidden') { + didWarnAboutTailOptions[tailMode] = true; + + error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode); + } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') { + didWarnAboutTailOptions[tailMode] = true; + + error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode); + } + } + } +} + +function validateSuspenseListNestedChild(childSlot, index) { + { + var isArray = Array.isArray(childSlot); + var isIterable = !isArray && typeof getIteratorFn(childSlot) === 'function'; + + if (isArray || isIterable) { + var type = isArray ? 'array' : 'iterable'; + + error('A nested %s was passed to row #%s in <SuspenseList />. Wrap it in ' + 'an additional SuspenseList to configure its revealOrder: ' + '<SuspenseList revealOrder=...> ... ' + '<SuspenseList revealOrder=...>{%s}</SuspenseList> ... ' + '</SuspenseList>', type, index, type); + + return false; + } + } + + return true; +} + +function validateSuspenseListChildren(children, revealOrder) { + { + if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) { + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + if (!validateSuspenseListNestedChild(children[i], i)) { + return; + } + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var childrenIterator = iteratorFn.call(children); + + if (childrenIterator) { + var step = childrenIterator.next(); + var _i = 0; + + for (; !step.done; step = childrenIterator.next()) { + if (!validateSuspenseListNestedChild(step.value, _i)) { + return; + } + + _i++; + } + } + } else { + error('A single row was passed to a <SuspenseList revealOrder="%s" />. ' + 'This is not useful since it needs multiple rows. ' + 'Did you mean to pass multiple children or an array?', revealOrder); + } + } + } + } +} + +function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, lastEffectBeforeRendering) { + var renderState = workInProgress.memoizedState; + + if (renderState === null) { + workInProgress.memoizedState = { + isBackwards: isBackwards, + rendering: null, + renderingStartTime: 0, + last: lastContentRow, + tail: tail, + tailMode: tailMode, + lastEffect: lastEffectBeforeRendering + }; + } else { + // We can reuse the existing object from previous renders. + renderState.isBackwards = isBackwards; + renderState.rendering = null; + renderState.renderingStartTime = 0; + renderState.last = lastContentRow; + renderState.tail = tail; + renderState.tailMode = tailMode; + renderState.lastEffect = lastEffectBeforeRendering; + } +} // This can end up rendering this component multiple passes. +// The first pass splits the children fibers into two sets. A head and tail. +// We first render the head. If anything is in fallback state, we do another +// pass through beginWork to rerender all children (including the tail) with +// the force suspend context. If the first render didn't have anything in +// in fallback state. Then we render each row in the tail one-by-one. +// That happens in the completeWork phase without going back to beginWork. + + +function updateSuspenseListComponent(current, workInProgress, renderLanes) { + var nextProps = workInProgress.pendingProps; + var revealOrder = nextProps.revealOrder; + var tailMode = nextProps.tail; + var newChildren = nextProps.children; + validateRevealOrder(revealOrder); + validateTailOptions(tailMode, revealOrder); + validateSuspenseListChildren(newChildren, revealOrder); + reconcileChildren(current, workInProgress, newChildren, renderLanes); + var suspenseContext = suspenseStackCursor.current; + var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback); + + if (shouldForceFallback) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + workInProgress.flags |= DidCapture; + } else { + var didSuspendBefore = current !== null && (current.flags & DidCapture) !== NoFlags; + + if (didSuspendBefore) { + // If we previously forced a fallback, we need to schedule work + // on any nested boundaries to let them know to try to render + // again. This is the same as context updating. + propagateSuspenseContextChange(workInProgress, workInProgress.child, renderLanes); + } + + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + } + + pushSuspenseContext(workInProgress, suspenseContext); + + if ((workInProgress.mode & BlockingMode) === NoMode) { + // In legacy mode, SuspenseList doesn't work so we just + // use make it a noop by treating it as the default revealOrder. + workInProgress.memoizedState = null; + } else { + switch (revealOrder) { + case 'forwards': + { + var lastContentRow = findLastContentRow(workInProgress.child); + var tail; + + if (lastContentRow === null) { + // The whole list is part of the tail. + // TODO: We could fast path by just rendering the tail now. + tail = workInProgress.child; + workInProgress.child = null; + } else { + // Disconnect the tail rows after the content row. + // We're going to render them separately later. + tail = lastContentRow.sibling; + lastContentRow.sibling = null; + } + + initSuspenseListRenderState(workInProgress, false, // isBackwards + tail, lastContentRow, tailMode, workInProgress.lastEffect); + break; + } + + case 'backwards': + { + // We're going to find the first row that has existing content. + // At the same time we're going to reverse the list of everything + // we pass in the meantime. That's going to be our tail in reverse + // order. + var _tail = null; + var row = workInProgress.child; + workInProgress.child = null; + + while (row !== null) { + var currentRow = row.alternate; // New rows can't be content rows. + + if (currentRow !== null && findFirstSuspended(currentRow) === null) { + // This is the beginning of the main content. + workInProgress.child = row; + break; + } + + var nextRow = row.sibling; + row.sibling = _tail; + _tail = row; + row = nextRow; + } // TODO: If workInProgress.child is null, we can continue on the tail immediately. + + + initSuspenseListRenderState(workInProgress, true, // isBackwards + _tail, null, // last + tailMode, workInProgress.lastEffect); + break; + } + + case 'together': + { + initSuspenseListRenderState(workInProgress, false, // isBackwards + null, // tail + null, // last + undefined, workInProgress.lastEffect); + break; + } + + default: + { + // The default reveal order is the same as not having + // a boundary. + workInProgress.memoizedState = null; + } + } + } + + return workInProgress.child; +} + +function updatePortalComponent(current, workInProgress, renderLanes) { + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); + var nextChildren = workInProgress.pendingProps; + + if (current === null) { + // Portals are special because we don't append the children during mount + // but at commit. Therefore we need to track insertions which the normal + // flow doesn't do during mount. This doesn't happen at the root because + // the root always starts with a "current" with a null child. + // TODO: Consider unifying this with how the root works. + workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes); + } else { + reconcileChildren(current, workInProgress, nextChildren, renderLanes); + } + + return workInProgress.child; +} + +var hasWarnedAboutUsingNoValuePropOnContextProvider = false; + +function updateContextProvider(current, workInProgress, renderLanes) { + var providerType = workInProgress.type; + var context = providerType._context; + var newProps = workInProgress.pendingProps; + var oldProps = workInProgress.memoizedProps; + var newValue = newProps.value; + + { + if (!('value' in newProps)) { + if (!hasWarnedAboutUsingNoValuePropOnContextProvider) { + hasWarnedAboutUsingNoValuePropOnContextProvider = true; + + error('The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?'); + } + } + + var providerPropTypes = workInProgress.type.propTypes; + + if (providerPropTypes) { + checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider'); + } + } + + pushProvider(workInProgress, newValue); + + if (oldProps !== null) { + var oldValue = oldProps.value; + var changedBits = calculateChangedBits(context, newValue, oldValue); + + if (changedBits === 0) { + // No change. Bailout early if children are the same. + if (oldProps.children === newProps.children && !hasContextChanged()) { + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } + } else { + // The context value changed. Search for matching consumers and schedule + // them to update. + propagateContextChange(workInProgress, context, changedBits, renderLanes); + } + } + + var newChildren = newProps.children; + reconcileChildren(current, workInProgress, newChildren, renderLanes); + return workInProgress.child; +} + +var hasWarnedAboutUsingContextAsConsumer = false; + +function updateContextConsumer(current, workInProgress, renderLanes) { + var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In + // DEV mode, we create a separate object for Context.Consumer that acts + // like a proxy to Context. This proxy object adds unnecessary code in PROD + // so we use the old behaviour (Context.Consumer references Context) to + // reduce size and overhead. The separate object references context via + // a property called "_context", which also gives us the ability to check + // in DEV mode if this property exists or not and warn if it does not. + + { + if (context._context === undefined) { + // This may be because it's a Context (rather than a Consumer). + // Or it may be because it's older React where they're the same thing. + // We only want to warn if we're sure it's a new React. + if (context !== context.Consumer) { + if (!hasWarnedAboutUsingContextAsConsumer) { + hasWarnedAboutUsingContextAsConsumer = true; + + error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } + } + } else { + context = context._context; + } + } + + var newProps = workInProgress.pendingProps; + var render = newProps.children; + + { + if (typeof render !== 'function') { + error('A context consumer was rendered with multiple children, or a child ' + "that isn't a function. A context consumer expects a single child " + 'that is a function. If you did pass a function, make sure there ' + 'is no trailing or leading whitespace around it.'); + } + } + + prepareToReadContext(workInProgress, renderLanes); + var newValue = readContext(context, newProps.unstable_observedBits); + var newChildren; + + { + ReactCurrentOwner$1.current = workInProgress; + setIsRendering(true); + newChildren = render(newValue); + setIsRendering(false); + } // React DevTools reads this flag. + + + workInProgress.flags |= PerformedWork; + reconcileChildren(current, workInProgress, newChildren, renderLanes); + return workInProgress.child; +} + +function markWorkInProgressReceivedUpdate() { + didReceiveUpdate = true; +} + +function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) { + if (current !== null) { + // Reuse previous dependencies + workInProgress.dependencies = current.dependencies; + } + + { + // Don't update "base" render times for bailouts. + stopProfilerTimerIfRunning(); + } + + markSkippedUpdateLanes(workInProgress.lanes); // Check if the children have any pending work. + + if (!includesSomeLane(renderLanes, workInProgress.childLanes)) { + // The children don't have any work either. We can skip them. + // TODO: Once we add back resuming, we should check if the children are + // a work-in-progress set. If so, we need to transfer their effects. + return null; + } else { + // This fiber doesn't have work, but its subtree does. Clone the child + // fibers and continue. + cloneChildFibers(current, workInProgress); + return workInProgress.child; + } +} + +function remountFiber(current, oldWorkInProgress, newWorkInProgress) { + { + var returnFiber = oldWorkInProgress.return; + + if (returnFiber === null) { + throw new Error('Cannot swap the root fiber.'); + } // Disconnect from the old current. + // It will get deleted. + + + current.alternate = null; + oldWorkInProgress.alternate = null; // Connect to the new tree. + + newWorkInProgress.index = oldWorkInProgress.index; + newWorkInProgress.sibling = oldWorkInProgress.sibling; + newWorkInProgress.return = oldWorkInProgress.return; + newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it. + + if (oldWorkInProgress === returnFiber.child) { + returnFiber.child = newWorkInProgress; + } else { + var prevSibling = returnFiber.child; + + if (prevSibling === null) { + throw new Error('Expected parent to have a child.'); + } + + while (prevSibling.sibling !== oldWorkInProgress) { + prevSibling = prevSibling.sibling; + + if (prevSibling === null) { + throw new Error('Expected to find the previous sibling.'); + } + } + + prevSibling.sibling = newWorkInProgress; + } // Delete the old fiber and place the new one. + // Since the old fiber is disconnected, we have to schedule it manually. + + + var last = returnFiber.lastEffect; + + if (last !== null) { + last.nextEffect = current; + returnFiber.lastEffect = current; + } else { + returnFiber.firstEffect = returnFiber.lastEffect = current; + } + + current.nextEffect = null; + current.flags = Deletion; + newWorkInProgress.flags |= Placement; // Restart work from the new fiber. + + return newWorkInProgress; + } +} + +function beginWork(current, workInProgress, renderLanes) { + var updateLanes = workInProgress.lanes; + + { + if (workInProgress._debugNeedsRemount && current !== null) { + // This will restart the begin phase with a new fiber. + return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes)); + } + } + + if (current !== null) { + var oldProps = current.memoizedProps; + var newProps = workInProgress.pendingProps; + + if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload: + workInProgress.type !== current.type )) { + // If props or context changed, mark the fiber as having performed work. + // This may be unset if the props are determined to be equal later (memo). + didReceiveUpdate = true; + } else if (!includesSomeLane(renderLanes, updateLanes)) { + didReceiveUpdate = false; // This fiber does not have any pending work. Bailout without entering + // the begin phase. There's still some bookkeeping we that needs to be done + // in this optimized path, mostly pushing stuff onto the stack. + + switch (workInProgress.tag) { + case HostRoot: + pushHostRootContext(workInProgress); + resetHydrationState(); + break; + + case HostComponent: + pushHostContext(workInProgress); + break; + + case ClassComponent: + { + var Component = workInProgress.type; + + if (isContextProvider(Component)) { + pushContextProvider(workInProgress); + } + + break; + } + + case HostPortal: + pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo); + break; + + case ContextProvider: + { + var newValue = workInProgress.memoizedProps.value; + pushProvider(workInProgress, newValue); + break; + } + + case Profiler: + { + // Profiler should only call onRender when one of its descendants actually rendered. + var hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes); + + if (hasChildWork) { + workInProgress.flags |= Update; + } // Reset effect durations for the next eventual effect phase. + // These are reset during render to allow the DevTools commit hook a chance to read them, + + + var stateNode = workInProgress.stateNode; + stateNode.effectDuration = 0; + stateNode.passiveEffectDuration = 0; + } + + break; + + case SuspenseComponent: + { + var state = workInProgress.memoizedState; + + if (state !== null) { + // whether to retry the primary children, or to skip over it and + // go straight to the fallback. Check the priority of the primary + // child fragment. + + + var primaryChildFragment = workInProgress.child; + var primaryChildLanes = primaryChildFragment.childLanes; + + if (includesSomeLane(renderLanes, primaryChildLanes)) { + // The primary children have pending work. Use the normal path + // to attempt to render the primary children again. + return updateSuspenseComponent(current, workInProgress, renderLanes); + } else { + // The primary child fragment does not have pending work marked + // on it + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient + // priority. Bailout. + + var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + + if (child !== null) { + // The fallback children have pending work. Skip over the + // primary children and work on the fallback. + return child.sibling; + } else { + return null; + } + } + } else { + pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); + } + + break; + } + + case SuspenseListComponent: + { + var didSuspendBefore = (current.flags & DidCapture) !== NoFlags; + + var _hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes); + + if (didSuspendBefore) { + if (_hasChildWork) { + // If something was in fallback state last time, and we have all the + // same children then we're still in progressive loading state. + // Something might get unblocked by state updates or retries in the + // tree which will affect the tail. So we need to use the normal + // path to compute the correct tail. + return updateSuspenseListComponent(current, workInProgress, renderLanes); + } // If none of the children had any work, that means that none of + // them got retried so they'll still be blocked in the same way + // as before. We can fast bail out. + + + workInProgress.flags |= DidCapture; + } // If nothing suspended before and we're rendering the same children, + // then the tail doesn't matter. Anything new that suspends will work + // in the "together" mode, so we can continue from the state we had. + + + var renderState = workInProgress.memoizedState; + + if (renderState !== null) { + // Reset to the "together" mode in case we've started a different + // update in the past but didn't complete it. + renderState.rendering = null; + renderState.tail = null; + renderState.lastEffect = null; + } + + pushSuspenseContext(workInProgress, suspenseStackCursor.current); + + if (_hasChildWork) { + break; + } else { + // If none of the children had any work, that means that none of + // them got retried so they'll still be blocked in the same way + // as before. We can fast bail out. + return null; + } + } + + case OffscreenComponent: + case LegacyHiddenComponent: + { + // Need to check if the tree still needs to be deferred. This is + // almost identical to the logic used in the normal update path, + // so we'll just enter that. The only difference is we'll bail out + // at the next level instead of this one, because the child props + // have not changed. Which is fine. + // TODO: Probably should refactor `beginWork` to split the bailout + // path from the normal path. I'm tempted to do a labeled break here + // but I won't :) + workInProgress.lanes = NoLanes; + return updateOffscreenComponent(current, workInProgress, renderLanes); + } + } + + return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes); + } else { + if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) { + // This is a special case that only exists for legacy mode. + // See https://github.com/facebook/react/pull/19216. + didReceiveUpdate = true; + } else { + // An update was scheduled on this fiber, but there are no new props + // nor legacy context. Set this to false. If an update queue or context + // consumer produces a changed value, it will set this to true. Otherwise, + // the component will assume the children have not changed and bail out. + didReceiveUpdate = false; + } + } + } else { + didReceiveUpdate = false; + } // Before entering the begin phase, clear pending update priority. + // TODO: This assumes that we're about to evaluate the component and process + // the update queue. However, there's an exception: SimpleMemoComponent + // sometimes bails out later in the begin phase. This indicates that we should + // move this assignment out of the common path and into each branch. + + + workInProgress.lanes = NoLanes; + + switch (workInProgress.tag) { + case IndeterminateComponent: + { + return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderLanes); + } + + case LazyComponent: + { + var elementType = workInProgress.elementType; + return mountLazyComponent(current, workInProgress, elementType, updateLanes, renderLanes); + } + + case FunctionComponent: + { + var _Component = workInProgress.type; + var unresolvedProps = workInProgress.pendingProps; + var resolvedProps = workInProgress.elementType === _Component ? unresolvedProps : resolveDefaultProps(_Component, unresolvedProps); + return updateFunctionComponent(current, workInProgress, _Component, resolvedProps, renderLanes); + } + + case ClassComponent: + { + var _Component2 = workInProgress.type; + var _unresolvedProps = workInProgress.pendingProps; + + var _resolvedProps = workInProgress.elementType === _Component2 ? _unresolvedProps : resolveDefaultProps(_Component2, _unresolvedProps); + + return updateClassComponent(current, workInProgress, _Component2, _resolvedProps, renderLanes); + } + + case HostRoot: + return updateHostRoot(current, workInProgress, renderLanes); + + case HostComponent: + return updateHostComponent(current, workInProgress, renderLanes); + + case HostText: + return updateHostText(current, workInProgress); + + case SuspenseComponent: + return updateSuspenseComponent(current, workInProgress, renderLanes); + + case HostPortal: + return updatePortalComponent(current, workInProgress, renderLanes); + + case ForwardRef: + { + var type = workInProgress.type; + var _unresolvedProps2 = workInProgress.pendingProps; + + var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2); + + return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderLanes); + } + + case Fragment: + return updateFragment(current, workInProgress, renderLanes); + + case Mode: + return updateMode(current, workInProgress, renderLanes); + + case Profiler: + return updateProfiler(current, workInProgress, renderLanes); + + case ContextProvider: + return updateContextProvider(current, workInProgress, renderLanes); + + case ContextConsumer: + return updateContextConsumer(current, workInProgress, renderLanes); + + case MemoComponent: + { + var _type2 = workInProgress.type; + var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props. + + var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3); + + { + if (workInProgress.type !== workInProgress.elementType) { + var outerPropTypes = _type2.propTypes; + + if (outerPropTypes) { + checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only + 'prop', getComponentName(_type2)); + } + } + } + + _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3); + return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, updateLanes, renderLanes); + } + + case SimpleMemoComponent: + { + return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, updateLanes, renderLanes); + } + + case IncompleteClassComponent: + { + var _Component3 = workInProgress.type; + var _unresolvedProps4 = workInProgress.pendingProps; + + var _resolvedProps4 = workInProgress.elementType === _Component3 ? _unresolvedProps4 : resolveDefaultProps(_Component3, _unresolvedProps4); + + return mountIncompleteClassComponent(current, workInProgress, _Component3, _resolvedProps4, renderLanes); + } + + case SuspenseListComponent: + { + return updateSuspenseListComponent(current, workInProgress, renderLanes); + } + + case FundamentalComponent: + { + + break; + } + + case ScopeComponent: + { + + break; + } + + case Block: + { + + break; + } + + case OffscreenComponent: + { + return updateOffscreenComponent(current, workInProgress, renderLanes); + } + + case LegacyHiddenComponent: + { + return updateLegacyHiddenComponent(current, workInProgress, renderLanes); + } + } + + { + { + throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function markUpdate(workInProgress) { + // Tag the fiber with an update effect. This turns a Placement into + // a PlacementAndUpdate. + workInProgress.flags |= Update; +} + +function markRef$1(workInProgress) { + workInProgress.flags |= Ref; +} + +var appendAllChildren; +var updateHostContainer; +var updateHostComponent$1; +var updateHostText$1; + +{ + // Mutation mode + appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) { + // We only have the top Fiber that was created but we need recurse down its + // children to find all the terminal nodes. + var node = workInProgress.child; + + while (node !== null) { + if (node.tag === HostComponent || node.tag === HostText) { + appendInitialChild(parent, node.stateNode); + } else if (node.tag === HostPortal) ; else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === workInProgress) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === workInProgress) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + }; + + updateHostContainer = function (workInProgress) {// Noop + }; + + updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) { + // If we have an alternate, that means this is an update and we need to + // schedule a side-effect to do the updates. + var oldProps = current.memoizedProps; + + if (oldProps === newProps) { + // In mutation mode, this is sufficient for a bailout because + // we won't touch this node even if children changed. + return; + } // If we get updated because one of our children updated, we don't + // have newProps so we'll have to reuse them. + // TODO: Split the update API as separate for the props vs. children. + // Even better would be if children weren't special cased at all tho. + + + var instance = workInProgress.stateNode; + var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host + // component is hitting the resume path. Figure out why. Possibly + // related to `hidden`. + + var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component. + + workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there + // is a new ref we mark this as an update. All the work is done in commitWork. + + if (updatePayload) { + markUpdate(workInProgress); + } + }; + + updateHostText$1 = function (current, workInProgress, oldText, newText) { + // If the text differs, mark it as an update. All the work in done in commitWork. + if (oldText !== newText) { + markUpdate(workInProgress); + } + }; +} + +function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) { + if (getIsHydrating()) { + // If we're hydrating, we should consume as many items as we can + // so we don't leave any behind. + return; + } + + switch (renderState.tailMode) { + case 'hidden': + { + // Any insertions at the end of the tail list after this point + // should be invisible. If there are already mounted boundaries + // anything before them are not considered for collapsing. + // Therefore we need to go through the whole tail to find if + // there are any. + var tailNode = renderState.tail; + var lastTailNode = null; + + while (tailNode !== null) { + if (tailNode.alternate !== null) { + lastTailNode = tailNode; + } + + tailNode = tailNode.sibling; + } // Next we're simply going to delete all insertions after the + // last rendered item. + + + if (lastTailNode === null) { + // All remaining items in the tail are insertions. + renderState.tail = null; + } else { + // Detach the insertion after the last node that was already + // inserted. + lastTailNode.sibling = null; + } + + break; + } + + case 'collapsed': + { + // Any insertions at the end of the tail list after this point + // should be invisible. If there are already mounted boundaries + // anything before them are not considered for collapsing. + // Therefore we need to go through the whole tail to find if + // there are any. + var _tailNode = renderState.tail; + var _lastTailNode = null; + + while (_tailNode !== null) { + if (_tailNode.alternate !== null) { + _lastTailNode = _tailNode; + } + + _tailNode = _tailNode.sibling; + } // Next we're simply going to delete all insertions after the + // last rendered item. + + + if (_lastTailNode === null) { + // All remaining items in the tail are insertions. + if (!hasRenderedATailFallback && renderState.tail !== null) { + // We suspended during the head. We want to show at least one + // row at the tail. So we'll keep on and cut off the rest. + renderState.tail.sibling = null; + } else { + renderState.tail = null; + } + } else { + // Detach the insertion after the last node that was already + // inserted. + _lastTailNode.sibling = null; + } + + break; + } + } +} + +function completeWork(current, workInProgress, renderLanes) { + var newProps = workInProgress.pendingProps; + + switch (workInProgress.tag) { + case IndeterminateComponent: + case LazyComponent: + case SimpleMemoComponent: + case FunctionComponent: + case ForwardRef: + case Fragment: + case Mode: + case Profiler: + case ContextConsumer: + case MemoComponent: + return null; + + case ClassComponent: + { + var Component = workInProgress.type; + + if (isContextProvider(Component)) { + popContext(workInProgress); + } + + return null; + } + + case HostRoot: + { + popHostContainer(workInProgress); + popTopLevelContextObject(workInProgress); + resetWorkInProgressVersions(); + var fiberRoot = workInProgress.stateNode; + + if (fiberRoot.pendingContext) { + fiberRoot.context = fiberRoot.pendingContext; + fiberRoot.pendingContext = null; + } + + if (current === null || current.child === null) { + // If we hydrated, pop so that we can delete any remaining children + // that weren't hydrated. + var wasHydrated = popHydrationState(workInProgress); + + if (wasHydrated) { + // If we hydrated, then we'll need to schedule an update for + // the commit side-effects on the root. + markUpdate(workInProgress); + } else if (!fiberRoot.hydrate) { + // Schedule an effect to clear this container at the start of the next commit. + // This handles the case of React rendering into a container with previous children. + // It's also safe to do for updates too, because current.child would only be null + // if the previous render was null (so the the container would already be empty). + workInProgress.flags |= Snapshot; + } + } + + updateHostContainer(workInProgress); + return null; + } + + case HostComponent: + { + popHostContext(workInProgress); + var rootContainerInstance = getRootHostContainer(); + var type = workInProgress.type; + + if (current !== null && workInProgress.stateNode != null) { + updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance); + + if (current.ref !== workInProgress.ref) { + markRef$1(workInProgress); + } + } else { + if (!newProps) { + if (!(workInProgress.stateNode !== null)) { + { + throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); + } + } // This can happen when we abort work. + + + return null; + } + + var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context + // "stack" as the parent. Then append children as we go in beginWork + // or completeWork depending on whether we want to add them top->down or + // bottom->up. Top->down is faster in IE11. + + var _wasHydrated = popHydrationState(workInProgress); + + if (_wasHydrated) { + // TODO: Move this and createInstance step into the beginPhase + // to consolidate. + if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) { + // If changes to the hydrated node need to be applied at the + // commit-phase we mark this as such. + markUpdate(workInProgress); + } + } else { + var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress); + appendAllChildren(instance, workInProgress, false, false); + workInProgress.stateNode = instance; // Certain renderers require commit-time effects for initial mount. + // (eg DOM renderer supports auto-focus for certain elements). + // Make sure such renderers get scheduled for later work. + + if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) { + markUpdate(workInProgress); + } + } + + if (workInProgress.ref !== null) { + // If there is a ref on a host node we need to schedule a callback + markRef$1(workInProgress); + } + } + + return null; + } + + case HostText: + { + var newText = newProps; + + if (current && workInProgress.stateNode != null) { + var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need + // to schedule a side-effect to do the updates. + + updateHostText$1(current, workInProgress, oldText, newText); + } else { + if (typeof newText !== 'string') { + if (!(workInProgress.stateNode !== null)) { + { + throw Error( "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue." ); + } + } // This can happen when we abort work. + + } + + var _rootContainerInstance = getRootHostContainer(); + + var _currentHostContext = getHostContext(); + + var _wasHydrated2 = popHydrationState(workInProgress); + + if (_wasHydrated2) { + if (prepareToHydrateHostTextInstance(workInProgress)) { + markUpdate(workInProgress); + } + } else { + workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress); + } + } + + return null; + } + + case SuspenseComponent: + { + popSuspenseContext(workInProgress); + var nextState = workInProgress.memoizedState; + + if ((workInProgress.flags & DidCapture) !== NoFlags) { + // Something suspended. Re-render with the fallback children. + workInProgress.lanes = renderLanes; // Do not reset the effect list. + + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress); + } + + return workInProgress; + } + + var nextDidTimeout = nextState !== null; + var prevDidTimeout = false; + + if (current === null) { + if (workInProgress.memoizedProps.fallback !== undefined) { + popHydrationState(workInProgress); + } + } else { + var prevState = current.memoizedState; + prevDidTimeout = prevState !== null; + } + + if (nextDidTimeout && !prevDidTimeout) { + // If this subtreee is running in blocking mode we can suspend, + // otherwise we won't suspend. + // TODO: This will still suspend a synchronous tree if anything + // in the concurrent tree already suspended during this render. + // This is a known bug. + if ((workInProgress.mode & BlockingMode) !== NoMode) { + // TODO: Move this back to throwException because this is too late + // if this is a large tree which is common for initial loads. We + // don't know if we should restart a render or not until we get + // this marker, and this is too late. + // If this render already had a ping or lower pri updates, + // and this is the first time we know we're going to suspend we + // should be able to immediately restart from within throwException. + var hasInvisibleChildContext = current === null && workInProgress.memoizedProps.unstable_avoidThisFallback !== true; + + if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) { + // If this was in an invisible tree or a new render, then showing + // this boundary is ok. + renderDidSuspend(); + } else { + // Otherwise, we're going to have to hide content so we should + // suspend for longer if possible. + renderDidSuspendDelayIfPossible(); + } + } + } + + { + // TODO: Only schedule updates if these values are non equal, i.e. it changed. + if (nextDidTimeout || prevDidTimeout) { + // If this boundary just timed out, schedule an effect to attach a + // retry listener to the promise. This flag is also used to hide the + // primary children. In mutation mode, we also need the flag to + // *unhide* children that were previously hidden, so check if this + // is currently timed out, too. + workInProgress.flags |= Update; + } + } + + return null; + } + + case HostPortal: + popHostContainer(workInProgress); + updateHostContainer(workInProgress); + + if (current === null) { + preparePortalMount(workInProgress.stateNode.containerInfo); + } + + return null; + + case ContextProvider: + // Pop provider fiber + popProvider(workInProgress); + return null; + + case IncompleteClassComponent: + { + // Same as class component case. I put it down here so that the tags are + // sequential to ensure this switch is compiled to a jump table. + var _Component = workInProgress.type; + + if (isContextProvider(_Component)) { + popContext(workInProgress); + } + + return null; + } + + case SuspenseListComponent: + { + popSuspenseContext(workInProgress); + var renderState = workInProgress.memoizedState; + + if (renderState === null) { + // We're running in the default, "independent" mode. + // We don't do anything in this mode. + return null; + } + + var didSuspendAlready = (workInProgress.flags & DidCapture) !== NoFlags; + var renderedTail = renderState.rendering; + + if (renderedTail === null) { + // We just rendered the head. + if (!didSuspendAlready) { + // This is the first pass. We need to figure out if anything is still + // suspended in the rendered set. + // If new content unsuspended, but there's still some content that + // didn't. Then we need to do a second pass that forces everything + // to keep showing their fallbacks. + // We might be suspended if something in this render pass suspended, or + // something in the previous committed pass suspended. Otherwise, + // there's no chance so we can skip the expensive call to + // findFirstSuspended. + var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.flags & DidCapture) === NoFlags); + + if (!cannotBeSuspended) { + var row = workInProgress.child; + + while (row !== null) { + var suspended = findFirstSuspended(row); + + if (suspended !== null) { + didSuspendAlready = true; + workInProgress.flags |= DidCapture; + cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as + // part of the second pass. In that case nothing will subscribe to + // its thennables. Instead, we'll transfer its thennables to the + // SuspenseList so that it can retry if they resolve. + // There might be multiple of these in the list but since we're + // going to wait for all of them anyway, it doesn't really matter + // which ones gets to ping. In theory we could get clever and keep + // track of how many dependencies remain but it gets tricky because + // in the meantime, we can add/remove/change items and dependencies. + // We might bail out of the loop before finding any but that + // doesn't matter since that means that the other boundaries that + // we did find already has their listeners attached. + + var newThennables = suspended.updateQueue; + + if (newThennables !== null) { + workInProgress.updateQueue = newThennables; + workInProgress.flags |= Update; + } // Rerender the whole list, but this time, we'll force fallbacks + // to stay in place. + // Reset the effect list before doing the second pass since that's now invalid. + + + if (renderState.lastEffect === null) { + workInProgress.firstEffect = null; + } + + workInProgress.lastEffect = renderState.lastEffect; // Reset the child fibers to their original state. + + resetChildFibers(workInProgress, renderLanes); // Set up the Suspense Context to force suspense and immediately + // rerender the children. + + pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); + return workInProgress.child; + } + + row = row.sibling; + } + } + + if (renderState.tail !== null && now() > getRenderTargetTime()) { + // We have already passed our CPU deadline but we still have rows + // left in the tail. We'll just give up further attempts to render + // the main content and only render fallbacks. + workInProgress.flags |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this + // to get it started back up to attempt the next item. While in terms + // of priority this work has the same priority as this current render, + // it's not part of the same transition once the transition has + // committed. If it's sync, we still want to yield so that it can be + // painted. Conceptually, this is really the same as pinging. + // We can use any RetryLane even if it's the one currently rendering + // since we're leaving it behind on this node. + + workInProgress.lanes = SomeRetryLane; + + { + markSpawnedWork(SomeRetryLane); + } + } + } else { + cutOffTailIfNeeded(renderState, false); + } // Next we're going to render the tail. + + } else { + // Append the rendered row to the child list. + if (!didSuspendAlready) { + var _suspended = findFirstSuspended(renderedTail); + + if (_suspended !== null) { + workInProgress.flags |= DidCapture; + didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't + // get lost if this row ends up dropped during a second pass. + + var _newThennables = _suspended.updateQueue; + + if (_newThennables !== null) { + workInProgress.updateQueue = _newThennables; + workInProgress.flags |= Update; + } + + cutOffTailIfNeeded(renderState, true); // This might have been modified. + + if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate && !getIsHydrating() // We don't cut it if we're hydrating. + ) { + // We need to delete the row we just rendered. + // Reset the effect list to what it was before we rendered this + // child. The nested children have already appended themselves. + var lastEffect = workInProgress.lastEffect = renderState.lastEffect; // Remove any effects that were appended after this point. + + if (lastEffect !== null) { + lastEffect.nextEffect = null; + } // We're done. + + + return null; + } + } else if ( // The time it took to render last row is greater than the remaining + // time we have to render. So rendering one more row would likely + // exceed it. + now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes !== OffscreenLane) { + // We have now passed our CPU deadline and we'll just give up further + // attempts to render the main content and only render fallbacks. + // The assumption is that this is usually faster. + workInProgress.flags |= DidCapture; + didSuspendAlready = true; + cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this + // to get it started back up to attempt the next item. While in terms + // of priority this work has the same priority as this current render, + // it's not part of the same transition once the transition has + // committed. If it's sync, we still want to yield so that it can be + // painted. Conceptually, this is really the same as pinging. + // We can use any RetryLane even if it's the one currently rendering + // since we're leaving it behind on this node. + + workInProgress.lanes = SomeRetryLane; + + { + markSpawnedWork(SomeRetryLane); + } + } + } + + if (renderState.isBackwards) { + // The effect list of the backwards tail will have been added + // to the end. This breaks the guarantee that life-cycles fire in + // sibling order but that isn't a strong guarantee promised by React. + // Especially since these might also just pop in during future commits. + // Append to the beginning of the list. + renderedTail.sibling = workInProgress.child; + workInProgress.child = renderedTail; + } else { + var previousSibling = renderState.last; + + if (previousSibling !== null) { + previousSibling.sibling = renderedTail; + } else { + workInProgress.child = renderedTail; + } + + renderState.last = renderedTail; + } + } + + if (renderState.tail !== null) { + // We still have tail rows to render. + // Pop a row. + var next = renderState.tail; + renderState.rendering = next; + renderState.tail = next.sibling; + renderState.lastEffect = workInProgress.lastEffect; + renderState.renderingStartTime = now(); + next.sibling = null; // Restore the context. + // TODO: We can probably just avoid popping it instead and only + // setting it the first time we go from not suspended to suspended. + + var suspenseContext = suspenseStackCursor.current; + + if (didSuspendAlready) { + suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback); + } else { + suspenseContext = setDefaultShallowSuspenseContext(suspenseContext); + } + + pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row. + + return next; + } + + return null; + } + + case FundamentalComponent: + { + + break; + } + + case ScopeComponent: + { + + break; + } + + case Block: + + break; + + case OffscreenComponent: + case LegacyHiddenComponent: + { + popRenderLanes(workInProgress); + + if (current !== null) { + var _nextState = workInProgress.memoizedState; + var _prevState = current.memoizedState; + var prevIsHidden = _prevState !== null; + var nextIsHidden = _nextState !== null; + + if (prevIsHidden !== nextIsHidden && newProps.mode !== 'unstable-defer-without-hiding') { + workInProgress.flags |= Update; + } + } + + return null; + } + } + + { + { + throw Error( "Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function unwindWork(workInProgress, renderLanes) { + switch (workInProgress.tag) { + case ClassComponent: + { + var Component = workInProgress.type; + + if (isContextProvider(Component)) { + popContext(workInProgress); + } + + var flags = workInProgress.flags; + + if (flags & ShouldCapture) { + workInProgress.flags = flags & ~ShouldCapture | DidCapture; + + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress); + } + + return workInProgress; + } + + return null; + } + + case HostRoot: + { + popHostContainer(workInProgress); + popTopLevelContextObject(workInProgress); + resetWorkInProgressVersions(); + var _flags = workInProgress.flags; + + if (!((_flags & DidCapture) === NoFlags)) { + { + throw Error( "The root failed to unmount after an error. This is likely a bug in React. Please file an issue." ); + } + } + + workInProgress.flags = _flags & ~ShouldCapture | DidCapture; + return workInProgress; + } + + case HostComponent: + { + // TODO: popHydrationState + popHostContext(workInProgress); + return null; + } + + case SuspenseComponent: + { + popSuspenseContext(workInProgress); + + var _flags2 = workInProgress.flags; + + if (_flags2 & ShouldCapture) { + workInProgress.flags = _flags2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary. + + if ( (workInProgress.mode & ProfileMode) !== NoMode) { + transferActualDuration(workInProgress); + } + + return workInProgress; + } + + return null; + } + + case SuspenseListComponent: + { + popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been + // caught by a nested boundary. If not, it should bubble through. + + return null; + } + + case HostPortal: + popHostContainer(workInProgress); + return null; + + case ContextProvider: + popProvider(workInProgress); + return null; + + case OffscreenComponent: + case LegacyHiddenComponent: + popRenderLanes(workInProgress); + return null; + + default: + return null; + } +} + +function unwindInterruptedWork(interruptedWork) { + switch (interruptedWork.tag) { + case ClassComponent: + { + var childContextTypes = interruptedWork.type.childContextTypes; + + if (childContextTypes !== null && childContextTypes !== undefined) { + popContext(interruptedWork); + } + + break; + } + + case HostRoot: + { + popHostContainer(interruptedWork); + popTopLevelContextObject(interruptedWork); + resetWorkInProgressVersions(); + break; + } + + case HostComponent: + { + popHostContext(interruptedWork); + break; + } + + case HostPortal: + popHostContainer(interruptedWork); + break; + + case SuspenseComponent: + popSuspenseContext(interruptedWork); + break; + + case SuspenseListComponent: + popSuspenseContext(interruptedWork); + break; + + case ContextProvider: + popProvider(interruptedWork); + break; + + case OffscreenComponent: + case LegacyHiddenComponent: + popRenderLanes(interruptedWork); + break; + } +} + +function createCapturedValue(value, source) { + // If the value is an error, call this function immediately after it is thrown + // so the stack is accurate. + return { + value: value, + source: source, + stack: getStackByFiberInDevAndProd(source) + }; +} + +// This module is forked in different environments. +// By default, return `true` to log errors to the console. +// Forks can return `false` if this isn't desirable. +function showErrorDialog(boundary, errorInfo) { + return true; +} + +function logCapturedError(boundary, errorInfo) { + try { + var logError = showErrorDialog(boundary, errorInfo); // Allow injected showErrorDialog() to prevent default console.error logging. + // This enables renderers like ReactNative to better manage redbox behavior. + + if (logError === false) { + return; + } + + var error = errorInfo.value; + + if (true) { + var source = errorInfo.source; + var stack = errorInfo.stack; + var componentStack = stack !== null ? stack : ''; // Browsers support silencing uncaught errors by calling + // `preventDefault()` in window `error` handler. + // We record this information as an expando on the error. + + if (error != null && error._suppressLogging) { + if (boundary.tag === ClassComponent) { + // The error is recoverable and was silenced. + // Ignore it and don't print the stack addendum. + // This is handy for testing error boundaries without noise. + return; + } // The error is fatal. Since the silencing might have + // been accidental, we'll surface it anyway. + // However, the browser would have silenced the original error + // so we'll print it first, and then print the stack addendum. + + + console['error'](error); // Don't transform to our wrapper + // For a more detailed description of this block, see: + // https://github.com/facebook/react/pull/13384 + } + + var componentName = source ? getComponentName(source.type) : null; + var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:'; + var errorBoundaryMessage; + var errorBoundaryName = getComponentName(boundary.type); + + if (errorBoundaryName) { + errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + "."); + } else { + errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.'; + } + + var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack. + // We don't include the original error message and JS stack because the browser + // has already printed it. Even if the application swallows the error, it is still + // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils. + + console['error'](combinedMessage); // Don't transform to our wrapper + } else {} + } catch (e) { + // This method must not throw, or React internal state will get messed up. + // If console.error is overridden, or logCapturedError() shows a dialog that throws, + // we want to report this error outside of the normal stack as a last resort. + // https://github.com/facebook/react/issues/13188 + setTimeout(function () { + throw e; + }); + } +} + +var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map; + +function createRootErrorUpdate(fiber, errorInfo, lane) { + var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null. + + update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property + // being called "element". + + update.payload = { + element: null + }; + var error = errorInfo.value; + + update.callback = function () { + onUncaughtError(error); + logCapturedError(fiber, errorInfo); + }; + + return update; +} + +function createClassErrorUpdate(fiber, errorInfo, lane) { + var update = createUpdate(NoTimestamp, lane); + update.tag = CaptureUpdate; + var getDerivedStateFromError = fiber.type.getDerivedStateFromError; + + if (typeof getDerivedStateFromError === 'function') { + var error$1 = errorInfo.value; + + update.payload = function () { + logCapturedError(fiber, errorInfo); + return getDerivedStateFromError(error$1); + }; + } + + var inst = fiber.stateNode; + + if (inst !== null && typeof inst.componentDidCatch === 'function') { + update.callback = function callback() { + { + markFailedErrorBoundaryForHotReloading(fiber); + } + + if (typeof getDerivedStateFromError !== 'function') { + // To preserve the preexisting retry behavior of error boundaries, + // we keep track of which ones already failed during this batch. + // This gets reset before we yield back to the browser. + // TODO: Warn in strict mode if getDerivedStateFromError is + // not defined. + markLegacyErrorBoundaryAsFailed(this); // Only log here if componentDidCatch is the only error boundary method defined + + logCapturedError(fiber, errorInfo); + } + + var error$1 = errorInfo.value; + var stack = errorInfo.stack; + this.componentDidCatch(error$1, { + componentStack: stack !== null ? stack : '' + }); + + { + if (typeof getDerivedStateFromError !== 'function') { + // If componentDidCatch is the only error boundary method defined, + // then it needs to call setState to recover from errors. + // If no state update is scheduled then the boundary will swallow the error. + if (!includesSomeLane(fiber.lanes, SyncLane)) { + error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentName(fiber.type) || 'Unknown'); + } + } + } + }; + } else { + update.callback = function () { + markFailedErrorBoundaryForHotReloading(fiber); + }; + } + + return update; +} + +function attachPingListener(root, wakeable, lanes) { + // Attach a listener to the promise to "ping" the root and retry. But only if + // one does not already exist for the lanes we're currently rendering (which + // acts like a "thread ID" here). + var pingCache = root.pingCache; + var threadIDs; + + if (pingCache === null) { + pingCache = root.pingCache = new PossiblyWeakMap$1(); + threadIDs = new Set(); + pingCache.set(wakeable, threadIDs); + } else { + threadIDs = pingCache.get(wakeable); + + if (threadIDs === undefined) { + threadIDs = new Set(); + pingCache.set(wakeable, threadIDs); + } + } + + if (!threadIDs.has(lanes)) { + // Memoize using the thread ID to prevent redundant listeners. + threadIDs.add(lanes); + var ping = pingSuspendedRoot.bind(null, root, wakeable, lanes); + wakeable.then(ping, ping); + } +} + +function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) { + // The source fiber did not complete. + sourceFiber.flags |= Incomplete; // Its effect list is no longer valid. + + sourceFiber.firstEffect = sourceFiber.lastEffect = null; + + if (value !== null && typeof value === 'object' && typeof value.then === 'function') { + // This is a wakeable. + var wakeable = value; + + if ((sourceFiber.mode & BlockingMode) === NoMode) { + // Reset the memoizedState to what it was before we attempted + // to render it. + var currentSource = sourceFiber.alternate; + + if (currentSource) { + sourceFiber.updateQueue = currentSource.updateQueue; + sourceFiber.memoizedState = currentSource.memoizedState; + sourceFiber.lanes = currentSource.lanes; + } else { + sourceFiber.updateQueue = null; + sourceFiber.memoizedState = null; + } + } + + var hasInvisibleParentBoundary = hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext); // Schedule the nearest Suspense to re-render the timed out view. + + var _workInProgress = returnFiber; + + do { + if (_workInProgress.tag === SuspenseComponent && shouldCaptureSuspense(_workInProgress, hasInvisibleParentBoundary)) { + // Found the nearest boundary. + // Stash the promise on the boundary fiber. If the boundary times out, we'll + // attach another listener to flip the boundary back to its normal state. + var wakeables = _workInProgress.updateQueue; + + if (wakeables === null) { + var updateQueue = new Set(); + updateQueue.add(wakeable); + _workInProgress.updateQueue = updateQueue; + } else { + wakeables.add(wakeable); + } // If the boundary is outside of blocking mode, we should *not* + // suspend the commit. Pretend as if the suspended component rendered + // null and keep rendering. In the commit phase, we'll schedule a + // subsequent synchronous update to re-render the Suspense. + // + // Note: It doesn't matter whether the component that suspended was + // inside a blocking mode tree. If the Suspense is outside of it, we + // should *not* suspend the commit. + + + if ((_workInProgress.mode & BlockingMode) === NoMode) { + _workInProgress.flags |= DidCapture; + sourceFiber.flags |= ForceUpdateForLegacySuspense; // We're going to commit this fiber even though it didn't complete. + // But we shouldn't call any lifecycle methods or callbacks. Remove + // all lifecycle effect tags. + + sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete); + + if (sourceFiber.tag === ClassComponent) { + var currentSourceFiber = sourceFiber.alternate; + + if (currentSourceFiber === null) { + // This is a new mount. Change the tag so it's not mistaken for a + // completed class component. For example, we should not call + // componentWillUnmount if it is deleted. + sourceFiber.tag = IncompleteClassComponent; + } else { + // When we try rendering again, we should not reuse the current fiber, + // since it's known to be in an inconsistent state. Use a force update to + // prevent a bail out. + var update = createUpdate(NoTimestamp, SyncLane); + update.tag = ForceUpdate; + enqueueUpdate(sourceFiber, update); + } + } // The source fiber did not complete. Mark it with Sync priority to + // indicate that it still has pending work. + + + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane); // Exit without suspending. + + return; + } // Confirmed that the boundary is in a concurrent mode tree. Continue + // with the normal suspend path. + // + // After this we'll use a set of heuristics to determine whether this + // render pass will run to completion or restart or "suspend" the commit. + // The actual logic for this is spread out in different places. + // + // This first principle is that if we're going to suspend when we complete + // a root, then we should also restart if we get an update or ping that + // might unsuspend it, and vice versa. The only reason to suspend is + // because you think you might want to restart before committing. However, + // it doesn't make sense to restart only while in the period we're suspended. + // + // Restarting too aggressively is also not good because it starves out any + // intermediate loading state. So we use heuristics to determine when. + // Suspense Heuristics + // + // If nothing threw a Promise or all the same fallbacks are already showing, + // then don't suspend/restart. + // + // If this is an initial render of a new tree of Suspense boundaries and + // those trigger a fallback, then don't suspend/restart. We want to ensure + // that we can show the initial loading state as quickly as possible. + // + // If we hit a "Delayed" case, such as when we'd switch from content back into + // a fallback, then we should always suspend/restart. Transitions apply + // to this case. If none is defined, JND is used instead. + // + // If we're already showing a fallback and it gets "retried", allowing us to show + // another level, but there's still an inner boundary that would show a fallback, + // then we suspend/restart for 500ms since the last time we showed a fallback + // anywhere in the tree. This effectively throttles progressive loading into a + // consistent train of commits. This also gives us an opportunity to restart to + // get to the completed state slightly earlier. + // + // If there's ambiguity due to batching it's resolved in preference of: + // 1) "delayed", 2) "initial render", 3) "retry". + // + // We want to ensure that a "busy" state doesn't get force committed. We want to + // ensure that new initial loading states can commit as soon as possible. + + + attachPingListener(root, wakeable, rootRenderLanes); + _workInProgress.flags |= ShouldCapture; + _workInProgress.lanes = rootRenderLanes; + return; + } // This boundary already captured during this render. Continue to the next + // boundary. + + + _workInProgress = _workInProgress.return; + } while (_workInProgress !== null); // No boundary was found. Fallthrough to error mode. + // TODO: Use invariant so the message is stripped in prod? + + + value = new Error((getComponentName(sourceFiber.type) || 'A React component') + ' suspended while rendering, but no fallback UI was specified.\n' + '\n' + 'Add a <Suspense fallback=...> component higher in the tree to ' + 'provide a loading indicator or placeholder to display.'); + } // We didn't find a boundary that could handle this type of exception. Start + // over and traverse parent path again, this time treating the exception + // as an error. + + + renderDidError(); + value = createCapturedValue(value, sourceFiber); + var workInProgress = returnFiber; + + do { + switch (workInProgress.tag) { + case HostRoot: + { + var _errorInfo = value; + workInProgress.flags |= ShouldCapture; + var lane = pickArbitraryLane(rootRenderLanes); + workInProgress.lanes = mergeLanes(workInProgress.lanes, lane); + + var _update = createRootErrorUpdate(workInProgress, _errorInfo, lane); + + enqueueCapturedUpdate(workInProgress, _update); + return; + } + + case ClassComponent: + // Capture and retry + var errorInfo = value; + var ctor = workInProgress.type; + var instance = workInProgress.stateNode; + + if ((workInProgress.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) { + workInProgress.flags |= ShouldCapture; + + var _lane = pickArbitraryLane(rootRenderLanes); + + workInProgress.lanes = mergeLanes(workInProgress.lanes, _lane); // Schedule the error boundary to re-render using updated state + + var _update2 = createClassErrorUpdate(workInProgress, errorInfo, _lane); + + enqueueCapturedUpdate(workInProgress, _update2); + return; + } + + break; + } + + workInProgress = workInProgress.return; + } while (workInProgress !== null); +} + +var didWarnAboutUndefinedSnapshotBeforeUpdate = null; + +{ + didWarnAboutUndefinedSnapshotBeforeUpdate = new Set(); +} + +var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set; + +var callComponentWillUnmountWithTimer = function (current, instance) { + instance.props = current.memoizedProps; + instance.state = current.memoizedState; + + { + instance.componentWillUnmount(); + } +}; // Capture errors so they don't interrupt unmounting. + + +function safelyCallComponentWillUnmount(current, instance) { + { + invokeGuardedCallback(null, callComponentWillUnmountWithTimer, null, current, instance); + + if (hasCaughtError()) { + var unmountError = clearCaughtError(); + captureCommitPhaseError(current, unmountError); + } + } +} + +function safelyDetachRef(current) { + var ref = current.ref; + + if (ref !== null) { + if (typeof ref === 'function') { + { + invokeGuardedCallback(null, ref, null, null); + + if (hasCaughtError()) { + var refError = clearCaughtError(); + captureCommitPhaseError(current, refError); + } + } + } else { + ref.current = null; + } + } +} + +function safelyCallDestroy(current, destroy) { + { + invokeGuardedCallback(null, destroy, null); + + if (hasCaughtError()) { + var error = clearCaughtError(); + captureCommitPhaseError(current, error); + } + } +} + +function commitBeforeMutationLifeCycles(current, finishedWork) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + case Block: + { + return; + } + + case ClassComponent: + { + if (finishedWork.flags & Snapshot) { + if (current !== null) { + var prevProps = current.memoizedProps; + var prevState = current.memoizedState; + var instance = finishedWork.stateNode; // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'getSnapshotBeforeUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } + + var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState); + + { + var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate; + + if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) { + didWarnSet.add(finishedWork.type); + + error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentName(finishedWork.type)); + } + } + + instance.__reactInternalSnapshotBeforeUpdate = snapshot; + } + } + + return; + } + + case HostRoot: + { + { + if (finishedWork.flags & Snapshot) { + var root = finishedWork.stateNode; + clearContainer(root.containerInfo); + } + } + + return; + } + + case HostComponent: + case HostText: + case HostPortal: + case IncompleteClassComponent: + // Nothing to do for these component types + return; + } + + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function commitHookEffectListUnmount(tag, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + if ((effect.tag & tag) === tag) { + // Unmount + var destroy = effect.destroy; + effect.destroy = undefined; + + if (destroy !== undefined) { + destroy(); + } + } + + effect = effect.next; + } while (effect !== firstEffect); + } +} + +function commitHookEffectListMount(tag, finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + if ((effect.tag & tag) === tag) { + // Mount + var create = effect.create; + effect.destroy = create(); + + { + var destroy = effect.destroy; + + if (destroy !== undefined && typeof destroy !== 'function') { + var addendum = void 0; + + if (destroy === null) { + addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).'; + } else if (typeof destroy.then === 'function') { + addendum = '\n\nIt looks like you wrote useEffect(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + 'useEffect(() => {\n' + ' async function fetchData() {\n' + ' // You can await here\n' + ' const response = await MyAPI.getData(someId);\n' + ' // ...\n' + ' }\n' + ' fetchData();\n' + "}, [someId]); // Or [] if effect doesn't need props or state\n\n" + 'Learn more about data fetching with Hooks: https://reactjs.org/link/hooks-data-fetching'; + } else { + addendum = ' You returned: ' + destroy; + } + + error('An effect function must not return anything besides a function, ' + 'which is used for clean-up.%s', addendum); + } + } + } + + effect = effect.next; + } while (effect !== firstEffect); + } +} + +function schedulePassiveEffects(finishedWork) { + var updateQueue = finishedWork.updateQueue; + var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + var _effect = effect, + next = _effect.next, + tag = _effect.tag; + + if ((tag & Passive$1) !== NoFlags$1 && (tag & HasEffect) !== NoFlags$1) { + enqueuePendingPassiveHookEffectUnmount(finishedWork, effect); + enqueuePendingPassiveHookEffectMount(finishedWork, effect); + } + + effect = next; + } while (effect !== firstEffect); + } +} + +function commitLifeCycles(finishedRoot, current, finishedWork, committedLanes) { + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + case Block: + { + // At this point layout effects have already been destroyed (during mutation phase). + // This is done to prevent sibling component effects from interfering with each other, + // e.g. a destroy function in one component should never override a ref set + // by a create function in another component during the same commit. + { + commitHookEffectListMount(Layout | HasEffect, finishedWork); + } + + schedulePassiveEffects(finishedWork); + return; + } + + case ClassComponent: + { + var instance = finishedWork.stateNode; + + if (finishedWork.flags & Update) { + if (current === null) { + // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'componentDidMount. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } + + { + instance.componentDidMount(); + } + } else { + var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps); + var prevState = current.memoizedState; // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'componentDidUpdate. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } + + { + instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate); + } + } + } // TODO: I think this is now always non-null by the time it reaches the + // commit phase. Consider removing the type check. + + + var updateQueue = finishedWork.updateQueue; + + if (updateQueue !== null) { + { + if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) { + if (instance.props !== finishedWork.memoizedProps) { + error('Expected %s props to match memoized props before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.props`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + + if (instance.state !== finishedWork.memoizedState) { + error('Expected %s state to match memoized state before ' + 'processing the update queue. ' + 'This might either be because of a bug in React, or because ' + 'a component reassigns its own `this.state`. ' + 'Please file an issue.', getComponentName(finishedWork.type) || 'instance'); + } + } + } // We could update instance props and state here, + // but instead we rely on them being set during last render. + // TODO: revisit this when we implement resuming. + + + commitUpdateQueue(finishedWork, updateQueue, instance); + } + + return; + } + + case HostRoot: + { + // TODO: I think this is now always non-null by the time it reaches the + // commit phase. Consider removing the type check. + var _updateQueue = finishedWork.updateQueue; + + if (_updateQueue !== null) { + var _instance = null; + + if (finishedWork.child !== null) { + switch (finishedWork.child.tag) { + case HostComponent: + _instance = getPublicInstance(finishedWork.child.stateNode); + break; + + case ClassComponent: + _instance = finishedWork.child.stateNode; + break; + } + } + + commitUpdateQueue(finishedWork, _updateQueue, _instance); + } + + return; + } + + case HostComponent: + { + var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted + // (eg DOM renderer may schedule auto-focus for inputs and form controls). + // These effects should only be committed when components are first mounted, + // aka when there is no current/alternate. + + if (current === null && finishedWork.flags & Update) { + var type = finishedWork.type; + var props = finishedWork.memoizedProps; + commitMount(_instance2, type, props); + } + + return; + } + + case HostText: + { + // We have no life-cycles associated with text. + return; + } + + case HostPortal: + { + // We have no life-cycles associated with portals. + return; + } + + case Profiler: + { + { + var _finishedWork$memoize2 = finishedWork.memoizedProps, + onCommit = _finishedWork$memoize2.onCommit, + onRender = _finishedWork$memoize2.onRender; + var effectDuration = finishedWork.stateNode.effectDuration; + var commitTime = getCommitTime(); + + if (typeof onRender === 'function') { + { + onRender(finishedWork.memoizedProps.id, current === null ? 'mount' : 'update', finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime, finishedRoot.memoizedInteractions); + } + } + } + + return; + } + + case SuspenseComponent: + { + commitSuspenseHydrationCallbacks(finishedRoot, finishedWork); + return; + } + + case SuspenseListComponent: + case IncompleteClassComponent: + case FundamentalComponent: + case ScopeComponent: + case OffscreenComponent: + case LegacyHiddenComponent: + return; + } + + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function hideOrUnhideAllChildren(finishedWork, isHidden) { + { + // We only have the top Fiber that was inserted but we need to recurse down its + // children to find all the terminal nodes. + var node = finishedWork; + + while (true) { + if (node.tag === HostComponent) { + var instance = node.stateNode; + + if (isHidden) { + hideInstance(instance); + } else { + unhideInstance(node.stateNode, node.memoizedProps); + } + } else if (node.tag === HostText) { + var _instance3 = node.stateNode; + + if (isHidden) { + hideTextInstance(_instance3); + } else { + unhideTextInstance(_instance3, node.memoizedProps); + } + } else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork) ; else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === finishedWork) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === finishedWork) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + } +} + +function commitAttachRef(finishedWork) { + var ref = finishedWork.ref; + + if (ref !== null) { + var instance = finishedWork.stateNode; + var instanceToUse; + + switch (finishedWork.tag) { + case HostComponent: + instanceToUse = getPublicInstance(instance); + break; + + default: + instanceToUse = instance; + } // Moved outside to ensure DCE works with this flag + + if (typeof ref === 'function') { + ref(instanceToUse); + } else { + { + if (!ref.hasOwnProperty('current')) { + error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().', getComponentName(finishedWork.type)); + } + } + + ref.current = instanceToUse; + } + } +} + +function commitDetachRef(current) { + var currentRef = current.ref; + + if (currentRef !== null) { + if (typeof currentRef === 'function') { + currentRef(null); + } else { + currentRef.current = null; + } + } +} // User-originating errors (lifecycles and refs) should not interrupt +// deletion, so don't let them throw. Host-originating errors should +// interrupt deletion, so it's okay + + +function commitUnmount(finishedRoot, current, renderPriorityLevel) { + onCommitUnmount(current); + + switch (current.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: + case Block: + { + var updateQueue = current.updateQueue; + + if (updateQueue !== null) { + var lastEffect = updateQueue.lastEffect; + + if (lastEffect !== null) { + var firstEffect = lastEffect.next; + var effect = firstEffect; + + do { + var _effect2 = effect, + destroy = _effect2.destroy, + tag = _effect2.tag; + + if (destroy !== undefined) { + if ((tag & Passive$1) !== NoFlags$1) { + enqueuePendingPassiveHookEffectUnmount(current, effect); + } else { + { + safelyCallDestroy(current, destroy); + } + } + } + + effect = effect.next; + } while (effect !== firstEffect); + } + } + + return; + } + + case ClassComponent: + { + safelyDetachRef(current); + var instance = current.stateNode; + + if (typeof instance.componentWillUnmount === 'function') { + safelyCallComponentWillUnmount(current, instance); + } + + return; + } + + case HostComponent: + { + safelyDetachRef(current); + return; + } + + case HostPortal: + { + // TODO: this is recursive. + // We are also not using this parent because + // the portal will get pushed immediately. + { + unmountHostComponents(finishedRoot, current); + } + + return; + } + + case FundamentalComponent: + { + + return; + } + + case DehydratedFragment: + { + + return; + } + + case ScopeComponent: + { + + return; + } + } +} + +function commitNestedUnmounts(finishedRoot, root, renderPriorityLevel) { + // While we're inside a removed host node we don't want to call + // removeChild on the inner nodes because they're removed by the top + // call anyway. We also want to call componentWillUnmount on all + // composites before this host node is removed from the tree. Therefore + // we do an inner loop while we're still inside the host node. + var node = root; + + while (true) { + commitUnmount(finishedRoot, node); // Visit children because they may contain more composite or host nodes. + // Skip portals because commitUnmount() currently visits them recursively. + + if (node.child !== null && ( // If we use mutation we drill down into portals using commitUnmount above. + // If we don't use mutation we drill down into portals here instead. + node.tag !== HostPortal)) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === root) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === root) { + return; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } +} + +function detachFiberMutation(fiber) { + // Cut off the return pointers to disconnect it from the tree. Ideally, we + // should clear the child pointer of the parent alternate to let this + // get GC:ed but we don't know which for sure which parent is the current + // one so we'll settle for GC:ing the subtree of this child. This child + // itself will be GC:ed when the parent updates the next time. + // Note: we cannot null out sibling here, otherwise it can cause issues + // with findDOMNode and how it requires the sibling field to carry out + // traversal in a later effect. See PR #16820. We now clear the sibling + // field after effects, see: detachFiberAfterEffects. + // + // Don't disconnect stateNode now; it will be detached in detachFiberAfterEffects. + // It may be required if the current component is an error boundary, + // and one of its descendants throws while unmounting a passive effect. + fiber.alternate = null; + fiber.child = null; + fiber.dependencies = null; + fiber.firstEffect = null; + fiber.lastEffect = null; + fiber.memoizedProps = null; + fiber.memoizedState = null; + fiber.pendingProps = null; + fiber.return = null; + fiber.updateQueue = null; + + { + fiber._debugOwner = null; + } +} + +function getHostParentFiber(fiber) { + var parent = fiber.return; + + while (parent !== null) { + if (isHostParent(parent)) { + return parent; + } + + parent = parent.return; + } + + { + { + throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function isHostParent(fiber) { + return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal; +} + +function getHostSibling(fiber) { + // We're going to search forward into the tree until we find a sibling host + // node. Unfortunately, if multiple insertions are done in a row we have to + // search past them. This leads to exponential search for the next sibling. + // TODO: Find a more efficient way to do this. + var node = fiber; + + siblings: while (true) { + // If we didn't find anything, let's try the next sibling. + while (node.sibling === null) { + if (node.return === null || isHostParent(node.return)) { + // If we pop out of the root or hit the parent the fiber we are the + // last sibling. + return null; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + + while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) { + // If it is not host node and, we might have a host node inside it. + // Try to search down until we find one. + if (node.flags & Placement) { + // If we don't have a child, try the siblings instead. + continue siblings; + } // If we don't have a child, try the siblings instead. + // We also skip portals because they are not part of this host tree. + + + if (node.child === null || node.tag === HostPortal) { + continue siblings; + } else { + node.child.return = node; + node = node.child; + } + } // Check if this host node is stable or about to be placed. + + + if (!(node.flags & Placement)) { + // Found it! + return node.stateNode; + } + } +} + +function commitPlacement(finishedWork) { + + + var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together. + + var parent; + var isContainer; + var parentStateNode = parentFiber.stateNode; + + switch (parentFiber.tag) { + case HostComponent: + parent = parentStateNode; + isContainer = false; + break; + + case HostRoot: + parent = parentStateNode.containerInfo; + isContainer = true; + break; + + case HostPortal: + parent = parentStateNode.containerInfo; + isContainer = true; + break; + + case FundamentalComponent: + + // eslint-disable-next-line-no-fallthrough + + default: + { + { + throw Error( "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + } + + if (parentFiber.flags & ContentReset) { + // Reset the text content of the parent before doing any insertions + resetTextContent(parent); // Clear ContentReset from the effect tag + + parentFiber.flags &= ~ContentReset; + } + + var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its + // children to find all the terminal nodes. + + if (isContainer) { + insertOrAppendPlacementNodeIntoContainer(finishedWork, before, parent); + } else { + insertOrAppendPlacementNode(finishedWork, before, parent); + } +} + +function insertOrAppendPlacementNodeIntoContainer(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; + + if (isHost || enableFundamentalAPI ) { + var stateNode = isHost ? node.stateNode : node.stateNode.instance; + + if (before) { + insertInContainerBefore(parent, stateNode, before); + } else { + appendChildToContainer(parent, stateNode); + } + } else if (tag === HostPortal) ; else { + var child = node.child; + + if (child !== null) { + insertOrAppendPlacementNodeIntoContainer(child, before, parent); + var sibling = child.sibling; + + while (sibling !== null) { + insertOrAppendPlacementNodeIntoContainer(sibling, before, parent); + sibling = sibling.sibling; + } + } + } +} + +function insertOrAppendPlacementNode(node, before, parent) { + var tag = node.tag; + var isHost = tag === HostComponent || tag === HostText; + + if (isHost || enableFundamentalAPI ) { + var stateNode = isHost ? node.stateNode : node.stateNode.instance; + + if (before) { + insertBefore(parent, stateNode, before); + } else { + appendChild(parent, stateNode); + } + } else if (tag === HostPortal) ; else { + var child = node.child; + + if (child !== null) { + insertOrAppendPlacementNode(child, before, parent); + var sibling = child.sibling; + + while (sibling !== null) { + insertOrAppendPlacementNode(sibling, before, parent); + sibling = sibling.sibling; + } + } + } +} + +function unmountHostComponents(finishedRoot, current, renderPriorityLevel) { + // We only have the top Fiber that was deleted but we need to recurse down its + // children to find all the terminal nodes. + var node = current; // Each iteration, currentParent is populated with node's host parent if not + // currentParentIsValid. + + var currentParentIsValid = false; // Note: these two variables *must* always be updated together. + + var currentParent; + var currentParentIsContainer; + + while (true) { + if (!currentParentIsValid) { + var parent = node.return; + + findParent: while (true) { + if (!(parent !== null)) { + { + throw Error( "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var parentStateNode = parent.stateNode; + + switch (parent.tag) { + case HostComponent: + currentParent = parentStateNode; + currentParentIsContainer = false; + break findParent; + + case HostRoot: + currentParent = parentStateNode.containerInfo; + currentParentIsContainer = true; + break findParent; + + case HostPortal: + currentParent = parentStateNode.containerInfo; + currentParentIsContainer = true; + break findParent; + + } + + parent = parent.return; + } + + currentParentIsValid = true; + } + + if (node.tag === HostComponent || node.tag === HostText) { + commitNestedUnmounts(finishedRoot, node); // After all the children have unmounted, it is now safe to remove the + // node from the tree. + + if (currentParentIsContainer) { + removeChildFromContainer(currentParent, node.stateNode); + } else { + removeChild(currentParent, node.stateNode); + } // Don't visit children because we already visited them. + + } else if (node.tag === HostPortal) { + if (node.child !== null) { + // When we go into a portal, it becomes the parent to remove from. + // We will reassign it back when we pop the portal on the way up. + currentParent = node.stateNode.containerInfo; + currentParentIsContainer = true; // Visit children because portals might contain host components. + + node.child.return = node; + node = node.child; + continue; + } + } else { + commitUnmount(finishedRoot, node); // Visit children because we may find more host components below. + + if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + } + + if (node === current) { + return; + } + + while (node.sibling === null) { + if (node.return === null || node.return === current) { + return; + } + + node = node.return; + + if (node.tag === HostPortal) { + // When we go out of the portal, we need to restore the parent. + // Since we don't keep a stack of them, we will search for it. + currentParentIsValid = false; + } + } + + node.sibling.return = node.return; + node = node.sibling; + } +} + +function commitDeletion(finishedRoot, current, renderPriorityLevel) { + { + // Recursively delete all host nodes from the parent. + // Detach refs and call componentWillUnmount() on the whole subtree. + unmountHostComponents(finishedRoot, current); + } + + var alternate = current.alternate; + detachFiberMutation(current); + + if (alternate !== null) { + detachFiberMutation(alternate); + } +} + +function commitWork(current, finishedWork) { + + switch (finishedWork.tag) { + case FunctionComponent: + case ForwardRef: + case MemoComponent: + case SimpleMemoComponent: + case Block: + { + // Layout effects are destroyed during the mutation phase so that all + // destroy functions for all fibers are called before any create functions. + // This prevents sibling component effects from interfering with each other, + // e.g. a destroy function in one component should never override a ref set + // by a create function in another component during the same commit. + { + commitHookEffectListUnmount(Layout | HasEffect, finishedWork); + } + + return; + } + + case ClassComponent: + { + return; + } + + case HostComponent: + { + var instance = finishedWork.stateNode; + + if (instance != null) { + // Commit the work prepared earlier. + var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps + // as the newProps. The updatePayload will contain the real change in + // this case. + + var oldProps = current !== null ? current.memoizedProps : newProps; + var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components. + + var updatePayload = finishedWork.updateQueue; + finishedWork.updateQueue = null; + + if (updatePayload !== null) { + commitUpdate(instance, updatePayload, type, oldProps, newProps); + } + } + + return; + } + + case HostText: + { + if (!(finishedWork.stateNode !== null)) { + { + throw Error( "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue." ); + } + } + + var textInstance = finishedWork.stateNode; + var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps + // as the newProps. The updatePayload will contain the real change in + // this case. + + var oldText = current !== null ? current.memoizedProps : newText; + commitTextUpdate(textInstance, oldText, newText); + return; + } + + case HostRoot: + { + { + var _root = finishedWork.stateNode; + + if (_root.hydrate) { + // We've just hydrated. No need to hydrate again. + _root.hydrate = false; + commitHydratedContainer(_root.containerInfo); + } + } + + return; + } + + case Profiler: + { + return; + } + + case SuspenseComponent: + { + commitSuspenseComponent(finishedWork); + attachSuspenseRetryListeners(finishedWork); + return; + } + + case SuspenseListComponent: + { + attachSuspenseRetryListeners(finishedWork); + return; + } + + case IncompleteClassComponent: + { + return; + } + + case FundamentalComponent: + { + + break; + } + + case ScopeComponent: + { + + break; + } + + case OffscreenComponent: + case LegacyHiddenComponent: + { + var newState = finishedWork.memoizedState; + var isHidden = newState !== null; + hideOrUnhideAllChildren(finishedWork, isHidden); + return; + } + } + + { + { + throw Error( "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue." ); + } + } +} + +function commitSuspenseComponent(finishedWork) { + var newState = finishedWork.memoizedState; + + if (newState !== null) { + markCommitTimeOfFallback(); + + { + // Hide the Offscreen component that contains the primary children. TODO: + // Ideally, this effect would have been scheduled on the Offscreen fiber + // itself. That's how unhiding works: the Offscreen component schedules an + // effect on itself. However, in this case, the component didn't complete, + // so the fiber was never added to the effect list in the normal path. We + // could have appended it to the effect list in the Suspense component's + // second pass, but doing it this way is less complicated. This would be + // simpler if we got rid of the effect list and traversed the tree, like + // we're planning to do. + var primaryChildParent = finishedWork.child; + hideOrUnhideAllChildren(primaryChildParent, true); + } + } +} + +function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) { + + var newState = finishedWork.memoizedState; + + if (newState === null) { + var current = finishedWork.alternate; + + if (current !== null) { + var prevState = current.memoizedState; + + if (prevState !== null) { + var suspenseInstance = prevState.dehydrated; + + if (suspenseInstance !== null) { + commitHydratedSuspenseInstance(suspenseInstance); + } + } + } + } +} + +function attachSuspenseRetryListeners(finishedWork) { + // If this boundary just timed out, then it will have a set of wakeables. + // For each wakeable, attach a listener so that when it resolves, React + // attempts to re-render the boundary in the primary (pre-timeout) state. + var wakeables = finishedWork.updateQueue; + + if (wakeables !== null) { + finishedWork.updateQueue = null; + var retryCache = finishedWork.stateNode; + + if (retryCache === null) { + retryCache = finishedWork.stateNode = new PossiblyWeakSet(); + } + + wakeables.forEach(function (wakeable) { + // Memoize using the boundary fiber to prevent redundant listeners. + var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable); + + if (!retryCache.has(wakeable)) { + { + if (wakeable.__reactDoNotTraceInteractions !== true) { + retry = tracing.unstable_wrap(retry); + } + } + + retryCache.add(wakeable); + wakeable.then(retry, retry); + } + }); + } +} // This function detects when a Suspense boundary goes from visible to hidden. +// It returns false if the boundary is already hidden. +// TODO: Use an effect tag. + + +function isSuspenseBoundaryBeingHidden(current, finishedWork) { + if (current !== null) { + var oldState = current.memoizedState; + + if (oldState === null || oldState.dehydrated !== null) { + var newState = finishedWork.memoizedState; + return newState !== null && newState.dehydrated === null; + } + } + + return false; +} + +function commitResetTextContent(current) { + + resetTextContent(current.stateNode); +} + +var COMPONENT_TYPE = 0; +var HAS_PSEUDO_CLASS_TYPE = 1; +var ROLE_TYPE = 2; +var TEST_NAME_TYPE = 3; +var TEXT_TYPE = 4; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor$1 = Symbol.for; + COMPONENT_TYPE = symbolFor$1('selector.component'); + HAS_PSEUDO_CLASS_TYPE = symbolFor$1('selector.has_pseudo_class'); + ROLE_TYPE = symbolFor$1('selector.role'); + TEST_NAME_TYPE = symbolFor$1('selector.test_id'); + TEXT_TYPE = symbolFor$1('selector.text'); +} +var commitHooks = []; +function onCommitRoot$1() { + { + commitHooks.forEach(function (commitHook) { + return commitHook(); + }); + } +} + +var ceil = Math.ceil; +var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher, + ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner, + IsSomeRendererActing = ReactSharedInternals.IsSomeRendererActing; +var NoContext = +/* */ +0; +var BatchedContext = +/* */ +1; +var EventContext = +/* */ +2; +var DiscreteEventContext = +/* */ +4; +var LegacyUnbatchedContext = +/* */ +8; +var RenderContext = +/* */ +16; +var CommitContext = +/* */ +32; +var RetryAfterError = +/* */ +64; +var RootIncomplete = 0; +var RootFatalErrored = 1; +var RootErrored = 2; +var RootSuspended = 3; +var RootSuspendedWithDelay = 4; +var RootCompleted = 5; // Describes where we are in the React execution stack + +var executionContext = NoContext; // The root we're working on + +var workInProgressRoot = null; // The fiber we're working on + +var workInProgress = null; // The lanes we're rendering + +var workInProgressRootRenderLanes = NoLanes; // Stack that allows components to change the render lanes for its subtree +// This is a superset of the lanes we started working on at the root. The only +// case where it's different from `workInProgressRootRenderLanes` is when we +// enter a subtree that is hidden and needs to be unhidden: Suspense and +// Offscreen component. +// +// Most things in the work loop should deal with workInProgressRootRenderLanes. +// Most things in begin/complete phases should deal with subtreeRenderLanes. + +var subtreeRenderLanes = NoLanes; +var subtreeRenderLanesCursor = createCursor(NoLanes); // Whether to root completed, errored, suspended, etc. + +var workInProgressRootExitStatus = RootIncomplete; // A fatal error, if one is thrown + +var workInProgressRootFatalError = null; // "Included" lanes refer to lanes that were worked on during this render. It's +// slightly different than `renderLanes` because `renderLanes` can change as you +// enter and exit an Offscreen tree. This value is the combination of all render +// lanes for the entire render phase. + +var workInProgressRootIncludedLanes = NoLanes; // The work left over by components that were visited during this render. Only +// includes unprocessed updates, not work in bailed out children. + +var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render. + +var workInProgressRootUpdatedLanes = NoLanes; // Lanes that were pinged (in an interleaved event) during this render. + +var workInProgressRootPingedLanes = NoLanes; +var mostRecentlyUpdatedRoot = null; // The most recent time we committed a fallback. This lets us ensure a train +// model where we don't commit new loading states in too quick succession. + +var globalMostRecentFallbackTime = 0; +var FALLBACK_THROTTLE_MS = 500; // The absolute time for when we should start giving up on rendering +// more and prefer CPU suspense heuristics instead. + +var workInProgressRootRenderTargetTime = Infinity; // How long a render is supposed to take before we start following CPU +// suspense heuristics and opt out of rendering more content. + +var RENDER_TIMEOUT_MS = 500; + +function resetRenderTimer() { + workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS; +} + +function getRenderTargetTime() { + return workInProgressRootRenderTargetTime; +} +var nextEffect = null; +var hasUncaughtError = false; +var firstUncaughtError = null; +var legacyErrorBoundariesThatAlreadyFailed = null; +var rootDoesHavePassiveEffects = false; +var rootWithPendingPassiveEffects = null; +var pendingPassiveEffectsRenderPriority = NoPriority$1; +var pendingPassiveEffectsLanes = NoLanes; +var pendingPassiveHookEffectsMount = []; +var pendingPassiveHookEffectsUnmount = []; +var rootsWithPendingDiscreteUpdates = null; // Use these to prevent an infinite loop of nested updates + +var NESTED_UPDATE_LIMIT = 50; +var nestedUpdateCount = 0; +var rootWithNestedUpdates = null; +var NESTED_PASSIVE_UPDATE_LIMIT = 50; +var nestedPassiveUpdateCount = 0; // Marks the need to reschedule pending interactions at these lanes +// during the commit phase. This enables them to be traced across components +// that spawn new work during render. E.g. hidden boundaries, suspended SSR +// hydration or SuspenseList. +// TODO: Can use a bitmask instead of an array + +var spawnedWorkDuringRender = null; // If two updates are scheduled within the same event, we should treat their +// event times as simultaneous, even if the actual clock time has advanced +// between the first and second call. + +var currentEventTime = NoTimestamp; +var currentEventWipLanes = NoLanes; +var currentEventPendingLanes = NoLanes; // Dev only flag that tracks if passive effects are currently being flushed. +// We warn about state updates for unmounted components differently in this case. + +var isFlushingPassiveEffects = false; +var focusedInstanceHandle = null; +var shouldFireAfterActiveInstanceBlur = false; +function getWorkInProgressRoot() { + return workInProgressRoot; +} +function requestEventTime() { + if ((executionContext & (RenderContext | CommitContext)) !== NoContext) { + // We're inside React, so it's fine to read the actual time. + return now(); + } // We're not inside React, so we may be in the middle of a browser event. + + + if (currentEventTime !== NoTimestamp) { + // Use the same start time for all updates until we enter React again. + return currentEventTime; + } // This is the first update since React yielded. Compute a new start time. + + + currentEventTime = now(); + return currentEventTime; +} +function requestUpdateLane(fiber) { + // Special cases + var mode = fiber.mode; + + if ((mode & BlockingMode) === NoMode) { + return SyncLane; + } else if ((mode & ConcurrentMode) === NoMode) { + return getCurrentPriorityLevel() === ImmediatePriority$1 ? SyncLane : SyncBatchedLane; + } // The algorithm for assigning an update to a lane should be stable for all + // updates at the same priority within the same event. To do this, the inputs + // to the algorithm must be the same. For example, we use the `renderLanes` + // to avoid choosing a lane that is already in the middle of rendering. + // + // However, the "included" lanes could be mutated in between updates in the + // same event, like if you perform an update inside `flushSync`. Or any other + // code path that might call `prepareFreshStack`. + // + // The trick we use is to cache the first of each of these inputs within an + // event. Then reset the cached values once we can be sure the event is over. + // Our heuristic for that is whenever we enter a concurrent work loop. + // + // We'll do the same for `currentEventPendingLanes` below. + + + if (currentEventWipLanes === NoLanes) { + currentEventWipLanes = workInProgressRootIncludedLanes; + } + + var isTransition = requestCurrentTransition() !== NoTransition; + + if (isTransition) { + if (currentEventPendingLanes !== NoLanes) { + currentEventPendingLanes = mostRecentlyUpdatedRoot !== null ? mostRecentlyUpdatedRoot.pendingLanes : NoLanes; + } + + return findTransitionLane(currentEventWipLanes, currentEventPendingLanes); + } // TODO: Remove this dependency on the Scheduler priority. + // To do that, we're replacing it with an update lane priority. + + + var schedulerPriority = getCurrentPriorityLevel(); // The old behavior was using the priority level of the Scheduler. + // This couples React to the Scheduler internals, so we're replacing it + // with the currentUpdateLanePriority above. As an example of how this + // could be problematic, if we're not inside `Scheduler.runWithPriority`, + // then we'll get the priority of the current running Scheduler task, + // which is probably not what we want. + + var lane; + + if ( // TODO: Temporary. We're removing the concept of discrete updates. + (executionContext & DiscreteEventContext) !== NoContext && schedulerPriority === UserBlockingPriority$2) { + lane = findUpdateLane(InputDiscreteLanePriority, currentEventWipLanes); + } else { + var schedulerLanePriority = schedulerPriorityToLanePriority(schedulerPriority); + + lane = findUpdateLane(schedulerLanePriority, currentEventWipLanes); + } + + return lane; +} + +function requestRetryLane(fiber) { + // This is a fork of `requestUpdateLane` designed specifically for Suspense + // "retries" — a special update that attempts to flip a Suspense boundary + // from its placeholder state to its primary/resolved state. + // Special cases + var mode = fiber.mode; + + if ((mode & BlockingMode) === NoMode) { + return SyncLane; + } else if ((mode & ConcurrentMode) === NoMode) { + return getCurrentPriorityLevel() === ImmediatePriority$1 ? SyncLane : SyncBatchedLane; + } // See `requestUpdateLane` for explanation of `currentEventWipLanes` + + + if (currentEventWipLanes === NoLanes) { + currentEventWipLanes = workInProgressRootIncludedLanes; + } + + return findRetryLane(currentEventWipLanes); +} + +function scheduleUpdateOnFiber(fiber, lane, eventTime) { + checkForNestedUpdates(); + warnAboutRenderPhaseUpdatesInDEV(fiber); + var root = markUpdateLaneFromFiberToRoot(fiber, lane); + + if (root === null) { + warnAboutUpdateOnUnmountedFiberInDEV(fiber); + return null; + } // Mark that the root has a pending update. + + + markRootUpdated(root, lane, eventTime); + + if (root === workInProgressRoot) { + // Received an update to a tree that's in the middle of rendering. Mark + // that there was an interleaved update work on this root. Unless the + // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render + // phase update. In that case, we don't treat render phase updates as if + // they were interleaved, for backwards compat reasons. + { + workInProgressRootUpdatedLanes = mergeLanes(workInProgressRootUpdatedLanes, lane); + } + + if (workInProgressRootExitStatus === RootSuspendedWithDelay) { + // The root already suspended with a delay, which means this render + // definitely won't finish. Since we have a new update, let's mark it as + // suspended now, right before marking the incoming update. This has the + // effect of interrupting the current render and switching to the update. + // TODO: Make sure this doesn't override pings that happen while we've + // already started rendering. + markRootSuspended$1(root, workInProgressRootRenderLanes); + } + } // TODO: requestUpdateLanePriority also reads the priority. Pass the + // priority as an argument to that function and this one. + + + var priorityLevel = getCurrentPriorityLevel(); + + if (lane === SyncLane) { + if ( // Check if we're inside unbatchedUpdates + (executionContext & LegacyUnbatchedContext) !== NoContext && // Check if we're not already rendering + (executionContext & (RenderContext | CommitContext)) === NoContext) { + // Register pending interactions on the root to avoid losing traced interaction data. + schedulePendingInteractions(root, lane); // This is a legacy edge case. The initial mount of a ReactDOM.render-ed + // root inside of batchedUpdates should be synchronous, but layout updates + // should be deferred until the end of the batch. + + performSyncWorkOnRoot(root); + } else { + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, lane); + + if (executionContext === NoContext) { + // Flush the synchronous work now, unless we're already working or inside + // a batch. This is intentionally inside scheduleUpdateOnFiber instead of + // scheduleCallbackForFiber to preserve the ability to schedule a callback + // without immediately flushing it. We only do this for user-initiated + // updates, to preserve historical behavior of legacy mode. + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } + } else { + // Schedule a discrete update but only if it's not Sync. + if ((executionContext & DiscreteEventContext) !== NoContext && ( // Only updates at user-blocking priority or greater are considered + // discrete, even inside a discrete event. + priorityLevel === UserBlockingPriority$2 || priorityLevel === ImmediatePriority$1)) { + // This is the result of a discrete event. Track the lowest priority + // discrete update per root so we can flush them early, if needed. + if (rootsWithPendingDiscreteUpdates === null) { + rootsWithPendingDiscreteUpdates = new Set([root]); + } else { + rootsWithPendingDiscreteUpdates.add(root); + } + } // Schedule other updates after in case the callback is sync. + + + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, lane); + } // We use this when assigning a lane for a transition inside + // `requestUpdateLane`. We assume it's the same as the root being updated, + // since in the common case of a single root app it probably is. If it's not + // the same root, then it's not a huge deal, we just might batch more stuff + // together more than necessary. + + + mostRecentlyUpdatedRoot = root; +} // This is split into a separate function so we can mark a fiber with pending +// work without treating it as a typical update that originates from an event; +// e.g. retrying a Suspense boundary isn't an update, but it does schedule work +// on a fiber. + +function markUpdateLaneFromFiberToRoot(sourceFiber, lane) { + // Update the source fiber's lanes + sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane); + var alternate = sourceFiber.alternate; + + if (alternate !== null) { + alternate.lanes = mergeLanes(alternate.lanes, lane); + } + + { + if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) { + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); + } + } // Walk the parent path to the root and update the child expiration time. + + + var node = sourceFiber; + var parent = sourceFiber.return; + + while (parent !== null) { + parent.childLanes = mergeLanes(parent.childLanes, lane); + alternate = parent.alternate; + + if (alternate !== null) { + alternate.childLanes = mergeLanes(alternate.childLanes, lane); + } else { + { + if ((parent.flags & (Placement | Hydrating)) !== NoFlags) { + warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber); + } + } + } + + node = parent; + parent = parent.return; + } + + if (node.tag === HostRoot) { + var root = node.stateNode; + return root; + } else { + return null; + } +} // Use this function to schedule a task for a root. There's only one task per +// root; if a task was already scheduled, we'll check to make sure the priority +// of the existing task is the same as the priority of the next level that the +// root has work on. This function is called on every update, and right before +// exiting a task. + + +function ensureRootIsScheduled(root, currentTime) { + var existingCallbackNode = root.callbackNode; // Check if any lanes are being starved by other work. If so, mark them as + // expired so we know to work on those next. + + markStarvedLanesAsExpired(root, currentTime); // Determine the next lanes to work on, and their priority. + + var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); // This returns the priority level computed during the `getNextLanes` call. + + var newCallbackPriority = returnNextLanesPriority(); + + if (nextLanes === NoLanes) { + // Special case: There's nothing to work on. + if (existingCallbackNode !== null) { + cancelCallback(existingCallbackNode); + root.callbackNode = null; + root.callbackPriority = NoLanePriority; + } + + return; + } // Check if there's an existing task. We may be able to reuse it. + + + if (existingCallbackNode !== null) { + var existingCallbackPriority = root.callbackPriority; + + if (existingCallbackPriority === newCallbackPriority) { + // The priority hasn't changed. We can reuse the existing task. Exit. + return; + } // The priority changed. Cancel the existing callback. We'll schedule a new + // one below. + + + cancelCallback(existingCallbackNode); + } // Schedule a new callback. + + + var newCallbackNode; + + if (newCallbackPriority === SyncLanePriority) { + // Special case: Sync React callbacks are scheduled on a special + // internal queue + newCallbackNode = scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root)); + } else if (newCallbackPriority === SyncBatchedLanePriority) { + newCallbackNode = scheduleCallback(ImmediatePriority$1, performSyncWorkOnRoot.bind(null, root)); + } else { + var schedulerPriorityLevel = lanePriorityToSchedulerPriority(newCallbackPriority); + newCallbackNode = scheduleCallback(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root)); + } + + root.callbackPriority = newCallbackPriority; + root.callbackNode = newCallbackNode; +} // This is the entry point for every concurrent task, i.e. anything that +// goes through Scheduler. + + +function performConcurrentWorkOnRoot(root) { + // Since we know we're in a React event, we can clear the current + // event time. The next update will compute a new event time. + currentEventTime = NoTimestamp; + currentEventWipLanes = NoLanes; + currentEventPendingLanes = NoLanes; + + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } // Flush any pending passive effects before deciding which lanes to work on, + // in case they schedule additional work. + + + var originalCallbackNode = root.callbackNode; + var didFlushPassiveEffects = flushPassiveEffects(); + + if (didFlushPassiveEffects) { + // Something in the passive effect phase may have canceled the current task. + // Check if the task node for this root was changed. + if (root.callbackNode !== originalCallbackNode) { + // The current task was canceled. Exit. We don't need to call + // `ensureRootIsScheduled` because the check above implies either that + // there's a new task, or that there's no remaining work on this root. + return null; + } + } // Determine the next expiration time to work on, using the fields stored + // on the root. + + + var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes); + + if (lanes === NoLanes) { + // Defensive coding. This is never expected to happen. + return null; + } + + var exitStatus = renderRootConcurrent(root, lanes); + + if (includesSomeLane(workInProgressRootIncludedLanes, workInProgressRootUpdatedLanes)) { + // The render included lanes that were updated during the render phase. + // For example, when unhiding a hidden tree, we include all the lanes + // that were previously skipped when the tree was hidden. That set of + // lanes is a superset of the lanes we started rendering with. + // + // So we'll throw out the current work and restart. + prepareFreshStack(root, NoLanes); + } else if (exitStatus !== RootIncomplete) { + if (exitStatus === RootErrored) { + executionContext |= RetryAfterError; // If an error occurred during hydration, + // discard server response and fall back to client side render. + + if (root.hydrate) { + root.hydrate = false; + clearContainer(root.containerInfo); + } // If something threw an error, try rendering one more time. We'll render + // synchronously to block concurrent data mutations, and we'll includes + // all pending updates are included. If it still fails after the second + // attempt, we'll give up and commit the resulting tree. + + + lanes = getLanesToRetrySynchronouslyOnError(root); + + if (lanes !== NoLanes) { + exitStatus = renderRootSync(root, lanes); + } + } + + if (exitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw fatalError; + } // We now have a consistent tree. The next step is either to commit it, + // or, if something suspended, wait to commit it after a timeout. + + + var finishedWork = root.current.alternate; + root.finishedWork = finishedWork; + root.finishedLanes = lanes; + finishConcurrentRender(root, exitStatus, lanes); + } + + ensureRootIsScheduled(root, now()); + + if (root.callbackNode === originalCallbackNode) { + // The task node scheduled for this root is the same one that's + // currently executed. Need to return a continuation. + return performConcurrentWorkOnRoot.bind(null, root); + } + + return null; +} + +function finishConcurrentRender(root, exitStatus, lanes) { + switch (exitStatus) { + case RootIncomplete: + case RootFatalErrored: + { + { + { + throw Error( "Root did not complete. This is a bug in React." ); + } + } + } + // Flow knows about invariant, so it complains if I add a break + // statement, but eslint doesn't know about invariant, so it complains + // if I do. eslint-disable-next-line no-fallthrough + + case RootErrored: + { + // We should have already attempted to retry this tree. If we reached + // this point, it errored again. Commit it. + commitRoot(root); + break; + } + + case RootSuspended: + { + markRootSuspended$1(root, lanes); // We have an acceptable loading state. We need to figure out if we + // should immediately commit it or wait a bit. + + if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope + !shouldForceFlushFallbacksInDEV()) { + // This render only included retries, no updates. Throttle committing + // retries so that we don't show too many loading states too quickly. + var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time. + + if (msUntilTimeout > 10) { + var nextLanes = getNextLanes(root, NoLanes); + + if (nextLanes !== NoLanes) { + // There's additional work on this root. + break; + } + + var suspendedLanes = root.suspendedLanes; + + if (!isSubsetOfLanes(suspendedLanes, lanes)) { + // We should prefer to render the fallback of at the last + // suspended level. Ping the last suspended level to try + // rendering it again. + // FIXME: What if the suspended lanes are Idle? Should not restart. + var eventTime = requestEventTime(); + markRootPinged(root, suspendedLanes); + break; + } // The render is suspended, it hasn't timed out, and there's no + // lower priority work to do. Instead of committing the fallback + // immediately, wait for more data to arrive. + + + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), msUntilTimeout); + break; + } + } // The work expired. Commit immediately. + + + commitRoot(root); + break; + } + + case RootSuspendedWithDelay: + { + markRootSuspended$1(root, lanes); + + if (includesOnlyTransitions(lanes)) { + // This is a transition, so we should exit without committing a + // placeholder and without scheduling a timeout. Delay indefinitely + // until we receive more data. + break; + } + + if (!shouldForceFlushFallbacksInDEV()) { + // This is not a transition, but we did trigger an avoided state. + // Schedule a placeholder to display after a short delay, using the Just + // Noticeable Difference. + // TODO: Is the JND optimization worth the added complexity? If this is + // the only reason we track the event time, then probably not. + // Consider removing. + var mostRecentEventTime = getMostRecentEventTime(root, lanes); + var eventTimeMs = mostRecentEventTime; + var timeElapsedMs = now() - eventTimeMs; + + var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; // Don't bother with a very short suspense time. + + + if (_msUntilTimeout > 10) { + // Instead of committing the fallback immediately, wait for more data + // to arrive. + root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root), _msUntilTimeout); + break; + } + } // Commit the placeholder. + + + commitRoot(root); + break; + } + + case RootCompleted: + { + // The work completed. Ready to commit. + commitRoot(root); + break; + } + + default: + { + { + { + throw Error( "Unknown root exit status." ); + } + } + } + } +} + +function markRootSuspended$1(root, suspendedLanes) { + // When suspending, we should always exclude lanes that were pinged or (more + // rarely, since we try to avoid it) updated during the render phase. + // TODO: Lol maybe there's a better way to factor this besides this + // obnoxiously named function :) + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes); + suspendedLanes = removeLanes(suspendedLanes, workInProgressRootUpdatedLanes); + markRootSuspended(root, suspendedLanes); +} // This is the entry point for synchronous tasks that don't go +// through Scheduler + + +function performSyncWorkOnRoot(root) { + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } + + flushPassiveEffects(); + var lanes; + var exitStatus; + + if (root === workInProgressRoot && includesSomeLane(root.expiredLanes, workInProgressRootRenderLanes)) { + // There's a partial tree, and at least one of its lanes has expired. Finish + // rendering it before rendering the rest of the expired work. + lanes = workInProgressRootRenderLanes; + exitStatus = renderRootSync(root, lanes); + + if (includesSomeLane(workInProgressRootIncludedLanes, workInProgressRootUpdatedLanes)) { + // The render included lanes that were updated during the render phase. + // For example, when unhiding a hidden tree, we include all the lanes + // that were previously skipped when the tree was hidden. That set of + // lanes is a superset of the lanes we started rendering with. + // + // Note that this only happens when part of the tree is rendered + // concurrently. If the whole tree is rendered synchronously, then there + // are no interleaved events. + lanes = getNextLanes(root, lanes); + exitStatus = renderRootSync(root, lanes); + } + } else { + lanes = getNextLanes(root, NoLanes); + exitStatus = renderRootSync(root, lanes); + } + + if (root.tag !== LegacyRoot && exitStatus === RootErrored) { + executionContext |= RetryAfterError; // If an error occurred during hydration, + // discard server response and fall back to client side render. + + if (root.hydrate) { + root.hydrate = false; + clearContainer(root.containerInfo); + } // If something threw an error, try rendering one more time. We'll render + // synchronously to block concurrent data mutations, and we'll includes + // all pending updates are included. If it still fails after the second + // attempt, we'll give up and commit the resulting tree. + + + lanes = getLanesToRetrySynchronouslyOnError(root); + + if (lanes !== NoLanes) { + exitStatus = renderRootSync(root, lanes); + } + } + + if (exitStatus === RootFatalErrored) { + var fatalError = workInProgressRootFatalError; + prepareFreshStack(root, NoLanes); + markRootSuspended$1(root, lanes); + ensureRootIsScheduled(root, now()); + throw fatalError; + } // We now have a consistent tree. Because this is a sync render, we + // will commit it even if something suspended. + + + var finishedWork = root.current.alternate; + root.finishedWork = finishedWork; + root.finishedLanes = lanes; + commitRoot(root); // Before exiting, make sure there's a callback scheduled for the next + // pending level. + + ensureRootIsScheduled(root, now()); + return null; +} +function flushDiscreteUpdates() { + // TODO: Should be able to flush inside batchedUpdates, but not inside `act`. + // However, `act` uses `batchedUpdates`, so there's no way to distinguish + // those two cases. Need to fix this before exposing flushDiscreteUpdates + // as a public API. + if ((executionContext & (BatchedContext | RenderContext | CommitContext)) !== NoContext) { + { + if ((executionContext & RenderContext) !== NoContext) { + error('unstable_flushDiscreteUpdates: Cannot flush updates when React is ' + 'already rendering.'); + } + } // We're already rendering, so we can't synchronously flush pending work. + // This is probably a nested event dispatch triggered by a lifecycle/effect, + // like `el.focus()`. Exit. + + + return; + } + + flushPendingDiscreteUpdates(); // If the discrete updates scheduled passive effects, flush them now so that + // they fire before the next serial event. + + flushPassiveEffects(); +} + +function flushPendingDiscreteUpdates() { + if (rootsWithPendingDiscreteUpdates !== null) { + // For each root with pending discrete updates, schedule a callback to + // immediately flush them. + var roots = rootsWithPendingDiscreteUpdates; + rootsWithPendingDiscreteUpdates = null; + roots.forEach(function (root) { + markDiscreteUpdatesExpired(root); + ensureRootIsScheduled(root, now()); + }); + } // Now flush the immediate queue. + + + flushSyncCallbackQueue(); +} + +function batchedUpdates$1(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= BatchedContext; + + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } +} +function batchedEventUpdates$1(fn, a) { + var prevExecutionContext = executionContext; + executionContext |= EventContext; + + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } +} +function discreteUpdates$1(fn, a, b, c, d) { + var prevExecutionContext = executionContext; + executionContext |= DiscreteEventContext; + + { + try { + return runWithPriority$1(UserBlockingPriority$2, fn.bind(null, a, b, c, d)); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } + } +} +function unbatchedUpdates(fn, a) { + var prevExecutionContext = executionContext; + executionContext &= ~BatchedContext; + executionContext |= LegacyUnbatchedContext; + + try { + return fn(a); + } finally { + executionContext = prevExecutionContext; + + if (executionContext === NoContext) { + // Flush the immediate callbacks that were scheduled during this batch + resetRenderTimer(); + flushSyncCallbackQueue(); + } + } +} +function flushSync(fn, a) { + var prevExecutionContext = executionContext; + + if ((prevExecutionContext & (RenderContext | CommitContext)) !== NoContext) { + { + error('flushSync was called from inside a lifecycle method. React cannot ' + 'flush when React is already rendering. Consider moving this call to ' + 'a scheduler task or micro task.'); + } + + return fn(a); + } + + executionContext |= BatchedContext; + + { + try { + if (fn) { + return runWithPriority$1(ImmediatePriority$1, fn.bind(null, a)); + } else { + return undefined; + } + } finally { + executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch. + // Note that this will happen even if batchedUpdates is higher up + // the stack. + + flushSyncCallbackQueue(); + } + } +} +function pushRenderLanes(fiber, lanes) { + push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber); + subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes); + workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes); +} +function popRenderLanes(fiber) { + subtreeRenderLanes = subtreeRenderLanesCursor.current; + pop(subtreeRenderLanesCursor, fiber); +} + +function prepareFreshStack(root, lanes) { + root.finishedWork = null; + root.finishedLanes = NoLanes; + var timeoutHandle = root.timeoutHandle; + + if (timeoutHandle !== noTimeout) { + // The root previous suspended and scheduled a timeout to commit a fallback + // state. Now that we have additional work, cancel the timeout. + root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above + + cancelTimeout(timeoutHandle); + } + + if (workInProgress !== null) { + var interruptedWork = workInProgress.return; + + while (interruptedWork !== null) { + unwindInterruptedWork(interruptedWork); + interruptedWork = interruptedWork.return; + } + } + + workInProgressRoot = root; + workInProgress = createWorkInProgress(root.current, null); + workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes; + workInProgressRootExitStatus = RootIncomplete; + workInProgressRootFatalError = null; + workInProgressRootSkippedLanes = NoLanes; + workInProgressRootUpdatedLanes = NoLanes; + workInProgressRootPingedLanes = NoLanes; + + { + spawnedWorkDuringRender = null; + } + + { + ReactStrictModeWarnings.discardPendingWarnings(); + } +} + +function handleError(root, thrownValue) { + do { + var erroredWork = workInProgress; + + try { + // Reset module-level state that was set during the render phase. + resetContextDependencies(); + resetHooksAfterThrow(); + resetCurrentFiber(); // TODO: I found and added this missing line while investigating a + // separate issue. Write a regression test using string refs. + + ReactCurrentOwner$2.current = null; + + if (erroredWork === null || erroredWork.return === null) { + // Expected to be working on a non-root fiber. This is a fatal error + // because there's no ancestor that can handle it; the root is + // supposed to capture all errors that weren't caught by an error + // boundary. + workInProgressRootExitStatus = RootFatalErrored; + workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next + // sibling, or the parent if there are no siblings. But since the root + // has no siblings nor a parent, we set it to null. Usually this is + // handled by `completeUnitOfWork` or `unwindWork`, but since we're + // intentionally not calling those, we need set it here. + // TODO: Consider calling `unwindWork` to pop the contexts. + + workInProgress = null; + return; + } + + if (enableProfilerTimer && erroredWork.mode & ProfileMode) { + // Record the time spent rendering before an error was thrown. This + // avoids inaccurate Profiler durations in the case of a + // suspended render. + stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true); + } + + throwException(root, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes); + completeUnitOfWork(erroredWork); + } catch (yetAnotherThrownValue) { + // Something in the return path also threw. + thrownValue = yetAnotherThrownValue; + + if (workInProgress === erroredWork && erroredWork !== null) { + // If this boundary has already errored, then we had trouble processing + // the error. Bubble it to the next boundary. + erroredWork = erroredWork.return; + workInProgress = erroredWork; + } else { + erroredWork = workInProgress; + } + + continue; + } // Return to the normal work loop. + + + return; + } while (true); +} + +function pushDispatcher() { + var prevDispatcher = ReactCurrentDispatcher$2.current; + ReactCurrentDispatcher$2.current = ContextOnlyDispatcher; + + if (prevDispatcher === null) { + // The React isomorphic package does not include a default dispatcher. + // Instead the first renderer will lazily attach one, in order to give + // nicer error messages. + return ContextOnlyDispatcher; + } else { + return prevDispatcher; + } +} + +function popDispatcher(prevDispatcher) { + ReactCurrentDispatcher$2.current = prevDispatcher; +} + +function pushInteractions(root) { + { + var prevInteractions = tracing.__interactionsRef.current; + tracing.__interactionsRef.current = root.memoizedInteractions; + return prevInteractions; + } +} + +function popInteractions(prevInteractions) { + { + tracing.__interactionsRef.current = prevInteractions; + } +} + +function markCommitTimeOfFallback() { + globalMostRecentFallbackTime = now(); +} +function markSkippedUpdateLanes(lane) { + workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes); +} +function renderDidSuspend() { + if (workInProgressRootExitStatus === RootIncomplete) { + workInProgressRootExitStatus = RootSuspended; + } +} +function renderDidSuspendDelayIfPossible() { + if (workInProgressRootExitStatus === RootIncomplete || workInProgressRootExitStatus === RootSuspended) { + workInProgressRootExitStatus = RootSuspendedWithDelay; + } // Check if there are updates that we skipped tree that might have unblocked + // this render. + + + if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootUpdatedLanes))) { + // Mark the current render as suspended so that we switch to working on + // the updates that were skipped. Usually we only suspend at the end of + // the render phase. + // TODO: We should probably always mark the root as suspended immediately + // (inside this function), since by suspending at the end of the render + // phase introduces a potential mistake where we suspend lanes that were + // pinged or updated while we were rendering. + markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes); + } +} +function renderDidError() { + if (workInProgressRootExitStatus !== RootCompleted) { + workInProgressRootExitStatus = RootErrored; + } +} // Called during render to determine if anything has suspended. +// Returns false if we're not sure. + +function renderHasNotSuspendedYet() { + // If something errored or completed, we can't really be sure, + // so those are false. + return workInProgressRootExitStatus === RootIncomplete; +} + +function renderRootSync(root, lanes) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack + // and prepare a fresh one. Otherwise we'll continue where we left off. + + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { + prepareFreshStack(root, lanes); + startWorkOnPendingInteractions(root, lanes); + } + + var prevInteractions = pushInteractions(root); + + do { + try { + workLoopSync(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); + + resetContextDependencies(); + + { + popInteractions(prevInteractions); + } + + executionContext = prevExecutionContext; + popDispatcher(prevDispatcher); + + if (workInProgress !== null) { + // This is a sync render, so we should have finished the whole tree. + { + { + throw Error( "Cannot commit an incomplete root. This error is likely caused by a bug in React. Please file an issue." ); + } + } + } + + + workInProgressRoot = null; + workInProgressRootRenderLanes = NoLanes; + return workInProgressRootExitStatus; +} // The work loop is an extremely hot path. Tell Closure not to inline it. + +/** @noinline */ + + +function workLoopSync() { + // Already timed out, so perform work without checking if we need to yield. + while (workInProgress !== null) { + performUnitOfWork(workInProgress); + } +} + +function renderRootConcurrent(root, lanes) { + var prevExecutionContext = executionContext; + executionContext |= RenderContext; + var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack + // and prepare a fresh one. Otherwise we'll continue where we left off. + + if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) { + resetRenderTimer(); + prepareFreshStack(root, lanes); + startWorkOnPendingInteractions(root, lanes); + } + + var prevInteractions = pushInteractions(root); + + do { + try { + workLoopConcurrent(); + break; + } catch (thrownValue) { + handleError(root, thrownValue); + } + } while (true); + + resetContextDependencies(); + + { + popInteractions(prevInteractions); + } + + popDispatcher(prevDispatcher); + executionContext = prevExecutionContext; + + + if (workInProgress !== null) { + + return RootIncomplete; + } else { + + + workInProgressRoot = null; + workInProgressRootRenderLanes = NoLanes; // Return the final exit status. + + return workInProgressRootExitStatus; + } +} +/** @noinline */ + + +function workLoopConcurrent() { + // Perform work until Scheduler asks us to yield + while (workInProgress !== null && !shouldYield()) { + performUnitOfWork(workInProgress); + } +} + +function performUnitOfWork(unitOfWork) { + // The current, flushed, state of this fiber is the alternate. Ideally + // nothing should rely on this, but relying on it here means that we don't + // need an additional field on the work in progress. + var current = unitOfWork.alternate; + setCurrentFiber(unitOfWork); + var next; + + if ( (unitOfWork.mode & ProfileMode) !== NoMode) { + startProfilerTimer(unitOfWork); + next = beginWork$1(current, unitOfWork, subtreeRenderLanes); + stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true); + } else { + next = beginWork$1(current, unitOfWork, subtreeRenderLanes); + } + + resetCurrentFiber(); + unitOfWork.memoizedProps = unitOfWork.pendingProps; + + if (next === null) { + // If this doesn't spawn new work, complete the current work. + completeUnitOfWork(unitOfWork); + } else { + workInProgress = next; + } + + ReactCurrentOwner$2.current = null; +} + +function completeUnitOfWork(unitOfWork) { + // Attempt to complete the current unit of work, then move to the next + // sibling. If there are no more siblings, return to the parent fiber. + var completedWork = unitOfWork; + + do { + // The current, flushed, state of this fiber is the alternate. Ideally + // nothing should rely on this, but relying on it here means that we don't + // need an additional field on the work in progress. + var current = completedWork.alternate; + var returnFiber = completedWork.return; // Check if the work completed or if something threw. + + if ((completedWork.flags & Incomplete) === NoFlags) { + setCurrentFiber(completedWork); + var next = void 0; + + if ( (completedWork.mode & ProfileMode) === NoMode) { + next = completeWork(current, completedWork, subtreeRenderLanes); + } else { + startProfilerTimer(completedWork); + next = completeWork(current, completedWork, subtreeRenderLanes); // Update render duration assuming we didn't error. + + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); + } + + resetCurrentFiber(); + + if (next !== null) { + // Completing this fiber spawned new work. Work on that next. + workInProgress = next; + return; + } + + resetChildLanes(completedWork); + + if (returnFiber !== null && // Do not append effects to parents if a sibling failed to complete + (returnFiber.flags & Incomplete) === NoFlags) { + // Append all the effects of the subtree and this fiber onto the effect + // list of the parent. The completion order of the children affects the + // side-effect order. + if (returnFiber.firstEffect === null) { + returnFiber.firstEffect = completedWork.firstEffect; + } + + if (completedWork.lastEffect !== null) { + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = completedWork.firstEffect; + } + + returnFiber.lastEffect = completedWork.lastEffect; + } // If this fiber had side-effects, we append it AFTER the children's + // side-effects. We can perform certain side-effects earlier if needed, + // by doing multiple passes over the effect list. We don't want to + // schedule our own side-effect on our own list because if end up + // reusing children we'll schedule this effect onto itself since we're + // at the end. + + + var flags = completedWork.flags; // Skip both NoWork and PerformedWork tags when creating the effect + // list. PerformedWork effect is read by React DevTools but shouldn't be + // committed. + + if (flags > PerformedWork) { + if (returnFiber.lastEffect !== null) { + returnFiber.lastEffect.nextEffect = completedWork; + } else { + returnFiber.firstEffect = completedWork; + } + + returnFiber.lastEffect = completedWork; + } + } + } else { + // This fiber did not complete because something threw. Pop values off + // the stack without entering the complete phase. If this is a boundary, + // capture values if possible. + var _next = unwindWork(completedWork); // Because this fiber did not complete, don't reset its expiration time. + + + if (_next !== null) { + // If completing this work spawned new work, do that next. We'll come + // back here again. + // Since we're restarting, remove anything that is not a host effect + // from the effect tag. + _next.flags &= HostEffectMask; + workInProgress = _next; + return; + } + + if ( (completedWork.mode & ProfileMode) !== NoMode) { + // Record the render duration for the fiber that errored. + stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); // Include the time spent working on failed children before continuing. + + var actualDuration = completedWork.actualDuration; + var child = completedWork.child; + + while (child !== null) { + actualDuration += child.actualDuration; + child = child.sibling; + } + + completedWork.actualDuration = actualDuration; + } + + if (returnFiber !== null) { + // Mark the parent fiber as incomplete and clear its effect list. + returnFiber.firstEffect = returnFiber.lastEffect = null; + returnFiber.flags |= Incomplete; + } + } + + var siblingFiber = completedWork.sibling; + + if (siblingFiber !== null) { + // If there is more work to do in this returnFiber, do that next. + workInProgress = siblingFiber; + return; + } // Otherwise, return to the parent + + + completedWork = returnFiber; // Update the next thing we're working on in case something throws. + + workInProgress = completedWork; + } while (completedWork !== null); // We've reached the root. + + + if (workInProgressRootExitStatus === RootIncomplete) { + workInProgressRootExitStatus = RootCompleted; + } +} + +function resetChildLanes(completedWork) { + if ( // TODO: Move this check out of the hot path by moving `resetChildLanes` + // to switch statement in `completeWork`. + (completedWork.tag === LegacyHiddenComponent || completedWork.tag === OffscreenComponent) && completedWork.memoizedState !== null && !includesSomeLane(subtreeRenderLanes, OffscreenLane) && (completedWork.mode & ConcurrentMode) !== NoLanes) { + // The children of this component are hidden. Don't bubble their + // expiration times. + return; + } + + var newChildLanes = NoLanes; // Bubble up the earliest expiration time. + + if ( (completedWork.mode & ProfileMode) !== NoMode) { + // In profiling mode, resetChildExpirationTime is also used to reset + // profiler durations. + var actualDuration = completedWork.actualDuration; + var treeBaseDuration = completedWork.selfBaseDuration; // When a fiber is cloned, its actualDuration is reset to 0. This value will + // only be updated if work is done on the fiber (i.e. it doesn't bailout). + // When work is done, it should bubble to the parent's actualDuration. If + // the fiber has not been cloned though, (meaning no work was done), then + // this value will reflect the amount of time spent working on a previous + // render. In that case it should not bubble. We determine whether it was + // cloned by comparing the child pointer. + + var shouldBubbleActualDurations = completedWork.alternate === null || completedWork.child !== completedWork.alternate.child; + var child = completedWork.child; + + while (child !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes)); + + if (shouldBubbleActualDurations) { + actualDuration += child.actualDuration; + } + + treeBaseDuration += child.treeBaseDuration; + child = child.sibling; + } + + var isTimedOutSuspense = completedWork.tag === SuspenseComponent && completedWork.memoizedState !== null; + + if (isTimedOutSuspense) { + // Don't count time spent in a timed out Suspense subtree as part of the base duration. + var primaryChildFragment = completedWork.child; + + if (primaryChildFragment !== null) { + treeBaseDuration -= primaryChildFragment.treeBaseDuration; + } + } + + completedWork.actualDuration = actualDuration; + completedWork.treeBaseDuration = treeBaseDuration; + } else { + var _child = completedWork.child; + + while (_child !== null) { + newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes)); + _child = _child.sibling; + } + } + + completedWork.childLanes = newChildLanes; +} + +function commitRoot(root) { + var renderPriorityLevel = getCurrentPriorityLevel(); + runWithPriority$1(ImmediatePriority$1, commitRootImpl.bind(null, root, renderPriorityLevel)); + return null; +} + +function commitRootImpl(root, renderPriorityLevel) { + do { + // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which + // means `flushPassiveEffects` will sometimes result in additional + // passive effects. So we need to keep flushing in a loop until there are + // no more pending effects. + // TODO: Might be better if `flushPassiveEffects` did not automatically + // flush synchronous work at the end, to avoid factoring hazards like this. + flushPassiveEffects(); + } while (rootWithPendingPassiveEffects !== null); + + flushRenderPhaseStrictModeWarningsInDEV(); + + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Should not already be working." ); + } + } + + var finishedWork = root.finishedWork; + var lanes = root.finishedLanes; + + if (finishedWork === null) { + + return null; + } + + root.finishedWork = null; + root.finishedLanes = NoLanes; + + if (!(finishedWork !== root.current)) { + { + throw Error( "Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue." ); + } + } // commitRoot never returns a continuation; it always finishes synchronously. + // So we can clear these now to allow a new callback to be scheduled. + + + root.callbackNode = null; // Update the first and last pending times on this root. The new first + // pending time is whatever is left on the root fiber. + + var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes); + markRootFinished(root, remainingLanes); // Clear already finished discrete updates in case that a later call of + // `flushDiscreteUpdates` starts a useless render pass which may cancels + // a scheduled timeout. + + if (rootsWithPendingDiscreteUpdates !== null) { + if (!hasDiscreteLanes(remainingLanes) && rootsWithPendingDiscreteUpdates.has(root)) { + rootsWithPendingDiscreteUpdates.delete(root); + } + } + + if (root === workInProgressRoot) { + // We can reset these now that they are finished. + workInProgressRoot = null; + workInProgress = null; + workInProgressRootRenderLanes = NoLanes; + } // Get the list of effects. + + + var firstEffect; + + if (finishedWork.flags > PerformedWork) { + // A fiber's effect list consists only of its children, not itself. So if + // the root has an effect, we need to add it to the end of the list. The + // resulting list is the set that would belong to the root's parent, if it + // had one; that is, all the effects in the tree including the root. + if (finishedWork.lastEffect !== null) { + finishedWork.lastEffect.nextEffect = finishedWork; + firstEffect = finishedWork.firstEffect; + } else { + firstEffect = finishedWork; + } + } else { + // There is no effect on the root. + firstEffect = finishedWork.firstEffect; + } + + if (firstEffect !== null) { + + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + var prevInteractions = pushInteractions(root); // Reset this to null before calling lifecycles + + ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass + // of the effect list for each phase: all mutation effects come before all + // layout effects, and so on. + // The first phase a "before mutation" phase. We use this phase to read the + // state of the host tree right before we mutate it. This is where + // getSnapshotBeforeUpdate is called. + + focusedInstanceHandle = prepareForCommit(root.containerInfo); + shouldFireAfterActiveInstanceBlur = false; + nextEffect = firstEffect; + + do { + { + invokeGuardedCallback(null, commitBeforeMutationEffects, null); + + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var error = clearCaughtError(); + captureCommitPhaseError(nextEffect, error); + nextEffect = nextEffect.nextEffect; + } + } + } while (nextEffect !== null); // We no longer need to track the active instance fiber + + + focusedInstanceHandle = null; + + { + // Mark the current commit time to be shared by all Profilers in this + // batch. This enables them to be grouped later. + recordCommitTime(); + } // The next phase is the mutation phase, where we mutate the host tree. + + + nextEffect = firstEffect; + + do { + { + invokeGuardedCallback(null, commitMutationEffects, null, root, renderPriorityLevel); + + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var _error = clearCaughtError(); + + captureCommitPhaseError(nextEffect, _error); + nextEffect = nextEffect.nextEffect; + } + } + } while (nextEffect !== null); + + resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after + // the mutation phase, so that the previous tree is still current during + // componentWillUnmount, but before the layout phase, so that the finished + // work is current during componentDidMount/Update. + + root.current = finishedWork; // The next phase is the layout phase, where we call effects that read + // the host tree after it's been mutated. The idiomatic use case for this is + // layout, but class component lifecycles also fire here for legacy reasons. + + nextEffect = firstEffect; + + do { + { + invokeGuardedCallback(null, commitLayoutEffects, null, root, lanes); + + if (hasCaughtError()) { + if (!(nextEffect !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var _error2 = clearCaughtError(); + + captureCommitPhaseError(nextEffect, _error2); + nextEffect = nextEffect.nextEffect; + } + } + } while (nextEffect !== null); + + nextEffect = null; // Tell Scheduler to yield at the end of the frame, so the browser has an + // opportunity to paint. + + requestPaint(); + + { + popInteractions(prevInteractions); + } + + executionContext = prevExecutionContext; + } else { + // No effects. + root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were + // no effects. + // TODO: Maybe there's a better way to report this. + + { + recordCommitTime(); + } + } + + var rootDidHavePassiveEffects = rootDoesHavePassiveEffects; + + if (rootDoesHavePassiveEffects) { + // This commit has passive effects. Stash a reference to them. But don't + // schedule a callback until after flushing layout work. + rootDoesHavePassiveEffects = false; + rootWithPendingPassiveEffects = root; + pendingPassiveEffectsLanes = lanes; + pendingPassiveEffectsRenderPriority = renderPriorityLevel; + } else { + // We are done with the effect chain at this point so let's clear the + // nextEffect pointers to assist with GC. If we have passive effects, we'll + // clear this in flushPassiveEffects. + nextEffect = firstEffect; + + while (nextEffect !== null) { + var nextNextEffect = nextEffect.nextEffect; + nextEffect.nextEffect = null; + + if (nextEffect.flags & Deletion) { + detachFiberAfterEffects(nextEffect); + } + + nextEffect = nextNextEffect; + } + } // Read this again, since an effect might have updated it + + + remainingLanes = root.pendingLanes; // Check if there's remaining work on this root + + if (remainingLanes !== NoLanes) { + { + if (spawnedWorkDuringRender !== null) { + var expirationTimes = spawnedWorkDuringRender; + spawnedWorkDuringRender = null; + + for (var i = 0; i < expirationTimes.length; i++) { + scheduleInteractions(root, expirationTimes[i], root.memoizedInteractions); + } + } + + schedulePendingInteractions(root, remainingLanes); + } + } else { + // If there's no remaining work, we can clear the set of already failed + // error boundaries. + legacyErrorBoundariesThatAlreadyFailed = null; + } + + { + if (!rootDidHavePassiveEffects) { + // If there are no passive effects, then we can complete the pending interactions. + // Otherwise, we'll wait until after the passive effects are flushed. + // Wait to do this until after remaining work has been scheduled, + // so that we don't prematurely signal complete for interactions when there's e.g. hidden work. + finishPendingInteractions(root, lanes); + } + } + + if (remainingLanes === SyncLane) { + // Count the number of times the root synchronously re-renders without + // finishing. If there are too many, it indicates an infinite update loop. + if (root === rootWithNestedUpdates) { + nestedUpdateCount++; + } else { + nestedUpdateCount = 0; + rootWithNestedUpdates = root; + } + } else { + nestedUpdateCount = 0; + } + + onCommitRoot(finishedWork.stateNode, renderPriorityLevel); + + { + onCommitRoot$1(); + } // Always call this before exiting `commitRoot`, to ensure that any + // additional work on this root is scheduled. + + + ensureRootIsScheduled(root, now()); + + if (hasUncaughtError) { + hasUncaughtError = false; + var _error3 = firstUncaughtError; + firstUncaughtError = null; + throw _error3; + } + + if ((executionContext & LegacyUnbatchedContext) !== NoContext) { + // a ReactDOM.render-ed root inside of batchedUpdates. The commit fired + // synchronously, but layout updates should be deferred until the end + // of the batch. + + + return null; + } // If layout work was scheduled, flush it now. + + + flushSyncCallbackQueue(); + + return null; +} + +function commitBeforeMutationEffects() { + while (nextEffect !== null) { + var current = nextEffect.alternate; + + if (!shouldFireAfterActiveInstanceBlur && focusedInstanceHandle !== null) { + if ((nextEffect.flags & Deletion) !== NoFlags) { + if (doesFiberContain(nextEffect, focusedInstanceHandle)) { + shouldFireAfterActiveInstanceBlur = true; + } + } else { + // TODO: Move this out of the hot path using a dedicated effect tag. + if (nextEffect.tag === SuspenseComponent && isSuspenseBoundaryBeingHidden(current, nextEffect) && doesFiberContain(nextEffect, focusedInstanceHandle)) { + shouldFireAfterActiveInstanceBlur = true; + } + } + } + + var flags = nextEffect.flags; + + if ((flags & Snapshot) !== NoFlags) { + setCurrentFiber(nextEffect); + commitBeforeMutationLifeCycles(current, nextEffect); + resetCurrentFiber(); + } + + if ((flags & Passive) !== NoFlags) { + // If there are passive effects, schedule a callback to flush at + // the earliest opportunity. + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + }); + } + } + + nextEffect = nextEffect.nextEffect; + } +} + +function commitMutationEffects(root, renderPriorityLevel) { + // TODO: Should probably move the bulk of this function to commitWork. + while (nextEffect !== null) { + setCurrentFiber(nextEffect); + var flags = nextEffect.flags; + + if (flags & ContentReset) { + commitResetTextContent(nextEffect); + } + + if (flags & Ref) { + var current = nextEffect.alternate; + + if (current !== null) { + commitDetachRef(current); + } + } // The following switch statement is only concerned about placement, + // updates, and deletions. To avoid needing to add a case for every possible + // bitmap value, we remove the secondary effects from the effect tag and + // switch on that value. + + + var primaryFlags = flags & (Placement | Update | Deletion | Hydrating); + + switch (primaryFlags) { + case Placement: + { + commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is + // inserted, before any life-cycles like componentDidMount gets called. + // TODO: findDOMNode doesn't rely on this any more but isMounted does + // and isMounted is deprecated anyway so we should be able to kill this. + + nextEffect.flags &= ~Placement; + break; + } + + case PlacementAndUpdate: + { + // Placement + commitPlacement(nextEffect); // Clear the "placement" from effect tag so that we know that this is + // inserted, before any life-cycles like componentDidMount gets called. + + nextEffect.flags &= ~Placement; // Update + + var _current = nextEffect.alternate; + commitWork(_current, nextEffect); + break; + } + + case Hydrating: + { + nextEffect.flags &= ~Hydrating; + break; + } + + case HydratingAndUpdate: + { + nextEffect.flags &= ~Hydrating; // Update + + var _current2 = nextEffect.alternate; + commitWork(_current2, nextEffect); + break; + } + + case Update: + { + var _current3 = nextEffect.alternate; + commitWork(_current3, nextEffect); + break; + } + + case Deletion: + { + commitDeletion(root, nextEffect); + break; + } + } + + resetCurrentFiber(); + nextEffect = nextEffect.nextEffect; + } +} + +function commitLayoutEffects(root, committedLanes) { + + + while (nextEffect !== null) { + setCurrentFiber(nextEffect); + var flags = nextEffect.flags; + + if (flags & (Update | Callback)) { + var current = nextEffect.alternate; + commitLifeCycles(root, current, nextEffect); + } + + { + if (flags & Ref) { + commitAttachRef(nextEffect); + } + } + + resetCurrentFiber(); + nextEffect = nextEffect.nextEffect; + } +} + +function flushPassiveEffects() { + // Returns whether passive effects were flushed. + if (pendingPassiveEffectsRenderPriority !== NoPriority$1) { + var priorityLevel = pendingPassiveEffectsRenderPriority > NormalPriority$1 ? NormalPriority$1 : pendingPassiveEffectsRenderPriority; + pendingPassiveEffectsRenderPriority = NoPriority$1; + + { + return runWithPriority$1(priorityLevel, flushPassiveEffectsImpl); + } + } + + return false; +} +function enqueuePendingPassiveHookEffectMount(fiber, effect) { + pendingPassiveHookEffectsMount.push(effect, fiber); + + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + }); + } +} +function enqueuePendingPassiveHookEffectUnmount(fiber, effect) { + pendingPassiveHookEffectsUnmount.push(effect, fiber); + + { + fiber.flags |= PassiveUnmountPendingDev; + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.flags |= PassiveUnmountPendingDev; + } + } + + if (!rootDoesHavePassiveEffects) { + rootDoesHavePassiveEffects = true; + scheduleCallback(NormalPriority$1, function () { + flushPassiveEffects(); + return null; + }); + } +} + +function invokePassiveEffectCreate(effect) { + var create = effect.create; + effect.destroy = create(); +} + +function flushPassiveEffectsImpl() { + if (rootWithPendingPassiveEffects === null) { + return false; + } + + var root = rootWithPendingPassiveEffects; + var lanes = pendingPassiveEffectsLanes; + rootWithPendingPassiveEffects = null; + pendingPassiveEffectsLanes = NoLanes; + + if (!((executionContext & (RenderContext | CommitContext)) === NoContext)) { + { + throw Error( "Cannot flush passive effects while already rendering." ); + } + } + + { + isFlushingPassiveEffects = true; + } + + var prevExecutionContext = executionContext; + executionContext |= CommitContext; + var prevInteractions = pushInteractions(root); // It's important that ALL pending passive effect destroy functions are called + // before ANY passive effect create functions are called. + // Otherwise effects in sibling components might interfere with each other. + // e.g. a destroy function in one component may unintentionally override a ref + // value set by a create function in another component. + // Layout effects have the same constraint. + // First pass: Destroy stale passive effects. + + var unmountEffects = pendingPassiveHookEffectsUnmount; + pendingPassiveHookEffectsUnmount = []; + + for (var i = 0; i < unmountEffects.length; i += 2) { + var _effect = unmountEffects[i]; + var fiber = unmountEffects[i + 1]; + var destroy = _effect.destroy; + _effect.destroy = undefined; + + { + fiber.flags &= ~PassiveUnmountPendingDev; + var alternate = fiber.alternate; + + if (alternate !== null) { + alternate.flags &= ~PassiveUnmountPendingDev; + } + } + + if (typeof destroy === 'function') { + { + setCurrentFiber(fiber); + + { + invokeGuardedCallback(null, destroy, null); + } + + if (hasCaughtError()) { + if (!(fiber !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var error = clearCaughtError(); + captureCommitPhaseError(fiber, error); + } + + resetCurrentFiber(); + } + } + } // Second pass: Create new passive effects. + + + var mountEffects = pendingPassiveHookEffectsMount; + pendingPassiveHookEffectsMount = []; + + for (var _i = 0; _i < mountEffects.length; _i += 2) { + var _effect2 = mountEffects[_i]; + var _fiber = mountEffects[_i + 1]; + + { + setCurrentFiber(_fiber); + + { + invokeGuardedCallback(null, invokePassiveEffectCreate, null, _effect2); + } + + if (hasCaughtError()) { + if (!(_fiber !== null)) { + { + throw Error( "Should be working on an effect." ); + } + } + + var _error4 = clearCaughtError(); + + captureCommitPhaseError(_fiber, _error4); + } + + resetCurrentFiber(); + } + } // Note: This currently assumes there are no passive effects on the root fiber + // because the root is not part of its own effect list. + // This could change in the future. + + + var effect = root.current.firstEffect; + + while (effect !== null) { + var nextNextEffect = effect.nextEffect; // Remove nextEffect pointer to assist GC + + effect.nextEffect = null; + + if (effect.flags & Deletion) { + detachFiberAfterEffects(effect); + } + + effect = nextNextEffect; + } + + { + popInteractions(prevInteractions); + finishPendingInteractions(root, lanes); + } + + { + isFlushingPassiveEffects = false; + } + + executionContext = prevExecutionContext; + flushSyncCallbackQueue(); // If additional passive effects were scheduled, increment a counter. If this + // exceeds the limit, we'll fire a warning. + + nestedPassiveUpdateCount = rootWithPendingPassiveEffects === null ? 0 : nestedPassiveUpdateCount + 1; + return true; +} + +function isAlreadyFailedLegacyErrorBoundary(instance) { + return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance); +} +function markLegacyErrorBoundaryAsFailed(instance) { + if (legacyErrorBoundariesThatAlreadyFailed === null) { + legacyErrorBoundariesThatAlreadyFailed = new Set([instance]); + } else { + legacyErrorBoundariesThatAlreadyFailed.add(instance); + } +} + +function prepareToThrowUncaughtError(error) { + if (!hasUncaughtError) { + hasUncaughtError = true; + firstUncaughtError = error; + } +} + +var onUncaughtError = prepareToThrowUncaughtError; + +function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) { + var errorInfo = createCapturedValue(error, sourceFiber); + var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane); + enqueueUpdate(rootFiber, update); + var eventTime = requestEventTime(); + var root = markUpdateLaneFromFiberToRoot(rootFiber, SyncLane); + + if (root !== null) { + markRootUpdated(root, SyncLane, eventTime); + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, SyncLane); + } +} + +function captureCommitPhaseError(sourceFiber, error) { + if (sourceFiber.tag === HostRoot) { + // Error was thrown at the root. There is no parent, so the root + // itself should capture it. + captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error); + return; + } + + var fiber = sourceFiber.return; + + while (fiber !== null) { + if (fiber.tag === HostRoot) { + captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error); + return; + } else if (fiber.tag === ClassComponent) { + var ctor = fiber.type; + var instance = fiber.stateNode; + + if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) { + var errorInfo = createCapturedValue(error, sourceFiber); + var update = createClassErrorUpdate(fiber, errorInfo, SyncLane); + enqueueUpdate(fiber, update); + var eventTime = requestEventTime(); + var root = markUpdateLaneFromFiberToRoot(fiber, SyncLane); + + if (root !== null) { + markRootUpdated(root, SyncLane, eventTime); + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, SyncLane); + } else { + // This component has already been unmounted. + // We can't schedule any follow up work for the root because the fiber is already unmounted, + // but we can still call the log-only boundary so the error isn't swallowed. + // + // TODO This is only a temporary bandaid for the old reconciler fork. + // We can delete this special case once the new fork is merged. + if (typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) { + try { + instance.componentDidCatch(error, errorInfo); + } catch (errorToIgnore) {// TODO Ignore this error? Rethrow it? + // This is kind of an edge case. + } + } + } + + return; + } + } + + fiber = fiber.return; + } +} +function pingSuspendedRoot(root, wakeable, pingedLanes) { + var pingCache = root.pingCache; + + if (pingCache !== null) { + // The wakeable resolved, so we no longer need to memoize, because it will + // never be thrown again. + pingCache.delete(wakeable); + } + + var eventTime = requestEventTime(); + markRootPinged(root, pingedLanes); + + if (workInProgressRoot === root && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) { + // Received a ping at the same priority level at which we're currently + // rendering. We might want to restart this render. This should mirror + // the logic of whether or not a root suspends once it completes. + // TODO: If we're rendering sync either due to Sync, Batched or expired, + // we should probably never restart. + // If we're suspended with delay, or if it's a retry, we'll always suspend + // so we can always restart. + if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) { + // Restart from the root. + prepareFreshStack(root, NoLanes); + } else { + // Even though we can't restart right now, we might get an + // opportunity later. So we mark this render as having a ping. + workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes); + } + } + + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, pingedLanes); +} + +function retryTimedOutBoundary(boundaryFiber, retryLane) { + // The boundary fiber (a Suspense component or SuspenseList component) + // previously was rendered in its fallback state. One of the promises that + // suspended it has resolved, which means at least part of the tree was + // likely unblocked. Try rendering again, at a new expiration time. + if (retryLane === NoLane) { + retryLane = requestRetryLane(boundaryFiber); + } // TODO: Special case idle priority? + + + var eventTime = requestEventTime(); + var root = markUpdateLaneFromFiberToRoot(boundaryFiber, retryLane); + + if (root !== null) { + markRootUpdated(root, retryLane, eventTime); + ensureRootIsScheduled(root, eventTime); + schedulePendingInteractions(root, retryLane); + } +} +function resolveRetryWakeable(boundaryFiber, wakeable) { + var retryLane = NoLane; // Default + + var retryCache; + + { + retryCache = boundaryFiber.stateNode; + } + + if (retryCache !== null) { + // The wakeable resolved, so we no longer need to memoize, because it will + // never be thrown again. + retryCache.delete(wakeable); + } + + retryTimedOutBoundary(boundaryFiber, retryLane); +} // Computes the next Just Noticeable Difference (JND) boundary. +// The theory is that a person can't tell the difference between small differences in time. +// Therefore, if we wait a bit longer than necessary that won't translate to a noticeable +// difference in the experience. However, waiting for longer might mean that we can avoid +// showing an intermediate loading state. The longer we have already waited, the harder it +// is to tell small differences in time. Therefore, the longer we've already waited, +// the longer we can wait additionally. At some point we have to give up though. +// We pick a train model where the next boundary commits at a consistent schedule. +// These particular numbers are vague estimates. We expect to adjust them based on research. + +function jnd(timeElapsed) { + return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960; +} + +function checkForNestedUpdates() { + if (nestedUpdateCount > NESTED_UPDATE_LIMIT) { + nestedUpdateCount = 0; + rootWithNestedUpdates = null; + + { + { + throw Error( "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops." ); + } + } + } + + { + if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) { + nestedPassiveUpdateCount = 0; + + error('Maximum update depth exceeded. This can happen when a component ' + "calls setState inside useEffect, but useEffect either doesn't " + 'have a dependency array, or one of the dependencies changes on ' + 'every render.'); + } + } +} + +function flushRenderPhaseStrictModeWarningsInDEV() { + { + ReactStrictModeWarnings.flushLegacyContextWarning(); + + { + ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings(); + } + } +} + +var didWarnStateUpdateForNotYetMountedComponent = null; + +function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) { + { + if ((executionContext & RenderContext) !== NoContext) { + // We let the other warning about render phase updates deal with this one. + return; + } + + if (!(fiber.mode & (BlockingMode | ConcurrentMode))) { + return; + } + + var tag = fiber.tag; + + if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) { + // Only warn for user-defined components, not internal ones like Suspense. + return; + } // We show the whole stack but dedupe on the top component's name because + // the problematic code almost always lies inside that component. + + + var componentName = getComponentName(fiber.type) || 'ReactComponent'; + + if (didWarnStateUpdateForNotYetMountedComponent !== null) { + if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) { + return; + } + + didWarnStateUpdateForNotYetMountedComponent.add(componentName); + } else { + didWarnStateUpdateForNotYetMountedComponent = new Set([componentName]); + } + + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error("Can't perform a React state update on a component that hasn't mounted yet. " + 'This indicates that you have a side-effect in your render function that ' + 'asynchronously later calls tries to update the component. Move this work to ' + 'useEffect instead.'); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } +} + +var didWarnStateUpdateForUnmountedComponent = null; + +function warnAboutUpdateOnUnmountedFiberInDEV(fiber) { + { + var tag = fiber.tag; + + if (tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent && tag !== Block) { + // Only warn for user-defined components, not internal ones like Suspense. + return; + } // If there are pending passive effects unmounts for this Fiber, + // we can assume that they would have prevented this update. + + + if ((fiber.flags & PassiveUnmountPendingDev) !== NoFlags) { + return; + } // We show the whole stack but dedupe on the top component's name because + // the problematic code almost always lies inside that component. + + + var componentName = getComponentName(fiber.type) || 'ReactComponent'; + + if (didWarnStateUpdateForUnmountedComponent !== null) { + if (didWarnStateUpdateForUnmountedComponent.has(componentName)) { + return; + } + + didWarnStateUpdateForUnmountedComponent.add(componentName); + } else { + didWarnStateUpdateForUnmountedComponent = new Set([componentName]); + } + + if (isFlushingPassiveEffects) ; else { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error("Can't perform a React state update on an unmounted component. This " + 'is a no-op, but it indicates a memory leak in your application. To ' + 'fix, cancel all subscriptions and asynchronous tasks in %s.', tag === ClassComponent ? 'the componentWillUnmount method' : 'a useEffect cleanup function'); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} + +var beginWork$1; + +{ + var dummyFiber = null; + + beginWork$1 = function (current, unitOfWork, lanes) { + // If a component throws an error, we replay it again in a synchronously + // dispatched event, so that the debugger will treat it as an uncaught + // error See ReactErrorUtils for more information. + // Before entering the begin phase, copy the work-in-progress onto a dummy + // fiber. If beginWork throws, we'll use this to reset the state. + var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork); + + try { + return beginWork(current, unitOfWork, lanes); + } catch (originalError) { + if (originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') { + // Don't replay promises. Treat everything else like an error. + throw originalError; + } // Keep this code in sync with handleError; any changes here must have + // corresponding changes there. + + + resetContextDependencies(); + resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the + // same fiber again. + // Unwind the failed stack frame + + unwindInterruptedWork(unitOfWork); // Restore the original properties of the fiber. + + assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy); + + if ( unitOfWork.mode & ProfileMode) { + // Reset the profiler timer. + startProfilerTimer(unitOfWork); + } // Run beginWork again. + + + invokeGuardedCallback(null, beginWork, null, current, unitOfWork, lanes); + + if (hasCaughtError()) { + var replayError = clearCaughtError(); // `invokeGuardedCallback` sometimes sets an expando `_suppressLogging`. + // Rethrow this error instead of the original one. + + throw replayError; + } else { + // This branch is reachable if the render phase is impure. + throw originalError; + } + } + }; +} + +var didWarnAboutUpdateInRender = false; +var didWarnAboutUpdateInRenderForAnotherComponent; + +{ + didWarnAboutUpdateInRenderForAnotherComponent = new Set(); +} + +function warnAboutRenderPhaseUpdatesInDEV(fiber) { + { + if (isRendering && (executionContext & RenderContext) !== NoContext && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) { + switch (fiber.tag) { + case FunctionComponent: + case ForwardRef: + case SimpleMemoComponent: + { + var renderingComponentName = workInProgress && getComponentName(workInProgress.type) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed. + + var dedupeKey = renderingComponentName; + + if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) { + didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey); + var setStateComponentName = getComponentName(fiber.type) || 'Unknown'; + + error('Cannot update a component (`%s`) while rendering a ' + 'different component (`%s`). To locate the bad setState() call inside `%s`, ' + 'follow the stack trace as described in https://reactjs.org/link/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName); + } + + break; + } + + case ClassComponent: + { + if (!didWarnAboutUpdateInRender) { + error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.'); + + didWarnAboutUpdateInRender = true; + } + + break; + } + } + } + } +} // a 'shared' variable that changes when act() opens/closes in tests. + + +var IsThisRendererActing = { + current: false +}; +function warnIfNotScopedWithMatchingAct(fiber) { + { + if ( IsSomeRendererActing.current === true && IsThisRendererActing.current !== true) { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error("It looks like you're using the wrong act() around your test interactions.\n" + 'Be sure to use the matching version of act() corresponding to your renderer:\n\n' + '// for react-dom:\n' + // Break up imports to avoid accidentally parsing them as dependencies. + 'import {act} fr' + "om 'react-dom/test-utils';\n" + '// ...\n' + 'act(() => ...);\n\n' + '// for react-test-renderer:\n' + // Break up imports to avoid accidentally parsing them as dependencies. + 'import TestRenderer fr' + "om react-test-renderer';\n" + 'const {act} = TestRenderer;\n' + '// ...\n' + 'act(() => ...);'); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} +function warnIfNotCurrentlyActingEffectsInDEV(fiber) { + { + if ( (fiber.mode & StrictMode) !== NoMode && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { + error('An update to %s ran an effect, but was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act', getComponentName(fiber.type)); + } + } +} + +function warnIfNotCurrentlyActingUpdatesInDEV(fiber) { + { + if ( executionContext === NoContext && IsSomeRendererActing.current === false && IsThisRendererActing.current === false) { + var previousFiber = current; + + try { + setCurrentFiber(fiber); + + error('An update to %s inside a test was not wrapped in act(...).\n\n' + 'When testing, code that causes React state updates should be ' + 'wrapped into act(...):\n\n' + 'act(() => {\n' + ' /* fire events that update state */\n' + '});\n' + '/* assert on the output */\n\n' + "This ensures that you're testing the behavior the user would see " + 'in the browser.' + ' Learn more at https://reactjs.org/link/wrap-tests-with-act', getComponentName(fiber.type)); + } finally { + if (previousFiber) { + setCurrentFiber(fiber); + } else { + resetCurrentFiber(); + } + } + } + } +} + +var warnIfNotCurrentlyActingUpdatesInDev = warnIfNotCurrentlyActingUpdatesInDEV; // In tests, we want to enforce a mocked scheduler. + +var didWarnAboutUnmockedScheduler = false; // TODO Before we release concurrent mode, revisit this and decide whether a mocked +// scheduler is the actual recommendation. The alternative could be a testing build, +// a new lib, or whatever; we dunno just yet. This message is for early adopters +// to get their tests right. + +function warnIfUnmockedScheduler(fiber) { + { + if (didWarnAboutUnmockedScheduler === false && Scheduler.unstable_flushAllWithoutAsserting === undefined) { + if (fiber.mode & BlockingMode || fiber.mode & ConcurrentMode) { + didWarnAboutUnmockedScheduler = true; + + error('In Concurrent or Sync modes, the "scheduler" module needs to be mocked ' + 'to guarantee consistent behaviour across tests and browsers. ' + 'For example, with jest: \n' + // Break up requires to avoid accidentally parsing them as dependencies. + "jest.mock('scheduler', () => require" + "('scheduler/unstable_mock'));\n\n" + 'For more info, visit https://reactjs.org/link/mock-scheduler'); + } + } + } +} + +function computeThreadID(root, lane) { + // Interaction threads are unique per root and expiration time. + // NOTE: Intentionally unsound cast. All that matters is that it's a number + // and it represents a batch of work. Could make a helper function instead, + // but meh this is fine for now. + return lane * 1000 + root.interactionThreadID; +} + +function markSpawnedWork(lane) { + + if (spawnedWorkDuringRender === null) { + spawnedWorkDuringRender = [lane]; + } else { + spawnedWorkDuringRender.push(lane); + } +} + +function scheduleInteractions(root, lane, interactions) { + + if (interactions.size > 0) { + var pendingInteractionMap = root.pendingInteractionMap; + var pendingInteractions = pendingInteractionMap.get(lane); + + if (pendingInteractions != null) { + interactions.forEach(function (interaction) { + if (!pendingInteractions.has(interaction)) { + // Update the pending async work count for previously unscheduled interaction. + interaction.__count++; + } + + pendingInteractions.add(interaction); + }); + } else { + pendingInteractionMap.set(lane, new Set(interactions)); // Update the pending async work count for the current interactions. + + interactions.forEach(function (interaction) { + interaction.__count++; + }); + } + + var subscriber = tracing.__subscriberRef.current; + + if (subscriber !== null) { + var threadID = computeThreadID(root, lane); + subscriber.onWorkScheduled(interactions, threadID); + } + } +} + +function schedulePendingInteractions(root, lane) { + + scheduleInteractions(root, lane, tracing.__interactionsRef.current); +} + +function startWorkOnPendingInteractions(root, lanes) { + // we can accurately attribute time spent working on it, And so that cascading + // work triggered during the render phase will be associated with it. + + + var interactions = new Set(); + root.pendingInteractionMap.forEach(function (scheduledInteractions, scheduledLane) { + if (includesSomeLane(lanes, scheduledLane)) { + scheduledInteractions.forEach(function (interaction) { + return interactions.add(interaction); + }); + } + }); // Store the current set of interactions on the FiberRoot for a few reasons: + // We can re-use it in hot functions like performConcurrentWorkOnRoot() + // without having to recalculate it. We will also use it in commitWork() to + // pass to any Profiler onRender() hooks. This also provides DevTools with a + // way to access it when the onCommitRoot() hook is called. + + root.memoizedInteractions = interactions; + + if (interactions.size > 0) { + var subscriber = tracing.__subscriberRef.current; + + if (subscriber !== null) { + var threadID = computeThreadID(root, lanes); + + try { + subscriber.onWorkStarted(interactions, threadID); + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority$1, function () { + throw error; + }); + } + } + } +} + +function finishPendingInteractions(root, committedLanes) { + + var remainingLanesAfterCommit = root.pendingLanes; + var subscriber; + + try { + subscriber = tracing.__subscriberRef.current; + + if (subscriber !== null && root.memoizedInteractions.size > 0) { + // FIXME: More than one lane can finish in a single commit. + var threadID = computeThreadID(root, committedLanes); + subscriber.onWorkStopped(root.memoizedInteractions, threadID); + } + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority$1, function () { + throw error; + }); + } finally { + // Clear completed interactions from the pending Map. + // Unless the render was suspended or cascading work was scheduled, + // In which case– leave pending interactions until the subsequent render. + var pendingInteractionMap = root.pendingInteractionMap; + pendingInteractionMap.forEach(function (scheduledInteractions, lane) { + // Only decrement the pending interaction count if we're done. + // If there's still work at the current priority, + // That indicates that we are waiting for suspense data. + if (!includesSomeLane(remainingLanesAfterCommit, lane)) { + pendingInteractionMap.delete(lane); + scheduledInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber !== null && interaction.__count === 0) { + try { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } catch (error) { + // If the subscriber throws, rethrow it in a separate task + scheduleCallback(ImmediatePriority$1, function () { + throw error; + }); + } + } + }); + } + }); + } +} // `act` testing API + +function shouldForceFlushFallbacksInDEV() { + // Never force flush in production. This function should get stripped out. + return actingUpdatesScopeDepth > 0; +} +// so we can tell if any async act() calls try to run in parallel. + + +var actingUpdatesScopeDepth = 0; + +function detachFiberAfterEffects(fiber) { + fiber.sibling = null; + fiber.stateNode = null; +} + +var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below. + +var failedBoundaries = null; +var setRefreshHandler = function (handler) { + { + resolveFamily = handler; + } +}; +function resolveFunctionForHotReloading(type) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return type; + } + + var family = resolveFamily(type); + + if (family === undefined) { + return type; + } // Use the latest known implementation. + + + return family.current; + } +} +function resolveClassForHotReloading(type) { + // No implementation differences. + return resolveFunctionForHotReloading(type); +} +function resolveForwardRefForHotReloading(type) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return type; + } + + var family = resolveFamily(type); + + if (family === undefined) { + // Check if we're dealing with a real forwardRef. Don't want to crash early. + if (type !== null && type !== undefined && typeof type.render === 'function') { + // ForwardRef is special because its resolved .type is an object, + // but it's possible that we only have its inner render function in the map. + // If that inner render function is different, we'll build a new forwardRef type. + var currentRender = resolveFunctionForHotReloading(type.render); + + if (type.render !== currentRender) { + var syntheticType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: currentRender + }; + + if (type.displayName !== undefined) { + syntheticType.displayName = type.displayName; + } + + return syntheticType; + } + } + + return type; + } // Use the latest known implementation. + + + return family.current; + } +} +function isCompatibleFamilyForHotReloading(fiber, element) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return false; + } + + var prevType = fiber.elementType; + var nextType = element.type; // If we got here, we know types aren't === equal. + + var needsCompareFamilies = false; + var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null; + + switch (fiber.tag) { + case ClassComponent: + { + if (typeof nextType === 'function') { + needsCompareFamilies = true; + } + + break; + } + + case FunctionComponent: + { + if (typeof nextType === 'function') { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + // We don't know the inner type yet. + // We're going to assume that the lazy inner type is stable, + // and so it is sufficient to avoid reconciling it away. + // We're not going to unwrap or actually use the new lazy type. + needsCompareFamilies = true; + } + + break; + } + + case ForwardRef: + { + if ($$typeofNextType === REACT_FORWARD_REF_TYPE) { + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + + break; + } + + case MemoComponent: + case SimpleMemoComponent: + { + if ($$typeofNextType === REACT_MEMO_TYPE) { + // TODO: if it was but can no longer be simple, + // we shouldn't set this. + needsCompareFamilies = true; + } else if ($$typeofNextType === REACT_LAZY_TYPE) { + needsCompareFamilies = true; + } + + break; + } + + default: + return false; + } // Check if both types have a family and it's the same one. + + + if (needsCompareFamilies) { + // Note: memo() and forwardRef() we'll compare outer rather than inner type. + // This means both of them need to be registered to preserve state. + // If we unwrapped and compared the inner types for wrappers instead, + // then we would risk falsely saying two separate memo(Foo) + // calls are equivalent because they wrap the same Foo function. + var prevFamily = resolveFamily(prevType); + + if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) { + return true; + } + } + + return false; + } +} +function markFailedErrorBoundaryForHotReloading(fiber) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return; + } + + if (typeof WeakSet !== 'function') { + return; + } + + if (failedBoundaries === null) { + failedBoundaries = new WeakSet(); + } + + failedBoundaries.add(fiber); + } +} +var scheduleRefresh = function (root, update) { + { + if (resolveFamily === null) { + // Hot reloading is disabled. + return; + } + + var staleFamilies = update.staleFamilies, + updatedFamilies = update.updatedFamilies; + flushPassiveEffects(); + flushSync(function () { + scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies); + }); + } +}; +var scheduleRoot = function (root, element) { + { + if (root.context !== emptyContextObject) { + // Super edge case: root has a legacy _renderSubtree context + // but we don't know the parentComponent so we can't pass it. + // Just ignore. We'll delete this with _renderSubtree code path later. + return; + } + + flushPassiveEffects(); + flushSync(function () { + updateContainer(element, root, null, null); + }); + } +}; + +function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) { + { + var alternate = fiber.alternate, + child = fiber.child, + sibling = fiber.sibling, + tag = fiber.tag, + type = fiber.type; + var candidateType = null; + + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; + + case ForwardRef: + candidateType = type.render; + break; + } + + if (resolveFamily === null) { + throw new Error('Expected resolveFamily to be set during hot reload.'); + } + + var needsRender = false; + var needsRemount = false; + + if (candidateType !== null) { + var family = resolveFamily(candidateType); + + if (family !== undefined) { + if (staleFamilies.has(family)) { + needsRemount = true; + } else if (updatedFamilies.has(family)) { + if (tag === ClassComponent) { + needsRemount = true; + } else { + needsRender = true; + } + } + } + } + + if (failedBoundaries !== null) { + if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) { + needsRemount = true; + } + } + + if (needsRemount) { + fiber._debugNeedsRemount = true; + } + + if (needsRemount || needsRender) { + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + + if (child !== null && !needsRemount) { + scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies); + } + + if (sibling !== null) { + scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies); + } + } +} + +var findHostInstancesForRefresh = function (root, families) { + { + var hostInstances = new Set(); + var types = new Set(families.map(function (family) { + return family.current; + })); + findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances); + return hostInstances; + } +}; + +function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) { + { + var child = fiber.child, + sibling = fiber.sibling, + tag = fiber.tag, + type = fiber.type; + var candidateType = null; + + switch (tag) { + case FunctionComponent: + case SimpleMemoComponent: + case ClassComponent: + candidateType = type; + break; + + case ForwardRef: + candidateType = type.render; + break; + } + + var didMatch = false; + + if (candidateType !== null) { + if (types.has(candidateType)) { + didMatch = true; + } + } + + if (didMatch) { + // We have a match. This only drills down to the closest host components. + // There's no need to search deeper because for the purpose of giving + // visual feedback, "flashing" outermost parent rectangles is sufficient. + findHostInstancesForFiberShallowly(fiber, hostInstances); + } else { + // If there's no match, maybe there will be one further down in the child tree. + if (child !== null) { + findHostInstancesForMatchingFibersRecursively(child, types, hostInstances); + } + } + + if (sibling !== null) { + findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances); + } + } +} + +function findHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances); + + if (foundHostInstances) { + return; + } // If we didn't find any host children, fallback to closest host parent. + + + var node = fiber; + + while (true) { + switch (node.tag) { + case HostComponent: + hostInstances.add(node.stateNode); + return; + + case HostPortal: + hostInstances.add(node.stateNode.containerInfo); + return; + + case HostRoot: + hostInstances.add(node.stateNode.containerInfo); + return; + } + + if (node.return === null) { + throw new Error('Expected to reach root first.'); + } + + node = node.return; + } + } +} + +function findChildHostInstancesForFiberShallowly(fiber, hostInstances) { + { + var node = fiber; + var foundHostInstances = false; + + while (true) { + if (node.tag === HostComponent) { + // We got a match. + foundHostInstances = true; + hostInstances.add(node.stateNode); // There may still be more, so keep searching. + } else if (node.child !== null) { + node.child.return = node; + node = node.child; + continue; + } + + if (node === fiber) { + return foundHostInstances; + } + + while (node.sibling === null) { + if (node.return === null || node.return === fiber) { + return foundHostInstances; + } + + node = node.return; + } + + node.sibling.return = node.return; + node = node.sibling; + } + } + + return false; +} + +var hasBadMapPolyfill; + +{ + hasBadMapPolyfill = false; + + try { + var nonExtensibleObject = Object.preventExtensions({}); + /* eslint-disable no-new */ + + new Map([[nonExtensibleObject, null]]); + new Set([nonExtensibleObject]); + /* eslint-enable no-new */ + } catch (e) { + // TODO: Consider warning about bad polyfills + hasBadMapPolyfill = true; + } +} + +var debugCounter = 1; + +function FiberNode(tag, pendingProps, key, mode) { + // Instance + this.tag = tag; + this.key = key; + this.elementType = null; + this.type = null; + this.stateNode = null; // Fiber + + this.return = null; + this.child = null; + this.sibling = null; + this.index = 0; + this.ref = null; + this.pendingProps = pendingProps; + this.memoizedProps = null; + this.updateQueue = null; + this.memoizedState = null; + this.dependencies = null; + this.mode = mode; // Effects + + this.flags = NoFlags; + this.nextEffect = null; + this.firstEffect = null; + this.lastEffect = null; + this.lanes = NoLanes; + this.childLanes = NoLanes; + this.alternate = null; + + { + // Note: The following is done to avoid a v8 performance cliff. + // + // Initializing the fields below to smis and later updating them with + // double values will cause Fibers to end up having separate shapes. + // This behavior/bug has something to do with Object.preventExtension(). + // Fortunately this only impacts DEV builds. + // Unfortunately it makes React unusably slow for some applications. + // To work around this, initialize the fields below with doubles. + // + // Learn more about this here: + // https://github.com/facebook/react/issues/14365 + // https://bugs.chromium.org/p/v8/issues/detail?id=8538 + this.actualDuration = Number.NaN; + this.actualStartTime = Number.NaN; + this.selfBaseDuration = Number.NaN; + this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization. + // This won't trigger the performance cliff mentioned above, + // and it simplifies other profiler code (including DevTools). + + this.actualDuration = 0; + this.actualStartTime = -1; + this.selfBaseDuration = 0; + this.treeBaseDuration = 0; + } + + { + // This isn't directly used but is handy for debugging internals: + this._debugID = debugCounter++; + this._debugSource = null; + this._debugOwner = null; + this._debugNeedsRemount = false; + this._debugHookTypes = null; + + if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') { + Object.preventExtensions(this); + } + } +} // This is a constructor function, rather than a POJO constructor, still +// please ensure we do the following: +// 1) Nobody should add any instance methods on this. Instance methods can be +// more difficult to predict when they get optimized and they are almost +// never inlined properly in static compilers. +// 2) Nobody should rely on `instanceof Fiber` for type testing. We should +// always know when it is a fiber. +// 3) We might want to experiment with using numeric keys since they are easier +// to optimize in a non-JIT environment. +// 4) We can easily go from a constructor to a createFiber object literal if that +// is faster. +// 5) It should be easy to port this to a C struct and keep a C implementation +// compatible. + + +var createFiber = function (tag, pendingProps, key, mode) { + // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors + return new FiberNode(tag, pendingProps, key, mode); +}; + +function shouldConstruct$1(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function isSimpleFunctionComponent(type) { + return typeof type === 'function' && !shouldConstruct$1(type) && type.defaultProps === undefined; +} +function resolveLazyComponentTag(Component) { + if (typeof Component === 'function') { + return shouldConstruct$1(Component) ? ClassComponent : FunctionComponent; + } else if (Component !== undefined && Component !== null) { + var $$typeof = Component.$$typeof; + + if ($$typeof === REACT_FORWARD_REF_TYPE) { + return ForwardRef; + } + + if ($$typeof === REACT_MEMO_TYPE) { + return MemoComponent; + } + } + + return IndeterminateComponent; +} // This is used to create an alternate fiber to do work on. + +function createWorkInProgress(current, pendingProps) { + var workInProgress = current.alternate; + + if (workInProgress === null) { + // We use a double buffering pooling technique because we know that we'll + // only ever need at most two versions of a tree. We pool the "other" unused + // node that we're free to reuse. This is lazily created to avoid allocating + // extra objects for things that are never updated. It also allow us to + // reclaim the extra memory if needed. + workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode); + workInProgress.elementType = current.elementType; + workInProgress.type = current.type; + workInProgress.stateNode = current.stateNode; + + { + // DEV-only fields + workInProgress._debugID = current._debugID; + workInProgress._debugSource = current._debugSource; + workInProgress._debugOwner = current._debugOwner; + workInProgress._debugHookTypes = current._debugHookTypes; + } + + workInProgress.alternate = current; + current.alternate = workInProgress; + } else { + workInProgress.pendingProps = pendingProps; // Needed because Blocks store data on type. + + workInProgress.type = current.type; // We already have an alternate. + // Reset the effect tag. + + workInProgress.flags = NoFlags; // The effect list is no longer valid. + + workInProgress.nextEffect = null; + workInProgress.firstEffect = null; + workInProgress.lastEffect = null; + + { + // We intentionally reset, rather than copy, actualDuration & actualStartTime. + // This prevents time from endlessly accumulating in new commits. + // This has the downside of resetting values for different priority renders, + // But works for yielding (the common case) and should support resuming. + workInProgress.actualDuration = 0; + workInProgress.actualStartTime = -1; + } + } + + workInProgress.childLanes = current.childLanes; + workInProgress.lanes = current.lanes; + workInProgress.child = current.child; + workInProgress.memoizedProps = current.memoizedProps; + workInProgress.memoizedState = current.memoizedState; + workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so + // it cannot be shared with the current fiber. + + var currentDependencies = current.dependencies; + workInProgress.dependencies = currentDependencies === null ? null : { + lanes: currentDependencies.lanes, + firstContext: currentDependencies.firstContext + }; // These will be overridden during the parent's reconciliation + + workInProgress.sibling = current.sibling; + workInProgress.index = current.index; + workInProgress.ref = current.ref; + + { + workInProgress.selfBaseDuration = current.selfBaseDuration; + workInProgress.treeBaseDuration = current.treeBaseDuration; + } + + { + workInProgress._debugNeedsRemount = current._debugNeedsRemount; + + switch (workInProgress.tag) { + case IndeterminateComponent: + case FunctionComponent: + case SimpleMemoComponent: + workInProgress.type = resolveFunctionForHotReloading(current.type); + break; + + case ClassComponent: + workInProgress.type = resolveClassForHotReloading(current.type); + break; + + case ForwardRef: + workInProgress.type = resolveForwardRefForHotReloading(current.type); + break; + } + } + + return workInProgress; +} // Used to reuse a Fiber for a second pass. + +function resetWorkInProgress(workInProgress, renderLanes) { + // This resets the Fiber to what createFiber or createWorkInProgress would + // have set the values to before during the first pass. Ideally this wouldn't + // be necessary but unfortunately many code paths reads from the workInProgress + // when they should be reading from current and writing to workInProgress. + // We assume pendingProps, index, key, ref, return are still untouched to + // avoid doing another reconciliation. + // Reset the effect tag but keep any Placement tags, since that's something + // that child fiber is setting, not the reconciliation. + workInProgress.flags &= Placement; // The effect list is no longer valid. + + workInProgress.nextEffect = null; + workInProgress.firstEffect = null; + workInProgress.lastEffect = null; + var current = workInProgress.alternate; + + if (current === null) { + // Reset to createFiber's initial values. + workInProgress.childLanes = NoLanes; + workInProgress.lanes = renderLanes; + workInProgress.child = null; + workInProgress.memoizedProps = null; + workInProgress.memoizedState = null; + workInProgress.updateQueue = null; + workInProgress.dependencies = null; + workInProgress.stateNode = null; + + { + // Note: We don't reset the actualTime counts. It's useful to accumulate + // actual time across multiple render passes. + workInProgress.selfBaseDuration = 0; + workInProgress.treeBaseDuration = 0; + } + } else { + // Reset to the cloned values that createWorkInProgress would've. + workInProgress.childLanes = current.childLanes; + workInProgress.lanes = current.lanes; + workInProgress.child = current.child; + workInProgress.memoizedProps = current.memoizedProps; + workInProgress.memoizedState = current.memoizedState; + workInProgress.updateQueue = current.updateQueue; // Needed because Blocks store data on type. + + workInProgress.type = current.type; // Clone the dependencies object. This is mutated during the render phase, so + // it cannot be shared with the current fiber. + + var currentDependencies = current.dependencies; + workInProgress.dependencies = currentDependencies === null ? null : { + lanes: currentDependencies.lanes, + firstContext: currentDependencies.firstContext + }; + + { + // Note: We don't reset the actualTime counts. It's useful to accumulate + // actual time across multiple render passes. + workInProgress.selfBaseDuration = current.selfBaseDuration; + workInProgress.treeBaseDuration = current.treeBaseDuration; + } + } + + return workInProgress; +} +function createHostRootFiber(tag) { + var mode; + + if (tag === ConcurrentRoot) { + mode = ConcurrentMode | BlockingMode | StrictMode; + } else if (tag === BlockingRoot) { + mode = BlockingMode | StrictMode; + } else { + mode = NoMode; + } + + if ( isDevToolsPresent) { + // Always collect profile timings when DevTools are present. + // This enables DevTools to start capturing timing at any point– + // Without some nodes in the tree having empty base times. + mode |= ProfileMode; + } + + return createFiber(HostRoot, null, null, mode); +} +function createFiberFromTypeAndProps(type, // React$ElementType +key, pendingProps, owner, mode, lanes) { + var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy. + + var resolvedType = type; + + if (typeof type === 'function') { + if (shouldConstruct$1(type)) { + fiberTag = ClassComponent; + + { + resolvedType = resolveClassForHotReloading(resolvedType); + } + } else { + { + resolvedType = resolveFunctionForHotReloading(resolvedType); + } + } + } else if (typeof type === 'string') { + fiberTag = HostComponent; + } else { + getTag: switch (type) { + case REACT_FRAGMENT_TYPE: + return createFiberFromFragment(pendingProps.children, mode, lanes, key); + + case REACT_DEBUG_TRACING_MODE_TYPE: + fiberTag = Mode; + mode |= DebugTracingMode; + break; + + case REACT_STRICT_MODE_TYPE: + fiberTag = Mode; + mode |= StrictMode; + break; + + case REACT_PROFILER_TYPE: + return createFiberFromProfiler(pendingProps, mode, lanes, key); + + case REACT_SUSPENSE_TYPE: + return createFiberFromSuspense(pendingProps, mode, lanes, key); + + case REACT_SUSPENSE_LIST_TYPE: + return createFiberFromSuspenseList(pendingProps, mode, lanes, key); + + case REACT_OFFSCREEN_TYPE: + return createFiberFromOffscreen(pendingProps, mode, lanes, key); + + case REACT_LEGACY_HIDDEN_TYPE: + return createFiberFromLegacyHidden(pendingProps, mode, lanes, key); + + case REACT_SCOPE_TYPE: + + // eslint-disable-next-line no-fallthrough + + default: + { + if (typeof type === 'object' && type !== null) { + switch (type.$$typeof) { + case REACT_PROVIDER_TYPE: + fiberTag = ContextProvider; + break getTag; + + case REACT_CONTEXT_TYPE: + // This is a consumer + fiberTag = ContextConsumer; + break getTag; + + case REACT_FORWARD_REF_TYPE: + fiberTag = ForwardRef; + + { + resolvedType = resolveForwardRefForHotReloading(resolvedType); + } + + break getTag; + + case REACT_MEMO_TYPE: + fiberTag = MemoComponent; + break getTag; + + case REACT_LAZY_TYPE: + fiberTag = LazyComponent; + resolvedType = null; + break getTag; + + case REACT_BLOCK_TYPE: + fiberTag = Block; + break getTag; + } + } + + var info = ''; + + { + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and " + 'named imports.'; + } + + var ownerName = owner ? getComponentName(owner.type) : null; + + if (ownerName) { + info += '\n\nCheck the render method of `' + ownerName + '`.'; + } + } + + { + { + throw Error( "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (type == null ? type : typeof type) + "." + info ); + } + } + } + } + } + + var fiber = createFiber(fiberTag, pendingProps, key, mode); + fiber.elementType = type; + fiber.type = resolvedType; + fiber.lanes = lanes; + + { + fiber._debugOwner = owner; + } + + return fiber; +} +function createFiberFromElement(element, mode, lanes) { + var owner = null; + + { + owner = element._owner; + } + + var type = element.type; + var key = element.key; + var pendingProps = element.props; + var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes); + + { + fiber._debugSource = element._source; + fiber._debugOwner = element._owner; + } + + return fiber; +} +function createFiberFromFragment(elements, mode, lanes, key) { + var fiber = createFiber(Fragment, elements, key, mode); + fiber.lanes = lanes; + return fiber; +} + +function createFiberFromProfiler(pendingProps, mode, lanes, key) { + { + if (typeof pendingProps.id !== 'string') { + error('Profiler must specify an "id" as a prop'); + } + } + + var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode); // TODO: The Profiler fiber shouldn't have a type. It has a tag. + + fiber.elementType = REACT_PROFILER_TYPE; + fiber.type = REACT_PROFILER_TYPE; + fiber.lanes = lanes; + + { + fiber.stateNode = { + effectDuration: 0, + passiveEffectDuration: 0 + }; + } + + return fiber; +} + +function createFiberFromSuspense(pendingProps, mode, lanes, key) { + var fiber = createFiber(SuspenseComponent, pendingProps, key, mode); // TODO: The SuspenseComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + + fiber.type = REACT_SUSPENSE_TYPE; + fiber.elementType = REACT_SUSPENSE_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromSuspenseList(pendingProps, mode, lanes, key) { + var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode); + + { + // TODO: The SuspenseListComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + fiber.type = REACT_SUSPENSE_LIST_TYPE; + } + + fiber.elementType = REACT_SUSPENSE_LIST_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromOffscreen(pendingProps, mode, lanes, key) { + var fiber = createFiber(OffscreenComponent, pendingProps, key, mode); // TODO: The OffscreenComponent fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + + { + fiber.type = REACT_OFFSCREEN_TYPE; + } + + fiber.elementType = REACT_OFFSCREEN_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromLegacyHidden(pendingProps, mode, lanes, key) { + var fiber = createFiber(LegacyHiddenComponent, pendingProps, key, mode); // TODO: The LegacyHidden fiber shouldn't have a type. It has a tag. + // This needs to be fixed in getComponentName so that it relies on the tag + // instead. + + { + fiber.type = REACT_LEGACY_HIDDEN_TYPE; + } + + fiber.elementType = REACT_LEGACY_HIDDEN_TYPE; + fiber.lanes = lanes; + return fiber; +} +function createFiberFromText(content, mode, lanes) { + var fiber = createFiber(HostText, content, null, mode); + fiber.lanes = lanes; + return fiber; +} +function createFiberFromHostInstanceForDeletion() { + var fiber = createFiber(HostComponent, null, null, NoMode); // TODO: These should not need a type. + + fiber.elementType = 'DELETED'; + fiber.type = 'DELETED'; + return fiber; +} +function createFiberFromPortal(portal, mode, lanes) { + var pendingProps = portal.children !== null ? portal.children : []; + var fiber = createFiber(HostPortal, pendingProps, portal.key, mode); + fiber.lanes = lanes; + fiber.stateNode = { + containerInfo: portal.containerInfo, + pendingChildren: null, + // Used by persistent updates + implementation: portal.implementation + }; + return fiber; +} // Used for stashing WIP properties to replay failed work in DEV. + +function assignFiberPropertiesInDEV(target, source) { + if (target === null) { + // This Fiber's initial properties will always be overwritten. + // We only use a Fiber to ensure the same hidden class so DEV isn't slow. + target = createFiber(IndeterminateComponent, null, null, NoMode); + } // This is intentionally written as a list of all properties. + // We tried to use Object.assign() instead but this is called in + // the hottest path, and Object.assign() was too slow: + // https://github.com/facebook/react/issues/12502 + // This code is DEV-only so size is not a concern. + + + target.tag = source.tag; + target.key = source.key; + target.elementType = source.elementType; + target.type = source.type; + target.stateNode = source.stateNode; + target.return = source.return; + target.child = source.child; + target.sibling = source.sibling; + target.index = source.index; + target.ref = source.ref; + target.pendingProps = source.pendingProps; + target.memoizedProps = source.memoizedProps; + target.updateQueue = source.updateQueue; + target.memoizedState = source.memoizedState; + target.dependencies = source.dependencies; + target.mode = source.mode; + target.flags = source.flags; + target.nextEffect = source.nextEffect; + target.firstEffect = source.firstEffect; + target.lastEffect = source.lastEffect; + target.lanes = source.lanes; + target.childLanes = source.childLanes; + target.alternate = source.alternate; + + { + target.actualDuration = source.actualDuration; + target.actualStartTime = source.actualStartTime; + target.selfBaseDuration = source.selfBaseDuration; + target.treeBaseDuration = source.treeBaseDuration; + } + + target._debugID = source._debugID; + target._debugSource = source._debugSource; + target._debugOwner = source._debugOwner; + target._debugNeedsRemount = source._debugNeedsRemount; + target._debugHookTypes = source._debugHookTypes; + return target; +} + +function FiberRootNode(containerInfo, tag, hydrate) { + this.tag = tag; + this.containerInfo = containerInfo; + this.pendingChildren = null; + this.current = null; + this.pingCache = null; + this.finishedWork = null; + this.timeoutHandle = noTimeout; + this.context = null; + this.pendingContext = null; + this.hydrate = hydrate; + this.callbackNode = null; + this.callbackPriority = NoLanePriority; + this.eventTimes = createLaneMap(NoLanes); + this.expirationTimes = createLaneMap(NoTimestamp); + this.pendingLanes = NoLanes; + this.suspendedLanes = NoLanes; + this.pingedLanes = NoLanes; + this.expiredLanes = NoLanes; + this.mutableReadLanes = NoLanes; + this.finishedLanes = NoLanes; + this.entangledLanes = NoLanes; + this.entanglements = createLaneMap(NoLanes); + + { + this.mutableSourceEagerHydrationData = null; + } + + { + this.interactionThreadID = tracing.unstable_getThreadID(); + this.memoizedInteractions = new Set(); + this.pendingInteractionMap = new Map(); + } + + { + switch (tag) { + case BlockingRoot: + this._debugRootType = 'createBlockingRoot()'; + break; + + case ConcurrentRoot: + this._debugRootType = 'createRoot()'; + break; + + case LegacyRoot: + this._debugRootType = 'createLegacyRoot()'; + break; + } + } +} + +function createFiberRoot(containerInfo, tag, hydrate, hydrationCallbacks) { + var root = new FiberRootNode(containerInfo, tag, hydrate); + // stateNode is any. + + + var uninitializedFiber = createHostRootFiber(tag); + root.current = uninitializedFiber; + uninitializedFiber.stateNode = root; + initializeUpdateQueue(uninitializedFiber); + return root; +} + +// This ensures that the version used for server rendering matches the one +// that is eventually read during hydration. +// If they don't match there's a potential tear and a full deopt render is required. + +function registerMutableSourceForHydration(root, mutableSource) { + var getVersion = mutableSource._getVersion; + var version = getVersion(mutableSource._source); // TODO Clear this data once all pending hydration work is finished. + // Retaining it forever may interfere with GC. + + if (root.mutableSourceEagerHydrationData == null) { + root.mutableSourceEagerHydrationData = [mutableSource, version]; + } else { + root.mutableSourceEagerHydrationData.push(mutableSource, version); + } +} + +function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation. +implementation) { + var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + return { + // This tag allow us to uniquely identify this as a React Portal + $$typeof: REACT_PORTAL_TYPE, + key: key == null ? null : '' + key, + children: children, + containerInfo: containerInfo, + implementation: implementation + }; +} + +var didWarnAboutNestedUpdates; +var didWarnAboutFindNodeInStrictMode; + +{ + didWarnAboutNestedUpdates = false; + didWarnAboutFindNodeInStrictMode = {}; +} + +function getContextForSubtree(parentComponent) { + if (!parentComponent) { + return emptyContextObject; + } + + var fiber = get(parentComponent); + var parentContext = findCurrentUnmaskedContext(fiber); + + if (fiber.tag === ClassComponent) { + var Component = fiber.type; + + if (isContextProvider(Component)) { + return processChildContext(fiber, Component, parentContext); + } + } + + return parentContext; +} + +function findHostInstanceWithWarning(component, methodName) { + { + var fiber = get(component); + + if (fiber === undefined) { + if (typeof component.render === 'function') { + { + { + throw Error( "Unable to find node on an unmounted component." ); + } + } + } else { + { + { + throw Error( "Argument appears to not be a ReactComponent. Keys: " + Object.keys(component) ); + } + } + } + } + + var hostFiber = findCurrentHostFiber(fiber); + + if (hostFiber === null) { + return null; + } + + if (hostFiber.mode & StrictMode) { + var componentName = getComponentName(fiber.type) || 'Component'; + + if (!didWarnAboutFindNodeInStrictMode[componentName]) { + didWarnAboutFindNodeInStrictMode[componentName] = true; + var previousFiber = current; + + try { + setCurrentFiber(hostFiber); + + if (fiber.mode & StrictMode) { + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which is inside StrictMode. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName); + } else { + error('%s is deprecated in StrictMode. ' + '%s was passed an instance of %s which renders StrictMode children. ' + 'Instead, add a ref directly to the element you want to reference. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName); + } + } finally { + // Ideally this should reset to previous but this shouldn't be called in + // render and there's another warning for that anyway. + if (previousFiber) { + setCurrentFiber(previousFiber); + } else { + resetCurrentFiber(); + } + } + } + } + + return hostFiber.stateNode; + } +} + +function createContainer(containerInfo, tag, hydrate, hydrationCallbacks) { + return createFiberRoot(containerInfo, tag, hydrate); +} +function updateContainer(element, container, parentComponent, callback) { + { + onScheduleRoot(container, element); + } + + var current$1 = container.current; + var eventTime = requestEventTime(); + + { + // $FlowExpectedError - jest isn't a global, and isn't recognized outside of tests + if ('undefined' !== typeof jest) { + warnIfUnmockedScheduler(current$1); + warnIfNotScopedWithMatchingAct(current$1); + } + } + + var lane = requestUpdateLane(current$1); + + var context = getContextForSubtree(parentComponent); + + if (container.context === null) { + container.context = context; + } else { + container.pendingContext = context; + } + + { + if (isRendering && current !== null && !didWarnAboutNestedUpdates) { + didWarnAboutNestedUpdates = true; + + error('Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\n\n' + 'Check the render method of %s.', getComponentName(current.type) || 'Unknown'); + } + } + + var update = createUpdate(eventTime, lane); // Caution: React DevTools currently depends on this property + // being called "element". + + update.payload = { + element: element + }; + callback = callback === undefined ? null : callback; + + if (callback !== null) { + { + if (typeof callback !== 'function') { + error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback); + } + } + + update.callback = callback; + } + + enqueueUpdate(current$1, update); + scheduleUpdateOnFiber(current$1, lane, eventTime); + return lane; +} +function getPublicRootInstance(container) { + var containerFiber = container.current; + + if (!containerFiber.child) { + return null; + } + + switch (containerFiber.child.tag) { + case HostComponent: + return getPublicInstance(containerFiber.child.stateNode); + + default: + return containerFiber.child.stateNode; + } +} + +function markRetryLaneImpl(fiber, retryLane) { + var suspenseState = fiber.memoizedState; + + if (suspenseState !== null && suspenseState.dehydrated !== null) { + suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane); + } +} // Increases the priority of thennables when they resolve within this boundary. + + +function markRetryLaneIfNotHydrated(fiber, retryLane) { + markRetryLaneImpl(fiber, retryLane); + var alternate = fiber.alternate; + + if (alternate) { + markRetryLaneImpl(alternate, retryLane); + } +} + +function attemptUserBlockingHydration$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority and they should not suspend on I/O, + // since you have to wrap anything that might suspend in + // Suspense. + return; + } + + var eventTime = requestEventTime(); + var lane = InputDiscreteHydrationLane; + scheduleUpdateOnFiber(fiber, lane, eventTime); + markRetryLaneIfNotHydrated(fiber, lane); +} +function attemptContinuousHydration$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority and they should not suspend on I/O, + // since you have to wrap anything that might suspend in + // Suspense. + return; + } + + var eventTime = requestEventTime(); + var lane = SelectiveHydrationLane; + scheduleUpdateOnFiber(fiber, lane, eventTime); + markRetryLaneIfNotHydrated(fiber, lane); +} +function attemptHydrationAtCurrentPriority$1(fiber) { + if (fiber.tag !== SuspenseComponent) { + // We ignore HostRoots here because we can't increase + // their priority other than synchronously flush it. + return; + } + + var eventTime = requestEventTime(); + var lane = requestUpdateLane(fiber); + scheduleUpdateOnFiber(fiber, lane, eventTime); + markRetryLaneIfNotHydrated(fiber, lane); +} +function runWithPriority$2(priority, fn) { + + try { + setCurrentUpdateLanePriority(priority); + return fn(); + } finally { + } +} +function findHostInstanceWithNoPortals(fiber) { + var hostFiber = findCurrentHostFiberWithNoPortals(fiber); + + if (hostFiber === null) { + return null; + } + + if (hostFiber.tag === FundamentalComponent) { + return hostFiber.stateNode.instance; + } + + return hostFiber.stateNode; +} + +var shouldSuspendImpl = function (fiber) { + return false; +}; + +function shouldSuspend(fiber) { + return shouldSuspendImpl(fiber); +} +var overrideHookState = null; +var overrideHookStateDeletePath = null; +var overrideHookStateRenamePath = null; +var overrideProps = null; +var overridePropsDeletePath = null; +var overridePropsRenamePath = null; +var scheduleUpdate = null; +var setSuspenseHandler = null; + +{ + var copyWithDeleteImpl = function (obj, path, index) { + var key = path[index]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); + + if (index + 1 === path.length) { + if (Array.isArray(updated)) { + updated.splice(key, 1); + } else { + delete updated[key]; + } + + return updated; + } // $FlowFixMe number or string is fine here + + + updated[key] = copyWithDeleteImpl(obj[key], path, index + 1); + return updated; + }; + + var copyWithDelete = function (obj, path) { + return copyWithDeleteImpl(obj, path, 0); + }; + + var copyWithRenameImpl = function (obj, oldPath, newPath, index) { + var oldKey = oldPath[index]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); + + if (index + 1 === oldPath.length) { + var newKey = newPath[index]; // $FlowFixMe number or string is fine here + + updated[newKey] = updated[oldKey]; + + if (Array.isArray(updated)) { + updated.splice(oldKey, 1); + } else { + delete updated[oldKey]; + } + } else { + // $FlowFixMe number or string is fine here + updated[oldKey] = copyWithRenameImpl( // $FlowFixMe number or string is fine here + obj[oldKey], oldPath, newPath, index + 1); + } + + return updated; + }; + + var copyWithRename = function (obj, oldPath, newPath) { + if (oldPath.length !== newPath.length) { + warn('copyWithRename() expects paths of the same length'); + + return; + } else { + for (var i = 0; i < newPath.length - 1; i++) { + if (oldPath[i] !== newPath[i]) { + warn('copyWithRename() expects paths to be the same except for the deepest key'); + + return; + } + } + } + + return copyWithRenameImpl(obj, oldPath, newPath, 0); + }; + + var copyWithSetImpl = function (obj, path, index, value) { + if (index >= path.length) { + return value; + } + + var key = path[index]; + var updated = Array.isArray(obj) ? obj.slice() : _assign({}, obj); // $FlowFixMe number or string is fine here + + updated[key] = copyWithSetImpl(obj[key], path, index + 1, value); + return updated; + }; + + var copyWithSet = function (obj, path, value) { + return copyWithSetImpl(obj, path, 0, value); + }; + + var findHook = function (fiber, id) { + // For now, the "id" of stateful hooks is just the stateful hook index. + // This may change in the future with e.g. nested hooks. + var currentHook = fiber.memoizedState; + + while (currentHook !== null && id > 0) { + currentHook = currentHook.next; + id--; + } + + return currentHook; + }; // Support DevTools editable values for useState and useReducer. + + + overrideHookState = function (fiber, id, path, value) { + var hook = findHook(fiber, id); + + if (hook !== null) { + var newState = copyWithSet(hook.memoizedState, path, value); + hook.memoizedState = newState; + hook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. + + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + }; + + overrideHookStateDeletePath = function (fiber, id, path) { + var hook = findHook(fiber, id); + + if (hook !== null) { + var newState = copyWithDelete(hook.memoizedState, path); + hook.memoizedState = newState; + hook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. + + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + }; + + overrideHookStateRenamePath = function (fiber, id, oldPath, newPath) { + var hook = findHook(fiber, id); + + if (hook !== null) { + var newState = copyWithRename(hook.memoizedState, oldPath, newPath); + hook.memoizedState = newState; + hook.baseState = newState; // We aren't actually adding an update to the queue, + // because there is no update we can add for useReducer hooks that won't trigger an error. + // (There's no appropriate action type for DevTools overrides.) + // As a result though, React will see the scheduled update as a noop and bailout. + // Shallow cloning props works as a workaround for now to bypass the bailout check. + + fiber.memoizedProps = _assign({}, fiber.memoizedProps); + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + } + }; // Support DevTools props for function components, forwardRef, memo, host components, etc. + + + overrideProps = function (fiber, path, value) { + fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value); + + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + overridePropsDeletePath = function (fiber, path) { + fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path); + + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + overridePropsRenamePath = function (fiber, oldPath, newPath) { + fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath); + + if (fiber.alternate) { + fiber.alternate.pendingProps = fiber.pendingProps; + } + + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + scheduleUpdate = function (fiber) { + scheduleUpdateOnFiber(fiber, SyncLane, NoTimestamp); + }; + + setSuspenseHandler = function (newShouldSuspendImpl) { + shouldSuspendImpl = newShouldSuspendImpl; + }; +} + +function findHostInstanceByFiber(fiber) { + var hostFiber = findCurrentHostFiber(fiber); + + if (hostFiber === null) { + return null; + } + + return hostFiber.stateNode; +} + +function emptyFindFiberByHostInstance(instance) { + return null; +} + +function getCurrentFiberForDevTools() { + return current; +} + +function injectIntoDevTools(devToolsConfig) { + var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance; + var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; + return injectInternals({ + bundleType: devToolsConfig.bundleType, + version: devToolsConfig.version, + rendererPackageName: devToolsConfig.rendererPackageName, + rendererConfig: devToolsConfig.rendererConfig, + overrideHookState: overrideHookState, + overrideHookStateDeletePath: overrideHookStateDeletePath, + overrideHookStateRenamePath: overrideHookStateRenamePath, + overrideProps: overrideProps, + overridePropsDeletePath: overridePropsDeletePath, + overridePropsRenamePath: overridePropsRenamePath, + setSuspenseHandler: setSuspenseHandler, + scheduleUpdate: scheduleUpdate, + currentDispatcherRef: ReactCurrentDispatcher, + findHostInstanceByFiber: findHostInstanceByFiber, + findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance, + // React Refresh + findHostInstancesForRefresh: findHostInstancesForRefresh , + scheduleRefresh: scheduleRefresh , + scheduleRoot: scheduleRoot , + setRefreshHandler: setRefreshHandler , + // Enables DevTools to append owner stacks to error messages in DEV mode. + getCurrentFiber: getCurrentFiberForDevTools + }); +} + +function ReactDOMRoot(container, options) { + this._internalRoot = createRootImpl(container, ConcurrentRoot, options); +} + +function ReactDOMBlockingRoot(container, tag, options) { + this._internalRoot = createRootImpl(container, tag, options); +} + +ReactDOMRoot.prototype.render = ReactDOMBlockingRoot.prototype.render = function (children) { + var root = this._internalRoot; + + { + if (typeof arguments[1] === 'function') { + error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().'); + } + + var container = root.containerInfo; + + if (container.nodeType !== COMMENT_NODE) { + var hostInstance = findHostInstanceWithNoPortals(root.current); + + if (hostInstance) { + if (hostInstance.parentNode !== container) { + error('render(...): It looks like the React-rendered content of the ' + 'root container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + "root.unmount() to empty a root's container."); + } + } + } + } + + updateContainer(children, root, null, null); +}; + +ReactDOMRoot.prototype.unmount = ReactDOMBlockingRoot.prototype.unmount = function () { + { + if (typeof arguments[0] === 'function') { + error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().'); + } + } + + var root = this._internalRoot; + var container = root.containerInfo; + updateContainer(null, root, null, function () { + unmarkContainerAsRoot(container); + }); +}; + +function createRootImpl(container, tag, options) { + // Tag is either LegacyRoot or Concurrent Root + var hydrate = options != null && options.hydrate === true; + var hydrationCallbacks = options != null && options.hydrationOptions || null; + var mutableSources = options != null && options.hydrationOptions != null && options.hydrationOptions.mutableSources || null; + var root = createContainer(container, tag, hydrate); + markContainerAsRoot(root.current, container); + var containerNodeType = container.nodeType; + + { + var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container; + listenToAllSupportedEvents(rootContainerElement); + } + + if (mutableSources) { + for (var i = 0; i < mutableSources.length; i++) { + var mutableSource = mutableSources[i]; + registerMutableSourceForHydration(root, mutableSource); + } + } + + return root; +} +function createLegacyRoot(container, options) { + return new ReactDOMBlockingRoot(container, LegacyRoot, options); +} +function isValidContainer(node) { + return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable ')); +} + +var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner; +var topLevelUpdateWarnings; +var warnedAboutHydrateAPI = false; + +{ + topLevelUpdateWarnings = function (container) { + if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) { + var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer._internalRoot.current); + + if (hostInstance) { + if (hostInstance.parentNode !== container) { + error('render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.'); + } + } + } + + var isRootRenderedBySomeReact = !!container._reactRootContainer; + var rootEl = getReactRootElementInContainer(container); + var hasNonRootReactChild = !!(rootEl && getInstanceFromNode(rootEl)); + + if (hasNonRootReactChild && !isRootRenderedBySomeReact) { + error('render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.'); + } + + if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') { + error('render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.'); + } + }; +} + +function getReactRootElementInContainer(container) { + if (!container) { + return null; + } + + if (container.nodeType === DOCUMENT_NODE) { + return container.documentElement; + } else { + return container.firstChild; + } +} + +function shouldHydrateDueToLegacyHeuristic(container) { + var rootElement = getReactRootElementInContainer(container); + return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME)); +} + +function legacyCreateRootFromDOMContainer(container, forceHydrate) { + var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container); // First clear any existing content. + + if (!shouldHydrate) { + var warned = false; + var rootSibling; + + while (rootSibling = container.lastChild) { + { + if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) { + warned = true; + + error('render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.'); + } + } + + container.removeChild(rootSibling); + } + } + + { + if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) { + warnedAboutHydrateAPI = true; + + warn('render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v18. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.'); + } + } + + return createLegacyRoot(container, shouldHydrate ? { + hydrate: true + } : undefined); +} + +function warnOnInvalidCallback$1(callback, callerName) { + { + if (callback !== null && typeof callback !== 'function') { + error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback); + } + } +} + +function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) { + { + topLevelUpdateWarnings(container); + warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render'); + } // TODO: Without `any` type, Flow says "Property cannot be accessed on any + // member of intersection type." Whyyyyyy. + + + var root = container._reactRootContainer; + var fiberRoot; + + if (!root) { + // Initial mount + root = container._reactRootContainer = legacyCreateRootFromDOMContainer(container, forceHydrate); + fiberRoot = root._internalRoot; + + if (typeof callback === 'function') { + var originalCallback = callback; + + callback = function () { + var instance = getPublicRootInstance(fiberRoot); + originalCallback.call(instance); + }; + } // Initial mount should not be batched. + + + unbatchedUpdates(function () { + updateContainer(children, fiberRoot, parentComponent, callback); + }); + } else { + fiberRoot = root._internalRoot; + + if (typeof callback === 'function') { + var _originalCallback = callback; + + callback = function () { + var instance = getPublicRootInstance(fiberRoot); + + _originalCallback.call(instance); + }; + } // Update + + + updateContainer(children, fiberRoot, parentComponent, callback); + } + + return getPublicRootInstance(fiberRoot); +} + +function findDOMNode(componentOrElement) { + { + var owner = ReactCurrentOwner$3.current; + + if (owner !== null && owner.stateNode !== null) { + var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender; + + if (!warnedAboutRefsInRender) { + error('%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner.type) || 'A component'); + } + + owner.stateNode._warnedAboutRefsInRender = true; + } + } + + if (componentOrElement == null) { + return null; + } + + if (componentOrElement.nodeType === ELEMENT_NODE) { + return componentOrElement; + } + + { + return findHostInstanceWithWarning(componentOrElement, 'findDOMNode'); + } +} +function hydrate(element, container, callback) { + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } + + { + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call createRoot(container, {hydrate: true}).render(element)?'); + } + } // TODO: throw or warn if we couldn't hydrate? + + + return legacyRenderSubtreeIntoContainer(null, element, container, true, callback); +} +function render(element, container, callback) { + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } + + { + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?'); + } + } + + return legacyRenderSubtreeIntoContainer(null, element, container, false, callback); +} +function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { + if (!isValidContainer(containerNode)) { + { + throw Error( "Target container is not a DOM element." ); + } + } + + if (!(parentComponent != null && has(parentComponent))) { + { + throw Error( "parentComponent must be a valid React Component" ); + } + } + + return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback); +} +function unmountComponentAtNode(container) { + if (!isValidContainer(container)) { + { + throw Error( "unmountComponentAtNode(...): Target container is not a DOM element." ); + } + } + + { + var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined; + + if (isModernRoot) { + error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOM.createRoot(). This is not supported. Did you mean to call root.unmount()?'); + } + } + + if (container._reactRootContainer) { + { + var rootEl = getReactRootElementInContainer(container); + var renderedByDifferentReact = rootEl && !getInstanceFromNode(rootEl); + + if (renderedByDifferentReact) { + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.'); + } + } // Unmount should not be batched. + + + unbatchedUpdates(function () { + legacyRenderSubtreeIntoContainer(null, null, container, false, function () { + // $FlowFixMe This should probably use `delete container._reactRootContainer` + container._reactRootContainer = null; + unmarkContainerAsRoot(container); + }); + }); // If you call unmountComponentAtNode twice in quick succession, you'll + // get `true` twice. That's probably fine? + + return true; + } else { + { + var _rootEl = getReactRootElementInContainer(container); + + var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode(_rootEl)); // Check if the container itself is a React root node. + + var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer; + + if (hasNonRootReactChild) { + error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.'); + } + } + + return false; + } +} + +setAttemptUserBlockingHydration(attemptUserBlockingHydration$1); +setAttemptContinuousHydration(attemptContinuousHydration$1); +setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1); +setAttemptHydrationAtPriority(runWithPriority$2); +var didWarnAboutUnstableCreatePortal = false; + +{ + if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype + Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype + Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') { + error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills'); + } +} + +setRestoreImplementation(restoreControlledState$3); +setBatchingImplementation(batchedUpdates$1, discreteUpdates$1, flushDiscreteUpdates, batchedEventUpdates$1); + +function createPortal$1(children, container) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + if (!isValidContainer(container)) { + { + throw Error( "Target container is not a DOM element." ); + } + } // TODO: pass ReactDOM portal implementation as third argument + // $FlowFixMe The Flow type is opaque but there's no way to actually create it. + + + return createPortal(children, container, null, key); +} + +function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) { + + return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback); +} + +function unstable_createPortal(children, container) { + var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + { + if (!didWarnAboutUnstableCreatePortal) { + didWarnAboutUnstableCreatePortal = true; + + warn('The ReactDOM.unstable_createPortal() alias has been deprecated, ' + 'and will be removed in React 18+. Update your code to use ' + 'ReactDOM.createPortal() instead. It has the exact same API, ' + 'but without the "unstable_" prefix.'); + } + } + + return createPortal$1(children, container, key); +} + +var Internals = { + // Keep in sync with ReactTestUtils.js, and ReactTestUtilsAct.js. + // This is an array for better minification. + Events: [getInstanceFromNode, getNodeFromInstance, getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, flushPassiveEffects, // TODO: This is related to `act`, not events. Move to separate key? + IsThisRendererActing] +}; +var foundDevTools = injectIntoDevTools({ + findFiberByHostInstance: getClosestInstanceFromNode, + bundleType: 1 , + version: ReactVersion, + rendererPackageName: 'react-dom' +}); + +{ + if (!foundDevTools && canUseDOM && window.top === window.self) { + // If we're in Chrome or Firefox, provide a download link if not installed. + if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { + var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://. + + if (/^(https?|file):$/.test(protocol)) { + // eslint-disable-next-line react-internal/no-production-logging + console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://reactjs.org/link/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://reactjs.org/link/react-devtools-faq' : ''), 'font-weight:bold'); + } + } + } +} + +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals; +exports.createPortal = createPortal$1; +exports.findDOMNode = findDOMNode; +exports.flushSync = flushSync; +exports.hydrate = hydrate; +exports.render = render; +exports.unmountComponentAtNode = unmountComponentAtNode; +exports.unstable_batchedUpdates = batchedUpdates$1; +exports.unstable_createPortal = unstable_createPortal; +exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer; +exports.version = ReactVersion; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react-dom/index.js": +/*!*****************************************!*\ + !*** ./node_modules/react-dom/index.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +function checkDCE() { + /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ + if ( + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' || + typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function' + ) { + return; + } + if (true) { + // This branch is unreachable because this function is only called + // in production, but the condition is true only in development. + // Therefore if the branch is still here, dead code elimination wasn't + // properly applied. + // Don't change the message. React DevTools relies on it. Also make sure + // this message doesn't occur elsewhere in this function, or it will cause + // a false positive. + throw new Error('^_^'); + } + try { + // Verify that the code above has been dead code eliminated (DCE'd). + __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); + } catch (err) { + // DevTools shouldn't crash React, no matter what. + // We should still report in case we break this code. + console.error(err); + } +} + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-dom.development.js */ "./node_modules/react-dom/cjs/react-dom.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react-fast-compare/index.js": +/*!**************************************************!*\ + !*** ./node_modules/react-fast-compare/index.js ***! + \**************************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */ + +var hasElementType = typeof Element !== 'undefined'; +var hasMap = typeof Map === 'function'; +var hasSet = typeof Set === 'function'; +var hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView; + +// Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js + +function equal(a, b) { + // START: fast-deep-equal es6/index.js 3.1.1 + if (a === b) return true; + + if (a && b && typeof a == 'object' && typeof b == 'object') { + if (a.constructor !== b.constructor) return false; + + var length, i, keys; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (!equal(a[i], b[i])) return false; + return true; + } + + // START: Modifications: + // 1. Extra `has<Type> &&` helpers in initial condition allow es6 code + // to co-exist with es5. + // 2. Replace `for of` with es5 compliant iteration using `for`. + // Basically, take: + // + // ```js + // for (i of a.entries()) + // if (!b.has(i[0])) return false; + // ``` + // + // ... and convert to: + // + // ```js + // it = a.entries(); + // while (!(i = it.next()).done) + // if (!b.has(i.value[0])) return false; + // ``` + // + // **Note**: `i` access switches to `i.value`. + var it; + if (hasMap && (a instanceof Map) && (b instanceof Map)) { + if (a.size !== b.size) return false; + it = a.entries(); + while (!(i = it.next()).done) + if (!b.has(i.value[0])) return false; + it = a.entries(); + while (!(i = it.next()).done) + if (!equal(i.value[1], b.get(i.value[0]))) return false; + return true; + } + + if (hasSet && (a instanceof Set) && (b instanceof Set)) { + if (a.size !== b.size) return false; + it = a.entries(); + while (!(i = it.next()).done) + if (!b.has(i.value[0])) return false; + return true; + } + // END: Modifications + + if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (a[i] !== b[i]) return false; + return true; + } + + if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); + + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) return false; + + for (i = length; i-- !== 0;) + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + // END: fast-deep-equal + + // START: react-fast-compare + // custom handling for DOM elements + if (hasElementType && a instanceof Element) return false; + + // custom handling for React/Preact + for (i = length; i-- !== 0;) { + if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) { + // React-specific: avoid traversing React elements' _owner + // Preact-specific: avoid traversing Preact elements' __v and __o + // __v = $_original / $_vnode + // __o = $_owner + // These properties contain circular references and are not needed when + // comparing the actual elements (and not their owners) + // .$$typeof and ._store on just reasonable markers of elements + + continue; + } + + // all other properties should be traversed as usual + if (!equal(a[keys[i]], b[keys[i]])) return false; + } + // END: react-fast-compare + + // START: fast-deep-equal + return true; + } + + return a !== a && b !== b; +} +// end fast-deep-equal + +module.exports = function isEqual(a, b) { + try { + return equal(a, b); + } catch (error) { + if (((error.message || '').match(/stack|recursion/i))) { + // warn on circular references, don't crash + // browsers give this different errors name and messages: + // chrome/safari: "RangeError", "Maximum call stack size exceeded" + // firefox: "InternalError", too much recursion" + // edge: "Error", "Out of stack space" + console.warn('react-fast-compare cannot handle circular refs'); + return false; + } + // some other error. we should definitely know about these + throw error; + } +}; + + +/***/ }), + +/***/ "./node_modules/react-is/cjs/react-is.development.js": +/*!***********************************************************!*\ + !*** ./node_modules/react-is/cjs/react-is.development.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v16.13.1 + * react-is.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + + + +if (true) { + (function() { +'use strict'; + +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var hasSymbol = typeof Symbol === 'function' && Symbol.for; +var REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7; +var REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca; +var REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb; +var REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc; +var REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2; +var REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd; +var REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary +// (unstable) APIs that have been removed. Can we remove the symbols? + +var REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf; +var REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf; +var REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0; +var REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1; +var REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8; +var REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3; +var REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4; +var REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9; +var REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5; +var REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6; +var REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7; + +function isValidElementType(type) { + return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill. + type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE); +} + +function typeOf(object) { + if (typeof object === 'object' && object !== null) { + var $$typeof = object.$$typeof; + + switch ($$typeof) { + case REACT_ELEMENT_TYPE: + var type = object.type; + + switch (type) { + case REACT_ASYNC_MODE_TYPE: + case REACT_CONCURRENT_MODE_TYPE: + case REACT_FRAGMENT_TYPE: + case REACT_PROFILER_TYPE: + case REACT_STRICT_MODE_TYPE: + case REACT_SUSPENSE_TYPE: + return type; + + default: + var $$typeofType = type && type.$$typeof; + + switch ($$typeofType) { + case REACT_CONTEXT_TYPE: + case REACT_FORWARD_REF_TYPE: + case REACT_LAZY_TYPE: + case REACT_MEMO_TYPE: + case REACT_PROVIDER_TYPE: + return $$typeofType; + + default: + return $$typeof; + } + + } + + case REACT_PORTAL_TYPE: + return $$typeof; + } + } + + return undefined; +} // AsyncMode is deprecated along with isAsyncMode + +var AsyncMode = REACT_ASYNC_MODE_TYPE; +var ConcurrentMode = REACT_CONCURRENT_MODE_TYPE; +var ContextConsumer = REACT_CONTEXT_TYPE; +var ContextProvider = REACT_PROVIDER_TYPE; +var Element = REACT_ELEMENT_TYPE; +var ForwardRef = REACT_FORWARD_REF_TYPE; +var Fragment = REACT_FRAGMENT_TYPE; +var Lazy = REACT_LAZY_TYPE; +var Memo = REACT_MEMO_TYPE; +var Portal = REACT_PORTAL_TYPE; +var Profiler = REACT_PROFILER_TYPE; +var StrictMode = REACT_STRICT_MODE_TYPE; +var Suspense = REACT_SUSPENSE_TYPE; +var hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated + +function isAsyncMode(object) { + { + if (!hasWarnedAboutDeprecatedIsAsyncMode) { + hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint + + console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.'); + } + } + + return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE; +} +function isConcurrentMode(object) { + return typeOf(object) === REACT_CONCURRENT_MODE_TYPE; +} +function isContextConsumer(object) { + return typeOf(object) === REACT_CONTEXT_TYPE; +} +function isContextProvider(object) { + return typeOf(object) === REACT_PROVIDER_TYPE; +} +function isElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} +function isForwardRef(object) { + return typeOf(object) === REACT_FORWARD_REF_TYPE; +} +function isFragment(object) { + return typeOf(object) === REACT_FRAGMENT_TYPE; +} +function isLazy(object) { + return typeOf(object) === REACT_LAZY_TYPE; +} +function isMemo(object) { + return typeOf(object) === REACT_MEMO_TYPE; +} +function isPortal(object) { + return typeOf(object) === REACT_PORTAL_TYPE; +} +function isProfiler(object) { + return typeOf(object) === REACT_PROFILER_TYPE; +} +function isStrictMode(object) { + return typeOf(object) === REACT_STRICT_MODE_TYPE; +} +function isSuspense(object) { + return typeOf(object) === REACT_SUSPENSE_TYPE; +} + +exports.AsyncMode = AsyncMode; +exports.ConcurrentMode = ConcurrentMode; +exports.ContextConsumer = ContextConsumer; +exports.ContextProvider = ContextProvider; +exports.Element = Element; +exports.ForwardRef = ForwardRef; +exports.Fragment = Fragment; +exports.Lazy = Lazy; +exports.Memo = Memo; +exports.Portal = Portal; +exports.Profiler = Profiler; +exports.StrictMode = StrictMode; +exports.Suspense = Suspense; +exports.isAsyncMode = isAsyncMode; +exports.isConcurrentMode = isConcurrentMode; +exports.isContextConsumer = isContextConsumer; +exports.isContextProvider = isContextProvider; +exports.isElement = isElement; +exports.isForwardRef = isForwardRef; +exports.isFragment = isFragment; +exports.isLazy = isLazy; +exports.isMemo = isMemo; +exports.isPortal = isPortal; +exports.isProfiler = isProfiler; +exports.isStrictMode = isStrictMode; +exports.isSuspense = isSuspense; +exports.isValidElementType = isValidElementType; +exports.typeOf = typeOf; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react-is/index.js": +/*!****************************************!*\ + !*** ./node_modules/react-is/index.js ***! + \****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-is.development.js */ "./node_modules/react-is/cjs/react-is.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react-popper/lib/esm/Manager.js": +/*!******************************************************!*\ + !*** ./node_modules/react-popper/lib/esm/Manager.js ***! + \******************************************************/ +/*! exports provided: ManagerReferenceNodeContext, ManagerReferenceNodeSetterContext, Manager */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ManagerReferenceNodeContext", function() { return ManagerReferenceNodeContext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ManagerReferenceNodeSetterContext", function() { return ManagerReferenceNodeSetterContext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Manager", function() { return Manager; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + +var ManagerReferenceNodeContext = react__WEBPACK_IMPORTED_MODULE_0__["createContext"](); +var ManagerReferenceNodeSetterContext = react__WEBPACK_IMPORTED_MODULE_0__["createContext"](); +function Manager(_ref) { + var children = _ref.children; + + var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__["useState"](null), + referenceNode = _React$useState[0], + setReferenceNode = _React$useState[1]; + + var hasUnmounted = react__WEBPACK_IMPORTED_MODULE_0__["useRef"](false); + react__WEBPACK_IMPORTED_MODULE_0__["useEffect"](function () { + return function () { + hasUnmounted.current = true; + }; + }, []); + var handleSetReferenceNode = react__WEBPACK_IMPORTED_MODULE_0__["useCallback"](function (node) { + if (!hasUnmounted.current) { + setReferenceNode(node); + } + }, []); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](ManagerReferenceNodeContext.Provider, { + value: referenceNode + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](ManagerReferenceNodeSetterContext.Provider, { + value: handleSetReferenceNode + }, children)); +} + +/***/ }), + +/***/ "./node_modules/react-popper/lib/esm/Popper.js": +/*!*****************************************************!*\ + !*** ./node_modules/react-popper/lib/esm/Popper.js ***! + \*****************************************************/ +/*! exports provided: Popper */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Popper", function() { return Popper; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _Manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Manager */ "./node_modules/react-popper/lib/esm/Manager.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./node_modules/react-popper/lib/esm/utils.js"); +/* harmony import */ var _usePopper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./usePopper */ "./node_modules/react-popper/lib/esm/usePopper.js"); + + + + + +var NOOP = function NOOP() { + return void 0; +}; + +var NOOP_PROMISE = function NOOP_PROMISE() { + return Promise.resolve(null); +}; + +var EMPTY_MODIFIERS = []; +function Popper(_ref) { + var _ref$placement = _ref.placement, + placement = _ref$placement === void 0 ? 'bottom' : _ref$placement, + _ref$strategy = _ref.strategy, + strategy = _ref$strategy === void 0 ? 'absolute' : _ref$strategy, + _ref$modifiers = _ref.modifiers, + modifiers = _ref$modifiers === void 0 ? EMPTY_MODIFIERS : _ref$modifiers, + referenceElement = _ref.referenceElement, + onFirstUpdate = _ref.onFirstUpdate, + innerRef = _ref.innerRef, + children = _ref.children; + var referenceNode = react__WEBPACK_IMPORTED_MODULE_0__["useContext"](_Manager__WEBPACK_IMPORTED_MODULE_1__["ManagerReferenceNodeContext"]); + + var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__["useState"](null), + popperElement = _React$useState[0], + setPopperElement = _React$useState[1]; + + var _React$useState2 = react__WEBPACK_IMPORTED_MODULE_0__["useState"](null), + arrowElement = _React$useState2[0], + setArrowElement = _React$useState2[1]; + + react__WEBPACK_IMPORTED_MODULE_0__["useEffect"](function () { + Object(_utils__WEBPACK_IMPORTED_MODULE_2__["setRef"])(innerRef, popperElement); + }, [innerRef, popperElement]); + var options = react__WEBPACK_IMPORTED_MODULE_0__["useMemo"](function () { + return { + placement: placement, + strategy: strategy, + onFirstUpdate: onFirstUpdate, + modifiers: [].concat(modifiers, [{ + name: 'arrow', + enabled: arrowElement != null, + options: { + element: arrowElement + } + }]) + }; + }, [placement, strategy, onFirstUpdate, modifiers, arrowElement]); + + var _usePopper = Object(_usePopper__WEBPACK_IMPORTED_MODULE_3__["usePopper"])(referenceElement || referenceNode, popperElement, options), + state = _usePopper.state, + styles = _usePopper.styles, + forceUpdate = _usePopper.forceUpdate, + update = _usePopper.update; + + var childrenProps = react__WEBPACK_IMPORTED_MODULE_0__["useMemo"](function () { + return { + ref: setPopperElement, + style: styles.popper, + placement: state ? state.placement : placement, + hasPopperEscaped: state && state.modifiersData.hide ? state.modifiersData.hide.hasPopperEscaped : null, + isReferenceHidden: state && state.modifiersData.hide ? state.modifiersData.hide.isReferenceHidden : null, + arrowProps: { + style: styles.arrow, + ref: setArrowElement + }, + forceUpdate: forceUpdate || NOOP, + update: update || NOOP_PROMISE + }; + }, [setPopperElement, setArrowElement, placement, state, styles, update, forceUpdate]); + return Object(_utils__WEBPACK_IMPORTED_MODULE_2__["unwrapArray"])(children)(childrenProps); +} + +/***/ }), + +/***/ "./node_modules/react-popper/lib/esm/Reference.js": +/*!********************************************************!*\ + !*** ./node_modules/react-popper/lib/esm/Reference.js ***! + \********************************************************/ +/*! exports provided: Reference */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Reference", function() { return Reference; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var warning__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! warning */ "./node_modules/warning/warning.js"); +/* harmony import */ var warning__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(warning__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _Manager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Manager */ "./node_modules/react-popper/lib/esm/Manager.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./node_modules/react-popper/lib/esm/utils.js"); + + + + +function Reference(_ref) { + var children = _ref.children, + innerRef = _ref.innerRef; + var setReferenceNode = react__WEBPACK_IMPORTED_MODULE_0__["useContext"](_Manager__WEBPACK_IMPORTED_MODULE_2__["ManagerReferenceNodeSetterContext"]); + var refHandler = react__WEBPACK_IMPORTED_MODULE_0__["useCallback"](function (node) { + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["setRef"])(innerRef, node); + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["safeInvoke"])(setReferenceNode, node); + }, [innerRef, setReferenceNode]); // ran on unmount + + react__WEBPACK_IMPORTED_MODULE_0__["useEffect"](function () { + return function () { + return Object(_utils__WEBPACK_IMPORTED_MODULE_3__["setRef"])(innerRef, null); + }; + }); + react__WEBPACK_IMPORTED_MODULE_0__["useEffect"](function () { + warning__WEBPACK_IMPORTED_MODULE_1___default()(Boolean(setReferenceNode), '`Reference` should not be used outside of a `Manager` component.'); + }, [setReferenceNode]); + return Object(_utils__WEBPACK_IMPORTED_MODULE_3__["unwrapArray"])(children)({ + ref: refHandler + }); +} + +/***/ }), + +/***/ "./node_modules/react-popper/lib/esm/index.js": +/*!****************************************************!*\ + !*** ./node_modules/react-popper/lib/esm/index.js ***! + \****************************************************/ +/*! exports provided: Popper, Manager, Reference, usePopper */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Popper__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popper */ "./node_modules/react-popper/lib/esm/Popper.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Popper", function() { return _Popper__WEBPACK_IMPORTED_MODULE_0__["Popper"]; }); + +/* harmony import */ var _Manager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Manager */ "./node_modules/react-popper/lib/esm/Manager.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Manager", function() { return _Manager__WEBPACK_IMPORTED_MODULE_1__["Manager"]; }); + +/* harmony import */ var _Reference__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Reference */ "./node_modules/react-popper/lib/esm/Reference.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reference", function() { return _Reference__WEBPACK_IMPORTED_MODULE_2__["Reference"]; }); + +/* harmony import */ var _usePopper__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./usePopper */ "./node_modules/react-popper/lib/esm/usePopper.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "usePopper", function() { return _usePopper__WEBPACK_IMPORTED_MODULE_3__["usePopper"]; }); + +// Public components + + + + + // Public types + +/***/ }), + +/***/ "./node_modules/react-popper/lib/esm/usePopper.js": +/*!********************************************************!*\ + !*** ./node_modules/react-popper/lib/esm/usePopper.js ***! + \********************************************************/ +/*! exports provided: usePopper */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "usePopper", function() { return usePopper; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _popperjs_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js"); +/* harmony import */ var react_fast_compare__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-fast-compare */ "./node_modules/react-fast-compare/index.js"); +/* harmony import */ var react_fast_compare__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_fast_compare__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./node_modules/react-popper/lib/esm/utils.js"); + + + + +var EMPTY_MODIFIERS = []; +var usePopper = function usePopper(referenceElement, popperElement, options) { + if (options === void 0) { + options = {}; + } + + var prevOptions = react__WEBPACK_IMPORTED_MODULE_0__["useRef"](null); + var optionsWithDefaults = { + onFirstUpdate: options.onFirstUpdate, + placement: options.placement || 'bottom', + strategy: options.strategy || 'absolute', + modifiers: options.modifiers || EMPTY_MODIFIERS + }; + + var _React$useState = react__WEBPACK_IMPORTED_MODULE_0__["useState"]({ + styles: { + popper: { + position: optionsWithDefaults.strategy, + left: '0', + top: '0' + }, + arrow: { + position: 'absolute' + } + }, + attributes: {} + }), + state = _React$useState[0], + setState = _React$useState[1]; + + var updateStateModifier = react__WEBPACK_IMPORTED_MODULE_0__["useMemo"](function () { + return { + name: 'updateState', + enabled: true, + phase: 'write', + fn: function fn(_ref) { + var state = _ref.state; + var elements = Object.keys(state.elements); + setState({ + styles: Object(_utils__WEBPACK_IMPORTED_MODULE_3__["fromEntries"])(elements.map(function (element) { + return [element, state.styles[element] || {}]; + })), + attributes: Object(_utils__WEBPACK_IMPORTED_MODULE_3__["fromEntries"])(elements.map(function (element) { + return [element, state.attributes[element]]; + })) + }); + }, + requires: ['computeStyles'] + }; + }, []); + var popperOptions = react__WEBPACK_IMPORTED_MODULE_0__["useMemo"](function () { + var newOptions = { + onFirstUpdate: optionsWithDefaults.onFirstUpdate, + placement: optionsWithDefaults.placement, + strategy: optionsWithDefaults.strategy, + modifiers: [].concat(optionsWithDefaults.modifiers, [updateStateModifier, { + name: 'applyStyles', + enabled: false + }]) + }; + + if (react_fast_compare__WEBPACK_IMPORTED_MODULE_2___default()(prevOptions.current, newOptions)) { + return prevOptions.current || newOptions; + } else { + prevOptions.current = newOptions; + return newOptions; + } + }, [optionsWithDefaults.onFirstUpdate, optionsWithDefaults.placement, optionsWithDefaults.strategy, optionsWithDefaults.modifiers, updateStateModifier]); + var popperInstanceRef = react__WEBPACK_IMPORTED_MODULE_0__["useRef"](); + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["useIsomorphicLayoutEffect"])(function () { + if (popperInstanceRef.current) { + popperInstanceRef.current.setOptions(popperOptions); + } + }, [popperOptions]); + Object(_utils__WEBPACK_IMPORTED_MODULE_3__["useIsomorphicLayoutEffect"])(function () { + if (referenceElement == null || popperElement == null) { + return; + } + + var createPopper = options.createPopper || _popperjs_core__WEBPACK_IMPORTED_MODULE_1__["createPopper"]; + var popperInstance = createPopper(referenceElement, popperElement, popperOptions); + popperInstanceRef.current = popperInstance; + return function () { + popperInstance.destroy(); + popperInstanceRef.current = null; + }; + }, [referenceElement, popperElement, options.createPopper]); + return { + state: popperInstanceRef.current ? popperInstanceRef.current.state : null, + styles: state.styles, + attributes: state.attributes, + update: popperInstanceRef.current ? popperInstanceRef.current.update : null, + forceUpdate: popperInstanceRef.current ? popperInstanceRef.current.forceUpdate : null + }; +}; + +/***/ }), + +/***/ "./node_modules/react-popper/lib/esm/utils.js": +/*!****************************************************!*\ + !*** ./node_modules/react-popper/lib/esm/utils.js ***! + \****************************************************/ +/*! exports provided: unwrapArray, safeInvoke, setRef, fromEntries, useIsomorphicLayoutEffect */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unwrapArray", function() { return unwrapArray; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "safeInvoke", function() { return safeInvoke; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setRef", function() { return setRef; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEntries", function() { return fromEntries; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useIsomorphicLayoutEffect", function() { return useIsomorphicLayoutEffect; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); + + +/** + * Takes an argument and if it's an array, returns the first item in the array, + * otherwise returns the argument. Used for Preact compatibility. + */ +var unwrapArray = function unwrapArray(arg) { + return Array.isArray(arg) ? arg[0] : arg; +}; +/** + * Takes a maybe-undefined function and arbitrary args and invokes the function + * only if it is defined. + */ + +var safeInvoke = function safeInvoke(fn) { + if (typeof fn === 'function') { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return fn.apply(void 0, args); + } +}; +/** + * Sets a ref using either a ref callback or a ref object + */ + +var setRef = function setRef(ref, node) { + // if its a function call it + if (typeof ref === 'function') { + return safeInvoke(ref, node); + } // otherwise we should treat it as a ref object + else if (ref != null) { + ref.current = node; + } +}; +/** + * Simple ponyfill for Object.fromEntries + */ + +var fromEntries = function fromEntries(entries) { + return entries.reduce(function (acc, _ref) { + var key = _ref[0], + value = _ref[1]; + acc[key] = value; + return acc; + }, {}); +}; +/** + * Small wrapper around `useLayoutEffect` to get rid of the warning on SSR envs + */ + +var useIsomorphicLayoutEffect = typeof window !== 'undefined' && window.document && window.document.createElement ? react__WEBPACK_IMPORTED_MODULE_0__["useLayoutEffect"] : react__WEBPACK_IMPORTED_MODULE_0__["useEffect"]; + +/***/ }), + +/***/ "./node_modules/react/cjs/react-jsx-dev-runtime.development.js": +/*!*********************************************************************!*\ + !*** ./node_modules/react/cjs/react-jsx-dev-runtime.development.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react-jsx-dev-runtime.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var React = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +exports.Fragment = 0xeacb; +var REACT_STRICT_MODE_TYPE = 0xeacc; +var REACT_PROFILER_TYPE = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +var REACT_SUSPENSE_TYPE = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + exports.Fragment = symbolFor('react.fragment'); + REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); + REACT_PROFILER_TYPE = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; + +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableScopeAPI = false; // Experimental Create Event Handle API. + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === exports.Fragment || type === REACT_PROFILER_TYPE || type === REACT_DEBUG_TRACING_MODE_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { + return true; + } + } + + return false; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case exports.Fragment: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case REACT_PROFILER_TYPE: + return 'Profiler'; + + case REACT_STRICT_MODE_TYPE: + return 'StrictMode'; + + case REACT_SUSPENSE_TYPE: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case REACT_SUSPENSE_TYPE: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown; +var specialPropRefWarningShown; +var didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function warnIfStringRefCannotBeAutoConverted(config, self) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && self && ReactCurrentOwner.current.stateNode !== self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} + +function defineKeyPropWarningGetter(props, displayName) { + { + var warnAboutAccessingKey = function () { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); + } +} + +function defineRefPropWarningGetter(props, displayName) { + { + var warnAboutAccessingRef = function () { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * https://github.com/reactjs/rfcs/pull/107 + * @param {*} type + * @param {object} props + * @param {string} key + */ + +function jsxDEV(type, config, maybeKey, source, self) { + { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; // Currently, key can be spread in as a prop. This causes a potential + // issue if key is also explicitly declared (ie. <div {...props} key="Hi" /> + // or <div key="Hi" {...props} /> ). We want to deprecate key spread, + // but as an intermediary step, we will use jsxDEV for everything except + // <div {...props} key="Hi" />, because we aren't currently able to tell if + // key is explicitly declared to be undefined or not. + + if (maybeKey !== undefined) { + key = '' + maybeKey; + } + + if (hasValidKey(config)) { + key = '' + config.key; + } + + if (hasValidRef(config)) { + ref = config.ref; + warnIfStringRefCannotBeAutoConverted(config, self); + } // Remaining properties are added to a new props object + + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); + } +} + +var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; + } +} + +function getDeclarationErrorAddendum() { + { + if (ReactCurrentOwner$1.current) { + var name = getComponentName(ReactCurrentOwner$1.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; + } +} + +function getSourceInfoErrorAddendum(source) { + { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; + } +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; + } +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner$1.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + } + + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + { + if (typeof node !== 'object') { + return; + } + + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentName(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentName(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} + +function jsxWithValidation(type, props, key, isStaticChildren, source, self) { + { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendum(source); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + error('React.jsx: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + + var element = jsxDEV(type, props, key, source, self); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + var children = props.children; + + if (children !== undefined) { + if (isStaticChildren) { + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + validateChildKeys(children[i], type); + } + + if (Object.freeze) { + Object.freeze(children); + } + } else { + error('React.jsx: Static children should always be an array. ' + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + 'Use the Babel transform instead.'); + } + } else { + validateChildKeys(children, type); + } + } + } + + if (type === exports.Fragment) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; + } +} // These two functions exist to still get child warnings in dev + +var jsxDEV$1 = jsxWithValidation ; + +exports.jsxDEV = jsxDEV$1; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react/cjs/react.development.js": +/*!*****************************************************!*\ + !*** ./node_modules/react/cjs/react.development.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v17.0.2 + * react.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var _assign = __webpack_require__(/*! object-assign */ "./node_modules/next/dist/build/polyfills/object-assign.js"); + +// TODO: this is special because it gets imported during build. +var ReactVersion = '17.0.2'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +exports.Fragment = 0xeacb; +exports.StrictMode = 0xeacc; +exports.Profiler = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +exports.Suspense = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + exports.Fragment = symbolFor('react.fragment'); + exports.StrictMode = symbolFor('react.strict_mode'); + exports.Profiler = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + exports.Suspense = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; +var FAUX_ITERATOR_SYMBOL = '@@iterator'; +function getIteratorFn(maybeIterable) { + if (maybeIterable === null || typeof maybeIterable !== 'object') { + return null; + } + + var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]; + + if (typeof maybeIterator === 'function') { + return maybeIterator; + } + + return null; +} + +/** + * Keeps track of the current dispatcher. + */ +var ReactCurrentDispatcher = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +/** + * Keeps track of the current batch's configuration such as how long an update + * should suspend for if it needs to. + */ +var ReactCurrentBatchConfig = { + transition: 0 +}; + +/** + * Keeps track of the current owner. + * + * The current owner is the component who should own any components that are + * currently being constructed. + */ +var ReactCurrentOwner = { + /** + * @internal + * @type {ReactComponent} + */ + current: null +}; + +var ReactDebugCurrentFrame = {}; +var currentExtraStackFrame = null; +function setExtraStackFrame(stack) { + { + currentExtraStackFrame = stack; + } +} + +{ + ReactDebugCurrentFrame.setExtraStackFrame = function (stack) { + { + currentExtraStackFrame = stack; + } + }; // Stack implementation injected by the current renderer. + + + ReactDebugCurrentFrame.getCurrentStack = null; + + ReactDebugCurrentFrame.getStackAddendum = function () { + var stack = ''; // Add an extra top frame while an element is being validated + + if (currentExtraStackFrame) { + stack += currentExtraStackFrame; + } // Delegate to the injected renderer-specific implementation + + + var impl = ReactDebugCurrentFrame.getCurrentStack; + + if (impl) { + stack += impl() || ''; + } + + return stack; + }; +} + +/** + * Used by act() to track whether you're inside an act() scope. + */ +var IsSomeRendererActing = { + current: false +}; + +var ReactSharedInternals = { + ReactCurrentDispatcher: ReactCurrentDispatcher, + ReactCurrentBatchConfig: ReactCurrentBatchConfig, + ReactCurrentOwner: ReactCurrentOwner, + IsSomeRendererActing: IsSomeRendererActing, + // Used by renderers to avoid bundling object-assign twice in UMD bundles: + assign: _assign +}; + +{ + ReactSharedInternals.ReactDebugCurrentFrame = ReactDebugCurrentFrame; +} + +// by calls to these methods by a Babel plugin. +// +// In PROD (or in packages without access to React internals), +// they are left as they are instead. + +function warn(format) { + { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + printWarning('warn', format, args); + } +} +function error(format) { + { + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + printWarning('error', format, args); + } +} + +function printWarning(level, format, args) { + // When changing this logic, you might want to also + // update consoleWithStackDev.www.js as well. + { + var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; + var stack = ReactDebugCurrentFrame.getStackAddendum(); + + if (stack !== '') { + format += '%s'; + args = args.concat([stack]); + } + + var argsWithFormat = args.map(function (item) { + return '' + item; + }); // Careful: RN currently depends on this prefix + + argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it + // breaks IE9: https://github.com/facebook/react/issues/13610 + // eslint-disable-next-line react-internal/no-production-logging + + Function.prototype.apply.call(console[level], console, argsWithFormat); + } +} + +var didWarnStateUpdateForUnmountedComponent = {}; + +function warnNoop(publicInstance, callerName) { + { + var _constructor = publicInstance.constructor; + var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass'; + var warningKey = componentName + "." + callerName; + + if (didWarnStateUpdateForUnmountedComponent[warningKey]) { + return; + } + + error("Can't call %s on a component that is not yet mounted. " + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName); + + didWarnStateUpdateForUnmountedComponent[warningKey] = true; + } +} +/** + * This is the abstract API for an update queue. + */ + + +var ReactNoopUpdateQueue = { + /** + * Checks whether or not this composite component is mounted. + * @param {ReactClass} publicInstance The instance we want to test. + * @return {boolean} True if mounted, false otherwise. + * @protected + * @final + */ + isMounted: function (publicInstance) { + return false; + }, + + /** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueForceUpdate: function (publicInstance, callback, callerName) { + warnNoop(publicInstance, 'forceUpdate'); + }, + + /** + * Replaces all of the state. Always use this or `setState` to mutate state. + * You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} completeState Next state. + * @param {?function} callback Called after component is updated. + * @param {?string} callerName name of the calling function in the public API. + * @internal + */ + enqueueReplaceState: function (publicInstance, completeState, callback, callerName) { + warnNoop(publicInstance, 'replaceState'); + }, + + /** + * Sets a subset of the state. This only exists because _pendingState is + * internal. This provides a merging strategy that is not available to deep + * properties which is confusing. TODO: Expose pendingState or don't use it + * during the merge. + * + * @param {ReactClass} publicInstance The instance that should rerender. + * @param {object} partialState Next partial state to be merged with state. + * @param {?function} callback Called after component is updated. + * @param {?string} Name of the calling function in the public API. + * @internal + */ + enqueueSetState: function (publicInstance, partialState, callback, callerName) { + warnNoop(publicInstance, 'setState'); + } +}; + +var emptyObject = {}; + +{ + Object.freeze(emptyObject); +} +/** + * Base class helpers for the updating state of a component. + */ + + +function Component(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the + // renderer. + + this.updater = updater || ReactNoopUpdateQueue; +} + +Component.prototype.isReactComponent = {}; +/** + * Sets a subset of the state. Always use this to mutate + * state. You should treat `this.state` as immutable. + * + * There is no guarantee that `this.state` will be immediately updated, so + * accessing `this.state` after calling this method may return the old value. + * + * There is no guarantee that calls to `setState` will run synchronously, + * as they may eventually be batched together. You can provide an optional + * callback that will be executed when the call to setState is actually + * completed. + * + * When a function is provided to setState, it will be called at some point in + * the future (not synchronously). It will be called with the up to date + * component arguments (state, props, context). These values can be different + * from this.* because your function may be called after receiveProps but before + * shouldComponentUpdate, and this new state, props, and context will not yet be + * assigned to this. + * + * @param {object|function} partialState Next partial state or function to + * produce next partial state to be merged with current state. + * @param {?function} callback Called after state is updated. + * @final + * @protected + */ + +Component.prototype.setState = function (partialState, callback) { + if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) { + { + throw Error( "setState(...): takes an object of state variables to update or a function which returns an object of state variables." ); + } + } + + this.updater.enqueueSetState(this, partialState, callback, 'setState'); +}; +/** + * Forces an update. This should only be invoked when it is known with + * certainty that we are **not** in a DOM transaction. + * + * You may want to call this when you know that some deeper aspect of the + * component's state has changed but `setState` was not called. + * + * This will not invoke `shouldComponentUpdate`, but it will invoke + * `componentWillUpdate` and `componentDidUpdate`. + * + * @param {?function} callback Called after update is complete. + * @final + * @protected + */ + + +Component.prototype.forceUpdate = function (callback) { + this.updater.enqueueForceUpdate(this, callback, 'forceUpdate'); +}; +/** + * Deprecated APIs. These APIs used to exist on classic React classes but since + * we would like to deprecate them, we're not going to move them over to this + * modern base class. Instead, we define a getter that warns if it's accessed. + */ + + +{ + var deprecatedAPIs = { + isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'], + replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).'] + }; + + var defineDeprecationWarning = function (methodName, info) { + Object.defineProperty(Component.prototype, methodName, { + get: function () { + warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); + + return undefined; + } + }); + }; + + for (var fnName in deprecatedAPIs) { + if (deprecatedAPIs.hasOwnProperty(fnName)) { + defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); + } + } +} + +function ComponentDummy() {} + +ComponentDummy.prototype = Component.prototype; +/** + * Convenience component with default shallow equality check for sCU. + */ + +function PureComponent(props, context, updater) { + this.props = props; + this.context = context; // If a component has string refs, we will assign a different object later. + + this.refs = emptyObject; + this.updater = updater || ReactNoopUpdateQueue; +} + +var pureComponentPrototype = PureComponent.prototype = new ComponentDummy(); +pureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods. + +_assign(pureComponentPrototype, Component.prototype); + +pureComponentPrototype.isPureReactComponent = true; + +// an immutable object with a single mutable value +function createRef() { + var refObject = { + current: null + }; + + { + Object.seal(refObject); + } + + return refObject; +} + +function getWrappedName(outerType, innerType, wrapperName) { + var functionName = innerType.displayName || innerType.name || ''; + return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName); +} + +function getContextName(type) { + return type.displayName || 'Context'; +} + +function getComponentName(type) { + if (type == null) { + // Host root, text node or just invalid type. + return null; + } + + { + if (typeof type.tag === 'number') { + error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.'); + } + } + + if (typeof type === 'function') { + return type.displayName || type.name || null; + } + + if (typeof type === 'string') { + return type; + } + + switch (type) { + case exports.Fragment: + return 'Fragment'; + + case REACT_PORTAL_TYPE: + return 'Portal'; + + case exports.Profiler: + return 'Profiler'; + + case exports.StrictMode: + return 'StrictMode'; + + case exports.Suspense: + return 'Suspense'; + + case REACT_SUSPENSE_LIST_TYPE: + return 'SuspenseList'; + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_CONTEXT_TYPE: + var context = type; + return getContextName(context) + '.Consumer'; + + case REACT_PROVIDER_TYPE: + var provider = type; + return getContextName(provider._context) + '.Provider'; + + case REACT_FORWARD_REF_TYPE: + return getWrappedName(type, type.render, 'ForwardRef'); + + case REACT_MEMO_TYPE: + return getComponentName(type.type); + + case REACT_BLOCK_TYPE: + return getComponentName(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + return getComponentName(init(payload)); + } catch (x) { + return null; + } + } + } + } + + return null; +} + +var hasOwnProperty = Object.prototype.hasOwnProperty; +var RESERVED_PROPS = { + key: true, + ref: true, + __self: true, + __source: true +}; +var specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs; + +{ + didWarnAboutStringRefs = {}; +} + +function hasValidRef(config) { + { + if (hasOwnProperty.call(config, 'ref')) { + var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.ref !== undefined; +} + +function hasValidKey(config) { + { + if (hasOwnProperty.call(config, 'key')) { + var getter = Object.getOwnPropertyDescriptor(config, 'key').get; + + if (getter && getter.isReactWarning) { + return false; + } + } + } + + return config.key !== undefined; +} + +function defineKeyPropWarningGetter(props, displayName) { + var warnAboutAccessingKey = function () { + { + if (!specialPropKeyWarningShown) { + specialPropKeyWarningShown = true; + + error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingKey.isReactWarning = true; + Object.defineProperty(props, 'key', { + get: warnAboutAccessingKey, + configurable: true + }); +} + +function defineRefPropWarningGetter(props, displayName) { + var warnAboutAccessingRef = function () { + { + if (!specialPropRefWarningShown) { + specialPropRefWarningShown = true; + + error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://reactjs.org/link/special-props)', displayName); + } + } + }; + + warnAboutAccessingRef.isReactWarning = true; + Object.defineProperty(props, 'ref', { + get: warnAboutAccessingRef, + configurable: true + }); +} + +function warnIfStringRefCannotBeAutoConverted(config) { + { + if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) { + var componentName = getComponentName(ReactCurrentOwner.current.type); + + if (!didWarnAboutStringRefs[componentName]) { + error('Component "%s" contains the string ref "%s". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref', componentName, config.ref); + + didWarnAboutStringRefs[componentName] = true; + } + } + } +} +/** + * Factory method to create a new React element. This no longer adheres to + * the class pattern, so do not use new to call it. Also, instanceof check + * will not work. Instead test $$typeof field against Symbol.for('react.element') to check + * if something is a React Element. + * + * @param {*} type + * @param {*} props + * @param {*} key + * @param {string|object} ref + * @param {*} owner + * @param {*} self A *temporary* helper to detect places where `this` is + * different from the `owner` when React.createElement is called, so that we + * can warn. We want to get rid of owner and replace string `ref`s with arrow + * functions, and as long as `this` and owner are the same, there will be no + * change in behavior. + * @param {*} source An annotation object (added by a transpiler or otherwise) + * indicating filename, line number, and/or other information. + * @internal + */ + + +var ReactElement = function (type, key, ref, self, source, owner, props) { + var element = { + // This tag allows us to uniquely identify this as a React Element + $$typeof: REACT_ELEMENT_TYPE, + // Built-in properties that belong on the element + type: type, + key: key, + ref: ref, + props: props, + // Record the component responsible for creating this element. + _owner: owner + }; + + { + // The validation flag is currently mutative. We put it on + // an external backing store so that we can freeze the whole object. + // This can be replaced with a WeakMap once they are implemented in + // commonly used development environments. + element._store = {}; // To make comparing ReactElements easier for testing purposes, we make + // the validation flag non-enumerable (where possible, which should + // include every environment we run tests in), so the test framework + // ignores it. + + Object.defineProperty(element._store, 'validated', { + configurable: false, + enumerable: false, + writable: true, + value: false + }); // self and source are DEV only properties. + + Object.defineProperty(element, '_self', { + configurable: false, + enumerable: false, + writable: false, + value: self + }); // Two elements created in two different places should be considered + // equal for testing purposes and therefore we hide it from enumeration. + + Object.defineProperty(element, '_source', { + configurable: false, + enumerable: false, + writable: false, + value: source + }); + + if (Object.freeze) { + Object.freeze(element.props); + Object.freeze(element); + } + } + + return element; +}; +/** + * Create and return a new ReactElement of the given type. + * See https://reactjs.org/docs/react-api.html#createelement + */ + +function createElement(type, config, children) { + var propName; // Reserved names are extracted + + var props = {}; + var key = null; + var ref = null; + var self = null; + var source = null; + + if (config != null) { + if (hasValidRef(config)) { + ref = config.ref; + + { + warnIfStringRefCannotBeAutoConverted(config); + } + } + + if (hasValidKey(config)) { + key = '' + config.key; + } + + self = config.__self === undefined ? null : config.__self; + source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + props[propName] = config[propName]; + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + { + if (Object.freeze) { + Object.freeze(childArray); + } + } + + props.children = childArray; + } // Resolve default props + + + if (type && type.defaultProps) { + var defaultProps = type.defaultProps; + + for (propName in defaultProps) { + if (props[propName] === undefined) { + props[propName] = defaultProps[propName]; + } + } + } + + { + if (key || ref) { + var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; + + if (key) { + defineKeyPropWarningGetter(props, displayName); + } + + if (ref) { + defineRefPropWarningGetter(props, displayName); + } + } + } + + return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); +} +function cloneAndReplaceKey(oldElement, newKey) { + var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); + return newElement; +} +/** + * Clone and return a new ReactElement using element as the starting point. + * See https://reactjs.org/docs/react-api.html#cloneelement + */ + +function cloneElement(element, config, children) { + if (!!(element === null || element === undefined)) { + { + throw Error( "React.cloneElement(...): The argument must be a React element, but you passed " + element + "." ); + } + } + + var propName; // Original props are copied + + var props = _assign({}, element.props); // Reserved names are extracted + + + var key = element.key; + var ref = element.ref; // Self is preserved since the owner is preserved. + + var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a + // transpiler, and the original source is probably a better indicator of the + // true owner. + + var source = element._source; // Owner will be preserved, unless ref is overridden + + var owner = element._owner; + + if (config != null) { + if (hasValidRef(config)) { + // Silently steal the ref from the parent. + ref = config.ref; + owner = ReactCurrentOwner.current; + } + + if (hasValidKey(config)) { + key = '' + config.key; + } // Remaining properties override existing props + + + var defaultProps; + + if (element.type && element.type.defaultProps) { + defaultProps = element.type.defaultProps; + } + + for (propName in config) { + if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { + if (config[propName] === undefined && defaultProps !== undefined) { + // Resolve default props + props[propName] = defaultProps[propName]; + } else { + props[propName] = config[propName]; + } + } + } + } // Children can be more than one argument, and those are transferred onto + // the newly allocated props object. + + + var childrenLength = arguments.length - 2; + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 2]; + } + + props.children = childArray; + } + + return ReactElement(element.type, key, ref, self, source, owner, props); +} +/** + * Verifies the object is a ReactElement. + * See https://reactjs.org/docs/react-api.html#isvalidelement + * @param {?object} object + * @return {boolean} True if `object` is a ReactElement. + * @final + */ + +function isValidElement(object) { + return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; +} + +var SEPARATOR = '.'; +var SUBSEPARATOR = ':'; +/** + * Escape and wrap key so it is safe to use as a reactid + * + * @param {string} key to be escaped. + * @return {string} the escaped key. + */ + +function escape(key) { + var escapeRegex = /[=:]/g; + var escaperLookup = { + '=': '=0', + ':': '=2' + }; + var escapedString = key.replace(escapeRegex, function (match) { + return escaperLookup[match]; + }); + return '$' + escapedString; +} +/** + * TODO: Test that a single child and an array with one item have the same key + * pattern. + */ + + +var didWarnAboutMaps = false; +var userProvidedKeyEscapeRegex = /\/+/g; + +function escapeUserProvidedKey(text) { + return text.replace(userProvidedKeyEscapeRegex, '$&/'); +} +/** + * Generate a key string that identifies a element within a set. + * + * @param {*} element A element that could contain a manual key. + * @param {number} index Index that is used if a manual key is not provided. + * @return {string} + */ + + +function getElementKey(element, index) { + // Do some typechecking here since we call this blindly. We want to ensure + // that we don't block potential future ES APIs. + if (typeof element === 'object' && element !== null && element.key != null) { + // Explicit key + return escape('' + element.key); + } // Implicit key determined by the index in the set + + + return index.toString(36); +} + +function mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) { + var type = typeof children; + + if (type === 'undefined' || type === 'boolean') { + // All of the above are perceived as null. + children = null; + } + + var invokeCallback = false; + + if (children === null) { + invokeCallback = true; + } else { + switch (type) { + case 'string': + case 'number': + invokeCallback = true; + break; + + case 'object': + switch (children.$$typeof) { + case REACT_ELEMENT_TYPE: + case REACT_PORTAL_TYPE: + invokeCallback = true; + } + + } + } + + if (invokeCallback) { + var _child = children; + var mappedChild = callback(_child); // If it's the only child, treat the name as if it was wrapped in an array + // so that it's consistent if the number of children grows: + + var childKey = nameSoFar === '' ? SEPARATOR + getElementKey(_child, 0) : nameSoFar; + + if (Array.isArray(mappedChild)) { + var escapedChildKey = ''; + + if (childKey != null) { + escapedChildKey = escapeUserProvidedKey(childKey) + '/'; + } + + mapIntoArray(mappedChild, array, escapedChildKey, '', function (c) { + return c; + }); + } else if (mappedChild != null) { + if (isValidElement(mappedChild)) { + mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as + // traverseAllChildren used to do for objects as children + escapedPrefix + ( // $FlowFixMe Flow incorrectly thinks React.Portal doesn't have a key + mappedChild.key && (!_child || _child.key !== mappedChild.key) ? // $FlowFixMe Flow incorrectly thinks existing element's key can be a number + escapeUserProvidedKey('' + mappedChild.key) + '/' : '') + childKey); + } + + array.push(mappedChild); + } + + return 1; + } + + var child; + var nextName; + var subtreeCount = 0; // Count of children found in the current subtree. + + var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; + + if (Array.isArray(children)) { + for (var i = 0; i < children.length; i++) { + child = children[i]; + nextName = nextNamePrefix + getElementKey(child, i); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else { + var iteratorFn = getIteratorFn(children); + + if (typeof iteratorFn === 'function') { + var iterableChildren = children; + + { + // Warn about using Maps as children + if (iteratorFn === iterableChildren.entries) { + if (!didWarnAboutMaps) { + warn('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.'); + } + + didWarnAboutMaps = true; + } + } + + var iterator = iteratorFn.call(iterableChildren); + var step; + var ii = 0; + + while (!(step = iterator.next()).done) { + child = step.value; + nextName = nextNamePrefix + getElementKey(child, ii++); + subtreeCount += mapIntoArray(child, array, escapedPrefix, nextName, callback); + } + } else if (type === 'object') { + var childrenString = '' + children; + + { + { + throw Error( "Objects are not valid as a React child (found: " + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + "). If you meant to render a collection of children, use an array instead." ); + } + } + } + } + + return subtreeCount; +} + +/** + * Maps children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenmap + * + * The provided mapFunction(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} func The map function. + * @param {*} context Context for mapFunction. + * @return {object} Object containing the ordered map of results. + */ +function mapChildren(children, func, context) { + if (children == null) { + return children; + } + + var result = []; + var count = 0; + mapIntoArray(children, result, '', '', function (child) { + return func.call(context, child, count++); + }); + return result; +} +/** + * Count the number of children that are typically specified as + * `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrencount + * + * @param {?*} children Children tree container. + * @return {number} The number of children. + */ + + +function countChildren(children) { + var n = 0; + mapChildren(children, function () { + n++; // Don't return anything + }); + return n; +} + +/** + * Iterates through children that are typically specified as `props.children`. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenforeach + * + * The provided forEachFunc(child, index) will be called for each + * leaf child. + * + * @param {?*} children Children tree container. + * @param {function(*, int)} forEachFunc + * @param {*} forEachContext Context for forEachContext. + */ +function forEachChildren(children, forEachFunc, forEachContext) { + mapChildren(children, function () { + forEachFunc.apply(this, arguments); // Don't return anything. + }, forEachContext); +} +/** + * Flatten a children object (typically specified as `props.children`) and + * return an array with appropriately re-keyed children. + * + * See https://reactjs.org/docs/react-api.html#reactchildrentoarray + */ + + +function toArray(children) { + return mapChildren(children, function (child) { + return child; + }) || []; +} +/** + * Returns the first child in a collection of children and verifies that there + * is only one child in the collection. + * + * See https://reactjs.org/docs/react-api.html#reactchildrenonly + * + * The current implementation of this function assumes that a single child gets + * passed without a wrapper, but the purpose of this helper function is to + * abstract away the particular structure of children. + * + * @param {?object} children Child collection structure. + * @return {ReactElement} The first and only `ReactElement` contained in the + * structure. + */ + + +function onlyChild(children) { + if (!isValidElement(children)) { + { + throw Error( "React.Children.only expected to receive a single React element child." ); + } + } + + return children; +} + +function createContext(defaultValue, calculateChangedBits) { + if (calculateChangedBits === undefined) { + calculateChangedBits = null; + } else { + { + if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') { + error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits); + } + } + } + + var context = { + $$typeof: REACT_CONTEXT_TYPE, + _calculateChangedBits: calculateChangedBits, + // As a workaround to support multiple concurrent renderers, we categorize + // some renderers as primary and others as secondary. We only expect + // there to be two concurrent renderers at most: React Native (primary) and + // Fabric (secondary); React DOM (primary) and React ART (secondary). + // Secondary renderers store their context values on separate fields. + _currentValue: defaultValue, + _currentValue2: defaultValue, + // Used to track how many concurrent renderers this context currently + // supports within in a single renderer. Such as parallel server rendering. + _threadCount: 0, + // These are circular + Provider: null, + Consumer: null + }; + context.Provider = { + $$typeof: REACT_PROVIDER_TYPE, + _context: context + }; + var hasWarnedAboutUsingNestedContextConsumers = false; + var hasWarnedAboutUsingConsumerProvider = false; + var hasWarnedAboutDisplayNameOnConsumer = false; + + { + // A separate object, but proxies back to the original context object for + // backwards compatibility. It has a different $$typeof, so we can properly + // warn for the incorrect usage of Context as a Consumer. + var Consumer = { + $$typeof: REACT_CONTEXT_TYPE, + _context: context, + _calculateChangedBits: context._calculateChangedBits + }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here + + Object.defineProperties(Consumer, { + Provider: { + get: function () { + if (!hasWarnedAboutUsingConsumerProvider) { + hasWarnedAboutUsingConsumerProvider = true; + + error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?'); + } + + return context.Provider; + }, + set: function (_Provider) { + context.Provider = _Provider; + } + }, + _currentValue: { + get: function () { + return context._currentValue; + }, + set: function (_currentValue) { + context._currentValue = _currentValue; + } + }, + _currentValue2: { + get: function () { + return context._currentValue2; + }, + set: function (_currentValue2) { + context._currentValue2 = _currentValue2; + } + }, + _threadCount: { + get: function () { + return context._threadCount; + }, + set: function (_threadCount) { + context._threadCount = _threadCount; + } + }, + Consumer: { + get: function () { + if (!hasWarnedAboutUsingNestedContextConsumers) { + hasWarnedAboutUsingNestedContextConsumers = true; + + error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?'); + } + + return context.Consumer; + } + }, + displayName: { + get: function () { + return context.displayName; + }, + set: function (displayName) { + if (!hasWarnedAboutDisplayNameOnConsumer) { + warn('Setting `displayName` on Context.Consumer has no effect. ' + "You should set it directly on the context with Context.displayName = '%s'.", displayName); + + hasWarnedAboutDisplayNameOnConsumer = true; + } + } + } + }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty + + context.Consumer = Consumer; + } + + { + context._currentRenderer = null; + context._currentRenderer2 = null; + } + + return context; +} + +var Uninitialized = -1; +var Pending = 0; +var Resolved = 1; +var Rejected = 2; + +function lazyInitializer(payload) { + if (payload._status === Uninitialized) { + var ctor = payload._result; + var thenable = ctor(); // Transition to the next state. + + var pending = payload; + pending._status = Pending; + pending._result = thenable; + thenable.then(function (moduleObject) { + if (payload._status === Pending) { + var defaultExport = moduleObject.default; + + { + if (defaultExport === undefined) { + error('lazy: Expected the result of a dynamic import() call. ' + 'Instead received: %s\n\nYour code should look like: \n ' + // Break up imports to avoid accidentally parsing them as dependencies. + 'const MyComponent = lazy(() => imp' + "ort('./MyComponent'))", moduleObject); + } + } // Transition to the next state. + + + var resolved = payload; + resolved._status = Resolved; + resolved._result = defaultExport; + } + }, function (error) { + if (payload._status === Pending) { + // Transition to the next state. + var rejected = payload; + rejected._status = Rejected; + rejected._result = error; + } + }); + } + + if (payload._status === Resolved) { + return payload._result; + } else { + throw payload._result; + } +} + +function lazy(ctor) { + var payload = { + // We use these fields to store the result. + _status: -1, + _result: ctor + }; + var lazyType = { + $$typeof: REACT_LAZY_TYPE, + _payload: payload, + _init: lazyInitializer + }; + + { + // In production, this would just set it on the object. + var defaultProps; + var propTypes; // $FlowFixMe + + Object.defineProperties(lazyType, { + defaultProps: { + configurable: true, + get: function () { + return defaultProps; + }, + set: function (newDefaultProps) { + error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + defaultProps = newDefaultProps; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'defaultProps', { + enumerable: true + }); + } + }, + propTypes: { + configurable: true, + get: function () { + return propTypes; + }, + set: function (newPropTypes) { + error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.'); + + propTypes = newPropTypes; // Match production behavior more closely: + // $FlowFixMe + + Object.defineProperty(lazyType, 'propTypes', { + enumerable: true + }); + } + } + }); + } + + return lazyType; +} + +function forwardRef(render) { + { + if (render != null && render.$$typeof === REACT_MEMO_TYPE) { + error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).'); + } else if (typeof render !== 'function') { + error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render); + } else { + if (render.length !== 0 && render.length !== 2) { + error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.'); + } + } + + if (render != null) { + if (render.defaultProps != null || render.propTypes != null) { + error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?'); + } + } + } + + var elementType = { + $$typeof: REACT_FORWARD_REF_TYPE, + render: render + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (render.displayName == null) { + render.displayName = name; + } + } + }); + } + + return elementType; +} + +// Filter certain DOM attributes (e.g. src, href) if their values are empty strings. + +var enableScopeAPI = false; // Experimental Create Event Handle API. + +function isValidElementType(type) { + if (typeof type === 'string' || typeof type === 'function') { + return true; + } // Note: typeof might be other than 'symbol' or 'number' (e.g. if it's a polyfill). + + + if (type === exports.Fragment || type === exports.Profiler || type === REACT_DEBUG_TRACING_MODE_TYPE || type === exports.StrictMode || type === exports.Suspense || type === REACT_SUSPENSE_LIST_TYPE || type === REACT_LEGACY_HIDDEN_TYPE || enableScopeAPI ) { + return true; + } + + if (typeof type === 'object' && type !== null) { + if (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_BLOCK_TYPE || type[0] === REACT_SERVER_BLOCK_TYPE) { + return true; + } + } + + return false; +} + +function memo(type, compare) { + { + if (!isValidElementType(type)) { + error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type); + } + } + + var elementType = { + $$typeof: REACT_MEMO_TYPE, + type: type, + compare: compare === undefined ? null : compare + }; + + { + var ownName; + Object.defineProperty(elementType, 'displayName', { + enumerable: false, + configurable: true, + get: function () { + return ownName; + }, + set: function (name) { + ownName = name; + + if (type.displayName == null) { + type.displayName = name; + } + } + }); + } + + return elementType; +} + +function resolveDispatcher() { + var dispatcher = ReactCurrentDispatcher.current; + + if (!(dispatcher !== null)) { + { + throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem." ); + } + } + + return dispatcher; +} + +function useContext(Context, unstable_observedBits) { + var dispatcher = resolveDispatcher(); + + { + if (unstable_observedBits !== undefined) { + error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\n\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://reactjs.org/link/rules-of-hooks' : ''); + } // TODO: add a more generic warning for invalid values. + + + if (Context._context !== undefined) { + var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs + // and nobody should be using this in existing code. + + if (realContext.Consumer === Context) { + error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?'); + } else if (realContext.Provider === Context) { + error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?'); + } + } + } + + return dispatcher.useContext(Context, unstable_observedBits); +} +function useState(initialState) { + var dispatcher = resolveDispatcher(); + return dispatcher.useState(initialState); +} +function useReducer(reducer, initialArg, init) { + var dispatcher = resolveDispatcher(); + return dispatcher.useReducer(reducer, initialArg, init); +} +function useRef(initialValue) { + var dispatcher = resolveDispatcher(); + return dispatcher.useRef(initialValue); +} +function useEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useEffect(create, deps); +} +function useLayoutEffect(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useLayoutEffect(create, deps); +} +function useCallback(callback, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useCallback(callback, deps); +} +function useMemo(create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useMemo(create, deps); +} +function useImperativeHandle(ref, create, deps) { + var dispatcher = resolveDispatcher(); + return dispatcher.useImperativeHandle(ref, create, deps); +} +function useDebugValue(value, formatterFn) { + { + var dispatcher = resolveDispatcher(); + return dispatcher.useDebugValue(value, formatterFn); + } +} + +// Helpers to patch console.logs to avoid logging during side-effect free +// replaying on render function. This currently only patches the object +// lazily which won't cover if the log function was extracted eagerly. +// We could also eagerly patch the method. +var disabledDepth = 0; +var prevLog; +var prevInfo; +var prevWarn; +var prevError; +var prevGroup; +var prevGroupCollapsed; +var prevGroupEnd; + +function disabledLog() {} + +disabledLog.__reactDisabledLog = true; +function disableLogs() { + { + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + prevLog = console.log; + prevInfo = console.info; + prevWarn = console.warn; + prevError = console.error; + prevGroup = console.group; + prevGroupCollapsed = console.groupCollapsed; + prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099 + + var props = { + configurable: true, + enumerable: true, + value: disabledLog, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + info: props, + log: props, + warn: props, + error: props, + group: props, + groupCollapsed: props, + groupEnd: props + }); + /* eslint-enable react-internal/no-production-logging */ + } + + disabledDepth++; + } +} +function reenableLogs() { + { + disabledDepth--; + + if (disabledDepth === 0) { + /* eslint-disable react-internal/no-production-logging */ + var props = { + configurable: true, + enumerable: true, + writable: true + }; // $FlowFixMe Flow thinks console is immutable. + + Object.defineProperties(console, { + log: _assign({}, props, { + value: prevLog + }), + info: _assign({}, props, { + value: prevInfo + }), + warn: _assign({}, props, { + value: prevWarn + }), + error: _assign({}, props, { + value: prevError + }), + group: _assign({}, props, { + value: prevGroup + }), + groupCollapsed: _assign({}, props, { + value: prevGroupCollapsed + }), + groupEnd: _assign({}, props, { + value: prevGroupEnd + }) + }); + /* eslint-enable react-internal/no-production-logging */ + } + + if (disabledDepth < 0) { + error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.'); + } + } +} + +var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher; +var prefix; +function describeBuiltInComponentFrame(name, source, ownerFn) { + { + if (prefix === undefined) { + // Extract the VM specific prefix used by each line. + try { + throw Error(); + } catch (x) { + var match = x.stack.trim().match(/\n( *(at )?)/); + prefix = match && match[1] || ''; + } + } // We use the prefix to ensure our stacks line up with native stack frames. + + + return '\n' + prefix + name; + } +} +var reentry = false; +var componentFrameCache; + +{ + var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; + componentFrameCache = new PossiblyWeakMap(); +} + +function describeNativeComponentFrame(fn, construct) { + // If something asked for a stack inside a fake render, it should get ignored. + if (!fn || reentry) { + return ''; + } + + { + var frame = componentFrameCache.get(fn); + + if (frame !== undefined) { + return frame; + } + } + + var control; + reentry = true; + var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined. + + Error.prepareStackTrace = undefined; + var previousDispatcher; + + { + previousDispatcher = ReactCurrentDispatcher$1.current; // Set the dispatcher in DEV because this might be call in the render function + // for warnings. + + ReactCurrentDispatcher$1.current = null; + disableLogs(); + } + + try { + // This should throw. + if (construct) { + // Something should be setting the props in the constructor. + var Fake = function () { + throw Error(); + }; // $FlowFixMe + + + Object.defineProperty(Fake.prototype, 'props', { + set: function () { + // We use a throwing setter instead of frozen or non-writable props + // because that won't throw in a non-strict mode function. + throw Error(); + } + }); + + if (typeof Reflect === 'object' && Reflect.construct) { + // We construct a different control for this case to include any extra + // frames added by the construct call. + try { + Reflect.construct(Fake, []); + } catch (x) { + control = x; + } + + Reflect.construct(fn, [], Fake); + } else { + try { + Fake.call(); + } catch (x) { + control = x; + } + + fn.call(Fake.prototype); + } + } else { + try { + throw Error(); + } catch (x) { + control = x; + } + + fn(); + } + } catch (sample) { + // This is inlined manually because closure doesn't do it for us. + if (sample && control && typeof sample.stack === 'string') { + // This extracts the first frame from the sample that isn't also in the control. + // Skipping one frame that we assume is the frame that calls the two. + var sampleLines = sample.stack.split('\n'); + var controlLines = control.stack.split('\n'); + var s = sampleLines.length - 1; + var c = controlLines.length - 1; + + while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) { + // We expect at least one stack frame to be shared. + // Typically this will be the root most one. However, stack frames may be + // cut off due to maximum stack limits. In this case, one maybe cut off + // earlier than the other. We assume that the sample is longer or the same + // and there for cut off earlier. So we should find the root most frame in + // the sample somewhere in the control. + c--; + } + + for (; s >= 1 && c >= 0; s--, c--) { + // Next we find the first one that isn't the same which should be the + // frame that called our sample function and the control. + if (sampleLines[s] !== controlLines[c]) { + // In V8, the first line is describing the message but other VMs don't. + // If we're about to return the first line, and the control is also on the same + // line, that's a pretty good indicator that our sample threw at same line as + // the control. I.e. before we entered the sample frame. So we ignore this result. + // This can happen if you passed a class to function component, or non-function. + if (s !== 1 || c !== 1) { + do { + s--; + c--; // We may still have similar intermediate frames from the construct call. + // The next one that isn't the same should be our match though. + + if (c < 0 || sampleLines[s] !== controlLines[c]) { + // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier. + var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, _frame); + } + } // Return the line we found. + + + return _frame; + } + } while (s >= 1 && c >= 0); + } + + break; + } + } + } + } finally { + reentry = false; + + { + ReactCurrentDispatcher$1.current = previousDispatcher; + reenableLogs(); + } + + Error.prepareStackTrace = previousPrepareStackTrace; + } // Fallback to just using the name if we couldn't make it throw. + + + var name = fn ? fn.displayName || fn.name : ''; + var syntheticFrame = name ? describeBuiltInComponentFrame(name) : ''; + + { + if (typeof fn === 'function') { + componentFrameCache.set(fn, syntheticFrame); + } + } + + return syntheticFrame; +} +function describeFunctionComponentFrame(fn, source, ownerFn) { + { + return describeNativeComponentFrame(fn, false); + } +} + +function shouldConstruct(Component) { + var prototype = Component.prototype; + return !!(prototype && prototype.isReactComponent); +} + +function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) { + + if (type == null) { + return ''; + } + + if (typeof type === 'function') { + { + return describeNativeComponentFrame(type, shouldConstruct(type)); + } + } + + if (typeof type === 'string') { + return describeBuiltInComponentFrame(type); + } + + switch (type) { + case exports.Suspense: + return describeBuiltInComponentFrame('Suspense'); + + case REACT_SUSPENSE_LIST_TYPE: + return describeBuiltInComponentFrame('SuspenseList'); + } + + if (typeof type === 'object') { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + return describeFunctionComponentFrame(type.render); + + case REACT_MEMO_TYPE: + // Memo may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn); + + case REACT_BLOCK_TYPE: + return describeFunctionComponentFrame(type._render); + + case REACT_LAZY_TYPE: + { + var lazyComponent = type; + var payload = lazyComponent._payload; + var init = lazyComponent._init; + + try { + // Lazy may contain any component type so we recursively resolve it. + return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn); + } catch (x) {} + } + } + } + + return ''; +} + +var loggedTypeFailures = {}; +var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame; + +function setCurrentlyValidatingElement(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + ReactDebugCurrentFrame$1.setExtraStackFrame(stack); + } else { + ReactDebugCurrentFrame$1.setExtraStackFrame(null); + } + } +} + +function checkPropTypes(typeSpecs, values, location, componentName, element) { + { + // $FlowFixMe This is okay but Flow doesn't know it. + var has = Function.call.bind(Object.prototype.hasOwnProperty); + + for (var typeSpecName in typeSpecs) { + if (has(typeSpecs, typeSpecName)) { + var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to + // fail the render phase where it didn't fail before. So we log it. + // After these have been cleaned up, we'll let them throw. + + try { + // This is intentionally an invariant that gets caught. It's the same + // behavior as without this statement except with a better message. + if (typeof typeSpecs[typeSpecName] !== 'function') { + var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'); + err.name = 'Invariant Violation'; + throw err; + } + + error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'); + } catch (ex) { + error$1 = ex; + } + + if (error$1 && !(error$1 instanceof Error)) { + setCurrentlyValidatingElement(element); + + error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1); + + setCurrentlyValidatingElement(null); + } + + if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) { + // Only monitor this failure once because there tends to be a lot of the + // same error. + loggedTypeFailures[error$1.message] = true; + setCurrentlyValidatingElement(element); + + error('Failed %s type: %s', location, error$1.message); + + setCurrentlyValidatingElement(null); + } + } + } + } +} + +function setCurrentlyValidatingElement$1(element) { + { + if (element) { + var owner = element._owner; + var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null); + setExtraStackFrame(stack); + } else { + setExtraStackFrame(null); + } + } +} + +var propTypesMisspellWarningShown; + +{ + propTypesMisspellWarningShown = false; +} + +function getDeclarationErrorAddendum() { + if (ReactCurrentOwner.current) { + var name = getComponentName(ReactCurrentOwner.current.type); + + if (name) { + return '\n\nCheck the render method of `' + name + '`.'; + } + } + + return ''; +} + +function getSourceInfoErrorAddendum(source) { + if (source !== undefined) { + var fileName = source.fileName.replace(/^.*[\\\/]/, ''); + var lineNumber = source.lineNumber; + return '\n\nCheck your code at ' + fileName + ':' + lineNumber + '.'; + } + + return ''; +} + +function getSourceInfoErrorAddendumForProps(elementProps) { + if (elementProps !== null && elementProps !== undefined) { + return getSourceInfoErrorAddendum(elementProps.__source); + } + + return ''; +} +/** + * Warn if there's no key explicitly set on dynamic arrays of children or + * object keys are not valid. This allows us to keep track of children between + * updates. + */ + + +var ownerHasKeyUseWarning = {}; + +function getCurrentComponentErrorInfo(parentType) { + var info = getDeclarationErrorAddendum(); + + if (!info) { + var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; + + if (parentName) { + info = "\n\nCheck the top-level render call using <" + parentName + ">."; + } + } + + return info; +} +/** + * Warn if the element doesn't have an explicit key assigned to it. + * This element is in an array. The array could grow and shrink or be + * reordered. All children that haven't already been validated are required to + * have a "key" property assigned to it. Error statuses are cached so a warning + * will only be shown once. + * + * @internal + * @param {ReactElement} element Element that requires a key. + * @param {*} parentType element's parent's type. + */ + + +function validateExplicitKey(element, parentType) { + if (!element._store || element._store.validated || element.key != null) { + return; + } + + element._store.validated = true; + var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); + + if (ownerHasKeyUseWarning[currentComponentErrorInfo]) { + return; + } + + ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a + // property, it may be the creator of the child that's responsible for + // assigning it a key. + + var childOwner = ''; + + if (element && element._owner && element._owner !== ReactCurrentOwner.current) { + // Give the component that originally created this child. + childOwner = " It was passed a child from " + getComponentName(element._owner.type) + "."; + } + + { + setCurrentlyValidatingElement$1(element); + + error('Each child in a list should have a unique "key" prop.' + '%s%s See https://reactjs.org/link/warning-keys for more information.', currentComponentErrorInfo, childOwner); + + setCurrentlyValidatingElement$1(null); + } +} +/** + * Ensure that every element either is passed in a static location, in an + * array with an explicit keys property defined, or in an object literal + * with valid key property. + * + * @internal + * @param {ReactNode} node Statically passed child of any type. + * @param {*} parentType node's parent's type. + */ + + +function validateChildKeys(node, parentType) { + if (typeof node !== 'object') { + return; + } + + if (Array.isArray(node)) { + for (var i = 0; i < node.length; i++) { + var child = node[i]; + + if (isValidElement(child)) { + validateExplicitKey(child, parentType); + } + } + } else if (isValidElement(node)) { + // This element was passed in a valid location. + if (node._store) { + node._store.validated = true; + } + } else if (node) { + var iteratorFn = getIteratorFn(node); + + if (typeof iteratorFn === 'function') { + // Entry iterators used to provide implicit keys, + // but now we print a separate warning for them later. + if (iteratorFn !== node.entries) { + var iterator = iteratorFn.call(node); + var step; + + while (!(step = iterator.next()).done) { + if (isValidElement(step.value)) { + validateExplicitKey(step.value, parentType); + } + } + } + } + } +} +/** + * Given an element, validate that its props follow the propTypes definition, + * provided by the type. + * + * @param {ReactElement} element + */ + + +function validatePropTypes(element) { + { + var type = element.type; + + if (type === null || type === undefined || typeof type === 'string') { + return; + } + + var propTypes; + + if (typeof type === 'function') { + propTypes = type.propTypes; + } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here. + // Inner props are checked in the reconciler. + type.$$typeof === REACT_MEMO_TYPE)) { + propTypes = type.propTypes; + } else { + return; + } + + if (propTypes) { + // Intentionally inside to avoid triggering lazy initializers: + var name = getComponentName(type); + checkPropTypes(propTypes, element.props, 'prop', name, element); + } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { + propTypesMisspellWarningShown = true; // Intentionally inside to avoid triggering lazy initializers: + + var _name = getComponentName(type); + + error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', _name || 'Unknown'); + } + + if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) { + error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.'); + } + } +} +/** + * Given a fragment, validate that it can only be provided with fragment props + * @param {ReactElement} fragment + */ + + +function validateFragmentProps(fragment) { + { + var keys = Object.keys(fragment.props); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + + if (key !== 'children' && key !== 'key') { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key); + + setCurrentlyValidatingElement$1(null); + break; + } + } + + if (fragment.ref !== null) { + setCurrentlyValidatingElement$1(fragment); + + error('Invalid attribute `ref` supplied to `React.Fragment`.'); + + setCurrentlyValidatingElement$1(null); + } + } +} +function createElementWithValidation(type, props, children) { + var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to + // succeed and there will likely be errors in render. + + if (!validType) { + var info = ''; + + if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { + info += ' You likely forgot to export your component from the file ' + "it's defined in, or you might have mixed up default and named imports."; + } + + var sourceInfo = getSourceInfoErrorAddendumForProps(props); + + if (sourceInfo) { + info += sourceInfo; + } else { + info += getDeclarationErrorAddendum(); + } + + var typeString; + + if (type === null) { + typeString = 'null'; + } else if (Array.isArray(type)) { + typeString = 'array'; + } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) { + typeString = "<" + (getComponentName(type.type) || 'Unknown') + " />"; + info = ' Did you accidentally export a JSX literal instead of a component?'; + } else { + typeString = typeof type; + } + + { + error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info); + } + } + + var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used. + // TODO: Drop this when these are no longer allowed as the type argument. + + if (element == null) { + return element; + } // Skip key warning if the type isn't valid since our key validation logic + // doesn't expect a non-string/function type and can throw confusing errors. + // We don't want exception behavior to differ between dev and prod. + // (Rendering will throw with a helpful message and as soon as the type is + // fixed, the key warnings will appear.) + + + if (validType) { + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], type); + } + } + + if (type === exports.Fragment) { + validateFragmentProps(element); + } else { + validatePropTypes(element); + } + + return element; +} +var didWarnAboutDeprecatedCreateFactory = false; +function createFactoryWithValidation(type) { + var validatedFactory = createElementWithValidation.bind(null, type); + validatedFactory.type = type; + + { + if (!didWarnAboutDeprecatedCreateFactory) { + didWarnAboutDeprecatedCreateFactory = true; + + warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.'); + } // Legacy hook: remove it + + + Object.defineProperty(validatedFactory, 'type', { + enumerable: false, + get: function () { + warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); + + Object.defineProperty(this, 'type', { + value: type + }); + return type; + } + }); + } + + return validatedFactory; +} +function cloneElementWithValidation(element, props, children) { + var newElement = cloneElement.apply(this, arguments); + + for (var i = 2; i < arguments.length; i++) { + validateChildKeys(arguments[i], newElement.type); + } + + validatePropTypes(newElement); + return newElement; +} + +{ + + try { + var frozenObject = Object.freeze({}); + /* eslint-disable no-new */ + + new Map([[frozenObject, null]]); + new Set([frozenObject]); + /* eslint-enable no-new */ + } catch (e) { + } +} + +var createElement$1 = createElementWithValidation ; +var cloneElement$1 = cloneElementWithValidation ; +var createFactory = createFactoryWithValidation ; +var Children = { + map: mapChildren, + forEach: forEachChildren, + count: countChildren, + toArray: toArray, + only: onlyChild +}; + +exports.Children = Children; +exports.Component = Component; +exports.PureComponent = PureComponent; +exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals; +exports.cloneElement = cloneElement$1; +exports.createContext = createContext; +exports.createElement = createElement$1; +exports.createFactory = createFactory; +exports.createRef = createRef; +exports.forwardRef = forwardRef; +exports.isValidElement = isValidElement; +exports.lazy = lazy; +exports.memo = memo; +exports.useCallback = useCallback; +exports.useContext = useContext; +exports.useDebugValue = useDebugValue; +exports.useEffect = useEffect; +exports.useImperativeHandle = useImperativeHandle; +exports.useLayoutEffect = useLayoutEffect; +exports.useMemo = useMemo; +exports.useReducer = useReducer; +exports.useRef = useRef; +exports.useState = useState; +exports.version = ReactVersion; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react/index.js": +/*!*************************************!*\ + !*** ./node_modules/react/index.js ***! + \*************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react.development.js */ "./node_modules/react/cjs/react.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/react/jsx-dev-runtime.js": +/*!***********************************************!*\ + !*** ./node_modules/react/jsx-dev-runtime.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-jsx-dev-runtime.development.js */ "./node_modules/react/cjs/react-jsx-dev-runtime.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/regenerator-runtime/runtime.js": +/*!*****************************************************!*\ + !*** ./node_modules/regenerator-runtime/runtime.js ***! + \*****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +var runtime = (function (exports) { + "use strict"; + + var Op = Object.prototype; + var hasOwn = Op.hasOwnProperty; + var undefined; // More compressible than void 0. + var $Symbol = typeof Symbol === "function" ? Symbol : {}; + var iteratorSymbol = $Symbol.iterator || "@@iterator"; + var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; + var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + + function define(obj, key, value) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + return obj[key]; + } + try { + // IE 8 has a broken Object.defineProperty that only works on DOM objects. + define({}, ""); + } catch (err) { + define = function(obj, key, value) { + return obj[key] = value; + }; + } + + function wrap(innerFn, outerFn, self, tryLocsList) { + // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; + var generator = Object.create(protoGenerator.prototype); + var context = new Context(tryLocsList || []); + + // The ._invoke method unifies the implementations of the .next, + // .throw, and .return methods. + generator._invoke = makeInvokeMethod(innerFn, self, context); + + return generator; + } + exports.wrap = wrap; + + // Try/catch helper to minimize deoptimizations. Returns a completion + // record like context.tryEntries[i].completion. This interface could + // have been (and was previously) designed to take a closure to be + // invoked without arguments, but in all the cases we care about we + // already have an existing method we want to call, so there's no need + // to create a new function object. We can even get away with assuming + // the method takes exactly one argument, since that happens to be true + // in every case, so we don't have to touch the arguments object. The + // only additional allocation required is the completion record, which + // has a stable shape and so hopefully should be cheap to allocate. + function tryCatch(fn, obj, arg) { + try { + return { type: "normal", arg: fn.call(obj, arg) }; + } catch (err) { + return { type: "throw", arg: err }; + } + } + + var GenStateSuspendedStart = "suspendedStart"; + var GenStateSuspendedYield = "suspendedYield"; + var GenStateExecuting = "executing"; + var GenStateCompleted = "completed"; + + // Returning this object from the innerFn has the same effect as + // breaking out of the dispatch switch statement. + var ContinueSentinel = {}; + + // Dummy constructor functions that we use as the .constructor and + // .constructor.prototype properties for functions that return Generator + // objects. For full spec compliance, you may wish to configure your + // minifier not to mangle the names of these two functions. + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + + // This is a polyfill for %IteratorPrototype% for environments that + // don't natively support it. + var IteratorPrototype = {}; + IteratorPrototype[iteratorSymbol] = function () { + return this; + }; + + var getProto = Object.getPrototypeOf; + var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + if (NativeIteratorPrototype && + NativeIteratorPrototype !== Op && + hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { + // This environment has a native %IteratorPrototype%; use it instead + // of the polyfill. + IteratorPrototype = NativeIteratorPrototype; + } + + var Gp = GeneratorFunctionPrototype.prototype = + Generator.prototype = Object.create(IteratorPrototype); + GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; + GeneratorFunctionPrototype.constructor = GeneratorFunction; + GeneratorFunction.displayName = define( + GeneratorFunctionPrototype, + toStringTagSymbol, + "GeneratorFunction" + ); + + // Helper for defining the .next, .throw, and .return methods of the + // Iterator interface in terms of a single ._invoke method. + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function(method) { + define(prototype, method, function(arg) { + return this._invoke(method, arg); + }); + }); + } + + exports.isGeneratorFunction = function(genFun) { + var ctor = typeof genFun === "function" && genFun.constructor; + return ctor + ? ctor === GeneratorFunction || + // For the native GeneratorFunction constructor, the best we can + // do is to check its .name property. + (ctor.displayName || ctor.name) === "GeneratorFunction" + : false; + }; + + exports.mark = function(genFun) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); + } else { + genFun.__proto__ = GeneratorFunctionPrototype; + define(genFun, toStringTagSymbol, "GeneratorFunction"); + } + genFun.prototype = Object.create(Gp); + return genFun; + }; + + // Within the body of any async function, `await x` is transformed to + // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test + // `hasOwn.call(value, "__await")` to determine if the yielded value is + // meant to be awaited. + exports.awrap = function(arg) { + return { __await: arg }; + }; + + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if (record.type === "throw") { + reject(record.arg); + } else { + var result = record.arg; + var value = result.value; + if (value && + typeof value === "object" && + hasOwn.call(value, "__await")) { + return PromiseImpl.resolve(value.__await).then(function(value) { + invoke("next", value, resolve, reject); + }, function(err) { + invoke("throw", err, resolve, reject); + }); + } + + return PromiseImpl.resolve(value).then(function(unwrapped) { + // When a yielded Promise is resolved, its final value becomes + // the .value of the Promise<{value,done}> result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function(error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + exports.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) { + if (PromiseImpl === void 0) PromiseImpl = Promise; + + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList), + PromiseImpl + ); + + return exports.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + define(Gp, toStringTagSymbol, "Generator"); + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + exports.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + exports.values = values; + + function doneResult() { + return { value: undefined, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined; + } + + return ContinueSentinel; + } + }; + + // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + return exports; + +}( + // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + true ? module.exports : undefined +)); + +try { + regeneratorRuntime = runtime; +} catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + Function("r", "regeneratorRuntime = r")(runtime); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/cjs/scheduler-tracing.development.js": +/*!*********************************************************************!*\ + !*** ./node_modules/scheduler/cjs/scheduler-tracing.development.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v0.20.2 + * scheduler-tracing.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var DEFAULT_THREAD_ID = 0; // Counters used to generate unique IDs. + +var interactionIDCounter = 0; +var threadIDCounter = 0; // Set of currently traced interactions. +// Interactions "stack"– +// Meaning that newly traced interactions are appended to the previously active set. +// When an interaction goes out of scope, the previous set (if any) is restored. + +exports.__interactionsRef = null; // Listener(s) to notify when interactions begin and end. + +exports.__subscriberRef = null; + +{ + exports.__interactionsRef = { + current: new Set() + }; + exports.__subscriberRef = { + current: null + }; +} +function unstable_clear(callback) { + + var prevInteractions = exports.__interactionsRef.current; + exports.__interactionsRef.current = new Set(); + + try { + return callback(); + } finally { + exports.__interactionsRef.current = prevInteractions; + } +} +function unstable_getCurrent() { + { + return exports.__interactionsRef.current; + } +} +function unstable_getThreadID() { + return ++threadIDCounter; +} +function unstable_trace(name, timestamp, callback) { + var threadID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : DEFAULT_THREAD_ID; + + var interaction = { + __count: 1, + id: interactionIDCounter++, + name: name, + timestamp: timestamp + }; + var prevInteractions = exports.__interactionsRef.current; // Traced interactions should stack/accumulate. + // To do that, clone the current interactions. + // The previous set will be restored upon completion. + + var interactions = new Set(prevInteractions); + interactions.add(interaction); + exports.__interactionsRef.current = interactions; + var subscriber = exports.__subscriberRef.current; + var returnValue; + + try { + if (subscriber !== null) { + subscriber.onInteractionTraced(interaction); + } + } finally { + try { + if (subscriber !== null) { + subscriber.onWorkStarted(interactions, threadID); + } + } finally { + try { + returnValue = callback(); + } finally { + exports.__interactionsRef.current = prevInteractions; + + try { + if (subscriber !== null) { + subscriber.onWorkStopped(interactions, threadID); + } + } finally { + interaction.__count--; // If no async work was scheduled for this interaction, + // Notify subscribers that it's completed. + + if (subscriber !== null && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + } + } + } + } + + return returnValue; +} +function unstable_wrap(callback) { + var threadID = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THREAD_ID; + + var wrappedInteractions = exports.__interactionsRef.current; + var subscriber = exports.__subscriberRef.current; + + if (subscriber !== null) { + subscriber.onWorkScheduled(wrappedInteractions, threadID); + } // Update the pending async work count for the current interactions. + // Update after calling subscribers in case of error. + + + wrappedInteractions.forEach(function (interaction) { + interaction.__count++; + }); + var hasRun = false; + + function wrapped() { + var prevInteractions = exports.__interactionsRef.current; + exports.__interactionsRef.current = wrappedInteractions; + subscriber = exports.__subscriberRef.current; + + try { + var returnValue; + + try { + if (subscriber !== null) { + subscriber.onWorkStarted(wrappedInteractions, threadID); + } + } finally { + try { + returnValue = callback.apply(undefined, arguments); + } finally { + exports.__interactionsRef.current = prevInteractions; + + if (subscriber !== null) { + subscriber.onWorkStopped(wrappedInteractions, threadID); + } + } + } + + return returnValue; + } finally { + if (!hasRun) { + // We only expect a wrapped function to be executed once, + // But in the event that it's executed more than once– + // Only decrement the outstanding interaction counts once. + hasRun = true; // Update pending async counts for all wrapped interactions. + // If this was the last scheduled async work for any of them, + // Mark them as completed. + + wrappedInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber !== null && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + }); + } + } + } + + wrapped.cancel = function cancel() { + subscriber = exports.__subscriberRef.current; + + try { + if (subscriber !== null) { + subscriber.onWorkCanceled(wrappedInteractions, threadID); + } + } finally { + // Update pending async counts for all wrapped interactions. + // If this was the last scheduled async work for any of them, + // Mark them as completed. + wrappedInteractions.forEach(function (interaction) { + interaction.__count--; + + if (subscriber && interaction.__count === 0) { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } + }); + } + }; + + return wrapped; +} + +var subscribers = null; + +{ + subscribers = new Set(); +} + +function unstable_subscribe(subscriber) { + { + subscribers.add(subscriber); + + if (subscribers.size === 1) { + exports.__subscriberRef.current = { + onInteractionScheduledWorkCompleted: onInteractionScheduledWorkCompleted, + onInteractionTraced: onInteractionTraced, + onWorkCanceled: onWorkCanceled, + onWorkScheduled: onWorkScheduled, + onWorkStarted: onWorkStarted, + onWorkStopped: onWorkStopped + }; + } + } +} +function unstable_unsubscribe(subscriber) { + { + subscribers.delete(subscriber); + + if (subscribers.size === 0) { + exports.__subscriberRef.current = null; + } + } +} + +function onInteractionTraced(interaction) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onInteractionTraced(interaction); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onInteractionScheduledWorkCompleted(interaction) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onInteractionScheduledWorkCompleted(interaction); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkScheduled(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkScheduled(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkStarted(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkStarted(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkStopped(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkStopped(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +function onWorkCanceled(interactions, threadID) { + var didCatchError = false; + var caughtError = null; + subscribers.forEach(function (subscriber) { + try { + subscriber.onWorkCanceled(interactions, threadID); + } catch (error) { + if (!didCatchError) { + didCatchError = true; + caughtError = error; + } + } + }); + + if (didCatchError) { + throw caughtError; + } +} + +exports.unstable_clear = unstable_clear; +exports.unstable_getCurrent = unstable_getCurrent; +exports.unstable_getThreadID = unstable_getThreadID; +exports.unstable_subscribe = unstable_subscribe; +exports.unstable_trace = unstable_trace; +exports.unstable_unsubscribe = unstable_unsubscribe; +exports.unstable_wrap = unstable_wrap; + })(); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/cjs/scheduler.development.js": +/*!*************************************************************!*\ + !*** ./node_modules/scheduler/cjs/scheduler.development.js ***! + \*************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React v0.20.2 + * scheduler.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +if (true) { + (function() { +'use strict'; + +var enableSchedulerDebugging = false; +var enableProfiling = false; + +var requestHostCallback; +var requestHostTimeout; +var cancelHostTimeout; +var requestPaint; +var hasPerformanceNow = typeof performance === 'object' && typeof performance.now === 'function'; + +if (hasPerformanceNow) { + var localPerformance = performance; + + exports.unstable_now = function () { + return localPerformance.now(); + }; +} else { + var localDate = Date; + var initialTime = localDate.now(); + + exports.unstable_now = function () { + return localDate.now() - initialTime; + }; +} + +if ( // If Scheduler runs in a non-DOM environment, it falls back to a naive +// implementation using setTimeout. +typeof window === 'undefined' || // Check if MessageChannel is supported, too. +typeof MessageChannel !== 'function') { + // If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore, + // fallback to a naive implementation. + var _callback = null; + var _timeoutID = null; + + var _flushCallback = function () { + if (_callback !== null) { + try { + var currentTime = exports.unstable_now(); + var hasRemainingTime = true; + + _callback(hasRemainingTime, currentTime); + + _callback = null; + } catch (e) { + setTimeout(_flushCallback, 0); + throw e; + } + } + }; + + requestHostCallback = function (cb) { + if (_callback !== null) { + // Protect against re-entrancy. + setTimeout(requestHostCallback, 0, cb); + } else { + _callback = cb; + setTimeout(_flushCallback, 0); + } + }; + + requestHostTimeout = function (cb, ms) { + _timeoutID = setTimeout(cb, ms); + }; + + cancelHostTimeout = function () { + clearTimeout(_timeoutID); + }; + + exports.unstable_shouldYield = function () { + return false; + }; + + requestPaint = exports.unstable_forceFrameRate = function () {}; +} else { + // Capture local references to native APIs, in case a polyfill overrides them. + var _setTimeout = window.setTimeout; + var _clearTimeout = window.clearTimeout; + + if (typeof console !== 'undefined') { + // TODO: Scheduler no longer requires these methods to be polyfilled. But + // maybe we want to continue warning if they don't exist, to preserve the + // option to rely on it in the future? + var requestAnimationFrame = window.requestAnimationFrame; + var cancelAnimationFrame = window.cancelAnimationFrame; + + if (typeof requestAnimationFrame !== 'function') { + // Using console['error'] to evade Babel and ESLint + console['error']("This browser doesn't support requestAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills'); + } + + if (typeof cancelAnimationFrame !== 'function') { + // Using console['error'] to evade Babel and ESLint + console['error']("This browser doesn't support cancelAnimationFrame. " + 'Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills'); + } + } + + var isMessageLoopRunning = false; + var scheduledHostCallback = null; + var taskTimeoutID = -1; // Scheduler periodically yields in case there is other work on the main + // thread, like user events. By default, it yields multiple times per frame. + // It does not attempt to align with frame boundaries, since most tasks don't + // need to be frame aligned; for those that do, use requestAnimationFrame. + + var yieldInterval = 5; + var deadline = 0; // TODO: Make this configurable + + { + // `isInputPending` is not available. Since we have no way of knowing if + // there's pending input, always yield at the end of the frame. + exports.unstable_shouldYield = function () { + return exports.unstable_now() >= deadline; + }; // Since we yield every frame regardless, `requestPaint` has no effect. + + + requestPaint = function () {}; + } + + exports.unstable_forceFrameRate = function (fps) { + if (fps < 0 || fps > 125) { + // Using console['error'] to evade Babel and ESLint + console['error']('forceFrameRate takes a positive int between 0 and 125, ' + 'forcing frame rates higher than 125 fps is not supported'); + return; + } + + if (fps > 0) { + yieldInterval = Math.floor(1000 / fps); + } else { + // reset the framerate + yieldInterval = 5; + } + }; + + var performWorkUntilDeadline = function () { + if (scheduledHostCallback !== null) { + var currentTime = exports.unstable_now(); // Yield after `yieldInterval` ms, regardless of where we are in the vsync + // cycle. This means there's always time remaining at the beginning of + // the message event. + + deadline = currentTime + yieldInterval; + var hasTimeRemaining = true; + + try { + var hasMoreWork = scheduledHostCallback(hasTimeRemaining, currentTime); + + if (!hasMoreWork) { + isMessageLoopRunning = false; + scheduledHostCallback = null; + } else { + // If there's more work, schedule the next message event at the end + // of the preceding one. + port.postMessage(null); + } + } catch (error) { + // If a scheduler task throws, exit the current browser task so the + // error can be observed. + port.postMessage(null); + throw error; + } + } else { + isMessageLoopRunning = false; + } // Yielding to the browser will give it a chance to paint, so we can + }; + + var channel = new MessageChannel(); + var port = channel.port2; + channel.port1.onmessage = performWorkUntilDeadline; + + requestHostCallback = function (callback) { + scheduledHostCallback = callback; + + if (!isMessageLoopRunning) { + isMessageLoopRunning = true; + port.postMessage(null); + } + }; + + requestHostTimeout = function (callback, ms) { + taskTimeoutID = _setTimeout(function () { + callback(exports.unstable_now()); + }, ms); + }; + + cancelHostTimeout = function () { + _clearTimeout(taskTimeoutID); + + taskTimeoutID = -1; + }; +} + +function push(heap, node) { + var index = heap.length; + heap.push(node); + siftUp(heap, node, index); +} +function peek(heap) { + var first = heap[0]; + return first === undefined ? null : first; +} +function pop(heap) { + var first = heap[0]; + + if (first !== undefined) { + var last = heap.pop(); + + if (last !== first) { + heap[0] = last; + siftDown(heap, last, 0); + } + + return first; + } else { + return null; + } +} + +function siftUp(heap, node, i) { + var index = i; + + while (true) { + var parentIndex = index - 1 >>> 1; + var parent = heap[parentIndex]; + + if (parent !== undefined && compare(parent, node) > 0) { + // The parent is larger. Swap positions. + heap[parentIndex] = node; + heap[index] = parent; + index = parentIndex; + } else { + // The parent is smaller. Exit. + return; + } + } +} + +function siftDown(heap, node, i) { + var index = i; + var length = heap.length; + + while (index < length) { + var leftIndex = (index + 1) * 2 - 1; + var left = heap[leftIndex]; + var rightIndex = leftIndex + 1; + var right = heap[rightIndex]; // If the left or right node is smaller, swap with the smaller of those. + + if (left !== undefined && compare(left, node) < 0) { + if (right !== undefined && compare(right, left) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + heap[index] = left; + heap[leftIndex] = node; + index = leftIndex; + } + } else if (right !== undefined && compare(right, node) < 0) { + heap[index] = right; + heap[rightIndex] = node; + index = rightIndex; + } else { + // Neither child is smaller. Exit. + return; + } + } +} + +function compare(a, b) { + // Compare sort index first, then task id. + var diff = a.sortIndex - b.sortIndex; + return diff !== 0 ? diff : a.id - b.id; +} + +// TODO: Use symbols? +var ImmediatePriority = 1; +var UserBlockingPriority = 2; +var NormalPriority = 3; +var LowPriority = 4; +var IdlePriority = 5; + +function markTaskErrored(task, ms) { +} + +/* eslint-disable no-var */ +// Math.pow(2, 30) - 1 +// 0b111111111111111111111111111111 + +var maxSigned31BitInt = 1073741823; // Times out immediately + +var IMMEDIATE_PRIORITY_TIMEOUT = -1; // Eventually times out + +var USER_BLOCKING_PRIORITY_TIMEOUT = 250; +var NORMAL_PRIORITY_TIMEOUT = 5000; +var LOW_PRIORITY_TIMEOUT = 10000; // Never times out + +var IDLE_PRIORITY_TIMEOUT = maxSigned31BitInt; // Tasks are stored on a min heap + +var taskQueue = []; +var timerQueue = []; // Incrementing id counter. Used to maintain insertion order. + +var taskIdCounter = 1; // Pausing the scheduler is useful for debugging. +var currentTask = null; +var currentPriorityLevel = NormalPriority; // This is set while performing work, to prevent re-entrancy. + +var isPerformingWork = false; +var isHostCallbackScheduled = false; +var isHostTimeoutScheduled = false; + +function advanceTimers(currentTime) { + // Check for tasks that are no longer delayed and add them to the queue. + var timer = peek(timerQueue); + + while (timer !== null) { + if (timer.callback === null) { + // Timer was cancelled. + pop(timerQueue); + } else if (timer.startTime <= currentTime) { + // Timer fired. Transfer to the task queue. + pop(timerQueue); + timer.sortIndex = timer.expirationTime; + push(taskQueue, timer); + } else { + // Remaining timers are pending. + return; + } + + timer = peek(timerQueue); + } +} + +function handleTimeout(currentTime) { + isHostTimeoutScheduled = false; + advanceTimers(currentTime); + + if (!isHostCallbackScheduled) { + if (peek(taskQueue) !== null) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } else { + var firstTimer = peek(timerQueue); + + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + } + } +} + +function flushWork(hasTimeRemaining, initialTime) { + + + isHostCallbackScheduled = false; + + if (isHostTimeoutScheduled) { + // We scheduled a timeout but it's no longer needed. Cancel it. + isHostTimeoutScheduled = false; + cancelHostTimeout(); + } + + isPerformingWork = true; + var previousPriorityLevel = currentPriorityLevel; + + try { + if (enableProfiling) { + try { + return workLoop(hasTimeRemaining, initialTime); + } catch (error) { + if (currentTask !== null) { + var currentTime = exports.unstable_now(); + markTaskErrored(currentTask, currentTime); + currentTask.isQueued = false; + } + + throw error; + } + } else { + // No catch in prod code path. + return workLoop(hasTimeRemaining, initialTime); + } + } finally { + currentTask = null; + currentPriorityLevel = previousPriorityLevel; + isPerformingWork = false; + } +} + +function workLoop(hasTimeRemaining, initialTime) { + var currentTime = initialTime; + advanceTimers(currentTime); + currentTask = peek(taskQueue); + + while (currentTask !== null && !(enableSchedulerDebugging )) { + if (currentTask.expirationTime > currentTime && (!hasTimeRemaining || exports.unstable_shouldYield())) { + // This currentTask hasn't expired, and we've reached the deadline. + break; + } + + var callback = currentTask.callback; + + if (typeof callback === 'function') { + currentTask.callback = null; + currentPriorityLevel = currentTask.priorityLevel; + var didUserCallbackTimeout = currentTask.expirationTime <= currentTime; + + var continuationCallback = callback(didUserCallbackTimeout); + currentTime = exports.unstable_now(); + + if (typeof continuationCallback === 'function') { + currentTask.callback = continuationCallback; + } else { + + if (currentTask === peek(taskQueue)) { + pop(taskQueue); + } + } + + advanceTimers(currentTime); + } else { + pop(taskQueue); + } + + currentTask = peek(taskQueue); + } // Return whether there's additional work + + + if (currentTask !== null) { + return true; + } else { + var firstTimer = peek(timerQueue); + + if (firstTimer !== null) { + requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime); + } + + return false; + } +} + +function unstable_runWithPriority(priorityLevel, eventHandler) { + switch (priorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + case LowPriority: + case IdlePriority: + break; + + default: + priorityLevel = NormalPriority; + } + + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } +} + +function unstable_next(eventHandler) { + var priorityLevel; + + switch (currentPriorityLevel) { + case ImmediatePriority: + case UserBlockingPriority: + case NormalPriority: + // Shift down to normal priority + priorityLevel = NormalPriority; + break; + + default: + // Anything lower than normal priority should remain at the current level. + priorityLevel = currentPriorityLevel; + break; + } + + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = priorityLevel; + + try { + return eventHandler(); + } finally { + currentPriorityLevel = previousPriorityLevel; + } +} + +function unstable_wrapCallback(callback) { + var parentPriorityLevel = currentPriorityLevel; + return function () { + // This is a fork of runWithPriority, inlined for performance. + var previousPriorityLevel = currentPriorityLevel; + currentPriorityLevel = parentPriorityLevel; + + try { + return callback.apply(this, arguments); + } finally { + currentPriorityLevel = previousPriorityLevel; + } + }; +} + +function unstable_scheduleCallback(priorityLevel, callback, options) { + var currentTime = exports.unstable_now(); + var startTime; + + if (typeof options === 'object' && options !== null) { + var delay = options.delay; + + if (typeof delay === 'number' && delay > 0) { + startTime = currentTime + delay; + } else { + startTime = currentTime; + } + } else { + startTime = currentTime; + } + + var timeout; + + switch (priorityLevel) { + case ImmediatePriority: + timeout = IMMEDIATE_PRIORITY_TIMEOUT; + break; + + case UserBlockingPriority: + timeout = USER_BLOCKING_PRIORITY_TIMEOUT; + break; + + case IdlePriority: + timeout = IDLE_PRIORITY_TIMEOUT; + break; + + case LowPriority: + timeout = LOW_PRIORITY_TIMEOUT; + break; + + case NormalPriority: + default: + timeout = NORMAL_PRIORITY_TIMEOUT; + break; + } + + var expirationTime = startTime + timeout; + var newTask = { + id: taskIdCounter++, + callback: callback, + priorityLevel: priorityLevel, + startTime: startTime, + expirationTime: expirationTime, + sortIndex: -1 + }; + + if (startTime > currentTime) { + // This is a delayed task. + newTask.sortIndex = startTime; + push(timerQueue, newTask); + + if (peek(taskQueue) === null && newTask === peek(timerQueue)) { + // All tasks are delayed, and this is the task with the earliest delay. + if (isHostTimeoutScheduled) { + // Cancel an existing timeout. + cancelHostTimeout(); + } else { + isHostTimeoutScheduled = true; + } // Schedule a timeout. + + + requestHostTimeout(handleTimeout, startTime - currentTime); + } + } else { + newTask.sortIndex = expirationTime; + push(taskQueue, newTask); + // wait until the next time we yield. + + + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } + } + + return newTask; +} + +function unstable_pauseExecution() { +} + +function unstable_continueExecution() { + + if (!isHostCallbackScheduled && !isPerformingWork) { + isHostCallbackScheduled = true; + requestHostCallback(flushWork); + } +} + +function unstable_getFirstCallbackNode() { + return peek(taskQueue); +} + +function unstable_cancelCallback(task) { + // remove from the queue because you can't remove arbitrary nodes from an + // array based heap, only the first one.) + + + task.callback = null; +} + +function unstable_getCurrentPriorityLevel() { + return currentPriorityLevel; +} + +var unstable_requestPaint = requestPaint; +var unstable_Profiling = null; + +exports.unstable_IdlePriority = IdlePriority; +exports.unstable_ImmediatePriority = ImmediatePriority; +exports.unstable_LowPriority = LowPriority; +exports.unstable_NormalPriority = NormalPriority; +exports.unstable_Profiling = unstable_Profiling; +exports.unstable_UserBlockingPriority = UserBlockingPriority; +exports.unstable_cancelCallback = unstable_cancelCallback; +exports.unstable_continueExecution = unstable_continueExecution; +exports.unstable_getCurrentPriorityLevel = unstable_getCurrentPriorityLevel; +exports.unstable_getFirstCallbackNode = unstable_getFirstCallbackNode; +exports.unstable_next = unstable_next; +exports.unstable_pauseExecution = unstable_pauseExecution; +exports.unstable_requestPaint = unstable_requestPaint; +exports.unstable_runWithPriority = unstable_runWithPriority; +exports.unstable_scheduleCallback = unstable_scheduleCallback; +exports.unstable_wrapCallback = unstable_wrapCallback; + })(); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/index.js": +/*!*****************************************!*\ + !*** ./node_modules/scheduler/index.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/scheduler.development.js */ "./node_modules/scheduler/cjs/scheduler.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/scheduler/tracing.js": +/*!*******************************************!*\ + !*** ./node_modules/scheduler/tracing.js ***! + \*******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/scheduler-tracing.development.js */ "./node_modules/scheduler/cjs/scheduler-tracing.development.js"); +} + + +/***/ }), + +/***/ "./node_modules/scrypt-js/scrypt.js": +/*!******************************************!*\ + !*** ./node_modules/scrypt-js/scrypt.js ***! + \******************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +(function(root) { + const MAX_VALUE = 0x7fffffff; + + // The SHA256 and PBKDF2 implementation are from scrypt-async-js: + // See: https://github.com/dchest/scrypt-async-js + function SHA256(m) { + const K = new Uint32Array([ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, + 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, + 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, + 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, + 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, + 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, + 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, + 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, + 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, + 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + ]); + + let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a; + let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19; + const w = new Uint32Array(64); + + function blocks(p) { + let off = 0, len = p.length; + while (len >= 64) { + let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7, u, i, j, t1, t2; + + for (i = 0; i < 16; i++) { + j = off + i*4; + w[i] = ((p[j] & 0xff)<<24) | ((p[j+1] & 0xff)<<16) | + ((p[j+2] & 0xff)<<8) | (p[j+3] & 0xff); + } + + for (i = 16; i < 64; i++) { + u = w[i-2]; + t1 = ((u>>>17) | (u<<(32-17))) ^ ((u>>>19) | (u<<(32-19))) ^ (u>>>10); + + u = w[i-15]; + t2 = ((u>>>7) | (u<<(32-7))) ^ ((u>>>18) | (u<<(32-18))) ^ (u>>>3); + + w[i] = (((t1 + w[i-7]) | 0) + ((t2 + w[i-16]) | 0)) | 0; + } + + for (i = 0; i < 64; i++) { + t1 = ((((((e>>>6) | (e<<(32-6))) ^ ((e>>>11) | (e<<(32-11))) ^ + ((e>>>25) | (e<<(32-25)))) + ((e & f) ^ (~e & g))) | 0) + + ((h + ((K[i] + w[i]) | 0)) | 0)) | 0; + + t2 = ((((a>>>2) | (a<<(32-2))) ^ ((a>>>13) | (a<<(32-13))) ^ + ((a>>>22) | (a<<(32-22)))) + ((a & b) ^ (a & c) ^ (b & c))) | 0; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + h0 = (h0 + a) | 0; + h1 = (h1 + b) | 0; + h2 = (h2 + c) | 0; + h3 = (h3 + d) | 0; + h4 = (h4 + e) | 0; + h5 = (h5 + f) | 0; + h6 = (h6 + g) | 0; + h7 = (h7 + h) | 0; + + off += 64; + len -= 64; + } + } + + blocks(m); + + let i, bytesLeft = m.length % 64, + bitLenHi = (m.length / 0x20000000) | 0, + bitLenLo = m.length << 3, + numZeros = (bytesLeft < 56) ? 56 : 120, + p = m.slice(m.length - bytesLeft, m.length); + + p.push(0x80); + for (i = bytesLeft + 1; i < numZeros; i++) { p.push(0); } + p.push((bitLenHi >>> 24) & 0xff); + p.push((bitLenHi >>> 16) & 0xff); + p.push((bitLenHi >>> 8) & 0xff); + p.push((bitLenHi >>> 0) & 0xff); + p.push((bitLenLo >>> 24) & 0xff); + p.push((bitLenLo >>> 16) & 0xff); + p.push((bitLenLo >>> 8) & 0xff); + p.push((bitLenLo >>> 0) & 0xff); + + blocks(p); + + return [ + (h0 >>> 24) & 0xff, (h0 >>> 16) & 0xff, (h0 >>> 8) & 0xff, (h0 >>> 0) & 0xff, + (h1 >>> 24) & 0xff, (h1 >>> 16) & 0xff, (h1 >>> 8) & 0xff, (h1 >>> 0) & 0xff, + (h2 >>> 24) & 0xff, (h2 >>> 16) & 0xff, (h2 >>> 8) & 0xff, (h2 >>> 0) & 0xff, + (h3 >>> 24) & 0xff, (h3 >>> 16) & 0xff, (h3 >>> 8) & 0xff, (h3 >>> 0) & 0xff, + (h4 >>> 24) & 0xff, (h4 >>> 16) & 0xff, (h4 >>> 8) & 0xff, (h4 >>> 0) & 0xff, + (h5 >>> 24) & 0xff, (h5 >>> 16) & 0xff, (h5 >>> 8) & 0xff, (h5 >>> 0) & 0xff, + (h6 >>> 24) & 0xff, (h6 >>> 16) & 0xff, (h6 >>> 8) & 0xff, (h6 >>> 0) & 0xff, + (h7 >>> 24) & 0xff, (h7 >>> 16) & 0xff, (h7 >>> 8) & 0xff, (h7 >>> 0) & 0xff + ]; + } + + function PBKDF2_HMAC_SHA256_OneIter(password, salt, dkLen) { + // compress password if it's longer than hash block length + password = (password.length <= 64) ? password : SHA256(password); + + const innerLen = 64 + salt.length + 4; + const inner = new Array(innerLen); + const outerKey = new Array(64); + + let i; + let dk = []; + + // inner = (password ^ ipad) || salt || counter + for (i = 0; i < 64; i++) { inner[i] = 0x36; } + for (i = 0; i < password.length; i++) { inner[i] ^= password[i]; } + for (i = 0; i < salt.length; i++) { inner[64 + i] = salt[i]; } + for (i = innerLen - 4; i < innerLen; i++) { inner[i] = 0; } + + // outerKey = password ^ opad + for (i = 0; i < 64; i++) outerKey[i] = 0x5c; + for (i = 0; i < password.length; i++) outerKey[i] ^= password[i]; + + // increments counter inside inner + function incrementCounter() { + for (let i = innerLen - 1; i >= innerLen - 4; i--) { + inner[i]++; + if (inner[i] <= 0xff) return; + inner[i] = 0; + } + } + + // output blocks = SHA256(outerKey || SHA256(inner)) ... + while (dkLen >= 32) { + incrementCounter(); + dk = dk.concat(SHA256(outerKey.concat(SHA256(inner)))); + dkLen -= 32; + } + if (dkLen > 0) { + incrementCounter(); + dk = dk.concat(SHA256(outerKey.concat(SHA256(inner))).slice(0, dkLen)); + } + + return dk; + } + + // The following is an adaptation of scryptsy + // See: https://www.npmjs.com/package/scryptsy + function blockmix_salsa8(BY, Yi, r, x, _X) { + let i; + + arraycopy(BY, (2 * r - 1) * 16, _X, 0, 16); + for (i = 0; i < 2 * r; i++) { + blockxor(BY, i * 16, _X, 16); + salsa20_8(_X, x); + arraycopy(_X, 0, BY, Yi + (i * 16), 16); + } + + for (i = 0; i < r; i++) { + arraycopy(BY, Yi + (i * 2) * 16, BY, (i * 16), 16); + } + + for (i = 0; i < r; i++) { + arraycopy(BY, Yi + (i * 2 + 1) * 16, BY, (i + r) * 16, 16); + } + } + + function R(a, b) { + return (a << b) | (a >>> (32 - b)); + } + + function salsa20_8(B, x) { + arraycopy(B, 0, x, 0, 16); + + for (let i = 8; i > 0; i -= 2) { + x[ 4] ^= R(x[ 0] + x[12], 7); + x[ 8] ^= R(x[ 4] + x[ 0], 9); + x[12] ^= R(x[ 8] + x[ 4], 13); + x[ 0] ^= R(x[12] + x[ 8], 18); + x[ 9] ^= R(x[ 5] + x[ 1], 7); + x[13] ^= R(x[ 9] + x[ 5], 9); + x[ 1] ^= R(x[13] + x[ 9], 13); + x[ 5] ^= R(x[ 1] + x[13], 18); + x[14] ^= R(x[10] + x[ 6], 7); + x[ 2] ^= R(x[14] + x[10], 9); + x[ 6] ^= R(x[ 2] + x[14], 13); + x[10] ^= R(x[ 6] + x[ 2], 18); + x[ 3] ^= R(x[15] + x[11], 7); + x[ 7] ^= R(x[ 3] + x[15], 9); + x[11] ^= R(x[ 7] + x[ 3], 13); + x[15] ^= R(x[11] + x[ 7], 18); + x[ 1] ^= R(x[ 0] + x[ 3], 7); + x[ 2] ^= R(x[ 1] + x[ 0], 9); + x[ 3] ^= R(x[ 2] + x[ 1], 13); + x[ 0] ^= R(x[ 3] + x[ 2], 18); + x[ 6] ^= R(x[ 5] + x[ 4], 7); + x[ 7] ^= R(x[ 6] + x[ 5], 9); + x[ 4] ^= R(x[ 7] + x[ 6], 13); + x[ 5] ^= R(x[ 4] + x[ 7], 18); + x[11] ^= R(x[10] + x[ 9], 7); + x[ 8] ^= R(x[11] + x[10], 9); + x[ 9] ^= R(x[ 8] + x[11], 13); + x[10] ^= R(x[ 9] + x[ 8], 18); + x[12] ^= R(x[15] + x[14], 7); + x[13] ^= R(x[12] + x[15], 9); + x[14] ^= R(x[13] + x[12], 13); + x[15] ^= R(x[14] + x[13], 18); + } + + for (let i = 0; i < 16; ++i) { + B[i] += x[i]; + } + } + + // naive approach... going back to loop unrolling may yield additional performance + function blockxor(S, Si, D, len) { + for (let i = 0; i < len; i++) { + D[i] ^= S[Si + i] + } + } + + function arraycopy(src, srcPos, dest, destPos, length) { + while (length--) { + dest[destPos++] = src[srcPos++]; + } + } + + function checkBufferish(o) { + if (!o || typeof(o.length) !== 'number') { return false; } + + for (let i = 0; i < o.length; i++) { + const v = o[i]; + if (typeof(v) !== 'number' || v % 1 || v < 0 || v >= 256) { + return false; + } + } + + return true; + } + + function ensureInteger(value, name) { + if (typeof(value) !== "number" || (value % 1)) { throw new Error('invalid ' + name); } + return value; + } + + // N = Cpu cost, r = Memory cost, p = parallelization cost + // callback(error, progress, key) + function _scrypt(password, salt, N, r, p, dkLen, callback) { + + N = ensureInteger(N, 'N'); + r = ensureInteger(r, 'r'); + p = ensureInteger(p, 'p'); + + dkLen = ensureInteger(dkLen, 'dkLen'); + + if (N === 0 || (N & (N - 1)) !== 0) { throw new Error('N must be power of 2'); } + + if (N > MAX_VALUE / 128 / r) { throw new Error('N too large'); } + if (r > MAX_VALUE / 128 / p) { throw new Error('r too large'); } + + if (!checkBufferish(password)) { + throw new Error('password must be an array or buffer'); + } + password = Array.prototype.slice.call(password); + + if (!checkBufferish(salt)) { + throw new Error('salt must be an array or buffer'); + } + salt = Array.prototype.slice.call(salt); + + let b = PBKDF2_HMAC_SHA256_OneIter(password, salt, p * 128 * r); + const B = new Uint32Array(p * 32 * r) + for (let i = 0; i < B.length; i++) { + const j = i * 4; + B[i] = ((b[j + 3] & 0xff) << 24) | + ((b[j + 2] & 0xff) << 16) | + ((b[j + 1] & 0xff) << 8) | + ((b[j + 0] & 0xff) << 0); + } + + const XY = new Uint32Array(64 * r); + const V = new Uint32Array(32 * r * N); + + const Yi = 32 * r; + + // scratch space + const x = new Uint32Array(16); // salsa20_8 + const _X = new Uint32Array(16); // blockmix_salsa8 + + const totalOps = p * N * 2; + let currentOp = 0; + let lastPercent10 = null; + + // Set this to true to abandon the scrypt on the next step + let stop = false; + + // State information + let state = 0; + let i0 = 0, i1; + let Bi; + + // How many blockmix_salsa8 can we do per step? + const limit = callback ? parseInt(1000 / r): 0xffffffff; + + // Trick from scrypt-async; if there is a setImmediate shim in place, use it + const nextTick = (typeof(setImmediate) !== 'undefined') ? setImmediate : setTimeout; + + // This is really all I changed; making scryptsy a state machine so we occasionally + // stop and give other evnts on the evnt loop a chance to run. ~RicMoo + const incrementalSMix = function() { + if (stop) { + return callback(new Error('cancelled'), currentOp / totalOps); + } + + let steps; + + switch (state) { + case 0: + // for (var i = 0; i < p; i++)... + Bi = i0 * 32 * r; + + arraycopy(B, Bi, XY, 0, Yi); // ROMix - 1 + + state = 1; // Move to ROMix 2 + i1 = 0; + + // Fall through + + case 1: + + // Run up to 1000 steps of the first inner smix loop + steps = N - i1; + if (steps > limit) { steps = limit; } + for (let i = 0; i < steps; i++) { // ROMix - 2 + arraycopy(XY, 0, V, (i1 + i) * Yi, Yi) // ROMix - 3 + blockmix_salsa8(XY, Yi, r, x, _X); // ROMix - 4 + } + + // for (var i = 0; i < N; i++) + i1 += steps; + currentOp += steps; + + if (callback) { + // Call the callback with the progress (optionally stopping us) + const percent10 = parseInt(1000 * currentOp / totalOps); + if (percent10 !== lastPercent10) { + stop = callback(null, currentOp / totalOps); + if (stop) { break; } + lastPercent10 = percent10; + } + } + + if (i1 < N) { break; } + + i1 = 0; // Move to ROMix 6 + state = 2; + + // Fall through + + case 2: + + // Run up to 1000 steps of the second inner smix loop + steps = N - i1; + if (steps > limit) { steps = limit; } + for (let i = 0; i < steps; i++) { // ROMix - 6 + const offset = (2 * r - 1) * 16; // ROMix - 7 + const j = XY[offset] & (N - 1); + blockxor(V, j * Yi, XY, Yi); // ROMix - 8 (inner) + blockmix_salsa8(XY, Yi, r, x, _X); // ROMix - 9 (outer) + } + + // for (var i = 0; i < N; i++)... + i1 += steps; + currentOp += steps; + + // Call the callback with the progress (optionally stopping us) + if (callback) { + const percent10 = parseInt(1000 * currentOp / totalOps); + if (percent10 !== lastPercent10) { + stop = callback(null, currentOp / totalOps); + if (stop) { break; } + lastPercent10 = percent10; + } + } + + if (i1 < N) { break; } + + arraycopy(XY, 0, B, Bi, Yi); // ROMix - 10 + + // for (var i = 0; i < p; i++)... + i0++; + if (i0 < p) { + state = 0; + break; + } + + b = []; + for (let i = 0; i < B.length; i++) { + b.push((B[i] >> 0) & 0xff); + b.push((B[i] >> 8) & 0xff); + b.push((B[i] >> 16) & 0xff); + b.push((B[i] >> 24) & 0xff); + } + + const derivedKey = PBKDF2_HMAC_SHA256_OneIter(password, b, dkLen); + + // Send the result to the callback + if (callback) { callback(null, 1.0, derivedKey); } + + // Done; don't break (which would reschedule) + return derivedKey; + } + + // Schedule the next steps + if (callback) { nextTick(incrementalSMix); } + } + + // Run the smix state machine until completion + if (!callback) { + while (true) { + const derivedKey = incrementalSMix(); + if (derivedKey != undefined) { return derivedKey; } + } + } + + // Bootstrap the async incremental smix + incrementalSMix(); + } + + const lib = { + scrypt: function(password, salt, N, r, p, dkLen, progressCallback) { + return new Promise(function(resolve, reject) { + let lastProgress = 0; + if (progressCallback) { progressCallback(0); } + _scrypt(password, salt, N, r, p, dkLen, function(error, progress, key) { + if (error) { + reject(error); + } else if (key) { + if (progressCallback && lastProgress !== 1) { + progressCallback(1); + } + resolve(new Uint8Array(key)); + } else if (progressCallback && progress !== lastProgress) { + lastProgress = progress; + return progressCallback(progress); + } + }); + }); + }, + syncScrypt: function(password, salt, N, r, p, dkLen) { + return new Uint8Array(_scrypt(password, salt, N, r, p, dkLen)); + } + }; + + // node.js + if (true) { + module.exports = lib; + + // RequireJS/AMD + // http://www.requirejs.org/docs/api.html + // https://github.com/amdjs/amdjs-api/wiki/AMD + } else {} + +})(this); + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Confirm/Confirm.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Confirm/Confirm.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_has__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/has */ "./node_modules/lodash-es/has.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../elements/Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/index.js"); +/* harmony import */ var _modules_Modal__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../modules/Modal */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/index.js"); + + + + + + + + + +/** + * A Confirm modal gives the user a choice to confirm or cancel an action/ + * @see Modal + */ + +var Confirm = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Confirm, _Component); + + function Confirm() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleCancel = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onCancel', e, _this.props); + }; + + _this.handleCancelOverrides = function (predefinedProps) { + return { + onClick: function onClick(e, buttonProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(predefinedProps, 'onClick', e, buttonProps); + + _this.handleCancel(e); + } + }; + }; + + _this.handleConfirmOverrides = function (predefinedProps) { + return { + onClick: function onClick(e, buttonProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(predefinedProps, 'onClick', e, buttonProps); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onConfirm', e, _this.props); + } + }; + }; + + return _this; + } + + var _proto = Confirm.prototype; + + _proto.render = function render() { + var _this$props = this.props, + cancelButton = _this$props.cancelButton, + confirmButton = _this$props.confirmButton, + content = _this$props.content, + header = _this$props.header, + open = _this$props.open, + size = _this$props.size; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(Confirm, this.props); // `open` is auto controlled by the Modal + // It cannot be present (even undefined) with `defaultOpen` + // only apply it if the user provided an open prop + + var openProp = {}; + if (Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_2__["default"])(this.props, 'open')) openProp.open = open; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_modules_Modal__WEBPACK_IMPORTED_MODULE_8__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, openProp, { + size: size, + onClose: this.handleCancel + }), _modules_Modal__WEBPACK_IMPORTED_MODULE_8__["default"].Header.create(header, { + autoGenerateKey: false + }), _modules_Modal__WEBPACK_IMPORTED_MODULE_8__["default"].Content.create(content, { + autoGenerateKey: false + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_modules_Modal__WEBPACK_IMPORTED_MODULE_8__["default"].Actions, null, _elements_Button__WEBPACK_IMPORTED_MODULE_7__["default"].create(cancelButton, { + autoGenerateKey: false, + overrideProps: this.handleCancelOverrides + }), _elements_Button__WEBPACK_IMPORTED_MODULE_7__["default"].create(confirmButton, { + autoGenerateKey: false, + defaultProps: { + primary: true + }, + overrideProps: this.handleConfirmOverrides + }))); + }; + + return Confirm; +}(react__WEBPACK_IMPORTED_MODULE_5__["Component"]); + +Confirm.handledProps = ["cancelButton", "confirmButton", "content", "header", "onCancel", "onConfirm", "open", "size"]; +Confirm.propTypes = true ? { + /** The cancel button text. */ + cancelButton: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** The OK button text. */ + confirmButton: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** The ModalContent text. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** The ModalHeader text. */ + header: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** + * Called when the Modal is closed without clicking confirm. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onCancel: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** + * Called when the OK button is clicked. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onConfirm: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** Whether or not the modal is visible. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A Confirm can vary in size */ + size: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['mini', 'tiny', 'small', 'large', 'fullscreen']) +} : undefined; +Confirm.defaultProps = { + cancelButton: 'Cancel', + confirmButton: 'OK', + content: 'Are you sure?', + size: 'small' +}; +/* harmony default export */ __webpack_exports__["default"] = (Confirm); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Confirm/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Confirm/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Confirm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Confirm */ "./node_modules/semantic-ui-react/dist/es/addons/Confirm/Confirm.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Confirm__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/Pagination.js": +/*!********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Pagination/Pagination.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 Pagination; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _collections_Menu__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../collections/Menu */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/index.js"); +/* harmony import */ var _PaginationItem__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PaginationItem */ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/PaginationItem.js"); + + + + + + + + + + +/** + * A component to render a pagination. + */ + +var Pagination = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Pagination, _Component); + + function Pagination() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleItemClick = function (e, _ref) { + var nextActivePage = _ref.value; + var prevActivePage = _this.state.activePage; // Heads up! We need the cast to the "number" type there, as `activePage` can be a string + + if (+prevActivePage === +nextActivePage) return; + + _this.setState({ + activePage: nextActivePage + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__["default"])(_this.props, 'onPageChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + activePage: nextActivePage + })); + }; + + _this.handleItemOverrides = function (active, type, value) { + return function (predefinedProps) { + return { + active: active, + type: type, + key: type + "-" + value, + onClick: function onClick(e, itemProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__["default"])(predefinedProps, 'onClick', e, itemProps); + + if (itemProps.type !== 'ellipsisItem') _this.handleItemClick(e, itemProps); + } + }; + }; + }; + + return _this; + } + + var _proto = Pagination.prototype; + + _proto.getInitialAutoControlledState = function getInitialAutoControlledState() { + return { + activePage: 1 + }; + }; + + _proto.render = function render() { + var _this2 = this; + + var _this$props = this.props, + ariaLabel = _this$props['aria-label'], + boundaryRange = _this$props.boundaryRange, + disabled = _this$props.disabled, + ellipsisItem = _this$props.ellipsisItem, + siblingRange = _this$props.siblingRange, + totalPages = _this$props.totalPages; + var activePage = this.state.activePage; + var items = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createPaginationItems"])({ + activePage: activePage, + boundaryRange: boundaryRange, + hideEllipsis: Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(ellipsisItem), + siblingRange: siblingRange, + totalPages: totalPages + }); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(Pagination, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_collections_Menu__WEBPACK_IMPORTED_MODULE_8__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + "aria-label": ariaLabel, + pagination: true, + role: "navigation" + }), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(items, function (_ref2) { + var active = _ref2.active, + type = _ref2.type, + value = _ref2.value; + return _PaginationItem__WEBPACK_IMPORTED_MODULE_9__["default"].create(_this2.props[type], { + defaultProps: { + content: value, + disabled: disabled, + value: value + }, + overrideProps: _this2.handleItemOverrides(active, type, value) + }); + })); + }; + + return Pagination; +}(_lib__WEBPACK_IMPORTED_MODULE_7__["ModernAutoControlledComponent"]); + +Pagination.handledProps = ["activePage", "aria-label", "boundaryRange", "defaultActivePage", "disabled", "ellipsisItem", "firstItem", "lastItem", "nextItem", "onPageChange", "pageItem", "prevItem", "siblingRange", "totalPages"]; + +Pagination.propTypes = true ? { + /** A pagination item can have an aria label. */ + 'aria-label': prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Initial activePage value. */ + defaultActivePage: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]), + + /** Index of the currently active page. */ + activePage: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]), + + /** Number of always visible pages at the beginning and end. */ + boundaryRange: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]), + + /** A pagination can be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A shorthand for PaginationItem. */ + ellipsisItem: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A shorthand for PaginationItem. */ + firstItem: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A shorthand for PaginationItem. */ + lastItem: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A shorthand for PaginationItem. */ + nextItem: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A shorthand for PaginationItem. */ + pageItem: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A shorthand for PaginationItem. */ + prevItem: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** + * Called on change of an active page. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onPageChange: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** Number of always visible pages before and after the current one. */ + siblingRange: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]), + + /** Total number of pages. */ + totalPages: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]).isRequired +} : undefined; +Pagination.autoControlledProps = ['activePage']; +Pagination.defaultProps = { + 'aria-label': 'Pagination Navigation', + boundaryRange: 1, + ellipsisItem: '...', + firstItem: { + 'aria-label': 'First item', + content: '«' + }, + lastItem: { + 'aria-label': 'Last item', + content: '»' + }, + nextItem: { + 'aria-label': 'Next item', + content: '⟩' + }, + pageItem: {}, + prevItem: { + 'aria-label': 'Previous item', + content: '⟨' + }, + siblingRange: 1 +}; +Pagination.Item = _PaginationItem__WEBPACK_IMPORTED_MODULE_9__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/PaginationItem.js": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Pagination/PaginationItem.js ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! keyboard-key */ "./node_modules/keyboard-key/src/keyboardKey.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(keyboard_key__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _collections_Menu_MenuItem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../collections/Menu/MenuItem */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuItem.js"); + + + + + + + +/** + * An item of a pagination. + */ + +var PaginationItem = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(PaginationItem, _Component); + + function PaginationItem() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(_this.props, 'onClick', e, _this.props); + }; + + _this.handleKeyDown = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(_this.props, 'onKeyDown', e, _this.props); + + if (keyboard_key__WEBPACK_IMPORTED_MODULE_2___default.a.getCode(e) === keyboard_key__WEBPACK_IMPORTED_MODULE_2___default.a.Enter) Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(_this.props, 'onClick', e, _this.props); + }; + + _this.handleOverrides = function () { + return { + onClick: _this.handleClick, + onKeyDown: _this.handleKeyDown + }; + }; + + return _this; + } + + var _proto = PaginationItem.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + type = _this$props.type; + var disabled = this.props.disabled || type === 'ellipsisItem'; + return _collections_Menu_MenuItem__WEBPACK_IMPORTED_MODULE_6__["default"].create(this.props, { + defaultProps: { + active: active, + 'aria-current': active, + 'aria-disabled': disabled, + disabled: disabled, + onClick: this.handleClick, + onKeyDown: this.handleKeyDown, + tabIndex: disabled ? -1 : 0 + }, + overrideProps: this.handleOverrides + }); + }; + + return PaginationItem; +}(react__WEBPACK_IMPORTED_MODULE_4__["Component"]); + +PaginationItem.handledProps = ["active", "disabled", "onClick", "onKeyDown", "type"]; +PaginationItem.propTypes = true ? { + /** A pagination item can be active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A pagination item can be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** + * Called on key down. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onKeyDown: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** A pagination should have a type. */ + type: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['ellipsisItem', 'firstItem', 'prevItem', 'pageItem', 'nextItem', 'lastItem']) +} : undefined; +PaginationItem.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(PaginationItem, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (PaginationItem); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/index.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Pagination/index.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Pagination__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Pagination */ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/Pagination.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Pagination__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Portal/Portal.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Portal/Portal.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @semantic-ui-react/event-stack */ "./node_modules/@semantic-ui-react/event-stack/lib/index.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! keyboard-key */ "./node_modules/keyboard-key/src/keyboardKey.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(keyboard_key__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _utils_validateTrigger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utils/validateTrigger */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/utils/validateTrigger.js"); +/* harmony import */ var _PortalInner__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./PortalInner */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/PortalInner.js"); + + + + + + + + + + + + +/** + * A component that allows you to render children outside their parent. + * @see Modal + * @see Popup + * @see Dimmer + * @see Confirm + */ +var Portal = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Portal, _Component); + + function Portal() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.contentRef = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createRef(); + _this.triggerRef = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createRef(); + _this.latestDocumentMouseDownEvent = null; + + _this.handleDocumentMouseDown = function (e) { + _this.latestDocumentMouseDownEvent = e; + }; + + _this.handleDocumentClick = function (e) { + var closeOnDocumentClick = _this.props.closeOnDocumentClick; + var currentMouseDownEvent = _this.latestDocumentMouseDownEvent; + _this.latestDocumentMouseDownEvent = null; + + if (!_this.contentRef.current || // no portal + Object(_lib__WEBPACK_IMPORTED_MODULE_8__["doesNodeContainClick"])(_this.triggerRef.current, e) || // event happened in trigger (delegate to trigger handlers) + currentMouseDownEvent && Object(_lib__WEBPACK_IMPORTED_MODULE_8__["doesNodeContainClick"])(_this.contentRef.current, currentMouseDownEvent) || // event originated in the portal but was ended outside + Object(_lib__WEBPACK_IMPORTED_MODULE_8__["doesNodeContainClick"])(_this.contentRef.current, e) // event happened in the portal + ) { + return; + } // ignore the click + + + if (closeOnDocumentClick) { + _this.close(e); + } + }; + + _this.handleEscape = function (e) { + if (!_this.props.closeOnEscape) return; + if (keyboard_key__WEBPACK_IMPORTED_MODULE_5___default.a.getCode(e) !== keyboard_key__WEBPACK_IMPORTED_MODULE_5___default.a.Escape) return; + + _this.close(e); + }; + + _this.handlePortalMouseLeave = function (e) { + var _this$props = _this.props, + closeOnPortalMouseLeave = _this$props.closeOnPortalMouseLeave, + mouseLeaveDelay = _this$props.mouseLeaveDelay; + if (!closeOnPortalMouseLeave) return; // Do not close the portal when 'mouseleave' is triggered by children + + if (e.target !== _this.contentRef.current) return; + _this.mouseLeaveTimer = _this.closeWithTimeout(e, mouseLeaveDelay); + }; + + _this.handlePortalMouseEnter = function () { + // In order to enable mousing from the trigger to the portal, we need to + // clear the mouseleave timer that was set when leaving the trigger. + var closeOnPortalMouseLeave = _this.props.closeOnPortalMouseLeave; + if (!closeOnPortalMouseLeave) return; + clearTimeout(_this.mouseLeaveTimer); + }; + + _this.handleTriggerBlur = function (e) { + var _this$props2 = _this.props, + trigger = _this$props2.trigger, + closeOnTriggerBlur = _this$props2.closeOnTriggerBlur; // Call original event handler + + for (var _len2 = arguments.length, rest = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + rest[_key2 - 1] = arguments[_key2]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"].apply(void 0, [trigger, 'props.onBlur', e].concat(rest)); // IE 11 doesn't work with relatedTarget in blur events + + + var target = e.relatedTarget || document.activeElement; // do not close if focus is given to the portal + + var didFocusPortal = Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.contentRef.current, 'contains', target); + + if (!closeOnTriggerBlur || didFocusPortal) return; + + _this.close(e); + }; + + _this.handleTriggerClick = function (e) { + var _this$props3 = _this.props, + trigger = _this$props3.trigger, + closeOnTriggerClick = _this$props3.closeOnTriggerClick, + openOnTriggerClick = _this$props3.openOnTriggerClick; + var open = _this.state.open; // Call original event handler + + for (var _len3 = arguments.length, rest = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + rest[_key3 - 1] = arguments[_key3]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"].apply(void 0, [trigger, 'props.onClick', e].concat(rest)); + + if (open && closeOnTriggerClick) { + _this.close(e); + } else if (!open && openOnTriggerClick) { + _this.open(e); + } + }; + + _this.handleTriggerFocus = function (e) { + var _this$props4 = _this.props, + trigger = _this$props4.trigger, + openOnTriggerFocus = _this$props4.openOnTriggerFocus; // Call original event handler + + for (var _len4 = arguments.length, rest = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { + rest[_key4 - 1] = arguments[_key4]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"].apply(void 0, [trigger, 'props.onFocus', e].concat(rest)); + + if (!openOnTriggerFocus) return; + + _this.open(e); + }; + + _this.handleTriggerMouseLeave = function (e) { + clearTimeout(_this.mouseEnterTimer); + var _this$props5 = _this.props, + trigger = _this$props5.trigger, + closeOnTriggerMouseLeave = _this$props5.closeOnTriggerMouseLeave, + mouseLeaveDelay = _this$props5.mouseLeaveDelay; // Call original event handler + + for (var _len5 = arguments.length, rest = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { + rest[_key5 - 1] = arguments[_key5]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"].apply(void 0, [trigger, 'props.onMouseLeave', e].concat(rest)); + + if (!closeOnTriggerMouseLeave) return; + _this.mouseLeaveTimer = _this.closeWithTimeout(e, mouseLeaveDelay); + }; + + _this.handleTriggerMouseEnter = function (e) { + clearTimeout(_this.mouseLeaveTimer); + var _this$props6 = _this.props, + trigger = _this$props6.trigger, + mouseEnterDelay = _this$props6.mouseEnterDelay, + openOnTriggerMouseEnter = _this$props6.openOnTriggerMouseEnter; // Call original event handler + + for (var _len6 = arguments.length, rest = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + rest[_key6 - 1] = arguments[_key6]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"].apply(void 0, [trigger, 'props.onMouseEnter', e].concat(rest)); + + if (!openOnTriggerMouseEnter) return; + _this.mouseEnterTimer = _this.openWithTimeout(e, mouseEnterDelay); + }; + + _this.open = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onOpen', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: true + })); + + _this.setState({ + open: true + }); + }; + + _this.openWithTimeout = function (e, delay) { + // React wipes the entire event object and suggests using e.persist() if + // you need the event for async access. However, even with e.persist + // certain required props (e.g. currentTarget) are null so we're forced to clone. + var eventClone = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, e); + + return setTimeout(function () { + return _this.open(eventClone); + }, delay || 0); + }; + + _this.close = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClose', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: false + })); + + _this.setState({ + open: false + }); + }; + + _this.closeWithTimeout = function (e, delay) { + // React wipes the entire event object and suggests using e.persist() if + // you need the event for async access. However, even with e.persist + // certain required props (e.g. currentTarget) are null so we're forced to clone. + var eventClone = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, e); + + return setTimeout(function () { + return _this.close(eventClone); + }, delay || 0); + }; + + _this.handleMount = function () { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onMount', null, _this.props); + }; + + _this.handleUnmount = function () { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onUnmount', null, _this.props); + }; + + _this.handleTriggerRef = function (c) { + _this.triggerRef.current = c; + Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["handleRef"])(_this.props.triggerRef, c); + }; + + return _this; + } + + var _proto = Portal.prototype; + + _proto.componentWillUnmount = function componentWillUnmount() { + // Clean up timers + clearTimeout(this.mouseEnterTimer); + clearTimeout(this.mouseLeaveTimer); + } // ---------------------------------------- + // Document Event Handlers + // ---------------------------------------- + ; + + _proto.render = function render() { + var _this$props7 = this.props, + children = _this$props7.children, + eventPool = _this$props7.eventPool, + mountNode = _this$props7.mountNode, + trigger = _this$props7.trigger; + var open = this.state.open; + /* istanbul ignore else */ + + if (true) { + Object(_utils_validateTrigger__WEBPACK_IMPORTED_MODULE_9__["default"])(trigger); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment, null, open && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_PortalInner__WEBPACK_IMPORTED_MODULE_10__["default"], { + innerRef: this.contentRef, + mountNode: mountNode, + onMount: this.handleMount, + onUnmount: this.handleUnmount + }, children), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3___default.a, { + name: "mouseleave", + on: this.handlePortalMouseLeave, + pool: eventPool, + target: this.contentRef + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3___default.a, { + name: "mouseenter", + on: this.handlePortalMouseEnter, + pool: eventPool, + target: this.contentRef + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3___default.a, { + name: "mousedown", + on: this.handleDocumentMouseDown, + pool: eventPool + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3___default.a, { + name: "click", + on: this.handleDocumentClick, + pool: eventPool + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_3___default.a, { + name: "keydown", + on: this.handleEscape, + pool: eventPool + })), trigger && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["Ref"], { + innerRef: this.handleTriggerRef + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.cloneElement(trigger, { + onBlur: this.handleTriggerBlur, + onClick: this.handleTriggerClick, + onFocus: this.handleTriggerFocus, + onMouseLeave: this.handleTriggerMouseLeave, + onMouseEnter: this.handleTriggerMouseEnter + }))); + }; + + return Portal; +}(_lib__WEBPACK_IMPORTED_MODULE_8__["ModernAutoControlledComponent"]); + +Portal.handledProps = ["children", "closeOnDocumentClick", "closeOnEscape", "closeOnPortalMouseLeave", "closeOnTriggerBlur", "closeOnTriggerClick", "closeOnTriggerMouseLeave", "defaultOpen", "eventPool", "mountNode", "mouseEnterDelay", "mouseLeaveDelay", "onClose", "onMount", "onOpen", "onUnmount", "open", "openOnTriggerClick", "openOnTriggerFocus", "openOnTriggerMouseEnter", "trigger", "triggerRef"]; +Portal.propTypes = true ? { + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.node.isRequired, + + /** Controls whether or not the portal should close when the document is clicked. */ + closeOnDocumentClick: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should close when escape is pressed is displayed. */ + closeOnEscape: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** + * Controls whether or not the portal should close when mousing out of the portal. + * NOTE: This will prevent `closeOnTriggerMouseLeave` when mousing over the + * gap from the trigger to the portal. + */ + closeOnPortalMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should close on blur of the trigger. */ + closeOnTriggerBlur: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should close on click of the trigger. */ + closeOnTriggerClick: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should close when mousing out of the trigger. */ + closeOnTriggerMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Initial value of open. */ + defaultOpen: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Event pool namespace that is used to handle component events */ + eventPool: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** The node where the portal should mount. */ + mountNode: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.any, + + /** Milliseconds to wait before opening on mouse over */ + mouseEnterDelay: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, + + /** Milliseconds to wait before closing on mouse leave */ + mouseLeaveDelay: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, + + /** + * Called when a close event happens + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClose: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Called when the portal is mounted on the DOM. + * + * @param {null} + * @param {object} data - All props. + */ + onMount: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Called when an open event happens + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onOpen: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Called when the portal is unmounted from the DOM. + * + * @param {null} + * @param {object} data - All props. + */ + onUnmount: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** Controls whether or not the portal is displayed. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should open when the trigger is clicked. */ + openOnTriggerClick: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should open on focus of the trigger. */ + openOnTriggerFocus: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Controls whether or not the portal should open when mousing over the trigger. */ + openOnTriggerMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Element to be rendered in-place where the portal is defined. */ + trigger: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.node, + + /** Called with a ref to the trigger node. */ + triggerRef: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].ref +} : undefined; +Portal.defaultProps = { + closeOnDocumentClick: true, + closeOnEscape: true, + eventPool: 'default', + openOnTriggerClick: true +}; +Portal.autoControlledProps = ['open']; +Portal.Inner = _PortalInner__WEBPACK_IMPORTED_MODULE_10__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Portal); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Portal/PortalInner.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Portal/PortalInner.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react-dom */ "./node_modules/react-dom/index.js"); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + +/** + * An inner component that allows you to render children outside their parent. + */ +var PortalInner = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(PortalInner, _Component); + + function PortalInner() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleRef = function (c) { + Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_2__["handleRef"])(_this.props.innerRef, c); + }; + + return _this; + } + + var _proto = PortalInner.prototype; + + _proto.componentDidMount = function componentDidMount() { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(this.props, 'onMount', null, this.props); + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(this.props, 'onUnmount', null, this.props); + }; + + _proto.render = function render() { + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_6__["isBrowser"])()) return null; + var _this$props = this.props, + children = _this$props.children, + _this$props$mountNode = _this$props.mountNode, + mountNode = _this$props$mountNode === void 0 ? document.body : _this$props$mountNode; + return /*#__PURE__*/Object(react_dom__WEBPACK_IMPORTED_MODULE_5__["createPortal"])( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_2__["Ref"], { + innerRef: this.handleRef + }, children), mountNode); + }; + + return PortalInner; +}(react__WEBPACK_IMPORTED_MODULE_4__["Component"]); + +PortalInner.handledProps = ["children", "innerRef", "mountNode", "onMount", "onUnmount"]; +PortalInner.propTypes = true ? { + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node.isRequired, + + /** Called with a ref to the inner node. */ + innerRef: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].ref, + + /** The node where the portal should mount. */ + mountNode: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any, + + /** + * Called when the portal is mounted on the DOM + * + * @param {null} + * @param {object} data - All props. + */ + onMount: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** + * Called when the portal is unmounted from the DOM + * + * @param {null} + * @param {object} data - All props. + */ + onUnmount: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (PortalInner); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Portal */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/Portal.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Portal__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Portal/utils/validateTrigger.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Portal/utils/validateTrigger.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 validateTrigger; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-is */ "./node_modules/react-is/index.js"); +/* harmony import */ var react_is__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_is__WEBPACK_IMPORTED_MODULE_1__); + + +/** + * Asserts that a passed element can be used cloned a props will be applied properly. + */ + +function validateTrigger(element) { + if (element) { + react__WEBPACK_IMPORTED_MODULE_0___default.a.Children.only(element); + + if (react_is__WEBPACK_IMPORTED_MODULE_1__["isFragment"](element)) { + throw new Error('An "React.Fragment" cannot be used as a `trigger`.'); + } + } +} + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Radio/Radio.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Radio/Radio.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _modules_Checkbox__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../modules/Checkbox */ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/index.js"); + + + + +/** + * A Radio is sugar for <Checkbox radio />. + * Useful for exclusive groups of sliders or toggles. + * @see Checkbox + * @see Form + */ + +function Radio(props) { + var slider = props.slider, + toggle = props.toggle, + type = props.type; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_2__["getUnhandledProps"])(Radio, props); // const ElementType = getElementType(Radio, props) + // radio, slider, toggle are exclusive + // use an undefined radio if slider or toggle are present + + var radio = !(slider || toggle) || undefined; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_modules_Checkbox__WEBPACK_IMPORTED_MODULE_3__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + type: type, + radio: radio, + slider: slider, + toggle: toggle + })); +} + +Radio.handledProps = ["slider", "toggle", "type"]; +Radio.propTypes = true ? { + /** Format to emphasize the current selection state. */ + slider: _modules_Checkbox__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes.slider, + + /** Format to show an on or off choice. */ + toggle: _modules_Checkbox__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes.toggle, + + /** HTML input type, either checkbox or radio. */ + type: _modules_Checkbox__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes.type +} : undefined; +Radio.defaultProps = { + type: 'radio' +}; +/* harmony default export */ __webpack_exports__["default"] = (Radio); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Radio/index.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Radio/index.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Radio__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Radio */ "./node_modules/semantic-ui-react/dist/es/addons/Radio/Radio.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Radio__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Select/Select.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Select/Select.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../modules/Dropdown */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/index.js"); + + + + +/** + * A Select is sugar for <Dropdown selection />. + * @see Dropdown + * @see Form + */ + +function Select(props) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { + selection: true + })); +} + +Select.handledProps = ["options"]; +Select.propTypes = true ? { + /** Array of Dropdown.Item props e.g. `{ text: '', value: '' }` */ + options: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape(_modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__["default"].Item.propTypes)).isRequired +} : undefined; +Select.Divider = _modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__["default"].Divider; +Select.Header = _modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__["default"].Header; +Select.Item = _modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__["default"].Item; +Select.Menu = _modules_Dropdown__WEBPACK_IMPORTED_MODULE_3__["default"].Menu; +/* harmony default export */ __webpack_exports__["default"] = (Select); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/Select/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/Select/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Select */ "./node_modules/semantic-ui-react/dist/es/addons/Select/Select.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Select__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/TextArea/TextArea.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/TextArea/TextArea.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + +/** + * A TextArea can be used to allow for extended user input. + * @see Form + */ + +var TextArea = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(TextArea, _Component); + + function TextArea() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.ref = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_6__["createRef"])(); + + _this.focus = function () { + return _this.ref.current.focus(); + }; + + _this.handleChange = function (e) { + var value = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_3__["default"])(e, 'target.value'); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: value + })); + }; + + _this.handleInput = function (e) { + var value = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_3__["default"])(e, 'target.value'); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onInput', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: value + })); + }; + + return _this; + } + + var _proto = TextArea.prototype; + + _proto.render = function render() { + var _this$props = this.props, + rows = _this$props.rows, + value = _this$props.value; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(TextArea, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(TextArea, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["Ref"], { + innerRef: this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + onChange: this.handleChange, + onInput: this.handleInput, + rows: rows, + value: value + }))); + }; + + return TextArea; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +TextArea.handledProps = ["as", "onChange", "onInput", "rows", "value"]; +TextArea.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** + * Called on change. + * @param {SyntheticEvent} event - The React SyntheticEvent object + * @param {object} data - All props and the event value. + */ + onChange: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Called on input. + * @param {SyntheticEvent} event - The React SyntheticEvent object + * @param {object} data - All props and the event value. + */ + onInput: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** Indicates row count for a TextArea. */ + rows: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]), + + /** The value of the textarea. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]) +} : undefined; +TextArea.defaultProps = { + as: 'textarea', + rows: 3 +}; +/* harmony default export */ __webpack_exports__["default"] = (TextArea); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/TextArea/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/TextArea/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _TextArea__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TextArea */ "./node_modules/semantic-ui-react/dist/es/addons/TextArea/TextArea.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _TextArea__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/TransitionablePortal/TransitionablePortal.js": +/*!****************************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/TransitionablePortal/TransitionablePortal.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 TransitionablePortal; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _Portal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Portal */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js"); +/* harmony import */ var _modules_Transition__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../modules/Transition */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/index.js"); +/* harmony import */ var _modules_Transition_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../modules/Transition/utils/computeStatuses */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/computeStatuses.js"); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + + + + +/** + * A sugar for `Portal` and `Transition`. + * @see Portal + * @see Transition + */ +var TransitionablePortal = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(TransitionablePortal, _Component); + + function TransitionablePortal() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.state = {}; + + _this.handlePortalClose = function () { + _this.setState({ + portalOpen: -1 + }); + }; + + _this.handlePortalOpen = function () { + _this.setState({ + portalOpen: true + }); + }; + + _this.handleTransitionHide = function (nothing, data) { + var portalOpen = _this.state.portalOpen; + + _this.setState({ + transitionVisible: false + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClose', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, data, { + portalOpen: false, + transitionVisible: false + })); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onHide', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, data, { + portalOpen: portalOpen, + transitionVisible: false + })); + }; + + _this.handleTransitionStart = function (nothing, data) { + var portalOpen = _this.state.portalOpen; + var status = data.status; + var transitionVisible = status === _modules_Transition_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_8__["TRANSITION_STATUS_ENTERING"]; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onStart', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, data, { + portalOpen: portalOpen, + transitionVisible: transitionVisible + })); // Heads up! TransitionablePortal fires onOpen callback on the start of transition animation + + + if (!transitionVisible) return; + + _this.setState({ + transitionVisible: transitionVisible + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onOpen', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, data, { + transitionVisible: transitionVisible, + portalOpen: true + })); + }; + + return _this; + } + + // ---------------------------------------- + // Lifecycle + // ---------------------------------------- + TransitionablePortal.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + // This is definitely a hack :( + // + // It's coupled with handlePortalClose() for force set the state of `portalOpen` omitting + // props.open. It's related to implementation of the component itself as `onClose()` will be + // called after a transition will end. + // https://github.com/Semantic-Org/Semantic-UI-React/issues/2382 + if (state.portalOpen === -1) { + return { + portalOpen: false + }; + } + + if (Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_3__["default"])(props.open)) { + return null; + } + + return { + portalOpen: props.open + }; + } // ---------------------------------------- + // Callback handling + // ---------------------------------------- + ; + + var _proto = TransitionablePortal.prototype; + + // ---------------------------------------- + // Render + // ---------------------------------------- + _proto.render = function render() { + var _this$props = this.props, + children = _this$props.children, + transition = _this$props.transition; + var _this$state = this.state, + portalOpen = _this$state.portalOpen, + transitionVisible = _this$state.transitionVisible; + var open = portalOpen || transitionVisible; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getUnhandledProps"])(TransitionablePortal, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_Portal__WEBPACK_IMPORTED_MODULE_6__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + open: open, + onOpen: this.handlePortalOpen, + onClose: this.handlePortalClose + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_modules_Transition__WEBPACK_IMPORTED_MODULE_7__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, transition, { + transitionOnMount: true, + onStart: this.handleTransitionStart, + onHide: this.handleTransitionHide, + visible: portalOpen + }), children)); + }; + + return TransitionablePortal; +}(react__WEBPACK_IMPORTED_MODULE_5__["Component"]); + +TransitionablePortal.handledProps = ["children", "onClose", "onHide", "onOpen", "onStart", "open", "transition"]; + +TransitionablePortal.propTypes = true ? { + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node.isRequired, + + /** + * Called when a close event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and internal state. + */ + onClose: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** + * Callback on each transition that changes visibility to hidden. + * + * @param {null} + * @param {object} data - All props with transition status and internal state. + */ + onHide: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** + * Called when an open event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and internal state. + */ + onOpen: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** + * Callback on animation start. + * + * @param {null} + * @param {object} data - All props with transition status and internal state. + */ + onStart: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** Controls whether or not the portal is displayed. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Transition props. */ + transition: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object +} : undefined; +TransitionablePortal.defaultProps = { + transition: { + animation: 'scale', + duration: 400 + } +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/addons/TransitionablePortal/index.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/addons/TransitionablePortal/index.js ***! + \*************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _TransitionablePortal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TransitionablePortal */ "./node_modules/semantic-ui-react/dist/es/addons/TransitionablePortal/TransitionablePortal.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _TransitionablePortal__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/behaviors/Visibility/Visibility.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/behaviors/Visibility/Visibility.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 Visibility; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_forEach__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/forEach */ "./node_modules/lodash-es/forEach.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + + + +/** + * Visibility provides a set of callbacks for when a content appears in the viewport. + */ + +var Visibility = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Visibility, _Component); + + function Visibility() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.calculations = { + bottomPassed: false, + bottomVisible: false, + fits: false, + passing: false, + offScreen: false, + onScreen: false, + topPassed: false, + topVisible: false + }; + _this.firedCallbacks = []; + _this.ref = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_8__["createRef"])(); + + _this.fire = function (_ref, value, reverse) { + var callback = _ref.callback, + name = _ref.name; + + if (reverse === void 0) { + reverse = false; + } + + var _this$props = _this.props, + continuous = _this$props.continuous, + once = _this$props.once; // Heads up! For the execution is required: + // - current value correspond to the fired direction + // - `continuous` is true or calculation values are different + + var matchesDirection = _this.calculations[value] !== reverse; + var executionPossible = continuous || _this.calculations[value] !== _this.oldCalculations[value]; + if (matchesDirection && executionPossible) _this.execute(callback, name); // Heads up! We should remove callback from the happened when it's not `once` + + if (!once) _this.firedCallbacks = Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_4__["default"])(_this.firedCallbacks, name); + }; + + _this.handleUpdate = function () { + if (_this.ticking) return; + _this.ticking = true; + _this.frameId = requestAnimationFrame(_this.update); + }; + + _this.update = function () { + if (!_this.mounted) return; + _this.ticking = false; + _this.oldCalculations = _this.calculations; + _this.calculations = _this.computeCalculations(); + _this.pageYOffset = _this.getPageYOffset(); + var _this$props2 = _this.props, + onBottomPassed = _this$props2.onBottomPassed, + onBottomPassedReverse = _this$props2.onBottomPassedReverse, + onBottomVisible = _this$props2.onBottomVisible, + onBottomVisibleReverse = _this$props2.onBottomVisibleReverse, + onPassing = _this$props2.onPassing, + onPassingReverse = _this$props2.onPassingReverse, + onTopPassed = _this$props2.onTopPassed, + onTopPassedReverse = _this$props2.onTopPassedReverse, + onTopVisible = _this$props2.onTopVisible, + onTopVisibleReverse = _this$props2.onTopVisibleReverse, + onOffScreen = _this$props2.onOffScreen, + onOnScreen = _this$props2.onOnScreen, + updateOn = _this$props2.updateOn; + var forward = { + bottomPassed: { + callback: onBottomPassed, + name: 'onBottomPassed' + }, + bottomVisible: { + callback: onBottomVisible, + name: 'onBottomVisible' + }, + passing: { + callback: onPassing, + name: 'onPassing' + }, + offScreen: { + callback: onOffScreen, + name: 'onOffScreen' + }, + onScreen: { + callback: onOnScreen, + name: 'onOnScreen' + }, + topPassed: { + callback: onTopPassed, + name: 'onTopPassed' + }, + topVisible: { + callback: onTopVisible, + name: 'onTopVisible' + } + }; + var reverse = { + bottomPassed: { + callback: onBottomPassedReverse, + name: 'onBottomPassedReverse' + }, + bottomVisible: { + callback: onBottomVisibleReverse, + name: 'onBottomVisibleReverse' + }, + passing: { + callback: onPassingReverse, + name: 'onPassingReverse' + }, + topPassed: { + callback: onTopPassedReverse, + name: 'onTopPassedReverse' + }, + topVisible: { + callback: onTopVisibleReverse, + name: 'onTopVisibleReverse' + } + }; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onUpdate', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + calculations: _this.calculations + })); + + _this.fireOnPassed(); // Heads up! Reverse callbacks should be fired first + + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_3__["default"])(reverse, function (data, value) { + return _this.fire(data, value, true); + }); + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_3__["default"])(forward, function (data, value) { + return _this.fire(data, value); + }); + + if (updateOn === 'repaint') _this.handleUpdate(); + }; + + return _this; + } + + var _proto = Visibility.prototype; + + // ---------------------------------------- + // Lifecycle + // ---------------------------------------- + _proto.componentDidMount = function componentDidMount() { + this.mounted = true; + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_9__["isBrowser"])()) return; + var _this$props3 = this.props, + context = _this$props3.context, + fireOnMount = _this$props3.fireOnMount, + updateOn = _this$props3.updateOn; + this.pageYOffset = this.getPageYOffset(); + this.attachHandlers(context, updateOn); + if (fireOnMount) this.update(); + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps) { + var cleanHappened = prevProps.continuous !== this.props.continuous || prevProps.once !== this.props.once || prevProps.updateOn !== this.props.updateOn; // Heads up! We should clean up array of happened callbacks, if values of these props are changed + + if (cleanHappened) this.firedCallbacks = []; + + if (prevProps.context !== this.props.context || prevProps.updateOn !== this.props.updateOn) { + this.unattachHandlers(prevProps.context); + this.attachHandlers(this.props.context, this.props.updateOn); + } + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + var context = this.props.context; + this.unattachHandlers(context); + this.mounted = false; + }; + + _proto.attachHandlers = function attachHandlers(context, updateOn) { + if (updateOn === 'events') { + if (context) { + _lib__WEBPACK_IMPORTED_MODULE_9__["eventStack"].sub('resize', this.handleUpdate, { + target: context + }); + _lib__WEBPACK_IMPORTED_MODULE_9__["eventStack"].sub('scroll', this.handleUpdate, { + target: context + }); + } + + return; + } // Heads up! + // We will deal with `repaint` there + + + this.handleUpdate(); + }; + + _proto.unattachHandlers = function unattachHandlers(context) { + if (context) { + _lib__WEBPACK_IMPORTED_MODULE_9__["eventStack"].unsub('resize', this.handleUpdate, { + target: context + }); + _lib__WEBPACK_IMPORTED_MODULE_9__["eventStack"].unsub('scroll', this.handleUpdate, { + target: context + }); + } + + if (this.frameId) cancelAnimationFrame(this.frameId); + } // ---------------------------------------- + // Callback handling + // ---------------------------------------- + ; + + _proto.execute = function execute(callback, name) { + var continuous = this.props.continuous; + if (!callback) return; // Heads up! When `continuous` is true, callback will be fired always + + if (!continuous && Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_5__["default"])(this.firedCallbacks, name)) return; + callback(null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, this.props, { + calculations: this.calculations + })); + this.firedCallbacks.push(name); + }; + + _proto.fireOnPassed = function fireOnPassed() { + var _this2 = this; + + var _this$calculations = this.calculations, + percentagePassed = _this$calculations.percentagePassed, + pixelsPassed = _this$calculations.pixelsPassed; + var onPassed = this.props.onPassed; + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_3__["default"])(onPassed, function (callback, passed) { + var pixelsValue = Number(passed); + + if (pixelsValue && pixelsPassed >= pixelsValue) { + _this2.execute(callback, passed); + + return; + } + + var matchPercentage = ("" + passed).match(/^(\d+)%$/); + if (!matchPercentage) return; + var percentageValue = Number(matchPercentage[1]) / 100; + if (percentagePassed >= percentageValue) _this2.execute(callback, passed); + }); + }; + + // ---------------------------------------- + // Helpers + // ---------------------------------------- + _proto.computeCalculations = function computeCalculations() { + var offset = this.props.offset; + + var _this$ref$current$get = this.ref.current.getBoundingClientRect(), + bottom = _this$ref$current$get.bottom, + height = _this$ref$current$get.height, + top = _this$ref$current$get.top, + width = _this$ref$current$get.width; + + var _normalizeOffset = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["normalizeOffset"])(offset), + topOffset = _normalizeOffset[0], + bottomOffset = _normalizeOffset[1]; + + var newOffset = this.getPageYOffset(); + var direction = newOffset > this.pageYOffset ? 'down' : 'up'; + var topPassed = top < topOffset; + var bottomPassed = bottom < bottomOffset; + var pixelsPassed = bottomPassed ? 0 : Math.max(top * -1, 0); + var percentagePassed = pixelsPassed / height; + var bottomVisible = bottom >= bottomOffset && bottom <= window.innerHeight; + var topVisible = top >= topOffset && top <= window.innerHeight; + var fits = topVisible && bottomVisible; + var passing = topPassed && !bottomPassed; + var onScreen = (topVisible || topPassed) && !bottomPassed; + var offScreen = !onScreen; + return { + bottomPassed: bottomPassed, + bottomVisible: bottomVisible, + direction: direction, + fits: fits, + height: height, + passing: passing, + percentagePassed: percentagePassed, + pixelsPassed: pixelsPassed, + offScreen: offScreen, + onScreen: onScreen, + topPassed: topPassed, + topVisible: topVisible, + width: width + }; + }; + + _proto.getPageYOffset = function getPageYOffset() { + var context = this.props.context; + + if (context) { + // Heads up! `window` doesn't have `pageYOffset` property + return context === window ? window.pageYOffset : context.scrollTop; + } + + return 0; + } // ---------------------------------------- + // Render + // ---------------------------------------- + ; + + _proto.render = function render() { + var children = this.props.children; + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getElementType"])(Visibility, this.props); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getUnhandledProps"])(Visibility, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_6__["Ref"], { + innerRef: this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(ElementType, rest, children)); + }; + + return Visibility; +}(react__WEBPACK_IMPORTED_MODULE_8__["Component"]); + +Visibility.handledProps = ["as", "children", "context", "continuous", "fireOnMount", "offset", "onBottomPassed", "onBottomPassedReverse", "onBottomVisible", "onBottomVisibleReverse", "onOffScreen", "onOnScreen", "onPassed", "onPassing", "onPassingReverse", "onTopPassed", "onTopPassedReverse", "onTopVisible", "onTopVisibleReverse", "onUpdate", "once", "updateOn"]; + +Visibility.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node, + + /** Context which visibility should attach onscroll events. */ + context: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object, + + /** + * When set to true a callback will occur anytime an element passes a condition not just immediately after the + * threshold is met. + */ + continuous: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Fires callbacks immediately after mount. */ + fireOnMount: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** + * Element's bottom edge has passed top of screen. + * + * @param {null} + * @param {object} data - All props. + */ + onBottomPassed: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's bottom edge has not passed top of screen. + * + * @param {null} + * @param {object} data - All props. + */ + onBottomPassedReverse: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's bottom edge has passed bottom of screen + * + * @param {null} + * @param {object} data - All props. + */ + onBottomVisible: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's bottom edge has not passed bottom of screen. + * + * @param {null} + * @param {object} data - All props. + */ + onBottomVisibleReverse: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Value that context should be adjusted in pixels. Useful for making content appear below content fixed to the + * page. + */ + offset: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]))]), + + /** When set to false a callback will occur each time an element passes the threshold for a condition. */ + once: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Element is not visible on the screen. */ + onPassed: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.object, + + /** + * Any part of an element is visible on screen. + * + * @param {null} + * @param {object} data - All props. + */ + onPassing: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's top has not passed top of screen but bottom has. + * + * @param {null} + * @param {object} data - All props. + */ + onPassingReverse: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element is not visible on the screen. + * + * @param {null} + * @param {object} data - All props. + */ + onOffScreen: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element is visible on the screen. + * + * @param {null} + * @param {object} data - All props. + */ + onOnScreen: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's top edge has passed top of the screen. + * + * @param {null} + * @param {object} data - All props. + */ + onTopPassed: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's top edge has not passed top of the screen. + * + * @param {null} + * @param {object} data - All props. + */ + onTopPassedReverse: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's top edge has passed bottom of screen. + * + * @param {null} + * @param {object} data - All props. + */ + onTopVisible: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's top edge has not passed bottom of screen. + * + * @param {null} + * @param {object} data - All props. + */ + onTopVisibleReverse: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Element's top edge has passed bottom of screen. + * + * @param {null} + * @param {object} data - All props. + */ + onUpdate: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Allows to choose the mode of the position calculations: + * - `events` - (default) update and fire callbacks only on scroll/resize events + * - `repaint` - update and fire callbacks on browser repaint (animation frames) + */ + updateOn: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['events', 'repaint']) +} : undefined; +Visibility.defaultProps = { + context: Object(_lib__WEBPACK_IMPORTED_MODULE_9__["isBrowser"])() ? window : null, + continuous: false, + offset: [0, 0], + once: true, + updateOn: 'events' +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/behaviors/Visibility/index.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/behaviors/Visibility/index.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Visibility__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Visibility */ "./node_modules/semantic-ui-react/dist/es/behaviors/Visibility/Visibility.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Visibility__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/Breadcrumb.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/Breadcrumb.js ***! + \*************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_each__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/each */ "./node_modules/lodash-es/each.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _BreadcrumbDivider__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./BreadcrumbDivider */ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbDivider.js"); +/* harmony import */ var _BreadcrumbSection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./BreadcrumbSection */ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbSection.js"); + + + + + + + + + +/** + * A breadcrumb is used to show hierarchy between content. + */ + +function Breadcrumb(props) { + var children = props.children, + className = props.className, + divider = props.divider, + icon = props.icon, + sections = props.sections, + size = props.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('ui', size, 'breadcrumb', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(Breadcrumb, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(Breadcrumb, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + var childElements = []; + + Object(lodash_es_each__WEBPACK_IMPORTED_MODULE_2__["default"])(sections, function (section, index) { + // section + var breadcrumbElement = _BreadcrumbSection__WEBPACK_IMPORTED_MODULE_8__["default"].create(section); + childElements.push(breadcrumbElement); // divider + + if (index !== sections.length - 1) { + var key = breadcrumbElement.key + "_divider" || false; + childElements.push(_BreadcrumbDivider__WEBPACK_IMPORTED_MODULE_7__["default"].create({ + content: divider, + icon: icon, + key: key + })); + } + }); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), childElements); +} + +Breadcrumb.handledProps = ["as", "children", "className", "divider", "icon", "sections", "size"]; +Breadcrumb.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Shorthand for primary content of the Breadcrumb.Divider. */ + divider: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['icon']), _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand]), + + /** For use with the sections prop. Render as an `Icon` component with `divider` class instead of a `div` in + * Breadcrumb.Divider. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['divider']), _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand]), + + /** Shorthand array of props for Breadcrumb.Section. */ + sections: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand, + + /** Size of Breadcrumb. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].SIZES, 'medium')) +} : undefined; +Breadcrumb.Divider = _BreadcrumbDivider__WEBPACK_IMPORTED_MODULE_7__["default"]; +Breadcrumb.Section = _BreadcrumbSection__WEBPACK_IMPORTED_MODULE_8__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Breadcrumb); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbDivider.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbDivider.js ***! + \********************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + + +/** + * A divider sub-component for Breadcrumb component. + */ + +function BreadcrumbDivider(props) { + var children = props.children, + className = props.className, + content = props.content, + icon = props.icon; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('divider', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(BreadcrumbDivider, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(BreadcrumbDivider, props); + + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(icon)) { + return _elements_Icon__WEBPACK_IMPORTED_MODULE_6__["default"].create(icon, { + defaultProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), + autoGenerateKey: false + }); + } + + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? '/' : children); +} + +BreadcrumbDivider.handledProps = ["as", "children", "className", "content", "icon"]; +BreadcrumbDivider.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Render as an `Icon` component with `divider` class instead of a `div`. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand +} : undefined; +BreadcrumbDivider.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(BreadcrumbDivider, function (icon) { + return { + icon: icon + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (BreadcrumbDivider); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbSection.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbSection.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 BreadcrumbSection; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + +/** + * A section sub-component for Breadcrumb component. + */ + +var BreadcrumbSection = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(BreadcrumbSection, _Component); + + function BreadcrumbSection() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.computeElementType = function () { + var _this$props = _this.props, + link = _this$props.link, + onClick = _this$props.onClick; + if (link || onClick) return 'a'; + }; + + _this.handleClick = function (e) { + return Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = BreadcrumbSection.prototype; + + _proto.render = function render() { + var _this$props2 = this.props, + active = _this$props2.active, + children = _this$props2.children, + className = _this$props2.className, + content = _this$props2.content, + href = _this$props2.href; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(active, 'active'), 'section', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(BreadcrumbSection, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(BreadcrumbSection, this.props, this.computeElementType); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), _lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children) ? content : children); + }; + + return BreadcrumbSection; +}(react__WEBPACK_IMPORTED_MODULE_5__["Component"]); + +BreadcrumbSection.handledProps = ["active", "as", "children", "className", "content", "href", "link", "onClick"]; + +BreadcrumbSection.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Style as the currently active section. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** Render as an `a` tag instead of a `div` and adds the href attribute. */ + href: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['link']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string]), + + /** Render as an `a` tag instead of a `div`. */ + link: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['href']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool]), + + /** + * Called on click. When passed, the component will render as an `a` + * tag by default instead of a `div`. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func +} : undefined; +BreadcrumbSection.create = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["createShorthandFactory"])(BreadcrumbSection, function (content) { + return { + content: content, + link: true + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/index.js": +/*!********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/index.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Breadcrumb__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Breadcrumb */ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/Breadcrumb.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Breadcrumb__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/Form.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/Form.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _FormButton__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./FormButton */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormButton.js"); +/* harmony import */ var _FormCheckbox__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FormCheckbox */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormCheckbox.js"); +/* harmony import */ var _FormDropdown__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./FormDropdown */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormDropdown.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); +/* harmony import */ var _FormGroup__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./FormGroup */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormGroup.js"); +/* harmony import */ var _FormInput__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./FormInput */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormInput.js"); +/* harmony import */ var _FormRadio__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./FormRadio */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormRadio.js"); +/* harmony import */ var _FormSelect__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./FormSelect */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormSelect.js"); +/* harmony import */ var _FormTextArea__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./FormTextArea */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormTextArea.js"); + + + + + + + + + + + + + + + + + +/** + * A Form displays a set of related user input fields in a structured way. + * @see Button + * @see Checkbox + * @see Dropdown + * @see Input + * @see Message + * @see Radio + * @see Select + * @see Visibility + */ + +var Form = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Form, _Component); + + function Form() { + var _this; + + for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) { + _args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(_args)) || this; + + _this.handleSubmit = function (e) { + var action = _this.props.action; // Heads up! Third party libs can pass own data as first argument, we need to check that it has preventDefault() + // method. + + if (typeof action !== 'string') Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(e, 'preventDefault'); + + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"].apply(void 0, [_this.props, 'onSubmit', e, _this.props].concat(args)); + }; + + return _this; + } + + var _proto = Form.prototype; + + _proto.render = function render() { + var _this$props = this.props, + action = _this$props.action, + children = _this$props.children, + className = _this$props.className, + error = _this$props.error, + inverted = _this$props.inverted, + loading = _this$props.loading, + reply = _this$props.reply, + size = _this$props.size, + success = _this$props.success, + unstackable = _this$props.unstackable, + warning = _this$props.warning, + widths = _this$props.widths; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(reply, 'reply'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(success, 'success'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(unstackable, 'unstackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(warning, 'warning'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useWidthProp"])(widths, null, true), 'form', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(Form, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(Form, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + action: action, + className: classes, + onSubmit: this.handleSubmit + }), children); + }; + + return Form; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +Form.handledProps = ["action", "as", "children", "className", "error", "inverted", "loading", "onSubmit", "reply", "size", "success", "unstackable", "warning", "widths"]; +Form.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** The HTML form action */ + action: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Automatically show any error Message children. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A form can have its color inverted for contrast. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Automatically show a loading indicator. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** The HTML form submit handler. */ + onSubmit: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** A comment can contain a form to reply to a comment. This may have arbitrary content. */ + reply: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A form can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].SIZES, 'medium')), + + /** Automatically show any success Message children. */ + success: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A form can prevent itself from stacking on mobile. */ + unstackable: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Automatically show any warning Message children. */ + warning: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Forms can automatically divide fields to be equal width. */ + widths: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['equal']) +} : undefined; +Form.defaultProps = { + as: 'form' +}; +Form.Field = _FormField__WEBPACK_IMPORTED_MODULE_11__["default"]; +Form.Button = _FormButton__WEBPACK_IMPORTED_MODULE_8__["default"]; +Form.Checkbox = _FormCheckbox__WEBPACK_IMPORTED_MODULE_9__["default"]; +Form.Dropdown = _FormDropdown__WEBPACK_IMPORTED_MODULE_10__["default"]; +Form.Group = _FormGroup__WEBPACK_IMPORTED_MODULE_12__["default"]; +Form.Input = _FormInput__WEBPACK_IMPORTED_MODULE_13__["default"]; +Form.Radio = _FormRadio__WEBPACK_IMPORTED_MODULE_14__["default"]; +Form.Select = _FormSelect__WEBPACK_IMPORTED_MODULE_15__["default"]; +Form.TextArea = _FormTextArea__WEBPACK_IMPORTED_MODULE_16__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Form); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormButton.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormButton.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../elements/Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + +/** + * Sugar for <Form.Field control={Button} />. + * @see Button + * @see Form + */ + +function FormButton(props) { + var control = props.control; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormButton, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormButton, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control + })); +} + +FormButton.handledProps = ["as", "control"]; +FormButton.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.control +} : undefined; +FormButton.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"], + control: _elements_Button__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormButton); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormCheckbox.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormCheckbox.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _modules_Checkbox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../modules/Checkbox */ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + +/** + * Sugar for <Form.Field control={Checkbox} />. + * @see Checkbox + * @see Form + */ + +function FormCheckbox(props) { + var control = props.control; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormCheckbox, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormCheckbox, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control + })); +} + +FormCheckbox.handledProps = ["as", "control"]; +FormCheckbox.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.control +} : undefined; +FormCheckbox.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"], + control: _modules_Checkbox__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormCheckbox); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormDropdown.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormDropdown.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _modules_Dropdown__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../modules/Dropdown */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + +/** + * Sugar for <Form.Field control={Dropdown} />. + * @see Dropdown + * @see Form + */ + +function FormDropdown(props) { + var control = props.control; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormDropdown, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormDropdown, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control + })); +} + +FormDropdown.handledProps = ["as", "control"]; +FormDropdown.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.control +} : undefined; +FormDropdown.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"], + control: _modules_Dropdown__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormDropdown); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Label__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../elements/Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/index.js"); +/* harmony import */ var _modules_Checkbox__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../modules/Checkbox */ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/index.js"); +/* harmony import */ var _addons_Radio__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../addons/Radio */ "./node_modules/semantic-ui-react/dist/es/addons/Radio/index.js"); + + + + + + + + + + +/** + * A field is a form element containing a label and an input. + * @see Form + * @see Button + * @see Checkbox + * @see Dropdown + * @see Input + * @see Radio + * @see Select + * @see Visibility + */ + +function FormField(props) { + var children = props.children, + className = props.className, + content = props.content, + control = props.control, + disabled = props.disabled, + error = props.error, + inline = props.inline, + label = props.label, + required = props.required, + type = props.type, + width = props.width, + id = props.id; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(inline, 'inline'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(required, 'required'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useWidthProp"])(width, 'wide'), 'field', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(FormField, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(FormField, props); + + var errorPointing = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_2__["default"])(error, 'pointing', 'above'); + + var errorLabel = _elements_Label__WEBPACK_IMPORTED_MODULE_7__["default"].create(error, { + autoGenerateKey: false, + defaultProps: { + prompt: true, + pointing: errorPointing, + id: id ? id + "-error-message" : undefined, + role: 'alert', + 'aria-atomic': true + } + }); + var errorLabelBefore = (errorPointing === 'below' || errorPointing === 'right') && errorLabel; + var errorLabelAfter = (errorPointing === 'above' || errorPointing === 'left') && errorLabel; // ---------------------------------------- + // No Control + // ---------------------------------------- + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(control)) { + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(label)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + id: id + }), _lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children) ? content : children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + id: id + }), errorLabelBefore, Object(_lib__WEBPACK_IMPORTED_MODULE_6__["createHTMLLabel"])(label, { + autoGenerateKey: false + }), errorLabelAfter); + } // ---------------------------------------- + // Checkbox/Radio Control + // ---------------------------------------- + + + var ariaDescribedBy = id && error ? id + "-error-message" : null; + var ariaAttrs = { + 'aria-describedby': ariaDescribedBy, + 'aria-invalid': error ? true : undefined + }; + + var controlProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + content: content, + children: children, + disabled: disabled, + required: required, + type: type, + id: id + }); // wrap HTML checkboxes/radios in the label + + + if (control === 'input' && (type === 'checkbox' || type === 'radio')) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, { + className: classes + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement("label", null, errorLabelBefore, /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_5__["createElement"])(control, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, ariaAttrs, controlProps)), " ", label, errorLabelAfter)); + } // pass label prop to controls that support it + + + if (control === _modules_Checkbox__WEBPACK_IMPORTED_MODULE_8__["default"] || control === _addons_Radio__WEBPACK_IMPORTED_MODULE_9__["default"]) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, { + className: classes + }, errorLabelBefore, /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_5__["createElement"])(control, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, ariaAttrs, controlProps, { + label: label + })), errorLabelAfter); + } // ---------------------------------------- + // Other Control + // ---------------------------------------- + + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, { + className: classes + }, Object(_lib__WEBPACK_IMPORTED_MODULE_6__["createHTMLLabel"])(label, { + defaultProps: { + htmlFor: id + }, + autoGenerateKey: false + }), errorLabelBefore, /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_5__["createElement"])(control, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, ariaAttrs, controlProps)), errorLabelAfter); +} + +FormField.handledProps = ["as", "children", "className", "content", "control", "disabled", "error", "id", "inline", "label", "required", "type", "width"]; +FormField.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** + * A form control component (i.e. Dropdown) or HTML tagName (i.e. 'input'). + * Extra FormField props are passed to the control component. + * Mutually exclusive with children. + */ + control: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['button', 'input', 'select', 'textarea'])]), + + /** Individual fields may be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Individual fields may display an error state along with a message. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand]), + + /** The id of the control */ + id: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** A field can have its label next to instead of above it. */ + inline: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + // Heads Up! + // Do not disallow children with `label` shorthand + // The `control` might accept a `label` prop and `children` + + /** Mutually exclusive with children. */ + label: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.object]), + + /** A field can show that input is mandatory. */ + required: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Passed to the control component (i.e. <input type='password' />) */ + type: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].demand(['control']) // don't strictly validate HTML types + // a control might be passed that uses a `type` prop with unknown values + // let the control validate if for us + ]), + + /** A field can specify its width in grid columns */ + width: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].WIDTHS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FormField); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormGroup.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormGroup.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A set of fields can appear grouped together. + * @see Form + */ + +function FormGroup(props) { + var children = props.children, + className = props.className, + grouped = props.grouped, + inline = props.inline, + unstackable = props.unstackable, + widths = props.widths; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(grouped, 'grouped'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(inline, 'inline'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(unstackable, 'unstackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(widths, null, true), 'fields', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FormGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FormGroup, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); +} + +FormGroup.handledProps = ["as", "children", "className", "grouped", "inline", "unstackable", "widths"]; +FormGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Fields can show related choices. */ + grouped: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['inline']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool]), + + /** Multiple fields may be inline in a row. */ + inline: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['grouped']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool]), + + /** A form group can prevent itself from stacking on mobile. */ + unstackable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Fields Groups can specify their width in grid columns or automatically divide fields to be equal width. */ + widths: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf([].concat(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS, ['equal'])) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FormGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormInput.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormInput.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Input__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../elements/Input */ "./node_modules/semantic-ui-react/dist/es/elements/Input/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + +/** + * Sugar for <Form.Field control={Input} />. + * @see Form + * @see Input + */ + +function FormInput(props) { + var control = props.control; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormInput, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormInput, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control + })); +} + +FormInput.handledProps = ["as", "control"]; +FormInput.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.control +} : undefined; +FormInput.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"], + control: _elements_Input__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormInput); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormRadio.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormRadio.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _addons_Radio__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../addons/Radio */ "./node_modules/semantic-ui-react/dist/es/addons/Radio/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + +/** + * Sugar for <Form.Field control={Radio} />. + * @see Form + * @see Radio + */ + +function FormRadio(props) { + var control = props.control; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormRadio, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormRadio, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control + })); +} + +FormRadio.handledProps = ["as", "control"]; +FormRadio.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.control +} : undefined; +FormRadio.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"], + control: _addons_Radio__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormRadio); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormSelect.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormSelect.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _addons_Select__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../addons/Select */ "./node_modules/semantic-ui-react/dist/es/addons/Select/index.js"); +/* harmony import */ var _modules_Dropdown__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../modules/Dropdown */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + + +/** + * Sugar for <Form.Field control={Select} />. + * @see Form + * @see Select + */ + +function FormSelect(props) { + var control = props.control, + options = props.options; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormSelect, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormSelect, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control, + options: options + })); +} + +FormSelect.handledProps = ["as", "control", "options"]; +FormSelect.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_6__["default"].propTypes.control, + + /** Array of Dropdown.Item props e.g. `{ text: '', value: '' }` */ + options: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.shape(_modules_Dropdown__WEBPACK_IMPORTED_MODULE_5__["default"].Item.propTypes)).isRequired +} : undefined; +FormSelect.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_6__["default"], + control: _addons_Select__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormSelect); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormTextArea.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/FormTextArea.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _addons_TextArea__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../addons/TextArea */ "./node_modules/semantic-ui-react/dist/es/addons/TextArea/index.js"); +/* harmony import */ var _FormField__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); + + + + + + +/** + * Sugar for <Form.Field control={TextArea} />. + * @see Form + * @see TextArea + */ + +function FormTextArea(props) { + var control = props.control; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(FormTextArea, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getElementType"])(FormTextArea, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + control: control + })); +} + +FormTextArea.handledProps = ["as", "control"]; +FormTextArea.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType, + + /** A FormField control prop. */ + control: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"].propTypes.control +} : undefined; +FormTextArea.defaultProps = { + as: _FormField__WEBPACK_IMPORTED_MODULE_5__["default"], + control: _addons_TextArea__WEBPACK_IMPORTED_MODULE_4__["default"] +}; +/* harmony default export */ __webpack_exports__["default"] = (FormTextArea); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Form/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Form/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Form__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Form */ "./node_modules/semantic-ui-react/dist/es/collections/Form/Form.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Form__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Grid/Grid.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Grid/Grid.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _GridColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./GridColumn */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridColumn.js"); +/* harmony import */ var _GridRow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./GridRow */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridRow.js"); + + + + + + + +/** + * A grid is used to harmonize negative space in a layout. + */ + +function Grid(props) { + var celled = props.celled, + centered = props.centered, + children = props.children, + className = props.className, + columns = props.columns, + container = props.container, + divided = props.divided, + doubling = props.doubling, + inverted = props.inverted, + padded = props.padded, + relaxed = props.relaxed, + reversed = props.reversed, + stackable = props.stackable, + stretched = props.stretched, + textAlign = props.textAlign, + verticalAlign = props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(centered, 'centered'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(container, 'container'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(doubling, 'doubling'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(stackable, 'stackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(stretched, 'stretched'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOrValueAndKey"])(celled, 'celled'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOrValueAndKey"])(divided, 'divided'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOrValueAndKey"])(padded, 'padded'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOrValueAndKey"])(relaxed, 'relaxed'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useMultipleProp"])(reversed, 'reversed'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useVerticalAlignProp"])(verticalAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(columns, 'column', true), 'grid', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Grid, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Grid, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); +} + +Grid.handledProps = ["as", "celled", "centered", "children", "className", "columns", "container", "divided", "doubling", "inverted", "padded", "relaxed", "reversed", "stackable", "stretched", "textAlign", "verticalAlign"]; +Grid.Column = _GridColumn__WEBPACK_IMPORTED_MODULE_5__["default"]; +Grid.Row = _GridRow__WEBPACK_IMPORTED_MODULE_6__["default"]; +Grid.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** A grid can have rows divided into cells. */ + celled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['internally'])]), + + /** A grid can have its columns centered. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Represents column count per row in Grid. */ + columns: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf([].concat(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS, ['equal'])), + + /** A grid can be combined with a container to use the available layout and alignment. */ + container: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A grid can have dividers between its columns. */ + divided: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['vertically'])]), + + /** A grid can double its column width on tablet and mobile sizes. */ + doubling: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A grid's colors can be inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A grid can preserve its vertical and horizontal gutters on first and last columns. */ + padded: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['horizontally', 'vertically'])]), + + /** A grid can increase its gutters to allow for more negative space. */ + relaxed: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['very'])]), + + /** A grid can specify that its columns should reverse order at different device sizes. */ + reversed: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].multipleProp(['computer', 'computer vertically', 'mobile', 'mobile vertically', 'tablet', 'tablet vertically']), + + /** A grid can have its columns stack on-top of each other after reaching mobile breakpoints. */ + stackable: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A grid can stretch its contents to take up the entire grid height. */ + stretched: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A grid can specify its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].TEXT_ALIGNMENTS), + + /** A grid can specify its vertical alignment to have all its columns vertically centered. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Grid); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridColumn.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Grid/GridColumn.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A column sub-component for Grid. + */ + +function GridColumn(props) { + var children = props.children, + className = props.className, + computer = props.computer, + color = props.color, + floated = props.floated, + largeScreen = props.largeScreen, + mobile = props.mobile, + only = props.only, + stretched = props.stretched, + tablet = props.tablet, + textAlign = props.textAlign, + verticalAlign = props.verticalAlign, + widescreen = props.widescreen, + width = props.width; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(color, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(stretched, 'stretched'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useMultipleProp"])(only, 'only'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useVerticalAlignProp"])(verticalAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(computer, 'wide computer'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(largeScreen, 'wide large screen'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(mobile, 'wide mobile'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(tablet, 'wide tablet'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(widescreen, 'wide widescreen'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(width, 'wide'), 'column', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(GridColumn, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(GridColumn, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); +} + +GridColumn.handledProps = ["as", "children", "className", "color", "computer", "floated", "largeScreen", "mobile", "only", "stretched", "tablet", "textAlign", "verticalAlign", "widescreen", "width"]; +GridColumn.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** A grid column can be colored. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].COLORS), + + /** A column can specify a width for a computer. */ + computer: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['width']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS)]), + + /** A column can sit flush against the left or right edge of a row. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].FLOATS), + + /** A column can specify a width for a large screen device. */ + largeScreen: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['width']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS)]), + + /** A column can specify a width for a mobile device. */ + mobile: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['width']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS)]), + + /** A column can appear only for a specific device, or screen sizes. */ + only: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].multipleProp(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VISIBILITY), + + /** A column can stretch its contents to take up the entire grid or row height. */ + stretched: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A column can specify a width for a tablet device. */ + tablet: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['width']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS)]), + + /** A column can specify its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].TEXT_ALIGNMENTS), + + /** A column can specify its vertical alignment to have all its columns vertically centered. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VERTICAL_ALIGNMENTS), + + /** A column can specify a width for a wide screen device. */ + widescreen: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['width']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS)]), + + /** Represents width of column. */ + width: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['computer', 'largeScreen', 'mobile', 'tablet', 'widescreen']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS)]) +} : undefined; +GridColumn.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(GridColumn, function (children) { + return { + children: children + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (GridColumn); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridRow.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Grid/GridRow.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A row sub-component for Grid. + */ + +function GridRow(props) { + var centered = props.centered, + children = props.children, + className = props.className, + color = props.color, + columns = props.columns, + divided = props.divided, + only = props.only, + reversed = props.reversed, + stretched = props.stretched, + textAlign = props.textAlign, + verticalAlign = props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(color, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(centered, 'centered'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(divided, 'divided'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(stretched, 'stretched'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useMultipleProp"])(only, 'only'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useMultipleProp"])(reversed, 'reversed'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useVerticalAlignProp"])(verticalAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useWidthProp"])(columns, 'column', true), 'row', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(GridRow, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(GridRow, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); +} + +GridRow.handledProps = ["as", "centered", "children", "className", "color", "columns", "divided", "only", "reversed", "stretched", "textAlign", "verticalAlign"]; +GridRow.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** A row can have its columns centered. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** A grid row can be colored. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].COLORS), + + /** Represents column count per line in Row. */ + columns: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf([].concat(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].WIDTHS, ['equal'])), + + /** A row can have dividers between its columns. */ + divided: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A row can appear only for a specific device, or screen sizes. */ + only: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].multipleProp(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VISIBILITY), + + /** A row can specify that its columns should reverse order at different device sizes. */ + reversed: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].multipleProp(['computer', 'computer vertically', 'mobile', 'mobile vertically', 'tablet', 'tablet vertically']), + + /** A row can stretch its contents to take up the entire column height. */ + stretched: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A row can specify its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].TEXT_ALIGNMENTS), + + /** A row can specify its vertical alignment to have all its columns vertically centered. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (GridRow); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Grid/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Grid/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Grid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Grid */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/Grid.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Grid__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Menu/Menu.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Menu/Menu.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _MenuHeader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./MenuHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuHeader.js"); +/* harmony import */ var _MenuItem__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./MenuItem */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuItem.js"); +/* harmony import */ var _MenuMenu__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./MenuMenu */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuMenu.js"); + + + + + + + + + + + + +/** + * A menu displays grouped navigation actions. + * @see Dropdown + */ + +var Menu = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Menu, _Component); + + function Menu() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleItemOverrides = function (predefinedProps) { + return { + onClick: function onClick(e, itemProps) { + var index = itemProps.index; + + _this.setState({ + activeIndex: index + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__["default"])(predefinedProps, 'onClick', e, itemProps); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__["default"])(_this.props, 'onItemClick', e, itemProps); + } + }; + }; + + return _this; + } + + var _proto = Menu.prototype; + + _proto.renderItems = function renderItems() { + var _this2 = this; + + var items = this.props.items; + var activeIndex = this.state.activeIndex; + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_3__["default"])(items, function (item, index) { + return _MenuItem__WEBPACK_IMPORTED_MODULE_10__["default"].create(item, { + defaultProps: { + active: parseInt(activeIndex, 10) === index, + index: index + }, + overrideProps: _this2.handleItemOverrides + }); + }); + }; + + _proto.render = function render() { + var _this$props = this.props, + attached = _this$props.attached, + borderless = _this$props.borderless, + children = _this$props.children, + className = _this$props.className, + color = _this$props.color, + compact = _this$props.compact, + fixed = _this$props.fixed, + floated = _this$props.floated, + fluid = _this$props.fluid, + icon = _this$props.icon, + inverted = _this$props.inverted, + pagination = _this$props.pagination, + pointing = _this$props.pointing, + secondary = _this$props.secondary, + size = _this$props.size, + stackable = _this$props.stackable, + tabular = _this$props.tabular, + text = _this$props.text, + vertical = _this$props.vertical, + widths = _this$props.widths; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(borderless, 'borderless'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(pagination, 'pagination'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(pointing, 'pointing'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(secondary, 'secondary'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(stackable, 'stackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(text, 'text'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(vertical, 'vertical'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(icon, 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(tabular, 'tabular'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useValueAndKey"])(fixed, 'fixed'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useWidthProp"])(widths, 'item'), className, 'menu'); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getUnhandledProps"])(Menu, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getElementType"])(Menu, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_8__["childrenUtils"].isNil(children) ? this.renderItems() : children); + }; + + return Menu; +}(_lib__WEBPACK_IMPORTED_MODULE_8__["ModernAutoControlledComponent"]); + +Menu.handledProps = ["activeIndex", "as", "attached", "borderless", "children", "className", "color", "compact", "defaultActiveIndex", "fixed", "floated", "fluid", "icon", "inverted", "items", "onItemClick", "pagination", "pointing", "secondary", "size", "stackable", "tabular", "text", "vertical", "widths"]; +Menu.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.elementType, + + /** Index of the currently active item. */ + activeIndex: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** A menu may be attached to other content segments. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['top', 'bottom'])]), + + /** A menu item or menu can have no borders. */ + borderless: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** Additional colors can be specified. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].COLORS), + + /** A menu can take up only the space necessary to fit its content. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Initial activeIndex value. */ + defaultActiveIndex: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** A menu can be fixed to a side of its context. */ + fixed: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['left', 'right', 'bottom', 'top']), + + /** A menu can be floated. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['right'])]), + + /** A vertical menu may take the size of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A menu may have just icons (bool) or labeled icons. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['labeled'])]), + + /** A menu may have its colors inverted to show greater contrast. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Shorthand array of props for Menu. */ + items: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].collectionShorthand, + + /** + * onClick handler for MenuItem. Mutually exclusive with children. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All item props. + */ + onItemClick: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func]), + + /** A pagination menu is specially formatted to present links to pages of content. */ + pagination: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A menu can point to show its relationship to nearby content. */ + pointing: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A menu can adjust its appearance to de-emphasize its contents. */ + secondary: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A menu can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].SIZES, 'medium', 'big')), + + /** A menu can stack at mobile resolutions. */ + stackable: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A menu can be formatted to show tabs of information. */ + tabular: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['right'])]), + + /** A menu can be formatted for text content. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A vertical menu displays elements vertically. */ + vertical: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A menu can have its items divided evenly. */ + widths: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].WIDTHS) +} : undefined; +Menu.autoControlledProps = ['activeIndex']; +Menu.Header = _MenuHeader__WEBPACK_IMPORTED_MODULE_9__["default"]; +Menu.Item = _MenuItem__WEBPACK_IMPORTED_MODULE_10__["default"]; +Menu.Menu = _MenuMenu__WEBPACK_IMPORTED_MODULE_11__["default"]; +Menu.create = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["createShorthandFactory"])(Menu, function (items) { + return { + items: items + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Menu); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuHeader.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuHeader.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A menu item may include a header or may itself be a header. + */ + +function MenuHeader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(MenuHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(MenuHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +MenuHeader.handledProps = ["as", "children", "className", "content"]; +MenuHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (MenuHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuItem.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuItem.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 MenuItem; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_startCase__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/startCase */ "./node_modules/lodash-es/startCase.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + + + + +/** + * A menu can contain an item. + */ + +var MenuItem = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(MenuItem, _Component); + + function MenuItem() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var disabled = _this.props.disabled; + if (!disabled) Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = MenuItem.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + children = _this$props.children, + className = _this$props.className, + color = _this$props.color, + content = _this$props.content, + disabled = _this$props.disabled, + fitted = _this$props.fitted, + header = _this$props.header, + icon = _this$props.icon, + link = _this$props.link, + name = _this$props.name, + onClick = _this$props.onClick, + position = _this$props.position; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(color, position, Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(icon === true || icon && !(name || content), 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(header, 'header'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(link, 'link'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOrValueAndKey"])(fitted, 'fitted'), 'item', className); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(MenuItem, this.props, function () { + if (onClick) return 'a'; + }); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(MenuItem, this.props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), _elements_Icon__WEBPACK_IMPORTED_MODULE_8__["default"].create(icon, { + autoGenerateKey: false + }), _lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(content) ? Object(lodash_es_startCase__WEBPACK_IMPORTED_MODULE_2__["default"])(name) : content); + }; + + return MenuItem; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +MenuItem.handledProps = ["active", "as", "children", "className", "color", "content", "disabled", "fitted", "header", "icon", "index", "link", "name", "onClick", "position"]; + +MenuItem.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** A menu item can be active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Additional colors can be specified. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** A menu item can be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A menu item or menu can remove element padding, vertically or horizontally. */ + fitted: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['horizontally', 'vertically'])]), + + /** A menu item may include a header or may itself be a header. */ + header: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** MenuItem can be only icon. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand]), + + /** MenuItem index inside Menu. */ + index: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, + + /** A menu item can be link. */ + link: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Internal name of the MenuItem. */ + name: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** + * Called on click. When passed, the component will render as an `a` + * tag by default instead of a `div`. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** A menu item can take left or right position. */ + position: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['left', 'right']) +} : undefined; +MenuItem.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(MenuItem, function (val) { + return { + content: val, + name: val + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuMenu.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuMenu.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A menu can contain a sub menu. + */ + +function MenuMenu(props) { + var children = props.children, + className = props.className, + content = props.content, + position = props.position; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(position, 'menu', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(MenuMenu, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(MenuMenu, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +MenuMenu.handledProps = ["as", "children", "className", "content", "position"]; +MenuMenu.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A sub menu can take left or right position. */ + position: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['left', 'right']) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (MenuMenu); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Menu/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Menu/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Menu__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Menu */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/Menu.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Menu__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Message/Message.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Message/Message.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 Message; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _MessageContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./MessageContent */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageContent.js"); +/* harmony import */ var _MessageHeader__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./MessageHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageHeader.js"); +/* harmony import */ var _MessageList__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./MessageList */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageList.js"); +/* harmony import */ var _MessageItem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./MessageItem */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageItem.js"); + + + + + + + + + + + + + +/** + * A message displays information that explains nearby content. + * @see Form + */ + +var Message = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Message, _Component); + + function Message() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleDismiss = function (e) { + var onDismiss = _this.props.onDismiss; + if (onDismiss) onDismiss(e, _this.props); + }; + + return _this; + } + + var _proto = Message.prototype; + + _proto.render = function render() { + var _this$props = this.props, + attached = _this$props.attached, + children = _this$props.children, + className = _this$props.className, + color = _this$props.color, + compact = _this$props.compact, + content = _this$props.content, + error = _this$props.error, + floating = _this$props.floating, + header = _this$props.header, + hidden = _this$props.hidden, + icon = _this$props.icon, + info = _this$props.info, + list = _this$props.list, + negative = _this$props.negative, + onDismiss = _this$props.onDismiss, + positive = _this$props.positive, + size = _this$props.size, + success = _this$props.success, + visible = _this$props.visible, + warning = _this$props.warning; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(floating, 'floating'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(hidden, 'hidden'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(icon, 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(info, 'info'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(negative, 'negative'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(positive, 'positive'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(success, 'success'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(visible, 'visible'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(warning, 'warning'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOrValueAndKey"])(attached, 'attached'), 'message', className); + var dismissIcon = onDismiss && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_elements_Icon__WEBPACK_IMPORTED_MODULE_8__["default"], { + name: "close", + onClick: this.handleDismiss + }); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(Message, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(Message, this.props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), dismissIcon, children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), dismissIcon, _elements_Icon__WEBPACK_IMPORTED_MODULE_8__["default"].create(icon, { + autoGenerateKey: false + }), (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(header) || !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(content) || !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(list)) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_MessageContent__WEBPACK_IMPORTED_MODULE_9__["default"], null, _MessageHeader__WEBPACK_IMPORTED_MODULE_10__["default"].create(header, { + autoGenerateKey: false + }), _MessageList__WEBPACK_IMPORTED_MODULE_11__["default"].create(list, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createHTMLParagraph"])(content, { + autoGenerateKey: false + }))); + }; + + return Message; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +Message.handledProps = ["as", "attached", "children", "className", "color", "compact", "content", "error", "floating", "header", "hidden", "icon", "info", "list", "negative", "onDismiss", "positive", "size", "success", "visible", "warning"]; + +Message.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** A message can be formatted to attach itself to other content. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['bottom', 'top'])]), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** A message can be formatted to be different colors. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].COLORS), + + /** A message can only take up the width of its content. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** A message may be formatted to display a negative message. Same as `negative`. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A message can float above content that it is related to. */ + floating: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand for MessageHeader. */ + header: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A message can be hidden. */ + hidden: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A message can contain an icon. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool]), + + /** A message may be formatted to display information. */ + info: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Array shorthand items for the MessageList. Mutually exclusive with children. */ + list: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].collectionShorthand, + + /** A message may be formatted to display a negative message. Same as `error`. */ + negative: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** + * A message that the user can choose to hide. + * Called when the user clicks the "x" icon. This also adds the "x" icon. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onDismiss: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** A message may be formatted to display a positive message. Same as `success`. */ + positive: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A message can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].SIZES, 'medium')), + + /** A message may be formatted to display a positive message. Same as `positive`. */ + success: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A message can be set to visible to force itself to be shown. */ + visible: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A message may be formatted to display warning messages. */ + warning: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool +} : undefined; +Message.Content = _MessageContent__WEBPACK_IMPORTED_MODULE_9__["default"]; +Message.Header = _MessageHeader__WEBPACK_IMPORTED_MODULE_10__["default"]; +Message.List = _MessageList__WEBPACK_IMPORTED_MODULE_11__["default"]; +Message.Item = _MessageItem__WEBPACK_IMPORTED_MODULE_12__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageContent.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Message/MessageContent.js ***! + \**************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A message can contain a content. + */ + +function MessageContent(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(MessageContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(MessageContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +MessageContent.handledProps = ["as", "children", "className", "content"]; +MessageContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (MessageContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageHeader.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Message/MessageHeader.js ***! + \*************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A message can contain a header. + */ + +function MessageHeader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(MessageHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(MessageHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +MessageHeader.handledProps = ["as", "children", "className", "content"]; +MessageHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +MessageHeader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(MessageHeader, function (val) { + return { + content: val + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (MessageHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageItem.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Message/MessageItem.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A message list can contain an item. + */ + +function MessageItem(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(MessageItem, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(MessageItem, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +MessageItem.handledProps = ["as", "children", "className", "content"]; +MessageItem.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +MessageItem.defaultProps = { + as: 'li' +}; +MessageItem.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(MessageItem, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (MessageItem); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageList.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Message/MessageList.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _MessageItem__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./MessageItem */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageItem.js"); + + + + + + + +/** + * A message can contain a list of items. + */ + +function MessageList(props) { + var children = props.children, + className = props.className, + items = props.items; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('list', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(MessageList, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(MessageList, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_1__["default"])(items, _MessageItem__WEBPACK_IMPORTED_MODULE_6__["default"].create) : children); +} + +MessageList.handledProps = ["as", "children", "className", "items"]; +MessageList.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand Message.Items. */ + items: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].collectionShorthand +} : undefined; +MessageList.defaultProps = { + as: 'ul' +}; +MessageList.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(MessageList, function (val) { + return { + items: val + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (MessageList); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Message/index.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Message/index.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Message */ "./node_modules/semantic-ui-react/dist/es/collections/Message/Message.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Message__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/Table.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/Table.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _TableBody__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TableBody */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableBody.js"); +/* harmony import */ var _TableCell__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./TableCell */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableCell.js"); +/* harmony import */ var _TableFooter__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./TableFooter */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableFooter.js"); +/* harmony import */ var _TableHeader__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./TableHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeader.js"); +/* harmony import */ var _TableHeaderCell__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./TableHeaderCell */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeaderCell.js"); +/* harmony import */ var _TableRow__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TableRow */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableRow.js"); + + + + + + + + + + + + + +/** + * A table displays a collections of data grouped into rows. + */ + +function Table(props) { + var attached = props.attached, + basic = props.basic, + celled = props.celled, + children = props.children, + className = props.className, + collapsing = props.collapsing, + color = props.color, + columns = props.columns, + compact = props.compact, + definition = props.definition, + fixed = props.fixed, + footerRow = props.footerRow, + headerRow = props.headerRow, + headerRows = props.headerRows, + inverted = props.inverted, + padded = props.padded, + renderBodyRow = props.renderBodyRow, + selectable = props.selectable, + singleLine = props.singleLine, + size = props.size, + sortable = props.sortable, + stackable = props.stackable, + striped = props.striped, + structured = props.structured, + tableData = props.tableData, + textAlign = props.textAlign, + unstackable = props.unstackable, + verticalAlign = props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(celled, 'celled'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(collapsing, 'collapsing'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(definition, 'definition'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(fixed, 'fixed'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(selectable, 'selectable'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(singleLine, 'single line'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(sortable, 'sortable'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(stackable, 'stackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(striped, 'striped'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(structured, 'structured'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(unstackable, 'unstackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOrValueAndKey"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOrValueAndKey"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOrValueAndKey"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOrValueAndKey"])(padded, 'padded'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useVerticalAlignProp"])(verticalAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useWidthProp"])(columns, 'column'), 'table', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(Table, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(Table, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + var hasHeaderRows = headerRow || headerRows; + var headerShorthandOptions = { + defaultProps: { + cellAs: 'th' + } + }; + var headerElement = hasHeaderRows && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TableHeader__WEBPACK_IMPORTED_MODULE_10__["default"], null, _TableRow__WEBPACK_IMPORTED_MODULE_12__["default"].create(headerRow, headerShorthandOptions), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(headerRows, function (data) { + return _TableRow__WEBPACK_IMPORTED_MODULE_12__["default"].create(data, headerShorthandOptions); + })); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), headerElement, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TableBody__WEBPACK_IMPORTED_MODULE_7__["default"], null, renderBodyRow && Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(tableData, function (data, index) { + return _TableRow__WEBPACK_IMPORTED_MODULE_12__["default"].create(renderBodyRow(data, index)); + })), footerRow && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_TableFooter__WEBPACK_IMPORTED_MODULE_9__["default"], null, _TableRow__WEBPACK_IMPORTED_MODULE_12__["default"].create(footerRow))); +} + +Table.handledProps = ["as", "attached", "basic", "celled", "children", "className", "collapsing", "color", "columns", "compact", "definition", "fixed", "footerRow", "headerRow", "headerRows", "inverted", "padded", "renderBodyRow", "selectable", "singleLine", "size", "sortable", "stackable", "striped", "structured", "tableData", "textAlign", "unstackable", "verticalAlign"]; +Table.defaultProps = { + as: 'table' +}; +Table.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Attach table to other content */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['top', 'bottom'])]), + + /** A table can reduce its complexity to increase readability. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['very']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool]), + + /** A table may be divided each row into separate cells. */ + celled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** A table can be collapsing, taking up only as much space as its rows. */ + collapsing: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can be given a color to distinguish it from other tables. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].COLORS), + + /** A table can specify its column count to divide its content evenly. */ + columns: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].WIDTHS), + + /** A table may sometimes need to be more compact to make more rows visible at a time. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['very'])]), + + /** A table may be formatted to emphasize a first column that defines a rows content. */ + definition: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** + * A table can use fixed a special faster form of table rendering that does not resize table cells based on content + */ + fixed: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Shorthand for a TableRow to be placed within Table.Footer. */ + footerRow: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** Shorthand for a TableRow to be placed within Table.Header. */ + headerRow: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['headerRows']), _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand]), + + /** Shorthand for multiple TableRows to be placed within Table.Header. */ + headerRows: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['headerRow']), _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand]), + + /** A table's colors can be inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table may sometimes need to be more padded for legibility. */ + padded: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['very'])]), + + /** + * Mapped over `tableData` and should return shorthand for each Table.Row to be placed within Table.Body. + * + * @param {*} data - An element in the `tableData` array. + * @param {number} index - The index of the current element in `tableData`. + * @returns {*} Shorthand for a Table.Row. + */ + renderBodyRow: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['children']), _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].demand(['tableData']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func]), + + /** A table can have its rows appear selectable. */ + selectable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can specify that its cell contents should remain on a single line and not wrap. */ + singleLine: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can also be small or large. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].SIZES, 'mini', 'tiny', 'medium', 'big', 'huge', 'massive')), + + /** A table may allow a user to sort contents by clicking on a table header. */ + sortable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can specify how it stacks table content responsively. */ + stackable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can stripe alternate rows of content with a darker color to increase contrast. */ + striped: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can be formatted to display complex structured data. */ + structured: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Data to be passed to the renderBodyRow function. */ + tableData: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].disallow(['children']), _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].demand(['renderBodyRow']), prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.array]), + + /** A table can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].TEXT_ALIGNMENTS, 'justified')), + + /** A table can specify how it stacks table content responsively. */ + unstackable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table can adjust its text alignment. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +Table.Body = _TableBody__WEBPACK_IMPORTED_MODULE_7__["default"]; +Table.Cell = _TableCell__WEBPACK_IMPORTED_MODULE_8__["default"]; +Table.Footer = _TableFooter__WEBPACK_IMPORTED_MODULE_9__["default"]; +Table.Header = _TableHeader__WEBPACK_IMPORTED_MODULE_10__["default"]; +Table.HeaderCell = _TableHeaderCell__WEBPACK_IMPORTED_MODULE_11__["default"]; +Table.Row = _TableRow__WEBPACK_IMPORTED_MODULE_12__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Table); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableBody.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/TableBody.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +function TableBody(props) { + var children = props.children, + className = props.className; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(TableBody, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(TableBody, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); +} + +TableBody.handledProps = ["as", "children", "className"]; +TableBody.defaultProps = { + as: 'tbody' +}; +TableBody.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (TableBody); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableCell.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/TableCell.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + + +/** + * A table row can have cells. + */ + +function TableCell(props) { + var active = props.active, + children = props.children, + className = props.className, + collapsing = props.collapsing, + content = props.content, + disabled = props.disabled, + error = props.error, + icon = props.icon, + negative = props.negative, + positive = props.positive, + selectable = props.selectable, + singleLine = props.singleLine, + textAlign = props.textAlign, + verticalAlign = props.verticalAlign, + warning = props.warning, + width = props.width; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(collapsing, 'collapsing'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(negative, 'negative'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(positive, 'positive'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(selectable, 'selectable'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(singleLine, 'single line'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(warning, 'warning'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useVerticalAlignProp"])(verticalAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useWidthProp"])(width, 'wide'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(TableCell, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(TableCell, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _elements_Icon__WEBPACK_IMPORTED_MODULE_6__["default"].create(icon), content); +} + +TableCell.handledProps = ["active", "as", "children", "className", "collapsing", "content", "disabled", "error", "icon", "negative", "positive", "selectable", "singleLine", "textAlign", "verticalAlign", "warning", "width"]; +TableCell.defaultProps = { + as: 'td' +}; +TableCell.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** A cell can be active or selected by a user. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A cell can be collapsing so that it only uses as much space as required. */ + collapsing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A cell can be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A cell may call attention to an error or a negative value. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Add an Icon by name, props object, or pass an <Icon /> */ + icon: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** A cell may let a user know whether a value is bad. */ + negative: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A cell may let a user know whether a value is good. */ + positive: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A cell can be selectable. */ + selectable: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A cell can specify that its contents should remain on a single line and not wrap. */ + singleLine: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A table cell can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS, 'justified')), + + /** A table cell can adjust its text alignment. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].VERTICAL_ALIGNMENTS), + + /** A cell may warn a user. */ + warning: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A table can specify the width of individual columns independently. */ + width: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].WIDTHS) +} : undefined; +TableCell.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(TableCell, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (TableCell); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableFooter.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/TableFooter.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _TableHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./TableHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeader.js"); + + + + + +/** + * A table can have a footer. + */ + +function TableFooter(props) { + var as = props.as; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_3__["getUnhandledProps"])(TableFooter, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(_TableHeader__WEBPACK_IMPORTED_MODULE_4__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + as: as + })); +} + +TableFooter.handledProps = ["as"]; +TableFooter.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_1___default.a.elementType +} : undefined; +TableFooter.defaultProps = { + as: 'tfoot' +}; +/* harmony default export */ __webpack_exports__["default"] = (TableFooter); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeader.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeader.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A table can have a header. + */ + +function TableHeader(props) { + var children = props.children, + className = props.className, + content = props.content, + fullWidth = props.fullWidth; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(fullWidth, 'full-width'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(TableHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(TableHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +TableHeader.handledProps = ["as", "children", "className", "content", "fullWidth"]; +TableHeader.defaultProps = { + as: 'thead' +}; +TableHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A definition table can have a full width header or footer, filling in the gap left by the first column. */ + fullWidth: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (TableHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeaderCell.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeaderCell.js ***! + \*************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _TableCell__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./TableCell */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableCell.js"); + + + + + + +/** + * A table can have a header cell. + */ + +function TableHeaderCell(props) { + var as = props.as, + className = props.className, + sorted = props.sorted; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useValueAndKey"])(sorted, 'sorted'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(TableHeaderCell, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_TableCell__WEBPACK_IMPORTED_MODULE_5__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + as: as, + className: classes + })); +} + +TableHeaderCell.handledProps = ["as", "className", "sorted"]; +TableHeaderCell.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** A header cell can be sorted in ascending or descending order. */ + sorted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['ascending', 'descending']) +} : undefined; +TableHeaderCell.defaultProps = { + as: 'th' +}; +/* harmony default export */ __webpack_exports__["default"] = (TableHeaderCell); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableRow.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/TableRow.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _TableCell__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./TableCell */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableCell.js"); + + + + + + + + +/** + * A table can have rows. + */ + +function TableRow(props) { + var active = props.active, + cellAs = props.cellAs, + cells = props.cells, + children = props.children, + className = props.className, + disabled = props.disabled, + error = props.error, + negative = props.negative, + positive = props.positive, + textAlign = props.textAlign, + verticalAlign = props.verticalAlign, + warning = props.warning; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(negative, 'negative'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(positive, 'positive'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(warning, 'warning'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useVerticalAlignProp"])(verticalAlign), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(TableRow, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(TableRow, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(cells, function (cell) { + return _TableCell__WEBPACK_IMPORTED_MODULE_7__["default"].create(cell, { + defaultProps: { + as: cellAs + } + }); + })); +} + +TableRow.handledProps = ["active", "as", "cellAs", "cells", "children", "className", "disabled", "error", "negative", "positive", "textAlign", "verticalAlign", "warning"]; +TableRow.defaultProps = { + as: 'tr', + cellAs: 'td' +}; +TableRow.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** A row can be active or selected by a user. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** An element type to render as (string or function). */ + cellAs: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Shorthand array of props for TableCell. */ + cells: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** A row can be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A row may call attention to an error or a negative value. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A row may let a user know whether a value is bad. */ + negative: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A row may let a user know whether a value is good. */ + positive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A table row can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].TEXT_ALIGNMENTS, 'justified')), + + /** A table row can adjust its vertical alignment. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].VERTICAL_ALIGNMENTS), + + /** A row may warn a user. */ + warning: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool +} : undefined; +TableRow.create = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["createShorthandFactory"])(TableRow, function (cells) { + return { + cells: cells + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (TableRow); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/collections/Table/index.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/collections/Table/index.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Table__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Table */ "./node_modules/semantic-ui-react/dist/es/collections/Table/Table.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Table__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Button/Button.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Button/Button.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Icon_Icon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Icon/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/Icon.js"); +/* harmony import */ var _Label_Label__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Label/Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/Label.js"); +/* harmony import */ var _ButtonContent__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ButtonContent */ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonContent.js"); +/* harmony import */ var _ButtonGroup__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ButtonGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonGroup.js"); +/* harmony import */ var _ButtonOr__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ButtonOr */ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonOr.js"); + + + + + + + + + + + + + + +/** + * A Button indicates a possible user action. + * @see Form + * @see Icon + * @see Label + */ + +var Button = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Button, _Component); + + function Button() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.ref = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_7__["createRef"])(); + + _this.computeElementType = function () { + var _this$props = _this.props, + attached = _this$props.attached, + label = _this$props.label; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(attached) || !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(label)) return 'div'; + }; + + _this.computeTabIndex = function (ElementType) { + var _this$props2 = _this.props, + disabled = _this$props2.disabled, + tabIndex = _this$props2.tabIndex; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(tabIndex)) return tabIndex; + if (disabled) return -1; + if (ElementType === 'div') return 0; + }; + + _this.focus = function () { + return Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.ref.current, 'focus'); + }; + + _this.handleClick = function (e) { + var disabled = _this.props.disabled; + + if (disabled) { + e.preventDefault(); + return; + } + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClick', e, _this.props); + }; + + _this.hasIconClass = function () { + var _this$props3 = _this.props, + labelPosition = _this$props3.labelPosition, + children = _this$props3.children, + content = _this$props3.content, + icon = _this$props3.icon; + if (icon === true) return true; + return icon && (labelPosition || _lib__WEBPACK_IMPORTED_MODULE_8__["childrenUtils"].isNil(children) && Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(content)); + }; + + return _this; + } + + var _proto = Button.prototype; + + _proto.computeButtonAriaRole = function computeButtonAriaRole(ElementType) { + var role = this.props.role; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(role)) return role; + if (ElementType !== 'button') return 'button'; + }; + + _proto.render = function render() { + var _this$props4 = this.props, + active = _this$props4.active, + animated = _this$props4.animated, + attached = _this$props4.attached, + basic = _this$props4.basic, + children = _this$props4.children, + circular = _this$props4.circular, + className = _this$props4.className, + color = _this$props4.color, + compact = _this$props4.compact, + content = _this$props4.content, + disabled = _this$props4.disabled, + floated = _this$props4.floated, + fluid = _this$props4.fluid, + icon = _this$props4.icon, + inverted = _this$props4.inverted, + label = _this$props4.label, + labelPosition = _this$props4.labelPosition, + loading = _this$props4.loading, + negative = _this$props4.negative, + positive = _this$props4.positive, + primary = _this$props4.primary, + secondary = _this$props4.secondary, + size = _this$props4.size, + toggle = _this$props4.toggle; + var baseClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])(color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(circular, 'circular'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(this.hasIconClass(), 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(negative, 'negative'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(positive, 'positive'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(primary, 'primary'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(secondary, 'secondary'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(toggle, 'toggle'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(animated, 'animated'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(attached, 'attached')); + var labeledClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(labelPosition || !!label, 'labeled')); + var wrapperClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useValueAndKey"])(floated, 'floated')); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getUnhandledProps"])(Button, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getElementType"])(Button, this.props, this.computeElementType); + var tabIndex = this.computeTabIndex(ElementType); + + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(label)) { + var buttonClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('ui', baseClasses, 'button', className); + var containerClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('ui', labeledClasses, 'button', className, wrapperClasses); + var labelElement = _Label_Label__WEBPACK_IMPORTED_MODULE_10__["default"].create(label, { + defaultProps: { + basic: true, + pointing: labelPosition === 'left' ? 'right' : 'left' + }, + autoGenerateKey: false + }); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: containerClasses, + onClick: this.handleClick + }), labelPosition === 'left' && labelElement, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["Ref"], { + innerRef: this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("button", { + className: buttonClasses, + "aria-pressed": toggle ? !!active : undefined, + disabled: disabled, + tabIndex: tabIndex + }, _Icon_Icon__WEBPACK_IMPORTED_MODULE_9__["default"].create(icon, { + autoGenerateKey: false + }), " ", content)), (labelPosition === 'right' || !labelPosition) && labelElement); + } + + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('ui', baseClasses, wrapperClasses, labeledClasses, 'button', className); + var hasChildren = !_lib__WEBPACK_IMPORTED_MODULE_8__["childrenUtils"].isNil(children); + var role = this.computeButtonAriaRole(ElementType); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["Ref"], { + innerRef: this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + "aria-pressed": toggle ? !!active : undefined, + disabled: disabled && ElementType === 'button' || undefined, + onClick: this.handleClick, + role: role, + tabIndex: tabIndex + }), hasChildren && children, !hasChildren && _Icon_Icon__WEBPACK_IMPORTED_MODULE_9__["default"].create(icon, { + autoGenerateKey: false + }), !hasChildren && content)); + }; + + return Button; +}(react__WEBPACK_IMPORTED_MODULE_7__["Component"]); + +Button.handledProps = ["active", "animated", "as", "attached", "basic", "children", "circular", "className", "color", "compact", "content", "disabled", "floated", "fluid", "icon", "inverted", "label", "labelPosition", "loading", "negative", "onClick", "positive", "primary", "role", "secondary", "size", "tabIndex", "toggle"]; +Button.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.elementType, + + /** A button can show it is currently the active user selection. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A button can animate to show hidden content. */ + animated: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['fade', 'vertical'])]), + + /** A button can be attached to other content. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['left', 'right', 'top', 'bottom'])]), + + /** A basic button is less pronounced. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Primary content. */ + children: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].every([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.node, _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].disallow(['label']), _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].givenProps({ + icon: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string.isRequired, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.object.isRequired, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.element.isRequired]) + }, _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].disallow(['icon']))]), + + /** A button can be circular. */ + circular: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** A button can have different colors */ + color: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf([].concat(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].COLORS, ['facebook', 'google plus', 'instagram', 'linkedin', 'twitter', 'vk', 'youtube'])), + + /** A button can reduce its padding to fit into tighter spaces. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].contentShorthand, + + /** A button can show it is currently unable to be interacted with. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A button can be aligned to the left or right of its container. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].FLOATS), + + /** A button can take the width of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Add an Icon by name, props object, or pass an <Icon />. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.element]), + + /** A button can be formatted to appear on dark backgrounds. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Add a Label by text, props object, or pass a <Label />. */ + label: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.element]), + + /** A labeled button can format a Label or Icon to appear on the left or right. */ + labelPosition: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['right', 'left']), + + /** A button can show a loading indicator. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A button can hint towards a negative consequence. */ + negative: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** + * Called after user's click. + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** A button can hint towards a positive consequence. */ + positive: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A button can be formatted to show different levels of emphasis. */ + primary: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** The role of the HTML element. */ + role: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** A button can be formatted to show different levels of emphasis. */ + secondary: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A button can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].SIZES), + + /** A button can receive focus. */ + tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** A button can be formatted to toggle on and off. */ + toggle: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool +} : undefined; +Button.defaultProps = { + as: 'button' +}; +Button.Content = _ButtonContent__WEBPACK_IMPORTED_MODULE_11__["default"]; +Button.Group = _ButtonGroup__WEBPACK_IMPORTED_MODULE_12__["default"]; +Button.Or = _ButtonOr__WEBPACK_IMPORTED_MODULE_13__["default"]; +Button.create = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["createShorthandFactory"])(Button, function (value) { + return { + content: value + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Button); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonContent.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonContent.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * Used in some Button types, such as `animated`. + */ + +function ButtonContent(props) { + var children = props.children, + className = props.className, + content = props.content, + hidden = props.hidden, + visible = props.visible; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(visible, 'visible'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(hidden, 'hidden'), 'content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ButtonContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ButtonContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ButtonContent.handledProps = ["as", "children", "className", "content", "hidden", "visible"]; +ButtonContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Initially hidden, visible on hover. */ + hidden: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Initially visible, hidden on hover. */ + visible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ButtonContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonGroup.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonGroup.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/Button.js"); + + + + + + + + +/** + * Buttons can be grouped. + */ + +function ButtonGroup(props) { + var attached = props.attached, + basic = props.basic, + buttons = props.buttons, + children = props.children, + className = props.className, + color = props.color, + compact = props.compact, + content = props.content, + floated = props.floated, + fluid = props.fluid, + icon = props.icon, + inverted = props.inverted, + labeled = props.labeled, + negative = props.negative, + positive = props.positive, + primary = props.primary, + secondary = props.secondary, + size = props.size, + toggle = props.toggle, + vertical = props.vertical, + widths = props.widths; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(icon, 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(labeled, 'labeled'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(negative, 'negative'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(positive, 'positive'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(primary, 'primary'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(secondary, 'secondary'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(toggle, 'toggle'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(vertical, 'vertical'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOrValueAndKey"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useWidthProp"])(widths), 'buttons', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(ButtonGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(ButtonGroup, props); + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_2__["default"])(buttons)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children) ? content : children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_1__["default"])(buttons, function (button) { + return _Button__WEBPACK_IMPORTED_MODULE_7__["default"].create(button); + })); +} + +ButtonGroup.handledProps = ["as", "attached", "basic", "buttons", "children", "className", "color", "compact", "content", "floated", "fluid", "icon", "inverted", "labeled", "negative", "positive", "primary", "secondary", "size", "toggle", "vertical", "widths"]; +ButtonGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Groups can be attached to other content. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['left', 'right', 'top', 'bottom'])]), + + /** Groups can be less pronounced. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Array of shorthand Button values. */ + buttons: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Groups can have a shared color. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].COLORS), + + /** Groups can reduce their padding to fit into tighter spaces. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** Groups can be aligned to the left or right of its container. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].FLOATS), + + /** Groups can take the width of their container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can be formatted as icons. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can be formatted to appear on dark backgrounds. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can be formatted as labeled icon buttons. */ + labeled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can hint towards a negative consequence. */ + negative: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can hint towards a positive consequence. */ + positive: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can be formatted to show different levels of emphasis. */ + primary: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can be formatted to show different levels of emphasis. */ + secondary: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].SIZES), + + /** Groups can be formatted to toggle on and off. */ + toggle: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can be formatted to appear vertically. */ + vertical: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Groups can have their widths divided evenly. */ + widths: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].WIDTHS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ButtonGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonOr.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonOr.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * Button groups can contain conditionals. + */ + +function ButtonOr(props) { + var className = props.className, + text = props.text; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('or', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ButtonOr, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ButtonOr, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + "data-text": text + })); +} + +ButtonOr.handledProps = ["as", "className", "text"]; +ButtonOr.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Or buttons can have their text localized, or adjusted by using the text prop. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string]) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ButtonOr); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Button/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Button/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/Button.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Button__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Container/Container.js": +/*!********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Container/Container.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A container limits content to a maximum width. + */ + +function Container(props) { + var children = props.children, + className = props.className, + content = props.content, + fluid = props.fluid, + text = props.text, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(text, 'text'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useTextAlignProp"])(textAlign), 'container', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Container, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Container, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Container.handledProps = ["as", "children", "className", "content", "fluid", "text", "textAlign"]; +Container.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Container has no maximum width. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Reduce maximum width to more naturally accommodate text. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Align container text. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].TEXT_ALIGNMENTS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Container); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Container/index.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Container/index.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Container__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Container */ "./node_modules/semantic-ui-react/dist/es/elements/Container/Container.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Container__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Divider/Divider.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Divider/Divider.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A divider visually segments content into groups. + */ + +function Divider(props) { + var children = props.children, + className = props.className, + clearing = props.clearing, + content = props.content, + fitted = props.fitted, + hidden = props.hidden, + horizontal = props.horizontal, + inverted = props.inverted, + section = props.section, + vertical = props.vertical; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(clearing, 'clearing'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(fitted, 'fitted'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(hidden, 'hidden'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(horizontal, 'horizontal'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(section, 'section'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(vertical, 'vertical'), 'divider', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Divider, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Divider, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Divider.handledProps = ["as", "children", "className", "clearing", "content", "fitted", "hidden", "horizontal", "inverted", "section", "vertical"]; +Divider.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Divider can clear the content above it. */ + clearing: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Divider can be fitted without any space above or below it. */ + fitted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Divider can divide content without creating a dividing line. */ + hidden: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Divider can segment content horizontally. */ + horizontal: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Divider can have its colours inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Divider can provide greater margins to divide sections of content. */ + section: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Divider can segment content vertically. */ + vertical: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Divider); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Divider/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Divider/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Divider__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Divider */ "./node_modules/semantic-ui-react/dist/es/elements/Divider/Divider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Divider__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Flag/Flag.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Flag/Flag.js ***! + \**********************************************************************/ +/*! exports provided: names, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "names", function() { return names; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +var names = ['ad', 'andorra', 'ae', 'united arab emirates', 'uae', 'af', 'afghanistan', 'ag', 'antigua', 'ai', 'anguilla', 'al', 'albania', 'am', 'armenia', 'an', 'netherlands antilles', 'ao', 'angola', 'ar', 'argentina', 'as', 'american samoa', 'at', 'austria', 'au', 'australia', 'aw', 'aruba', 'ax', 'aland islands', 'az', 'azerbaijan', 'ba', 'bosnia', 'bb', 'barbados', 'bd', 'bangladesh', 'be', 'belgium', 'bf', 'burkina faso', 'bg', 'bulgaria', 'bh', 'bahrain', 'bi', 'burundi', 'bj', 'benin', 'bm', 'bermuda', 'bn', 'brunei', 'bo', 'bolivia', 'br', 'brazil', 'bs', 'bahamas', 'bt', 'bhutan', 'bv', 'bouvet island', 'bw', 'botswana', 'by', 'belarus', 'bz', 'belize', 'ca', 'canada', 'cc', 'cocos islands', 'cd', 'congo', 'cf', 'central african republic', 'cg', 'congo brazzaville', 'ch', 'switzerland', 'ci', 'cote divoire', 'ck', 'cook islands', 'cl', 'chile', 'cm', 'cameroon', 'cn', 'china', 'co', 'colombia', 'cr', 'costa rica', 'cs', 'cu', 'cuba', 'cv', 'cape verde', 'cx', 'christmas island', 'cy', 'cyprus', 'cz', 'czech republic', 'de', 'germany', 'dj', 'djibouti', 'dk', 'denmark', 'dm', 'dominica', 'do', 'dominican republic', 'dz', 'algeria', 'ec', 'ecuador', 'england', 'gb eng', 'ee', 'estonia', 'eg', 'egypt', 'eh', 'western sahara', 'er', 'eritrea', 'es', 'spain', 'et', 'ethiopia', 'eu', 'european union', 'fi', 'finland', 'fj', 'fiji', 'fk', 'falkland islands', 'fm', 'micronesia', 'fo', 'faroe islands', 'fr', 'france', 'ga', 'gabon', 'gb', 'uk', 'united kingdom', 'gd', 'grenada', 'ge', 'georgia', 'gf', 'french guiana', 'gh', 'ghana', 'gi', 'gibraltar', 'gl', 'greenland', 'gm', 'gambia', 'gn', 'guinea', 'gp', 'guadeloupe', 'gq', 'equatorial guinea', 'gr', 'greece', 'gs', 'sandwich islands', 'gt', 'guatemala', 'gu', 'guam', 'gw', 'guinea-bissau', 'gy', 'guyana', 'hk', 'hong kong', 'hm', 'heard island', 'hn', 'honduras', 'hr', 'croatia', 'ht', 'haiti', 'hu', 'hungary', 'id', 'indonesia', 'ie', 'ireland', 'il', 'israel', 'in', 'india', 'io', 'indian ocean territory', 'iq', 'iraq', 'ir', 'iran', 'is', 'iceland', 'it', 'italy', 'jm', 'jamaica', 'jo', 'jordan', 'jp', 'japan', 'ke', 'kenya', 'kg', 'kyrgyzstan', 'kh', 'cambodia', 'ki', 'kiribati', 'km', 'comoros', 'kn', 'saint kitts and nevis', 'kp', 'north korea', 'kr', 'south korea', 'kw', 'kuwait', 'ky', 'cayman islands', 'kz', 'kazakhstan', 'la', 'laos', 'lb', 'lebanon', 'lc', 'saint lucia', 'li', 'liechtenstein', 'lk', 'sri lanka', 'lr', 'liberia', 'ls', 'lesotho', 'lt', 'lithuania', 'lu', 'luxembourg', 'lv', 'latvia', 'ly', 'libya', 'ma', 'morocco', 'mc', 'monaco', 'md', 'moldova', 'me', 'montenegro', 'mg', 'madagascar', 'mh', 'marshall islands', 'mk', 'macedonia', 'ml', 'mali', 'mm', 'myanmar', 'burma', 'mn', 'mongolia', 'mo', 'macau', 'mp', 'northern mariana islands', 'mq', 'martinique', 'mr', 'mauritania', 'ms', 'montserrat', 'mt', 'malta', 'mu', 'mauritius', 'mv', 'maldives', 'mw', 'malawi', 'mx', 'mexico', 'my', 'malaysia', 'mz', 'mozambique', 'na', 'namibia', 'nc', 'new caledonia', 'ne', 'niger', 'nf', 'norfolk island', 'ng', 'nigeria', 'ni', 'nicaragua', 'nl', 'netherlands', 'no', 'norway', 'np', 'nepal', 'nr', 'nauru', 'nu', 'niue', 'nz', 'new zealand', 'om', 'oman', 'pa', 'panama', 'pe', 'peru', 'pf', 'french polynesia', 'pg', 'new guinea', 'ph', 'philippines', 'pk', 'pakistan', 'pl', 'poland', 'pm', 'saint pierre', 'pn', 'pitcairn islands', 'pr', 'puerto rico', 'ps', 'palestine', 'pt', 'portugal', 'pw', 'palau', 'py', 'paraguay', 'qa', 'qatar', 're', 'reunion', 'ro', 'romania', 'rs', 'serbia', 'ru', 'russia', 'rw', 'rwanda', 'sa', 'saudi arabia', 'sb', 'solomon islands', 'sc', 'seychelles', 'gb sct', 'scotland', 'sd', 'sudan', 'se', 'sweden', 'sg', 'singapore', 'sh', 'saint helena', 'si', 'slovenia', 'sj', 'svalbard', 'jan mayen', 'sk', 'slovakia', 'sl', 'sierra leone', 'sm', 'san marino', 'sn', 'senegal', 'so', 'somalia', 'sr', 'suriname', 'st', 'sao tome', 'sv', 'el salvador', 'sy', 'syria', 'sz', 'swaziland', 'tc', 'caicos islands', 'td', 'chad', 'tf', 'french territories', 'tg', 'togo', 'th', 'thailand', 'tj', 'tajikistan', 'tk', 'tokelau', 'tl', 'timorleste', 'tm', 'turkmenistan', 'tn', 'tunisia', 'to', 'tonga', 'tr', 'turkey', 'tt', 'trinidad', 'tv', 'tuvalu', 'tw', 'taiwan', 'tz', 'tanzania', 'ua', 'ukraine', 'ug', 'uganda', 'um', 'us minor islands', 'us', 'america', 'united states', 'uy', 'uruguay', 'uz', 'uzbekistan', 'va', 'vatican city', 'vc', 'saint vincent', 've', 'venezuela', 'vg', 'british virgin islands', 'vi', 'us virgin islands', 'vn', 'vietnam', 'vu', 'vanuatu', 'gb wls', 'wales', 'wf', 'wallis and futuna', 'ws', 'samoa', 'ye', 'yemen', 'yt', 'mayotte', 'za', 'south africa', 'zm', 'zambia', 'zw', 'zimbabwe']; +/** + * A flag is is used to represent a political state. + */ + +var Flag = /*#__PURE__*/function (_PureComponent) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Flag, _PureComponent); + + function Flag() { + return _PureComponent.apply(this, arguments) || this; + } + + var _proto = Flag.prototype; + + _proto.render = function render() { + var _this$props = this.props, + className = _this$props.className, + name = _this$props.name; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(name, 'flag', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Flag, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Flag, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + })); + }; + + return Flag; +}(react__WEBPACK_IMPORTED_MODULE_4__["PureComponent"]); + +Flag.handledProps = ["as", "className", "name"]; +Flag.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Flag name, can use the two digit country code, the full name, or a common alias. */ + name: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].suggest(names) +} : undefined; +Flag.defaultProps = { + as: 'i' +}; +Flag.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(Flag, function (value) { + return { + name: value + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Flag); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Flag/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Flag/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Flag__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Flag */ "./node_modules/semantic-ui-react/dist/es/elements/Flag/Flag.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Flag__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Header/Header.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Header/Header.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _Image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); +/* harmony import */ var _HeaderSubheader__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./HeaderSubheader */ "./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderSubheader.js"); +/* harmony import */ var _HeaderContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./HeaderContent */ "./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderContent.js"); + + + + + + + + + + +/** + * A header provides a short summary of content + */ + +function Header(props) { + var attached = props.attached, + block = props.block, + children = props.children, + className = props.className, + color = props.color, + content = props.content, + disabled = props.disabled, + dividing = props.dividing, + floated = props.floated, + icon = props.icon, + image = props.image, + inverted = props.inverted, + size = props.size, + sub = props.sub, + subheader = props.subheader, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(block, 'block'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(dividing, 'dividing'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(icon === true, 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(image === true, 'image'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(sub, 'sub'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOrValueAndKey"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), 'header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Header, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Header, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + var iconElement = _Icon__WEBPACK_IMPORTED_MODULE_6__["default"].create(icon, { + autoGenerateKey: false + }); + var imageElement = _Image__WEBPACK_IMPORTED_MODULE_7__["default"].create(image, { + autoGenerateKey: false + }); + var subheaderElement = _HeaderSubheader__WEBPACK_IMPORTED_MODULE_8__["default"].create(subheader, { + autoGenerateKey: false + }); + + if (iconElement || imageElement) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), iconElement || imageElement, (content || subheaderElement) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_HeaderContent__WEBPACK_IMPORTED_MODULE_9__["default"], null, content, subheaderElement)); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content, subheaderElement); +} + +Header.handledProps = ["as", "attached", "block", "children", "className", "color", "content", "disabled", "dividing", "floated", "icon", "image", "inverted", "size", "sub", "subheader", "textAlign"]; +Header.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Attach header to other content, like a segment. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['top', 'bottom'])]), + + /** Format header to appear inside a content block. */ + block: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Color of the header. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Show that the header is inactive. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Divide header from the content below it. */ + dividing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Header can sit to the left or right of other content. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].FLOATS), + + /** Add an icon by icon name or pass an Icon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].disallow(['image']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand])]), + + /** Add an image by img src or pass an Image. */ + image: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].disallow(['icon']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand])]), + + /** Inverts the color of the header for dark backgrounds. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Content headings are sized with em and are based on the font-size of their container. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'big', 'massive', 'mini')), + + /** Headers may be formatted to label smaller or de-emphasized content. */ + sub: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for Header.Subheader. */ + subheader: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** Align header content. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS) +} : undefined; +Header.Content = _HeaderContent__WEBPACK_IMPORTED_MODULE_9__["default"]; +Header.Subheader = _HeaderSubheader__WEBPACK_IMPORTED_MODULE_8__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Header); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderContent.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderContent.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * Header content wraps the main content when there is an adjacent Icon or Image. + */ + +function HeaderContent(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(HeaderContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(HeaderContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +HeaderContent.handledProps = ["as", "children", "className", "content"]; +HeaderContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (HeaderContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderSubheader.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderSubheader.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * Headers may contain subheaders. + */ + +function HeaderSubheader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('sub header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(HeaderSubheader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(HeaderSubheader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +HeaderSubheader.handledProps = ["as", "children", "className", "content"]; +HeaderSubheader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +HeaderSubheader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(HeaderSubheader, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (HeaderSubheader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Header/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Header/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Header__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Header */ "./node_modules/semantic-ui-react/dist/es/elements/Header/Header.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Header__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Icon/Icon.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Icon/Icon.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _IconGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./IconGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/IconGroup.js"); + + + + + + + + + + +/** + * An icon is a glyph used to represent something else. + * @see Image + */ + +var Icon = /*#__PURE__*/function (_PureComponent) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Icon, _PureComponent); + + function Icon() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _PureComponent.call.apply(_PureComponent, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var disabled = _this.props.disabled; + + if (disabled) { + e.preventDefault(); + return; + } + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = Icon.prototype; + + _proto.getIconAriaOptions = function getIconAriaOptions() { + var ariaOptions = {}; + var _this$props = this.props, + ariaLabel = _this$props['aria-label'], + ariaHidden = _this$props['aria-hidden']; + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_4__["default"])(ariaLabel)) { + ariaOptions['aria-hidden'] = 'true'; + } else { + ariaOptions['aria-label'] = ariaLabel; + } + + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_4__["default"])(ariaHidden)) { + ariaOptions['aria-hidden'] = ariaHidden; + } + + return ariaOptions; + }; + + _proto.render = function render() { + var _this$props2 = this.props, + bordered = _this$props2.bordered, + circular = _this$props2.circular, + className = _this$props2.className, + color = _this$props2.color, + corner = _this$props2.corner, + disabled = _this$props2.disabled, + fitted = _this$props2.fitted, + flipped = _this$props2.flipped, + inverted = _this$props2.inverted, + link = _this$props2.link, + loading = _this$props2.loading, + name = _this$props2.name, + rotated = _this$props2.rotated, + size = _this$props2.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])(color, name, size, Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(bordered, 'bordered'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(circular, 'circular'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(fitted, 'fitted'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(link, 'link'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOrValueAndKey"])(corner, 'corner'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useValueAndKey"])(flipped, 'flipped'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useValueAndKey"])(rotated, 'rotated'), 'icon', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getUnhandledProps"])(Icon, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getElementType"])(Icon, this.props); + var ariaOptions = this.getIconAriaOptions(); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, ariaOptions, { + className: classes, + onClick: this.handleClick + })); + }; + + return Icon; +}(react__WEBPACK_IMPORTED_MODULE_7__["PureComponent"]); + +Icon.handledProps = ["aria-hidden", "aria-label", "as", "bordered", "circular", "className", "color", "corner", "disabled", "fitted", "flipped", "inverted", "link", "loading", "name", "rotated", "size"]; +Icon.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.elementType, + + /** Formatted to appear bordered. */ + bordered: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Icon can formatted to appear circular. */ + circular: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** Color of the icon. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].COLORS), + + /** Icons can display a smaller corner icon. */ + corner: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['top left', 'top right', 'bottom left', 'bottom right'])]), + + /** Show that the icon is inactive. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Fitted, without space to left or right of Icon. */ + fitted: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Icon can be flipped. */ + flipped: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['horizontally', 'vertically']), + + /** Formatted to have its colors inverted for contrast. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Icon can be formatted as a link. */ + link: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Icon can be used as a simple loader. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Name of the icon. */ + name: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].suggest(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].ALL_ICONS_IN_ALL_CONTEXTS), + + /** Icon can rotated. */ + rotated: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['clockwise', 'counterclockwise']), + + /** Size of the icon. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].SIZES, 'medium')), + + /** Icon can have an aria label. */ + 'aria-hidden': prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** Icon can have an aria label. */ + 'aria-label': prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string +} : undefined; +Icon.defaultProps = { + as: 'i' +}; +Icon.Group = _IconGroup__WEBPACK_IMPORTED_MODULE_9__["default"]; +Icon.create = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["createShorthandFactory"])(Icon, function (value) { + return { + name: value + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Icon); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Icon/IconGroup.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Icon/IconGroup.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * Several icons can be used together as a group. + */ + +function IconGroup(props) { + var children = props.children, + className = props.className, + content = props.content, + size = props.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(size, 'icons', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(IconGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(IconGroup, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +IconGroup.handledProps = ["as", "children", "className", "content", "size"]; +IconGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Size of the icon group. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'medium')) +} : undefined; +IconGroup.defaultProps = { + as: 'i' +}; +/* harmony default export */ __webpack_exports__["default"] = (IconGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Icon__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/Icon.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Icon__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Image/Image.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Image/Image.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _modules_Dimmer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../modules/Dimmer */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/index.js"); +/* harmony import */ var _Label_Label__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Label/Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/Label.js"); +/* harmony import */ var _ImageGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ImageGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Image/ImageGroup.js"); + + + + + + + + + +/** + * An image is a graphic representation of something. + * @see Icon + */ + +function Image(props) { + var avatar = props.avatar, + bordered = props.bordered, + centered = props.centered, + children = props.children, + circular = props.circular, + className = props.className, + content = props.content, + dimmer = props.dimmer, + disabled = props.disabled, + floated = props.floated, + fluid = props.fluid, + hidden = props.hidden, + href = props.href, + inline = props.inline, + label = props.label, + rounded = props.rounded, + size = props.size, + spaced = props.spaced, + verticalAlign = props.verticalAlign, + wrapped = props.wrapped, + ui = props.ui; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(ui, 'ui'), size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(avatar, 'avatar'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(bordered, 'bordered'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(circular, 'circular'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(centered, 'centered'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(hidden, 'hidden'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(inline, 'inline'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(rounded, 'rounded'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOrValueAndKey"])(spaced, 'spaced'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useVerticalAlignProp"])(verticalAlign, 'aligned'), 'image', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Image, props); + + var _partitionHTMLProps = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["partitionHTMLProps"])(rest, { + htmlProps: _lib__WEBPACK_IMPORTED_MODULE_5__["htmlImageProps"] + }), + imgTagProps = _partitionHTMLProps[0], + rootProps = _partitionHTMLProps[1]; + + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Image, props, function () { + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(dimmer) || !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(label) || !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_1__["default"])(wrapped) || !_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return 'div'; + } + }); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + if (ElementType === 'img') { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rootProps, imgTagProps, { + className: classes + })); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rootProps, { + className: classes, + href: href + }), _modules_Dimmer__WEBPACK_IMPORTED_MODULE_6__["default"].create(dimmer, { + autoGenerateKey: false + }), _Label_Label__WEBPACK_IMPORTED_MODULE_7__["default"].create(label, { + autoGenerateKey: false + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("img", imgTagProps)); +} + +Image.handledProps = ["as", "avatar", "bordered", "centered", "children", "circular", "className", "content", "dimmer", "disabled", "floated", "fluid", "hidden", "href", "inline", "label", "rounded", "size", "spaced", "ui", "verticalAlign", "wrapped"]; +Image.Group = _ImageGroup__WEBPACK_IMPORTED_MODULE_8__["default"]; +Image.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** An image may be formatted to appear inline with text as an avatar. */ + avatar: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** An image may include a border to emphasize the edges of white or transparent content. */ + bordered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** An image can appear centered in a content block. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** An image may appear circular. */ + circular: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** An image can show that it is disabled and cannot be selected. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for Dimmer. */ + dimmer: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** An image can sit to the left or right of other content. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].FLOATS), + + /** An image can take up the width of its container. */ + fluid: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].disallow(['size'])]), + + /** An image can be hidden. */ + hidden: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Renders the Image as an <a> tag with this href. */ + href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** An image may appear inline. */ + inline: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for Label. */ + label: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** An image may appear rounded. */ + rounded: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** An image may appear at different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES), + + /** An image can specify that it needs an additional spacing to separate it from nearby content. */ + spaced: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['left', 'right'])]), + + /** Whether or not to add the ui className. */ + ui: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** An image can specify its vertical alignment. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].VERTICAL_ALIGNMENTS), + + /** An image can render wrapped in a `div.ui.image` as alternative HTML markup. */ + wrapped: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +Image.defaultProps = { + as: 'img', + ui: true +}; +Image.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(Image, function (value) { + return { + src: value + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Image); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Image/ImageGroup.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Image/ImageGroup.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A group of images. + */ + +function ImageGroup(props) { + var children = props.children, + className = props.className, + content = props.content, + size = props.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', size, className, 'images'); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ImageGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ImageGroup, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ImageGroup.handledProps = ["as", "children", "className", "content", "size"]; +ImageGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A group of images can be formatted to have the same size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].SIZES) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ImageGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Image/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Image__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/Image.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Image__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Input/Input.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Input/Input.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Button__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/index.js"); +/* harmony import */ var _Icon__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/index.js"); + + + + + + + + + + + + + + + +/** + * An Input is a field used to elicit a response from a user. + * @see Button + * @see Form + * @see Icon + * @see Label + */ + +var Input = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Input, _Component); + + function Input() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.inputRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_10__["createRef"])(); + + _this.computeIcon = function () { + var _this$props = _this.props, + loading = _this$props.loading, + icon = _this$props.icon; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__["default"])(icon)) return icon; + if (loading) return 'spinner'; + }; + + _this.computeTabIndex = function () { + var _this$props2 = _this.props, + disabled = _this$props2.disabled, + tabIndex = _this$props2.tabIndex; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__["default"])(tabIndex)) return tabIndex; + if (disabled) return -1; + }; + + _this.focus = function () { + return _this.inputRef.current.focus(); + }; + + _this.select = function () { + return _this.inputRef.current.select(); + }; + + _this.handleChange = function (e) { + var value = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_5__["default"])(e, 'target.value'); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__["default"])(_this.props, 'onChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: value + })); + }; + + _this.handleChildOverrides = function (child, defaultProps) { + return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, defaultProps, child.props, { + ref: function ref(c) { + Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_7__["handleRef"])(child.ref, c); + _this.inputRef.current = c; + } + }); + }; + + _this.partitionProps = function () { + var _this$props3 = _this.props, + disabled = _this$props3.disabled, + type = _this$props3.type; + + var tabIndex = _this.computeTabIndex(); + + var unhandled = Object(_lib__WEBPACK_IMPORTED_MODULE_11__["getUnhandledProps"])(Input, _this.props); + + var _partitionHTMLProps = Object(_lib__WEBPACK_IMPORTED_MODULE_11__["partitionHTMLProps"])(unhandled), + htmlInputProps = _partitionHTMLProps[0], + rest = _partitionHTMLProps[1]; + + return [Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, htmlInputProps, { + disabled: disabled, + type: type, + tabIndex: tabIndex, + onChange: _this.handleChange, + ref: _this.inputRef + }), rest]; + }; + + return _this; + } + + var _proto = Input.prototype; + + _proto.render = function render() { + var _this2 = this; + + var _this$props4 = this.props, + action = _this$props4.action, + actionPosition = _this$props4.actionPosition, + children = _this$props4.children, + className = _this$props4.className, + disabled = _this$props4.disabled, + error = _this$props4.error, + fluid = _this$props4.fluid, + focus = _this$props4.focus, + icon = _this$props4.icon, + iconPosition = _this$props4.iconPosition, + input = _this$props4.input, + inverted = _this$props4.inverted, + label = _this$props4.label, + labelPosition = _this$props4.labelPosition, + loading = _this$props4.loading, + size = _this$props4.size, + transparent = _this$props4.transparent, + type = _this$props4.type; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_8__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(focus, 'focus'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(transparent, 'transparent'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useValueAndKey"])(actionPosition, 'action') || Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(action, 'action'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useValueAndKey"])(iconPosition, 'icon') || Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(icon || loading, 'icon'), Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useValueAndKey"])(labelPosition, 'labeled') || Object(_lib__WEBPACK_IMPORTED_MODULE_11__["useKeyOnly"])(label, 'labeled'), 'input', className); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_11__["getElementType"])(Input, this.props); + + var _this$partitionProps = this.partitionProps(), + htmlInputProps = _this$partitionProps[0], + rest = _this$partitionProps[1]; // Render with children + // ---------------------------------------- + + + if (!_lib__WEBPACK_IMPORTED_MODULE_11__["childrenUtils"].isNil(children)) { + // add htmlInputProps to the `<input />` child + var childElements = Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_3__["default"])(react__WEBPACK_IMPORTED_MODULE_10__["Children"].toArray(children), function (child) { + if (child.type !== 'input') return child; + return /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_10__["cloneElement"])(child, _this2.handleChildOverrides(child, htmlInputProps)); + }); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), childElements); + } // Render Shorthand + // ---------------------------------------- + + + var actionElement = _Button__WEBPACK_IMPORTED_MODULE_12__["default"].create(action, { + autoGenerateKey: false + }); + var labelElement = _Label__WEBPACK_IMPORTED_MODULE_14__["default"].create(label, { + defaultProps: { + className: Object(clsx__WEBPACK_IMPORTED_MODULE_8__["default"])('label', // add 'left|right corner' + Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_2__["default"])(labelPosition, 'corner') && labelPosition) + }, + autoGenerateKey: false + }); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), actionPosition === 'left' && actionElement, labelPosition !== 'right' && labelElement, Object(_lib__WEBPACK_IMPORTED_MODULE_11__["createHTMLInput"])(input || type, { + defaultProps: htmlInputProps, + autoGenerateKey: false + }), _Icon__WEBPACK_IMPORTED_MODULE_13__["default"].create(this.computeIcon(), { + autoGenerateKey: false + }), actionPosition !== 'left' && actionElement, labelPosition === 'right' && labelElement); + }; + + return Input; +}(react__WEBPACK_IMPORTED_MODULE_10__["Component"]); + +Input.handledProps = ["action", "actionPosition", "as", "children", "className", "disabled", "error", "fluid", "focus", "icon", "iconPosition", "input", "inverted", "label", "labelPosition", "loading", "onChange", "size", "tabIndex", "transparent", "type"]; +Input.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.elementType, + + /** An Input can be formatted to alert the user to an action they may perform. */ + action: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_11__["customPropTypes"].itemShorthand]), + + /** An action can appear along side an Input on the left or right. */ + actionPosition: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOf(['left']), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.string, + + /** An Input field can show that it is disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** An Input field can show the data contains errors. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** Take on the size of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** An Input field can show a user is currently interacting with it. */ + focus: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** Optional Icon to display inside the Input. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_11__["customPropTypes"].itemShorthand]), + + /** An Icon can appear inside an Input on the left or right. */ + iconPosition: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOf(['left']), + + /** Shorthand for creating the HTML Input. */ + input: _lib__WEBPACK_IMPORTED_MODULE_11__["customPropTypes"].itemShorthand, + + /** Format to appear on dark backgrounds. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** Optional Label to display along side the Input. */ + label: _lib__WEBPACK_IMPORTED_MODULE_11__["customPropTypes"].itemShorthand, + + /** A Label can appear outside an Input on the left or right. */ + labelPosition: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOf(['left', 'right', 'left corner', 'right corner']), + + /** An Icon Input field can show that it is currently loading data. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** + * Called on change. + * + * @param {ChangeEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and a proposed value. + */ + onChange: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.func, + + /** An Input can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOf(['mini', 'small', 'large', 'big', 'huge', 'massive']), + + /** An Input can receive focus. */ + tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.string]), + + /** Transparent Input has no background. */ + transparent: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.bool, + + /** The HTML input type. */ + type: prop_types__WEBPACK_IMPORTED_MODULE_9___default.a.string +} : undefined; +Input.defaultProps = { + type: 'text' +}; +Input.create = Object(_lib__WEBPACK_IMPORTED_MODULE_11__["createShorthandFactory"])(Input, function (type) { + return { + type: type + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Input); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Input/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Input/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Input__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Input */ "./node_modules/semantic-ui-react/dist/es/elements/Input/Input.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Input__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Label/Label.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Label/Label.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 Label; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Icon_Icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Icon/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/Icon.js"); +/* harmony import */ var _Image_Image__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../Image/Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/Image.js"); +/* harmony import */ var _LabelDetail__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./LabelDetail */ "./node_modules/semantic-ui-react/dist/es/elements/Label/LabelDetail.js"); +/* harmony import */ var _LabelGroup__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./LabelGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Label/LabelGroup.js"); + + + + + + + + + + + + +/** + * A label displays content classification. + */ + +var Label = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Label, _Component); + + function Label() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var onClick = _this.props.onClick; + if (onClick) onClick(e, _this.props); + }; + + _this.handleIconOverrides = function (predefinedProps) { + return { + onClick: function onClick(e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(predefinedProps, 'onClick', e); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onRemove', e, _this.props); + } + }; + }; + + return _this; + } + + var _proto = Label.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + attached = _this$props.attached, + basic = _this$props.basic, + children = _this$props.children, + circular = _this$props.circular, + className = _this$props.className, + color = _this$props.color, + content = _this$props.content, + corner = _this$props.corner, + detail = _this$props.detail, + empty = _this$props.empty, + floating = _this$props.floating, + horizontal = _this$props.horizontal, + icon = _this$props.icon, + image = _this$props.image, + onRemove = _this$props.onRemove, + pointing = _this$props.pointing, + prompt = _this$props.prompt, + removeIcon = _this$props.removeIcon, + ribbon = _this$props.ribbon, + size = _this$props.size, + tag = _this$props.tag; + var pointingClass = pointing === true && 'pointing' || (pointing === 'left' || pointing === 'right') && pointing + " pointing" || (pointing === 'above' || pointing === 'below') && "pointing " + pointing; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', color, pointingClass, size, Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(circular, 'circular'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(empty, 'empty'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(floating, 'floating'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(horizontal, 'horizontal'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(image === true, 'image'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(prompt, 'prompt'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(tag, 'tag'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOrValueAndKey"])(corner, 'corner'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOrValueAndKey"])(ribbon, 'ribbon'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useValueAndKey"])(attached, 'attached'), 'label', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(Label, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(Label, this.props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), children); + } + + var removeIconShorthand = Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_2__["default"])(removeIcon) ? 'delete' : removeIcon; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + className: classes, + onClick: this.handleClick + }, rest), _Icon_Icon__WEBPACK_IMPORTED_MODULE_8__["default"].create(icon, { + autoGenerateKey: false + }), typeof image !== 'boolean' && _Image_Image__WEBPACK_IMPORTED_MODULE_9__["default"].create(image, { + autoGenerateKey: false + }), content, _LabelDetail__WEBPACK_IMPORTED_MODULE_10__["default"].create(detail, { + autoGenerateKey: false + }), onRemove && _Icon_Icon__WEBPACK_IMPORTED_MODULE_8__["default"].create(removeIconShorthand, { + autoGenerateKey: false, + overrideProps: this.handleIconOverrides + })); + }; + + return Label; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +Label.handledProps = ["active", "as", "attached", "basic", "children", "circular", "className", "color", "content", "corner", "detail", "empty", "floating", "horizontal", "icon", "image", "onClick", "onRemove", "pointing", "prompt", "removeIcon", "ribbon", "size", "tag"]; + +Label.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** A label can be active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A label can attach to a content segment. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['top', 'bottom', 'top right', 'top left', 'bottom left', 'bottom right']), + + /** A label can reduce its complexity. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** A label can be circular. */ + circular: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Color of the label. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** A label can position itself in the corner of an element. */ + corner: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['left', 'right'])]), + + /** Shorthand for LabelDetail. */ + detail: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** Formats the label as a dot. */ + empty: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].every([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].demand(['circular'])]), + + /** Float above another element in the upper right corner. */ + floating: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A horizontal label is formatted to label content along-side it horizontally. */ + horizontal: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand for Icon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A label can be formatted to emphasize an image or prop can be used as shorthand for Image. */ + image: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand]), + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Adds an "x" icon, called when "x" is clicked. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onRemove: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** A label can point to content next to it. */ + pointing: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['above', 'below', 'left', 'right'])]), + + /** A label can prompt for an error in your forms. */ + prompt: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand for Icon to appear as the last child and trigger onRemove. */ + removeIcon: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A label can appear as a ribbon attaching itself to an element. */ + ribbon: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['right'])]), + + /** A label can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].SIZES), + + /** A label can appear as a tag. */ + tag: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool +} : undefined; +Label.Detail = _LabelDetail__WEBPACK_IMPORTED_MODULE_10__["default"]; +Label.Group = _LabelGroup__WEBPACK_IMPORTED_MODULE_11__["default"]; +Label.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(Label, function (value) { + return { + content: value + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Label/LabelDetail.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Label/LabelDetail.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +function LabelDetail(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('detail', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(LabelDetail, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(LabelDetail, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +LabelDetail.handledProps = ["as", "children", "className", "content"]; +LabelDetail.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +LabelDetail.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(LabelDetail, function (val) { + return { + content: val + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (LabelDetail); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Label/LabelGroup.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Label/LabelGroup.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A label can be grouped. + */ + +function LabelGroup(props) { + var children = props.children, + circular = props.circular, + className = props.className, + color = props.color, + content = props.content, + size = props.size, + tag = props.tag; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(circular, 'circular'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(tag, 'tag'), 'labels', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(LabelGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(LabelGroup, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +LabelGroup.handledProps = ["as", "children", "circular", "className", "color", "content", "size", "tag"]; +LabelGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Labels can share shapes. */ + circular: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Label group can share colors together. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Label group can share sizes together. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].SIZES), + + /** Label group can share tag formatting. */ + tag: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (LabelGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Label/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Label/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Label__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/Label.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Label__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/List.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/List.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _ListContent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ListContent */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListContent.js"); +/* harmony import */ var _ListDescription__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ListDescription */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListDescription.js"); +/* harmony import */ var _ListHeader__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ListHeader */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListHeader.js"); +/* harmony import */ var _ListIcon__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ListIcon */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListIcon.js"); +/* harmony import */ var _ListItem__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ListItem */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListItem.js"); +/* harmony import */ var _ListList__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ListList */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListList.js"); + + + + + + + + + + + + + + +/** + * A list groups related content. + */ + +var List = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(List, _Component); + + function List() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleItemOverrides = function (predefinedProps) { + return { + onClick: function onClick(e, itemProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(predefinedProps, 'onClick', e, itemProps); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onItemClick', e, itemProps); + } + }; + }; + + return _this; + } + + var _proto = List.prototype; + + _proto.render = function render() { + var _this2 = this; + + var _this$props = this.props, + animated = _this$props.animated, + bulleted = _this$props.bulleted, + celled = _this$props.celled, + children = _this$props.children, + className = _this$props.className, + content = _this$props.content, + divided = _this$props.divided, + floated = _this$props.floated, + horizontal = _this$props.horizontal, + inverted = _this$props.inverted, + items = _this$props.items, + link = _this$props.link, + ordered = _this$props.ordered, + relaxed = _this$props.relaxed, + selection = _this$props.selection, + size = _this$props.size, + verticalAlign = _this$props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(animated, 'animated'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(bulleted, 'bulleted'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(celled, 'celled'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(divided, 'divided'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(horizontal, 'horizontal'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(link, 'link'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(ordered, 'ordered'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(selection, 'selection'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOrValueAndKey"])(relaxed, 'relaxed'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useVerticalAlignProp"])(verticalAlign), 'list', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(List, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(List, this.props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + role: "list", + className: classes + }, rest), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + role: "list", + className: classes + }, rest), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + role: "list", + className: classes + }, rest), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(items, function (item) { + return _ListItem__WEBPACK_IMPORTED_MODULE_12__["default"].create(item, { + overrideProps: _this2.handleItemOverrides + }); + })); + }; + + return List; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +List.handledProps = ["animated", "as", "bulleted", "celled", "children", "className", "content", "divided", "floated", "horizontal", "inverted", "items", "link", "onItemClick", "ordered", "relaxed", "selection", "size", "verticalAlign"]; +List.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** A list can animate to set the current item apart from the list. */ + animated: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A list can mark items with a bullet. */ + bulleted: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A list can divide its items into cells. */ + celled: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** A list can show divisions between content. */ + divided: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** An list can be floated left or right. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].FLOATS), + + /** A list can be formatted to have items appear horizontally. */ + horizontal: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A list can be inverted to appear on a dark background. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand array of props for ListItem. */ + items: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].collectionShorthand, + + /** A list can be specially formatted for navigation links. */ + link: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** + * onClick handler for ListItem. Mutually exclusive with children. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All item props. + */ + onItemClick: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func]), + + /** A list can be ordered numerically. */ + ordered: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A list can relax its padding to provide more negative space. */ + relaxed: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['very'])]), + + /** A selection list formats list items as possible choices. */ + selection: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A list can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].SIZES), + + /** An element inside a list can be vertically aligned. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +List.Content = _ListContent__WEBPACK_IMPORTED_MODULE_8__["default"]; +List.Description = _ListDescription__WEBPACK_IMPORTED_MODULE_9__["default"]; +List.Header = _ListHeader__WEBPACK_IMPORTED_MODULE_10__["default"]; +List.Icon = _ListIcon__WEBPACK_IMPORTED_MODULE_11__["default"]; +List.Item = _ListItem__WEBPACK_IMPORTED_MODULE_12__["default"]; +List.List = _ListList__WEBPACK_IMPORTED_MODULE_13__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (List); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/ListContent.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/ListContent.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _ListDescription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ListDescription */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListDescription.js"); +/* harmony import */ var _ListHeader__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ListHeader */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListHeader.js"); + + + + + + + +/** + * A list item can contain a content. + */ + +function ListContent(props) { + var children = props.children, + className = props.className, + content = props.content, + description = props.description, + floated = props.floated, + header = props.header, + verticalAlign = props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useVerticalAlignProp"])(verticalAlign), 'content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ListContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ListContent, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _ListHeader__WEBPACK_IMPORTED_MODULE_6__["default"].create(header), _ListDescription__WEBPACK_IMPORTED_MODULE_5__["default"].create(description), content); +} + +ListContent.handledProps = ["as", "children", "className", "content", "description", "floated", "header", "verticalAlign"]; +ListContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for ListDescription. */ + description: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** An list content can be floated left or right. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].FLOATS), + + /** Shorthand for ListHeader. */ + header: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** An element inside a list can be vertically aligned. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +ListContent.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ListContent, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ListContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/ListDescription.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/ListDescription.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A list item can contain a description. + */ + +function ListDescription(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(className, 'description'); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ListDescription, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ListDescription, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ListDescription.handledProps = ["as", "children", "className", "content"]; +ListDescription.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ListDescription.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ListDescription, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ListDescription); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/ListHeader.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/ListHeader.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A list item can contain a header. + */ + +function ListHeader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ListHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ListHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ListHeader.handledProps = ["as", "children", "className", "content"]; +ListHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ListHeader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ListHeader, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ListHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/ListIcon.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/ListIcon.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Icon_Icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Icon/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/Icon.js"); + + + + + + +/** + * A list item can contain an icon. + */ + +function ListIcon(props) { + var className = props.className, + verticalAlign = props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useVerticalAlignProp"])(verticalAlign), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ListIcon, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_Icon_Icon__WEBPACK_IMPORTED_MODULE_5__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + })); +} + +ListIcon.handledProps = ["className", "verticalAlign"]; +ListIcon.propTypes = true ? { + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** An element inside a list can be vertically aligned. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +ListIcon.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ListIcon, function (name) { + return { + name: name + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ListIcon); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/ListItem.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/ListItem.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isPlainObject */ "./node_modules/lodash-es/isPlainObject.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Image__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); +/* harmony import */ var _ListContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ListContent */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListContent.js"); +/* harmony import */ var _ListDescription__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ListDescription */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListDescription.js"); +/* harmony import */ var _ListHeader__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ListHeader */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListHeader.js"); +/* harmony import */ var _ListIcon__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ListIcon */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListIcon.js"); + + + + + + + + + + + + + +/** + * A list item can contain a set of items. + */ + +var ListItem = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(ListItem, _Component); + + function ListItem() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var disabled = _this.props.disabled; + if (!disabled) Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = ListItem.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + children = _this$props.children, + className = _this$props.className, + content = _this$props.content, + description = _this$props.description, + disabled = _this$props.disabled, + header = _this$props.header, + icon = _this$props.icon, + image = _this$props.image, + value = _this$props.value; + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(ListItem, this.props); + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(ElementType !== 'li', 'item'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(ListItem, this.props); + var valueProp = ElementType === 'li' ? { + value: value + } : { + 'data-value': value + }; + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, valueProp, { + role: "listitem", + className: classes, + onClick: this.handleClick + }, rest), children); + } + + var iconElement = _ListIcon__WEBPACK_IMPORTED_MODULE_12__["default"].create(icon, { + autoGenerateKey: false + }); + var imageElement = _Image__WEBPACK_IMPORTED_MODULE_8__["default"].create(image, { + autoGenerateKey: false + }); // See description of `content` prop for explanation about why this is necessary. + + if (! /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_6__["isValidElement"])(content) && Object(lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_2__["default"])(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, valueProp, { + role: "listitem", + className: classes, + onClick: this.handleClick + }, rest), iconElement || imageElement, _ListContent__WEBPACK_IMPORTED_MODULE_9__["default"].create(content, { + autoGenerateKey: false, + defaultProps: { + header: header, + description: description + } + })); + } + + var headerElement = _ListHeader__WEBPACK_IMPORTED_MODULE_11__["default"].create(header, { + autoGenerateKey: false + }); + var descriptionElement = _ListDescription__WEBPACK_IMPORTED_MODULE_10__["default"].create(description, { + autoGenerateKey: false + }); + + if (iconElement || imageElement) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, valueProp, { + role: "listitem", + className: classes, + onClick: this.handleClick + }, rest), iconElement || imageElement, (content || headerElement || descriptionElement) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_ListContent__WEBPACK_IMPORTED_MODULE_9__["default"], null, headerElement, descriptionElement, content)); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, valueProp, { + role: "listitem", + className: classes, + onClick: this.handleClick + }, rest), headerElement, descriptionElement, content); + }; + + return ListItem; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +ListItem.handledProps = ["active", "as", "children", "className", "content", "description", "disabled", "header", "icon", "image", "onClick", "value"]; +ListItem.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** A list item can active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** + * Shorthand for primary content. + * + * Heads up! + * + * This is handled slightly differently than the typical `content` prop since + * the wrapping ListContent is not used when there's no icon or image. + * + * If you pass content as: + * - an element/literal, it's treated as the sibling node to + * header/description (whether wrapped in Item.Content or not). + * - a props object, it forces the presence of Item.Content and passes those + * props to it. If you pass a content prop within that props object, it + * will be treated as the sibling node to header/description. + */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** Shorthand for ListDescription. */ + description: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A list item can disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand for ListHeader. */ + header: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** Shorthand for ListIcon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].disallow(['image']), _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand]), + + /** Shorthand for Image. */ + image: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].disallow(['icon']), _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand]), + + /** A ListItem can be clicked */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** A value for an ordered list. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string +} : undefined; +ListItem.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(ListItem, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ListItem); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/ListList.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/ListList.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A list can contain a sub list. + */ + +function ListList(props) { + var children = props.children, + className = props.className, + content = props.content; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ListList, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ListList, props); + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(ElementType !== 'ul' && ElementType !== 'ol', 'list'), className); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ListList.handledProps = ["as", "children", "className", "content"]; +ListList.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ListList); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/List/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/List/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _List__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./List */ "./node_modules/semantic-ui-react/dist/es/elements/List/List.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _List__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Loader/Loader.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Loader/Loader.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A loader alerts a user to wait for an activity to complete. + * @see Dimmer + */ + +function Loader(props) { + var active = props.active, + children = props.children, + className = props.className, + content = props.content, + disabled = props.disabled, + indeterminate = props.indeterminate, + inline = props.inline, + inverted = props.inverted, + size = props.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(indeterminate, 'indeterminate'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(children || content, 'text'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOrValueAndKey"])(inline, 'inline'), 'loader', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Loader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Loader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Loader.handledProps = ["active", "as", "children", "className", "content", "disabled", "indeterminate", "inline", "inverted", "size"]; +Loader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** A loader can be active or visible. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A loader can be disabled or hidden. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A loader can show it's unsure of how long a task will take. */ + indeterminate: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Loaders can appear inline with content. */ + inline: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['centered'])]), + + /** Loaders can have their colors inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Loaders can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].SIZES) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Loader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Loader/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Loader/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Loader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Loader */ "./node_modules/semantic-ui-react/dist/es/elements/Loader/Loader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Loader__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/Placeholder.js": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Placeholder/Placeholder.js ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _PlaceholderHeader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./PlaceholderHeader */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderHeader.js"); +/* harmony import */ var _PlaceholderImage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PlaceholderImage */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderImage.js"); +/* harmony import */ var _PlaceholderLine__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PlaceholderLine */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderLine.js"); +/* harmony import */ var _PlaceholderParagraph__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./PlaceholderParagraph */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderParagraph.js"); + + + + + + + + + +/** + * A placeholder is used to reserve space for content that soon will appear in a layout. + */ + +function Placeholder(props) { + var children = props.children, + className = props.className, + content = props.content, + fluid = props.fluid, + inverted = props.inverted; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(inverted, 'inverted'), 'placeholder', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Placeholder, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Placeholder, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Placeholder.handledProps = ["as", "children", "className", "content", "fluid", "inverted"]; +Placeholder.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A fluid placeholder takes up the width of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A placeholder can have their colors inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +Placeholder.Header = _PlaceholderHeader__WEBPACK_IMPORTED_MODULE_5__["default"]; +Placeholder.Image = _PlaceholderImage__WEBPACK_IMPORTED_MODULE_6__["default"]; +Placeholder.Line = _PlaceholderLine__WEBPACK_IMPORTED_MODULE_7__["default"]; +Placeholder.Paragraph = _PlaceholderParagraph__WEBPACK_IMPORTED_MODULE_8__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Placeholder); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderHeader.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderHeader.js ***! + \******************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A placeholder can contain a header. + */ + +function PlaceholderHeader(props) { + var children = props.children, + className = props.className, + content = props.content, + image = props.image; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(image, 'image'), 'header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(PlaceholderHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(PlaceholderHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +PlaceholderHeader.handledProps = ["as", "children", "className", "content", "image"]; +PlaceholderHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A placeholder can contain an image. */ + image: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (PlaceholderHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderImage.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderImage.js ***! + \*****************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A placeholder can contain an image. + */ + +function PlaceholderImage(props) { + var className = props.className, + square = props.square, + rectangular = props.rectangular; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(square, 'square'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(rectangular, 'rectangular'), 'image', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(PlaceholderImage, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(PlaceholderImage, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + })); +} + +PlaceholderImage.handledProps = ["as", "className", "rectangular", "square"]; +PlaceholderImage.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** An image can modify size correctly with responsive styles. */ + square: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['rectangular']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool]), + + /** An image can modify size correctly with responsive styles. */ + rectangular: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].disallow(['square']), prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool]) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (PlaceholderImage); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderLine.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderLine.js ***! + \****************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A placeholder can contain have lines of text. + */ + +function PlaceholderLine(props) { + var className = props.className, + length = props.length; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('line', length, className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(PlaceholderLine, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(PlaceholderLine, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + })); +} + +PlaceholderLine.handledProps = ["as", "className", "length"]; +PlaceholderLine.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** A line can specify how long its contents should appear. */ + length: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['full', 'very long', 'long', 'medium', 'short', 'very short']) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (PlaceholderLine); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderParagraph.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderParagraph.js ***! + \*********************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A placeholder can contain a paragraph. + */ + +function PlaceholderParagraph(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('paragraph', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(PlaceholderParagraph, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(PlaceholderParagraph, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +PlaceholderParagraph.handledProps = ["as", "children", "className", "content"]; +PlaceholderParagraph.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (PlaceholderParagraph); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/index.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Placeholder/index.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Placeholder__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Placeholder */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/Placeholder.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Placeholder__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Rail/Rail.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Rail/Rail.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A rail is used to show accompanying content outside the boundaries of the main view of a site. + */ + +function Rail(props) { + var attached = props.attached, + children = props.children, + className = props.className, + close = props.close, + content = props.content, + dividing = props.dividing, + internal = props.internal, + position = props.position, + size = props.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', position, size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(dividing, 'dividing'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(internal, 'internal'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOrValueAndKey"])(close, 'close'), 'rail', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Rail, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Rail, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +Rail.handledProps = ["as", "attached", "children", "className", "close", "content", "dividing", "internal", "position", "size"]; +Rail.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** A rail can appear attached to the main viewport. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A rail can appear closer to the main viewport. */ + close: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['very'])]), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A rail can create a division between itself and a container. */ + dividing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A rail can attach itself to the inside of a container. */ + internal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A rail can be presented on the left or right side of a container. */ + position: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].FLOATS).isRequired, + + /** A rail can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'medium')) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Rail); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Rail/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Rail/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Rail__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Rail */ "./node_modules/semantic-ui-react/dist/es/elements/Rail/Rail.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Rail__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/Reveal.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Reveal/Reveal.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _RevealContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RevealContent */ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/RevealContent.js"); + + + + + + +/** + * A reveal displays additional content in place of previous content when activated. + */ + +function Reveal(props) { + var active = props.active, + animated = props.animated, + children = props.children, + className = props.className, + content = props.content, + disabled = props.disabled, + instant = props.instant; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', animated, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(instant, 'instant'), 'reveal', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Reveal, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Reveal, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Reveal.handledProps = ["active", "animated", "as", "children", "className", "content", "disabled", "instant"]; +Reveal.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** An active reveal displays its hidden content. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** An animation name that will be applied to Reveal. */ + animated: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['fade', 'small fade', 'move', 'move right', 'move up', 'move down', 'rotate', 'rotate left']), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A disabled reveal will not animate when hovered. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** An element can show its content without delay. */ + instant: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +Reveal.Content = _RevealContent__WEBPACK_IMPORTED_MODULE_5__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Reveal); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/RevealContent.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Reveal/RevealContent.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A content sub-component for the Reveal. + */ + +function RevealContent(props) { + var children = props.children, + className = props.className, + content = props.content, + hidden = props.hidden, + visible = props.visible; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(hidden, 'hidden'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(visible, 'visible'), 'content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(RevealContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(RevealContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +RevealContent.handledProps = ["as", "children", "className", "content", "hidden", "visible"]; +RevealContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A reveal may contain content that is visible before interaction. */ + hidden: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A reveal may contain content that is hidden before user interaction. */ + visible: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (RevealContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Reveal/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Reveal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Reveal */ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/Reveal.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Reveal__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Segment/Segment.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Segment/Segment.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _SegmentGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./SegmentGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentGroup.js"); +/* harmony import */ var _SegmentInline__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SegmentInline */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentInline.js"); + + + + + + + + +/** + * A segment is used to create a grouping of related content. + */ + +function Segment(props) { + var attached = props.attached, + basic = props.basic, + children = props.children, + circular = props.circular, + className = props.className, + clearing = props.clearing, + color = props.color, + compact = props.compact, + content = props.content, + disabled = props.disabled, + floated = props.floated, + inverted = props.inverted, + loading = props.loading, + placeholder = props.placeholder, + padded = props.padded, + piled = props.piled, + raised = props.raised, + secondary = props.secondary, + size = props.size, + stacked = props.stacked, + tertiary = props.tertiary, + textAlign = props.textAlign, + vertical = props.vertical; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(circular, 'circular'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(clearing, 'clearing'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(placeholder, 'placeholder'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(piled, 'piled'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(raised, 'raised'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(secondary, 'secondary'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(stacked, 'stacked'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(tertiary, 'tertiary'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(vertical, 'vertical'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOrValueAndKey"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOrValueAndKey"])(padded, 'padded'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useValueAndKey"])(floated, 'floated'), 'segment', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Segment, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Segment, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +Segment.handledProps = ["as", "attached", "basic", "children", "circular", "className", "clearing", "color", "compact", "content", "disabled", "floated", "inverted", "loading", "padded", "piled", "placeholder", "raised", "secondary", "size", "stacked", "tertiary", "textAlign", "vertical"]; +Segment.Group = _SegmentGroup__WEBPACK_IMPORTED_MODULE_6__["default"]; +Segment.Inline = _SegmentInline__WEBPACK_IMPORTED_MODULE_7__["default"]; +Segment.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Attach segment to other content, like a header. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['top', 'bottom'])]), + + /** A basic segment has no special formatting. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** A segment can be circular. */ + circular: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A segment can clear floated content. */ + clearing: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Segment can be colored. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].COLORS), + + /** A segment may take up only as much space as is necessary. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A segment may show its content is disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Segment content can be floated to the left or right. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].FLOATS), + + /** A segment can have its colors inverted for contrast. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment may show its content is being loaded. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment can increase its padding. */ + padded: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['very'])]), + + /** A segment can be used to reserve space for conditionally displayed content. */ + placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Formatted to look like a pile of pages. */ + piled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment may be formatted to raise above the page. */ + raised: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment can be formatted to appear less noticeable. */ + secondary: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'medium')), + + /** Formatted to show it contains multiple pages. */ + stacked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment can be formatted to appear even less noticeable. */ + tertiary: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Formats content to be aligned as part of a vertical group. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS, 'justified')), + + /** Formats content to be aligned vertically. */ + vertical: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Segment); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentGroup.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentGroup.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A group of segments can be formatted to appear together. + */ + +function SegmentGroup(props) { + var children = props.children, + className = props.className, + compact = props.compact, + content = props.content, + horizontal = props.horizontal, + piled = props.piled, + raised = props.raised, + size = props.size, + stacked = props.stacked; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(horizontal, 'horizontal'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(piled, 'piled'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(raised, 'raised'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(stacked, 'stacked'), 'segments', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(SegmentGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(SegmentGroup, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +SegmentGroup.handledProps = ["as", "children", "className", "compact", "content", "horizontal", "piled", "raised", "size", "stacked"]; +SegmentGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A segment may take up only as much space as is necessary. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Formats content to be aligned horizontally. */ + horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Formatted to look like a pile of pages. */ + piled: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment group may be formatted to raise above the page. */ + raised: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A segment group can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'medium')), + + /** Formatted to show it contains multiple pages. */ + stacked: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SegmentGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentInline.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentInline.js ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A placeholder segment can be inline. + */ + +function SegmentInline(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('inline', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(SegmentInline, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(SegmentInline, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +SegmentInline.handledProps = ["as", "children", "className", "content"]; +SegmentInline.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SegmentInline); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Segment/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Segment/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Segment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Segment */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/Segment.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Segment__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Step/Step.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Step/Step.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Icon__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _StepContent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./StepContent */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepContent.js"); +/* harmony import */ var _StepDescription__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./StepDescription */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepDescription.js"); +/* harmony import */ var _StepGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./StepGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepGroup.js"); +/* harmony import */ var _StepTitle__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./StepTitle */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepTitle.js"); + + + + + + + + + + + + +/** + * A step shows the completion status of an activity in a series of activities. + */ + +var Step = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Step, _Component); + + function Step() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.computeElementType = function () { + var onClick = _this.props.onClick; + if (onClick) return 'a'; + }; + + _this.handleClick = function (e) { + var disabled = _this.props.disabled; + if (!disabled) Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = Step.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + children = _this$props.children, + className = _this$props.className, + completed = _this$props.completed, + content = _this$props.content, + description = _this$props.description, + disabled = _this$props.disabled, + href = _this$props.href, + icon = _this$props.icon, + link = _this$props.link, + title = _this$props.title; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(completed, 'completed'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(link, 'link'), 'step', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(Step, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(Step, this.props, this.computeElementType); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), _Icon__WEBPACK_IMPORTED_MODULE_7__["default"].create(icon, { + autoGenerateKey: false + }), _StepContent__WEBPACK_IMPORTED_MODULE_8__["default"].create({ + description: description, + title: title + }, { + autoGenerateKey: false + })); + }; + + return Step; +}(react__WEBPACK_IMPORTED_MODULE_5__["Component"]); + +Step.handledProps = ["active", "as", "children", "className", "completed", "content", "description", "disabled", "href", "icon", "link", "onClick", "ordered", "title"]; +Step.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** A step can be highlighted as active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** A step can show that a user has completed it. */ + completed: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** Shorthand for StepDescription. */ + description: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** Show that the Loader is inactive. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Render as an `a` tag instead of a `div` and adds the href attribute. */ + href: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Shorthand for Icon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand, + + /** A step can be link. */ + link: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** + * Called on click. When passed, the component will render as an `a` + * tag by default instead of a `div`. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.func, + + /** A step can show a ordered sequence of steps. Passed from StepGroup. */ + ordered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Shorthand for StepTitle. */ + title: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].itemShorthand +} : undefined; +Step.Content = _StepContent__WEBPACK_IMPORTED_MODULE_8__["default"]; +Step.Description = _StepDescription__WEBPACK_IMPORTED_MODULE_9__["default"]; +Step.Group = _StepGroup__WEBPACK_IMPORTED_MODULE_10__["default"]; +Step.Title = _StepTitle__WEBPACK_IMPORTED_MODULE_11__["default"]; +Step.create = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["createShorthandFactory"])(Step, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Step); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepContent.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Step/StepContent.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _StepDescription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./StepDescription */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepDescription.js"); +/* harmony import */ var _StepTitle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./StepTitle */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepTitle.js"); + + + + + + + +/** + * A step can contain a content. + */ + +function StepContent(props) { + var children = props.children, + className = props.className, + content = props.content, + description = props.description, + title = props.title; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(StepContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(StepContent, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _StepTitle__WEBPACK_IMPORTED_MODULE_6__["default"].create(title, { + autoGenerateKey: false + }), _StepDescription__WEBPACK_IMPORTED_MODULE_5__["default"].create(description, { + autoGenerateKey: false + })); +} + +StepContent.handledProps = ["as", "children", "className", "content", "description", "title"]; +StepContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for StepDescription. */ + description: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for StepTitle. */ + title: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +StepContent.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(StepContent, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (StepContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepDescription.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Step/StepDescription.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +function StepDescription(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('description', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(StepDescription, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(StepDescription, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +StepDescription.handledProps = ["as", "children", "className", "content"]; +StepDescription.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +StepDescription.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(StepDescription, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (StepDescription); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepGroup.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Step/StepGroup.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_values__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/values */ "./node_modules/lodash-es/values.js"); +/* harmony import */ var lodash_es_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/keys */ "./node_modules/lodash-es/keys.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_pickBy__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/pickBy */ "./node_modules/lodash-es/pickBy.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Step__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./Step */ "./node_modules/semantic-ui-react/dist/es/elements/Step/Step.js"); + + + + + + + + + + + +var numberMap = true ? Object(lodash_es_pickBy__WEBPACK_IMPORTED_MODULE_5__["default"])(_lib__WEBPACK_IMPORTED_MODULE_9__["numberToWordMap"], function (val, key) { + return key <= 8; +}) : undefined; +/** + * A set of steps. + */ + +function StepGroup(props) { + var attached = props.attached, + children = props.children, + className = props.className, + content = props.content, + fluid = props.fluid, + items = props.items, + ordered = props.ordered, + size = props.size, + stackable = props.stackable, + unstackable = props.unstackable, + vertical = props.vertical, + widths = props.widths; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_6__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(ordered, 'ordered'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(unstackable, 'unstackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(vertical, 'vertical'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOrValueAndKey"])(attached, 'attached'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useValueAndKey"])(stackable, 'stackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useWidthProp"])(widths), 'steps', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getUnhandledProps"])(StepGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getElementType"])(StepGroup, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_9__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_9__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_4__["default"])(items, function (item) { + return _Step__WEBPACK_IMPORTED_MODULE_10__["default"].create(item); + })); +} + +StepGroup.handledProps = ["as", "attached", "children", "className", "content", "fluid", "items", "ordered", "size", "stackable", "unstackable", "vertical", "widths"]; +StepGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType, + + /** Steps can be attached to other elements. */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['top', 'bottom'])]), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].contentShorthand, + + /** A fluid step takes up the width of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Shorthand array of props for Step. */ + items: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].collectionShorthand, + + /** A step can show a ordered sequence of steps. */ + ordered: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Steps can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_3__["default"])(_lib__WEBPACK_IMPORTED_MODULE_9__["SUI"].SIZES, 'medium')), + + /** A step can stack vertically only on smaller screens. */ + stackable: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['tablet']), + + /** A step can prevent itself from stacking on mobile. */ + unstackable: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** A step can be displayed stacked vertically. */ + vertical: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Steps can be divided evenly inside their parent. */ + widths: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf([].concat(Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(numberMap), Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(numberMap).map(Number), Object(lodash_es_values__WEBPACK_IMPORTED_MODULE_1__["default"])(numberMap))) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (StepGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepTitle.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Step/StepTitle.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A step can contain a title. + */ + +function StepTitle(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('title', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(StepTitle, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(StepTitle, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +StepTitle.handledProps = ["as", "children", "className", "content"]; +StepTitle.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +StepTitle.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(StepTitle, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (StepTitle); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/elements/Step/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/elements/Step/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Step__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Step */ "./node_modules/semantic-ui-react/dist/es/elements/Step/Step.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Step__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/index.js": +/*!*********************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/index.js ***! + \*********************************************************/ +/*! exports provided: Ref, Confirm, Pagination, PaginationItem, Portal, PortalInner, Radio, Select, TextArea, TransitionablePortal, Visibility, Breadcrumb, BreadcrumbDivider, BreadcrumbSection, Form, FormButton, FormCheckbox, FormDropdown, FormField, FormGroup, FormInput, FormRadio, FormSelect, FormTextArea, Grid, GridColumn, GridRow, Menu, MenuHeader, MenuItem, MenuMenu, Message, MessageContent, MessageHeader, MessageItem, MessageList, Table, TableBody, TableCell, TableFooter, TableHeader, TableHeaderCell, TableRow, Button, ButtonContent, ButtonGroup, ButtonOr, Container, Divider, Flag, Header, HeaderContent, HeaderSubheader, Icon, IconGroup, Image, ImageGroup, Input, Label, LabelDetail, LabelGroup, List, ListContent, ListDescription, ListHeader, ListIcon, ListItem, ListList, Loader, Placeholder, PlaceholderHeader, PlaceholderImage, PlaceholderLine, PlaceholderParagraph, Rail, Reveal, RevealContent, Segment, SegmentGroup, SegmentInline, Step, StepContent, StepDescription, StepGroup, StepTitle, Accordion, AccordionAccordion, AccordionContent, AccordionPanel, AccordionTitle, Checkbox, Dimmer, DimmerDimmable, DimmerInner, Dropdown, DropdownDivider, DropdownHeader, DropdownItem, DropdownMenu, DropdownSearchInput, DropdownText, Embed, Modal, ModalActions, ModalContent, ModalDescription, ModalDimmer, ModalHeader, Popup, PopupContent, PopupHeader, Progress, Rating, RatingIcon, Search, SearchCategory, SearchResult, SearchResults, Sidebar, SidebarPushable, SidebarPusher, Sticky, Tab, TabPane, Transition, TransitionGroup, Advertisement, Card, CardContent, CardDescription, CardGroup, CardHeader, CardMeta, Comment, CommentAction, CommentActions, CommentAuthor, CommentAvatar, CommentContent, CommentGroup, CommentMetadata, CommentText, Feed, FeedContent, FeedDate, FeedEvent, FeedExtra, FeedLabel, FeedLike, FeedMeta, FeedSummary, FeedUser, Item, ItemContent, ItemDescription, ItemExtra, ItemGroup, ItemHeader, ItemImage, ItemMeta, Statistic, StatisticGroup, StatisticLabel, StatisticValue */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Ref", function() { return _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_0__["Ref"]; }); + +/* harmony import */ var _addons_Confirm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addons/Confirm */ "./node_modules/semantic-ui-react/dist/es/addons/Confirm/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Confirm", function() { return _addons_Confirm__WEBPACK_IMPORTED_MODULE_1__["default"]; }); + +/* harmony import */ var _addons_Pagination__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./addons/Pagination */ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Pagination", function() { return _addons_Pagination__WEBPACK_IMPORTED_MODULE_2__["default"]; }); + +/* harmony import */ var _addons_Pagination_PaginationItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addons/Pagination/PaginationItem */ "./node_modules/semantic-ui-react/dist/es/addons/Pagination/PaginationItem.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PaginationItem", function() { return _addons_Pagination_PaginationItem__WEBPACK_IMPORTED_MODULE_3__["default"]; }); + +/* harmony import */ var _addons_Portal__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addons/Portal */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Portal", function() { return _addons_Portal__WEBPACK_IMPORTED_MODULE_4__["default"]; }); + +/* harmony import */ var _addons_Portal_PortalInner__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./addons/Portal/PortalInner */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/PortalInner.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PortalInner", function() { return _addons_Portal_PortalInner__WEBPACK_IMPORTED_MODULE_5__["default"]; }); + +/* harmony import */ var _addons_Radio__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./addons/Radio */ "./node_modules/semantic-ui-react/dist/es/addons/Radio/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Radio", function() { return _addons_Radio__WEBPACK_IMPORTED_MODULE_6__["default"]; }); + +/* harmony import */ var _addons_Select__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./addons/Select */ "./node_modules/semantic-ui-react/dist/es/addons/Select/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Select", function() { return _addons_Select__WEBPACK_IMPORTED_MODULE_7__["default"]; }); + +/* harmony import */ var _addons_TextArea__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./addons/TextArea */ "./node_modules/semantic-ui-react/dist/es/addons/TextArea/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextArea", function() { return _addons_TextArea__WEBPACK_IMPORTED_MODULE_8__["default"]; }); + +/* harmony import */ var _addons_TransitionablePortal__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./addons/TransitionablePortal */ "./node_modules/semantic-ui-react/dist/es/addons/TransitionablePortal/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransitionablePortal", function() { return _addons_TransitionablePortal__WEBPACK_IMPORTED_MODULE_9__["default"]; }); + +/* harmony import */ var _behaviors_Visibility__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./behaviors/Visibility */ "./node_modules/semantic-ui-react/dist/es/behaviors/Visibility/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Visibility", function() { return _behaviors_Visibility__WEBPACK_IMPORTED_MODULE_10__["default"]; }); + +/* harmony import */ var _collections_Breadcrumb__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./collections/Breadcrumb */ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Breadcrumb", function() { return _collections_Breadcrumb__WEBPACK_IMPORTED_MODULE_11__["default"]; }); + +/* harmony import */ var _collections_Breadcrumb_BreadcrumbDivider__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./collections/Breadcrumb/BreadcrumbDivider */ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbDivider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BreadcrumbDivider", function() { return _collections_Breadcrumb_BreadcrumbDivider__WEBPACK_IMPORTED_MODULE_12__["default"]; }); + +/* harmony import */ var _collections_Breadcrumb_BreadcrumbSection__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./collections/Breadcrumb/BreadcrumbSection */ "./node_modules/semantic-ui-react/dist/es/collections/Breadcrumb/BreadcrumbSection.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BreadcrumbSection", function() { return _collections_Breadcrumb_BreadcrumbSection__WEBPACK_IMPORTED_MODULE_13__["default"]; }); + +/* harmony import */ var _collections_Form__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./collections/Form */ "./node_modules/semantic-ui-react/dist/es/collections/Form/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Form", function() { return _collections_Form__WEBPACK_IMPORTED_MODULE_14__["default"]; }); + +/* harmony import */ var _collections_Form_FormButton__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./collections/Form/FormButton */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormButton.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormButton", function() { return _collections_Form_FormButton__WEBPACK_IMPORTED_MODULE_15__["default"]; }); + +/* harmony import */ var _collections_Form_FormCheckbox__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./collections/Form/FormCheckbox */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormCheckbox.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormCheckbox", function() { return _collections_Form_FormCheckbox__WEBPACK_IMPORTED_MODULE_16__["default"]; }); + +/* harmony import */ var _collections_Form_FormDropdown__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./collections/Form/FormDropdown */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormDropdown.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormDropdown", function() { return _collections_Form_FormDropdown__WEBPACK_IMPORTED_MODULE_17__["default"]; }); + +/* harmony import */ var _collections_Form_FormField__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./collections/Form/FormField */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormField.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormField", function() { return _collections_Form_FormField__WEBPACK_IMPORTED_MODULE_18__["default"]; }); + +/* harmony import */ var _collections_Form_FormGroup__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./collections/Form/FormGroup */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormGroup", function() { return _collections_Form_FormGroup__WEBPACK_IMPORTED_MODULE_19__["default"]; }); + +/* harmony import */ var _collections_Form_FormInput__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./collections/Form/FormInput */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormInput.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormInput", function() { return _collections_Form_FormInput__WEBPACK_IMPORTED_MODULE_20__["default"]; }); + +/* harmony import */ var _collections_Form_FormRadio__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./collections/Form/FormRadio */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormRadio.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormRadio", function() { return _collections_Form_FormRadio__WEBPACK_IMPORTED_MODULE_21__["default"]; }); + +/* harmony import */ var _collections_Form_FormSelect__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./collections/Form/FormSelect */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormSelect.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormSelect", function() { return _collections_Form_FormSelect__WEBPACK_IMPORTED_MODULE_22__["default"]; }); + +/* harmony import */ var _collections_Form_FormTextArea__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./collections/Form/FormTextArea */ "./node_modules/semantic-ui-react/dist/es/collections/Form/FormTextArea.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormTextArea", function() { return _collections_Form_FormTextArea__WEBPACK_IMPORTED_MODULE_23__["default"]; }); + +/* harmony import */ var _collections_Grid__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./collections/Grid */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Grid", function() { return _collections_Grid__WEBPACK_IMPORTED_MODULE_24__["default"]; }); + +/* harmony import */ var _collections_Grid_GridColumn__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./collections/Grid/GridColumn */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridColumn.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GridColumn", function() { return _collections_Grid_GridColumn__WEBPACK_IMPORTED_MODULE_25__["default"]; }); + +/* harmony import */ var _collections_Grid_GridRow__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./collections/Grid/GridRow */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridRow.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GridRow", function() { return _collections_Grid_GridRow__WEBPACK_IMPORTED_MODULE_26__["default"]; }); + +/* harmony import */ var _collections_Menu__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./collections/Menu */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Menu", function() { return _collections_Menu__WEBPACK_IMPORTED_MODULE_27__["default"]; }); + +/* harmony import */ var _collections_Menu_MenuHeader__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./collections/Menu/MenuHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MenuHeader", function() { return _collections_Menu_MenuHeader__WEBPACK_IMPORTED_MODULE_28__["default"]; }); + +/* harmony import */ var _collections_Menu_MenuItem__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./collections/Menu/MenuItem */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuItem.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MenuItem", function() { return _collections_Menu_MenuItem__WEBPACK_IMPORTED_MODULE_29__["default"]; }); + +/* harmony import */ var _collections_Menu_MenuMenu__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./collections/Menu/MenuMenu */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/MenuMenu.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MenuMenu", function() { return _collections_Menu_MenuMenu__WEBPACK_IMPORTED_MODULE_30__["default"]; }); + +/* harmony import */ var _collections_Message__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./collections/Message */ "./node_modules/semantic-ui-react/dist/es/collections/Message/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Message", function() { return _collections_Message__WEBPACK_IMPORTED_MODULE_31__["default"]; }); + +/* harmony import */ var _collections_Message_MessageContent__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./collections/Message/MessageContent */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageContent", function() { return _collections_Message_MessageContent__WEBPACK_IMPORTED_MODULE_32__["default"]; }); + +/* harmony import */ var _collections_Message_MessageHeader__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./collections/Message/MessageHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageHeader", function() { return _collections_Message_MessageHeader__WEBPACK_IMPORTED_MODULE_33__["default"]; }); + +/* harmony import */ var _collections_Message_MessageItem__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./collections/Message/MessageItem */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageItem.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageItem", function() { return _collections_Message_MessageItem__WEBPACK_IMPORTED_MODULE_34__["default"]; }); + +/* harmony import */ var _collections_Message_MessageList__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./collections/Message/MessageList */ "./node_modules/semantic-ui-react/dist/es/collections/Message/MessageList.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MessageList", function() { return _collections_Message_MessageList__WEBPACK_IMPORTED_MODULE_35__["default"]; }); + +/* harmony import */ var _collections_Table__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./collections/Table */ "./node_modules/semantic-ui-react/dist/es/collections/Table/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Table", function() { return _collections_Table__WEBPACK_IMPORTED_MODULE_36__["default"]; }); + +/* harmony import */ var _collections_Table_TableBody__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./collections/Table/TableBody */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableBody.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TableBody", function() { return _collections_Table_TableBody__WEBPACK_IMPORTED_MODULE_37__["default"]; }); + +/* harmony import */ var _collections_Table_TableCell__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./collections/Table/TableCell */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableCell.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TableCell", function() { return _collections_Table_TableCell__WEBPACK_IMPORTED_MODULE_38__["default"]; }); + +/* harmony import */ var _collections_Table_TableFooter__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./collections/Table/TableFooter */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableFooter.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TableFooter", function() { return _collections_Table_TableFooter__WEBPACK_IMPORTED_MODULE_39__["default"]; }); + +/* harmony import */ var _collections_Table_TableHeader__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./collections/Table/TableHeader */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TableHeader", function() { return _collections_Table_TableHeader__WEBPACK_IMPORTED_MODULE_40__["default"]; }); + +/* harmony import */ var _collections_Table_TableHeaderCell__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./collections/Table/TableHeaderCell */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableHeaderCell.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TableHeaderCell", function() { return _collections_Table_TableHeaderCell__WEBPACK_IMPORTED_MODULE_41__["default"]; }); + +/* harmony import */ var _collections_Table_TableRow__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./collections/Table/TableRow */ "./node_modules/semantic-ui-react/dist/es/collections/Table/TableRow.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TableRow", function() { return _collections_Table_TableRow__WEBPACK_IMPORTED_MODULE_42__["default"]; }); + +/* harmony import */ var _elements_Button_Button__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./elements/Button/Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/Button.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Button", function() { return _elements_Button_Button__WEBPACK_IMPORTED_MODULE_43__["default"]; }); + +/* harmony import */ var _elements_Button_ButtonContent__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./elements/Button/ButtonContent */ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ButtonContent", function() { return _elements_Button_ButtonContent__WEBPACK_IMPORTED_MODULE_44__["default"]; }); + +/* harmony import */ var _elements_Button_ButtonGroup__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./elements/Button/ButtonGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ButtonGroup", function() { return _elements_Button_ButtonGroup__WEBPACK_IMPORTED_MODULE_45__["default"]; }); + +/* harmony import */ var _elements_Button_ButtonOr__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./elements/Button/ButtonOr */ "./node_modules/semantic-ui-react/dist/es/elements/Button/ButtonOr.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ButtonOr", function() { return _elements_Button_ButtonOr__WEBPACK_IMPORTED_MODULE_46__["default"]; }); + +/* harmony import */ var _elements_Container__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./elements/Container */ "./node_modules/semantic-ui-react/dist/es/elements/Container/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Container", function() { return _elements_Container__WEBPACK_IMPORTED_MODULE_47__["default"]; }); + +/* harmony import */ var _elements_Divider__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./elements/Divider */ "./node_modules/semantic-ui-react/dist/es/elements/Divider/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Divider", function() { return _elements_Divider__WEBPACK_IMPORTED_MODULE_48__["default"]; }); + +/* harmony import */ var _elements_Flag__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./elements/Flag */ "./node_modules/semantic-ui-react/dist/es/elements/Flag/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Flag", function() { return _elements_Flag__WEBPACK_IMPORTED_MODULE_49__["default"]; }); + +/* harmony import */ var _elements_Header__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./elements/Header */ "./node_modules/semantic-ui-react/dist/es/elements/Header/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Header", function() { return _elements_Header__WEBPACK_IMPORTED_MODULE_50__["default"]; }); + +/* harmony import */ var _elements_Header_HeaderContent__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./elements/Header/HeaderContent */ "./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HeaderContent", function() { return _elements_Header_HeaderContent__WEBPACK_IMPORTED_MODULE_51__["default"]; }); + +/* harmony import */ var _elements_Header_HeaderSubheader__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./elements/Header/HeaderSubheader */ "./node_modules/semantic-ui-react/dist/es/elements/Header/HeaderSubheader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "HeaderSubheader", function() { return _elements_Header_HeaderSubheader__WEBPACK_IMPORTED_MODULE_52__["default"]; }); + +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Icon", function() { return _elements_Icon__WEBPACK_IMPORTED_MODULE_53__["default"]; }); + +/* harmony import */ var _elements_Icon_IconGroup__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! ./elements/Icon/IconGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/IconGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "IconGroup", function() { return _elements_Icon_IconGroup__WEBPACK_IMPORTED_MODULE_54__["default"]; }); + +/* harmony import */ var _elements_Image__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! ./elements/Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Image", function() { return _elements_Image__WEBPACK_IMPORTED_MODULE_55__["default"]; }); + +/* harmony import */ var _elements_Image_ImageGroup__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! ./elements/Image/ImageGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Image/ImageGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ImageGroup", function() { return _elements_Image_ImageGroup__WEBPACK_IMPORTED_MODULE_56__["default"]; }); + +/* harmony import */ var _elements_Input__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! ./elements/Input */ "./node_modules/semantic-ui-react/dist/es/elements/Input/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Input", function() { return _elements_Input__WEBPACK_IMPORTED_MODULE_57__["default"]; }); + +/* harmony import */ var _elements_Label__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! ./elements/Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Label", function() { return _elements_Label__WEBPACK_IMPORTED_MODULE_58__["default"]; }); + +/* harmony import */ var _elements_Label_LabelDetail__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./elements/Label/LabelDetail */ "./node_modules/semantic-ui-react/dist/es/elements/Label/LabelDetail.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LabelDetail", function() { return _elements_Label_LabelDetail__WEBPACK_IMPORTED_MODULE_59__["default"]; }); + +/* harmony import */ var _elements_Label_LabelGroup__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./elements/Label/LabelGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Label/LabelGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LabelGroup", function() { return _elements_Label_LabelGroup__WEBPACK_IMPORTED_MODULE_60__["default"]; }); + +/* harmony import */ var _elements_List__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! ./elements/List */ "./node_modules/semantic-ui-react/dist/es/elements/List/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "List", function() { return _elements_List__WEBPACK_IMPORTED_MODULE_61__["default"]; }); + +/* harmony import */ var _elements_List_ListContent__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./elements/List/ListContent */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ListContent", function() { return _elements_List_ListContent__WEBPACK_IMPORTED_MODULE_62__["default"]; }); + +/* harmony import */ var _elements_List_ListDescription__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./elements/List/ListDescription */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListDescription.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ListDescription", function() { return _elements_List_ListDescription__WEBPACK_IMPORTED_MODULE_63__["default"]; }); + +/* harmony import */ var _elements_List_ListHeader__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./elements/List/ListHeader */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ListHeader", function() { return _elements_List_ListHeader__WEBPACK_IMPORTED_MODULE_64__["default"]; }); + +/* harmony import */ var _elements_List_ListIcon__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./elements/List/ListIcon */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListIcon.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ListIcon", function() { return _elements_List_ListIcon__WEBPACK_IMPORTED_MODULE_65__["default"]; }); + +/* harmony import */ var _elements_List_ListItem__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! ./elements/List/ListItem */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListItem.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ListItem", function() { return _elements_List_ListItem__WEBPACK_IMPORTED_MODULE_66__["default"]; }); + +/* harmony import */ var _elements_List_ListList__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! ./elements/List/ListList */ "./node_modules/semantic-ui-react/dist/es/elements/List/ListList.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ListList", function() { return _elements_List_ListList__WEBPACK_IMPORTED_MODULE_67__["default"]; }); + +/* harmony import */ var _elements_Loader__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(/*! ./elements/Loader */ "./node_modules/semantic-ui-react/dist/es/elements/Loader/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Loader", function() { return _elements_Loader__WEBPACK_IMPORTED_MODULE_68__["default"]; }); + +/* harmony import */ var _elements_Placeholder__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(/*! ./elements/Placeholder */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Placeholder", function() { return _elements_Placeholder__WEBPACK_IMPORTED_MODULE_69__["default"]; }); + +/* harmony import */ var _elements_Placeholder_PlaceholderHeader__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(/*! ./elements/Placeholder/PlaceholderHeader */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PlaceholderHeader", function() { return _elements_Placeholder_PlaceholderHeader__WEBPACK_IMPORTED_MODULE_70__["default"]; }); + +/* harmony import */ var _elements_Placeholder_PlaceholderImage__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(/*! ./elements/Placeholder/PlaceholderImage */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderImage.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PlaceholderImage", function() { return _elements_Placeholder_PlaceholderImage__WEBPACK_IMPORTED_MODULE_71__["default"]; }); + +/* harmony import */ var _elements_Placeholder_PlaceholderLine__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(/*! ./elements/Placeholder/PlaceholderLine */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderLine.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PlaceholderLine", function() { return _elements_Placeholder_PlaceholderLine__WEBPACK_IMPORTED_MODULE_72__["default"]; }); + +/* harmony import */ var _elements_Placeholder_PlaceholderParagraph__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(/*! ./elements/Placeholder/PlaceholderParagraph */ "./node_modules/semantic-ui-react/dist/es/elements/Placeholder/PlaceholderParagraph.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PlaceholderParagraph", function() { return _elements_Placeholder_PlaceholderParagraph__WEBPACK_IMPORTED_MODULE_73__["default"]; }); + +/* harmony import */ var _elements_Rail__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(/*! ./elements/Rail */ "./node_modules/semantic-ui-react/dist/es/elements/Rail/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Rail", function() { return _elements_Rail__WEBPACK_IMPORTED_MODULE_74__["default"]; }); + +/* harmony import */ var _elements_Reveal__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(/*! ./elements/Reveal */ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Reveal", function() { return _elements_Reveal__WEBPACK_IMPORTED_MODULE_75__["default"]; }); + +/* harmony import */ var _elements_Reveal_RevealContent__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(/*! ./elements/Reveal/RevealContent */ "./node_modules/semantic-ui-react/dist/es/elements/Reveal/RevealContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RevealContent", function() { return _elements_Reveal_RevealContent__WEBPACK_IMPORTED_MODULE_76__["default"]; }); + +/* harmony import */ var _elements_Segment__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(/*! ./elements/Segment */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Segment", function() { return _elements_Segment__WEBPACK_IMPORTED_MODULE_77__["default"]; }); + +/* harmony import */ var _elements_Segment_SegmentGroup__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(/*! ./elements/Segment/SegmentGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SegmentGroup", function() { return _elements_Segment_SegmentGroup__WEBPACK_IMPORTED_MODULE_78__["default"]; }); + +/* harmony import */ var _elements_Segment_SegmentInline__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(/*! ./elements/Segment/SegmentInline */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/SegmentInline.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SegmentInline", function() { return _elements_Segment_SegmentInline__WEBPACK_IMPORTED_MODULE_79__["default"]; }); + +/* harmony import */ var _elements_Step__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(/*! ./elements/Step */ "./node_modules/semantic-ui-react/dist/es/elements/Step/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Step", function() { return _elements_Step__WEBPACK_IMPORTED_MODULE_80__["default"]; }); + +/* harmony import */ var _elements_Step_StepContent__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(/*! ./elements/Step/StepContent */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StepContent", function() { return _elements_Step_StepContent__WEBPACK_IMPORTED_MODULE_81__["default"]; }); + +/* harmony import */ var _elements_Step_StepDescription__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(/*! ./elements/Step/StepDescription */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepDescription.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StepDescription", function() { return _elements_Step_StepDescription__WEBPACK_IMPORTED_MODULE_82__["default"]; }); + +/* harmony import */ var _elements_Step_StepGroup__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(/*! ./elements/Step/StepGroup */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StepGroup", function() { return _elements_Step_StepGroup__WEBPACK_IMPORTED_MODULE_83__["default"]; }); + +/* harmony import */ var _elements_Step_StepTitle__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(/*! ./elements/Step/StepTitle */ "./node_modules/semantic-ui-react/dist/es/elements/Step/StepTitle.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StepTitle", function() { return _elements_Step_StepTitle__WEBPACK_IMPORTED_MODULE_84__["default"]; }); + +/* harmony import */ var _modules_Accordion_Accordion__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(/*! ./modules/Accordion/Accordion */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/Accordion.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Accordion", function() { return _modules_Accordion_Accordion__WEBPACK_IMPORTED_MODULE_85__["default"]; }); + +/* harmony import */ var _modules_Accordion_AccordionAccordion__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(/*! ./modules/Accordion/AccordionAccordion */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionAccordion.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AccordionAccordion", function() { return _modules_Accordion_AccordionAccordion__WEBPACK_IMPORTED_MODULE_86__["default"]; }); + +/* harmony import */ var _modules_Accordion_AccordionContent__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(/*! ./modules/Accordion/AccordionContent */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AccordionContent", function() { return _modules_Accordion_AccordionContent__WEBPACK_IMPORTED_MODULE_87__["default"]; }); + +/* harmony import */ var _modules_Accordion_AccordionPanel__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(/*! ./modules/Accordion/AccordionPanel */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionPanel.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AccordionPanel", function() { return _modules_Accordion_AccordionPanel__WEBPACK_IMPORTED_MODULE_88__["default"]; }); + +/* harmony import */ var _modules_Accordion_AccordionTitle__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(/*! ./modules/Accordion/AccordionTitle */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionTitle.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AccordionTitle", function() { return _modules_Accordion_AccordionTitle__WEBPACK_IMPORTED_MODULE_89__["default"]; }); + +/* harmony import */ var _modules_Checkbox__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(/*! ./modules/Checkbox */ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Checkbox", function() { return _modules_Checkbox__WEBPACK_IMPORTED_MODULE_90__["default"]; }); + +/* harmony import */ var _modules_Dimmer__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(/*! ./modules/Dimmer */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dimmer", function() { return _modules_Dimmer__WEBPACK_IMPORTED_MODULE_91__["default"]; }); + +/* harmony import */ var _modules_Dimmer_DimmerDimmable__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(/*! ./modules/Dimmer/DimmerDimmable */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerDimmable.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DimmerDimmable", function() { return _modules_Dimmer_DimmerDimmable__WEBPACK_IMPORTED_MODULE_92__["default"]; }); + +/* harmony import */ var _modules_Dimmer_DimmerInner__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(/*! ./modules/Dimmer/DimmerInner */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerInner.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DimmerInner", function() { return _modules_Dimmer_DimmerInner__WEBPACK_IMPORTED_MODULE_93__["default"]; }); + +/* harmony import */ var _modules_Dropdown__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(/*! ./modules/Dropdown */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Dropdown", function() { return _modules_Dropdown__WEBPACK_IMPORTED_MODULE_94__["default"]; }); + +/* harmony import */ var _modules_Dropdown_DropdownDivider__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(/*! ./modules/Dropdown/DropdownDivider */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownDivider.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DropdownDivider", function() { return _modules_Dropdown_DropdownDivider__WEBPACK_IMPORTED_MODULE_95__["default"]; }); + +/* harmony import */ var _modules_Dropdown_DropdownHeader__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(/*! ./modules/Dropdown/DropdownHeader */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DropdownHeader", function() { return _modules_Dropdown_DropdownHeader__WEBPACK_IMPORTED_MODULE_96__["default"]; }); + +/* harmony import */ var _modules_Dropdown_DropdownItem__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(/*! ./modules/Dropdown/DropdownItem */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownItem.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DropdownItem", function() { return _modules_Dropdown_DropdownItem__WEBPACK_IMPORTED_MODULE_97__["default"]; }); + +/* harmony import */ var _modules_Dropdown_DropdownMenu__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(/*! ./modules/Dropdown/DropdownMenu */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownMenu.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DropdownMenu", function() { return _modules_Dropdown_DropdownMenu__WEBPACK_IMPORTED_MODULE_98__["default"]; }); + +/* harmony import */ var _modules_Dropdown_DropdownSearchInput__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(/*! ./modules/Dropdown/DropdownSearchInput */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownSearchInput.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DropdownSearchInput", function() { return _modules_Dropdown_DropdownSearchInput__WEBPACK_IMPORTED_MODULE_99__["default"]; }); + +/* harmony import */ var _modules_Dropdown_DropdownText__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(/*! ./modules/Dropdown/DropdownText */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownText.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DropdownText", function() { return _modules_Dropdown_DropdownText__WEBPACK_IMPORTED_MODULE_100__["default"]; }); + +/* harmony import */ var _modules_Embed__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(/*! ./modules/Embed */ "./node_modules/semantic-ui-react/dist/es/modules/Embed/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Embed", function() { return _modules_Embed__WEBPACK_IMPORTED_MODULE_101__["default"]; }); + +/* harmony import */ var _modules_Modal__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(/*! ./modules/Modal */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Modal", function() { return _modules_Modal__WEBPACK_IMPORTED_MODULE_102__["default"]; }); + +/* harmony import */ var _modules_Modal_ModalActions__WEBPACK_IMPORTED_MODULE_103__ = __webpack_require__(/*! ./modules/Modal/ModalActions */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalActions.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ModalActions", function() { return _modules_Modal_ModalActions__WEBPACK_IMPORTED_MODULE_103__["default"]; }); + +/* harmony import */ var _modules_Modal_ModalContent__WEBPACK_IMPORTED_MODULE_104__ = __webpack_require__(/*! ./modules/Modal/ModalContent */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ModalContent", function() { return _modules_Modal_ModalContent__WEBPACK_IMPORTED_MODULE_104__["default"]; }); + +/* harmony import */ var _modules_Modal_ModalDescription__WEBPACK_IMPORTED_MODULE_105__ = __webpack_require__(/*! ./modules/Modal/ModalDescription */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDescription.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ModalDescription", function() { return _modules_Modal_ModalDescription__WEBPACK_IMPORTED_MODULE_105__["default"]; }); + +/* harmony import */ var _modules_Modal_ModalDimmer__WEBPACK_IMPORTED_MODULE_106__ = __webpack_require__(/*! ./modules/Modal/ModalDimmer */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDimmer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ModalDimmer", function() { return _modules_Modal_ModalDimmer__WEBPACK_IMPORTED_MODULE_106__["default"]; }); + +/* harmony import */ var _modules_Modal_ModalHeader__WEBPACK_IMPORTED_MODULE_107__ = __webpack_require__(/*! ./modules/Modal/ModalHeader */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ModalHeader", function() { return _modules_Modal_ModalHeader__WEBPACK_IMPORTED_MODULE_107__["default"]; }); + +/* harmony import */ var _modules_Popup__WEBPACK_IMPORTED_MODULE_108__ = __webpack_require__(/*! ./modules/Popup */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Popup", function() { return _modules_Popup__WEBPACK_IMPORTED_MODULE_108__["default"]; }); + +/* harmony import */ var _modules_Popup_PopupContent__WEBPACK_IMPORTED_MODULE_109__ = __webpack_require__(/*! ./modules/Popup/PopupContent */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PopupContent", function() { return _modules_Popup_PopupContent__WEBPACK_IMPORTED_MODULE_109__["default"]; }); + +/* harmony import */ var _modules_Popup_PopupHeader__WEBPACK_IMPORTED_MODULE_110__ = __webpack_require__(/*! ./modules/Popup/PopupHeader */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PopupHeader", function() { return _modules_Popup_PopupHeader__WEBPACK_IMPORTED_MODULE_110__["default"]; }); + +/* harmony import */ var _modules_Progress__WEBPACK_IMPORTED_MODULE_111__ = __webpack_require__(/*! ./modules/Progress */ "./node_modules/semantic-ui-react/dist/es/modules/Progress/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Progress", function() { return _modules_Progress__WEBPACK_IMPORTED_MODULE_111__["default"]; }); + +/* harmony import */ var _modules_Rating__WEBPACK_IMPORTED_MODULE_112__ = __webpack_require__(/*! ./modules/Rating */ "./node_modules/semantic-ui-react/dist/es/modules/Rating/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Rating", function() { return _modules_Rating__WEBPACK_IMPORTED_MODULE_112__["default"]; }); + +/* harmony import */ var _modules_Rating_RatingIcon__WEBPACK_IMPORTED_MODULE_113__ = __webpack_require__(/*! ./modules/Rating/RatingIcon */ "./node_modules/semantic-ui-react/dist/es/modules/Rating/RatingIcon.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RatingIcon", function() { return _modules_Rating_RatingIcon__WEBPACK_IMPORTED_MODULE_113__["default"]; }); + +/* harmony import */ var _modules_Search__WEBPACK_IMPORTED_MODULE_114__ = __webpack_require__(/*! ./modules/Search */ "./node_modules/semantic-ui-react/dist/es/modules/Search/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Search", function() { return _modules_Search__WEBPACK_IMPORTED_MODULE_114__["default"]; }); + +/* harmony import */ var _modules_Search_SearchCategory__WEBPACK_IMPORTED_MODULE_115__ = __webpack_require__(/*! ./modules/Search/SearchCategory */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategory.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SearchCategory", function() { return _modules_Search_SearchCategory__WEBPACK_IMPORTED_MODULE_115__["default"]; }); + +/* harmony import */ var _modules_Search_SearchResult__WEBPACK_IMPORTED_MODULE_116__ = __webpack_require__(/*! ./modules/Search/SearchResult */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResult.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SearchResult", function() { return _modules_Search_SearchResult__WEBPACK_IMPORTED_MODULE_116__["default"]; }); + +/* harmony import */ var _modules_Search_SearchResults__WEBPACK_IMPORTED_MODULE_117__ = __webpack_require__(/*! ./modules/Search/SearchResults */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResults.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SearchResults", function() { return _modules_Search_SearchResults__WEBPACK_IMPORTED_MODULE_117__["default"]; }); + +/* harmony import */ var _modules_Sidebar__WEBPACK_IMPORTED_MODULE_118__ = __webpack_require__(/*! ./modules/Sidebar */ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sidebar", function() { return _modules_Sidebar__WEBPACK_IMPORTED_MODULE_118__["default"]; }); + +/* harmony import */ var _modules_Sidebar_SidebarPushable__WEBPACK_IMPORTED_MODULE_119__ = __webpack_require__(/*! ./modules/Sidebar/SidebarPushable */ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPushable.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SidebarPushable", function() { return _modules_Sidebar_SidebarPushable__WEBPACK_IMPORTED_MODULE_119__["default"]; }); + +/* harmony import */ var _modules_Sidebar_SidebarPusher__WEBPACK_IMPORTED_MODULE_120__ = __webpack_require__(/*! ./modules/Sidebar/SidebarPusher */ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPusher.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SidebarPusher", function() { return _modules_Sidebar_SidebarPusher__WEBPACK_IMPORTED_MODULE_120__["default"]; }); + +/* harmony import */ var _modules_Sticky__WEBPACK_IMPORTED_MODULE_121__ = __webpack_require__(/*! ./modules/Sticky */ "./node_modules/semantic-ui-react/dist/es/modules/Sticky/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Sticky", function() { return _modules_Sticky__WEBPACK_IMPORTED_MODULE_121__["default"]; }); + +/* harmony import */ var _modules_Tab__WEBPACK_IMPORTED_MODULE_122__ = __webpack_require__(/*! ./modules/Tab */ "./node_modules/semantic-ui-react/dist/es/modules/Tab/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Tab", function() { return _modules_Tab__WEBPACK_IMPORTED_MODULE_122__["default"]; }); + +/* harmony import */ var _modules_Tab_TabPane__WEBPACK_IMPORTED_MODULE_123__ = __webpack_require__(/*! ./modules/Tab/TabPane */ "./node_modules/semantic-ui-react/dist/es/modules/Tab/TabPane.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TabPane", function() { return _modules_Tab_TabPane__WEBPACK_IMPORTED_MODULE_123__["default"]; }); + +/* harmony import */ var _modules_Transition__WEBPACK_IMPORTED_MODULE_124__ = __webpack_require__(/*! ./modules/Transition */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Transition", function() { return _modules_Transition__WEBPACK_IMPORTED_MODULE_124__["default"]; }); + +/* harmony import */ var _modules_Transition_TransitionGroup__WEBPACK_IMPORTED_MODULE_125__ = __webpack_require__(/*! ./modules/Transition/TransitionGroup */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/TransitionGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TransitionGroup", function() { return _modules_Transition_TransitionGroup__WEBPACK_IMPORTED_MODULE_125__["default"]; }); + +/* harmony import */ var _views_Advertisement__WEBPACK_IMPORTED_MODULE_126__ = __webpack_require__(/*! ./views/Advertisement */ "./node_modules/semantic-ui-react/dist/es/views/Advertisement/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Advertisement", function() { return _views_Advertisement__WEBPACK_IMPORTED_MODULE_126__["default"]; }); + +/* harmony import */ var _views_Card_Card__WEBPACK_IMPORTED_MODULE_127__ = __webpack_require__(/*! ./views/Card/Card */ "./node_modules/semantic-ui-react/dist/es/views/Card/Card.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Card", function() { return _views_Card_Card__WEBPACK_IMPORTED_MODULE_127__["default"]; }); + +/* harmony import */ var _views_Card_CardContent__WEBPACK_IMPORTED_MODULE_128__ = __webpack_require__(/*! ./views/Card/CardContent */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CardContent", function() { return _views_Card_CardContent__WEBPACK_IMPORTED_MODULE_128__["default"]; }); + +/* harmony import */ var _views_Card_CardDescription__WEBPACK_IMPORTED_MODULE_129__ = __webpack_require__(/*! ./views/Card/CardDescription */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardDescription.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CardDescription", function() { return _views_Card_CardDescription__WEBPACK_IMPORTED_MODULE_129__["default"]; }); + +/* harmony import */ var _views_Card_CardGroup__WEBPACK_IMPORTED_MODULE_130__ = __webpack_require__(/*! ./views/Card/CardGroup */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CardGroup", function() { return _views_Card_CardGroup__WEBPACK_IMPORTED_MODULE_130__["default"]; }); + +/* harmony import */ var _views_Card_CardHeader__WEBPACK_IMPORTED_MODULE_131__ = __webpack_require__(/*! ./views/Card/CardHeader */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CardHeader", function() { return _views_Card_CardHeader__WEBPACK_IMPORTED_MODULE_131__["default"]; }); + +/* harmony import */ var _views_Card_CardMeta__WEBPACK_IMPORTED_MODULE_132__ = __webpack_require__(/*! ./views/Card/CardMeta */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardMeta.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CardMeta", function() { return _views_Card_CardMeta__WEBPACK_IMPORTED_MODULE_132__["default"]; }); + +/* harmony import */ var _views_Comment__WEBPACK_IMPORTED_MODULE_133__ = __webpack_require__(/*! ./views/Comment */ "./node_modules/semantic-ui-react/dist/es/views/Comment/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Comment", function() { return _views_Comment__WEBPACK_IMPORTED_MODULE_133__["default"]; }); + +/* harmony import */ var _views_Comment_CommentAction__WEBPACK_IMPORTED_MODULE_134__ = __webpack_require__(/*! ./views/Comment/CommentAction */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAction.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentAction", function() { return _views_Comment_CommentAction__WEBPACK_IMPORTED_MODULE_134__["default"]; }); + +/* harmony import */ var _views_Comment_CommentActions__WEBPACK_IMPORTED_MODULE_135__ = __webpack_require__(/*! ./views/Comment/CommentActions */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentActions.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentActions", function() { return _views_Comment_CommentActions__WEBPACK_IMPORTED_MODULE_135__["default"]; }); + +/* harmony import */ var _views_Comment_CommentAuthor__WEBPACK_IMPORTED_MODULE_136__ = __webpack_require__(/*! ./views/Comment/CommentAuthor */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAuthor.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentAuthor", function() { return _views_Comment_CommentAuthor__WEBPACK_IMPORTED_MODULE_136__["default"]; }); + +/* harmony import */ var _views_Comment_CommentAvatar__WEBPACK_IMPORTED_MODULE_137__ = __webpack_require__(/*! ./views/Comment/CommentAvatar */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAvatar.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentAvatar", function() { return _views_Comment_CommentAvatar__WEBPACK_IMPORTED_MODULE_137__["default"]; }); + +/* harmony import */ var _views_Comment_CommentContent__WEBPACK_IMPORTED_MODULE_138__ = __webpack_require__(/*! ./views/Comment/CommentContent */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentContent", function() { return _views_Comment_CommentContent__WEBPACK_IMPORTED_MODULE_138__["default"]; }); + +/* harmony import */ var _views_Comment_CommentGroup__WEBPACK_IMPORTED_MODULE_139__ = __webpack_require__(/*! ./views/Comment/CommentGroup */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentGroup", function() { return _views_Comment_CommentGroup__WEBPACK_IMPORTED_MODULE_139__["default"]; }); + +/* harmony import */ var _views_Comment_CommentMetadata__WEBPACK_IMPORTED_MODULE_140__ = __webpack_require__(/*! ./views/Comment/CommentMetadata */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentMetadata.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentMetadata", function() { return _views_Comment_CommentMetadata__WEBPACK_IMPORTED_MODULE_140__["default"]; }); + +/* harmony import */ var _views_Comment_CommentText__WEBPACK_IMPORTED_MODULE_141__ = __webpack_require__(/*! ./views/Comment/CommentText */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentText.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CommentText", function() { return _views_Comment_CommentText__WEBPACK_IMPORTED_MODULE_141__["default"]; }); + +/* harmony import */ var _views_Feed__WEBPACK_IMPORTED_MODULE_142__ = __webpack_require__(/*! ./views/Feed */ "./node_modules/semantic-ui-react/dist/es/views/Feed/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Feed", function() { return _views_Feed__WEBPACK_IMPORTED_MODULE_142__["default"]; }); + +/* harmony import */ var _views_Feed_FeedContent__WEBPACK_IMPORTED_MODULE_143__ = __webpack_require__(/*! ./views/Feed/FeedContent */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedContent", function() { return _views_Feed_FeedContent__WEBPACK_IMPORTED_MODULE_143__["default"]; }); + +/* harmony import */ var _views_Feed_FeedDate__WEBPACK_IMPORTED_MODULE_144__ = __webpack_require__(/*! ./views/Feed/FeedDate */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedDate.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedDate", function() { return _views_Feed_FeedDate__WEBPACK_IMPORTED_MODULE_144__["default"]; }); + +/* harmony import */ var _views_Feed_FeedEvent__WEBPACK_IMPORTED_MODULE_145__ = __webpack_require__(/*! ./views/Feed/FeedEvent */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedEvent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedEvent", function() { return _views_Feed_FeedEvent__WEBPACK_IMPORTED_MODULE_145__["default"]; }); + +/* harmony import */ var _views_Feed_FeedExtra__WEBPACK_IMPORTED_MODULE_146__ = __webpack_require__(/*! ./views/Feed/FeedExtra */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedExtra.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedExtra", function() { return _views_Feed_FeedExtra__WEBPACK_IMPORTED_MODULE_146__["default"]; }); + +/* harmony import */ var _views_Feed_FeedLabel__WEBPACK_IMPORTED_MODULE_147__ = __webpack_require__(/*! ./views/Feed/FeedLabel */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLabel.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedLabel", function() { return _views_Feed_FeedLabel__WEBPACK_IMPORTED_MODULE_147__["default"]; }); + +/* harmony import */ var _views_Feed_FeedLike__WEBPACK_IMPORTED_MODULE_148__ = __webpack_require__(/*! ./views/Feed/FeedLike */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLike.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedLike", function() { return _views_Feed_FeedLike__WEBPACK_IMPORTED_MODULE_148__["default"]; }); + +/* harmony import */ var _views_Feed_FeedMeta__WEBPACK_IMPORTED_MODULE_149__ = __webpack_require__(/*! ./views/Feed/FeedMeta */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedMeta.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedMeta", function() { return _views_Feed_FeedMeta__WEBPACK_IMPORTED_MODULE_149__["default"]; }); + +/* harmony import */ var _views_Feed_FeedSummary__WEBPACK_IMPORTED_MODULE_150__ = __webpack_require__(/*! ./views/Feed/FeedSummary */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedSummary.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedSummary", function() { return _views_Feed_FeedSummary__WEBPACK_IMPORTED_MODULE_150__["default"]; }); + +/* harmony import */ var _views_Feed_FeedUser__WEBPACK_IMPORTED_MODULE_151__ = __webpack_require__(/*! ./views/Feed/FeedUser */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedUser.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FeedUser", function() { return _views_Feed_FeedUser__WEBPACK_IMPORTED_MODULE_151__["default"]; }); + +/* harmony import */ var _views_Item__WEBPACK_IMPORTED_MODULE_152__ = __webpack_require__(/*! ./views/Item */ "./node_modules/semantic-ui-react/dist/es/views/Item/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Item", function() { return _views_Item__WEBPACK_IMPORTED_MODULE_152__["default"]; }); + +/* harmony import */ var _views_Item_ItemContent__WEBPACK_IMPORTED_MODULE_153__ = __webpack_require__(/*! ./views/Item/ItemContent */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemContent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemContent", function() { return _views_Item_ItemContent__WEBPACK_IMPORTED_MODULE_153__["default"]; }); + +/* harmony import */ var _views_Item_ItemDescription__WEBPACK_IMPORTED_MODULE_154__ = __webpack_require__(/*! ./views/Item/ItemDescription */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemDescription.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemDescription", function() { return _views_Item_ItemDescription__WEBPACK_IMPORTED_MODULE_154__["default"]; }); + +/* harmony import */ var _views_Item_ItemExtra__WEBPACK_IMPORTED_MODULE_155__ = __webpack_require__(/*! ./views/Item/ItemExtra */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemExtra.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemExtra", function() { return _views_Item_ItemExtra__WEBPACK_IMPORTED_MODULE_155__["default"]; }); + +/* harmony import */ var _views_Item_ItemGroup__WEBPACK_IMPORTED_MODULE_156__ = __webpack_require__(/*! ./views/Item/ItemGroup */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemGroup", function() { return _views_Item_ItemGroup__WEBPACK_IMPORTED_MODULE_156__["default"]; }); + +/* harmony import */ var _views_Item_ItemHeader__WEBPACK_IMPORTED_MODULE_157__ = __webpack_require__(/*! ./views/Item/ItemHeader */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemHeader.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemHeader", function() { return _views_Item_ItemHeader__WEBPACK_IMPORTED_MODULE_157__["default"]; }); + +/* harmony import */ var _views_Item_ItemImage__WEBPACK_IMPORTED_MODULE_158__ = __webpack_require__(/*! ./views/Item/ItemImage */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemImage.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemImage", function() { return _views_Item_ItemImage__WEBPACK_IMPORTED_MODULE_158__["default"]; }); + +/* harmony import */ var _views_Item_ItemMeta__WEBPACK_IMPORTED_MODULE_159__ = __webpack_require__(/*! ./views/Item/ItemMeta */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemMeta.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ItemMeta", function() { return _views_Item_ItemMeta__WEBPACK_IMPORTED_MODULE_159__["default"]; }); + +/* harmony import */ var _views_Statistic__WEBPACK_IMPORTED_MODULE_160__ = __webpack_require__(/*! ./views/Statistic */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Statistic", function() { return _views_Statistic__WEBPACK_IMPORTED_MODULE_160__["default"]; }); + +/* harmony import */ var _views_Statistic_StatisticGroup__WEBPACK_IMPORTED_MODULE_161__ = __webpack_require__(/*! ./views/Statistic/StatisticGroup */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticGroup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StatisticGroup", function() { return _views_Statistic_StatisticGroup__WEBPACK_IMPORTED_MODULE_161__["default"]; }); + +/* harmony import */ var _views_Statistic_StatisticLabel__WEBPACK_IMPORTED_MODULE_162__ = __webpack_require__(/*! ./views/Statistic/StatisticLabel */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticLabel.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StatisticLabel", function() { return _views_Statistic_StatisticLabel__WEBPACK_IMPORTED_MODULE_162__["default"]; }); + +/* harmony import */ var _views_Statistic_StatisticValue__WEBPACK_IMPORTED_MODULE_163__ = __webpack_require__(/*! ./views/Statistic/StatisticValue */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticValue.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StatisticValue", function() { return _views_Statistic_StatisticValue__WEBPACK_IMPORTED_MODULE_163__["default"]; }); + +// Third party + // Addons + + + + + + + + + + + + + + + + + + + // Behaviors + + + // Collections + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // Elements + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // Modules + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // Views + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/ModernAutoControlledComponent.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/ModernAutoControlledComponent.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 ModernAutoControlledComponent; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/assertThisInitialized */ "./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var lodash_es_startsWith__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/startsWith */ "./node_modules/lodash-es/startsWith.js"); +/* harmony import */ var lodash_es_filter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/filter */ "./node_modules/lodash-es/filter.js"); +/* harmony import */ var lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isEmpty */ "./node_modules/lodash-es/isEmpty.js"); +/* harmony import */ var lodash_es_keys__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/keys */ "./node_modules/lodash-es/keys.js"); +/* harmony import */ var lodash_es_intersection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es/intersection */ "./node_modules/lodash-es/intersection.js"); +/* harmony import */ var lodash_es_has__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash-es/has */ "./node_modules/lodash-es/has.js"); +/* harmony import */ var lodash_es_each__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lodash-es/each */ "./node_modules/lodash-es/each.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_12__); + + + + + + + + + + + + + + +var getDefaultPropName = function getDefaultPropName(prop) { + return "default" + (prop[0].toUpperCase() + prop.slice(1)); +}; +/** + * Return the auto controlled state value for a give prop. The initial value is chosen in this order: + * - regular props + * - then, default props + * - then, initial state + * - then, `checked` defaults to false + * - then, `value` defaults to '' or [] if props.multiple + * - else, undefined + * + * @param {string} propName A prop name + * @param {object} [props] A props object + * @param {object} [state] A state object + * @param {boolean} [includeDefaults=false] Whether or not to heed the default props or initial state + */ + + +var getAutoControlledStateValue = function getAutoControlledStateValue(propName, props, state, includeDefaults) { + if (includeDefaults === void 0) { + includeDefaults = false; + } + + // regular props + var propValue = props[propName]; + if (propValue !== undefined) return propValue; + + if (includeDefaults) { + // defaultProps + var defaultProp = props[getDefaultPropName(propName)]; + if (defaultProp !== undefined) return defaultProp; // initial state - state may be null or undefined + + if (state) { + var initialState = state[propName]; + if (initialState !== undefined) return initialState; + } + } // React doesn't allow changing from uncontrolled to controlled components, + // default checked/value if they were not present. + + + if (propName === 'checked') return false; + if (propName === 'value') return props.multiple ? [] : ''; // otherwise, undefined +}; + +var ModernAutoControlledComponent = /*#__PURE__*/function (_React$Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__["default"])(ModernAutoControlledComponent, _React$Component); + + function ModernAutoControlledComponent() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this; + var _this$constructor = _this.constructor, + autoControlledProps = _this$constructor.autoControlledProps, + getAutoControlledStateFromProps = _this$constructor.getAutoControlledStateFromProps; + var state = Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_11__["default"])(Object(_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__["default"])(_this), 'getInitialAutoControlledState', _this.props) || {}; + + if (true) { + var _this$constructor2 = _this.constructor, + defaultProps = _this$constructor2.defaultProps, + name = _this$constructor2.name, + propTypes = _this$constructor2.propTypes, + getDerivedStateFromProps = _this$constructor2.getDerivedStateFromProps; // require usage of getAutoControlledStateFromProps() + + if (getDerivedStateFromProps !== ModernAutoControlledComponent.getDerivedStateFromProps) { + /* eslint-disable-next-line no-console */ + console.error("Auto controlled " + name + " must specify a static getAutoControlledStateFromProps() instead of getDerivedStateFromProps()."); + } // require propTypes + + + Object(lodash_es_each__WEBPACK_IMPORTED_MODULE_10__["default"])(autoControlledProps, function (prop) { + var defaultProp = getDefaultPropName(prop); // regular prop + + if (!Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_9__["default"])(propTypes, defaultProp)) { + console.error(name + " is missing \"" + defaultProp + "\" propTypes validation for auto controlled prop \"" + prop + "\"."); + } // its default prop + + + if (!Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_9__["default"])(propTypes, prop)) { + console.error(name + " is missing propTypes validation for auto controlled prop \"" + prop + "\"."); + } + }); // prevent autoControlledProps in defaultProps + // + // When setting state, auto controlled props values always win (so the parent can manage them). + // It is not reasonable to decipher the difference between props from the parent and defaultProps. + // Allowing defaultProps results in trySetState always deferring to the defaultProp value. + // Auto controlled props also listed in defaultProps can never be updated. + // + // To set defaults for an AutoControlled prop, you can set the initial state in the + // constructor or by using an ES7 property initializer: + // https://babeljs.io/blog/2015/06/07/react-on-es6-plus#property-initializers + + + var illegalDefaults = Object(lodash_es_intersection__WEBPACK_IMPORTED_MODULE_8__["default"])(autoControlledProps, Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_7__["default"])(defaultProps)); + + if (!Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_6__["default"])(illegalDefaults)) { + console.error(['Do not set defaultProps for autoControlledProps. You can set defaults by', 'setting state in the constructor or using an ES7 property initializer', '(https://babeljs.io/blog/2015/06/07/react-on-es6-plus#property-initializers)', "See " + name + " props: \"" + illegalDefaults + "\"."].join(' ')); + } // prevent listing defaultProps in autoControlledProps + // + // Default props are automatically handled. + // Listing defaults in autoControlledProps would result in allowing defaultDefaultValue props. + + + var illegalAutoControlled = Object(lodash_es_filter__WEBPACK_IMPORTED_MODULE_5__["default"])(autoControlledProps, function (prop) { + return Object(lodash_es_startsWith__WEBPACK_IMPORTED_MODULE_4__["default"])(prop, 'default'); + }); + + if (!Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_6__["default"])(illegalAutoControlled)) { + console.error(['Do not add default props to autoControlledProps.', 'Default props are automatically handled.', "See " + name + " autoControlledProps: \"" + illegalAutoControlled + "\"."].join(' ')); + } + } // Auto controlled props are copied to state. + // Set initial state by copying auto controlled props to state. + // Also look for the default prop for any auto controlled props (foo => defaultFoo) + // so we can set initial values from defaults. + + + var initialAutoControlledState = autoControlledProps.reduce(function (acc, prop) { + acc[prop] = getAutoControlledStateValue(prop, _this.props, state, true); + + if (true) { + var defaultPropName = getDefaultPropName(prop); + var _name = _this.constructor.name; // prevent defaultFoo={} along side foo={} + + if (!Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props[defaultPropName]) && !Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props[prop])) { + console.error(_name + " prop \"" + prop + "\" is auto controlled. Specify either " + defaultPropName + " or " + prop + ", but not both."); + } + } + + return acc; + }, {}); + _this.state = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, state, initialAutoControlledState, { + autoControlledProps: autoControlledProps, + getAutoControlledStateFromProps: getAutoControlledStateFromProps + }); + return _this; + } + + ModernAutoControlledComponent.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + var autoControlledProps = state.autoControlledProps, + getAutoControlledStateFromProps = state.getAutoControlledStateFromProps; // Solve the next state for autoControlledProps + + var newStateFromProps = autoControlledProps.reduce(function (acc, prop) { + var isNextDefined = !Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_3__["default"])(props[prop]); // if next is defined then use its value + + if (isNextDefined) acc[prop] = props[prop]; + return acc; + }, {}); // Due to the inheritance of the AutoControlledComponent we should call its + // getAutoControlledStateFromProps() and merge it with the existing state + + if (getAutoControlledStateFromProps) { + var computedState = getAutoControlledStateFromProps(props, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, state, newStateFromProps), state); // We should follow the idea of getDerivedStateFromProps() and return only modified state + + return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, newStateFromProps, computedState); + } + + return newStateFromProps; + } + /** + * Override this method to use getDerivedStateFromProps() in child components. + */ + ; + + ModernAutoControlledComponent.getAutoControlledStateFromProps = function getAutoControlledStateFromProps() { + return null; + }; + + return ModernAutoControlledComponent; +}(react__WEBPACK_IMPORTED_MODULE_12___default.a.Component); + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/SUI.js": +/*!***********************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/SUI.js ***! + \***********************************************************/ +/*! exports provided: COLORS, FLOATS, SIZES, TEXT_ALIGNMENTS, VERTICAL_ALIGNMENTS, VISIBILITY, WIDTHS, DIRECTIONAL_TRANSITIONS, STATIC_TRANSITIONS, TRANSITIONS, ACCESSIBILITY, ARROWS, AUDIO_VIDEO, BUSINESS, CHESS, CODE, COMMUNICATION, COMPUTERS, CURRENCY, DATE_TIME, DESIGN, EDITORS, FILES, GENDERS, HANDS_GESTURES, HEALTH, IMAGES, INTERFACES, LOGISTICS, MAPS, MEDICAL, OBJECTS, PAYMENTS_SHOPPING, SHAPES, SPINNERS, SPORTS, STATUS, USERS_PEOPLE, VEHICLES, WRITING, BRANDS, ICONS, ICON_ALIASES, ICONS_AND_ALIASES, COMPONENT_CONTEXT_SPECIFIC_ICONS, ALL_ICONS_IN_ALL_CONTEXTS */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COLORS", function() { return COLORS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FLOATS", function() { return FLOATS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SIZES", function() { return SIZES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TEXT_ALIGNMENTS", function() { return TEXT_ALIGNMENTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VERTICAL_ALIGNMENTS", function() { return VERTICAL_ALIGNMENTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VISIBILITY", function() { return VISIBILITY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WIDTHS", function() { return WIDTHS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DIRECTIONAL_TRANSITIONS", function() { return DIRECTIONAL_TRANSITIONS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STATIC_TRANSITIONS", function() { return STATIC_TRANSITIONS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITIONS", function() { return TRANSITIONS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ACCESSIBILITY", function() { return ACCESSIBILITY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ARROWS", function() { return ARROWS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AUDIO_VIDEO", function() { return AUDIO_VIDEO; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BUSINESS", function() { return BUSINESS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CHESS", function() { return CHESS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CODE", function() { return CODE; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMMUNICATION", function() { return COMMUNICATION; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMPUTERS", function() { return COMPUTERS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CURRENCY", function() { return CURRENCY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DATE_TIME", function() { return DATE_TIME; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DESIGN", function() { return DESIGN; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EDITORS", function() { return EDITORS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FILES", function() { return FILES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GENDERS", function() { return GENDERS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HANDS_GESTURES", function() { return HANDS_GESTURES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "HEALTH", function() { return HEALTH; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "IMAGES", function() { return IMAGES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INTERFACES", function() { return INTERFACES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LOGISTICS", function() { return LOGISTICS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MAPS", function() { return MAPS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MEDICAL", function() { return MEDICAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OBJECTS", function() { return OBJECTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PAYMENTS_SHOPPING", function() { return PAYMENTS_SHOPPING; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SHAPES", function() { return SHAPES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SPINNERS", function() { return SPINNERS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SPORTS", function() { return SPORTS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STATUS", function() { return STATUS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "USERS_PEOPLE", function() { return USERS_PEOPLE; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VEHICLES", function() { return VEHICLES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WRITING", function() { return WRITING; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BRANDS", function() { return BRANDS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ICONS", function() { return ICONS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ICON_ALIASES", function() { return ICON_ALIASES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ICONS_AND_ALIASES", function() { return ICONS_AND_ALIASES; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "COMPONENT_CONTEXT_SPECIFIC_ICONS", function() { return COMPONENT_CONTEXT_SPECIFIC_ICONS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ALL_ICONS_IN_ALL_CONTEXTS", function() { return ALL_ICONS_IN_ALL_CONTEXTS; }); +/* harmony import */ var lodash_es_uniq__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/uniq */ "./node_modules/lodash-es/uniq.js"); +/* harmony import */ var lodash_es_values__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/values */ "./node_modules/lodash-es/values.js"); +/* harmony import */ var lodash_es_keys__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/keys */ "./node_modules/lodash-es/keys.js"); +/* harmony import */ var _numberToWord__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./numberToWord */ "./node_modules/semantic-ui-react/dist/es/lib/numberToWord.js"); + + + + +var COLORS = ['red', 'orange', 'yellow', 'olive', 'green', 'teal', 'blue', 'violet', 'purple', 'pink', 'brown', 'grey', 'black']; +var FLOATS = ['left', 'right']; +var SIZES = ['mini', 'tiny', 'small', 'medium', 'large', 'big', 'huge', 'massive']; +var TEXT_ALIGNMENTS = ['left', 'center', 'right', 'justified']; +var VERTICAL_ALIGNMENTS = ['bottom', 'middle', 'top']; +var VISIBILITY = ['mobile', 'tablet', 'computer', 'large screen', 'widescreen']; +var WIDTHS = [].concat(Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(_numberToWord__WEBPACK_IMPORTED_MODULE_3__["numberToWordMap"]), Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_2__["default"])(_numberToWord__WEBPACK_IMPORTED_MODULE_3__["numberToWordMap"]).map(Number), Object(lodash_es_values__WEBPACK_IMPORTED_MODULE_1__["default"])(_numberToWord__WEBPACK_IMPORTED_MODULE_3__["numberToWordMap"])); +var DIRECTIONAL_TRANSITIONS = ['browse', 'browse right', 'drop', 'fade', 'fade up', 'fade down', 'fade left', 'fade right', 'fly up', 'fly down', 'fly left', 'fly right', 'horizontal flip', 'vertical flip', 'scale', 'slide up', 'slide down', 'slide left', 'slide right', 'swing up', 'swing down', 'swing left', 'swing right', 'zoom']; +var STATIC_TRANSITIONS = ['jiggle', 'flash', 'shake', 'pulse', 'tada', 'bounce', 'glow']; +var TRANSITIONS = [].concat(DIRECTIONAL_TRANSITIONS, STATIC_TRANSITIONS); // Generated from: +// https://github.com/Semantic-Org/Semantic-UI/blob/master/dist/components/icon.css + +var ACCESSIBILITY = ['american sign language interpreting', 'assistive listening systems', 'audio description', 'blind', 'braille', 'closed captioning', 'closed captioning outline', 'deaf', 'low vision', 'phone volume', 'question circle', 'question circle outline', 'sign language', 'tty', 'universal access', 'wheelchair']; +var ARROWS = ['angle double down', 'angle double left', 'angle double right', 'angle double up', 'angle down', 'angle left', 'angle right', 'angle up', 'arrow alternate circle down', 'arrow alternate circle down outline', 'arrow alternate circle left', 'arrow alternate circle left outline', 'arrow alternate circle right', 'arrow alternate circle right outline', 'arrow alternate circle up', 'arrow alternate circle up outline', 'arrow circle down', 'arrow circle left', 'arrow circle right', 'arrow circle up', 'arrow down', 'arrow left', 'arrow right', 'arrow up', 'arrows alternate', 'arrows alternate horizontal', 'arrows alternate vertical', 'caret down', 'caret left', 'caret right', 'caret square down', 'caret square down outline', 'caret square left', 'caret square left outline', 'caret square right', 'caret square right outline', 'caret square up', 'caret square up outline', 'caret up', 'cart arrow down', 'chart line', 'chevron circle down', 'chevron circle left', 'chevron circle right', 'chevron circle up', 'chevron down', 'chevron left', 'chevron right', 'chevron up', 'cloud download', 'cloud upload', 'download', 'exchange', 'expand arrows alternate', 'external alternate', 'external square alternate', 'hand point down', 'hand point down outline', 'hand point left', 'hand point left outline', 'hand point right', 'hand point right outline', 'hand point up', 'hand point up outline', 'hand pointer', 'hand pointer outline', 'history', 'level down alternate', 'level up alternate', 'location arrow', 'long arrow alternate down', 'long arrow alternate left', 'long arrow alternate right', 'long arrow alternate up', 'mouse pointer', 'play', 'random', 'recycle', 'redo', 'redo alternate', 'reply', 'reply all', 'retweet', 'share', 'share square', 'share square outline', 'sign-in', 'sign-out', 'sign-in alternate', 'sign-out alternate', 'sort', 'sort alphabet down', 'sort alphabet up', 'sort amount down', 'sort amount up', 'sort down', 'sort numeric down', 'sort numeric up', 'sort up', 'sync', 'sync alternate', 'text height', 'text width', 'undo', 'undo alternate', 'upload', 'zoom-in', 'zoom-out']; +var AUDIO_VIDEO = ['audio description', 'backward', 'circle', 'circle outline', 'closed captioning', 'closed captioning outline', 'compress', 'eject', 'expand', 'expand arrows alternate', 'fast backward', 'fast forward', 'file audio', 'file audio outline', 'file video', 'file video outline', 'film', 'forward', 'headphones', 'microphone', 'microphone slash', 'music', 'pause', 'pause circle', 'pause circle outline', 'phone volume', 'play', 'play circle', 'play circle outline', 'podcast', 'random', 'redo', 'redo alternate', 'rss', 'rss square', 'step backward', 'step forward', 'stop', 'stop circle', 'stop circle outline', 'sync', 'sync alternate', 'undo', 'undo alternate', 'video', 'volume down', 'volume off', 'volume up']; +var BUSINESS = ['address book', 'address book outline', 'address card', 'address card outline', 'archive', 'balance scale', 'birthday cake', 'book', 'briefcase', 'building', 'building outline', 'bullhorn', 'bullseye', 'calculator', 'calendar', 'calendar outline', 'calendar alternate', 'calendar alternate outline', 'certificate', 'chart area', 'chart bar', 'chart bar outline', 'chart line', 'chart pie', 'clipboard', 'clipboard outline', 'coffee', 'columns', 'compass', 'compass outline', 'copy', 'copy outline', 'copyright', 'copyright outline', 'cut', 'edit', 'edit outline', 'envelope', 'envelope outline', 'envelope open', 'envelope open outline', 'envelope square', 'eraser', 'fax', 'file', 'file outline', 'file alternate', 'file alternate outline', 'folder', 'folder outline', 'folder open', 'folder open outline', 'globe', 'industry', 'paperclip', 'paste', 'pen square', 'pencil alternate', 'percent', 'phone', 'phone square', 'phone volume', 'registered', 'registered outline', 'save', 'save outline', 'sitemap', 'sticky note', 'sticky note outline', 'suitcase', 'table', 'tag', 'tags', 'tasks', 'thumbtack', 'trademark']; +var CHESS = ['chess', 'chess bishop', 'chess board', 'chess king', 'chess knight', 'chess pawn', 'chess queen', 'chess rook', 'square full']; +var CODE = ['archive', 'barcode', 'bath', 'bug', 'code', 'code branch', 'coffee', 'file', 'file outline', 'file alternate', 'file alternate outline', 'file code', 'file code outline', 'filter', 'fire extinguisher', 'folder', 'folder outline', 'folder open', 'folder open outline', 'keyboard', 'keyboard outline', 'microchip', 'qrcode', 'shield alternate', 'sitemap', 'terminal', 'user secret', 'window close', 'window close outline', 'window maximize', 'window maximize outline', 'window minimize', 'window minimize outline', 'window restore', 'window restore outline']; +var COMMUNICATION = ['address book', 'address book outline', 'address card', 'address card outline', 'american sign language interpreting', 'assistive listening systems', 'at', 'bell', 'bell outline', 'bell slash', 'bell slash outline', 'bullhorn', 'comment', 'comment outline', 'comment alternate', 'comment alternate outline', 'comments', 'comments outline', 'envelope', 'envelope outline', 'envelope open', 'envelope open outline', 'envelope square', 'fax', 'inbox', 'language', 'microphone', 'microphone slash', 'mobile', 'mobile alternate', 'paper plane', 'paper plane outline', 'phone', 'phone square', 'phone volume', 'rss', 'rss square', 'tty', 'wifi']; +var COMPUTERS = ['desktop', 'download', 'hdd', 'hdd outline', 'headphones', 'keyboard', 'keyboard outline', 'laptop', 'microchip', 'mobile', 'mobile alternate', 'plug', 'power off', 'print', 'save', 'save outline', 'server', 'tablet', 'tablet alternate', 'tv', 'upload']; +var CURRENCY = ['dollar sign', 'euro sign', 'lira sign', 'money bill alternate', 'money bill alternate outline', 'pound sign', 'ruble sign', 'rupee sign', 'shekel sign', 'won sign', 'yen sign']; +var DATE_TIME = ['bell', 'bell outline', 'bell slash', 'bell slash outline', 'calendar', 'calendar outline', 'calendar alternate', 'calendar alternate outline', 'calendar check', 'calendar check outline', 'calendar minus', 'calendar minus outline', 'calendar plus', 'calendar plus outline', 'calendar times', 'calendar times outline', 'clock', 'clock outline', 'hourglass', 'hourglass outline', 'hourglass end', 'hourglass half', 'hourglass start', 'stopwatch']; +var DESIGN = ['adjust', 'clone', 'clone outline', 'copy', 'copy outline', 'crop', 'crosshairs', 'cut', 'edit', 'edit outline', 'eraser', 'eye', 'eye dropper', 'eye slash', 'eye slash outline', 'object group', 'object group outline', 'object ungroup', 'object ungroup outline', 'paint brush', 'paste', 'pencil alternate', 'save', 'save outline', 'tint']; +var EDITORS = ['align center', 'align justify', 'align left', 'align right', 'bold', 'clipboard', 'clipboard outline', 'clone', 'clone outline', 'columns', 'copy', 'copy outline', 'cut', 'edit', 'edit outline', 'eraser', 'file', 'file outline', 'file alternate', 'file alternate outline', 'font', 'heading', 'i cursor', 'indent', 'italic', 'linkify', 'list', 'list alternate', 'list alternate outline', 'list ol', 'list ul', 'outdent', 'paper plane', 'paper plane outline', 'paperclip', 'paragraph', 'paste', 'pencil alternate', 'print', 'quote left', 'quote right', 'redo', 'redo alternate', 'reply', 'reply all', 'share', 'strikethrough', 'subscript', 'superscript', 'sync', 'sync alternate', 'table', 'tasks', 'text height', 'text width', 'th', 'th large', 'th list', 'trash', 'trash alternate', 'trash alternate outline', 'underline', 'undo', 'undo alternate', 'unlink']; +var FILES = ['archive', 'clone', 'clone outline', 'copy', 'copy outline', 'cut', 'file', 'file outline', 'file alternate', 'file alternate outline', 'file archive', 'file archive outline', 'file audio', 'file audio outline', 'file code', 'file code outline', 'file excel', 'file excel outline', 'file image', 'file image outline', 'file pdf', 'file pdf outline', 'file powerpoint', 'file powerpoint outline', 'file video', 'file video outline', 'file word', 'file word outline', 'folder', 'folder outline', 'folder open', 'folder open outline', 'paste', 'save', 'save outline', 'sticky note', 'sticky note outline']; +var GENDERS = ['genderless', 'mars', 'mars double', 'mars stroke', 'mars stroke horizontal', 'mars stroke vertical', 'mercury', 'neuter', 'transgender', 'transgender alternate', 'venus', 'venus double', 'venus mars']; +var HANDS_GESTURES = ['hand lizard', 'hand lizard outline', 'hand paper', 'hand paper outline', 'hand peace', 'hand peace outline', 'hand point down', 'hand point down outline', 'hand point left', 'hand point left outline', 'hand point right', 'hand point right outline', 'hand point up', 'hand point up outline', 'hand pointer', 'hand pointer outline', 'hand rock', 'hand rock outline', 'hand scissors', 'hand scissors outline', 'hand spock', 'hand spock outline', 'handshake', 'handshake outline', 'thumbs down', 'thumbs down outline', 'thumbs up', 'thumbs up outline']; +var HEALTH = ['ambulance', 'h square', 'heart', 'heart outline', 'heartbeat', 'hospital', 'hospital outline', 'medkit', 'plus square', 'plus square outline', 'stethoscope', 'user md', 'wheelchair']; +var IMAGES = ['adjust', 'bolt', 'camera', 'camera retro', 'clone', 'clone outline', 'compress', 'expand', 'eye', 'eye dropper', 'eye slash', 'eye slash outline', 'file image', 'file image outline', 'film', 'id badge', 'id badge outline', 'id card', 'id card outline', 'image', 'image outline', 'images', 'images outline', 'sliders horizontal', 'tint']; +var INTERFACES = ['ban', 'barcode', 'bars', 'beer', 'bell', 'bell outline', 'bell slash', 'bell slash outline', 'bug', 'bullhorn', 'bullseye', 'calculator', 'calendar', 'calendar outline', 'calendar alternate', 'calendar alternate outline', 'calendar check', 'calendar check outline', 'calendar minus', 'calendar minus outline', 'calendar plus', 'calendar plus outline', 'calendar times', 'calendar times outline', 'certificate', 'check', 'check circle', 'check circle outline', 'check square', 'check square outline', 'circle', 'circle outline', 'clipboard', 'clipboard outline', 'clone', 'clone outline', 'cloud', 'cloud download', 'cloud upload', 'coffee', 'cog', 'cogs', 'copy', 'copy outline', 'cut', 'database', 'dot circle', 'dot circle outline', 'download', 'edit', 'edit outline', 'ellipsis horizontal', 'ellipsis vertical', 'envelope', 'envelope outline', 'envelope open', 'envelope open outline', 'eraser', 'exclamation', 'exclamation circle', 'exclamation triangle', 'external alternate', 'external square alternate', 'eye', 'eye slash', 'eye slash outline', 'file', 'file outline', 'file alternate', 'file alternate outline', 'filter', 'flag', 'flag outline', 'flag checkered', 'folder', 'folder outline', 'folder open', 'folder open outline', 'frown', 'frown outline', 'hashtag', 'heart', 'heart outline', 'history', 'home', 'i cursor', 'info', 'info circle', 'language', 'magic', 'meh', 'meh outline', 'microphone', 'microphone slash', 'minus', 'minus circle', 'minus square', 'minus square outline', 'paste', 'pencil alternate', 'plus', 'plus circle', 'plus square', 'plus square outline', 'qrcode', 'question', 'question circle', 'question circle outline', 'quote left', 'quote right', 'redo', 'redo alternate', 'reply', 'reply all', 'rss', 'rss square', 'save', 'save outline', 'search', 'search minus', 'search plus', 'share', 'share alternate', 'share alternate square', 'share square', 'share square outline', 'shield alternate', 'sign-in', 'sign-out', 'signal', 'sitemap', 'sliders horizontal', 'smile', 'smile outline', 'sort', 'sort alphabet down', 'sort alphabet up', 'sort amount down', 'sort amount up', 'sort down', 'sort numeric down', 'sort numeric up', 'sort up', 'star', 'star outline', 'star half', 'star half outline', 'sync', 'sync alternate', 'thumbs down', 'thumbs down outline', 'thumbs up', 'thumbs up outline', 'times', 'times circle', 'times circle outline', 'toggle off', 'toggle on', 'trash', 'trash alternate', 'trash alternate outline', 'trophy', 'undo', 'undo alternate', 'upload', 'user', 'user outline', 'user circle', 'user circle outline', 'wifi']; +var LOGISTICS = ['box', 'boxes', 'clipboard check', 'clipboard list', 'dolly', 'dolly flatbed', 'pallet', 'shipping fast', 'truck', 'warehouse']; +var MAPS = ['ambulance', 'anchor', 'balance scale', 'bath', 'bed', 'beer', 'bell', 'bell outline', 'bell slash', 'bell slash outline', 'bicycle', 'binoculars', 'birthday cake', 'blind', 'bomb', 'book', 'bookmark', 'bookmark outline', 'briefcase', 'building', 'building outline', 'car', 'coffee', 'crosshairs', 'dollar sign', 'eye', 'eye slash', 'eye slash outline', 'fighter jet', 'fire', 'fire extinguisher', 'flag', 'flag outline', 'flag checkered', 'flask', 'gamepad', 'gavel', 'gift', 'glass martini', 'globe', 'graduation cap', 'h square', 'heart', 'heart outline', 'heartbeat', 'home', 'hospital', 'hospital outline', 'image', 'image outline', 'images', 'images outline', 'industry', 'info', 'info circle', 'key', 'leaf', 'lemon', 'lemon outline', 'life ring', 'life ring outline', 'lightbulb', 'lightbulb outline', 'location arrow', 'low vision', 'magnet', 'male', 'map', 'map outline', 'map marker', 'map marker alternate', 'map pin', 'map signs', 'medkit', 'money bill alternate', 'money bill alternate outline', 'motorcycle', 'music', 'newspaper', 'newspaper outline', 'paw', 'phone', 'phone square', 'phone volume', 'plane', 'plug', 'plus', 'plus square', 'plus square outline', 'print', 'recycle', 'road', 'rocket', 'search', 'search minus', 'search plus', 'ship', 'shopping bag', 'shopping basket', 'shopping cart', 'shower', 'street view', 'subway', 'suitcase', 'tag', 'tags', 'taxi', 'thumbtack', 'ticket alternate', 'tint', 'train', 'tree', 'trophy', 'truck', 'tty', 'umbrella', 'university', 'utensil spoon', 'utensils', 'wheelchair', 'wifi', 'wrench']; +var MEDICAL = ['ambulance', 'band aid', 'dna', 'first aid', 'heart', 'heart outline', 'heartbeat', 'hospital', 'hospital outline', 'hospital symbol', 'pills', 'plus', 'stethoscope', 'syringe', 'thermometer', 'user md', 'weight']; +var OBJECTS = ['ambulance', 'anchor', 'archive', 'balance scale', 'bath', 'bed', 'beer', 'bell', 'bell outline', 'bicycle', 'binoculars', 'birthday cake', 'bomb', 'book', 'bookmark', 'bookmark outline', 'briefcase', 'bug', 'building', 'building outline', 'bullhorn', 'bullseye', 'bus', 'calculator', 'calendar', 'calendar outline', 'calendar alternate', 'calendar alternate outline', 'camera', 'camera retro', 'car', 'clipboard', 'clipboard outline', 'cloud', 'coffee', 'cog', 'cogs', 'compass', 'compass outline', 'copy', 'copy outline', 'cube', 'cubes', 'cut', 'envelope', 'envelope outline', 'envelope open', 'envelope open outline', 'eraser', 'eye', 'eye dropper', 'fax', 'fighter jet', 'file', 'file outline', 'file alternate', 'file alternate outline', 'film', 'fire', 'fire extinguisher', 'flag', 'flag outline', 'flag checkered', 'flask', 'futbol', 'futbol outline', 'gamepad', 'gavel', 'gem', 'gem outline', 'gift', 'glass martini', 'globe', 'graduation cap', 'hdd', 'hdd outline', 'headphones', 'heart', 'heart outline', 'home', 'hospital', 'hospital outline', 'hourglass', 'hourglass outline', 'image', 'image outline', 'images', 'images outline', 'industry', 'key', 'keyboard', 'keyboard outline', 'laptop', 'leaf', 'lemon', 'lemon outline', 'life ring', 'life ring outline', 'lightbulb', 'lightbulb outline', 'lock', 'lock open', 'magic', 'magnet', 'map', 'map outline', 'map marker', 'map marker alternate', 'map pin', 'map signs', 'medkit', 'microchip', 'microphone', 'mobile', 'mobile alternate', 'money bill alternate', 'money bill alternate outline', 'moon', 'moon outline', 'motorcycle', 'newspaper', 'newspaper outline', 'paint brush', 'paper plane', 'paper plane outline', 'paperclip', 'paste', 'paw', 'pencil alternate', 'phone', 'plane', 'plug', 'print', 'puzzle piece', 'road', 'rocket', 'save', 'save outline', 'search', 'shield alternate', 'shopping bag', 'shopping basket', 'shopping cart', 'shower', 'snowflake', 'snowflake outline', 'space shuttle', 'star', 'star outline', 'sticky note', 'sticky note outline', 'stopwatch', 'subway', 'suitcase', 'sun', 'sun outline', 'tablet', 'tablet alternate', 'tachometer alternate', 'tag', 'tags', 'taxi', 'thumbtack', 'ticket alternate', 'train', 'trash', 'trash alternate', 'trash alternate outline', 'tree', 'trophy', 'truck', 'tv', 'umbrella', 'university', 'unlock', 'unlock alternate', 'utensil spoon', 'utensils', 'wheelchair', 'wrench']; +var PAYMENTS_SHOPPING = ['bell', 'bell outline', 'bookmark', 'bookmark outline', 'bullhorn', 'camera', 'camera retro', 'cart arrow down', 'cart plus', 'certificate', 'credit card', 'credit card outline', 'gem', 'gem outline', 'gift', 'handshake', 'handshake outline', 'heart', 'heart outline', 'key', 'shopping bag', 'shopping basket', 'shopping cart', 'star', 'star outline', 'tag', 'tags', 'thumbs down', 'thumbs down outline', 'thumbs up', 'thumbs up outline', 'trophy']; +var SHAPES = ['bookmark', 'bookmark outline', 'calendar', 'calendar outline', 'certificate', 'circle', 'circle outline', 'cloud', 'comment', 'comment outline', 'file', 'file outline', 'folder', 'folder outline', 'heart', 'heart outline', 'map marker', 'play', 'square', 'square outline', 'star', 'star outline']; +var SPINNERS = ['asterisk', 'certificate', 'circle notch', 'cog', 'compass', 'compass outline', 'crosshairs', 'life ring', 'life ring outline', 'snowflake', 'snowflake outline', 'spinner', 'sun', 'sun outline', 'sync']; +var SPORTS = ['baseball ball', 'basketball ball', 'bowling ball', 'football ball', 'futbol', 'futbol outline', 'golf ball', 'hockey puck', 'quidditch', 'table tennis', 'volleyball ball']; +var STATUS = ['ban', 'battery empty', 'battery full', 'battery half', 'battery quarter', 'battery three quarters', 'bell', 'bell outline', 'bell slash', 'bell slash outline', 'calendar', 'calendar outline', 'calendar alternate', 'calendar alternate outline', 'calendar check', 'calendar check outline', 'calendar minus', 'calendar minus outline', 'calendar plus', 'calendar plus outline', 'calendar times', 'calendar times outline', 'cart arrow down', 'cart plus', 'exclamation', 'exclamation circle', 'exclamation triangle', 'eye', 'eye slash', 'eye slash outline', 'file', 'file outline', 'file alternate', 'file alternate outline', 'folder', 'folder outline', 'folder open', 'folder open outline', 'info', 'info circle', 'lock', 'lock open', 'minus', 'minus circle', 'minus square', 'minus square outline', 'plus', 'plus circle', 'plus square', 'plus square outline', 'question', 'question circle', 'question circle outline', 'shield alternate', 'shopping cart', 'sign in alternate', 'sign out alternate', 'thermometer empty', 'thermometer full', 'thermometer half', 'thermometer quarter', 'thermometer three quarters', 'thumbs down', 'thumbs down outline', 'thumbs up', 'thumbs up outline', 'toggle off', 'toggle on', 'unlock', 'unlock alternate']; +var USERS_PEOPLE = ['address book', 'address book outline', 'address card', 'address card outline', 'bed', 'blind', 'child', 'female', 'frown', 'frown outline', 'id badge', 'id badge outline', 'id card', 'id card outline', 'male', 'meh', 'meh outline', 'power off', 'smile', 'smile outline', 'street view', 'user', 'user outline', 'user circle', 'user circle outline', 'user md', 'user plus', 'user secret', 'user times', 'users', 'wheelchair']; +var VEHICLES = ['ambulance', 'bicycle', 'bus', 'car', 'fighter jet', 'motorcycle', 'paper plane', 'paper plane outline', 'plane', 'rocket', 'ship', 'shopping cart', 'space shuttle', 'subway', 'taxi', 'train', 'truck', 'wheelchair']; +var WRITING = ['archive', 'book', 'bookmark', 'bookmark outline', 'edit', 'edit outline', 'envelope', 'envelope outline', 'envelope open', 'envelope open outline', 'eraser', 'file', 'file outline', 'file alternate', 'file alternate outline', 'folder', 'folder outline', 'folder open', 'folder open outline', 'keyboard', 'keyboard outline', 'newspaper', 'newspaper outline', 'paper plane', 'paper plane outline', 'paperclip', 'paragraph', 'pen square', 'pencil alternate', 'quote left', 'quote right', 'sticky note', 'sticky note outline', 'thumbtack']; +var BRANDS = ['500px', 'accessible', 'accusoft', 'adn', 'adversal', 'affiliatetheme', 'algolia', 'amazon', 'amazon pay', 'amilia', 'android', 'angellist', 'angrycreative', 'angular', 'app store', 'app store ios', 'apper', 'apple', 'apple pay', 'asymmetrik', 'audible', 'autoprefixer', 'avianex', 'aviato', 'aws', 'bandcamp', 'behance', 'behance square', 'bimobject', 'bitbucket', 'bitcoin', 'bity', 'black tie', 'blackberry', 'blogger', 'blogger b', 'bluetooth', 'bluetooth b', 'btc', 'buromobelexperte', 'buysellads', 'cc amazon pay', 'cc amex', 'cc apple pay', 'cc diners club', 'cc discover', 'cc jcb', 'cc mastercard', 'cc paypal', 'cc stripe', 'cc visa', 'centercode', 'chrome', 'cloudscale', 'cloudsmith', 'cloudversify', 'codepen', 'codiepie', 'connectdevelop', 'contao', 'cpanel', 'creative commons', 'css3', 'css3 alternate', 'cuttlefish', 'd and d', 'dashcube', 'delicious', 'deploydog', 'deskpro', 'deviantart', 'digg', 'digital ocean', 'discord', 'discourse', 'dochub', 'docker', 'draft2digital', 'dribbble', 'dribbble square', 'dropbox', 'drupal', 'dyalog', 'earlybirds', 'edge', 'elementor', 'ember', 'empire', 'envira', 'erlang', 'ethereum', 'etsy', 'expeditedssl', 'facebook', 'facebook f', 'facebook messenger', 'facebook square', 'firefox', 'first order', 'firstdraft', 'flickr', 'flipboard', 'fly', 'font awesome', 'font awesome alternate', 'font awesome flag', 'fonticons', 'fonticons fi', 'fort awesome', 'fort awesome alternate', 'forumbee', 'foursquare', 'free code camp', 'freebsd', 'get pocket', 'gg', 'gg circle', 'git', 'git square', 'github', 'github alternate', 'github square', 'gitkraken', 'gitlab', 'gitter', 'glide', 'glide g', 'gofore', 'goodreads', 'goodreads g', 'google', 'google drive', 'google play', 'google plus', 'google plus g', 'google plus square', 'google wallet', 'gratipay', 'grav', 'gripfire', 'grunt', 'gulp', 'hacker news', 'hacker news square', 'hips', 'hire a helper', 'hooli', 'hotjar', 'houzz', 'html5', 'hubspot', 'imdb', 'instagram', 'internet explorer', 'ioxhost', 'itunes', 'itunes note', 'jenkins', 'joget', 'joomla', 'js', 'js square', 'jsfiddle', 'keycdn', 'kickstarter', 'kickstarter k', 'korvue', 'laravel', 'lastfm', 'lastfm square', 'leanpub', 'less', 'linechat', 'linkedin', 'linkedin alternate', 'linode', 'linux', 'lyft', 'magento', 'maxcdn', 'medapps', 'medium', 'medium m', 'medrt', 'meetup', 'microsoft', 'mix', 'mixcloud', 'mizuni', 'modx', 'monero', 'napster', 'nintendo switch', 'node', 'node js', 'npm', 'ns8', 'nutritionix', 'odnoklassniki', 'odnoklassniki square', 'opencart', 'openid', 'opera', 'optin monster', 'osi', 'page4', 'pagelines', 'palfed', 'patreon', 'paypal', 'periscope', 'phabricator', 'phoenix framework', 'php', 'pied piper', 'pied piper alternate', 'pied piper pp', 'pinterest', 'pinterest p', 'pinterest square', 'playstation', 'product hunt', 'pushed', 'python', 'qq', 'quinscape', 'quora', 'ravelry', 'react', 'rebel', 'redriver', 'reddit', 'reddit alien', 'reddit square', 'rendact', 'renren', 'replyd', 'resolving', 'rocketchat', 'rockrms', 'safari', 'sass', 'schlix', 'scribd', 'searchengin', 'sellcast', 'sellsy', 'servicestack', 'shirtsinbulk', 'simplybuilt', 'sistrix', 'skyatlas', 'skype', 'slack', 'slack hash', 'slideshare', 'snapchat', 'snapchat ghost', 'snapchat square', 'soundcloud', 'speakap', 'spotify', 'stack exchange', 'stack overflow', 'staylinked', 'steam', 'steam square', 'steam symbol', 'sticker mule', 'strava', 'stripe', 'stripe s', 'studiovinari', 'stumbleupon', 'stumbleupon circle', 'superpowers', 'supple', 'telegram', 'telegram plane', 'tencent weibo', 'themeisle', 'trello', 'tripadvisor', 'tumblr', 'tumblr square', 'twitch', 'twitter', 'twitter square', 'typo3', 'uber', 'uikit', 'uniregistry', 'untappd', 'usb', 'ussunnah', 'vaadin', 'viacoin', 'viadeo', 'viadeo square', 'viber', 'vimeo', 'vimeo square', 'vimeo v', 'vine', 'vk', 'vnv', 'vuejs', 'wechat', 'weibo', 'weixin', 'whatsapp', 'whatsapp square', 'whmcs', 'wikipedia w', 'windows', 'wordpress', 'wordpress simple', 'wpbeginner', 'wpexplorer', 'wpforms', 'xbox', 'xing', 'xing square', 'y combinator', 'yahoo', 'yandex', 'yandex international', 'yelp', 'yoast', 'youtube', 'youtube square']; +var ICONS = Object(lodash_es_uniq__WEBPACK_IMPORTED_MODULE_0__["default"])([].concat(ACCESSIBILITY, ARROWS, AUDIO_VIDEO, BUSINESS, CHESS, CODE, COMMUNICATION, COMPUTERS, CURRENCY, DATE_TIME, DESIGN, EDITORS, FILES, GENDERS, HANDS_GESTURES, HEALTH, IMAGES, INTERFACES, LOGISTICS, MAPS, MEDICAL, OBJECTS, PAYMENTS_SHOPPING, SHAPES, SPINNERS, SPORTS, STATUS, USERS_PEOPLE, VEHICLES, WRITING, BRANDS)); +var ICON_ALIASES = ['chess rock', 'ordered list', 'unordered list', 'user doctor', 'shield', 'puzzle', 'add circle', 'add square', 'add to calendar', 'add to cart', 'add user', 'add', 'alarm mute', 'alarm', 'ald', 'als', 'announcement', 'area chart', 'area graph', 'arrow down cart', 'asexual', 'asl interpreting', 'asl', 'assistive listening devices', 'attach', 'attention', 'balance', 'bar', 'bathtub', 'battery four', 'battery high', 'battery low', 'battery one', 'battery three', 'battery two', 'battery zero', 'birthday', 'block layout', 'bluetooth alternative', 'broken chain', 'browser', 'call square', 'call', 'cancel', 'cart', 'cc', 'chain', 'chat', 'checked calendar', 'checkmark', 'circle notched', 'close', 'cny', 'cocktail', 'commenting', 'computer', 'configure', 'content', 'deafness', 'delete calendar', 'delete', 'detective', 'discussions', 'doctor', 'dollar', 'dont', 'drivers license', 'dropdown', 'emergency', 'envira gallery', 'erase', 'eur', 'euro', 'eyedropper', 'factory', 'favorite', 'feed', 'female homosexual', 'file text', 'file text outline', 'find', 'first aid', 'fork', 'game', 'gay', 'gbp', 'google plus circle', 'google plus official', 'grab', 'graduation', 'grid layout', 'group', 'h', 'hand victory', 'handicap', 'hard of hearing', 'header', 'help circle', 'help', 'heterosexual', 'hide', 'hotel', 'hourglass four', 'hourglass full', 'hourglass one', 'hourglass three', 'hourglass two', 'idea', 'ils', 'in cart', 'inr', 'intergender', 'intersex', 'jpy', 'krw', 'lab', 'law', 'legal', 'lesbian', 'lightning', 'like', 'line graph', 'linkedin square', 'linkify', 'lira', 'list layout', 'magnify', 'mail forward', 'mail outline', 'mail square', 'mail', 'male homosexual', 'man', 'marker', 'mars alternate', 'mars horizontal', 'mars vertical', 'microsoft edge', 'military', 'ms edge', 'mute', 'new pied piper', 'non binary transgender', 'numbered list', 'options', 'other gender horizontal', 'other gender vertical', 'other gender', 'payment', 'paypal card', 'pencil square', 'photo', 'picture', 'pie chart', 'pie graph', 'pied piper hat', 'pin', 'plus cart', 'point', 'pointing down', 'pointing left', 'pointing right', 'pointing up', 'pound', 'power cord', 'power', 'privacy', 'r circle', 'rain', 'record', 'refresh', 'remove circle', 'remove from calendar', 'remove user', 'remove', 'repeat', 'rmb', 'rouble', 'rub', 'ruble', 'rupee', 's15', 'selected radio', 'send', 'setting', 'settings', 'shekel', 'sheqel', 'shipping', 'shop', 'shuffle', 'shutdown', 'sidebar', 'signing', 'signup', 'sliders', 'soccer', 'sort alphabet ascending', 'sort alphabet descending', 'sort ascending', 'sort content ascending', 'sort content descending', 'sort descending', 'sort numeric ascending', 'sort numeric descending', 'sound', 'spy', 'stripe card', 'student', 'talk', 'target', 'teletype', 'television', 'text cursor', 'text telephone', 'theme', 'thermometer', 'thumb tack', 'time', 'tm', 'toggle down', 'toggle left', 'toggle right', 'toggle up', 'translate', 'travel', 'treatment', 'triangle down', 'triangle left', 'triangle right', 'triangle up', 'try', 'unhide', 'unlinkify', 'unmute', 'usd', 'user cancel', 'user close', 'user delete', 'user x', 'vcard', 'video camera', 'video play', 'volume control phone', 'wait', 'warning circle', 'warning sign', 'warning', 'wi-fi', 'winner', 'wizard', 'woman', 'won', 'wordpress beginner', 'wordpress forms', 'world', 'write square', 'x', 'yen', 'zip', 'zoom in', 'zoom out', 'zoom', 'bitbucket square', 'checkmark box', 'circle thin', 'cloud download', 'cloud upload', 'compose', 'conversation', 'credit card alternative', 'currency', 'dashboard', 'diamond', 'disk', 'exchange', 'external share', 'external square', 'external', 'facebook official', 'food', 'hourglass zero', 'level down', 'level up', 'log out', 'meanpath', 'money', 'move', 'pencil', 'protect', 'radio', 'remove bookmark', 'resize horizontal', 'resize vertical', 'sign in', 'sign out', 'spoon', 'star half empty', 'star half full', 'ticket', 'times rectangle', 'write', 'youtube play']; +var ICONS_AND_ALIASES = Object(lodash_es_uniq__WEBPACK_IMPORTED_MODULE_0__["default"])([].concat(ICONS, ICON_ALIASES)); // Some icon names are not part of icons.css. +// These are only valid as children of other components. +// Their CSS rules are defined by a specific component's CSS. +// We don't want to show name warnings for those usages so we add them as valid names here. + +var COMPONENT_CONTEXT_SPECIFIC_ICONS = ['left dropdown' // nested dropdown menu direction icon +]; +var ALL_ICONS_IN_ALL_CONTEXTS = Object(lodash_es_uniq__WEBPACK_IMPORTED_MODULE_0__["default"])([].concat(ICONS_AND_ALIASES, COMPONENT_CONTEXT_SPECIFIC_ICONS)); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/childrenUtils.js": +/*!*********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/childrenUtils.js ***! + \*********************************************************************/ +/*! exports provided: someByType, findByType, isNil */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "someByType", function() { return someByType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findByType", function() { return findByType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNil", function() { return isNil; }); +/* harmony import */ var lodash_es_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/find */ "./node_modules/lodash-es/find.js"); +/* harmony import */ var lodash_es_some__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/some */ "./node_modules/lodash-es/some.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); + + + +/** + * Determine if child by type exists in children. + * @param {Object} children The children prop of a component. + * @param {string|Function} type An html tag name string or React component. + * @returns {Boolean} + */ + +var someByType = function someByType(children, type) { + return Object(lodash_es_some__WEBPACK_IMPORTED_MODULE_1__["default"])(react__WEBPACK_IMPORTED_MODULE_2__["Children"].toArray(children), { + type: type + }); +}; +/** + * Find child by type. + * @param {Object} children The children prop of a component. + * @param {string|Function} type An html tag name string or React component. + * @returns {undefined|Object} + */ + +var findByType = function findByType(children, type) { + return Object(lodash_es_find__WEBPACK_IMPORTED_MODULE_0__["default"])(react__WEBPACK_IMPORTED_MODULE_2__["Children"].toArray(children), { + type: type + }); +}; +/** + * Tests if children are nil in React and Preact. + * @param {Object} children The children prop of a component. + * @returns {Boolean} + */ + +var isNil = function isNil(children) { + return children === null || children === undefined || Array.isArray(children) && children.length === 0; +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/classNameBuilders.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/classNameBuilders.js ***! + \*************************************************************************/ +/*! exports provided: useKeyOnly, useValueAndKey, useKeyOrValueAndKey, useMultipleProp, useTextAlignProp, useVerticalAlignProp, useWidthProp */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useKeyOnly", function() { return useKeyOnly; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useValueAndKey", function() { return useValueAndKey; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useKeyOrValueAndKey", function() { return useKeyOrValueAndKey; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useMultipleProp", function() { return useMultipleProp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useTextAlignProp", function() { return useTextAlignProp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useVerticalAlignProp", function() { return useVerticalAlignProp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "useWidthProp", function() { return useWidthProp; }); +/* harmony import */ var _numberToWord__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./numberToWord */ "./node_modules/semantic-ui-react/dist/es/lib/numberToWord.js"); + +/* + * There are 3 prop patterns used to build up the className for a component. + * Each utility here is meant for use in a classnames() argument. + * + * There is no util for valueOnly() because it would simply return val. + * Use the prop value inline instead. + * <Label size='big' /> + * <div class="ui big label"></div> + */ + +/** + * Props where only the prop key is used in the className. + * @param {*} val A props value + * @param {string} key A props key + * + * @example + * <Label tag /> + * <div class="ui tag label"></div> + */ + +var useKeyOnly = function useKeyOnly(val, key) { + return val && key; +}; +/** + * Props that require both a key and value to create a className. + * @param {*} val A props value + * @param {string} key A props key + * + * @example + * <Label corner='left' /> + * <div class="ui left corner label"></div> + */ + +var useValueAndKey = function useValueAndKey(val, key) { + return val && val !== true && val + " " + key; +}; +/** + * Props whose key will be used in className, or value and key. + * @param {*} val A props value + * @param {string} key A props key + * + * @example Key Only + * <Label pointing /> + * <div class="ui pointing label"></div> + * + * @example Key and Value + * <Label pointing='left' /> + * <div class="ui left pointing label"></div> + */ + +var useKeyOrValueAndKey = function useKeyOrValueAndKey(val, key) { + return val && (val === true ? key : val + " " + key); +}; // +// Prop to className exceptions +// + +/** + * The "multiple" prop implements control of visibility and reserved classes for Grid subcomponents. + * + * @param {*} val The value of the "multiple" prop + * @param {*} key A props key + * + * @example + * <Grid.Row only='mobile' /> + * <Grid.Row only='mobile tablet' /> + * <div class="mobile only row"></div> + * <div class="mobile only tablet only row"></div> + */ + +var useMultipleProp = function useMultipleProp(val, key) { + if (!val || val === true) return null; + return val.replace('large screen', 'large-screen').replace(/ vertically/g, '-vertically').split(' ').map(function (prop) { + return prop.replace('-', ' ') + " " + key; + }).join(' '); +}; +/** + * The "textAlign" prop follows the useValueAndKey except when the value is "justified'. + * In this case, only the class "justified" is used, ignoring the "aligned" class. + * @param {*} val The value of the "textAlign" prop + * + * @example + * <Container textAlign='justified' /> + * <div class="ui justified container"></div> + * + * @example + * <Container textAlign='left' /> + * <div class="ui left aligned container"></div> + */ + +var useTextAlignProp = function useTextAlignProp(val) { + return val === 'justified' ? 'justified' : useValueAndKey(val, 'aligned'); +}; +/** + * The "verticalAlign" prop follows the useValueAndKey. + * + * @param {*} val The value of the "verticalAlign" prop + * + * @example + * <Grid verticalAlign='middle' /> + * <div class="ui middle aligned grid"></div> + */ + +var useVerticalAlignProp = function useVerticalAlignProp(val) { + return useValueAndKey(val, 'aligned'); +}; +/** + * Create "X", "X wide" and "equal width" classNames. + * "X" is a numberToWord value and "wide" is configurable. + * @param {*} val The prop value + * @param {string} [widthClass=''] The class + * @param {boolean} [canEqual=false] Flag that indicates possibility of "equal" value + * + * @example + * <Grid columns='equal' /> + * <div class="ui equal width grid"></div> + * + * <Form widths='equal' /> + * <div class="ui equal width form"></div> + * + * <FieldGroup widths='equal' /> + * <div class="equal width fields"></div> + * + * @example + * <Grid columns={4} /> + * <div class="ui four column grid"></div> + */ + +var useWidthProp = function useWidthProp(val, widthClass, canEqual) { + if (widthClass === void 0) { + widthClass = ''; + } + + if (canEqual === void 0) { + canEqual = false; + } + + if (canEqual && val === 'equal') { + return 'equal width'; + } + + var valType = typeof val; + + if ((valType === 'string' || valType === 'number') && widthClass) { + return Object(_numberToWord__WEBPACK_IMPORTED_MODULE_0__["numberToWord"])(val) + " " + widthClass; + } + + return Object(_numberToWord__WEBPACK_IMPORTED_MODULE_0__["numberToWord"])(val); +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/createPaginationItems.js": +/*!***************************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/createPaginationItems.js ***! + \***************************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _itemFactories__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemFactories */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/itemFactories.js"); +/* harmony import */ var _rangeFactories__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rangeFactories */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/rangeFactories.js"); +/* harmony import */ var _paginationUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./paginationUtils */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/paginationUtils.js"); + + + +/** + * @param {object} rawOptions + * @param {number|string} rawOptions.activePage + * @param {number|string} rawOptions.boundaryRange Number of always visible pages at the beginning and end. + * @param {boolean} rawOptions.hideEllipsis Marks if ellipsis should be hidden. + * @param {number|string} rawOptions.siblingRange Number of always visible pages before and after the current one. + * @param {number|string} rawOptions.totalPages Total number of pages. + */ + +var createPaginationItems = function createPaginationItems(rawOptions) { + var options = Object(_paginationUtils__WEBPACK_IMPORTED_MODULE_2__["typifyOptions"])(rawOptions); + var activePage = options.activePage, + totalPages = options.totalPages; + var pageFactory = Object(_itemFactories__WEBPACK_IMPORTED_MODULE_0__["createPageFactory"])(activePage); + var innerRange = Object(_paginationUtils__WEBPACK_IMPORTED_MODULE_2__["isSimplePagination"])(options) ? Object(_rangeFactories__WEBPACK_IMPORTED_MODULE_1__["createSimpleRange"])(1, totalPages, pageFactory) : Object(_rangeFactories__WEBPACK_IMPORTED_MODULE_1__["createComplexRange"])(options, pageFactory); + return [Object(_itemFactories__WEBPACK_IMPORTED_MODULE_0__["createFirstPage"])(), Object(_itemFactories__WEBPACK_IMPORTED_MODULE_0__["createPrevItem"])(activePage)].concat(innerRange, [Object(_itemFactories__WEBPACK_IMPORTED_MODULE_0__["createNextItem"])(activePage, totalPages), Object(_itemFactories__WEBPACK_IMPORTED_MODULE_0__["createLastItem"])(totalPages)]); +}; + +/* harmony default export */ __webpack_exports__["default"] = (createPaginationItems); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/index.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/index.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _createPaginationItems__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createPaginationItems */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/createPaginationItems.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _createPaginationItems__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/itemFactories.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/itemFactories.js ***! + \*******************************************************************************************/ +/*! exports provided: createEllipsisItem, createFirstPage, createPrevItem, createPageFactory, createNextItem, createLastItem */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createEllipsisItem", function() { return createEllipsisItem; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createFirstPage", function() { return createFirstPage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPrevItem", function() { return createPrevItem; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createPageFactory", function() { return createPageFactory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createNextItem", function() { return createNextItem; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createLastItem", function() { return createLastItem; }); +/** + * @param {number} pageNumber + * @return {Object} + */ +var createEllipsisItem = function createEllipsisItem(pageNumber) { + return { + active: false, + type: 'ellipsisItem', + value: pageNumber + }; +}; +/** + * @return {Object} + */ + +var createFirstPage = function createFirstPage() { + return { + active: false, + type: 'firstItem', + value: 1 + }; +}; +/** + * @param {number} activePage + * @return {Object} + */ + +var createPrevItem = function createPrevItem(activePage) { + return { + active: false, + type: 'prevItem', + value: Math.max(1, activePage - 1) + }; +}; +/** + * @param {number} activePage + * @return {function} + */ + +var createPageFactory = function createPageFactory(activePage) { + return function (pageNumber) { + return { + active: activePage === pageNumber, + type: 'pageItem', + value: pageNumber + }; + }; +}; +/** + * @param {number} activePage + * @param {number} totalPages + * @return {Object} + */ + +var createNextItem = function createNextItem(activePage, totalPages) { + return { + active: false, + type: 'nextItem', + value: Math.min(activePage + 1, totalPages) + }; +}; +/** + * @param {number} totalPages + * @return {Object} + */ + +var createLastItem = function createLastItem(totalPages) { + return { + active: false, + type: 'lastItem', + value: totalPages + }; +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/paginationUtils.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/paginationUtils.js ***! + \*********************************************************************************************/ +/*! exports provided: isSimplePagination, typifyOptions */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSimplePagination", function() { return isSimplePagination; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "typifyOptions", function() { return typifyOptions; }); +/** + * Checks the possibility of using simple range generation, if number of generated pages is equal + * or greater than total pages to show. + * + * @param {object} options + * @param {number} options.boundaryRange Number of always visible pages at the beginning and end. + * @param {number} options.siblingRange Number of always visible pages before and after the current one. + * @param {number} options.totalPages Total number of pages. + * @return {boolean} + */ +var isSimplePagination = function isSimplePagination(_ref) { + var boundaryRange = _ref.boundaryRange, + hideEllipsis = _ref.hideEllipsis, + siblingRange = _ref.siblingRange, + totalPages = _ref.totalPages; + var boundaryRangeSize = 2 * boundaryRange; + var ellipsisSize = hideEllipsis ? 0 : 2; + var siblingRangeSize = 2 * siblingRange; + return 1 + ellipsisSize + siblingRangeSize + boundaryRangeSize >= totalPages; +}; +var typifyOptions = function typifyOptions(_ref2) { + var activePage = _ref2.activePage, + boundaryRange = _ref2.boundaryRange, + hideEllipsis = _ref2.hideEllipsis, + siblingRange = _ref2.siblingRange, + totalPages = _ref2.totalPages; + return { + activePage: +activePage, + boundaryRange: +boundaryRange, + hideEllipsis: !!hideEllipsis, + siblingRange: +siblingRange, + totalPages: +totalPages + }; +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/rangeFactories.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/rangeFactories.js ***! + \********************************************************************************************/ +/*! exports provided: createSimpleRange, createComplexRange */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createSimpleRange", function() { return createSimpleRange; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createComplexRange", function() { return createComplexRange; }); +/* harmony import */ var lodash_es_range__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/range */ "./node_modules/lodash-es/range.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var _suffixFactories__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./suffixFactories */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/suffixFactories.js"); + + + +var createSimpleRange = function createSimpleRange(start, end, pageFactory) { + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(lodash_es_range__WEBPACK_IMPORTED_MODULE_0__["default"])(start, end + 1), pageFactory); +}; +var createComplexRange = function createComplexRange(options, pageFactory) { + var activePage = options.activePage, + boundaryRange = options.boundaryRange, + hideEllipsis = options.hideEllipsis, + siblingRange = options.siblingRange, + totalPages = options.totalPages; + var ellipsisSize = hideEllipsis ? 0 : 1; + var firstGroupEnd = boundaryRange; + var firstGroup = createSimpleRange(1, firstGroupEnd, pageFactory); + var lastGroupStart = totalPages + 1 - boundaryRange; + var lastGroup = createSimpleRange(lastGroupStart, totalPages, pageFactory); + var innerGroupStart = Math.min(Math.max(activePage - siblingRange, firstGroupEnd + ellipsisSize + 1), lastGroupStart - ellipsisSize - 2 * siblingRange - 1); + var innerGroupEnd = innerGroupStart + 2 * siblingRange; + var innerGroup = createSimpleRange(innerGroupStart, innerGroupEnd, pageFactory); + return [].concat(firstGroup, [!hideEllipsis && Object(_suffixFactories__WEBPACK_IMPORTED_MODULE_2__["createInnerPrefix"])(firstGroupEnd, innerGroupStart, pageFactory)], innerGroup, [!hideEllipsis && Object(_suffixFactories__WEBPACK_IMPORTED_MODULE_2__["createInnerSuffix"])(innerGroupEnd, lastGroupStart, pageFactory)], lastGroup).filter(Boolean); +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/suffixFactories.js": +/*!*********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/suffixFactories.js ***! + \*********************************************************************************************/ +/*! exports provided: createInnerPrefix, createInnerSuffix */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createInnerPrefix", function() { return createInnerPrefix; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createInnerSuffix", function() { return createInnerSuffix; }); +/* harmony import */ var _itemFactories__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./itemFactories */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/itemFactories.js"); + +var createInnerPrefix = function createInnerPrefix(firstGroupEnd, innerGroupStart, pageFactory) { + var prefixPage = innerGroupStart - 1; + var showEllipsis = prefixPage !== firstGroupEnd + 1; + var prefixFactory = showEllipsis ? _itemFactories__WEBPACK_IMPORTED_MODULE_0__["createEllipsisItem"] : pageFactory; + return prefixFactory(prefixPage); +}; +var createInnerSuffix = function createInnerSuffix(innerGroupEnd, lastGroupStart, pageFactory) { + var suffixPage = innerGroupEnd + 1; + var showEllipsis = suffixPage !== lastGroupStart - 1; + var suffixFactory = showEllipsis ? _itemFactories__WEBPACK_IMPORTED_MODULE_0__["createEllipsisItem"] : pageFactory; + return suffixFactory(suffixPage); +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/customPropTypes.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/customPropTypes.js ***! + \***********************************************************************/ +/*! exports provided: domNode, suggest, disallow, every, givenProps, demand, multipleProp, contentShorthand, itemShorthand, collectionShorthand, deprecate, refObject, ref */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "domNode", function() { return domNode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "suggest", function() { return suggest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disallow", function() { return disallow; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "givenProps", function() { return givenProps; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "demand", function() { return demand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multipleProp", function() { return multipleProp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "contentShorthand", function() { return contentShorthand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "itemShorthand", function() { return itemShorthand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "collectionShorthand", function() { return collectionShorthand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deprecate", function() { return deprecate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refObject", function() { return refObject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ref", function() { return ref; }); +/* harmony import */ var lodash_es_difference__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/difference */ "./node_modules/lodash-es/difference.js"); +/* harmony import */ var lodash_es_trim__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/trim */ "./node_modules/lodash-es/trim.js"); +/* harmony import */ var lodash_es_isObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isObject */ "./node_modules/lodash-es/isObject.js"); +/* harmony import */ var lodash_es_pick__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/pick */ "./node_modules/lodash-es/pick.js"); +/* harmony import */ var lodash_es_keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/keys */ "./node_modules/lodash-es/keys.js"); +/* harmony import */ var lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/isPlainObject */ "./node_modules/lodash-es/isPlainObject.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_min__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/min */ "./node_modules/lodash-es/min.js"); +/* harmony import */ var lodash_es_sum__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es/sum */ "./node_modules/lodash-es/sum.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_sortBy__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lodash-es/sortBy */ "./node_modules/lodash-es/sortBy.js"); +/* harmony import */ var lodash_es_take__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash-es/take */ "./node_modules/lodash-es/take.js"); +/* harmony import */ var lodash_es_memoize__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! lodash-es/memoize */ "./node_modules/lodash-es/memoize.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var _leven__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./leven */ "./node_modules/semantic-ui-react/dist/es/lib/leven.js"); + + + + + + + + + + + + + + + + +var typeOf = function typeOf() { + var _Object$prototype$toS; + + return (_Object$prototype$toS = Object.prototype.toString).call.apply(_Object$prototype$toS, arguments); +}; +/** + * Ensure a prop is a valid DOM node. + */ + + +var domNode = function domNode(props, propName) { + // skip if prop is undefined + if (props[propName] === undefined) return; // short circle for SSR env + + if (typeof Element === 'undefined') return; // skip if prop is valid + + if (props[propName] instanceof Element) return; + return new Error("Invalid prop \"" + propName + "\" supplied, expected a DOM node."); +}; +/** + * Similar to PropTypes.oneOf but shows closest matches. + * Word order is ignored allowing `left chevron` to match `chevron left`. + * Useful for very large lists of options (e.g. Icon name, Flag name, etc.) + * @param {string[]} suggestions An array of allowed values. + */ + +var suggest = function suggest(suggestions) { + if (!Array.isArray(suggestions)) { + throw new Error('Invalid argument supplied to suggest, expected an instance of array.'); + } + /* eslint-disable max-nested-callbacks */ + + + var findBestSuggestions = Object(lodash_es_memoize__WEBPACK_IMPORTED_MODULE_12__["default"])(function (str) { + var propValueWords = str.split(' '); + return Object(lodash_es_take__WEBPACK_IMPORTED_MODULE_11__["default"])(Object(lodash_es_sortBy__WEBPACK_IMPORTED_MODULE_10__["default"])(Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(suggestions, function (suggestion) { + var suggestionWords = suggestion.split(' '); + + var propValueScore = Object(lodash_es_sum__WEBPACK_IMPORTED_MODULE_8__["default"])(Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(propValueWords, function (x) { + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(suggestionWords, function (y) { + return Object(_leven__WEBPACK_IMPORTED_MODULE_14__["default"])(x, y); + }); + }), lodash_es_min__WEBPACK_IMPORTED_MODULE_7__["default"])); + + var suggestionScore = Object(lodash_es_sum__WEBPACK_IMPORTED_MODULE_8__["default"])(Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(suggestionWords, function (x) { + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_9__["default"])(propValueWords, function (y) { + return Object(_leven__WEBPACK_IMPORTED_MODULE_14__["default"])(x, y); + }); + }), lodash_es_min__WEBPACK_IMPORTED_MODULE_7__["default"])); + + return { + suggestion: suggestion, + score: propValueScore + suggestionScore + }; + }), ['score', 'suggestion']), 3); + }); + /* eslint-enable max-nested-callbacks */ + // Convert the suggestions list into a hash map for O(n) lookup times. Ensure + // the words in each key are sorted alphabetically so that we have a consistent + // way of looking up a value in the map, i.e. we can sort the words in the + // incoming propValue and look that up without having to check all permutations. + + + var suggestionsLookup = suggestions.reduce(function (acc, key) { + acc[key.split(' ').sort().join(' ')] = true; + return acc; + }, {}); + return function (props, propName, componentName) { + var propValue = props[propName]; // skip if prop is undefined or is included in the suggestions + + if (!propValue || suggestionsLookup[propValue]) return; // check if the words were correct but ordered differently. + // Since we're matching for classNames we need to allow any word order + // to pass validation, e.g. `left chevron` vs `chevron left`. + + var propValueSorted = propValue.split(' ').sort().join(' '); + if (suggestionsLookup[propValueSorted]) return; // find best suggestions + + var bestMatches = findBestSuggestions(propValue); // skip if a match scored 0 + + if (bestMatches.some(function (x) { + return x.score === 0; + })) return; + return new Error(["Invalid prop `" + propName + "` of value `" + propValue + "` supplied to `" + componentName + "`.", "\n\nInstead of `" + propValue + "`, did you mean:", bestMatches.map(function (x) { + return "\n - " + x.suggestion; + }).join(''), '\n'].join('')); + }; +}; +/** + * Disallow other props from being defined with this prop. + * @param {string[]} disallowedProps An array of props that cannot be used with this prop. + */ + +var disallow = function disallow(disallowedProps) { + return function (props, propName, componentName) { + if (!Array.isArray(disallowedProps)) { + throw new Error(['Invalid argument supplied to disallow, expected an instance of array.', " See `" + propName + "` prop in `" + componentName + "`."].join('')); + } // skip if prop is undefined + + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__["default"])(props[propName]) || props[propName] === false) { + return; + } // find disallowed props with values + + + var disallowed = disallowedProps.reduce(function (acc, disallowedProp) { + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__["default"])(props[disallowedProp]) && props[disallowedProp] !== false) { + return [].concat(acc, [disallowedProp]); + } + + return acc; + }, []); + + if (disallowed.length > 0) { + return new Error(["Prop `" + propName + "` in `" + componentName + "` conflicts with props: `" + disallowed.join('`, `') + "`.", 'They cannot be defined together, choose one or the other.'].join(' ')); + } + }; +}; +/** + * Ensure a prop adherers to multiple prop type validators. + * @param {function[]} validators An array of propType functions. + */ + +var every = function every(validators) { + return function (props, propName, componentName) { + for (var _len = arguments.length, rest = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { + rest[_key - 3] = arguments[_key]; + } + + if (!Array.isArray(validators)) { + throw new Error(['Invalid argument supplied to every, expected an instance of array.', "See `" + propName + "` prop in `" + componentName + "`."].join(' ')); + } + + var errors = []; + validators.forEach(function (validator) { + if (typeof validator !== 'function') { + throw new Error("every() argument \"validators\" should contain functions, found: " + typeOf(validator) + "."); + } + + var error = validator.apply(void 0, [props, propName, componentName].concat(rest)); + + if (error) { + errors.push(error); + } + }); // we can only return one error at a time + + return errors[0]; + }; +}; +/** + * Ensure a validator passes only when a component has a given propsShape. + * @param {object} propsShape An object describing the prop shape. + * @param {function} validator A propType function. + */ + +var givenProps = function givenProps(propsShape, validator) { + return function (props, propName, componentName) { + for (var _len2 = arguments.length, rest = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) { + rest[_key2 - 3] = arguments[_key2]; + } + + if (!Object(lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_5__["default"])(propsShape)) { + throw new Error(['Invalid argument supplied to givenProps, expected an object.', "See `" + propName + "` prop in `" + componentName + "`."].join(' ')); + } + + if (typeof validator !== 'function') { + throw new Error(['Invalid argument supplied to givenProps, expected a function.', "See `" + propName + "` prop in `" + componentName + "`."].join(' ')); + } + + var shouldValidate = Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_4__["default"])(propsShape).every(function (key) { + var val = propsShape[key]; // require propShape validators to pass or prop values to match + + return typeof val === 'function' ? !val.apply(void 0, [props, key, componentName].concat(rest)) : val === props[propName]; + }); + + if (!shouldValidate) return; + var error = validator.apply(void 0, [props, propName, componentName].concat(rest)); + + if (error) { + // poor mans shallow pretty print, prevents JSON circular reference errors + var prettyProps = "{ " + Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(lodash_es_pick__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_4__["default"])(propsShape), props)).map(function (key) { + var val = props[key]; + var renderedValue = val; + if (typeof val === 'string') renderedValue = "\"" + val + "\"";else if (Array.isArray(val)) renderedValue = "[" + val.join(', ') + "]";else if (Object(lodash_es_isObject__WEBPACK_IMPORTED_MODULE_2__["default"])(val)) renderedValue = '{...}'; + return key + ": " + renderedValue; + }).join(', ') + " }"; + error.message = "Given props " + prettyProps + ": " + error.message; + return error; + } + }; +}; +/** + * Define prop dependencies by requiring other props. + * @param {string[]} requiredProps An array of required prop names. + */ + +var demand = function demand(requiredProps) { + return function (props, propName, componentName) { + if (!Array.isArray(requiredProps)) { + throw new Error(['Invalid `requiredProps` argument supplied to require, expected an instance of array.', " See `" + propName + "` prop in `" + componentName + "`."].join('')); + } // skip if prop is undefined + + + if (props[propName] === undefined) return; + var missingRequired = requiredProps.filter(function (requiredProp) { + return props[requiredProp] === undefined; + }); + + if (missingRequired.length > 0) { + return new Error("`" + propName + "` prop in `" + componentName + "` requires props: `" + missingRequired.join('`, `') + "`."); + } + }; +}; +/** + * Ensure an multiple prop contains a string with only possible values. + * @param {string[]} possible An array of possible values to prop. + */ + +var multipleProp = function multipleProp(possible) { + return function (props, propName, componentName) { + if (!Array.isArray(possible)) { + throw new Error(['Invalid argument supplied to some, expected an instance of array.', "See `" + propName + "` prop in `" + componentName + "`."].join(' ')); + } + + var propValue = props[propName]; // skip if prop is undefined + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_6__["default"])(propValue) || propValue === false) return; + var values = propValue.replace('large screen', 'large-screen').replace(/ vertically/g, '-vertically').split(' ').map(function (val) { + return Object(lodash_es_trim__WEBPACK_IMPORTED_MODULE_1__["default"])(val).replace('-', ' '); + }); + + var invalid = Object(lodash_es_difference__WEBPACK_IMPORTED_MODULE_0__["default"])(values, possible); // fail only if there are invalid values + + + if (invalid.length > 0) { + return new Error("`" + propName + "` prop in `" + componentName + "` has invalid values: `" + invalid.join('`, `') + "`."); + } + }; +}; +/** + * Ensure a component can render as a node passed as a prop value in place of children. + */ + +var contentShorthand = function contentShorthand() { + return every([disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.node]).apply(void 0, arguments); +}; +/** + * Item shorthand is a description of a component that can be a literal, + * a props object, or an element. + */ + +var itemShorthand = function itemShorthand() { + return every([disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.object]))])]).apply(void 0, arguments); +}; +/** + * Collection shorthand ensures a prop is an array of item shorthand. + */ + +var collectionShorthand = function collectionShorthand() { + return every([disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.arrayOf(itemShorthand)]).apply(void 0, arguments); +}; +/** + * Show a deprecated warning for component props with a help message and optional validator. + * @param {string} help A help message to display with the deprecation warning. + * @param {function} [validator] A propType function. + */ + +var deprecate = function deprecate(help, validator) { + return function (props, propName, componentName) { + if (typeof help !== 'string') { + throw new Error(['Invalid `help` argument supplied to deprecate, expected a string.', "See `" + propName + "` prop in `" + componentName + "`."].join(' ')); + } // skip if prop is undefined + + + if (props[propName] === undefined) return; // deprecation error and help + + var error = new Error("The `" + propName + "` prop in `" + componentName + "` is deprecated."); + if (help) error.message += " " + help; // add optional validation error message + + if (validator) { + if (typeof validator === 'function') { + for (var _len3 = arguments.length, args = new Array(_len3 > 3 ? _len3 - 3 : 0), _key3 = 3; _key3 < _len3; _key3++) { + args[_key3 - 3] = arguments[_key3]; + } + + var validationError = validator.apply(void 0, [props, propName, componentName].concat(args)); + + if (validationError) { + error.message = error.message + " " + validationError.message; + } + } else { + throw new Error(['Invalid argument supplied to deprecate, expected a function.', "See `" + propName + "` prop in `" + componentName + "`."].join(' ')); + } + } + + return error; + }; +}; +/** A checker that matches the React.RefObject type. */ + +var refObject = prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.shape({ + current: prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.object +}); +/** A checker that matches the React.Ref type. */ + +var ref = prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_13___default.a.func, refObject]); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/doesNodeContainClick.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/doesNodeContainClick.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var lodash_es_inRange__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/inRange */ "./node_modules/lodash-es/inRange.js"); +/* harmony import */ var lodash_es_first__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/first */ "./node_modules/lodash-es/first.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_some__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/some */ "./node_modules/lodash-es/some.js"); + + + + + + +/** + * Determines if a click's coordinates are within the bounds of a node. + * + * @see https://github.com/Semantic-Org/Semantic-UI-React/pull/2384 + * + * @param {object} node - A DOM node. + * @param {object} e - A SyntheticEvent or DOM Event. + * @returns {boolean} + */ +var doesNodeContainClick = function doesNodeContainClick(node, e) { + if (Object(lodash_es_some__WEBPACK_IMPORTED_MODULE_4__["default"])([e, node], lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])) return false; // if there is an e.target and it is in the document, use a simple node.contains() check + + if (e.target) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(e.target, 'setAttribute', 'data-suir-click-target', true); + + if (document.querySelector('[data-suir-click-target=true]')) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(e.target, 'removeAttribute', 'data-suir-click-target'); + + return node.contains(e.target); + } + } // Below logic handles cases where the e.target is no longer in the document. + // The result of the click likely has removed the e.target node. + // Instead of node.contains(), we'll identify the click by X/Y position. + // return early if the event properties aren't available + // prevent measuring the node and repainting if we don't need to + + + var clientX = e.clientX, + clientY = e.clientY; + if (Object(lodash_es_some__WEBPACK_IMPORTED_MODULE_4__["default"])([clientX, clientY], lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])) return false; // false if the node is not visible + + var clientRects = node.getClientRects(); // Heads Up! + // getClientRects returns a DOMRectList, not an array nor a plain object + // We explicitly avoid _.isEmpty and check .length to cover all possible shapes + + if (!node.offsetWidth || !node.offsetHeight || !clientRects || !clientRects.length) return false; // false if the node doesn't have a valid bounding rect + + var _first2 = Object(lodash_es_first__WEBPACK_IMPORTED_MODULE_1__["default"])(clientRects), + top = _first2.top, + bottom = _first2.bottom, + left = _first2.left, + right = _first2.right; + + if (Object(lodash_es_some__WEBPACK_IMPORTED_MODULE_4__["default"])([top, bottom, left, right], lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])) return false; // we add a small decimal to the upper bound just to make it inclusive + // don't add an whole pixel (1) as the event/node values may be decimal sensitive + + return Object(lodash_es_inRange__WEBPACK_IMPORTED_MODULE_0__["default"])(clientY, top, bottom + 0.001) && Object(lodash_es_inRange__WEBPACK_IMPORTED_MODULE_0__["default"])(clientX, left, right + 0.001); +}; + +/* harmony default export */ __webpack_exports__["default"] = (doesNodeContainClick); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/eventStack/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/eventStack/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @semantic-ui-react/event-stack */ "./node_modules/@semantic-ui-react/event-stack/lib/index.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_0__); + +/* harmony default export */ __webpack_exports__["default"] = (_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_0__["instance"]); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/factories.js": +/*!*****************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/factories.js ***! + \*****************************************************************/ +/*! exports provided: createShorthand, createShorthandFactory, createHTMLDivision, createHTMLIframe, createHTMLImage, createHTMLInput, createHTMLLabel, createHTMLParagraph */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createShorthand", function() { return createShorthand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createShorthandFactory", function() { return createShorthandFactory; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createHTMLDivision", function() { return createHTMLDivision; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createHTMLIframe", function() { return createHTMLIframe; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createHTMLImage", function() { return createHTMLImage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createHTMLInput", function() { return createHTMLInput; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createHTMLLabel", function() { return createHTMLLabel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createHTMLParagraph", function() { return createHTMLParagraph; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_uniq__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/uniq */ "./node_modules/lodash-es/uniq.js"); +/* harmony import */ var lodash_es_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isArray */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isPlainObject */ "./node_modules/lodash-es/isPlainObject.js"); +/* harmony import */ var lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/isFunction */ "./node_modules/lodash-es/isFunction.js"); +/* harmony import */ var lodash_es_isNumber__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/isNumber */ "./node_modules/lodash-es/isNumber.js"); +/* harmony import */ var lodash_es_isString__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isString */ "./node_modules/lodash-es/isString.js"); +/* harmony import */ var lodash_es_isBoolean__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/isBoolean */ "./node_modules/lodash-es/isBoolean.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_10__); + + + + + + + + + + + +var DEPRECATED_CALLS = {}; // ============================================================ +// Factories +// ============================================================ + +/** + * A more robust React.createElement. It can create elements from primitive values. + * + * @param {function|string} Component A ReactClass or string + * @param {function} mapValueToProps A function that maps a primitive value to the Component props + * @param {string|object|function} val The value to create a ReactElement from + * @param {Object} [options={}] + * @param {object} [options.defaultProps={}] Default props object + * @param {object|function} [options.overrideProps={}] Override props object or function (called with regular props) + * @param {boolean} [options.autoGenerateKey=true] Whether or not automatic key generation is allowed + * @returns {object|null} + */ + +function createShorthand(Component, mapValueToProps, val, options) { + if (options === void 0) { + options = {}; + } + + if (typeof Component !== 'function' && typeof Component !== 'string') { + throw new Error('createShorthand() Component must be a string or function.'); + } // short circuit noop values + + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_8__["default"])(val) || Object(lodash_es_isBoolean__WEBPACK_IMPORTED_MODULE_7__["default"])(val)) { + return null; + } + + var valIsString = Object(lodash_es_isString__WEBPACK_IMPORTED_MODULE_6__["default"])(val); + + var valIsNumber = Object(lodash_es_isNumber__WEBPACK_IMPORTED_MODULE_5__["default"])(val); + + var valIsFunction = Object(lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_4__["default"])(val); + + var valIsReactElement = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__["isValidElement"](val); + + var valIsPropsObject = Object(lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_3__["default"])(val); + + var valIsPrimitiveValue = valIsString || valIsNumber || Object(lodash_es_isArray__WEBPACK_IMPORTED_MODULE_2__["default"])(val); // unhandled type return null + + /* eslint-disable no-console */ + + + if (!valIsFunction && !valIsReactElement && !valIsPropsObject && !valIsPrimitiveValue) { + if (true) { + console.error(['Shorthand value must be a string|number|array|object|ReactElement|function.', ' Use null|undefined|boolean for none', " Received " + typeof val + "."].join('')); + } + + return null; + } + /* eslint-enable no-console */ + // ---------------------------------------- + // Build up props + // ---------------------------------------- + + + var _options = options, + _options$defaultProps = _options.defaultProps, + defaultProps = _options$defaultProps === void 0 ? {} : _options$defaultProps; // User's props + + var usersProps = valIsReactElement && val.props || valIsPropsObject && val || valIsPrimitiveValue && mapValueToProps(val); // Override props + + var _options2 = options, + _options2$overridePro = _options2.overrideProps, + overrideProps = _options2$overridePro === void 0 ? {} : _options2$overridePro; + overrideProps = Object(lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_4__["default"])(overrideProps) ? overrideProps(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, defaultProps, usersProps)) : overrideProps; // Merge props + + /* eslint-disable react/prop-types */ + + var props = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, defaultProps, usersProps, overrideProps); // Merge className + + + if (defaultProps.className || overrideProps.className || usersProps.className) { + var mergedClassesNames = Object(clsx__WEBPACK_IMPORTED_MODULE_9__["default"])(defaultProps.className, overrideProps.className, usersProps.className); + props.className = Object(lodash_es_uniq__WEBPACK_IMPORTED_MODULE_1__["default"])(mergedClassesNames.split(' ')).join(' '); + } // Merge style + + + if (defaultProps.style || overrideProps.style || usersProps.style) { + props.style = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, defaultProps.style, usersProps.style, overrideProps.style); + } // ---------------------------------------- + // Get key + // ---------------------------------------- + // Use key, childKey, or generate key + + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_8__["default"])(props.key)) { + var childKey = props.childKey; + var _options3 = options, + _options3$autoGenerat = _options3.autoGenerateKey, + autoGenerateKey = _options3$autoGenerat === void 0 ? true : _options3$autoGenerat; + + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_8__["default"])(childKey)) { + // apply and consume the childKey + props.key = typeof childKey === 'function' ? childKey(props) : childKey; + delete props.childKey; + } else if (autoGenerateKey && (valIsString || valIsNumber)) { + // use string/number shorthand values as the key + props.key = val; + } + } // ---------------------------------------- + // Create Element + // ---------------------------------------- + // Clone ReactElements + + + if (valIsReactElement) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__["cloneElement"](val, props); + } + + if (typeof props.children === 'function') { + return props.children(Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, props, { + children: undefined + })); + } // Create ReactElements from built up props + + + if (valIsPrimitiveValue || valIsPropsObject) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_10__["createElement"](Component, props); + } // Call functions with args similar to createElement() + // TODO: V3 remove the implementation + + + if (valIsFunction) { + if (true) { + if (!DEPRECATED_CALLS[Component]) { + DEPRECATED_CALLS[Component] = true; // eslint-disable-next-line no-console + + console.warn("Warning: There is a deprecated shorthand function usage for \"" + Component + "\". It is deprecated and will be removed in v3 release. Please follow our upgrade guide: https://github.com/Semantic-Org/Semantic-UI-React/pull/4029"); + } + } + + return val(Component, props, props.children); + } + /* eslint-enable react/prop-types */ + +} // ============================================================ +// Factory Creators +// ============================================================ + +/** + * Creates a `createShorthand` function that is waiting for a value and options. + * + * @param {function|string} Component A ReactClass or string + * @param {function} mapValueToProps A function that maps a primitive value to the Component props + * @returns {function} A shorthand factory function waiting for `val` and `defaultProps`. + */ + +function createShorthandFactory(Component, mapValueToProps) { + if (typeof Component !== 'function' && typeof Component !== 'string') { + throw new Error('createShorthandFactory() Component must be a string or function.'); + } + + return function (val, options) { + return createShorthand(Component, mapValueToProps, val, options); + }; +} // ============================================================ +// HTML Factories +// ============================================================ + +var createHTMLDivision = /* #__PURE__ */createShorthandFactory('div', function (val) { + return { + children: val + }; +}); +var createHTMLIframe = /* #__PURE__ */createShorthandFactory('iframe', function (src) { + return { + src: src + }; +}); +var createHTMLImage = /* #__PURE__ */createShorthandFactory('img', function (val) { + return { + src: val + }; +}); +var createHTMLInput = /* #__PURE__ */createShorthandFactory('input', function (val) { + return { + type: val + }; +}); +var createHTMLLabel = /* #__PURE__ */createShorthandFactory('label', function (val) { + return { + children: val + }; +}); +var createHTMLParagraph = /* #__PURE__ */createShorthandFactory('p', function (val) { + return { + children: val + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/getElementType.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/getElementType.js ***! + \**********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Returns a createElement() type based on the props of the Component. + * Useful for calculating what type a component should render as. + * + * @param {function} Component A function or ReactClass. + * @param {object} props A ReactElement props object + * @param {function} [getDefault] A function that returns a default element type. + * @returns {string|function} A ReactElement type + */ +function getElementType(Component, props, getDefault) { + var _Component$defaultPro = Component.defaultProps, + defaultProps = _Component$defaultPro === void 0 ? {} : _Component$defaultPro; // ---------------------------------------- + // user defined "as" element type + + if (props.as && props.as !== defaultProps.as) return props.as; // ---------------------------------------- + // computed default element type + + if (getDefault) { + var computedDefault = getDefault(); + if (computedDefault) return computedDefault; + } // ---------------------------------------- + // infer anchor links + + + if (props.href) return 'a'; // ---------------------------------------- + // use defaultProp or 'div' + + return defaultProps.as || 'div'; +} + +/* harmony default export */ __webpack_exports__["default"] = (getElementType); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/getUnhandledProps.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/getUnhandledProps.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Returns an object consisting of props beyond the scope of the Component. + * Useful for getting and spreading unknown props from the user. + * @param {function} Component A function or ReactClass. + * @param {object} props A ReactElement props object + * @returns {{}} A shallow copy of the prop object + */ +var getUnhandledProps = function getUnhandledProps(Component, props) { + // Note that `handledProps` are generated automatically during build with `babel-plugin-transform-react-handled-props` + var _Component$handledPro = Component.handledProps, + handledProps = _Component$handledPro === void 0 ? [] : _Component$handledPro; + return Object.keys(props).reduce(function (acc, prop) { + if (prop === 'childKey') return acc; + if (handledProps.indexOf(prop) === -1) acc[prop] = props[prop]; + return acc; + }, {}); +}; + +/* harmony default export */ __webpack_exports__["default"] = (getUnhandledProps); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/hooks/useClassNamesOnNode.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/hooks/useClassNamesOnNode.js ***! + \*********************************************************************************/ +/*! exports provided: computeClassNames, computeClassNamesDifference, handleClassNamesChange, NodeRegistry, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeClassNames", function() { return computeClassNames; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeClassNamesDifference", function() { return computeClassNamesDifference; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "handleClassNamesChange", function() { return handleClassNamesChange; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NodeRegistry", function() { return NodeRegistry; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return useClassNamesOnNode; }); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./useIsomorphicLayoutEffect */ "./node_modules/semantic-ui-react/dist/es/lib/hooks/useIsomorphicLayoutEffect.js"); + + + +var CLASS_NAME_DELITIMITER = /\s+/; +/** + * Accepts a set of ref objects that contain classnames as a string and returns an array of unique + * classNames. + * + * @param {Set<React.RefObject>|undefined} classNameRefs + * @returns String[] + */ + +function computeClassNames(classNameRefs) { + var classNames = []; + + if (classNameRefs) { + classNameRefs.forEach(function (classNameRef) { + if (typeof classNameRef.current === 'string') { + var classNamesForRef = classNameRef.current.split(CLASS_NAME_DELITIMITER); + classNamesForRef.forEach(function (className) { + classNames.push(className); + }); + } + }); + return classNames.filter(function (className, i, array) { + return className.length > 0 && array.indexOf(className) === i; + }); + } + + return []; +} +/** + * Computes classnames that should be removed and added to a node based on input differences. + * + * @param {String[]} prevClassNames + * @param {String[]} currentClassNames + */ + +function computeClassNamesDifference(prevClassNames, currentClassNames) { + return [currentClassNames.filter(function (className) { + return prevClassNames.indexOf(className) === -1; + }), prevClassNames.filter(function (className) { + return currentClassNames.indexOf(className) === -1; + })]; +} +var prevClassNames = new Map(); +/** + * @param {HTMLElement} node + * @param {Set<React.RefObject>|undefined} classNameRefs + */ + +var handleClassNamesChange = function handleClassNamesChange(node, classNameRefs) { + var currentClassNames = computeClassNames(classNameRefs); + + var _computeClassNamesDif = computeClassNamesDifference(prevClassNames.get(node) || [], currentClassNames), + forAdd = _computeClassNamesDif[0], + forRemoval = _computeClassNamesDif[1]; + + if (node) { + forAdd.forEach(function (className) { + return node.classList.add(className); + }); + forRemoval.forEach(function (className) { + return node.classList.remove(className); + }); + } + + prevClassNames.set(node, currentClassNames); +}; +var NodeRegistry = function NodeRegistry() { + var _this = this; + + this.add = function (node, classNameRef) { + if (_this.nodes.has(node)) { + var _set = _this.nodes.get(node); + + _set.add(classNameRef); + + return; + } // IE11 does not support constructor params + + + var set = new Set(); + set.add(classNameRef); + + _this.nodes.set(node, set); + }; + + this.del = function (node, classNameRef) { + if (!_this.nodes.has(node)) { + return; + } + + var set = _this.nodes.get(node); + + if (set.size === 1) { + _this.nodes.delete(node); + + return; + } + + set.delete(classNameRef); + }; + + this.emit = function (node, callback) { + callback(node, _this.nodes.get(node)); + }; + + this.nodes = new Map(); +}; +var nodeRegistry = new NodeRegistry(); +/** + * A React hooks that allows to manage classNames on a DOM node in declarative manner. Accepts + * a HTML element or React ref objects with it. + * + * @param {HTMLElement|React.RefObject} node + * @param {String} className + */ + +function useClassNamesOnNode(node, className) { + var classNameRef = react__WEBPACK_IMPORTED_MODULE_1___default.a.useRef(); + var isMounted = react__WEBPACK_IMPORTED_MODULE_1___default.a.useRef(false); + Object(_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { + classNameRef.current = className; + + if (isMounted.current) { + var element = Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_0__["isRefObject"])(node) ? node.current : node; + nodeRegistry.emit(element, handleClassNamesChange); + } + + isMounted.current = true; + }, [className]); + Object(_useIsomorphicLayoutEffect__WEBPACK_IMPORTED_MODULE_2__["default"])(function () { + var element = Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_0__["isRefObject"])(node) ? node.current : node; + nodeRegistry.add(element, classNameRef); + nodeRegistry.emit(element, handleClassNamesChange); + return function () { + nodeRegistry.del(element, classNameRef); + nodeRegistry.emit(element, handleClassNamesChange); + }; + }, [node]); +} + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/hooks/useIsomorphicLayoutEffect.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/hooks/useIsomorphicLayoutEffect.js ***! + \***************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _isBrowser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../isBrowser */ "./node_modules/semantic-ui-react/dist/es/lib/isBrowser.js"); + + // useLayoutEffect() produces a warning with SSR rendering +// https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a + +var useIsomorphicLayoutEffect = Object(_isBrowser__WEBPACK_IMPORTED_MODULE_1__["default"])() && "development" !== 'test' ? react__WEBPACK_IMPORTED_MODULE_0___default.a.useLayoutEffect : react__WEBPACK_IMPORTED_MODULE_0___default.a.useEffect; +/* harmony default export */ __webpack_exports__["default"] = (useIsomorphicLayoutEffect); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/htmlPropsUtils.js": +/*!**********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/htmlPropsUtils.js ***! + \**********************************************************************/ +/*! exports provided: htmlInputAttrs, htmlInputEvents, htmlInputProps, htmlImageProps, partitionHTMLProps */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlInputAttrs", function() { return htmlInputAttrs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlInputEvents", function() { return htmlInputEvents; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlInputProps", function() { return htmlInputProps; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "htmlImageProps", function() { return htmlImageProps; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partitionHTMLProps", function() { return partitionHTMLProps; }); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_forEach__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/forEach */ "./node_modules/lodash-es/forEach.js"); + + +var htmlInputAttrs = [// REACT +'selected', 'defaultValue', 'defaultChecked', // LIMITED HTML PROPS +'accept', 'autoCapitalize', 'autoComplete', 'autoCorrect', 'autoFocus', 'checked', 'disabled', 'form', 'id', 'inputMode', 'lang', 'list', 'max', 'maxLength', 'min', 'minLength', 'multiple', 'name', 'pattern', 'placeholder', 'readOnly', 'required', 'step', 'title', 'type', 'value']; +var htmlInputEvents = [// EVENTS +// keyboard +'onKeyDown', 'onKeyPress', 'onKeyUp', // focus +'onFocus', 'onBlur', // form +'onChange', 'onInput', // mouse +'onClick', 'onContextMenu', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragExit', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', // selection +'onSelect', // touch +'onTouchCancel', 'onTouchEnd', 'onTouchMove', 'onTouchStart']; +var htmlInputProps = [].concat(htmlInputAttrs, htmlInputEvents); +var htmlImageProps = ['alt', 'height', 'src', 'srcSet', 'width', 'loading']; +/** + * Returns an array of objects consisting of: props of html input element and rest. + * @param {object} props A ReactElement props object + * @param {Object} [options={}] + * @param {Array} [options.htmlProps] An array of html input props + * @param {boolean} [options.includeAria] Includes all input props that starts with "aria-" + * @returns {[{}, {}]} An array of objects + */ + +var partitionHTMLProps = function partitionHTMLProps(props, options) { + if (options === void 0) { + options = {}; + } + + var _options = options, + _options$htmlProps = _options.htmlProps, + htmlProps = _options$htmlProps === void 0 ? htmlInputProps : _options$htmlProps, + _options$includeAria = _options.includeAria, + includeAria = _options$includeAria === void 0 ? true : _options$includeAria; + var inputProps = {}; + var rest = {}; + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_1__["default"])(props, function (val, prop) { + var possibleAria = includeAria && (/^aria-.*$/.test(prop) || prop === 'role'); + var target = Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_0__["default"])(htmlProps, prop) || possibleAria ? inputProps : rest; + target[prop] = val; + }); + + return [inputProps, rest]; +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/index.js": +/*!*************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/index.js ***! + \*************************************************************/ +/*! exports provided: ModernAutoControlledComponent, childrenUtils, useKeyOnly, useKeyOrValueAndKey, useValueAndKey, useMultipleProp, useTextAlignProp, useVerticalAlignProp, useWidthProp, customPropTypes, eventStack, createShorthand, createShorthandFactory, createHTMLDivision, createHTMLIframe, createHTMLImage, createHTMLInput, createHTMLLabel, createHTMLParagraph, getUnhandledProps, getElementType, htmlInputAttrs, htmlInputEvents, htmlInputProps, htmlImageProps, partitionHTMLProps, isBrowser, doesNodeContainClick, leven, createPaginationItems, SUI, numberToWordMap, numberToWord, normalizeOffset, normalizeTransitionDuration, objectDiff, useClassNamesOnNode */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _ModernAutoControlledComponent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ModernAutoControlledComponent */ "./node_modules/semantic-ui-react/dist/es/lib/ModernAutoControlledComponent.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ModernAutoControlledComponent", function() { return _ModernAutoControlledComponent__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + +/* harmony import */ var _childrenUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./childrenUtils */ "./node_modules/semantic-ui-react/dist/es/lib/childrenUtils.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "childrenUtils", function() { return _childrenUtils__WEBPACK_IMPORTED_MODULE_1__; }); +/* harmony import */ var _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./classNameBuilders */ "./node_modules/semantic-ui-react/dist/es/lib/classNameBuilders.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useKeyOnly", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useKeyOnly"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useKeyOrValueAndKey", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useKeyOrValueAndKey"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useValueAndKey", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useValueAndKey"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useMultipleProp", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useMultipleProp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useTextAlignProp", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useTextAlignProp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useVerticalAlignProp", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useVerticalAlignProp"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useWidthProp", function() { return _classNameBuilders__WEBPACK_IMPORTED_MODULE_2__["useWidthProp"]; }); + +/* harmony import */ var _customPropTypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./customPropTypes */ "./node_modules/semantic-ui-react/dist/es/lib/customPropTypes.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "customPropTypes", function() { return _customPropTypes__WEBPACK_IMPORTED_MODULE_3__; }); +/* harmony import */ var _eventStack__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventStack */ "./node_modules/semantic-ui-react/dist/es/lib/eventStack/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eventStack", function() { return _eventStack__WEBPACK_IMPORTED_MODULE_4__["default"]; }); + +/* harmony import */ var _factories__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./factories */ "./node_modules/semantic-ui-react/dist/es/lib/factories.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createShorthand", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createShorthand"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createShorthandFactory", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createHTMLDivision", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createHTMLDivision"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createHTMLIframe", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createHTMLIframe"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createHTMLImage", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createHTMLImage"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createHTMLInput", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createHTMLInput"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createHTMLLabel", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createHTMLLabel"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createHTMLParagraph", function() { return _factories__WEBPACK_IMPORTED_MODULE_5__["createHTMLParagraph"]; }); + +/* harmony import */ var _getUnhandledProps__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getUnhandledProps */ "./node_modules/semantic-ui-react/dist/es/lib/getUnhandledProps.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getUnhandledProps", function() { return _getUnhandledProps__WEBPACK_IMPORTED_MODULE_6__["default"]; }); + +/* harmony import */ var _getElementType__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./getElementType */ "./node_modules/semantic-ui-react/dist/es/lib/getElementType.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getElementType", function() { return _getElementType__WEBPACK_IMPORTED_MODULE_7__["default"]; }); + +/* harmony import */ var _htmlPropsUtils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./htmlPropsUtils */ "./node_modules/semantic-ui-react/dist/es/lib/htmlPropsUtils.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlInputAttrs", function() { return _htmlPropsUtils__WEBPACK_IMPORTED_MODULE_8__["htmlInputAttrs"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlInputEvents", function() { return _htmlPropsUtils__WEBPACK_IMPORTED_MODULE_8__["htmlInputEvents"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlInputProps", function() { return _htmlPropsUtils__WEBPACK_IMPORTED_MODULE_8__["htmlInputProps"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "htmlImageProps", function() { return _htmlPropsUtils__WEBPACK_IMPORTED_MODULE_8__["htmlImageProps"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partitionHTMLProps", function() { return _htmlPropsUtils__WEBPACK_IMPORTED_MODULE_8__["partitionHTMLProps"]; }); + +/* harmony import */ var _isBrowser__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./isBrowser */ "./node_modules/semantic-ui-react/dist/es/lib/isBrowser.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isBrowser", function() { return _isBrowser__WEBPACK_IMPORTED_MODULE_9__["default"]; }); + +/* harmony import */ var _doesNodeContainClick__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./doesNodeContainClick */ "./node_modules/semantic-ui-react/dist/es/lib/doesNodeContainClick.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "doesNodeContainClick", function() { return _doesNodeContainClick__WEBPACK_IMPORTED_MODULE_10__["default"]; }); + +/* harmony import */ var _leven__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./leven */ "./node_modules/semantic-ui-react/dist/es/lib/leven.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "leven", function() { return _leven__WEBPACK_IMPORTED_MODULE_11__["default"]; }); + +/* harmony import */ var _createPaginationItems__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./createPaginationItems */ "./node_modules/semantic-ui-react/dist/es/lib/createPaginationItems/index.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "createPaginationItems", function() { return _createPaginationItems__WEBPACK_IMPORTED_MODULE_12__["default"]; }); + +/* harmony import */ var _SUI__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./SUI */ "./node_modules/semantic-ui-react/dist/es/lib/SUI.js"); +/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "SUI", function() { return _SUI__WEBPACK_IMPORTED_MODULE_13__; }); +/* harmony import */ var _numberToWord__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./numberToWord */ "./node_modules/semantic-ui-react/dist/es/lib/numberToWord.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "numberToWordMap", function() { return _numberToWord__WEBPACK_IMPORTED_MODULE_14__["numberToWordMap"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "numberToWord", function() { return _numberToWord__WEBPACK_IMPORTED_MODULE_14__["numberToWord"]; }); + +/* harmony import */ var _normalizeOffset__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./normalizeOffset */ "./node_modules/semantic-ui-react/dist/es/lib/normalizeOffset.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizeOffset", function() { return _normalizeOffset__WEBPACK_IMPORTED_MODULE_15__["default"]; }); + +/* harmony import */ var _normalizeTransitionDuration__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./normalizeTransitionDuration */ "./node_modules/semantic-ui-react/dist/es/lib/normalizeTransitionDuration.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "normalizeTransitionDuration", function() { return _normalizeTransitionDuration__WEBPACK_IMPORTED_MODULE_16__["default"]; }); + +/* harmony import */ var _objectDiff__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./objectDiff */ "./node_modules/semantic-ui-react/dist/es/lib/objectDiff.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "objectDiff", function() { return _objectDiff__WEBPACK_IMPORTED_MODULE_17__["default"]; }); + +/* harmony import */ var _hooks_useClassNamesOnNode__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./hooks/useClassNamesOnNode */ "./node_modules/semantic-ui-react/dist/es/lib/hooks/useClassNamesOnNode.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "useClassNamesOnNode", function() { return _hooks_useClassNamesOnNode__WEBPACK_IMPORTED_MODULE_18__["default"]; }); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // Heads up! We import/export for this module to safely remove it with "babel-plugin-filter-imports" + +// +// Hooks +// + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/isBrowser.js": +/*!*****************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/isBrowser.js ***! + \*****************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); + +var hasDocument = typeof document === 'object' && document !== null; +var hasWindow = typeof window === 'object' && window !== null && window.self === window; // eslint-disable-next-line no-confusing-arrow + +var isBrowser = function isBrowser() { + return !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_0__["default"])(isBrowser.override) ? isBrowser.override : hasDocument && hasWindow; +}; + +/* harmony default export */ __webpack_exports__["default"] = (isBrowser); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/leven.js": +/*!*************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/leven.js ***! + \*************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +// Copy of sindre's leven, wrapped in dead code elimination for production +// https://github.com/sindresorhus/leven/blob/master/index.js + +/* eslint-disable complexity, import/no-mutable-exports, no-multi-assign, no-nested-ternary, no-plusplus */ +var leven = function leven() { + return 0; +}; + +if (true) { + var arr = []; + var charCodeCache = []; + + leven = function leven(a, b) { + if (a === b) return 0; + var aLen = a.length; + var bLen = b.length; + if (aLen === 0) return bLen; + if (bLen === 0) return aLen; + var bCharCode; + var ret; + var tmp; + var tmp2; + var i = 0; + var j = 0; + + while (i < aLen) { + charCodeCache[i] = a.charCodeAt(i); + arr[i] = ++i; + } + + while (j < bLen) { + bCharCode = b.charCodeAt(j); + tmp = j++; + ret = j; + + for (i = 0; i < aLen; i++) { + tmp2 = bCharCode === charCodeCache[i] ? tmp : tmp + 1; + tmp = arr[i]; + ret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2; + } + } + + return ret; + }; +} + +/* harmony default export */ __webpack_exports__["default"] = (leven); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/normalizeOffset.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/normalizeOffset.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Normalizes the offset value. + * @param {number|array} value The value to normalize. + * @returns {number} + */ +/* harmony default export */ __webpack_exports__["default"] = (function (value) { + return typeof value === 'number' || typeof value === 'string' ? [value, value] : value; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/normalizeTransitionDuration.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/normalizeTransitionDuration.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/** + * Normalizes the duration of a transition. + * @param {number|object} duration The value to normalize. + * @param {'hide'|'show'} type The type of transition. + * @returns {number} + */ +/* harmony default export */ __webpack_exports__["default"] = (function (duration, type) { + return typeof duration === 'number' || typeof duration === 'string' ? duration : duration[type]; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/numberToWord.js": +/*!********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/numberToWord.js ***! + \********************************************************************/ +/*! exports provided: numberToWordMap, numberToWord */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "numberToWordMap", function() { return numberToWordMap; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "numberToWord", function() { return numberToWord; }); +var numberToWordMap = { + 1: 'one', + 2: 'two', + 3: 'three', + 4: 'four', + 5: 'five', + 6: 'six', + 7: 'seven', + 8: 'eight', + 9: 'nine', + 10: 'ten', + 11: 'eleven', + 12: 'twelve', + 13: 'thirteen', + 14: 'fourteen', + 15: 'fifteen', + 16: 'sixteen' +}; +/** + * Return the number word for numbers 1-16. + * Returns strings or numbers as is if there is no corresponding word. + * Returns an empty string if value is not a string or number. + * @param {string|number} value The value to convert to a word. + * @returns {string} + */ + +function numberToWord(value) { + var type = typeof value; + + if (type === 'string' || type === 'number') { + return numberToWordMap[value] || value; + } + + return ''; +} + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/lib/objectDiff.js": +/*!******************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/lib/objectDiff.js ***! + \******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var lodash_es_isEqual__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/isEqual */ "./node_modules/lodash-es/isEqual.js"); +/* harmony import */ var lodash_es_has__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/has */ "./node_modules/lodash-es/has.js"); +/* harmony import */ var lodash_es_transform__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/transform */ "./node_modules/lodash-es/transform.js"); + + + + +/** + * Naive and inefficient object difference, intended for development / debugging use only. + * Deleted keys are shown as [DELETED]. + * @param {{}} source The source object + * @param {{}} target The target object. + * @returns {{}} A new object containing new/modified/deleted keys. + * @example + * import { objectDiff } from 'src/lib' + * + * const a = { key: 'val', foo: 'bar' } + * const b = { key: 'val', foo: 'baz' } + * + * objectDiff(a, b) + * //=> { foo: 'baz' } + */ +/* harmony default export */ __webpack_exports__["default"] = (function (source, target) { + return Object(lodash_es_transform__WEBPACK_IMPORTED_MODULE_2__["default"])(source, function (res, val, key) { + // deleted keys + if (!Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_1__["default"])(target, key)) res[key] = '[DELETED]'; // new keys / changed values + // Note, we tolerate isEqual here as this is a dev only utility and not included in production code + else if (!Object(lodash_es_isEqual__WEBPACK_IMPORTED_MODULE_0__["default"])(val, target[key])) res[key] = target[key]; + }, {}); +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/Accordion.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Accordion/Accordion.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _AccordionAccordion__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AccordionAccordion */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionAccordion.js"); +/* harmony import */ var _AccordionContent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./AccordionContent */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionContent.js"); +/* harmony import */ var _AccordionPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./AccordionPanel */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionPanel.js"); +/* harmony import */ var _AccordionTitle__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./AccordionTitle */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionTitle.js"); + + + + + + + + + +/** + * An accordion allows users to toggle the display of sections of content. + */ + +function Accordion(props) { + var className = props.className, + fluid = props.fluid, + inverted = props.inverted, + styled = props.styled; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(styled, 'styled'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Accordion, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_AccordionAccordion__WEBPACK_IMPORTED_MODULE_5__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + })); +} + +Accordion.handledProps = ["className", "fluid", "inverted", "styled"]; +Accordion.propTypes = true ? { + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Format to take up the width of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Format for dark backgrounds. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Adds some basic styling to accordion panels. */ + styled: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +Accordion.Accordion = _AccordionAccordion__WEBPACK_IMPORTED_MODULE_5__["default"]; +Accordion.Content = _AccordionContent__WEBPACK_IMPORTED_MODULE_6__["default"]; +Accordion.Panel = _AccordionPanel__WEBPACK_IMPORTED_MODULE_7__["default"]; +Accordion.Title = _AccordionTitle__WEBPACK_IMPORTED_MODULE_8__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Accordion); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionAccordion.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionAccordion.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 AccordionAccordion; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_isArray__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isArray */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _AccordionPanel__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./AccordionPanel */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionPanel.js"); + + + + + + + + + + + + + +var warnIfPropsAreInvalid = function warnIfPropsAreInvalid(props, state) { + var exclusive = props.exclusive; + var activeIndex = state.activeIndex; + /* eslint-disable no-console */ + + if (exclusive && typeof activeIndex !== 'number') { + console.error('`activeIndex` must be a number if `exclusive` is true'); + } else if (!exclusive && !Object(lodash_es_isArray__WEBPACK_IMPORTED_MODULE_6__["default"])(activeIndex)) { + console.error('`activeIndex` must be an array if `exclusive` is false'); + } + /* eslint-enable no-console */ + +}; +/** + * An Accordion can contain sub-accordions. + */ + + +var AccordionAccordion = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(AccordionAccordion, _Component); + + function AccordionAccordion() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.computeNewIndex = function (index) { + var exclusive = _this.props.exclusive; + var activeIndex = _this.state.activeIndex; + if (exclusive) return index === activeIndex ? -1 : index; // check to see if index is in array, and remove it, if not then add it + + return Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_5__["default"])(activeIndex, index) ? Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_4__["default"])(activeIndex, index) : [].concat(activeIndex, [index]); + }; + + _this.handleTitleClick = function (e, titleProps) { + var index = titleProps.index; + + _this.setState({ + activeIndex: _this.computeNewIndex(index) + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onTitleClick', e, titleProps); + }; + + _this.isIndexActive = function (index) { + var exclusive = _this.props.exclusive; + var activeIndex = _this.state.activeIndex; + return exclusive ? activeIndex === index : Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_5__["default"])(activeIndex, index); + }; + + return _this; + } + + var _proto = AccordionAccordion.prototype; + + _proto.getInitialAutoControlledState = function getInitialAutoControlledState(_ref) { + var exclusive = _ref.exclusive; + return { + activeIndex: exclusive ? -1 : [] + }; + }; + + _proto.componentDidMount = function componentDidMount() { + if (true) { + warnIfPropsAreInvalid(this.props, this.state); + } + }; + + _proto.componentDidUpdate = function componentDidUpdate() { + if (true) { + warnIfPropsAreInvalid(this.props, this.state); + } + }; + + _proto.render = function render() { + var _this2 = this; + + var _this$props = this.props, + className = _this$props.className, + children = _this$props.children, + panels = _this$props.panels; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_7__["default"])('accordion', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["getUnhandledProps"])(AccordionAccordion, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["getElementType"])(AccordionAccordion, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_10__["childrenUtils"].isNil(children) ? Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(panels, function (panel, index) { + return _AccordionPanel__WEBPACK_IMPORTED_MODULE_11__["default"].create(panel, { + defaultProps: { + active: _this2.isIndexActive(index), + index: index, + onTitleClick: _this2.handleTitleClick + } + }); + }) : children); + }; + + return AccordionAccordion; +}(_lib__WEBPACK_IMPORTED_MODULE_10__["ModernAutoControlledComponent"]); + +AccordionAccordion.handledProps = ["activeIndex", "as", "children", "className", "defaultActiveIndex", "exclusive", "onTitleClick", "panels"]; + +AccordionAccordion.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.elementType, + + /** Index of the currently active panel. */ + activeIndex: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number), prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number])]), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.string, + + /** Initial activeIndex value. */ + defaultActiveIndex: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number), prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number])]), + + /** Only allow one panel open at a time. */ + exclusive: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** + * Called when a panel title is clicked. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All item props. + */ + onTitleClick: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.func]), + + /** Shorthand array of props for Accordion. */ + panels: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.shape({ + content: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].itemShorthand, + title: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].itemShorthand + }))]) +} : undefined; +AccordionAccordion.defaultProps = { + exclusive: true +}; +AccordionAccordion.autoControlledProps = ['activeIndex']; +AccordionAccordion.create = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["createShorthandFactory"])(AccordionAccordion, function (content) { + return { + content: content + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionContent.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionContent.js ***! + \**************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A content sub-component for Accordion component. + */ + +function AccordionContent(props) { + var active = props.active, + children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(active, 'active'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(AccordionContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(AccordionContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +AccordionContent.handledProps = ["active", "as", "children", "className", "content"]; +AccordionContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Whether or not the content is visible. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +AccordionContent.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(AccordionContent, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (AccordionContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionPanel.js": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionPanel.js ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _AccordionTitle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./AccordionTitle */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionTitle.js"); +/* harmony import */ var _AccordionContent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./AccordionContent */ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionContent.js"); + + + + + + + +/** + * A panel sub-component for Accordion component. + */ + +var AccordionPanel = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(AccordionPanel, _Component); + + function AccordionPanel() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleTitleOverrides = function (predefinedProps) { + return { + onClick: function onClick(e, titleProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(predefinedProps, 'onClick', e, titleProps); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_1__["default"])(_this.props, 'onTitleClick', e, titleProps); + } + }; + }; + + return _this; + } + + var _proto = AccordionPanel.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + content = _this$props.content, + index = _this$props.index, + title = _this$props.title; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_3___default.a.Fragment, null, _AccordionTitle__WEBPACK_IMPORTED_MODULE_5__["default"].create(title, { + autoGenerateKey: false, + defaultProps: { + active: active, + index: index + }, + overrideProps: this.handleTitleOverrides + }), _AccordionContent__WEBPACK_IMPORTED_MODULE_6__["default"].create(content, { + autoGenerateKey: false, + defaultProps: { + active: active + } + })); + }; + + return AccordionPanel; +}(react__WEBPACK_IMPORTED_MODULE_3__["Component"]); + +AccordionPanel.handledProps = ["active", "content", "index", "onTitleClick", "title"]; +AccordionPanel.propTypes = true ? { + /** Whether or not the title is in the open state. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A shorthand for Accordion.Content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** A panel index. */ + index: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string]), + + /** + * Called when a panel title is clicked. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All item props. + */ + onTitleClick: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, + + /** A shorthand for Accordion.Title. */ + title: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +AccordionPanel.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(AccordionPanel, null); +/* harmony default export */ __webpack_exports__["default"] = (AccordionPanel); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionTitle.js": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Accordion/AccordionTitle.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 AccordionTitle; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + + + + +/** + * A title sub-component for Accordion component. + */ + +var AccordionTitle = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(AccordionTitle, _Component); + + function AccordionTitle() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + return Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = AccordionTitle.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + children = _this$props.children, + className = _this$props.className, + content = _this$props.content, + icon = _this$props.icon; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active'), 'title', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(AccordionTitle, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(AccordionTitle, this.props); + var iconValue = Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_2__["default"])(icon) ? 'dropdown' : icon; + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), _elements_Icon__WEBPACK_IMPORTED_MODULE_8__["default"].create(iconValue, { + autoGenerateKey: false + }), content); + }; + + return AccordionTitle; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +AccordionTitle.handledProps = ["active", "as", "children", "className", "content", "icon", "index", "onClick"]; + +AccordionTitle.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** Whether or not the title is in the open state. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** Shorthand for Icon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** AccordionTitle index inside Accordion. */ + index: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number]), + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func +} : undefined; +AccordionTitle.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(AccordionTitle, function (content) { + return { + content: content + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/Checkbox.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Checkbox/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 Checkbox; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_set__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/set */ "./node_modules/lodash-es/set.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + + + + + +/** + * A checkbox allows a user to select a value from a small set of options, often binary. + * @see Form + * @see Radio + */ +var Checkbox = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Checkbox, _Component); + + function Checkbox() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.inputRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_9__["createRef"])(); + _this.labelRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_9__["createRef"])(); + + _this.canToggle = function () { + var _this$props = _this.props, + disabled = _this$props.disabled, + radio = _this$props.radio, + readOnly = _this$props.readOnly; + var checked = _this.state.checked; + return !disabled && !readOnly && !(radio && checked); + }; + + _this.computeTabIndex = function () { + var _this$props2 = _this.props, + disabled = _this$props2.disabled, + tabIndex = _this$props2.tabIndex; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_5__["default"])(tabIndex)) return tabIndex; + return disabled ? -1 : 0; + }; + + _this.handleClick = function (e) { + var id = _this.props.id; + var _this$state = _this.state, + checked = _this$state.checked, + indeterminate = _this$state.indeterminate; + + var isInputClick = Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.inputRef.current, 'contains', e.target); + + var isLabelClick = Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.labelRef.current, 'contains', e.target); + + var isRootClick = !isLabelClick && !isInputClick; + var hasId = !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_5__["default"])(id); + var isLabelClickAndForwardedToInput = isLabelClick && hasId; // https://github.com/Semantic-Org/Semantic-UI-React/pull/3351 + + if (!isLabelClickAndForwardedToInput) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onClick', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + checked: !checked, + indeterminate: !!indeterminate + })); + } + + if (_this.isClickFromMouse) { + _this.isClickFromMouse = false; + + if (isLabelClick && !hasId) { + _this.handleChange(e); + } // Changes should be triggered for the slider variation + + + if (isRootClick) { + _this.handleChange(e); + } + + if (isLabelClick && hasId) { + // To prevent two clicks from being fired from the component we have to stop the propagation + // from the "input" click: https://github.com/Semantic-Org/Semantic-UI-React/issues/3433 + e.stopPropagation(); + } + } + }; + + _this.handleChange = function (e) { + var checked = _this.state.checked; + if (!_this.canToggle()) return; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + checked: !checked, + indeterminate: false + })); + + _this.setState({ + checked: !checked, + indeterminate: false + }); + }; + + _this.handleMouseDown = function (e) { + var _this$state2 = _this.state, + checked = _this$state2.checked, + indeterminate = _this$state2.indeterminate; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onMouseDown', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + checked: !!checked, + indeterminate: !!indeterminate + })); + + if (!e.defaultPrevented) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.inputRef.current, 'focus'); + } // Heads up! + // We need to call "preventDefault" to keep element focused. + + + e.preventDefault(); + }; + + _this.handleMouseUp = function (e) { + var _this$state3 = _this.state, + checked = _this$state3.checked, + indeterminate = _this$state3.indeterminate; + _this.isClickFromMouse = true; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onMouseUp', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + checked: !!checked, + indeterminate: !!indeterminate + })); + }; + + _this.setIndeterminate = function () { + var indeterminate = _this.state.indeterminate; + + Object(lodash_es_set__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.inputRef, 'current.indeterminate', !!indeterminate); + }; + + return _this; + } + + var _proto = Checkbox.prototype; + + _proto.componentDidMount = function componentDidMount() { + this.setIndeterminate(); + }; + + _proto.componentDidUpdate = function componentDidUpdate() { + this.setIndeterminate(); + }; + + _proto.render = function render() { + var _this$props3 = this.props, + className = _this$props3.className, + disabled = _this$props3.disabled, + label = _this$props3.label, + id = _this$props3.id, + name = _this$props3.name, + radio = _this$props3.radio, + readOnly = _this$props3.readOnly, + slider = _this$props3.slider, + toggle = _this$props3.toggle, + type = _this$props3.type, + value = _this$props3.value; + var _this$state4 = this.state, + checked = _this$state4.checked, + indeterminate = _this$state4.indeterminate; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_7__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(checked, 'checked'), Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(indeterminate, 'indeterminate'), // auto apply fitted class to compact white space when there is no label + // https://semantic-ui.com/modules/checkbox.html#fitted + Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_5__["default"])(label), 'fitted'), Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(radio, 'radio'), Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(readOnly, 'read-only'), Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(slider, 'slider'), Object(_lib__WEBPACK_IMPORTED_MODULE_10__["useKeyOnly"])(toggle, 'toggle'), 'checkbox', className); + var unhandled = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["getUnhandledProps"])(Checkbox, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["getElementType"])(Checkbox, this.props); + + var _partitionHTMLProps = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["partitionHTMLProps"])(unhandled, { + htmlProps: _lib__WEBPACK_IMPORTED_MODULE_10__["htmlInputAttrs"] + }), + htmlInputProps = _partitionHTMLProps[0], + rest = _partitionHTMLProps[1]; // Heads Up! + // Do not remove empty labels, they are required by SUI CSS + + + var labelElement = Object(_lib__WEBPACK_IMPORTED_MODULE_10__["createHTMLLabel"])(label, { + defaultProps: { + htmlFor: id + }, + autoGenerateKey: false + }) || /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("label", { + htmlFor: id + }); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick, + onChange: this.handleChange, + onMouseDown: this.handleMouseDown, + onMouseUp: this.handleMouseUp + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_6__["Ref"], { + innerRef: this.inputRef + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement("input", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, htmlInputProps, { + checked: checked, + className: "hidden", + disabled: disabled, + id: id, + name: name, + readOnly: true, + tabIndex: this.computeTabIndex(), + type: type, + value: value + }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_9___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_6__["Ref"], { + innerRef: this.labelRef + }, labelElement)); + }; + + return Checkbox; +}(_lib__WEBPACK_IMPORTED_MODULE_10__["ModernAutoControlledComponent"]); + +Checkbox.handledProps = ["as", "checked", "className", "defaultChecked", "defaultIndeterminate", "disabled", "fitted", "id", "indeterminate", "label", "name", "onChange", "onClick", "onMouseDown", "onMouseUp", "radio", "readOnly", "slider", "tabIndex", "toggle", "type", "value"]; + +Checkbox.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.elementType, + + /** Whether or not checkbox is checked. */ + checked: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.string, + + /** The initial value of checked. */ + defaultChecked: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** Whether or not checkbox is indeterminate. */ + defaultIndeterminate: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** A checkbox can appear disabled and be unable to change states */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** Removes padding for a label. Auto applied when there is no label. */ + fitted: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** A unique identifier. */ + id: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.string]), + + /** Whether or not checkbox is indeterminate. */ + indeterminate: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** The text of the associated label element. */ + label: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].itemShorthand, + + /** The HTML input name. */ + name: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.string, + + /** + * Called when the user attempts to change the checked state. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and proposed checked/indeterminate state. + */ + onChange: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.func, + + /** + * Called when the checkbox or label is clicked. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and current checked/indeterminate state. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.func, + + /** + * Called when the user presses down on the mouse. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and current checked/indeterminate state. + */ + onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.func, + + /** + * Called when the user releases the mouse. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and current checked/indeterminate state. + */ + onMouseUp: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.func, + + /** Format as a radio element. This means it is an exclusive option. */ + radio: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['slider', 'toggle'])]), + + /** A checkbox can be read-only and unable to change states. */ + readOnly: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, + + /** Format to emphasize the current selection state. */ + slider: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['radio', 'toggle'])]), + + /** A checkbox can receive focus. */ + tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.string]), + + /** Format to show an on or off choice. */ + toggle: _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].every([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_10__["customPropTypes"].disallow(['radio', 'slider'])]), + + /** HTML input type, either checkbox or radio. */ + type: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.oneOf(['checkbox', 'radio']), + + /** The HTML input value. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_8___default.a.number]) +} : undefined; +Checkbox.defaultProps = { + type: 'checkbox' +}; +Checkbox.autoControlledProps = ['checked', 'indeterminate']; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Checkbox/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Checkbox__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Checkbox */ "./node_modules/semantic-ui-react/dist/es/modules/Checkbox/Checkbox.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Checkbox__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/Dimmer.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dimmer/Dimmer.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 Dimmer; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _addons_Portal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../addons/Portal */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js"); +/* harmony import */ var _DimmerDimmable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./DimmerDimmable */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerDimmable.js"); +/* harmony import */ var _DimmerInner__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./DimmerInner */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerInner.js"); + + + + + + + + +/** + * A dimmer hides distractions to focus attention on particular content. + */ + +var Dimmer = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Dimmer, _Component); + + function Dimmer() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handlePortalMount = function () { + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_4__["isBrowser"])()) return; // Heads up, IE doesn't support second argument in add() + + document.body.classList.add('dimmed'); + document.body.classList.add('dimmable'); + }; + + _this.handlePortalUnmount = function () { + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_4__["isBrowser"])()) return; // Heads up, IE doesn't support second argument in add() + + document.body.classList.remove('dimmed'); + document.body.classList.remove('dimmable'); + }; + + return _this; + } + + var _proto = Dimmer.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + page = _this$props.page; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Dimmer, this.props); + + if (page) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_addons_Portal__WEBPACK_IMPORTED_MODULE_5__["default"], { + closeOnEscape: false, + closeOnDocumentClick: false, + onMount: this.handlePortalMount, + onUnmount: this.handlePortalUnmount, + open: active, + openOnTriggerClick: false + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_DimmerInner__WEBPACK_IMPORTED_MODULE_7__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + active: active, + page: page + }))); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_DimmerInner__WEBPACK_IMPORTED_MODULE_7__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + active: active, + page: page + })); + }; + + return Dimmer; +}(react__WEBPACK_IMPORTED_MODULE_3__["Component"]); + +Dimmer.handledProps = ["active", "page"]; + +Dimmer.propTypes = true ? { + /** An active dimmer will dim its parent container. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A dimmer can be formatted to be fixed to the page. */ + page: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +Dimmer.Dimmable = _DimmerDimmable__WEBPACK_IMPORTED_MODULE_6__["default"]; +Dimmer.Inner = _DimmerInner__WEBPACK_IMPORTED_MODULE_7__["default"]; +Dimmer.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(Dimmer, function (value) { + return { + content: value + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerDimmable.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerDimmable.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A dimmable sub-component for Dimmer. + */ + +function DimmerDimmable(props) { + var blurring = props.blurring, + className = props.className, + children = props.children, + content = props.content, + dimmed = props.dimmed; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(blurring, 'blurring'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(dimmed, 'dimmed'), 'dimmable', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(DimmerDimmable, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(DimmerDimmable, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +DimmerDimmable.handledProps = ["as", "blurring", "children", "className", "content", "dimmed"]; +DimmerDimmable.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** A dimmable element can blur its contents. */ + blurring: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Controls whether or not the dim is displayed. */ + dimmed: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (DimmerDimmable); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerInner.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dimmer/DimmerInner.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 DimmerInner; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + +/** + * An inner element for a Dimmer. + */ + +var DimmerInner = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(DimmerInner, _Component); + + function DimmerInner() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.containerRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_6__["createRef"])(); + _this.contentRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_6__["createRef"])(); + + _this.handleClick = function (e) { + var contentRef = _this.contentRef.current; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClick', e, _this.props); + + if (contentRef && contentRef !== e.target && Object(_lib__WEBPACK_IMPORTED_MODULE_7__["doesNodeContainClick"])(contentRef, e)) { + return; + } + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClickOutside', e, _this.props); + }; + + return _this; + } + + var _proto = DimmerInner.prototype; + + _proto.componentDidMount = function componentDidMount() { + var active = this.props.active; + this.toggleStyles(active); + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps) { + var currentActive = this.props.active; + var prevActive = prevProps.active; + if (prevActive !== currentActive) this.toggleStyles(currentActive); + }; + + _proto.toggleStyles = function toggleStyles(active) { + var containerRef = this.containerRef.current; + if (!containerRef || !containerRef.style) return; + + if (active) { + containerRef.style.setProperty('display', 'flex', 'important'); + } else { + containerRef.style.removeProperty('display'); + } + }; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + children = _this$props.children, + className = _this$props.className, + content = _this$props.content, + disabled = _this$props.disabled, + inverted = _this$props.inverted, + page = _this$props.page, + simple = _this$props.simple, + verticalAlign = _this$props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active transition visible'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(page, 'page'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(simple, 'simple'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useVerticalAlignProp"])(verticalAlign), 'dimmer', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(DimmerInner, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(DimmerInner, this.props); + var childrenContent = _lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children) ? content : children; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__["Ref"], { + innerRef: this.containerRef + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), childrenContent && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("div", { + className: "content", + ref: this.contentRef + }, childrenContent))); + }; + + return DimmerInner; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +DimmerInner.handledProps = ["active", "as", "children", "className", "content", "disabled", "inverted", "onClick", "onClickOutside", "page", "simple", "verticalAlign"]; + +DimmerInner.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** An active dimmer will dim its parent container. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** A disabled dimmer cannot be activated */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Handles click outside Dimmer's content, but inside Dimmer area. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClickOutside: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** A dimmer can be formatted to have its colors inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A dimmer can be formatted to be fixed to the page. */ + page: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A dimmer can be controlled with simple prop. */ + simple: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** A dimmer can have its content top or bottom aligned. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(['bottom', 'top']) +} : undefined; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dimmer/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Dimmer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Dimmer */ "./node_modules/semantic-ui-react/dist/es/modules/Dimmer/Dimmer.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Dimmer__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/Dropdown.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/Dropdown.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 Dropdown; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_compact__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/compact */ "./node_modules/lodash-es/compact.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_every__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/every */ "./node_modules/lodash-es/every.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_find__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/find */ "./node_modules/lodash-es/find.js"); +/* harmony import */ var lodash_es_dropRight__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es/dropRight */ "./node_modules/lodash-es/dropRight.js"); +/* harmony import */ var lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash-es/isEmpty */ "./node_modules/lodash-es/isEmpty.js"); +/* harmony import */ var lodash_es_size__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lodash-es/size */ "./node_modules/lodash-es/size.js"); +/* harmony import */ var lodash_es_difference__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash-es/difference */ "./node_modules/lodash-es/difference.js"); +/* harmony import */ var lodash_es_union__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! lodash-es/union */ "./node_modules/lodash-es/union.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_noop__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! lodash-es/noop */ "./node_modules/lodash-es/noop.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_has__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! lodash-es/has */ "./node_modules/lodash-es/has.js"); +/* harmony import */ var lodash_es_isEqual__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! lodash-es/isEqual */ "./node_modules/lodash-es/isEqual.js"); +/* harmony import */ var lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! lodash-es/isFunction */ "./node_modules/lodash-es/isFunction.js"); +/* harmony import */ var lodash_es_pick__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! lodash-es/pick */ "./node_modules/lodash-es/pick.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @semantic-ui-react/event-stack */ "./node_modules/@semantic-ui-react/event-stack/lib/index.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_22___default = /*#__PURE__*/__webpack_require__.n(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_22__); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! keyboard-key */ "./node_modules/keyboard-key/src/keyboardKey.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_25___default = /*#__PURE__*/__webpack_require__.n(keyboard_key__WEBPACK_IMPORTED_MODULE_25__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_26___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_26__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_27___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_27__); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! shallowequal */ "./node_modules/shallowequal/index.js"); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(shallowequal__WEBPACK_IMPORTED_MODULE_28__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _elements_Label__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../../elements/Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/index.js"); +/* harmony import */ var _elements_Flag__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../../elements/Flag */ "./node_modules/semantic-ui-react/dist/es/elements/Flag/index.js"); +/* harmony import */ var _elements_Image__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../../elements/Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); +/* harmony import */ var _DropdownDivider__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./DropdownDivider */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownDivider.js"); +/* harmony import */ var _DropdownItem__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./DropdownItem */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownItem.js"); +/* harmony import */ var _DropdownHeader__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./DropdownHeader */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownHeader.js"); +/* harmony import */ var _DropdownMenu__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./DropdownMenu */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownMenu.js"); +/* harmony import */ var _DropdownSearchInput__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./DropdownSearchInput */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownSearchInput.js"); +/* harmony import */ var _DropdownText__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./DropdownText */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownText.js"); +/* harmony import */ var _utils_getMenuOptions__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./utils/getMenuOptions */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getMenuOptions.js"); +/* harmony import */ var _utils_getSelectedIndex__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./utils/getSelectedIndex */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getSelectedIndex.js"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +var getKeyOrValue = function getKeyOrValue(key, value) { + return Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_21__["default"])(key) ? value : key; +}; + +var getKeyAndValues = function getKeyAndValues(options) { + return options ? options.map(function (option) { + return Object(lodash_es_pick__WEBPACK_IMPORTED_MODULE_20__["default"])(option, ['key', 'value']); + }) : options; +}; + +function renderItemContent(item) { + var flag = item.flag, + image = item.image, + text = item.text; // TODO: remove this in v3 + // This maintains compatibility with Shorthand API in v1 as this might be called in "Label.create()" + + if (Object(lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_19__["default"])(text)) { + return text; + } + + return { + content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_27___default.a.Fragment, null, _elements_Flag__WEBPACK_IMPORTED_MODULE_32__["default"].create(flag), _elements_Image__WEBPACK_IMPORTED_MODULE_33__["default"].create(image), text) + }; +} +/** + * A dropdown allows a user to select a value from a series of options. + * @see Form + * @see Select + * @see Menu + */ + + +var Dropdown = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Dropdown, _Component); + + function Dropdown() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.searchRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_27__["createRef"])(); + _this.sizerRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_27__["createRef"])(); + _this.ref = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_27__["createRef"])(); + + _this.handleChange = function (e, value) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: value + })); + }; + + _this.closeOnChange = function (e) { + var _this$props = _this.props, + closeOnChange = _this$props.closeOnChange, + multiple = _this$props.multiple; + var shouldClose = Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_15__["default"])(closeOnChange) ? !multiple : closeOnChange; + + if (shouldClose) { + _this.close(e, lodash_es_noop__WEBPACK_IMPORTED_MODULE_14__["default"]); + } + }; + + _this.closeOnEscape = function (e) { + if (!_this.props.closeOnEscape) return; + if (keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e) !== keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.Escape) return; + e.preventDefault(); + + _this.close(e); + }; + + _this.moveSelectionOnKeyDown = function (e) { + var _moves; + + var _this$props2 = _this.props, + multiple = _this$props2.multiple, + selectOnNavigation = _this$props2.selectOnNavigation; + var open = _this.state.open; + + if (!open) { + return; + } + + var moves = (_moves = {}, _moves[keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.ArrowDown] = 1, _moves[keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.ArrowUp] = -1, _moves); + var move = moves[keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e)]; + + if (move === undefined) { + return; + } + + e.preventDefault(); + + var nextIndex = _this.getSelectedIndexAfterMove(move); + + if (!multiple && selectOnNavigation) { + _this.makeSelectedItemActive(e, nextIndex); + } + + _this.setState({ + selectedIndex: nextIndex + }); + }; + + _this.openOnSpace = function (e) { + var _e$target, _e$target2, _e$target3; + + var shouldHandleEvent = _this.state.focus && !_this.state.open && keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e) === keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.Spacebar; + var shouldPreventDefault = ((_e$target = e.target) == null ? void 0 : _e$target.tagName) !== 'INPUT' && ((_e$target2 = e.target) == null ? void 0 : _e$target2.tagName) !== 'TEXTAREA' && ((_e$target3 = e.target) == null ? void 0 : _e$target3.isContentEditable) !== true; + + if (shouldHandleEvent) { + if (shouldPreventDefault) { + e.preventDefault(); + } + + _this.open(e); + } + }; + + _this.openOnArrow = function (e) { + var _this$state = _this.state, + focus = _this$state.focus, + open = _this$state.open; + + if (focus && !open) { + var code = keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e); + + if (code === keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.ArrowDown || code === keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.ArrowUp) { + e.preventDefault(); + + _this.open(e); + } + } + }; + + _this.makeSelectedItemActive = function (e, selectedIndex) { + var _this$state2 = _this.state, + open = _this$state2.open, + value = _this$state2.value; + var multiple = _this.props.multiple; + + var item = _this.getSelectedItem(selectedIndex); + + var selectedValue = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_13__["default"])(item, 'value'); // prevent selecting null if there was no selected item value + // prevent selecting duplicate items when the dropdown is closed + + + if (Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_21__["default"])(selectedValue) || !open) { + return value; + } // state value may be undefined + + + var newValue = multiple ? Object(lodash_es_union__WEBPACK_IMPORTED_MODULE_12__["default"])(value, [selectedValue]) : selectedValue; + var valueHasChanged = multiple ? !!Object(lodash_es_difference__WEBPACK_IMPORTED_MODULE_11__["default"])(newValue, value).length : newValue !== value; + + if (valueHasChanged) { + // notify the onChange prop that the user is trying to change value + _this.setState({ + value: newValue + }); + + _this.handleChange(e, newValue); // Heads up! This event handler should be called after `onChange` + // Notify the onAddItem prop if this is a new value + + + if (item['data-additional']) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onAddItem', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: selectedValue + })); + } + } + + return value; + }; + + _this.selectItemOnEnter = function (e) { + var search = _this.props.search; + var _this$state3 = _this.state, + open = _this$state3.open, + selectedIndex = _this$state3.selectedIndex; + + if (!open) { + return; + } + + var shouldSelect = keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e) === keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.Enter || // https://github.com/Semantic-Org/Semantic-UI-React/pull/3766 + !search && keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e) === keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.Spacebar; + + if (!shouldSelect) { + return; + } + + e.preventDefault(); + + var optionSize = Object(lodash_es_size__WEBPACK_IMPORTED_MODULE_10__["default"])(Object(_utils_getMenuOptions__WEBPACK_IMPORTED_MODULE_40__["default"])({ + value: _this.state.value, + options: _this.props.options, + searchQuery: _this.state.searchQuery, + additionLabel: _this.props.additionLabel, + additionPosition: _this.props.additionPosition, + allowAdditions: _this.props.allowAdditions, + deburr: _this.props.deburr, + multiple: _this.props.multiple, + search: _this.props.search + })); + + if (search && optionSize === 0) { + return; + } + + var nextValue = _this.makeSelectedItemActive(e, selectedIndex); // This is required as selected value may be the same + + + _this.setState({ + selectedIndex: Object(_utils_getSelectedIndex__WEBPACK_IMPORTED_MODULE_41__["default"])({ + additionLabel: _this.props.additionLabel, + additionPosition: _this.props.additionPosition, + allowAdditions: _this.props.allowAdditions, + deburr: _this.props.deburr, + multiple: _this.props.multiple, + search: _this.props.search, + selectedIndex: selectedIndex, + value: nextValue, + options: _this.props.options, + searchQuery: '' + }) + }); + + _this.closeOnChange(e); + + _this.clearSearchQuery(); + + if (search) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.searchRef.current, 'focus'); + } + }; + + _this.removeItemOnBackspace = function (e) { + var _this$props3 = _this.props, + multiple = _this$props3.multiple, + search = _this$props3.search; + var _this$state4 = _this.state, + searchQuery = _this$state4.searchQuery, + value = _this$state4.value; + if (keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.getCode(e) !== keyboard_key__WEBPACK_IMPORTED_MODULE_25___default.a.Backspace) return; + if (searchQuery || !search || !multiple || Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_9__["default"])(value)) return; + e.preventDefault(); // remove most recent value + + var newValue = Object(lodash_es_dropRight__WEBPACK_IMPORTED_MODULE_8__["default"])(value); + + _this.setState({ + value: newValue + }); + + _this.handleChange(e, newValue); + }; + + _this.closeOnDocumentClick = function (e) { + if (!_this.props.closeOnBlur) return; // If event happened in the dropdown, ignore it + + if (_this.ref.current && Object(_lib__WEBPACK_IMPORTED_MODULE_29__["doesNodeContainClick"])(_this.ref.current, e)) return; + + _this.close(); + }; + + _this.handleMouseDown = function (e) { + _this.isMouseDown = true; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onMouseDown', e, _this.props); + + document.addEventListener('mouseup', _this.handleDocumentMouseUp); + }; + + _this.handleDocumentMouseUp = function () { + _this.isMouseDown = false; + document.removeEventListener('mouseup', _this.handleDocumentMouseUp); + }; + + _this.handleClick = function (e) { + var _this$props4 = _this.props, + minCharacters = _this$props4.minCharacters, + search = _this$props4.search; + var _this$state5 = _this.state, + open = _this$state5.open, + searchQuery = _this$state5.searchQuery; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onClick', e, _this.props); // prevent closeOnDocumentClick() + + + e.stopPropagation(); + if (!search) return _this.toggle(e); + + if (open) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.searchRef.current, 'focus'); + + return; + } + + if (searchQuery.length >= minCharacters || minCharacters === 1) { + _this.open(e); + + return; + } + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.searchRef.current, 'focus'); + }; + + _this.handleIconClick = function (e) { + var clearable = _this.props.clearable; + + var hasValue = _this.hasValue(); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onClick', e, _this.props); // prevent handleClick() + + + e.stopPropagation(); + + if (clearable && hasValue) { + _this.clearValue(e); + } else { + _this.toggle(e); + } + }; + + _this.handleItemClick = function (e, item) { + var _this$props5 = _this.props, + multiple = _this$props5.multiple, + search = _this$props5.search; + var currentValue = _this.state.value; + var value = item.value; // prevent toggle() in handleClick() + + e.stopPropagation(); // prevent closeOnDocumentClick() if multiple or item is disabled + + if (multiple || item.disabled) { + e.nativeEvent.stopImmediatePropagation(); + } + + if (item.disabled) { + return; + } + + var isAdditionItem = item['data-additional']; + var newValue = multiple ? Object(lodash_es_union__WEBPACK_IMPORTED_MODULE_12__["default"])(_this.state.value, [value]) : value; + var valueHasChanged = multiple ? !!Object(lodash_es_difference__WEBPACK_IMPORTED_MODULE_11__["default"])(newValue, currentValue).length : newValue !== currentValue; // notify the onChange prop that the user is trying to change value + + if (valueHasChanged) { + _this.setState({ + value: newValue + }); + + _this.handleChange(e, newValue); + } + + _this.clearSearchQuery(); + + if (search) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.searchRef.current, 'focus'); + } else { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.ref.current, 'focus'); + } + + _this.closeOnChange(e); // Heads up! This event handler should be called after `onChange` + // Notify the onAddItem prop if this is a new value + + + if (isAdditionItem) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onAddItem', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: value + })); + } + }; + + _this.handleFocus = function (e) { + var focus = _this.state.focus; + if (focus) return; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onFocus', e, _this.props); + + _this.setState({ + focus: true + }); + }; + + _this.handleBlur = function (e) { + // Heads up! Don't remove this. + // https://github.com/Semantic-Org/Semantic-UI-React/issues/1315 + var currentTarget = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_13__["default"])(e, 'currentTarget'); + + if (currentTarget && currentTarget.contains(document.activeElement)) return; + var _this$props6 = _this.props, + closeOnBlur = _this$props6.closeOnBlur, + multiple = _this$props6.multiple, + selectOnBlur = _this$props6.selectOnBlur; // do not "blur" when the mouse is down inside of the Dropdown + + if (_this.isMouseDown) return; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onBlur', e, _this.props); + + if (selectOnBlur && !multiple) { + _this.makeSelectedItemActive(e, _this.state.selectedIndex); + + if (closeOnBlur) _this.close(); + } + + _this.setState({ + focus: false + }); + + _this.clearSearchQuery(); + }; + + _this.handleSearchChange = function (e, _ref) { + var value = _ref.value; + // prevent propagating to this.props.onChange() + e.stopPropagation(); + var minCharacters = _this.props.minCharacters; + var open = _this.state.open; + var newQuery = value; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onSearchChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + searchQuery: newQuery + })); + + _this.setState({ + searchQuery: newQuery, + selectedIndex: 0 + }); // open search dropdown on search query + + + if (!open && newQuery.length >= minCharacters) { + _this.open(); + + return; + } // close search dropdown if search query is too small + + + if (open && minCharacters !== 1 && newQuery.length < minCharacters) _this.close(); + }; + + _this.handleKeyDown = function (e) { + _this.moveSelectionOnKeyDown(e); + + _this.openOnArrow(e); + + _this.openOnSpace(e); + + _this.selectItemOnEnter(e); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onKeyDown', e); + }; + + _this.getSelectedItem = function (selectedIndex) { + var options = Object(_utils_getMenuOptions__WEBPACK_IMPORTED_MODULE_40__["default"])({ + value: _this.state.value, + options: _this.props.options, + searchQuery: _this.state.searchQuery, + additionLabel: _this.props.additionLabel, + additionPosition: _this.props.additionPosition, + allowAdditions: _this.props.allowAdditions, + deburr: _this.props.deburr, + multiple: _this.props.multiple, + search: _this.props.search + }); + return Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_13__["default"])(options, "[" + selectedIndex + "]"); + }; + + _this.getItemByValue = function (value) { + var options = _this.props.options; + return Object(lodash_es_find__WEBPACK_IMPORTED_MODULE_7__["default"])(options, { + value: value + }); + }; + + _this.getDropdownAriaOptions = function () { + var _this$props7 = _this.props, + loading = _this$props7.loading, + disabled = _this$props7.disabled, + search = _this$props7.search, + multiple = _this$props7.multiple; + var open = _this.state.open; + var ariaOptions = { + role: search ? 'combobox' : 'listbox', + 'aria-busy': loading, + 'aria-disabled': disabled, + 'aria-expanded': !!open + }; + + if (ariaOptions.role === 'listbox') { + ariaOptions['aria-multiselectable'] = multiple; + } + + return ariaOptions; + }; + + _this.clearSearchQuery = function () { + var searchQuery = _this.state.searchQuery; + if (searchQuery === undefined || searchQuery === '') return; + + _this.setState({ + searchQuery: '' + }); + }; + + _this.handleLabelClick = function (e, labelProps) { + // prevent focusing search input on click + e.stopPropagation(); + + _this.setState({ + selectedLabel: labelProps.value + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onLabelClick', e, labelProps); + }; + + _this.handleLabelRemove = function (e, labelProps) { + // prevent focusing search input on click + e.stopPropagation(); + var value = _this.state.value; + + var newValue = Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_6__["default"])(value, labelProps.value); + + _this.setState({ + value: newValue + }); + + _this.handleChange(e, newValue); + }; + + _this.getSelectedIndexAfterMove = function (offset, startIndex) { + if (startIndex === void 0) { + startIndex = _this.state.selectedIndex; + } + + var options = Object(_utils_getMenuOptions__WEBPACK_IMPORTED_MODULE_40__["default"])({ + value: _this.state.value, + options: _this.props.options, + searchQuery: _this.state.searchQuery, + additionLabel: _this.props.additionLabel, + additionPosition: _this.props.additionPosition, + allowAdditions: _this.props.allowAdditions, + deburr: _this.props.deburr, + multiple: _this.props.multiple, + search: _this.props.search + }); // Prevent infinite loop + // TODO: remove left part of condition after children API will be removed + + if (options === undefined || Object(lodash_es_every__WEBPACK_IMPORTED_MODULE_5__["default"])(options, 'disabled')) return; + var lastIndex = options.length - 1; + var wrapSelection = _this.props.wrapSelection; // next is after last, wrap to beginning + // next is before first, wrap to end + + var nextIndex = startIndex + offset; // if 'wrapSelection' is set to false and selection is after last or before first, it just does not change + + if (!wrapSelection && (nextIndex > lastIndex || nextIndex < 0)) { + nextIndex = startIndex; + } else if (nextIndex > lastIndex) { + nextIndex = 0; + } else if (nextIndex < 0) { + nextIndex = lastIndex; + } + + if (options[nextIndex].disabled) { + return _this.getSelectedIndexAfterMove(offset, nextIndex); + } + + return nextIndex; + }; + + _this.handleIconOverrides = function (predefinedProps) { + var clearable = _this.props.clearable; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_24__["default"])(clearable && _this.hasValue() && 'clear', predefinedProps.className); + return { + className: classes, + onClick: function onClick(e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(predefinedProps, 'onClick', e, predefinedProps); + + _this.handleIconClick(e); + } + }; + }; + + _this.clearValue = function (e) { + var multiple = _this.props.multiple; + var newValue = multiple ? [] : ''; + + _this.setState({ + value: newValue + }); + + _this.handleChange(e, newValue); + }; + + _this.computeSearchInputTabIndex = function () { + var _this$props8 = _this.props, + disabled = _this$props8.disabled, + tabIndex = _this$props8.tabIndex; + if (!Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_21__["default"])(tabIndex)) return tabIndex; + return disabled ? -1 : 0; + }; + + _this.computeSearchInputWidth = function () { + var searchQuery = _this.state.searchQuery; + + if (_this.sizerRef.current && searchQuery) { + // resize the search input, temporarily show the sizer so we can measure it + _this.sizerRef.current.style.display = 'inline'; + _this.sizerRef.current.textContent = searchQuery; + var searchWidth = Math.ceil(_this.sizerRef.current.getBoundingClientRect().width); + + _this.sizerRef.current.style.removeProperty('display'); + + return searchWidth; + } + }; + + _this.computeTabIndex = function () { + var _this$props9 = _this.props, + disabled = _this$props9.disabled, + search = _this$props9.search, + tabIndex = _this$props9.tabIndex; // don't set a root node tabIndex as the search input has its own tabIndex + + if (search) return undefined; + if (disabled) return -1; + return Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_21__["default"])(tabIndex) ? 0 : tabIndex; + }; + + _this.handleSearchInputOverrides = function (predefinedProps) { + return { + onChange: function onChange(e, inputProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(predefinedProps, 'onChange', e, inputProps); + + _this.handleSearchChange(e, inputProps); + } + }; + }; + + _this.hasValue = function () { + var multiple = _this.props.multiple; + var value = _this.state.value; + return multiple ? !Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_9__["default"])(value) : !Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_21__["default"])(value) && value !== ''; + }; + + _this.scrollSelectedItemIntoView = function () { + if (!_this.ref.current) return; + + var menu = _this.ref.current.querySelector('.menu.visible'); + + if (!menu) return; + var item = menu.querySelector('.item.selected'); + if (!item) return; + var isOutOfUpperView = item.offsetTop < menu.scrollTop; + var isOutOfLowerView = item.offsetTop + item.clientHeight > menu.scrollTop + menu.clientHeight; + + if (isOutOfUpperView) { + menu.scrollTop = item.offsetTop; + } else if (isOutOfLowerView) { + // eslint-disable-next-line no-mixed-operators + menu.scrollTop = item.offsetTop + item.clientHeight - menu.clientHeight; + } + }; + + _this.setOpenDirection = function () { + if (!_this.ref.current) return; + + var menu = _this.ref.current.querySelector('.menu.visible'); + + if (!menu) return; + + var dropdownRect = _this.ref.current.getBoundingClientRect(); + + var menuHeight = menu.clientHeight; + var spaceAtTheBottom = document.documentElement.clientHeight - dropdownRect.top - dropdownRect.height - menuHeight; + var spaceAtTheTop = dropdownRect.top - menuHeight; + var upward = spaceAtTheBottom < 0 && spaceAtTheTop > spaceAtTheBottom; // set state only if there's a relevant difference + + if (!upward !== !_this.state.upward) { + _this.setState({ + upward: upward + }); + } + }; + + _this.open = function (e, triggerSetState) { + if (e === void 0) { + e = null; + } + + if (triggerSetState === void 0) { + triggerSetState = true; + } + + var _this$props10 = _this.props, + disabled = _this$props10.disabled, + search = _this$props10.search; + if (disabled) return; + if (search) Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.searchRef.current, 'focus'); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onOpen', e, _this.props); + + if (triggerSetState) { + _this.setState({ + open: true + }); + } + + _this.scrollSelectedItemIntoView(); + }; + + _this.close = function (e, callback) { + if (callback === void 0) { + callback = _this.handleClose; + } + + if (_this.state.open) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.props, 'onClose', e, _this.props); + + _this.setState({ + open: false + }, callback); + } + }; + + _this.handleClose = function () { + var hasSearchFocus = document.activeElement === _this.searchRef.current; // https://github.com/Semantic-Org/Semantic-UI-React/issues/627 + // Blur the Dropdown on close so it is blurred after selecting an item. + // This is to prevent it from re-opening when switching tabs after selecting an item. + + if (!hasSearchFocus && _this.ref.current) { + _this.ref.current.blur(); + } + + var hasDropdownFocus = document.activeElement === _this.ref.current; + var hasFocus = hasSearchFocus || hasDropdownFocus; // We need to keep the virtual model in sync with the browser focus change + // https://github.com/Semantic-Org/Semantic-UI-React/issues/692 + + _this.setState({ + focus: hasFocus + }); + }; + + _this.toggle = function (e) { + return _this.state.open ? _this.close(e) : _this.open(e); + }; + + _this.renderText = function () { + var _this$props11 = _this.props, + multiple = _this$props11.multiple, + placeholder = _this$props11.placeholder, + search = _this$props11.search, + text = _this$props11.text; + var _this$state6 = _this.state, + searchQuery = _this$state6.searchQuery, + selectedIndex = _this$state6.selectedIndex, + value = _this$state6.value, + open = _this$state6.open; + + var hasValue = _this.hasValue(); + + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_24__["default"])(placeholder && !hasValue && 'default', 'text', search && searchQuery && 'filtered'); + var _text = placeholder; + var selectedItem; + + if (text) { + _text = text; + } else if (open && !multiple) { + selectedItem = _this.getSelectedItem(selectedIndex); + } else if (hasValue) { + selectedItem = _this.getItemByValue(value); + } + + return _DropdownText__WEBPACK_IMPORTED_MODULE_39__["default"].create(selectedItem ? renderItemContent(selectedItem) : _text, { + defaultProps: { + className: classes + } + }); + }; + + _this.renderSearchInput = function () { + var _this$props12 = _this.props, + search = _this$props12.search, + searchInput = _this$props12.searchInput; + var searchQuery = _this.state.searchQuery; + return search && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_23__["Ref"], { + innerRef: _this.searchRef + }, _DropdownSearchInput__WEBPACK_IMPORTED_MODULE_38__["default"].create(searchInput, { + defaultProps: { + style: { + width: _this.computeSearchInputWidth() + }, + tabIndex: _this.computeSearchInputTabIndex(), + value: searchQuery + }, + overrideProps: _this.handleSearchInputOverrides + })); + }; + + _this.renderSearchSizer = function () { + var _this$props13 = _this.props, + search = _this$props13.search, + multiple = _this$props13.multiple; + return search && multiple && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement("span", { + className: "sizer", + ref: _this.sizerRef + }); + }; + + _this.renderLabels = function () { + var _this$props14 = _this.props, + multiple = _this$props14.multiple, + renderLabel = _this$props14.renderLabel; + var _this$state7 = _this.state, + selectedLabel = _this$state7.selectedLabel, + value = _this$state7.value; + + if (!multiple || Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_9__["default"])(value)) { + return; + } + + var selectedItems = Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_4__["default"])(value, _this.getItemByValue); + + // if no item could be found for a given state value the selected item will be undefined + // compact the selectedItems so we only have actual objects left + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(lodash_es_compact__WEBPACK_IMPORTED_MODULE_3__["default"])(selectedItems), function (item, index) { + var defaultProps = { + active: item.value === selectedLabel, + as: 'a', + key: getKeyOrValue(item.key, item.value), + onClick: _this.handleLabelClick, + onRemove: _this.handleLabelRemove, + value: item.value + }; + return _elements_Label__WEBPACK_IMPORTED_MODULE_31__["default"].create(renderLabel(item, index, defaultProps), { + defaultProps: defaultProps + }); + }); + }; + + _this.renderOptions = function () { + var _this$props15 = _this.props, + lazyLoad = _this$props15.lazyLoad, + multiple = _this$props15.multiple, + search = _this$props15.search, + noResultsMessage = _this$props15.noResultsMessage; + var _this$state8 = _this.state, + open = _this$state8.open, + selectedIndex = _this$state8.selectedIndex, + value = _this$state8.value; // lazy load, only render options when open + + if (lazyLoad && !open) return null; + var options = Object(_utils_getMenuOptions__WEBPACK_IMPORTED_MODULE_40__["default"])({ + value: _this.state.value, + options: _this.props.options, + searchQuery: _this.state.searchQuery, + additionLabel: _this.props.additionLabel, + additionPosition: _this.props.additionPosition, + allowAdditions: _this.props.allowAdditions, + deburr: _this.props.deburr, + multiple: _this.props.multiple, + search: _this.props.search + }); + + if (noResultsMessage !== null && search && Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_9__["default"])(options)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement("div", { + className: "message" + }, noResultsMessage); + } + + var isActive = multiple ? function (optValue) { + return Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_2__["default"])(value, optValue); + } : function (optValue) { + return optValue === value; + }; + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_4__["default"])(options, function (opt, i) { + return _DropdownItem__WEBPACK_IMPORTED_MODULE_35__["default"].create(Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + active: isActive(opt.value), + onClick: _this.handleItemClick, + selected: selectedIndex === i + }, opt, { + key: getKeyOrValue(opt.key, opt.value), + // Needed for handling click events on disabled items + style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, opt.style, { + pointerEvents: 'all' + }) + })); + }); + }; + + _this.renderMenu = function () { + var _this$props16 = _this.props, + children = _this$props16.children, + direction = _this$props16.direction, + header = _this$props16.header; + var open = _this.state.open; + + var ariaOptions = _this.getDropdownMenuAriaOptions(); // single menu child + + + if (!_lib__WEBPACK_IMPORTED_MODULE_29__["childrenUtils"].isNil(children)) { + var menuChild = react__WEBPACK_IMPORTED_MODULE_27__["Children"].only(children); + var className = Object(clsx__WEBPACK_IMPORTED_MODULE_24__["default"])(direction, Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(open, 'visible'), menuChild.props.className); + return /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_27__["cloneElement"])(menuChild, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + className: className + }, ariaOptions)); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(_DropdownMenu__WEBPACK_IMPORTED_MODULE_37__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, ariaOptions, { + direction: direction, + open: open + }), _DropdownHeader__WEBPACK_IMPORTED_MODULE_36__["default"].create(header, { + autoGenerateKey: false + }), _this.renderOptions()); + }; + + return _this; + } + + var _proto = Dropdown.prototype; + + _proto.getInitialAutoControlledState = function getInitialAutoControlledState() { + return { + focus: false, + searchQuery: '' + }; + }; + + Dropdown.getAutoControlledStateFromProps = function getAutoControlledStateFromProps(nextProps, computedState, prevState) { + // These values are stored only for a comparison on next getAutoControlledStateFromProps() + var derivedState = { + __options: nextProps.options, + __value: computedState.value + }; // The selected index is only dependent: + + var shouldComputeSelectedIndex = // On value change + !shallowequal__WEBPACK_IMPORTED_MODULE_28___default()(prevState.__value, computedState.value) || // On option keys/values, we only check those properties to avoid recursive performance impacts. + // https://github.com/Semantic-Org/Semantic-UI-React/issues/3000 + !Object(lodash_es_isEqual__WEBPACK_IMPORTED_MODULE_18__["default"])(getKeyAndValues(nextProps.options), getKeyAndValues(prevState.__options)); + + if (shouldComputeSelectedIndex) { + derivedState.selectedIndex = Object(_utils_getSelectedIndex__WEBPACK_IMPORTED_MODULE_41__["default"])({ + additionLabel: nextProps.additionLabel, + additionPosition: nextProps.additionPosition, + allowAdditions: nextProps.allowAdditions, + deburr: nextProps.deburr, + multiple: nextProps.multiple, + search: nextProps.search, + selectedIndex: computedState.selectedIndex, + value: computedState.value, + options: nextProps.options, + searchQuery: computedState.searchQuery + }); + } + + return derivedState; + }; + + _proto.componentDidMount = function componentDidMount() { + var open = this.state.open; + + if (open) { + this.open(null, false); + } + }; + + _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) { + return !shallowequal__WEBPACK_IMPORTED_MODULE_28___default()(nextProps, this.props) || !shallowequal__WEBPACK_IMPORTED_MODULE_28___default()(nextState, this.state); + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + // eslint-disable-line complexity + var _this$props17 = this.props, + closeOnBlur = _this$props17.closeOnBlur, + minCharacters = _this$props17.minCharacters, + openOnFocus = _this$props17.openOnFocus, + search = _this$props17.search; + /* eslint-disable no-console */ + + if (true) { + // in development, validate value type matches dropdown type + var isNextValueArray = Array.isArray(this.props.value); + + var hasValue = Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_17__["default"])(this.props, 'value'); + + if (hasValue && this.props.multiple && !isNextValueArray) { + console.error('Dropdown `value` must be an array when `multiple` is set.' + (" Received type: `" + Object.prototype.toString.call(this.props.value) + "`.")); + } else if (hasValue && !this.props.multiple && isNextValueArray) { + console.error('Dropdown `value` must not be an array when `multiple` is not set.' + ' Either set `multiple={true}` or use a string or number value.'); + } + } + /* eslint-enable no-console */ + // focused / blurred + + + if (!prevState.focus && this.state.focus) { + if (!this.isMouseDown) { + var openable = !search || search && minCharacters === 1 && !this.state.open; + if (openOnFocus && openable) this.open(); + } + } else if (prevState.focus && !this.state.focus) { + if (!this.isMouseDown && closeOnBlur) { + this.close(); + } + } // opened / closed + + + if (!prevState.open && this.state.open) { + this.setOpenDirection(); + this.scrollSelectedItemIntoView(); + } else if (prevState.open && !this.state.open) {} + + if (prevState.selectedIndex !== this.state.selectedIndex) { + this.scrollSelectedItemIntoView(); + } + } // ---------------------------------------- + // Document Event Handlers + // ---------------------------------------- + // onChange needs to receive a value + // can't rely on props.value if we are controlled + ; + + _proto.getDropdownMenuAriaOptions = function getDropdownMenuAriaOptions() { + var _this$props18 = this.props, + search = _this$props18.search, + multiple = _this$props18.multiple; + var ariaOptions = {}; + + if (search) { + ariaOptions['aria-multiselectable'] = multiple; + ariaOptions.role = 'listbox'; + } + + return ariaOptions; + } // ---------------------------------------- + // Setters + // ---------------------------------------- + ; + + _proto.render = function render() { + var _this$props19 = this.props, + basic = _this$props19.basic, + button = _this$props19.button, + className = _this$props19.className, + compact = _this$props19.compact, + disabled = _this$props19.disabled, + error = _this$props19.error, + fluid = _this$props19.fluid, + floating = _this$props19.floating, + icon = _this$props19.icon, + inline = _this$props19.inline, + item = _this$props19.item, + labeled = _this$props19.labeled, + loading = _this$props19.loading, + multiple = _this$props19.multiple, + pointing = _this$props19.pointing, + search = _this$props19.search, + selection = _this$props19.selection, + scrolling = _this$props19.scrolling, + simple = _this$props19.simple, + trigger = _this$props19.trigger; + var _this$state9 = this.state, + focus = _this$state9.focus, + open = _this$state9.open, + upward = _this$state9.upward; // Classes + + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_24__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(open, 'active visible'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(button, 'button'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(compact, 'compact'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(floating, 'floating'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(inline, 'inline'), // TODO: consider augmentation to render Dropdowns as Button/Menu, solves icon/link item issues + // https://github.com/Semantic-Org/Semantic-UI-React/issues/401#issuecomment-240487229 + // TODO: the icon class is only required when a dropdown is a button + // useKeyOnly(icon, 'icon'), + Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(labeled, 'labeled'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(item, 'item'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(multiple, 'multiple'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(search, 'search'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(selection, 'selection'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(simple, 'simple'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(scrolling, 'scrolling'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOnly"])(upward, 'upward'), Object(_lib__WEBPACK_IMPORTED_MODULE_29__["useKeyOrValueAndKey"])(pointing, 'pointing'), 'dropdown', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_29__["getUnhandledProps"])(Dropdown, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_29__["getElementType"])(Dropdown, this.props); + var ariaOptions = this.getDropdownAriaOptions(ElementType, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_23__["Ref"], { + innerRef: this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, ariaOptions, { + className: classes, + onBlur: this.handleBlur, + onClick: this.handleClick, + onKeyDown: this.handleKeyDown, + onMouseDown: this.handleMouseDown, + onFocus: this.handleFocus, + onChange: this.handleChange, + tabIndex: this.computeTabIndex() + }), this.renderLabels(), this.renderSearchInput(), this.renderSearchSizer(), trigger || this.renderText(), _elements_Icon__WEBPACK_IMPORTED_MODULE_30__["default"].create(icon, { + overrideProps: this.handleIconOverrides, + autoGenerateKey: false + }), this.renderMenu(), open && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_22___default.a, { + name: "keydown", + on: this.closeOnEscape + }), open && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_22___default.a, { + name: "click", + on: this.closeOnDocumentClick + }), focus && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_27___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_22___default.a, { + name: "keydown", + on: this.removeItemOnBackspace + }))); + }; + + return Dropdown; +}(_lib__WEBPACK_IMPORTED_MODULE_29__["ModernAutoControlledComponent"]); + +Dropdown.handledProps = ["additionLabel", "additionPosition", "allowAdditions", "as", "basic", "button", "children", "className", "clearable", "closeOnBlur", "closeOnChange", "closeOnEscape", "compact", "deburr", "defaultOpen", "defaultSearchQuery", "defaultSelectedLabel", "defaultUpward", "defaultValue", "direction", "disabled", "error", "floating", "fluid", "header", "icon", "inline", "item", "labeled", "lazyLoad", "loading", "minCharacters", "multiple", "noResultsMessage", "onAddItem", "onBlur", "onChange", "onClick", "onClose", "onFocus", "onLabelClick", "onMouseDown", "onOpen", "onSearchChange", "open", "openOnFocus", "options", "placeholder", "pointing", "renderLabel", "scrolling", "search", "searchInput", "searchQuery", "selectOnBlur", "selectOnNavigation", "selectedLabel", "selection", "simple", "tabIndex", "text", "trigger", "upward", "value", "wrapSelection"]; + +Dropdown.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.elementType, + + /** Label prefixed to an option added by a user. */ + additionLabel: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.element, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string]), + + /** Position of the `Add: ...` option in the dropdown list ('top' or 'bottom'). */ + additionPosition: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOf(['top', 'bottom']), + + /** + * Allow user additions to the list of options (boolean). + * Requires the use of `selection`, `options` and `search`. + */ + allowAdditions: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].demand(['options', 'selection', 'search']), prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool]), + + /** A Dropdown can reduce its complexity. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Format the Dropdown to appear as a button. */ + button: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Primary content. */ + children: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].disallow(['options', 'selection']), _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].givenProps({ + children: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.any.isRequired + }, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.element.isRequired)]), + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, + + /** Using the clearable setting will let users remove their selection from a dropdown. */ + clearable: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Whether or not the menu should close when the dropdown is blurred. */ + closeOnBlur: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Whether or not the dropdown should close when the escape key is pressed. */ + closeOnEscape: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** + * Whether or not the menu should close when a value is selected from the dropdown. + * By default, multiple selection dropdowns will remain open on change, while single + * selection dropdowns will close on change. + */ + closeOnChange: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A compact dropdown has no minimum width. */ + compact: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Whether or not the dropdown should strip diacritics in options and input search */ + deburr: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Initial value of open. */ + defaultOpen: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Initial value of searchQuery. */ + defaultSearchQuery: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, + + /** Currently selected label in multi-select. */ + defaultSelectedLabel: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].demand(['multiple']), prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string])]), + + /** Initial value of upward. */ + defaultUpward: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Initial value or value array if multiple. */ + defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool]))]), + + /** A dropdown menu can open to the left or to the right. */ + direction: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOf(['left', 'right']), + + /** A disabled dropdown menu or item does not allow user interaction. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** An errored dropdown can alert a user to a problem. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown menu can contain floated content. */ + floating: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown can take the full width of its parent */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown menu can contain a header. */ + header: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.node, + + /** Shorthand for Icon. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.object]), + + /** A dropdown can be formatted to appear inline in other content. */ + inline: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown can be formatted as a Menu item. */ + item: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown can be labeled. */ + labeled: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown can defer rendering its options until it is open. */ + lazyLoad: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown can show that it is currently loading data. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** The minimum characters for a search to begin showing results. */ + minCharacters: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number, + + /** A selection dropdown can allow multiple selections. */ + multiple: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Message to display when there are no results. */ + noResultsMessage: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.node, + + /** + * Called when a user adds a new item. Use this to update the options list. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and the new item's value. + */ + onAddItem: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called on blur. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onBlur: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called when the user attempts to change the value. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and proposed value. + */ + onChange: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called when a close event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClose: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called on focus. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onFocus: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called when a multi-select label is clicked. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All label props. + */ + onLabelClick: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called on mousedown. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called when an open event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onOpen: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** + * Called on search input change. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props, includes current value of searchQuery. + */ + onSearchChange: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** Controls whether or not the dropdown menu is displayed. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Whether or not the menu should open when the dropdown is focused. */ + openOnFocus: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Array of Dropdown.Item props e.g. `{ text: '', value: '' }` */ + options: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.shape(_DropdownItem__WEBPACK_IMPORTED_MODULE_35__["default"].propTypes))]), + + /** Placeholder text. */ + placeholder: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, + + /** A dropdown can be formatted so that its menu is pointing. */ + pointing: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOf(['left', 'right', 'top', 'top left', 'top right', 'bottom', 'bottom left', 'bottom right'])]), + + /** + * Mapped over the active items and returns shorthand for the active item Labels. + * Only applies to `multiple` Dropdowns. + * + * @param {object} item - A currently active dropdown item. + * @param {number} index - The current index. + * @param {object} defaultLabelProps - The default props for an active item Label. + * @returns {*} Shorthand for a Label. + */ + renderLabel: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func, + + /** A dropdown can have its menu scroll. */ + scrolling: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** + * A selection dropdown can allow a user to search through a large list of choices. + * Pass a function here to replace the default search. + */ + search: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.func]), + + /** A shorthand for a search input. */ + searchInput: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.array, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.object]), + + /** Current value of searchQuery. Creates a controlled component. */ + searchQuery: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, + // TODO 'searchInMenu' or 'search='in menu' or ??? How to handle this markup and functionality? + + /** Define whether the highlighted item should be selected on blur. */ + selectOnBlur: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** + * Whether or not to change the value when navigating the menu using arrow keys. + * Setting to false will require enter or left click to confirm a choice. + */ + selectOnNavigation: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** Currently selected label in multi-select. */ + selectedLabel: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].demand(['multiple']), prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number])]), + + /** A dropdown can be used to select between choices in a form. */ + selection: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].disallow(['children']), _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].demand(['options']), prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool]), + + /** A simple dropdown can open without Javascript. */ + simple: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** A dropdown can receive focus. */ + tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string]), + + /** The text displayed in the dropdown, usually for the active item. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, + + /** Custom element to trigger the menu to become visible. Takes place of 'text'. */ + trigger: _lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_29__["customPropTypes"].disallow(['selection', 'text']), prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.node]), + + /** Current value or value array if multiple. Creates a controlled component. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.string, prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.number]))]), + + /** Controls whether the dropdown will open upward. */ + upward: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool, + + /** + * A dropdown will go to the last element when ArrowUp is pressed on the first, + * or go to the first when ArrowDown is pressed on the last( aka infinite selection ) + */ + wrapSelection: prop_types__WEBPACK_IMPORTED_MODULE_26___default.a.bool +} : undefined; +Dropdown.defaultProps = { + additionLabel: 'Add ', + additionPosition: 'top', + closeOnBlur: true, + closeOnEscape: true, + deburr: false, + icon: 'dropdown', + minCharacters: 1, + noResultsMessage: 'No results found.', + openOnFocus: true, + renderLabel: renderItemContent, + searchInput: 'text', + selectOnBlur: true, + selectOnNavigation: true, + wrapSelection: true +}; +Dropdown.autoControlledProps = ['open', 'searchQuery', 'selectedLabel', 'value', 'upward']; +Dropdown.Divider = _DropdownDivider__WEBPACK_IMPORTED_MODULE_34__["default"]; +Dropdown.Header = _DropdownHeader__WEBPACK_IMPORTED_MODULE_36__["default"]; +Dropdown.Item = _DropdownItem__WEBPACK_IMPORTED_MODULE_35__["default"]; +Dropdown.Menu = _DropdownMenu__WEBPACK_IMPORTED_MODULE_37__["default"]; +Dropdown.SearchInput = _DropdownSearchInput__WEBPACK_IMPORTED_MODULE_38__["default"]; +Dropdown.Text = _DropdownText__WEBPACK_IMPORTED_MODULE_39__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownDivider.js": +/*!************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownDivider.js ***! + \************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A dropdown menu can contain dividers to separate related content. + */ + +function DropdownDivider(props) { + var className = props.className; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('divider', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(DropdownDivider, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(DropdownDivider, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + })); +} + +DropdownDivider.handledProps = ["as", "className"]; +DropdownDivider.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (DropdownDivider); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownHeader.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownHeader.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + +/** + * A dropdown menu can contain a header. + */ + +function DropdownHeader(props) { + var children = props.children, + className = props.className, + content = props.content, + icon = props.icon; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(DropdownHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(DropdownHeader, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _elements_Icon__WEBPACK_IMPORTED_MODULE_5__["default"].create(icon, { + autoGenerateKey: false + }), content); +} + +DropdownHeader.handledProps = ["as", "children", "className", "content", "icon"]; +DropdownHeader.propTypes = true ? { + /** An element type to render as (string or function) */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for Icon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +DropdownHeader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(DropdownHeader, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (DropdownHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownItem.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownItem.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Flag__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../elements/Flag */ "./node_modules/semantic-ui-react/dist/es/elements/Flag/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _elements_Image__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../elements/Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); +/* harmony import */ var _elements_Label__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../elements/Label */ "./node_modules/semantic-ui-react/dist/es/elements/Label/index.js"); + + + + + + + + + + + + +/** + * An item sub-component for Dropdown component. + */ + +var DropdownItem = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(DropdownItem, _Component); + + function DropdownItem() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onClick', e, _this.props); + }; + + return _this; + } + + var _proto = DropdownItem.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + children = _this$props.children, + className = _this$props.className, + content = _this$props.content, + disabled = _this$props.disabled, + description = _this$props.description, + flag = _this$props.flag, + icon = _this$props.icon, + image = _this$props.image, + label = _this$props.label, + selected = _this$props.selected, + text = _this$props.text; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(selected, 'selected'), 'item', className); // add default dropdown icon if item contains another menu + + var iconName = Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_2__["default"])(icon) ? _lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].someByType(children, 'DropdownMenu') && 'dropdown' : icon; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(DropdownItem, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(DropdownItem, this.props); + var ariaOptions = { + role: 'option', + 'aria-disabled': disabled, + 'aria-checked': active, + 'aria-selected': selected + }; + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, ariaOptions, { + className: classes, + onClick: this.handleClick + }), children); + } + + var flagElement = _elements_Flag__WEBPACK_IMPORTED_MODULE_8__["default"].create(flag, { + autoGenerateKey: false + }); + var iconElement = _elements_Icon__WEBPACK_IMPORTED_MODULE_9__["default"].create(iconName, { + autoGenerateKey: false + }); + var imageElement = _elements_Image__WEBPACK_IMPORTED_MODULE_10__["default"].create(image, { + autoGenerateKey: false + }); + var labelElement = _elements_Label__WEBPACK_IMPORTED_MODULE_11__["default"].create(label, { + autoGenerateKey: false + }); + var descriptionElement = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthand"])('span', function (val) { + return { + children: val + }; + }, description, { + defaultProps: { + className: 'description' + }, + autoGenerateKey: false + }); + var textElement = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthand"])('span', function (val) { + return { + children: val + }; + }, _lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(content) ? text : content, { + defaultProps: { + className: 'text' + }, + autoGenerateKey: false + }); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, ariaOptions, { + className: classes, + onClick: this.handleClick + }), imageElement, iconElement, flagElement, labelElement, descriptionElement, textElement); + }; + + return DropdownItem; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +DropdownItem.handledProps = ["active", "as", "children", "className", "content", "description", "disabled", "flag", "icon", "image", "label", "onClick", "selected", "text", "value"]; +DropdownItem.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** Style as the currently chosen item. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** Additional text with less emphasis. */ + description: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** A dropdown item can be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Shorthand for Flag. */ + flag: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** Shorthand for Icon. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** Shorthand for Image. */ + image: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** Shorthand for Label. */ + label: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].itemShorthand, + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * The item currently selected by keyboard shortcut. + * This is not the active item. + */ + selected: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Display text. */ + text: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** Stored value. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]) +} : undefined; +DropdownItem.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(DropdownItem, function (opts) { + return opts; +}); +/* harmony default export */ __webpack_exports__["default"] = (DropdownItem); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownMenu.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownMenu.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A dropdown menu can contain a menu. + */ + +function DropdownMenu(props) { + var children = props.children, + className = props.className, + content = props.content, + direction = props.direction, + open = props.open, + scrolling = props.scrolling; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(direction, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(open, 'visible'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(scrolling, 'scrolling'), 'menu transition', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(DropdownMenu, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(DropdownMenu, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +DropdownMenu.handledProps = ["as", "children", "className", "content", "direction", "open", "scrolling"]; +DropdownMenu.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A dropdown menu can open to the left or to the right. */ + direction: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['left', 'right']), + + /** Whether or not the dropdown menu is displayed. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A dropdown menu can scroll. */ + scrolling: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (DropdownMenu); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownSearchInput.js": +/*!****************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownSearchInput.js ***! + \****************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + +/** + * A search item sub-component for Dropdown component. + */ + +var DropdownSearchInput = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(DropdownSearchInput, _Component); + + function DropdownSearchInput() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleChange = function (e) { + var value = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_3__["default"])(e, 'target.value'); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + value: value + })); + }; + + return _this; + } + + var _proto = DropdownSearchInput.prototype; + + _proto.render = function render() { + var _this$props = this.props, + autoComplete = _this$props.autoComplete, + className = _this$props.className, + tabIndex = _this$props.tabIndex, + type = _this$props.type, + value = _this$props.value; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('search', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(DropdownSearchInput, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("input", Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + "aria-autocomplete": "list", + autoComplete: autoComplete, + className: classes, + onChange: this.handleChange, + tabIndex: tabIndex, + type: type, + value: value + })); + }; + + return DropdownSearchInput; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +DropdownSearchInput.handledProps = ["as", "autoComplete", "className", "tabIndex", "type", "value"]; +DropdownSearchInput.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** An input can have the auto complete. */ + autoComplete: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** An input can receive focus. */ + tabIndex: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]), + + /** The HTML input type. */ + type: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Stored value. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string]) +} : undefined; +DropdownSearchInput.defaultProps = { + autoComplete: 'off', + type: 'text' +}; +DropdownSearchInput.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(DropdownSearchInput, function (type) { + return { + type: type + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (DropdownSearchInput); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownText.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/DropdownText.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A dropdown contains a selected value. + */ + +function DropdownText(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('divider', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(DropdownText, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(DropdownText, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + "aria-atomic": true, + "aria-live": "polite", + role: "alert" + }, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +DropdownText.handledProps = ["as", "children", "className", "content"]; +DropdownText.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +DropdownText.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(DropdownText, function (val) { + return { + content: val + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (DropdownText); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Dropdown__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Dropdown */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/Dropdown.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Dropdown__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getMenuOptions.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getMenuOptions.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 getMenuOptions; }); +/* harmony import */ var lodash_es_some__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/some */ "./node_modules/lodash-es/some.js"); +/* harmony import */ var lodash_es_escapeRegExp__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/escapeRegExp */ "./node_modules/lodash-es/escapeRegExp.js"); +/* harmony import */ var lodash_es_deburr__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/deburr */ "./node_modules/lodash-es/deburr.js"); +/* harmony import */ var lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isFunction */ "./node_modules/lodash-es/isFunction.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_filter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/filter */ "./node_modules/lodash-es/filter.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); + + + + + + + // There are times when we need to calculate the options based on a value +// that hasn't yet been persisted to state. + +function getMenuOptions(config) { + var additionLabel = config.additionLabel, + additionPosition = config.additionPosition, + allowAdditions = config.allowAdditions, + deburr = config.deburr, + multiple = config.multiple, + options = config.options, + search = config.search, + searchQuery = config.searchQuery, + value = config.value; + var filteredOptions = options; // filter out active options + + if (multiple) { + filteredOptions = Object(lodash_es_filter__WEBPACK_IMPORTED_MODULE_5__["default"])(filteredOptions, function (opt) { + return !Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_4__["default"])(value, opt.value); + }); + } // filter by search query + + + if (search && searchQuery) { + if (Object(lodash_es_isFunction__WEBPACK_IMPORTED_MODULE_3__["default"])(search)) { + filteredOptions = search(filteredOptions, searchQuery); + } else { + // remove diacritics on search input and options, if deburr prop is set + var strippedQuery = deburr ? Object(lodash_es_deburr__WEBPACK_IMPORTED_MODULE_2__["default"])(searchQuery) : searchQuery; + var re = new RegExp(Object(lodash_es_escapeRegExp__WEBPACK_IMPORTED_MODULE_1__["default"])(strippedQuery), 'i'); + filteredOptions = Object(lodash_es_filter__WEBPACK_IMPORTED_MODULE_5__["default"])(filteredOptions, function (opt) { + return re.test(deburr ? Object(lodash_es_deburr__WEBPACK_IMPORTED_MODULE_2__["default"])(opt.text) : opt.text); + }); + } + } // insert the "add" item + + + if (allowAdditions && search && searchQuery && !Object(lodash_es_some__WEBPACK_IMPORTED_MODULE_0__["default"])(filteredOptions, { + text: searchQuery + })) { + var additionLabelElement = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.isValidElement(additionLabel) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.cloneElement(additionLabel, { + key: 'addition-label' + }) : additionLabel || ''; + var addItem = { + key: 'addition', + // by using an array, we can pass multiple elements, but when doing so + // we must specify a `key` for React to know which one is which + text: [additionLabelElement, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("b", { + key: "addition-query" + }, searchQuery)], + value: searchQuery, + className: 'addition', + 'data-additional': true + }; + if (additionPosition === 'top') filteredOptions.unshift(addItem);else filteredOptions.push(addItem); + } + + return filteredOptions; +} +getMenuOptions.handledProps = []; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getSelectedIndex.js": +/*!*******************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getSelectedIndex.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 getSelectedIndex; }); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_find__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/find */ "./node_modules/lodash-es/find.js"); +/* harmony import */ var lodash_es_findIndex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/findIndex */ "./node_modules/lodash-es/findIndex.js"); +/* harmony import */ var lodash_es_reduce__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/reduce */ "./node_modules/lodash-es/reduce.js"); +/* harmony import */ var _getMenuOptions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getMenuOptions */ "./node_modules/semantic-ui-react/dist/es/modules/Dropdown/utils/getMenuOptions.js"); + + + + + +function getSelectedIndex(config) { + var additionLabel = config.additionLabel, + additionPosition = config.additionPosition, + allowAdditions = config.allowAdditions, + deburr = config.deburr, + multiple = config.multiple, + options = config.options, + search = config.search, + searchQuery = config.searchQuery, + selectedIndex = config.selectedIndex, + value = config.value; + var menuOptions = Object(_getMenuOptions__WEBPACK_IMPORTED_MODULE_4__["default"])({ + value: value, + options: options, + searchQuery: searchQuery, + additionLabel: additionLabel, + additionPosition: additionPosition, + allowAdditions: allowAdditions, + deburr: deburr, + multiple: multiple, + search: search + }); + + var enabledIndexes = Object(lodash_es_reduce__WEBPACK_IMPORTED_MODULE_3__["default"])(menuOptions, function (memo, item, index) { + if (!item.disabled) memo.push(index); + return memo; + }, []); + + var newSelectedIndex; // update the selected index + + if (!selectedIndex || selectedIndex < 0) { + var firstIndex = enabledIndexes[0]; // Select the currently active item, if none, use the first item. + // Multiple selects remove active items from the list, + // their initial selected index should be 0. + + newSelectedIndex = multiple ? firstIndex : Object(lodash_es_findIndex__WEBPACK_IMPORTED_MODULE_2__["default"])(menuOptions, ['value', value]) || enabledIndexes[0]; + } else if (multiple) { + newSelectedIndex = Object(lodash_es_find__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledIndexes, function (index) { + return index >= selectedIndex; + }); // multiple selects remove options from the menu as they are made active + // keep the selected index within range of the remaining items + + if (selectedIndex >= menuOptions.length - 1) { + newSelectedIndex = enabledIndexes[enabledIndexes.length - 1]; + } + } else { + var activeIndex = Object(lodash_es_findIndex__WEBPACK_IMPORTED_MODULE_2__["default"])(menuOptions, ['value', value]); // regular selects can only have one active item + // set the selected index to the currently active item + + + newSelectedIndex = Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledIndexes, activeIndex) ? activeIndex : undefined; + } + + if (!newSelectedIndex || newSelectedIndex < 0) { + newSelectedIndex = enabledIndexes[0]; + } + + return newSelectedIndex; +} + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Embed/Embed.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Embed/Embed.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 Embed; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + + +/** + * An embed displays content from other websites like YouTube videos or Google Maps. + */ + +var Embed = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Embed, _Component); + + function Embed() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var onClick = _this.props.onClick; + var active = _this.state.active; + if (onClick) onClick(e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + active: true + })); + if (!active) _this.setState({ + active: true + }); + }; + + return _this; + } + + var _proto = Embed.prototype; + + _proto.getSrc = function getSrc() { + var _this$props = this.props, + _this$props$autoplay = _this$props.autoplay, + autoplay = _this$props$autoplay === void 0 ? true : _this$props$autoplay, + _this$props$brandedUI = _this$props.brandedUI, + brandedUI = _this$props$brandedUI === void 0 ? false : _this$props$brandedUI, + _this$props$color = _this$props.color, + color = _this$props$color === void 0 ? '#444444' : _this$props$color, + _this$props$hd = _this$props.hd, + hd = _this$props$hd === void 0 ? true : _this$props$hd, + id = _this$props.id, + source = _this$props.source, + url = _this$props.url; + + if (source === 'youtube') { + return ["//www.youtube.com/embed/" + id, '?autohide=true', "&autoplay=" + autoplay, "&color=" + encodeURIComponent(color), "&hq=" + hd, '&jsapi=false', "&modestbranding=" + brandedUI, "&rel=" + (brandedUI ? 0 : 1)].join(''); + } + + if (source === 'vimeo') { + return ["//player.vimeo.com/video/" + id, '?api=false', "&autoplay=" + autoplay, '&byline=false', "&color=" + encodeURIComponent(color), '&portrait=false', '&title=false'].join(''); + } + + return url; + }; + + _proto.render = function render() { + var _this$props2 = this.props, + aspectRatio = _this$props2.aspectRatio, + className = _this$props2.className, + icon = _this$props2.icon, + placeholder = _this$props2.placeholder; + var active = this.state.active; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', aspectRatio, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(active, 'active'), 'embed', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Embed, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Embed, this.props); + var iconShorthand = icon !== undefined ? icon : 'video play'; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), _elements_Icon__WEBPACK_IMPORTED_MODULE_6__["default"].create(iconShorthand, { + autoGenerateKey: false + }), placeholder && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("img", { + className: "placeholder", + src: placeholder + }), this.renderEmbed()); + }; + + _proto.renderEmbed = function renderEmbed() { + var _this$props3 = this.props, + children = _this$props3.children, + content = _this$props3.content, + iframe = _this$props3.iframe, + source = _this$props3.source; + var active = this.state.active; + if (!active) return null; + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + className: "embed" + }, children); + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(content)) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + className: "embed" + }, content); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + className: "embed" + }, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createHTMLIframe"])(_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(iframe) ? this.getSrc() : iframe, { + defaultProps: { + allowFullScreen: false, + frameBorder: 0, + height: '100%', + scrolling: 'no', + src: this.getSrc(), + title: "Embedded content from " + source + ".", + width: '100%' + }, + autoGenerateKey: false + })); + }; + + return Embed; +}(_lib__WEBPACK_IMPORTED_MODULE_5__["ModernAutoControlledComponent"]); + +Embed.handledProps = ["active", "as", "aspectRatio", "autoplay", "brandedUI", "children", "className", "color", "content", "defaultActive", "hd", "icon", "id", "iframe", "onClick", "placeholder", "source", "url"]; + +Embed.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** An embed can be active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** An embed can specify an alternative aspect ratio. */ + aspectRatio: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['4:3', '16:9', '21:9']), + + /** Setting to true or false will force autoplay. */ + autoplay: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].demand(['source']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool]), + + /** Whether to show networks branded UI like title cards, or after video calls to action. */ + brandedUI: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].demand(['source']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool]), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Specifies a default chrome color with Vimeo or YouTube. */ + color: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].demand(['source']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Initial value of active. */ + defaultActive: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Whether to prefer HD content. */ + hd: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].demand(['source']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool]), + + /** Specifies an icon to use with placeholder content. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** Specifies an id for source. */ + id: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].demand(['source']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]), + + /** Shorthand for HTML iframe. */ + iframe: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].demand(['source']), _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand]), + + /** + * Сalled on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and proposed value. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** A placeholder image for embed. */ + placeholder: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Specifies a source to use. */ + source: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].disallow(['sourceUrl']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(['youtube', 'vimeo'])]), + + /** Specifies a url to use for embed. */ + url: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].disallow(['source']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]) +} : undefined; +Embed.autoControlledProps = ['active']; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Embed/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Embed/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Embed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Embed */ "./node_modules/semantic-ui-react/dist/es/modules/Embed/Embed.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Embed__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/Modal.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/Modal.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/isPlainObject */ "./node_modules/lodash-es/isPlainObject.js"); +/* harmony import */ var lodash_es_pick__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/pick */ "./node_modules/lodash-es/pick.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_reduce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/reduce */ "./node_modules/lodash-es/reduce.js"); +/* harmony import */ var lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isEmpty */ "./node_modules/lodash-es/isEmpty.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! shallowequal */ "./node_modules/shallowequal/index.js"); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(shallowequal__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); +/* harmony import */ var _addons_Portal__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../addons/Portal */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js"); +/* harmony import */ var _ModalActions__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./ModalActions */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalActions.js"); +/* harmony import */ var _ModalContent__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ModalContent */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalContent.js"); +/* harmony import */ var _ModalDescription__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ModalDescription */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDescription.js"); +/* harmony import */ var _ModalDimmer__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ModalDimmer */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDimmer.js"); +/* harmony import */ var _ModalHeader__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ModalHeader */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalHeader.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./utils */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/utils/index.js"); + + + + + + + + + + + + + + + + + + + + + + + +/** + * A modal displays content that temporarily blocks interactions with the main view of a site. + * @see Confirm + * @see Portal + */ +var Modal = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Modal, _Component); + + function Modal() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.legacy = Object(_lib__WEBPACK_IMPORTED_MODULE_13__["isBrowser"])() && Object(_utils__WEBPACK_IMPORTED_MODULE_21__["isLegacy"])(); + _this.ref = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_11__["createRef"])(); + _this.dimmerRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_11__["createRef"])(); + _this.latestDocumentMouseDownEvent = null; + + _this.getMountNode = function () { + return Object(_lib__WEBPACK_IMPORTED_MODULE_13__["isBrowser"])() ? _this.props.mountNode || document.body : null; + }; + + _this.handleActionsOverrides = function (predefinedProps) { + return { + onActionClick: function onActionClick(e, actionProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(predefinedProps, 'onActionClick', e, actionProps); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.props, 'onActionClick', e, _this.props); + + _this.handleClose(e); + } + }; + }; + + _this.handleClose = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.props, 'onClose', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: false + })); + + _this.setState({ + open: false + }); + }; + + _this.handleDocumentMouseDown = function (e) { + _this.latestDocumentMouseDownEvent = e; + }; + + _this.handleDocumentClick = function (e) { + var closeOnDimmerClick = _this.props.closeOnDimmerClick; + var currentDocumentMouseDownEvent = _this.latestDocumentMouseDownEvent; + _this.latestDocumentMouseDownEvent = null; + if (!closeOnDimmerClick || Object(_lib__WEBPACK_IMPORTED_MODULE_13__["doesNodeContainClick"])(_this.ref.current, currentDocumentMouseDownEvent) || Object(_lib__WEBPACK_IMPORTED_MODULE_13__["doesNodeContainClick"])(_this.ref.current, e)) return; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.props, 'onClose', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: false + })); + + _this.setState({ + open: false + }); + }; + + _this.handleIconOverrides = function (predefinedProps) { + return { + onClick: function onClick(e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(predefinedProps, 'onClick', e); + + _this.handleClose(e); + } + }; + }; + + _this.handleOpen = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.props, 'onOpen', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: true + })); + + _this.setState({ + open: true + }); + }; + + _this.handlePortalMount = function (e) { + var eventPool = _this.props.eventPool; + + _this.setState({ + scrolling: false + }); + + _this.setPositionAndClassNames(); + + _lib__WEBPACK_IMPORTED_MODULE_13__["eventStack"].sub('mousedown', _this.handleDocumentMouseDown, { + pool: eventPool, + target: _this.dimmerRef.current + }); + _lib__WEBPACK_IMPORTED_MODULE_13__["eventStack"].sub('click', _this.handleDocumentClick, { + pool: eventPool, + target: _this.dimmerRef.current + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.props, 'onMount', e, _this.props); + }; + + _this.handlePortalUnmount = function (e) { + var eventPool = _this.props.eventPool; + cancelAnimationFrame(_this.animationRequestId); + _lib__WEBPACK_IMPORTED_MODULE_13__["eventStack"].unsub('mousedown', _this.handleDocumentMouseDown, { + pool: eventPool, + target: _this.dimmerRef.current + }); + _lib__WEBPACK_IMPORTED_MODULE_13__["eventStack"].unsub('click', _this.handleDocumentClick, { + pool: eventPool, + target: _this.dimmerRef.current + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_7__["default"])(_this.props, 'onUnmount', e, _this.props); + }; + + _this.setPositionAndClassNames = function () { + var centered = _this.props.centered; + var scrolling; + var newState = {}; + + if (_this.ref.current) { + var rect = _this.ref.current.getBoundingClientRect(); + + var isFitted = Object(_utils__WEBPACK_IMPORTED_MODULE_21__["canFit"])(rect); + scrolling = !isFitted; // Styles should be computed for IE11 + + var legacyStyles = _this.legacy ? Object(_utils__WEBPACK_IMPORTED_MODULE_21__["getLegacyStyles"])(isFitted, centered, rect) : {}; + + if (!shallowequal__WEBPACK_IMPORTED_MODULE_12___default()(_this.state.legacyStyles, legacyStyles)) { + newState.legacyStyles = legacyStyles; + } + + if (_this.state.scrolling !== scrolling) { + newState.scrolling = scrolling; + } + } + + if (!Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_6__["default"])(newState)) _this.setState(newState); + _this.animationRequestId = requestAnimationFrame(_this.setPositionAndClassNames); + }; + + _this.renderContent = function (rest) { + var _this$props = _this.props, + actions = _this$props.actions, + basic = _this$props.basic, + children = _this$props.children, + className = _this$props.className, + closeIcon = _this$props.closeIcon, + content = _this$props.content, + header = _this$props.header, + size = _this$props.size, + style = _this$props.style; + var _this$state = _this.state, + legacyStyles = _this$state.legacyStyles, + scrolling = _this$state.scrolling; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_9__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_13__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_13__["useKeyOnly"])(_this.legacy, 'legacy'), Object(_lib__WEBPACK_IMPORTED_MODULE_13__["useKeyOnly"])(scrolling, 'scrolling'), 'modal transition visible active', className); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_13__["getElementType"])(Modal, _this.props); + var closeIconName = closeIcon === true ? 'close' : closeIcon; + var closeIconJSX = _elements_Icon__WEBPACK_IMPORTED_MODULE_14__["default"].create(closeIconName, { + overrideProps: _this.handleIconOverrides + }); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_8__["Ref"], { + innerRef: _this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, legacyStyles, style) + }), closeIconJSX, _lib__WEBPACK_IMPORTED_MODULE_13__["childrenUtils"].isNil(children) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_11___default.a.Fragment, null, _ModalHeader__WEBPACK_IMPORTED_MODULE_20__["default"].create(header, { + autoGenerateKey: false + }), _ModalContent__WEBPACK_IMPORTED_MODULE_17__["default"].create(content, { + autoGenerateKey: false + }), _ModalActions__WEBPACK_IMPORTED_MODULE_16__["default"].create(actions, { + overrideProps: _this.handleActionsOverrides + })) : children)); + }; + + return _this; + } + + var _proto = Modal.prototype; + + _proto.componentWillUnmount = function componentWillUnmount() { + this.handlePortalUnmount(); + } // Do not access document when server side rendering + ; + + _proto.render = function render() { + var _this$props2 = this.props, + centered = _this$props2.centered, + closeOnDocumentClick = _this$props2.closeOnDocumentClick, + dimmer = _this$props2.dimmer, + eventPool = _this$props2.eventPool, + trigger = _this$props2.trigger; + var _this$state2 = this.state, + open = _this$state2.open, + scrolling = _this$state2.scrolling; + var mountNode = this.getMountNode(); // Short circuit when server side rendering + + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_13__["isBrowser"])()) { + return /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_11__["isValidElement"])(trigger) ? trigger : null; + } + + var unhandled = Object(_lib__WEBPACK_IMPORTED_MODULE_13__["getUnhandledProps"])(Modal, this.props); + var portalPropNames = _addons_Portal__WEBPACK_IMPORTED_MODULE_15__["default"].handledProps; + + var rest = Object(lodash_es_reduce__WEBPACK_IMPORTED_MODULE_5__["default"])(unhandled, function (acc, val, key) { + if (!Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_4__["default"])(portalPropNames, key)) acc[key] = val; + return acc; + }, {}); + + var portalProps = Object(lodash_es_pick__WEBPACK_IMPORTED_MODULE_3__["default"])(unhandled, portalPropNames); // Heads up! + // + // The SUI CSS selector to prevent the modal itself from blurring requires an immediate .dimmer child: + // .blurring.dimmed.dimmable>:not(.dimmer) { ... } + // + // The .blurring.dimmed.dimmable is the body, so that all body content inside is blurred. + // We need the immediate child to be the dimmer to :not() blur the modal itself! + // Otherwise, the portal div is also blurred, blurring the modal. + // + // We cannot them wrap the modalJSX in an actual <Dimmer /> instead, we apply the dimmer classes to the <Portal />. + + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default.a.createElement(_addons_Portal__WEBPACK_IMPORTED_MODULE_15__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + closeOnDocumentClick: closeOnDocumentClick + }, portalProps, { + trigger: trigger, + eventPool: eventPool, + mountNode: mountNode, + open: open, + onClose: this.handleClose, + onMount: this.handlePortalMount, + onOpen: this.handleOpen, + onUnmount: this.handlePortalUnmount + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_11___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_8__["Ref"], { + innerRef: this.dimmerRef + }, _ModalDimmer__WEBPACK_IMPORTED_MODULE_19__["default"].create(Object(lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_2__["default"])(dimmer) ? dimmer : {}, { + autoGenerateKey: false, + defaultProps: { + blurring: dimmer === 'blurring', + inverted: dimmer === 'inverted' + }, + overrideProps: { + children: this.renderContent(rest), + centered: centered, + mountNode: mountNode, + scrolling: scrolling + } + }))); + }; + + return Modal; +}(_lib__WEBPACK_IMPORTED_MODULE_13__["ModernAutoControlledComponent"]); + +Modal.handledProps = ["actions", "as", "basic", "centered", "children", "className", "closeIcon", "closeOnDimmerClick", "closeOnDocumentClick", "content", "defaultOpen", "dimmer", "eventPool", "header", "mountNode", "onActionClick", "onClose", "onMount", "onOpen", "onUnmount", "open", "size", "style", "trigger"]; +Modal.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.elementType, + + /** Shorthand for Modal.Actions. Typically an array of button shorthand. */ + actions: _lib__WEBPACK_IMPORTED_MODULE_13__["customPropTypes"].itemShorthand, + + /** A modal can reduce its complexity */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, + + /** A modal can be vertically centered in the viewport */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.string, + + /** Shorthand for the close icon. Closes the modal on click. */ + closeIcon: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool]), + + /** Whether or not the Modal should close when the dimmer is clicked. */ + closeOnDimmerClick: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, + + /** Whether or not the Modal should close when the document is clicked. */ + closeOnDocumentClick: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, + + /** Simple text content for the Modal. */ + content: _lib__WEBPACK_IMPORTED_MODULE_13__["customPropTypes"].itemShorthand, + + /** Initial value of open. */ + defaultOpen: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, + + /** A Modal can appear in a dimmer. */ + dimmer: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.object, prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.oneOf(['inverted', 'blurring'])]), + + /** Event pool namespace that is used to handle component events */ + eventPool: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.string, + + /** Modal displayed above the content in bold. */ + header: _lib__WEBPACK_IMPORTED_MODULE_13__["customPropTypes"].itemShorthand, + + /** The node where the modal should mount. Defaults to document.body. */ + mountNode: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.any, + + /** + * Action onClick handler when using shorthand `actions`. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onActionClick: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.func, + + /** + * Called when a close event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClose: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.func, + + /** + * Called when the portal is mounted on the DOM. + * + * @param {null} + * @param {object} data - All props. + */ + onMount: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.func, + + /** + * Called when an open event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onOpen: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.func, + + /** + * Called when the portal is unmounted from the DOM. + * + * @param {null} + * @param {object} data - All props. + */ + onUnmount: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.func, + + /** Controls whether or not the Modal is displayed. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.bool, + + /** A modal can vary in size */ + size: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.oneOf(['mini', 'tiny', 'small', 'large', 'fullscreen']), + + /** Custom styles. */ + style: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.object, + + /** Element to be rendered in-place where the portal is defined. */ + trigger: prop_types__WEBPACK_IMPORTED_MODULE_10___default.a.node + /** + * NOTE: Any unhandled props that are defined in Portal are passed-through + * to the wrapping Portal. + */ + +} : undefined; +Modal.defaultProps = { + centered: true, + dimmer: true, + closeOnDimmerClick: true, + closeOnDocumentClick: false, + eventPool: 'Modal' +}; +Modal.autoControlledProps = ['open']; +Modal.Actions = _ModalActions__WEBPACK_IMPORTED_MODULE_16__["default"]; +Modal.Content = _ModalContent__WEBPACK_IMPORTED_MODULE_17__["default"]; +Modal.Description = _ModalDescription__WEBPACK_IMPORTED_MODULE_18__["default"]; +Modal.Dimmer = _ModalDimmer__WEBPACK_IMPORTED_MODULE_19__["default"]; +Modal.Header = _ModalHeader__WEBPACK_IMPORTED_MODULE_20__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Modal); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalActions.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalActions.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 ModalActions; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Button__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../elements/Button */ "./node_modules/semantic-ui-react/dist/es/elements/Button/index.js"); + + + + + + + + + +/** + * A modal can contain a row of actions. + */ + +var ModalActions = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(ModalActions, _Component); + + function ModalActions() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleButtonOverrides = function (predefinedProps) { + return { + onClick: function onClick(e, buttonProps) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(predefinedProps, 'onClick', e, buttonProps); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_3__["default"])(_this.props, 'onActionClick', e, buttonProps); + } + }; + }; + + return _this; + } + + var _proto = ModalActions.prototype; + + _proto.render = function render() { + var _this2 = this; + + var _this$props = this.props, + actions = _this$props.actions, + children = _this$props.children, + className = _this$props.className, + content = _this$props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('actions', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(ModalActions, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(ModalActions, this.props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(actions, function (action) { + return _elements_Button__WEBPACK_IMPORTED_MODULE_8__["default"].create(action, { + overrideProps: _this2.handleButtonOverrides + }); + })); + }; + + return ModalActions; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +ModalActions.handledProps = ["actions", "as", "children", "className", "content", "onActionClick"]; + +ModalActions.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** Array of shorthand buttons. */ + actions: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].collectionShorthand, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].contentShorthand, + + /** + * Action onClick handler when using shorthand `actions`. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props from the clicked action. + */ + onActionClick: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].disallow(['children']), prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func]) +} : undefined; +ModalActions.create = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["createShorthandFactory"])(ModalActions, function (actions) { + return { + actions: actions + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalContent.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalContent.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A modal can contain content. + */ + +function ModalContent(props) { + var children = props.children, + className = props.className, + content = props.content, + image = props.image, + scrolling = props.scrolling; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(className, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(image, 'image'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(scrolling, 'scrolling'), 'content'); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ModalContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ModalContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ModalContent.handledProps = ["as", "children", "className", "content", "image", "scrolling"]; +ModalContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A modal can contain image content. */ + image: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** A modal can use the entire size of the screen. */ + scrolling: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +ModalContent.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ModalContent, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ModalContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDescription.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDescription.js ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A modal can contain a description with one or more paragraphs. + */ + +function ModalDescription(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('description', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ModalDescription, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ModalDescription, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ModalDescription.handledProps = ["as", "children", "className", "content"]; +ModalDescription.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ModalDescription); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDimmer.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalDimmer.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A modal has a dimmer. + */ + +function ModalDimmer(props) { + var blurring = props.blurring, + children = props.children, + className = props.className, + centered = props.centered, + content = props.content, + inverted = props.inverted, + mountNode = props.mountNode, + scrolling = props.scrolling; + var ref = react__WEBPACK_IMPORTED_MODULE_4___default.a.useRef(); + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(!centered, 'top aligned'), 'page modals dimmer transition visible active', className); + var bodyClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('dimmable dimmed', Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(blurring, 'blurring'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(scrolling, 'scrolling')); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(ModalDimmer, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(ModalDimmer, props); + Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useClassNamesOnNode"])(mountNode, bodyClasses); + react__WEBPACK_IMPORTED_MODULE_4___default.a.useEffect(function () { + if (ref.current && ref.current.style) { + ref.current.style.setProperty('display', 'flex', 'important'); + } + }, []); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_1__["Ref"], { + innerRef: ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children)); +} + +ModalDimmer.handledProps = ["as", "blurring", "centered", "children", "className", "content", "inverted", "mountNode", "scrolling"]; +ModalDimmer.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** A dimmer can be blurred. */ + blurring: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A dimmer can center its contents in the viewport. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A dimmer can be inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** The node where the modal should mount. Defaults to document.body. */ + mountNode: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.any, + + /** A dimmer can make body scrollable. */ + scrolling: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +ModalDimmer.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(ModalDimmer, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ModalDimmer); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalHeader.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/ModalHeader.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A modal can have a header. + */ + +function ModalHeader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ModalHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ModalHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ModalHeader.handledProps = ["as", "children", "className", "content"]; +ModalHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ModalHeader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ModalHeader, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ModalHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Modal__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Modal */ "./node_modules/semantic-ui-react/dist/es/modules/Modal/Modal.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Modal__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Modal/utils/index.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Modal/utils/index.js ***! + \*****************************************************************************/ +/*! exports provided: canFit, getLegacyStyles, isLegacy */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canFit", function() { return canFit; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLegacyStyles", function() { return getLegacyStyles; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLegacy", function() { return isLegacy; }); +// https://github.com/Semantic-Org/Semantic-UI/blob/2.4.1/src/definitions/modules/modal.js#L956 +var OFFSET = 0; // https://github.com/Semantic-Org/Semantic-UI/blob/2.4.1/src/definitions/modules/modal.js#L990 + +var PADDING = 50; +/** + * Ensures that modal can fit viewport without scroll. + * + * @param modalRect {DOMRect} + * + * @see https://github.com/Semantic-Org/Semantic-UI/blob/2.4.1/src/definitions/modules/modal.js#L608 + */ + +var canFit = function canFit(modalRect) { + // original: scrollHeight = $module.prop('scrollHeight'), + // is replaced by .height because scrollHeight provides integer which produces glitches + // https://github.com/Semantic-Org/Semantic-UI-React/issues/2221 + var scrollHeight = modalRect.height + OFFSET; // $module.outerHeight() + settings.offset + + var height = modalRect.height + OFFSET; // original: $(window).height() + + var contextHeight = window.innerHeight; + var verticalCenter = contextHeight / 2; + var topOffset = -(height / 2); // padding with edge of page + + var paddingHeight = PADDING; + var startPosition = verticalCenter + topOffset; // 0 + // original: scrollHeight > height + // ? startPosition + scrollHeight + paddingHeight < contextHeight + // : height + paddingHeight * 2 < contextHeight + + return startPosition + scrollHeight + paddingHeight < contextHeight; +}; +/** + * Creates legacy styles for IE11. + * + * @param isFitted {Boolean} + * @param centered {Boolean} + * @param modalRect {DOMRect} + * + * @see https://github.com/Semantic-Org/Semantic-UI/blob/2.4.1/src/definitions/modules/modal.js#L718 + */ + +var getLegacyStyles = function getLegacyStyles(isFitted, centered, modalRect) { + var marginTop = centered && isFitted ? -(modalRect.height / 2) : 0; + var marginLeft = -(modalRect.width / 2); + return { + marginLeft: marginLeft, + marginTop: marginTop + }; +}; // https://github.com/Semantic-Org/Semantic-UI/blob/2.4.1/src/definitions/modules/modal.js#L631 + +/* istanbul ignore next */ + +var isLegacy = function isLegacy() { + return !window.ActiveXObject && 'ActiveXObject' in window; +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Popup/Popup.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Popup/Popup.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 Popup; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_isArray__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/isArray */ "./node_modules/lodash-es/isArray.js"); +/* harmony import */ var lodash_es_pick__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/pick */ "./node_modules/lodash-es/pick.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_reduce__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash-es/reduce */ "./node_modules/lodash-es/reduce.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @semantic-ui-react/event-stack */ "./node_modules/@semantic-ui-react/event-stack/lib/index.js"); +/* harmony import */ var _semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_13__); +/* harmony import */ var react_popper__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react-popper */ "./node_modules/react-popper/lib/esm/index.js"); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! shallowequal */ "./node_modules/shallowequal/index.js"); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(shallowequal__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _addons_Portal__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../addons/Portal */ "./node_modules/semantic-ui-react/dist/es/addons/Portal/index.js"); +/* harmony import */ var _lib_positions__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./lib/positions */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/lib/positions.js"); +/* harmony import */ var _lib_createReferenceProxy__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./lib/createReferenceProxy */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/lib/createReferenceProxy.js"); +/* harmony import */ var _PopupContent__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./PopupContent */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupContent.js"); +/* harmony import */ var _PopupHeader__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./PopupHeader */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupHeader.js"); + + + + + + + + + + + + + + + + + + + + + + + +/** + * A Popup displays additional information on top of a page. + */ +var Popup = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Popup, _Component); + + function Popup() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.state = {}; + _this.open = false; + _this.zIndexWasSynced = false; + _this.triggerRef = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_13___default.a.createRef(); + + _this.getPortalProps = function () { + var portalProps = {}; + var _this$props = _this.props, + on = _this$props.on, + hoverable = _this$props.hoverable; + var normalizedOn = Object(lodash_es_isArray__WEBPACK_IMPORTED_MODULE_6__["default"])(on) ? on : [on]; + + if (hoverable) { + portalProps.closeOnPortalMouseLeave = true; + portalProps.mouseLeaveDelay = 300; + } + + if (Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_8__["default"])(normalizedOn, 'hover')) { + portalProps.openOnTriggerClick = false; + portalProps.closeOnTriggerClick = false; + portalProps.openOnTriggerMouseEnter = true; + portalProps.closeOnTriggerMouseLeave = true; // Taken from SUI: https://git.io/vPmCm + + portalProps.mouseLeaveDelay = 70; + portalProps.mouseEnterDelay = 50; + } + + if (Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_8__["default"])(normalizedOn, 'click')) { + portalProps.openOnTriggerClick = true; + portalProps.closeOnTriggerClick = true; + portalProps.closeOnDocumentClick = true; + } + + if (Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_8__["default"])(normalizedOn, 'focus')) { + portalProps.openOnTriggerFocus = true; + portalProps.closeOnTriggerBlur = true; + } + + return portalProps; + }; + + _this.hideOnScroll = function (e) { + _this.setState({ + closed: true + }); + + _lib__WEBPACK_IMPORTED_MODULE_16__["eventStack"].unsub('scroll', _this.hideOnScroll, { + target: window + }); + _this.timeoutId = setTimeout(function () { + _this.setState({ + closed: false + }); + }, 50); + + _this.handleClose(e); + }; + + _this.handleClose = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onClose', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: false + })); + }; + + _this.handleOpen = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onOpen', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + open: true + })); + }; + + _this.handlePortalMount = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onMount', e, _this.props); + }; + + _this.handlePortalUnmount = function (e) { + _this.positionUpdate = null; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onUnmount', e, _this.props); + }; + + _this.renderContent = function (_ref) { + var popperPlacement = _ref.placement, + popperRef = _ref.ref, + update = _ref.update, + popperStyle = _ref.style; + var _this$props2 = _this.props, + basic = _this$props2.basic, + children = _this$props2.children, + className = _this$props2.className, + content = _this$props2.content, + hideOnScroll = _this$props2.hideOnScroll, + flowing = _this$props2.flowing, + header = _this$props2.header, + inverted = _this$props2.inverted, + popper = _this$props2.popper, + size = _this$props2.size, + style = _this$props2.style, + wide = _this$props2.wide; + var contentRestProps = _this.state.contentRestProps; + _this.positionUpdate = update; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_11__["default"])('ui', _lib_positions__WEBPACK_IMPORTED_MODULE_18__["placementMapping"][popperPlacement], size, Object(_lib__WEBPACK_IMPORTED_MODULE_16__["useKeyOrValueAndKey"])(wide, 'wide'), Object(_lib__WEBPACK_IMPORTED_MODULE_16__["useKeyOnly"])(basic, 'basic'), Object(_lib__WEBPACK_IMPORTED_MODULE_16__["useKeyOnly"])(flowing, 'flowing'), Object(_lib__WEBPACK_IMPORTED_MODULE_16__["useKeyOnly"])(inverted, 'inverted'), 'popup transition visible', className); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_16__["getElementType"])(Popup, _this.props); + + var styles = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + // Heads up! We need default styles to get working correctly `flowing` + left: 'auto', + right: 'auto', + // This is required to be properly positioned inside wrapping `div` + position: 'initial' + }, style); + + var innerElement = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_13___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, contentRestProps, { + className: classes, + style: styles + }), _lib__WEBPACK_IMPORTED_MODULE_16__["childrenUtils"].isNil(children) ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_13___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_13___default.a.Fragment, null, _PopupHeader__WEBPACK_IMPORTED_MODULE_21__["default"].create(header, { + autoGenerateKey: false + }), _PopupContent__WEBPACK_IMPORTED_MODULE_20__["default"].create(content, { + autoGenerateKey: false + })) : children, hideOnScroll && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_13___default.a.createElement(_semantic_ui_react_event_stack__WEBPACK_IMPORTED_MODULE_10___default.a, { + on: _this.hideOnScroll, + name: "scroll", + target: "window" + })); // https://github.com/popperjs/popper-core/blob/f1f9d1ab75b6b0e962f90a5b2a50f6cfd307d794/src/createPopper.js#L136-L137 + // Heads up! + // A wrapping `div` there is a pure magic, it's required as Popper warns on margins that are + // defined by SUI CSS. It also means that this `div` will be positioned instead of `content`. + + return Object(_lib__WEBPACK_IMPORTED_MODULE_16__["createHTMLDivision"])(popper || {}, { + overrideProps: { + children: innerElement, + ref: popperRef, + style: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + // Fixes layout for floated elements + // https://github.com/Semantic-Org/Semantic-UI-React/issues/4092 + display: 'flex' + }, popperStyle) + } + }); + }; + + return _this; + } + + Popup.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + if (state.closed || state.disabled) return {}; + var unhandledProps = Object(_lib__WEBPACK_IMPORTED_MODULE_16__["getUnhandledProps"])(Popup, props); + + var contentRestProps = Object(lodash_es_reduce__WEBPACK_IMPORTED_MODULE_9__["default"])(unhandledProps, function (acc, val, key) { + if (!Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_8__["default"])(_addons_Portal__WEBPACK_IMPORTED_MODULE_17__["default"].handledProps, key)) acc[key] = val; + return acc; + }, {}); + + var portalRestProps = Object(lodash_es_pick__WEBPACK_IMPORTED_MODULE_7__["default"])(unhandledProps, _addons_Portal__WEBPACK_IMPORTED_MODULE_17__["default"].handledProps); + + return { + contentRestProps: contentRestProps, + portalRestProps: portalRestProps + }; + }; + + var _proto = Popup.prototype; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps) { + var depsEqual = shallowequal__WEBPACK_IMPORTED_MODULE_15___default()(this.props.popperDependencies, prevProps.popperDependencies); + + if (!depsEqual) { + this.handleUpdate(); + } + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + clearTimeout(this.timeoutId); + }; + + _proto.handleUpdate = function handleUpdate() { + if (this.positionUpdate) this.positionUpdate(); + }; + + _proto.render = function render() { + var _this2 = this; + + var _this$props3 = this.props, + context = _this$props3.context, + disabled = _this$props3.disabled, + eventsEnabled = _this$props3.eventsEnabled, + offset = _this$props3.offset, + pinned = _this$props3.pinned, + popper = _this$props3.popper, + popperModifiers = _this$props3.popperModifiers, + position = _this$props3.position, + positionFixed = _this$props3.positionFixed, + trigger = _this$props3.trigger; + var _this$state = this.state, + closed = _this$state.closed, + portalRestProps = _this$state.portalRestProps; + + if (closed || disabled) { + return trigger; + } + + var modifiers = [{ + name: 'arrow', + enabled: false + }, { + name: 'eventListeners', + options: { + scroll: !!eventsEnabled, + resize: !!eventsEnabled + } + }, { + name: 'flip', + enabled: !pinned + }, { + name: 'preventOverflow', + enabled: !!offset + }, { + name: 'offset', + enabled: !!offset, + options: { + offset: offset + } + }].concat(popperModifiers, [// We are syncing zIndex from `.ui.popup.content` to avoid layering issues as in SUIR we are using an additional + // `div` for Popper.js + // https://github.com/Semantic-Org/Semantic-UI-React/issues/4083 + { + name: 'syncZIndex', + enabled: true, + phase: 'beforeRead', + fn: function fn(_ref2) { + var _popper$style; + + var state = _ref2.state; + + if (_this2.zIndexWasSynced) { + return; + } // if zIndex defined in <Popup popper={{ style: {} }} /> there is no sense to override it + + + var definedZIndex = popper == null ? void 0 : (_popper$style = popper.style) == null ? void 0 : _popper$style.zIndex; + + if (Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_4__["default"])(definedZIndex)) { + // eslint-disable-next-line no-param-reassign + state.elements.popper.style.zIndex = window.getComputedStyle(state.elements.popper.firstChild).zIndex; + } + + _this2.zIndexWasSynced = true; + }, + effect: function effect() { + return function () { + _this2.zIndexWasSynced = false; + }; + } + }]); + var referenceElement = Object(_lib_createReferenceProxy__WEBPACK_IMPORTED_MODULE_19__["default"])(Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(context) ? this.triggerRef : context); + + var mergedPortalProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, this.getPortalProps(), portalRestProps); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_13___default.a.createElement(_addons_Portal__WEBPACK_IMPORTED_MODULE_17__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, mergedPortalProps, { + onClose: this.handleClose, + onMount: this.handlePortalMount, + onOpen: this.handleOpen, + onUnmount: this.handlePortalUnmount, + trigger: trigger, + triggerRef: this.triggerRef + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_13___default.a.createElement(react_popper__WEBPACK_IMPORTED_MODULE_14__["Popper"], { + modifiers: modifiers, + placement: _lib_positions__WEBPACK_IMPORTED_MODULE_18__["positionsMapping"][position], + strategy: positionFixed ? 'fixed' : null, + referenceElement: referenceElement + }, this.renderContent)); + }; + + return Popup; +}(react__WEBPACK_IMPORTED_MODULE_13__["Component"]); + +Popup.handledProps = ["as", "basic", "children", "className", "content", "context", "disabled", "eventsEnabled", "flowing", "header", "hideOnScroll", "hoverable", "inverted", "offset", "on", "onClose", "onMount", "onOpen", "onUnmount", "pinned", "popper", "popperDependencies", "popperModifiers", "position", "positionFixed", "size", "style", "trigger", "wide"]; + +Popup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.elementType, + + /** Display the popup without the pointing arrow. */ + basic: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.string, + + /** Simple text content for the popover. */ + content: _lib__WEBPACK_IMPORTED_MODULE_16__["customPropTypes"].itemShorthand, + + /** Existing element the pop-up should be bound to. */ + context: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.object, _lib__WEBPACK_IMPORTED_MODULE_16__["customPropTypes"].refObject]), + + /** A disabled popup only renders its trigger. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** Enables the Popper.js event listeners. */ + eventsEnabled: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** A flowing Popup has no maximum width and continues to flow to fit its content. */ + flowing: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** Takes up the entire width of its offset container. */ + // TODO: implement the Popup fluid layout + // fluid: PropTypes.bool, + + /** Header displayed above the content in bold. */ + header: _lib__WEBPACK_IMPORTED_MODULE_16__["customPropTypes"].itemShorthand, + + /** Hide the Popup when scrolling the window. */ + hideOnScroll: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** Whether the popup should not close on hover. */ + hoverable: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** Invert the colors of the Popup. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** + * Offset values in px unit to apply to rendered popup. The basic offset accepts an + * array with two numbers in the form [skidding, distance]: + * - `skidding` displaces the Popup along the reference element + * - `distance` displaces the Popup away from, or toward, the reference element in the direction of its placement. A positive number displaces it further away, while a negative number lets it overlap the reference. + * + * @see https://popper.js.org/docs/v2/modifiers/offset/ + */ + offset: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.func, prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.number)]), + + /** Events triggering the popup. */ + on: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOf(['hover', 'click', 'focus']), prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOf(['hover', 'click', 'focus']))]), + + /** + * Called when a close event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClose: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.func, + + /** + * Called when the portal is mounted on the DOM. + * + * @param {null} + * @param {object} data - All props. + */ + onMount: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.func, + + /** + * Called when an open event happens. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onOpen: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.func, + + /** + * Called when the portal is unmounted from the DOM. + * + * @param {null} + * @param {object} data - All props. + */ + onUnmount: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.func, + + /** Disables automatic repositioning of the component, it will always be placed according to the position value. */ + pinned: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** Position for the popover. */ + position: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOf(_lib_positions__WEBPACK_IMPORTED_MODULE_18__["positions"]), + + /** Tells `Popper.js` to use the `position: fixed` strategy to position the popover. */ + positionFixed: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, + + /** A wrapping element for an actual content that will be used for positioning. */ + popper: _lib__WEBPACK_IMPORTED_MODULE_16__["customPropTypes"].itemShorthand, + + /** An array containing custom settings for the Popper.js modifiers. */ + popperModifiers: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.array, + + /** A popup can have dependencies which update will schedule a position update. */ + popperDependencies: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.array, + + /** Popup size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_16__["SUI"].SIZES, 'medium', 'big', 'massive')), + + /** Custom Popup style. */ + style: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.object, + + /** Element to be rendered in-place where the popup is defined. */ + trigger: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.node, + + /** Popup width. */ + wide: prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_12___default.a.oneOf(['very'])]) +} : undefined; +Popup.defaultProps = { + disabled: false, + eventsEnabled: true, + on: ['click', 'hover'], + pinned: false, + popperModifiers: [], + position: 'top left' +}; +Popup.Content = _PopupContent__WEBPACK_IMPORTED_MODULE_20__["default"]; +Popup.Header = _PopupHeader__WEBPACK_IMPORTED_MODULE_21__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupContent.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupContent.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 PopupContent; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A PopupContent displays the content body of a Popover. + */ + +function PopupContent(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(PopupContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(PopupContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} +PopupContent.handledProps = ["as", "children", "className", "content"]; +PopupContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** The content of the Popup */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Classes to add to the Popup content className. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +PopupContent.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(PopupContent, function (children) { + return { + children: children + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupHeader.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Popup/PopupHeader.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 PopupHeader; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A PopupHeader displays a header in a Popover. + */ + +function PopupHeader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(PopupHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(PopupHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} +PopupHeader.handledProps = ["as", "children", "className", "content"]; +PopupHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +PopupHeader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(PopupHeader, function (children) { + return { + children: children + }; +}); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Popup/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Popup/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Popup__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Popup */ "./node_modules/semantic-ui-react/dist/es/modules/Popup/Popup.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Popup__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Popup/lib/createReferenceProxy.js": +/*!******************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Popup/lib/createReferenceProxy.js ***! + \******************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/createClass */ "./node_modules/@babel/runtime/helpers/esm/createClass.js"); +/* harmony import */ var lodash_es_memoize__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/memoize */ "./node_modules/lodash-es/memoize.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); + + + + + +var ReferenceProxy = /*#__PURE__*/function () { + function ReferenceProxy(refObject) { + this.ref = refObject; + } + + var _proto = ReferenceProxy.prototype; + + _proto.getBoundingClientRect = function getBoundingClientRect() { + return Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(this.ref.current, 'getBoundingClientRect') || {}; + }; + + Object(_babel_runtime_helpers_esm_createClass__WEBPACK_IMPORTED_MODULE_0__["default"])(ReferenceProxy, [{ + key: "clientWidth", + get: function get() { + return this.getBoundingClientRect().width; + } + }, { + key: "clientHeight", + get: function get() { + return this.getBoundingClientRect().height; + } + }, { + key: "parentNode", + get: function get() { + return this.ref.current ? this.ref.current.parentNode : undefined; + } + }]); + + return ReferenceProxy; +}(); +/** + * Popper.js does not support ref objects from `createRef()` as referenceElement. If we will pass + * directly `ref`, `ref.current` will be `null` at the render process. We use memoize to keep the + * same reference between renders. + * + * @see https://popper.js.org/popper-documentation.html#referenceObject + */ + + +var createReferenceProxy = Object(lodash_es_memoize__WEBPACK_IMPORTED_MODULE_1__["default"])(function (reference) { + return new ReferenceProxy(Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__["isRefObject"])(reference) ? reference : { + current: reference + }); +}); + +/* harmony default export */ __webpack_exports__["default"] = (createReferenceProxy); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Popup/lib/positions.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Popup/lib/positions.js ***! + \*******************************************************************************/ +/*! exports provided: positionsMapping, positions, placementMapping */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionsMapping", function() { return positionsMapping; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positions", function() { return positions; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "placementMapping", function() { return placementMapping; }); +/* harmony import */ var lodash_es_invert__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/invert */ "./node_modules/lodash-es/invert.js"); +/* harmony import */ var lodash_es_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/keys */ "./node_modules/lodash-es/keys.js"); + + +var positionsMapping = { + 'top center': 'top', + 'top left': 'top-start', + 'top right': 'top-end', + 'bottom center': 'bottom', + 'bottom left': 'bottom-start', + 'bottom right': 'bottom-end', + 'right center': 'right', + 'left center': 'left' +}; +var positions = Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(positionsMapping); +var placementMapping = Object(lodash_es_invert__WEBPACK_IMPORTED_MODULE_0__["default"])(positionsMapping); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Progress/Progress.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Progress/Progress.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_round__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/round */ "./node_modules/lodash-es/round.js"); +/* harmony import */ var lodash_es_clamp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/clamp */ "./node_modules/lodash-es/clamp.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + + + +/** + * A progress bar shows the progression of a task. + */ + +var Progress = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Progress, _Component); + + function Progress() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.calculatePercent = function () { + var _this$props = _this.props, + percent = _this$props.percent, + total = _this$props.total, + value = _this$props.value; + if (!Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(percent)) return percent; + if (!Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(total) && !Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(value)) return value / total * 100; + }; + + _this.computeValueText = function (percent) { + var _this$props2 = _this.props, + progress = _this$props2.progress, + total = _this$props2.total, + value = _this$props2.value; + if (progress === 'value') return value; + if (progress === 'ratio') return value + "/" + total; + return percent + "%"; + }; + + _this.getPercent = function () { + var _this$props3 = _this.props, + precision = _this$props3.precision, + progress = _this$props3.progress, + total = _this$props3.total, + value = _this$props3.value; + + var percent = Object(lodash_es_clamp__WEBPACK_IMPORTED_MODULE_4__["default"])(_this.calculatePercent(), 0, 100); + + if (!Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(total) && !Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(value) && progress === 'value') { + return value / total * 100; + } + + if (progress === 'value') return value; + if (Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(precision)) return percent; + return Object(lodash_es_round__WEBPACK_IMPORTED_MODULE_3__["default"])(percent, precision); + }; + + _this.isAutoSuccess = function () { + var _this$props4 = _this.props, + autoSuccess = _this$props4.autoSuccess, + percent = _this$props4.percent, + total = _this$props4.total, + value = _this$props4.value; + return autoSuccess && (percent >= 100 || value >= total); + }; + + _this.renderLabel = function () { + var _this$props5 = _this.props, + children = _this$props5.children, + content = _this$props5.content, + label = _this$props5.label; + if (!_lib__WEBPACK_IMPORTED_MODULE_9__["childrenUtils"].isNil(children)) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", { + className: "label" + }, children); + if (!_lib__WEBPACK_IMPORTED_MODULE_9__["childrenUtils"].isNil(content)) return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", { + className: "label" + }, content); + return Object(_lib__WEBPACK_IMPORTED_MODULE_9__["createHTMLDivision"])(label, { + autoGenerateKey: false, + defaultProps: { + className: 'label' + } + }); + }; + + _this.renderProgress = function (percent) { + var _this$props6 = _this.props, + precision = _this$props6.precision, + progress = _this$props6.progress; + if (!progress && Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_5__["default"])(precision)) return; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", { + className: "progress" + }, _this.computeValueText(percent)); + }; + + return _this; + } + + var _proto = Progress.prototype; + + _proto.render = function render() { + var _this$props7 = this.props, + active = _this$props7.active, + attached = _this$props7.attached, + className = _this$props7.className, + color = _this$props7.color, + disabled = _this$props7.disabled, + error = _this$props7.error, + indicating = _this$props7.indicating, + inverted = _this$props7.inverted, + size = _this$props7.size, + success = _this$props7.success, + warning = _this$props7.warning; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_6__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(active || indicating, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(error, 'error'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(indicating, 'indicating'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(success || this.isAutoSuccess(), 'success'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(warning, 'warning'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useValueAndKey"])(attached, 'attached'), 'progress', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getUnhandledProps"])(Progress, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getElementType"])(Progress, this.props); + var percent = this.getPercent() || 0; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + "data-percent": Math.floor(percent) + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement("div", { + className: "bar", + style: { + width: percent + "%" + } + }, this.renderProgress(percent)), this.renderLabel()); + }; + + return Progress; +}(react__WEBPACK_IMPORTED_MODULE_8__["Component"]); + +Progress.handledProps = ["active", "as", "attached", "autoSuccess", "children", "className", "color", "content", "disabled", "error", "indicating", "inverted", "label", "percent", "precision", "progress", "size", "success", "total", "value", "warning"]; +Progress.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType, + + /** A progress bar can show activity. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** A progress bar can attach to and show the progress of an element (i.e. Card or Segment). */ + attached: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['top', 'bottom']), + + /** Whether success state should automatically trigger when progress completes. */ + autoSuccess: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string, + + /** A progress bar can have different colors. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_9__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].contentShorthand, + + /** A progress bar be disabled. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** A progress bar can show a error state. */ + error: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** An indicating progress bar visually indicates the current level of progress of a task. */ + indicating: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** A progress bar can have its colors inverted. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Can be set to either to display progress as percent or ratio. */ + label: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].itemShorthand, + + /** Current percent complete. */ + percent: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].disallow(['total', 'value']), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string])]), + + /** Decimal point precision for calculated progress. */ + precision: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, + + /** A progress bar can contain a text value indicating current progress. */ + progress: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(['percent', 'ratio', 'value'])]), + + /** A progress bar can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_9__["SUI"].SIZES, 'mini', 'huge', 'massive')), + + /** A progress bar can show a success state. */ + success: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** For use with value. Together, these will calculate the percent. Mutually excludes percent. */ + total: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].demand(['value']), _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].disallow(['percent']), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string])]), + + /** For use with total. Together, these will calculate the percent. Mutually excludes percent. */ + value: _lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_9__["customPropTypes"].disallow(['percent']), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string])]), + + /** A progress bar can show a warning state. */ + warning: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Progress); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Progress/index.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Progress/index.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Progress__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Progress */ "./node_modules/semantic-ui-react/dist/es/modules/Progress/Progress.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Progress__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Rating/Rating.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Rating/Rating.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 Rating; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_times__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/times */ "./node_modules/lodash-es/times.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _RatingIcon__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RatingIcon */ "./node_modules/semantic-ui-react/dist/es/modules/Rating/RatingIcon.js"); + + + + + + + + + + +/** + * A rating indicates user interest in content. + */ + +var Rating = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Rating, _Component); + + function Rating() { + var _this; + + for (var _len = arguments.length, _args = new Array(_len), _key = 0; _key < _len; _key++) { + _args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(_args)) || this; + + _this.handleIconClick = function (e, _ref) { + var index = _ref.index; + var _this$props = _this.props, + clearable = _this$props.clearable, + disabled = _this$props.disabled, + maxRating = _this$props.maxRating, + onRate = _this$props.onRate; + var rating = _this.state.rating; + if (disabled) return; // default newRating is the clicked icon + // allow toggling a binary rating + // allow clearing ratings + + var newRating = index + 1; + + if (clearable === 'auto' && maxRating === 1) { + newRating = +!rating; + } else if (clearable === true && newRating === rating) { + newRating = 0; + } // set rating + + + _this.setState({ + rating: newRating, + isSelecting: false + }); + + if (onRate) onRate(e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + rating: newRating + })); + }; + + _this.handleIconMouseEnter = function (e, _ref2) { + var index = _ref2.index; + if (_this.props.disabled) return; + + _this.setState({ + selectedIndex: index, + isSelecting: true + }); + }; + + _this.handleMouseLeave = function () { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + + lodash_es_invoke__WEBPACK_IMPORTED_MODULE_4__["default"].apply(void 0, [_this.props, 'onMouseLeave'].concat(args)); + + if (_this.props.disabled) return; + + _this.setState({ + selectedIndex: -1, + isSelecting: false + }); + }; + + return _this; + } + + var _proto = Rating.prototype; + + _proto.render = function render() { + var _this2 = this; + + var _this$props2 = this.props, + className = _this$props2.className, + disabled = _this$props2.disabled, + icon = _this$props2.icon, + maxRating = _this$props2.maxRating, + size = _this$props2.size; + var _this$state = this.state, + rating = _this$state.rating, + selectedIndex = _this$state.selectedIndex, + isSelecting = _this$state.isSelecting; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('ui', icon, size, Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(disabled, 'disabled'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(isSelecting && !disabled && selectedIndex >= 0, 'selected'), 'rating', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getUnhandledProps"])(Rating, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getElementType"])(Rating, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + role: "radiogroup", + onMouseLeave: this.handleMouseLeave, + tabIndex: disabled ? 0 : -1 + }), Object(lodash_es_times__WEBPACK_IMPORTED_MODULE_3__["default"])(maxRating, function (i) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_RatingIcon__WEBPACK_IMPORTED_MODULE_9__["default"], { + tabIndex: disabled ? -1 : 0, + active: rating >= i + 1, + "aria-checked": rating === i + 1, + "aria-posinset": i + 1, + "aria-setsize": maxRating, + index: i, + key: i, + onClick: _this2.handleIconClick, + onMouseEnter: _this2.handleIconMouseEnter, + selected: selectedIndex >= i && isSelecting + }); + })); + }; + + return Rating; +}(_lib__WEBPACK_IMPORTED_MODULE_8__["ModernAutoControlledComponent"]); + +Rating.handledProps = ["as", "className", "clearable", "defaultRating", "disabled", "icon", "maxRating", "onRate", "rating", "size"]; + +Rating.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** + * You can clear the rating by clicking on the current start rating. + * By default a rating will be only clearable if there is 1 icon. + * Setting to `true`/`false` will allow or disallow a user to clear their rating. + */ + clearable: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['auto'])]), + + /** The initial rating value. */ + defaultRating: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** You can disable or enable interactive rating. Makes a read-only rating. */ + disabled: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** A rating can use a set of star or heart icons. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['star', 'heart']), + + /** The total number of icons. */ + maxRating: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** + * Called after user selects a new rating. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and proposed rating. + */ + onRate: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** The current number of active icons. */ + rating: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** A progress bar can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_8__["SUI"].SIZES, 'medium', 'big')) +} : undefined; +Rating.autoControlledProps = ['rating']; +Rating.defaultProps = { + clearable: 'auto', + maxRating: 1 +}; +Rating.Icon = _RatingIcon__WEBPACK_IMPORTED_MODULE_9__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Rating/RatingIcon.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Rating/RatingIcon.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 RatingIcon; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! keyboard-key */ "./node_modules/keyboard-key/src/keyboardKey.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(keyboard_key__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + +/** + * An internal icon sub-component for Rating component + */ + +var RatingIcon = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(RatingIcon, _Component); + + function RatingIcon() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClick', e, _this.props); + }; + + _this.handleKeyUp = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onKeyUp', e, _this.props); + + switch (keyboard_key__WEBPACK_IMPORTED_MODULE_4___default.a.getCode(e)) { + case keyboard_key__WEBPACK_IMPORTED_MODULE_4___default.a.Enter: + case keyboard_key__WEBPACK_IMPORTED_MODULE_4___default.a.Spacebar: + e.preventDefault(); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onClick', e, _this.props); + + break; + + default: + } + }; + + _this.handleMouseEnter = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onMouseEnter', e, _this.props); + }; + + return _this; + } + + var _proto = RatingIcon.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + className = _this$props.className, + selected = _this$props.selected; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_7__["useKeyOnly"])(selected, 'selected'), 'icon', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(RatingIcon, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(RatingIcon, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick, + onKeyUp: this.handleKeyUp, + onMouseEnter: this.handleMouseEnter, + role: "radio" + })); + }; + + return RatingIcon; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +RatingIcon.handledProps = ["active", "as", "className", "index", "onClick", "onKeyUp", "onMouseEnter", "selected"]; + +RatingIcon.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** Indicates activity of an icon. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** An index of icon inside Rating. */ + index: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Called on keyup. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onKeyUp: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Called on mouseenter. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** Indicates selection of an icon. */ + selected: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool +} : undefined; +RatingIcon.defaultProps = { + as: 'i' +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Rating/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Rating/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Rating__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Rating */ "./node_modules/semantic-ui-react/dist/es/modules/Rating/Rating.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Rating__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Search/Search.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Search/Search.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 Search; }); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/isEmpty */ "./node_modules/lodash-es/isEmpty.js"); +/* harmony import */ var lodash_es_partialRight__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/partialRight */ "./node_modules/lodash-es/partialRight.js"); +/* harmony import */ var lodash_es_inRange__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/inRange */ "./node_modules/lodash-es/inRange.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_reduce__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! lodash-es/reduce */ "./node_modules/lodash-es/reduce.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! lodash-es/isPlainObject */ "./node_modules/lodash-es/isPlainObject.js"); +/* harmony import */ var lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! lodash-es/isUndefined */ "./node_modules/lodash-es/isUndefined.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! keyboard-key */ "./node_modules/keyboard-key/src/keyboardKey.js"); +/* harmony import */ var keyboard_key__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(keyboard_key__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_15__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_16___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_16__); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! shallowequal */ "./node_modules/shallowequal/index.js"); +/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(shallowequal__WEBPACK_IMPORTED_MODULE_17__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Input__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../elements/Input */ "./node_modules/semantic-ui-react/dist/es/elements/Input/index.js"); +/* harmony import */ var _SearchCategory__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./SearchCategory */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategory.js"); +/* harmony import */ var _SearchResult__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./SearchResult */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResult.js"); +/* harmony import */ var _SearchResults__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./SearchResults */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResults.js"); + + + + + + + + + + + + + + + + + + + + + + + + +var overrideSearchInputProps = function overrideSearchInputProps(predefinedProps) { + var input = predefinedProps.input; + + if (Object(lodash_es_isUndefined__WEBPACK_IMPORTED_MODULE_12__["default"])(input)) { + return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, predefinedProps, { + input: { + className: 'prompt' + } + }); + } + + if (Object(lodash_es_isPlainObject__WEBPACK_IMPORTED_MODULE_11__["default"])(input)) { + return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, predefinedProps, { + input: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, input, { + className: Object(clsx__WEBPACK_IMPORTED_MODULE_13__["default"])(input.className, 'prompt') + }) + }); + } + + return predefinedProps; +}; +/** + * A search module allows a user to query for results from a selection of data + */ + + +var Search = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Search, _Component); + + function Search() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleResultSelect = function (e, result) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__["default"])(_this.props, 'onResultSelect', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, _this.props, { + result: result + })); + }; + + _this.handleSelectionChange = function (e) { + var result = _this.getSelectedResult(); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__["default"])(_this.props, 'onSelectionChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, _this.props, { + result: result + })); + }; + + _this.closeOnEscape = function (e) { + if (keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.getCode(e) !== keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.Escape) return; + e.preventDefault(); + + _this.close(); + }; + + _this.moveSelectionOnKeyDown = function (e) { + switch (keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.getCode(e)) { + case keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.ArrowDown: + e.preventDefault(); + + _this.moveSelectionBy(e, 1); + + break; + + case keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.ArrowUp: + e.preventDefault(); + + _this.moveSelectionBy(e, -1); + + break; + + default: + break; + } + }; + + _this.selectItemOnEnter = function (e) { + if (keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.getCode(e) !== keyboard_key__WEBPACK_IMPORTED_MODULE_14___default.a.Enter) return; + + var result = _this.getSelectedResult(); // prevent selecting null if there was no selected item value + + + if (!result) return; + e.preventDefault(); // notify the onResultSelect prop that the user is trying to change value + + _this.setValue(result.title); + + _this.handleResultSelect(e, result); + + _this.close(); + }; + + _this.closeOnDocumentClick = function (e) { + _this.close(); + }; + + _this.handleMouseDown = function (e) { + _this.isMouseDown = true; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__["default"])(_this.props, 'onMouseDown', e, _this.props); + + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].sub('mouseup', _this.handleDocumentMouseUp); + }; + + _this.handleDocumentMouseUp = function () { + _this.isMouseDown = false; + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].unsub('mouseup', _this.handleDocumentMouseUp); + }; + + _this.handleInputClick = function (e) { + // prevent closeOnDocumentClick() + e.nativeEvent.stopImmediatePropagation(); + + _this.tryOpen(); + }; + + _this.handleItemClick = function (e, _ref) { + var id = _ref.id; + + var result = _this.getSelectedResult(id); // prevent closeOnDocumentClick() + + + e.nativeEvent.stopImmediatePropagation(); // notify the onResultSelect prop that the user is trying to change value + + _this.setValue(result.title); + + _this.handleResultSelect(e, result); + + _this.close(); + }; + + _this.handleItemMouseDown = function (e) { + // Heads up! We should prevent default to prevent blur events. + // https://github.com/Semantic-Org/Semantic-UI-React/issues/3298 + e.preventDefault(); + }; + + _this.handleFocus = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__["default"])(_this.props, 'onFocus', e, _this.props); + + _this.setState({ + focus: true + }); + }; + + _this.handleBlur = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__["default"])(_this.props, 'onBlur', e, _this.props); + + _this.setState({ + focus: false + }); + }; + + _this.handleSearchChange = function (e) { + // prevent propagating to this.props.onChange() + e.stopPropagation(); + var minCharacters = _this.props.minCharacters; + var open = _this.state.open; + var newQuery = e.target.value; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_10__["default"])(_this.props, 'onSearchChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, _this.props, { + value: newQuery + })); // open search dropdown on search query + + + if (newQuery.length < minCharacters) { + _this.close(); + } else if (!open) { + _this.tryOpen(newQuery); + } + + _this.setValue(newQuery); + }; + + _this.getFlattenedResults = function () { + var _this$props = _this.props, + category = _this$props.category, + results = _this$props.results; + return !category ? results : Object(lodash_es_reduce__WEBPACK_IMPORTED_MODULE_9__["default"])(results, function (memo, categoryData) { + return memo.concat(categoryData.results); + }, []); + }; + + _this.getSelectedResult = function (index) { + if (index === void 0) { + index = _this.state.selectedIndex; + } + + var results = _this.getFlattenedResults(); + + return Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_8__["default"])(results, index); + }; + + _this.setValue = function (value) { + var selectFirstResult = _this.props.selectFirstResult; + + _this.setState({ + value: value, + selectedIndex: selectFirstResult ? 0 : -1 + }); + }; + + _this.moveSelectionBy = function (e, offset) { + var selectedIndex = _this.state.selectedIndex; + + var results = _this.getFlattenedResults(); + + var lastIndex = results.length - 1; // next is after last, wrap to beginning + // next is before first, wrap to end + + var nextIndex = selectedIndex + offset; + if (nextIndex > lastIndex) nextIndex = 0;else if (nextIndex < 0) nextIndex = lastIndex; + + _this.setState({ + selectedIndex: nextIndex + }); + + _this.scrollSelectedItemIntoView(); + + _this.handleSelectionChange(e); + }; + + _this.scrollSelectedItemIntoView = function () { + // Do not access document when server side rendering + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_18__["isBrowser"])()) return; + var menu = document.querySelector('.ui.search.active.visible .results.visible'); + if (!menu) return; + var item = menu.querySelector('.result.active'); + if (!item) return; + var isOutOfUpperView = item.offsetTop < menu.scrollTop; + var isOutOfLowerView = item.offsetTop + item.clientHeight > menu.scrollTop + menu.clientHeight; + + if (isOutOfUpperView) { + menu.scrollTop = item.offsetTop; + } else if (isOutOfLowerView) { + menu.scrollTop = item.offsetTop + item.clientHeight - menu.clientHeight; + } + }; + + _this.tryOpen = function (currentValue) { + if (currentValue === void 0) { + currentValue = _this.state.value; + } + + var minCharacters = _this.props.minCharacters; + if (currentValue.length < minCharacters) return; + + _this.open(); + }; + + _this.open = function () { + _this.setState({ + open: true + }); + }; + + _this.close = function () { + _this.setState({ + open: false + }); + }; + + _this.renderSearchInput = function (rest) { + var _this$props2 = _this.props, + icon = _this$props2.icon, + input = _this$props2.input; + var value = _this.state.value; + return _elements_Input__WEBPACK_IMPORTED_MODULE_19__["default"].create(input, { + autoGenerateKey: false, + defaultProps: Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, rest, { + autoComplete: 'off', + icon: icon, + onChange: _this.handleSearchChange, + onClick: _this.handleInputClick, + tabIndex: '0', + value: value + }), + // Nested shorthand props need special treatment to survive the shallow merge + overrideProps: overrideSearchInputProps + }); + }; + + _this.renderNoResults = function () { + var _this$props3 = _this.props, + noResultsDescription = _this$props3.noResultsDescription, + noResultsMessage = _this$props3.noResultsMessage; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement("div", { + className: "message empty" + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement("div", { + className: "header" + }, noResultsMessage), noResultsDescription && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement("div", { + className: "description" + }, noResultsDescription)); + }; + + _this.renderResult = function (_ref2, index, _array, offset) { + var childKey = _ref2.childKey, + result = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(_ref2, ["childKey"]); + + if (offset === void 0) { + offset = 0; + } + + var resultRenderer = _this.props.resultRenderer; + var selectedIndex = _this.state.selectedIndex; + var offsetIndex = index + offset; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement(_SearchResult__WEBPACK_IMPORTED_MODULE_21__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({ + key: childKey != null ? childKey : result.id || result.title, + active: selectedIndex === offsetIndex, + onClick: _this.handleItemClick, + onMouseDown: _this.handleItemMouseDown, + renderer: resultRenderer + }, result, { + id: offsetIndex // Used to lookup the result on item click + + })); + }; + + _this.renderResults = function () { + var results = _this.props.results; + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_7__["default"])(results, _this.renderResult); + }; + + _this.renderCategories = function () { + var _this$props4 = _this.props, + categoryLayoutRenderer = _this$props4.categoryLayoutRenderer, + categoryRenderer = _this$props4.categoryRenderer, + categories = _this$props4.results; + var selectedIndex = _this.state.selectedIndex; + var count = 0; + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_7__["default"])(categories, function (_ref3) { + var childKey = _ref3.childKey, + category = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(_ref3, ["childKey"]); + + var categoryProps = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({ + key: childKey != null ? childKey : category.name, + active: Object(lodash_es_inRange__WEBPACK_IMPORTED_MODULE_6__["default"])(selectedIndex, count, count + category.results.length), + layoutRenderer: categoryLayoutRenderer, + renderer: categoryRenderer + }, category); + + var renderFn = Object(lodash_es_partialRight__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.renderResult, count); + + count += category.results.length; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement(_SearchCategory__WEBPACK_IMPORTED_MODULE_20__["default"], categoryProps, category.results.map(renderFn)); + }); + }; + + _this.renderMenuContent = function () { + var _this$props5 = _this.props, + category = _this$props5.category, + showNoResults = _this$props5.showNoResults, + results = _this$props5.results; + + if (Object(lodash_es_isEmpty__WEBPACK_IMPORTED_MODULE_4__["default"])(results)) { + return showNoResults ? _this.renderNoResults() : null; + } + + return category ? _this.renderCategories() : _this.renderResults(); + }; + + _this.renderResultsMenu = function () { + var open = _this.state.open; + var resultsClasses = open ? 'visible' : ''; + + var menuContent = _this.renderMenuContent(); + + if (!menuContent) return; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement(_SearchResults__WEBPACK_IMPORTED_MODULE_22__["default"], { + className: resultsClasses + }, menuContent); + }; + + return _this; + } + + Search.getAutoControlledStateFromProps = function getAutoControlledStateFromProps(props, state) { + // We need to store a `prevValue` to compare as in `getDerivedStateFromProps` we don't have + // prevState + if (typeof state.prevValue !== 'undefined' && shallowequal__WEBPACK_IMPORTED_MODULE_17___default()(state.prevValue, state.value)) { + return { + prevValue: state.value + }; + } + + var selectedIndex = props.selectFirstResult ? 0 : -1; + return { + prevValue: state.value, + selectedIndex: selectedIndex + }; + }; + + var _proto = Search.prototype; + + _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState) { + return !shallowequal__WEBPACK_IMPORTED_MODULE_17___default()(nextProps, this.props) || !shallowequal__WEBPACK_IMPORTED_MODULE_17___default()(nextState, this.state); + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + // eslint-disable-line complexity + // focused / blurred + if (!prevState.focus && this.state.focus) { + if (!this.isMouseDown) { + this.tryOpen(); + } + + if (this.state.open) { + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].sub('keydown', [this.moveSelectionOnKeyDown, this.selectItemOnEnter]); + } + } else if (prevState.focus && !this.state.focus) { + if (!this.isMouseDown) { + this.close(); + } + + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].unsub('keydown', [this.moveSelectionOnKeyDown, this.selectItemOnEnter]); + } // opened / closed + + + if (!prevState.open && this.state.open) { + this.open(); + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].sub('click', this.closeOnDocumentClick); + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].sub('keydown', [this.closeOnEscape, this.moveSelectionOnKeyDown, this.selectItemOnEnter]); + } else if (prevState.open && !this.state.open) { + this.close(); + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].unsub('click', this.closeOnDocumentClick); + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].unsub('keydown', [this.closeOnEscape, this.moveSelectionOnKeyDown, this.selectItemOnEnter]); + } + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].unsub('click', this.closeOnDocumentClick); + _lib__WEBPACK_IMPORTED_MODULE_18__["eventStack"].unsub('keydown', [this.closeOnEscape, this.moveSelectionOnKeyDown, this.selectItemOnEnter]); + } // ---------------------------------------- + // Document Event Handlers + // ---------------------------------------- + ; + + _proto.render = function render() { + var _this$state = this.state, + searchClasses = _this$state.searchClasses, + focus = _this$state.focus, + open = _this$state.open; + var _this$props6 = this.props, + aligned = _this$props6.aligned, + category = _this$props6.category, + className = _this$props6.className, + fluid = _this$props6.fluid, + loading = _this$props6.loading, + size = _this$props6.size; // Classes + + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_13__["default"])('ui', open && 'active visible', size, searchClasses, Object(_lib__WEBPACK_IMPORTED_MODULE_18__["useKeyOnly"])(category, 'category'), Object(_lib__WEBPACK_IMPORTED_MODULE_18__["useKeyOnly"])(focus, 'focus'), Object(_lib__WEBPACK_IMPORTED_MODULE_18__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_18__["useKeyOnly"])(loading, 'loading'), Object(_lib__WEBPACK_IMPORTED_MODULE_18__["useValueAndKey"])(aligned, 'aligned'), 'search', className); + var unhandled = Object(_lib__WEBPACK_IMPORTED_MODULE_18__["getUnhandledProps"])(Search, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_18__["getElementType"])(Search, this.props); + + var _partitionHTMLProps = Object(_lib__WEBPACK_IMPORTED_MODULE_18__["partitionHTMLProps"])(unhandled, { + htmlProps: _lib__WEBPACK_IMPORTED_MODULE_18__["htmlInputAttrs"] + }), + htmlInputProps = _partitionHTMLProps[0], + rest = _partitionHTMLProps[1]; + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_16___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_2__["default"])({}, rest, { + className: classes, + onBlur: this.handleBlur, + onFocus: this.handleFocus, + onMouseDown: this.handleMouseDown + }), this.renderSearchInput(htmlInputProps), this.renderResultsMenu()); + }; + + return Search; +}(_lib__WEBPACK_IMPORTED_MODULE_18__["ModernAutoControlledComponent"]); + +Search.handledProps = ["aligned", "as", "category", "categoryLayoutRenderer", "categoryRenderer", "className", "defaultOpen", "defaultValue", "fluid", "icon", "input", "loading", "minCharacters", "noResultsDescription", "noResultsMessage", "onBlur", "onFocus", "onMouseDown", "onResultSelect", "onSearchChange", "onSelectionChange", "open", "resultRenderer", "results", "selectFirstResult", "showNoResults", "size", "value"]; + +Search.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.elementType, + // ------------------------------------ + // Behavior + // ------------------------------------ + + /** Initial value of open. */ + defaultOpen: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** Initial value. */ + defaultValue: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.string, + + /** Shorthand for Icon. */ + icon: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.node, prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.object]), + + /** Minimum characters to query for results */ + minCharacters: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.number, + + /** Additional text for "No Results" message with less emphasis. */ + noResultsDescription: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.node, + + /** Message to display when there are no results. */ + noResultsMessage: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.node, + + /** Controls whether or not the results menu is displayed. */ + open: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** + * One of: + * - array of Search.Result props e.g. `{ title: '', description: '' }` or + * - object of categories e.g. `{ name: '', results: [{ title: '', description: '' }]` + */ + results: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.shape(_SearchResult__WEBPACK_IMPORTED_MODULE_21__["default"].propTypes)), prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.shape(_SearchCategory__WEBPACK_IMPORTED_MODULE_20__["default"].propTypes)]), + + /** Whether the search should automatically select the first result after searching. */ + selectFirstResult: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** Whether a "no results" message should be shown if no results are found. */ + showNoResults: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** Current value of the search input. Creates a controlled component. */ + value: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.string, + // ------------------------------------ + // Rendering + // ------------------------------------ + + /** + * Renders the SearchCategory layout. + * + * @param {object} categoryContent - The Renderable SearchCategory contents. + * @param {object} resultsContent - The Renderable SearchResult contents. + * @returns {*} - Renderable SearchCategory layout. + */ + categoryLayoutRenderer: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Renders the SearchCategory contents. + * + * @param {object} props - The SearchCategory props object. + * @returns {*} - Renderable SearchCategory contents. + */ + categoryRenderer: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Renders the SearchResult contents. + * + * @param {object} props - The SearchResult props object. + * @returns {*} - Renderable SearchResult contents. + */ + resultRenderer: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + // ------------------------------------ + // Callbacks + // ------------------------------------ + + /** + * Called on blur. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onBlur: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Called on focus. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onFocus: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Called on mousedown. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onMouseDown: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Called when a result is selected. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onResultSelect: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Called on search input change. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props, includes current value of search input. + */ + onSearchChange: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + + /** + * Called when the active selection index is changed. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onSelectionChange: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.func, + // ------------------------------------ + // Style + // ------------------------------------ + + /** A search can have its results aligned to its left or right container edge. */ + aligned: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.string, + + /** A search can display results from remote content ordered by categories. */ + category: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.string, + + /** A search can have its results take up the width of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** Shorthand for input element. */ + input: _lib__WEBPACK_IMPORTED_MODULE_18__["customPropTypes"].itemShorthand, + + /** A search can show a loading indicator. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.bool, + + /** A search can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_15___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_3__["default"])(_lib__WEBPACK_IMPORTED_MODULE_18__["SUI"].SIZES, 'medium')) +} : undefined; +Search.defaultProps = { + icon: 'search', + input: 'text', + minCharacters: 1, + noResultsMessage: 'No results found.', + showNoResults: true +}; +Search.autoControlledProps = ['open', 'value']; +Search.Category = _SearchCategory__WEBPACK_IMPORTED_MODULE_20__["default"]; +Search.Result = _SearchResult__WEBPACK_IMPORTED_MODULE_21__["default"]; +Search.Results = _SearchResults__WEBPACK_IMPORTED_MODULE_22__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategory.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategory.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _SearchCategoryLayout__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./SearchCategoryLayout */ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategoryLayout.js"); + + + + + + + +function SearchCategory(props) { + var active = props.active, + children = props.children, + className = props.className, + content = props.content, + layoutRenderer = props.layoutRenderer, + renderer = props.renderer; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(active, 'active'), 'category', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(SearchCategory, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(SearchCategory, props); + var categoryContent = renderer(props); + var resultsContent = _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), layoutRenderer({ + categoryContent: categoryContent, + resultsContent: resultsContent + })); +} + +SearchCategory.handledProps = ["active", "as", "children", "className", "content", "layoutRenderer", "name", "renderer", "results"]; +SearchCategory.defaultProps = { + layoutRenderer: _SearchCategoryLayout__WEBPACK_IMPORTED_MODULE_5__["default"], + renderer: function renderer(_ref) { + var name = _ref.name; + return name; + } +}; +SearchCategory.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** The item currently selected by keyboard shortcut. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Display name. */ + name: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** + * Renders the category layout contents. + * + * @param {object} props - The SearchCategoryLayout props object. + * @returns {*} - Renderable category layout contents. + */ + layoutRenderer: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, + + /** + * Renders the category contents. + * + * @param {object} props - The SearchCategory props object. + * @returns {*} - Renderable category contents. + */ + renderer: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.func, + + /** Array of Search.Result props. */ + results: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.array +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SearchCategory); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategoryLayout.js": +/*!***************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Search/SearchCategoryLayout.js ***! + \***************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); + + + +function SearchCategoryLayout(props) { + var categoryContent = props.categoryContent, + resultsContent = props.resultsContent; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", { + className: "name" + }, categoryContent), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", { + className: "results" + }, resultsContent)); +} + +SearchCategoryLayout.handledProps = ["categoryContent", "resultsContent"]; +SearchCategoryLayout.propTypes = true ? { + /** The rendered category content */ + categoryContent: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element.isRequired, + + /** The rendered results content */ + resultsContent: prop_types__WEBPACK_IMPORTED_MODULE_0___default.a.element.isRequired +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SearchCategoryLayout); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResult.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResult.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 SearchResult; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + // Note: You technically only need the 'content' wrapper when there's an +// image. However, optionally wrapping it makes this function a lot more +// complicated and harder to read. Since always wrapping it doesn't affect +// the style in any way let's just do that. +// +// Note: To avoid requiring a wrapping div, we return an array here so to +// prevent rendering issues each node needs a unique key. + +var defaultRenderer = function defaultRenderer(_ref) { + var image = _ref.image, + price = _ref.price, + title = _ref.title, + description = _ref.description; + return [image && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + key: "image", + className: "image" + }, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createHTMLImage"])(image, { + autoGenerateKey: false + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + key: "content", + className: "content" + }, price && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + className: "price" + }, price), title && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + className: "title" + }, title), description && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement("div", { + className: "description" + }, description))]; +}; + +defaultRenderer.handledProps = []; + +var SearchResult = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(SearchResult, _Component); + + function SearchResult() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var onClick = _this.props.onClick; + if (onClick) onClick(e, _this.props); + }; + + return _this; + } + + var _proto = SearchResult.prototype; + + _proto.render = function render() { + var _this$props = this.props, + active = _this$props.active, + className = _this$props.className, + renderer = _this$props.renderer; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(active, 'active'), 'result', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(SearchResult, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(SearchResult, this.props); // Note: You technically only need the 'content' wrapper when there's an + // image. However, optionally wrapping it makes this function a lot more + // complicated and harder to read. Since always wrapping it doesn't affect + // the style in any way let's just do that. + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + onClick: this.handleClick + }), renderer(this.props)); + }; + + return SearchResult; +}(react__WEBPACK_IMPORTED_MODULE_4__["Component"]); + +SearchResult.handledProps = ["active", "as", "className", "content", "description", "id", "image", "onClick", "price", "renderer", "title"]; + +SearchResult.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** The item currently selected by keyboard shortcut. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Additional text with less emphasis. */ + description: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A unique identifier. */ + id: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string]), + + /** Add an image to the item. */ + image: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** + * Called on click. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** Customized text for price. */ + price: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** + * Renders the result contents. + * + * @param {object} props - The SearchResult props object. + * @returns {*} - Renderable result contents. + */ + renderer: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** Display title. */ + title: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string.isRequired +} : undefined; +SearchResult.defaultProps = { + renderer: defaultRenderer +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResults.js": +/*!********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Search/SearchResults.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +function SearchResults(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('results transition', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(SearchResults, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(SearchResults, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +SearchResults.handledProps = ["as", "children", "className", "content"]; +SearchResults.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SearchResults); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Search/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Search/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Search__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Search */ "./node_modules/semantic-ui-react/dist/es/modules/Search/Search.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Search__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/Sidebar.js": +/*!***************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Sidebar/Sidebar.js ***! + \***************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _fluentui_react_component_event_listener__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fluentui/react-component-event-listener */ "./node_modules/@fluentui/react-component-event-listener/dist/es/index.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _SidebarPushable__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./SidebarPushable */ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPushable.js"); +/* harmony import */ var _SidebarPusher__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./SidebarPusher */ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPusher.js"); + + + + + + + + + + + +/** + * A sidebar hides additional content beside a page. + */ + +var Sidebar = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Sidebar, _Component); + + function Sidebar(props) { + var _this; + + _this = _Component.call(this, props) || this; + _this.ref = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_7__["createRef"])(); + + _this.handleAnimationStart = function () { + var visible = _this.props.visible; + var callback = visible ? 'onVisible' : 'onHide'; + clearTimeout(_this.animationTimer); + _this.animationTimer = setTimeout(_this.handleAnimationEnd, Sidebar.animationDuration); + + if (_this.skipNextCallback) { + _this.skipNextCallback = false; + return; + } + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, callback, null, _this.props); + }; + + _this.handleAnimationEnd = function () { + var visible = _this.props.visible; + var callback = visible ? 'onShow' : 'onHidden'; + + _this.setState({ + animationTick: 0 + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, callback, null, _this.props); + }; + + _this.handleDocumentClick = function (e) { + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_8__["doesNodeContainClick"])(_this.ref.current, e)) { + _this.skipNextCallback = true; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onHide', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + visible: false + })); + } + }; + + _this.state = { + animationTick: 0, + visible: props.visible + }; + return _this; + } + + Sidebar.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + // We use `animationTick` to understand when an animation should be scheduled + var tickIncrement = !!props.visible === !!state.visible ? 0 : 1; + return { + animationTick: state.animationTick + tickIncrement, + visible: props.visible + }; + }; + + var _proto = Sidebar.prototype; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + if (this.state.animationTick > prevState.animationTick) { + this.handleAnimationStart(); + } + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + clearTimeout(this.animationTimer); + }; + + _proto.render = function render() { + var _this$props = this.props, + animation = _this$props.animation, + className = _this$props.className, + children = _this$props.children, + content = _this$props.content, + direction = _this$props.direction, + target = _this$props.target, + visible = _this$props.visible, + width = _this$props.width; + var animationTick = this.state.animationTick; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])('ui', animation, direction, width, Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(animationTick > 0, 'animating'), Object(_lib__WEBPACK_IMPORTED_MODULE_8__["useKeyOnly"])(visible, 'visible'), 'sidebar', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getUnhandledProps"])(Sidebar, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getElementType"])(Sidebar, this.props); + var targetProp = Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["isRefObject"])(target) ? { + targetRef: target + } : { + target: target + }; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_4__["Ref"], { + innerRef: this.ref + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_8__["childrenUtils"].isNil(children) ? content : children)), visible && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_fluentui_react_component_event_listener__WEBPACK_IMPORTED_MODULE_3__["EventListener"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + listener: this.handleDocumentClick, + type: "click" + }, targetProp))); + }; + + return Sidebar; +}(react__WEBPACK_IMPORTED_MODULE_7__["Component"]); + +Sidebar.handledProps = ["animation", "as", "children", "className", "content", "direction", "onHidden", "onHide", "onShow", "onVisible", "target", "visible", "width"]; +Sidebar.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.elementType, + + /** Animation style. */ + animation: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['overlay', 'push', 'scale down', 'uncover', 'slide out', 'slide along']), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].contentShorthand, + + /** Direction the sidebar should appear on. */ + direction: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['top', 'right', 'bottom', 'left']), + + /** + * Called before a sidebar begins to animate out. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onHide: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Called after a sidebar has finished animating out. + * + * @param {null} + * @param {object} data - All props. + */ + onHidden: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Called when a sidebar has finished animating in. + * + * @param {null} + * @param {object} data - All props. + */ + onShow: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Called when a sidebar begins animating in. + * + * @param {null} + * @param {object} data - All props. + */ + onVisible: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** A sidebar can handle clicks on the passed element. */ + target: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([_lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].domNode, _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].refObject]), + + /** Controls whether or not the sidebar is visible on the page. */ + visible: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool, + + /** Sidebar width. */ + width: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['very thin', 'thin', 'wide', 'very wide']) +} : undefined; +Sidebar.defaultProps = { + direction: 'left', + target: _fluentui_react_component_event_listener__WEBPACK_IMPORTED_MODULE_3__["documentRef"], + visible: false +}; +Sidebar.animationDuration = 500; +Sidebar.autoControlledProps = ['visible']; +Sidebar.Pushable = _SidebarPushable__WEBPACK_IMPORTED_MODULE_9__["default"]; +Sidebar.Pusher = _SidebarPusher__WEBPACK_IMPORTED_MODULE_10__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Sidebar); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPushable.js": +/*!***********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPushable.js ***! + \***********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A pushable sub-component for Sidebar. + */ + +function SidebarPushable(props) { + var className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('pushable', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(SidebarPushable, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(SidebarPushable, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +SidebarPushable.handledProps = ["as", "children", "className", "content"]; +SidebarPushable.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SidebarPushable); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPusher.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Sidebar/SidebarPusher.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A pushable sub-component for Sidebar. + */ + +function SidebarPusher(props) { + var className = props.className, + dimmed = props.dimmed, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('pusher', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(dimmed, 'dimmed'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(SidebarPusher, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(SidebarPusher, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +SidebarPusher.handledProps = ["as", "children", "className", "content", "dimmed"]; +SidebarPusher.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Controls whether or not the dim is displayed. */ + dimmed: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (SidebarPusher); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Sidebar/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Sidebar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sidebar */ "./node_modules/semantic-ui-react/dist/es/modules/Sidebar/Sidebar.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Sidebar__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Sticky/Sticky.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Sticky/Sticky.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 Sticky; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var _fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @fluentui/react-component-ref */ "./node_modules/@fluentui/react-component-ref/dist/es/index.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + + + +/** + * Sticky content stays fixed to the browser viewport while another column of content is visible on the page. + */ + +var Sticky = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Sticky, _Component); + + function Sticky() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.state = { + active: true, + sticky: false + }; + _this.stickyRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_6__["createRef"])(); + _this.triggerRef = /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_6__["createRef"])(); + + _this.addListeners = function (scrollContext) { + var scrollContextNode = Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__["isRefObject"])(scrollContext) ? scrollContext.current : scrollContext; + + if (scrollContextNode) { + _lib__WEBPACK_IMPORTED_MODULE_7__["eventStack"].sub('resize', _this.handleUpdate, { + target: scrollContextNode + }); + _lib__WEBPACK_IMPORTED_MODULE_7__["eventStack"].sub('scroll', _this.handleUpdate, { + target: scrollContextNode + }); + } + }; + + _this.removeListeners = function (scrollContext) { + var scrollContextNode = Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__["isRefObject"])(scrollContext) ? scrollContext.current : scrollContext; + + if (scrollContextNode) { + _lib__WEBPACK_IMPORTED_MODULE_7__["eventStack"].unsub('resize', _this.handleUpdate, { + target: scrollContextNode + }); + _lib__WEBPACK_IMPORTED_MODULE_7__["eventStack"].unsub('scroll', _this.handleUpdate, { + target: scrollContextNode + }); + } + }; + + _this.update = function (e) { + var pushing = _this.state.pushing; + _this.ticking = false; + + _this.assignRects(); + + if (pushing) { + if (_this.didReachStartingPoint()) return _this.stickToContextTop(e); + if (_this.didTouchScreenBottom()) return _this.stickToScreenBottom(e); + return _this.stickToContextBottom(e); + } + + if (_this.isOversized()) { + if (_this.contextRect.top > 0) return _this.stickToContextTop(e); + if (_this.contextRect.bottom < window.innerHeight) return _this.stickToContextBottom(e); + } + + if (_this.didTouchScreenTop()) { + if (_this.didReachContextBottom()) return _this.stickToContextBottom(e); + return _this.stickToScreenTop(e); + } + + return _this.stickToContextTop(e); + }; + + _this.handleUpdate = function (e) { + if (!_this.ticking) { + _this.ticking = true; + _this.frameId = requestAnimationFrame(function () { + return _this.update(e); + }); + } + }; + + _this.assignRects = function () { + var context = _this.props.context; + var contextNode = Object(_fluentui_react_component_ref__WEBPACK_IMPORTED_MODULE_3__["isRefObject"])(context) ? context.current : context || document.body; + _this.triggerRect = _this.triggerRef.current.getBoundingClientRect(); + _this.contextRect = contextNode.getBoundingClientRect(); + _this.stickyRect = _this.stickyRef.current.getBoundingClientRect(); + }; + + _this.didReachContextBottom = function () { + var offset = _this.props.offset; + return _this.stickyRect.height + offset >= _this.contextRect.bottom; + }; + + _this.didReachStartingPoint = function () { + return _this.stickyRect.top <= _this.triggerRect.top; + }; + + _this.didTouchScreenTop = function () { + return _this.triggerRect.top < _this.props.offset; + }; + + _this.didTouchScreenBottom = function () { + var bottomOffset = _this.props.bottomOffset; + return _this.contextRect.bottom + bottomOffset > window.innerHeight; + }; + + _this.isOversized = function () { + return _this.stickyRect.height > window.innerHeight; + }; + + _this.pushing = function (pushing) { + var possible = _this.props.pushing; + if (possible) _this.setState({ + pushing: pushing + }); + }; + + _this.stick = function (e, bound) { + _this.setState({ + bound: bound, + sticky: true + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onStick', e, _this.props); + }; + + _this.unstick = function (e, bound) { + _this.setState({ + bound: bound, + sticky: false + }); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onUnstick', e, _this.props); + }; + + _this.stickToContextBottom = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onBottom', e, _this.props); + + _this.stick(e, true); + + _this.pushing(true); + }; + + _this.stickToContextTop = function (e) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_2__["default"])(_this.props, 'onTop', e, _this.props); + + _this.unstick(e, false); + + _this.pushing(false); + }; + + _this.stickToScreenBottom = function (e) { + var bottom = _this.props.bottomOffset; + + _this.stick(e, false); + + _this.setState({ + bottom: bottom, + top: null + }); + }; + + _this.stickToScreenTop = function (e) { + var top = _this.props.offset; + + _this.stick(e, false); + + _this.setState({ + top: top, + bottom: null + }); + }; + + return _this; + } + + var _proto = Sticky.prototype; + + _proto.componentDidMount = function componentDidMount() { + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_7__["isBrowser"])()) return; + var active = this.state.active; + + if (active) { + this.handleUpdate(); + this.addListeners(this.props.scrollContext); + } + }; + + Sticky.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + if (state.active !== props.active && !props.active) { + return { + active: props.active, + sticky: false + }; + } + + return { + active: props.active + }; + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + if (prevState.active === this.state.active) { + if (prevProps.scrollContext !== this.props.scrollContext) { + this.removeListeners(prevProps.scrollContext); + this.addListeners(this.props.scrollContext); + } + + return; + } + + if (this.state.active) { + this.handleUpdate(); + this.addListeners(this.props.scrollContext); + return; + } + + this.removeListeners(prevProps.scrollContext); + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + if (!Object(_lib__WEBPACK_IMPORTED_MODULE_7__["isBrowser"])()) return; + var active = this.state.active; + + if (active) { + this.removeListeners(this.props.scrollContext); + cancelAnimationFrame(this.frameId); + } + } // ---------------------------------------- + // Events + // ---------------------------------------- + ; + + _proto.computeStyle = function computeStyle() { + var styleElement = this.props.styleElement; + var _this$state = this.state, + bottom = _this$state.bottom, + bound = _this$state.bound, + sticky = _this$state.sticky, + top = _this$state.top; + if (!sticky) return styleElement; + return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + bottom: bound ? 0 : bottom, + top: bound ? undefined : top, + width: this.triggerRect.width + }, styleElement); + } // Return true when the component reached the bottom of the context + ; + + // ---------------------------------------- + // Render + // ---------------------------------------- + _proto.render = function render() { + var _this$props = this.props, + children = _this$props.children, + className = _this$props.className; + var _this$state2 = this.state, + bottom = _this$state2.bottom, + bound = _this$state2.bound, + sticky = _this$state2.sticky; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(Sticky, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(Sticky, this.props); + var containerClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(sticky && 'ui', sticky && 'stuck-container', sticky && (bound ? 'bound-container' : 'fixed-container'), className); + var elementClasses = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', sticky && (bound ? 'bound bottom' : 'fixed'), sticky && !bound && (bottom === null ? 'top' : 'bottom'), 'sticky'); + var triggerStyles = sticky && this.stickyRect ? { + height: this.stickyRect.height + } : {}; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: containerClasses + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("div", { + ref: this.triggerRef, + style: triggerStyles + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement("div", { + className: elementClasses, + ref: this.stickyRef, + style: this.computeStyle() + }, children)); + }; + + return Sticky; +}(react__WEBPACK_IMPORTED_MODULE_6__["Component"]); + +Sticky.handledProps = ["active", "as", "bottomOffset", "children", "className", "context", "offset", "onBottom", "onStick", "onTop", "onUnstick", "pushing", "scrollContext", "styleElement"]; + +Sticky.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** A Sticky can be active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Offset in pixels from the bottom of the screen when fixing element to viewport. */ + bottomOffset: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Context which sticky element should stick to. */ + context: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].domNode, _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].refObject]), + + /** Offset in pixels from the top of the screen when fixing element to viewport. */ + offset: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.number, + + /** + * Callback when element is bound to bottom of parent container. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onBottom: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Callback when element is fixed to page. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onStick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Callback when element is bound to top of parent container. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onTop: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** + * Callback when element is unfixed from page. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onUnstick: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.func, + + /** Whether element should be "pushed" by the viewport, attaching to the bottom of the screen when scrolling up. */ + pushing: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.bool, + + /** Context which sticky should attach onscroll events. */ + scrollContext: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOfType([_lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].domNode, _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].refObject]), + + /** Custom style for sticky element. */ + styleElement: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.object +} : undefined; +Sticky.defaultProps = { + active: true, + bottomOffset: 0, + offset: 0, + scrollContext: Object(_lib__WEBPACK_IMPORTED_MODULE_7__["isBrowser"])() ? window : null +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Sticky/index.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Sticky/index.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Sticky__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Sticky */ "./node_modules/semantic-ui-react/dist/es/modules/Sticky/Sticky.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Sticky__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Tab/Tab.js": +/*!*******************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Tab/Tab.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _collections_Grid_Grid__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../collections/Grid/Grid */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/Grid.js"); +/* harmony import */ var _collections_Grid_GridColumn__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../collections/Grid/GridColumn */ "./node_modules/semantic-ui-react/dist/es/collections/Grid/GridColumn.js"); +/* harmony import */ var _collections_Menu_Menu__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../collections/Menu/Menu */ "./node_modules/semantic-ui-react/dist/es/collections/Menu/Menu.js"); +/* harmony import */ var _TabPane__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./TabPane */ "./node_modules/semantic-ui-react/dist/es/modules/Tab/TabPane.js"); + + + + + + + + + + + + + +/** + * A Tab is a hidden section of content activated by a Menu. + * @see Menu + * @see Segment + */ + +var Tab = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__["default"])(Tab, _Component); + + function Tab() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleItemClick = function (e, _ref) { + var index = _ref.index; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onTabChange', e, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, _this.props, { + activeIndex: index + })); + + _this.setState({ + activeIndex: index + }); + }; + + return _this; + } + + var _proto = Tab.prototype; + + _proto.getInitialAutoControlledState = function getInitialAutoControlledState() { + return { + activeIndex: 0 + }; + }; + + _proto.renderItems = function renderItems() { + var _this$props = this.props, + panes = _this$props.panes, + renderActiveOnly = _this$props.renderActiveOnly; + var activeIndex = this.state.activeIndex; + if (renderActiveOnly) return Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_4__["default"])(panes, "[" + activeIndex + "]"), 'render', this.props); + return Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_3__["default"])(panes, function (_ref2, index) { + var pane = _ref2.pane; + return _TabPane__WEBPACK_IMPORTED_MODULE_12__["default"].create(pane, { + overrideProps: { + active: index === activeIndex + } + }); + }); + }; + + _proto.renderMenu = function renderMenu() { + var _this$props2 = this.props, + menu = _this$props2.menu, + panes = _this$props2.panes, + menuPosition = _this$props2.menuPosition; + var activeIndex = this.state.activeIndex; + + if (menu.tabular === true && menuPosition === 'right') { + menu.tabular = 'right'; + } + + return _collections_Menu_Menu__WEBPACK_IMPORTED_MODULE_11__["default"].create(menu, { + autoGenerateKey: false, + overrideProps: { + items: Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_3__["default"])(panes, 'menuItem'), + onItemClick: this.handleItemClick, + activeIndex: activeIndex + } + }); + }; + + _proto.renderVertical = function renderVertical(menu) { + var _this$props3 = this.props, + grid = _this$props3.grid, + menuPosition = _this$props3.menuPosition; + + var paneWidth = grid.paneWidth, + tabWidth = grid.tabWidth, + gridProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(grid, ["paneWidth", "tabWidth"]); + + var position = menuPosition || menu.props.tabular === 'right' && 'right' || 'left'; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_collections_Grid_Grid__WEBPACK_IMPORTED_MODULE_9__["default"], gridProps, position === 'left' && _collections_Grid_GridColumn__WEBPACK_IMPORTED_MODULE_10__["default"].create({ + width: tabWidth, + children: menu + }, { + autoGenerateKey: false + }), _collections_Grid_GridColumn__WEBPACK_IMPORTED_MODULE_10__["default"].create({ + width: paneWidth, + children: this.renderItems(), + stretched: true + }, { + autoGenerateKey: false + }), position === 'right' && _collections_Grid_GridColumn__WEBPACK_IMPORTED_MODULE_10__["default"].create({ + width: tabWidth, + children: menu + }, { + autoGenerateKey: false + })); + }; + + _proto.render = function render() { + var menu = this.renderMenu(); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getUnhandledProps"])(Tab, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_8__["getElementType"])(Tab, this.props); + + if (menu.props.vertical) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, rest, this.renderVertical(menu)); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ElementType, rest, menu.props.attached !== 'bottom' && menu, this.renderItems(), menu.props.attached === 'bottom' && menu); + }; + + return Tab; +}(_lib__WEBPACK_IMPORTED_MODULE_8__["ModernAutoControlledComponent"]); + +Tab.handledProps = ["activeIndex", "as", "defaultActiveIndex", "grid", "menu", "menuPosition", "onTabChange", "panes", "renderActiveOnly"]; +Tab.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.elementType, + + /** The initial activeIndex. */ + defaultActiveIndex: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** Index of the currently active tab. */ + activeIndex: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.string]), + + /** + * Shorthand props for the Menu. + * tabular, if true, will derive final value from `menuPosition`, otherwise set 'left' or 'right' explicitly. + */ + menu: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.object, + + /** Align vertical menu */ + menuPosition: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.oneOf(['left', 'right']), + + /** Shorthand props for the Grid. Only applicable to vertical menus. */ + grid: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.object, + + /** + * Called on tab change. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props and proposed new activeIndex. + * @param {object} data.activeIndex - The new proposed activeIndex. + */ + onTabChange: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func, + + /** + * Array of objects describing each Menu.Item and Tab.Pane: + * { menuItem: 'Home', render: () => <Tab.Pane /> } + * or + * { menuItem: 'Home', pane: 'Welcome' } + */ + panes: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.shape({ + menuItem: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].itemShorthand, + pane: _lib__WEBPACK_IMPORTED_MODULE_8__["customPropTypes"].itemShorthand, + render: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.func + })), + + /** A Tab can render only active pane. */ + renderActiveOnly: prop_types__WEBPACK_IMPORTED_MODULE_6___default.a.bool +} : undefined; +Tab.autoControlledProps = ['activeIndex']; +Tab.defaultProps = { + grid: { + paneWidth: 12, + tabWidth: 4 + }, + menu: { + attached: true, + tabular: true + }, + renderActiveOnly: true +}; +Tab.Pane = _TabPane__WEBPACK_IMPORTED_MODULE_12__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Tab); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Tab/TabPane.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Tab/TabPane.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Segment_Segment__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../elements/Segment/Segment */ "./node_modules/semantic-ui-react/dist/es/elements/Segment/Segment.js"); + + + + + + +/** + * A tab pane holds the content of a tab. + */ + +function TabPane(props) { + var active = props.active, + children = props.children, + className = props.className, + content = props.content, + loading = props.loading; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(active, 'active'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(loading, 'loading'), 'tab', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(TabPane, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(TabPane, props); + var calculatedDefaultProps = {}; + + if (ElementType === _elements_Segment_Segment__WEBPACK_IMPORTED_MODULE_5__["default"]) { + calculatedDefaultProps.attached = 'bottom'; + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, calculatedDefaultProps, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +TabPane.handledProps = ["active", "as", "children", "className", "content", "loading"]; +TabPane.defaultProps = { + as: _elements_Segment_Segment__WEBPACK_IMPORTED_MODULE_5__["default"], + active: true +}; +TabPane.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** A tab pane can be active. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** A Tab.Pane can display a loading indicator. */ + loading: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +TabPane.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(TabPane, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (TabPane); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Tab/index.js": +/*!*********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Tab/index.js ***! + \*********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Tab__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Tab */ "./node_modules/semantic-ui-react/dist/es/modules/Tab/Tab.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Tab__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Transition/Transition.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Transition/Transition.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 Transition; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_includes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/includes */ "./node_modules/lodash-es/includes.js"); +/* harmony import */ var lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/isNil */ "./node_modules/lodash-es/isNil.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/invoke */ "./node_modules/lodash-es/invoke.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _TransitionGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./TransitionGroup */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/TransitionGroup.js"); +/* harmony import */ var _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/computeStatuses */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/computeStatuses.js"); + + + + + + + +var _TRANSITION_CALLBACK_, _TRANSITION_STYLE_TYP; + + + + + + + +var TRANSITION_CALLBACK_TYPE = (_TRANSITION_CALLBACK_ = {}, _TRANSITION_CALLBACK_[_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_ENTERED"]] = 'show', _TRANSITION_CALLBACK_[_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITED"]] = 'hide', _TRANSITION_CALLBACK_); +var TRANSITION_STYLE_TYPE = (_TRANSITION_STYLE_TYP = {}, _TRANSITION_STYLE_TYP[_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_ENTERING"]] = 'show', _TRANSITION_STYLE_TYP[_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITING"]] = 'hide', _TRANSITION_STYLE_TYP); +/** + * A transition is an animation usually used to move content in or out of view. + */ + +var Transition = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Transition, _Component); + + function Transition() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + _this.state = { + status: _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_INITIAL"] + }; + + _this.handleStart = function (nextStatus) { + var duration = _this.props.duration; + var durationType = TRANSITION_CALLBACK_TYPE[nextStatus]; + var durationValue = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["normalizeTransitionDuration"])(duration, durationType); + _this.timeoutId = setTimeout(function () { + return _this.setState({ + status: nextStatus + }); + }, durationValue); + }; + + _this.updateStatus = function (prevState) { + if (prevState.status !== _this.state.status) { + // Timeout should be cleared in any case as previous can lead set to unexpected `nextStatus` + clearTimeout(_this.timeoutId); + + if (_this.state.nextStatus) { + _this.handleStart(_this.state.nextStatus); + } + } + + if (!prevState.animating && _this.state.animating) { + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onStart', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + status: _this.state.status + })); + } + + if (prevState.animating && !_this.state.animating) { + var callback = _this.state.status === _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_ENTERED"] ? 'onShow' : 'onHide'; + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, 'onComplete', null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + status: _this.state.status + })); + + Object(lodash_es_invoke__WEBPACK_IMPORTED_MODULE_5__["default"])(_this.props, callback, null, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, _this.props, { + status: _this.state.status + })); + } + }; + + _this.computeClasses = function () { + var _this$props = _this.props, + animation = _this$props.animation, + directional = _this$props.directional, + children = _this$props.children; + var _this$state = _this.state, + animating = _this$state.animating, + status = _this$state.status; + + var childClasses = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_4__["default"])(children, 'props.className'); + + var isDirectional = Object(lodash_es_isNil__WEBPACK_IMPORTED_MODULE_3__["default"])(directional) ? Object(lodash_es_includes__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_9__["SUI"].DIRECTIONAL_TRANSITIONS, animation) : directional; + + if (isDirectional) { + return Object(clsx__WEBPACK_IMPORTED_MODULE_6__["default"])(animation, childClasses, Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(animating, 'animating'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(status === _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_ENTERING"], 'in'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(status === _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITING"], 'out'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(status === _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITED"], 'hidden'), Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(status !== _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITED"], 'visible'), 'transition'); + } + + return Object(clsx__WEBPACK_IMPORTED_MODULE_6__["default"])(animation, childClasses, Object(_lib__WEBPACK_IMPORTED_MODULE_9__["useKeyOnly"])(animating, 'animating transition')); + }; + + _this.computeStyle = function () { + var _this$props2 = _this.props, + children = _this$props2.children, + duration = _this$props2.duration; + var status = _this.state.status; + + var childStyle = Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_4__["default"])(children, 'props.style'); + + var type = TRANSITION_STYLE_TYPE[status]; + var animationDuration = type && Object(_lib__WEBPACK_IMPORTED_MODULE_9__["normalizeTransitionDuration"])(duration, type) + "ms"; + return Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, childStyle, { + animationDuration: animationDuration + }); + }; + + return _this; + } + + // ---------------------------------------- + // Lifecycle + // ---------------------------------------- + Transition.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + var derivedState = Object(_utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["computeStatuses"])({ + mountOnShow: props.mountOnShow, + status: state.status, + transitionOnMount: props.transitionOnMount, + visible: props.visible, + unmountOnHide: props.unmountOnHide + }); + return derivedState; + }; + + var _proto = Transition.prototype; + + _proto.componentDidMount = function componentDidMount() { + this.updateStatus({}); + }; + + _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) { + this.updateStatus(prevState); + }; + + _proto.componentWillUnmount = function componentWillUnmount() { + clearTimeout(this.timeoutId); + } // ---------------------------------------- + // Callback handling + // ---------------------------------------- + ; + + // ---------------------------------------- + // Render + // ---------------------------------------- + _proto.render = function render() { + var children = this.props.children; + var status = this.state.status; + + if (status === _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_UNMOUNTED"]) { + return null; + } + + return /*#__PURE__*/Object(react__WEBPACK_IMPORTED_MODULE_8__["cloneElement"])(children, { + className: this.computeClasses(), + style: this.computeStyle() + }); + }; + + return Transition; +}(react__WEBPACK_IMPORTED_MODULE_8__["Component"]); + +Transition.INITIAL = _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_INITIAL"]; +Transition.ENTERED = _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_ENTERED"]; +Transition.ENTERING = _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_ENTERING"]; +Transition.EXITED = _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITED"]; +Transition.EXITING = _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_EXITING"]; +Transition.UNMOUNTED = _utils_computeStatuses__WEBPACK_IMPORTED_MODULE_11__["TRANSITION_STATUS_UNMOUNTED"]; +Transition.Group = _TransitionGroup__WEBPACK_IMPORTED_MODULE_10__["default"]; +Transition.handledProps = ["animation", "children", "directional", "duration", "mountOnShow", "onComplete", "onHide", "onShow", "onStart", "reactKey", "transitionOnMount", "unmountOnHide", "visible"]; + +Transition.propTypes = true ? { + /** Named animation event to used. Must be defined in CSS. */ + animation: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_9__["SUI"].TRANSITIONS), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.element.isRequired, + + /** Whether it is directional animation event or not. Use it only for custom transitions. */ + directional: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Duration of the CSS transition animation in milliseconds. */ + duration: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.shape({ + hide: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, + show: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number + }), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]), + + /** Show the component; triggers the enter or exit animation. */ + visible: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Wait until the first "enter" transition to mount the component (add it to the DOM). */ + mountOnShow: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** + * Callback on each transition that changes visibility to shown. + * + * @param {null} + * @param {object} data - All props with status. + */ + onComplete: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Callback on each transition that changes visibility to hidden. + * + * @param {null} + * @param {object} data - All props with status. + */ + onHide: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Callback on each transition that changes visibility to shown. + * + * @param {null} + * @param {object} data - All props with status. + */ + onShow: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** + * Callback on animation start. + * + * @param {null} + * @param {object} data - All props with status. + */ + onStart: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.func, + + /** React's key of the element. */ + reactKey: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string, + + /** Run the enter animation when the component mounts, if it is initially shown. */ + transitionOnMount: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Unmount the component (remove it from the DOM) when it is not shown. */ + unmountOnHide: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool +} : undefined; +Transition.defaultProps = { + animation: 'fade', + duration: 500, + visible: true, + mountOnShow: true, + transitionOnMount: false, + unmountOnHide: false +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Transition/TransitionGroup.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Transition/TransitionGroup.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 TransitionGroup; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var lodash_es_values__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/values */ "./node_modules/lodash-es/values.js"); +/* harmony import */ var lodash_es_get__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/get */ "./node_modules/lodash-es/get.js"); +/* harmony import */ var lodash_es_has__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/has */ "./node_modules/lodash-es/has.js"); +/* harmony import */ var lodash_es_forEach__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash-es/forEach */ "./node_modules/lodash-es/forEach.js"); +/* harmony import */ var lodash_es_mapValues__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! lodash-es/mapValues */ "./node_modules/lodash-es/mapValues.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _utils_childMapping__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utils/childMapping */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/childMapping.js"); +/* harmony import */ var _utils_wrapChild__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utils/wrapChild */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/wrapChild.js"); + + + + + + + + + + + + + +/** + * A Transition.Group animates children as they mount and unmount. + */ +var TransitionGroup = /*#__PURE__*/function (_React$Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(TransitionGroup, _React$Component); + + function TransitionGroup() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this; + _this.state = { + // Keeping a callback under the state is a hack to make it accessible under getDerivedStateFromProps() + handleOnHide: function handleOnHide(nothing, childProps) { + var reactKey = childProps.reactKey; + + _this.setState(function (state) { + var children = Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, state.children); + + delete children[reactKey]; + return { + children: children + }; + }); + } + }; + return _this; + } + + TransitionGroup.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) { + var animation = props.animation, + duration = props.duration, + directional = props.directional; + var prevMapping = state.children; // A short circuit for an initial render as there will be no `prevMapping` + + if (typeof prevMapping === 'undefined') { + return { + children: Object(lodash_es_mapValues__WEBPACK_IMPORTED_MODULE_6__["default"])(Object(_utils_childMapping__WEBPACK_IMPORTED_MODULE_10__["getChildMapping"])(props.children), function (child) { + return Object(_utils_wrapChild__WEBPACK_IMPORTED_MODULE_11__["default"])(child, state.handleOnHide, { + animation: animation, + duration: duration, + directional: directional + }); + }) + }; + } + + var nextMapping = Object(_utils_childMapping__WEBPACK_IMPORTED_MODULE_10__["getChildMapping"])(props.children); + var children = Object(_utils_childMapping__WEBPACK_IMPORTED_MODULE_10__["mergeChildMappings"])(prevMapping, nextMapping); + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_5__["default"])(children, function (child, key) { + var hasPrev = Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_4__["default"])(prevMapping, key); + + var hasNext = Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_4__["default"])(nextMapping, key); + + var prevChild = prevMapping[key]; + var isLeaving = !Object(lodash_es_get__WEBPACK_IMPORTED_MODULE_3__["default"])(prevChild, 'props.visible'); // Heads up! + // An item is new (entering), it will be picked from `nextChildren`, so it should be wrapped + + if (hasNext && (!hasPrev || isLeaving)) { + children[key] = Object(_utils_wrapChild__WEBPACK_IMPORTED_MODULE_11__["default"])(child, state.handleOnHide, { + animation: animation, + duration: duration, + directional: directional, + transitionOnMount: true + }); + return; + } // Heads up! + // An item is old (exiting), it will be picked from `prevChildren`, so it has been already + // wrapped, so should be only updated + + + if (!hasNext && hasPrev && !isLeaving) { + children[key] = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.cloneElement(prevChild, { + visible: false + }); + return; + } // Heads up! + // An item item hasn't changed transition states, but it will be picked from `nextChildren`, + // so we should wrap it again + + + var _prevChild$props = prevChild.props, + visible = _prevChild$props.visible, + transitionOnMount = _prevChild$props.transitionOnMount; + children[key] = Object(_utils_wrapChild__WEBPACK_IMPORTED_MODULE_11__["default"])(child, state.handleOnHide, { + animation: animation, + duration: duration, + directional: directional, + transitionOnMount: transitionOnMount, + visible: visible + }); + }); + + return { + children: children + }; + }; + + var _proto = TransitionGroup.prototype; + + _proto.render = function render() { + var children = this.state.children; + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getElementType"])(TransitionGroup, this.props); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_9__["getUnhandledProps"])(TransitionGroup, this.props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(ElementType, rest, Object(lodash_es_values__WEBPACK_IMPORTED_MODULE_2__["default"])(children)); + }; + + return TransitionGroup; +}(react__WEBPACK_IMPORTED_MODULE_8___default.a.Component); + +TransitionGroup.handledProps = ["animation", "as", "children", "directional", "duration"]; + +TransitionGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.elementType, + + /** Named animation event to used. Must be defined in CSS. */ + animation: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_9__["SUI"].TRANSITIONS), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]), + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.node, + + /** Whether it is directional animation event or not. Use it only for custom transitions. */ + directional: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.bool, + + /** Duration of the CSS transition animation in milliseconds. */ + duration: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.shape({ + hide: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number.isRequired, + show: prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.number.isRequired + }), prop_types__WEBPACK_IMPORTED_MODULE_7___default.a.string]) +} : undefined; +TransitionGroup.defaultProps = { + as: react__WEBPACK_IMPORTED_MODULE_8___default.a.Fragment, + animation: 'fade', + duration: 500 +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Transition/index.js": +/*!****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Transition/index.js ***! + \****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Transition */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/Transition.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Transition__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/childMapping.js": +/*!*****************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/childMapping.js ***! + \*****************************************************************************************/ +/*! exports provided: getChildMapping, mergeChildMappings */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getChildMapping", function() { return getChildMapping; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeChildMappings", function() { return mergeChildMappings; }); +/* harmony import */ var lodash_es_has__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash-es/has */ "./node_modules/lodash-es/has.js"); +/* harmony import */ var lodash_es_keys__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/keys */ "./node_modules/lodash-es/keys.js"); +/* harmony import */ var lodash_es_forEach__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/forEach */ "./node_modules/lodash-es/forEach.js"); +/* harmony import */ var lodash_es_filter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/filter */ "./node_modules/lodash-es/filter.js"); +/* harmony import */ var lodash_es_keyBy__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! lodash-es/keyBy */ "./node_modules/lodash-es/keyBy.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); + + + + + + +/** + * Given `this.props.children`, return an object mapping key to child. + * + * @param {object} children Element's children + * @return {object} Mapping of key to child + */ + +var getChildMapping = function getChildMapping(children) { + return Object(lodash_es_keyBy__WEBPACK_IMPORTED_MODULE_4__["default"])(Object(lodash_es_filter__WEBPACK_IMPORTED_MODULE_3__["default"])(react__WEBPACK_IMPORTED_MODULE_5__["Children"].toArray(children), react__WEBPACK_IMPORTED_MODULE_5__["isValidElement"]), 'key'); +}; + +var getPendingKeys = function getPendingKeys(prev, next) { + var nextKeysPending = {}; + var pendingKeys = []; + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(prev), function (prevKey) { + if (!Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_0__["default"])(next, prevKey)) { + pendingKeys.push(prevKey); + return; + } + + if (pendingKeys.length) { + nextKeysPending[prevKey] = pendingKeys; + pendingKeys = []; + } + }); + + return [nextKeysPending, pendingKeys]; +}; + +var getValue = function getValue(key, prev, next) { + return Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_0__["default"])(next, key) ? next[key] : prev[key]; +}; +/** + * When you're adding or removing children some may be added or removed in the same render pass. We want to show *both* + * since we want to simultaneously animate elements in and out. This function takes a previous set of keys and a new set + * of keys and merges them with its best guess of the correct ordering. + * + * @param {object} prev Prev children as returned from `getChildMapping()` + * @param {object} next Next children as returned from `getChildMapping()` + * @return {object} A key set that contains all keys in `prev` and all keys in `next` in a reasonable order + */ + + +var mergeChildMappings = function mergeChildMappings(prev, next) { + if (prev === void 0) { + prev = {}; + } + + if (next === void 0) { + next = {}; + } + + var childMapping = {}; + + var _getPendingKeys = getPendingKeys(prev, next), + nextKeysPending = _getPendingKeys[0], + pendingKeys = _getPendingKeys[1]; + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(lodash_es_keys__WEBPACK_IMPORTED_MODULE_1__["default"])(next), function (nextKey) { + if (Object(lodash_es_has__WEBPACK_IMPORTED_MODULE_0__["default"])(nextKeysPending, nextKey)) { + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_2__["default"])(nextKeysPending[nextKey], function (pendingKey) { + childMapping[pendingKey] = getValue(pendingKey, prev, next); + }); + } + + childMapping[nextKey] = getValue(nextKey, prev, next); + }); + + Object(lodash_es_forEach__WEBPACK_IMPORTED_MODULE_2__["default"])(pendingKeys, function (pendingKey) { + childMapping[pendingKey] = getValue(pendingKey, prev, next); + }); + + return childMapping; +}; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/computeStatuses.js": +/*!********************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/computeStatuses.js ***! + \********************************************************************************************/ +/*! exports provided: TRANSITION_STATUS_INITIAL, TRANSITION_STATUS_ENTERED, TRANSITION_STATUS_ENTERING, TRANSITION_STATUS_EXITED, TRANSITION_STATUS_EXITING, TRANSITION_STATUS_UNMOUNTED, computeStatuses */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITION_STATUS_INITIAL", function() { return TRANSITION_STATUS_INITIAL; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITION_STATUS_ENTERED", function() { return TRANSITION_STATUS_ENTERED; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITION_STATUS_ENTERING", function() { return TRANSITION_STATUS_ENTERING; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITION_STATUS_EXITED", function() { return TRANSITION_STATUS_EXITED; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITION_STATUS_EXITING", function() { return TRANSITION_STATUS_EXITING; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TRANSITION_STATUS_UNMOUNTED", function() { return TRANSITION_STATUS_UNMOUNTED; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeStatuses", function() { return computeStatuses; }); +var TRANSITION_STATUS_INITIAL = 'INITIAL'; +var TRANSITION_STATUS_ENTERED = 'ENTERED'; +var TRANSITION_STATUS_ENTERING = 'ENTERING'; +var TRANSITION_STATUS_EXITED = 'EXITED'; +var TRANSITION_STATUS_EXITING = 'EXITING'; +var TRANSITION_STATUS_UNMOUNTED = 'UNMOUNTED'; +/** + * @param {Object} [options] + * @param {String} [options.status] + * @param {Boolean} [options.mountOnShow] + * @param {Boolean} [options.transitionOnMount] + * @param {Boolean} [options.visible] + * @param {Boolean} [options.unmountOnHide] + */ + +function computeStatuses(options) { + var mountOnShow = options.mountOnShow, + status = options.status, + transitionOnMount = options.transitionOnMount, + visible = options.visible, + unmountOnHide = options.unmountOnHide; + + if (visible) { + if (status === TRANSITION_STATUS_INITIAL) { + if (transitionOnMount) { + return { + animating: true, + status: TRANSITION_STATUS_ENTERING, + nextStatus: TRANSITION_STATUS_ENTERED + }; + } + + return { + animating: false, + status: TRANSITION_STATUS_ENTERED, + nextStatus: undefined + }; + } + + if (status === TRANSITION_STATUS_UNMOUNTED) { + return { + animating: true, + status: TRANSITION_STATUS_ENTERING, + nextStatus: TRANSITION_STATUS_ENTERED + }; + } + + if (status === TRANSITION_STATUS_EXITED || status === TRANSITION_STATUS_EXITING) { + return { + animating: true, + status: TRANSITION_STATUS_ENTERING, + nextStatus: TRANSITION_STATUS_ENTERED + }; + } + + if (status === TRANSITION_STATUS_ENTERING) { + return {}; + } + /* istanbul ignore else */ + + + if (status === TRANSITION_STATUS_ENTERED) { + return { + animating: false, + status: TRANSITION_STATUS_ENTERED, + nextStatus: undefined + }; + } + } + + if (status === TRANSITION_STATUS_INITIAL) { + if (mountOnShow || unmountOnHide) { + return { + animating: false, + status: TRANSITION_STATUS_UNMOUNTED, + nextStatus: undefined + }; + } + + return { + animating: false, + status: TRANSITION_STATUS_EXITED, + nextStatus: undefined + }; + } + + if (status === TRANSITION_STATUS_ENTERED || status === TRANSITION_STATUS_ENTERING) { + return { + animating: true, + status: TRANSITION_STATUS_EXITING, + nextStatus: unmountOnHide ? TRANSITION_STATUS_UNMOUNTED : TRANSITION_STATUS_EXITED + }; + } + + if (status === TRANSITION_STATUS_EXITING) { + return {}; + } + + if (status === TRANSITION_STATUS_EXITED) { + return { + animating: false, + status: TRANSITION_STATUS_EXITED, + nextStatus: undefined + }; + } + /* istanbul ignore else */ + + + if (status === TRANSITION_STATUS_UNMOUNTED) { + return { + animating: false, + status: TRANSITION_STATUS_UNMOUNTED, + nextStatus: undefined + }; + } + /* istanbul ignore next */ + + + throw new Error("Transition:computeStatuses(): an unexpected status transition: { visible: " + visible + ", status: " + status + " }"); +} + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/wrapChild.js": +/*!**************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/modules/Transition/utils/wrapChild.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 wrapChild; }); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _Transition__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Transition */ "./node_modules/semantic-ui-react/dist/es/modules/Transition/Transition.js"); + + +/** + * Wraps a React element with a Transition component. + * + * @param {React.ReactElement} child + * @param {Function} onHide + * @param {Object} [options={}] + * @param {String} [options.animation] + * @param {Number} [options.duration] + * @param {Boolean} [options.directional] + * @param {Boolean} [options.transitionOnMount=false] + * @param {Boolean} [options.visible=true] + */ + +function wrapChild(child, onHide, options) { + if (options === void 0) { + options = {}; + } + + var key = child.key; + var _options = options, + animation = _options.animation, + directional = _options.directional, + duration = _options.duration, + _options$transitionOn = _options.transitionOnMount, + transitionOnMount = _options$transitionOn === void 0 ? false : _options$transitionOn, + _options$visible = _options.visible, + visible = _options$visible === void 0 ? true : _options$visible; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_Transition__WEBPACK_IMPORTED_MODULE_1__["default"], { + animation: animation, + directional: directional, + duration: duration, + key: key, + onHide: onHide, + reactKey: key, + transitionOnMount: transitionOnMount, + visible: visible + }, child); +} +wrapChild.handledProps = []; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Advertisement/Advertisement.js": +/*!*************************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Advertisement/Advertisement.js ***! + \*************************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * An ad displays third-party promotional content. + */ + +function Advertisement(props) { + var centered = props.centered, + children = props.children, + className = props.className, + content = props.content, + test = props.test, + unit = props.unit; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('ui', unit, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(centered, 'centered'), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(test, 'test'), 'ad', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Advertisement, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Advertisement, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + "data-text": test + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Advertisement.handledProps = ["as", "centered", "children", "className", "content", "test", "unit"]; +Advertisement.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Center the advertisement. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Text to be displayed on the advertisement. */ + test: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.number, prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string]), + + /** Varies the size of the advertisement. */ + unit: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(['medium rectangle', 'large rectangle', 'vertical rectangle', 'small rectangle', 'mobile banner', 'banner', 'vertical banner', 'top banner', 'half banner', 'button', 'square button', 'small button', 'skyscraper', 'wide skyscraper', 'leaderboard', 'large leaderboard', 'mobile leaderboard', 'billboard', 'panorama', 'netboard', 'half page', 'square', 'small square']).isRequired +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Advertisement); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Advertisement/index.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Advertisement/index.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Advertisement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Advertisement */ "./node_modules/semantic-ui-react/dist/es/views/Advertisement/Advertisement.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Advertisement__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Card/Card.js": +/*!*******************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Card/Card.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 Card; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/inheritsLoose */ "./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Image__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../elements/Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); +/* harmony import */ var _CardContent__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CardContent */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardContent.js"); +/* harmony import */ var _CardDescription__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CardDescription */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardDescription.js"); +/* harmony import */ var _CardGroup__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CardGroup */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardGroup.js"); +/* harmony import */ var _CardHeader__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./CardHeader */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardHeader.js"); +/* harmony import */ var _CardMeta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./CardMeta */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardMeta.js"); + + + + + + + + + + + + +/** + * A card displays site content in a manner similar to a playing card. + */ + +var Card = /*#__PURE__*/function (_Component) { + Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_1__["default"])(Card, _Component); + + function Card() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Component.call.apply(_Component, [this].concat(args)) || this; + + _this.handleClick = function (e) { + var onClick = _this.props.onClick; + if (onClick) onClick(e, _this.props); + }; + + return _this; + } + + var _proto = Card.prototype; + + _proto.render = function render() { + var _this$props = this.props, + centered = _this$props.centered, + children = _this$props.children, + className = _this$props.className, + color = _this$props.color, + content = _this$props.content, + description = _this$props.description, + extra = _this$props.extra, + fluid = _this$props.fluid, + header = _this$props.header, + href = _this$props.href, + image = _this$props.image, + link = _this$props.link, + meta = _this$props.meta, + onClick = _this$props.onClick, + raised = _this$props.raised; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', color, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(centered, 'centered'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(fluid, 'fluid'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(link, 'link'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(raised, 'raised'), 'card', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Card, this.props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Card, this.props, function () { + if (onClick) return 'a'; + }); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes, + href: href, + onClick: this.handleClick + }), _elements_Image__WEBPACK_IMPORTED_MODULE_6__["default"].create(image, { + autoGenerateKey: false, + defaultProps: { + ui: false, + wrapped: true + } + }), (description || header || meta) && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_CardContent__WEBPACK_IMPORTED_MODULE_7__["default"], { + description: description, + header: header, + meta: meta + }), extra && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(_CardContent__WEBPACK_IMPORTED_MODULE_7__["default"], { + extra: true + }, extra)); + }; + + return Card; +}(react__WEBPACK_IMPORTED_MODULE_4__["Component"]); + +Card.handledProps = ["as", "centered", "children", "className", "color", "content", "description", "extra", "fluid", "header", "href", "image", "link", "meta", "onClick", "raised"]; + +Card.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** A Card can center itself inside its container. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A Card can be formatted to display different colors. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Shorthand for CardDescription. */ + description: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** Shorthand for primary content of CardContent. */ + extra: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A Card can be formatted to take up the width of its container. */ + fluid: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for CardHeader. */ + header: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** Render as an `a` tag instead of a `div` and adds the href attribute. */ + href: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A card can contain an Image component. */ + image: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** A card can be formatted to link to other content. */ + link: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for CardMeta. */ + meta: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** + * Called on click. When passed, the component renders as an `a` + * tag by default instead of a `div`. + * + * @param {SyntheticEvent} event - React's original SyntheticEvent. + * @param {object} data - All props. + */ + onClick: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.func, + + /** A Card can be formatted to raise above the page. */ + raised: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +Card.Content = _CardContent__WEBPACK_IMPORTED_MODULE_7__["default"]; +Card.Description = _CardDescription__WEBPACK_IMPORTED_MODULE_8__["default"]; +Card.Group = _CardGroup__WEBPACK_IMPORTED_MODULE_9__["default"]; +Card.Header = _CardHeader__WEBPACK_IMPORTED_MODULE_10__["default"]; +Card.Meta = _CardMeta__WEBPACK_IMPORTED_MODULE_11__["default"]; + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Card/CardContent.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Card/CardContent.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _CardDescription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CardDescription */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardDescription.js"); +/* harmony import */ var _CardHeader__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CardHeader */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardHeader.js"); +/* harmony import */ var _CardMeta__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CardMeta */ "./node_modules/semantic-ui-react/dist/es/views/Card/CardMeta.js"); + + + + + + + + + +/** + * A card can contain blocks of content or extra content meant to be formatted separately from the main content. + */ + +function CardContent(props) { + var children = props.children, + className = props.className, + content = props.content, + description = props.description, + extra = props.extra, + header = props.header, + meta = props.meta, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(extra, 'extra'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), 'content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(CardContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(CardContent, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthand"])(_CardHeader__WEBPACK_IMPORTED_MODULE_7__["default"], function (val) { + return { + content: val + }; + }, header, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthand"])(_CardMeta__WEBPACK_IMPORTED_MODULE_8__["default"], function (val) { + return { + content: val + }; + }, meta, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthand"])(_CardDescription__WEBPACK_IMPORTED_MODULE_6__["default"], function (val) { + return { + content: val + }; + }, description, { + autoGenerateKey: false + })); +} + +CardContent.handledProps = ["as", "children", "className", "content", "description", "extra", "header", "meta", "textAlign"]; +CardContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Shorthand for CardDescription. */ + description: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** A card can contain extra content meant to be formatted separately from the main content. */ + extra: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for CardHeader. */ + header: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** Shorthand for CardMeta. */ + meta: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].itemShorthand, + + /** A card content can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS, 'justified')) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CardContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Card/CardDescription.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Card/CardDescription.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A card can contain a description with one or more paragraphs. + */ + +function CardDescription(props) { + var children = props.children, + className = props.className, + content = props.content, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), 'description', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(CardDescription, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(CardDescription, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +CardDescription.handledProps = ["as", "children", "className", "content", "textAlign"]; +CardDescription.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A card content can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS, 'justified')) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CardDescription); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Card/CardGroup.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Card/CardGroup.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Card__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Card */ "./node_modules/semantic-ui-react/dist/es/views/Card/Card.js"); + + + + + + + + +/** + * A group of cards. + */ + +function CardGroup(props) { + var centered = props.centered, + children = props.children, + className = props.className, + content = props.content, + doubling = props.doubling, + items = props.items, + itemsPerRow = props.itemsPerRow, + stackable = props.stackable, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(centered, 'centered'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(doubling, 'doubling'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(stackable, 'stackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useTextAlignProp"])(textAlign), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useWidthProp"])(itemsPerRow), 'cards', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(CardGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(CardGroup, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + var itemsJSX = Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(items, function (item) { + var _item$key; + + var key = (_item$key = item.key) != null ? _item$key : [item.header, item.description].join('-'); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_Card__WEBPACK_IMPORTED_MODULE_7__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + key: key + }, item)); + }); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), itemsJSX); +} + +CardGroup.handledProps = ["as", "centered", "children", "className", "content", "doubling", "items", "itemsPerRow", "stackable", "textAlign"]; +CardGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** A group of cards can center itself inside its container. */ + centered: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** A group of cards can double its column width for mobile. */ + doubling: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Shorthand array of props for Card. */ + items: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand, + + /** A group of cards can set how many cards should exist in a row. */ + itemsPerRow: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].WIDTHS), + + /** A group of cards can automatically stack rows to a single columns on mobile devices. */ + stackable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A card group can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].TEXT_ALIGNMENTS, 'justified')) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CardGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Card/CardHeader.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Card/CardHeader.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A card can contain a header. + */ + +function CardHeader(props) { + var children = props.children, + className = props.className, + content = props.content, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), 'header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(CardHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(CardHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +CardHeader.handledProps = ["as", "children", "className", "content", "textAlign"]; +CardHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A card header can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS, 'justified')) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CardHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Card/CardMeta.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Card/CardMeta.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A card can contain content metadata. + */ + +function CardMeta(props) { + var children = props.children, + className = props.className, + content = props.content, + textAlign = props.textAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useTextAlignProp"])(textAlign), 'meta', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(CardMeta, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(CardMeta, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +CardMeta.handledProps = ["as", "children", "className", "content", "textAlign"]; +CardMeta.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A card meta can adjust its text alignment. */ + textAlign: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].TEXT_ALIGNMENTS, 'justified')) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CardMeta); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/Comment.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/Comment.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _CommentAction__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./CommentAction */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAction.js"); +/* harmony import */ var _CommentActions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./CommentActions */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentActions.js"); +/* harmony import */ var _CommentAuthor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./CommentAuthor */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAuthor.js"); +/* harmony import */ var _CommentAvatar__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./CommentAvatar */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAvatar.js"); +/* harmony import */ var _CommentContent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./CommentContent */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentContent.js"); +/* harmony import */ var _CommentGroup__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./CommentGroup */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentGroup.js"); +/* harmony import */ var _CommentMetadata__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./CommentMetadata */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentMetadata.js"); +/* harmony import */ var _CommentText__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./CommentText */ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentText.js"); + + + + + + + + + + + + + +/** + * A comment displays user feedback to site content. + */ + +function Comment(props) { + var className = props.className, + children = props.children, + collapsed = props.collapsed, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(collapsed, 'collapsed'), 'comment', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Comment, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Comment, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +Comment.handledProps = ["as", "children", "className", "collapsed", "content"]; +Comment.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Comment can be collapsed, or hidden from view. */ + collapsed: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +Comment.Author = _CommentAuthor__WEBPACK_IMPORTED_MODULE_7__["default"]; +Comment.Action = _CommentAction__WEBPACK_IMPORTED_MODULE_5__["default"]; +Comment.Actions = _CommentActions__WEBPACK_IMPORTED_MODULE_6__["default"]; +Comment.Avatar = _CommentAvatar__WEBPACK_IMPORTED_MODULE_8__["default"]; +Comment.Content = _CommentContent__WEBPACK_IMPORTED_MODULE_9__["default"]; +Comment.Group = _CommentGroup__WEBPACK_IMPORTED_MODULE_10__["default"]; +Comment.Metadata = _CommentMetadata__WEBPACK_IMPORTED_MODULE_11__["default"]; +Comment.Text = _CommentText__WEBPACK_IMPORTED_MODULE_12__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Comment); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAction.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAction.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain an action. + */ + +function CommentAction(props) { + var active = props.active, + className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(active, 'active'), className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentAction, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentAction, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +CommentAction.handledProps = ["active", "as", "children", "className", "content"]; +CommentAction.defaultProps = { + as: 'a' +}; +CommentAction.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Style as the currently active action. */ + active: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentAction); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentActions.js": +/*!********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentActions.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain an list of actions a user may perform related to this comment. + */ + +function CommentActions(props) { + var className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('actions', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentActions, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentActions, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +CommentActions.handledProps = ["as", "children", "className", "content"]; +CommentActions.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentActions); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAuthor.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAuthor.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain an author. + */ + +function CommentAuthor(props) { + var className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('author', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentAuthor, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentAuthor, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +CommentAuthor.handledProps = ["as", "children", "className", "content"]; +CommentAuthor.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentAuthor); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAvatar.js": +/*!*******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentAvatar.js ***! + \*******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain an image or avatar. + */ + +function CommentAvatar(props) { + var className = props.className, + src = props.src; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('avatar', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentAvatar, props); + + var _partitionHTMLProps = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["partitionHTMLProps"])(rest, { + htmlProps: _lib__WEBPACK_IMPORTED_MODULE_4__["htmlImageProps"] + }), + imageProps = _partitionHTMLProps[0], + rootProps = _partitionHTMLProps[1]; + + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentAvatar, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rootProps, { + className: classes + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createHTMLImage"])(src, { + autoGenerateKey: false, + defaultProps: imageProps + })); +} + +CommentAvatar.handledProps = ["as", "className", "src"]; +CommentAvatar.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Specifies the URL of the image. */ + src: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentAvatar); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentContent.js": +/*!********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentContent.js ***! + \********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain content. + */ + +function CommentContent(props) { + var className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(className, 'content'); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentContent, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +CommentContent.handledProps = ["as", "children", "className", "content"]; +CommentContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentGroup.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentGroup.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * Comments can be grouped. + */ + +function CommentGroup(props) { + var className = props.className, + children = props.children, + collapsed = props.collapsed, + content = props.content, + minimal = props.minimal, + size = props.size, + threaded = props.threaded; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(collapsed, 'collapsed'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(minimal, 'minimal'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(threaded, 'threaded'), 'comments', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(CommentGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(CommentGroup, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children) ? content : children); +} + +CommentGroup.handledProps = ["as", "children", "className", "collapsed", "content", "minimal", "size", "threaded"]; +CommentGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Comments can be collapsed, or hidden from view. */ + collapsed: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** Comments can hide extra information unless a user shows intent to interact with a comment. */ + minimal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Comments can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'medium')), + + /** A comment list can be threaded to showing the relationship between conversations. */ + threaded: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentMetadata.js": +/*!*********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentMetadata.js ***! + \*********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain metadata about the comment, an arbitrary amount of metadata may be defined. + */ + +function CommentMetadata(props) { + var className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('metadata', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentMetadata, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentMetadata, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +CommentMetadata.handledProps = ["as", "children", "className", "content"]; +CommentMetadata.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentMetadata); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/CommentText.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/CommentText.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A comment can contain text. + */ + +function CommentText(props) { + var className = props.className, + children = props.children, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(className, 'text'); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(CommentText, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(CommentText, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +CommentText.handledProps = ["as", "children", "className", "content"]; +CommentText.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (CommentText); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Comment/index.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Comment/index.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Comment__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Comment */ "./node_modules/semantic-ui-react/dist/es/views/Comment/Comment.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Comment__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/Feed.js": +/*!*******************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/Feed.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _FeedContent__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./FeedContent */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedContent.js"); +/* harmony import */ var _FeedDate__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./FeedDate */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedDate.js"); +/* harmony import */ var _FeedEvent__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./FeedEvent */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedEvent.js"); +/* harmony import */ var _FeedExtra__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./FeedExtra */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedExtra.js"); +/* harmony import */ var _FeedLabel__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./FeedLabel */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLabel.js"); +/* harmony import */ var _FeedLike__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./FeedLike */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLike.js"); +/* harmony import */ var _FeedMeta__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./FeedMeta */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedMeta.js"); +/* harmony import */ var _FeedSummary__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./FeedSummary */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedSummary.js"); +/* harmony import */ var _FeedUser__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./FeedUser */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedUser.js"); + + + + + + + + + + + + + + + + + +/** + * A feed presents user activity chronologically. + */ + +function Feed(props) { + var children = props.children, + className = props.className, + events = props.events, + size = props.size; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])('ui', size, 'feed', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getUnhandledProps"])(Feed, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_7__["getElementType"])(Feed, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_7__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, rest, { + className: classes + }), children); + } + + var eventElements = Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_3__["default"])(events, function (eventProps) { + var childKey = eventProps.childKey, + date = eventProps.date, + meta = eventProps.meta, + summary = eventProps.summary, + eventData = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(eventProps, ["childKey", "date", "meta", "summary"]); + + var finalKey = childKey != null ? childKey : [date, meta, summary].join('-'); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(_FeedEvent__WEBPACK_IMPORTED_MODULE_10__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({ + date: date, + key: finalKey, + meta: meta, + summary: summary + }, eventData)); + }); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, rest, { + className: classes + }), eventElements); +} + +Feed.handledProps = ["as", "children", "className", "events", "size"]; +Feed.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.string, + + /** Shorthand array of props for FeedEvent. */ + events: _lib__WEBPACK_IMPORTED_MODULE_7__["customPropTypes"].collectionShorthand, + + /** A feed can have different sizes. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_5___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_2__["default"])(_lib__WEBPACK_IMPORTED_MODULE_7__["SUI"].SIZES, 'mini', 'tiny', 'medium', 'big', 'huge', 'massive')) +} : undefined; +Feed.Content = _FeedContent__WEBPACK_IMPORTED_MODULE_8__["default"]; +Feed.Date = _FeedDate__WEBPACK_IMPORTED_MODULE_9__["default"]; +Feed.Event = _FeedEvent__WEBPACK_IMPORTED_MODULE_10__["default"]; +Feed.Extra = _FeedExtra__WEBPACK_IMPORTED_MODULE_11__["default"]; +Feed.Label = _FeedLabel__WEBPACK_IMPORTED_MODULE_12__["default"]; +Feed.Like = _FeedLike__WEBPACK_IMPORTED_MODULE_13__["default"]; +Feed.Meta = _FeedMeta__WEBPACK_IMPORTED_MODULE_14__["default"]; +Feed.Summary = _FeedSummary__WEBPACK_IMPORTED_MODULE_15__["default"]; +Feed.User = _FeedUser__WEBPACK_IMPORTED_MODULE_16__["default"]; +/* harmony default export */ __webpack_exports__["default"] = (Feed); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedContent.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedContent.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _FeedDate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FeedDate */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedDate.js"); +/* harmony import */ var _FeedExtra__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FeedExtra */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedExtra.js"); +/* harmony import */ var _FeedMeta__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./FeedMeta */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedMeta.js"); +/* harmony import */ var _FeedSummary__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./FeedSummary */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedSummary.js"); + + + + + + + + + + +function FeedContent(props) { + var children = props.children, + className = props.className, + content = props.content, + extraImages = props.extraImages, + extraText = props.extraText, + date = props.date, + meta = props.meta, + summary = props.summary; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedContent, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedDate__WEBPACK_IMPORTED_MODULE_5__["default"], function (val) { + return { + content: val + }; + }, date, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedSummary__WEBPACK_IMPORTED_MODULE_8__["default"], function (val) { + return { + content: val + }; + }, summary, { + autoGenerateKey: false + }), content, Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedExtra__WEBPACK_IMPORTED_MODULE_6__["default"], function (val) { + return { + text: true, + content: val + }; + }, extraText, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedExtra__WEBPACK_IMPORTED_MODULE_6__["default"], function (val) { + return { + images: val + }; + }, extraImages, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedMeta__WEBPACK_IMPORTED_MODULE_7__["default"], function (val) { + return { + content: val + }; + }, meta, { + autoGenerateKey: false + })); +} + +FeedContent.handledProps = ["as", "children", "className", "content", "date", "extraImages", "extraText", "meta", "summary"]; +FeedContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** An event can contain a date. */ + date: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedExtra with images. */ + extraImages: _FeedExtra__WEBPACK_IMPORTED_MODULE_6__["default"].propTypes.images, + + /** Shorthand for FeedExtra with text. */ + extraText: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedMeta. */ + meta: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedSummary. */ + summary: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedDate.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedDate.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * An event or an event summary can contain a date. + */ + +function FeedDate(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('date', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedDate, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedDate, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +FeedDate.handledProps = ["as", "children", "className", "content"]; +FeedDate.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedDate); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedEvent.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedEvent.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _FeedContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FeedContent */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedContent.js"); +/* harmony import */ var _FeedLabel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FeedLabel */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLabel.js"); + + + + + + + +/** + * A feed contains an event. + */ + +function FeedEvent(props) { + var content = props.content, + children = props.children, + className = props.className, + date = props.date, + extraImages = props.extraImages, + extraText = props.extraText, + image = props.image, + icon = props.icon, + meta = props.meta, + summary = props.summary; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('event', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedEvent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedEvent, props); + var hasContentProp = content || date || extraImages || extraText || meta || summary; + var contentProps = { + content: content, + date: date, + extraImages: extraImages, + extraText: extraText, + meta: meta, + summary: summary + }; + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedLabel__WEBPACK_IMPORTED_MODULE_6__["default"], function (val) { + return { + icon: val + }; + }, icon, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedLabel__WEBPACK_IMPORTED_MODULE_6__["default"], function (val) { + return { + image: val + }; + }, image, { + autoGenerateKey: false + }), hasContentProp && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_FeedContent__WEBPACK_IMPORTED_MODULE_5__["default"], contentProps), children); +} + +FeedEvent.handledProps = ["as", "children", "className", "content", "date", "extraImages", "extraText", "icon", "image", "meta", "summary"]; +FeedEvent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for FeedContent. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedDate. */ + date: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedExtra with images. */ + extraImages: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedExtra with content. */ + extraText: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** An event can contain icon label. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** An event can contain image label. */ + image: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedMeta. */ + meta: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedSummary. */ + summary: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedEvent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedExtra.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedExtra.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + + +/** + * A feed can contain an extra content. + */ + +function FeedExtra(props) { + var children = props.children, + className = props.className, + content = props.content, + images = props.images, + text = props.text; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(images, 'images'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(content || text, 'text'), 'extra', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(FeedExtra, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(FeedExtra, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } // TODO need a "collection factory" to handle creating multiple image elements and their keys + + + var imageElements = Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_1__["default"])(images, function (image, index) { + var key = [index, image].join('-'); + return Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createHTMLImage"])(image, { + key: key + }); + }); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content, imageElements); +} + +FeedExtra.handledProps = ["as", "children", "className", "content", "images", "text"]; +FeedExtra.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** An event can contain additional information like a set of images. */ + images: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].every([_lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].disallow(['text']), prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].collectionShorthand])]), + + /** An event can contain additional text information. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedExtra); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLabel.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLabel.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + +/** + * An event can contain an image or icon label. + */ + +function FeedLabel(props) { + var children = props.children, + className = props.className, + content = props.content, + icon = props.icon, + image = props.image; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('label', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedLabel, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedLabel, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content, _elements_Icon__WEBPACK_IMPORTED_MODULE_5__["default"].create(icon, { + autoGenerateKey: false + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createHTMLImage"])(image)); +} + +FeedLabel.handledProps = ["as", "children", "className", "content", "icon", "image"]; +FeedLabel.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** An event can contain icon label. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** An event can contain image label. */ + image: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedLabel); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLike.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLike.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../elements/Icon */ "./node_modules/semantic-ui-react/dist/es/elements/Icon/index.js"); + + + + + + +/** + * A feed can contain a like element. + */ + +function FeedLike(props) { + var children = props.children, + className = props.className, + content = props.content, + icon = props.icon; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('like', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedLike, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedLike, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _elements_Icon__WEBPACK_IMPORTED_MODULE_5__["default"].create(icon, { + autoGenerateKey: false + }), content); +} + +FeedLike.handledProps = ["as", "children", "className", "content", "icon"]; +FeedLike.defaultProps = { + as: 'a' +}; +FeedLike.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for icon. Mutually exclusive with children. */ + icon: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedLike); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedMeta.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedMeta.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _FeedLike__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FeedLike */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedLike.js"); + + + + + + +/** + * A feed can contain a meta. + */ + +function FeedMeta(props) { + var children = props.children, + className = props.className, + content = props.content, + like = props.like; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('meta', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedMeta, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedMeta, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedLike__WEBPACK_IMPORTED_MODULE_5__["default"], function (val) { + return { + content: val + }; + }, like, { + autoGenerateKey: false + }), content); +} + +FeedMeta.handledProps = ["as", "children", "className", "content", "like"]; +FeedMeta.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for FeedLike. */ + like: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedMeta); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedSummary.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedSummary.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _FeedDate__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FeedDate */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedDate.js"); +/* harmony import */ var _FeedUser__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FeedUser */ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedUser.js"); + + + + + + + +/** + * A feed can contain a summary. + */ + +function FeedSummary(props) { + var children = props.children, + className = props.className, + content = props.content, + date = props.date, + user = props.user; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('summary', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedSummary, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedSummary, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedUser__WEBPACK_IMPORTED_MODULE_6__["default"], function (val) { + return { + content: val + }; + }, user, { + autoGenerateKey: false + }), content && ' ', content, content && ' ', Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthand"])(_FeedDate__WEBPACK_IMPORTED_MODULE_5__["default"], function (val) { + return { + content: val + }; + }, date, { + autoGenerateKey: false + })); +} + +FeedSummary.handledProps = ["as", "children", "className", "content", "date", "user"]; +FeedSummary.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for FeedDate. */ + date: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for FeedUser. */ + user: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (FeedSummary); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/FeedUser.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/FeedUser.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A feed can contain a user element. + */ + +function FeedUser(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('user', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(FeedUser, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(FeedUser, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +FeedUser.handledProps = ["as", "children", "className", "content"]; +FeedUser.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +FeedUser.defaultProps = { + as: 'a' +}; +/* harmony default export */ __webpack_exports__["default"] = (FeedUser); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Feed/index.js": +/*!********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Feed/index.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Feed__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Feed */ "./node_modules/semantic-ui-react/dist/es/views/Feed/Feed.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Feed__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/Item.js": +/*!*******************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/Item.js ***! + \*******************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _ItemContent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ItemContent */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemContent.js"); +/* harmony import */ var _ItemDescription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ItemDescription */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemDescription.js"); +/* harmony import */ var _ItemExtra__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ItemExtra */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemExtra.js"); +/* harmony import */ var _ItemGroup__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ItemGroup */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemGroup.js"); +/* harmony import */ var _ItemHeader__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./ItemHeader */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemHeader.js"); +/* harmony import */ var _ItemImage__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ItemImage */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemImage.js"); +/* harmony import */ var _ItemMeta__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ItemMeta */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemMeta.js"); + + + + + + + + + + + + +/** + * An item view presents large collections of site content for display. + */ + +function Item(props) { + var children = props.children, + className = props.className, + content = props.content, + description = props.description, + extra = props.extra, + header = props.header, + image = props.image, + meta = props.meta; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('item', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(Item, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(Item, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _ItemImage__WEBPACK_IMPORTED_MODULE_10__["default"].create(image, { + autoGenerateKey: false + }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(_ItemContent__WEBPACK_IMPORTED_MODULE_5__["default"], { + content: content, + description: description, + extra: extra, + header: header, + meta: meta + })); +} + +Item.handledProps = ["as", "children", "className", "content", "description", "extra", "header", "image", "meta"]; +Item.Content = _ItemContent__WEBPACK_IMPORTED_MODULE_5__["default"]; +Item.Description = _ItemDescription__WEBPACK_IMPORTED_MODULE_6__["default"]; +Item.Extra = _ItemExtra__WEBPACK_IMPORTED_MODULE_7__["default"]; +Item.Group = _ItemGroup__WEBPACK_IMPORTED_MODULE_8__["default"]; +Item.Header = _ItemHeader__WEBPACK_IMPORTED_MODULE_9__["default"]; +Item.Image = _ItemImage__WEBPACK_IMPORTED_MODULE_10__["default"]; +Item.Meta = _ItemMeta__WEBPACK_IMPORTED_MODULE_11__["default"]; +Item.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for ItemContent component. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for ItemDescription component. */ + description: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemExtra component. */ + extra: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemHeader component. */ + header: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemImage component. */ + image: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemMeta component. */ + meta: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (Item); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemContent.js": +/*!**************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemContent.js ***! + \**************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _ItemHeader__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ItemHeader */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemHeader.js"); +/* harmony import */ var _ItemDescription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ItemDescription */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemDescription.js"); +/* harmony import */ var _ItemExtra__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ItemExtra */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemExtra.js"); +/* harmony import */ var _ItemMeta__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ItemMeta */ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemMeta.js"); + + + + + + + + + +/** + * An item can contain content. + */ + +function ItemContent(props) { + var children = props.children, + className = props.className, + content = props.content, + description = props.description, + extra = props.extra, + header = props.header, + meta = props.meta, + verticalAlign = props.verticalAlign; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useVerticalAlignProp"])(verticalAlign), 'content', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ItemContent, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ItemContent, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _ItemHeader__WEBPACK_IMPORTED_MODULE_5__["default"].create(header, { + autoGenerateKey: false + }), _ItemMeta__WEBPACK_IMPORTED_MODULE_8__["default"].create(meta, { + autoGenerateKey: false + }), _ItemDescription__WEBPACK_IMPORTED_MODULE_6__["default"].create(description, { + autoGenerateKey: false + }), _ItemExtra__WEBPACK_IMPORTED_MODULE_7__["default"].create(extra, { + autoGenerateKey: false + }), content); +} + +ItemContent.handledProps = ["as", "children", "className", "content", "description", "extra", "header", "meta", "verticalAlign"]; +ItemContent.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Shorthand for ItemDescription component. */ + description: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemExtra component. */ + extra: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemHeader component. */ + header: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Shorthand for ItemMeta component. */ + meta: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].itemShorthand, + + /** Content can specify its vertical alignment. */ + verticalAlign: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_4__["SUI"].VERTICAL_ALIGNMENTS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ItemContent); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemDescription.js": +/*!******************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemDescription.js ***! + \******************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * An item can contain a description with a single or multiple paragraphs. + */ + +function ItemDescription(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('description', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ItemDescription, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ItemDescription, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ItemDescription.handledProps = ["as", "children", "className", "content"]; +ItemDescription.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ItemDescription.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ItemDescription, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ItemDescription); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemExtra.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemExtra.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * An item can contain extra content meant to be formatted separately from the main content. + */ + +function ItemExtra(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('extra', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ItemExtra, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ItemExtra, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ItemExtra.handledProps = ["as", "children", "className", "content"]; +ItemExtra.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ItemExtra.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ItemExtra, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ItemExtra); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemGroup.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemGroup.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/objectWithoutPropertiesLoose */ "./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js"); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Item__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Item */ "./node_modules/semantic-ui-react/dist/es/views/Item/Item.js"); + + + + + + + + +/** + * A group of items. + */ + +function ItemGroup(props) { + var children = props.children, + className = props.className, + content = props.content, + divided = props.divided, + items = props.items, + link = props.link, + relaxed = props.relaxed, + unstackable = props.unstackable; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('ui', Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(divided, 'divided'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(link, 'link'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(unstackable, 'unstackable'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOrValueAndKey"])(relaxed, 'relaxed'), 'items', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(ItemGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(ItemGroup, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, rest, { + className: classes + }), content); + } + + var itemsJSX = Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(items, function (item) { + var childKey = item.childKey, + itemProps = Object(_babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(item, ["childKey"]); + + var finalKey = childKey != null ? childKey : [itemProps.content, itemProps.description, itemProps.header, itemProps.meta].join('-'); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(_Item__WEBPACK_IMPORTED_MODULE_7__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, itemProps, { + key: finalKey + })); + }); + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_1__["default"])({}, rest, { + className: classes + }), itemsJSX); +} + +ItemGroup.handledProps = ["as", "children", "className", "content", "divided", "items", "link", "relaxed", "unstackable"]; +ItemGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** Items can be divided to better distinguish between grouped content. */ + divided: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Shorthand array of props for Item. */ + items: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand, + + /** An item can be formatted so that the entire contents link to another page. */ + link: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A group of items can relax its padding to provide more negative space. */ + relaxed: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(['very'])]), + + /** Prevent items from stacking on mobile. */ + unstackable: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (ItemGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemHeader.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemHeader.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * An item can contain a header. + */ + +function ItemHeader(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('header', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ItemHeader, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ItemHeader, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ItemHeader.handledProps = ["as", "children", "className", "content"]; +ItemHeader.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ItemHeader.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ItemHeader, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ItemHeader); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemImage.js": +/*!************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemImage.js ***! + \************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _elements_Image__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../elements/Image */ "./node_modules/semantic-ui-react/dist/es/elements/Image/index.js"); + + + + +/** + * An item can contain an image. + */ + +function ItemImage(props) { + var size = props.size; + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_2__["getUnhandledProps"])(ItemImage, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(_elements_Image__WEBPACK_IMPORTED_MODULE_3__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + size: size, + ui: !!size, + wrapped: true + })); +} + +ItemImage.handledProps = ["size"]; +ItemImage.propTypes = true ? { + /** An image may appear at different sizes. */ + size: _elements_Image__WEBPACK_IMPORTED_MODULE_3__["default"].propTypes.size +} : undefined; +ItemImage.create = Object(_lib__WEBPACK_IMPORTED_MODULE_2__["createShorthandFactory"])(ItemImage, function (src) { + return { + src: src + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ItemImage); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/ItemMeta.js": +/*!***********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/ItemMeta.js ***! + \***********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * An item can contain content metadata. + */ + +function ItemMeta(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('meta', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(ItemMeta, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(ItemMeta, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +ItemMeta.handledProps = ["as", "children", "className", "content"]; +ItemMeta.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +ItemMeta.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(ItemMeta, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (ItemMeta); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Item/index.js": +/*!********************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Item/index.js ***! + \********************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Item__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Item */ "./node_modules/semantic-ui-react/dist/es/views/Item/Item.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Item__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Statistic/Statistic.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Statistic/Statistic.js ***! + \*****************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _StatisticGroup__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./StatisticGroup */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticGroup.js"); +/* harmony import */ var _StatisticLabel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./StatisticLabel */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticLabel.js"); +/* harmony import */ var _StatisticValue__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./StatisticValue */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticValue.js"); + + + + + + + + + +/** + * A statistic emphasizes the current value of an attribute. + */ + +function Statistic(props) { + var children = props.children, + className = props.className, + color = props.color, + content = props.content, + floated = props.floated, + horizontal = props.horizontal, + inverted = props.inverted, + label = props.label, + size = props.size, + text = props.text, + value = props.value; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_2__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useValueAndKey"])(floated, 'floated'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(horizontal, 'horizontal'), Object(_lib__WEBPACK_IMPORTED_MODULE_5__["useKeyOnly"])(inverted, 'inverted'), 'statistic', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getUnhandledProps"])(Statistic, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["getElementType"])(Statistic, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_5__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _StatisticValue__WEBPACK_IMPORTED_MODULE_8__["default"].create(value, { + defaultProps: { + text: text + }, + autoGenerateKey: false + }), _StatisticLabel__WEBPACK_IMPORTED_MODULE_7__["default"].create(label, { + autoGenerateKey: false + })); +} + +Statistic.handledProps = ["as", "children", "className", "color", "content", "floated", "horizontal", "inverted", "label", "size", "text", "value"]; +Statistic.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.string, + + /** A statistic can be formatted to be different colors. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A statistic can sit to the left or right of other content. */ + floated: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].FLOATS), + + /** A statistic can present its measurement horizontally. */ + horizontal: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** A statistic can be formatted to fit on a dark background. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Label content of the Statistic. */ + label: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand, + + /** A statistic can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_5__["SUI"].SIZES, 'big', 'massive', 'medium')), + + /** Format the StatisticValue with smaller font size to fit nicely beside number values. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_3___default.a.bool, + + /** Value content of the Statistic. */ + value: _lib__WEBPACK_IMPORTED_MODULE_5__["customPropTypes"].contentShorthand +} : undefined; +Statistic.Group = _StatisticGroup__WEBPACK_IMPORTED_MODULE_6__["default"]; +Statistic.Label = _StatisticLabel__WEBPACK_IMPORTED_MODULE_7__["default"]; +Statistic.Value = _StatisticValue__WEBPACK_IMPORTED_MODULE_8__["default"]; +Statistic.create = Object(_lib__WEBPACK_IMPORTED_MODULE_5__["createShorthandFactory"])(Statistic, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (Statistic); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticGroup.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticGroup.js ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var lodash_es_without__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash-es/without */ "./node_modules/lodash-es/without.js"); +/* harmony import */ var lodash_es_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash-es/map */ "./node_modules/lodash-es/map.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); +/* harmony import */ var _Statistic__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./Statistic */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/Statistic.js"); + + + + + + + + +/** + * A group of statistics. + */ + +function StatisticGroup(props) { + var children = props.children, + className = props.className, + color = props.color, + content = props.content, + horizontal = props.horizontal, + inverted = props.inverted, + items = props.items, + size = props.size, + widths = props.widths; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_3__["default"])('ui', color, size, Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(horizontal, 'horizontal'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useKeyOnly"])(inverted, 'inverted'), Object(_lib__WEBPACK_IMPORTED_MODULE_6__["useWidthProp"])(widths), 'statistics', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getUnhandledProps"])(StatisticGroup, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_6__["getElementType"])(StatisticGroup, props); + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(children)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), children); + } + + if (!_lib__WEBPACK_IMPORTED_MODULE_6__["childrenUtils"].isNil(content)) { + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), content); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_5___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), Object(lodash_es_map__WEBPACK_IMPORTED_MODULE_2__["default"])(items, function (item) { + return _Statistic__WEBPACK_IMPORTED_MODULE_7__["default"].create(item); + })); +} + +StatisticGroup.handledProps = ["as", "children", "className", "color", "content", "horizontal", "inverted", "items", "size", "widths"]; +StatisticGroup.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.string, + + /** A statistic group can be formatted to be different colors. */ + color: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].COLORS), + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].contentShorthand, + + /** A statistic group can present its measurement horizontally. */ + horizontal: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** A statistic group can be formatted to fit on a dark background. */ + inverted: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.bool, + + /** Array of props for Statistic. */ + items: _lib__WEBPACK_IMPORTED_MODULE_6__["customPropTypes"].collectionShorthand, + + /** A statistic group can vary in size. */ + size: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(Object(lodash_es_without__WEBPACK_IMPORTED_MODULE_1__["default"])(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].SIZES, 'big', 'massive', 'medium')), + + /** A statistic group can have its items divided evenly. */ + widths: prop_types__WEBPACK_IMPORTED_MODULE_4___default.a.oneOf(_lib__WEBPACK_IMPORTED_MODULE_6__["SUI"].WIDTHS) +} : undefined; +/* harmony default export */ __webpack_exports__["default"] = (StatisticGroup); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticLabel.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticLabel.js ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A statistic can contain a label to help provide context for the presented value. + */ + +function StatisticLabel(props) { + var children = props.children, + className = props.className, + content = props.content; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])('label', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(StatisticLabel, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(StatisticLabel, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +StatisticLabel.handledProps = ["as", "children", "className", "content"]; +StatisticLabel.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand +} : undefined; +StatisticLabel.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(StatisticLabel, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (StatisticLabel); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticValue.js": +/*!**********************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Statistic/StatisticValue.js ***! + \**********************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/esm/extends */ "./node_modules/@babel/runtime/helpers/esm/extends.js"); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.m.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _lib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../lib */ "./node_modules/semantic-ui-react/dist/es/lib/index.js"); + + + + + +/** + * A statistic can contain a numeric, icon, image, or text value. + */ + +function StatisticValue(props) { + var children = props.children, + className = props.className, + content = props.content, + text = props.text; + var classes = Object(clsx__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_lib__WEBPACK_IMPORTED_MODULE_4__["useKeyOnly"])(text, 'text'), 'value', className); + var rest = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getUnhandledProps"])(StatisticValue, props); + var ElementType = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["getElementType"])(StatisticValue, props); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(ElementType, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({}, rest, { + className: classes + }), _lib__WEBPACK_IMPORTED_MODULE_4__["childrenUtils"].isNil(children) ? content : children); +} + +StatisticValue.handledProps = ["as", "children", "className", "content", "text"]; +StatisticValue.propTypes = true ? { + /** An element type to render as (string or function). */ + as: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.elementType, + + /** Primary content. */ + children: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.node, + + /** Additional classes. */ + className: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.string, + + /** Shorthand for primary content. */ + content: _lib__WEBPACK_IMPORTED_MODULE_4__["customPropTypes"].contentShorthand, + + /** Format the value with smaller font size to fit nicely beside number values. */ + text: prop_types__WEBPACK_IMPORTED_MODULE_2___default.a.bool +} : undefined; +StatisticValue.create = Object(_lib__WEBPACK_IMPORTED_MODULE_4__["createShorthandFactory"])(StatisticValue, function (content) { + return { + content: content + }; +}); +/* harmony default export */ __webpack_exports__["default"] = (StatisticValue); + +/***/ }), + +/***/ "./node_modules/semantic-ui-react/dist/es/views/Statistic/index.js": +/*!*************************************************************************!*\ + !*** ./node_modules/semantic-ui-react/dist/es/views/Statistic/index.js ***! + \*************************************************************************/ +/*! exports provided: default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _Statistic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Statistic */ "./node_modules/semantic-ui-react/dist/es/views/Statistic/Statistic.js"); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _Statistic__WEBPACK_IMPORTED_MODULE_0__["default"]; }); + + + + +/***/ }), + +/***/ "./node_modules/shallowequal/index.js": +/*!********************************************!*\ + !*** ./node_modules/shallowequal/index.js ***! + \********************************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +// + +module.exports = function shallowEqual(objA, objB, compare, compareContext) { + var ret = compare ? compare.call(compareContext, objA, objB) : void 0; + + if (ret !== void 0) { + return !!ret; + } + + if (objA === objB) { + return true; + } + + if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB); + + // Test for A's keys different from B. + for (var idx = 0; idx < keysA.length; idx++) { + var key = keysA[idx]; + + if (!bHasOwnProperty(key)) { + return false; + } + + var valueA = objA[key]; + var valueB = objB[key]; + + ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0; + + if (ret === false || (ret === void 0 && valueA !== valueB)) { + return false; + } + } + + return true; +}; + + +/***/ }), + +/***/ "./node_modules/warning/warning.js": +/*!*****************************************!*\ + !*** ./node_modules/warning/warning.js ***! + \*****************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2014-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +/** + * Similar to invariant but only logs a warning if the condition is not met. + * This can be used to log issues in development environments in critical + * paths. Removing the logging code for production environments will keep the + * same logic and follow the same code paths. + */ + +var __DEV__ = "development" !== 'production'; + +var warning = function() {}; + +if (__DEV__) { + var printWarning = function printWarning(format, args) { + var len = arguments.length; + args = new Array(len > 1 ? len - 1 : 0); + for (var key = 1; key < len; key++) { + args[key - 1] = arguments[key]; + } + var argIndex = 0; + var message = 'Warning: ' + + format.replace(/%s/g, function() { + return args[argIndex++]; + }); + if (typeof console !== 'undefined') { + console.error(message); + } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + } + + warning = function(condition, format, args) { + var len = arguments.length; + args = new Array(len > 2 ? len - 2 : 0); + for (var key = 2; key < len; key++) { + args[key - 2] = arguments[key]; + } + if (format === undefined) { + throw new Error( + '`warning(condition, format, ...args)` requires a warning ' + + 'message argument' + ); + } + if (!condition) { + printWarning.apply(null, [format].concat(args)); + } + }; +} + +module.exports = warning; + + +/***/ }), + +/***/ "./src/artifacts/contracts/Faucet.sol/Faucet.json": +/*!********************************************************!*\ + !*** ./src/artifacts/contracts/Faucet.sol/Faucet.json ***! + \********************************************************/ +/*! exports provided: _format, contractName, sourceName, abi, bytecode, deployedBytecode, linkReferences, deployedLinkReferences, default */ +/***/ (function(module) { + +module.exports = JSON.parse("{\"_format\":\"hh-sol-artifact-1\",\"contractName\":\"Faucet\",\"sourceName\":\"contracts/Faucet.sol\",\"abi\":[{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"recepient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"bytecode\":\"0x608060405234801561001057600080fd5b5060fe8061001f6000396000f3fe608060405260043610601f5760003560e01c806351cff8d914602a576025565b36602557005b600080fd5b348015603557600080fd5b50607560048036036020811015604a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506077565b005b8073ffffffffffffffffffffffffffffffffffffffff166108fc67016345785d8a00009081150290604051600060405180830381858888f1935050505015801560c4573d6000803e3d6000fd5b505056fea2646970667358221220d13e149a03fc196c6871d0f03538a44db9e463071b6a9ca5535a4551274dd8ea64736f6c63430007060033\",\"deployedBytecode\":\"0x608060405260043610601f5760003560e01c806351cff8d914602a576025565b36602557005b600080fd5b348015603557600080fd5b50607560048036036020811015604a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506077565b005b8073ffffffffffffffffffffffffffffffffffffffff166108fc67016345785d8a00009081150290604051600060405180830381858888f1935050505015801560c4573d6000803e3d6000fd5b505056fea2646970667358221220d13e149a03fc196c6871d0f03538a44db9e463071b6a9ca5535a4551274dd8ea64736f6c63430007060033\",\"linkReferences\":{},\"deployedLinkReferences\":{}}"); + +/***/ }), + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: __N_SSG, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__N_SSG", function() { return __N_SSG; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-react */ "./node_modules/semantic-ui-react/dist/es/index.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ethers */ "./node_modules/ethers/lib.esm/index.js"); + + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx", + _s = $RefreshSig$(); + + + + + + + +function Home(_ref) { + _s(); + + var contractAddress = _ref.contractAddress; + + var _useState = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(''), + value = _useState[0], + setValue = _useState[1]; + + var _useState2 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + touched = _useState2[0], + setTouched = _useState2[1]; + + var _useState3 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + isValid = _useState3[0], + setIsValid = _useState3[1]; + + var _useState4 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(), + contractBalance = _useState4[0], + setContractBalance = _useState4[1]; + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_5__["verifyEthAddress"])(value)); + }, [value]); + + var onSubmit = /*#__PURE__*/function () { + var _ref2 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(e) { + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + _context.next = 3; + return requestFunds(); + + case 3: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function onSubmit(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + var getContractBalance = /*#__PURE__*/function () { + var _ref3 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() { + var provider, _contractBalance; + + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context2.next = 6; + break; + } + + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + _context2.next = 4; + return provider.getBalance(contractAddress); + + case 4: + _contractBalance = _context2.sent; + return _context2.abrupt("return", _contractBalance.toString()); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function getContractBalance() { + return _ref3.apply(this, arguments); + }; + }(); + + var requestFunds = /*#__PURE__*/function () { + var _ref4 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() { + var provider, signer, contract; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context3.next = 15; + break; + } + + _context3.next = 3; + return window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + case 3: + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + signer = provider.getSigner(); + contract = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__.abi, signer); + _context3.prev = 6; + _context3.next = 9; + return contract.withdraw(value); + + case 9: + console.log('Successfully withdrawed funds'); + _context3.next = 15; + break; + + case 12: + _context3.prev = 12; + _context3.t0 = _context3["catch"](6); + console.log('Error: ', _context3.t0); + + case 15: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[6, 12]]); + })); + + return function requestFunds() { + return _ref4.apply(this, arguments); + }; + }(); + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (window.ethereum !== undefined) { + getContractBalance().then(function (bal) { + return setContractBalance(bal); + }); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Container"], { + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 66, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Input"], { + type: "text", + value: value, + onChange: function onChange(e) { + return setValue(e.target.value); + } + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 75, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 65, + columnNumber: 7 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("span", { + children: ["Contract balance - ", parseInt(contractBalance || '') / Math.pow(10, 18), ' ', "ether"] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 77, + columnNumber: 7 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 64, + columnNumber: 5 + }, this); +} + +_s(Home, "53Cp6xGjVjyEKBL1leGmK5rryVw="); + +_c = Home; +var __N_SSG = true; +/* harmony default export */ __webpack_exports__["default"] = (Home); + +var _c; + +$RefreshReg$(_c, "Home"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }), + +/***/ "./src/util/index.ts": +/*!***************************!*\ + !*** ./src/util/index.ts ***! + \***************************/ +/*! exports provided: verifyEthAddress */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "verifyEthAddress", function() { return verifyEthAddress; }); +var verifyEthAddress = function verifyEthAddress(address) { + var regex = /^0x[a-fA-F0-9]{40}$/; + return regex.test(address); +}; + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }), + +/***/ 1: +/*!************************!*\ + !*** buffer (ignored) ***! + \************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* (ignored) */ + +/***/ }) + +},[["./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?page=%2F&absolutePagePath=G%3A%5Ctypescript-solidity-dev-starter-kit%5Csrc%5Cpages%5Cindex.tsx!./","webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2Fzc2VydFRoaXNJbml0aWFsaXplZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvYWJpL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9hYmktY29kZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9jb2RlcnMvYWJzdHJhY3QtY29kZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9jb2RlcnMvYWRkcmVzcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FiaS9saWIuZXNtL2NvZGVycy9hbm9ueW1vdXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9jb2RlcnMvYXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9jb2RlcnMvYm9vbGVhbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FiaS9saWIuZXNtL2NvZGVycy9ieXRlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FiaS9saWIuZXNtL2NvZGVycy9maXhlZC1ieXRlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FiaS9saWIuZXNtL2NvZGVycy9udWxsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvYWJpL2xpYi5lc20vY29kZXJzL251bWJlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FiaS9saWIuZXNtL2NvZGVycy9zdHJpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9jb2RlcnMvdHVwbGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9mcmFnbWVudHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYmkvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FiaS9saWIuZXNtL2ludGVyZmFjZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2Fic3RyYWN0LXByb3ZpZGVyL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYnN0cmFjdC1wcm92aWRlci9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvYWJzdHJhY3Qtc2lnbmVyL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9hYnN0cmFjdC1zaWduZXIvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FkZHJlc3MvbGliLmVzbS9fdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2FkZHJlc3MvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2Jhc2U2NC9saWIuZXNtL2Jhc2U2NC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2Jhc2U2NC9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvYmFzZXgvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2JpZ251bWJlci9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyL2xpYi5lc20vYmlnbnVtYmVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyL2xpYi5lc20vZml4ZWRudW1iZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9iaWdudW1iZXIvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2J5dGVzL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9ieXRlcy9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvY29uc3RhbnRzL2xpYi5lc20vYWRkcmVzc2VzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvY29uc3RhbnRzL2xpYi5lc20vYmlnbnVtYmVycy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2NvbnN0YW50cy9saWIuZXNtL2hhc2hlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2NvbnN0YW50cy9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvY29uc3RhbnRzL2xpYi5lc20vc3RyaW5ncy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2NvbnRyYWN0cy9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvY29udHJhY3RzL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9oYXNoL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9oYXNoL2xpYi5lc20vaWQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9oYXNoL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9oYXNoL2xpYi5lc20vbWVzc2FnZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2hhc2gvbGliLmVzbS9uYW1laGFzaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2hhc2gvbGliLmVzbS90eXBlZC1kYXRhLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvaGRub2RlL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9oZG5vZGUvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2pzb24td2FsbGV0cy9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvanNvbi13YWxsZXRzL2xpYi5lc20vY3Jvd2RzYWxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvanNvbi13YWxsZXRzL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9qc29uLXdhbGxldHMvbGliLmVzbS9pbnNwZWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvanNvbi13YWxsZXRzL2xpYi5lc20va2V5c3RvcmUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9qc29uLXdhbGxldHMvbGliLmVzbS91dGlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L2tlY2NhazI1Ni9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvbG9nZ2VyL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9sb2dnZXIvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L25ldHdvcmtzL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9uZXR3b3Jrcy9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvcGJrZGYyL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wYmtkZjIvbGliLmVzbS9wYmtkZjIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS9fdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL2FsY2hlbXktcHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS9iYXNlLXByb3ZpZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvcHJvdmlkZXJzL2xpYi5lc20vY2xvdWRmbGFyZS1wcm92aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL2V0aGVyc2Nhbi1wcm92aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL2ZhbGxiYWNrLXByb3ZpZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvcHJvdmlkZXJzL2xpYi5lc20vZm9ybWF0dGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvcHJvdmlkZXJzL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS9pbmZ1cmEtcHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS9pcGMtcHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS9qc29uLXJwYy1wcm92aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL25vZGVzbWl0aC1wcm92aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL3BvY2tldC1wcm92aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL3VybC1qc29uLXJwYy1wcm92aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3Byb3ZpZGVycy9saWIuZXNtL3dlYjMtcHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS93ZWJzb2NrZXQtcHJvdmlkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9wcm92aWRlcnMvbGliLmVzbS93cy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3JhbmRvbS9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvcmFuZG9tL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9yYW5kb20vbGliLmVzbS9yYW5kb20uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9yYW5kb20vbGliLmVzbS9zaHVmZmxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvcmxwL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9ybHAvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3NoYTIvbGliLmVzbS9fdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3NoYTIvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3NoYTIvbGliLmVzbS9zaGEyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc2hhMi9saWIuZXNtL3R5cGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc2hhMi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3NoYTIvbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvY29tbW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc2hhMi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9obWFjLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc2hhMi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9yaXBlbWQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3NoYTIvbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yMjQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yNTYuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8zODQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS81MTIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS9jb21tb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaGEyL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc2lnbmluZy1rZXkvbGliLmVzbS9fdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3NpZ25pbmcta2V5L2xpYi5lc20vZWxsaXB0aWMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zaWduaW5nLWtleS9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc29saWRpdHkvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3N0cmluZ3MvbGliLmVzbS9fdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3N0cmluZ3MvbGliLmVzbS9ieXRlczMyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvc3RyaW5ncy9saWIuZXNtL2lkbmEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zdHJpbmdzL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC9zdHJpbmdzL2xpYi5lc20vdXRmOC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3RyYW5zYWN0aW9ucy9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvdHJhbnNhY3Rpb25zL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC91bml0cy9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3QvdW5pdHMvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3dhbGxldC9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvd2FsbGV0L2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC93ZWIvbGliLmVzbS9fdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3dlYi9saWIuZXNtL2dldHVybC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3dlYi9saWIuZXNtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvd29yZGxpc3RzL2xpYi5lc20vX3ZlcnNpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC93b3JkbGlzdHMvbGliLmVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3dvcmRsaXN0cy9saWIuZXNtL2xhbmctY3ouanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC93b3JkbGlzdHMvbGliLmVzbS9sYW5nLWVuLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvd29yZGxpc3RzL2xpYi5lc20vbGFuZy1lcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3dvcmRsaXN0cy9saWIuZXNtL2xhbmctZnIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC93b3JkbGlzdHMvbGliLmVzbS9sYW5nLWl0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvd29yZGxpc3RzL2xpYi5lc20vbGFuZy1qYS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BldGhlcnNwcm9qZWN0L3dvcmRsaXN0cy9saWIuZXNtL2xhbmcta28uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC93b3JkbGlzdHMvbGliLmVzbS9sYW5nLXpoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGV0aGVyc3Byb2plY3Qvd29yZGxpc3RzL2xpYi5lc20vd29yZGxpc3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZXRoZXJzcHJvamVjdC93b3JkbGlzdHMvbGliLmVzbS93b3JkbGlzdHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZmx1ZW50dWkvcmVhY3QtY29tcG9uZW50LWV2ZW50LWxpc3RlbmVyL2Rpc3QvZXMvRXZlbnRMaXN0ZW5lci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtZXZlbnQtbGlzdGVuZXIvZGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtZXZlbnQtbGlzdGVuZXIvZGlzdC9lcy90eXBlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtZXZlbnQtbGlzdGVuZXIvZGlzdC9lcy91c2VFdmVudExpc3RlbmVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYvZGlzdC9lcy9SZWYuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AZmx1ZW50dWkvcmVhY3QtY29tcG9uZW50LXJlZi9kaXN0L2VzL1JlZkZpbmROb2RlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYvZGlzdC9lcy9SZWZGb3J3YXJkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYvZGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtcmVmL2Rpc3QvZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvY3JlYXRlUG9wcGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9jb250YWlucy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDbGlwcGluZ1JlY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXBvc2l0ZVJlY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRSZWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE5vZGVTY3JvbGwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0UGFyZW50Tm9kZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0U2Nyb2xsUGFyZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFdpbmRvdy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1Njcm9sbFBhcmVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNUYWJsZUVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2xpc3RTY3JvbGxQYXJlbnRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2NvbXB1dGVTdHlsZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL2V2ZW50TGlzdGVuZXJzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvb2Zmc2V0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLWxpdGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvcG9wcGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RlYm91bmNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9mb3JtYXQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2dldEZyZXNoU2lkZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VCeU5hbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3JlY3RUb0NsaWVudFJlY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdW5pcXVlQnkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvd2l0aGluLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvQHNlbWFudGljLXVpLXJlYWN0L2V2ZW50LXN0YWNrL2xpYi9janMvZXZlbnQtc3RhY2suZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9Ac2VtYW50aWMtdWktcmVhY3QvZXZlbnQtc3RhY2svbGliL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvYWVzLWpzL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvYmVjaDMyL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvY2xzeC9kaXN0L2Nsc3gubS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2V0aGVycy9saWIuZXNtL192ZXJzaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvZXRoZXJzL2xpYi5lc20vZXRoZXJzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvZXRoZXJzL2xpYi5lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9ldGhlcnMvbGliLmVzbS91dGlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2V4ZW52L2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvY29tbW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9obWFjLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvaGFzaC5qcy9saWIvaGFzaC9yaXBlbWQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2hhc2guanMvbGliL2hhc2gvc2hhLzEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yMjQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8yNTYuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS8zODQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS81MTIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3NoYS9jb21tb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9oYXNoLmpzL2xpYi9oYXNoL3V0aWxzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2pzLXNoYTMvc3JjL3NoYTMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9rZXlib2FyZC1rZXkvc3JjL2tleWJvYXJkS2V5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19EYXRhVmlldy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fSGFzaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fTGF6eVdyYXBwZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX0xpc3RDYWNoZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fTG9kYXNoV3JhcHBlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fTWFwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19NYXBDYWNoZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fUHJvbWlzZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU2V0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19TZXRDYWNoZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fU3RhY2suanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX1N5bWJvbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fVWludDhBcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fV2Vha01hcC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXBwbHkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5QWdncmVnYXRvci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlFYWNoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUV2ZXJ5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheUZpbHRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlJbmNsdWRlcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXJyYXlJbmNsdWRlc1dpdGguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5TGlrZUtleXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5TWFwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVB1c2guanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FycmF5UmVkdWNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hcnJheVNvbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2FzY2lpU2l6ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXNjaWlUb0FycmF5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hc2NpaVdvcmRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19hc3NpZ25WYWx1ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYXNzb2NJbmRleE9mLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlQWdncmVnYXRvci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUFzc2lnblZhbHVlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlQ2xhbXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VDcmVhdGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VEaWZmZXJlbmNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUV2ZXJ5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRXh0cmVtdW0uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGaWx0ZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGaW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VGbGF0dGVuLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRm9yLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlRm9yT3duLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlR2V0QWxsS2V5cy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUdldFRhZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUhhcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUhhc0luLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSW5SYW5nZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUluZGV4T2YuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJbnRlcnNlY3Rpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJbnZlcnRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUludm9rZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzQXJndW1lbnRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNFcXVhbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzRXF1YWxEZWVwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNNYXRjaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUlzTmFOLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlSXNOYXRpdmUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJc1R5cGVkQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VJdGVyYXRlZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZUtleXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VMb2Rhc2guanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VMdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU1hcC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZU1hdGNoZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VNYXRjaGVzUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VPcmRlckJ5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUGljay5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVBpY2tCeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVByb3BlcnR5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHlEZWVwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUHJvcGVydHlPZi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVJhbmdlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUmVkdWNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlUmVzdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNldERhdGEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VTZXRUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNsaWNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlU29tZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVNvcnRCeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVN1bS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fYmFzZVRpbWVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VUcmltLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVW5hcnkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2Jhc2VVbmlxLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19iYXNlVmFsdWVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FzdEFycmF5TGlrZU9iamVjdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FzdEZ1bmN0aW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jYXN0UGF0aC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY2FzdFNsaWNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jaGFyc0VuZEluZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jaGFyc1N0YXJ0SW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvbXBhcmVBc2NlbmRpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvbXBhcmVNdWx0aXBsZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29tcG9zZUFyZ3MuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvbXBvc2VBcmdzUmlnaHQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NvcHlBcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY29yZUpzRGF0YS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY291bnRIb2xkZXJzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVBZ2dyZWdhdG9yLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVCYXNlRWFjaC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlQmFzZUZvci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlQmluZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlQ2FzZUZpcnN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVDb21wb3VuZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVDdG9yLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVDdXJyeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlRmluZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlSHlicmlkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVJbnZlcnRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlUGFydGlhbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fY3JlYXRlUmFuZ2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZVJlY3VycnkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZVJvdW5kLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19jcmVhdGVTZXQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2NyZWF0ZVdyYXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2RlYnVyckxldHRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZGVmaW5lUHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2VxdWFsQXJyYXlzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19lcXVhbEJ5VGFnLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19lcXVhbE9iamVjdHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2ZsYXRSZXN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19mcmVlR2xvYmFsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRBbGxLZXlzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRBbGxLZXlzSW4uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldERhdGEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldEZ1bmNOYW1lLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRIb2xkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE1hcERhdGEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldE1hdGNoRGF0YS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0TmF0aXZlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0U3ltYm9scy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fZ2V0U3ltYm9sc0luLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRUYWcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2dldFZhbHVlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19nZXRXcmFwRGV0YWlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzUGF0aC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzVW5pY29kZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzVW5pY29kZVdvcmQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2hhc2hDbGVhci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaERlbGV0ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaEdldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaEhhcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faGFzaFNldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faW5zZXJ0V3JhcERldGFpbHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzRmxhdHRlbmFibGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzSW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzSXRlcmF0ZWVDYWxsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0tleS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNLZXlhYmxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc0xhemlhYmxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19pc01hc2tlZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9faXNQcm90b3R5cGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2lzU3RyaWN0Q29tcGFyYWJsZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbGlzdENhY2hlQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZURlbGV0ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbGlzdENhY2hlR2V0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19saXN0Q2FjaGVIYXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX2xpc3RDYWNoZVNldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVDbGVhci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVEZWxldGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcENhY2hlR2V0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tYXBDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbWFwQ2FjaGVTZXQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hcFRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tZW1vaXplQ2FwcGVkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19tZXJnZURhdGEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX21ldGFNYXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX25hdGl2ZUNyZWF0ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlS2V5cy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fbmF0aXZlS2V5c0luLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19ub2RlVXRpbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fb2JqZWN0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX292ZXJBcmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX292ZXJSZXN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19wYXJlbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3JlYWxOYW1lcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fcmVvcmRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fcmVwbGFjZUhvbGRlcnMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldENhY2hlQWRkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zZXRDYWNoZUhhcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2V0RGF0YS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2V0VG9BcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2V0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3NldFdyYXBUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc2hvcnRPdXQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrQ2xlYXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrRGVsZXRlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdGFja0dldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fc3RhY2tIYXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3N0YWNrU2V0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpY3RJbmRleE9mLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdTaXplLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdUb0FycmF5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL19zdHJpbmdUb1BhdGguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3RvS2V5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL190b1NvdXJjZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdHJpbW1lZEVuZEluZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL191bmljb2RlU2l6ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdW5pY29kZVRvQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3VuaWNvZGVXb3Jkcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9fdXBkYXRlV3JhcERldGFpbHMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvX3dyYXBwZXJDbG9uZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jbGFtcC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9jb21wYWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2NvbnN0YW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2RlYnVyci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9kaWZmZXJlbmNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2Ryb3BSaWdodC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9lYWNoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2VxLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2VzY2FwZVJlZ0V4cC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9ldmVyeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZmluZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9maW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZmlyc3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvZmxhdHRlbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9mb3JFYWNoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2dldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9oYXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaGFzSW4uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaGVhZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pZGVudGl0eS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pblJhbmdlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2luY2x1ZGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2ludGVyc2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pbnZlcnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaW52b2tlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJndW1lbnRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQXJyYXkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNBcnJheUxpa2VPYmplY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNCb29sZWFuLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzQnVmZmVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzRW1wdHkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvaXNFcXVhbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTGVuZ3RoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTmlsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzTnVtYmVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1BsYWluT2JqZWN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzU3RyaW5nLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzU3ltYm9sLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9pc1VuZGVmaW5lZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9rZXlCeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9rZXlzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL2tleXNJbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9sYXN0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL21hcC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9tYXBWYWx1ZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbWVtb2l6ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9taW4uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvbm9vcC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9wYXJ0aWFsUmlnaHQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcGljay5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9waWNrQnkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcHJvcGVydHkuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmFuZ2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvcmVkdWNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3JvdW5kLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zaXplLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3NvbWUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc29ydEJ5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0YXJ0Q2FzZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zdGFydHNXaXRoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3N0dWJBcnJheS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy9zdHViRmFsc2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvc3VtLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3Rha2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdGltZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9GaW5pdGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdG9JbnRlZ2VyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvTnVtYmVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RvU3RyaW5nLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3RyYW5zZm9ybS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy90cmltLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbG9kYXNoLWVzL3VuaXEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvdXBwZXJGaXJzdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy92YWx1ZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9sb2Rhc2gtZXMvd2l0aG91dC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy93b3Jkcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL2xvZGFzaC1lcy93cmFwcGVyTG9kYXNoLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvbWluaW1hbGlzdGljLWFzc2VydC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC9wb2x5ZmlsbHMvb2JqZWN0LWFzc2lnbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC93ZWJwYWNrL2xvYWRlcnMvbmV4dC1jbGllbnQtcGFnZXMtbG9hZGVyLmpzIiwid2VicGFjazovL19OX0UvKHdlYnBhY2spL3dlYnBhY2svZ2xvYmFsLmpzIiwid2VicGFjazovL19OX0UvKHdlYnBhY2spL3dlYnBhY2svaGFybW9ueS1tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8od2VicGFjaykvd2VicGFjay9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtZmFzdC1jb21wYXJlL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvY2pzL3JlYWN0LWlzLmRldmVsb3BtZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wb3BwZXIvbGliL2VzbS9NYW5hZ2VyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtcG9wcGVyL2xpYi9lc20vUG9wcGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtcG9wcGVyL2xpYi9lc20vUmVmZXJlbmNlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvcmVhY3QtcG9wcGVyL2xpYi9lc20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wb3BwZXIvbGliL2VzbS91c2VQb3BwZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC1wb3BwZXIvbGliL2VzbS91dGlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1kZXYtcnVudGltZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLXRyYWNpbmcuZGV2ZWxvcG1lbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zY2hlZHVsZXIvY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci90cmFjaW5nLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2NyeXB0LWpzL3NjcnlwdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYWRkb25zL0NvbmZpcm0vQ29uZmlybS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYWRkb25zL0NvbmZpcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9QYWdpbmF0aW9uL1BhZ2luYXRpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9QYWdpbmF0aW9uL1BhZ2luYXRpb25JdGVtLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9hZGRvbnMvUGFnaW5hdGlvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYWRkb25zL1BvcnRhbC9Qb3J0YWwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9Qb3J0YWwvUG9ydGFsSW5uZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9Qb3J0YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9Qb3J0YWwvdXRpbHMvdmFsaWRhdGVUcmlnZ2VyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9hZGRvbnMvUmFkaW8vUmFkaW8uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9SYWRpby9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYWRkb25zL1NlbGVjdC9TZWxlY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9TZWxlY3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9UZXh0QXJlYS9UZXh0QXJlYS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYWRkb25zL1RleHRBcmVhL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9hZGRvbnMvVHJhbnNpdGlvbmFibGVQb3J0YWwvVHJhbnNpdGlvbmFibGVQb3J0YWwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2FkZG9ucy9UcmFuc2l0aW9uYWJsZVBvcnRhbC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYmVoYXZpb3JzL1Zpc2liaWxpdHkvVmlzaWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvYmVoYXZpb3JzL1Zpc2liaWxpdHkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0JyZWFkY3J1bWIvQnJlYWRjcnVtYi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvQnJlYWRjcnVtYi9CcmVhZGNydW1iRGl2aWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvQnJlYWRjcnVtYi9CcmVhZGNydW1iU2VjdGlvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvQnJlYWRjcnVtYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvRm9ybS9Gb3JtLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1CdXR0b24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0Zvcm0vRm9ybUNoZWNrYm94LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1Ecm9wZG93bi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvRm9ybS9Gb3JtRmllbGQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0Zvcm0vRm9ybUdyb3VwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1JbnB1dC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvRm9ybS9Gb3JtUmFkaW8uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0Zvcm0vRm9ybVNlbGVjdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvRm9ybS9Gb3JtVGV4dEFyZWEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0Zvcm0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0dyaWQvR3JpZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvR3JpZC9HcmlkQ29sdW1uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9HcmlkL0dyaWRSb3cuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL0dyaWQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL01lbnUvTWVudS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvTWVudS9NZW51SGVhZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9NZW51L01lbnVJdGVtLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9NZW51L01lbnVNZW51LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9NZW51L2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9NZXNzYWdlL01lc3NhZ2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL01lc3NhZ2UvTWVzc2FnZUNvbnRlbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL01lc3NhZ2UvTWVzc2FnZUhlYWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvTWVzc2FnZS9NZXNzYWdlSXRlbS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvTWVzc2FnZS9NZXNzYWdlTGlzdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvTWVzc2FnZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvVGFibGUvVGFibGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL1RhYmxlL1RhYmxlQm9keS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvVGFibGUvVGFibGVDZWxsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9jb2xsZWN0aW9ucy9UYWJsZS9UYWJsZUZvb3Rlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvVGFibGUvVGFibGVIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL1RhYmxlL1RhYmxlSGVhZGVyQ2VsbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvY29sbGVjdGlvbnMvVGFibGUvVGFibGVSb3cuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2NvbGxlY3Rpb25zL1RhYmxlL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9CdXR0b24vQnV0dG9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9CdXR0b24vQnV0dG9uQ29udGVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvQnV0dG9uL0J1dHRvbkdyb3VwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9CdXR0b24vQnV0dG9uT3IuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0J1dHRvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvQ29udGFpbmVyL0NvbnRhaW5lci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvQ29udGFpbmVyL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9EaXZpZGVyL0RpdmlkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0RpdmlkZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0ZsYWcvRmxhZy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvRmxhZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvSGVhZGVyL0hlYWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvSGVhZGVyL0hlYWRlckNvbnRlbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0hlYWRlci9IZWFkZXJTdWJoZWFkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0hlYWRlci9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvSWNvbi9JY29uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9JY29uL0ljb25Hcm91cC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvSWNvbi9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvSW1hZ2UvSW1hZ2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0ltYWdlL0ltYWdlR3JvdXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0ltYWdlL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9JbnB1dC9JbnB1dC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvSW5wdXQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0xhYmVsL0xhYmVsLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9MYWJlbC9MYWJlbERldGFpbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGFiZWwvTGFiZWxHcm91cC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGFiZWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0xpc3QvTGlzdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGlzdC9MaXN0Q29udGVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGlzdC9MaXN0RGVzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL0xpc3QvTGlzdEhlYWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGlzdC9MaXN0SWNvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGlzdC9MaXN0SXRlbS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGlzdC9MaXN0TGlzdC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTGlzdC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTG9hZGVyL0xvYWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvTG9hZGVyL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9QbGFjZWhvbGRlci9QbGFjZWhvbGRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvUGxhY2Vob2xkZXIvUGxhY2Vob2xkZXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1BsYWNlaG9sZGVyL1BsYWNlaG9sZGVySW1hZ2UuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1BsYWNlaG9sZGVyL1BsYWNlaG9sZGVyTGluZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvUGxhY2Vob2xkZXIvUGxhY2Vob2xkZXJQYXJhZ3JhcGguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1BsYWNlaG9sZGVyL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9SYWlsL1JhaWwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1JhaWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1JldmVhbC9SZXZlYWwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1JldmVhbC9SZXZlYWxDb250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9SZXZlYWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1NlZ21lbnQvU2VnbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvU2VnbWVudC9TZWdtZW50R3JvdXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1NlZ21lbnQvU2VnbWVudElubGluZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvU2VnbWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvU3RlcC9TdGVwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9TdGVwL1N0ZXBDb250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9TdGVwL1N0ZXBEZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvZWxlbWVudHMvU3RlcC9TdGVwR3JvdXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2VsZW1lbnRzL1N0ZXAvU3RlcFRpdGxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9lbGVtZW50cy9TdGVwL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL01vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvU1VJLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvY2hpbGRyZW5VdGlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2NsYXNzTmFtZUJ1aWxkZXJzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvY3JlYXRlUGFnaW5hdGlvbkl0ZW1zL2NyZWF0ZVBhZ2luYXRpb25JdGVtcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2NyZWF0ZVBhZ2luYXRpb25JdGVtcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2NyZWF0ZVBhZ2luYXRpb25JdGVtcy9pdGVtRmFjdG9yaWVzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvY3JlYXRlUGFnaW5hdGlvbkl0ZW1zL3BhZ2luYXRpb25VdGlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2NyZWF0ZVBhZ2luYXRpb25JdGVtcy9yYW5nZUZhY3Rvcmllcy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2NyZWF0ZVBhZ2luYXRpb25JdGVtcy9zdWZmaXhGYWN0b3JpZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9jdXN0b21Qcm9wVHlwZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9kb2VzTm9kZUNvbnRhaW5DbGljay5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2V2ZW50U3RhY2svaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9mYWN0b3JpZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9nZXRFbGVtZW50VHlwZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2dldFVuaGFuZGxlZFByb3BzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvaG9va3MvdXNlQ2xhc3NOYW1lc09uTm9kZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2hvb2tzL3VzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9odG1sUHJvcHNVdGlscy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbGliL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvaXNCcm93c2VyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9saWIvbGV2ZW4uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9ub3JtYWxpemVPZmZzZXQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9ub3JtYWxpemVUcmFuc2l0aW9uRHVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9udW1iZXJUb1dvcmQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL2xpYi9vYmplY3REaWZmLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0FjY29yZGlvbi9BY2NvcmRpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvQWNjb3JkaW9uL0FjY29yZGlvbkFjY29yZGlvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9BY2NvcmRpb24vQWNjb3JkaW9uQ29udGVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9BY2NvcmRpb24vQWNjb3JkaW9uUGFuZWwuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvQWNjb3JkaW9uL0FjY29yZGlvblRpdGxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0NoZWNrYm94L0NoZWNrYm94LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0NoZWNrYm94L2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0RpbW1lci9EaW1tZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRGltbWVyL0RpbW1lckRpbW1hYmxlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0RpbW1lci9EaW1tZXJJbm5lci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9EaW1tZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRHJvcGRvd24vRHJvcGRvd24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRHJvcGRvd24vRHJvcGRvd25EaXZpZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0Ryb3Bkb3duL0Ryb3Bkb3duSGVhZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL0Ryb3Bkb3duL0Ryb3Bkb3duSXRlbS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9Ecm9wZG93bi9Ecm9wZG93bk1lbnUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRHJvcGRvd24vRHJvcGRvd25TZWFyY2hJbnB1dC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9Ecm9wZG93bi9Ecm9wZG93blRleHQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRHJvcGRvd24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRHJvcGRvd24vdXRpbHMvZ2V0TWVudU9wdGlvbnMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvRHJvcGRvd24vdXRpbHMvZ2V0U2VsZWN0ZWRJbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9FbWJlZC9FbWJlZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9FbWJlZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9Nb2RhbC9Nb2RhbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9Nb2RhbC9Nb2RhbEFjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvTW9kYWwvTW9kYWxDb250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL01vZGFsL01vZGFsRGVzY3JpcHRpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvTW9kYWwvTW9kYWxEaW1tZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvTW9kYWwvTW9kYWxIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvTW9kYWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvTW9kYWwvdXRpbHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvUG9wdXAvUG9wdXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvUG9wdXAvUG9wdXBDb250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1BvcHVwL1BvcHVwSGVhZGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1BvcHVwL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1BvcHVwL2xpYi9jcmVhdGVSZWZlcmVuY2VQcm94eS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9Qb3B1cC9saWIvcG9zaXRpb25zLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1Byb2dyZXNzL1Byb2dyZXNzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1Byb2dyZXNzL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1JhdGluZy9SYXRpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvUmF0aW5nL1JhdGluZ0ljb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvUmF0aW5nL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1NlYXJjaC9TZWFyY2guanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvU2VhcmNoL1NlYXJjaENhdGVnb3J5LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1NlYXJjaC9TZWFyY2hDYXRlZ29yeUxheW91dC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9TZWFyY2gvU2VhcmNoUmVzdWx0LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1NlYXJjaC9TZWFyY2hSZXN1bHRzLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1NlYXJjaC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9TaWRlYmFyL1NpZGViYXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvU2lkZWJhci9TaWRlYmFyUHVzaGFibGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvU2lkZWJhci9TaWRlYmFyUHVzaGVyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1NpZGViYXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvU3RpY2t5L1N0aWNreS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9TdGlja3kvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvVGFiL1RhYi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9UYWIvVGFiUGFuZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvbW9kdWxlcy9UYWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvVHJhbnNpdGlvbi9UcmFuc2l0aW9uLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1RyYW5zaXRpb24vVHJhbnNpdGlvbkdyb3VwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy9tb2R1bGVzL1RyYW5zaXRpb24vaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvVHJhbnNpdGlvbi91dGlscy9jaGlsZE1hcHBpbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvVHJhbnNpdGlvbi91dGlscy9jb21wdXRlU3RhdHVzZXMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL21vZHVsZXMvVHJhbnNpdGlvbi91dGlscy93cmFwQ2hpbGQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0FkdmVydGlzZW1lbnQvQWR2ZXJ0aXNlbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQWR2ZXJ0aXNlbWVudC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQ2FyZC9DYXJkLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9DYXJkL0NhcmRDb250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9DYXJkL0NhcmREZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQ2FyZC9DYXJkR3JvdXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0NhcmQvQ2FyZEhlYWRlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQ2FyZC9DYXJkTWV0YS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQ29tbWVudC9Db21tZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9Db21tZW50L0NvbW1lbnRBY3Rpb24uanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0NvbW1lbnQvQ29tbWVudEFjdGlvbnMuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0NvbW1lbnQvQ29tbWVudEF1dGhvci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQ29tbWVudC9Db21tZW50QXZhdGFyLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9Db21tZW50L0NvbW1lbnRDb250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9Db21tZW50L0NvbW1lbnRHcm91cC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvQ29tbWVudC9Db21tZW50TWV0YWRhdGEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0NvbW1lbnQvQ29tbWVudFRleHQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0NvbW1lbnQvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0ZlZWQvRmVlZC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkQ29udGVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkRGF0ZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkRXZlbnQuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0ZlZWQvRmVlZEV4dHJhLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9GZWVkL0ZlZWRMYWJlbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkTGlrZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkTWV0YS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkU3VtbWFyeS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9GZWVkVXNlci5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvRmVlZC9pbmRleC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvSXRlbS9JdGVtLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9JdGVtL0l0ZW1Db250ZW50LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9JdGVtL0l0ZW1EZXNjcmlwdGlvbi5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvSXRlbS9JdGVtRXh0cmEuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0l0ZW0vSXRlbUdyb3VwLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9JdGVtL0l0ZW1IZWFkZXIuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL0l0ZW0vSXRlbUltYWdlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9JdGVtL0l0ZW1NZXRhLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9JdGVtL2luZGV4LmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9TdGF0aXN0aWMvU3RhdGlzdGljLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9TdGF0aXN0aWMvU3RhdGlzdGljR3JvdXAuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zZW1hbnRpYy11aS1yZWFjdC9kaXN0L2VzL3ZpZXdzL1N0YXRpc3RpYy9TdGF0aXN0aWNMYWJlbC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3NlbWFudGljLXVpLXJlYWN0L2Rpc3QvZXMvdmlld3MvU3RhdGlzdGljL1N0YXRpc3RpY1ZhbHVlLmpzIiwid2VicGFjazovL19OX0UvLi9ub2RlX21vZHVsZXMvc2VtYW50aWMtdWktcmVhY3QvZGlzdC9lcy92aWV3cy9TdGF0aXN0aWMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy9zaGFsbG93ZXF1YWwvaW5kZXguanMiLCJ3ZWJwYWNrOi8vX05fRS8uL25vZGVfbW9kdWxlcy93YXJuaW5nL3dhcm5pbmcuanMiLCJ3ZWJwYWNrOi8vX05fRS8uL3NyYy9wYWdlcy9pbmRleC50c3giLCJ3ZWJwYWNrOi8vX05fRS8uL3NyYy91dGlsL2luZGV4LnRzIiwid2VicGFjazovL19OX0UvYnVmZmVyIChpZ25vcmVkKSJdLCJuYW1lcyI6WyJIb21lIiwiY29udHJhY3RBZGRyZXNzIiwidXNlU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidG91Y2hlZCIsInNldFRvdWNoZWQiLCJpc1ZhbGlkIiwic2V0SXNWYWxpZCIsImNvbnRyYWN0QmFsYW5jZSIsInNldENvbnRyYWN0QmFsYW5jZSIsInVzZUVmZmVjdCIsInZlcmlmeUV0aEFkZHJlc3MiLCJvblN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlcXVlc3RGdW5kcyIsImdldENvbnRyYWN0QmFsYW5jZSIsIndpbmRvdyIsImV0aGVyZXVtIiwicHJvdmlkZXIiLCJldGhlcnMiLCJwcm92aWRlcnMiLCJXZWIzUHJvdmlkZXIiLCJnZXRCYWxhbmNlIiwidG9TdHJpbmciLCJyZXF1ZXN0IiwibWV0aG9kIiwic2lnbmVyIiwiZ2V0U2lnbmVyIiwiY29udHJhY3QiLCJDb250cmFjdCIsIkZhdWNldCIsImFiaSIsIndpdGhkcmF3IiwiY29uc29sZSIsImxvZyIsInVuZGVmaW5lZCIsInRoZW4iLCJiYWwiLCJ0YXJnZXQiLCJwYXJzZUludCIsIk1hdGgiLCJwb3ciLCJhZGRyZXNzIiwicmVnZXgiLCJ0ZXN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ05BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtB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QUFrQjtBQUNuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDZCQUE2QixrQkFBa0I7QUFDakU7QUFDQSxtQkFBbUIsa0JBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixrREFBa0Qsa0JBQWtCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdGQUFjO0FBQ3RCO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDTztBQUNQO0FBQ0E7QUFDQSxnREFBZ0QsNERBQU07QUFDdEQ7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSwwREFBMEQsNERBQU07QUFDaEU7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0VBQVM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx5RUFBeUUsNERBQU07QUFDL0U7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGtFQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGtFQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsa0JBQWtCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNPO0FBQ1Asa0RBQWtELGlCQUFpQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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ZSxnQkFBZ0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLGdCQUFnQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsZ0JBQWdCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDNVBBO0FBQUE7QUFBTztBQUNQLG9DOzs7Ozs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBdUI7QUFDSTs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLGlCQUFpQixZQUFZO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQSxHQUFHO0FBQ0gsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYSw0Q0FBRTtBQUNmO0FBQ0E7QUFDQSxDQUFDOztBQUVEOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLDRDQUFFOztBQUVqQjtBQUNBLDBCQUEwQiw0Q0FBRSxtQkFBbUIsNENBQUU7O0FBRWpEO0FBQ0Esa0JBQWtCLDRDQUFFO0FBQ3BCLGlCQUFpQiw0Q0FBRTtBQUNuQixpQkFBaUIsNENBQUU7O0FBRW5CO0FBQ0EseUJBQXlCLDRDQUFFO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBLHNDQUFzQyxRQUFRO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLE9BQU87QUFDeEIsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw4QkFBOEIsUUFBUTtBQUN0QztBQUNBLG1CQUFtQix3QkFBd0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxTQUFTO0FBQ3hCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGVBQWUsU0FBUztBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsV0FBVztBQUM1QixtQkFBbUIsVUFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsU0FBUztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsT0FBTztBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxVQUFVLDRDQUFFOztBQUVaO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBOzs7Ozs7QUFNQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDhDQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDhDQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLDhDQUFJO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsOENBQUk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4Q0FBSTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZUFBZSw0Q0FBRTtBQUNqQixlQUFlLDRDQUFFO0FBQ2pCOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7QUFNQSwwREFBMEQsZ0NBQWdDLEVBQUU7QUFDNUY7Ozs7O0FBS0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGVBQWU7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLDJCQUEyQiw0Q0FBRTtBQUM3QixTQUFTO0FBQ1QsbUJBQW1CLDRDQUFFO0FBQ3JCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLDRDQUFFOztBQUVoQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSwyQkFBMkIsNENBQUU7O0FBRTdCLG9CQUFvQixFQUFFO0FBQ3RCO0FBQ0E7QUFDQSxVQUFVLDRDQUFFO0FBQ1o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLDJDQUEyQztBQUNyRTtBQUNBOztBQUVBO0FBQ0EsOEJBQThCLDRDQUFFO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsY0FBYyw0Q0FBRTtBQUNoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLE9BQU87QUFDeEI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHFDQUFxQyxtQkFBbUI7QUFDeEQ7QUFDQSwrREFBK0QsZ0NBQWdDLEVBQUU7QUFDakc7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVzQjtBQUN0Qjs7Ozs7Ozs7Ozs7Ozs7QUM3NkVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFhO0FBQ21CO0FBQ3FEO0FBQzFCO0FBQ1o7QUFDVjtBQUNyQyxtQkFBbUIsNERBQU0sQ0FBQyxnREFBTztBQUNqQztBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsNENBQUU7QUFDdkI7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLFFBQVEsZ0ZBQWM7QUFDdEIsUUFBUSxnRkFBYyxxQkFBcUIsb0VBQU87QUFDbEQsa0RBQWtELHFFQUFRO0FBQzFELFFBQVEsZ0ZBQWM7QUFDdEIsUUFBUSxnRkFBYztBQUN0QixRQUFRLGdGQUFjO0FBQ3RCO0FBQ0E7QUFDQSw0Q0FBNEMscUVBQVE7QUFDcEQsNENBQTRDLHFFQUFRO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxxRUFBUTtBQUMxRCw0QkFBNEIscUVBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0EscURBQXFELGtCQUFrQjtBQUN2RSxlQUFlLDJFQUFjO0FBQzdCO0FBQ0EsZUFBZSx1RUFBVTtBQUN6QixlQUFlLHVFQUFVO0FBQ3pCLFNBQVM7QUFDVDtBQUNBO0FBQ0Esa0RBQWtELHFFQUFRO0FBQzFELHNEQUFzRCxxRUFBUTtBQUM5RCxlQUFlLHVFQUFVO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLGdCQUFnQiwyRUFBYztBQUM5QixnQkFBZ0IsSUFBSSxxRUFBUSxZQUFZLHFFQUFRO0FBQ2hELDJDQUEyQyxxRUFBUTtBQUNuRDtBQUNPO0FBQ1Asa0JBQWtCLHFFQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixvRUFBTztBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG9FQUFPO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQzs7Ozs7Ozs7Ozs7O0FDOUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFhO0FBQ3dDO0FBQ3FCO0FBQ0o7QUFDWDtBQUNOO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsb0VBQU87QUFDOUI7QUFDQSxtQkFBbUIscUVBQVE7QUFDM0I7QUFDQSxtQkFBbUIsMEVBQVc7QUFDOUI7QUFDQSxtQkFBbUIscUVBQVE7QUFDM0I7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG9FQUFPO0FBQzlCO0FBQ0EsbUJBQW1CLHFFQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0VBQVM7QUFDekIsZUFBZSxvRUFBTztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUVBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFFQUFRO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGVBQWUsbUVBQU07QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxXQUFXLG9FQUFPLENBQUMsbUVBQU07QUFDekI7QUFDTztBQUNQLFdBQVcsMEVBQWE7QUFDeEI7QUFDTztBQUNQLFdBQVcsa0VBQVU7QUFDckI7QUFDQSxpQzs7Ozs7Ozs7Ozs7O0FDdkZBO0FBQUE7QUFBTztBQUNQLG9DOzs7Ozs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUN1QztBQUNhO0FBQ2Q7QUFDNUM7QUFDUDtBQUNBLGtCQUFrQix5REFBVztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxvRUFBTyxDQUFDLG1FQUFNLFNBQVMsaUVBQVE7QUFDMUM7QUFDTztBQUNQLGlCQUFpQixxRUFBUTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsMERBQVk7QUFDdkI7QUFDQSxtQzs7Ozs7Ozs7Ozs7O0FDL0JBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFhO0FBQ3NFO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw4QkFBOEI7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLG1CQUFtQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLHNCQUFzQjtBQUMzQixLQUFLLGdDQUFnQztBQUNyQyxLQUFLLG9DQUFvQztBQUN6QyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLHlDQUF5QztBQUM5QyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDRDQUE0QztBQUNqRCxLQUFLLGdDQUFnQztBQUNyQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLHNCQUFzQjtBQUMzQixLQUFLLHNCQUFzQjtBQUMzQixLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLG9DQUFvQztBQUN6QyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLHNCQUFzQjtBQUMzQixLQUFLLDhCQUE4QjtBQUNuQyxLQUFLLDRCQUE0QjtBQUNqQyxLQUFLLHVCQUF1QjtBQUM1QixLQUFLLHVCQUF1QjtBQUM1QixLQUFLLHlCQUF5QjtBQUM5QixLQUFLLHdCQUF3QjtBQUM3QixLQUFLLDhCQUE4QjtBQUNuQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJEQUEyRDtBQUNoRSxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDZDQUE2QztBQUNsRCxLQUFLLHNEQUFzRDtBQUMzRCxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLDJCQUEyQjtBQUNoQyxLQUFLLG9DQUFvQztBQUN6QyxLQUFLLG9DQUFvQztBQUN6QyxLQUFLLG9DQUFvQztBQUN6QyxLQUFLLG9DQUFvQztBQUN6QyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsbUJBQW1CLEVBQUU7QUFDdkQ7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsOERBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLFlBQVksOERBQWdCLENBQUMsMkRBQWEsU0FBUyw4REFBd0I7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZUFBZSwyREFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDOzs7Ozs7Ozs7Ozs7QUMzTEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWE7QUFDdUQ7QUFDbEM7QUFDb0g7QUFDcUM7QUFDM0wsaUM7Ozs7Ozs7Ozs7OztBQ0xBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFhO0FBQ21DO0FBQ0Q7QUFDVjtBQUNyQyxtQkFBbUIsNERBQU0sQ0FBQyxnREFBTztBQUNqQztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0REFBNEQ7QUFDN0Q7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0EsQ0FBQywwQ0FBMEM7QUFDM0M7QUFDQTtBQUNBLG9FQUFvRSxRQUFRLEdBQUcsT0FBTztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGtCQUFrQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFFQUFRO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxxRUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxnQzs7Ozs7Ozs7Ozs7O0FDdlBBO0FBQUE7QUFBTztBQUNQLG9DOzs7Ozs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUN1QztBQUNDO0FBQ3dFO0FBQzdFO0FBQ0s7QUFDTztBQUNsQjtBQUNzQztBQUNqQztBQUNWO0FBQ3JDLG1CQUFtQiw0REFBTSxDQUFDLGdEQUFPO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHlFQUFVO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkRBQUk7QUFDbkI7QUFDQSxXQUFXLGtFQUFTO0FBQ3BCO0FBQ0E7QUFDQSxLQUFLLDhDQUE4QztBQUNuRCxLQUFLLGlEQUFpRDtBQUN0RCxLQUFLLGlEQUFpRDtBQUN0RCxLQUFLLHlCQUF5QjtBQUM5QixLQUFLLDhDQUE4QztBQUNuRCxLQUFLLGVBQWU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLHNCQUFzQixtRkFBZ0I7QUFDdEMsV0FBVyx5RUFBVSxDQUFDLHlFQUFZLENBQUMsMEVBQVMsQ0FBQyx5RUFBWTtBQUN6RDtBQUNPO0FBQ1AsMEJBQTBCLG1GQUFnQixDQUFDLHFFQUFRO0FBQ25EO0FBQ087QUFDUCxJQUFJLGlGQUFlO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFFQUFRLENBQUMsb0VBQU87QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVFQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG9FQUFPO0FBQ3hCLEtBQUs7QUFDTDtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsd0VBQVc7QUFDdEMsMEVBQTBFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLG9FQUFPLFdBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUseURBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLDJFQUFjO0FBQzlCLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLG9FQUFPO0FBQ3BCLGFBQWEsdUVBQVUsQ0FBQyxxRUFBUTtBQUNoQyxhQUFhLHVFQUFVLENBQUMscUVBQVE7QUFDaEMsV0FBVyx5REFBVTtBQUNyQjtBQUNPO0FBQ1Asd0JBQXdCLHlEQUFVO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGtFQUFTO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVFQUFVO0FBQ3JCLFdBQVcsdUVBQVU7QUFDckIsUUFBUSxrRUFBUyx3QkFBd0Isa0VBQVM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsb0VBQU87QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsMEVBQVMsQ0FBQyx5REFBVTtBQUMzQztBQUNBLDhDQUE4QyxJQUFJLG9FQUFPLFdBQVcsb0VBQU8sc0NBQXNDO0FBQ2pIO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLDBFQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLGlDOzs7Ozs7Ozs7Ozs7QUN4S0E7QUFBQTtBQUFPO0FBQ1Asb0M7Ozs7Ozs7Ozs7OztBQ0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFhO0FBQ3NEO0FBQ3BCO0FBQ1Y7QUFDckMsbUJBQW1CLDREQUFNLENBQUMsZ0RBQU87QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDRFQUFXO0FBQ3RCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDJFQUFVO0FBQ3JCO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsaUM7Ozs7Ozs7Ozs7OztBQ25GQTtBQUFBO0FBQU87QUFDUCxvQzs7Ozs7Ozs7Ozs7O0FDREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWE7QUFDYixpQkFBaUIsU0FBSSxJQUFJLFNBQUk7QUFDN0IsMkJBQTJCLCtEQUErRCxnQkFBZ0IsRUFBRSxFQUFFO0FBQzlHO0FBQ0EsbUNBQW1DLE1BQU0sNkJBQTZCLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDakcsa0NBQWtDLE1BQU0saUNBQWlDLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFDcEcsK0JBQStCLHFGQUFxRjtBQUNwSDtBQUNBLEtBQUs7QUFDTDtBQUNvRDtBQUNRO0FBQ0o7QUFDMEM7QUFDN0I7QUFDVTtBQUMxQjtBQUN5QjtBQUMxQjtBQUNJO0FBQ2dEO0FBQ2hCO0FBQ3pDO0FBQ1Y7QUFDckMsbUJBQW1CLDZEQUFNLENBQUMsaURBQU87QUFDakM7QUFDQSw2QkFBNkIsd0VBQVc7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHFCQUFxQixxRUFBTTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQyxxRUFBVTtBQUM3QyxZQUFZLGdGQUFjO0FBQzFCLFlBQVksZ0ZBQWMsa0JBQWtCLG1GQUFjO0FBQzFELGlDQUFpQyx5RUFBVTtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixnRkFBYztBQUM5QjtBQUNBLDhDQUE4QyxpRUFBVztBQUN6RDtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLDZCQUE2Qiw0REFBTTtBQUNuQyxvQkFBb0IsbUZBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0ZBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHFFQUFVO0FBQzFCO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQSxnQkFBZ0IsZ0ZBQWM7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxxRUFBVTtBQUNqRCxnQkFBZ0IsZ0ZBQWM7QUFDOUI7QUFDQSxZQUFZLGdGQUFjO0FBQzFCLFlBQVksZ0ZBQWMsa0JBQWtCLG1GQUFjO0FBQzFEO0FBQ0E7QUFDQSx5QkFBeUIseUVBQVE7QUFDakM7QUFDQTtBQUNBLFFBQVEsZ0ZBQWM7QUFDdEI7QUFDQSxvQkFBb0IseUJBQXlCO0FBQzdDLHNCQUFzQixzQ0FBc0M7QUFDNUQscUJBQXFCLHFDQUFxQztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsbUZBQWlCO0FBQ2hDO0FBQ0Esb0JBQW9CLHlFQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELDBFQUFTLENBQUMsOEVBQVM7QUFDL0UsbUJBQW1CLDhFQUFTO0FBQzVCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMEVBQWEsK0JBQStCLHVFQUFXO0FBQzFFLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxxRUFBaUI7QUFDckQ7QUFDQSxxRkFBcUYsNkRBQU07QUFDM0Y7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLG1CQUFtQiwwRUFBYSwrQkFBK0IscUVBQWlCO0FBQ2hGLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG9GQUFlO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IseUVBQVc7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IscUVBQVEsQ0FBQyx5RUFBWSxDQUFDLDBFQUFTLENBQUMsbUVBQU07QUFDNUQ7QUFDQSx5QkFBeUIsK0VBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGVBQWUsc0ZBQWlCO0FBQ2hDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSwwQkFBMEIsMEZBQXFCO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpRUFBVztBQUM5QjtBQUNBLDBCQUEwQiw0REFBTTtBQUNoQztBQUNBO0FBQ087QUFDUCxXQUFXLG1GQUFjLENBQUMsdUVBQVc7QUFDckM7QUFDTztBQUNQLFdBQVcsbUZBQWMsQ0FBQyxxRUFBaUI7QUFDM0M7QUFDQSxpQzs7Ozs7Ozs7Ozs7O0FDaExBO0FBQUE7QUFBTztBQUNQLG9DOzs7Ozs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBYTtBQUNiLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3QiwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQ2dEO0FBQ3pDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IscUVBQVE7QUFDMUI7QUFDQSxLQUFLO0FBQ0w7QUFDQSxrQzs7Ozs7Ozs7Ozs7O0FDL0NBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUNiLGlCQUFpQixTQUFJLElBQUksU0FBSTtBQUM3QiwyQkFBMkIsK0RBQStELGdCQUFnQixFQUFFLEVBQUU7QUFDOUc7QUFDQSxtQ0FBbUMsTUFBTSw2QkFBNkIsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNqRyxrQ0FBa0MsTUFBTSxpQ0FBaUMsRUFBRSxZQUFZLFdBQVcsRUFBRTtBQUNwRywrQkFBK0IscUZBQXFGO0FBQ3BIO0FBQ0EsS0FBSztBQUNMO0FBQytEO0FBQ0g7QUFDSjtBQUNXO0FBQ3BCO0FBQ1Y7QUFDckMsbUJBQW1CLDREQUFNLENBQUMsZ0RBQU87QUFDQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsd0VBQVc7QUFDbkIsbUVBQW1FO0FBQ25FO0FBQ0EsdUJBQXVCLDJFQUFZO0FBQ25DO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQSxlQUFlLG9FQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0ZBQXNGLDREQUFNLDJCQUEyQiwyRUFBMkU7QUFDbE07QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msb0VBQVksQ0FBQywwRUFBVztBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCw0REFBTTtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEIsS0FBSztBQUNMO0FBQ0E7QUFDQSxpQ0FBaUMsd0JBQXdCO0FBQ3pEO0FBQ0E7QUFDQSxxQ0FBcUMsc0RBQU07QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4REFBOEQsNERBQU07QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCw0REFBTTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUUsNERBQU07QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCw0REFBTTtBQUM5RDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywyRUFBWTtBQUNoRDtBQUNBO0FBQ0Esa0RBQWtELDREQUFNO0FBQ3hEO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwRUFBVztBQUMxQjtBQUNBLCtEQUErRCxrQkFBa0IsSUFBSSw2RUFBVztBQUNoRztBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsNkVBQVc7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsY0FBYyw2RUFBVztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxpQzs7Ozs7Ozs7Ozs7O0FDbldBO0FBQUE7QUFBTztBQUNQLG9DOzs7Ozs7Ozs7Ozs7QUNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUNiO0FBQ0E7QUFDOEM7QUFDTjtBQUNEO0FBQ3ZDLGlDOzs7Ozs7Ozs7Ozs7QUNOQTtBQUFBO0FBQUE7QUFBYTtBQUN5QjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtEQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQVE7QUFDVTtBQUNsQixtQzs7Ozs7Ozs7Ozs7O0FDaENBO0FBQUE7QUFBQTtBQUFhO0FBQ3lCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0RBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBUTtBQUNVO0FBQ2xCLG1DOzs7Ozs7Ozs7Ozs7QUNoQ0E7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUNzRDtBQUNyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQU07QUFDVixXQUFXLDJFQUFZLDZCQUE2QiwwRUFBVztBQUMvRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEVBQVc7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxXQUFXLDJFQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFFBQVEsa0RBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0RBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBUTtBQUNVO0FBQ2xCLG1DOzs7Ozs7Ozs7Ozs7QUMvREE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUNzRDtBQUNyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0RBQU07QUFDVixXQUFXLDJFQUFZLDZCQUE2QiwwRUFBVztBQUMvRDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsMEVBQVc7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsV0FBVywyRUFBWTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxRQUFRLGtEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtEQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQVE7QUFDVTtBQUNsQixtQzs7Ozs7Ozs7Ozs7O0FDOURBO0FBQUE7QUFBQTtBQUFhO0FBQ3lCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsa0RBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBUTtBQUNVO0FBQ2xCLG1DOzs7Ozs7Ozs7Ozs7QUNoQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFhO0FBQ2tDO0FBQ29CO0FBQ3JCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLG9FQUFPLENBQUMsMEVBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMkVBQVk7QUFDMUIsY0FBYywyRUFBWTtBQUMxQjtBQUNBLGNBQWMsMkVBQVkscUJBQXFCLDJFQUFZO0FBQzNELGNBQWMsMkVBQVkscUJBQXFCLDJFQUFZO0FBQzNELGNBQWMsMkVBQVkscUJBQXFCLDJFQUFZO0FBQzNELGNBQWMsMkVBQVkscUJBQXFCLDJFQUFZO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsYUFBYTtBQUNyQztBQUNBLDRCQUE0QixtQkFBbUI7QUFDL0M7QUFDQSwyQkFBMkIsWUFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDJFQUFZO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrREFBUTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixrREFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBUTtBQUNVO0FBQ2xCLG1DOzs7Ozs7Ozs7Ozs7QUMvSEE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUN5QztBQUNoQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDJFQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixpQkFBaUI7QUFDeEM7QUFDQSwyQkFBMkIsWUFBWTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtEQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQVE7QUFDVTtBQUNsQixtQzs7Ozs7Ozs7Ozs7O0FDL0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYTtBQUN5QztBQUNoQjtBQUN0QyxlQUFlLGtFQUFrRSxNQUFNLHFFQUFxRSwrREFBK0QsdUNBQXVDLFNBQVMsOEVBQThFLFNBQVMsd0JBQXdCLGVBQWUsc0RBQXNELHdCQUF3QixNQUFNLG1EQUFtRCxrQkFBa0IscUJBQXFCLFNBQVMsbURBQW1ELE1BQU0sR0FBRyxxQkFBcUIsOEJBQThCLEdBQUcsU0FBUyxHQUFHLHFCQUFxQixzR0FBc0csR0FBRywyRUFBMkUsZUFBZSxTQUFTLDJCQUEyQix3QkFBd0IsTUFBTSxlQUFlLGVBQWUsR0FBRyxvQ0FBb0MsZUFBZSxHQUFHLE1BQU0sd0JBQXdCLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxrQkFBa0Isa0JBQWtCLHdFQUF3RSxrQkFBa0IsMkVBQTJFLFNBQVMsc0RBQXNELEdBQUcsZUFBZSxTQUFTLHdCQUF3QixlQUFlLE1BQU0sWUFBWSxrQkFBa0IsOEJBQThCLEdBQUcsWUFBWSxrQkFBa0IsR0FBRyxHQUFHLEdBQUcsb0NBQW9DLDhCQUE4QixHQUFHLHVGQUF1RixNQUFNLFlBQVksZUFBZSxNQUFNLDBDQUEwQyxTQUFTLEdBQUcsMkJBQTJCLGlDQUFpQyxlQUFlLCtEQUErRCxrQkFBa0IsU0FBUyxHQUFHLEdBQUcsc0RBQXNELHFCQUFxQixZQUFZLGVBQWUsU0FBUyxNQUFNLE1BQU0sb0NBQW9DLG9DQUFvQyxrQkFBa0IsR0FBRyxpQ0FBaUMsMENBQTBDLHdCQUF3Qix3QkFBd0IsdUNBQXVDLHdCQUF3Qix3QkFBd0IsR0FBRyxpQ0FBaUMsZUFBZSw4QkFBOEIsR0FBRyxHQUFHLE1BQU0sTUFBTSxHQUFHLFNBQVMsU0FBUyxNQUFNLEdBQUcsR0FBRyw2Q0FBNkMsTUFBTSxNQUFNLGVBQWUsU0FBUyxrQkFBa0IscUJBQXFCLE1BQU0sR0FBRyxTQUFTLEdBQUcsR0FBRyxNQUFNLDhCQUE4QixZQUFZLHdCQUF3QixlQUFlLHVDQUF1QyxrQkFBa0IsMENBQTBDLEdBQUcsWUFBWSw2RkFBNkYsZUFBZSxTQUFTLGVBQWUsMkJBQTJCLFNBQVMsR0FBRyx3QkFBd0IsR0FBRyxHQUFHLE1BQU0sTUFBTSw0REFBNEQsa0JBQWtCLHFCQUFxQiw4QkFBOEIsMkJBQTJCLE1BQU0sa0JBQWtCLDhCQUE4QixTQUFTLGVBQWUsWUFBWSxHQUFHLFNBQVMsOEJBQThCLEdBQUcsU0FBUyxNQUFNLE1BQU0sR0FBRyxZQUFZLE1BQU0sZUFBZSxTQUFTLDJCQUEyQixnREFBZ0QsR0FBRyxNQUFNLEdBQUcscUJBQXFCLCtEQUErRCxNQUFNLEdBQUcsU0FBUyxZQUFZLDJCQUEyQixnREFBZ0QsU0FBUyxHQUFHLGlDQUFpQyxTQUFTLEdBQUcsTUFBTSxNQUFNLDZDQUE2QyxNQUFNLEdBQUcsdUNBQXVDLHFCQUFxQixxQkFBcUIsTUFBTSxHQUFHLHFCQUFxQixNQUFNLE1BQU0sb0NBQW9DLFNBQVMsd0JBQXdCLHdCQUF3QixZQUFZLGVBQWUsU0FBUyx3QkFBd0IsWUFBWSxpQ0FBaUMsR0FBRyxlQUFlLHFCQUFxQixHQUFHLCtEQUErRCxTQUFTLGtCQUFrQixZQUFZLDJCQUEyQixlQUFlLEdBQUcsTUFBTSxlQUFlLDhCQUE4QixTQUFTLEdBQUcsc0RBQXNELEdBQUcscUJBQXFCLEdBQUcsR0FBRyxHQUFHLFlBQVksTUFBTSxTQUFTLG9DQUFvQyxTQUFTLE1BQU0sd0JBQXdCLEdBQUcsd0JBQXdCLGtCQUFrQixHQUFHLDZDQUE2QyxNQUFNLE1BQU0sWUFBWSxlQUFlLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLFNBQVMsTUFBTSxNQUFNLFNBQVMsWUFBWSxTQUFTLEdBQUcscUJBQXFCLFlBQVksTUFBTSxHQUFHLE1BQU0sTUFBTSxHQUFHLDhCQUE4QixHQUFHLEdBQUcsTUFBTSxNQUFNLDJCQUEyQixrQkFBa0IsR0FBRyxNQUFNLFNBQVMsTUFBTSxNQUFNLFlBQVkscUJBQXFCLGVBQWUsTUFBTSxHQUFHLHdCQUF3QixHQUFHLFNBQVMsR0FBRyxxQkFBcUIsTUFBTSxvQ0FBb0MsTUFBTSwyQkFBMkIsd0JBQXdCLDBDQUEwQyxHQUFHLDZGQUE2RixZQUFZLEdBQUcsR0FBRyxxQkFBcUIsTUFBTSxHQUFHLE1BQU0sa0JBQWtCLGVBQWUsR0FBRyxZQUFZLDhCQUE4QixlQUFlLHdCQUF3QiwyQkFBMkIsWUFBWSwrREFBK0QsbURBQW1ELFlBQVksWUFBWSwrREFBK0QsaUNBQWlDLEdBQUcsa0JBQWtCLE1BQU0sU0FBUyxZQUFZLHFFQUFxRSxHQUFHLFNBQVMsU0FBUyxHQUFHLFlBQVksZUFBZSxxQkFBcUIsTUFBTSx3QkFBd0IsTUFBTSxlQUFlLGVBQWUsZUFBZSxZQUFZLE1BQU0sTUFBTSxrQkFBa0Isb0NBQW9DO0FBQ3pnTTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLEVBQUU7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFVBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxPQUFPO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywyRUFBWTtBQUMvQztBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFRO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLGtEQUFRO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBUTtBQUNSLGtEQUFRO0FBQ1I7QUFDQSxrREFBUTtBQUNzQjtBQUM5QixtQzs7Ozs7Ozs7Ozs7O0FDbkVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWE7QUFDYjtBQUNBO0FBQ3lDO0FBQ2tCO0FBQ1o7QUFDVjtBQUM5QixtQkFBbUIsNERBQU0sQ0FBQyxnREFBTztBQUNqQztBQUNQO0FBQ0E7QUFDQSxRQUFRLGdGQUFjO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsVUFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsOERBQUU7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnRkFBYztBQUN0QztBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0Esb0M7Ozs7Ozs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN3QjtBQUMxRDtBQUNQLFFBQVEsK0NBQUU7QUFDVixRQUFRLCtDQUFFO0FBQ1YsUUFBUSwrQ0FBRTtBQUNWLFFBQVEsK0NBQUU7QUFDVixRQUFRLCtDQUFFO0FBQ1YsUUFBUSwrQ0FBRTtBQUNWLFFBQVEsK0NBQUU7QUFDVixRQUFRLGlEQUFLO0FBQ2IsV0FBVyxpREFBSztBQUNoQixXQUFXLGlEQUFLO0FBQ2hCO0FBQ0EscUM7Ozs7Ozs7Ozs7OztBQ3BCQTtBQUFBO0FBQUE7QUFBc0Q7QUFDL0M7QUFDUDtBQUNBLElBQUksMEVBQWdCO0FBQ3BCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7Ozs7Ozs7Ozs7Ozs7QUNaQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDZ0Q7QUFDeEI7QUFDOEI7QUFDdEQ7Ozs7Ozs7Ozs7Ozs7QUNSQTs7Ozs7Ozs7Ozs7OztBQ0RBO0FBQUE7QUFBQTtBQUFBO0FBQStCOztBQUUvQjtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDRDQUFZO0FBQ25DO0FBQ0EscUJBQXFCLGlEQUFpQjtBQUN0QztBQUNBLEdBQUc7O0FBRUgsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxJQUFJLCtDQUFlO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsRUFBRSwrQ0FBZTtBQUNqQixnRkFBZ0Y7QUFDaEY7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSyxVQUFVLElBQXFDO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTyxVQUFVLElBQXFDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRztBQUNyRTtBQUNLO0FBQ1E7QUFDRjtBQUNuQztBQUNQO0FBQ0E7QUFDQSxhQUFhLHVHQUE2Qjs7QUFFMUMsY0FBYyw4Q0FBYztBQUM1QixvQkFBb0IscURBQW9CLFVBQVUsc0RBQVUsR0FBRyx3REFBVztBQUMxRSxvRkFBb0Ysa0RBQWtCO0FBQ3RHLHNCQUFzQixtREFBbUI7QUFDekM7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXNFO0FBQ3ZDO0FBQ087QUFDRjtBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUCxFQUFFLHdGQUFjOztBQUVoQjtBQUNBOztBQUVBLHVFQUF1RSxhQUFhO0FBQ3BGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxzQkFBc0IscURBQW9COztBQUUxQyxRQUFRLElBQXFDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSSx3REFBUztBQUNiOztBQUVBO0FBQ0Esc0JBQXNCLHFEQUFvQjs7QUFFMUMsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTSx3REFBUztBQUNmOztBQUVBO0FBQ0EsTUFBTSx3REFBUztBQUNmO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLHdEQUFTO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUMsQ0FBQywrQ0FBZTtBQUNqQjs7Ozs7Ozs7Ozs7OztBQ3ZGQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBc0U7QUFDdkM7QUFDSztBQUM3QjtBQUNQLEVBQUUsd0ZBQWM7O0FBRWhCO0FBQ0E7O0FBRUEsdUVBQXVFLGFBQWE7QUFDcEY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSx3REFBUztBQUNmLE1BQU0sd0RBQVM7QUFDZjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE1BQU0sd0RBQVM7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0JBQXdCLGtEQUFrQjtBQUMxQztBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLENBQUMsQ0FBQywrQ0FBZTtBQUNqQjs7Ozs7Ozs7Ozs7OztBQ2pEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEI7QUFDZ0I7QUFDRjtBQUNsQjtBQUN4Qjs7Ozs7Ozs7Ozs7OztBQ0pBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsTUFBTSxJQUFxQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMvQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0Q7QUFDTjtBQUNRO0FBQ0o7QUFDRTtBQUNSO0FBQ1o7QUFDa0I7QUFDbEI7QUFDZ0I7QUFDVjtBQUNNO0FBQ0Q7QUFDcEI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxxRUFBcUUsYUFBYTtBQUNsRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQix1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0EscUJBQXFCLDJFQUFTLGNBQWMsK0VBQWlCLHlDQUF5QywrRUFBaUI7QUFDdkgsa0JBQWtCLCtFQUFpQjtBQUNuQyxVQUFVO0FBQ1Y7O0FBRUEsK0JBQStCLHdFQUFjLENBQUMsc0VBQVcsd0RBQXdEOztBQUVqSDtBQUNBO0FBQ0EsU0FBUyxFQUFFO0FBQ1g7O0FBRUEsWUFBWSxJQUFxQztBQUNqRCwwQkFBMEIsa0VBQVE7QUFDbEM7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVLDJFQUFpQjs7QUFFM0IsY0FBYywwRUFBZ0IsOEJBQThCLCtDQUFJO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDLDhFQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQSx3REFBd0Q7QUFDeEQ7OztBQUdBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQSxjQUFjLElBQXFDO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQSxTQUFTOzs7QUFHVDtBQUNBLHFCQUFxQiw4RUFBZ0IsWUFBWSw2RUFBZTtBQUNoRSxrQkFBa0IsMkVBQWE7QUFDL0IsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQSw2Q0FBNkMsS0FBSzs7QUFFbEQ7QUFDQSxzRUFBc0U7QUFDdEUsU0FBUztBQUNUOztBQUVBLDJCQUEyQix1Q0FBdUM7QUFDbEUsY0FBYyxJQUFxQztBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxjQUFjLGtFQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsSUFBcUM7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNPLGtEQUFrRDs7Ozs7Ozs7Ozs7Ozs7QUMvUHpEO0FBQUE7QUFBQTtBQUErQztBQUNoQztBQUNmLDBEQUEwRDs7QUFFMUQ7QUFDQTtBQUNBLEdBQUc7QUFDSCx1QkFBdUIsbUVBQVk7QUFDbkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQSxPQUFPO0FBQ1AsS0FBSzs7O0FBR0w7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUN0QkE7QUFBQTtBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ1pBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXVDO0FBQ1k7QUFDQTtBQUNJO0FBQ0o7QUFDTTtBQUNKO0FBQ007QUFDSTtBQUNoQjtBQUNWO0FBQ007QUFDaUI7QUFDaEI7O0FBRTVDO0FBQ0EsYUFBYSx5RUFBcUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEIsa0RBQVEsR0FBRywyRUFBZ0IsQ0FBQyxtRUFBZSxhQUFhLG9FQUFhLGdFQUFnRSwyRUFBZ0IsQ0FBQyxtRUFBZSxDQUFDLHNFQUFrQjtBQUNwTixDQUFDO0FBQ0Q7QUFDQTs7O0FBR0E7QUFDQSx3QkFBd0IscUVBQWlCLENBQUMsaUVBQWE7QUFDdkQsd0RBQXdELG9FQUFnQjtBQUN4RSw0Q0FBNEMsb0VBQWEsWUFBWSxtRUFBZTs7QUFFcEYsT0FBTyxnRUFBUztBQUNoQjtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsV0FBVyxnRUFBUyxvQkFBb0IsNkRBQVEsb0NBQW9DLGdFQUFXO0FBQy9GLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7OztBQUdlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiwyREFBRztBQUNyQixvQkFBb0IsMkRBQUc7QUFDdkIscUJBQXFCLDJEQUFHO0FBQ3hCLG1CQUFtQiwyREFBRztBQUN0QjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDckVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUErRDtBQUNoQjtBQUNKO0FBQ0s7QUFDVztBQUNGO0FBQ1I7QUFDakQ7O0FBRWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUEsd0JBQXdCLHNFQUFrQjtBQUMxQyxhQUFhLHlFQUFxQjtBQUNsQyxnQ0FBZ0Msb0VBQWE7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFFBQVEsK0RBQVc7QUFDbkIsSUFBSSxrRUFBYztBQUNsQixlQUFlLGlFQUFhO0FBQzVCOztBQUVBLFFBQVEsb0VBQWE7QUFDckIsZ0JBQWdCLHlFQUFxQjtBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMLGtCQUFrQix1RUFBbUI7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUMvQ0E7QUFBQTtBQUFBO0FBQXVDO0FBQ3hCO0FBQ2YsU0FBUyw2REFBUztBQUNsQixDOzs7Ozs7Ozs7Ozs7QUNIQTtBQUFBO0FBQUE7QUFBNEM7QUFDN0I7QUFDZjtBQUNBLFdBQVcsZ0VBQVM7QUFDcEI7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUNMQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF5RDtBQUNKO0FBQ007QUFDUjtBQUNaO0FBQ3ZDOztBQUVlO0FBQ2Y7O0FBRUEsYUFBYSxzRUFBa0I7QUFDL0Isa0JBQWtCLG1FQUFlO0FBQ2pDO0FBQ0EsY0FBYywwREFBRztBQUNqQixlQUFlLDBEQUFHO0FBQ2xCLGtDQUFrQyx1RUFBbUI7QUFDckQ7O0FBRUEsTUFBTSxvRUFBZ0I7QUFDdEIsU0FBUywwREFBRztBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQzVCQTtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ0xBO0FBQUE7QUFBQTtBQUErRDtBQUMvRDs7QUFFZTtBQUNmLG1CQUFtQix5RUFBcUIsVUFBVTtBQUNsRDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDeEJBO0FBQUE7QUFBZTtBQUNmO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDRkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW1EO0FBQ1o7QUFDUztBQUNhO0FBQzlDO0FBQ2YsZUFBZSw2REFBUyxXQUFXLG9FQUFhO0FBQ2hELFdBQVcsbUVBQWU7QUFDMUIsR0FBRztBQUNILFdBQVcsd0VBQW9CO0FBQy9CO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDVkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF1QztBQUNJO0FBQ1U7QUFDTDtBQUNDO0FBQ0Y7O0FBRS9DO0FBQ0EsT0FBTyxvRUFBYTtBQUNwQixFQUFFLG9FQUFnQjtBQUNsQjtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsY0FBYyxvRUFBYTtBQUMzQjtBQUNBLHFCQUFxQixvRUFBZ0I7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpRUFBYTs7QUFFakMsU0FBUyxvRUFBYSwwQ0FBMEMsK0RBQVc7QUFDM0UsY0FBYyxvRUFBZ0IsY0FBYztBQUM1QztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEOzs7QUFHZTtBQUNmLGVBQWUsNkRBQVM7QUFDeEI7O0FBRUEseUJBQXlCLGtFQUFjLGtCQUFrQixvRUFBZ0I7QUFDekU7QUFDQTs7QUFFQSx1QkFBdUIsK0RBQVcsNkJBQTZCLCtEQUFXLDZCQUE2QixvRUFBZ0I7QUFDdkg7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQy9EQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTJDO0FBQ2M7QUFDVjtBQUNoQztBQUNmLE1BQU0sK0RBQVc7QUFDakI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtRUFBWTtBQUNoQjtBQUNBLElBQUksc0VBQWtCOztBQUV0QjtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ2xCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0M7QUFDRTtBQUNOO0FBQ0s7QUFDakM7QUFDZiw0Q0FBNEMsK0RBQVc7QUFDdkQ7QUFDQTtBQUNBOztBQUVBLE1BQU0sb0VBQWEsVUFBVSxrRUFBYztBQUMzQztBQUNBOztBQUVBLHlCQUF5QixpRUFBYTtBQUN0QyxDOzs7Ozs7Ozs7Ozs7QUNmQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXVDO0FBQ2tCO0FBQ0U7QUFDNUM7QUFDZixZQUFZLDZEQUFTO0FBQ3JCLGFBQWEsc0VBQWtCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQ0FBbUMsc0NBQXNDO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1RUFBbUI7QUFDOUI7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ3ZDQTtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUNYQTtBQUFBO0FBQUE7QUFBdUM7QUFDeEI7QUFDZixZQUFZLDZEQUFTO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ1RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBK0Q7QUFDTjtBQUNOO0FBQ3BDO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHlFQUFxQixDQUFDLHNFQUFrQixrQkFBa0IsbUVBQWU7QUFDbEYsQzs7Ozs7Ozs7Ozs7O0FDWkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF1Qzs7QUFFdkM7QUFDQSxtQkFBbUIsNkRBQVM7QUFDNUI7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQiw2REFBUztBQUM1QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDZEQUFTO0FBQzVCO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDcEJBO0FBQUE7QUFBQTtBQUFxRDtBQUN0QztBQUNmO0FBQ0EsMEJBQTBCLG9FQUFnQjtBQUMxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUNUQTtBQUFBO0FBQUE7QUFBMkM7QUFDNUI7QUFDZix1Q0FBdUMsK0RBQVc7QUFDbEQsQzs7Ozs7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW1EO0FBQ0o7QUFDUjtBQUNVO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFZTtBQUNmOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsbUVBQWU7QUFDcEM7QUFDQSxZQUFZLDZEQUFTO0FBQ3JCLCtEQUErRCxrRUFBYztBQUM3RTtBQUNBO0FBQ0EsdUNBQXVDLGlFQUFhO0FBQ3BELEM7Ozs7Ozs7Ozs7OztBQ3pCQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ1A7QUFDQSxDQUFDO0FBQ007QUFDUDtBQUNBLENBQUMsTUFBTTs7QUFFQTtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0EsNEJBQTRCOztBQUU1QjtBQUNBO0FBQ0E7QUFDQSxnSDs7Ozs7Ozs7Ozs7O0FDOUJQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTJCO0FBQ1U7O0FBRWlFOztBQUUzRDs7Ozs7Ozs7Ozs7Ozs7QUNMM0M7QUFBQTtBQUFBO0FBQXNEO0FBQ0s7QUFDM0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qzs7QUFFdkMsU0FBUyw4RUFBYSxjQUFjLHlFQUFXO0FBQy9DO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzSEFBc0g7O0FBRXRIO0FBQ0E7QUFDQTtBQUNBLE9BQU8sSUFBSSxFQUFFOztBQUViLFdBQVcsOEVBQWEsY0FBYyx5RUFBVztBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQSxDQUFDOzs7QUFHYztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDbkZEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEQ7QUFDRjtBQUNWO0FBQ2M7QUFDYztBQUNwQztBQUN3QjtBQUNOO0FBQ2E7QUFDWjs7QUFFM0Q7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQSxHQUFHO0FBQ0gsU0FBUyw0RUFBa0IseUNBQXlDLHlFQUFlLFVBQVUsd0RBQWM7QUFDM0c7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBFQUFnQjtBQUN0QyxhQUFhLGtGQUF3QjtBQUNyQyxvQkFBb0IsOENBQUksRUFBRSwrQ0FBSztBQUMvQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IsMkVBQWE7QUFDL0IsK0JBQStCLDZDQUFHLEdBQUcsOENBQUk7QUFDekMsK0JBQStCLGdEQUFNLEdBQUcsK0NBQUs7QUFDN0M7QUFDQTtBQUNBLDBCQUEwQiw2RUFBZTtBQUN6QztBQUNBLHNEQUFzRDtBQUN0RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGdFQUFNLG1CQUFtQjs7QUFFeEM7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxNQUFNLElBQXFDO0FBQzNDLFNBQVMsOEVBQWE7QUFDdEI7QUFDQTtBQUNBOztBQUVBLE9BQU8sc0VBQVE7QUFDZixRQUFRLElBQXFDO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7Ozs7Ozs7Ozs7OztBQ3BHRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBdUQ7QUFDTztBQUNaO0FBQ2tCO0FBQ0o7QUFDSjtBQUNuQjs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNERBQUssQ0FBQyw0REFBSztBQUNsQixPQUFPLDREQUFLLENBQUMsNERBQUs7QUFDbEI7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyw4Q0FBSTtBQUNsQixjQUFjLDZDQUFHO0FBQ2pCOztBQUVBO0FBQ0EsdUJBQXVCLDZFQUFlO0FBQ3RDO0FBQ0E7O0FBRUEseUJBQXlCLHVFQUFTO0FBQ2xDLHFCQUFxQixnRkFBa0I7O0FBRXZDLFVBQVUsOEVBQWdCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBLHNCQUFzQiw2Q0FBRztBQUN6QixjQUFjLGdEQUFNLENBQUM7O0FBRXJCO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOENBQUk7QUFDMUIsY0FBYywrQ0FBSyxDQUFDOztBQUVwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBLDJCQUEyQixvQ0FBb0M7QUFDL0Q7O0FBRUEseUJBQXlCLHFDQUFxQztBQUM5RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsTUFBTSxJQUFxQztBQUMzQyw2QkFBNkIsOEVBQWdCOztBQUU3QztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsMEVBQWdCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLG1EQUFtRDtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBLHlDQUF5QyxrREFBa0Q7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUEsNENBQTRDO0FBQzVDO0FBQ0EsR0FBRztBQUNILENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDMUpEO0FBQUE7QUFBa0Q7O0FBRWxEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSx1RUFBUztBQUN4Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR2M7QUFDZjtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDaEREO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0U7QUFDUjtBQUMwQjtBQUM5QjtBQUNZO0FBQ0E7QUFDaEI7O0FBRXBEO0FBQ0EsTUFBTSwwRUFBZ0IsZ0JBQWdCLDhDQUFJO0FBQzFDO0FBQ0E7O0FBRUEsMEJBQTBCLDhFQUFvQjtBQUM5QyxVQUFVLHVGQUE2QixnQ0FBZ0MsdUZBQTZCO0FBQ3BHOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiwwRUFBZ0I7QUFDdEM7QUFDQSxpR0FBaUcsOEVBQW9CO0FBQ3JIO0FBQ0Esc0JBQXNCLDBFQUFnQixnQkFBZ0IsOENBQUksR0FBRyw4RUFBb0I7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQix1QkFBdUI7QUFDeEM7O0FBRUEseUJBQXlCLDBFQUFnQjs7QUFFekMsMkJBQTJCLHNFQUFZLGdCQUFnQiwrQ0FBSztBQUM1RCxzQkFBc0IsNkNBQUcsRUFBRSxnREFBTTtBQUNqQztBQUNBLG1CQUFtQix3RUFBYztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDREQUE0RCwrQ0FBSyxHQUFHLDhDQUFJLHNCQUFzQixnREFBTSxHQUFHLDZDQUFHOztBQUUxRztBQUNBLDBCQUEwQiw4RUFBb0I7QUFDOUM7O0FBRUEsMkJBQTJCLDhFQUFvQjtBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsUUFBUTtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDbEpEO0FBQUE7QUFBQTtBQUF1RDtBQUNDOztBQUV4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFVBQVUsNkNBQUcsRUFBRSwrQ0FBSyxFQUFFLGdEQUFNLEVBQUUsOENBQUk7QUFDbEM7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHdFQUFjO0FBQ3hDO0FBQ0EsR0FBRztBQUNILDBCQUEwQix3RUFBYztBQUN4QztBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDNUREO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTBEO0FBQ1o7QUFDZ0I7QUFDRTtBQUNwQjtBQUNBO0FBQ0k7QUFDYzs7Ozs7Ozs7Ozs7OztBQ1A5RDtBQUFBO0FBQUE7QUFBQTtBQUE0RDtBQUNEO0FBQ3BEO0FBQ1Asc0JBQXNCLDBFQUFnQjtBQUN0Qyx3QkFBd0IsOENBQUksRUFBRSw2Q0FBRzs7QUFFakMsbUVBQW1FO0FBQ25FO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVUsOENBQUksRUFBRSwrQ0FBSztBQUNyQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0RBQVU7QUFDdkI7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDcEREO0FBQUE7QUFBd0Q7O0FBRXhEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLHdFQUFjO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7OztBQUdjO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRTs7Ozs7Ozs7Ozs7O0FDeEJEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4RDtBQUNGO0FBQ2dCO0FBQzVCO0FBQ1I7QUFDa0I7QUFDSTtBQUNOO0FBQ0o7QUFDWTtBQUNFOztBQUVsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQix3RUFBYztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQkFBc0IsMEVBQWdCO0FBQ3RDLGtCQUFrQixzRUFBWTtBQUM5QjtBQUNBLGlCQUFpQixrRkFBd0I7QUFDekMsZ0JBQWdCLG9FQUFVO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLDRGQUE0RjtBQUM1RjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQ0FBc0MsNkNBQUcsR0FBRyw4Q0FBSTtBQUNoRCxxQ0FBcUMsZ0RBQU0sR0FBRywrQ0FBSztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLCtDQUFLO0FBQ3BDLCtCQUErQiwrQ0FBSywwQ0FBMEM7QUFDOUU7O0FBRUE7QUFDQSw2Q0FBNkMsMkVBQWE7QUFDMUQ7QUFDQTtBQUNBO0FBQ0EseUhBQXlILDRFQUFrQjtBQUMzSTtBQUNBLHNEQUFzRDtBQUN0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsZ0VBQU07QUFDekI7QUFDQTtBQUNBLG9EQUFvRCw2RUFBZTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QixnRUFBTSxVQUFVLDJEQUFPLHlDQUF5QywyREFBTztBQUNuRztBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5Q0FBeUMsNkNBQUcsR0FBRyw4Q0FBSTs7QUFFbkQsd0NBQXdDLGdEQUFNLEdBQUcsK0NBQUs7O0FBRXREOztBQUVBOztBQUVBOztBQUVBLDZCQUE2QixnRUFBTSxVQUFVLDJEQUFPLDRDQUE0QywyREFBTzs7QUFFdkc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOzs7QUFHYztBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEU7Ozs7Ozs7Ozs7OztBQzFIRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0U7QUFDVDtBQUNGO0FBQ0E7QUFDSjtBQUNyRCx3QkFBd0Isb0VBQWMsRUFBRSxtRUFBYSxFQUFFLG1FQUFhLEVBQUUsaUVBQVc7QUFDakYsZ0NBQWdDLHdFQUFlO0FBQy9DO0FBQ0EsQ0FBQyxFQUFFOzs7Ozs7Ozs7Ozs7OztBQ1JIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRTtBQUNUO0FBQ0Y7QUFDQTtBQUNKO0FBQ1Y7QUFDSjtBQUNzQjtBQUNwQjtBQUNGO0FBQ3ZDLHdCQUF3QixvRUFBYyxFQUFFLG1FQUFhLEVBQUUsbUVBQWEsRUFBRSxpRUFBVyxFQUFFLDREQUFNLEVBQUUsMERBQUksRUFBRSxxRUFBZSxFQUFFLDJEQUFLLEVBQUUsMERBQUk7QUFDN0gsZ0NBQWdDLHdFQUFlO0FBQy9DO0FBQ0EsQ0FBQyxFQUFFOztBQUV3RTs7QUFFUDs7Ozs7Ozs7Ozs7Ozs7QUNqQnBFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2QztBQUNrRDtBQUM5QztBQUNJO0FBQ3RDO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLG9EQUFhO0FBQzlFLGtCQUFrQixnRUFBWTtBQUM5QixnREFBZ0QsNkRBQW1CLEdBQUcsNkRBQW1CO0FBQ3pGLFdBQVcsZ0VBQVk7QUFDdkIsR0FBRyxJQUFJLHdEQUFjO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUEsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxxQkFBcUIsa0VBQWM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUUsb0VBQWdCO0FBQ3ZCO0FBQ0EsR0FBRyxJQUFJO0FBQ1A7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7Ozs7Ozs7QUM5Q0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFEO0FBQ1I7QUFDd0I7QUFDRjtBQUNwRDtBQUNmO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxvRUFBZ0I7QUFDbEQsOEJBQThCLGdFQUFZO0FBQzFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVMsNkNBQUc7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsZ0RBQU07QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsK0NBQUs7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsOENBQUk7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsNEVBQXdCOztBQUV6RDtBQUNBOztBQUVBO0FBQ0EsV0FBVywrQ0FBSztBQUNoQjtBQUNBOztBQUVBLFdBQVcsNkNBQUc7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ3JFQTtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ2RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMEU7QUFDWjtBQUNNO0FBQ25CO0FBQ0k7QUFDMEQ7QUFDeEQ7QUFDRTtBQUNOOztBQUVwQztBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCx5REFBZTtBQUMvRDtBQUNBLHdEQUF3RCxrREFBUTtBQUNoRTtBQUNBLDBEQUEwRCxnREFBTTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzRUFBa0IseUNBQXlDLG1FQUFlLFVBQVUsd0RBQWM7QUFDeEgsc0NBQXNDLGdEQUFNLEdBQUcsbURBQVMsR0FBRyxnREFBTTtBQUNqRTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsNkVBQWUsQ0FBQywwRUFBUyxnREFBZ0QsZ0ZBQWtCO0FBQ3RILDRCQUE0QixtRkFBcUI7QUFDakQsc0JBQXNCLGtFQUFjO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHlCQUF5QixvRUFBZ0IsaUJBQWlCO0FBQzFELDZDQUE2QyxnREFBTSwwQ0FBMEM7QUFDN0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDOztBQUU5Qyx5QkFBeUIsZ0RBQU07QUFDL0I7QUFDQTtBQUNBLHNCQUFzQiwrQ0FBSyxFQUFFLGdEQUFNO0FBQ25DLGtCQUFrQiw2Q0FBRyxFQUFFLGdEQUFNO0FBQzdCO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDL0RBO0FBQUE7QUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQLEM7Ozs7Ozs7Ozs7OztBQ0xBO0FBQUE7QUFBZTtBQUNmLHdGQUF3RixhQUFhO0FBQ3JHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQWU7QUFDZjtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFtQztBQUNwQjtBQUNmO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQzs7Ozs7Ozs7Ozs7O0FDUEE7QUFBQTtBQUFlO0FBQ2Y7QUFDQSxDOzs7Ozs7Ozs7Ozs7QUNGQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0EsR0FBRztBQUNILEM7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNlO0FBQ2Y7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7Ozs7Ozs7QUNSQTtBQUFBO0FBQWU7QUFDZjtBQUNBLEM7Ozs7Ozs7Ozs7OztBQ0ZBO0FBQUE7QUFBQTtBQUFBO0FBQU87QUFDQTtBQUNBLHVCOzs7Ozs7Ozs7Ozs7QUNGUDtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3RELCtCQUErQjtBQUMvQiw0QkFBNEI7QUFDNUIsS0FBSztBQUNMO0FBQ0EsR0FBRyxJQUFJLEVBQUU7O0FBRVQ7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7Ozs7Ozs7QUNiQTtBQUFBO0FBQUE7QUFBeUQ7QUFDMUM7QUFDZix5QkFBeUIsRUFBRSxzRUFBa0I7QUFDN0MsQzs7Ozs7Ozs7Ozs7O0FDSEE7QUFBQTtBQUFBO0FBQTZDOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEVBQUU7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVlO0FBQ2Y7QUFDQSwwQ0FBMEM7O0FBRTFDLFNBQVMsd0RBQWM7QUFDdkI7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQzs7Ozs7Ozs7Ozs7O0FDM0NBO0FBQUE7QUFBZTtBQUNmLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDOzs7Ozs7Ozs7Ozs7QUNQQTtBQUFBO0FBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQzs7Ozs7Ozs7Ozs7O0FDVkE7QUFBQTtBQUFBO0FBQUE7QUFBaUM7QUFDWTtBQUM3QztBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQU07QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQiwwREFBTTtBQUNoQzs7QUFFQTtBQUNBLGNBQWMsd0RBQWM7QUFDNUIsMEJBQTBCLDBEQUFNLCtEQUErRCx3REFBYztBQUM3Rzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCLDBEQUFNO0FBQ2hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQSwwQkFBMEIsMERBQU07QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQiwwREFBTTtBQUNoQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMEJBQTBCLDBEQUFNO0FBQ2hDOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCLDBEQUFNO0FBQzlCO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0gsQzs7Ozs7Ozs7Ozs7O0FDM0VBO0FBQUE7QUFBQTtBQUEyRDtBQUM1QztBQUNmLFNBQVMsb0RBQU8sTUFBTSxvREFBTztBQUM3QixDOzs7Ozs7Ozs7Ozs7QUNIYTs7QUFFYiw4Q0FBOEMsY0FBYzs7QUFFNUQsVUFBVSxtQkFBTyxDQUFDLDRDQUFPO0FBQ3pCLGdCQUFnQixtQkFBTyxDQUFDLHNEQUFZO0FBQ3BDLFlBQVksbUJBQU8sQ0FBQyw0Q0FBTzs7QUFFM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTs7QUFFQSxxQkFBcUIsWUFBWTtBQUNqQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5QixRQUFRO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCLFNBQVM7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsWUFBWTtBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztB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Q0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixpQkFBaUI7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckxBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsbUJBQU8sQ0FBQyxlQUFRO0FBQzdCLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsUUFBUTtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsd0JBQXdCLG1CQUFtQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFlBQVk7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQyxzQkFBc0I7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixpQkFBaUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiw0QkFBNEI7QUFDN0M7QUFDQTs7QUFFQSxpQkFBaUIsYUFBYTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsaUJBQWlCLGFBQWE7QUFDOUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxxQkFBcUIsZ0JBQWdCO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixpQkFBaUI7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQSxtQkFBbUIsY0FBYztBQUNqQztBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsY0FBYztBQUNqQztBQUNBOztBQUVBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsY0FBYztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsNkJBQTZCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLGNBQWM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLDZCQUE2QjtBQUN2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxtQkFBbUIsU0FBUztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFdBQVc7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsNkJBQTZCLG1DQUFtQztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsNkJBQTZCLG1DQUFtQztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDZCQUE2QixtQ0FBbUM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUJBQXVCLDBCQUEwQjtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsZ0NBQWdDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQixZQUFZO0FBQy9CO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsZ0JBQWdCO0FBQ25DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsb0JBQW9CO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQWE7QUFDb007QUFDM0Y7QUFDdEU7QUFDUTtBQUM2SztBQUNySTtBQUNtQztBQUNoRTtBQUNkO0FBQ047QUFDOEI7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9DQUFvQztBQUNwQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDelVhOztBQUViLFlBQVksbUJBQU8sQ0FBQywwREFBVTtBQUM5Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoRGE7O0FBRWIsYUFBYSxtQkFBTyxDQUFDLHdFQUFxQjtBQUMxQyxlQUFlLG1CQUFPLENBQUMsNkRBQVU7O0FBRWpDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixnQkFBZ0I7QUFDckM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBLEdBQUc7QUFDSCxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsZ0JBQWdCO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixnQkFBZ0I7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3QixnQkFBZ0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3JSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNILG1CQUFtQix3QkFBd0I7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUMxZFc7O0FBRVo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBOztBQUVBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLGNBQWM7QUFDM0IsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLE9BQU87QUFDcEIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLGFBQWEsY0FBYztBQUMzQixhQUFhLE9BQU87QUFDcEIsYUFBYSxPQUFPO0FBQ3BCLGFBQWEsT0FBTztBQUNwQixhQUFhLFFBQVE7QUFDckIsZUFBZTtBQUNmO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJD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QUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUIsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSxJQUFxQztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVUsS0FBcUM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVB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QWlCO0FBQ2pCOztBQUVBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUEsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQSwyQkFBMkI7QUFDM0I7O0FBRUEsZ0JBQWdCO0FBQ2hCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0Esb0JBQW9COztBQUVwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxFQUFFOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUU7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBRTtBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFdBQVcsT0FBTztBQUNsQixXQUFXLEVBQUU7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFD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QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUM7QUFDakM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUEsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxpRUFBaUU7QUFDakU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUEsbUJBQW1CLGtCQUFrQjtBQUNyQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsOEJBQThCO0FBQzlCOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7O0FBR0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLOzs7QUFHTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQiwyQkFBMkI7QUFDOUM7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixxQkFBcUI7QUFDekM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxxQkFBcUIsc0JBQXNCO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlDQUFpQzs7QUFFakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrRkFBa0Y7QUFDbEY7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTywwQ0FBMEM7OztBQUdqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrRkFBK0Y7QUFDL0Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTywwQ0FBMEM7OztBQUdqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkU7O0FBRTdFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0pBQXNKLGlCQUFpQjtBQUN2SyxPQUFPO0FBQ1Asc0pBQXNKLGlCQUFpQix3REFBd0QsbUJBQW1CLGdCQUFnQiw4QkFBOEI7QUFDaFM7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0Esb0dBQW9HLEdBQUc7O0FBRXZHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxlQUFlO0FBQzNCOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRTs7QUFFdEU7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2Q0FBNkM7O0FBRTdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQiwwQkFBMEI7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsV0FBVyxPQUFPO0FBQ2xCLFlBQVksVUFBVTtBQUN0Qjs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQkFBMEI7QUFDMUI7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsZ0JBQWdCOztBQUVoQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGdCQUFnQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUCx1RUFBdUU7O0FBRXZFO0FBQ0EsOERBQThEO0FBQzlEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxPQUFPOzs7QUFHUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsdUJBQXVCOztBQUV2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLFNBQVM7QUFDcEIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxLQUFLO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsU0FBUztBQUNwQixXQUFXLEVBQUU7QUFDYixXQUFXLEtBQUs7QUFDaEI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87OztBQUdQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHNDQUFzQzs7QUFFdEMsOEJBQThCO0FBQzlCOztBQUVBO0FBQ0E7QUFDQSx1QkFBdUI7O0FBRXZCO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBLHlFQUF5RTtBQUN6RTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FB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Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7O0FBRXJDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixnQkFBZ0I7QUFDakM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0M7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJDQUEyQzs7QUFFM0M7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQzs7QUFFckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7O0FBRTdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7O0FBRXpELG9CQUFvQjtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7OztBQUdBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFP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QSxvQ0FBb0M7QUFDcEM7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMENBQTBDO0FBQzFDO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixZQUFZLE9BQU87QUFDbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxpREFBaUQ7QUFDakQ7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUU7QUFDRjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEOztBQUVBLG1DQUFtQzs7QUFFbkM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7O0FBR0EsK0VBQStFO0FBQy9FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLE9BQU87QUFDbEIsWUFBWSxRQUFRO0FBQ3BCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDZHQUE2RztBQUM3RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVTs7QUFFVjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSCxpQkFBaUIsa0JBQWtCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyx1QkFBdUI7QUFDbEMsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsdUJBQXVCO0FBQ2xDLFlBQVk7QUFDWjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEIsWUFBWTtBQUNaOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxXQUFXO0FBQ3RCLFlBQVk7QUFDWjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHVCQUF1QjtBQUNsQyxXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEU7QUFDOUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxPQUFPO0FBQ2xCLFdBQVcsT0FBTztBQUNsQixZQUFZO0FBQ1o7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwR0FBMEc7QUFDMUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0QsZ1RBQWdUO0FBQ2hUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILG9CQUFvQiwrQkFBK0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RTtBQUN2RSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQztBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrRUFBK0U7QUFDL0U7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx5R0FBeUc7QUFDekc7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBCQUEwQjs7O0FBRzFCO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjs7QUFFL0I7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBLG9DQUFvQzs7O0FBR3BDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCOztBQUU3QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1QjtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUJBQXlCLE9BQU87QUFDaEM7QUFDQTs7QUFFQTs7QUFFQSx5QkFBeUIsT0FBTztBQUNoQztBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQSx3RUFBd0U7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlJQUFpSSxtQkFBbUIsZ0JBQWdCLDhCQUE4QjtBQUNsTSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUk7QUFDSjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUssb0dBQW9HLGtDQUFrQztBQUMzSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQjtBQUMzQztBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FB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QUFxQztBQUNyQztBQUNBLCtFQUErRTtBQUMvRTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQSwwdkJBQTB2Qjs7QUFFMXZCO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQzs7QUFFcEMsdURBQXVEOztBQUV2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFFBQVEsY0FBYztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQSxDQUFDO0FBQ0Q7QUFDQTs7QUFFQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLCtDQUErQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSywrQ0FBK0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOzs7QUFHQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtRUFBbUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdELDBEQUEwRDs7QUFFMUQsb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQSwwSEFBMEg7QUFDMUg7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7O0FBRUE7QUFDQSw4Q0FBOEM7O0FBRTlDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUVBQW1FO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCO0FBQzFCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7O0FBRXhCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCOztBQUUzQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQkFBbUI7QUFDbkM7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLG1CQUFtQjtBQUNuQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQThEO0FBQzlELHFEQUFxRDtBQUNyRCwyREFBMkQ7QUFDM0QsMkNBQTJDO0FBQzNDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDs7QUFFckQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSw4Q0FBOEM7O0FBRTlDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjs7QUFFM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDhEQUE4RDs7QUFFOUQsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbURBQW1ELHlEQUF5RDtBQUM1Ryw2QkFBNkI7O0FBRTdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyx5QkFBeUI7OztBQUdsQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFD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QUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxzQ0FBc0M7O0FBRXRDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNklBQTZJOztBQUU3STtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNULGtFQUFrRSw0Q0FBNEM7QUFDOUc7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlDQUFpQztBQUNqQyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0EscURBQXFEO0FBQ3JEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtJQUFrSTtBQUNsSTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7OztBQUdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esa0lBQWtJO0FBQ2xJO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG9DQUFvQzs7QUFFcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4SkFBOEoseUNBQXlDO0FBQ3ZNO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxQkFBcUIsd0JBQXdCO0FBQzdDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGtEQUFrRDtBQUM1RDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDZCQUE2QjtBQUN6Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMLHVFQUF1RTs7QUFFdkUsVUFBVSw2QkFBNkI7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsT0FBTzs7O0FBR1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7OztBQUdBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLGlDQUFpQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTCx1RUFBdUU7O0FBRXZFLFVBQVUsWUFBWTtBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxNQUFNO0FBQ25EO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBOztBQUVBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBLEVBQUU7O0FBRUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDRIQUE0SDs7QUFFNUgsb0NBQW9DO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw0QkFBNEI7O0FBRTVCLG9DQUFvQzs7QUFFcEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDJDQUEyQztBQUNoRDs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJDQUEyQzs7QUFFM0MscUNBQXFDO0FBQ3JDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9EQUFvRDs7QUFFcEQ7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBLGlDQUFpQztBQUNqQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7O0FBRUEsbUNBQW1DOztBQUVuQzs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLEdBQUcsb0NBQW9DOztBQUV2QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRyx1QkFBdUI7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLHlLQUF5SywwQ0FBMEM7QUFDbk47QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUVBQXFFO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrQkFBK0I7O0FBRS9CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBLCtDQUErQzs7QUFFL0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7OztBQUdUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPOzs7QUFHUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Q7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDs7QUFFakQ7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0EseUVBQXlFOztBQUV6RTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQzs7QUFFdEM7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBDQUEwQzs7QUFFMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDs7O0FBR0EsZ0RBQWdEOztBQUVoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVCQUF1Qiw0Q0FBNEM7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDOztBQUVoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0EsR0FBRzs7O0FBR0gsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0wsd0NBQXdDOztBQUV4QztBQUNBLHNDQUFzQztBQUN0QztBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOENBQThDOztBQUU5QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHVEQUF1RDtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RDtBQUN2RDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0RBQXNEO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0dBQWdHO0FBQ2hHOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrRkFBK0Y7QUFDL0Y7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLHlOQUF5TixHQUFHOztBQUU1TjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxQkFBcUI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXOzs7QUFHWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsK0NBQStDOztBQUUvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsbUhBQW1IO0FBQ25IOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7O0FBR0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREOztBQUU1RDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLG9DQUFvQztBQUMzQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtREFBbUQ7QUFDbkQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLDhDQUE4QztBQUM5QztBQUNBOztBQUVBLHFIQUFxSDs7QUFFckgsK0NBQStDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjtBQUNBOztBQUVBLG9EQUFvRDtBQUNwRDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDhDQUE4QztBQUM5Qzs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTs7QUFFYjs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDOztBQUU3QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4Qzs7QUFFOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxrQ0FBa0M7O0FBRWxDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxxSEFBcUg7O0FBRXJIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBLDREQUE0RDtBQUM1RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7O0FBR0Esc0VBQXNFOztBQUV0RTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBLEtBQUssa0NBQWtDO0FBQ3ZDOzs7QUFHQTtBQUNBLEdBQUc7QUFDSDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLHlFQUF5RTs7QUFFekU7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxFQUFFOzs7QUFHRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYix5TkFBeU4scUNBQXFDLHdGQUF3RiwyQkFBMkIscUJBQXFCLFFBQVEsWUFBWTtBQUMxWixhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU8sNElBQTRJO0FBQ25KO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxhQUFhO0FBQ2I7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHNDQUFzQztBQUN0Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOzs7QUFHQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7O0FBR0EscURBQXFEOztBQUVyRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDZCQUE2Qjs7QUFFN0I7QUFDQTs7QUFFQSw0Q0FBNEM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsR0FBRywrQkFBK0I7QUFDbEM7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUcsK0JBQStCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7O0FBRUEsbUNBQW1DOztBQUVuQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87O0FBRVAsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDOztBQUV4QztBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCx3Q0FBd0M7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUM7O0FBRXZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLENBQUM7QUFDRDtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEIsaUNBQWlDOztBQUVqQyw4QkFBOEI7O0FBRTlCLDBCQUEwQjs7QUFFMUIsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EscURBQXFEOztBQUVyRCxrREFBa0Q7O0FBRWxELHdDQUF3QztBQUN4QztBQUNBO0FBQ0E7O0FBRUEsOENBQThDO0FBQzlDOztBQUVBLDZDQUE2Qzs7QUFFN0MsNkNBQTZDOztBQUU3QztBQUNBLG1DQUFtQztBQUNuQzs7QUFFQTtBQUNBLCtCQUErQjtBQUMvQjs7QUFFQSxrREFBa0Q7QUFDbEQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDOztBQUUzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUM7QUFDbkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQSwrQ0FBK0M7QUFDL0M7O0FBRUEsK0NBQStDOztBQUUvQyw0R0FBNEc7O0FBRTVHOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSwwQ0FBMEM7QUFDMUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkY7O0FBRTNGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxtRUFBbUU7OztBQUduRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUEsZ0NBQWdDO0FBQ2hDOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTCw4Q0FBOEM7QUFDOUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjtBQUMxQjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7O0FBRUg7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0EsNENBQTRDOztBQUU1QztBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7O0FBRTNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0VBQXdFOztBQUV4RTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtB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RUEsdUJBQXVCLDRCQUE0QjtBQUNuRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0EsR0FBRzs7O0FBR0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDOztBQUVBLHlDQUF5Qzs7QUFFekM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUNBQXlDOztBQUV6QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQiwyQkFBMkI7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBLGtCQUFrQiwwQkFBMEI7QUFDNUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0EsMkNBQTJDOztBQUUzQzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSx3QkFBd0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOzs7QUFHSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCOztBQUV6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUEsbUNBQW1DO0FBQ25DOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU8sNENBQTRDO0FBQ25EOzs7QUFHQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBOztBQUVBLHdDQUF3Qzs7QUFFeEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsT0FBTzs7O0FBR1A7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4R0FBOEc7O0FBRTlHOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7O0FBR0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQixJQUFJLGtDQUFrQyxtQ0FBbUM7QUFDMUYsNERBQTRELGNBQWMsSUFBSSxnQkFBZ0IsbUNBQW1DO0FBQ2pJLE9BQU87QUFDUDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlNQUFpTSxvREFBb0QsRUFBRTtBQUN2UDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4TEFBOEwsb0RBQW9ELEVBQUU7QUFDcFAsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGdGQUFnRjs7QUFFaEYsMENBQTBDO0FBQzFDO0FBQ0EsMEJBQTBCO0FBQzFCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsNkRBQTZEOztBQUU3RDtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUcsRUFBRTtBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSx5REFBeUQ7QUFDekQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSCwrQ0FBK0M7O0FBRS9DLHVDQUF1QztBQUN2Qzs7QUFFQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7O0FBRXBDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7O0FBRXJELHVDQUF1QztBQUN2Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7O0FBRXhDOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJFQUEyRTs7QUFFM0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1RUFBdUU7QUFDdkU7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRTtBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDs7QUFFN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSx5RUFBeUU7QUFDekU7QUFDQTs7QUFFQSw2Q0FBNkM7QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOzs7QUFHRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDs7QUFFL0Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOzs7QUFHTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrREFBK0Q7O0FBRS9EO0FBQ0Esa0NBQWtDOztBQUVsQzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLO0FBQ0wscUJBQXFCLHdCQUF3QjtBQUM3QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwrREFBK0QsT0FBTzs7QUFFdEU7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHNDQUFzQztBQUN0QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0NBQXNDO0FBQ3RDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBLElBQUk7OztBQUdKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUZBQW1GOztBQUVuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsaU1BQWlNLGNBQWM7QUFDL007QUFDQSxHQUFHOzs7QUFHSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQLGlEQUFpRDtBQUNqRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSwyQkFBMkI7O0FBRTNCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCx5QkFBeUI7QUFDekI7QUFDQSxTQUFTO0FBQ1QseUJBQXlCO0FBQ3pCO0FBQ0EsU0FBUztBQUNULGtDQUFrQztBQUNsQztBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwREFBMEQ7O0FBRTFEO0FBQ0E7O0FBRUE7QUFDQSx3REFBd0Q7QUFDeEQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVksa0JBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOzs7QUFHakI7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtRUFBbUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2IsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsRUFBRTtBQUNiLFdBQVcsRUFBRTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QjtBQUN4QjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssRUFBRTs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsRUFBRTtBQUNiLFdBQVcsT0FBTztBQUNsQixXQUFXLE9BQU87QUFDbEI7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQiwyREFBMkQsU0FBUztBQUNwRSx5QkFBeUIsU0FBUztBQUNsQztBQUNBLGFBQWEsU0FBUztBQUN0Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixZQUFZLFFBQVE7QUFDcEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsRUFBRTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDREQUE0RDtBQUM1RDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEVBQUU7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLEVBQUU7QUFDYixXQUFXLGNBQWM7QUFDekIsV0FBVyxFQUFFO0FBQ2IsV0FBVyxFQUFFO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEVBQUU7QUFDYjtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxFQUFFOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEVBQUU7QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBOztBQUVBLDJCQUEyQjs7QUFFM0I7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOzs7QUFHTDtBQUNBLHlDQUF5QztBQUN6Qzs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7O0FBRVI7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQSxTQUFTO0FBQ1Qsd0JBQXdCO0FBQ3hCO0FBQ0EsU0FBUztBQUNULHdCQUF3QjtBQUN4QjtBQUNBLFNBQVM7QUFDVCx5QkFBeUI7QUFDekI7QUFDQSxTQUFTO0FBQ1QseUJBQXlCO0FBQ3pCO0FBQ0EsU0FBUztBQUNULGtDQUFrQztBQUNsQztBQUNBLFNBQVM7QUFDVCw0QkFBNEI7QUFDNUI7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUs7OztBQUdMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwwREFBMEQ7O0FBRTFEO0FBQ0E7O0FBRUE7QUFDQSwwREFBMEQ7QUFDMUQ7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVksa0JBQWtCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCOzs7QUFHakI7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7OztBQUdIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkJBQTZCO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwSEFBMEg7QUFDMUg7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxtRUFBbUU7O0FBRW5FO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsRUFBRTtBQUNiOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwwREFBMEQ7QUFDMUQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEVBQUU7QUFDYjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4Qjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLDJDQUEyQzs7QUFFM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4Qjs7O0FBR0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixpQkFBaUI7QUFDcEM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHFEQUFxRDtBQUNyRDs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBLG1CQUFtQixzQkFBc0I7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSzs7O0FBR0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixzQkFBc0I7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSx1Q0FBdUM7QUFDdkM7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7Ozs7Ozs7Ozs7O0FDNXhFYTs7QUFFYixJQUFJLEtBQXFDLEVBQUUsRUFFMUM7QUFDRCxtQkFBbUIsbUJBQU8sQ0FBQyxpRkFBNEI7QUFDdkQ7Ozs7Ozs7Ozs7Ozs7QUNOYTs7QUFFYixJQUFJLEtBQXFDLEVBQUUsRUFFMUM7QUFDRCxtQkFBbUIsbUJBQU8sQ0FBQyxpSEFBNEM7QUFDdkU7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkLEtBQUs7QUFDTCxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFdBQVc7QUFDbkQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUztBQUNUO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQ0FBb0MsY0FBYztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxpQ0FBaUMsa0JBQWtCO0FBQ25EO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUI7O0FBRWpCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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RUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOzs7QUFHQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUMxVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFYTs7QUFFYixJQUFJLElBQXFDO0FBQ3pDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLDhCQUE4Qjs7QUFFOUI7QUFDQSxtQkFBbUI7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOzs7QUFHTjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0M7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1DQUFtQzs7QUFFbkMsb0NBQW9DOztBQUVwQztBQUNBO0FBQ0EsaUNBQWlDOztBQUVqQyw4Q0FBOEM7O0FBRTlDO0FBQ0Esb0JBQW9COztBQUVwQixzQkFBc0I7QUFDdEI7QUFDQSwwQ0FBMEM7O0FBRTFDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7O0FBR0g7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FB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QTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQVAsZSIsImZpbGUiOiJzdGF0aWMvY2h1bmtzL3BhZ2VzL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn0iLCJmdW5jdGlvbiBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIGtleSwgYXJnKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVqZWN0KGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaW5mby5kb25lKSB7XG4gICAgcmVzb2x2ZSh2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQodW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfTtcbn0iLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBrZXkgPSBzb3VyY2VLZXlzW2ldO1xuICAgIGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7XG4gICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcbiIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJhYmkvNS4wLjEyXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2V0aGVyZXVtL3dpa2kvd2lraS9FdGhlcmV1bS1Db250cmFjdC1BQklcbmltcG9ydCB7IGFycmF5aWZ5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBSZWFkZXIsIFdyaXRlciB9IGZyb20gXCIuL2NvZGVycy9hYnN0cmFjdC1jb2RlclwiO1xuaW1wb3J0IHsgQWRkcmVzc0NvZGVyIH0gZnJvbSBcIi4vY29kZXJzL2FkZHJlc3NcIjtcbmltcG9ydCB7IEFycmF5Q29kZXIgfSBmcm9tIFwiLi9jb2RlcnMvYXJyYXlcIjtcbmltcG9ydCB7IEJvb2xlYW5Db2RlciB9IGZyb20gXCIuL2NvZGVycy9ib29sZWFuXCI7XG5pbXBvcnQgeyBCeXRlc0NvZGVyIH0gZnJvbSBcIi4vY29kZXJzL2J5dGVzXCI7XG5pbXBvcnQgeyBGaXhlZEJ5dGVzQ29kZXIgfSBmcm9tIFwiLi9jb2RlcnMvZml4ZWQtYnl0ZXNcIjtcbmltcG9ydCB7IE51bGxDb2RlciB9IGZyb20gXCIuL2NvZGVycy9udWxsXCI7XG5pbXBvcnQgeyBOdW1iZXJDb2RlciB9IGZyb20gXCIuL2NvZGVycy9udW1iZXJcIjtcbmltcG9ydCB7IFN0cmluZ0NvZGVyIH0gZnJvbSBcIi4vY29kZXJzL3N0cmluZ1wiO1xuaW1wb3J0IHsgVHVwbGVDb2RlciB9IGZyb20gXCIuL2NvZGVycy90dXBsZVwiO1xuaW1wb3J0IHsgUGFyYW1UeXBlIH0gZnJvbSBcIi4vZnJhZ21lbnRzXCI7XG5jb25zdCBwYXJhbVR5cGVCeXRlcyA9IG5ldyBSZWdFeHAoL15ieXRlcyhbMC05XSopJC8pO1xuY29uc3QgcGFyYW1UeXBlTnVtYmVyID0gbmV3IFJlZ0V4cCgvXih1P2ludCkoWzAtOV0qKSQvKTtcbmV4cG9ydCBjbGFzcyBBYmlDb2RlciB7XG4gICAgY29uc3RydWN0b3IoY29lcmNlRnVuYykge1xuICAgICAgICBsb2dnZXIuY2hlY2tOZXcobmV3LnRhcmdldCwgQWJpQ29kZXIpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImNvZXJjZUZ1bmNcIiwgY29lcmNlRnVuYyB8fCBudWxsKTtcbiAgICB9XG4gICAgX2dldENvZGVyKHBhcmFtKSB7XG4gICAgICAgIHN3aXRjaCAocGFyYW0uYmFzZVR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjYXNlIFwiYm9vbFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQm9vbGVhbkNvZGVyKHBhcmFtLm5hbWUpO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjYXNlIFwiYnl0ZXNcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVzQ29kZXIocGFyYW0ubmFtZSk7XG4gICAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5Q29kZXIodGhpcy5fZ2V0Q29kZXIocGFyYW0uYXJyYXlDaGlsZHJlbiksIHBhcmFtLmFycmF5TGVuZ3RoLCBwYXJhbS5uYW1lKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0dXBsZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGVDb2RlcigocGFyYW0uY29tcG9uZW50cyB8fCBbXSkubWFwKChjb21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENvZGVyKGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSksIHBhcmFtLm5hbWUpO1xuICAgICAgICAgICAgY2FzZSBcIlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbENvZGVyKHBhcmFtLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHU/aW50WzAtOV0qXG4gICAgICAgIGxldCBtYXRjaCA9IHBhcmFtLnR5cGUubWF0Y2gocGFyYW1UeXBlTnVtYmVyKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHBhcnNlSW50KG1hdGNoWzJdIHx8IFwiMjU2XCIpO1xuICAgICAgICAgICAgaWYgKHNpemUgPT09IDAgfHwgc2l6ZSA+IDI1NiB8fCAoc2l6ZSAlIDgpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgXCIgKyBtYXRjaFsxXSArIFwiIGJpdCBsZW5ndGhcIiwgXCJwYXJhbVwiLCBwYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlckNvZGVyKHNpemUgLyA4LCAobWF0Y2hbMV0gPT09IFwiaW50XCIpLCBwYXJhbS5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBieXRlc1swLTldK1xuICAgICAgICBtYXRjaCA9IHBhcmFtLnR5cGUubWF0Y2gocGFyYW1UeXBlQnl0ZXMpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGxldCBzaXplID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICAgICAgaWYgKHNpemUgPT09IDAgfHwgc2l6ZSA+IDMyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYnl0ZXMgbGVuZ3RoXCIsIFwicGFyYW1cIiwgcGFyYW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGaXhlZEJ5dGVzQ29kZXIoc2l6ZSwgcGFyYW0ubmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIHR5cGVcIiwgXCJ0eXBlXCIsIHBhcmFtLnR5cGUpO1xuICAgIH1cbiAgICBfZ2V0V29yZFNpemUoKSB7IHJldHVybiAzMjsgfVxuICAgIF9nZXRSZWFkZXIoZGF0YSwgYWxsb3dMb29zZSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlYWRlcihkYXRhLCB0aGlzLl9nZXRXb3JkU2l6ZSgpLCB0aGlzLmNvZXJjZUZ1bmMsIGFsbG93TG9vc2UpO1xuICAgIH1cbiAgICBfZ2V0V3JpdGVyKCkge1xuICAgICAgICByZXR1cm4gbmV3IFdyaXRlcih0aGlzLl9nZXRXb3JkU2l6ZSgpKTtcbiAgICB9XG4gICAgZ2V0RGVmYXVsdFZhbHVlKHR5cGVzKSB7XG4gICAgICAgIGNvbnN0IGNvZGVycyA9IHR5cGVzLm1hcCgodHlwZSkgPT4gdGhpcy5fZ2V0Q29kZXIoUGFyYW1UeXBlLmZyb20odHlwZSkpKTtcbiAgICAgICAgY29uc3QgY29kZXIgPSBuZXcgVHVwbGVDb2Rlcihjb2RlcnMsIFwiX1wiKTtcbiAgICAgICAgcmV0dXJuIGNvZGVyLmRlZmF1bHRWYWx1ZSgpO1xuICAgIH1cbiAgICBlbmNvZGUodHlwZXMsIHZhbHVlcykge1xuICAgICAgICBpZiAodHlwZXMubGVuZ3RoICE9PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInR5cGVzL3ZhbHVlcyBsZW5ndGggbWlzbWF0Y2hcIiwgTG9nZ2VyLmVycm9ycy5JTlZBTElEX0FSR1VNRU5ULCB7XG4gICAgICAgICAgICAgICAgY291bnQ6IHsgdHlwZXM6IHR5cGVzLmxlbmd0aCwgdmFsdWVzOiB2YWx1ZXMubGVuZ3RoIH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IHsgdHlwZXM6IHR5cGVzLCB2YWx1ZXM6IHZhbHVlcyB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlcnMgPSB0eXBlcy5tYXAoKHR5cGUpID0+IHRoaXMuX2dldENvZGVyKFBhcmFtVHlwZS5mcm9tKHR5cGUpKSk7XG4gICAgICAgIGNvbnN0IGNvZGVyID0gKG5ldyBUdXBsZUNvZGVyKGNvZGVycywgXCJfXCIpKTtcbiAgICAgICAgY29uc3Qgd3JpdGVyID0gdGhpcy5fZ2V0V3JpdGVyKCk7XG4gICAgICAgIGNvZGVyLmVuY29kZSh3cml0ZXIsIHZhbHVlcyk7XG4gICAgICAgIHJldHVybiB3cml0ZXIuZGF0YTtcbiAgICB9XG4gICAgZGVjb2RlKHR5cGVzLCBkYXRhLCBsb29zZSkge1xuICAgICAgICBjb25zdCBjb2RlcnMgPSB0eXBlcy5tYXAoKHR5cGUpID0+IHRoaXMuX2dldENvZGVyKFBhcmFtVHlwZS5mcm9tKHR5cGUpKSk7XG4gICAgICAgIGNvbnN0IGNvZGVyID0gbmV3IFR1cGxlQ29kZXIoY29kZXJzLCBcIl9cIik7XG4gICAgICAgIHJldHVybiBjb2Rlci5kZWNvZGUodGhpcy5fZ2V0UmVhZGVyKGFycmF5aWZ5KGRhdGEpLCBsb29zZSkpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBkZWZhdWx0QWJpQ29kZXIgPSBuZXcgQWJpQ29kZXIoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFiaS1jb2Rlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBjb25jYXQsIGhleENvbmNhdCwgaGV4bGlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2JpZ251bWJlclwiO1xuaW1wb3J0IHsgZGVmaW5lUmVhZE9ubHkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1Jlc3VsdEVycm9ycyhyZXN1bHQpIHtcbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBlcnJvciAoaWYgYW55KVxuICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgIGNvbnN0IGNoZWNrRXJyb3JzID0gZnVuY3Rpb24gKHBhdGgsIG9iamVjdCkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IHBhdGguc2xpY2UoKTtcbiAgICAgICAgICAgIGNoaWxkUGF0aC5wdXNoKGtleSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKGNoaWxkUGF0aCwgb2JqZWN0W2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBwYXRoOiBjaGlsZFBhdGgsIGVycm9yOiBlcnJvciB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY2hlY2tFcnJvcnMoW10sIHJlc3VsdCk7XG4gICAgcmV0dXJuIGVycm9ycztcbn1cbmV4cG9ydCBjbGFzcyBDb2RlciB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgdHlwZSwgbG9jYWxOYW1lLCBkeW5hbWljKSB7XG4gICAgICAgIC8vIEBUT0RPOiBkZWZpbmVSZWFkT25seSB0aGVzZVxuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTtcbiAgICAgICAgdGhpcy5keW5hbWljID0gZHluYW1pYztcbiAgICB9XG4gICAgX3Rocm93RXJyb3IobWVzc2FnZSwgdmFsdWUpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihtZXNzYWdlLCB0aGlzLmxvY2FsTmFtZSwgdmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdvcmRTaXplKSB7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwid29yZFNpemVcIiwgd29yZFNpemUgfHwgMzIpO1xuICAgICAgICB0aGlzLl9kYXRhID0gW107XG4gICAgICAgIHRoaXMuX2RhdGFMZW5ndGggPSAwO1xuICAgICAgICB0aGlzLl9wYWRkaW5nID0gbmV3IFVpbnQ4QXJyYXkod29yZFNpemUpO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIGhleENvbmNhdCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgZ2V0IGxlbmd0aCgpIHsgcmV0dXJuIHRoaXMuX2RhdGFMZW5ndGg7IH1cbiAgICBfd3JpdGVEYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGF0YS5wdXNoKGRhdGEpO1xuICAgICAgICB0aGlzLl9kYXRhTGVuZ3RoICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGg7XG4gICAgfVxuICAgIGFwcGVuZFdyaXRlcih3cml0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlRGF0YShjb25jYXQod3JpdGVyLl9kYXRhKSk7XG4gICAgfVxuICAgIC8vIEFycmF5aXNoIGl0ZW1zOyBwYWRkZWQgb24gdGhlIHJpZ2h0IHRvIHdvcmRTaXplXG4gICAgd3JpdGVCeXRlcyh2YWx1ZSkge1xuICAgICAgICBsZXQgYnl0ZXMgPSBhcnJheWlmeSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdPZmZzZXQgPSBieXRlcy5sZW5ndGggJSB0aGlzLndvcmRTaXplO1xuICAgICAgICBpZiAocGFkZGluZ09mZnNldCkge1xuICAgICAgICAgICAgYnl0ZXMgPSBjb25jYXQoW2J5dGVzLCB0aGlzLl9wYWRkaW5nLnNsaWNlKHBhZGRpbmdPZmZzZXQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlRGF0YShieXRlcyk7XG4gICAgfVxuICAgIF9nZXRWYWx1ZSh2YWx1ZSkge1xuICAgICAgICBsZXQgYnl0ZXMgPSBhcnJheWlmeShCaWdOdW1iZXIuZnJvbSh2YWx1ZSkpO1xuICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gdGhpcy53b3JkU2l6ZSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJ2YWx1ZSBvdXQtb2YtYm91bmRzXCIsIExvZ2dlci5lcnJvcnMuQlVGRkVSX09WRVJSVU4sIHtcbiAgICAgICAgICAgICAgICBsZW5ndGg6IHRoaXMud29yZFNpemUsXG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBieXRlcy5sZW5ndGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggJSB0aGlzLndvcmRTaXplKSB7XG4gICAgICAgICAgICBieXRlcyA9IGNvbmNhdChbdGhpcy5fcGFkZGluZy5zbGljZShieXRlcy5sZW5ndGggJSB0aGlzLndvcmRTaXplKSwgYnl0ZXNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICAgIC8vIEJpZ051bWJlcmlzaCBpdGVtczsgcGFkZGVkIG9uIHRoZSBsZWZ0IHRvIHdvcmRTaXplXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGVEYXRhKHRoaXMuX2dldFZhbHVlKHZhbHVlKSk7XG4gICAgfVxuICAgIHdyaXRlVXBkYXRhYmxlVmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuX2RhdGEubGVuZ3RoO1xuICAgICAgICB0aGlzLl9kYXRhLnB1c2godGhpcy5fcGFkZGluZyk7XG4gICAgICAgIHRoaXMuX2RhdGFMZW5ndGggKz0gdGhpcy53b3JkU2l6ZTtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fZGF0YVtvZmZzZXRdID0gdGhpcy5fZ2V0VmFsdWUodmFsdWUpO1xuICAgICAgICB9O1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIHdvcmRTaXplLCBjb2VyY2VGdW5jLCBhbGxvd0xvb3NlKSB7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2RhdGFcIiwgYXJyYXlpZnkoZGF0YSkpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIndvcmRTaXplXCIsIHdvcmRTaXplIHx8IDMyKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfY29lcmNlRnVuY1wiLCBjb2VyY2VGdW5jKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJhbGxvd0xvb3NlXCIsIGFsbG93TG9vc2UpO1xuICAgICAgICB0aGlzLl9vZmZzZXQgPSAwO1xuICAgIH1cbiAgICBnZXQgZGF0YSgpIHsgcmV0dXJuIGhleGxpZnkodGhpcy5fZGF0YSk7IH1cbiAgICBnZXQgY29uc3VtZWQoKSB7IHJldHVybiB0aGlzLl9vZmZzZXQ7IH1cbiAgICAvLyBUaGUgZGVmYXVsdCBDb2VyY2UgZnVuY3Rpb25cbiAgICBzdGF0aWMgY29lcmNlKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUubWF0Y2goXCJedT9pbnQoWzAtOV0rKSRcIik7XG4gICAgICAgIGlmIChtYXRjaCAmJiBwYXJzZUludChtYXRjaFsxXSkgPD0gNDgpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9OdW1iZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNvZXJjZShuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5fY29lcmNlRnVuYykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvZXJjZUZ1bmMobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWFkZXIuY29lcmNlKG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgX3BlZWtCeXRlcyhvZmZzZXQsIGxlbmd0aCwgbG9vc2UpIHtcbiAgICAgICAgbGV0IGFsaWduZWRMZW5ndGggPSBNYXRoLmNlaWwobGVuZ3RoIC8gdGhpcy53b3JkU2l6ZSkgKiB0aGlzLndvcmRTaXplO1xuICAgICAgICBpZiAodGhpcy5fb2Zmc2V0ICsgYWxpZ25lZExlbmd0aCA+IHRoaXMuX2RhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvd0xvb3NlICYmIGxvb3NlICYmIHRoaXMuX29mZnNldCArIGxlbmd0aCA8PSB0aGlzLl9kYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFsaWduZWRMZW5ndGggPSBsZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImRhdGEgb3V0LW9mLWJvdW5kc1wiLCBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOLCB7XG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpcy5fZGF0YS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldDogdGhpcy5fb2Zmc2V0ICsgYWxpZ25lZExlbmd0aFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhLnNsaWNlKHRoaXMuX29mZnNldCwgdGhpcy5fb2Zmc2V0ICsgYWxpZ25lZExlbmd0aCk7XG4gICAgfVxuICAgIHN1YlJlYWRlcihvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZWFkZXIodGhpcy5fZGF0YS5zbGljZSh0aGlzLl9vZmZzZXQgKyBvZmZzZXQpLCB0aGlzLndvcmRTaXplLCB0aGlzLl9jb2VyY2VGdW5jLCB0aGlzLmFsbG93TG9vc2UpO1xuICAgIH1cbiAgICByZWFkQnl0ZXMobGVuZ3RoLCBsb29zZSkge1xuICAgICAgICBsZXQgYnl0ZXMgPSB0aGlzLl9wZWVrQnl0ZXMoMCwgbGVuZ3RoLCAhIWxvb3NlKTtcbiAgICAgICAgdGhpcy5fb2Zmc2V0ICs9IGJ5dGVzLmxlbmd0aDtcbiAgICAgICAgLy8gQFRPRE86IE1ha2Ugc3VyZSB0aGUgbGVuZ3RoLi5lbmQgYnl0ZXMgYXJlIGFsbCAwP1xuICAgICAgICByZXR1cm4gYnl0ZXMuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICB9XG4gICAgcmVhZFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gQmlnTnVtYmVyLmZyb20odGhpcy5yZWFkQnl0ZXModGhpcy53b3JkU2l6ZSkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFic3RyYWN0LWNvZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBoZXhaZXJvUGFkIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBDb2RlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyXCI7XG5leHBvcnQgY2xhc3MgQWRkcmVzc0NvZGVyIGV4dGVuZHMgQ29kZXIge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsTmFtZSkge1xuICAgICAgICBzdXBlcihcImFkZHJlc3NcIiwgXCJhZGRyZXNzXCIsIGxvY2FsTmFtZSwgZmFsc2UpO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZ2V0QWRkcmVzcyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl90aHJvd0Vycm9yKGVycm9yLm1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JpdGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICBkZWNvZGUocmVhZGVyKSB7XG4gICAgICAgIHJldHVybiBnZXRBZGRyZXNzKGhleFplcm9QYWQocmVhZGVyLnJlYWRWYWx1ZSgpLnRvSGV4U3RyaW5nKCksIDIwKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YWRkcmVzcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IENvZGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXJcIjtcbi8vIENsb25lcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBleGlzdGluZyBDb2RlciwgYnV0IHdpdGhvdXQgYSBsb2NhbE5hbWVcbmV4cG9ydCBjbGFzcyBBbm9ueW1vdXNDb2RlciBleHRlbmRzIENvZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2Rlcikge1xuICAgICAgICBzdXBlcihjb2Rlci5uYW1lLCBjb2Rlci50eXBlLCB1bmRlZmluZWQsIGNvZGVyLmR5bmFtaWMpO1xuICAgICAgICB0aGlzLmNvZGVyID0gY29kZXI7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29kZXIuZGVmYXVsdFZhbHVlKCk7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvZGVyLmVuY29kZSh3cml0ZXIsIHZhbHVlKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2Rlci5kZWNvZGUocmVhZGVyKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbm9ueW1vdXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4uL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuaW1wb3J0IHsgQ29kZXIsIFdyaXRlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyXCI7XG5pbXBvcnQgeyBBbm9ueW1vdXNDb2RlciB9IGZyb20gXCIuL2Fub255bW91c1wiO1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2sod3JpdGVyLCBjb2RlcnMsIHZhbHVlcykge1xuICAgIGxldCBhcnJheVZhbHVlcyA9IG51bGw7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICBhcnJheVZhbHVlcyA9IHZhbHVlcztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWVzICYmIHR5cGVvZiAodmFsdWVzKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBsZXQgdW5pcXVlID0ge307XG4gICAgICAgIGFycmF5VmFsdWVzID0gY29kZXJzLm1hcCgoY29kZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb2Rlci5sb2NhbE5hbWU7XG4gICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCBlbmNvZGUgb2JqZWN0IGZvciBzaWduYXR1cmUgd2l0aCBtaXNzaW5nIG5hbWVzXCIsIExvZ2dlci5lcnJvcnMuSU5WQUxJRF9BUkdVTUVOVCwge1xuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDogXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgY29kZXI6IGNvZGVyLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodW5pcXVlW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJjYW5ub3QgZW5jb2RlIG9iamVjdCBmb3Igc2lnbmF0dXJlIHdpdGggZHVwbGljYXRlIG5hbWVzXCIsIExvZ2dlci5lcnJvcnMuSU5WQUxJRF9BUkdVTUVOVCwge1xuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDogXCJ2YWx1ZXNcIixcbiAgICAgICAgICAgICAgICAgICAgY29kZXI6IGNvZGVyLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1bmlxdWVbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1tuYW1lXTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCB0dXBsZSB2YWx1ZVwiLCBcInR1cGxlXCIsIHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChjb2RlcnMubGVuZ3RoICE9PSBhcnJheVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInR5cGVzL3ZhbHVlIGxlbmd0aCBtaXNtYXRjaFwiLCBcInR1cGxlXCIsIHZhbHVlcyk7XG4gICAgfVxuICAgIGxldCBzdGF0aWNXcml0ZXIgPSBuZXcgV3JpdGVyKHdyaXRlci53b3JkU2l6ZSk7XG4gICAgbGV0IGR5bmFtaWNXcml0ZXIgPSBuZXcgV3JpdGVyKHdyaXRlci53b3JkU2l6ZSk7XG4gICAgbGV0IHVwZGF0ZUZ1bmNzID0gW107XG4gICAgY29kZXJzLmZvckVhY2goKGNvZGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBhcnJheVZhbHVlc1tpbmRleF07XG4gICAgICAgIGlmIChjb2Rlci5keW5hbWljKSB7XG4gICAgICAgICAgICAvLyBHZXQgY3VycmVudCBkeW5hbWljIG9mZnNldCAoZm9yIHRoZSBmdXR1cmUgcG9pbnRlcilcbiAgICAgICAgICAgIGxldCBkeW5hbWljT2Zmc2V0ID0gZHluYW1pY1dyaXRlci5sZW5ndGg7XG4gICAgICAgICAgICAvLyBFbmNvZGUgdGhlIGR5bmFtaWMgdmFsdWUgaW50byB0aGUgZHluYW1pY1dyaXRlclxuICAgICAgICAgICAgY29kZXIuZW5jb2RlKGR5bmFtaWNXcml0ZXIsIHZhbHVlKTtcbiAgICAgICAgICAgIC8vIFByZXBhcmUgdG8gcG9wdWxhdGUgdGhlIGNvcnJlY3Qgb2Zmc2V0IG9uY2Ugd2UgYXJlIGRvbmVcbiAgICAgICAgICAgIGxldCB1cGRhdGVGdW5jID0gc3RhdGljV3JpdGVyLndyaXRlVXBkYXRhYmxlVmFsdWUoKTtcbiAgICAgICAgICAgIHVwZGF0ZUZ1bmNzLnB1c2goKGJhc2VPZmZzZXQpID0+IHtcbiAgICAgICAgICAgICAgICB1cGRhdGVGdW5jKGJhc2VPZmZzZXQgKyBkeW5hbWljT2Zmc2V0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29kZXIuZW5jb2RlKHN0YXRpY1dyaXRlciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gQmFja2ZpbGwgYWxsIHRoZSBkeW5hbWljIG9mZnNldHMsIG5vdyB0aGF0IHdlIGtub3cgdGhlIHN0YXRpYyBsZW5ndGhcbiAgICB1cGRhdGVGdW5jcy5mb3JFYWNoKChmdW5jKSA9PiB7IGZ1bmMoc3RhdGljV3JpdGVyLmxlbmd0aCk7IH0pO1xuICAgIGxldCBsZW5ndGggPSB3cml0ZXIuYXBwZW5kV3JpdGVyKHN0YXRpY1dyaXRlcik7XG4gICAgbGVuZ3RoICs9IHdyaXRlci5hcHBlbmRXcml0ZXIoZHluYW1pY1dyaXRlcik7XG4gICAgcmV0dXJuIGxlbmd0aDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2socmVhZGVyLCBjb2RlcnMpIHtcbiAgICBsZXQgdmFsdWVzID0gW107XG4gICAgLy8gQSByZWFkZXIgYW5jaG9yZWQgdG8gdGhpcyBiYXNlXG4gICAgbGV0IGJhc2VSZWFkZXIgPSByZWFkZXIuc3ViUmVhZGVyKDApO1xuICAgIGNvZGVycy5mb3JFYWNoKChjb2RlcikgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgICAgICBpZiAoY29kZXIuZHluYW1pYykge1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IHJlYWRlci5yZWFkVmFsdWUoKTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRSZWFkZXIgPSBiYXNlUmVhZGVyLnN1YlJlYWRlcihvZmZzZXQudG9OdW1iZXIoKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gY29kZXIuZGVjb2RlKG9mZnNldFJlYWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBDYW5ub3QgcmVjb3ZlciBmcm9tIHRoaXNcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gTG9nZ2VyLmVycm9ycy5CVUZGRVJfT1ZFUlJVTikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB2YWx1ZS5iYXNlVHlwZSA9IGNvZGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9IGNvZGVyLmxvY2FsTmFtZTtcbiAgICAgICAgICAgICAgICB2YWx1ZS50eXBlID0gY29kZXIudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBjb2Rlci5kZWNvZGUocmVhZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIC8vIENhbm5vdCByZWNvdmVyIGZyb20gdGhpc1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHZhbHVlLmJhc2VUeXBlID0gY29kZXIubmFtZTtcbiAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gY29kZXIubG9jYWxOYW1lO1xuICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUgPSBjb2Rlci50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFdlIG9ubHkgb3V0cHV0IG5hbWVkIHByb3BlcnRpZXMgZm9yIHVuaXF1ZWx5IG5hbWVkIGNvZGVyc1xuICAgIGNvbnN0IHVuaXF1ZU5hbWVzID0gY29kZXJzLnJlZHVjZSgoYWNjdW0sIGNvZGVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBjb2Rlci5sb2NhbE5hbWU7XG4gICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBpZiAoIWFjY3VtW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgYWNjdW1bbmFtZV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNjdW1bbmFtZV0rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwge30pO1xuICAgIC8vIEFkZCBhbnkgbmFtZWQgcGFyYW1ldGVycyAoaS5lLiB0dXBsZXMpXG4gICAgY29kZXJzLmZvckVhY2goKGNvZGVyLCBpbmRleCkgPT4ge1xuICAgICAgICBsZXQgbmFtZSA9IGNvZGVyLmxvY2FsTmFtZTtcbiAgICAgICAgaWYgKCFuYW1lIHx8IHVuaXF1ZU5hbWVzW25hbWVdICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIl9sZW5ndGhcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVzW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWVzLCBuYW1lLCB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB7IHRocm93IHZhbHVlOyB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbHVlc1tuYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaV07XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsdWVzLCBpLCB7XG4gICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB7IHRocm93IHZhbHVlOyB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZXMpO1xufVxuZXhwb3J0IGNsYXNzIEFycmF5Q29kZXIgZXh0ZW5kcyBDb2RlciB7XG4gICAgY29uc3RydWN0b3IoY29kZXIsIGxlbmd0aCwgbG9jYWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAoY29kZXIudHlwZSArIFwiW1wiICsgKGxlbmd0aCA+PSAwID8gbGVuZ3RoIDogXCJcIikgKyBcIl1cIik7XG4gICAgICAgIGNvbnN0IGR5bmFtaWMgPSAobGVuZ3RoID09PSAtMSB8fCBjb2Rlci5keW5hbWljKTtcbiAgICAgICAgc3VwZXIoXCJhcnJheVwiLCB0eXBlLCBsb2NhbE5hbWUsIGR5bmFtaWMpO1xuICAgICAgICB0aGlzLmNvZGVyID0gY29kZXI7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIC8vIFZlcmlmaWVzIHRoZSBjaGlsZCBjb2RlciBpcyB2YWxpZCAoZXZlbiBpZiB0aGUgYXJyYXkgaXMgZHluYW1pYyBvciAwLWxlbmd0aClcbiAgICAgICAgY29uc3QgZGVmYXVsdENoaWxkID0gdGhpcy5jb2Rlci5kZWZhdWx0VmFsdWUoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVmYXVsdENoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICB0aGlzLl90aHJvd0Vycm9yKFwiZXhwZWN0ZWQgYXJyYXkgdmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjb3VudCA9IHRoaXMubGVuZ3RoO1xuICAgICAgICBpZiAoY291bnQgPT09IC0xKSB7XG4gICAgICAgICAgICBjb3VudCA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIHdyaXRlci53cml0ZVZhbHVlKHZhbHVlLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLmNoZWNrQXJndW1lbnRDb3VudCh2YWx1ZS5sZW5ndGgsIGNvdW50LCBcImNvZGVyIGFycmF5XCIgKyAodGhpcy5sb2NhbE5hbWUgPyAoXCIgXCIgKyB0aGlzLmxvY2FsTmFtZSkgOiBcIlwiKSk7XG4gICAgICAgIGxldCBjb2RlcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29kZXJzLnB1c2godGhpcy5jb2Rlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhY2sod3JpdGVyLCBjb2RlcnMsIHZhbHVlKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICBsZXQgY291bnQgPSB0aGlzLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvdW50ID09PSAtMSkge1xuICAgICAgICAgICAgY291bnQgPSByZWFkZXIucmVhZFZhbHVlKCkudG9OdW1iZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29kZXJzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29kZXJzLnB1c2gobmV3IEFub255bW91c0NvZGVyKHRoaXMuY29kZXIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVhZGVyLmNvZXJjZSh0aGlzLm5hbWUsIHVucGFjayhyZWFkZXIsIGNvZGVycykpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFycmF5LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgQ29kZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1jb2RlclwiO1xuZXhwb3J0IGNsYXNzIEJvb2xlYW5Db2RlciBleHRlbmRzIENvZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihsb2NhbE5hbWUpIHtcbiAgICAgICAgc3VwZXIoXCJib29sXCIsIFwiYm9vbFwiLCBsb2NhbE5hbWUsIGZhbHNlKTtcbiAgICB9XG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB3cml0ZXIud3JpdGVWYWx1ZSh2YWx1ZSA/IDEgOiAwKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLmNvZXJjZSh0aGlzLnR5cGUsICFyZWFkZXIucmVhZFZhbHVlKCkuaXNaZXJvKCkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJvb2xlYW4uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgaGV4bGlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgQ29kZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC1jb2RlclwiO1xuZXhwb3J0IGNsYXNzIER5bmFtaWNCeXRlc0NvZGVyIGV4dGVuZHMgQ29kZXIge1xuICAgIGNvbnN0cnVjdG9yKHR5cGUsIGxvY2FsTmFtZSkge1xuICAgICAgICBzdXBlcih0eXBlLCB0eXBlLCBsb2NhbE5hbWUsIHRydWUpO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBcIjB4XCI7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIHZhbHVlKSB7XG4gICAgICAgIHZhbHVlID0gYXJyYXlpZnkodmFsdWUpO1xuICAgICAgICBsZXQgbGVuZ3RoID0gd3JpdGVyLndyaXRlVmFsdWUodmFsdWUubGVuZ3RoKTtcbiAgICAgICAgbGVuZ3RoICs9IHdyaXRlci53cml0ZUJ5dGVzKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRCeXRlcyhyZWFkZXIucmVhZFZhbHVlKCkudG9OdW1iZXIoKSwgdHJ1ZSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEJ5dGVzQ29kZXIgZXh0ZW5kcyBEeW5hbWljQnl0ZXNDb2RlciB7XG4gICAgY29uc3RydWN0b3IobG9jYWxOYW1lKSB7XG4gICAgICAgIHN1cGVyKFwiYnl0ZXNcIiwgbG9jYWxOYW1lKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLmNvZXJjZSh0aGlzLm5hbWUsIGhleGxpZnkoc3VwZXIuZGVjb2RlKHJlYWRlcikpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ieXRlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBoZXhsaWZ5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBDb2RlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyXCI7XG4vLyBAVE9ETzogTWVyZ2UgdGhpcyB3aXRoIGJ5dGVzXG5leHBvcnQgY2xhc3MgRml4ZWRCeXRlc0NvZGVyIGV4dGVuZHMgQ29kZXIge1xuICAgIGNvbnN0cnVjdG9yKHNpemUsIGxvY2FsTmFtZSkge1xuICAgICAgICBsZXQgbmFtZSA9IFwiYnl0ZXNcIiArIFN0cmluZyhzaXplKTtcbiAgICAgICAgc3VwZXIobmFtZSwgbmFtZSwgbG9jYWxOYW1lLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIChcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiKS5zdWJzdHJpbmcoMCwgMiArIHRoaXMuc2l6ZSAqIDIpO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICBsZXQgZGF0YSA9IGFycmF5aWZ5KHZhbHVlKTtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoICE9PSB0aGlzLnNpemUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IoXCJpbmNvcnJlY3QgZGF0YSBsZW5ndGhcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIud3JpdGVCeXRlcyhkYXRhKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLmNvZXJjZSh0aGlzLm5hbWUsIGhleGxpZnkocmVhZGVyLnJlYWRCeXRlcyh0aGlzLnNpemUpKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Zml4ZWQtYnl0ZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBDb2RlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyXCI7XG5leHBvcnQgY2xhc3MgTnVsbENvZGVyIGV4dGVuZHMgQ29kZXIge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsTmFtZSkge1xuICAgICAgICBzdXBlcihcIm51bGxcIiwgXCJcIiwgbG9jYWxOYW1lLCBmYWxzZSk7XG4gICAgfVxuICAgIGRlZmF1bHRWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl90aHJvd0Vycm9yKFwibm90IG51bGxcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIud3JpdGVCeXRlcyhbXSk7XG4gICAgfVxuICAgIGRlY29kZShyZWFkZXIpIHtcbiAgICAgICAgcmVhZGVyLnJlYWRCeXRlcygwKTtcbiAgICAgICAgcmV0dXJuIHJlYWRlci5jb2VyY2UodGhpcy5uYW1lLCBudWxsKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1udWxsLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2JpZ251bWJlclwiO1xuaW1wb3J0IHsgTWF4VWludDI1NiwgTmVnYXRpdmVPbmUsIE9uZSwgWmVybyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvZGVyIH0gZnJvbSBcIi4vYWJzdHJhY3QtY29kZXJcIjtcbmV4cG9ydCBjbGFzcyBOdW1iZXJDb2RlciBleHRlbmRzIENvZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzaXplLCBzaWduZWQsIGxvY2FsTmFtZSkge1xuICAgICAgICBjb25zdCBuYW1lID0gKChzaWduZWQgPyBcImludFwiIDogXCJ1aW50XCIpICsgKHNpemUgKiA4KSk7XG4gICAgICAgIHN1cGVyKG5hbWUsIG5hbWUsIGxvY2FsTmFtZSwgZmFsc2UpO1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLnNpZ25lZCA9IHNpZ25lZDtcbiAgICB9XG4gICAgZGVmYXVsdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgZW5jb2RlKHdyaXRlciwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHYgPSBCaWdOdW1iZXIuZnJvbSh2YWx1ZSk7XG4gICAgICAgIC8vIENoZWNrIGJvdW5kcyBhcmUgc2FmZSBmb3IgZW5jb2RpbmdcbiAgICAgICAgbGV0IG1heFVpbnRWYWx1ZSA9IE1heFVpbnQyNTYubWFzayh3cml0ZXIud29yZFNpemUgKiA4KTtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmVkKSB7XG4gICAgICAgICAgICBsZXQgYm91bmRzID0gbWF4VWludFZhbHVlLm1hc2sodGhpcy5zaXplICogOCAtIDEpO1xuICAgICAgICAgICAgaWYgKHYuZ3QoYm91bmRzKSB8fCB2Lmx0KGJvdW5kcy5hZGQoT25lKS5tdWwoTmVnYXRpdmVPbmUpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93RXJyb3IoXCJ2YWx1ZSBvdXQtb2YtYm91bmRzXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2Lmx0KFplcm8pIHx8IHYuZ3QobWF4VWludFZhbHVlLm1hc2sodGhpcy5zaXplICogOCkpKSB7XG4gICAgICAgICAgICB0aGlzLl90aHJvd0Vycm9yKFwidmFsdWUgb3V0LW9mLWJvdW5kc1wiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdiA9IHYudG9Ud29zKHRoaXMuc2l6ZSAqIDgpLm1hc2sodGhpcy5zaXplICogOCk7XG4gICAgICAgIGlmICh0aGlzLnNpZ25lZCkge1xuICAgICAgICAgICAgdiA9IHYuZnJvbVR3b3ModGhpcy5zaXplICogOCkudG9Ud29zKDggKiB3cml0ZXIud29yZFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cml0ZXIud3JpdGVWYWx1ZSh2KTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICBsZXQgdmFsdWUgPSByZWFkZXIucmVhZFZhbHVlKCkubWFzayh0aGlzLnNpemUgKiA4KTtcbiAgICAgICAgaWYgKHRoaXMuc2lnbmVkKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmZyb21Ud29zKHRoaXMuc2l6ZSAqIDgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWFkZXIuY29lcmNlKHRoaXMubmFtZSwgdmFsdWUpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW51bWJlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IHRvVXRmOEJ5dGVzLCB0b1V0ZjhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgRHluYW1pY0J5dGVzQ29kZXIgfSBmcm9tIFwiLi9ieXRlc1wiO1xuZXhwb3J0IGNsYXNzIFN0cmluZ0NvZGVyIGV4dGVuZHMgRHluYW1pY0J5dGVzQ29kZXIge1xuICAgIGNvbnN0cnVjdG9yKGxvY2FsTmFtZSkge1xuICAgICAgICBzdXBlcihcInN0cmluZ1wiLCBsb2NhbE5hbWUpO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBlbmNvZGUod3JpdGVyLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gc3VwZXIuZW5jb2RlKHdyaXRlciwgdG9VdGY4Qnl0ZXModmFsdWUpKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gdG9VdGY4U3RyaW5nKHN1cGVyLmRlY29kZShyZWFkZXIpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHJpbmcuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBDb2RlciB9IGZyb20gXCIuL2Fic3RyYWN0LWNvZGVyXCI7XG5pbXBvcnQgeyBwYWNrLCB1bnBhY2sgfSBmcm9tIFwiLi9hcnJheVwiO1xuZXhwb3J0IGNsYXNzIFR1cGxlQ29kZXIgZXh0ZW5kcyBDb2RlciB7XG4gICAgY29uc3RydWN0b3IoY29kZXJzLCBsb2NhbE5hbWUpIHtcbiAgICAgICAgbGV0IGR5bmFtaWMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBbXTtcbiAgICAgICAgY29kZXJzLmZvckVhY2goKGNvZGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZXIuZHluYW1pYykge1xuICAgICAgICAgICAgICAgIGR5bmFtaWMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHlwZXMucHVzaChjb2Rlci50eXBlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAoXCJ0dXBsZShcIiArIHR5cGVzLmpvaW4oXCIsXCIpICsgXCIpXCIpO1xuICAgICAgICBzdXBlcihcInR1cGxlXCIsIHR5cGUsIGxvY2FsTmFtZSwgZHluYW1pYyk7XG4gICAgICAgIHRoaXMuY29kZXJzID0gY29kZXJzO1xuICAgIH1cbiAgICBkZWZhdWx0VmFsdWUoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICB0aGlzLmNvZGVycy5mb3JFYWNoKChjb2RlcikgPT4ge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goY29kZXIuZGVmYXVsdFZhbHVlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gV2Ugb25seSBvdXRwdXQgbmFtZWQgcHJvcGVydGllcyBmb3IgdW5pcXVlbHkgbmFtZWQgY29kZXJzXG4gICAgICAgIGNvbnN0IHVuaXF1ZU5hbWVzID0gdGhpcy5jb2RlcnMucmVkdWNlKChhY2N1bSwgY29kZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb2Rlci5sb2NhbE5hbWU7XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgIGlmICghYWNjdW1bbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW1bbmFtZV0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY2N1bVtuYW1lXSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIC8vIEFkZCBuYW1lZCB2YWx1ZXNcbiAgICAgICAgdGhpcy5jb2RlcnMuZm9yRWFjaCgoY29kZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IGNvZGVyLmxvY2FsTmFtZTtcbiAgICAgICAgICAgIGlmICghbmFtZSB8fCB1bmlxdWVOYW1lc1tuYW1lXSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lID09PSBcImxlbmd0aFwiKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9IFwiX2xlbmd0aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlc1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzW25hbWVdID0gdmFsdWVzW2luZGV4XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG4gICAgfVxuICAgIGVuY29kZSh3cml0ZXIsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBwYWNrKHdyaXRlciwgdGhpcy5jb2RlcnMsIHZhbHVlKTtcbiAgICB9XG4gICAgZGVjb2RlKHJlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVhZGVyLmNvZXJjZSh0aGlzLm5hbWUsIHVucGFjayhyZWFkZXIsIHRoaXMuY29kZXJzKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHVwbGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG47XG5jb25zdCBfY29uc3RydWN0b3JHdWFyZCA9IHt9O1xubGV0IE1vZGlmaWVyc0J5dGVzID0geyBjYWxsZGF0YTogdHJ1ZSwgbWVtb3J5OiB0cnVlLCBzdG9yYWdlOiB0cnVlIH07XG5sZXQgTW9kaWZpZXJzTmVzdCA9IHsgY2FsbGRhdGE6IHRydWUsIG1lbW9yeTogdHJ1ZSB9O1xuZnVuY3Rpb24gY2hlY2tNb2RpZmllcih0eXBlLCBuYW1lKSB7XG4gICAgaWYgKHR5cGUgPT09IFwiYnl0ZXNcIiB8fCB0eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChNb2RpZmllcnNCeXRlc1tuYW1lXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gXCJhZGRyZXNzXCIpIHtcbiAgICAgICAgaWYgKG5hbWUgPT09IFwicGF5YWJsZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluZGV4T2YoXCJbXCIpID49IDAgfHwgdHlwZSA9PT0gXCJ0dXBsZVwiKSB7XG4gICAgICAgIGlmIChNb2RpZmllcnNOZXN0W25hbWVdKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoTW9kaWZpZXJzQnl0ZXNbbmFtZV0gfHwgbmFtZSA9PT0gXCJwYXlhYmxlXCIpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgbW9kaWZpZXJcIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4vLyBAVE9ETzogTWFrZSBzdXJlIHRoYXQgY2hpbGRyZW4gb2YgYW4gaW5kZXhlZCB0dXBsZSBhcmUgbWFya2VkIHdpdGggYSBudWxsIGluZGV4ZWRcbmZ1bmN0aW9uIHBhcnNlUGFyYW1UeXBlKHBhcmFtLCBhbGxvd0luZGV4ZWQpIHtcbiAgICBsZXQgb3JpZ2luYWxQYXJhbSA9IHBhcmFtO1xuICAgIGZ1bmN0aW9uIHRocm93RXJyb3IoaSkge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGB1bmV4cGVjdGVkIGNoYXJhY3RlciBhdCBwb3NpdGlvbiAke2l9YCwgXCJwYXJhbVwiLCBwYXJhbSk7XG4gICAgfVxuICAgIHBhcmFtID0gcGFyYW0ucmVwbGFjZSgvXFxzL2csIFwiIFwiKTtcbiAgICBmdW5jdGlvbiBuZXdOb2RlKHBhcmVudCkge1xuICAgICAgICBsZXQgbm9kZSA9IHsgdHlwZTogXCJcIiwgbmFtZTogXCJcIiwgcGFyZW50OiBwYXJlbnQsIHN0YXRlOiB7IGFsbG93VHlwZTogdHJ1ZSB9IH07XG4gICAgICAgIGlmIChhbGxvd0luZGV4ZWQpIHtcbiAgICAgICAgICAgIG5vZGUuaW5kZXhlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICBsZXQgcGFyZW50ID0geyB0eXBlOiBcIlwiLCBuYW1lOiBcIlwiLCBzdGF0ZTogeyBhbGxvd1R5cGU6IHRydWUgfSB9O1xuICAgIGxldCBub2RlID0gcGFyZW50O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGMgPSBwYXJhbVtpXTtcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgICBjYXNlIFwiKFwiOlxuICAgICAgICAgICAgICAgIGlmIChub2RlLnN0YXRlLmFsbG93VHlwZSAmJiBub2RlLnR5cGUgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlID0gXCJ0dXBsZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghbm9kZS5zdGF0ZS5hbGxvd1BhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLnN0YXRlLmFsbG93VHlwZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9IHZlcmlmeVR5cGUobm9kZS50eXBlKTtcbiAgICAgICAgICAgICAgICBub2RlLmNvbXBvbmVudHMgPSBbbmV3Tm9kZShub2RlKV07XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuY29tcG9uZW50c1swXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCIpXCI6XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuc3RhdGU7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubmFtZSA9PT0gXCJpbmRleGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd0luZGV4ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3IoaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbm9kZS5pbmRleGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoZWNrTW9kaWZpZXIobm9kZS50eXBlLCBub2RlLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5vZGUudHlwZSA9IHZlcmlmeVR5cGUobm9kZS50eXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBub2RlO1xuICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvcihpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNoaWxkLnBhcmVudDtcbiAgICAgICAgICAgICAgICBub2RlLnN0YXRlLmFsbG93UGFyYW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbm9kZS5zdGF0ZS5hbGxvd05hbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIG5vZGUuc3RhdGUuYWxsb3dBcnJheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiLFwiOlxuICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnN0YXRlO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm5hbWUgPT09IFwiaW5kZXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dJbmRleGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuaW5kZXhlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaGVja01vZGlmaWVyKG5vZGUudHlwZSwgbm9kZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLnR5cGUgPSB2ZXJpZnlUeXBlKG5vZGUudHlwZSk7XG4gICAgICAgICAgICAgICAgbGV0IHNpYmxpbmcgPSBuZXdOb2RlKG5vZGUucGFyZW50KTtcbiAgICAgICAgICAgICAgICAvL3sgdHlwZTogXCJcIiwgbmFtZTogXCJcIiwgcGFyZW50OiBub2RlLnBhcmVudCwgc3RhdGU6IHsgYWxsb3dUeXBlOiB0cnVlIH0gfTtcbiAgICAgICAgICAgICAgICBub2RlLnBhcmVudC5jb21wb25lbnRzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgIG5vZGUgPSBzaWJsaW5nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gSGl0IGEgc3BhY2UuLi5cbiAgICAgICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgICAgICAgICAgLy8gSWYgcmVhZGluZyB0eXBlLCB0aGUgdHlwZSBpcyBkb25lIGFuZCBtYXkgcmVhZCBhIHBhcmFtIG9yIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5zdGF0ZS5hbGxvd1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlID0gdmVyaWZ5VHlwZShub2RlLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuc3RhdGUuYWxsb3dUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGF0ZS5hbGxvd05hbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zdGF0ZS5hbGxvd1BhcmFtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgcmVhZGluZyBuYW1lLCB0aGUgbmFtZSBpcyBkb25lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuc3RhdGUuYWxsb3dOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5hbWUgPT09IFwiaW5kZXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd0luZGV4ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dFcnJvcihpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5kZXhlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmluZGV4ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGVja01vZGlmaWVyKG5vZGUudHlwZSwgbm9kZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnN0YXRlLmFsbG93TmFtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIltcIjpcbiAgICAgICAgICAgICAgICBpZiAoIW5vZGUuc3RhdGUuYWxsb3dBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLnR5cGUgKz0gYztcbiAgICAgICAgICAgICAgICBub2RlLnN0YXRlLmFsbG93QXJyYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBub2RlLnN0YXRlLmFsbG93TmFtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGUuc3RhdGUucmVhZEFycmF5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJdXCI6XG4gICAgICAgICAgICAgICAgaWYgKCFub2RlLnN0YXRlLnJlYWRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlLnR5cGUgKz0gYztcbiAgICAgICAgICAgICAgICBub2RlLnN0YXRlLnJlYWRBcnJheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIG5vZGUuc3RhdGUuYWxsb3dBcnJheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZS5zdGF0ZS5hbGxvd05hbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5zdGF0ZS5hbGxvd1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlICs9IGM7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhdGUuYWxsb3dQYXJhbXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBub2RlLnN0YXRlLmFsbG93QXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChub2RlLnN0YXRlLmFsbG93TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgKz0gYztcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuc3RhdGUuYWxsb3dBcnJheTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5zdGF0ZS5yZWFkQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlICs9IGM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5wYXJlbnQpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInVuZXhwZWN0ZWQgZW9mXCIsIFwicGFyYW1cIiwgcGFyYW0pO1xuICAgIH1cbiAgICBkZWxldGUgcGFyZW50LnN0YXRlO1xuICAgIGlmIChub2RlLm5hbWUgPT09IFwiaW5kZXhlZFwiKSB7XG4gICAgICAgIGlmICghYWxsb3dJbmRleGVkKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKG9yaWdpbmFsUGFyYW0ubGVuZ3RoIC0gNyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuaW5kZXhlZCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihvcmlnaW5hbFBhcmFtLmxlbmd0aCAtIDcpO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuaW5kZXhlZCA9IHRydWU7XG4gICAgICAgIG5vZGUubmFtZSA9IFwiXCI7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNoZWNrTW9kaWZpZXIobm9kZS50eXBlLCBub2RlLm5hbWUpKSB7XG4gICAgICAgIG5vZGUubmFtZSA9IFwiXCI7XG4gICAgfVxuICAgIHBhcmVudC50eXBlID0gdmVyaWZ5VHlwZShwYXJlbnQudHlwZSk7XG4gICAgcmV0dXJuIHBhcmVudDtcbn1cbmZ1bmN0aW9uIHBvcHVsYXRlKG9iamVjdCwgcGFyYW1zKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHBhcmFtcykge1xuICAgICAgICBkZWZpbmVSZWFkT25seShvYmplY3QsIGtleSwgcGFyYW1zW2tleV0pO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBGb3JtYXRUeXBlcyA9IE9iamVjdC5mcmVlemUoe1xuICAgIC8vIEJhcmUgZm9ybWF0dGluZywgYXMgaXMgbmVlZGVkIGZvciBjb21wdXRpbmcgYSBzaWdoYXNoIG9mIGFuIGV2ZW50IG9yIGZ1bmN0aW9uXG4gICAgc2lnaGFzaDogXCJzaWdoYXNoXCIsXG4gICAgLy8gSHVtYW4tUmVhZGFibGUgd2l0aCBNaW5pbWFsIHNwYWNpbmcgYW5kIHdpdGhvdXQgbmFtZXMgKGNvbXBhY3QgaHVtYW4tcmVhZGFibGUpXG4gICAgbWluaW1hbDogXCJtaW5pbWFsXCIsXG4gICAgLy8gSHVtYW4tUmVhZGJsZSB3aXRoIG5pY2Ugc3BhY2luZywgaW5jbHVkaW5nIGFsbCBuYW1lc1xuICAgIGZ1bGw6IFwiZnVsbFwiLFxuICAgIC8vIEpTT04tZm9ybWF0IGEgbGEgU29saWRpdHlcbiAgICBqc29uOiBcImpzb25cIlxufSk7XG5jb25zdCBwYXJhbVR5cGVBcnJheSA9IG5ldyBSZWdFeHAoL14oLiopXFxbKFswLTldKilcXF0kLyk7XG5leHBvcnQgY2xhc3MgUGFyYW1UeXBlIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvckd1YXJkLCBwYXJhbXMpIHtcbiAgICAgICAgaWYgKGNvbnN0cnVjdG9yR3VhcmQgIT09IF9jb25zdHJ1Y3Rvckd1YXJkKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVzZSBmcm9tU3RyaW5nXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcIm5ldyBQYXJhbVR5cGUoKVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwb3B1bGF0ZSh0aGlzLCBwYXJhbXMpO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLnR5cGUubWF0Y2gocGFyYW1UeXBlQXJyYXkpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIHBvcHVsYXRlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBhcnJheUxlbmd0aDogcGFyc2VJbnQobWF0Y2hbMl0gfHwgXCItMVwiKSxcbiAgICAgICAgICAgICAgICBhcnJheUNoaWxkcmVuOiBQYXJhbVR5cGUuZnJvbU9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB0aGlzLmNvbXBvbmVudHNcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBiYXNlVHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBvcHVsYXRlKHRoaXMsIHtcbiAgICAgICAgICAgICAgICBhcnJheUxlbmd0aDogbnVsbCxcbiAgICAgICAgICAgICAgICBhcnJheUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgICAgIGJhc2VUeXBlOiAoKHRoaXMuY29tcG9uZW50cyAhPSBudWxsKSA/IFwidHVwbGVcIiA6IHRoaXMudHlwZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzUGFyYW1UeXBlID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgLy8gRm9ybWF0IHRoZSBwYXJhbWV0ZXIgZnJhZ21lbnRcbiAgICAvLyAgIC0gc2lnaGFzaDogXCIodWludDI1NixhZGRyZXNzKVwiXG4gICAgLy8gICAtIG1pbmltYWw6IFwidHVwbGUodWludDI1NixhZGRyZXNzKSBpbmRleGVkXCJcbiAgICAvLyAgIC0gZnVsbDogICAgXCJ0dXBsZSh1aW50MjU2IGZvbywgYWRkcmVzIGJhcikgaW5kZXhlZCBiYXpcIlxuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdFR5cGVzLnNpZ2hhc2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFGb3JtYXRUeXBlc1tmb3JtYXRdKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBmb3JtYXQgdHlwZVwiLCBcImZvcm1hdFwiLCBmb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IEZvcm1hdFR5cGVzLmpzb24pIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogKCh0aGlzLmJhc2VUeXBlID09PSBcInR1cGxlXCIpID8gXCJ0dXBsZVwiIDogdGhpcy50eXBlKSxcbiAgICAgICAgICAgICAgICBuYW1lOiAodGhpcy5uYW1lIHx8IHVuZGVmaW5lZClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmluZGV4ZWQpID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5pbmRleGVkID0gdGhpcy5pbmRleGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLm1hcCgoY29tcCkgPT4gSlNPTi5wYXJzZShjb21wLmZvcm1hdChmb3JtYXQpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgLy8gQXJyYXlcbiAgICAgICAgaWYgKHRoaXMuYmFzZVR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuYXJyYXlDaGlsZHJlbi5mb3JtYXQoZm9ybWF0KTtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcIltcIiArICh0aGlzLmFycmF5TGVuZ3RoIDwgMCA/IFwiXCIgOiBTdHJpbmcodGhpcy5hcnJheUxlbmd0aCkpICsgXCJdXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5iYXNlVHlwZSA9PT0gXCJ0dXBsZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPT0gRm9ybWF0VHlwZXMuc2lnaGFzaCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy50eXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIoXCIgKyB0aGlzLmNvbXBvbmVudHMubWFwKChjb21wKSA9PiBjb21wLmZvcm1hdChmb3JtYXQpKS5qb2luKChmb3JtYXQgPT09IEZvcm1hdFR5cGVzLmZ1bGwpID8gXCIsIFwiIDogXCIsXCIpICsgXCIpXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gdGhpcy50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgIT09IEZvcm1hdFR5cGVzLnNpZ2hhc2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIgaW5kZXhlZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gRm9ybWF0VHlwZXMuZnVsbCAmJiB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCIgXCIgKyB0aGlzLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3RhdGljIGZyb20odmFsdWUsIGFsbG93SW5kZXhlZCkge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBQYXJhbVR5cGUuZnJvbVN0cmluZyh2YWx1ZSwgYWxsb3dJbmRleGVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGFyYW1UeXBlLmZyb21PYmplY3QodmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU9iamVjdCh2YWx1ZSkge1xuICAgICAgICBpZiAoUGFyYW1UeXBlLmlzUGFyYW1UeXBlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1UeXBlKF9jb25zdHJ1Y3Rvckd1YXJkLCB7XG4gICAgICAgICAgICBuYW1lOiAodmFsdWUubmFtZSB8fCBudWxsKSxcbiAgICAgICAgICAgIHR5cGU6IHZlcmlmeVR5cGUodmFsdWUudHlwZSksXG4gICAgICAgICAgICBpbmRleGVkOiAoKHZhbHVlLmluZGV4ZWQgPT0gbnVsbCkgPyBudWxsIDogISF2YWx1ZS5pbmRleGVkKSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6ICh2YWx1ZS5jb21wb25lbnRzID8gdmFsdWUuY29tcG9uZW50cy5tYXAoUGFyYW1UeXBlLmZyb21PYmplY3QpIDogbnVsbClcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlLCBhbGxvd0luZGV4ZWQpIHtcbiAgICAgICAgZnVuY3Rpb24gUGFyYW1UeXBpZnkobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIFBhcmFtVHlwZS5mcm9tT2JqZWN0KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogbm9kZS50eXBlLFxuICAgICAgICAgICAgICAgIGluZGV4ZWQ6IG5vZGUuaW5kZXhlZCxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiBub2RlLmNvbXBvbmVudHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQYXJhbVR5cGlmeShwYXJzZVBhcmFtVHlwZSh2YWx1ZSwgISFhbGxvd0luZGV4ZWQpKTtcbiAgICB9XG4gICAgc3RhdGljIGlzUGFyYW1UeXBlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhISh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLl9pc1BhcmFtVHlwZSk7XG4gICAgfVxufVxuO1xuZnVuY3Rpb24gcGFyc2VQYXJhbXModmFsdWUsIGFsbG93SW5kZXgpIHtcbiAgICByZXR1cm4gc3BsaXROZXN0aW5nKHZhbHVlKS5tYXAoKHBhcmFtKSA9PiBQYXJhbVR5cGUuZnJvbVN0cmluZyhwYXJhbSwgYWxsb3dJbmRleCkpO1xufVxuZXhwb3J0IGNsYXNzIEZyYWdtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvckd1YXJkLCBwYXJhbXMpIHtcbiAgICAgICAgaWYgKGNvbnN0cnVjdG9yR3VhcmQgIT09IF9jb25zdHJ1Y3Rvckd1YXJkKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVzZSBhIHN0YXRpYyBmcm9tIG1ldGhvZFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJuZXcgRnJhZ21lbnQoKVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBwb3B1bGF0ZSh0aGlzLCBwYXJhbXMpO1xuICAgICAgICB0aGlzLl9pc0ZyYWdtZW50ID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKEZyYWdtZW50LmlzRnJhZ21lbnQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZyYWdtZW50LmZyb21PYmplY3QodmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU9iamVjdCh2YWx1ZSkge1xuICAgICAgICBpZiAoRnJhZ21lbnQuaXNGcmFnbWVudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHZhbHVlLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbkZyYWdtZW50LmZyb21PYmplY3QodmFsdWUpO1xuICAgICAgICAgICAgY2FzZSBcImV2ZW50XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIEV2ZW50RnJhZ21lbnQuZnJvbU9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgICBjYXNlIFwiY29uc3RydWN0b3JcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29uc3RydWN0b3JGcmFnbWVudC5mcm9tT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICAgIGNhc2UgXCJmYWxsYmFja1wiOlxuICAgICAgICAgICAgY2FzZSBcInJlY2VpdmVcIjpcbiAgICAgICAgICAgICAgICAvLyBAVE9ETzogU29tZXRoaW5nPyBNYXliZSByZXR1cm4gYSBGdW5jdGlvbkZyYWdtZW50PyBBIGN1c3RvbSBEZWZhdWx0RnVuY3Rpb25GcmFnbWVudD9cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgZnJhZ21lbnQgb2JqZWN0XCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVN0cmluZyh2YWx1ZSkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIFwicmV0dXJuc1wiIGlzIHN1cnJvdW5kZWQgYnkgYSBzcGFjZSBhbmQgYWxsIHdoaXRlc3BhY2UgaXMgZXhhY3RseSBvbmUgc3BhY2VcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXHMvZywgXCIgXCIpO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1xcKC9nLCBcIiAoXCIpLnJlcGxhY2UoL1xcKS9nLCBcIikgXCIpLnJlcGxhY2UoL1xccysvZywgXCIgXCIpO1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgaWYgKHZhbHVlLnNwbGl0KFwiIFwiKVswXSA9PT0gXCJldmVudFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRXZlbnRGcmFnbWVudC5mcm9tU3RyaW5nKHZhbHVlLnN1YnN0cmluZyg1KS50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLnNwbGl0KFwiIFwiKVswXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICByZXR1cm4gRnVuY3Rpb25GcmFnbWVudC5mcm9tU3RyaW5nKHZhbHVlLnN1YnN0cmluZyg4KS50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlLnNwbGl0KFwiKFwiKVswXS50cmltKCkgPT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yRnJhZ21lbnQuZnJvbVN0cmluZyh2YWx1ZS50cmltKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5zdXBwb3J0ZWQgZnJhZ21lbnRcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0ZyYWdtZW50KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5faXNGcmFnbWVudCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEV2ZW50RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7XG4gICAgZm9ybWF0KGZvcm1hdCkge1xuICAgICAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0VHlwZXMuc2lnaGFzaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUZvcm1hdFR5cGVzW2Zvcm1hdF0pIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGZvcm1hdCB0eXBlXCIsIFwiZm9ybWF0XCIsIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gRm9ybWF0VHlwZXMuanNvbikge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImV2ZW50XCIsXG4gICAgICAgICAgICAgICAgYW5vbnltb3VzOiB0aGlzLmFub255bW91cyxcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cy5tYXAoKGlucHV0KSA9PiBKU09OLnBhcnNlKGlucHV0LmZvcm1hdChmb3JtYXQpKSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBpZiAoZm9ybWF0ICE9PSBGb3JtYXRUeXBlcy5zaWdoYXNoKSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gXCJldmVudCBcIjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gdGhpcy5uYW1lICsgXCIoXCIgKyB0aGlzLmlucHV0cy5tYXAoKGlucHV0KSA9PiBpbnB1dC5mb3JtYXQoZm9ybWF0KSkuam9pbigoZm9ybWF0ID09PSBGb3JtYXRUeXBlcy5mdWxsKSA/IFwiLCBcIiA6IFwiLFwiKSArIFwiKSBcIjtcbiAgICAgICAgaWYgKGZvcm1hdCAhPT0gRm9ybWF0VHlwZXMuc2lnaGFzaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYW5vbnltb3VzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IFwiYW5vbnltb3VzIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudHJpbSgpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbSh2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBFdmVudEZyYWdtZW50LmZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudEZyYWdtZW50LmZyb21PYmplY3QodmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU9iamVjdCh2YWx1ZSkge1xuICAgICAgICBpZiAoRXZlbnRGcmFnbWVudC5pc0V2ZW50RnJhZ21lbnQodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlLnR5cGUgIT09IFwiZXZlbnRcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgZXZlbnQgb2JqZWN0XCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIG5hbWU6IHZlcmlmeUlkZW50aWZpZXIodmFsdWUubmFtZSksXG4gICAgICAgICAgICBhbm9ueW1vdXM6IHZhbHVlLmFub255bW91cyxcbiAgICAgICAgICAgIGlucHV0czogKHZhbHVlLmlucHV0cyA/IHZhbHVlLmlucHV0cy5tYXAoUGFyYW1UeXBlLmZyb21PYmplY3QpIDogW10pLFxuICAgICAgICAgICAgdHlwZTogXCJldmVudFwiXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRGcmFnbWVudChfY29uc3RydWN0b3JHdWFyZCwgcGFyYW1zKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gdmFsdWUubWF0Y2gocmVnZXhQYXJlbik7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGV2ZW50IHN0cmluZ1wiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5vbnltb3VzID0gZmFsc2U7XG4gICAgICAgIG1hdGNoWzNdLnNwbGl0KFwiIFwiKS5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChtb2RpZmllci50cmltKCkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYW5vbnltb3VzXCI6XG4gICAgICAgICAgICAgICAgICAgIGFub255bW91cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJcIjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bmtub3duIG1vZGlmaWVyOiBcIiArIG1vZGlmaWVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFdmVudEZyYWdtZW50LmZyb21PYmplY3Qoe1xuICAgICAgICAgICAgbmFtZTogbWF0Y2hbMV0udHJpbSgpLFxuICAgICAgICAgICAgYW5vbnltb3VzOiBhbm9ueW1vdXMsXG4gICAgICAgICAgICBpbnB1dHM6IHBhcnNlUGFyYW1zKG1hdGNoWzJdLCB0cnVlKSxcbiAgICAgICAgICAgIHR5cGU6IFwiZXZlbnRcIlxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhdGljIGlzRXZlbnRGcmFnbWVudCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLl9pc0ZyYWdtZW50ICYmIHZhbHVlLnR5cGUgPT09IFwiZXZlbnRcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gcGFyc2VHYXModmFsdWUsIHBhcmFtcykge1xuICAgIHBhcmFtcy5nYXMgPSBudWxsO1xuICAgIGxldCBjb21wcyA9IHZhbHVlLnNwbGl0KFwiQFwiKTtcbiAgICBpZiAoY29tcHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIGlmIChjb21wcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBodW1hbi1yZWFkYWJsZSBBQkkgc2lnbmF0dXJlXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29tcHNbMV0ubWF0Y2goL15bMC05XSskLykpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGh1bWFuLXJlYWRhYmxlIEFCSSBzaWduYXR1cmUgZ2FzXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtcy5nYXMgPSBCaWdOdW1iZXIuZnJvbShjb21wc1sxXSk7XG4gICAgICAgIHJldHVybiBjb21wc1swXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuZnVuY3Rpb24gcGFyc2VNb2RpZmllcnModmFsdWUsIHBhcmFtcykge1xuICAgIHBhcmFtcy5jb25zdGFudCA9IGZhbHNlO1xuICAgIHBhcmFtcy5wYXlhYmxlID0gZmFsc2U7XG4gICAgcGFyYW1zLnN0YXRlTXV0YWJpbGl0eSA9IFwibm9ucGF5YWJsZVwiO1xuICAgIHZhbHVlLnNwbGl0KFwiIFwiKS5mb3JFYWNoKChtb2RpZmllcikgPT4ge1xuICAgICAgICBzd2l0Y2ggKG1vZGlmaWVyLnRyaW0oKSkge1xuICAgICAgICAgICAgY2FzZSBcImNvbnN0YW50XCI6XG4gICAgICAgICAgICAgICAgcGFyYW1zLmNvbnN0YW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJwYXlhYmxlXCI6XG4gICAgICAgICAgICAgICAgcGFyYW1zLnBheWFibGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zdGF0ZU11dGFiaWxpdHkgPSBcInBheWFibGVcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJub25wYXlhYmxlXCI6XG4gICAgICAgICAgICAgICAgcGFyYW1zLnBheWFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBwYXJhbXMuc3RhdGVNdXRhYmlsaXR5ID0gXCJub25wYXlhYmxlXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicHVyZVwiOlxuICAgICAgICAgICAgICAgIHBhcmFtcy5jb25zdGFudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcGFyYW1zLnN0YXRlTXV0YWJpbGl0eSA9IFwicHVyZVwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInZpZXdcIjpcbiAgICAgICAgICAgICAgICBwYXJhbXMuY29uc3RhbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHBhcmFtcy5zdGF0ZU11dGFiaWxpdHkgPSBcInZpZXdcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJleHRlcm5hbFwiOlxuICAgICAgICAgICAgY2FzZSBcInB1YmxpY1wiOlxuICAgICAgICAgICAgY2FzZSBcIlwiOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInVua25vd24gbW9kaWZpZXI6IFwiICsgbW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiB2ZXJpZnlTdGF0ZSh2YWx1ZSkge1xuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgIGNvbnN0YW50OiBmYWxzZSxcbiAgICAgICAgcGF5YWJsZTogdHJ1ZSxcbiAgICAgICAgc3RhdGVNdXRhYmlsaXR5OiBcInBheWFibGVcIlxuICAgIH07XG4gICAgaWYgKHZhbHVlLnN0YXRlTXV0YWJpbGl0eSAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5zdGF0ZU11dGFiaWxpdHkgPSB2YWx1ZS5zdGF0ZU11dGFiaWxpdHk7XG4gICAgICAgIC8vIFNldCAoYW5kIGNoZWNrIHRoaW5ncyBhcmUgY29uc2lzdGVudCkgdGhlIGNvbnN0YW50IHByb3BlcnR5XG4gICAgICAgIHJlc3VsdC5jb25zdGFudCA9IChyZXN1bHQuc3RhdGVNdXRhYmlsaXR5ID09PSBcInZpZXdcIiB8fCByZXN1bHQuc3RhdGVNdXRhYmlsaXR5ID09PSBcInB1cmVcIik7XG4gICAgICAgIGlmICh2YWx1ZS5jb25zdGFudCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoKCEhdmFsdWUuY29uc3RhbnQpICE9PSByZXN1bHQuY29uc3RhbnQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiY2Fubm90IGhhdmUgY29uc3RhbnQgZnVuY3Rpb24gd2l0aCBtdXRhYmlsaXR5IFwiICsgcmVzdWx0LnN0YXRlTXV0YWJpbGl0eSwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IChhbmQgY2hlY2sgdGhpbmdzIGFyZSBjb25zaXN0ZW50KSB0aGUgcGF5YWJsZSBwcm9wZXJ0eVxuICAgICAgICByZXN1bHQucGF5YWJsZSA9IChyZXN1bHQuc3RhdGVNdXRhYmlsaXR5ID09PSBcInBheWFibGVcIik7XG4gICAgICAgIGlmICh2YWx1ZS5wYXlhYmxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmICgoISF2YWx1ZS5wYXlhYmxlKSAhPT0gcmVzdWx0LnBheWFibGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiY2Fubm90IGhhdmUgcGF5YWJsZSBmdW5jdGlvbiB3aXRoIG11dGFiaWxpdHkgXCIgKyByZXN1bHQuc3RhdGVNdXRhYmlsaXR5LCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZS5wYXlhYmxlICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0LnBheWFibGUgPSAhIXZhbHVlLnBheWFibGU7XG4gICAgICAgIC8vIElmIHBheWFibGUgd2UgY2FuIGFzc3VtZSBub24tY29uc3RhbnQ7IG90aGVyd2lzZSB3ZSBjYW4ndCBhc3N1bWVcbiAgICAgICAgaWYgKHZhbHVlLmNvbnN0YW50ID09IG51bGwgJiYgIXJlc3VsdC5wYXlhYmxlICYmIHZhbHVlLnR5cGUgIT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInVuYWJsZSB0byBkZXRlcm1pbmUgc3RhdGVNdXRhYmlsaXR5XCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5jb25zdGFudCA9ICEhdmFsdWUuY29uc3RhbnQ7XG4gICAgICAgIGlmIChyZXN1bHQuY29uc3RhbnQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGF0ZU11dGFiaWxpdHkgPSBcInZpZXdcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGF0ZU11dGFiaWxpdHkgPSAocmVzdWx0LnBheWFibGUgPyBcInBheWFibGVcIiA6IFwibm9ucGF5YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnBheWFibGUgJiYgcmVzdWx0LmNvbnN0YW50KSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiY2Fubm90IGhhdmUgY29uc3RhbnQgcGF5YWJsZSBmdW5jdGlvblwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh2YWx1ZS5jb25zdGFudCAhPSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5jb25zdGFudCA9ICEhdmFsdWUuY29uc3RhbnQ7XG4gICAgICAgIHJlc3VsdC5wYXlhYmxlID0gIXJlc3VsdC5jb25zdGFudDtcbiAgICAgICAgcmVzdWx0LnN0YXRlTXV0YWJpbGl0eSA9IChyZXN1bHQuY29uc3RhbnQgPyBcInZpZXdcIiA6IFwicGF5YWJsZVwiKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUudHlwZSAhPT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ1bmFibGUgdG8gZGV0ZXJtaW5lIHN0YXRlTXV0YWJpbGl0eVwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBjbGFzcyBDb25zdHJ1Y3RvckZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQge1xuICAgIGZvcm1hdChmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IEZvcm1hdFR5cGVzLnNpZ2hhc2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFGb3JtYXRUeXBlc1tmb3JtYXRdKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBmb3JtYXQgdHlwZVwiLCBcImZvcm1hdFwiLCBmb3JtYXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IEZvcm1hdFR5cGVzLmpzb24pIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJjb25zdHJ1Y3RvclwiLFxuICAgICAgICAgICAgICAgIHN0YXRlTXV0YWJpbGl0eTogKCh0aGlzLnN0YXRlTXV0YWJpbGl0eSAhPT0gXCJub25wYXlhYmxlXCIpID8gdGhpcy5zdGF0ZU11dGFiaWxpdHkgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIHBheWFibGU6IHRoaXMucGF5YWJsZSxcbiAgICAgICAgICAgICAgICBnYXM6ICh0aGlzLmdhcyA/IHRoaXMuZ2FzLnRvTnVtYmVyKCkgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgIGlucHV0czogdGhpcy5pbnB1dHMubWFwKChpbnB1dCkgPT4gSlNPTi5wYXJzZShpbnB1dC5mb3JtYXQoZm9ybWF0KSkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBGb3JtYXRUeXBlcy5zaWdoYXNoKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCBmb3JtYXQgYSBjb25zdHJ1Y3RvciBmb3Igc2lnaGFzaFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJmb3JtYXQoc2lnaGFzaClcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiY29uc3RydWN0b3IoXCIgKyB0aGlzLmlucHV0cy5tYXAoKGlucHV0KSA9PiBpbnB1dC5mb3JtYXQoZm9ybWF0KSkuam9pbigoZm9ybWF0ID09PSBGb3JtYXRUeXBlcy5mdWxsKSA/IFwiLCBcIiA6IFwiLFwiKSArIFwiKSBcIjtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGVNdXRhYmlsaXR5ICYmIHRoaXMuc3RhdGVNdXRhYmlsaXR5ICE9PSBcIm5vbnBheWFibGVcIikge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuc3RhdGVNdXRhYmlsaXR5ICsgXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC50cmltKCk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yRnJhZ21lbnQuZnJvbVN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yRnJhZ21lbnQuZnJvbU9iamVjdCh2YWx1ZSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tT2JqZWN0KHZhbHVlKSB7XG4gICAgICAgIGlmIChDb25zdHJ1Y3RvckZyYWdtZW50LmlzQ29uc3RydWN0b3JGcmFnbWVudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWUudHlwZSAhPT0gXCJjb25zdHJ1Y3RvclwiKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBjb25zdHJ1Y3RvciBvYmplY3RcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YXRlID0gdmVyaWZ5U3RhdGUodmFsdWUpO1xuICAgICAgICBpZiAoc3RhdGUuY29uc3RhbnQpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY29uc3RhbnRcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICBpbnB1dHM6ICh2YWx1ZS5pbnB1dHMgPyB2YWx1ZS5pbnB1dHMubWFwKFBhcmFtVHlwZS5mcm9tT2JqZWN0KSA6IFtdKSxcbiAgICAgICAgICAgIHBheWFibGU6IHN0YXRlLnBheWFibGUsXG4gICAgICAgICAgICBzdGF0ZU11dGFiaWxpdHk6IHN0YXRlLnN0YXRlTXV0YWJpbGl0eSxcbiAgICAgICAgICAgIGdhczogKHZhbHVlLmdhcyA/IEJpZ051bWJlci5mcm9tKHZhbHVlLmdhcykgOiBudWxsKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IENvbnN0cnVjdG9yRnJhZ21lbnQoX2NvbnN0cnVjdG9yR3VhcmQsIHBhcmFtcyk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB7IHR5cGU6IFwiY29uc3RydWN0b3JcIiB9O1xuICAgICAgICB2YWx1ZSA9IHBhcnNlR2FzKHZhbHVlLCBwYXJhbXMpO1xuICAgICAgICBsZXQgcGFyZW5zID0gdmFsdWUubWF0Y2gocmVnZXhQYXJlbik7XG4gICAgICAgIGlmICghcGFyZW5zIHx8IHBhcmVuc1sxXS50cmltKCkgIT09IFwiY29uc3RydWN0b3JcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgY29uc3RydWN0b3Igc3RyaW5nXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtcy5pbnB1dHMgPSBwYXJzZVBhcmFtcyhwYXJlbnNbMl0udHJpbSgpLCBmYWxzZSk7XG4gICAgICAgIHBhcnNlTW9kaWZpZXJzKHBhcmVuc1szXS50cmltKCksIHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBDb25zdHJ1Y3RvckZyYWdtZW50LmZyb21PYmplY3QocGFyYW1zKTtcbiAgICB9XG4gICAgc3RhdGljIGlzQ29uc3RydWN0b3JGcmFnbWVudCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLl9pc0ZyYWdtZW50ICYmIHZhbHVlLnR5cGUgPT09IFwiY29uc3RydWN0b3JcIik7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uRnJhZ21lbnQgZXh0ZW5kcyBDb25zdHJ1Y3RvckZyYWdtZW50IHtcbiAgICBmb3JtYXQoZm9ybWF0KSB7XG4gICAgICAgIGlmICghZm9ybWF0KSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRUeXBlcy5zaWdoYXNoO1xuICAgICAgICB9XG4gICAgICAgIGlmICghRm9ybWF0VHlwZXNbZm9ybWF0XSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgZm9ybWF0IHR5cGVcIiwgXCJmb3JtYXRcIiwgZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9ybWF0ID09PSBGb3JtYXRUeXBlcy5qc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiZnVuY3Rpb25cIixcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICAgICAgY29uc3RhbnQ6IHRoaXMuY29uc3RhbnQsXG4gICAgICAgICAgICAgICAgc3RhdGVNdXRhYmlsaXR5OiAoKHRoaXMuc3RhdGVNdXRhYmlsaXR5ICE9PSBcIm5vbnBheWFibGVcIikgPyB0aGlzLnN0YXRlTXV0YWJpbGl0eSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgcGF5YWJsZTogdGhpcy5wYXlhYmxlLFxuICAgICAgICAgICAgICAgIGdhczogKHRoaXMuZ2FzID8gdGhpcy5nYXMudG9OdW1iZXIoKSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cy5tYXAoKGlucHV0KSA9PiBKU09OLnBhcnNlKGlucHV0LmZvcm1hdChmb3JtYXQpKSksXG4gICAgICAgICAgICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLm1hcCgob3V0cHV0KSA9PiBKU09OLnBhcnNlKG91dHB1dC5mb3JtYXQoZm9ybWF0KSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gICAgICAgIGlmIChmb3JtYXQgIT09IEZvcm1hdFR5cGVzLnNpZ2hhc2gpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBcImZ1bmN0aW9uIFwiO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCArPSB0aGlzLm5hbWUgKyBcIihcIiArIHRoaXMuaW5wdXRzLm1hcCgoaW5wdXQpID0+IGlucHV0LmZvcm1hdChmb3JtYXQpKS5qb2luKChmb3JtYXQgPT09IEZvcm1hdFR5cGVzLmZ1bGwpID8gXCIsIFwiIDogXCIsXCIpICsgXCIpIFwiO1xuICAgICAgICBpZiAoZm9ybWF0ICE9PSBGb3JtYXRUeXBlcy5zaWdoYXNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZU11dGFiaWxpdHkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZU11dGFiaWxpdHkgIT09IFwibm9ucGF5YWJsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAodGhpcy5zdGF0ZU11dGFiaWxpdHkgKyBcIiBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb25zdGFudCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcInZpZXcgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5vdXRwdXRzICYmIHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gXCJyZXR1cm5zIChcIiArIHRoaXMub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gb3V0cHV0LmZvcm1hdChmb3JtYXQpKS5qb2luKFwiLCBcIikgKyBcIikgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5nYXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSBcIkBcIiArIHRoaXMuZ2FzLnRvU3RyaW5nKCkgKyBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnRyaW0oKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb20odmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gRnVuY3Rpb25GcmFnbWVudC5mcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRnVuY3Rpb25GcmFnbWVudC5mcm9tT2JqZWN0KHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21PYmplY3QodmFsdWUpIHtcbiAgICAgICAgaWYgKEZ1bmN0aW9uRnJhZ21lbnQuaXNGdW5jdGlvbkZyYWdtZW50KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZS50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGZ1bmN0aW9uIG9iamVjdFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSB2ZXJpZnlTdGF0ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHR5cGU6IHZhbHVlLnR5cGUsXG4gICAgICAgICAgICBuYW1lOiB2ZXJpZnlJZGVudGlmaWVyKHZhbHVlLm5hbWUpLFxuICAgICAgICAgICAgY29uc3RhbnQ6IHN0YXRlLmNvbnN0YW50LFxuICAgICAgICAgICAgaW5wdXRzOiAodmFsdWUuaW5wdXRzID8gdmFsdWUuaW5wdXRzLm1hcChQYXJhbVR5cGUuZnJvbU9iamVjdCkgOiBbXSksXG4gICAgICAgICAgICBvdXRwdXRzOiAodmFsdWUub3V0cHV0cyA/IHZhbHVlLm91dHB1dHMubWFwKFBhcmFtVHlwZS5mcm9tT2JqZWN0KSA6IFtdKSxcbiAgICAgICAgICAgIHBheWFibGU6IHN0YXRlLnBheWFibGUsXG4gICAgICAgICAgICBzdGF0ZU11dGFiaWxpdHk6IHN0YXRlLnN0YXRlTXV0YWJpbGl0eSxcbiAgICAgICAgICAgIGdhczogKHZhbHVlLmdhcyA/IEJpZ051bWJlci5mcm9tKHZhbHVlLmdhcykgOiBudWxsKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRnJhZ21lbnQoX2NvbnN0cnVjdG9yR3VhcmQsIHBhcmFtcyk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB7IHR5cGU6IFwiZnVuY3Rpb25cIiB9O1xuICAgICAgICB2YWx1ZSA9IHBhcnNlR2FzKHZhbHVlLCBwYXJhbXMpO1xuICAgICAgICBsZXQgY29tcHMgPSB2YWx1ZS5zcGxpdChcIiByZXR1cm5zIFwiKTtcbiAgICAgICAgaWYgKGNvbXBzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGZ1bmN0aW9uIHN0cmluZ1wiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW5zID0gY29tcHNbMF0ubWF0Y2gocmVnZXhQYXJlbik7XG4gICAgICAgIGlmICghcGFyZW5zKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBmdW5jdGlvbiBzaWduYXR1cmVcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyYW1zLm5hbWUgPSBwYXJlbnNbMV0udHJpbSgpO1xuICAgICAgICBpZiAocGFyYW1zLm5hbWUpIHtcbiAgICAgICAgICAgIHZlcmlmeUlkZW50aWZpZXIocGFyYW1zLm5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmFtcy5pbnB1dHMgPSBwYXJzZVBhcmFtcyhwYXJlbnNbMl0sIGZhbHNlKTtcbiAgICAgICAgcGFyc2VNb2RpZmllcnMocGFyZW5zWzNdLnRyaW0oKSwgcGFyYW1zKTtcbiAgICAgICAgLy8gV2UgaGF2ZSBvdXRwdXRzXG4gICAgICAgIGlmIChjb21wcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsZXQgcmV0dXJucyA9IGNvbXBzWzFdLm1hdGNoKHJlZ2V4UGFyZW4pO1xuICAgICAgICAgICAgaWYgKHJldHVybnNbMV0udHJpbSgpICE9IFwiXCIgfHwgcmV0dXJuc1szXS50cmltKCkgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ1bmV4cGVjdGVkIHRva2Vuc1wiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRzID0gcGFyc2VQYXJhbXMocmV0dXJuc1syXSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1zLm91dHB1dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRnVuY3Rpb25GcmFnbWVudC5mcm9tT2JqZWN0KHBhcmFtcyk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0Z1bmN0aW9uRnJhZ21lbnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5faXNGcmFnbWVudCAmJiB2YWx1ZS50eXBlID09PSBcImZ1bmN0aW9uXCIpO1xuICAgIH1cbn1cbi8vZXhwb3J0IGNsYXNzIEVycm9yRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7XG4vL31cbi8vZXhwb3J0IGNsYXNzIFN0cnVjdEZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQge1xuLy99XG5mdW5jdGlvbiB2ZXJpZnlUeXBlKHR5cGUpIHtcbiAgICAvLyBUaGVzZSBuZWVkIHRvIGJlIHRyYW5zZm9ybWVkIHRvIHRoZWlyIGZ1bGwgZGVzY3JpcHRpb25cbiAgICBpZiAodHlwZS5tYXRjaCgvXnVpbnQoJHxbXjEtOV0pLykpIHtcbiAgICAgICAgdHlwZSA9IFwidWludDI1NlwiICsgdHlwZS5zdWJzdHJpbmcoNCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUubWF0Y2goL15pbnQoJHxbXjEtOV0pLykpIHtcbiAgICAgICAgdHlwZSA9IFwiaW50MjU2XCIgKyB0eXBlLnN1YnN0cmluZygzKTtcbiAgICB9XG4gICAgLy8gQFRPRE86IG1vcmUgdmVyaWZpY2F0aW9uXG4gICAgcmV0dXJuIHR5cGU7XG59XG5jb25zdCByZWdleElkZW50aWZpZXIgPSBuZXcgUmVnRXhwKFwiXltBLVphLXpfXVtBLVphLXowLTlfXSokXCIpO1xuZnVuY3Rpb24gdmVyaWZ5SWRlbnRpZmllcih2YWx1ZSkge1xuICAgIGlmICghdmFsdWUgfHwgIXZhbHVlLm1hdGNoKHJlZ2V4SWRlbnRpZmllcikpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgaW52YWxpZCBpZGVudGlmaWVyIFwiJHt2YWx1ZX1cImAsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCByZWdleFBhcmVuID0gbmV3IFJlZ0V4cChcIl4oW14pKF0qKVxcXFwoKC4qKVxcXFwpKFteKShdKikkXCIpO1xuZnVuY3Rpb24gc3BsaXROZXN0aW5nKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBhY2N1bSA9IFwiXCI7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCB2YWx1ZS5sZW5ndGg7IG9mZnNldCsrKSB7XG4gICAgICAgIGxldCBjID0gdmFsdWVbb2Zmc2V0XTtcbiAgICAgICAgaWYgKGMgPT09IFwiLFwiICYmIGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhY2N1bSk7XG4gICAgICAgICAgICBhY2N1bSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhY2N1bSArPSBjO1xuICAgICAgICAgICAgaWYgKGMgPT09IFwiKFwiKSB7XG4gICAgICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09IFwiKVwiKSB7XG4gICAgICAgICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWNjdW0pIHtcbiAgICAgICAgcmVzdWx0LnB1c2goYWNjdW0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnJhZ21lbnRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3JGcmFnbWVudCwgRXZlbnRGcmFnbWVudCwgRm9ybWF0VHlwZXMsIEZyYWdtZW50LCBGdW5jdGlvbkZyYWdtZW50LCBQYXJhbVR5cGUgfSBmcm9tIFwiLi9mcmFnbWVudHNcIjtcbmltcG9ydCB7IEFiaUNvZGVyLCBkZWZhdWx0QWJpQ29kZXIgfSBmcm9tIFwiLi9hYmktY29kZXJcIjtcbmltcG9ydCB7IGNoZWNrUmVzdWx0RXJyb3JzLCBJbmRleGVkLCBJbnRlcmZhY2UsIExvZ0Rlc2NyaXB0aW9uLCBUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIH0gZnJvbSBcIi4vaW50ZXJmYWNlXCI7XG5leHBvcnQgeyBDb25zdHJ1Y3RvckZyYWdtZW50LCBFdmVudEZyYWdtZW50LCBGcmFnbWVudCwgRnVuY3Rpb25GcmFnbWVudCwgUGFyYW1UeXBlLCBGb3JtYXRUeXBlcywgQWJpQ29kZXIsIGRlZmF1bHRBYmlDb2RlciwgSW50ZXJmYWNlLCBJbmRleGVkLCBjaGVja1Jlc3VsdEVycm9ycywgTG9nRGVzY3JpcHRpb24sIFRyYW5zYWN0aW9uRGVzY3JpcHRpb24gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgY29uY2F0LCBoZXhEYXRhU2xpY2UsIGhleGxpZnksIGhleFplcm9QYWQsIGlzSGV4U3RyaW5nIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBpZCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9oYXNoXCI7XG5pbXBvcnQgeyBrZWNjYWsyNTYgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qva2VjY2FrMjU2XCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSwgRGVzY3JpcHRpb24sIGdldFN0YXRpYyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBkZWZhdWx0QWJpQ29kZXIgfSBmcm9tIFwiLi9hYmktY29kZXJcIjtcbmltcG9ydCB7IGNoZWNrUmVzdWx0RXJyb3JzIH0gZnJvbSBcIi4vY29kZXJzL2Fic3RyYWN0LWNvZGVyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvckZyYWdtZW50LCBFdmVudEZyYWdtZW50LCBGb3JtYXRUeXBlcywgRnJhZ21lbnQsIEZ1bmN0aW9uRnJhZ21lbnQsIFBhcmFtVHlwZSB9IGZyb20gXCIuL2ZyYWdtZW50c1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuZXhwb3J0IHsgY2hlY2tSZXN1bHRFcnJvcnMgfTtcbmV4cG9ydCBjbGFzcyBMb2dEZXNjcmlwdGlvbiBleHRlbmRzIERlc2NyaXB0aW9uIHtcbn1cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIGV4dGVuZHMgRGVzY3JpcHRpb24ge1xufVxuZXhwb3J0IGNsYXNzIEluZGV4ZWQgZXh0ZW5kcyBEZXNjcmlwdGlvbiB7XG4gICAgc3RhdGljIGlzSW5kZXhlZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX2lzSW5kZXhlZCk7XG4gICAgfVxufVxuZnVuY3Rpb24gd3JhcEFjY2Vzc0Vycm9yKHByb3BlcnR5LCBlcnJvcikge1xuICAgIGNvbnN0IHdyYXAgPSBuZXcgRXJyb3IoYGRlZmVycmVkIGVycm9yIGR1cmluZyBBQkkgZGVjb2RpbmcgdHJpZ2dlcmVkIGFjY2Vzc2luZyAke3Byb3BlcnR5fWApO1xuICAgIHdyYXAuZXJyb3IgPSBlcnJvcjtcbiAgICByZXR1cm4gd3JhcDtcbn1cbi8qXG5mdW5jdGlvbiBjaGVja05hbWVzKGZyYWdtZW50OiBGcmFnbWVudCwgdHlwZTogXCJpbnB1dFwiIHwgXCJvdXRwdXRcIiwgcGFyYW1zOiBBcnJheTxQYXJhbVR5cGU+KTogdm9pZCB7XG4gICAgcGFyYW1zLnJlZHVjZSgoYWNjdW0sIHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChwYXJhbS5uYW1lKSB7XG4gICAgICAgICAgICBpZiAoYWNjdW1bcGFyYW0ubmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBkdXBsaWNhdGUgJHsgdHlwZSB9IHBhcmFtZXRlciAkeyBKU09OLnN0cmluZ2lmeShwYXJhbS5uYW1lKSB9IGluICR7IGZyYWdtZW50LmZvcm1hdChcImZ1bGxcIikgfWAsIFwiZnJhZ21lbnRcIiwgZnJhZ21lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNjdW1bcGFyYW0ubmFtZV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCA8eyBbIG5hbWU6IHN0cmluZyBdOiBib29sZWFuIH0+eyB9KTtcbn1cbiovXG5leHBvcnQgY2xhc3MgSW50ZXJmYWNlIHtcbiAgICBjb25zdHJ1Y3RvcihmcmFnbWVudHMpIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIEludGVyZmFjZSk7XG4gICAgICAgIGxldCBhYmkgPSBbXTtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJhZ21lbnRzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgYWJpID0gSlNPTi5wYXJzZShmcmFnbWVudHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWJpID0gZnJhZ21lbnRzO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiZnJhZ21lbnRzXCIsIGFiaS5tYXAoKGZyYWdtZW50KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gRnJhZ21lbnQuZnJvbShmcmFnbWVudCk7XG4gICAgICAgIH0pLmZpbHRlcigoZnJhZ21lbnQpID0+IChmcmFnbWVudCAhPSBudWxsKSkpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9hYmlDb2RlclwiLCBnZXRTdGF0aWMoKG5ldy50YXJnZXQpLCBcImdldEFiaUNvZGVyXCIpKCkpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImZ1bmN0aW9uc1wiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiZXJyb3JzXCIsIHt9KTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJldmVudHNcIiwge30pO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInN0cnVjdHNcIiwge30pO1xuICAgICAgICAvLyBBZGQgYWxsIGZyYWdtZW50cyBieSB0aGVpciBzaWduYXR1cmVcbiAgICAgICAgdGhpcy5mcmFnbWVudHMuZm9yRWFjaCgoZnJhZ21lbnQpID0+IHtcbiAgICAgICAgICAgIGxldCBidWNrZXQgPSBudWxsO1xuICAgICAgICAgICAgc3dpdGNoIChmcmFnbWVudC50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnN0cnVjdG9yXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcGxveSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJkdXBsaWNhdGUgZGVmaW5pdGlvbiAtIGNvbnN0cnVjdG9yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2tOYW1lcyhmcmFnbWVudCwgXCJpbnB1dFwiLCBmcmFnbWVudC5pbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImRlcGxveVwiLCBmcmFnbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVja05hbWVzKGZyYWdtZW50LCBcImlucHV0XCIsIGZyYWdtZW50LmlucHV0cyk7XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2tOYW1lcyhmcmFnbWVudCwgXCJvdXRwdXRcIiwgKDxGdW5jdGlvbkZyYWdtZW50PmZyYWdtZW50KS5vdXRwdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0ID0gdGhpcy5mdW5jdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJldmVudFwiOlxuICAgICAgICAgICAgICAgICAgICAvL2NoZWNrTmFtZXMoZnJhZ21lbnQsIFwiaW5wdXRcIiwgZnJhZ21lbnQuaW5wdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgYnVja2V0ID0gdGhpcy5ldmVudHM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBmcmFnbWVudC5mb3JtYXQoKTtcbiAgICAgICAgICAgIGlmIChidWNrZXRbc2lnbmF0dXJlXSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiZHVwbGljYXRlIGRlZmluaXRpb24gLSBcIiArIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnVja2V0W3NpZ25hdHVyZV0gPSBmcmFnbWVudDtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIElmIHdlIGRvIG5vdCBoYXZlIGEgY29uc3RydWN0b3IgYWRkIGEgZGVmYXVsdFxuICAgICAgICBpZiAoIXRoaXMuZGVwbG95KSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImRlcGxveVwiLCBDb25zdHJ1Y3RvckZyYWdtZW50LmZyb20oe1xuICAgICAgICAgICAgICAgIHBheWFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2lzSW50ZXJmYWNlXCIsIHRydWUpO1xuICAgIH1cbiAgICBmb3JtYXQoZm9ybWF0KSB7XG4gICAgICAgIGlmICghZm9ybWF0KSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRUeXBlcy5mdWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JtYXQgPT09IEZvcm1hdFR5cGVzLnNpZ2hhc2gpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnRlcmZhY2UgZG9lcyBub3Qgc3VwcG9ydCBmb3JtYXR0aW5nIHNpZ2hhc2hcIiwgXCJmb3JtYXRcIiwgZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhYmkgPSB0aGlzLmZyYWdtZW50cy5tYXAoKGZyYWdtZW50KSA9PiBmcmFnbWVudC5mb3JtYXQoZm9ybWF0KSk7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gcmUtYnVuZGxlIHRoZSBKU09OIGZyYWdtZW50cyBhIGJpdFxuICAgICAgICBpZiAoZm9ybWF0ID09PSBGb3JtYXRUeXBlcy5qc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYWJpLm1hcCgoaikgPT4gSlNPTi5wYXJzZShqKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhYmk7XG4gICAgfVxuICAgIC8vIFN1Yi1jbGFzc2VzIGNhbiBvdmVycmlkZSB0aGVzZSB0byBoYW5kbGUgb3RoZXIgYmxvY2tjaGFpbnNcbiAgICBzdGF0aWMgZ2V0QWJpQ29kZXIoKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0QWJpQ29kZXI7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIGdldEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRTaWdoYXNoKGZ1bmN0aW9uRnJhZ21lbnQpIHtcbiAgICAgICAgcmV0dXJuIGhleERhdGFTbGljZShpZChmdW5jdGlvbkZyYWdtZW50LmZvcm1hdCgpKSwgMCwgNCk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRFdmVudFRvcGljKGV2ZW50RnJhZ21lbnQpIHtcbiAgICAgICAgcmV0dXJuIGlkKGV2ZW50RnJhZ21lbnQuZm9ybWF0KCkpO1xuICAgIH1cbiAgICAvLyBGaW5kIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBieSBhbnkgbWVhbnMgbmVjZXNzYXJ5ICh1bmxlc3MgaXQgaXMgYW1iaWd1b3VzKVxuICAgIGdldEZ1bmN0aW9uKG5hbWVPclNpZ25hdHVyZU9yU2lnaGFzaCkge1xuICAgICAgICBpZiAoaXNIZXhTdHJpbmcobmFtZU9yU2lnbmF0dXJlT3JTaWdoYXNoKSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuZnVuY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVPclNpZ25hdHVyZU9yU2lnaGFzaCA9PT0gdGhpcy5nZXRTaWdoYXNoKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZ1bmN0aW9uc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwibm8gbWF0Y2hpbmcgZnVuY3Rpb25cIiwgXCJzaWdoYXNoXCIsIG5hbWVPclNpZ25hdHVyZU9yU2lnaGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXQgaXMgYSBiYXJlIG5hbWUsIGxvb2sgdXAgdGhlIGZ1bmN0aW9uICh3aWxsIHJldHVybiBudWxsIGlmIGFtYmlndW91cylcbiAgICAgICAgaWYgKG5hbWVPclNpZ25hdHVyZU9yU2lnaGFzaC5pbmRleE9mKFwiKFwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lT3JTaWduYXR1cmVPclNpZ2hhc2gudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSBPYmplY3Qua2V5cyh0aGlzLmZ1bmN0aW9ucykuZmlsdGVyKChmKSA9PiAoZi5zcGxpdChcIihcIiAvKiBmaXg6KSAqLylbMF0gPT09IG5hbWUpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwibm8gbWF0Y2hpbmcgZnVuY3Rpb25cIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmcubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJtdWx0aXBsZSBtYXRjaGluZyBmdW5jdGlvbnNcIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25zW21hdGNoaW5nWzBdXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3JtbGl6ZSB0aGUgc2lnbmF0dXJlIGFuZCBsb29rdXAgdGhlIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZnVuY3Rpb25zW0Z1bmN0aW9uRnJhZ21lbnQuZnJvbVN0cmluZyhuYW1lT3JTaWduYXR1cmVPclNpZ2hhc2gpLmZvcm1hdCgpXTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJubyBtYXRjaGluZyBmdW5jdGlvblwiLCBcInNpZ25hdHVyZVwiLCBuYW1lT3JTaWduYXR1cmVPclNpZ2hhc2gpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIEZpbmQgYW4gZXZlbnQgZGVmaW5pdGlvbiBieSBhbnkgbWVhbnMgbmVjZXNzYXJ5ICh1bmxlc3MgaXQgaXMgYW1iaWd1b3VzKVxuICAgIGdldEV2ZW50KG5hbWVPclNpZ25hdHVyZU9yVG9waWMpIHtcbiAgICAgICAgaWYgKGlzSGV4U3RyaW5nKG5hbWVPclNpZ25hdHVyZU9yVG9waWMpKSB7XG4gICAgICAgICAgICBjb25zdCB0b3BpY2hhc2ggPSBuYW1lT3JTaWduYXR1cmVPclRvcGljLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdGhpcy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodG9waWNoYXNoID09PSB0aGlzLmdldEV2ZW50VG9waWMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzW25hbWVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJubyBtYXRjaGluZyBldmVudFwiLCBcInRvcGljaGFzaFwiLCB0b3BpY2hhc2gpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0IGlzIGEgYmFyZSBuYW1lLCBsb29rIHVwIHRoZSBmdW5jdGlvbiAod2lsbCByZXR1cm4gbnVsbCBpZiBhbWJpZ3VvdXMpXG4gICAgICAgIGlmIChuYW1lT3JTaWduYXR1cmVPclRvcGljLmluZGV4T2YoXCIoXCIpID09PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVPclNpZ25hdHVyZU9yVG9waWMudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hpbmcgPSBPYmplY3Qua2V5cyh0aGlzLmV2ZW50cykuZmlsdGVyKChmKSA9PiAoZi5zcGxpdChcIihcIiAvKiBmaXg6KSAqLylbMF0gPT09IG5hbWUpKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwibm8gbWF0Y2hpbmcgZXZlbnRcIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWF0Y2hpbmcubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJtdWx0aXBsZSBtYXRjaGluZyBldmVudHNcIiwgXCJuYW1lXCIsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRzW21hdGNoaW5nWzBdXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOb3JtbGl6ZSB0aGUgc2lnbmF0dXJlIGFuZCBsb29rdXAgdGhlIGZ1bmN0aW9uXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZXZlbnRzW0V2ZW50RnJhZ21lbnQuZnJvbVN0cmluZyhuYW1lT3JTaWduYXR1cmVPclRvcGljKS5mb3JtYXQoKV07XG4gICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwibm8gbWF0Y2hpbmcgZXZlbnRcIiwgXCJzaWduYXR1cmVcIiwgbmFtZU9yU2lnbmF0dXJlT3JUb3BpYyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBzaWdoYXNoICh0aGUgYnl0ZXM0IHNlbGVjdG9yKSB1c2VkIGJ5IFNvbGlkaXR5IHRvIGlkZW50aWZ5IGEgZnVuY3Rpb25cbiAgICBnZXRTaWdoYXNoKGZ1bmN0aW9uRnJhZ21lbnQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnVuY3Rpb25GcmFnbWVudCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uRnJhZ21lbnQgPSB0aGlzLmdldEZ1bmN0aW9uKGZ1bmN0aW9uRnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRTdGF0aWModGhpcy5jb25zdHJ1Y3RvciwgXCJnZXRTaWdoYXNoXCIpKGZ1bmN0aW9uRnJhZ21lbnQpO1xuICAgIH1cbiAgICAvLyBHZXQgdGhlIHRvcGljICh0aGUgYnl0ZXMzMiBoYXNoKSB1c2VkIGJ5IFNvbGlkaXR5IHRvIGlkZW50aWZ5IGFuIGV2ZW50XG4gICAgZ2V0RXZlbnRUb3BpYyhldmVudEZyYWdtZW50KSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGV2ZW50RnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBldmVudEZyYWdtZW50ID0gdGhpcy5nZXRFdmVudChldmVudEZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0U3RhdGljKHRoaXMuY29uc3RydWN0b3IsIFwiZ2V0RXZlbnRUb3BpY1wiKShldmVudEZyYWdtZW50KTtcbiAgICB9XG4gICAgX2RlY29kZVBhcmFtcyhwYXJhbXMsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FiaUNvZGVyLmRlY29kZShwYXJhbXMsIGRhdGEpO1xuICAgIH1cbiAgICBfZW5jb2RlUGFyYW1zKHBhcmFtcywgdmFsdWVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hYmlDb2Rlci5lbmNvZGUocGFyYW1zLCB2YWx1ZXMpO1xuICAgIH1cbiAgICBlbmNvZGVEZXBsb3kodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lbmNvZGVQYXJhbXModGhpcy5kZXBsb3kuaW5wdXRzLCB2YWx1ZXMgfHwgW10pO1xuICAgIH1cbiAgICAvLyBEZWNvZGUgdGhlIGRhdGEgZm9yIGEgZnVuY3Rpb24gY2FsbCAoZS5nLiB0eC5kYXRhKVxuICAgIGRlY29kZUZ1bmN0aW9uRGF0YShmdW5jdGlvbkZyYWdtZW50LCBkYXRhKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGZ1bmN0aW9uRnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBmdW5jdGlvbkZyYWdtZW50ID0gdGhpcy5nZXRGdW5jdGlvbihmdW5jdGlvbkZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IGFycmF5aWZ5KGRhdGEpO1xuICAgICAgICBpZiAoaGV4bGlmeShieXRlcy5zbGljZSgwLCA0KSkgIT09IHRoaXMuZ2V0U2lnaGFzaChmdW5jdGlvbkZyYWdtZW50KSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgZGF0YSBzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2ggZnVuY3Rpb24gJHtmdW5jdGlvbkZyYWdtZW50Lm5hbWV9LmAsIFwiZGF0YVwiLCBoZXhsaWZ5KGJ5dGVzKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlY29kZVBhcmFtcyhmdW5jdGlvbkZyYWdtZW50LmlucHV0cywgYnl0ZXMuc2xpY2UoNCkpO1xuICAgIH1cbiAgICAvLyBFbmNvZGUgdGhlIGRhdGEgZm9yIGEgZnVuY3Rpb24gY2FsbCAoZS5nLiB0eC5kYXRhKVxuICAgIGVuY29kZUZ1bmN0aW9uRGF0YShmdW5jdGlvbkZyYWdtZW50LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnVuY3Rpb25GcmFnbWVudCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uRnJhZ21lbnQgPSB0aGlzLmdldEZ1bmN0aW9uKGZ1bmN0aW9uRnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZXhsaWZ5KGNvbmNhdChbXG4gICAgICAgICAgICB0aGlzLmdldFNpZ2hhc2goZnVuY3Rpb25GcmFnbWVudCksXG4gICAgICAgICAgICB0aGlzLl9lbmNvZGVQYXJhbXMoZnVuY3Rpb25GcmFnbWVudC5pbnB1dHMsIHZhbHVlcyB8fCBbXSlcbiAgICAgICAgXSkpO1xuICAgIH1cbiAgICAvLyBEZWNvZGUgdGhlIHJlc3VsdCBmcm9tIGEgZnVuY3Rpb24gY2FsbCAoZS5nLiBmcm9tIGV0aF9jYWxsKVxuICAgIGRlY29kZUZ1bmN0aW9uUmVzdWx0KGZ1bmN0aW9uRnJhZ21lbnQsIGRhdGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnVuY3Rpb25GcmFnbWVudCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uRnJhZ21lbnQgPSB0aGlzLmdldEZ1bmN0aW9uKGZ1bmN0aW9uRnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBieXRlcyA9IGFycmF5aWZ5KGRhdGEpO1xuICAgICAgICBsZXQgcmVhc29uID0gbnVsbDtcbiAgICAgICAgbGV0IGVycm9yU2lnbmF0dXJlID0gbnVsbDtcbiAgICAgICAgc3dpdGNoIChieXRlcy5sZW5ndGggJSB0aGlzLl9hYmlDb2Rlci5fZ2V0V29yZFNpemUoKSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hYmlDb2Rlci5kZWNvZGUoZnVuY3Rpb25GcmFnbWVudC5vdXRwdXRzLCBieXRlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgaWYgKGhleGxpZnkoYnl0ZXMuc2xpY2UoMCwgNCkpID09PSBcIjB4MDhjMzc5YTBcIikge1xuICAgICAgICAgICAgICAgICAgICBlcnJvclNpZ25hdHVyZSA9IFwiRXJyb3Ioc3RyaW5nKVwiO1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSB0aGlzLl9hYmlDb2Rlci5kZWNvZGUoW1wic3RyaW5nXCJdLCBieXRlcy5zbGljZSg0KSlbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcImNhbGwgcmV2ZXJ0IGV4Y2VwdGlvblwiLCBMb2dnZXIuZXJyb3JzLkNBTExfRVhDRVBUSU9OLCB7XG4gICAgICAgICAgICBtZXRob2Q6IGZ1bmN0aW9uRnJhZ21lbnQuZm9ybWF0KCksXG4gICAgICAgICAgICBlcnJvclNpZ25hdHVyZTogZXJyb3JTaWduYXR1cmUsXG4gICAgICAgICAgICBlcnJvckFyZ3M6IFtyZWFzb25dLFxuICAgICAgICAgICAgcmVhc29uOiByZWFzb25cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEVuY29kZSB0aGUgcmVzdWx0IGZvciBhIGZ1bmN0aW9uIGNhbGwgKGUuZy4gZm9yIGV0aF9jYWxsKVxuICAgIGVuY29kZUZ1bmN0aW9uUmVzdWx0KGZ1bmN0aW9uRnJhZ21lbnQsIHZhbHVlcykge1xuICAgICAgICBpZiAodHlwZW9mIChmdW5jdGlvbkZyYWdtZW50KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZnVuY3Rpb25GcmFnbWVudCA9IHRoaXMuZ2V0RnVuY3Rpb24oZnVuY3Rpb25GcmFnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhleGxpZnkodGhpcy5fYWJpQ29kZXIuZW5jb2RlKGZ1bmN0aW9uRnJhZ21lbnQub3V0cHV0cywgdmFsdWVzIHx8IFtdKSk7XG4gICAgfVxuICAgIC8vIENyZWF0ZSB0aGUgZmlsdGVyIGZvciB0aGUgZXZlbnQgd2l0aCBzZWFyY2ggY3JpdGVyaWEgKGUuZy4gZm9yIGV0aF9maWx0ZXJMb2cpXG4gICAgZW5jb2RlRmlsdGVyVG9waWNzKGV2ZW50RnJhZ21lbnQsIHZhbHVlcykge1xuICAgICAgICBpZiAodHlwZW9mIChldmVudEZyYWdtZW50KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZXZlbnRGcmFnbWVudCA9IHRoaXMuZ2V0RXZlbnQoZXZlbnRGcmFnbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiBldmVudEZyYWdtZW50LmlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwidG9vIG1hbnkgYXJndW1lbnRzIGZvciBcIiArIGV2ZW50RnJhZ21lbnQuZm9ybWF0KCksIExvZ2dlci5lcnJvcnMuVU5FWFBFQ1RFRF9BUkdVTUVOVCwge1xuICAgICAgICAgICAgICAgIGFyZ3VtZW50OiBcInZhbHVlc1wiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3BpY3MgPSBbXTtcbiAgICAgICAgaWYgKCFldmVudEZyYWdtZW50LmFub255bW91cykge1xuICAgICAgICAgICAgdG9waWNzLnB1c2godGhpcy5nZXRFdmVudFRvcGljKGV2ZW50RnJhZ21lbnQpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbmNvZGVUb3BpYyA9IChwYXJhbSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnR5cGUgPT09IFwiYnl0ZXNcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBrZWNjYWsyNTYoaGV4bGlmeSh2YWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2hlY2sgYWRkcmVzc2VzIGFyZSB2YWxpZFxuICAgICAgICAgICAgaWYgKHBhcmFtLnR5cGUgPT09IFwiYWRkcmVzc1wiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYWJpQ29kZXIuZW5jb2RlKFtcImFkZHJlc3NcIl0sIFt2YWx1ZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhleFplcm9QYWQoaGV4bGlmeSh2YWx1ZSksIDMyKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgbGV0IHBhcmFtID0gZXZlbnRGcmFnbWVudC5pbnB1dHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFwYXJhbS5pbmRleGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImNhbm5vdCBmaWx0ZXIgbm9uLWluZGV4ZWQgcGFyYW1ldGVyczsgbXVzdCBiZSBudWxsXCIsIChcImNvbnRyYWN0LlwiICsgcGFyYW0ubmFtZSksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0b3BpY3MucHVzaChudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLmJhc2VUeXBlID09PSBcImFycmF5XCIgfHwgcGFyYW0uYmFzZVR5cGUgPT09IFwidHVwbGVcIikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJmaWx0ZXJpbmcgd2l0aCB0dXBsZXMgb3IgYXJyYXlzIG5vdCBzdXBwb3J0ZWRcIiwgKFwiY29udHJhY3QuXCIgKyBwYXJhbS5uYW1lKSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0b3BpY3MucHVzaCh2YWx1ZS5tYXAoKHZhbHVlKSA9PiBlbmNvZGVUb3BpYyhwYXJhbSwgdmFsdWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b3BpY3MucHVzaChlbmNvZGVUb3BpYyhwYXJhbSwgdmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRyaW0gb2ZmIHRyYWlsaW5nIG51bGxzXG4gICAgICAgIHdoaWxlICh0b3BpY3MubGVuZ3RoICYmIHRvcGljc1t0b3BpY3MubGVuZ3RoIC0gMV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRvcGljcy5wb3AoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9waWNzO1xuICAgIH1cbiAgICBlbmNvZGVFdmVudExvZyhldmVudEZyYWdtZW50LCB2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZXZlbnRGcmFnbWVudCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGV2ZW50RnJhZ21lbnQgPSB0aGlzLmdldEV2ZW50KGV2ZW50RnJhZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvcGljcyA9IFtdO1xuICAgICAgICBjb25zdCBkYXRhVHlwZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZGF0YVZhbHVlcyA9IFtdO1xuICAgICAgICBpZiAoIWV2ZW50RnJhZ21lbnQuYW5vbnltb3VzKSB7XG4gICAgICAgICAgICB0b3BpY3MucHVzaCh0aGlzLmdldEV2ZW50VG9waWMoZXZlbnRGcmFnbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9PSBldmVudEZyYWdtZW50LmlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJldmVudCBhcmd1bWVudHMvdmFsdWVzIG1pc21hdGNoXCIsIFwidmFsdWVzXCIsIHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnRGcmFnbWVudC5pbnB1dHMuZm9yRWFjaCgocGFyYW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1tpbmRleF07XG4gICAgICAgICAgICBpZiAocGFyYW0uaW5kZXhlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKGlkKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnR5cGUgPT09IFwiYnl0ZXNcIikge1xuICAgICAgICAgICAgICAgICAgICB0b3BpY3MucHVzaChrZWNjYWsyNTYodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0uYmFzZVR5cGUgPT09IFwidHVwbGVcIiB8fCBwYXJhbS5iYXNlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEBUT09EXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGljcy5wdXNoKHRoaXMuX2FiaUNvZGVyLmVuY29kZShbcGFyYW0udHlwZV0sIFt2YWx1ZV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhVHlwZXMucHVzaChwYXJhbSk7XG4gICAgICAgICAgICAgICAgZGF0YVZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiB0aGlzLl9hYmlDb2Rlci5lbmNvZGUoZGF0YVR5cGVzLCBkYXRhVmFsdWVzKSxcbiAgICAgICAgICAgIHRvcGljczogdG9waWNzXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIERlY29kZSBhIGZpbHRlciBmb3IgdGhlIGV2ZW50IGFuZCB0aGUgc2VhcmNoIGNyaXRlcmlhXG4gICAgZGVjb2RlRXZlbnRMb2coZXZlbnRGcmFnbWVudCwgZGF0YSwgdG9waWNzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKGV2ZW50RnJhZ21lbnQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBldmVudEZyYWdtZW50ID0gdGhpcy5nZXRFdmVudChldmVudEZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9waWNzICE9IG51bGwgJiYgIWV2ZW50RnJhZ21lbnQuYW5vbnltb3VzKSB7XG4gICAgICAgICAgICBsZXQgdG9waWNIYXNoID0gdGhpcy5nZXRFdmVudFRvcGljKGV2ZW50RnJhZ21lbnQpO1xuICAgICAgICAgICAgaWYgKCFpc0hleFN0cmluZyh0b3BpY3NbMF0sIDMyKSB8fCB0b3BpY3NbMF0udG9Mb3dlckNhc2UoKSAhPT0gdG9waWNIYXNoKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJmcmFnbWVudC90b3BpYyBtaXNtYXRjaFwiLCBMb2dnZXIuZXJyb3JzLklOVkFMSURfQVJHVU1FTlQsIHsgYXJndW1lbnQ6IFwidG9waWNzWzBdXCIsIGV4cGVjdGVkOiB0b3BpY0hhc2gsIHZhbHVlOiB0b3BpY3NbMF0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3BpY3MgPSB0b3BpY3Muc2xpY2UoMSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGluZGV4ZWQgPSBbXTtcbiAgICAgICAgbGV0IG5vbkluZGV4ZWQgPSBbXTtcbiAgICAgICAgbGV0IGR5bmFtaWMgPSBbXTtcbiAgICAgICAgZXZlbnRGcmFnbWVudC5pbnB1dHMuZm9yRWFjaCgocGFyYW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0uaW5kZXhlZCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbS50eXBlID09PSBcInN0cmluZ1wiIHx8IHBhcmFtLnR5cGUgPT09IFwiYnl0ZXNcIiB8fCBwYXJhbS5iYXNlVHlwZSA9PT0gXCJ0dXBsZVwiIHx8IHBhcmFtLmJhc2VUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhlZC5wdXNoKFBhcmFtVHlwZS5mcm9tT2JqZWN0KHsgdHlwZTogXCJieXRlczMyXCIsIG5hbWU6IHBhcmFtLm5hbWUgfSkpO1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLnB1c2godHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnB1c2gocGFyYW0pO1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljLnB1c2goZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vbkluZGV4ZWQucHVzaChwYXJhbSk7XG4gICAgICAgICAgICAgICAgZHluYW1pYy5wdXNoKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGxldCByZXN1bHRJbmRleGVkID0gKHRvcGljcyAhPSBudWxsKSA/IHRoaXMuX2FiaUNvZGVyLmRlY29kZShpbmRleGVkLCBjb25jYXQodG9waWNzKSkgOiBudWxsO1xuICAgICAgICBsZXQgcmVzdWx0Tm9uSW5kZXhlZCA9IHRoaXMuX2FiaUNvZGVyLmRlY29kZShub25JbmRleGVkLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgbm9uSW5kZXhlZEluZGV4ID0gMCwgaW5kZXhlZEluZGV4ID0gMDtcbiAgICAgICAgZXZlbnRGcmFnbWVudC5pbnB1dHMuZm9yRWFjaCgocGFyYW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0uaW5kZXhlZCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbmRleGVkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IG5ldyBJbmRleGVkKHsgX2lzSW5kZXhlZDogdHJ1ZSwgaGFzaDogbnVsbCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZHluYW1pY1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IG5ldyBJbmRleGVkKHsgX2lzSW5kZXhlZDogdHJ1ZSwgaGFzaDogcmVzdWx0SW5kZXhlZFtpbmRleGVkSW5kZXgrK10gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IHJlc3VsdEluZGV4ZWRbaW5kZXhlZEluZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IHJlc3VsdE5vbkluZGV4ZWRbbm9uSW5kZXhlZEluZGV4KytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFkZCB0aGUga2V5d29yZCBhcmd1bWVudCBpZiBuYW1lZCBhbmQgc2FmZVxuICAgICAgICAgICAgaWYgKHBhcmFtLm5hbWUgJiYgcmVzdWx0W3BhcmFtLm5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlc3VsdFtpbmRleF07XG4gICAgICAgICAgICAgICAgLy8gTWFrZSBlcnJvciBuYW1lZCB2YWx1ZXMgdGhyb3cgb24gYWNjZXNzXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlc3VsdCwgcGFyYW0ubmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiAoKSA9PiB7IHRocm93IHdyYXBBY2Nlc3NFcnJvcihgcHJvcGVydHkgJHtKU09OLnN0cmluZ2lmeShwYXJhbS5uYW1lKX1gLCB2YWx1ZSk7IH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbcGFyYW0ubmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBNYWtlIGFsbCBlcnJvciBpbmRleGVkIHZhbHVlcyB0aHJvdyBvbiBhY2Nlc3NcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVzdWx0W2ldO1xuICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBpLCB7XG4gICAgICAgICAgICAgICAgICAgIGdldDogKCkgPT4geyB0aHJvdyB3cmFwQWNjZXNzRXJyb3IoYGluZGV4ICR7aX1gLCB2YWx1ZSk7IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShyZXN1bHQpO1xuICAgIH1cbiAgICAvLyBHaXZlbiBhIHRyYW5zYWN0aW9uLCBmaW5kIHRoZSBtYXRjaGluZyBmdW5jdGlvbiBmcmFnbWVudCAoaWYgYW55KSBhbmRcbiAgICAvLyBkZXRlcm1pbmUgYWxsIGl0cyBwcm9wZXJ0aWVzIGFuZCBjYWxsIHBhcmFtZXRlcnNcbiAgICBwYXJzZVRyYW5zYWN0aW9uKHR4KSB7XG4gICAgICAgIGxldCBmcmFnbWVudCA9IHRoaXMuZ2V0RnVuY3Rpb24odHguZGF0YS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWZyYWdtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uRGVzY3JpcHRpb24oe1xuICAgICAgICAgICAgYXJnczogdGhpcy5fYWJpQ29kZXIuZGVjb2RlKGZyYWdtZW50LmlucHV0cywgXCIweFwiICsgdHguZGF0YS5zdWJzdHJpbmcoMTApKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uRnJhZ21lbnQ6IGZyYWdtZW50LFxuICAgICAgICAgICAgbmFtZTogZnJhZ21lbnQubmFtZSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTogZnJhZ21lbnQuZm9ybWF0KCksXG4gICAgICAgICAgICBzaWdoYXNoOiB0aGlzLmdldFNpZ2hhc2goZnJhZ21lbnQpLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ051bWJlci5mcm9tKHR4LnZhbHVlIHx8IFwiMFwiKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIEdpdmVuIGFuIGV2ZW50IGxvZywgZmluZCB0aGUgbWF0Y2hpbmcgZXZlbnQgZnJhZ21lbnQgKGlmIGFueSkgYW5kXG4gICAgLy8gZGV0ZXJtaW5lIGFsbCBpdHMgcHJvcGVydGllcyBhbmQgdmFsdWVzXG4gICAgcGFyc2VMb2cobG9nKSB7XG4gICAgICAgIGxldCBmcmFnbWVudCA9IHRoaXMuZ2V0RXZlbnQobG9nLnRvcGljc1swXSk7XG4gICAgICAgIGlmICghZnJhZ21lbnQgfHwgZnJhZ21lbnQuYW5vbnltb3VzKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBAVE9ETzogSWYgYW5vbnltb3VzLCBhbmQgdGhlIG9ubHkgbWV0aG9kLCBhbmQgdGhlIGlucHV0IGNvdW50IG1hdGNoZXMsIHNob3VsZCB3ZSBwYXJzZT9cbiAgICAgICAgLy8gICAgICAgIFByb2JhYmx5IG5vdCwgYmVjYXVzZSBqdXN0IGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgZXZlbnQgaW4gdGhlIEFCSSBkb2VzXG4gICAgICAgIC8vICAgICAgICBub3QgbWVhbiB3ZSBoYXZlIHRoZSBmdWxsIEFCSTsgbWF5YmUganN1dCBhIGZyYWdtZW50P1xuICAgICAgICByZXR1cm4gbmV3IExvZ0Rlc2NyaXB0aW9uKHtcbiAgICAgICAgICAgIGV2ZW50RnJhZ21lbnQ6IGZyYWdtZW50LFxuICAgICAgICAgICAgbmFtZTogZnJhZ21lbnQubmFtZSxcbiAgICAgICAgICAgIHNpZ25hdHVyZTogZnJhZ21lbnQuZm9ybWF0KCksXG4gICAgICAgICAgICB0b3BpYzogdGhpcy5nZXRFdmVudFRvcGljKGZyYWdtZW50KSxcbiAgICAgICAgICAgIGFyZ3M6IHRoaXMuZGVjb2RlRXZlbnRMb2coZnJhZ21lbnQsIGxvZy5kYXRhLCBsb2cudG9waWNzKVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLypcbiAgICBzdGF0aWMgZnJvbSh2YWx1ZTogQXJyYXk8RnJhZ21lbnQgfCBzdHJpbmcgfCBKc29uQWJpPiB8IHN0cmluZyB8IEludGVyZmFjZSkge1xuICAgICAgICBpZiAoSW50ZXJmYWNlLmlzSW50ZXJmYWNlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludGVyZmFjZShKU09OLnBhcnNlKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2UodmFsdWUpO1xuICAgIH1cbiAgICAqL1xuICAgIHN0YXRpYyBpc0ludGVyZmFjZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX2lzSW50ZXJmYWNlKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbnRlcmZhY2UuanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcImFic3RyYWN0LXByb3ZpZGVyLzUuMC45XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGlzSGV4U3RyaW5nIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBEZXNjcmlwdGlvbiwgZGVmaW5lUmVhZE9ubHkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuO1xuO1xuLy9leHBvcnQgdHlwZSBDYWxsVHJhbnNhY3Rpb25hYmxlID0ge1xuLy8gICAgY2FsbCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25SZXF1ZXN0KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlc3BvbnNlPjtcbi8vfTtcbmV4cG9ydCBjbGFzcyBGb3JrRXZlbnQgZXh0ZW5kcyBEZXNjcmlwdGlvbiB7XG4gICAgc3RhdGljIGlzRm9ya0V2ZW50KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5faXNGb3JrRXZlbnQpO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBCbG9ja0ZvcmtFdmVudCBleHRlbmRzIEZvcmtFdmVudCB7XG4gICAgY29uc3RydWN0b3IoYmxvY2tIYXNoLCBleHBpcnkpIHtcbiAgICAgICAgaWYgKCFpc0hleFN0cmluZyhibG9ja0hhc2gsIDMyKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYmxvY2tIYXNoXCIsIFwiYmxvY2tIYXNoXCIsIGJsb2NrSGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgX2lzRm9ya0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgX2lzQmxvY2tGb3JrRXZlbnQ6IHRydWUsXG4gICAgICAgICAgICBleHBpcnk6IChleHBpcnkgfHwgMCksXG4gICAgICAgICAgICBibG9ja0hhc2g6IGJsb2NrSGFzaFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25Gb3JrRXZlbnQgZXh0ZW5kcyBGb3JrRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGhhc2gsIGV4cGlyeSkge1xuICAgICAgICBpZiAoIWlzSGV4U3RyaW5nKGhhc2gsIDMyKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgdHJhbnNhY3Rpb24gaGFzaFwiLCBcImhhc2hcIiwgaGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgX2lzRm9ya0V2ZW50OiB0cnVlLFxuICAgICAgICAgICAgX2lzVHJhbnNhY3Rpb25Gb3JrRXZlbnQ6IHRydWUsXG4gICAgICAgICAgICBleHBpcnk6IChleHBpcnkgfHwgMCksXG4gICAgICAgICAgICBoYXNoOiBoYXNoXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbk9yZGVyRm9ya0V2ZW50IGV4dGVuZHMgRm9ya0V2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihiZWZvcmVIYXNoLCBhZnRlckhhc2gsIGV4cGlyeSkge1xuICAgICAgICBpZiAoIWlzSGV4U3RyaW5nKGJlZm9yZUhhc2gsIDMyKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgdHJhbnNhY3Rpb24gaGFzaFwiLCBcImJlZm9yZUhhc2hcIiwgYmVmb3JlSGFzaCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0hleFN0cmluZyhhZnRlckhhc2gsIDMyKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgdHJhbnNhY3Rpb24gaGFzaFwiLCBcImFmdGVySGFzaFwiLCBhZnRlckhhc2gpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIF9pc0ZvcmtFdmVudDogdHJ1ZSxcbiAgICAgICAgICAgIF9pc1RyYW5zYWN0aW9uT3JkZXJGb3JrRXZlbnQ6IHRydWUsXG4gICAgICAgICAgICBleHBpcnk6IChleHBpcnkgfHwgMCksXG4gICAgICAgICAgICBiZWZvcmVIYXNoOiBiZWZvcmVIYXNoLFxuICAgICAgICAgICAgYWZ0ZXJIYXNoOiBhZnRlckhhc2hcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRXhwb3J0ZWQgQWJzdHJhY3RzXG5leHBvcnQgY2xhc3MgUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBsb2dnZXIuY2hlY2tBYnN0cmFjdChuZXcudGFyZ2V0LCBQcm92aWRlcik7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2lzUHJvdmlkZXJcIiwgdHJ1ZSk7XG4gICAgfVxuICAgIC8vIEFsaWFzIGZvciBcIm9uXCJcbiAgICBhZGRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvLyBBbGlhcyBmb3IgXCJvZmZcIlxuICAgIHJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICBzdGF0aWMgaXNQcm92aWRlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX2lzUHJvdmlkZXIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJhYnN0cmFjdC1zaWduZXIvNS4wLjEzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgZGVmaW5lUmVhZE9ubHksIHJlc29sdmVQcm9wZXJ0aWVzLCBzaGFsbG93Q29weSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5jb25zdCBhbGxvd2VkVHJhbnNhY3Rpb25LZXlzID0gW1xuICAgIFwiY2hhaW5JZFwiLCBcImRhdGFcIiwgXCJmcm9tXCIsIFwiZ2FzTGltaXRcIiwgXCJnYXNQcmljZVwiLCBcIm5vbmNlXCIsIFwidG9cIiwgXCJ2YWx1ZVwiXG5dO1xuY29uc3QgZm9yd2FyZEVycm9ycyA9IFtcbiAgICBMb2dnZXIuZXJyb3JzLklOU1VGRklDSUVOVF9GVU5EUyxcbiAgICBMb2dnZXIuZXJyb3JzLk5PTkNFX0VYUElSRUQsXG4gICAgTG9nZ2VyLmVycm9ycy5SRVBMQUNFTUVOVF9VTkRFUlBSSUNFRCxcbl07XG47XG47XG5leHBvcnQgY2xhc3MgU2lnbmVyIHtcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gU3ViLWNsYXNzZXMgTVVTVCBjYWxsIHN1cGVyXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxvZ2dlci5jaGVja0Fic3RyYWN0KG5ldy50YXJnZXQsIFNpZ25lcik7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2lzU2lnbmVyXCIsIHRydWUpO1xuICAgIH1cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gU3ViLWNsYXNzZXMgTUFZIG92ZXJyaWRlIHRoZXNlXG4gICAgZ2V0QmFsYW5jZShibG9ja1RhZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tQcm92aWRlcihcImdldEJhbGFuY2VcIik7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5wcm92aWRlci5nZXRCYWxhbmNlKHRoaXMuZ2V0QWRkcmVzcygpLCBibG9ja1RhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRUcmFuc2FjdGlvbkNvdW50KGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1Byb3ZpZGVyKFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiKTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCB0aGlzLnByb3ZpZGVyLmdldFRyYW5zYWN0aW9uQ291bnQodGhpcy5nZXRBZGRyZXNzKCksIGJsb2NrVGFnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFBvcHVsYXRlcyBcImZyb21cIiBpZiB1bnNwZWNpZmllZCwgYW5kIGVzdGltYXRlcyB0aGUgZ2FzIGZvciB0aGUgdHJhbnNhdGlvblxuICAgIGVzdGltYXRlR2FzKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1Byb3ZpZGVyKFwiZXN0aW1hdGVHYXNcIik7XG4gICAgICAgICAgICBjb25zdCB0eCA9IHlpZWxkIHJlc29sdmVQcm9wZXJ0aWVzKHRoaXMuY2hlY2tUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikpO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMucHJvdmlkZXIuZXN0aW1hdGVHYXModHgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gUG9wdWxhdGVzIFwiZnJvbVwiIGlmIHVuc3BlY2lmaWVkLCBhbmQgY2FsbHMgd2l0aCB0aGUgdHJhbnNhdGlvblxuICAgIGNhbGwodHJhbnNhY3Rpb24sIGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1Byb3ZpZGVyKFwiY2FsbFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHR4ID0geWllbGQgcmVzb2x2ZVByb3BlcnRpZXModGhpcy5jaGVja1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSk7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5wcm92aWRlci5jYWxsKHR4LCBibG9ja1RhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBQb3B1bGF0ZXMgYWxsIGZpZWxkcyBpbiBhIHRyYW5zYWN0aW9uLCBzaWducyBpdCBhbmQgc2VuZHMgaXQgdG8gdGhlIG5ldHdvcmtcbiAgICBzZW5kVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fY2hlY2tQcm92aWRlcihcInNlbmRUcmFuc2FjdGlvblwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9wdWxhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikudGhlbigodHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNpZ25UcmFuc2FjdGlvbih0eCkudGhlbigoc2lnbmVkVHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5zZW5kVHJhbnNhY3Rpb24oc2lnbmVkVHgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRDaGFpbklkKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tQcm92aWRlcihcImdldENoYWluSWRcIik7XG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrID0geWllbGQgdGhpcy5wcm92aWRlci5nZXROZXR3b3JrKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV0d29yay5jaGFpbklkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0R2FzUHJpY2UoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1Byb3ZpZGVyKFwiZ2V0R2FzUHJpY2VcIik7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgdGhpcy5wcm92aWRlci5nZXRHYXNQcmljZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzb2x2ZU5hbWUobmFtZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdGhpcy5fY2hlY2tQcm92aWRlcihcInJlc29sdmVOYW1lXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMucHJvdmlkZXIucmVzb2x2ZU5hbWUobmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBDaGVja3MgYSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBjb250YWluIGludmFsaWQga2V5cyBhbmQgaWZcbiAgICAvLyBubyBcImZyb21cIiBpcyBwcm92aWRlZCwgcG9wdWxhdGVzIGl0LlxuICAgIC8vIC0gZG9lcyBOT1QgcmVxdWlyZSBhIHByb3ZpZGVyXG4gICAgLy8gLSBhZGRzIFwiZnJvbVwiIGlzIG5vdCBwcmVzZW50XG4gICAgLy8gLSByZXR1cm5zIGEgQ09QWSAoc2FmZSB0byBtdXRhdGUgdGhlIHJlc3VsdClcbiAgICAvLyBCeSBkZWZhdWx0IGNhbGxlZCBmcm9tOiAob3ZlcnJpZGluZyB0aGVzZSBwcmV2ZW50cyBpdClcbiAgICAvLyAgIC0gY2FsbFxuICAgIC8vICAgLSBlc3RpbWF0ZUdhc1xuICAgIC8vICAgLSBwb3B1bGF0ZVRyYW5zYWN0aW9uIChhbmQgdGhlcmVmb3Igc2VuZFRyYW5zYWN0aW9uKVxuICAgIGNoZWNrVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgIGlmIChhbGxvd2VkVHJhbnNhY3Rpb25LZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCB0cmFuc2FjdGlvbiBrZXk6IFwiICsga2V5LCBcInRyYW5zYWN0aW9uXCIsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eCA9IHNoYWxsb3dDb3B5KHRyYW5zYWN0aW9uKTtcbiAgICAgICAgaWYgKHR4LmZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgdHguZnJvbSA9IHRoaXMuZ2V0QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFueSBwcm92aWRlZCBhZGRyZXNzIG1hdGNoZXMgdGhpcyBzaWduZXJcbiAgICAgICAgICAgIHR4LmZyb20gPSBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHR4LmZyb20pLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWRkcmVzcygpXG4gICAgICAgICAgICBdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0WzBdLnRvTG93ZXJDYXNlKCkgIT09IHJlc3VsdFsxXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJmcm9tIGFkZHJlc3MgbWlzbWF0Y2hcIiwgXCJ0cmFuc2FjdGlvblwiLCB0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIC8vIFBvcHVsYXRlcyBBTEwga2V5cyBmb3IgYSB0cmFuc2FjdGlvbiBhbmQgY2hlY2tzIHRoYXQgXCJmcm9tXCIgbWF0Y2hlc1xuICAgIC8vIHRoaXMgU2lnbmVyLiBTaG91bGQgYmUgdXNlZCBieSBzZW5kVHJhbnNhY3Rpb24gYnV0IE5PVCBieSBzaWduVHJhbnNhY3Rpb24uXG4gICAgLy8gQnkgZGVmYXVsdCBjYWxsZWQgZnJvbTogKG92ZXJyaWRpbmcgdGhlc2UgcHJldmVudHMgaXQpXG4gICAgLy8gICAtIHNlbmRUcmFuc2FjdGlvblxuICAgIHBvcHVsYXRlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4ID0geWllbGQgcmVzb2x2ZVByb3BlcnRpZXModGhpcy5jaGVja1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSk7XG4gICAgICAgICAgICBpZiAodHgudG8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHR4LnRvID0gUHJvbWlzZS5yZXNvbHZlKHR4LnRvKS50aGVuKCh0bykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG8gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHlpZWxkIHRoaXMucmVzb2x2ZU5hbWUodG8pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwicHJvdmlkZWQgRU5TIG5hbWUgcmVzb2x2ZXMgdG8gbnVsbFwiLCBcInR4LnRvXCIsIHRvKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHguZ2FzUHJpY2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHR4Lmdhc1ByaWNlID0gdGhpcy5nZXRHYXNQcmljZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR4Lm5vbmNlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0eC5ub25jZSA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25Db3VudChcInBlbmRpbmdcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHguZ2FzTGltaXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHR4Lmdhc0xpbWl0ID0gdGhpcy5lc3RpbWF0ZUdhcyh0eCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3J3YXJkRXJyb3JzLmluZGV4T2YoZXJyb3IuY29kZSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwiY2Fubm90IGVzdGltYXRlIGdhczsgdHJhbnNhY3Rpb24gbWF5IGZhaWwgb3IgbWF5IHJlcXVpcmUgbWFudWFsIGdhcyBsaW1pdFwiLCBMb2dnZXIuZXJyb3JzLlVOUFJFRElDVEFCTEVfR0FTX0xJTUlULCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eDogdHhcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHguY2hhaW5JZCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdHguY2hhaW5JZCA9IHRoaXMuZ2V0Q2hhaW5JZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHguY2hhaW5JZCA9IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHR4LmNoYWluSWQpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENoYWluSWQoKVxuICAgICAgICAgICAgICAgIF0pLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHNbMV0gIT09IDAgJiYgcmVzdWx0c1swXSAhPT0gcmVzdWx0c1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImNoYWluSWQgYWRkcmVzcyBtaXNtYXRjaFwiLCBcInRyYW5zYWN0aW9uXCIsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5aWVsZCByZXNvbHZlUHJvcGVydGllcyh0eCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gU3ViLWNsYXNzZXMgU0hPVUxEIGxlYXZlIHRoZXNlIGFsb25lXG4gICAgX2NoZWNrUHJvdmlkZXIob3BlcmF0aW9uKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm92aWRlcikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJtaXNzaW5nIHByb3ZpZGVyXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAob3BlcmF0aW9uIHx8IFwiX2NoZWNrUHJvdmlkZXJcIilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBpc1NpZ25lcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX2lzU2lnbmVyKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVm9pZFNpZ25lciBleHRlbmRzIFNpZ25lciB7XG4gICAgY29uc3RydWN0b3IoYWRkcmVzcywgcHJvdmlkZXIpIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIFZvaWRTaWduZXIpO1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImFkZHJlc3NcIiwgYWRkcmVzcyk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHJvdmlkZXJcIiwgcHJvdmlkZXIgfHwgbnVsbCk7XG4gICAgfVxuICAgIGdldEFkZHJlc3MoKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5hZGRyZXNzKTtcbiAgICB9XG4gICAgX2ZhaWwobWVzc2FnZSwgb3BlcmF0aW9uKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKG1lc3NhZ2UsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7IG9wZXJhdGlvbjogb3BlcmF0aW9uIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2lnbk1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlZvaWRTaWduZXIgY2Fubm90IHNpZ24gbWVzc2FnZXNcIiwgXCJzaWduTWVzc2FnZVwiKTtcbiAgICB9XG4gICAgc2lnblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVm9pZFNpZ25lciBjYW5ub3Qgc2lnbiB0cmFuc2FjdGlvbnNcIiwgXCJzaWduVHJhbnNhY3Rpb25cIik7XG4gICAgfVxuICAgIF9zaWduVHlwZWREYXRhKGRvbWFpbiwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVm9pZFNpZ25lciBjYW5ub3Qgc2lnbiB0eXBlZCBkYXRhXCIsIFwic2lnblR5cGVkRGF0YVwiKTtcbiAgICB9XG4gICAgY29ubmVjdChwcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IFZvaWRTaWduZXIodGhpcy5hZGRyZXNzLCBwcm92aWRlcik7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcImFkZHJlc3MvNS4wLjEwXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBjb25jYXQsIGhleERhdGFMZW5ndGgsIGhleERhdGFTbGljZSwgaXNIZXhTdHJpbmcsIHN0cmlwWmVyb3MgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IEJpZ051bWJlciwgX2Jhc2UxNlRvMzYsIF9iYXNlMzZUbzE2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2JpZ251bWJlclwiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgZW5jb2RlIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3JscFwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuZnVuY3Rpb24gZ2V0Q2hlY2tzdW1BZGRyZXNzKGFkZHJlc3MpIHtcbiAgICBpZiAoIWlzSGV4U3RyaW5nKGFkZHJlc3MsIDIwKSkge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBhZGRyZXNzXCIsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICB9XG4gICAgYWRkcmVzcyA9IGFkZHJlc3MudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjaGFycyA9IGFkZHJlc3Muc3Vic3RyaW5nKDIpLnNwbGl0KFwiXCIpO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gbmV3IFVpbnQ4QXJyYXkoNDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDA7IGkrKykge1xuICAgICAgICBleHBhbmRlZFtpXSA9IGNoYXJzW2ldLmNoYXJDb2RlQXQoMCk7XG4gICAgfVxuICAgIGNvbnN0IGhhc2hlZCA9IGFycmF5aWZ5KGtlY2NhazI1NihleHBhbmRlZCkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDA7IGkgKz0gMikge1xuICAgICAgICBpZiAoKGhhc2hlZFtpID4+IDFdID4+IDQpID49IDgpIHtcbiAgICAgICAgICAgIGNoYXJzW2ldID0gY2hhcnNbaV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhhc2hlZFtpID4+IDFdICYgMHgwZikgPj0gOCkge1xuICAgICAgICAgICAgY2hhcnNbaSArIDFdID0gY2hhcnNbaSArIDFdLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIiArIGNoYXJzLmpvaW4oXCJcIik7XG59XG4vLyBTaGltcyBmb3IgZW52aXJvbm1lbnRzIHRoYXQgYXJlIG1pc3Npbmcgc29tZSByZXF1aXJlZCBjb25zdGFudHMgYW5kIGZ1bmN0aW9uc1xuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IDB4MWZmZmZmZmZmZmZmZmY7XG5mdW5jdGlvbiBsb2cxMCh4KSB7XG4gICAgaWYgKE1hdGgubG9nMTApIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubG9nMTAoeCk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4xMDtcbn1cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSW50ZXJuYXRpb25hbF9CYW5rX0FjY291bnRfTnVtYmVyXG4vLyBDcmVhdGUgbG9va3VwIHRhYmxlXG5jb25zdCBpYmFuTG9va3VwID0ge307XG5mb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHtcbiAgICBpYmFuTG9va3VwW1N0cmluZyhpKV0gPSBTdHJpbmcoaSk7XG59XG5mb3IgKGxldCBpID0gMDsgaSA8IDI2OyBpKyspIHtcbiAgICBpYmFuTG9va3VwW1N0cmluZy5mcm9tQ2hhckNvZGUoNjUgKyBpKV0gPSBTdHJpbmcoMTAgKyBpKTtcbn1cbi8vIEhvdyBtYW55IGRlY2ltYWwgZGlnaXRzIGNhbiB3ZSBwcm9jZXNzPyAoZm9yIDY0LWJpdCBmbG9hdCwgdGhpcyBpcyAxNSlcbmNvbnN0IHNhZmVEaWdpdHMgPSBNYXRoLmZsb29yKGxvZzEwKE1BWF9TQUZFX0lOVEVHRVIpKTtcbmZ1bmN0aW9uIGliYW5DaGVja3N1bShhZGRyZXNzKSB7XG4gICAgYWRkcmVzcyA9IGFkZHJlc3MudG9VcHBlckNhc2UoKTtcbiAgICBhZGRyZXNzID0gYWRkcmVzcy5zdWJzdHJpbmcoNCkgKyBhZGRyZXNzLnN1YnN0cmluZygwLCAyKSArIFwiMDBcIjtcbiAgICBsZXQgZXhwYW5kZWQgPSBhZGRyZXNzLnNwbGl0KFwiXCIpLm1hcCgoYykgPT4geyByZXR1cm4gaWJhbkxvb2t1cFtjXTsgfSkuam9pbihcIlwiKTtcbiAgICAvLyBKYXZhc2NyaXB0IGNhbiBoYW5kbGUgaW50ZWdlcnMgc2FmZWx5IHVwIHRvIDE1IChkZWNpbWFsKSBkaWdpdHNcbiAgICB3aGlsZSAoZXhwYW5kZWQubGVuZ3RoID49IHNhZmVEaWdpdHMpIHtcbiAgICAgICAgbGV0IGJsb2NrID0gZXhwYW5kZWQuc3Vic3RyaW5nKDAsIHNhZmVEaWdpdHMpO1xuICAgICAgICBleHBhbmRlZCA9IHBhcnNlSW50KGJsb2NrLCAxMCkgJSA5NyArIGV4cGFuZGVkLnN1YnN0cmluZyhibG9jay5sZW5ndGgpO1xuICAgIH1cbiAgICBsZXQgY2hlY2tzdW0gPSBTdHJpbmcoOTggLSAocGFyc2VJbnQoZXhwYW5kZWQsIDEwKSAlIDk3KSk7XG4gICAgd2hpbGUgKGNoZWNrc3VtLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgY2hlY2tzdW0gPSBcIjBcIiArIGNoZWNrc3VtO1xuICAgIH1cbiAgICByZXR1cm4gY2hlY2tzdW07XG59XG47XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWRkcmVzcyhhZGRyZXNzKSB7XG4gICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgaWYgKHR5cGVvZiAoYWRkcmVzcykgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYWRkcmVzc1wiLCBcImFkZHJlc3NcIiwgYWRkcmVzcyk7XG4gICAgfVxuICAgIGlmIChhZGRyZXNzLm1hdGNoKC9eKDB4KT9bMC05YS1mQS1GXXs0MH0kLykpIHtcbiAgICAgICAgLy8gTWlzc2luZyB0aGUgMHggcHJlZml4XG4gICAgICAgIGlmIChhZGRyZXNzLnN1YnN0cmluZygwLCAyKSAhPT0gXCIweFwiKSB7XG4gICAgICAgICAgICBhZGRyZXNzID0gXCIweFwiICsgYWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBnZXRDaGVja3N1bUFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICAgIC8vIEl0IGlzIGEgY2hlY2tzdW1tZWQgYWRkcmVzcyB3aXRoIGEgYmFkIGNoZWNrc3VtXG4gICAgICAgIGlmIChhZGRyZXNzLm1hdGNoKC8oW0EtRl0uKlthLWZdKXwoW2EtZl0uKltBLUZdKS8pICYmIHJlc3VsdCAhPT0gYWRkcmVzcykge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImJhZCBhZGRyZXNzIGNoZWNrc3VtXCIsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNYXliZSBJQ0FQPyAod2Ugb25seSBzdXBwb3J0IGRpcmVjdCBtb2RlKVxuICAgIH1cbiAgICBlbHNlIGlmIChhZGRyZXNzLm1hdGNoKC9eWEVbMC05XXsyfVswLTlBLVphLXpdezMwLDMxfSQvKSkge1xuICAgICAgICAvLyBJdCBpcyBhbiBJQ0FQIGFkZHJlc3Mgd2l0aCBhIGJhZCBjaGVja3N1bVxuICAgICAgICBpZiAoYWRkcmVzcy5zdWJzdHJpbmcoMiwgNCkgIT09IGliYW5DaGVja3N1bShhZGRyZXNzKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImJhZCBpY2FwIGNoZWNrc3VtXCIsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSBfYmFzZTM2VG8xNihhZGRyZXNzLnN1YnN0cmluZyg0KSk7XG4gICAgICAgIHdoaWxlIChyZXN1bHQubGVuZ3RoIDwgNDApIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IFwiMFwiICsgcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IGdldENoZWNrc3VtQWRkcmVzcyhcIjB4XCIgKyByZXN1bHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYWRkcmVzc1wiLCBcImFkZHJlc3NcIiwgYWRkcmVzcyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICB0cnkge1xuICAgICAgICBnZXRBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0SWNhcEFkZHJlc3MoYWRkcmVzcykge1xuICAgIGxldCBiYXNlMzYgPSBfYmFzZTE2VG8zNihnZXRBZGRyZXNzKGFkZHJlc3MpLnN1YnN0cmluZygyKSkudG9VcHBlckNhc2UoKTtcbiAgICB3aGlsZSAoYmFzZTM2Lmxlbmd0aCA8IDMwKSB7XG4gICAgICAgIGJhc2UzNiA9IFwiMFwiICsgYmFzZTM2O1xuICAgIH1cbiAgICByZXR1cm4gXCJYRVwiICsgaWJhbkNoZWNrc3VtKFwiWEUwMFwiICsgYmFzZTM2KSArIGJhc2UzNjtcbn1cbi8vIGh0dHA6Ly9ldGhlcmV1bS5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvNzYwL2hvdy1pcy10aGUtYWRkcmVzcy1vZi1hbi1ldGhlcmV1bS1jb250cmFjdC1jb21wdXRlZFxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyYWN0QWRkcmVzcyh0cmFuc2FjdGlvbikge1xuICAgIGxldCBmcm9tID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgICBmcm9tID0gZ2V0QWRkcmVzcyh0cmFuc2FjdGlvbi5mcm9tKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJtaXNzaW5nIGZyb20gYWRkcmVzc1wiLCBcInRyYW5zYWN0aW9uXCIsIHRyYW5zYWN0aW9uKTtcbiAgICB9XG4gICAgY29uc3Qgbm9uY2UgPSBzdHJpcFplcm9zKGFycmF5aWZ5KEJpZ051bWJlci5mcm9tKHRyYW5zYWN0aW9uLm5vbmNlKS50b0hleFN0cmluZygpKSk7XG4gICAgcmV0dXJuIGdldEFkZHJlc3MoaGV4RGF0YVNsaWNlKGtlY2NhazI1NihlbmNvZGUoW2Zyb20sIG5vbmNlXSkpLCAxMikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldENyZWF0ZTJBZGRyZXNzKGZyb20sIHNhbHQsIGluaXRDb2RlSGFzaCkge1xuICAgIGlmIChoZXhEYXRhTGVuZ3RoKHNhbHQpICE9PSAzMikge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwic2FsdCBtdXN0IGJlIDMyIGJ5dGVzXCIsIFwic2FsdFwiLCBzYWx0KTtcbiAgICB9XG4gICAgaWYgKGhleERhdGFMZW5ndGgoaW5pdENvZGVIYXNoKSAhPT0gMzIpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImluaXRDb2RlSGFzaCBtdXN0IGJlIDMyIGJ5dGVzXCIsIFwiaW5pdENvZGVIYXNoXCIsIGluaXRDb2RlSGFzaCk7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZGRyZXNzKGhleERhdGFTbGljZShrZWNjYWsyNTYoY29uY2F0KFtcIjB4ZmZcIiwgZ2V0QWRkcmVzcyhmcm9tKSwgc2FsdCwgaW5pdENvZGVIYXNoXSkpLCAxMikpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBhcnJheWlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZSh0ZXh0RGF0YSkge1xuICAgIHRleHREYXRhID0gYXRvYih0ZXh0RGF0YSk7XG4gICAgY29uc3QgZGF0YSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dERhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZGF0YS5wdXNoKHRleHREYXRhLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlpZnkoZGF0YSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKGRhdGEpIHtcbiAgICBkYXRhID0gYXJyYXlpZnkoZGF0YSk7XG4gICAgbGV0IHRleHREYXRhID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGV4dERhdGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYXRhW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ0b2EodGV4dERhdGEpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZTY0LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0IHsgZGVjb2RlLCBlbmNvZGUgfSBmcm9tIFwiLi9iYXNlNjRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qKlxuICogdmFyIGJhc2V4ID0gcmVxdWlyZShcImJhc2UteFwiKTtcbiAqXG4gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGhlYXZpbHkgYmFzZWQgb24gYmFzZS14LiBUaGUgbWFpbiByZWFzb24gdG9cbiAqIGRldmlhdGUgd2FzIHRvIHByZXZlbnQgdGhlIGRlcGVuZGVuY3kgb2YgQnVmZmVyLlxuICpcbiAqIENvbnRyaWJ1dG9yczpcbiAqXG4gKiBiYXNlLXggZW5jb2RpbmdcbiAqIEZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9jcnlwdG9jb2luanMvYnM1OFxuICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2UgSGVhcm4gZm9yIEJpdGNvaW5KXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTEgR29vZ2xlIEluY1xuICogUG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgU3RlZmFuIFRob21hc1xuICogTWVyZ2VkIEJ1ZmZlciByZWZhY3RvcmluZ3MgZnJvbSBiYXNlNTgtbmF0aXZlIGJ5IFN0ZXBoZW4gUGFpclxuICogQ29weXJpZ2h0IChjKSAyMDEzIEJpdFBheSBJbmNcbiAqXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgYmFzZS14IGNvbnRyaWJ1dG9ycyAoYykgMjAxNlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksXG4gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uXG4gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSxcbiAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZVxuICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuICogSU4gVEhFIFNPRlRXQVJFLlxuICpcbiAqL1xuaW1wb3J0IHsgYXJyYXlpZnkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IGRlZmluZVJlYWRPbmx5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmV4cG9ydCBjbGFzcyBCYXNlWCB7XG4gICAgY29uc3RydWN0b3IoYWxwaGFiZXQpIHtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJhbHBoYWJldFwiLCBhbHBoYWJldCk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYmFzZVwiLCBhbHBoYWJldC5sZW5ndGgpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9hbHBoYWJldE1hcFwiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2xlYWRlclwiLCBhbHBoYWJldC5jaGFyQXQoMCkpO1xuICAgICAgICAvLyBwcmUtY29tcHV0ZSBsb29rdXAgdGFibGVcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbHBoYWJldC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fYWxwaGFiZXRNYXBbYWxwaGFiZXQuY2hhckF0KGkpXSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZW5jb2RlKHZhbHVlKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBhcnJheWlmeSh2YWx1ZSk7XG4gICAgICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZGlnaXRzID0gWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbGV0IGNhcnJ5ID0gc291cmNlW2ldO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBkaWdpdHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBjYXJyeSArPSBkaWdpdHNbal0gPDwgODtcbiAgICAgICAgICAgICAgICBkaWdpdHNbal0gPSBjYXJyeSAlIHRoaXMuYmFzZTtcbiAgICAgICAgICAgICAgICBjYXJyeSA9IChjYXJyeSAvIHRoaXMuYmFzZSkgfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKGNhcnJ5ID4gMCkge1xuICAgICAgICAgICAgICAgIGRpZ2l0cy5wdXNoKGNhcnJ5ICUgdGhpcy5iYXNlKTtcbiAgICAgICAgICAgICAgICBjYXJyeSA9IChjYXJyeSAvIHRoaXMuYmFzZSkgfCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBzdHJpbmcgPSBcIlwiO1xuICAgICAgICAvLyBkZWFsIHdpdGggbGVhZGluZyB6ZXJvc1xuICAgICAgICBmb3IgKGxldCBrID0gMDsgc291cmNlW2tdID09PSAwICYmIGsgPCBzb3VyY2UubGVuZ3RoIC0gMTsgKytrKSB7XG4gICAgICAgICAgICBzdHJpbmcgKz0gdGhpcy5fbGVhZGVyO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnZlcnQgZGlnaXRzIHRvIGEgc3RyaW5nXG4gICAgICAgIGZvciAobGV0IHEgPSBkaWdpdHMubGVuZ3RoIC0gMTsgcSA+PSAwOyAtLXEpIHtcbiAgICAgICAgICAgIHN0cmluZyArPSB0aGlzLmFscGhhYmV0W2RpZ2l0c1txXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG4gICAgZGVjb2RlKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIFN0cmluZ1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYnl0ZXMgPSBbXTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBieXRlcy5wdXNoKDApO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYnl0ZSA9IHRoaXMuX2FscGhhYmV0TWFwW3ZhbHVlW2ldXTtcbiAgICAgICAgICAgIGlmIChieXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb24tYmFzZVwiICsgdGhpcy5iYXNlICsgXCIgY2hhcmFjdGVyXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNhcnJ5ID0gYnl0ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICBjYXJyeSArPSBieXRlc1tqXSAqIHRoaXMuYmFzZTtcbiAgICAgICAgICAgICAgICBieXRlc1tqXSA9IGNhcnJ5ICYgMHhmZjtcbiAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChjYXJyeSA+IDApIHtcbiAgICAgICAgICAgICAgICBieXRlcy5wdXNoKGNhcnJ5ICYgMHhmZik7XG4gICAgICAgICAgICAgICAgY2FycnkgPj49IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGVhbCB3aXRoIGxlYWRpbmcgemVyb3NcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IHZhbHVlW2tdID09PSB0aGlzLl9sZWFkZXIgJiYgayA8IHZhbHVlLmxlbmd0aCAtIDE7ICsraykge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXlpZnkobmV3IFVpbnQ4QXJyYXkoYnl0ZXMucmV2ZXJzZSgpKSk7XG4gICAgfVxufVxuY29uc3QgQmFzZTMyID0gbmV3IEJhc2VYKFwiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoyMzQ1NjdcIik7XG5jb25zdCBCYXNlNTggPSBuZXcgQmFzZVgoXCIxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6XCIpO1xuZXhwb3J0IHsgQmFzZTMyLCBCYXNlNTggfTtcbi8vY29uc29sZS5sb2coQmFzZTU4LmRlY29kZShcIlFtZDJWNzc3bzVYdkpiWU1lTWI4azJuVTVmOGQzY2lVUTVZcFl1V2h6djhpRGpcIikpXG4vL2NvbnNvbGUubG9nKEJhc2U1OC5lbmNvZGUoQmFzZTU4LmRlY29kZShcIlFtZDJWNzc3bzVYdkpiWU1lTWI4azJuVTVmOGQzY2lVUTVZcFl1V2h6djhpRGpcIikpKVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcImJpZ251bWJlci81LjAuMTRcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLyoqXG4gKiAgQmlnTnVtYmVyXG4gKlxuICogIEEgd3JhcHBlciBhcm91bmQgdGhlIEJOLmpzIG9iamVjdC4gV2UgdXNlIHRoZSBCTi5qcyBsaWJyYXJ5XG4gKiAgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IGVsbGlwdGljLCBzbyBpdCBpcyByZXF1aXJlZCByZWdhcmRsZXNzLlxuICpcbiAqL1xuaW1wb3J0IF9CTiBmcm9tIFwiYm4uanNcIjtcbnZhciBCTiA9IF9CTi5CTjtcbmltcG9ydCB7IGhleGxpZnksIGlzQnl0ZXMsIGlzSGV4U3RyaW5nIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5jb25zdCBfY29uc3RydWN0b3JHdWFyZCA9IHt9O1xuY29uc3QgTUFYX1NBRkUgPSAweDFmZmZmZmZmZmZmZmZmO1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmlnTnVtYmVyaXNoKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSAmJiAoQmlnTnVtYmVyLmlzQmlnTnVtYmVyKHZhbHVlKSB8fFxuICAgICAgICAodHlwZW9mICh2YWx1ZSkgPT09IFwibnVtYmVyXCIgJiYgKHZhbHVlICUgMSkgPT09IDApIHx8XG4gICAgICAgICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIiAmJiAhIXZhbHVlLm1hdGNoKC9eLT9bMC05XSskLykpIHx8XG4gICAgICAgIGlzSGV4U3RyaW5nKHZhbHVlKSB8fFxuICAgICAgICAodHlwZW9mICh2YWx1ZSkgPT09IFwiYmlnaW50XCIpIHx8XG4gICAgICAgIGlzQnl0ZXModmFsdWUpKTtcbn1cbi8vIE9ubHkgd2FybiBhYm91dCBwYXNzaW5nIDEwIGludG8gcmFkaXggb25jZVxubGV0IF93YXJuZWRUb1N0cmluZ1JhZGl4ID0gZmFsc2U7XG5leHBvcnQgY2xhc3MgQmlnTnVtYmVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvckd1YXJkLCBoZXgpIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIEJpZ051bWJlcik7XG4gICAgICAgIGlmIChjb25zdHJ1Y3Rvckd1YXJkICE9PSBfY29uc3RydWN0b3JHdWFyZCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJjYW5ub3QgY2FsbCBjb25zdHJ1Y3RvciBkaXJlY3RseTsgdXNlIEJpZ051bWJlci5mcm9tXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcIm5ldyAoQmlnTnVtYmVyKVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZXggPSBoZXg7XG4gICAgICAgIHRoaXMuX2lzQmlnTnVtYmVyID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgZnJvbVR3b3ModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvQmlnTnVtYmVyKHRvQk4odGhpcykuZnJvbVR3b3ModmFsdWUpKTtcbiAgICB9XG4gICAgdG9Ud29zKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b0JpZ051bWJlcih0b0JOKHRoaXMpLnRvVHdvcyh2YWx1ZSkpO1xuICAgIH1cbiAgICBhYnMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9oZXhbMF0gPT09IFwiLVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLmZyb20odGhpcy5faGV4LnN1YnN0cmluZygxKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFkZChvdGhlcikge1xuICAgICAgICByZXR1cm4gdG9CaWdOdW1iZXIodG9CTih0aGlzKS5hZGQodG9CTihvdGhlcikpKTtcbiAgICB9XG4gICAgc3ViKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0b0JpZ051bWJlcih0b0JOKHRoaXMpLnN1Yih0b0JOKG90aGVyKSkpO1xuICAgIH1cbiAgICBkaXYob3RoZXIpIHtcbiAgICAgICAgY29uc3QgbyA9IEJpZ051bWJlci5mcm9tKG90aGVyKTtcbiAgICAgICAgaWYgKG8uaXNaZXJvKCkpIHtcbiAgICAgICAgICAgIHRocm93RmF1bHQoXCJkaXZpc2lvbiBieSB6ZXJvXCIsIFwiZGl2XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0JpZ051bWJlcih0b0JOKHRoaXMpLmRpdih0b0JOKG90aGVyKSkpO1xuICAgIH1cbiAgICBtdWwob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvQmlnTnVtYmVyKHRvQk4odGhpcykubXVsKHRvQk4ob3RoZXIpKSk7XG4gICAgfVxuICAgIG1vZChvdGhlcikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRvQk4ob3RoZXIpO1xuICAgICAgICBpZiAodmFsdWUuaXNOZWcoKSkge1xuICAgICAgICAgICAgdGhyb3dGYXVsdChcImNhbm5vdCBtb2R1bG8gbmVnYXRpdmUgdmFsdWVzXCIsIFwibW9kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0JpZ051bWJlcih0b0JOKHRoaXMpLnVtb2QodmFsdWUpKTtcbiAgICB9XG4gICAgcG93KG90aGVyKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdG9CTihvdGhlcik7XG4gICAgICAgIGlmICh2YWx1ZS5pc05lZygpKSB7XG4gICAgICAgICAgICB0aHJvd0ZhdWx0KFwiY2Fubm90IHJhaXNlIHRvIG5lZ2F0aXZlIHZhbHVlc1wiLCBcInBvd1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CaWdOdW1iZXIodG9CTih0aGlzKS5wb3codmFsdWUpKTtcbiAgICB9XG4gICAgYW5kKG90aGVyKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdG9CTihvdGhlcik7XG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSB8fCB2YWx1ZS5pc05lZygpKSB7XG4gICAgICAgICAgICB0aHJvd0ZhdWx0KFwiY2Fubm90ICdhbmQnIG5lZ2F0aXZlIHZhbHVlc1wiLCBcImFuZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CaWdOdW1iZXIodG9CTih0aGlzKS5hbmQodmFsdWUpKTtcbiAgICB9XG4gICAgb3Iob3RoZXIpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0b0JOKG90aGVyKTtcbiAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpIHx8IHZhbHVlLmlzTmVnKCkpIHtcbiAgICAgICAgICAgIHRocm93RmF1bHQoXCJjYW5ub3QgJ29yJyBuZWdhdGl2ZSB2YWx1ZXNcIiwgXCJvclwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CaWdOdW1iZXIodG9CTih0aGlzKS5vcih2YWx1ZSkpO1xuICAgIH1cbiAgICB4b3Iob3RoZXIpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0b0JOKG90aGVyKTtcbiAgICAgICAgaWYgKHRoaXMuaXNOZWdhdGl2ZSgpIHx8IHZhbHVlLmlzTmVnKCkpIHtcbiAgICAgICAgICAgIHRocm93RmF1bHQoXCJjYW5ub3QgJ3hvcicgbmVnYXRpdmUgdmFsdWVzXCIsIFwieG9yXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0JpZ051bWJlcih0b0JOKHRoaXMpLnhvcih2YWx1ZSkpO1xuICAgIH1cbiAgICBtYXNrKHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSB8fCB2YWx1ZSA8IDApIHtcbiAgICAgICAgICAgIHRocm93RmF1bHQoXCJjYW5ub3QgbWFzayBuZWdhdGl2ZSB2YWx1ZXNcIiwgXCJtYXNrXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0JpZ051bWJlcih0b0JOKHRoaXMpLm1hc2tuKHZhbHVlKSk7XG4gICAgfVxuICAgIHNobCh2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkgfHwgdmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvd0ZhdWx0KFwiY2Fubm90IHNoaWZ0IG5lZ2F0aXZlIHZhbHVlc1wiLCBcInNobFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CaWdOdW1iZXIodG9CTih0aGlzKS5zaGxuKHZhbHVlKSk7XG4gICAgfVxuICAgIHNocih2YWx1ZSkge1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkgfHwgdmFsdWUgPCAwKSB7XG4gICAgICAgICAgICB0aHJvd0ZhdWx0KFwiY2Fubm90IHNoaWZ0IG5lZ2F0aXZlIHZhbHVlc1wiLCBcInNoclwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CaWdOdW1iZXIodG9CTih0aGlzKS5zaHJuKHZhbHVlKSk7XG4gICAgfVxuICAgIGVxKG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0b0JOKHRoaXMpLmVxKHRvQk4ob3RoZXIpKTtcbiAgICB9XG4gICAgbHQob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvQk4odGhpcykubHQodG9CTihvdGhlcikpO1xuICAgIH1cbiAgICBsdGUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvQk4odGhpcykubHRlKHRvQk4ob3RoZXIpKTtcbiAgICB9XG4gICAgZ3Qob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvQk4odGhpcykuZ3QodG9CTihvdGhlcikpO1xuICAgIH1cbiAgICBndGUob3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRvQk4odGhpcykuZ3RlKHRvQk4ob3RoZXIpKTtcbiAgICB9XG4gICAgaXNOZWdhdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9oZXhbMF0gPT09IFwiLVwiKTtcbiAgICB9XG4gICAgaXNaZXJvKCkge1xuICAgICAgICByZXR1cm4gdG9CTih0aGlzKS5pc1plcm8oKTtcbiAgICB9XG4gICAgdG9OdW1iZXIoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdG9CTih0aGlzKS50b051bWJlcigpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3dGYXVsdChcIm92ZXJmbG93XCIsIFwidG9OdW1iZXJcIiwgdGhpcy50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIC8vIExvdHMgb2YgcGVvcGxlIGV4cGVjdCB0aGlzLCB3aGljaCB3ZSBkbyBub3Qgc3VwcG9ydCwgc28gY2hlY2sgKFNlZTogIzg4OSlcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzWzBdID09PSAxMCkge1xuICAgICAgICAgICAgICAgIGlmICghX3dhcm5lZFRvU3RyaW5nUmFkaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgX3dhcm5lZFRvU3RyaW5nUmFkaXggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIkJpZ051bWJlci50b1N0cmluZyBkb2VzIG5vdCBhY2NlcHQgYW55IHBhcmFtZXRlcnM7IGJhc2UtMTAgaXMgYXNzdW1lZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhcmd1bWVudHNbMF0gPT09IDE2KSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJCaWdOdW1iZXIudG9TdHJpbmcgZG9lcyBub3QgYWNjZXB0IGFueSBwYXJhbWV0ZXJzOyB1c2UgYmlnTnVtYmVyLnRvSGV4U3RyaW5nKClcIiwgTG9nZ2VyLmVycm9ycy5VTkVYUEVDVEVEX0FSR1VNRU5ULCB7fSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcIkJpZ051bWJlci50b1N0cmluZyBkb2VzIG5vdCBhY2NlcHQgcGFyYW1ldGVyc1wiLCBMb2dnZXIuZXJyb3JzLlVORVhQRUNURURfQVJHVU1FTlQsIHt9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9CTih0aGlzKS50b1N0cmluZygxMCk7XG4gICAgfVxuICAgIHRvSGV4U3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGV4O1xuICAgIH1cbiAgICB0b0pTT04oa2V5KSB7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiQmlnTnVtYmVyXCIsIGhleDogdGhpcy50b0hleFN0cmluZygpIH07XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpZ051bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHZhbHVlLm1hdGNoKC9eLT8weFswLTlhLWZdKyQvaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ051bWJlcihfY29uc3RydWN0b3JHdWFyZCwgdG9IZXgodmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZS5tYXRjaCgvXi0/WzAtOV0rJC8pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoX2NvbnN0cnVjdG9yR3VhcmQsIHRvSGV4KG5ldyBCTih2YWx1ZSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBCaWdOdW1iZXIgc3RyaW5nXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgaWYgKHZhbHVlICUgMSkge1xuICAgICAgICAgICAgICAgIHRocm93RmF1bHQoXCJ1bmRlcmZsb3dcIiwgXCJCaWdOdW1iZXIuZnJvbVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmFsdWUgPj0gTUFYX1NBRkUgfHwgdmFsdWUgPD0gLU1BWF9TQUZFKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dGYXVsdChcIm92ZXJmbG93XCIsIFwiQmlnTnVtYmVyLmZyb21cIiwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgKGFueVZhbHVlKSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKGFueVZhbHVlLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0J5dGVzKGFueVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKGhleGxpZnkoYW55VmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW55VmFsdWUpIHtcbiAgICAgICAgICAgIC8vIEhleGFibGUgaW50ZXJmYWNlICh0YWtlcyBwaW9yaXR5KVxuICAgICAgICAgICAgaWYgKGFueVZhbHVlLnRvSGV4U3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGV4ID0gYW55VmFsdWUudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChoZXgpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCaWdOdW1iZXIuZnJvbShoZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEZvciBub3csIGhhbmRsZSBsZWdhY3kgSlNPTi1pZmllZCB2YWx1ZXMgKGdvZXMgYXdheSBpbiB2NilcbiAgICAgICAgICAgICAgICBsZXQgaGV4ID0gYW55VmFsdWUuX2hleDtcbiAgICAgICAgICAgICAgICAvLyBOZXctZm9ybSBKU09OXG4gICAgICAgICAgICAgICAgaWYgKGhleCA9PSBudWxsICYmIGFueVZhbHVlLnR5cGUgPT09IFwiQmlnTnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGV4ID0gYW55VmFsdWUuaGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChoZXgpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyhoZXgpIHx8IChoZXhbMF0gPT09IFwiLVwiICYmIGlzSGV4U3RyaW5nKGhleC5zdWJzdHJpbmcoMSkpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKGhleCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIEJpZ051bWJlciB2YWx1ZVwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGlzQmlnTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5faXNCaWdOdW1iZXIpO1xuICAgIH1cbn1cbi8vIE5vcm1hbGl6ZSB0aGUgaGV4IHN0cmluZ1xuZnVuY3Rpb24gdG9IZXgodmFsdWUpIHtcbiAgICAvLyBGb3IgQk4sIGNhbGwgb24gdGhlIGhleCBzdHJpbmdcbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHRvSGV4KHZhbHVlLnRvU3RyaW5nKDE2KSk7XG4gICAgfVxuICAgIC8vIElmIG5lZ2F0aXZlLCBwcmVwZW5kIHRoZSBuZWdhdGl2ZSBzaWduIHRvIHRoZSBub3JtYWxpemVkIHBvc2l0aXZlIHZhbHVlXG4gICAgaWYgKHZhbHVlWzBdID09PSBcIi1cIikge1xuICAgICAgICAvLyBTdHJpcCBvZmYgdGhlIG5lZ2F0aXZlIHNpZ25cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIC8vIENhbm5vdCBoYXZlIG11bGl0cGxlIG5lZ2F0aXZlIHNpZ25zIChlLmcuIFwiLS0weDA0XCIpXG4gICAgICAgIGlmICh2YWx1ZVswXSA9PT0gXCItXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGhleFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxsIHRvSGV4IG9uIHRoZSBwb3NpdGl2ZSBjb21wb25lbnRcbiAgICAgICAgdmFsdWUgPSB0b0hleCh2YWx1ZSk7XG4gICAgICAgIC8vIERvIG5vdCBhbGxvdyBcIi0weDAwXCJcbiAgICAgICAgaWYgKHZhbHVlID09PSBcIjB4MDBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5lZ2F0ZSB0aGUgdmFsdWVcbiAgICAgICAgcmV0dXJuIFwiLVwiICsgdmFsdWU7XG4gICAgfVxuICAgIC8vIEFkZCBhIFwiMHhcIiBwcmVmaXggaWYgbWlzc2luZ1xuICAgIGlmICh2YWx1ZS5zdWJzdHJpbmcoMCwgMikgIT09IFwiMHhcIikge1xuICAgICAgICB2YWx1ZSA9IFwiMHhcIiArIHZhbHVlO1xuICAgIH1cbiAgICAvLyBOb3JtYWxpemUgemVyb1xuICAgIGlmICh2YWx1ZSA9PT0gXCIweFwiKSB7XG4gICAgICAgIHJldHVybiBcIjB4MDBcIjtcbiAgICB9XG4gICAgLy8gTWFrZSB0aGUgc3RyaW5nIGV2ZW4gbGVuZ3RoXG4gICAgaWYgKHZhbHVlLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgdmFsdWUgPSBcIjB4MFwiICsgdmFsdWUuc3Vic3RyaW5nKDIpO1xuICAgIH1cbiAgICAvLyBUcmltIHRvIHNtYWxsZXN0IGV2ZW4tbGVuZ3RoIHN0cmluZ1xuICAgIHdoaWxlICh2YWx1ZS5sZW5ndGggPiA0ICYmIHZhbHVlLnN1YnN0cmluZygwLCA0KSA9PT0gXCIweDAwXCIpIHtcbiAgICAgICAgdmFsdWUgPSBcIjB4XCIgKyB2YWx1ZS5zdWJzdHJpbmcoNCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHRvQmlnTnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKHRvSGV4KHZhbHVlKSk7XG59XG5mdW5jdGlvbiB0b0JOKHZhbHVlKSB7XG4gICAgY29uc3QgaGV4ID0gQmlnTnVtYmVyLmZyb20odmFsdWUpLnRvSGV4U3RyaW5nKCk7XG4gICAgaWYgKGhleFswXSA9PT0gXCItXCIpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgQk4oXCItXCIgKyBoZXguc3Vic3RyaW5nKDMpLCAxNikpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJOKGhleC5zdWJzdHJpbmcoMiksIDE2KTtcbn1cbmZ1bmN0aW9uIHRocm93RmF1bHQoZmF1bHQsIG9wZXJhdGlvbiwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7IGZhdWx0OiBmYXVsdCwgb3BlcmF0aW9uOiBvcGVyYXRpb24gfTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBwYXJhbXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKGZhdWx0LCBMb2dnZXIuZXJyb3JzLk5VTUVSSUNfRkFVTFQsIHBhcmFtcyk7XG59XG4vLyB2YWx1ZSBzaG91bGQgaGF2ZSBubyBwcmVmaXhcbmV4cG9ydCBmdW5jdGlvbiBfYmFzZTM2VG8xNih2YWx1ZSkge1xuICAgIHJldHVybiAobmV3IEJOKHZhbHVlLCAzNikpLnRvU3RyaW5nKDE2KTtcbn1cbi8vIHZhbHVlIHNob3VsZCBoYXZlIG5vIHByZWZpeFxuZXhwb3J0IGZ1bmN0aW9uIF9iYXNlMTZUbzM2KHZhbHVlKSB7XG4gICAgcmV0dXJuIChuZXcgQk4odmFsdWUsIDE2KSkudG9TdHJpbmcoMzYpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmlnbnVtYmVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgYXJyYXlpZnksIGhleFplcm9QYWQsIGlzQnl0ZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmltcG9ydCB7IEJpZ051bWJlciwgaXNCaWdOdW1iZXJpc2ggfSBmcm9tIFwiLi9iaWdudW1iZXJcIjtcbmNvbnN0IF9jb25zdHJ1Y3Rvckd1YXJkID0ge307XG5jb25zdCBaZXJvID0gQmlnTnVtYmVyLmZyb20oMCk7XG5jb25zdCBOZWdhdGl2ZU9uZSA9IEJpZ051bWJlci5mcm9tKC0xKTtcbmZ1bmN0aW9uIHRocm93RmF1bHQobWVzc2FnZSwgZmF1bHQsIG9wZXJhdGlvbiwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7IGZhdWx0OiBmYXVsdCwgb3BlcmF0aW9uOiBvcGVyYXRpb24gfTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKG1lc3NhZ2UsIExvZ2dlci5lcnJvcnMuTlVNRVJJQ19GQVVMVCwgcGFyYW1zKTtcbn1cbi8vIENvbnN0YW50IHRvIHB1bGwgemVyb3MgZnJvbSBmb3IgbXVsdGlwbGllcnNcbmxldCB6ZXJvcyA9IFwiMFwiO1xud2hpbGUgKHplcm9zLmxlbmd0aCA8IDI1Nikge1xuICAgIHplcm9zICs9IHplcm9zO1xufVxuLy8gUmV0dXJucyBhIHN0cmluZyBcIjFcIiBmb2xsb3dlZCBieSBkZWNpbWFsIFwiMFwic1xuZnVuY3Rpb24gZ2V0TXVsdGlwbGllcihkZWNpbWFscykge1xuICAgIGlmICh0eXBlb2YgKGRlY2ltYWxzKSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBCaWdOdW1iZXIuZnJvbShkZWNpbWFscykudG9OdW1iZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkgeyB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKGRlY2ltYWxzKSA9PT0gXCJudW1iZXJcIiAmJiBkZWNpbWFscyA+PSAwICYmIGRlY2ltYWxzIDw9IDI1NiAmJiAhKGRlY2ltYWxzICUgMSkpIHtcbiAgICAgICAgcmV0dXJuIChcIjFcIiArIHplcm9zLnN1YnN0cmluZygwLCBkZWNpbWFscykpO1xuICAgIH1cbiAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgZGVjaW1hbCBzaXplXCIsIFwiZGVjaW1hbHNcIiwgZGVjaW1hbHMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpeGVkKHZhbHVlLCBkZWNpbWFscykge1xuICAgIGlmIChkZWNpbWFscyA9PSBudWxsKSB7XG4gICAgICAgIGRlY2ltYWxzID0gMDtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGdldE11bHRpcGxpZXIoZGVjaW1hbHMpO1xuICAgIC8vIE1ha2Ugc3VyZSB3ZWkgaXMgYSBiaWcgbnVtYmVyIChjb252ZXJ0IGFzIG5lY2Vzc2FyeSlcbiAgICB2YWx1ZSA9IEJpZ051bWJlci5mcm9tKHZhbHVlKTtcbiAgICBjb25zdCBuZWdhdGl2ZSA9IHZhbHVlLmx0KFplcm8pO1xuICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLm11bChOZWdhdGl2ZU9uZSk7XG4gICAgfVxuICAgIGxldCBmcmFjdGlvbiA9IHZhbHVlLm1vZChtdWx0aXBsaWVyKS50b1N0cmluZygpO1xuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCBtdWx0aXBsaWVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgZnJhY3Rpb24gPSBcIjBcIiArIGZyYWN0aW9uO1xuICAgIH1cbiAgICAvLyBTdHJpcCB0cmFpbmluZyAwXG4gICAgZnJhY3Rpb24gPSBmcmFjdGlvbi5tYXRjaCgvXihbMC05XSpbMS05XXwwKSgwKikvKVsxXTtcbiAgICBjb25zdCB3aG9sZSA9IHZhbHVlLmRpdihtdWx0aXBsaWVyKS50b1N0cmluZygpO1xuICAgIHZhbHVlID0gd2hvbGUgKyBcIi5cIiArIGZyYWN0aW9uO1xuICAgIGlmIChuZWdhdGl2ZSkge1xuICAgICAgICB2YWx1ZSA9IFwiLVwiICsgdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUZpeGVkKHZhbHVlLCBkZWNpbWFscykge1xuICAgIGlmIChkZWNpbWFscyA9PSBudWxsKSB7XG4gICAgICAgIGRlY2ltYWxzID0gMDtcbiAgICB9XG4gICAgY29uc3QgbXVsdGlwbGllciA9IGdldE11bHRpcGxpZXIoZGVjaW1hbHMpO1xuICAgIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gXCJzdHJpbmdcIiB8fCAhdmFsdWUubWF0Y2goL14tP1swLTkuLF0rJC8pKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGRlY2ltYWwgdmFsdWVcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChtdWx0aXBsaWVyLmxlbmd0aCAtIDEgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gSXMgaXQgbmVnYXRpdmU/XG4gICAgY29uc3QgbmVnYXRpdmUgPSAodmFsdWUuc3Vic3RyaW5nKDAsIDEpID09PSBcIi1cIik7XG4gICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IFwiLlwiKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJtaXNzaW5nIHZhbHVlXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgIH1cbiAgICAvLyBTcGxpdCBpdCBpbnRvIGEgd2hvbGUgYW5kIGZyYWN0aW9uYWwgcGFydFxuICAgIGNvbnN0IGNvbXBzID0gdmFsdWUuc3BsaXQoXCIuXCIpO1xuICAgIGlmIChjb21wcy5sZW5ndGggPiAyKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ0b28gbWFueSBkZWNpbWFsIHBvaW50c1wiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgbGV0IHdob2xlID0gY29tcHNbMF0sIGZyYWN0aW9uID0gY29tcHNbMV07XG4gICAgaWYgKCF3aG9sZSkge1xuICAgICAgICB3aG9sZSA9IFwiMFwiO1xuICAgIH1cbiAgICBpZiAoIWZyYWN0aW9uKSB7XG4gICAgICAgIGZyYWN0aW9uID0gXCIwXCI7XG4gICAgfVxuICAgIC8vIFByZXZlbnQgdW5kZXJmbG93XG4gICAgaWYgKGZyYWN0aW9uLmxlbmd0aCA+IG11bHRpcGxpZXIubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aHJvd0ZhdWx0KFwiZnJhY3Rpb25hbCBjb21wb25lbnQgZXhjZWVkcyBkZWNpbWFsc1wiLCBcInVuZGVyZmxvd1wiLCBcInBhcnNlRml4ZWRcIik7XG4gICAgfVxuICAgIC8vIEZ1bGx5IHBhZCB0aGUgc3RyaW5nIHdpdGggemVyb3MgdG8gZ2V0IHRvIHdlaVxuICAgIHdoaWxlIChmcmFjdGlvbi5sZW5ndGggPCBtdWx0aXBsaWVyLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgZnJhY3Rpb24gKz0gXCIwXCI7XG4gICAgfVxuICAgIGNvbnN0IHdob2xlVmFsdWUgPSBCaWdOdW1iZXIuZnJvbSh3aG9sZSk7XG4gICAgY29uc3QgZnJhY3Rpb25WYWx1ZSA9IEJpZ051bWJlci5mcm9tKGZyYWN0aW9uKTtcbiAgICBsZXQgd2VpID0gKHdob2xlVmFsdWUubXVsKG11bHRpcGxpZXIpKS5hZGQoZnJhY3Rpb25WYWx1ZSk7XG4gICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIHdlaSA9IHdlaS5tdWwoTmVnYXRpdmVPbmUpO1xuICAgIH1cbiAgICByZXR1cm4gd2VpO1xufVxuZXhwb3J0IGNsYXNzIEZpeGVkRm9ybWF0IHtcbiAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvckd1YXJkLCBzaWduZWQsIHdpZHRoLCBkZWNpbWFscykge1xuICAgICAgICBpZiAoY29uc3RydWN0b3JHdWFyZCAhPT0gX2NvbnN0cnVjdG9yR3VhcmQpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiY2Fubm90IHVzZSBGaXhlZEZvcm1hdCBjb25zdHJ1Y3RvcjsgdXNlIEZpeGVkRm9ybWF0LmZyb21cIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwibmV3IEZpeGVkRm9ybWF0XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2lnbmVkID0gc2lnbmVkO1xuICAgICAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHRoaXMuZGVjaW1hbHMgPSBkZWNpbWFscztcbiAgICAgICAgdGhpcy5uYW1lID0gKHNpZ25lZCA/IFwiXCIgOiBcInVcIikgKyBcImZpeGVkXCIgKyBTdHJpbmcod2lkdGgpICsgXCJ4XCIgKyBTdHJpbmcoZGVjaW1hbHMpO1xuICAgICAgICB0aGlzLl9tdWx0aXBsaWVyID0gZ2V0TXVsdGlwbGllcihkZWNpbWFscyk7XG4gICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpeGVkRm9ybWF0KSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNpZ25lZCA9IHRydWU7XG4gICAgICAgIGxldCB3aWR0aCA9IDEyODtcbiAgICAgICAgbGV0IGRlY2ltYWxzID0gMTg7XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBcImZpeGVkXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0cy4uLlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09IFwidWZpeGVkXCIpIHtcbiAgICAgICAgICAgICAgICBzaWduZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHZhbHVlLm1hdGNoKC9eKHU/KWZpeGVkKFswLTldKyl4KFswLTldKykkLyk7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBmaXhlZCBmb3JtYXRcIiwgXCJmb3JtYXRcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzaWduZWQgPSAobWF0Y2hbMV0gIT09IFwidVwiKTtcbiAgICAgICAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBkZWNpbWFscyA9IHBhcnNlSW50KG1hdGNoWzNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2sgPSAoa2V5LCB0eXBlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlW2tleV0pICE9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGZpeGVkIGZvcm1hdCAoXCIgKyBrZXkgKyBcIiBub3QgXCIgKyB0eXBlICsgXCIpXCIsIFwiZm9ybWF0LlwiICsga2V5LCB2YWx1ZVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW2tleV07XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgc2lnbmVkID0gY2hlY2soXCJzaWduZWRcIiwgXCJib29sZWFuXCIsIHNpZ25lZCk7XG4gICAgICAgICAgICB3aWR0aCA9IGNoZWNrKFwid2lkdGhcIiwgXCJudW1iZXJcIiwgd2lkdGgpO1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBjaGVjayhcImRlY2ltYWxzXCIsIFwibnVtYmVyXCIsIGRlY2ltYWxzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAod2lkdGggJSA4KSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBmaXhlZCBmb3JtYXQgd2lkdGggKG5vdCBieXRlIGFsaWduZWQpXCIsIFwiZm9ybWF0LndpZHRoXCIsIHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjaW1hbHMgPiA4MCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgZml4ZWQgZm9ybWF0IChkZWNpbWFscyB0b28gbGFyZ2UpXCIsIFwiZm9ybWF0LmRlY2ltYWxzXCIsIGRlY2ltYWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEZpeGVkRm9ybWF0KF9jb25zdHJ1Y3Rvckd1YXJkLCBzaWduZWQsIHdpZHRoLCBkZWNpbWFscyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZpeGVkTnVtYmVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvckd1YXJkLCBoZXgsIHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIEZpeGVkTnVtYmVyKTtcbiAgICAgICAgaWYgKGNvbnN0cnVjdG9yR3VhcmQgIT09IF9jb25zdHJ1Y3Rvckd1YXJkKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCB1c2UgRml4ZWROdW1iZXIgY29uc3RydWN0b3I7IHVzZSBGaXhlZE51bWJlci5mcm9tXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcIm5ldyBGaXhlZEZvcm1hdFwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDtcbiAgICAgICAgdGhpcy5faGV4ID0gaGV4O1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9pc0ZpeGVkTnVtYmVyID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgX2NoZWNrRm9ybWF0KG90aGVyKSB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1hdC5uYW1lICE9PSBvdGhlci5mb3JtYXQubmFtZSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImluY29tcGF0aWJsZSBmb3JtYXQ7IHVzZSBmaXhlZE51bWJlci50b0Zvcm1hdFwiLCBcIm90aGVyXCIsIG90aGVyKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGRVbnNhZmUob3RoZXIpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tGb3JtYXQob3RoZXIpO1xuICAgICAgICBjb25zdCBhID0gcGFyc2VGaXhlZCh0aGlzLl92YWx1ZSwgdGhpcy5mb3JtYXQuZGVjaW1hbHMpO1xuICAgICAgICBjb25zdCBiID0gcGFyc2VGaXhlZChvdGhlci5fdmFsdWUsIG90aGVyLmZvcm1hdC5kZWNpbWFscyk7XG4gICAgICAgIHJldHVybiBGaXhlZE51bWJlci5mcm9tVmFsdWUoYS5hZGQoYiksIHRoaXMuZm9ybWF0LmRlY2ltYWxzLCB0aGlzLmZvcm1hdCk7XG4gICAgfVxuICAgIHN1YlVuc2FmZShvdGhlcikge1xuICAgICAgICB0aGlzLl9jaGVja0Zvcm1hdChvdGhlcik7XG4gICAgICAgIGNvbnN0IGEgPSBwYXJzZUZpeGVkKHRoaXMuX3ZhbHVlLCB0aGlzLmZvcm1hdC5kZWNpbWFscyk7XG4gICAgICAgIGNvbnN0IGIgPSBwYXJzZUZpeGVkKG90aGVyLl92YWx1ZSwgb3RoZXIuZm9ybWF0LmRlY2ltYWxzKTtcbiAgICAgICAgcmV0dXJuIEZpeGVkTnVtYmVyLmZyb21WYWx1ZShhLnN1YihiKSwgdGhpcy5mb3JtYXQuZGVjaW1hbHMsIHRoaXMuZm9ybWF0KTtcbiAgICB9XG4gICAgbXVsVW5zYWZlKG90aGVyKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrRm9ybWF0KG90aGVyKTtcbiAgICAgICAgY29uc3QgYSA9IHBhcnNlRml4ZWQodGhpcy5fdmFsdWUsIHRoaXMuZm9ybWF0LmRlY2ltYWxzKTtcbiAgICAgICAgY29uc3QgYiA9IHBhcnNlRml4ZWQob3RoZXIuX3ZhbHVlLCBvdGhlci5mb3JtYXQuZGVjaW1hbHMpO1xuICAgICAgICByZXR1cm4gRml4ZWROdW1iZXIuZnJvbVZhbHVlKGEubXVsKGIpLmRpdih0aGlzLmZvcm1hdC5fbXVsdGlwbGllciksIHRoaXMuZm9ybWF0LmRlY2ltYWxzLCB0aGlzLmZvcm1hdCk7XG4gICAgfVxuICAgIGRpdlVuc2FmZShvdGhlcikge1xuICAgICAgICB0aGlzLl9jaGVja0Zvcm1hdChvdGhlcik7XG4gICAgICAgIGNvbnN0IGEgPSBwYXJzZUZpeGVkKHRoaXMuX3ZhbHVlLCB0aGlzLmZvcm1hdC5kZWNpbWFscyk7XG4gICAgICAgIGNvbnN0IGIgPSBwYXJzZUZpeGVkKG90aGVyLl92YWx1ZSwgb3RoZXIuZm9ybWF0LmRlY2ltYWxzKTtcbiAgICAgICAgcmV0dXJuIEZpeGVkTnVtYmVyLmZyb21WYWx1ZShhLm11bCh0aGlzLmZvcm1hdC5fbXVsdGlwbGllcikuZGl2KGIpLCB0aGlzLmZvcm1hdC5kZWNpbWFscywgdGhpcy5mb3JtYXQpO1xuICAgIH1cbiAgICBmbG9vcigpIHtcbiAgICAgICAgbGV0IGNvbXBzID0gdGhpcy50b1N0cmluZygpLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IEZpeGVkTnVtYmVyLmZyb20oY29tcHNbMF0sIHRoaXMuZm9ybWF0KTtcbiAgICAgICAgY29uc3QgaGFzRnJhY3Rpb24gPSAhY29tcHNbMV0ubWF0Y2goL14oMCopJC8pO1xuICAgICAgICBpZiAodGhpcy5pc05lZ2F0aXZlKCkgJiYgaGFzRnJhY3Rpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJVbnNhZmUoT05FKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjZWlsaW5nKCkge1xuICAgICAgICBsZXQgY29tcHMgPSB0aGlzLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gRml4ZWROdW1iZXIuZnJvbShjb21wc1swXSwgdGhpcy5mb3JtYXQpO1xuICAgICAgICBjb25zdCBoYXNGcmFjdGlvbiA9ICFjb21wc1sxXS5tYXRjaCgvXigwKikkLyk7XG4gICAgICAgIGlmICghdGhpcy5pc05lZ2F0aXZlKCkgJiYgaGFzRnJhY3Rpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5hZGRVbnNhZmUoT05FKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBAVE9ETzogU3VwcG9ydCBvdGhlciByb3VuZGluZyBhbGdvcml0aG1zXG4gICAgcm91bmQoZGVjaW1hbHMpIHtcbiAgICAgICAgaWYgKGRlY2ltYWxzID09IG51bGwpIHtcbiAgICAgICAgICAgIGRlY2ltYWxzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBhcmUgYWxyZWFkeSBpbiByYW5nZSwgd2UncmUgZG9uZVxuICAgICAgICBsZXQgY29tcHMgPSB0aGlzLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAoZGVjaW1hbHMgPCAwIHx8IGRlY2ltYWxzID4gODAgfHwgKGRlY2ltYWxzICUgMSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGRlY2ltYWwgY291bnRcIiwgXCJkZWNpbWFsc1wiLCBkZWNpbWFscyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBzWzFdLmxlbmd0aCA8PSBkZWNpbWFscykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFjdG9yID0gRml4ZWROdW1iZXIuZnJvbShcIjFcIiArIHplcm9zLnN1YnN0cmluZygwLCBkZWNpbWFscykpO1xuICAgICAgICByZXR1cm4gdGhpcy5tdWxVbnNhZmUoZmFjdG9yKS5hZGRVbnNhZmUoQlVNUCkuZmxvb3IoKS5kaXZVbnNhZmUoZmFjdG9yKTtcbiAgICB9XG4gICAgaXNaZXJvKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3ZhbHVlID09PSBcIjAuMFwiKTtcbiAgICB9XG4gICAgaXNOZWdhdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl92YWx1ZVswXSA9PT0gXCItXCIpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG4gICAgdG9IZXhTdHJpbmcod2lkdGgpIHtcbiAgICAgICAgaWYgKHdpZHRoID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpZHRoICUgOCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYnl0ZSB3aWR0aFwiLCBcIndpZHRoXCIsIHdpZHRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBoZXggPSBCaWdOdW1iZXIuZnJvbSh0aGlzLl9oZXgpLmZyb21Ud29zKHRoaXMuZm9ybWF0LndpZHRoKS50b1R3b3Mod2lkdGgpLnRvSGV4U3RyaW5nKCk7XG4gICAgICAgIHJldHVybiBoZXhaZXJvUGFkKGhleCwgd2lkdGggLyA4KTtcbiAgICB9XG4gICAgdG9VbnNhZmVGbG9hdCgpIHsgcmV0dXJuIHBhcnNlRmxvYXQodGhpcy50b1N0cmluZygpKTsgfVxuICAgIHRvRm9ybWF0KGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gRml4ZWROdW1iZXIuZnJvbVN0cmluZyh0aGlzLl92YWx1ZSwgZm9ybWF0KTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21WYWx1ZSh2YWx1ZSwgZGVjaW1hbHMsIGZvcm1hdCkge1xuICAgICAgICAvLyBJZiBkZWNpbWFscyBsb29rcyBtb3JlIGxpa2UgYSBmb3JtYXQsIGFuZCB0aGVyZSBpcyBubyBmb3JtYXQsIHNoaWZ0IHRoZSBwYXJhbWV0ZXJzXG4gICAgICAgIGlmIChmb3JtYXQgPT0gbnVsbCAmJiBkZWNpbWFscyAhPSBudWxsICYmICFpc0JpZ051bWJlcmlzaChkZWNpbWFscykpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGRlY2ltYWxzO1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWNpbWFscyA9PSBudWxsKSB7XG4gICAgICAgICAgICBkZWNpbWFscyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBcImZpeGVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEZpeGVkTnVtYmVyLmZyb21TdHJpbmcoZm9ybWF0Rml4ZWQodmFsdWUsIGRlY2ltYWxzKSwgRml4ZWRGb3JtYXQuZnJvbShmb3JtYXQpKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21TdHJpbmcodmFsdWUsIGZvcm1hdCkge1xuICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IFwiZml4ZWRcIjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXhlZEZvcm1hdCA9IEZpeGVkRm9ybWF0LmZyb20oZm9ybWF0KTtcbiAgICAgICAgY29uc3QgbnVtZXJpYyA9IHBhcnNlRml4ZWQodmFsdWUsIGZpeGVkRm9ybWF0LmRlY2ltYWxzKTtcbiAgICAgICAgaWYgKCFmaXhlZEZvcm1hdC5zaWduZWQgJiYgbnVtZXJpYy5sdChaZXJvKSkge1xuICAgICAgICAgICAgdGhyb3dGYXVsdChcInVuc2lnbmVkIHZhbHVlIGNhbm5vdCBiZSBuZWdhdGl2ZVwiLCBcIm92ZXJmbG93XCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBoZXggPSBudWxsO1xuICAgICAgICBpZiAoZml4ZWRGb3JtYXQuc2lnbmVkKSB7XG4gICAgICAgICAgICBoZXggPSBudW1lcmljLnRvVHdvcyhmaXhlZEZvcm1hdC53aWR0aCkudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhleCA9IG51bWVyaWMudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgICAgIGhleCA9IGhleFplcm9QYWQoaGV4LCBmaXhlZEZvcm1hdC53aWR0aCAvIDgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlY2ltYWwgPSBmb3JtYXRGaXhlZChudW1lcmljLCBmaXhlZEZvcm1hdC5kZWNpbWFscyk7XG4gICAgICAgIHJldHVybiBuZXcgRml4ZWROdW1iZXIoX2NvbnN0cnVjdG9yR3VhcmQsIGhleCwgZGVjaW1hbCwgZml4ZWRGb3JtYXQpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUJ5dGVzKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBcImZpeGVkXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZml4ZWRGb3JtYXQgPSBGaXhlZEZvcm1hdC5mcm9tKGZvcm1hdCk7XG4gICAgICAgIGlmIChhcnJheWlmeSh2YWx1ZSkubGVuZ3RoID4gZml4ZWRGb3JtYXQud2lkdGggLyA4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvdmVyZmxvd1wiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbnVtZXJpYyA9IEJpZ051bWJlci5mcm9tKHZhbHVlKTtcbiAgICAgICAgaWYgKGZpeGVkRm9ybWF0LnNpZ25lZCkge1xuICAgICAgICAgICAgbnVtZXJpYyA9IG51bWVyaWMuZnJvbVR3b3MoZml4ZWRGb3JtYXQud2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhleCA9IG51bWVyaWMudG9Ud29zKChmaXhlZEZvcm1hdC5zaWduZWQgPyAwIDogMSkgKyBmaXhlZEZvcm1hdC53aWR0aCkudG9IZXhTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGVjaW1hbCA9IGZvcm1hdEZpeGVkKG51bWVyaWMsIGZpeGVkRm9ybWF0LmRlY2ltYWxzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBGaXhlZE51bWJlcihfY29uc3RydWN0b3JHdWFyZCwgaGV4LCBkZWNpbWFsLCBmaXhlZEZvcm1hdCk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHZhbHVlLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gRml4ZWROdW1iZXIuZnJvbVN0cmluZyh2YWx1ZSwgZm9ybWF0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCeXRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBGaXhlZE51bWJlci5mcm9tQnl0ZXModmFsdWUsIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBGaXhlZE51bWJlci5mcm9tVmFsdWUodmFsdWUsIDAsIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBBbGxvdyBOVU1FUklDX0ZBVUxUIHRvIGJ1YmJsZSB1cFxuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09IExvZ2dlci5lcnJvcnMuSU5WQUxJRF9BUkdVTUVOVCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBGaXhlZE51bWJlciB2YWx1ZVwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGlzRml4ZWROdW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9pc0ZpeGVkTnVtYmVyKTtcbiAgICB9XG59XG5jb25zdCBPTkUgPSBGaXhlZE51bWJlci5mcm9tKDEpO1xuY29uc3QgQlVNUCA9IEZpeGVkTnVtYmVyLmZyb20oXCIwLjVcIik7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1maXhlZG51bWJlci5qcy5tYXAiLCJleHBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiLi9iaWdudW1iZXJcIjtcbmV4cG9ydCB7IGZvcm1hdEZpeGVkLCBGaXhlZEZvcm1hdCwgRml4ZWROdW1iZXIsIHBhcnNlRml4ZWQgfSBmcm9tIFwiLi9maXhlZG51bWJlclwiO1xuLy8gSW50ZXJuYWwgbWV0aG9kcyB1c2VkIGJ5IGFkZHJlc3NcbmV4cG9ydCB7IF9iYXNlMTZUbzM2LCBfYmFzZTM2VG8xNiB9IGZyb20gXCIuL2JpZ251bWJlclwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcImJ5dGVzLzUuMC4xMFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBpc0hleGFibGUodmFsdWUpIHtcbiAgICByZXR1cm4gISEodmFsdWUudG9IZXhTdHJpbmcpO1xufVxuZnVuY3Rpb24gYWRkU2xpY2UoYXJyYXkpIHtcbiAgICBpZiAoYXJyYXkuc2xpY2UpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgICBhcnJheS5zbGljZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiBhZGRTbGljZShuZXcgVWludDhBcnJheShBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYXJyYXksIGFyZ3MpKSk7XG4gICAgfTtcbiAgICByZXR1cm4gYXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCeXRlc0xpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gKChpc0hleFN0cmluZyh2YWx1ZSkgJiYgISh2YWx1ZS5sZW5ndGggJSAyKSkgfHwgaXNCeXRlcyh2YWx1ZSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQnl0ZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gVWludDhBcnJheSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCB2ID0gdmFsdWVbaV07XG4gICAgICAgIGlmICh0eXBlb2YgKHYpICE9PSBcIm51bWJlclwiIHx8IHYgPCAwIHx8IHYgPj0gMjU2IHx8ICh2ICUgMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheWlmeSh2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBsb2dnZXIuY2hlY2tTYWZlVWludDUzKHZhbHVlLCBcImludmFsaWQgYXJyYXlpZnkgdmFsdWVcIik7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICB3aGlsZSAodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC51bnNoaWZ0KHZhbHVlICYgMHhmZik7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KFN0cmluZyh2YWx1ZSAvIDI1NikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkU2xpY2UobmV3IFVpbnQ4QXJyYXkocmVzdWx0KSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmFsbG93TWlzc2luZ1ByZWZpeCAmJiB0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5zdWJzdHJpbmcoMCwgMikgIT09IFwiMHhcIikge1xuICAgICAgICB2YWx1ZSA9IFwiMHhcIiArIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNIZXhhYmxlKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvSGV4U3RyaW5nKCk7XG4gICAgfVxuICAgIGlmIChpc0hleFN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgbGV0IGhleCA9IHZhbHVlLnN1YnN0cmluZygyKTtcbiAgICAgICAgaWYgKGhleC5sZW5ndGggJSAyKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oZXhQYWQgPT09IFwibGVmdFwiKSB7XG4gICAgICAgICAgICAgICAgaGV4ID0gXCIweDBcIiArIGhleC5zdWJzdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhleFBhZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgaGV4ICs9IFwiMFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImhleCBkYXRhIGlzIG9kZC1sZW5ndGhcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGV4Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludChoZXguc3Vic3RyaW5nKGksIGkgKyAyKSwgMTYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkU2xpY2UobmV3IFVpbnQ4QXJyYXkocmVzdWx0KSk7XG4gICAgfVxuICAgIGlmIChpc0J5dGVzKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gYWRkU2xpY2UobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGFycmF5aWZ5IHZhbHVlXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdChpdGVtcykge1xuICAgIGNvbnN0IG9iamVjdHMgPSBpdGVtcy5tYXAoaXRlbSA9PiBhcnJheWlmeShpdGVtKSk7XG4gICAgY29uc3QgbGVuZ3RoID0gb2JqZWN0cy5yZWR1Y2UoKGFjY3VtLCBpdGVtKSA9PiAoYWNjdW0gKyBpdGVtLmxlbmd0aCksIDApO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgb2JqZWN0cy5yZWR1Y2UoKG9mZnNldCwgb2JqZWN0KSA9PiB7XG4gICAgICAgIHJlc3VsdC5zZXQob2JqZWN0LCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gb2Zmc2V0ICsgb2JqZWN0Lmxlbmd0aDtcbiAgICB9LCAwKTtcbiAgICByZXR1cm4gYWRkU2xpY2UocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFplcm9zKHZhbHVlKSB7XG4gICAgbGV0IHJlc3VsdCA9IGFycmF5aWZ5KHZhbHVlKTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBub24temVybyBlbnRyeVxuICAgIGxldCBzdGFydCA9IDA7XG4gICAgd2hpbGUgKHN0YXJ0IDwgcmVzdWx0Lmxlbmd0aCAmJiByZXN1bHRbc3RhcnRdID09PSAwKSB7XG4gICAgICAgIHN0YXJ0Kys7XG4gICAgfVxuICAgIC8vIElmIHdlIHN0YXJ0ZWQgd2l0aCB6ZXJvcywgc3RyaXAgdGhlbVxuICAgIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2Uoc3RhcnQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHplcm9QYWQodmFsdWUsIGxlbmd0aCkge1xuICAgIHZhbHVlID0gYXJyYXlpZnkodmFsdWUpO1xuICAgIGlmICh2YWx1ZS5sZW5ndGggPiBsZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInZhbHVlIG91dCBvZiByYW5nZVwiLCBcInZhbHVlXCIsIGFyZ3VtZW50c1swXSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgcmVzdWx0LnNldCh2YWx1ZSwgbGVuZ3RoIC0gdmFsdWUubGVuZ3RoKTtcbiAgICByZXR1cm4gYWRkU2xpY2UocmVzdWx0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0hleFN0cmluZyh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiAodmFsdWUpICE9PSBcInN0cmluZ1wiIHx8ICF2YWx1ZS5tYXRjaCgvXjB4WzAtOUEtRmEtZl0qJC8pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggIT09IDIgKyAyICogbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5jb25zdCBIZXhDaGFyYWN0ZXJzID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCI7XG5leHBvcnQgZnVuY3Rpb24gaGV4bGlmeSh2YWx1ZSwgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBsb2dnZXIuY2hlY2tTYWZlVWludDUzKHZhbHVlLCBcImludmFsaWQgaGV4bGlmeSB2YWx1ZVwiKTtcbiAgICAgICAgbGV0IGhleCA9IFwiXCI7XG4gICAgICAgIHdoaWxlICh2YWx1ZSkge1xuICAgICAgICAgICAgaGV4ID0gSGV4Q2hhcmFjdGVyc1t2YWx1ZSAmIDB4MGZdICsgaGV4O1xuICAgICAgICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlIC8gMTYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXgubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGV4Lmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgICAgICBoZXggPSBcIjBcIiArIGhleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBcIjB4XCIgKyBoZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiMHgwMFwiO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5hbGxvd01pc3NpbmdQcmVmaXggJiYgdHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUuc3Vic3RyaW5nKDAsIDIpICE9PSBcIjB4XCIpIHtcbiAgICAgICAgdmFsdWUgPSBcIjB4XCIgKyB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzSGV4YWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvSGV4U3RyaW5nKCk7XG4gICAgfVxuICAgIGlmIChpc0hleFN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAlIDIpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmhleFBhZCA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiMHgwXCIgKyB2YWx1ZS5zdWJzdHJpbmcoMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLmhleFBhZCA9PT0gXCJyaWdodFwiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgKz0gXCIwXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaGV4IGRhdGEgaXMgb2RkLWxlbmd0aFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgaWYgKGlzQnl0ZXModmFsdWUpKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIjB4XCI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsdWVbaV07XG4gICAgICAgICAgICByZXN1bHQgKz0gSGV4Q2hhcmFjdGVyc1sodiAmIDB4ZjApID4+IDRdICsgSGV4Q2hhcmFjdGVyc1t2ICYgMHgwZl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGhleGxpZnkgdmFsdWVcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG59XG4vKlxuZnVuY3Rpb24gdW5vZGRpZnkodmFsdWU6IEJ5dGVzTGlrZSB8IEhleGFibGUgfCBudW1iZXIpOiBCeXRlc0xpa2UgfCBIZXhhYmxlIHwgbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZS5sZW5ndGggJSAyICYmIHZhbHVlLnN1YnN0cmluZygwLCAyKSA9PT0gXCIweFwiKSB7XG4gICAgICAgIHJldHVybiBcIjB4MFwiICsgdmFsdWUuc3Vic3RyaW5nKDIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGhleERhdGFMZW5ndGgoZGF0YSkge1xuICAgIGlmICh0eXBlb2YgKGRhdGEpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGRhdGEgPSBoZXhsaWZ5KGRhdGEpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNIZXhTdHJpbmcoZGF0YSkgfHwgKGRhdGEubGVuZ3RoICUgMikpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiAoZGF0YS5sZW5ndGggLSAyKSAvIDI7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4RGF0YVNsaWNlKGRhdGEsIG9mZnNldCwgZW5kT2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiAoZGF0YSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZGF0YSA9IGhleGxpZnkoZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc0hleFN0cmluZyhkYXRhKSB8fCAoZGF0YS5sZW5ndGggJSAyKSkge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBoZXhEYXRhXCIsIFwidmFsdWVcIiwgZGF0YSk7XG4gICAgfVxuICAgIG9mZnNldCA9IDIgKyAyICogb2Zmc2V0O1xuICAgIGlmIChlbmRPZmZzZXQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gXCIweFwiICsgZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCAyICsgMiAqIGVuZE9mZnNldCk7XG4gICAgfVxuICAgIHJldHVybiBcIjB4XCIgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhleENvbmNhdChpdGVtcykge1xuICAgIGxldCByZXN1bHQgPSBcIjB4XCI7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICByZXN1bHQgKz0gaGV4bGlmeShpdGVtKS5zdWJzdHJpbmcoMik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBoZXhWYWx1ZSh2YWx1ZSkge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBoZXhTdHJpcFplcm9zKGhleGxpZnkodmFsdWUsIHsgaGV4UGFkOiBcImxlZnRcIiB9KSk7XG4gICAgaWYgKHRyaW1tZWQgPT09IFwiMHhcIikge1xuICAgICAgICByZXR1cm4gXCIweDBcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRyaW1tZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4U3RyaXBaZXJvcyh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YWx1ZSA9IGhleGxpZnkodmFsdWUpO1xuICAgIH1cbiAgICBpZiAoIWlzSGV4U3RyaW5nKHZhbHVlKSkge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBoZXggc3RyaW5nXCIsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygyKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0IDwgdmFsdWUubGVuZ3RoICYmIHZhbHVlW29mZnNldF0gPT09IFwiMFwiKSB7XG4gICAgICAgIG9mZnNldCsrO1xuICAgIH1cbiAgICByZXR1cm4gXCIweFwiICsgdmFsdWUuc3Vic3RyaW5nKG9mZnNldCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4WmVyb1BhZCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgaWYgKHR5cGVvZiAodmFsdWUpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHZhbHVlID0gaGV4bGlmeSh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFpc0hleFN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgaGV4IHN0cmluZ1wiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IDIgKiBsZW5ndGggKyAyKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ2YWx1ZSBvdXQgb2YgcmFuZ2VcIiwgXCJ2YWx1ZVwiLCBhcmd1bWVudHNbMV0pO1xuICAgIH1cbiAgICB3aGlsZSAodmFsdWUubGVuZ3RoIDwgMiAqIGxlbmd0aCArIDIpIHtcbiAgICAgICAgdmFsdWUgPSBcIjB4MFwiICsgdmFsdWUuc3Vic3RyaW5nKDIpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTaWduYXR1cmUoc2lnbmF0dXJlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICByOiBcIjB4XCIsXG4gICAgICAgIHM6IFwiMHhcIixcbiAgICAgICAgX3ZzOiBcIjB4XCIsXG4gICAgICAgIHJlY292ZXJ5UGFyYW06IDAsXG4gICAgICAgIHY6IDBcbiAgICB9O1xuICAgIGlmIChpc0J5dGVzTGlrZShzaWduYXR1cmUpKSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gYXJyYXlpZnkoc2lnbmF0dXJlKTtcbiAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gNjUpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIHNpZ25hdHVyZSBzdHJpbmc7IG11c3QgYmUgNjUgYnl0ZXNcIiwgXCJzaWduYXR1cmVcIiwgc2lnbmF0dXJlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBHZXQgdGhlIHIsIHMgYW5kIHZcbiAgICAgICAgcmVzdWx0LnIgPSBoZXhsaWZ5KGJ5dGVzLnNsaWNlKDAsIDMyKSk7XG4gICAgICAgIHJlc3VsdC5zID0gaGV4bGlmeShieXRlcy5zbGljZSgzMiwgNjQpKTtcbiAgICAgICAgcmVzdWx0LnYgPSBieXRlc1s2NF07XG4gICAgICAgIC8vIEFsbG93IGEgcmVjaWQgdG8gYmUgdXNlZCBhcyB0aGUgdlxuICAgICAgICBpZiAocmVzdWx0LnYgPCAyNykge1xuICAgICAgICAgICAgaWYgKHJlc3VsdC52ID09PSAwIHx8IHJlc3VsdC52ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnYgKz0gMjc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwic2lnbmF0dXJlIGludmFsaWQgdiBieXRlXCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tcHV0ZSByZWNvdmVyeVBhcmFtIGZyb20gdlxuICAgICAgICByZXN1bHQucmVjb3ZlcnlQYXJhbSA9IDEgLSAocmVzdWx0LnYgJSAyKTtcbiAgICAgICAgLy8gQ29tcHV0ZSBfdnMgZnJvbSByZWNvdmVyeVBhcmFtIGFuZCBzXG4gICAgICAgIGlmIChyZXN1bHQucmVjb3ZlcnlQYXJhbSkge1xuICAgICAgICAgICAgYnl0ZXNbMzJdIHw9IDB4ODA7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Ll92cyA9IGhleGxpZnkoYnl0ZXMuc2xpY2UoMzIsIDY0KSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXN1bHQuciA9IHNpZ25hdHVyZS5yO1xuICAgICAgICByZXN1bHQucyA9IHNpZ25hdHVyZS5zO1xuICAgICAgICByZXN1bHQudiA9IHNpZ25hdHVyZS52O1xuICAgICAgICByZXN1bHQucmVjb3ZlcnlQYXJhbSA9IHNpZ25hdHVyZS5yZWNvdmVyeVBhcmFtO1xuICAgICAgICByZXN1bHQuX3ZzID0gc2lnbmF0dXJlLl92cztcbiAgICAgICAgLy8gSWYgdGhlIF92cyBpcyBhdmFpbGFibGUsIHVzZSBpdCB0byBwb3B1bGF0ZSBtaXNzaW5nIHMsIHYgYW5kIHJlY292ZXJ5UGFyYW1cbiAgICAgICAgLy8gYW5kIHZlcmlmeSBub24tbWlzc2luZyBzLCB2IGFuZCByZWNvdmVyeVBhcmFtXG4gICAgICAgIGlmIChyZXN1bHQuX3ZzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHZzID0gemVyb1BhZChhcnJheWlmeShyZXN1bHQuX3ZzKSwgMzIpO1xuICAgICAgICAgICAgcmVzdWx0Ll92cyA9IGhleGxpZnkodnMpO1xuICAgICAgICAgICAgLy8gU2V0IG9yIGNoZWNrIHRoZSByZWNpZFxuICAgICAgICAgICAgY29uc3QgcmVjb3ZlcnlQYXJhbSA9ICgodnNbMF0gPj0gMTI4KSA/IDEgOiAwKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQucmVjb3ZlcnlQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlY292ZXJ5UGFyYW0gPSByZWNvdmVyeVBhcmFtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LnJlY292ZXJ5UGFyYW0gIT09IHJlY292ZXJ5UGFyYW0pIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwic2lnbmF0dXJlIHJlY292ZXJ5UGFyYW0gbWlzbWF0Y2ggX3ZzXCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZXQgb3IgY2hlY2sgdGhlIHNcbiAgICAgICAgICAgIHZzWzBdICY9IDB4N2Y7XG4gICAgICAgICAgICBjb25zdCBzID0gaGV4bGlmeSh2cyk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zID0gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInNpZ25hdHVyZSB2IG1pc21hdGNoIF92c1wiLCBcInNpZ25hdHVyZVwiLCBzaWduYXR1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSByZWNpZCBhbmQgdiB0byBwb3B1bGF0ZSBlYWNoIG90aGVyXG4gICAgICAgIGlmIChyZXN1bHQucmVjb3ZlcnlQYXJhbSA9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJzaWduYXR1cmUgbWlzc2luZyB2IGFuZCByZWNvdmVyeVBhcmFtXCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucmVjb3ZlcnlQYXJhbSA9IDEgLSAocmVzdWx0LnYgJSAyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQudiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnYgPSAyNyArIHJlc3VsdC5yZWNvdmVyeVBhcmFtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LnJlY292ZXJ5UGFyYW0gIT09ICgxIC0gKHJlc3VsdC52ICUgMikpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInNpZ25hdHVyZSByZWNvdmVyeVBhcmFtIG1pc21hdGNoIHZcIiwgXCJzaWduYXR1cmVcIiwgc2lnbmF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnIgPT0gbnVsbCB8fCAhaXNIZXhTdHJpbmcocmVzdWx0LnIpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwic2lnbmF0dXJlIG1pc3Npbmcgb3IgaW52YWxpZCByXCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuciA9IGhleFplcm9QYWQocmVzdWx0LnIsIDMyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnMgPT0gbnVsbCB8fCAhaXNIZXhTdHJpbmcocmVzdWx0LnMpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwic2lnbmF0dXJlIG1pc3Npbmcgb3IgaW52YWxpZCBzXCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucyA9IGhleFplcm9QYWQocmVzdWx0LnMsIDMyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2cyA9IGFycmF5aWZ5KHJlc3VsdC5zKTtcbiAgICAgICAgaWYgKHZzWzBdID49IDEyOCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInNpZ25hdHVyZSBzIG91dCBvZiByYW5nZVwiLCBcInNpZ25hdHVyZVwiLCBzaWduYXR1cmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQucmVjb3ZlcnlQYXJhbSkge1xuICAgICAgICAgICAgdnNbMF0gfD0gMHg4MDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBfdnMgPSBoZXhsaWZ5KHZzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5fdnMpIHtcbiAgICAgICAgICAgIGlmICghaXNIZXhTdHJpbmcocmVzdWx0Ll92cykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwic2lnbmF0dXJlIGludmFsaWQgX3ZzXCIsIFwic2lnbmF0dXJlXCIsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuX3ZzID0gaGV4WmVyb1BhZChyZXN1bHQuX3ZzLCAzMik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IG9yIGNoZWNrIHRoZSBfdnNcbiAgICAgICAgaWYgKHJlc3VsdC5fdnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Ll92cyA9IF92cztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXN1bHQuX3ZzICE9PSBfdnMpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJzaWduYXR1cmUgX3ZzIG1pc21hdGNoIHYgYW5kIHNcIiwgXCJzaWduYXR1cmVcIiwgc2lnbmF0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5TaWduYXR1cmUoc2lnbmF0dXJlKSB7XG4gICAgc2lnbmF0dXJlID0gc3BsaXRTaWduYXR1cmUoc2lnbmF0dXJlKTtcbiAgICByZXR1cm4gaGV4bGlmeShjb25jYXQoW1xuICAgICAgICBzaWduYXR1cmUucixcbiAgICAgICAgc2lnbmF0dXJlLnMsXG4gICAgICAgIChzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSA/IFwiMHgxY1wiIDogXCIweDFiXCIpXG4gICAgXSkpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IEFkZHJlc3NaZXJvID0gXCIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWFkZHJlc3Nlcy5qcy5tYXAiLCJpbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5jb25zdCBOZWdhdGl2ZU9uZSA9ICggLyojX19QVVJFX18qL0JpZ051bWJlci5mcm9tKC0xKSk7XG5jb25zdCBaZXJvID0gKCAvKiNfX1BVUkVfXyovQmlnTnVtYmVyLmZyb20oMCkpO1xuY29uc3QgT25lID0gKCAvKiNfX1BVUkVfXyovQmlnTnVtYmVyLmZyb20oMSkpO1xuY29uc3QgVHdvID0gKCAvKiNfX1BVUkVfXyovQmlnTnVtYmVyLmZyb20oMikpO1xuY29uc3QgV2VpUGVyRXRoZXIgPSAoIC8qI19fUFVSRV9fKi9CaWdOdW1iZXIuZnJvbShcIjEwMDAwMDAwMDAwMDAwMDAwMDBcIikpO1xuY29uc3QgTWF4VWludDI1NiA9ICggLyojX19QVVJFX18qL0JpZ051bWJlci5mcm9tKFwiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmXCIpKTtcbmV4cG9ydCB7IE5lZ2F0aXZlT25lLCBaZXJvLCBPbmUsIFR3bywgV2VpUGVyRXRoZXIsIE1heFVpbnQyNTYgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJpZ251bWJlcnMuanMubWFwIiwiZXhwb3J0IGNvbnN0IEhhc2haZXJvID0gXCIweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2hlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydCB7IEFkZHJlc3NaZXJvIH0gZnJvbSBcIi4vYWRkcmVzc2VzXCI7XG5leHBvcnQgeyBOZWdhdGl2ZU9uZSwgWmVybywgT25lLCBUd28sIFdlaVBlckV0aGVyLCBNYXhVaW50MjU2IH0gZnJvbSBcIi4vYmlnbnVtYmVyc1wiO1xuZXhwb3J0IHsgSGFzaFplcm8gfSBmcm9tIFwiLi9oYXNoZXNcIjtcbmV4cG9ydCB7IEV0aGVyU3ltYm9sIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLy8gTkZLQyAoY29tcG9zZWQpICAgICAgICAgICAgIC8vIChkZWNvbXBvc2VkKVxuZXhwb3J0IGNvbnN0IEV0aGVyU3ltYm9sID0gXCJcXHUwMzllXCI7IC8vIFwiXFx1RDgzNVxcdURGNjNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0cmluZ3MuanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcImNvbnRyYWN0cy81LjAuMTFcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBjaGVja1Jlc3VsdEVycm9ycywgSW5kZXhlZCwgSW50ZXJmYWNlIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2FiaVwiO1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYWJzdHJhY3QtcHJvdmlkZXJcIjtcbmltcG9ydCB7IFNpZ25lciwgVm9pZFNpZ25lciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hYnN0cmFjdC1zaWduZXJcIjtcbmltcG9ydCB7IGdldEFkZHJlc3MsIGdldENvbnRyYWN0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgY29uY2F0LCBoZXhsaWZ5LCBpc0J5dGVzLCBpc0hleFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgZGVmaW5lUmVhZE9ubHksIGRlZXBDb3B5LCBnZXRTdGF0aWMsIHJlc29sdmVQcm9wZXJ0aWVzLCBzaGFsbG93Q29weSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG4vLyBAVE9PRCByZW1vdmUgZGVwZW5kZW5jZXMgdHJhbnNhY3Rpb25zXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG47XG47XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBhbGxvd2VkVHJhbnNhY3Rpb25LZXlzID0ge1xuICAgIGNoYWluSWQ6IHRydWUsIGRhdGE6IHRydWUsIGZyb206IHRydWUsIGdhc0xpbWl0OiB0cnVlLCBnYXNQcmljZTogdHJ1ZSwgbm9uY2U6IHRydWUsIHRvOiB0cnVlLCB2YWx1ZTogdHJ1ZVxufTtcbmZ1bmN0aW9uIHJlc29sdmVOYW1lKHJlc29sdmVyLCBuYW1lT3JQcm9taXNlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHlpZWxkIG5hbWVPclByb21pc2U7XG4gICAgICAgIC8vIElmIGl0IGlzIGFscmVhZHkgYW4gYWRkcmVzcywganVzdCB1c2UgaXQgKGFmdGVyIGFkZGluZyBjaGVja3N1bSlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBZGRyZXNzKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiYSBwcm92aWRlciBvciBzaWduZXIgaXMgbmVlZGVkIHRvIHJlc29sdmUgRU5TIG5hbWVzXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInJlc29sdmVOYW1lXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSB5aWVsZCByZXNvbHZlci5yZXNvbHZlTmFtZShuYW1lKTtcbiAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInJlc29sdmVyIG9yIGFkZHIgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIEVOUyBuYW1lXCIsIFwibmFtZVwiLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICB9KTtcbn1cbi8vIFJlY3Vyc2l2ZWx5IHJlcGxhY2VzIEVOUyBuYW1lcyB3aXRoIHByb21pc2VzIHRvIHJlc29sdmUgdGhlIG5hbWUgYW5kIHJlc29sdmVzIGFsbCBwcm9wZXJ0aWVzXG5mdW5jdGlvbiByZXNvbHZlQWRkcmVzc2VzKHJlc29sdmVyLCB2YWx1ZSwgcGFyYW1UeXBlKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1UeXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIFByb21pc2UuYWxsKHBhcmFtVHlwZS5tYXAoKHBhcmFtVHlwZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFkZHJlc3NlcyhyZXNvbHZlciwgKChBcnJheS5pc0FycmF5KHZhbHVlKSkgPyB2YWx1ZVtpbmRleF0gOiB2YWx1ZVtwYXJhbVR5cGUubmFtZV0pLCBwYXJhbVR5cGUpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbVR5cGUudHlwZSA9PT0gXCJhZGRyZXNzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCByZXNvbHZlTmFtZShyZXNvbHZlciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJhbVR5cGUudHlwZSA9PT0gXCJ0dXBsZVwiKSB7XG4gICAgICAgICAgICByZXR1cm4geWllbGQgcmVzb2x2ZUFkZHJlc3NlcyhyZXNvbHZlciwgdmFsdWUsIHBhcmFtVHlwZS5jb21wb25lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyYW1UeXBlLmJhc2VUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiaW52YWxpZCB2YWx1ZSBmb3IgYXJyYXlcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIFByb21pc2UuYWxsKHZhbHVlLm1hcCgodikgPT4gcmVzb2x2ZUFkZHJlc3NlcyhyZXNvbHZlciwgdiwgcGFyYW1UeXBlLmFycmF5Q2hpbGRyZW4pKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcG9wdWxhdGVUcmFuc2FjdGlvbihjb250cmFjdCwgZnJhZ21lbnQsIGFyZ3MpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAvLyBJZiBhbiBleHRyYSBhcmd1bWVudCBpcyBnaXZlbiwgaXQgaXMgb3ZlcnJpZGVzXG4gICAgICAgIGxldCBvdmVycmlkZXMgPSB7fTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSBmcmFnbWVudC5pbnB1dHMubGVuZ3RoICsgMSAmJiB0eXBlb2YgKGFyZ3NbYXJncy5sZW5ndGggLSAxXSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIG92ZXJyaWRlcyA9IHNoYWxsb3dDb3B5KGFyZ3MucG9wKCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVyIGNvdW50IG1hdGNoZXNcbiAgICAgICAgbG9nZ2VyLmNoZWNrQXJndW1lbnRDb3VudChhcmdzLmxlbmd0aCwgZnJhZ21lbnQuaW5wdXRzLmxlbmd0aCwgXCJwYXNzZWQgdG8gY29udHJhY3RcIik7XG4gICAgICAgIC8vIFBvcHVsYXRlIFwiZnJvbVwiIG92ZXJyaWRlIChhbGxvdyBwcm9taXNlcylcbiAgICAgICAgaWYgKGNvbnRyYWN0LnNpZ25lcikge1xuICAgICAgICAgICAgaWYgKG92ZXJyaWRlcy5mcm9tKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29udHJhY3RzIHdpdGggYSBTaWduZXIgYXJlIGZyb20gdGhlIFNpZ25lcidzIGZyYW1lLW9mLXJlZmVyZW5jZTtcbiAgICAgICAgICAgICAgICAvLyBidXQgd2UgYWxsb3cgb3ZlcnJpZGluZyBcImZyb21cIiBpZiBpdCBtYXRjaGVzIHRoZSBzaWduZXJcbiAgICAgICAgICAgICAgICBvdmVycmlkZXMuZnJvbSA9IHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGU6IHJlc29sdmVOYW1lKGNvbnRyYWN0LnNpZ25lciwgb3ZlcnJpZGVzLmZyb20pLFxuICAgICAgICAgICAgICAgICAgICBzaWduZXI6IGNvbnRyYWN0LnNpZ25lci5nZXRBZGRyZXNzKClcbiAgICAgICAgICAgICAgICB9KS50aGVuKChjaGVjaykgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0QWRkcmVzcyhjaGVjay5zaWduZXIpICE9PSBjaGVjay5vdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJDb250cmFjdCB3aXRoIGEgU2lnbmVyIGNhbm5vdCBvdmVycmlkZSBmcm9tXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcIm92ZXJyaWRlcy5mcm9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVjay5vdmVycmlkZTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdmVycmlkZXMuZnJvbSA9IGNvbnRyYWN0LnNpZ25lci5nZXRBZGRyZXNzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAob3ZlcnJpZGVzLmZyb20pIHtcbiAgICAgICAgICAgIG92ZXJyaWRlcy5mcm9tID0gcmVzb2x2ZU5hbWUoY29udHJhY3QucHJvdmlkZXIsIG92ZXJyaWRlcy5mcm9tKTtcbiAgICAgICAgICAgIC8vfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnRyYWN0cyB3aXRob3V0IGEgc2lnbmVyIGNhbiBvdmVycmlkZSBcImZyb21cIiwgYW5kIGlmXG4gICAgICAgICAgICAvLyB1bnNwZWNpZmllZCB0aGUgemVybyBhZGRyZXNzIGlzIHVzZWRcbiAgICAgICAgICAgIC8vb3ZlcnJpZGVzLmZyb20gPSBBZGRyZXNzWmVybztcbiAgICAgICAgfVxuICAgICAgICAvLyBXYWl0IGZvciBhbGwgZGVwZW5kZW5jaWVzIHRvIGJlIHJlc29sdmVkIChwcmVmZXIgdGhlIHNpZ25lciBvdmVyIHRoZSBwcm92aWRlcilcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB5aWVsZCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICBhcmdzOiByZXNvbHZlQWRkcmVzc2VzKGNvbnRyYWN0LnNpZ25lciB8fCBjb250cmFjdC5wcm92aWRlciwgYXJncywgZnJhZ21lbnQuaW5wdXRzKSxcbiAgICAgICAgICAgIGFkZHJlc3M6IGNvbnRyYWN0LnJlc29sdmVkQWRkcmVzcyxcbiAgICAgICAgICAgIG92ZXJyaWRlczogKHJlc29sdmVQcm9wZXJ0aWVzKG92ZXJyaWRlcykgfHwge30pXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGUgQUJJIGNvZGVkIHRyYW5zYWN0aW9uXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb250cmFjdC5pbnRlcmZhY2UuZW5jb2RlRnVuY3Rpb25EYXRhKGZyYWdtZW50LCByZXNvbHZlZC5hcmdzKTtcbiAgICAgICAgY29uc3QgdHggPSB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICAgICAgdG86IHJlc29sdmVkLmFkZHJlc3NcbiAgICAgICAgfTtcbiAgICAgICAgLy8gUmVzb2x2ZWQgT3ZlcnJpZGVzXG4gICAgICAgIGNvbnN0IHJvID0gcmVzb2x2ZWQub3ZlcnJpZGVzO1xuICAgICAgICAvLyBQb3B1bGF0ZSBzaW1wbGUgb3ZlcnJpZGVzXG4gICAgICAgIGlmIChyby5ub25jZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0eC5ub25jZSA9IEJpZ051bWJlci5mcm9tKHJvLm5vbmNlKS50b051bWJlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyby5nYXNMaW1pdCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0eC5nYXNMaW1pdCA9IEJpZ051bWJlci5mcm9tKHJvLmdhc0xpbWl0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm8uZ2FzUHJpY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgdHguZ2FzUHJpY2UgPSBCaWdOdW1iZXIuZnJvbShyby5nYXNQcmljZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvLmZyb20gIT0gbnVsbCkge1xuICAgICAgICAgICAgdHguZnJvbSA9IHJvLmZyb207XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG5vIFwiZ2FzTGltaXRcIiBvdmVycmlkZSwgYnV0IHRoZSBBQkkgc3BlY2lmaWVzIGEgZGVmYXVsdCwgdXNlIGl0XG4gICAgICAgIGlmICh0eC5nYXNMaW1pdCA9PSBudWxsICYmIGZyYWdtZW50LmdhcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDb25tcHV0ZSB0aGUgaW50cmluaXNpYyBnYXMgY29zdCBmb3IgdGhpcyB0cmFuc2FjdGlvblxuICAgICAgICAgICAgLy8gQFRPRE86IFRoaXMgaXMgYmFzZWQgb24gdGhlIHllbGxvdyBwYXBlciBhcyBvZiBQZXRlcnNidXJnOyB0aGlzIGlzIHNvbWV0aGluZ1xuICAgICAgICAgICAgLy8gd2UgbWF5IHdpc2ggdG8gcGFyYW1ldGVyaXplIGluIHY2IGFzIHBhcnQgb2YgdGhlIE5ldHdvcmsgb2JqZWN0LiBTaW5jZSB0aGlzXG4gICAgICAgICAgICAvLyBpcyBhbHdheXMgYSBub24tbmlsIHRvIGFkZHJlc3MsIHdlIGNhbiBpZ25vcmUgR19jcmVhdGUsIGJ1dCBtYXkgd2lzaCB0byBhZGRcbiAgICAgICAgICAgIC8vIHNpbWlsYXIgbG9naWMgdG8gdGhlIENvbnRyYWN0RmFjdG9yeS5cbiAgICAgICAgICAgIGxldCBpbnRyaW5zaWMgPSAyMTAwMDtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gYXJyYXlpZnkoZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaW50cmluc2ljICs9IDQ7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGludHJpbnNpYyArPSA2NDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0eC5nYXNMaW1pdCA9IEJpZ051bWJlci5mcm9tKGZyYWdtZW50LmdhcykuYWRkKGludHJpbnNpYyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUG9wdWxhdGUgXCJ2YWx1ZVwiIG92ZXJyaWRlXG4gICAgICAgIGlmIChyby52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3Qgcm9WYWx1ZSA9IEJpZ051bWJlci5mcm9tKHJvLnZhbHVlKTtcbiAgICAgICAgICAgIGlmICghcm9WYWx1ZS5pc1plcm8oKSAmJiAhZnJhZ21lbnQucGF5YWJsZSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwibm9uLXBheWFibGUgbWV0aG9kIGNhbm5vdCBvdmVycmlkZSB2YWx1ZVwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwib3ZlcnJpZGVzLnZhbHVlXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvdmVycmlkZXMudmFsdWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR4LnZhbHVlID0gcm9WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZW12b2UgdGhlIG92ZXJyaWRlc1xuICAgICAgICBkZWxldGUgb3ZlcnJpZGVzLm5vbmNlO1xuICAgICAgICBkZWxldGUgb3ZlcnJpZGVzLmdhc0xpbWl0O1xuICAgICAgICBkZWxldGUgb3ZlcnJpZGVzLmdhc1ByaWNlO1xuICAgICAgICBkZWxldGUgb3ZlcnJpZGVzLmZyb207XG4gICAgICAgIGRlbGV0ZSBvdmVycmlkZXMudmFsdWU7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gc3RyYXkgb3ZlcnJpZGVzLCB3aGljaCBtYXkgaW5kaWNhdGUgYVxuICAgICAgICAvLyB0eXBvIG9yIHVzaW5nIGFuIHVuc3VwcG9ydGVkIGtleS5cbiAgICAgICAgY29uc3QgbGVmdG92ZXJzID0gT2JqZWN0LmtleXMob3ZlcnJpZGVzKS5maWx0ZXIoKGtleSkgPT4gKG92ZXJyaWRlc1trZXldICE9IG51bGwpKTtcbiAgICAgICAgaWYgKGxlZnRvdmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKGBjYW5ub3Qgb3ZlcnJpZGUgJHtsZWZ0b3ZlcnMubWFwKChsKSA9PiBKU09OLnN0cmluZ2lmeShsKSkuam9pbihcIixcIil9YCwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwib3ZlcnJpZGVzXCIsXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVzOiBsZWZ0b3ZlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eDtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGJ1aWxkUG9wdWxhdGUoY29udHJhY3QsIGZyYWdtZW50KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBwb3B1bGF0ZVRyYW5zYWN0aW9uKGNvbnRyYWN0LCBmcmFnbWVudCwgYXJncyk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkRXN0aW1hdGUoY29udHJhY3QsIGZyYWdtZW50KSB7XG4gICAgY29uc3Qgc2lnbmVyT3JQcm92aWRlciA9IChjb250cmFjdC5zaWduZXIgfHwgY29udHJhY3QucHJvdmlkZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKCFzaWduZXJPclByb3ZpZGVyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJlc3RpbWF0ZSByZXF1aXJlIGEgcHJvdmlkZXIgb3Igc2lnbmVyXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJlc3RpbWF0ZUdhc1wiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0eCA9IHlpZWxkIHBvcHVsYXRlVHJhbnNhY3Rpb24oY29udHJhY3QsIGZyYWdtZW50LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB5aWVsZCBzaWduZXJPclByb3ZpZGVyLmVzdGltYXRlR2FzKHR4KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkQ2FsbChjb250cmFjdCwgZnJhZ21lbnQsIGNvbGxhcHNlU2ltcGxlKSB7XG4gICAgY29uc3Qgc2lnbmVyT3JQcm92aWRlciA9IChjb250cmFjdC5zaWduZXIgfHwgY29udHJhY3QucHJvdmlkZXIpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgXCJibG9ja1RhZ1wiIG92ZXJyaWRlIGlmIHByZXNlbnRcbiAgICAgICAgICAgIGxldCBibG9ja1RhZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gZnJhZ21lbnQuaW5wdXRzLmxlbmd0aCArIDEgJiYgdHlwZW9mIChhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGVzID0gc2hhbGxvd0NvcHkoYXJncy5wb3AoKSk7XG4gICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlcy5ibG9ja1RhZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrVGFnID0geWllbGQgb3ZlcnJpZGVzLmJsb2NrVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgb3ZlcnJpZGVzLmJsb2NrVGFnO1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChvdmVycmlkZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlIGNvbnRyYWN0IHdhcyBqdXN0IGRlcGxveWVkLCB3YWl0IHVudGlsIGl0IGlzIG1pbmVkXG4gICAgICAgICAgICBpZiAoY29udHJhY3QuZGVwbG95VHJhbnNhY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGNvbnRyYWN0Ll9kZXBsb3llZChibG9ja1RhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDYWxsIGEgbm9kZSBhbmQgZ2V0IHRoZSByZXN1bHRcbiAgICAgICAgICAgIGNvbnN0IHR4ID0geWllbGQgcG9wdWxhdGVUcmFuc2FjdGlvbihjb250cmFjdCwgZnJhZ21lbnQsIGFyZ3MpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgc2lnbmVyT3JQcm92aWRlci5jYWxsKHR4LCBibG9ja1RhZyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvbnRyYWN0LmludGVyZmFjZS5kZWNvZGVGdW5jdGlvblJlc3VsdChmcmFnbWVudCwgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAoY29sbGFwc2VTaW1wbGUgJiYgZnJhZ21lbnQub3V0cHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IExvZ2dlci5lcnJvcnMuQ0FMTF9FWENFUFRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkcmVzcyA9IGNvbnRyYWN0LmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFyZ3MgPSBhcmdzO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci50cmFuc2FjdGlvbiA9IHR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIGJ1aWxkU2VuZChjb250cmFjdCwgZnJhZ21lbnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGlmICghY29udHJhY3Quc2lnbmVyKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJzZW5kaW5nIGEgdHJhbnNhY3Rpb24gcmVxdWlyZXMgYSBzaWduZXJcIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInNlbmRUcmFuc2FjdGlvblwiXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB0aGUgY29udHJhY3Qgd2FzIGp1c3QgZGVwbG95ZWQsIHdhaXQgdW50aWwgaXQgaXMgbWluZGVkXG4gICAgICAgICAgICBpZiAoY29udHJhY3QuZGVwbG95VHJhbnNhY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGNvbnRyYWN0Ll9kZXBsb3llZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHhSZXF1ZXN0ID0geWllbGQgcG9wdWxhdGVUcmFuc2FjdGlvbihjb250cmFjdCwgZnJhZ21lbnQsIGFyZ3MpO1xuICAgICAgICAgICAgY29uc3QgdHggPSB5aWVsZCBjb250cmFjdC5zaWduZXIuc2VuZFRyYW5zYWN0aW9uKHR4UmVxdWVzdCk7XG4gICAgICAgICAgICAvLyBUd2VhayB0aGUgdHcud2FpdCBzbyB0aGUgcmVjZWlwdCBoYXMgZXh0cmEgcHJvcGVydGllc1xuICAgICAgICAgICAgY29uc3Qgd2FpdCA9IHR4LndhaXQuYmluZCh0eCk7XG4gICAgICAgICAgICB0eC53YWl0ID0gKGNvbmZpcm1hdGlvbnMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd2FpdChjb25maXJtYXRpb25zKS50aGVuKChyZWNlaXB0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlY2VpcHQuZXZlbnRzID0gcmVjZWlwdC5sb2dzLm1hcCgobG9nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXZlbnQgPSBkZWVwQ29weShsb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZCA9IGNvbnRyYWN0LmludGVyZmFjZS5wYXJzZUxvZyhsb2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IHBhcnNlZCB0aGUgZXZlbnQgbG9nOyBpbmNsdWRlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuYXJncyA9IHBhcnNlZC5hcmdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRlY29kZSA9IChkYXRhLCB0b3BpY3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyYWN0LmludGVyZmFjZS5kZWNvZGVFdmVudExvZyhwYXJzZWQuZXZlbnRGcmFnbWVudCwgZGF0YSwgdG9waWNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50ID0gcGFyc2VkLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnRTaWduYXR1cmUgPSBwYXJzZWQuc2lnbmF0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZnVsIG9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnJlbW92ZUxpc3RlbmVyID0gKCkgPT4geyByZXR1cm4gY29udHJhY3QucHJvdmlkZXI7IH07XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRCbG9jayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJhY3QucHJvdmlkZXIuZ2V0QmxvY2socmVjZWlwdC5ibG9ja0hhc2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRyYW5zYWN0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cmFjdC5wcm92aWRlci5nZXRUcmFuc2FjdGlvbihyZWNlaXB0LnRyYW5zYWN0aW9uSGFzaCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0VHJhbnNhY3Rpb25SZWNlaXB0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVjZWlwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpcHQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHR4O1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuZnVuY3Rpb24gYnVpbGREZWZhdWx0KGNvbnRyYWN0LCBmcmFnbWVudCwgY29sbGFwc2VTaW1wbGUpIHtcbiAgICBpZiAoZnJhZ21lbnQuY29uc3RhbnQpIHtcbiAgICAgICAgcmV0dXJuIGJ1aWxkQ2FsbChjb250cmFjdCwgZnJhZ21lbnQsIGNvbGxhcHNlU2ltcGxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWxkU2VuZChjb250cmFjdCwgZnJhZ21lbnQpO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRUYWcoZmlsdGVyKSB7XG4gICAgaWYgKGZpbHRlci5hZGRyZXNzICYmIChmaWx0ZXIudG9waWNzID09IG51bGwgfHwgZmlsdGVyLnRvcGljcy5sZW5ndGggPT09IDApKSB7XG4gICAgICAgIHJldHVybiBcIipcIjtcbiAgICB9XG4gICAgcmV0dXJuIChmaWx0ZXIuYWRkcmVzcyB8fCBcIipcIikgKyBcIkBcIiArIChmaWx0ZXIudG9waWNzID8gZmlsdGVyLnRvcGljcy5tYXAoKHRvcGljKSA9PiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRvcGljKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRvcGljLmpvaW4oXCJ8XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3BpYztcbiAgICB9KS5qb2luKFwiOlwiKSA6IFwiXCIpO1xufVxuY2xhc3MgUnVubmluZ0V2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcsIGZpbHRlcikge1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInRhZ1wiLCB0YWcpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImZpbHRlclwiLCBmaWx0ZXIpO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB9XG4gICAgYWRkTGlzdGVuZXIobGlzdGVuZXIsIG9uY2UpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2goeyBsaXN0ZW5lcjogbGlzdGVuZXIsIG9uY2U6IG9uY2UgfSk7XG4gICAgfVxuICAgIHJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKSB7XG4gICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGlmIChkb25lIHx8IGl0ZW0ubGlzdGVuZXIgIT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZUFsbExpc3RlbmVycygpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107XG4gICAgfVxuICAgIGxpc3RlbmVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpc3RlbmVycy5tYXAoKGkpID0+IGkubGlzdGVuZXIpO1xuICAgIH1cbiAgICBsaXN0ZW5lckNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGlzdGVuZXJzLmxlbmd0aDtcbiAgICB9XG4gICAgcnVuKGFyZ3MpIHtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJDb3VudCA9IHRoaXMubGlzdGVuZXJDb3VudCgpO1xuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcmdzQ29weSA9IGFyZ3Muc2xpY2UoKTtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIGNhbGxiYWNrIGluIHRoZSBuZXh0IGV2ZW50IGxvb3BcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ubGlzdGVuZXIuYXBwbHkodGhpcywgYXJnc0NvcHkpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAvLyBSZXNjaGVkdWxlIGl0IGlmIGl0IG5vdCBcIm9uY2VcIlxuICAgICAgICAgICAgcmV0dXJuICEoaXRlbS5vbmNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lckNvdW50O1xuICAgIH1cbiAgICBwcmVwYXJlRXZlbnQoZXZlbnQpIHtcbiAgICB9XG4gICAgLy8gUmV0dXJucyB0aGUgYXJyYXkgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gZW1pdFxuICAgIGdldEVtaXQoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIFtldmVudF07XG4gICAgfVxufVxuY2xhc3MgRXJyb3JSdW5uaW5nRXZlbnQgZXh0ZW5kcyBSdW5uaW5nRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImVycm9yXCIsIG51bGwpO1xuICAgIH1cbn1cbi8vIEBUT0RPIEZyYWdtZW50IHNob3VsZCBpbmhlcml0IFdpbGRjYXJkPyBhbmQganVzdCBvdmVycmlkZSBnZXRFbWl0P1xuLy8gICAgICAgb3IgaGF2ZSBhIGNvbW1vbiBhYnN0cmFjdCBzdXBlciBjbGFzcywgd2l0aCBlbm91Z2ggY29uc3RydWN0b3Jcbi8vICAgICAgIG9wdGlvbnMgdG8gY29uZmlndXJlIGJvdGguXG4vLyBBIEZyYWdtZW50IEV2ZW50IHdpbGwgcG9wdWxhdGUgYWxsIHRoZSBwcm9wZXJ0aWVzIHRoYXQgV2lsZGNhcmRcbi8vIHdpbGwsIGFuZCBhZGRpdGlvYW5sbHkgZGVyZWZlcmVuY2UgdGhlIGFyZ3VtZW50cyB3aGVuIGVtaXR0aW5nXG5jbGFzcyBGcmFnbWVudFJ1bm5pbmdFdmVudCBleHRlbmRzIFJ1bm5pbmdFdmVudCB7XG4gICAgY29uc3RydWN0b3IoYWRkcmVzcywgY29udHJhY3RJbnRlcmZhY2UsIGZyYWdtZW50LCB0b3BpY3MpIHtcbiAgICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICAgICAgYWRkcmVzczogYWRkcmVzc1xuICAgICAgICB9O1xuICAgICAgICBsZXQgdG9waWMgPSBjb250cmFjdEludGVyZmFjZS5nZXRFdmVudFRvcGljKGZyYWdtZW50KTtcbiAgICAgICAgaWYgKHRvcGljcykge1xuICAgICAgICAgICAgaWYgKHRvcGljICE9PSB0b3BpY3NbMF0pIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidG9waWMgbWlzbWF0Y2hcIiwgXCJ0b3BpY3NcIiwgdG9waWNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbHRlci50b3BpY3MgPSB0b3BpY3Muc2xpY2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpbHRlci50b3BpY3MgPSBbdG9waWNdO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKGdldEV2ZW50VGFnKGZpbHRlciksIGZpbHRlcik7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJpbnRlcmZhY2VcIiwgY29udHJhY3RJbnRlcmZhY2UpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImZyYWdtZW50XCIsIGZyYWdtZW50KTtcbiAgICB9XG4gICAgcHJlcGFyZUV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHN1cGVyLnByZXBhcmVFdmVudChldmVudCk7XG4gICAgICAgIGV2ZW50LmV2ZW50ID0gdGhpcy5mcmFnbWVudC5uYW1lO1xuICAgICAgICBldmVudC5ldmVudFNpZ25hdHVyZSA9IHRoaXMuZnJhZ21lbnQuZm9ybWF0KCk7XG4gICAgICAgIGV2ZW50LmRlY29kZSA9IChkYXRhLCB0b3BpY3MpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVyZmFjZS5kZWNvZGVFdmVudExvZyh0aGlzLmZyYWdtZW50LCBkYXRhLCB0b3BpY3MpO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZlbnQuYXJncyA9IHRoaXMuaW50ZXJmYWNlLmRlY29kZUV2ZW50TG9nKHRoaXMuZnJhZ21lbnQsIGV2ZW50LmRhdGEsIGV2ZW50LnRvcGljcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBldmVudC5hcmdzID0gbnVsbDtcbiAgICAgICAgICAgIGV2ZW50LmRlY29kZUVycm9yID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RW1pdChldmVudCkge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBjaGVja1Jlc3VsdEVycm9ycyhldmVudC5hcmdzKTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yc1swXS5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcmdzID0gKGV2ZW50LmFyZ3MgfHwgW10pLnNsaWNlKCk7XG4gICAgICAgIGFyZ3MucHVzaChldmVudCk7XG4gICAgICAgIHJldHVybiBhcmdzO1xuICAgIH1cbn1cbi8vIEEgV2lsZGFyZCBFdmVudCB3aWxsIGF0dGVtcHQgdG8gcG9wdWxhdGU6XG4vLyAgLSBldmVudCAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBldmVudCBuYW1lXG4vLyAgLSBldmVudFNpZ25hdHVyZSAgIFRoZSBmdWxsIHNpZ25hdHVyZSBvZiB0aGUgZXZlbnRcbi8vICAtIGRlY29kZSAgICAgICAgICAgQSBmdW5jdGlvbiB0byBkZWNvZGUgZGF0YSBhbmQgdG9waWNzXG4vLyAgLSBhcmdzICAgICAgICAgICAgIFRoZSBkZWNvZGVkIGRhdGEgYW5kIHRvcGljc1xuY2xhc3MgV2lsZGNhcmRSdW5uaW5nRXZlbnQgZXh0ZW5kcyBSdW5uaW5nRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGFkZHJlc3MsIGNvbnRyYWN0SW50ZXJmYWNlKSB7XG4gICAgICAgIHN1cGVyKFwiKlwiLCB7IGFkZHJlc3M6IGFkZHJlc3MgfSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYWRkcmVzc1wiLCBhZGRyZXNzKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJpbnRlcmZhY2VcIiwgY29udHJhY3RJbnRlcmZhY2UpO1xuICAgIH1cbiAgICBwcmVwYXJlRXZlbnQoZXZlbnQpIHtcbiAgICAgICAgc3VwZXIucHJlcGFyZUV2ZW50KGV2ZW50KTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMuaW50ZXJmYWNlLnBhcnNlTG9nKGV2ZW50KTtcbiAgICAgICAgICAgIGV2ZW50LmV2ZW50ID0gcGFyc2VkLm5hbWU7XG4gICAgICAgICAgICBldmVudC5ldmVudFNpZ25hdHVyZSA9IHBhcnNlZC5zaWduYXR1cmU7XG4gICAgICAgICAgICBldmVudC5kZWNvZGUgPSAoZGF0YSwgdG9waWNzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJmYWNlLmRlY29kZUV2ZW50TG9nKHBhcnNlZC5ldmVudEZyYWdtZW50LCBkYXRhLCB0b3BpY3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGV2ZW50LmFyZ3MgPSBwYXJzZWQuYXJncztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIE5vIG1hdGNoaW5nIGV2ZW50XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQ29udHJhY3Qge1xuICAgIGNvbnN0cnVjdG9yKGFkZHJlc3NPck5hbWUsIGNvbnRyYWN0SW50ZXJmYWNlLCBzaWduZXJPclByb3ZpZGVyKSB7XG4gICAgICAgIGxvZ2dlci5jaGVja05ldyhuZXcudGFyZ2V0LCBDb250cmFjdCk7XG4gICAgICAgIC8vIEBUT0RPOiBNYXliZSBzdGlsbCBjaGVjayB0aGUgYWRkcmVzc09yTmFtZSBsb29rcyBsaWtlIGEgdmFsaWQgYWRkcmVzcyBvciBuYW1lP1xuICAgICAgICAvL2FkZHJlc3MgPSBnZXRBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImludGVyZmFjZVwiLCBnZXRTdGF0aWMoKG5ldy50YXJnZXQpLCBcImdldEludGVyZmFjZVwiKShjb250cmFjdEludGVyZmFjZSkpO1xuICAgICAgICBpZiAoc2lnbmVyT3JQcm92aWRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInByb3ZpZGVyXCIsIG51bGwpO1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJzaWduZXJcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU2lnbmVyLmlzU2lnbmVyKHNpZ25lck9yUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInByb3ZpZGVyXCIsIHNpZ25lck9yUHJvdmlkZXIucHJvdmlkZXIgfHwgbnVsbCk7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInNpZ25lclwiLCBzaWduZXJPclByb3ZpZGVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQcm92aWRlci5pc1Byb3ZpZGVyKHNpZ25lck9yUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInByb3ZpZGVyXCIsIHNpZ25lck9yUHJvdmlkZXIpO1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJzaWduZXJcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBzaWduZXIgb3IgcHJvdmlkZXJcIiwgXCJzaWduZXJPclByb3ZpZGVyXCIsIHNpZ25lck9yUHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiY2FsbFN0YXRpY1wiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiZXN0aW1hdGVHYXNcIiwge30pO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImZ1bmN0aW9uc1wiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicG9wdWxhdGVUcmFuc2FjdGlvblwiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiZmlsdGVyc1wiLCB7fSk7XG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUZpbHRlcnMgPSB7fTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaW50ZXJmYWNlLmV2ZW50cykuZm9yRWFjaCgoZXZlbnRTaWduYXR1cmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuaW50ZXJmYWNlLmV2ZW50c1tldmVudFNpZ25hdHVyZV07XG4gICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcy5maWx0ZXJzLCBldmVudFNpZ25hdHVyZSwgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljczogdGhpcy5pbnRlcmZhY2UuZW5jb2RlRmlsdGVyVG9waWNzKGV2ZW50LCBhcmdzKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdW5pcXVlRmlsdGVyc1tldmVudC5uYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVGaWx0ZXJzW2V2ZW50Lm5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuaXF1ZUZpbHRlcnNbZXZlbnQubmFtZV0ucHVzaChldmVudFNpZ25hdHVyZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHVuaXF1ZUZpbHRlcnMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJzID0gdW5pcXVlRmlsdGVyc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcy5maWx0ZXJzLCBuYW1lLCB0aGlzLmZpbHRlcnNbZmlsdGVyc1swXV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYER1cGxpY2F0ZSBkZWZpbml0aW9uIG9mICR7bmFtZX0gKCR7ZmlsdGVycy5qb2luKFwiLCBcIil9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX3J1bm5pbmdFdmVudHNcIiwge30pO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl93cmFwcGVkRW1pdHNcIiwge30pO1xuICAgICAgICBpZiAoYWRkcmVzc09yTmFtZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBjb250cmFjdCBhZGRyZXNzIG9yIEVOUyBuYW1lXCIsIFwiYWRkcmVzc09yTmFtZVwiLCBhZGRyZXNzT3JOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImFkZHJlc3NcIiwgYWRkcmVzc09yTmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnByb3ZpZGVyKSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInJlc29sdmVkQWRkcmVzc1wiLCByZXNvbHZlTmFtZSh0aGlzLnByb3ZpZGVyLCBhZGRyZXNzT3JOYW1lKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicmVzb2x2ZWRBZGRyZXNzXCIsIFByb21pc2UucmVzb2x2ZShnZXRBZGRyZXNzKGFkZHJlc3NPck5hbWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBXaXRob3V0IGEgcHJvdmlkZXIsIHdlIGNhbm5vdCB1c2UgRU5TIG5hbWVzXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJwcm92aWRlciBpcyByZXF1aXJlZCB0byB1c2UgRU5TIG5hbWUgYXMgY29udHJhY3QgYWRkcmVzc1wiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwibmV3IENvbnRyYWN0XCJcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmlxdWVOYW1lcyA9IHt9O1xuICAgICAgICBjb25zdCB1bmlxdWVTaWduYXR1cmVzID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaW50ZXJmYWNlLmZ1bmN0aW9ucykuZm9yRWFjaCgoc2lnbmF0dXJlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuaW50ZXJmYWNlLmZ1bmN0aW9uc1tzaWduYXR1cmVdO1xuICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgc2lnbmF0dXJlIGlzIHVuaXF1ZTsgaWYgbm90IHRoZSBBQkkgZ2VuZXJhdGlvbiBoYXNcbiAgICAgICAgICAgIC8vIG5vdCBiZWVuIGNsZWFuZWQgb3IgbWF5IGJlIGluY29ycmVjdGx5IGdlbmVyYXRlZFxuICAgICAgICAgICAgaWYgKHVuaXF1ZVNpZ25hdHVyZXNbc2lnbmF0dXJlXSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBEdXBsaWNhdGUgQUJJIGVudHJ5IGZvciAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVuaXF1ZVNpZ25hdHVyZXNbc2lnbmF0dXJlXSA9IHRydWU7XG4gICAgICAgICAgICAvLyBUcmFjayB1bmlxdWUgbmFtZXM7IHdlIG9ubHkgZXhwb3NlIGJhcmUgbmFtZWQgZnVuY3Rpb25zIGlmIHRoZXlcbiAgICAgICAgICAgIC8vIGFyZSBhbWJpZ3VvdXNcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gZnJhZ21lbnQubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoIXVuaXF1ZU5hbWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZU5hbWVzW25hbWVdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuaXF1ZU5hbWVzW25hbWVdLnB1c2goc2lnbmF0dXJlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzW3NpZ25hdHVyZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIHNpZ25hdHVyZSwgYnVpbGREZWZhdWx0KHRoaXMsIGZyYWdtZW50LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBkbyBub3QgY29sbGFwc2Ugc2ltcGxlIGNhbGxzIG9uIHRoaXMgYnVja2V0LCB3aGljaCBhbGxvd3NcbiAgICAgICAgICAgIC8vIGZyYW1ld29ya3MgdG8gc2FmZWx5IHVzZSB0aGlzIHdpdGhvdXQgaW50cm9zcGVjdGlvbiBhcyB3ZWxsIGFzXG4gICAgICAgICAgICAvLyBhbGxvd3MgZGVjb2RpbmcgZXJyb3IgcmVjb3ZlcnkuXG4gICAgICAgICAgICBpZiAodGhpcy5mdW5jdGlvbnNbc2lnbmF0dXJlXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcy5mdW5jdGlvbnMsIHNpZ25hdHVyZSwgYnVpbGREZWZhdWx0KHRoaXMsIGZyYWdtZW50LCBmYWxzZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FsbFN0YXRpY1tzaWduYXR1cmVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLmNhbGxTdGF0aWMsIHNpZ25hdHVyZSwgYnVpbGRDYWxsKHRoaXMsIGZyYWdtZW50LCB0cnVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5wb3B1bGF0ZVRyYW5zYWN0aW9uW3NpZ25hdHVyZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMucG9wdWxhdGVUcmFuc2FjdGlvbiwgc2lnbmF0dXJlLCBidWlsZFBvcHVsYXRlKHRoaXMsIGZyYWdtZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5lc3RpbWF0ZUdhc1tzaWduYXR1cmVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLmVzdGltYXRlR2FzLCBzaWduYXR1cmUsIGJ1aWxkRXN0aW1hdGUodGhpcywgZnJhZ21lbnQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5rZXlzKHVuaXF1ZU5hbWVzKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAvLyBBbWJpZ3VvdXMgbmFtZXMgdG8gbm90IGdldCBhdHRhY2hlZCBhcyBiYXJlIG5hbWVzXG4gICAgICAgICAgICBjb25zdCBzaWduYXR1cmVzID0gdW5pcXVlTmFtZXNbbmFtZV07XG4gICAgICAgICAgICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gc2lnbmF0dXJlc1swXTtcbiAgICAgICAgICAgIGlmICh0aGlzW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBuYW1lLCB0aGlzW3NpZ25hdHVyZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZnVuY3Rpb25zW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLmZ1bmN0aW9ucywgbmFtZSwgdGhpcy5mdW5jdGlvbnNbc2lnbmF0dXJlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxsU3RhdGljW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLmNhbGxTdGF0aWMsIG5hbWUsIHRoaXMuY2FsbFN0YXRpY1tzaWduYXR1cmVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcHVsYXRlVHJhbnNhY3Rpb25bbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMucG9wdWxhdGVUcmFuc2FjdGlvbiwgbmFtZSwgdGhpcy5wb3B1bGF0ZVRyYW5zYWN0aW9uW3NpZ25hdHVyZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZXN0aW1hdGVHYXNbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMuZXN0aW1hdGVHYXMsIG5hbWUsIHRoaXMuZXN0aW1hdGVHYXNbc2lnbmF0dXJlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q29udHJhY3RBZGRyZXNzKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBnZXRDb250cmFjdEFkZHJlc3ModHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW50ZXJmYWNlKGNvbnRyYWN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmIChJbnRlcmZhY2UuaXNJbnRlcmZhY2UoY29udHJhY3RJbnRlcmZhY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJhY3RJbnRlcmZhY2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmZhY2UoY29udHJhY3RJbnRlcmZhY2UpO1xuICAgIH1cbiAgICAvLyBAVE9ETzogQWxsb3cgdGltZW91dD9cbiAgICBkZXBsb3llZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlcGxveWVkKCk7XG4gICAgfVxuICAgIF9kZXBsb3llZChibG9ja1RhZykge1xuICAgICAgICBpZiAoIXRoaXMuX2RlcGxveWVkUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSBqdXN0IGRlcGxveWVkLCB3ZSBrbm93IHRoZSB0cmFuc2FjdGlvbiB3ZSBzaG91bGQgb2NjdXIgaW5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlcGxveVRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVwbG95ZWRQcm9taXNlID0gdGhpcy5kZXBsb3lUcmFuc2FjdGlvbi53YWl0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQFRPRE86IE9uY2Ugd2UgYWxsb3cgYSB0aW1lb3V0IHRvIGJlIHBhc3NlZCBpbiwgd2Ugd2lsbCB3YWl0XG4gICAgICAgICAgICAgICAgLy8gdXAgdG8gdGhhdCBtYW55IGJsb2NrcyBmb3IgZ2V0Q29kZVxuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcG9sbCBmb3Igb3VyIGNvZGUgdG8gYmUgZGVwbG95ZWRcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXBsb3llZFByb21pc2UgPSB0aGlzLnByb3ZpZGVyLmdldENvZGUodGhpcy5hZGRyZXNzLCBibG9ja1RhZykudGhlbigoY29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gXCIweFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNvbnRyYWN0IG5vdCBkZXBsb3llZFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0QWRkcmVzczogdGhpcy5hZGRyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJnZXREZXBsb3llZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVwbG95ZWRQcm9taXNlO1xuICAgIH1cbiAgICAvLyBAVE9ETzpcbiAgICAvLyBlc3RpbWF0ZUZhbGxiYWNrKG92ZXJyaWRlcz86IFRyYW5zYWN0aW9uUmVxdWVzdCk6IFByb21pc2U8QmlnTnVtYmVyPlxuICAgIC8vIEBUT0RPOlxuICAgIC8vIGVzdGltYXRlRGVwbG95KGJ5dGVjb2RlOiBzdHJpbmcsIC4uLmFyZ3MpOiBQcm9taXNlPEJpZ051bWJlcj5cbiAgICBmYWxsYmFjayhvdmVycmlkZXMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNpZ25lcikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJzZW5kaW5nIGEgdHJhbnNhY3Rpb25zIHJlcXVpcmUgYSBzaWduZXJcIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHsgb3BlcmF0aW9uOiBcInNlbmRUcmFuc2FjdGlvbihmYWxsYmFjaylcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eCA9IHNoYWxsb3dDb3B5KG92ZXJyaWRlcyB8fCB7fSk7XG4gICAgICAgIFtcImZyb21cIiwgXCJ0b1wiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmICh0eFtrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCBvdmVycmlkZSBcIiArIGtleSwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHsgb3BlcmF0aW9uOiBrZXkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0eC50byA9IHRoaXMucmVzb2x2ZWRBZGRyZXNzO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXBsb3llZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmVyLnNlbmRUcmFuc2FjdGlvbih0eCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBSZWNvbm5lY3QgdG8gYSBkaWZmZXJlbnQgc2lnbmVyIG9yIHByb3ZpZGVyXG4gICAgY29ubmVjdChzaWduZXJPclByb3ZpZGVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHNpZ25lck9yUHJvdmlkZXIpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBzaWduZXJPclByb3ZpZGVyID0gbmV3IFZvaWRTaWduZXIoc2lnbmVyT3JQcm92aWRlciwgdGhpcy5wcm92aWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udHJhY3QgPSBuZXcgKHRoaXMuY29uc3RydWN0b3IpKHRoaXMuYWRkcmVzcywgdGhpcy5pbnRlcmZhY2UsIHNpZ25lck9yUHJvdmlkZXIpO1xuICAgICAgICBpZiAodGhpcy5kZXBsb3lUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkoY29udHJhY3QsIFwiZGVwbG95VHJhbnNhY3Rpb25cIiwgdGhpcy5kZXBsb3lUcmFuc2FjdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRyYWN0O1xuICAgIH1cbiAgICAvLyBSZS1hdHRhY2ggdG8gYSBkaWZmZXJlbnQgb24tY2hhaW4gaW5zdGFuY2Ugb2YgdGhpcyBjb250cmFjdFxuICAgIGF0dGFjaChhZGRyZXNzT3JOYW1lKSB7XG4gICAgICAgIHJldHVybiBuZXcgKHRoaXMuY29uc3RydWN0b3IpKGFkZHJlc3NPck5hbWUsIHRoaXMuaW50ZXJmYWNlLCB0aGlzLnNpZ25lciB8fCB0aGlzLnByb3ZpZGVyKTtcbiAgICB9XG4gICAgc3RhdGljIGlzSW5kZXhlZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gSW5kZXhlZC5pc0luZGV4ZWQodmFsdWUpO1xuICAgIH1cbiAgICBfbm9ybWFsaXplUnVubmluZ0V2ZW50KHJ1bm5pbmdFdmVudCkge1xuICAgICAgICAvLyBBbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudCBydW5uaW5nOyB3ZSBjYW4gcmUtdXNlIGl0XG4gICAgICAgIGlmICh0aGlzLl9ydW5uaW5nRXZlbnRzW3J1bm5pbmdFdmVudC50YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcnVubmluZ0V2ZW50c1tydW5uaW5nRXZlbnQudGFnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnVubmluZ0V2ZW50O1xuICAgIH1cbiAgICBfZ2V0UnVubmluZ0V2ZW50KGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIChldmVudE5hbWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIFwiZXJyb3JcIiBldmVudHMgKGlmIHlvdXIgY29udHJhY3QgaGFzIGFuIGVycm9yIGV2ZW50LCBpbmNsdWRlXG4gICAgICAgICAgICAvLyB0aGUgZnVsbCBzaWduYXR1cmUgdG8gYnlwYXNzIHRoaXMgc3BlY2lhbCBldmVudCBrZXl3b3JkKVxuICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZVJ1bm5pbmdFdmVudChuZXcgRXJyb3JSdW5uaW5nRXZlbnQoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIGFueSBldmVudCB0aGF0IGlzIHJlZ2lzdGVyZWRcbiAgICAgICAgICAgIGlmIChldmVudE5hbWUgPT09IFwiZXZlbnRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVSdW5uaW5nRXZlbnQobmV3IFJ1bm5pbmdFdmVudChcImV2ZW50XCIsIG51bGwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgYW55IGV2ZW50XG4gICAgICAgICAgICBpZiAoZXZlbnROYW1lID09PSBcIipcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVSdW5uaW5nRXZlbnQobmV3IFdpbGRjYXJkUnVubmluZ0V2ZW50KHRoaXMuYWRkcmVzcywgdGhpcy5pbnRlcmZhY2UpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZXZlbnQgRnJhZ21lbnQgKHRocm93cyBpZiBhbWJpZ3VvdXMvdW5rbm93biBldmVudClcbiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5pbnRlcmZhY2UuZ2V0RXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVSdW5uaW5nRXZlbnQobmV3IEZyYWdtZW50UnVubmluZ0V2ZW50KHRoaXMuYWRkcmVzcywgdGhpcy5pbnRlcmZhY2UsIGZyYWdtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgaGF2ZSB0b3BpY3MgdG8gZmlsdGVyIGJ5Li4uXG4gICAgICAgIGlmIChldmVudE5hbWUudG9waWNzICYmIGV2ZW50TmFtZS50b3BpY3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSXMgaXQgYSBrbm93biB0b3BpY2hhc2g/ICh0aHJvd3MgaWYgbm8gbWF0Y2hpbmcgdG9waWNoYXNoKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3BpYyA9IGV2ZW50TmFtZS50b3BpY3NbMF07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodG9waWMpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdG9waWNcIik7IC8vIEBUT0RPOiBNYXkgaGFwcGVuIGZvciBhbm9ueW1vdXMgZXZlbnRzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGhpcy5pbnRlcmZhY2UuZ2V0RXZlbnQodG9waWMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3JtYWxpemVSdW5uaW5nRXZlbnQobmV3IEZyYWdtZW50UnVubmluZ0V2ZW50KHRoaXMuYWRkcmVzcywgdGhpcy5pbnRlcmZhY2UsIGZyYWdtZW50LCBldmVudE5hbWUudG9waWNzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IHRoZSB1bmtub3duIHRvcGljaGFzaFxuICAgICAgICAgICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICAgICAgICB0b3BpY3M6IGV2ZW50TmFtZS50b3BpY3NcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplUnVubmluZ0V2ZW50KG5ldyBSdW5uaW5nRXZlbnQoZ2V0RXZlbnRUYWcoZmlsdGVyKSwgZmlsdGVyKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZVJ1bm5pbmdFdmVudChuZXcgV2lsZGNhcmRSdW5uaW5nRXZlbnQodGhpcy5hZGRyZXNzLCB0aGlzLmludGVyZmFjZSkpO1xuICAgIH1cbiAgICBfY2hlY2tSdW5uaW5nRXZlbnRzKHJ1bm5pbmdFdmVudCkge1xuICAgICAgICBpZiAocnVubmluZ0V2ZW50Lmxpc3RlbmVyQ291bnQoKSA9PT0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3J1bm5pbmdFdmVudHNbcnVubmluZ0V2ZW50LnRhZ107XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgcG9sbGVyIGZvciB0aGlzLCByZW1vdmUgaXRcbiAgICAgICAgICAgIGNvbnN0IGVtaXQgPSB0aGlzLl93cmFwcGVkRW1pdHNbcnVubmluZ0V2ZW50LnRhZ107XG4gICAgICAgICAgICBpZiAoZW1pdCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIub2ZmKHJ1bm5pbmdFdmVudC5maWx0ZXIsIGVtaXQpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl93cmFwcGVkRW1pdHNbcnVubmluZ0V2ZW50LnRhZ107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBncmFjZWZ1bGx5IHJlY292ZXJcbiAgICAvLyBmcm9tIHBhcnNlIGVycm9ycyBpZiB0aGV5IHdpc2hcbiAgICBfd3JhcEV2ZW50KHJ1bm5pbmdFdmVudCwgbG9nLCBsaXN0ZW5lcikge1xuICAgICAgICBjb25zdCBldmVudCA9IGRlZXBDb3B5KGxvZyk7XG4gICAgICAgIGV2ZW50LnJlbW92ZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJ1bm5pbmdFdmVudC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICAgICAgICB0aGlzLl9jaGVja1J1bm5pbmdFdmVudHMocnVubmluZ0V2ZW50KTtcbiAgICAgICAgfTtcbiAgICAgICAgZXZlbnQuZ2V0QmxvY2sgPSAoKSA9PiB7IHJldHVybiB0aGlzLnByb3ZpZGVyLmdldEJsb2NrKGxvZy5ibG9ja0hhc2gpOyB9O1xuICAgICAgICBldmVudC5nZXRUcmFuc2FjdGlvbiA9ICgpID0+IHsgcmV0dXJuIHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24obG9nLnRyYW5zYWN0aW9uSGFzaCk7IH07XG4gICAgICAgIGV2ZW50LmdldFRyYW5zYWN0aW9uUmVjZWlwdCA9ICgpID0+IHsgcmV0dXJuIHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KGxvZy50cmFuc2FjdGlvbkhhc2gpOyB9O1xuICAgICAgICAvLyBUaGlzIG1heSB0aHJvdyBpZiB0aGUgdG9waWNzIGFuZCBkYXRhIG1pc21hdGNoIHRoZSBzaWduYXR1cmVcbiAgICAgICAgcnVubmluZ0V2ZW50LnByZXBhcmVFdmVudChldmVudCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gICAgX2FkZEV2ZW50TGlzdGVuZXIocnVubmluZ0V2ZW50LCBsaXN0ZW5lciwgb25jZSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiZXZlbnRzIHJlcXVpcmUgYSBwcm92aWRlciBvciBhIHNpZ25lciB3aXRoIGEgcHJvdmlkZXJcIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHsgb3BlcmF0aW9uOiBcIm9uY2VcIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBydW5uaW5nRXZlbnQuYWRkTGlzdGVuZXIobGlzdGVuZXIsIG9uY2UpO1xuICAgICAgICAvLyBUcmFjayB0aGlzIHJ1bm5pbmcgZXZlbnQgYW5kIGl0cyBsaXN0ZW5lcnMgKG1heSBhbHJlYWR5IGJlIHRoZXJlOyBidXQgbm8gaGFyZCBpbiB1cGRhdGluZylcbiAgICAgICAgdGhpcy5fcnVubmluZ0V2ZW50c1tydW5uaW5nRXZlbnQudGFnXSA9IHJ1bm5pbmdFdmVudDtcbiAgICAgICAgLy8gSWYgd2UgYXJlIG5vdCBwb2xsaW5nIHRoZSBwcm92aWRlciwgc3RhcnQgcG9sbGluZ1xuICAgICAgICBpZiAoIXRoaXMuX3dyYXBwZWRFbWl0c1tydW5uaW5nRXZlbnQudGFnXSkge1xuICAgICAgICAgICAgY29uc3Qgd3JhcHBlZEVtaXQgPSAobG9nKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGV2ZW50ID0gdGhpcy5fd3JhcEV2ZW50KHJ1bm5pbmdFdmVudCwgbG9nLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGVtaXQgdGhlIHJlc3VsdCBmb3IgdGhlIHBhcmFtZXRlcml6ZWQgZXZlbnQuLi5cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVjb2RlRXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHJ1bm5pbmdFdmVudC5nZXRFbWl0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdChydW5uaW5nRXZlbnQuZmlsdGVyLCAuLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmRlY29kZUVycm9yID0gZXJyb3IuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWx3YXlzIGVtaXQgXCJldmVudFwiIGZvciBmcmFnbWVudC1iYXNlIGV2ZW50c1xuICAgICAgICAgICAgICAgIGlmIChydW5uaW5nRXZlbnQuZmlsdGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXZlbnRcIiwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBFbWl0IFwiZXJyb3JcIiBpZiB0aGVyZSB3YXMgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGVjb2RlRXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJlcnJvclwiLCBldmVudC5kZWNvZGVFcnJvciwgZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl93cmFwcGVkRW1pdHNbcnVubmluZ0V2ZW50LnRhZ10gPSB3cmFwcGVkRW1pdDtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgZXZlbnRzLCBsaWtlIFwiZXJyb3JcIiBkbyBub3QgaGF2ZSBhIGZpbHRlclxuICAgICAgICAgICAgaWYgKHJ1bm5pbmdFdmVudC5maWx0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIub24ocnVubmluZ0V2ZW50LmZpbHRlciwgd3JhcHBlZEVtaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXJ5RmlsdGVyKGV2ZW50LCBmcm9tQmxvY2tPckJsb2NraGFzaCwgdG9CbG9jaykge1xuICAgICAgICBjb25zdCBydW5uaW5nRXZlbnQgPSB0aGlzLl9nZXRSdW5uaW5nRXZlbnQoZXZlbnQpO1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBzaGFsbG93Q29weShydW5uaW5nRXZlbnQuZmlsdGVyKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoZnJvbUJsb2NrT3JCbG9ja2hhc2gpID09PSBcInN0cmluZ1wiICYmIGlzSGV4U3RyaW5nKGZyb21CbG9ja09yQmxvY2toYXNoLCAzMikpIHtcbiAgICAgICAgICAgIGlmICh0b0Jsb2NrICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiY2Fubm90IHNwZWNpZnkgdG9CbG9jayB3aXRoIGJsb2NraGFzaFwiLCBcInRvQmxvY2tcIiwgdG9CbG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWx0ZXIuYmxvY2tIYXNoID0gZnJvbUJsb2NrT3JCbG9ja2hhc2g7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWx0ZXIuZnJvbUJsb2NrID0gKChmcm9tQmxvY2tPckJsb2NraGFzaCAhPSBudWxsKSA/IGZyb21CbG9ja09yQmxvY2toYXNoIDogMCk7XG4gICAgICAgICAgICBmaWx0ZXIudG9CbG9jayA9ICgodG9CbG9jayAhPSBudWxsKSA/IHRvQmxvY2sgOiBcImxhdGVzdFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5nZXRMb2dzKGZpbHRlcikudGhlbigobG9ncykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ3MubWFwKChsb2cpID0+IHRoaXMuX3dyYXBFdmVudChydW5uaW5nRXZlbnQsIGxvZywgbnVsbCkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgb24oZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIodGhpcy5fZ2V0UnVubmluZ0V2ZW50KGV2ZW50KSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIodGhpcy5fZ2V0UnVubmluZ0V2ZW50KGV2ZW50KSwgbGlzdGVuZXIsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVubmluZ0V2ZW50ID0gdGhpcy5fZ2V0UnVubmluZ0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChydW5uaW5nRXZlbnQucnVuKGFyZ3MpID4gMCk7XG4gICAgICAgIC8vIE1heSBoYXZlIGRyYWluZWQgYWxsIHRoZSBcIm9uY2VcIiBldmVudHM7IGNoZWNrIGZvciBsaXZpbmcgZXZlbnRzXG4gICAgICAgIHRoaXMuX2NoZWNrUnVubmluZ0V2ZW50cyhydW5uaW5nRXZlbnQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsaXN0ZW5lckNvdW50KGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX3J1bm5pbmdFdmVudHMpLnJlZHVjZSgoYWNjdW0sIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bSArIHRoaXMuX3J1bm5pbmdFdmVudHNba2V5XS5saXN0ZW5lckNvdW50KCk7XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UnVubmluZ0V2ZW50KGV2ZW50TmFtZSkubGlzdGVuZXJDb3VudCgpO1xuICAgIH1cbiAgICBsaXN0ZW5lcnMoZXZlbnROYW1lKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0YWcgaW4gdGhpcy5fcnVubmluZ0V2ZW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3J1bm5pbmdFdmVudHNbdGFnXS5saXN0ZW5lcnMoKS5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRSdW5uaW5nRXZlbnQoZXZlbnROYW1lKS5saXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMucHJvdmlkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgaW4gdGhpcy5fcnVubmluZ0V2ZW50cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bm5pbmdFdmVudCA9IHRoaXMuX3J1bm5pbmdFdmVudHNbdGFnXTtcbiAgICAgICAgICAgICAgICBydW5uaW5nRXZlbnQucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tSdW5uaW5nRXZlbnRzKHJ1bm5pbmdFdmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxldGUgYW55IGxpc3RlbmVyc1xuICAgICAgICBjb25zdCBydW5uaW5nRXZlbnQgPSB0aGlzLl9nZXRSdW5uaW5nRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgICAgcnVubmluZ0V2ZW50LnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgICB0aGlzLl9jaGVja1J1bm5pbmdFdmVudHMocnVubmluZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9mZihldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5wcm92aWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVubmluZ0V2ZW50ID0gdGhpcy5fZ2V0UnVubmluZ0V2ZW50KGV2ZW50TmFtZSk7XG4gICAgICAgIHJ1bm5pbmdFdmVudC5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuX2NoZWNrUnVubmluZ0V2ZW50cyhydW5uaW5nRXZlbnQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5vZmYoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIENvbnRyYWN0RmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IoY29udHJhY3RJbnRlcmZhY2UsIGJ5dGVjb2RlLCBzaWduZXIpIHtcbiAgICAgICAgbGV0IGJ5dGVjb2RlSGV4ID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiAoYnl0ZWNvZGUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBieXRlY29kZUhleCA9IGJ5dGVjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQnl0ZXMoYnl0ZWNvZGUpKSB7XG4gICAgICAgICAgICBieXRlY29kZUhleCA9IGhleGxpZnkoYnl0ZWNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGJ5dGVjb2RlICYmIHR5cGVvZiAoYnl0ZWNvZGUub2JqZWN0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gQWxsb3cgdGhlIGJ5dGVjb2RlIG9iamVjdCBmcm9tIHRoZSBTb2xpZGl0eSBjb21waWxlclxuICAgICAgICAgICAgYnl0ZWNvZGVIZXggPSBieXRlY29kZS5vYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBDcmFzaCBpbiB0aGUgbmV4dCB2ZXJpZmljYXRpb24gc3RlcFxuICAgICAgICAgICAgYnl0ZWNvZGVIZXggPSBcIiFcIjtcbiAgICAgICAgfVxuICAgICAgICAvLyBNYWtlIHN1cmUgaXQgaXMgMHggcHJlZml4ZWRcbiAgICAgICAgaWYgKGJ5dGVjb2RlSGV4LnN1YnN0cmluZygwLCAyKSAhPT0gXCIweFwiKSB7XG4gICAgICAgICAgICBieXRlY29kZUhleCA9IFwiMHhcIiArIGJ5dGVjb2RlSGV4O1xuICAgICAgICB9XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmluYWwgcmVzdWx0IGlzIHZhbGlkIGJ5dGVjb2RlXG4gICAgICAgIGlmICghaXNIZXhTdHJpbmcoYnl0ZWNvZGVIZXgpIHx8IChieXRlY29kZUhleC5sZW5ndGggJSAyKSkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYnl0ZWNvZGVcIiwgXCJieXRlY29kZVwiLCBieXRlY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHNpZ25lciwgbWFrZSBzdXJlIGl0IGlzIHZhbGlkXG4gICAgICAgIGlmIChzaWduZXIgJiYgIVNpZ25lci5pc1NpZ25lcihzaWduZXIpKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBzaWduZXJcIiwgXCJzaWduZXJcIiwgc2lnbmVyKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImJ5dGVjb2RlXCIsIGJ5dGVjb2RlSGV4KTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJpbnRlcmZhY2VcIiwgZ2V0U3RhdGljKChuZXcudGFyZ2V0KSwgXCJnZXRJbnRlcmZhY2VcIikoY29udHJhY3RJbnRlcmZhY2UpKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJzaWduZXJcIiwgc2lnbmVyIHx8IG51bGwpO1xuICAgIH1cbiAgICAvLyBAVE9ETzogRnV0dXJlOyByZW5hbWUgdG8gcG9wdWx0ZVRyYW5zYWN0aW9uP1xuICAgIGdldERlcGxveVRyYW5zYWN0aW9uKC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHR4ID0ge307XG4gICAgICAgIC8vIElmIHdlIGhhdmUgMSBhZGRpdGlvbmFsIGFyZ3VtZW50LCB3ZSBhbGxvdyB0cmFuc2FjdGlvbiBvdmVycmlkZXNcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSB0aGlzLmludGVyZmFjZS5kZXBsb3kuaW5wdXRzLmxlbmd0aCArIDEgJiYgdHlwZW9mIChhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICB0eCA9IHNoYWxsb3dDb3B5KGFyZ3MucG9wKCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdHgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRUcmFuc2FjdGlvbktleXNba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIHRyYW5zYWN0aW9uIG92ZXJyaWRlIFwiICsga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRG8gbm90IGFsbG93IHRoZXNlIHRvIGJlIG92ZXJyaWRkZW4gaW4gYSBkZXBsb3ltZW50IHRyYW5zYWN0aW9uXG4gICAgICAgIFtcImRhdGFcIiwgXCJmcm9tXCIsIFwidG9cIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodHhba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJjYW5ub3Qgb3ZlcnJpZGUgXCIgKyBrZXksIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7IG9wZXJhdGlvbjoga2V5IH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjYWxsIG1hdGNoZXMgdGhlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZVxuICAgICAgICBsb2dnZXIuY2hlY2tBcmd1bWVudENvdW50KGFyZ3MubGVuZ3RoLCB0aGlzLmludGVyZmFjZS5kZXBsb3kuaW5wdXRzLmxlbmd0aCwgXCIgaW4gQ29udHJhY3QgY29uc3RydWN0b3JcIik7XG4gICAgICAgIC8vIFNldCB0aGUgZGF0YSB0byB0aGUgYnl0ZWNvZGUgKyB0aGUgZW5jb2RlZCBjb25zdHJ1Y3RvciBhcmd1bWVudHNcbiAgICAgICAgdHguZGF0YSA9IGhleGxpZnkoY29uY2F0KFtcbiAgICAgICAgICAgIHRoaXMuYnl0ZWNvZGUsXG4gICAgICAgICAgICB0aGlzLmludGVyZmFjZS5lbmNvZGVEZXBsb3koYXJncylcbiAgICAgICAgXSkpO1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIGRlcGxveSguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBsZXQgb3ZlcnJpZGVzID0ge307XG4gICAgICAgICAgICAvLyBJZiAxIGV4dHJhIHBhcmFtZXRlciB3YXMgcGFzc2VkIGluLCBpdCBjb250YWlucyBvdmVycmlkZXNcbiAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gdGhpcy5pbnRlcmZhY2UuZGVwbG95LmlucHV0cy5sZW5ndGggKyAxKSB7XG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVzID0gYXJncy5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2FsbCBtYXRjaGVzIHRoZSBjb25zdHJ1Y3RvciBzaWduYXR1cmVcbiAgICAgICAgICAgIGxvZ2dlci5jaGVja0FyZ3VtZW50Q291bnQoYXJncy5sZW5ndGgsIHRoaXMuaW50ZXJmYWNlLmRlcGxveS5pbnB1dHMubGVuZ3RoLCBcIiBpbiBDb250cmFjdCBjb25zdHJ1Y3RvclwiKTtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgRU5TIG5hbWVzIGFuZCBwcm9taXNlcyBpbiB0aGUgYXJndW1lbnRzXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB5aWVsZCByZXNvbHZlQWRkcmVzc2VzKHRoaXMuc2lnbmVyLCBhcmdzLCB0aGlzLmludGVyZmFjZS5kZXBsb3kuaW5wdXRzKTtcbiAgICAgICAgICAgIHBhcmFtcy5wdXNoKG92ZXJyaWRlcyk7XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGRlcGxveW1lbnQgdHJhbnNhY3Rpb24gKHdpdGggb3B0aW9uYWwgb3ZlcnJpZGVzKVxuICAgICAgICAgICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuZ2V0RGVwbG95VHJhbnNhY3Rpb24oLi4ucGFyYW1zKTtcbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIGRlcGxveW1lbnQgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IHR4ID0geWllbGQgdGhpcy5zaWduZXIuc2VuZFRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGdldFN0YXRpYyh0aGlzLmNvbnN0cnVjdG9yLCBcImdldENvbnRyYWN0QWRkcmVzc1wiKSh0eCk7XG4gICAgICAgICAgICBjb25zdCBjb250cmFjdCA9IGdldFN0YXRpYyh0aGlzLmNvbnN0cnVjdG9yLCBcImdldENvbnRyYWN0XCIpKGFkZHJlc3MsIHRoaXMuaW50ZXJmYWNlLCB0aGlzLnNpZ25lcik7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seShjb250cmFjdCwgXCJkZXBsb3lUcmFuc2FjdGlvblwiLCB0eCk7XG4gICAgICAgICAgICByZXR1cm4gY29udHJhY3Q7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhdHRhY2goYWRkcmVzcykge1xuICAgICAgICByZXR1cm4gKHRoaXMuY29uc3RydWN0b3IpLmdldENvbnRyYWN0KGFkZHJlc3MsIHRoaXMuaW50ZXJmYWNlLCB0aGlzLnNpZ25lcik7XG4gICAgfVxuICAgIGNvbm5lY3Qoc2lnbmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgKHRoaXMuY29uc3RydWN0b3IpKHRoaXMuaW50ZXJmYWNlLCB0aGlzLmJ5dGVjb2RlLCBzaWduZXIpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVNvbGlkaXR5KGNvbXBpbGVyT3V0cHV0LCBzaWduZXIpIHtcbiAgICAgICAgaWYgKGNvbXBpbGVyT3V0cHV0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwibWlzc2luZyBjb21waWxlciBvdXRwdXRcIiwgTG9nZ2VyLmVycm9ycy5NSVNTSU5HX0FSR1VNRU5ULCB7IGFyZ3VtZW50OiBcImNvbXBpbGVyT3V0cHV0XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoY29tcGlsZXJPdXRwdXQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBjb21waWxlck91dHB1dCA9IEpTT04ucGFyc2UoY29tcGlsZXJPdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFiaSA9IGNvbXBpbGVyT3V0cHV0LmFiaTtcbiAgICAgICAgbGV0IGJ5dGVjb2RlID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbXBpbGVyT3V0cHV0LmJ5dGVjb2RlKSB7XG4gICAgICAgICAgICBieXRlY29kZSA9IGNvbXBpbGVyT3V0cHV0LmJ5dGVjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbXBpbGVyT3V0cHV0LmV2bSAmJiBjb21waWxlck91dHB1dC5ldm0uYnl0ZWNvZGUpIHtcbiAgICAgICAgICAgIGJ5dGVjb2RlID0gY29tcGlsZXJPdXRwdXQuZXZtLmJ5dGVjb2RlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgdGhpcyhhYmksIGJ5dGVjb2RlLCBzaWduZXIpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0SW50ZXJmYWNlKGNvbnRyYWN0SW50ZXJmYWNlKSB7XG4gICAgICAgIHJldHVybiBDb250cmFjdC5nZXRJbnRlcmZhY2UoY29udHJhY3RJbnRlcmZhY2UpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q29udHJhY3RBZGRyZXNzKHR4KSB7XG4gICAgICAgIHJldHVybiBnZXRDb250cmFjdEFkZHJlc3ModHgpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0Q29udHJhY3QoYWRkcmVzcywgY29udHJhY3RJbnRlcmZhY2UsIHNpZ25lcikge1xuICAgICAgICByZXR1cm4gbmV3IENvbnRyYWN0KGFkZHJlc3MsIGNvbnRyYWN0SW50ZXJmYWNlLCBzaWduZXIpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJoYXNoLzUuMC4xMVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGlkKHRleHQpIHtcbiAgICByZXR1cm4ga2VjY2FrMjU2KHRvVXRmOEJ5dGVzKHRleHQpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWlkLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgaWQgfSBmcm9tIFwiLi9pZFwiO1xuaW1wb3J0IHsgaXNWYWxpZE5hbWUsIG5hbWVoYXNoIH0gZnJvbSBcIi4vbmFtZWhhc2hcIjtcbmltcG9ydCB7IGhhc2hNZXNzYWdlLCBtZXNzYWdlUHJlZml4IH0gZnJvbSBcIi4vbWVzc2FnZVwiO1xuaW1wb3J0IHsgVHlwZWREYXRhRW5jb2RlciBhcyBfVHlwZWREYXRhRW5jb2RlciB9IGZyb20gXCIuL3R5cGVkLWRhdGFcIjtcbmV4cG9ydCB7IGlkLCBuYW1laGFzaCwgaXNWYWxpZE5hbWUsIG1lc3NhZ2VQcmVmaXgsIGhhc2hNZXNzYWdlLCBfVHlwZWREYXRhRW5jb2RlciwgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGNvbmNhdCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuZXhwb3J0IGNvbnN0IG1lc3NhZ2VQcmVmaXggPSBcIlxceDE5RXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6XFxuXCI7XG5leHBvcnQgZnVuY3Rpb24gaGFzaE1lc3NhZ2UobWVzc2FnZSkge1xuICAgIGlmICh0eXBlb2YgKG1lc3NhZ2UpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0b1V0ZjhCeXRlcyhtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGtlY2NhazI1Nihjb25jYXQoW1xuICAgICAgICB0b1V0ZjhCeXRlcyhtZXNzYWdlUHJlZml4KSxcbiAgICAgICAgdG9VdGY4Qnl0ZXMoU3RyaW5nKG1lc3NhZ2UubGVuZ3RoKSksXG4gICAgICAgIG1lc3NhZ2VcbiAgICBdKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlLmpzLm1hcCIsImltcG9ydCB7IGNvbmNhdCwgaGV4bGlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgbmFtZXByZXAsIHRvVXRmOEJ5dGVzIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3N0cmluZ3NcIjtcbmltcG9ydCB7IGtlY2NhazI1NiB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9rZWNjYWsyNTZcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmNvbnN0IFplcm9zID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xuWmVyb3MuZmlsbCgwKTtcbmNvbnN0IFBhcnRpdGlvbiA9IG5ldyBSZWdFeHAoXCJeKCguKilcXFxcLik/KFteLl0rKSRcIik7XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE5hbWUobmFtZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbXBzID0gbmFtZS5zcGxpdChcIi5cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChuYW1lcHJlcChjb21wc1tpXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW1wdHlcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5hbWVoYXNoKG5hbWUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAodHlwZW9mIChuYW1lKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBhZGRyZXNzIC0gXCIgKyBTdHJpbmcobmFtZSksIFwibmFtZVwiLCBuYW1lKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IFplcm9zO1xuICAgIHdoaWxlIChuYW1lLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBwYXJ0aXRpb24gPSBuYW1lLm1hdGNoKFBhcnRpdGlvbik7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdG9VdGY4Qnl0ZXMobmFtZXByZXAocGFydGl0aW9uWzNdKSk7XG4gICAgICAgIHJlc3VsdCA9IGtlY2NhazI1Nihjb25jYXQoW3Jlc3VsdCwga2VjY2FrMjU2KGxhYmVsKV0pKTtcbiAgICAgICAgbmFtZSA9IHBhcnRpdGlvblsyXSB8fCBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gaGV4bGlmeShyZXN1bHQpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bmFtZWhhc2guanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBnZXRBZGRyZXNzIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2FkZHJlc3NcIjtcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBoZXhDb25jYXQsIGhleGxpZnksIGhleFZhbHVlLCBoZXhaZXJvUGFkLCBpc0hleFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgZGVlcENvcHksIGRlZmluZVJlYWRPbmx5LCBzaGFsbG93Q29weSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBpZCB9IGZyb20gXCIuL2lkXCI7XG5jb25zdCBwYWRkaW5nID0gbmV3IFVpbnQ4QXJyYXkoMzIpO1xucGFkZGluZy5maWxsKDApO1xuY29uc3QgTmVnYXRpdmVPbmUgPSBCaWdOdW1iZXIuZnJvbSgtMSk7XG5jb25zdCBaZXJvID0gQmlnTnVtYmVyLmZyb20oMCk7XG5jb25zdCBPbmUgPSBCaWdOdW1iZXIuZnJvbSgxKTtcbmNvbnN0IE1heFVpbnQyNTYgPSBCaWdOdW1iZXIuZnJvbShcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlwiKTtcbmZ1bmN0aW9uIGhleFBhZFJpZ2h0KHZhbHVlKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBhcnJheWlmeSh2YWx1ZSk7XG4gICAgY29uc3QgcGFkT2Zmc2V0ID0gYnl0ZXMubGVuZ3RoICUgMzI7XG4gICAgaWYgKHBhZE9mZnNldCkge1xuICAgICAgICByZXR1cm4gaGV4Q29uY2F0KFtieXRlcywgcGFkZGluZy5zbGljZShwYWRPZmZzZXQpXSk7XG4gICAgfVxuICAgIHJldHVybiBoZXhsaWZ5KGJ5dGVzKTtcbn1cbmNvbnN0IGhleFRydWUgPSBoZXhaZXJvUGFkKE9uZS50b0hleFN0cmluZygpLCAzMik7XG5jb25zdCBoZXhGYWxzZSA9IGhleFplcm9QYWQoWmVyby50b0hleFN0cmluZygpLCAzMik7XG5jb25zdCBkb21haW5GaWVsZFR5cGVzID0ge1xuICAgIG5hbWU6IFwic3RyaW5nXCIsXG4gICAgdmVyc2lvbjogXCJzdHJpbmdcIixcbiAgICBjaGFpbklkOiBcInVpbnQyNTZcIixcbiAgICB2ZXJpZnlpbmdDb250cmFjdDogXCJhZGRyZXNzXCIsXG4gICAgc2FsdDogXCJieXRlczMyXCJcbn07XG5jb25zdCBkb21haW5GaWVsZE5hbWVzID0gW1xuICAgIFwibmFtZVwiLCBcInZlcnNpb25cIiwgXCJjaGFpbklkXCIsIFwidmVyaWZ5aW5nQ29udHJhY3RcIiwgXCJzYWx0XCJcbl07XG5mdW5jdGlvbiBjaGVja1N0cmluZyhrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgaW52YWxpZCBkb21haW4gdmFsdWUgZm9yICR7SlNPTi5zdHJpbmdpZnkoa2V5KX1gLCBgZG9tYWluLiR7a2V5fWAsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbn1cbmNvbnN0IGRvbWFpbkNoZWNrcyA9IHtcbiAgICBuYW1lOiBjaGVja1N0cmluZyhcIm5hbWVcIiksXG4gICAgdmVyc2lvbjogY2hlY2tTdHJpbmcoXCJ2ZXJzaW9uXCIpLFxuICAgIGNoYWluSWQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ051bWJlci5mcm9tKHZhbHVlKS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBpbnZhbGlkIGRvbWFpbiB2YWx1ZSBmb3IgXCJjaGFpbklkXCJgLCBcImRvbWFpbi5jaGFpbklkXCIsIHZhbHVlKTtcbiAgICB9LFxuICAgIHZlcmlmeWluZ0NvbnRyYWN0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBZGRyZXNzKHZhbHVlKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBpbnZhbGlkIGRvbWFpbiB2YWx1ZSBcInZlcmlmeWluZ0NvbnRyYWN0XCJgLCBcImRvbWFpbi52ZXJpZnlpbmdDb250cmFjdFwiLCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzYWx0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gYXJyYXlpZnkodmFsdWUpO1xuICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgbGVuZ3RoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhleGxpZnkoYnl0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBpbnZhbGlkIGRvbWFpbiB2YWx1ZSBcInNhbHRcImAsIFwiZG9tYWluLnNhbHRcIiwgdmFsdWUpO1xuICAgIH1cbn07XG5mdW5jdGlvbiBnZXRCYXNlRW5jb2Rlcih0eXBlKSB7XG4gICAgLy8gaW50WFggYW5kIHVpbnRYWFxuICAgIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0eXBlLm1hdGNoKC9eKHU/KWludChcXGQqKSQvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBzaWduZWQgPSAobWF0Y2hbMV0gPT09IFwiXCIpO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBwYXJzZUludChtYXRjaFsyXSB8fCBcIjI1NlwiKTtcbiAgICAgICAgICAgIGlmICh3aWR0aCAlIDggIT09IDAgfHwgd2lkdGggPiAyNTYgfHwgKG1hdGNoWzJdICYmIG1hdGNoWzJdICE9PSBTdHJpbmcod2lkdGgpKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIG51bWVyaWMgd2lkdGhcIiwgXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYm91bmRzVXBwZXIgPSBNYXhVaW50MjU2Lm1hc2soc2lnbmVkID8gKHdpZHRoIC0gMSkgOiB3aWR0aCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHNMb3dlciA9IHNpZ25lZCA/IGJvdW5kc1VwcGVyLmFkZChPbmUpLm11bChOZWdhdGl2ZU9uZSkgOiBaZXJvO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBCaWdOdW1iZXIuZnJvbSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHYubHQoYm91bmRzTG93ZXIpIHx8IHYuZ3QoYm91bmRzVXBwZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoYHZhbHVlIG91dC1vZi1ib3VuZHMgZm9yICR7dHlwZX1gLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhleFplcm9QYWQodi50b1R3b3MoMjU2KS50b0hleFN0cmluZygpLCAzMik7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJ5dGVzWFhcbiAgICB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdHlwZS5tYXRjaCgvXmJ5dGVzKFxcZCspJC8pO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICAgICAgaWYgKHdpZHRoID09PSAwIHx8IHdpZHRoID4gMzIgfHwgbWF0Y2hbMV0gIT09IFN0cmluZyh3aWR0aCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBieXRlcyB3aWR0aFwiLCBcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBhcnJheWlmeSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgaW52YWxpZCBsZW5ndGggZm9yICR7dHlwZX1gLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGhleFBhZFJpZ2h0KHZhbHVlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6IHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBoZXhaZXJvUGFkKGdldEFkZHJlc3ModmFsdWUpLCAzMik7XG4gICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJib29sXCI6IHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKCF2YWx1ZSkgPyBoZXhGYWxzZSA6IGhleFRydWUpO1xuICAgICAgICB9O1xuICAgICAgICBjYXNlIFwiYnl0ZXNcIjogcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtlY2NhazI1Nih2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjogcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlkKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBlbmNvZGVUeXBlKG5hbWUsIGZpZWxkcykge1xuICAgIHJldHVybiBgJHtuYW1lfSgke2ZpZWxkcy5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiAodHlwZSArIFwiIFwiICsgbmFtZSkpLmpvaW4oXCIsXCIpfSlgO1xufVxuZXhwb3J0IGNsYXNzIFR5cGVkRGF0YUVuY29kZXIge1xuICAgIGNvbnN0cnVjdG9yKHR5cGVzKSB7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwidHlwZXNcIiwgT2JqZWN0LmZyZWV6ZShkZWVwQ29weSh0eXBlcykpKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfZW5jb2RlckNhY2hlXCIsIHt9KTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfdHlwZXNcIiwge30pO1xuICAgICAgICAvLyBMaW5rIHN0cnVjdCB0eXBlcyB0byB0aGVpciBkaXJlY3QgY2hpbGQgc3RydWN0c1xuICAgICAgICBjb25zdCBsaW5rcyA9IHt9O1xuICAgICAgICAvLyBMaW5rIHN0cnVjdHMgdG8gc3RydWN0cyB3aGljaCBjb250YWluIHRoZW0gYXMgYSBjaGlsZFxuICAgICAgICBjb25zdCBwYXJlbnRzID0ge307XG4gICAgICAgIC8vIExpbmsgYWxsIHN1YnR5cGVzIHdpdGhpbiBhIGdpdmVuIHN0cnVjdFxuICAgICAgICBjb25zdCBzdWJ0eXBlcyA9IHt9O1xuICAgICAgICBPYmplY3Qua2V5cyh0eXBlcykuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICAgICAgbGlua3NbdHlwZV0gPSB7fTtcbiAgICAgICAgICAgIHBhcmVudHNbdHlwZV0gPSBbXTtcbiAgICAgICAgICAgIHN1YnR5cGVzW3R5cGVdID0ge307XG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gdHlwZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZU5hbWVzID0ge307XG4gICAgICAgICAgICB0eXBlc1tuYW1lXS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGVhY2ggZmllbGQgaGFzIGEgdW5pcXVlIG5hbWVcbiAgICAgICAgICAgICAgICBpZiAodW5pcXVlTmFtZXNbZmllbGQubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgZHVwbGljYXRlIHZhcmlhYmxlIG5hbWUgJHtKU09OLnN0cmluZ2lmeShmaWVsZC5uYW1lKX0gaW4gJHtKU09OLnN0cmluZ2lmeShuYW1lKX1gLCBcInR5cGVzXCIsIHR5cGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdW5pcXVlTmFtZXNbZmllbGQubmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYmFzZSB0eXBlIChkcm9wIGFueSBhcnJheSBzcGVjaWZpZXJzKVxuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VUeXBlID0gZmllbGQudHlwZS5tYXRjaCgvXihbXlxceDViXSopKFxceDVifCQpLylbMV07XG4gICAgICAgICAgICAgICAgaWYgKGJhc2VUeXBlID09PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoYGNpcmN1bGFyIHR5cGUgcmVmZXJlbmNlIHRvICR7SlNPTi5zdHJpbmdpZnkoYmFzZVR5cGUpfWAsIFwidHlwZXNcIiwgdHlwZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGEgYmFzZSBlbmNvZGluZyB0eXBlP1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBnZXRCYXNlRW5jb2RlcihiYXNlVHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudHNbYmFzZVR5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoYHVua25vd24gdHlwZSAke0pTT04uc3RyaW5naWZ5KGJhc2VUeXBlKX1gLCBcInR5cGVzXCIsIHR5cGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIGxpbmthZ2VcbiAgICAgICAgICAgICAgICBwYXJlbnRzW2Jhc2VUeXBlXS5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgICAgIGxpbmtzW25hbWVdW2Jhc2VUeXBlXSA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWR1Y2UgdGhlIHByaW1hcnkgdHlwZVxuICAgICAgICBjb25zdCBwcmltYXJ5VHlwZXMgPSBPYmplY3Qua2V5cyhwYXJlbnRzKS5maWx0ZXIoKG4pID0+IChwYXJlbnRzW25dLmxlbmd0aCA9PT0gMCkpO1xuICAgICAgICBpZiAocHJpbWFyeVR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcIm1pc3NpbmcgcHJpbWFyeSB0eXBlXCIsIFwidHlwZXNcIiwgdHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHByaW1hcnlUeXBlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBhbWJpZ3VvdXMgcHJpbWFyeSB0eXBlcyBvciB1bnVzZWQgdHlwZXM6ICR7cHJpbWFyeVR5cGVzLm1hcCgodCkgPT4gKEpTT04uc3RyaW5naWZ5KHQpKSkuam9pbihcIiwgXCIpfWAsIFwidHlwZXNcIiwgdHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHJpbWFyeVR5cGVcIiwgcHJpbWFyeVR5cGVzWzBdKTtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHR5cGUgcmVmZXJlbmNlc1xuICAgICAgICBmdW5jdGlvbiBjaGVja0NpcmN1bGFyKHR5cGUsIGZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoZm91bmRbdHlwZV0pIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBjaXJjdWxhciB0eXBlIHJlZmVyZW5jZSB0byAke0pTT04uc3RyaW5naWZ5KHR5cGUpfWAsIFwidHlwZXNcIiwgdHlwZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm91bmRbdHlwZV0gPSB0cnVlO1xuICAgICAgICAgICAgT2JqZWN0LmtleXMobGlua3NbdHlwZV0pLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRzW2NoaWxkXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgY2hlY2tDaXJjdWxhcihjaGlsZCwgZm91bmQpO1xuICAgICAgICAgICAgICAgIC8vIE1hcmsgYWxsIGFuY2VzdG9ycyBhcyBoYXZpbmcgdGhpcyBkZWNlbmRhbnRcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb3VuZCkuZm9yRWFjaCgoc3VidHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlc1tzdWJ0eXBlXVtjaGlsZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWxldGUgZm91bmRbdHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgY2hlY2tDaXJjdWxhcih0aGlzLnByaW1hcnlUeXBlLCB7fSk7XG4gICAgICAgIC8vIENvbXB1dGUgZWFjaCBmdWxseSBkZXNjcmliZSB0eXBlXG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBzdWJ0eXBlcykge1xuICAgICAgICAgICAgY29uc3Qgc3QgPSBPYmplY3Qua2V5cyhzdWJ0eXBlc1tuYW1lXSk7XG4gICAgICAgICAgICBzdC5zb3J0KCk7XG4gICAgICAgICAgICB0aGlzLl90eXBlc1tuYW1lXSA9IGVuY29kZVR5cGUobmFtZSwgdHlwZXNbbmFtZV0pICsgc3QubWFwKCh0KSA9PiBlbmNvZGVUeXBlKHQsIHR5cGVzW3RdKSkuam9pbihcIlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRFbmNvZGVyKHR5cGUpIHtcbiAgICAgICAgbGV0IGVuY29kZXIgPSB0aGlzLl9lbmNvZGVyQ2FjaGVbdHlwZV07XG4gICAgICAgIGlmICghZW5jb2Rlcikge1xuICAgICAgICAgICAgZW5jb2RlciA9IHRoaXMuX2VuY29kZXJDYWNoZVt0eXBlXSA9IHRoaXMuX2dldEVuY29kZXIodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVuY29kZXI7XG4gICAgfVxuICAgIF9nZXRFbmNvZGVyKHR5cGUpIHtcbiAgICAgICAgLy8gQmFzaWMgZW5jb2RlciB0eXBlIChhZGRyZXNzLCBib29sLCB1aW50MjU2LCBldGMpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBnZXRCYXNlRW5jb2Rlcih0eXBlKTtcbiAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXlcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0eXBlLm1hdGNoKC9eKC4qKShcXHg1YihcXGQqKVxceDVkKSQvKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJ0eXBlID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBjb25zdCBzdWJFbmNvZGVyID0gdGhpcy5nZXRFbmNvZGVyKHN1YnR5cGUpO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQobWF0Y2hbM10pO1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gMCAmJiB2YWx1ZS5sZW5ndGggIT09IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiYXJyYXkgbGVuZ3RoIG1pc21hdGNoOyBleHBlY3RlZCBsZW5ndGggJHsgYXJyYXlMZW5ndGggfVwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHZhbHVlLm1hcChzdWJFbmNvZGVyKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdHlwZXNbc3VidHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChrZWNjYWsyNTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ga2VjY2FrMjU2KGhleENvbmNhdChyZXN1bHQpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RydWN0XG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMudHlwZXNbdHlwZV07XG4gICAgICAgIGlmIChmaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGVuY29kZWRUeXBlID0gaWQodGhpcy5fdHlwZXNbdHlwZV0pO1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGZpZWxkcy5tYXAoKHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0RW5jb2Rlcih0eXBlKSh2YWx1ZVtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90eXBlc1t0eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtlY2NhazI1NihyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnVuc2hpZnQoZW5jb2RlZFR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBoZXhDb25jYXQodmFsdWVzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoYHVua25vd24gdHlwZTogJHt0eXBlfWAsIFwidHlwZVwiLCB0eXBlKTtcbiAgICB9XG4gICAgZW5jb2RlVHlwZShuYW1lKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3R5cGVzW25hbWVdO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgdW5rbm93biB0eXBlOiAke0pTT04uc3RyaW5naWZ5KG5hbWUpfWAsIFwibmFtZVwiLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBlbmNvZGVEYXRhKHR5cGUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVuY29kZXIodHlwZSkodmFsdWUpO1xuICAgIH1cbiAgICBoYXNoU3RydWN0KG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBrZWNjYWsyNTYodGhpcy5lbmNvZGVEYXRhKG5hbWUsIHZhbHVlKSk7XG4gICAgfVxuICAgIGVuY29kZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGVEYXRhKHRoaXMucHJpbWFyeVR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgaGFzaCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNoU3RydWN0KHRoaXMucHJpbWFyeVR5cGUsIHZhbHVlKTtcbiAgICB9XG4gICAgX3Zpc2l0KHR5cGUsIHZhbHVlLCBjYWxsYmFjaykge1xuICAgICAgICAvLyBCYXNpYyBlbmNvZGVyIHR5cGUgKGFkZHJlc3MsIGJvb2wsIHVpbnQyNTYsIGV0YylcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGdldEJhc2VFbmNvZGVyKHR5cGUpO1xuICAgICAgICAgICAgaWYgKGVuY29kZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodHlwZSwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdHlwZS5tYXRjaCgvXiguKikoXFx4NWIoXFxkKilcXHg1ZCkkLyk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgY29uc3Qgc3VidHlwZSA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQobWF0Y2hbM10pO1xuICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSAwICYmIHZhbHVlLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImFycmF5IGxlbmd0aCBtaXNtYXRjaDsgZXhwZWN0ZWQgbGVuZ3RoICR7IGFycmF5TGVuZ3RoIH1cIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PiB0aGlzLl92aXNpdChzdWJ0eXBlLCB2LCBjYWxsYmFjaykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0cnVjdFxuICAgICAgICBjb25zdCBmaWVsZHMgPSB0aGlzLnR5cGVzW3R5cGVdO1xuICAgICAgICBpZiAoZmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm4gZmllbGRzLnJlZHVjZSgoYWNjdW0sIHsgbmFtZSwgdHlwZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgYWNjdW1bbmFtZV0gPSB0aGlzLl92aXNpdCh0eXBlLCB2YWx1ZVtuYW1lXSwgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgdW5rbm93biB0eXBlOiAke3R5cGV9YCwgXCJ0eXBlXCIsIHR5cGUpO1xuICAgIH1cbiAgICB2aXNpdCh2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0KHRoaXMucHJpbWFyeVR5cGUsIHZhbHVlLCBjYWxsYmFjayk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHlwZWREYXRhRW5jb2Rlcih0eXBlcyk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRQcmltYXJ5VHlwZSh0eXBlcykge1xuICAgICAgICByZXR1cm4gVHlwZWREYXRhRW5jb2Rlci5mcm9tKHR5cGVzKS5wcmltYXJ5VHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGhhc2hTdHJ1Y3QobmFtZSwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBUeXBlZERhdGFFbmNvZGVyLmZyb20odHlwZXMpLmhhc2hTdHJ1Y3QobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBzdGF0aWMgaGFzaERvbWFpbihkb21haW4pIHtcbiAgICAgICAgY29uc3QgZG9tYWluRmllbGRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBkb21haW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBkb21haW5GaWVsZFR5cGVzW25hbWVdO1xuICAgICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgaW52YWxpZCB0eXBlZC1kYXRhIGRvbWFpbiBrZXk6ICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9YCwgXCJkb21haW5cIiwgZG9tYWluKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbWFpbkZpZWxkcy5wdXNoKHsgbmFtZSwgdHlwZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBkb21haW5GaWVsZHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRvbWFpbkZpZWxkTmFtZXMuaW5kZXhPZihhLm5hbWUpIC0gZG9tYWluRmllbGROYW1lcy5pbmRleE9mKGIubmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gVHlwZWREYXRhRW5jb2Rlci5oYXNoU3RydWN0KFwiRUlQNzEyRG9tYWluXCIsIHsgRUlQNzEyRG9tYWluOiBkb21haW5GaWVsZHMgfSwgZG9tYWluKTtcbiAgICB9XG4gICAgc3RhdGljIGVuY29kZShkb21haW4sIHR5cGVzLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaGV4Q29uY2F0KFtcbiAgICAgICAgICAgIFwiMHgxOTAxXCIsXG4gICAgICAgICAgICBUeXBlZERhdGFFbmNvZGVyLmhhc2hEb21haW4oZG9tYWluKSxcbiAgICAgICAgICAgIFR5cGVkRGF0YUVuY29kZXIuZnJvbSh0eXBlcykuaGFzaCh2YWx1ZSlcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHN0YXRpYyBoYXNoKGRvbWFpbiwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBrZWNjYWsyNTYoVHlwZWREYXRhRW5jb2Rlci5lbmNvZGUoZG9tYWluLCB0eXBlcywgdmFsdWUpKTtcbiAgICB9XG4gICAgLy8gUmVwbGFjZXMgYWxsIGFkZHJlc3MgdHlwZXMgd2l0aCBFTlMgbmFtZXMgd2l0aCB0aGVpciBsb29rZWQgdXAgYWRkcmVzc1xuICAgIHN0YXRpYyByZXNvbHZlTmFtZXMoZG9tYWluLCB0eXBlcywgdmFsdWUsIHJlc29sdmVOYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAvLyBNYWtlIGEgY29weSB0byBpc29sYXRlIGl0IGZyb20gdGhlIG9iamVjdCBwYXNzZWQgaW5cbiAgICAgICAgICAgIGRvbWFpbiA9IHNoYWxsb3dDb3B5KGRvbWFpbik7XG4gICAgICAgICAgICAvLyBMb29rIHVwIGFsbCBFTlMgbmFtZXNcbiAgICAgICAgICAgIGNvbnN0IGVuc0NhY2hlID0ge307XG4gICAgICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIGxvb2sgdXAgdGhlIGRvbWFpbidzIHZlcmlmeWluZ0NvbnRyYWN0P1xuICAgICAgICAgICAgaWYgKGRvbWFpbi52ZXJpZnlpbmdDb250cmFjdCAmJiAhaXNIZXhTdHJpbmcoZG9tYWluLnZlcmlmeWluZ0NvbnRyYWN0LCAyMCkpIHtcbiAgICAgICAgICAgICAgICBlbnNDYWNoZVtkb21haW4udmVyaWZ5aW5nQ29udHJhY3RdID0gXCIweFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgZW5jb2RlciB0byB2aXNpdCBhbGwgdGhlIGJhc2UgdmFsdWVzXG4gICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gVHlwZWREYXRhRW5jb2Rlci5mcm9tKHR5cGVzKTtcbiAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBhZGRyZXNzZXNcbiAgICAgICAgICAgIGVuY29kZXIudmlzaXQodmFsdWUsICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImFkZHJlc3NcIiAmJiAhaXNIZXhTdHJpbmcodmFsdWUsIDIwKSkge1xuICAgICAgICAgICAgICAgICAgICBlbnNDYWNoZVt2YWx1ZV0gPSBcIjB4XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gTG9va3VwIGVhY2ggbmFtZVxuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGVuc0NhY2hlKSB7XG4gICAgICAgICAgICAgICAgZW5zQ2FjaGVbbmFtZV0gPSB5aWVsZCByZXNvbHZlTmFtZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIGRvbWFpbiB2ZXJpZnlpbmdDb250cmFjdCBpZiBuZWVkZWRcbiAgICAgICAgICAgIGlmIChkb21haW4udmVyaWZ5aW5nQ29udHJhY3QgJiYgZW5zQ2FjaGVbZG9tYWluLnZlcmlmeWluZ0NvbnRyYWN0XSkge1xuICAgICAgICAgICAgICAgIGRvbWFpbi52ZXJpZnlpbmdDb250cmFjdCA9IGVuc0NhY2hlW2RvbWFpbi52ZXJpZnlpbmdDb250cmFjdF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCBFTlMgbmFtZXMgd2l0aCB0aGVpciBhZGRyZXNzXG4gICAgICAgICAgICB2YWx1ZSA9IGVuY29kZXIudmlzaXQodmFsdWUsICh0eXBlLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcImFkZHJlc3NcIiAmJiBlbnNDYWNoZVt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuc0NhY2hlW3ZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4geyBkb21haW4sIHZhbHVlIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0UGF5bG9hZChkb21haW4sIHR5cGVzLCB2YWx1ZSkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZG9tYWluIGZpZWxkc1xuICAgICAgICBUeXBlZERhdGFFbmNvZGVyLmhhc2hEb21haW4oZG9tYWluKTtcbiAgICAgICAgLy8gRGVyaXZlIHRoZSBFSVA3MTJEb21haW4gU3RydWN0IHJlZmVyZW5jZSB0eXBlXG4gICAgICAgIGNvbnN0IGRvbWFpblZhbHVlcyA9IHt9O1xuICAgICAgICBjb25zdCBkb21haW5UeXBlcyA9IFtdO1xuICAgICAgICBkb21haW5GaWVsZE5hbWVzLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZG9tYWluW25hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkb21haW5WYWx1ZXNbbmFtZV0gPSBkb21haW5DaGVja3NbbmFtZV0odmFsdWUpO1xuICAgICAgICAgICAgZG9tYWluVHlwZXMucHVzaCh7IG5hbWUsIHR5cGU6IGRvbWFpbkZpZWxkVHlwZXNbbmFtZV0gfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gVHlwZWREYXRhRW5jb2Rlci5mcm9tKHR5cGVzKTtcbiAgICAgICAgY29uc3QgdHlwZXNXaXRoRG9tYWluID0gc2hhbGxvd0NvcHkodHlwZXMpO1xuICAgICAgICBpZiAodHlwZXNXaXRoRG9tYWluLkVJUDcxMkRvbWFpbikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInR5cGVzIG11c3Qgbm90IGNvbnRhaW4gRUlQNzEyRG9tYWluIHR5cGVcIiwgXCJ0eXBlcy5FSVA3MTJEb21haW5cIiwgdHlwZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdHlwZXNXaXRoRG9tYWluLkVJUDcxMkRvbWFpbiA9IGRvbWFpblR5cGVzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhIHN0cnVjdHVyZXMgYW5kIHR5cGVzXG4gICAgICAgIGVuY29kZXIuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGVzOiB0eXBlc1dpdGhEb21haW4sXG4gICAgICAgICAgICBkb21haW46IGRvbWFpblZhbHVlcyxcbiAgICAgICAgICAgIHByaW1hcnlUeXBlOiBlbmNvZGVyLnByaW1hcnlUeXBlLFxuICAgICAgICAgICAgbWVzc2FnZTogZW5jb2Rlci52aXNpdCh2YWx1ZSwgKHR5cGUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYnl0ZXNcbiAgICAgICAgICAgICAgICBpZiAodHlwZS5tYXRjaCgvXmJ5dGVzKFxcZCopLykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhleGxpZnkoYXJyYXlpZnkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdWludCBvciBpbnRcbiAgICAgICAgICAgICAgICBpZiAodHlwZS5tYXRjaCgvXnU/aW50LykpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZWZpeCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gQmlnTnVtYmVyLmZyb20odmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodi5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiLVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYubXVsKC0xKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4ICsgaGV4VmFsdWUodi50b0hleFN0cmluZygpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJvb2xcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBpbnZhbGlkIHN0cmluZ2AsIFwidmFsdWVcIiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInVuc3VwcG9ydGVkIHR5cGVcIiwgXCJ0eXBlXCIsIHR5cGUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlZC1kYXRhLmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJoZG5vZGUvNS4wLjlcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgQmFzZTU4IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2Jhc2V4XCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgY29uY2F0LCBoZXhEYXRhU2xpY2UsIGhleFplcm9QYWQsIGhleGxpZnkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IHRvVXRmOEJ5dGVzLCBVbmljb2RlTm9ybWFsaXphdGlvbkZvcm0gfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgcGJrZGYyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Bia2RmMlwiO1xuaW1wb3J0IHsgZGVmaW5lUmVhZE9ubHkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgU2lnbmluZ0tleSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9zaWduaW5nLWtleVwiO1xuaW1wb3J0IHsgY29tcHV0ZUhtYWMsIHJpcGVtZDE2MCwgc2hhMjU2LCBTdXBwb3J0ZWRBbGdvcml0aG0gfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc2hhMlwiO1xuaW1wb3J0IHsgY29tcHV0ZUFkZHJlc3MgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvdHJhbnNhY3Rpb25zXCI7XG5pbXBvcnQgeyB3b3JkbGlzdHMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvd29yZGxpc3RzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5jb25zdCBOID0gQmlnTnVtYmVyLmZyb20oXCIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlYmFhZWRjZTZhZjQ4YTAzYmJmZDI1ZThjZDAzNjQxNDFcIik7XG4vLyBcIkJpdGNvaW4gc2VlZFwiXG5jb25zdCBNYXN0ZXJTZWNyZXQgPSB0b1V0ZjhCeXRlcyhcIkJpdGNvaW4gc2VlZFwiKTtcbmNvbnN0IEhhcmRlbmVkQml0ID0gMHg4MDAwMDAwMDtcbi8vIFJldHVybnMgYSBieXRlIHdpdGggdGhlIE1TQiBiaXRzIHNldFxuZnVuY3Rpb24gZ2V0VXBwZXJNYXNrKGJpdHMpIHtcbiAgICByZXR1cm4gKCgxIDw8IGJpdHMpIC0gMSkgPDwgKDggLSBiaXRzKTtcbn1cbi8vIFJldHVybnMgYSBieXRlIHdpdGggdGhlIExTQiBiaXRzIHNldFxuZnVuY3Rpb24gZ2V0TG93ZXJNYXNrKGJpdHMpIHtcbiAgICByZXR1cm4gKDEgPDwgYml0cykgLSAxO1xufVxuZnVuY3Rpb24gYnl0ZXMzMih2YWx1ZSkge1xuICAgIHJldHVybiBoZXhaZXJvUGFkKGhleGxpZnkodmFsdWUpLCAzMik7XG59XG5mdW5jdGlvbiBiYXNlNThjaGVjayhkYXRhKSB7XG4gICAgcmV0dXJuIEJhc2U1OC5lbmNvZGUoY29uY2F0KFtkYXRhLCBoZXhEYXRhU2xpY2Uoc2hhMjU2KHNoYTI1NihkYXRhKSksIDAsIDQpXSkpO1xufVxuZnVuY3Rpb24gZ2V0V29yZGxpc3Qod29yZGxpc3QpIHtcbiAgICBpZiAod29yZGxpc3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gd29yZGxpc3RzW1wiZW5cIl07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHdvcmRsaXN0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCB3b3JkcyA9IHdvcmRsaXN0c1t3b3JkbGlzdF07XG4gICAgICAgIGlmICh3b3JkcyA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5rbm93biBsb2NhbGVcIiwgXCJ3b3JkbGlzdFwiLCB3b3JkbGlzdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdvcmRzO1xuICAgIH1cbiAgICByZXR1cm4gd29yZGxpc3Q7XG59XG5jb25zdCBfY29uc3RydWN0b3JHdWFyZCA9IHt9O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRQYXRoID0gXCJtLzQ0Jy82MCcvMCcvMC8wXCI7XG47XG5leHBvcnQgY2xhc3MgSEROb2RlIHtcbiAgICAvKipcbiAgICAgKiAgVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cbiAgICAgKlxuICAgICAqICBQbGVhc2UgdXNlOlxuICAgICAqICAgLSBmcm9tTW5lbW9uaWNcbiAgICAgKiAgIC0gZnJvbVNlZWRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvckd1YXJkLCBwcml2YXRlS2V5LCBwdWJsaWNLZXksIHBhcmVudEZpbmdlcnByaW50LCBjaGFpbkNvZGUsIGluZGV4LCBkZXB0aCwgbW5lbW9uaWNPclBhdGgpIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIEhETm9kZSk7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgICAgICBpZiAoY29uc3RydWN0b3JHdWFyZCAhPT0gX2NvbnN0cnVjdG9yR3VhcmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkhETm9kZSBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGRpcmVjdGx5XCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcml2YXRlS2V5KSB7XG4gICAgICAgICAgICBjb25zdCBzaWduaW5nS2V5ID0gbmV3IFNpZ25pbmdLZXkocHJpdmF0ZUtleSk7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInByaXZhdGVLZXlcIiwgc2lnbmluZ0tleS5wcml2YXRlS2V5KTtcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHVibGljS2V5XCIsIHNpZ25pbmdLZXkuY29tcHJlc3NlZFB1YmxpY0tleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInByaXZhdGVLZXlcIiwgbnVsbCk7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInB1YmxpY0tleVwiLCBoZXhsaWZ5KHB1YmxpY0tleSkpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicGFyZW50RmluZ2VycHJpbnRcIiwgcGFyZW50RmluZ2VycHJpbnQpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImZpbmdlcnByaW50XCIsIGhleERhdGFTbGljZShyaXBlbWQxNjAoc2hhMjU2KHRoaXMucHVibGljS2V5KSksIDAsIDQpKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJhZGRyZXNzXCIsIGNvbXB1dGVBZGRyZXNzKHRoaXMucHVibGljS2V5KSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiY2hhaW5Db2RlXCIsIGNoYWluQ29kZSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiaW5kZXhcIiwgaW5kZXgpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImRlcHRoXCIsIGRlcHRoKTtcbiAgICAgICAgaWYgKG1uZW1vbmljT3JQYXRoID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEZyb20gYSBzb3VyY2UgdGhhdCBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUgcGF0aCAoZS5nLiBleHRlbmRlZCBrZXlzKVxuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJtbmVtb25pY1wiLCBudWxsKTtcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicGF0aFwiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgKG1uZW1vbmljT3JQYXRoKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgLy8gRnJvbSBhIHNvdXJjZSB0aGF0IGRvZXMgbm90IHByZXNlcnZlIHRoZSBtbmVtb25pYyAoZS5nLiBuZXV0ZXJlZClcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwibW5lbW9uaWNcIiwgbnVsbCk7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcInBhdGhcIiwgbW5lbW9uaWNPclBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRnJvbSBhIGZ1bGx5IHF1YWxpZmllZCBzb3VyY2VcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwibW5lbW9uaWNcIiwgbW5lbW9uaWNPclBhdGgpO1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJwYXRoXCIsIG1uZW1vbmljT3JQYXRoLnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBleHRlbmRlZEtleSgpIHtcbiAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IHRoZSBtYWlubmV0IHZhbHVlcyBmb3Igbm93LCBidXQgaWYgYW55b25lIG5lZWRzXG4gICAgICAgIC8vIHRlc3RuZXQgdmFsdWVzLCBsZXQgbWUga25vdy4gSSBiZWxpZXZlIGN1cnJlbnQgc2VuaXRtZW50IGlzIHRoYXRcbiAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyB1c2UgbWFpbm5ldCwgYW5kIHVzZSBCSVAtNDQgdG8gZGVyaXZlIHRoZSBuZXR3b3JrXG4gICAgICAgIC8vICAgLSBNYWlubmV0OiBwdWJsaWM9MHgwNDg4QjIxRSwgcHJpdmF0ZT0weDA0ODhBREU0XG4gICAgICAgIC8vICAgLSBUZXN0bmV0OiBwdWJsaWM9MHgwNDM1ODdDRiwgcHJpdmF0ZT0weDA0MzU4Mzk0XG4gICAgICAgIGlmICh0aGlzLmRlcHRoID49IDI1Nikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVwdGggdG9vIGxhcmdlIVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmFzZTU4Y2hlY2soY29uY2F0KFtcbiAgICAgICAgICAgICgodGhpcy5wcml2YXRlS2V5ICE9IG51bGwpID8gXCIweDA0ODhBREU0XCIgOiBcIjB4MDQ4OEIyMUVcIiksXG4gICAgICAgICAgICBoZXhsaWZ5KHRoaXMuZGVwdGgpLFxuICAgICAgICAgICAgdGhpcy5wYXJlbnRGaW5nZXJwcmludCxcbiAgICAgICAgICAgIGhleFplcm9QYWQoaGV4bGlmeSh0aGlzLmluZGV4KSwgNCksXG4gICAgICAgICAgICB0aGlzLmNoYWluQ29kZSxcbiAgICAgICAgICAgICgodGhpcy5wcml2YXRlS2V5ICE9IG51bGwpID8gY29uY2F0KFtcIjB4MDBcIiwgdGhpcy5wcml2YXRlS2V5XSkgOiB0aGlzLnB1YmxpY0tleSksXG4gICAgICAgIF0pKTtcbiAgICB9XG4gICAgbmV1dGVyKCkge1xuICAgICAgICByZXR1cm4gbmV3IEhETm9kZShfY29uc3RydWN0b3JHdWFyZCwgbnVsbCwgdGhpcy5wdWJsaWNLZXksIHRoaXMucGFyZW50RmluZ2VycHJpbnQsIHRoaXMuY2hhaW5Db2RlLCB0aGlzLmluZGV4LCB0aGlzLmRlcHRoLCB0aGlzLnBhdGgpO1xuICAgIH1cbiAgICBfZGVyaXZlKGluZGV4KSB7XG4gICAgICAgIGlmIChpbmRleCA+IDB4ZmZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgaW5kZXggLSBcIiArIFN0cmluZyhpbmRleCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJhc2UgcGF0aFxuICAgICAgICBsZXQgcGF0aCA9IHRoaXMucGF0aDtcbiAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgIHBhdGggKz0gXCIvXCIgKyAoaW5kZXggJiB+SGFyZGVuZWRCaXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSgzNyk7XG4gICAgICAgIGlmIChpbmRleCAmIEhhcmRlbmVkQml0KSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucHJpdmF0ZUtleSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImNhbm5vdCBkZXJpdmUgY2hpbGQgb2YgbmV1dGVyZWQgbm9kZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERhdGEgPSAweDAwIHx8IHNlcl8yNTYoa19wYXIpXG4gICAgICAgICAgICBkYXRhLnNldChhcnJheWlmeSh0aGlzLnByaXZhdGVLZXkpLCAxKTtcbiAgICAgICAgICAgIC8vIEhhcmRlbmVkIHBhdGhcbiAgICAgICAgICAgIGlmIChwYXRoKSB7XG4gICAgICAgICAgICAgICAgcGF0aCArPSBcIidcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIERhdGEgPSBzZXJfcChwb2ludChrX3BhcikpXG4gICAgICAgICAgICBkYXRhLnNldChhcnJheWlmeSh0aGlzLnB1YmxpY0tleSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERhdGEgKz0gc2VyXzMyKGkpXG4gICAgICAgIGZvciAobGV0IGkgPSAyNDsgaSA+PSAwOyBpIC09IDgpIHtcbiAgICAgICAgICAgIGRhdGFbMzMgKyAoaSA+PiAzKV0gPSAoKGluZGV4ID4+ICgyNCAtIGkpKSAmIDB4ZmYpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IEkgPSBhcnJheWlmeShjb21wdXRlSG1hYyhTdXBwb3J0ZWRBbGdvcml0aG0uc2hhNTEyLCB0aGlzLmNoYWluQ29kZSwgZGF0YSkpO1xuICAgICAgICBjb25zdCBJTCA9IEkuc2xpY2UoMCwgMzIpO1xuICAgICAgICBjb25zdCBJUiA9IEkuc2xpY2UoMzIpO1xuICAgICAgICAvLyBUaGUgcHJpdmF0ZSBrZXlcbiAgICAgICAgbGV0IGtpID0gbnVsbDtcbiAgICAgICAgLy8gVGhlIHB1YmxpYyBrZXlcbiAgICAgICAgbGV0IEtpID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucHJpdmF0ZUtleSkge1xuICAgICAgICAgICAga2kgPSBieXRlczMyKEJpZ051bWJlci5mcm9tKElMKS5hZGQodGhpcy5wcml2YXRlS2V5KS5tb2QoTikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWsgPSBuZXcgU2lnbmluZ0tleShoZXhsaWZ5KElMKSk7XG4gICAgICAgICAgICBLaSA9IGVrLl9hZGRQb2ludCh0aGlzLnB1YmxpY0tleSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG1uZW1vbmljT3JQYXRoID0gcGF0aDtcbiAgICAgICAgY29uc3Qgc3JjTW5lbW9uaWMgPSB0aGlzLm1uZW1vbmljO1xuICAgICAgICBpZiAoc3JjTW5lbW9uaWMpIHtcbiAgICAgICAgICAgIG1uZW1vbmljT3JQYXRoID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgICAgICAgcGhyYXNlOiBzcmNNbmVtb25pYy5waHJhc2UsXG4gICAgICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgICAgICBsb2NhbGU6IChzcmNNbmVtb25pYy5sb2NhbGUgfHwgXCJlblwiKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBIRE5vZGUoX2NvbnN0cnVjdG9yR3VhcmQsIGtpLCBLaSwgdGhpcy5maW5nZXJwcmludCwgYnl0ZXMzMihJUiksIGluZGV4LCB0aGlzLmRlcHRoICsgMSwgbW5lbW9uaWNPclBhdGgpO1xuICAgIH1cbiAgICBkZXJpdmVQYXRoKHBhdGgpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuICAgICAgICBpZiAoY29tcG9uZW50cy5sZW5ndGggPT09IDAgfHwgKGNvbXBvbmVudHNbMF0gPT09IFwibVwiICYmIHRoaXMuZGVwdGggIT09IDApKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHBhdGggLSBcIiArIHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wb25lbnRzWzBdID09PSBcIm1cIikge1xuICAgICAgICAgICAgY29tcG9uZW50cy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNbaV07XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hdGNoKC9eWzAtOV0rJyQvKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoY29tcG9uZW50LnN1YnN0cmluZygwLCBjb21wb25lbnQubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBIYXJkZW5lZEJpdCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHBhdGggaW5kZXggLSBcIiArIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5fZGVyaXZlKEhhcmRlbmVkQml0ICsgaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50Lm1hdGNoKC9eWzAtOV0rJC8pKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBIYXJkZW5lZEJpdCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHBhdGggaW5kZXggLSBcIiArIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5fZGVyaXZlKGluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcGF0aCBjb21wb25lbnQgLSBcIiArIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgc3RhdGljIF9mcm9tU2VlZChzZWVkLCBtbmVtb25pYykge1xuICAgICAgICBjb25zdCBzZWVkQXJyYXkgPSBhcnJheWlmeShzZWVkKTtcbiAgICAgICAgaWYgKHNlZWRBcnJheS5sZW5ndGggPCAxNiB8fCBzZWVkQXJyYXkubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2VlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBJID0gYXJyYXlpZnkoY29tcHV0ZUhtYWMoU3VwcG9ydGVkQWxnb3JpdGhtLnNoYTUxMiwgTWFzdGVyU2VjcmV0LCBzZWVkQXJyYXkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIRE5vZGUoX2NvbnN0cnVjdG9yR3VhcmQsIGJ5dGVzMzIoSS5zbGljZSgwLCAzMikpLCBudWxsLCBcIjB4MDAwMDAwMDBcIiwgYnl0ZXMzMihJLnNsaWNlKDMyKSksIDAsIDAsIG1uZW1vbmljKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21NbmVtb25pYyhtbmVtb25pYywgcGFzc3dvcmQsIHdvcmRsaXN0KSB7XG4gICAgICAgIC8vIElmIGEgbG9jYWxlIG5hbWUgd2FzIHBhc3NlZCBpbiwgZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JkbGlzdFxuICAgICAgICB3b3JkbGlzdCA9IGdldFdvcmRsaXN0KHdvcmRsaXN0KTtcbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBjYXNlIGFuZCBzcGFjaW5nIGluIHRoZSBtbmVtb25pYyAodGhyb3dzIGlmIHRoZSBtbmVtb25pYyBpcyBpbnZhbGlkKVxuICAgICAgICBtbmVtb25pYyA9IGVudHJvcHlUb01uZW1vbmljKG1uZW1vbmljVG9FbnRyb3B5KG1uZW1vbmljLCB3b3JkbGlzdCksIHdvcmRsaXN0KTtcbiAgICAgICAgcmV0dXJuIEhETm9kZS5fZnJvbVNlZWQobW5lbW9uaWNUb1NlZWQobW5lbW9uaWMsIHBhc3N3b3JkKSwge1xuICAgICAgICAgICAgcGhyYXNlOiBtbmVtb25pYyxcbiAgICAgICAgICAgIHBhdGg6IFwibVwiLFxuICAgICAgICAgICAgbG9jYWxlOiB3b3JkbGlzdC5sb2NhbGVcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tU2VlZChzZWVkKSB7XG4gICAgICAgIHJldHVybiBIRE5vZGUuX2Zyb21TZWVkKHNlZWQsIG51bGwpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUV4dGVuZGVkS2V5KGV4dGVuZGVkS2V5KSB7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gQmFzZTU4LmRlY29kZShleHRlbmRlZEtleSk7XG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggIT09IDgyIHx8IGJhc2U1OGNoZWNrKGJ5dGVzLnNsaWNlKDAsIDc4KSkgIT09IGV4dGVuZGVkS2V5KSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBleHRlbmRlZCBrZXlcIiwgXCJleHRlbmRlZEtleVwiLCBcIltSRURBQ1RFRF1cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVwdGggPSBieXRlc1s0XTtcbiAgICAgICAgY29uc3QgcGFyZW50RmluZ2VycHJpbnQgPSBoZXhsaWZ5KGJ5dGVzLnNsaWNlKDUsIDkpKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChoZXhsaWZ5KGJ5dGVzLnNsaWNlKDksIDEzKSkuc3Vic3RyaW5nKDIpLCAxNik7XG4gICAgICAgIGNvbnN0IGNoYWluQ29kZSA9IGhleGxpZnkoYnl0ZXMuc2xpY2UoMTMsIDQ1KSk7XG4gICAgICAgIGNvbnN0IGtleSA9IGJ5dGVzLnNsaWNlKDQ1LCA3OCk7XG4gICAgICAgIHN3aXRjaCAoaGV4bGlmeShieXRlcy5zbGljZSgwLCA0KSkpIHtcbiAgICAgICAgICAgIC8vIFB1YmxpYyBLZXlcbiAgICAgICAgICAgIGNhc2UgXCIweDA0ODhiMjFlXCI6XG4gICAgICAgICAgICBjYXNlIFwiMHgwNDM1ODdjZlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSEROb2RlKF9jb25zdHJ1Y3Rvckd1YXJkLCBudWxsLCBoZXhsaWZ5KGtleSksIHBhcmVudEZpbmdlcnByaW50LCBjaGFpbkNvZGUsIGluZGV4LCBkZXB0aCwgbnVsbCk7XG4gICAgICAgICAgICAvLyBQcml2YXRlIEtleVxuICAgICAgICAgICAgY2FzZSBcIjB4MDQ4OGFkZTRcIjpcbiAgICAgICAgICAgIGNhc2UgXCIweDA0MzU4Mzk0IFwiOlxuICAgICAgICAgICAgICAgIGlmIChrZXlbMF0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSEROb2RlKF9jb25zdHJ1Y3Rvckd1YXJkLCBoZXhsaWZ5KGtleS5zbGljZSgxKSksIG51bGwsIHBhcmVudEZpbmdlcnByaW50LCBjaGFpbkNvZGUsIGluZGV4LCBkZXB0aCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGV4dGVuZGVkIGtleVwiLCBcImV4dGVuZGVkS2V5XCIsIFwiW1JFREFDVEVEXVwiKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gbW5lbW9uaWNUb1NlZWQobW5lbW9uaWMsIHBhc3N3b3JkKSB7XG4gICAgaWYgKCFwYXNzd29yZCkge1xuICAgICAgICBwYXNzd29yZCA9IFwiXCI7XG4gICAgfVxuICAgIGNvbnN0IHNhbHQgPSB0b1V0ZjhCeXRlcyhcIm1uZW1vbmljXCIgKyBwYXNzd29yZCwgVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtLk5GS0QpO1xuICAgIHJldHVybiBwYmtkZjIodG9VdGY4Qnl0ZXMobW5lbW9uaWMsIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybS5ORktEKSwgc2FsdCwgMjA0OCwgNjQsIFwic2hhNTEyXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1uZW1vbmljVG9FbnRyb3B5KG1uZW1vbmljLCB3b3JkbGlzdCkge1xuICAgIHdvcmRsaXN0ID0gZ2V0V29yZGxpc3Qod29yZGxpc3QpO1xuICAgIGxvZ2dlci5jaGVja05vcm1hbGl6ZSgpO1xuICAgIGNvbnN0IHdvcmRzID0gd29yZGxpc3Quc3BsaXQobW5lbW9uaWMpO1xuICAgIGlmICgod29yZHMubGVuZ3RoICUgMykgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBtbmVtb25pY1wiKTtcbiAgICB9XG4gICAgY29uc3QgZW50cm9weSA9IGFycmF5aWZ5KG5ldyBVaW50OEFycmF5KE1hdGguY2VpbCgxMSAqIHdvcmRzLmxlbmd0aCAvIDgpKSk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaW5kZXggPSB3b3JkbGlzdC5nZXRXb3JkSW5kZXgod29yZHNbaV0ubm9ybWFsaXplKFwiTkZLRFwiKSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgbW5lbW9uaWNcIik7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgYml0ID0gMDsgYml0IDwgMTE7IGJpdCsrKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggJiAoMSA8PCAoMTAgLSBiaXQpKSkge1xuICAgICAgICAgICAgICAgIGVudHJvcHlbb2Zmc2V0ID4+IDNdIHw9ICgxIDw8ICg3IC0gKG9mZnNldCAlIDgpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQrKztcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbnRyb3B5Qml0cyA9IDMyICogd29yZHMubGVuZ3RoIC8gMztcbiAgICBjb25zdCBjaGVja3N1bUJpdHMgPSB3b3Jkcy5sZW5ndGggLyAzO1xuICAgIGNvbnN0IGNoZWNrc3VtTWFzayA9IGdldFVwcGVyTWFzayhjaGVja3N1bUJpdHMpO1xuICAgIGNvbnN0IGNoZWNrc3VtID0gYXJyYXlpZnkoc2hhMjU2KGVudHJvcHkuc2xpY2UoMCwgZW50cm9weUJpdHMgLyA4KSkpWzBdICYgY2hlY2tzdW1NYXNrO1xuICAgIGlmIChjaGVja3N1bSAhPT0gKGVudHJvcHlbZW50cm9weS5sZW5ndGggLSAxXSAmIGNoZWNrc3VtTWFzaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBjaGVja3N1bVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGhleGxpZnkoZW50cm9weS5zbGljZSgwLCBlbnRyb3B5Qml0cyAvIDgpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlbnRyb3B5VG9NbmVtb25pYyhlbnRyb3B5LCB3b3JkbGlzdCkge1xuICAgIHdvcmRsaXN0ID0gZ2V0V29yZGxpc3Qod29yZGxpc3QpO1xuICAgIGVudHJvcHkgPSBhcnJheWlmeShlbnRyb3B5KTtcbiAgICBpZiAoKGVudHJvcHkubGVuZ3RoICUgNCkgIT09IDAgfHwgZW50cm9weS5sZW5ndGggPCAxNiB8fCBlbnRyb3B5Lmxlbmd0aCA+IDMyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZW50cm9weVwiKTtcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlcyA9IFswXTtcbiAgICBsZXQgcmVtYWluaW5nQml0cyA9IDExO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cm9weS5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDb25zdW1lIHRoZSB3aG9sZSBieXRlICh3aXRoIHN0aWxsIG1vcmUgdG8gZ28pXG4gICAgICAgIGlmIChyZW1haW5pbmdCaXRzID4gOCkge1xuICAgICAgICAgICAgaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDFdIDw8PSA4O1xuICAgICAgICAgICAgaW5kaWNlc1tpbmRpY2VzLmxlbmd0aCAtIDFdIHw9IGVudHJvcHlbaV07XG4gICAgICAgICAgICByZW1haW5pbmdCaXRzIC09IDg7XG4gICAgICAgICAgICAvLyBUaGlzIGJ5dGUgd2lsbCBjb21wbGV0ZSBhbiAxMS1iaXQgaW5kZXhcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSA8PD0gcmVtYWluaW5nQml0cztcbiAgICAgICAgICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSB8PSBlbnRyb3B5W2ldID4+ICg4IC0gcmVtYWluaW5nQml0cyk7XG4gICAgICAgICAgICAvLyBTdGFydCB0aGUgbmV4dCB3b3JkXG4gICAgICAgICAgICBpbmRpY2VzLnB1c2goZW50cm9weVtpXSAmIGdldExvd2VyTWFzayg4IC0gcmVtYWluaW5nQml0cykpO1xuICAgICAgICAgICAgcmVtYWluaW5nQml0cyArPSAzO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIENvbXB1dGUgdGhlIGNoZWNrc3VtIGJpdHNcbiAgICBjb25zdCBjaGVja3N1bUJpdHMgPSBlbnRyb3B5Lmxlbmd0aCAvIDQ7XG4gICAgY29uc3QgY2hlY2tzdW0gPSBhcnJheWlmeShzaGEyNTYoZW50cm9weSkpWzBdICYgZ2V0VXBwZXJNYXNrKGNoZWNrc3VtQml0cyk7XG4gICAgLy8gU2hpZnQgdGhlIGNoZWNrc3VtIGludG8gdGhlIHdvcmQgaW5kaWNlc1xuICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSA8PD0gY2hlY2tzdW1CaXRzO1xuICAgIGluZGljZXNbaW5kaWNlcy5sZW5ndGggLSAxXSB8PSAoY2hlY2tzdW0gPj4gKDggLSBjaGVja3N1bUJpdHMpKTtcbiAgICByZXR1cm4gd29yZGxpc3Quam9pbihpbmRpY2VzLm1hcCgoaW5kZXgpID0+IHdvcmRsaXN0LmdldFdvcmQoaW5kZXgpKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1uZW1vbmljKG1uZW1vbmljLCB3b3JkbGlzdCkge1xuICAgIHRyeSB7XG4gICAgICAgIG1uZW1vbmljVG9FbnRyb3B5KG1uZW1vbmljLCB3b3JkbGlzdCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJqc29uLXdhbGxldHMvNS4wLjExXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCBhZXMgZnJvbSBcImFlcy1qc1wiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBhcnJheWlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgcGJrZGYyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Bia2RmMlwiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgRGVzY3JpcHRpb24gfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuaW1wb3J0IHsgZ2V0UGFzc3dvcmQsIGxvb3NlQXJyYXlpZnksIHNlYXJjaFBhdGggfSBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0IGNsYXNzIENyb3dkc2FsZUFjY291bnQgZXh0ZW5kcyBEZXNjcmlwdGlvbiB7XG4gICAgaXNDcm93ZHNhbGVBY2NvdW50KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhISh2YWx1ZSAmJiB2YWx1ZS5faXNDcm93ZHNhbGVBY2NvdW50KTtcbiAgICB9XG59XG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ldGhlcmV1bS9weWV0aHNhbGV0b29sXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdChqc29uLCBwYXNzd29yZCkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgIHBhc3N3b3JkID0gZ2V0UGFzc3dvcmQocGFzc3dvcmQpO1xuICAgIC8vIEV0aGVyZXVtIEFkZHJlc3NcbiAgICBjb25zdCBldGhhZGRyID0gZ2V0QWRkcmVzcyhzZWFyY2hQYXRoKGRhdGEsIFwiZXRoYWRkclwiKSk7XG4gICAgLy8gRW5jcnlwdGVkIFNlZWRcbiAgICBjb25zdCBlbmNzZWVkID0gbG9vc2VBcnJheWlmeShzZWFyY2hQYXRoKGRhdGEsIFwiZW5jc2VlZFwiKSk7XG4gICAgaWYgKCFlbmNzZWVkIHx8IChlbmNzZWVkLmxlbmd0aCAlIDE2KSAhPT0gMCkge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBlbmNzZWVkXCIsIFwianNvblwiLCBqc29uKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYXJyYXlpZnkocGJrZGYyKHBhc3N3b3JkLCBwYXNzd29yZCwgMjAwMCwgMzIsIFwic2hhMjU2XCIpKS5zbGljZSgwLCAxNik7XG4gICAgY29uc3QgaXYgPSBlbmNzZWVkLnNsaWNlKDAsIDE2KTtcbiAgICBjb25zdCBlbmNyeXB0ZWRTZWVkID0gZW5jc2VlZC5zbGljZSgxNik7XG4gICAgLy8gRGVjcnlwdCB0aGUgc2VlZFxuICAgIGNvbnN0IGFlc0NiYyA9IG5ldyBhZXMuTW9kZU9mT3BlcmF0aW9uLmNiYyhrZXksIGl2KTtcbiAgICBjb25zdCBzZWVkID0gYWVzLnBhZGRpbmcucGtjczcuc3RyaXAoYXJyYXlpZnkoYWVzQ2JjLmRlY3J5cHQoZW5jcnlwdGVkU2VlZCkpKTtcbiAgICAvLyBUaGlzIHdhbGxldCBmb3JtYXQgaXMgd2VpcmQuLi4gQ29udmVydCB0aGUgYmluYXJ5IGVuY29kZWQgaGV4IHRvIGEgc3RyaW5nLlxuICAgIGxldCBzZWVkSGV4ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc2VlZEhleCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHNlZWRbaV0pO1xuICAgIH1cbiAgICBjb25zdCBzZWVkSGV4Qnl0ZXMgPSB0b1V0ZjhCeXRlcyhzZWVkSGV4KTtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0ga2VjY2FrMjU2KHNlZWRIZXhCeXRlcyk7XG4gICAgcmV0dXJuIG5ldyBDcm93ZHNhbGVBY2NvdW50KHtcbiAgICAgICAgX2lzQ3Jvd2RzYWxlQWNjb3VudDogdHJ1ZSxcbiAgICAgICAgYWRkcmVzczogZXRoYWRkcixcbiAgICAgICAgcHJpdmF0ZUtleTogcHJpdmF0ZUtleVxuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Jvd2RzYWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgZGVjcnlwdCBhcyBkZWNyeXB0Q3Jvd2RzYWxlIH0gZnJvbSBcIi4vY3Jvd2RzYWxlXCI7XG5pbXBvcnQgeyBnZXRKc29uV2FsbGV0QWRkcmVzcywgaXNDcm93ZHNhbGVXYWxsZXQsIGlzS2V5c3RvcmVXYWxsZXQgfSBmcm9tIFwiLi9pbnNwZWN0XCI7XG5pbXBvcnQgeyBkZWNyeXB0IGFzIGRlY3J5cHRLZXlzdG9yZSwgZGVjcnlwdFN5bmMgYXMgZGVjcnlwdEtleXN0b3JlU3luYywgZW5jcnlwdCBhcyBlbmNyeXB0S2V5c3RvcmUgfSBmcm9tIFwiLi9rZXlzdG9yZVwiO1xuZnVuY3Rpb24gZGVjcnlwdEpzb25XYWxsZXQoanNvbiwgcGFzc3dvcmQsIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICBpZiAoaXNDcm93ZHNhbGVXYWxsZXQoanNvbikpIHtcbiAgICAgICAgaWYgKHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2soMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWNjb3VudCA9IGRlY3J5cHRDcm93ZHNhbGUoanNvbiwgcGFzc3dvcmQpO1xuICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjaygxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFjY291bnQpO1xuICAgIH1cbiAgICBpZiAoaXNLZXlzdG9yZVdhbGxldChqc29uKSkge1xuICAgICAgICByZXR1cm4gZGVjcnlwdEtleXN0b3JlKGpzb24sIHBhc3N3b3JkLCBwcm9ncmVzc0NhbGxiYWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImludmFsaWQgSlNPTiB3YWxsZXRcIikpO1xufVxuZnVuY3Rpb24gZGVjcnlwdEpzb25XYWxsZXRTeW5jKGpzb24sIHBhc3N3b3JkKSB7XG4gICAgaWYgKGlzQ3Jvd2RzYWxlV2FsbGV0KGpzb24pKSB7XG4gICAgICAgIHJldHVybiBkZWNyeXB0Q3Jvd2RzYWxlKGpzb24sIHBhc3N3b3JkKTtcbiAgICB9XG4gICAgaWYgKGlzS2V5c3RvcmVXYWxsZXQoanNvbikpIHtcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRLZXlzdG9yZVN5bmMoanNvbiwgcGFzc3dvcmQpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIEpTT04gd2FsbGV0XCIpO1xufVxuZXhwb3J0IHsgZGVjcnlwdENyb3dkc2FsZSwgZGVjcnlwdEtleXN0b3JlLCBkZWNyeXB0S2V5c3RvcmVTeW5jLCBlbmNyeXB0S2V5c3RvcmUsIGlzQ3Jvd2RzYWxlV2FsbGV0LCBpc0tleXN0b3JlV2FsbGV0LCBnZXRKc29uV2FsbGV0QWRkcmVzcywgZGVjcnlwdEpzb25XYWxsZXQsIGRlY3J5cHRKc29uV2FsbGV0U3luYywgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5leHBvcnQgZnVuY3Rpb24gaXNDcm93ZHNhbGVXYWxsZXQoanNvbikge1xuICAgIGxldCBkYXRhID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChkYXRhLmVuY3NlZWQgJiYgZGF0YS5ldGhhZGRyKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0tleXN0b3JlV2FsbGV0KGpzb24pIHtcbiAgICBsZXQgZGF0YSA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghZGF0YS52ZXJzaW9uIHx8IHBhcnNlSW50KGRhdGEudmVyc2lvbikgIT09IGRhdGEudmVyc2lvbiB8fCBwYXJzZUludChkYXRhLnZlcnNpb24pICE9PSAzKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQFRPRE86IFB1dCBtb3JlIGNoZWNrcyB0byBtYWtlIHN1cmUgaXQgaGFzIGtkZiwgaXYgYW5kIGFsbCB0aGF0IGdvb2Qgc3R1ZmZcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbi8vZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbldhbGxldChqc29uOiBzdHJpbmcpOiBib29sZWFuIHtcbi8vICAgIHJldHVybiAoaXNTZWNyZXRTdG9yYWdlV2FsbGV0KGpzb24pIHx8IGlzQ3Jvd2RzYWxlV2FsbGV0KGpzb24pKTtcbi8vfVxuZXhwb3J0IGZ1bmN0aW9uIGdldEpzb25XYWxsZXRBZGRyZXNzKGpzb24pIHtcbiAgICBpZiAoaXNDcm93ZHNhbGVXYWxsZXQoanNvbikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRBZGRyZXNzKEpTT04ucGFyc2UoanNvbikuZXRoYWRkcik7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNLZXlzdG9yZVdhbGxldChqc29uKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEFkZHJlc3MoSlNPTi5wYXJzZShqc29uKS5hZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5zcGVjdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IGFlcyBmcm9tIFwiYWVzLWpzXCI7XG5pbXBvcnQgc2NyeXB0IGZyb20gXCJzY3J5cHQtanNcIjtcbmltcG9ydCB7IGdldEFkZHJlc3MgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYWRkcmVzc1wiO1xuaW1wb3J0IHsgYXJyYXlpZnksIGNvbmNhdCwgaGV4bGlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgZGVmYXVsdFBhdGgsIGVudHJvcHlUb01uZW1vbmljLCBIRE5vZGUsIG1uZW1vbmljVG9FbnRyb3B5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2hkbm9kZVwiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgcGJrZGYyIGFzIF9wYmtkZjIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcGJrZGYyXCI7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9yYW5kb21cIjtcbmltcG9ydCB7IERlc2NyaXB0aW9uIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IGNvbXB1dGVBZGRyZXNzIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3RyYW5zYWN0aW9uc1wiO1xuaW1wb3J0IHsgZ2V0UGFzc3dvcmQsIGxvb3NlQXJyYXlpZnksIHNlYXJjaFBhdGgsIHV1aWRWNCwgenBhZCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG4vLyBFeHBvcnRlZCBUeXBlc1xuZnVuY3Rpb24gaGFzTW5lbW9uaWModmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubW5lbW9uaWMgJiYgdmFsdWUubW5lbW9uaWMucGhyYXNlKTtcbn1cbmV4cG9ydCBjbGFzcyBLZXlzdG9yZUFjY291bnQgZXh0ZW5kcyBEZXNjcmlwdGlvbiB7XG4gICAgaXNLZXlzdG9yZUFjY291bnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9pc0tleXN0b3JlQWNjb3VudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gX2RlY3J5cHQoZGF0YSwga2V5LCBjaXBoZXJ0ZXh0KSB7XG4gICAgY29uc3QgY2lwaGVyID0gc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9jaXBoZXJcIik7XG4gICAgaWYgKGNpcGhlciA9PT0gXCJhZXMtMTI4LWN0clwiKSB7XG4gICAgICAgIGNvbnN0IGl2ID0gbG9vc2VBcnJheWlmeShzZWFyY2hQYXRoKGRhdGEsIFwiY3J5cHRvL2NpcGhlcnBhcmFtcy9pdlwiKSk7XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgYWVzLkNvdW50ZXIoaXYpO1xuICAgICAgICBjb25zdCBhZXNDdHIgPSBuZXcgYWVzLk1vZGVPZk9wZXJhdGlvbi5jdHIoa2V5LCBjb3VudGVyKTtcbiAgICAgICAgcmV0dXJuIGFycmF5aWZ5KGFlc0N0ci5kZWNyeXB0KGNpcGhlcnRleHQpKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBfZ2V0QWNjb3VudChkYXRhLCBrZXkpIHtcbiAgICBjb25zdCBjaXBoZXJ0ZXh0ID0gbG9vc2VBcnJheWlmeShzZWFyY2hQYXRoKGRhdGEsIFwiY3J5cHRvL2NpcGhlcnRleHRcIikpO1xuICAgIGNvbnN0IGNvbXB1dGVkTUFDID0gaGV4bGlmeShrZWNjYWsyNTYoY29uY2F0KFtrZXkuc2xpY2UoMTYsIDMyKSwgY2lwaGVydGV4dF0pKSkuc3Vic3RyaW5nKDIpO1xuICAgIGlmIChjb21wdXRlZE1BQyAhPT0gc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9tYWNcIikudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHBhc3N3b3JkXCIpO1xuICAgIH1cbiAgICBjb25zdCBwcml2YXRlS2V5ID0gX2RlY3J5cHQoZGF0YSwga2V5LnNsaWNlKDAsIDE2KSwgY2lwaGVydGV4dCk7XG4gICAgaWYgKCFwcml2YXRlS2V5KSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwidW5zdXBwb3J0ZWQgY2lwaGVyXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwiZGVjcnlwdFwiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtbmVtb25pY0tleSA9IGtleS5zbGljZSgzMiwgNjQpO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBjb21wdXRlQWRkcmVzcyhwcml2YXRlS2V5KTtcbiAgICBpZiAoZGF0YS5hZGRyZXNzKSB7XG4gICAgICAgIGxldCBjaGVjayA9IGRhdGEuYWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoY2hlY2suc3Vic3RyaW5nKDAsIDIpICE9PSBcIjB4XCIpIHtcbiAgICAgICAgICAgIGNoZWNrID0gXCIweFwiICsgY2hlY2s7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldEFkZHJlc3MoY2hlY2spICE9PSBhZGRyZXNzKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRyZXNzIG1pc21hdGNoXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGFjY291bnQgPSB7XG4gICAgICAgIF9pc0tleXN0b3JlQWNjb3VudDogdHJ1ZSxcbiAgICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgcHJpdmF0ZUtleTogaGV4bGlmeShwcml2YXRlS2V5KVxuICAgIH07XG4gICAgLy8gVmVyc2lvbiAwLjEgeC1ldGhlcnMgbWV0YWRhdGEgbXVzdCBjb250YWluIGFuIGVuY3J5cHRlZCBtbmVtb25pYyBwaHJhc2VcbiAgICBpZiAoc2VhcmNoUGF0aChkYXRhLCBcIngtZXRoZXJzL3ZlcnNpb25cIikgPT09IFwiMC4xXCIpIHtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNDaXBoZXJ0ZXh0ID0gbG9vc2VBcnJheWlmeShzZWFyY2hQYXRoKGRhdGEsIFwieC1ldGhlcnMvbW5lbW9uaWNDaXBoZXJ0ZXh0XCIpKTtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNJdiA9IGxvb3NlQXJyYXlpZnkoc2VhcmNoUGF0aChkYXRhLCBcIngtZXRoZXJzL21uZW1vbmljQ291bnRlclwiKSk7XG4gICAgICAgIGNvbnN0IG1uZW1vbmljQ291bnRlciA9IG5ldyBhZXMuQ291bnRlcihtbmVtb25pY0l2KTtcbiAgICAgICAgY29uc3QgbW5lbW9uaWNBZXNDdHIgPSBuZXcgYWVzLk1vZGVPZk9wZXJhdGlvbi5jdHIobW5lbW9uaWNLZXksIG1uZW1vbmljQ291bnRlcik7XG4gICAgICAgIGNvbnN0IHBhdGggPSBzZWFyY2hQYXRoKGRhdGEsIFwieC1ldGhlcnMvcGF0aFwiKSB8fCBkZWZhdWx0UGF0aDtcbiAgICAgICAgY29uc3QgbG9jYWxlID0gc2VhcmNoUGF0aChkYXRhLCBcIngtZXRoZXJzL2xvY2FsZVwiKSB8fCBcImVuXCI7XG4gICAgICAgIGNvbnN0IGVudHJvcHkgPSBhcnJheWlmeShtbmVtb25pY0Flc0N0ci5kZWNyeXB0KG1uZW1vbmljQ2lwaGVydGV4dCkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbW5lbW9uaWMgPSBlbnRyb3B5VG9NbmVtb25pYyhlbnRyb3B5LCBsb2NhbGUpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZSA9IEhETm9kZS5mcm9tTW5lbW9uaWMobW5lbW9uaWMsIG51bGwsIGxvY2FsZSkuZGVyaXZlUGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmIChub2RlLnByaXZhdGVLZXkgIT0gYWNjb3VudC5wcml2YXRlS2V5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibW5lbW9uaWMgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhY2NvdW50Lm1uZW1vbmljID0gbm9kZS5tbmVtb25pYztcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhlIGxvY2FsZSB3b3JkbGlzdCBpbnN0YWxsZWQgdG9cbiAgICAgICAgICAgIC8vIHJlYWQgdGhpcyBtbmVtb25pYywganVzdCBiYWlsIGFuZCBkb24ndCBzZXQgdGhlXG4gICAgICAgICAgICAvLyBtbmVtb25pY1xuICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09IExvZ2dlci5lcnJvcnMuSU5WQUxJRF9BUkdVTUVOVCB8fCBlcnJvci5hcmd1bWVudCAhPT0gXCJ3b3JkbGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBLZXlzdG9yZUFjY291bnQoYWNjb3VudCk7XG59XG5mdW5jdGlvbiBwYmtkZjJTeW5jKHBhc3N3b3JkQnl0ZXMsIHNhbHQsIGNvdW50LCBka0xlbiwgcHJmRnVuYykge1xuICAgIHJldHVybiBhcnJheWlmeShfcGJrZGYyKHBhc3N3b3JkQnl0ZXMsIHNhbHQsIGNvdW50LCBka0xlbiwgcHJmRnVuYykpO1xufVxuZnVuY3Rpb24gcGJrZGYyKHBhc3N3b3JkQnl0ZXMsIHNhbHQsIGNvdW50LCBka0xlbiwgcHJmRnVuYykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocGJrZGYyU3luYyhwYXNzd29yZEJ5dGVzLCBzYWx0LCBjb3VudCwgZGtMZW4sIHByZkZ1bmMpKTtcbn1cbmZ1bmN0aW9uIF9jb21wdXRlS2RmS2V5KGRhdGEsIHBhc3N3b3JkLCBwYmtkZjJGdW5jLCBzY3J5cHRGdW5jLCBwcm9ncmVzc0NhbGxiYWNrKSB7XG4gICAgY29uc3QgcGFzc3dvcmRCeXRlcyA9IGdldFBhc3N3b3JkKHBhc3N3b3JkKTtcbiAgICBjb25zdCBrZGYgPSBzZWFyY2hQYXRoKGRhdGEsIFwiY3J5cHRvL2tkZlwiKTtcbiAgICBpZiAoa2RmICYmIHR5cGVvZiAoa2RmKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCB0aHJvd0Vycm9yID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQga2V5LWRlcml2YXRpb24gZnVuY3Rpb24gcGFyYW1ldGVyc1wiLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChrZGYudG9Mb3dlckNhc2UoKSA9PT0gXCJzY3J5cHRcIikge1xuICAgICAgICAgICAgY29uc3Qgc2FsdCA9IGxvb3NlQXJyYXlpZnkoc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvc2FsdFwiKSk7XG4gICAgICAgICAgICBjb25zdCBOID0gcGFyc2VJbnQoc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvblwiKSk7XG4gICAgICAgICAgICBjb25zdCByID0gcGFyc2VJbnQoc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvclwiKSk7XG4gICAgICAgICAgICBjb25zdCBwID0gcGFyc2VJbnQoc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvcFwiKSk7XG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIGlmICghTiB8fCAhciB8fCAhcCkge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3IoXCJrZGZcIiwga2RmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBOIGlzIGEgcG93ZXIgb2YgMlxuICAgICAgICAgICAgaWYgKChOICYgKE4gLSAxKSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yKFwiTlwiLCBOKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRrTGVuID0gcGFyc2VJbnQoc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvZGtsZW5cIikpO1xuICAgICAgICAgICAgaWYgKGRrTGVuICE9PSAzMikge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3IoXCJka2xlblwiLCBka0xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2NyeXB0RnVuYyhwYXNzd29yZEJ5dGVzLCBzYWx0LCBOLCByLCBwLCA2NCwgcHJvZ3Jlc3NDYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoa2RmLnRvTG93ZXJDYXNlKCkgPT09IFwicGJrZGYyXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhbHQgPSBsb29zZUFycmF5aWZ5KHNlYXJjaFBhdGgoZGF0YSwgXCJjcnlwdG8va2RmcGFyYW1zL3NhbHRcIikpO1xuICAgICAgICAgICAgbGV0IHByZkZ1bmMgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgcHJmID0gc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvcHJmXCIpO1xuICAgICAgICAgICAgaWYgKHByZiA9PT0gXCJobWFjLXNoYTI1NlwiKSB7XG4gICAgICAgICAgICAgICAgcHJmRnVuYyA9IFwic2hhMjU2XCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcmYgPT09IFwiaG1hYy1zaGE1MTJcIikge1xuICAgICAgICAgICAgICAgIHByZkZ1bmMgPSBcInNoYTUxMlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3dFcnJvcihcInByZlwiLCBwcmYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBwYXJzZUludChzZWFyY2hQYXRoKGRhdGEsIFwiY3J5cHRvL2tkZnBhcmFtcy9jXCIpKTtcbiAgICAgICAgICAgIGNvbnN0IGRrTGVuID0gcGFyc2VJbnQoc2VhcmNoUGF0aChkYXRhLCBcImNyeXB0by9rZGZwYXJhbXMvZGtsZW5cIikpO1xuICAgICAgICAgICAgaWYgKGRrTGVuICE9PSAzMikge1xuICAgICAgICAgICAgICAgIHRocm93RXJyb3IoXCJka2xlblwiLCBka0xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGJrZGYyRnVuYyhwYXNzd29yZEJ5dGVzLCBzYWx0LCBjb3VudCwgZGtMZW4sIHByZkZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5zdXBwb3J0ZWQga2V5LWRlcml2YXRpb24gZnVuY3Rpb25cIiwgXCJrZGZcIiwga2RmKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWNyeXB0U3luYyhqc29uLCBwYXNzd29yZCkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgIGNvbnN0IGtleSA9IF9jb21wdXRlS2RmS2V5KGRhdGEsIHBhc3N3b3JkLCBwYmtkZjJTeW5jLCBzY3J5cHQuc3luY1NjcnlwdCk7XG4gICAgcmV0dXJuIF9nZXRBY2NvdW50KGRhdGEsIGtleSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdChqc29uLCBwYXNzd29yZCwgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgICBjb25zdCBrZXkgPSB5aWVsZCBfY29tcHV0ZUtkZktleShkYXRhLCBwYXNzd29yZCwgcGJrZGYyLCBzY3J5cHQuc2NyeXB0LCBwcm9ncmVzc0NhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIF9nZXRBY2NvdW50KGRhdGEsIGtleSk7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdChhY2NvdW50LCBwYXNzd29yZCwgb3B0aW9ucywgcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIENoZWNrIHRoZSBhZGRyZXNzIG1hdGNoZXMgdGhlIHByaXZhdGUga2V5XG4gICAgICAgIGlmIChnZXRBZGRyZXNzKGFjY291bnQuYWRkcmVzcykgIT09IGNvbXB1dGVBZGRyZXNzKGFjY291bnQucHJpdmF0ZUtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZHJlc3MvcHJpdmF0ZUtleSBtaXNtYXRjaFwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayB0aGUgbW5lbW9uaWMgKGlmIGFueSkgbWF0Y2hlcyB0aGUgcHJpdmF0ZSBrZXlcbiAgICAgICAgaWYgKGhhc01uZW1vbmljKGFjY291bnQpKSB7XG4gICAgICAgICAgICBjb25zdCBtbmVtb25pYyA9IGFjY291bnQubW5lbW9uaWM7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gSEROb2RlLmZyb21NbmVtb25pYyhtbmVtb25pYy5waHJhc2UsIG51bGwsIG1uZW1vbmljLmxvY2FsZSkuZGVyaXZlUGF0aChtbmVtb25pYy5wYXRoIHx8IGRlZmF1bHRQYXRoKTtcbiAgICAgICAgICAgIGlmIChub2RlLnByaXZhdGVLZXkgIT0gYWNjb3VudC5wcml2YXRlS2V5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibW5lbW9uaWMgbWlzbWF0Y2hcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgICAvLyBUaGUgb3B0aW9ucyBhcmUgb3B0aW9uYWwsIHNvIGFkanVzdCB0aGUgY2FsbCBhcyBuZWVkZWRcbiAgICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gXCJmdW5jdGlvblwiICYmICFwcm9ncmVzc0NhbGxiYWNrKSB7XG4gICAgICAgIHByb2dyZXNzQ2FsbGJhY2sgPSBvcHRpb25zO1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhcnJheWlmeShhY2NvdW50LnByaXZhdGVLZXkpO1xuICAgIGNvbnN0IHBhc3N3b3JkQnl0ZXMgPSBnZXRQYXNzd29yZChwYXNzd29yZCk7XG4gICAgbGV0IGVudHJvcHkgPSBudWxsO1xuICAgIGxldCBwYXRoID0gbnVsbDtcbiAgICBsZXQgbG9jYWxlID0gbnVsbDtcbiAgICBpZiAoaGFzTW5lbW9uaWMoYWNjb3VudCkpIHtcbiAgICAgICAgY29uc3Qgc3JjTW5lbW9uaWMgPSBhY2NvdW50Lm1uZW1vbmljO1xuICAgICAgICBlbnRyb3B5ID0gYXJyYXlpZnkobW5lbW9uaWNUb0VudHJvcHkoc3JjTW5lbW9uaWMucGhyYXNlLCBzcmNNbmVtb25pYy5sb2NhbGUgfHwgXCJlblwiKSk7XG4gICAgICAgIHBhdGggPSBzcmNNbmVtb25pYy5wYXRoIHx8IGRlZmF1bHRQYXRoO1xuICAgICAgICBsb2NhbGUgPSBzcmNNbmVtb25pYy5sb2NhbGUgfHwgXCJlblwiO1xuICAgIH1cbiAgICBsZXQgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQ7XG4gICAgaWYgKCFjbGllbnQpIHtcbiAgICAgICAgY2xpZW50ID0gXCJldGhlcnMuanNcIjtcbiAgICB9XG4gICAgLy8gQ2hlY2svZ2VuZXJhdGUgdGhlIHNhbHRcbiAgICBsZXQgc2FsdCA9IG51bGw7XG4gICAgaWYgKG9wdGlvbnMuc2FsdCkge1xuICAgICAgICBzYWx0ID0gYXJyYXlpZnkob3B0aW9ucy5zYWx0KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNhbHQgPSByYW5kb21CeXRlcygzMik7XG4gICAgICAgIDtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yXG4gICAgbGV0IGl2ID0gbnVsbDtcbiAgICBpZiAob3B0aW9ucy5pdikge1xuICAgICAgICBpdiA9IGFycmF5aWZ5KG9wdGlvbnMuaXYpO1xuICAgICAgICBpZiAoaXYubGVuZ3RoICE9PSAxNikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBpdlwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaXYgPSByYW5kb21CeXRlcygxNik7XG4gICAgfVxuICAgIC8vIE92ZXJyaWRlIHRoZSB1dWlkXG4gICAgbGV0IHV1aWRSYW5kb20gPSBudWxsO1xuICAgIGlmIChvcHRpb25zLnV1aWQpIHtcbiAgICAgICAgdXVpZFJhbmRvbSA9IGFycmF5aWZ5KG9wdGlvbnMudXVpZCk7XG4gICAgICAgIGlmICh1dWlkUmFuZG9tLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdXVpZFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdXVpZFJhbmRvbSA9IHJhbmRvbUJ5dGVzKDE2KTtcbiAgICB9XG4gICAgLy8gT3ZlcnJpZGUgdGhlIHNjcnlwdCBwYXNzd29yZC1iYXNlZCBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBwYXJhbWV0ZXJzXG4gICAgbGV0IE4gPSAoMSA8PCAxNyksIHIgPSA4LCBwID0gMTtcbiAgICBpZiAob3B0aW9ucy5zY3J5cHQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NyeXB0Lk4pIHtcbiAgICAgICAgICAgIE4gPSBvcHRpb25zLnNjcnlwdC5OO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnNjcnlwdC5yKSB7XG4gICAgICAgICAgICByID0gb3B0aW9ucy5zY3J5cHQucjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zY3J5cHQucCkge1xuICAgICAgICAgICAgcCA9IG9wdGlvbnMuc2NyeXB0LnA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgdGFrZSA2NCBieXRlczpcbiAgICAvLyAgIC0gMzIgYnl0ZXMgICBBcyBub3JtYWwgZm9yIHRoZSBXZWIzIHNlY3JldCBzdG9yYWdlIChkZXJpdmVkS2V5LCBtYWNQcmVmaXgpXG4gICAgLy8gICAtIDMyIGJ5dGVzICAgQUVTIGtleSB0byBlbmNyeXB0IG1uZW1vbmljIHdpdGggKHJlcXVpcmVkIGhlcmUgdG8gYmUgRXRoZXJzIFdhbGxldClcbiAgICByZXR1cm4gc2NyeXB0LnNjcnlwdChwYXNzd29yZEJ5dGVzLCBzYWx0LCBOLCByLCBwLCA2NCwgcHJvZ3Jlc3NDYWxsYmFjaykudGhlbigoa2V5KSA9PiB7XG4gICAgICAgIGtleSA9IGFycmF5aWZ5KGtleSk7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGVuY3J5cHQgdGhlIHdhbGxldCAoYXMgcGVyIFdlYjMgc2VjcmV0IHN0b3JhZ2UpXG4gICAgICAgIGNvbnN0IGRlcml2ZWRLZXkgPSBrZXkuc2xpY2UoMCwgMTYpO1xuICAgICAgICBjb25zdCBtYWNQcmVmaXggPSBrZXkuc2xpY2UoMTYsIDMyKTtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZW5jcnlwdCB0aGUgbW5lbW9uaWMgcGhyYXNlIChpZiBhbnkpXG4gICAgICAgIGNvbnN0IG1uZW1vbmljS2V5ID0ga2V5LnNsaWNlKDMyLCA2NCk7XG4gICAgICAgIC8vIEVuY3J5cHQgdGhlIHByaXZhdGUga2V5XG4gICAgICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgYWVzLkNvdW50ZXIoaXYpO1xuICAgICAgICBjb25zdCBhZXNDdHIgPSBuZXcgYWVzLk1vZGVPZk9wZXJhdGlvbi5jdHIoZGVyaXZlZEtleSwgY291bnRlcik7XG4gICAgICAgIGNvbnN0IGNpcGhlcnRleHQgPSBhcnJheWlmeShhZXNDdHIuZW5jcnlwdChwcml2YXRlS2V5KSk7XG4gICAgICAgIC8vIENvbXB1dGUgdGhlIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSwgdXNlZCB0byBjaGVjayB0aGUgcGFzc3dvcmRcbiAgICAgICAgY29uc3QgbWFjID0ga2VjY2FrMjU2KGNvbmNhdChbbWFjUHJlZml4LCBjaXBoZXJ0ZXh0XSkpO1xuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ldGhlcmV1bS93aWtpL3dpa2kvV2ViMy1TZWNyZXQtU3RvcmFnZS1EZWZpbml0aW9uXG4gICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiBhY2NvdW50LmFkZHJlc3Muc3Vic3RyaW5nKDIpLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBpZDogdXVpZFY0KHV1aWRSYW5kb20pLFxuICAgICAgICAgICAgdmVyc2lvbjogMyxcbiAgICAgICAgICAgIENyeXB0bzoge1xuICAgICAgICAgICAgICAgIGNpcGhlcjogXCJhZXMtMTI4LWN0clwiLFxuICAgICAgICAgICAgICAgIGNpcGhlcnBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBpdjogaGV4bGlmeShpdikuc3Vic3RyaW5nKDIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2lwaGVydGV4dDogaGV4bGlmeShjaXBoZXJ0ZXh0KS5zdWJzdHJpbmcoMiksXG4gICAgICAgICAgICAgICAga2RmOiBcInNjcnlwdFwiLFxuICAgICAgICAgICAgICAgIGtkZnBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBzYWx0OiBoZXhsaWZ5KHNhbHQpLnN1YnN0cmluZygyKSxcbiAgICAgICAgICAgICAgICAgICAgbjogTixcbiAgICAgICAgICAgICAgICAgICAgZGtsZW46IDMyLFxuICAgICAgICAgICAgICAgICAgICBwOiBwLFxuICAgICAgICAgICAgICAgICAgICByOiByXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYWM6IG1hYy5zdWJzdHJpbmcoMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIG1uZW1vbmljLCBlbmNyeXB0IGl0IGludG8gdGhlIEpTT04gd2FsbGV0XG4gICAgICAgIGlmIChlbnRyb3B5KSB7XG4gICAgICAgICAgICBjb25zdCBtbmVtb25pY0l2ID0gcmFuZG9tQnl0ZXMoMTYpO1xuICAgICAgICAgICAgY29uc3QgbW5lbW9uaWNDb3VudGVyID0gbmV3IGFlcy5Db3VudGVyKG1uZW1vbmljSXYpO1xuICAgICAgICAgICAgY29uc3QgbW5lbW9uaWNBZXNDdHIgPSBuZXcgYWVzLk1vZGVPZk9wZXJhdGlvbi5jdHIobW5lbW9uaWNLZXksIG1uZW1vbmljQ291bnRlcik7XG4gICAgICAgICAgICBjb25zdCBtbmVtb25pY0NpcGhlcnRleHQgPSBhcnJheWlmeShtbmVtb25pY0Flc0N0ci5lbmNyeXB0KGVudHJvcHkpKTtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSAobm93LmdldFVUQ0Z1bGxZZWFyKCkgKyBcIi1cIiArXG4gICAgICAgICAgICAgICAgenBhZChub3cuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgXCItXCIgK1xuICAgICAgICAgICAgICAgIHpwYWQobm93LmdldFVUQ0RhdGUoKSwgMikgKyBcIlRcIiArXG4gICAgICAgICAgICAgICAgenBhZChub3cuZ2V0VVRDSG91cnMoKSwgMikgKyBcIi1cIiArXG4gICAgICAgICAgICAgICAgenBhZChub3cuZ2V0VVRDTWludXRlcygpLCAyKSArIFwiLVwiICtcbiAgICAgICAgICAgICAgICB6cGFkKG5vdy5nZXRVVENTZWNvbmRzKCksIDIpICsgXCIuMFpcIik7XG4gICAgICAgICAgICBkYXRhW1wieC1ldGhlcnNcIl0gPSB7XG4gICAgICAgICAgICAgICAgY2xpZW50OiBjbGllbnQsXG4gICAgICAgICAgICAgICAgZ2V0aEZpbGVuYW1lOiAoXCJVVEMtLVwiICsgdGltZXN0YW1wICsgXCItLVwiICsgZGF0YS5hZGRyZXNzKSxcbiAgICAgICAgICAgICAgICBtbmVtb25pY0NvdW50ZXI6IGhleGxpZnkobW5lbW9uaWNJdikuc3Vic3RyaW5nKDIpLFxuICAgICAgICAgICAgICAgIG1uZW1vbmljQ2lwaGVydGV4dDogaGV4bGlmeShtbmVtb25pY0NpcGhlcnRleHQpLnN1YnN0cmluZygyKSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgICAgICAgIGxvY2FsZTogbG9jYWxlLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IFwiMC4xXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9a2V5c3RvcmUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgaGV4bGlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMsIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybSB9IGZyb20gJ0BldGhlcnNwcm9qZWN0L3N0cmluZ3MnO1xuZXhwb3J0IGZ1bmN0aW9uIGxvb3NlQXJyYXlpZnkoaGV4U3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiAoaGV4U3RyaW5nKSA9PT0gJ3N0cmluZycgJiYgaGV4U3RyaW5nLnN1YnN0cmluZygwLCAyKSAhPT0gJzB4Jykge1xuICAgICAgICBoZXhTdHJpbmcgPSAnMHgnICsgaGV4U3RyaW5nO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlpZnkoaGV4U3RyaW5nKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB6cGFkKHZhbHVlLCBsZW5ndGgpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgd2hpbGUgKHZhbHVlLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9ICcwJyArIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFzc3dvcmQocGFzc3dvcmQpIHtcbiAgICBpZiAodHlwZW9mIChwYXNzd29yZCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiB0b1V0ZjhCeXRlcyhwYXNzd29yZCwgVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtLk5GS0MpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXlpZnkocGFzc3dvcmQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFBhdGgob2JqZWN0LCBwYXRoKSB7XG4gICAgbGV0IGN1cnJlbnRDaGlsZCA9IG9iamVjdDtcbiAgICBjb25zdCBjb21wcyA9IHBhdGgudG9Mb3dlckNhc2UoKS5zcGxpdCgnLycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gU2VhcmNoIGZvciBhIGNoaWxkIG9iamVjdCB3aXRoIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBrZXlcbiAgICAgICAgbGV0IG1hdGNoaW5nQ2hpbGQgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdXJyZW50Q2hpbGQpIHtcbiAgICAgICAgICAgIGlmIChrZXkudG9Mb3dlckNhc2UoKSA9PT0gY29tcHNbaV0pIHtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ0NoaWxkID0gY3VycmVudENoaWxkW2tleV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGlkbid0IGZpbmQgb25lLiA6JyhcbiAgICAgICAgaWYgKG1hdGNoaW5nQ2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vdyBjaGVjayB0aGlzIGNoaWxkLi4uXG4gICAgICAgIGN1cnJlbnRDaGlsZCA9IG1hdGNoaW5nQ2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50Q2hpbGQ7XG59XG4vLyBTZWU6IGh0dHBzOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dCAoU2VjdGlvbiA0LjQpXG5leHBvcnQgZnVuY3Rpb24gdXVpZFY0KHJhbmRvbUJ5dGVzKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBhcnJheWlmeShyYW5kb21CeXRlcyk7XG4gICAgLy8gU2VjdGlvbjogNC4xLjM6XG4gICAgLy8gLSB0aW1lX2hpX2FuZF92ZXJzaW9uWzEyOjE2XSA9IDBiMDEwMFxuICAgIGJ5dGVzWzZdID0gKGJ5dGVzWzZdICYgMHgwZikgfCAweDQwO1xuICAgIC8vIFNlY3Rpb24gNC40XG4gICAgLy8gLSBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkWzZdID0gMGIwXG4gICAgLy8gLSBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkWzddID0gMGIxXG4gICAgYnl0ZXNbOF0gPSAoYnl0ZXNbOF0gJiAweDNmKSB8IDB4ODA7XG4gICAgY29uc3QgdmFsdWUgPSBoZXhsaWZ5KGJ5dGVzKTtcbiAgICByZXR1cm4gW1xuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMiwgMTApLFxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMTAsIDE0KSxcbiAgICAgICAgdmFsdWUuc3Vic3RyaW5nKDE0LCAxOCksXG4gICAgICAgIHZhbHVlLnN1YnN0cmluZygxOCwgMjIpLFxuICAgICAgICB2YWx1ZS5zdWJzdHJpbmcoMjIsIDM0KSxcbiAgICBdLmpvaW4oXCItXCIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgc2hhMyBmcm9tIFwianMtc2hhM1wiO1xuaW1wb3J0IHsgYXJyYXlpZnkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmV4cG9ydCBmdW5jdGlvbiBrZWNjYWsyNTYoZGF0YSkge1xuICAgIHJldHVybiAnMHgnICsgc2hhMy5rZWNjYWtfMjU2KGFycmF5aWZ5KGRhdGEpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJsb2dnZXIvNS4wLjlcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xubGV0IF9wZXJtYW5lbnRDZW5zb3JFcnJvcnMgPSBmYWxzZTtcbmxldCBfY2Vuc29yRXJyb3JzID0gZmFsc2U7XG5jb25zdCBMb2dMZXZlbHMgPSB7IGRlYnVnOiAxLCBcImRlZmF1bHRcIjogMiwgaW5mbzogMiwgd2FybmluZzogMywgZXJyb3I6IDQsIG9mZjogNSB9O1xubGV0IF9sb2dMZXZlbCA9IExvZ0xldmVsc1tcImRlZmF1bHRcIl07XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmxldCBfZ2xvYmFsTG9nZ2VyID0gbnVsbDtcbmZ1bmN0aW9uIF9jaGVja05vcm1hbGl6ZSgpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gW107XG4gICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgZm9ybXMgb2Ygbm9ybWFsaXphdGlvbiBhcmUgc3VwcG9ydGVkXG4gICAgICAgIFtcIk5GRFwiLCBcIk5GQ1wiLCBcIk5GS0RcIiwgXCJORktDXCJdLmZvckVhY2goKGZvcm0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKFwidGVzdFwiLm5vcm1hbGl6ZShmb3JtKSAhPT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIG5vcm1hbGl6ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbWlzc2luZy5wdXNoKGZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIFwiICsgbWlzc2luZy5qb2luKFwiLCBcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZTkpLm5vcm1hbGl6ZShcIk5GRFwiKSAhPT0gU3RyaW5nLmZyb21DaGFyQ29kZSgweDY1LCAweDAzMDEpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJicm9rZW4gaW1wbGVtZW50YXRpb25cIik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn1cbmNvbnN0IF9ub3JtYWxpemVFcnJvciA9IF9jaGVja05vcm1hbGl6ZSgpO1xuZXhwb3J0IHZhciBMb2dMZXZlbDtcbihmdW5jdGlvbiAoTG9nTGV2ZWwpIHtcbiAgICBMb2dMZXZlbFtcIkRFQlVHXCJdID0gXCJERUJVR1wiO1xuICAgIExvZ0xldmVsW1wiSU5GT1wiXSA9IFwiSU5GT1wiO1xuICAgIExvZ0xldmVsW1wiV0FSTklOR1wiXSA9IFwiV0FSTklOR1wiO1xuICAgIExvZ0xldmVsW1wiRVJST1JcIl0gPSBcIkVSUk9SXCI7XG4gICAgTG9nTGV2ZWxbXCJPRkZcIl0gPSBcIk9GRlwiO1xufSkoTG9nTGV2ZWwgfHwgKExvZ0xldmVsID0ge30pKTtcbmV4cG9ydCB2YXIgRXJyb3JDb2RlO1xuKGZ1bmN0aW9uIChFcnJvckNvZGUpIHtcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gR2VuZXJpYyBFcnJvcnNcbiAgICAvLyBVbmtub3duIEVycm9yXG4gICAgRXJyb3JDb2RlW1wiVU5LTk9XTl9FUlJPUlwiXSA9IFwiVU5LTk9XTl9FUlJPUlwiO1xuICAgIC8vIE5vdCBJbXBsZW1lbnRlZFxuICAgIEVycm9yQ29kZVtcIk5PVF9JTVBMRU1FTlRFRFwiXSA9IFwiTk9UX0lNUExFTUVOVEVEXCI7XG4gICAgLy8gVW5zdXBwb3J0ZWQgT3BlcmF0aW9uXG4gICAgLy8gICAtIG9wZXJhdGlvblxuICAgIEVycm9yQ29kZVtcIlVOU1VQUE9SVEVEX09QRVJBVElPTlwiXSA9IFwiVU5TVVBQT1JURURfT1BFUkFUSU9OXCI7XG4gICAgLy8gTmV0d29yayBFcnJvciAoaS5lLiBFdGhlcmV1bSBOZXR3b3JrLCBzdWNoIGFzIGFuIGludmFsaWQgY2hhaW4gSUQpXG4gICAgLy8gICAtIGV2ZW50IChcIm5vTmV0d29ya1wiIGlzIG5vdCByZS10aHJvd24gaW4gcHJvdmlkZXIucmVhZHk7IG90aGVyd2lzZSB0aHJvd24pXG4gICAgRXJyb3JDb2RlW1wiTkVUV09SS19FUlJPUlwiXSA9IFwiTkVUV09SS19FUlJPUlwiO1xuICAgIC8vIFNvbWUgc29ydCBvZiBiYWQgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyXG4gICAgRXJyb3JDb2RlW1wiU0VSVkVSX0VSUk9SXCJdID0gXCJTRVJWRVJfRVJST1JcIjtcbiAgICAvLyBUaW1lb3V0XG4gICAgRXJyb3JDb2RlW1wiVElNRU9VVFwiXSA9IFwiVElNRU9VVFwiO1xuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBPcGVyYXRpb25hbCAgRXJyb3JzXG4gICAgLy8gQnVmZmVyIE92ZXJydW5cbiAgICBFcnJvckNvZGVbXCJCVUZGRVJfT1ZFUlJVTlwiXSA9IFwiQlVGRkVSX09WRVJSVU5cIjtcbiAgICAvLyBOdW1lcmljIEZhdWx0XG4gICAgLy8gICAtIG9wZXJhdGlvbjogdGhlIG9wZXJhdGlvbiBiZWluZyBleGVjdXRlZFxuICAgIC8vICAgLSBmYXVsdDogdGhlIHJlYXNvbiB0aGlzIGZhdWx0ZWRcbiAgICBFcnJvckNvZGVbXCJOVU1FUklDX0ZBVUxUXCJdID0gXCJOVU1FUklDX0ZBVUxUXCI7XG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIEFyZ3VtZW50IEVycm9yc1xuICAgIC8vIE1pc3NpbmcgbmV3IG9wZXJhdG9yIHRvIGFuIG9iamVjdFxuICAgIC8vICAtIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSBjbGFzc1xuICAgIEVycm9yQ29kZVtcIk1JU1NJTkdfTkVXXCJdID0gXCJNSVNTSU5HX05FV1wiO1xuICAgIC8vIEludmFsaWQgYXJndW1lbnQgKGUuZy4gdmFsdWUgaXMgaW5jb21wYXRpYmxlIHdpdGggdHlwZSkgdG8gYSBmdW5jdGlvbjpcbiAgICAvLyAgIC0gYXJndW1lbnQ6IFRoZSBhcmd1bWVudCBuYW1lIHRoYXQgd2FzIGludmFsaWRcbiAgICAvLyAgIC0gdmFsdWU6IFRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnRcbiAgICBFcnJvckNvZGVbXCJJTlZBTElEX0FSR1VNRU5UXCJdID0gXCJJTlZBTElEX0FSR1VNRU5UXCI7XG4gICAgLy8gTWlzc2luZyBhcmd1bWVudCB0byBhIGZ1bmN0aW9uOlxuICAgIC8vICAgLSBjb3VudDogVGhlIG51bWJlciBvZiBhcmd1bWVudHMgcmVjZWl2ZWRcbiAgICAvLyAgIC0gZXhwZWN0ZWRDb3VudDogVGhlIG51bWJlciBvZiBhcmd1bWVudHMgZXhwZWN0ZWRcbiAgICBFcnJvckNvZGVbXCJNSVNTSU5HX0FSR1VNRU5UXCJdID0gXCJNSVNTSU5HX0FSR1VNRU5UXCI7XG4gICAgLy8gVG9vIG1hbnkgYXJndW1lbnRzXG4gICAgLy8gICAtIGNvdW50OiBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyByZWNlaXZlZFxuICAgIC8vICAgLSBleHBlY3RlZENvdW50OiBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBleHBlY3RlZFxuICAgIEVycm9yQ29kZVtcIlVORVhQRUNURURfQVJHVU1FTlRcIl0gPSBcIlVORVhQRUNURURfQVJHVU1FTlRcIjtcbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gQmxvY2tjaGFpbiBFcnJvcnNcbiAgICAvLyBDYWxsIGV4Y2VwdGlvblxuICAgIC8vICAtIHRyYW5zYWN0aW9uOiB0aGUgdHJhbnNhY3Rpb25cbiAgICAvLyAgLSBhZGRyZXNzPzogdGhlIGNvbnRyYWN0IGFkZHJlc3NcbiAgICAvLyAgLSBhcmdzPzogVGhlIGFyZ3VtZW50cyBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb25cbiAgICAvLyAgLSBtZXRob2Q/OiBUaGUgU29saWRpdHkgbWV0aG9kIHNpZ25hdHVyZVxuICAgIC8vICAtIGVycm9yU2lnbmF0dXJlPzogVGhlIEVJUDg0OCBlcnJvciBzaWduYXR1cmVcbiAgICAvLyAgLSBlcnJvckFyZ3M/OiBUaGUgRUlQODQ4IGVycm9yIHBhcmFtZXRlcnNcbiAgICAvLyAgLSByZWFzb246IFRoZSByZWFzb24gKG9ubHkgZm9yIEVJUDg0OCBcIkVycm9yKHN0cmluZylcIilcbiAgICBFcnJvckNvZGVbXCJDQUxMX0VYQ0VQVElPTlwiXSA9IFwiQ0FMTF9FWENFUFRJT05cIjtcbiAgICAvLyBJbnN1ZmZpY2llbiBmdW5kcyAoPCB2YWx1ZSArIGdhc0xpbWl0ICogZ2FzUHJpY2UpXG4gICAgLy8gICAtIHRyYW5zYWN0aW9uOiB0aGUgdHJhbnNhY3Rpb24gYXR0ZW1wdGVkXG4gICAgRXJyb3JDb2RlW1wiSU5TVUZGSUNJRU5UX0ZVTkRTXCJdID0gXCJJTlNVRkZJQ0lFTlRfRlVORFNcIjtcbiAgICAvLyBOb25jZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWRcbiAgICAvLyAgIC0gdHJhbnNhY3Rpb246IHRoZSB0cmFuc2FjdGlvbiBhdHRlbXB0ZWRcbiAgICBFcnJvckNvZGVbXCJOT05DRV9FWFBJUkVEXCJdID0gXCJOT05DRV9FWFBJUkVEXCI7XG4gICAgLy8gVGhlIHJlcGxhY2VtZW50IGZlZSBmb3IgdGhlIHRyYW5zYWN0aW9uIGlzIHRvbyBsb3dcbiAgICAvLyAgIC0gdHJhbnNhY3Rpb246IHRoZSB0cmFuc2FjdGlvbiBhdHRlbXB0ZWRcbiAgICBFcnJvckNvZGVbXCJSRVBMQUNFTUVOVF9VTkRFUlBSSUNFRFwiXSA9IFwiUkVQTEFDRU1FTlRfVU5ERVJQUklDRURcIjtcbiAgICAvLyBUaGUgZ2FzIGxpbWl0IGNvdWxkIG5vdCBiZSBlc3RpbWF0ZWRcbiAgICAvLyAgIC0gdHJhbnNhY3Rpb246IHRoZSB0cmFuc2FjdGlvbiBwYXNzZWQgdG8gZXN0aW1hdGVHYXNcbiAgICBFcnJvckNvZGVbXCJVTlBSRURJQ1RBQkxFX0dBU19MSU1JVFwiXSA9IFwiVU5QUkVESUNUQUJMRV9HQVNfTElNSVRcIjtcbn0pKEVycm9yQ29kZSB8fCAoRXJyb3JDb2RlID0ge30pKTtcbjtcbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICAgIGNvbnN0cnVjdG9yKHZlcnNpb24pIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwidmVyc2lvblwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZlcnNpb24sXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9sb2cobG9nTGV2ZWwsIGFyZ3MpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBsb2dMZXZlbC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoTG9nTGV2ZWxzW2xldmVsXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgbG9nIGxldmVsIG5hbWVcIiwgXCJsb2dMZXZlbFwiLCBsb2dMZXZlbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9sb2dMZXZlbCA+IExvZ0xldmVsc1tsZXZlbF0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgICB9XG4gICAgZGVidWcoLi4uYXJncykge1xuICAgICAgICB0aGlzLl9sb2coTG9nZ2VyLmxldmVscy5ERUJVRywgYXJncyk7XG4gICAgfVxuICAgIGluZm8oLi4uYXJncykge1xuICAgICAgICB0aGlzLl9sb2coTG9nZ2VyLmxldmVscy5JTkZPLCBhcmdzKTtcbiAgICB9XG4gICAgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2xvZyhMb2dnZXIubGV2ZWxzLldBUk5JTkcsIGFyZ3MpO1xuICAgIH1cbiAgICBtYWtlRXJyb3IobWVzc2FnZSwgY29kZSwgcGFyYW1zKSB7XG4gICAgICAgIC8vIEVycm9ycyBhcmUgYmVpbmcgY2Vuc29yZWRcbiAgICAgICAgaWYgKF9jZW5zb3JFcnJvcnMpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VFcnJvcihcImNlbnNvcmVkIGVycm9yXCIsIGNvZGUsIHt9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIGNvZGUgPSBMb2dnZXIuZXJyb3JzLlVOS05PV05fRVJST1I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXJhbXMpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VEZXRhaWxzID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKHBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VEZXRhaWxzLnB1c2goa2V5ICsgXCI9XCIgKyBKU09OLnN0cmluZ2lmeShwYXJhbXNba2V5XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZURldGFpbHMucHVzaChrZXkgKyBcIj1cIiArIEpTT04uc3RyaW5naWZ5KHBhcmFtc1trZXldLnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lc3NhZ2VEZXRhaWxzLnB1c2goYGNvZGU9JHtjb2RlfWApO1xuICAgICAgICBtZXNzYWdlRGV0YWlscy5wdXNoKGB2ZXJzaW9uPSR7dGhpcy52ZXJzaW9ufWApO1xuICAgICAgICBjb25zdCByZWFzb24gPSBtZXNzYWdlO1xuICAgICAgICBpZiAobWVzc2FnZURldGFpbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IFwiIChcIiArIG1lc3NhZ2VEZXRhaWxzLmpvaW4oXCIsIFwiKSArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIEBUT0RPOiBBbnk/P1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgZXJyb3IucmVhc29uID0gcmVhc29uO1xuICAgICAgICBlcnJvci5jb2RlID0gY29kZTtcbiAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGVycm9yW2tleV0gPSBwYXJhbXNba2V5XTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9XG4gICAgdGhyb3dFcnJvcihtZXNzYWdlLCBjb2RlLCBwYXJhbXMpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5tYWtlRXJyb3IobWVzc2FnZSwgY29kZSwgcGFyYW1zKTtcbiAgICB9XG4gICAgdGhyb3dBcmd1bWVudEVycm9yKG1lc3NhZ2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRocm93RXJyb3IobWVzc2FnZSwgTG9nZ2VyLmVycm9ycy5JTlZBTElEX0FSR1VNRU5ULCB7XG4gICAgICAgICAgICBhcmd1bWVudDogbmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXNzZXJ0KGNvbmRpdGlvbiwgbWVzc2FnZSwgY29kZSwgcGFyYW1zKSB7XG4gICAgICAgIGlmICghIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlLCBjb2RlLCBwYXJhbXMpO1xuICAgIH1cbiAgICBhc3NlcnRBcmd1bWVudChjb25kaXRpb24sIG1lc3NhZ2UsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICghIWNvbmRpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyb3dBcmd1bWVudEVycm9yKG1lc3NhZ2UsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgY2hlY2tOb3JtYWxpemUobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJwbGF0Zm9ybSBtaXNzaW5nIFN0cmluZy5wcm90b3R5cGUubm9ybWFsaXplXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9ub3JtYWxpemVFcnJvcikge1xuICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKFwicGxhdGZvcm0gbWlzc2luZyBTdHJpbmcucHJvdG90eXBlLm5vcm1hbGl6ZVwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJTdHJpbmcucHJvdG90eXBlLm5vcm1hbGl6ZVwiLCBmb3JtOiBfbm9ybWFsaXplRXJyb3JcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrU2FmZVVpbnQ1Myh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gXCJ2YWx1ZSBub3Qgc2FmZVwiO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMHgxZmZmZmZmZmZmZmZmZikge1xuICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKG1lc3NhZ2UsIExvZ2dlci5lcnJvcnMuTlVNRVJJQ19GQVVMVCwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJjaGVja1NhZmVJbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgZmF1bHQ6IFwib3V0LW9mLXNhZmUtcmFuZ2VcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAlIDEpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihtZXNzYWdlLCBMb2dnZXIuZXJyb3JzLk5VTUVSSUNfRkFVTFQsIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwiY2hlY2tTYWZlSW50ZWdlclwiLFxuICAgICAgICAgICAgICAgIGZhdWx0OiBcIm5vbi1pbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjaGVja0FyZ3VtZW50Q291bnQoY291bnQsIGV4cGVjdGVkQ291bnQsIG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBcIjogXCIgKyBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvdW50IDwgZXhwZWN0ZWRDb3VudCkge1xuICAgICAgICAgICAgdGhpcy50aHJvd0Vycm9yKFwibWlzc2luZyBhcmd1bWVudFwiICsgbWVzc2FnZSwgTG9nZ2VyLmVycm9ycy5NSVNTSU5HX0FSR1VNRU5ULCB7XG4gICAgICAgICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkQ291bnQ6IGV4cGVjdGVkQ291bnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IGV4cGVjdGVkQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihcInRvbyBtYW55IGFyZ3VtZW50c1wiICsgbWVzc2FnZSwgTG9nZ2VyLmVycm9ycy5VTkVYUEVDVEVEX0FSR1VNRU5ULCB7XG4gICAgICAgICAgICAgICAgY291bnQ6IGNvdW50LFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkQ291bnQ6IGV4cGVjdGVkQ291bnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrTmV3KHRhcmdldCwga2luZCkge1xuICAgICAgICBpZiAodGFyZ2V0ID09PSBPYmplY3QgfHwgdGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihcIm1pc3NpbmcgbmV3XCIsIExvZ2dlci5lcnJvcnMuTUlTU0lOR19ORVcsIHsgbmFtZToga2luZC5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNoZWNrQWJzdHJhY3QodGFyZ2V0LCBraW5kKSB7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IGtpbmQpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihcImNhbm5vdCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyBcIiArIEpTT04uc3RyaW5naWZ5KGtpbmQubmFtZSkgKyBcIiBkaXJlY3RseTsgdXNlIGEgc3ViLWNsYXNzXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7IG5hbWU6IHRhcmdldC5uYW1lLCBvcGVyYXRpb246IFwibmV3XCIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGFyZ2V0ID09PSBPYmplY3QgfHwgdGFyZ2V0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dFcnJvcihcIm1pc3NpbmcgbmV3XCIsIExvZ2dlci5lcnJvcnMuTUlTU0lOR19ORVcsIHsgbmFtZToga2luZC5uYW1lIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBnbG9iYWxMb2dnZXIoKSB7XG4gICAgICAgIGlmICghX2dsb2JhbExvZ2dlcikge1xuICAgICAgICAgICAgX2dsb2JhbExvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9nbG9iYWxMb2dnZXI7XG4gICAgfVxuICAgIHN0YXRpYyBzZXRDZW5zb3JzaGlwKGNlbnNvcnNoaXAsIHBlcm1hbmVudCkge1xuICAgICAgICBpZiAoIWNlbnNvcnNoaXAgJiYgcGVybWFuZW50KSB7XG4gICAgICAgICAgICB0aGlzLmdsb2JhbExvZ2dlcigpLnRocm93RXJyb3IoXCJjYW5ub3QgcGVybWFuZW50bHkgZGlzYWJsZSBjZW5zb3JzaGlwXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInNldENlbnNvcnNoaXBcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9wZXJtYW5lbnRDZW5zb3JFcnJvcnMpIHtcbiAgICAgICAgICAgIGlmICghY2Vuc29yc2hpcCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2xvYmFsTG9nZ2VyKCkudGhyb3dFcnJvcihcImVycm9yIGNlbnNvcnNoaXAgcGVybWFuZW50XCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInNldENlbnNvcnNoaXBcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgX2NlbnNvckVycm9ycyA9ICEhY2Vuc29yc2hpcDtcbiAgICAgICAgX3Blcm1hbmVudENlbnNvckVycm9ycyA9ICEhcGVybWFuZW50O1xuICAgIH1cbiAgICBzdGF0aWMgc2V0TG9nTGV2ZWwobG9nTGV2ZWwpIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBMb2dMZXZlbHNbbG9nTGV2ZWwudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIGlmIChsZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgICBMb2dnZXIuZ2xvYmFsTG9nZ2VyKCkud2FybihcImludmFsaWQgbG9nIGxldmVsIC0gXCIgKyBsb2dMZXZlbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2xvZ0xldmVsID0gbGV2ZWw7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tKHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXIodmVyc2lvbik7XG4gICAgfVxufVxuTG9nZ2VyLmVycm9ycyA9IEVycm9yQ29kZTtcbkxvZ2dlci5sZXZlbHMgPSBMb2dMZXZlbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJuZXR3b3Jrcy81LjAuOFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG47XG5mdW5jdGlvbiBpc1JlbmV0d29ya2FibGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiAodmFsdWUucmVuZXR3b3JrKSA9PT0gXCJmdW5jdGlvblwiKTtcbn1cbmZ1bmN0aW9uIGV0aERlZmF1bHRQcm92aWRlcihuZXR3b3JrKSB7XG4gICAgY29uc3QgZnVuYyA9IGZ1bmN0aW9uIChwcm92aWRlcnMsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyTGlzdCA9IFtdO1xuICAgICAgICBpZiAocHJvdmlkZXJzLkluZnVyYVByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyTGlzdC5wdXNoKG5ldyBwcm92aWRlcnMuSW5mdXJhUHJvdmlkZXIobmV0d29yaywgb3B0aW9ucy5pbmZ1cmEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3ZpZGVycy5FdGhlcnNjYW5Qcm92aWRlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlckxpc3QucHVzaChuZXcgcHJvdmlkZXJzLkV0aGVyc2NhblByb3ZpZGVyKG5ldHdvcmssIG9wdGlvbnMuZXRoZXJzY2FuKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm92aWRlcnMuQWxjaGVteVByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyTGlzdC5wdXNoKG5ldyBwcm92aWRlcnMuQWxjaGVteVByb3ZpZGVyKG5ldHdvcmssIG9wdGlvbnMuYWxjaGVteSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdmlkZXJzLlBvY2tldFByb3ZpZGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb3ZpZGVyTGlzdC5wdXNoKG5ldyBwcm92aWRlcnMuUG9ja2V0UHJvdmlkZXIobmV0d29yaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdmlkZXJzLkNsb3VkZmxhcmVQcm92aWRlcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcm92aWRlckxpc3QucHVzaChuZXcgcHJvdmlkZXJzLkNsb3VkZmxhcmVQcm92aWRlcihuZXR3b3JrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm92aWRlckxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvdmlkZXJzLkZhbGxiYWNrUHJvdmlkZXIpIHtcbiAgICAgICAgICAgIGxldCBxdW9ydW0gPSAxO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVvcnVtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBxdW9ydW0gPSBvcHRpb25zLnF1b3J1bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG5ldHdvcmsgPT09IFwiaG9tZXN0ZWFkXCIpIHtcbiAgICAgICAgICAgICAgICBxdW9ydW0gPSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBwcm92aWRlcnMuRmFsbGJhY2tQcm92aWRlcihwcm92aWRlckxpc3QsIHF1b3J1bSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3ZpZGVyTGlzdFswXTtcbiAgICB9O1xuICAgIGZ1bmMucmVuZXR3b3JrID0gZnVuY3Rpb24gKG5ldHdvcmspIHtcbiAgICAgICAgcmV0dXJuIGV0aERlZmF1bHRQcm92aWRlcihuZXR3b3JrKTtcbiAgICB9O1xuICAgIHJldHVybiBmdW5jO1xufVxuZnVuY3Rpb24gZXRjRGVmYXVsdFByb3ZpZGVyKHVybCwgbmV0d29yaykge1xuICAgIGNvbnN0IGZ1bmMgPSBmdW5jdGlvbiAocHJvdmlkZXJzLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChwcm92aWRlcnMuSnNvblJwY1Byb3ZpZGVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHByb3ZpZGVycy5Kc29uUnBjUHJvdmlkZXIodXJsLCBuZXR3b3JrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICAgIGZ1bmMucmVuZXR3b3JrID0gZnVuY3Rpb24gKG5ldHdvcmspIHtcbiAgICAgICAgcmV0dXJuIGV0Y0RlZmF1bHRQcm92aWRlcih1cmwsIG5ldHdvcmspO1xuICAgIH07XG4gICAgcmV0dXJuIGZ1bmM7XG59XG5jb25zdCBob21lc3RlYWQgPSB7XG4gICAgY2hhaW5JZDogMSxcbiAgICBlbnNBZGRyZXNzOiBcIjB4MDAwMDAwMDAwMDBDMkUwNzRlQzY5QTBkRmIyOTk3QkE2QzdkMmUxZVwiLFxuICAgIG5hbWU6IFwiaG9tZXN0ZWFkXCIsXG4gICAgX2RlZmF1bHRQcm92aWRlcjogZXRoRGVmYXVsdFByb3ZpZGVyKFwiaG9tZXN0ZWFkXCIpXG59O1xuY29uc3Qgcm9wc3RlbiA9IHtcbiAgICBjaGFpbklkOiAzLFxuICAgIGVuc0FkZHJlc3M6IFwiMHgwMDAwMDAwMDAwMEMyRTA3NGVDNjlBMGRGYjI5OTdCQTZDN2QyZTFlXCIsXG4gICAgbmFtZTogXCJyb3BzdGVuXCIsXG4gICAgX2RlZmF1bHRQcm92aWRlcjogZXRoRGVmYXVsdFByb3ZpZGVyKFwicm9wc3RlblwiKVxufTtcbmNvbnN0IGNsYXNzaWNNb3Jkb3IgPSB7XG4gICAgY2hhaW5JZDogNjMsXG4gICAgbmFtZTogXCJjbGFzc2ljTW9yZG9yXCIsXG4gICAgX2RlZmF1bHRQcm92aWRlcjogZXRjRGVmYXVsdFByb3ZpZGVyKFwiaHR0cHM6Ly93d3cuZXRoZXJjbHVzdGVyLmNvbS9tb3Jkb3JcIiwgXCJjbGFzc2ljTW9yZG9yXCIpXG59O1xuY29uc3QgbmV0d29ya3MgPSB7XG4gICAgdW5zcGVjaWZpZWQ6IHtcbiAgICAgICAgY2hhaW5JZDogMCxcbiAgICAgICAgbmFtZTogXCJ1bnNwZWNpZmllZFwiXG4gICAgfSxcbiAgICBob21lc3RlYWQ6IGhvbWVzdGVhZCxcbiAgICBtYWlubmV0OiBob21lc3RlYWQsXG4gICAgbW9yZGVuOiB7XG4gICAgICAgIGNoYWluSWQ6IDIsXG4gICAgICAgIG5hbWU6IFwibW9yZGVuXCJcbiAgICB9LFxuICAgIHJvcHN0ZW46IHJvcHN0ZW4sXG4gICAgdGVzdG5ldDogcm9wc3RlbixcbiAgICByaW5rZWJ5OiB7XG4gICAgICAgIGNoYWluSWQ6IDQsXG4gICAgICAgIGVuc0FkZHJlc3M6IFwiMHgwMDAwMDAwMDAwMEMyRTA3NGVDNjlBMGRGYjI5OTdCQTZDN2QyZTFlXCIsXG4gICAgICAgIG5hbWU6IFwicmlua2VieVwiLFxuICAgICAgICBfZGVmYXVsdFByb3ZpZGVyOiBldGhEZWZhdWx0UHJvdmlkZXIoXCJyaW5rZWJ5XCIpXG4gICAgfSxcbiAgICBrb3Zhbjoge1xuICAgICAgICBjaGFpbklkOiA0MixcbiAgICAgICAgbmFtZTogXCJrb3ZhblwiLFxuICAgICAgICBfZGVmYXVsdFByb3ZpZGVyOiBldGhEZWZhdWx0UHJvdmlkZXIoXCJrb3ZhblwiKVxuICAgIH0sXG4gICAgZ29lcmxpOiB7XG4gICAgICAgIGNoYWluSWQ6IDUsXG4gICAgICAgIGVuc0FkZHJlc3M6IFwiMHgwMDAwMDAwMDAwMEMyRTA3NGVDNjlBMGRGYjI5OTdCQTZDN2QyZTFlXCIsXG4gICAgICAgIG5hbWU6IFwiZ29lcmxpXCIsXG4gICAgICAgIF9kZWZhdWx0UHJvdmlkZXI6IGV0aERlZmF1bHRQcm92aWRlcihcImdvZXJsaVwiKVxuICAgIH0sXG4gICAgLy8gRVRDIChTZWU6ICMzNTEpXG4gICAgY2xhc3NpYzoge1xuICAgICAgICBjaGFpbklkOiA2MSxcbiAgICAgICAgbmFtZTogXCJjbGFzc2ljXCIsXG4gICAgICAgIF9kZWZhdWx0UHJvdmlkZXI6IGV0Y0RlZmF1bHRQcm92aWRlcihcImh0dHBzOi8vd3d3LmV0aGVyY2x1c3Rlci5jb20vZXRjXCIsIFwiY2xhc3NpY1wiKVxuICAgIH0sXG4gICAgY2xhc3NpY01vcmRlbjoge1xuICAgICAgICBjaGFpbklkOiA2MixcbiAgICAgICAgbmFtZTogXCJjbGFzc2ljTW9yZGVuXCIsXG4gICAgfSxcbiAgICBjbGFzc2ljTW9yZG9yOiBjbGFzc2ljTW9yZG9yLFxuICAgIGNsYXNzaWNUZXN0bmV0OiBjbGFzc2ljTW9yZG9yLFxuICAgIGNsYXNzaWNLb3R0aToge1xuICAgICAgICBjaGFpbklkOiA2LFxuICAgICAgICBuYW1lOiBcImNsYXNzaWNLb3R0aVwiLFxuICAgICAgICBfZGVmYXVsdFByb3ZpZGVyOiBldGNEZWZhdWx0UHJvdmlkZXIoXCJodHRwczovL3d3dy5ldGhlcmNsdXN0ZXIuY29tL2tvdHRpXCIsIFwiY2xhc3NpY0tvdHRpXCIpXG4gICAgfSxcbn07XG4vKipcbiAqICBnZXROZXR3b3JrXG4gKlxuICogIENvbnZlcnRzIGEgbmFtZWQgY29tbW9uIG5ldHdvcmtzIG9yIGNoYWluIElEIChuZXR3b3JrIElEKSB0byBhIE5ldHdvcmtcbiAqICBhbmQgdmVyaWZpZXMgYSBuZXR3b3JrIGlzIGEgdmFsaWQgTmV0d29yay4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXR3b3JrKG5ldHdvcmspIHtcbiAgICAvLyBObyBuZXR3b3JrIChudWxsKVxuICAgIGlmIChuZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKG5ldHdvcmspID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBuZXR3b3Jrcykge1xuICAgICAgICAgICAgY29uc3Qgc3RhbmRhcmQgPSBuZXR3b3Jrc1tuYW1lXTtcbiAgICAgICAgICAgIGlmIChzdGFuZGFyZC5jaGFpbklkID09PSBuZXR3b3JrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc3RhbmRhcmQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhaW5JZDogc3RhbmRhcmQuY2hhaW5JZCxcbiAgICAgICAgICAgICAgICAgICAgZW5zQWRkcmVzczogKHN0YW5kYXJkLmVuc0FkZHJlc3MgfHwgbnVsbCksXG4gICAgICAgICAgICAgICAgICAgIF9kZWZhdWx0UHJvdmlkZXI6IChzdGFuZGFyZC5fZGVmYXVsdFByb3ZpZGVyIHx8IG51bGwpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hhaW5JZDogbmV0d29yayxcbiAgICAgICAgICAgIG5hbWU6IFwidW5rbm93blwiXG4gICAgICAgIH07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKG5ldHdvcmspID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHN0YW5kYXJkID0gbmV0d29ya3NbbmV0d29ya107XG4gICAgICAgIGlmIChzdGFuZGFyZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogc3RhbmRhcmQubmFtZSxcbiAgICAgICAgICAgIGNoYWluSWQ6IHN0YW5kYXJkLmNoYWluSWQsXG4gICAgICAgICAgICBlbnNBZGRyZXNzOiBzdGFuZGFyZC5lbnNBZGRyZXNzLFxuICAgICAgICAgICAgX2RlZmF1bHRQcm92aWRlcjogKHN0YW5kYXJkLl9kZWZhdWx0UHJvdmlkZXIgfHwgbnVsbClcbiAgICAgICAgfTtcbiAgICB9XG4gICAgY29uc3Qgc3RhbmRhcmQgPSBuZXR3b3Jrc1tuZXR3b3JrLm5hbWVdO1xuICAgIC8vIE5vdCBhIHN0YW5kYXJkIG5ldHdvcms7IGNoZWNrIHRoYXQgaXQgaXMgYSB2YWxpZCBuZXR3b3JrIGluIGdlbmVyYWxcbiAgICBpZiAoIXN0YW5kYXJkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKG5ldHdvcmsuY2hhaW5JZCkgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIG5ldHdvcmsgY2hhaW5JZFwiLCBcIm5ldHdvcmtcIiwgbmV0d29yayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldHdvcms7XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgY2hhaW5JZCBtYXRjaGVzIHRoZSBleHBlY3RlZCBuZXR3b3JrIGNoYWluSWQgKG9yIGlzIDA7IGRpc2FibGUgRUlQLTE1NSlcbiAgICBpZiAobmV0d29yay5jaGFpbklkICE9PSAwICYmIG5ldHdvcmsuY2hhaW5JZCAhPT0gc3RhbmRhcmQuY2hhaW5JZCkge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwibmV0d29yayBjaGFpbklkIG1pc21hdGNoXCIsIFwibmV0d29ya1wiLCBuZXR3b3JrKTtcbiAgICB9XG4gICAgLy8gQFRPRE86IEluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gYWRkIGFuIGF0dGFjaCBmdW5jdGlvbiB0byBhIGRlZmF1bHRQcm92aWRlclxuICAgIC8vIGNsYXNzIGFuZCBtb3ZlIHRoZSBfZGVmYXVsdFByb3ZpZGVyIGludGVybmFsIHRvIHRoaXMgZmlsZSAoZXh0ZW5kIE5ldHdvcmspXG4gICAgbGV0IGRlZmF1bHRQcm92aWRlciA9IG5ldHdvcmsuX2RlZmF1bHRQcm92aWRlciB8fCBudWxsO1xuICAgIGlmIChkZWZhdWx0UHJvdmlkZXIgPT0gbnVsbCAmJiBzdGFuZGFyZC5fZGVmYXVsdFByb3ZpZGVyKSB7XG4gICAgICAgIGlmIChpc1JlbmV0d29ya2FibGUoc3RhbmRhcmQuX2RlZmF1bHRQcm92aWRlcikpIHtcbiAgICAgICAgICAgIGRlZmF1bHRQcm92aWRlciA9IHN0YW5kYXJkLl9kZWZhdWx0UHJvdmlkZXIucmVuZXR3b3JrKG5ldHdvcmspO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmYXVsdFByb3ZpZGVyID0gc3RhbmRhcmQuX2RlZmF1bHRQcm92aWRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBTdGFuZGFyZCBOZXR3b3JrIChhbGxvdyBvdmVycmlkaW5nIHRoZSBFTlMgYWRkcmVzcylcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBuZXR3b3JrLm5hbWUsXG4gICAgICAgIGNoYWluSWQ6IHN0YW5kYXJkLmNoYWluSWQsXG4gICAgICAgIGVuc0FkZHJlc3M6IChuZXR3b3JrLmVuc0FkZHJlc3MgfHwgc3RhbmRhcmQuZW5zQWRkcmVzcyB8fCBudWxsKSxcbiAgICAgICAgX2RlZmF1bHRQcm92aWRlcjogZGVmYXVsdFByb3ZpZGVyXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCB7IHBia2RmMiB9IGZyb20gXCIuL3Bia2RmMlwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgaGV4bGlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgY29tcHV0ZUhtYWMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc2hhMlwiO1xuZXhwb3J0IGZ1bmN0aW9uIHBia2RmMihwYXNzd29yZCwgc2FsdCwgaXRlcmF0aW9ucywga2V5bGVuLCBoYXNoQWxnb3JpdGhtKSB7XG4gICAgcGFzc3dvcmQgPSBhcnJheWlmeShwYXNzd29yZCk7XG4gICAgc2FsdCA9IGFycmF5aWZ5KHNhbHQpO1xuICAgIGxldCBoTGVuO1xuICAgIGxldCBsID0gMTtcbiAgICBjb25zdCBESyA9IG5ldyBVaW50OEFycmF5KGtleWxlbik7XG4gICAgY29uc3QgYmxvY2sxID0gbmV3IFVpbnQ4QXJyYXkoc2FsdC5sZW5ndGggKyA0KTtcbiAgICBibG9jazEuc2V0KHNhbHQpO1xuICAgIC8vc2FsdC5jb3B5KGJsb2NrMSwgMCwgMCwgc2FsdC5sZW5ndGgpXG4gICAgbGV0IHI7XG4gICAgbGV0IFQ7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbDsgaSsrKSB7XG4gICAgICAgIC8vYmxvY2sxLndyaXRlVUludDMyQkUoaSwgc2FsdC5sZW5ndGgpXG4gICAgICAgIGJsb2NrMVtzYWx0Lmxlbmd0aF0gPSAoaSA+PiAyNCkgJiAweGZmO1xuICAgICAgICBibG9jazFbc2FsdC5sZW5ndGggKyAxXSA9IChpID4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGJsb2NrMVtzYWx0Lmxlbmd0aCArIDJdID0gKGkgPj4gOCkgJiAweGZmO1xuICAgICAgICBibG9jazFbc2FsdC5sZW5ndGggKyAzXSA9IGkgJiAweGZmO1xuICAgICAgICAvL2xldCBVID0gY3JlYXRlSG1hYyhwYXNzd29yZCkudXBkYXRlKGJsb2NrMSkuZGlnZXN0KCk7XG4gICAgICAgIGxldCBVID0gYXJyYXlpZnkoY29tcHV0ZUhtYWMoaGFzaEFsZ29yaXRobSwgcGFzc3dvcmQsIGJsb2NrMSkpO1xuICAgICAgICBpZiAoIWhMZW4pIHtcbiAgICAgICAgICAgIGhMZW4gPSBVLmxlbmd0aDtcbiAgICAgICAgICAgIFQgPSBuZXcgVWludDhBcnJheShoTGVuKTtcbiAgICAgICAgICAgIGwgPSBNYXRoLmNlaWwoa2V5bGVuIC8gaExlbik7XG4gICAgICAgICAgICByID0ga2V5bGVuIC0gKGwgLSAxKSAqIGhMZW47XG4gICAgICAgIH1cbiAgICAgICAgLy9VLmNvcHkoVCwgMCwgMCwgaExlbilcbiAgICAgICAgVC5zZXQoVSk7XG4gICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgaXRlcmF0aW9uczsgaisrKSB7XG4gICAgICAgICAgICAvL1UgPSBjcmVhdGVIbWFjKHBhc3N3b3JkKS51cGRhdGUoVSkuZGlnZXN0KCk7XG4gICAgICAgICAgICBVID0gYXJyYXlpZnkoY29tcHV0ZUhtYWMoaGFzaEFsZ29yaXRobSwgcGFzc3dvcmQsIFUpKTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaExlbjsgaysrKVxuICAgICAgICAgICAgICAgIFRba10gXj0gVVtrXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZXN0UG9zID0gKGkgLSAxKSAqIGhMZW47XG4gICAgICAgIGNvbnN0IGxlbiA9IChpID09PSBsID8gciA6IGhMZW4pO1xuICAgICAgICAvL1QuY29weShESywgZGVzdFBvcywgMCwgbGVuKVxuICAgICAgICBESy5zZXQoYXJyYXlpZnkoVCkuc2xpY2UoMCwgbGVuKSwgZGVzdFBvcyk7XG4gICAgfVxuICAgIHJldHVybiBoZXhsaWZ5KERLKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBia2RmMi5qcy5tYXAiLCJleHBvcnQgY29uc3QgdmVyc2lvbiA9IFwicHJvcGVydGllcy81LjAuOFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSZWFkT25seShvYmplY3QsIG5hbWUsIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcbn1cbi8vIENyYXdsIHVwIHRoZSBjb25zdHJ1Y3RvciBjaGFpbiB0byBmaW5kIGEgc3RhdGljIG1ldGhvZFxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXRpYyhjdG9yLCBrZXkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMyOyBpKyspIHtcbiAgICAgICAgaWYgKGN0b3Jba2V5XSkge1xuICAgICAgICAgICAgcmV0dXJuIGN0b3Jba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWN0b3IucHJvdG90eXBlIHx8IHR5cGVvZiAoY3Rvci5wcm90b3R5cGUpICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb3BlcnRpZXMob2JqZWN0KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3Qua2V5cyhvYmplY3QpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbigodikgPT4gKHsga2V5OiBrZXksIHZhbHVlOiB2IH0pKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSB5aWVsZCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIHJldHVybiByZXN1bHRzLnJlZHVjZSgoYWNjdW0sIHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgYWNjdW1bKHJlc3VsdC5rZXkpXSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSwge30pO1xuICAgIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMpIHtcbiAgICBpZiAoIW9iamVjdCB8fCB0eXBlb2YgKG9iamVjdCkgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgb2JqZWN0XCIsIFwib2JqZWN0XCIsIG9iamVjdCk7XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKG9iamVjdCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmICghcHJvcGVydGllc1trZXldKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBvYmplY3Qga2V5IC0gXCIgKyBrZXksIFwidHJhbnNhY3Rpb246XCIgKyBrZXksIG9iamVjdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29weShvYmplY3QpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmNvbnN0IG9wYXF1ZSA9IHsgYmlnaW50OiB0cnVlLCBib29sZWFuOiB0cnVlLCBcImZ1bmN0aW9uXCI6IHRydWUsIG51bWJlcjogdHJ1ZSwgc3RyaW5nOiB0cnVlIH07XG5mdW5jdGlvbiBfaXNGcm96ZW4ob2JqZWN0KSB7XG4gICAgLy8gT3BhcXVlIG9iamVjdHMgYXJlIG5vdCBtdXRhYmxlLCBzbyBzYWZlIHRvIGNvcHkgYnkgYXNzaWdubWVudFxuICAgIGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCB8fCBvYmplY3QgPT09IG51bGwgfHwgb3BhcXVlW3R5cGVvZiAob2JqZWN0KV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkgfHwgdHlwZW9mIChvYmplY3QpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmICghT2JqZWN0LmlzRnJvemVuKG9iamVjdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIV9pc0Zyb3plbihvYmplY3Rba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgQ2Fubm90IGRlZXBDb3B5ICR7dHlwZW9mIChvYmplY3QpfWAsIFwib2JqZWN0XCIsIG9iamVjdCk7XG59XG4vLyBSZXR1cm5zIGEgbmV3IGNvcHkgb2Ygb2JqZWN0LCBzdWNoIHRoYXQgbm8gcHJvcGVydGllcyBtYXkgYmUgcmVwbGFjZWQuXG4vLyBOZXcgcHJvcGVydGllcyBtYXkgYmUgYWRkZWQgb25seSB0byBvYmplY3RzLlxuZnVuY3Rpb24gX2RlZXBDb3B5KG9iamVjdCkge1xuICAgIGlmIChfaXNGcm96ZW4ob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cbiAgICAvLyBBcnJheXMgYXJlIG11dGFibGUsIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGEgY29weVxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUob2JqZWN0Lm1hcCgoaXRlbSkgPT4gZGVlcENvcHkoaXRlbSkpKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiAob2JqZWN0KSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHJlc3VsdCwga2V5LCBkZWVwQ29weSh2YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKGBDYW5ub3QgZGVlcENvcHkgJHt0eXBlb2YgKG9iamVjdCl9YCwgXCJvYmplY3RcIiwgb2JqZWN0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ29weShvYmplY3QpIHtcbiAgICByZXR1cm4gX2RlZXBDb3B5KG9iamVjdCk7XG59XG5leHBvcnQgY2xhc3MgRGVzY3JpcHRpb24ge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gaW5mbykge1xuICAgICAgICAgICAgdGhpc1trZXldID0gZGVlcENvcHkoaW5mb1trZXldKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImV4cG9ydCBjb25zdCB2ZXJzaW9uID0gXCJwcm92aWRlcnMvNS4wLjIzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGRlZmluZVJlYWRPbmx5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IHNob3dUaHJvdHRsZU1lc3NhZ2UgfSBmcm9tIFwiLi9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IFdlYlNvY2tldFByb3ZpZGVyIH0gZnJvbSBcIi4vd2Vic29ja2V0LXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBVcmxKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi91cmwtanNvbi1ycGMtcHJvdmlkZXJcIjtcbi8vIFRoaXMga2V5IHdhcyBwcm92aWRlZCB0byBldGhlcnMuanMgYnkgQWxjaGVteSB0byBiZSB1c2VkIGJ5IHRoZVxuLy8gZGVmYXVsdCBwcm92aWRlciwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgZm9yIHlvdXIgb3duXG4vLyBwcm9kdWN0aW9uIGVudmlyb25tZW50cywgdGhhdCB5b3UgYWNxdWlyZSB5b3VyIG93biBBUEkga2V5IGF0OlxuLy8gICBodHRwczovL2Rhc2hib2FyZC5hbGNoZW15YXBpLmlvXG5jb25zdCBkZWZhdWx0QXBpS2V5ID0gXCJfZ2c3d1NTaTBLTUJzZEtuR1ZmSER1ZXE2eE1COUVrQ1wiO1xuZXhwb3J0IGNsYXNzIEFsY2hlbXlXZWJTb2NrZXRQcm92aWRlciBleHRlbmRzIFdlYlNvY2tldFByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihuZXR3b3JrLCBhcGlLZXkpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgQWxjaGVteVByb3ZpZGVyKG5ldHdvcmssIGFwaUtleSk7XG4gICAgICAgIGNvbnN0IHVybCA9IHByb3ZpZGVyLmNvbm5lY3Rpb24udXJsLnJlcGxhY2UoL15odHRwL2ksIFwid3NcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKFwiLmFsY2hlbXlhcGkuXCIsIFwiLndzLmFsY2hlbXlhcGkuXCIpO1xuICAgICAgICBzdXBlcih1cmwsIHByb3ZpZGVyLm5ldHdvcmspO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImFwaUtleVwiLCBwcm92aWRlci5hcGlLZXkpO1xuICAgIH1cbiAgICBpc0NvbW11bml0eVJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYXBpS2V5ID09PSBkZWZhdWx0QXBpS2V5KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgQWxjaGVteVByb3ZpZGVyIGV4dGVuZHMgVXJsSnNvblJwY1Byb3ZpZGVyIHtcbiAgICBzdGF0aWMgZ2V0V2ViU29ja2V0UHJvdmlkZXIobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIHJldHVybiBuZXcgQWxjaGVteVdlYlNvY2tldFByb3ZpZGVyKG5ldHdvcmssIGFwaUtleSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRBcGlLZXkoYXBpS2V5KSB7XG4gICAgICAgIGlmIChhcGlLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRBcGlLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFwaUtleSAmJiB0eXBlb2YgKGFwaUtleSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGFwaUtleVwiLCBcImFwaUtleVwiLCBhcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcGlLZXk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRVcmwobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIGxldCBob3N0ID0gbnVsbDtcbiAgICAgICAgc3dpdGNoIChuZXR3b3JrLm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJob21lc3RlYWRcIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJldGgtbWFpbm5ldC5hbGNoZW15YXBpLmlvL3YyL1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJvcHN0ZW5cIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJldGgtcm9wc3Rlbi5hbGNoZW15YXBpLmlvL3YyL1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJpbmtlYnlcIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJldGgtcmlua2VieS5hbGNoZW15YXBpLmlvL3YyL1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdvZXJsaVwiOlxuICAgICAgICAgICAgICAgIGhvc3QgPSBcImV0aC1nb2VybGkuYWxjaGVteWFwaS5pby92Mi9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJrb3ZhblwiOlxuICAgICAgICAgICAgICAgIGhvc3QgPSBcImV0aC1rb3Zhbi5hbGNoZW15YXBpLmlvL3YyL1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiLCBcIm5ldHdvcmtcIiwgYXJndW1lbnRzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsb3dHemlwOiB0cnVlLFxuICAgICAgICAgICAgdXJsOiAoXCJodHRwczovXCIgKyBcIi9cIiArIGhvc3QgKyBhcGlLZXkpLFxuICAgICAgICAgICAgdGhyb3R0bGVDYWxsYmFjazogKGF0dGVtcHQsIHVybCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhcGlLZXkgPT09IGRlZmF1bHRBcGlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2hvd1Rocm90dGxlTWVzc2FnZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpc0NvbW11bml0eVJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuYXBpS2V5ID09PSBkZWZhdWx0QXBpS2V5KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1hbGNoZW15LXByb3ZpZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBGb3JrRXZlbnQsIFByb3ZpZGVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2Fic3RyYWN0LXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBCYXNlNTggfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmFzZXhcIjtcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBjb25jYXQsIGhleENvbmNhdCwgaGV4RGF0YUxlbmd0aCwgaGV4RGF0YVNsaWNlLCBoZXhsaWZ5LCBoZXhWYWx1ZSwgaGV4WmVyb1BhZCwgaXNIZXhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IEhhc2haZXJvIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbmFtZWhhc2ggfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvaGFzaFwiO1xuaW1wb3J0IHsgZ2V0TmV0d29yayB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9uZXR3b3Jrc1wiO1xuaW1wb3J0IHsgZGVmaW5lUmVhZE9ubHksIGdldFN0YXRpYywgcmVzb2x2ZVByb3BlcnRpZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3NoYTJcIjtcbmltcG9ydCB7IHRvVXRmOEJ5dGVzLCB0b1V0ZjhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgcG9sbCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC93ZWJcIjtcbmltcG9ydCBiZWNoMzIgZnJvbSBcImJlY2gzMlwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuaW1wb3J0IHsgRm9ybWF0dGVyIH0gZnJvbSBcIi4vZm9ybWF0dGVyXCI7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEV2ZW50IFNlcmlhbGl6ZWluZ1xuZnVuY3Rpb24gY2hlY2tUb3BpYyh0b3BpYykge1xuICAgIGlmICh0b3BpYyA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICB9XG4gICAgaWYgKGhleERhdGFMZW5ndGgodG9waWMpICE9PSAzMikge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCB0b3BpY1wiLCBcInRvcGljXCIsIHRvcGljKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvcGljLnRvTG93ZXJDYXNlKCk7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVUb3BpY3ModG9waWNzKSB7XG4gICAgLy8gUmVtb3ZlIHRyYWlsaW5nIG51bGwgQU5ELXRvcGljczsgdGhleSBhcmUgcmVkdW5kYW50XG4gICAgdG9waWNzID0gdG9waWNzLnNsaWNlKCk7XG4gICAgd2hpbGUgKHRvcGljcy5sZW5ndGggPiAwICYmIHRvcGljc1t0b3BpY3MubGVuZ3RoIC0gMV0gPT0gbnVsbCkge1xuICAgICAgICB0b3BpY3MucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB0b3BpY3MubWFwKCh0b3BpYykgPT4ge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b3BpYykpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgdHJhY2sgdW5pcXVlIE9SLXRvcGljc1xuICAgICAgICAgICAgY29uc3QgdW5pcXVlID0ge307XG4gICAgICAgICAgICB0b3BpYy5mb3JFYWNoKCh0b3BpYykgPT4ge1xuICAgICAgICAgICAgICAgIHVuaXF1ZVtjaGVja1RvcGljKHRvcGljKV0gPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBUaGUgb3JkZXIgb2YgT1ItdG9waWNzIGRvZXMgbm90IG1hdHRlclxuICAgICAgICAgICAgY29uc3Qgc29ydGVkID0gT2JqZWN0LmtleXModW5pcXVlKTtcbiAgICAgICAgICAgIHNvcnRlZC5zb3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gc29ydGVkLmpvaW4oXCJ8XCIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrVG9waWModG9waWMpO1xuICAgICAgICB9XG4gICAgfSkuam9pbihcIiZcIik7XG59XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVRvcGljcyhkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YS5zcGxpdCgvJi9nKS5tYXAoKHRvcGljKSA9PiB7XG4gICAgICAgIGlmICh0b3BpYyA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdG9waWMuc3BsaXQoXCJ8XCIpLm1hcCgodG9waWMpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoKHRvcGljID09PSBcIm51bGxcIikgPyBudWxsIDogdG9waWMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuICgoY29tcHMubGVuZ3RoID09PSAxKSA/IGNvbXBzWzBdIDogY29tcHMpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0RXZlbnRUYWcoZXZlbnROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiAoZXZlbnROYW1lKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBldmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGhleERhdGFMZW5ndGgoZXZlbnROYW1lKSA9PT0gMzIpIHtcbiAgICAgICAgICAgIHJldHVybiBcInR4OlwiICsgZXZlbnROYW1lO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE5hbWUuaW5kZXhPZihcIjpcIikgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gZXZlbnROYW1lO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnROYW1lKSkge1xuICAgICAgICByZXR1cm4gXCJmaWx0ZXI6KjpcIiArIHNlcmlhbGl6ZVRvcGljcyhldmVudE5hbWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChGb3JrRXZlbnQuaXNGb3JrRXZlbnQoZXZlbnROYW1lKSkge1xuICAgICAgICBsb2dnZXIud2FybihcIm5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChldmVudE5hbWUgJiYgdHlwZW9mIChldmVudE5hbWUpID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBcImZpbHRlcjpcIiArIChldmVudE5hbWUuYWRkcmVzcyB8fCBcIipcIikgKyBcIjpcIiArIHNlcmlhbGl6ZVRvcGljcyhldmVudE5hbWUudG9waWNzIHx8IFtdKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBldmVudCAtIFwiICsgZXZlbnROYW1lKTtcbn1cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gSGVscGVyIE9iamVjdFxuZnVuY3Rpb24gZ2V0VGltZSgpIHtcbiAgICByZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbn1cbmZ1bmN0aW9uIHN0YWxsKGR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgZHVyYXRpb24pO1xuICAgIH0pO1xufVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBQcm92aWRlciBPYmplY3Rcbi8qKlxuICogIEV2ZW50VHlwZVxuICogICAtIFwiYmxvY2tcIlxuICogICAtIFwicG9sbFwiXG4gKiAgIC0gXCJkaWRQb2xsXCJcbiAqICAgLSBcInBlbmRpbmdcIlxuICogICAtIFwiZXJyb3JcIlxuICogICAtIFwibmV0d29ya1wiXG4gKiAgIC0gZmlsdGVyXG4gKiAgIC0gdG9waWNzIGFycmF5XG4gKiAgIC0gdHJhbnNhY3Rpb24gaGFzaFxuICovXG5jb25zdCBQb2xsYWJsZUV2ZW50cyA9IFtcImJsb2NrXCIsIFwibmV0d29ya1wiLCBcInBlbmRpbmdcIiwgXCJwb2xsXCJdO1xuZXhwb3J0IGNsYXNzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih0YWcsIGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwidGFnXCIsIHRhZyk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwibGlzdGVuZXJcIiwgbGlzdGVuZXIpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIm9uY2VcIiwgb25jZSk7XG4gICAgfVxuICAgIGdldCBldmVudCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ0eFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc2g7XG4gICAgICAgICAgICBjYXNlIFwiZmlsdGVyXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRhZztcbiAgICB9XG4gICAgZ2V0IHR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZy5zcGxpdChcIjpcIilbMF07XG4gICAgfVxuICAgIGdldCBoYXNoKCkge1xuICAgICAgICBjb25zdCBjb21wcyA9IHRoaXMudGFnLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgaWYgKGNvbXBzWzBdICE9PSBcInR4XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wc1sxXTtcbiAgICB9XG4gICAgZ2V0IGZpbHRlcigpIHtcbiAgICAgICAgY29uc3QgY29tcHMgPSB0aGlzLnRhZy5zcGxpdChcIjpcIik7XG4gICAgICAgIGlmIChjb21wc1swXSAhPT0gXCJmaWx0ZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IGNvbXBzWzFdO1xuICAgICAgICBjb25zdCB0b3BpY3MgPSBkZXNlcmlhbGl6ZVRvcGljcyhjb21wc1syXSk7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHt9O1xuICAgICAgICBpZiAodG9waWNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpbHRlci50b3BpY3MgPSB0b3BpY3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZHJlc3MgJiYgYWRkcmVzcyAhPT0gXCIqXCIpIHtcbiAgICAgICAgICAgIGZpbHRlci5hZGRyZXNzID0gYWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyO1xuICAgIH1cbiAgICBwb2xsYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnRhZy5pbmRleE9mKFwiOlwiKSA+PSAwIHx8IFBvbGxhYmxlRXZlbnRzLmluZGV4T2YodGhpcy50YWcpID49IDApO1xuICAgIH1cbn1cbjtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXRvc2hpbGFicy9zbGlwcy9ibG9iL21hc3Rlci9zbGlwLTAwNDQubWRcbmNvbnN0IGNvaW5JbmZvcyA9IHtcbiAgICBcIjBcIjogeyBzeW1ib2w6IFwiYnRjXCIsIHAycGtoOiAweDAwLCBwMnNoOiAweDA1LCBwcmVmaXg6IFwiYmNcIiB9LFxuICAgIFwiMlwiOiB7IHN5bWJvbDogXCJsdGNcIiwgcDJwa2g6IDB4MzAsIHAyc2g6IDB4MzIsIHByZWZpeDogXCJsdGNcIiB9LFxuICAgIFwiM1wiOiB7IHN5bWJvbDogXCJkb2dlXCIsIHAycGtoOiAweDFlLCBwMnNoOiAweDE2IH0sXG4gICAgXCI2MFwiOiB7IHN5bWJvbDogXCJldGhcIiwgaWxrOiBcImV0aFwiIH0sXG4gICAgXCI2MVwiOiB7IHN5bWJvbDogXCJldGNcIiwgaWxrOiBcImV0aFwiIH0sXG4gICAgXCI3MDBcIjogeyBzeW1ib2w6IFwieGRhaVwiLCBpbGs6IFwiZXRoXCIgfSxcbn07XG5mdW5jdGlvbiBieXRlczMyaWZ5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGhleFplcm9QYWQoQmlnTnVtYmVyLmZyb20odmFsdWUpLnRvSGV4U3RyaW5nKCksIDMyKTtcbn1cbi8vIENvbXB1dGUgdGhlIEJhc2U1OENoZWNrIGVuY29kZWQgZGF0YSAoY2hlY2tzdW0gaXMgZmlyc3QgNCBieXRlcyBvZiBzaGEyNTZkKVxuZnVuY3Rpb24gYmFzZTU4RW5jb2RlKGRhdGEpIHtcbiAgICByZXR1cm4gQmFzZTU4LmVuY29kZShjb25jYXQoW2RhdGEsIGhleERhdGFTbGljZShzaGEyNTYoc2hhMjU2KGRhdGEpKSwgMCwgNCldKSk7XG59XG5leHBvcnQgY2xhc3MgUmVzb2x2ZXIge1xuICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVyLCBhZGRyZXNzLCBuYW1lKSB7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIm5hbWVcIiwgbmFtZSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYWRkcmVzc1wiLCBwcm92aWRlci5mb3JtYXR0ZXIuYWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgfVxuICAgIF9mZXRjaEJ5dGVzKHNlbGVjdG9yLCBwYXJhbWV0ZXJzKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAvLyBrZWNjYWsyNTYoXCJhZGRyKGJ5dGVzMzIsdWludDI1NilcIilcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIHRvOiB0aGlzLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgZGF0YTogaGV4Q29uY2F0KFtzZWxlY3RvciwgbmFtZWhhc2godGhpcy5uYW1lKSwgKHBhcmFtZXRlcnMgfHwgXCIweFwiKV0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgdGhpcy5wcm92aWRlci5jYWxsKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IFwiMHhcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gQmlnTnVtYmVyLmZyb20oaGV4RGF0YVNsaWNlKHJlc3VsdCwgMCwgMzIpKS50b051bWJlcigpO1xuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gQmlnTnVtYmVyLmZyb20oaGV4RGF0YVNsaWNlKHJlc3VsdCwgb2Zmc2V0LCBvZmZzZXQgKyAzMikpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgICByZXR1cm4gaGV4RGF0YVNsaWNlKHJlc3VsdCwgb2Zmc2V0ICsgMzIsIG9mZnNldCArIDMyICsgbGVuZ3RoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRBZGRyZXNzKGNvaW5UeXBlLCBoZXhCeXRlcykge1xuICAgICAgICBjb25zdCBjb2luSW5mbyA9IGNvaW5JbmZvc1tTdHJpbmcoY29pblR5cGUpXTtcbiAgICAgICAgaWYgKGNvaW5JbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKGB1bnN1cHBvcnRlZCBjb2luIHR5cGU6ICR7Y29pblR5cGV9YCwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IGBnZXRBZGRyZXNzKCR7Y29pblR5cGV9KWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2luSW5mby5pbGsgPT09IFwiZXRoXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLmZvcm1hdHRlci5hZGRyZXNzKGhleEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBieXRlcyA9IGFycmF5aWZ5KGhleEJ5dGVzKTtcbiAgICAgICAgLy8gUDJQS0g6IE9QX0RVUCBPUF9IQVNIMTYwIDxwdWJLZXlIYXNoPiBPUF9FUVVBTFZFUklGWSBPUF9DSEVDS1NJR1xuICAgICAgICBpZiAoY29pbkluZm8ucDJwa2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcDJwa2ggPSBoZXhCeXRlcy5tYXRjaCgvXjB4NzZhOShbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXSopODhhYyQvKTtcbiAgICAgICAgICAgIGlmIChwMnBraCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHBhcnNlSW50KHAycGtoWzFdLCAxNik7XG4gICAgICAgICAgICAgICAgaWYgKHAycGtoWzJdLmxlbmd0aCA9PT0gbGVuZ3RoICogMiAmJiBsZW5ndGggPj0gMSAmJiBsZW5ndGggPD0gNzUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2U1OEVuY29kZShjb25jYXQoW1tjb2luSW5mby5wMnBraF0sIChcIjB4XCIgKyBwMnBraFsyXSldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFAyU0g6IE9QX0hBU0gxNjAgPHNjcmlwdEhhc2g+IE9QX0VRVUFMXG4gICAgICAgIGlmIChjb2luSW5mby5wMnNoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHAyc2ggPSBoZXhCeXRlcy5tYXRjaCgvXjB4YTkoWzAtOWEtZl1bMC05YS1mXSkoWzAtOWEtZl0qKTg3JC8pO1xuICAgICAgICAgICAgaWYgKHAyc2gpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChwMnNoWzFdLCAxNik7XG4gICAgICAgICAgICAgICAgaWYgKHAyc2hbMl0ubGVuZ3RoID09PSBsZW5ndGggKiAyICYmIGxlbmd0aCA+PSAxICYmIGxlbmd0aCA8PSA3NSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTU4RW5jb2RlKGNvbmNhdChbW2NvaW5JbmZvLnAyc2hdLCAoXCIweFwiICsgcDJzaFsyXSldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEJlY2gzMlxuICAgICAgICBpZiAoY29pbkluZm8ucHJlZml4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGJ5dGVzWzFdO1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDE0MS5tZWRpYXdpa2kjd2l0bmVzcy1wcm9ncmFtXG4gICAgICAgICAgICBsZXQgdmVyc2lvbiA9IGJ5dGVzWzBdO1xuICAgICAgICAgICAgaWYgKHZlcnNpb24gPT09IDB4MDApIHtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoICE9PSAyMCAmJiBsZW5ndGggIT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodmVyc2lvbiA+PSAwICYmIGJ5dGVzLmxlbmd0aCA9PT0gMiArIGxlbmd0aCAmJiBsZW5ndGggPj0gMSAmJiBsZW5ndGggPD0gNzUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IGJlY2gzMi50b1dvcmRzKGJ5dGVzLnNsaWNlKDIpKTtcbiAgICAgICAgICAgICAgICB3b3Jkcy51bnNoaWZ0KHZlcnNpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiBiZWNoMzIuZW5jb2RlKGNvaW5JbmZvLnByZWZpeCwgd29yZHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBnZXRBZGRyZXNzKGNvaW5UeXBlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBpZiAoY29pblR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvaW5UeXBlID0gNjA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBFdGhlcmV1bSwgdXNlIHRoZSBzdGFuZGFyZCBgYWRkcihieXRlczMyKWBcbiAgICAgICAgICAgIGlmIChjb2luVHlwZSA9PT0gNjApIHtcbiAgICAgICAgICAgICAgICAvLyBrZWNjYWsyNTYoXCJhZGRyKGJ5dGVzMzIpXCIpXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIHRvOiB0aGlzLmFkZHJlc3MsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IChcIjB4M2IzYjU3ZGVcIiArIG5hbWVoYXNoKHRoaXMubmFtZSkuc3Vic3RyaW5nKDIpKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgaGV4Qnl0ZXMgPSB5aWVsZCB0aGlzLnByb3ZpZGVyLmNhbGwodHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIC8vIE5vIGFkZHJlc3NcbiAgICAgICAgICAgICAgICBpZiAoaGV4Qnl0ZXMgPT09IFwiMHhcIiB8fCBoZXhCeXRlcyA9PT0gSGFzaFplcm8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLmZvcm1hdHRlci5jYWxsQWRkcmVzcyhoZXhCeXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBrZWNjYWsyNTYoXCJhZGRyKGJ5dGVzMzIsdWludDI1NlwiKVxuICAgICAgICAgICAgY29uc3QgaGV4Qnl0ZXMgPSB5aWVsZCB0aGlzLl9mZXRjaEJ5dGVzKFwiMHhmMWNiN2UwNlwiLCBieXRlczMyaWZ5KGNvaW5UeXBlKSk7XG4gICAgICAgICAgICAvLyBObyBhZGRyZXNzXG4gICAgICAgICAgICBpZiAoaGV4Qnl0ZXMgPT0gbnVsbCB8fCBoZXhCeXRlcyA9PT0gXCIweFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBhZGRyZXNzXG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5fZ2V0QWRkcmVzcyhjb2luVHlwZSwgaGV4Qnl0ZXMpO1xuICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKGBpbnZhbGlkIG9yIHVuc3VwcG9ydGVkIGNvaW4gZGF0YWAsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogYGdldEFkZHJlc3MoJHtjb2luVHlwZX0pYCxcbiAgICAgICAgICAgICAgICAgICAgY29pblR5cGU6IGNvaW5UeXBlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBoZXhCeXRlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRDb250ZW50SGFzaCgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIGtlY2NhazI1NihcImNvbnRlbnRoYXNoKClcIilcbiAgICAgICAgICAgIGNvbnN0IGhleEJ5dGVzID0geWllbGQgdGhpcy5fZmV0Y2hCeXRlcyhcIjB4YmMxYzU4ZDFcIik7XG4gICAgICAgICAgICAvLyBObyBjb250ZW50aGFzaFxuICAgICAgICAgICAgaWYgKGhleEJ5dGVzID09IG51bGwgfHwgaGV4Qnl0ZXMgPT09IFwiMHhcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSVBGUyAoQ0lEOiAxLCBUeXBlOiBEQUctUEIpXG4gICAgICAgICAgICBjb25zdCBpcGZzID0gaGV4Qnl0ZXMubWF0Y2goL14weGUzMDEwMTcwKChbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXVswLTlhLWZdKShbMC05YS1mXSopKSQvKTtcbiAgICAgICAgICAgIGlmIChpcGZzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gcGFyc2VJbnQoaXBmc1szXSwgMTYpO1xuICAgICAgICAgICAgICAgIGlmIChpcGZzWzRdLmxlbmd0aCA9PT0gbGVuZ3RoICogMikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJpcGZzOi9cXC9cIiArIEJhc2U1OC5lbmNvZGUoXCIweFwiICsgaXBmc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3dhcm0gKENJRDogMSwgVHlwZTogc3dhcm0tbWFuaWZlc3Q7IGhhc2gvbGVuZ3RoIGhhcmQtY29kZWQgdG8ga2VjY2FrMjU2LzMyKVxuICAgICAgICAgICAgY29uc3Qgc3dhcm0gPSBoZXhCeXRlcy5tYXRjaCgvXjB4ZTQwMTAxZmEwMTFiMjAoWzAtOWEtZl0qKSQvKTtcbiAgICAgICAgICAgIGlmIChzd2FybSkge1xuICAgICAgICAgICAgICAgIGlmIChzd2FybVsxXS5sZW5ndGggPT09ICgzMiAqIDIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJ6ejovXFwvXCIgKyBzd2FybVsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoYGludmFsaWQgb3IgdW5zdXBwb3J0ZWQgY29udGVudCBoYXNoIGRhdGFgLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJnZXRDb250ZW50SGFzaCgpXCIsXG4gICAgICAgICAgICAgICAgZGF0YTogaGV4Qnl0ZXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0VGV4dChrZXkpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFRoZSBrZXkgZW5jb2RlZCBhcyBwYXJhbWV0ZXIgdG8gZmV0Y2hCeXRlc1xuICAgICAgICAgICAgbGV0IGtleUJ5dGVzID0gdG9VdGY4Qnl0ZXMoa2V5KTtcbiAgICAgICAgICAgIC8vIFRoZSBub2RlaGFzaCBjb25zdW1lcyB0aGUgZmlyc3Qgc2xvdCwgc28gdGhlIHN0cmluZyBwb2ludGVyIHRhcmdldHNcbiAgICAgICAgICAgIC8vIG9mZnNldCA2NCwgd2l0aCB0aGUgbGVuZ3RoIGF0IG9mZnNldCA2NCBhbmQgZGF0YSBzdGFydGluZyBhdCBvZmZzZXQgOTZcbiAgICAgICAgICAgIGtleUJ5dGVzID0gY29uY2F0KFtieXRlczMyaWZ5KDY0KSwgYnl0ZXMzMmlmeShrZXlCeXRlcy5sZW5ndGgpLCBrZXlCeXRlc10pO1xuICAgICAgICAgICAgLy8gUGFkIHRvIHdvcmQtc2l6ZSAoMzIgYnl0ZXMpXG4gICAgICAgICAgICBpZiAoKGtleUJ5dGVzLmxlbmd0aCAlIDMyKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGtleUJ5dGVzID0gY29uY2F0KFtrZXlCeXRlcywgaGV4WmVyb1BhZChcIjB4XCIsIDMyIC0gKGtleS5sZW5ndGggJSAzMikpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBoZXhCeXRlcyA9IHlpZWxkIHRoaXMuX2ZldGNoQnl0ZXMoXCIweDU5ZDFkNDNjXCIsIGhleGxpZnkoa2V5Qnl0ZXMpKTtcbiAgICAgICAgICAgIGlmIChoZXhCeXRlcyA9PSBudWxsIHx8IGhleEJ5dGVzID09PSBcIjB4XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b1V0ZjhTdHJpbmcoaGV4Qnl0ZXMpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5sZXQgZGVmYXVsdEZvcm1hdHRlciA9IG51bGw7XG5sZXQgbmV4dFBvbGxJZCA9IDE7XG5leHBvcnQgY2xhc3MgQmFzZVByb3ZpZGVyIGV4dGVuZHMgUHJvdmlkZXIge1xuICAgIC8qKlxuICAgICAqICByZWFkeVxuICAgICAqXG4gICAgICogIEEgUHJvbWlzZTxOZXR3b3JrPiB0aGF0IHJlc29sdmVzIG9ubHkgb25jZSB0aGUgcHJvdmlkZXIgaXMgcmVhZHkuXG4gICAgICpcbiAgICAgKiAgU3ViLWNsYXNzZXMgdGhhdCBjYWxsIHRoZSBzdXBlciB3aXRoIGEgbmV0d29yayB3aXRob3V0IGEgY2hhaW5JZFxuICAgICAqICBNVVNUIHNldCB0aGlzLiBTdGFuZGFyZCBuYW1lZCBuZXR3b3JrcyBoYXZlIGEga25vd24gY2hhaW5JZC5cbiAgICAgKlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG5ldHdvcmspIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIFByb3ZpZGVyKTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gRXZlbnRzIGJlaW5nIGxpc3RlbmVkIHRvXG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IFtdO1xuICAgICAgICB0aGlzLl9lbWl0dGVkID0geyBibG9jazogLTIgfTtcbiAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSBuZXcudGFyZ2V0LmdldEZvcm1hdHRlcigpO1xuICAgICAgICAvLyBJZiBuZXR3b3JrIGlzIGFueSwgdGhpcyBQcm92aWRlciBhbGxvd3MgdGhlIHVuZGVybHlpbmdcbiAgICAgICAgLy8gbmV0d29yayB0byBjaGFuZ2UgZHluYW1pY2FsbHksIGFuZCB3ZSBhdXRvLWRldGVjdCB0aGVcbiAgICAgICAgLy8gY3VycmVudCBuZXR3b3JrXG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYW55TmV0d29ya1wiLCAobmV0d29yayA9PT0gXCJhbnlcIikpO1xuICAgICAgICBpZiAodGhpcy5hbnlOZXR3b3JrKSB7XG4gICAgICAgICAgICBuZXR3b3JrID0gdGhpcy5kZXRlY3ROZXR3b3JrKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ldHdvcmsgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICB0aGlzLl9uZXR3b3JrUHJvbWlzZSA9IG5ldHdvcms7XG4gICAgICAgICAgICAvLyBTcXVhc2ggYW55IFwidW5oYW5kbGVkIHByb21pc2VcIiBlcnJvcnM7IHRoYXQgZG8gbm90IG5lZWQgdG8gYmUgaGFuZGxlZFxuICAgICAgICAgICAgbmV0d29yay5jYXRjaCgoZXJyb3IpID0+IHsgfSk7XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIGluaXRpYWwgbmV0d29yayBzZXR0aW5nIChhc3luYylcbiAgICAgICAgICAgIHRoaXMuX3JlYWR5KCkuY2F0Y2goKGVycm9yKSA9PiB7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga25vd25OZXR3b3JrID0gZ2V0U3RhdGljKChuZXcudGFyZ2V0KSwgXCJnZXROZXR3b3JrXCIpKG5ldHdvcmspO1xuICAgICAgICAgICAgaWYgKGtub3duTmV0d29yaykge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX25ldHdvcmtcIiwga25vd25OZXR3b3JrKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJuZXR3b3JrXCIsIGtub3duTmV0d29yaywgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCBuZXR3b3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXhJbnRlcm5hbEJsb2NrTnVtYmVyID0gLTEwMjQ7XG4gICAgICAgIHRoaXMuX2xhc3RCbG9ja051bWJlciA9IC0yO1xuICAgICAgICB0aGlzLl9wb2xsaW5nSW50ZXJ2YWwgPSA0MDAwO1xuICAgICAgICB0aGlzLl9mYXN0UXVlcnlEYXRlID0gMDtcbiAgICB9XG4gICAgX3JlYWR5KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX25ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXR3b3JrID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmV0d29ya1Byb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgPSB5aWVsZCB0aGlzLl9uZXR3b3JrUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUcnkgdGhlIFByb3ZpZGVyJ3MgbmV0d29yayBkZXRlY3Rpb24gKHRoaXMgTVVTVCB0aHJvdyBpZiBpdCBjYW5ub3QpXG4gICAgICAgICAgICAgICAgaWYgKG5ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXR3b3JrID0geWllbGQgdGhpcy5kZXRlY3ROZXR3b3JrKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbjsgZXZlcnkgUHJvdmlkZXIgc3ViLWNsYXNzIHNob3VsZCBoYXZlXG4gICAgICAgICAgICAgICAgLy8gc3VnZ2VzdGVkIGEgbmV0d29yayBieSBoZXJlIChvciBoYXZlIHRocm93bikuXG4gICAgICAgICAgICAgICAgaWYgKCFuZXR3b3JrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwibm8gbmV0d29yayBkZXRlY3RlZFwiLCBMb2dnZXIuZXJyb3JzLlVOS05PV05fRVJST1IsIHt9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gUG9zc2libGUgdGhpcyBjYWxsIHN0YWNrZWQgc28gZG8gbm90IGNhbGwgZGVmaW5lUmVhZE9ubHkgYWdhaW5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmV0d29yayA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFueU5ldHdvcmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25ldHdvcmsgPSBuZXR3b3JrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfbmV0d29ya1wiLCBuZXR3b3JrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJuZXR3b3JrXCIsIG5ldHdvcmssIG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXR3b3JrO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gVGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIG1vc3QgcmVjZW50bHkgZXN0YWJsaXNoZWQgbmV0d29yay5cbiAgICAvLyBGb3IgXCJhbnlcIiwgdGhpcyBjYW4gY2hhbmdlIChhIFwibmV0d29ya1wiIGV2ZW50IGlzIGVtaXR0ZWQgYmVmb3JlXG4gICAgLy8gYW55IGNoYW5nZSBpcyByZWZlbGN0ZWQpOyBvdGhlcndpc2UgdGhpcyBjYW5ub3QgY2hhbmdlXG4gICAgZ2V0IHJlYWR5KCkge1xuICAgICAgICByZXR1cm4gcG9sbCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHkoKS50aGVuKChuZXR3b3JrKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldHdvcms7XG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV0d29yayBpc24ndCBydW5uaW5nIHlldCwgd2Ugd2lsbCB3YWl0XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IExvZ2dlci5lcnJvcnMuTkVUV09SS19FUlJPUiAmJiBlcnJvci5ldmVudCA9PT0gXCJub05ldHdvcmtcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQFRPRE86IFJlbW92ZSB0aGlzIGFuZCBqdXN0IGNyZWF0ZSBhIHNpbmdsZXRvbiBmb3JtYXR0ZXJcbiAgICBzdGF0aWMgZ2V0Rm9ybWF0dGVyKCkge1xuICAgICAgICBpZiAoZGVmYXVsdEZvcm1hdHRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICBkZWZhdWx0Rm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0dGVyO1xuICAgIH1cbiAgICAvLyBAVE9ETzogUmVtb3ZlIHRoaXMgYW5kIGp1c3QgdXNlIGdldE5ldHdvcmtcbiAgICBzdGF0aWMgZ2V0TmV0d29yayhuZXR3b3JrKSB7XG4gICAgICAgIHJldHVybiBnZXROZXR3b3JrKChuZXR3b3JrID09IG51bGwpID8gXCJob21lc3RlYWRcIiA6IG5ldHdvcmspO1xuICAgIH1cbiAgICAvLyBGZXRjaGVzIHRoZSBibG9ja051bWJlciwgYnV0IHdpbGwgcmV1c2UgYW55IHJlc3VsdCB0aGF0IGlzIGxlc3NcbiAgICAvLyB0aGFuIG1heEFnZSBvbGQgb3IgaGFzIGJlZW4gcmVxdWVzdGVkIHNpbmNlIHRoZSBsYXN0IHJlcXVlc3RcbiAgICBfZ2V0SW50ZXJuYWxCbG9ja051bWJlcihtYXhBZ2UpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuX3JlYWR5KCk7XG4gICAgICAgICAgICAvLyBBbGxvd2luZyBzdGFsZSBkYXRhIHVwIHRvIG1heEFnZSBvbGRcbiAgICAgICAgICAgIGlmIChtYXhBZ2UgPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2hpbGUgdGhlcmUgYXJlIHBlbmRpbmcgaW50ZXJuYWwgYmxvY2sgcmVxdWVzdHMuLi5cbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5faW50ZXJuYWxCbG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyAuLi5cInJlbWVtYmVyXCIgd2hpY2ggZmV0Y2ggd2Ugc3RhcnRlZCB3aXRoXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVybmFsQmxvY2tOdW1iZXIgPSB0aGlzLl9pbnRlcm5hbEJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3VsdCBpcyBub3QgdG9vIHN0YWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBpbnRlcm5hbEJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnZXRUaW1lKCkgLSByZXN1bHQucmVzcFRpbWUpIDw9IG1heEFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUb28gb2xkOyBmZXRjaCBhIG5ldyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZmV0Y2ggcmVqZWN0ZWQ7IGlmIHdlIGFyZSB0aGUgZmlyc3QgdG8gZ2V0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVqZWN0aW9uLCBkcm9wIHRocm91Z2ggc28gd2UgcmVwbGFjZSBpdCB3aXRoIGEgbmV3XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmZXRjaDsgYWxsIG90aGVycyBibG9ja2VkIHdpbGwgdGhlbiBnZXQgdGhhdCBmZXRjaFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd29uJ3QgbWF0Y2ggdGhlIG9uZSB0aGV5IFwicmVtZW1iZXJlZFwiIGFuZCBsb29wXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faW50ZXJuYWxCbG9ja051bWJlciA9PT0gaW50ZXJuYWxCbG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxVGltZSA9IGdldFRpbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrSW50ZXJuYWxCbG9ja051bWJlciA9IHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICBibG9ja051bWJlcjogdGhpcy5wZXJmb3JtKFwiZ2V0QmxvY2tOdW1iZXJcIiwge30pLFxuICAgICAgICAgICAgICAgIG5ldHdvcmtFcnJvcjogdGhpcy5nZXROZXR3b3JrKCkudGhlbigobmV0d29yaykgPT4gKG51bGwpLCAoZXJyb3IpID0+IChlcnJvcikpXG4gICAgICAgICAgICB9KS50aGVuKCh7IGJsb2NrTnVtYmVyLCBuZXR3b3JrRXJyb3IgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuZXR3b3JrRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVW5yZW1lbWJlciB0aGlzIGJhZCBpbnRlcm5hbCBibG9jayBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ludGVybmFsQmxvY2tOdW1iZXIgPT09IGNoZWNrSW50ZXJuYWxCbG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxCbG9ja051bWJlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV0d29ya0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXNwVGltZSA9IGdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICBibG9ja051bWJlciA9IEJpZ051bWJlci5mcm9tKGJsb2NrTnVtYmVyKS50b051bWJlcigpO1xuICAgICAgICAgICAgICAgIGlmIChibG9ja051bWJlciA8IHRoaXMuX21heEludGVybmFsQmxvY2tOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tOdW1iZXIgPSB0aGlzLl9tYXhJbnRlcm5hbEJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhJbnRlcm5hbEJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0RmFzdEJsb2NrTnVtYmVyKGJsb2NrTnVtYmVyKTsgLy8gQFRPRE86IFN0aWxsIG5lZWQgdGhpcz9cbiAgICAgICAgICAgICAgICByZXR1cm4geyBibG9ja051bWJlciwgcmVxVGltZSwgcmVzcFRpbWUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxCbG9ja051bWJlciA9IGNoZWNrSW50ZXJuYWxCbG9ja051bWJlcjtcbiAgICAgICAgICAgIC8vIFN3YWxsb3cgdW5oYW5kbGVkIGV4Y2VwdGlvbnM7IGlmIG5lZWRlZCB0aGV5IGFyZSBoYW5kbGVkIGVsc2Ugd2hlcmVcbiAgICAgICAgICAgIGNoZWNrSW50ZXJuYWxCbG9ja051bWJlci5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBudWxsIHRoZSBkZWFkIChyZWplY3RlZCkgZmV0Y2gsIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pbnRlcm5hbEJsb2NrTnVtYmVyID09PSBjaGVja0ludGVybmFsQmxvY2tOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxCbG9ja051bWJlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKHlpZWxkIGNoZWNrSW50ZXJuYWxCbG9ja051bWJlcikuYmxvY2tOdW1iZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwb2xsKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcG9sbElkID0gbmV4dFBvbGxJZCsrO1xuICAgICAgICAgICAgLy8gVHJhY2sgYWxsIHJ1bm5pbmcgcHJvbWlzZXMsIHNvIHdlIGNhbiB0cmlnZ2VyIGEgcG9zdC1wb2xsIG9uY2UgdGhleSBhcmUgY29tcGxldGVcbiAgICAgICAgICAgIGNvbnN0IHJ1bm5lcnMgPSBbXTtcbiAgICAgICAgICAgIGxldCBibG9ja051bWJlciA9IG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGJsb2NrTnVtYmVyID0geWllbGQgdGhpcy5fZ2V0SW50ZXJuYWxCbG9ja051bWJlcigxMDAgKyB0aGlzLnBvbGxpbmdJbnRlcnZhbCAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NldEZhc3RCbG9ja051bWJlcihibG9ja051bWJlcik7XG4gICAgICAgICAgICAvLyBFbWl0IGEgcG9sbCBldmVudCBhZnRlciB3ZSBoYXZlIHRoZSBsYXRlc3QgKGZhc3QpIGJsb2NrIG51bWJlclxuICAgICAgICAgICAgdGhpcy5lbWl0KFwicG9sbFwiLCBwb2xsSWQsIGJsb2NrTnVtYmVyKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBibG9jayBoYXMgbm90IGNoYW5nZWQsIG1laC5cbiAgICAgICAgICAgIGlmIChibG9ja051bWJlciA9PT0gdGhpcy5fbGFzdEJsb2NrTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGlkUG9sbFwiLCBwb2xsSWQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZpcnN0IHBvbGxpbmcgY3ljbGUsIHRyaWdnZXIgYSBcImJsb2NrXCIgZXZlbnRzXG4gICAgICAgICAgICBpZiAodGhpcy5fZW1pdHRlZC5ibG9jayA9PT0gLTIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVkLmJsb2NrID0gYmxvY2tOdW1iZXIgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKCh0aGlzLl9lbWl0dGVkLmJsb2NrKSAtIGJsb2NrTnVtYmVyKSA+IDEwMDApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcIm5ldHdvcmsgYmxvY2sgc2tldyBkZXRlY3RlZDsgc2tpcHBpbmcgYmxvY2sgZXZlbnRzXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGxvZ2dlci5tYWtlRXJyb3IoXCJuZXR3b3JrIGJsb2NrIHNrZXcgZGV0ZWN0ZWRcIiwgTG9nZ2VyLmVycm9ycy5ORVRXT1JLX0VSUk9SLCB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrTnVtYmVyOiBibG9ja051bWJlcixcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwiYmxvY2tTa2V3XCIsXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQmxvY2tOdW1iZXI6IHRoaXMuX2VtaXR0ZWQuYmxvY2tcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiYmxvY2tcIiwgYmxvY2tOdW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm90aWZ5IGFsbCBsaXN0ZW5lciBmb3IgZWFjaCBibG9jayB0aGF0IGhhcyBwYXNzZWRcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fZW1pdHRlZC5ibG9jayArIDE7IGkgPD0gYmxvY2tOdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJibG9ja1wiLCBpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaGUgZW1pdHRlZCBibG9jayB3YXMgdXBkYXRlZCwgY2hlY2sgZm9yIG9ic29sZXRlIGV2ZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZWQuYmxvY2sgIT09IGJsb2NrTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlZC5ibG9jayA9IGJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2VtaXR0ZWQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmxvY2sgZXZlbnQgZG9lcyBub3QgZXhwaXJlXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYmxvY2tcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBibG9jayB3ZSB3ZXJlIGF0IHdoZW4gd2UgZW1pdHRlZCB0aGlzIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50QmxvY2tOdW1iZXIgPSB0aGlzLl9lbWl0dGVkW2tleV07XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBnYXJiYWdlIGNvbGxlY3QgcGVuZGluZyB0cmFuc2FjdGlvbnMgb3IgYmxvY2tzIGhlcmVcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhleSBzaG91bGQgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgYnkgdGhlIFByb3ZpZGVyIHdoZW4gc2V0dGluZ1xuICAgICAgICAgICAgICAgICAgICAvLyBcInBlbmRpbmdcIiBldmVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50QmxvY2tOdW1iZXIgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gRXZpY3QgYW55IHRyYW5zYWN0aW9uIGhhc2hlcyBvciBibG9jayBoYXNoZXMgb3ZlciAxMiBibG9ja3NcbiAgICAgICAgICAgICAgICAgICAgLy8gb2xkLCBzaW5jZSB0aGV5IHNob3VsZCBub3QgcmV0dXJuIG51bGwgYW55d2F5c1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tOdW1iZXIgLSBldmVudEJsb2NrTnVtYmVyID4gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9lbWl0dGVkW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZpcnN0IHBvbGxpbmcgY3ljbGVcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXN0QmxvY2tOdW1iZXIgPT09IC0yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdEJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXIgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmluZCBhbGwgdHJhbnNhY3Rpb24gaGFzaGVzIHdlIGFyZSB3YWl0aW5nIG9uXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInR4XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2ggPSBldmVudC5oYXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bm5lciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KGhhc2gpLnRoZW4oKHJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY2VpcHQgfHwgcmVjZWlwdC5ibG9ja051bWJlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVkW1widDpcIiArIGhhc2hdID0gcmVjZWlwdC5ibG9ja051bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoaGFzaCwgcmVjZWlwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpOyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5lcnMucHVzaChydW5uZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZpbHRlclwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBldmVudC5maWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZnJvbUJsb2NrID0gdGhpcy5fbGFzdEJsb2NrTnVtYmVyICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci50b0Jsb2NrID0gYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBydW5uZXIgPSB0aGlzLmdldExvZ3MoZmlsdGVyKS50aGVuKChsb2dzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlZFtcImI6XCIgKyBsb2cuYmxvY2tIYXNoXSA9IGxvZy5ibG9ja051bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlZFtcInQ6XCIgKyBsb2cudHJhbnNhY3Rpb25IYXNoXSA9IGxvZy5ibG9ja051bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KGZpbHRlciwgbG9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4geyB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcik7IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmVycy5wdXNoKHJ1bm5lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fbGFzdEJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAvLyBPbmNlIGFsbCBldmVudHMgZm9yIHRoaXMgbG9vcCBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBlbWl0IFwiZGlkUG9sbFwiXG4gICAgICAgICAgICBQcm9taXNlLmFsbChydW5uZXJzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkaWRQb2xsXCIsIHBvbGxJZCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsgdGhpcy5lbWl0KFwiZXJyb3JcIiwgZXJyb3IpOyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIERlcHJlY2F0ZWQ7IGRvIG5vdCB1c2UgdGhpc1xuICAgIHJlc2V0RXZlbnRzQmxvY2soYmxvY2tOdW1iZXIpIHtcbiAgICAgICAgdGhpcy5fbGFzdEJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXIgLSAxO1xuICAgICAgICBpZiAodGhpcy5wb2xsaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBvbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgbmV0d29yaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldHdvcms7XG4gICAgfVxuICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBxdWVyeSB0aGUgbmV0d29yayBpZiB0aGUgdW5kZXJseWluZyBuZXR3b3JrXG4gICAgLy8gY2FuIGNoYW5nZSwgc3VjaCBhcyB3aGVuIGNvbm5lY3RlZCB0byBhIEpTT04tUlBDIGJhY2tlbmRcbiAgICBkZXRlY3ROZXR3b3JrKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwicHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBuZXR3b3JrIGRldGVjdGlvblwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJwcm92aWRlci5kZXRlY3ROZXR3b3JrXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TmV0d29yaygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSB5aWVsZCB0aGlzLl9yZWFkeSgpO1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgbmV0d29yazsgdGhpcyBpc1xuICAgICAgICAgICAgLy8gb25seSBhbiBleHRlcm5hbCBjYWxsIGZvciBiYWNrZW5kcyB3aGljaCBjYW4gaGF2ZSB0aGUgdW5kZXJseWluZ1xuICAgICAgICAgICAgLy8gbmV0d29yayBjaGFuZ2Ugc3BvbnRhbmVvdXNseVxuICAgICAgICAgICAgY29uc3QgY3VycmVudE5ldHdvcmsgPSB5aWVsZCB0aGlzLmRldGVjdE5ldHdvcmsoKTtcbiAgICAgICAgICAgIGlmIChuZXR3b3JrLmNoYWluSWQgIT09IGN1cnJlbnROZXR3b3JrLmNoYWluSWQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgYWxsb3dpbmcgbmV0d29yayBjaGFuZ2VzLCB0aGluZ3MgY2FuIGdldCBjb21wbGV4IGZhc3Q7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBpZiB5b3UgdXNlIFwiYW55XCJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbnlOZXR3b3JrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25ldHdvcmsgPSBjdXJyZW50TmV0d29yaztcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgYWxsIGludGVybmFsIGJsb2NrIG51bWJlciBndWFyZHMgYW5kIGNhY2hlc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0QmxvY2tOdW1iZXIgPSAtMjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFzdEJsb2NrTnVtYmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFzdEJsb2NrTnVtYmVyUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zhc3RRdWVyeURhdGUgPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVkLmJsb2NrID0gLTI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21heEludGVybmFsQmxvY2tOdW1iZXIgPSAtMTAyNDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxCbG9ja051bWJlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBcIm5ldHdvcmtcIiBldmVudCBNVVNUIGhhcHBlbiBiZWZvcmUgdGhpcyBtZXRob2QgcmVzb2x2ZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gYW55IGV2ZW50cyBoYXZlIGEgY2hhbmNlIHRvIHVucmVnaXN0ZXIsIHNvIHdlIHN0YWxsIGFuXG4gICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgZXZlbnQgbG9vcCBiZWZvcmUgcmV0dXJuaW5nIGZyb20gL3RoaXMvIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwibmV0d29ya1wiLCBjdXJyZW50TmV0d29yaywgbmV0d29yayk7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0YWxsKDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmV0d29yaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBsb2dnZXIubWFrZUVycm9yKFwidW5kZXJseWluZyBuZXR3b3JrIGNoYW5nZWRcIiwgTG9nZ2VyLmVycm9ycy5ORVRXT1JLX0VSUk9SLCB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcImNoYW5nZWRcIixcbiAgICAgICAgICAgICAgICAgICAgbmV0d29yazogbmV0d29yayxcbiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWROZXR3b3JrOiBjdXJyZW50TmV0d29ya1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXR3b3JrO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGJsb2NrTnVtYmVyKCkge1xuICAgICAgICB0aGlzLl9nZXRJbnRlcm5hbEJsb2NrTnVtYmVyKDEwMCArIHRoaXMucG9sbGluZ0ludGVydmFsIC8gMikudGhlbigoYmxvY2tOdW1iZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NldEZhc3RCbG9ja051bWJlcihibG9ja051bWJlcik7XG4gICAgICAgIH0sIChlcnJvcikgPT4geyB9KTtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9mYXN0QmxvY2tOdW1iZXIgIT0gbnVsbCkgPyB0aGlzLl9mYXN0QmxvY2tOdW1iZXIgOiAtMTtcbiAgICB9XG4gICAgZ2V0IHBvbGxpbmcoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fcG9sbGVyICE9IG51bGwpO1xuICAgIH1cbiAgICBzZXQgcG9sbGluZyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgJiYgIXRoaXMuX3BvbGxlcikge1xuICAgICAgICAgICAgdGhpcy5fcG9sbGVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aGlzLnBvbGwoKTsgfSwgdGhpcy5wb2xsaW5nSW50ZXJ2YWwpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9ib290c3RyYXBQb2xsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYm9vdHN0cmFwUG9sbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgYmxvY2sgYWRkaXRpb25hbCBwb2xscyB1bnRpbCB0aGUgcG9sbGluZyBpbnRlcnZhbFxuICAgICAgICAgICAgICAgICAgICAvLyBpcyBkb25lLCB0byBwcmV2ZW50IG92ZXJ3aGVsbWluZyB0aGUgcG9sbCBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ib290c3RyYXBQb2xsID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBwb2xsaW5nIHdhcyBkaXNhYmxlZCwgc29tZXRoaW5nIG1heSByZXF1aXJlIGEgcG9rZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugc3RhcnRpbmcgdGhlIGJvb3RzdHJhcCBwb2xsIGFuZCBpdCB3YXMgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcG9sbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2xsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBvdXQgdGhlIGJvb3RzdHJhcCBzbyB3ZSBjYW4gZG8gYW5vdGhlclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYm9vdHN0cmFwUG9sbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghdmFsdWUgJiYgdGhpcy5fcG9sbGVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX3BvbGxlcik7XG4gICAgICAgICAgICB0aGlzLl9wb2xsZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBwb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIHNldCBwb2xsaW5nSW50ZXJ2YWwodmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpICE9PSBcIm51bWJlclwiIHx8IHZhbHVlIDw9IDAgfHwgcGFyc2VJbnQoU3RyaW5nKHZhbHVlKSkgIT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgcG9sbGluZyBpbnRlcnZhbFwiKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX3BvbGxlcikge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9wb2xsZXIpO1xuICAgICAgICAgICAgdGhpcy5fcG9sbGVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyB0aGlzLnBvbGwoKTsgfSwgdGhpcy5fcG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfZ2V0RmFzdEJsb2NrTnVtYmVyKCkge1xuICAgICAgICBjb25zdCBub3cgPSBnZXRUaW1lKCk7XG4gICAgICAgIC8vIFN0YWxlIGJsb2NrIG51bWJlciwgcmVxdWVzdCBhIG5ld2VyIHZhbHVlXG4gICAgICAgIGlmICgobm93IC0gdGhpcy5fZmFzdFF1ZXJ5RGF0ZSkgPiAyICogdGhpcy5fcG9sbGluZ0ludGVydmFsKSB7XG4gICAgICAgICAgICB0aGlzLl9mYXN0UXVlcnlEYXRlID0gbm93O1xuICAgICAgICAgICAgdGhpcy5fZmFzdEJsb2NrTnVtYmVyUHJvbWlzZSA9IHRoaXMuZ2V0QmxvY2tOdW1iZXIoKS50aGVuKChibG9ja051bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mYXN0QmxvY2tOdW1iZXIgPT0gbnVsbCB8fCBibG9ja051bWJlciA+IHRoaXMuX2Zhc3RCbG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYXN0QmxvY2tOdW1iZXIgPSBibG9ja051bWJlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zhc3RCbG9ja051bWJlcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9mYXN0QmxvY2tOdW1iZXJQcm9taXNlO1xuICAgIH1cbiAgICBfc2V0RmFzdEJsb2NrTnVtYmVyKGJsb2NrTnVtYmVyKSB7XG4gICAgICAgIC8vIE9sZGVyIGJsb2NrLCBtYXliZSBhIHN0YWxlIHJlcXVlc3RcbiAgICAgICAgaWYgKHRoaXMuX2Zhc3RCbG9ja051bWJlciAhPSBudWxsICYmIGJsb2NrTnVtYmVyIDwgdGhpcy5fZmFzdEJsb2NrTnVtYmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lIHdlIHVwZGF0ZWQgdGhlIGJsb2NrbnVtYmVyXG4gICAgICAgIHRoaXMuX2Zhc3RRdWVyeURhdGUgPSBnZXRUaW1lKCk7XG4gICAgICAgIC8vIE5ld2VyIGJsb2NrIG51bWJlciwgdXNlICBpdFxuICAgICAgICBpZiAodGhpcy5fZmFzdEJsb2NrTnVtYmVyID09IG51bGwgfHwgYmxvY2tOdW1iZXIgPiB0aGlzLl9mYXN0QmxvY2tOdW1iZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zhc3RCbG9ja051bWJlciA9IGJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgdGhpcy5fZmFzdEJsb2NrTnVtYmVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShibG9ja051bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd2FpdEZvclRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSGFzaCwgY29uZmlybWF0aW9ucywgdGltZW91dCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbnMgPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVjZWlwdCA9IHlpZWxkIHRoaXMuZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KHRyYW5zYWN0aW9uSGFzaCk7XG4gICAgICAgICAgICAvLyBSZWNlaXB0IGlzIGFscmVhZHkgZ29vZFxuICAgICAgICAgICAgaWYgKChyZWNlaXB0ID8gcmVjZWlwdC5jb25maXJtYXRpb25zIDogMCkgPj0gY29uZmlybWF0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWNlaXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVjZWlwdCBpcyBnb29kLi4uXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKHJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpcHQuY29uZmlybWF0aW9ucyA8IGNvbmZpcm1hdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0cmFuc2FjdGlvbkhhc2gsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlY2VpcHQpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5vbih0cmFuc2FjdGlvbkhhc2gsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKHRpbWVvdXQpID09PSBcIm51bWJlclwiICYmIHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0cmFuc2FjdGlvbkhhc2gsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGxvZ2dlci5tYWtlRXJyb3IoXCJ0aW1lb3V0IGV4Y2VlZGVkXCIsIExvZ2dlci5lcnJvcnMuVElNRU9VVCwgeyB0aW1lb3V0OiB0aW1lb3V0IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lci51bnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXIudW5yZWYoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0QmxvY2tOdW1iZXIoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW50ZXJuYWxCbG9ja051bWJlcigwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEdhc1ByaWNlKCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5nZXROZXR3b3JrKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnBlcmZvcm0oXCJnZXRHYXNQcmljZVwiLCB7fSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCaWdOdW1iZXIuZnJvbShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwiYmFkIHJlc3VsdCBmcm9tIGJhY2tlbmRcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImdldEdhc1ByaWNlXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldEJhbGFuY2UoYWRkcmVzc09yTmFtZSwgYmxvY2tUYWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geWllbGQgcmVzb2x2ZVByb3BlcnRpZXMoe1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX2dldEFkZHJlc3MoYWRkcmVzc09yTmFtZSksXG4gICAgICAgICAgICAgICAgYmxvY2tUYWc6IHRoaXMuX2dldEJsb2NrVGFnKGJsb2NrVGFnKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnBlcmZvcm0oXCJnZXRCYWxhbmNlXCIsIHBhcmFtcyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBCaWdOdW1iZXIuZnJvbShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwiYmFkIHJlc3VsdCBmcm9tIGJhY2tlbmRcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImdldEJhbGFuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCByZXN1bHQsIGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRUcmFuc2FjdGlvbkNvdW50KGFkZHJlc3NPck5hbWUsIGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHlpZWxkIHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9nZXRBZGRyZXNzKGFkZHJlc3NPck5hbWUpLFxuICAgICAgICAgICAgICAgIGJsb2NrVGFnOiB0aGlzLl9nZXRCbG9ja1RhZyhibG9ja1RhZylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgdGhpcy5wZXJmb3JtKFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiLCBwYXJhbXMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLmZyb20ocmVzdWx0KS50b051bWJlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwiYmFkIHJlc3VsdCBmcm9tIGJhY2tlbmRcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImdldFRyYW5zYWN0aW9uQ291bnRcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCByZXN1bHQsIGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRDb2RlKGFkZHJlc3NPck5hbWUsIGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHlpZWxkIHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9nZXRBZGRyZXNzKGFkZHJlc3NPck5hbWUpLFxuICAgICAgICAgICAgICAgIGJsb2NrVGFnOiB0aGlzLl9nZXRCbG9ja1RhZyhibG9ja1RhZylcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgdGhpcy5wZXJmb3JtKFwiZ2V0Q29kZVwiLCBwYXJhbXMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGV4bGlmeShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwiYmFkIHJlc3VsdCBmcm9tIGJhY2tlbmRcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImdldENvZGVcIixcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCByZXN1bHQsIGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRTdG9yYWdlQXQoYWRkcmVzc09yTmFtZSwgcG9zaXRpb24sIGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHlpZWxkIHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9nZXRBZGRyZXNzKGFkZHJlc3NPck5hbWUpLFxuICAgICAgICAgICAgICAgIGJsb2NrVGFnOiB0aGlzLl9nZXRCbG9ja1RhZyhibG9ja1RhZyksXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFByb21pc2UucmVzb2x2ZShwb3NpdGlvbikudGhlbigocCkgPT4gaGV4VmFsdWUocCkpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHRoaXMucGVyZm9ybShcImdldFN0b3JhZ2VBdFwiLCBwYXJhbXMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGV4bGlmeShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2dlci50aHJvd0Vycm9yKFwiYmFkIHJlc3VsdCBmcm9tIGJhY2tlbmRcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcImdldFN0b3JhZ2VBdFwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHJlc3VsdCwgZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBhbnkgc3ViY2xhc3Mgd3JhcHBpbmcgYSBUcmFuc2FjdGlvblJlc3BvbnNlXG4gICAgX3dyYXBUcmFuc2FjdGlvbih0eCwgaGFzaCkge1xuICAgICAgICBpZiAoaGFzaCAhPSBudWxsICYmIGhleERhdGFMZW5ndGgoaGFzaCkgIT09IDMyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHJlc3BvbnNlIC0gc2VuZFRyYW5zYWN0aW9uXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHR4O1xuICAgICAgICAvLyBDaGVjayB0aGUgaGFzaCB3ZSBleHBlY3QgaXMgdGhlIHNhbWUgYXMgdGhlIGhhc2ggdGhlIHNlcnZlciByZXBvcnRlZFxuICAgICAgICBpZiAoaGFzaCAhPSBudWxsICYmIHR4Lmhhc2ggIT09IGhhc2gpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiVHJhbnNhY3Rpb24gaGFzaCBtaXNtYXRjaCBmcm9tIFByb3ZpZGVyLnNlbmRUcmFuc2FjdGlvbi5cIiwgTG9nZ2VyLmVycm9ycy5VTktOT1dOX0VSUk9SLCB7IGV4cGVjdGVkSGFzaDogdHguaGFzaCwgcmV0dXJuZWRIYXNoOiBoYXNoIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEBUT0RPOiAoY29uZmlybWF0aW9ucz8gbnVtYmVyLCB0aW1lb3V0PyBudW1iZXIpXG4gICAgICAgIHJlc3VsdC53YWl0ID0gKGNvbmZpcm1hdGlvbnMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhpcyB0cmFuc2FjdGlvbiAqbXVzdCogZXhpc3QgKHdoZXRoZXIgaXQgZ2V0cyBtaW5lZCBpc1xuICAgICAgICAgICAgLy8gYW5vdGhlciBzdG9yeSksIHNvIHNldHRpbmcgYW4gZW1pdHRlZCB2YWx1ZSBmb3JjZXMgdXMgdG9cbiAgICAgICAgICAgIC8vIHdhaXQgZXZlbiBpZiB0aGUgbm9kZSByZXR1cm5zIG51bGwgZm9yIHRoZSByZWNlaXB0XG4gICAgICAgICAgICBpZiAoY29uZmlybWF0aW9ucyAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZWRbXCJ0OlwiICsgdHguaGFzaF0gPSBcInBlbmRpbmdcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlY2VpcHQgPSB5aWVsZCB0aGlzLndhaXRGb3JUcmFuc2FjdGlvbih0eC5oYXNoLCBjb25maXJtYXRpb25zKTtcbiAgICAgICAgICAgIGlmIChyZWNlaXB0ID09IG51bGwgJiYgY29uZmlybWF0aW9ucyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTm8gbG9uZ2VyIHBlbmRpbmcsIGFsbG93IHRoZSBwb2xsaW5nIGxvb3AgdG8gZ2FyYmFnZSBjb2xsZWN0IHRoaXNcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZWRbXCJ0OlwiICsgdHguaGFzaF0gPSByZWNlaXB0LmJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgaWYgKHJlY2VpcHQuc3RhdHVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJ0cmFuc2FjdGlvbiBmYWlsZWRcIiwgTG9nZ2VyLmVycm9ycy5DQUxMX0VYQ0VQVElPTiwge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbkhhc2g6IHR4Lmhhc2gsXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiB0eCxcbiAgICAgICAgICAgICAgICAgICAgcmVjZWlwdDogcmVjZWlwdFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlY2VpcHQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBzZW5kVHJhbnNhY3Rpb24oc2lnbmVkVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICAgICAgY29uc3QgaGV4VHggPSB5aWVsZCBQcm9taXNlLnJlc29sdmUoc2lnbmVkVHJhbnNhY3Rpb24pLnRoZW4odCA9PiBoZXhsaWZ5KHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHR4ID0gdGhpcy5mb3JtYXR0ZXIudHJhbnNhY3Rpb24oc2lnbmVkVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNoID0geWllbGQgdGhpcy5wZXJmb3JtKFwic2VuZFRyYW5zYWN0aW9uXCIsIHsgc2lnbmVkVHJhbnNhY3Rpb246IGhleFR4IH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cmFwVHJhbnNhY3Rpb24odHgsIGhhc2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IudHJhbnNhY3Rpb24gPSB0eDtcbiAgICAgICAgICAgICAgICBlcnJvci50cmFuc2FjdGlvbkhhc2ggPSB0eC5oYXNoO1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFRyYW5zYWN0aW9uUmVxdWVzdCh0cmFuc2FjdGlvbikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0geWllbGQgdHJhbnNhY3Rpb247XG4gICAgICAgICAgICBjb25zdCB0eCA9IHt9O1xuICAgICAgICAgICAgW1wiZnJvbVwiLCBcInRvXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHhba2V5XSA9IFByb21pc2UucmVzb2x2ZSh2YWx1ZXNba2V5XSkudGhlbigodikgPT4gKHYgPyB0aGlzLl9nZXRBZGRyZXNzKHYpIDogbnVsbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBbXCJnYXNMaW1pdFwiLCBcImdhc1ByaWNlXCIsIFwidmFsdWVcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0eFtrZXldID0gUHJvbWlzZS5yZXNvbHZlKHZhbHVlc1trZXldKS50aGVuKCh2KSA9PiAodiA/IEJpZ051bWJlci5mcm9tKHYpIDogbnVsbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBbXCJkYXRhXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHhba2V5XSA9IFByb21pc2UucmVzb2x2ZSh2YWx1ZXNba2V5XSkudGhlbigodikgPT4gKHYgPyBoZXhsaWZ5KHYpIDogbnVsbCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZXIudHJhbnNhY3Rpb25SZXF1ZXN0KHlpZWxkIHJlc29sdmVQcm9wZXJ0aWVzKHR4KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0RmlsdGVyKGZpbHRlcikge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZmlsdGVyID0geWllbGQgZmlsdGVyO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICAgICAgICBpZiAoZmlsdGVyLmFkZHJlc3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRyZXNzID0gdGhpcy5fZ2V0QWRkcmVzcyhmaWx0ZXIuYWRkcmVzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBbXCJibG9ja0hhc2hcIiwgXCJ0b3BpY3NcIl0uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcltrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IGZpbHRlcltrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBbXCJmcm9tQmxvY2tcIiwgXCJ0b0Jsb2NrXCJdLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0aGlzLl9nZXRCbG9ja1RhZyhmaWx0ZXJba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlci5maWx0ZXIoeWllbGQgcmVzb2x2ZVByb3BlcnRpZXMocmVzdWx0KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYWxsKHRyYW5zYWN0aW9uLCBibG9ja1RhZykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5nZXROZXR3b3JrKCk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB5aWVsZCByZXNvbHZlUHJvcGVydGllcyh7XG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb246IHRoaXMuX2dldFRyYW5zYWN0aW9uUmVxdWVzdCh0cmFuc2FjdGlvbiksXG4gICAgICAgICAgICAgICAgYmxvY2tUYWc6IHRoaXMuX2dldEJsb2NrVGFnKGJsb2NrVGFnKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnBlcmZvcm0oXCJjYWxsXCIsIHBhcmFtcyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoZXhsaWZ5KHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoXCJiYWQgcmVzdWx0IGZyb20gYmFja2VuZFwiLCBMb2dnZXIuZXJyb3JzLlNFUlZFUl9FUlJPUiwge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFwiY2FsbFwiLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHJlc3VsdCwgZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVzdGltYXRlR2FzKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHlpZWxkIHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogdGhpcy5fZ2V0VHJhbnNhY3Rpb25SZXF1ZXN0KHRyYW5zYWN0aW9uKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnBlcmZvcm0oXCJlc3RpbWF0ZUdhc1wiLCBwYXJhbXMpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQmlnTnVtYmVyLmZyb20ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcImJhZCByZXN1bHQgZnJvbSBiYWNrZW5kXCIsIExvZ2dlci5lcnJvcnMuU0VSVkVSX0VSUk9SLCB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogXCJlc3RpbWF0ZUdhc1wiLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHJlc3VsdCwgZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9nZXRBZGRyZXNzKGFkZHJlc3NPck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSB5aWVsZCB0aGlzLnJlc29sdmVOYW1lKGFkZHJlc3NPck5hbWUpO1xuICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiRU5TIG5hbWUgbm90IGNvbmZpZ3VyZWRcIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBgcmVzb2x2ZU5hbWUoJHtKU09OLnN0cmluZ2lmeShhZGRyZXNzT3JOYW1lKX0pYFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfZ2V0QmxvY2soYmxvY2tIYXNoT3JCbG9ja1RhZywgaW5jbHVkZVRyYW5zYWN0aW9ucykge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgeWllbGQgdGhpcy5nZXROZXR3b3JrKCk7XG4gICAgICAgICAgICBibG9ja0hhc2hPckJsb2NrVGFnID0geWllbGQgYmxvY2tIYXNoT3JCbG9ja1RhZztcbiAgICAgICAgICAgIC8vIElmIGJsb2NrVGFnIGlzIGEgbnVtYmVyIChub3QgXCJsYXRlc3RcIiwgZXRjKSwgdGhpcyBpcyB0aGUgYmxvY2sgbnVtYmVyXG4gICAgICAgICAgICBsZXQgYmxvY2tOdW1iZXIgPSAtMTI4O1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGluY2x1ZGVUcmFuc2FjdGlvbnM6ICEhaW5jbHVkZVRyYW5zYWN0aW9uc1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyhibG9ja0hhc2hPckJsb2NrVGFnLCAzMikpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMuYmxvY2tIYXNoID0gYmxvY2tIYXNoT3JCbG9ja1RhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5ibG9ja1RhZyA9IHRoaXMuZm9ybWF0dGVyLmJsb2NrVGFnKHlpZWxkIHRoaXMuX2dldEJsb2NrVGFnKGJsb2NrSGFzaE9yQmxvY2tUYWcpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGV4U3RyaW5nKHBhcmFtcy5ibG9ja1RhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrTnVtYmVyID0gcGFyc2VJbnQocGFyYW1zLmJsb2NrVGFnLnN1YnN0cmluZygyKSwgMTYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBibG9jayBoYXNoIG9yIGJsb2NrIHRhZ1wiLCBcImJsb2NrSGFzaE9yQmxvY2tUYWdcIiwgYmxvY2tIYXNoT3JCbG9ja1RhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBvbGwoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrID0geWllbGQgdGhpcy5wZXJmb3JtKFwiZ2V0QmxvY2tcIiwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAvLyBCbG9jayB3YXMgbm90IGZvdW5kXG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGJsb2NraGFzaGVzLCBpZiB3ZSBkaWRuJ3Qgc2F5IGl0IGV4aXN0ZWQsIHRoYXQgYmxvY2toYXNoIG1heVxuICAgICAgICAgICAgICAgICAgICAvLyBub3QgZXhpc3QuIElmIHdlIGRpZCBzZWUgaXQgdGhvdWdoLCBwZXJoYXBzIGZyb20gYSBsb2csIHdlIGtub3dcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgZXhpc3RzLCBhbmQgdGhpcyBub2RlIGlzIGp1c3Qgbm90IGNhdWdodCB1cCB5ZXQuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuYmxvY2tIYXNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbWl0dGVkW1wiYjpcIiArIHBhcmFtcy5ibG9ja0hhc2hdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYmxvY2sgdGFncywgaWYgd2UgYXJlIGFza2luZyBmb3IgYSBmdXR1cmUgYmxvY2ssIHdlIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuYmxvY2tUYWcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrTnVtYmVyID4gdGhpcy5fZW1pdHRlZC5ibG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHJ5IG9uIHRoZSBuZXh0IGJsb2NrXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEFkZCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZVRyYW5zYWN0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2tOdW1iZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrLnRyYW5zYWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHggPSBibG9jay50cmFuc2FjdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHguYmxvY2tOdW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4LmNvbmZpcm1hdGlvbnMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHguY29uZmlybWF0aW9ucyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrTnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tOdW1iZXIgPSB5aWVsZCB0aGlzLl9nZXRJbnRlcm5hbEJsb2NrTnVtYmVyKDEwMCArIDIgKiB0aGlzLnBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY29uZmlybWF0aW9ucyB1c2luZyB0aGUgZmFzdCBibG9jayBudW1iZXIgKHBlc3NpbWlzdGljKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb25maXJtYXRpb25zID0gKGJsb2NrTnVtYmVyIC0gdHguYmxvY2tOdW1iZXIpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlybWF0aW9ucyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1hdGlvbnMgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eC5jb25maXJtYXRpb25zID0gY29uZmlybWF0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZXIuYmxvY2tXaXRoVHJhbnNhY3Rpb25zKGJsb2NrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVyLmJsb2NrKGJsb2NrKTtcbiAgICAgICAgICAgIH0pLCB7IG9uY2VQb2xsOiB0aGlzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0QmxvY2soYmxvY2tIYXNoT3JCbG9ja1RhZykge1xuICAgICAgICByZXR1cm4gKHRoaXMuX2dldEJsb2NrKGJsb2NrSGFzaE9yQmxvY2tUYWcsIGZhbHNlKSk7XG4gICAgfVxuICAgIGdldEJsb2NrV2l0aFRyYW5zYWN0aW9ucyhibG9ja0hhc2hPckJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fZ2V0QmxvY2soYmxvY2tIYXNoT3JCbG9ja1RhZywgdHJ1ZSkpO1xuICAgIH1cbiAgICBnZXRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbkhhc2gpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICAgICAgdHJhbnNhY3Rpb25IYXNoID0geWllbGQgdHJhbnNhY3Rpb25IYXNoO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geyB0cmFuc2FjdGlvbkhhc2g6IHRoaXMuZm9ybWF0dGVyLmhhc2godHJhbnNhY3Rpb25IYXNoLCB0cnVlKSB9O1xuICAgICAgICAgICAgcmV0dXJuIHBvbGwoKCkgPT4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkIHRoaXMucGVyZm9ybShcImdldFRyYW5zYWN0aW9uXCIsIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbWl0dGVkW1widDpcIiArIHRyYW5zYWN0aW9uSGFzaF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdHggPSB0aGlzLmZvcm1hdHRlci50cmFuc2FjdGlvblJlc3BvbnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHR4LmJsb2NrTnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdHguY29uZmlybWF0aW9ucyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR4LmNvbmZpcm1hdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja051bWJlciA9IHlpZWxkIHRoaXMuX2dldEludGVybmFsQmxvY2tOdW1iZXIoMTAwICsgMiAqIHRoaXMucG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb25maXJtYXRpb25zIHVzaW5nIHRoZSBmYXN0IGJsb2NrIG51bWJlciAocGVzc2ltaXN0aWMpXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25maXJtYXRpb25zID0gKGJsb2NrTnVtYmVyIC0gdHguYmxvY2tOdW1iZXIpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1hdGlvbnMgPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybWF0aW9ucyA9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdHguY29uZmlybWF0aW9ucyA9IGNvbmZpcm1hdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93cmFwVHJhbnNhY3Rpb24odHgpO1xuICAgICAgICAgICAgfSksIHsgb25jZVBvbGw6IHRoaXMgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRUcmFuc2FjdGlvblJlY2VpcHQodHJhbnNhY3Rpb25IYXNoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB5aWVsZCB0aGlzLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uSGFzaCA9IHlpZWxkIHRyYW5zYWN0aW9uSGFzaDtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHsgdHJhbnNhY3Rpb25IYXNoOiB0aGlzLmZvcm1hdHRlci5oYXNoKHRyYW5zYWN0aW9uSGFzaCwgdHJ1ZSkgfTtcbiAgICAgICAgICAgIHJldHVybiBwb2xsKCgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCB0aGlzLnBlcmZvcm0oXCJnZXRUcmFuc2FjdGlvblJlY2VpcHRcIiwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZWRbXCJ0OlwiICsgdHJhbnNhY3Rpb25IYXNoXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBcImdldGgtZXRjXCIgcmV0dXJucyByZWNlaXB0cyBiZWZvcmUgdGhleSBhcmUgcmVhZHlcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmJsb2NrSGFzaCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY2VpcHQgPSB0aGlzLmZvcm1hdHRlci5yZWNlaXB0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlY2VpcHQuYmxvY2tOdW1iZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZWNlaXB0LmNvbmZpcm1hdGlvbnMgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWNlaXB0LmNvbmZpcm1hdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja051bWJlciA9IHlpZWxkIHRoaXMuX2dldEludGVybmFsQmxvY2tOdW1iZXIoMTAwICsgMiAqIHRoaXMucG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBjb25maXJtYXRpb25zIHVzaW5nIHRoZSBmYXN0IGJsb2NrIG51bWJlciAocGVzc2ltaXN0aWMpXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25maXJtYXRpb25zID0gKGJsb2NrTnVtYmVyIC0gcmVjZWlwdC5ibG9ja051bWJlcikgKyAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlybWF0aW9ucyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtYXRpb25zID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWNlaXB0LmNvbmZpcm1hdGlvbnMgPSBjb25maXJtYXRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjZWlwdDtcbiAgICAgICAgICAgIH0pLCB7IG9uY2VQb2xsOiB0aGlzIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0TG9ncyhmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0geWllbGQgcmVzb2x2ZVByb3BlcnRpZXMoeyBmaWx0ZXI6IHRoaXMuX2dldEZpbHRlcihmaWx0ZXIpIH0pO1xuICAgICAgICAgICAgY29uc3QgbG9ncyA9IHlpZWxkIHRoaXMucGVyZm9ybShcImdldExvZ3NcIiwgcGFyYW1zKTtcbiAgICAgICAgICAgIGxvZ3MuZm9yRWFjaCgobG9nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGxvZy5yZW1vdmVkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nLnJlbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBGb3JtYXR0ZXIuYXJyYXlPZih0aGlzLmZvcm1hdHRlci5maWx0ZXJMb2cuYmluZCh0aGlzLmZvcm1hdHRlcikpKGxvZ3MpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0RXRoZXJQcmljZSgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVyZm9ybShcImdldEV0aGVyUHJpY2VcIiwge30pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldEJsb2NrVGFnKGJsb2NrVGFnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBibG9ja1RhZyA9IHlpZWxkIGJsb2NrVGFnO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAoYmxvY2tUYWcpID09PSBcIm51bWJlclwiICYmIGJsb2NrVGFnIDwgMCkge1xuICAgICAgICAgICAgICAgIGlmIChibG9ja1RhZyAlIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgQmxvY2tUYWdcIiwgXCJibG9ja1RhZ1wiLCBibG9ja1RhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBibG9ja051bWJlciA9IHlpZWxkIHRoaXMuX2dldEludGVybmFsQmxvY2tOdW1iZXIoMTAwICsgMiAqIHRoaXMucG9sbGluZ0ludGVydmFsKTtcbiAgICAgICAgICAgICAgICBibG9ja051bWJlciArPSBibG9ja1RhZztcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tOdW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrTnVtYmVyID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVyLmJsb2NrVGFnKGJsb2NrTnVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHRlci5ibG9ja1RhZyhibG9ja1RhZyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRSZXNvbHZlcihuYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0geWllbGQgdGhpcy5fZ2V0UmVzb2x2ZXIobmFtZSk7XG4gICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVyKHRoaXMsIGFkZHJlc3MsIG5hbWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2dldFJlc29sdmVyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgcmVzb2x2ZXIgZnJvbSB0aGUgYmxvY2tjaGFpblxuICAgICAgICAgICAgY29uc3QgbmV0d29yayA9IHlpZWxkIHRoaXMuZ2V0TmV0d29yaygpO1xuICAgICAgICAgICAgLy8gTm8gRU5TLi4uXG4gICAgICAgICAgICBpZiAoIW5ldHdvcmsuZW5zQWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwibmV0d29yayBkb2VzIG5vdCBzdXBwb3J0IEVOU1wiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwgeyBvcGVyYXRpb246IFwiRU5TXCIsIG5ldHdvcms6IG5ldHdvcmsubmFtZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGtlY2NhazI1NihcInJlc29sdmVyKGJ5dGVzMzIpXCIpXG4gICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB0bzogbmV0d29yay5lbnNBZGRyZXNzLFxuICAgICAgICAgICAgICAgIGRhdGE6IChcIjB4MDE3OGI4YmZcIiArIG5hbWVoYXNoKG5hbWUpLnN1YnN0cmluZygyKSlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZXIuY2FsbEFkZHJlc3MoeWllbGQgdGhpcy5jYWxsKHRyYW5zYWN0aW9uKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXNvbHZlTmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBuYW1lID0geWllbGQgbmFtZTtcbiAgICAgICAgICAgIC8vIElmIGl0IGlzIGFscmVhZHkgYW4gYWRkcmVzcywgbm90aGluZyB0byByZXNvbHZlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5mb3JtYXR0ZXIuYWRkcmVzcyhuYW1lKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBpcyBpcyBhIGhleHN0cmluZywgdGhlIGFkZHJlc3MgaXMgYmFkIChTZWUgIzY5NClcbiAgICAgICAgICAgICAgICBpZiAoaXNIZXhTdHJpbmcobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAobmFtZSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBFTlMgbmFtZVwiLCBcIm5hbWVcIiwgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGFkZHIgZnJvbSB0aGUgcmVzb3ZsZXJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVyID0geWllbGQgdGhpcy5nZXRSZXNvbHZlcihuYW1lKTtcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5aWVsZCByZXNvbHZlci5nZXRBZGRyZXNzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsb29rdXBBZGRyZXNzKGFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGFkZHJlc3MgPSB5aWVsZCBhZGRyZXNzO1xuICAgICAgICAgICAgYWRkcmVzcyA9IHRoaXMuZm9ybWF0dGVyLmFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICAgICAgICBjb25zdCByZXZlcnNlTmFtZSA9IGFkZHJlc3Muc3Vic3RyaW5nKDIpLnRvTG93ZXJDYXNlKCkgKyBcIi5hZGRyLnJldmVyc2VcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVyQWRkcmVzcyA9IHlpZWxkIHRoaXMuX2dldFJlc29sdmVyKHJldmVyc2VOYW1lKTtcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZXJBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBrZWNjYWsoXCJuYW1lKGJ5dGVzMzIpXCIpXG4gICAgICAgICAgICBsZXQgYnl0ZXMgPSBhcnJheWlmeSh5aWVsZCB0aGlzLmNhbGwoe1xuICAgICAgICAgICAgICAgIHRvOiByZXNvbHZlckFkZHJlc3MsXG4gICAgICAgICAgICAgICAgZGF0YTogKFwiMHg2OTFmMzQzMVwiICsgbmFtZWhhc2gocmV2ZXJzZU5hbWUpLnN1YnN0cmluZygyKSlcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgZHluYW1pYyBzdHJpbmcgcG9pbnRlciAoMHgyMClcbiAgICAgICAgICAgIGlmIChieXRlcy5sZW5ndGggPCAzMiB8fCAhQmlnTnVtYmVyLmZyb20oYnl0ZXMuc2xpY2UoMCwgMzIpKS5lcSgzMikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ5dGVzID0gYnl0ZXMuc2xpY2UoMzIpO1xuICAgICAgICAgICAgLy8gTm90IGEgbGVuZ3RoLXByZWZpeGVkIHN0cmluZ1xuICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCA8IDMyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChmcm9tIHRoZSBsZW5ndGgtcHJlZml4KVxuICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gQmlnTnVtYmVyLmZyb20oYnl0ZXMuc2xpY2UoMCwgMzIpKS50b051bWJlcigpO1xuICAgICAgICAgICAgYnl0ZXMgPSBieXRlcy5zbGljZSgzMik7XG4gICAgICAgICAgICAvLyBMZW5ndGggbG9uZ2VyIHRoYW4gYXZhaWxhYmxlIGRhdGFcbiAgICAgICAgICAgIGlmIChsZW5ndGggPiBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0b1V0ZjhTdHJpbmcoYnl0ZXMuc2xpY2UoMCwgbGVuZ3RoKSk7XG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJldmVyc2UgcmVjb3JkIG1hdGNoZXMgdGhlIGZvd2FyZCByZWNvcmRcbiAgICAgICAgICAgIGNvbnN0IGFkZHIgPSB5aWVsZCB0aGlzLnJlc29sdmVOYW1lKG5hbWUpO1xuICAgICAgICAgICAgaWYgKGFkZHIgIT0gYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwZXJmb3JtKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihtZXRob2QgKyBcIiBub3QgaW1wbGVtZW50ZWRcIiwgTG9nZ2VyLmVycm9ycy5OT1RfSU1QTEVNRU5URUQsIHsgb3BlcmF0aW9uOiBtZXRob2QgfSk7XG4gICAgfVxuICAgIF9zdGFydEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMucG9sbGluZyA9ICh0aGlzLl9ldmVudHMuZmlsdGVyKChlKSA9PiBlLnBvbGxhYmxlKCkpLmxlbmd0aCA+IDApO1xuICAgIH1cbiAgICBfc3RvcEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMucG9sbGluZyA9ICh0aGlzLl9ldmVudHMuZmlsdGVyKChlKSA9PiBlLnBvbGxhYmxlKCkpLmxlbmd0aCA+IDApO1xuICAgIH1cbiAgICBfYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyLCBvbmNlKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KGdldEV2ZW50VGFnKGV2ZW50TmFtZSksIGxpc3RlbmVyLCBvbmNlKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzLnB1c2goZXZlbnQpO1xuICAgICAgICB0aGlzLl9zdGFydEV2ZW50KGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgIH1cbiAgICBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfVxuICAgIGVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHN0b3BwZWQgPSBbXTtcbiAgICAgICAgbGV0IGV2ZW50VGFnID0gZ2V0RXZlbnRUYWcoZXZlbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC50YWcgIT09IGV2ZW50VGFnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5saXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChldmVudC5vbmNlKSB7XG4gICAgICAgICAgICAgICAgc3RvcHBlZC5wdXNoKGV2ZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0b3BwZWQuZm9yRWFjaCgoZXZlbnQpID0+IHsgdGhpcy5fc3RvcEV2ZW50KGV2ZW50KTsgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxpc3RlbmVyQ291bnQoZXZlbnROYW1lKSB7XG4gICAgICAgIGlmICghZXZlbnROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZXZlbnRUYWcgPSBnZXRFdmVudFRhZyhldmVudE5hbWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoZXZlbnQudGFnID09PSBldmVudFRhZyk7XG4gICAgICAgIH0pLmxlbmd0aDtcbiAgICB9XG4gICAgbGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgICBpZiAoZXZlbnROYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudHMubWFwKChldmVudCkgPT4gZXZlbnQubGlzdGVuZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBldmVudFRhZyA9IGdldEV2ZW50VGFnKGV2ZW50TmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoKGV2ZW50KSA9PiAoZXZlbnQudGFnID09PSBldmVudFRhZykpXG4gICAgICAgICAgICAubWFwKChldmVudCkgPT4gZXZlbnQubGlzdGVuZXIpO1xuICAgIH1cbiAgICBvZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RvcHBlZCA9IFtdO1xuICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGV2ZW50VGFnID0gZ2V0RXZlbnRUYWcoZXZlbnROYW1lKTtcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC50YWcgIT09IGV2ZW50VGFnIHx8IGV2ZW50Lmxpc3RlbmVyICE9IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0b3BwZWQucHVzaChldmVudCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9wcGVkLmZvckVhY2goKGV2ZW50KSA9PiB7IHRoaXMuX3N0b3BFdmVudChldmVudCk7IH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50TmFtZSkge1xuICAgICAgICBsZXQgc3RvcHBlZCA9IFtdO1xuICAgICAgICBpZiAoZXZlbnROYW1lID09IG51bGwpIHtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0aGlzLl9ldmVudHM7XG4gICAgICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50VGFnID0gZ2V0RXZlbnRUYWcoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LnRhZyAhPT0gZXZlbnRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0b3BwZWQucHVzaChldmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcHBlZC5mb3JFYWNoKChldmVudCkgPT4geyB0aGlzLl9zdG9wRXZlbnQoZXZlbnQpOyB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFzZS1wcm92aWRlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgVXJsSnNvblJwY1Byb3ZpZGVyIH0gZnJvbSBcIi4vdXJsLWpzb24tcnBjLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5leHBvcnQgY2xhc3MgQ2xvdWRmbGFyZVByb3ZpZGVyIGV4dGVuZHMgVXJsSnNvblJwY1Byb3ZpZGVyIHtcbiAgICBzdGF0aWMgZ2V0QXBpS2V5KGFwaUtleSkge1xuICAgICAgICBpZiAoYXBpS2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJhcGlLZXkgbm90IHN1cHBvcnRlZCBmb3IgY2xvdWRmbGFyZVwiLCBcImFwaUtleVwiLCBhcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VXJsKG5ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBsZXQgaG9zdCA9IG51bGw7XG4gICAgICAgIHN3aXRjaCAobmV0d29yay5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlIFwiaG9tZXN0ZWFkXCI6XG4gICAgICAgICAgICAgICAgaG9zdCA9IFwiaHR0cHM6Ly9jbG91ZGZsYXJlLWV0aC5jb20vXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIFwibmV0d29ya1wiLCBhcmd1bWVudHNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBob3N0O1xuICAgIH1cbiAgICBwZXJmb3JtKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IF9zdXBlciA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgICAgICAgcGVyZm9ybTogeyBnZXQ6ICgpID0+IHN1cGVyLnBlcmZvcm0gfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFRoZSBDbG91ZGZsYXJlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgZXRoX2Jsb2NrTnVtYmVyLFxuICAgICAgICAgICAgLy8gc28gd2UgZ2V0IHRoZSBsYXRlc3QgYmxvY2sgYW5kIHB1bGwgaXQgZnJvbSB0aGF0XG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSBcImdldEJsb2NrTnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IHlpZWxkIF9zdXBlci5wZXJmb3JtLmNhbGwodGhpcywgXCJnZXRCbG9ja1wiLCB7IGJsb2NrVGFnOiBcImxhdGVzdFwiIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBibG9jay5udW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gX3N1cGVyLnBlcmZvcm0uY2FsbCh0aGlzLCBtZXRob2QsIHBhcmFtcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsb3VkZmxhcmUtcHJvdmlkZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IGhleGxpZnksIGhleFZhbHVlLCBpc0hleFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgZGVlcENvcHksIGRlZmluZVJlYWRPbmx5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IGZldGNoSnNvbiB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC93ZWJcIjtcbmltcG9ydCB7IHNob3dUaHJvdHRsZU1lc3NhZ2UgfSBmcm9tIFwiLi9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmltcG9ydCB7IEJhc2VQcm92aWRlciB9IGZyb20gXCIuL2Jhc2UtcHJvdmlkZXJcIjtcbi8vIFRoZSB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNhbml0aXplZCBieSB0aGUgY2FsbHMgaW4gUHJvdmlkZXJcbmZ1bmN0aW9uIGdldFRyYW5zYWN0aW9uUG9zdERhdGEodHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBrZXkgaW4gdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHZhbHVlID0gaGV4bGlmeSh0cmFuc2FjdGlvbltrZXldKTtcbiAgICAgICAgLy8gUXVhbnRpdHktdHlwZXMgcmVxdWlyZSBubyBsZWFkaW5nIHplcm8sIHVubGVzcyAwXG4gICAgICAgIGlmICh7IGdhc0xpbWl0OiB0cnVlLCBnYXNQcmljZTogdHJ1ZSwgbm9uY2U6IHRydWUsIHZhbHVlOiB0cnVlIH1ba2V5XSkge1xuICAgICAgICAgICAgdmFsdWUgPSBoZXhWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldFJlc3VsdChyZXN1bHQpIHtcbiAgICAvLyBnZXRMb2dzLCBnZXRIaXN0b3J5IGhhdmUgd2VpcmQgc3VjY2VzcyByZXNwb25zZXNcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PSAwICYmIChyZXN1bHQubWVzc2FnZSA9PT0gXCJObyByZWNvcmRzIGZvdW5kXCIgfHwgcmVzdWx0Lm1lc3NhZ2UgPT09IFwiTm8gdHJhbnNhY3Rpb25zIGZvdW5kXCIpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnN0YXR1cyAhPSAxIHx8IHJlc3VsdC5tZXNzYWdlICE9IFwiT0tcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcImludmFsaWQgcmVzcG9uc2VcIik7XG4gICAgICAgIGVycm9yLnJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgIGlmICgocmVzdWx0LnJlc3VsdCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJyYXRlIGxpbWl0XCIpID49IDApIHtcbiAgICAgICAgICAgIGVycm9yLnRocm90dGxlUmV0cnkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbn1cbmZ1bmN0aW9uIGdldEpzb25SZXN1bHQocmVzdWx0KSB7XG4gICAgLy8gVGhpcyByZXNwb25zZSBpbmRpY2F0ZXMgd2UgYXJlIGJlaW5nIHRocm90dGxlZFxuICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnN0YXR1cyA9PSAwICYmIHJlc3VsdC5tZXNzYWdlID09IFwiTk9UT0tcIiAmJiAocmVzdWx0LnJlc3VsdCB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJyYXRlIGxpbWl0XCIpID49IDApIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXCJ0aHJvdHRsZWQgcmVzcG9uc2VcIik7XG4gICAgICAgIGVycm9yLnJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdCk7XG4gICAgICAgIGVycm9yLnRocm90dGxlUmV0cnkgPSB0cnVlO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5qc29ucnBjICE9IFwiMi4wXCIpIHtcbiAgICAgICAgLy8gQFRPRE86IG5vdCBhbnlcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoXCJpbnZhbGlkIHJlc3BvbnNlXCIpO1xuICAgICAgICBlcnJvci5yZXN1bHQgPSBKU09OLnN0cmluZ2lmeShyZXN1bHQpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICAvLyBAVE9ETzogbm90IGFueVxuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IubWVzc2FnZSB8fCBcInVua25vd24gZXJyb3JcIik7XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IuY29kZSkge1xuICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJlc3VsdC5lcnJvci5jb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZXJyb3IuZGF0YSkge1xuICAgICAgICAgICAgZXJyb3IuZGF0YSA9IHJlc3VsdC5lcnJvci5kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LnJlc3VsdDtcbn1cbi8vIFRoZSBibG9ja1RhZyB3YXMgbm9ybWFsaXplZCBhcyBhIHN0cmluZyBieSB0aGUgUHJvdmlkZXIgcHJlLXBlcmZvcm0gb3BlcmF0aW9uc1xuZnVuY3Rpb24gY2hlY2tMb2dUYWcoYmxvY2tUYWcpIHtcbiAgICBpZiAoYmxvY2tUYWcgPT09IFwicGVuZGluZ1wiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInBlbmRpbmcgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKGJsb2NrVGFnID09PSBcImxhdGVzdFwiKSB7XG4gICAgICAgIHJldHVybiBibG9ja1RhZztcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlSW50KGJsb2NrVGFnLnN1YnN0cmluZygyKSwgMTYpO1xufVxuY29uc3QgZGVmYXVsdEFwaUtleSA9IFwiOUQxM1pFN1hTQlRKOTROOUJOSjJNQTMzVk1BWTJZUElSQlwiO1xuZnVuY3Rpb24gY2hlY2tFcnJvcihtZXRob2QsIGVycm9yLCB0cmFuc2FjdGlvbikge1xuICAgIC8vIFVuZG8gdGhlIFwiY29udmVuaWVuY2VcIiBzb21lIG5vZGVzIGFyZSBhdHRlbXB0aW5nIHRvIHByZXZlbnQgYmFja3dhcmRzXG4gICAgLy8gaW5jb21wYXRpYmlsaXR5OyBtYXliZSBmb3IgdjYgY29uc2lkZXIgZm9yd2FyZGluZyByZXZlcnRzIGFzIGVycm9yc1xuICAgIGlmIChtZXRob2QgPT09IFwiY2FsbFwiICYmIGVycm9yLmNvZGUgPT09IExvZ2dlci5lcnJvcnMuU0VSVkVSX0VSUk9SKSB7XG4gICAgICAgIGNvbnN0IGUgPSBlcnJvci5lcnJvcjtcbiAgICAgICAgaWYgKGUgJiYgZS5tZXNzYWdlLm1hdGNoKFwicmV2ZXJ0ZWRcIikgJiYgaXNIZXhTdHJpbmcoZS5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIGUuZGF0YTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBHZXQgdGhlIG1lc3NhZ2UgZnJvbSBhbnkgbmVzdGVkIGVycm9yIHN0cnVjdHVyZVxuICAgIGxldCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IpIHtcbiAgICAgICAgaWYgKGVycm9yLmVycm9yICYmIHR5cGVvZiAoZXJyb3IuZXJyb3IubWVzc2FnZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5lcnJvci5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoZXJyb3IuYm9keSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBlcnJvci5ib2R5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoZXJyb3IucmVzcG9uc2VUZXh0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtZXNzYWdlID0gKG1lc3NhZ2UgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgICAvLyBcIkluc3VmZmljaWVudCBmdW5kcy4gVGhlIGFjY291bnQgeW91IHRyaWVkIHRvIHNlbmQgdHJhbnNhY3Rpb24gZnJvbSBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcy4gUmVxdWlyZWQgMjE0NjQwMDAwMDAwMDAgYW5kIGdvdDogMFwiXG4gICAgaWYgKG1lc3NhZ2UubWF0Y2goL2luc3VmZmljaWVudCBmdW5kcy8pKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiaW5zdWZmaWNpZW50IGZ1bmRzIGZvciBpbnRyaW5zaWMgdHJhbnNhY3Rpb24gY29zdFwiLCBMb2dnZXIuZXJyb3JzLklOU1VGRklDSUVOVF9GVU5EUywge1xuICAgICAgICAgICAgZXJyb3IsIG1ldGhvZCwgdHJhbnNhY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFwiVHJhbnNhY3Rpb24gd2l0aCB0aGUgc2FtZSBoYXNoIHdhcyBhbHJlYWR5IGltcG9ydGVkLlwiXG4gICAgaWYgKG1lc3NhZ2UubWF0Y2goL3NhbWUgaGFzaCB3YXMgYWxyZWFkeSBpbXBvcnRlZHx0cmFuc2FjdGlvbiBub25jZSBpcyB0b28gbG93LykpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJub25jZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWRcIiwgTG9nZ2VyLmVycm9ycy5OT05DRV9FWFBJUkVELCB7XG4gICAgICAgICAgICBlcnJvciwgbWV0aG9kLCB0cmFuc2FjdGlvblxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gXCJUcmFuc2FjdGlvbiBnYXMgcHJpY2UgaXMgdG9vIGxvdy4gVGhlcmUgaXMgYW5vdGhlciB0cmFuc2FjdGlvbiB3aXRoIHNhbWUgbm9uY2UgaW4gdGhlIHF1ZXVlLiBUcnkgaW5jcmVhc2luZyB0aGUgZ2FzIHByaWNlIG9yIGluY3JlbWVudGluZyB0aGUgbm9uY2UuXCJcbiAgICBpZiAobWVzc2FnZS5tYXRjaCgvYW5vdGhlciB0cmFuc2FjdGlvbiB3aXRoIHNhbWUgbm9uY2UvKSkge1xuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInJlcGxhY2VtZW50IGZlZSB0b28gbG93XCIsIExvZ2dlci5lcnJvcnMuUkVQTEFDRU1FTlRfVU5ERVJQUklDRUQsIHtcbiAgICAgICAgICAgIGVycm9yLCBtZXRob2QsIHRyYW5zYWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5tYXRjaCgvZXhlY3V0aW9uIGZhaWxlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLykpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJjYW5ub3QgZXN0aW1hdGUgZ2FzOyB0cmFuc2FjdGlvbiBtYXkgZmFpbCBvciBtYXkgcmVxdWlyZSBtYW51YWwgZ2FzIGxpbWl0XCIsIExvZ2dlci5lcnJvcnMuVU5QUkVESUNUQUJMRV9HQVNfTElNSVQsIHtcbiAgICAgICAgICAgIGVycm9yLCBtZXRob2QsIHRyYW5zYWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbn1cbmV4cG9ydCBjbGFzcyBFdGhlcnNjYW5Qcm92aWRlciBleHRlbmRzIEJhc2VQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIGxvZ2dlci5jaGVja05ldyhuZXcudGFyZ2V0LCBFdGhlcnNjYW5Qcm92aWRlcik7XG4gICAgICAgIHN1cGVyKG5ldHdvcmspO1xuICAgICAgICBsZXQgbmFtZSA9IFwiaW52YWxpZFwiO1xuICAgICAgICBpZiAodGhpcy5uZXR3b3JrKSB7XG4gICAgICAgICAgICBuYW1lID0gdGhpcy5uZXR3b3JrLm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJhc2VVcmwgPSBudWxsO1xuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJob21lc3RlYWRcIjpcbiAgICAgICAgICAgICAgICBiYXNlVXJsID0gXCJodHRwczovL2FwaS5ldGhlcnNjYW4uaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyb3BzdGVuXCI6XG4gICAgICAgICAgICAgICAgYmFzZVVybCA9IFwiaHR0cHM6Ly9hcGktcm9wc3Rlbi5ldGhlcnNjYW4uaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyaW5rZWJ5XCI6XG4gICAgICAgICAgICAgICAgYmFzZVVybCA9IFwiaHR0cHM6Ly9hcGktcmlua2VieS5ldGhlcnNjYW4uaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJrb3ZhblwiOlxuICAgICAgICAgICAgICAgIGJhc2VVcmwgPSBcImh0dHBzOi8vYXBpLWtvdmFuLmV0aGVyc2Nhbi5pb1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdvZXJsaVwiOlxuICAgICAgICAgICAgICAgIGJhc2VVcmwgPSBcImh0dHBzOi8vYXBpLWdvZXJsaS5ldGhlcnNjYW4uaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiKTtcbiAgICAgICAgfVxuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImJhc2VVcmxcIiwgYmFzZVVybCk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYXBpS2V5XCIsIGFwaUtleSB8fCBkZWZhdWx0QXBpS2V5KTtcbiAgICB9XG4gICAgZGV0ZWN0TmV0d29yaygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm5ldHdvcms7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwZXJmb3JtKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IF9zdXBlciA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgICAgICAgcGVyZm9ybTogeyBnZXQ6ICgpID0+IHN1cGVyLnBlcmZvcm0gfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGlcIjtcbiAgICAgICAgICAgIGxldCBhcGlLZXkgPSBcIlwiO1xuICAgICAgICAgICAgaWYgKHRoaXMuYXBpS2V5KSB7XG4gICAgICAgICAgICAgICAgYXBpS2V5ICs9IFwiJmFwaWtleT1cIiArIHRoaXMuYXBpS2V5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ2V0ID0gKHVybCwgcGF5bG9hZCwgcHJvY0Z1bmMpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogXCJyZXF1ZXN0XCIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVTbG90SW50ZXJ2YWw6IDEwMDAsXG4gICAgICAgICAgICAgICAgICAgIHRocm90dGxlQ2FsbGJhY2s6IChhdHRlbXB0LCB1cmwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tbXVuaXR5UmVzb3VyY2UoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dUaHJvdHRsZU1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGxldCBwYXlsb2FkU3RyID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocGF5bG9hZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmhlYWRlcnMgPSB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFN0ciA9IE9iamVjdC5rZXlzKHBheWxvYWQpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7a2V5fT0ke3BheWxvYWRba2V5XX1gO1xuICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiJlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgZmV0Y2hKc29uKGNvbm5lY3Rpb24sIHBheWxvYWRTdHIsIHByb2NGdW5jIHx8IGdldEpzb25SZXN1bHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlZXBDb3B5KHJlc3VsdCksXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2V0QmxvY2tOdW1iZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiP21vZHVsZT1wcm94eSZhY3Rpb249ZXRoX2Jsb2NrTnVtYmVyXCIgKyBhcGlLZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQodXJsLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2V0R2FzUHJpY2VcIjpcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiP21vZHVsZT1wcm94eSZhY3Rpb249ZXRoX2dhc1ByaWNlXCIgKyBhcGlLZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQodXJsLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2V0QmFsYW5jZVwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIGJhc2UtMTAgcmVzdWx0XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIj9tb2R1bGU9YWNjb3VudCZhY3Rpb249YmFsYW5jZSZhZGRyZXNzPVwiICsgcGFyYW1zLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIiZ0YWc9XCIgKyBwYXJhbXMuYmxvY2tUYWcgKyBhcGlLZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQodXJsLCBudWxsLCBnZXRSZXN1bHQpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJnZXRUcmFuc2FjdGlvbkNvdW50XCI6XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIj9tb2R1bGU9cHJveHkmYWN0aW9uPWV0aF9nZXRUcmFuc2FjdGlvbkNvdW50JmFkZHJlc3M9XCIgKyBwYXJhbXMuYWRkcmVzcztcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJnRhZz1cIiArIHBhcmFtcy5ibG9ja1RhZyArIGFwaUtleTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCh1cmwsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJnZXRDb2RlXCI6XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIj9tb2R1bGU9cHJveHkmYWN0aW9uPWV0aF9nZXRDb2RlJmFkZHJlc3M9XCIgKyBwYXJhbXMuYWRkcmVzcztcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJnRhZz1cIiArIHBhcmFtcy5ibG9ja1RhZyArIGFwaUtleTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCh1cmwsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJnZXRTdG9yYWdlQXRcIjpcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiP21vZHVsZT1wcm94eSZhY3Rpb249ZXRoX2dldFN0b3JhZ2VBdCZhZGRyZXNzPVwiICsgcGFyYW1zLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIiZwb3NpdGlvbj1cIiArIHBhcmFtcy5wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJnRhZz1cIiArIHBhcmFtcy5ibG9ja1RhZyArIGFwaUtleTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCh1cmwsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzZW5kVHJhbnNhY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZTogXCJwcm94eVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcImV0aF9zZW5kUmF3VHJhbnNhY3Rpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGhleDogcGFyYW1zLnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBpa2V5OiB0aGlzLmFwaUtleVxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0Vycm9yKFwic2VuZFRyYW5zYWN0aW9uXCIsIGVycm9yLCBwYXJhbXMuc2lnbmVkVHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2V0QmxvY2tcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5ibG9ja1RhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiP21vZHVsZT1wcm94eSZhY3Rpb249ZXRoX2dldEJsb2NrQnlOdW1iZXImdGFnPVwiICsgcGFyYW1zLmJsb2NrVGFnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5pbmNsdWRlVHJhbnNhY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJmJvb2xlYW49dHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJmJvb2xlYW49ZmFsc2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSBhcGlLZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KHVybCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZ2V0QmxvY2sgYnkgYmxvY2tIYXNoIG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiP21vZHVsZT1wcm94eSZhY3Rpb249ZXRoX2dldFRyYW5zYWN0aW9uQnlIYXNoJnR4aGFzaD1cIiArIHBhcmFtcy50cmFuc2FjdGlvbkhhc2g7XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBhcGlLZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQodXJsLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIj9tb2R1bGU9cHJveHkmYWN0aW9uPWV0aF9nZXRUcmFuc2FjdGlvblJlY2VpcHQmdHhoYXNoPVwiICsgcGFyYW1zLnRyYW5zYWN0aW9uSGFzaDtcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IGFwaUtleTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldCh1cmwsIG51bGwpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjYWxsXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5ibG9ja1RhZyAhPT0gXCJsYXRlc3RcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXRoZXJzY2FuUHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBibG9ja1RhZyBmb3IgY2FsbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IGdldFRyYW5zYWN0aW9uUG9zdERhdGEocGFyYW1zLnRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdERhdGEubW9kdWxlID0gXCJwcm94eVwiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0RGF0YS5hY3Rpb24gPSBcImV0aF9jYWxsXCI7XG4gICAgICAgICAgICAgICAgICAgIHBvc3REYXRhLmFwaWtleSA9IHRoaXMuYXBpS2V5O1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIGdldCh1cmwsIHBvc3REYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0Vycm9yKFwiY2FsbFwiLCBlcnJvciwgcGFyYW1zLnRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlIFwiZXN0aW1hdGVHYXNcIjoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IGdldFRyYW5zYWN0aW9uUG9zdERhdGEocGFyYW1zLnRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgcG9zdERhdGEubW9kdWxlID0gXCJwcm94eVwiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0RGF0YS5hY3Rpb24gPSBcImV0aF9lc3RpbWF0ZUdhc1wiO1xuICAgICAgICAgICAgICAgICAgICBwb3N0RGF0YS5hcGlrZXkgPSB0aGlzLmFwaUtleTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCBnZXQodXJsLCBwb3N0RGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tFcnJvcihcImVzdGltYXRlR2FzXCIsIGVycm9yLCBwYXJhbXMudHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJnZXRMb2dzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiP21vZHVsZT1sb2dzJmFjdGlvbj1nZXRMb2dzXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsdGVyLmZyb21CbG9jaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJmZyb21CbG9jaz1cIiArIGNoZWNrTG9nVGFnKHBhcmFtcy5maWx0ZXIuZnJvbUJsb2NrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlci50b0Jsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgKz0gXCImdG9CbG9jaz1cIiArIGNoZWNrTG9nVGFnKHBhcmFtcy5maWx0ZXIudG9CbG9jayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXIuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJmFkZHJlc3M9XCIgKyBwYXJhbXMuZmlsdGVyLmFkZHJlc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQFRPRE86IFdlIGNhbiBoYW5kbGUgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBsb2dzIHVzaW5nIHRoZSBsb2dzIEFQSVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlci50b3BpY3MgJiYgcGFyYW1zLmZpbHRlci50b3BpY3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXIudG9waWNzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVuc3VwcG9ydGVkIHRvcGljIGNvdW50XCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7IHRvcGljczogcGFyYW1zLmZpbHRlci50b3BpY3MgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmZpbHRlci50b3BpY3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9waWMwID0gcGFyYW1zLmZpbHRlci50b3BpY3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAodG9waWMwKSAhPT0gXCJzdHJpbmdcIiB8fCB0b3BpYzAubGVuZ3RoICE9PSA2Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVuc3VwcG9ydGVkIHRvcGljIGZvcm1hdFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwgeyB0b3BpYzA6IHRvcGljMCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsICs9IFwiJnRvcGljMD1cIiArIHRvcGljMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB1cmwgKz0gYXBpS2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0geWllbGQgZ2V0KHVybCwgbnVsbCwgZ2V0UmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdHhIYXNoID0+IGJsb2NrSGFzaFxuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvY2tzID0ge307XG4gICAgICAgICAgICAgICAgICAgIC8vIEFkZCBhbnkgbWlzc2luZyBibG9ja0hhc2ggdG8gdGhlIGxvZ3NcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2cgPSBsb2dzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5ibG9ja0hhc2ggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2Nrc1tsb2cuYmxvY2tOdW1iZXJdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IHlpZWxkIHRoaXMuZ2V0QmxvY2sobG9nLmJsb2NrTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2xvZy5ibG9ja051bWJlcl0gPSBibG9jay5oYXNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5ibG9ja0hhc2ggPSBibG9ja3NbbG9nLmJsb2NrTnVtYmVyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9ncztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcImdldEV0aGVyUHJpY2VcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmV0d29yay5uYW1lICE9PSBcImhvbWVzdGVhZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBcIj9tb2R1bGU9c3RhdHMmYWN0aW9uPWV0aHByaWNlXCI7XG4gICAgICAgICAgICAgICAgICAgIHVybCArPSBhcGlLZXk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KCh5aWVsZCBnZXQodXJsLCBudWxsLCBnZXRSZXN1bHQpKS5ldGh1c2QpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wZXJmb3JtLmNhbGwodGhpcywgbWV0aG9kLCBwYXJhbXMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gQFRPRE86IEFsbG93IHN0YXJ0QmxvY2sgYW5kIGVuZEJsb2NrIHRvIGJlIFByb21pc2VzXG4gICAgZ2V0SGlzdG9yeShhZGRyZXNzT3JOYW1lLCBzdGFydEJsb2NrLCBlbmRCbG9jaykge1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5iYXNlVXJsO1xuICAgICAgICBsZXQgYXBpS2V5ID0gXCJcIjtcbiAgICAgICAgaWYgKHRoaXMuYXBpS2V5KSB7XG4gICAgICAgICAgICBhcGlLZXkgKz0gXCImYXBpa2V5PVwiICsgdGhpcy5hcGlLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0QmxvY2sgPT0gbnVsbCkge1xuICAgICAgICAgICAgc3RhcnRCbG9jayA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuZEJsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgIGVuZEJsb2NrID0gOTk5OTk5OTk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZU5hbWUoYWRkcmVzc09yTmFtZSkudGhlbigoYWRkcmVzcykgPT4ge1xuICAgICAgICAgICAgdXJsICs9IFwiL2FwaT9tb2R1bGU9YWNjb3VudCZhY3Rpb249dHhsaXN0JmFkZHJlc3M9XCIgKyBhZGRyZXNzO1xuICAgICAgICAgICAgdXJsICs9IFwiJnN0YXJ0YmxvY2s9XCIgKyBzdGFydEJsb2NrO1xuICAgICAgICAgICAgdXJsICs9IFwiJmVuZGJsb2NrPVwiICsgZW5kQmxvY2s7XG4gICAgICAgICAgICB1cmwgKz0gXCImc29ydD1hc2NcIiArIGFwaUtleTtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHtcbiAgICAgICAgICAgICAgICBhY3Rpb246IFwicmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHVybCxcbiAgICAgICAgICAgICAgICBwcm92aWRlcjogdGhpc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBjb25uZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIHRocm90dGxlU2xvdEludGVydmFsOiAxMDAwLFxuICAgICAgICAgICAgICAgIHRocm90dGxlQ2FsbGJhY2s6IChhdHRlbXB0LCB1cmwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXBpS2V5ID09PSBkZWZhdWx0QXBpS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93VGhyb3R0bGVNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGZldGNoSnNvbihjb25uZWN0aW9uLCBudWxsLCBnZXRSZXN1bHQpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGRlZXBDb3B5KHJlc3VsdCksXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IG91dHB1dCA9IFtdO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKCh0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBbXCJjb250cmFjdEFkZHJlc3NcIiwgXCJ0b1wiXS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eFtrZXldID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdHhba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eC5jcmVhdGVzID09IG51bGwgJiYgdHguY29udHJhY3RBZGRyZXNzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR4LmNyZWF0ZXMgPSB0eC5jb250cmFjdEFkZHJlc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmZvcm1hdHRlci50cmFuc2FjdGlvblJlc3BvbnNlKHR4KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR4LnRpbWVTdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS50aW1lc3RhbXAgPSBwYXJzZUludCh0eC50aW1lU3RhbXApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hcGlLZXkgPT09IGRlZmF1bHRBcGlLZXkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV0aGVyc2Nhbi1wcm92aWRlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYWJzdHJhY3QtcHJvdmlkZXJcIjtcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IGlzSGV4U3RyaW5nIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBkZWVwQ29weSwgZGVmaW5lUmVhZE9ubHksIHNoYWxsb3dDb3B5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IHNodWZmbGVkIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3JhbmRvbVwiO1xuaW1wb3J0IHsgcG9sbCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC93ZWJcIjtcbmltcG9ydCB7IEJhc2VQcm92aWRlciB9IGZyb20gXCIuL2Jhc2UtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGlzQ29tbXVuaXR5UmVzb3VyY2UgfSBmcm9tIFwiLi9mb3JtYXR0ZXJcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmZ1bmN0aW9uIG5vdygpIHsgcmV0dXJuIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7IH1cbi8vIFJldHVybnMgdG8gbmV0d29yayBhcyBsb25nIGFzIGFsbCBhZ3JlZSwgb3IgbnVsbCBpZiBhbnkgaXMgbnVsbC5cbi8vIFRocm93cyBhbiBlcnJvciBpZiBhbnkgdHdvIG5ldHdvcmtzIGRvIG5vdCBtYXRjaC5cbmZ1bmN0aW9uIGNoZWNrTmV0d29ya3MobmV0d29ya3MpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ldHdvcmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5ldHdvcmsgPSBuZXR3b3Jrc1tpXTtcbiAgICAgICAgLy8gTnVsbCEgV2UgZG8gbm90IGtub3cgb3VyIG5ldHdvcms7IGJhaWwuXG4gICAgICAgIGlmIChuZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmV0d29yayBtYXRjaGVzIHRoZSBwcmV2aW91cyBuZXR3b3Jrc1xuICAgICAgICAgICAgaWYgKCEocmVzdWx0Lm5hbWUgPT09IG5ldHdvcmsubmFtZSAmJiByZXN1bHQuY2hhaW5JZCA9PT0gbmV0d29yay5jaGFpbklkICYmXG4gICAgICAgICAgICAgICAgKChyZXN1bHQuZW5zQWRkcmVzcyA9PT0gbmV0d29yay5lbnNBZGRyZXNzKSB8fCAocmVzdWx0LmVuc0FkZHJlc3MgPT0gbnVsbCAmJiBuZXR3b3JrLmVuc0FkZHJlc3MgPT0gbnVsbCkpKSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJwcm92aWRlciBtaXNtYXRjaFwiLCBcIm5ldHdvcmtzXCIsIG5ldHdvcmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IG5ldHdvcms7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIG1heERlbHRhKSB7XG4gICAgdmFsdWVzID0gdmFsdWVzLnNsaWNlKCkuc29ydCgpO1xuICAgIGNvbnN0IG1pZGRsZSA9IE1hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgIC8vIE9kZCBsZW5ndGg7IHRha2UgdGhlIG1pZGRsZVxuICAgIGlmICh2YWx1ZXMubGVuZ3RoICUgMikge1xuICAgICAgICByZXR1cm4gdmFsdWVzW21pZGRsZV07XG4gICAgfVxuICAgIC8vIEV2ZW4gbGVuZ3RoOyB0YWtlIHRoZSBhdmVyYWdlIG9mIHRoZSB0d28gbWlkZGxlXG4gICAgY29uc3QgYSA9IHZhbHVlc1ttaWRkbGUgLSAxXSwgYiA9IHZhbHVlc1ttaWRkbGVdO1xuICAgIGlmIChtYXhEZWx0YSAhPSBudWxsICYmIE1hdGguYWJzKGEgLSBiKSA+IG1heERlbHRhKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKGEgKyBiKSAvIDI7XG59XG5mdW5jdGlvbiBzZXJpYWxpemUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlb2YgKHZhbHVlKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChCaWdOdW1iZXIuaXNCaWdOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUubWFwKChpKSA9PiBzZXJpYWxpemUoaSkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAga2V5cy5zb3J0KCk7XG4gICAgICAgIHJldHVybiBcIntcIiArIGtleXMubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsdWVba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHYpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2ID0gXCJbZnVuY3Rpb25dXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2ID0gc2VyaWFsaXplKHYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleSkgKyBcIjpcIiArIHY7XG4gICAgICAgIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCI7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcInVua25vd24gdmFsdWUgdHlwZTogXCIgKyB0eXBlb2YgKHZhbHVlKSk7XG59XG4vLyBOZXh0IHJlcXVlc3QgSUQgdG8gdXNlIGZvciBlbWl0dGluZyBkZWJ1ZyBpbmZvXG5sZXQgbmV4dFJpZCA9IDE7XG47XG5mdW5jdGlvbiBzdGFsbChkdXJhdGlvbikge1xuICAgIGxldCBjYW5jZWwgPSBudWxsO1xuICAgIGxldCB0aW1lciA9IG51bGw7XG4gICAgbGV0IHByb21pc2UgPSAobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY2FuY2VsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dChjYW5jZWwsIGR1cmF0aW9uKTtcbiAgICB9KSk7XG4gICAgY29uc3Qgd2FpdCA9IChmdW5jKSA9PiB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oZnVuYyk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZ2V0UHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHJldHVybiB7IGNhbmNlbCwgZ2V0UHJvbWlzZSwgd2FpdCB9O1xufVxuY29uc3QgRm9yd2FyZEVycm9ycyA9IFtcbiAgICBMb2dnZXIuZXJyb3JzLkNBTExfRVhDRVBUSU9OLFxuICAgIExvZ2dlci5lcnJvcnMuSU5TVUZGSUNJRU5UX0ZVTkRTLFxuICAgIExvZ2dlci5lcnJvcnMuTk9OQ0VfRVhQSVJFRCxcbiAgICBMb2dnZXIuZXJyb3JzLlJFUExBQ0VNRU5UX1VOREVSUFJJQ0VELFxuICAgIExvZ2dlci5lcnJvcnMuVU5QUkVESUNUQUJMRV9HQVNfTElNSVRcbl07XG5jb25zdCBGb3J3YXJkUHJvcGVydGllcyA9IFtcbiAgICBcImFkZHJlc3NcIixcbiAgICBcImFyZ3NcIixcbiAgICBcImVycm9yQXJnc1wiLFxuICAgIFwiZXJyb3JTaWduYXR1cmVcIixcbiAgICBcIm1ldGhvZFwiLFxuICAgIFwidHJhbnNhY3Rpb25cIixcbl07XG47XG5mdW5jdGlvbiBleHBvc2VEZWJ1Z0NvbmZpZyhjb25maWcsIG5vdykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgd2VpZ2h0OiBjb25maWcud2VpZ2h0XG4gICAgfTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBcInByb3ZpZGVyXCIsIHsgZ2V0OiAoKSA9PiBjb25maWcucHJvdmlkZXIgfSk7XG4gICAgaWYgKGNvbmZpZy5zdGFydCkge1xuICAgICAgICByZXN1bHQuc3RhcnQgPSBjb25maWcuc3RhcnQ7XG4gICAgfVxuICAgIGlmIChub3cpIHtcbiAgICAgICAgcmVzdWx0LmR1cmF0aW9uID0gKG5vdyAtIGNvbmZpZy5zdGFydCk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZG9uZSkge1xuICAgICAgICBpZiAoY29uZmlnLmVycm9yKSB7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3IgPSBjb25maWcuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gY29uZmlnLnJlc3VsdCB8fCBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBub3JtYWxpemVkVGFsbHkobm9ybWFsaXplLCBxdW9ydW0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGNvbmZpZ3MpIHtcbiAgICAgICAgLy8gQ291bnQgdGhlIHZvdGVzIGZvciBlYWNoIHJlc3VsdFxuICAgICAgICBjb25zdCB0YWxseSA9IHt9O1xuICAgICAgICBjb25maWdzLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbm9ybWFsaXplKGMucmVzdWx0KTtcbiAgICAgICAgICAgIGlmICghdGFsbHlbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgdGFsbHlbdmFsdWVdID0geyBjb3VudDogMCwgcmVzdWx0OiBjLnJlc3VsdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFsbHlbdmFsdWVdLmNvdW50Kys7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDaGVjayBmb3IgYSBxdW9ydW0gb24gYW55IGdpdmVuIHJlc3VsdFxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGFsbHkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrID0gdGFsbHlba2V5c1tpXV07XG4gICAgICAgICAgICBpZiAoY2hlY2suY291bnQgPj0gcXVvcnVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrLnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBObyBxdXJvdW1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0UHJvY2Vzc0Z1bmMocHJvdmlkZXIsIG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgbGV0IG5vcm1hbGl6ZSA9IHNlcmlhbGl6ZTtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICBjYXNlIFwiZ2V0QmxvY2tOdW1iZXJcIjpcbiAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbWVkaWFuIHZhbHVlLCB1bmxlc3MgdGhlcmUgaXMgKG1lZGlhbiArIDEpIGlzIGFsc29cbiAgICAgICAgICAgIC8vIHByZXNlbnQsIGluIHdoaWNoIGNhc2UgdGhhdCBpcyBwcm9iYWJseSB0cnVlIGFuZCB0aGUgbWVkaWFuXG4gICAgICAgICAgICAvLyBpcyBnb2luZyB0byBiZSBzdGFsZSBzb29uLiBJbiB0aGUgZXZlbnQgb2YgYSBtYWxpY2lvdXMgbm9kZSxcbiAgICAgICAgICAgIC8vIHRoZSBsaWUgd2lsbCBiZSB0cnVlIHNvb24gZW5vdWdoLlxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb25maWdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gY29uZmlncy5tYXAoKGMpID0+IGMucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG1lZGlhbiBibG9jayBudW1iZXJcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tOdW1iZXIgPSBtZWRpYW4oY29uZmlncy5tYXAoKGMpID0+IGMucmVzdWx0KSwgMik7XG4gICAgICAgICAgICAgICAgaWYgKGJsb2NrTnVtYmVyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmxvY2tOdW1iZXIgPSBNYXRoLmNlaWwoYmxvY2tOdW1iZXIpO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0IGJsb2NrIGhlaWdodCBpcyBwcmVzZW50LCBpdHMgcHJvbGx5IHNhZmUgdG8gdXNlXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5pbmRleE9mKGJsb2NrTnVtYmVyICsgMSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBibG9ja051bWJlcisrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBEb24ndCBldmVyIHJvbGwgYmFjayB0aGUgYmxvY2tOdW1iZXJcbiAgICAgICAgICAgICAgICBpZiAoYmxvY2tOdW1iZXIgPj0gcHJvdmlkZXIuX2hpZ2hlc3RCbG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5faGlnaGVzdEJsb2NrTnVtYmVyID0gYmxvY2tOdW1iZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlci5faGlnaGVzdEJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgY2FzZSBcImdldEdhc1ByaWNlXCI6XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG1pZGRsZSAocm91bmQgaW5kZXggdXApIHZhbHVlLCBzaW1pbGFyIHRvIG1lZGlhblxuICAgICAgICAgICAgLy8gYnV0IGRvIG5vdCBhdmVyYWdlIGV2ZW4gZW50cmllcyBhbmQgY2hvb3NlIHRoZSBoaWdoZXIuXG4gICAgICAgICAgICAvLyBNYWxpY2lvdXMgYWN0b3JzIG11c3QgY29tcHJvbWlzZSA1MCUgb2YgdGhlIG5vZGVzIHRvIGxpZS5cbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoY29uZmlncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGNvbmZpZ3MubWFwKChjKSA9PiBjLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnNvcnQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVzW01hdGguZmxvb3IodmFsdWVzLmxlbmd0aCAvIDIpXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgXCJnZXRFdGhlclByaWNlXCI6XG4gICAgICAgICAgICAvLyBSZXR1cm5zIHRoZSBtZWRpYW4gcHJpY2UuIE1hbGljaW91cyBhY3RvcnMgbXVzdCBjb21wcm9taXNlIGF0XG4gICAgICAgICAgICAvLyBsZWFzdCA1MCUgb2YgdGhlIG5vZGVzIHRvIGxpZSAoaW4gYSBtZWFuaW5nZnVsIHdheSkuXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbmZpZ3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVkaWFuKGNvbmZpZ3MubWFwKChjKSA9PiBjLnJlc3VsdCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgLy8gTm8gYWRkaXRpb25hbCBub3JtYWxpemluZyByZXF1aXJlZDsgc2VyaWFsaXplIGlzIGVub3VnaFxuICAgICAgICBjYXNlIFwiZ2V0QmFsYW5jZVwiOlxuICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiOlxuICAgICAgICBjYXNlIFwiZ2V0Q29kZVwiOlxuICAgICAgICBjYXNlIFwiZ2V0U3RvcmFnZUF0XCI6XG4gICAgICAgIGNhc2UgXCJjYWxsXCI6XG4gICAgICAgIGNhc2UgXCJlc3RpbWF0ZUdhc1wiOlxuICAgICAgICBjYXNlIFwiZ2V0TG9nc1wiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFdlIGRyb3AgdGhlIGNvbmZpcm1hdGlvbnMgZnJvbSB0cmFuc2FjdGlvbnMgYXMgaXQgaXMgYXBwcm94aW1hdGVcbiAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJnZXRUcmFuc2FjdGlvblJlY2VpcHRcIjpcbiAgICAgICAgICAgIG5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh0eCkge1xuICAgICAgICAgICAgICAgIGlmICh0eCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0eCA9IHNoYWxsb3dDb3B5KHR4KTtcbiAgICAgICAgICAgICAgICB0eC5jb25maXJtYXRpb25zID0gLTE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZSh0eCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFdlIGRyb3AgdGhlIGNvbmZpcm1hdGlvbnMgZnJvbSB0cmFuc2FjdGlvbnMgYXMgaXQgaXMgYXBwcm94aW1hdGVcbiAgICAgICAgY2FzZSBcImdldEJsb2NrXCI6XG4gICAgICAgICAgICAvLyBXZSBkcm9wIHRoZSBjb25maXJtYXRpb25zIGZyb20gdHJhbnNhY3Rpb25zIGFzIGl0IGlzIGFwcHJveGltYXRlXG4gICAgICAgICAgICBpZiAocGFyYW1zLmluY2x1ZGVUcmFuc2FjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemUgPSBmdW5jdGlvbiAoYmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gc2hhbGxvd0NvcHkoYmxvY2spO1xuICAgICAgICAgICAgICAgICAgICBibG9jay50cmFuc2FjdGlvbnMgPSBibG9jay50cmFuc2FjdGlvbnMubWFwKCh0eCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHggPSBzaGFsbG93Q29weSh0eCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eC5jb25maXJtYXRpb25zID0gLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHg7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplKGJsb2NrKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplID0gZnVuY3Rpb24gKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChibG9jayA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplKGJsb2NrKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmtub3duIG1ldGhvZDogXCIgKyBtZXRob2QpO1xuICAgIH1cbiAgICAvLyBSZXR1cm4gdGhlIHJlc3VsdCBpZiBhbmQgb25seSBpZiB0aGUgZXhwZWN0ZWQgcXVvcnVtIGlzXG4gICAgLy8gc2F0aXNmaWVkIGFuZCBhZ3JlZWQgdXBvbiBmb3IgdGhlIGZpbmFsIHJlc3VsdC5cbiAgICByZXR1cm4gbm9ybWFsaXplZFRhbGx5KG5vcm1hbGl6ZSwgcHJvdmlkZXIucXVvcnVtKTtcbn1cbi8vIElmIHdlIGFyZSBkb2luZyBhIGJsb2NrVGFnIHF1ZXJ5LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYmFja2VuZCBpc1xuLy8gY2F1Z2h0IHVwIHRvIHRoZSBGYWxsYmFja1Byb3ZpZGVyLCBiZWZvcmUgc2VuZGluZyBhIHJlcXVlc3QgdG8gaXQuXG5mdW5jdGlvbiB3YWl0Rm9yU3luYyhjb25maWcsIGJsb2NrTnVtYmVyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSAoY29uZmlnLnByb3ZpZGVyKTtcbiAgICAgICAgaWYgKChwcm92aWRlci5ibG9ja051bWJlciAhPSBudWxsICYmIHByb3ZpZGVyLmJsb2NrTnVtYmVyID49IGJsb2NrTnVtYmVyKSB8fCBibG9ja051bWJlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG9sbCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgc3luY2VkXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5ibG9ja051bWJlciA+PSBibG9ja051bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocHJvdmlkZXIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmU7IGp1c3QgcXVpdFxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IGFnYWluLCBuZXh0IGJsb2NrXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgeyBvbmNlUG9sbDogcHJvdmlkZXIgfSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRSdW5uZXIoY29uZmlnLCBjdXJyZW50QmxvY2tOdW1iZXIsIG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHByb3ZpZGVyID0gY29uZmlnLnByb3ZpZGVyO1xuICAgICAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgICAgICAgY2FzZSBcImdldEJsb2NrTnVtYmVyXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0R2FzUHJpY2VcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJbbWV0aG9kXSgpO1xuICAgICAgICAgICAgY2FzZSBcImdldEV0aGVyUHJpY2VcIjpcbiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuZ2V0RXRoZXJQcmljZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0RXRoZXJQcmljZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJnZXRCYWxhbmNlXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiOlxuICAgICAgICAgICAgY2FzZSBcImdldENvZGVcIjpcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmJsb2NrVGFnICYmIGlzSGV4U3RyaW5nKHBhcmFtcy5ibG9ja1RhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSB5aWVsZCB3YWl0Rm9yU3luYyhjb25maWcsIGN1cnJlbnRCbG9ja051bWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlclttZXRob2RdKHBhcmFtcy5hZGRyZXNzLCBwYXJhbXMuYmxvY2tUYWcgfHwgXCJsYXRlc3RcIik7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0U3RvcmFnZUF0XCI6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5ibG9ja1RhZyAmJiBpc0hleFN0cmluZyhwYXJhbXMuYmxvY2tUYWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0geWllbGQgd2FpdEZvclN5bmMoY29uZmlnLCBjdXJyZW50QmxvY2tOdW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0U3RvcmFnZUF0KHBhcmFtcy5hZGRyZXNzLCBwYXJhbXMucG9zaXRpb24sIHBhcmFtcy5ibG9ja1RhZyB8fCBcImxhdGVzdFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRCbG9ja1wiOlxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuYmxvY2tUYWcgJiYgaXNIZXhTdHJpbmcocGFyYW1zLmJsb2NrVGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHlpZWxkIHdhaXRGb3JTeW5jKGNvbmZpZywgY3VycmVudEJsb2NrTnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyWyhwYXJhbXMuaW5jbHVkZVRyYW5zYWN0aW9ucyA/IFwiZ2V0QmxvY2tXaXRoVHJhbnNhY3Rpb25zXCIgOiBcImdldEJsb2NrXCIpXShwYXJhbXMuYmxvY2tUYWcgfHwgcGFyYW1zLmJsb2NrSGFzaCk7XG4gICAgICAgICAgICBjYXNlIFwiY2FsbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVzdGltYXRlR2FzXCI6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5ibG9ja1RhZyAmJiBpc0hleFN0cmluZyhwYXJhbXMuYmxvY2tUYWcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0geWllbGQgd2FpdEZvclN5bmMoY29uZmlnLCBjdXJyZW50QmxvY2tOdW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJbbWV0aG9kXShwYXJhbXMudHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgY2FzZSBcImdldFRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyW21ldGhvZF0ocGFyYW1zLnRyYW5zYWN0aW9uSGFzaCk7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0TG9nc1wiOiB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlciA9IHBhcmFtcy5maWx0ZXI7XG4gICAgICAgICAgICAgICAgaWYgKChmaWx0ZXIuZnJvbUJsb2NrICYmIGlzSGV4U3RyaW5nKGZpbHRlci5mcm9tQmxvY2spKSB8fCAoZmlsdGVyLnRvQmxvY2sgJiYgaXNIZXhTdHJpbmcoZmlsdGVyLnRvQmxvY2spKSkge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHlpZWxkIHdhaXRGb3JTeW5jKGNvbmZpZywgY3VycmVudEJsb2NrTnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldExvZ3MoZmlsdGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoXCJ1bmtub3duIG1ldGhvZCBlcnJvclwiLCBMb2dnZXIuZXJyb3JzLlVOS05PV05fRVJST1IsIHtcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnQgY2xhc3MgRmFsbGJhY2tQcm92aWRlciBleHRlbmRzIEJhc2VQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IocHJvdmlkZXJzLCBxdW9ydW0pIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIEZhbGxiYWNrUHJvdmlkZXIpO1xuICAgICAgICBpZiAocHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcIm1pc3NpbmcgcHJvdmlkZXJzXCIsIFwicHJvdmlkZXJzXCIsIHByb3ZpZGVycyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvdmlkZXJDb25maWdzID0gcHJvdmlkZXJzLm1hcCgoY29uZmlnT3JQcm92aWRlciwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChQcm92aWRlci5pc1Byb3ZpZGVyKGNvbmZpZ09yUHJvdmlkZXIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhbGxUaW1lb3V0ID0gaXNDb21tdW5pdHlSZXNvdXJjZShjb25maWdPclByb3ZpZGVyKSA/IDIwMDAgOiA3NTA7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJpb3JpdHkgPSAxO1xuICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHsgcHJvdmlkZXI6IGNvbmZpZ09yUHJvdmlkZXIsIHdlaWdodDogMSwgc3RhbGxUaW1lb3V0LCBwcmlvcml0eSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHNoYWxsb3dDb3B5KGNvbmZpZ09yUHJvdmlkZXIpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5wcmlvcml0eSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLnByaW9yaXR5ID0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25maWcuc3RhbGxUaW1lb3V0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuc3RhbGxUaW1lb3V0ID0gaXNDb21tdW5pdHlSZXNvdXJjZShjb25maWdPclByb3ZpZGVyKSA/IDIwMDAgOiA3NTA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29uZmlnLndlaWdodCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLndlaWdodCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBjb25maWcud2VpZ2h0O1xuICAgICAgICAgICAgaWYgKHdlaWdodCAlIDEgfHwgd2VpZ2h0ID4gNTEyIHx8IHdlaWdodCA8IDEpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCB3ZWlnaHQ7IG11c3QgYmUgaW50ZWdlciBpbiBbMSwgNTEyXVwiLCBgcHJvdmlkZXJzWyR7aW5kZXh9XS53ZWlnaHRgLCB3ZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoY29uZmlnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gcHJvdmlkZXJDb25maWdzLnJlZHVjZSgoYWNjdW0sIGMpID0+IChhY2N1bSArIGMud2VpZ2h0KSwgMCk7XG4gICAgICAgIGlmIChxdW9ydW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVvcnVtID0gdG90YWwgLyAyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHF1b3J1bSA+IHRvdGFsKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwicXVvcnVtIHdpbGwgYWx3YXlzIGZhaWw7IGxhcmdlciB0aGFuIHRvdGFsIHdlaWdodFwiLCBcInF1b3J1bVwiLCBxdW9ydW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFyZSBhbGwgcHJvdmlkZXJzJyBuZXR3b3JrcyBhcmUga25vd25cbiAgICAgICAgbGV0IG5ldHdvcmtPclJlYWR5ID0gY2hlY2tOZXR3b3Jrcyhwcm92aWRlckNvbmZpZ3MubWFwKChjKSA9PiAoYy5wcm92aWRlcikubmV0d29yaykpO1xuICAgICAgICAvLyBOb3QgYWxsIG5ldHdvcmtzIGFyZSBrbm93bjsgd2UgbXVzdCBzdGFsbFxuICAgICAgICBpZiAobmV0d29ya09yUmVhZHkgPT0gbnVsbCkge1xuICAgICAgICAgICAgbmV0d29ya09yUmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0TmV0d29yaygpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG5ldHdvcmtPclJlYWR5KTtcbiAgICAgICAgLy8gUHJlc2VydmUgYSBjb3B5LCBzbyB3ZSBkbyBub3QgZ2V0IG11dGF0ZWRcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJwcm92aWRlckNvbmZpZ3NcIiwgT2JqZWN0LmZyZWV6ZShwcm92aWRlckNvbmZpZ3MpKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJxdW9ydW1cIiwgcXVvcnVtKTtcbiAgICAgICAgdGhpcy5faGlnaGVzdEJsb2NrTnVtYmVyID0gLTE7XG4gICAgfVxuICAgIGRldGVjdE5ldHdvcmsoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrcyA9IHlpZWxkIFByb21pc2UuYWxsKHRoaXMucHJvdmlkZXJDb25maWdzLm1hcCgoYykgPT4gYy5wcm92aWRlci5nZXROZXR3b3JrKCkpKTtcbiAgICAgICAgICAgIHJldHVybiBjaGVja05ldHdvcmtzKG5ldHdvcmtzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBlcmZvcm0obWV0aG9kLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFNlbmRpbmcgdHJhbnNhY3Rpb25zIGlzIHNwZWNpYWw7IGFsd2F5cyBicm9hZGNhc3QgaXQgdG8gYWxsIGJhY2tlbmRzXG4gICAgICAgICAgICBpZiAobWV0aG9kID09PSBcInNlbmRUcmFuc2FjdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHlpZWxkIFByb21pc2UuYWxsKHRoaXMucHJvdmlkZXJDb25maWdzLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5wcm92aWRlci5zZW5kVHJhbnNhY3Rpb24ocGFyYW1zLnNpZ25lZFRyYW5zYWN0aW9uKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaGFzaDtcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICAvLyBBbnkgc3VjY2VzcyBpcyBnb29kIGVub3VnaCAob3RoZXIgZXJyb3JzIGFyZSBsaWtlbHkgXCJhbHJlYWR5IHNlZW5cIiBlcnJvcnNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVzdWx0KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUaGV5IHdlcmUgYWxsIGFuIGVycm9yOyBwaWNrIHRoZSBmaXJzdCBlcnJvclxuICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdHNbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgaW4gc3luYyB3aXRoIG91ciBiYWNrZW5kcywgc28gd2UgbmVlZFxuICAgICAgICAgICAgLy8gdG8ga25vdyB0aGlzIGJlZm9yZSB3ZSBjYW4gbWFrZSBhIGxvdCBvZiBjYWxsc1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hpZ2hlc3RCbG9ja051bWJlciA9PT0gLTEgJiYgbWV0aG9kICE9PSBcImdldEJsb2NrTnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCB0aGlzLmdldEJsb2NrTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwcm9jZXNzRnVuYyA9IGdldFByb2Nlc3NGdW5jKHRoaXMsIG1ldGhvZCwgcGFyYW1zKTtcbiAgICAgICAgICAgIC8vIFNodWZmbGUgdGhlIHByb3ZpZGVycyBhbmQgdGhlbiBzb3J0IHRoZW0gYnkgdGhlaXIgcHJpb3JpdHk7IHdlXG4gICAgICAgICAgICAvLyBzaGFsbG93Q29weSB0aGVtIHNpbmNlIHdlIHdpbGwgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGVtIHRvb1xuICAgICAgICAgICAgY29uc3QgY29uZmlncyA9IHNodWZmbGVkKHRoaXMucHJvdmlkZXJDb25maWdzLm1hcChzaGFsbG93Q29weSkpO1xuICAgICAgICAgICAgY29uZmlncy5zb3J0KChhLCBiKSA9PiAoYS5wcmlvcml0eSAtIGIucHJpb3JpdHkpKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCbG9ja051bWJlciA9IHRoaXMuX2hpZ2hlc3RCbG9ja051bWJlcjtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBmaXJzdCA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHQwID0gbm93KCk7XG4gICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgaW5mbGlnaHQgd2VpZ2h0IChleGNsdWRlIGFueXRoaW5nIHBhc3QpXG4gICAgICAgICAgICAgICAgbGV0IGluZmxpZ2h0V2VpZ2h0ID0gY29uZmlncy5maWx0ZXIoKGMpID0+IChjLnJ1bm5lciAmJiAoKHQwIC0gYy5zdGFydCkgPCBjLnN0YWxsVGltZW91dCkpKVxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhY2N1bSwgYykgPT4gKGFjY3VtICsgYy53ZWlnaHQpLCAwKTtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBydW5uaW5nIGVub3VnaCB0byBtZWV0IHF1b3J1bVxuICAgICAgICAgICAgICAgIHdoaWxlIChpbmZsaWdodFdlaWdodCA8IHRoaXMucXVvcnVtICYmIGkgPCBjb25maWdzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBjb25maWdzW2krK107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZCA9IG5leHRSaWQrKztcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXJ0ID0gbm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGFsbGVyID0gc3RhbGwoY29uZmlnLnN0YWxsVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGFsbGVyLndhaXQoKCkgPT4geyBjb25maWcuc3RhbGxlciA9IG51bGw7IH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25maWcucnVubmVyID0gZ2V0UnVubmVyKGNvbmZpZywgY3VycmVudEJsb2NrTnVtYmVyLCBtZXRob2QsIHBhcmFtcykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudChcImRlYnVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwicmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWQ6IHJpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZDogZXhwb3NlRGVidWdDb25maWcoY29uZmlnLCBub3coKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kOiBtZXRob2QsIHBhcmFtczogZGVlcENvcHkocGFyYW1zKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcjogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudChcImRlYnVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwicmVxdWVzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWQ6IHJpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2VuZDogZXhwb3NlRGVidWdDb25maWcoY29uZmlnLCBub3coKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kOiBtZXRob2QsIHBhcmFtczogZGVlcENvcHkocGFyYW1zKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcjogdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudChcImRlYnVnXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcInJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWQ6IHJpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZW5kOiBleHBvc2VEZWJ1Z0NvbmZpZyhjb25maWcsIG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kOiBtZXRob2QsIHBhcmFtczogZGVlcENvcHkocGFyYW1zKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbmZsaWdodFdlaWdodCArPSBjb25maWcud2VpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciBhbnl0aGluZyBtZWFuaW5nZnVsIHRvIGZpbmlzaCBvciBzdGFsbCBvdXRcbiAgICAgICAgICAgICAgICBjb25zdCB3YWl0aW5nID0gW107XG4gICAgICAgICAgICAgICAgY29uZmlncy5mb3JFYWNoKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjLmRvbmUgfHwgIWMucnVubmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2FpdGluZy5wdXNoKGMucnVubmVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuc3RhbGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGluZy5wdXNoKGMuc3RhbGxlci5nZXRQcm9taXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHdhaXRpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIFByb21pc2UucmFjZSh3YWl0aW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHF1b3J1bSBhbmQgcHJvY2VzcyB0aGUgcmVzdWx0czsgdGhlIHByb2Nlc3MgZnVuY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBtYXkgYWRkaXRpb25hbGx5IGRlY2lkZSB0aGUgcXVvcnVtIGlzIG5vdCBtZXRcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gY29uZmlncy5maWx0ZXIoKGMpID0+IChjLmRvbmUgJiYgYy5lcnJvciA9PSBudWxsKSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IHRoaXMucXVvcnVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHByb2Nlc3NGdW5jKHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNodXQgZG93biBhbnkgc3RhbGxlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3MuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5zdGFsbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc3RhbGxlci5jYW5jZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0YWxsKDEwMCkuZ2V0UHJvbWlzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIE5vIHJlc3VsdCwgY2hlY2sgZm9yIGVycm9ycyB0aGF0IHNob3VsZCBiZSBmb3J3YXJkZWRcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBjb25maWdzLnJlZHVjZSgoYWNjdW0sIGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjLmRvbmUgfHwgYy5lcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IChjLmVycm9yKS5jb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoRm9yd2FyZEVycm9ycy5pbmRleE9mKGNvZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWNjdW1bY29kZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bVtjb2RlXSA9IHsgZXJyb3I6IGMuZXJyb3IsIHdlaWdodDogMCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1bY29kZV0ud2VpZ2h0ICs9IGMud2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgICAgICB9LCAoe30pKTtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goKGVycm9yQ29kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWxseSA9IGVycm9yc1tlcnJvckNvZGVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFsbHkud2VpZ2h0IDwgdGhpcy5xdW9ydW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBTaHV0IGRvd24gYW55IHN0YWxsZXJzXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ3MuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLnN0YWxsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnN0YWxsZXIuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gKHRhbGx5LmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgRm9yd2FyZFByb3BlcnRpZXMuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzW25hbWVdID0gZVtuYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKGUucmVhc29uIHx8IGUubWVzc2FnZSwgZXJyb3JDb2RlLCBwcm9wcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gQWxsIGNvbmZpZ3MgaGF2ZSBydW4gdG8gY29tcGxldGlvbjsgd2Ugd2lsbCBuZXZlciBnZXQgbW9yZSBkYXRhXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3MuZmlsdGVyKChjKSA9PiAhYy5kb25lKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2h1dCBkb3duIGFueSBzdGFsbGVyczsgc2hvdWxkbid0IGJlIGFueVxuICAgICAgICAgICAgY29uZmlncy5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjLnN0YWxsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYy5zdGFsbGVyLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjLmNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcImZhaWxlZCB0byBtZWV0IHF1b3J1bVwiLCBMb2dnZXIuZXJyb3JzLlNFUlZFUl9FUlJPUiwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICAgIC8vcmVzdWx0czogY29uZmlncy5tYXAoKGMpID0+IGMucmVzdWx0KSxcbiAgICAgICAgICAgICAgICAvL2Vycm9yczogY29uZmlncy5tYXAoKGMpID0+IGMuZXJyb3IpLFxuICAgICAgICAgICAgICAgIHJlc3VsdHM6IGNvbmZpZ3MubWFwKChjKSA9PiBleHBvc2VEZWJ1Z0NvbmZpZyhjKSksXG4gICAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mYWxsYmFjay1wcm92aWRlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGdldEFkZHJlc3MsIGdldENvbnRyYWN0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5pbXBvcnQgeyBoZXhEYXRhTGVuZ3RoLCBoZXhEYXRhU2xpY2UsIGhleFZhbHVlLCBoZXhaZXJvUGFkLCBpc0hleFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgQWRkcmVzc1plcm8gfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBzaGFsbG93Q29weSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBwYXJzZSBhcyBwYXJzZVRyYW5zYWN0aW9uIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3RyYW5zYWN0aW9uc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuZXhwb3J0IGNsYXNzIEZvcm1hdHRlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxvZ2dlci5jaGVja05ldyhuZXcudGFyZ2V0LCBGb3JtYXR0ZXIpO1xuICAgICAgICB0aGlzLmZvcm1hdHMgPSB0aGlzLmdldERlZmF1bHRGb3JtYXRzKCk7XG4gICAgfVxuICAgIGdldERlZmF1bHRGb3JtYXRzKCkge1xuICAgICAgICBjb25zdCBmb3JtYXRzID0gKHt9KTtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuYWRkcmVzcy5iaW5kKHRoaXMpO1xuICAgICAgICBjb25zdCBiaWdOdW1iZXIgPSB0aGlzLmJpZ051bWJlci5iaW5kKHRoaXMpO1xuICAgICAgICBjb25zdCBibG9ja1RhZyA9IHRoaXMuYmxvY2tUYWcuYmluZCh0aGlzKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YS5iaW5kKHRoaXMpO1xuICAgICAgICBjb25zdCBoYXNoID0gdGhpcy5oYXNoLmJpbmQodGhpcyk7XG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMuaGV4LmJpbmQodGhpcyk7XG4gICAgICAgIGNvbnN0IG51bWJlciA9IHRoaXMubnVtYmVyLmJpbmQodGhpcyk7XG4gICAgICAgIGNvbnN0IHN0cmljdERhdGEgPSAodikgPT4geyByZXR1cm4gdGhpcy5kYXRhKHYsIHRydWUpOyB9O1xuICAgICAgICBmb3JtYXRzLnRyYW5zYWN0aW9uID0ge1xuICAgICAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgICAgIGJsb2NrSGFzaDogRm9ybWF0dGVyLmFsbG93TnVsbChoYXNoLCBudWxsKSxcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKG51bWJlciwgbnVsbCksXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkluZGV4OiBGb3JtYXR0ZXIuYWxsb3dOdWxsKG51bWJlciwgbnVsbCksXG4gICAgICAgICAgICBjb25maXJtYXRpb25zOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKG51bWJlciwgbnVsbCksXG4gICAgICAgICAgICBmcm9tOiBhZGRyZXNzLFxuICAgICAgICAgICAgZ2FzUHJpY2U6IGJpZ051bWJlcixcbiAgICAgICAgICAgIGdhc0xpbWl0OiBiaWdOdW1iZXIsXG4gICAgICAgICAgICB0bzogRm9ybWF0dGVyLmFsbG93TnVsbChhZGRyZXNzLCBudWxsKSxcbiAgICAgICAgICAgIHZhbHVlOiBiaWdOdW1iZXIsXG4gICAgICAgICAgICBub25jZTogbnVtYmVyLFxuICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgIHI6IEZvcm1hdHRlci5hbGxvd051bGwodGhpcy51aW50MjU2KSxcbiAgICAgICAgICAgIHM6IEZvcm1hdHRlci5hbGxvd051bGwodGhpcy51aW50MjU2KSxcbiAgICAgICAgICAgIHY6IEZvcm1hdHRlci5hbGxvd051bGwobnVtYmVyKSxcbiAgICAgICAgICAgIGNyZWF0ZXM6IEZvcm1hdHRlci5hbGxvd051bGwoYWRkcmVzcywgbnVsbCksXG4gICAgICAgICAgICByYXc6IEZvcm1hdHRlci5hbGxvd051bGwoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1hdHMudHJhbnNhY3Rpb25SZXF1ZXN0ID0ge1xuICAgICAgICAgICAgZnJvbTogRm9ybWF0dGVyLmFsbG93TnVsbChhZGRyZXNzKSxcbiAgICAgICAgICAgIG5vbmNlOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKG51bWJlciksXG4gICAgICAgICAgICBnYXNMaW1pdDogRm9ybWF0dGVyLmFsbG93TnVsbChiaWdOdW1iZXIpLFxuICAgICAgICAgICAgZ2FzUHJpY2U6IEZvcm1hdHRlci5hbGxvd051bGwoYmlnTnVtYmVyKSxcbiAgICAgICAgICAgIHRvOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKGFkZHJlc3MpLFxuICAgICAgICAgICAgdmFsdWU6IEZvcm1hdHRlci5hbGxvd051bGwoYmlnTnVtYmVyKSxcbiAgICAgICAgICAgIGRhdGE6IEZvcm1hdHRlci5hbGxvd051bGwoc3RyaWN0RGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1hdHMucmVjZWlwdExvZyA9IHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uSW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgIGJsb2NrTnVtYmVyOiBudW1iZXIsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkhhc2g6IGhhc2gsXG4gICAgICAgICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgICAgICAgdG9waWNzOiBGb3JtYXR0ZXIuYXJyYXlPZihoYXNoKSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgICAgICBsb2dJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgYmxvY2tIYXNoOiBoYXNoLFxuICAgICAgICB9O1xuICAgICAgICBmb3JtYXRzLnJlY2VpcHQgPSB7XG4gICAgICAgICAgICB0bzogRm9ybWF0dGVyLmFsbG93TnVsbCh0aGlzLmFkZHJlc3MsIG51bGwpLFxuICAgICAgICAgICAgZnJvbTogRm9ybWF0dGVyLmFsbG93TnVsbCh0aGlzLmFkZHJlc3MsIG51bGwpLFxuICAgICAgICAgICAgY29udHJhY3RBZGRyZXNzOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKGFkZHJlc3MsIG51bGwpLFxuICAgICAgICAgICAgdHJhbnNhY3Rpb25JbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFsbG93TnVsbChoYXNoKSwgYnV0IGJyb2tlbi1FSVAtNjU4IHN1cHBvcnQgaXMgaGFuZGxlZCBpbiByZWNlaXB0XG4gICAgICAgICAgICByb290OiBGb3JtYXR0ZXIuYWxsb3dOdWxsKGhleCksXG4gICAgICAgICAgICBnYXNVc2VkOiBiaWdOdW1iZXIsXG4gICAgICAgICAgICBsb2dzQmxvb206IEZvcm1hdHRlci5hbGxvd051bGwoZGF0YSksXG4gICAgICAgICAgICBibG9ja0hhc2g6IGhhc2gsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkhhc2g6IGhhc2gsXG4gICAgICAgICAgICBsb2dzOiBGb3JtYXR0ZXIuYXJyYXlPZih0aGlzLnJlY2VpcHRMb2cuYmluZCh0aGlzKSksXG4gICAgICAgICAgICBibG9ja051bWJlcjogbnVtYmVyLFxuICAgICAgICAgICAgY29uZmlybWF0aW9uczogRm9ybWF0dGVyLmFsbG93TnVsbChudW1iZXIsIG51bGwpLFxuICAgICAgICAgICAgY3VtdWxhdGl2ZUdhc1VzZWQ6IGJpZ051bWJlcixcbiAgICAgICAgICAgIHN0YXR1czogRm9ybWF0dGVyLmFsbG93TnVsbChudW1iZXIpXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1hdHMuYmxvY2sgPSB7XG4gICAgICAgICAgICBoYXNoOiBoYXNoLFxuICAgICAgICAgICAgcGFyZW50SGFzaDogaGFzaCxcbiAgICAgICAgICAgIG51bWJlcjogbnVtYmVyLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBudW1iZXIsXG4gICAgICAgICAgICBub25jZTogRm9ybWF0dGVyLmFsbG93TnVsbChoZXgpLFxuICAgICAgICAgICAgZGlmZmljdWx0eTogdGhpcy5kaWZmaWN1bHR5LmJpbmQodGhpcyksXG4gICAgICAgICAgICBnYXNMaW1pdDogYmlnTnVtYmVyLFxuICAgICAgICAgICAgZ2FzVXNlZDogYmlnTnVtYmVyLFxuICAgICAgICAgICAgbWluZXI6IGFkZHJlc3MsXG4gICAgICAgICAgICBleHRyYURhdGE6IGRhdGEsXG4gICAgICAgICAgICB0cmFuc2FjdGlvbnM6IEZvcm1hdHRlci5hbGxvd051bGwoRm9ybWF0dGVyLmFycmF5T2YoaGFzaCkpLFxuICAgICAgICB9O1xuICAgICAgICBmb3JtYXRzLmJsb2NrV2l0aFRyYW5zYWN0aW9ucyA9IHNoYWxsb3dDb3B5KGZvcm1hdHMuYmxvY2spO1xuICAgICAgICBmb3JtYXRzLmJsb2NrV2l0aFRyYW5zYWN0aW9ucy50cmFuc2FjdGlvbnMgPSBGb3JtYXR0ZXIuYWxsb3dOdWxsKEZvcm1hdHRlci5hcnJheU9mKHRoaXMudHJhbnNhY3Rpb25SZXNwb25zZS5iaW5kKHRoaXMpKSk7XG4gICAgICAgIGZvcm1hdHMuZmlsdGVyID0ge1xuICAgICAgICAgICAgZnJvbUJsb2NrOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKGJsb2NrVGFnLCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgdG9CbG9jazogRm9ybWF0dGVyLmFsbG93TnVsbChibG9ja1RhZywgdW5kZWZpbmVkKSxcbiAgICAgICAgICAgIGJsb2NrSGFzaDogRm9ybWF0dGVyLmFsbG93TnVsbChoYXNoLCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgYWRkcmVzczogRm9ybWF0dGVyLmFsbG93TnVsbChhZGRyZXNzLCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgdG9waWNzOiBGb3JtYXR0ZXIuYWxsb3dOdWxsKHRoaXMudG9waWNzLmJpbmQodGhpcyksIHVuZGVmaW5lZCksXG4gICAgICAgIH07XG4gICAgICAgIGZvcm1hdHMuZmlsdGVyTG9nID0ge1xuICAgICAgICAgICAgYmxvY2tOdW1iZXI6IEZvcm1hdHRlci5hbGxvd051bGwobnVtYmVyKSxcbiAgICAgICAgICAgIGJsb2NrSGFzaDogRm9ybWF0dGVyLmFsbG93TnVsbChoYXNoKSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uSW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgIHJlbW92ZWQ6IEZvcm1hdHRlci5hbGxvd051bGwodGhpcy5ib29sZWFuLmJpbmQodGhpcykpLFxuICAgICAgICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgICAgICAgIGRhdGE6IEZvcm1hdHRlci5hbGxvd0ZhbHNpc2goZGF0YSwgXCIweFwiKSxcbiAgICAgICAgICAgIHRvcGljczogRm9ybWF0dGVyLmFycmF5T2YoaGFzaCksXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkhhc2g6IGhhc2gsXG4gICAgICAgICAgICBsb2dJbmRleDogbnVtYmVyLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybWF0cztcbiAgICB9XG4gICAgLy8gUmVxdWlyZXMgYSBCaWdOdW1iZXJpc2ggdGhhdCBpcyB3aXRoaW4gdGhlIElFRUU3NTQgc2FmZSBpbnRlZ2VyIHJhbmdlOyByZXR1cm5zIGEgbnVtYmVyXG4gICAgLy8gU3RyaWN0ISBVc2VkIG9uIGlucHV0LlxuICAgIG51bWJlcihudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA9PT0gXCIweFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmlnTnVtYmVyLmZyb20obnVtYmVyKS50b051bWJlcigpO1xuICAgIH1cbiAgICAvLyBTdHJpY3QhIFVzZWQgb24gaW5wdXQuXG4gICAgYmlnTnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBCaWdOdW1iZXIuZnJvbSh2YWx1ZSk7XG4gICAgfVxuICAgIC8vIFJlcXVpcmVzIGEgYm9vbGVhbiwgXCJ0cnVlXCIgb3IgIFwiZmFsc2VcIjsgcmV0dXJucyBhIGJvb2xlYW5cbiAgICBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYm9vbGVhbiAtIFwiICsgdmFsdWUpO1xuICAgIH1cbiAgICBoZXgodmFsdWUsIHN0cmljdCkge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmICghc3RyaWN0ICYmIHZhbHVlLnN1YnN0cmluZygwLCAyKSAhPT0gXCIweFwiKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIjB4XCIgKyB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgaGFzaFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICB9XG4gICAgZGF0YSh2YWx1ZSwgc3RyaWN0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGV4KHZhbHVlLCBzdHJpY3QpO1xuICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGggJSAyKSAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBkYXRhOyBvZGQtbGVuZ3RoIC0gXCIgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gUmVxdWlyZXMgYW4gYWRkcmVzc1xuICAgIC8vIFN0cmljdCEgVXNlZCBvbiBpbnB1dC5cbiAgICBhZGRyZXNzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBnZXRBZGRyZXNzKHZhbHVlKTtcbiAgICB9XG4gICAgY2FsbEFkZHJlc3ModmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc0hleFN0cmluZyh2YWx1ZSwgMzIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZGRyZXNzID0gZ2V0QWRkcmVzcyhoZXhEYXRhU2xpY2UodmFsdWUsIDEyKSk7XG4gICAgICAgIHJldHVybiAoYWRkcmVzcyA9PT0gQWRkcmVzc1plcm8pID8gbnVsbCA6IGFkZHJlc3M7XG4gICAgfVxuICAgIGNvbnRyYWN0QWRkcmVzcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZ2V0Q29udHJhY3RBZGRyZXNzKHZhbHVlKTtcbiAgICB9XG4gICAgLy8gU3RyaWN0ISBVc2VkIG9uIGlucHV0LlxuICAgIGJsb2NrVGFnKGJsb2NrVGFnKSB7XG4gICAgICAgIGlmIChibG9ja1RhZyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmxvY2tUYWcgPT09IFwiZWFybGllc3RcIikge1xuICAgICAgICAgICAgcmV0dXJuIFwiMHgwXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJsb2NrVGFnID09PSBcImxhdGVzdFwiIHx8IGJsb2NrVGFnID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2NrVGFnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKGJsb2NrVGFnKSA9PT0gXCJudW1iZXJcIiB8fCBpc0hleFN0cmluZyhibG9ja1RhZykpIHtcbiAgICAgICAgICAgIHJldHVybiBoZXhWYWx1ZShibG9ja1RhZyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBibG9ja1RhZ1wiKTtcbiAgICB9XG4gICAgLy8gUmVxdWlyZXMgYSBoYXNoLCBvcHRpb25hbGx5IHJlcXVpcmVzIDB4IHByZWZpeDsgcmV0dXJucyBwcmVmaXhlZCBsb3dlcmNhc2UgaGFzaC5cbiAgICBoYXNoKHZhbHVlLCBzdHJpY3QpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oZXgodmFsdWUsIHN0cmljdCk7XG4gICAgICAgIGlmIChoZXhEYXRhTGVuZ3RoKHJlc3VsdCkgIT09IDMyKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgaGFzaFwiLCBcInZhbHVlXCIsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSBkaWZmaWN1bHR5IGFzIGEgbnVtYmVyLCBvciBpZiB0b28gbGFyZ2UgKGkuZS4gUG9BIG5ldHdvcmspIG51bGxcbiAgICBkaWZmaWN1bHR5KHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ID0gQmlnTnVtYmVyLmZyb20odmFsdWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHYudG9OdW1iZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHsgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdWludDI1Nih2YWx1ZSkge1xuICAgICAgICBpZiAoIWlzSGV4U3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB1aW50MjU2XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoZXhaZXJvUGFkKHZhbHVlLCAzMik7XG4gICAgfVxuICAgIF9ibG9jayh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICAgIGlmICh2YWx1ZS5hdXRob3IgIT0gbnVsbCAmJiB2YWx1ZS5taW5lciA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZS5taW5lciA9IHZhbHVlLmF1dGhvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRm9ybWF0dGVyLmNoZWNrKGZvcm1hdCwgdmFsdWUpO1xuICAgIH1cbiAgICBibG9jayh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2sodmFsdWUsIHRoaXMuZm9ybWF0cy5ibG9jayk7XG4gICAgfVxuICAgIGJsb2NrV2l0aFRyYW5zYWN0aW9ucyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2sodmFsdWUsIHRoaXMuZm9ybWF0cy5ibG9ja1dpdGhUcmFuc2FjdGlvbnMpO1xuICAgIH1cbiAgICAvLyBTdHJpY3QhIFVzZWQgb24gaW5wdXQuXG4gICAgdHJhbnNhY3Rpb25SZXF1ZXN0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBGb3JtYXR0ZXIuY2hlY2sodGhpcy5mb3JtYXRzLnRyYW5zYWN0aW9uUmVxdWVzdCwgdmFsdWUpO1xuICAgIH1cbiAgICB0cmFuc2FjdGlvblJlc3BvbnNlKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIC8vIFJlbmFtZSBnYXMgdG8gZ2FzTGltaXRcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmdhcyAhPSBudWxsICYmIHRyYW5zYWN0aW9uLmdhc0xpbWl0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmdhc0xpbWl0ID0gdHJhbnNhY3Rpb24uZ2FzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbWUgY2xpZW50cyAoVGVzdFJQQykgZG8gc3RyYW5nZSB0aGluZ3MgbGlrZSByZXR1cm4gMHgwIGZvciB0aGVcbiAgICAgICAgLy8gMCBhZGRyZXNzOyBjb3JyZWN0IHRoaXMgdG8gYmUgYSByZWFsIGFkZHJlc3NcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnRvICYmIEJpZ051bWJlci5mcm9tKHRyYW5zYWN0aW9uLnRvKS5pc1plcm8oKSkge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24udG8gPSBcIjB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbmFtZSBpbnB1dCB0byBkYXRhXG4gICAgICAgIGlmICh0cmFuc2FjdGlvbi5pbnB1dCAhPSBudWxsICYmIHRyYW5zYWN0aW9uLmRhdGEgPT0gbnVsbCkge1xuICAgICAgICAgICAgdHJhbnNhY3Rpb24uZGF0YSA9IHRyYW5zYWN0aW9uLmlucHV0O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRvIGFuZCBjcmVhdGVzIGFyZSBlbXB0eSwgcG9wdWxhdGUgdGhlIGNyZWF0ZXMgZnJvbSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLnRvID09IG51bGwgJiYgdHJhbnNhY3Rpb24uY3JlYXRlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5jcmVhdGVzID0gdGhpcy5jb250cmFjdEFkZHJlc3ModHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEBUT0RPOiB1c2UgdHJhbnNhY3Rpb24uc2VyaWFsaXplPyBIYXZlIHRvIGFkZCBzdXBwb3J0IGZvciBpbmNsdWRpbmcgdiwgciwgYW5kIHMuLi5cbiAgICAgICAgLypcbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5yYXcpIHtcbiBcbiAgICAgICAgICAgICAvLyBWZXJ5IGxvb3NlIHByb3ZpZGVycyAoZS5nLiBUZXN0UlBDKSBkbyBub3QgcHJvdmlkZSBhIHNpZ25hdHVyZSBvciByYXdcbiAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24udiAmJiB0cmFuc2FjdGlvbi5yICYmIHRyYW5zYWN0aW9uLnMpIHtcbiAgICAgICAgICAgICAgICAgbGV0IHJhdyA9IFtcbiAgICAgICAgICAgICAgICAgICAgIHN0cmlwWmVyb3MoaGV4bGlmeSh0cmFuc2FjdGlvbi5ub25jZSkpLFxuICAgICAgICAgICAgICAgICAgICAgc3RyaXBaZXJvcyhoZXhsaWZ5KHRyYW5zYWN0aW9uLmdhc1ByaWNlKSksXG4gICAgICAgICAgICAgICAgICAgICBzdHJpcFplcm9zKGhleGxpZnkodHJhbnNhY3Rpb24uZ2FzTGltaXQpKSxcbiAgICAgICAgICAgICAgICAgICAgICh0cmFuc2FjdGlvbi50byB8fCBcIjB4XCIpLFxuICAgICAgICAgICAgICAgICAgICAgc3RyaXBaZXJvcyhoZXhsaWZ5KHRyYW5zYWN0aW9uLnZhbHVlIHx8IFwiMHhcIikpLFxuICAgICAgICAgICAgICAgICAgICAgaGV4bGlmeSh0cmFuc2FjdGlvbi5kYXRhIHx8IFwiMHhcIiksXG4gICAgICAgICAgICAgICAgICAgICBzdHJpcFplcm9zKGhleGxpZnkodHJhbnNhY3Rpb24udiB8fCBcIjB4XCIpKSxcbiAgICAgICAgICAgICAgICAgICAgIHN0cmlwWmVyb3MoaGV4bGlmeSh0cmFuc2FjdGlvbi5yKSksXG4gICAgICAgICAgICAgICAgICAgICBzdHJpcFplcm9zKGhleGxpZnkodHJhbnNhY3Rpb24ucykpLFxuICAgICAgICAgICAgICAgICBdO1xuIFxuICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5yYXcgPSBybHBFbmNvZGUocmF3KTtcbiAgICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCByZXN1bHQgPSBGb3JtYXR0ZXIuY2hlY2sodGhpcy5mb3JtYXRzLnRyYW5zYWN0aW9uLCB0cmFuc2FjdGlvbik7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbi5jaGFpbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBjaGFpbklkID0gdHJhbnNhY3Rpb24uY2hhaW5JZDtcbiAgICAgICAgICAgIGlmIChpc0hleFN0cmluZyhjaGFpbklkKSkge1xuICAgICAgICAgICAgICAgIGNoYWluSWQgPSBCaWdOdW1iZXIuZnJvbShjaGFpbklkKS50b051bWJlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LmNoYWluSWQgPSBjaGFpbklkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNoYWluSWQgPSB0cmFuc2FjdGlvbi5uZXR3b3JrSWQ7XG4gICAgICAgICAgICAvLyBnZXRoLWV0YyByZXR1cm5zIGNoYWluSWRcbiAgICAgICAgICAgIGlmIChjaGFpbklkID09IG51bGwgJiYgcmVzdWx0LnYgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNoYWluSWQgPSB0cmFuc2FjdGlvbi5jaGFpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzSGV4U3RyaW5nKGNoYWluSWQpKSB7XG4gICAgICAgICAgICAgICAgY2hhaW5JZCA9IEJpZ051bWJlci5mcm9tKGNoYWluSWQpLnRvTnVtYmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIChjaGFpbklkKSAhPT0gXCJudW1iZXJcIiAmJiByZXN1bHQudiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2hhaW5JZCA9IChyZXN1bHQudiAtIDM1KSAvIDI7XG4gICAgICAgICAgICAgICAgaWYgKGNoYWluSWQgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYWluSWQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGFpbklkID0gcGFyc2VJbnQoY2hhaW5JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIChjaGFpbklkKSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGNoYWluSWQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LmNoYWluSWQgPSBjaGFpbklkO1xuICAgICAgICB9XG4gICAgICAgIC8vIDB4MDAwMC4uLiBzaG91bGQgYWN0dWFsbHkgYmUgbnVsbFxuICAgICAgICBpZiAocmVzdWx0LmJsb2NrSGFzaCAmJiByZXN1bHQuYmxvY2tIYXNoLnJlcGxhY2UoLzAvZywgXCJcIikgPT09IFwieFwiKSB7XG4gICAgICAgICAgICByZXN1bHQuYmxvY2tIYXNoID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cmFuc2FjdGlvbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gcGFyc2VUcmFuc2FjdGlvbih2YWx1ZSk7XG4gICAgfVxuICAgIHJlY2VpcHRMb2codmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEZvcm1hdHRlci5jaGVjayh0aGlzLmZvcm1hdHMucmVjZWlwdExvZywgdmFsdWUpO1xuICAgIH1cbiAgICByZWNlaXB0KHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IEZvcm1hdHRlci5jaGVjayh0aGlzLmZvcm1hdHMucmVjZWlwdCwgdmFsdWUpO1xuICAgICAgICAvLyBSU0sgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgRUlQLTY1OCwgc28gd2UgbXVuZ2UgdGhpbmdzIGEgYml0IGhlcmUgZm9yIGl0XG4gICAgICAgIGlmIChyZXN1bHQucm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0LnJvb3QubGVuZ3RoIDw9IDQpIHtcbiAgICAgICAgICAgICAgICAvLyBDb3VsZCBiZSAweDAwLCAweDAsIDB4MDEgb3IgMHgxXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBCaWdOdW1iZXIuZnJvbShyZXN1bHQucm9vdCkudG9OdW1iZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDAgfHwgdmFsdWUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGlmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhleSBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPSBudWxsICYmIChyZXN1bHQuc3RhdHVzICE9PSB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJhbHQtcm9vdC1zdGF0dXMvc3RhdHVzIG1pc21hdGNoXCIsIFwidmFsdWVcIiwgeyByb290OiByZXN1bHQucm9vdCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5yb290O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYWx0LXJvb3Qtc3RhdHVzXCIsIFwidmFsdWUucm9vdFwiLCByZXN1bHQucm9vdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LnJvb3QubGVuZ3RoICE9PSA2Nikge1xuICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgYSB2YWxpZCBieXRlczMyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgcm9vdCBoYXNoXCIsIFwidmFsdWUucm9vdFwiLCByZXN1bHQucm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LmJ5emFudGl1bSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgdG9waWNzKHZhbHVlKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT4gdGhpcy50b3BpY3ModikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc2godmFsdWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmaWx0ZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIEZvcm1hdHRlci5jaGVjayh0aGlzLmZvcm1hdHMuZmlsdGVyLCB2YWx1ZSk7XG4gICAgfVxuICAgIGZpbHRlckxvZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gRm9ybWF0dGVyLmNoZWNrKHRoaXMuZm9ybWF0cy5maWx0ZXJMb2csIHZhbHVlKTtcbiAgICB9XG4gICAgc3RhdGljIGNoZWNrKGZvcm1hdCwgb2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtYXQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBmb3JtYXRba2V5XShvYmplY3Rba2V5XSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvci5jaGVja0tleSA9IGtleTtcbiAgICAgICAgICAgICAgICBlcnJvci5jaGVja1ZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gaWYgdmFsdWUgaXMgbnVsbC1pc2gsIG51bGxWYWx1ZSBpcyByZXR1cm5lZFxuICAgIHN0YXRpYyBhbGxvd051bGwoZm9ybWF0LCBudWxsVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmb3JtYXQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gSWYgdmFsdWUgaXMgZmFsc2UtaXNoLCByZXBsYWNlVmFsdWUgaXMgcmV0dXJuZWRcbiAgICBzdGF0aWMgYWxsb3dGYWxzaXNoKGZvcm1hdCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiAoZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmb3JtYXQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gUmVxdWlyZXMgYW4gQXJyYXkgc2F0aXNmeWluZyBjaGVja1xuICAgIHN0YXRpYyBhcnJheU9mKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gKGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGFycmF5KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCBhbiBhcnJheVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChmb3JtYXQodmFsdWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbXVuaXR5UmVzb3VyY2FibGUodmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiAodmFsdWUuaXNDb21tdW5pdHlSZXNvdXJjZSkgPT09IFwiZnVuY3Rpb25cIik7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNDb21tdW5pdHlSZXNvdXJjZSh2YWx1ZSkge1xuICAgIHJldHVybiAoaXNDb21tdW5pdHlSZXNvdXJjYWJsZSh2YWx1ZSkgJiYgdmFsdWUuaXNDb21tdW5pdHlSZXNvdXJjZSgpKTtcbn1cbi8vIFNob3cgdGhlIHRocm90dGxlIG1lc3NhZ2Ugb25seSBvbmNlXG5sZXQgdGhyb3R0bGVNZXNzYWdlID0gZmFsc2U7XG5leHBvcnQgZnVuY3Rpb24gc2hvd1Rocm90dGxlTWVzc2FnZSgpIHtcbiAgICBpZiAodGhyb3R0bGVNZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3R0bGVNZXNzYWdlID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhcIj09PT09PT09PSBOT1RJQ0UgPT09PT09PT09XCIpO1xuICAgIGNvbnNvbGUubG9nKFwiUmVxdWVzdC1SYXRlIEV4Y2VlZGVkICAodGhpcyBtZXNzYWdlIHdpbGwgbm90IGJlIHJlcGVhdGVkKVwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlRoZSBkZWZhdWx0IEFQSSBrZXlzIGZvciBlYWNoIHNlcnZpY2UgYXJlIHByb3ZpZGVkIGFzIGEgaGlnaGx5LXRocm90dGxlZCxcIik7XG4gICAgY29uc29sZS5sb2coXCJjb21tdW5pdHkgcmVzb3VyY2UgZm9yIGxvdy10cmFmZmljIHByb2plY3RzIGFuZCBlYXJseSBwcm90b3R5cGluZy5cIik7XG4gICAgY29uc29sZS5sb2coXCJcIik7XG4gICAgY29uc29sZS5sb2coXCJXaGlsZSB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgY29udGludWUgdG8gZnVuY3Rpb24sIHdlIGhpZ2hseSByZWNvbW1lbmRlZFwiKTtcbiAgICBjb25zb2xlLmxvZyhcInNpZ25pbmcgdXAgZm9yIHlvdXIgb3duIEFQSSBrZXlzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIGluY3JlYXNlIHlvdXJcIik7XG4gICAgY29uc29sZS5sb2coXCJyZXF1ZXN0IHJhdGUvbGltaXQgYW5kIGVuYWJsZSBvdGhlciBwZXJrcywgc3VjaCBhcyBtZXRyaWNzIGFuZCBhZHZhbmNlZCBBUElzLlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIlwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkZvciBtb3JlIGRldGFpbHM6IGh0dHBzOi9cXC9kb2NzLmV0aGVycy5pby9hcGkta2V5cy9cIik7XG4gICAgY29uc29sZS5sb2coXCI9PT09PT09PT09PT09PT09PT09PT09PT09PVwiKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWZvcm1hdHRlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2Fic3RyYWN0LXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBnZXROZXR3b3JrIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L25ldHdvcmtzXCI7XG5pbXBvcnQgeyBCYXNlUHJvdmlkZXIsIFJlc29sdmVyIH0gZnJvbSBcIi4vYmFzZS1wcm92aWRlclwiO1xuaW1wb3J0IHsgQWxjaGVteVByb3ZpZGVyLCBBbGNoZW15V2ViU29ja2V0UHJvdmlkZXIgfSBmcm9tIFwiLi9hbGNoZW15LXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBDbG91ZGZsYXJlUHJvdmlkZXIgfSBmcm9tIFwiLi9jbG91ZGZsYXJlLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBFdGhlcnNjYW5Qcm92aWRlciB9IGZyb20gXCIuL2V0aGVyc2Nhbi1wcm92aWRlclwiO1xuaW1wb3J0IHsgRmFsbGJhY2tQcm92aWRlciB9IGZyb20gXCIuL2ZhbGxiYWNrLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBJcGNQcm92aWRlciB9IGZyb20gXCIuL2lwYy1wcm92aWRlclwiO1xuaW1wb3J0IHsgSW5mdXJhUHJvdmlkZXIsIEluZnVyYVdlYlNvY2tldFByb3ZpZGVyIH0gZnJvbSBcIi4vaW5mdXJhLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBKc29uUnBjUHJvdmlkZXIsIEpzb25ScGNTaWduZXIgfSBmcm9tIFwiLi9qc29uLXJwYy1wcm92aWRlclwiO1xuaW1wb3J0IHsgTm9kZXNtaXRoUHJvdmlkZXIgfSBmcm9tIFwiLi9ub2Rlc21pdGgtcHJvdmlkZXJcIjtcbmltcG9ydCB7IFBvY2tldFByb3ZpZGVyIH0gZnJvbSBcIi4vcG9ja2V0LXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBTdGF0aWNKc29uUnBjUHJvdmlkZXIsIFVybEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuL3VybC1qc29uLXJwYy1wcm92aWRlclwiO1xuaW1wb3J0IHsgV2ViM1Byb3ZpZGVyIH0gZnJvbSBcIi4vd2ViMy1wcm92aWRlclwiO1xuaW1wb3J0IHsgV2ViU29ja2V0UHJvdmlkZXIgfSBmcm9tIFwiLi93ZWJzb2NrZXQtcHJvdmlkZXJcIjtcbmltcG9ydCB7IEZvcm1hdHRlciwgaXNDb21tdW5pdHlSZXNvdXJjYWJsZSwgaXNDb21tdW5pdHlSZXNvdXJjZSwgc2hvd1Rocm90dGxlTWVzc2FnZSB9IGZyb20gXCIuL2Zvcm1hdHRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBIZWxwZXIgRnVuY3Rpb25zXG5mdW5jdGlvbiBnZXREZWZhdWx0UHJvdmlkZXIobmV0d29yaywgb3B0aW9ucykge1xuICAgIGlmIChuZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgbmV0d29yayA9IFwiaG9tZXN0ZWFkXCI7XG4gICAgfVxuICAgIC8vIElmIHBhc3NlZCBhIFVSTCwgZmlndXJlIG91dCB0aGUgcmlnaHQgdHlwZSBvZiBwcm92aWRlciBiYXNlZCBvbiB0aGUgc2NoZW1lXG4gICAgaWYgKHR5cGVvZiAobmV0d29yaykgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgLy8gQFRPRE86IEFkZCBzdXBwb3J0IGZvciBJcGNQcm92aWRlcjsgbWF5YmUgaWYgaXQgZW5kcyBpbiBcIi5pcGNcIj9cbiAgICAgICAgLy8gSGFuZGxlIGh0dHAgYW5kIHdzIChhbmQgdGhlaXIgc2VjdXJlIHZhcmlhbnRzKVxuICAgICAgICBjb25zdCBtYXRjaCA9IG5ldHdvcmsubWF0Y2goL14od3N8aHR0cClzPzovaSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgc3dpdGNoIChtYXRjaFsxXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJodHRwXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSnNvblJwY1Byb3ZpZGVyKG5ldHdvcmspO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ3c1wiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlYlNvY2tldFByb3ZpZGVyKG5ldHdvcmspO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJ1bnN1cHBvcnRlZCBVUkwgc2NoZW1lXCIsIFwibmV0d29ya1wiLCBuZXR3b3JrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBuID0gZ2V0TmV0d29yayhuZXR3b3JrKTtcbiAgICBpZiAoIW4gfHwgIW4uX2RlZmF1bHRQcm92aWRlcikge1xuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVuc3VwcG9ydGVkIGdldERlZmF1bHRQcm92aWRlciBuZXR3b3JrXCIsIExvZ2dlci5lcnJvcnMuTkVUV09SS19FUlJPUiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcImdldERlZmF1bHRQcm92aWRlclwiLFxuICAgICAgICAgICAgbmV0d29yazogbmV0d29ya1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG4uX2RlZmF1bHRQcm92aWRlcih7XG4gICAgICAgIEZhbGxiYWNrUHJvdmlkZXIsXG4gICAgICAgIEFsY2hlbXlQcm92aWRlcixcbiAgICAgICAgQ2xvdWRmbGFyZVByb3ZpZGVyLFxuICAgICAgICBFdGhlcnNjYW5Qcm92aWRlcixcbiAgICAgICAgSW5mdXJhUHJvdmlkZXIsXG4gICAgICAgIEpzb25ScGNQcm92aWRlcixcbiAgICAgICAgTm9kZXNtaXRoUHJvdmlkZXIsXG4gICAgICAgIFBvY2tldFByb3ZpZGVyLFxuICAgICAgICBXZWIzUHJvdmlkZXIsXG4gICAgICAgIElwY1Byb3ZpZGVyLFxuICAgIH0sIG9wdGlvbnMpO1xufVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBFeHBvcnRzXG5leHBvcnQgeyBcbi8vIEFic3RyYWN0IFByb3ZpZGVycyAob3IgQWJzdHJhY3QtaXNoKVxuUHJvdmlkZXIsIEJhc2VQcm92aWRlciwgUmVzb2x2ZXIsIFVybEpzb25ScGNQcm92aWRlciwgXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ29uY3JlYXRlIFByb3ZpZGVyc1xuRmFsbGJhY2tQcm92aWRlciwgQWxjaGVteVByb3ZpZGVyLCBBbGNoZW15V2ViU29ja2V0UHJvdmlkZXIsIENsb3VkZmxhcmVQcm92aWRlciwgRXRoZXJzY2FuUHJvdmlkZXIsIEluZnVyYVByb3ZpZGVyLCBJbmZ1cmFXZWJTb2NrZXRQcm92aWRlciwgSnNvblJwY1Byb3ZpZGVyLCBOb2Rlc21pdGhQcm92aWRlciwgUG9ja2V0UHJvdmlkZXIsIFN0YXRpY0pzb25ScGNQcm92aWRlciwgV2ViM1Byb3ZpZGVyLCBXZWJTb2NrZXRQcm92aWRlciwgSXBjUHJvdmlkZXIsIFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFNpZ25lclxuSnNvblJwY1NpZ25lciwgXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRnVuY3Rpb25zXG5nZXREZWZhdWx0UHJvdmlkZXIsIGdldE5ldHdvcmssIGlzQ29tbXVuaXR5UmVzb3VyY2UsIGlzQ29tbXVuaXR5UmVzb3VyY2FibGUsIHNob3dUaHJvdHRsZU1lc3NhZ2UsIFxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIE9iamVjdHNcbkZvcm1hdHRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXRQcm92aWRlciB9IGZyb20gXCIuL3dlYnNvY2tldC1wcm92aWRlclwiO1xuaW1wb3J0IHsgc2hvd1Rocm90dGxlTWVzc2FnZSB9IGZyb20gXCIuL2Zvcm1hdHRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuaW1wb3J0IHsgVXJsSnNvblJwY1Byb3ZpZGVyIH0gZnJvbSBcIi4vdXJsLWpzb24tcnBjLXByb3ZpZGVyXCI7XG5jb25zdCBkZWZhdWx0UHJvamVjdElkID0gXCI4NDg0MjA3OGIwOTk0NjYzOGMwMzE1N2Y4MzQwNTIxM1wiO1xuZXhwb3J0IGNsYXNzIEluZnVyYVdlYlNvY2tldFByb3ZpZGVyIGV4dGVuZHMgV2ViU29ja2V0UHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKG5ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBJbmZ1cmFQcm92aWRlcihuZXR3b3JrLCBhcGlLZXkpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gcHJvdmlkZXIuY29ubmVjdGlvbjtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24ucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiSU5GVVJBIFdlYlNvY2tldCBwcm9qZWN0IHNlY3JldHMgdW5zdXBwb3J0ZWRcIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwiSW5mdXJhUHJvdmlkZXIuZ2V0V2ViU29ja2V0UHJvdmlkZXIoKVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmwgPSBjb25uZWN0aW9uLnVybC5yZXBsYWNlKC9eaHR0cC9pLCBcIndzXCIpLnJlcGxhY2UoXCIvdjMvXCIsIFwiL3dzL3YzL1wiKTtcbiAgICAgICAgc3VwZXIodXJsLCBuZXR3b3JrKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJhcGlLZXlcIiwgcHJvdmlkZXIucHJvamVjdElkKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJwcm9qZWN0SWRcIiwgcHJvdmlkZXIucHJvamVjdElkKTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJwcm9qZWN0U2VjcmV0XCIsIHByb3ZpZGVyLnByb2plY3RTZWNyZXQpO1xuICAgIH1cbiAgICBpc0NvbW11bml0eVJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucHJvamVjdElkID09PSBkZWZhdWx0UHJvamVjdElkKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgSW5mdXJhUHJvdmlkZXIgZXh0ZW5kcyBVcmxKc29uUnBjUHJvdmlkZXIge1xuICAgIHN0YXRpYyBnZXRXZWJTb2NrZXRQcm92aWRlcihuZXR3b3JrLCBhcGlLZXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbmZ1cmFXZWJTb2NrZXRQcm92aWRlcihuZXR3b3JrLCBhcGlLZXkpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0QXBpS2V5KGFwaUtleSkge1xuICAgICAgICBjb25zdCBhcGlLZXlPYmogPSB7XG4gICAgICAgICAgICBhcGlLZXk6IGRlZmF1bHRQcm9qZWN0SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQ6IGRlZmF1bHRQcm9qZWN0SWQsXG4gICAgICAgICAgICBwcm9qZWN0U2VjcmV0OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhcGlLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGFwaUtleU9iajtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChhcGlLZXkpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBhcGlLZXlPYmoucHJvamVjdElkID0gYXBpS2V5O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFwaUtleS5wcm9qZWN0U2VjcmV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci5hc3NlcnRBcmd1bWVudCgodHlwZW9mIChhcGlLZXkucHJvamVjdElkKSA9PT0gXCJzdHJpbmdcIiksIFwicHJvamVjdFNlY3JldCByZXF1aXJlcyBhIHByb2plY3RJZFwiLCBcInByb2plY3RJZFwiLCBhcGlLZXkucHJvamVjdElkKTtcbiAgICAgICAgICAgIGxvZ2dlci5hc3NlcnRBcmd1bWVudCgodHlwZW9mIChhcGlLZXkucHJvamVjdFNlY3JldCkgPT09IFwic3RyaW5nXCIpLCBcImludmFsaWQgcHJvamVjdFNlY3JldFwiLCBcInByb2plY3RTZWNyZXRcIiwgXCJbUkVEQUNURURdXCIpO1xuICAgICAgICAgICAgYXBpS2V5T2JqLnByb2plY3RJZCA9IGFwaUtleS5wcm9qZWN0SWQ7XG4gICAgICAgICAgICBhcGlLZXlPYmoucHJvamVjdFNlY3JldCA9IGFwaUtleS5wcm9qZWN0U2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFwaUtleS5wcm9qZWN0SWQpIHtcbiAgICAgICAgICAgIGFwaUtleU9iai5wcm9qZWN0SWQgPSBhcGlLZXkucHJvamVjdElkO1xuICAgICAgICB9XG4gICAgICAgIGFwaUtleU9iai5hcGlLZXkgPSBhcGlLZXlPYmoucHJvamVjdElkO1xuICAgICAgICByZXR1cm4gYXBpS2V5T2JqO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VXJsKG5ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBsZXQgaG9zdCA9IG51bGw7XG4gICAgICAgIHN3aXRjaCAobmV0d29yayA/IG5ldHdvcmsubmFtZSA6IFwidW5rbm93blwiKSB7XG4gICAgICAgICAgICBjYXNlIFwiaG9tZXN0ZWFkXCI6XG4gICAgICAgICAgICAgICAgaG9zdCA9IFwibWFpbm5ldC5pbmZ1cmEuaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyb3BzdGVuXCI6XG4gICAgICAgICAgICAgICAgaG9zdCA9IFwicm9wc3Rlbi5pbmZ1cmEuaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyaW5rZWJ5XCI6XG4gICAgICAgICAgICAgICAgaG9zdCA9IFwicmlua2VieS5pbmZ1cmEuaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJrb3ZhblwiOlxuICAgICAgICAgICAgICAgIGhvc3QgPSBcImtvdmFuLmluZnVyYS5pb1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdvZXJsaVwiOlxuICAgICAgICAgICAgICAgIGhvc3QgPSBcImdvZXJsaS5pbmZ1cmEuaW9cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIExvZ2dlci5lcnJvcnMuSU5WQUxJRF9BUkdVTUVOVCwge1xuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDogXCJuZXR3b3JrXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXR3b3JrXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIGFsbG93R3ppcDogdHJ1ZSxcbiAgICAgICAgICAgIHVybDogKFwiaHR0cHM6L1wiICsgXCIvXCIgKyBob3N0ICsgXCIvdjMvXCIgKyBhcGlLZXkucHJvamVjdElkKSxcbiAgICAgICAgICAgIHRocm90dGxlQ2FsbGJhY2s6IChhdHRlbXB0LCB1cmwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYXBpS2V5LnByb2plY3RJZCA9PT0gZGVmYXVsdFByb2plY3RJZCkge1xuICAgICAgICAgICAgICAgICAgICBzaG93VGhyb3R0bGVNZXNzYWdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChhcGlLZXkucHJvamVjdFNlY3JldCAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25uZWN0aW9uLnVzZXIgPSBcIlwiO1xuICAgICAgICAgICAgY29ubmVjdGlvbi5wYXNzd29yZCA9IGFwaUtleS5wcm9qZWN0U2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25uZWN0aW9uO1xuICAgIH1cbiAgICBpc0NvbW11bml0eVJlc291cmNlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucHJvamVjdElkID09PSBkZWZhdWx0UHJvamVjdElkKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmZ1cmEtcHJvdmlkZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBJcGNQcm92aWRlciA9IG51bGw7XG5leHBvcnQgeyBJcGNQcm92aWRlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aXBjLXByb3ZpZGVyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBTaWduZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYWJzdHJhY3Qtc2lnbmVyXCI7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5pbXBvcnQgeyBoZXhsaWZ5LCBoZXhWYWx1ZSwgaXNIZXhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IF9UeXBlZERhdGFFbmNvZGVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2hhc2hcIjtcbmltcG9ydCB7IGNoZWNrUHJvcGVydGllcywgZGVlcENvcHksIGRlZmluZVJlYWRPbmx5LCBnZXRTdGF0aWMsIHJlc29sdmVQcm9wZXJ0aWVzLCBzaGFsbG93Q29weSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyB0b1V0ZjhCeXRlcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9zdHJpbmdzXCI7XG5pbXBvcnQgeyBmZXRjaEpzb24sIHBvbGwgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvd2ViXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBCYXNlUHJvdmlkZXIgfSBmcm9tIFwiLi9iYXNlLXByb3ZpZGVyXCI7XG5jb25zdCBlcnJvckdhcyA9IFtcImNhbGxcIiwgXCJlc3RpbWF0ZUdhc1wiXTtcbmZ1bmN0aW9uIGNoZWNrRXJyb3IobWV0aG9kLCBlcnJvciwgcGFyYW1zKSB7XG4gICAgLy8gVW5kbyB0aGUgXCJjb252ZW5pZW5jZVwiIHNvbWUgbm9kZXMgYXJlIGF0dGVtcHRpbmcgdG8gcHJldmVudCBiYWNrd2FyZHNcbiAgICAvLyBpbmNvbXBhdGliaWxpdHk7IG1heWJlIGZvciB2NiBjb25zaWRlciBmb3J3YXJkaW5nIHJldmVydHMgYXMgZXJyb3JzXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJjYWxsXCIgJiYgZXJyb3IuY29kZSA9PT0gTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IpIHtcbiAgICAgICAgY29uc3QgZSA9IGVycm9yLmVycm9yO1xuICAgICAgICBpZiAoZSAmJiBlLm1lc3NhZ2UubWF0Y2goXCJyZXZlcnRlZFwiKSAmJiBpc0hleFN0cmluZyhlLmRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZS5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IgJiYgZXJyb3IuZXJyb3IgJiYgdHlwZW9mIChlcnJvci5lcnJvci5tZXNzYWdlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IuZXJyb3IubWVzc2FnZTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChlcnJvci5ib2R5KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBtZXNzYWdlID0gZXJyb3IuYm9keTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChlcnJvci5yZXNwb25zZVRleHQpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlcnJvci5yZXNwb25zZVRleHQ7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSAobWVzc2FnZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcGFyYW1zLnRyYW5zYWN0aW9uIHx8IHBhcmFtcy5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICAvLyBcImluc3VmZmljaWVudCBmdW5kcyBmb3IgZ2FzICogcHJpY2UgKyB2YWx1ZSArIGNvc3QoZGF0YSlcIlxuICAgIGlmIChtZXNzYWdlLm1hdGNoKC9pbnN1ZmZpY2llbnQgZnVuZHMvKSkge1xuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImluc3VmZmljaWVudCBmdW5kcyBmb3IgaW50cmluc2ljIHRyYW5zYWN0aW9uIGNvc3RcIiwgTG9nZ2VyLmVycm9ycy5JTlNVRkZJQ0lFTlRfRlVORFMsIHtcbiAgICAgICAgICAgIGVycm9yLCBtZXRob2QsIHRyYW5zYWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBcIm5vbmNlIHRvbyBsb3dcIlxuICAgIGlmIChtZXNzYWdlLm1hdGNoKC9ub25jZSB0b28gbG93LykpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJub25jZSBoYXMgYWxyZWFkeSBiZWVuIHVzZWRcIiwgTG9nZ2VyLmVycm9ycy5OT05DRV9FWFBJUkVELCB7XG4gICAgICAgICAgICBlcnJvciwgbWV0aG9kLCB0cmFuc2FjdGlvblxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8gXCJyZXBsYWNlbWVudCB0cmFuc2FjdGlvbiB1bmRlcnByaWNlZFwiXG4gICAgaWYgKG1lc3NhZ2UubWF0Y2goL3JlcGxhY2VtZW50IHRyYW5zYWN0aW9uIHVuZGVycHJpY2VkLykpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJyZXBsYWNlbWVudCBmZWUgdG9vIGxvd1wiLCBMb2dnZXIuZXJyb3JzLlJFUExBQ0VNRU5UX1VOREVSUFJJQ0VELCB7XG4gICAgICAgICAgICBlcnJvciwgbWV0aG9kLCB0cmFuc2FjdGlvblxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGVycm9yR2FzLmluZGV4T2YobWV0aG9kKSA+PSAwICYmIG1lc3NhZ2UubWF0Y2goL2dhcyByZXF1aXJlZCBleGNlZWRzIGFsbG93YW5jZXxhbHdheXMgZmFpbGluZyB0cmFuc2FjdGlvbnxleGVjdXRpb24gcmV2ZXJ0ZWQvKSkge1xuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCBlc3RpbWF0ZSBnYXM7IHRyYW5zYWN0aW9uIG1heSBmYWlsIG9yIG1heSByZXF1aXJlIG1hbnVhbCBnYXMgbGltaXRcIiwgTG9nZ2VyLmVycm9ycy5VTlBSRURJQ1RBQkxFX0dBU19MSU1JVCwge1xuICAgICAgICAgICAgZXJyb3IsIG1ldGhvZCwgdHJhbnNhY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xufVxuZnVuY3Rpb24gdGltZXIodGltZW91dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXQpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gZ2V0UmVzdWx0KHBheWxvYWQpIHtcbiAgICBpZiAocGF5bG9hZC5lcnJvcikge1xuICAgICAgICAvLyBAVE9ETzogbm90IGFueVxuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihwYXlsb2FkLmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICBlcnJvci5jb2RlID0gcGF5bG9hZC5lcnJvci5jb2RlO1xuICAgICAgICBlcnJvci5kYXRhID0gcGF5bG9hZC5lcnJvci5kYXRhO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQucmVzdWx0O1xufVxuZnVuY3Rpb24gZ2V0TG93ZXJDYXNlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5jb25zdCBfY29uc3RydWN0b3JHdWFyZCA9IHt9O1xuZXhwb3J0IGNsYXNzIEpzb25ScGNTaWduZXIgZXh0ZW5kcyBTaWduZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbnN0cnVjdG9yR3VhcmQsIHByb3ZpZGVyLCBhZGRyZXNzT3JJbmRleCkge1xuICAgICAgICBsb2dnZXIuY2hlY2tOZXcobmV3LnRhcmdldCwgSnNvblJwY1NpZ25lcik7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGlmIChjb25zdHJ1Y3Rvckd1YXJkICE9PSBfY29uc3RydWN0b3JHdWFyZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZG8gbm90IGNhbGwgdGhlIEpzb25ScGNTaWduZXIgY29uc3RydWN0b3IgZGlyZWN0bHk7IHVzZSBwcm92aWRlci5nZXRTaWduZXJcIik7XG4gICAgICAgIH1cbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJwcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgICAgIGlmIChhZGRyZXNzT3JJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICBhZGRyZXNzT3JJbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoYWRkcmVzc09ySW5kZXgpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9hZGRyZXNzXCIsIHRoaXMucHJvdmlkZXIuZm9ybWF0dGVyLmFkZHJlc3MoYWRkcmVzc09ySW5kZXgpKTtcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2luZGV4XCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiAoYWRkcmVzc09ySW5kZXgpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9pbmRleFwiLCBhZGRyZXNzT3JJbmRleCk7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9hZGRyZXNzXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYWRkcmVzcyBvciBpbmRleFwiLCBcImFkZHJlc3NPckluZGV4XCIsIGFkZHJlc3NPckluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25uZWN0KHByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCBhbHRlciBKU09OLVJQQyBTaWduZXIgY29ubmVjdGlvblwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcImNvbm5lY3RcIlxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29ubmVjdFVuY2hlY2tlZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmNoZWNrZWRKc29uUnBjU2lnbmVyKF9jb25zdHJ1Y3Rvckd1YXJkLCB0aGlzLnByb3ZpZGVyLCB0aGlzLl9hZGRyZXNzIHx8IHRoaXMuX2luZGV4KTtcbiAgICB9XG4gICAgZ2V0QWRkcmVzcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2FkZHJlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWRkcmVzcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuc2VuZChcImV0aF9hY2NvdW50c1wiLCBbXSkudGhlbigoYWNjb3VudHMpID0+IHtcbiAgICAgICAgICAgIGlmIChhY2NvdW50cy5sZW5ndGggPD0gdGhpcy5faW5kZXgpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVua25vd24gYWNjb3VudCAjXCIgKyB0aGlzLl9pbmRleCwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcImdldEFkZHJlc3NcIlxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuZm9ybWF0dGVyLmFkZHJlc3MoYWNjb3VudHNbdGhpcy5faW5kZXhdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNlbmRVbmNoZWNrZWRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICB0cmFuc2FjdGlvbiA9IHNoYWxsb3dDb3B5KHRyYW5zYWN0aW9uKTtcbiAgICAgICAgY29uc3QgZnJvbUFkZHJlc3MgPSB0aGlzLmdldEFkZHJlc3MoKS50aGVuKChhZGRyZXNzKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWRkcmVzcykge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWRkcmVzcztcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRoZSBKU09OLVJQQyBmb3IgZXRoX3NlbmRUcmFuc2FjdGlvbiB1c2VzIDkwMDAwIGdhczsgaWYgdGhlIHVzZXJcbiAgICAgICAgLy8gd2lzaGVzIHRvIHVzZSB0aGlzLCBpdCBpcyBlYXN5IHRvIHNwZWNpZnkgZXhwbGljaXRseSwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIHdlIGxvb2sgaXQgdXAgZm9yIHRoZW0uXG4gICAgICAgIGlmICh0cmFuc2FjdGlvbi5nYXNMaW1pdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZSA9IHNoYWxsb3dDb3B5KHRyYW5zYWN0aW9uKTtcbiAgICAgICAgICAgIGVzdGltYXRlLmZyb20gPSBmcm9tQWRkcmVzcztcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmdhc0xpbWl0ID0gdGhpcy5wcm92aWRlci5lc3RpbWF0ZUdhcyhlc3RpbWF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9wZXJ0aWVzKHtcbiAgICAgICAgICAgIHR4OiByZXNvbHZlUHJvcGVydGllcyh0cmFuc2FjdGlvbiksXG4gICAgICAgICAgICBzZW5kZXI6IGZyb21BZGRyZXNzXG4gICAgICAgIH0pLnRoZW4oKHsgdHgsIHNlbmRlciB9KSA9PiB7XG4gICAgICAgICAgICBpZiAodHguZnJvbSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR4LmZyb20udG9Mb3dlckNhc2UoKSAhPT0gc2VuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJmcm9tIGFkZHJlc3MgbWlzbWF0Y2hcIiwgXCJ0cmFuc2FjdGlvblwiLCB0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHguZnJvbSA9IHNlbmRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhleFR4ID0gdGhpcy5wcm92aWRlci5jb25zdHJ1Y3Rvci5oZXhsaWZ5VHJhbnNhY3Rpb24odHgsIHsgZnJvbTogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLnNlbmQoXCJldGhfc2VuZFRyYW5zYWN0aW9uXCIsIFtoZXhUeF0pLnRoZW4oKGhhc2gpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFzaDtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja0Vycm9yKFwic2VuZFRyYW5zYWN0aW9uXCIsIGVycm9yLCBoZXhUeCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNpZ25UcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoXCJzaWduaW5nIHRyYW5zYWN0aW9ucyBpcyB1bnN1cHBvcnRlZFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcInNpZ25UcmFuc2FjdGlvblwiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZW5kVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZFVuY2hlY2tlZFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKS50aGVuKChoYXNoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcG9sbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb24oaGFzaCkudGhlbigodHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLl93cmFwVHJhbnNhY3Rpb24odHgsIGhhc2gpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgeyBvbmNlQmxvY2s6IHRoaXMucHJvdmlkZXIgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3IudHJhbnNhY3Rpb25IYXNoID0gaGFzaDtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2lnbk1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9ICgodHlwZW9mIChtZXNzYWdlKSA9PT0gXCJzdHJpbmdcIikgPyB0b1V0ZjhCeXRlcyhtZXNzYWdlKSA6IG1lc3NhZ2UpO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHlpZWxkIHRoaXMuZ2V0QWRkcmVzcygpO1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2V0aGVyZXVtL3dpa2kvd2lraS9KU09OLVJQQyNldGhfc2lnblxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMucHJvdmlkZXIuc2VuZChcImV0aF9zaWduXCIsIFthZGRyZXNzLnRvTG93ZXJDYXNlKCksIGhleGxpZnkoZGF0YSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIF9zaWduVHlwZWREYXRhKGRvbWFpbiwgdHlwZXMsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAvLyBQb3B1bGF0ZSBhbnkgRU5TIG5hbWVzIChpbi1wbGFjZSlcbiAgICAgICAgICAgIGNvbnN0IHBvcHVsYXRlZCA9IHlpZWxkIF9UeXBlZERhdGFFbmNvZGVyLnJlc29sdmVOYW1lcyhkb21haW4sIHR5cGVzLCB2YWx1ZSwgKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5yZXNvbHZlTmFtZShuYW1lKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHlpZWxkIHRoaXMuZ2V0QWRkcmVzcygpO1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkIHRoaXMucHJvdmlkZXIuc2VuZChcImV0aF9zaWduVHlwZWREYXRhX3Y0XCIsIFtcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoX1R5cGVkRGF0YUVuY29kZXIuZ2V0UGF5bG9hZChwb3B1bGF0ZWQuZG9tYWluLCB0eXBlcywgcG9wdWxhdGVkLnZhbHVlKSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgdW5sb2NrKHBhc3N3b3JkKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICBjb25zdCBwcm92aWRlciA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0geWllbGQgdGhpcy5nZXRBZGRyZXNzKCk7XG4gICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuc2VuZChcInBlcnNvbmFsX3VubG9ja0FjY291bnRcIiwgW2FkZHJlc3MudG9Mb3dlckNhc2UoKSwgcGFzc3dvcmQsIG51bGxdKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY2xhc3MgVW5jaGVja2VkSnNvblJwY1NpZ25lciBleHRlbmRzIEpzb25ScGNTaWduZXIge1xuICAgIHNlbmRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kVW5jaGVja2VkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pLnRoZW4oKGhhc2gpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaGFzaDogaGFzaCxcbiAgICAgICAgICAgICAgICBub25jZTogbnVsbCxcbiAgICAgICAgICAgICAgICBnYXNMaW1pdDogbnVsbCxcbiAgICAgICAgICAgICAgICBnYXNQcmljZTogbnVsbCxcbiAgICAgICAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGNoYWluSWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgY29uZmlybWF0aW9uczogMCxcbiAgICAgICAgICAgICAgICBmcm9tOiBudWxsLFxuICAgICAgICAgICAgICAgIHdhaXQ6IChjb25maXJtYXRpb25zKSA9PiB7IHJldHVybiB0aGlzLnByb3ZpZGVyLndhaXRGb3JUcmFuc2FjdGlvbihoYXNoLCBjb25maXJtYXRpb25zKTsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuY29uc3QgYWxsb3dlZFRyYW5zYWN0aW9uS2V5cyA9IHtcbiAgICBjaGFpbklkOiB0cnVlLCBkYXRhOiB0cnVlLCBnYXNMaW1pdDogdHJ1ZSwgZ2FzUHJpY2U6IHRydWUsIG5vbmNlOiB0cnVlLCB0bzogdHJ1ZSwgdmFsdWU6IHRydWVcbn07XG5leHBvcnQgY2xhc3MgSnNvblJwY1Byb3ZpZGVyIGV4dGVuZHMgQmFzZVByb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih1cmwsIG5ldHdvcmspIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTmV3KG5ldy50YXJnZXQsIEpzb25ScGNQcm92aWRlcik7XG4gICAgICAgIGxldCBuZXR3b3JrT3JSZWFkeSA9IG5ldHdvcms7XG4gICAgICAgIC8vIFRoZSBuZXR3b3JrIGlzIHVua25vd24sIHF1ZXJ5IHRoZSBKU09OLVJQQyBmb3IgaXRcbiAgICAgICAgaWYgKG5ldHdvcmtPclJlYWR5ID09IG51bGwpIHtcbiAgICAgICAgICAgIG5ldHdvcmtPclJlYWR5ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGVjdE5ldHdvcmsoKS50aGVuKChuZXR3b3JrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldHdvcmspO1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIobmV0d29ya09yUmVhZHkpO1xuICAgICAgICAvLyBEZWZhdWx0IFVSTFxuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgdXJsID0gZ2V0U3RhdGljKHRoaXMuY29uc3RydWN0b3IsIFwiZGVmYXVsdFVybFwiKSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiY29ubmVjdGlvblwiLCBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJjb25uZWN0aW9uXCIsIE9iamVjdC5mcmVlemUoc2hhbGxvd0NvcHkodXJsKSkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX25leHRJZCA9IDQyO1xuICAgIH1cbiAgICBzdGF0aWMgZGVmYXVsdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIFwiaHR0cDovXFwvbG9jYWxob3N0Ojg1NDVcIjtcbiAgICB9XG4gICAgZGV0ZWN0TmV0d29yaygpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHlpZWxkIHRpbWVyKDApO1xuICAgICAgICAgICAgbGV0IGNoYWluSWQgPSBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjaGFpbklkID0geWllbGQgdGhpcy5zZW5kKFwiZXRoX2NoYWluSWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY2hhaW5JZCA9IHlpZWxkIHRoaXMuc2VuZChcIm5ldF92ZXJzaW9uXCIsIFtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFpbklkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBnZXROZXR3b3JrID0gZ2V0U3RhdGljKHRoaXMuY29uc3RydWN0b3IsIFwiZ2V0TmV0d29ya1wiKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TmV0d29yayhCaWdOdW1iZXIuZnJvbShjaGFpbklkKS50b051bWJlcigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcImNvdWxkIG5vdCBkZXRlY3QgbmV0d29ya1wiLCBMb2dnZXIuZXJyb3JzLk5FVFdPUktfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluSWQ6IGNoYWluSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJpbnZhbGlkTmV0d29ya1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcImNvdWxkIG5vdCBkZXRlY3QgbmV0d29ya1wiLCBMb2dnZXIuZXJyb3JzLk5FVFdPUktfRVJST1IsIHtcbiAgICAgICAgICAgICAgICBldmVudDogXCJub05ldHdvcmtcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXRTaWduZXIoYWRkcmVzc09ySW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBKc29uUnBjU2lnbmVyKF9jb25zdHJ1Y3Rvckd1YXJkLCB0aGlzLCBhZGRyZXNzT3JJbmRleCk7XG4gICAgfVxuICAgIGdldFVuY2hlY2tlZFNpZ25lcihhZGRyZXNzT3JJbmRleCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRTaWduZXIoYWRkcmVzc09ySW5kZXgpLmNvbm5lY3RVbmNoZWNrZWQoKTtcbiAgICB9XG4gICAgbGlzdEFjY291bnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiZXRoX2FjY291bnRzXCIsIFtdKS50aGVuKChhY2NvdW50cykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjY291bnRzLm1hcCgoYSkgPT4gdGhpcy5mb3JtYXR0ZXIuYWRkcmVzcyhhKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgaWQ6ICh0aGlzLl9uZXh0SWQrKyksXG4gICAgICAgICAgICBqc29ucnBjOiBcIjIuMFwiXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZW1pdChcImRlYnVnXCIsIHtcbiAgICAgICAgICAgIGFjdGlvbjogXCJyZXF1ZXN0XCIsXG4gICAgICAgICAgICByZXF1ZXN0OiBkZWVwQ29weShyZXF1ZXN0KSxcbiAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmV0Y2hKc29uKHRoaXMuY29ubmVjdGlvbiwgSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksIGdldFJlc3VsdCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdCxcbiAgICAgICAgICAgICAgICByZXNwb25zZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiByZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJlcGFyZVJlcXVlc3QobWV0aG9kLCBwYXJhbXMpIHtcbiAgICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgICAgIGNhc2UgXCJnZXRCbG9ja051bWJlclwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXCJldGhfYmxvY2tOdW1iZXJcIiwgW11dO1xuICAgICAgICAgICAgY2FzZSBcImdldEdhc1ByaWNlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcImV0aF9nYXNQcmljZVwiLCBbXV07XG4gICAgICAgICAgICBjYXNlIFwiZ2V0QmFsYW5jZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXCJldGhfZ2V0QmFsYW5jZVwiLCBbZ2V0TG93ZXJDYXNlKHBhcmFtcy5hZGRyZXNzKSwgcGFyYW1zLmJsb2NrVGFnXV07XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25Db3VudFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXCJldGhfZ2V0VHJhbnNhY3Rpb25Db3VudFwiLCBbZ2V0TG93ZXJDYXNlKHBhcmFtcy5hZGRyZXNzKSwgcGFyYW1zLmJsb2NrVGFnXV07XG4gICAgICAgICAgICBjYXNlIFwiZ2V0Q29kZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXCJldGhfZ2V0Q29kZVwiLCBbZ2V0TG93ZXJDYXNlKHBhcmFtcy5hZGRyZXNzKSwgcGFyYW1zLmJsb2NrVGFnXV07XG4gICAgICAgICAgICBjYXNlIFwiZ2V0U3RvcmFnZUF0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcImV0aF9nZXRTdG9yYWdlQXRcIiwgW2dldExvd2VyQ2FzZShwYXJhbXMuYWRkcmVzcyksIHBhcmFtcy5wb3NpdGlvbiwgcGFyYW1zLmJsb2NrVGFnXV07XG4gICAgICAgICAgICBjYXNlIFwic2VuZFRyYW5zYWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcImV0aF9zZW5kUmF3VHJhbnNhY3Rpb25cIiwgW3BhcmFtcy5zaWduZWRUcmFuc2FjdGlvbl1dO1xuICAgICAgICAgICAgY2FzZSBcImdldEJsb2NrXCI6XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5ibG9ja1RhZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1wiZXRoX2dldEJsb2NrQnlOdW1iZXJcIiwgW3BhcmFtcy5ibG9ja1RhZywgISFwYXJhbXMuaW5jbHVkZVRyYW5zYWN0aW9uc11dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbXMuYmxvY2tIYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXCJldGhfZ2V0QmxvY2tCeUhhc2hcIiwgW3BhcmFtcy5ibG9ja0hhc2gsICEhcGFyYW1zLmluY2x1ZGVUcmFuc2FjdGlvbnNdXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gW1wiZXRoX2dldFRyYW5zYWN0aW9uQnlIYXNoXCIsIFtwYXJhbXMudHJhbnNhY3Rpb25IYXNoXV07XG4gICAgICAgICAgICBjYXNlIFwiZ2V0VHJhbnNhY3Rpb25SZWNlaXB0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcImV0aF9nZXRUcmFuc2FjdGlvblJlY2VpcHRcIiwgW3BhcmFtcy50cmFuc2FjdGlvbkhhc2hdXTtcbiAgICAgICAgICAgIGNhc2UgXCJjYWxsXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZXhsaWZ5VHJhbnNhY3Rpb24gPSBnZXRTdGF0aWModGhpcy5jb25zdHJ1Y3RvciwgXCJoZXhsaWZ5VHJhbnNhY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcImV0aF9jYWxsXCIsIFtoZXhsaWZ5VHJhbnNhY3Rpb24ocGFyYW1zLnRyYW5zYWN0aW9uLCB7IGZyb206IHRydWUgfSksIHBhcmFtcy5ibG9ja1RhZ11dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcImVzdGltYXRlR2FzXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZXhsaWZ5VHJhbnNhY3Rpb24gPSBnZXRTdGF0aWModGhpcy5jb25zdHJ1Y3RvciwgXCJoZXhsaWZ5VHJhbnNhY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcImV0aF9lc3RpbWF0ZUdhc1wiLCBbaGV4bGlmeVRyYW5zYWN0aW9uKHBhcmFtcy50cmFuc2FjdGlvbiwgeyBmcm9tOiB0cnVlIH0pXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZ2V0TG9nc1wiOlxuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuZmlsdGVyICYmIHBhcmFtcy5maWx0ZXIuYWRkcmVzcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcy5maWx0ZXIuYWRkcmVzcyA9IGdldExvd2VyQ2FzZShwYXJhbXMuZmlsdGVyLmFkZHJlc3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW1wiZXRoX2dldExvZ3NcIiwgW3BhcmFtcy5maWx0ZXJdXTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHBlcmZvcm0obWV0aG9kLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLnByZXBhcmVSZXF1ZXN0KG1ldGhvZCwgcGFyYW1zKTtcbiAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihtZXRob2QgKyBcIiBub3QgaW1wbGVtZW50ZWRcIiwgTG9nZ2VyLmVycm9ycy5OT1RfSU1QTEVNRU5URUQsIHsgb3BlcmF0aW9uOiBtZXRob2QgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5aWVsZCB0aGlzLnNlbmQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tFcnJvcihtZXRob2QsIGVycm9yLCBwYXJhbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3N0YXJ0RXZlbnQoZXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LnRhZyA9PT0gXCJwZW5kaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0UGVuZGluZygpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyLl9zdGFydEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgX3N0YXJ0UGVuZGluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdGaWx0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgICAgICBjb25zdCBwZW5kaW5nRmlsdGVyID0gdGhpcy5zZW5kKFwiZXRoX25ld1BlbmRpbmdUcmFuc2FjdGlvbkZpbHRlclwiLCBbXSk7XG4gICAgICAgIHRoaXMuX3BlbmRpbmdGaWx0ZXIgPSBwZW5kaW5nRmlsdGVyO1xuICAgICAgICBwZW5kaW5nRmlsdGVyLnRoZW4oZnVuY3Rpb24gKGZpbHRlcklkKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBwb2xsKCkge1xuICAgICAgICAgICAgICAgIHNlbGYuc2VuZChcImV0aF9nZXRGaWx0ZXJDaGFuZ2VzXCIsIFtmaWx0ZXJJZF0pLnRoZW4oZnVuY3Rpb24gKGhhc2hlcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fcGVuZGluZ0ZpbHRlciAhPSBwZW5kaW5nRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VxID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAVE9ETzogVGhpcyBzaG91bGQgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgYXQgc29tZSBwb2ludC4uLiBIb3c/IFdoZW4/XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbWl0dGVkW1widDpcIiArIGhhc2gudG9Mb3dlckNhc2UoKV0gPSBcInBlbmRpbmdcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcSA9IHNlcS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRUcmFuc2FjdGlvbihoYXNoKS50aGVuKGZ1bmN0aW9uICh0eCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoXCJwZW5kaW5nXCIsIHR4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXEudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIoMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5fcGVuZGluZ0ZpbHRlciAhPSBwZW5kaW5nRmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmQoXCJldGhfdW5pbnN0YWxsRmlsdGVyXCIsIFtmaWx0ZXJJZF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBwb2xsKCk7IH0sIDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHsgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb2xsKCk7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVySWQ7XG4gICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4geyB9KTtcbiAgICB9XG4gICAgX3N0b3BFdmVudChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQudGFnID09PSBcInBlbmRpbmdcIiAmJiB0aGlzLmxpc3RlbmVyQ291bnQoXCJwZW5kaW5nXCIpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nRmlsdGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5fc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBhbiBldGhlcnMuanMgdHJhbnNhY3Rpb24gaW50byBhIEpTT04tUlBDIHRyYW5zYWN0aW9uXG4gICAgLy8gIC0gZ2FzTGltaXQgPT4gZ2FzXG4gICAgLy8gIC0gQWxsIHZhbHVlcyBoZXhsaWZpZWRcbiAgICAvLyAgLSBBbGwgbnVtZXJpYyB2YWx1ZXMgemVyby1zdHJpcGVkXG4gICAgLy8gIC0gQWxsIGFkZHJlc3NlcyBhcmUgbG93ZXJjYXNlZFxuICAgIC8vIE5PVEU6IFRoaXMgYWxsb3dzIGEgVHJhbnNhY3Rpb25SZXF1ZXN0LCBidXQgYWxsIHZhbHVlcyBzaG91bGQgYmUgcmVzb2x2ZWRcbiAgICAvLyAgICAgICBiZWZvcmUgdGhpcyBpcyBjYWxsZWRcbiAgICAvLyBAVE9ETzogVGhpcyB3aWxsIGxpa2VseSBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgcHJlcGFyZVJlcXVlc3RcbiAgICAvLyAgICAgICAgd2lsbCBiZSB0aGUgcHJlZmVycmVkIG1ldGhvZCBmb3IgdGhpcy5cbiAgICBzdGF0aWMgaGV4bGlmeVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBhbGxvd0V4dHJhKSB7XG4gICAgICAgIC8vIENoZWNrIG9ubHkgYWxsb3dlZCBwcm9wZXJ0aWVzIGFyZSBnaXZlblxuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2hhbGxvd0NvcHkoYWxsb3dlZFRyYW5zYWN0aW9uS2V5cyk7XG4gICAgICAgIGlmIChhbGxvd0V4dHJhKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhbGxvd0V4dHJhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFsbG93RXh0cmFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICBhbGxvd2VkW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGVja1Byb3BlcnRpZXModHJhbnNhY3Rpb24sIGFsbG93ZWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICAgICAgLy8gU29tZSBub2RlcyAoSU5GVVJBIHJvcHN0ZW47IElORlVSQSBtYWlubmV0IGlzIGZpbmUpIGRvIG5vdCBsaWtlIGxlYWRpbmcgemVyb3MuXG4gICAgICAgIFtcImdhc0xpbWl0XCIsIFwiZ2FzUHJpY2VcIiwgXCJub25jZVwiLCBcInZhbHVlXCJdLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGV4VmFsdWUodHJhbnNhY3Rpb25ba2V5XSk7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImdhc0xpbWl0XCIpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBcImdhc1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIFtcImZyb21cIiwgXCJ0b1wiLCBcImRhdGFcIl0uZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25ba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBoZXhsaWZ5KHRyYW5zYWN0aW9uW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1qc29uLXJwYy1wcm92aWRlci5qcy5tYXAiLCIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBVcmxKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi91cmwtanNvbi1ycGMtcHJvdmlkZXJcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbi8vIFNwZWNpYWwgQVBJIGtleSBwcm92aWRlZCBieSBOb2Rlc21pdGggZm9yIGV0aGVycy5qc1xuY29uc3QgZGVmYXVsdEFwaUtleSA9IFwiRVRIRVJTX0pTX1NIQVJFRFwiO1xuZXhwb3J0IGNsYXNzIE5vZGVzbWl0aFByb3ZpZGVyIGV4dGVuZHMgVXJsSnNvblJwY1Byb3ZpZGVyIHtcbiAgICBzdGF0aWMgZ2V0QXBpS2V5KGFwaUtleSkge1xuICAgICAgICBpZiAoYXBpS2V5ICYmIHR5cGVvZiAoYXBpS2V5KSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgYXBpS2V5XCIsIFwiYXBpS2V5XCIsIGFwaUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwaUtleSB8fCBkZWZhdWx0QXBpS2V5O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0VXJsKG5ldHdvcmssIGFwaUtleSkge1xuICAgICAgICBsb2dnZXIud2FybihcIk5vZGVTbWl0aCB3aWxsIGJlIGRpc2NvbnRpbnVlZCBvbiAyMDE5LTEyLTIwOyBwbGVhc2UgbWlncmF0ZSB0byBhbm90aGVyIHBsYXRmb3JtLlwiKTtcbiAgICAgICAgbGV0IGhvc3QgPSBudWxsO1xuICAgICAgICBzd2l0Y2ggKG5ldHdvcmsubmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcImhvbWVzdGVhZFwiOlxuICAgICAgICAgICAgICAgIGhvc3QgPSBcImh0dHBzOi8vZXRoZXJldW0uYXBpLm5vZGVzbWl0aC5pby92MS9tYWlubmV0L2pzb25ycGNcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJyb3BzdGVuXCI6XG4gICAgICAgICAgICAgICAgaG9zdCA9IFwiaHR0cHM6Ly9ldGhlcmV1bS5hcGkubm9kZXNtaXRoLmlvL3YxL3JvcHN0ZW4vanNvbnJwY1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJpbmtlYnlcIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJodHRwczovL2V0aGVyZXVtLmFwaS5ub2Rlc21pdGguaW8vdjEvcmlua2VieS9qc29ucnBjXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZ29lcmxpXCI6XG4gICAgICAgICAgICAgICAgaG9zdCA9IFwiaHR0cHM6Ly9ldGhlcmV1bS5hcGkubm9kZXNtaXRoLmlvL3YxL2dvZXJsaS9qc29ucnBjXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwia292YW5cIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJodHRwczovL2V0aGVyZXVtLmFwaS5ub2Rlc21pdGguaW8vdjEva292YW4vanNvbnJwY1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiLCBcIm5ldHdvcmtcIiwgYXJndW1lbnRzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGhvc3QgKyBcIj9hcGlLZXk9XCIgKyBhcGlLZXkpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW5vZGVzbWl0aC1wcm92aWRlci5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGdldFN0YXRpYyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBVcmxKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi91cmwtanNvbi1ycGMtcHJvdmlkZXJcIjtcbi8vIFRoZXNlIGFyZSBsb2FkLWJhbGFuY2VyLWJhc2VkIGFwcGxpY2F0b2luIElEc1xuY29uc3QgZGVmYXVsdEFwcGxpY2F0aW9uSWRzID0ge1xuICAgIGhvbWVzdGVhZDogXCI2MDA0YmNkMTAwNDAyNjE2MzNhZGU5OTBcIixcbiAgICByb3BzdGVuOiBcIjYwMDRiZDRkMDA0MDI2MTYzM2FkZTk5MVwiLFxuICAgIHJpbmtlYnk6IFwiNjAwNGJkYTIwMDQwMjYxNjMzYWRlOTk0XCIsXG4gICAgZ29lcmxpOiBcIjYwMDRiZDg2MDA0MDI2MTYzM2FkZTk5MlwiLFxufTtcbmV4cG9ydCBjbGFzcyBQb2NrZXRQcm92aWRlciBleHRlbmRzIFVybEpzb25ScGNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIC8vIFdlIG5lZWQgYSBiaXQgb2YgY3JlYXRpdml0eSBpbiB0aGUgY29uc3RydWN0b3IgYmVjYXVzZVxuICAgICAgICAvLyBQb2NrZXQgdXNlcyBkaWZmZXJlbnQgZGVmYXVsdCBBUEkga2V5cyBiYXNlZCBvbiB0aGUgbmV0d29ya1xuICAgICAgICBpZiAoYXBpS2V5ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG4gPSBnZXRTdGF0aWMoKG5ldy50YXJnZXQpLCBcImdldE5ldHdvcmtcIikobmV0d29yayk7XG4gICAgICAgICAgICBpZiAobikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFwcGxpY2F0aW9uSWQgPSBkZWZhdWx0QXBwbGljYXRpb25JZHNbbi5uYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25JZCkge1xuICAgICAgICAgICAgICAgICAgICBhcGlLZXkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklkOiBhcHBsaWNhdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEJhbGFuY2VyOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGFueSBpc3N1ZSBhYm92ZSwgd2UgZG9uJ3Qga25vdyB0aGlzIG5ldHdvcmtcbiAgICAgICAgICAgIGlmIChhcGlLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwidW5zdXBwb3J0ZWQgbmV0d29ya1wiLCBMb2dnZXIuZXJyb3JzLklOVkFMSURfQVJHVU1FTlQsIHtcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQ6IFwibmV0d29ya1wiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV0d29ya1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyKG5ldHdvcmssIGFwaUtleSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRBcGlLZXkoYXBpS2V5KSB7XG4gICAgICAgIC8vIE1vc3QgQVBJIFByb3ZpZGVycyBhbGxvdyBudWxsIHRvIGdldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBidXRcbiAgICAgICAgLy8gUG9ja2V0IHJlcXVpcmVzIHRoZSBuZXR3b3JrIHRvIGRlY2lkZSB0aGUgZGVmYXVsdCBwcm92aWRlciwgc28gd2VcbiAgICAgICAgLy8gcmVseSBvbiBoaWphY2tpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIGFkZCBhIHNlbnNpYmxlIGRlZmF1bHQgZm9yIHVzXG4gICAgICAgIGlmIChhcGlLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcIlBvY2tldFByb3ZpZGVyLmdldEFwaUtleSBkb2VzIG5vdCBzdXBwb3J0IG51bGwgYXBpS2V5XCIsIFwiYXBpS2V5XCIsIGFwaUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpS2V5T2JqID0ge1xuICAgICAgICAgICAgYXBwbGljYXRpb25JZDogbnVsbCxcbiAgICAgICAgICAgIGxvYWRCYWxhbmNlcjogZmFsc2UsXG4gICAgICAgICAgICBhcHBsaWNhdGlvblNlY3JldEtleTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICAvLyBQYXJzZSBhcHBsaWNhdGlvbklkIGFuZCBhcHBsaWNhdGlvblNlY3JldEtleVxuICAgICAgICBpZiAodHlwZW9mIChhcGlLZXkpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBhcGlLZXlPYmouYXBwbGljYXRpb25JZCA9IGFwaUtleTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcGlLZXkuYXBwbGljYXRpb25TZWNyZXRLZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgbG9nZ2VyLmFzc2VydEFyZ3VtZW50KCh0eXBlb2YgKGFwaUtleS5hcHBsaWNhdGlvbklkKSA9PT0gXCJzdHJpbmdcIiksIFwiYXBwbGljYXRpb25TZWNyZXRLZXkgcmVxdWlyZXMgYW4gYXBwbGljYXRpb25JZFwiLCBcImFwcGxpY2F0aW9uSWRcIiwgYXBpS2V5LmFwcGxpY2F0aW9uSWQpO1xuICAgICAgICAgICAgbG9nZ2VyLmFzc2VydEFyZ3VtZW50KCh0eXBlb2YgKGFwaUtleS5hcHBsaWNhdGlvblNlY3JldEtleSkgPT09IFwic3RyaW5nXCIpLCBcImludmFsaWQgYXBwbGljYXRpb25TZWNyZXRLZXlcIiwgXCJhcHBsaWNhdGlvblNlY3JldEtleVwiLCBcIltSRURBQ1RFRF1cIik7XG4gICAgICAgICAgICBhcGlLZXlPYmouYXBwbGljYXRpb25JZCA9IGFwaUtleS5hcHBsaWNhdGlvbklkO1xuICAgICAgICAgICAgYXBpS2V5T2JqLmFwcGxpY2F0aW9uU2VjcmV0S2V5ID0gYXBpS2V5LmFwcGxpY2F0aW9uU2VjcmV0S2V5O1xuICAgICAgICAgICAgYXBpS2V5T2JqLmxvYWRCYWxhbmNlciA9ICEhYXBpS2V5LmxvYWRCYWxhbmNlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcGlLZXkuYXBwbGljYXRpb25JZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmFzc2VydEFyZ3VtZW50KCh0eXBlb2YgKGFwaUtleS5hcHBsaWNhdGlvbklkKSA9PT0gXCJzdHJpbmdcIiksIFwiYXBpS2V5LmFwcGxpY2F0aW9uSWQgbXVzdCBiZSBhIHN0cmluZ1wiLCBcImFwaUtleS5hcHBsaWNhdGlvbklkXCIsIGFwaUtleS5hcHBsaWNhdGlvbklkKTtcbiAgICAgICAgICAgIGFwaUtleU9iai5hcHBsaWNhdGlvbklkID0gYXBpS2V5LmFwcGxpY2F0aW9uSWQ7XG4gICAgICAgICAgICBhcGlLZXlPYmoubG9hZEJhbGFuY2VyID0gISFhcGlLZXkubG9hZEJhbGFuY2VyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInVuc3VwcG9ydGVkIFBvY2tldFByb3ZpZGVyIGFwaUtleVwiLCBcImFwaUtleVwiLCBhcGlLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcGlLZXlPYmo7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRVcmwobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIGxldCBob3N0ID0gbnVsbDtcbiAgICAgICAgc3dpdGNoIChuZXR3b3JrID8gbmV0d29yay5uYW1lIDogXCJ1bmtub3duXCIpIHtcbiAgICAgICAgICAgIGNhc2UgXCJob21lc3RlYWRcIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJldGgtbWFpbm5ldC5nYXRld2F5LnBva3QubmV0d29ya1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJvcHN0ZW5cIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJldGgtcm9wc3Rlbi5nYXRld2F5LnBva3QubmV0d29ya1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInJpbmtlYnlcIjpcbiAgICAgICAgICAgICAgICBob3N0ID0gXCJldGgtcmlua2VieS5nYXRld2F5LnBva3QubmV0d29ya1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcImdvZXJsaVwiOlxuICAgICAgICAgICAgICAgIGhvc3QgPSBcImV0aC1nb2VybGkuZ2F0ZXdheS5wb2t0Lm5ldHdvcmtcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJ1bnN1cHBvcnRlZCBuZXR3b3JrXCIsIExvZ2dlci5lcnJvcnMuSU5WQUxJRF9BUkdVTUVOVCwge1xuICAgICAgICAgICAgICAgICAgICBhcmd1bWVudDogXCJuZXR3b3JrXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXR3b3JrXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVybCA9IG51bGw7XG4gICAgICAgIGlmIChhcGlLZXkubG9hZEJhbGFuY2VyKSB7XG4gICAgICAgICAgICB1cmwgPSBgaHR0cHM6L1xcLyR7aG9zdH0vdjEvbGIvJHthcGlLZXkuYXBwbGljYXRpb25JZH1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXJsID0gYGh0dHBzOi9cXC8ke2hvc3R9L3YxLyR7YXBpS2V5LmFwcGxpY2F0aW9uSWR9YDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0geyB1cmwgfTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbXB0eSBoZWFkZXJzXG4gICAgICAgIGNvbm5lY3Rpb24uaGVhZGVycyA9IHt9O1xuICAgICAgICAvLyBBcHBseSBhcHBsaWNhdGlvbiBzZWNyZXQga2V5XG4gICAgICAgIGlmIChhcGlLZXkuYXBwbGljYXRpb25TZWNyZXRLZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29ubmVjdGlvbi51c2VyID0gXCJcIjtcbiAgICAgICAgICAgIGNvbm5lY3Rpb24ucGFzc3dvcmQgPSBhcGlLZXkuYXBwbGljYXRpb25TZWNyZXRLZXk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gICAgfVxuICAgIGlzQ29tbXVuaXR5UmVzb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5hcHBsaWNhdGlvbklkID09PSBkZWZhdWx0QXBwbGljYXRpb25JZHNbdGhpcy5uZXR3b3JrLm5hbWVdKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wb2NrZXQtcHJvdmlkZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IGRlZmluZVJlYWRPbmx5LCBnZXRTdGF0aWMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuaW1wb3J0IHsgSnNvblJwY1Byb3ZpZGVyIH0gZnJvbSBcIi4vanNvbi1ycGMtcHJvdmlkZXJcIjtcbi8vIEEgU3RhdGljSnNvblJwY1Byb3ZpZGVyIGlzIHVzZWZ1bCB3aGVuIHlvdSAqa25vdyogZm9yIGNlcnRhaW4gdGhhdFxuLy8gdGhlIGJhY2tlbmQgd2lsbCBuZXZlciBjaGFuZ2UsIGFzIGl0IG5ldmVyIGNhbGxzIGV0aF9jaGFpbklkIHRvXG4vLyB2ZXJpZnkgaXRzIGJhY2tlbmQuIEhvd2V2ZXIsIGlmIHRoZSBiYWNrZW5kIGRvZXMgY2hhbmdlLCB0aGUgZWZmZWN0c1xuLy8gYXJlIHVuZGVmaW5lZCBhbmQgbWF5IGluY2x1ZGU6XG4vLyAtIGluY29uc2lzdGVudCByZXN1bHRzXG4vLyAtIGxvY2tpbmcgdXAgdGhlIFVJXG4vLyAtIGJsb2NrIHNrZXcgd2FybmluZ3Ncbi8vIC0gd3JvbmcgcmVzdWx0c1xuLy8gSWYgdGhlIG5ldHdvcmsgaXMgbm90IGV4cGxpY2l0IChpLmUuIGF1dG8tZGV0ZWN0aW9uIGlzIGV4cGVjdGVkKSwgdGhlXG4vLyBub2RlIE1VU1QgYmUgcnVubmluZyBhbmQgYXZhaWxhYmxlIHRvIHJlc3BvbmQgdG8gcmVxdWVzdHMgQkVGT1JFIHRoaXNcbi8vIGlzIGluc3RhbnRpYXRlZC5cbmV4cG9ydCBjbGFzcyBTdGF0aWNKc29uUnBjUHJvdmlkZXIgZXh0ZW5kcyBKc29uUnBjUHJvdmlkZXIge1xuICAgIGRldGVjdE5ldHdvcmsoKSB7XG4gICAgICAgIGNvbnN0IF9zdXBlciA9IE9iamVjdC5jcmVhdGUobnVsbCwge1xuICAgICAgICAgICAgZGV0ZWN0TmV0d29yazogeyBnZXQ6ICgpID0+IHN1cGVyLmRldGVjdE5ldHdvcmsgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBuZXR3b3JrID0gdGhpcy5uZXR3b3JrO1xuICAgICAgICAgICAgaWYgKG5ldHdvcmsgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ldHdvcmsgPSB5aWVsZCBfc3VwZXIuZGV0ZWN0TmV0d29yay5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICghbmV0d29yaykge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcIm5vIG5ldHdvcmsgZGV0ZWN0ZWRcIiwgTG9nZ2VyLmVycm9ycy5VTktOT1dOX0VSUk9SLCB7fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHN0aWxsIG5vdCBzZXQsIHNldCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9uZXR3b3JrID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQSBzdGF0aWMgbmV0d29yayBkb2VzIG5vdCBzdXBwb3J0IFwiYW55XCJcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfbmV0d29ya1wiLCBuZXR3b3JrKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwibmV0d29ya1wiLCBuZXR3b3JrLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV0d29yaztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFVybEpzb25ScGNQcm92aWRlciBleHRlbmRzIFN0YXRpY0pzb25ScGNQcm92aWRlciB7XG4gICAgY29uc3RydWN0b3IobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIGxvZ2dlci5jaGVja0Fic3RyYWN0KG5ldy50YXJnZXQsIFVybEpzb25ScGNQcm92aWRlcik7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgTmV0d29yayBhbmQgQVBJIEtleVxuICAgICAgICBuZXR3b3JrID0gZ2V0U3RhdGljKChuZXcudGFyZ2V0KSwgXCJnZXROZXR3b3JrXCIpKG5ldHdvcmspO1xuICAgICAgICBhcGlLZXkgPSBnZXRTdGF0aWMoKG5ldy50YXJnZXQpLCBcImdldEFwaUtleVwiKShhcGlLZXkpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gZ2V0U3RhdGljKChuZXcudGFyZ2V0KSwgXCJnZXRVcmxcIikobmV0d29yaywgYXBpS2V5KTtcbiAgICAgICAgc3VwZXIoY29ubmVjdGlvbiwgbmV0d29yayk7XG4gICAgICAgIGlmICh0eXBlb2YgKGFwaUtleSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiYXBpS2V5XCIsIGFwaUtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXBpS2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGFwaUtleSkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywga2V5LCBhcGlLZXlba2V5XSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfc3RhcnRQZW5kaW5nKCkge1xuICAgICAgICBsb2dnZXIud2FybihcIldBUk5JTkc6IEFQSSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHBlbmRpbmcgZmlsdGVyc1wiKTtcbiAgICB9XG4gICAgaXNDb21tdW5pdHlSZXNvdXJjZSgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBnZXRTaWduZXIoYWRkcmVzcykge1xuICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoXCJBUEkgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBzaWduaW5nXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7IG9wZXJhdGlvbjogXCJnZXRTaWduZXJcIiB9KTtcbiAgICB9XG4gICAgbGlzdEFjY291bnRzKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICB9XG4gICAgLy8gUmV0dXJuIGEgZGVmYXVsdEFwaUtleSBpZiBudWxsLCBvdGhlcndpc2UgdmFsaWRhdGUgdGhlIEFQSSBrZXlcbiAgICBzdGF0aWMgZ2V0QXBpS2V5KGFwaUtleSkge1xuICAgICAgICByZXR1cm4gYXBpS2V5O1xuICAgIH1cbiAgICAvLyBSZXR1cm5zIHRoZSB1cmwgb3IgY29ubmVjdGlvbiBmb3IgdGhlIGdpdmVuIG5ldHdvcmsgYW5kIEFQSSBrZXkuIFRoZVxuICAgIC8vIEFQSSBrZXkgd2lsbCBoYXZlIGJlZW4gc2FuaXRpemVkIGJ5IHRoZSBnZXRBcGlLZXkgZmlyc3QsIHNvIGFueSB2YWxpZGF0aW9uXG4gICAgLy8gb3IgdHJhbnNmb3JtYXRpb25zIGNhbiBiZSBkb25lIHRoZXJlLlxuICAgIHN0YXRpYyBnZXRVcmwobmV0d29yaywgYXBpS2V5KSB7XG4gICAgICAgIHJldHVybiBsb2dnZXIudGhyb3dFcnJvcihcIm5vdCBpbXBsZW1lbnRlZDsgc3ViLWNsYXNzZXMgbXVzdCBvdmVycmlkZSBnZXRVcmxcIiwgTG9nZ2VyLmVycm9ycy5OT1RfSU1QTEVNRU5URUQsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJnZXRVcmxcIlxuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11cmwtanNvbi1ycGMtcHJvdmlkZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi9qc29uLXJwYy1wcm92aWRlclwiO1xubGV0IF9uZXh0SWQgPSAxO1xuZnVuY3Rpb24gYnVpbGRXZWIzTGVnYWN5RmV0Y2hlcihwcm92aWRlciwgc2VuZEZ1bmMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIC8vIE1ldGFtYXNrIGNvbXBsYWlucyBhYm91dCBldGhfc2lnbiAoYW5kIG9uIHNvbWUgdmVyc2lvbnMgaGFuZ3MpXG4gICAgICAgIGlmIChtZXRob2QgPT0gXCJldGhfc2lnblwiICYmIChwcm92aWRlci5pc01ldGFNYXNrIHx8IHByb3ZpZGVyLmlzU3RhdHVzKSkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2V0aGVyZXVtL2dvLWV0aGVyZXVtL3dpa2kvTWFuYWdlbWVudC1BUElzI3BlcnNvbmFsX3NpZ25cbiAgICAgICAgICAgIG1ldGhvZCA9IFwicGVyc29uYWxfc2lnblwiO1xuICAgICAgICAgICAgcGFyYW1zID0gW3BhcmFtc1sxXSwgcGFyYW1zWzBdXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcbiAgICAgICAgICAgIGlkOiAoX25leHRJZCsrKSxcbiAgICAgICAgICAgIGpzb25ycGM6IFwiMi4wXCJcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNlbmRGdW5jKHJlcXVlc3QsIGZ1bmN0aW9uIChlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlc3VsdC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuY29kZSA9IHJlc3VsdC5lcnJvci5jb2RlO1xuICAgICAgICAgICAgICAgICAgICBlcnJvci5kYXRhID0gcmVzdWx0LmVycm9yLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdC5yZXN1bHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5mdW5jdGlvbiBidWlsZEVpcDExOTNGZXRjaGVyKHByb3ZpZGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtZXRob2QsIHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHtcbiAgICAgICAgICAgIHBhcmFtcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1ldGFtYXNrIGNvbXBsYWlucyBhYm91dCBldGhfc2lnbiAoYW5kIG9uIHNvbWUgdmVyc2lvbnMgaGFuZ3MpXG4gICAgICAgIGlmIChtZXRob2QgPT0gXCJldGhfc2lnblwiICYmIChwcm92aWRlci5pc01ldGFNYXNrIHx8IHByb3ZpZGVyLmlzU3RhdHVzKSkge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2V0aGVyZXVtL2dvLWV0aGVyZXVtL3dpa2kvTWFuYWdlbWVudC1BUElzI3BlcnNvbmFsX3NpZ25cbiAgICAgICAgICAgIG1ldGhvZCA9IFwicGVyc29uYWxfc2lnblwiO1xuICAgICAgICAgICAgcGFyYW1zID0gW3BhcmFtc1sxXSwgcGFyYW1zWzBdXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvdmlkZXIucmVxdWVzdCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xuICAgIH07XG59XG5leHBvcnQgY2xhc3MgV2ViM1Byb3ZpZGVyIGV4dGVuZHMgSnNvblJwY1Byb3ZpZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm92aWRlciwgbmV0d29yaykge1xuICAgICAgICBsb2dnZXIuY2hlY2tOZXcobmV3LnRhcmdldCwgV2ViM1Byb3ZpZGVyKTtcbiAgICAgICAgaWYgKHByb3ZpZGVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJtaXNzaW5nIHByb3ZpZGVyXCIsIFwicHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXRoID0gbnVsbDtcbiAgICAgICAgbGV0IGpzb25ScGNGZXRjaEZ1bmMgPSBudWxsO1xuICAgICAgICBsZXQgc3VicHJvdmlkZXIgPSBudWxsO1xuICAgICAgICBpZiAodHlwZW9mIChwcm92aWRlcikgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgcGF0aCA9IFwidW5rbm93bjpcIjtcbiAgICAgICAgICAgIGpzb25ScGNGZXRjaEZ1bmMgPSBwcm92aWRlcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHBhdGggPSBwcm92aWRlci5ob3N0IHx8IHByb3ZpZGVyLnBhdGggfHwgXCJcIjtcbiAgICAgICAgICAgIGlmICghcGF0aCAmJiBwcm92aWRlci5pc01ldGFNYXNrKSB7XG4gICAgICAgICAgICAgICAgcGF0aCA9IFwibWV0YW1hc2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICAgICAgICBpZiAocHJvdmlkZXIucmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGggPSBcImVpcC0xMTkzOlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqc29uUnBjRmV0Y2hGdW5jID0gYnVpbGRFaXAxMTkzRmV0Y2hlcihwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwcm92aWRlci5zZW5kQXN5bmMpIHtcbiAgICAgICAgICAgICAgICBqc29uUnBjRmV0Y2hGdW5jID0gYnVpbGRXZWIzTGVnYWN5RmV0Y2hlcihwcm92aWRlciwgcHJvdmlkZXIuc2VuZEFzeW5jLmJpbmQocHJvdmlkZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyLnNlbmQpIHtcbiAgICAgICAgICAgICAgICBqc29uUnBjRmV0Y2hGdW5jID0gYnVpbGRXZWIzTGVnYWN5RmV0Y2hlcihwcm92aWRlciwgcHJvdmlkZXIuc2VuZC5iaW5kKHByb3ZpZGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidW5zdXBwb3J0ZWQgcHJvdmlkZXJcIiwgXCJwcm92aWRlclwiLCBwcm92aWRlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgICAgICBwYXRoID0gXCJ1bmtub3duOlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHBhdGgsIG5ldHdvcmspO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcImpzb25ScGNGZXRjaEZ1bmNcIiwganNvblJwY0ZldGNoRnVuYyk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHJvdmlkZXJcIiwgc3VicHJvdmlkZXIpO1xuICAgIH1cbiAgICBzZW5kKG1ldGhvZCwgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmpzb25ScGNGZXRjaEZ1bmMobWV0aG9kLCBwYXJhbXMpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYjMtcHJvdmlkZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IGRlZmluZVJlYWRPbmx5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmltcG9ydCB7IEpzb25ScGNQcm92aWRlciB9IGZyb20gXCIuL2pzb24tcnBjLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBXZWJTb2NrZXQgfSBmcm9tIFwiLi93c1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuLyoqXG4gKiAgTm90ZXM6XG4gKlxuICogIFRoaXMgcHJvdmlkZXIgZGlmZmVycyBhIGJpdCBmcm9tIHRoZSBwb2xsaW5nIHByb3ZpZGVycy4gT25lIG1haW5cbiAqICBkaWZmZXJlbmNlIGlzIGhvdyBpdCBoYW5kbGVzIGNvbnNpc3RlbmN5LiBUaGUgcG9sbGluZyBwcm92aWRlcnNcbiAqICB3aWxsIHN0YWxsIHJlc3BvbnNlcyB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHN0YXRlLCB3aGlsZSB0aGlzXG4gKiAgV2ViU29ja2V0IHByb3ZpZGVyIGFzc3VtZXMgdGhlIGNvbm5lY3RlZCBiYWNrZW5kIHdpbGwgbWFuYWdlIHRoaXMuXG4gKlxuICogIEZvciBleGFtcGxlLCBpZiBhIHBvbGxpbmcgcHJvdmlkZXIgZW1pdHMgYW4gZXZlbnQgd2hpY2ggaW5kaWNhdHNcbiAqICB0aGUgZXZlbnQgb2NjdXJyZWQgaW4gYmxvY2toYXNoIFhYWCwgYSBjYWxsIHRvIGZldGNoIHRoYXQgYmxvY2sgYnlcbiAqICBpdHMgaGFzaCBYWFgsIGlmIG5vdCBwcmVzZW50IHdpbGwgcmV0cnkgdW50aWwgaXQgaXMgcHJlc2VudC4gVGhpc1xuICogIGNhbiBvY2N1ciB3aGVuIHF1ZXJ5aW5nIGEgcG9vbCBvZiBub2RlcyB0aGF0IGFyZSBtaWxkbHkgb3V0IG9mIHN5bmNcbiAqICB3aXRoIGVhY2ggb3RoZXIuXG4gKi9cbmxldCBOZXh0SWQgPSAxO1xuLy8gRm9yIG1vcmUgaW5mbyBhYm91dCB0aGUgUmVhbC10aW1lIEV2ZW50IEFQSSBzZWU6XG4vLyAgIGh0dHBzOi8vZ2V0aC5ldGhlcmV1bS5vcmcvZG9jcy9ycGMvcHVic3ViXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0UHJvdmlkZXIgZXh0ZW5kcyBKc29uUnBjUHJvdmlkZXIge1xuICAgIGNvbnN0cnVjdG9yKHVybCwgbmV0d29yaykge1xuICAgICAgICAvLyBUaGlzIHdpbGwgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZTsgcGxlYXNlIG9wZW4gYW4gaXNzdWUgdG8gZXhwZWRpdGVcbiAgICAgICAgaWYgKG5ldHdvcmsgPT09IFwiYW55XCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiV2ViU29ja2V0UHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCAnYW55JyBuZXR3b3JrIHlldFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogXCJuZXR3b3JrOmFueVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcih1cmwsIG5ldHdvcmspO1xuICAgICAgICB0aGlzLl9wb2xsaW5nSW50ZXJ2YWwgPSAtMTtcbiAgICAgICAgdGhpcy5fd3NSZWFkeSA9IGZhbHNlO1xuICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl93ZWJzb2NrZXRcIiwgbmV3IFdlYlNvY2tldCh0aGlzLmNvbm5lY3Rpb24udXJsKSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX3JlcXVlc3RzXCIsIHt9KTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfc3Vic1wiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX3N1Yklkc1wiLCB7fSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2RldGVjdE5ldHdvcmtcIiwgc3VwZXIuZGV0ZWN0TmV0d29yaygpKTtcbiAgICAgICAgLy8gU3RhbGwgc2VuZGluZyByZXF1ZXN0cyB1bnRpbCB0aGUgc29ja2V0IGlzIG9wZW4uLi5cbiAgICAgICAgdGhpcy5fd2Vic29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dzUmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fcmVxdWVzdHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LnNlbmQodGhpcy5fcmVxdWVzdHNbaWRdLnBheWxvYWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbm1lc3NhZ2UgPSAobWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbWVzc2FnZUV2ZW50LmRhdGE7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcocmVzdWx0LmlkKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5fcmVxdWVzdHNbaWRdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9yZXF1ZXN0c1tpZF07XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmNhbGxiYWNrKG51bGwsIHJlc3VsdC5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IEpTT04ucGFyc2UocmVxdWVzdC5wYXlsb2FkKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiByZXN1bHQucmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXNcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IubWVzc2FnZSB8fCBcInVua25vd24gZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seShlcnJvciwgXCJjb2RlXCIsIHJlc3VsdC5lcnJvci5jb2RlIHx8IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkoZXJyb3IsIFwicmVzcG9uc2VcIiwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihcInVua25vd24gZXJyb3JcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvciwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KFwiZGVidWdcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBKU09OLnBhcnNlKHJlcXVlc3QucGF5bG9hZCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcjogdGhpc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQubWV0aG9kID09PSBcImV0aF9zdWJzY3JpcHRpb25cIikge1xuICAgICAgICAgICAgICAgIC8vIFN1YnNjcmlwdGlvbi4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRoaXMuX3N1YnNbcmVzdWx0LnBhcmFtcy5zdWJzY3JpcHRpb25dO1xuICAgICAgICAgICAgICAgIGlmIChzdWIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLmVtaXQuYXBwbHkodGhpcywgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzdWIucHJvY2Vzc0Z1bmMocmVzdWx0LnBhcmFtcy5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFRoaXMgUHJvdmlkZXIgZG9lcyBub3QgYWN0dWFsbHkgcG9sbCwgYnV0IHdlIHdhbnQgdG8gdHJpZ2dlclxuICAgICAgICAvLyBwb2xsIGV2ZW50cyBmb3IgdGhpbmdzIHRoYXQgZGVwZW5kIG9uIHRoZW0gKGxpa2Ugc3RhbGxpbmcgZm9yXG4gICAgICAgIC8vIGJsb2NrIGFuZCB0cmFuc2FjdGlvbiBsb29rdXBzKVxuICAgICAgICBjb25zdCBmYXV4UG9sbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcInBvbGxcIik7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgICBpZiAoZmF1eFBvbGwudW5yZWYpIHtcbiAgICAgICAgICAgIGZhdXhQb2xsLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGV0ZWN0TmV0d29yaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RldGVjdE5ldHdvcms7XG4gICAgfVxuICAgIGdldCBwb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICByZXNldEV2ZW50c0Jsb2NrKGJsb2NrTnVtYmVyKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiY2Fubm90IHJlc2V0IGV2ZW50cyBibG9jayBvbiBXZWJTb2NrZXRQcm92aWRlclwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcInJlc2V0RXZlbnRCbG9ja1wiXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXQgcG9sbGluZ0ludGVydmFsKHZhbHVlKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiY2Fubm90IHNldCBwb2xsaW5nIGludGVydmFsIG9uIFdlYlNvY2tldFByb3ZpZGVyXCIsIExvZ2dlci5lcnJvcnMuVU5TVVBQT1JURURfT1BFUkFUSU9OLCB7XG4gICAgICAgICAgICBvcGVyYXRpb246IFwic2V0UG9sbGluZ0ludGVydmFsXCJcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBvbGwoKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldCBwb2xsaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImNhbm5vdCBzZXQgcG9sbGluZyBvbiBXZWJTb2NrZXRQcm92aWRlclwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcInNldFBvbGxpbmdcIlxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2VuZChtZXRob2QsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByaWQgPSBOZXh0SWQrKztcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxuICAgICAgICAgICAgICAgIGlkOiByaWQsXG4gICAgICAgICAgICAgICAganNvbnJwYzogXCIyLjBcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJkZWJ1Z1wiLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcInJlcXVlc3RcIixcbiAgICAgICAgICAgICAgICByZXF1ZXN0OiBKU09OLnBhcnNlKHBheWxvYWQpLFxuICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RzW1N0cmluZyhyaWQpXSA9IHsgY2FsbGJhY2ssIHBheWxvYWQgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93c1JlYWR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LnNlbmQocGF5bG9hZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZGVmYXVsdFVybCgpIHtcbiAgICAgICAgcmV0dXJuIFwid3M6L1xcL2xvY2FsaG9zdDo4NTQ2XCI7XG4gICAgfVxuICAgIF9zdWJzY3JpYmUodGFnLCBwYXJhbSwgcHJvY2Vzc0Z1bmMpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGxldCBzdWJJZFByb21pc2UgPSB0aGlzLl9zdWJJZHNbdGFnXTtcbiAgICAgICAgICAgIGlmIChzdWJJZFByb21pc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHN1YklkUHJvbWlzZSA9IFByb21pc2UuYWxsKHBhcmFtKS50aGVuKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kKFwiZXRoX3N1YnNjcmliZVwiLCBwYXJhbSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3ViSWRzW3RhZ10gPSBzdWJJZFByb21pc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzdWJJZCA9IHlpZWxkIHN1YklkUHJvbWlzZTtcbiAgICAgICAgICAgIHRoaXMuX3N1YnNbc3ViSWRdID0geyB0YWcsIHByb2Nlc3NGdW5jIH07XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfc3RhcnRFdmVudChldmVudCkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJibG9ja1wiOlxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShcImJsb2NrXCIsIFtcIm5ld0hlYWRzXCJdLCAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsb2NrTnVtYmVyID0gQmlnTnVtYmVyLmZyb20ocmVzdWx0Lm51bWJlcikudG9OdW1iZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlZC5ibG9jayA9IGJsb2NrTnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJibG9ja1wiLCBibG9ja051bWJlcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShcInBlbmRpbmdcIiwgW1wibmV3UGVuZGluZ1RyYW5zYWN0aW9uc1wiXSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoXCJwZW5kaW5nXCIsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZmlsdGVyXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKGV2ZW50LnRhZywgW1wibG9nc1wiLCB0aGlzLl9nZXRGaWx0ZXIoZXZlbnQuZmlsdGVyKV0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZW1vdmVkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KGV2ZW50LmZpbHRlciwgdGhpcy5mb3JtYXR0ZXIuZmlsdGVyTG9nKHJlc3VsdCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInR4XCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbWl0UmVjZWlwdCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNoID0gZXZlbnQuaGFzaDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvblJlY2VpcHQoaGFzaCkudGhlbigocmVjZWlwdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWNlaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KGhhc2gsIHJlY2VpcHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgaXQgaXMgYWxyZWFkeSBtaW5lZFxuICAgICAgICAgICAgICAgIGVtaXRSZWNlaXB0KGV2ZW50KTtcbiAgICAgICAgICAgICAgICAvLyBUbyBrZWVwIHRoaW5ncyBzaW1wbGUsIHdlIHN0YXJ0IHVwIGEgc2luZ2xlIG5ld0hlYWRzIHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgICAgIC8vIHRvIGtlZXAgYW4gZXllIG91dCBmb3IgdHJhbnNhY3Rpb25zIHdlIGFyZSB3YXRjaGluZyBmb3IuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnRpbmcgYSBzdWJzY3JpcHRpb24gZm9yIGFuIGV2ZW50IChpLmUuIFwidHhcIikgdGhhdCBpcyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgLy8gcnVubmluZyBpcyAoYmFzaWNhbGx5KSBhIG5vcC5cbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmUoXCJ0eFwiLCBbXCJuZXdIZWFkc1wiXSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMuZmlsdGVyKChlKSA9PiAoZS50eXBlID09PSBcInR4XCIpKS5mb3JFYWNoKGVtaXRSZWNlaXB0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdGhpbmcgaXMgbmVlZGVkXG4gICAgICAgICAgICBjYXNlIFwiZGVidWdcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwb2xsXCI6XG4gICAgICAgICAgICBjYXNlIFwid2lsbFBvbGxcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaWRQb2xsXCI6XG4gICAgICAgICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1bmhhbmRsZWQ6XCIsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBfc3RvcEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIGxldCB0YWcgPSBldmVudC50YWc7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInR4XCIpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGFyZSByZW1haW5pbmcgdHJhbnNhY3Rpb24gZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAgICBpZiAodGhpcy5fZXZlbnRzLmZpbHRlcigoZSkgPT4gKGUudHlwZSA9PT0gXCJ0eFwiKSkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFnID0gXCJ0eFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMubGlzdGVuZXJDb3VudChldmVudC5ldmVudCkpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIGFyZSByZW1haW5pbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ViSWQgPSB0aGlzLl9zdWJJZHNbdGFnXTtcbiAgICAgICAgaWYgKCFzdWJJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJJZHNbdGFnXTtcbiAgICAgICAgc3ViSWQudGhlbigoc3ViSWQpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fc3Vic1tzdWJJZF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fc3Vic1tzdWJJZF07XG4gICAgICAgICAgICB0aGlzLnNlbmQoXCJldGhfdW5zdWJzY3JpYmVcIiwgW3N1YklkXSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCB3ZSBoYXZlIGNvbm5lY3RlZCBiZWZvcmUgdHJ5aW5nIHRvIGRpc2Nvbm5lY3RcbiAgICAgICAgICAgIGlmICh0aGlzLl93ZWJzb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCAobmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0Lm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSGFuZ3VwXG4gICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2Rlc1xuICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LmNsb3NlKDEwMDApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJzb2NrZXQtcHJvdmlkZXIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmxldCBXUyA9IG51bGw7XG50cnkge1xuICAgIFdTID0gV2ViU29ja2V0O1xuICAgIGlmIChXUyA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImluamVjdCBwbGVhc2VcIik7XG4gICAgfVxufVxuY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbiAgICBXUyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJXZWJTb2NrZXRzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudFwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgb3BlcmF0aW9uOiBcIm5ldyBXZWJTb2NrZXQoKVwiXG4gICAgICAgIH0pO1xuICAgIH07XG59XG4vL2V4cG9ydCBkZWZhdWx0IFdTO1xuLy9tb2R1bGUuZXhwb3J0cyA9IFdTO1xuZXhwb3J0IHsgV1MgYXMgV2ViU29ja2V0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13cy5qcy5tYXAiLCJleHBvcnQgY29uc3QgdmVyc2lvbiA9IFwicmFuZG9tLzUuMC44XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcIi4vcmFuZG9tXCI7XG5leHBvcnQgeyBzaHVmZmxlZCB9IGZyb20gXCIuL3NodWZmbGVcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgYXJyYXlpZnkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmxldCBhbnlHbG9iYWwgPSBudWxsO1xudHJ5IHtcbiAgICBhbnlHbG9iYWwgPSB3aW5kb3c7XG4gICAgaWYgKGFueUdsb2JhbCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBuZXh0XCIpO1xuICAgIH1cbn1cbmNhdGNoIChlcnJvcikge1xuICAgIHRyeSB7XG4gICAgICAgIGFueUdsb2JhbCA9IGdsb2JhbDtcbiAgICAgICAgaWYgKGFueUdsb2JhbCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgbmV4dFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgYW55R2xvYmFsID0ge307XG4gICAgfVxufVxubGV0IGNyeXB0byA9IGFueUdsb2JhbC5jcnlwdG8gfHwgYW55R2xvYmFsLm1zQ3J5cHRvO1xuaWYgKCFjcnlwdG8gfHwgIWNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICBsb2dnZXIud2FybihcIldBUk5JTkc6IE1pc3Npbmcgc3Ryb25nIHJhbmRvbSBudW1iZXIgc291cmNlXCIpO1xuICAgIGNyeXB0byA9IHtcbiAgICAgICAgZ2V0UmFuZG9tVmFsdWVzOiBmdW5jdGlvbiAoYnVmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoXCJubyBzZWN1cmUgcmFuZG9tIHNvdXJjZSBhdmFpYWxibGVcIiwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb246IFwiY3J5cHRvLmdldFJhbmRvbVZhbHVlc1wiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gcmFuZG9tQnl0ZXMobGVuZ3RoKSB7XG4gICAgaWYgKGxlbmd0aCA8PSAwIHx8IGxlbmd0aCA+IDEwMjQgfHwgKGxlbmd0aCAlIDEpKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGxlbmd0aFwiLCBcImxlbmd0aFwiLCBsZW5ndGgpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMocmVzdWx0KTtcbiAgICByZXR1cm4gYXJyYXlpZnkocmVzdWx0KTtcbn1cbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJhbmRvbS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmV4cG9ydCBmdW5jdGlvbiBzaHVmZmxlZChhcnJheSkge1xuICAgIGFycmF5ID0gYXJyYXkuc2xpY2UoKTtcbiAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgICAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG4gICAgICAgIGNvbnN0IHRtcCA9IGFycmF5W2ldO1xuICAgICAgICBhcnJheVtpXSA9IGFycmF5W2pdO1xuICAgICAgICBhcnJheVtqXSA9IHRtcDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2h1ZmZsZS5qcy5tYXAiLCJleHBvcnQgY29uc3QgdmVyc2lvbiA9IFwicmxwLzUuMC44XCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8vU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vd2lraS93aWtpL1JMUFxuaW1wb3J0IHsgYXJyYXlpZnksIGhleGxpZnksIGlzQnl0ZXNMaWtlIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5mdW5jdGlvbiBhcnJheWlmeUludGVnZXIodmFsdWUpIHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICB3aGlsZSAodmFsdWUpIHtcbiAgICAgICAgcmVzdWx0LnVuc2hpZnQodmFsdWUgJiAweGZmKTtcbiAgICAgICAgdmFsdWUgPj49IDg7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiB1bmFycmF5aWZ5SW50ZWdlcihkYXRhLCBvZmZzZXQsIGxlbmd0aCkge1xuICAgIGxldCByZXN1bHQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIDI1NikgKyBkYXRhW29mZnNldCArIGldO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gX2VuY29kZShvYmplY3QpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIGxldCBwYXlsb2FkID0gW107XG4gICAgICAgIG9iamVjdC5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgcGF5bG9hZCA9IHBheWxvYWQuY29uY2F0KF9lbmNvZGUoY2hpbGQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChwYXlsb2FkLmxlbmd0aCA8PSA1NSkge1xuICAgICAgICAgICAgcGF5bG9hZC51bnNoaWZ0KDB4YzAgKyBwYXlsb2FkLmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZW5ndGggPSBhcnJheWlmeUludGVnZXIocGF5bG9hZC5sZW5ndGgpO1xuICAgICAgICBsZW5ndGgudW5zaGlmdCgweGY3ICsgbGVuZ3RoLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBsZW5ndGguY29uY2F0KHBheWxvYWQpO1xuICAgIH1cbiAgICBpZiAoIWlzQnl0ZXNMaWtlKG9iamVjdCkpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcIlJMUCBvYmplY3QgbXVzdCBiZSBCeXRlc0xpa2VcIiwgXCJvYmplY3RcIiwgb2JqZWN0KTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycmF5aWZ5KG9iamVjdCkpO1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMSAmJiBkYXRhWzBdIDw9IDB4N2YpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRhdGEubGVuZ3RoIDw9IDU1KSB7XG4gICAgICAgIGRhdGEudW5zaGlmdCgweDgwICsgZGF0YS5sZW5ndGgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RoID0gYXJyYXlpZnlJbnRlZ2VyKGRhdGEubGVuZ3RoKTtcbiAgICBsZW5ndGgudW5zaGlmdCgweGI3ICsgbGVuZ3RoLmxlbmd0aCk7XG4gICAgcmV0dXJuIGxlbmd0aC5jb25jYXQoZGF0YSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKG9iamVjdCkge1xuICAgIHJldHVybiBoZXhsaWZ5KF9lbmNvZGUob2JqZWN0KSk7XG59XG5mdW5jdGlvbiBfZGVjb2RlQ2hpbGRyZW4oZGF0YSwgb2Zmc2V0LCBjaGlsZE9mZnNldCwgbGVuZ3RoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgd2hpbGUgKGNoaWxkT2Zmc2V0IDwgb2Zmc2V0ICsgMSArIGxlbmd0aCkge1xuICAgICAgICBjb25zdCBkZWNvZGVkID0gX2RlY29kZShkYXRhLCBjaGlsZE9mZnNldCk7XG4gICAgICAgIHJlc3VsdC5wdXNoKGRlY29kZWQucmVzdWx0KTtcbiAgICAgICAgY2hpbGRPZmZzZXQgKz0gZGVjb2RlZC5jb25zdW1lZDtcbiAgICAgICAgaWYgKGNoaWxkT2Zmc2V0ID4gb2Zmc2V0ICsgMSArIGxlbmd0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJjaGlsZCBkYXRhIHRvbyBzaG9ydFwiLCBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOLCB7fSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgY29uc3VtZWQ6ICgxICsgbGVuZ3RoKSwgcmVzdWx0OiByZXN1bHQgfTtcbn1cbi8vIHJldHVybnMgeyBjb25zdW1lZDogbnVtYmVyLCByZXN1bHQ6IE9iamVjdCB9XG5mdW5jdGlvbiBfZGVjb2RlKGRhdGEsIG9mZnNldCkge1xuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImRhdGEgdG9vIHNob3J0XCIsIExvZ2dlci5lcnJvcnMuQlVGRkVSX09WRVJSVU4sIHt9KTtcbiAgICB9XG4gICAgLy8gQXJyYXkgd2l0aCBleHRyYSBsZW5ndGggcHJlZml4XG4gICAgaWYgKGRhdGFbb2Zmc2V0XSA+PSAweGY4KSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aExlbmd0aCA9IGRhdGFbb2Zmc2V0XSAtIDB4Zjc7XG4gICAgICAgIGlmIChvZmZzZXQgKyAxICsgbGVuZ3RoTGVuZ3RoID4gZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiZGF0YSBzaG9ydCBzZWdtZW50IHRvbyBzaG9ydFwiLCBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdW5hcnJheWlmeUludGVnZXIoZGF0YSwgb2Zmc2V0ICsgMSwgbGVuZ3RoTGVuZ3RoKTtcbiAgICAgICAgaWYgKG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGggKyBsZW5ndGggPiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJkYXRhIGxvbmcgc2VnbWVudCB0b28gc2hvcnRcIiwgTG9nZ2VyLmVycm9ycy5CVUZGRVJfT1ZFUlJVTiwge30pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfZGVjb2RlQ2hpbGRyZW4oZGF0YSwgb2Zmc2V0LCBvZmZzZXQgKyAxICsgbGVuZ3RoTGVuZ3RoLCBsZW5ndGhMZW5ndGggKyBsZW5ndGgpO1xuICAgIH1cbiAgICBlbHNlIGlmIChkYXRhW29mZnNldF0gPj0gMHhjMCkge1xuICAgICAgICBjb25zdCBsZW5ndGggPSBkYXRhW29mZnNldF0gLSAweGMwO1xuICAgICAgICBpZiAob2Zmc2V0ICsgMSArIGxlbmd0aCA+IGRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImRhdGEgYXJyYXkgdG9vIHNob3J0XCIsIExvZ2dlci5lcnJvcnMuQlVGRkVSX09WRVJSVU4sIHt9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX2RlY29kZUNoaWxkcmVuKGRhdGEsIG9mZnNldCwgb2Zmc2V0ICsgMSwgbGVuZ3RoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YVtvZmZzZXRdID49IDB4YjgpIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoTGVuZ3RoID0gZGF0YVtvZmZzZXRdIC0gMHhiNztcbiAgICAgICAgaWYgKG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGggPiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJkYXRhIGFycmF5IHRvbyBzaG9ydFwiLCBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdW5hcnJheWlmeUludGVnZXIoZGF0YSwgb2Zmc2V0ICsgMSwgbGVuZ3RoTGVuZ3RoKTtcbiAgICAgICAgaWYgKG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGggKyBsZW5ndGggPiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJkYXRhIGFycmF5IHRvbyBzaG9ydFwiLCBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGV4bGlmeShkYXRhLnNsaWNlKG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGgsIG9mZnNldCArIDEgKyBsZW5ndGhMZW5ndGggKyBsZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHsgY29uc3VtZWQ6ICgxICsgbGVuZ3RoTGVuZ3RoICsgbGVuZ3RoKSwgcmVzdWx0OiByZXN1bHQgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGF0YVtvZmZzZXRdID49IDB4ODApIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZGF0YVtvZmZzZXRdIC0gMHg4MDtcbiAgICAgICAgaWYgKG9mZnNldCArIDEgKyBsZW5ndGggPiBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93RXJyb3IoXCJkYXRhIHRvbyBzaG9ydFwiLCBMb2dnZXIuZXJyb3JzLkJVRkZFUl9PVkVSUlVOLCB7fSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gaGV4bGlmeShkYXRhLnNsaWNlKG9mZnNldCArIDEsIG9mZnNldCArIDEgKyBsZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHsgY29uc3VtZWQ6ICgxICsgbGVuZ3RoKSwgcmVzdWx0OiByZXN1bHQgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY29uc3VtZWQ6IDEsIHJlc3VsdDogaGV4bGlmeShkYXRhW29mZnNldF0pIH07XG59XG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKGRhdGEpIHtcbiAgICBjb25zdCBieXRlcyA9IGFycmF5aWZ5KGRhdGEpO1xuICAgIGNvbnN0IGRlY29kZWQgPSBfZGVjb2RlKGJ5dGVzLCAwKTtcbiAgICBpZiAoZGVjb2RlZC5jb25zdW1lZCAhPT0gYnl0ZXMubGVuZ3RoKSB7XG4gICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIHJscCBkYXRhXCIsIFwiZGF0YVwiLCBkYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZWQucmVzdWx0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcInNoYTIvNS4wLjhcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsImltcG9ydCB7IGNvbXB1dGVIbWFjLCByaXBlbWQxNjAsIHNoYTI1Niwgc2hhNTEyIH0gZnJvbSBcIi4vc2hhMlwiO1xuaW1wb3J0IHsgU3VwcG9ydGVkQWxnb3JpdGhtIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCB7IGNvbXB1dGVIbWFjLCByaXBlbWQxNjAsIHNoYTI1Niwgc2hhNTEyLCBTdXBwb3J0ZWRBbGdvcml0aG0gfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IGhhc2ggZnJvbSBcImhhc2guanNcIjtcbi8vY29uc3QgX3JpcGVtZDE2MCA9IF9oYXNoLnJpcGVtZDE2MDtcbmltcG9ydCB7IGFycmF5aWZ5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBbGdvcml0aG0gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuZXhwb3J0IGZ1bmN0aW9uIHJpcGVtZDE2MChkYXRhKSB7XG4gICAgcmV0dXJuIFwiMHhcIiArIChoYXNoLnJpcGVtZDE2MCgpLnVwZGF0ZShhcnJheWlmeShkYXRhKSkuZGlnZXN0KFwiaGV4XCIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGEyNTYoZGF0YSkge1xuICAgIHJldHVybiBcIjB4XCIgKyAoaGFzaC5zaGEyNTYoKS51cGRhdGUoYXJyYXlpZnkoZGF0YSkpLmRpZ2VzdChcImhleFwiKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc2hhNTEyKGRhdGEpIHtcbiAgICByZXR1cm4gXCIweFwiICsgKGhhc2guc2hhNTEyKCkudXBkYXRlKGFycmF5aWZ5KGRhdGEpKS5kaWdlc3QoXCJoZXhcIikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVIbWFjKGFsZ29yaXRobSwga2V5LCBkYXRhKSB7XG4gICAgaWYgKCFTdXBwb3J0ZWRBbGdvcml0aG1bYWxnb3JpdGhtXSkge1xuICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInVuc3VwcG9ydGVkIGFsZ29yaXRobSBcIiArIGFsZ29yaXRobSwgTG9nZ2VyLmVycm9ycy5VTlNVUFBPUlRFRF9PUEVSQVRJT04sIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbjogXCJobWFjXCIsXG4gICAgICAgICAgICBhbGdvcml0aG06IGFsZ29yaXRobVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFwiMHhcIiArIGhhc2guaG1hYyhoYXNoW2FsZ29yaXRobV0sIGFycmF5aWZ5KGtleSkpLnVwZGF0ZShhcnJheWlmeShkYXRhKSkuZGlnZXN0KFwiaGV4XCIpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c2hhMi5qcy5tYXAiLCJleHBvcnQgdmFyIFN1cHBvcnRlZEFsZ29yaXRobTtcbihmdW5jdGlvbiAoU3VwcG9ydGVkQWxnb3JpdGhtKSB7XG4gICAgU3VwcG9ydGVkQWxnb3JpdGhtW1wic2hhMjU2XCJdID0gXCJzaGEyNTZcIjtcbiAgICBTdXBwb3J0ZWRBbGdvcml0aG1bXCJzaGE1MTJcIl0gPSBcInNoYTUxMlwiO1xufSkoU3VwcG9ydGVkQWxnb3JpdGhtIHx8IChTdXBwb3J0ZWRBbGdvcml0aG0gPSB7fSkpO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBCbG9ja0hhc2goKSB7XG4gIHRoaXMucGVuZGluZyA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1RvdGFsID0gMDtcbiAgdGhpcy5ibG9ja1NpemUgPSB0aGlzLmNvbnN0cnVjdG9yLmJsb2NrU2l6ZTtcbiAgdGhpcy5vdXRTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5vdXRTaXplO1xuICB0aGlzLmhtYWNTdHJlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IuaG1hY1N0cmVuZ3RoO1xuICB0aGlzLnBhZExlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IucGFkTGVuZ3RoIC8gODtcbiAgdGhpcy5lbmRpYW4gPSAnYmlnJztcblxuICB0aGlzLl9kZWx0YTggPSB0aGlzLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMuX2RlbHRhMzIgPSB0aGlzLmJsb2NrU2l6ZSAvIDMyO1xufVxuZXhwb3J0cy5CbG9ja0hhc2ggPSBCbG9ja0hhc2g7XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIC8vIENvbnZlcnQgbWVzc2FnZSB0byBhcnJheSwgcGFkIGl0LCBhbmQgam9pbiBpbnRvIDMyYml0IGJsb2Nrc1xuICBtc2cgPSB1dGlscy50b0FycmF5KG1zZywgZW5jKTtcbiAgaWYgKCF0aGlzLnBlbmRpbmcpXG4gICAgdGhpcy5wZW5kaW5nID0gbXNnO1xuICBlbHNlXG4gICAgdGhpcy5wZW5kaW5nID0gdGhpcy5wZW5kaW5nLmNvbmNhdChtc2cpO1xuICB0aGlzLnBlbmRpbmdUb3RhbCArPSBtc2cubGVuZ3RoO1xuXG4gIC8vIEVub3VnaCBkYXRhLCB0cnkgdXBkYXRpbmdcbiAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPj0gdGhpcy5fZGVsdGE4KSB7XG4gICAgbXNnID0gdGhpcy5wZW5kaW5nO1xuXG4gICAgLy8gUHJvY2VzcyBwZW5kaW5nIGRhdGEgaW4gYmxvY2tzXG4gICAgdmFyIHIgPSBtc2cubGVuZ3RoICUgdGhpcy5fZGVsdGE4O1xuICAgIHRoaXMucGVuZGluZyA9IG1zZy5zbGljZShtc2cubGVuZ3RoIC0gciwgbXNnLmxlbmd0aCk7XG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuXG4gICAgbXNnID0gdXRpbHMuam9pbjMyKG1zZywgMCwgbXNnLmxlbmd0aCAtIHIsIHRoaXMuZW5kaWFuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gdGhpcy5fZGVsdGEzMilcbiAgICAgIHRoaXMuX3VwZGF0ZShtc2csIGksIGkgKyB0aGlzLl9kZWx0YTMyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKTtcbiAgYXNzZXJ0KHRoaXMucGVuZGluZyA9PT0gbnVsbCk7XG5cbiAgcmV0dXJuIHRoaXMuX2RpZ2VzdChlbmMpO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gcGFkKCkge1xuICB2YXIgbGVuID0gdGhpcy5wZW5kaW5nVG90YWw7XG4gIHZhciBieXRlcyA9IHRoaXMuX2RlbHRhODtcbiAgdmFyIGsgPSBieXRlcyAtICgobGVuICsgdGhpcy5wYWRMZW5ndGgpICUgYnl0ZXMpO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGsgKyB0aGlzLnBhZExlbmd0aCk7XG4gIHJlc1swXSA9IDB4ODA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgazsgaSsrKVxuICAgIHJlc1tpXSA9IDA7XG5cbiAgLy8gQXBwZW5kIGxlbmd0aFxuICBsZW4gPDw9IDM7XG4gIGlmICh0aGlzLmVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICBmb3IgKHZhciB0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG5cbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gIH0gZWxzZSB7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuXG4gICAgZm9yICh0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hYyhoYXNoLCBrZXksIGVuYykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpXG4gICAgcmV0dXJuIG5ldyBIbWFjKGhhc2gsIGtleSwgZW5jKTtcbiAgdGhpcy5IYXNoID0gaGFzaDtcbiAgdGhpcy5ibG9ja1NpemUgPSBoYXNoLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMub3V0U2l6ZSA9IGhhc2gub3V0U2l6ZSAvIDg7XG4gIHRoaXMuaW5uZXIgPSBudWxsO1xuICB0aGlzLm91dGVyID0gbnVsbDtcblxuICB0aGlzLl9pbml0KHV0aWxzLnRvQXJyYXkoa2V5LCBlbmMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hYztcblxuSG1hYy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGtleSkge1xuICAvLyBTaG9ydGVuIGtleSwgaWYgbmVlZGVkXG4gIGlmIChrZXkubGVuZ3RoID4gdGhpcy5ibG9ja1NpemUpXG4gICAga2V5ID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpO1xuICBhc3NlcnQoa2V5Lmxlbmd0aCA8PSB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gQWRkIHBhZGRpbmcgdG8ga2V5XG4gIGZvciAodmFyIGkgPSBrZXkubGVuZ3RoOyBpIDwgdGhpcy5ibG9ja1NpemU7IGkrKylcbiAgICBrZXkucHVzaCgwKTtcblxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDM2O1xuICB0aGlzLmlubmVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xuXG4gIC8vIDB4MzYgXiAweDVjID0gMHg2YVxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDZhO1xuICB0aGlzLm91dGVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xufTtcblxuSG1hYy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIHRoaXMuaW5uZXIudXBkYXRlKG1zZywgZW5jKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5IbWFjLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpO1xuICByZXR1cm4gdGhpcy5vdXRlci5kaWdlc3QoZW5jKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIFNIQTI1NiA9IHJlcXVpcmUoJy4vMjU2Jyk7XG5cbmZ1bmN0aW9uIFNIQTIyNCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTIyNCkpXG4gICAgcmV0dXJuIG5ldyBTSEEyMjQoKTtcblxuICBTSEEyNTYuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4YzEwNTllZDgsIDB4MzY3Y2Q1MDcsIDB4MzA3MGRkMTcsIDB4ZjcwZTU5MzksXG4gICAgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjI0LCBTSEEyNTYpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEyMjQ7XG5cblNIQTIyNC5ibG9ja1NpemUgPSA1MTI7XG5TSEEyMjQub3V0U2l6ZSA9IDIyNDtcblNIQTIyNC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyMjQucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTIyNC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgLy8gSnVzdCB0cnVuY2F0ZSBvdXRwdXRcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHJvdHIzMiA9IHV0aWxzLnJvdHIzMjtcblxuZnVuY3Rpb24gZnRfMShzLCB4LCB5LCB6KSB7XG4gIGlmIChzID09PSAwKVxuICAgIHJldHVybiBjaDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMSB8fCBzID09PSAzKVxuICAgIHJldHVybiBwMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAyKVxuICAgIHJldHVybiBtYWozMih4LCB5LCB6KTtcbn1cbmV4cG9ydHMuZnRfMSA9IGZ0XzE7XG5cbmZ1bmN0aW9uIGNoMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICgofngpICYgeik7XG59XG5leHBvcnRzLmNoMzIgPSBjaDMyO1xuXG5mdW5jdGlvbiBtYWozMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7XG59XG5leHBvcnRzLm1hajMyID0gbWFqMzI7XG5cbmZ1bmN0aW9uIHAzMih4LCB5LCB6KSB7XG4gIHJldHVybiB4IF4geSBeIHo7XG59XG5leHBvcnRzLnAzMiA9IHAzMjtcblxuZnVuY3Rpb24gczBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAyKSBeIHJvdHIzMih4LCAxMykgXiByb3RyMzIoeCwgMjIpO1xufVxuZXhwb3J0cy5zMF8yNTYgPSBzMF8yNTY7XG5cbmZ1bmN0aW9uIHMxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNikgXiByb3RyMzIoeCwgMTEpIF4gcm90cjMyKHgsIDI1KTtcbn1cbmV4cG9ydHMuczFfMjU2ID0gczFfMjU2O1xuXG5mdW5jdGlvbiBnMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDcpIF4gcm90cjMyKHgsIDE4KSBeICh4ID4+PiAzKTtcbn1cbmV4cG9ydHMuZzBfMjU2ID0gZzBfMjU2O1xuXG5mdW5jdGlvbiBnMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDE3KSBeIHJvdHIzMih4LCAxOSkgXiAoeCA+Pj4gMTApO1xufVxuZXhwb3J0cy5nMV8yNTYgPSBnMV8yNTY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoIWVuYykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgICAgdmFyIGhpID0gYyA+PiA4O1xuICAgICAgICB2YXIgbG8gPSBjICYgMHhmZjtcbiAgICAgICAgaWYgKGhpKVxuICAgICAgICAgIHJlcy5wdXNoKGhpLCBsbyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXMucHVzaChsbyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlbmMgPT09ICdoZXgnKSB7XG4gICAgICBtc2cgPSBtc2cucmVwbGFjZSgvW15hLXowLTldKy9pZywgJycpO1xuICAgICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgICBtc2cgPSAnMCcgKyBtc2c7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgICByZXMucHVzaChwYXJzZUludChtc2dbaV0gKyBtc2dbaSArIDFdLCAxNikpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgICAgcmVzW2ldID0gbXNnW2ldIHwgMDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gdG9IZXgobXNnKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspXG4gICAgcmVzICs9IHplcm8yKG1zZ1tpXS50b1N0cmluZygxNikpO1xuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy50b0hleCA9IHRvSGV4O1xuXG5mdW5jdGlvbiBodG9ubCh3KSB7XG4gIHZhciByZXMgPSAodyA+Pj4gMjQpIHxcbiAgICAgICAgICAgICgodyA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgICAgICgodyA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICAgICAoKHcgJiAweGZmKSA8PCAyNCk7XG4gIHJldHVybiByZXMgPj4+IDA7XG59XG5leHBvcnRzLmh0b25sID0gaHRvbmw7XG5cbmZ1bmN0aW9uIHRvSGV4MzIobXNnLCBlbmRpYW4pIHtcbiAgdmFyIHJlcyA9ICcnO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB3ID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdsaXR0bGUnKVxuICAgICAgdyA9IGh0b25sKHcpO1xuICAgIHJlcyArPSB6ZXJvOCh3LnRvU3RyaW5nKDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXgzMiA9IHRvSGV4MzI7XG5cbmZ1bmN0aW9uIHplcm8yKHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHplcm84KHdvcmQpIHtcbiAgaWYgKHdvcmQubGVuZ3RoID09PSA3KVxuICAgIHJldHVybiAnMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNilcbiAgICByZXR1cm4gJzAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA1KVxuICAgIHJldHVybiAnMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSA0KVxuICAgIHJldHVybiAnMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMylcbiAgICByZXR1cm4gJzAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAyKVxuICAgIHJldHVybiAnMDAwMDAwJyArIHdvcmQ7XG4gIGVsc2UgaWYgKHdvcmQubGVuZ3RoID09PSAxKVxuICAgIHJldHVybiAnMDAwMDAwMCcgKyB3b3JkO1xuICBlbHNlXG4gICAgcmV0dXJuIHdvcmQ7XG59XG5leHBvcnRzLnplcm84ID0gemVybzg7XG5cbmZ1bmN0aW9uIGpvaW4zMihtc2csIHN0YXJ0LCBlbmQsIGVuZGlhbikge1xuICB2YXIgbGVuID0gZW5kIC0gc3RhcnQ7XG4gIGFzc2VydChsZW4gJSA0ID09PSAwKTtcbiAgdmFyIHJlcyA9IG5ldyBBcnJheShsZW4gLyA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSBzdGFydDsgaSA8IHJlcy5sZW5ndGg7IGkrKywgayArPSA0KSB7XG4gICAgdmFyIHc7XG4gICAgaWYgKGVuZGlhbiA9PT0gJ2JpZycpXG4gICAgICB3ID0gKG1zZ1trXSA8PCAyNCkgfCAobXNnW2sgKyAxXSA8PCAxNikgfCAobXNnW2sgKyAyXSA8PCA4KSB8IG1zZ1trICsgM107XG4gICAgZWxzZVxuICAgICAgdyA9IChtc2dbayArIDNdIDw8IDI0KSB8IChtc2dbayArIDJdIDw8IDE2KSB8IChtc2dbayArIDFdIDw8IDgpIHwgbXNnW2tdO1xuICAgIHJlc1tpXSA9IHcgPj4+IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuam9pbjMyID0gam9pbjMyO1xuXG5mdW5jdGlvbiBzcGxpdDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobXNnLmxlbmd0aCAqIDQpO1xuICBmb3IgKHZhciBpID0gMCwgayA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciBtID0gbXNnW2ldO1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKSB7XG4gICAgICByZXNba10gPSBtID4+PiAyNDtcbiAgICAgIHJlc1trICsgMV0gPSAobSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgIHJlc1trICsgMl0gPSAobSA+Pj4gOCkgJiAweGZmO1xuICAgICAgcmVzW2sgKyAzXSA9IG0gJiAweGZmO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNbayArIDNdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trXSA9IG0gJiAweGZmO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuZXhwb3J0cy5zcGxpdDMyID0gc3BsaXQzMjtcblxuZnVuY3Rpb24gcm90cjMyKHcsIGIpIHtcbiAgcmV0dXJuICh3ID4+PiBiKSB8ICh3IDw8ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90cjMyID0gcm90cjMyO1xuXG5mdW5jdGlvbiByb3RsMzIodywgYikge1xuICByZXR1cm4gKHcgPDwgYikgfCAodyA+Pj4gKDMyIC0gYikpO1xufVxuZXhwb3J0cy5yb3RsMzIgPSByb3RsMzI7XG5cbmZ1bmN0aW9uIHN1bTMyKGEsIGIpIHtcbiAgcmV0dXJuIChhICsgYikgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyID0gc3VtMzI7XG5cbmZ1bmN0aW9uIHN1bTMyXzMoYSwgYiwgYykge1xuICByZXR1cm4gKGEgKyBiICsgYykgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzMgPSBzdW0zMl8zO1xuXG5mdW5jdGlvbiBzdW0zMl80KGEsIGIsIGMsIGQpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNCA9IHN1bTMyXzQ7XG5cbmZ1bmN0aW9uIHN1bTMyXzUoYSwgYiwgYywgZCwgZSkge1xuICByZXR1cm4gKGEgKyBiICsgYyArIGQgKyBlKSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtMzJfNSA9IHN1bTMyXzU7XG5cbmZ1bmN0aW9uIHN1bTY0KGJ1ZiwgcG9zLCBhaCwgYWwpIHtcbiAgdmFyIGJoID0gYnVmW3Bvc107XG4gIHZhciBibCA9IGJ1Zltwb3MgKyAxXTtcblxuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgYnVmW3Bvc10gPSBoaSA+Pj4gMDtcbiAgYnVmW3BvcyArIDFdID0gbG87XG59XG5leHBvcnRzLnN1bTY0ID0gc3VtNjQ7XG5cbmZ1bmN0aW9uIHN1bTY0X2hpKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IChhbCArIGJsKSA+Pj4gMDtcbiAgdmFyIGhpID0gKGxvIDwgYWwgPyAxIDogMCkgKyBhaCArIGJoO1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2hpID0gc3VtNjRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0X2xvKGFoLCBhbCwgYmgsIGJsKSB7XG4gIHZhciBsbyA9IGFsICsgYmw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfbG8gPSBzdW02NF9sbztcblxuZnVuY3Rpb24gc3VtNjRfNF9oaShhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF80X2hpID0gc3VtNjRfNF9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNF9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwpIHtcbiAgdmFyIGxvID0gYWwgKyBibCArIGNsICsgZGw7XG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9sbyA9IHN1bTY0XzRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzVfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsLCBlaCwgZWwpIHtcbiAgdmFyIGNhcnJ5ID0gMDtcbiAgdmFyIGxvID0gYWw7XG4gIGxvID0gKGxvICsgYmwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGFsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgY2wpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGNsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZGwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGRsID8gMSA6IDA7XG4gIGxvID0gKGxvICsgZWwpID4+PiAwO1xuICBjYXJyeSArPSBsbyA8IGVsID8gMSA6IDA7XG5cbiAgdmFyIGhpID0gYWggKyBiaCArIGNoICsgZGggKyBlaCArIGNhcnJ5O1xuICByZXR1cm4gaGkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzVfaGkgPSBzdW02NF81X2hpO1xuXG5mdW5jdGlvbiBzdW02NF81X2xvKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsICsgZWw7XG5cbiAgcmV0dXJuIGxvID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2xvID0gc3VtNjRfNV9sbztcblxuZnVuY3Rpb24gcm90cjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFsIDw8ICgzMiAtIG51bSkpIHwgKGFoID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2hpID0gcm90cjY0X2hpO1xuXG5mdW5jdGlvbiByb3RyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5yb3RyNjRfbG8gPSByb3RyNjRfbG87XG5cbmZ1bmN0aW9uIHNocjY0X2hpKGFoLCBhbCwgbnVtKSB7XG4gIHJldHVybiBhaCA+Pj4gbnVtO1xufVxuZXhwb3J0cy5zaHI2NF9oaSA9IHNocjY0X2hpO1xuXG5mdW5jdGlvbiBzaHI2NF9sbyhhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhaCA8PCAoMzIgLSBudW0pKSB8IChhbCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnNocjY0X2xvID0gc2hyNjRfbG87XG4iLCJleHBvcnQgY29uc3QgdmVyc2lvbiA9IFwic2lnbmluZy1rZXkvNS4wLjEwXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1fdmVyc2lvbi5qcy5tYXAiLCJpbXBvcnQgQk4gZnJvbSAnYm4uanMnO1xuaW1wb3J0IGhhc2ggZnJvbSAnaGFzaC5qcyc7XG5cbnZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyAoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgYmFzZWRpciwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7XG5cdFx0cGF0aDogYmFzZWRpcixcblx0XHRleHBvcnRzOiB7fSxcblx0XHRyZXF1aXJlOiBmdW5jdGlvbiAocGF0aCwgYmFzZSkge1xuXHRcdFx0cmV0dXJuIGNvbW1vbmpzUmVxdWlyZShwYXRoLCAoYmFzZSA9PT0gdW5kZWZpbmVkIHx8IGJhc2UgPT09IG51bGwpID8gbW9kdWxlLnBhdGggOiBiYXNlKTtcblx0XHR9XG5cdH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdEV4cG9ydEZyb21OYW1lc3BhY2VJZlByZXNlbnQgKG4pIHtcblx0cmV0dXJuIG4gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sICdkZWZhdWx0JykgPyBuWydkZWZhdWx0J10gOiBuO1xufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbU5hbWVzcGFjZUlmTm90TmFtZWQgKG4pIHtcblx0cmV0dXJuIG4gJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sICdkZWZhdWx0JykgJiYgT2JqZWN0LmtleXMobikubGVuZ3RoID09PSAxID8gblsnZGVmYXVsdCddIDogbjtcbn1cblxuZnVuY3Rpb24gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKG4pIHtcblx0aWYgKG4uX19lc01vZHVsZSkgcmV0dXJuIG47XG5cdHZhciBhID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnX19lc01vZHVsZScsIHt2YWx1ZTogdHJ1ZX0pO1xuXHRPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG5cdFx0dmFyIGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sIGspO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCBrLCBkLmdldCA/IGQgOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHJldHVybiBuW2tdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0cmV0dXJuIGE7XG59XG5cbmZ1bmN0aW9uIGNvbW1vbmpzUmVxdWlyZSAoKSB7XG5cdHRocm93IG5ldyBFcnJvcignRHluYW1pYyByZXF1aXJlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQHJvbGx1cC9wbHVnaW4tY29tbW9uanMnKTtcbn1cblxudmFyIG1pbmltYWxpc3RpY0Fzc2VydCA9IGFzc2VydDtcblxuZnVuY3Rpb24gYXNzZXJ0KHZhbCwgbXNnKSB7XG4gIGlmICghdmFsKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbn1cblxuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gYXNzZXJ0RXF1YWwobCwgciwgbXNnKSB7XG4gIGlmIChsICE9IHIpXG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZyB8fCAoJ0Fzc2VydGlvbiBmYWlsZWQ6ICcgKyBsICsgJyAhPSAnICsgcikpO1xufTtcblxudmFyIHV0aWxzXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG5cbmZ1bmN0aW9uIHRvQXJyYXkobXNnLCBlbmMpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkobXNnKSlcbiAgICByZXR1cm4gbXNnLnNsaWNlKCk7XG4gIGlmICghbXNnKVxuICAgIHJldHVybiBbXTtcbiAgdmFyIHJlcyA9IFtdO1xuICBpZiAodHlwZW9mIG1zZyAhPT0gJ3N0cmluZycpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgIG1zZyA9IG1zZy5yZXBsYWNlKC9bXmEtejAtOV0rL2lnLCAnJyk7XG4gICAgaWYgKG1zZy5sZW5ndGggJSAyICE9PSAwKVxuICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSArPSAyKVxuICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgfSBlbHNlIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGMgPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICAgIHZhciBoaSA9IGMgPj4gODtcbiAgICAgIHZhciBsbyA9IGMgJiAweGZmO1xuICAgICAgaWYgKGhpKVxuICAgICAgICByZXMucHVzaChoaSwgbG8pO1xuICAgICAgZWxzZVxuICAgICAgICByZXMucHVzaChsbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG51dGlscy50b0FycmF5ID0gdG9BcnJheTtcblxuZnVuY3Rpb24gemVybzIod29yZCkge1xuICBpZiAod29yZC5sZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICcwJyArIHdvcmQ7XG4gIGVsc2VcbiAgICByZXR1cm4gd29yZDtcbn1cbnV0aWxzLnplcm8yID0gemVybzI7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbnV0aWxzLnRvSGV4ID0gdG9IZXg7XG5cbnV0aWxzLmVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShhcnIsIGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdG9IZXgoYXJyKTtcbiAgZWxzZVxuICAgIHJldHVybiBhcnI7XG59O1xufSk7XG5cbnZhciB1dGlsc18xJDEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IGV4cG9ydHM7XG5cblxuXG5cbnV0aWxzLmFzc2VydCA9IG1pbmltYWxpc3RpY0Fzc2VydDtcbnV0aWxzLnRvQXJyYXkgPSB1dGlsc18xLnRvQXJyYXk7XG51dGlscy56ZXJvMiA9IHV0aWxzXzEuemVybzI7XG51dGlscy50b0hleCA9IHV0aWxzXzEudG9IZXg7XG51dGlscy5lbmNvZGUgPSB1dGlsc18xLmVuY29kZTtcblxuLy8gUmVwcmVzZW50IG51bSBpbiBhIHctTkFGIGZvcm1cbmZ1bmN0aW9uIGdldE5BRihudW0sIHcsIGJpdHMpIHtcbiAgdmFyIG5hZiA9IG5ldyBBcnJheShNYXRoLm1heChudW0uYml0TGVuZ3RoKCksIGJpdHMpICsgMSk7XG4gIG5hZi5maWxsKDApO1xuXG4gIHZhciB3cyA9IDEgPDwgKHcgKyAxKTtcbiAgdmFyIGsgPSBudW0uY2xvbmUoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG5hZi5sZW5ndGg7IGkrKykge1xuICAgIHZhciB6O1xuICAgIHZhciBtb2QgPSBrLmFuZGxuKHdzIC0gMSk7XG4gICAgaWYgKGsuaXNPZGQoKSkge1xuICAgICAgaWYgKG1vZCA+ICh3cyA+PiAxKSAtIDEpXG4gICAgICAgIHogPSAod3MgPj4gMSkgLSBtb2Q7XG4gICAgICBlbHNlXG4gICAgICAgIHogPSBtb2Q7XG4gICAgICBrLmlzdWJuKHopO1xuICAgIH0gZWxzZSB7XG4gICAgICB6ID0gMDtcbiAgICB9XG5cbiAgICBuYWZbaV0gPSB6O1xuICAgIGsuaXVzaHJuKDEpO1xuICB9XG5cbiAgcmV0dXJuIG5hZjtcbn1cbnV0aWxzLmdldE5BRiA9IGdldE5BRjtcblxuLy8gUmVwcmVzZW50IGsxLCBrMiBpbiBhIEpvaW50IFNwYXJzZSBGb3JtXG5mdW5jdGlvbiBnZXRKU0YoazEsIGsyKSB7XG4gIHZhciBqc2YgPSBbXG4gICAgW10sXG4gICAgW10sXG4gIF07XG5cbiAgazEgPSBrMS5jbG9uZSgpO1xuICBrMiA9IGsyLmNsb25lKCk7XG4gIHZhciBkMSA9IDA7XG4gIHZhciBkMiA9IDA7XG4gIHZhciBtODtcbiAgd2hpbGUgKGsxLmNtcG4oLWQxKSA+IDAgfHwgazIuY21wbigtZDIpID4gMCkge1xuICAgIC8vIEZpcnN0IHBoYXNlXG4gICAgdmFyIG0xNCA9IChrMS5hbmRsbigzKSArIGQxKSAmIDM7XG4gICAgdmFyIG0yNCA9IChrMi5hbmRsbigzKSArIGQyKSAmIDM7XG4gICAgaWYgKG0xNCA9PT0gMylcbiAgICAgIG0xNCA9IC0xO1xuICAgIGlmIChtMjQgPT09IDMpXG4gICAgICBtMjQgPSAtMTtcbiAgICB2YXIgdTE7XG4gICAgaWYgKChtMTQgJiAxKSA9PT0gMCkge1xuICAgICAgdTEgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBtOCA9IChrMS5hbmRsbig3KSArIGQxKSAmIDc7XG4gICAgICBpZiAoKG04ID09PSAzIHx8IG04ID09PSA1KSAmJiBtMjQgPT09IDIpXG4gICAgICAgIHUxID0gLW0xNDtcbiAgICAgIGVsc2VcbiAgICAgICAgdTEgPSBtMTQ7XG4gICAgfVxuICAgIGpzZlswXS5wdXNoKHUxKTtcblxuICAgIHZhciB1MjtcbiAgICBpZiAoKG0yNCAmIDEpID09PSAwKSB7XG4gICAgICB1MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG04ID0gKGsyLmFuZGxuKDcpICsgZDIpICYgNztcbiAgICAgIGlmICgobTggPT09IDMgfHwgbTggPT09IDUpICYmIG0xNCA9PT0gMilcbiAgICAgICAgdTIgPSAtbTI0O1xuICAgICAgZWxzZVxuICAgICAgICB1MiA9IG0yNDtcbiAgICB9XG4gICAganNmWzFdLnB1c2godTIpO1xuXG4gICAgLy8gU2Vjb25kIHBoYXNlXG4gICAgaWYgKDIgKiBkMSA9PT0gdTEgKyAxKVxuICAgICAgZDEgPSAxIC0gZDE7XG4gICAgaWYgKDIgKiBkMiA9PT0gdTIgKyAxKVxuICAgICAgZDIgPSAxIC0gZDI7XG4gICAgazEuaXVzaHJuKDEpO1xuICAgIGsyLml1c2hybigxKTtcbiAgfVxuXG4gIHJldHVybiBqc2Y7XG59XG51dGlscy5nZXRKU0YgPSBnZXRKU0Y7XG5cbmZ1bmN0aW9uIGNhY2hlZFByb3BlcnR5KG9iaiwgbmFtZSwgY29tcHV0ZXIpIHtcbiAgdmFyIGtleSA9ICdfJyArIG5hbWU7XG4gIG9iai5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiBjYWNoZWRQcm9wZXJ0eSgpIHtcbiAgICByZXR1cm4gdGhpc1trZXldICE9PSB1bmRlZmluZWQgPyB0aGlzW2tleV0gOlxuICAgICAgdGhpc1trZXldID0gY29tcHV0ZXIuY2FsbCh0aGlzKTtcbiAgfTtcbn1cbnV0aWxzLmNhY2hlZFByb3BlcnR5ID0gY2FjaGVkUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHBhcnNlQnl0ZXMoYnl0ZXMpIHtcbiAgcmV0dXJuIHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycgPyB1dGlscy50b0FycmF5KGJ5dGVzLCAnaGV4JykgOlxuICAgIGJ5dGVzO1xufVxudXRpbHMucGFyc2VCeXRlcyA9IHBhcnNlQnl0ZXM7XG5cbmZ1bmN0aW9uIGludEZyb21MRShieXRlcykge1xuICByZXR1cm4gbmV3IEJOKGJ5dGVzLCAnaGV4JywgJ2xlJyk7XG59XG51dGlscy5pbnRGcm9tTEUgPSBpbnRGcm9tTEU7XG59KTtcblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxudmFyIGdldE5BRiA9IHV0aWxzXzEkMS5nZXROQUY7XG52YXIgZ2V0SlNGID0gdXRpbHNfMSQxLmdldEpTRjtcbnZhciBhc3NlcnQkMSA9IHV0aWxzXzEkMS5hc3NlcnQ7XG5cbmZ1bmN0aW9uIEJhc2VDdXJ2ZSh0eXBlLCBjb25mKSB7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucCA9IG5ldyBCTihjb25mLnAsIDE2KTtcblxuICAvLyBVc2UgTW9udGdvbWVyeSwgd2hlbiB0aGVyZSBpcyBubyBmYXN0IHJlZHVjdGlvbiBmb3IgdGhlIHByaW1lXG4gIHRoaXMucmVkID0gY29uZi5wcmltZSA/IEJOLnJlZChjb25mLnByaW1lKSA6IEJOLm1vbnQodGhpcy5wKTtcblxuICAvLyBVc2VmdWwgZm9yIG1hbnkgY3VydmVzXG4gIHRoaXMuemVybyA9IG5ldyBCTigwKS50b1JlZCh0aGlzLnJlZCk7XG4gIHRoaXMub25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50d28gPSBuZXcgQk4oMikudG9SZWQodGhpcy5yZWQpO1xuXG4gIC8vIEN1cnZlIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsXG4gIHRoaXMubiA9IGNvbmYubiAmJiBuZXcgQk4oY29uZi5uLCAxNik7XG4gIHRoaXMuZyA9IGNvbmYuZyAmJiB0aGlzLnBvaW50RnJvbUpTT04oY29uZi5nLCBjb25mLmdSZWQpO1xuXG4gIC8vIFRlbXBvcmFyeSBhcnJheXNcbiAgdGhpcy5fd25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl93bmFmVDIgPSBuZXcgQXJyYXkoNCk7XG4gIHRoaXMuX3duYWZUMyA9IG5ldyBBcnJheSg0KTtcbiAgdGhpcy5fd25hZlQ0ID0gbmV3IEFycmF5KDQpO1xuXG4gIHRoaXMuX2JpdExlbmd0aCA9IHRoaXMubiA/IHRoaXMubi5iaXRMZW5ndGgoKSA6IDA7XG5cbiAgLy8gR2VuZXJhbGl6ZWQgR3JlZyBNYXh3ZWxsJ3MgdHJpY2tcbiAgdmFyIGFkanVzdENvdW50ID0gdGhpcy5uICYmIHRoaXMucC5kaXYodGhpcy5uKTtcbiAgaWYgKCFhZGp1c3RDb3VudCB8fCBhZGp1c3RDb3VudC5jbXBuKDEwMCkgPiAwKSB7XG4gICAgdGhpcy5yZWROID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9tYXh3ZWxsVHJpY2sgPSB0cnVlO1xuICAgIHRoaXMucmVkTiA9IHRoaXMubi50b1JlZCh0aGlzLnJlZCk7XG4gIH1cbn1cbnZhciBiYXNlID0gQmFzZUN1cnZlO1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnBvaW50ID0gZnVuY3Rpb24gcG9pbnQoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl9maXhlZE5hZk11bCA9IGZ1bmN0aW9uIF9maXhlZE5hZk11bChwLCBrKSB7XG4gIGFzc2VydCQxKHAucHJlY29tcHV0ZWQpO1xuICB2YXIgZG91YmxlcyA9IHAuX2dldERvdWJsZXMoKTtcblxuICB2YXIgbmFmID0gZ2V0TkFGKGssIDEsIHRoaXMuX2JpdExlbmd0aCk7XG4gIHZhciBJID0gKDEgPDwgKGRvdWJsZXMuc3RlcCArIDEpKSAtIChkb3VibGVzLnN0ZXAgJSAyID09PSAwID8gMiA6IDEpO1xuICBJIC89IDM7XG5cbiAgLy8gVHJhbnNsYXRlIGludG8gbW9yZSB3aW5kb3dlZCBmb3JtXG4gIHZhciByZXByID0gW107XG4gIHZhciBqO1xuICB2YXIgbmFmVztcbiAgZm9yIChqID0gMDsgaiA8IG5hZi5sZW5ndGg7IGogKz0gZG91Ymxlcy5zdGVwKSB7XG4gICAgbmFmVyA9IDA7XG4gICAgZm9yICh2YXIgbCA9IGogKyBkb3VibGVzLnN0ZXAgLSAxOyBsID49IGo7IGwtLSlcbiAgICAgIG5hZlcgPSAobmFmVyA8PCAxKSArIG5hZltsXTtcbiAgICByZXByLnB1c2gobmFmVyk7XG4gIH1cblxuICB2YXIgYSA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICB2YXIgYiA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gSTsgaSA+IDA7IGktLSkge1xuICAgIGZvciAoaiA9IDA7IGogPCByZXByLmxlbmd0aDsgaisrKSB7XG4gICAgICBuYWZXID0gcmVwcltqXTtcbiAgICAgIGlmIChuYWZXID09PSBpKVxuICAgICAgICBiID0gYi5taXhlZEFkZChkb3VibGVzLnBvaW50c1tqXSk7XG4gICAgICBlbHNlIGlmIChuYWZXID09PSAtaSlcbiAgICAgICAgYiA9IGIubWl4ZWRBZGQoZG91Ymxlcy5wb2ludHNbal0ubmVnKCkpO1xuICAgIH1cbiAgICBhID0gYS5hZGQoYik7XG4gIH1cbiAgcmV0dXJuIGEudG9QKCk7XG59O1xuXG5CYXNlQ3VydmUucHJvdG90eXBlLl93bmFmTXVsID0gZnVuY3Rpb24gX3duYWZNdWwocCwgaykge1xuICB2YXIgdyA9IDQ7XG5cbiAgLy8gUHJlY29tcHV0ZSB3aW5kb3dcbiAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyh3KTtcbiAgdyA9IG5hZlBvaW50cy53bmQ7XG4gIHZhciB3bmQgPSBuYWZQb2ludHMucG9pbnRzO1xuXG4gIC8vIEdldCBOQUYgZm9ybVxuICB2YXIgbmFmID0gZ2V0TkFGKGssIHcsIHRoaXMuX2JpdExlbmd0aCk7XG5cbiAgLy8gQWRkIGB0aGlzYCooTisxKSBmb3IgZXZlcnkgdy1OQUYgaW5kZXhcbiAgdmFyIGFjYyA9IHRoaXMuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuICBmb3IgKHZhciBpID0gbmFmLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgLy8gQ291bnQgemVyb2VzXG4gICAgZm9yICh2YXIgbCA9IDA7IGkgPj0gMCAmJiBuYWZbaV0gPT09IDA7IGktLSlcbiAgICAgIGwrKztcbiAgICBpZiAoaSA+PSAwKVxuICAgICAgbCsrO1xuICAgIGFjYyA9IGFjYy5kYmxwKGwpO1xuXG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG4gICAgdmFyIHogPSBuYWZbaV07XG4gICAgYXNzZXJ0JDEoeiAhPT0gMCk7XG4gICAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpIHtcbiAgICAgIC8vIEogKy0gUFxuICAgICAgaWYgKHogPiAwKVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQod25kWyh6IC0gMSkgPj4gMV0pO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MubWl4ZWRBZGQod25kWygteiAtIDEpID4+IDFdLm5lZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSiArLSBKXG4gICAgICBpZiAoeiA+IDApXG4gICAgICAgIGFjYyA9IGFjYy5hZGQod25kWyh6IC0gMSkgPj4gMV0pO1xuICAgICAgZWxzZVxuICAgICAgICBhY2MgPSBhY2MuYWRkKHduZFsoLXogLSAxKSA+PiAxXS5uZWcoKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwLnR5cGUgPT09ICdhZmZpbmUnID8gYWNjLnRvUCgpIDogYWNjO1xufTtcblxuQmFzZUN1cnZlLnByb3RvdHlwZS5fd25hZk11bEFkZCA9IGZ1bmN0aW9uIF93bmFmTXVsQWRkKGRlZlcsXG4gIHBvaW50cyxcbiAgY29lZmZzLFxuICBsZW4sXG4gIGphY29iaWFuUmVzdWx0KSB7XG4gIHZhciB3bmRXaWR0aCA9IHRoaXMuX3duYWZUMTtcbiAgdmFyIHduZCA9IHRoaXMuX3duYWZUMjtcbiAgdmFyIG5hZiA9IHRoaXMuX3duYWZUMztcblxuICAvLyBGaWxsIGFsbCBhcnJheXNcbiAgdmFyIG1heCA9IDA7XG4gIHZhciBpO1xuICB2YXIgajtcbiAgdmFyIHA7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHAgPSBwb2ludHNbaV07XG4gICAgdmFyIG5hZlBvaW50cyA9IHAuX2dldE5BRlBvaW50cyhkZWZXKTtcbiAgICB3bmRXaWR0aFtpXSA9IG5hZlBvaW50cy53bmQ7XG4gICAgd25kW2ldID0gbmFmUG9pbnRzLnBvaW50cztcbiAgfVxuXG4gIC8vIENvbWIgc21hbGwgd2luZG93IE5BRnNcbiAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAxOyBpIC09IDIpIHtcbiAgICB2YXIgYSA9IGkgLSAxO1xuICAgIHZhciBiID0gaTtcbiAgICBpZiAod25kV2lkdGhbYV0gIT09IDEgfHwgd25kV2lkdGhbYl0gIT09IDEpIHtcbiAgICAgIG5hZlthXSA9IGdldE5BRihjb2VmZnNbYV0sIHduZFdpZHRoW2FdLCB0aGlzLl9iaXRMZW5ndGgpO1xuICAgICAgbmFmW2JdID0gZ2V0TkFGKGNvZWZmc1tiXSwgd25kV2lkdGhbYl0sIHRoaXMuX2JpdExlbmd0aCk7XG4gICAgICBtYXggPSBNYXRoLm1heChuYWZbYV0ubGVuZ3RoLCBtYXgpO1xuICAgICAgbWF4ID0gTWF0aC5tYXgobmFmW2JdLmxlbmd0aCwgbWF4KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBjb21iID0gW1xuICAgICAgcG9pbnRzW2FdLCAvKiAxICovXG4gICAgICBudWxsLCAvKiAzICovXG4gICAgICBudWxsLCAvKiA1ICovXG4gICAgICBwb2ludHNbYl0sIC8qIDcgKi9cbiAgICBdO1xuXG4gICAgLy8gVHJ5IHRvIGF2b2lkIFByb2plY3RpdmUgcG9pbnRzLCBpZiBwb3NzaWJsZVxuICAgIGlmIChwb2ludHNbYV0ueS5jbXAocG9pbnRzW2JdLnkpID09PSAwKSB7XG4gICAgICBjb21iWzFdID0gcG9pbnRzW2FdLmFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH0gZWxzZSBpZiAocG9pbnRzW2FdLnkuY21wKHBvaW50c1tiXS55LnJlZE5lZygpKSA9PT0gMCkge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS5hZGQocG9pbnRzW2JdLm5lZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tYlsxXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0pO1xuICAgICAgY29tYlsyXSA9IHBvaW50c1thXS50b0ooKS5taXhlZEFkZChwb2ludHNbYl0ubmVnKCkpO1xuICAgIH1cblxuICAgIHZhciBpbmRleCA9IFtcbiAgICAgIC0zLCAvKiAtMSAtMSAqL1xuICAgICAgLTEsIC8qIC0xIDAgKi9cbiAgICAgIC01LCAvKiAtMSAxICovXG4gICAgICAtNywgLyogMCAtMSAqL1xuICAgICAgMCwgLyogMCAwICovXG4gICAgICA3LCAvKiAwIDEgKi9cbiAgICAgIDUsIC8qIDEgLTEgKi9cbiAgICAgIDEsIC8qIDEgMCAqL1xuICAgICAgMywgIC8qIDEgMSAqL1xuICAgIF07XG5cbiAgICB2YXIganNmID0gZ2V0SlNGKGNvZWZmc1thXSwgY29lZmZzW2JdKTtcbiAgICBtYXggPSBNYXRoLm1heChqc2ZbMF0ubGVuZ3RoLCBtYXgpO1xuICAgIG5hZlthXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIG5hZltiXSA9IG5ldyBBcnJheShtYXgpO1xuICAgIGZvciAoaiA9IDA7IGogPCBtYXg7IGorKykge1xuICAgICAgdmFyIGphID0ganNmWzBdW2pdIHwgMDtcbiAgICAgIHZhciBqYiA9IGpzZlsxXVtqXSB8IDA7XG5cbiAgICAgIG5hZlthXVtqXSA9IGluZGV4WyhqYSArIDEpICogMyArIChqYiArIDEpXTtcbiAgICAgIG5hZltiXVtqXSA9IDA7XG4gICAgICB3bmRbYV0gPSBjb21iO1xuICAgIH1cbiAgfVxuXG4gIHZhciBhY2MgPSB0aGlzLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgdmFyIHRtcCA9IHRoaXMuX3duYWZUNDtcbiAgZm9yIChpID0gbWF4OyBpID49IDA7IGktLSkge1xuICAgIHZhciBrID0gMDtcblxuICAgIHdoaWxlIChpID49IDApIHtcbiAgICAgIHZhciB6ZXJvID0gdHJ1ZTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykge1xuICAgICAgICB0bXBbal0gPSBuYWZbal1baV0gfCAwO1xuICAgICAgICBpZiAodG1wW2pdICE9PSAwKVxuICAgICAgICAgIHplcm8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghemVybylcbiAgICAgICAgYnJlYWs7XG4gICAgICBrKys7XG4gICAgICBpLS07XG4gICAgfVxuICAgIGlmIChpID49IDApXG4gICAgICBrKys7XG4gICAgYWNjID0gYWNjLmRibHAoayk7XG4gICAgaWYgKGkgPCAwKVxuICAgICAgYnJlYWs7XG5cbiAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgIHZhciB6ID0gdG1wW2pdO1xuICAgICAgcDtcbiAgICAgIGlmICh6ID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGVsc2UgaWYgKHogPiAwKVxuICAgICAgICBwID0gd25kW2pdWyh6IC0gMSkgPj4gMV07XG4gICAgICBlbHNlIGlmICh6IDwgMClcbiAgICAgICAgcCA9IHduZFtqXVsoLXogLSAxKSA+PiAxXS5uZWcoKTtcblxuICAgICAgaWYgKHAudHlwZSA9PT0gJ2FmZmluZScpXG4gICAgICAgIGFjYyA9IGFjYy5taXhlZEFkZChwKTtcbiAgICAgIGVsc2VcbiAgICAgICAgYWNjID0gYWNjLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgLy8gWmVyb2lmeSByZWZlcmVuY2VzXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICB3bmRbaV0gPSBudWxsO1xuXG4gIGlmIChqYWNvYmlhblJlc3VsdClcbiAgICByZXR1cm4gYWNjO1xuICBlbHNlXG4gICAgcmV0dXJuIGFjYy50b1AoKTtcbn07XG5cbmZ1bmN0aW9uIEJhc2VQb2ludChjdXJ2ZSwgdHlwZSkge1xuICB0aGlzLmN1cnZlID0gY3VydmU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMucHJlY29tcHV0ZWQgPSBudWxsO1xufVxuQmFzZUN1cnZlLkJhc2VQb2ludCA9IEJhc2VQb2ludDtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uIGVxKC8qb3RoZXIqLykge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS52YWxpZGF0ZSA9IGZ1bmN0aW9uIHZhbGlkYXRlKCkge1xuICByZXR1cm4gdGhpcy5jdXJ2ZS52YWxpZGF0ZSh0aGlzKTtcbn07XG5cbkJhc2VDdXJ2ZS5wcm90b3R5cGUuZGVjb2RlUG9pbnQgPSBmdW5jdGlvbiBkZWNvZGVQb2ludChieXRlcywgZW5jKSB7XG4gIGJ5dGVzID0gdXRpbHNfMSQxLnRvQXJyYXkoYnl0ZXMsIGVuYyk7XG5cbiAgdmFyIGxlbiA9IHRoaXMucC5ieXRlTGVuZ3RoKCk7XG5cbiAgLy8gdW5jb21wcmVzc2VkLCBoeWJyaWQtb2RkLCBoeWJyaWQtZXZlblxuICBpZiAoKGJ5dGVzWzBdID09PSAweDA0IHx8IGJ5dGVzWzBdID09PSAweDA2IHx8IGJ5dGVzWzBdID09PSAweDA3KSAmJlxuICAgICAgYnl0ZXMubGVuZ3RoIC0gMSA9PT0gMiAqIGxlbikge1xuICAgIGlmIChieXRlc1swXSA9PT0gMHgwNilcbiAgICAgIGFzc2VydCQxKGJ5dGVzW2J5dGVzLmxlbmd0aCAtIDFdICUgMiA9PT0gMCk7XG4gICAgZWxzZSBpZiAoYnl0ZXNbMF0gPT09IDB4MDcpXG4gICAgICBhc3NlcnQkMShieXRlc1tieXRlcy5sZW5ndGggLSAxXSAlIDIgPT09IDEpO1xuXG4gICAgdmFyIHJlcyA9ICB0aGlzLnBvaW50KGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLFxuICAgICAgYnl0ZXMuc2xpY2UoMSArIGxlbiwgMSArIDIgKiBsZW4pKTtcblxuICAgIHJldHVybiByZXM7XG4gIH0gZWxzZSBpZiAoKGJ5dGVzWzBdID09PSAweDAyIHx8IGJ5dGVzWzBdID09PSAweDAzKSAmJlxuICAgICAgICAgICAgICBieXRlcy5sZW5ndGggLSAxID09PSBsZW4pIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludEZyb21YKGJ5dGVzLnNsaWNlKDEsIDEgKyBsZW4pLCBieXRlc1swXSA9PT0gMHgwMyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHBvaW50IGZvcm1hdCcpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGVDb21wcmVzc2VkID0gZnVuY3Rpb24gZW5jb2RlQ29tcHJlc3NlZChlbmMpIHtcbiAgcmV0dXJuIHRoaXMuZW5jb2RlKGVuYywgdHJ1ZSk7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9lbmNvZGUgPSBmdW5jdGlvbiBfZW5jb2RlKGNvbXBhY3QpIHtcbiAgdmFyIGxlbiA9IHRoaXMuY3VydmUucC5ieXRlTGVuZ3RoKCk7XG4gIHZhciB4ID0gdGhpcy5nZXRYKCkudG9BcnJheSgnYmUnLCBsZW4pO1xuXG4gIGlmIChjb21wYWN0KVxuICAgIHJldHVybiBbIHRoaXMuZ2V0WSgpLmlzRXZlbigpID8gMHgwMiA6IDB4MDMgXS5jb25jYXQoeCk7XG5cbiAgcmV0dXJuIFsgMHgwNCBdLmNvbmNhdCh4LCB0aGlzLmdldFkoKS50b0FycmF5KCdiZScsIGxlbikpO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5lbmNvZGUgPSBmdW5jdGlvbiBlbmNvZGUoZW5jLCBjb21wYWN0KSB7XG4gIHJldHVybiB1dGlsc18xJDEuZW5jb2RlKHRoaXMuX2VuY29kZShjb21wYWN0KSwgZW5jKTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUucHJlY29tcHV0ZSA9IGZ1bmN0aW9uIHByZWNvbXB1dGUocG93ZXIpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIHByZWNvbXB1dGVkID0ge1xuICAgIGRvdWJsZXM6IG51bGwsXG4gICAgbmFmOiBudWxsLFxuICAgIGJldGE6IG51bGwsXG4gIH07XG4gIHByZWNvbXB1dGVkLm5hZiA9IHRoaXMuX2dldE5BRlBvaW50cyg4KTtcbiAgcHJlY29tcHV0ZWQuZG91YmxlcyA9IHRoaXMuX2dldERvdWJsZXMoNCwgcG93ZXIpO1xuICBwcmVjb21wdXRlZC5iZXRhID0gdGhpcy5fZ2V0QmV0YSgpO1xuICB0aGlzLnByZWNvbXB1dGVkID0gcHJlY29tcHV0ZWQ7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLl9oYXNEb3VibGVzID0gZnVuY3Rpb24gX2hhc0RvdWJsZXMoaykge1xuICBpZiAoIXRoaXMucHJlY29tcHV0ZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBkb3VibGVzID0gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO1xuICBpZiAoIWRvdWJsZXMpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiBkb3VibGVzLnBvaW50cy5sZW5ndGggPj0gTWF0aC5jZWlsKChrLmJpdExlbmd0aCgpICsgMSkgLyBkb3VibGVzLnN0ZXApO1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0RG91YmxlcyA9IGZ1bmN0aW9uIF9nZXREb3VibGVzKHN0ZXAsIHBvd2VyKSB7XG4gIGlmICh0aGlzLnByZWNvbXB1dGVkICYmIHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcylcbiAgICByZXR1cm4gdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzO1xuXG4gIHZhciBkb3VibGVzID0gWyB0aGlzIF07XG4gIHZhciBhY2MgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHBvd2VyOyBpICs9IHN0ZXApIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN0ZXA7IGorKylcbiAgICAgIGFjYyA9IGFjYy5kYmwoKTtcbiAgICBkb3VibGVzLnB1c2goYWNjKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXA6IHN0ZXAsXG4gICAgcG9pbnRzOiBkb3VibGVzLFxuICB9O1xufTtcblxuQmFzZVBvaW50LnByb3RvdHlwZS5fZ2V0TkFGUG9pbnRzID0gZnVuY3Rpb24gX2dldE5BRlBvaW50cyh3bmQpIHtcbiAgaWYgKHRoaXMucHJlY29tcHV0ZWQgJiYgdGhpcy5wcmVjb21wdXRlZC5uYWYpXG4gICAgcmV0dXJuIHRoaXMucHJlY29tcHV0ZWQubmFmO1xuXG4gIHZhciByZXMgPSBbIHRoaXMgXTtcbiAgdmFyIG1heCA9ICgxIDw8IHduZCkgLSAxO1xuICB2YXIgZGJsID0gbWF4ID09PSAxID8gbnVsbCA6IHRoaXMuZGJsKCk7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgbWF4OyBpKyspXG4gICAgcmVzW2ldID0gcmVzW2kgLSAxXS5hZGQoZGJsKTtcbiAgcmV0dXJuIHtcbiAgICB3bmQ6IHduZCxcbiAgICBwb2ludHM6IHJlcyxcbiAgfTtcbn07XG5cbkJhc2VQb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgcmV0dXJuIG51bGw7XG59O1xuXG5CYXNlUG9pbnQucHJvdG90eXBlLmRibHAgPSBmdW5jdGlvbiBkYmxwKGspIHtcbiAgdmFyIHIgPSB0aGlzO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGs7IGkrKylcbiAgICByID0gci5kYmwoKTtcbiAgcmV0dXJuIHI7XG59O1xuXG52YXIgaW5oZXJpdHNfYnJvd3NlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGlmIChzdXBlckN0b3IpIHtcbiAgICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yO1xuICAgICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogY3RvcixcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9O1xuICAgICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gICAgfVxuICB9O1xufVxufSk7XG5cbid1c2Ugc3RyaWN0JztcblxuXG5cblxuXG5cbnZhciBhc3NlcnQkMiA9IHV0aWxzXzEkMS5hc3NlcnQ7XG5cbmZ1bmN0aW9uIFNob3J0Q3VydmUoY29uZikge1xuICBiYXNlLmNhbGwodGhpcywgJ3Nob3J0JywgY29uZik7XG5cbiAgdGhpcy5hID0gbmV3IEJOKGNvbmYuYSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy5iID0gbmV3IEJOKGNvbmYuYiwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgdGhpcy50aW52ID0gdGhpcy50d28ucmVkSW52bSgpO1xuXG4gIHRoaXMuemVyb0EgPSB0aGlzLmEuZnJvbVJlZCgpLmNtcG4oMCkgPT09IDA7XG4gIHRoaXMudGhyZWVBID0gdGhpcy5hLmZyb21SZWQoKS5zdWIodGhpcy5wKS5jbXBuKC0zKSA9PT0gMDtcblxuICAvLyBJZiB0aGUgY3VydmUgaXMgZW5kb21vcnBoaWMsIHByZWNhbGN1bGF0ZSBiZXRhIGFuZCBsYW1iZGFcbiAgdGhpcy5lbmRvID0gdGhpcy5fZ2V0RW5kb21vcnBoaXNtKGNvbmYpO1xuICB0aGlzLl9lbmRvV25hZlQxID0gbmV3IEFycmF5KDQpO1xuICB0aGlzLl9lbmRvV25hZlQyID0gbmV3IEFycmF5KDQpO1xufVxuaW5oZXJpdHNfYnJvd3NlcihTaG9ydEN1cnZlLCBiYXNlKTtcbnZhciBzaG9ydF8xID0gU2hvcnRDdXJ2ZTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9tb3JwaGlzbSA9IGZ1bmN0aW9uIF9nZXRFbmRvbW9ycGhpc20oY29uZikge1xuICAvLyBObyBlZmZpY2llbnQgZW5kb21vcnBoaXNtXG4gIGlmICghdGhpcy56ZXJvQSB8fCAhdGhpcy5nIHx8ICF0aGlzLm4gfHwgdGhpcy5wLm1vZG4oMykgIT09IDEpXG4gICAgcmV0dXJuO1xuXG4gIC8vIENvbXB1dGUgYmV0YSBhbmQgbGFtYmRhLCB0aGF0IGxhbWJkYSAqIFAgPSAoYmV0YSAqIFB4OyBQeSlcbiAgdmFyIGJldGE7XG4gIHZhciBsYW1iZGE7XG4gIGlmIChjb25mLmJldGEpIHtcbiAgICBiZXRhID0gbmV3IEJOKGNvbmYuYmV0YSwgMTYpLnRvUmVkKHRoaXMucmVkKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgYmV0YXMgPSB0aGlzLl9nZXRFbmRvUm9vdHModGhpcy5wKTtcbiAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXN0IGJldGFcbiAgICBiZXRhID0gYmV0YXNbMF0uY21wKGJldGFzWzFdKSA8IDAgPyBiZXRhc1swXSA6IGJldGFzWzFdO1xuICAgIGJldGEgPSBiZXRhLnRvUmVkKHRoaXMucmVkKTtcbiAgfVxuICBpZiAoY29uZi5sYW1iZGEpIHtcbiAgICBsYW1iZGEgPSBuZXcgQk4oY29uZi5sYW1iZGEsIDE2KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBDaG9vc2UgdGhlIGxhbWJkYSB0aGF0IGlzIG1hdGNoaW5nIHNlbGVjdGVkIGJldGFcbiAgICB2YXIgbGFtYmRhcyA9IHRoaXMuX2dldEVuZG9Sb290cyh0aGlzLm4pO1xuICAgIGlmICh0aGlzLmcubXVsKGxhbWJkYXNbMF0pLnguY21wKHRoaXMuZy54LnJlZE11bChiZXRhKSkgPT09IDApIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxhbWJkYSA9IGxhbWJkYXNbMV07XG4gICAgICBhc3NlcnQkMih0aGlzLmcubXVsKGxhbWJkYSkueC5jbXAodGhpcy5nLngucmVkTXVsKGJldGEpKSA9PT0gMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IGJhc2lzIHZlY3RvcnMsIHVzZWQgZm9yIGJhbGFuY2VkIGxlbmd0aC10d28gcmVwcmVzZW50YXRpb25cbiAgdmFyIGJhc2lzO1xuICBpZiAoY29uZi5iYXNpcykge1xuICAgIGJhc2lzID0gY29uZi5iYXNpcy5tYXAoZnVuY3Rpb24odmVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiBuZXcgQk4odmVjLmEsIDE2KSxcbiAgICAgICAgYjogbmV3IEJOKHZlYy5iLCAxNiksXG4gICAgICB9O1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJhc2lzID0gdGhpcy5fZ2V0RW5kb0Jhc2lzKGxhbWJkYSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJldGE6IGJldGEsXG4gICAgbGFtYmRhOiBsYW1iZGEsXG4gICAgYmFzaXM6IGJhc2lzLFxuICB9O1xufTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuX2dldEVuZG9Sb290cyA9IGZ1bmN0aW9uIF9nZXRFbmRvUm9vdHMobnVtKSB7XG4gIC8vIEZpbmQgcm9vdHMgb2YgZm9yIHheMiArIHggKyAxIGluIEZcbiAgLy8gUm9vdCA9ICgtMSArLSBTcXJ0KC0zKSkgLyAyXG4gIC8vXG4gIHZhciByZWQgPSBudW0gPT09IHRoaXMucCA/IHRoaXMucmVkIDogQk4ubW9udChudW0pO1xuICB2YXIgdGludiA9IG5ldyBCTigyKS50b1JlZChyZWQpLnJlZEludm0oKTtcbiAgdmFyIG50aW52ID0gdGludi5yZWROZWcoKTtcblxuICB2YXIgcyA9IG5ldyBCTigzKS50b1JlZChyZWQpLnJlZE5lZygpLnJlZFNxcnQoKS5yZWRNdWwodGludik7XG5cbiAgdmFyIGwxID0gbnRpbnYucmVkQWRkKHMpLmZyb21SZWQoKTtcbiAgdmFyIGwyID0gbnRpbnYucmVkU3ViKHMpLmZyb21SZWQoKTtcbiAgcmV0dXJuIFsgbDEsIGwyIF07XG59O1xuXG5TaG9ydEN1cnZlLnByb3RvdHlwZS5fZ2V0RW5kb0Jhc2lzID0gZnVuY3Rpb24gX2dldEVuZG9CYXNpcyhsYW1iZGEpIHtcbiAgLy8gYXByeFNxcnQgPj0gc3FydCh0aGlzLm4pXG4gIHZhciBhcHJ4U3FydCA9IHRoaXMubi51c2hybihNYXRoLmZsb29yKHRoaXMubi5iaXRMZW5ndGgoKSAvIDIpKTtcblxuICAvLyAzLjc0XG4gIC8vIFJ1biBFR0NELCB1bnRpbCByKEwgKyAxKSA8IGFwcnhTcXJ0XG4gIHZhciB1ID0gbGFtYmRhO1xuICB2YXIgdiA9IHRoaXMubi5jbG9uZSgpO1xuICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gIHZhciB5MSA9IG5ldyBCTigwKTtcbiAgdmFyIHgyID0gbmV3IEJOKDApO1xuICB2YXIgeTIgPSBuZXcgQk4oMSk7XG5cbiAgLy8gTk9URTogYWxsIHZlY3RvcnMgYXJlIHJvb3RzIG9mOiBhICsgYiAqIGxhbWJkYSA9IDAgKG1vZCBuKVxuICB2YXIgYTA7XG4gIHZhciBiMDtcbiAgLy8gRmlyc3QgdmVjdG9yXG4gIHZhciBhMTtcbiAgdmFyIGIxO1xuICAvLyBTZWNvbmQgdmVjdG9yXG4gIHZhciBhMjtcbiAgdmFyIGIyO1xuXG4gIHZhciBwcmV2UjtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcjtcbiAgdmFyIHg7XG4gIHdoaWxlICh1LmNtcG4oMCkgIT09IDApIHtcbiAgICB2YXIgcSA9IHYuZGl2KHUpO1xuICAgIHIgPSB2LnN1YihxLm11bCh1KSk7XG4gICAgeCA9IHgyLnN1YihxLm11bCh4MSkpO1xuICAgIHZhciB5ID0geTIuc3ViKHEubXVsKHkxKSk7XG5cbiAgICBpZiAoIWExICYmIHIuY21wKGFwcnhTcXJ0KSA8IDApIHtcbiAgICAgIGEwID0gcHJldlIubmVnKCk7XG4gICAgICBiMCA9IHgxO1xuICAgICAgYTEgPSByLm5lZygpO1xuICAgICAgYjEgPSB4O1xuICAgIH0gZWxzZSBpZiAoYTEgJiYgKytpID09PSAyKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcHJldlIgPSByO1xuXG4gICAgdiA9IHU7XG4gICAgdSA9IHI7XG4gICAgeDIgPSB4MTtcbiAgICB4MSA9IHg7XG4gICAgeTIgPSB5MTtcbiAgICB5MSA9IHk7XG4gIH1cbiAgYTIgPSByLm5lZygpO1xuICBiMiA9IHg7XG5cbiAgdmFyIGxlbjEgPSBhMS5zcXIoKS5hZGQoYjEuc3FyKCkpO1xuICB2YXIgbGVuMiA9IGEyLnNxcigpLmFkZChiMi5zcXIoKSk7XG4gIGlmIChsZW4yLmNtcChsZW4xKSA+PSAwKSB7XG4gICAgYTIgPSBhMDtcbiAgICBiMiA9IGIwO1xuICB9XG5cbiAgLy8gTm9ybWFsaXplIHNpZ25zXG4gIGlmIChhMS5uZWdhdGl2ZSkge1xuICAgIGExID0gYTEubmVnKCk7XG4gICAgYjEgPSBiMS5uZWcoKTtcbiAgfVxuICBpZiAoYTIubmVnYXRpdmUpIHtcbiAgICBhMiA9IGEyLm5lZygpO1xuICAgIGIyID0gYjIubmVnKCk7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgYTogYTEsIGI6IGIxIH0sXG4gICAgeyBhOiBhMiwgYjogYjIgfSxcbiAgXTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvU3BsaXQgPSBmdW5jdGlvbiBfZW5kb1NwbGl0KGspIHtcbiAgdmFyIGJhc2lzID0gdGhpcy5lbmRvLmJhc2lzO1xuICB2YXIgdjEgPSBiYXNpc1swXTtcbiAgdmFyIHYyID0gYmFzaXNbMV07XG5cbiAgdmFyIGMxID0gdjIuYi5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcbiAgdmFyIGMyID0gdjEuYi5uZWcoKS5tdWwoaykuZGl2Um91bmQodGhpcy5uKTtcblxuICB2YXIgcDEgPSBjMS5tdWwodjEuYSk7XG4gIHZhciBwMiA9IGMyLm11bCh2Mi5hKTtcbiAgdmFyIHExID0gYzEubXVsKHYxLmIpO1xuICB2YXIgcTIgPSBjMi5tdWwodjIuYik7XG5cbiAgLy8gQ2FsY3VsYXRlIGFuc3dlclxuICB2YXIgazEgPSBrLnN1YihwMSkuc3ViKHAyKTtcbiAgdmFyIGsyID0gcTEuYWRkKHEyKS5uZWcoKTtcbiAgcmV0dXJuIHsgazE6IGsxLCBrMjogazIgfTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbVggPSBmdW5jdGlvbiBwb2ludEZyb21YKHgsIG9kZCkge1xuICB4ID0gbmV3IEJOKHgsIDE2KTtcbiAgaWYgKCF4LnJlZClcbiAgICB4ID0geC50b1JlZCh0aGlzLnJlZCk7XG5cbiAgdmFyIHkyID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZCh4LnJlZE11bCh0aGlzLmEpKS5yZWRJQWRkKHRoaXMuYik7XG4gIHZhciB5ID0geTIucmVkU3FydCgpO1xuICBpZiAoeS5yZWRTcXIoKS5yZWRTdWIoeTIpLmNtcCh0aGlzLnplcm8pICE9PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCcpO1xuXG4gIC8vIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIHRlbGwgaWYgdGhlIG51bWJlciBpcyBvZGQgd2l0aG91dCBjb252ZXJ0aW5nIGl0XG4gIC8vIHRvIG5vbi1yZWQgZm9ybT9cbiAgdmFyIGlzT2RkID0geS5mcm9tUmVkKCkuaXNPZGQoKTtcbiAgaWYgKG9kZCAmJiAhaXNPZGQgfHwgIW9kZCAmJiBpc09kZClcbiAgICB5ID0geS5yZWROZWcoKTtcblxuICByZXR1cm4gdGhpcy5wb2ludCh4LCB5KTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocG9pbnQpIHtcbiAgaWYgKHBvaW50LmluZilcbiAgICByZXR1cm4gdHJ1ZTtcblxuICB2YXIgeCA9IHBvaW50Lng7XG4gIHZhciB5ID0gcG9pbnQueTtcblxuICB2YXIgYXggPSB0aGlzLmEucmVkTXVsKHgpO1xuICB2YXIgcmhzID0geC5yZWRTcXIoKS5yZWRNdWwoeCkucmVkSUFkZChheCkucmVkSUFkZCh0aGlzLmIpO1xuICByZXR1cm4geS5yZWRTcXIoKS5yZWRJU3ViKHJocykuY21wbigwKSA9PT0gMDtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLl9lbmRvV25hZk11bEFkZCA9XG4gICAgZnVuY3Rpb24gX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzLCBqYWNvYmlhblJlc3VsdCkge1xuICAgICAgdmFyIG5wb2ludHMgPSB0aGlzLl9lbmRvV25hZlQxO1xuICAgICAgdmFyIG5jb2VmZnMgPSB0aGlzLl9lbmRvV25hZlQyO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gdGhpcy5fZW5kb1NwbGl0KGNvZWZmc1tpXSk7XG4gICAgICAgIHZhciBwID0gcG9pbnRzW2ldO1xuICAgICAgICB2YXIgYmV0YSA9IHAuX2dldEJldGEoKTtcblxuICAgICAgICBpZiAoc3BsaXQuazEubmVnYXRpdmUpIHtcbiAgICAgICAgICBzcGxpdC5rMS5pbmVnKCk7XG4gICAgICAgICAgcCA9IHAubmVnKHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGxpdC5rMi5uZWdhdGl2ZSkge1xuICAgICAgICAgIHNwbGl0LmsyLmluZWcoKTtcbiAgICAgICAgICBiZXRhID0gYmV0YS5uZWcodHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBucG9pbnRzW2kgKiAyXSA9IHA7XG4gICAgICAgIG5wb2ludHNbaSAqIDIgKyAxXSA9IGJldGE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDJdID0gc3BsaXQuazE7XG4gICAgICAgIG5jb2VmZnNbaSAqIDIgKyAxXSA9IHNwbGl0LmsyO1xuICAgICAgfVxuICAgICAgdmFyIHJlcyA9IHRoaXMuX3duYWZNdWxBZGQoMSwgbnBvaW50cywgbmNvZWZmcywgaSAqIDIsIGphY29iaWFuUmVzdWx0KTtcblxuICAgICAgLy8gQ2xlYW4tdXAgcmVmZXJlbmNlcyB0byBwb2ludHMgYW5kIGNvZWZmaWNpZW50c1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpICogMjsgaisrKSB7XG4gICAgICAgIG5wb2ludHNbal0gPSBudWxsO1xuICAgICAgICBuY29lZmZzW2pdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuZnVuY3Rpb24gUG9pbnQoY3VydmUsIHgsIHksIGlzUmVkKSB7XG4gIGJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdhZmZpbmUnKTtcbiAgaWYgKHggPT09IG51bGwgJiYgeSA9PT0gbnVsbCkge1xuICAgIHRoaXMueCA9IG51bGw7XG4gICAgdGhpcy55ID0gbnVsbDtcbiAgICB0aGlzLmluZiA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIC8vIEZvcmNlIHJlZGdvbWVyeSByZXByZXNlbnRhdGlvbiB3aGVuIGxvYWRpbmcgZnJvbSBKU09OXG4gICAgaWYgKGlzUmVkKSB7XG4gICAgICB0aGlzLnguZm9yY2VSZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgICAgdGhpcy55LmZvcmNlUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLngucmVkKVxuICAgICAgdGhpcy54ID0gdGhpcy54LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcbiAgICBpZiAoIXRoaXMueS5yZWQpXG4gICAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICAgIHRoaXMuaW5mID0gZmFsc2U7XG4gIH1cbn1cbmluaGVyaXRzX2Jyb3dzZXIoUG9pbnQsIGJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUucG9pbnQgPSBmdW5jdGlvbiBwb2ludCh4LCB5LCBpc1JlZCkge1xuICByZXR1cm4gbmV3IFBvaW50KHRoaXMsIHgsIHksIGlzUmVkKTtcbn07XG5cblNob3J0Q3VydmUucHJvdG90eXBlLnBvaW50RnJvbUpTT04gPSBmdW5jdGlvbiBwb2ludEZyb21KU09OKG9iaiwgcmVkKSB7XG4gIHJldHVybiBQb2ludC5mcm9tSlNPTih0aGlzLCBvYmosIHJlZCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuX2dldEJldGEgPSBmdW5jdGlvbiBfZ2V0QmV0YSgpIHtcbiAgaWYgKCF0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuO1xuXG4gIHZhciBwcmUgPSB0aGlzLnByZWNvbXB1dGVkO1xuICBpZiAocHJlICYmIHByZS5iZXRhKVxuICAgIHJldHVybiBwcmUuYmV0YTtcblxuICB2YXIgYmV0YSA9IHRoaXMuY3VydmUucG9pbnQodGhpcy54LnJlZE11bCh0aGlzLmN1cnZlLmVuZG8uYmV0YSksIHRoaXMueSk7XG4gIGlmIChwcmUpIHtcbiAgICB2YXIgY3VydmUgPSB0aGlzLmN1cnZlO1xuICAgIHZhciBlbmRvTXVsID0gZnVuY3Rpb24ocCkge1xuICAgICAgcmV0dXJuIGN1cnZlLnBvaW50KHAueC5yZWRNdWwoY3VydmUuZW5kby5iZXRhKSwgcC55KTtcbiAgICB9O1xuICAgIHByZS5iZXRhID0gYmV0YTtcbiAgICBiZXRhLnByZWNvbXB1dGVkID0ge1xuICAgICAgYmV0YTogbnVsbCxcbiAgICAgIG5hZjogcHJlLm5hZiAmJiB7XG4gICAgICAgIHduZDogcHJlLm5hZi53bmQsXG4gICAgICAgIHBvaW50czogcHJlLm5hZi5wb2ludHMubWFwKGVuZG9NdWwpLFxuICAgICAgfSxcbiAgICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgICAgc3RlcDogcHJlLmRvdWJsZXMuc3RlcCxcbiAgICAgICAgcG9pbnRzOiBwcmUuZG91Ymxlcy5wb2ludHMubWFwKGVuZG9NdWwpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiBiZXRhO1xufTtcblxuUG9pbnQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgaWYgKCF0aGlzLnByZWNvbXB1dGVkKVxuICAgIHJldHVybiBbIHRoaXMueCwgdGhpcy55IF07XG5cbiAgcmV0dXJuIFsgdGhpcy54LCB0aGlzLnksIHRoaXMucHJlY29tcHV0ZWQgJiYge1xuICAgIGRvdWJsZXM6IHRoaXMucHJlY29tcHV0ZWQuZG91YmxlcyAmJiB7XG4gICAgICBzdGVwOiB0aGlzLnByZWNvbXB1dGVkLmRvdWJsZXMuc3RlcCxcbiAgICAgIHBvaW50czogdGhpcy5wcmVjb21wdXRlZC5kb3VibGVzLnBvaW50cy5zbGljZSgxKSxcbiAgICB9LFxuICAgIG5hZjogdGhpcy5wcmVjb21wdXRlZC5uYWYgJiYge1xuICAgICAgd25kOiB0aGlzLnByZWNvbXB1dGVkLm5hZi53bmQsXG4gICAgICBwb2ludHM6IHRoaXMucHJlY29tcHV0ZWQubmFmLnBvaW50cy5zbGljZSgxKSxcbiAgICB9LFxuICB9IF07XG59O1xuXG5Qb2ludC5mcm9tSlNPTiA9IGZ1bmN0aW9uIGZyb21KU09OKGN1cnZlLCBvYmosIHJlZCkge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpXG4gICAgb2JqID0gSlNPTi5wYXJzZShvYmopO1xuICB2YXIgcmVzID0gY3VydmUucG9pbnQob2JqWzBdLCBvYmpbMV0sIHJlZCk7XG4gIGlmICghb2JqWzJdKVxuICAgIHJldHVybiByZXM7XG5cbiAgZnVuY3Rpb24gb2JqMnBvaW50KG9iaikge1xuICAgIHJldHVybiBjdXJ2ZS5wb2ludChvYmpbMF0sIG9ialsxXSwgcmVkKTtcbiAgfVxuXG4gIHZhciBwcmUgPSBvYmpbMl07XG4gIHJlcy5wcmVjb21wdXRlZCA9IHtcbiAgICBiZXRhOiBudWxsLFxuICAgIGRvdWJsZXM6IHByZS5kb3VibGVzICYmIHtcbiAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICBwb2ludHM6IFsgcmVzIF0uY29uY2F0KHByZS5kb3VibGVzLnBvaW50cy5tYXAob2JqMnBvaW50KSksXG4gICAgfSxcbiAgICBuYWY6IHByZS5uYWYgJiYge1xuICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgIHBvaW50czogWyByZXMgXS5jb25jYXQocHJlLm5hZi5wb2ludHMubWFwKG9iajJwb2ludCkpLFxuICAgIH0sXG4gIH07XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gJzxFQyBQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBQb2ludCB4OiAnICsgdGhpcy54LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LmZyb21SZWQoKS50b1N0cmluZygxNiwgMikgKyAnPic7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuaXNJbmZpbml0eSA9IGZ1bmN0aW9uIGlzSW5maW5pdHkoKSB7XG4gIHJldHVybiB0aGlzLmluZjtcbn07XG5cblBvaW50LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQocCkge1xuICAvLyBPICsgUCA9IFBcbiAgaWYgKHRoaXMuaW5mKVxuICAgIHJldHVybiBwO1xuXG4gIC8vIFAgKyBPID0gUFxuICBpZiAocC5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gUCArIFAgPSAyUFxuICBpZiAodGhpcy5lcShwKSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKTtcblxuICAvLyBQICsgKC1QKSA9IE9cbiAgaWYgKHRoaXMubmVnKCkuZXEocCkpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgLy8gUCArIFEgPSBPXG4gIGlmICh0aGlzLnguY21wKHAueCkgPT09IDApXG4gICAgcmV0dXJuIHRoaXMuY3VydmUucG9pbnQobnVsbCwgbnVsbCk7XG5cbiAgdmFyIGMgPSB0aGlzLnkucmVkU3ViKHAueSk7XG4gIGlmIChjLmNtcG4oMCkgIT09IDApXG4gICAgYyA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIocC54KS5yZWRJbnZtKCkpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodGhpcy54KS5yZWRJU3ViKHAueCk7XG4gIHZhciBueSA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIobngpKS5yZWRJU3ViKHRoaXMueSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZGJsID0gZnVuY3Rpb24gZGJsKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gMlAgPSBPXG4gIHZhciB5czEgPSB0aGlzLnkucmVkQWRkKHRoaXMueSk7XG4gIGlmICh5czEuY21wbigwKSA9PT0gMClcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChudWxsLCBudWxsKTtcblxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcblxuICB2YXIgeDIgPSB0aGlzLngucmVkU3FyKCk7XG4gIHZhciBkeWludiA9IHlzMS5yZWRJbnZtKCk7XG4gIHZhciBjID0geDIucmVkQWRkKHgyKS5yZWRJQWRkKHgyKS5yZWRJQWRkKGEpLnJlZE11bChkeWludik7XG5cbiAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHRoaXMueC5yZWRBZGQodGhpcy54KSk7XG4gIHZhciBueSA9IGMucmVkTXVsKHRoaXMueC5yZWRTdWIobngpKS5yZWRJU3ViKHRoaXMueSk7XG4gIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG54LCBueSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZ2V0WCA9IGZ1bmN0aW9uIGdldFgoKSB7XG4gIHJldHVybiB0aGlzLnguZnJvbVJlZCgpO1xufTtcblxuUG9pbnQucHJvdG90eXBlLmdldFkgPSBmdW5jdGlvbiBnZXRZKCkge1xuICByZXR1cm4gdGhpcy55LmZyb21SZWQoKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwoaykge1xuICBrID0gbmV3IEJOKGssIDE2KTtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuICBlbHNlIGlmICh0aGlzLl9oYXNEb3VibGVzKGspKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9maXhlZE5hZk11bCh0aGlzLCBrKTtcbiAgZWxzZSBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChbIHRoaXMgXSwgWyBrIF0pO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX3duYWZNdWwodGhpcywgayk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubXVsQWRkID0gZnVuY3Rpb24gbXVsQWRkKGsxLCBwMiwgazIpIHtcbiAgdmFyIHBvaW50cyA9IFsgdGhpcywgcDIgXTtcbiAgdmFyIGNvZWZmcyA9IFsgazEsIGsyIF07XG4gIGlmICh0aGlzLmN1cnZlLmVuZG8pXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuX2VuZG9XbmFmTXVsQWRkKHBvaW50cywgY29lZmZzKTtcbiAgZWxzZVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl93bmFmTXVsQWRkKDEsIHBvaW50cywgY29lZmZzLCAyKTtcbn07XG5cblBvaW50LnByb3RvdHlwZS5qbXVsQWRkID0gZnVuY3Rpb24gam11bEFkZChrMSwgcDIsIGsyKSB7XG4gIHZhciBwb2ludHMgPSBbIHRoaXMsIHAyIF07XG4gIHZhciBjb2VmZnMgPSBbIGsxLCBrMiBdO1xuICBpZiAodGhpcy5jdXJ2ZS5lbmRvKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLl9lbmRvV25hZk11bEFkZChwb2ludHMsIGNvZWZmcywgdHJ1ZSk7XG4gIGVsc2VcbiAgICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bEFkZCgxLCBwb2ludHMsIGNvZWZmcywgMiwgdHJ1ZSk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIHJldHVybiB0aGlzID09PSBwIHx8XG4gICAgICAgICB0aGlzLmluZiA9PT0gcC5pbmYgJiZcbiAgICAgICAgICAgICAodGhpcy5pbmYgfHwgdGhpcy54LmNtcChwLngpID09PSAwICYmIHRoaXMueS5jbXAocC55KSA9PT0gMCk7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnKF9wcmVjb21wdXRlKSB7XG4gIGlmICh0aGlzLmluZilcbiAgICByZXR1cm4gdGhpcztcblxuICB2YXIgcmVzID0gdGhpcy5jdXJ2ZS5wb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSk7XG4gIGlmIChfcHJlY29tcHV0ZSAmJiB0aGlzLnByZWNvbXB1dGVkKSB7XG4gICAgdmFyIHByZSA9IHRoaXMucHJlY29tcHV0ZWQ7XG4gICAgdmFyIG5lZ2F0ZSA9IGZ1bmN0aW9uKHApIHtcbiAgICAgIHJldHVybiBwLm5lZygpO1xuICAgIH07XG4gICAgcmVzLnByZWNvbXB1dGVkID0ge1xuICAgICAgbmFmOiBwcmUubmFmICYmIHtcbiAgICAgICAgd25kOiBwcmUubmFmLnduZCxcbiAgICAgICAgcG9pbnRzOiBwcmUubmFmLnBvaW50cy5tYXAobmVnYXRlKSxcbiAgICAgIH0sXG4gICAgICBkb3VibGVzOiBwcmUuZG91YmxlcyAmJiB7XG4gICAgICAgIHN0ZXA6IHByZS5kb3VibGVzLnN0ZXAsXG4gICAgICAgIHBvaW50czogcHJlLmRvdWJsZXMucG9pbnRzLm1hcChuZWdhdGUpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuXG5Qb2ludC5wcm90b3R5cGUudG9KID0gZnVuY3Rpb24gdG9KKCkge1xuICBpZiAodGhpcy5pbmYpXG4gICAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG51bGwsIG51bGwsIG51bGwpO1xuXG4gIHZhciByZXMgPSB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueSwgdGhpcy5jdXJ2ZS5vbmUpO1xuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gSlBvaW50KGN1cnZlLCB4LCB5LCB6KSB7XG4gIGJhc2UuQmFzZVBvaW50LmNhbGwodGhpcywgY3VydmUsICdqYWNvYmlhbicpO1xuICBpZiAoeCA9PT0gbnVsbCAmJiB5ID09PSBudWxsICYmIHogPT09IG51bGwpIHtcbiAgICB0aGlzLnggPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnkgPSB0aGlzLmN1cnZlLm9uZTtcbiAgICB0aGlzLnogPSBuZXcgQk4oMCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy54ID0gbmV3IEJOKHgsIDE2KTtcbiAgICB0aGlzLnkgPSBuZXcgQk4oeSwgMTYpO1xuICAgIHRoaXMueiA9IG5ldyBCTih6LCAxNik7XG4gIH1cbiAgaWYgKCF0aGlzLngucmVkKVxuICAgIHRoaXMueCA9IHRoaXMueC50b1JlZCh0aGlzLmN1cnZlLnJlZCk7XG4gIGlmICghdGhpcy55LnJlZClcbiAgICB0aGlzLnkgPSB0aGlzLnkudG9SZWQodGhpcy5jdXJ2ZS5yZWQpO1xuICBpZiAoIXRoaXMuei5yZWQpXG4gICAgdGhpcy56ID0gdGhpcy56LnRvUmVkKHRoaXMuY3VydmUucmVkKTtcblxuICB0aGlzLnpPbmUgPSB0aGlzLnogPT09IHRoaXMuY3VydmUub25lO1xufVxuaW5oZXJpdHNfYnJvd3NlcihKUG9pbnQsIGJhc2UuQmFzZVBvaW50KTtcblxuU2hvcnRDdXJ2ZS5wcm90b3R5cGUuanBvaW50ID0gZnVuY3Rpb24ganBvaW50KHgsIHksIHopIHtcbiAgcmV0dXJuIG5ldyBKUG9pbnQodGhpcywgeCwgeSwgeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLnRvUCA9IGZ1bmN0aW9uIHRvUCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzLmN1cnZlLnBvaW50KG51bGwsIG51bGwpO1xuXG4gIHZhciB6aW52ID0gdGhpcy56LnJlZEludm0oKTtcbiAgdmFyIHppbnYyID0gemludi5yZWRTcXIoKTtcbiAgdmFyIGF4ID0gdGhpcy54LnJlZE11bCh6aW52Mik7XG4gIHZhciBheSA9IHRoaXMueS5yZWRNdWwoemludjIpLnJlZE11bCh6aW52KTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5wb2ludChheCwgYXkpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcoKSB7XG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludCh0aGlzLngsIHRoaXMueS5yZWROZWcoKSwgdGhpcy56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkKHApIHtcbiAgLy8gTyArIFAgPSBQXG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gcDtcblxuICAvLyBQICsgTyA9IFBcbiAgaWYgKHAuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIDEyTSArIDRTICsgN0FcbiAgdmFyIHB6MiA9IHAuei5yZWRTcXIoKTtcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLngucmVkTXVsKHB6Mik7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnkucmVkTXVsKHB6Mi5yZWRNdWwocC56KSk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIucmVkTXVsKHRoaXMueikpO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKHAueikucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUubWl4ZWRBZGQgPSBmdW5jdGlvbiBtaXhlZEFkZChwKSB7XG4gIC8vIE8gKyBQID0gUFxuICBpZiAodGhpcy5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHAudG9KKCk7XG5cbiAgLy8gUCArIE8gPSBQXG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyA4TSArIDNTICsgN0FcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgdTEgPSB0aGlzLng7XG4gIHZhciB1MiA9IHAueC5yZWRNdWwoejIpO1xuICB2YXIgczEgPSB0aGlzLnk7XG4gIHZhciBzMiA9IHAueS5yZWRNdWwoejIpLnJlZE11bCh0aGlzLnopO1xuXG4gIHZhciBoID0gdTEucmVkU3ViKHUyKTtcbiAgdmFyIHIgPSBzMS5yZWRTdWIoczIpO1xuICBpZiAoaC5jbXBuKDApID09PSAwKSB7XG4gICAgaWYgKHIuY21wbigwKSAhPT0gMClcbiAgICAgIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChudWxsLCBudWxsLCBudWxsKTtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gdGhpcy5kYmwoKTtcbiAgfVxuXG4gIHZhciBoMiA9IGgucmVkU3FyKCk7XG4gIHZhciBoMyA9IGgyLnJlZE11bChoKTtcbiAgdmFyIHYgPSB1MS5yZWRNdWwoaDIpO1xuXG4gIHZhciBueCA9IHIucmVkU3FyKCkucmVkSUFkZChoMykucmVkSVN1Yih2KS5yZWRJU3ViKHYpO1xuICB2YXIgbnkgPSByLnJlZE11bCh2LnJlZElTdWIobngpKS5yZWRJU3ViKHMxLnJlZE11bChoMykpO1xuICB2YXIgbnogPSB0aGlzLnoucmVkTXVsKGgpO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZGJscCA9IGZ1bmN0aW9uIGRibHAocG93KSB7XG4gIGlmIChwb3cgPT09IDApXG4gICAgcmV0dXJuIHRoaXM7XG4gIGlmICh0aGlzLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gdGhpcztcbiAgaWYgKCFwb3cpXG4gICAgcmV0dXJuIHRoaXMuZGJsKCk7XG5cbiAgdmFyIGk7XG4gIGlmICh0aGlzLmN1cnZlLnplcm9BIHx8IHRoaXMuY3VydmUudGhyZWVBKSB7XG4gICAgdmFyIHIgPSB0aGlzO1xuICAgIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKylcbiAgICAgIHIgPSByLmRibCgpO1xuICAgIHJldHVybiByO1xuICB9XG5cbiAgLy8gMU0gKyAyUyArIDFBICsgTiAqICg0UyArIDVNICsgOEEpXG4gIC8vIE4gPSAxID0+IDZNICsgNlMgKyA5QVxuICB2YXIgYSA9IHRoaXMuY3VydmUuYTtcbiAgdmFyIHRpbnYgPSB0aGlzLmN1cnZlLnRpbnY7XG5cbiAgdmFyIGp4ID0gdGhpcy54O1xuICB2YXIgankgPSB0aGlzLnk7XG4gIHZhciBqeiA9IHRoaXMuejtcbiAgdmFyIGp6NCA9IGp6LnJlZFNxcigpLnJlZFNxcigpO1xuXG4gIC8vIFJldXNlIHJlc3VsdHNcbiAgdmFyIGp5ZCA9IGp5LnJlZEFkZChqeSk7XG4gIGZvciAoaSA9IDA7IGkgPCBwb3c7IGkrKykge1xuICAgIHZhciBqeDIgPSBqeC5yZWRTcXIoKTtcbiAgICB2YXIganlkMiA9IGp5ZC5yZWRTcXIoKTtcbiAgICB2YXIganlkNCA9IGp5ZDIucmVkU3FyKCk7XG4gICAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgICB2YXIgdDEgPSBqeC5yZWRNdWwoanlkMik7XG4gICAgdmFyIG54ID0gYy5yZWRTcXIoKS5yZWRJU3ViKHQxLnJlZEFkZCh0MSkpO1xuICAgIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuICAgIHZhciBkbnkgPSBjLnJlZE11bCh0Mik7XG4gICAgZG55ID0gZG55LnJlZElBZGQoZG55KS5yZWRJU3ViKGp5ZDQpO1xuICAgIHZhciBueiA9IGp5ZC5yZWRNdWwoanopO1xuICAgIGlmIChpICsgMSA8IHBvdylcbiAgICAgIGp6NCA9IGp6NC5yZWRNdWwoanlkNCk7XG5cbiAgICBqeCA9IG54O1xuICAgIGp6ID0gbno7XG4gICAganlkID0gZG55O1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KGp4LCBqeWQucmVkTXVsKHRpbnYpLCBqeik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLmRibCA9IGZ1bmN0aW9uIGRibCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGlmICh0aGlzLmN1cnZlLnplcm9BKVxuICAgIHJldHVybiB0aGlzLl96ZXJvRGJsKCk7XG4gIGVsc2UgaWYgKHRoaXMuY3VydmUudGhyZWVBKVxuICAgIHJldHVybiB0aGlzLl90aHJlZURibCgpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMuX2RibCgpO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5femVyb0RibCA9IGZ1bmN0aW9uIF96ZXJvRGJsKCkge1xuICB2YXIgbng7XG4gIHZhciBueTtcbiAgdmFyIG56O1xuICAvLyBaID0gMVxuICBpZiAodGhpcy56T25lKSB7XG4gICAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWxcbiAgICAvLyAgICAgI2RvdWJsaW5nLW1kYmwtMjAwNy1ibFxuICAgIC8vIDFNICsgNVMgKyAxNEFcblxuICAgIC8vIFhYID0gWDFeMlxuICAgIHZhciB4eCA9IHRoaXMueC5yZWRTcXIoKTtcbiAgICAvLyBZWSA9IFkxXjJcbiAgICB2YXIgeXkgPSB0aGlzLnkucmVkU3FyKCk7XG4gICAgLy8gWVlZWSA9IFlZXjJcbiAgICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAgIC8vIFMgPSAyICogKChYMSArIFlZKV4yIC0gWFggLSBZWVlZKVxuICAgIHZhciBzID0gdGhpcy54LnJlZEFkZCh5eSkucmVkU3FyKCkucmVkSVN1Yih4eCkucmVkSVN1Yih5eXl5KTtcbiAgICBzID0gcy5yZWRJQWRkKHMpO1xuICAgIC8vIE0gPSAzICogWFggKyBhOyBhID0gMFxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KTtcbiAgICAvLyBUID0gTSBeIDIgLSAyKlNcbiAgICB2YXIgdCA9IG0ucmVkU3FyKCkucmVkSVN1YihzKS5yZWRJU3ViKHMpO1xuXG4gICAgLy8gOCAqIFlZWVlcbiAgICB2YXIgeXl5eTggPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICB5eXl5OCA9IHl5eXk4LnJlZElBZGQoeXl5eTgpO1xuXG4gICAgLy8gWDMgPSBUXG4gICAgbnggPSB0O1xuICAgIC8vIFkzID0gTSAqIChTIC0gVCkgLSA4ICogWVlZWVxuICAgIG55ID0gbS5yZWRNdWwocy5yZWRJU3ViKHQpKS5yZWRJU3ViKHl5eXk4KTtcbiAgICAvLyBaMyA9IDIqWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTAuaHRtbFxuICAgIC8vICAgICAjZG91YmxpbmctZGJsLTIwMDktbFxuICAgIC8vIDJNICsgNVMgKyAxM0FcblxuICAgIC8vIEEgPSBYMV4yXG4gICAgdmFyIGEgPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gQiA9IFkxXjJcbiAgICB2YXIgYiA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBDID0gQl4yXG4gICAgdmFyIGMgPSBiLnJlZFNxcigpO1xuICAgIC8vIEQgPSAyICogKChYMSArIEIpXjIgLSBBIC0gQylcbiAgICB2YXIgZCA9IHRoaXMueC5yZWRBZGQoYikucmVkU3FyKCkucmVkSVN1YihhKS5yZWRJU3ViKGMpO1xuICAgIGQgPSBkLnJlZElBZGQoZCk7XG4gICAgLy8gRSA9IDMgKiBBXG4gICAgdmFyIGUgPSBhLnJlZEFkZChhKS5yZWRJQWRkKGEpO1xuICAgIC8vIEYgPSBFXjJcbiAgICB2YXIgZiA9IGUucmVkU3FyKCk7XG5cbiAgICAvLyA4ICogQ1xuICAgIHZhciBjOCA9IGMucmVkSUFkZChjKTtcbiAgICBjOCA9IGM4LnJlZElBZGQoYzgpO1xuICAgIGM4ID0gYzgucmVkSUFkZChjOCk7XG5cbiAgICAvLyBYMyA9IEYgLSAyICogRFxuICAgIG54ID0gZi5yZWRJU3ViKGQpLnJlZElTdWIoZCk7XG4gICAgLy8gWTMgPSBFICogKEQgLSBYMykgLSA4ICogQ1xuICAgIG55ID0gZS5yZWRNdWwoZC5yZWRJU3ViKG54KSkucmVkSVN1YihjOCk7XG4gICAgLy8gWjMgPSAyICogWTEgKiBaMVxuICAgIG56ID0gdGhpcy55LnJlZE11bCh0aGlzLnopO1xuICAgIG56ID0gbnoucmVkSUFkZChueik7XG4gIH1cblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLl90aHJlZURibCA9IGZ1bmN0aW9uIF90aHJlZURibCgpIHtcbiAgdmFyIG54O1xuICB2YXIgbnk7XG4gIHZhciBuejtcbiAgLy8gWiA9IDFcbiAgaWYgKHRoaXMuek9uZSkge1xuICAgIC8vIGh5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by1zaG9ydHctamFjb2JpYW4tMy5odG1sXG4gICAgLy8gICAgICNkb3VibGluZy1tZGJsLTIwMDctYmxcbiAgICAvLyAxTSArIDVTICsgMTVBXG5cbiAgICAvLyBYWCA9IFgxXjJcbiAgICB2YXIgeHggPSB0aGlzLngucmVkU3FyKCk7XG4gICAgLy8gWVkgPSBZMV4yXG4gICAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAgIC8vIFlZWVkgPSBZWV4yXG4gICAgdmFyIHl5eXkgPSB5eS5yZWRTcXIoKTtcbiAgICAvLyBTID0gMiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSlcbiAgICB2YXIgcyA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gICAgcyA9IHMucmVkSUFkZChzKTtcbiAgICAvLyBNID0gMyAqIFhYICsgYVxuICAgIHZhciBtID0geHgucmVkQWRkKHh4KS5yZWRJQWRkKHh4KS5yZWRJQWRkKHRoaXMuY3VydmUuYSk7XG4gICAgLy8gVCA9IE1eMiAtIDIgKiBTXG4gICAgdmFyIHQgPSBtLnJlZFNxcigpLnJlZElTdWIocykucmVkSVN1YihzKTtcbiAgICAvLyBYMyA9IFRcbiAgICBueCA9IHQ7XG4gICAgLy8gWTMgPSBNICogKFMgLSBUKSAtIDggKiBZWVlZXG4gICAgdmFyIHl5eXk4ID0geXl5eS5yZWRJQWRkKHl5eXkpO1xuICAgIHl5eXk4ID0geXl5eTgucmVkSUFkZCh5eXl5OCk7XG4gICAgeXl5eTggPSB5eXl5OC5yZWRJQWRkKHl5eXk4KTtcbiAgICBueSA9IG0ucmVkTXVsKHMucmVkSVN1Yih0KSkucmVkSVN1Yih5eXl5OCk7XG4gICAgLy8gWjMgPSAyICogWTFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy55KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBoeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tc2hvcnR3LWphY29iaWFuLTMuaHRtbCNkb3VibGluZy1kYmwtMjAwMS1iXG4gICAgLy8gM00gKyA1U1xuXG4gICAgLy8gZGVsdGEgPSBaMV4yXG4gICAgdmFyIGRlbHRhID0gdGhpcy56LnJlZFNxcigpO1xuICAgIC8vIGdhbW1hID0gWTFeMlxuICAgIHZhciBnYW1tYSA9IHRoaXMueS5yZWRTcXIoKTtcbiAgICAvLyBiZXRhID0gWDEgKiBnYW1tYVxuICAgIHZhciBiZXRhID0gdGhpcy54LnJlZE11bChnYW1tYSk7XG4gICAgLy8gYWxwaGEgPSAzICogKFgxIC0gZGVsdGEpICogKFgxICsgZGVsdGEpXG4gICAgdmFyIGFscGhhID0gdGhpcy54LnJlZFN1YihkZWx0YSkucmVkTXVsKHRoaXMueC5yZWRBZGQoZGVsdGEpKTtcbiAgICBhbHBoYSA9IGFscGhhLnJlZEFkZChhbHBoYSkucmVkSUFkZChhbHBoYSk7XG4gICAgLy8gWDMgPSBhbHBoYV4yIC0gOCAqIGJldGFcbiAgICB2YXIgYmV0YTQgPSBiZXRhLnJlZElBZGQoYmV0YSk7XG4gICAgYmV0YTQgPSBiZXRhNC5yZWRJQWRkKGJldGE0KTtcbiAgICB2YXIgYmV0YTggPSBiZXRhNC5yZWRBZGQoYmV0YTQpO1xuICAgIG54ID0gYWxwaGEucmVkU3FyKCkucmVkSVN1YihiZXRhOCk7XG4gICAgLy8gWjMgPSAoWTEgKyBaMSleMiAtIGdhbW1hIC0gZGVsdGFcbiAgICBueiA9IHRoaXMueS5yZWRBZGQodGhpcy56KS5yZWRTcXIoKS5yZWRJU3ViKGdhbW1hKS5yZWRJU3ViKGRlbHRhKTtcbiAgICAvLyBZMyA9IGFscGhhICogKDQgKiBiZXRhIC0gWDMpIC0gOCAqIGdhbW1hXjJcbiAgICB2YXIgZ2dhbW1hOCA9IGdhbW1hLnJlZFNxcigpO1xuICAgIGdnYW1tYTggPSBnZ2FtbWE4LnJlZElBZGQoZ2dhbW1hOCk7XG4gICAgZ2dhbW1hOCA9IGdnYW1tYTgucmVkSUFkZChnZ2FtbWE4KTtcbiAgICBnZ2FtbWE4ID0gZ2dhbW1hOC5yZWRJQWRkKGdnYW1tYTgpO1xuICAgIG55ID0gYWxwaGEucmVkTXVsKGJldGE0LnJlZElTdWIobngpKS5yZWRJU3ViKGdnYW1tYTgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXMuY3VydmUuanBvaW50KG54LCBueSwgbnopO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5fZGJsID0gZnVuY3Rpb24gX2RibCgpIHtcbiAgdmFyIGEgPSB0aGlzLmN1cnZlLmE7XG5cbiAgLy8gNE0gKyA2UyArIDEwQVxuICB2YXIganggPSB0aGlzLng7XG4gIHZhciBqeSA9IHRoaXMueTtcbiAgdmFyIGp6ID0gdGhpcy56O1xuICB2YXIgano0ID0ganoucmVkU3FyKCkucmVkU3FyKCk7XG5cbiAgdmFyIGp4MiA9IGp4LnJlZFNxcigpO1xuICB2YXIgankyID0gankucmVkU3FyKCk7XG5cbiAgdmFyIGMgPSBqeDIucmVkQWRkKGp4MikucmVkSUFkZChqeDIpLnJlZElBZGQoYS5yZWRNdWwoano0KSk7XG5cbiAgdmFyIGp4ZDQgPSBqeC5yZWRBZGQoangpO1xuICBqeGQ0ID0ganhkNC5yZWRJQWRkKGp4ZDQpO1xuICB2YXIgdDEgPSBqeGQ0LnJlZE11bChqeTIpO1xuICB2YXIgbnggPSBjLnJlZFNxcigpLnJlZElTdWIodDEucmVkQWRkKHQxKSk7XG4gIHZhciB0MiA9IHQxLnJlZElTdWIobngpO1xuXG4gIHZhciBqeWQ4ID0gankyLnJlZFNxcigpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICBqeWQ4ID0ganlkOC5yZWRJQWRkKGp5ZDgpO1xuICB2YXIgbnkgPSBjLnJlZE11bCh0MikucmVkSVN1YihqeWQ4KTtcbiAgdmFyIG56ID0gankucmVkQWRkKGp5KS5yZWRNdWwoanopO1xuXG4gIHJldHVybiB0aGlzLmN1cnZlLmpwb2ludChueCwgbnksIG56KTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUudHJwbCA9IGZ1bmN0aW9uIHRycGwoKSB7XG4gIGlmICghdGhpcy5jdXJ2ZS56ZXJvQSlcbiAgICByZXR1cm4gdGhpcy5kYmwoKS5hZGQodGhpcyk7XG5cbiAgLy8gaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXNob3J0dy1qYWNvYmlhbi0wLmh0bWwjdHJpcGxpbmctdHBsLTIwMDctYmxcbiAgLy8gNU0gKyAxMFMgKyAuLi5cblxuICAvLyBYWCA9IFgxXjJcbiAgdmFyIHh4ID0gdGhpcy54LnJlZFNxcigpO1xuICAvLyBZWSA9IFkxXjJcbiAgdmFyIHl5ID0gdGhpcy55LnJlZFNxcigpO1xuICAvLyBaWiA9IFoxXjJcbiAgdmFyIHp6ID0gdGhpcy56LnJlZFNxcigpO1xuICAvLyBZWVlZID0gWVleMlxuICB2YXIgeXl5eSA9IHl5LnJlZFNxcigpO1xuICAvLyBNID0gMyAqIFhYICsgYSAqIFpaMjsgYSA9IDBcbiAgdmFyIG0gPSB4eC5yZWRBZGQoeHgpLnJlZElBZGQoeHgpO1xuICAvLyBNTSA9IE1eMlxuICB2YXIgbW0gPSBtLnJlZFNxcigpO1xuICAvLyBFID0gNiAqICgoWDEgKyBZWSleMiAtIFhYIC0gWVlZWSkgLSBNTVxuICB2YXIgZSA9IHRoaXMueC5yZWRBZGQoeXkpLnJlZFNxcigpLnJlZElTdWIoeHgpLnJlZElTdWIoeXl5eSk7XG4gIGUgPSBlLnJlZElBZGQoZSk7XG4gIGUgPSBlLnJlZEFkZChlKS5yZWRJQWRkKGUpO1xuICBlID0gZS5yZWRJU3ViKG1tKTtcbiAgLy8gRUUgPSBFXjJcbiAgdmFyIGVlID0gZS5yZWRTcXIoKTtcbiAgLy8gVCA9IDE2KllZWVlcbiAgdmFyIHQgPSB5eXl5LnJlZElBZGQoeXl5eSk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIHQgPSB0LnJlZElBZGQodCk7XG4gIC8vIFUgPSAoTSArIEUpXjIgLSBNTSAtIEVFIC0gVFxuICB2YXIgdSA9IG0ucmVkSUFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKG1tKS5yZWRJU3ViKGVlKS5yZWRJU3ViKHQpO1xuICAvLyBYMyA9IDQgKiAoWDEgKiBFRSAtIDQgKiBZWSAqIFUpXG4gIHZhciB5eXU0ID0geXkucmVkTXVsKHUpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB5eXU0ID0geXl1NC5yZWRJQWRkKHl5dTQpO1xuICB2YXIgbnggPSB0aGlzLngucmVkTXVsKGVlKS5yZWRJU3ViKHl5dTQpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICBueCA9IG54LnJlZElBZGQobngpO1xuICAvLyBZMyA9IDggKiBZMSAqIChVICogKFQgLSBVKSAtIEUgKiBFRSlcbiAgdmFyIG55ID0gdGhpcy55LnJlZE11bCh1LnJlZE11bCh0LnJlZElTdWIodSkpLnJlZElTdWIoZS5yZWRNdWwoZWUpKSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIG55ID0gbnkucmVkSUFkZChueSk7XG4gIC8vIFozID0gKFoxICsgRSleMiAtIFpaIC0gRUVcbiAgdmFyIG56ID0gdGhpcy56LnJlZEFkZChlKS5yZWRTcXIoKS5yZWRJU3ViKHp6KS5yZWRJU3ViKGVlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5qcG9pbnQobngsIG55LCBueik7XG59O1xuXG5KUG9pbnQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bChrLCBrYmFzZSkge1xuICBrID0gbmV3IEJOKGssIGtiYXNlKTtcblxuICByZXR1cm4gdGhpcy5jdXJ2ZS5fd25hZk11bCh0aGlzLCBrKTtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXEgPSBmdW5jdGlvbiBlcShwKSB7XG4gIGlmIChwLnR5cGUgPT09ICdhZmZpbmUnKVxuICAgIHJldHVybiB0aGlzLmVxKHAudG9KKCkpO1xuXG4gIGlmICh0aGlzID09PSBwKVxuICAgIHJldHVybiB0cnVlO1xuXG4gIC8vIHgxICogejJeMiA9PSB4MiAqIHoxXjJcbiAgdmFyIHoyID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcHoyID0gcC56LnJlZFNxcigpO1xuICBpZiAodGhpcy54LnJlZE11bChwejIpLnJlZElTdWIocC54LnJlZE11bCh6MikpLmNtcG4oMCkgIT09IDApXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIHkxICogejJeMyA9PSB5MiAqIHoxXjNcbiAgdmFyIHozID0gejIucmVkTXVsKHRoaXMueik7XG4gIHZhciBwejMgPSBwejIucmVkTXVsKHAueik7XG4gIHJldHVybiB0aGlzLnkucmVkTXVsKHB6MykucmVkSVN1YihwLnkucmVkTXVsKHozKSkuY21wbigwKSA9PT0gMDtcbn07XG5cbkpQb2ludC5wcm90b3R5cGUuZXFYVG9QID0gZnVuY3Rpb24gZXFYVG9QKHgpIHtcbiAgdmFyIHpzID0gdGhpcy56LnJlZFNxcigpO1xuICB2YXIgcnggPSB4LnRvUmVkKHRoaXMuY3VydmUucmVkKS5yZWRNdWwoenMpO1xuICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgdmFyIHhjID0geC5jbG9uZSgpO1xuICB2YXIgdCA9IHRoaXMuY3VydmUucmVkTi5yZWRNdWwoenMpO1xuICBmb3IgKDs7KSB7XG4gICAgeGMuaWFkZCh0aGlzLmN1cnZlLm4pO1xuICAgIGlmICh4Yy5jbXAodGhpcy5jdXJ2ZS5wKSA+PSAwKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgcngucmVkSUFkZCh0KTtcbiAgICBpZiAodGhpcy54LmNtcChyeCkgPT09IDApXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuSlBvaW50LnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCgpIHtcbiAgaWYgKHRoaXMuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiAnPEVDIEpQb2ludCBJbmZpbml0eT4nO1xuICByZXR1cm4gJzxFQyBKUG9pbnQgeDogJyArIHRoaXMueC50b1N0cmluZygxNiwgMikgK1xuICAgICAgJyB5OiAnICsgdGhpcy55LnRvU3RyaW5nKDE2LCAyKSArXG4gICAgICAnIHo6ICcgKyB0aGlzLnoudG9TdHJpbmcoMTYsIDIpICsgJz4nO1xufTtcblxuSlBvaW50LnByb3RvdHlwZS5pc0luZmluaXR5ID0gZnVuY3Rpb24gaXNJbmZpbml0eSgpIHtcbiAgLy8gWFhYIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgemVybyBpcyBhbHdheXMgemVybyBpbiByZWRcbiAgcmV0dXJuIHRoaXMuei5jbXBuKDApID09PSAwO1xufTtcblxudmFyIGN1cnZlXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBjdXJ2ZSA9IGV4cG9ydHM7XG5cbmN1cnZlLmJhc2UgPSBiYXNlO1xuY3VydmUuc2hvcnQgPSBzaG9ydF8xO1xuY3VydmUubW9udCA9IC8qUmljTW9vOmV0aGVyczpyZXF1aXJlKC4vbW9udCkqLyhudWxsKTtcbmN1cnZlLmVkd2FyZHMgPSAvKlJpY01vbzpldGhlcnM6cmVxdWlyZSguL2Vkd2FyZHMpKi8obnVsbCk7XG59KTtcblxudmFyIGN1cnZlc18xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY3VydmVzID0gZXhwb3J0cztcblxuXG5cblxuXG52YXIgYXNzZXJ0ID0gdXRpbHNfMSQxLmFzc2VydDtcblxuZnVuY3Rpb24gUHJlc2V0Q3VydmUob3B0aW9ucykge1xuICBpZiAob3B0aW9ucy50eXBlID09PSAnc2hvcnQnKVxuICAgIHRoaXMuY3VydmUgPSBuZXcgY3VydmVfMS5zaG9ydChvcHRpb25zKTtcbiAgZWxzZSBpZiAob3B0aW9ucy50eXBlID09PSAnZWR3YXJkcycpXG4gICAgdGhpcy5jdXJ2ZSA9IG5ldyBjdXJ2ZV8xLmVkd2FyZHMob3B0aW9ucyk7XG4gIGVsc2VcbiAgICB0aGlzLmN1cnZlID0gbmV3IGN1cnZlXzEubW9udChvcHRpb25zKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuICB0aGlzLm4gPSB0aGlzLmN1cnZlLm47XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcblxuICBhc3NlcnQodGhpcy5nLnZhbGlkYXRlKCksICdJbnZhbGlkIGN1cnZlJyk7XG4gIGFzc2VydCh0aGlzLmcubXVsKHRoaXMubikuaXNJbmZpbml0eSgpLCAnSW52YWxpZCBjdXJ2ZSwgRypOICE9IE8nKTtcbn1cbmN1cnZlcy5QcmVzZXRDdXJ2ZSA9IFByZXNldEN1cnZlO1xuXG5mdW5jdGlvbiBkZWZpbmVDdXJ2ZShuYW1lLCBvcHRpb25zKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdXJ2ZXMsIG5hbWUsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGN1cnZlID0gbmV3IFByZXNldEN1cnZlKG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN1cnZlcywgbmFtZSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBjdXJ2ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGN1cnZlO1xuICAgIH0sXG4gIH0pO1xufVxuXG5kZWZpbmVDdXJ2ZSgncDE5MicsIHtcbiAgdHlwZTogJ3Nob3J0JyxcbiAgcHJpbWU6ICdwMTkyJyxcbiAgcDogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyxcbiAgYTogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZjJyxcbiAgYjogJzY0MjEwNTE5IGU1OWM4MGU3IDBmYTdlOWFiIDcyMjQzMDQ5IGZlYjhkZWVjIGMxNDZiOWIxJyxcbiAgbjogJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDk5ZGVmODM2IDE0NmJjOWIxIGI0ZDIyODMxJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzE4OGRhODBlIGIwMzA5MGY2IDdjYmYyMGViIDQzYTE4ODAwIGY0ZmYwYWZkIDgyZmYxMDEyJyxcbiAgICAnMDcxOTJiOTUgZmZjOGRhNzggNjMxMDExZWQgNmIyNGNkZDUgNzNmOTc3YTEgMWU3OTQ4MTEnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwMjI0Jywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogJ3AyMjQnLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDEnLFxuICBhOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUnLFxuICBiOiAnYjQwNTBhODUgMGMwNGIzYWIgZjU0MTMyNTYgNTA0NGIwYjcgZDdiZmQ4YmEgMjcwYjM5NDMgMjM1NWZmYjQnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZjE2YTIgZTBiOGYwM2UgMTNkZDI5NDUgNWM1YzJhM2QnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnYjcwZTBjYmQgNmJiNGJmN2YgMzIxMzkwYjkgNGEwM2MxZDMgNTZjMjExMjIgMzQzMjgwZDYgMTE1YzFkMjEnLFxuICAgICdiZDM3NjM4OCBiNWY3MjNmYiA0YzIyZGZlNiBjZDQzNzVhMCA1YTA3NDc2NCA0NGQ1ODE5OSA4NTAwN2UzNCcsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AyNTYnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYnLFxuICBhOiAnZmZmZmZmZmYgMDAwMDAwMDEgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnNWFjNjM1ZDggYWEzYTkzZTcgYjNlYmJkNTUgNzY5ODg2YmMgNjUxZDA2YjAgY2M1M2IwZjYgM2JjZTNjM2UgMjdkMjYwNGInLFxuICBuOiAnZmZmZmZmZmYgMDAwMDAwMDAgZmZmZmZmZmYgZmZmZmZmZmYgYmNlNmZhYWQgYTcxNzllODQgZjNiOWNhYzIgZmM2MzI1NTEnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnNmIxN2QxZjIgZTEyYzQyNDcgZjhiY2U2ZTUgNjNhNDQwZjIgNzcwMzdkODEgMmRlYjMzYTAgZjRhMTM5NDUgZDg5OGMyOTYnLFxuICAgICc0ZmUzNDJlMiBmZTFhN2Y5YiA4ZWU3ZWI0YSA3YzBmOWUxNiAyYmNlMzM1NyA2YjMxNWVjZSBjYmI2NDA2OCAzN2JmNTFmNScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ3AzODQnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiBudWxsLFxuICBwOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZSBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCBmZmZmZmZmZicsXG4gIGE6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZlIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIGZmZmZmZmZjJyxcbiAgYjogJ2IzMzEyZmE3IGUyM2VlN2U0IDk4OGUwNTZiIGUzZjgyZDE5IDE4MWQ5YzZlIGZlODE0MTEyIDAzMTQwODhmICcgK1xuICAgICAnNTAxMzg3NWEgYzY1NjM5OGQgOGEyZWQxOWQgMmE4NWM4ZWQgZDNlYzJhZWYnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgYzc2MzRkODEgJyArXG4gICAgICdmNDM3MmRkZiA1ODFhMGRiMiA0OGIwYTc3YSBlY2VjMTk2YSBjY2M1Mjk3MycsXG4gIGhhc2g6IGhhc2guc2hhMzg0LFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICdhYTg3Y2EyMiBiZThiMDUzNyA4ZWIxYzcxZSBmMzIwYWQ3NCA2ZTFkM2I2MiA4YmE3OWI5OCA1OWY3NDFlMCA4MjU0MmEzOCAnICtcbiAgICAnNTUwMmYyNWQgYmY1NTI5NmMgM2E1NDVlMzggNzI3NjBhYjcnLFxuICAgICczNjE3ZGU0YSA5NjI2MmM2ZiA1ZDllOThiZiA5MjkyZGMyOSBmOGY0MWRiZCAyODlhMTQ3YyBlOWRhMzExMyBiNWYwYjhjMCAnICtcbiAgICAnMGE2MGIxY2UgMWQ3ZTgxOWQgN2E0MzFkN2MgOTBlYTBlNWYnLFxuICBdLFxufSk7XG5cbmRlZmluZUN1cnZlKCdwNTIxJywge1xuICB0eXBlOiAnc2hvcnQnLFxuICBwcmltZTogbnVsbCxcbiAgcDogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgJyArXG4gICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZicsXG4gIGE6ICcwMDAwMDFmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAnICtcbiAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmMnLFxuICBiOiAnMDAwMDAwNTEgOTUzZWI5NjEgOGUxYzlhMWYgOTI5YTIxYTAgYjY4NTQwZWUgYTJkYTcyNWIgJyArXG4gICAgICc5OWIzMTVmMyBiOGI0ODk5MSA4ZWYxMDllMSA1NjE5Mzk1MSBlYzdlOTM3YiAxNjUyYzBiZCAnICtcbiAgICAgJzNiYjFiZjA3IDM1NzNkZjg4IDNkMmMzNGYxIGVmNDUxZmQ0IDZiNTAzZjAwJyxcbiAgbjogJzAwMDAwMWZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmICcgK1xuICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmEgNTE4Njg3ODMgYmYyZjk2NmIgN2ZjYzAxNDggJyArXG4gICAgICdmNzA5YTVkMCAzYmI1YzliOCA4OTljNDdhZSBiYjZmYjcxZSA5MTM4NjQwOScsXG4gIGhhc2g6IGhhc2guc2hhNTEyLFxuICBnUmVkOiBmYWxzZSxcbiAgZzogW1xuICAgICcwMDAwMDBjNiA4NThlMDZiNyAwNDA0ZTljZCA5ZTNlY2I2NiAyMzk1YjQ0MiA5YzY0ODEzOSAnICtcbiAgICAnMDUzZmI1MjEgZjgyOGFmNjAgNmI0ZDNkYmEgYTE0YjVlNzcgZWZlNzU5MjggZmUxZGMxMjcgJyArXG4gICAgJ2EyZmZhOGRlIDMzNDhiM2MxIDg1NmE0MjliIGY5N2U3ZTMxIGMyZTViZDY2JyxcbiAgICAnMDAwMDAxMTggMzkyOTZhNzggOWEzYmMwMDQgNWM4YTVmYjQgMmM3ZDFiZDkgOThmNTQ0NDkgJyArXG4gICAgJzU3OWI0NDY4IDE3YWZiZDE3IDI3M2U2NjJjIDk3ZWU3Mjk5IDVlZjQyNjQwIGM1NTBiOTAxICcgK1xuICAgICczZmFkMDc2MSAzNTNjNzA4NiBhMjcyYzI0MCA4OGJlOTQ3NiA5ZmQxNjY1MCcsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ2N1cnZlMjU1MTknLCB7XG4gIHR5cGU6ICdtb250JyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICc3NmQwNicsXG4gIGI6ICcxJyxcbiAgbjogJzEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAxNGRlZjlkZWEyZjc5Y2Q2IDU4MTI2MzFhNWNmNWQzZWQnLFxuICBoYXNoOiBoYXNoLnNoYTI1NixcbiAgZ1JlZDogZmFsc2UsXG4gIGc6IFtcbiAgICAnOScsXG4gIF0sXG59KTtcblxuZGVmaW5lQ3VydmUoJ2VkMjU1MTknLCB7XG4gIHR5cGU6ICdlZHdhcmRzJyxcbiAgcHJpbWU6ICdwMjU1MTknLFxuICBwOiAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcsXG4gIGE6ICctMScsXG4gIGM6ICcxJyxcbiAgLy8gLTEyMTY2NSAqICgxMjE2NjZeKC0xKSkgKG1vZCBQKVxuICBkOiAnNTIwMzZjZWUyYjZmZmU3MyA4Y2M3NDA3OTc3NzllODk4IDAwNzAwYTRkNDE0MWQ4YWIgNzVlYjRkY2ExMzU5NzhhMycsXG4gIG46ICcxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgMTRkZWY5ZGVhMmY3OWNkNiA1ODEyNjMxYTVjZjVkM2VkJyxcbiAgaGFzaDogaGFzaC5zaGEyNTYsXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzIxNjkzNmQzY2Q2ZTUzZmVjMGE0ZTIzMWZkZDZkYzVjNjkyY2M3NjA5NTI1YTdiMmM5NTYyZDYwOGYyNWQ1MWEnLFxuXG4gICAgLy8gNC81XG4gICAgJzY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NTgnLFxuICBdLFxufSk7XG5cbnZhciBwcmU7XG50cnkge1xuICBwcmUgPSAvKlJpY01vbzpldGhlcnM6cmVxdWlyZSguL3ByZWNvbXB1dGVkL3NlY3AyNTZrMSkqLyhudWxsKS5jcmFzaCgpO1xufSBjYXRjaCAoZSkge1xuICBwcmUgPSB1bmRlZmluZWQ7XG59XG5cbmRlZmluZUN1cnZlKCdzZWNwMjU2azEnLCB7XG4gIHR5cGU6ICdzaG9ydCcsXG4gIHByaW1lOiAnazI1NicsXG4gIHA6ICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicsXG4gIGE6ICcwJyxcbiAgYjogJzcnLFxuICBuOiAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgYmFhZWRjZTYgYWY0OGEwM2IgYmZkMjVlOGMgZDAzNjQxNDEnLFxuICBoOiAnMScsXG4gIGhhc2g6IGhhc2guc2hhMjU2LFxuXG4gIC8vIFByZWNvbXB1dGVkIGVuZG9tb3JwaGlzbVxuICBiZXRhOiAnN2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZScsXG4gIGxhbWJkYTogJzUzNjNhZDRjYzA1YzMwZTBhNTI2MWMwMjg4MTI2NDVhMTIyZTIyZWEyMDgxNjY3OGRmMDI5NjdjMWIyM2JkNzInLFxuICBiYXNpczogW1xuICAgIHtcbiAgICAgIGE6ICczMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScsXG4gICAgICBiOiAnLWU0NDM3ZWQ2MDEwZTg4Mjg2ZjU0N2ZhOTBhYmZlNGMzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGE6ICcxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDgnLFxuICAgICAgYjogJzMwODZkMjIxYTdkNDZiY2RlODZjOTBlNDkyODRlYjE1JyxcbiAgICB9LFxuICBdLFxuXG4gIGdSZWQ6IGZhbHNlLFxuICBnOiBbXG4gICAgJzc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OTgnLFxuICAgICc0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4JyxcbiAgICBwcmUsXG4gIF0sXG59KTtcbn0pO1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5cblxuZnVuY3Rpb24gSG1hY0RSQkcob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hY0RSQkcpKVxuICAgIHJldHVybiBuZXcgSG1hY0RSQkcob3B0aW9ucyk7XG4gIHRoaXMuaGFzaCA9IG9wdGlvbnMuaGFzaDtcbiAgdGhpcy5wcmVkUmVzaXN0ID0gISFvcHRpb25zLnByZWRSZXNpc3Q7XG5cbiAgdGhpcy5vdXRMZW4gPSB0aGlzLmhhc2gub3V0U2l6ZTtcbiAgdGhpcy5taW5FbnRyb3B5ID0gb3B0aW9ucy5taW5FbnRyb3B5IHx8IHRoaXMuaGFzaC5obWFjU3RyZW5ndGg7XG5cbiAgdGhpcy5fcmVzZWVkID0gbnVsbDtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IG51bGw7XG4gIHRoaXMuSyA9IG51bGw7XG4gIHRoaXMuViA9IG51bGw7XG5cbiAgdmFyIGVudHJvcHkgPSB1dGlsc18xLnRvQXJyYXkob3B0aW9ucy5lbnRyb3B5LCBvcHRpb25zLmVudHJvcHlFbmMgfHwgJ2hleCcpO1xuICB2YXIgbm9uY2UgPSB1dGlsc18xLnRvQXJyYXkob3B0aW9ucy5ub25jZSwgb3B0aW9ucy5ub25jZUVuYyB8fCAnaGV4Jyk7XG4gIHZhciBwZXJzID0gdXRpbHNfMS50b0FycmF5KG9wdGlvbnMucGVycywgb3B0aW9ucy5wZXJzRW5jIHx8ICdoZXgnKTtcbiAgbWluaW1hbGlzdGljQXNzZXJ0KGVudHJvcHkubGVuZ3RoID49ICh0aGlzLm1pbkVudHJvcHkgLyA4KSxcbiAgICAgICAgICdOb3QgZW5vdWdoIGVudHJvcHkuIE1pbmltdW0gaXM6ICcgKyB0aGlzLm1pbkVudHJvcHkgKyAnIGJpdHMnKTtcbiAgdGhpcy5faW5pdChlbnRyb3B5LCBub25jZSwgcGVycyk7XG59XG52YXIgaG1hY0RyYmcgPSBIbWFjRFJCRztcblxuSG1hY0RSQkcucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdChlbnRyb3B5LCBub25jZSwgcGVycykge1xuICB2YXIgc2VlZCA9IGVudHJvcHkuY29uY2F0KG5vbmNlKS5jb25jYXQocGVycyk7XG5cbiAgdGhpcy5LID0gbmV3IEFycmF5KHRoaXMub3V0TGVuIC8gOCk7XG4gIHRoaXMuViA9IG5ldyBBcnJheSh0aGlzLm91dExlbiAvIDgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuVi5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuS1tpXSA9IDB4MDA7XG4gICAgdGhpcy5WW2ldID0gMHgwMTtcbiAgfVxuXG4gIHRoaXMuX3VwZGF0ZShzZWVkKTtcbiAgdGhpcy5fcmVzZWVkID0gMTtcbiAgdGhpcy5yZXNlZWRJbnRlcnZhbCA9IDB4MTAwMDAwMDAwMDAwMDsgIC8vIDJeNDhcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5faG1hYyA9IGZ1bmN0aW9uIGhtYWMoKSB7XG4gIHJldHVybiBuZXcgaGFzaC5obWFjKHRoaXMuaGFzaCwgdGhpcy5LKTtcbn07XG5cbkhtYWNEUkJHLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKHNlZWQpIHtcbiAgdmFyIGttYWMgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgICAgLnVwZGF0ZSh0aGlzLlYpXG4gICAgICAgICAgICAgICAgIC51cGRhdGUoWyAweDAwIF0pO1xuICBpZiAoc2VlZClcbiAgICBrbWFjID0ga21hYy51cGRhdGUoc2VlZCk7XG4gIHRoaXMuSyA9IGttYWMuZGlnZXN0KCk7XG4gIHRoaXMuViA9IHRoaXMuX2htYWMoKS51cGRhdGUodGhpcy5WKS5kaWdlc3QoKTtcbiAgaWYgKCFzZWVkKVxuICAgIHJldHVybjtcblxuICB0aGlzLksgPSB0aGlzLl9obWFjKClcbiAgICAgICAgICAgICAgIC51cGRhdGUodGhpcy5WKVxuICAgICAgICAgICAgICAgLnVwZGF0ZShbIDB4MDEgXSlcbiAgICAgICAgICAgICAgIC51cGRhdGUoc2VlZClcbiAgICAgICAgICAgICAgIC5kaWdlc3QoKTtcbiAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLnJlc2VlZCA9IGZ1bmN0aW9uIHJlc2VlZChlbnRyb3B5LCBlbnRyb3B5RW5jLCBhZGQsIGFkZEVuYykge1xuICAvLyBPcHRpb25hbCBlbnRyb3B5IGVuY1xuICBpZiAodHlwZW9mIGVudHJvcHlFbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVudHJvcHlFbmM7XG4gICAgZW50cm9weUVuYyA9IG51bGw7XG4gIH1cblxuICBlbnRyb3B5ID0gdXRpbHNfMS50b0FycmF5KGVudHJvcHksIGVudHJvcHlFbmMpO1xuICBhZGQgPSB1dGlsc18xLnRvQXJyYXkoYWRkLCBhZGRFbmMpO1xuXG4gIG1pbmltYWxpc3RpY0Fzc2VydChlbnRyb3B5Lmxlbmd0aCA+PSAodGhpcy5taW5FbnRyb3B5IC8gOCksXG4gICAgICAgICAnTm90IGVub3VnaCBlbnRyb3B5LiBNaW5pbXVtIGlzOiAnICsgdGhpcy5taW5FbnRyb3B5ICsgJyBiaXRzJyk7XG5cbiAgdGhpcy5fdXBkYXRlKGVudHJvcHkuY29uY2F0KGFkZCB8fCBbXSkpO1xuICB0aGlzLl9yZXNlZWQgPSAxO1xufTtcblxuSG1hY0RSQkcucHJvdG90eXBlLmdlbmVyYXRlID0gZnVuY3Rpb24gZ2VuZXJhdGUobGVuLCBlbmMsIGFkZCwgYWRkRW5jKSB7XG4gIGlmICh0aGlzLl9yZXNlZWQgPiB0aGlzLnJlc2VlZEludGVydmFsKVxuICAgIHRocm93IG5ldyBFcnJvcignUmVzZWVkIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gT3B0aW9uYWwgZW5jb2RpbmdcbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdzdHJpbmcnKSB7XG4gICAgYWRkRW5jID0gYWRkO1xuICAgIGFkZCA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG5cbiAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhXG4gIGlmIChhZGQpIHtcbiAgICBhZGQgPSB1dGlsc18xLnRvQXJyYXkoYWRkLCBhZGRFbmMgfHwgJ2hleCcpO1xuICAgIHRoaXMuX3VwZGF0ZShhZGQpO1xuICB9XG5cbiAgdmFyIHRlbXAgPSBbXTtcbiAgd2hpbGUgKHRlbXAubGVuZ3RoIDwgbGVuKSB7XG4gICAgdGhpcy5WID0gdGhpcy5faG1hYygpLnVwZGF0ZSh0aGlzLlYpLmRpZ2VzdCgpO1xuICAgIHRlbXAgPSB0ZW1wLmNvbmNhdCh0aGlzLlYpO1xuICB9XG5cbiAgdmFyIHJlcyA9IHRlbXAuc2xpY2UoMCwgbGVuKTtcbiAgdGhpcy5fdXBkYXRlKGFkZCk7XG4gIHRoaXMuX3Jlc2VlZCsrO1xuICByZXR1cm4gdXRpbHNfMS5lbmNvZGUocmVzLCBlbmMpO1xufTtcblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxudmFyIGFzc2VydCQzID0gdXRpbHNfMSQxLmFzc2VydDtcblxuZnVuY3Rpb24gS2V5UGFpcihlYywgb3B0aW9ucykge1xuICB0aGlzLmVjID0gZWM7XG4gIHRoaXMucHJpdiA9IG51bGw7XG4gIHRoaXMucHViID0gbnVsbDtcblxuICAvLyBLZXlQYWlyKGVjLCB7IHByaXY6IC4uLiwgcHViOiAuLi4gfSlcbiAgaWYgKG9wdGlvbnMucHJpdilcbiAgICB0aGlzLl9pbXBvcnRQcml2YXRlKG9wdGlvbnMucHJpdiwgb3B0aW9ucy5wcml2RW5jKTtcbiAgaWYgKG9wdGlvbnMucHViKVxuICAgIHRoaXMuX2ltcG9ydFB1YmxpYyhvcHRpb25zLnB1Yiwgb3B0aW9ucy5wdWJFbmMpO1xufVxudmFyIGtleSA9IEtleVBhaXI7XG5cbktleVBhaXIuZnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGZyb21QdWJsaWMoZWMsIHB1YiwgZW5jKSB7XG4gIGlmIChwdWIgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwdWI7XG5cbiAgcmV0dXJuIG5ldyBLZXlQYWlyKGVjLCB7XG4gICAgcHViOiBwdWIsXG4gICAgcHViRW5jOiBlbmMsXG4gIH0pO1xufTtcblxuS2V5UGFpci5mcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGZyb21Qcml2YXRlKGVjLCBwcml2LCBlbmMpIHtcbiAgaWYgKHByaXYgaW5zdGFuY2VvZiBLZXlQYWlyKVxuICAgIHJldHVybiBwcml2O1xuXG4gIHJldHVybiBuZXcgS2V5UGFpcihlYywge1xuICAgIHByaXY6IHByaXYsXG4gICAgcHJpdkVuYzogZW5jLFxuICB9KTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUoKSB7XG4gIHZhciBwdWIgPSB0aGlzLmdldFB1YmxpYygpO1xuXG4gIGlmIChwdWIuaXNJbmZpbml0eSgpKVxuICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UsIHJlYXNvbjogJ0ludmFsaWQgcHVibGljIGtleScgfTtcbiAgaWYgKCFwdWIudmFsaWRhdGUoKSlcbiAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlLCByZWFzb246ICdQdWJsaWMga2V5IGlzIG5vdCBhIHBvaW50JyB9O1xuICBpZiAoIXB1Yi5tdWwodGhpcy5lYy5jdXJ2ZS5uKS5pc0luZmluaXR5KCkpXG4gICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSwgcmVhc29uOiAnUHVibGljIGtleSAqIE4gIT0gTycgfTtcblxuICByZXR1cm4geyByZXN1bHQ6IHRydWUsIHJlYXNvbjogbnVsbCB9O1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHVibGljID0gZnVuY3Rpb24gZ2V0UHVibGljKGNvbXBhY3QsIGVuYykge1xuICAvLyBjb21wYWN0IGlzIG9wdGlvbmFsIGFyZ3VtZW50XG4gIGlmICh0eXBlb2YgY29tcGFjdCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmMgPSBjb21wYWN0O1xuICAgIGNvbXBhY3QgPSBudWxsO1xuICB9XG5cbiAgaWYgKCF0aGlzLnB1YilcbiAgICB0aGlzLnB1YiA9IHRoaXMuZWMuZy5tdWwodGhpcy5wcml2KTtcblxuICBpZiAoIWVuYylcbiAgICByZXR1cm4gdGhpcy5wdWI7XG5cbiAgcmV0dXJuIHRoaXMucHViLmVuY29kZShlbmMsIGNvbXBhY3QpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuZ2V0UHJpdmF0ZSA9IGZ1bmN0aW9uIGdldFByaXZhdGUoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpO1xuICBlbHNlXG4gICAgcmV0dXJuIHRoaXMucHJpdjtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLl9pbXBvcnRQcml2YXRlID0gZnVuY3Rpb24gX2ltcG9ydFByaXZhdGUoa2V5LCBlbmMpIHtcbiAgdGhpcy5wcml2ID0gbmV3IEJOKGtleSwgZW5jIHx8IDE2KTtcblxuICAvLyBFbnN1cmUgdGhhdCB0aGUgcHJpdiB3b24ndCBiZSBiaWdnZXIgdGhhbiBuLCBvdGhlcndpc2Ugd2UgbWF5IGZhaWxcbiAgLy8gaW4gZml4ZWQgbXVsdGlwbGljYXRpb24gbWV0aG9kXG4gIHRoaXMucHJpdiA9IHRoaXMucHJpdi51bW9kKHRoaXMuZWMuY3VydmUubik7XG59O1xuXG5LZXlQYWlyLnByb3RvdHlwZS5faW1wb3J0UHVibGljID0gZnVuY3Rpb24gX2ltcG9ydFB1YmxpYyhrZXksIGVuYykge1xuICBpZiAoa2V5LnggfHwga2V5LnkpIHtcbiAgICAvLyBNb250Z29tZXJ5IHBvaW50cyBvbmx5IGhhdmUgYW4gYHhgIGNvb3JkaW5hdGUuXG4gICAgLy8gV2VpZXJzdHJhc3MvRWR3YXJkcyBwb2ludHMgb24gdGhlIG90aGVyIGhhbmQgaGF2ZSBib3RoIGB4YCBhbmRcbiAgICAvLyBgeWAgY29vcmRpbmF0ZXMuXG4gICAgaWYgKHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ21vbnQnKSB7XG4gICAgICBhc3NlcnQkMyhrZXkueCwgJ05lZWQgeCBjb29yZGluYXRlJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmVjLmN1cnZlLnR5cGUgPT09ICdzaG9ydCcgfHxcbiAgICAgICAgICAgICAgIHRoaXMuZWMuY3VydmUudHlwZSA9PT0gJ2Vkd2FyZHMnKSB7XG4gICAgICBhc3NlcnQkMyhrZXkueCAmJiBrZXkueSwgJ05lZWQgYm90aCB4IGFuZCB5IGNvb3JkaW5hdGUnKTtcbiAgICB9XG4gICAgdGhpcy5wdWIgPSB0aGlzLmVjLmN1cnZlLnBvaW50KGtleS54LCBrZXkueSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucHViID0gdGhpcy5lYy5jdXJ2ZS5kZWNvZGVQb2ludChrZXksIGVuYyk7XG59O1xuXG4vLyBFQ0RIXG5LZXlQYWlyLnByb3RvdHlwZS5kZXJpdmUgPSBmdW5jdGlvbiBkZXJpdmUocHViKSB7XG4gIGlmKCFwdWIudmFsaWRhdGUoKSkge1xuICAgIGFzc2VydCQzKHB1Yi52YWxpZGF0ZSgpLCAncHVibGljIHBvaW50IG5vdCB2YWxpZGF0ZWQnKTtcbiAgfVxuICByZXR1cm4gcHViLm11bCh0aGlzLnByaXYpLmdldFgoKTtcbn07XG5cbi8vIEVDRFNBXG5LZXlQYWlyLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb24gc2lnbihtc2csIGVuYywgb3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5lYy5zaWduKG1zZywgdGhpcywgZW5jLCBvcHRpb25zKTtcbn07XG5cbktleVBhaXIucHJvdG90eXBlLnZlcmlmeSA9IGZ1bmN0aW9uIHZlcmlmeShtc2csIHNpZ25hdHVyZSkge1xuICByZXR1cm4gdGhpcy5lYy52ZXJpZnkobXNnLCBzaWduYXR1cmUsIHRoaXMpO1xufTtcblxuS2V5UGFpci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gIHJldHVybiAnPEtleSBwcml2OiAnICsgKHRoaXMucHJpdiAmJiB0aGlzLnByaXYudG9TdHJpbmcoMTYsIDIpKSArXG4gICAgICAgICAnIHB1YjogJyArICh0aGlzLnB1YiAmJiB0aGlzLnB1Yi5pbnNwZWN0KCkpICsgJyA+Jztcbn07XG5cbid1c2Ugc3RyaWN0JztcblxuXG5cblxudmFyIGFzc2VydCQ0ID0gdXRpbHNfMSQxLmFzc2VydDtcblxuZnVuY3Rpb24gU2lnbmF0dXJlKG9wdGlvbnMsIGVuYykge1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFNpZ25hdHVyZSlcbiAgICByZXR1cm4gb3B0aW9ucztcblxuICBpZiAodGhpcy5faW1wb3J0REVSKG9wdGlvbnMsIGVuYykpXG4gICAgcmV0dXJuO1xuXG4gIGFzc2VydCQ0KG9wdGlvbnMuciAmJiBvcHRpb25zLnMsICdTaWduYXR1cmUgd2l0aG91dCByIG9yIHMnKTtcbiAgdGhpcy5yID0gbmV3IEJOKG9wdGlvbnMuciwgMTYpO1xuICB0aGlzLnMgPSBuZXcgQk4ob3B0aW9ucy5zLCAxNik7XG4gIGlmIChvcHRpb25zLnJlY292ZXJ5UGFyYW0gPT09IHVuZGVmaW5lZClcbiAgICB0aGlzLnJlY292ZXJ5UGFyYW0gPSBudWxsO1xuICBlbHNlXG4gICAgdGhpcy5yZWNvdmVyeVBhcmFtID0gb3B0aW9ucy5yZWNvdmVyeVBhcmFtO1xufVxudmFyIHNpZ25hdHVyZSA9IFNpZ25hdHVyZTtcblxuZnVuY3Rpb24gUG9zaXRpb24oKSB7XG4gIHRoaXMucGxhY2UgPSAwO1xufVxuXG5mdW5jdGlvbiBnZXRMZW5ndGgoYnVmLCBwKSB7XG4gIHZhciBpbml0aWFsID0gYnVmW3AucGxhY2UrK107XG4gIGlmICghKGluaXRpYWwgJiAweDgwKSkge1xuICAgIHJldHVybiBpbml0aWFsO1xuICB9XG4gIHZhciBvY3RldExlbiA9IGluaXRpYWwgJiAweGY7XG5cbiAgLy8gSW5kZWZpbml0ZSBsZW5ndGggb3Igb3ZlcmZsb3dcbiAgaWYgKG9jdGV0TGVuID09PSAwIHx8IG9jdGV0TGVuID4gNCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB2YWwgPSAwO1xuICBmb3IgKHZhciBpID0gMCwgb2ZmID0gcC5wbGFjZTsgaSA8IG9jdGV0TGVuOyBpKyssIG9mZisrKSB7XG4gICAgdmFsIDw8PSA4O1xuICAgIHZhbCB8PSBidWZbb2ZmXTtcbiAgICB2YWwgPj4+PSAwO1xuICB9XG5cbiAgLy8gTGVhZGluZyB6ZXJvZXNcbiAgaWYgKHZhbCA8PSAweDdmKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcC5wbGFjZSA9IG9mZjtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gcm1QYWRkaW5nKGJ1Zikge1xuICB2YXIgaSA9IDA7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoIC0gMTtcbiAgd2hpbGUgKCFidWZbaV0gJiYgIShidWZbaSArIDFdICYgMHg4MCkgJiYgaSA8IGxlbikge1xuICAgIGkrKztcbiAgfVxuICBpZiAoaSA9PT0gMCkge1xuICAgIHJldHVybiBidWY7XG4gIH1cbiAgcmV0dXJuIGJ1Zi5zbGljZShpKTtcbn1cblxuU2lnbmF0dXJlLnByb3RvdHlwZS5faW1wb3J0REVSID0gZnVuY3Rpb24gX2ltcG9ydERFUihkYXRhLCBlbmMpIHtcbiAgZGF0YSA9IHV0aWxzXzEkMS50b0FycmF5KGRhdGEsIGVuYyk7XG4gIHZhciBwID0gbmV3IFBvc2l0aW9uKCk7XG4gIGlmIChkYXRhW3AucGxhY2UrK10gIT09IDB4MzApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKGxlbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKChsZW4gKyBwLnBsYWNlKSAhPT0gZGF0YS5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcmxlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKHJsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciByID0gZGF0YS5zbGljZShwLnBsYWNlLCBybGVuICsgcC5wbGFjZSk7XG4gIHAucGxhY2UgKz0gcmxlbjtcbiAgaWYgKGRhdGFbcC5wbGFjZSsrXSAhPT0gMHgwMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgc2xlbiA9IGdldExlbmd0aChkYXRhLCBwKTtcbiAgaWYgKHNsZW4gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChkYXRhLmxlbmd0aCAhPT0gc2xlbiArIHAucGxhY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHMgPSBkYXRhLnNsaWNlKHAucGxhY2UsIHNsZW4gKyBwLnBsYWNlKTtcbiAgaWYgKHJbMF0gPT09IDApIHtcbiAgICBpZiAoclsxXSAmIDB4ODApIHtcbiAgICAgIHIgPSByLnNsaWNlKDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMZWFkaW5nIHplcm9lc1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBpZiAoc1swXSA9PT0gMCkge1xuICAgIGlmIChzWzFdICYgMHg4MCkge1xuICAgICAgcyA9IHMuc2xpY2UoMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExlYWRpbmcgemVyb2VzXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5yID0gbmV3IEJOKHIpO1xuICB0aGlzLnMgPSBuZXcgQk4ocyk7XG4gIHRoaXMucmVjb3ZlcnlQYXJhbSA9IG51bGw7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5mdW5jdGlvbiBjb25zdHJ1Y3RMZW5ndGgoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA8IDB4ODApIHtcbiAgICBhcnIucHVzaChsZW4pO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgb2N0ZXRzID0gMSArIChNYXRoLmxvZyhsZW4pIC8gTWF0aC5MTjIgPj4+IDMpO1xuICBhcnIucHVzaChvY3RldHMgfCAweDgwKTtcbiAgd2hpbGUgKC0tb2N0ZXRzKSB7XG4gICAgYXJyLnB1c2goKGxlbiA+Pj4gKG9jdGV0cyA8PCAzKSkgJiAweGZmKTtcbiAgfVxuICBhcnIucHVzaChsZW4pO1xufVxuXG5TaWduYXR1cmUucHJvdG90eXBlLnRvREVSID0gZnVuY3Rpb24gdG9ERVIoZW5jKSB7XG4gIHZhciByID0gdGhpcy5yLnRvQXJyYXkoKTtcbiAgdmFyIHMgPSB0aGlzLnMudG9BcnJheSgpO1xuXG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHJbMF0gJiAweDgwKVxuICAgIHIgPSBbIDAgXS5jb25jYXQocik7XG4gIC8vIFBhZCB2YWx1ZXNcbiAgaWYgKHNbMF0gJiAweDgwKVxuICAgIHMgPSBbIDAgXS5jb25jYXQocyk7XG5cbiAgciA9IHJtUGFkZGluZyhyKTtcbiAgcyA9IHJtUGFkZGluZyhzKTtcblxuICB3aGlsZSAoIXNbMF0gJiYgIShzWzFdICYgMHg4MCkpIHtcbiAgICBzID0gcy5zbGljZSgxKTtcbiAgfVxuICB2YXIgYXJyID0gWyAweDAyIF07XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHIubGVuZ3RoKTtcbiAgYXJyID0gYXJyLmNvbmNhdChyKTtcbiAgYXJyLnB1c2goMHgwMik7XG4gIGNvbnN0cnVjdExlbmd0aChhcnIsIHMubGVuZ3RoKTtcbiAgdmFyIGJhY2tIYWxmID0gYXJyLmNvbmNhdChzKTtcbiAgdmFyIHJlcyA9IFsgMHgzMCBdO1xuICBjb25zdHJ1Y3RMZW5ndGgocmVzLCBiYWNrSGFsZi5sZW5ndGgpO1xuICByZXMgPSByZXMuY29uY2F0KGJhY2tIYWxmKTtcbiAgcmV0dXJuIHV0aWxzXzEkMS5lbmNvZGUocmVzLCBlbmMpO1xufTtcblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuXG5cbnZhciByYW5kID0gLypSaWNNb286ZXRoZXJzOnJlcXVpcmUoYnJvcmFuZCkqLyhmdW5jdGlvbigpIHsgdGhyb3cgbmV3IEVycm9yKCd1bnN1cHBvcnRlZCcpOyB9KTtcbnZhciBhc3NlcnQkNSA9IHV0aWxzXzEkMS5hc3NlcnQ7XG5cblxuXG5cbmZ1bmN0aW9uIEVDKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEVDKSlcbiAgICByZXR1cm4gbmV3IEVDKG9wdGlvbnMpO1xuXG4gIC8vIFNob3J0Y3V0IGBlbGxpcHRpYy5lYyhjdXJ2ZS1uYW1lKWBcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgIGFzc2VydCQ1KE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJ2ZXNfMSwgb3B0aW9ucyksXG4gICAgICAnVW5rbm93biBjdXJ2ZSAnICsgb3B0aW9ucyk7XG5cbiAgICBvcHRpb25zID0gY3VydmVzXzFbb3B0aW9uc107XG4gIH1cblxuICAvLyBTaG9ydGN1dCBmb3IgYGVsbGlwdGljLmVjKGVsbGlwdGljLmN1cnZlcy5jdXJ2ZU5hbWUpYFxuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIGN1cnZlc18xLlByZXNldEN1cnZlKVxuICAgIG9wdGlvbnMgPSB7IGN1cnZlOiBvcHRpb25zIH07XG5cbiAgdGhpcy5jdXJ2ZSA9IG9wdGlvbnMuY3VydmUuY3VydmU7XG4gIHRoaXMubiA9IHRoaXMuY3VydmUubjtcbiAgdGhpcy5uaCA9IHRoaXMubi51c2hybigxKTtcbiAgdGhpcy5nID0gdGhpcy5jdXJ2ZS5nO1xuXG4gIC8vIFBvaW50IG9uIGN1cnZlXG4gIHRoaXMuZyA9IG9wdGlvbnMuY3VydmUuZztcbiAgdGhpcy5nLnByZWNvbXB1dGUob3B0aW9ucy5jdXJ2ZS5uLmJpdExlbmd0aCgpICsgMSk7XG5cbiAgLy8gSGFzaCBmb3IgZnVuY3Rpb24gZm9yIERSQkdcbiAgdGhpcy5oYXNoID0gb3B0aW9ucy5oYXNoIHx8IG9wdGlvbnMuY3VydmUuaGFzaDtcbn1cbnZhciBlYyA9IEVDO1xuXG5FQy5wcm90b3R5cGUua2V5UGFpciA9IGZ1bmN0aW9uIGtleVBhaXIob3B0aW9ucykge1xuICByZXR1cm4gbmV3IGtleSh0aGlzLCBvcHRpb25zKTtcbn07XG5cbkVDLnByb3RvdHlwZS5rZXlGcm9tUHJpdmF0ZSA9IGZ1bmN0aW9uIGtleUZyb21Qcml2YXRlKHByaXYsIGVuYykge1xuICByZXR1cm4ga2V5LmZyb21Qcml2YXRlKHRoaXMsIHByaXYsIGVuYyk7XG59O1xuXG5FQy5wcm90b3R5cGUua2V5RnJvbVB1YmxpYyA9IGZ1bmN0aW9uIGtleUZyb21QdWJsaWMocHViLCBlbmMpIHtcbiAgcmV0dXJuIGtleS5mcm9tUHVibGljKHRoaXMsIHB1YiwgZW5jKTtcbn07XG5cbkVDLnByb3RvdHlwZS5nZW5LZXlQYWlyID0gZnVuY3Rpb24gZ2VuS2V5UGFpcihvcHRpb25zKSB7XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAgLy8gSW5zdGFudGlhdGUgSG1hY19EUkJHXG4gIHZhciBkcmJnID0gbmV3IGhtYWNEcmJnKHtcbiAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgcGVyczogb3B0aW9ucy5wZXJzLFxuICAgIHBlcnNFbmM6IG9wdGlvbnMucGVyc0VuYyB8fCAndXRmOCcsXG4gICAgZW50cm9weTogb3B0aW9ucy5lbnRyb3B5IHx8IHJhbmQodGhpcy5oYXNoLmhtYWNTdHJlbmd0aCksXG4gICAgZW50cm9weUVuYzogb3B0aW9ucy5lbnRyb3B5ICYmIG9wdGlvbnMuZW50cm9weUVuYyB8fCAndXRmOCcsXG4gICAgbm9uY2U6IHRoaXMubi50b0FycmF5KCksXG4gIH0pO1xuXG4gIHZhciBieXRlcyA9IHRoaXMubi5ieXRlTGVuZ3RoKCk7XG4gIHZhciBuczIgPSB0aGlzLm4uc3ViKG5ldyBCTigyKSk7XG4gIGZvciAoOzspIHtcbiAgICB2YXIgcHJpdiA9IG5ldyBCTihkcmJnLmdlbmVyYXRlKGJ5dGVzKSk7XG4gICAgaWYgKHByaXYuY21wKG5zMikgPiAwKVxuICAgICAgY29udGludWU7XG5cbiAgICBwcml2LmlhZGRuKDEpO1xuICAgIHJldHVybiB0aGlzLmtleUZyb21Qcml2YXRlKHByaXYpO1xuICB9XG59O1xuXG5FQy5wcm90b3R5cGUuX3RydW5jYXRlVG9OID0gZnVuY3Rpb24gX3RydW5jYXRlVG9OKG1zZywgdHJ1bmNPbmx5KSB7XG4gIHZhciBkZWx0YSA9IG1zZy5ieXRlTGVuZ3RoKCkgKiA4IC0gdGhpcy5uLmJpdExlbmd0aCgpO1xuICBpZiAoZGVsdGEgPiAwKVxuICAgIG1zZyA9IG1zZy51c2hybihkZWx0YSk7XG4gIGlmICghdHJ1bmNPbmx5ICYmIG1zZy5jbXAodGhpcy5uKSA+PSAwKVxuICAgIHJldHVybiBtc2cuc3ViKHRoaXMubik7XG4gIGVsc2VcbiAgICByZXR1cm4gbXNnO1xufTtcblxuRUMucHJvdG90eXBlLnNpZ24gPSBmdW5jdGlvbiBzaWduKG1zZywga2V5LCBlbmMsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBlbmMgPT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IGVuYztcbiAgICBlbmMgPSBudWxsO1xuICB9XG4gIGlmICghb3B0aW9ucylcbiAgICBvcHRpb25zID0ge307XG5cbiAga2V5ID0gdGhpcy5rZXlGcm9tUHJpdmF0ZShrZXksIGVuYyk7XG4gIG1zZyA9IHRoaXMuX3RydW5jYXRlVG9OKG5ldyBCTihtc2csIDE2KSk7XG5cbiAgLy8gWmVyby1leHRlbmQga2V5IHRvIHByb3ZpZGUgZW5vdWdoIGVudHJvcHlcbiAgdmFyIGJ5dGVzID0gdGhpcy5uLmJ5dGVMZW5ndGgoKTtcbiAgdmFyIGJrZXkgPSBrZXkuZ2V0UHJpdmF0ZSgpLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIFplcm8tZXh0ZW5kIG5vbmNlIHRvIGhhdmUgdGhlIHNhbWUgYnl0ZSBzaXplIGFzIE5cbiAgdmFyIG5vbmNlID0gbXNnLnRvQXJyYXkoJ2JlJywgYnl0ZXMpO1xuXG4gIC8vIEluc3RhbnRpYXRlIEhtYWNfRFJCR1xuICB2YXIgZHJiZyA9IG5ldyBobWFjRHJiZyh7XG4gICAgaGFzaDogdGhpcy5oYXNoLFxuICAgIGVudHJvcHk6IGJrZXksXG4gICAgbm9uY2U6IG5vbmNlLFxuICAgIHBlcnM6IG9wdGlvbnMucGVycyxcbiAgICBwZXJzRW5jOiBvcHRpb25zLnBlcnNFbmMgfHwgJ3V0ZjgnLFxuICB9KTtcblxuICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGVcbiAgdmFyIG5zMSA9IHRoaXMubi5zdWIobmV3IEJOKDEpKTtcblxuICBmb3IgKHZhciBpdGVyID0gMDsgOyBpdGVyKyspIHtcbiAgICB2YXIgayA9IG9wdGlvbnMuayA/XG4gICAgICBvcHRpb25zLmsoaXRlcikgOlxuICAgICAgbmV3IEJOKGRyYmcuZ2VuZXJhdGUodGhpcy5uLmJ5dGVMZW5ndGgoKSkpO1xuICAgIGsgPSB0aGlzLl90cnVuY2F0ZVRvTihrLCB0cnVlKTtcbiAgICBpZiAoay5jbXBuKDEpIDw9IDAgfHwgay5jbXAobnMxKSA+PSAwKVxuICAgICAgY29udGludWU7XG5cbiAgICB2YXIga3AgPSB0aGlzLmcubXVsKGspO1xuICAgIGlmIChrcC5pc0luZmluaXR5KCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBrcFggPSBrcC5nZXRYKCk7XG4gICAgdmFyIHIgPSBrcFgudW1vZCh0aGlzLm4pO1xuICAgIGlmIChyLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciBzID0gay5pbnZtKHRoaXMubikubXVsKHIubXVsKGtleS5nZXRQcml2YXRlKCkpLmlhZGQobXNnKSk7XG4gICAgcyA9IHMudW1vZCh0aGlzLm4pO1xuICAgIGlmIChzLmNtcG4oMCkgPT09IDApXG4gICAgICBjb250aW51ZTtcblxuICAgIHZhciByZWNvdmVyeVBhcmFtID0gKGtwLmdldFkoKS5pc09kZCgpID8gMSA6IDApIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChrcFguY21wKHIpICE9PSAwID8gMiA6IDApO1xuXG4gICAgLy8gVXNlIGNvbXBsZW1lbnQgb2YgYHNgLCBpZiBpdCBpcyA+IGBuIC8gMmBcbiAgICBpZiAob3B0aW9ucy5jYW5vbmljYWwgJiYgcy5jbXAodGhpcy5uaCkgPiAwKSB7XG4gICAgICBzID0gdGhpcy5uLnN1YihzKTtcbiAgICAgIHJlY292ZXJ5UGFyYW0gXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IHNpZ25hdHVyZSh7IHI6IHIsIHM6IHMsIHJlY292ZXJ5UGFyYW06IHJlY292ZXJ5UGFyYW0gfSk7XG4gIH1cbn07XG5cbkVDLnByb3RvdHlwZS52ZXJpZnkgPSBmdW5jdGlvbiB2ZXJpZnkobXNnLCBzaWduYXR1cmUkMSwga2V5LCBlbmMpIHtcbiAgbXNnID0gdGhpcy5fdHJ1bmNhdGVUb04obmV3IEJOKG1zZywgMTYpKTtcbiAga2V5ID0gdGhpcy5rZXlGcm9tUHVibGljKGtleSwgZW5jKTtcbiAgc2lnbmF0dXJlJDEgPSBuZXcgc2lnbmF0dXJlKHNpZ25hdHVyZSQxLCAnaGV4Jyk7XG5cbiAgLy8gUGVyZm9ybSBwcmltaXRpdmUgdmFsdWVzIHZhbGlkYXRpb25cbiAgdmFyIHIgPSBzaWduYXR1cmUkMS5yO1xuICB2YXIgcyA9IHNpZ25hdHVyZSQxLnM7XG4gIGlmIChyLmNtcG4oMSkgPCAwIHx8IHIuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChzLmNtcG4oMSkgPCAwIHx8IHMuY21wKHRoaXMubikgPj0gMClcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gVmFsaWRhdGUgc2lnbmF0dXJlXG4gIHZhciBzaW52ID0gcy5pbnZtKHRoaXMubik7XG4gIHZhciB1MSA9IHNpbnYubXVsKG1zZykudW1vZCh0aGlzLm4pO1xuICB2YXIgdTIgPSBzaW52Lm11bChyKS51bW9kKHRoaXMubik7XG4gIHZhciBwO1xuXG4gIGlmICghdGhpcy5jdXJ2ZS5fbWF4d2VsbFRyaWNrKSB7XG4gICAgcCA9IHRoaXMuZy5tdWxBZGQodTEsIGtleS5nZXRQdWJsaWMoKSwgdTIpO1xuICAgIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBwLmdldFgoKS51bW9kKHRoaXMubikuY21wKHIpID09PSAwO1xuICB9XG5cbiAgLy8gTk9URTogR3JlZyBNYXh3ZWxsJ3MgdHJpY2ssIGluc3BpcmVkIGJ5OlxuICAvLyBodHRwczovL2dpdC5pby92YWQzS1xuXG4gIHAgPSB0aGlzLmcuam11bEFkZCh1MSwga2V5LmdldFB1YmxpYygpLCB1Mik7XG4gIGlmIChwLmlzSW5maW5pdHkoKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ29tcGFyZSBgcC54YCBvZiBKYWNvYmlhbiBwb2ludCB3aXRoIGByYCxcbiAgLy8gdGhpcyB3aWxsIGRvIGBwLnggPT0gciAqIHAuel4yYCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGBwLnhgIGJ5IHRoZVxuICAvLyBpbnZlcnNlIG9mIGBwLnpeMmBcbiAgcmV0dXJuIHAuZXFYVG9QKHIpO1xufTtcblxuRUMucHJvdG90eXBlLnJlY292ZXJQdWJLZXkgPSBmdW5jdGlvbihtc2csIHNpZ25hdHVyZSQxLCBqLCBlbmMpIHtcbiAgYXNzZXJ0JDUoKDMgJiBqKSA9PT0gaiwgJ1RoZSByZWNvdmVyeSBwYXJhbSBpcyBtb3JlIHRoYW4gdHdvIGJpdHMnKTtcbiAgc2lnbmF0dXJlJDEgPSBuZXcgc2lnbmF0dXJlKHNpZ25hdHVyZSQxLCBlbmMpO1xuXG4gIHZhciBuID0gdGhpcy5uO1xuICB2YXIgZSA9IG5ldyBCTihtc2cpO1xuICB2YXIgciA9IHNpZ25hdHVyZSQxLnI7XG4gIHZhciBzID0gc2lnbmF0dXJlJDEucztcblxuICAvLyBBIHNldCBMU0Igc2lnbmlmaWVzIHRoYXQgdGhlIHktY29vcmRpbmF0ZSBpcyBvZGRcbiAgdmFyIGlzWU9kZCA9IGogJiAxO1xuICB2YXIgaXNTZWNvbmRLZXkgPSBqID4+IDE7XG4gIGlmIChyLmNtcCh0aGlzLmN1cnZlLnAudW1vZCh0aGlzLmN1cnZlLm4pKSA+PSAwICYmIGlzU2Vjb25kS2V5KVxuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGZpbmQgc2VuY29uZCBrZXkgY2FuZGluYXRlJyk7XG5cbiAgLy8gMS4xLiBMZXQgeCA9IHIgKyBqbi5cbiAgaWYgKGlzU2Vjb25kS2V5KVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgoci5hZGQodGhpcy5jdXJ2ZS5uKSwgaXNZT2RkKTtcbiAgZWxzZVxuICAgIHIgPSB0aGlzLmN1cnZlLnBvaW50RnJvbVgociwgaXNZT2RkKTtcblxuICB2YXIgckludiA9IHNpZ25hdHVyZSQxLnIuaW52bShuKTtcbiAgdmFyIHMxID0gbi5zdWIoZSkubXVsKHJJbnYpLnVtb2Qobik7XG4gIHZhciBzMiA9IHMubXVsKHJJbnYpLnVtb2Qobik7XG5cbiAgLy8gMS42LjEgQ29tcHV0ZSBRID0gcl4tMSAoc1IgLSAgZUcpXG4gIC8vICAgICAgICAgICAgICAgUSA9IHJeLTEgKHNSICsgLWVHKVxuICByZXR1cm4gdGhpcy5nLm11bEFkZChzMSwgciwgczIpO1xufTtcblxuRUMucHJvdG90eXBlLmdldEtleVJlY292ZXJ5UGFyYW0gPSBmdW5jdGlvbihlLCBzaWduYXR1cmUkMSwgUSwgZW5jKSB7XG4gIHNpZ25hdHVyZSQxID0gbmV3IHNpZ25hdHVyZShzaWduYXR1cmUkMSwgZW5jKTtcbiAgaWYgKHNpZ25hdHVyZSQxLnJlY292ZXJ5UGFyYW0gIT09IG51bGwpXG4gICAgcmV0dXJuIHNpZ25hdHVyZSQxLnJlY292ZXJ5UGFyYW07XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICB2YXIgUXByaW1lO1xuICAgIHRyeSB7XG4gICAgICBRcHJpbWUgPSB0aGlzLnJlY292ZXJQdWJLZXkoZSwgc2lnbmF0dXJlJDEsIGkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChRcHJpbWUuZXEoUSkpXG4gICAgICByZXR1cm4gaTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIHZhbGlkIHJlY292ZXJ5IGZhY3RvcicpO1xufTtcblxudmFyIGVsbGlwdGljXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbGxpcHRpYyA9IGV4cG9ydHM7XG5cbmVsbGlwdGljLnZlcnNpb24gPSAvKlJpY01vbzpldGhlcnMqL3sgdmVyc2lvbjogXCI2LjUuNFwiIH0udmVyc2lvbjtcbmVsbGlwdGljLnV0aWxzID0gdXRpbHNfMSQxO1xuZWxsaXB0aWMucmFuZCA9IC8qUmljTW9vOmV0aGVyczpyZXF1aXJlKGJyb3JhbmQpKi8oZnVuY3Rpb24oKSB7IHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQnKTsgfSk7XG5lbGxpcHRpYy5jdXJ2ZSA9IGN1cnZlXzE7XG5lbGxpcHRpYy5jdXJ2ZXMgPSBjdXJ2ZXNfMTtcblxuLy8gUHJvdG9jb2xzXG5lbGxpcHRpYy5lYyA9IGVjO1xuZWxsaXB0aWMuZWRkc2EgPSAvKlJpY01vbzpldGhlcnM6cmVxdWlyZSguL2VsbGlwdGljL2VkZHNhKSovKG51bGwpO1xufSk7XG5cbnZhciBFQyQxID0gZWxsaXB0aWNfMS5lYztcblxuZXhwb3J0IHsgRUMkMSBhcyBFQyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YnJvd3Nlci1lbGxpcHRpYy5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgRUMgfSBmcm9tIFwiLi9lbGxpcHRpY1wiO1xuaW1wb3J0IHsgYXJyYXlpZnksIGhleGxpZnksIGhleFplcm9QYWQsIHNwbGl0U2lnbmF0dXJlIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9wcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5sZXQgX2N1cnZlID0gbnVsbDtcbmZ1bmN0aW9uIGdldEN1cnZlKCkge1xuICAgIGlmICghX2N1cnZlKSB7XG4gICAgICAgIF9jdXJ2ZSA9IG5ldyBFQyhcInNlY3AyNTZrMVwiKTtcbiAgICB9XG4gICAgcmV0dXJuIF9jdXJ2ZTtcbn1cbmV4cG9ydCBjbGFzcyBTaWduaW5nS2V5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlS2V5KSB7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiY3VydmVcIiwgXCJzZWNwMjU2azFcIik7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHJpdmF0ZUtleVwiLCBoZXhsaWZ5KHByaXZhdGVLZXkpKTtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IGdldEN1cnZlKCkua2V5RnJvbVByaXZhdGUoYXJyYXlpZnkodGhpcy5wcml2YXRlS2V5KSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHVibGljS2V5XCIsIFwiMHhcIiArIGtleVBhaXIuZ2V0UHVibGljKGZhbHNlLCBcImhleFwiKSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiY29tcHJlc3NlZFB1YmxpY0tleVwiLCBcIjB4XCIgKyBrZXlQYWlyLmdldFB1YmxpYyh0cnVlLCBcImhleFwiKSk7XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX2lzU2lnbmluZ0tleVwiLCB0cnVlKTtcbiAgICB9XG4gICAgX2FkZFBvaW50KG90aGVyKSB7XG4gICAgICAgIGNvbnN0IHAwID0gZ2V0Q3VydmUoKS5rZXlGcm9tUHVibGljKGFycmF5aWZ5KHRoaXMucHVibGljS2V5KSk7XG4gICAgICAgIGNvbnN0IHAxID0gZ2V0Q3VydmUoKS5rZXlGcm9tUHVibGljKGFycmF5aWZ5KG90aGVyKSk7XG4gICAgICAgIHJldHVybiBcIjB4XCIgKyBwMC5wdWIuYWRkKHAxLnB1YikuZW5jb2RlQ29tcHJlc3NlZChcImhleFwiKTtcbiAgICB9XG4gICAgc2lnbkRpZ2VzdChkaWdlc3QpIHtcbiAgICAgICAgY29uc3Qga2V5UGFpciA9IGdldEN1cnZlKCkua2V5RnJvbVByaXZhdGUoYXJyYXlpZnkodGhpcy5wcml2YXRlS2V5KSk7XG4gICAgICAgIGNvbnN0IGRpZ2VzdEJ5dGVzID0gYXJyYXlpZnkoZGlnZXN0KTtcbiAgICAgICAgaWYgKGRpZ2VzdEJ5dGVzLmxlbmd0aCAhPT0gMzIpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJiYWQgZGlnZXN0IGxlbmd0aFwiLCBcImRpZ2VzdFwiLCBkaWdlc3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGtleVBhaXIuc2lnbihkaWdlc3RCeXRlcywgeyBjYW5vbmljYWw6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBzcGxpdFNpZ25hdHVyZSh7XG4gICAgICAgICAgICByZWNvdmVyeVBhcmFtOiBzaWduYXR1cmUucmVjb3ZlcnlQYXJhbSxcbiAgICAgICAgICAgIHI6IGhleFplcm9QYWQoXCIweFwiICsgc2lnbmF0dXJlLnIudG9TdHJpbmcoMTYpLCAzMiksXG4gICAgICAgICAgICBzOiBoZXhaZXJvUGFkKFwiMHhcIiArIHNpZ25hdHVyZS5zLnRvU3RyaW5nKDE2KSwgMzIpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29tcHV0ZVNoYXJlZFNlY3JldChvdGhlcktleSkge1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gZ2V0Q3VydmUoKS5rZXlGcm9tUHJpdmF0ZShhcnJheWlmeSh0aGlzLnByaXZhdGVLZXkpKTtcbiAgICAgICAgY29uc3Qgb3RoZXJLZXlQYWlyID0gZ2V0Q3VydmUoKS5rZXlGcm9tUHVibGljKGFycmF5aWZ5KGNvbXB1dGVQdWJsaWNLZXkob3RoZXJLZXkpKSk7XG4gICAgICAgIHJldHVybiBoZXhaZXJvUGFkKFwiMHhcIiArIGtleVBhaXIuZGVyaXZlKG90aGVyS2V5UGFpci5nZXRQdWJsaWMoKSkudG9TdHJpbmcoMTYpLCAzMik7XG4gICAgfVxuICAgIHN0YXRpYyBpc1NpZ25pbmdLZXkodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9pc1NpZ25pbmdLZXkpO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiByZWNvdmVyUHVibGljS2V5KGRpZ2VzdCwgc2lnbmF0dXJlKSB7XG4gICAgY29uc3Qgc2lnID0gc3BsaXRTaWduYXR1cmUoc2lnbmF0dXJlKTtcbiAgICBjb25zdCBycyA9IHsgcjogYXJyYXlpZnkoc2lnLnIpLCBzOiBhcnJheWlmeShzaWcucykgfTtcbiAgICByZXR1cm4gXCIweFwiICsgZ2V0Q3VydmUoKS5yZWNvdmVyUHViS2V5KGFycmF5aWZ5KGRpZ2VzdCksIHJzLCBzaWcucmVjb3ZlcnlQYXJhbSkuZW5jb2RlKFwiaGV4XCIsIGZhbHNlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUHVibGljS2V5KGtleSwgY29tcHJlc3NlZCkge1xuICAgIGNvbnN0IGJ5dGVzID0gYXJyYXlpZnkoa2V5KTtcbiAgICBpZiAoYnl0ZXMubGVuZ3RoID09PSAzMikge1xuICAgICAgICBjb25zdCBzaWduaW5nS2V5ID0gbmV3IFNpZ25pbmdLZXkoYnl0ZXMpO1xuICAgICAgICBpZiAoY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFwiMHhcIiArIGdldEN1cnZlKCkua2V5RnJvbVByaXZhdGUoYnl0ZXMpLmdldFB1YmxpYyh0cnVlLCBcImhleFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2lnbmluZ0tleS5wdWJsaWNLZXk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMzMpIHtcbiAgICAgICAgaWYgKGNvbXByZXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoZXhsaWZ5KGJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIweFwiICsgZ2V0Q3VydmUoKS5rZXlGcm9tUHVibGljKGJ5dGVzKS5nZXRQdWJsaWMoZmFsc2UsIFwiaGV4XCIpO1xuICAgIH1cbiAgICBlbHNlIGlmIChieXRlcy5sZW5ndGggPT09IDY1KSB7XG4gICAgICAgIGlmICghY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhleGxpZnkoYnl0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIjB4XCIgKyBnZXRDdXJ2ZSgpLmtleUZyb21QdWJsaWMoYnl0ZXMpLmdldFB1YmxpYyh0cnVlLCBcImhleFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIHB1YmxpYyBvciBwcml2YXRlIGtleVwiLCBcImtleVwiLCBcIltSRURBQ1RFRF1cIik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IEJpZ051bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBjb25jYXQsIGhleGxpZnksIHplcm9QYWQgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IGtlY2NhazI1NiBhcyBoYXNoS2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgc2hhMjU2IGFzIGhhc2hTaGEyNTYgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc2hhMlwiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuY29uc3QgcmVnZXhCeXRlcyA9IG5ldyBSZWdFeHAoXCJeYnl0ZXMoWzAtOV0rKSRcIik7XG5jb25zdCByZWdleE51bWJlciA9IG5ldyBSZWdFeHAoXCJeKHU/aW50KShbMC05XSopJFwiKTtcbmNvbnN0IHJlZ2V4QXJyYXkgPSBuZXcgUmVnRXhwKFwiXiguKilcXFxcWyhbMC05XSopXFxcXF0kXCIpO1xuY29uc3QgWmVyb3MgPSBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIjtcbmZ1bmN0aW9uIF9wYWNrKHR5cGUsIHZhbHVlLCBpc0FycmF5KSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvUGFkKHZhbHVlLCAzMik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYXJyYXlpZnkodmFsdWUpO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gdG9VdGY4Qnl0ZXModmFsdWUpO1xuICAgICAgICBjYXNlIFwiYnl0ZXNcIjpcbiAgICAgICAgICAgIHJldHVybiBhcnJheWlmeSh2YWx1ZSk7XG4gICAgICAgIGNhc2UgXCJib29sXCI6XG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA/IFwiMHgwMVwiIDogXCIweDAwXCIpO1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gemVyb1BhZCh2YWx1ZSwgMzIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFycmF5aWZ5KHZhbHVlKTtcbiAgICB9XG4gICAgbGV0IG1hdGNoID0gdHlwZS5tYXRjaChyZWdleE51bWJlcik7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIC8vbGV0IHNpZ25lZCA9IChtYXRjaFsxXSA9PT0gXCJpbnRcIilcbiAgICAgICAgbGV0IHNpemUgPSBwYXJzZUludChtYXRjaFsyXSB8fCBcIjI1NlwiKTtcbiAgICAgICAgaWYgKChtYXRjaFsyXSAmJiBTdHJpbmcoc2l6ZSkgIT09IG1hdGNoWzJdKSB8fCAoc2l6ZSAlIDggIT09IDApIHx8IHNpemUgPT09IDAgfHwgc2l6ZSA+IDI1Nikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBudW1iZXIgdHlwZSAtIFwiICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkpIHtcbiAgICAgICAgICAgIHNpemUgPSAyNTY7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSBCaWdOdW1iZXIuZnJvbSh2YWx1ZSkudG9Ud29zKHNpemUpO1xuICAgICAgICByZXR1cm4gemVyb1BhZCh2YWx1ZSwgc2l6ZSAvIDgpO1xuICAgIH1cbiAgICBtYXRjaCA9IHR5cGUubWF0Y2gocmVnZXhCeXRlcyk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGlmIChTdHJpbmcoc2l6ZSkgIT09IG1hdGNoWzFdIHx8IHNpemUgPT09IDAgfHwgc2l6ZSA+IDMyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGJ5dGVzIHR5cGUgLSBcIiArIHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcnJheWlmeSh2YWx1ZSkuYnl0ZUxlbmd0aCAhPT0gc2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB2YWx1ZSBmb3IgXCIgKyB0eXBlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5aWZ5KCh2YWx1ZSArIFplcm9zKS5zdWJzdHJpbmcoMCwgNjYpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIG1hdGNoID0gdHlwZS5tYXRjaChyZWdleEFycmF5KTtcbiAgICBpZiAobWF0Y2ggJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgYmFzZVR5cGUgPSBtYXRjaFsxXTtcbiAgICAgICAgY29uc3QgY291bnQgPSBwYXJzZUludChtYXRjaFsyXSB8fCBTdHJpbmcodmFsdWUubGVuZ3RoKSk7XG4gICAgICAgIGlmIChjb3VudCAhPSB2YWx1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgdmFsdWUgZm9yIFwiICsgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChfcGFjayhiYXNlVHlwZSwgdmFsdWUsIHRydWUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb25jYXQocmVzdWx0KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB0eXBlIC0gXCIgKyB0eXBlKTtcbn1cbi8vIEBUT0RPOiBBcnJheSBFbnVtXG5leHBvcnQgZnVuY3Rpb24gcGFjayh0eXBlcywgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVzLmxlbmd0aCAhPSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInR5cGUvdmFsdWUgY291bnQgbWlzbWF0Y2hcIik7XG4gICAgfVxuICAgIGNvbnN0IHRpZ2h0ID0gW107XG4gICAgdHlwZXMuZm9yRWFjaChmdW5jdGlvbiAodHlwZSwgaW5kZXgpIHtcbiAgICAgICAgdGlnaHQucHVzaChfcGFjayh0eXBlLCB2YWx1ZXNbaW5kZXhdKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGhleGxpZnkoY29uY2F0KHRpZ2h0KSk7XG59XG5leHBvcnQgZnVuY3Rpb24ga2VjY2FrMjU2KHR5cGVzLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gaGFzaEtlY2NhazI1NihwYWNrKHR5cGVzLCB2YWx1ZXMpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzaGEyNTYodHlwZXMsIHZhbHVlcykge1xuICAgIHJldHVybiBoYXNoU2hhMjU2KHBhY2sodHlwZXMsIHZhbHVlcykpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcInN0cmluZ3MvNS4wLjlcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgSGFzaFplcm8gfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgY29uY2F0LCBoZXhsaWZ5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyB0b1V0ZjhCeXRlcywgdG9VdGY4U3RyaW5nIH0gZnJvbSBcIi4vdXRmOFwiO1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ5dGVzMzJTdHJpbmcodGV4dCkge1xuICAgIC8vIEdldCB0aGUgYnl0ZXNcbiAgICBjb25zdCBieXRlcyA9IHRvVXRmOEJ5dGVzKHRleHQpO1xuICAgIC8vIENoZWNrIHdlIGhhdmUgcm9vbSBmb3IgbnVsbC10ZXJtaW5hdGlvblxuICAgIGlmIChieXRlcy5sZW5ndGggPiAzMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJieXRlczMyIHN0cmluZyBtdXN0IGJlIGxlc3MgdGhhbiAzMiBieXRlc1wiKTtcbiAgICB9XG4gICAgLy8gWmVyby1wYWQgKGltcGxpY2l0bHkgbnVsbC10ZXJtaW5hdGVzKVxuICAgIHJldHVybiBoZXhsaWZ5KGNvbmNhdChbYnl0ZXMsIEhhc2haZXJvXSkuc2xpY2UoMCwgMzIpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ5dGVzMzJTdHJpbmcoYnl0ZXMpIHtcbiAgICBjb25zdCBkYXRhID0gYXJyYXlpZnkoYnl0ZXMpO1xuICAgIC8vIE11c3QgYmUgMzIgYnl0ZXMgd2l0aCBhIG51bGwtdGVybWluYXRpb25cbiAgICBpZiAoZGF0YS5sZW5ndGggIT09IDMyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYnl0ZXMzMiAtIG5vdCAzMiBieXRlcyBsb25nXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YVszMV0gIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBieXRlczMyIHN0cmluZyAtIG5vIG51bGwgdGVybWluYXRvclwiKTtcbiAgICB9XG4gICAgLy8gRmluZCB0aGUgbnVsbCB0ZXJtaW5hdGlvblxuICAgIGxldCBsZW5ndGggPSAzMTtcbiAgICB3aGlsZSAoZGF0YVtsZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgICBsZW5ndGgtLTtcbiAgICB9XG4gICAgLy8gRGV0ZXJtaW5lIHRoZSBzdHJpbmcgdmFsdWVcbiAgICByZXR1cm4gdG9VdGY4U3RyaW5nKGRhdGEuc2xpY2UoMCwgbGVuZ3RoKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ieXRlczMyLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgdG9VdGY4Q29kZVBvaW50cywgX3RvVXRmOFN0cmluZywgVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtIH0gZnJvbSBcIi4vdXRmOFwiO1xuZnVuY3Rpb24gYnl0ZXMyKGRhdGEpIHtcbiAgICBpZiAoKGRhdGEubGVuZ3RoICUgNCkgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGRhdGFcIik7XG4gICAgfVxuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoZGF0YS5zdWJzdHJpbmcoaSwgaSArIDQpLCAxNikpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlVGFibGUoZGF0YSwgZnVuYykge1xuICAgIGlmICghZnVuYykge1xuICAgICAgICBmdW5jID0gZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBbcGFyc2VJbnQodmFsdWUsIDE2KV07IH07XG4gICAgfVxuICAgIGxldCBsbyA9IDA7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGRhdGEuc3BsaXQoXCIsXCIpLmZvckVhY2goKHBhaXIpID0+IHtcbiAgICAgICAgbGV0IGNvbXBzID0gcGFpci5zcGxpdChcIjpcIik7XG4gICAgICAgIGxvICs9IHBhcnNlSW50KGNvbXBzWzBdLCAxNik7XG4gICAgICAgIHJlc3VsdFtsb10gPSBmdW5jKGNvbXBzWzFdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlUmFuZ2VUYWJsZShkYXRhKSB7XG4gICAgbGV0IGhpID0gMDtcbiAgICByZXR1cm4gZGF0YS5zcGxpdChcIixcIikubWFwKCh2KSA9PiB7XG4gICAgICAgIGxldCBjb21wcyA9IHYuc3BsaXQoXCItXCIpO1xuICAgICAgICBpZiAoY29tcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb21wc1sxXSA9IFwiMFwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbXBzWzFdID09PSBcIlwiKSB7XG4gICAgICAgICAgICBjb21wc1sxXSA9IFwiMVwiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsbyA9IGhpICsgcGFyc2VJbnQoY29tcHNbMF0sIDE2KTtcbiAgICAgICAgaGkgPSBwYXJzZUludChjb21wc1sxXSwgMTYpO1xuICAgICAgICByZXR1cm4geyBsOiBsbywgaDogaGkgfTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG1hdGNoTWFwKHZhbHVlLCByYW5nZXMpIHtcbiAgICBsZXQgbG8gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByYW5nZSA9IHJhbmdlc1tpXTtcbiAgICAgICAgbG8gKz0gcmFuZ2UubDtcbiAgICAgICAgaWYgKHZhbHVlID49IGxvICYmIHZhbHVlIDw9IGxvICsgcmFuZ2UuaCAmJiAoKHZhbHVlIC0gbG8pICUgKHJhbmdlLmQgfHwgMSkpID09PSAwKSB7XG4gICAgICAgICAgICBpZiAocmFuZ2UuZSAmJiByYW5nZS5lLmluZGV4T2YodmFsdWUgLSBsbykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmFuZ2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5jb25zdCBUYWJsZV9BXzFfcmFuZ2VzID0gY3JlYXRlUmFuZ2VUYWJsZShcIjIyMSwxMy0xYiw1Zi0sNDAtMTAsNTEtZiwxMS0zLDMtMywyLTIsMi00LDgsMiwxNSwyZCwyOC04LDg4LDQ4LDI3LSwzLTUsMTEtMjAsMjctLDgsMjgsMy01LDEyLDE4LGItYSwxYy00LDYtMTYsMi1kLDItMiwyLDFiLTQsMTctOSw4Zi0sMTAsZiwxZi0yLDFjLTM0LDMzLTE0ZSw0LDM2LSwxMy0sNi0yLDFhLWYsNCw5LSwzLSwxNyw4LDItMiw1LSwyLDgtLDMtLDQtOCwyLTMsMyw2LSwxNi02LDItLDctMywzLSwxNyw4LDMsMywzLSwyLDYtMywzLSw0LWEsNSwyLTYsMTAtYiw0LDgsMiw0LDE3LDgsMyw2LSxiLDQsNC0sMi1lLDItNCxiLTEwLDQsOS0sMy0sMTcsOCwzLSw1LSw5LTIsMy0sNC03LDMtMywzLDQtMyxjLTEwLDMsNy0yLDQsNS0yLDMsMiwzLTIsMy0yLDQtMiw5LDQtMyw2LTIsNCw1LTgsMi1lLGQtZCw0LDksNCwxOCxiLDYtMyw4LDQsNS02LDMtOCwzLTMsYi0xMSwzLDksNCwxOCxiLDYtMyw4LDQsNS02LDMtNiwyLDMtMyxiLTExLDMsOSw0LDE4LDExLTMsNy0sNCw1LTgsMi03LDMtMyxiLTExLDMsMTMtMiwxOSxhLDItLDgtMiwyLTMsNywyLDktMTEsNC1iLDNiLTMsMWUtMjQsMywyLSwzLDItLDItNSw1LDgsNCwyLDItLDMsZSw0LSw2LDIsNy0sYi0sMy0yMSw0OSwyMy01LDFjLTMsOSwyNSwxMC0sMi0yZiwyMyw2LDMsOC0yLDUtNSwxYi00NSwyNy05LDJhLSwyLTMsNWItNCw0NS00LDUzLTUsOCw0MCwyLDUtLDgsMiw1LSwyOCwyLDUtLDIwLDIsNS0sOCwyLDUtLDgsOCwxOCwyMCwyLDUtLDgsMjgsMTQtNSwxZC0yMiw1Ni1iLDI3Ny04LDFlLTIsNTItZSxlLDgtYSwxOC04LDE1LWIsZSw0LDMtYiw1ZS0yLGItMTUsMTAsYi01LDU5LTcsMmItNTU1LDlkLTMsNWItNSwxNy0sNy0sMjctLDctLDksMiwyLDIsMjAtLDM2LDEwLGYtLDcsMTQtLDQsYSw1NC0zLDItNiw2LTUsOS0sMWMtMTAsMTMtMWQsMWMtMTQsM2MtLDEwLTYsMzItYiwyNDAtMzAsMjgtMTgsYy0xNCxhMCwxMTUtLDMsNjYtLGItNzYsNSw1LSwxZCwyNCwyLDUtMiwyLDgtLDM1LTIsMTksZi0xMCwxZC0zLDMxMS0zN2YsMWIsNWEtYixkNy0xOSxkLTMsNDEsNTctLDY4LTQsMjktMyw1ZiwyOS0zNywyZS0yLDI1LWMsMmMtMiw0ZS0zLDMwLDc4LTMsNjQtLDIwLDE5YjctNDksNTFhNy01OSw0OGUtMiwzOC03MzgsMmJhNS01YiwyMjJmLSwzYy05NCw4LWIsNi00LDFiLDYsMiwzLDMsNmQtMjAsMTZlLWYsNDEtLDM3LTcsMmUtMiwxMS1mLDUtYiwxOC0sYiwxNCw1LTMsNiw4OC0sMixiZi0yLDctLDctLDctLDQtMiw4LDgtOSw4LTJmZiwyMCw1LWIsMWMtYjQsMjctLDI3LWNiYjEsZjctOSwyOC0yLGI1LTIyMSw1Niw0OCwzLSwyLSwzLSw1LGQsMiw1LDMsNDIsNS0sOSw4LDFkLDUsNiwyLTIsOCwxNTMtMywxMjMtMywzMy0yN2ZkLGE2ZGEtNTEyOCwyMWYtNWRmLDMtZmZmZCwzLWZmZmQsMy1mZmZkLDMtZmZmZCwzLWZmZmQsMy1mZmZkLDMtZmZmZCwzLWZmZmQsMy1mZmZkLDMtZmZmZCwzLWZmZmQsMywyLTFkLDYxLWZmN2RcIik7XG4vLyBAVE9ETzogTWFrZSB0aGlzIHJlbGF0aXZlLi4uXG5jb25zdCBUYWJsZV9CXzFfZmxhZ3MgPSBcImFkLDM0ZiwxODA2LDE4MGIsMTgwYywxODBkLDIwMGIsMjAwYywyMDBkLDIwNjAsZmVmZlwiLnNwbGl0KFwiLFwiKS5tYXAoKHYpID0+IHBhcnNlSW50KHYsIDE2KSk7XG5jb25zdCBUYWJsZV9CXzJfcmFuZ2VzID0gW1xuICAgIHsgaDogMjUsIHM6IDMyLCBsOiA2NSB9LFxuICAgIHsgaDogMzAsIHM6IDMyLCBlOiBbMjNdLCBsOiAxMjcgfSxcbiAgICB7IGg6IDU0LCBzOiAxLCBlOiBbNDhdLCBsOiA2NCwgZDogMiB9LFxuICAgIHsgaDogMTQsIHM6IDEsIGw6IDU3LCBkOiAyIH0sXG4gICAgeyBoOiA0NCwgczogMSwgbDogMTcsIGQ6IDIgfSxcbiAgICB7IGg6IDEwLCBzOiAxLCBlOiBbMiwgNiwgOF0sIGw6IDYxLCBkOiAyIH0sXG4gICAgeyBoOiAxNiwgczogMSwgbDogNjgsIGQ6IDIgfSxcbiAgICB7IGg6IDg0LCBzOiAxLCBlOiBbMTgsIDI0LCA2Nl0sIGw6IDE5LCBkOiAyIH0sXG4gICAgeyBoOiAyNiwgczogMzIsIGU6IFsxN10sIGw6IDQzNSB9LFxuICAgIHsgaDogMjIsIHM6IDEsIGw6IDcxLCBkOiAyIH0sXG4gICAgeyBoOiAxNSwgczogODAsIGw6IDQwIH0sXG4gICAgeyBoOiAzMSwgczogMzIsIGw6IDE2IH0sXG4gICAgeyBoOiAzMiwgczogMSwgbDogODAsIGQ6IDIgfSxcbiAgICB7IGg6IDUyLCBzOiAxLCBsOiA0MiwgZDogMiB9LFxuICAgIHsgaDogMTIsIHM6IDEsIGw6IDU1LCBkOiAyIH0sXG4gICAgeyBoOiA0MCwgczogMSwgZTogWzM4XSwgbDogMTUsIGQ6IDIgfSxcbiAgICB7IGg6IDE0LCBzOiAxLCBsOiA0OCwgZDogMiB9LFxuICAgIHsgaDogMzcsIHM6IDQ4LCBsOiA0OSB9LFxuICAgIHsgaDogMTQ4LCBzOiAxLCBsOiA2MzUxLCBkOiAyIH0sXG4gICAgeyBoOiA4OCwgczogMSwgbDogMTYwLCBkOiAyIH0sXG4gICAgeyBoOiAxNSwgczogMTYsIGw6IDcwNCB9LFxuICAgIHsgaDogMjUsIHM6IDI2LCBsOiA4NTQgfSxcbiAgICB7IGg6IDI1LCBzOiAzMiwgbDogNTU5MTUgfSxcbiAgICB7IGg6IDM3LCBzOiA0MCwgbDogMTI0NyB9LFxuICAgIHsgaDogMjUsIHM6IC0xMTk3MTEsIGw6IDUzMjQ4IH0sXG4gICAgeyBoOiAyNSwgczogLTExOTc2MywgbDogNTIgfSxcbiAgICB7IGg6IDI1LCBzOiAtMTE5ODE1LCBsOiA1MiB9LFxuICAgIHsgaDogMjUsIHM6IC0xMTk4NjcsIGU6IFsxLCA0LCA1LCA3LCA4LCAxMSwgMTIsIDE3XSwgbDogNTIgfSxcbiAgICB7IGg6IDI1LCBzOiAtMTE5OTE5LCBsOiA1MiB9LFxuICAgIHsgaDogMjQsIHM6IC0xMTk5NzEsIGU6IFsyLCA3LCA4LCAxN10sIGw6IDUyIH0sXG4gICAgeyBoOiAyNCwgczogLTEyMDAyMywgZTogWzIsIDcsIDEzLCAxNSwgMTYsIDE3XSwgbDogNTIgfSxcbiAgICB7IGg6IDI1LCBzOiAtMTIwMDc1LCBsOiA1MiB9LFxuICAgIHsgaDogMjUsIHM6IC0xMjAxMjcsIGw6IDUyIH0sXG4gICAgeyBoOiAyNSwgczogLTEyMDE3OSwgbDogNTIgfSxcbiAgICB7IGg6IDI1LCBzOiAtMTIwMjMxLCBsOiA1MiB9LFxuICAgIHsgaDogMjUsIHM6IC0xMjAyODMsIGw6IDUyIH0sXG4gICAgeyBoOiAyNSwgczogLTEyMDMzNSwgbDogNTIgfSxcbiAgICB7IGg6IDI0LCBzOiAtMTE5NTQzLCBlOiBbMTddLCBsOiA1NiB9LFxuICAgIHsgaDogMjQsIHM6IC0xMTk2MDEsIGU6IFsxN10sIGw6IDU4IH0sXG4gICAgeyBoOiAyNCwgczogLTExOTY1OSwgZTogWzE3XSwgbDogNTggfSxcbiAgICB7IGg6IDI0LCBzOiAtMTE5NzE3LCBlOiBbMTddLCBsOiA1OCB9LFxuICAgIHsgaDogMjQsIHM6IC0xMTk3NzUsIGU6IFsxN10sIGw6IDU4IH1cbl07XG5jb25zdCBUYWJsZV9CXzJfbHV0X2FicyA9IGNyZWF0ZVRhYmxlKFwiYjU6M2JjLGMzOmZmLDc6NzMsMjoyNTMsNToyNTQsMzoyNTYsMToyNTcsNToyNTksMToyNWIsMzoyNjAsMToyNjMsMjoyNjksMToyNjgsNToyNmYsMToyNzIsMjoyNzUsNzoyODAsMzoyODMsNToyODgsMzoyOGEsMToyOGIsNToyOTIsM2Y6MTk1LDE6MWJmLDI5OjE5ZSwxMjU6M2I5LDhiOjNiMiwxOjNiOCwxOjNjNSwzOjNjNiwxOjNjMCwxYTozYmEsMTozYzEsMTozYzMsMjozYjgsMTozYjUsMWJjOTozYjksMWM6MWY3NiwxOjFmNzcsZjoxZjdhLDE6MWY3YixkOjFmNzgsMToxZjc5LDE6MWY3YywxOjFmN2QsMTA3OjYzLDU6MjViLDQ6NjgsMTo2OCwxOjY4LDM6NjksMTo2OSwxOjZjLDM6NmUsNDo3MCwxOjcxLDE6NzIsMTo3MiwxOjcyLDc6N2EsMjozYzksMjo3YSwyOjZiLDE6ZTUsMTo2MiwxOjYzLDM6NjUsMTo2NiwyOjZkLGI6M2IzLDE6M2MwLDY6NjQsMWI1NzQ6M2I4LDFhOjNjMywyMDozYjgsMWE6M2MzLDIwOjNiOCwxYTozYzMsMjA6M2I4LDFhOjNjMywyMDozYjgsMWE6M2MzXCIpO1xuY29uc3QgVGFibGVfQl8yX2x1dF9yZWwgPSBjcmVhdGVUYWJsZShcIjE3OToxLDI6MSwyOjEsNToxLDI6MSxhOjRmLGE6MSw4OjEsMjoxLDI6MSwzOjEsNToxLDM6MSw0OjEsMjoxLDM6MSw0OjEsODoyLDE6MSwyOjIsMToxLDI6MiwyNzoyLDE5NToyNiwyOjI1LDE6MjUsMToyNSwyOjQwLDI6M2YsMTozZiwzMzoxLDExOi02LDE6LTksMWFjNzotM2EsNmQ6LTgsMTotOCwxOi04LDE6LTgsMTotOCwxOi04LDE6LTgsMTotOCw5Oi04LDE6LTgsMTotOCwxOi04LDE6LTgsMTotOCxiOi04LDE6LTgsMTotOCwxOi04LDE6LTgsMTotOCwxOi04LDE6LTgsOTotOCwxOi04LDE6LTgsMTotOCwxOi04LDE6LTgsMTotOCwxOi04LDk6LTgsMTotOCwxOi04LDE6LTgsMTotOCwxOi04LGM6LTgsMjotOCwyOi04LDI6LTgsOTotOCwxOi04LDE6LTgsMTotOCwxOi04LDE6LTgsMTotOCwxOi04LDQ5Oi04LDE6LTgsMTotNGEsMTotNGEsZDotNTYsMTotNTYsMTotNTYsMTotNTYsZDotOCwxOi04LGY6LTgsMTotOCwzOi03XCIpO1xuY29uc3QgVGFibGVfQl8yX2NvbXBsZXggPSBjcmVhdGVUYWJsZShcImRmOjAwNzMwMDczLDUxOjAwNjkwMzA3LDE5OjAyQkMwMDZFLGE3OjAwNkEwMzBDLDE4YTowMDIwMDNCOSwxNjowM0I5MDMwODAzMDEsMjA6MDNDNTAzMDgwMzAxLDFkNzowNTY1MDU4MiwxOTBmOjAwNjgwMzMxLDE6MDA3NDAzMDgsMTowMDc3MDMwQSwxOjAwNzkwMzBBLDE6MDA2MTAyQkUsYjY6MDNDNTAzMTMsMjowM0M1MDMxMzAzMDAsMjowM0M1MDMxMzAzMDEsMjowM0M1MDMxMzAzNDIsMmE6MUYwMDAzQjksMToxRjAxMDNCOSwxOjFGMDIwM0I5LDE6MUYwMzAzQjksMToxRjA0MDNCOSwxOjFGMDUwM0I5LDE6MUYwNjAzQjksMToxRjA3MDNCOSwxOjFGMDAwM0I5LDE6MUYwMTAzQjksMToxRjAyMDNCOSwxOjFGMDMwM0I5LDE6MUYwNDAzQjksMToxRjA1MDNCOSwxOjFGMDYwM0I5LDE6MUYwNzAzQjksMToxRjIwMDNCOSwxOjFGMjEwM0I5LDE6MUYyMjAzQjksMToxRjIzMDNCOSwxOjFGMjQwM0I5LDE6MUYyNTAzQjksMToxRjI2MDNCOSwxOjFGMjcwM0I5LDE6MUYyMDAzQjksMToxRjIxMDNCOSwxOjFGMjIwM0I5LDE6MUYyMzAzQjksMToxRjI0MDNCOSwxOjFGMjUwM0I5LDE6MUYyNjAzQjksMToxRjI3MDNCOSwxOjFGNjAwM0I5LDE6MUY2MTAzQjksMToxRjYyMDNCOSwxOjFGNjMwM0I5LDE6MUY2NDAzQjksMToxRjY1MDNCOSwxOjFGNjYwM0I5LDE6MUY2NzAzQjksMToxRjYwMDNCOSwxOjFGNjEwM0I5LDE6MUY2MjAzQjksMToxRjYzMDNCOSwxOjFGNjQwM0I5LDE6MUY2NTAzQjksMToxRjY2MDNCOSwxOjFGNjcwM0I5LDM6MUY3MDAzQjksMTowM0IxMDNCOSwxOjAzQUMwM0I5LDI6MDNCMTAzNDIsMTowM0IxMDM0MjAzQjksNTowM0IxMDNCOSw2OjFGNzQwM0I5LDE6MDNCNzAzQjksMTowM0FFMDNCOSwyOjAzQjcwMzQyLDE6MDNCNzAzNDIwM0I5LDU6MDNCNzAzQjksNjowM0I5MDMwODAzMDAsMTowM0I5MDMwODAzMDEsMzowM0I5MDM0MiwxOjAzQjkwMzA4MDM0MixiOjAzQzUwMzA4MDMwMCwxOjAzQzUwMzA4MDMwMSwxOjAzQzEwMzEzLDI6MDNDNTAzNDIsMTowM0M1MDMwODAzNDIsYjoxRjdDMDNCOSwxOjAzQzkwM0I5LDE6MDNDRTAzQjksMjowM0M5MDM0MiwxOjAzQzkwMzQyMDNCOSw1OjAzQzkwM0I5LGFjOjAwNzIwMDczLDViOjAwQjAwMDYzLDY6MDBCMDAwNjYsZDowMDZFMDA2RixhOjAwNzMwMDZELDE6MDA3NDAwNjUwMDZDLDE6MDA3NDAwNkQsMTI0ZjowMDY4MDA3MDAwNjEsMjowMDYxMDA3NSwyOjAwNkYwMDc2LGI6MDA3MDAwNjEsMTowMDZFMDA2MSwxOjAzQkMwMDYxLDE6MDA2RDAwNjEsMTowMDZCMDA2MSwxOjAwNkIwMDYyLDE6MDA2RDAwNjIsMTowMDY3MDA2MiwzOjAwNzAwMDY2LDE6MDA2RTAwNjYsMTowM0JDMDA2Niw0OjAwNjgwMDdBLDE6MDA2QjAwNjgwMDdBLDE6MDA2RDAwNjgwMDdBLDE6MDA2NzAwNjgwMDdBLDE6MDA3NDAwNjgwMDdBLDE1OjAwNzAwMDYxLDE6MDA2QjAwNzAwMDYxLDE6MDA2RDAwNzAwMDYxLDE6MDA2NzAwNzAwMDYxLDg6MDA3MDAwNzYsMTowMDZFMDA3NiwxOjAzQkMwMDc2LDE6MDA2RDAwNzYsMTowMDZCMDA3NiwxOjAwNkQwMDc2LDE6MDA3MDAwNzcsMTowMDZFMDA3NywxOjAzQkMwMDc3LDE6MDA2RDAwNzcsMTowMDZCMDA3NywxOjAwNkQwMDc3LDE6MDA2QjAzQzksMTowMDZEMDNDOSwyOjAwNjIwMDcxLDM6MDA2MzIyMTUwMDZCMDA2NywxOjAwNjMwMDZGMDAyRSwxOjAwNjQwMDYyLDE6MDA2NzAwNzksMjowMDY4MDA3MCwyOjAwNkIwMDZCLDE6MDA2QjAwNkQsOTowMDcwMDA2OCwyOjAwNzAwMDcwMDA2RCwxOjAwNzAwMDcyLDI6MDA3MzAwNzYsMTowMDc3MDA2MixjNzIzOjAwNjYwMDY2LDE6MDA2NjAwNjksMTowMDY2MDA2QywxOjAwNjYwMDY2MDA2OSwxOjAwNjYwMDY2MDA2QywxOjAwNzMwMDc0LDE6MDA3MzAwNzQsZDowNTc0MDU3NiwxOjA1NzQwNTY1LDE6MDU3NDA1NkIsMTowNTdFMDU3NiwxOjA1NzQwNTZEXCIsIGJ5dGVzMik7XG5jb25zdCBUYWJsZV9DX3JhbmdlcyA9IGNyZWF0ZVJhbmdlVGFibGUoXCI4MC0yMCwyYTAtLDM5YywzMixmNzEsMThlLDdmMi1mLDE5LTcsMzAtNCw3LTUsZjgxLWIsNSxhODAwLTIwZmYsNGQxLTFmLDExMCxmYS02LGQxNzQtNywyZTg0LSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSxmZmZmLSwyLDFmLTVmLGZmN2YtMjAwMDFcIik7XG5mdW5jdGlvbiBmbGF0dGVuKHZhbHVlcykge1xuICAgIHJldHVybiB2YWx1ZXMucmVkdWNlKChhY2N1bSwgdmFsdWUpID0+IHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsdWUpID0+IHsgYWNjdW0ucHVzaCh2YWx1ZSk7IH0pO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF9uYW1lcHJlcFRhYmxlQTEoY29kZXBvaW50KSB7XG4gICAgcmV0dXJuICEhbWF0Y2hNYXAoY29kZXBvaW50LCBUYWJsZV9BXzFfcmFuZ2VzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBfbmFtZXByZXBUYWJsZUIyKGNvZGVwb2ludCkge1xuICAgIGxldCByYW5nZSA9IG1hdGNoTWFwKGNvZGVwb2ludCwgVGFibGVfQl8yX3Jhbmdlcyk7XG4gICAgaWYgKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiBbY29kZXBvaW50ICsgcmFuZ2Uuc107XG4gICAgfVxuICAgIGxldCBjb2RlcyA9IFRhYmxlX0JfMl9sdXRfYWJzW2NvZGVwb2ludF07XG4gICAgaWYgKGNvZGVzKSB7XG4gICAgICAgIHJldHVybiBjb2RlcztcbiAgICB9XG4gICAgbGV0IHNoaWZ0ID0gVGFibGVfQl8yX2x1dF9yZWxbY29kZXBvaW50XTtcbiAgICBpZiAoc2hpZnQpIHtcbiAgICAgICAgcmV0dXJuIFtjb2RlcG9pbnQgKyBzaGlmdFswXV07XG4gICAgfVxuICAgIGxldCBjb21wbGV4ID0gVGFibGVfQl8yX2NvbXBsZXhbY29kZXBvaW50XTtcbiAgICBpZiAoY29tcGxleCkge1xuICAgICAgICByZXR1cm4gY29tcGxleDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gX25hbWVwcmVwVGFibGVDKGNvZGVwb2ludCkge1xuICAgIHJldHVybiAhIW1hdGNoTWFwKGNvZGVwb2ludCwgVGFibGVfQ19yYW5nZXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5hbWVwcmVwKHZhbHVlKSB7XG4gICAgLy8gVGhpcyBhbGxvd3MgcGxhdGZvcm1zIHdpdGggaW5jb21wbGV0ZSBub3JtYWxpemUgdG8gYnlwYXNzXG4gICAgLy8gaXQgZm9yIHZlcnkgYmFzaWMgbmFtZXMgd2hpY2ggdGhlIGJ1aWx0LWluIHRvTG93ZXJDYXNlXG4gICAgLy8gd2lsbCBjZXJ0YWlubHkgaGFuZGxlIGNvcnJlY3RseVxuICAgIGlmICh2YWx1ZS5tYXRjaCgvXlthLXowLTktXSokL2kpICYmIHZhbHVlLmxlbmd0aCA8PSA1OSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBjb2RlIHBvaW50cyAoa2VlcGluZyB0aGUgY3VycmVudCBub3JtYWxpemF0aW9uKVxuICAgIGxldCBjb2RlcyA9IHRvVXRmOENvZGVQb2ludHModmFsdWUpO1xuICAgIGNvZGVzID0gZmxhdHRlbihjb2Rlcy5tYXAoKGNvZGUpID0+IHtcbiAgICAgICAgLy8gU3Vic3RpdHV0ZSBUYWJsZSBCLjEgKE1hcHMgdG8gTm90aGluZylcbiAgICAgICAgaWYgKFRhYmxlX0JfMV9mbGFncy5pbmRleE9mKGNvZGUpID49IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29kZSA+PSAweGZlMDAgJiYgY29kZSA8PSAweGZlMGYpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdWJzdGl0dXRlIFRhYmxlIEIuMiAoQ2FzZSBGb2xkaW5nKVxuICAgICAgICBsZXQgY29kZXNUYWJsZUIyID0gX25hbWVwcmVwVGFibGVCMihjb2RlKTtcbiAgICAgICAgaWYgKGNvZGVzVGFibGVCMikge1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVzVGFibGVCMjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBTdWJzdGl0dXRpb25cbiAgICAgICAgcmV0dXJuIFtjb2RlXTtcbiAgICB9KSk7XG4gICAgLy8gTm9ybWFsaXplIHVzaW5nIGZvcm0gS0NcbiAgICBjb2RlcyA9IHRvVXRmOENvZGVQb2ludHMoX3RvVXRmOFN0cmluZyhjb2RlcyksIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybS5ORktDKTtcbiAgICAvLyBQcm9oaWJpdCBUYWJsZXMgQy4xLjIsIEMuMi4yLCBDLjMsIEMuNCwgQy41LCBDLjYsIEMuNywgQy44LCBDLjlcbiAgICBjb2Rlcy5mb3JFYWNoKChjb2RlKSA9PiB7XG4gICAgICAgIGlmIChfbmFtZXByZXBUYWJsZUMoY29kZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNUUklOR1BSRVBfQ09OVEFJTlNfUFJPSElCSVRFRFwiKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIFByb2hpYml0IFVuYXNzaWduZWQgQ29kZSBQb2ludHMgKFRhYmxlIEEuMSlcbiAgICBjb2Rlcy5mb3JFYWNoKChjb2RlKSA9PiB7XG4gICAgICAgIGlmIChfbmFtZXByZXBUYWJsZUExKGNvZGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTVFJJTkdQUkVQX0NPTlRBSU5TX1VOQVNTSUdORURcIik7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBJRE5BIGV4dHJhc1xuICAgIGxldCBuYW1lID0gX3RvVXRmOFN0cmluZyhjb2Rlcyk7XG4gICAgLy8gSUROQTogNC4yLjMuMVxuICAgIGlmIChuYW1lLnN1YnN0cmluZygwLCAxKSA9PT0gXCItXCIgfHwgbmFtZS5zdWJzdHJpbmcoMiwgNCkgPT09IFwiLS1cIiB8fCBuYW1lLnN1YnN0cmluZyhuYW1lLmxlbmd0aCAtIDEpID09PSBcIi1cIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGh5cGhlblwiKTtcbiAgICB9XG4gICAgLy8gSUROQTogNC4yLjRcbiAgICBpZiAobmFtZS5sZW5ndGggPiA2Mykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0b28gbG9uZ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pZG5hLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgZm9ybWF0Qnl0ZXMzMlN0cmluZywgcGFyc2VCeXRlczMyU3RyaW5nIH0gZnJvbSBcIi4vYnl0ZXMzMlwiO1xuaW1wb3J0IHsgbmFtZXByZXAgfSBmcm9tIFwiLi9pZG5hXCI7XG5pbXBvcnQgeyBfdG9Fc2NhcGVkVXRmOFN0cmluZywgdG9VdGY4Qnl0ZXMsIHRvVXRmOENvZGVQb2ludHMsIHRvVXRmOFN0cmluZywgVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtLCBVdGY4RXJyb3JGdW5jcywgVXRmOEVycm9yUmVhc29uIH0gZnJvbSBcIi4vdXRmOFwiO1xuZXhwb3J0IHsgX3RvRXNjYXBlZFV0ZjhTdHJpbmcsIHRvVXRmOEJ5dGVzLCB0b1V0ZjhDb2RlUG9pbnRzLCB0b1V0ZjhTdHJpbmcsIFV0ZjhFcnJvckZ1bmNzLCBVdGY4RXJyb3JSZWFzb24sIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybSwgZm9ybWF0Qnl0ZXMzMlN0cmluZywgcGFyc2VCeXRlczMyU3RyaW5nLCBuYW1lcHJlcCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBhcnJheWlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHZlcnNpb24pO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZXhwb3J0IHZhciBVbmljb2RlTm9ybWFsaXphdGlvbkZvcm07XG4oZnVuY3Rpb24gKFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybSkge1xuICAgIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybVtcImN1cnJlbnRcIl0gPSBcIlwiO1xuICAgIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybVtcIk5GQ1wiXSA9IFwiTkZDXCI7XG4gICAgVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtW1wiTkZEXCJdID0gXCJORkRcIjtcbiAgICBVbmljb2RlTm9ybWFsaXphdGlvbkZvcm1bXCJORktDXCJdID0gXCJORktDXCI7XG4gICAgVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtW1wiTkZLRFwiXSA9IFwiTkZLRFwiO1xufSkoVW5pY29kZU5vcm1hbGl6YXRpb25Gb3JtIHx8IChVbmljb2RlTm9ybWFsaXphdGlvbkZvcm0gPSB7fSkpO1xuO1xuZXhwb3J0IHZhciBVdGY4RXJyb3JSZWFzb247XG4oZnVuY3Rpb24gKFV0ZjhFcnJvclJlYXNvbikge1xuICAgIC8vIEEgY29udGludWF0aW9uIGJ5dGUgd2FzIHByZXNlbnQgd2hlcmUgdGhlcmUgd2FzIG5vdGhpbmcgdG8gY29udGludWVcbiAgICAvLyAtIG9mZnNldCA9IHRoZSBpbmRleCB0aGUgY29kZXBvaW50IGJlZ2FuIGluXG4gICAgVXRmOEVycm9yUmVhc29uW1wiVU5FWFBFQ1RFRF9DT05USU5VRVwiXSA9IFwidW5leHBlY3RlZCBjb250aW51YXRpb24gYnl0ZVwiO1xuICAgIC8vIEFuIGludmFsaWQgKG5vbi1jb250aW51YXRpb24pIGJ5dGUgdG8gc3RhcnQgYSBVVEYtOCBjb2RlcG9pbnQgd2FzIGZvdW5kXG4gICAgLy8gLSBvZmZzZXQgPSB0aGUgaW5kZXggdGhlIGNvZGVwb2ludCBiZWdhbiBpblxuICAgIFV0ZjhFcnJvclJlYXNvbltcIkJBRF9QUkVGSVhcIl0gPSBcImJhZCBjb2RlcG9pbnQgcHJlZml4XCI7XG4gICAgLy8gVGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gcHJvY2VzcyB0aGUgZXhwZWN0ZWQgY29kZXBvaW50XG4gICAgLy8gLSBvZmZzZXQgPSB0aGUgaW5kZXggdGhlIGNvZGVwb2ludCBiZWdhbiBpblxuICAgIFV0ZjhFcnJvclJlYXNvbltcIk9WRVJSVU5cIl0gPSBcInN0cmluZyBvdmVycnVuXCI7XG4gICAgLy8gQSBtaXNzaW5nIGNvbnRpbnVhdGlvbiBieXRlIHdhcyBleHBlY3RlZCBidXQgbm90IGZvdW5kXG4gICAgLy8gLSBvZmZzZXQgPSB0aGUgaW5kZXggdGhlIGNvbnRpbnVhdGlvbiBieXRlIHdhcyBleHBlY3RlZCBhdFxuICAgIFV0ZjhFcnJvclJlYXNvbltcIk1JU1NJTkdfQ09OVElOVUVcIl0gPSBcIm1pc3NpbmcgY29udGludWF0aW9uIGJ5dGVcIjtcbiAgICAvLyBUaGUgY29tcHV0ZWQgY29kZSBwb2ludCBpcyBvdXRzaWRlIHRoZSByYW5nZSBmb3IgVVRGLThcbiAgICAvLyAtIG9mZnNldCAgICAgICA9IHN0YXJ0IG9mIHRoaXMgY29kZXBvaW50XG4gICAgLy8gLSBiYWRDb2RlcG9pbnQgPSB0aGUgY29tcHV0ZWQgY29kZXBvaW50OyBvdXRzaWRlIHRoZSBVVEYtOCByYW5nZVxuICAgIFV0ZjhFcnJvclJlYXNvbltcIk9VVF9PRl9SQU5HRVwiXSA9IFwib3V0IG9mIFVURi04IHJhbmdlXCI7XG4gICAgLy8gVVRGLTggc3RyaW5ncyBtYXkgbm90IGNvbnRhaW4gVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyc1xuICAgIC8vIC0gb2Zmc2V0ICAgICAgID0gc3RhcnQgb2YgdGhpcyBjb2RlcG9pbnRcbiAgICAvLyAtIGJhZENvZGVwb2ludCA9IHRoZSBjb21wdXRlZCBjb2RlcG9pbnQ7IGluc2lkZSB0aGUgVVRGLTE2IHN1cnJvZ2F0ZSByYW5nZVxuICAgIFV0ZjhFcnJvclJlYXNvbltcIlVURjE2X1NVUlJPR0FURVwiXSA9IFwiVVRGLTE2IHN1cnJvZ2F0ZVwiO1xuICAgIC8vIFRoZSBzdHJpbmcgaXMgYW4gb3ZlcmxvbmcgcmVwZXJlc2VudGF0aW9uXG4gICAgLy8gLSBvZmZzZXQgICAgICAgPSBzdGFydCBvZiB0aGlzIGNvZGVwb2ludFxuICAgIC8vIC0gYmFkQ29kZXBvaW50ID0gdGhlIGNvbXB1dGVkIGNvZGVwb2ludDsgYWxyZWFkeSBib3VuZHMgY2hlY2tlZFxuICAgIFV0ZjhFcnJvclJlYXNvbltcIk9WRVJMT05HXCJdID0gXCJvdmVybG9uZyByZXByZXNlbnRhdGlvblwiO1xufSkoVXRmOEVycm9yUmVhc29uIHx8IChVdGY4RXJyb3JSZWFzb24gPSB7fSkpO1xuO1xuZnVuY3Rpb24gZXJyb3JGdW5jKHJlYXNvbiwgb2Zmc2V0LCBieXRlcywgb3V0cHV0LCBiYWRDb2RlcG9pbnQpIHtcbiAgICByZXR1cm4gbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihgaW52YWxpZCBjb2RlcG9pbnQgYXQgb2Zmc2V0ICR7b2Zmc2V0fTsgJHtyZWFzb259YCwgXCJieXRlc1wiLCBieXRlcyk7XG59XG5mdW5jdGlvbiBpZ25vcmVGdW5jKHJlYXNvbiwgb2Zmc2V0LCBieXRlcywgb3V0cHV0LCBiYWRDb2RlcG9pbnQpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBpbnZhbGlkIHByZWZpeCAoaW5jbHVkaW5nIHN0cmF5IGNvbnRpbnVhdGlvbiksIHNraXAgYW55IGFkZGl0aW9uYWwgY29udGludWF0aW9uIGJ5dGVzXG4gICAgaWYgKHJlYXNvbiA9PT0gVXRmOEVycm9yUmVhc29uLkJBRF9QUkVGSVggfHwgcmVhc29uID09PSBVdGY4RXJyb3JSZWFzb24uVU5FWFBFQ1RFRF9DT05USU5VRSkge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGZvciAobGV0IG8gPSBvZmZzZXQgKyAxOyBvIDwgYnl0ZXMubGVuZ3RoOyBvKyspIHtcbiAgICAgICAgICAgIGlmIChieXRlc1tvXSA+PiA2ICE9PSAweDAyKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIC8vIFRoaXMgYnl0ZSBydW5zIHVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzbyBqdXN0IGp1bXAgdG8gdGhlIGVuZFxuICAgIC8vIChidXQgdGhlIGZpcnN0IGJ5dGUgd2FzIHJlYWQgYWxyZWFkeSByZWFkIGFuZCB0aGVyZWZvcmUgc2tpcHBlZClcbiAgICBpZiAocmVhc29uID09PSBVdGY4RXJyb3JSZWFzb24uT1ZFUlJVTikge1xuICAgICAgICByZXR1cm4gYnl0ZXMubGVuZ3RoIC0gb2Zmc2V0IC0gMTtcbiAgICB9XG4gICAgLy8gTm90aGluZyB0byBza2lwXG4gICAgcmV0dXJuIDA7XG59XG5mdW5jdGlvbiByZXBsYWNlRnVuYyhyZWFzb24sIG9mZnNldCwgYnl0ZXMsIG91dHB1dCwgYmFkQ29kZXBvaW50KSB7XG4gICAgLy8gT3ZlcmxvbmcgcmVwcmVzZW50YXRpb25zIGFyZSBvdGhlcndpc2UgXCJ2YWxpZFwiIGNvZGUgcG9pbnRzOyBqdXN0IG5vbi1kZWlzdGluZ3Rpc2hlZFxuICAgIGlmIChyZWFzb24gPT09IFV0ZjhFcnJvclJlYXNvbi5PVkVSTE9ORykge1xuICAgICAgICBvdXRwdXQucHVzaChiYWRDb2RlcG9pbnQpO1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLy8gUHV0IHRoZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgaW50byB0aGUgb3V0cHV0XG4gICAgb3V0cHV0LnB1c2goMHhmZmZkKTtcbiAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgYXMgaWYgaWdub3JpbmcgZXJyb3JzXG4gICAgcmV0dXJuIGlnbm9yZUZ1bmMocmVhc29uLCBvZmZzZXQsIGJ5dGVzLCBvdXRwdXQsIGJhZENvZGVwb2ludCk7XG59XG4vLyBDb21tb24gZXJyb3IgaGFuZGluZyBzdHJhdGVnaWVzXG5leHBvcnQgY29uc3QgVXRmOEVycm9yRnVuY3MgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogZXJyb3JGdW5jLFxuICAgIGlnbm9yZTogaWdub3JlRnVuYyxcbiAgICByZXBsYWNlOiByZXBsYWNlRnVuY1xufSk7XG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzMzU2NDkzL2RlY29kZS11dGYtOC13aXRoLWphdmFzY3JpcHQjMTM2OTE0OTlcbmZ1bmN0aW9uIGdldFV0ZjhDb2RlUG9pbnRzKGJ5dGVzLCBvbkVycm9yKSB7XG4gICAgaWYgKG9uRXJyb3IgPT0gbnVsbCkge1xuICAgICAgICBvbkVycm9yID0gVXRmOEVycm9yRnVuY3MuZXJyb3I7XG4gICAgfVxuICAgIGJ5dGVzID0gYXJyYXlpZnkoYnl0ZXMpO1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGxldCBpID0gMDtcbiAgICAvLyBJbnZhbGlkIGJ5dGVzIGFyZSBpZ25vcmVkXG4gICAgd2hpbGUgKGkgPCBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYyA9IGJ5dGVzW2krK107XG4gICAgICAgIC8vIDB4eHggeHh4eFxuICAgICAgICBpZiAoYyA+PiA3ID09PSAwKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChjKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE11bHRpYnl0ZTsgaG93IG1hbnkgYnl0ZXMgbGVmdCBmb3IgdGhpcyBjaGFyYWN0ZXI/XG4gICAgICAgIGxldCBleHRyYUxlbmd0aCA9IG51bGw7XG4gICAgICAgIGxldCBvdmVybG9uZ01hc2sgPSBudWxsO1xuICAgICAgICAvLyAxMTB4IHh4eHggMTB4eCB4eHh4XG4gICAgICAgIGlmICgoYyAmIDB4ZTApID09PSAweGMwKSB7XG4gICAgICAgICAgICBleHRyYUxlbmd0aCA9IDE7XG4gICAgICAgICAgICBvdmVybG9uZ01hc2sgPSAweDdmO1xuICAgICAgICAgICAgLy8gMTExMCB4eHh4IDEweHggeHh4eCAxMHh4IHh4eHhcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoYyAmIDB4ZjApID09PSAweGUwKSB7XG4gICAgICAgICAgICBleHRyYUxlbmd0aCA9IDI7XG4gICAgICAgICAgICBvdmVybG9uZ01hc2sgPSAweDdmZjtcbiAgICAgICAgICAgIC8vIDExMTEgMHh4eCAxMHh4IHh4eHggMTB4eCB4eHh4IDEweHggeHh4eFxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKChjICYgMHhmOCkgPT09IDB4ZjApIHtcbiAgICAgICAgICAgIGV4dHJhTGVuZ3RoID0gMztcbiAgICAgICAgICAgIG92ZXJsb25nTWFzayA9IDB4ZmZmZjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICgoYyAmIDB4YzApID09PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgaSArPSBvbkVycm9yKFV0ZjhFcnJvclJlYXNvbi5VTkVYUEVDVEVEX0NPTlRJTlVFLCBpIC0gMSwgYnl0ZXMsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpICs9IG9uRXJyb3IoVXRmOEVycm9yUmVhc29uLkJBRF9QUkVGSVgsIGkgLSAxLCBieXRlcywgcmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvIHdlIGhhdmUgZW5vdWdoIGJ5dGVzIGluIG91ciBkYXRhP1xuICAgICAgICBpZiAoaSAtIDEgKyBleHRyYUxlbmd0aCA+PSBieXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGkgKz0gb25FcnJvcihVdGY4RXJyb3JSZWFzb24uT1ZFUlJVTiwgaSAtIDEsIGJ5dGVzLCByZXN1bHQpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsZW5ndGggcHJlZml4IGZyb20gdGhlIGNoYXJcbiAgICAgICAgbGV0IHJlcyA9IGMgJiAoKDEgPDwgKDggLSBleHRyYUxlbmd0aCAtIDEpKSAtIDEpO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGV4dHJhTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCBuZXh0Q2hhciA9IGJ5dGVzW2ldO1xuICAgICAgICAgICAgLy8gSW52YWxpZCBjb250aW51YXRpb24gYnl0ZVxuICAgICAgICAgICAgaWYgKChuZXh0Q2hhciAmIDB4YzApICE9IDB4ODApIHtcbiAgICAgICAgICAgICAgICBpICs9IG9uRXJyb3IoVXRmOEVycm9yUmVhc29uLk1JU1NJTkdfQ09OVElOVUUsIGksIGJ5dGVzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA7XG4gICAgICAgICAgICByZXMgPSAocmVzIDw8IDYpIHwgKG5leHRDaGFyICYgMHgzZik7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VlIGFib3ZlIGxvb3AgZm9yIGludmFsaWQgY29udGltdWF0aW9uIGJ5dGVcbiAgICAgICAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWF4aW11bSBjb2RlIHBvaW50XG4gICAgICAgIGlmIChyZXMgPiAweDEwZmZmZikge1xuICAgICAgICAgICAgaSArPSBvbkVycm9yKFV0ZjhFcnJvclJlYXNvbi5PVVRfT0ZfUkFOR0UsIGkgLSAxIC0gZXh0cmFMZW5ndGgsIGJ5dGVzLCByZXN1bHQsIHJlcyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNlcnZlZCBmb3IgVVRGLTE2IHN1cnJvZ2F0ZSBoYWx2ZXNcbiAgICAgICAgaWYgKHJlcyA+PSAweGQ4MDAgJiYgcmVzIDw9IDB4ZGZmZikge1xuICAgICAgICAgICAgaSArPSBvbkVycm9yKFV0ZjhFcnJvclJlYXNvbi5VVEYxNl9TVVJST0dBVEUsIGkgLSAxIC0gZXh0cmFMZW5ndGgsIGJ5dGVzLCByZXN1bHQsIHJlcyk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBmb3Igb3Zlcmxvbmcgc2VxdWVuY2VzIChtb3JlIGJ5dGVzIHRoYW4gbmVlZGVkKVxuICAgICAgICBpZiAocmVzIDw9IG92ZXJsb25nTWFzaykge1xuICAgICAgICAgICAgaSArPSBvbkVycm9yKFV0ZjhFcnJvclJlYXNvbi5PVkVSTE9ORywgaSAtIDEgLSBleHRyYUxlbmd0aCwgYnl0ZXMsIHJlc3VsdCwgcmVzKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHJlcyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4NzI5NDA1L2hvdy10by1jb252ZXJ0LXV0Zjgtc3RyaW5nLXRvLWJ5dGUtYXJyYXlcbmV4cG9ydCBmdW5jdGlvbiB0b1V0ZjhCeXRlcyhzdHIsIGZvcm0gPSBVbmljb2RlTm9ybWFsaXphdGlvbkZvcm0uY3VycmVudCkge1xuICAgIGlmIChmb3JtICE9IFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybS5jdXJyZW50KSB7XG4gICAgICAgIGxvZ2dlci5jaGVja05vcm1hbGl6ZSgpO1xuICAgICAgICBzdHIgPSBzdHIubm9ybWFsaXplKGZvcm0pO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGMgPj4gNikgfCAweGMwKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChjICYgMHgzZikgfCAweDgwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoYyAmIDB4ZmMwMCkgPT0gMHhkODAwKSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgICBjb25zdCBjMiA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgaWYgKGkgPj0gc3RyLmxlbmd0aCB8fCAoYzIgJiAweGZjMDApICE9PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHV0Zi04IHN0cmluZ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXG4gICAgICAgICAgICBjb25zdCBwYWlyID0gMHgxMDAwMCArICgoYyAmIDB4MDNmZikgPDwgMTApICsgKGMyICYgMHgwM2ZmKTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKChwYWlyID4+IDE4KSB8IDB4ZjApO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKChwYWlyID4+IDEyKSAmIDB4M2YpIHwgMHg4MCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgoKHBhaXIgPj4gNikgJiAweDNmKSB8IDB4ODApO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKHBhaXIgJiAweDNmKSB8IDB4ODApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGMgPj4gMTIpIHwgMHhlMCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCgoKGMgPj4gNikgJiAweDNmKSB8IDB4ODApO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goKGMgJiAweDNmKSB8IDB4ODApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheWlmeShyZXN1bHQpO1xufVxuO1xuZnVuY3Rpb24gZXNjYXBlQ2hhcih2YWx1ZSkge1xuICAgIGNvbnN0IGhleCA9IChcIjAwMDBcIiArIHZhbHVlLnRvU3RyaW5nKDE2KSk7XG4gICAgcmV0dXJuIFwiXFxcXHVcIiArIGhleC5zdWJzdHJpbmcoaGV4Lmxlbmd0aCAtIDQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF90b0VzY2FwZWRVdGY4U3RyaW5nKGJ5dGVzLCBvbkVycm9yKSB7XG4gICAgcmV0dXJuICdcIicgKyBnZXRVdGY4Q29kZVBvaW50cyhieXRlcywgb25FcnJvcikubWFwKChjb2RlUG9pbnQpID0+IHtcbiAgICAgICAgaWYgKGNvZGVQb2ludCA8IDI1Nikge1xuICAgICAgICAgICAgc3dpdGNoIChjb2RlUG9pbnQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDg6IHJldHVybiBcIlxcXFxiXCI7XG4gICAgICAgICAgICAgICAgY2FzZSA5OiByZXR1cm4gXCJcXFxcdFwiO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA6IHJldHVybiBcIlxcXFxuXCI7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzogcmV0dXJuIFwiXFxcXHJcIjtcbiAgICAgICAgICAgICAgICBjYXNlIDM0OiByZXR1cm4gXCJcXFxcXFxcIlwiO1xuICAgICAgICAgICAgICAgIGNhc2UgOTI6IHJldHVybiBcIlxcXFxcXFxcXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29kZVBvaW50ID49IDMyICYmIGNvZGVQb2ludCA8IDEyNykge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGVQb2ludCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGVQb2ludCA8PSAweGZmZmYpIHtcbiAgICAgICAgICAgIHJldHVybiBlc2NhcGVDaGFyKGNvZGVQb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgY29kZVBvaW50IC09IDB4MTAwMDA7XG4gICAgICAgIHJldHVybiBlc2NhcGVDaGFyKCgoY29kZVBvaW50ID4+IDEwKSAmIDB4M2ZmKSArIDB4ZDgwMCkgKyBlc2NhcGVDaGFyKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApO1xuICAgIH0pLmpvaW4oXCJcIikgKyAnXCInO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF90b1V0ZjhTdHJpbmcoY29kZVBvaW50cykge1xuICAgIHJldHVybiBjb2RlUG9pbnRzLm1hcCgoY29kZVBvaW50KSA9PiB7XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPD0gMHhmZmZmKSB7XG4gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvZGVQb2ludCAtPSAweDEwMDAwO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoKChjb2RlUG9pbnQgPj4gMTApICYgMHgzZmYpICsgMHhkODAwKSwgKChjb2RlUG9pbnQgJiAweDNmZikgKyAweGRjMDApKTtcbiAgICB9KS5qb2luKFwiXCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvVXRmOFN0cmluZyhieXRlcywgb25FcnJvcikge1xuICAgIHJldHVybiBfdG9VdGY4U3RyaW5nKGdldFV0ZjhDb2RlUG9pbnRzKGJ5dGVzLCBvbkVycm9yKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9VdGY4Q29kZVBvaW50cyhzdHIsIGZvcm0gPSBVbmljb2RlTm9ybWFsaXphdGlvbkZvcm0uY3VycmVudCkge1xuICAgIHJldHVybiBnZXRVdGY4Q29kZVBvaW50cyh0b1V0ZjhCeXRlcyhzdHIsIGZvcm0pKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0ZjguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcInRyYW5zYWN0aW9ucy81LjAuMTBcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgZ2V0QWRkcmVzcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hZGRyZXNzXCI7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmlnbnVtYmVyXCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgaGV4RGF0YVNsaWNlLCBoZXhsaWZ5LCBoZXhaZXJvUGFkLCBpc0J5dGVzTGlrZSwgc3BsaXRTaWduYXR1cmUsIHN0cmlwWmVyb3MsIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBaZXJvIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2NvbnN0YW50c1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgY2hlY2tQcm9wZXJ0aWVzIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3BlcnRpZXNcIjtcbmltcG9ydCAqIGFzIFJMUCBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcmxwXCI7XG5pbXBvcnQgeyBjb21wdXRlUHVibGljS2V5LCByZWNvdmVyUHVibGljS2V5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3NpZ25pbmcta2V5XCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5mdW5jdGlvbiBoYW5kbGVBZGRyZXNzKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBcIjB4XCIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBnZXRBZGRyZXNzKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGhhbmRsZU51bWJlcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gXCIweFwiKSB7XG4gICAgICAgIHJldHVybiBaZXJvO1xuICAgIH1cbiAgICByZXR1cm4gQmlnTnVtYmVyLmZyb20odmFsdWUpO1xufVxuY29uc3QgdHJhbnNhY3Rpb25GaWVsZHMgPSBbXG4gICAgeyBuYW1lOiBcIm5vbmNlXCIsIG1heExlbmd0aDogMzIsIG51bWVyaWM6IHRydWUgfSxcbiAgICB7IG5hbWU6IFwiZ2FzUHJpY2VcIiwgbWF4TGVuZ3RoOiAzMiwgbnVtZXJpYzogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJnYXNMaW1pdFwiLCBtYXhMZW5ndGg6IDMyLCBudW1lcmljOiB0cnVlIH0sXG4gICAgeyBuYW1lOiBcInRvXCIsIGxlbmd0aDogMjAgfSxcbiAgICB7IG5hbWU6IFwidmFsdWVcIiwgbWF4TGVuZ3RoOiAzMiwgbnVtZXJpYzogdHJ1ZSB9LFxuICAgIHsgbmFtZTogXCJkYXRhXCIgfSxcbl07XG5jb25zdCBhbGxvd2VkVHJhbnNhY3Rpb25LZXlzID0ge1xuICAgIGNoYWluSWQ6IHRydWUsIGRhdGE6IHRydWUsIGdhc0xpbWl0OiB0cnVlLCBnYXNQcmljZTogdHJ1ZSwgbm9uY2U6IHRydWUsIHRvOiB0cnVlLCB2YWx1ZTogdHJ1ZVxufTtcbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQWRkcmVzcyhrZXkpIHtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSBjb21wdXRlUHVibGljS2V5KGtleSk7XG4gICAgcmV0dXJuIGdldEFkZHJlc3MoaGV4RGF0YVNsaWNlKGtlY2NhazI1NihoZXhEYXRhU2xpY2UocHVibGljS2V5LCAxKSksIDEyKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVjb3ZlckFkZHJlc3MoZGlnZXN0LCBzaWduYXR1cmUpIHtcbiAgICByZXR1cm4gY29tcHV0ZUFkZHJlc3MocmVjb3ZlclB1YmxpY0tleShhcnJheWlmeShkaWdlc3QpLCBzaWduYXR1cmUpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemUodHJhbnNhY3Rpb24sIHNpZ25hdHVyZSkge1xuICAgIGNoZWNrUHJvcGVydGllcyh0cmFuc2FjdGlvbiwgYWxsb3dlZFRyYW5zYWN0aW9uS2V5cyk7XG4gICAgY29uc3QgcmF3ID0gW107XG4gICAgdHJhbnNhY3Rpb25GaWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZmllbGRJbmZvKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRyYW5zYWN0aW9uW2ZpZWxkSW5mby5uYW1lXSB8fCAoW10pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0ge307XG4gICAgICAgIGlmIChmaWVsZEluZm8ubnVtZXJpYykge1xuICAgICAgICAgICAgb3B0aW9ucy5oZXhQYWQgPSBcImxlZnRcIjtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSA9IGFycmF5aWZ5KGhleGxpZnkodmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgLy8gRml4ZWQtd2lkdGggZmllbGRcbiAgICAgICAgaWYgKGZpZWxkSW5mby5sZW5ndGggJiYgdmFsdWUubGVuZ3RoICE9PSBmaWVsZEluZm8ubGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIGxlbmd0aCBmb3IgXCIgKyBmaWVsZEluZm8ubmFtZSwgKFwidHJhbnNhY3Rpb246XCIgKyBmaWVsZEluZm8ubmFtZSksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWYXJpYWJsZS13aWR0aCAod2l0aCBhIG1heGltdW0pXG4gICAgICAgIGlmIChmaWVsZEluZm8ubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IHN0cmlwWmVyb3ModmFsdWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IGZpZWxkSW5mby5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwiaW52YWxpZCBsZW5ndGggZm9yIFwiICsgZmllbGRJbmZvLm5hbWUsIChcInRyYW5zYWN0aW9uOlwiICsgZmllbGRJbmZvLm5hbWUpLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmF3LnB1c2goaGV4bGlmeSh2YWx1ZSkpO1xuICAgIH0pO1xuICAgIGxldCBjaGFpbklkID0gMDtcbiAgICBpZiAodHJhbnNhY3Rpb24uY2hhaW5JZCAhPSBudWxsKSB7XG4gICAgICAgIC8vIEEgY2hhaW5JZCB3YXMgcHJvdmlkZWQ7IGlmIG5vbi16ZXJvIHdlJ2xsIHVzZSBFSVAtMTU1XG4gICAgICAgIGNoYWluSWQgPSB0cmFuc2FjdGlvbi5jaGFpbklkO1xuICAgICAgICBpZiAodHlwZW9mIChjaGFpbklkKSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgdHJhbnNhY3Rpb24uY2hhaW5JZFwiLCBcInRyYW5zYWN0aW9uXCIsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzaWduYXR1cmUgJiYgIWlzQnl0ZXNMaWtlKHNpZ25hdHVyZSkgJiYgc2lnbmF0dXJlLnYgPiAyOCkge1xuICAgICAgICAvLyBObyBjaGFpbklkIHByb3ZpZGVkLCBidXQgdGhlIHNpZ25hdHVyZSBpcyBzaWduaW5nIHdpdGggRUlQLTE1NTsgZGVyaXZlIGNoYWluSWRcbiAgICAgICAgY2hhaW5JZCA9IE1hdGguZmxvb3IoKHNpZ25hdHVyZS52IC0gMzUpIC8gMik7XG4gICAgfVxuICAgIC8vIFdlIGhhdmUgYW4gRUlQLTE1NSB0cmFuc2FjdGlvbiAoY2hhaW5JZCB3YXMgc3BlY2lmaWVkIGFuZCBub24temVybylcbiAgICBpZiAoY2hhaW5JZCAhPT0gMCkge1xuICAgICAgICByYXcucHVzaChoZXhsaWZ5KGNoYWluSWQpKTsgLy8gQFRPRE86IGhleFZhbHVlP1xuICAgICAgICByYXcucHVzaChcIjB4XCIpO1xuICAgICAgICByYXcucHVzaChcIjB4XCIpO1xuICAgIH1cbiAgICAvLyBSZXF1ZXN0aW5nIGFuIHVuc2lnbmVkIHRyYW5zYXRpb25cbiAgICBpZiAoIXNpZ25hdHVyZSkge1xuICAgICAgICByZXR1cm4gUkxQLmVuY29kZShyYXcpO1xuICAgIH1cbiAgICAvLyBUaGUgc3BsaXRTaWduYXR1cmUgd2lsbCBlbnN1cmUgdGhlIHRyYW5zYWN0aW9uIGhhcyBhIHJlY292ZXJ5UGFyYW0gaW4gdGhlXG4gICAgLy8gY2FzZSB0aGF0IHRoZSBzaWduVHJhbnNhY3Rpb24gZnVuY3Rpb24gb25seSBhZGRzIGEgdi5cbiAgICBjb25zdCBzaWcgPSBzcGxpdFNpZ25hdHVyZShzaWduYXR1cmUpO1xuICAgIC8vIFdlIHB1c2hlZCBhIGNoYWluSWQgYW5kIG51bGwgciwgcyBvbiBmb3IgaGFzaGluZyBvbmx5OyByZW1vdmUgdGhvc2VcbiAgICBsZXQgdiA9IDI3ICsgc2lnLnJlY292ZXJ5UGFyYW07XG4gICAgaWYgKGNoYWluSWQgIT09IDApIHtcbiAgICAgICAgcmF3LnBvcCgpO1xuICAgICAgICByYXcucG9wKCk7XG4gICAgICAgIHJhdy5wb3AoKTtcbiAgICAgICAgdiArPSBjaGFpbklkICogMiArIDg7XG4gICAgICAgIC8vIElmIGFuIEVJUC0xNTUgdiAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseTsgbWF5YmUgX3ZzKSB3YXMgcHJvdmlkZWQsIGNoZWNrIGl0IVxuICAgICAgICBpZiAoc2lnLnYgPiAyOCAmJiBzaWcudiAhPT0gdikge1xuICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInRyYW5zYWN0aW9uLmNoYWluSWQvc2lnbmF0dXJlLnYgbWlzbWF0Y2hcIiwgXCJzaWduYXR1cmVcIiwgc2lnbmF0dXJlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChzaWcudiAhPT0gdikge1xuICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwidHJhbnNhY3Rpb24uY2hhaW5JZC9zaWduYXR1cmUudiBtaXNtYXRjaFwiLCBcInNpZ25hdHVyZVwiLCBzaWduYXR1cmUpO1xuICAgIH1cbiAgICByYXcucHVzaChoZXhsaWZ5KHYpKTtcbiAgICByYXcucHVzaChzdHJpcFplcm9zKGFycmF5aWZ5KHNpZy5yKSkpO1xuICAgIHJhdy5wdXNoKHN0cmlwWmVyb3MoYXJyYXlpZnkoc2lnLnMpKSk7XG4gICAgcmV0dXJuIFJMUC5lbmNvZGUocmF3KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShyYXdUcmFuc2FjdGlvbikge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gUkxQLmRlY29kZShyYXdUcmFuc2FjdGlvbik7XG4gICAgaWYgKHRyYW5zYWN0aW9uLmxlbmd0aCAhPT0gOSAmJiB0cmFuc2FjdGlvbi5sZW5ndGggIT09IDYpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgcmF3IHRyYW5zYWN0aW9uXCIsIFwicmF3VHJhbnNhY3Rpb25cIiwgcmF3VHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgICBjb25zdCB0eCA9IHtcbiAgICAgICAgbm9uY2U6IGhhbmRsZU51bWJlcih0cmFuc2FjdGlvblswXSkudG9OdW1iZXIoKSxcbiAgICAgICAgZ2FzUHJpY2U6IGhhbmRsZU51bWJlcih0cmFuc2FjdGlvblsxXSksXG4gICAgICAgIGdhc0xpbWl0OiBoYW5kbGVOdW1iZXIodHJhbnNhY3Rpb25bMl0pLFxuICAgICAgICB0bzogaGFuZGxlQWRkcmVzcyh0cmFuc2FjdGlvblszXSksXG4gICAgICAgIHZhbHVlOiBoYW5kbGVOdW1iZXIodHJhbnNhY3Rpb25bNF0pLFxuICAgICAgICBkYXRhOiB0cmFuc2FjdGlvbls1XSxcbiAgICAgICAgY2hhaW5JZDogMFxuICAgIH07XG4gICAgLy8gTGVnYWN5IHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgaWYgKHRyYW5zYWN0aW9uLmxlbmd0aCA9PT0gNikge1xuICAgICAgICByZXR1cm4gdHg7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIHR4LnYgPSBCaWdOdW1iZXIuZnJvbSh0cmFuc2FjdGlvbls2XSkudG9OdW1iZXIoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIHR4O1xuICAgIH1cbiAgICB0eC5yID0gaGV4WmVyb1BhZCh0cmFuc2FjdGlvbls3XSwgMzIpO1xuICAgIHR4LnMgPSBoZXhaZXJvUGFkKHRyYW5zYWN0aW9uWzhdLCAzMik7XG4gICAgaWYgKEJpZ051bWJlci5mcm9tKHR4LnIpLmlzWmVybygpICYmIEJpZ051bWJlci5mcm9tKHR4LnMpLmlzWmVybygpKSB7XG4gICAgICAgIC8vIEVJUC0xNTUgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICAgICAgdHguY2hhaW5JZCA9IHR4LnY7XG4gICAgICAgIHR4LnYgPSAwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gU2lnbmVkIFRyYW5hc2FjdGlvblxuICAgICAgICB0eC5jaGFpbklkID0gTWF0aC5mbG9vcigodHgudiAtIDM1KSAvIDIpO1xuICAgICAgICBpZiAodHguY2hhaW5JZCA8IDApIHtcbiAgICAgICAgICAgIHR4LmNoYWluSWQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWNvdmVyeVBhcmFtID0gdHgudiAtIDI3O1xuICAgICAgICBjb25zdCByYXcgPSB0cmFuc2FjdGlvbi5zbGljZSgwLCA2KTtcbiAgICAgICAgaWYgKHR4LmNoYWluSWQgIT09IDApIHtcbiAgICAgICAgICAgIHJhdy5wdXNoKGhleGxpZnkodHguY2hhaW5JZCkpO1xuICAgICAgICAgICAgcmF3LnB1c2goXCIweFwiKTtcbiAgICAgICAgICAgIHJhdy5wdXNoKFwiMHhcIik7XG4gICAgICAgICAgICByZWNvdmVyeVBhcmFtIC09IHR4LmNoYWluSWQgKiAyICsgODtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWdlc3QgPSBrZWNjYWsyNTYoUkxQLmVuY29kZShyYXcpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHR4LmZyb20gPSByZWNvdmVyQWRkcmVzcyhkaWdlc3QsIHsgcjogaGV4bGlmeSh0eC5yKSwgczogaGV4bGlmeSh0eC5zKSwgcmVjb3ZlcnlQYXJhbTogcmVjb3ZlcnlQYXJhbSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICB0eC5oYXNoID0ga2VjY2FrMjU2KHJhd1RyYW5zYWN0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHR4O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcInVuaXRzLzUuMC4xMFwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBmb3JtYXRGaXhlZCwgcGFyc2VGaXhlZCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmNvbnN0IG5hbWVzID0gW1xuICAgIFwid2VpXCIsXG4gICAgXCJrd2VpXCIsXG4gICAgXCJtd2VpXCIsXG4gICAgXCJnd2VpXCIsXG4gICAgXCJzemFib1wiLFxuICAgIFwiZmlubmV5XCIsXG4gICAgXCJldGhlclwiLFxuXTtcbi8vIFNvbWUgZW52aXJvbm1lbnRzIGhhdmUgaXNzdWVzIHdpdGggUmVnRXggdGhhdCBjb250YWluIGJhY2stdHJhY2tpbmcsIHNvIHdlIGNhbm5vdFxuLy8gdXNlIHRoZW0uXG5leHBvcnQgZnVuY3Rpb24gY29tbWlmeSh2YWx1ZSkge1xuICAgIGNvbnN0IGNvbXBzID0gU3RyaW5nKHZhbHVlKS5zcGxpdChcIi5cIik7XG4gICAgaWYgKGNvbXBzLmxlbmd0aCA+IDIgfHwgIWNvbXBzWzBdLm1hdGNoKC9eLT9bMC05XSokLykgfHwgKGNvbXBzWzFdICYmICFjb21wc1sxXS5tYXRjaCgvXlswLTldKiQvKSkgfHwgdmFsdWUgPT09IFwiLlwiIHx8IHZhbHVlID09PSBcIi0uXCIpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcImludmFsaWQgdmFsdWVcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB3aG9sZSBkaWdpdCAoMCBpZiBub25lKVxuICAgIGxldCB3aG9sZSA9IGNvbXBzWzBdO1xuICAgIGxldCBuZWdhdGl2ZSA9IFwiXCI7XG4gICAgaWYgKHdob2xlLnN1YnN0cmluZygwLCAxKSA9PT0gXCItXCIpIHtcbiAgICAgICAgbmVnYXRpdmUgPSBcIi1cIjtcbiAgICAgICAgd2hvbGUgPSB3aG9sZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IDEgd2hvbGUgZGlnaXQgd2l0aCBubyBsZWFkaW5nIHplcm9zXG4gICAgd2hpbGUgKHdob2xlLnN1YnN0cmluZygwLCAxKSA9PT0gXCIwXCIpIHtcbiAgICAgICAgd2hvbGUgPSB3aG9sZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIGlmICh3aG9sZSA9PT0gXCJcIikge1xuICAgICAgICB3aG9sZSA9IFwiMFwiO1xuICAgIH1cbiAgICBsZXQgc3VmZml4ID0gXCJcIjtcbiAgICBpZiAoY29tcHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHN1ZmZpeCA9IFwiLlwiICsgKGNvbXBzWzFdIHx8IFwiMFwiKTtcbiAgICB9XG4gICAgd2hpbGUgKHN1ZmZpeC5sZW5ndGggPiAyICYmIHN1ZmZpeFtzdWZmaXgubGVuZ3RoIC0gMV0gPT09IFwiMFwiKSB7XG4gICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5zdWJzdHJpbmcoMCwgc3VmZml4Lmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBbXTtcbiAgICB3aGlsZSAod2hvbGUubGVuZ3RoKSB7XG4gICAgICAgIGlmICh3aG9sZS5sZW5ndGggPD0gMykge1xuICAgICAgICAgICAgZm9ybWF0dGVkLnVuc2hpZnQod2hvbGUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHdob2xlLmxlbmd0aCAtIDM7XG4gICAgICAgICAgICBmb3JtYXR0ZWQudW5zaGlmdCh3aG9sZS5zdWJzdHJpbmcoaW5kZXgpKTtcbiAgICAgICAgICAgIHdob2xlID0gd2hvbGUuc3Vic3RyaW5nKDAsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmVnYXRpdmUgKyBmb3JtYXR0ZWQuam9pbihcIixcIikgKyBzdWZmaXg7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0VW5pdHModmFsdWUsIHVuaXROYW1lKSB7XG4gICAgaWYgKHR5cGVvZiAodW5pdE5hbWUpID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gbmFtZXMuaW5kZXhPZih1bml0TmFtZSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHVuaXROYW1lID0gMyAqIGluZGV4O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtYXRGaXhlZCh2YWx1ZSwgKHVuaXROYW1lICE9IG51bGwpID8gdW5pdE5hbWUgOiAxOCk7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbml0cyh2YWx1ZSwgdW5pdE5hbWUpIHtcbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInZhbHVlIG11c3QgYmUgYSBzdHJpbmdcIiwgXCJ2YWx1ZVwiLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHVuaXROYW1lKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBjb25zdCBpbmRleCA9IG5hbWVzLmluZGV4T2YodW5pdE5hbWUpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB1bml0TmFtZSA9IDMgKiBpbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyc2VGaXhlZCh2YWx1ZSwgKHVuaXROYW1lICE9IG51bGwpID8gdW5pdE5hbWUgOiAxOCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXRoZXIod2VpKSB7XG4gICAgcmV0dXJuIGZvcm1hdFVuaXRzKHdlaSwgMTgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXRoZXIoZXRoZXIpIHtcbiAgICByZXR1cm4gcGFyc2VVbml0cyhldGhlciwgMTgpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcIndhbGxldC81LjAuMTFcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBnZXRBZGRyZXNzIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2FkZHJlc3NcIjtcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2Fic3RyYWN0LXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBTaWduZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYWJzdHJhY3Qtc2lnbmVyXCI7XG5pbXBvcnQgeyBhcnJheWlmeSwgY29uY2F0LCBoZXhEYXRhU2xpY2UsIGlzSGV4U3RyaW5nLCBqb2luU2lnbmF0dXJlIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2J5dGVzXCI7XG5pbXBvcnQgeyBoYXNoTWVzc2FnZSwgX1R5cGVkRGF0YUVuY29kZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvaGFzaFwiO1xuaW1wb3J0IHsgZGVmYXVsdFBhdGgsIEhETm9kZSwgZW50cm9weVRvTW5lbW9uaWMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvaGRub2RlXCI7XG5pbXBvcnQgeyBrZWNjYWsyNTYgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qva2VjY2FrMjU2XCI7XG5pbXBvcnQgeyBkZWZpbmVSZWFkT25seSwgcmVzb2x2ZVByb3BlcnRpZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcmFuZG9tXCI7XG5pbXBvcnQgeyBTaWduaW5nS2V5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3NpZ25pbmcta2V5XCI7XG5pbXBvcnQgeyBkZWNyeXB0SnNvbldhbGxldCwgZGVjcnlwdEpzb25XYWxsZXRTeW5jLCBlbmNyeXB0S2V5c3RvcmUgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvanNvbi13YWxsZXRzXCI7XG5pbXBvcnQgeyBjb21wdXRlQWRkcmVzcywgcmVjb3ZlckFkZHJlc3MsIHNlcmlhbGl6ZSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC90cmFuc2FjdGlvbnNcIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9sb2dnZXJcIjtcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmZ1bmN0aW9uIGlzQWNjb3VudCh2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgIT0gbnVsbCAmJiBpc0hleFN0cmluZyh2YWx1ZS5wcml2YXRlS2V5LCAzMikgJiYgdmFsdWUuYWRkcmVzcyAhPSBudWxsKTtcbn1cbmZ1bmN0aW9uIGhhc01uZW1vbmljKHZhbHVlKSB7XG4gICAgY29uc3QgbW5lbW9uaWMgPSB2YWx1ZS5tbmVtb25pYztcbiAgICByZXR1cm4gKG1uZW1vbmljICYmIG1uZW1vbmljLnBocmFzZSk7XG59XG5leHBvcnQgY2xhc3MgV2FsbGV0IGV4dGVuZHMgU2lnbmVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlS2V5LCBwcm92aWRlcikge1xuICAgICAgICBsb2dnZXIuY2hlY2tOZXcobmV3LnRhcmdldCwgV2FsbGV0KTtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgaWYgKGlzQWNjb3VudChwcml2YXRlS2V5KSkge1xuICAgICAgICAgICAgY29uc3Qgc2lnbmluZ0tleSA9IG5ldyBTaWduaW5nS2V5KHByaXZhdGVLZXkucHJpdmF0ZUtleSk7XG4gICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9zaWduaW5nS2V5XCIsICgpID0+IHNpZ25pbmdLZXkpO1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJhZGRyZXNzXCIsIGNvbXB1dGVBZGRyZXNzKHRoaXMucHVibGljS2V5KSk7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGRyZXNzICE9PSBnZXRBZGRyZXNzKHByaXZhdGVLZXkuYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwicHJpdmF0ZUtleS9hZGRyZXNzIG1pc21hdGNoXCIsIFwicHJpdmF0ZUtleVwiLCBcIltSRURBQ1RFRF1cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzTW5lbW9uaWMocHJpdmF0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcmNNbmVtb25pYyA9IHByaXZhdGVLZXkubW5lbW9uaWM7XG4gICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfbW5lbW9uaWNcIiwgKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgcGhyYXNlOiBzcmNNbmVtb25pYy5waHJhc2UsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHNyY01uZW1vbmljLnBhdGggfHwgZGVmYXVsdFBhdGgsXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogc3JjTW5lbW9uaWMubG9jYWxlIHx8IFwiZW5cIlxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtbmVtb25pYyA9IHRoaXMubW5lbW9uaWM7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IEhETm9kZS5mcm9tTW5lbW9uaWMobW5lbW9uaWMucGhyYXNlLCBudWxsLCBtbmVtb25pYy5sb2NhbGUpLmRlcml2ZVBhdGgobW5lbW9uaWMucGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVBZGRyZXNzKG5vZGUucHJpdmF0ZUtleSkgIT09IHRoaXMuYWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dBcmd1bWVudEVycm9yKFwibW5lbW9uaWMvYWRkcmVzcyBtaXNtYXRjaFwiLCBcInByaXZhdGVLZXlcIiwgXCJbUkVEQUNURURdXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX21uZW1vbmljXCIsICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKFNpZ25pbmdLZXkuaXNTaWduaW5nS2V5KHByaXZhdGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgICAgaWYgKHByaXZhdGVLZXkuY3VydmUgIT09IFwic2VjcDI1NmsxXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInVuc3VwcG9ydGVkIGN1cnZlOyBtdXN0IGJlIHNlY3AyNTZrMVwiLCBcInByaXZhdGVLZXlcIiwgXCJbUkVEQUNURURdXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZpbmVSZWFkT25seSh0aGlzLCBcIl9zaWduaW5nS2V5XCIsICgpID0+IHByaXZhdGVLZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQSBsb3Qgb2YgY29tbW9uIHRvb2xzIGRvIG5vdCBwcmVmaXggcHJpdmF0ZSBrZXlzIHdpdGggYSAweCAoc2VlOiAjMTE2NilcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChwcml2YXRlS2V5KSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJpdmF0ZUtleS5tYXRjaCgvXlswLTlhLWZdKiQvaSkgJiYgcHJpdmF0ZUtleS5sZW5ndGggPT09IDY0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlS2V5ID0gXCIweFwiICsgcHJpdmF0ZUtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzaWduaW5nS2V5ID0gbmV3IFNpZ25pbmdLZXkocHJpdmF0ZUtleSk7XG4gICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJfc2lnbmluZ0tleVwiLCAoKSA9PiBzaWduaW5nS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwiX21uZW1vbmljXCIsICgpID0+IG51bGwpO1xuICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJhZGRyZXNzXCIsIGNvbXB1dGVBZGRyZXNzKHRoaXMucHVibGljS2V5KSk7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChwcm92aWRlciAmJiAhUHJvdmlkZXIuaXNQcm92aWRlcihwcm92aWRlcikpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJpbnZhbGlkIHByb3ZpZGVyXCIsIFwicHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmluZVJlYWRPbmx5KHRoaXMsIFwicHJvdmlkZXJcIiwgcHJvdmlkZXIgfHwgbnVsbCk7XG4gICAgfVxuICAgIGdldCBtbmVtb25pYygpIHsgcmV0dXJuIHRoaXMuX21uZW1vbmljKCk7IH1cbiAgICBnZXQgcHJpdmF0ZUtleSgpIHsgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXkoKS5wcml2YXRlS2V5OyB9XG4gICAgZ2V0IHB1YmxpY0tleSgpIHsgcmV0dXJuIHRoaXMuX3NpZ25pbmdLZXkoKS5wdWJsaWNLZXk7IH1cbiAgICBnZXRBZGRyZXNzKCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYWRkcmVzcyk7XG4gICAgfVxuICAgIGNvbm5lY3QocHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXYWxsZXQodGhpcywgcHJvdmlkZXIpO1xuICAgIH1cbiAgICBzaWduVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9wZXJ0aWVzKHRyYW5zYWN0aW9uKS50aGVuKCh0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR4LmZyb20gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChnZXRBZGRyZXNzKHR4LmZyb20pICE9PSB0aGlzLmFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRocm93QXJndW1lbnRFcnJvcihcInRyYW5zYWN0aW9uIGZyb20gYWRkcmVzcyBtaXNtYXRjaFwiLCBcInRyYW5zYWN0aW9uLmZyb21cIiwgdHJhbnNhY3Rpb24uZnJvbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0eC5mcm9tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy5fc2lnbmluZ0tleSgpLnNpZ25EaWdlc3Qoa2VjY2FrMjU2KHNlcmlhbGl6ZSh0eCkpKTtcbiAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemUodHgsIHNpZ25hdHVyZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzaWduTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gam9pblNpZ25hdHVyZSh0aGlzLl9zaWduaW5nS2V5KCkuc2lnbkRpZ2VzdChoYXNoTWVzc2FnZShtZXNzYWdlKSkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3NpZ25UeXBlZERhdGEoZG9tYWluLCB0eXBlcywgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIC8vIFBvcHVsYXRlIGFueSBFTlMgbmFtZXNcbiAgICAgICAgICAgIGNvbnN0IHBvcHVsYXRlZCA9IHlpZWxkIF9UeXBlZERhdGFFbmNvZGVyLnJlc29sdmVOYW1lcyhkb21haW4sIHR5cGVzLCB2YWx1ZSwgKG5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm92aWRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci50aHJvd0Vycm9yKFwiY2Fubm90IHJlc29sdmUgRU5TIG5hbWVzIHdpdGhvdXQgYSBwcm92aWRlclwiLCBMb2dnZXIuZXJyb3JzLlVOU1VQUE9SVEVEX09QRVJBVElPTiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBcInJlc29sdmVOYW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmFtZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIucmVzb2x2ZU5hbWUobmFtZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBqb2luU2lnbmF0dXJlKHRoaXMuX3NpZ25pbmdLZXkoKS5zaWduRGlnZXN0KF9UeXBlZERhdGFFbmNvZGVyLmhhc2gocG9wdWxhdGVkLmRvbWFpbiwgdHlwZXMsIHBvcHVsYXRlZC52YWx1ZSkpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVuY3J5cHQocGFzc3dvcmQsIG9wdGlvbnMsIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZiAob3B0aW9ucykgPT09IFwiZnVuY3Rpb25cIiAmJiAhcHJvZ3Jlc3NDYWxsYmFjaykge1xuICAgICAgICAgICAgcHJvZ3Jlc3NDYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyZXNzQ2FsbGJhY2sgJiYgdHlwZW9mIChwcm9ncmVzc0NhbGxiYWNrKSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGNhbGxiYWNrXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbmNyeXB0S2V5c3RvcmUodGhpcywgcGFzc3dvcmQsIG9wdGlvbnMsIHByb2dyZXNzQ2FsbGJhY2spO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiAgU3RhdGljIG1ldGhvZHMgdG8gY3JlYXRlIFdhbGxldCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJhbmRvbShvcHRpb25zKSB7XG4gICAgICAgIGxldCBlbnRyb3B5ID0gcmFuZG9tQnl0ZXMoMTYpO1xuICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5leHRyYUVudHJvcHkpIHtcbiAgICAgICAgICAgIGVudHJvcHkgPSBhcnJheWlmeShoZXhEYXRhU2xpY2Uoa2VjY2FrMjU2KGNvbmNhdChbZW50cm9weSwgb3B0aW9ucy5leHRyYUVudHJvcHldKSksIDAsIDE2KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW5lbW9uaWMgPSBlbnRyb3B5VG9NbmVtb25pYyhlbnRyb3B5LCBvcHRpb25zLmxvY2FsZSk7XG4gICAgICAgIHJldHVybiBXYWxsZXQuZnJvbU1uZW1vbmljKG1uZW1vbmljLCBvcHRpb25zLnBhdGgsIG9wdGlvbnMubG9jYWxlKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21FbmNyeXB0ZWRKc29uKGpzb24sIHBhc3N3b3JkLCBwcm9ncmVzc0NhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiBkZWNyeXB0SnNvbldhbGxldChqc29uLCBwYXNzd29yZCwgcHJvZ3Jlc3NDYWxsYmFjaykudGhlbigoYWNjb3VudCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWxsZXQoYWNjb3VudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUVuY3J5cHRlZEpzb25TeW5jKGpzb24sIHBhc3N3b3JkKSB7XG4gICAgICAgIHJldHVybiBuZXcgV2FsbGV0KGRlY3J5cHRKc29uV2FsbGV0U3luYyhqc29uLCBwYXNzd29yZCkpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbU1uZW1vbmljKG1uZW1vbmljLCBwYXRoLCB3b3JkbGlzdCkge1xuICAgICAgICBpZiAoIXBhdGgpIHtcbiAgICAgICAgICAgIHBhdGggPSBkZWZhdWx0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFdhbGxldChIRE5vZGUuZnJvbU1uZW1vbmljKG1uZW1vbmljLCBudWxsLCB3b3JkbGlzdCkuZGVyaXZlUGF0aChwYXRoKSk7XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeU1lc3NhZ2UobWVzc2FnZSwgc2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIHJlY292ZXJBZGRyZXNzKGhhc2hNZXNzYWdlKG1lc3NhZ2UpLCBzaWduYXR1cmUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVR5cGVkRGF0YShkb21haW4sIHR5cGVzLCB2YWx1ZSwgc2lnbmF0dXJlKSB7XG4gICAgcmV0dXJuIHJlY292ZXJBZGRyZXNzKF9UeXBlZERhdGFFbmNvZGVyLmhhc2goZG9tYWluLCB0eXBlcywgdmFsdWUpLCBzaWduYXR1cmUpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcIndlYi81LjAuMTNcIjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPV92ZXJzaW9uLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBhcnJheWlmeSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVybChocmVmLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICBtZXRob2Q6IChvcHRpb25zLm1ldGhvZCB8fCBcIkdFVFwiKSxcbiAgICAgICAgICAgIGhlYWRlcnM6IChvcHRpb25zLmhlYWRlcnMgfHwge30pLFxuICAgICAgICAgICAgYm9keTogKG9wdGlvbnMuYm9keSB8fCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXG4gICAgICAgICAgICBjYWNoZTogXCJuby1jYWNoZVwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwic2FtZS1vcmlnaW5cIixcbiAgICAgICAgICAgIHJlZGlyZWN0OiBcImZvbGxvd1wiLFxuICAgICAgICAgICAgcmVmZXJyZXI6IFwiY2xpZW50XCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0geWllbGQgZmV0Y2goaHJlZiwgcmVxdWVzdCk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB5aWVsZCByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0ge307XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmZvckVhY2gpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICgocmVzcG9uc2UuaGVhZGVycykua2V5cykoKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzW2tleS50b0xvd2VyQ2FzZSgpXSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICBib2R5OiBhcnJheWlmeShuZXcgVWludDhBcnJheShib2R5KSksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXR1cmwuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IGVuY29kZSBhcyBiYXNlNjRFbmNvZGUgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmFzZTY0XCI7XG5pbXBvcnQgeyBoZXhsaWZ5LCBpc0J5dGVzTGlrZSB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgc2hhbGxvd0NvcHkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMsIHRvVXRmOFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9zdHJpbmdzXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSBcIi4vX3ZlcnNpb25cIjtcbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIodmVyc2lvbik7XG5pbXBvcnQgeyBnZXRVcmwgfSBmcm9tIFwiLi9nZXR1cmxcIjtcbmZ1bmN0aW9uIHN0YWxsZXIoZHVyYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBkdXJhdGlvbik7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBib2R5aWZ5KHZhbHVlLCB0eXBlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGlmIChpc0J5dGVzTGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKHR5cGUgJiYgKHR5cGUuc3BsaXQoXCIvXCIpWzBdID09PSBcInRleHRcIiB8fCB0eXBlLnNwbGl0KFwiO1wiKVswXS50cmltKCkgPT09IFwiYXBwbGljYXRpb24vanNvblwiKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9VdGY4U3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgICAgICA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhleGxpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vLyBUaGlzIEFQSSBpcyBzdGlsbCBhIHdvcmsgaW4gcHJvZ3Jlc3M7IHRoZSBmdXR1cmUgY2hhbmdlcyB3aWxsIGxpa2VseSBiZTpcbi8vIC0gQ29ubmVjdGlvbkluZm8gPT4gRmV0Y2hEYXRhUmVxdWVzdDxUID0gYW55PlxuLy8gLSBGZXRjaERhdGFSZXF1ZXN0LmJvZHk/ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHsgY29udGVudFR5cGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgVWludDhBcnJheSB9XG4vLyAgIC0gSWYgc3RyaW5nID0+IHRleHQvcGxhaW4sIFVpbnQ4QXJyYXkgPT4gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIChpZiBjb250ZW50LXR5cGUgdW5zcGVjaWZpZWQpXG4vLyAtIEZldGNoRGF0YVJlcXVlc3QucHJvY2Vzc0Z1bmMgPSAoYm9keTogVWludDhBcnJheSwgcmVzcG9uc2U6IEZldGNoRGF0YVJlc3BvbnNlKSA9PiBUXG4vLyBGb3IgdGhpcyByZWFzb24sIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGludGVybmFsIHVudGlsIHRoZSBBUEkgaXMgZmluYWxpemVkXG5leHBvcnQgZnVuY3Rpb24gX2ZldGNoRGF0YShjb25uZWN0aW9uLCBib2R5LCBwcm9jZXNzRnVuYykge1xuICAgIC8vIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGluIHRoZSBldmVudCBvZiBhIHRocm90dGxlXG4gICAgY29uc3QgYXR0ZW1wdExpbWl0ID0gKHR5cGVvZiAoY29ubmVjdGlvbikgPT09IFwib2JqZWN0XCIgJiYgY29ubmVjdGlvbi50aHJvdHRsZUxpbWl0ICE9IG51bGwpID8gY29ubmVjdGlvbi50aHJvdHRsZUxpbWl0IDogMTI7XG4gICAgbG9nZ2VyLmFzc2VydEFyZ3VtZW50KChhdHRlbXB0TGltaXQgPiAwICYmIChhdHRlbXB0TGltaXQgJSAxKSA9PT0gMCksIFwiaW52YWxpZCBjb25uZWN0aW9uIHRocm90dGxlIGxpbWl0XCIsIFwiY29ubmVjdGlvbi50aHJvdHRsZUxpbWl0XCIsIGF0dGVtcHRMaW1pdCk7XG4gICAgY29uc3QgdGhyb3R0bGVDYWxsYmFjayA9ICgodHlwZW9mIChjb25uZWN0aW9uKSA9PT0gXCJvYmplY3RcIikgPyBjb25uZWN0aW9uLnRocm90dGxlQ2FsbGJhY2sgOiBudWxsKTtcbiAgICBjb25zdCB0aHJvdHRsZVNsb3RJbnRlcnZhbCA9ICgodHlwZW9mIChjb25uZWN0aW9uKSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKGNvbm5lY3Rpb24udGhyb3R0bGVTbG90SW50ZXJ2YWwpID09PSBcIm51bWJlclwiKSA/IGNvbm5lY3Rpb24udGhyb3R0bGVTbG90SW50ZXJ2YWwgOiAxMDApO1xuICAgIGxvZ2dlci5hc3NlcnRBcmd1bWVudCgodGhyb3R0bGVTbG90SW50ZXJ2YWwgPiAwICYmICh0aHJvdHRsZVNsb3RJbnRlcnZhbCAlIDEpID09PSAwKSwgXCJpbnZhbGlkIGNvbm5lY3Rpb24gdGhyb3R0bGUgc2xvdCBpbnRlcnZhbFwiLCBcImNvbm5lY3Rpb24udGhyb3R0bGVTbG90SW50ZXJ2YWxcIiwgdGhyb3R0bGVTbG90SW50ZXJ2YWwpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcbiAgICBsZXQgdXJsID0gbnVsbDtcbiAgICAvLyBAVE9ETzogQWxsb3cgQ29ubmVjdGlvbkluZm8gdG8gb3ZlcnJpZGUgc29tZSBvZiB0aGVzZSB2YWx1ZXNcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgfTtcbiAgICBsZXQgYWxsb3czMDQgPSBmYWxzZTtcbiAgICBsZXQgdGltZW91dCA9IDIgKiA2MCAqIDEwMDA7XG4gICAgaWYgKHR5cGVvZiAoY29ubmVjdGlvbikgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdXJsID0gY29ubmVjdGlvbjtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIChjb25uZWN0aW9uKSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBudWxsIHx8IGNvbm5lY3Rpb24udXJsID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZ2dlci50aHJvd0FyZ3VtZW50RXJyb3IoXCJtaXNzaW5nIFVSTFwiLCBcImNvbm5lY3Rpb24udXJsXCIsIGNvbm5lY3Rpb24pO1xuICAgICAgICB9XG4gICAgICAgIHVybCA9IGNvbm5lY3Rpb24udXJsO1xuICAgICAgICBpZiAodHlwZW9mIChjb25uZWN0aW9uLnRpbWVvdXQpID09PSBcIm51bWJlclwiICYmIGNvbm5lY3Rpb24udGltZW91dCA+IDApIHtcbiAgICAgICAgICAgIHRpbWVvdXQgPSBjb25uZWN0aW9uLnRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaGVhZGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29ubmVjdGlvbi5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSB7IGtleToga2V5LCB2YWx1ZTogU3RyaW5nKGNvbm5lY3Rpb24uaGVhZGVyc1trZXldKSB9O1xuICAgICAgICAgICAgICAgIGlmIChbXCJpZi1ub25lLW1hdGNoXCIsIFwiaWYtbW9kaWZpZWQtc2luY2VcIl0uaW5kZXhPZihrZXkudG9Mb3dlckNhc2UoKSkgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhbGxvdzMwNCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMuYWxsb3dHemlwID0gISFjb25uZWN0aW9uLmFsbG93R3ppcDtcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24udXNlciAhPSBudWxsICYmIGNvbm5lY3Rpb24ucGFzc3dvcmQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHVybC5zdWJzdHJpbmcoMCwgNikgIT09IFwiaHR0cHM6XCIgJiYgY29ubmVjdGlvbi5hbGxvd0luc2VjdXJlQXV0aGVudGljYXRpb24gIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImJhc2ljIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVzIGEgc2VjdXJlIGh0dHBzIHVybFwiLCBMb2dnZXIuZXJyb3JzLklOVkFMSURfQVJHVU1FTlQsIHsgYXJndW1lbnQ6IFwidXJsXCIsIHVybDogdXJsLCB1c2VyOiBjb25uZWN0aW9uLnVzZXIsIHBhc3N3b3JkOiBcIltSRURBQ1RFRF1cIiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGF1dGhvcml6YXRpb24gPSBjb25uZWN0aW9uLnVzZXIgKyBcIjpcIiArIGNvbm5lY3Rpb24ucGFzc3dvcmQ7XG4gICAgICAgICAgICBoZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXSA9IHtcbiAgICAgICAgICAgICAgICBrZXk6IFwiQXV0aG9yaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBcIkJhc2ljIFwiICsgYmFzZTY0RW5jb2RlKHRvVXRmOEJ5dGVzKGF1dGhvcml6YXRpb24pKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoYm9keSkge1xuICAgICAgICBvcHRpb25zLm1ldGhvZCA9IFwiUE9TVFwiO1xuICAgICAgICBvcHRpb25zLmJvZHkgPSBib2R5O1xuICAgICAgICBpZiAoaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC10eXBlXCJdID0geyBrZXk6IFwiQ29udGVudC1UeXBlXCIsIHZhbHVlOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlYWRlcnNbXCJjb250ZW50LWxlbmd0aFwiXSA9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0gPSB7IGtleTogXCJDb250ZW50LUxlbmd0aFwiLCB2YWx1ZTogU3RyaW5nKGJvZHkubGVuZ3RoKSB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZsYXRIZWFkZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGhlYWRlcnNba2V5XTtcbiAgICAgICAgZmxhdEhlYWRlcnNbaGVhZGVyLmtleV0gPSBoZWFkZXIudmFsdWU7XG4gICAgfSk7XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gZmxhdEhlYWRlcnM7XG4gICAgY29uc3QgcnVubmluZ1RpbWVvdXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgdGltZXIgPSBudWxsO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGxvZ2dlci5tYWtlRXJyb3IoXCJ0aW1lb3V0XCIsIExvZ2dlci5lcnJvcnMuVElNRU9VVCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHk6IGJvZHlpZnkob3B0aW9ucy5ib2R5LCBmbGF0SGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHByb21pc2UsIGNhbmNlbCB9O1xuICAgIH0pKCk7XG4gICAgY29uc3QgcnVubmluZ0ZldGNoID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgYXR0ZW1wdExpbWl0OyBhdHRlbXB0KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geWllbGQgZ2V0VXJsKHVybCwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2stb2ZmIHRocm90dGxpbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQyOSAmJiBhdHRlbXB0IDwgYXR0ZW1wdExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJ5QWdhaW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlBZ2FpbiA9IHlpZWxkIHRocm90dGxlQ2FsbGJhY2soYXR0ZW1wdCwgdXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZ2Fpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFsbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnNbXCJyZXRyeS1hZnRlclwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRyeUFmdGVyKSA9PT0gXCJzdHJpbmdcIiAmJiByZXRyeUFmdGVyLm1hdGNoKC9eWzEtOV1bMC05XSokLykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbGwgPSBwYXJzZUludChyZXRyeUFmdGVyKSAqIDEwMDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFsbCA9IHRocm90dGxlU2xvdEludGVydmFsICogcGFyc2VJbnQoU3RyaW5nKE1hdGgucmFuZG9tKCkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiU3RhbGxpbmcgNDI5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0YWxsZXIoc3RhbGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGVycm9yLnJlc3BvbnNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ1RpbWVvdXQuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcIm1pc3NpbmcgcmVzcG9uc2VcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keTogYm9keWlmeShvcHRpb25zLmJvZHksIGZsYXRIZWFkZXJzW1wiY29udGVudC10eXBlXCJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFcnJvcjogZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICBpZiAoYWxsb3czMDQgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gMzA0KSB7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMzAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJ1bm5pbmdUaW1lb3V0LmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImJhZCByZXNwb25zZVwiLCBMb2dnZXIuZXJyb3JzLlNFUlZFUl9FUlJPUiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogcmVzcG9uc2UuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlpZnkoYm9keSwgKChyZXNwb25zZS5oZWFkZXJzKSA/IHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0gOiBudWxsKSksXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keTogYm9keWlmeShvcHRpb25zLmJvZHksIGZsYXRIZWFkZXJzW1wiY29udGVudC10eXBlXCJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2Q6IG9wdGlvbnMubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzRnVuYykge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcHJvY2Vzc0Z1bmMoYm9keSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ1RpbWVvdXQuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhlIHByb2Nlc3NGdW5jIHRvIHRyaWdnZXIgYSB0aHJvdHRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnRocm90dGxlUmV0cnkgJiYgYXR0ZW1wdCA8IGF0dGVtcHRMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cnlBZ2FpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocm90dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5QWdhaW4gPSB5aWVsZCB0aHJvdHRsZUNhbGxiYWNrKGF0dGVtcHQsIHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cnlBZ2Fpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gdGhyb3R0bGVTbG90SW50ZXJ2YWwgKiBwYXJzZUludChTdHJpbmcoTWF0aC5yYW5kb20oKSAqIE1hdGgucG93KDIsIGF0dGVtcHQpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJTdGFsbGluZyBjYWxsYmFja1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3RhbGxlcih0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZ1RpbWVvdXQuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcInByb2Nlc3NpbmcgcmVzcG9uc2UgZXJyb3JcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBib2R5aWZ5KGJvZHksICgocmVzcG9uc2UuaGVhZGVycykgPyByZXNwb25zZS5oZWFkZXJzW1wiY29udGVudC10eXBlXCJdIDogbnVsbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keTogYm9keWlmeShvcHRpb25zLmJvZHksIGZsYXRIZWFkZXJzW1wiY29udGVudC10eXBlXCJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcnVubmluZ1RpbWVvdXQuY2FuY2VsKCk7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGFkIGEgcHJvY2Vzc0Z1bmMsIGl0IGVpdGVociByZXR1cm5lZCBhIFQgb3IgdGhyZXcgYWJvdmUuXG4gICAgICAgICAgICAgICAgLy8gVGhlIFwiYm9keVwiIGlzIG5vdyBhIFVpbnQ4QXJyYXkuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbG9nZ2VyLnRocm93RXJyb3IoXCJmYWlsZWQgcmVzcG9uc2VcIiwgTG9nZ2VyLmVycm9ycy5TRVJWRVJfRVJST1IsIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keTogYm9keWlmeShvcHRpb25zLmJvZHksIGZsYXRIZWFkZXJzW1wiY29udGVudC10eXBlXCJdKSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgICAgICB1cmw6IHVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIFByb21pc2UucmFjZShbcnVubmluZ1RpbWVvdXQucHJvbWlzZSwgcnVubmluZ0ZldGNoXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hKc29uKGNvbm5lY3Rpb24sIGpzb24sIHByb2Nlc3NGdW5jKSB7XG4gICAgbGV0IHByb2Nlc3NKc29uRnVuYyA9ICh2YWx1ZSwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UodG9VdGY4U3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIudGhyb3dFcnJvcihcImludmFsaWQgSlNPTlwiLCBMb2dnZXIuZXJyb3JzLlNFUlZFUl9FUlJPUiwge1xuICAgICAgICAgICAgICAgICAgICBib2R5OiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3NGdW5jKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBwcm9jZXNzRnVuYyhyZXN1bHQsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgLy8gSWYgd2UgaGF2ZSBqc29uIHRvIHNlbmQsIHdlIG11c3RcbiAgICAvLyAtIGFkZCBjb250ZW50LXR5cGUgb2YgYXBwbGljYXRpb24vanNvbiAodW5sZXNzIGFscmVhZHkgb3ZlcnJpZGRlbilcbiAgICAvLyAtIGNvbnZlcnQgdGhlIGpzb24gdG8gYnl0ZXNcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgaWYgKGpzb24gIT0gbnVsbCkge1xuICAgICAgICBib2R5ID0gdG9VdGY4Qnl0ZXMoanNvbik7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgY29udGVudC10eXBlIHNldCBmb3IgSlNPTlxuICAgICAgICBjb25zdCB1cGRhdGVkID0gKHR5cGVvZiAoY29ubmVjdGlvbikgPT09IFwic3RyaW5nXCIpID8gKHsgdXJsOiBjb25uZWN0aW9uIH0pIDogc2hhbGxvd0NvcHkoY29ubmVjdGlvbik7XG4gICAgICAgIGlmICh1cGRhdGVkLmhlYWRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gKE9iamVjdC5rZXlzKHVwZGF0ZWQuaGVhZGVycykuZmlsdGVyKChrKSA9PiAoay50b0xvd2VyQ2FzZSgpID09PSBcImNvbnRlbnQtdHlwZVwiKSkubGVuZ3RoKSAhPT0gMDtcbiAgICAgICAgICAgIGlmICghaGFzQ29udGVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVkLmhlYWRlcnMgPSBzaGFsbG93Q29weSh1cGRhdGVkLmhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZWQuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXSA9IFwiYXBwbGljYXRpb24vanNvblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlZC5oZWFkZXJzID0geyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbm5lY3Rpb24gPSB1cGRhdGVkO1xuICAgIH1cbiAgICByZXR1cm4gX2ZldGNoRGF0YShjb25uZWN0aW9uLCBib2R5LCBwcm9jZXNzSnNvbkZ1bmMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHBvbGwoZnVuYywgb3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIG9wdGlvbnMgPSBzaGFsbG93Q29weShvcHRpb25zKTtcbiAgICBpZiAob3B0aW9ucy5mbG9vciA9PSBudWxsKSB7XG4gICAgICAgIG9wdGlvbnMuZmxvb3IgPSAwO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jZWlsaW5nID09IG51bGwpIHtcbiAgICAgICAgb3B0aW9ucy5jZWlsaW5nID0gMTAwMDA7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmludGVydmFsID09IG51bGwpIHtcbiAgICAgICAgb3B0aW9ucy5pbnRlcnZhbCA9IDI1MDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgbGV0IHRpbWVyID0gbnVsbDtcbiAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGNhbmNlbCB3YXMgc3VjY2Vzc2Z1bC4gVW5zdWNjZXNzZnVsIGNhbmNlbCBtZWFucyB3ZSdyZSBhbHJlYWR5IGRvbmUuXG4gICAgICAgIGNvbnN0IGNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJ0aW1lb3V0XCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBvcHRpb25zLnRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHJ5TGltaXQgPSBvcHRpb25zLnJldHJ5TGltaXQ7XG4gICAgICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAgICAgZnVuY3Rpb24gY2hlY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuYygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSByZXN1bHQsIG9yIGFyZSBhbGxvd2VkIG51bGwgdGhlbiB3ZSdyZSBkb25lXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5jZWwoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMub25jZVBvbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vbmNlUG9sbC5vbmNlKFwicG9sbFwiLCBjaGVjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMub25jZUJsb2NrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub25jZUJsb2NrLm9uY2UoXCJibG9ja1wiLCBjaGVjayk7XG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZXhwb25lbnRpYWwgYmFjay1vZmYgKHVwIHRvIDEwcykgb3VyIG5leHQgcmVxdWVzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZG9uZSkge1xuICAgICAgICAgICAgICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0ID4gcmV0cnlMaW1pdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmNlbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcInJldHJ5IGxpbWl0IHJlYWNoZWRcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aW1lb3V0ID0gb3B0aW9ucy5pbnRlcnZhbCAqIHBhcnNlSW50KFN0cmluZyhNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMiwgYXR0ZW1wdCkpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPCBvcHRpb25zLmZsb29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gb3B0aW9ucy5mbG9vcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dCA+IG9wdGlvbnMuY2VpbGluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG9wdGlvbnMuY2VpbGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrLCB0aW1lb3V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FuY2VsKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjaGVjaygpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiZXhwb3J0IGNvbnN0IHZlcnNpb24gPSBcIndvcmRsaXN0cy81LjAuOVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBXb3JkbGlzdHNcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDAzOS9iaXAtMDAzOS13b3JkbGlzdHMubWRcbmltcG9ydCB7IGxvZ2dlciwgV29yZGxpc3QgfSBmcm9tIFwiLi93b3JkbGlzdFwiO1xuaW1wb3J0IHsgd29yZGxpc3RzIH0gZnJvbSBcIi4vd29yZGxpc3RzXCI7XG5leHBvcnQgeyBsb2dnZXIsIFdvcmRsaXN0LCB3b3JkbGlzdHMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgV29yZGxpc3QgfSBmcm9tIFwiLi93b3JkbGlzdFwiO1xuY29uc3Qgd29yZHMgPSBcIkFiZGlrYWNlQWJlY2VkYUFkcmVzYUFncmVzZUFrY2VBa3RvdmthQWxlakFsa29ob2xBbXB1dGFjZUFuYW5hc0FuZHVsa2FBbmVrZG90YUFua2V0YUFudGlrYUFudWxvdmF0QXJjaGFBcm9nYW5jZUFzZmFsdEFzaXN0ZW50QXNwaXJhY2VBc3RtYUFzdHJvbm9tQXRsYXNBdGxldGlrYUF0b2xBdXRvYnVzQXp5bEJhYmthQmFjaG9yQmFjaWxCYWN1bGthQmFkYXRlbEJhZ2V0YUJhZ3JCYWhub0Jha3RlcmllQmFsYWRhQmFsZXRrYUJhbGtvbkJhbG9uZWtCYWx2YW5CYWx6YUJhbWJ1c0JhbmtvbWF0QmFyYmFyQmFyZXRCYXJtYW5CYXJva29CYXJ2YUJhdGVya2FCYXRvaEJhdmxuYUJhemFsa2FCYXppbGlrYUJhenVrYUJlZG5hQmVyYW5CZXNlZGFCZXN0aWVCZXRvbkJlemlua2FCZXptb2NCZXp0YWtCaWN5a2xCaWRsb0JpZnRla0Jpa2lueUJpbGFuY2VCaW9ncmFmQmlvbG9nQml0dmFCaXpvbkJsYWhvYnl0QmxhdG91Y2hCbGVjaGFCbGVkdWxlQmxlc2tCbGlrYXRCbGl6bmFCbG9rb3ZhdEJsb3VkaXRCbHVkQm9iZWtCb2JyQm9kbGluYUJvZG5vdXRCb2hhdG9zdEJvamtvdEJvam92YXRCb2tvcnlzQm9sZXN0Qm9yZWNCb3JvdmljZUJvdGFCb3ViZWxCb3VjaGF0Qm91ZGFCb3VsZUJvdXJhdEJveGVyQnJhZGF2a2FCcmFtYm9yYUJyYW5rYUJyYXRyQnJlcHRhQnJpa2V0YUJya29CcmxvaEJyb256QnJvc2tldkJydW5ldGthQnJ1c2lua2FCcnpkYUJyenlCdWJsaW5hQnVibm92YXRCdWNodGFCdWRpdGVsQnVka2FCdWRvdmFCdWZldEJ1amFyb3N0QnVrdmljZUJ1bGRva0J1bHZhQnVuZGFCdW5rckJ1cnphQnV0aWtCdXZvbEJ1em9sYUJ5ZGxldEJ5bGluYUJ5dG92a2FCenVrb3RDYXBhcnRDYXJldm5hQ2VkckNlZHVsZUNlamNoQ2VqbkNlbGFDZWxlckNlbGtlbUNlbG5pY2VDZW5pbmFDZW5ub3N0Q2Vub3ZrYUNlbnRydW1DZW56b3JDZXN0b3Bpc0NldGthQ2hhbHVwYUNoYXBhZGxvQ2hhcml0YUNoYXRhQ2hlY2h0YXRDaGVtaWVDaGljaG90Q2hpcnVyZ0NobGFkQ2hsZWJhQ2hsdWJpdENobWVsQ2htdXJhQ2hvYm90Q2hvY2hvbENob2RiYUNob2xlcmFDaG9tb3V0Q2hvcGl0Q2hvcm9iYUNob3ZDaHJhcG90Q2hybGl0Q2hydENocnVwQ2h0aXZvc3RDaHVkaW5hQ2h1dG5hdENodmF0Q2h2aWxrYUNodm9zdENoeWJhQ2h5c3RhdENoeXRpdENpYnVsZUNpZ2FyZXRhQ2loZWxuYUNpaGxhQ2lua290Q2lya3VzQ2lzdGVybmFDaXRhY2VDaXRydXNDaXppbmVjQ2l6b3N0Q2xvbmFDb2tvbGl2Q291dmF0Q3RpdGVsQ3Rub3N0Q3Vkbm9zdEN1a2V0YUN1a3JDdXBvdEN2YWtub3V0Q3ZhbEN2aWtDdnJrb3RDeWtsaXN0YURhbGVrb0RhcmViYURhdGVsRGF0dW1EY2VyYURlYmF0YURlY2hvdmthRGVjaWJlbERlZmljaXREZWZsYWNlRGVrbERla3JldERlbW9rcmF0RGVwcmVzZURlcmJ5RGVza2FEZXRla3RpdkRpa29icmF6RGlrdG92YXREaW9kYURpcGxvbURpc2tEaXNwbGVqRGl2YWRsb0Rpdm9jaERsYWhhRGxvdWhvRGx1aG9waXNEbmVzRG9icm9Eb2J5dGVrRG9jZW50RG9jaHV0aXREb2RuZXNEb2hsZWREb2hvZGFEb2hyYURvamVtRG9qbmljZURva2xhZERva29sYURva3RvckRva3VtZW50RG9sYXJEb2xldmFEb2xpbmFEb21hRG9taW5hbnREb21sdXZpdERvbW92RG9udXRpdERvcGFkRG9waXNEb3Bsbml0RG9wb3N1ZERvcHJvdm9kRG9wdXN0aXREb3Jheml0RG9yb3N0RG9ydERvc2FoRG9zbG92RG9zdGF0ZWtEb3N1ZERvc3l0YURvdGF6RG90ZWtEb3Rrbm91dERvdWZhdERvdXRuYXREb3ZvemNlRG96YWR1RG96bmF0RG96b3JjZURyYWhvdGFEcmFrRHJhbWF0aWtEcmF2ZWNEcmF6ZURyZG9sRHJvYm5vc3REcm9nZXJpZURyb3pkRHJzbm9zdERydGl0RHJ6b3N0RHViZW5EdWNob3Zub0R1ZGVrRHVoYUR1aG92a2FEdXNpdER1c25vRHV0b3N0RHZvamljZUR2b3JlY0R5bmFtaXRFa29sb2dFa29ub21pZUVsZWt0cm9uRWxpcHNhRW1haWxFbWlzZUVtb2NlRW1wYXRpZUVwaXpvZGFFcG9jaGFFcG9wZWpFcG9zRXNlakVzZW5jZUVza29ydGFFc2t5bW9FdGlrZXRhRXVmb3JpZUV2b2x1Y2VFeGVrdWNlRXhrdXJ6ZUV4cGVkaWNlRXhwbG96ZUV4cG9ydEV4dHJha3RGYWNrYUZhamZrYUZha3VsdGFGYW5hdGlrRmFudGF6aWVGYXJtYWNpZUZhdm9yaXRGYXpvbGVGZWRlcmFjZUZlamV0b25GZW5rYUZpYWxrYUZpZ3VyYW50Rmlsb3pvZkZpbHRyRmluYW5jZUZpbnRhRml4YWNlRmpvcmRGbGFuZWxGbGlydEZsb3RpbGFGb25kRm9zZm9yRm90YmFsRm90a2FGb3RvbkZyYWtjZUZyZXNrYUZyb250YUZ1a2FyRnVua2NlRnl6aWthR2FsZWplR2FyYW50R2VuZXRpa2FHZW9sb2dHaWxvdGluYUdsYXp1cmFHbGVqdEdvbGVtR29sZmlzdGFHb3Rpa2FHcmFmR3JhbW9mb25HcmFudWxlR3JlcEdyaWxHcm9nR3JvdGVza2FHdW1hSGFkaWNlSGFkckhhbGFIYWxlbmthSGFuYmFIYW5vcGlzSGFyZmFIYXJwdW5hSGF2cmFuSGVia29zdEhlamthbEhlam5vSGVqdG1hbkhla3RhckhlbG1hSGVtYXRvbUhlcmVjSGVybmFIZXNsb0hlemt5SGlzdG9yaWtIbGFkb3ZrYUhsYXNpdmt5SGxhdmFIbGVkYXRIbGVuSGxvZGF2ZWNIbG9oSGxvdXBvc3RIbHRhdEhsdWJpbmFIbHVjaG90YUhtYXRIbW90YUhteXpIbmlzSG5vaml2b0hub3V0SG9ibGluYUhvYm9qSG9jaEhvZGlueUhvZGxhdEhvZG5vdGFIb2RvdmF0SG9qbm9zdEhva2VqSG9saW5rYUhvbGthSG9sdWJIb21vbGVIb25pdGJhSG9ub3JhY2VIb3JhbEhvcmRhSG9yaXpvbnRIb3Jrb0hvcmxpdmVjSG9ybW9uSG9ybmluYUhvcm9za29wSG9yc3R2b0hvc3BvZGFIb3N0aW5hSG90b3Zvc3RIb3ViYUhvdWZIb3VwYXRIb3Vza2FIb3ZvckhyYWRiYUhyYW5pY2VIcmF2b3N0SHJhemRhSHJib2xla0hyZGluYUhyZGxvSHJkb3N0SHJuZWtIcm9ia2FIcm9tYWRhSHJvdEhyb3VkYUhyb3plbkhyc3RrYUhydWJvc3RIcnl6YXRIdWJlbm9zdEh1Ym5vdXRIdWRiYUh1a290SHVtckh1c2l0YUh1c3RvdGFIdm96ZEh5Ym5vc3RIeWRyYW50SHlnaWVuYUh5bW5hSHlzdGVyaWtJZHlsa2FJaG5lZElrb25hSWx1emVJbXVuaXRhSW5mZWtjZUluZmxhY2VJbmthc29Jbm92YWNlSW5zcGVrY2VJbnRlcm5ldEludmFsaWRhSW52ZXN0b3JJbnplcmNlSXJvbmllSmFibGtvSmFjaHRhSmFob2RhSmFrbWlsZUpha29zdEphbG92ZWNKYW50YXJKYXJtYXJrSmFyb0phc2FuSmFzbm9KYXRrYUphdm9ySmF6eWtKZWRpbmVjSmVkbGVKZWRuYXRlbEplaGxhbkpla290SmVsZW5KZWxpdG9KZW1ub3N0SmVub21KZXBpY2VKZXNldGVySmV2aXRKZXpkZWNKZXplcm9KaW5ha0ppbmR5Smlub2NoSmlza3JhSmlzdG90YUppdHJuaWNlSml6dmFKbWVub3ZhdEpvZ3VydEp1cnRhS2FiYXJldEthYmVsS2FiaW5ldEthY2huYUthZGV0S2FkaWRsb0thaGFuS2FqYWtLYWp1dGFLYWthb0tha3R1c0thbGFtaXRhS2FsaG90eUthbGlickthbG5vc3RLYW1lcmFLYW1rb2xpdkthbW5hS2FuaWJhbEthbm9lS2FudG9yS2FwYWxpbmFLYXBlbGFLYXBpdG9sYUthcGthS2FwbGVLYXBvdGFLYXByS2FwdXN0YUthcHliYXJhS2FyYW1lbEthcm90a2FLYXJ0b25LYXNhS2F0YWxvZ0thdGVkcmFLYXVjZUthdXphS2F2YWxlY0themFqa2FLYXpldGFLYXppdm9zdEtkZWtvbGl2S2Rlc2lLZWRsdWJlbktlbXBLZXJhbWlrYUtpbm9LbGFjZWtLbGFkaXZvS2xhbUtsYXBvdEtsYXNpa2FLbGF1bktsZWNLbGVuYmFLbGVwYXRLbGVzbm91dEtsaWRLbGltYUtsaXNuYUtsb2JvdWtLbG9rYW5LbG9wYUtsb3ViS2x1Ym92bmFLbHVzYXRLbHV6a29zdEttZW5LbWl0YXRLbW90cktuaWhhS25vdEtvYWxpY2VLb2JlcmVjS29ia2FLb2JsaWhhS29ieWxhS29jb3VyS29ob3V0S29qZW5lY0tva29zS29rdGVqbEtvbGFwc0tvbGVkYUtvbGl6ZUtvbG9Lb21hbmRvS29tZXRhS29taWtLb21uYXRhS29tb3JhS29tcGFzS29tdW5pdGFLb25hdEtvbmNlcHRLb25kaWNlS29uZWNLb25mZXNlS29uZ3Jlc0tvbmluYUtvbmt1cnNLb250YWt0S29uemVydmFLb3BhbmVjS29waWVLb3Bub3V0S29wcm92a2FLb3JiZWxLb3Jla3Rvcktvcm1pZGxvS29yb3B0ZXZLb3JwdXNLb3J1bmFLb3J5dG9Lb3J6ZXRLb3NhdGVjS29zdGthS290ZWxLb3RsZXRhS290b3VsS291a2F0S291cGVsbmFLb3VzZWtLb3V6bG9Lb3Zib2pLb3phS296b3JvaEtyYWJpY2VLcmFjaEtyYWppbmFLcmFsb3ZhdEtyYXNvcGlzS3JhdmF0YUtyZWRpdEtyZWpjYXJLcmVzYmFLcmV2ZXRhS3Jpa2V0S3JpdGlrS3JpemVLcmthdmVjS3JtZWxlY0tybWl2b0tyb2Nhbktyb2tLcm9uaWthS3JvcGl0S3JvdXBhS3JvdmthS3J0ZWtLcnVoYWRsb0tydXBpY2VLcnV0b3N0S3J2aW5rYUtyeWNobGVLcnlwdGFLcnlzdGFsS3J5dEt1ZGxhbmthS3Vmckt1am5vc3RLdWtsYUt1bGFqZGFLdWxpY2hLdWxrYUt1bG9tZXRLdWx0dXJhS3VuYUt1cG9kaXZ1S3VydEt1cnpvckt1dGlsS3ZhbGl0YUt2YXNpbmthS3Zlc3Rvckt5bm9sb2dLeXNlbGluYUt5dGFyYUt5dGljZUt5dGthS3l0b3ZlY0t5dmFkbG9MYWJyYWRvckxhY2h0YW5MYWRub3N0TGFpa0xha29tZWNMYW1lbGFMYW1wYUxhbm92a2FMYXNpY2VMYXNvTGFzdHVyYUxhdGlua2FMYXZpbmFMZWJrYUxlY2tkeUxlZGVuTGVkbmljZUxlZG92a2FMZWR2aW5hTGVnZW5kYUxlZ2llTGVncmFjZUxlaGNlTGVoa29zdExlaG5vdXRMZWt0dmFyTGVub2Nob2RMZW50aWxrYUxlcGVua2FMZXBpZGxvTGV0YWRsb0xldGVjTGV0bW9MZXRva3J1aExldmhhcnRMZXZpdGFjZUxldm9ib2tMaWJyYUxpY2hvdGthTGlkb2plZExpZHNrb3N0TGlob3ZpbmFMaWphdmVjTGlsZWtMaW1ldGthTGluaWVMaW5rYUxpbm9sZXVtTGlzdG9wYWRMaXRpbmFMaXRvdmF0TG9iaXN0YUxvZGl2b2RMb2dpa2FMb2dvcGVkTG9rYWxpdGFMb2tldExvbWNvdmF0TG9wYXRhTG9wdWNoTG9yZExvc29zTG90ckxvdWRhbExvdWhMb3VrYUxvdXNrYXRMb3ZlY0xzdGl2b3N0THVjZXJuYUx1Y2lmZXJMdW1wTHVza0x1c3RyYWNlTHZpY2VMeXJhTHlyaWthTHlzaW5hTWFkYW1NYWRsb01hZ2lzdHJNYWhhZ29uTWFqZXRla01haml0ZWxNYWpvcml0YU1ha2FrTWFrb3ZpY2VNYWtyZWxhTWFsYmFNYWxpbmFNYWxvdmF0TWFsdmljZU1hbWlua2FNYW5kbGVNYW5rb01hcm5vc3RNYXNha3JNYXNrb3RNYXNvcHVzdE1hdGljZU1hdHJpa2FNYXR1cml0YU1hemFuZWNNYXppdm9NYXpsaXRNYXp1cmthTWRsb2JhTWVjaGFuaWtNZWRpdGFjZU1lZG92aW5hTWVsYXNhTWVsb3VuTWVudG9sa2FNZXRsYU1ldG9kYU1ldHJNZXplcmFNaWdyYWNlTWlobm91dE1paHVsZU1pa2luYU1pa3JvZm9uTWlsZW5lY01pbGltZXRyTWlsb3N0TWltaWthTWluY292bmFNaW5pYmFyTWlub21ldE1pbnVsb3N0TWlza2FNaXN0ck1peG92YXRNbGFkb3N0TWxoYU1saG92aW5hTWxva01sc2F0TWx1dml0TW5pY2hNbm9oZW1Nb2JpbE1vY25vc3RNb2RlbGthTW9kbGl0YmFNb2h5bGFNb2tyb01vbGVrdWxhTW9tZW50a2FNb25hcmNoYU1vbm9rbE1vbnN0cnVtTW9udG92YXRNb256dW5Nb3Nhek1vc2t5dE1vc3RNb3RpdmFjZU1vdG9ya2FNb3R5a2FNb3VjaGFNb3Vkcm9zdE1vemFpa2FNb3pla01vem9sTXJhbW9yTXJhdmVuZWNNcmtldk1ydHZvbGFNcnpldE1yenV0b3N0TXN0aXRlbE11ZHJjTXVmbG9uTXVsYXRNdW1pZU11bmljZU11c2V0TXV0YWNlTXV6ZXVtTXV6aWthbnRNeXNsaXZlY016ZGFOYWJvdXJhdE5hY2h5dGF0TmFkYWNlTmFkYnl0ZWtOYWRob3pOYWRvYnJvTmFkcGlzTmFobGFzTmFobmF0TmFob2RpbGVOYWhyYWRpdE5haXZpdGFOYWplZG5vdU5hamlzdG9OYWptb3V0TmFrbG9uaXROYWtvbmVjTmFrcm1pdE5hbGV2b05hbWF6YXROYW1sdXZpdE5hbm9tZXRyTmFva29OYW9wYWtOYW9zdHJvTmFwYWRhdE5hcGV2bm9OYXBsbml0TmFwbm91dE5hcG9zbGVkTmFwcm9zdG9OYXJvZGl0TmFydWJ5TmFyeWNobG9OYXNhZGl0TmFzZWthdE5hc2xlcG9OYXN0YXROYXRvbGlrTmF2ZW5la05hdnJjaE5hdnpkb3J5TmF6dmF0TmViZU5lY2hhdE5lY2t5TmVkYWxla29OZWRiYXROZWR1aE5lZ2FjZU5laGV0TmVob2RhTmVqZW5OZWpwcnZlTmVrbGlkTmVsaWJvc3ROZW1pbG9zdE5lbW9jTmVvY2hvdGFOZW9ua2FOZXBva29qTmVyb3N0TmVydk5lc215c2xOZXNvdWxhZE5ldHZvck5ldXJvbk5ldmluYU5lenZ5a2xlTmljb3RhTmlqYWtOaWthbU5pa2R5TmlrbE5pa3RlcmFrTml0cm9Ob2NsZWhOb2hhdmljZU5vbWluYWNlTm9yYU5vcmVrTm9zaXRlbE5vc25vc3ROb3V6ZU5vdmlueU5vdm90YU5vemRyYU51ZGFOdWRsZU51Z2V0TnV0aXROdXRub3N0TnV0cmllTnltZmFPYmFsT2JhcnZpdE9iYXZhT2JkaXZPYmVjT2JlaG5hdE9iZWptb3V0T2Jleml0YU9iaGFqb2JhT2JpbG5pY2VPYmphc25pdE9iamVrdE9ia2xvcGl0T2JsYXN0T2JsZWtPYmxpYmFPYmxvaGFPYmx1ZGFPYm5vc09ib2hhdGl0T2JvamVrT2JvdXRPYnJhemVjT2JybmFPYnJ1YmFPYnJ5c09ic2FoT2JzbHVoYU9ic3RhcmF0T2J1dk9idmF6T2J2aW5pdE9idm9kT2J2eWtsZU9ieXZhdGVsT2J6b3JPY2FzT2NlbE9jZW5pdE9jaGxhZGl0T2Nob3RhT2NocmFuYU9jaXRub3V0T2Rib2pPZGJ5dE9kY2hvZE9kY2l6aXRPZGVicmF0T2Rlc2xhdE9kZXZ6ZGF0T2RlenZhT2RoYWRjZU9kaG9kaXRPZGpldE9kamludWRPZGthek9ka291cGl0T2RsaXZPZGx1a2FPZG1sa2FPZG9sbm9zdE9kcGFkT2RwaXNPZHBsb3V0T2Rwb3JPZHB1c3RpdE9kcHlrYXRPZHJhemthT2Rzb3VkaXRPZHN0dXBPZHN1bk9kdG9rT2R0dWRPZHZhaGFPZHZldGFPZHZvbGF0T2R2cmFjZXRPZHpuYWtPZmluYU9mc2FqZE9obGFzT2huaXNrb09ocmFkYU9ocm96aXRPaHJ5emVrT2thcE9rZW5pY2VPa2xpa2FPa25vT2tvdXpsaXRPa292eU9rcmFzYU9rcmVzT2tyc2VrT2tydWhPa3VwYW50T2t1cmthT2t1c2l0T2xlam5pbmFPbGl6b3ZhdE9tYWtPbWVsZXRhT21leml0T21sYWRpbmFPbWxvdXZhdE9tbHV2YU9teWxPbmVoZHlPcGFrb3ZhdE9wYXNla09wZXJhY2VPcGljZU9waWxvc3RPcGlzb3ZhdE9wb3JhT3BvemljZU9wcmF2ZHVPcHJvdGlPcmJpdGFsT3JjaGVzdHJPcmdpZU9ybGljZU9ybG9qT3J0ZWxPc2FkYU9zY2hub3V0T3Npa2FPc2l2b09zbGF2YU9zbGVwaXRPc2xuaXRPc2xvdml0T3Nub3ZhT3NvYmFPc29saXRPc3BhbGVjT3N0ZW5Pc3RyYWhhT3N0dWRhT3N0eWNoT3N2b2ppdE90ZXBsaXRPdGlza090b3BPdHJoYXRPdHJsb3N0T3Ryb2tPdHJ1YnlPdHZvck92YW5vdXRPdmFyT3Zlc092bGl2bml0T3ZvY2VPeGlkT3pkb2JhUGFjaGF0ZWxQYWNpZW50UGFkb3VjaFBhaG9yZWtQYWt0UGFsYW5kYVBhbGVjUGFsaXZvUGFsdWJhUGFtZmxldFBhbWxzZWtQYW5lbmthUGFuaWthUGFubmFQYW5vdmF0UGFuc3R2b1BhbnRvZmxlUGFwcmlrYVBhcmtldGFQYXJvZGllUGFydGFQYXJ1a2FQYXJ5YmFQYXNla2FQYXNpdml0YVBhc3RlbGthUGF0ZW50UGF0cm9uYVBhdm91a1Bhem5laHRQYXpvdXJla1BlY2thUGVkYWdvZ1BlanNla1Bla2xvUGVsb3RvblBlbmFsdGFQZW5kcmVrUGVuemVQZXJpc2tvcFBlcm9QZXN0cm9zdFBldGFyZGFQZXRpY2VQZXRyb2xlalBldm5pbmFQZXhlc29QaWFuaXN0YVBpaGFQaWphdmljZVBpa2xlUGlrbmlrUGlsaW5hUGlsbm9zdFBpbHVsa2FQaW56ZXRhUGlwZXRhUGlzYXRlbFBpc3RvbGVQaXRldm5hUGl2bmljZVBpdm92YXJQbGFjZW50YVBsYWthdFBsYW1lblBsYW5ldGFQbGFzdGlrYVBsYXRpdFBsYXZpZGxvUGxhelBsZWNoUGxlbWVub1BsZW50YVBsZXNQbGV0aXZvUGxldmVsUGxpdmF0UGxuaXRQbG5vUGxvY2hhUGxvZGluYVBsb21iYVBsb3V0UGx1a1BseW5Qb2Jhdml0UG9ieXRQb2Nob2RQb2NpdFBvY3RpdmVjUG9kYXRQb2RjZW5pdFBvZGVwc2F0UG9kaGxlZFBvZGl2aXRQb2RrbGFkUG9kbWFuaXRQb2RuaWtQb2RvYmFQb2Rwb3JhUG9kcmF6UG9kc3RhdGFQb2R2b2RQb2R6aW1Qb2V6aWVQb2hhbmthUG9obnV0a2FQb2hvdm9yUG9ocm9tYVBvaHliUG9pbnRhUG9qaXN0a2FQb2ptb3V0UG9rYXppdFBva2xlc1Bva29qUG9rcm9rUG9rdXRhUG9reW5Qb2xlZG5lUG9saWJla1BvbGtub3V0UG9sb2hhUG9seW5vbVBvbWFsdVBvbWlub3V0UG9tbGthUG9tb2NQb21zdGFQb215c2xldFBvbmVjaGF0UG9ub3JrYVBvbnVyb3N0UG9wYWRhdFBvcGVsUG9waXNla1BvcGxhY2hQb3Byb3NpdFBvcHNhdFBvcHVkUG9yYWRjZVBvcmNlUG9yb2RQb3J1Y2hhUG9yeXZQb3NhZGl0UG9zZWRQb3NpbGFQb3Nrb2tQb3NsYW5lY1Bvc291ZGl0UG9zcG9sdVBvc3RhdmFQb3N1ZGVrUG9zeXBQb3RhaFBvdGthblBvdGxlc2tQb3RvbWVrUG90cmF2YVBvdHVwYVBvdHZvcmFQb3VrYXpQb3V0b1BvdXpkcm9Qb3ZhaGFQb3ZpZGxhUG92bGFrUG92b3pQb3ZyY2hQb3ZzdGF0UG92eWtQb3Z6ZGVjaFBvemRyYXZQb3plbWVrUG96bmF0ZWtQb3pvclBvenZhdFByYWNvdmF0UHJhaG9yeVByYWt0aWthUHJhbGVzUHJhb3RlY1ByYXBvcmVrUHJhc2VQcmF2ZGFQcmluY2lwUHJrbm9Qcm9idWRpdFByb2NlbnRvUHJvZGVqUHJvZmVzZVByb2hyYVByb2pla3RQcm9sb21pdFByb21pbGVQcm9uaWthdFByb3BhZFByb3Jva1Byb3NiYVByb3RvblByb3V0ZWtQcm92YXpQcnNrYXZrYVByc3RlblBydWRrb3N0UHJ1dFBydmVrUHJ2b2hvcnlQc2FuZWNQc292b2RQc3RydWhQdGFjdHZvUHViZXJ0YVB1Y2hQdWRsUHVrYXZlY1B1a2xpbmFQdWtybGVQdWx0UHVtcGFQdW5jUHVwZW5QdXNhUHVzaW5rYVB1c3RpbmFQdXRvdmF0UHV0eWthUHlyYW1pZGFQeXNrUHl0ZWxSYWNla1JhY2hvdFJhZGlhY2VSYWRuaWNlUmFkb25SYWZ0UmFnYnlSYWtldGFSYWtvdmluYVJhbWVub1JhbXBvdWNoUmFuZGVSYXJhY2hSYXJpdGFSYXNvdm5hUmFzdHJSYXRvbGVzdFJhemFuY2VSYXppZGxvUmVhZ292YXRSZWFrY2VSZWNlcHRSZWRha3RvclJlZmVyZW50UmVmbGV4UmVqbm9rUmVrbGFtYVJla29yZFJla3J1dFJla3RvclJlcHV0YWNlUmV2aXplUmV2bWFSZXZvbHZlclJlemVydmFSaXNrb3ZhdFJpemlrb1JvYm90aWthUm9kb2ttZW5Sb2hvdmthUm9rbGVSb2tva29Sb21hbmV0b1JvcG92b2RSb3B1Y2hhUm9yZWpzUm9zb2xSb3N0bGluYVJvdG1pc3RyUm90b3BlZFJvdHVuZGFSb3ViZW5rYVJvdWNob1JvdXBSb3VyYVJvdmluYVJvdm5pY2VSb3pib3JSb3pjaG9kUm96ZGF0Um96ZXpuYXRSb3pob2RjZVJvemlua2FSb3pqZXpkUm96a2F6Um96bG9oYVJvem1hclJvenBhZFJvenJ1Y2hSb3pzYWhSb3p0b2tSb3p1bVJvenZvZFJ1YnJpa2FSdWNoYWRsb1J1a2F2aWNlUnVrb3Bpc1J5YmFSeWJvbG92UnljaGxvc3RSeWRsb1J5cGFkbG9SeXRpbmFSeXpvc3RTYWRpc3RhU2FoYXRTYWtvU2FtZWNTYW1pemRhdFNhbW90YVNhbml0a2FTYXJkaW5rYVNhc2Fua2FTYXRlbGl0U2F6YmFTYXplbmljZVNib3JTY2hvdmF0U2VicmFua2FTZWNlc2VTZWRhZGxvU2VkaW1lbnRTZWRsb1NlaG5hdFNlam1vdXRTZWtlcmFTZWt0YVNla3VuZGFTZWt2b2plU2VtZW5vU2Vub1NlcnZpc1Nlc2FkaXRTZXNob3JhU2Vza29rU2VzbGF0U2VzdHJhU2VzdXZTZXN5cGF0U2V0YmFTZXRpbmFTZXRrYXRTZXRub3V0U2V0cnZhdFNldmVyU2V6bmFtU2hvZGFTaHJub3V0U2lmb25TaWxuaWNlU2lya2FTaXJvdGVrU2lydXBTaXR1YWNlU2thZmFuZHJTa2FsaXNrb1NrYW56ZW5Ta2F1dFNrZXB0aWtTa2ljYVNrbGFkYmFTa2xlbmljZVNrbG9Ta2x1elNrb2JhU2tva2FuU2tvcm9Ta3JpcHRhU2tyelNrdXBpbmFTa3Zvc3RTa3ZybmFTbGFiaWthU2xhZGlkbG9TbGFuaW5hU2xhc3RTbGF2bm9zdFNsZWRvdmF0U2xlcGVjU2xldmFTbGV6aW5hU2xpYlNsaW5hU2xpem5pY2VTbG9uU2xvdXBla1Nsb3ZvU2x1Y2hTbHVoYVNsdW5jZVNsdXBrYVNsemFTbWFyYWdkU21ldGFuYVNtaWxzdHZvU21sb3V2YVNtb2dTbXJhZFNtcmtTbXJ0a2FTbXV0ZWtTbXlzbFNuYWRTbmFoYVNub2JTb2JvdGFTb2NoYVNvZG92a2FTb2tvbFNvcGthU290dmFTb3Vib2pTb3VjaXRTb3VkY2VTb3VobGFzU291bGFkU291bXJha1NvdXByYXZhU291c2VkU291dG9rU291dmlzZXRTcGFsb3ZuYVNwYXNpdGVsU3Bpc1NwbGF2U3BvZGVrU3BvamVuZWNTcG9sdVNwb256b3JTcG9ybm9zdFNwb3VzdGFTcHJjaGFTcHVzdGl0U3JhbmRhU3JhelNyZGNlU3JuYVNybmVjU3Jvdm5hdFNycGVuU3JzdFNydWJTdGFuaWNlU3Rhcm9zdGFTdGF0aWthU3RhdmJhU3RlaG5vU3RlemthU3RvZG9sYVN0b2xla1N0b3BhU3Rvcm5vU3RvdXBhdFN0cmFjaFN0cmVzU3RyaG5vdXRTdHJvbVN0cnVuYVN0dWRuYVN0dXBuaWNlU3R2b2xTdHlrU3ViamVrdFN1YnRyb3B5U3VjaGFyU3Vkb3N0U3Vrbm9TdW5kYXRTdW5vdXRTdXJpa2F0YVN1cm92aW5hU3ZhaFN2YWxzdHZvU3ZldHJTdmF0YmFTdmF6ZWtTdmlzbGVTdml0ZWtTdm9ib2RhU3ZvZGlkbG9Tdm9ya2FTdnJhYlN5a2F2a2FTeWtvdFN5bmVrU3lub3ZlY1N5cGF0U3lwa29zdFN5cm92b3N0U3lzZWxTeXRvc3RUYWJsZXRrYVRhYnVsZVRhaG91blRhamVtbm9UYWpmdW5UYWpnYVRhaml0VGFqbm9zdFRha3Rpa2FUYW1obGVUYW1wb25UYW5jb3ZhdFRhbmVjVGFua2VyVGFwZXRhVGF2ZW5pbmFUYXphdGVsVGVjaG5pa2FUZWhkeVRla3V0aW5hVGVsZWZvblRlbW5vdGFUZW5kZW5jZVRlbmlzdGFUZW5vclRlcGxvdGFUZXBuYVRlcHJ2ZVRlcmFwaWVUZXJtb3NrYVRleHRpbFRpY2hvVGlza29waXNUaXR1bGVrVGthZGxlY1RrYW5pbmFUbGFwa2FUbGVza2F0VGx1a290VGx1cGFUbWVsVG9hbGV0YVRvcGlua2FUb3BvbFRvcnpvVG91aGFUb3VsZWNUcmFkaWNlVHJha3RvclRyYW1wVHJhc2FUcmF2ZXJ6YVRyZWZpdFRyZXN0VHJlem9yVHJoYXZpbmFUcmhsaW5hVHJvY2h1VHJvamljZVRyb3NrYVRyb3ViYVRycGNlVHJwaXRlbFRycGtvc3RUcnViZWNUcnVjaGxpdFRydWhsaWNlVHJ1c1RydmF0VHVkeVR1aG5vdXRUdWhvc3RUdW5kcmFUdXJpc3RhVHVybmFqVHV6ZW1za29UdmFyb2hUdm9yYmFUdnJkb3N0VHZyelR5Z3JUeWtldlVib2hvc3RVYm96ZVVicmF0VWJyb3VzZWtVYnJ1c1VieXRvdm5hVWNob1VjdGl2b3N0VWRpdml0VWhyYWRpdFVqZWRuYXRVamlzdGl0VWptb3V0VWthemF0ZWxVa2xpZG5pdFVrbG9uaXRVa290dml0VWtyb2ppdFVsaWNlVWxpdGFVbG92aXRVbXl2YWRsb1VuYXZpdFVuaWZvcm1hVW5pa25vdXRVcGFkbm91dFVwbGF0bml0VXBseW5vdXRVcG91dGF0VXByYXZpdFVyYW5VcmF6aXRVc2Vkbm91dFVzaWxvdmF0VXNtcnRpdFVzbmFkbml0VXNub3V0VXNvdWRpdFVzdGxhdFVzdHJub3V0VXRhaG92YXRVdGthdFV0bHVtaXRVdG9ub3V0VXRvcGVuZWNVdHJvdXNpdFV2YWxpdFV2b2xuaXRVdm96b3ZrYVV6ZHJhdml0VXplbFV6ZW5pbmFVemxpbmFVem5hdFZhZ29uVmFsY2hhVmFsb3VuVmFuYVZhbmRhbFZhbmlsa2FWYXJhblZhcmhhbnlWYXJvdmF0VmNlbGt1VmNob2RWZG92YVZlZHJvVmVnZXRhY2VWZWpjZVZlbGJsb3VkVmVsZXRyaFZlbGl0ZWxWZWxtb2NWZWxyeWJhVmVua292VmVyYW5kYVZlcnplVmVzZWxrYVZlc2tyemVWZXNuaWNlVmVzcG9kdVZlc3RhVmV0ZXJpbmFWZXZlcmthVmlicmFjZVZpY2hyVmlkZW9ocmFWaWRpbmFWaWRsZVZpbGFWaW5pY2VWaXNldFZpdGFsaXRhVml6ZVZpeml0a2FWamV6ZFZrbGFkVmt1c1ZsYWprYVZsYWtWbGFzZWNWbGV2b1ZsaGtvc3RWbGl2Vmxub3ZrYVZsb3VwYXRWbnVjb3ZhdFZudWtWb2RhVm9kaXZvc3RWb2Rvem5ha1ZvZHN0dm9Wb2plbnNreVZvam5hVm9qc2tvVm9sYW50Vm9sYmFWb2xpdFZvbG5vVm9za292a2FWb3ppZGxvVm96b3ZuYVZwcmF2b1ZyYWJlY1ZyYWNldFZyYWhWcmF0YVZyYmFWcmNob2xla1ZyaGF0VnJzdHZhVnJ0dWxlVnNhZGl0VnN0b3VwaXRWc3R1cFZ0aXBWeWJhdml0VnlicmF0VnljaG92YXRWeWRhdFZ5ZHJhVnlmb3RpdFZ5aGxlZGF0Vnlobm91dFZ5aG9kaXRWeWhyYWRpdFZ5aHViaXRWeWphc25pdFZ5amV0VnlqbW91dFZ5a2xvcGl0Vnlrb25hdFZ5bGVrYXRWeW1hemF0VnltZXppdFZ5bWl6ZXRWeW15c2xldFZ5bmVjaGF0VnluaWthdFZ5bnV0aXRWeXBhZGF0VnlwbGF0aXRWeXByYXZpdFZ5cHVzdGl0VnlyYXppdFZ5cm92bmF0VnlydmF0VnlzbG92aXRWeXNva29WeXN0YXZpdFZ5c3Vub3V0VnlzeXBhdFZ5dGFzaXRWeXRlc2F0Vnl0cmF0aXRWeXZpbm91dFZ5dm9sYXRWeXZyaGVsVnl6ZG9iaXRWeXpuYXRWemFkdVZ6YnVkaXRWemNob3BpdFZ6ZG9yVnpkdWNoVnpkeWNoYXRWemVzdHVwVnpobGVkZW1WemthelZ6bHlrYXRWem5pa1Z6b3Jla1Z6cG91cmFWenRhaFZ6dGVrWHlsb2ZvblphYnJhdFphYnlkbGV0WmFjaG92YXRaYWRhcm1vWmFkdXNpdFphZm91a2F0WmFobHRpdFphaG9kaXRaYWhyYWRhWmFoeW5vdXRaYWphdGVjWmFqZXRaYWppc3RpdFpha2xlcGF0WmFrb3VwaXRaYWxlcGl0WmFtZXppdFphbW90YXRaYW15c2xldFphbmVjaGF0WmFuaWthdFphcGxhdGl0WmFwb2ppdFphcHNhdFphcmF6aXRaYXN0YXZpdFphc3Vub3V0WmF0YWppdFphdGVtbml0WmF0a25vdXRaYXVqbW91dFphdmFsaXRaYXZlbGV0WmF2aW5pdFphdm9sYXRaYXZydGF0WmF6dm9uaXRaYmF2aXRaYnJ1c3VaYnVkb3ZhdFpieXRla1pkYWxla2FaZGFybWFaZGF0bm9zdFpkaXZvWmRvYml0WmRyb2paZHZpaFpkeW1hZGxvWmVsZW5pbmFaZW1hblplbWluYVplcHRhdFplemFkdVplemRvbGFaaGF0aXRaaGx0bm91dFpobHVib2thWmhvdG92aXRaaHJ1YmFaaW1hWmltbmljZVpqZW1uaXRaa2xhbWF0WmtvdW1hdFprcmF0a2Faa3VtYXZrYVpsYXRvWmxlaGthWmxvYmFabG9tWmxvc3RabG96dnlrWm1hcG92YXRabWFyWm1hdGVrWm1pamVabWl6ZXRabW9jbml0Wm1vZHJhdFptcnpsaW5hWm11dG92YXRabmFrWm5hbG9zdFpuYW1lbmF0Wm5vdnVab2JyYXppdFpvdGF2aXRab3ViZWtab3VmYWxlWnBsb2RpdFpwb21hbGl0WnByYXZhWnByb3N0aXRacHJ1ZGthWnBydnVacmFkYVpyYW5pdFpyY2FkbG9acm5pdG9zdFpybm9acm92bmFacnljaGxpdFpyemF2b3N0WnRpY2hhWnRyYXRpdFp1Ym92aW5hWnViclp2ZWRub3V0WnZlbmt1WnZlc2VsYVp2b25adnJhdFp2dWtvdm9kWnZ5a1wiO1xubGV0IHdvcmRsaXN0ID0gbnVsbDtcbmZ1bmN0aW9uIGxvYWRXb3JkcyhsYW5nKSB7XG4gICAgaWYgKHdvcmRsaXN0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JkbGlzdCA9IHdvcmRzLnJlcGxhY2UoLyhbQS1aXSkvZywgXCIgJDFcIikudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMSkuc3BsaXQoXCIgXCIpO1xuICAgIC8vIFZlcmlmeSB0aGUgY29tcHV0ZWQgbGlzdCBtYXRjaGVzIHRoZSBvZmZpY2lhbCBsaXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKFdvcmRsaXN0LmNoZWNrKGxhbmcpICE9PSBcIjB4MjVmNDQ1NTVmNGFmMjViNTFhNzExMTM2ZTFjN2Q2ZTUwY2U5Zjg5MTdkMzlkNmIxZjA3NmIyYmI0ZDJmYWMxYVwiKSB7XG4gICAgICAgIHdvcmRsaXN0ID0gbnVsbDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQklQMzkgV29yZGxpc3QgZm9yIGVuIChFbmdsaXNoKSBGQUlMRURcIik7XG4gICAgfVxufVxuY2xhc3MgTGFuZ0N6IGV4dGVuZHMgV29yZGxpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImN6XCIpO1xuICAgIH1cbiAgICBnZXRXb3JkKGluZGV4KSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0W2luZGV4XTtcbiAgICB9XG4gICAgZ2V0V29yZEluZGV4KHdvcmQpIHtcbiAgICAgICAgbG9hZFdvcmRzKHRoaXMpO1xuICAgICAgICByZXR1cm4gd29yZGxpc3QuaW5kZXhPZih3b3JkKTtcbiAgICB9XG59XG5jb25zdCBsYW5nQ3ogPSBuZXcgTGFuZ0N6KCk7XG5Xb3JkbGlzdC5yZWdpc3RlcihsYW5nQ3opO1xuZXhwb3J0IHsgbGFuZ0N6IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYW5nLWN6LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgV29yZGxpc3QgfSBmcm9tIFwiLi93b3JkbGlzdFwiO1xuY29uc3Qgd29yZHMgPSBcIkFiYW5kb25BYmlsaXR5QWJsZUFib3V0QWJvdmVBYnNlbnRBYnNvcmJBYnN0cmFjdEFic3VyZEFidXNlQWNjZXNzQWNjaWRlbnRBY2NvdW50QWNjdXNlQWNoaWV2ZUFjaWRBY291c3RpY0FjcXVpcmVBY3Jvc3NBY3RBY3Rpb25BY3RvckFjdHJlc3NBY3R1YWxBZGFwdEFkZEFkZGljdEFkZHJlc3NBZGp1c3RBZG1pdEFkdWx0QWR2YW5jZUFkdmljZUFlcm9iaWNBZmZhaXJBZmZvcmRBZnJhaWRBZ2FpbkFnZUFnZW50QWdyZWVBaGVhZEFpbUFpckFpcnBvcnRBaXNsZUFsYXJtQWxidW1BbGNvaG9sQWxlcnRBbGllbkFsbEFsbGV5QWxsb3dBbG1vc3RBbG9uZUFscGhhQWxyZWFkeUFsc29BbHRlckFsd2F5c0FtYXRldXJBbWF6aW5nQW1vbmdBbW91bnRBbXVzZWRBbmFseXN0QW5jaG9yQW5jaWVudEFuZ2VyQW5nbGVBbmdyeUFuaW1hbEFua2xlQW5ub3VuY2VBbm51YWxBbm90aGVyQW5zd2VyQW50ZW5uYUFudGlxdWVBbnhpZXR5QW55QXBhcnRBcG9sb2d5QXBwZWFyQXBwbGVBcHByb3ZlQXByaWxBcmNoQXJjdGljQXJlYUFyZW5hQXJndWVBcm1Bcm1lZEFybW9yQXJteUFyb3VuZEFycmFuZ2VBcnJlc3RBcnJpdmVBcnJvd0FydEFydGVmYWN0QXJ0aXN0QXJ0d29ya0Fza0FzcGVjdEFzc2F1bHRBc3NldEFzc2lzdEFzc3VtZUFzdGhtYUF0aGxldGVBdG9tQXR0YWNrQXR0ZW5kQXR0aXR1ZGVBdHRyYWN0QXVjdGlvbkF1ZGl0QXVndXN0QXVudEF1dGhvckF1dG9BdXR1bW5BdmVyYWdlQXZvY2Fkb0F2b2lkQXdha2VBd2FyZUF3YXlBd2Vzb21lQXdmdWxBd2t3YXJkQXhpc0JhYnlCYWNoZWxvckJhY29uQmFkZ2VCYWdCYWxhbmNlQmFsY29ueUJhbGxCYW1ib29CYW5hbmFCYW5uZXJCYXJCYXJlbHlCYXJnYWluQmFycmVsQmFzZUJhc2ljQmFza2V0QmF0dGxlQmVhY2hCZWFuQmVhdXR5QmVjYXVzZUJlY29tZUJlZWZCZWZvcmVCZWdpbkJlaGF2ZUJlaGluZEJlbGlldmVCZWxvd0JlbHRCZW5jaEJlbmVmaXRCZXN0QmV0cmF5QmV0dGVyQmV0d2VlbkJleW9uZEJpY3ljbGVCaWRCaWtlQmluZEJpb2xvZ3lCaXJkQmlydGhCaXR0ZXJCbGFja0JsYWRlQmxhbWVCbGFua2V0Qmxhc3RCbGVha0JsZXNzQmxpbmRCbG9vZEJsb3Nzb21CbG91c2VCbHVlQmx1ckJsdXNoQm9hcmRCb2F0Qm9keUJvaWxCb21iQm9uZUJvbnVzQm9va0Jvb3N0Qm9yZGVyQm9yaW5nQm9ycm93Qm9zc0JvdHRvbUJvdW5jZUJveEJveUJyYWNrZXRCcmFpbkJyYW5kQnJhc3NCcmF2ZUJyZWFkQnJlZXplQnJpY2tCcmlkZ2VCcmllZkJyaWdodEJyaW5nQnJpc2tCcm9jY29saUJyb2tlbkJyb256ZUJyb29tQnJvdGhlckJyb3duQnJ1c2hCdWJibGVCdWRkeUJ1ZGdldEJ1ZmZhbG9CdWlsZEJ1bGJCdWxrQnVsbGV0QnVuZGxlQnVua2VyQnVyZGVuQnVyZ2VyQnVyc3RCdXNCdXNpbmVzc0J1c3lCdXR0ZXJCdXllckJ1enpDYWJiYWdlQ2FiaW5DYWJsZUNhY3R1c0NhZ2VDYWtlQ2FsbENhbG1DYW1lcmFDYW1wQ2FuQ2FuYWxDYW5jZWxDYW5keUNhbm5vbkNhbm9lQ2FudmFzQ2FueW9uQ2FwYWJsZUNhcGl0YWxDYXB0YWluQ2FyQ2FyYm9uQ2FyZENhcmdvQ2FycGV0Q2FycnlDYXJ0Q2FzZUNhc2hDYXNpbm9DYXN0bGVDYXN1YWxDYXRDYXRhbG9nQ2F0Y2hDYXRlZ29yeUNhdHRsZUNhdWdodENhdXNlQ2F1dGlvbkNhdmVDZWlsaW5nQ2VsZXJ5Q2VtZW50Q2Vuc3VzQ2VudHVyeUNlcmVhbENlcnRhaW5DaGFpckNoYWxrQ2hhbXBpb25DaGFuZ2VDaGFvc0NoYXB0ZXJDaGFyZ2VDaGFzZUNoYXRDaGVhcENoZWNrQ2hlZXNlQ2hlZkNoZXJyeUNoZXN0Q2hpY2tlbkNoaWVmQ2hpbGRDaGltbmV5Q2hvaWNlQ2hvb3NlQ2hyb25pY0NodWNrbGVDaHVua0NodXJuQ2lnYXJDaW5uYW1vbkNpcmNsZUNpdGl6ZW5DaXR5Q2l2aWxDbGFpbUNsYXBDbGFyaWZ5Q2xhd0NsYXlDbGVhbkNsZXJrQ2xldmVyQ2xpY2tDbGllbnRDbGlmZkNsaW1iQ2xpbmljQ2xpcENsb2NrQ2xvZ0Nsb3NlQ2xvdGhDbG91ZENsb3duQ2x1YkNsdW1wQ2x1c3RlckNsdXRjaENvYWNoQ29hc3RDb2NvbnV0Q29kZUNvZmZlZUNvaWxDb2luQ29sbGVjdENvbG9yQ29sdW1uQ29tYmluZUNvbWVDb21mb3J0Q29taWNDb21tb25Db21wYW55Q29uY2VydENvbmR1Y3RDb25maXJtQ29uZ3Jlc3NDb25uZWN0Q29uc2lkZXJDb250cm9sQ29udmluY2VDb29rQ29vbENvcHBlckNvcHlDb3JhbENvcmVDb3JuQ29ycmVjdENvc3RDb3R0b25Db3VjaENvdW50cnlDb3VwbGVDb3Vyc2VDb3VzaW5Db3ZlckNveW90ZUNyYWNrQ3JhZGxlQ3JhZnRDcmFtQ3JhbmVDcmFzaENyYXRlckNyYXdsQ3JhenlDcmVhbUNyZWRpdENyZWVrQ3Jld0NyaWNrZXRDcmltZUNyaXNwQ3JpdGljQ3JvcENyb3NzQ3JvdWNoQ3Jvd2RDcnVjaWFsQ3J1ZWxDcnVpc2VDcnVtYmxlQ3J1bmNoQ3J1c2hDcnlDcnlzdGFsQ3ViZUN1bHR1cmVDdXBDdXBib2FyZEN1cmlvdXNDdXJyZW50Q3VydGFpbkN1cnZlQ3VzaGlvbkN1c3RvbUN1dGVDeWNsZURhZERhbWFnZURhbXBEYW5jZURhbmdlckRhcmluZ0Rhc2hEYXVnaHRlckRhd25EYXlEZWFsRGViYXRlRGVicmlzRGVjYWRlRGVjZW1iZXJEZWNpZGVEZWNsaW5lRGVjb3JhdGVEZWNyZWFzZURlZXJEZWZlbnNlRGVmaW5lRGVmeURlZ3JlZURlbGF5RGVsaXZlckRlbWFuZERlbWlzZURlbmlhbERlbnRpc3REZW55RGVwYXJ0RGVwZW5kRGVwb3NpdERlcHRoRGVwdXR5RGVyaXZlRGVzY3JpYmVEZXNlcnREZXNpZ25EZXNrRGVzcGFpckRlc3Ryb3lEZXRhaWxEZXRlY3REZXZlbG9wRGV2aWNlRGV2b3RlRGlhZ3JhbURpYWxEaWFtb25kRGlhcnlEaWNlRGllc2VsRGlldERpZmZlckRpZ2l0YWxEaWduaXR5RGlsZW1tYURpbm5lckRpbm9zYXVyRGlyZWN0RGlydERpc2FncmVlRGlzY292ZXJEaXNlYXNlRGlzaERpc21pc3NEaXNvcmRlckRpc3BsYXlEaXN0YW5jZURpdmVydERpdmlkZURpdm9yY2VEaXp6eURvY3RvckRvY3VtZW50RG9nRG9sbERvbHBoaW5Eb21haW5Eb25hdGVEb25rZXlEb25vckRvb3JEb3NlRG91YmxlRG92ZURyYWZ0RHJhZ29uRHJhbWFEcmFzdGljRHJhd0RyZWFtRHJlc3NEcmlmdERyaWxsRHJpbmtEcmlwRHJpdmVEcm9wRHJ1bURyeUR1Y2tEdW1iRHVuZUR1cmluZ0R1c3REdXRjaER1dHlEd2FyZkR5bmFtaWNFYWdlckVhZ2xlRWFybHlFYXJuRWFydGhFYXNpbHlFYXN0RWFzeUVjaG9FY29sb2d5RWNvbm9teUVkZ2VFZGl0RWR1Y2F0ZUVmZm9ydEVnZ0VpZ2h0RWl0aGVyRWxib3dFbGRlckVsZWN0cmljRWxlZ2FudEVsZW1lbnRFbGVwaGFudEVsZXZhdG9yRWxpdGVFbHNlRW1iYXJrRW1ib2R5RW1icmFjZUVtZXJnZUVtb3Rpb25FbXBsb3lFbXBvd2VyRW1wdHlFbmFibGVFbmFjdEVuZEVuZGxlc3NFbmRvcnNlRW5lbXlFbmVyZ3lFbmZvcmNlRW5nYWdlRW5naW5lRW5oYW5jZUVuam95RW5saXN0RW5vdWdoRW5yaWNoRW5yb2xsRW5zdXJlRW50ZXJFbnRpcmVFbnRyeUVudmVsb3BlRXBpc29kZUVxdWFsRXF1aXBFcmFFcmFzZUVyb2RlRXJvc2lvbkVycm9yRXJ1cHRFc2NhcGVFc3NheUVzc2VuY2VFc3RhdGVFdGVybmFsRXRoaWNzRXZpZGVuY2VFdmlsRXZva2VFdm9sdmVFeGFjdEV4YW1wbGVFeGNlc3NFeGNoYW5nZUV4Y2l0ZUV4Y2x1ZGVFeGN1c2VFeGVjdXRlRXhlcmNpc2VFeGhhdXN0RXhoaWJpdEV4aWxlRXhpc3RFeGl0RXhvdGljRXhwYW5kRXhwZWN0RXhwaXJlRXhwbGFpbkV4cG9zZUV4cHJlc3NFeHRlbmRFeHRyYUV5ZUV5ZWJyb3dGYWJyaWNGYWNlRmFjdWx0eUZhZGVGYWludEZhaXRoRmFsbEZhbHNlRmFtZUZhbWlseUZhbW91c0ZhbkZhbmN5RmFudGFzeUZhcm1GYXNoaW9uRmF0RmF0YWxGYXRoZXJGYXRpZ3VlRmF1bHRGYXZvcml0ZUZlYXR1cmVGZWJydWFyeUZlZGVyYWxGZWVGZWVkRmVlbEZlbWFsZUZlbmNlRmVzdGl2YWxGZXRjaEZldmVyRmV3RmliZXJGaWN0aW9uRmllbGRGaWd1cmVGaWxlRmlsbUZpbHRlckZpbmFsRmluZEZpbmVGaW5nZXJGaW5pc2hGaXJlRmlybUZpcnN0RmlzY2FsRmlzaEZpdEZpdG5lc3NGaXhGbGFnRmxhbWVGbGFzaEZsYXRGbGF2b3JGbGVlRmxpZ2h0RmxpcEZsb2F0RmxvY2tGbG9vckZsb3dlckZsdWlkRmx1c2hGbHlGb2FtRm9jdXNGb2dGb2lsRm9sZEZvbGxvd0Zvb2RGb290Rm9yY2VGb3Jlc3RGb3JnZXRGb3JrRm9ydHVuZUZvcnVtRm9yd2FyZEZvc3NpbEZvc3RlckZvdW5kRm94RnJhZ2lsZUZyYW1lRnJlcXVlbnRGcmVzaEZyaWVuZEZyaW5nZUZyb2dGcm9udEZyb3N0RnJvd25Gcm96ZW5GcnVpdEZ1ZWxGdW5GdW5ueUZ1cm5hY2VGdXJ5RnV0dXJlR2FkZ2V0R2FpbkdhbGF4eUdhbGxlcnlHYW1lR2FwR2FyYWdlR2FyYmFnZUdhcmRlbkdhcmxpY0dhcm1lbnRHYXNHYXNwR2F0ZUdhdGhlckdhdWdlR2F6ZUdlbmVyYWxHZW5pdXNHZW5yZUdlbnRsZUdlbnVpbmVHZXN0dXJlR2hvc3RHaWFudEdpZnRHaWdnbGVHaW5nZXJHaXJhZmZlR2lybEdpdmVHbGFkR2xhbmNlR2xhcmVHbGFzc0dsaWRlR2xpbXBzZUdsb2JlR2xvb21HbG9yeUdsb3ZlR2xvd0dsdWVHb2F0R29kZGVzc0dvbGRHb29kR29vc2VHb3JpbGxhR29zcGVsR29zc2lwR292ZXJuR293bkdyYWJHcmFjZUdyYWluR3JhbnRHcmFwZUdyYXNzR3Jhdml0eUdyZWF0R3JlZW5HcmlkR3JpZWZHcml0R3JvY2VyeUdyb3VwR3Jvd0dydW50R3VhcmRHdWVzc0d1aWRlR3VpbHRHdWl0YXJHdW5HeW1IYWJpdEhhaXJIYWxmSGFtbWVySGFtc3RlckhhbmRIYXBweUhhcmJvckhhcmRIYXJzaEhhcnZlc3RIYXRIYXZlSGF3a0hhemFyZEhlYWRIZWFsdGhIZWFydEhlYXZ5SGVkZ2Vob2dIZWlnaHRIZWxsb0hlbG1ldEhlbHBIZW5IZXJvSGlkZGVuSGlnaEhpbGxIaW50SGlwSGlyZUhpc3RvcnlIb2JieUhvY2tleUhvbGRIb2xlSG9saWRheUhvbGxvd0hvbWVIb25leUhvb2RIb3BlSG9ybkhvcnJvckhvcnNlSG9zcGl0YWxIb3N0SG90ZWxIb3VySG92ZXJIdWJIdWdlSHVtYW5IdW1ibGVIdW1vckh1bmRyZWRIdW5ncnlIdW50SHVyZGxlSHVycnlIdXJ0SHVzYmFuZEh5YnJpZEljZUljb25JZGVhSWRlbnRpZnlJZGxlSWdub3JlSWxsSWxsZWdhbElsbG5lc3NJbWFnZUltaXRhdGVJbW1lbnNlSW1tdW5lSW1wYWN0SW1wb3NlSW1wcm92ZUltcHVsc2VJbmNoSW5jbHVkZUluY29tZUluY3JlYXNlSW5kZXhJbmRpY2F0ZUluZG9vckluZHVzdHJ5SW5mYW50SW5mbGljdEluZm9ybUluaGFsZUluaGVyaXRJbml0aWFsSW5qZWN0SW5qdXJ5SW5tYXRlSW5uZXJJbm5vY2VudElucHV0SW5xdWlyeUluc2FuZUluc2VjdEluc2lkZUluc3BpcmVJbnN0YWxsSW50YWN0SW50ZXJlc3RJbnRvSW52ZXN0SW52aXRlSW52b2x2ZUlyb25Jc2xhbmRJc29sYXRlSXNzdWVJdGVtSXZvcnlKYWNrZXRKYWd1YXJKYXJKYXp6SmVhbG91c0plYW5zSmVsbHlKZXdlbEpvYkpvaW5Kb2tlSm91cm5leUpveUp1ZGdlSnVpY2VKdW1wSnVuZ2xlSnVuaW9ySnVua0p1c3RLYW5nYXJvb0tlZW5LZWVwS2V0Y2h1cEtleUtpY2tLaWRLaWRuZXlLaW5kS2luZ2RvbUtpc3NLaXRLaXRjaGVuS2l0ZUtpdHRlbktpd2lLbmVlS25pZmVLbm9ja0tub3dMYWJMYWJlbExhYm9yTGFkZGVyTGFkeUxha2VMYW1wTGFuZ3VhZ2VMYXB0b3BMYXJnZUxhdGVyTGF0aW5MYXVnaExhdW5kcnlMYXZhTGF3TGF3bkxhd3N1aXRMYXllckxhenlMZWFkZXJMZWFmTGVhcm5MZWF2ZUxlY3R1cmVMZWZ0TGVnTGVnYWxMZWdlbmRMZWlzdXJlTGVtb25MZW5kTGVuZ3RoTGVuc0xlb3BhcmRMZXNzb25MZXR0ZXJMZXZlbExpYXJMaWJlcnR5TGlicmFyeUxpY2Vuc2VMaWZlTGlmdExpZ2h0TGlrZUxpbWJMaW1pdExpbmtMaW9uTGlxdWlkTGlzdExpdHRsZUxpdmVMaXphcmRMb2FkTG9hbkxvYnN0ZXJMb2NhbExvY2tMb2dpY0xvbmVseUxvbmdMb29wTG90dGVyeUxvdWRMb3VuZ2VMb3ZlTG95YWxMdWNreUx1Z2dhZ2VMdW1iZXJMdW5hckx1bmNoTHV4dXJ5THlyaWNzTWFjaGluZU1hZE1hZ2ljTWFnbmV0TWFpZE1haWxNYWluTWFqb3JNYWtlTWFtbWFsTWFuTWFuYWdlTWFuZGF0ZU1hbmdvTWFuc2lvbk1hbnVhbE1hcGxlTWFyYmxlTWFyY2hNYXJnaW5NYXJpbmVNYXJrZXRNYXJyaWFnZU1hc2tNYXNzTWFzdGVyTWF0Y2hNYXRlcmlhbE1hdGhNYXRyaXhNYXR0ZXJNYXhpbXVtTWF6ZU1lYWRvd01lYW5NZWFzdXJlTWVhdE1lY2hhbmljTWVkYWxNZWRpYU1lbG9keU1lbHRNZW1iZXJNZW1vcnlNZW50aW9uTWVudU1lcmN5TWVyZ2VNZXJpdE1lcnJ5TWVzaE1lc3NhZ2VNZXRhbE1ldGhvZE1pZGRsZU1pZG5pZ2h0TWlsa01pbGxpb25NaW1pY01pbmRNaW5pbXVtTWlub3JNaW51dGVNaXJhY2xlTWlycm9yTWlzZXJ5TWlzc01pc3Rha2VNaXhNaXhlZE1peHR1cmVNb2JpbGVNb2RlbE1vZGlmeU1vbU1vbWVudE1vbml0b3JNb25rZXlNb25zdGVyTW9udGhNb29uTW9yYWxNb3JlTW9ybmluZ01vc3F1aXRvTW90aGVyTW90aW9uTW90b3JNb3VudGFpbk1vdXNlTW92ZU1vdmllTXVjaE11ZmZpbk11bGVNdWx0aXBseU11c2NsZU11c2V1bU11c2hyb29tTXVzaWNNdXN0TXV0dWFsTXlzZWxmTXlzdGVyeU15dGhOYWl2ZU5hbWVOYXBraW5OYXJyb3dOYXN0eU5hdGlvbk5hdHVyZU5lYXJOZWNrTmVlZE5lZ2F0aXZlTmVnbGVjdE5laXRoZXJOZXBoZXdOZXJ2ZU5lc3ROZXROZXR3b3JrTmV1dHJhbE5ldmVyTmV3c05leHROaWNlTmlnaHROb2JsZU5vaXNlTm9taW5lZU5vb2RsZU5vcm1hbE5vcnRoTm9zZU5vdGFibGVOb3RlTm90aGluZ05vdGljZU5vdmVsTm93TnVjbGVhck51bWJlck51cnNlTnV0T2FrT2JleU9iamVjdE9ibGlnZU9ic2N1cmVPYnNlcnZlT2J0YWluT2J2aW91c09jY3VyT2NlYW5PY3RvYmVyT2Rvck9mZk9mZmVyT2ZmaWNlT2Z0ZW5PaWxPa2F5T2xkT2xpdmVPbHltcGljT21pdE9uY2VPbmVPbmlvbk9ubGluZU9ubHlPcGVuT3BlcmFPcGluaW9uT3Bwb3NlT3B0aW9uT3JhbmdlT3JiaXRPcmNoYXJkT3JkZXJPcmRpbmFyeU9yZ2FuT3JpZW50T3JpZ2luYWxPcnBoYW5Pc3RyaWNoT3RoZXJPdXRkb29yT3V0ZXJPdXRwdXRPdXRzaWRlT3ZhbE92ZW5PdmVyT3duT3duZXJPeHlnZW5PeXN0ZXJPem9uZVBhY3RQYWRkbGVQYWdlUGFpclBhbGFjZVBhbG1QYW5kYVBhbmVsUGFuaWNQYW50aGVyUGFwZXJQYXJhZGVQYXJlbnRQYXJrUGFycm90UGFydHlQYXNzUGF0Y2hQYXRoUGF0aWVudFBhdHJvbFBhdHRlcm5QYXVzZVBhdmVQYXltZW50UGVhY2VQZWFudXRQZWFyUGVhc2FudFBlbGljYW5QZW5QZW5hbHR5UGVuY2lsUGVvcGxlUGVwcGVyUGVyZmVjdFBlcm1pdFBlcnNvblBldFBob25lUGhvdG9QaHJhc2VQaHlzaWNhbFBpYW5vUGljbmljUGljdHVyZVBpZWNlUGlnUGlnZW9uUGlsbFBpbG90UGlua1Bpb25lZXJQaXBlUGlzdG9sUGl0Y2hQaXp6YVBsYWNlUGxhbmV0UGxhc3RpY1BsYXRlUGxheVBsZWFzZVBsZWRnZVBsdWNrUGx1Z1BsdW5nZVBvZW1Qb2V0UG9pbnRQb2xhclBvbGVQb2xpY2VQb25kUG9ueVBvb2xQb3B1bGFyUG9ydGlvblBvc2l0aW9uUG9zc2libGVQb3N0UG90YXRvUG90dGVyeVBvdmVydHlQb3dkZXJQb3dlclByYWN0aWNlUHJhaXNlUHJlZGljdFByZWZlclByZXBhcmVQcmVzZW50UHJldHR5UHJldmVudFByaWNlUHJpZGVQcmltYXJ5UHJpbnRQcmlvcml0eVByaXNvblByaXZhdGVQcml6ZVByb2JsZW1Qcm9jZXNzUHJvZHVjZVByb2ZpdFByb2dyYW1Qcm9qZWN0UHJvbW90ZVByb29mUHJvcGVydHlQcm9zcGVyUHJvdGVjdFByb3VkUHJvdmlkZVB1YmxpY1B1ZGRpbmdQdWxsUHVscFB1bHNlUHVtcGtpblB1bmNoUHVwaWxQdXBweVB1cmNoYXNlUHVyaXR5UHVycG9zZVB1cnNlUHVzaFB1dFB1enpsZVB5cmFtaWRRdWFsaXR5UXVhbnR1bVF1YXJ0ZXJRdWVzdGlvblF1aWNrUXVpdFF1aXpRdW90ZVJhYmJpdFJhY2Nvb25SYWNlUmFja1JhZGFyUmFkaW9SYWlsUmFpblJhaXNlUmFsbHlSYW1wUmFuY2hSYW5kb21SYW5nZVJhcGlkUmFyZVJhdGVSYXRoZXJSYXZlblJhd1Jhem9yUmVhZHlSZWFsUmVhc29uUmViZWxSZWJ1aWxkUmVjYWxsUmVjZWl2ZVJlY2lwZVJlY29yZFJlY3ljbGVSZWR1Y2VSZWZsZWN0UmVmb3JtUmVmdXNlUmVnaW9uUmVncmV0UmVndWxhclJlamVjdFJlbGF4UmVsZWFzZVJlbGllZlJlbHlSZW1haW5SZW1lbWJlclJlbWluZFJlbW92ZVJlbmRlclJlbmV3UmVudFJlb3BlblJlcGFpclJlcGVhdFJlcGxhY2VSZXBvcnRSZXF1aXJlUmVzY3VlUmVzZW1ibGVSZXNpc3RSZXNvdXJjZVJlc3BvbnNlUmVzdWx0UmV0aXJlUmV0cmVhdFJldHVyblJldW5pb25SZXZlYWxSZXZpZXdSZXdhcmRSaHl0aG1SaWJSaWJib25SaWNlUmljaFJpZGVSaWRnZVJpZmxlUmlnaHRSaWdpZFJpbmdSaW90UmlwcGxlUmlza1JpdHVhbFJpdmFsUml2ZXJSb2FkUm9hc3RSb2JvdFJvYnVzdFJvY2tldFJvbWFuY2VSb29mUm9va2llUm9vbVJvc2VSb3RhdGVSb3VnaFJvdW5kUm91dGVSb3lhbFJ1YmJlclJ1ZGVSdWdSdWxlUnVuUnVud2F5UnVyYWxTYWRTYWRkbGVTYWRuZXNzU2FmZVNhaWxTYWxhZFNhbG1vblNhbG9uU2FsdFNhbHV0ZVNhbWVTYW1wbGVTYW5kU2F0aXNmeVNhdG9zaGlTYXVjZVNhdXNhZ2VTYXZlU2F5U2NhbGVTY2FuU2NhcmVTY2F0dGVyU2NlbmVTY2hlbWVTY2hvb2xTY2llbmNlU2Npc3NvcnNTY29ycGlvblNjb3V0U2NyYXBTY3JlZW5TY3JpcHRTY3J1YlNlYVNlYXJjaFNlYXNvblNlYXRTZWNvbmRTZWNyZXRTZWN0aW9uU2VjdXJpdHlTZWVkU2Vla1NlZ21lbnRTZWxlY3RTZWxsU2VtaW5hclNlbmlvclNlbnNlU2VudGVuY2VTZXJpZXNTZXJ2aWNlU2Vzc2lvblNldHRsZVNldHVwU2V2ZW5TaGFkb3dTaGFmdFNoYWxsb3dTaGFyZVNoZWRTaGVsbFNoZXJpZmZTaGllbGRTaGlmdFNoaW5lU2hpcFNoaXZlclNob2NrU2hvZVNob290U2hvcFNob3J0U2hvdWxkZXJTaG92ZVNocmltcFNocnVnU2h1ZmZsZVNoeVNpYmxpbmdTaWNrU2lkZVNpZWdlU2lnaHRTaWduU2lsZW50U2lsa1NpbGx5U2lsdmVyU2ltaWxhclNpbXBsZVNpbmNlU2luZ1NpcmVuU2lzdGVyU2l0dWF0ZVNpeFNpemVTa2F0ZVNrZXRjaFNraVNraWxsU2tpblNraXJ0U2t1bGxTbGFiU2xhbVNsZWVwU2xlbmRlclNsaWNlU2xpZGVTbGlnaHRTbGltU2xvZ2FuU2xvdFNsb3dTbHVzaFNtYWxsU21hcnRTbWlsZVNtb2tlU21vb3RoU25hY2tTbmFrZVNuYXBTbmlmZlNub3dTb2FwU29jY2VyU29jaWFsU29ja1NvZGFTb2Z0U29sYXJTb2xkaWVyU29saWRTb2x1dGlvblNvbHZlU29tZW9uZVNvbmdTb29uU29ycnlTb3J0U291bFNvdW5kU291cFNvdXJjZVNvdXRoU3BhY2VTcGFyZVNwYXRpYWxTcGF3blNwZWFrU3BlY2lhbFNwZWVkU3BlbGxTcGVuZFNwaGVyZVNwaWNlU3BpZGVyU3Bpa2VTcGluU3Bpcml0U3BsaXRTcG9pbFNwb25zb3JTcG9vblNwb3J0U3BvdFNwcmF5U3ByZWFkU3ByaW5nU3B5U3F1YXJlU3F1ZWV6ZVNxdWlycmVsU3RhYmxlU3RhZGl1bVN0YWZmU3RhZ2VTdGFpcnNTdGFtcFN0YW5kU3RhcnRTdGF0ZVN0YXlTdGVha1N0ZWVsU3RlbVN0ZXBTdGVyZW9TdGlja1N0aWxsU3RpbmdTdG9ja1N0b21hY2hTdG9uZVN0b29sU3RvcnlTdG92ZVN0cmF0ZWd5U3RyZWV0U3RyaWtlU3Ryb25nU3RydWdnbGVTdHVkZW50U3R1ZmZTdHVtYmxlU3R5bGVTdWJqZWN0U3VibWl0U3Vid2F5U3VjY2Vzc1N1Y2hTdWRkZW5TdWZmZXJTdWdhclN1Z2dlc3RTdWl0U3VtbWVyU3VuU3VubnlTdW5zZXRTdXBlclN1cHBseVN1cHJlbWVTdXJlU3VyZmFjZVN1cmdlU3VycHJpc2VTdXJyb3VuZFN1cnZleVN1c3BlY3RTdXN0YWluU3dhbGxvd1N3YW1wU3dhcFN3YXJtU3dlYXJTd2VldFN3aWZ0U3dpbVN3aW5nU3dpdGNoU3dvcmRTeW1ib2xTeW1wdG9tU3lydXBTeXN0ZW1UYWJsZVRhY2tsZVRhZ1RhaWxUYWxlbnRUYWxrVGFua1RhcGVUYXJnZXRUYXNrVGFzdGVUYXR0b29UYXhpVGVhY2hUZWFtVGVsbFRlblRlbmFudFRlbm5pc1RlbnRUZXJtVGVzdFRleHRUaGFua1RoYXRUaGVtZVRoZW5UaGVvcnlUaGVyZVRoZXlUaGluZ1RoaXNUaG91Z2h0VGhyZWVUaHJpdmVUaHJvd1RodW1iVGh1bmRlclRpY2tldFRpZGVUaWdlclRpbHRUaW1iZXJUaW1lVGlueVRpcFRpcmVkVGlzc3VlVGl0bGVUb2FzdFRvYmFjY29Ub2RheVRvZGRsZXJUb2VUb2dldGhlclRvaWxldFRva2VuVG9tYXRvVG9tb3Jyb3dUb25lVG9uZ3VlVG9uaWdodFRvb2xUb290aFRvcFRvcGljVG9wcGxlVG9yY2hUb3JuYWRvVG9ydG9pc2VUb3NzVG90YWxUb3VyaXN0VG93YXJkVG93ZXJUb3duVG95VHJhY2tUcmFkZVRyYWZmaWNUcmFnaWNUcmFpblRyYW5zZmVyVHJhcFRyYXNoVHJhdmVsVHJheVRyZWF0VHJlZVRyZW5kVHJpYWxUcmliZVRyaWNrVHJpZ2dlclRyaW1UcmlwVHJvcGh5VHJvdWJsZVRydWNrVHJ1ZVRydWx5VHJ1bXBldFRydXN0VHJ1dGhUcnlUdWJlVHVpdGlvblR1bWJsZVR1bmFUdW5uZWxUdXJrZXlUdXJuVHVydGxlVHdlbHZlVHdlbnR5VHdpY2VUd2luVHdpc3RUd29UeXBlVHlwaWNhbFVnbHlVbWJyZWxsYVVuYWJsZVVuYXdhcmVVbmNsZVVuY292ZXJVbmRlclVuZG9VbmZhaXJVbmZvbGRVbmhhcHB5VW5pZm9ybVVuaXF1ZVVuaXRVbml2ZXJzZVVua25vd25VbmxvY2tVbnRpbFVudXN1YWxVbnZlaWxVcGRhdGVVcGdyYWRlVXBob2xkVXBvblVwcGVyVXBzZXRVcmJhblVyZ2VVc2FnZVVzZVVzZWRVc2VmdWxVc2VsZXNzVXN1YWxVdGlsaXR5VmFjYW50VmFjdXVtVmFndWVWYWxpZFZhbGxleVZhbHZlVmFuVmFuaXNoVmFwb3JWYXJpb3VzVmFzdFZhdWx0VmVoaWNsZVZlbHZldFZlbmRvclZlbnR1cmVWZW51ZVZlcmJWZXJpZnlWZXJzaW9uVmVyeVZlc3NlbFZldGVyYW5WaWFibGVWaWJyYW50VmljaW91c1ZpY3RvcnlWaWRlb1ZpZXdWaWxsYWdlVmludGFnZVZpb2xpblZpcnR1YWxWaXJ1c1Zpc2FWaXNpdFZpc3VhbFZpdGFsVml2aWRWb2NhbFZvaWNlVm9pZFZvbGNhbm9Wb2x1bWVWb3RlVm95YWdlV2FnZVdhZ29uV2FpdFdhbGtXYWxsV2FsbnV0V2FudFdhcmZhcmVXYXJtV2Fycmlvcldhc2hXYXNwV2FzdGVXYXRlcldhdmVXYXlXZWFsdGhXZWFwb25XZWFyV2Vhc2VsV2VhdGhlcldlYldlZGRpbmdXZWVrZW5kV2VpcmRXZWxjb21lV2VzdFdldFdoYWxlV2hhdFdoZWF0V2hlZWxXaGVuV2hlcmVXaGlwV2hpc3BlcldpZGVXaWR0aFdpZmVXaWxkV2lsbFdpbldpbmRvd1dpbmVXaW5nV2lua1dpbm5lcldpbnRlcldpcmVXaXNkb21XaXNlV2lzaFdpdG5lc3NXb2xmV29tYW5Xb25kZXJXb29kV29vbFdvcmRXb3JrV29ybGRXb3JyeVdvcnRoV3JhcFdyZWNrV3Jlc3RsZVdyaXN0V3JpdGVXcm9uZ1lhcmRZZWFyWWVsbG93WW91WW91bmdZb3V0aFplYnJhWmVyb1pvbmVab29cIjtcbmxldCB3b3JkbGlzdCA9IG51bGw7XG5mdW5jdGlvbiBsb2FkV29yZHMobGFuZykge1xuICAgIGlmICh3b3JkbGlzdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd29yZGxpc3QgPSB3b3Jkcy5yZXBsYWNlKC8oW0EtWl0pL2csIFwiICQxXCIpLnRvTG93ZXJDYXNlKCkuc3Vic3RyaW5nKDEpLnNwbGl0KFwiIFwiKTtcbiAgICAvLyBWZXJpZnkgdGhlIGNvbXB1dGVkIGxpc3QgbWF0Y2hlcyB0aGUgb2ZmaWNpYWwgbGlzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChXb3JkbGlzdC5jaGVjayhsYW5nKSAhPT0gXCIweDNjOGFjYzFlN2IwOGQ4ZTc2ZjlmZGEwMTVlZjQ4ZGM4YzcxMGE3M2NiN2UwZjc3YjJjMThhOWI1YTdhZGRlNjBcIikge1xuICAgICAgICB3b3JkbGlzdCA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJJUDM5IFdvcmRsaXN0IGZvciBlbiAoRW5nbGlzaCkgRkFJTEVEXCIpO1xuICAgIH1cbn1cbmNsYXNzIExhbmdFbiBleHRlbmRzIFdvcmRsaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJlblwiKTtcbiAgICB9XG4gICAgZ2V0V29yZChpbmRleCkge1xuICAgICAgICBsb2FkV29yZHModGhpcyk7XG4gICAgICAgIHJldHVybiB3b3JkbGlzdFtpbmRleF07XG4gICAgfVxuICAgIGdldFdvcmRJbmRleCh3b3JkKSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0LmluZGV4T2Yod29yZCk7XG4gICAgfVxufVxuY29uc3QgbGFuZ0VuID0gbmV3IExhbmdFbigpO1xuV29yZGxpc3QucmVnaXN0ZXIobGFuZ0VuKTtcbmV4cG9ydCB7IGxhbmdFbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy1lbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IHRvVXRmOEJ5dGVzLCB0b1V0ZjhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgbG9nZ2VyLCBXb3JkbGlzdCB9IGZyb20gXCIuL3dvcmRsaXN0XCI7XG5jb25zdCB3b3JkcyA9IFwiQS9iYWNvQWJkb21lbkFiZWphQWJpZXJ0b0Fib2dhZG9BYm9ub0Fib3J0b0FicmF6b0FicmlyQWJ1ZWxvQWJ1c29BY2FiYXJBY2FkZW1pYUFjY2Vzb0FjY2lvL25BY2VpdGVBY2VsZ2FBY2VudG9BY2VwdGFyQS9jaWRvQWNsYXJhckFjbmUvQWNvZ2VyQWNvc29BY3Rpdm9BY3RvQWN0cml6QWN0dWFyQWN1ZGlyQWN1ZXJkb0FjdXNhckFkaWN0b0FkbWl0aXJBZG9wdGFyQWRvcm5vQWR1YW5hQWR1bHRvQWUvcmVvQWZlY3RhckFmaWNpby9uQWZpbmFyQWZpcm1hckEvZ2lsQWdpdGFyQWdvbmkvYUFnb3N0b0Fnb3RhckFncmVnYXJBZ3Jpb0FndWFBZ3Vkb0EvZ3VpbGFBZ3VqYUFob2dvQWhvcnJvQWlyZUFpc2xhckFqZWRyZXpBamVub0FqdXN0ZUFsYWNyYS9uQWxhbWJyZUFsYXJtYUFsYmFBL2xidW1BbGNhbGRlQWxkZWFBbGVncmVBbGVqYXJBbGVydGFBbGV0YUFsZmlsZXJBbGdhQWxnb2RvL25BbGlhZG9BbGllbnRvQWxpdmlvQWxtYUFsbWVqYUFsbWkvYmFyQWx0YXJBbHRlemFBbHRpdm9BbHRvQWx0dXJhQWx1bW5vQWx6YXJBbWFibGVBbWFudGVBbWFwb2xhQW1hcmdvQW1hc2FyQS9tYmFyQS9tYml0b0FtZW5vQW1pZ29BbWlzdGFkQW1vckFtcGFyb0FtcGxpb0FuY2hvQW5jaWFub0FuY2xhQW5kYXJBbmRlL25BbmVtaWFBL25ndWxvQW5pbGxvQS9uaW1vQW5pL3NBbm90YXJBbnRlbmFBbnRpZ3VvQW50b2pvQW51YWxBbnVsYXJBbnVuY2lvQX5hZGlyQX5lam9Bfm9BcGFnYXJBcGFyYXRvQXBldGl0b0FwaW9BcGxpY2FyQXBvZG9BcG9ydGVBcG95b0FwcmVuZGVyQXByb2JhckFwdWVzdGFBcHVyb0FyYWRvQXJhfmFBcmFyQS9yYml0cm9BL3Jib2xBcmJ1c3RvQXJjaGl2b0FyY29BcmRlckFyZGlsbGFBcmR1b0EvcmVhQS9yaWRvQXJpZXNBcm1vbmkvYUFybmUvc0Fyb21hQXJwYUFycG8vbkFycmVnbG9BcnJvekFycnVnYUFydGVBcnRpc3RhQXNhQXNhZG9Bc2FsdG9Bc2NlbnNvQXNlZ3VyYXJBc2VvQXNlc29yQXNpZW50b0FzaWxvQXNpc3RpckFzbm9Bc29tYnJvQS9zcGVyb0FzdGlsbGFBc3Ryb0FzdHV0b0FzdW1pckFzdW50b0F0YWpvQXRhcXVlQXRhckF0ZW50b0F0ZW9BL3RpY29BdGxldGFBL3RvbW9BdHJhZXJBdHJvekF0dS9uQXVkYXpBdWRpb0F1Z2VBdWxhQXVtZW50b0F1c2VudGVBdXRvckF2YWxBdmFuY2VBdmFyb0F2ZUF2ZWxsYW5hQXZlbmFBdmVzdHJ1ekF2aW8vbkF2aXNvQXllckF5dWRhQXl1bm9BemFmcmEvbkF6YXJBem90ZUF6dS9jYXJBenVmcmVBenVsQmFiYUJhYm9yQmFjaGVCYWhpL2FCYWlsZUJhamFyQmFsYW56YUJhbGNvL25CYWxkZUJhbWJ1L0JhbmNvQmFuZGFCYX5vQmFyYmFCYXJjb0Jhcm5pekJhcnJvQmEvc2N1bGFCYXN0by9uQmFzdXJhQmF0YWxsYUJhdGVyaS9hQmF0aXJCYXR1dGFCYXUvbEJhemFyQmViZS9CZWJpZGFCZWxsb0Jlc2FyQmVzb0Jlc3RpYUJpY2hvQmllbkJpbmdvQmxhbmNvQmxvcXVlQmx1c2FCb2FCb2JpbmFCb2JvQm9jYUJvY2luYUJvZGFCb2RlZ2FCb2luYUJvbGFCb2xlcm9Cb2xzYUJvbWJhQm9uZGFkQm9uaXRvQm9ub0JvbnNhL2lCb3JkZUJvcnJhckJvc3F1ZUJvdGVCb3RpL25Cby92ZWRhQm96YWxCcmF2b0JyYXpvQnJlY2hhQnJldmVCcmlsbG9CcmluY29CcmlzYUJyb2NhQnJvbWFCcm9uY2VCcm90ZUJydWphQnJ1c2NvQnJ1dG9CdWNlb0J1Y2xlQnVlbm9CdWV5QnVmYW5kYUJ1Zm8vbkJ1L2hvQnVpdHJlQnVsdG9CdXJidWphQnVybGFCdXJyb0J1c2NhckJ1dGFjYUJ1em8vbkNhYmFsbG9DYWJlemFDYWJpbmFDYWJyYUNhY2FvQ2FkYS92ZXJDYWRlbmFDYWVyQ2FmZS9DYWkvZGFDYWltYS9uQ2FqYUNham8vbkNhbENhbGFtYXJDYWxjaW9DYWxkb0NhbGlkYWRDYWxsZUNhbG1hQ2Fsb3JDYWx2b0NhbWFDYW1iaW9DYW1lbGxvQ2FtaW5vQ2FtcG9DYS9uY2VyQ2FuZGlsQ2FuZWxhQ2FuZ3Vyb0NhbmljYUNhbnRvQ2F+YUNhfm8vbkNhb2JhQ2Fvc0NhcGF6Q2FwaXRhL25DYXBvdGVDYXB0YXJDYXB1Y2hhQ2FyYUNhcmJvL25DYS9yY2VsQ2FyZXRhQ2FyZ2FDYXJpfm9DYXJuZUNhcnBldGFDYXJyb0NhcnRhQ2FzYUNhc2NvQ2FzZXJvQ2FzcGFDYXN0b3JDYXRvcmNlQ2F0cmVDYXVkYWxDYXVzYUNhem9DZWJvbGxhQ2VkZXJDZWRyb0NlbGRhQ2UvbGVicmVDZWxvc29DZS9sdWxhQ2VtZW50b0Nlbml6YUNlbnRyb0NlcmNhQ2VyZG9DZXJlemFDZXJvQ2VycmFyQ2VydGV6YUNlL3NwZWRDZXRyb0NoYWNhbENoYWxlY29DaGFtcHUvQ2hhbmNsYUNoYXBhQ2hhcmxhQ2hpY29DaGlzdGVDaGl2b0Nob3F1ZUNob3phQ2h1bGV0YUNodXBhckNpY2xvL25DaWVnb0NpZWxvQ2llbkNpZXJ0b0NpZnJhQ2lnYXJyb0NpbWFDaW5jb0NpbmVDaW50YUNpcHJlL3NDaXJjb0NpcnVlbGFDaXNuZUNpdGFDaXVkYWRDbGFtb3JDbGFuQ2xhcm9DbGFzZUNsYXZlQ2xpZW50ZUNsaW1hQ2xpL25pY2FDb2JyZUNvY2Npby9uQ29jaGlub0NvY2luYUNvY29Dby9kaWdvQ29kb0NvZnJlQ29nZXJDb2hldGVDb2ppL25Db2pvQ29sYUNvbGNoYUNvbGVnaW9Db2xnYXJDb2xpbmFDb2xsYXJDb2xtb0NvbHVtbmFDb21iYXRlQ29tZXJDb21pZGFDby9tb2RvQ29tcHJhQ29uZGVDb25lam9Db25nYUNvbm9jZXJDb25zZWpvQ29udGFyQ29wYUNvcGlhQ29yYXpvL25Db3JiYXRhQ29yY2hvQ29yZG8vbkNvcm9uYUNvcnJlckNvc2VyQ29zbW9zQ29zdGFDcmEvbmVvQ3JhL3RlckNyZWFyQ3JlY2VyQ3JlaS9kb0NyZW1hQ3JpL2FDcmltZW5DcmlwdGFDcmlzaXNDcm9tb0Nyby9uaWNhQ3JvcXVldGFDcnVkb0NydXpDdWFkcm9DdWFydG9DdWF0cm9DdWJvQ3VicmlyQ3VjaGFyYUN1ZWxsb0N1ZW50b0N1ZXJkYUN1ZXN0YUN1ZXZhQ3VpZGFyQ3VsZWJyYUN1bHBhQ3VsdG9DdW1icmVDdW1wbGlyQ3VuYUN1bmV0YUN1b3RhQ3Vwby9uQ3UvcHVsYUN1cmFyQ3VyaW9zb0N1cnNvQ3VydmFDdXRpc0RhbWFEYW56YURhckRhcmRvRGEvdGlsRGViZXJEZS9iaWxEZS9jYWRhRGVjaXJEZWRvRGVmZW5zYURlZmluaXJEZWphckRlbGZpL25EZWxnYWRvRGVsaXRvRGVtb3JhRGVuc29EZW50YWxEZXBvcnRlRGVyZWNob0RlcnJvdGFEZXNheXVub0Rlc2VvRGVzZmlsZURlc251ZG9EZXN0aW5vRGVzdmkvb0RldGFsbGVEZXRlbmVyRGV1ZGFEaS9hRGlhYmxvRGlhZGVtYURpYW1hbnRlRGlhbmFEaWFyaW9EaWJ1am9EaWN0YXJEaWVudGVEaWV0YURpZXpEaWZpL2NpbERpZ25vRGlsZW1hRGlsdWlyRGluZXJvRGlyZWN0b0RpcmlnaXJEaXNjb0Rpc2V+b0Rpc2ZyYXpEaXZhRGl2aW5vRG9ibGVEb2NlRG9sb3JEb21pbmdvRG9uRG9uYXJEb3JhZG9Eb3JtaXJEb3Jzb0Rvc0Rvc2lzRHJhZ28vbkRyb2dhRHVjaGFEdWRhRHVlbG9EdWV+b0R1bGNlRHUvb0R1cXVlRHVyYXJEdXJlemFEdXJvRS9iYW5vRWJyaW9FY2hhckVjb0VjdWFkb3JFZGFkRWRpY2lvL25FZGlmaWNpb0VkaXRvckVkdWNhckVmZWN0b0VmaWNhekVqZUVqZW1wbG9FbGVmYW50ZUVsZWdpckVsZW1lbnRvRWxldmFyRWxpcHNlRS9saXRlRWxpeGlyRWxvZ2lvRWx1ZGlyRW1idWRvRW1pdGlyRW1vY2lvL25FbXBhdGVFbXBlfm9FbXBsZW9FbXByZXNhRW5hbm9FbmNhcmdvRW5jaHVmZUVuY2kvYUVuZW1pZ29FbmVyb0VuZmFkb0VuZmVybW9Fbmdhfm9FbmlnbWFFbmxhY2VFbm9ybWVFbnJlZG9FbnNheW9FbnNlfmFyRW50ZXJvRW50cmFyRW52YXNlRW52aS9vRS9wb2NhRXF1aXBvRXJpem9Fc2NhbGFFc2NlbmFFc2NvbGFyRXNjcmliaXJFc2N1ZG9Fc2VuY2lhRXNmZXJhRXNmdWVyem9Fc3BhZGFFc3Blam9Fc3BpL2FFc3Bvc2FFc3B1bWFFc3F1aS9Fc3RhckVzdGVFc3RpbG9Fc3R1ZmFFdGFwYUV0ZXJub0UvdGljYUV0bmlhRXZhZGlyRXZhbHVhckV2ZW50b0V2aXRhckV4YWN0b0V4YW1lbkV4Y2Vzb0V4Y3VzYUV4ZW50b0V4aWdpckV4aWxpb0V4aXN0aXJFL3hpdG9FeHBlcnRvRXhwbGljYXJFeHBvbmVyRXh0cmVtb0ZhL2JyaWNhRmEvYnVsYUZhY2hhZGFGYS9jaWxGYWN0b3JGYWVuYUZhamFGYWxkYUZhbGxvRmFsc29GYWx0YXJGYW1hRmFtaWxpYUZhbW9zb0ZhcmFvL25GYXJtYWNpYUZhcm9sRmFyc2FGYXNlRmF0aWdhRmF1bmFGYXZvckZheEZlYnJlcm9GZWNoYUZlbGl6RmVvRmVyaWFGZXJvekZlL3J0aWxGZXJ2b3JGZXN0aS9uRmlhYmxlRmlhbnphRmlhckZpYnJhRmljY2lvL25GaWNoYUZpZGVvRmllYnJlRmllbEZpZXJhRmllc3RhRmlndXJhRmlqYXJGaWpvRmlsYUZpbGV0ZUZpbGlhbEZpbHRyb0ZpbkZpbmNhRmluZ2lyRmluaXRvRmlybWFGbGFjb0ZsYXV0YUZsZWNoYUZsb3JGbG90YUZsdWlyRmx1am9GbHUvb3JGb2JpYUZvY2FGb2dhdGFGb2dvL25Gb2xpb0ZvbGxldG9Gb25kb0Zvcm1hRm9ycm9Gb3J0dW5hRm9yemFyRm9zYUZvdG9GcmFjYXNvRnJhL2dpbEZyYW5qYUZyYXNlRnJhdWRlRnJlaS9yRnJlbm9GcmVzYUZyaS9vRnJpdG9GcnV0YUZ1ZWdvRnVlbnRlRnVlcnphRnVnYUZ1bWFyRnVuY2lvL25GdW5kYUZ1cmdvL25GdXJpYUZ1c2lsRnUvdGJvbEZ1dHVyb0dhY2VsYUdhZmFzR2FpdGFHYWpvR2FsYUdhbGVyaS9hR2FsbG9HYW1iYUdhbmFyR2FuY2hvR2FuZ2FHYW5zb0dhcmFqZUdhcnphR2Fzb2xpbmFHYXN0YXJHYXRvR2F2aWxhL25HZW1lbG9HZW1pckdlbkdlL25lcm9HZW5pb0dlbnRlR2VyYW5pb0dlcmVudGVHZXJtZW5HZXN0b0dpZ2FudGVHaW1uYXNpb0dpcmFyR2lyb0dsYWNpYXJHbG9ib0dsb3JpYUdvbEdvbGZvR29sb3NvR29scGVHb21hR29yZG9Hb3JpbGFHb3JyYUdvdGFHb3Rlb0dvemFyR3JhZGFHcmEvZmljb0dyYW5vR3Jhc2FHcmF0aXNHcmF2ZUdyaWV0YUdyaWxsb0dyaXBlR3Jpc0dyaXRvR3Jvc29yR3J1L2FHcnVlc29HcnVtb0dydXBvR3VhbnRlR3VhcG9HdWFyZGlhR3VlcnJhR3VpL2FHdWl+b0d1aW9uR3Vpc29HdWl0YXJyYUd1c2Fub0d1c3RhckhhYmVySGEvYmlsSGFibGFySGFjZXJIYWNoYUhhZGFIYWxsYXJIYW1hY2FIYXJpbmFIYXpIYXphfmFIZWJpbGxhSGVicmFIZWNob0hlbGFkb0hlbGlvSGVtYnJhSGVyaXJIZXJtYW5vSGUvcm9lSGVydmlySGllbG9IaWVycm9IaS9nYWRvSGlnaWVuZUhpam9IaW1ub0hpc3RvcmlhSG9jaWNvSG9nYXJIb2d1ZXJhSG9qYUhvbWJyZUhvbmdvSG9ub3JIb25yYUhvcmFIb3JtaWdhSG9ybm9Ib3N0aWxIb3lvSHVlY29IdWVsZ2FIdWVydGFIdWVzb0h1ZXZvSHVpZGFIdWlySHVtYW5vSHUvbWVkb0h1bWlsZGVIdW1vSHVuZGlySHVyYWNhL25IdXJ0b0ljb25vSWRlYWxJZGlvbWFJL2RvbG9JZ2xlc2lhSWdsdS9JZ3VhbElsZWdhbElsdXNpby9uSW1hZ2VuSW1hL25JbWl0YXJJbXBhckltcGVyaW9JbXBvbmVySW1wdWxzb0luY2FwYXpJL25kaWNlSW5lcnRlSW5maWVsSW5mb3JtZUluZ2VuaW9JbmljaW9Jbm1lbnNvSW5tdW5lSW5uYXRvSW5zZWN0b0luc3RhbnRlSW50ZXJlL3NJL250aW1vSW50dWlySW51L3RpbEludmllcm5vSXJhSXJpc0lyb25pL2FJc2xhSXNsb3RlSmFiYWxpL0phYm8vbkphbW8vbkphcmFiZUphcmRpL25KYXJyYUphdWxhSmF6bWkvbkplZmVKZXJpbmdhSmluZXRlSm9ybmFkYUpvcm9iYUpvdmVuSm95YUp1ZXJnYUp1ZXZlc0p1ZXpKdWdhZG9ySnVnb0p1Z3VldGVKdWljaW9KdW5jb0p1bmdsYUp1bmlvSnVudGFySnUvcGl0ZXJKdXJhckp1c3RvSnV2ZW5pbEp1emdhcktpbG9Lb2FsYUxhYmlvTGFjaW9MYWNyYUxhZG9MYWRyby9uTGFnYXJ0b0xhL2dyaW1hTGFndW5hTGFpY29MYW1lckxhL21pbmFMYS9tcGFyYUxhbmFMYW5jaGFMYW5nb3N0YUxhbnphTGEvcGl6TGFyZ29MYXJ2YUxhL3N0aW1hTGF0YUxhL3RleExhdGlyTGF1cmVsTGF2YXJMYXpvTGVhbExlY2Npby9uTGVjaGVMZWN0b3JMZWVyTGVnaW8vbkxlZ3VtYnJlTGVqYW5vTGVuZ3VhTGVudG9MZX5hTGVvL25MZW9wYXJkb0xlc2lvL25MZXRhbExldHJhTGV2ZUxleWVuZGFMaWJlcnRhZExpYnJvTGljb3JMaS9kZXJMaWRpYXJMaWVuem9MaWdhTGlnZXJvTGltYUxpL21pdGVMaW1vL25MaW1waW9MaW5jZUxpbmRvTGkvbmVhTGluZ290ZUxpbm9MaW50ZXJuYUxpL3F1aWRvTGlzb0xpc3RhTGl0ZXJhTGl0aW9MaXRyb0xsYWdhTGxhbWFMbGFudG9MbGF2ZUxsZWdhckxsZW5hckxsZXZhckxsb3Jhckxsb3ZlckxsdXZpYUxvYm9Mb2Npby9uTG9jb0xvY3VyYUxvL2dpY2FMb2dyb0xvbWJyaXpMb21vTG9uamFMb3RlTHVjaGFMdWNpckx1Z2FyTHVqb0x1bmFMdW5lc0x1cGFMdXN0cm9MdXRvTHV6TWFjZXRhTWFjaG9NYWRlcmFNYWRyZU1hZHVyb01hZXN0cm9NYWZpYU1hZ2lhTWFnb01haS96TWFsZGFkTWFsZXRhTWFsbGFNYWxvTWFtYS9NYW1ib01hbXV0TWFuY29NYW5kb01hbmVqYXJNYW5nYU1hbmlxdWkvTWFuamFyTWFub01hbnNvTWFudGFNYX5hbmFNYXBhTWEvcXVpbmFNYXJNYXJjb01hcmVhTWFyZmlsTWFyZ2VuTWFyaWRvTWEvcm1vbE1hcnJvL25NYXJ0ZXNNYXJ6b01hc2FNYS9zY2FyYU1hc2l2b01hdGFyTWF0ZXJpYU1hdGl6TWF0cml6TWEveGltb01heW9yTWF6b3JjYU1lY2hhTWVkYWxsYU1lZGlvTWUvZHVsYU1lamlsbGFNZWpvck1lbGVuYU1lbG8vbk1lbW9yaWFNZW5vck1lbnNhamVNZW50ZU1lbnUvTWVyY2Fkb01lcmVuZ3VlTWUvcml0b01lc01lc28vbk1ldGFNZXRlck1lL3RvZG9NZXRyb01lemNsYU1pZWRvTWllbE1pZW1icm9NaWdhTWlsTWlsYWdyb01pbGl0YXJNaWxsby9uTWltb01pbmFNaW5lcm9NaS9uaW1vTWludXRvTWlvcGVNaXJhck1pc2FNaXNlcmlhTWlzaWxNaXNtb01pdGFkTWl0b01vY2hpbGFNb2Npby9uTW9kYU1vZGVsb01vaG9Nb2phck1vbGRlTW9sZXJNb2xpbm9Nb21lbnRvTW9taWFNb25hcmNhTW9uZWRhTW9uamFNb250b01vfm9Nb3JhZGFNb3JkZXJNb3Jlbm9Nb3Jpck1vcnJvTW9yc2FNb3J0YWxNb3NjYU1vc3RyYXJNb3Rpdm9Nb3Zlck1vL3ZpbE1vem9NdWNob011ZGFyTXVlYmxlTXVlbGFNdWVydGVNdWVzdHJhTXVncmVNdWplck11bGFNdWxldGFNdWx0YU11bmRvTXV+ZWNhTXVyYWxNdXJvTXUvc2N1bG9NdXNlb011c2dvTXUvc2ljYU11c2xvTmEvY2FyTmFjaW8vbk5hZGFyTmFpcGVOYXJhbmphTmFyaXpOYXJyYXJOYXNhbE5hdGFsTmF0aXZvTmF0dXJhbE5hL3VzZWFOYXZhbE5hdmVOYXZpZGFkTmVjaW9OZS9jdGFyTmVnYXJOZWdvY2lvTmVncm9OZW8vbk5lcnZpb05ldG9OZXV0cm9OZXZhck5ldmVyYU5pY2hvTmlkb05pZWJsYU5pZXRvTml+ZXpOaX5vTmkvdGlkb05pdmVsTm9ibGV6YU5vY2hlTm8vbWluYU5vcmlhTm9ybWFOb3J0ZU5vdGFOb3RpY2lhTm92YXRvTm92ZWxhTm92aW9OdWJlTnVjYU51L2NsZW9OdWRpbGxvTnVkb051ZXJhTnVldmVOdWV6TnVsb051L21lcm9OdXRyaWFPYXNpc09iZXNvT2Jpc3BvT2JqZXRvT2JyYU9icmVyb09ic2VydmFyT2J0ZW5lck9idmlvT2NhT2Nhc29PY2UvYW5vT2NoZW50YU9jaG9PY2lvT2NyZU9jdGF2b09jdHVicmVPY3VsdG9PY3VwYXJPY3VycmlyT2RpYXJPZGlvT2Rpc2VhT2VzdGVPZmVuc2FPZmVydGFPZmljaW9PZnJlY2VyT2dyb09pL2RvT2kvck9qb09sYU9sZWFkYU9sZmF0b09saXZvT2xsYU9sbW9PbG9yT2x2aWRvT21ibGlnb09uZGFPbnphT3BhY29PcGNpby9uTy9wZXJhT3BpbmFyT3BvbmVyT3B0YXJPL3B0aWNhT3B1ZXN0b09yYWNpby9uT3JhZG9yT3JhbE8vcmJpdGFPcmNhT3JkZW5PcmVqYU8vcmdhbm9PcmdpL2FPcmd1bGxvT3JpZW50ZU9yaWdlbk9yaWxsYU9yb09ycXVlc3RhT3J1Z2FPc2FkaS9hT3NjdXJvT3Nlem5vT3NvT3N0cmFPdG9+b090cm9PdmVqYU8vdnVsb08veGlkb094aS9nZW5vT3llbnRlT3pvbm9QYWN0b1BhZHJlUGFlbGxhUGEvZ2luYVBhZ29QYWkvc1BhL2phcm9QYWxhYnJhUGFsY29QYWxldGFQYS9saWRvUGFsbWFQYWxvbWFQYWxwYXJQYW5QYW5hbFBhL25pY29QYW50ZXJhUGF+dWVsb1BhcGEvUGFwZWxQYXBpbGxhUGFxdWV0ZVBhcmFyUGFyY2VsYVBhcmVkUGFyaXJQYXJvUGEvcnBhZG9QYXJxdWVQYS9ycmFmb1BhcnRlUGFzYXJQYXNlb1Bhc2lvL25QYXNvUGFzdGFQYXRhUGF0aW9QYXRyaWFQYXVzYVBhdXRhUGF2b1BheWFzb1BlYXRvL25QZWNhZG9QZWNlcmFQZWNob1BlZGFsUGVkaXJQZWdhclBlaW5lUGVsYXJQZWxkYX5vUGVsZWFQZWxpZ3JvUGVsbGVqb1BlbG9QZWx1Y2FQZW5hUGVuc2FyUGV+by9uUGVvL25QZW9yUGVwaW5vUGVxdWV+b1BlcmFQZXJjaGFQZXJkZXJQZXJlemFQZXJmaWxQZXJpY29QZXJsYVBlcm1pc29QZXJyb1BlcnNvbmFQZXNhUGVzY2FQZS9zaW1vUGVzdGF+YVBlL3RhbG9QZXRyby9sZW9QZXpQZXp1fmFQaWNhclBpY2hvL25QaWVQaWVkcmFQaWVybmFQaWV6YVBpamFtYVBpbGFyUGlsb3RvUGltaWVudGFQaW5vUGludG9yUGluemFQaX5hUGlvam9QaXBhUGlyYXRhUGlzYXJQaXNjaW5hUGlzb1Bpc3RhUGl0by9uUGl6Y2FQbGFjYVBsYW5QbGF0YVBsYXlhUGxhemFQbGVpdG9QbGVub1Bsb21vUGx1bWFQbHVyYWxQb2JyZVBvY29Qb2RlclBvZGlvUG9lbWFQb2VzaS9hUG9ldGFQb2xlblBvbGljaS9hUG9sbG9Qb2x2b1BvbWFkYVBvbWVsb1BvbW9Qb21wYVBvbmVyUG9yY2lvL25Qb3J0YWxQb3NhZGFQb3NlZXJQb3NpYmxlUG9zdGVQb3RlbmNpYVBvdHJvUG96b1ByYWRvUHJlY296UHJlZ3VudGFQcmVtaW9QcmVuc2FQcmVzb1ByZXZpb1ByaW1vUHJpL25jaXBlUHJpc2lvL25Qcml2YXJQcm9hUHJvYmFyUHJvY2Vzb1Byb2R1Y3RvUHJvZXphUHJvZmVzb3JQcm9ncmFtYVByb2xlUHJvbWVzYVByb250b1Byb3Bpb1Byby94aW1vUHJ1ZWJhUHUvYmxpY29QdWNoZXJvUHVkb3JQdWVibG9QdWVydGFQdWVzdG9QdWxnYVB1bGlyUHVsbW8vblB1bHBvUHVsc29QdW1hUHVudG9QdX5hbFB1fm9QdXBhUHVwaWxhUHVyZS9RdWVkYXJRdWVqYVF1ZW1hclF1ZXJlclF1ZXNvUXVpZXRvUXVpL21pY2FRdWluY2VRdWl0YXJSYS9iYW5vUmFiaWFSYWJvUmFjaW8vblJhZGljYWxSYWkvelJhbWFSYW1wYVJhbmNob1JhbmdvUmFwYXpSYS9waWRvUmFwdG9SYXNnb1Jhc3BhUmF0b1JheW9SYXphUmF6by9uUmVhY2Npby9uUmVhbGlkYWRSZWJhfm9SZWJvdGVSZWNhZXJSZWNldGFSZWNoYXpvUmVjb2dlclJlY3Jlb1JlY3RvUmVjdXJzb1JlZFJlZG9uZG9SZWR1Y2lyUmVmbGVqb1JlZm9ybWFSZWZyYS9uUmVmdWdpb1JlZ2Fsb1JlZ2lyUmVnbGFSZWdyZXNvUmVoZS9uUmVpbm9SZWkvclJlamFSZWxhdG9SZWxldm9SZWxpZXZlUmVsbGVub1JlbG9qUmVtYXJSZW1lZGlvUmVtb1JlbmNvclJlbmRpclJlbnRhUmVwYXJ0b1JlcGV0aXJSZXBvc29SZXB0aWxSZXNSZXNjYXRlUmVzaW5hUmVzcGV0b1Jlc3RvUmVzdW1lblJldGlyb1JldG9ybm9SZXRyYXRvUmV1bmlyUmV2ZS9zUmV2aXN0YVJleVJlemFyUmljb1JpZWdvUmllbmRhUmllc2dvUmlmYVJpL2dpZG9SaWdvclJpbmNvL25SaX5vL25SaS9vUmlxdWV6YVJpc2FSaXRtb1JpdG9SaXpvUm9ibGVSb2NlUm9jaWFyUm9kYXJSb2Rlb1JvZGlsbGFSb2VyUm9qaXpvUm9qb1JvbWVyb1JvbXBlclJvblJvbmNvUm9uZGFSb3BhUm9wZXJvUm9zYVJvc2NhUm9zdHJvUm90YXJSdWJpL1J1Ym9yUnVkb1J1ZWRhUnVnaXJSdWlkb1J1aW5hUnVsZXRhUnVsb1J1bWJvUnVtb3JSdXB0dXJhUnV0YVJ1dGluYVNhL2JhZG9TYWJlclNhYmlvU2FibGVTYWNhclNhZ2F6U2FncmFkb1NhbGFTYWxkb1NhbGVyb1NhbGlyU2FsbW8vblNhbG8vblNhbHNhU2FsdG9TYWx1ZFNhbHZhclNhbWJhU2FuY2lvL25TYW5kaS9hU2FuZWFyU2FuZ3JlU2FuaWRhZFNhbm9TYW50b1NhcG9TYXF1ZVNhcmRpbmFTYXJ0ZS9uU2FzdHJlU2F0YS9uU2F1bmFTYXhvZm8vblNlY2Npby9uU2Vjb1NlY3JldG9TZWN0YVNlZFNlZ3VpclNlaXNTZWxsb1NlbHZhU2VtYW5hU2VtaWxsYVNlbmRhU2Vuc29yU2V+YWxTZX5vclNlcGFyYXJTZXBpYVNlcXVpL2FTZXJTZXJpZVNlcm1vL25TZXJ2aXJTZXNlbnRhU2VzaW8vblNldGFTZXRlbnRhU2V2ZXJvU2V4b1NleHRvU2lkcmFTaWVzdGFTaWV0ZVNpZ2xvU2lnbm9TaS9sYWJhU2lsYmFyU2lsZW5jaW9TaWxsYVNpL21ib2xvU2ltaW9TaXJlbmFTaXN0ZW1hU2l0aW9TaXR1YXJTb2JyZVNvY2lvU29kaW9Tb2xTb2xhcGFTb2xkYWRvU29sZWRhZFNvL2xpZG9Tb2x0YXJTb2x1Y2lvL25Tb21icmFTb25kZW9Tb25pZG9Tb25vcm9Tb25yaXNhU29wYVNvcGxhclNvcG9ydGVTb3Jkb1NvcnByZXNhU29ydGVvU29zdGUvblNvL3Rhbm9TdWF2ZVN1YmlyU3VjZXNvU3Vkb3JTdWVncmFTdWVsb1N1ZX5vU3VlcnRlU3VmcmlyU3VqZXRvU3VsdGEvblN1bWFyU3VwZXJhclN1cGxpclN1cG9uZXJTdXByZW1vU3VyU3VyY29TdXJlfm9TdXJnaXJTdXN0b1N1dGlsVGFiYWNvVGFiaXF1ZVRhYmxhVGFidS9UYWNvVGFjdG9UYWpvVGFsYXJUYWxjb1RhbGVudG9UYWxsYVRhbG8vblRhbWF+b1RhbWJvclRhbmdvVGFucXVlVGFwYVRhcGV0ZVRhcGlhVGFwby9uVGFxdWlsbGFUYXJkZVRhcmVhVGFyaWZhVGFyamV0YVRhcm90VGFycm9UYXJ0YVRhdHVhamVUYXVyb1RhemFUYXpvL25UZWF0cm9UZWNob1RlY2xhVGUvY25pY2FUZWphZG9UZWplclRlamlkb1RlbGFUZWxlL2Zvbm9UZW1hVGVtb3JUZW1wbG9UZW5helRlbmRlclRlbmVyVGVuaXNUZW5zb1Rlb3JpL2FUZXJhcGlhVGVyY29UZS9ybWlub1Rlcm51cmFUZXJyb3JUZXNpc1Rlc29yb1Rlc3RpZ29UZXRlcmFUZXh0b1RlelRpYmlvVGlidXJvL25UaWVtcG9UaWVuZGFUaWVycmFUaWVzb1RpZ3JlVGlqZXJhVGlsZGVUaW1icmVUaS9taWRvVGltb1RpbnRhVGkvb1RpL3BpY29UaXBvVGlyYVRpcm8vblRpdGEvblRpL3RlcmVUaS90dWxvVGl6YVRvYWxsYVRvYmlsbG9Ub2NhclRvY2lub1RvZG9Ub2dhVG9sZG9Ub21hclRvbm9Ub250b1RvcGFyVG9wZVRvcXVlVG8vcmF4VG9yZXJvVG9ybWVudGFUb3JuZW9Ub3JvVG9ycGVkb1RvcnJlVG9yc29Ub3J0dWdhVG9zVG9zY29Ub3NlclRvL3hpY29UcmFiYWpvVHJhY3RvclRyYWVyVHJhL2ZpY29UcmFnb1RyYWplVHJhbW9UcmFuY2VUcmF0b1RyYXVtYVRyYXphclRyZS9ib2xUcmVndWFUcmVpbnRhVHJlblRyZXBhclRyZXNUcmlidVRyaWdvVHJpcGFUcmlzdGVUcml1bmZvVHJvZmVvVHJvbXBhVHJvbmNvVHJvcGFUcm90ZVRyb3pvVHJ1Y29UcnVlbm9UcnVmYVR1YmVyaS9hVHVib1R1ZXJ0b1R1bWJhVHVtb3JUdS9uZWxUdS9uaWNhVHVyYmluYVR1cmlzbW9UdXJub1R1dG9yVWJpY2FyVS9sY2VyYVVtYnJhbFVuaWRhZFVuaXJVbml2ZXJzb1Vub1VudGFyVX5hVXJiYW5vVXJiZVVyZ2VudGVVcm5hVXNhclVzdWFyaW9VL3RpbFV0b3BpL2FVdmFWYWNhVmFjaS9vVmFjdW5hVmFnYXJWYWdvVmFpbmFWYWppbGxhVmFsZVZhL2xpZG9WYWxsZVZhbG9yVmEvbHZ1bGFWYW1waXJvVmFyYVZhcmlhclZhcm8vblZhc29WZWNpbm9WZWN0b3JWZWhpL2N1bG9WZWludGVWZWplelZlbGFWZWxlcm9WZWxvelZlbmFWZW5jZXJWZW5kYVZlbmVub1ZlbmdhclZlbmlyVmVudGFWZW51c1ZlclZlcmFub1ZlcmJvVmVyZGVWZXJlZGFWZXJqYVZlcnNvVmVydGVyVmkvYVZpYWplVmlicmFyVmljaW9WaS9jdGltYVZpZGFWaS9kZW9WaWRyaW9WaWVqb1ZpZXJuZXNWaWdvclZpbFZpbGxhVmluYWdyZVZpbm9WaX5lZG9WaW9saS9uVmlyYWxWaXJnb1ZpcnR1ZFZpc29yVmkvc3BlcmFWaXN0YVZpdGFtaW5hVml1ZG9WaXZhelZpdmVyb1ZpdmlyVml2b1ZvbGNhL25Wb2x1bWVuVm9sdmVyVm9yYXpWb3RhclZvdG9Wb3pWdWVsb1Z1bGdhcllhY2VyWWF0ZVllZ3VhWWVtYVllcm5vWWVzb1lvZG9Zb2dhWW9ndXJaYWZpcm9aYW5qYVphcGF0b1phcnphWm9uYVpvcnJvWnVtb1p1cmRvXCI7XG5jb25zdCBsb29rdXAgPSB7fTtcbmxldCB3b3JkbGlzdCA9IG51bGw7XG5mdW5jdGlvbiBkcm9wRGlhY3JpdGljKHdvcmQpIHtcbiAgICBsb2dnZXIuY2hlY2tOb3JtYWxpemUoKTtcbiAgICByZXR1cm4gdG9VdGY4U3RyaW5nKEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0b1V0ZjhCeXRlcyh3b3JkLm5vcm1hbGl6ZShcIk5GRFwiKS50b0xvd2VyQ2FzZSgpKSwgKGMpID0+IHtcbiAgICAgICAgcmV0dXJuICgoYyA+PSA2NSAmJiBjIDw9IDkwKSB8fCAoYyA+PSA5NyAmJiBjIDw9IDEyMykpO1xuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIGV4cGFuZCh3b3JkKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0b1V0ZjhCeXRlcyh3b3JkKSwgKGMpID0+IHtcbiAgICAgICAgLy8gQWN1dGUgYWNjZW50XG4gICAgICAgIGlmIChjID09PSA0Nykge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goMjA0KTtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKDEyOSk7XG4gICAgICAgICAgICAvLyBuLXRpbGRlXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYyA9PT0gMTI2KSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaCgxMTApO1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goMjA0KTtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKDEzMSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChjKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0b1V0ZjhTdHJpbmcob3V0cHV0KTtcbn1cbmZ1bmN0aW9uIGxvYWRXb3JkcyhsYW5nKSB7XG4gICAgaWYgKHdvcmRsaXN0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JkbGlzdCA9IHdvcmRzLnJlcGxhY2UoLyhbQS1aXSkvZywgXCIgJDFcIikudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMSkuc3BsaXQoXCIgXCIpLm1hcCgodykgPT4gZXhwYW5kKHcpKTtcbiAgICB3b3JkbGlzdC5mb3JFYWNoKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgICAgICBsb29rdXBbZHJvcERpYWNyaXRpYyh3b3JkKV0gPSBpbmRleDtcbiAgICB9KTtcbiAgICAvLyBWZXJpZnkgdGhlIGNvbXB1dGVkIGxpc3QgbWF0Y2hlcyB0aGUgb2ZmaWNpYWwgbGlzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChXb3JkbGlzdC5jaGVjayhsYW5nKSAhPT0gXCIweGY3NGZiNzA5MmFlYWNkZmJmODk1OTU1N2RlMjIwOThkYTUxMjIwN2ZiOWYxMDljYjUyNjk5NDkzOGNmNDAzMDBcIikge1xuICAgICAgICB3b3JkbGlzdCA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJJUDM5IFdvcmRsaXN0IGZvciBlcyAoU3BhbmlzaCkgRkFJTEVEXCIpO1xuICAgIH1cbn1cbmNsYXNzIExhbmdFcyBleHRlbmRzIFdvcmRsaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJlc1wiKTtcbiAgICB9XG4gICAgZ2V0V29yZChpbmRleCkge1xuICAgICAgICBsb2FkV29yZHModGhpcyk7XG4gICAgICAgIHJldHVybiB3b3JkbGlzdFtpbmRleF07XG4gICAgfVxuICAgIGdldFdvcmRJbmRleCh3b3JkKSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGxvb2t1cFtkcm9wRGlhY3JpdGljKHdvcmQpXTtcbiAgICB9XG59XG5jb25zdCBsYW5nRXMgPSBuZXcgTGFuZ0VzKCk7XG5Xb3JkbGlzdC5yZWdpc3RlcihsYW5nRXMpO1xuZXhwb3J0IHsgbGFuZ0VzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYW5nLWVzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuaW1wb3J0IHsgdG9VdGY4Qnl0ZXMsIHRvVXRmOFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9zdHJpbmdzXCI7XG5pbXBvcnQgeyBsb2dnZXIsIFdvcmRsaXN0IH0gZnJvbSBcIi4vd29yZGxpc3RcIjtcbmNvbnN0IHdvcmRzID0gXCJBYmFpc3NlckFiYW5kb25BYmRpcXVlckFiZWlsbGVBYm9saXJBYm9yZGVyQWJvdXRpckFib3llckFicmFzaWZBYnJldXZlckFicml0ZXJBYnJvZ2VyQWJydXB0QWJzZW5jZUFic29sdUFic3VyZGVBYnVzaWZBYnlzc2FsQWNhZGUvbWllQWNham91QWNhcmllbkFjY2FibGVyQWNjZXB0ZXJBY2NsYW1lckFjY29sYWRlQWNjcm9jaGVBY2N1c2VyQWNlcmJlQWNoYXRBY2hldGVyQWNpZHVsZXJBY2llckFjb21wdGVBY3F1ZS9yaXJBY3JvbnltZUFjdGV1ckFjdGlmQWN0dWVsQWRlcHRlQWRlL3F1YXRBZGhlL3NpZkFkamVjdGlmQWRqdWdlckFkbWV0dHJlQWRtaXJlckFkb3B0ZXJBZG9yZXJBZG91Y2lyQWRyZXNzZUFkcm9pdEFkdWx0ZUFkdmVyYmVBZS9yZXJBZS9yb25lZkFmZmFpcmVBZmZlY3RlckFmZmljaGVBZmZyZXV4QWZmdWJsZXJBZ2FjZXJBZ2VuY2VyQWdpbGVBZ2l0ZXJBZ3JhZmVyQWdyZS9hYmxlQWdydW1lQWlkZXJBaWd1aWxsZUFpbGllckFpbWFibGVBaXNhbmNlQWpvdXRlckFqdXN0ZXJBbGFybWVyQWxjaGltaWVBbGVydGVBbGdlLWJyZUFsZ3VlQWxpZS9uZXJBbGltZW50QWxsZS9nZXJBbGxpYWdlQWxsb3VlckFsbHVtZXJBbG91cmRpckFscGFnYUFsdGVzc2VBbHZlL29sZUFtYXRldXJBbWJpZ3VBbWJyZUFtZS9uYWdlckFtZXJ0dW1lQW1pZG9uQW1pcmFsQW1vcmNlckFtb3VyQW1vdmlibGVBbXBoaWJpZUFtcGxldXJBbXVzYW50QW5hbHlzZUFuYXBob3JlQW5hcmNoaWVBbmF0b21pZUFuY2llbkFuZS9hbnRpckFuZ2xlQW5nb2lzc2VBbmd1bGV1eEFuaW1hbEFubmV4ZXJBbm5vbmNlQW5udWVsQW5vZGluQW5vbWFsaWVBbm9ueW1lQW5vcm1hbEFudGVubmVBbnRpZG90ZUFueGlldXhBcGFpc2VyQXBlL3JpdGlmQXBsYW5pckFwb2xvZ2llQXBwYXJlaWxBcHBlbGVyQXBwb3J0ZXJBcHB1eWVyQXF1YXJpdW1BcXVlZHVjQXJiaXRyZUFyYnVzdGVBcmRldXJBcmRvaXNlQXJnZW50QXJsZXF1aW5Bcm1hdHVyZUFybWVtZW50QXJtb2lyZUFybXVyZUFycGVudGVyQXJyYWNoZXJBcnJpdmVyQXJyb3NlckFyc2VuaWNBcnRlL3JpZWxBcnRpY2xlQXNwZWN0QXNwaGFsdGVBc3BpcmVyQXNzYXV0QXNzZXJ2aXJBc3NpZXR0ZUFzc29jaWVyQXNzdXJlckFzdGljb3RBc3RyZUFzdHVjZUF0ZWxpZXJBdG9tZUF0cml1bUF0cm9jZUF0dGFxdWVBdHRlbnRpZkF0dGlyZXJBdHRyYXBlckF1YmFpbmVBdWJlcmdlQXVkYWNlQXVkaWJsZUF1Z3VyZXJBdXJvcmVBdXRvbW5lQXV0cnVjaGVBdmFsZXJBdmFuY2VyQXZhcmljZUF2ZW5pckF2ZXJzZUF2ZXVnbGVBdmlhdGV1ckF2aWRlQXZpb25BdmlzZXJBdm9pbmVBdm91ZXJBdnJpbEF4aWFsQXhpb21lQmFkZ2VCYWZvdWVyQmFnYWdlQmFndWV0dGVCYWlnbmFkZUJhbGFuY2VyQmFsY29uQmFsZWluZUJhbGlzYWdlQmFtYmluQmFuY2FpcmVCYW5kYWdlQmFubGlldWVCYW5uaWUtcmVCYW5xdWllckJhcmJpZXJCYXJpbEJhcm9uQmFycXVlQmFycmFnZUJhc3NpbkJhc3Rpb25CYXRhaWxsZUJhdGVhdUJhdHRlcmllQmF1ZHJpZXJCYXZhcmRlckJlbGV0dGVCZS9saWVyQmVsb3RlQmUvbmUvZmljZUJlcmNlYXVCZXJnZXJCZXJsaW5lQmVybXVkYUJlc2FjZUJlc29nbmVCZS90YWlsQmV1cnJlQmliZXJvbkJpY3ljbGVCaWR1bGVCaWpvdUJpbGFuQmlsaW5ndWVCaWxsYXJkQmluYWlyZUJpb2xvZ2llQmlvcHNpZUJpb3R5cGVCaXNjdWl0Qmlzb25CaXN0b3VyaUJpdHVtZUJpemFycmVCbGFmYXJkQmxhZ3VlQmxhbmNoaXJCbGVzc2FudEJsaW5kZXJCbG9uZEJsb3F1ZXJCbG91c29uQm9iYXJkQm9iaW5lQm9pcmVCb2lzZXJCb2xpZGVCb25ib25Cb25kaXJCb25oZXVyQm9uaWZpZXJCb251c0JvcmR1cmVCb3JuZUJvdHRlQm91Y2xlQm91ZXV4Qm91Z2llQm91bG9uQm91cXVpbkJvdXJzZUJvdXNzb2xlQm91dGlxdWVCb3hldXJCcmFuY2hlQnJhc2llckJyYXZlQnJlYmlzQnJlLWNoZUJyZXV2YWdlQnJpY29sZXJCcmlnYWRlQnJpbGxhbnRCcmlvY2hlQnJpcXVlQnJvY2h1cmVCcm9kZXJCcm9uemVyQnJvdXNzZUJyb3lldXJCcnVtZUJydXNxdWVCcnV0YWxCcnV5YW50QnVmZmxlQnVpc3NvbkJ1bGxldGluQnVyZWF1QnVyaW5CdXN0aWVyQnV0aW5lckJ1dG9pckJ1dmFibGVCdXZldHRlQ2FiYW5vbkNhYmluZUNhY2hldHRlQ2FkZWF1Q2FkcmVDYWZlL2luZUNhaWxsb3VDYWlzc29uQ2FsY3VsZXJDYWxlcGluQ2FsaWJyZUNhbG1lckNhbG9tbmllQ2FsdmFpcmVDYW1hcmFkZUNhbWUvcmFDYW1pb25DYW1wYWduZUNhbmFsQ2FuZXRvbkNhbm9uQ2FudGluZUNhbnVsYXJDYXBhYmxlQ2Fwb3JhbENhcHJpY2VDYXBzdWxlQ2FwdGVyQ2FwdWNoZUNhcmFiaW5lQ2FyYm9uZUNhcmVzc2VyQ2FyaWJvdUNhcm5hZ2VDYXJvdHRlQ2FycmVhdUNhcnRvbkNhc2NhZGVDYXNpZXJDYXNxdWVDYXNzdXJlQ2F1c2VyQ2F1dGlvbkNhdmFsaWVyQ2F2ZXJuZUNhdmlhckNlL2RpbGxlQ2VpbnR1cmVDZS9sZXN0ZUNlbGx1bGVDZW5kcmllckNlbnN1cmVyQ2VudHJhbENlcmNsZUNlL3JlL2JyYWxDZXJpc2VDZXJuZXJDZXJ2ZWF1Q2Vzc2VyQ2hhZ3JpbkNoYWlzZUNoYWxldXJDaGFtYnJlQ2hhbmNlQ2hhcGl0cmVDaGFyYm9uQ2hhc3NldXJDaGF0b25DaGF1c3NvbkNoYXZpcmVyQ2hlbWlzZUNoZW5pbGxlQ2hlL3F1aWVyQ2hlcmNoZXJDaGV2YWxDaGllbkNoaWZmcmVDaGlnbm9uQ2hpbWUtcmVDaGlvdENobG9ydXJlQ2hvY29sYXRDaG9pc2lyQ2hvc2VDaG91ZXR0ZUNocm9tZUNodXRlQ2lnYXJlQ2lnb2duZUNpbWVudGVyQ2luZS9tYUNpbnRyZXJDaXJjdWxlckNpcmVyQ2lycXVlQ2l0ZXJuZUNpdG95ZW5DaXRyb25DaXZpbENsYWlyb25DbGFtZXVyQ2xhcXVlckNsYXNzZUNsYXZpZXJDbGllbnRDbGlnbmVyQ2xpbWF0Q2xpdmFnZUNsb2NoZUNsb25hZ2VDbG9wb3J0ZUNvYmFsdENvYnJhQ29jYXNzZUNvY290aWVyQ29kZXJDb2RpZmllckNvZmZyZUNvZ25lckNvaGUvc2lvbkNvaWZmZXJDb2luY2VyQ29sZS1yZUNvbGlicmlDb2xsaW5lQ29sbWF0ZXJDb2xvbmVsQ29tYmF0Q29tZS9kaWVDb21tYW5kZUNvbXBhY3RDb25jZXJ0Q29uZHVpcmVDb25maWVyQ29uZ2VsZXJDb25ub3RlckNvbnNvbm5lQ29udGFjdENvbnZleGVDb3BhaW5Db3BpZUNvcmFpbENvcmJlYXVDb3JkYWdlQ29ybmljaGVDb3JwdXNDb3JyZWN0Q29ydGUtZ2VDb3NtaXF1ZUNvc3R1bWVDb3RvbkNvdWRlQ291cHVyZUNvdXJhZ2VDb3V0ZWF1Q291dnJpckNveW90ZUNyYWJlQ3JhaW50ZUNyYXZhdGVDcmF5b25DcmUvYXR1cmVDcmUvZGl0ZXJDcmUvbWV1eENyZXVzZXJDcmV2ZXR0ZUNyaWJsZXJDcmllckNyaXN0YWxDcml0ZS1yZUNyb2lyZUNyb3F1ZXJDcm90YWxlQ3J1Y2lhbENydWVsQ3J5cHRlckN1YmlxdWVDdWVpbGxpckN1aWxsZS1yZUN1aXNpbmVDdWl2cmVDdWxtaW5lckN1bHRpdmVyQ3VtdWxlckN1cGlkZUN1cmF0aWZDdXJzZXVyQ3lhbnVyZUN5Y2xlQ3lsaW5kcmVDeW5pcXVlRGFpZ25lckRhbWllckRhbmdlckRhbnNldXJEYXVwaGluRGUvYmF0dHJlRGUvYml0ZXJEZS9ib3JkZXJEZS9icmlkZXJEZS9idXRhbnREZS9jYWxlckRlL2NlbWJyZURlL2NoaXJlckRlL2NpZGVyRGUvY2xhcmVyRGUvY29yZXJEZS9jcmlyZURlL2N1cGxlckRlL2RhbGVEZS9kdWN0aWZEZS9lc3NlRGUvZmVuc2lmRGUvZmlsZXJEZS9mcmF5ZXJEZS9nYWdlckRlL2dpdnJlckRlL2dsdXRpckRlL2dyYWZlckRlL2pldW5lckRlL2xpY2VEZS9sb2dlckRlbWFuZGVyRGVtZXVyZXJEZS9tb2xpckRlL25pY2hlckRlL25vdWVyRGVudGVsbGVEZS9udWRlckRlL3BhcnREZS9wZW5zZXJEZS9waGFzZXJEZS9wbGFjZXJEZS9wb3NlckRlL3JhbmdlckRlL3JvYmVyRGUvc2FzdHJlRGVzY2VudGVEZS9zZXJ0RGUvc2lnbmVyRGUvc29iZS9pckRlc3NpbmVyRGVzdHJpZXJEZS90YWNoZXJEZS90ZXN0ZXJEZS90b3VyZXJEZS90cmVzc2VEZXZhbmNlckRldmVuaXJEZXZpbmVyRGV2b2lyRGlhYmxlRGlhbG9ndWVEaWFtYW50RGljdGVyRGlmZmUvcmVyRGlnZS9yZXJEaWdpdGFsRGlnbmVEaWx1ZXJEaW1hbmNoZURpbWludWVyRGlveHlkZURpcmVjdGlmRGlyaWdlckRpc2N1dGVyRGlzcG9zZXJEaXNzaXBlckRpc3RhbmNlRGl2ZXJ0aXJEaXZpc2VyRG9jaWxlRG9jdGV1ckRvZ21lRG9pZ3REb21haW5lRG9taWNpbGVEb21wdGVyRG9uYXRldXJEb25qb25Eb25uZXJEb3BhbWluZURvcnRvaXJEb3J1cmVEb3NhZ2VEb3NldXJEb3NzaWVyRG90YXRpb25Eb3VhbmllckRvdWJsZURvdWNldXJEb3V0ZXJEb3llbkRyYWdvbkRyYXBlckRyZXNzZXJEcmliYmxlckRyb2l0dXJlRHVwZXJpZUR1cGxleGVEdXJhYmxlRHVyY2lyRHluYXN0aWVFL2Jsb3VpckUvY2FydGVyRS9jaGFycGVFL2NoZWxsZUUvY2xhaXJlckUvY2xpcHNlRS9jbG9yZUUvY2x1c2VFL2NvbGVFL2Nvbm9taWVFL2NvcmNlRS9jb3V0ZXJFL2NyYXNlckUvY3JlL21lckUvY3JpdmFpbkUvY3JvdUUvY3VtZUUvY3VyZXVpbEUvZGlmaWVyRS9kdXF1ZXJFZmZhY2VyRWZmZWN0aWZFZmZpZ2llRWZmb3J0RWZmcmF5ZXJFZmZ1c2lvbkUvZ2FsaXNlckUvZ2FyZXJFL2plY3RlckUvbGFib3JlckUvbGFyZ2lyRS9sZWN0cm9uRS9sZS9nYW50RS9sZS9waGFudEUvbGUtdmVFL2xpZ2libGVFL2xpdGlzbWVFL2xvZ2VFL2x1Y2lkZXJFL2x1ZGVyRW1iYWxsZXJFbWJlbGxpckVtYnJ5b25FL21lcmF1ZGVFL21pc3Npb25FbW1lbmVyRS9tb3Rpb25FL21vdXZvaXJFbXBlcmV1ckVtcGxveWVyRW1wb3J0ZXJFbXByaXNlRS9tdWxzaW9uRW5jYWRyZXJFbmNoZS1yZUVuY2xhdmVFbmNvY2hlRW5kaWd1ZXJFbmRvc3NlckVuZHJvaXRFbmR1aXJlRS9uZXJnaWVFbmZhbmNlRW5mZXJtZXJFbmZvdWlyRW5nYWdlckVuZ2luRW5nbG9iZXJFL25pZ21lRW5qYW1iZXJFbmpldUVubGV2ZXJFbm5lbWlFbm51eWV1eEVucmljaGlyRW5yb2JhZ2VFbnNlaWduZUVudGFzc2VyRW50ZW5kcmVFbnRpZXJFbnRvdXJlckVudHJhdmVyRS9udW1lL3JlckVudmFoaXJFbnZpYWJsZUVudm95ZXJFbnp5bWVFL29saWVuRS9wYWlzc2lyRS9wYXJnbmVFL3BhdGFudEUvcGF1bGVFL3BpY2VyaWVFL3BpZGUvbWllRS9waWVyRS9waWxvZ3VlRS9waW5lRS9waXNvZGVFL3BpdGFwaGVFL3BvcXVlRS9wcmV1dmVFL3Byb3V2ZXJFL3B1aXNhbnRFL3F1ZXJyZUUvcXVpcGVFL3JpZ2VyRS9yb3Npb25FcnJldXJFL3J1cHRpb25Fc2NhbGllckVzcGFkb25Fc3BlLWNlRXNwaWUtZ2xlRXNwb2lyRXNwcml0RXNxdWl2ZXJFc3NheWVyRXNzZW5jZUVzc2lldUVzc29yZXJFc3RpbWVFc3RvbWFjRXN0cmFkZUUvdGFnZS1yZUUvdGFsZXJFL3RhbmNoZUUvdGF0aXF1ZUUvdGVpbmRyZUUvdGVuZG9pckUvdGVybmVsRS90aGFub2xFL3RoaXF1ZUV0aG5pZUUvdGlyZXJFL3RvZmZlckUvdG9pbGVFL3Rvbm5hbnRFL3RvdXJkaXJFL3RyYW5nZUUvdHJvaXRFL3R1ZGVFdXBob3JpZUUvdmFsdWVyRS92YXNpb25FL3ZlbnRhaWxFL3ZpZGVuY2VFL3ZpdGVyRS92b2x1dGlmRS92b3F1ZXJFeGFjdEV4YWdlL3JlckV4YXVjZXJFeGNlbGxlckV4Y2l0YW50RXhjbHVzaWZFeGN1c2VFeGUvY3V0ZXJFeGVtcGxlRXhlcmNlckV4aGFsZXJFeGhvcnRlckV4aWdlbmNlRXhpbGVyRXhpc3RlckV4b3RpcXVlRXhwZS9kaWVyRXhwbG9yZXJFeHBvc2VyRXhwcmltZXJFeHF1aXNFeHRlbnNpZkV4dHJhaXJlRXh1bHRlckZhYmxlRmFidWxldXhGYWNldHRlRmFjaWxlRmFjdHVyZUZhaWJsaXJGYWxhaXNlRmFtZXV4RmFtaWxsZUZhcmNldXJGYXJmZWx1RmFyaW5lRmFyb3VjaGVGYXNjaW5lckZhdGFsRmF0aWd1ZUZhdWNvbkZhdXRpZkZhdmV1ckZhdm9yaUZlL2JyaWxlRmUvY29uZGVyRmUvZGUvcmVyRmUvbGluRmVtbWVGZS9tdXJGZW5kb2lyRmUvb2RhbEZlcm1lckZlL3JvY2VGZXJ2ZXVyRmVzdGl2YWxGZXVpbGxlRmV1dHJlRmUvdnJpZXJGaWFzY29GaWNlbGVyRmljdGlmRmlkZS1sZUZpZ3VyZUZpbGF0dXJlRmlsZXRhZ2VGaWxpZS1yZUZpbGxldWxGaWxtZXJGaWxvdUZpbHRyZXJGaW5hbmNlckZpbmlyRmlvbGVGaXJtZUZpc3N1cmVGaXhlckZsYWlyZXJGbGFtbWVGbGFzcXVlRmxhdHRldXJGbGUvYXVGbGUtY2hlRmxldXJGbGV4aW9uRmxvY29uRmxvcmVGbHVjdHVlckZsdWlkZUZsdXZpYWxGb2xpZUZvbmRlcmllRm9uZ2libGVGb250YWluZUZvcmNlckZvcmdlcm9uRm9ybXVsZXJGb3J0dW5lRm9zc2lsZUZvdWRyZUZvdWdlLXJlRm91aWxsZXJGb3VsdXJlRm91cm1pRnJhZ2lsZUZyYWlzZUZyYW5jaGlyRnJhcHBlckZyYXlldXJGcmUvZ2F0ZUZyZWluZXJGcmVsb25GcmUvbWlyRnJlL25lL3NpZUZyZS1yZUZyaWFibGVGcmljdGlvbkZyaXNzb25Gcml2b2xlRnJvaWRGcm9tYWdlRnJvbnRhbEZyb3R0ZXJGcnVpdEZ1Z2l0aWZGdWl0ZUZ1cmV1ckZ1cmlldXhGdXJ0aWZGdXNpb25GdXR1ckdhZ25lckdhbGF4aWVHYWxlcmllR2FtYmFkZXJHYXJhbnRpckdhcmRpZW5HYXJuaXJHYXJyaWd1ZUdhemVsbGVHYXpvbkdlL2FudEdlL2xhdGluZUdlL2x1bGVHZW5kYXJtZUdlL25lL3JhbEdlL25pZUdlbm91R2VudGlsR2Uvb2xvZ2llR2Uvb21lLXRyZUdlL3Jhbml1bUdlcm1lR2VzdHVlbEdleXNlckdpYmllckdpY2xlckdpcmFmZUdpdnJlR2xhY2VHbGFpdmVHbGlzc2VyR2xvYmVHbG9pcmVHbG9yaWV1eEdvbGZldXJHb21tZUdvbmZsZXJHb3JnZUdvcmlsbGVHb3Vkcm9uR291ZmZyZUdvdWxvdEdvdXBpbGxlR291cm1hbmRHb3V0dGVHcmFkdWVsR3JhZmZpdGlHcmFpbmVHcmFuZEdyYXBwaW5HcmF0dWl0R3JhdmlyR3JlbmF0R3JpZmZ1cmVHcmlsbGVyR3JpbXBlckdyb2duZXJHcm9uZGVyR3JvdHRlR3JvdXBlR3J1Z2VyR3J1dGllckdydXllLXJlR3VlL3BhcmRHdWVycmllckd1aWRlR3VpbWF1dmVHdWl0YXJlR3VzdGF0aWZHeW1uYXN0ZUd5cm9zdGF0SGFiaXR1ZGVIYWNob2lySGFsdGVIYW1lYXVIYW5nYXJIYW5uZXRvbkhhcmljb3RIYXJtb25pZUhhcnBvbkhhc2FyZEhlL2xpdW1IZS9tYXRvbWVIZXJiZUhlL3Jpc3Nvbkhlcm1pbmVIZS9yb25IZS9zaXRlckhldXJldXhIaWJlcm5lckhpYm91SGlsYXJhbnRIaXN0b2lyZUhpdmVySG9tYXJkSG9tbWFnZUhvbW9nZS1uZUhvbm5ldXJIb25vcmVySG9udGV1eEhvcmRlSG9yaXpvbkhvcmxvZ2VIb3Jtb25lSG9ycmlibGVIb3VsZXV4SG91c3NlSHVibG90SHVpbGV1eEh1bWFpbkh1bWJsZUh1bWlkZUh1bW91ckh1cmxlckh5ZHJvbWVsSHlnaWUtbmVIeW1uZUh5cG5vc2VJZHlsbGVJZ25vcmVySWd1YW5lSWxsaWNpdGVJbGx1c2lvbkltYWdlSW1iaWJlckltaXRlckltbWVuc2VJbW1vYmlsZUltbXVhYmxlSW1wYWN0SW1wZS9yaWFsSW1wbG9yZXJJbXBvc2VySW1wcmltZXJJbXB1dGVySW5jYXJuZXJJbmNlbmRpZUluY2lkZW50SW5jbGluZXJJbmNvbG9yZUluZGV4ZXJJbmRpY2VJbmR1Y3RpZkluZS9kaXRJbmVwdGllSW5leGFjdEluZmluaUluZmxpZ2VySW5mb3JtZXJJbmZ1c2lvbkluZ2UvcmVySW5oYWxlckluaGliZXJJbmplY3RlckluanVyZUlubm9jZW50SW5vY3VsZXJJbm9uZGVySW5zY3JpcmVJbnNlY3RlSW5zaWduZUluc29saXRlSW5zcGlyZXJJbnN0aW5jdEluc3VsdGVySW50YWN0SW50ZW5zZUludGltZUludHJpZ3VlSW50dWl0aWZJbnV0aWxlSW52YXNpb25JbnZlbnRlckludml0ZXJJbnZvcXVlcklyb25pcXVlSXJyYWRpZXJJcnJlL2VsSXJyaXRlcklzb2xlckl2b2lyZUl2cmVzc2VKYWd1YXJKYWlsbGlySmFtYmVKYW52aWVySmFyZGluSmF1Z2VySmF1bmVKYXZlbG90SmV0YWJsZUpldG9uSmV1ZGlKZXVuZXNzZUpvaW5kcmVKb25jaGVySm9uZ2xlckpvdWV1ckpvdWlzc2lmSm91cm5hbEpvdmlhbEpveWF1Sm95ZXV4SnViaWxlckp1Z2VtZW50SnVuaW9ySnVwb25KdXJpc3RlSnVzdGljZUp1dGV1eEp1dmUvbmlsZUtheWFrS2ltb25vS2lvc3F1ZUxhYmVsTGFiaWFsTGFib3VyZXJMYWNlL3JlckxhY3Rvc2VMYWd1bmVMYWluZUxhaXNzZXJMYWl0aWVyTGFtYmVhdUxhbWVsbGVMYW1wZUxhbmNldXJMYW5nYWdlTGFudGVybmVMYXBpbkxhcmdldXJMYXJtZUxhdXJpZXJMYXZhYm9MYXZvaXJMZWN0dXJlTGUvZ2FsTGUvZ2VyTGUvZ3VtZUxlc3NpdmVMZXR0cmVMZXZpZXJMZXhpcXVlTGUvemFyZExpYXNzZUxpYmUvcmVyTGlicmVMaWNlbmNlTGljb3JuZUxpZS1nZUxpZS12cmVMaWdhdHVyZUxpZ290ZXJMaWd1ZUxpbWVyTGltaXRlTGltb25hZGVMaW1waWRlTGluZS9haXJlTGluZ290TGlvbmNlYXVMaXF1aWRlTGlzaWUtcmVMaXN0ZXJMaXRoaXVtTGl0aWdlTGl0dG9yYWxMaXZyZXVyTG9naXF1ZUxvaW50YWluTG9pc2lyTG9tYnJpY0xvdGVyaWVMb3VlckxvdXJkTG91dHJlTG91dmVMb3lhbEx1YmllTHVjaWRlTHVjcmF0aWZMdWV1ckx1Z3VicmVMdWlzYW50THVtaWUtcmVMdW5haXJlTHVuZGlMdXJvbkx1dHRlckx1eHVldXhNYWNoaW5lTWFnYXNpbk1hZ2VudGFNYWdpcXVlTWFpZ3JlTWFpbGxvbk1haW50aWVuTWFpcmllTWFpc29uTWFqb3Jlck1hbGF4ZXJNYWxlL2ZpY2VNYWxoZXVyTWFsaWNlTWFsbGV0dGVNYW1tb3V0aE1hbmRhdGVyTWFuaWFibGVNYW5xdWFudE1hbnRlYXVNYW51ZWxNYXJhdGhvbk1hcmJyZU1hcmNoYW5kTWFyZGlNYXJpdGltZU1hcnF1ZXVyTWFycm9uTWFydGVsZXJNYXNjb3R0ZU1hc3NpZk1hdGUvcmllbE1hdGllLXJlTWF0cmFxdWVNYXVkaXJlTWF1c3NhZGVNYXV2ZU1heGltYWxNZS9jaGFudE1lL2Nvbm51TWUvZGFpbGxlTWUvZGVjaW5NZS9kaXRlck1lL2R1c2VNZWlsbGV1ck1lL2xhbmdlTWUvbG9kaWVNZW1icmVNZS9tb2lyZU1lbmFjZXJNZW5lck1lbmhpck1lbnNvbmdlTWVudG9yTWVyY3JlZGlNZS9yaXRlTWVybGVNZXNzYWdlck1lc3VyZU1lL3RhbE1lL3RlL29yZU1lL3Rob2RlTWUvdGllck1ldWJsZU1pYXVsZXJNaWNyb2JlTWlldHRlTWlnbm9uTWlncmVyTWlsaWV1TWlsbGlvbk1pbWlxdWVNaW5jZU1pbmUvcmFsTWluaW1hbE1pbm9yZXJNaW51dGVNaXJhY2xlTWlyb2l0ZXJNaXNzaWxlTWl4dGVNb2JpbGVNb2Rlcm5lTW9lbGxldXhNb25kaWFsTW9uaXRldXJNb25uYWllTW9ub3RvbmVNb25zdHJlTW9udGFnbmVNb251bWVudE1vcXVldXJNb3JjZWF1TW9yc3VyZU1vcnRpZXJNb3RldXJNb3RpZk1vdWNoZU1vdWZsZU1vdWxpbk1vdXNzb25Nb3V0b25Nb3V2YW50TXVsdGlwbGVNdW5pdGlvbk11cmFpbGxlTXVyZS1uZU11cm11cmVNdXNjbGVNdXNlL3VtTXVzaWNpZW5NdXRhdGlvbk11dGVyTXV0dWVsTXlyaWFkZU15cnRpbGxlTXlzdGUtcmVNeXRoaXF1ZU5hZ2V1ck5hcHBlTmFycXVvaXNOYXJyZXJOYXRhdGlvbk5hdGlvbk5hdHVyZU5hdWZyYWdlTmF1dGlxdWVOYXZpcmVOZS9idWxldXhOZWN0YXJOZS9mYXN0ZU5lL2dhdGlvbk5lL2dsaWdlck5lL2dvY2llck5laWdlTmVydmV1eE5ldHRveWVyTmV1cm9uZU5ldXRyb25OZXZldU5pY2hlTmlja2VsTml0cmF0ZU5pdmVhdU5vYmxlTm9jaWZOb2N0dXJuZU5vaXJjZXVyTm9pc2V0dGVOb21hZGVOb21icmV1eE5vbW1lck5vcm1hdGlmTm90YWJsZU5vdGlmaWVyTm90b2lyZU5vdXJyaXJOb3V2ZWF1Tm92YXRldXJOb3ZlbWJyZU5vdmljZU51YWdlTnVhbmNlck51aXJlTnVpc2libGVOdW1lL3JvTnVwdGlhbE51cXVlTnV0cml0aWZPYmUvaXJPYmplY3RpZk9ibGlnZXJPYnNjdXJPYnNlcnZlck9ic3RhY2xlT2J0ZW5pck9idHVyZXJPY2Nhc2lvbk9jY3VwZXJPY2UvYW5PY3RvYnJlT2N0cm95ZXJPY3R1cGxlck9jdWxhaXJlT2RldXJPZG9yYW50T2ZmZW5zZXJPZmZpY2llck9mZnJpck9naXZlT2lzZWF1T2lzaWxsb25PbGZhY3RpZk9saXZpZXJPbWJyYWdlT21ldHRyZU9uY3R1ZXV4T25kdWxlck9uZS9yZXV4T25pcmlxdWVPcGFsZU9wYXF1ZU9wZS9yZXJPcGluaW9uT3Bwb3J0dW5PcHByaW1lck9wdGVyT3B0aXF1ZU9yYWdldXhPcmFuZ2VPcmJpdGVPcmRvbm5lck9yZWlsbGVPcmdhbmVPcmd1ZWlsT3JpZmljZU9ybmVtZW50T3JxdWVPcnRpZU9zY2lsbGVyT3Ntb3NlT3NzYXR1cmVPdGFyaWVPdXJhZ2FuT3Vyc29uT3V0aWxPdXRyYWdlck91dnJhZ2VPdmF0aW9uT3h5ZGVPeHlnZS1uZU96b25lUGFpc2libGVQYWxhY2VQYWxtYXJlLXNQYWxvdXJkZVBhbHBlclBhbmFjaGVQYW5kYVBhbmdvbGluUGFuaXF1ZXJQYW5uZWF1UGFub3JhbWFQYW50YWxvblBhcGF5ZVBhcGllclBhcG90ZXJQYXB5cnVzUGFyYWRveGVQYXJjZWxsZVBhcmVzc2VQYXJmdW1lclBhcmxlclBhcm9sZVBhcnJhaW5QYXJzZW1lclBhcnRhZ2VyUGFydXJlUGFydmVuaXJQYXNzaW9uUGFzdGUtcXVlUGF0ZXJuZWxQYXRpZW5jZVBhdHJvblBhdmlsbG9uUGF2b2lzZXJQYXllclBheXNhZ2VQZWlnbmVQZWludHJlUGVsYWdlUGUvbGljYW5QZWxsZVBlbG91c2VQZWx1Y2hlUGVuZHVsZVBlL25lL3RyZXJQZS9uaWJsZVBlbnNpZlBlL251cmllUGUvcGl0ZVBlL3BsdW1QZXJkcml4UGVyZm9yZXJQZS9yaW9kZVBlcm11dGVyUGVycGxleGVQZXJzaWxQZXJ0ZVBlc2VyUGUvdGFsZVBldGl0UGUvdHJpclBldXBsZVBoYXJhb25QaG9iaWVQaG9xdWVQaG90b25QaHJhc2VQaHlzaXF1ZVBpYW5vUGljdHVyYWxQaWUtY2VQaWVycmVQaWV1dnJlUGlsb3RlUGluY2VhdVBpcGV0dGVQaXF1ZXJQaXJvZ3VlUGlzY2luZVBpc3RvblBpdm90ZXJQaXhlbFBpenphUGxhY2FyZFBsYWZvbmRQbGFpc2lyUGxhbmVyUGxhcXVlUGxhc3Ryb25QbGF0ZWF1UGxldXJlclBsZXh1c1BsaWFnZVBsb21iUGxvbmdlclBsdWllUGx1bWFnZVBvY2hldHRlUG9lL3NpZVBvZS10ZVBvaW50ZVBvaXJpZXJQb2lzc29uUG9pdnJlUG9sYWlyZVBvbGljaWVyUG9sbGVuUG9seWdvbmVQb21tYWRlUG9tcGllclBvbmN0dWVsUG9uZGUvcmVyUG9uZXlQb3J0aXF1ZVBvc2l0aW9uUG9zc2UvZGVyUG9zdHVyZVBvdGFnZXJQb3RlYXVQb3Rpb25Qb3VjZVBvdWxhaW5Qb3Vtb25Qb3VycHJlUG91c3NpblBvdXZvaXJQcmFpcmllUHJhdGlxdWVQcmUvY2lldXhQcmUvZGlyZVByZS9maXhlUHJlL2x1ZGVQcmUvbm9tUHJlL3NlbmNlUHJlL3RleHRlUHJlL3ZvaXJQcmltaXRpZlByaW5jZVByaXNvblByaXZlclByb2JsZS1tZVByb2NlL2RlclByb2RpZ2VQcm9mb25kUHJvZ3JlLXNQcm9pZVByb2pldGVyUHJvbG9ndWVQcm9tZW5lclByb3ByZVByb3NwZS1yZVByb3RlL2dlclByb3Vlc3NlUHJvdmVyYmVQcnVkZW5jZVBydW5lYXVQc3ljaG9zZVB1YmxpY1B1Y2Vyb25QdWlzZXJQdWxwZVB1bHNhclB1bmFpc2VQdW5pdGlmUHVwaXRyZVB1cmlmaWVyUHV6emxlUHlyYW1pZGVRdWFzYXJRdWVyZWxsZVF1ZXN0aW9uUXVpZS90dWRlUXVpdHRlclF1b3RpZW50UmFjaW5lUmFjb250ZXJSYWRpZXV4UmFnb25kaW5SYWlkZXVyUmFpc2luUmFsZW50aXJSYWxsb25nZVJhbWFzc2VyUmFwaWRlUmFzYWdlUmF0aXNzZXJSYXZhZ2VyUmF2aW5SYXlvbm5lclJlL2FjdGlmUmUvYWdpclJlL2FsaXNlclJlL2FuaW1lclJlY2V2b2lyUmUvY2l0ZXJSZS9jbGFtZXJSZS9jb2x0ZXJSZWNydXRlclJlY3VsZXJSZWN5Y2xlclJlL2RpZ2VyUmVkb3V0ZXJSZWZhaXJlUmUvZmxleGVSZS9mb3JtZXJSZWZyYWluUmVmdWdlUmUvZ2FsaWVuUmUvZ2lvblJlL2dsYWdlUmUvZ3VsaWVyUmUvaXRlL3JlclJlamV0ZXJSZWpvdWVyUmVsYXRpZlJlbGV2ZXJSZWxpZWZSZW1hcnF1ZVJlbWUtZGVSZW1pc2VSZW1vbnRlclJlbXBsaXJSZW11ZXJSZW5hcmRSZW5mb3J0UmVuaWZsZXJSZW5vbmNlclJlbnRyZXJSZW52b2lSZXBsaWVyUmVwb3J0ZXJSZXByaXNlUmVwdGlsZVJlcXVpblJlL3NlcnZlUmUvc2luZXV4UmUvc291ZHJlUmVzcGVjdFJlc3RlclJlL3N1bHRhdFJlL3RhYmxpclJldGVuaXJSZS90aWN1bGVSZXRvbWJlclJldHJhY2VyUmUvdW5pb25SZS91c3NpclJldmFuY2hlUmV2aXZyZVJlL3ZvbHRlUmUvdnVsc2lmUmljaGVzc2VSaWRlYXVSaWV1clJpZ2lkZVJpZ29sZXJSaW5jZXJSaXBvc3RlclJpc2libGVSaXNxdWVSaXR1ZWxSaXZhbFJpdmllLXJlUm9jaGV1eFJvbWFuY2VSb21wcmVSb25jZVJvbmRpblJvc2VhdVJvc2llclJvdGF0aWZSb3RvclJvdHVsZVJvdWdlUm91aWxsZVJvdWxlYXVSb3V0aW5lUm95YXVtZVJ1YmFuUnViaXNSdWNoZVJ1ZWxsZVJ1Z3VldXhSdWluZXJSdWlzc2VhdVJ1c2VyUnVzdGlxdWVSeXRobWVTYWJsZXJTYWJvdGVyU2FicmVTYWNvY2hlU2FmYXJpU2FnZXNzZVNhaXNpclNhbGFkZVNhbGl2ZVNhbG9uU2FsdWVyU2FtZWRpU2FuY3Rpb25TYW5nbGllclNhcmNhc21lU2FyZGluZVNhdHVyZXJTYXVncmVudVNhdW1vblNhdXRlclNhdXZhZ2VTYXZhbnRTYXZvbm5lclNjYWxwZWxTY2FuZGFsZVNjZS9sZS9yYXRTY2UvbmFyaW9TY2VwdHJlU2NoZS9tYVNjaWVuY2VTY2luZGVyU2NvcmVTY3J1dGluU2N1bHB0ZXJTZS9hbmNlU2UvY2FibGVTZS9jaGVyU2Vjb3VlclNlL2NyZS90ZXJTZS9kYXRpZlNlL2R1aXJlU2VpZ25ldXJTZS9qb3VyU2UvbGVjdGlmU2VtYWluZVNlbWJsZXJTZW1lbmNlU2UvbWluYWxTZS9uYXRldXJTZW5zaWJsZVNlbnRlbmNlU2UvcGFyZXJTZS9xdWVuY2VTZXJlaW5TZXJnZW50U2UvcmlldXhTZXJydXJlU2UvcnVtU2VydmljZVNlL3NhbWVTZS92aXJTZXZyYWdlU2V4dHVwbGVTaWRlL3JhbFNpZS1jbGVTaWUvZ2VyU2lmZmxlclNpZ2xlU2lnbmFsU2lsZW5jZVNpbGljaXVtU2ltcGxlU2luY2UtcmVTaW5pc3RyZVNpcGhvblNpcm9wU2lzbWlxdWVTaXR1ZXJTa2llclNvY2lhbFNvY2xlU29kaXVtU29pZ25ldXhTb2xkYXRTb2xlaWxTb2xpdHVkZVNvbHVibGVTb21icmVTb21tZWlsU29tbm9sZXJTb25kZVNvbmdldXJTb25uZXR0ZVNvbm9yZVNvcmNpZXJTb3J0aXJTb3NpZVNvdHRpc2VTb3VjaWV1eFNvdWR1cmVTb3VmZmxlU291bGV2ZXJTb3VwYXBlU291cmNlU291dGlyZXJTb3V2ZW5pclNwYWNpZXV4U3BhdGlhbFNwZS9jaWFsU3BoZS1yZVNwaXJhbFN0YWJsZVN0YXRpb25TdGVybnVtU3RpbXVsdXNTdGlwdWxlclN0cmljdFN0dWRpZXV4U3R1cGV1clN0eWxpc3RlU3VibGltZVN1YnN0cmF0U3VidGlsU3VidmVuaXJTdWNjZS1zU3VjcmVTdWZmaXhlU3VnZ2UvcmVyU3VpdmV1clN1bGZhdGVTdXBlcmJlU3VwcGxpZXJTdXJmYWNlU3VyaWNhdGVTdXJtZW5lclN1cnByaXNlU3Vyc2F1dFN1cnZpZVN1c3BlY3RTeWxsYWJlU3ltYm9sZVN5bWUvdHJpZVN5bmFwc2VTeW50YXhlU3lzdGUtbWVUYWJhY1RhYmxpZXJUYWN0aWxlVGFpbGxlclRhbGVudFRhbGlzbWFuVGFsb25uZXJUYW1ib3VyVGFtaXNlclRhbmdpYmxlVGFwaXNUYXF1aW5lclRhcmRlclRhcmlmVGFydGluZVRhc3NlVGF0YW1pVGF0b3VhZ2VUYXVwZVRhdXJlYXVUYXhlclRlL21vaW5UZW1wb3JlbFRlbmFpbGxlVGVuZHJlVGVuZXVyVGVuaXJUZW5zaW9uVGVybWluZXJUZXJuZVRlcnJpYmxlVGUvdGluZVRleHRlVGhlLW1lVGhlL29yaWVUaGUvcmFwaWVUaG9yYXhUaWJpYVRpZS1kZVRpbWlkZVRpcmVsaXJlVGlyb2lyVGlzc3VUaXRhbmVUaXRyZVRpdHViZXJUb2JvZ2dhblRvbGUvcmFudFRvbWF0ZVRvbmlxdWVUb25uZWF1VG9wb255bWVUb3JjaGVUb3JkcmVUb3JuYWRlVG9ycGlsbGVUb3JyZW50VG9yc2VUb3J0dWVUb3RlbVRvdWNoZXJUb3VybmFnZVRvdXNzZXJUb3hpbmVUcmFjdGlvblRyYWZpY1RyYWdpcXVlVHJhaGlyVHJhaW5UcmFuY2hlclRyYXZhaWxUcmUtZmxlVHJlbXBlclRyZS9zb3JUcmV1aWxUcmlhZ2VUcmlidW5hbFRyaWNvdGVyVHJpbG9naWVUcmlvbXBoZVRyaXBsZXJUcml0dXJlclRyaXZpYWxUcm9tYm9uZVRyb25jVHJvcGljYWxUcm91cGVhdVR1aWxlVHVsaXBlVHVtdWx0ZVR1bm5lbFR1cmJpbmVUdXRldXJUdXRveWVyVHV5YXVUeW1wYW5UeXBob25UeXBpcXVlVHlyYW5VYnVlc3F1ZVVsdGltZVVsdHJhc29uVW5hbmltZVVuaWZpZXJVbmlvblVuaXF1ZVVuaXRhaXJlVW5pdmVyc1VyYW5pdW1VcmJhaW5VcnRpY2FudFVzYWdlVXNpbmVVc3VlbFVzdXJlVXRpbGVVdG9waWVWYWNhcm1lVmFjY2luVmFnYWJvbmRWYWd1ZVZhaWxsYW50VmFpbmNyZVZhaXNzZWF1VmFsYWJsZVZhbGlzZVZhbGxvblZhbHZlVmFtcGlyZVZhbmlsbGVWYXBldXJWYXJpZXJWYXNldXhWYXNzYWxWYXN0ZVZlY3RldXJWZWRldHRlVmUvZ2UvdGFsVmUvaGljdWxlVmVpbmFyZFZlL2xvY2VWZW5kcmVkaVZlL25lL3JlclZlbmdlclZlbmltZXV4VmVudG91c2VWZXJkdXJlVmUvcmluVmVybmlyVmVycm91VmVyc2VyVmVydHVWZXN0b25WZS90ZS9yYW5WZS90dXN0ZVZleGFudFZleGVyVmlhZHVjVmlhbmRlVmljdG9pcmVWaWRhbmdlVmlkZS9vVmlnbmV0dGVWaWd1ZXVyVmlsYWluVmlsbGFnZVZpbmFpZ3JlVmlvbG9uVmlwZS1yZVZpcmVtZW50VmlydHVvc2VWaXJ1c1Zpc2FnZVZpc2V1clZpc2lvblZpc3F1ZXV4VmlzdWVsVml0YWxWaXRlc3NlVml0aWNvbGVWaXRyaW5lVml2YWNlVml2aXBhcmVWb2NhdGlvblZvZ3VlclZvaWxlVm9pc2luVm9pdHVyZVZvbGFpbGxlVm9sY2FuVm9sdGlnZXJWb2x1bWVWb3JhY2VWb3J0ZXhWb3RlclZvdWxvaXJWb3lhZ2VWb3llbGxlV2Fnb25YZS9ub25ZYWNodFplLWJyZVplL25pdGhaZXN0ZVpvb2xvZ2llXCI7XG5sZXQgd29yZGxpc3QgPSBudWxsO1xuY29uc3QgbG9va3VwID0ge307XG5mdW5jdGlvbiBkcm9wRGlhY3JpdGljKHdvcmQpIHtcbiAgICBsb2dnZXIuY2hlY2tOb3JtYWxpemUoKTtcbiAgICByZXR1cm4gdG9VdGY4U3RyaW5nKEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0b1V0ZjhCeXRlcyh3b3JkLm5vcm1hbGl6ZShcIk5GRFwiKS50b0xvd2VyQ2FzZSgpKSwgKGMpID0+IHtcbiAgICAgICAgcmV0dXJuICgoYyA+PSA2NSAmJiBjIDw9IDkwKSB8fCAoYyA+PSA5NyAmJiBjIDw9IDEyMykpO1xuICAgIH0pKTtcbn1cbmZ1bmN0aW9uIGV4cGFuZCh3b3JkKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gW107XG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0b1V0ZjhCeXRlcyh3b3JkKSwgKGMpID0+IHtcbiAgICAgICAgLy8gQWN1dGUgYWNjZW50XG4gICAgICAgIGlmIChjID09PSA0Nykge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goMjA0KTtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKDEyOSk7XG4gICAgICAgICAgICAvLyBHcmF2ZSBhY2NlbnRcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjID09PSA0NSkge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goMjA0KTtcbiAgICAgICAgICAgIG91dHB1dC5wdXNoKDEyOCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXQucHVzaChjKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0b1V0ZjhTdHJpbmcob3V0cHV0KTtcbn1cbmZ1bmN0aW9uIGxvYWRXb3JkcyhsYW5nKSB7XG4gICAgaWYgKHdvcmRsaXN0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JkbGlzdCA9IHdvcmRzLnJlcGxhY2UoLyhbQS1aXSkvZywgXCIgJDFcIikudG9Mb3dlckNhc2UoKS5zdWJzdHJpbmcoMSkuc3BsaXQoXCIgXCIpLm1hcCgodykgPT4gZXhwYW5kKHcpKTtcbiAgICB3b3JkbGlzdC5mb3JFYWNoKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgICAgICBsb29rdXBbZHJvcERpYWNyaXRpYyh3b3JkKV0gPSBpbmRleDtcbiAgICB9KTtcbiAgICAvLyBWZXJpZnkgdGhlIGNvbXB1dGVkIGxpc3QgbWF0Y2hlcyB0aGUgb2ZmaWNpYWwgbGlzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChXb3JkbGlzdC5jaGVjayhsYW5nKSAhPT0gXCIweDUxZGViN2FlMDA5MTQ5ZGM2MWE2YmQxOGE5MThlYjdhYzc4ZDI3NzU3MjZjNjhlNTk4YjkyZDAwMjUxOWIwNDVcIikge1xuICAgICAgICB3b3JkbGlzdCA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJJUDM5IFdvcmRsaXN0IGZvciBmciAoRnJlbmNoKSBGQUlMRURcIik7XG4gICAgfVxufVxuY2xhc3MgTGFuZ0ZyIGV4dGVuZHMgV29yZGxpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImZyXCIpO1xuICAgIH1cbiAgICBnZXRXb3JkKGluZGV4KSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0W2luZGV4XTtcbiAgICB9XG4gICAgZ2V0V29yZEluZGV4KHdvcmQpIHtcbiAgICAgICAgbG9hZFdvcmRzKHRoaXMpO1xuICAgICAgICByZXR1cm4gbG9va3VwW2Ryb3BEaWFjcml0aWMod29yZCldO1xuICAgIH1cbn1cbmNvbnN0IGxhbmdGciA9IG5ldyBMYW5nRnIoKTtcbldvcmRsaXN0LnJlZ2lzdGVyKGxhbmdGcik7XG5leHBvcnQgeyBsYW5nRnIgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhbmctZnIuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBXb3JkbGlzdCB9IGZyb20gXCIuL3dvcmRsaXN0XCI7XG5jb25zdCB3b3JkcyA9IFwiQWJhY29BYmJhZ2xpb0FiYmluYXRvQWJldGVBYmlzc29BYm9saXJlQWJyYXNpdm9BYnJvZ2F0b0FjY2FkZXJlQWNjZW5ub0FjY3VzYXRvQWNldG9uZUFjaGlsbGVBY2lkb0FjcXVhQWNyZUFjcmlsaWNvQWNyb2JhdGFBY3V0b0FkYWdpb0FkZGViaXRvQWRkb21lQWRlZ3VhdG9BZGVyaXJlQWRpcGVBZG90dGFyZUFkdWxhcmVBZmZhYmlsZUFmZmV0dG9BZmZpc3NvQWZmcmFudG9BZm9yaXNtYUFmb3NvQWZyaWNhbm9BZ2F2ZUFnZW50ZUFnZXZvbGVBZ2dhbmNpb0FnaXJlQWdpdGFyZUFnb25pc21vQWdyaWNvbG9BZ3J1bWV0b0FndXp6b0FsYWJhcmRhQWxhdG9BbGJhdHJvQWxiZXJhdG9BbGJvQWxidW1lQWxjZUFsY29saWNvQWxldHRvbmVBbGZhQWxnZWJyYUFsaWFudGVBbGliaUFsaW1lbnRvQWxsYWdhdG9BbGxlZ3JvQWxsaWV2b0FsbG9kb2xhQWxsdXNpdm9BbG1lbm9BbG9nZW5vQWxwYWNhQWxwZXN0cmVBbHRhbGVuYUFsdGVybm9BbHRpY2Npb0FsdHJvdmVBbHVubm9BbHZlb2xvQWx6YXJlQW1hbGdhbWFBbWFuaXRhQW1hcmVuYUFtYml0b0FtYnJhdG9BbWViYUFtZXJpY2FBbWV0aXN0YUFtaWNvQW1tYXNzb0FtbWVuZGFBbW1pcmFyZUFtbW9uaXRvQW1vcmVBbXBpb0FtcGxpYXJlQW11bGV0b0FuYWNhcmRvQW5hZ3JhZmVBbmFsaXN0YUFuYXJjaGlhQW5hdHJhQW5jYUFuY2VsbGFBbmNvcmFBbmRhcmVBbmRyZWFBbmVsbG9BbmdlbG9BbmdvbGFyZUFuZ3VzdG9BbmltYUFubmVnYXJlQW5uaWRhdG9Bbm5vQW5udW5jaW9Bbm9uaW1vQW50aWNpcG9BbnppQXBhdGljb0FwZXJ0dXJhQXBvZGVBcHBhcmlyZUFwcGV0aXRvQXBwb2dnaW9BcHByb2RvQXBwdW50b0FwcmlsZUFyYWJpY2FBcmFjaGlkZUFyYWdvc3RhQXJhbGRpY2FBcmFuY2lvQXJhdHVyYUFyYXp6b0FyYml0cm9BcmNoaXZpb0FyZGl0b0FyZW5pbGVBcmdlbnRvQXJnaW5lQXJndXRvQXJpYUFybW9uaWFBcm5lc2VBcnJlZGF0b0FycmluZ2FBcnJvc3RvQXJzZW5pY29BcnNvQXJ0ZWZpY2VBcnppbGxvQXNjaXV0dG9Bc2NvbHRvQXNlcHNpQXNldHRpY29Bc2ZhbHRvQXNpbm9Bc29sYUFzcGlyYXRvQXNwcm9Bc3NhZ2dpb0Fzc2VBc3NvbHV0b0Fzc3VyZG9Bc3RhQXN0ZW51dG9Bc3RpY2VBc3RyYXR0b0F0YXZpY29BdGVpc21vQXRvbWljb0F0b25vQXR0ZXNhQXR0aXZhcmVBdHRvcm5vQXR0cml0b0F0dHVhbGVBdXNpbGlvQXVzdHJpYUF1dGlzdGFBdXRvbm9tb0F1dHVubm9BdmFuemF0b0F2ZXJlQXZ2ZW5pcmVBdnZpc29BdnZvbGdlcmVBemlvbmVBem90b0F6emltb0F6enVycm9CYWJlbGVCYWNjYW5vQmFjaW5vQmFjb0JhZGVzc2FCYWRpbGF0YUJhZ25hdG9CYWl0YUJhbGNvbmVCYWxkb0JhbGVuYUJhbGxhdGFCYWx6YW5vQmFtYmlub0JhbmRpcmVCYXJhb25kYUJhcmJhcm9CYXJjYUJhcml0b25vQmFybHVtZUJhcm9jY29CYXNpbGljb0Jhc3NvQmF0b3N0YUJhdHR1dG9CYXVsZUJhdmFCYXZvc2FCZWNjb0JlZmZhQmVsZ2lvQmVsdmFCZW5kYUJlbmV2b2xlQmVuaWdub0JlbnppbmFCZXJlQmVybGluYUJldGFCaWJpdGFCaWNpQmlkb25lQmlmaWRvQmlnYUJpbGFuY2lhQmltYm9CaW5vY29sb0Jpb2xvZ29CaXBlZGVCaXBvbGFyZUJpcmJhbnRlQmlycmFCaXNjb3R0b0Jpc2VzdG9CaXNub25ub0Jpc29udGVCaXN0dXJpQml6emFycm9CbGFuZG9CbGF0dGFCb2xsaXRvQm9uaWZpY29Cb3Jkb0Jvc2NvQm90YW5pY29Cb3R0aW5vQm96em9sb0JyYWNjaW9CcmFkaXBvQnJhbWFCcmFuY2FCcmF2dXJhQnJldGVsbGFCcmV2ZXR0b0JyZXp6YUJyaWdsaWFCcmlsbGFudGVCcmluZGFyZUJyb2Njb2xvQnJvZG9Ccm9uemluYUJydWxsb0JydW5vQnViYm9uZUJ1Y2FCdWRpbm9CdWZmb25lQnVpb0J1bGJvQnVvbm9CdXJsb25lQnVycmFzY2FCdXNzb2xhQnVzdGFDYWRldHRvQ2FkdWNvQ2FsYW1hcm9DYWxjb2xvQ2FsZXNzZUNhbGlicm9DYWxtb0NhbG9yaWFDYW1idXNhQ2FtZXJhdGFDYW1pY2lhQ2FtbWlub0NhbW9sYUNhbXBhbGVDYW5hcGFDYW5kZWxhQ2FuZUNhbmlub0Nhbm90dG9DYW50aW5hQ2FwYWNlQ2FwZWxsb0NhcGl0b2xvQ2Fwb2dpcm9DYXBwZXJvQ2FwcmFDYXBzdWxhQ2FyYXBhY2VDYXJjYXNzYUNhcmRvQ2FyaXNtYUNhcm92YW5hQ2FycmV0dG9DYXJ0b2xpbmFDYXNhY2Npb0Nhc2NhdGFDYXNlcm1hQ2Fzb0Nhc3NvbmVDYXN0ZWxsb0Nhc3VhbGVDYXRhc3RhQ2F0ZW5hQ2F0cmFtZUNhdXRvQ2F2aWxsb0NlZGliaWxlQ2VkcmF0YUNlZmFsb0NlbGVicmVDZWxsdWxhcmVDZW5hQ2Vub25lQ2VudGVzaW1vQ2VyYW1pY2FDZXJjYXJlQ2VydG9DZXJ1bWVDZXJ2ZWxsb0Nlc29pYUNlc3BvQ2V0b0NoZWxhQ2hpYXJvQ2hpY2NhQ2hpZWRlcmVDaGltZXJhQ2hpbmFDaGlydXJnb0NoaXRhcnJhQ2lhb0NpY2xpc21vQ2lmcmFyZUNpZ25vQ2lsaW5kcm9DaW90dG9sb0NpcmNhQ2lycm9zaUNpdHJpY29DaXR0YWRpbm9DaXVmZm9DaXZldHRhQ2l2aWxlQ2xhc3NpY29DbGluaWNhQ2xvcm9Db2Njb0NvZGFyZG9Db2RpY2VDb2VyZW50ZUNvZ25vbWVDb2xsYXJlQ29sbWF0b0NvbG9yZUNvbHBvc29Db2x0aXZhdG9Db2x6YUNvbWFDb21ldGFDb21tYW5kb0NvbW9kb0NvbXB1dGVyQ29tdW5lQ29uY2lzb0NvbmR1cnJlQ29uZmVybWFDb25nZWxhcmVDb25pdWdlQ29ubmVzc29Db25vc2NlcmVDb25zdW1vQ29udGludW9Db252ZWdub0NvcGVydG9Db3Bpb25lQ29wcGlhQ29wcmljYXBvQ29yYXp6YUNvcmRhdGFDb3JpY2F0b0Nvcm5pY2VDb3JvbGxhQ29ycG9Db3JyZWRvQ29yc2lhQ29ydGVzZUNvc21pY29Db3N0YW50ZUNvdHR1cmFDb3ZhdG9DcmF0ZXJlQ3JhdmF0dGFDcmVhdG9DcmVkZXJlQ3JlbW9zb0NyZXNjaXRhQ3JldGFDcmljZXRvQ3JpbmFsZUNyaXNpQ3JpdGljb0Nyb2NlQ3JvbmFjYUNyb3N0YXRhQ3J1Y2lhbGVDcnVzY2FDdWNpcmVDdWN1bG9DdWdpbm9DdWxsYXRvQ3Vwb2xhQ3VyYXRvcmVDdXJzb3JlQ3Vydm9DdXNjaW5vQ3VzdG9kZURhZG9EYWlub0RhbG1hdGFEYW1lcmlub0RhbmllbGFEYW5ub3NvRGFuemFyZURhdGF0b0RhdmFudGlEYXZ2ZXJvRGVidXR0b0RlY2VubmlvRGVjaXNvRGVjbGlub0RlY29sbG9EZWNyZXRvRGVkaWNhdG9EZWZpbml0b0RlZm9ybWVEZWdub0RlbGVnYXJlRGVsZmlub0RlbGlyaW9EZWx0YURlbWVuemFEZW5vdGF0b0RlbnRyb0RlcG9zaXRvRGVyYXBhdGFEZXJpdmFyZURlcm9nYURlc2NyaXR0b0Rlc2VydG9EZXNpZGVyaW9EZXN1bWVyZURldGVyc2l2b0Rldm90b0RpYW1ldHJvRGljZW1icmVEaWVkcm9EaWZlc29EaWZmdXNvRGlnZXJpcmVEaWdpdGFsZURpbHV2aW9EaW5hbWljb0Rpbm5hbnppRGlwaW50b0RpcGxvbWFEaXBvbG9EaXJhZGFyZURpcmVEaXJvdHRvRGlydXBvRGlzYWdpb0Rpc2NyZXRvRGlzZmFyZURpc2dlbG9EaXNwb3N0b0Rpc3RhbnphRGlzdW1hbm9EaXRvRGl2YW5vRGl2ZWx0b0RpdmlkZXJlRGl2b3JhdG9Eb2Jsb25lRG9jZW50ZURvZ2FuYWxlRG9nbWFEb2xjZURvbWF0b0RvbWVuaWNhRG9taW5hcmVEb25kb2xvRG9ub0Rvcm1pcmVEb3RlRG90dG9yZURvdnV0b0RvenppbmFEcmFnb0RydWlkb0R1YmJpb0R1Yml0YXJlRHVjYWxlRHVuYUR1b21vRHVwbGljZUR1cmF0dXJvRWJhbm9FY2Nlc3NvRWNjb0VjbGlzc2lFY29ub21pYUVkZXJhRWRpY29sYUVkaWxlRWRpdG9yaWFFZHVjYXJlRWdlbW9uaWFFZ2xpRWdvaXNtb0VncmVnaW9FbGFib3JhdG9FbGFyZ2lyZUVsZWdhbnRlRWxlbmNhdG9FbGV0dG9FbGV2YXJlRWxmaWNvRWxpY2FFbG1vRWxzYUVsdXNvRW1hbmF0b0VtYmxlbWFFbWVzc29FbWlyb0Vtb3Rpdm9FbW96aW9uZUVtcGlyaWNvRW11bG9FbmRlbWljb0VuZHVyb0VuZXJnaWFFbmZhc2lFbm90ZWNhRW50cmFyZUVuemltYUVwYXRpdGVFcGlsb2dvRXBpc29kaW9FcG9jYWxlRXBwdXJlRXF1YXRvcmVFcmFyaW9FcmJhRXJib3NvRXJlZGVFcmVtaXRhRXJpZ2VyZUVybWV0aWNvRXJvZUVyb3Npdm9FcnJhbnRlRXNhZ29ub0VzYW1lRXNhbmltZUVzYXVkaXJlRXNjYUVzZW1waW9Fc2VyY2l0b0VzaWJpdG9Fc2lnZW50ZUVzaXN0ZXJlRXNpdG9Fc29mYWdvRXNvcnRhdG9Fc29zb0VzcGFuc29Fc3ByZXNzb0Vzc2VuemFFc3NvRXN0ZXNvRXN0aW1hcmVFc3RvbmlhRXN0cm9zb0VzdWx0YXJlRXRpbGljb0V0bmljb0V0cnVzY29FdHRvRXVjbGlkZW9FdXJvcGFFdmFzb0V2aWRlbnphRXZpdGF0b0V2b2x1dG9FdnZpdmFGYWJicmljYUZhY2NlbmRhRmFjaGlyb0ZhbGNvRmFtaWdsaWFGYW5hbGVGYW5mYXJhRmFuZ29GYW50YXNtYUZhcmVGYXJmYWxsYUZhcmlub3NvRmFybWFjb0Zhc2NpYUZhc3Rvc29GYXN1bGxvRmF0aWNhcmVGYXRvRmF2b2xvc29GZWJicmVGZWNvbGFGZWRlRmVnYXRvRmVscGFGZWx0cm9GZW1taW5hRmVuZGVyZUZlbm9tZW5vRmVybWVudG9GZXJyb0ZlcnRpbGVGZXNzdXJhRmVzdGl2b0ZldHRhRmV1ZG9GaWFiYUZpZHVjaWFGaWZhRmlndXJhdG9GaWxvRmluYW56YUZpbmVzdHJhRmluaXJlRmlvcmVGaXNjYWxlRmlzaWNvRml1bWVGbGFjb25lRmxhbWVuY29GbGVib0ZsZW1tYUZsb3JpZG9GbHVlbnRlRmx1b3JvRm9iaWNvRm9jYWNjaWFGb2Nvc29Gb2RlcmF0b0ZvZ2xpb0ZvbGF0YUZvbGNsb3JlRm9sZ29yZUZvbmRlbnRlRm9uZXRpY29Gb25pYUZvbnRhbmFGb3JiaXRvRm9yY2hldHRhRm9yZXN0YUZvcm1pY2FGb3JuYWlvRm9yb0ZvcnRlenphRm9yemFyZUZvc2ZhdG9Gb3Nzb0ZyYWNhc3NvRnJhbmFGcmFzc2lub0ZyYXRlbGxvRnJlY2NldHRhRnJlbmF0YUZyZXNjb0ZyaWdvRnJvbGxpbm9Gcm9uZGVGcnVnYWxlRnJ1dHRhRnVjaWxhdGFGdWNzaWFGdWdnZW50ZUZ1bG1pbmVGdWx2b0Z1bWFudGVGdW1ldHRvRnVtb3NvRnVuZUZ1bnppb25lRnVvY29GdXJib0Z1cmdvbmVGdXJvcmVGdXNvRnV0aWxlR2FiYmlhbm9HYWZmZUdhbGF0ZW9HYWxsaW5hR2Fsb3Bwb0dhbWJlcm9HYW1tYUdhcmFuemlhR2FyYm9HYXJvZmFub0dhcnpvbmVHYXNkb3R0b0dhc29saW9HYXN0cmljb0dhdHRvR2F1ZGlvR2F6ZWJvR2F6emVsbGFHZWNvR2VsYXRpbmFHZWxzb0dlbWVsbG9HZW1tYXRvR2VuZUdlbml0b3JlR2VubmFpb0dlbm90aXBvR2VyZ29HaGVwYXJkb0doaWFjY2lvR2hpc2FHaWFsbG9HaWxkYUdpbmVwcm9HaW9jYXJlR2lvaWVsbG9HaW9ybm9HaW92ZUdpcmF0b0dpcm9uZUdpdHRhdGFHaXVkaXppb0dpdXJhdG9HaXVzdG9HbG9idWxvR2x1dGluZUdub21vR29iYmFHb2xmR29taXRvR29tbW9uZUdvbmZpb0dvbm5hR292ZXJub0dyYWNpbGVHcmFkb0dyYWZpY29HcmFtbW9HcmFuZGVHcmF0dGFyZUdyYXZvc29HcmF6aWFHcmVjYUdyZWdnZUdyaWZvbmVHcmlnaW9HcmluemFHcm90dGFHcnVwcG9HdWFkYWdub0d1YWlvR3VhbnRvR3VhcmRhcmVHdWZvR3VpZGFyZUliZXJuYXRvSWNvbmFJZGVudGljb0lkaWxsaW9JZG9sb0lkcmFJZHJpY29JZHJvZ2Vub0lnaWVuZUlnbmFyb0lnbm9yYXRvSWxhcmVJbGxlc29JbGxvZ2ljb0lsbHVkZXJlSW1iYWxsb0ltYmV2dXRvSW1ib2Njb0ltYnV0b0ltbWFuZUltbWVyc29JbW1vbGF0b0ltcGFjY29JbXBldG9JbXBpZWdvSW1wb3J0b0ltcHJvbnRhSW5hbGFyZUluYXJjYXJlSW5hdHRpdm9JbmNhbnRvSW5jZW5kaW9JbmNoaW5vSW5jaXNpdm9JbmNsdXNvSW5jb250cm9JbmNyb2Npb0luY3Vib0luZGFnaW5lSW5kaWFJbmRvbGVJbmVkaXRvSW5mYXR0aUluZmlsYXJlSW5mbGl0dG9JbmdhZ2dpb0luZ2Vnbm9JbmdsZXNlSW5nb3Jkb0luZ3Jvc3NvSW5uZXNjb0lub2RvcmVJbm9sdHJhcmVJbm9uZGF0b0luc2Fub0luc2V0dG9JbnNpZW1lSW5zb25uaWFJbnN1bGluYUludGFzYXRvSW50ZXJvSW50b25hY29JbnR1aXRvSW51bWlkaXJlSW52YWxpZG9JbnZlY2VJbnZpdG9JcGVyYm9sZUlwbm90aWNvSXBvdGVzaUlwcGljYUlyaWRlSXJsYW5kYUlyb25pY29JcnJpZ2F0b0lycm9yYXJlSXNvbGF0b0lzb3RvcG9Jc3Rlcmljb0lzdGl0dXRvSXN0cmljZUl0YWxpYUl0ZXJhcmVMYWJicm9MYWJpcmludG9MYWNjYUxhY2VyYXRvTGFjcmltYUxhY3VuYUxhZGRvdmVMYWdvTGFtcG9MYW5jZXR0YUxhbnRlcm5hTGFyZG9zb0xhcmdhTGFyaW5nZUxhc3RyYUxhdGVuemFMYXRpbm9MYXR0dWdhTGF2YWduYUxhdm9yb0xlZ2FsZUxlZ2dlcm9MZW1ib0xlbnRlenphTGVuemFMZW9uZUxlcHJlTGVzaXZvTGVzc2F0b0xlc3RvTGV0dGVyYWxlTGV2YUxldmlnYXRvTGliZXJvTGlkb0xpZXZpdG9MaWxsYUxpbWF0dXJhTGltaXRhcmVMaW1waWRvTGluZWFyZUxpbmd1YUxpcXVpZG9MaXJhTGlyaWNhTGlzY2FMaXRlTGl0aWdpb0xpdnJlYUxvY2FuZGFMb2RlTG9naWNhTG9tYmFyZUxvbmRyYUxvbmdldm9Mb3F1YWNlTG9yZW56b0xvdG9Mb3R0ZXJpYUx1Y2VMdWNpZGF0b0x1bWFjYUx1bWlub3NvTHVuZ29MdXBvTHVwcG9sb0x1c2luZ2FMdXNzb0x1dHRvTWFjYWJyb01hY2NoaW5hTWFjZXJvTWFjaW5hdG9NYWRhbWFNYWdpY29NYWdsaWFNYWduZXRlTWFncm9NYWlvbGljYU1hbGFmZWRlTWFsZ3JhZG9NYWxpbnRlc29NYWxzYW5vTWFsdG9NYWx1bW9yZU1hbmFNYW5jaWFNYW5kb3JsYU1hbmdpYXJlTWFuaWZlc3RvTWFubmFyb01hbm92cmFNYW5zYXJkYU1hbnRpZGVNYW51YnJpb01hcHBhTWFyYXRvbmFNYXJjaXJlTWFyZXR0YU1hcm1vTWFyc3VwaW9NYXNjaGVyYU1hc3NhaWFNYXN0aW5vTWF0ZXJhc3NvTWF0cmljb2xhTWF0dG9uZU1hdHVyb01henVyY2FNZWFuZHJvTWVjY2FuaWNvTWVjZW5hdGVNZWRlc2ltb01lZGl0YXJlTWVnYU1lbGFzc2FNZWxpc01lbG9kaWFNZW5pbmdlTWVub01lbnNvbGFNZXJjdXJpb01lcmVuZGFNZXJsb01lc2NoaW5vTWVzZU1lc3NlcmVNZXN0b2xvTWV0YWxsb01ldG9kb01ldHRlcmVNaWFnb2xhcmVNaWNhTWljZWxpb01pY2hlbGVNaWNyb2JvTWlkb2xsb01pZWxlTWlnbGlvcmVNaWxhbm9NaWxpdGVNaW1vc2FNaW5lcmFsZU1pbmlNaW5vcmVNaXJpbm9NaXJ0aWxsb01pc2NlbGFNaXNzaXZhTWlzdG9NaXN1cmFyZU1pdGV6emFNaXRpZ2FyZU1pdHJhTWl0dGVudGVNbmVtb25pY29Nb2RlbGxvTW9kaWZpY2FNb2R1bG9Nb2dhbm9Nb2dpb01vbGVNb2xvc3NvTW9uYXN0ZXJvTW9uY29Nb25kaW5hTW9uZXRhcmlvTW9uaWxlTW9ub3Rvbm9Nb25zb25lTW9udGF0b01vbnZpc29Nb3JhTW9yZGVyZU1vcnNpY2F0b01vc3Ryb01vdGl2YXRvTW90b3NlZ2FNb3R0b01vdmVuemFNb3ZpbWVudG9Nb3p6b011Y2NhTXVjb3NhTXVmZmFNdWdoZXR0b011Z25haW9NdWxhdHRvTXVsaW5lbGxvTXVsdGlwbG9NdW1taWFNdW50b011b3ZlcmVNdXJhbGVNdXNhTXVzY29sb011c2ljYU11dGV2b2xlTXV0b05hYmFiYm9OYWZ0YU5hbm9tZXRyb05hcmNpc29OYXJpY2VOYXJyYXRvTmFzY2VyZU5hc3RyYXJlTmF0dXJhbGVOYXV0aWNhTmF2aWdsaW9OZWJ1bG9zYU5lY3Jvc2lOZWdhdGl2b05lZ296aW9OZW1tZW5vTmVvZml0YU5lcmV0dG9OZXJ2b05lc3N1bm9OZXR0dW5vTmV1dHJhbGVOZXZlTmV2cm90aWNvTmljY2hpYU5pbmZhTml0aWRvTm9iaWxlTm9jaXZvTm9kb05vbWVOb21pbmFOb3JkaWNvTm9ybWFsZU5vcnZlZ2VzZU5vc3RyYW5vTm90YXJlTm90aXppYU5vdHR1cm5vTm92ZWxsYU51Y2xlb051bGxhTnVtZXJvTnVvdm9OdXRyaXJlTnV2b2xhTnV6aWFsZU9hc2lPYmJlZGlyZU9iYmxpZ29PYmVsaXNjb09ibGlvT2JvbG9PYnNvbGV0b09jY2FzaW9uZU9jY2hpb09jY2lkZW50ZU9jY29ycmVyZU9jY3VsdGFyZU9jcmFPY3VsYXRvT2RpZXJub09kb3JhcmVPZmZlcnRhT2ZmcmlyZU9mZnVzY2F0b09nZ2V0dG9PZ2dpT2dudW5vT2xhbmRlc2VPbGZhdHRvT2xpYXRvT2xpdmFPbG9ncmFtbWFPbHRyZU9tYWdnaW9PbWJlbGljb09tYnJhT21lZ2FPbWlzc2lvbmVPbmRvc29PbmVyZU9uaWNlT25uaXZvcm9Pbm9yZXZvbGVPbnRhT3BlcmF0b09waW5pb25lT3Bwb3N0b09yYWNvbG9PcmFmb09yZGluZU9yZWNjaGlub09yZWZpY2VPcmZhbm9Pcmdhbmljb09yaWdpbmVPcml6em9udGVPcm1hT3JtZWdnaW9Pcm5hdGl2b09yb2xvZ2lvT3JyZW5kb09ycmliaWxlT3J0ZW5zaWFPcnRpY2FPcnphdGFPcnpvT3NhcmVPc2N1cmFyZU9zbW9zaU9zcGVkYWxlT3NwaXRlT3NzYU9zc2lkYXJlT3N0YWNvbG9Pc3RlT3RpdGVPdHJlT3R0YWdvbm9PdHRpbW9PdHRvYnJlT3ZhbGVPdmVzdE92aW5vT3ZpcGFyb092b2NpdG9PdnVucXVlT3Z2aWFyZU96aW9QYWNjaGV0dG9QYWNlUGFjaWZpY29QYWRlbGxhUGFkcm9uZVBhZXNlUGFnYVBhZ2luYVBhbGF6emluYVBhbGVzYXJlUGFsbGlkb1BhbG9QYWx1ZGVQYW5kb3JvUGFubmVsbG9QYW9sb1Bhb25henpvUGFwcmljYVBhcmFib2xhUGFyY2VsbGFQYXJlcmVQYXJnb2xvUGFyaVBhcmxhdG9QYXJvbGFQYXJ0aXJlUGFydmVuemFQYXJ6aWFsZVBhc3Npdm9QYXN0aWNjYVBhdGFjY2FQYXRvbG9naWFQYXR0dW1lUGF2b25lUGVjY2F0b1BlZGFsYXJlUGVkb25hbGVQZWdnaW9QZWxvc29QZW5hcmVQZW5kaWNlUGVuaXNvbGFQZW5udXRvUGVub21icmFQZW5zYXJlUGVudG9sYVBlcGVQZXBpdGFQZXJiZW5lUGVyY29yc29QZXJkb25hdG9QZXJmb3JhcmVQZXJnYW1lbmFQZXJpb2RvUGVybWVzc29QZXJub1BlcnBsZXNzb1BlcnN1YXNvUGVydHVnaW9QZXJ2YXNvUGVzYXRvcmVQZXNpc3RhUGVzb1Blc3RpZmVyb1BldGFsb1BldHRpbmVQZXR1bGFudGVQZXp6b1BpYWNlcmVQaWFudGFQaWF0dGlub1BpY2Npbm9QaWNvenphUGllZ2FQaWV0cmFQaWZmZXJvUGlnaWFtYVBpZ29saW9QaWdyb1BpbGFQaWxpZmVyb1BpbGxvbGFQaWxvdGFQaW1wYW50ZVBpbmV0YVBpbm5hUGlub2xvUGlvZ2dpYVBpb21ib1BpcmFtaWRlUGlyZXRpY29QaXJpdGVQaXJvbGlzaVBpdG9uZVBpenppY29QbGFjZWJvUGxhbmFyZVBsYXNtYVBsYXRhbm9QbGVuYXJpb1BvY2hlenphUG9kZXJvc29Qb2Rpc21vUG9lc2lhUG9nZ2lhcmVQb2xlbnRhUG9saWdvbm9Qb2xsaWNlUG9sbW9uaXRlUG9scGV0dGFQb2xzb1BvbHRyb25hUG9sdmVyZVBvbWljZVBvbW9kb3JvUG9udGVQb3BvbG9zb1BvcmZpZG9Qb3Jvc29Qb3Jwb3JhUG9ycmVQb3J0YXRhUG9zYVBvc2l0aXZvUG9zc2Vzc29Qb3N0dWxhdG9Qb3Rhc3Npb1BvdGVyZVByYW56b1ByYXNzaVByYXRpY2FQcmVjbHVzb1ByZWRpY2FQcmVmaXNzb1ByZWdpYXRvUHJlbGlldm9QcmVtZXJlUHJlbm90YXJlUHJlcGFyYXRvUHJlc2VuemFQcmV0ZXN0b1ByZXZhbHNvUHJpbWFQcmluY2lwZVByaXZhdG9Qcm9ibGVtYVByb2N1cmFQcm9kdXJyZVByb2Z1bW9Qcm9nZXR0b1Byb2x1bmdhUHJvbWVzc2FQcm9ub21lUHJvcG9zdGFQcm9yb2dhUHJvdGVzb1Byb3ZhUHJ1ZGVudGVQcnVnbmFQcnVyaXRvUHNpY2hlUHViYmxpY29QdWRpY2FQdWdpbGF0b1B1Z25vUHVsY2VQdWxpdG9QdWxzYW50ZVB1bnRhcmVQdXBhenpvUHVwaWxsYVB1cm9RdWFkcm9RdWFsY29zYVF1YXNpUXVlcmVsYVF1b3RhUmFjY29sdG9SYWRkb3BwaW9SYWRpY2FsZVJhZHVuYXRvUmFmZmljYVJhZ2F6em9SYWdpb25lUmFnbm9SYW1hcnJvUmFtaW5nb1JhbW9SYW5kYWdpb1JhbnRvbGFyZVJhcGF0b1JhcGluYVJhcHByZXNvUmFzYXR1cmFSYXNjaGlhdG9SYXNlbnRlUmFzc2VnbmFSYXN0cmVsbG9SYXRhUmF2dmVkdXRvUmVhbGVSZWNlcGlyZVJlY2ludG9SZWNsdXRhUmVjb25kaXRvUmVjdXBlcm9SZWRkaXRvUmVkaW1lcmVSZWdhbGF0b1JlZ2lzdHJvUmVnb2xhUmVncmVzc29SZWxhemlvbmVSZW1hcmVSZW1vdG9SZW5uYVJlcGxpY2FSZXByaW1lcmVSZXB1dGFyZVJlc2FSZXNpZGVudGVSZXNwb25zb1Jlc3RhdXJvUmV0ZVJldGluYVJldG9yaWNhUmV0dGlmaWNhUmV2b2NhdG9SaWFzc3VudG9SaWJhZGlyZVJpYmVsbGVSaWJyZXp6b1JpY2FyaWNhUmljY29SaWNldmVyZVJpY2ljbGF0b1JpY29yZG9SaWNyZWR1dG9SaWRpY29sb1JpZHVycmVSaWZhc2FyZVJpZmxlc3NvUmlmb3JtYVJpZnVnaW9SaWdhcmVSaWdldHRhdG9SaWdoZWxsb1JpbGFzc2F0b1JpbGV2YXRvUmltYW5lcmVSaW1iYWx6b1JpbWVkaW9SaW1vcmNoaW9SaW5hc2NpdGFSaW5jYXJvUmluZm9yem9SaW5ub3ZvUmlub21hdG9SaW5zYXZpdG9SaW50b2Njb1JpbnVuY2lhUmludmVuaXJlUmlwYXJhdG9SaXBldHV0b1JpcGllbm9SaXBvcnRhcmVSaXByZXNhUmlwdWxpcmVSaXNhdGFSaXNjaGlvUmlzZXJ2YVJpc2liaWxlUmlzb1Jpc3BldHRvUmlzdG9yb1Jpc3VsdGF0b1Jpc3ZvbHRvUml0YXJkb1JpdGVnbm9SaXRtaWNvUml0cm92b1JpdW5pb25lUml2YVJpdmVyc29SaXZpbmNpdGFSaXZvbHRvUml6b21hUm9iYVJvYm90aWNvUm9idXN0b1JvY2NpYVJvY29Sb2RhZ2dpb1JvZGVyZVJvZGl0b3JlUm9naXRvUm9sbGlvUm9tYW50aWNvUm9tcGVyZVJvbnppb1Jvc29sYXJlUm9zcG9Sb3RhbnRlUm90b25kb1JvdHVsYVJvdmVzY2lvUnViaXp6b1J1YnJpY2FSdWdhUnVsbGlub1J1bWluZVJ1bW9yb3NvUnVvbG9SdXBlUnVzc2FyZVJ1c3RpY29TYWJhdG9TYWJiaWFyZVNhYm90YXRvU2Fnb21hU2FsYXNzb1NhbGRhdHVyYVNhbGdlbW1hU2FsaXZhcmVTYWxtb25lU2Fsb25lU2FsdGFyZVNhbHV0b1NhbHZvU2FwZXJlU2FwaWRvU2Fwb3JpdG9TYXJhY2Vub1NhcmNhc21vU2FydG9TYXNzb3NvU2F0ZWxsaXRlU2F0aXJhU2F0b2xsb1NhdHVybm9TYXZhbmFTYXZpb1NhemlhdG9TYmFkaWdsaW9TYmFsem9TYmFuY2F0b1NiYXJyYVNiYXR0ZXJlU2JhdmFyZVNiZW5kYXJlU2JpcmNpYXJlU2Jsb2NjYXRvU2JvY2NpYXRvU2JyaW5hcmVTYnJ1ZmZvbmVTYnVmZmFyZVNjYWJyb3NvU2NhZGVuemFTY2FsYVNjYW1iaWFyZVNjYW5kYWxvU2NhcG9sYVNjYXJzb1NjYXRlbmFyZVNjYXZhdG9TY2VsdG9TY2VuaWNvU2NldHRyb1NjaGVkYVNjaGllbmFTY2lhcnBhU2NpZW56YVNjaW5kZXJlU2NpcHBvU2Npcm9wcG9TY2l2b2xvU2NsZXJhcmVTY29kZWxsYVNjb2xwaXRvU2NvbXBhcnRvU2NvbmZvcnRvU2NvcHJpcmVTY29ydGFTY29zc29uZVNjb3p6ZXNlU2NyaWJhU2Nyb2xsYXJlU2NydXRpbmlvU2N1ZGVyaWFTY3VsdG9yZVNjdW9sYVNjdXJvU2N1c2FyZVNkZWJpdGFyZVNkb2dhbmFyZVNlY2NhdHVyYVNlY29uZG9TZWRhbm9TZWdnaW9sYVNlZ25hbGF0b1NlZ3JlZ2F0b1NlZ3VpdG9TZWxjaWF0b1NlbGV0dGl2b1NlbGxhU2VsdmFnZ2lvU2VtYWZvcm9TZW1icmFyZVNlbWVTZW1pbmF0b1NlbXByZVNlbnNvU2VudGlyZVNlcG9sdG9TZXF1ZW56YVNlcmF0YVNlcmJhdG9TZXJlbm9TZXJpb1NlcnBlbnRlU2VycmFnbGlvU2VydmlyZVNlc3RpbmFTZXRvbGFTZXR0aW1hbmFTZmFjZWxvU2ZhbGRhcmVTZmFtYXRvU2Zhcnpvc29TZmF0aWNhdG9TZmVyYVNmaWRhU2ZpbGF0b1NmaW5nZVNmb2NhdG9TZm9kZXJhcmVTZm9nb1Nmb2x0aXJlU2ZvcnphdG9TZnJhdHRvU2ZydXR0YXRvU2Z1Z2dpdG9TZnVtYXJlU2Z1c29TZ2FiZWxsb1NnYXJiYXRvU2dvbmZpYXJlU2dvcmJpb1NncmFzc2F0b1NndWFyZG9TaWJpbG9TaWNjb21lU2llcnJhU2lnbGFTaWdub3JlU2lsZW56aW9TaWxsYWJhU2ltYm9sb1NpbXBhdGljb1NpbXVsYXRvU2luZm9uaWFTaW5nb2xvU2luaXN0cm9TaW5vU2ludGVzaVNpbnVzb2lkZVNpcGFyaW9TaXNtYVNpc3RvbGVTaXR1YXRvU2xpdHRhU2xvZ2F0dXJhU2xvdmVub1NtYXJyaXRvU21lbW9yYXRvU21lbnRpdG9TbWVyYWxkb1NtaWx6b1Ntb250YXJlU21vdHRhdG9TbXVzc2F0b1NuZWxsaXJlU25lcnZhdG9Tbm9kb1NvYmJhbHpvU29icmlvU29jY29yc29Tb2NpYWxlU29kYWxlU29mZml0dG9Tb2dub1NvbGRhdG9Tb2xlbm5lU29saWRvU29sbGF6em9Tb2xvU29sdWJpbGVTb2x2ZW50ZVNvbWF0aWNvU29tbWFTb25kYVNvbmV0dG9Tb25uaWZlcm9Tb3BpcmVTb3BwZXNvU29wcmFTb3JnZXJlU29ycGFzc29Tb3JyaXNvU29yc29Tb3J0ZWdnaW9Tb3J2b2xhdG9Tb3NwaXJvU29zdGFTb3R0aWxlU3BhZGFTcGFsbGFTcGFyZ2VyZVNwYXRvbGFTcGF2ZW50b1NwYXp6b2xhU3BlY2llU3BlZGlyZVNwZWduZXJlU3BlbGF0dXJhU3BlcmFuemFTcGVzc29yZVNwZXR0cmFsZVNwZXp6YXRvU3BpYVNwaWdvbG9zb1NwaWxsYXRvU3Bpbm9zb1NwaXJhbGVTcGxlbmRpZG9TcG9ydGl2b1Nwb3NvU3ByYW5nYVNwcmVjYXJlU3Byb25hdG9TcHJ1enpvU3B1bnRpbm9TcXVpbGxvU3JhZGljYXJlU3JvdG9sYXRvU3RhYmlsZVN0YWNjb1N0YWZmYVN0YWduYXJlU3RhbXBhdG9TdGFudGlvU3Rhcm51dG9TdGFzZXJhU3RhdHV0b1N0ZWxvU3RlcHBhU3RlcnpvU3RpbGV0dG9TdGltYVN0aXJwZVN0aXZhbGVTdGl6em9zb1N0b25hdG9TdG9yaWNvU3RyYXBwb1N0cmVnYXRvU3RyaWR1bG9TdHJvenphcmVTdHJ1dHRvU3R1Y2NhcmVTdHVmb1N0dXBlbmRvU3ViZW50cm9TdWNjb3NvU3Vkb3JlU3VnZ2VyaXRvU3Vnb1N1bHRhbm9TdW9uYXJlU3VwZXJib1N1cHBvcnRvU3VyZ2VsYXRvU3Vycm9nYXRvU3Vzc3Vycm9TdXR1cmFTdmFnYXJlU3ZlZGVzZVN2ZWdsaW9TdmVsYXJlU3ZlbnV0b1N2ZXppYVN2aWx1cHBvU3Zpc3RhU3ZpenplcmFTdm9sdGFTdnVvdGFyZVRhYmFjY29UYWJ1bGF0b1RhY2NpYXJlVGFjaXR1cm5vVGFsZVRhbGlzbWFub1RhbXBvbmVUYW5uaW5vVGFyYVRhcmRpdm9UYXJnYXRvVGFyaWZmYVRhcnBhcmVUYXJ0YXJ1Z2FUYXN0b1RhdHRpY29UYXZlcm5hVGF2b2xhdGFUYXp6YVRlY2FUZWNuaWNvVGVsZWZvbm9UZW1lcmFyaW9UZW1wb1RlbXV0b1RlbmRvbmVUZW5lcm9UZW5zaW9uZVRlbnRhY29sb1Rlb3JlbWFUZXJtZVRlcnJhenpvVGVyemV0dG9UZXNpVGVzc2VyYXRvVGVzdGF0b1RldHJvVGV0dG9pYVRpZmFyZVRpZ2VsbGFUaW1icm9UaW50b1RpcGljb1RpcG9ncmFmb1RpcmFnZ2lvVGlyb1RpdGFuaW9UaXRvbG9UaXR1YmFudGVUaXppb1RpenpvbmVUb2NjYXJlVG9sbGVyYXJlVG9sdG9Ub21ib2xhVG9tb1RvbmZvVG9uc2lsbGFUb3BhemlvVG9wb2xvZ2lhVG9wcGFUb3JiYVRvcm5hcmVUb3Jyb25lVG9ydG9yYVRvc2Nhbm9Ub3NzaXJlVG9zdGF0dXJhVG90YW5vVHJhYm9jY29UcmFjaGVhVHJhZmlsYVRyYWdlZGlhVHJhbGNpb1RyYW1vbnRvVHJhbnNpdG9UcmFwYW5vVHJhcnJlVHJhc2xvY29UcmF0dGF0b1RyYXZlVHJlY2NpYVRyZW1vbGlvVHJlc3BvbG9UcmlidXRvVHJpY2hlY29Ucmlmb2dsaW9UcmlsbG9UcmluY2VhVHJpb1RyaXN0ZXp6YVRyaXR1cmF0b1RyaXZlbGxhVHJvbWJhVHJvbm9Ucm9wcG9Ucm90dG9sYVRyb3ZhcmVUcnVjY2F0b1R1YmF0dXJhVHVmZmF0b1R1bGlwYW5vVHVtdWx0b1R1bmlzaWFUdXJiYXJlVHVyY2hpbm9UdXRhVHV0ZWxhVWJpY2F0b1VjY2VsbG9VY2Npc29yZVVkaXJlVWRpdGl2b1VmZmFVZmZpY2lvVWd1YWxlVWxpc3NlVWx0aW1hdG9VbWFub1VtaWxlVW1vcmlzbW9VbmNpbmV0dG9VbmdlcmVVbmdoZXJlc2VVbmljb3Jub1VuaWZpY2F0b1VuaXNvbm9Vbml0YXJpb1VudGVVb3ZvVXB1cGFVcmFnYW5vVXJnZW56YVVybG9Vc2FuemFVc2F0b1VzY2l0b1VzaWdub2xvVXN1cmFpb1V0ZW5zaWxlVXRpbGl6em9VdG9waWFWYWNhbnRlVmFjY2luYXRvVmFnYWJvbmRvVmFnbGlhdG9WYWxhbmdhVmFsZ29WYWxpY29WYWxsZXR0YVZhbG9yb3NvVmFsdXRhcmVWYWx2b2xhVmFtcGF0YVZhbmdhcmVWYW5pdG9zb1Zhbm9WYW50YWdnaW9WYW52ZXJhVmFwb3JlVmFyYW5vVmFyY2F0b1ZhcmlhbnRlVmFzY2FWZWRldHRhVmVkb3ZhVmVkdXRvVmVnZXRhbGVWZWljb2xvVmVsY3JvVmVsaW5hVmVsbHV0b1ZlbG9jZVZlbmF0b1ZlbmRlbW1pYVZlbnRvVmVyYWNlVmVyYmFsZVZlcmdvZ25hVmVyaWZpY2FWZXJvVmVycnVjYVZlcnRpY2FsZVZlc2NpY2FWZXNzaWxsb1Zlc3RhbGVWZXRlcmFub1ZldHJpbmFWZXR1c3RvVmlhbmRhbnRlVmlicmFudGVWaWNlbmRhVmljaGluZ29WaWNpbmFuemFWaWRpbWFyZVZpZ2lsaWFWaWduZXRvVmlnb3JlVmlsZVZpbGxhbm9WaW1pbmlWaW5jaXRvcmVWaW9sYVZpcGVyYVZpcmdvbGFWaXJvbG9nb1ZpcnVsZW50b1Zpc2Nvc29WaXNpb25lVmlzcG9WaXNzdXRvVmlzdXJhVml0YVZpdGVsbG9WaXR0aW1hVml2YW5kYVZpdmlkb1ZpemlhcmVWb2NlVm9nYVZvbGF0aWxlVm9sZXJlVm9scGVWb3JhZ2luZVZ1bGNhbm9aYW1wb2duYVphbm5hWmFwcGF0b1phdHRlcmFaYXZvcnJhWmVmaXJvWmVsYW50ZVplbG9aZW56ZXJvWmVyYmlub1ppYmV0dG9aaW5jb1ppcmNvbmVaaXR0b1pvbGxhWm90aWNvWnVjY2hlcm9adWZvbG9adWx1WnVwcGFcIjtcbmxldCB3b3JkbGlzdCA9IG51bGw7XG5mdW5jdGlvbiBsb2FkV29yZHMobGFuZykge1xuICAgIGlmICh3b3JkbGlzdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd29yZGxpc3QgPSB3b3Jkcy5yZXBsYWNlKC8oW0EtWl0pL2csIFwiICQxXCIpLnRvTG93ZXJDYXNlKCkuc3Vic3RyaW5nKDEpLnNwbGl0KFwiIFwiKTtcbiAgICAvLyBWZXJpZnkgdGhlIGNvbXB1dGVkIGxpc3QgbWF0Y2hlcyB0aGUgb2ZmaWNpYWwgbGlzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChXb3JkbGlzdC5jaGVjayhsYW5nKSAhPT0gXCIweDVjMTM2MmQ4OGZkNGNmNjE0YTk2ZjMyMzQ5NDFkMjlmN2QzN2MwOGM1MjkyZmRlMDNiZjYyYzJkYjZmZjc2MjBcIikge1xuICAgICAgICB3b3JkbGlzdCA9IG51bGw7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkJJUDM5IFdvcmRsaXN0IGZvciBpdCAoSXRhbGlhbikgRkFJTEVEXCIpO1xuICAgIH1cbn1cbmNsYXNzIExhbmdJdCBleHRlbmRzIFdvcmRsaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJpdFwiKTtcbiAgICB9XG4gICAgZ2V0V29yZChpbmRleCkge1xuICAgICAgICBsb2FkV29yZHModGhpcyk7XG4gICAgICAgIHJldHVybiB3b3JkbGlzdFtpbmRleF07XG4gICAgfVxuICAgIGdldFdvcmRJbmRleCh3b3JkKSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0LmluZGV4T2Yod29yZCk7XG4gICAgfVxufVxuY29uc3QgbGFuZ0l0ID0gbmV3IExhbmdJdCgpO1xuV29yZGxpc3QucmVnaXN0ZXIobGFuZ0l0KTtcbmV4cG9ydCB7IGxhbmdJdCB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy1pdC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IGhleGxpZnkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYnl0ZXNcIjtcbmltcG9ydCB7IHRvVXRmOEJ5dGVzLCB0b1V0ZjhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgbG9nZ2VyLCBXb3JkbGlzdCB9IGZyb20gXCIuL3dvcmRsaXN0XCI7XG5jb25zdCBkYXRhID0gW1xuICAgIC8vIDQta2FuYSB3b3Jkc1xuICAgIFwiQVFSQVNSQUdCQUdVQUlSQUhCQWdoQVVSQWRCQWRjQW5vQU1FQUZCQUZDQktGQlFSQlNGQkNYQkNEQkNIQkdGQkVRQnBCQnBRQklrQkhOQmVPQmdGQlZDQmhCQmhOQm1PQm1SQmlIQmlGQlVGQlpEQnZGQnNYQmtGQmxjQmpZQndEQk1CQlRCQlRSQldCQldYWGFRWGFSWFFXWFNSWENGWFlCWHBIWE9RWEhSWGhSWHVSWG1YWGJSWGxYWHdEWFRSWHJDWFdRWFdHYUJXYUtjYVlnYXNGYWRRYWxtYU1CYWNBS2FSS0tCS0tYS0tqS1FSS0RSS0NZS0NSS0lES2VWS0hjS2xYS2pIS3JZTkFITkJXTmFSTktjTklCTklPTm1YTnNYTmRYTm5CTk1CTlJCTnJYTldETldNTkZPUUFCUUFIUUJyUVhCUVhGUWFSUUtYUUtEUUtPUUtGUU5CUU5EUVFnUUNYUUNEUUdCUUdEUUdkUVlYUXBCUXBRUXBIUUxYUUh1UWdCUWhCUWhDUXVGUW1YUWlEUVVGUVpEUXNGUWRSUWtIUWJSUWxPUWxtUVBEUWpEUXdYUU1CUU1EUWNGUVRCUVRIUXJERFhRRE5GREdCREdRREdSRHBGRGhGRG1YRFpYRGJSRE1ZRFJkRFRSRHJYU0FoU0JDU0JyU0dRU0VRU0hCU1ZSU2hZU2hrU3lRU3VGU2lCU2RjU29FU29jU2xtU01CU0ZCU0ZLU0ZOU0ZkU0ZjQ0J5Q2FSQ0tjQ1NCQ1NSQ0NyQ0diQ0VIQ1lYQ3BCQ3BRQ0lCQ0lIQ2VOQ2dCQ2dGQ1ZFQ1ZjQ21rQ213Q1pYQ1pGQ2RSQ2xPQ2xtQ2xGQ2pEQ2pkQ25YQ3dCQ3dYQ2NSQ0ZRQ0ZqR1hoR05oR0RFR0RNR0NER0NIR0lGR2dCR1ZYR1ZFR1ZSR21YR3NYR2RZR29TR2JSR25YR3dYR3dER1dSR0ZOR0ZMR0ZPR0ZkR0ZrRUFCRUJERUJGRVhPRWFCRUtTRU5CRU5ERVlYRUlnRUlrRWdCRWdRRWdIRWhGRXVkRXVGRWlCRWlIRWlGRVpERXZCRXNYRXNGRWRYRWRSRWtGRWJCRWJSRWxGRVBDRWZrRUZOWUFFWUFoWUJOWVFkWURYWVNSWUNFWVlvWWdRWWdSWXVSWW1DWVpUWWRCWWJFWWxYWWpRWVJiWVdScEtYcFFvcFFucFNGcENYcElCcElTcGhOcGRCcGRScGJScGNacEZCcEZOcEZEcEZvcEZyTEFETEJ1TFhRTFhjTGFGTENYTEVoTHBCTHBGTEhYTGVWTGhJTGRITGRSTG9ETGJSTHJYSUFCSUJRSUJDSUJzSUJvSUJNSUJSSVhhSWFSSUtZSUtSSU5CSU51SUNESUdCSUlESUlrSWdSSXhGSXlRSWlISWRSSWJZSWJSSWxISXdSSU1ZSWNSSVJWSVRSSUZCSUZOSUZRT0FCT0FGT0JRT2FGT05CT05NT1FGT1NGT0NET0dCT0VRT3BCT0xYT0lCT0lGT2dRT2dGT3lRT3ljT21YT3NYT2RJT2tIT01FT01rT1dXSEJOSFhOSFhXSE5YSER1SERSSFN1SFNSSEhvSGhrSG1SSGRSSGtRSGxjSGxSSHdCSFdjZ0FFZ0FnZ0FrZ0JOZ0JRZ0JFZ1hPZ1ljZ0xYZ0hqZ3lRZ2lCZ3NGZ2RhZ01ZZ1dTZ0ZRZ0ZFVkJUVlhFVktCVktOVktEVktZVktSVk5CVk5ZVkRCVkR4VlNCVlNSVkNqVkdOVkxYVklGVmhCVmhjVnNYVmRSVmJSVmxSaEJZaEtZaERZaEdTaHhXaG1OaGRhaGRraGJSaGpvaE1YaFRSeEFYeFhTeEtCeE5CeEVReGVOeGVReGhYeHNGeGRieGxIeGpjeEZCeEZOeEZReEZPeEZveU5ZeVlveWJjeU1ZdUJRdUJSdUJydURNdUNvdUhCdWRRdWtrdW9CdWxWdU1YdUZFbUNZbUNSbXBSbWVEbWlNbWpkbVRGbUZRaUFEaUJPaWFSaUtSaU5CaU5SaVNGaUdraUdGaUVSaXBSaUxGaUlGaWhZaWJIaWpCaWpFaU1YaVdCaUZCaUZDVUJRVVhGVWFSVU5EVU5jVU5SVU5GVURCVVNIVUNEVUdCVUdGVUVxVUxOVUxvVUlSVWVFVWVZVWdCVWhGVXVSVWlGVXNYVWRGVWtIVWJCVWpTVWpZVXdYVU1EVWNIVVJkVVRCVXJCVXJYVXJRWkFGWlhaWmFSWktGWk5CWlFGWkNYWkdCWllkWnBCWkxEWklGWkhYWkhOWmVRWlZSWlZGWm1YWmlCWnZGWmRGWmtGWmJIWmJGWndYWmNDWmNSWlJCdkJRdkJHdkJMdkJXdkNvdk1Zc0FGc0JEc2FSc0tGc05Gc0Ryc1NIc1NGc0NYc0NSc0VCc0VIc0Vmc3BCc0xCc0xEc0lnc0lSc2VHc2JSc0ZCc0ZRc0ZTZE5CZFNSZENWZEdIZFlEZEhjZFZiZHlTZHVEZHNYZGxSZHdYZFdZZFdjZFdSa0JNa1hPa2FSa05Ja05Ga1NGa0NGa1lCa3BSa2VOa2dCa2hWa21Ya3NGa2xWa01Ca1dEa0ZOb0JOb2FRb2FGb05Cb05Yb05hb05Fb1NSb0Vyb1lYb1lDb1lib3BSb3BGb21Yb2prb3dYb3JGYkJFYkVJYmRCYmpZbGFSbERFbE1YbEZEaktqalNSakdCallCallranBSakxYaklCak9GamVWamJSandCblhRblNIbnBGbkxYbklObk1CblRSd1hCd1hOd1hZd05Gd1FGd1NCd0dGd0xYd0xEd2VOd2dCd3VId2pEd25YTUJYTXBGTUlCTWVOTVRIY2FRY05CY0RIY1NGY0NYY3BCY0xYY0xEY2dGY3VGY25YY3dYY2NEY1RRY3JGVFFFclhOckNIcnBGcmdGcmJGclRIckZjV05ZV05iV0VIV01YV1RSXCIsXG4gICAgLy8gNS1rYW5hIHdvcmRzXG4gICAgXCJBQkdIQUJJSkFFQVZBWUpRQUxaSkFJYVJBSE5YQUhkY0FIYlJBWkpNQVpKUkFaVFJBZFZKQWtsbUFiY05BamRSQU1uUkFNV1lBV3BSQVdnUkFGZ0JBRmhCQUZkY0JOSkJCTkpEQlFLQkJRaGNCUWxtQkRFSkJZSmtCWUpUQnBOQkJwSkZCSUpCQklKREJJY0FCT0tYQk9FSkJPVkpCT2lKQk9aSkJlcEJCZUxYQmVJRkJlZ0JCZ0dKQlZKWEJ1b2NCaUpSQlVKUUJsWFZCbElUQndORkJNWVZCY3FYQlRsbUJXTkZCV2lKQlduUkJGR0hCRndYWEtHSlhOSkJYTlpKWERUVFhTSFNYU1ZSWFNsSFhDSkRYR1FKWEVoWFhZUUpYWWJSWE9mWFhlTmNYVkpGWGhRSlhoRUpYZFRSWGpkWFhNaEJYY1FUWFJHQlhURUJYVG5RWEZDWFhGT0ZYRmdGYUJhRmFCTkphQkNKYUJwQmFCd1hhTkpLYU5KRGFRSUJhRHBSYUVQRGFITUZhbURKYWxFSmFNWkphRmFGYUZOQmFGUUphRkxEYUZWSEtCQ1lLQkVCS0JIREtYYUZLWEdkS1hFSktYcEhLWElCS1haREtYd1hLS3dMS05hY0tOWUpLTkpvS05XY0tER2RLRFRSS0NoWEtHYVJLR2hCS0diUktFQlRLRWFSS0VQVEtMTURLTFdSS09IREtWSmNLZEJjS2xJQktsT1BLRlNCS0ZFUEtGcEZOQk5KTkpCUU5CR0hOQkVQTkJIWE5CZ0ZOQlZYTkJaRE5Cc1hOQndYTk5hUk5OSkROTkpFTk5Ka05EQ0pORFZETkdKUk5KaUROWkpOTnNDSk5KRk5ORlNCTkZDWE5GRVBORkxYTkZJRlFKQkZRQ2FSUUpFUVFMSkRRTEpGUUlhUlFPcVhRSGFGUUhIUVFWSlhRVkpEUWhOSlFtRUlRWkpGUXNKWFFKckZRV2JSREpBQkRCWUpEWE5GRFhDWERYTFhEWFpERFhzSkRRcVhEU0pGREpDWERFUGtERXFYRFltUURwU0pET0NrRE9HUURIRUlEVkpERHVEdURXRUJESkZnU0JORFNCU0ZTQkdIU0JJQlNCVFFTS1ZZU0pRTlNKUWlTSkNYU0VxWFNKWVZTSWlKU09NWVNIQUhTSGFRU2VDRlNlcFFTZWdCU0hkSFNIckZTaFNKU0p1SFNKVUZTa05SU3JTclNXRUJTRmFIU0pGUVNGQ1hTRkdEU0ZZWFNGT0RTRmdCU0ZWWFNGaEJTRnhGU0ZrRlNGYkJTRk1GQ0FEZENKWEJDWGFGQ1hLRkNYTkZDWENYQ1hHQkNYRUpDWFlCQ1hMRENYSUJDWE9QQ1hIWENYZ0JDWGhCQ1hpQkNYbERDWGNIQ0pOQkNKTkZDRENKQ0RHQkNEVlhDRGhCQ0RpRENESmRDQ21OQ3BKRkNJYVJDT3FYQ0hDSENIWkpDVmlKQ3VDdUNtZGRDSmlGQ2ROQkNkSGhDbEVKQ25VSkNyZVNDV2xnQ1dUUkNGQkZDRk5CQ0ZZQkNGVkZDRmhGQ0ZkU0NGVEJDRldER0JOQkdCUUZHSkJDR0JFcUdCcEJHQmdRR05CRUdOSllHTmtPR05KUkdEVUZHSnBRR0hhQkdKZU5HSmVFR1ZCbEdWS2pHaUpER3ZKSEdzVkpHa0VCR01JSkdXak5HRkJGR0ZDWEdGR0JHRllYR0ZwQkdGTUZFQVNKRUFXcEVKTkZFQ0pWRUlYU0VJUUpFT3FYRU9jRkVlTmNFSEVKRUhsRkVKZ0ZFaGxtRW1ESkVtWkpFaU1CRVVxWEVvU1JFUEJGRVBYRkVQS0ZFUFNGRVBFRkVQcEZFUExYRVBJQkVKUGRFUGNGRVBUQkVKblhFcWxIRU1wUkVGQ1hFRk9ERUZjRllBU0pZSkFGWUJhQllCVlhZWHBGWURoQllDSkJZSkdGWVliUlllTmNZSmVWWWlJSllaSmNZdkpnWXZKUllKc1hZc0pGWU1ZTVlyZVZwQk5IcEJFSnBCd1hwUXhGcFlFSnBlTkRwSmVEcGVTRnBlQ0hwSFVKcEhiQnBIY0hwbVVKcGlpSnBVSnJwc0p1cGxJVHBGYUJwRlFxcEZHQnBGRWZwRllCcEZwQnBGTEpwRklEcEZnQnBGVlhwRnlRcEZ1RnBGbEZwRmpEcEZuWHBGd1hwSkZNcEZUQkxYQ0pMWEVGTFhoRkxYVUpMWGJGTGFsbUxOSkJMU0pRTENMQ0xHSkJMTERKTEhhRkxlTkZMZVNITGVDWExlcEZMaGFSTFpzSkxzSkRMc0pyTG9jYUxsTGxMTWRiTEZOQkxGU0JMRkVITEZrRklCQkZJQlhGSUJhUUlCS1hJQlNGSUJwSElCTFhJQmdCSUJoQklCdUhJQm1YSUJpRklCWlhJQnZGSUJiRklCalFJQndYSUJXRklLVFJJUVVKSURHRklDalFJWVNSSUlOWElKZUNJVmFSSW1Fa0laSkZJdkpSSXNKWElkQ0pJSm9SSWJCUUlqWUJJY3FYSVRGVklyZVZJRktGSUZTRklGQ0pJRkdGSUZMRElGSUJJSkZPSUZnQklGVlhJSkZoSUZ4RklGbVhJRmRISUZiQklKRnJJSkZXT0JHQk9RZlhPT0tqT1VxWE9mWEJPcVhFT2NxWE9SVkpPRklCT0ZsREhCSU9IWGlGSE5UUkhDSlhISWFSSEhKREhIRUpIVmJSSFpKWUhiSUJIUnNKSFJrREhXbG1nQktGZ0JTQmdCQ0RnQkdIZ0JwQmdCSUJnQlZKZ0J1QmdCdkZnS0RUZ1FWWGdEVUpnR1NKZ09xWGdtVU1nWklKZ1RVSmdXSUVnRkJGZ0ZOQmdGREpnRlNGZ0ZHQmdGWVhnSkZPZ0ZnUWdGVlhnRmhCZ0ZiSGdKRldWSkFCVlFLY1ZEZ0ZWT2ZYVmVERlZoYVJWbUdkVmlKWVZNYVJWRk5IaEJORGhCQ1hoQkVxaEJwRmhCTFhoTkpCaFNKUmhlVlhoaEtFaHhsbWhaSUpoZEJRaGtJSmhiTU5oTVVKaE1aSnhOSmd4UVVKeERFa3hEZEZ4U0pSeHBsbXhlU0J4ZUNYeGVHRnhlWVh4ZXBReGVnQnhXVmN4RkVReEZMWHhGSUJ4RmdCeEZ4RHhGWnR4RmRjeEZiQnhGd1h5REpYeURsY3VBU0p1REpwdURJQnVDcEp1R1NKdUlKRnVlRUZ1WklKdXNKWHVkV0V1b0lCdVdHSnVGQmN1RktFdUZORnVGUUZ1RkRKdUZHSnVGVkp1RlV0dUZkSHVGVEJtQllKbU5KWW1RaGttTEpEbUxKb21JZFhtaUpZbXZKUm1zSlJta2xtbU1CeW1NdUNtY2xtbWNuUWlKQUJpSkJOaUpCRGlCU0ZpQkNKaUJFRmlCWUJpQnBGaUJMWGlCVEhpSk5jaURFZmlDWkppRUNKaUpFcWlPa0hpSEtGaWVORGlISlFpZVFjaWVESGllU0ZpZUNYaWVHRmllRUZpZUlIaWVnRmloVUppeE5vaW9OWGlGYUJpRktGaUZORGlGRVBpRllYaXRGT2l0RkhpRmdCaUZWRWlGbVhpRml0aUZiQmlGTUZpRnJGVUNYUVVJb1FVSUpjVUhRSlVlQ0VVSHdYVVVKRFVVcVhVZFdjVWNxWFVyblFVRk5EVUZTSFVGQ0ZVRkVmVUZMWFV0Rk9aQlhPWlhTQlpYcEZaWFZYWkVRSlpFSmtacERKWk9xWFplTkhaZUNEWlVxWFpGQlFaRkVIWkZMWHZCQUZ2QktGdkJDWHZCRVB2QnBIdkJJRHZCZ0Z2QnVIdlFOSnZGTkZ2RkdCdkZJQnZKRmNzWENEc1hMWHNYc1hzWGxGc1hjSHNRcVhzSlFGc0VxWHNlSUZzRkVIc0ZqRGRCeE9kTnBSZE5KUmRFSmJkcEpSZGhaSmRuU0pkcmpOZEZOSmRGUUhkRmhOa05KRGtZYVJrSE5Sa0hTUmtWYlJrdU1Sa2pTSmtjcURvU0pGb0VpSm9ZWkpvT2ZYb2hFQm9NR1FvY3FYYkJBRmJCWEZiQmFGYkJORGJCR0JiQkxYYkJUQmJCV0RiR0pZYklKSGJGUXFiRnBRbERnUWxPckZsVkpSakdFQmpaSlJuWHZKblhiQm5FZkhuT1BEbmdKUm54ZlhuVUpXd1hFSndOcEp3RHBCd0VmWHdyRUJNRENKTURHSE1ESUpNTEpEY1FHRGNRcEhjcVhjY3FORmNxQ1hjRkNKUkJTQlJCR0JSQkVKUkJwUVRCTkZUQlFKVEJwQlRCVlhURkFCVEZTQlRGQ0ZURkdCVEZNRHJYQ0pyWExEckROSnJFZkhyRlFKckZpdFdOamRXTlRSXCIsXG4gICAgLy8gNi1rYW5hIHdvcmRzXG4gICAgXCJBS0xKTUFOT1BGQVNOSklBRUpXWEFZSk5SQUlJYlJBSWNkYUFlRWZEQWdpZFJBZGpOWUFNWUVKQU1JYlJBRk5KQkFGcEpGQkJJSllCRFpKRkJTaUpoQkdkRUJCRUpmWEJFSnFYQkVKV1JCcGFVSkJMWHJYQklZSk1CT2NmWEJlRWZGQmVzdFhCak5KUkJjREpPQkZFcVhYTnZKUlhETUJoWENKTllYT0FXcFhPTkpXWEhERUJYZUlhUlhoWUpEWFpKU0pYTURKT1hjQVNKWEZWSlhhQlFxWGFCWkpGYXNYZFFhRlNKUWFGRWZYYUZwSkhhRk9xWEtCTlNSS1h2SkJLUUpoWEtFSlFKS0VKR0ZLSU5KQktJSmpOS2dKTlNLVkVsbUtWaEVCS2lKR0ZLbEJnSktqblVKS3dzSllLTUZJSktGTkpES0ZJSkZLRk9mWE5KQlNGTkpCQ1hOQnBKRk5KQnZRTkpCTUJOSkxKWE5KT3FYTkplQ1hOSmVHRk5kc0pDTmJUS0ZOd1hVSlFORkVQUURpSmNRRE1TSlFTRnBCUUdNUUpRSmVPY1F5Q0pFUVVKRUJRSkZCclFGRUpxRFhESkZESlhwQkRKWElNREdpSmhESUpHUkRKZVljREhyREpEVlhnRkRrQVdwRGtJZ1JEakRFcURNdkpSREpGTkZESkZJQlNLY2xtU0pRT0ZTSlFWSFNKUWpEU0pHSkJTSkdKRlNFQ0pvU0hFSnFTSkhUQlNKVkpEU1ZpSllTWkpOQlNKc0pEU0ZTSkZTRkVmWFNKRkxYQ0JVSlZDSlhTQkNKWHBCQ1hWSlhDSlhzWENKWGRGQ0pOSkhDTElKZ0NIaUpGQ1ZOSk1DaENKaENVSEVKQ3NKVFJDSmRZY0NvUUpDQ0ZFZlhDRklKZ0NGVUp4Q0ZzdEZHSkJhUUdKQklER1FKcVhHWUpOUkdKSEtGR2VRcURHSEVKRkdKZUxYR0hJaUpHSGRCbEdVSkVCR2tJSlRHRlFQREdKRkVxRUFHZWdFSklKQkVKVkpYRWhRSlRFaUpOY0VKWkpGRUpvRXFFakRFcUVQRHNYRVBHSkJFUE9xWEVQZVFGRWZEaURFSmZFRkVmZXBRRWZNaUpFcVhOQkVxRElERXFlU0ZFcVZKWEVNdkpSWVhOSkRZWEVKSFlLVkpjWVlKRUJZSmVFY1lKVXFYWUZwSkZZRnN0WHBBWkpNcEJTSkZwTkJORnBlUVBEcEhMSkRwSElKRnBIZ0pGcGVpdEZwSFpKRnBKRkFEcEZTSkZwSkZDSnBGT3FYcEZpdEJwSkZaSkxYSUpGTElKZ1JMVk5KV0xWSEpNTHdOcEpMRkdKQkxGTEpETEZPcVhMSkZVSklCREpYSUJHSkJJSkJZUUlKQklCSUJPcVhJQmNxRElFR0pGSUxOSlRJSUpFQklPaUpoSUplTkJJSmVJQkloaUpJSVdvVFJJSkZBSElKRnBCSUpGdUhJRlV0RklKRlRIT1NCWUpPRWNxWE9IRUpxT3ZCcEZPa1ZKck9iQlZKT25jcURPY05Ka0hoTkpSSHVISnVIZE1oQmdCVXFYZ0JzSlhnT05KQmdITkpEZ0hISlFnSmVpdGdIc0pYZ0p5TmFneURKQmdaSkRyZ3NWSlFna0VKTmdralNKZ0pGQUhnRkNKRGdGWnRNVkpYTkZWWFFmWFZKWERKVlhvUUpWUVZKUVZERWZYVkR2SkhWRXFORlZlUWZYVkhwSkZWSHhmWFZWSlNSVlZtYVJWbElKT2hDWFZKaEhqWWtoeENKVmhXVlVKaFdpSmN4Qk5KSXhlRXFEeGZYQkZ4Y0ZFUHhGU0pGeEZZSlh5QkRRSnlkYVVKeUZPUER1WUNKWXVMdkpSdUhMSlh1WkpMRHVGT1BEdUZaSkh1RmNxWG1LSEpkbUNRSmNtT3NWSmlKQUdGaXRMQ0ZpZU9mWGllc3RYaVpKTUVpa05KUWlyWHpGaUZRcVhpRklKRmlGWkpGaUZ2dEZVSHBKRlV0ZUljVXRlT2NVVkNKa1VoZEhjVWJFSkVVSnFYUVVNTkpoVVJqWWtVRml0RlpER0pIWkpJeERaSlZKWFpKRkRKWkpGcFF2Qk5KQnZCU0pGdkp4QnJzZVFxRHNWRlZKZEZMSkRrRUpOQmttTkpZa0ZMSkRvUUpPUG9Hc0pSb0VBSEJvRUpmRmJCUXFEYkJaSkhiRlZKWGxGSUpCallJclhqZWl0Y2pqQ0VCaldNTkJ3WFFmWHdYT2FGd0RzSlh3Q0pUUndyQ1pKTUROSlFjRERKRmNxRE9QUllpSkZUQnNKWFRRSUpCVEZFZlhURkxKRHJYRUpGckVKWE1yRlpKRldFSmRFV1lUbG1cIixcbiAgICAvLyA3LWthbmEgd29yZHNcbiAgICBcIkFCQ0RFRkFDTkpUUkFNQkRKZEFjTkpWWEJMTkpFQlhTSWRXUlhFck5Ka1hZREpNQlhaSkNKYVhNTkphWUtLVkpLY0tERUpxWEtEY05KaEtWSnJOWUtiZ0pWWEtGVkpTQk5CWUJ3RE5KZVFmWE5KZUVxWE5oR0pXRU5KRmlKUlFsSUpiRVFKZlh4RFFxWGNmWFFGTkRFSlFGd1hVSkRZY25VSkRKSUJnUURJVUpUUkRKRkVxRFNKUVNKRlNKUUlKRlNPUGVadFNKRlpKSENKWFFmWENUREVxRkdKQlNKRkdKQk9mWEdKQmNxWEdKSE5KREdKUkxpSkVKZlhFcUVKRkVKUEVGcEJFSllKQlpKRllCd1hVSllpSk1FQllKWkp5VFlUT05KWHBRTUZYRnBlR0lEZHBKRnN0WHBKRmNQRExCVlNKUkxIUUpxWExKRlpKRklKQk5KRElKQlVxWElCa0ZESklKRUpQVElZSkdXUklKZVFQRElKZUVmSElKRnNKWE9xR0RTRkhYRUpxWGdKQ3NKQ2dHUUpxWGdkUVlKRWdGTUZOQmdKRmNxRFZKd1hVSlZKRlpKY2hJZ0pDQ3hPRUpxWHhPd1hVSnlESkJWUnVzY2lzY2lKQmlKQmllVXRxWGlKRkRKa2lGc0pYUVVHRVpKY1VKRnNKWFp0WElyWFpEWkpEclpKRk5KRFpKRnN0WHZKRlFxWHZKRkNKRXNKWFFKcWtoa05HQmJESmRUUmJZSk1FQmxEd1hVSk1FRmlKRmNmWE5KRFJjTkpXTVRCTEpYQ1wiLFxuICAgIC8vIDgta2FuYSB3b3Jkc1xuICAgIFwiQnJhRlV0SEJGU0pGZGJOQkxKWFZKUW9ZSk5FQlNKQkVKZkhTSkh3WFVKQ0pkQVpKTUdqYUZWSlhFSlBOSkJsRUpmRmlKRnBGYkZFSnFJSkJWSkNySUJkSGlKaE9QRkNodkpWSlpKTkpXeEdGTklGTHVlSUJRSnFVSEVKZlVGc3RPWkpEcmxYRUFTSlJsWFZKWFNGd1ZKTkpXRFwiLFxuICAgIC8vIDkta2FuYSB3b3Jkc1xuICAgIFwiUUpFSk5OSkRRSkVKSUJTRlFKRUp4ZWdCUUpFSmZIRVBTSkJtWEVKRlNKQ0RFSnFYTFhOSkZRcVhJY1FzRk5KRklGRUpxWFVKZ0ZzSlhJSkJVSkVKZkhORnZKeEVxWE5KblhVSkZRcURcIixcbiAgICAvLyAxMC1rYW5hIHdvcmRzXG4gICAgXCJJSkJFSnFYWkpcIlxuXTtcbi8vIE1hcHMgZWFjaCBjaGFyYWN0ZXIgaW50byBpdHMga2FuYSB2YWx1ZSAodGhlIGluZGV4KVxuY29uc3QgbWFwcGluZyA9IFwifn5BekJ+WH5hfktOflF+RH5TfkN+R35Ffll+cH5Mfkl+T35lSH5nflZ+aHh5dW1pfn5Vfn5afn52fn5zfn5ka29ibFBqZm5xd01jUlRyfld+fn5Gfn5+fn5KdFwiO1xubGV0IHdvcmRsaXN0ID0gbnVsbDtcbmZ1bmN0aW9uIGhleCh3b3JkKSB7XG4gICAgcmV0dXJuIGhleGxpZnkodG9VdGY4Qnl0ZXMod29yZCkpO1xufVxuY29uc3QgS2lZb0t1ID0gXCIweGUzODE4ZGUzODI4NGUzODE4ZlwiO1xuY29uc3QgS3lvS3UgPSBcIjB4ZTM4MThkZTM4MjgzZTM4MThmXCI7XG5mdW5jdGlvbiBsb2FkV29yZHMobGFuZykge1xuICAgIGlmICh3b3JkbGlzdCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHdvcmRsaXN0ID0gW107XG4gICAgLy8gVHJhbnNmb3JtcyBmb3Igbm9ybWFsaXppbmcgKHNvcnQgaXMgYSBub3QgcXVpdGUgVVRGLTgpXG4gICAgY29uc3QgdHJhbnNmb3JtID0ge307XG4gICAgLy8gRGVsZXRlIHRoZSBkaWFjcml0aWMgbWFya3NcbiAgICB0cmFuc2Zvcm1bdG9VdGY4U3RyaW5nKFsyMjcsIDEzMCwgMTU0XSldID0gZmFsc2U7XG4gICAgdHJhbnNmb3JtW3RvVXRmOFN0cmluZyhbMjI3LCAxMzAsIDE1M10pXSA9IGZhbHNlO1xuICAgIC8vIFNvbWUgc2ltcGxlIHRyYW5zZm9ybXMgdGhhdCBzb3J0IG91dCBtb3N0IG9mIHRoZSBvcmRlclxuICAgIHRyYW5zZm9ybVt0b1V0ZjhTdHJpbmcoWzIyNywgMTMwLCAxMzNdKV0gPSB0b1V0ZjhTdHJpbmcoWzIyNywgMTMwLCAxMzRdKTtcbiAgICB0cmFuc2Zvcm1bdG9VdGY4U3RyaW5nKFsyMjcsIDEyOSwgMTYzXSldID0gdG9VdGY4U3RyaW5nKFsyMjcsIDEyOSwgMTY0XSk7XG4gICAgdHJhbnNmb3JtW3RvVXRmOFN0cmluZyhbMjI3LCAxMzAsIDEzMV0pXSA9IHRvVXRmOFN0cmluZyhbMjI3LCAxMzAsIDEzMl0pO1xuICAgIHRyYW5zZm9ybVt0b1V0ZjhTdHJpbmcoWzIyNywgMTMwLCAxMzVdKV0gPSB0b1V0ZjhTdHJpbmcoWzIyNywgMTMwLCAxMzZdKTtcbiAgICAvLyBOb3JtYWxpemUgd29yZHMgdXNpbmcgdGhlIHRyYW5zZm9ybVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZSh3b3JkKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBrYW5hID0gd29yZFtpXTtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRyYW5zZm9ybVtrYW5hXTtcbiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAga2FuYSA9IHRhcmdldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCArPSBrYW5hO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFNvcnQgaG93IHRoZSBKYXBhbmVzZSBsaXN0IGlzIHNvcnRlZFxuICAgIGZ1bmN0aW9uIHNvcnRKYXBhbmVzZShhLCBiKSB7XG4gICAgICAgIGEgPSBub3JtYWxpemUoYSk7XG4gICAgICAgIGIgPSBub3JtYWxpemUoYik7XG4gICAgICAgIGlmIChhIDwgYikge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhID4gYikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vIExvYWQgYWxsIHRoZSB3b3Jkc1xuICAgIGZvciAobGV0IGxlbmd0aCA9IDM7IGxlbmd0aCA8PSA5OyBsZW5ndGgrKykge1xuICAgICAgICBjb25zdCBkID0gZGF0YVtsZW5ndGggLSAzXTtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZC5sZW5ndGg7IG9mZnNldCArPSBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrID0gbWFwcGluZy5pbmRleE9mKGRbb2Zmc2V0ICsgaV0pO1xuICAgICAgICAgICAgICAgIHdvcmQucHVzaCgyMjcpO1xuICAgICAgICAgICAgICAgIHdvcmQucHVzaCgoayAmIDB4NDApID8gMTMwIDogMTI5KTtcbiAgICAgICAgICAgICAgICB3b3JkLnB1c2goKGsgJiAweDNmKSArIDEyOCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JkbGlzdC5wdXNoKHRvVXRmOFN0cmluZyh3b3JkKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgd29yZGxpc3Quc29ydChzb3J0SmFwYW5lc2UpO1xuICAgIC8vIEZvciBzb21lIHJlYXNvbiBreW9rdSBhbmQga2l5b2t1IGFyZSBmbGlwcGVkIGluIG5vZGUgKCEhKS5cbiAgICAvLyBUaGUgb3JkZXIgU0hPVUxEIGJlOlxuICAgIC8vICAgLSBreW9rdVxuICAgIC8vICAgLSBraXlva3VcbiAgICAvLyBUaGlzIHNob3VsZCBpZ25vcmUgXCJpZlwiLCBidXQgdGhhdCBkb2Vzbid0IHdvcmsgaGVyZT8/XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBpZiAoaGV4KHdvcmRsaXN0WzQ0Ml0pID09PSBLaVlvS3UgJiYgaGV4KHdvcmRsaXN0WzQ0M10pID09PSBLeW9LdSkge1xuICAgICAgICBjb25zdCB0bXAgPSB3b3JkbGlzdFs0NDJdO1xuICAgICAgICB3b3JkbGlzdFs0NDJdID0gd29yZGxpc3RbNDQzXTtcbiAgICAgICAgd29yZGxpc3RbNDQzXSA9IHRtcDtcbiAgICB9XG4gICAgLy8gVmVyaWZ5IHRoZSBjb21wdXRlZCBsaXN0IG1hdGNoZXMgdGhlIG9mZmljaWFsIGxpc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoV29yZGxpc3QuY2hlY2sobGFuZykgIT09IFwiMHhjYjM2YjA5ZTZiYWE5MzU3ODdmZDc2MmNlNjVlODBiMGM2YThkYWJkZmJjM2E3Zjg2YWMwZTJjNGZkMTExNjAwXCIpIHtcbiAgICAgICAgd29yZGxpc3QgPSBudWxsO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCSVAzOSBXb3JkbGlzdCBmb3IgamEgKEphcGFuZXNlKSBGQUlMRURcIik7XG4gICAgfVxufVxuY2xhc3MgTGFuZ0phIGV4dGVuZHMgV29yZGxpc3Qge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImphXCIpO1xuICAgIH1cbiAgICBnZXRXb3JkKGluZGV4KSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0W2luZGV4XTtcbiAgICB9XG4gICAgZ2V0V29yZEluZGV4KHdvcmQpIHtcbiAgICAgICAgbG9hZFdvcmRzKHRoaXMpO1xuICAgICAgICByZXR1cm4gd29yZGxpc3QuaW5kZXhPZih3b3JkKTtcbiAgICB9XG4gICAgc3BsaXQobW5lbW9uaWMpIHtcbiAgICAgICAgbG9nZ2VyLmNoZWNrTm9ybWFsaXplKCk7XG4gICAgICAgIHJldHVybiBtbmVtb25pYy5zcGxpdCgvKD86XFx1MzAwMHwgKSsvZyk7XG4gICAgfVxuICAgIGpvaW4od29yZHMpIHtcbiAgICAgICAgcmV0dXJuIHdvcmRzLmpvaW4oXCJcXHUzMDAwXCIpO1xuICAgIH1cbn1cbmNvbnN0IGxhbmdKYSA9IG5ldyBMYW5nSmEoKTtcbldvcmRsaXN0LnJlZ2lzdGVyKGxhbmdKYSk7XG5leHBvcnQgeyBsYW5nSmEgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxhbmctamEuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyB0b1V0ZjhTdHJpbmcgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc3RyaW5nc1wiO1xuaW1wb3J0IHsgV29yZGxpc3QgfSBmcm9tIFwiLi93b3JkbGlzdFwiO1xuY29uc3QgZGF0YSA9IFtcbiAgICBcIk9ZQWFcIixcbiAgICBcIkFUQVpvQVRCbDNBVENUckFUQ2w4QVREbG9BVEdnM0FUSFQ4QVRKVDhBVEpsM0FUTGx2QVRMbjRBVE1UOEFUTVg4QVRNYm9BVE1nb0FUb0xiQVRvTVRBVHJIZ0FUdkhuQVQzQW5BVDNKYkFUM01UQVQ4RGJBVDhKVEFUOExtQVQ4TVlBVDhNYkFUI0xuQVVIVDhBVUhadkFVSlhyQVVKWDhBVUxuckFYSm52QVhMVW9BWExndkFYTW42QVhSZzNBWHJNYkFYM0pUQVgzUWJBWUxuM0FaTGd2QVpyU1VBWnZBY0FaOEFhQVo4QWJBWjhBbkFaOEhuQVo4TGdBWjhNWUFaOE1nQVo4T25BYUFib0FhRFRyQWFGVHJBYUpUckFhSmJvQWFMVm9BYU1YdkFhT2w4QWFTZW9BYkFVb0FiQWc4QWJBbDRBYkduckFiTVQ4QWJNWHJBYk1uNEFiUWI4QWJTVjhBYnZSbEFiOEFVQWI4QW5BYjhIZ0FiOEpUQWI4TlRBYjhSYkFjR2JvQWNMbnZBY01UOEFjTVg4QWNTVG9BY3JBYUFjckZuQWM4QWJBYzhNZ0FmR2dyQWZIYm9BZkpudkFmTFY4QWZMa29BZk1UOEFmTW5vQWZRYjhBZlNjckFmU2dyQWdBWjhBZ0ZsM0FnR1g4QWdIWnZBZ0hnckFnSlhvQWdKWDhBZ0pib0FnTFpvQWdMbjRBZ09YOEFnb0FUQWdvQW5BZ29DVUFnb0pnQWdvTFhBZ29NWUFnb1NlQWdyRFVBZ3JKVEFockZuQWhyTGpBaHJRZ0FqQWdvQWpKbnJBa01YOEFrT25vQWxDVHZBbENWOEFsQ2x2QWxGZzRBbEZsNkFsRm4zQWxvU25BbHJBWEFsckFmQWxyRlVBbHJGYkFsckdnQWxyT1hBbHZLbkFsdk1UQWwzQWJBbDNNbkFuQVRyQW5BY3JBbkNaM0FuQ2w4QW5EZzhBbkZib0FuRmwzQW5IWDRBbkhickFuSGdyQW5JbDNBbkpndkFuTFhvQW5MWDRBbkxickFuTGdyQW5MaHJBbk1Yb0FuTWdyQW5PbjNBblNickFuU2VvQW52TG5BbjNPbkNUR2d2Q1RTbHZDVHZBVUNUdktuQ1R2TlRDVDNDWkNUM0dVQ1QzTVRDVDhIbkNVQ1pyQ1VMZjhDVUxudkNVM0huQ1UzSlVDWTZOVUNiRGI4Q2JGWm9DYkxuckNib09UQ2JvU2NDYnJGbkNidkxuQ2I4QWdDYjhIZ0NiJExuQ2tMZm9DbEJuM0Nsb0RVRFRIVDhEVExsM0RUU1U4RFRyQWFEVHJMWERUckxqRFRyT1lEVHJPZ0RUdkZYRFR2Rm5EVDNIVURUM0xmRFVDVDlEVURUNERVRlZvRFVGVjhEVUZrb0RVR2dyRFVKbnJEVUxsOERVTVQ4RFVNWHJEVU1YNERVTWc4RFVPVW9EVU9ndkRVT2c4RFVTVG9EVVNaOERiRFhvRGJEZ29EYkdUOERiSm4zRGJMZzNEYkxuNERiTVhyRGJNZzhEYk9Ub0Rib0pYR1RDbHZHVERUOEdURlpyR1RMVm9HVExsdkdUTGwzR1RNZzhHVE9UdkdUU2xyR1RvQ1VHVHJEZ0dUckpZR1RyU2NHVHRMbkdUdkFuR1R2UWdHVUNackdVRFR2R1VGWm9HVUhYckdVTG52R1VNVDhHVW9NZ0dYb0xuR1hyTVhHWHJNbkdYdkZuR1lMbnZHWk9udkdadk9uR1o4TGFHWjhMbUdiQWwzR2JEWXZHYkRsckdiSFgzR2JKbDRHYkxWOEdiTG4zR2JNbjRHYm9KVEdib1JmR2J2RlVHYjNHVUdiNEpuR2dEWDNHZ0ZsJEdnSmxyR2dMWDZHZ0xab0dnTGY4R2dPWG9HZ3JBZ0dnckpYR2dyTVlHZ3JTY0dndkFUR2d2T1lHbkFnb0duSmd2R25MWm9HbkxnM0duTG5yR25RbjhHblNickduck1nSFRDbHZIVERUb0hURlQzSFRRVDhIVG9KVEhUb0pnSFRyRFVIVHJNbkhUdkZZSFR2UmZIVDhNbkhUOFNVSFVBWjhIVUJiNEhVRFR2SFVvTVlIWEZsNkhYSlg2SFhRbHJIWHJBVUhYck1uSFhyU2JIWHZGWUhYdktYSFgzTGpIWDNNZUhZdlFsSFpyU2NIWnZEYkhiQWNySGJGVDNIYkZsM0hiSlQ4SGJMVHJIYk1UOEhiTVhySGJNYnJIYlFiOEhiU1gzSGJvRGJIYm9KVEhickZVSGJySGdIYnJKVEhiOEpUSGI4TW5IYjhRZ0hnQWxySGdEVDNIZ0dnckhnSGdySGdKVHJIZ0pUOEhnTFhASGdMbnJIZ01UOEhnTVg4SGdNYm9IZ09uckhnUVRvSGdSZzNIZ29IZ0hnckNiSGdyRm5IZ3JMVkhndkFjSGd2QWZIbkFsb0huQ1RySG5DbnZIbkdUckhuR1o4SG5HbnZIbkpUOEhuTGY4SG5Ma3ZIbk1nOEhuUlRySVR2RlVJVHZGbkpUQVhySlRDVjhKVEZUM0pURlQ4SlRGbjRKVEdndkpUSFQ4SlRKVDhKVEpYdkpUSmwzSlRKbnZKVExYNEpUTGY4SlRMaHZKVE1UOEpUTVhySlRNbnJKVE9ickpUUVQ4SlRTbHZKVDhEVUpUOEZrSlQ4TVRKVDhPWEpUOE9nSlQ4UVVKVDhSZkpVSFpvSlhGVDRKWEZsckpYR1o4SlhHbnJKWExWOEpYTGd2SlhNWG9KWE1YM0pYTmJvSlhQbHZKWG9KVEpYb0xrSlhyQVhKWHJIVUpYckpnSlh2SlRKWHZPbkpYNEtuSllBbDNKWUpUOEpZTGh2SllRVG9KWXJRWEpZNk5VSmJBbDNKYkNackpiRGxvSmJHVDhKYkdnckpiSlh2SmJKYm9KYkxmOEpiTGhySmJMbDNKYk1udkpiUmc4SmJTWjhKYm9EYkpickNaSmJyU1VKYjNLbkpiOExuSmZSbjhKZ0FYckpnQ1pySmdEVHJKZ0dackpnR1o4SmdIVG9KZ0pUOEpnSlhvSmdKZ3ZKZ0xYNEpnTFozSmdMWjhKZ0xuNEpnTWdySmdNbjRKZ09ndkpnUFg2SmdSbnZKZ1NUb0pnb0NaSmdvSmJKZ29NWUpnckpYSmdySmdKZ3JMakpnNk1USmxDbjNKbEdndkpsSmw4Smw0QW5KbDhGbkpsOEhnSm5BVG9KbkFUckpuQWJ2Sm5EVW9KbkduckpuSlhySm5KWHZKbkxodkpuTG5ySm5MbnZKbk1Ub0puTVQ4Sm5NWHZKbk1YM0puTWc4Sm5NbHJKbk1uNEpuT1g4Sm5TVDRKblNYM0pub0FnSm5vQW5Kbm9KVEpub09iSm5yQWJKbnJBa0puckhuSm5ySlRKbnJKWUpuck9ZSm5yU2NKbnZDVUpudkZhSm52SmdKbnZKbkpudk9ZSm52UVVKbnZSVUpuM0ZuSm4zSlRLbkZsM0tuTFQ2TFREbHZMVE1ub0xUT24zTFRSbDNMVFNiNExUU2xyTFRvQW5MVG9KZ0xUckFVTFRyQWNMVHJDVUxUckhnTFRyTWdMVDNKbkxVTG5yTFVNWDhMVW9KZ0xWQVRyTFZEVHJMVkxiOExWb0pnTFY4TWdMVjhSVExYRGczTFhGbHJMWHJDbkxYckxYTFgzR1RMWDRHZ0xYNE9ZTFpBWHJMWkFjckxaQWdyTFpBaHJMWkRYeUxaRGxyTFpGYnJMWkZsM0xaSlg2TFpKWDhMWkxjOExaTG5yTFpTVThMWm9KVExab0puTFpyQWdMWnJBbkxackpZTFpyTFVMWnJNZ0xaclNrTFp2QW5MWnZHVUxadkplTFp2T1RMWjNGWkxaNEpYTFo4U1RMWjhTY0xhQVQzTGFBbDNMYUhUOExhSlRyTGFKVDhMYUpYckxhSmd2TGFKbDRMYUxWb0xhTVhyTGFNWHZMYU1YOExiQ2x2TGJGVG9MYkhsckxiSm40TGJMWjNMYkxodkxiTVhyTGJNbm9MYnZTVUxjTG5yTGM4SG5MYzhNVExkck1uTGVBZ29MZU9ndkxlT24zTGZBbDNMZkxudkxmTWwzTGZPWDhMZjhBbkxmOEpYTGY4TFhMZ0pUckxnSlhyTGdKbDhMZ01YOExnUlpyTGhDVG9MaHJBYkxockZVTGhySlhMaHZKWUxqSFRyTGpIWDRMakpYOExqTGhyTGpTWDNMalNaNExrRlg0TGtHWjhMa0dndkxrSlRyTGtNWG9Ma1NUb0xrU1U4TGtTWjhMa29PWUxsM0ZmTGwzTWdMbUFackxtQ2JyTG1HZ3JMbUhib0xtSm5vTG1KbjNMbUxmb0xtTGhyTG1TVG9MbkFYNkxuQWI2TG5DWjNMbkNiM0xuRFR2TG5EYjhMbkZsM0xuR25yTG5IWnZMbkhndkxuSVR2TG5KVDhMbkpYOExuSmx2TG5MZjhMbkxnNkxuTGh2TG5Mbm9Mbk1YckxuTWc4TG5RbHZMblNickxuckFnTG5yQW5MbnJEYkxuckZrTG5ySmRMbnJNVUxuck9ZTG5yU1RMbnZBbkxudkRVTG52SGdMbnZPWUxudk9uTG4zR2dMbjREVUxuNEpUTG40Sm5NVEFab01UQWxvTVREYjhNVEZUOE1USm5vTVRKbnJNVExack1UTGhyTVRMa3ZNVE1YOE1UUlRyTVRvQVRNVHJEbk1Uck9uTVQzSm5NVDRNbk1UOEZVTVQ4RmFNVDhGbE1UOEdUTVQ4R2JNVDhHbk1UOEhuTVQ4SlRNVDhKYk1UOE9UTVVDbDhNVUpUck1VSlU4TVVNWDhNVVJUck1VU1RvTVhBWDZNWEFiNk1YQ1pvTVhGWHJNWEhYck1YTGd2TVhPZ29NWHJBVU1YckFuTVhySGdNWHJKWU1YckpuTVhyTVRNWHJNZ01Yck9ZTVhyU1pNWHJTZ01YdkRVTVh2T1RNWDNKZ01YM09UTVg0Sm5NWDhEYk1YOEZuTVg4SGJNWDhIZ01YOEhuTVg4TGJNWDhNbk1YOE9uTVlBYjhNWUdib01ZSFR2TVlIWDRNWUxUck1ZTG52TVlNVG9NWU9ndk1ZUmczTVlTVHJNYkFUb01iQVhyTWJBbDNNYkFuOE1iR1o4TWJKVDhNYkpYck1iTVh2TWJNWDhNYk1ub01ick1VTWI4QWZNYjhGYk1iOEZrTWNKWG9NZUxuck1nRmwzTWdHVHZNZ0dYb01nR2dyTWdHbnJNZ0hUOE1nSFpyTWdKbm9NZ0xuck1nTG52TWdNVDhNZ1FVb01nckhuTWd2QW5NZzhIZ01nOEpZTWc4TGZNbG9Kbk1sOEFUTWw4QVhNbDhKWU1uQVRvTW5BVDRNbkFaOE1uQWwzTW5BbDRNbkNsOE1uSFQ4TW5IZzhNbkpub01uTFpvTW5MaHJNbk1Yb01uTVgzTW5NbnJNbk9ndk1uckZiTW5yRmZNbnJGbk1uck5UTW52SlhOVE1sOE9UQ1QzT1RGVjhPVEZuM09USFp2T1RKWHJPVE9sM09UM0FUT1QzSlVPVDNMWk9UM0xlT1QzTWJPVDhBVE9UOEFiT1Q4QWdPVDhNYk9VQ1h2T1VNWDNPWEhYdk9YTGwzT1hyTVVPWHZEYk9YNk5VT1g4SmJPWUZab09ZTGJyT1lMa29PWU1nOE9ZU1gzT2JIVHJPYkhUNE9iSmdyT2JMaHJPYk1YM09iT1g4T2I4Rm5PZUFsck9lSlQ4T2VKWHJPZUpuck9lTFRvT2VNYjhPZ0pYb09nTFhvT2dNbnJPZ09Yck9nT2xvT2dvQWdPZ29KYk9nb01ZT2dvU1RPZzhBYk9qTFg0T2pNbm9PalNWOE9uTFZvT25yQWdPbjNEVVBYUWxyUFh2RlhQYnZGVFBkQVQzUGxGbjNQbnZGYlFUTG40UVRvQWdRVG9NVFFVTFY4UVVSZzhRVW9KblFYQ1h2UWJGYnJRYjhBYVFiOEFjUWI4RmJRYjhNWVFiOFNjUWVBbHJRZUxoclFqQW4zUWxGWG9RbG9KZ1Fsb1NuUlRMbnZSVHJHVVJUckpUUlVKWnJSVW9KbFJVclFuUlpyTG1SWnJNblJaclNuUlo4QVRSWjhKYlJaOFNjUmJNVDhSYlNUM1JmR1pyUmZNWDhSZk1nclJmU1pyUm5BYnJSbkdUOFJudkpnUm52TGZSbnZNVFJuOEFhU1RDbHZTVEpnclNUT1hyU1RSZzNTVFJudlNUb0FjU1RvQWZTVG9BblNUb0huU1RvTGpTVG9NVFNUckFhU1RyRVVTVDNCWVNUOEFnU1Q4TG1TVUFadlNVQWdyU1VEVDRTVURUOFNVR2d2U1VKWG9TVUpYdlNVTFRyU1U4SlRTVThMalNWOEFuU1Y4SmdTWEZUb1NYTGY4U1l2QW5TWnJEVVNack1VU1pyTW5TWjhIZ1NaOEpUU1o4SmdTWjhNWVNaOFFVU2FRVW9TYkNUM1NiSFRvU2JRWXZTYlNsNFNib0puU2J2RmJTYjhIYlNiOEpnU2I4T1RTY0daclNjSGdyU2NKVHZTY01UOFNjU1RvU2NvSGJTY3JNVFNjdkFuU2VBWnJTZUFjclNlSGJvU2VKVW9TZUxoclNlTVQ4U2VNWHJTZTZKZ1NnSFRyU2tKbm9Ta0xudlNrOENVU2xGbDNTbHJTblNsOEduU21BYm9TbUdUOFNtSlU4XCIsXG4gICAgXCJBVExuRGxBVHJBWm9BVHJKWDRBVHJNVDhBVHJNWDRBVHJSVHJBVHZEbDhBVHZKVW9BVHZNbDhBVDNBVG9BVDNNWDhBVDhDVDNBVDhEVDhBVDhIWnJBVDhIZ29BVUFnRm5BVUNURm5BWG9NWDhBWHJBVDhBWHJHZ3ZBWHJKWHZBWHJPZ29BWHZMbDNBWnZBZ29BWnZGYnJBWnZKWG9BWnZKbDhBWnZKbjNBWnZNWDhBWnZTYnJBWjhGWm9BWjhMWjhBWjhNVThBWjhPVHZBWjhTVjhBWjhTWDNBYkFnRlpBYm9Kbm9BYnZHYm9BYjhBVHJBYjhBWm9BYjhBZ3JBYjhBbDRBYjhEYjhBYjhKbm9BYjhMWDRBYjhMWnJBYjhMaHJBYjhNVDhBYjhPVW9BYjhRYjhBYjhTVDhBY3JBVW9BY3JBYzhBY3JDWjNBY3JGVDNBY3JGWnJBY3JKbDRBY3JKbjNBY3JNWDNBY3JPVHZBYzhBWjhBYzhNVDhBZkFjSlhBZ29GbjRBZ29HZ3ZBZ29HbnJBZ29MYzhBZ29NWG9BZ3JMbnJBa3JTWjhBbEZYQ1RBbG9IYm9BbHJIYnJBbHJMaHJBbHJMa29BbDNDWnJBbDNMVW9BbDNMWnJBbnJBbDRBbnJNVDhBbjNIVDRCVDNJVG9CWDRNbnZCYiFMbiRDVEdYTW5DVG9MWjRDVHJIVDhDVDNKVHJDVDNSWnJDVCNHVHZDVTZHZ3ZDVThEYjhDVThHWnJDVThIVDhDYm9MbDNDYnJHZ3JDYnJNVThDYjhEVDNDYjhHbnJDYjhMWDRDYjhNVDhDYjhPYnJDZ3JHZ3ZDZ3JLWDRDbDhGWm9EVHJBYnZEVHJEYm9EVHJHVDZEVHJKZ3JEVHJNWDNEVHJSWnJEVHJSZzhEVHZBVnZEVHZGWm9EVDNEVDhEVDNMbjNEVDRIWnJEVDRNVDhEVDhBbHJEVDhNVDhEVUFrR2JEVURiSm5EWUxuUWxEYkRVT1lEYk1UQW5EYk1YU25EYm9BVDNEYm9GbjREYm9MbnZEajZKVHJHVENnRlRHVEdnRm5HVEpUTW5HVExuUGxHVG9KVDhHVHJDVDNHVHJMVm9HVHJMbnZHVHJNWDNHVHJNYm9HVHZLbDNHWkNsRm5HWnJEVDNHWjhEVHJHWjhGWjhHWjhNWHZHWjhPbjhHWjhTVDNHYkNuUVhHYk1iRm5HYm9GYm9HYm9KZzNHYm9NWG9HYjNKVHZHYjNKYm9HYjNNbjZHYjNRYjhHZ0RYTGpHZ01uQVVHZ3JEbG9HZ3JIWDRHZ3JTVG9HZ3ZBWHJHZ3ZBWnZHZ3ZGYnJHZ3ZMbDNHZ3ZNbnZHbkRuTFhHbnJBVHJHbnJNYm9HbnVMbDNIVEFUTW5IVEFnQ25IVENUQ1RIVHJHVHZIVHJIVHZIVHJKWDhIVHJMbDhIVHJNVDhIVHJNZ29IVHJPVHJIVHVPbjNIVHZBWnJIVHZEVHZIVHZHYm9IVHZKVThIVHZMbDNIVHZNWHJIVHZRYjRIVDRHVDZIVDRKVDhIVDRKYiNIVDhBbDNIVDhHWnJIVDhHZ3JIVDhIWDRIVDhKYjhIVDhKbm9IVDhMVHJIVDhMZ3ZIVDhTVG9IVDhTVjhIVW9KVW9IVW9KWDhIVW9MbnJIWHJMWm9IWHZBbDNIWDNMbnJIWDRGa3ZIWDRMaHJIWDRNWG9IWDRPbm9IWnJBWjhIWnJEYjhIWnJHWjhIWnJKbnJIWnZHWjhIWnZMbnZIWjhKbnZIWjhMaHJIYkNYSmxIYk1UQW5IYm9KbDRIYnBMbDNIYnJKWDhIYnJMbnJIYnJNbnZIYnZSWXJIZ29TVHJIZ3JGVjhIZ3JHWjhIZ3JKWG9IZ3JSbnZIZ3ZCYiFIZ3ZHVHJIZ3ZIWDRIZ3ZIbiFIZ3ZMVHJIZ3ZTVThIbkRuTGJIbkZiSmJIbnZEbjhIbjZHZ3ZIbiFCVHZKVENUTG5KVFFnRm5KVHJBbnZKVHJMWDRKVHJPVW9KVHZGbjNKVHZMbnJKVHZOVG9KVDNBZ29KVDNKbjRKVDNMaHZKVDNPYnJKVDhBY3JKVDhBbDNKVDhKVDhKVDhKbm9KVDhMWDRKVDhMbnJKVDhNWDNKVDhSZzNKVDhTYzhKVW9CVHZKVThBVG9KVThHWjhKVThHZ3ZKVThKVHJKVThKWHJKVThKbnJKVThMbnZKVThTY3ZKWEhuSmxKWHJHZ3ZKWHJKVThKWHJMaHJKWHJNVDhKWHJNWHJKWHJRVW9KWHZDVHZKWHZHWjhKWHZHZ3JKWHZRVDhKWDhBYjhKWDhEVDhKWDhHWjhKWDhIWnZKWDhMbnJKWDhNVDhKWDhNWG9KWDhNbnZKWDhTVDNKWUduQ1RKYkFrR2JKYkNUQW5KYkxUQWNKYm9EVDNKYm9MYjZKYnJBbnZKYnJDbjNKYnJEbDhKYnJHYm9KYnJJWm9KYnJKbnZKYnJNbnZKYnJRYjRKYjhSWnJKZUFiQW5KZ0puRmJKZ1NjQW5KZ3JBVHJKZ3ZIWjhKZ3ZNbjRKbEpsRmJKbExpUVhKbExqT25KbFJiT2xKbHZOWG9KbHZSbDNKbDRBY3JKbDhBVW9KbDhNbnJKbkZuTWxKbkhnR2JKbm9EVDhKbm9GVjhKbm9HZ3ZKbm9JVDhKbm9RVG9Kbm9SZzNKbnJDWjNKbnJHZ3JKbnJIVHZKbnJMZjhKbnJPWDhKbnZBVDNKbnZGWm9KbnZHVDhKbnZKbDRKbnZNVDhKbnZNWDhKbnZPWHJKbnZQWDZKbnZTWDNKbnZTWnJKbjNNVDhKbjNNWDhKbjNSVHJMVEFUS25MVEpuTFRMVE1YS25MVFJUUWxMVG9HYjhMVHJBWjhMVHJDWjhMVHJEYjhMVHJIVDhMVDNQWDZMVDRGWm9MVCRDVHZMVCRHZ3JMVXZIWDNMVm9BVHJMVm9BZ29MVm9KYm9MVm9NWDNMVm9SZzNMVjhDWjNMVjhGWm9MVjhHVHZMWHJEWG9MWHJGYnJMWHZBZ3ZMWHZGbHJMWHZMbDNMWHZSbjZMWDRNYjhMWDhHVDhMWUNYTW5MWXJNbnJMWm9TVHZMWnJBWnZMWnJBbG9MWnJGVG9MWnJKWHZMWnJKYm9MWnJKbDRMWnJMbnJMWnJNVDhMWnJPZ3ZMWnJSbnZMWnJTVDRMWnZNWDhMWnZTbHZMWjhBZ29MWjhDVDNMWjhKVDhMWjhMVjhMWjhMWm9MWjhMZzhMWjhTVjhMWjhTYnJMWiRIVDhMWiRNbjRMYTZDVHZMYkZiTW5MYlJZRlRMYlNuRlpMYm9KVDhMYnJBVDlMYnJHYjNMYnJRYjhMY3JKWDhMY3JNWHJMZXJIVHZMZXJKYnJMZXJOYm9MZ3JEYjhMZ3JHWjhMZ3JIVHJMZ3JNWHJMZ3JTVThMZ3ZKVHJMZ3ZMbDNMZzZMbDNMaHJMbnJMaHJNVDhMaHZBbDRMaUxuUVhMa29BZ3JMa29KVDhMa29KbjRMbHJTVThMbDNGWm9MbDNIVHJMbDNKWDhMbDNKbm9MbDNMVG9MbUxlRmJMbkRVRmJMbkxWQW5MbnJBVHJMbnJBWm9MbnJBYjhMbnJBbHJMbnJHZ3ZMbnJKVThMbnJMWnJMbnJMaHJMbnJNYjhMbnJPWHJMbnJTWjhMbnZBYjRMbnZEVHJMbnZEbDhMbnZIVHJMbnZIYnJMbnZKVDhMbnZKVThMbnZKYnJMbnZMaHZMbnZNWDhMbnZNYjhMbnZObm9MbnZTVThMbjNBbDNMbjRGWm9MbjRHVDZMbjRKZ3ZMbjRMaHJMbjRNVDhMbjRTVG9NVG9DWnJNVG9KWDhNVG9MWDRNVG9MZjhNVG9SZzNNVHJFbG9NVHZHYjZNVDNCVHJNVDNMYjZNVDhBY3JNVDhBZ3JNVDhHWnJNVDhKbm9NVDhMbnJNVDhNWDNNVU9VQW5NWEFiRm5NWG9BbG9NWG9KWDhNWG9MZjhNWG9MbDhNWHJBYjhNWHJEVHZNWHJHVDhNWHJHZ3JNWHJIVHJNWHJMZjhNWHJNVThNWHJPWHZNWHJRYjhNWHZHVDhNWHZIVHJNWHZMVm9NWDNBWDNNWDNKbjNNWDNMaHJNWDNNWDNNWDRBbHJNWDRPYm9NWDhHVHZNWDhHWnJNWDhHZ3JNWDhKVDhNWDhKWDhNWDhMaHJNWDhNVDhNWURVRmJNWU1nRGJNYkduRmZNYnZMWDRNYnZMbDNNYjhNYjhNYjhTVDRNZ0dYQ25NZzhBVHJNZzhBZ29NZzhDWnJNZzhEVHJNZzhEYm9NZzhIVHJNZzhKZ3JNZzhMVDhNbG9KWG9NbDhBaHJNbDhKVDhNbkxnQVVNbm9KWHJNbm9MWDRNbm9MaHJNbm9NVDhNbnJBbDRNbnJEYjhNbnJPVHZNbnJPZ3ZNbnJRYjhNbnJTVThNbnZHZ3JNbnZIWjhNbjNNVG9NbjREVHJNbjRMVHJNbjRNZzhObkJYQW5PVEZURm5PVG9BVG9PVHJHZ3ZPVHJKWDhPVDNKWG9PVDZNVHJPVDhHZ3JPVDhIVHBPVDhNVG9PVW9IVDhPVW9KVDhPVW9MbjNPWHJBZ29PWHJEZzhPWHJNVDhPWHZTVG9PWDZDVHZPWDhDWnJPWDhPZ3JPYjZIZ3ZPYjhBVG9PYjhNVDhPY3ZMWjhPZ3ZBbHJPZ3ZIVHZPZ3ZKVHJPZ3ZKbnJPZ3ZMWnJPZ3ZMbjRPZ3ZNVDhPZ3ZSVHJPZzhBWm9PZzhEYnZPbnJPWG9PbnZKbjRPbnZMaHZPbnZSVHJPbjNHZ29PbjNKbnZPbjZKYnZPbjhPVHJQVEdZRlRQYkJuRm5QYkduRG5QZ0RZUVRQbHJBbnZQbHJFVHZQbHJMbnZQbHJNWHZQbHZGWDRRVE1UQW5RVHJKVThRWUNuSmxRWUpsUWxRYkdUUWJRYjhKbnJRYjhMWm9RYjhMbnZRYjhNVDhRYjhNbDhRYjhTVDRRbG9BbDRRbG9IWnZRbG9KWDhRbG9NbjhRbkpaT2xSVHJBWnZSVHJEVHJSVHZKbjRSVHZMaHZSVDRKYjhSWnJBWnJSWjhBa3JSWjhKVThSWjhMVjhSWjhMbnZSYkpsUVhSZzNHYm9SZzNNbnZSZzhBWjhSZzhKYm9SZzhKbDRSbkxUQ2JSbnZGbDNSbnZRYjhTVG9BbDRTVG9DWnJTVG9GWm9TVG9IWHJTVG9KVThTVG9KZ3ZTVG9KbDRTVG9MaHJTVG9NWDNTVHJBbHZTVHJDVDlTVHJDZ3JTVHJHZ3JTVHJIWHJTVHJIYm9TVHJKbm9TVHJOYm9TVHZMbnJTVDRBWm9TVDhBYjhTVDhKVDhTVW9KbjNTVTZIWiNTVTZKVHZTVThEYjhTVThIYm9TVThMZ3JTVjhKVDhTWnJBY3JTWnJBbDNTWnJKVDhTWnJKbnZTWnJNVDhTWnZMVW9TWjRGWm9TWjhKbm9TWjhSWnJTY29MbnJTY29NVDhTY29NWDhTY3JBVDRTY3JBWjhTY3JMWjhTY3JMa3ZTY3ZEYjhTY3ZMZjhTY3ZOVG9TZ3JGWnJTaHZLbnJTbG9IVW9TbG9MbnJTbHJNWG9TbDhIZ3JTbXJKVW9TbjNCWDZcIixcbiAgICBcIkFURmxPbjNBVExnckRZQVQ0TVRBbkFUOExUTW5BWUpuUlRyQWJHZ0puckFiTFY4TG5BYnZOVEFuQWVGYkxnM0FnT1lNWG9BbFFiRmJvQW5EYm9BZkFuSmdvSlRCVG9EZ0FuQlVKYkFsM0Jib0RVQW5DVERsdkxuQ1RGVHJTbkNZb1FUTG5EVHdBYkFuRFVEVHJTbkRVSGdIZ3JEWDhMWEZuRGJKWEFjckVUdkxUTG5HVEZUUWJyR1RNbkdUb0dUM0RVRmJHVUpsUFgzR2JRZzhMbkdib0piRm5HYjNHZ0FZR2dBZzhTY0dnTWJBWHJHZ3ZBYkFuR25KVExudkdudkFURmdIVERUNkFUSFRyRGxKbkhZTG5NbjhIWnJTYkpUSFo4TFRGbkhiRlRKVW9IZ1NlTVQ4SGdyTGpBbkhndkFiQW5IbEZVckRsSG5EZ3ZBbkhuSFRGVDNIblFUR25ySlRBYU1YdkpUR2JDbjNKVE9nckFuSlh2QVhNbkpiTWc4U25KYk1uUmczSmI4TFRNbkpuQWwzT25KbkdZclFsSm5KbFFZM0xURGxDbjNMVEpqTGczTFRMZ3ZGWExUTWczR1RMVjhIVU9nTFhGWkxnM0xYTlhyTW5MWDhRWEZuTFg5QWxNWUxZTFhQWHJMWkFiSlU4TFpEVUpVOExaTVhyU25MWiRBZ0ZuTGFQWHJEVUxiRllyTW5MYk1uOExYTGJvSmdKZ0xlRmJMZzNMZ0xaclNuTGdPWUFnb0xoclJuSmxMa0NUclNuTGtPbkxockxuRlglQVlMbkZab0pYTG5IVHZKYkxuTGxvQWJNVEFUTGY4TVRIZ0puM01UTVhyQVhNVDNNVEZuTVVJVHZGbk1YRlglQVlNWE1YdkZiTVhyRlREYk1ZQWNNWDNNYkxmOFNuTWI4SmJGbk1nTVhyTVRNZ3ZBWEZuTWd2R2dDbU1uQWxvU25NbkZuSlRyT1h2TVhTbk9YOEhUTW5PYkpUOFNjT2JMWkZsM09iTVhDWm9QVExnclFYUFVGbm9RWFBVM1JYSmxQWDNSa1FYUGJySlhRbFBsckpiRm5RVUFockRiUVhHbkNYdlFZTG5IbHZRYkxmTG52UlRPZ3ZKYlJYSllyUWxSWUxuclFsUmJMbnJRbFJsRlQ4SmxSbEZuclFYU1RDbENuM1NUSFRyQW5TVExaUWxyU1RNbkdUclNUb0hnR2JTVHJHVERuU1R2R1hDblNUM0hnRmJTVTNIWEFYU2JBbkpuM1NiRlQ4TG5TY0xmTG52XCIsXG4gICAgXCJBVDNKZ0pYOEFUOEZab1NuQVQ4SmdGVjhBVDhMaHJEYkFaOEpUOERiQWI4R2dMaHJBYjhTa0xudkFlOE1UOFNuQWxNWUpYTFZBbDNHWURUdkFsM0xmTG52QlVEVHZMbDNDVE9uM0hUckNUM0RVR2dyQ1U4TVQ4QWJDYkZUckpVb0NnckRiOE1URFRMVjhKWDhEVExuTFhRbERUOExaclNuRFVRYjhGWjhEVVNUNEpudkRiOFNjT1VvRGo2R2JKbDRHVExmQ1lNbEdUb0FYdkZuR2JvQVh2TG5HZ0FjckpuM0dndkZuU1RvR25MZjhKbnZHbiNIVERUb0hUTG5GWEpsSFR2QVRGVG9IVHZIVERUb0hUdk1UQWdvSFQzU1RDbHZIVDRBbEZsNkhUOEhURFRvSFVvRGdKVHJIVW9TY01YM0hiUlpyTVhvSGJvSmc4TFRIZ0RiOEpUckhnTVRvTGY4SGd2TG5Mbm9IbkhuM0hUNEhuNk1ndkFuSlRKVThTY3ZKVDNBYVFUOEpUOEhUckFuSlhyUmc4QW5KYkFsb01Yb0pickFURlRvSmJ2TW5vU25KZ0RiNkdndkpnRGI4TVhvSmdTWDNKVThKZ3VBVEZUb0psUFlMblFsSmxRa0RuTGJKbFFsRllKbEpsOExmOE9USm5DVEZuTGJKbkxUSFhNbkpuTFhHWENuSm5vRmZSZzNKbnJNWVJnM0puM0hnRmwzS1Q4RGc4TG5MVFJsRm5QVExUdlBiTGJ2TFZvU2JyQ1pMWE1ZNkhUM0xYTlU3RGxyTFhOWERUQVRMWDhEWDhMbkxaRGI4SlU4TFpNbm9MaHJMWlNUb0pVOExackxhTG5yTFp2Sm4zU25MWjhMaHJTbkxhSm5vTVQ4TGJGbHJIVHZMYnJGVExuckxidkFUTGx2TGI2T1RGbjNMY0xuSlpPbExlQVQ2TW40TGVKVDNPYnJMZzZMWEZsckxockpnOExuTGh2RGxQWDRMaHZMZkxudkxqNkpURlQzTG5GYnJNWG9MblFsdUNUdkxuclFYQ1k2TG52TGZMbnZMbnZNZ0xudkxudlNlTGY4TVRNYnJKbjNNVDNKZ1NUM01UOEFuQVRyTVQ4TFVMbnJNVU1Ub0Nack1VU2N2TGY4TVhvRFQ4U25NWDZBVEZUb01YOEFYTVQ4TVg4RmtNVDhNWDhIVHJEVU1YOFNjb1NuTVlKVDZDVHZNZ0Fjck1Yb01nOFNUb0FmTWx2QVhMZzNNbkZsM0Fudk9UM0FuRmwzT1VvQVRIVDhPVTNSbkxYck9Yck9YclNuT2JQYnZGbjZPZzhIZ3JTbk9nOE9YOERiUFR2QWdvSmdQVTNSWUxuclBYckRuSlpyUGI4Q1RHZ3ZQbHJMVERsdlBsdkZVSm5vUVV2RlhyUWxRZU1ub0FsM1FsclFsclNuUlRGVHJKVW9TVERsTGlMWFNURmc2SFQzU1RKZ29NbjRTVHJGVEpUclNUckxaRmwzU1Q0Rm5NWG9TVXJEbEhVb1NjdkhUdlNuU2ZMa3ZNWG9cIixcbiAgICBcIkFVb0Fjck1Yb0FaOEhib0FnOEFiT2c2QVRGZ0FnOEFsb01Yb0FsM0FUOEpUckFsOE1YOE1Yb0NUM1NUb0pVOENsOERiOE1Yb0RUOEhnckFUckRib09UOE1Yb0dUT1RyQVRNbkdUOExockFaOEdudkZuR25RWEhUb0dndkFjckhUdkFYdkxsM0hickFab01Yb0hnQmxGWExnM0hnTW5GWHJTbkhnclNiOEpVb0huNkhUOExndklUdkFUckpVb0pVb0xaclJudkpVOEhUOEpiOEpYdkZYOFFUOEpYdkxUb0pUckpZclFuR25RWEpnckpub0FUckpub0pVOFNjdkpudk1udk1Yb0xUQ1RMZ3JKWExUSmxSVHZRbExiUm5KbFFZdkxick1iOExudkxidkZuM1Jub0xkQ1ZTVEdackxlU1R2R1hDbkxnM01ub0xuM01Ub0xsckVUdk1UOFNUb0FsM01ickRVNkdUdk1iOExYNExoclBsckxYR1hDblNUb0xmOFJnM1NUckRiOExUclNUdkxUSFhNblNiM1JZTG5NblNnT2c2QVRGZ1wiLFxuICAgIFwiSFVEbEduclFYckpUckhnTG5yQWNKWU1iOERVTGM4TFR2RmdHbkNrM01nOEpiQW5MWDRRWXZGWUhuTVhyUlVvSm5HbnZGblJsdkZUSmxRbm9TVHJCWEhYckxZU1VKZ0xmb01UOFNlOERUckhiRGJcIixcbiAgICBcIkFiRGw4U1RvSlU4QW4zUmJBYjhTVDhEVVNUckduckFnb0xiRlU2RGI4TFRyTWc4QWFIVDhKYjhPYkRsOFNUb0pVOFBiM1JsdkZZb0psXCJcbl07XG5jb25zdCBjb2RlcyA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkhQCMkJV4mKlwiO1xuZnVuY3Rpb24gZ2V0SGFuZ3VsKGNvZGUpIHtcbiAgICBpZiAoY29kZSA+PSA0MCkge1xuICAgICAgICBjb2RlID0gY29kZSArIDE2OCAtIDQwO1xuICAgIH1cbiAgICBlbHNlIGlmIChjb2RlID49IDE5KSB7XG4gICAgICAgIGNvZGUgPSBjb2RlICsgOTcgLSAxOTtcbiAgICB9XG4gICAgcmV0dXJuIHRvVXRmOFN0cmluZyhbMjI1LCAoY29kZSA+PiA2KSArIDEzMiwgKGNvZGUgJiAweDNmKSArIDEyOF0pO1xufVxubGV0IHdvcmRsaXN0ID0gbnVsbDtcbmZ1bmN0aW9uIGxvYWRXb3JkcyhsYW5nKSB7XG4gICAgaWYgKHdvcmRsaXN0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB3b3JkbGlzdCA9IFtdO1xuICAgIGRhdGEuZm9yRWFjaCgoZGF0YSwgbGVuZ3RoKSA9PiB7XG4gICAgICAgIGxlbmd0aCArPSA0O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IGxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHdvcmQgPSBcIlwiO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHdvcmQgKz0gZ2V0SGFuZ3VsKGNvZGVzLmluZGV4T2YoZGF0YVtpICsgal0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmRsaXN0LnB1c2god29yZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB3b3JkbGlzdC5zb3J0KCk7XG4gICAgLy8gVmVyaWZ5IHRoZSBjb21wdXRlZCBsaXN0IG1hdGNoZXMgdGhlIG9mZmljaWFsIGxpc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICBpZiAoV29yZGxpc3QuY2hlY2sobGFuZykgIT09IFwiMHhmOWVkZGVhY2U5YzVkM2RhOWM5M2NmN2QzY2QzOGY2YTEzZWQzYWZmYjkzMzI1OWFlODY1NzE0ZThhM2FlNzFhXCIpIHtcbiAgICAgICAgd29yZGxpc3QgPSBudWxsO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCSVAzOSBXb3JkbGlzdCBmb3Iga28gKEtvcmVhbikgRkFJTEVEXCIpO1xuICAgIH1cbn1cbmNsYXNzIExhbmdLbyBleHRlbmRzIFdvcmRsaXN0IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJrb1wiKTtcbiAgICB9XG4gICAgZ2V0V29yZChpbmRleCkge1xuICAgICAgICBsb2FkV29yZHModGhpcyk7XG4gICAgICAgIHJldHVybiB3b3JkbGlzdFtpbmRleF07XG4gICAgfVxuICAgIGdldFdvcmRJbmRleCh3b3JkKSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0LmluZGV4T2Yod29yZCk7XG4gICAgfVxufVxuY29uc3QgbGFuZ0tvID0gbmV3IExhbmdLbygpO1xuV29yZGxpc3QucmVnaXN0ZXIobGFuZ0tvKTtcbmV4cG9ydCB7IGxhbmdLbyB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bGFuZy1rby5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IHRvVXRmOFN0cmluZyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9zdHJpbmdzXCI7XG5pbXBvcnQgeyBXb3JkbGlzdCB9IGZyb20gXCIuL3dvcmRsaXN0XCI7XG5jb25zdCBkYXRhID0gXCJ9YUUjNEE9WXYmY28jNE4jNkc9Y0omU00jNjZ8L1ojNHQma25+NDYjNEt+NHElYjk9SVIjN2wsbUIjN1dfWDIqZGx9VW9+N3N9VWYmSXcjOWMmY3d+Nk8mSDYmd3gmSUcldjU9SVF+OGEmUHYjNDckUFImNTAlS28mUU0mM2wjNWYsRDkjNEx8L0gmdFE7djB+Nm5dbk48ZGksQU09VzUlUU8ma2EmdWEsaE1edG09elY9SkE9d1ImK1hdN1AmTkIjNEojNUx8L2JbZEF9dEo8RG8mNm0mdTJbVTEmS2IuSE0mbUM9dzAmTVc8clksSHEjNk19UUcsMTMmd1B9SnBdT3cldWUmS2c8SFA8RDl+NGt+OVQmSTJfYzYkOVQjOS9bQzV+N09+NGE9Y3MmTzc9S0s9QW4mbDkkNlUkOEEmdUQmUUl8L1kmYmd9VXgmRjIjNmJ9RTImSk4ma1cma3A9VS8mYmI9WGw8Q2p9ayt+NUojNkwmNXomOWl9YjQmRm8saG8oWDBfZzN+NE8kRnomUUU8SE49V3ddNi8lR0YtVnc9dGomL0QmUE4jOWc9WU99Y0wmT2YmUEl+NUkmSXA9dlU9SVcjOUc7MG8td1V9c3MmUVI8QlQmUjk9dGskUFlfZGgmUHEteWhdN1QsbmouWHU9RVAmNzY9Y0kmRnMqWGd9ejckR2ImK0k9REYsQUY9Y0F9ckwjN2o9RHomM3k8QWEkNTI9UFF9YjAoaVkkRmF9b0wmeFYjNlU9ZWM9V1oseGglUlk8ZHAjOU4mRmwmNDQ9V0gqQTc9c2gmVEImOFA9MDc7dSsmUEt9dWh9SjUjNzIpVi89eEMsQUIkazAmZjY7MUV8KzU9MUIsM3ZdNm4md1IlYismeHhdN2Y9T2x9Zmw7K0Red0ddN0U7bkI7dWheSXImbDU9SkwsblM9Y2Y9ZzU7dTZ8L1EkR2M9TUglSGcjNWQlTTZeODY9VSskR3osbC8saXJeNXkmQmEmL0YtSVkmRkkmYmUlSVojNzcmUFdfTnUka0UoWWYmTlhdN1osSnkmRkooWG8mTnojL2Q9eTcmTVg8QWd9Wis7bkVdRHQoaUcjNEQ9MTMmUGp+NGMldjgmWm8lT0wmL1gjNFc8SFImaWV+NkpfMU8oWTI9eTU9QWQqY3ZfZUIjNmsmUFg6QlUjN0E7dWsmRnQmRnhfZEQ9VTI7dkI9VTU9NEZ9K08mR04uSEg6OXM9YjAlTlYoak8mSUg9SlR9Wjk9Vlo8QWYsS3heNG0mdUolYzYsNnI7OW0jK0x9Y2YlS2gmRjN+NEg9dlB9YnUsSHp8KyssMXddbnZ9azY7dXUkancqS2wqV1gmdU1beDcmRnJbbTckTk8mUU5daHU9Sk59blJeOGcjL2gocHN8S0M7dmR9eHo9VjB9cDYmRkQkRzEjN0s8YkdfNHB+OGcmY2Y7dTQ9dGx9K2slNS99Zno7dXc8Y0E9dTF9Z1V9Vk09TEo9ZVgmK0wmUHIjNFV9cDI6bkMsMktdN0g6akYmOXh9dVgjOU89TUI8Znp+OFh+NW0mNEQma04mdTUlRS8oaDcoWkYmVkc8ZGUocU18L2UtV3Q9M3goYSssL1JdZi8mTkQkUm8mblV9MGc9S0Ela0gmTkskS2U8ZFN9Y0ImSVh+NWckVE5dNm09VXYsSXMmUHk9RWYlS3ojKy8lYmkmK0E8RjQkT0cmNEMmRkwjOVY8Wms9MklfZUUmNmNdbncma3EkSEd9eSsmQTgkUDN9T0g9WFBdNzAlSVMoQUpfZ0glR1omdFkmQVo9dmJ+NnkmL3I9Vkk9V3Y8Wmk9Zmw9eGYmZUx9Yzh9T0w9TUo9ZzgkRjc9WVR9OXU9MCteeEN9SkgmbkxeTjB+NFRdSzIsQ3klT0MjNnM7dkcoQUNeeGVeY0cmTUZ9QnIjOVA7d0QtN2gkTy8meEF9Rm5eUENdNmldN0cmOFYkUXM7dmwoVEJ+NzN+NGw8bVcmNlY9MnkmdVkmKzMpYVB9WEY7TFAma3gkd1U9dDc7dXk8Rk4mbHopN0U9T28qWSs7d0l9OXF9bGU7SjYmUmkmNHQmUXIjOEI9Y2Imdkc9SjV8UWwoaDU8WXl+NCt9UUQsTHg9d24lSy8mUks9ZE8mUHcsUTk9Y28lNHU7OXV9ZzBANmFeNEklYjA9em98L2MmdFg9ZFE9T1MjK2I9eXpfQUImd0ImUG09VzkkSFBfZ1I9NjI9QU89dGk9aEksb0EmanImZEg9dG0mYjYkUDIoeDg9emk7bkd+N0Y7MDVdMG5bSXgmM219cmc9WHA9Y2QmdXpdN3Q7OTc9Y047dlY8amYmRkYmRjE9NlEmSWsqS2smUDQsMno9ZlFdN0QmM3UsSDA9ZC99VXc8Wk48N1J9S3Y7MGYkSDcsTURdN24kRjAjODh+OVolZGE9Ynk7K1QjL3U9VkYmZk8ma3Jea2Y8QUJdc1UsSTUkTmcmUHo7MGkmUUQmdk09WWw6Qk07bkpfeEpdVTcmS2YmMzAsM2Z8WjkqZEMpamVfakEmUTQmS3AkTkgoWXojNlMmSWQlSWI9S1gsQUQ9S1YlZFB9dFcmUGteK0VfTmk9Y3EsM1J9VlooU2k9Yit9cnY7MGp9clpddUEsL3coU3gmSnYkdzkmNGQmd0UsTkokR3k9Si9dTHMjN2s8WlE8WS8mdWpdT3YkUE07djMsMkYmK3U6dXA9T24mM2UsSnY7OTA9SismUW1dNnF9YksjK2R+OFkoaDJdaEE7OTkmQVM9SS99cUImZFF9eUotVk19VmwmdWksaUImRzN8RGNdN2Q9ZVElZFglSkNfMUx+NGReTlA7dkomLzEpWkkjN05dOVhbYlEmUEw9MEwoVVosTG0ma2MmSVJ9bjcoaVI8QVE8ZGc9MzM9dk59ZnR9YXVdN0ksQmE9eDk9ZFJ+NlImVHE9WGksM2QkTnImQmN9REkma3UmdmZdRG4sL0YmaUQsTGwmTnc9MHkmSTc9THM9L0EmdFU9UWV9VWEmdWsmK0Y9ZzQ9Z2g9VmojKzEmUW59VXkqNDQjNUYsUGMmUnoqWG49b2g9NVc7MG5fTmYoaUU8WTc9dnI9WnVdb3ojNVolbUk9a049QnZfSnAoVDI7dnRfTWw8RlMmdUk9TC8mNlBdNjQkTTd9ODY8Ym8lUVgoU0klSVkmVks9QWwmVXg7dnY7dXQqRS8ldWg8WkV8TzMsTTIoeWNdeXU9V2smdHA6RXh9aHIsQ2wmV0UpK1o9OFV9STJfNFEsaEFfc2k9aXc9T009dE09eVolSWE9VTc7d1R9Yis7dW89WmF9eVMhNXh9SER9ZmIjNU9fZEE7TnYldUIoeUI7MDEoU2Z9Rms7djd9UHQjOHY8bVojN0wsL3ImUGx+NHcmZjU9UGgkRndfTEYmOG0sYkw9eUomQkh9cC8qSm59dFV+NVE7d0IoaDZdRGZdOHBeK0I7RTQmV2M9ZCs7RWEmYnckOEMmRk4sRE09WWZ9bVB+NXc9ZlQjNlY9bUM9Rmk9QVZ9akImQU59bFd9YUgjL0QpZFo7aGw7dkV9LzcsQ0o7MzEmdzgsaGoldTlfSnM9akomNE1+OGs9VE4mZUN9bkwmdWMtd2kmbFh9ZGo9TXY9ZTIjNnU9Y3IkdXEkNkddOFd9SmI6bm09WWc8YjMoVUE7dlgmNm4meEY9S1QsakMsRGUmUjgmb1k9WnYmb0JdNy89WjImT2F9YmYsaGgoNGhedFomNzImTng7RDImeEx+NWh+NDApWkcpaCs9T0omUkFdQnYkeUI9T3E9ZGYsQVElSm59T0o7MTEsM3omVGwmdGo7diteSHYsRGgoaWQ9cytdN04mTjMpOVF+OGYsUzQ9dVc9dzQmdVgsTFgmM2RdQ0omeXAmOHg8YjJfZG8mbFA9eS88Y3lfZEc9T2k9N1IoVkgobHRfMVQsSXFfQUE7MTJeNlQlazYjOEtbQjF7b088QVVbQnQ7MWIkOVMmUHM8OFQ9U3R7YlksakIoWnAmNjMmVXYkOVYsUE1dNnYmQWZ9eldbYldfb3F9c219bkImS3EmZ0MmZmZfZXFfMm0mNUYmVEl9cmZ9R2Y7WnJfejk7RVImamt9aXpfc248Qk5+K24mdm89VmklOTd8WlI9V2MsV0UmNnRdNnolODUobHkjODQ9S1kpNm1fNS89YVgsTjN9VG0maGUmNktddFJfQjItSTM7dS8maFUmbEg8QVA9aUImSUE9WEw7LzUmTmg9d3Y8QkgjNzk9dlM9emw8QUE9MFhfUkd9QncmOXAkTlcsQVgma1BfTHAmL1ooVGNdTXV9aHMjNkl9NUImY0k8YnEmSDkjNm09Szl9dkgoWTEoWTAjNEImdzYsLzkmZ0c8YkUsL089emJ9STRfbDg8Qi87d0wlUW88SE9bTXE9WFh9MHYmQlAmRjQobUd9MGl9bm0sRUM9OXV7STMseEcmLzk9SlkqREsmaFIpQlg9RUk9Y3g9Yi97Nmt9eVglQSsmd2F9WGI9bGE7d2lebEw7MHR9am8mUWI9eGc9WEJ9aU88cW97YlI9TlYmOGY9YTAmSnk7MHY9dUspSEs7dk4jNmgmakIoaC8ldWQmTkkld1kuWDc9UHR9Q3UtdUwmR3NfaGwlbUgsdG1dNzg9TGJeUTAjN1k9MXU8QnQmK1E9Q29fUkgsdzM7MWV9dXg8YVU7dWl9VTMmUTUlYnRdNjMmVVF8MGwmdUx9TzcmM28sQVYmZG18TmooWHQqNSsoVXUmSGgocDcoVUY9VlI9QnBeSmwmSGRbaXgpOS89SXFdQzg8NjddNjZ9bUIlNmZ9YmJ9SkldOFQkSEF9ZGI9WU0mcGE9Mkp9dFMmWTA9UFMmeTQ9Y1gkNkUsaFgsWFAmblI7MDQsRlEmbDAmVm1fRHYjNVl+OFo9QmklTUFdNng9Sk86K3AsQXomOXEsSGp+Ni99U0Q9SzE6RUp9bkE7UW8jL0VdOVIsSWUmNlglVzNdNjEmdjQ9eFhfTUM9MHE7MDYoWHE9ZnN9SUd9RHY9MGx9bzckaVo7OXYmTEgmRFAtN2EmT1ksU1osS3osQ3YmZGg9Znh8TmgsRi9+N3E9WEYmdys7OW4mR3c7MGh9Wjc8N08mSksoUzcmTFM8QUQ8YWM9d288RHQmenclNEI9NHYjOFA7OW9+NnAqdlY9VG0sT3ImSTY9MXF9blk9UDA9Z3EmQmwmVXUsQ2gleWJ9VVk9emh9ZGh9cmwoVDRfeGsoWUEjOFIqeEgsSU59Sm5dN1Z9QzQmVHl9ajNdN3A9Y0w9M2gmd1clUXY8WjM9ZjAmUkkmK1MoaWNfenF9b04mL1k9ejE7VGQ9TFc9MGU9T0koVmMsK2JeanUoVUw7MHI6WmElOHY9UnA9encmNTgmNzMmd0t9cVhdNnkmOEUpYTJ9V1I9d1BedXImblE8Y0h9UmU9QXEmd2t9UTAmK3E9UFAsR2N8L2ReazUsRnddOFl9UGddcDM9anU9ZWR9cjVfeWYmQ3NdN3okL0c8Q20mSnAmNTRfMUdfZ1BfTGx9Slo7MHVdazhfN2soU2ddNjV7OWk9TE4mU3gmV0ssaVcmZkQmTGt7OWF9RW0tOWMjOE4maW89c3ldOGQmblQmSUsobHgjNy8kbFcoVGQ8czh+NDksM288N1k9TVcoVCtfSnImV2QsaUx9Q3Q9eGgmNVY7djQmOG4lS3g9aUYmbDJfMEJ7QissSWYoSjAsTHY7dTg9S3gtdkI9SEMmdlM9WjYmZlUmdkVeeEs7M0Q9NGg9TVIjNDU6Snc7MGR9aXc9TFV9STU9STBdZ0IqaW0sSzl9R1UsMWtfNFUmVHQ9VnMoaVgmbFUoVEYjN3ksWk99b0EmbTUjNVB9UE59VXo9aE08QjEmRkI8YUcsZTZ+N1Q8dFAoVVFfWlQ9d3UmRjgpYVFdaU4sMXJfTG8mL2c6Q0R9ODR7SjFfS2kmTmEmM24kanomRkU9ZGM7dXY7dmF9aW59bGw9ZnYoaDEmM2h9ZnA9Q3l9Qk0oK0V+OG19bG8ldjc9aEMoVDYkY2o9QlE9QncoRFIsMmo9S3MsTlN8Ris7MDA9ZlU9NzB9TWIoWVU7K0cmbTcmaHI9U2slQ29ddCsoWDVfSnd9MHJ9Z0MoQVMtSVAmUUs8WjIjOFEkV0NdV1h9VDImcEdfS2EsSEM9UjQmL047Wis7Y2goQzcsRDQkM3BfTWsmQjIkOEQ9bjklS3kjNXooQ1QmUUojN0JdRENdZ1d9bmZ+NU07SXcjODB9VGNfMUYjNFotYUN9SGw9cGg9ZnosLzM9YVd9Sk19bm47REc7dm19d24sNFB9VDM7d3gmUkckdSt9eks9MGI7K0pfRWt7cmU8YVo9QVN9eVkjNURdN3EsQ3B9eE49VlAqMkN9R1p9YUd+K21fQ3M9T1kjNnJdNmc8R1N9TEMoVUI9M0E9Qm99Snk8YzR9SXM7MVA8QUd9T3A8WjF9bGR9blM9MVoseU0mOTUmOTg9Q0ooNHQ6MkwkSGs9Wm99VmM7K0l9bnAmTjF9OXk9aXZ9Q08qN3A9akwpcHhddGJeemgmR1MmVmwldi87dlI9MTQ9ekomNDl8L2ZdaEZ9V0c7MDM9OFB9by8mR2cmcnA7REIsS3Z9SmkmUGI7YUFebGwoNGoleXR9K0skSHQjNHkmaFldN1k8RjEsZU59YkcoVWglNlpddDUlRzc7K0ZfUkU7aXR9dEw9TFMmRGE9WHgoUysoNGY9OEc9eUl9Y0p9V1A9Mzc9alN9cFh9aGQpZnA8QTg9SnR+K28kSEo9TTZ9aVg9Zzl9Q1M9ZHY9Q2oobVAlS2QseHF8KzkmTEQoNC89WG0mUVA9TGN9TFgmZkw7K0s9T3AobHU9UXMucUM6K2UmTCs9SmojOHc7U0xdN1MoYisjNEk9YzEmbkdfTGYmdUg7K1IpWlY8YlYlQi8sVEUmMEgmSnEmQWglT0YmU3MocDIsV3YmSTM9V2x9VnE7MUwmbEojOWJfMUg9OHI9Yjg9SkgoU1o9aEQ9SjIjN1UsL1UjL1h+NlAsRlU8ZUw9angsbUc9aEc9Q0UmUFU9U2UocVgmTFk9WDY9eTQmdGsmUVEmdGY9NGcmeEl9VysmbVo9RGMjN3d9TGc7REE7d1FfS2IoY0o9aFIleVgmWWIsaHd7YlhfNFg7RVA7MVdfMk19VWM9YjUoWUYsQ00mVHBeT0p7RERdNnM9dkY9WW9+OHF9WEh9RnUlUDUoU0o9UXQ7TU9dczg8RjMmQjMmOFQoVWwtQlMqZHcmZFI8ODd9LzhdNjIkUFpdTHg8QXV9OVFdN2M9amE9S1IsR28sVXMmdjYocWt9cEcmRzI9ZXZeR00ldzQmSDRdN0YmZHZdSjZ9RXc6OXc9c2otWkx9WW0kK2goVXQoVW1+NG49WHMoVTclZUU9UWNfSlI8Q0EjNnQ8RnZ8L0ksSVMsRUc8RjIoWHkkL248RmEoaDl9KzlfMm8mTjQjN1g8WnF8K2ZfRHA9ZHQmbmEsQ2E9Tkopalk9OEM9WUc9czYmUSs8RE99RDM9eEImUjEobHc7UW48YkYoQ3V8L0J9SFY9U1MmbjcsMTAmdTBdRG0lQTZeNFE9V1IoVEQ9WG88R0gsUmoobDgpYlAmbi89TE0mQ0YsRjUmbWw9UEo7MGs9TEc9dHEsUmgsRDZANGk9MXAmKzk9WUMlZXJfTWg7bkk7MHE9RnddODA9eHE9Rk0kR3Y7djYmbmM7d0slSDImS2o7dnMsQUE9WVAsNjZ9YkkocVJ+NVU9NnF+NGIkTmk9SzUuWDMkU28mSXUocCtdOEc9Q2Y9UlkoVFNfTzMoaUgmNTc9ZkU9RGdfRG8jOXojN0g7Rkt7cWRfMmslSlJ9ZW4mZ2hfejg7Unh9OXA8Y05fTmUsRE87TE5fN29+L3A9TkY9NVl9Z048Y2U8QzEsUUVdV3Y9M3U8QkN9R0tdeXF9RFkmdS9faGo9SUkocHomckMsalYmK1p9dXQ9TlE7Q2ctU1JfWlMsK289dS87T3lfUktfUUYoRngmeFB9V3ImVEEsVWgmZzE9eXJ7YXhbVkYkUGcoWUI7T3g9Vnk7K1coU3B9WFYlZGQmMzMobC9dbDQjNFl9T0U9NmM9YncoQTcmOXQld2QmTi8mbW8sSkgmUWUpZm09QW99ZnU9dEhcIjtcbmNvbnN0IGRlbHRhRGF0YSA9IFwiRkFaREM2QkFMY0xaQ0ErR0JBUkNXOHdOQ2NERFo4TFZGQk9xcURVaW91K000MlRGQXlFUlhGYjdFamhQK3ZtQkZwRnJVcGZEVjJGN2VCK2VDbHRDSEpGV0xGQ0VEK3BXVG9qRUlIRlhjM2FGbjRGNjh6cWpFdUtpZFMxUUJWUERFaEU3TkE0bWhNRjdvVGhENDlvdDNGZ3R6SEZDSzBhY1cxeDhESDFFbUxvSWxyV0ZCTEUreTUrTkEzQ3g2NXdKSFRhRVpWYUsxbVdBbVBHeGdZQ2R4d09qVERJdC9mYU9FaFRsMXZxTnNLdEpDT2hKV3VpbzJnMDdLTFpFUXNGQlVwTnR3RUJ5Qmd4RnNsRmhlRmJpRVB2aTYxbXNEdkFweEN6QjZyQkN6b3g3am9ZQTVVZERjK0NiNEZTZ0lhYnBYRkFqM2Jqa21GQXhDWkUrbUQvU0ZmLzBFTGVjWUN0M25Mb3hDNldFWmYydEtEQjRvWnZyRW1xRmtLazdCd0lMQTdndFlCcHNUcS8vRDRqRDBGMHdFQjlweVExQkQ1QmEwb1lIREkrc2JERmh2ckhYZERIZmdGRUlKTGk1cjhxZXJjTkZCZ0ZMQzRibzVFUkp0YW1XQkRGeTczS0NFYjZNOFZwbUV0MzMweWdDVEs1OEVJSUZrWWdGODRndEdBOVV5aDNtNjhpVnJGYldGYmNicWlDWUhaOUoxamVSUGJMOHlzd2hNaURiaEVoZE5vU3dGYlpyTFQ3NDBBQkVxZ0NrTzhKMUJMZDFWaEtLUjRzRDF5VW8weitGRjU5TXZnNzFDRmJ5RWhiSFNGQktFSUt5b1FOZ1FwcHE5VDBLQXFlUHUwWkZHclhPSGRLSnFrb1RGaFl2cEROeXV1em5yTjg0dGhKYnNDb082Q3U2WGx2bnR2eTBRWXVBRXhRRVl0VFVCZjNDb0Nxd2dHRlo0dTFISkZ6RFZ3RXkzY2pjcFY0UXZzUGFCQzNyQ0d5Q0YyM280SzNwcDJnYmVyR2dGRUpFSG80bkhJQ3R5S0gyWnF5eGhOMDVLQkJKSVFsS2gvT3Vqdi9ESDMyVnJscUZkSUZDN0Z6OUN0NGthcUZNRTBVRVRMcHJuTjlrZnkra0ZtdFFCQjArNUNGdTBOOUlqOGwvVnZKRGgyb3EzaFQ2RXpqVEhLRk43Wmpad29Uc0FaNEV4c2tvNkZwYTZXQytzZHV6OGp5ckxwZWdUdjJoMUVCZVlwTHBtMmN6UVcwS29DY1MwYkNWWENtdVdKREJqTjFuUU5MZEY1OFNGSjBoN2kzcEMzb0VPS3kvRmpCa2xMNzBYdkJFRUlXcDJ5WjA0eE9iekFXRERKRzdmK0RicUJFQTdMeWlSOTVqN01EVmREVml6MlJFNXZXbEJNdjVlNCtWZmhQM2FYTlBodkxTeW5iOU8yeDR1RkJWKzNqcXU2ZDVwQ0cyOC9zRVRCeXZtdS8rSUowTDN3YjRyajlETk9MQkY2WFBJT0RyNEwxOVU5UlJvZkFHNk54eWRpOEJraThCaEdKYkJBSkt6Ykp4a1pTbEY5UTJDdThvS3FnZ0I5aEJBcndMTHFFQldFdEZvd3k4WEs4YkV5dzlzblQrQmV5RmsxWkNTcmRtZ2ZFd0ZlUFRnQ2pFTEJFbkliamFERFBKbTM2ckc5cHp0Y0V6VDhkR2syM1NCaFhCQjFINHorT1d6ZTBvb0Z6ejhwREJZRnZwOWo5dHZGQnlmOXk0RUZkVm56MDI2Q0dSNXFNcjdmeE1ITjhVVWRseUpBemxUQkRSQzI4aytMNEZCODA3OGxqeUQ5MXRVajFvY25Uczh2ZEVmN3puYnptK0dJakVabm9aRTVybkxMNzAwWGM3eUhmejA1bld4eTAzdkJCOVlHSFlPV3hnTVFHQkNSMjRDVllORTFocGZLeE4wektuZkpEbW1NZ01tQldxTmJqZlN5RkNCV1NDR0NnUjh5RlhpSHlFaitWdEQxRkIzRnBDMXpJMGtGYnppZmlLVExtOXlxNXpGbXVyK3E4Rkhxam9PQldzQlBpRGJuQ0MyRXJ1blY2Y0o2VHlnWEZZSFlwN01LTjlSVWxTSVM4L3hCQUdZTHplcVVuQkY0UWJzVHVVa1VxR3M2Q2FpRFdLV2pRSzlFSmtqcGtUbU5DUFlYTFwiO1xuLy8gQFRPRE86IExvYWQgbGF6aWx5XG5jb25zdCB3b3JkbGlzdCA9IHtcbiAgICB6aF9jbjogbnVsbCxcbiAgICB6aF90dzogbnVsbFxufTtcbmNvbnN0IENoZWNrcyA9IHtcbiAgICB6aF9jbjogXCIweDE3YmNjNGQ4NTQ3ZTVhNzEzNWUzNjVkMWFiNDQzYWFhZTk1ZTc2ZDgyMzBjMjc4MmM2NzMwNWQ0ZjIxNDk3YTFcIixcbiAgICB6aF90dzogXCIweDUxZTcyMGU5MGM3Yjg3YmVjMWQ3MGViNmU3NGEyMWE0NDliZDNlYzljMDIwYjAxZDNhNDBlZDk5MWI2MGNlNWRcIlxufTtcbmNvbnN0IGNvZGVzID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7XG5jb25zdCBzdHlsZSA9IFwifiFAIyQlXiYqXy09W117fXw7OiwuKCk8Pj9cIjtcbmZ1bmN0aW9uIGxvYWRXb3JkcyhsYW5nKSB7XG4gICAgaWYgKHdvcmRsaXN0W2xhbmcubG9jYWxlXSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHdvcmRsaXN0W2xhbmcubG9jYWxlXSA9IFtdO1xuICAgIGxldCBkZWx0YU9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDQ4OyBpKyspIHtcbiAgICAgICAgY29uc3QgcyA9IHN0eWxlLmluZGV4T2YoZGF0YVtpICogM10pO1xuICAgICAgICBjb25zdCBieXRlcyA9IFtcbiAgICAgICAgICAgIDIyOCArIChzID4+IDIpLFxuICAgICAgICAgICAgMTI4ICsgY29kZXMuaW5kZXhPZihkYXRhW2kgKiAzICsgMV0pLFxuICAgICAgICAgICAgMTI4ICsgY29kZXMuaW5kZXhPZihkYXRhW2kgKiAzICsgMl0pLFxuICAgICAgICBdO1xuICAgICAgICBpZiAobGFuZy5sb2NhbGUgPT09IFwiemhfdHdcIikge1xuICAgICAgICAgICAgY29uc3QgY29tbW9uID0gcyAlIDQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gY29tbW9uOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSBjb2Rlcy5pbmRleE9mKGRlbHRhRGF0YVtkZWx0YU9mZnNldCsrXSkgKyAoKGkgPT0gMCkgPyAyMjggOiAxMjgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdvcmRsaXN0W2xhbmcubG9jYWxlXS5wdXNoKHRvVXRmOFN0cmluZyhieXRlcykpO1xuICAgIH1cbiAgICAvLyBWZXJpZnkgdGhlIGNvbXB1dGVkIGxpc3QgbWF0Y2hlcyB0aGUgb2ZmaWNpYWwgbGlzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuICAgIGlmIChXb3JkbGlzdC5jaGVjayhsYW5nKSAhPT0gQ2hlY2tzW2xhbmcubG9jYWxlXSkge1xuICAgICAgICB3b3JkbGlzdFtsYW5nLmxvY2FsZV0gPSBudWxsO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCSVAzOSBXb3JkbGlzdCBmb3IgXCIgKyBsYW5nLmxvY2FsZSArIFwiIChDaGluZXNlKSBGQUlMRURcIik7XG4gICAgfVxufVxuY2xhc3MgTGFuZ1poIGV4dGVuZHMgV29yZGxpc3Qge1xuICAgIGNvbnN0cnVjdG9yKGNvdW50cnkpIHtcbiAgICAgICAgc3VwZXIoXCJ6aF9cIiArIGNvdW50cnkpO1xuICAgIH1cbiAgICBnZXRXb3JkKGluZGV4KSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0W3RoaXMubG9jYWxlXVtpbmRleF07XG4gICAgfVxuICAgIGdldFdvcmRJbmRleCh3b3JkKSB7XG4gICAgICAgIGxvYWRXb3Jkcyh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHdvcmRsaXN0W3RoaXMubG9jYWxlXS5pbmRleE9mKHdvcmQpO1xuICAgIH1cbiAgICBzcGxpdChtbmVtb25pYykge1xuICAgICAgICBtbmVtb25pYyA9IG1uZW1vbmljLnJlcGxhY2UoLyg/OlxcdTMwMDB8ICkrL2csIFwiXCIpO1xuICAgICAgICByZXR1cm4gbW5lbW9uaWMuc3BsaXQoXCJcIik7XG4gICAgfVxufVxuY29uc3QgbGFuZ1poQ24gPSBuZXcgTGFuZ1poKFwiY25cIik7XG5Xb3JkbGlzdC5yZWdpc3RlcihsYW5nWmhDbik7XG5Xb3JkbGlzdC5yZWdpc3RlcihsYW5nWmhDbiwgXCJ6aFwiKTtcbmNvbnN0IGxhbmdaaFR3ID0gbmV3IExhbmdaaChcInR3XCIpO1xuV29yZGxpc3QucmVnaXN0ZXIobGFuZ1poVHcpO1xuZXhwb3J0IHsgbGFuZ1poQ24sIGxhbmdaaFR3IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sYW5nLXpoLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuLy8gVGhpcyBnZXRzIG92ZXJyaWRkZW4gYnkgcm9sbHVwXG5jb25zdCBleHBvcnRXb3JkbGlzdCA9IGZhbHNlO1xuaW1wb3J0IHsgaWQgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvaGFzaFwiO1xuaW1wb3J0IHsgZGVmaW5lUmVhZE9ubHkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuL192ZXJzaW9uXCI7XG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbmV4cG9ydCBjbGFzcyBXb3JkbGlzdCB7XG4gICAgY29uc3RydWN0b3IobG9jYWxlKSB7XG4gICAgICAgIGxvZ2dlci5jaGVja0Fic3RyYWN0KG5ldy50YXJnZXQsIFdvcmRsaXN0KTtcbiAgICAgICAgZGVmaW5lUmVhZE9ubHkodGhpcywgXCJsb2NhbGVcIiwgbG9jYWxlKTtcbiAgICB9XG4gICAgLy8gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpc1xuICAgIHNwbGl0KG1uZW1vbmljKSB7XG4gICAgICAgIHJldHVybiBtbmVtb25pYy50b0xvd2VyQ2FzZSgpLnNwbGl0KC8gKy9nKTtcbiAgICB9XG4gICAgLy8gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpc1xuICAgIGpvaW4od29yZHMpIHtcbiAgICAgICAgcmV0dXJuIHdvcmRzLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgICBzdGF0aWMgY2hlY2sod29yZGxpc3QpIHtcbiAgICAgICAgY29uc3Qgd29yZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDQ4OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSB3b3JkbGlzdC5nZXRXb3JkKGkpO1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICBpZiAoaSAhPT0gd29yZGxpc3QuZ2V0V29yZEluZGV4KHdvcmQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiMHhcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmRzLnB1c2god29yZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkKHdvcmRzLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiKTtcbiAgICB9XG4gICAgc3RhdGljIHJlZ2lzdGVyKGxhbmcsIG5hbWUpIHtcbiAgICAgICAgaWYgKCFuYW1lKSB7XG4gICAgICAgICAgICBuYW1lID0gbGFuZy5sb2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgIGlmIChleHBvcnRXb3JkbGlzdCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbnlHbG9iYWwgPSB3aW5kb3c7XG4gICAgICAgICAgICAgICAgaWYgKGFueUdsb2JhbC5fZXRoZXJzICYmIGFueUdsb2JhbC5fZXRoZXJzLndvcmRsaXN0cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWFueUdsb2JhbC5fZXRoZXJzLndvcmRsaXN0c1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUmVhZE9ubHkoYW55R2xvYmFsLl9ldGhlcnMud29yZGxpc3RzLCBuYW1lLCBsYW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgeyB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13b3JkbGlzdC5qcy5tYXAiLCJpbXBvcnQgeyBsYW5nQ3ogYXMgY3ogfSBmcm9tIFwiLi9sYW5nLWN6XCI7XG5pbXBvcnQgeyBsYW5nRW4gYXMgZW4gfSBmcm9tIFwiLi9sYW5nLWVuXCI7XG5pbXBvcnQgeyBsYW5nRXMgYXMgZXMgfSBmcm9tIFwiLi9sYW5nLWVzXCI7XG5pbXBvcnQgeyBsYW5nRnIgYXMgZnIgfSBmcm9tIFwiLi9sYW5nLWZyXCI7XG5pbXBvcnQgeyBsYW5nSmEgYXMgamEgfSBmcm9tIFwiLi9sYW5nLWphXCI7XG5pbXBvcnQgeyBsYW5nS28gYXMga28gfSBmcm9tIFwiLi9sYW5nLWtvXCI7XG5pbXBvcnQgeyBsYW5nSXQgYXMgaXQgfSBmcm9tIFwiLi9sYW5nLWl0XCI7XG5pbXBvcnQgeyBsYW5nWmhDbiBhcyB6aF9jbiwgbGFuZ1poVHcgYXMgemhfdHcgfSBmcm9tIFwiLi9sYW5nLXpoXCI7XG5leHBvcnQgY29uc3Qgd29yZGxpc3RzID0ge1xuICAgIGN6OiBjeixcbiAgICBlbjogZW4sXG4gICAgZXM6IGVzLFxuICAgIGZyOiBmcixcbiAgICBpdDogaXQsXG4gICAgamE6IGphLFxuICAgIGtvOiBrbyxcbiAgICB6aDogemhfY24sXG4gICAgemhfY246IHpoX2NuLFxuICAgIHpoX3R3OiB6aF90d1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdvcmRsaXN0cy5qcy5tYXAiLCJpbXBvcnQgeyB1c2VFdmVudExpc3RlbmVyIH0gZnJvbSAnLi91c2VFdmVudExpc3RlbmVyJztcbmV4cG9ydCB2YXIgRXZlbnRMaXN0ZW5lciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50TGlzdGVuZXIocHJvcHMpIHtcbiAgICB1c2VFdmVudExpc3RlbmVyKHByb3BzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIEV2ZW50TGlzdGVuZXIuZGVmYXVsdFByb3BzID0ge1xuICAgIGNhcHR1cmU6IGZhbHNlXG4gIH07XG4gIHJldHVybiBFdmVudExpc3RlbmVyO1xufSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRMaXN0ZW5lci5qcy5tYXBcbiIsImV4cG9ydCB2YXIgZG9jdW1lbnRSZWYgPSB7XG4gIGN1cnJlbnQ6IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogZG9jdW1lbnRcbn07XG5leHBvcnQgdmFyIHdpbmRvd1JlZiA9IHtcbiAgY3VycmVudDogdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93XG59O1xuZXhwb3J0IHsgRXZlbnRMaXN0ZW5lciB9IGZyb20gJy4vRXZlbnRMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IHVzZUV2ZW50TGlzdGVuZXIgfSBmcm9tICcuL3VzZUV2ZW50TGlzdGVuZXInO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCJcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVzLmpzLm1hcFxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG52YXIgaXNBY3Rpb25TdXBwb3J0ZWQgPSBmdW5jdGlvbiBpc0FjdGlvblN1cHBvcnRlZChlbGVtZW50LCBtZXRob2QpIHtcbiAgcmV0dXJuIGVsZW1lbnQgPyAhIWVsZW1lbnRbbWV0aG9kXSA6IGZhbHNlO1xufTtcblxuZXhwb3J0IHZhciB1c2VFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gdXNlRXZlbnRMaXN0ZW5lcihvcHRpb25zKSB7XG4gIHZhciBjYXB0dXJlID0gb3B0aW9ucy5jYXB0dXJlLFxuICAgICAgbGlzdGVuZXIgPSBvcHRpb25zLmxpc3RlbmVyLFxuICAgICAgdHlwZSA9IG9wdGlvbnMudHlwZSxcbiAgICAgIHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgdGFyZ2V0UmVmID0gb3B0aW9ucy50YXJnZXRSZWY7XG4gIHZhciBsYXRlc3RMaXN0ZW5lciA9IFJlYWN0LnVzZVJlZihsaXN0ZW5lcik7XG4gIGxhdGVzdExpc3RlbmVyLmN1cnJlbnQgPSBsaXN0ZW5lcjtcbiAgdmFyIGV2ZW50SGFuZGxlciA9IFJlYWN0LnVzZUNhbGxiYWNrKGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBsYXRlc3RMaXN0ZW5lci5jdXJyZW50KGV2ZW50KTtcbiAgfSwgW10pO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBpcyBmaW5lIHRvIHZpb2xhdGUgdGhlcmUgY29uZGl0aW9uYWwgcnVsZSBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2lsbCBuZXZlciBjaGFuZ2UgZHVyaW5nIGNvbXBvbmVudFxuICAgIC8vIGxpZmVjeWNsZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9ydWxlcy1vZi1ob29rc1xuICAgIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRhcmdldFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgdGFyZ2V0YCBhbmQgYHRhcmdldFJlZmAgcHJvcHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgcGxlYXNlIHVzZSBvbmUgb2YgdGhlbS4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0YXJnZXRSZWYgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImB0YXJnZXRgIGFuZCBgdGFyZ2V0UmVmYCBwcm9wcyBhcmUgYHVuZGVmaW5lZGAsIGl0JyByZXF1aXJlZCB0byB1c2Ugb25lIG9mIHRoZW0uXCIpO1xuICAgICAgfVxuICAgIH0sIFt0YXJnZXQsIHRhcmdldFJlZl0pO1xuICB9XG5cbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlbWVudCA9IHR5cGVvZiB0YXJnZXRSZWYgPT09ICd1bmRlZmluZWQnID8gdGFyZ2V0IDogdGFyZ2V0UmVmLmN1cnJlbnQ7IC8vIFN0b3JlIHRoZSBjdXJyZW50IGV2ZW50IHRvIGF2b2lkIHRyaWdnZXJpbmcgaGFuZGxlcnMgaW1tZWRpYXRlbHlcbiAgICAvLyBOb3RlIHRoaXMgZGVwZW5kcyBvbiBhIGRlcHJlY2F0ZWQgYnV0IGV4dHJlbWVseSB3ZWxsIHN1cHBvcnRlZCBxdWlyayBvZiB0aGUgd2ViIHBsYXRmb3JtXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8yMDA3NFxuXG4gICAgdmFyIGN1cnJlbnRFdmVudCA9IHdpbmRvdy5ldmVudDtcblxuICAgIHZhciBjb25kaXRpb25hbEhhbmRsZXIgPSBmdW5jdGlvbiBjb25kaXRpb25hbEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgIC8vIFNraXAgaWYgdGhpcyBldmVudCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHJ1bm5pbmcgd2hlbiB3ZSBhZGRlZCB0aGUgaGFuZGxlcnNcbiAgICAgIGlmIChldmVudCA9PT0gY3VycmVudEV2ZW50KSB7XG4gICAgICAgIGN1cnJlbnRFdmVudCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudEhhbmRsZXIoZXZlbnQpO1xuICAgIH07XG5cbiAgICBpZiAoaXNBY3Rpb25TdXBwb3J0ZWQoZWxlbWVudCwgJ2FkZEV2ZW50TGlzdGVuZXInKSkge1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGNvbmRpdGlvbmFsSGFuZGxlciwgY2FwdHVyZSk7XG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtZXZlbnQtbGlzdGVuZXI6IFBhc3NlZCBgZWxlbWVudGAgaXMgbm90IHZhbGlkIG9yIGRvZXMgbm90IHN1cHBvcnQgYGFkZEV2ZW50TGlzdGVuZXIoKWAgbWV0aG9kLicpO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoaXNBY3Rpb25TdXBwb3J0ZWQoZWxlbWVudCwgJ3JlbW92ZUV2ZW50TGlzdGVuZXInKSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgY29uZGl0aW9uYWxIYW5kbGVyLCBjYXB0dXJlKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtZXZlbnQtbGlzdGVuZXI6IFBhc3NlZCBgZWxlbWVudGAgaXMgbm90IHZhbGlkIG9yIGRvZXMgbm90IHN1cHBvcnQgYHJlbW92ZUV2ZW50TGlzdGVuZXIoKWAgbWV0aG9kLicpO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtjYXB0dXJlLCBldmVudEhhbmRsZXIsIHRhcmdldCwgdGFyZ2V0UmVmLCB0eXBlXSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXNlRXZlbnRMaXN0ZW5lci5qcy5tYXBcbiIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgUmVhY3RJcyBmcm9tICdyZWFjdC1pcyc7XG5pbXBvcnQgeyBSZWZGaW5kTm9kZSB9IGZyb20gJy4vUmVmRmluZE5vZGUnO1xuaW1wb3J0IHsgUmVmRm9yd2FyZCB9IGZyb20gJy4vUmVmRm9yd2FyZCc7XG5leHBvcnQgdmFyIFJlZiA9IGZ1bmN0aW9uIFJlZihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGlubmVyUmVmID0gcHJvcHMuaW5uZXJSZWYsXG4gICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UocHJvcHMsIFtcImNoaWxkcmVuXCIsIFwiaW5uZXJSZWZcIl0pO1xuXG4gIHZhciBjaGlsZCA9IFJlYWN0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICB2YXIgRWxlbWVudFR5cGUgPSBSZWFjdElzLmlzRm9yd2FyZFJlZihjaGlsZCkgPyBSZWZGb3J3YXJkIDogUmVmRmluZE5vZGU7XG4gIHZhciBjaGlsZFdpdGhQcm9wcyA9IGNoaWxkICYmIHJlc3QgJiYgT2JqZWN0LmtleXMocmVzdCkubGVuZ3RoID4gMCA/IC8qI19fUFVSRV9fKi9SZWFjdC5jbG9uZUVsZW1lbnQoY2hpbGQsIHJlc3QpIDogY2hpbGQ7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwge1xuICAgIGlubmVyUmVmOiBpbm5lclJlZlxuICB9LCBjaGlsZFdpdGhQcm9wcyk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVmLmpzLm1hcFxuIiwiaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgKiBhcyBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuaW1wb3J0IHsgaGFuZGxlUmVmIH0gZnJvbSAnLi91dGlscyc7IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyByZWFjdC9wYWNrYWdlcy9yZWFjdC1yZWNvbmNpbGVyL3NyYy9SZWFjdEZpYmVyLmpzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERldGVjdHMgaWYgYSBwYXNzZWQgZWxlbWVudCBpcyBhIEZpYmVyIG9iamVjdCBpbnN0ZWFkIG9mIGFuIGVsZW1lbnQuIElzIG5lZWRlZCBhcyBgUmVhY3RET00uZmluZERPTU5vZGUoKWAgcmV0dXJuc1xuICogYSBGaWJlciBpbiBgcmVhY3QtdGVzdC1yZW5kZXJlcmAgdGhhdCBjYW4gY2F1c2UgaXNzdWVzIHdpdGggdGVzdHMuIElzIHVzZWQgb25seSBpbiBub24tcHJvZHVjdGlvbiBlbnYuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzczNzEjaXNzdWVjb21tZW50LTMxNzM5Njg2NFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJLVJlYWN0L2lzc3Vlcy80MDYxI2lzc3VlY29tbWVudC02OTQ4OTU2MTdcbiAqL1xuZnVuY3Rpb24gaXNGaWJlclJlZihub2RlKSB7XG4gIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICEhKG5vZGUudHlwZSAmJiBub2RlLnRhZyk7XG59XG5cbmV4cG9ydCB2YXIgUmVmRmluZE5vZGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUmVmRmluZE5vZGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJlZkZpbmROb2RlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9SZWFjdCRDb21wb25lbnQuY2FsbC5hcHBseShfUmVhY3QkQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnByZXZOb2RlID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUmVmRmluZE5vZGUucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBjdXJyZW50Tm9kZSA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpc0ZpYmVyUmVmKGN1cnJlbnROb2RlKSkge1xuICAgICAgICBjdXJyZW50Tm9kZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wcmV2Tm9kZSA9IGN1cnJlbnROb2RlO1xuICAgIGhhbmRsZVJlZih0aGlzLnByb3BzLmlubmVyUmVmLCBjdXJyZW50Tm9kZSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgY3VycmVudE5vZGUgPSBSZWFjdERPTS5maW5kRE9NTm9kZSh0aGlzKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaXNGaWJlclJlZihjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgY3VycmVudE5vZGUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByZXZOb2RlICE9PSBjdXJyZW50Tm9kZSkge1xuICAgICAgdGhpcy5wcmV2Tm9kZSA9IGN1cnJlbnROb2RlO1xuICAgICAgaGFuZGxlUmVmKHRoaXMucHJvcHMuaW5uZXJSZWYsIGN1cnJlbnROb2RlKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmlubmVyUmVmICE9PSB0aGlzLnByb3BzLmlubmVyUmVmKSB7XG4gICAgICBoYW5kbGVSZWYodGhpcy5wcm9wcy5pbm5lclJlZiwgY3VycmVudE5vZGUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBoYW5kbGVSZWYodGhpcy5wcm9wcy5pbm5lclJlZiwgbnVsbCk7XG4gICAgZGVsZXRlIHRoaXMucHJldk5vZGU7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfTtcblxuICByZXR1cm4gUmVmRmluZE5vZGU7XG59KFJlYWN0LkNvbXBvbmVudCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZWZGaW5kTm9kZS5qcy5tYXBcbiIsImltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgaGFuZGxlUmVmIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgdmFyIFJlZkZvcndhcmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUmVmRm9yd2FyZCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUmVmRm9yd2FyZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5jdXJyZW50Tm9kZSA9IG51bGw7XG5cbiAgICBfdGhpcy5oYW5kbGVSZWZPdmVycmlkZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGlubmVyUmVmID0gX3RoaXMkcHJvcHMuaW5uZXJSZWY7XG4gICAgICBoYW5kbGVSZWYoY2hpbGRyZW4ucmVmLCBub2RlKTtcbiAgICAgIGhhbmRsZVJlZihpbm5lclJlZiwgbm9kZSk7XG4gICAgICBfdGhpcy5jdXJyZW50Tm9kZSA9IG5vZGU7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBSZWZGb3J3YXJkLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIGlmIChwcmV2UHJvcHMuaW5uZXJSZWYgIT09IHRoaXMucHJvcHMuaW5uZXJSZWYpIHtcbiAgICAgIGhhbmRsZVJlZih0aGlzLnByb3BzLmlubmVyUmVmLCB0aGlzLmN1cnJlbnROb2RlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgZGVsZXRlIHRoaXMuY3VycmVudE5vZGU7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICByZWY6IHRoaXMuaGFuZGxlUmVmT3ZlcnJpZGVcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gUmVmRm9yd2FyZDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlZkZvcndhcmQuanMubWFwXG4iLCJleHBvcnQgeyBSZWYgfSBmcm9tICcuL1JlZic7XG5leHBvcnQgeyBSZWZGaW5kTm9kZSB9IGZyb20gJy4vUmVmRmluZE5vZGUnO1xuZXhwb3J0IHsgUmVmRm9yd2FyZCB9IGZyb20gJy4vUmVmRm9yd2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyoqXG4gKiBUaGUgZnVuY3Rpb24gdGhhdCBjb3JyZWN0bHkgaGFuZGxlcyBwYXNzaW5nIHJlZnMuXG4gKlxuICogQHBhcmFtIHJlZiAtIEFuIHJlZiBvYmplY3Qgb3IgZnVuY3Rpb25cbiAqIEBwYXJhbSBub2RlIC0gQSBub2RlIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBieSByZWZcbiAqL1xuZXhwb3J0IHZhciBoYW5kbGVSZWYgPSBmdW5jdGlvbiBoYW5kbGVSZWYocmVmLCBub2RlKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlIGRvIG5vdCBzdXBwb3J0IHJlZnMgYXMgc3RyaW5nLCB0aGlzIGlzIGEgbGVnYWN5IEFQSSBhbmQgd2lsbCBiZSBsaWtlbHkgdG8gYmUgcmVtb3ZlZCBpbiBvbmUgb2YgdGhlIGZ1dHVyZSByZWxlYXNlcyBvZiBSZWFjdC4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlZihub2RlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVmICE9PSBudWxsICYmIHR5cGVvZiByZWYgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gVGhlIGBjdXJyZW50YCBwcm9wZXJ0eSBpcyBkZWZpbmVkIGFzIHJlYWRvbmx5LCBob3dldmVyIGl0J3MgYSB2YWxpZCB3YXkgYmVjYXVzZVxuICAgIC8vIGByZWZgIGlzIGEgbXV0YWJsZSBvYmplY3RcbiAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gIH1cbn07XG4vKiogQ2hlY2tzIHRoYXQgdGhlIHBhc3NlZCBvYmplY3QgaXMgYSB2YWxpZCBSZWFjdCByZWYgb2JqZWN0LiAqL1xuXG5leHBvcnQgdmFyIGlzUmVmT2JqZWN0ID0gZnVuY3Rpb24gaXNSZWZPYmplY3QocmVmKSB7XG4gIHJldHVybiAoLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvdjE2LjguMi9wYWNrYWdlcy9yZWFjdC1yZWNvbmNpbGVyL3NyYy9SZWFjdEZpYmVyQ29tbWl0V29yay5qcyNMNjY1XG4gICAgcmVmICE9PSBudWxsICYmIHR5cGVvZiByZWYgPT09ICdvYmplY3QnICYmIHJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpXG4gICk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwXG4iLCJpbXBvcnQgZ2V0Q29tcG9zaXRlUmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qc1wiO1xuaW1wb3J0IGdldExheW91dFJlY3QgZnJvbSBcIi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBsaXN0U2Nyb2xsUGFyZW50cyBmcm9tIFwiLi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBvcmRlck1vZGlmaWVycyBmcm9tIFwiLi91dGlscy9vcmRlck1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL3V0aWxzL2RlYm91bmNlLmpzXCI7XG5pbXBvcnQgdmFsaWRhdGVNb2RpZmllcnMgZnJvbSBcIi4vdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanNcIjtcbmltcG9ydCB1bmlxdWVCeSBmcm9tIFwiLi91dGlscy91bmlxdWVCeS5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IG1lcmdlQnlOYW1lIGZyb20gXCIuL3V0aWxzL21lcmdlQnlOYW1lLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCB7IGlzRWxlbWVudCB9IGZyb20gXCIuL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4vZW51bXMuanNcIjtcbnZhciBJTlZBTElEX0VMRU1FTlRfRVJST1IgPSAnUG9wcGVyOiBJbnZhbGlkIHJlZmVyZW5jZSBvciBwb3BwZXIgYXJndW1lbnQgcHJvdmlkZWQuIFRoZXkgbXVzdCBiZSBlaXRoZXIgYSBET00gZWxlbWVudCBvciB2aXJ0dWFsIGVsZW1lbnQuJztcbnZhciBJTkZJTklURV9MT09QX0VSUk9SID0gJ1BvcHBlcjogQW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgbW9kaWZpZXJzIGN5Y2xlIGhhcyBiZWVuIGRldGVjdGVkISBUaGUgY3ljbGUgaGFzIGJlZW4gaW50ZXJydXB0ZWQgdG8gcHJldmVudCBhIGJyb3dzZXIgY3Jhc2guJztcbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHBsYWNlbWVudDogJ2JvdHRvbScsXG4gIG1vZGlmaWVyczogW10sXG4gIHN0cmF0ZWd5OiAnYWJzb2x1dGUnXG59O1xuXG5mdW5jdGlvbiBhcmVWYWxpZEVsZW1lbnRzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuICFhcmdzLnNvbWUoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICByZXR1cm4gIShlbGVtZW50ICYmIHR5cGVvZiBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCA9PT0gJ2Z1bmN0aW9uJyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9PUFRJT05TLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIHN0YXRlLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7IC8vIFZhbGlkYXRlIHRoZSBwcm92aWRlZCBtb2RpZmllcnMgc28gdGhhdCB0aGUgY29uc3VtZXIgd2lsbCBnZXQgd2FybmVkXG4gICAgICAgIC8vIGlmIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGlzIGludmFsaWQgZm9yIGFueSByZWFzb25cblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgdmFyIG1vZGlmaWVycyA9IHVuaXF1ZUJ5KFtdLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycyksIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhbGlkYXRlTW9kaWZpZXJzKG1vZGlmaWVycyk7XG5cbiAgICAgICAgICBpZiAoZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5vcHRpb25zLnBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICAgICAgICAgIHZhciBmbGlwTW9kaWZpZXIgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgICAgICAgIHZhciBuYW1lID0gX3JlZjIubmFtZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT09ICdmbGlwJztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWZsaXBNb2RpZmllcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBcImF1dG9cIiBwbGFjZW1lbnRzIHJlcXVpcmUgdGhlIFwiZmxpcFwiIG1vZGlmaWVyIGJlJywgJ3ByZXNlbnQgYW5kIGVuYWJsZWQgdG8gd29yay4nXS5qb2luKCcgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUocG9wcGVyKSxcbiAgICAgICAgICAgICAgbWFyZ2luVG9wID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luVG9wLFxuICAgICAgICAgICAgICBtYXJnaW5SaWdodCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblJpZ2h0LFxuICAgICAgICAgICAgICBtYXJnaW5Cb3R0b20gPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5Cb3R0b20sXG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5MZWZ0OyAvLyBXZSBubyBsb25nZXIgdGFrZSBpbnRvIGFjY291bnQgYG1hcmdpbnNgIG9uIHRoZSBwb3BwZXIsIGFuZCBpdCBjYW5cbiAgICAgICAgICAvLyBjYXVzZSBidWdzIHdpdGggcG9zaXRpb25pbmcsIHNvIHdlJ2xsIHdhcm4gdGhlIGNvbnN1bWVyXG5cblxuICAgICAgICAgIGlmIChbbWFyZ2luVG9wLCBtYXJnaW5SaWdodCwgbWFyZ2luQm90dG9tLCBtYXJnaW5MZWZ0XS5zb21lKGZ1bmN0aW9uIChtYXJnaW4pIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KG1hcmdpbik7XG4gICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihbJ1BvcHBlcjogQ1NTIFwibWFyZ2luXCIgc3R5bGVzIGNhbm5vdCBiZSB1c2VkIHRvIGFwcGx5IHBhZGRpbmcnLCAnYmV0d2VlbiB0aGUgcG9wcGVyIGFuZCBpdHMgcmVmZXJlbmNlIGVsZW1lbnQgb3IgYm91bmRhcnkuJywgJ1RvIHJlcGxpY2F0ZSBtYXJnaW4sIHVzZSB0aGUgYG9mZnNldGAgbW9kaWZpZXIsIGFzIHdlbGwgYXMnLCAndGhlIGBwYWRkaW5nYCBvcHRpb24gaW4gdGhlIGBwcmV2ZW50T3ZlcmZsb3dgIGFuZCBgZmxpcGAnLCAnbW9kaWZpZXJzLiddLmpvaW4oJyAnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcnVuTW9kaWZpZXJFZmZlY3RzKCk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZS51cGRhdGUoKTtcbiAgICAgIH0sXG4gICAgICAvLyBTeW5jIHVwZGF0ZSDigJMgaXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQsIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4gVGhpc1xuICAgICAgLy8gaXMgdXNlZnVsIGZvciBsb3cgZnJlcXVlbmN5IHVwZGF0ZXMgd2hlcmUgc3luYyBiZWhhdmlvciBzaW1wbGlmaWVzIHRoZVxuICAgICAgLy8gbG9naWMuXG4gICAgICAvLyBGb3IgaGlnaCBmcmVxdWVuY3kgdXBkYXRlcyAoZS5nLiBgcmVzaXplYCBhbmQgYHNjcm9sbGAgZXZlbnRzKSwgYWx3YXlzXG4gICAgICAvLyBwcmVmZXIgdGhlIGFzeW5jIFBvcHBlciN1cGRhdGUgbWV0aG9kXG4gICAgICBmb3JjZVVwZGF0ZTogZnVuY3Rpb24gZm9yY2VVcGRhdGUoKSB7XG4gICAgICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfc3RhdGUkZWxlbWVudHMgPSBzdGF0ZS5lbGVtZW50cyxcbiAgICAgICAgICAgIHJlZmVyZW5jZSA9IF9zdGF0ZSRlbGVtZW50cy5yZWZlcmVuY2UsXG4gICAgICAgICAgICBwb3BwZXIgPSBfc3RhdGUkZWxlbWVudHMucG9wcGVyOyAvLyBEb24ndCBwcm9jZWVkIGlmIGByZWZlcmVuY2VgIG9yIGBwb3BwZXJgIGFyZSBub3QgdmFsaWQgZWxlbWVudHNcbiAgICAgICAgLy8gYW55bW9yZVxuXG4gICAgICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKElOVkFMSURfRUxFTUVOVF9FUlJPUik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFN0b3JlIHRoZSByZWZlcmVuY2UgYW5kIHBvcHBlciByZWN0cyB0byBiZSByZWFkIGJ5IG1vZGlmaWVyc1xuXG5cbiAgICAgICAgc3RhdGUucmVjdHMgPSB7XG4gICAgICAgICAgcmVmZXJlbmNlOiBnZXRDb21wb3NpdGVSZWN0KHJlZmVyZW5jZSwgZ2V0T2Zmc2V0UGFyZW50KHBvcHBlciksIHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3kgPT09ICdmaXhlZCcpLFxuICAgICAgICAgIHBvcHBlcjogZ2V0TGF5b3V0UmVjdChwb3BwZXIpXG4gICAgICAgIH07IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlc2V0IHRoZSBjdXJyZW50IHVwZGF0ZSBjeWNsZS4gVGhlXG4gICAgICAgIC8vIG1vc3QgY29tbW9uIHVzZSBjYXNlIGZvciB0aGlzIGlzIHRoZSBgZmxpcGAgbW9kaWZpZXIgY2hhbmdpbmcgdGhlXG4gICAgICAgIC8vIHBsYWNlbWVudCwgd2hpY2ggdGhlbiBuZWVkcyB0byByZS1ydW4gYWxsIHRoZSBtb2RpZmllcnMsIGJlY2F1c2UgdGhlXG4gICAgICAgIC8vIGxvZ2ljIHdhcyBwcmV2aW91c2x5IHJhbiBmb3IgdGhlIHByZXZpb3VzIHBsYWNlbWVudCBhbmQgaXMgdGhlcmVmb3JlXG4gICAgICAgIC8vIHN0YWxlL2luY29ycmVjdFxuXG4gICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLnBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50OyAvLyBPbiBlYWNoIHVwZGF0ZSBjeWNsZSwgdGhlIGBtb2RpZmllcnNEYXRhYCBwcm9wZXJ0eSBmb3IgZWFjaCBtb2RpZmllclxuICAgICAgICAvLyBpcyBmaWxsZWQgd2l0aCB0aGUgaW5pdGlhbCBkYXRhIHNwZWNpZmllZCBieSB0aGUgbW9kaWZpZXIuIFRoaXMgbWVhbnNcbiAgICAgICAgLy8gaXQgZG9lc24ndCBwZXJzaXN0IGFuZCBpcyBmcmVzaCBvbiBlYWNoIHVwZGF0ZS5cbiAgICAgICAgLy8gVG8gZW5zdXJlIHBlcnNpc3RlbnQgZGF0YSwgdXNlIGAke25hbWV9I3BlcnNpc3RlbnRgXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllcnNEYXRhW21vZGlmaWVyLm5hbWVdID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kaWZpZXIuZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgX19kZWJ1Z19sb29wc19fID0gMDtcblxuICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBfX2RlYnVnX2xvb3BzX18gKz0gMTtcblxuICAgICAgICAgICAgaWYgKF9fZGVidWdfbG9vcHNfXyA+IDEwMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKElORklOSVRFX0xPT1BfRVJST1IpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgaW5zdGFuY2Uuc2V0T3B0aW9ucyhvcHRpb25zKS50aGVuKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKCFpc0Rlc3Ryb3llZCAmJiBvcHRpb25zLm9uRmlyc3RVcGRhdGUpIHtcbiAgICAgICAgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBhcmJpdHJhcnkgY29kZSBiZWZvcmUgdGhlIGZpcnN0XG4gICAgLy8gdXBkYXRlIGN5Y2xlIHJ1bnMuIFRoZXkgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdXBkYXRlXG4gICAgLy8gY3ljbGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBtb2RpZmllciBhZGRzIHNvbWUgcGVyc2lzdGVudCBkYXRhIHRoYXRcbiAgICAvLyBvdGhlciBtb2RpZmllcnMgbmVlZCB0byB1c2UsIGJ1dCB0aGUgbW9kaWZpZXIgaXMgcnVuIGFmdGVyIHRoZSBkZXBlbmRlbnRcbiAgICAvLyBvbmUuXG5cbiAgICBmdW5jdGlvbiBydW5Nb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYzKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZjMubmFtZSxcbiAgICAgICAgICAgIF9yZWYzJG9wdGlvbnMgPSBfcmVmMy5vcHRpb25zLFxuICAgICAgICAgICAgb3B0aW9ucyA9IF9yZWYzJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZjMkb3B0aW9ucyxcbiAgICAgICAgICAgIGVmZmVjdCA9IF9yZWYzLmVmZmVjdDtcblxuICAgICAgICBpZiAodHlwZW9mIGVmZmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhciBjbGVhbnVwRm4gPSBlZmZlY3Qoe1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZhciBub29wRm4gPSBmdW5jdGlvbiBub29wRm4oKSB7fTtcblxuICAgICAgICAgIGVmZmVjdENsZWFudXBGbnMucHVzaChjbGVhbnVwRm4gfHwgbm9vcEZuKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpIHtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICB9KTtcbiAgICAgIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH07XG59XG5leHBvcnQgdmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3IoKTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBkZXRlY3RPdmVyZmxvdyB9OyIsImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgdG9wOiByZWN0LnRvcCxcbiAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICBib3R0b206IHJlY3QuYm90dG9tLFxuICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICB4OiByZWN0LmxlZnQsXG4gICAgeTogcmVjdC50b3BcbiAgfTtcbn0iLCJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpIDogaXNIVE1MRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpO1xuICAgIGFjY1JlY3QudG9wID0gbWF4KHJlY3QudG9wLCBhY2NSZWN0LnRvcCk7XG4gICAgYWNjUmVjdC5yaWdodCA9IG1pbihyZWN0LnJpZ2h0LCBhY2NSZWN0LnJpZ2h0KTtcbiAgICBhY2NSZWN0LmJvdHRvbSA9IG1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IG1heChyZWN0LmxlZnQsIGFjY1JlY3QubGVmdCk7XG4gICAgcmV0dXJuIGFjY1JlY3Q7XG4gIH0sIGdldENsaWVudFJlY3RGcm9tTWl4ZWRUeXBlKGVsZW1lbnQsIGZpcnN0Q2xpcHBpbmdQYXJlbnQpKTtcbiAgY2xpcHBpbmdSZWN0LndpZHRoID0gY2xpcHBpbmdSZWN0LnJpZ2h0IC0gY2xpcHBpbmdSZWN0LmxlZnQ7XG4gIGNsaXBwaW5nUmVjdC5oZWlnaHQgPSBjbGlwcGluZ1JlY3QuYm90dG9tIC0gY2xpcHBpbmdSZWN0LnRvcDtcbiAgY2xpcHBpbmdSZWN0LnggPSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LnkgPSBjbGlwcGluZ1JlY3QudG9wO1xuICByZXR1cm4gY2xpcHBpbmdSZWN0O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7IC8vIFJldHVybnMgdGhlIGNvbXBvc2l0ZSByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50KTtcbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn0iLCJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCJpbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCB7IG1heCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIEdldHMgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGRvY3VtZW50IGFyZWEsIGV2ZW4gZXh0ZW5kaW5nIG91dHNpZGVcbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgdmFyIHdpblNjcm9sbCA9IGdldFdpbmRvd1Njcm9sbChlbGVtZW50KTtcbiAgdmFyIGJvZHkgPSAoX2VsZW1lbnQkb3duZXJEb2N1bWVuID0gZWxlbWVudC5vd25lckRvY3VtZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2VsZW1lbnQkb3duZXJEb2N1bWVuLmJvZHk7XG4gIHZhciB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIHZhciBoZWlnaHQgPSBtYXgoaHRtbC5zY3JvbGxIZWlnaHQsIGh0bWwuY2xpZW50SGVpZ2h0LCBib2R5ID8gYm9keS5zY3JvbGxIZWlnaHQgOiAwLCBib2R5ID8gYm9keS5jbGllbnRIZWlnaHQgOiAwKTtcbiAgdmFyIHggPSAtd2luU2Nyb2xsLnNjcm9sbExlZnQgKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpO1xuICB2YXIgeSA9IC13aW5TY3JvbGwuc2Nyb2xsVG9wO1xuXG4gIGlmIChnZXRDb21wdXRlZFN0eWxlKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhUTUxFbGVtZW50U2Nyb2xsKGVsZW1lbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnNjcm9sbExlZnQsXG4gICAgc2Nyb2xsVG9wOiBlbGVtZW50LnNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7IC8vIFJldHVybnMgdGhlIGxheW91dCByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC4gTGF5b3V0XG4vLyBtZWFucyBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRyYW5zZm9ybXMuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICB2YXIgY2xpZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTsgLy8gVXNlIHRoZSBjbGllbnRSZWN0IHNpemVzIGlmIGl0J3Mgbm90IGJlZW4gdHJhbnNmb3JtZWQuXG4gIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTIyM1xuXG4gIHZhciB3aWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICBpZiAoTWF0aC5hYnMoY2xpZW50UmVjdC53aWR0aCAtIHdpZHRoKSA8PSAxKSB7XG4gICAgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoO1xuICB9XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3QuaGVpZ2h0IC0gaGVpZ2h0KSA8PSAxKSB7XG4gICAgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsImltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBnZXRIVE1MRWxlbWVudFNjcm9sbCBmcm9tIFwiLi9nZXRIVE1MRWxlbWVudFNjcm9sbC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Tm9kZVNjcm9sbChub2RlKSB7XG4gIGlmIChub2RlID09PSBnZXRXaW5kb3cobm9kZSkgfHwgIWlzSFRNTEVsZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsKG5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRIVE1MRWxlbWVudFNjcm9sbChub2RlKTtcbiAgfVxufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgaXNUYWJsZUVsZW1lbnQgZnJvbSBcIi4vaXNUYWJsZUVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzgzN1xuICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59IC8vIGAub2Zmc2V0UGFyZW50YCByZXBvcnRzIGBudWxsYCBmb3IgZml4ZWQgZWxlbWVudHMsIHdoaWxlIGFic29sdXRlIGVsZW1lbnRzXG4vLyByZXR1cm4gdGhlIGNvbnRhaW5pbmcgYmxvY2tcblxuXG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICB2YXIgaXNGaXJlZm94ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2ZpcmVmb3gnKSAhPT0gLTE7XG4gIHZhciBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50JykgIT09IC0xO1xuXG4gIGlmIChpc0lFICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBJbiBJRSA5LCAxMCBhbmQgMTEgZml4ZWQgZWxlbWVudHMgY29udGFpbmluZyBibG9jayBpcyBhbHdheXMgZXN0YWJsaXNoZWQgYnkgdGhlIHZpZXdwb3J0XG4gICAgdmFyIGVsZW1lbnRDc3MgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuXG4gICAgaWYgKGVsZW1lbnRDc3MucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjdXJyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoZWxlbWVudCk7XG5cbiAgd2hpbGUgKGlzSFRNTEVsZW1lbnQoY3VycmVudE5vZGUpICYmIFsnaHRtbCcsICdib2R5J10uaW5kZXhPZihnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpIDwgMCkge1xuICAgIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTsgLy8gVGhpcyBpcyBub24tZXhoYXVzdGl2ZSBidXQgY292ZXJzIHRoZSBtb3N0IGNvbW1vbiBDU1MgcHJvcGVydGllcyB0aGF0XG4gICAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuXG4gICAgaWYgKGNzcy50cmFuc2Zvcm0gIT09ICdub25lJyB8fCBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fCBjc3MuY29udGFpbiA9PT0gJ3BhaW50JyB8fCBbJ3RyYW5zZm9ybScsICdwZXJzcGVjdGl2ZSddLmluZGV4T2YoY3NzLndpbGxDaGFuZ2UpICE9PSAtMSB8fCBpc0ZpcmVmb3ggJiYgY3NzLndpbGxDaGFuZ2UgPT09ICdmaWx0ZXInIHx8IGlzRmlyZWZveCAmJiBjc3MuZmlsdGVyICYmIGNzcy5maWx0ZXIgIT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCk7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UGFyZW50ICYmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnaHRtbCcgfHwgZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2JvZHknICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbmRvdztcbn0iLCJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudEVsZW1lbnQgZnJvbSBcIi4vZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgeyBpc1NoYWRvd1Jvb3QgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRQYXJlbnROb2RlKGVsZW1lbnQpIHtcbiAgaWYgKGdldE5vZGVOYW1lKGVsZW1lbnQpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dXG4gICAgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG4gICAgZWxlbWVudC5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBlbGVtZW50LnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChlbGVtZW50KSA/IGVsZW1lbnQuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYWxsXTogSFRNTEVsZW1lbnQgaXMgYSBOb2RlXG4gICAgZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIC8vIGZhbGxiYWNrXG5cbiAgKTtcbn0iLCJpbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufSIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDsgLy8gTkI6IFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIG9uIGlPUyA8PSAxMi4gSWYgdGhlIGtleWJvYXJkIGlzIG9wZW4sIHRoZSBwb3BwZXJcbiAgLy8gY2FuIGJlIG9ic2N1cmVkIHVuZGVybmVhdGggaXQuXG4gIC8vIEFsc28sIGBodG1sLmNsaWVudEhlaWdodGAgYWRkcyB0aGUgYm90dG9tIGJhciBoZWlnaHQgaW4gU2FmYXJpIGlPUywgZXZlblxuICAvLyBpZiBpdCBpc24ndCBvcGVuLCBzbyBpZiB0aGlzIGlzbid0IGF2YWlsYWJsZSwgdGhlIHBvcHBlciB3aWxsIGJlIGRldGVjdGVkXG4gIC8vIHRvIG92ZXJmbG93IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiB0b28gZWFybHkuXG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7IC8vIFVzZXMgTGF5b3V0IFZpZXdwb3J0IChsaWtlIENocm9tZTsgU2FmYXJpIGRvZXMgbm90IGN1cnJlbnRseSlcbiAgICAvLyBJbiBDaHJvbWUsIGl0IHJldHVybnMgYSB2YWx1ZSB2ZXJ5IGNsb3NlIHRvIDAgKCsvLSkgYnV0IGNvbnRhaW5zIHJvdW5kaW5nXG4gICAgLy8gZXJyb3JzIGR1ZSB0byBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHByZWNpc2lvbi5cbiAgICAvLyBTYWZhcmkgcmV0dXJucyBhIG51bWJlciA8PSAwLCB1c3VhbGx5IDwgLTEgd2hlbiBwaW5jaC16b29tZWRcbiAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmYWlscyBpbiBtb2JpbGUgZW11bGF0aW9uIG1vZGUgaW4gQ2hyb21lLlxuICAgIC8vIE1hdGguYWJzKHdpbi5pbm5lcldpZHRoIC8gdmlzdWFsVmlld3BvcnQuc2NhbGUgLSB2aXN1YWxWaWV3cG9ydC53aWR0aCkgPFxuICAgIC8vIDAuMDAxXG4gICAgLy8gRmFsbGJhY2sgaGVyZTogXCJOb3QgU2FmYXJpXCIgdXNlckFnZW50XG5cbiAgICBpZiAoIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3cgOiB3aW5kb3c7XG4gIH1cblxuICByZXR1cm4gbm9kZTtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCkge1xuICAvLyBJZiA8aHRtbD4gaGFzIGEgQ1NTIHdpZHRoIGdyZWF0ZXIgdGhhbiB0aGUgdmlld3BvcnQsIHRoZW4gdGhpcyB3aWxsIGJlXG4gIC8vIGluY29ycmVjdCBmb3IgUlRMLlxuICAvLyBQb3BwZXIgMSBpcyBicm9rZW4gaW4gdGhpcyBjYXNlIGFuZCBuZXZlciBoYWQgYSBidWcgcmVwb3J0IHNvIGxldCdzIGFzc3VtZVxuICAvLyBpdCdzIG5vdCBhbiBpc3N1ZS4gSSBkb24ndCB0aGluayBhbnlvbmUgZXZlciBzcGVjaWZpZXMgd2lkdGggb24gPGh0bWw+XG4gIC8vIGFueXdheS5cbiAgLy8gQnJvd3NlcnMgd2hlcmUgdGhlIGxlZnQgc2Nyb2xsYmFyIGRvZXNuJ3QgY2F1c2UgYW4gaXNzdWUgcmVwb3J0IGAwYCBmb3JcbiAgLy8gdGhpcyAoZS5nLiBFZGdlIDIwMTksIElFMTEsIFNhZmFyaSlcbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCkuc2Nyb2xsTGVmdDtcbn0iLCJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCJpbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc1RhYmxlRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBbJ3RhYmxlJywgJ3RkJywgJ3RoJ10uaW5kZXhPZihnZXROb2RlTmFtZShlbGVtZW50KSkgPj0gMDtcbn0iLCJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwiZXhwb3J0IHZhciB0b3AgPSAndG9wJztcbmV4cG9ydCB2YXIgYm90dG9tID0gJ2JvdHRvbSc7XG5leHBvcnQgdmFyIHJpZ2h0ID0gJ3JpZ2h0JztcbmV4cG9ydCB2YXIgbGVmdCA9ICdsZWZ0JztcbmV4cG9ydCB2YXIgYXV0byA9ICdhdXRvJztcbmV4cG9ydCB2YXIgYmFzZVBsYWNlbWVudHMgPSBbdG9wLCBib3R0b20sIHJpZ2h0LCBsZWZ0XTtcbmV4cG9ydCB2YXIgc3RhcnQgPSAnc3RhcnQnO1xuZXhwb3J0IHZhciBlbmQgPSAnZW5kJztcbmV4cG9ydCB2YXIgY2xpcHBpbmdQYXJlbnRzID0gJ2NsaXBwaW5nUGFyZW50cyc7XG5leHBvcnQgdmFyIHZpZXdwb3J0ID0gJ3ZpZXdwb3J0JztcbmV4cG9ydCB2YXIgcG9wcGVyID0gJ3BvcHBlcic7XG5leHBvcnQgdmFyIHJlZmVyZW5jZSA9ICdyZWZlcmVuY2UnO1xuZXhwb3J0IHZhciB2YXJpYXRpb25QbGFjZW1lbnRzID0gLyojX19QVVJFX18qL2Jhc2VQbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCArIFwiLVwiICsgc3RhcnQsIHBsYWNlbWVudCArIFwiLVwiICsgZW5kXSk7XG59LCBbXSk7XG5leHBvcnQgdmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxuZXhwb3J0IHZhciBiZWZvcmVSZWFkID0gJ2JlZm9yZVJlYWQnO1xuZXhwb3J0IHZhciByZWFkID0gJ3JlYWQnO1xuZXhwb3J0IHZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxuZXhwb3J0IHZhciBiZWZvcmVNYWluID0gJ2JlZm9yZU1haW4nO1xuZXhwb3J0IHZhciBtYWluID0gJ21haW4nO1xuZXhwb3J0IHZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG5leHBvcnQgdmFyIGJlZm9yZVdyaXRlID0gJ2JlZm9yZVdyaXRlJztcbmV4cG9ydCB2YXIgd3JpdGUgPSAnd3JpdGUnO1xuZXhwb3J0IHZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xuZXhwb3J0IHZhciBtb2RpZmllclBoYXNlcyA9IFtiZWZvcmVSZWFkLCByZWFkLCBhZnRlclJlYWQsIGJlZm9yZU1haW4sIG1haW4sIGFmdGVyTWFpbiwgYmVmb3JlV3JpdGUsIHdyaXRlLCBhZnRlcldyaXRlXTsiLCJleHBvcnQgKiBmcm9tIFwiLi9lbnVtcy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kaWZpZXJzL2luZGV4LmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdywgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckJhc2UgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgfSBmcm9tIFwiLi9wb3BwZXIuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIgYXMgY3JlYXRlUG9wcGVyTGl0ZSB9IGZyb20gXCIuL3BvcHBlci1saXRlLmpzXCI7IiwiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi4vZG9tLXV0aWxzL2NvbnRhaW5zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB3aXRoaW4gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIGVsZW1lbnQgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCAobm90IGFuIFNWR0VsZW1lbnQpLicsICdUbyB1c2UgYW4gU1ZHIGFycm93LCB3cmFwIGl0IGluIGFuIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzJywgJ3RoZSBhcnJvdy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLCAnZWxlbWVudC4nXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0T2Zmc2V0UGFyZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQocm91bmQoeCAqIGRwcikgLyBkcHIpIHx8IDAsXG4gICAgeTogcm91bmQocm91bmQoeSAqIGRwcikgLyBkcHIpIHx8IDBcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvU3R5bGVzKF9yZWYyKSB7XG4gIHZhciBfT2JqZWN0JGFzc2lnbjI7XG5cbiAgdmFyIHBvcHBlciA9IF9yZWYyLnBvcHBlcixcbiAgICAgIHBvcHBlclJlY3QgPSBfcmVmMi5wb3BwZXJSZWN0LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZjIucGxhY2VtZW50LFxuICAgICAgb2Zmc2V0cyA9IF9yZWYyLm9mZnNldHMsXG4gICAgICBwb3NpdGlvbiA9IF9yZWYyLnBvc2l0aW9uLFxuICAgICAgZ3B1QWNjZWxlcmF0aW9uID0gX3JlZjIuZ3B1QWNjZWxlcmF0aW9uLFxuICAgICAgYWRhcHRpdmUgPSBfcmVmMi5hZGFwdGl2ZSxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9yZWYyLnJvdW5kT2Zmc2V0cztcblxuICB2YXIgX3JlZjMgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUihvZmZzZXRzKSA6IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMob2Zmc2V0cykgOiBvZmZzZXRzLFxuICAgICAgX3JlZjMkeCA9IF9yZWYzLngsXG4gICAgICB4ID0gX3JlZjMkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYzJHgsXG4gICAgICBfcmVmMyR5ID0gX3JlZjMueSxcbiAgICAgIHkgPSBfcmVmMyR5ID09PSB2b2lkIDAgPyAwIDogX3JlZjMkeTtcblxuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG4gICAgdmFyIGhlaWdodFByb3AgPSAnY2xpZW50SGVpZ2h0JztcbiAgICB2YXIgd2lkdGhQcm9wID0gJ2NsaWVudFdpZHRoJztcblxuICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IGdldFdpbmRvdyhwb3BwZXIpKSB7XG4gICAgICBvZmZzZXRQYXJlbnQgPSBnZXREb2N1bWVudEVsZW1lbnQocG9wcGVyKTtcblxuICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiAhPT0gJ3N0YXRpYycpIHtcbiAgICAgICAgaGVpZ2h0UHJvcCA9ICdzY3JvbGxIZWlnaHQnO1xuICAgICAgICB3aWR0aFByb3AgPSAnc2Nyb2xsV2lkdGgnO1xuICAgICAgfVxuICAgIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FzdF06IGZvcmNlIHR5cGUgcmVmaW5lbWVudCwgd2UgY29tcGFyZSBvZmZzZXRQYXJlbnQgd2l0aCB3aW5kb3cgYWJvdmUsIGJ1dCBGbG93IGRvZXNuJ3QgZGV0ZWN0IGl0XG5cblxuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudDtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09IHRvcCkge1xuICAgICAgc2lkZVkgPSBib3R0b207IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuXG4gICAgICB5IC09IG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCkge1xuICAgICAgc2lkZVggPSByaWdodDsgLy8gJEZsb3dGaXhNZVtwcm9wLW1pc3NpbmddXG5cbiAgICAgIHggLT0gb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF0gLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPCAyID8gXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweClcIiA6IFwidHJhbnNsYXRlM2QoXCIgKyB4ICsgXCJweCwgXCIgKyB5ICsgXCJweCwgMClcIiwgX09iamVjdCRhc3NpZ24pKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWY0KSB7XG4gIHZhciBzdGF0ZSA9IF9yZWY0LnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWY0Lm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZSxcbiAgICAgIF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9IG9wdGlvbnMucm91bmRPZmZzZXRzLFxuICAgICAgcm91bmRPZmZzZXRzID0gX29wdGlvbnMkcm91bmRPZmZzZXRzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcm91bmRPZmZzZXRzO1xuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gZ2V0Q29tcHV0ZWRTdHlsZShzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLnRyYW5zaXRpb25Qcm9wZXJ0eSB8fCAnJztcblxuICAgIGlmIChhZGFwdGl2ZSAmJiBbJ3RyYW5zZm9ybScsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5zb21lKGZ1bmN0aW9uIChwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHRyYW5zaXRpb25Qcm9wZXJ0eS5pbmRleE9mKHByb3BlcnR5KSA+PSAwO1xuICAgIH0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IERldGVjdGVkIENTUyB0cmFuc2l0aW9ucyBvbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZycsICdDU1MgcHJvcGVydGllczogXCJ0cmFuc2Zvcm1cIiwgXCJ0b3BcIiwgXCJyaWdodFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIi4nLCAnXFxuXFxuJywgJ0Rpc2FibGUgdGhlIFwiY29tcHV0ZVN0eWxlc1wiIG1vZGlmaWVyXFwncyBgYWRhcHRpdmVgIG9wdGlvbiB0byBhbGxvdycsICdmb3Igc21vb3RoIHRyYW5zaXRpb25zLCBvciByZW1vdmUgdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBDU1MnLCAndHJhbnNpdGlvbiBkZWNsYXJhdGlvbiBvbiB0aGUgcG9wcGVyIGVsZW1lbnQgaWYgb25seSB0cmFuc2l0aW9uaW5nJywgJ29wYWNpdHkgb3IgYmFja2dyb3VuZC1jb2xvciBmb3IgZXhhbXBsZS4nLCAnXFxuXFxuJywgJ1dlIHJlY29tbWVuZCB1c2luZyB0aGUgcG9wcGVyIGVsZW1lbnQgYXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBpbm5lcicsICdlbGVtZW50IHRoYXQgY2FuIGhhdmUgYW55IENTUyBwcm9wZXJ0eSB0cmFuc2l0aW9uZWQgZm9yIGFuaW1hdGlvbnMuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY29tbW9uU3R5bGVzID0ge1xuICAgIHBsYWNlbWVudDogZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvblxuICB9O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zdHlsZXMucG9wcGVyLCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlLFxuICAgICAgcm91bmRPZmZzZXRzOiByb3VuZE9mZnNldHNcbiAgICB9KSkpO1xuICB9XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3cgIT0gbnVsbCkge1xuICAgIHN0YXRlLnN0eWxlcy5hcnJvdyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdywgbWFwVG9TdHlsZXMoT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCB7XG4gICAgICBvZmZzZXRzOiBzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93LFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBhZGFwdGl2ZTogZmFsc2UsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXBsYWNlbWVudCc6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ2NvbXB1dGVTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ2JlZm9yZVdyaXRlJyxcbiAgZm46IGNvbXB1dGVTdHlsZXMsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsImltcG9ydCBnZXRPcHBvc2l0ZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0T3Bwb3NpdGVQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4uL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgY29tcHV0ZUF1dG9QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyBib3R0b20sIHRvcCwgc3RhcnQsIHJpZ2h0LCBsZWZ0LCBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuLi91dGlscy9nZXRWYXJpYXRpb24uanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5mdW5jdGlvbiBnZXRFeHBhbmRlZEZhbGxiYWNrUGxhY2VtZW50cyhwbGFjZW1lbnQpIHtcbiAgaWYgKGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0bykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHZhciBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5cbmZ1bmN0aW9uIGZsaXAoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0uX3NraXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgX29wdGlvbnMkbWFpbkF4aXMgPSBvcHRpb25zLm1haW5BeGlzLFxuICAgICAgY2hlY2tNYWluQXhpcyA9IF9vcHRpb25zJG1haW5BeGlzID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkbWFpbkF4aXMsXG4gICAgICBfb3B0aW9ucyRhbHRBeGlzID0gb3B0aW9ucy5hbHRBeGlzLFxuICAgICAgY2hlY2tBbHRBeGlzID0gX29wdGlvbnMkYWx0QXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgPSBvcHRpb25zLmZhbGxiYWNrUGxhY2VtZW50cyxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9IG9wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBmbGlwVmFyaWF0aW9ucyA9IF9vcHRpb25zJGZsaXBWYXJpYXRpbyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGZsaXBWYXJpYXRpbyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IG9wdGlvbnMuYWxsb3dlZEF1dG9QbGFjZW1lbnRzO1xuICB2YXIgcHJlZmVycmVkUGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gYmFzZVBsYWNlbWVudCA9PT0gcHJlZmVycmVkUGxhY2VtZW50O1xuICB2YXIgZmFsbGJhY2tQbGFjZW1lbnRzID0gc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzIHx8IChpc0Jhc2VQbGFjZW1lbnQgfHwgIWZsaXBWYXJpYXRpb25zID8gW2dldE9wcG9zaXRlUGxhY2VtZW50KHByZWZlcnJlZFBsYWNlbWVudCldIDogZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocHJlZmVycmVkUGxhY2VtZW50KSk7XG4gIHZhciBwbGFjZW1lbnRzID0gW3ByZWZlcnJlZFBsYWNlbWVudF0uY29uY2F0KGZhbGxiYWNrUGxhY2VtZW50cykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gYXV0byA/IGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zOiBmbGlwVmFyaWF0aW9ucyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50czogYWxsb3dlZEF1dG9QbGFjZW1lbnRzXG4gICAgfSkgOiBwbGFjZW1lbnQpO1xuICB9LCBbXSk7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIGNoZWNrc01hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIG1ha2VGYWxsYmFja0NoZWNrcyA9IHRydWU7XG4gIHZhciBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRzWzBdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGxhY2VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwbGFjZW1lbnQgPSBwbGFjZW1lbnRzW2ldO1xuXG4gICAgdmFyIF9iYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuXG4gICAgdmFyIGlzU3RhcnRWYXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gc3RhcnQ7XG4gICAgdmFyIGlzVmVydGljYWwgPSBbdG9wLCBib3R0b21dLmluZGV4T2YoX2Jhc2VQbGFjZW1lbnQpID49IDA7XG4gICAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gICAgdmFyIG92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeTogYWx0Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSk7XG4gICAgdmFyIG1haW5WYXJpYXRpb25TaWRlID0gaXNWZXJ0aWNhbCA/IGlzU3RhcnRWYXJpYXRpb24gPyByaWdodCA6IGxlZnQgOiBpc1N0YXJ0VmFyaWF0aW9uID8gYm90dG9tIDogdG9wO1xuXG4gICAgaWYgKHJlZmVyZW5jZVJlY3RbbGVuXSA+IHBvcHBlclJlY3RbbGVuXSkge1xuICAgICAgbWFpblZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgfVxuXG4gICAgdmFyIGFsdFZhcmlhdGlvblNpZGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChtYWluVmFyaWF0aW9uU2lkZSk7XG4gICAgdmFyIGNoZWNrcyA9IFtdO1xuXG4gICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgIGNoZWNrcy5wdXNoKG92ZXJmbG93W19iYXNlUGxhY2VtZW50XSA8PSAwKTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1ttYWluVmFyaWF0aW9uU2lkZV0gPD0gMCwgb3ZlcmZsb3dbYWx0VmFyaWF0aW9uU2lkZV0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrcy5ldmVyeShmdW5jdGlvbiAoY2hlY2spIHtcbiAgICAgIHJldHVybiBjaGVjaztcbiAgICB9KSkge1xuICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgbWFrZUZhbGxiYWNrQ2hlY2tzID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjaGVja3NNYXAuc2V0KHBsYWNlbWVudCwgY2hlY2tzKTtcbiAgfVxuXG4gIGlmIChtYWtlRmFsbGJhY2tDaGVja3MpIHtcbiAgICAvLyBgMmAgbWF5IGJlIGRlc2lyZWQgaW4gc29tZSBjYXNlcyDigJMgcmVzZWFyY2ggbGF0ZXJcbiAgICB2YXIgbnVtYmVyT2ZDaGVja3MgPSBmbGlwVmFyaWF0aW9ucyA/IDMgOiAxO1xuXG4gICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3AoX2kpIHtcbiAgICAgIHZhciBmaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50cy5maW5kKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICAgICAgdmFyIGNoZWNrcyA9IGNoZWNrc01hcC5nZXQocGxhY2VtZW50KTtcblxuICAgICAgICBpZiAoY2hlY2tzKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrcy5zbGljZSgwLCBfaSkuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICAgICAgICByZXR1cm4gY2hlY2s7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZml0dGluZ1BsYWNlbWVudCkge1xuICAgICAgICBmaXJzdEZpdHRpbmdQbGFjZW1lbnQgPSBmaXR0aW5nUGxhY2VtZW50O1xuICAgICAgICByZXR1cm4gXCJicmVha1wiO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKHZhciBfaSA9IG51bWJlck9mQ2hlY2tzOyBfaSA+IDA7IF9pLS0pIHtcbiAgICAgIHZhciBfcmV0ID0gX2xvb3AoX2kpO1xuXG4gICAgICBpZiAoX3JldCA9PT0gXCJicmVha1wiKSBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUucGxhY2VtZW50ICE9PSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwID0gdHJ1ZTtcbiAgICBzdGF0ZS5wbGFjZW1lbnQgPSBmaXJzdEZpdHRpbmdQbGFjZW1lbnQ7XG4gICAgc3RhdGUucmVzZXQgPSB0cnVlO1xuICB9XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdmbGlwJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGZsaXAsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsnb2Zmc2V0J10sXG4gIGRhdGE6IHtcbiAgICBfc2tpcDogZmFsc2VcbiAgfVxufTsiLCJpbXBvcnQgeyB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QsIHByZXZlbnRlZE9mZnNldHMpIHtcbiAgaWYgKHByZXZlbnRlZE9mZnNldHMgPT09IHZvaWQgMCkge1xuICAgIHByZXZlbnRlZE9mZnNldHMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRvcDogb3ZlcmZsb3cudG9wIC0gcmVjdC5oZWlnaHQgLSBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgcmlnaHQ6IG92ZXJmbG93LnJpZ2h0IC0gcmVjdC53aWR0aCArIHByZXZlbnRlZE9mZnNldHMueCxcbiAgICBib3R0b206IG92ZXJmbG93LmJvdHRvbSAtIHJlY3QuaGVpZ2h0ICsgcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIGxlZnQ6IG92ZXJmbG93LmxlZnQgLSByZWN0LndpZHRoIC0gcHJldmVudGVkT2Zmc2V0cy54XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChvdmVyZmxvdykge1xuICByZXR1cm4gW3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdF0uc29tZShmdW5jdGlvbiAoc2lkZSkge1xuICAgIHJldHVybiBvdmVyZmxvd1tzaWRlXSA+PSAwO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gaGlkZShfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBwcmV2ZW50ZWRPZmZzZXRzID0gc3RhdGUubW9kaWZpZXJzRGF0YS5wcmV2ZW50T3ZlcmZsb3c7XG4gIHZhciByZWZlcmVuY2VPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgZWxlbWVudENvbnRleHQ6ICdyZWZlcmVuY2UnXG4gIH0pO1xuICB2YXIgcG9wcGVyQWx0T3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGFsdEJvdW5kYXJ5OiB0cnVlXG4gIH0pO1xuICB2YXIgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocmVmZXJlbmNlT3ZlcmZsb3csIHJlZmVyZW5jZVJlY3QpO1xuICB2YXIgcG9wcGVyRXNjYXBlT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHBvcHBlckFsdE92ZXJmbG93LCBwb3BwZXJSZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKTtcbiAgdmFyIGlzUmVmZXJlbmNlSGlkZGVuID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyk7XG4gIHZhciBoYXNQb3BwZXJFc2NhcGVkID0gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKHBvcHBlckVzY2FwZU9mZnNldHMpO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0ge1xuICAgIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0czogcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzLFxuICAgIHBvcHBlckVzY2FwZU9mZnNldHM6IHBvcHBlckVzY2FwZU9mZnNldHMsXG4gICAgaXNSZWZlcmVuY2VIaWRkZW46IGlzUmVmZXJlbmNlSGlkZGVuLFxuICAgIGhhc1BvcHBlckVzY2FwZWQ6IGhhc1BvcHBlckVzY2FwZWRcbiAgfTtcbiAgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciwge1xuICAgICdkYXRhLXBvcHBlci1yZWZlcmVuY2UtaGlkZGVuJzogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgJ2RhdGEtcG9wcGVyLWVzY2FwZWQnOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59OyIsImV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwbHlTdHlsZXMgfSBmcm9tIFwiLi9hcHBseVN0eWxlcy5qc1wiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcnJvdyB9IGZyb20gXCIuL2Fycm93LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGNvbXB1dGVTdHlsZXMgfSBmcm9tIFwiLi9jb21wdXRlU3R5bGVzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGV2ZW50TGlzdGVuZXJzIH0gZnJvbSBcIi4vZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZmxpcCB9IGZyb20gXCIuL2ZsaXAuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgaGlkZSB9IGZyb20gXCIuL2hpZGUuanNcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb2Zmc2V0IH0gZnJvbSBcIi4vb2Zmc2V0LmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBvcHBlck9mZnNldHMgfSBmcm9tIFwiLi9wb3BwZXJPZmZzZXRzLmpzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHByZXZlbnRPdmVyZmxvdyB9IGZyb20gXCIuL3ByZXZlbnRPdmVyZmxvdy5qc1wiOyIsImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCByZWN0cywgb2Zmc2V0KSB7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICB2YXIgaW52ZXJ0RGlzdGFuY2UgPSBbbGVmdCwgdG9wXS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyAtMSA6IDE7XG5cbiAgdmFyIF9yZWYgPSB0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gb2Zmc2V0KE9iamVjdC5hc3NpZ24oe30sIHJlY3RzLCB7XG4gICAgcGxhY2VtZW50OiBwbGFjZW1lbnRcbiAgfSkpIDogb2Zmc2V0LFxuICAgICAgc2tpZGRpbmcgPSBfcmVmWzBdLFxuICAgICAgZGlzdGFuY2UgPSBfcmVmWzFdO1xuXG4gIHNraWRkaW5nID0gc2tpZGRpbmcgfHwgMDtcbiAgZGlzdGFuY2UgPSAoZGlzdGFuY2UgfHwgMCkgKiBpbnZlcnREaXN0YW5jZTtcbiAgcmV0dXJuIFtsZWZ0LCByaWdodF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8ge1xuICAgIHg6IGRpc3RhbmNlLFxuICAgIHk6IHNraWRkaW5nXG4gIH0gOiB7XG4gICAgeDogc2tpZGRpbmcsXG4gICAgeTogZGlzdGFuY2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gb2Zmc2V0KF9yZWYyKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYyLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZjIubmFtZTtcbiAgdmFyIF9vcHRpb25zJG9mZnNldCA9IG9wdGlvbnMub2Zmc2V0LFxuICAgICAgb2Zmc2V0ID0gX29wdGlvbnMkb2Zmc2V0ID09PSB2b2lkIDAgPyBbMCwgMF0gOiBfb3B0aW9ucyRvZmZzZXQ7XG4gIHZhciBkYXRhID0gcGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkaXN0YW5jZUFuZFNraWRkaW5nVG9YWShwbGFjZW1lbnQsIHN0YXRlLnJlY3RzLCBvZmZzZXQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgdmFyIF9kYXRhJHN0YXRlJHBsYWNlbWVudCA9IGRhdGFbc3RhdGUucGxhY2VtZW50XSxcbiAgICAgIHggPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueCxcbiAgICAgIHkgPSBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQueTtcblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzICE9IG51bGwpIHtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueCArPSB4O1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy55ICs9IHk7XG4gIH1cblxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gZGF0YTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbmFtZTogJ29mZnNldCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzOiBbJ3BvcHBlck9mZnNldHMnXSxcbiAgZm46IG9mZnNldFxufTsiLCJpbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4uL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5cbmZ1bmN0aW9uIHBvcHBlck9mZnNldHMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgLy8gT2Zmc2V0cyBhcmUgdGhlIGFjdHVhbCBwb3NpdGlvbiB0aGUgcG9wcGVyIG5lZWRzIHRvIGhhdmUgdG8gYmVcbiAgLy8gcHJvcGVybHkgcG9zaXRpb25lZCBuZWFyIGl0cyByZWZlcmVuY2UgZWxlbWVudFxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHBsYWNlbWVudCwgYW5kIHdpbGwgYmUgYWRqdXN0ZWQgYnlcbiAgLy8gdGhlIG1vZGlmaWVycyBpbiB0aGUgbmV4dCBzdGVwXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBjb21wdXRlT2Zmc2V0cyh7XG4gICAgcmVmZXJlbmNlOiBzdGF0ZS5yZWN0cy5yZWZlcmVuY2UsXG4gICAgZWxlbWVudDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAncG9wcGVyT2Zmc2V0cycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAncmVhZCcsXG4gIGZuOiBwb3BwZXJPZmZzZXRzLFxuICBkYXRhOiB7fVxufTsiLCJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHN0YXJ0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QWx0QXhpcyBmcm9tIFwiLi4vdXRpbHMvZ2V0QWx0QXhpcy5qc1wiO1xuaW1wb3J0IHdpdGhpbiBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMgfHwgY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIG1haW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/IHRvcCA6IGxlZnQ7XG4gICAgdmFyIGFsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gYm90dG9tIDogcmlnaHQ7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgdmFyIG9mZnNldCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdO1xuICAgIHZhciBtaW4gPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gLSBvdmVyZmxvd1thbHRTaWRlXTtcbiAgICB2YXIgYWRkaXRpdmUgPSB0ZXRoZXIgPyAtcG9wcGVyUmVjdFtsZW5dIC8gMiA6IDA7XG4gICAgdmFyIG1pbkxlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gOiBwb3BwZXJSZWN0W2xlbl07XG4gICAgdmFyIG1heExlbiA9IHZhcmlhdGlvbiA9PT0gc3RhcnQgPyAtcG9wcGVyUmVjdFtsZW5dIDogLXJlZmVyZW5jZVJlY3RbbGVuXTsgLy8gV2UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcnJvdyBpbiB0aGUgY2FsY3VsYXRpb24gc28gdGhlIGFycm93IGRvZXNuJ3QgZ29cbiAgICAvLyBvdXRzaWRlIHRoZSByZWZlcmVuY2UgYm91bmRzXG5cbiAgICB2YXIgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3c7XG4gICAgdmFyIGFycm93UmVjdCA9IHRldGhlciAmJiBhcnJvd0VsZW1lbnQgPyBnZXRMYXlvdXRSZWN0KGFycm93RWxlbWVudCkgOiB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgdmFyIGFycm93UGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXSA/IHN0YXRlLm1vZGlmaWVyc0RhdGFbJ2Fycm93I3BlcnNpc3RlbnQnXS5wYWRkaW5nIDogZ2V0RnJlc2hTaWRlT2JqZWN0KCk7XG4gICAgdmFyIGFycm93UGFkZGluZ01pbiA9IGFycm93UGFkZGluZ09iamVjdFttYWluU2lkZV07XG4gICAgdmFyIGFycm93UGFkZGluZ01heCA9IGFycm93UGFkZGluZ09iamVjdFthbHRTaWRlXTsgLy8gSWYgdGhlIHJlZmVyZW5jZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBhcnJvdyBsZW5ndGgsIHdlIGRvbid0IHdhbnRcbiAgICAvLyB0byBpbmNsdWRlIGl0cyBmdWxsIHNpemUgaW4gdGhlIGNhbGN1bGF0aW9uLiBJZiB0aGUgcmVmZXJlbmNlIGlzIHNtYWxsXG4gICAgLy8gYW5kIG5lYXIgdGhlIGVkZ2Ugb2YgYSBib3VuZGFyeSwgdGhlIHBvcHBlciBjYW4gb3ZlcmZsb3cgZXZlbiBpZiB0aGVcbiAgICAvLyByZWZlcmVuY2UgaXMgbm90IG92ZXJmbG93aW5nIGFzIHdlbGwgKGUuZy4gdmlydHVhbCBlbGVtZW50cyB3aXRoIG5vXG4gICAgLy8gd2lkdGggb3IgaGVpZ2h0KVxuXG4gICAgdmFyIGFycm93TGVuID0gd2l0aGluKDAsIHJlZmVyZW5jZVJlY3RbbGVuXSwgYXJyb3dSZWN0W2xlbl0pO1xuICAgIHZhciBtaW5PZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyByZWZlcmVuY2VSZWN0W2xlbl0gLyAyIC0gYWRkaXRpdmUgLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIHRldGhlck9mZnNldFZhbHVlIDogbWluTGVuIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSB0ZXRoZXJPZmZzZXRWYWx1ZTtcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgdGV0aGVyT2Zmc2V0VmFsdWUgOiBtYXhMZW4gKyBhcnJvd0xlbiArIGFycm93UGFkZGluZ01heCArIHRldGhlck9mZnNldFZhbHVlO1xuICAgIHZhciBhcnJvd09mZnNldFBhcmVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93ICYmIGdldE9mZnNldFBhcmVudChzdGF0ZS5lbGVtZW50cy5hcnJvdyk7XG4gICAgdmFyIGNsaWVudE9mZnNldCA9IGFycm93T2Zmc2V0UGFyZW50ID8gbWFpbkF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFRvcCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50TGVmdCB8fCAwIDogMDtcbiAgICB2YXIgb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0ID8gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXRbc3RhdGUucGxhY2VtZW50XVttYWluQXhpc10gOiAwO1xuICAgIHZhciB0ZXRoZXJNaW4gPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSArIG1pbk9mZnNldCAtIG9mZnNldE1vZGlmaWVyVmFsdWUgLSBjbGllbnRPZmZzZXQ7XG4gICAgdmFyIHRldGhlck1heCA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICAgIHBvcHBlck9mZnNldHNbbWFpbkF4aXNdID0gcHJldmVudGVkT2Zmc2V0O1xuICAgICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgICB2YXIgX2FsdFNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gYm90dG9tIDogcmlnaHQ7XG5cbiAgICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgICAgdmFyIF9tYXggPSBfb2Zmc2V0IC0gb3ZlcmZsb3dbX2FsdFNpZGVdO1xuXG4gICAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHdpdGhpbih0ZXRoZXIgPyBtYXRoTWluKF9taW4sIHRldGhlck1pbikgOiBfbWluLCBfb2Zmc2V0LCB0ZXRoZXIgPyBtYXRoTWF4KF9tYXgsIHRldGhlck1heCkgOiBfbWF4KTtcblxuICAgICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgICBkYXRhW2FsdEF4aXNdID0gX3ByZXZlbnRlZE9mZnNldCAtIF9vZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsImltcG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3cgfSBmcm9tIFwiLi9jcmVhdGVQb3BwZXIuanNcIjtcbmltcG9ydCBldmVudExpc3RlbmVycyBmcm9tIFwiLi9tb2RpZmllcnMvZXZlbnRMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCBwb3BwZXJPZmZzZXRzIGZyb20gXCIuL21vZGlmaWVycy9wb3BwZXJPZmZzZXRzLmpzXCI7XG5pbXBvcnQgY29tcHV0ZVN0eWxlcyBmcm9tIFwiLi9tb2RpZmllcnMvY29tcHV0ZVN0eWxlcy5qc1wiO1xuaW1wb3J0IGFwcGx5U3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9hcHBseVN0eWxlcy5qc1wiO1xudmFyIGRlZmF1bHRNb2RpZmllcnMgPSBbZXZlbnRMaXN0ZW5lcnMsIHBvcHBlck9mZnNldHMsIGNvbXB1dGVTdHlsZXMsIGFwcGx5U3R5bGVzXTtcbnZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKHtcbiAgZGVmYXVsdE1vZGlmaWVyczogZGVmYXVsdE1vZGlmaWVyc1xufSk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyLCBwb3BwZXJHZW5lcmF0b3IsIGRlZmF1bHRNb2RpZmllcnMsIGRldGVjdE92ZXJmbG93IH07IiwiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG5pbXBvcnQgb2Zmc2V0IGZyb20gXCIuL21vZGlmaWVycy9vZmZzZXQuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL21vZGlmaWVycy9mbGlwLmpzXCI7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gXCIuL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBhcnJvdyBmcm9tIFwiLi9tb2RpZmllcnMvYXJyb3cuanNcIjtcbmltcG9ydCBoaWRlIGZyb20gXCIuL21vZGlmaWVycy9oaWRlLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvdywgaGlkZV07XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsiLCJpbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IHsgdmFyaWF0aW9uUGxhY2VtZW50cywgYmFzZVBsYWNlbWVudHMsIHBsYWNlbWVudHMgYXMgYWxsUGxhY2VtZW50cyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuL2RldGVjdE92ZXJmbG93LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBfb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMucGFkZGluZyxcbiAgICAgIGZsaXBWYXJpYXRpb25zID0gX29wdGlvbnMuZmxpcFZhcmlhdGlvbnMsXG4gICAgICBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPSBfb3B0aW9ucy5hbGxvd2VkQXV0b1BsYWNlbWVudHMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBfb3B0aW9ucyRhbGxvd2VkQXV0b1AgPT09IHZvaWQgMCA/IGFsbFBsYWNlbWVudHMgOiBfb3B0aW9ucyRhbGxvd2VkQXV0b1A7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24ocGxhY2VtZW50KTtcbiAgdmFyIHBsYWNlbWVudHMgPSB2YXJpYXRpb24gPyBmbGlwVmFyaWF0aW9ucyA/IHZhcmlhdGlvblBsYWNlbWVudHMgOiB2YXJpYXRpb25QbGFjZW1lbnRzLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpID09PSB2YXJpYXRpb247XG4gIH0pIDogYmFzZVBsYWNlbWVudHM7XG4gIHZhciBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWxsb3dlZEF1dG9QbGFjZW1lbnRzLmluZGV4T2YocGxhY2VtZW50KSA+PSAwO1xuICB9KTtcblxuICBpZiAoYWxsb3dlZFBsYWNlbWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgYWxsb3dlZFBsYWNlbWVudHMgPSBwbGFjZW1lbnRzO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogVGhlIGBhbGxvd2VkQXV0b1BsYWNlbWVudHNgIG9wdGlvbiBkaWQgbm90IGFsbG93IGFueScsICdwbGFjZW1lbnRzLiBFbnN1cmUgdGhlIGBwbGFjZW1lbnRgIG9wdGlvbiBtYXRjaGVzIHRoZSB2YXJpYXRpb24nLCAnb2YgdGhlIGFsbG93ZWQgcGxhY2VtZW50cy4nLCAnRm9yIGV4YW1wbGUsIFwiYXV0b1wiIGNhbm5vdCBiZSB1c2VkIHRvIGFsbG93IFwiYm90dG9tLXN0YXJ0XCIuJywgJ1VzZSBcImF1dG8tc3RhcnRcIiBpbnN0ZWFkLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLXR5cGVdOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn0iLCJpbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0VmFyaWF0aW9uIGZyb20gXCIuL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudCBmcm9tIFwiLi9nZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQuanNcIjtcbmltcG9ydCB7IHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgc3RhcnQsIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBvZmZzZXRzW21haW5BeGlzXSAtIChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgZW5kOlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdICsgKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0cztcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59IiwiaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldENsaXBwaW5nUmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldENsaXBwaW5nUmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGNvbXB1dGVPZmZzZXRzIGZyb20gXCIuL2NvbXB1dGVPZmZzZXRzLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi9yZWN0VG9DbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgeyBjbGlwcGluZ1BhcmVudHMsIHJlZmVyZW5jZSwgcG9wcGVyLCBib3R0b20sIHRvcCwgcmlnaHQsIGJhc2VQbGFjZW1lbnRzLCB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4uL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgbWVyZ2VQYWRkaW5nT2JqZWN0IGZyb20gXCIuL21lcmdlUGFkZGluZ09iamVjdC5qc1wiO1xuaW1wb3J0IGV4cGFuZFRvSGFzaE1hcCBmcm9tIFwiLi9leHBhbmRUb0hhc2hNYXAuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwgb3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJHBsYWNlbWVudCA9IF9vcHRpb25zLnBsYWNlbWVudCxcbiAgICAgIHBsYWNlbWVudCA9IF9vcHRpb25zJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gc3RhdGUucGxhY2VtZW50IDogX29wdGlvbnMkcGxhY2VtZW50LFxuICAgICAgX29wdGlvbnMkYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIGJvdW5kYXJ5ID0gX29wdGlvbnMkYm91bmRhcnkgPT09IHZvaWQgMCA/IGNsaXBwaW5nUGFyZW50cyA6IF9vcHRpb25zJGJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gX29wdGlvbnMkcm9vdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyB2aWV3cG9ydCA6IF9vcHRpb25zJHJvb3RCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJGVsZW1lbnRDb250ZSA9IF9vcHRpb25zLmVsZW1lbnRDb250ZXh0LFxuICAgICAgZWxlbWVudENvbnRleHQgPSBfb3B0aW9ucyRlbGVtZW50Q29udGUgPT09IHZvaWQgMCA/IHBvcHBlciA6IF9vcHRpb25zJGVsZW1lbnRDb250ZSxcbiAgICAgIF9vcHRpb25zJGFsdEJvdW5kYXJ5ID0gX29wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IF9vcHRpb25zJGFsdEJvdW5kYXJ5ID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEJvdW5kYXJ5LFxuICAgICAgX29wdGlvbnMkcGFkZGluZyA9IF9vcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG4gIHZhciBwYWRkaW5nT2JqZWN0ID0gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbiAgdmFyIGFsdENvbnRleHQgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcmVmZXJlbmNlIDogcG9wcGVyO1xuICB2YXIgcmVmZXJlbmNlRWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5KTtcbiAgdmFyIHJlZmVyZW5jZUNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QocmVmZXJlbmNlRWxlbWVudCk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmb3JtYXQoc3RyKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBbXS5jb25jYXQoYXJncykucmVkdWNlKGZ1bmN0aW9uIChwLCBjKSB7XG4gICAgcmV0dXJuIHAucmVwbGFjZSgvJXMvLCBjKTtcbiAgfSwgc3RyKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluZGV4T2YocGxhY2VtZW50KSA+PSAwID8gJ3gnIDogJ3knO1xufSIsInZhciBoYXNoID0ge1xuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnLFxuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsInZhciBoYXNoID0ge1xuICBzdGFydDogJ2VuZCcsXG4gIGVuZDogJ3N0YXJ0J1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL3N0YXJ0fGVuZC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTtcbn0iLCJleHBvcnQgdmFyIG1heCA9IE1hdGgubWF4O1xuZXhwb3J0IHZhciBtaW4gPSBNYXRoLm1pbjtcbmV4cG9ydCB2YXIgcm91bmQgPSBNYXRoLnJvdW5kOyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLCBjdXJyZW50LCB7XG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zLCBjdXJyZW50Lm9wdGlvbnMpLFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSwgY3VycmVudC5kYXRhKVxuICAgIH0pIDogY3VycmVudDtcbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9LCB7fSk7IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBPYmplY3QudmFsdWVzXG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1lcmdlZCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gbWVyZ2VkW2tleV07XG4gIH0pO1xufSIsImltcG9ydCBnZXRGcmVzaFNpZGVPYmplY3QgZnJvbSBcIi4vZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZVBhZGRpbmdPYmplY3QocGFkZGluZ09iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCksIHBhZGRpbmdPYmplY3QpO1xufSIsImltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIHNvdXJjZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDk4NzUyNTVcblxuZnVuY3Rpb24gb3JkZXIobW9kaWZpZXJzKSB7XG4gIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gIHZhciB2aXNpdGVkID0gbmV3IFNldCgpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIG1hcC5zZXQobW9kaWZpZXIubmFtZSwgbW9kaWZpZXIpO1xuICB9KTsgLy8gT24gdmlzaXRpbmcgb2JqZWN0LCBjaGVjayBmb3IgaXRzIGRlcGVuZGVuY2llcyBhbmQgdmlzaXQgdGhlbSByZWN1cnNpdmVseVxuXG4gIGZ1bmN0aW9uIHNvcnQobW9kaWZpZXIpIHtcbiAgICB2aXNpdGVkLmFkZChtb2RpZmllci5uYW1lKTtcbiAgICB2YXIgcmVxdWlyZXMgPSBbXS5jb25jYXQobW9kaWZpZXIucmVxdWlyZXMgfHwgW10sIG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMgfHwgW10pO1xuICAgIHJlcXVpcmVzLmZvckVhY2goZnVuY3Rpb24gKGRlcCkge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhkZXApKSB7XG4gICAgICAgIHZhciBkZXBNb2RpZmllciA9IG1hcC5nZXQoZGVwKTtcblxuICAgICAgICBpZiAoZGVwTW9kaWZpZXIpIHtcbiAgICAgICAgICBzb3J0KGRlcE1vZGlmaWVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc3VsdC5wdXNoKG1vZGlmaWVyKTtcbiAgfVxuXG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIGlmICghdmlzaXRlZC5oYXMobW9kaWZpZXIubmFtZSkpIHtcbiAgICAgIC8vIGNoZWNrIGZvciB2aXNpdGVkIG9iamVjdFxuICAgICAgc29ydChtb2RpZmllcik7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gb3JkZXJNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIC8vIG9yZGVyIGJhc2VkIG9uIGRlcGVuZGVuY2llc1xuICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyKG1vZGlmaWVycyk7IC8vIG9yZGVyIGJhc2VkIG9uIHBoYXNlXG5cbiAgcmV0dXJuIG1vZGlmaWVyUGhhc2VzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwaGFzZSkge1xuICAgIHJldHVybiBhY2MuY29uY2F0KG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgICAgcmV0dXJuIG1vZGlmaWVyLnBoYXNlID09PSBwaGFzZTtcbiAgICB9KSk7XG4gIH0sIFtdKTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHJlY3QsIHtcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgdG9wOiByZWN0LnksXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9KTtcbn0iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1bmlxdWVCeShhcnIsIGZuKSB7XG4gIHZhciBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTtcbiAgcmV0dXJuIGFyci5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgaWRlbnRpZmllciA9IGZuKGl0ZW0pO1xuXG4gICAgaWYgKCFpZGVudGlmaWVycy5oYXMoaWRlbnRpZmllcikpIHtcbiAgICAgIGlkZW50aWZpZXJzLmFkZChpZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG59IiwiaW1wb3J0IGZvcm1hdCBmcm9tIFwiLi9mb3JtYXQuanNcIjtcbmltcG9ydCB7IG1vZGlmaWVyUGhhc2VzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG52YXIgSU5WQUxJRF9NT0RJRklFUl9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiBwcm92aWRlZCBhbiBpbnZhbGlkICVzIHByb3BlcnR5LCBleHBlY3RlZCAlcyBidXQgZ290ICVzJztcbnZhciBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcmVxdWlyZXMgXCIlc1wiLCBidXQgXCIlc1wiIG1vZGlmaWVyIGlzIG5vdCBhdmFpbGFibGUnO1xudmFyIFZBTElEX1BST1BFUlRJRVMgPSBbJ25hbWUnLCAnZW5hYmxlZCcsICdwaGFzZScsICdmbicsICdlZmZlY3QnLCAncmVxdWlyZXMnLCAnb3B0aW9ucyddO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIE9iamVjdC5rZXlzKG1vZGlmaWVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgJ1wibmFtZVwiJywgJ1wic3RyaW5nXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5uYW1lKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5lbmFibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImVuYWJsZWRcIicsICdcImJvb2xlYW5cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmVuYWJsZWQpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICAgIGlmIChtb2RpZmllclBoYXNlcy5pbmRleE9mKG1vZGlmaWVyLnBoYXNlKSA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcInBoYXNlXCInLCBcImVpdGhlciBcIiArIG1vZGlmaWVyUGhhc2VzLmpvaW4oJywgJyksIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnBoYXNlKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZm4nOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImZuXCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlZmZlY3QnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZWZmZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJlZmZlY3RcIicsICdcImZ1bmN0aW9uXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5mbikgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzJzpcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNJZkV4aXN0cyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQb3BwZXJKUzogYW4gaW52YWxpZCBwcm9wZXJ0eSBoYXMgYmVlbiBwcm92aWRlZCB0byB0aGUgXFxcIlwiICsgbW9kaWZpZXIubmFtZSArIFwiXFxcIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgXCIgKyBWQUxJRF9QUk9QRVJUSUVTLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xuICAgICAgICAgIH0pLmpvaW4oJywgJykgKyBcIjsgYnV0IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBtb2RpZmllci5yZXF1aXJlcyAmJiBtb2RpZmllci5yZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlbWVudCkge1xuICAgICAgICBpZiAobW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICAgIHJldHVybiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQ7XG4gICAgICAgIH0pID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgcmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0iLCJpbXBvcnQgeyBtYXggYXMgbWF0aE1heCwgbWluIGFzIG1hdGhNaW4gfSBmcm9tIFwiLi9tYXRoLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG52YXIgZW52ID0gcmVxdWlyZSgnZXhlbnYnKTtcbnZhciBQcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxuLyoqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3YXMgY2hvc2VuIGJ5IHBlcmZvcm1hbmNlIGFuZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGZlZWwgZnJlZSB0byBwbGF5XG4gKiB3aXRoIGJlbmNobWFya3MgYW5kIHN1Ym1pdCBQUiB3aXRoIGZhc3RlciBhbHRlcm5hdGl2ZS4gRWFjaCBtZXRob2QgY29udGFpbnMgbGlua3MgdG8gYmVuY2htYXJrcy5cbiAqL1xudmFyIEV2ZW50U2V0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly9qc3BlcmYuY29tL3N1aXItZXZlbnRzZXQtY29uc3RydWN0b3JcbiAgICovXG4gIGZ1bmN0aW9uIEV2ZW50U2V0KGV2ZW50SGFuZGxlcnMpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRTZXQpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlcnNcIiwgdm9pZCAwKTtcblxuICAgIHRoaXMuaGFuZGxlcnMgPSBldmVudEhhbmRsZXJzLnNsaWNlKDApO1xuICB9XG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdWlyLWV2ZW50c2V0LWFkZGhhbmRsZXJzXG4gICAqL1xuXG5cbiAgX2NyZWF0ZUNsYXNzKEV2ZW50U2V0LCBbe1xuICAgIGtleTogXCJhZGRIYW5kbGVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRIYW5kbGVycyhhZGRpdGlvbmFsSGFuZGxlcnMpIHtcbiAgICAgIHZhciBuZXdIYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuc2xpY2UoMCk7XG4gICAgICB2YXIgbGVuZ3RoID0gYWRkaXRpb25hbEhhbmRsZXJzLmxlbmd0aDsgLy8gSGVhZHMgdXAhXG4gICAgICAvLyBQcmV2aW91c2x5IHdlIHVzZSBTZXQgdGhlcmUsIGl0IGdyYW50ZWQgdW5pcXVlbmVzcyBvZiBoYW5kbGVycywgbm93IGRpc3BhdGNoRXZlbnQoKSBpc1xuICAgICAgLy8gcmVzcG9uc2libGUgZm9yIHRoaXMuXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgbmV3SGFuZGxlcnMucHVzaChhZGRpdGlvbmFsSGFuZGxlcnNbaV0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEV2ZW50U2V0KG5ld0hhbmRsZXJzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2pzcGVyZi5jb20vc3Vpci1ldmVudHNldC1kaXNwYXRjaHNpbmdsZVxuICAgICAqIEBzZWUgaHR0cHM6Ly9qc3BlcmYuY29tL3N1aXItZXZlbnRzZXQtZGlzcGF0Y2htdWx0aXBsZTJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3BhdGNoRXZlbnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChldmVudCwgZGlzcGF0Y2hBbGwpIHtcbiAgICAgIHZhciBjb3VudCA9IHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcblxuICAgICAgaWYgKCFkaXNwYXRjaEFsbCkge1xuICAgICAgICAvLyBIZWFkcyB1cCFcbiAgICAgICAgLy8gV2UgZG9uJ3QgdXNlIC5wb3AoKSB0aGVyZSBiZWNhdXNlIGl0IHdpbGwgbXV0YXRlIHRoZSBhcnJheS5cbiAgICAgICAgdmFyIHJlY2VudEhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW2NvdW50XTtcbiAgICAgICAgcmVjZW50SGFuZGxlcihldmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IGNvdW50OyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnNbaV0uY2FsbGVkKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyc1tpXS5jYWxsZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuaGFuZGxlcnNbaV0oZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9pID0gY291bnQ7IF9pID49IDA7IF9pIC09IDEpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVyc1tfaV0uY2FsbGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0hhbmRsZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0hhbmRsZXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHNlZSBodHRwczovL2pzcGVyZi5jb20vc3Vpci1ldmVudHNldC1yZW1vdmVoYW5kbGVyc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlSGFuZGxlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVtb3ZlSGFuZGxlcnMocmVtb3ZhbEhhbmRsZXJzKSB7XG4gICAgICB2YXIgbmV3SGFuZGxlcnMgPSBbXTtcbiAgICAgIHZhciBsZW5ndGggPSB0aGlzLmhhbmRsZXJzLmxlbmd0aDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICB2YXIgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnNbaV07XG5cbiAgICAgICAgaWYgKHJlbW92YWxIYW5kbGVycy5pbmRleE9mKGhhbmRsZXIpID09PSAtMSkge1xuICAgICAgICAgIG5ld0hhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBFdmVudFNldChuZXdIYW5kbGVycyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV2ZW50U2V0O1xufSgpO1xuXG4vKipcbiAqIEFuIElFMTEtY29tcGF0aWJsZSBmdW5jdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdWlyLWNsb25lLW1hcFxuICovXG5mdW5jdGlvbiBjbG9uZU1hcChtYXApIHtcbiAgdmFyIG5ld01hcCA9IG5ldyBNYXAoKTtcbiAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBuZXdNYXAuc2V0KGtleSwgdmFsdWUpO1xuICB9KTtcbiAgcmV0dXJuIG5ld01hcDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhhbmRsZXJzKGhhbmRsZXJzKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGhhbmRsZXJzKSA/IGhhbmRsZXJzIDogW2hhbmRsZXJzXTtcbn1cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHRoZSBwYXNzZWQgdmFsdWUgaXMgUmVhY3QuUmVmT2JqZWN0XG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MTYuOC4yL3BhY2thZ2VzL3JlYWN0LXJlY29uY2lsZXIvc3JjL1JlYWN0RmliZXJDb21taXRXb3JrLmpzI0w2NjVcbiAqL1xuXG52YXIgaXNSZWZPYmplY3QgPSBmdW5jdGlvbiBpc1JlZk9iamVjdChyZWYgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4pIHtcbiAgcmV0dXJuIHJlZiAhPT0gbnVsbCAmJiBfdHlwZW9mKHJlZikgPT09ICdvYmplY3QnICYmIHJlZi5oYXNPd25Qcm9wZXJ0eSgnY3VycmVudCcpO1xufTtcbi8qKlxuICogTm9ybWFsaXplcyBgdGFyZ2V0YCBmb3IgRXZlbnRTdGFjaywgYmVjYXVzZSBgdGFyZ2V0YCBjYW4gYmUgcGFzc2VkIGFzIGBib29sZWFuYCBvciBgc3RyaW5nYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdWlyLW5vcm1hbGl6ZS10YXJnZXRcbiAqL1xuXG5mdW5jdGlvbiBub3JtYWxpemVUYXJnZXQodGFyZ2V0KSB7XG4gIGlmICh0YXJnZXQgPT09ICdkb2N1bWVudCcpIHJldHVybiBkb2N1bWVudDtcbiAgaWYgKHRhcmdldCA9PT0gJ3dpbmRvdycpIHJldHVybiB3aW5kb3c7XG4gIGlmIChpc1JlZk9iamVjdCh0YXJnZXQpKSByZXR1cm4gdGFyZ2V0LmN1cnJlbnQgfHwgZG9jdW1lbnQ7XG4gIHJldHVybiB0YXJnZXQgfHwgZG9jdW1lbnQ7XG59XG5cbnZhciBFdmVudFBvb2wgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFdmVudFBvb2wocG9vbE5hbWUsIGhhbmRsZXJTZXRzKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50UG9vbCk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJoYW5kbGVyU2V0c1wiLCB2b2lkIDApO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwicG9vbE5hbWVcIiwgdm9pZCAwKTtcblxuICAgIHRoaXMuaGFuZGxlclNldHMgPSBoYW5kbGVyU2V0cztcbiAgICB0aGlzLnBvb2xOYW1lID0gcG9vbE5hbWU7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRQb29sLCBbe1xuICAgIGtleTogXCJhZGRIYW5kbGVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRIYW5kbGVycyhldmVudFR5cGUsIGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVyU2V0cyA9IGNsb25lTWFwKHRoaXMuaGFuZGxlclNldHMpO1xuXG4gICAgICBpZiAoaGFuZGxlclNldHMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgdmFyIGV2ZW50U2V0ID0gaGFuZGxlclNldHMuZ2V0KGV2ZW50VHlwZSk7XG4gICAgICAgIGhhbmRsZXJTZXRzLnNldChldmVudFR5cGUsIGV2ZW50U2V0LmFkZEhhbmRsZXJzKGV2ZW50SGFuZGxlcnMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZXJTZXRzLnNldChldmVudFR5cGUsIG5ldyBFdmVudFNldChldmVudEhhbmRsZXJzKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgRXZlbnRQb29sKHRoaXMucG9vbE5hbWUsIGhhbmRsZXJTZXRzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcGF0Y2hFdmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGV2ZW50VHlwZSwgZXZlbnQpIHtcbiAgICAgIHZhciBoYW5kbGVyU2V0ID0gdGhpcy5oYW5kbGVyU2V0cy5nZXQoZXZlbnRUeXBlKTtcbiAgICAgIHZhciBzaG91bGREaXNwYXRjaEFsbCA9IHRoaXMucG9vbE5hbWUgPT09ICdkZWZhdWx0JztcblxuICAgICAgaWYgKGhhbmRsZXJTZXQpIHtcbiAgICAgICAgaGFuZGxlclNldC5kaXNwYXRjaEV2ZW50KGV2ZW50LCBzaG91bGREaXNwYXRjaEFsbCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0hhbmRsZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0hhbmRsZXJzKGV2ZW50VHlwZSkge1xuICAgICAgaWYgKCFldmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlclNldHMuc2l6ZSA+IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBldmVudFNldCA9IHRoaXMuaGFuZGxlclNldHMuZ2V0KGV2ZW50VHlwZSk7XG5cbiAgICAgIGlmIChldmVudFNldCkge1xuICAgICAgICByZXR1cm4gZXZlbnRTZXQuaGFzSGFuZGxlcnMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVIYW5kbGVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVIYW5kbGVycyhldmVudFR5cGUsIGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBoYW5kbGVyU2V0cyA9IGNsb25lTWFwKHRoaXMuaGFuZGxlclNldHMpO1xuXG4gICAgICBpZiAoIWhhbmRsZXJTZXRzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRQb29sKHRoaXMucG9vbE5hbWUsIGhhbmRsZXJTZXRzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGN1cnJlbnRTZXQgPSBoYW5kbGVyU2V0cy5nZXQoZXZlbnRUeXBlKTtcbiAgICAgIHZhciBuZXh0U2V0ID0gY3VycmVudFNldC5yZW1vdmVIYW5kbGVycyhldmVudEhhbmRsZXJzKTtcblxuICAgICAgaWYgKG5leHRTZXQuaGFzSGFuZGxlcnMoKSkge1xuICAgICAgICBoYW5kbGVyU2V0cy5zZXQoZXZlbnRUeXBlLCBuZXh0U2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZXJTZXRzLmRlbGV0ZShldmVudFR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEV2ZW50UG9vbCh0aGlzLnBvb2xOYW1lLCBoYW5kbGVyU2V0cyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV2ZW50UG9vbDtcbn0oKTtcblxuX2RlZmluZVByb3BlcnR5KEV2ZW50UG9vbCwgXCJjcmVhdGVCeVR5cGVcIiwgZnVuY3Rpb24gKHBvb2xOYW1lLCBldmVudFR5cGUsIGV2ZW50SGFuZGxlcnMpIHtcbiAgdmFyIGhhbmRsZXJTZXRzID0gbmV3IE1hcCgpO1xuICBoYW5kbGVyU2V0cy5zZXQoZXZlbnRUeXBlLCBuZXcgRXZlbnRTZXQoZXZlbnRIYW5kbGVycykpO1xuICByZXR1cm4gbmV3IEV2ZW50UG9vbChwb29sTmFtZSwgaGFuZGxlclNldHMpO1xufSk7XG5cbnZhciBFdmVudFRhcmdldCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50VGFyZ2V0KHRhcmdldCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRUYXJnZXQpO1xuXG4gICAgX2RlZmluZVByb3BlcnR5KHRoaXMsIFwiaGFuZGxlcnNcIiwgbmV3IE1hcCgpKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInBvb2xzXCIsIG5ldyBNYXAoKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0YXJnZXRcIiwgdm9pZCAwKTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNyZWF0ZUVtaXR0ZXJcIiwgZnVuY3Rpb24gKGV2ZW50VHlwZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBfdGhpcy5wb29scy5mb3JFYWNoKGZ1bmN0aW9uIChwb29sKSB7XG4gICAgICAgICAgcG9vbC5kaXNwYXRjaEV2ZW50KGV2ZW50VHlwZSwgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhFdmVudFRhcmdldCwgW3tcbiAgICBrZXk6IFwiYWRkSGFuZGxlcnNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkSGFuZGxlcnMocG9vbE5hbWUsIGV2ZW50VHlwZSwgZXZlbnRIYW5kbGVycykge1xuICAgICAgaWYgKHRoaXMucG9vbHMuaGFzKHBvb2xOYW1lKSkge1xuICAgICAgICB2YXIgZXZlbnRQb29sID0gdGhpcy5wb29scy5nZXQocG9vbE5hbWUpO1xuICAgICAgICB0aGlzLnBvb2xzLnNldChwb29sTmFtZSwgZXZlbnRQb29sLmFkZEhhbmRsZXJzKGV2ZW50VHlwZSwgZXZlbnRIYW5kbGVycykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb29scy5zZXQocG9vbE5hbWUsIEV2ZW50UG9vbC5jcmVhdGVCeVR5cGUocG9vbE5hbWUsIGV2ZW50VHlwZSwgZXZlbnRIYW5kbGVycykpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgdGhpcy5hZGRUYXJnZXRIYW5kbGVyKGV2ZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImhhc0hhbmRsZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhc0hhbmRsZXJzKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuc2l6ZSA+IDA7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlbW92ZUhhbmRsZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUhhbmRsZXJzKHBvb2xOYW1lLCBldmVudFR5cGUsIGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIGlmICghdGhpcy5wb29scy5oYXMocG9vbE5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvb2wgPSB0aGlzLnBvb2xzLmdldChwb29sTmFtZSk7XG4gICAgICB2YXIgbmV3UG9vbCA9IHBvb2wucmVtb3ZlSGFuZGxlcnMoZXZlbnRUeXBlLCBldmVudEhhbmRsZXJzKTtcblxuICAgICAgaWYgKG5ld1Bvb2wuaGFzSGFuZGxlcnMoKSkge1xuICAgICAgICB0aGlzLnBvb2xzLnNldChwb29sTmFtZSwgbmV3UG9vbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBvb2xzLmRlbGV0ZShwb29sTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBoYXNIYW5kbGVycyA9IGZhbHNlO1xuICAgICAgdGhpcy5wb29scy5mb3JFYWNoKGZ1bmN0aW9uIChwb29sKSB7XG4gICAgICAgIHJldHVybiBoYXNIYW5kbGVycyA9IGhhc0hhbmRsZXJzIHx8IHBvb2wuaGFzSGFuZGxlcnMoZXZlbnRUeXBlKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWhhc0hhbmRsZXJzKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlVGFyZ2V0SGFuZGxlcihldmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJhZGRUYXJnZXRIYW5kbGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRhcmdldEhhbmRsZXIoZXZlbnRUeXBlKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IHRoaXMuY3JlYXRlRW1pdHRlcihldmVudFR5cGUpO1xuICAgICAgdGhpcy5oYW5kbGVycy5zZXQoZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCB0cnVlKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlVGFyZ2V0SGFuZGxlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVUYXJnZXRIYW5kbGVyKGV2ZW50VHlwZSkge1xuICAgICAgaWYgKHRoaXMuaGFuZGxlcnMuaGFzKGV2ZW50VHlwZSkpIHtcbiAgICAgICAgdGhpcy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIHRoaXMuaGFuZGxlcnMuZ2V0KGV2ZW50VHlwZSksIHRydWUpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShldmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFdmVudFRhcmdldDtcbn0oKTtcblxudmFyIEV2ZW50U3RhY2sgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFdmVudFN0YWNrKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRTdGFjayk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJ0YXJnZXRzXCIsIG5ldyBNYXAoKSk7XG5cbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJnZXRUYXJnZXRcIiwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgdmFyIGF1dG9DcmVhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgICB2YXIgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVRhcmdldCh0YXJnZXQpO1xuXG4gICAgICBpZiAoX3RoaXMudGFyZ2V0cy5oYXMobm9ybWFsaXplZCkpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnRhcmdldHMuZ2V0KG5vcm1hbGl6ZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWF1dG9DcmVhdGUpIHJldHVybiBudWxsO1xuICAgICAgdmFyIGV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KG5vcm1hbGl6ZWQpO1xuXG4gICAgICBfdGhpcy50YXJnZXRzLnNldChub3JtYWxpemVkLCBldmVudFRhcmdldCk7XG5cbiAgICAgIHJldHVybiBldmVudFRhcmdldDtcbiAgICB9KTtcblxuICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInJlbW92ZVRhcmdldFwiLCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICBfdGhpcy50YXJnZXRzLmRlbGV0ZShub3JtYWxpemVUYXJnZXQodGFyZ2V0KSk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoRXZlbnRTdGFjaywgW3tcbiAgICBrZXk6IFwic3ViXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN1YihldmVudE5hbWUsIGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcbiAgICAgIGlmICghZW52LmNhblVzZURPTSkgcmV0dXJuO1xuICAgICAgdmFyIF9vcHRpb25zJHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0LFxuICAgICAgICAgIHRhcmdldCA9IF9vcHRpb25zJHRhcmdldCA9PT0gdm9pZCAwID8gZG9jdW1lbnQgOiBfb3B0aW9ucyR0YXJnZXQsXG4gICAgICAgICAgX29wdGlvbnMkcG9vbCA9IG9wdGlvbnMucG9vbCxcbiAgICAgICAgICBwb29sID0gX29wdGlvbnMkcG9vbCA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX29wdGlvbnMkcG9vbDtcbiAgICAgIHZhciBldmVudFRhcmdldCA9IHRoaXMuZ2V0VGFyZ2V0KHRhcmdldCk7XG4gICAgICBldmVudFRhcmdldC5hZGRIYW5kbGVycyhwb29sLCBldmVudE5hbWUsIG5vcm1hbGl6ZUhhbmRsZXJzKGV2ZW50SGFuZGxlcnMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidW5zdWJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5zdWIoZXZlbnROYW1lLCBldmVudEhhbmRsZXJzKSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgICBpZiAoIWVudi5jYW5Vc2VET00pIHJldHVybjtcbiAgICAgIHZhciBfb3B0aW9ucyR0YXJnZXQyID0gb3B0aW9ucy50YXJnZXQsXG4gICAgICAgICAgdGFyZ2V0ID0gX29wdGlvbnMkdGFyZ2V0MiA9PT0gdm9pZCAwID8gZG9jdW1lbnQgOiBfb3B0aW9ucyR0YXJnZXQyLFxuICAgICAgICAgIF9vcHRpb25zJHBvb2wyID0gb3B0aW9ucy5wb29sLFxuICAgICAgICAgIHBvb2wgPSBfb3B0aW9ucyRwb29sMiA9PT0gdm9pZCAwID8gJ2RlZmF1bHQnIDogX29wdGlvbnMkcG9vbDI7XG4gICAgICB2YXIgZXZlbnRUYXJnZXQgPSB0aGlzLmdldFRhcmdldCh0YXJnZXQsIGZhbHNlKTtcblxuICAgICAgaWYgKGV2ZW50VGFyZ2V0KSB7XG4gICAgICAgIGV2ZW50VGFyZ2V0LnJlbW92ZUhhbmRsZXJzKHBvb2wsIGV2ZW50TmFtZSwgbm9ybWFsaXplSGFuZGxlcnMoZXZlbnRIYW5kbGVycykpO1xuICAgICAgICBpZiAoIWV2ZW50VGFyZ2V0Lmhhc0hhbmRsZXJzKCkpIHRoaXMucmVtb3ZlVGFyZ2V0KHRhcmdldCk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV2ZW50U3RhY2s7XG59KCk7XG5cbnZhciBpbnN0YW5jZSA9IG5ldyBFdmVudFN0YWNrKCk7XG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgZXhwb3NlcyB0aGUgRXZlbnRTdGFjayBBUEkgYXMgcHVibGljIGFuZCBwcm92aWRlcyBhIGRlY2xhcmF0aXZlIHdheSB0byBtYW5hZ2UgaXQuXG4gKi9cbnZhciBFdmVudFN0YWNrJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWFjdCRQdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhFdmVudFN0YWNrLCBfUmVhY3QkUHVyZUNvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRXZlbnRTdGFjaygpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRTdGFjayk7XG5cbiAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX2dldFByb3RvdHlwZU9mKEV2ZW50U3RhY2spLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKEV2ZW50U3RhY2ssIFt7XG4gICAga2V5OiBcImNvbXBvbmVudERpZE1vdW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy5zdWJzY3JpYmUodGhpcy5wcm9wcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNvbXBvbmVudERpZFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKHByZXZQcm9wcyk7XG4gICAgICB0aGlzLnN1YnNjcmliZSh0aGlzLnByb3BzKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY29tcG9uZW50V2lsbFVubW91bnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlKHRoaXMucHJvcHMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdWJzY3JpYmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3Vic2NyaWJlKHByb3BzKSB7XG4gICAgICB2YXIgbmFtZSA9IHByb3BzLm5hbWUsXG4gICAgICAgICAgb24gPSBwcm9wcy5vbixcbiAgICAgICAgICBwb29sID0gcHJvcHMucG9vbCxcbiAgICAgICAgICB0YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gICAgICBpbnN0YW5jZS5zdWIobmFtZSwgb24sIHtcbiAgICAgICAgcG9vbDogcG9vbCxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1bnN1YnNjcmliZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1bnN1YnNjcmliZShwcm9wcykge1xuICAgICAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lLFxuICAgICAgICAgIG9uID0gcHJvcHMub24sXG4gICAgICAgICAgcG9vbCA9IHByb3BzLnBvb2wsXG4gICAgICAgICAgdGFyZ2V0ID0gcHJvcHMudGFyZ2V0O1xuICAgICAgaW5zdGFuY2UudW5zdWIobmFtZSwgb24sIHtcbiAgICAgICAgcG9vbDogcG9vbCxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV2ZW50U3RhY2s7XG59KFJlYWN0LlB1cmVDb21wb25lbnQpO1xuXG5fZGVmaW5lUHJvcGVydHkoRXZlbnRTdGFjayQxLCBcImRlZmF1bHRQcm9wc1wiLCB7XG4gIHBvb2w6ICdkZWZhdWx0JyxcbiAgdGFyZ2V0OiAnZG9jdW1lbnQnXG59KTtcbkV2ZW50U3RhY2skMS5wcm9wVHlwZXMgPSB7XG4gIC8qKiBBbiBldmVudCBuYW1lIG9uIHdoaWNoIHdlIHdpbGwgc3Vic2NyaWJlLiAqL1xuICBuYW1lOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG5cbiAgLyoqIEFuIGV2ZW50IGhhbmRsZXIgb3IgYXJyYXkgb2YgZXZlbnQgaGFuZGxlcnMuICovXG4gIG9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmZ1bmMpXSkuaXNSZXF1aXJlZCxcblxuICAvKiogQSBuYW1lIG9mIHBvb2wuICovXG4gIHBvb2w6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgRE9NIGVsZW1lbnQgb24gd2hpY2ggd2Ugd2lsbCBzdWJzY3JpYmUuICovXG4gIHRhcmdldDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFsnZG9jdW1lbnQnLCAnd2luZG93J10pLCAvLyBIZWFkcyB1cCFcbiAgLy8gVGhpcyBjb25kaXRpb24gZm9yIFNTUiBzYWZldHkuXG4gIFByb3BUeXBlcy5pbnN0YW5jZU9mKGVudi5jYW5Vc2VET00gPyBIVE1MRWxlbWVudCA6IE9iamVjdCksIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY3VycmVudDogUHJvcFR5cGVzLm9iamVjdFxuICB9KV0pXG59O1xuXG5leHBvcnRzLmluc3RhbmNlID0gaW5zdGFuY2U7XG5leHBvcnRzLmRlZmF1bHQgPSBFdmVudFN0YWNrJDE7XG4iLCJcbid1c2Ugc3RyaWN0JztcblxudmFyIHN0YWNrO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBzdGFjayA9IHJlcXVpcmUoJy4vY2pzL2V2ZW50LXN0YWNrLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIHN0YWNrID0gcmVxdWlyZSgnLi9janMvZXZlbnQtc3RhY2suZGV2ZWxvcG1lbnQuanMnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdGFjay5kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMuaW5zdGFuY2UgPSBzdGFjay5pbnN0YW5jZTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4oZnVuY3Rpb24ocm9vdCkge1xuXG4gICAgZnVuY3Rpb24gY2hlY2tJbnQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIChwYXJzZUludCh2YWx1ZSkgPT09IHZhbHVlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0ludHMoYXJyYXlpc2gpIHtcbiAgICAgICAgaWYgKCFjaGVja0ludChhcnJheWlzaC5sZW5ndGgpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlpc2gubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghY2hlY2tJbnQoYXJyYXlpc2hbaV0pIHx8IGFycmF5aXNoW2ldIDwgMCB8fCBhcnJheWlzaFtpXSA+IDI1NSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvZXJjZUFycmF5KGFyZywgY29weSkge1xuXG4gICAgICAgIC8vIEFycmF5QnVmZmVyIHZpZXdcbiAgICAgICAgaWYgKGFyZy5idWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3KGFyZykgJiYgYXJnLm5hbWUgPT09ICdVaW50OEFycmF5Jykge1xuXG4gICAgICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgICAgICAgIGlmIChhcmcuc2xpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdCdzIGFuIGFycmF5OyBjaGVjayBpdCBpcyBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgYnl0ZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrSW50cyhhcmcpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcnJheSBjb250YWlucyBpbnZhbGlkIHZhbHVlOiAnICsgYXJnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb21ldGhpbmcgZWxzZSwgYnV0IGJlaGF2ZXMgbGlrZSBhbiBhcnJheSAobWF5YmUgYSBCdWZmZXI/IEFyZ3VtZW50cz8pXG4gICAgICAgIGlmIChjaGVja0ludChhcmcubGVuZ3RoKSAmJiBjaGVja0ludHMoYXJnKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc3VwcG9ydGVkIGFycmF5LWxpa2Ugb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlQXJyYXkobGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShsZW5ndGgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2VBcnJheSwgdGFyZ2V0QXJyYXksIHRhcmdldFN0YXJ0LCBzb3VyY2VTdGFydCwgc291cmNlRW5kKSB7XG4gICAgICAgIGlmIChzb3VyY2VTdGFydCAhPSBudWxsIHx8IHNvdXJjZUVuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoc291cmNlQXJyYXkuc2xpY2UpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VBcnJheSA9IHNvdXJjZUFycmF5LnNsaWNlKHNvdXJjZVN0YXJ0LCBzb3VyY2VFbmQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VyY2VBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHNvdXJjZUFycmF5LCBzb3VyY2VTdGFydCwgc291cmNlRW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0YXJnZXRBcnJheS5zZXQoc291cmNlQXJyYXksIHRhcmdldFN0YXJ0KTtcbiAgICB9XG5cblxuXG4gICAgdmFyIGNvbnZlcnRVdGY4ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICBmdW5jdGlvbiB0b0J5dGVzKHRleHQpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXSwgaSA9IDA7XG4gICAgICAgICAgICB0ZXh0ID0gZW5jb2RlVVJJKHRleHQpO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCB0ZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KGkrKyk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBhICUgc2lnbiwgZW5jb2RlIHRoZSBmb2xsb3dpbmcgMiBieXRlcyBhcyBhIGhleCB2YWx1ZVxuICAgICAgICAgICAgICAgIGlmIChjID09PSAzNykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludCh0ZXh0LnN1YnN0cihpLCAyKSwgMTYpKVxuICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG5cbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3QgdGhlIGFjdHVhbCBieXRlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goYylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb2VyY2VBcnJheShyZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzKSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW10sIGkgPSAwO1xuXG4gICAgICAgICAgICB3aGlsZSAoaSA8IGJ5dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gYnl0ZXNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGMpKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+IDE5MSAmJiBjIDwgMjI0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMHgxZikgPDwgNikgfCAoYnl0ZXNbaSArIDFdICYgMHgzZikpKTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMHgwZikgPDwgMTIpIHwgKChieXRlc1tpICsgMV0gJiAweDNmKSA8PCA2KSB8IChieXRlc1tpICsgMl0gJiAweDNmKSkpO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvQnl0ZXM6IHRvQnl0ZXMsXG4gICAgICAgICAgICBmcm9tQnl0ZXM6IGZyb21CeXRlcyxcbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICB2YXIgY29udmVydEhleCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgZnVuY3Rpb24gdG9CeXRlcyh0ZXh0KSB7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwYXJzZUludCh0ZXh0LnN1YnN0cihpLCAyKSwgMTYpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGh0dHA6Ly9peHRpLm5ldC9kZXZlbG9wbWVudC9qYXZhc2NyaXB0LzIwMTEvMTEvMTEvYmFzZTY0LWVuY29kZWRlY29kZS1vZi11dGY4LWluLWJyb3dzZXItd2l0aC1qcy5odG1sXG4gICAgICAgIHZhciBIZXggPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgICAgICAgZnVuY3Rpb24gZnJvbUJ5dGVzKGJ5dGVzKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBieXRlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goSGV4Wyh2ICYgMHhmMCkgPj4gNF0gKyBIZXhbdiAmIDB4MGZdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKCcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b0J5dGVzOiB0b0J5dGVzLFxuICAgICAgICAgICAgZnJvbUJ5dGVzOiBmcm9tQnl0ZXMsXG4gICAgICAgIH1cbiAgICB9KSgpO1xuXG5cbiAgICAvLyBOdW1iZXIgb2Ygcm91bmRzIGJ5IGtleXNpemVcbiAgICB2YXIgbnVtYmVyT2ZSb3VuZHMgPSB7MTY6IDEwLCAyNDogMTIsIDMyOiAxNH1cblxuICAgIC8vIFJvdW5kIGNvbnN0YW50IHdvcmRzXG4gICAgdmFyIHJjb24gPSBbMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNiwgMHg2YywgMHhkOCwgMHhhYiwgMHg0ZCwgMHg5YSwgMHgyZiwgMHg1ZSwgMHhiYywgMHg2MywgMHhjNiwgMHg5NywgMHgzNSwgMHg2YSwgMHhkNCwgMHhiMywgMHg3ZCwgMHhmYSwgMHhlZiwgMHhjNSwgMHg5MV07XG5cbiAgICAvLyBTLWJveCBhbmQgSW52ZXJzZSBTLWJveCAoUyBpcyBmb3IgU3Vic3RpdHV0aW9uKVxuICAgIHZhciBTID0gWzB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsIDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsIDB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsIDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MsIDB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUsIDB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsIDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUsIDB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAsIDB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsIDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIsIDB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YsIDB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsIDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgsIDB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUsIDB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsIDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcsIDB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMsIDB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsIDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIsIDB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMsIDB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksIDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTksIDB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgsIDB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsIDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEsIDB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUsIDB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsIDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQsIDB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYsIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTZdO1xuICAgIHZhciBTaSA9WzB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgsIDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsIDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IsIDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QsIDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUsIDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIsIDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUsIDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYsIDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIsIDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEsIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQsIDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEsIDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYsIDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIsIDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIsIDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEsIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMsIDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUsIDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUsIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODksIDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIsIDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAsIDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQsIDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEsIDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYsIDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQsIDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYsIDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAsIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEsIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2RdO1xuXG4gICAgLy8gVHJhbnNmb3JtYXRpb25zIGZvciBlbmNyeXB0aW9uXG4gICAgdmFyIFQxID0gWzB4YzY2MzYzYTUsIDB4Zjg3YzdjODQsIDB4ZWU3Nzc3OTksIDB4ZjY3YjdiOGQsIDB4ZmZmMmYyMGQsIDB4ZDY2YjZiYmQsIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQsIDB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QsIDB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEsIDB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsIDB4ODljOWM5NDAsIDB4ZmE3ZDdkODcsIDB4ZWZmYWZhMTUsIDB4YjI1OTU5ZWIsIDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIsIDB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEsIDB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsIDB4ZTQ3MjcyOTYsIDB4OWJjMGMwNWIsIDB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEsIDB4NmMzNjM2NWEsIDB4N2UzZjNmNDEsIDB4ZjVmN2Y3MDIsIDB4ODNjY2NjNGYsIDB4NjgzNDM0NWMsIDB4NTFhNWE1ZjQsIDB4ZDFlNWU1MzQsIDB4ZjlmMWYxMDgsIDB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YsIDB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUsIDB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsIDB4MGEwNTA1MGYsIDB4MmY5YTlhYjUsIDB4MGUwNzA3MDksIDB4MjQxMjEyMzYsIDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QsIDB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYsIDB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsIDB4NTgyYzJjNzQsIDB4MzQxYTFhMmUsIDB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIsIDB4YTQ1MjUyZjYsIDB4NzYzYjNiNGQsIDB4YjdkNmQ2NjEsIDB4N2RiM2IzY2UsIDB4NTIyOTI5N2IsIDB4ZGRlM2UzM2UsIDB4NWUyZjJmNzEsIDB4MTM4NDg0OTcsIDB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMsIDB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQsIDB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsIDB4NjdiZWJlZDksIDB4NzIzOTM5NGIsIDB4OTQ0YTRhZGUsIDB4OTg0YzRjZDQsIDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEsIDB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYsIDB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsIDB4NjYzMzMzNTUsIDB4MTE4NTg1OTQsIDB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEsIDB4YTA1MDUwZjAsIDB4NzgzYzNjNDQsIDB4MjU5ZjlmYmEsIDB4NGJhOGE4ZTMsIDB4YTI1MTUxZjMsIDB4NWRhM2EzZmUsIDB4ODA0MDQwYzAsIDB4MDU4ZjhmOGEsIDB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQsIDB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMsIDB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsIDB4ZmRmM2YzMGUsIDB4YmZkMmQyNmQsIDB4ODFjZGNkNGMsIDB4MTgwYzBjMTQsIDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYsIDB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzksIDB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsIDB4ZmM3ZTdlODIsIDB4N2EzZDNkNDcsIDB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUsIDB4YzA2MDYwYTAsIDB4MTk4MTgxOTgsIDB4OWU0ZjRmZDEsIDB4YTNkY2RjN2YsIDB4NDQyMjIyNjYsIDB4NTQyYTJhN2UsIDB4M2I5MDkwYWIsIDB4MGI4ODg4ODMsIDB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MsIDB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYsIDB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsIDB4NzQzYTNhNGUsIDB4MTQwYTBhMWUsIDB4OTI0OTQ5ZGIsIDB4MGMwNjA2MGEsIDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQsIDB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYsIDB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsIDB4ZDNlNGU0MzcsIDB4ZjI3OTc5OGIsIDB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcsIDB4MDE4ZDhkOGMsIDB4YjFkNWQ1NjQsIDB4OWM0ZTRlZDIsIDB4NDlhOWE5ZTAsIDB4ZDg2YzZjYjQsIDB4YWM1NjU2ZmEsIDB4ZjNmNGY0MDcsIDB4Y2ZlYWVhMjUsIDB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgsIDB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIsIDB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsIDB4NzNiNGI0YzcsIDB4OTdjNmM2NTEsIDB4Y2JlOGU4MjMsIDB4YTFkZGRkN2MsIDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEsIDB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUsIDB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsIDB4NzFiNWI1YzQsIDB4Y2M2NjY2YWEsIDB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIsIDB4YzI2MTYxYTMsIDB4NmEzNTM1NWYsIDB4YWU1NzU3ZjksIDB4NjliOWI5ZDAsIDB4MTc4Njg2OTEsIDB4OTljMWMxNTgsIDB4M2ExZDFkMjcsIDB4Mjc5ZTllYjksIDB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMsIDB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcsIDB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsIDB4MTU4Nzg3OTIsIDB4YzllOWU5MjAsIDB4ODdjZWNlNDksIDB4YWE1NTU1ZmYsIDB4NTAyODI4NzgsIDB4YTVkZmRmN2EsIDB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcsIDB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgsIDB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEsIDB4N2JiMGIwY2IsIDB4YTg1NDU0ZmMsIDB4NmRiYmJiZDYsIDB4MmMxNjE2M2FdO1xuICAgIHZhciBUMiA9IFsweGE1YzY2MzYzLCAweDg0Zjg3YzdjLCAweDk5ZWU3Nzc3LCAweDhkZjY3YjdiLCAweDBkZmZmMmYyLCAweGJkZDY2YjZiLCAweGIxZGU2ZjZmLCAweDU0OTFjNWM1LCAweDUwNjAzMDMwLCAweDAzMDIwMTAxLCAweGE5Y2U2NzY3LCAweDdkNTYyYjJiLCAweDE5ZTdmZWZlLCAweDYyYjVkN2Q3LCAweGU2NGRhYmFiLCAweDlhZWM3Njc2LCAweDQ1OGZjYWNhLCAweDlkMWY4MjgyLCAweDQwODljOWM5LCAweDg3ZmE3ZDdkLCAweDE1ZWZmYWZhLCAweGViYjI1OTU5LCAweGM5OGU0NzQ3LCAweDBiZmJmMGYwLCAweGVjNDFhZGFkLCAweDY3YjNkNGQ0LCAweGZkNWZhMmEyLCAweGVhNDVhZmFmLCAweGJmMjM5YzljLCAweGY3NTNhNGE0LCAweDk2ZTQ3MjcyLCAweDViOWJjMGMwLCAweGMyNzViN2I3LCAweDFjZTFmZGZkLCAweGFlM2Q5MzkzLCAweDZhNGMyNjI2LCAweDVhNmMzNjM2LCAweDQxN2UzZjNmLCAweDAyZjVmN2Y3LCAweDRmODNjY2NjLCAweDVjNjgzNDM0LCAweGY0NTFhNWE1LCAweDM0ZDFlNWU1LCAweDA4ZjlmMWYxLCAweDkzZTI3MTcxLCAweDczYWJkOGQ4LCAweDUzNjIzMTMxLCAweDNmMmExNTE1LCAweDBjMDgwNDA0LCAweDUyOTVjN2M3LCAweDY1NDYyMzIzLCAweDVlOWRjM2MzLCAweDI4MzAxODE4LCAweGExMzc5Njk2LCAweDBmMGEwNTA1LCAweGI1MmY5YTlhLCAweDA5MGUwNzA3LCAweDM2MjQxMjEyLCAweDliMWI4MDgwLCAweDNkZGZlMmUyLCAweDI2Y2RlYmViLCAweDY5NGUyNzI3LCAweGNkN2ZiMmIyLCAweDlmZWE3NTc1LCAweDFiMTIwOTA5LCAweDllMWQ4MzgzLCAweDc0NTgyYzJjLCAweDJlMzQxYTFhLCAweDJkMzYxYjFiLCAweGIyZGM2ZTZlLCAweGVlYjQ1YTVhLCAweGZiNWJhMGEwLCAweGY2YTQ1MjUyLCAweDRkNzYzYjNiLCAweDYxYjdkNmQ2LCAweGNlN2RiM2IzLCAweDdiNTIyOTI5LCAweDNlZGRlM2UzLCAweDcxNWUyZjJmLCAweDk3MTM4NDg0LCAweGY1YTY1MzUzLCAweDY4YjlkMWQxLCAweDAwMDAwMDAwLCAweDJjYzFlZGVkLCAweDYwNDAyMDIwLCAweDFmZTNmY2ZjLCAweGM4NzliMWIxLCAweGVkYjY1YjViLCAweGJlZDQ2YTZhLCAweDQ2OGRjYmNiLCAweGQ5NjdiZWJlLCAweDRiNzIzOTM5LCAweGRlOTQ0YTRhLCAweGQ0OTg0YzRjLCAweGU4YjA1ODU4LCAweDRhODVjZmNmLCAweDZiYmJkMGQwLCAweDJhYzVlZmVmLCAweGU1NGZhYWFhLCAweDE2ZWRmYmZiLCAweGM1ODY0MzQzLCAweGQ3OWE0ZDRkLCAweDU1NjYzMzMzLCAweDk0MTE4NTg1LCAweGNmOGE0NTQ1LCAweDEwZTlmOWY5LCAweDA2MDQwMjAyLCAweDgxZmU3ZjdmLCAweGYwYTA1MDUwLCAweDQ0NzgzYzNjLCAweGJhMjU5ZjlmLCAweGUzNGJhOGE4LCAweGYzYTI1MTUxLCAweGZlNWRhM2EzLCAweGMwODA0MDQwLCAweDhhMDU4ZjhmLCAweGFkM2Y5MjkyLCAweGJjMjE5ZDlkLCAweDQ4NzAzODM4LCAweDA0ZjFmNWY1LCAweGRmNjNiY2JjLCAweGMxNzdiNmI2LCAweDc1YWZkYWRhLCAweDYzNDIyMTIxLCAweDMwMjAxMDEwLCAweDFhZTVmZmZmLCAweDBlZmRmM2YzLCAweDZkYmZkMmQyLCAweDRjODFjZGNkLCAweDE0MTgwYzBjLCAweDM1MjYxMzEzLCAweDJmYzNlY2VjLCAweGUxYmU1ZjVmLCAweGEyMzU5Nzk3LCAweGNjODg0NDQ0LCAweDM5MmUxNzE3LCAweDU3OTNjNGM0LCAweGYyNTVhN2E3LCAweDgyZmM3ZTdlLCAweDQ3N2EzZDNkLCAweGFjYzg2NDY0LCAweGU3YmE1ZDVkLCAweDJiMzIxOTE5LCAweDk1ZTY3MzczLCAweGEwYzA2MDYwLCAweDk4MTk4MTgxLCAweGQxOWU0ZjRmLCAweDdmYTNkY2RjLCAweDY2NDQyMjIyLCAweDdlNTQyYTJhLCAweGFiM2I5MDkwLCAweDgzMGI4ODg4LCAweGNhOGM0NjQ2LCAweDI5YzdlZWVlLCAweGQzNmJiOGI4LCAweDNjMjgxNDE0LCAweDc5YTdkZWRlLCAweGUyYmM1ZTVlLCAweDFkMTYwYjBiLCAweDc2YWRkYmRiLCAweDNiZGJlMGUwLCAweDU2NjQzMjMyLCAweDRlNzQzYTNhLCAweDFlMTQwYTBhLCAweGRiOTI0OTQ5LCAweDBhMGMwNjA2LCAweDZjNDgyNDI0LCAweGU0Yjg1YzVjLCAweDVkOWZjMmMyLCAweDZlYmRkM2QzLCAweGVmNDNhY2FjLCAweGE2YzQ2MjYyLCAweGE4Mzk5MTkxLCAweGE0MzE5NTk1LCAweDM3ZDNlNGU0LCAweDhiZjI3OTc5LCAweDMyZDVlN2U3LCAweDQzOGJjOGM4LCAweDU5NmUzNzM3LCAweGI3ZGE2ZDZkLCAweDhjMDE4ZDhkLCAweDY0YjFkNWQ1LCAweGQyOWM0ZTRlLCAweGUwNDlhOWE5LCAweGI0ZDg2YzZjLCAweGZhYWM1NjU2LCAweDA3ZjNmNGY0LCAweDI1Y2ZlYWVhLCAweGFmY2E2NTY1LCAweDhlZjQ3YTdhLCAweGU5NDdhZWFlLCAweDE4MTAwODA4LCAweGQ1NmZiYWJhLCAweDg4ZjA3ODc4LCAweDZmNGEyNTI1LCAweDcyNWMyZTJlLCAweDI0MzgxYzFjLCAweGYxNTdhNmE2LCAweGM3NzNiNGI0LCAweDUxOTdjNmM2LCAweDIzY2JlOGU4LCAweDdjYTFkZGRkLCAweDljZTg3NDc0LCAweDIxM2UxZjFmLCAweGRkOTY0YjRiLCAweGRjNjFiZGJkLCAweDg2MGQ4YjhiLCAweDg1MGY4YThhLCAweDkwZTA3MDcwLCAweDQyN2MzZTNlLCAweGM0NzFiNWI1LCAweGFhY2M2NjY2LCAweGQ4OTA0ODQ4LCAweDA1MDYwMzAzLCAweDAxZjdmNmY2LCAweDEyMWMwZTBlLCAweGEzYzI2MTYxLCAweDVmNmEzNTM1LCAweGY5YWU1NzU3LCAweGQwNjliOWI5LCAweDkxMTc4Njg2LCAweDU4OTljMWMxLCAweDI3M2ExZDFkLCAweGI5Mjc5ZTllLCAweDM4ZDllMWUxLCAweDEzZWJmOGY4LCAweGIzMmI5ODk4LCAweDMzMjIxMTExLCAweGJiZDI2OTY5LCAweDcwYTlkOWQ5LCAweDg5MDc4ZThlLCAweGE3MzM5NDk0LCAweGI2MmQ5YjliLCAweDIyM2MxZTFlLCAweDkyMTU4Nzg3LCAweDIwYzllOWU5LCAweDQ5ODdjZWNlLCAweGZmYWE1NTU1LCAweDc4NTAyODI4LCAweDdhYTVkZmRmLCAweDhmMDM4YzhjLCAweGY4NTlhMWExLCAweDgwMDk4OTg5LCAweDE3MWEwZDBkLCAweGRhNjViZmJmLCAweDMxZDdlNmU2LCAweGM2ODQ0MjQyLCAweGI4ZDA2ODY4LCAweGMzODI0MTQxLCAweGIwMjk5OTk5LCAweDc3NWEyZDJkLCAweDExMWUwZjBmLCAweGNiN2JiMGIwLCAweGZjYTg1NDU0LCAweGQ2NmRiYmJiLCAweDNhMmMxNjE2XTtcbiAgICB2YXIgVDMgPSBbMHg2M2E1YzY2MywgMHg3Yzg0Zjg3YywgMHg3Nzk5ZWU3NywgMHg3YjhkZjY3YiwgMHhmMjBkZmZmMiwgMHg2YmJkZDY2YiwgMHg2ZmIxZGU2ZiwgMHhjNTU0OTFjNSwgMHgzMDUwNjAzMCwgMHgwMTAzMDIwMSwgMHg2N2E5Y2U2NywgMHgyYjdkNTYyYiwgMHhmZTE5ZTdmZSwgMHhkNzYyYjVkNywgMHhhYmU2NGRhYiwgMHg3NjlhZWM3NiwgMHhjYTQ1OGZjYSwgMHg4MjlkMWY4MiwgMHhjOTQwODljOSwgMHg3ZDg3ZmE3ZCwgMHhmYTE1ZWZmYSwgMHg1OWViYjI1OSwgMHg0N2M5OGU0NywgMHhmMDBiZmJmMCwgMHhhZGVjNDFhZCwgMHhkNDY3YjNkNCwgMHhhMmZkNWZhMiwgMHhhZmVhNDVhZiwgMHg5Y2JmMjM5YywgMHhhNGY3NTNhNCwgMHg3Mjk2ZTQ3MiwgMHhjMDViOWJjMCwgMHhiN2MyNzViNywgMHhmZDFjZTFmZCwgMHg5M2FlM2Q5MywgMHgyNjZhNGMyNiwgMHgzNjVhNmMzNiwgMHgzZjQxN2UzZiwgMHhmNzAyZjVmNywgMHhjYzRmODNjYywgMHgzNDVjNjgzNCwgMHhhNWY0NTFhNSwgMHhlNTM0ZDFlNSwgMHhmMTA4ZjlmMSwgMHg3MTkzZTI3MSwgMHhkODczYWJkOCwgMHgzMTUzNjIzMSwgMHgxNTNmMmExNSwgMHgwNDBjMDgwNCwgMHhjNzUyOTVjNywgMHgyMzY1NDYyMywgMHhjMzVlOWRjMywgMHgxODI4MzAxOCwgMHg5NmExMzc5NiwgMHgwNTBmMGEwNSwgMHg5YWI1MmY5YSwgMHgwNzA5MGUwNywgMHgxMjM2MjQxMiwgMHg4MDliMWI4MCwgMHhlMjNkZGZlMiwgMHhlYjI2Y2RlYiwgMHgyNzY5NGUyNywgMHhiMmNkN2ZiMiwgMHg3NTlmZWE3NSwgMHgwOTFiMTIwOSwgMHg4MzllMWQ4MywgMHgyYzc0NTgyYywgMHgxYTJlMzQxYSwgMHgxYjJkMzYxYiwgMHg2ZWIyZGM2ZSwgMHg1YWVlYjQ1YSwgMHhhMGZiNWJhMCwgMHg1MmY2YTQ1MiwgMHgzYjRkNzYzYiwgMHhkNjYxYjdkNiwgMHhiM2NlN2RiMywgMHgyOTdiNTIyOSwgMHhlMzNlZGRlMywgMHgyZjcxNWUyZiwgMHg4NDk3MTM4NCwgMHg1M2Y1YTY1MywgMHhkMTY4YjlkMSwgMHgwMDAwMDAwMCwgMHhlZDJjYzFlZCwgMHgyMDYwNDAyMCwgMHhmYzFmZTNmYywgMHhiMWM4NzliMSwgMHg1YmVkYjY1YiwgMHg2YWJlZDQ2YSwgMHhjYjQ2OGRjYiwgMHhiZWQ5NjdiZSwgMHgzOTRiNzIzOSwgMHg0YWRlOTQ0YSwgMHg0Y2Q0OTg0YywgMHg1OGU4YjA1OCwgMHhjZjRhODVjZiwgMHhkMDZiYmJkMCwgMHhlZjJhYzVlZiwgMHhhYWU1NGZhYSwgMHhmYjE2ZWRmYiwgMHg0M2M1ODY0MywgMHg0ZGQ3OWE0ZCwgMHgzMzU1NjYzMywgMHg4NTk0MTE4NSwgMHg0NWNmOGE0NSwgMHhmOTEwZTlmOSwgMHgwMjA2MDQwMiwgMHg3ZjgxZmU3ZiwgMHg1MGYwYTA1MCwgMHgzYzQ0NzgzYywgMHg5ZmJhMjU5ZiwgMHhhOGUzNGJhOCwgMHg1MWYzYTI1MSwgMHhhM2ZlNWRhMywgMHg0MGMwODA0MCwgMHg4ZjhhMDU4ZiwgMHg5MmFkM2Y5MiwgMHg5ZGJjMjE5ZCwgMHgzODQ4NzAzOCwgMHhmNTA0ZjFmNSwgMHhiY2RmNjNiYywgMHhiNmMxNzdiNiwgMHhkYTc1YWZkYSwgMHgyMTYzNDIyMSwgMHgxMDMwMjAxMCwgMHhmZjFhZTVmZiwgMHhmMzBlZmRmMywgMHhkMjZkYmZkMiwgMHhjZDRjODFjZCwgMHgwYzE0MTgwYywgMHgxMzM1MjYxMywgMHhlYzJmYzNlYywgMHg1ZmUxYmU1ZiwgMHg5N2EyMzU5NywgMHg0NGNjODg0NCwgMHgxNzM5MmUxNywgMHhjNDU3OTNjNCwgMHhhN2YyNTVhNywgMHg3ZTgyZmM3ZSwgMHgzZDQ3N2EzZCwgMHg2NGFjYzg2NCwgMHg1ZGU3YmE1ZCwgMHgxOTJiMzIxOSwgMHg3Mzk1ZTY3MywgMHg2MGEwYzA2MCwgMHg4MTk4MTk4MSwgMHg0ZmQxOWU0ZiwgMHhkYzdmYTNkYywgMHgyMjY2NDQyMiwgMHgyYTdlNTQyYSwgMHg5MGFiM2I5MCwgMHg4ODgzMGI4OCwgMHg0NmNhOGM0NiwgMHhlZTI5YzdlZSwgMHhiOGQzNmJiOCwgMHgxNDNjMjgxNCwgMHhkZTc5YTdkZSwgMHg1ZWUyYmM1ZSwgMHgwYjFkMTYwYiwgMHhkYjc2YWRkYiwgMHhlMDNiZGJlMCwgMHgzMjU2NjQzMiwgMHgzYTRlNzQzYSwgMHgwYTFlMTQwYSwgMHg0OWRiOTI0OSwgMHgwNjBhMGMwNiwgMHgyNDZjNDgyNCwgMHg1Y2U0Yjg1YywgMHhjMjVkOWZjMiwgMHhkMzZlYmRkMywgMHhhY2VmNDNhYywgMHg2MmE2YzQ2MiwgMHg5MWE4Mzk5MSwgMHg5NWE0MzE5NSwgMHhlNDM3ZDNlNCwgMHg3OThiZjI3OSwgMHhlNzMyZDVlNywgMHhjODQzOGJjOCwgMHgzNzU5NmUzNywgMHg2ZGI3ZGE2ZCwgMHg4ZDhjMDE4ZCwgMHhkNTY0YjFkNSwgMHg0ZWQyOWM0ZSwgMHhhOWUwNDlhOSwgMHg2Y2I0ZDg2YywgMHg1NmZhYWM1NiwgMHhmNDA3ZjNmNCwgMHhlYTI1Y2ZlYSwgMHg2NWFmY2E2NSwgMHg3YThlZjQ3YSwgMHhhZWU5NDdhZSwgMHgwODE4MTAwOCwgMHhiYWQ1NmZiYSwgMHg3ODg4ZjA3OCwgMHgyNTZmNGEyNSwgMHgyZTcyNWMyZSwgMHgxYzI0MzgxYywgMHhhNmYxNTdhNiwgMHhiNGM3NzNiNCwgMHhjNjUxOTdjNiwgMHhlODIzY2JlOCwgMHhkZDdjYTFkZCwgMHg3NDljZTg3NCwgMHgxZjIxM2UxZiwgMHg0YmRkOTY0YiwgMHhiZGRjNjFiZCwgMHg4Yjg2MGQ4YiwgMHg4YTg1MGY4YSwgMHg3MDkwZTA3MCwgMHgzZTQyN2MzZSwgMHhiNWM0NzFiNSwgMHg2NmFhY2M2NiwgMHg0OGQ4OTA0OCwgMHgwMzA1MDYwMywgMHhmNjAxZjdmNiwgMHgwZTEyMWMwZSwgMHg2MWEzYzI2MSwgMHgzNTVmNmEzNSwgMHg1N2Y5YWU1NywgMHhiOWQwNjliOSwgMHg4NjkxMTc4NiwgMHhjMTU4OTljMSwgMHgxZDI3M2ExZCwgMHg5ZWI5Mjc5ZSwgMHhlMTM4ZDllMSwgMHhmODEzZWJmOCwgMHg5OGIzMmI5OCwgMHgxMTMzMjIxMSwgMHg2OWJiZDI2OSwgMHhkOTcwYTlkOSwgMHg4ZTg5MDc4ZSwgMHg5NGE3MzM5NCwgMHg5YmI2MmQ5YiwgMHgxZTIyM2MxZSwgMHg4NzkyMTU4NywgMHhlOTIwYzllOSwgMHhjZTQ5ODdjZSwgMHg1NWZmYWE1NSwgMHgyODc4NTAyOCwgMHhkZjdhYTVkZiwgMHg4YzhmMDM4YywgMHhhMWY4NTlhMSwgMHg4OTgwMDk4OSwgMHgwZDE3MWEwZCwgMHhiZmRhNjViZiwgMHhlNjMxZDdlNiwgMHg0MmM2ODQ0MiwgMHg2OGI4ZDA2OCwgMHg0MWMzODI0MSwgMHg5OWIwMjk5OSwgMHgyZDc3NWEyZCwgMHgwZjExMWUwZiwgMHhiMGNiN2JiMCwgMHg1NGZjYTg1NCwgMHhiYmQ2NmRiYiwgMHgxNjNhMmMxNl07XG4gICAgdmFyIFQ0ID0gWzB4NjM2M2E1YzYsIDB4N2M3Yzg0ZjgsIDB4Nzc3Nzk5ZWUsIDB4N2I3YjhkZjYsIDB4ZjJmMjBkZmYsIDB4NmI2YmJkZDYsIDB4NmY2ZmIxZGUsIDB4YzVjNTU0OTEsIDB4MzAzMDUwNjAsIDB4MDEwMTAzMDIsIDB4Njc2N2E5Y2UsIDB4MmIyYjdkNTYsIDB4ZmVmZTE5ZTcsIDB4ZDdkNzYyYjUsIDB4YWJhYmU2NGQsIDB4NzY3NjlhZWMsIDB4Y2FjYTQ1OGYsIDB4ODI4MjlkMWYsIDB4YzljOTQwODksIDB4N2Q3ZDg3ZmEsIDB4ZmFmYTE1ZWYsIDB4NTk1OWViYjIsIDB4NDc0N2M5OGUsIDB4ZjBmMDBiZmIsIDB4YWRhZGVjNDEsIDB4ZDRkNDY3YjMsIDB4YTJhMmZkNWYsIDB4YWZhZmVhNDUsIDB4OWM5Y2JmMjMsIDB4YTRhNGY3NTMsIDB4NzI3Mjk2ZTQsIDB4YzBjMDViOWIsIDB4YjdiN2MyNzUsIDB4ZmRmZDFjZTEsIDB4OTM5M2FlM2QsIDB4MjYyNjZhNGMsIDB4MzYzNjVhNmMsIDB4M2YzZjQxN2UsIDB4ZjdmNzAyZjUsIDB4Y2NjYzRmODMsIDB4MzQzNDVjNjgsIDB4YTVhNWY0NTEsIDB4ZTVlNTM0ZDEsIDB4ZjFmMTA4ZjksIDB4NzE3MTkzZTIsIDB4ZDhkODczYWIsIDB4MzEzMTUzNjIsIDB4MTUxNTNmMmEsIDB4MDQwNDBjMDgsIDB4YzdjNzUyOTUsIDB4MjMyMzY1NDYsIDB4YzNjMzVlOWQsIDB4MTgxODI4MzAsIDB4OTY5NmExMzcsIDB4MDUwNTBmMGEsIDB4OWE5YWI1MmYsIDB4MDcwNzA5MGUsIDB4MTIxMjM2MjQsIDB4ODA4MDliMWIsIDB4ZTJlMjNkZGYsIDB4ZWJlYjI2Y2QsIDB4MjcyNzY5NGUsIDB4YjJiMmNkN2YsIDB4NzU3NTlmZWEsIDB4MDkwOTFiMTIsIDB4ODM4MzllMWQsIDB4MmMyYzc0NTgsIDB4MWExYTJlMzQsIDB4MWIxYjJkMzYsIDB4NmU2ZWIyZGMsIDB4NWE1YWVlYjQsIDB4YTBhMGZiNWIsIDB4NTI1MmY2YTQsIDB4M2IzYjRkNzYsIDB4ZDZkNjYxYjcsIDB4YjNiM2NlN2QsIDB4MjkyOTdiNTIsIDB4ZTNlMzNlZGQsIDB4MmYyZjcxNWUsIDB4ODQ4NDk3MTMsIDB4NTM1M2Y1YTYsIDB4ZDFkMTY4YjksIDB4MDAwMDAwMDAsIDB4ZWRlZDJjYzEsIDB4MjAyMDYwNDAsIDB4ZmNmYzFmZTMsIDB4YjFiMWM4NzksIDB4NWI1YmVkYjYsIDB4NmE2YWJlZDQsIDB4Y2JjYjQ2OGQsIDB4YmViZWQ5NjcsIDB4MzkzOTRiNzIsIDB4NGE0YWRlOTQsIDB4NGM0Y2Q0OTgsIDB4NTg1OGU4YjAsIDB4Y2ZjZjRhODUsIDB4ZDBkMDZiYmIsIDB4ZWZlZjJhYzUsIDB4YWFhYWU1NGYsIDB4ZmJmYjE2ZWQsIDB4NDM0M2M1ODYsIDB4NGQ0ZGQ3OWEsIDB4MzMzMzU1NjYsIDB4ODU4NTk0MTEsIDB4NDU0NWNmOGEsIDB4ZjlmOTEwZTksIDB4MDIwMjA2MDQsIDB4N2Y3ZjgxZmUsIDB4NTA1MGYwYTAsIDB4M2MzYzQ0NzgsIDB4OWY5ZmJhMjUsIDB4YThhOGUzNGIsIDB4NTE1MWYzYTIsIDB4YTNhM2ZlNWQsIDB4NDA0MGMwODAsIDB4OGY4ZjhhMDUsIDB4OTI5MmFkM2YsIDB4OWQ5ZGJjMjEsIDB4MzgzODQ4NzAsIDB4ZjVmNTA0ZjEsIDB4YmNiY2RmNjMsIDB4YjZiNmMxNzcsIDB4ZGFkYTc1YWYsIDB4MjEyMTYzNDIsIDB4MTAxMDMwMjAsIDB4ZmZmZjFhZTUsIDB4ZjNmMzBlZmQsIDB4ZDJkMjZkYmYsIDB4Y2RjZDRjODEsIDB4MGMwYzE0MTgsIDB4MTMxMzM1MjYsIDB4ZWNlYzJmYzMsIDB4NWY1ZmUxYmUsIDB4OTc5N2EyMzUsIDB4NDQ0NGNjODgsIDB4MTcxNzM5MmUsIDB4YzRjNDU3OTMsIDB4YTdhN2YyNTUsIDB4N2U3ZTgyZmMsIDB4M2QzZDQ3N2EsIDB4NjQ2NGFjYzgsIDB4NWQ1ZGU3YmEsIDB4MTkxOTJiMzIsIDB4NzM3Mzk1ZTYsIDB4NjA2MGEwYzAsIDB4ODE4MTk4MTksIDB4NGY0ZmQxOWUsIDB4ZGNkYzdmYTMsIDB4MjIyMjY2NDQsIDB4MmEyYTdlNTQsIDB4OTA5MGFiM2IsIDB4ODg4ODgzMGIsIDB4NDY0NmNhOGMsIDB4ZWVlZTI5YzcsIDB4YjhiOGQzNmIsIDB4MTQxNDNjMjgsIDB4ZGVkZTc5YTcsIDB4NWU1ZWUyYmMsIDB4MGIwYjFkMTYsIDB4ZGJkYjc2YWQsIDB4ZTBlMDNiZGIsIDB4MzIzMjU2NjQsIDB4M2EzYTRlNzQsIDB4MGEwYTFlMTQsIDB4NDk0OWRiOTIsIDB4MDYwNjBhMGMsIDB4MjQyNDZjNDgsIDB4NWM1Y2U0YjgsIDB4YzJjMjVkOWYsIDB4ZDNkMzZlYmQsIDB4YWNhY2VmNDMsIDB4NjI2MmE2YzQsIDB4OTE5MWE4MzksIDB4OTU5NWE0MzEsIDB4ZTRlNDM3ZDMsIDB4Nzk3OThiZjIsIDB4ZTdlNzMyZDUsIDB4YzhjODQzOGIsIDB4MzczNzU5NmUsIDB4NmQ2ZGI3ZGEsIDB4OGQ4ZDhjMDEsIDB4ZDVkNTY0YjEsIDB4NGU0ZWQyOWMsIDB4YTlhOWUwNDksIDB4NmM2Y2I0ZDgsIDB4NTY1NmZhYWMsIDB4ZjRmNDA3ZjMsIDB4ZWFlYTI1Y2YsIDB4NjU2NWFmY2EsIDB4N2E3YThlZjQsIDB4YWVhZWU5NDcsIDB4MDgwODE4MTAsIDB4YmFiYWQ1NmYsIDB4Nzg3ODg4ZjAsIDB4MjUyNTZmNGEsIDB4MmUyZTcyNWMsIDB4MWMxYzI0MzgsIDB4YTZhNmYxNTcsIDB4YjRiNGM3NzMsIDB4YzZjNjUxOTcsIDB4ZThlODIzY2IsIDB4ZGRkZDdjYTEsIDB4NzQ3NDljZTgsIDB4MWYxZjIxM2UsIDB4NGI0YmRkOTYsIDB4YmRiZGRjNjEsIDB4OGI4Yjg2MGQsIDB4OGE4YTg1MGYsIDB4NzA3MDkwZTAsIDB4M2UzZTQyN2MsIDB4YjViNWM0NzEsIDB4NjY2NmFhY2MsIDB4NDg0OGQ4OTAsIDB4MDMwMzA1MDYsIDB4ZjZmNjAxZjcsIDB4MGUwZTEyMWMsIDB4NjE2MWEzYzIsIDB4MzUzNTVmNmEsIDB4NTc1N2Y5YWUsIDB4YjliOWQwNjksIDB4ODY4NjkxMTcsIDB4YzFjMTU4OTksIDB4MWQxZDI3M2EsIDB4OWU5ZWI5MjcsIDB4ZTFlMTM4ZDksIDB4ZjhmODEzZWIsIDB4OTg5OGIzMmIsIDB4MTExMTMzMjIsIDB4Njk2OWJiZDIsIDB4ZDlkOTcwYTksIDB4OGU4ZTg5MDcsIDB4OTQ5NGE3MzMsIDB4OWI5YmI2MmQsIDB4MWUxZTIyM2MsIDB4ODc4NzkyMTUsIDB4ZTllOTIwYzksIDB4Y2VjZTQ5ODcsIDB4NTU1NWZmYWEsIDB4MjgyODc4NTAsIDB4ZGZkZjdhYTUsIDB4OGM4YzhmMDMsIDB4YTFhMWY4NTksIDB4ODk4OTgwMDksIDB4MGQwZDE3MWEsIDB4YmZiZmRhNjUsIDB4ZTZlNjMxZDcsIDB4NDI0MmM2ODQsIDB4Njg2OGI4ZDAsIDB4NDE0MWMzODIsIDB4OTk5OWIwMjksIDB4MmQyZDc3NWEsIDB4MGYwZjExMWUsIDB4YjBiMGNiN2IsIDB4NTQ1NGZjYTgsIDB4YmJiYmQ2NmQsIDB4MTYxNjNhMmNdO1xuXG4gICAgLy8gVHJhbnNmb3JtYXRpb25zIGZvciBkZWNyeXB0aW9uXG4gICAgdmFyIFQ1ID0gWzB4NTFmNGE3NTAsIDB4N2U0MTY1NTMsIDB4MWExN2E0YzMsIDB4M2EyNzVlOTYsIDB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsIDB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUsIDB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsIDB4MjYzNTQ0ODAsIDB4YjU2MmEzOGYsIDB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEsIDB4YzMyZjc1MDIsIDB4ODE0Y2YwMTIsIDB4OGQ0Njk3YTMsIDB4NmJkM2Y5YzYsIDB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsIDB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQsIDB4NzVjMjg5NmEsIDB4ZjQ4ZTc5NzgsIDB4OTk1ODNlNmIsIDB4MjdiOTcxZGQsIDB4YmVlMTRmYjYsIDB4ZjA4OGFkMTcsIDB4YzkyMGFjNjYsIDB4N2RjZTNhYjQsIDB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsIDB4YjE2NDc3ZTAsIDB4YmI2YmFlODQsIDB4ZmU4MWEwMWMsIDB4ZjkwODJiOTQsIDB4NzA0ODY4NTgsIDB4OGY0NWZkMTksIDB4OTRkZTZjODcsIDB4NTI3YmY4YjcsIDB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEsIDB4YjJlYjI4MDcsIDB4MmZiNWMyMDMsIDB4ODZjNTdiOWEsIDB4ZDMzNzA4YTUsIDB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsIDB4MDIwMzZhYmEsIDB4ZWQxNjgyNWMsIDB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsIDB4NjVkYWY0Y2QsIDB4MDYwNWJlZDUsIDB4ZDEzNDYyMWYsIDB4YzRhNmZlOGEsIDB4MzQyZTUzOWQsIDB4YTJmMzU1YTAsIDB4MDU4YWUxMzIsIDB4YTRmNmViNzUsIDB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsIDB4M2UyMThhZjksIDB4OTZkZDA2M2QsIDB4ZGQzZTA1YWUsIDB4NGRlNmJkNDYsIDB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsIDB4MDQwNmQ0NmYsIDB4NjA1MDE1ZmYsIDB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcsIDB4YjBlODQyYmQsIDB4MDc4OThiODgsIDB4ZTcxOTViMzgsIDB4NzljOGVlZGIsIDB4YTE3YzBhNDcsIDB4N2M0MjBmZTksIDB4Zjg4NDFlYzksIDB4MDAwMDAwMDAsIDB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsIDB4ZmQwZWZmZmIsIDB4MGY4NTM4NTYsIDB4M2RhZWQ1MWUsIDB4MzYyZDM5MjcsIDB4MGEwZmQ5NjQsIDB4Njg1Y2E2MjEsIDB4OWI1YjU0ZDEsIDB4MjQzNjJlM2EsIDB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsIDB4ODBjMGM1NGYsIDB4NjFkYzIwYTIsIDB4NWE3NzRiNjksIDB4MWMxMjFhMTYsIDB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsIDB4M2MyMmUwNDMsIDB4MTIxYjE3MWQsIDB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgsIDB4NTdmMTE5ODUsIDB4YWY3NTA3NGMsIDB4ZWU5OWRkYmIsIDB4YTM3ZjYwZmQsIDB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsIDB4NDQ2NjNiYzUsIDB4NWJmYjdlMzQsIDB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsIDB4ZDczMWRjY2EsIDB4NDI2Mzg1MTAsIDB4MTM5NzIyNDAsIDB4ODRjNjExMjAsIDB4ODU0YTI0N2QsIDB4ZDJiYjNkZjgsIDB4YWVmOTMyMTEsIDB4YzcyOWExNmQsIDB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsIDB4MmJiMzE2NmMsIDB4YTk3MGI5OTksIDB4MTE5NDQ4ZmEsIDB4NDdlOTY0MjIsIDB4YThmYzhjYzQsIDB4YTBmMDNmMWEsIDB4NTY3ZDJjZDgsIDB4MjIzMzkwZWYsIDB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYsIDB4YTZmNTgxY2YsIDB4YTU3YWRlMjgsIDB4ZGFiNzhlMjYsIDB4M2ZhZGJmYTQsIDB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsIDB4NmE1ZmNjOWIsIDB4NTQ3ZTQ2NjIsIDB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsIDB4OWY1ZDgwYmUsIDB4NjlkMDkzN2MsIDB4NmZkNTJkYTksIDB4Y2YyNTEyYjMsIDB4YzhhYzk5M2IsIDB4MTAxODdkYTcsIDB4ZTg5YzYzNmUsIDB4ZGIzYmJiN2IsIDB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsIDB4ZTY5NTZlNjUsIDB4YWFmZmU2N2UsIDB4MjFiY2NmMDgsIDB4ZWYxNWU4ZTYsIDB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsIDB4ZWE5ZjA5ZDQsIDB4MjliMDdjZDYsIDB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAsIDB4NzQ0ZWJjMzcsIDB4ZmM4MmNhYTYsIDB4ZTA5MGQwYjAsIDB4MzNhN2Q4MTUsIDB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsIDB4N2ZjZDUwMGUsIDB4MTc5MWY2MmYsIDB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsIDB4OWVkMWI1ZTMsIDB4NGM2YTg4MWIsIDB4YzEyYzFmYjgsIDB4NDY2NTUxN2YsIDB4OWQ1ZWVhMDQsIDB4MDE4YzM1NWQsIDB4ZmE4Nzc0NzMsIDB4ZmIwYjQxMmUsIDB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsIDB4OWFkNzYxOGMsIDB4MzdhMTBjN2EsIDB4NTlmODE0OGUsIDB4ZWIxMzNjODksIDB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsIDB4ZTExY2U1ZWQsIDB4N2E0N2IxM2MsIDB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYsIDB4NTNmN2NkZWEsIDB4NWZmZGFhNWIsIDB4ZGYzZDZmMTQsIDB4Nzg0NGRiODYsIDB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsIDB4MzgyNDM0MmMsIDB4YzJhMzQwNWYsIDB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsIDB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAsIDB4N2JjYjg0NjEsIDB4ZDUzMmI2NzAsIDB4NDg2YzVjNzQsIDB4ZDBiODU3NDJdO1xuICAgIHZhciBUNiA9IFsweDUwNTFmNGE3LCAweDUzN2U0MTY1LCAweGMzMWExN2E0LCAweDk2M2EyNzVlLCAweGNiM2JhYjZiLCAweGYxMWY5ZDQ1LCAweGFiYWNmYTU4LCAweDkzNGJlMzAzLCAweDU1MjAzMGZhLCAweGY2YWQ3NjZkLCAweDkxODhjYzc2LCAweDI1ZjUwMjRjLCAweGZjNGZlNWQ3LCAweGQ3YzUyYWNiLCAweDgwMjYzNTQ0LCAweDhmYjU2MmEzLCAweDQ5ZGViMTVhLCAweDY3MjViYTFiLCAweDk4NDVlYTBlLCAweGUxNWRmZWMwLCAweDAyYzMyZjc1LCAweDEyODE0Y2YwLCAweGEzOGQ0Njk3LCAweGM2NmJkM2Y5LCAweGU3MDM4ZjVmLCAweDk1MTU5MjljLCAweGViYmY2ZDdhLCAweGRhOTU1MjU5LCAweDJkZDRiZTgzLCAweGQzNTg3NDIxLCAweDI5NDllMDY5LCAweDQ0OGVjOWM4LCAweDZhNzVjMjg5LCAweDc4ZjQ4ZTc5LCAweDZiOTk1ODNlLCAweGRkMjdiOTcxLCAweGI2YmVlMTRmLCAweDE3ZjA4OGFkLCAweDY2YzkyMGFjLCAweGI0N2RjZTNhLCAweDE4NjNkZjRhLCAweDgyZTUxYTMxLCAweDYwOTc1MTMzLCAweDQ1NjI1MzdmLCAweGUwYjE2NDc3LCAweDg0YmI2YmFlLCAweDFjZmU4MWEwLCAweDk0ZjkwODJiLCAweDU4NzA0ODY4LCAweDE5OGY0NWZkLCAweDg3OTRkZTZjLCAweGI3NTI3YmY4LCAweDIzYWI3M2QzLCAweGUyNzI0YjAyLCAweDU3ZTMxZjhmLCAweDJhNjY1NWFiLCAweDA3YjJlYjI4LCAweDAzMmZiNWMyLCAweDlhODZjNTdiLCAweGE1ZDMzNzA4LCAweGYyMzAyODg3LCAweGIyMjNiZmE1LCAweGJhMDIwMzZhLCAweDVjZWQxNjgyLCAweDJiOGFjZjFjLCAweDkyYTc3OWI0LCAweGYwZjMwN2YyLCAweGExNGU2OWUyLCAweGNkNjVkYWY0LCAweGQ1MDYwNWJlLCAweDFmZDEzNDYyLCAweDhhYzRhNmZlLCAweDlkMzQyZTUzLCAweGEwYTJmMzU1LCAweDMyMDU4YWUxLCAweDc1YTRmNmViLCAweDM5MGI4M2VjLCAweGFhNDA2MGVmLCAweDA2NWU3MTlmLCAweDUxYmQ2ZTEwLCAweGY5M2UyMThhLCAweDNkOTZkZDA2LCAweGFlZGQzZTA1LCAweDQ2NGRlNmJkLCAweGI1OTE1NDhkLCAweDA1NzFjNDVkLCAweDZmMDQwNmQ0LCAweGZmNjA1MDE1LCAweDI0MTk5OGZiLCAweDk3ZDZiZGU5LCAweGNjODk0MDQzLCAweDc3NjdkOTllLCAweGJkYjBlODQyLCAweDg4MDc4OThiLCAweDM4ZTcxOTViLCAweGRiNzljOGVlLCAweDQ3YTE3YzBhLCAweGU5N2M0MjBmLCAweGM5Zjg4NDFlLCAweDAwMDAwMDAwLCAweDgzMDk4MDg2LCAweDQ4MzIyYmVkLCAweGFjMWUxMTcwLCAweDRlNmM1YTcyLCAweGZiZmQwZWZmLCAweDU2MGY4NTM4LCAweDFlM2RhZWQ1LCAweDI3MzYyZDM5LCAweDY0MGEwZmQ5LCAweDIxNjg1Y2E2LCAweGQxOWI1YjU0LCAweDNhMjQzNjJlLCAweGIxMGMwYTY3LCAweDBmOTM1N2U3LCAweGQyYjRlZTk2LCAweDllMWI5YjkxLCAweDRmODBjMGM1LCAweGEyNjFkYzIwLCAweDY5NWE3NzRiLCAweDE2MWMxMjFhLCAweDBhZTI5M2JhLCAweGU1YzBhMDJhLCAweDQzM2MyMmUwLCAweDFkMTIxYjE3LCAweDBiMGUwOTBkLCAweGFkZjI4YmM3LCAweGI5MmRiNmE4LCAweGM4MTQxZWE5LCAweDg1NTdmMTE5LCAweDRjYWY3NTA3LCAweGJiZWU5OWRkLCAweGZkYTM3ZjYwLCAweDlmZjcwMTI2LCAweGJjNWM3MmY1LCAweGM1NDQ2NjNiLCAweDM0NWJmYjdlLCAweDc2OGI0MzI5LCAweGRjY2IyM2M2LCAweDY4YjZlZGZjLCAweDYzYjhlNGYxLCAweGNhZDczMWRjLCAweDEwNDI2Mzg1LCAweDQwMTM5NzIyLCAweDIwODRjNjExLCAweDdkODU0YTI0LCAweGY4ZDJiYjNkLCAweDExYWVmOTMyLCAweDZkYzcyOWExLCAweDRiMWQ5ZTJmLCAweGYzZGNiMjMwLCAweGVjMGQ4NjUyLCAweGQwNzdjMWUzLCAweDZjMmJiMzE2LCAweDk5YTk3MGI5LCAweGZhMTE5NDQ4LCAweDIyNDdlOTY0LCAweGM0YThmYzhjLCAweDFhYTBmMDNmLCAweGQ4NTY3ZDJjLCAweGVmMjIzMzkwLCAweGM3ODc0OTRlLCAweGMxZDkzOGQxLCAweGZlOGNjYWEyLCAweDM2OThkNDBiLCAweGNmYTZmNTgxLCAweDI4YTU3YWRlLCAweDI2ZGFiNzhlLCAweGE0M2ZhZGJmLCAweGU0MmMzYTlkLCAweDBkNTA3ODkyLCAweDliNmE1ZmNjLCAweDYyNTQ3ZTQ2LCAweGMyZjY4ZDEzLCAweGU4OTBkOGI4LCAweDVlMmUzOWY3LCAweGY1ODJjM2FmLCAweGJlOWY1ZDgwLCAweDdjNjlkMDkzLCAweGE5NmZkNTJkLCAweGIzY2YyNTEyLCAweDNiYzhhYzk5LCAweGE3MTAxODdkLCAweDZlZTg5YzYzLCAweDdiZGIzYmJiLCAweDA5Y2QyNjc4LCAweGY0NmU1OTE4LCAweDAxZWM5YWI3LCAweGE4ODM0ZjlhLCAweDY1ZTY5NTZlLCAweDdlYWFmZmU2LCAweDA4MjFiY2NmLCAweGU2ZWYxNWU4LCAweGQ5YmFlNzliLCAweGNlNGE2ZjM2LCAweGQ0ZWE5ZjA5LCAweGQ2MjliMDdjLCAweGFmMzFhNGIyLCAweDMxMmEzZjIzLCAweDMwYzZhNTk0LCAweGMwMzVhMjY2LCAweDM3NzQ0ZWJjLCAweGE2ZmM4MmNhLCAweGIwZTA5MGQwLCAweDE1MzNhN2Q4LCAweDRhZjEwNDk4LCAweGY3NDFlY2RhLCAweDBlN2ZjZDUwLCAweDJmMTc5MWY2LCAweDhkNzY0ZGQ2LCAweDRkNDNlZmIwLCAweDU0Y2NhYTRkLCAweGRmZTQ5NjA0LCAweGUzOWVkMWI1LCAweDFiNGM2YTg4LCAweGI4YzEyYzFmLCAweDdmNDY2NTUxLCAweDA0OWQ1ZWVhLCAweDVkMDE4YzM1LCAweDczZmE4Nzc0LCAweDJlZmIwYjQxLCAweDVhYjM2NzFkLCAweDUyOTJkYmQyLCAweDMzZTkxMDU2LCAweDEzNmRkNjQ3LCAweDhjOWFkNzYxLCAweDdhMzdhMTBjLCAweDhlNTlmODE0LCAweDg5ZWIxMzNjLCAweGVlY2VhOTI3LCAweDM1Yjc2MWM5LCAweGVkZTExY2U1LCAweDNjN2E0N2IxLCAweDU5OWNkMmRmLCAweDNmNTVmMjczLCAweDc5MTgxNGNlLCAweGJmNzNjNzM3LCAweGVhNTNmN2NkLCAweDViNWZmZGFhLCAweDE0ZGYzZDZmLCAweDg2Nzg0NGRiLCAweDgxY2FhZmYzLCAweDNlYjk2OGM0LCAweDJjMzgyNDM0LCAweDVmYzJhMzQwLCAweDcyMTYxZGMzLCAweDBjYmNlMjI1LCAweDhiMjgzYzQ5LCAweDQxZmYwZDk1LCAweDcxMzlhODAxLCAweGRlMDgwY2IzLCAweDljZDhiNGU0LCAweDkwNjQ1NmMxLCAweDYxN2JjYjg0LCAweDcwZDUzMmI2LCAweDc0NDg2YzVjLCAweDQyZDBiODU3XTtcbiAgICB2YXIgVDcgPSBbMHhhNzUwNTFmNCwgMHg2NTUzN2U0MSwgMHhhNGMzMWExNywgMHg1ZTk2M2EyNywgMHg2YmNiM2JhYiwgMHg0NWYxMWY5ZCwgMHg1OGFiYWNmYSwgMHgwMzkzNGJlMywgMHhmYTU1MjAzMCwgMHg2ZGY2YWQ3NiwgMHg3NjkxODhjYywgMHg0YzI1ZjUwMiwgMHhkN2ZjNGZlNSwgMHhjYmQ3YzUyYSwgMHg0NDgwMjYzNSwgMHhhMzhmYjU2MiwgMHg1YTQ5ZGViMSwgMHgxYjY3MjViYSwgMHgwZTk4NDVlYSwgMHhjMGUxNWRmZSwgMHg3NTAyYzMyZiwgMHhmMDEyODE0YywgMHg5N2EzOGQ0NiwgMHhmOWM2NmJkMywgMHg1ZmU3MDM4ZiwgMHg5Yzk1MTU5MiwgMHg3YWViYmY2ZCwgMHg1OWRhOTU1MiwgMHg4MzJkZDRiZSwgMHgyMWQzNTg3NCwgMHg2OTI5NDllMCwgMHhjODQ0OGVjOSwgMHg4OTZhNzVjMiwgMHg3OTc4ZjQ4ZSwgMHgzZTZiOTk1OCwgMHg3MWRkMjdiOSwgMHg0ZmI2YmVlMSwgMHhhZDE3ZjA4OCwgMHhhYzY2YzkyMCwgMHgzYWI0N2RjZSwgMHg0YTE4NjNkZiwgMHgzMTgyZTUxYSwgMHgzMzYwOTc1MSwgMHg3ZjQ1NjI1MywgMHg3N2UwYjE2NCwgMHhhZTg0YmI2YiwgMHhhMDFjZmU4MSwgMHgyYjk0ZjkwOCwgMHg2ODU4NzA0OCwgMHhmZDE5OGY0NSwgMHg2Yzg3OTRkZSwgMHhmOGI3NTI3YiwgMHhkMzIzYWI3MywgMHgwMmUyNzI0YiwgMHg4ZjU3ZTMxZiwgMHhhYjJhNjY1NSwgMHgyODA3YjJlYiwgMHhjMjAzMmZiNSwgMHg3YjlhODZjNSwgMHgwOGE1ZDMzNywgMHg4N2YyMzAyOCwgMHhhNWIyMjNiZiwgMHg2YWJhMDIwMywgMHg4MjVjZWQxNiwgMHgxYzJiOGFjZiwgMHhiNDkyYTc3OSwgMHhmMmYwZjMwNywgMHhlMmExNGU2OSwgMHhmNGNkNjVkYSwgMHhiZWQ1MDYwNSwgMHg2MjFmZDEzNCwgMHhmZThhYzRhNiwgMHg1MzlkMzQyZSwgMHg1NWEwYTJmMywgMHhlMTMyMDU4YSwgMHhlYjc1YTRmNiwgMHhlYzM5MGI4MywgMHhlZmFhNDA2MCwgMHg5ZjA2NWU3MSwgMHgxMDUxYmQ2ZSwgMHg4YWY5M2UyMSwgMHgwNjNkOTZkZCwgMHgwNWFlZGQzZSwgMHhiZDQ2NGRlNiwgMHg4ZGI1OTE1NCwgMHg1ZDA1NzFjNCwgMHhkNDZmMDQwNiwgMHgxNWZmNjA1MCwgMHhmYjI0MTk5OCwgMHhlOTk3ZDZiZCwgMHg0M2NjODk0MCwgMHg5ZTc3NjdkOSwgMHg0MmJkYjBlOCwgMHg4Yjg4MDc4OSwgMHg1YjM4ZTcxOSwgMHhlZWRiNzljOCwgMHgwYTQ3YTE3YywgMHgwZmU5N2M0MiwgMHgxZWM5Zjg4NCwgMHgwMDAwMDAwMCwgMHg4NjgzMDk4MCwgMHhlZDQ4MzIyYiwgMHg3MGFjMWUxMSwgMHg3MjRlNmM1YSwgMHhmZmZiZmQwZSwgMHgzODU2MGY4NSwgMHhkNTFlM2RhZSwgMHgzOTI3MzYyZCwgMHhkOTY0MGEwZiwgMHhhNjIxNjg1YywgMHg1NGQxOWI1YiwgMHgyZTNhMjQzNiwgMHg2N2IxMGMwYSwgMHhlNzBmOTM1NywgMHg5NmQyYjRlZSwgMHg5MTllMWI5YiwgMHhjNTRmODBjMCwgMHgyMGEyNjFkYywgMHg0YjY5NWE3NywgMHgxYTE2MWMxMiwgMHhiYTBhZTI5MywgMHgyYWU1YzBhMCwgMHhlMDQzM2MyMiwgMHgxNzFkMTIxYiwgMHgwZDBiMGUwOSwgMHhjN2FkZjI4YiwgMHhhOGI5MmRiNiwgMHhhOWM4MTQxZSwgMHgxOTg1NTdmMSwgMHgwNzRjYWY3NSwgMHhkZGJiZWU5OSwgMHg2MGZkYTM3ZiwgMHgyNjlmZjcwMSwgMHhmNWJjNWM3MiwgMHgzYmM1NDQ2NiwgMHg3ZTM0NWJmYiwgMHgyOTc2OGI0MywgMHhjNmRjY2IyMywgMHhmYzY4YjZlZCwgMHhmMTYzYjhlNCwgMHhkY2NhZDczMSwgMHg4NTEwNDI2MywgMHgyMjQwMTM5NywgMHgxMTIwODRjNiwgMHgyNDdkODU0YSwgMHgzZGY4ZDJiYiwgMHgzMjExYWVmOSwgMHhhMTZkYzcyOSwgMHgyZjRiMWQ5ZSwgMHgzMGYzZGNiMiwgMHg1MmVjMGQ4NiwgMHhlM2QwNzdjMSwgMHgxNjZjMmJiMywgMHhiOTk5YTk3MCwgMHg0OGZhMTE5NCwgMHg2NDIyNDdlOSwgMHg4Y2M0YThmYywgMHgzZjFhYTBmMCwgMHgyY2Q4NTY3ZCwgMHg5MGVmMjIzMywgMHg0ZWM3ODc0OSwgMHhkMWMxZDkzOCwgMHhhMmZlOGNjYSwgMHgwYjM2OThkNCwgMHg4MWNmYTZmNSwgMHhkZTI4YTU3YSwgMHg4ZTI2ZGFiNywgMHhiZmE0M2ZhZCwgMHg5ZGU0MmMzYSwgMHg5MjBkNTA3OCwgMHhjYzliNmE1ZiwgMHg0NjYyNTQ3ZSwgMHgxM2MyZjY4ZCwgMHhiOGU4OTBkOCwgMHhmNzVlMmUzOSwgMHhhZmY1ODJjMywgMHg4MGJlOWY1ZCwgMHg5MzdjNjlkMCwgMHgyZGE5NmZkNSwgMHgxMmIzY2YyNSwgMHg5OTNiYzhhYywgMHg3ZGE3MTAxOCwgMHg2MzZlZTg5YywgMHhiYjdiZGIzYiwgMHg3ODA5Y2QyNiwgMHgxOGY0NmU1OSwgMHhiNzAxZWM5YSwgMHg5YWE4ODM0ZiwgMHg2ZTY1ZTY5NSwgMHhlNjdlYWFmZiwgMHhjZjA4MjFiYywgMHhlOGU2ZWYxNSwgMHg5YmQ5YmFlNywgMHgzNmNlNGE2ZiwgMHgwOWQ0ZWE5ZiwgMHg3Y2Q2MjliMCwgMHhiMmFmMzFhNCwgMHgyMzMxMmEzZiwgMHg5NDMwYzZhNSwgMHg2NmMwMzVhMiwgMHhiYzM3NzQ0ZSwgMHhjYWE2ZmM4MiwgMHhkMGIwZTA5MCwgMHhkODE1MzNhNywgMHg5ODRhZjEwNCwgMHhkYWY3NDFlYywgMHg1MDBlN2ZjZCwgMHhmNjJmMTc5MSwgMHhkNjhkNzY0ZCwgMHhiMDRkNDNlZiwgMHg0ZDU0Y2NhYSwgMHgwNGRmZTQ5NiwgMHhiNWUzOWVkMSwgMHg4ODFiNGM2YSwgMHgxZmI4YzEyYywgMHg1MTdmNDY2NSwgMHhlYTA0OWQ1ZSwgMHgzNTVkMDE4YywgMHg3NDczZmE4NywgMHg0MTJlZmIwYiwgMHgxZDVhYjM2NywgMHhkMjUyOTJkYiwgMHg1NjMzZTkxMCwgMHg0NzEzNmRkNiwgMHg2MThjOWFkNywgMHgwYzdhMzdhMSwgMHgxNDhlNTlmOCwgMHgzYzg5ZWIxMywgMHgyN2VlY2VhOSwgMHhjOTM1Yjc2MSwgMHhlNWVkZTExYywgMHhiMTNjN2E0NywgMHhkZjU5OWNkMiwgMHg3MzNmNTVmMiwgMHhjZTc5MTgxNCwgMHgzN2JmNzNjNywgMHhjZGVhNTNmNywgMHhhYTViNWZmZCwgMHg2ZjE0ZGYzZCwgMHhkYjg2Nzg0NCwgMHhmMzgxY2FhZiwgMHhjNDNlYjk2OCwgMHgzNDJjMzgyNCwgMHg0MDVmYzJhMywgMHhjMzcyMTYxZCwgMHgyNTBjYmNlMiwgMHg0OThiMjgzYywgMHg5NTQxZmYwZCwgMHgwMTcxMzlhOCwgMHhiM2RlMDgwYywgMHhlNDljZDhiNCwgMHhjMTkwNjQ1NiwgMHg4NDYxN2JjYiwgMHhiNjcwZDUzMiwgMHg1Yzc0NDg2YywgMHg1NzQyZDBiOF07XG4gICAgdmFyIFQ4ID0gWzB4ZjRhNzUwNTEsIDB4NDE2NTUzN2UsIDB4MTdhNGMzMWEsIDB4Mjc1ZTk2M2EsIDB4YWI2YmNiM2IsIDB4OWQ0NWYxMWYsIDB4ZmE1OGFiYWMsIDB4ZTMwMzkzNGIsIDB4MzBmYTU1MjAsIDB4NzY2ZGY2YWQsIDB4Y2M3NjkxODgsIDB4MDI0YzI1ZjUsIDB4ZTVkN2ZjNGYsIDB4MmFjYmQ3YzUsIDB4MzU0NDgwMjYsIDB4NjJhMzhmYjUsIDB4YjE1YTQ5ZGUsIDB4YmExYjY3MjUsIDB4ZWEwZTk4NDUsIDB4ZmVjMGUxNWQsIDB4MmY3NTAyYzMsIDB4NGNmMDEyODEsIDB4NDY5N2EzOGQsIDB4ZDNmOWM2NmIsIDB4OGY1ZmU3MDMsIDB4OTI5Yzk1MTUsIDB4NmQ3YWViYmYsIDB4NTI1OWRhOTUsIDB4YmU4MzJkZDQsIDB4NzQyMWQzNTgsIDB4ZTA2OTI5NDksIDB4YzljODQ0OGUsIDB4YzI4OTZhNzUsIDB4OGU3OTc4ZjQsIDB4NTgzZTZiOTksIDB4Yjk3MWRkMjcsIDB4ZTE0ZmI2YmUsIDB4ODhhZDE3ZjAsIDB4MjBhYzY2YzksIDB4Y2UzYWI0N2QsIDB4ZGY0YTE4NjMsIDB4MWEzMTgyZTUsIDB4NTEzMzYwOTcsIDB4NTM3ZjQ1NjIsIDB4NjQ3N2UwYjEsIDB4NmJhZTg0YmIsIDB4ODFhMDFjZmUsIDB4MDgyYjk0ZjksIDB4NDg2ODU4NzAsIDB4NDVmZDE5OGYsIDB4ZGU2Yzg3OTQsIDB4N2JmOGI3NTIsIDB4NzNkMzIzYWIsIDB4NGIwMmUyNzIsIDB4MWY4ZjU3ZTMsIDB4NTVhYjJhNjYsIDB4ZWIyODA3YjIsIDB4YjVjMjAzMmYsIDB4YzU3YjlhODYsIDB4MzcwOGE1ZDMsIDB4Mjg4N2YyMzAsIDB4YmZhNWIyMjMsIDB4MDM2YWJhMDIsIDB4MTY4MjVjZWQsIDB4Y2YxYzJiOGEsIDB4NzliNDkyYTcsIDB4MDdmMmYwZjMsIDB4NjllMmExNGUsIDB4ZGFmNGNkNjUsIDB4MDViZWQ1MDYsIDB4MzQ2MjFmZDEsIDB4YTZmZThhYzQsIDB4MmU1MzlkMzQsIDB4ZjM1NWEwYTIsIDB4OGFlMTMyMDUsIDB4ZjZlYjc1YTQsIDB4ODNlYzM5MGIsIDB4NjBlZmFhNDAsIDB4NzE5ZjA2NWUsIDB4NmUxMDUxYmQsIDB4MjE4YWY5M2UsIDB4ZGQwNjNkOTYsIDB4M2UwNWFlZGQsIDB4ZTZiZDQ2NGQsIDB4NTQ4ZGI1OTEsIDB4YzQ1ZDA1NzEsIDB4MDZkNDZmMDQsIDB4NTAxNWZmNjAsIDB4OThmYjI0MTksIDB4YmRlOTk3ZDYsIDB4NDA0M2NjODksIDB4ZDk5ZTc3NjcsIDB4ZTg0MmJkYjAsIDB4ODk4Yjg4MDcsIDB4MTk1YjM4ZTcsIDB4YzhlZWRiNzksIDB4N2MwYTQ3YTEsIDB4NDIwZmU5N2MsIDB4ODQxZWM5ZjgsIDB4MDAwMDAwMDAsIDB4ODA4NjgzMDksIDB4MmJlZDQ4MzIsIDB4MTE3MGFjMWUsIDB4NWE3MjRlNmMsIDB4MGVmZmZiZmQsIDB4ODUzODU2MGYsIDB4YWVkNTFlM2QsIDB4MmQzOTI3MzYsIDB4MGZkOTY0MGEsIDB4NWNhNjIxNjgsIDB4NWI1NGQxOWIsIDB4MzYyZTNhMjQsIDB4MGE2N2IxMGMsIDB4NTdlNzBmOTMsIDB4ZWU5NmQyYjQsIDB4OWI5MTllMWIsIDB4YzBjNTRmODAsIDB4ZGMyMGEyNjEsIDB4Nzc0YjY5NWEsIDB4MTIxYTE2MWMsIDB4OTNiYTBhZTIsIDB4YTAyYWU1YzAsIDB4MjJlMDQzM2MsIDB4MWIxNzFkMTIsIDB4MDkwZDBiMGUsIDB4OGJjN2FkZjIsIDB4YjZhOGI5MmQsIDB4MWVhOWM4MTQsIDB4ZjExOTg1NTcsIDB4NzUwNzRjYWYsIDB4OTlkZGJiZWUsIDB4N2Y2MGZkYTMsIDB4MDEyNjlmZjcsIDB4NzJmNWJjNWMsIDB4NjYzYmM1NDQsIDB4ZmI3ZTM0NWIsIDB4NDMyOTc2OGIsIDB4MjNjNmRjY2IsIDB4ZWRmYzY4YjYsIDB4ZTRmMTYzYjgsIDB4MzFkY2NhZDcsIDB4NjM4NTEwNDIsIDB4OTcyMjQwMTMsIDB4YzYxMTIwODQsIDB4NGEyNDdkODUsIDB4YmIzZGY4ZDIsIDB4ZjkzMjExYWUsIDB4MjlhMTZkYzcsIDB4OWUyZjRiMWQsIDB4YjIzMGYzZGMsIDB4ODY1MmVjMGQsIDB4YzFlM2QwNzcsIDB4YjMxNjZjMmIsIDB4NzBiOTk5YTksIDB4OTQ0OGZhMTEsIDB4ZTk2NDIyNDcsIDB4ZmM4Y2M0YTgsIDB4ZjAzZjFhYTAsIDB4N2QyY2Q4NTYsIDB4MzM5MGVmMjIsIDB4NDk0ZWM3ODcsIDB4MzhkMWMxZDksIDB4Y2FhMmZlOGMsIDB4ZDQwYjM2OTgsIDB4ZjU4MWNmYTYsIDB4N2FkZTI4YTUsIDB4Yjc4ZTI2ZGEsIDB4YWRiZmE0M2YsIDB4M2E5ZGU0MmMsIDB4Nzg5MjBkNTAsIDB4NWZjYzliNmEsIDB4N2U0NjYyNTQsIDB4OGQxM2MyZjYsIDB4ZDhiOGU4OTAsIDB4MzlmNzVlMmUsIDB4YzNhZmY1ODIsIDB4NWQ4MGJlOWYsIDB4ZDA5MzdjNjksIDB4ZDUyZGE5NmYsIDB4MjUxMmIzY2YsIDB4YWM5OTNiYzgsIDB4MTg3ZGE3MTAsIDB4OWM2MzZlZTgsIDB4M2JiYjdiZGIsIDB4MjY3ODA5Y2QsIDB4NTkxOGY0NmUsIDB4OWFiNzAxZWMsIDB4NGY5YWE4ODMsIDB4OTU2ZTY1ZTYsIDB4ZmZlNjdlYWEsIDB4YmNjZjA4MjEsIDB4MTVlOGU2ZWYsIDB4ZTc5YmQ5YmEsIDB4NmYzNmNlNGEsIDB4OWYwOWQ0ZWEsIDB4YjA3Y2Q2MjksIDB4YTRiMmFmMzEsIDB4M2YyMzMxMmEsIDB4YTU5NDMwYzYsIDB4YTI2NmMwMzUsIDB4NGViYzM3NzQsIDB4ODJjYWE2ZmMsIDB4OTBkMGIwZTAsIDB4YTdkODE1MzMsIDB4MDQ5ODRhZjEsIDB4ZWNkYWY3NDEsIDB4Y2Q1MDBlN2YsIDB4OTFmNjJmMTcsIDB4NGRkNjhkNzYsIDB4ZWZiMDRkNDMsIDB4YWE0ZDU0Y2MsIDB4OTYwNGRmZTQsIDB4ZDFiNWUzOWUsIDB4NmE4ODFiNGMsIDB4MmMxZmI4YzEsIDB4NjU1MTdmNDYsIDB4NWVlYTA0OWQsIDB4OGMzNTVkMDEsIDB4ODc3NDczZmEsIDB4MGI0MTJlZmIsIDB4NjcxZDVhYjMsIDB4ZGJkMjUyOTIsIDB4MTA1NjMzZTksIDB4ZDY0NzEzNmQsIDB4ZDc2MThjOWEsIDB4YTEwYzdhMzcsIDB4ZjgxNDhlNTksIDB4MTMzYzg5ZWIsIDB4YTkyN2VlY2UsIDB4NjFjOTM1YjcsIDB4MWNlNWVkZTEsIDB4NDdiMTNjN2EsIDB4ZDJkZjU5OWMsIDB4ZjI3MzNmNTUsIDB4MTRjZTc5MTgsIDB4YzczN2JmNzMsIDB4ZjdjZGVhNTMsIDB4ZmRhYTViNWYsIDB4M2Q2ZjE0ZGYsIDB4NDRkYjg2NzgsIDB4YWZmMzgxY2EsIDB4NjhjNDNlYjksIDB4MjQzNDJjMzgsIDB4YTM0MDVmYzIsIDB4MWRjMzcyMTYsIDB4ZTIyNTBjYmMsIDB4M2M0OThiMjgsIDB4MGQ5NTQxZmYsIDB4YTgwMTcxMzksIDB4MGNiM2RlMDgsIDB4YjRlNDljZDgsIDB4NTZjMTkwNjQsIDB4Y2I4NDYxN2IsIDB4MzJiNjcwZDUsIDB4NmM1Yzc0NDgsIDB4Yjg1NzQyZDBdO1xuXG4gICAgLy8gVHJhbnNmb3JtYXRpb25zIGZvciBkZWNyeXB0aW9uIGtleSBleHBhbnNpb25cbiAgICB2YXIgVTEgPSBbMHgwMDAwMDAwMCwgMHgwZTA5MGQwYiwgMHgxYzEyMWExNiwgMHgxMjFiMTcxZCwgMHgzODI0MzQyYywgMHgzNjJkMzkyNywgMHgyNDM2MmUzYSwgMHgyYTNmMjMzMSwgMHg3MDQ4Njg1OCwgMHg3ZTQxNjU1MywgMHg2YzVhNzI0ZSwgMHg2MjUzN2Y0NSwgMHg0ODZjNWM3NCwgMHg0NjY1NTE3ZiwgMHg1NDdlNDY2MiwgMHg1YTc3NGI2OSwgMHhlMDkwZDBiMCwgMHhlZTk5ZGRiYiwgMHhmYzgyY2FhNiwgMHhmMjhiYzdhZCwgMHhkOGI0ZTQ5YywgMHhkNmJkZTk5NywgMHhjNGE2ZmU4YSwgMHhjYWFmZjM4MSwgMHg5MGQ4YjhlOCwgMHg5ZWQxYjVlMywgMHg4Y2NhYTJmZSwgMHg4MmMzYWZmNSwgMHhhOGZjOGNjNCwgMHhhNmY1ODFjZiwgMHhiNGVlOTZkMiwgMHhiYWU3OWJkOSwgMHhkYjNiYmI3YiwgMHhkNTMyYjY3MCwgMHhjNzI5YTE2ZCwgMHhjOTIwYWM2NiwgMHhlMzFmOGY1NywgMHhlZDE2ODI1YywgMHhmZjBkOTU0MSwgMHhmMTA0OTg0YSwgMHhhYjczZDMyMywgMHhhNTdhZGUyOCwgMHhiNzYxYzkzNSwgMHhiOTY4YzQzZSwgMHg5MzU3ZTcwZiwgMHg5ZDVlZWEwNCwgMHg4ZjQ1ZmQxOSwgMHg4MTRjZjAxMiwgMHgzYmFiNmJjYiwgMHgzNWEyNjZjMCwgMHgyN2I5NzFkZCwgMHgyOWIwN2NkNiwgMHgwMzhmNWZlNywgMHgwZDg2NTJlYywgMHgxZjlkNDVmMSwgMHgxMTk0NDhmYSwgMHg0YmUzMDM5MywgMHg0NWVhMGU5OCwgMHg1N2YxMTk4NSwgMHg1OWY4MTQ4ZSwgMHg3M2M3MzdiZiwgMHg3ZGNlM2FiNCwgMHg2ZmQ1MmRhOSwgMHg2MWRjMjBhMiwgMHhhZDc2NmRmNiwgMHhhMzdmNjBmZCwgMHhiMTY0NzdlMCwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwgMHg5YjViNTRkMSwgMHg4OTQwNDNjYywgMHg4NzQ5NGVjNywgMHhkZDNlMDVhZSwgMHhkMzM3MDhhNSwgMHhjMTJjMWZiOCwgMHhjZjI1MTJiMywgMHhlNTFhMzE4MiwgMHhlYjEzM2M4OSwgMHhmOTA4MmI5NCwgMHhmNzAxMjY5ZiwgMHg0ZGU2YmQ0NiwgMHg0M2VmYjA0ZCwgMHg1MWY0YTc1MCwgMHg1ZmZkYWE1YiwgMHg3NWMyODk2YSwgMHg3YmNiODQ2MSwgMHg2OWQwOTM3YywgMHg2N2Q5OWU3NywgMHgzZGFlZDUxZSwgMHgzM2E3ZDgxNSwgMHgyMWJjY2YwOCwgMHgyZmI1YzIwMywgMHgwNThhZTEzMiwgMHgwYjgzZWMzOSwgMHgxOTk4ZmIyNCwgMHgxNzkxZjYyZiwgMHg3NjRkZDY4ZCwgMHg3ODQ0ZGI4NiwgMHg2YTVmY2M5YiwgMHg2NDU2YzE5MCwgMHg0ZTY5ZTJhMSwgMHg0MDYwZWZhYSwgMHg1MjdiZjhiNywgMHg1YzcyZjViYywgMHgwNjA1YmVkNSwgMHgwODBjYjNkZSwgMHgxYTE3YTRjMywgMHgxNDFlYTljOCwgMHgzZTIxOGFmOSwgMHgzMDI4ODdmMiwgMHgyMjMzOTBlZiwgMHgyYzNhOWRlNCwgMHg5NmRkMDYzZCwgMHg5OGQ0MGIzNiwgMHg4YWNmMWMyYiwgMHg4NGM2MTEyMCwgMHhhZWY5MzIxMSwgMHhhMGYwM2YxYSwgMHhiMmViMjgwNywgMHhiY2UyMjUwYywgMHhlNjk1NmU2NSwgMHhlODljNjM2ZSwgMHhmYTg3NzQ3MywgMHhmNDhlNzk3OCwgMHhkZWIxNWE0OSwgMHhkMGI4NTc0MiwgMHhjMmEzNDA1ZiwgMHhjY2FhNGQ1NCwgMHg0MWVjZGFmNywgMHg0ZmU1ZDdmYywgMHg1ZGZlYzBlMSwgMHg1M2Y3Y2RlYSwgMHg3OWM4ZWVkYiwgMHg3N2MxZTNkMCwgMHg2NWRhZjRjZCwgMHg2YmQzZjljNiwgMHgzMWE0YjJhZiwgMHgzZmFkYmZhNCwgMHgyZGI2YThiOSwgMHgyM2JmYTViMiwgMHgwOTgwODY4MywgMHgwNzg5OGI4OCwgMHgxNTkyOWM5NSwgMHgxYjliOTE5ZSwgMHhhMTdjMGE0NywgMHhhZjc1MDc0YywgMHhiZDZlMTA1MSwgMHhiMzY3MWQ1YSwgMHg5OTU4M2U2YiwgMHg5NzUxMzM2MCwgMHg4NTRhMjQ3ZCwgMHg4YjQzMjk3NiwgMHhkMTM0NjIxZiwgMHhkZjNkNmYxNCwgMHhjZDI2NzgwOSwgMHhjMzJmNzUwMiwgMHhlOTEwNTYzMywgMHhlNzE5NWIzOCwgMHhmNTAyNGMyNSwgMHhmYjBiNDEyZSwgMHg5YWQ3NjE4YywgMHg5NGRlNmM4NywgMHg4NmM1N2I5YSwgMHg4OGNjNzY5MSwgMHhhMmYzNTVhMCwgMHhhY2ZhNThhYiwgMHhiZWUxNGZiNiwgMHhiMGU4NDJiZCwgMHhlYTlmMDlkNCwgMHhlNDk2MDRkZiwgMHhmNjhkMTNjMiwgMHhmODg0MWVjOSwgMHhkMmJiM2RmOCwgMHhkY2IyMzBmMywgMHhjZWE5MjdlZSwgMHhjMGEwMmFlNSwgMHg3YTQ3YjEzYywgMHg3NDRlYmMzNywgMHg2NjU1YWIyYSwgMHg2ODVjYTYyMSwgMHg0MjYzODUxMCwgMHg0YzZhODgxYiwgMHg1ZTcxOWYwNiwgMHg1MDc4OTIwZCwgMHgwYTBmZDk2NCwgMHgwNDA2ZDQ2ZiwgMHgxNjFkYzM3MiwgMHgxODE0Y2U3OSwgMHgzMjJiZWQ0OCwgMHgzYzIyZTA0MywgMHgyZTM5Zjc1ZSwgMHgyMDMwZmE1NSwgMHhlYzlhYjcwMSwgMHhlMjkzYmEwYSwgMHhmMDg4YWQxNywgMHhmZTgxYTAxYywgMHhkNGJlODMyZCwgMHhkYWI3OGUyNiwgMHhjOGFjOTkzYiwgMHhjNmE1OTQzMCwgMHg5Y2QyZGY1OSwgMHg5MmRiZDI1MiwgMHg4MGMwYzU0ZiwgMHg4ZWM5Yzg0NCwgMHhhNGY2ZWI3NSwgMHhhYWZmZTY3ZSwgMHhiOGU0ZjE2MywgMHhiNmVkZmM2OCwgMHgwYzBhNjdiMSwgMHgwMjAzNmFiYSwgMHgxMDE4N2RhNywgMHgxZTExNzBhYywgMHgzNDJlNTM5ZCwgMHgzYTI3NWU5NiwgMHgyODNjNDk4YiwgMHgyNjM1NDQ4MCwgMHg3YzQyMGZlOSwgMHg3MjRiMDJlMiwgMHg2MDUwMTVmZiwgMHg2ZTU5MThmNCwgMHg0NDY2M2JjNSwgMHg0YTZmMzZjZSwgMHg1ODc0MjFkMywgMHg1NjdkMmNkOCwgMHgzN2ExMGM3YSwgMHgzOWE4MDE3MSwgMHgyYmIzMTY2YywgMHgyNWJhMWI2NywgMHgwZjg1Mzg1NiwgMHgwMThjMzU1ZCwgMHgxMzk3MjI0MCwgMHgxZDllMmY0YiwgMHg0N2U5NjQyMiwgMHg0OWUwNjkyOSwgMHg1YmZiN2UzNCwgMHg1NWYyNzMzZiwgMHg3ZmNkNTAwZSwgMHg3MWM0NWQwNSwgMHg2M2RmNGExOCwgMHg2ZGQ2NDcxMywgMHhkNzMxZGNjYSwgMHhkOTM4ZDFjMSwgMHhjYjIzYzZkYywgMHhjNTJhY2JkNywgMHhlZjE1ZThlNiwgMHhlMTFjZTVlZCwgMHhmMzA3ZjJmMCwgMHhmZDBlZmZmYiwgMHhhNzc5YjQ5MiwgMHhhOTcwYjk5OSwgMHhiYjZiYWU4NCwgMHhiNTYyYTM4ZiwgMHg5ZjVkODBiZSwgMHg5MTU0OGRiNSwgMHg4MzRmOWFhOCwgMHg4ZDQ2OTdhM107XG4gICAgdmFyIFUyID0gWzB4MDAwMDAwMDAsIDB4MGIwZTA5MGQsIDB4MTYxYzEyMWEsIDB4MWQxMjFiMTcsIDB4MmMzODI0MzQsIDB4MjczNjJkMzksIDB4M2EyNDM2MmUsIDB4MzEyYTNmMjMsIDB4NTg3MDQ4NjgsIDB4NTM3ZTQxNjUsIDB4NGU2YzVhNzIsIDB4NDU2MjUzN2YsIDB4NzQ0ODZjNWMsIDB4N2Y0NjY1NTEsIDB4NjI1NDdlNDYsIDB4Njk1YTc3NGIsIDB4YjBlMDkwZDAsIDB4YmJlZTk5ZGQsIDB4YTZmYzgyY2EsIDB4YWRmMjhiYzcsIDB4OWNkOGI0ZTQsIDB4OTdkNmJkZTksIDB4OGFjNGE2ZmUsIDB4ODFjYWFmZjMsIDB4ZTg5MGQ4YjgsIDB4ZTM5ZWQxYjUsIDB4ZmU4Y2NhYTIsIDB4ZjU4MmMzYWYsIDB4YzRhOGZjOGMsIDB4Y2ZhNmY1ODEsIDB4ZDJiNGVlOTYsIDB4ZDliYWU3OWIsIDB4N2JkYjNiYmIsIDB4NzBkNTMyYjYsIDB4NmRjNzI5YTEsIDB4NjZjOTIwYWMsIDB4NTdlMzFmOGYsIDB4NWNlZDE2ODIsIDB4NDFmZjBkOTUsIDB4NGFmMTA0OTgsIDB4MjNhYjczZDMsIDB4MjhhNTdhZGUsIDB4MzViNzYxYzksIDB4M2ViOTY4YzQsIDB4MGY5MzU3ZTcsIDB4MDQ5ZDVlZWEsIDB4MTk4ZjQ1ZmQsIDB4MTI4MTRjZjAsIDB4Y2IzYmFiNmIsIDB4YzAzNWEyNjYsIDB4ZGQyN2I5NzEsIDB4ZDYyOWIwN2MsIDB4ZTcwMzhmNWYsIDB4ZWMwZDg2NTIsIDB4ZjExZjlkNDUsIDB4ZmExMTk0NDgsIDB4OTM0YmUzMDMsIDB4OTg0NWVhMGUsIDB4ODU1N2YxMTksIDB4OGU1OWY4MTQsIDB4YmY3M2M3MzcsIDB4YjQ3ZGNlM2EsIDB4YTk2ZmQ1MmQsIDB4YTI2MWRjMjAsIDB4ZjZhZDc2NmQsIDB4ZmRhMzdmNjAsIDB4ZTBiMTY0NzcsIDB4ZWJiZjZkN2EsIDB4ZGE5NTUyNTksIDB4ZDE5YjViNTQsIDB4Y2M4OTQwNDMsIDB4Yzc4NzQ5NGUsIDB4YWVkZDNlMDUsIDB4YTVkMzM3MDgsIDB4YjhjMTJjMWYsIDB4YjNjZjI1MTIsIDB4ODJlNTFhMzEsIDB4ODllYjEzM2MsIDB4OTRmOTA4MmIsIDB4OWZmNzAxMjYsIDB4NDY0ZGU2YmQsIDB4NGQ0M2VmYjAsIDB4NTA1MWY0YTcsIDB4NWI1ZmZkYWEsIDB4NmE3NWMyODksIDB4NjE3YmNiODQsIDB4N2M2OWQwOTMsIDB4Nzc2N2Q5OWUsIDB4MWUzZGFlZDUsIDB4MTUzM2E3ZDgsIDB4MDgyMWJjY2YsIDB4MDMyZmI1YzIsIDB4MzIwNThhZTEsIDB4MzkwYjgzZWMsIDB4MjQxOTk4ZmIsIDB4MmYxNzkxZjYsIDB4OGQ3NjRkZDYsIDB4ODY3ODQ0ZGIsIDB4OWI2YTVmY2MsIDB4OTA2NDU2YzEsIDB4YTE0ZTY5ZTIsIDB4YWE0MDYwZWYsIDB4Yjc1MjdiZjgsIDB4YmM1YzcyZjUsIDB4ZDUwNjA1YmUsIDB4ZGUwODBjYjMsIDB4YzMxYTE3YTQsIDB4YzgxNDFlYTksIDB4ZjkzZTIxOGEsIDB4ZjIzMDI4ODcsIDB4ZWYyMjMzOTAsIDB4ZTQyYzNhOWQsIDB4M2Q5NmRkMDYsIDB4MzY5OGQ0MGIsIDB4MmI4YWNmMWMsIDB4MjA4NGM2MTEsIDB4MTFhZWY5MzIsIDB4MWFhMGYwM2YsIDB4MDdiMmViMjgsIDB4MGNiY2UyMjUsIDB4NjVlNjk1NmUsIDB4NmVlODljNjMsIDB4NzNmYTg3NzQsIDB4NzhmNDhlNzksIDB4NDlkZWIxNWEsIDB4NDJkMGI4NTcsIDB4NWZjMmEzNDAsIDB4NTRjY2FhNGQsIDB4Zjc0MWVjZGEsIDB4ZmM0ZmU1ZDcsIDB4ZTE1ZGZlYzAsIDB4ZWE1M2Y3Y2QsIDB4ZGI3OWM4ZWUsIDB4ZDA3N2MxZTMsIDB4Y2Q2NWRhZjQsIDB4YzY2YmQzZjksIDB4YWYzMWE0YjIsIDB4YTQzZmFkYmYsIDB4YjkyZGI2YTgsIDB4YjIyM2JmYTUsIDB4ODMwOTgwODYsIDB4ODgwNzg5OGIsIDB4OTUxNTkyOWMsIDB4OWUxYjliOTEsIDB4NDdhMTdjMGEsIDB4NGNhZjc1MDcsIDB4NTFiZDZlMTAsIDB4NWFiMzY3MWQsIDB4NmI5OTU4M2UsIDB4NjA5NzUxMzMsIDB4N2Q4NTRhMjQsIDB4NzY4YjQzMjksIDB4MWZkMTM0NjIsIDB4MTRkZjNkNmYsIDB4MDljZDI2NzgsIDB4MDJjMzJmNzUsIDB4MzNlOTEwNTYsIDB4MzhlNzE5NWIsIDB4MjVmNTAyNGMsIDB4MmVmYjBiNDEsIDB4OGM5YWQ3NjEsIDB4ODc5NGRlNmMsIDB4OWE4NmM1N2IsIDB4OTE4OGNjNzYsIDB4YTBhMmYzNTUsIDB4YWJhY2ZhNTgsIDB4YjZiZWUxNGYsIDB4YmRiMGU4NDIsIDB4ZDRlYTlmMDksIDB4ZGZlNDk2MDQsIDB4YzJmNjhkMTMsIDB4YzlmODg0MWUsIDB4ZjhkMmJiM2QsIDB4ZjNkY2IyMzAsIDB4ZWVjZWE5MjcsIDB4ZTVjMGEwMmEsIDB4M2M3YTQ3YjEsIDB4Mzc3NDRlYmMsIDB4MmE2NjU1YWIsIDB4MjE2ODVjYTYsIDB4MTA0MjYzODUsIDB4MWI0YzZhODgsIDB4MDY1ZTcxOWYsIDB4MGQ1MDc4OTIsIDB4NjQwYTBmZDksIDB4NmYwNDA2ZDQsIDB4NzIxNjFkYzMsIDB4NzkxODE0Y2UsIDB4NDgzMjJiZWQsIDB4NDMzYzIyZTAsIDB4NWUyZTM5ZjcsIDB4NTUyMDMwZmEsIDB4MDFlYzlhYjcsIDB4MGFlMjkzYmEsIDB4MTdmMDg4YWQsIDB4MWNmZTgxYTAsIDB4MmRkNGJlODMsIDB4MjZkYWI3OGUsIDB4M2JjOGFjOTksIDB4MzBjNmE1OTQsIDB4NTk5Y2QyZGYsIDB4NTI5MmRiZDIsIDB4NGY4MGMwYzUsIDB4NDQ4ZWM5YzgsIDB4NzVhNGY2ZWIsIDB4N2VhYWZmZTYsIDB4NjNiOGU0ZjEsIDB4NjhiNmVkZmMsIDB4YjEwYzBhNjcsIDB4YmEwMjAzNmEsIDB4YTcxMDE4N2QsIDB4YWMxZTExNzAsIDB4OWQzNDJlNTMsIDB4OTYzYTI3NWUsIDB4OGIyODNjNDksIDB4ODAyNjM1NDQsIDB4ZTk3YzQyMGYsIDB4ZTI3MjRiMDIsIDB4ZmY2MDUwMTUsIDB4ZjQ2ZTU5MTgsIDB4YzU0NDY2M2IsIDB4Y2U0YTZmMzYsIDB4ZDM1ODc0MjEsIDB4ZDg1NjdkMmMsIDB4N2EzN2ExMGMsIDB4NzEzOWE4MDEsIDB4NmMyYmIzMTYsIDB4NjcyNWJhMWIsIDB4NTYwZjg1MzgsIDB4NWQwMThjMzUsIDB4NDAxMzk3MjIsIDB4NGIxZDllMmYsIDB4MjI0N2U5NjQsIDB4Mjk0OWUwNjksIDB4MzQ1YmZiN2UsIDB4M2Y1NWYyNzMsIDB4MGU3ZmNkNTAsIDB4MDU3MWM0NWQsIDB4MTg2M2RmNGEsIDB4MTM2ZGQ2NDcsIDB4Y2FkNzMxZGMsIDB4YzFkOTM4ZDEsIDB4ZGNjYjIzYzYsIDB4ZDdjNTJhY2IsIDB4ZTZlZjE1ZTgsIDB4ZWRlMTFjZTUsIDB4ZjBmMzA3ZjIsIDB4ZmJmZDBlZmYsIDB4OTJhNzc5YjQsIDB4OTlhOTcwYjksIDB4ODRiYjZiYWUsIDB4OGZiNTYyYTMsIDB4YmU5ZjVkODAsIDB4YjU5MTU0OGQsIDB4YTg4MzRmOWEsIDB4YTM4ZDQ2OTddO1xuICAgIHZhciBVMyA9IFsweDAwMDAwMDAwLCAweDBkMGIwZTA5LCAweDFhMTYxYzEyLCAweDE3MWQxMjFiLCAweDM0MmMzODI0LCAweDM5MjczNjJkLCAweDJlM2EyNDM2LCAweDIzMzEyYTNmLCAweDY4NTg3MDQ4LCAweDY1NTM3ZTQxLCAweDcyNGU2YzVhLCAweDdmNDU2MjUzLCAweDVjNzQ0ODZjLCAweDUxN2Y0NjY1LCAweDQ2NjI1NDdlLCAweDRiNjk1YTc3LCAweGQwYjBlMDkwLCAweGRkYmJlZTk5LCAweGNhYTZmYzgyLCAweGM3YWRmMjhiLCAweGU0OWNkOGI0LCAweGU5OTdkNmJkLCAweGZlOGFjNGE2LCAweGYzODFjYWFmLCAweGI4ZTg5MGQ4LCAweGI1ZTM5ZWQxLCAweGEyZmU4Y2NhLCAweGFmZjU4MmMzLCAweDhjYzRhOGZjLCAweDgxY2ZhNmY1LCAweDk2ZDJiNGVlLCAweDliZDliYWU3LCAweGJiN2JkYjNiLCAweGI2NzBkNTMyLCAweGExNmRjNzI5LCAweGFjNjZjOTIwLCAweDhmNTdlMzFmLCAweDgyNWNlZDE2LCAweDk1NDFmZjBkLCAweDk4NGFmMTA0LCAweGQzMjNhYjczLCAweGRlMjhhNTdhLCAweGM5MzViNzYxLCAweGM0M2ViOTY4LCAweGU3MGY5MzU3LCAweGVhMDQ5ZDVlLCAweGZkMTk4ZjQ1LCAweGYwMTI4MTRjLCAweDZiY2IzYmFiLCAweDY2YzAzNWEyLCAweDcxZGQyN2I5LCAweDdjZDYyOWIwLCAweDVmZTcwMzhmLCAweDUyZWMwZDg2LCAweDQ1ZjExZjlkLCAweDQ4ZmExMTk0LCAweDAzOTM0YmUzLCAweDBlOTg0NWVhLCAweDE5ODU1N2YxLCAweDE0OGU1OWY4LCAweDM3YmY3M2M3LCAweDNhYjQ3ZGNlLCAweDJkYTk2ZmQ1LCAweDIwYTI2MWRjLCAweDZkZjZhZDc2LCAweDYwZmRhMzdmLCAweDc3ZTBiMTY0LCAweDdhZWJiZjZkLCAweDU5ZGE5NTUyLCAweDU0ZDE5YjViLCAweDQzY2M4OTQwLCAweDRlYzc4NzQ5LCAweDA1YWVkZDNlLCAweDA4YTVkMzM3LCAweDFmYjhjMTJjLCAweDEyYjNjZjI1LCAweDMxODJlNTFhLCAweDNjODllYjEzLCAweDJiOTRmOTA4LCAweDI2OWZmNzAxLCAweGJkNDY0ZGU2LCAweGIwNGQ0M2VmLCAweGE3NTA1MWY0LCAweGFhNWI1ZmZkLCAweDg5NmE3NWMyLCAweDg0NjE3YmNiLCAweDkzN2M2OWQwLCAweDllNzc2N2Q5LCAweGQ1MWUzZGFlLCAweGQ4MTUzM2E3LCAweGNmMDgyMWJjLCAweGMyMDMyZmI1LCAweGUxMzIwNThhLCAweGVjMzkwYjgzLCAweGZiMjQxOTk4LCAweGY2MmYxNzkxLCAweGQ2OGQ3NjRkLCAweGRiODY3ODQ0LCAweGNjOWI2YTVmLCAweGMxOTA2NDU2LCAweGUyYTE0ZTY5LCAweGVmYWE0MDYwLCAweGY4Yjc1MjdiLCAweGY1YmM1YzcyLCAweGJlZDUwNjA1LCAweGIzZGUwODBjLCAweGE0YzMxYTE3LCAweGE5YzgxNDFlLCAweDhhZjkzZTIxLCAweDg3ZjIzMDI4LCAweDkwZWYyMjMzLCAweDlkZTQyYzNhLCAweDA2M2Q5NmRkLCAweDBiMzY5OGQ0LCAweDFjMmI4YWNmLCAweDExMjA4NGM2LCAweDMyMTFhZWY5LCAweDNmMWFhMGYwLCAweDI4MDdiMmViLCAweDI1MGNiY2UyLCAweDZlNjVlNjk1LCAweDYzNmVlODljLCAweDc0NzNmYTg3LCAweDc5NzhmNDhlLCAweDVhNDlkZWIxLCAweDU3NDJkMGI4LCAweDQwNWZjMmEzLCAweDRkNTRjY2FhLCAweGRhZjc0MWVjLCAweGQ3ZmM0ZmU1LCAweGMwZTE1ZGZlLCAweGNkZWE1M2Y3LCAweGVlZGI3OWM4LCAweGUzZDA3N2MxLCAweGY0Y2Q2NWRhLCAweGY5YzY2YmQzLCAweGIyYWYzMWE0LCAweGJmYTQzZmFkLCAweGE4YjkyZGI2LCAweGE1YjIyM2JmLCAweDg2ODMwOTgwLCAweDhiODgwNzg5LCAweDljOTUxNTkyLCAweDkxOWUxYjliLCAweDBhNDdhMTdjLCAweDA3NGNhZjc1LCAweDEwNTFiZDZlLCAweDFkNWFiMzY3LCAweDNlNmI5OTU4LCAweDMzNjA5NzUxLCAweDI0N2Q4NTRhLCAweDI5NzY4YjQzLCAweDYyMWZkMTM0LCAweDZmMTRkZjNkLCAweDc4MDljZDI2LCAweDc1MDJjMzJmLCAweDU2MzNlOTEwLCAweDViMzhlNzE5LCAweDRjMjVmNTAyLCAweDQxMmVmYjBiLCAweDYxOGM5YWQ3LCAweDZjODc5NGRlLCAweDdiOWE4NmM1LCAweDc2OTE4OGNjLCAweDU1YTBhMmYzLCAweDU4YWJhY2ZhLCAweDRmYjZiZWUxLCAweDQyYmRiMGU4LCAweDA5ZDRlYTlmLCAweDA0ZGZlNDk2LCAweDEzYzJmNjhkLCAweDFlYzlmODg0LCAweDNkZjhkMmJiLCAweDMwZjNkY2IyLCAweDI3ZWVjZWE5LCAweDJhZTVjMGEwLCAweGIxM2M3YTQ3LCAweGJjMzc3NDRlLCAweGFiMmE2NjU1LCAweGE2MjE2ODVjLCAweDg1MTA0MjYzLCAweDg4MWI0YzZhLCAweDlmMDY1ZTcxLCAweDkyMGQ1MDc4LCAweGQ5NjQwYTBmLCAweGQ0NmYwNDA2LCAweGMzNzIxNjFkLCAweGNlNzkxODE0LCAweGVkNDgzMjJiLCAweGUwNDMzYzIyLCAweGY3NWUyZTM5LCAweGZhNTUyMDMwLCAweGI3MDFlYzlhLCAweGJhMGFlMjkzLCAweGFkMTdmMDg4LCAweGEwMWNmZTgxLCAweDgzMmRkNGJlLCAweDhlMjZkYWI3LCAweDk5M2JjOGFjLCAweDk0MzBjNmE1LCAweGRmNTk5Y2QyLCAweGQyNTI5MmRiLCAweGM1NGY4MGMwLCAweGM4NDQ4ZWM5LCAweGViNzVhNGY2LCAweGU2N2VhYWZmLCAweGYxNjNiOGU0LCAweGZjNjhiNmVkLCAweDY3YjEwYzBhLCAweDZhYmEwMjAzLCAweDdkYTcxMDE4LCAweDcwYWMxZTExLCAweDUzOWQzNDJlLCAweDVlOTYzYTI3LCAweDQ5OGIyODNjLCAweDQ0ODAyNjM1LCAweDBmZTk3YzQyLCAweDAyZTI3MjRiLCAweDE1ZmY2MDUwLCAweDE4ZjQ2ZTU5LCAweDNiYzU0NDY2LCAweDM2Y2U0YTZmLCAweDIxZDM1ODc0LCAweDJjZDg1NjdkLCAweDBjN2EzN2ExLCAweDAxNzEzOWE4LCAweDE2NmMyYmIzLCAweDFiNjcyNWJhLCAweDM4NTYwZjg1LCAweDM1NWQwMThjLCAweDIyNDAxMzk3LCAweDJmNGIxZDllLCAweDY0MjI0N2U5LCAweDY5Mjk0OWUwLCAweDdlMzQ1YmZiLCAweDczM2Y1NWYyLCAweDUwMGU3ZmNkLCAweDVkMDU3MWM0LCAweDRhMTg2M2RmLCAweDQ3MTM2ZGQ2LCAweGRjY2FkNzMxLCAweGQxYzFkOTM4LCAweGM2ZGNjYjIzLCAweGNiZDdjNTJhLCAweGU4ZTZlZjE1LCAweGU1ZWRlMTFjLCAweGYyZjBmMzA3LCAweGZmZmJmZDBlLCAweGI0OTJhNzc5LCAweGI5OTlhOTcwLCAweGFlODRiYjZiLCAweGEzOGZiNTYyLCAweDgwYmU5ZjVkLCAweDhkYjU5MTU0LCAweDlhYTg4MzRmLCAweDk3YTM4ZDQ2XTtcbiAgICB2YXIgVTQgPSBbMHgwMDAwMDAwMCwgMHgwOTBkMGIwZSwgMHgxMjFhMTYxYywgMHgxYjE3MWQxMiwgMHgyNDM0MmMzOCwgMHgyZDM5MjczNiwgMHgzNjJlM2EyNCwgMHgzZjIzMzEyYSwgMHg0ODY4NTg3MCwgMHg0MTY1NTM3ZSwgMHg1YTcyNGU2YywgMHg1MzdmNDU2MiwgMHg2YzVjNzQ0OCwgMHg2NTUxN2Y0NiwgMHg3ZTQ2NjI1NCwgMHg3NzRiNjk1YSwgMHg5MGQwYjBlMCwgMHg5OWRkYmJlZSwgMHg4MmNhYTZmYywgMHg4YmM3YWRmMiwgMHhiNGU0OWNkOCwgMHhiZGU5OTdkNiwgMHhhNmZlOGFjNCwgMHhhZmYzODFjYSwgMHhkOGI4ZTg5MCwgMHhkMWI1ZTM5ZSwgMHhjYWEyZmU4YywgMHhjM2FmZjU4MiwgMHhmYzhjYzRhOCwgMHhmNTgxY2ZhNiwgMHhlZTk2ZDJiNCwgMHhlNzliZDliYSwgMHgzYmJiN2JkYiwgMHgzMmI2NzBkNSwgMHgyOWExNmRjNywgMHgyMGFjNjZjOSwgMHgxZjhmNTdlMywgMHgxNjgyNWNlZCwgMHgwZDk1NDFmZiwgMHgwNDk4NGFmMSwgMHg3M2QzMjNhYiwgMHg3YWRlMjhhNSwgMHg2MWM5MzViNywgMHg2OGM0M2ViOSwgMHg1N2U3MGY5MywgMHg1ZWVhMDQ5ZCwgMHg0NWZkMTk4ZiwgMHg0Y2YwMTI4MSwgMHhhYjZiY2IzYiwgMHhhMjY2YzAzNSwgMHhiOTcxZGQyNywgMHhiMDdjZDYyOSwgMHg4ZjVmZTcwMywgMHg4NjUyZWMwZCwgMHg5ZDQ1ZjExZiwgMHg5NDQ4ZmExMSwgMHhlMzAzOTM0YiwgMHhlYTBlOTg0NSwgMHhmMTE5ODU1NywgMHhmODE0OGU1OSwgMHhjNzM3YmY3MywgMHhjZTNhYjQ3ZCwgMHhkNTJkYTk2ZiwgMHhkYzIwYTI2MSwgMHg3NjZkZjZhZCwgMHg3ZjYwZmRhMywgMHg2NDc3ZTBiMSwgMHg2ZDdhZWJiZiwgMHg1MjU5ZGE5NSwgMHg1YjU0ZDE5YiwgMHg0MDQzY2M4OSwgMHg0OTRlYzc4NywgMHgzZTA1YWVkZCwgMHgzNzA4YTVkMywgMHgyYzFmYjhjMSwgMHgyNTEyYjNjZiwgMHgxYTMxODJlNSwgMHgxMzNjODllYiwgMHgwODJiOTRmOSwgMHgwMTI2OWZmNywgMHhlNmJkNDY0ZCwgMHhlZmIwNGQ0MywgMHhmNGE3NTA1MSwgMHhmZGFhNWI1ZiwgMHhjMjg5NmE3NSwgMHhjYjg0NjE3YiwgMHhkMDkzN2M2OSwgMHhkOTllNzc2NywgMHhhZWQ1MWUzZCwgMHhhN2Q4MTUzMywgMHhiY2NmMDgyMSwgMHhiNWMyMDMyZiwgMHg4YWUxMzIwNSwgMHg4M2VjMzkwYiwgMHg5OGZiMjQxOSwgMHg5MWY2MmYxNywgMHg0ZGQ2OGQ3NiwgMHg0NGRiODY3OCwgMHg1ZmNjOWI2YSwgMHg1NmMxOTA2NCwgMHg2OWUyYTE0ZSwgMHg2MGVmYWE0MCwgMHg3YmY4Yjc1MiwgMHg3MmY1YmM1YywgMHgwNWJlZDUwNiwgMHgwY2IzZGUwOCwgMHgxN2E0YzMxYSwgMHgxZWE5YzgxNCwgMHgyMThhZjkzZSwgMHgyODg3ZjIzMCwgMHgzMzkwZWYyMiwgMHgzYTlkZTQyYywgMHhkZDA2M2Q5NiwgMHhkNDBiMzY5OCwgMHhjZjFjMmI4YSwgMHhjNjExMjA4NCwgMHhmOTMyMTFhZSwgMHhmMDNmMWFhMCwgMHhlYjI4MDdiMiwgMHhlMjI1MGNiYywgMHg5NTZlNjVlNiwgMHg5YzYzNmVlOCwgMHg4Nzc0NzNmYSwgMHg4ZTc5NzhmNCwgMHhiMTVhNDlkZSwgMHhiODU3NDJkMCwgMHhhMzQwNWZjMiwgMHhhYTRkNTRjYywgMHhlY2RhZjc0MSwgMHhlNWQ3ZmM0ZiwgMHhmZWMwZTE1ZCwgMHhmN2NkZWE1MywgMHhjOGVlZGI3OSwgMHhjMWUzZDA3NywgMHhkYWY0Y2Q2NSwgMHhkM2Y5YzY2YiwgMHhhNGIyYWYzMSwgMHhhZGJmYTQzZiwgMHhiNmE4YjkyZCwgMHhiZmE1YjIyMywgMHg4MDg2ODMwOSwgMHg4OThiODgwNywgMHg5MjljOTUxNSwgMHg5YjkxOWUxYiwgMHg3YzBhNDdhMSwgMHg3NTA3NGNhZiwgMHg2ZTEwNTFiZCwgMHg2NzFkNWFiMywgMHg1ODNlNmI5OSwgMHg1MTMzNjA5NywgMHg0YTI0N2Q4NSwgMHg0MzI5NzY4YiwgMHgzNDYyMWZkMSwgMHgzZDZmMTRkZiwgMHgyNjc4MDljZCwgMHgyZjc1MDJjMywgMHgxMDU2MzNlOSwgMHgxOTViMzhlNywgMHgwMjRjMjVmNSwgMHgwYjQxMmVmYiwgMHhkNzYxOGM5YSwgMHhkZTZjODc5NCwgMHhjNTdiOWE4NiwgMHhjYzc2OTE4OCwgMHhmMzU1YTBhMiwgMHhmYTU4YWJhYywgMHhlMTRmYjZiZSwgMHhlODQyYmRiMCwgMHg5ZjA5ZDRlYSwgMHg5NjA0ZGZlNCwgMHg4ZDEzYzJmNiwgMHg4NDFlYzlmOCwgMHhiYjNkZjhkMiwgMHhiMjMwZjNkYywgMHhhOTI3ZWVjZSwgMHhhMDJhZTVjMCwgMHg0N2IxM2M3YSwgMHg0ZWJjMzc3NCwgMHg1NWFiMmE2NiwgMHg1Y2E2MjE2OCwgMHg2Mzg1MTA0MiwgMHg2YTg4MWI0YywgMHg3MTlmMDY1ZSwgMHg3ODkyMGQ1MCwgMHgwZmQ5NjQwYSwgMHgwNmQ0NmYwNCwgMHgxZGMzNzIxNiwgMHgxNGNlNzkxOCwgMHgyYmVkNDgzMiwgMHgyMmUwNDMzYywgMHgzOWY3NWUyZSwgMHgzMGZhNTUyMCwgMHg5YWI3MDFlYywgMHg5M2JhMGFlMiwgMHg4OGFkMTdmMCwgMHg4MWEwMWNmZSwgMHhiZTgzMmRkNCwgMHhiNzhlMjZkYSwgMHhhYzk5M2JjOCwgMHhhNTk0MzBjNiwgMHhkMmRmNTk5YywgMHhkYmQyNTI5MiwgMHhjMGM1NGY4MCwgMHhjOWM4NDQ4ZSwgMHhmNmViNzVhNCwgMHhmZmU2N2VhYSwgMHhlNGYxNjNiOCwgMHhlZGZjNjhiNiwgMHgwYTY3YjEwYywgMHgwMzZhYmEwMiwgMHgxODdkYTcxMCwgMHgxMTcwYWMxZSwgMHgyZTUzOWQzNCwgMHgyNzVlOTYzYSwgMHgzYzQ5OGIyOCwgMHgzNTQ0ODAyNiwgMHg0MjBmZTk3YywgMHg0YjAyZTI3MiwgMHg1MDE1ZmY2MCwgMHg1OTE4ZjQ2ZSwgMHg2NjNiYzU0NCwgMHg2ZjM2Y2U0YSwgMHg3NDIxZDM1OCwgMHg3ZDJjZDg1NiwgMHhhMTBjN2EzNywgMHhhODAxNzEzOSwgMHhiMzE2NmMyYiwgMHhiYTFiNjcyNSwgMHg4NTM4NTYwZiwgMHg4YzM1NWQwMSwgMHg5NzIyNDAxMywgMHg5ZTJmNGIxZCwgMHhlOTY0MjI0NywgMHhlMDY5Mjk0OSwgMHhmYjdlMzQ1YiwgMHhmMjczM2Y1NSwgMHhjZDUwMGU3ZiwgMHhjNDVkMDU3MSwgMHhkZjRhMTg2MywgMHhkNjQ3MTM2ZCwgMHgzMWRjY2FkNywgMHgzOGQxYzFkOSwgMHgyM2M2ZGNjYiwgMHgyYWNiZDdjNSwgMHgxNWU4ZTZlZiwgMHgxY2U1ZWRlMSwgMHgwN2YyZjBmMywgMHgwZWZmZmJmZCwgMHg3OWI0OTJhNywgMHg3MGI5OTlhOSwgMHg2YmFlODRiYiwgMHg2MmEzOGZiNSwgMHg1ZDgwYmU5ZiwgMHg1NDhkYjU5MSwgMHg0ZjlhYTg4MywgMHg0Njk3YTM4ZF07XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0VG9JbnQzMihieXRlcykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgIChieXRlc1tpICAgIF0gPDwgMjQpIHxcbiAgICAgICAgICAgICAgICAoYnl0ZXNbaSArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgICAgICAgKGJ5dGVzW2kgKyAyXSA8PCAgOCkgfFxuICAgICAgICAgICAgICAgICBieXRlc1tpICsgM11cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgQUVTID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBRVMpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignQUVTIG11c3QgYmUgaW5zdGFuaXRhdGVkIHdpdGggYG5ld2AnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAna2V5Jywge1xuICAgICAgICAgICAgdmFsdWU6IGNvZXJjZUFycmF5KGtleSwgdHJ1ZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fcHJlcGFyZSgpO1xuICAgIH1cblxuXG4gICAgQUVTLnByb3RvdHlwZS5fcHJlcGFyZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciByb3VuZHMgPSBudW1iZXJPZlJvdW5kc1t0aGlzLmtleS5sZW5ndGhdO1xuICAgICAgICBpZiAocm91bmRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBrZXkgc2l6ZSAobXVzdCBiZSAxNiwgMjQgb3IgMzIgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmNyeXB0aW9uIHJvdW5kIGtleXNcbiAgICAgICAgdGhpcy5fS2UgPSBbXTtcblxuICAgICAgICAvLyBkZWNyeXB0aW9uIHJvdW5kIGtleXNcbiAgICAgICAgdGhpcy5fS2QgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSByb3VuZHM7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fS2UucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgICAgICAgICAgdGhpcy5fS2QucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHJvdW5kS2V5Q291bnQgPSAocm91bmRzICsgMSkgKiA0O1xuICAgICAgICB2YXIgS0MgPSB0aGlzLmtleS5sZW5ndGggLyA0O1xuXG4gICAgICAgIC8vIGNvbnZlcnQgdGhlIGtleSBpbnRvIGludHNcbiAgICAgICAgdmFyIHRrID0gY29udmVydFRvSW50MzIodGhpcy5rZXkpO1xuXG4gICAgICAgIC8vIGNvcHkgdmFsdWVzIGludG8gcm91bmQga2V5IGFycmF5c1xuICAgICAgICB2YXIgaW5kZXg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgS0M7IGkrKykge1xuICAgICAgICAgICAgaW5kZXggPSBpID4+IDI7XG4gICAgICAgICAgICB0aGlzLl9LZVtpbmRleF1baSAlIDRdID0gdGtbaV07XG4gICAgICAgICAgICB0aGlzLl9LZFtyb3VuZHMgLSBpbmRleF1baSAlIDRdID0gdGtbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBrZXkgZXhwYW5zaW9uIChmaXBzLTE5NyBzZWN0aW9uIDUuMilcbiAgICAgICAgdmFyIHJjb25wb2ludGVyID0gMDtcbiAgICAgICAgdmFyIHQgPSBLQywgdHQ7XG4gICAgICAgIHdoaWxlICh0IDwgcm91bmRLZXlDb3VudCkge1xuICAgICAgICAgICAgdHQgPSB0a1tLQyAtIDFdO1xuICAgICAgICAgICAgdGtbMF0gXj0gKChTWyh0dCA+PiAxNikgJiAweEZGXSA8PCAyNCkgXlxuICAgICAgICAgICAgICAgICAgICAgIChTWyh0dCA+PiAgOCkgJiAweEZGXSA8PCAxNikgXlxuICAgICAgICAgICAgICAgICAgICAgIChTWyB0dCAgICAgICAgJiAweEZGXSA8PCAgOCkgXlxuICAgICAgICAgICAgICAgICAgICAgICBTWyh0dCA+PiAyNCkgJiAweEZGXSAgICAgICAgXlxuICAgICAgICAgICAgICAgICAgICAgIChyY29uW3Jjb25wb2ludGVyXSA8PCAyNCkpO1xuICAgICAgICAgICAgcmNvbnBvaW50ZXIgKz0gMTtcblxuICAgICAgICAgICAgLy8ga2V5IGV4cGFuc2lvbiAoZm9yIG5vbi0yNTYgYml0KVxuICAgICAgICAgICAgaWYgKEtDICE9IDgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IEtDOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGtbaV0gXj0gdGtbaSAtIDFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8ga2V5IGV4cGFuc2lvbiBmb3IgMjU2LWJpdCBrZXlzIGlzIFwic2xpZ2h0bHkgZGlmZmVyZW50XCIgKGZpcHMtMTk3KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IChLQyAvIDIpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGtbaV0gXj0gdGtbaSAtIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0dCA9IHRrWyhLQyAvIDIpIC0gMV07XG5cbiAgICAgICAgICAgICAgICB0a1tLQyAvIDJdIF49IChTWyB0dCAgICAgICAgJiAweEZGXSAgICAgICAgXlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNbKHR0ID4+ICA4KSAmIDB4RkZdIDw8ICA4KSBeXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1sodHQgPj4gMTYpICYgMHhGRl0gPDwgMTYpIF5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTWyh0dCA+PiAyNCkgJiAweEZGXSA8PCAyNCkpO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IChLQyAvIDIpICsgMTsgaSA8IEtDOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGtbaV0gXj0gdGtbaSAtIDFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29weSB2YWx1ZXMgaW50byByb3VuZCBrZXkgYXJyYXlzXG4gICAgICAgICAgICB2YXIgaSA9IDAsIHIsIGM7XG4gICAgICAgICAgICB3aGlsZSAoaSA8IEtDICYmIHQgPCByb3VuZEtleUNvdW50KSB7XG4gICAgICAgICAgICAgICAgciA9IHQgPj4gMjtcbiAgICAgICAgICAgICAgICBjID0gdCAlIDQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fS2Vbcl1bY10gPSB0a1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9LZFtyb3VuZHMgLSByXVtjXSA9IHRrW2krK107XG4gICAgICAgICAgICAgICAgdCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW52ZXJzZS1jaXBoZXItaWZ5IHRoZSBkZWNyeXB0aW9uIHJvdW5kIGtleSAoZmlwcy0xOTcgc2VjdGlvbiA1LjMpXG4gICAgICAgIGZvciAodmFyIHIgPSAxOyByIDwgcm91bmRzOyByKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgNDsgYysrKSB7XG4gICAgICAgICAgICAgICAgdHQgPSB0aGlzLl9LZFtyXVtjXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9LZFtyXVtjXSA9IChVMVsodHQgPj4gMjQpICYgMHhGRl0gXlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUyWyh0dCA+PiAxNikgJiAweEZGXSBeXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVTNbKHR0ID4+ICA4KSAmIDB4RkZdIF5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVNFsgdHQgICAgICAgICYgMHhGRl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgQUVTLnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24ocGxhaW50ZXh0KSB7XG4gICAgICAgIGlmIChwbGFpbnRleHQubGVuZ3RoICE9IDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGxhaW50ZXh0IHNpemUgKG11c3QgYmUgMTYgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcm91bmRzID0gdGhpcy5fS2UubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGEgPSBbMCwgMCwgMCwgMF07XG5cbiAgICAgICAgLy8gY29udmVydCBwbGFpbnRleHQgdG8gKGludHMgXiBrZXkpXG4gICAgICAgIHZhciB0ID0gY29udmVydFRvSW50MzIocGxhaW50ZXh0KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIHRbaV0gXj0gdGhpcy5fS2VbMF1baV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhcHBseSByb3VuZCB0cmFuc2Zvcm1zXG4gICAgICAgIGZvciAodmFyIHIgPSAxOyByIDwgcm91bmRzOyByKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IChUMVsodFsgaSAgICAgICAgIF0gPj4gMjQpICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICAgICAgVDJbKHRbKGkgKyAxKSAlIDRdID4+IDE2KSAmIDB4ZmZdIF5cbiAgICAgICAgICAgICAgICAgICAgICAgIFQzWyh0WyhpICsgMikgJSA0XSA+PiAgOCkgJiAweGZmXSBeXG4gICAgICAgICAgICAgICAgICAgICAgICBUNFsgdFsoaSArIDMpICUgNF0gICAgICAgICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fS2Vbcl1baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdCA9IGEuc2xpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZSBsYXN0IHJvdW5kIGlzIHNwZWNpYWxcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZUFycmF5KDE2KSwgdHQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICB0dCA9IHRoaXMuX0tlW3JvdW5kc11baV07XG4gICAgICAgICAgICByZXN1bHRbNCAqIGkgICAgXSA9IChTWyh0WyBpICAgICAgICAgXSA+PiAyNCkgJiAweGZmXSBeICh0dCA+PiAyNCkpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDFdID0gKFNbKHRbKGkgKyAxKSAlIDRdID4+IDE2KSAmIDB4ZmZdIF4gKHR0ID4+IDE2KSkgJiAweGZmO1xuICAgICAgICAgICAgcmVzdWx0WzQgKiBpICsgMl0gPSAoU1sodFsoaSArIDIpICUgNF0gPj4gIDgpICYgMHhmZl0gXiAodHQgPj4gIDgpKSAmIDB4ZmY7XG4gICAgICAgICAgICByZXN1bHRbNCAqIGkgKyAzXSA9IChTWyB0WyhpICsgMykgJSA0XSAgICAgICAgJiAweGZmXSBeICB0dCAgICAgICApICYgMHhmZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgQUVTLnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24oY2lwaGVydGV4dCkge1xuICAgICAgICBpZiAoY2lwaGVydGV4dC5sZW5ndGggIT0gMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaXBoZXJ0ZXh0IHNpemUgKG11c3QgYmUgMTYgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcm91bmRzID0gdGhpcy5fS2QubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGEgPSBbMCwgMCwgMCwgMF07XG5cbiAgICAgICAgLy8gY29udmVydCBwbGFpbnRleHQgdG8gKGludHMgXiBrZXkpXG4gICAgICAgIHZhciB0ID0gY29udmVydFRvSW50MzIoY2lwaGVydGV4dCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICB0W2ldIF49IHRoaXMuX0tkWzBdW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXBwbHkgcm91bmQgdHJhbnNmb3Jtc1xuICAgICAgICBmb3IgKHZhciByID0gMTsgciA8IHJvdW5kczsgcisrKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICAgIGFbaV0gPSAoVDVbKHRbIGkgICAgICAgICAgXSA+PiAyNCkgJiAweGZmXSBeXG4gICAgICAgICAgICAgICAgICAgICAgICBUNlsodFsoaSArIDMpICUgNF0gPj4gMTYpICYgMHhmZl0gXlxuICAgICAgICAgICAgICAgICAgICAgICAgVDdbKHRbKGkgKyAyKSAlIDRdID4+ICA4KSAmIDB4ZmZdIF5cbiAgICAgICAgICAgICAgICAgICAgICAgIFQ4WyB0WyhpICsgMSkgJSA0XSAgICAgICAgJiAweGZmXSBeXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9LZFtyXVtpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0ID0gYS5zbGljZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIGxhc3Qgcm91bmQgaXMgc3BlY2lhbFxuICAgICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlQXJyYXkoMTYpLCB0dDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIHR0ID0gdGhpcy5fS2Rbcm91bmRzXVtpXTtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSAgICBdID0gKFNpWyh0WyBpICAgICAgICAgXSA+PiAyNCkgJiAweGZmXSBeICh0dCA+PiAyNCkpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDFdID0gKFNpWyh0WyhpICsgMykgJSA0XSA+PiAxNikgJiAweGZmXSBeICh0dCA+PiAxNikpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDJdID0gKFNpWyh0WyhpICsgMikgJSA0XSA+PiAgOCkgJiAweGZmXSBeICh0dCA+PiAgOCkpICYgMHhmZjtcbiAgICAgICAgICAgIHJlc3VsdFs0ICogaSArIDNdID0gKFNpWyB0WyhpICsgMSkgJSA0XSAgICAgICAgJiAweGZmXSBeICB0dCAgICAgICApICYgMHhmZjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiAgTW9kZSBPZiBPcGVyYXRpb24gLSBFbGVjdG9uaWMgQ29kZWJvb2sgKEVDQilcbiAgICAgKi9cbiAgICB2YXIgTW9kZU9mT3BlcmF0aW9uRUNCID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBNb2RlT2ZPcGVyYXRpb25FQ0IpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignQUVTIG11c3QgYmUgaW5zdGFuaXRhdGVkIHdpdGggYG5ld2AnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIkVsZWN0cm9uaWMgQ29kZSBCbG9ja1wiO1xuICAgICAgICB0aGlzLm5hbWUgPSBcImVjYlwiO1xuXG4gICAgICAgIHRoaXMuX2FlcyA9IG5ldyBBRVMoa2V5KTtcbiAgICB9XG5cbiAgICBNb2RlT2ZPcGVyYXRpb25FQ0IucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbihwbGFpbnRleHQpIHtcbiAgICAgICAgcGxhaW50ZXh0ID0gY29lcmNlQXJyYXkocGxhaW50ZXh0KTtcblxuICAgICAgICBpZiAoKHBsYWludGV4dC5sZW5ndGggJSAxNikgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwbGFpbnRleHQgc2l6ZSAobXVzdCBiZSBtdWx0aXBsZSBvZiAxNiBieXRlcyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjaXBoZXJ0ZXh0ID0gY3JlYXRlQXJyYXkocGxhaW50ZXh0Lmxlbmd0aCk7XG4gICAgICAgIHZhciBibG9jayA9IGNyZWF0ZUFycmF5KDE2KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWludGV4dC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgICAgIGNvcHlBcnJheShwbGFpbnRleHQsIGJsb2NrLCAwLCBpLCBpICsgMTYpO1xuICAgICAgICAgICAgYmxvY2sgPSB0aGlzLl9hZXMuZW5jcnlwdChibG9jayk7XG4gICAgICAgICAgICBjb3B5QXJyYXkoYmxvY2ssIGNpcGhlcnRleHQsIGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNpcGhlcnRleHQ7XG4gICAgfVxuXG4gICAgTW9kZU9mT3BlcmF0aW9uRUNCLnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24oY2lwaGVydGV4dCkge1xuICAgICAgICBjaXBoZXJ0ZXh0ID0gY29lcmNlQXJyYXkoY2lwaGVydGV4dCk7XG5cbiAgICAgICAgaWYgKChjaXBoZXJ0ZXh0Lmxlbmd0aCAlIDE2KSAhPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNpcGhlcnRleHQgc2l6ZSAobXVzdCBiZSBtdWx0aXBsZSBvZiAxNiBieXRlcyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwbGFpbnRleHQgPSBjcmVhdGVBcnJheShjaXBoZXJ0ZXh0Lmxlbmd0aCk7XG4gICAgICAgIHZhciBibG9jayA9IGNyZWF0ZUFycmF5KDE2KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNpcGhlcnRleHQubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgICAgICBjb3B5QXJyYXkoY2lwaGVydGV4dCwgYmxvY2ssIDAsIGksIGkgKyAxNik7XG4gICAgICAgICAgICBibG9jayA9IHRoaXMuX2Flcy5kZWNyeXB0KGJsb2NrKTtcbiAgICAgICAgICAgIGNvcHlBcnJheShibG9jaywgcGxhaW50ZXh0LCBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiAgTW9kZSBPZiBPcGVyYXRpb24gLSBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKENCQylcbiAgICAgKi9cbiAgICB2YXIgTW9kZU9mT3BlcmF0aW9uQ0JDID0gZnVuY3Rpb24oa2V5LCBpdikge1xuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTW9kZU9mT3BlcmF0aW9uQ0JDKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FFUyBtdXN0IGJlIGluc3Rhbml0YXRlZCB3aXRoIGBuZXdgJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gXCJDaXBoZXIgQmxvY2sgQ2hhaW5pbmdcIjtcbiAgICAgICAgdGhpcy5uYW1lID0gXCJjYmNcIjtcblxuICAgICAgICBpZiAoIWl2KSB7XG4gICAgICAgICAgICBpdiA9IGNyZWF0ZUFycmF5KDE2KTtcblxuICAgICAgICB9IGVsc2UgaWYgKGl2Lmxlbmd0aCAhPSAxNikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluaXRpYWxhdGlvbiB2ZWN0b3Igc2l6ZSAobXVzdCBiZSAxNiBieXRlcyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xhc3RDaXBoZXJibG9jayA9IGNvZXJjZUFycmF5KGl2LCB0cnVlKTtcblxuICAgICAgICB0aGlzLl9hZXMgPSBuZXcgQUVTKGtleSk7XG4gICAgfVxuXG4gICAgTW9kZU9mT3BlcmF0aW9uQ0JDLnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24ocGxhaW50ZXh0KSB7XG4gICAgICAgIHBsYWludGV4dCA9IGNvZXJjZUFycmF5KHBsYWludGV4dCk7XG5cbiAgICAgICAgaWYgKChwbGFpbnRleHQubGVuZ3RoICUgMTYpICE9PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGxhaW50ZXh0IHNpemUgKG11c3QgYmUgbXVsdGlwbGUgb2YgMTYgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2lwaGVydGV4dCA9IGNyZWF0ZUFycmF5KHBsYWludGV4dC5sZW5ndGgpO1xuICAgICAgICB2YXIgYmxvY2sgPSBjcmVhdGVBcnJheSgxNik7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbGFpbnRleHQubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgICAgICAgICBjb3B5QXJyYXkocGxhaW50ZXh0LCBibG9jaywgMCwgaSwgaSArIDE2KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgaisrKSB7XG4gICAgICAgICAgICAgICAgYmxvY2tbal0gXj0gdGhpcy5fbGFzdENpcGhlcmJsb2NrW2pdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9sYXN0Q2lwaGVyYmxvY2sgPSB0aGlzLl9hZXMuZW5jcnlwdChibG9jayk7XG4gICAgICAgICAgICBjb3B5QXJyYXkodGhpcy5fbGFzdENpcGhlcmJsb2NrLCBjaXBoZXJ0ZXh0LCBpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjaXBoZXJ0ZXh0O1xuICAgIH1cblxuICAgIE1vZGVPZk9wZXJhdGlvbkNCQy5wcm90b3R5cGUuZGVjcnlwdCA9IGZ1bmN0aW9uKGNpcGhlcnRleHQpIHtcbiAgICAgICAgY2lwaGVydGV4dCA9IGNvZXJjZUFycmF5KGNpcGhlcnRleHQpO1xuXG4gICAgICAgIGlmICgoY2lwaGVydGV4dC5sZW5ndGggJSAxNikgIT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjaXBoZXJ0ZXh0IHNpemUgKG11c3QgYmUgbXVsdGlwbGUgb2YgMTYgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGxhaW50ZXh0ID0gY3JlYXRlQXJyYXkoY2lwaGVydGV4dC5sZW5ndGgpO1xuICAgICAgICB2YXIgYmxvY2sgPSBjcmVhdGVBcnJheSgxNik7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaXBoZXJ0ZXh0Lmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICAgICAgY29weUFycmF5KGNpcGhlcnRleHQsIGJsb2NrLCAwLCBpLCBpICsgMTYpO1xuICAgICAgICAgICAgYmxvY2sgPSB0aGlzLl9hZXMuZGVjcnlwdChibG9jayk7XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgMTY7IGorKykge1xuICAgICAgICAgICAgICAgIHBsYWludGV4dFtpICsgal0gPSBibG9ja1tqXSBeIHRoaXMuX2xhc3RDaXBoZXJibG9ja1tqXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29weUFycmF5KGNpcGhlcnRleHQsIHRoaXMuX2xhc3RDaXBoZXJibG9jaywgMCwgaSwgaSArIDE2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwbGFpbnRleHQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiAgTW9kZSBPZiBPcGVyYXRpb24gLSBDaXBoZXIgRmVlZGJhY2sgKENGQilcbiAgICAgKi9cbiAgICB2YXIgTW9kZU9mT3BlcmF0aW9uQ0ZCID0gZnVuY3Rpb24oa2V5LCBpdiwgc2VnbWVudFNpemUpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1vZGVPZk9wZXJhdGlvbkNGQikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdBRVMgbXVzdCBiZSBpbnN0YW5pdGF0ZWQgd2l0aCBgbmV3YCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiQ2lwaGVyIEZlZWRiYWNrXCI7XG4gICAgICAgIHRoaXMubmFtZSA9IFwiY2ZiXCI7XG5cbiAgICAgICAgaWYgKCFpdikge1xuICAgICAgICAgICAgaXYgPSBjcmVhdGVBcnJheSgxNik7XG5cbiAgICAgICAgfSBlbHNlIGlmIChpdi5sZW5ndGggIT0gMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbml0aWFsYXRpb24gdmVjdG9yIHNpemUgKG11c3QgYmUgMTYgc2l6ZSknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VnbWVudFNpemUpIHsgc2VnbWVudFNpemUgPSAxOyB9XG5cbiAgICAgICAgdGhpcy5zZWdtZW50U2l6ZSA9IHNlZ21lbnRTaXplO1xuXG4gICAgICAgIHRoaXMuX3NoaWZ0UmVnaXN0ZXIgPSBjb2VyY2VBcnJheShpdiwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5fYWVzID0gbmV3IEFFUyhrZXkpO1xuICAgIH1cblxuICAgIE1vZGVPZk9wZXJhdGlvbkNGQi5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uKHBsYWludGV4dCkge1xuICAgICAgICBpZiAoKHBsYWludGV4dC5sZW5ndGggJSB0aGlzLnNlZ21lbnRTaXplKSAhPSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcGxhaW50ZXh0IHNpemUgKG11c3QgYmUgc2VnbWVudFNpemUgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW5jcnlwdGVkID0gY29lcmNlQXJyYXkocGxhaW50ZXh0LCB0cnVlKTtcblxuICAgICAgICB2YXIgeG9yU2VnbWVudDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmNyeXB0ZWQubGVuZ3RoOyBpICs9IHRoaXMuc2VnbWVudFNpemUpIHtcbiAgICAgICAgICAgIHhvclNlZ21lbnQgPSB0aGlzLl9hZXMuZW5jcnlwdCh0aGlzLl9zaGlmdFJlZ2lzdGVyKTtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5zZWdtZW50U2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgZW5jcnlwdGVkW2kgKyBqXSBePSB4b3JTZWdtZW50W2pdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTaGlmdCB0aGUgcmVnaXN0ZXJcbiAgICAgICAgICAgIGNvcHlBcnJheSh0aGlzLl9zaGlmdFJlZ2lzdGVyLCB0aGlzLl9zaGlmdFJlZ2lzdGVyLCAwLCB0aGlzLnNlZ21lbnRTaXplKTtcbiAgICAgICAgICAgIGNvcHlBcnJheShlbmNyeXB0ZWQsIHRoaXMuX3NoaWZ0UmVnaXN0ZXIsIDE2IC0gdGhpcy5zZWdtZW50U2l6ZSwgaSwgaSArIHRoaXMuc2VnbWVudFNpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgICB9XG5cbiAgICBNb2RlT2ZPcGVyYXRpb25DRkIucHJvdG90eXBlLmRlY3J5cHQgPSBmdW5jdGlvbihjaXBoZXJ0ZXh0KSB7XG4gICAgICAgIGlmICgoY2lwaGVydGV4dC5sZW5ndGggJSB0aGlzLnNlZ21lbnRTaXplKSAhPSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2lwaGVydGV4dCBzaXplIChtdXN0IGJlIHNlZ21lbnRTaXplIGJ5dGVzKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBsYWludGV4dCA9IGNvZXJjZUFycmF5KGNpcGhlcnRleHQsIHRydWUpO1xuXG4gICAgICAgIHZhciB4b3JTZWdtZW50O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWludGV4dC5sZW5ndGg7IGkgKz0gdGhpcy5zZWdtZW50U2l6ZSkge1xuICAgICAgICAgICAgeG9yU2VnbWVudCA9IHRoaXMuX2Flcy5lbmNyeXB0KHRoaXMuX3NoaWZ0UmVnaXN0ZXIpO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuc2VnbWVudFNpemU7IGorKykge1xuICAgICAgICAgICAgICAgIHBsYWludGV4dFtpICsgal0gXj0geG9yU2VnbWVudFtqXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2hpZnQgdGhlIHJlZ2lzdGVyXG4gICAgICAgICAgICBjb3B5QXJyYXkodGhpcy5fc2hpZnRSZWdpc3RlciwgdGhpcy5fc2hpZnRSZWdpc3RlciwgMCwgdGhpcy5zZWdtZW50U2l6ZSk7XG4gICAgICAgICAgICBjb3B5QXJyYXkoY2lwaGVydGV4dCwgdGhpcy5fc2hpZnRSZWdpc3RlciwgMTYgLSB0aGlzLnNlZ21lbnRTaXplLCBpLCBpICsgdGhpcy5zZWdtZW50U2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGxhaW50ZXh0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBNb2RlIE9mIE9wZXJhdGlvbiAtIE91dHB1dCBGZWVkYmFjayAoT0ZCKVxuICAgICAqL1xuICAgIHZhciBNb2RlT2ZPcGVyYXRpb25PRkIgPSBmdW5jdGlvbihrZXksIGl2KSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBNb2RlT2ZPcGVyYXRpb25PRkIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignQUVTIG11c3QgYmUgaW5zdGFuaXRhdGVkIHdpdGggYG5ld2AnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBcIk91dHB1dCBGZWVkYmFja1wiO1xuICAgICAgICB0aGlzLm5hbWUgPSBcIm9mYlwiO1xuXG4gICAgICAgIGlmICghaXYpIHtcbiAgICAgICAgICAgIGl2ID0gY3JlYXRlQXJyYXkoMTYpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoaXYubGVuZ3RoICE9IDE2KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5pdGlhbGF0aW9uIHZlY3RvciBzaXplIChtdXN0IGJlIDE2IGJ5dGVzKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbGFzdFByZWNpcGhlciA9IGNvZXJjZUFycmF5KGl2LCB0cnVlKTtcbiAgICAgICAgdGhpcy5fbGFzdFByZWNpcGhlckluZGV4ID0gMTY7XG5cbiAgICAgICAgdGhpcy5fYWVzID0gbmV3IEFFUyhrZXkpO1xuICAgIH1cblxuICAgIE1vZGVPZk9wZXJhdGlvbk9GQi5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uKHBsYWludGV4dCkge1xuICAgICAgICB2YXIgZW5jcnlwdGVkID0gY29lcmNlQXJyYXkocGxhaW50ZXh0LCB0cnVlKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuY3J5cHRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3RQcmVjaXBoZXJJbmRleCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0UHJlY2lwaGVyID0gdGhpcy5fYWVzLmVuY3J5cHQodGhpcy5fbGFzdFByZWNpcGhlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFByZWNpcGhlckluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVuY3J5cHRlZFtpXSBePSB0aGlzLl9sYXN0UHJlY2lwaGVyW3RoaXMuX2xhc3RQcmVjaXBoZXJJbmRleCsrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbmNyeXB0ZWQ7XG4gICAgfVxuXG4gICAgLy8gRGVjcnlwdGlvbiBpcyBzeW1ldHJpY1xuICAgIE1vZGVPZk9wZXJhdGlvbk9GQi5wcm90b3R5cGUuZGVjcnlwdCA9IE1vZGVPZk9wZXJhdGlvbk9GQi5wcm90b3R5cGUuZW5jcnlwdDtcblxuXG4gICAgLyoqXG4gICAgICogIENvdW50ZXIgb2JqZWN0IGZvciBDVFIgY29tbW9uIG1vZGUgb2Ygb3BlcmF0aW9uXG4gICAgICovXG4gICAgdmFyIENvdW50ZXIgPSBmdW5jdGlvbihpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvdW50ZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignQ291bnRlciBtdXN0IGJlIGluc3Rhbml0YXRlZCB3aXRoIGBuZXdgJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBhbGxvdyAwLCBidXQgYW55dGhpbmcgZmFsc2UtaXNoIHVzZXMgdGhlIGRlZmF1bHQgMVxuICAgICAgICBpZiAoaW5pdGlhbFZhbHVlICE9PSAwICYmICFpbml0aWFsVmFsdWUpIHsgaW5pdGlhbFZhbHVlID0gMTsgfVxuXG4gICAgICAgIGlmICh0eXBlb2YoaW5pdGlhbFZhbHVlKSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvdW50ZXIgPSBjcmVhdGVBcnJheSgxNik7XG4gICAgICAgICAgICB0aGlzLnNldFZhbHVlKGluaXRpYWxWYWx1ZSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Qnl0ZXMoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIENvdW50ZXIucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgIT09ICdudW1iZXInIHx8IHBhcnNlSW50KHZhbHVlKSAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGNvdW50ZXIgdmFsdWUgKG11c3QgYmUgYW4gaW50ZWdlciknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMTU7IGluZGV4ID49IDA7IC0taW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvdW50ZXJbaW5kZXhdID0gdmFsdWUgJSAyNTY7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBDb3VudGVyLnByb3RvdHlwZS5zZXRCeXRlcyA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICAgIGJ5dGVzID0gY29lcmNlQXJyYXkoYnl0ZXMsIHRydWUpO1xuXG4gICAgICAgIGlmIChieXRlcy5sZW5ndGggIT0gMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBjb3VudGVyIGJ5dGVzIHNpemUgKG11c3QgYmUgMTYgYnl0ZXMpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb3VudGVyID0gYnl0ZXM7XG4gICAgfTtcblxuICAgIENvdW50ZXIucHJvdG90eXBlLmluY3JlbWVudCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTU7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY291bnRlcltpXSA9PT0gMjU1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY291bnRlcltpXSA9IDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NvdW50ZXJbaV0rKztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogIE1vZGUgT2YgT3BlcmF0aW9uIC0gQ291bnRlciAoQ1RSKVxuICAgICAqL1xuICAgIHZhciBNb2RlT2ZPcGVyYXRpb25DVFIgPSBmdW5jdGlvbihrZXksIGNvdW50ZXIpIHtcbiAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1vZGVPZk9wZXJhdGlvbkNUUikpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdBRVMgbXVzdCBiZSBpbnN0YW5pdGF0ZWQgd2l0aCBgbmV3YCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IFwiQ291bnRlclwiO1xuICAgICAgICB0aGlzLm5hbWUgPSBcImN0clwiO1xuXG4gICAgICAgIGlmICghKGNvdW50ZXIgaW5zdGFuY2VvZiBDb3VudGVyKSkge1xuICAgICAgICAgICAgY291bnRlciA9IG5ldyBDb3VudGVyKGNvdW50ZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb3VudGVyID0gY291bnRlcjtcblxuICAgICAgICB0aGlzLl9yZW1haW5pbmdDb3VudGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVtYWluaW5nQ291bnRlckluZGV4ID0gMTY7XG5cbiAgICAgICAgdGhpcy5fYWVzID0gbmV3IEFFUyhrZXkpO1xuICAgIH1cblxuICAgIE1vZGVPZk9wZXJhdGlvbkNUUi5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uKHBsYWludGV4dCkge1xuICAgICAgICB2YXIgZW5jcnlwdGVkID0gY29lcmNlQXJyYXkocGxhaW50ZXh0LCB0cnVlKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVuY3J5cHRlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JlbWFpbmluZ0NvdW50ZXJJbmRleCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1haW5pbmdDb3VudGVyID0gdGhpcy5fYWVzLmVuY3J5cHQodGhpcy5fY291bnRlci5fY291bnRlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtYWluaW5nQ291bnRlckluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb3VudGVyLmluY3JlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5jcnlwdGVkW2ldIF49IHRoaXMuX3JlbWFpbmluZ0NvdW50ZXJbdGhpcy5fcmVtYWluaW5nQ291bnRlckluZGV4KytdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVuY3J5cHRlZDtcbiAgICB9XG5cbiAgICAvLyBEZWNyeXB0aW9uIGlzIHN5bWV0cmljXG4gICAgTW9kZU9mT3BlcmF0aW9uQ1RSLnByb3RvdHlwZS5kZWNyeXB0ID0gTW9kZU9mT3BlcmF0aW9uQ1RSLnByb3RvdHlwZS5lbmNyeXB0O1xuXG5cbiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIFBhZGRpbmdcblxuICAgIC8vIFNlZTpodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjMxNVxuICAgIGZ1bmN0aW9uIHBrY3M3cGFkKGRhdGEpIHtcbiAgICAgICAgZGF0YSA9IGNvZXJjZUFycmF5KGRhdGEsIHRydWUpO1xuICAgICAgICB2YXIgcGFkZGVyID0gMTYgLSAoZGF0YS5sZW5ndGggJSAxNik7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVBcnJheShkYXRhLmxlbmd0aCArIHBhZGRlcik7XG4gICAgICAgIGNvcHlBcnJheShkYXRhLCByZXN1bHQpO1xuICAgICAgICBmb3IgKHZhciBpID0gZGF0YS5sZW5ndGg7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBhZGRlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBrY3M3c3RyaXAoZGF0YSkge1xuICAgICAgICBkYXRhID0gY29lcmNlQXJyYXkoZGF0YSwgdHJ1ZSk7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDE2KSB7IHRocm93IG5ldyBFcnJvcignUEtDUyM3IGludmFsaWQgbGVuZ3RoJyk7IH1cblxuICAgICAgICB2YXIgcGFkZGVyID0gZGF0YVtkYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAocGFkZGVyID4gMTYpIHsgdGhyb3cgbmV3IEVycm9yKCdQS0NTIzcgcGFkZGluZyBieXRlIG91dCBvZiByYW5nZScpOyB9XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IGRhdGEubGVuZ3RoIC0gcGFkZGVyO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZGRlcjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZGF0YVtsZW5ndGggKyBpXSAhPT0gcGFkZGVyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQS0NTIzcgaW52YWxpZCBwYWRkaW5nIGJ5dGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVBcnJheShsZW5ndGgpO1xuICAgICAgICBjb3B5QXJyYXkoZGF0YSwgcmVzdWx0LCAwLCAwLCBsZW5ndGgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gRXhwb3J0aW5nXG5cblxuICAgIC8vIFRoZSBibG9jayBjaXBoZXJcbiAgICB2YXIgYWVzanMgPSB7XG4gICAgICAgIEFFUzogQUVTLFxuICAgICAgICBDb3VudGVyOiBDb3VudGVyLFxuXG4gICAgICAgIE1vZGVPZk9wZXJhdGlvbjoge1xuICAgICAgICAgICAgZWNiOiBNb2RlT2ZPcGVyYXRpb25FQ0IsXG4gICAgICAgICAgICBjYmM6IE1vZGVPZk9wZXJhdGlvbkNCQyxcbiAgICAgICAgICAgIGNmYjogTW9kZU9mT3BlcmF0aW9uQ0ZCLFxuICAgICAgICAgICAgb2ZiOiBNb2RlT2ZPcGVyYXRpb25PRkIsXG4gICAgICAgICAgICBjdHI6IE1vZGVPZk9wZXJhdGlvbkNUUlxuICAgICAgICB9LFxuXG4gICAgICAgIHV0aWxzOiB7XG4gICAgICAgICAgICBoZXg6IGNvbnZlcnRIZXgsXG4gICAgICAgICAgICB1dGY4OiBjb252ZXJ0VXRmOFxuICAgICAgICB9LFxuXG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICAgIHBrY3M3OiB7XG4gICAgICAgICAgICAgICAgcGFkOiBwa2NzN3BhZCxcbiAgICAgICAgICAgICAgICBzdHJpcDogcGtjczdzdHJpcFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9hcnJheVRlc3Q6IHtcbiAgICAgICAgICAgIGNvZXJjZUFycmF5OiBjb2VyY2VBcnJheSxcbiAgICAgICAgICAgIGNyZWF0ZUFycmF5OiBjcmVhdGVBcnJheSxcbiAgICAgICAgICAgIGNvcHlBcnJheTogY29weUFycmF5LFxuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgLy8gbm9kZS5qc1xuICAgIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBhZXNqc1xuXG4gICAgLy8gUmVxdWlyZUpTL0FNRFxuICAgIC8vIGh0dHA6Ly93d3cucmVxdWlyZWpzLm9yZy9kb2NzL2FwaS5odG1sXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FtZGpzL2FtZGpzLWFwaS93aWtpL0FNRFxuICAgIH0gZWxzZSBpZiAodHlwZW9mKGRlZmluZSkgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoYWVzanMpO1xuXG4gICAgLy8gV2ViIEJyb3dzZXJzXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXhpc3RpbmcgbGlicmFyeSBhdCBcImFlc2pzXCIgbWFrZSBzdXJlIGl0J3Mgc3RpbGwgYXZhaWxhYmxlXG4gICAgICAgIGlmIChyb290LmFlc2pzKSB7XG4gICAgICAgICAgICBhZXNqcy5fYWVzanMgPSByb290LmFlc2pzO1xuICAgICAgICB9XG5cbiAgICAgICAgcm9vdC5hZXNqcyA9IGFlc2pzO1xuICAgIH1cblxuXG59KSh0aGlzKTtcbiIsIid1c2Ugc3RyaWN0J1xudmFyIEFMUEhBQkVUID0gJ3FwenJ5OXg4Z2YydHZkdzBzM2puNTRraGNlNm11YTdsJ1xuXG4vLyBwcmUtY29tcHV0ZSBsb29rdXAgdGFibGVcbnZhciBBTFBIQUJFVF9NQVAgPSB7fVxuZm9yICh2YXIgeiA9IDA7IHogPCBBTFBIQUJFVC5sZW5ndGg7IHorKykge1xuICB2YXIgeCA9IEFMUEhBQkVULmNoYXJBdCh6KVxuXG4gIGlmIChBTFBIQUJFVF9NQVBbeF0gIT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBhbWJpZ3VvdXMnKVxuICBBTFBIQUJFVF9NQVBbeF0gPSB6XG59XG5cbmZ1bmN0aW9uIHBvbHltb2RTdGVwIChwcmUpIHtcbiAgdmFyIGIgPSBwcmUgPj4gMjVcbiAgcmV0dXJuICgocHJlICYgMHgxRkZGRkZGKSA8PCA1KSBeXG4gICAgKC0oKGIgPj4gMCkgJiAxKSAmIDB4M2I2YTU3YjIpIF5cbiAgICAoLSgoYiA+PiAxKSAmIDEpICYgMHgyNjUwOGU2ZCkgXlxuICAgICgtKChiID4+IDIpICYgMSkgJiAweDFlYTExOWZhKSBeXG4gICAgKC0oKGIgPj4gMykgJiAxKSAmIDB4M2Q0MjMzZGQpIF5cbiAgICAoLSgoYiA+PiA0KSAmIDEpICYgMHgyYTE0NjJiMylcbn1cblxuZnVuY3Rpb24gcHJlZml4Q2hrIChwcmVmaXgpIHtcbiAgdmFyIGNoayA9IDFcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXgubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYyA9IHByZWZpeC5jaGFyQ29kZUF0KGkpXG4gICAgaWYgKGMgPCAzMyB8fCBjID4gMTI2KSByZXR1cm4gJ0ludmFsaWQgcHJlZml4ICgnICsgcHJlZml4ICsgJyknXG5cbiAgICBjaGsgPSBwb2x5bW9kU3RlcChjaGspIF4gKGMgPj4gNSlcbiAgfVxuICBjaGsgPSBwb2x5bW9kU3RlcChjaGspXG5cbiAgZm9yIChpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7ICsraSkge1xuICAgIHZhciB2ID0gcHJlZml4LmNoYXJDb2RlQXQoaSlcbiAgICBjaGsgPSBwb2x5bW9kU3RlcChjaGspIF4gKHYgJiAweDFmKVxuICB9XG4gIHJldHVybiBjaGtcbn1cblxuZnVuY3Rpb24gZW5jb2RlIChwcmVmaXgsIHdvcmRzLCBMSU1JVCkge1xuICBMSU1JVCA9IExJTUlUIHx8IDkwXG4gIGlmICgocHJlZml4Lmxlbmd0aCArIDcgKyB3b3Jkcy5sZW5ndGgpID4gTElNSVQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4Y2VlZHMgbGVuZ3RoIGxpbWl0JylcblxuICBwcmVmaXggPSBwcmVmaXgudG9Mb3dlckNhc2UoKVxuXG4gIC8vIGRldGVybWluZSBjaGsgbW9kXG4gIHZhciBjaGsgPSBwcmVmaXhDaGsocHJlZml4KVxuICBpZiAodHlwZW9mIGNoayA9PT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcihjaGspXG5cbiAgdmFyIHJlc3VsdCA9IHByZWZpeCArICcxJ1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHggPSB3b3Jkc1tpXVxuICAgIGlmICgoeCA+PiA1KSAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdOb24gNS1iaXQgd29yZCcpXG5cbiAgICBjaGsgPSBwb2x5bW9kU3RlcChjaGspIF4geFxuICAgIHJlc3VsdCArPSBBTFBIQUJFVC5jaGFyQXQoeClcbiAgfVxuXG4gIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHtcbiAgICBjaGsgPSBwb2x5bW9kU3RlcChjaGspXG4gIH1cbiAgY2hrIF49IDFcblxuICBmb3IgKGkgPSAwOyBpIDwgNjsgKytpKSB7XG4gICAgdmFyIHYgPSAoY2hrID4+ICgoNSAtIGkpICogNSkpICYgMHgxZlxuICAgIHJlc3VsdCArPSBBTFBIQUJFVC5jaGFyQXQodilcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gX19kZWNvZGUgKHN0ciwgTElNSVQpIHtcbiAgTElNSVQgPSBMSU1JVCB8fCA5MFxuICBpZiAoc3RyLmxlbmd0aCA8IDgpIHJldHVybiBzdHIgKyAnIHRvbyBzaG9ydCdcbiAgaWYgKHN0ci5sZW5ndGggPiBMSU1JVCkgcmV0dXJuICdFeGNlZWRzIGxlbmd0aCBsaW1pdCdcblxuICAvLyBkb24ndCBhbGxvdyBtaXhlZCBjYXNlXG4gIHZhciBsb3dlcmVkID0gc3RyLnRvTG93ZXJDYXNlKClcbiAgdmFyIHVwcGVyZWQgPSBzdHIudG9VcHBlckNhc2UoKVxuICBpZiAoc3RyICE9PSBsb3dlcmVkICYmIHN0ciAhPT0gdXBwZXJlZCkgcmV0dXJuICdNaXhlZC1jYXNlIHN0cmluZyAnICsgc3RyXG4gIHN0ciA9IGxvd2VyZWRcblxuICB2YXIgc3BsaXQgPSBzdHIubGFzdEluZGV4T2YoJzEnKVxuICBpZiAoc3BsaXQgPT09IC0xKSByZXR1cm4gJ05vIHNlcGFyYXRvciBjaGFyYWN0ZXIgZm9yICcgKyBzdHJcbiAgaWYgKHNwbGl0ID09PSAwKSByZXR1cm4gJ01pc3NpbmcgcHJlZml4IGZvciAnICsgc3RyXG5cbiAgdmFyIHByZWZpeCA9IHN0ci5zbGljZSgwLCBzcGxpdClcbiAgdmFyIHdvcmRDaGFycyA9IHN0ci5zbGljZShzcGxpdCArIDEpXG4gIGlmICh3b3JkQ2hhcnMubGVuZ3RoIDwgNikgcmV0dXJuICdEYXRhIHRvbyBzaG9ydCdcblxuICB2YXIgY2hrID0gcHJlZml4Q2hrKHByZWZpeClcbiAgaWYgKHR5cGVvZiBjaGsgPT09ICdzdHJpbmcnKSByZXR1cm4gY2hrXG5cbiAgdmFyIHdvcmRzID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3JkQ2hhcnMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYyA9IHdvcmRDaGFycy5jaGFyQXQoaSlcbiAgICB2YXIgdiA9IEFMUEhBQkVUX01BUFtjXVxuICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHJldHVybiAnVW5rbm93biBjaGFyYWN0ZXIgJyArIGNcbiAgICBjaGsgPSBwb2x5bW9kU3RlcChjaGspIF4gdlxuXG4gICAgLy8gbm90IGluIHRoZSBjaGVja3N1bT9cbiAgICBpZiAoaSArIDYgPj0gd29yZENoYXJzLmxlbmd0aCkgY29udGludWVcbiAgICB3b3Jkcy5wdXNoKHYpXG4gIH1cblxuICBpZiAoY2hrICE9PSAxKSByZXR1cm4gJ0ludmFsaWQgY2hlY2tzdW0gZm9yICcgKyBzdHJcbiAgcmV0dXJuIHsgcHJlZml4OiBwcmVmaXgsIHdvcmRzOiB3b3JkcyB9XG59XG5cbmZ1bmN0aW9uIGRlY29kZVVuc2FmZSAoKSB7XG4gIHZhciByZXMgPSBfX2RlY29kZS5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gIGlmICh0eXBlb2YgcmVzID09PSAnb2JqZWN0JykgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBkZWNvZGUgKHN0cikge1xuICB2YXIgcmVzID0gX19kZWNvZGUuYXBwbHkobnVsbCwgYXJndW1lbnRzKVxuICBpZiAodHlwZW9mIHJlcyA9PT0gJ29iamVjdCcpIHJldHVybiByZXNcblxuICB0aHJvdyBuZXcgRXJyb3IocmVzKVxufVxuXG5mdW5jdGlvbiBjb252ZXJ0IChkYXRhLCBpbkJpdHMsIG91dEJpdHMsIHBhZCkge1xuICB2YXIgdmFsdWUgPSAwXG4gIHZhciBiaXRzID0gMFxuICB2YXIgbWF4ViA9ICgxIDw8IG91dEJpdHMpIC0gMVxuXG4gIHZhciByZXN1bHQgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyArK2kpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSA8PCBpbkJpdHMpIHwgZGF0YVtpXVxuICAgIGJpdHMgKz0gaW5CaXRzXG5cbiAgICB3aGlsZSAoYml0cyA+PSBvdXRCaXRzKSB7XG4gICAgICBiaXRzIC09IG91dEJpdHNcbiAgICAgIHJlc3VsdC5wdXNoKCh2YWx1ZSA+PiBiaXRzKSAmIG1heFYpXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhZCkge1xuICAgIGlmIChiaXRzID4gMCkge1xuICAgICAgcmVzdWx0LnB1c2goKHZhbHVlIDw8IChvdXRCaXRzIC0gYml0cykpICYgbWF4VilcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJpdHMgPj0gaW5CaXRzKSByZXR1cm4gJ0V4Y2VzcyBwYWRkaW5nJ1xuICAgIGlmICgodmFsdWUgPDwgKG91dEJpdHMgLSBiaXRzKSkgJiBtYXhWKSByZXR1cm4gJ05vbi16ZXJvIHBhZGRpbmcnXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbmZ1bmN0aW9uIHRvV29yZHNVbnNhZmUgKGJ5dGVzKSB7XG4gIHZhciByZXMgPSBjb252ZXJ0KGJ5dGVzLCA4LCA1LCB0cnVlKVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIHRvV29yZHMgKGJ5dGVzKSB7XG4gIHZhciByZXMgPSBjb252ZXJ0KGJ5dGVzLCA4LCA1LCB0cnVlKVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXMpKSByZXR1cm4gcmVzXG5cbiAgdGhyb3cgbmV3IEVycm9yKHJlcylcbn1cblxuZnVuY3Rpb24gZnJvbVdvcmRzVW5zYWZlICh3b3Jkcykge1xuICB2YXIgcmVzID0gY29udmVydCh3b3JkcywgNSwgOCwgZmFsc2UpXG4gIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gZnJvbVdvcmRzICh3b3Jkcykge1xuICB2YXIgcmVzID0gY29udmVydCh3b3JkcywgNSwgOCwgZmFsc2UpXG4gIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHJldHVybiByZXNcblxuICB0aHJvdyBuZXcgRXJyb3IocmVzKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZGVjb2RlVW5zYWZlOiBkZWNvZGVVbnNhZmUsXG4gIGRlY29kZTogZGVjb2RlLFxuICBlbmNvZGU6IGVuY29kZSxcbiAgdG9Xb3Jkc1Vuc2FmZTogdG9Xb3Jkc1Vuc2FmZSxcbiAgdG9Xb3JkczogdG9Xb3JkcyxcbiAgZnJvbVdvcmRzVW5zYWZlOiBmcm9tV29yZHNVbnNhZmUsXG4gIGZyb21Xb3JkczogZnJvbVdvcmRzXG59XG4iLCIoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLy8gVXRpbHNcbiAgZnVuY3Rpb24gYXNzZXJ0ICh2YWwsIG1zZykge1xuICAgIGlmICghdmFsKSB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG4gIH1cblxuICAvLyBDb3VsZCB1c2UgYGluaGVyaXRzYCBtb2R1bGUsIGJ1dCBkb24ndCB3YW50IHRvIG1vdmUgZnJvbSBzaW5nbGUgZmlsZVxuICAvLyBhcmNoaXRlY3R1cmUgeWV0LlxuICBmdW5jdGlvbiBpbmhlcml0cyAoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3I7XG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge307XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZTtcbiAgICBjdG9yLnByb3RvdHlwZSA9IG5ldyBUZW1wQ3RvcigpO1xuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfVxuXG4gIC8vIEJOXG5cbiAgZnVuY3Rpb24gQk4gKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKEJOLmlzQk4obnVtYmVyKSkge1xuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB0aGlzLndvcmRzID0gbnVsbDtcbiAgICB0aGlzLmxlbmd0aCA9IDA7XG5cbiAgICAvLyBSZWR1Y3Rpb24gY29udGV4dFxuICAgIHRoaXMucmVkID0gbnVsbDtcblxuICAgIGlmIChudW1iZXIgIT09IG51bGwpIHtcbiAgICAgIGlmIChiYXNlID09PSAnbGUnIHx8IGJhc2UgPT09ICdiZScpIHtcbiAgICAgICAgZW5kaWFuID0gYmFzZTtcbiAgICAgICAgYmFzZSA9IDEwO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pbml0KG51bWJlciB8fCAwLCBiYXNlIHx8IDEwLCBlbmRpYW4gfHwgJ2JlJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gQk47XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CTiA9IEJOO1xuICB9XG5cbiAgQk4uQk4gPSBCTjtcbiAgQk4ud29yZFNpemUgPSAyNjtcblxuICB2YXIgQnVmZmVyO1xuICB0cnkge1xuICAgIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4uaXNCTiA9IGZ1bmN0aW9uIGlzQk4gKG51bSkge1xuICAgIGlmIChudW0gaW5zdGFuY2VvZiBCTikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBCTi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KG51bS53b3Jkcyk7XG4gIH07XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gMTYpIHtcbiAgICAgIHRoaXMuX3BhcnNlSGV4KG51bWJlciwgc3RhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9wYXJzZUJhc2UobnVtYmVyLCBiYXNlLCBzdGFydCk7XG4gICAgfVxuXG4gICAgaWYgKG51bWJlclswXSA9PT0gJy0nKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9XG5cbiAgICB0aGlzLnN0cmlwKCk7XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICB0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksIGJhc2UsIGVuZGlhbik7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0TnVtYmVyID0gZnVuY3Rpb24gX2luaXROdW1iZXIgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgbnVtYmVyID0gLW51bWJlcjtcbiAgICB9XG4gICAgaWYgKG51bWJlciA8IDB4NDAwMDAwMCkge1xuICAgICAgdGhpcy53b3JkcyA9IFsgbnVtYmVyICYgMHgzZmZmZmZmIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChudW1iZXIgPCAweDEwMDAwMDAwMDAwMDAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQobnVtYmVyIDwgMHgyMDAwMDAwMDAwMDAwMCk7IC8vIDIgXiA1MyAodW5zYWZlKVxuICAgICAgdGhpcy53b3JkcyA9IFtcbiAgICAgICAgbnVtYmVyICYgMHgzZmZmZmZmLFxuICAgICAgICAobnVtYmVyIC8gMHg0MDAwMDAwKSAmIDB4M2ZmZmZmZixcbiAgICAgICAgMVxuICAgICAgXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMztcbiAgICB9XG5cbiAgICBpZiAoZW5kaWFuICE9PSAnbGUnKSByZXR1cm47XG5cbiAgICAvLyBSZXZlcnNlIHRoZSBieXRlc1xuICAgIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgYmFzZSwgZW5kaWFuKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2luaXRBcnJheSA9IGZ1bmN0aW9uIF9pbml0QXJyYXkgKG51bWJlciwgYmFzZSwgZW5kaWFuKSB7XG4gICAgLy8gUGVyaGFwcyBhIFVpbnQ4QXJyYXlcbiAgICBhc3NlcnQodHlwZW9mIG51bWJlci5sZW5ndGggPT09ICdudW1iZXInKTtcbiAgICBpZiAobnVtYmVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBwYXJzZUhleCAoc3RyLCBzdGFydCwgZW5kKSB7XG4gICAgdmFyIHIgPSAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1pbihzdHIubGVuZ3RoLCBlbmQpO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB2YXIgYyA9IHN0ci5jaGFyQ29kZUF0KGkpIC0gNDg7XG5cbiAgICAgIHIgPDw9IDQ7XG5cbiAgICAgIC8vICdhJyAtICdmJ1xuICAgICAgaWYgKGMgPj0gNDkgJiYgYyA8PSA1NCkge1xuICAgICAgICByIHw9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnIC0gJ0YnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcgJiYgYyA8PSAyMikge1xuICAgICAgICByIHw9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByIHw9IGMgJiAweGY7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCkge1xuICAgIC8vIENyZWF0ZSBwb3NzaWJseSBiaWdnZXIgYXJyYXkgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB0aGUgbnVtYmVyXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoKG51bWJlci5sZW5ndGggLSBzdGFydCkgLyA2KTtcbiAgICB0aGlzLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAwO1xuICAgIH1cblxuICAgIHZhciBqLCB3O1xuICAgIC8vIFNjYW4gMjQtYml0IGNodW5rcyBhbmQgYWRkIHRoZW0gdG8gdGhlIG51bWJlclxuICAgIHZhciBvZmYgPSAwO1xuICAgIGZvciAoaSA9IG51bWJlci5sZW5ndGggLSA2LCBqID0gMDsgaSA+PSBzdGFydDsgaSAtPSA2KSB7XG4gICAgICB3ID0gcGFyc2VIZXgobnVtYmVyLCBpLCBpICsgNik7XG4gICAgICB0aGlzLndvcmRzW2pdIHw9ICh3IDw8IG9mZikgJiAweDNmZmZmZmY7XG4gICAgICAvLyBOT1RFOiBgMHgzZmZmZmZgIGlzIGludGVudGlvbmFsIGhlcmUsIDI2Yml0cyBtYXggc2hpZnQgKyAyNGJpdCBoZXggbGltYlxuICAgICAgdGhpcy53b3Jkc1tqICsgMV0gfD0gdyA+Pj4gKDI2IC0gb2ZmKSAmIDB4M2ZmZmZmO1xuICAgICAgb2ZmICs9IDI0O1xuICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICBvZmYgLT0gMjY7XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgKyA2ICE9PSBzdGFydCkge1xuICAgICAgdyA9IHBhcnNlSGV4KG51bWJlciwgc3RhcnQsIGkgKyA2KTtcbiAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaiArIDFdIHw9IHcgPj4+ICgyNiAtIG9mZikgJiAweDNmZmZmZjtcbiAgICB9XG4gICAgdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBhcnNlQmFzZSAoc3RyLCBzdGFydCwgZW5kLCBtdWwpIHtcbiAgICB2YXIgciA9IDA7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKHN0ci5sZW5ndGgsIGVuZCk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSkgLSA0ODtcblxuICAgICAgciAqPSBtdWw7XG5cbiAgICAgIC8vICdhJ1xuICAgICAgaWYgKGMgPj0gNDkpIHtcbiAgICAgICAgciArPSBjIC0gNDkgKyAweGE7XG5cbiAgICAgIC8vICdBJ1xuICAgICAgfSBlbHNlIGlmIChjID49IDE3KSB7XG4gICAgICAgIHIgKz0gYyAtIDE3ICsgMHhhO1xuXG4gICAgICAvLyAnMCcgLSAnOSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHIgKz0gYztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uIF9wYXJzZUJhc2UgKG51bWJlciwgYmFzZSwgc3RhcnQpIHtcbiAgICAvLyBJbml0aWFsaXplIGFzIHplcm9cbiAgICB0aGlzLndvcmRzID0gWyAwIF07XG4gICAgdGhpcy5sZW5ndGggPSAxO1xuXG4gICAgLy8gRmluZCBsZW5ndGggb2YgbGltYiBpbiBiYXNlXG4gICAgZm9yICh2YXIgbGltYkxlbiA9IDAsIGxpbWJQb3cgPSAxOyBsaW1iUG93IDw9IDB4M2ZmZmZmZjsgbGltYlBvdyAqPSBiYXNlKSB7XG4gICAgICBsaW1iTGVuKys7XG4gICAgfVxuICAgIGxpbWJMZW4tLTtcbiAgICBsaW1iUG93ID0gKGxpbWJQb3cgLyBiYXNlKSB8IDA7XG5cbiAgICB2YXIgdG90YWwgPSBudW1iZXIubGVuZ3RoIC0gc3RhcnQ7XG4gICAgdmFyIG1vZCA9IHRvdGFsICUgbGltYkxlbjtcbiAgICB2YXIgZW5kID0gTWF0aC5taW4odG90YWwsIHRvdGFsIC0gbW9kKSArIHN0YXJ0O1xuXG4gICAgdmFyIHdvcmQgPSAwO1xuICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBsaW1iTGVuKSB7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgaSArIGxpbWJMZW4sIGJhc2UpO1xuXG4gICAgICB0aGlzLmltdWxuKGxpbWJQb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtb2QgIT09IDApIHtcbiAgICAgIHZhciBwb3cgPSAxO1xuICAgICAgd29yZCA9IHBhcnNlQmFzZShudW1iZXIsIGksIG51bWJlci5sZW5ndGgsIGJhc2UpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbW9kOyBpKyspIHtcbiAgICAgICAgcG93ICo9IGJhc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaW11bG4ocG93KTtcbiAgICAgIGlmICh0aGlzLndvcmRzWzBdICsgd29yZCA8IDB4NDAwMDAwMCkge1xuICAgICAgICB0aGlzLndvcmRzWzBdICs9IHdvcmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pYWRkbih3b3JkKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkZXN0KSB7XG4gICAgZGVzdC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZXN0LndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICB9XG4gICAgZGVzdC5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBkZXN0Lm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZTtcbiAgICBkZXN0LnJlZCA9IHRoaXMucmVkO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICB2YXIgciA9IG5ldyBCTihudWxsKTtcbiAgICB0aGlzLmNvcHkocik7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbiBfZXhwYW5kIChzaXplKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgc2l6ZSkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGAwYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3RyaXAgPSBmdW5jdGlvbiBzdHJpcCAoKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgIHRoaXMubGVuZ3RoLS07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fbm9ybVNpZ24gPSBmdW5jdGlvbiBfbm9ybVNpZ24gKCkge1xuICAgIC8vIC0wID0gMFxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICByZXR1cm4gKHRoaXMucmVkID8gJzxCTi1SOiAnIDogJzxCTjogJykgKyB0aGlzLnRvU3RyaW5nKDE2KSArICc+JztcbiAgfTtcblxuICAvKlxuXG4gIHZhciB6ZXJvcyA9IFtdO1xuICB2YXIgZ3JvdXBTaXplcyA9IFtdO1xuICB2YXIgZ3JvdXBCYXNlcyA9IFtdO1xuXG4gIHZhciBzID0gJyc7XG4gIHZhciBpID0gLTE7XG4gIHdoaWxlICgrK2kgPCBCTi53b3JkU2l6ZSkge1xuICAgIHplcm9zW2ldID0gcztcbiAgICBzICs9ICcwJztcbiAgfVxuICBncm91cFNpemVzWzBdID0gMDtcbiAgZ3JvdXBTaXplc1sxXSA9IDA7XG4gIGdyb3VwQmFzZXNbMF0gPSAwO1xuICBncm91cEJhc2VzWzFdID0gMDtcbiAgdmFyIGJhc2UgPSAyIC0gMTtcbiAgd2hpbGUgKCsrYmFzZSA8IDM2ICsgMSkge1xuICAgIHZhciBncm91cFNpemUgPSAwO1xuICAgIHZhciBncm91cEJhc2UgPSAxO1xuICAgIHdoaWxlIChncm91cEJhc2UgPCAoMSA8PCBCTi53b3JkU2l6ZSkgLyBiYXNlKSB7XG4gICAgICBncm91cEJhc2UgKj0gYmFzZTtcbiAgICAgIGdyb3VwU2l6ZSArPSAxO1xuICAgIH1cbiAgICBncm91cFNpemVzW2Jhc2VdID0gZ3JvdXBTaXplO1xuICAgIGdyb3VwQmFzZXNbYmFzZV0gPSBncm91cEJhc2U7XG4gIH1cblxuICAqL1xuXG4gIHZhciB6ZXJvcyA9IFtcbiAgICAnJyxcbiAgICAnMCcsXG4gICAgJzAwJyxcbiAgICAnMDAwJyxcbiAgICAnMDAwMCcsXG4gICAgJzAwMDAwJyxcbiAgICAnMDAwMDAwJyxcbiAgICAnMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCdcbiAgXTtcblxuICB2YXIgZ3JvdXBTaXplcyA9IFtcbiAgICAwLCAwLFxuICAgIDI1LCAxNiwgMTIsIDExLCAxMCwgOSwgOCxcbiAgICA4LCA3LCA3LCA3LCA3LCA2LCA2LFxuICAgIDYsIDYsIDYsIDYsIDYsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNSxcbiAgICA1LCA1LCA1LCA1LCA1LCA1LCA1XG4gIF07XG5cbiAgdmFyIGdyb3VwQmFzZXMgPSBbXG4gICAgMCwgMCxcbiAgICAzMzU1NDQzMiwgNDMwNDY3MjEsIDE2Nzc3MjE2LCA0ODgyODEyNSwgNjA0NjYxNzYsIDQwMzUzNjA3LCAxNjc3NzIxNixcbiAgICA0MzA0NjcyMSwgMTAwMDAwMDAsIDE5NDg3MTcxLCAzNTgzMTgwOCwgNjI3NDg1MTcsIDc1Mjk1MzYsIDExMzkwNjI1LFxuICAgIDE2Nzc3MjE2LCAyNDEzNzU2OSwgMzQwMTIyMjQsIDQ3MDQ1ODgxLCA2NDAwMDAwMCwgNDA4NDEwMSwgNTE1MzYzMixcbiAgICA2NDM2MzQzLCA3OTYyNjI0LCA5NzY1NjI1LCAxMTg4MTM3NiwgMTQzNDg5MDcsIDE3MjEwMzY4LCAyMDUxMTE0OSxcbiAgICAyNDMwMDAwMCwgMjg2MjkxNTEsIDMzNTU0NDMyLCAzOTEzNTM5MywgNDU0MzU0MjQsIDUyNTIxODc1LCA2MDQ2NjE3NlxuICBdO1xuXG4gIEJOLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nIChiYXNlLCBwYWRkaW5nKSB7XG4gICAgYmFzZSA9IGJhc2UgfHwgMTA7XG4gICAgcGFkZGluZyA9IHBhZGRpbmcgfCAwIHx8IDE7XG5cbiAgICB2YXIgb3V0O1xuICAgIGlmIChiYXNlID09PSAxNiB8fCBiYXNlID09PSAnaGV4Jykge1xuICAgICAgb3V0ID0gJyc7XG4gICAgICB2YXIgb2ZmID0gMDtcbiAgICAgIHZhciBjYXJyeSA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHcgPSB0aGlzLndvcmRzW2ldO1xuICAgICAgICB2YXIgd29yZCA9ICgoKHcgPDwgb2ZmKSB8IGNhcnJ5KSAmIDB4ZmZmZmZmKS50b1N0cmluZygxNik7XG4gICAgICAgIGNhcnJ5ID0gKHcgPj4+ICgyNCAtIG9mZikpICYgMHhmZmZmZmY7XG4gICAgICAgIGlmIChjYXJyeSAhPT0gMCB8fCBpICE9PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1s2IC0gd29yZC5sZW5ndGhdICsgd29yZCArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSB3b3JkICsgb3V0O1xuICAgICAgICB9XG4gICAgICAgIG9mZiArPSAyO1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGktLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICAgIG91dCA9IGNhcnJ5LnRvU3RyaW5nKDE2KSArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAoYmFzZSB8IDApICYmIGJhc2UgPj0gMiAmJiBiYXNlIDw9IDM2KSB7XG4gICAgICAvLyB2YXIgZ3JvdXBTaXplID0gTWF0aC5mbG9vcihCTi53b3JkU2l6ZSAqIE1hdGguTE4yIC8gTWF0aC5sb2coYmFzZSkpO1xuICAgICAgdmFyIGdyb3VwU2l6ZSA9IGdyb3VwU2l6ZXNbYmFzZV07XG4gICAgICAvLyB2YXIgZ3JvdXBCYXNlID0gTWF0aC5wb3coYmFzZSwgZ3JvdXBTaXplKTtcbiAgICAgIHZhciBncm91cEJhc2UgPSBncm91cEJhc2VzW2Jhc2VdO1xuICAgICAgb3V0ID0gJyc7XG4gICAgICB2YXIgYyA9IHRoaXMuY2xvbmUoKTtcbiAgICAgIGMubmVnYXRpdmUgPSAwO1xuICAgICAgd2hpbGUgKCFjLmlzWmVybygpKSB7XG4gICAgICAgIHZhciByID0gYy5tb2RuKGdyb3VwQmFzZSkudG9TdHJpbmcoYmFzZSk7XG4gICAgICAgIGMgPSBjLmlkaXZuKGdyb3VwQmFzZSk7XG5cbiAgICAgICAgaWYgKCFjLmlzWmVybygpKSB7XG4gICAgICAgICAgb3V0ID0gemVyb3NbZ3JvdXBTaXplIC0gci5sZW5ndGhdICsgciArIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXQgPSByICsgb3V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1plcm8oKSkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBhc3NlcnQoZmFsc2UsICdCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Jyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24gdG9OdW1iZXIgKCkge1xuICAgIHZhciByZXQgPSB0aGlzLndvcmRzWzBdO1xuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0ICs9IHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAweDAxKSB7XG4gICAgICAvLyBOT1RFOiBhdCB0aGlzIHN0YWdlIGl0IGlzIGtub3duIHRoYXQgdGhlIHRvcCBiaXQgaXMgc2V0XG4gICAgICByZXQgKz0gMHgxMDAwMDAwMDAwMDAwMCArICh0aGlzLndvcmRzWzFdICogMHg0MDAwMDAwKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gMikge1xuICAgICAgYXNzZXJ0KGZhbHNlLCAnTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzJyk7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgPyAtcmV0IDogcmV0O1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiB0b0J1ZmZlciAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpO1xuICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEJ1ZmZlciwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheSAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgZW5kaWFuLCBsZW5ndGgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b0FycmF5TGlrZSA9IGZ1bmN0aW9uIHRvQXJyYXlMaWtlIChBcnJheVR5cGUsIGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgoKTtcbiAgICB2YXIgcmVxTGVuZ3RoID0gbGVuZ3RoIHx8IE1hdGgubWF4KDEsIGJ5dGVMZW5ndGgpO1xuICAgIGFzc2VydChieXRlTGVuZ3RoIDw9IHJlcUxlbmd0aCwgJ2J5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgnKTtcbiAgICBhc3NlcnQocmVxTGVuZ3RoID4gMCwgJ1JlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCcpO1xuXG4gICAgdGhpcy5zdHJpcCgpO1xuICAgIHZhciBsaXR0bGVFbmRpYW4gPSBlbmRpYW4gPT09ICdsZSc7XG4gICAgdmFyIHJlcyA9IG5ldyBBcnJheVR5cGUocmVxTGVuZ3RoKTtcblxuICAgIHZhciBiLCBpO1xuICAgIHZhciBxID0gdGhpcy5jbG9uZSgpO1xuICAgIGlmICghbGl0dGxlRW5kaWFuKSB7XG4gICAgICAvLyBBc3N1bWUgYmlnLWVuZGlhblxuICAgICAgZm9yIChpID0gMDsgaSA8IHJlcUxlbmd0aCAtIGJ5dGVMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSAwOyAhcS5pc1plcm8oKTsgaSsrKSB7XG4gICAgICAgIGIgPSBxLmFuZGxuKDB4ZmYpO1xuICAgICAgICBxLml1c2hybig4KTtcblxuICAgICAgICByZXNbcmVxTGVuZ3RoIC0gaSAtIDFdID0gYjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChpID0gMDsgIXEuaXNaZXJvKCk7IGkrKykge1xuICAgICAgICBiID0gcS5hbmRsbigweGZmKTtcbiAgICAgICAgcS5pdXNocm4oOCk7XG5cbiAgICAgICAgcmVzW2ldID0gYjtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IGkgPCByZXFMZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgaWYgKE1hdGguY2x6MzIpIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHJldHVybiAzMiAtIE1hdGguY2x6MzIodyk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyA9IGZ1bmN0aW9uIF9jb3VudEJpdHMgKHcpIHtcbiAgICAgIHZhciB0ID0gdztcbiAgICAgIHZhciByID0gMDtcbiAgICAgIGlmICh0ID49IDB4MTAwMCkge1xuICAgICAgICByICs9IDEzO1xuICAgICAgICB0ID4+Pj0gMTM7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDQwKSB7XG4gICAgICAgIHIgKz0gNztcbiAgICAgICAgdCA+Pj49IDc7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAweDgpIHtcbiAgICAgICAgciArPSA0O1xuICAgICAgICB0ID4+Pj0gNDtcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4MDIpIHtcbiAgICAgICAgciArPSAyO1xuICAgICAgICB0ID4+Pj0gMjtcbiAgICAgIH1cbiAgICAgIHJldHVybiByICsgdDtcbiAgICB9O1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uIF96ZXJvQml0cyAodykge1xuICAgIC8vIFNob3J0LWN1dFxuICAgIGlmICh3ID09PSAwKSByZXR1cm4gMjY7XG5cbiAgICB2YXIgdCA9IHc7XG4gICAgdmFyIHIgPSAwO1xuICAgIGlmICgodCAmIDB4MWZmZikgPT09IDApIHtcbiAgICAgIHIgKz0gMTM7XG4gICAgICB0ID4+Pj0gMTM7XG4gICAgfVxuICAgIGlmICgodCAmIDB4N2YpID09PSAwKSB7XG4gICAgICByICs9IDc7XG4gICAgICB0ID4+Pj0gNztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHhmKSA9PT0gMCkge1xuICAgICAgciArPSA0O1xuICAgICAgdCA+Pj49IDQ7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MykgPT09IDApIHtcbiAgICAgIHIgKz0gMjtcbiAgICAgIHQgPj4+PSAyO1xuICAgIH1cbiAgICBpZiAoKHQgJiAweDEpID09PSAwKSB7XG4gICAgICByKys7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIC8vIFJldHVybiBudW1iZXIgb2YgdXNlZCBiaXRzIGluIGEgQk5cbiAgQk4ucHJvdG90eXBlLmJpdExlbmd0aCA9IGZ1bmN0aW9uIGJpdExlbmd0aCAoKSB7XG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV07XG4gICAgdmFyIGhpID0gdGhpcy5fY291bnRCaXRzKHcpO1xuICAgIHJldHVybiAodGhpcy5sZW5ndGggLSAxKSAqIDI2ICsgaGk7XG4gIH07XG5cbiAgZnVuY3Rpb24gdG9CaXRBcnJheSAobnVtKSB7XG4gICAgdmFyIHcgPSBuZXcgQXJyYXkobnVtLmJpdExlbmd0aCgpKTtcblxuICAgIGZvciAodmFyIGJpdCA9IDA7IGJpdCA8IHcubGVuZ3RoOyBiaXQrKykge1xuICAgICAgdmFyIG9mZiA9IChiaXQgLyAyNikgfCAwO1xuICAgICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgICAgd1tiaXRdID0gKG51bS53b3Jkc1tvZmZdICYgKDEgPDwgd2JpdCkpID4+PiB3Yml0O1xuICAgIH1cblxuICAgIHJldHVybiB3O1xuICB9XG5cbiAgLy8gTnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0c1xuICBCTi5wcm90b3R5cGUuemVyb0JpdHMgPSBmdW5jdGlvbiB6ZXJvQml0cyAoKSB7XG4gICAgaWYgKHRoaXMuaXNaZXJvKCkpIHJldHVybiAwO1xuXG4gICAgdmFyIHIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGIgPSB0aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2ldKTtcbiAgICAgIHIgKz0gYjtcbiAgICAgIGlmIChiICE9PSAyNikgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ieXRlTGVuZ3RoID0gZnVuY3Rpb24gYnl0ZUxlbmd0aCAoKSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvVHdvcyA9IGZ1bmN0aW9uIHRvVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWJzKCkuaW5vdG4od2lkdGgpLmlhZGRuKDEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tVHdvcyA9IGZ1bmN0aW9uIGZyb21Ud29zICh3aWR0aCkge1xuICAgIGlmICh0aGlzLnRlc3RuKHdpZHRoIC0gMSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdG4od2lkdGgpLmlhZGRuKDEpLmluZWcoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbiBpc05lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG5lZ2F0aXZlIGNsb25lIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnICgpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW5lZyA9IGZ1bmN0aW9uIGluZWcgKCkge1xuICAgIGlmICghdGhpcy5pc1plcm8oKSkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSBePSAxO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdW9yID0gZnVuY3Rpb24gaXVvciAobnVtKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgbnVtLmxlbmd0aCkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW0ubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldIHwgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlvciA9IGZ1bmN0aW9uIGlvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXVvcihudW0pO1xuICB9O1xuXG4gIC8vIE9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uIG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pb3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uIHVvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1b3IodGhpcyk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdWFuZCA9IGZ1bmN0aW9uIGl1YW5kIChudW0pIHtcbiAgICAvLyBiID0gbWluLWxlbmd0aChudW0sIHRoaXMpXG4gICAgdmFyIGI7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkge1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYiA9IHRoaXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSAmIG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IGIubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uIGlhbmQgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1YW5kKG51bSk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYW5kKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24gdWFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdWFuZCh0aGlzKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24gaXV4b3IgKG51bSkge1xuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYTtcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldIF4gYi53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcyAhPT0gYSkge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24gaXhvciAobnVtKSB7XG4gICAgYXNzZXJ0KCh0aGlzLm5lZ2F0aXZlIHwgbnVtLm5lZ2F0aXZlKSA9PT0gMCk7XG4gICAgcmV0dXJuIHRoaXMuaXV4b3IobnVtKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uIHhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5peG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml4b3IodGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnV4b3IgPSBmdW5jdGlvbiB1eG9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1eG9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLml1eG9yKHRoaXMpO1xuICB9O1xuXG4gIC8vIE5vdCBgYHRoaXNgYCB3aXRoIGBgd2lkdGhgYCBiaXR3aWR0aFxuICBCTi5wcm90b3R5cGUuaW5vdG4gPSBmdW5jdGlvbiBpbm90biAod2lkdGgpIHtcbiAgICBhc3NlcnQodHlwZW9mIHdpZHRoID09PSAnbnVtYmVyJyAmJiB3aWR0aCA+PSAwKTtcblxuICAgIHZhciBieXRlc05lZWRlZCA9IE1hdGguY2VpbCh3aWR0aCAvIDI2KSB8IDA7XG4gICAgdmFyIGJpdHNMZWZ0ID0gd2lkdGggJSAyNjtcblxuICAgIC8vIEV4dGVuZCB0aGUgYnVmZmVyIHdpdGggbGVhZGluZyB6ZXJvZXNcbiAgICB0aGlzLl9leHBhbmQoYnl0ZXNOZWVkZWQpO1xuXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgYnl0ZXNOZWVkZWQtLTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgY29tcGxldGUgd29yZHNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzTmVlZGVkOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB+dGhpcy53b3Jkc1tpXSAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgdGhlIHJlc2lkdWVcbiAgICBpZiAoYml0c0xlZnQgPiAwKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAoMHgzZmZmZmZmID4+ICgyNiAtIGJpdHNMZWZ0KSk7XG4gICAgfVxuXG4gICAgLy8gQW5kIHJlbW92ZSBsZWFkaW5nIHplcm9lc1xuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbiBub3RuICh3aWR0aCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4od2lkdGgpO1xuICB9O1xuXG4gIC8vIFNldCBgYml0YCBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnNldG4gPSBmdW5jdGlvbiBzZXRuIChiaXQsIHZhbCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyAmJiBiaXQgPj0gMCk7XG5cbiAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgdmFyIHdiaXQgPSBiaXQgJSAyNjtcblxuICAgIHRoaXMuX2V4cGFuZChvZmYgKyAxKTtcblxuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSB8ICgxIDw8IHdiaXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndvcmRzW29mZl0gPSB0aGlzLndvcmRzW29mZl0gJiB+KDEgPDwgd2JpdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAobnVtKSB7XG4gICAgdmFyIHI7XG5cbiAgICAvLyBuZWdhdGl2ZSArIHBvc2l0aXZlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gcG9zaXRpdmUgKyBuZWdhdGl2ZVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhLCBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIH0gZWxzZSBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAobnVtKSB7XG4gICAgdmFyIHJlcztcbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSB0aGlzLnN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSBpZiAobnVtLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gbnVtLnN1Yih0aGlzKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGQobnVtKTtcblxuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYWRkKHRoaXMpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAobnVtKSB7XG4gICAgLy8gdGhpcyAtICgtbnVtKSA9IHRoaXMgKyBudW1cbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgdmFyIHIgPSB0aGlzLmlhZGQobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcblxuICAgIC8vIC10aGlzIC0gbnVtID0gLSh0aGlzICsgbnVtKVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGQobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgdmFyIGNtcCA9IHRoaXMuY21wKG51bSk7XG5cbiAgICAvLyBPcHRpbWl6YXRpb24gLSB6ZXJvaWZ5XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIGEgPiBiXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGNtcCA+IDApIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSAtIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgaWYgKGNhcnJ5ID09PSAwICYmIGkgPCBhLmxlbmd0aCAmJiBhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSk7XG5cbiAgICBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RyaXAoKTtcbiAgfTtcblxuICAvLyBTdWJ0cmFjdCBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24gc3ViIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIobnVtKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzbWFsbE11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgdmFyIGxlbiA9IChzZWxmLmxlbmd0aCArIG51bS5sZW5ndGgpIHwgMDtcbiAgICBvdXQubGVuZ3RoID0gbGVuO1xuICAgIGxlbiA9IChsZW4gLSAxKSB8IDA7XG5cbiAgICAvLyBQZWVsIG9uZSBpdGVyYXRpb24gKGNvbXBpbGVyIGNhbid0IGRvIGl0LCBiZWNhdXNlIG9mIGNvZGUgY29tcGxleGl0eSlcbiAgICB2YXIgYSA9IHNlbGYud29yZHNbMF0gfCAwO1xuICAgIHZhciBiID0gbnVtLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgciA9IGEgKiBiO1xuXG4gICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICB2YXIgY2FycnkgPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgIG91dC53b3Jkc1swXSA9IGxvO1xuXG4gICAgZm9yICh2YXIgayA9IDE7IGsgPCBsZW47IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBjYXJyeSA+Pj4gMjY7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IChrIC0gaikgfCAwO1xuICAgICAgICBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIGIgPSBudW0ud29yZHNbal0gfCAwO1xuICAgICAgICByID0gYSAqIGIgKyByd29yZDtcbiAgICAgICAgbmNhcnJ5ICs9IChyIC8gMHg0MDAwMDAwKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkIHwgMDtcbiAgICAgIGNhcnJ5ID0gbmNhcnJ5IHwgMDtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBvdXQud29yZHNba10gPSBjYXJyeSB8IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnN0cmlwKCk7XG4gIH1cblxuICAvLyBUT0RPKGluZHV0bnkpOiBpdCBtYXkgYmUgcmVhc29uYWJsZSB0byBvbWl0IGl0IGZvciB1c2VycyB3aG8gZG9uJ3QgbmVlZFxuICAvLyB0byB3b3JrIHdpdGggMjU2LWJpdCBudW1iZXJzLCBvdGhlcndpc2UgaXQgZ2l2ZXMgMjAlIGltcHJvdmVtZW50IGZvciAyNTYtYml0XG4gIC8vIG11bHRpcGxpY2F0aW9uIChsaWtlIGVsbGlwdGljIHNlY3AyNTZrMSkuXG4gIHZhciBjb21iMTBNdWxUbyA9IGZ1bmN0aW9uIGNvbWIxME11bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIHZhciBhID0gc2VsZi53b3JkcztcbiAgICB2YXIgYiA9IG51bS53b3JkcztcbiAgICB2YXIgbyA9IG91dC53b3JkcztcbiAgICB2YXIgYyA9IDA7XG4gICAgdmFyIGxvO1xuICAgIHZhciBtaWQ7XG4gICAgdmFyIGhpO1xuICAgIHZhciBhMCA9IGFbMF0gfCAwO1xuICAgIHZhciBhbDAgPSBhMCAmIDB4MWZmZjtcbiAgICB2YXIgYWgwID0gYTAgPj4+IDEzO1xuICAgIHZhciBhMSA9IGFbMV0gfCAwO1xuICAgIHZhciBhbDEgPSBhMSAmIDB4MWZmZjtcbiAgICB2YXIgYWgxID0gYTEgPj4+IDEzO1xuICAgIHZhciBhMiA9IGFbMl0gfCAwO1xuICAgIHZhciBhbDIgPSBhMiAmIDB4MWZmZjtcbiAgICB2YXIgYWgyID0gYTIgPj4+IDEzO1xuICAgIHZhciBhMyA9IGFbM10gfCAwO1xuICAgIHZhciBhbDMgPSBhMyAmIDB4MWZmZjtcbiAgICB2YXIgYWgzID0gYTMgPj4+IDEzO1xuICAgIHZhciBhNCA9IGFbNF0gfCAwO1xuICAgIHZhciBhbDQgPSBhNCAmIDB4MWZmZjtcbiAgICB2YXIgYWg0ID0gYTQgPj4+IDEzO1xuICAgIHZhciBhNSA9IGFbNV0gfCAwO1xuICAgIHZhciBhbDUgPSBhNSAmIDB4MWZmZjtcbiAgICB2YXIgYWg1ID0gYTUgPj4+IDEzO1xuICAgIHZhciBhNiA9IGFbNl0gfCAwO1xuICAgIHZhciBhbDYgPSBhNiAmIDB4MWZmZjtcbiAgICB2YXIgYWg2ID0gYTYgPj4+IDEzO1xuICAgIHZhciBhNyA9IGFbN10gfCAwO1xuICAgIHZhciBhbDcgPSBhNyAmIDB4MWZmZjtcbiAgICB2YXIgYWg3ID0gYTcgPj4+IDEzO1xuICAgIHZhciBhOCA9IGFbOF0gfCAwO1xuICAgIHZhciBhbDggPSBhOCAmIDB4MWZmZjtcbiAgICB2YXIgYWg4ID0gYTggPj4+IDEzO1xuICAgIHZhciBhOSA9IGFbOV0gfCAwO1xuICAgIHZhciBhbDkgPSBhOSAmIDB4MWZmZjtcbiAgICB2YXIgYWg5ID0gYTkgPj4+IDEzO1xuICAgIHZhciBiMCA9IGJbMF0gfCAwO1xuICAgIHZhciBibDAgPSBiMCAmIDB4MWZmZjtcbiAgICB2YXIgYmgwID0gYjAgPj4+IDEzO1xuICAgIHZhciBiMSA9IGJbMV0gfCAwO1xuICAgIHZhciBibDEgPSBiMSAmIDB4MWZmZjtcbiAgICB2YXIgYmgxID0gYjEgPj4+IDEzO1xuICAgIHZhciBiMiA9IGJbMl0gfCAwO1xuICAgIHZhciBibDIgPSBiMiAmIDB4MWZmZjtcbiAgICB2YXIgYmgyID0gYjIgPj4+IDEzO1xuICAgIHZhciBiMyA9IGJbM10gfCAwO1xuICAgIHZhciBibDMgPSBiMyAmIDB4MWZmZjtcbiAgICB2YXIgYmgzID0gYjMgPj4+IDEzO1xuICAgIHZhciBiNCA9IGJbNF0gfCAwO1xuICAgIHZhciBibDQgPSBiNCAmIDB4MWZmZjtcbiAgICB2YXIgYmg0ID0gYjQgPj4+IDEzO1xuICAgIHZhciBiNSA9IGJbNV0gfCAwO1xuICAgIHZhciBibDUgPSBiNSAmIDB4MWZmZjtcbiAgICB2YXIgYmg1ID0gYjUgPj4+IDEzO1xuICAgIHZhciBiNiA9IGJbNl0gfCAwO1xuICAgIHZhciBibDYgPSBiNiAmIDB4MWZmZjtcbiAgICB2YXIgYmg2ID0gYjYgPj4+IDEzO1xuICAgIHZhciBiNyA9IGJbN10gfCAwO1xuICAgIHZhciBibDcgPSBiNyAmIDB4MWZmZjtcbiAgICB2YXIgYmg3ID0gYjcgPj4+IDEzO1xuICAgIHZhciBiOCA9IGJbOF0gfCAwO1xuICAgIHZhciBibDggPSBiOCAmIDB4MWZmZjtcbiAgICB2YXIgYmg4ID0gYjggPj4+IDEzO1xuICAgIHZhciBiOSA9IGJbOV0gfCAwO1xuICAgIHZhciBibDkgPSBiOSAmIDB4MWZmZjtcbiAgICB2YXIgYmg5ID0gYjkgPj4+IDEzO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0gc2VsZi5uZWdhdGl2ZSBeIG51bS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gMTk7XG4gICAgLyogayA9IDAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDAsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMCwgYmgwKTtcbiAgICB2YXIgdzAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcwID4+PiAyNikpIHwgMDtcbiAgICB3MCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDEsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDEpKSB8IDA7XG4gICAgdmFyIHcxID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MSA+Pj4gMjYpKSB8IDA7XG4gICAgdzEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAyICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWwyLCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDIsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDIsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMikpIHwgMDtcbiAgICB2YXIgdzIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcyID4+PiAyNikpIHwgMDtcbiAgICB3MiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDMsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMywgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMywgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMykpIHwgMDtcbiAgICB2YXIgdzMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHczID4+PiAyNikpIHwgMDtcbiAgICB3MyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDQsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDQpKSB8IDA7XG4gICAgdmFyIHc0ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NCA+Pj4gMjYpKSB8IDA7XG4gICAgdzQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA1ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw1LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDUsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDUsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNSkpIHwgMDtcbiAgICB2YXIgdzUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc1ID4+PiAyNikpIHwgMDtcbiAgICB3NSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDYsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNikpIHwgMDtcbiAgICB2YXIgdzYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc2ID4+PiAyNikpIHwgMDtcbiAgICB3NiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDcsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNywgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNywgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDAsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgwLCBiaDcpKSB8IDA7XG4gICAgdmFyIHc3ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3NyA+Pj4gMjYpKSB8IDA7XG4gICAgdzcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSA4ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw4LCBibDApO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDgsIGJoMCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDgsIGJoMCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwxKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgxKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoOCkpIHwgMDtcbiAgICB2YXIgdzggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc4ID4+PiAyNikpIHwgMDtcbiAgICB3OCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDkgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzkgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc5ID4+PiAyNikpIHwgMDtcbiAgICB3OSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEwICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDEpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMSk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMSwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwxLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDEsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDEsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEwID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTAgPj4+IDI2KSkgfCAwO1xuICAgIHcxMCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDExICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDIpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoMik7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsMikpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoMik7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDMsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgzLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwyLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDIsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMSA+Pj4gMjYpKSB8IDA7XG4gICAgdzExICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgzKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwzKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgzKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEyID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTIgPj4+IDI2KSkgfCAwO1xuICAgIHcxMiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDEzICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDQpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNCwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw0LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDQsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDQsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzEzID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTMgPj4+IDI2KSkgfCAwO1xuICAgIHcxMyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE0ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDUpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNSk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNSkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNSk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDYsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg2LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw1LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDUsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE0ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg2KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw2KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg2KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE1ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTUgPj4+IDI2KSkgfCAwO1xuICAgIHcxNSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE2ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDcpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoNyk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsNykpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoNyk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg4KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNywgYmw5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw3LCBiaDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDcsIGJsOSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDcsIGJoOSkpIHwgMDtcbiAgICB2YXIgdzE2ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTYgPj4+IDI2KSkgfCAwO1xuICAgIHcxNiAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDE3ICovXG4gICAgbG8gPSBNYXRoLmltdWwoYWw5LCBibDgpO1xuICAgIG1pZCA9IE1hdGguaW11bChhbDksIGJoOCk7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDksIGJsOCkpIHwgMDtcbiAgICBoaSA9IE1hdGguaW11bChhaDksIGJoOCk7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw4LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDgsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoOCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNyA+Pj4gMjYpKSB8IDA7XG4gICAgdzE3ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg5KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw5KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg5KTtcbiAgICB2YXIgdzE4ID0gKCgoYyArIGxvKSB8IDApICsgKChtaWQgJiAweDFmZmYpIDw8IDEzKSkgfCAwO1xuICAgIGMgPSAoKChoaSArIChtaWQgPj4+IDEzKSkgfCAwKSArICh3MTggPj4+IDI2KSkgfCAwO1xuICAgIHcxOCAmPSAweDNmZmZmZmY7XG4gICAgb1swXSA9IHcwO1xuICAgIG9bMV0gPSB3MTtcbiAgICBvWzJdID0gdzI7XG4gICAgb1szXSA9IHczO1xuICAgIG9bNF0gPSB3NDtcbiAgICBvWzVdID0gdzU7XG4gICAgb1s2XSA9IHc2O1xuICAgIG9bN10gPSB3NztcbiAgICBvWzhdID0gdzg7XG4gICAgb1s5XSA9IHc5O1xuICAgIG9bMTBdID0gdzEwO1xuICAgIG9bMTFdID0gdzExO1xuICAgIG9bMTJdID0gdzEyO1xuICAgIG9bMTNdID0gdzEzO1xuICAgIG9bMTRdID0gdzE0O1xuICAgIG9bMTVdID0gdzE1O1xuICAgIG9bMTZdID0gdzE2O1xuICAgIG9bMTddID0gdzE3O1xuICAgIG9bMThdID0gdzE4O1xuICAgIGlmIChjICE9PSAwKSB7XG4gICAgICBvWzE5XSA9IGM7XG4gICAgICBvdXQubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH07XG5cbiAgLy8gUG9seWZpbGwgY29tYlxuICBpZiAoIU1hdGguaW11bCkge1xuICAgIGNvbWIxME11bFRvID0gc21hbGxNdWxUbztcbiAgfVxuXG4gIGZ1bmN0aW9uIGJpZ011bFRvIChzZWxmLCBudW0sIG91dCkge1xuICAgIG91dC5uZWdhdGl2ZSA9IG51bS5uZWdhdGl2ZSBeIHNlbGYubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHNlbGYubGVuZ3RoICsgbnVtLmxlbmd0aDtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgdmFyIGhuY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgb3V0Lmxlbmd0aCAtIDE7IGsrKykge1xuICAgICAgLy8gU3VtIGFsbCB3b3JkcyB3aXRoIHRoZSBzYW1lIGBpICsgaiA9IGtgIGFuZCBhY2N1bXVsYXRlIGBuY2FycnlgLFxuICAgICAgLy8gbm90ZSB0aGF0IG5jYXJyeSBjb3VsZCBiZSA+PSAweDNmZmZmZmZcbiAgICAgIHZhciBuY2FycnkgPSBobmNhcnJ5O1xuICAgICAgaG5jYXJyeSA9IDA7XG4gICAgICB2YXIgcndvcmQgPSBjYXJyeSAmIDB4M2ZmZmZmZjtcbiAgICAgIHZhciBtYXhKID0gTWF0aC5taW4oaywgbnVtLmxlbmd0aCAtIDEpO1xuICAgICAgZm9yICh2YXIgaiA9IE1hdGgubWF4KDAsIGsgLSBzZWxmLmxlbmd0aCArIDEpOyBqIDw9IG1heEo7IGorKykge1xuICAgICAgICB2YXIgaSA9IGsgLSBqO1xuICAgICAgICB2YXIgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICB2YXIgYiA9IG51bS53b3Jkc1tqXSB8IDA7XG4gICAgICAgIHZhciByID0gYSAqIGI7XG5cbiAgICAgICAgdmFyIGxvID0gciAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArICgociAvIDB4NDAwMDAwMCkgfCAwKSkgfCAwO1xuICAgICAgICBsbyA9IChsbyArIHJ3b3JkKSB8IDA7XG4gICAgICAgIHJ3b3JkID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICAgIG5jYXJyeSA9IChuY2FycnkgKyAobG8gPj4+IDI2KSkgfCAwO1xuXG4gICAgICAgIGhuY2FycnkgKz0gbmNhcnJ5ID4+PiAyNjtcbiAgICAgICAgbmNhcnJ5ICY9IDB4M2ZmZmZmZjtcbiAgICAgIH1cbiAgICAgIG91dC53b3Jkc1trXSA9IHJ3b3JkO1xuICAgICAgY2FycnkgPSBuY2Fycnk7XG4gICAgICBuY2FycnkgPSBobmNhcnJ5O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIG91dC53b3Jkc1trXSA9IGNhcnJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24ganVtYm9NdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICB2YXIgZmZ0bSA9IG5ldyBGRlRNKCk7XG4gICAgcmV0dXJuIGZmdG0ubXVscChzZWxmLCBudW0sIG91dCk7XG4gIH1cblxuICBCTi5wcm90b3R5cGUubXVsVG8gPSBmdW5jdGlvbiBtdWxUbyAobnVtLCBvdXQpIHtcbiAgICB2YXIgcmVzO1xuICAgIHZhciBsZW4gPSB0aGlzLmxlbmd0aCArIG51bS5sZW5ndGg7XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxMCAmJiBudW0ubGVuZ3RoID09PSAxMCkge1xuICAgICAgcmVzID0gY29tYjEwTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgNjMpIHtcbiAgICAgIHJlcyA9IHNtYWxsTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSBpZiAobGVuIDwgMTAyNCkge1xuICAgICAgcmVzID0gYmlnTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSBqdW1ib011bFRvKHRoaXMsIG51bSwgb3V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIENvb2xleS1UdWtleSBhbGdvcml0aG0gZm9yIEZGVFxuICAvLyBzbGlnaHRseSByZXZpc2l0ZWQgdG8gcmVseSBvbiBsb29waW5nIGluc3RlYWQgb2YgcmVjdXJzaW9uXG5cbiAgZnVuY3Rpb24gRkZUTSAoeCwgeSkge1xuICAgIHRoaXMueCA9IHg7XG4gICAgdGhpcy55ID0geTtcbiAgfVxuXG4gIEZGVE0ucHJvdG90eXBlLm1ha2VSQlQgPSBmdW5jdGlvbiBtYWtlUkJUIChOKSB7XG4gICAgdmFyIHQgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIGwgPSBCTi5wcm90b3R5cGUuX2NvdW50Qml0cyhOKSAtIDE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspIHtcbiAgICAgIHRbaV0gPSB0aGlzLnJldkJpbihpLCBsLCBOKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdDtcbiAgfTtcblxuICAvLyBSZXR1cm5zIGJpbmFyeS1yZXZlcnNlZCByZXByZXNlbnRhdGlvbiBvZiBgeGBcbiAgRkZUTS5wcm90b3R5cGUucmV2QmluID0gZnVuY3Rpb24gcmV2QmluICh4LCBsLCBOKSB7XG4gICAgaWYgKHggPT09IDAgfHwgeCA9PT0gTiAtIDEpIHJldHVybiB4O1xuXG4gICAgdmFyIHJiID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykge1xuICAgICAgcmIgfD0gKHggJiAxKSA8PCAobCAtIGkgLSAxKTtcbiAgICAgIHggPj49IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJiO1xuICB9O1xuXG4gIC8vIFBlcmZvcm1zIFwidHdlZWRsaW5nXCIgcGhhc2UsIHRoZXJlZm9yZSAnZW11bGF0aW5nJ1xuICAvLyBiZWhhdmlvdXIgb2YgdGhlIHJlY3Vyc2l2ZSBhbGdvcml0aG1cbiAgRkZUTS5wcm90b3R5cGUucGVybXV0ZSA9IGZ1bmN0aW9uIHBlcm11dGUgKHJidCwgcndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4pIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcnR3c1tpXSA9IHJ3c1tyYnRbaV1dO1xuICAgICAgaXR3c1tpXSA9IGl3c1tyYnRbaV1dO1xuICAgIH1cbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbiB0cmFuc2Zvcm0gKHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOLCByYnQpIHtcbiAgICB0aGlzLnBlcm11dGUocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTik7XG5cbiAgICBmb3IgKHZhciBzID0gMTsgcyA8IE47IHMgPDw9IDEpIHtcbiAgICAgIHZhciBsID0gcyA8PCAxO1xuXG4gICAgICB2YXIgcnR3ZGYgPSBNYXRoLmNvcygyICogTWF0aC5QSSAvIGwpO1xuICAgICAgdmFyIGl0d2RmID0gTWF0aC5zaW4oMiAqIE1hdGguUEkgLyBsKTtcblxuICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBOOyBwICs9IGwpIHtcbiAgICAgICAgdmFyIHJ0d2RmXyA9IHJ0d2RmO1xuICAgICAgICB2YXIgaXR3ZGZfID0gaXR3ZGY7XG5cbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzOyBqKyspIHtcbiAgICAgICAgICB2YXIgcmUgPSBydHdzW3AgKyBqXTtcbiAgICAgICAgICB2YXIgaWUgPSBpdHdzW3AgKyBqXTtcblxuICAgICAgICAgIHZhciBybyA9IHJ0d3NbcCArIGogKyBzXTtcbiAgICAgICAgICB2YXIgaW8gPSBpdHdzW3AgKyBqICsgc107XG5cbiAgICAgICAgICB2YXIgcnggPSBydHdkZl8gKiBybyAtIGl0d2RmXyAqIGlvO1xuXG4gICAgICAgICAgaW8gPSBydHdkZl8gKiBpbyArIGl0d2RmXyAqIHJvO1xuICAgICAgICAgIHJvID0gcng7XG5cbiAgICAgICAgICBydHdzW3AgKyBqXSA9IHJlICsgcm87XG4gICAgICAgICAgaXR3c1twICsgal0gPSBpZSArIGlvO1xuXG4gICAgICAgICAgcnR3c1twICsgaiArIHNdID0gcmUgLSBybztcbiAgICAgICAgICBpdHdzW3AgKyBqICsgc10gPSBpZSAtIGlvO1xuXG4gICAgICAgICAgLyoganNoaW50IG1heGRlcHRoIDogZmFsc2UgKi9cbiAgICAgICAgICBpZiAoaiAhPT0gbCkge1xuICAgICAgICAgICAgcnggPSBydHdkZiAqIHJ0d2RmXyAtIGl0d2RmICogaXR3ZGZfO1xuXG4gICAgICAgICAgICBpdHdkZl8gPSBydHdkZiAqIGl0d2RmXyArIGl0d2RmICogcnR3ZGZfO1xuICAgICAgICAgICAgcnR3ZGZfID0gcng7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmd1ZXNzTGVuMTNiID0gZnVuY3Rpb24gZ3Vlc3NMZW4xM2IgKG4sIG0pIHtcbiAgICB2YXIgTiA9IE1hdGgubWF4KG0sIG4pIHwgMTtcbiAgICB2YXIgb2RkID0gTiAmIDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoTiA9IE4gLyAyIHwgMDsgTjsgTiA9IE4gPj4+IDEpIHtcbiAgICAgIGkrKztcbiAgICB9XG5cbiAgICByZXR1cm4gMSA8PCBpICsgMSArIG9kZDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb25qdWdhdGUgPSBmdW5jdGlvbiBjb25qdWdhdGUgKHJ3cywgaXdzLCBOKSB7XG4gICAgaWYgKE4gPD0gMSkgcmV0dXJuO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdCA9IHJ3c1tpXTtcblxuICAgICAgcndzW2ldID0gcndzW04gLSBpIC0gMV07XG4gICAgICByd3NbTiAtIGkgLSAxXSA9IHQ7XG5cbiAgICAgIHQgPSBpd3NbaV07XG5cbiAgICAgIGl3c1tpXSA9IC1pd3NbTiAtIGkgLSAxXTtcbiAgICAgIGl3c1tOIC0gaSAtIDFdID0gLXQ7XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm5vcm1hbGl6ZTEzYiA9IGZ1bmN0aW9uIG5vcm1hbGl6ZTEzYiAod3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTiAvIDI7IGkrKykge1xuICAgICAgdmFyIHcgPSBNYXRoLnJvdW5kKHdzWzIgKiBpICsgMV0gLyBOKSAqIDB4MjAwMCArXG4gICAgICAgIE1hdGgucm91bmQod3NbMiAqIGldIC8gTikgK1xuICAgICAgICBjYXJyeTtcblxuICAgICAgd3NbaV0gPSB3ICYgMHgzZmZmZmZmO1xuXG4gICAgICBpZiAodyA8IDB4NDAwMDAwMCkge1xuICAgICAgICBjYXJyeSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXJyeSA9IHcgLyAweDQwMDAwMDAgfCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB3cztcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5jb252ZXJ0MTNiID0gZnVuY3Rpb24gY29udmVydDEzYiAod3MsIGxlbiwgcndzLCBOKSB7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjYXJyeSA9IGNhcnJ5ICsgKHdzW2ldIHwgMCk7XG5cbiAgICAgIHJ3c1syICogaV0gPSBjYXJyeSAmIDB4MWZmZjsgY2FycnkgPSBjYXJyeSA+Pj4gMTM7XG4gICAgICByd3NbMiAqIGkgKyAxXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICB9XG5cbiAgICAvLyBQYWQgd2l0aCB6ZXJvZXNcbiAgICBmb3IgKGkgPSAyICogbGVuOyBpIDwgTjsgKytpKSB7XG4gICAgICByd3NbaV0gPSAwO1xuICAgIH1cblxuICAgIGFzc2VydChjYXJyeSA9PT0gMCk7XG4gICAgYXNzZXJ0KChjYXJyeSAmIH4weDFmZmYpID09PSAwKTtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5zdHViID0gZnVuY3Rpb24gc3R1YiAoTikge1xuICAgIHZhciBwaCA9IG5ldyBBcnJheShOKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgcGhbaV0gPSAwO1xuICAgIH1cblxuICAgIHJldHVybiBwaDtcbiAgfTtcblxuICBGRlRNLnByb3RvdHlwZS5tdWxwID0gZnVuY3Rpb24gbXVscCAoeCwgeSwgb3V0KSB7XG4gICAgdmFyIE4gPSAyICogdGhpcy5ndWVzc0xlbjEzYih4Lmxlbmd0aCwgeS5sZW5ndGgpO1xuXG4gICAgdmFyIHJidCA9IHRoaXMubWFrZVJCVChOKTtcblxuICAgIHZhciBfID0gdGhpcy5zdHViKE4pO1xuXG4gICAgdmFyIHJ3cyA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgcndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBucndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBucndzdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbml3c3QgPSBuZXcgQXJyYXkoTik7XG5cbiAgICB2YXIgcm13cyA9IG91dC53b3JkcztcbiAgICBybXdzLmxlbmd0aCA9IE47XG5cbiAgICB0aGlzLmNvbnZlcnQxM2IoeC53b3JkcywgeC5sZW5ndGgsIHJ3cywgTik7XG4gICAgdGhpcy5jb252ZXJ0MTNiKHkud29yZHMsIHkubGVuZ3RoLCBucndzLCBOKTtcblxuICAgIHRoaXMudHJhbnNmb3JtKHJ3cywgXywgcndzdCwgaXdzdCwgTiwgcmJ0KTtcbiAgICB0aGlzLnRyYW5zZm9ybShucndzLCBfLCBucndzdCwgbml3c3QsIE4sIHJidCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdmFyIHJ4ID0gcndzdFtpXSAqIG5yd3N0W2ldIC0gaXdzdFtpXSAqIG5pd3N0W2ldO1xuICAgICAgaXdzdFtpXSA9IHJ3c3RbaV0gKiBuaXdzdFtpXSArIGl3c3RbaV0gKiBucndzdFtpXTtcbiAgICAgIHJ3c3RbaV0gPSByeDtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmp1Z2F0ZShyd3N0LCBpd3N0LCBOKTtcbiAgICB0aGlzLnRyYW5zZm9ybShyd3N0LCBpd3N0LCBybXdzLCBfLCBOLCByYnQpO1xuICAgIHRoaXMuY29uanVnYXRlKHJtd3MsIF8sIE4pO1xuICAgIHRoaXMubm9ybWFsaXplMTNiKHJtd3MsIE4pO1xuXG4gICAgb3V0Lm5lZ2F0aXZlID0geC5uZWdhdGl2ZSBeIHkubmVnYXRpdmU7XG4gICAgb3V0Lmxlbmd0aCA9IHgubGVuZ3RoICsgeS5sZW5ndGg7XG4gICAgcmV0dXJuIG91dC5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGB0aGlzYCBieSBgbnVtYFxuICBCTi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLm11bFRvKG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBlbXBsb3lpbmcgRkZUXG4gIEJOLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24gbXVsZiAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgTXVsdGlwbGljYXRpb25cbiAgQk4ucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSwgdGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24gaW11bG4gKG51bSkge1xuICAgIGFzc2VydCh0eXBlb2YgbnVtID09PSAnbnVtYmVyJyk7XG4gICAgYXNzZXJ0KG51bSA8IDB4NDAwMDAwMCk7XG5cbiAgICAvLyBDYXJyeVxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9ICh0aGlzLndvcmRzW2ldIHwgMCkgKiBudW07XG4gICAgICB2YXIgbG8gPSAodyAmIDB4M2ZmZmZmZikgKyAoY2FycnkgJiAweDNmZmZmZmYpO1xuICAgICAgY2FycnkgPj49IDI2O1xuICAgICAgY2FycnkgKz0gKHcgLyAweDQwMDAwMDApIHwgMDtcbiAgICAgIC8vIE5PVEU6IGxvIGlzIDI3Yml0IG1heGltdW1cbiAgICAgIGNhcnJ5ICs9IGxvID4+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbiBtdWxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKG51bSk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7XG4gIH07XG5cbiAgLy8gTWF0aC5wb3coYHRoaXNgLCBgbnVtYClcbiAgQk4ucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAobnVtKSB7XG4gICAgdmFyIHcgPSB0b0JpdEFycmF5KG51bSk7XG4gICAgaWYgKHcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IEJOKDEpO1xuXG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lc1xuICAgIHZhciByZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdy5sZW5ndGg7IGkrKywgcmVzID0gcmVzLnNxcigpKSB7XG4gICAgICBpZiAod1tpXSAhPT0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCsraSA8IHcubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBxID0gcmVzLnNxcigpOyBpIDwgdy5sZW5ndGg7IGkrKywgcSA9IHEuc3FyKCkpIHtcbiAgICAgICAgaWYgKHdbaV0gPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHJlcy5tdWwocSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0IGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbiBpdXNobG4gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG4gICAgdmFyIGNhcnJ5TWFzayA9ICgweDNmZmZmZmYgPj4+ICgyNiAtIHIpKSA8PCAoMjYgLSByKTtcbiAgICB2YXIgaTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV3Q2FycnkgPSB0aGlzLndvcmRzW2ldICYgY2FycnlNYXNrO1xuICAgICAgICB2YXIgYyA9ICgodGhpcy53b3Jkc1tpXSB8IDApIC0gbmV3Q2FycnkpIDw8IHI7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjIHwgY2Fycnk7XG4gICAgICAgIGNhcnJ5ID0gbmV3Q2FycnkgPj4+ICgyNiAtIHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FycnkpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIHNdID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sZW5ndGggKz0gcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uIGlzaGxuIChiaXRzKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hsbihiaXRzKTtcbiAgfTtcblxuICAvLyBTaGlmdC1yaWdodCBpbi1wbGFjZVxuICAvLyBOT1RFOiBgaGludGAgaXMgYSBsb3dlc3QgYml0IGJlZm9yZSB0cmFpbGluZyB6ZXJvZXNcbiAgLy8gTk9URTogaWYgYGV4dGVuZGVkYCBpcyBwcmVzZW50IC0gaXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBkZXN0cm95ZWQgYml0c1xuICBCTi5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24gaXVzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgaDtcbiAgICBpZiAoaGludCkge1xuICAgICAgaCA9IChoaW50IC0gKGhpbnQgJSAyNikpIC8gMjY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGggPSAwO1xuICAgIH1cblxuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gTWF0aC5taW4oKGJpdHMgLSByKSAvIDI2LCB0aGlzLmxlbmd0aCk7XG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgdmFyIG1hc2tlZFdvcmRzID0gZXh0ZW5kZWQ7XG5cbiAgICBoIC09IHM7XG4gICAgaCA9IE1hdGgubWF4KDAsIGgpO1xuXG4gICAgLy8gRXh0ZW5kZWQgbW9kZSwgY29weSBtYXNrZWQgcGFydFxuICAgIGlmIChtYXNrZWRXb3Jkcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzOyBpKyspIHtcbiAgICAgICAgbWFza2VkV29yZHMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldO1xuICAgICAgfVxuICAgICAgbWFza2VkV29yZHMubGVuZ3RoID0gcztcbiAgICB9XG5cbiAgICBpZiAocyA9PT0gMCkge1xuICAgICAgLy8gTm8tb3AsIHdlIHNob3VsZCBub3QgbW92ZSBhbnl0aGluZyBhdCBhbGxcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID4gcykge1xuICAgICAgdGhpcy5sZW5ndGggLT0gcztcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2kgKyBzXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMCAmJiAoY2FycnkgIT09IDAgfHwgaSA+PSBoKTsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IChjYXJyeSA8PCAoMjYgLSByKSkgfCAod29yZCA+Pj4gcik7XG4gICAgICBjYXJyeSA9IHdvcmQgJiBtYXNrO1xuICAgIH1cblxuICAgIC8vIFB1c2ggY2FycmllZCBiaXRzIGFzIGEgbWFza1xuICAgIGlmIChtYXNrZWRXb3JkcyAmJiBjYXJyeSAhPT0gMCkge1xuICAgICAgbWFza2VkV29yZHMud29yZHNbbWFza2VkV29yZHMubGVuZ3RoKytdID0gY2Fycnk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc2hybiA9IGZ1bmN0aW9uIGlzaHJuIChiaXRzLCBoaW50LCBleHRlbmRlZCkge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNocm4oYml0cywgaGludCwgZXh0ZW5kZWQpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LWxlZnRcbiAgQk4ucHJvdG90eXBlLnNobG4gPSBmdW5jdGlvbiBzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbiB1c2hsbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFNoaWZ0LXJpZ2h0XG4gIEJOLnByb3RvdHlwZS5zaHJuID0gZnVuY3Rpb24gc2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXNocm4oYml0cyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24gdXNocm4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihiaXRzKTtcbiAgfTtcblxuICAvLyBUZXN0IGlmIG4gYml0IGlzIHNldFxuICBCTi5wcm90b3R5cGUudGVzdG4gPSBmdW5jdGlvbiB0ZXN0biAoYml0KSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcbiAgICB2YXIgciA9IGJpdCAlIDI2O1xuICAgIHZhciBzID0gKGJpdCAtIHIpIC8gMjY7XG4gICAgdmFyIHEgPSAxIDw8IHI7XG5cbiAgICAvLyBGYXN0IGNhc2U6IGJpdCBpcyBtdWNoIGhpZ2hlciB0aGFuIGFsbCBleGlzdGluZyB3b3Jkc1xuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBiaXQgYW5kIHJldHVyblxuICAgIHZhciB3ID0gdGhpcy53b3Jkc1tzXTtcblxuICAgIHJldHVybiAhISh3ICYgcSk7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG9ubHkgbG93ZXJzIGJpdHMgb2YgbnVtYmVyIChpbi1wbGFjZSlcbiAgQk4ucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uIGltYXNrbiAoYml0cykge1xuICAgIGFzc2VydCh0eXBlb2YgYml0cyA9PT0gJ251bWJlcicgJiYgYml0cyA+PSAwKTtcbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IChiaXRzIC0gcikgLyAyNjtcblxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwLCAnaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzJyk7XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHIgIT09IDApIHtcbiAgICAgIHMrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1pbihzLCB0aGlzLmxlbmd0aCk7XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgdmFyIG1hc2sgPSAweDNmZmZmZmYgXiAoKDB4M2ZmZmZmZiA+Pj4gcikgPDwgcik7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gJj0gbWFzaztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlclxuICBCTi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbiBtYXNrbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGJpdHMpO1xuICB9O1xuXG4gIC8vIEFkZCBwbGFpbiBudW1iZXIgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uIGlhZGRuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pc3VibigtbnVtKTtcblxuICAgIC8vIFBvc3NpYmxlIHNpZ24gY2hhbmdlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDwgbnVtKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gPSBudW0gLSAodGhpcy53b3Jkc1swXSB8IDApO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgdGhpcy5pc3VibihudW0pO1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgd2l0aG91dCBjaGVja3NcbiAgICByZXR1cm4gdGhpcy5faWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2lhZGRuID0gZnVuY3Rpb24gX2lhZGRuIChudW0pIHtcbiAgICB0aGlzLndvcmRzWzBdICs9IG51bTtcblxuICAgIC8vIENhcnJ5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldID49IDB4NDAwMDAwMDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldIC09IDB4NDAwMDAwMDtcbiAgICAgIGlmIChpID09PSB0aGlzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0rKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSArIDEpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgcGxhaW4gbnVtYmVyIGBudW1gIGZyb20gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pc3VibiA9IGZ1bmN0aW9uIGlzdWJuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pYWRkbigtbnVtKTtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaWFkZG4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy53b3Jkc1swXSAtPSBudW07XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA8IDApIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYXJyeVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aCAmJiB0aGlzLndvcmRzW2ldIDwgMDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gKz0gMHg0MDAwMDAwO1xuICAgICAgICB0aGlzLndvcmRzW2kgKyAxXSAtPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbiBhZGRuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnN1Ym4gPSBmdW5jdGlvbiBzdWJuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlhYnMgPSBmdW5jdGlvbiBpYWJzICgpIHtcbiAgICB0aGlzLm5lZ2F0aXZlID0gMDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbiBhYnMgKCkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFicygpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbiBfaXNobG5zdWJtdWwgKG51bSwgbXVsLCBzaGlmdCkge1xuICAgIHZhciBsZW4gPSBudW0ubGVuZ3RoICsgc2hpZnQ7XG4gICAgdmFyIGk7XG5cbiAgICB0aGlzLl9leHBhbmQobGVuKTtcblxuICAgIHZhciB3O1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdyA9ICh0aGlzLndvcmRzW2kgKyBzaGlmdF0gfCAwKSArIGNhcnJ5O1xuICAgICAgdmFyIHJpZ2h0ID0gKG51bS53b3Jkc1tpXSB8IDApICogbXVsO1xuICAgICAgdyAtPSByaWdodCAmIDB4M2ZmZmZmZjtcbiAgICAgIGNhcnJ5ID0gKHcgPj4gMjYpIC0gKChyaWdodCAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuICAgIGZvciAoOyBpIDwgdGhpcy5sZW5ndGggLSBzaGlmdDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHcgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2kgKyBzaGlmdF0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSA9PT0gMCkgcmV0dXJuIHRoaXMuc3RyaXAoKTtcblxuICAgIC8vIFN1YnRyYWN0aW9uIG92ZXJmbG93XG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAtMSk7XG4gICAgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gLSh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICB0aGlzLm5lZ2F0aXZlID0gMTtcblxuICAgIHJldHVybiB0aGlzLnN0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24gX3dvcmREaXYgKG51bSwgbW9kZSkge1xuICAgIHZhciBzaGlmdCA9IHRoaXMubGVuZ3RoIC0gbnVtLmxlbmd0aDtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtO1xuXG4gICAgLy8gTm9ybWFsaXplXG4gICAgdmFyIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgdmFyIGJoaUJpdHMgPSB0aGlzLl9jb3VudEJpdHMoYmhpKTtcbiAgICBzaGlmdCA9IDI2IC0gYmhpQml0cztcbiAgICBpZiAoc2hpZnQgIT09IDApIHtcbiAgICAgIGIgPSBiLnVzaGxuKHNoaWZ0KTtcbiAgICAgIGEuaXVzaGxuKHNoaWZ0KTtcbiAgICAgIGJoaSA9IGIud29yZHNbYi5sZW5ndGggLSAxXSB8IDA7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBxdW90aWVudFxuICAgIHZhciBtID0gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgICB2YXIgcTtcblxuICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgcSA9IG5ldyBCTihudWxsKTtcbiAgICAgIHEubGVuZ3RoID0gbSArIDE7XG4gICAgICBxLndvcmRzID0gbmV3IEFycmF5KHEubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcS5sZW5ndGg7IGkrKykge1xuICAgICAgICBxLndvcmRzW2ldID0gMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGlmZiA9IGEuY2xvbmUoKS5faXNobG5zdWJtdWwoYiwgMSwgbSk7XG4gICAgaWYgKGRpZmYubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIGEgPSBkaWZmO1xuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1ttXSA9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IG0gLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgdmFyIHFqID0gKGEud29yZHNbYi5sZW5ndGggKyBqXSB8IDApICogMHg0MDAwMDAwICtcbiAgICAgICAgKGEud29yZHNbYi5sZW5ndGggKyBqIC0gMV0gfCAwKTtcblxuICAgICAgLy8gTk9URTogKHFqIC8gYmhpKSBpcyAoMHgzZmZmZmZmICogMHg0MDAwMDAwICsgMHgzZmZmZmZmKSAvIDB4MjAwMDAwMCBtYXhcbiAgICAgIC8vICgweDdmZmZmZmYpXG4gICAgICBxaiA9IE1hdGgubWluKChxaiAvIGJoaSkgfCAwLCAweDNmZmZmZmYpO1xuXG4gICAgICBhLl9pc2hsbnN1Ym11bChiLCBxaiwgaik7XG4gICAgICB3aGlsZSAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBxai0tO1xuICAgICAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICAgICAgYS5faXNobG5zdWJtdWwoYiwgMSwgaik7XG4gICAgICAgIGlmICghYS5pc1plcm8oKSkge1xuICAgICAgICAgIGEubmVnYXRpdmUgXj0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHEpIHtcbiAgICAgICAgcS53b3Jkc1tqXSA9IHFqO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocSkge1xuICAgICAgcS5zdHJpcCgpO1xuICAgIH1cbiAgICBhLnN0cmlwKCk7XG5cbiAgICAvLyBEZW5vcm1hbGl6ZVxuICAgIGlmIChtb2RlICE9PSAnZGl2JyAmJiBzaGlmdCAhPT0gMCkge1xuICAgICAgYS5pdXNocm4oc2hpZnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXY6IHEgfHwgbnVsbCxcbiAgICAgIG1vZDogYVxuICAgIH07XG4gIH07XG5cbiAgLy8gTk9URTogMSkgYG1vZGVgIGNhbiBiZSBzZXQgdG8gYG1vZGAgdG8gcmVxdWVzdCBtb2Qgb25seSxcbiAgLy8gICAgICAgdG8gYGRpdmAgdG8gcmVxdWVzdCBkaXYgb25seSwgb3IgYmUgYWJzZW50IHRvXG4gIC8vICAgICAgIHJlcXVlc3QgYm90aCBkaXYgJiBtb2RcbiAgLy8gICAgICAgMikgYHBvc2l0aXZlYCBpcyB0cnVlIGlmIHVuc2lnbmVkIG1vZCBpcyByZXF1ZXN0ZWRcbiAgQk4ucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uIGRpdm1vZCAobnVtLCBtb2RlLCBwb3NpdGl2ZSkge1xuICAgIGFzc2VydCghbnVtLmlzWmVybygpKTtcblxuICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiBuZXcgQk4oMClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRpdiwgbW9kLCByZXM7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0sIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaWFkZChudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiByZXMubW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgodGhpcy5uZWdhdGl2ZSAmIG51bS5uZWdhdGl2ZSkgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlzdWIobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHJlcy5kaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmUgYXQgdGhpcyBwb2ludFxuXG4gICAgLy8gU3RyaXAgYm90aCBudW1iZXJzIHRvIGFwcHJveGltYXRlIHNoaWZ0IHZhbHVlXG4gICAgaWYgKG51bS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChudW0pIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogdGhpc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWZXJ5IHNob3J0IHJlZHVjdGlvblxuICAgIGlmIChudW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2RpdicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICAgIG1vZDogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gJ21vZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RuKG51bS53b3Jkc1swXSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogdGhpcy5kaXZuKG51bS53b3Jkc1swXSksXG4gICAgICAgIG1vZDogbmV3IEJOKHRoaXMubW9kbihudW0ud29yZHNbMF0pKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29yZERpdihudW0sIG1vZGUpO1xuICB9O1xuXG4gIC8vIEZpbmQgYHRoaXNgIC8gYG51bWBcbiAgQk4ucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uIGRpdiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ2RpdicsIGZhbHNlKS5kaXY7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgJSBgbnVtYFxuICBCTi5wcm90b3R5cGUubW9kID0gZnVuY3Rpb24gbW9kIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnbW9kJywgZmFsc2UpLm1vZDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW1vZCA9IGZ1bmN0aW9uIHVtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCB0cnVlKS5tb2Q7XG4gIH07XG5cbiAgLy8gRmluZCBSb3VuZChgdGhpc2AgLyBgbnVtYClcbiAgQk4ucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24gZGl2Um91bmQgKG51bSkge1xuICAgIHZhciBkbSA9IHRoaXMuZGl2bW9kKG51bSk7XG5cbiAgICAvLyBGYXN0IGNhc2UgLSBleGFjdCBkaXZpc2lvblxuICAgIGlmIChkbS5tb2QuaXNaZXJvKCkpIHJldHVybiBkbS5kaXY7XG5cbiAgICB2YXIgbW9kID0gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0ubW9kLmlzdWIobnVtKSA6IGRtLm1vZDtcblxuICAgIHZhciBoYWxmID0gbnVtLnVzaHJuKDEpO1xuICAgIHZhciByMiA9IG51bS5hbmRsbigxKTtcbiAgICB2YXIgY21wID0gbW9kLmNtcChoYWxmKTtcblxuICAgIC8vIFJvdW5kIGRvd25cbiAgICBpZiAoY21wIDwgMCB8fCByMiA9PT0gMSAmJiBjbXAgPT09IDApIHJldHVybiBkbS5kaXY7XG5cbiAgICAvLyBSb3VuZCB1cFxuICAgIHJldHVybiBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5kaXYuaXN1Ym4oMSkgOiBkbS5kaXYuaWFkZG4oMSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm1vZG4gPSBmdW5jdGlvbiBtb2RuIChudW0pIHtcbiAgICBhc3NlcnQobnVtIDw9IDB4M2ZmZmZmZik7XG4gICAgdmFyIHAgPSAoMSA8PCAyNikgJSBudW07XG5cbiAgICB2YXIgYWNjID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgYWNjID0gKHAgKiBhY2MgKyAodGhpcy53b3Jkc1tpXSB8IDApKSAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9O1xuXG4gIC8vIEluLXBsYWNlIGRpdmlzaW9uIGJ5IG51bWJlclxuICBCTi5wcm90b3R5cGUuaWRpdm4gPSBmdW5jdGlvbiBpZGl2biAobnVtKSB7XG4gICAgYXNzZXJ0KG51bSA8PSAweDNmZmZmZmYpO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHcgPSAodGhpcy53b3Jkc1tpXSB8IDApICsgY2FycnkgKiAweDQwMDAwMDA7XG4gICAgICB0aGlzLndvcmRzW2ldID0gKHcgLyBudW0pIHwgMDtcbiAgICAgIGNhcnJ5ID0gdyAlIG51bTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5kaXZuID0gZnVuY3Rpb24gZGl2biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bihudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24gZWdjZCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIHggPSB0aGlzO1xuICAgIHZhciB5ID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKHgubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHggPSB4LnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHggPSB4LmNsb25lKCk7XG4gICAgfVxuXG4gICAgLy8gQSAqIHggKyBCICogeSA9IHhcbiAgICB2YXIgQSA9IG5ldyBCTigxKTtcbiAgICB2YXIgQiA9IG5ldyBCTigwKTtcblxuICAgIC8vIEMgKiB4ICsgRCAqIHkgPSB5XG4gICAgdmFyIEMgPSBuZXcgQk4oMCk7XG4gICAgdmFyIEQgPSBuZXcgQk4oMSk7XG5cbiAgICB2YXIgZyA9IDA7XG5cbiAgICB3aGlsZSAoeC5pc0V2ZW4oKSAmJiB5LmlzRXZlbigpKSB7XG4gICAgICB4Lml1c2hybigxKTtcbiAgICAgIHkuaXVzaHJuKDEpO1xuICAgICAgKytnO1xuICAgIH1cblxuICAgIHZhciB5cCA9IHkuY2xvbmUoKTtcbiAgICB2YXIgeHAgPSB4LmNsb25lKCk7XG5cbiAgICB3aGlsZSAoIXguaXNaZXJvKCkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7ICh4LndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgeC5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEEuaXNPZGQoKSB8fCBCLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEEuaWFkZCh5cCk7XG4gICAgICAgICAgICBCLmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEEuaXVzaHJuKDEpO1xuICAgICAgICAgIEIuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7ICh5LndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgeS5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKEMuaXNPZGQoKSB8fCBELmlzT2RkKCkpIHtcbiAgICAgICAgICAgIEMuaWFkZCh5cCk7XG4gICAgICAgICAgICBELmlzdWIoeHApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEMuaXVzaHJuKDEpO1xuICAgICAgICAgIEQuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh4LmNtcCh5KSA+PSAwKSB7XG4gICAgICAgIHguaXN1Yih5KTtcbiAgICAgICAgQS5pc3ViKEMpO1xuICAgICAgICBCLmlzdWIoRCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB5LmlzdWIoeCk7XG4gICAgICAgIEMuaXN1YihBKTtcbiAgICAgICAgRC5pc3ViKEIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhOiBDLFxuICAgICAgYjogRCxcbiAgICAgIGdjZDogeS5pdXNobG4oZylcbiAgICB9O1xuICB9O1xuXG4gIC8vIFRoaXMgaXMgcmVkdWNlZCBpbmNhcm5hdGlvbiBvZiB0aGUgYmluYXJ5IEVFQVxuICAvLyBhYm92ZSwgZGVzaWduYXRlZCB0byBpbnZlcnQgbWVtYmVycyBvZiB0aGVcbiAgLy8gX3ByaW1lXyBmaWVsZHMgRihwKSBhdCBhIG1heGltYWwgc3BlZWRcbiAgQk4ucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uIF9pbnZtcCAocCkge1xuICAgIGFzc2VydChwLm5lZ2F0aXZlID09PSAwKTtcbiAgICBhc3NlcnQoIXAuaXNaZXJvKCkpO1xuXG4gICAgdmFyIGEgPSB0aGlzO1xuICAgIHZhciBiID0gcC5jbG9uZSgpO1xuXG4gICAgaWYgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGEgPSBhLnVtb2QocCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBhLmNsb25lKCk7XG4gICAgfVxuXG4gICAgdmFyIHgxID0gbmV3IEJOKDEpO1xuICAgIHZhciB4MiA9IG5ldyBCTigwKTtcblxuICAgIHZhciBkZWx0YSA9IGIuY2xvbmUoKTtcblxuICAgIHdoaWxlIChhLmNtcG4oMSkgPiAwICYmIGIuY21wbigxKSA+IDApIHtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpbSA9IDE7IChhLndvcmRzWzBdICYgaW0pID09PSAwICYmIGkgPCAyNjsgKytpLCBpbSA8PD0gMSk7XG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgYS5pdXNocm4oaSk7XG4gICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgxLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgxLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgxLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBqID0gMCwgam0gPSAxOyAoYi53b3Jkc1swXSAmIGptKSA9PT0gMCAmJiBqIDwgMjY7ICsraiwgam0gPDw9IDEpO1xuICAgICAgaWYgKGogPiAwKSB7XG4gICAgICAgIGIuaXVzaHJuKGopO1xuICAgICAgICB3aGlsZSAoai0tID4gMCkge1xuICAgICAgICAgIGlmICh4Mi5pc09kZCgpKSB7XG4gICAgICAgICAgICB4Mi5pYWRkKGRlbHRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB4Mi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGEuY21wKGIpID49IDApIHtcbiAgICAgICAgYS5pc3ViKGIpO1xuICAgICAgICB4MS5pc3ViKHgyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGIuaXN1YihhKTtcbiAgICAgICAgeDIuaXN1Yih4MSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlcztcbiAgICBpZiAoYS5jbXBuKDEpID09PSAwKSB7XG4gICAgICByZXMgPSB4MTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0geDI7XG4gICAgfVxuXG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQocCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ2NkID0gZnVuY3Rpb24gZ2NkIChudW0pIHtcbiAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIG51bS5hYnMoKTtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gdGhpcy5hYnMoKTtcblxuICAgIHZhciBhID0gdGhpcy5jbG9uZSgpO1xuICAgIHZhciBiID0gbnVtLmNsb25lKCk7XG4gICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgYi5uZWdhdGl2ZSA9IDA7XG5cbiAgICAvLyBSZW1vdmUgY29tbW9uIGZhY3RvciBvZiB0d29cbiAgICBmb3IgKHZhciBzaGlmdCA9IDA7IGEuaXNFdmVuKCkgJiYgYi5pc0V2ZW4oKTsgc2hpZnQrKykge1xuICAgICAgYS5pdXNocm4oMSk7XG4gICAgICBiLml1c2hybigxKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB3aGlsZSAoYS5pc0V2ZW4oKSkge1xuICAgICAgICBhLml1c2hybigxKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChiLmlzRXZlbigpKSB7XG4gICAgICAgIGIuaXVzaHJuKDEpO1xuICAgICAgfVxuXG4gICAgICB2YXIgciA9IGEuY21wKGIpO1xuICAgICAgaWYgKHIgPCAwKSB7XG4gICAgICAgIC8vIFN3YXAgYGFgIGFuZCBgYmAgdG8gbWFrZSBgYWAgYWx3YXlzIGJpZ2dlciB0aGFuIGBiYFxuICAgICAgICB2YXIgdCA9IGE7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBiID0gdDtcbiAgICAgIH0gZWxzZSBpZiAociA9PT0gMCB8fCBiLmNtcG4oMSkgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGEuaXN1YihiKTtcbiAgICB9IHdoaWxlICh0cnVlKTtcblxuICAgIHJldHVybiBiLml1c2hsbihzaGlmdCk7XG4gIH07XG5cbiAgLy8gSW52ZXJ0IG51bWJlciBpbiB0aGUgZmllbGQgRihudW0pXG4gIEJOLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZWdjZChudW0pLmEudW1vZChudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbiBpc0V2ZW4gKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uIGlzT2RkICgpIHtcbiAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgfTtcblxuICAvLyBBbmQgZmlyc3Qgd29yZCBhbmQgbnVtXG4gIEJOLnByb3RvdHlwZS5hbmRsbiA9IGZ1bmN0aW9uIGFuZGxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIG51bTtcbiAgfTtcblxuICAvLyBJbmNyZW1lbnQgYXQgdGhlIGJpdCBwb3NpdGlvbiBpbi1saW5lXG4gIEJOLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uIGJpbmNuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicpO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHtcbiAgICAgIHRoaXMuX2V4cGFuZChzICsgMSk7XG4gICAgICB0aGlzLndvcmRzW3NdIHw9IHE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgYml0IGFuZCBwcm9wYWdhdGUsIGlmIG5lZWRlZFxuICAgIHZhciBjYXJyeSA9IHE7XG4gICAgZm9yICh2YXIgaSA9IHM7IGNhcnJ5ICE9PSAwICYmIGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IHRoaXMud29yZHNbaV0gfCAwO1xuICAgICAgdyArPSBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+Pj4gMjY7XG4gICAgICB3ICY9IDB4M2ZmZmZmZjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3O1xuICAgIH1cbiAgICBpZiAoY2FycnkgIT09IDApIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBjYXJyeTtcbiAgICAgIHRoaXMubGVuZ3RoKys7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbiBpc1plcm8gKCkge1xuICAgIHJldHVybiB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLndvcmRzWzBdID09PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24gY21wbiAobnVtKSB7XG4gICAgdmFyIG5lZ2F0aXZlID0gbnVtIDwgMDtcblxuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmICFuZWdhdGl2ZSkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG5lZ2F0aXZlKSByZXR1cm4gMTtcblxuICAgIHRoaXMuc3RyaXAoKTtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIG51bSA9IC1udW07XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmLCAnTnVtYmVyIGlzIHRvbyBiaWcnKTtcblxuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzWzBdIHwgMDtcbiAgICAgIHJlcyA9IHcgPT09IG51bSA/IDAgOiB3IDwgbnVtID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29tcGFyZSB0d28gbnVtYmVycyBhbmQgcmV0dXJuOlxuICAvLyAxIC0gaWYgYHRoaXNgID4gYG51bWBcbiAgLy8gMCAtIGlmIGB0aGlzYCA9PSBgbnVtYFxuICAvLyAtMSAtIGlmIGB0aGlzYCA8IGBudW1gXG4gIEJOLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbiBjbXAgKG51bSkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIDE7XG5cbiAgICB2YXIgcmVzID0gdGhpcy51Y21wKG51bSk7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFVuc2lnbmVkIGNvbXBhcmlzb25cbiAgQk4ucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbiB1Y21wIChudW0pIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBoYXZlIHRoZSBzYW1lIHNpZ25cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGEgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHZhciBiID0gbnVtLndvcmRzW2ldIHwgMDtcblxuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJlcyA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXMgPSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uIGd0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIGd0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uIGd0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbiBndGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uIGx0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbiBsdCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24gbHRlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uIGx0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24gZXFuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAwO1xuICB9O1xuXG4gIC8vXG4gIC8vIEEgcmVkdWNlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIG1vbnRnb21lcnkgb3Igc29tZXRoaW5nIGJldHRlciwgZGVwZW5kaW5nXG4gIC8vIG9uIHRoZSBgbWAgaXRzZWxmLlxuICAvL1xuICBCTi5yZWQgPSBmdW5jdGlvbiByZWQgKG51bSkge1xuICAgIHJldHVybiBuZXcgUmVkKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24gdG9SZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIHJldHVybiBjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24gZnJvbVJlZCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAnZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24gX2ZvcmNlUmVkIChjdHgpIHtcbiAgICB0aGlzLnJlZCA9IGN0eDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbiBmb3JjZVJlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24gcmVkQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24gcmVkSUFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaWFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbiByZWRTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbiByZWRJU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uIHJlZFNobCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zaGwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24gcmVkTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbiByZWRJTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbiByZWRTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FyKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24gcmVkSVNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXNxcih0aGlzKTtcbiAgfTtcblxuICAvLyBTcXVhcmUgcm9vdCBvdmVyIHBcbiAgQk4ucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbiByZWRTcXJ0ICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXJ0KHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24gcmVkSW52bSAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW52bSh0aGlzKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgICUgYHJlZCBtb2R1bG9gXG4gIEJOLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbiByZWROZWcgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubmVnKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbiByZWRQb3cgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCAmJiAhbnVtLnJlZCwgJ3JlZFBvdyhub3JtYWxOdW0pJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnBvdyh0aGlzLCBudW0pO1xuICB9O1xuXG4gIC8vIFByaW1lIG51bWJlcnMgd2l0aCBlZmZpY2llbnQgcmVkdWN0aW9uXG4gIHZhciBwcmltZXMgPSB7XG4gICAgazI1NjogbnVsbCxcbiAgICBwMjI0OiBudWxsLFxuICAgIHAxOTI6IG51bGwsXG4gICAgcDI1NTE5OiBudWxsXG4gIH07XG5cbiAgLy8gUHNldWRvLU1lcnNlbm5lIHByaW1lXG4gIGZ1bmN0aW9uIE1QcmltZSAobmFtZSwgcCkge1xuICAgIC8vIFAgPSAyIF4gTiAtIEtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucCA9IG5ldyBCTihwLCAxNik7XG4gICAgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpO1xuICAgIHRoaXMuayA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCk7XG5cbiAgICB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpO1xuICB9XG5cbiAgTVByaW1lLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24gX3RtcCAoKSB7XG4gICAgdmFyIHRtcCA9IG5ldyBCTihudWxsKTtcbiAgICB0bXAud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbiBpcmVkdWNlIChudW0pIHtcbiAgICAvLyBBc3N1bWVzIHRoYXQgYG51bWAgaXMgbGVzcyB0aGFuIGBQXjJgXG4gICAgLy8gbnVtID0gSEkgKiAoMiBeIE4gLSBLKSArIEhJICogSyArIExPID0gSEkgKiBLICsgTE8gKG1vZCBQKVxuICAgIHZhciByID0gbnVtO1xuICAgIHZhciBybGVuO1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5zcGxpdChyLCB0aGlzLnRtcCk7XG4gICAgICByID0gdGhpcy5pbXVsSyhyKTtcbiAgICAgIHIgPSByLmlhZGQodGhpcy50bXApO1xuICAgICAgcmxlbiA9IHIuYml0TGVuZ3RoKCk7XG4gICAgfSB3aGlsZSAocmxlbiA+IHRoaXMubik7XG5cbiAgICB2YXIgY21wID0gcmxlbiA8IHRoaXMubiA/IC0xIDogci51Y21wKHRoaXMucCk7XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgci53b3Jkc1swXSA9IDA7XG4gICAgICByLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICByLmlzdWIodGhpcy5wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHIuc3RyaXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyByIGlzIEJOIHY0IGluc3RhbmNlXG4gICAgICAgIHIuc3RyaXAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHIgaXMgQk4gdjUgaW5zdGFuY2VcbiAgICAgICAgci5fc3RyaXAoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gc3BsaXQgKGlucHV0LCBvdXQpIHtcbiAgICBpbnB1dC5pdXNocm4odGhpcy5uLCAwLCBvdXQpO1xuICB9O1xuXG4gIE1QcmltZS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgcmV0dXJuIG51bS5pbXVsKHRoaXMuayk7XG4gIH07XG5cbiAgZnVuY3Rpb24gSzI1NiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ2syNTYnLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmYzJmJyk7XG4gIH1cbiAgaW5oZXJpdHMoSzI1NiwgTVByaW1lKTtcblxuICBLMjU2LnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0cHV0KSB7XG4gICAgLy8gMjU2ID0gOSAqIDI2ICsgMjJcbiAgICB2YXIgbWFzayA9IDB4M2ZmZmZmO1xuXG4gICAgdmFyIG91dExlbiA9IE1hdGgubWluKGlucHV0Lmxlbmd0aCwgOSk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRMZW47IGkrKykge1xuICAgICAgb3V0cHV0LndvcmRzW2ldID0gaW5wdXQud29yZHNbaV07XG4gICAgfVxuICAgIG91dHB1dC5sZW5ndGggPSBvdXRMZW47XG5cbiAgICBpZiAoaW5wdXQubGVuZ3RoIDw9IDkpIHtcbiAgICAgIGlucHV0LndvcmRzWzBdID0gMDtcbiAgICAgIGlucHV0Lmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2hpZnQgYnkgOSBsaW1ic1xuICAgIHZhciBwcmV2ID0gaW5wdXQud29yZHNbOV07XG4gICAgb3V0cHV0LndvcmRzW291dHB1dC5sZW5ndGgrK10gPSBwcmV2ICYgbWFzaztcblxuICAgIGZvciAoaSA9IDEwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXh0ID0gaW5wdXQud29yZHNbaV0gfCAwO1xuICAgICAgaW5wdXQud29yZHNbaSAtIDEwXSA9ICgobmV4dCAmIG1hc2spIDw8IDQpIHwgKHByZXYgPj4+IDIyKTtcbiAgICAgIHByZXYgPSBuZXh0O1xuICAgIH1cbiAgICBwcmV2ID4+Pj0gMjI7XG4gICAgaW5wdXQud29yZHNbaSAtIDEwXSA9IHByZXY7XG4gICAgaWYgKHByZXYgPT09IDAgJiYgaW5wdXQubGVuZ3RoID4gMTApIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSAxMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXQubGVuZ3RoIC09IDk7XG4gICAgfVxuICB9O1xuXG4gIEsyNTYucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEwMDAwMDNkMSA9IFsgMHg0MCwgMHgzZDEgXVxuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoXSA9IDA7XG4gICAgbnVtLndvcmRzW251bS5sZW5ndGggKyAxXSA9IDA7XG4gICAgbnVtLmxlbmd0aCArPSAyO1xuXG4gICAgLy8gYm91bmRlZCBhdDogMHg0MCAqIDB4M2ZmZmZmZiArIDB4M2QwID0gMHgxMDAwMDAzOTBcbiAgICB2YXIgbG8gPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdyA9IG51bS53b3Jkc1tpXSB8IDA7XG4gICAgICBsbyArPSB3ICogMHgzZDE7XG4gICAgICBudW0ud29yZHNbaV0gPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgIGxvID0gdyAqIDB4NDAgKyAoKGxvIC8gMHg0MDAwMDAwKSB8IDApO1xuICAgIH1cblxuICAgIC8vIEZhc3QgbGVuZ3RoIHJlZHVjdGlvblxuICAgIGlmIChudW0ud29yZHNbbnVtLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICBudW0ubGVuZ3RoLS07XG4gICAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgICBudW0ubGVuZ3RoLS07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudW07XG4gIH07XG5cbiAgZnVuY3Rpb24gUDIyNCAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AyMjQnLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDIyNCwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMTkyICgpIHtcbiAgICBNUHJpbWUuY2FsbChcbiAgICAgIHRoaXMsXG4gICAgICAncDE5MicsXG4gICAgICAnZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYnKTtcbiAgfVxuICBpbmhlcml0cyhQMTkyLCBNUHJpbWUpO1xuXG4gIGZ1bmN0aW9uIFAyNTUxOSAoKSB7XG4gICAgLy8gMiBeIDI1NSAtIDE5XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJzI1NTE5JyxcbiAgICAgICc3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDI1NTE5LCBNUHJpbWUpO1xuXG4gIFAyNTUxOS5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbiBpbXVsSyAobnVtKSB7XG4gICAgLy8gSyA9IDB4MTNcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGkgPSAobnVtLndvcmRzW2ldIHwgMCkgKiAweDEzICsgY2Fycnk7XG4gICAgICB2YXIgbG8gPSBoaSAmIDB4M2ZmZmZmZjtcbiAgICAgIGhpID4+Pj0gMjY7XG5cbiAgICAgIG51bS53b3Jkc1tpXSA9IGxvO1xuICAgICAgY2FycnkgPSBoaTtcbiAgICB9XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICBudW0ud29yZHNbbnVtLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIC8vIEV4cG9ydGVkIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3NlcywgdXNlIHBsYWluIG5hbWUgaW5zdGVhZFxuICBCTi5fcHJpbWUgPSBmdW5jdGlvbiBwcmltZSAobmFtZSkge1xuICAgIC8vIENhY2hlZCB2ZXJzaW9uIG9mIHByaW1lXG4gICAgaWYgKHByaW1lc1tuYW1lXSkgcmV0dXJuIHByaW1lc1tuYW1lXTtcblxuICAgIHZhciBwcmltZTtcbiAgICBpZiAobmFtZSA9PT0gJ2syNTYnKSB7XG4gICAgICBwcmltZSA9IG5ldyBLMjU2KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDIyNCcpIHtcbiAgICAgIHByaW1lID0gbmV3IFAyMjQoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMTkyJykge1xuICAgICAgcHJpbWUgPSBuZXcgUDE5MigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyNTUxOScpIHtcbiAgICAgIHByaW1lID0gbmV3IFAyNTUxOSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gcHJpbWUgJyArIG5hbWUpO1xuICAgIH1cbiAgICBwcmltZXNbbmFtZV0gPSBwcmltZTtcblxuICAgIHJldHVybiBwcmltZTtcbiAgfTtcblxuICAvL1xuICAvLyBCYXNlIHJlZHVjdGlvbiBlbmdpbmVcbiAgLy9cbiAgZnVuY3Rpb24gUmVkIChtKSB7XG4gICAgaWYgKHR5cGVvZiBtID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIHByaW1lID0gQk4uX3ByaW1lKG0pO1xuICAgICAgdGhpcy5tID0gcHJpbWUucDtcbiAgICAgIHRoaXMucHJpbWUgPSBwcmltZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KG0uZ3RuKDEpLCAnbW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgICB0aGlzLm0gPSBtO1xuICAgICAgdGhpcy5wcmltZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MSA9IGZ1bmN0aW9uIF92ZXJpZnkxIChhKSB7XG4gICAgYXNzZXJ0KGEubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLl92ZXJpZnkyID0gZnVuY3Rpb24gX3ZlcmlmeTIgKGEsIGIpIHtcbiAgICBhc3NlcnQoKGEubmVnYXRpdmUgfCBiLm5lZ2F0aXZlKSA9PT0gMCwgJ3JlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzJyk7XG4gICAgYXNzZXJ0KGEucmVkICYmIGEucmVkID09PSBiLnJlZCxcbiAgICAgICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pbW9kID0gZnVuY3Rpb24gaW1vZCAoYSkge1xuICAgIGlmICh0aGlzLnByaW1lKSByZXR1cm4gdGhpcy5wcmltZS5pcmVkdWNlKGEpLl9mb3JjZVJlZCh0aGlzKTtcbiAgICByZXR1cm4gYS51bW9kKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUubmVnID0gZnVuY3Rpb24gbmVnIChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHtcbiAgICAgIHJldHVybiBhLmNsb25lKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubS5zdWIoYSkuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gYWRkIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcblxuICAgIHZhciByZXMgPSBhLmFkZChiKTtcbiAgICBpZiAocmVzLmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcy5pc3ViKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaWFkZCA9IGZ1bmN0aW9uIGlhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuaWFkZChiKTtcbiAgICBpZiAocmVzLmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcy5pc3ViKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbiBzdWIgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXMuX2ZvcmNlUmVkKHRoaXMpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uIGlzdWIgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuaXN1YihiKTtcbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZCh0aGlzLm0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24gc2hsIChhLCBudW0pIHtcbiAgICB0aGlzLl92ZXJpZnkxKGEpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS51c2hsbihudW0pKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChhLCBiKSB7XG4gICAgdGhpcy5fdmVyaWZ5MihhLCBiKTtcbiAgICByZXR1cm4gdGhpcy5pbW9kKGEuaW11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5tdWwoYikpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaXNxciA9IGZ1bmN0aW9uIGlzcXIgKGEpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKGEsIGEuY2xvbmUoKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKGEpIHtcbiAgICByZXR1cm4gdGhpcy5tdWwoYSwgYSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb24gc3FydCAoYSkge1xuICAgIGlmIChhLmlzWmVybygpKSByZXR1cm4gYS5jbG9uZSgpO1xuXG4gICAgdmFyIG1vZDMgPSB0aGlzLm0uYW5kbG4oMyk7XG4gICAgYXNzZXJ0KG1vZDMgJSAyID09PSAxKTtcblxuICAgIC8vIEZhc3QgY2FzZVxuICAgIGlmIChtb2QzID09PSAzKSB7XG4gICAgICB2YXIgcG93ID0gdGhpcy5tLmFkZChuZXcgQk4oMSkpLml1c2hybigyKTtcbiAgICAgIHJldHVybiB0aGlzLnBvdyhhLCBwb3cpO1xuICAgIH1cblxuICAgIC8vIFRvbmVsbGktU2hhbmtzIGFsZ29yaXRobSAoVG90YWxseSB1bm9wdGltaXplZCBhbmQgc2xvdylcbiAgICAvL1xuICAgIC8vIEZpbmQgUSBhbmQgUywgdGhhdCBRICogMiBeIFMgPSAoUCAtIDEpXG4gICAgdmFyIHEgPSB0aGlzLm0uc3VibigxKTtcbiAgICB2YXIgcyA9IDA7XG4gICAgd2hpbGUgKCFxLmlzWmVybygpICYmIHEuYW5kbG4oMSkgPT09IDApIHtcbiAgICAgIHMrKztcbiAgICAgIHEuaXVzaHJuKDEpO1xuICAgIH1cbiAgICBhc3NlcnQoIXEuaXNaZXJvKCkpO1xuXG4gICAgdmFyIG9uZSA9IG5ldyBCTigxKS50b1JlZCh0aGlzKTtcbiAgICB2YXIgbk9uZSA9IG9uZS5yZWROZWcoKTtcblxuICAgIC8vIEZpbmQgcXVhZHJhdGljIG5vbi1yZXNpZHVlXG4gICAgLy8gTk9URTogTWF4IGlzIHN1Y2ggYmVjYXVzZSBvZiBnZW5lcmFsaXplZCBSaWVtYW5uIGh5cG90aGVzaXMuXG4gICAgdmFyIGxwb3cgPSB0aGlzLm0uc3VibigxKS5pdXNocm4oMSk7XG4gICAgdmFyIHogPSB0aGlzLm0uYml0TGVuZ3RoKCk7XG4gICAgeiA9IG5ldyBCTigyICogeiAqIHopLnRvUmVkKHRoaXMpO1xuXG4gICAgd2hpbGUgKHRoaXMucG93KHosIGxwb3cpLmNtcChuT25lKSAhPT0gMCkge1xuICAgICAgei5yZWRJQWRkKG5PbmUpO1xuICAgIH1cblxuICAgIHZhciBjID0gdGhpcy5wb3coeiwgcSk7XG4gICAgdmFyIHIgPSB0aGlzLnBvdyhhLCBxLmFkZG4oMSkuaXVzaHJuKDEpKTtcbiAgICB2YXIgdCA9IHRoaXMucG93KGEsIHEpO1xuICAgIHZhciBtID0gcztcbiAgICB3aGlsZSAodC5jbXAob25lKSAhPT0gMCkge1xuICAgICAgdmFyIHRtcCA9IHQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgdG1wLmNtcChvbmUpICE9PSAwOyBpKyspIHtcbiAgICAgICAgdG1wID0gdG1wLnJlZFNxcigpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KGkgPCBtKTtcbiAgICAgIHZhciBiID0gdGhpcy5wb3coYywgbmV3IEJOKDEpLml1c2hsbihtIC0gaSAtIDEpKTtcblxuICAgICAgciA9IHIucmVkTXVsKGIpO1xuICAgICAgYyA9IGIucmVkU3FyKCk7XG4gICAgICB0ID0gdC5yZWRNdWwoYyk7XG4gICAgICBtID0gaTtcbiAgICB9XG5cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChhKSB7XG4gICAgdmFyIGludiA9IGEuX2ludm1wKHRoaXMubSk7XG4gICAgaWYgKGludi5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgaW52Lm5lZ2F0aXZlID0gMDtcbiAgICAgIHJldHVybiB0aGlzLmltb2QoaW52KS5yZWROZWcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpO1xuICAgIH1cbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAoYSwgbnVtKSB7XG4gICAgaWYgKG51bS5pc1plcm8oKSkgcmV0dXJuIG5ldyBCTigxKS50b1JlZCh0aGlzKTtcbiAgICBpZiAobnVtLmNtcG4oMSkgPT09IDApIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgd2luZG93U2l6ZSA9IDQ7XG4gICAgdmFyIHduZCA9IG5ldyBBcnJheSgxIDw8IHdpbmRvd1NpemUpO1xuICAgIHduZFswXSA9IG5ldyBCTigxKS50b1JlZCh0aGlzKTtcbiAgICB3bmRbMV0gPSBhO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgd25kLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3bmRbaV0gPSB0aGlzLm11bCh3bmRbaSAtIDFdLCBhKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzID0gd25kWzBdO1xuICAgIHZhciBjdXJyZW50ID0gMDtcbiAgICB2YXIgY3VycmVudExlbiA9IDA7XG4gICAgdmFyIHN0YXJ0ID0gbnVtLmJpdExlbmd0aCgpICUgMjY7XG4gICAgaWYgKHN0YXJ0ID09PSAwKSB7XG4gICAgICBzdGFydCA9IDI2O1xuICAgIH1cblxuICAgIGZvciAoaSA9IG51bS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSBudW0ud29yZHNbaV07XG4gICAgICBmb3IgKHZhciBqID0gc3RhcnQgLSAxOyBqID49IDA7IGotLSkge1xuICAgICAgICB2YXIgYml0ID0gKHdvcmQgPj4gaikgJiAxO1xuICAgICAgICBpZiAocmVzICE9PSB3bmRbMF0pIHtcbiAgICAgICAgICByZXMgPSB0aGlzLnNxcihyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJpdCA9PT0gMCAmJiBjdXJyZW50ID09PSAwKSB7XG4gICAgICAgICAgY3VycmVudExlbiA9IDA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjdXJyZW50IDw8PSAxO1xuICAgICAgICBjdXJyZW50IHw9IGJpdDtcbiAgICAgICAgY3VycmVudExlbisrO1xuICAgICAgICBpZiAoY3VycmVudExlbiAhPT0gd2luZG93U2l6ZSAmJiAoaSAhPT0gMCB8fCBqICE9PSAwKSkgY29udGludWU7XG5cbiAgICAgICAgcmVzID0gdGhpcy5tdWwocmVzLCB3bmRbY3VycmVudF0pO1xuICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgY3VycmVudCA9IDA7XG4gICAgICB9XG4gICAgICBzdGFydCA9IDI2O1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0VG8gPSBmdW5jdGlvbiBjb252ZXJ0VG8gKG51bSkge1xuICAgIHZhciByID0gbnVtLnVtb2QodGhpcy5tKTtcblxuICAgIHJldHVybiByID09PSBudW0gPyByLmNsb25lKCkgOiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHJlcyA9IG51bS5jbG9uZSgpO1xuICAgIHJlcy5yZWQgPSBudWxsO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy9cbiAgLy8gTW9udGdvbWVyeSBtZXRob2QgZW5naW5lXG4gIC8vXG5cbiAgQk4ubW9udCA9IGZ1bmN0aW9uIG1vbnQgKG51bSkge1xuICAgIHJldHVybiBuZXcgTW9udChudW0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIE1vbnQgKG0pIHtcbiAgICBSZWQuY2FsbCh0aGlzLCBtKTtcblxuICAgIHRoaXMuc2hpZnQgPSB0aGlzLm0uYml0TGVuZ3RoKCk7XG4gICAgaWYgKHRoaXMuc2hpZnQgJSAyNiAhPT0gMCkge1xuICAgICAgdGhpcy5zaGlmdCArPSAyNiAtICh0aGlzLnNoaWZ0ICUgMjYpO1xuICAgIH1cblxuICAgIHRoaXMuciA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5zaGlmdCk7XG4gICAgdGhpcy5yMiA9IHRoaXMuaW1vZCh0aGlzLnIuc3FyKCkpO1xuICAgIHRoaXMucmludiA9IHRoaXMuci5faW52bXAodGhpcy5tKTtcblxuICAgIHRoaXMubWludiA9IHRoaXMucmludi5tdWwodGhpcy5yKS5pc3VibigxKS5kaXYodGhpcy5tKTtcbiAgICB0aGlzLm1pbnYgPSB0aGlzLm1pbnYudW1vZCh0aGlzLnIpO1xuICAgIHRoaXMubWludiA9IHRoaXMuci5zdWIodGhpcy5taW52KTtcbiAgfVxuICBpbmhlcml0cyhNb250LCBSZWQpO1xuXG4gIE1vbnQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChudW0udXNobG4odGhpcy5zaGlmdCkpO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24gY29udmVydEZyb20gKG51bSkge1xuICAgIHZhciByID0gdGhpcy5pbW9kKG51bS5tdWwodGhpcy5yaW52KSk7XG4gICAgci5yZWQgPSBudWxsO1xuICAgIHJldHVybiByO1xuICB9O1xuXG4gIE1vbnQucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChhLCBiKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkgfHwgYi5pc1plcm8oKSkge1xuICAgICAgYS53b3Jkc1swXSA9IDA7XG4gICAgICBhLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICB2YXIgdCA9IGEuaW11bChiKTtcbiAgICB2YXIgYyA9IHQubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pO1xuICAgIHZhciB1ID0gdC5pc3ViKGMpLml1c2hybih0aGlzLnNoaWZ0KTtcbiAgICB2YXIgcmVzID0gdTtcblxuICAgIGlmICh1LmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcyA9IHUuaXN1Yih0aGlzLm0pO1xuICAgIH0gZWxzZSBpZiAodS5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzID0gdS5pYWRkKHRoaXMubSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChhLCBiKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkgfHwgYi5pc1plcm8oKSkgcmV0dXJuIG5ldyBCTigwKS5fZm9yY2VSZWQodGhpcyk7XG5cbiAgICB2YXIgdCA9IGEubXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuICAgIGlmICh1LmNtcCh0aGlzLm0pID49IDApIHtcbiAgICAgIHJlcyA9IHUuaXN1Yih0aGlzLm0pO1xuICAgIH0gZWxzZSBpZiAodS5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzID0gdS5pYWRkKHRoaXMubSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICAvLyAoQVIpXi0xICogUl4yID0gKEFeLTEgKiBSXi0xKSAqIFJeMiA9IEFeLTEgKiBSXG4gICAgdmFyIHJlcyA9IHRoaXMuaW1vZChhLl9pbnZtcCh0aGlzLm0pLm11bCh0aGlzLnIyKSk7XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG59KSh0eXBlb2YgbW9kdWxlID09PSAndW5kZWZpbmVkJyB8fCBtb2R1bGUsIHRoaXMpO1xuIiwiZnVuY3Rpb24gdG9WYWwobWl4KSB7XG5cdHZhciBrLCB5LCBzdHI9Jyc7XG5cblx0aWYgKHR5cGVvZiBtaXggPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtaXggPT09ICdudW1iZXInKSB7XG5cdFx0c3RyICs9IG1peDtcblx0fSBlbHNlIGlmICh0eXBlb2YgbWl4ID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KG1peCkpIHtcblx0XHRcdGZvciAoaz0wOyBrIDwgbWl4Lmxlbmd0aDsgaysrKSB7XG5cdFx0XHRcdGlmIChtaXhba10pIHtcblx0XHRcdFx0XHRpZiAoeSA9IHRvVmFsKG1peFtrXSkpIHtcblx0XHRcdFx0XHRcdHN0ciAmJiAoc3RyICs9ICcgJyk7XG5cdFx0XHRcdFx0XHRzdHIgKz0geTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChrIGluIG1peCkge1xuXHRcdFx0XHRpZiAobWl4W2tdKSB7XG5cdFx0XHRcdFx0c3RyICYmIChzdHIgKz0gJyAnKTtcblx0XHRcdFx0XHRzdHIgKz0gaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcblx0dmFyIGk9MCwgdG1wLCB4LCBzdHI9Jyc7XG5cdHdoaWxlIChpIDwgYXJndW1lbnRzLmxlbmd0aCkge1xuXHRcdGlmICh0bXAgPSBhcmd1bWVudHNbaSsrXSkge1xuXHRcdFx0aWYgKHggPSB0b1ZhbCh0bXApKSB7XG5cdFx0XHRcdHN0ciAmJiAoc3RyICs9ICcgJyk7XG5cdFx0XHRcdHN0ciArPSB4XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdHJldHVybiBzdHI7XG59XG4iLCJleHBvcnQgY29uc3QgdmVyc2lvbiA9IFwiZXRoZXJzLzUuMC4zMVwiO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3ZlcnNpb24uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5pbXBvcnQgeyBDb250cmFjdCwgQ29udHJhY3RGYWN0b3J5IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2NvbnRyYWN0c1wiO1xuaW1wb3J0IHsgQmlnTnVtYmVyLCBGaXhlZE51bWJlciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iaWdudW1iZXJcIjtcbmltcG9ydCB7IFNpZ25lciwgVm9pZFNpZ25lciB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hYnN0cmFjdC1zaWduZXJcIjtcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC93YWxsZXRcIjtcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tIFwiQGV0aGVyc3Byb2plY3QvY29uc3RhbnRzXCI7XG5pbXBvcnQgKiBhcyBwcm92aWRlcnMgZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3ZpZGVyc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFByb3ZpZGVyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3Byb3ZpZGVyc1wiO1xuaW1wb3J0IHsgV29yZGxpc3QsIHdvcmRsaXN0cyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC93b3JkbGlzdHNcIjtcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBFcnJvckNvZGUgYXMgZXJyb3JzLCBMb2dnZXIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvbG9nZ2VyXCI7XG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIENvbXBpbGUtVGltZSBDb25zdGFudHNcbi8vIFRoaXMgaXMgZ2VuZXJhdGVkIGJ5IFwibnBtIHJ1biBkaXN0XCJcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tIFwiLi9fdmVyc2lvblwiO1xuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih2ZXJzaW9uKTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRXhwb3J0c1xuZXhwb3J0IHsgU2lnbmVyLCBXYWxsZXQsIFZvaWRTaWduZXIsIGdldERlZmF1bHRQcm92aWRlciwgcHJvdmlkZXJzLCBDb250cmFjdCwgQ29udHJhY3RGYWN0b3J5LCBCaWdOdW1iZXIsIEZpeGVkTnVtYmVyLCBjb25zdGFudHMsIGVycm9ycywgbG9nZ2VyLCB1dGlscywgd29yZGxpc3RzLCBcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ29tcGlsZS1UaW1lIENvbnN0YW50c1xudmVyc2lvbiwgV29yZGxpc3QgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV0aGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8vIFRvIG1vZGlmeSB0aGlzIGZpbGUsIHlvdSBtdXN0IHVwZGF0ZSAuL21pc2MvYWRtaW4vbGliL2NtZHMvdXBkYXRlLWV4cG9ydHMuanNcbmltcG9ydCAqIGFzIGV0aGVycyBmcm9tIFwiLi9ldGhlcnNcIjtcbnRyeSB7XG4gICAgY29uc3QgYW55R2xvYmFsID0gd2luZG93O1xuICAgIGlmIChhbnlHbG9iYWwuX2V0aGVycyA9PSBudWxsKSB7XG4gICAgICAgIGFueUdsb2JhbC5fZXRoZXJzID0gZXRoZXJzO1xuICAgIH1cbn1cbmNhdGNoIChlcnJvcikgeyB9XG5leHBvcnQgeyBldGhlcnMgfTtcbmV4cG9ydCB7IFNpZ25lciwgV2FsbGV0LCBWb2lkU2lnbmVyLCBnZXREZWZhdWx0UHJvdmlkZXIsIHByb3ZpZGVycywgQ29udHJhY3QsIENvbnRyYWN0RmFjdG9yeSwgQmlnTnVtYmVyLCBGaXhlZE51bWJlciwgY29uc3RhbnRzLCBlcnJvcnMsIGxvZ2dlciwgdXRpbHMsIHdvcmRsaXN0cywgXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIENvbXBpbGUtVGltZSBDb25zdGFudHNcbnZlcnNpb24sIFdvcmRsaXN0IH0gZnJvbSBcIi4vZXRoZXJzXCI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmltcG9ydCB7IEFiaUNvZGVyLCBjaGVja1Jlc3VsdEVycm9ycywgZGVmYXVsdEFiaUNvZGVyLCBFdmVudEZyYWdtZW50LCBGb3JtYXRUeXBlcywgRnJhZ21lbnQsIEZ1bmN0aW9uRnJhZ21lbnQsIEluZGV4ZWQsIEludGVyZmFjZSwgTG9nRGVzY3JpcHRpb24sIFBhcmFtVHlwZSwgVHJhbnNhY3Rpb25EZXNjcmlwdGlvbiB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9hYmlcIjtcbmltcG9ydCB7IGdldEFkZHJlc3MsIGdldENyZWF0ZTJBZGRyZXNzLCBnZXRDb250cmFjdEFkZHJlc3MsIGdldEljYXBBZGRyZXNzLCBpc0FkZHJlc3MgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYWRkcmVzc1wiO1xuaW1wb3J0ICogYXMgYmFzZTY0IGZyb20gXCJAZXRoZXJzcHJvamVjdC9iYXNlNjRcIjtcbmltcG9ydCB7IEJhc2U1OCBhcyBiYXNlNTggfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvYmFzZXhcIjtcbmltcG9ydCB7IGFycmF5aWZ5LCBjb25jYXQsIGhleENvbmNhdCwgaGV4RGF0YVNsaWNlLCBoZXhEYXRhTGVuZ3RoLCBoZXhsaWZ5LCBoZXhTdHJpcFplcm9zLCBoZXhWYWx1ZSwgaGV4WmVyb1BhZCwgaXNCeXRlcywgaXNCeXRlc0xpa2UsIGlzSGV4U3RyaW5nLCBqb2luU2lnbmF0dXJlLCB6ZXJvUGFkLCBzcGxpdFNpZ25hdHVyZSwgc3RyaXBaZXJvcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9ieXRlc1wiO1xuaW1wb3J0IHsgX1R5cGVkRGF0YUVuY29kZXIsIGhhc2hNZXNzYWdlLCBpZCwgaXNWYWxpZE5hbWUsIG5hbWVoYXNoIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2hhc2hcIjtcbmltcG9ydCB7IGRlZmF1bHRQYXRoLCBlbnRyb3B5VG9NbmVtb25pYywgSEROb2RlLCBpc1ZhbGlkTW5lbW9uaWMsIG1uZW1vbmljVG9FbnRyb3B5LCBtbmVtb25pY1RvU2VlZCB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9oZG5vZGVcIjtcbmltcG9ydCB7IGdldEpzb25XYWxsZXRBZGRyZXNzIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2pzb24td2FsbGV0c1wiO1xuaW1wb3J0IHsga2VjY2FrMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2tlY2NhazI1NlwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L2xvZ2dlclwiO1xuaW1wb3J0IHsgY29tcHV0ZUhtYWMsIHJpcGVtZDE2MCwgc2hhMjU2LCBzaGE1MTIgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc2hhMlwiO1xuaW1wb3J0IHsga2VjY2FrMjU2IGFzIHNvbGlkaXR5S2VjY2FrMjU2LCBwYWNrIGFzIHNvbGlkaXR5UGFjaywgc2hhMjU2IGFzIHNvbGlkaXR5U2hhMjU2IH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3NvbGlkaXR5XCI7XG5pbXBvcnQgeyByYW5kb21CeXRlcywgc2h1ZmZsZWQgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcmFuZG9tXCI7XG5pbXBvcnQgeyBjaGVja1Byb3BlcnRpZXMsIGRlZXBDb3B5LCBkZWZpbmVSZWFkT25seSwgZ2V0U3RhdGljLCByZXNvbHZlUHJvcGVydGllcywgc2hhbGxvd0NvcHkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3QvcHJvcGVydGllc1wiO1xuaW1wb3J0ICogYXMgUkxQIGZyb20gXCJAZXRoZXJzcHJvamVjdC9ybHBcIjtcbmltcG9ydCB7IGNvbXB1dGVQdWJsaWNLZXksIHJlY292ZXJQdWJsaWNLZXksIFNpZ25pbmdLZXkgfSBmcm9tIFwiQGV0aGVyc3Byb2plY3Qvc2lnbmluZy1rZXlcIjtcbmltcG9ydCB7IGZvcm1hdEJ5dGVzMzJTdHJpbmcsIG5hbWVwcmVwLCBwYXJzZUJ5dGVzMzJTdHJpbmcsIF90b0VzY2FwZWRVdGY4U3RyaW5nLCB0b1V0ZjhCeXRlcywgdG9VdGY4Q29kZVBvaW50cywgdG9VdGY4U3RyaW5nLCBVdGY4RXJyb3JGdW5jcyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC9zdHJpbmdzXCI7XG5pbXBvcnQgeyBjb21wdXRlQWRkcmVzcywgcGFyc2UgYXMgcGFyc2VUcmFuc2FjdGlvbiwgcmVjb3ZlckFkZHJlc3MsIHNlcmlhbGl6ZSBhcyBzZXJpYWxpemVUcmFuc2FjdGlvbiB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC90cmFuc2FjdGlvbnNcIjtcbmltcG9ydCB7IGNvbW1pZnksIGZvcm1hdEV0aGVyLCBwYXJzZUV0aGVyLCBmb3JtYXRVbml0cywgcGFyc2VVbml0cyB9IGZyb20gXCJAZXRoZXJzcHJvamVjdC91bml0c1wiO1xuaW1wb3J0IHsgdmVyaWZ5TWVzc2FnZSwgdmVyaWZ5VHlwZWREYXRhIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3dhbGxldFwiO1xuaW1wb3J0IHsgX2ZldGNoRGF0YSwgZmV0Y2hKc29uLCBwb2xsIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3dlYlwiO1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBFbnVtc1xuaW1wb3J0IHsgU3VwcG9ydGVkQWxnb3JpdGhtIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3NoYTJcIjtcbmltcG9ydCB7IFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybSwgVXRmOEVycm9yUmVhc29uIH0gZnJvbSBcIkBldGhlcnNwcm9qZWN0L3N0cmluZ3NcIjtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gRXhwb3J0c1xuZXhwb3J0IHsgQWJpQ29kZXIsIGRlZmF1bHRBYmlDb2RlciwgRnJhZ21lbnQsIEV2ZW50RnJhZ21lbnQsIEZ1bmN0aW9uRnJhZ21lbnQsIFBhcmFtVHlwZSwgRm9ybWF0VHlwZXMsIGNoZWNrUmVzdWx0RXJyb3JzLCBMb2dnZXIsIFJMUCwgX2ZldGNoRGF0YSwgZmV0Y2hKc29uLCBwb2xsLCBjaGVja1Byb3BlcnRpZXMsIGRlZXBDb3B5LCBkZWZpbmVSZWFkT25seSwgZ2V0U3RhdGljLCByZXNvbHZlUHJvcGVydGllcywgc2hhbGxvd0NvcHksIGFycmF5aWZ5LCBjb25jYXQsIHN0cmlwWmVyb3MsIHplcm9QYWQsIGlzQnl0ZXMsIGlzQnl0ZXNMaWtlLCBkZWZhdWx0UGF0aCwgSEROb2RlLCBTaWduaW5nS2V5LCBJbnRlcmZhY2UsIExvZ0Rlc2NyaXB0aW9uLCBUcmFuc2FjdGlvbkRlc2NyaXB0aW9uLCBiYXNlNTgsIGJhc2U2NCwgaGV4bGlmeSwgaXNIZXhTdHJpbmcsIGhleENvbmNhdCwgaGV4U3RyaXBaZXJvcywgaGV4VmFsdWUsIGhleFplcm9QYWQsIGhleERhdGFMZW5ndGgsIGhleERhdGFTbGljZSwgbmFtZXByZXAsIF90b0VzY2FwZWRVdGY4U3RyaW5nLCB0b1V0ZjhCeXRlcywgdG9VdGY4Q29kZVBvaW50cywgdG9VdGY4U3RyaW5nLCBVdGY4RXJyb3JGdW5jcywgZm9ybWF0Qnl0ZXMzMlN0cmluZywgcGFyc2VCeXRlczMyU3RyaW5nLCBoYXNoTWVzc2FnZSwgbmFtZWhhc2gsIGlzVmFsaWROYW1lLCBpZCwgX1R5cGVkRGF0YUVuY29kZXIsIGdldEFkZHJlc3MsIGdldEljYXBBZGRyZXNzLCBnZXRDb250cmFjdEFkZHJlc3MsIGdldENyZWF0ZTJBZGRyZXNzLCBpc0FkZHJlc3MsIGZvcm1hdEV0aGVyLCBwYXJzZUV0aGVyLCBmb3JtYXRVbml0cywgcGFyc2VVbml0cywgY29tbWlmeSwgY29tcHV0ZUhtYWMsIGtlY2NhazI1NiwgcmlwZW1kMTYwLCBzaGEyNTYsIHNoYTUxMiwgcmFuZG9tQnl0ZXMsIHNodWZmbGVkLCBzb2xpZGl0eVBhY2ssIHNvbGlkaXR5S2VjY2FrMjU2LCBzb2xpZGl0eVNoYTI1Niwgc3BsaXRTaWduYXR1cmUsIGpvaW5TaWduYXR1cmUsIHBhcnNlVHJhbnNhY3Rpb24sIHNlcmlhbGl6ZVRyYW5zYWN0aW9uLCBnZXRKc29uV2FsbGV0QWRkcmVzcywgY29tcHV0ZUFkZHJlc3MsIHJlY292ZXJBZGRyZXNzLCBjb21wdXRlUHVibGljS2V5LCByZWNvdmVyUHVibGljS2V5LCB2ZXJpZnlNZXNzYWdlLCB2ZXJpZnlUeXBlZERhdGEsIG1uZW1vbmljVG9FbnRyb3B5LCBlbnRyb3B5VG9NbmVtb25pYywgaXNWYWxpZE1uZW1vbmljLCBtbmVtb25pY1RvU2VlZCwgXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIEVudW1zXG5TdXBwb3J0ZWRBbGdvcml0aG0sIFVuaWNvZGVOb3JtYWxpemF0aW9uRm9ybSwgVXRmOEVycm9yUmVhc29uLCBJbmRleGVkIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE1IEplZCBXYXRzb24uXG4gIEJhc2VkIG9uIGNvZGUgdGhhdCBpcyBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBjYW5Vc2VET00gPSAhIShcblx0XHR0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuXHRcdHdpbmRvdy5kb2N1bWVudCAmJlxuXHRcdHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50XG5cdCk7XG5cblx0dmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0ge1xuXG5cdFx0Y2FuVXNlRE9NOiBjYW5Vc2VET00sXG5cblx0XHRjYW5Vc2VXb3JrZXJzOiB0eXBlb2YgV29ya2VyICE9PSAndW5kZWZpbmVkJyxcblxuXHRcdGNhblVzZUV2ZW50TGlzdGVuZXJzOlxuXHRcdFx0Y2FuVXNlRE9NICYmICEhKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyIHx8IHdpbmRvdy5hdHRhY2hFdmVudCksXG5cblx0XHRjYW5Vc2VWaWV3cG9ydDogY2FuVXNlRE9NICYmICEhd2luZG93LnNjcmVlblxuXG5cdH07XG5cblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIEV4ZWN1dGlvbkVudmlyb25tZW50O1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBFeGVjdXRpb25FbnZpcm9ubWVudDtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuRXhlY3V0aW9uRW52aXJvbm1lbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudDtcblx0fVxuXG59KCkpO1xuIiwidmFyIGhhc2ggPSBleHBvcnRzO1xuXG5oYXNoLnV0aWxzID0gcmVxdWlyZSgnLi9oYXNoL3V0aWxzJyk7XG5oYXNoLmNvbW1vbiA9IHJlcXVpcmUoJy4vaGFzaC9jb21tb24nKTtcbmhhc2guc2hhID0gcmVxdWlyZSgnLi9oYXNoL3NoYScpO1xuaGFzaC5yaXBlbWQgPSByZXF1aXJlKCcuL2hhc2gvcmlwZW1kJyk7XG5oYXNoLmhtYWMgPSByZXF1aXJlKCcuL2hhc2gvaG1hYycpO1xuXG4vLyBQcm94eSBoYXNoIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBvYmplY3Rcbmhhc2guc2hhMSA9IGhhc2guc2hhLnNoYTE7XG5oYXNoLnNoYTI1NiA9IGhhc2guc2hhLnNoYTI1Njtcbmhhc2guc2hhMjI0ID0gaGFzaC5zaGEuc2hhMjI0O1xuaGFzaC5zaGEzODQgPSBoYXNoLnNoYS5zaGEzODQ7XG5oYXNoLnNoYTUxMiA9IGhhc2guc2hhLnNoYTUxMjtcbmhhc2gucmlwZW1kMTYwID0gaGFzaC5yaXBlbWQucmlwZW1kMTYwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnbWluaW1hbGlzdGljLWFzc2VydCcpO1xuXG5mdW5jdGlvbiBCbG9ja0hhc2goKSB7XG4gIHRoaXMucGVuZGluZyA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1RvdGFsID0gMDtcbiAgdGhpcy5ibG9ja1NpemUgPSB0aGlzLmNvbnN0cnVjdG9yLmJsb2NrU2l6ZTtcbiAgdGhpcy5vdXRTaXplID0gdGhpcy5jb25zdHJ1Y3Rvci5vdXRTaXplO1xuICB0aGlzLmhtYWNTdHJlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IuaG1hY1N0cmVuZ3RoO1xuICB0aGlzLnBhZExlbmd0aCA9IHRoaXMuY29uc3RydWN0b3IucGFkTGVuZ3RoIC8gODtcbiAgdGhpcy5lbmRpYW4gPSAnYmlnJztcblxuICB0aGlzLl9kZWx0YTggPSB0aGlzLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMuX2RlbHRhMzIgPSB0aGlzLmJsb2NrU2l6ZSAvIDMyO1xufVxuZXhwb3J0cy5CbG9ja0hhc2ggPSBCbG9ja0hhc2g7XG5cbkJsb2NrSGFzaC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIC8vIENvbnZlcnQgbWVzc2FnZSB0byBhcnJheSwgcGFkIGl0LCBhbmQgam9pbiBpbnRvIDMyYml0IGJsb2Nrc1xuICBtc2cgPSB1dGlscy50b0FycmF5KG1zZywgZW5jKTtcbiAgaWYgKCF0aGlzLnBlbmRpbmcpXG4gICAgdGhpcy5wZW5kaW5nID0gbXNnO1xuICBlbHNlXG4gICAgdGhpcy5wZW5kaW5nID0gdGhpcy5wZW5kaW5nLmNvbmNhdChtc2cpO1xuICB0aGlzLnBlbmRpbmdUb3RhbCArPSBtc2cubGVuZ3RoO1xuXG4gIC8vIEVub3VnaCBkYXRhLCB0cnkgdXBkYXRpbmdcbiAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPj0gdGhpcy5fZGVsdGE4KSB7XG4gICAgbXNnID0gdGhpcy5wZW5kaW5nO1xuXG4gICAgLy8gUHJvY2VzcyBwZW5kaW5nIGRhdGEgaW4gYmxvY2tzXG4gICAgdmFyIHIgPSBtc2cubGVuZ3RoICUgdGhpcy5fZGVsdGE4O1xuICAgIHRoaXMucGVuZGluZyA9IG1zZy5zbGljZShtc2cubGVuZ3RoIC0gciwgbXNnLmxlbmd0aCk7XG4gICAgaWYgKHRoaXMucGVuZGluZy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLnBlbmRpbmcgPSBudWxsO1xuXG4gICAgbXNnID0gdXRpbHMuam9pbjMyKG1zZywgMCwgbXNnLmxlbmd0aCAtIHIsIHRoaXMuZW5kaWFuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gdGhpcy5fZGVsdGEzMilcbiAgICAgIHRoaXMuX3VwZGF0ZShtc2csIGksIGkgKyB0aGlzLl9kZWx0YTMyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMudXBkYXRlKHRoaXMuX3BhZCgpKTtcbiAgYXNzZXJ0KHRoaXMucGVuZGluZyA9PT0gbnVsbCk7XG5cbiAgcmV0dXJuIHRoaXMuX2RpZ2VzdChlbmMpO1xufTtcblxuQmxvY2tIYXNoLnByb3RvdHlwZS5fcGFkID0gZnVuY3Rpb24gcGFkKCkge1xuICB2YXIgbGVuID0gdGhpcy5wZW5kaW5nVG90YWw7XG4gIHZhciBieXRlcyA9IHRoaXMuX2RlbHRhODtcbiAgdmFyIGsgPSBieXRlcyAtICgobGVuICsgdGhpcy5wYWRMZW5ndGgpICUgYnl0ZXMpO1xuICB2YXIgcmVzID0gbmV3IEFycmF5KGsgKyB0aGlzLnBhZExlbmd0aCk7XG4gIHJlc1swXSA9IDB4ODA7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgazsgaSsrKVxuICAgIHJlc1tpXSA9IDA7XG5cbiAgLy8gQXBwZW5kIGxlbmd0aFxuICBsZW4gPDw9IDM7XG4gIGlmICh0aGlzLmVuZGlhbiA9PT0gJ2JpZycpIHtcbiAgICBmb3IgKHZhciB0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG5cbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAobGVuID4+PiAyNCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDgpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IGxlbiAmIDB4ZmY7XG4gIH0gZWxzZSB7XG4gICAgcmVzW2krK10gPSBsZW4gJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gOCkgJiAweGZmO1xuICAgIHJlc1tpKytdID0gKGxlbiA+Pj4gMTYpICYgMHhmZjtcbiAgICByZXNbaSsrXSA9IChsZW4gPj4+IDI0KSAmIDB4ZmY7XG4gICAgcmVzW2krK10gPSAwO1xuICAgIHJlc1tpKytdID0gMDtcbiAgICByZXNbaSsrXSA9IDA7XG4gICAgcmVzW2krK10gPSAwO1xuXG4gICAgZm9yICh0ID0gODsgdCA8IHRoaXMucGFkTGVuZ3RoOyB0KyspXG4gICAgICByZXNbaSsrXSA9IDA7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxuZnVuY3Rpb24gSG1hYyhoYXNoLCBrZXksIGVuYykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSG1hYykpXG4gICAgcmV0dXJuIG5ldyBIbWFjKGhhc2gsIGtleSwgZW5jKTtcbiAgdGhpcy5IYXNoID0gaGFzaDtcbiAgdGhpcy5ibG9ja1NpemUgPSBoYXNoLmJsb2NrU2l6ZSAvIDg7XG4gIHRoaXMub3V0U2l6ZSA9IGhhc2gub3V0U2l6ZSAvIDg7XG4gIHRoaXMuaW5uZXIgPSBudWxsO1xuICB0aGlzLm91dGVyID0gbnVsbDtcblxuICB0aGlzLl9pbml0KHV0aWxzLnRvQXJyYXkoa2V5LCBlbmMpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gSG1hYztcblxuSG1hYy5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbiBpbml0KGtleSkge1xuICAvLyBTaG9ydGVuIGtleSwgaWYgbmVlZGVkXG4gIGlmIChrZXkubGVuZ3RoID4gdGhpcy5ibG9ja1NpemUpXG4gICAga2V5ID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpLmRpZ2VzdCgpO1xuICBhc3NlcnQoa2V5Lmxlbmd0aCA8PSB0aGlzLmJsb2NrU2l6ZSk7XG5cbiAgLy8gQWRkIHBhZGRpbmcgdG8ga2V5XG4gIGZvciAodmFyIGkgPSBrZXkubGVuZ3RoOyBpIDwgdGhpcy5ibG9ja1NpemU7IGkrKylcbiAgICBrZXkucHVzaCgwKTtcblxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDM2O1xuICB0aGlzLmlubmVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xuXG4gIC8vIDB4MzYgXiAweDVjID0gMHg2YVxuICBmb3IgKGkgPSAwOyBpIDwga2V5Lmxlbmd0aDsgaSsrKVxuICAgIGtleVtpXSBePSAweDZhO1xuICB0aGlzLm91dGVyID0gbmV3IHRoaXMuSGFzaCgpLnVwZGF0ZShrZXkpO1xufTtcblxuSG1hYy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKG1zZywgZW5jKSB7XG4gIHRoaXMuaW5uZXIudXBkYXRlKG1zZywgZW5jKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5IbWFjLnByb3RvdHlwZS5kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaW5uZXIuZGlnZXN0KCkpO1xuICByZXR1cm4gdGhpcy5vdXRlci5kaWdlc3QoZW5jKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG52YXIgcm90bDMyID0gdXRpbHMucm90bDMyO1xudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfMyA9IHV0aWxzLnN1bTMyXzM7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxuZnVuY3Rpb24gUklQRU1EMTYwKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUklQRU1EMTYwKSlcbiAgICByZXR1cm4gbmV3IFJJUEVNRDE2MCgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuXG4gIHRoaXMuaCA9IFsgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMCBdO1xuICB0aGlzLmVuZGlhbiA9ICdsaXR0bGUnO1xufVxudXRpbHMuaW5oZXJpdHMoUklQRU1EMTYwLCBCbG9ja0hhc2gpO1xuZXhwb3J0cy5yaXBlbWQxNjAgPSBSSVBFTUQxNjA7XG5cblJJUEVNRDE2MC5ibG9ja1NpemUgPSA1MTI7XG5SSVBFTUQxNjAub3V0U2l6ZSA9IDE2MDtcblJJUEVNRDE2MC5obWFjU3RyZW5ndGggPSAxOTI7XG5SSVBFTUQxNjAucGFkTGVuZ3RoID0gNjQ7XG5cblJJUEVNRDE2MC5wcm90b3R5cGUuX3VwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHZhciBBID0gdGhpcy5oWzBdO1xuICB2YXIgQiA9IHRoaXMuaFsxXTtcbiAgdmFyIEMgPSB0aGlzLmhbMl07XG4gIHZhciBEID0gdGhpcy5oWzNdO1xuICB2YXIgRSA9IHRoaXMuaFs0XTtcbiAgdmFyIEFoID0gQTtcbiAgdmFyIEJoID0gQjtcbiAgdmFyIENoID0gQztcbiAgdmFyIERoID0gRDtcbiAgdmFyIEVoID0gRTtcbiAgZm9yICh2YXIgaiA9IDA7IGogPCA4MDsgaisrKSB7XG4gICAgdmFyIFQgPSBzdW0zMihcbiAgICAgIHJvdGwzMihcbiAgICAgICAgc3VtMzJfNChBLCBmKGosIEIsIEMsIEQpLCBtc2dbcltqXSArIHN0YXJ0XSwgSyhqKSksXG4gICAgICAgIHNbal0pLFxuICAgICAgRSk7XG4gICAgQSA9IEU7XG4gICAgRSA9IEQ7XG4gICAgRCA9IHJvdGwzMihDLCAxMCk7XG4gICAgQyA9IEI7XG4gICAgQiA9IFQ7XG4gICAgVCA9IHN1bTMyKFxuICAgICAgcm90bDMyKFxuICAgICAgICBzdW0zMl80KEFoLCBmKDc5IC0gaiwgQmgsIENoLCBEaCksIG1zZ1tyaFtqXSArIHN0YXJ0XSwgS2goaikpLFxuICAgICAgICBzaFtqXSksXG4gICAgICBFaCk7XG4gICAgQWggPSBFaDtcbiAgICBFaCA9IERoO1xuICAgIERoID0gcm90bDMyKENoLCAxMCk7XG4gICAgQ2ggPSBCaDtcbiAgICBCaCA9IFQ7XG4gIH1cbiAgVCA9IHN1bTMyXzModGhpcy5oWzFdLCBDLCBEaCk7XG4gIHRoaXMuaFsxXSA9IHN1bTMyXzModGhpcy5oWzJdLCBELCBFaCk7XG4gIHRoaXMuaFsyXSA9IHN1bTMyXzModGhpcy5oWzNdLCBFLCBBaCk7XG4gIHRoaXMuaFszXSA9IHN1bTMyXzModGhpcy5oWzRdLCBBLCBCaCk7XG4gIHRoaXMuaFs0XSA9IHN1bTMyXzModGhpcy5oWzBdLCBCLCBDaCk7XG4gIHRoaXMuaFswXSA9IFQ7XG59O1xuXG5SSVBFTUQxNjAucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2xpdHRsZScpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnbGl0dGxlJyk7XG59O1xuXG5mdW5jdGlvbiBmKGosIHgsIHksIHopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIHggXiB5IF4gejtcbiAgZWxzZSBpZiAoaiA8PSAzMSlcbiAgICByZXR1cm4gKHggJiB5KSB8ICgofngpICYgeik7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuICh4IHwgKH55KSkgXiB6O1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAoeCAmIHopIHwgKHkgJiAofnopKTtcbiAgZWxzZVxuICAgIHJldHVybiB4IF4gKHkgfCAofnopKTtcbn1cblxuZnVuY3Rpb24gSyhqKSB7XG4gIGlmIChqIDw9IDE1KVxuICAgIHJldHVybiAweDAwMDAwMDAwO1xuICBlbHNlIGlmIChqIDw9IDMxKVxuICAgIHJldHVybiAweDVhODI3OTk5O1xuICBlbHNlIGlmIChqIDw9IDQ3KVxuICAgIHJldHVybiAweDZlZDllYmExO1xuICBlbHNlIGlmIChqIDw9IDYzKVxuICAgIHJldHVybiAweDhmMWJiY2RjO1xuICBlbHNlXG4gICAgcmV0dXJuIDB4YTk1M2ZkNGU7XG59XG5cbmZ1bmN0aW9uIEtoKGopIHtcbiAgaWYgKGogPD0gMTUpXG4gICAgcmV0dXJuIDB4NTBhMjhiZTY7XG4gIGVsc2UgaWYgKGogPD0gMzEpXG4gICAgcmV0dXJuIDB4NWM0ZGQxMjQ7XG4gIGVsc2UgaWYgKGogPD0gNDcpXG4gICAgcmV0dXJuIDB4NmQ3MDNlZjM7XG4gIGVsc2UgaWYgKGogPD0gNjMpXG4gICAgcmV0dXJuIDB4N2E2ZDc2ZTk7XG4gIGVsc2VcbiAgICByZXR1cm4gMHgwMDAwMDAwMDtcbn1cblxudmFyIHIgPSBbXG4gIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gIDcsIDQsIDEzLCAxLCAxMCwgNiwgMTUsIDMsIDEyLCAwLCA5LCA1LCAyLCAxNCwgMTEsIDgsXG4gIDMsIDEwLCAxNCwgNCwgOSwgMTUsIDgsIDEsIDIsIDcsIDAsIDYsIDEzLCAxMSwgNSwgMTIsXG4gIDEsIDksIDExLCAxMCwgMCwgOCwgMTIsIDQsIDEzLCAzLCA3LCAxNSwgMTQsIDUsIDYsIDIsXG4gIDQsIDAsIDUsIDksIDcsIDEyLCAyLCAxMCwgMTQsIDEsIDMsIDgsIDExLCA2LCAxNSwgMTNcbl07XG5cbnZhciByaCA9IFtcbiAgNSwgMTQsIDcsIDAsIDksIDIsIDExLCA0LCAxMywgNiwgMTUsIDgsIDEsIDEwLCAzLCAxMixcbiAgNiwgMTEsIDMsIDcsIDAsIDEzLCA1LCAxMCwgMTQsIDE1LCA4LCAxMiwgNCwgOSwgMSwgMixcbiAgMTUsIDUsIDEsIDMsIDcsIDE0LCA2LCA5LCAxMSwgOCwgMTIsIDIsIDEwLCAwLCA0LCAxMyxcbiAgOCwgNiwgNCwgMSwgMywgMTEsIDE1LCAwLCA1LCAxMiwgMiwgMTMsIDksIDcsIDEwLCAxNCxcbiAgMTIsIDE1LCAxMCwgNCwgMSwgNSwgOCwgNywgNiwgMiwgMTMsIDE0LCAwLCAzLCA5LCAxMVxuXTtcblxudmFyIHMgPSBbXG4gIDExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOCxcbiAgNywgNiwgOCwgMTMsIDExLCA5LCA3LCAxNSwgNywgMTIsIDE1LCA5LCAxMSwgNywgMTMsIDEyLFxuICAxMSwgMTMsIDYsIDcsIDE0LCA5LCAxMywgMTUsIDE0LCA4LCAxMywgNiwgNSwgMTIsIDcsIDUsXG4gIDExLCAxMiwgMTQsIDE1LCAxNCwgMTUsIDksIDgsIDksIDE0LCA1LCA2LCA4LCA2LCA1LCAxMixcbiAgOSwgMTUsIDUsIDExLCA2LCA4LCAxMywgMTIsIDUsIDEyLCAxMywgMTQsIDExLCA4LCA1LCA2XG5dO1xuXG52YXIgc2ggPSBbXG4gIDgsIDksIDksIDExLCAxMywgMTUsIDE1LCA1LCA3LCA3LCA4LCAxMSwgMTQsIDE0LCAxMiwgNixcbiAgOSwgMTMsIDE1LCA3LCAxMiwgOCwgOSwgMTEsIDcsIDcsIDEyLCA3LCA2LCAxNSwgMTMsIDExLFxuICA5LCA3LCAxNSwgMTEsIDgsIDYsIDYsIDE0LCAxMiwgMTMsIDUsIDE0LCAxMywgMTMsIDcsIDUsXG4gIDE1LCA1LCA4LCAxMSwgMTQsIDE0LCA2LCAxNCwgNiwgOSwgMTIsIDksIDEyLCA1LCAxNSwgOCxcbiAgOCwgNSwgMTIsIDksIDEyLCA1LCAxNCwgNiwgOCwgMTMsIDYsIDUsIDE1LCAxMywgMTEsIDExXG5dO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLnNoYTEgPSByZXF1aXJlKCcuL3NoYS8xJyk7XG5leHBvcnRzLnNoYTIyNCA9IHJlcXVpcmUoJy4vc2hhLzIyNCcpO1xuZXhwb3J0cy5zaGEyNTYgPSByZXF1aXJlKCcuL3NoYS8yNTYnKTtcbmV4cG9ydHMuc2hhMzg0ID0gcmVxdWlyZSgnLi9zaGEvMzg0Jyk7XG5leHBvcnRzLnNoYTUxMiA9IHJlcXVpcmUoJy4vc2hhLzUxMicpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIHNoYUNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cbnZhciByb3RsMzIgPSB1dGlscy5yb3RsMzI7XG52YXIgc3VtMzIgPSB1dGlscy5zdW0zMjtcbnZhciBzdW0zMl81ID0gdXRpbHMuc3VtMzJfNTtcbnZhciBmdF8xID0gc2hhQ29tbW9uLmZ0XzE7XG52YXIgQmxvY2tIYXNoID0gY29tbW9uLkJsb2NrSGFzaDtcblxudmFyIHNoYTFfSyA9IFtcbiAgMHg1QTgyNzk5OSwgMHg2RUQ5RUJBMSxcbiAgMHg4RjFCQkNEQywgMHhDQTYyQzFENlxuXTtcblxuZnVuY3Rpb24gU0hBMSgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTEpKVxuICAgIHJldHVybiBuZXcgU0hBMSgpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSxcbiAgICAweDEwMzI1NDc2LCAweGMzZDJlMWYwIF07XG4gIHRoaXMuVyA9IG5ldyBBcnJheSg4MCk7XG59XG5cbnV0aWxzLmluaGVyaXRzKFNIQTEsIEJsb2NrSGFzaCk7XG5tb2R1bGUuZXhwb3J0cyA9IFNIQTE7XG5cblNIQTEuYmxvY2tTaXplID0gNTEyO1xuU0hBMS5vdXRTaXplID0gMTYwO1xuU0hBMS5obWFjU3RyZW5ndGggPSA4MDtcblNIQTEucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTEucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcblxuICBmb3IoOyBpIDwgVy5sZW5ndGg7IGkrKylcbiAgICBXW2ldID0gcm90bDMyKFdbaSAtIDNdIF4gV1tpIC0gOF0gXiBXW2kgLSAxNF0gXiBXW2kgLSAxNl0sIDEpO1xuXG4gIHZhciBhID0gdGhpcy5oWzBdO1xuICB2YXIgYiA9IHRoaXMuaFsxXTtcbiAgdmFyIGMgPSB0aGlzLmhbMl07XG4gIHZhciBkID0gdGhpcy5oWzNdO1xuICB2YXIgZSA9IHRoaXMuaFs0XTtcblxuICBmb3IgKGkgPSAwOyBpIDwgVy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzID0gfn4oaSAvIDIwKTtcbiAgICB2YXIgdCA9IHN1bTMyXzUocm90bDMyKGEsIDUpLCBmdF8xKHMsIGIsIGMsIGQpLCBlLCBXW2ldLCBzaGExX0tbc10pO1xuICAgIGUgPSBkO1xuICAgIGQgPSBjO1xuICAgIGMgPSByb3RsMzIoYiwgMzApO1xuICAgIGIgPSBhO1xuICAgIGEgPSB0O1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbn07XG5cblNIQTEucHJvdG90eXBlLl9kaWdlc3QgPSBmdW5jdGlvbiBkaWdlc3QoZW5jKSB7XG4gIGlmIChlbmMgPT09ICdoZXgnKVxuICAgIHJldHVybiB1dGlscy50b0hleDMyKHRoaXMuaCwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLCAnYmlnJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIFNIQTI1NiA9IHJlcXVpcmUoJy4vMjU2Jyk7XG5cbmZ1bmN0aW9uIFNIQTIyNCgpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTIyNCkpXG4gICAgcmV0dXJuIG5ldyBTSEEyMjQoKTtcblxuICBTSEEyNTYuY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4YzEwNTllZDgsIDB4MzY3Y2Q1MDcsIDB4MzA3MGRkMTcsIDB4ZjcwZTU5MzksXG4gICAgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCBdO1xufVxudXRpbHMuaW5oZXJpdHMoU0hBMjI0LCBTSEEyNTYpO1xubW9kdWxlLmV4cG9ydHMgPSBTSEEyMjQ7XG5cblNIQTIyNC5ibG9ja1NpemUgPSA1MTI7XG5TSEEyMjQub3V0U2l6ZSA9IDIyNDtcblNIQTIyNC5obWFjU3RyZW5ndGggPSAxOTI7XG5TSEEyMjQucGFkTGVuZ3RoID0gNjQ7XG5cblNIQTIyNC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgLy8gSnVzdCB0cnVuY2F0ZSBvdXRwdXRcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDcpLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmguc2xpY2UoMCwgNyksICdiaWcnKTtcbn07XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBzaGFDb21tb24gPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoJ21pbmltYWxpc3RpYy1hc3NlcnQnKTtcblxudmFyIHN1bTMyID0gdXRpbHMuc3VtMzI7XG52YXIgc3VtMzJfNCA9IHV0aWxzLnN1bTMyXzQ7XG52YXIgc3VtMzJfNSA9IHV0aWxzLnN1bTMyXzU7XG52YXIgY2gzMiA9IHNoYUNvbW1vbi5jaDMyO1xudmFyIG1hajMyID0gc2hhQ29tbW9uLm1hajMyO1xudmFyIHMwXzI1NiA9IHNoYUNvbW1vbi5zMF8yNTY7XG52YXIgczFfMjU2ID0gc2hhQ29tbW9uLnMxXzI1NjtcbnZhciBnMF8yNTYgPSBzaGFDb21tb24uZzBfMjU2O1xudmFyIGcxXzI1NiA9IHNoYUNvbW1vbi5nMV8yNTY7XG5cbnZhciBCbG9ja0hhc2ggPSBjb21tb24uQmxvY2tIYXNoO1xuXG52YXIgc2hhMjU2X0sgPSBbXG4gIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gIDB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUsXG4gIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsXG4gIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gIDB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MsXG4gIDB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEsXG4gIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gIDB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcsXG4gIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsXG4gIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gIDB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMsXG4gIDB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAsXG4gIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gIDB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMsXG4gIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsXG4gIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl07XG5cbmZ1bmN0aW9uIFNIQTI1NigpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNIQTI1NikpXG4gICAgcmV0dXJuIG5ldyBTSEEyNTYoKTtcblxuICBCbG9ja0hhc2guY2FsbCh0aGlzKTtcbiAgdGhpcy5oID0gW1xuICAgIDB4NmEwOWU2NjcsIDB4YmI2N2FlODUsIDB4M2M2ZWYzNzIsIDB4YTU0ZmY1M2EsXG4gICAgMHg1MTBlNTI3ZiwgMHg5YjA1Njg4YywgMHgxZjgzZDlhYiwgMHg1YmUwY2QxOVxuICBdO1xuICB0aGlzLmsgPSBzaGEyNTZfSztcbiAgdGhpcy5XID0gbmV3IEFycmF5KDY0KTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTI1NiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMjU2O1xuXG5TSEEyNTYuYmxvY2tTaXplID0gNTEyO1xuU0hBMjU2Lm91dFNpemUgPSAyNTY7XG5TSEEyNTYuaG1hY1N0cmVuZ3RoID0gMTkyO1xuU0hBMjU2LnBhZExlbmd0aCA9IDY0O1xuXG5TSEEyNTYucHJvdG90eXBlLl91cGRhdGUgPSBmdW5jdGlvbiBfdXBkYXRlKG1zZywgc3RhcnQpIHtcbiAgdmFyIFcgPSB0aGlzLlc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgaSsrKVxuICAgIFdbaV0gPSBtc2dbc3RhcnQgKyBpXTtcbiAgZm9yICg7IGkgPCBXLmxlbmd0aDsgaSsrKVxuICAgIFdbaV0gPSBzdW0zMl80KGcxXzI1NihXW2kgLSAyXSksIFdbaSAtIDddLCBnMF8yNTYoV1tpIC0gMTVdKSwgV1tpIC0gMTZdKTtcblxuICB2YXIgYSA9IHRoaXMuaFswXTtcbiAgdmFyIGIgPSB0aGlzLmhbMV07XG4gIHZhciBjID0gdGhpcy5oWzJdO1xuICB2YXIgZCA9IHRoaXMuaFszXTtcbiAgdmFyIGUgPSB0aGlzLmhbNF07XG4gIHZhciBmID0gdGhpcy5oWzVdO1xuICB2YXIgZyA9IHRoaXMuaFs2XTtcbiAgdmFyIGggPSB0aGlzLmhbN107XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yIChpID0gMDsgaSA8IFcubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgVDEgPSBzdW0zMl81KGgsIHMxXzI1NihlKSwgY2gzMihlLCBmLCBnKSwgdGhpcy5rW2ldLCBXW2ldKTtcbiAgICB2YXIgVDIgPSBzdW0zMihzMF8yNTYoYSksIG1hajMyKGEsIGIsIGMpKTtcbiAgICBoID0gZztcbiAgICBnID0gZjtcbiAgICBmID0gZTtcbiAgICBlID0gc3VtMzIoZCwgVDEpO1xuICAgIGQgPSBjO1xuICAgIGMgPSBiO1xuICAgIGIgPSBhO1xuICAgIGEgPSBzdW0zMihUMSwgVDIpO1xuICB9XG5cbiAgdGhpcy5oWzBdID0gc3VtMzIodGhpcy5oWzBdLCBhKTtcbiAgdGhpcy5oWzFdID0gc3VtMzIodGhpcy5oWzFdLCBiKTtcbiAgdGhpcy5oWzJdID0gc3VtMzIodGhpcy5oWzJdLCBjKTtcbiAgdGhpcy5oWzNdID0gc3VtMzIodGhpcy5oWzNdLCBkKTtcbiAgdGhpcy5oWzRdID0gc3VtMzIodGhpcy5oWzRdLCBlKTtcbiAgdGhpcy5oWzVdID0gc3VtMzIodGhpcy5oWzVdLCBmKTtcbiAgdGhpcy5oWzZdID0gc3VtMzIodGhpcy5oWzZdLCBnKTtcbiAgdGhpcy5oWzddID0gc3VtMzIodGhpcy5oWzddLCBoKTtcbn07XG5cblNIQTI1Ni5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLCAnYmlnJyk7XG4gIGVsc2VcbiAgICByZXR1cm4gdXRpbHMuc3BsaXQzMih0aGlzLmgsICdiaWcnKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbnZhciBTSEE1MTIgPSByZXF1aXJlKCcuLzUxMicpO1xuXG5mdW5jdGlvbiBTSEEzODQoKSB7XG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTSEEzODQpKVxuICAgIHJldHVybiBuZXcgU0hBMzg0KCk7XG5cbiAgU0hBNTEyLmNhbGwodGhpcyk7XG4gIHRoaXMuaCA9IFtcbiAgICAweGNiYmI5ZDVkLCAweGMxMDU5ZWQ4LFxuICAgIDB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDcsXG4gICAgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNyxcbiAgICAweDE1MmZlY2Q4LCAweGY3MGU1OTM5LFxuICAgIDB4NjczMzI2NjcsIDB4ZmZjMDBiMzEsXG4gICAgMHg4ZWI0NGE4NywgMHg2ODU4MTUxMSxcbiAgICAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LFxuICAgIDB4NDdiNTQ4MWQsIDB4YmVmYTRmYTQgXTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTM4NCwgU0hBNTEyKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBMzg0O1xuXG5TSEEzODQuYmxvY2tTaXplID0gMTAyNDtcblNIQTM4NC5vdXRTaXplID0gMzg0O1xuU0hBMzg0LmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTM4NC5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTM4NC5wcm90b3R5cGUuX2RpZ2VzdCA9IGZ1bmN0aW9uIGRpZ2VzdChlbmMpIHtcbiAgaWYgKGVuYyA9PT0gJ2hleCcpXG4gICAgcmV0dXJuIHV0aWxzLnRvSGV4MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xuICBlbHNlXG4gICAgcmV0dXJuIHV0aWxzLnNwbGl0MzIodGhpcy5oLnNsaWNlKDAsIDEyKSwgJ2JpZycpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBjb21tb24gPSByZXF1aXJlKCcuLi9jb21tb24nKTtcbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG5cbnZhciByb3RyNjRfaGkgPSB1dGlscy5yb3RyNjRfaGk7XG52YXIgcm90cjY0X2xvID0gdXRpbHMucm90cjY0X2xvO1xudmFyIHNocjY0X2hpID0gdXRpbHMuc2hyNjRfaGk7XG52YXIgc2hyNjRfbG8gPSB1dGlscy5zaHI2NF9sbztcbnZhciBzdW02NCA9IHV0aWxzLnN1bTY0O1xudmFyIHN1bTY0X2hpID0gdXRpbHMuc3VtNjRfaGk7XG52YXIgc3VtNjRfbG8gPSB1dGlscy5zdW02NF9sbztcbnZhciBzdW02NF80X2hpID0gdXRpbHMuc3VtNjRfNF9oaTtcbnZhciBzdW02NF80X2xvID0gdXRpbHMuc3VtNjRfNF9sbztcbnZhciBzdW02NF81X2hpID0gdXRpbHMuc3VtNjRfNV9oaTtcbnZhciBzdW02NF81X2xvID0gdXRpbHMuc3VtNjRfNV9sbztcblxudmFyIEJsb2NrSGFzaCA9IGNvbW1vbi5CbG9ja0hhc2g7XG5cbnZhciBzaGE1MTJfSyA9IFtcbiAgMHg0MjhhMmY5OCwgMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwgMHgyM2VmNjVjZCxcbiAgMHhiNWMwZmJjZiwgMHhlYzRkM2IyZiwgMHhlOWI1ZGJhNSwgMHg4MTg5ZGJiYyxcbiAgMHgzOTU2YzI1YiwgMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwgMHhiNjA1ZDAxOSxcbiAgMHg5MjNmODJhNCwgMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwgMHhkYTZkODExOCxcbiAgMHhkODA3YWE5OCwgMHhhMzAzMDI0MiwgMHgxMjgzNWIwMSwgMHg0NTcwNmZiZSxcbiAgMHgyNDMxODViZSwgMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywgMHhkNWZmYjRlMixcbiAgMHg3MmJlNWQ3NCwgMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwgMHgzYjE2OTZiMSxcbiAgMHg5YmRjMDZhNywgMHgyNWM3MTIzNSwgMHhjMTliZjE3NCwgMHhjZjY5MjY5NCxcbiAgMHhlNDliNjljMSwgMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwgMHgzODRmMjVlMyxcbiAgMHgwZmMxOWRjNiwgMHg4YjhjZDViNSwgMHgyNDBjYTFjYywgMHg3N2FjOWM2NSxcbiAgMHgyZGU5MmM2ZiwgMHg1OTJiMDI3NSwgMHg0YTc0ODRhYSwgMHg2ZWE2ZTQ4MyxcbiAgMHg1Y2IwYTlkYywgMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwgMHg4MzExNTNiNSxcbiAgMHg5ODNlNTE1MiwgMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwgMHgyZGI0MzIxMCxcbiAgMHhiMDAzMjdjOCwgMHg5OGZiMjEzZiwgMHhiZjU5N2ZjNywgMHhiZWVmMGVlNCxcbiAgMHhjNmUwMGJmMywgMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywgMHg5MzBhYTcyNSxcbiAgMHgwNmNhNjM1MSwgMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywgMHgwYTBlNmU3MCxcbiAgMHgyN2I3MGE4NSwgMHg0NmQyMmZmYywgMHgyZTFiMjEzOCwgMHg1YzI2YzkyNixcbiAgMHg0ZDJjNmRmYywgMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywgMHg5ZDk1YjNkZixcbiAgMHg2NTBhNzM1NCwgMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwgMHgzYzc3YjJhOCxcbiAgMHg4MWMyYzkyZSwgMHg0N2VkYWVlNiwgMHg5MjcyMmM4NSwgMHgxNDgyMzUzYixcbiAgMHhhMmJmZThhMSwgMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwgMHhiYzQyMzAwMSxcbiAgMHhjMjRiOGI3MCwgMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywgMHgwNjU0YmUzMCxcbiAgMHhkMTkyZTgxOSwgMHhkNmVmNTIxOCwgMHhkNjk5MDYyNCwgMHg1NTY1YTkxMCxcbiAgMHhmNDBlMzU4NSwgMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwgMHgzMmJiZDFiOCxcbiAgMHgxOWE0YzExNiwgMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwgMHg1MTQxYWI1MyxcbiAgMHgyNzQ4Nzc0YywgMHhkZjhlZWI5OSwgMHgzNGIwYmNiNSwgMHhlMTliNDhhOCxcbiAgMHgzOTFjMGNiMywgMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwgMHhlMzQxOGFjYixcbiAgMHg1YjljY2E0ZiwgMHg3NzYzZTM3MywgMHg2ODJlNmZmMywgMHhkNmIyYjhhMyxcbiAgMHg3NDhmODJlZSwgMHg1ZGVmYjJmYywgMHg3OGE1NjM2ZiwgMHg0MzE3MmY2MCxcbiAgMHg4NGM4NzgxNCwgMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwgMHgxYTY0MzllYyxcbiAgMHg5MGJlZmZmYSwgMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwgMHhkZTgyYmRlOSxcbiAgMHhiZWY5YTNmNywgMHhiMmM2NzkxNSwgMHhjNjcxNzhmMiwgMHhlMzcyNTMyYixcbiAgMHhjYTI3M2VjZSwgMHhlYTI2NjE5YywgMHhkMTg2YjhjNywgMHgyMWMwYzIwNyxcbiAgMHhlYWRhN2RkNiwgMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwgMHhlZTZlZDE3OCxcbiAgMHgwNmYwNjdhYSwgMHg3MjE3NmZiYSwgMHgwYTYzN2RjNSwgMHhhMmM4OThhNixcbiAgMHgxMTNmOTgwNCwgMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwgMHgxMzFjNDcxYixcbiAgMHgyOGRiNzdmNSwgMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwgMHg0MGM3MjQ5MyxcbiAgMHgzYzllYmUwYSwgMHgxNWM5YmViYywgMHg0MzFkNjdjNCwgMHg5YzEwMGQ0YyxcbiAgMHg0Y2M1ZDRiZSwgMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywgMHhmYzY1N2UyYSxcbiAgMHg1ZmNiNmZhYiwgMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywgMHg0YTQ3NTgxN1xuXTtcblxuZnVuY3Rpb24gU0hBNTEyKCkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU0hBNTEyKSlcbiAgICByZXR1cm4gbmV3IFNIQTUxMigpO1xuXG4gIEJsb2NrSGFzaC5jYWxsKHRoaXMpO1xuICB0aGlzLmggPSBbXG4gICAgMHg2YTA5ZTY2NywgMHhmM2JjYzkwOCxcbiAgICAweGJiNjdhZTg1LCAweDg0Y2FhNzNiLFxuICAgIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsXG4gICAgMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMSxcbiAgICAweDUxMGU1MjdmLCAweGFkZTY4MmQxLFxuICAgIDB4OWIwNTY4OGMsIDB4MmIzZTZjMWYsXG4gICAgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YixcbiAgICAweDViZTBjZDE5LCAweDEzN2UyMTc5IF07XG4gIHRoaXMuayA9IHNoYTUxMl9LO1xuICB0aGlzLlcgPSBuZXcgQXJyYXkoMTYwKTtcbn1cbnV0aWxzLmluaGVyaXRzKFNIQTUxMiwgQmxvY2tIYXNoKTtcbm1vZHVsZS5leHBvcnRzID0gU0hBNTEyO1xuXG5TSEE1MTIuYmxvY2tTaXplID0gMTAyNDtcblNIQTUxMi5vdXRTaXplID0gNTEyO1xuU0hBNTEyLmhtYWNTdHJlbmd0aCA9IDE5MjtcblNIQTUxMi5wYWRMZW5ndGggPSAxMjg7XG5cblNIQTUxMi5wcm90b3R5cGUuX3ByZXBhcmVCbG9jayA9IGZ1bmN0aW9uIF9wcmVwYXJlQmxvY2sobXNnLCBzdGFydCkge1xuICB2YXIgVyA9IHRoaXMuVztcblxuICAvLyAzMiB4IDMyYml0IHdvcmRzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKylcbiAgICBXW2ldID0gbXNnW3N0YXJ0ICsgaV07XG4gIGZvciAoOyBpIDwgVy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBjMF9oaSA9IGcxXzUxMl9oaShXW2kgLSA0XSwgV1tpIC0gM10pOyAgLy8gaSAtIDJcbiAgICB2YXIgYzBfbG8gPSBnMV81MTJfbG8oV1tpIC0gNF0sIFdbaSAtIDNdKTtcbiAgICB2YXIgYzFfaGkgPSBXW2kgLSAxNF07ICAvLyBpIC0gN1xuICAgIHZhciBjMV9sbyA9IFdbaSAtIDEzXTtcbiAgICB2YXIgYzJfaGkgPSBnMF81MTJfaGkoV1tpIC0gMzBdLCBXW2kgLSAyOV0pOyAgLy8gaSAtIDE1XG4gICAgdmFyIGMyX2xvID0gZzBfNTEyX2xvKFdbaSAtIDMwXSwgV1tpIC0gMjldKTtcbiAgICB2YXIgYzNfaGkgPSBXW2kgLSAzMl07ICAvLyBpIC0gMTZcbiAgICB2YXIgYzNfbG8gPSBXW2kgLSAzMV07XG5cbiAgICBXW2ldID0gc3VtNjRfNF9oaShcbiAgICAgIGMwX2hpLCBjMF9sbyxcbiAgICAgIGMxX2hpLCBjMV9sbyxcbiAgICAgIGMyX2hpLCBjMl9sbyxcbiAgICAgIGMzX2hpLCBjM19sbyk7XG4gICAgV1tpICsgMV0gPSBzdW02NF80X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvKTtcbiAgfVxufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fdXBkYXRlID0gZnVuY3Rpb24gX3VwZGF0ZShtc2csIHN0YXJ0KSB7XG4gIHRoaXMuX3ByZXBhcmVCbG9jayhtc2csIHN0YXJ0KTtcblxuICB2YXIgVyA9IHRoaXMuVztcblxuICB2YXIgYWggPSB0aGlzLmhbMF07XG4gIHZhciBhbCA9IHRoaXMuaFsxXTtcbiAgdmFyIGJoID0gdGhpcy5oWzJdO1xuICB2YXIgYmwgPSB0aGlzLmhbM107XG4gIHZhciBjaCA9IHRoaXMuaFs0XTtcbiAgdmFyIGNsID0gdGhpcy5oWzVdO1xuICB2YXIgZGggPSB0aGlzLmhbNl07XG4gIHZhciBkbCA9IHRoaXMuaFs3XTtcbiAgdmFyIGVoID0gdGhpcy5oWzhdO1xuICB2YXIgZWwgPSB0aGlzLmhbOV07XG4gIHZhciBmaCA9IHRoaXMuaFsxMF07XG4gIHZhciBmbCA9IHRoaXMuaFsxMV07XG4gIHZhciBnaCA9IHRoaXMuaFsxMl07XG4gIHZhciBnbCA9IHRoaXMuaFsxM107XG4gIHZhciBoaCA9IHRoaXMuaFsxNF07XG4gIHZhciBobCA9IHRoaXMuaFsxNV07XG5cbiAgYXNzZXJ0KHRoaXMuay5sZW5ndGggPT09IFcubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBXLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIGMwX2hpID0gaGg7XG4gICAgdmFyIGMwX2xvID0gaGw7XG4gICAgdmFyIGMxX2hpID0gczFfNTEyX2hpKGVoLCBlbCk7XG4gICAgdmFyIGMxX2xvID0gczFfNTEyX2xvKGVoLCBlbCk7XG4gICAgdmFyIGMyX2hpID0gY2g2NF9oaShlaCwgZWwsIGZoLCBmbCwgZ2gsIGdsKTtcbiAgICB2YXIgYzJfbG8gPSBjaDY0X2xvKGVoLCBlbCwgZmgsIGZsLCBnaCwgZ2wpO1xuICAgIHZhciBjM19oaSA9IHRoaXMua1tpXTtcbiAgICB2YXIgYzNfbG8gPSB0aGlzLmtbaSArIDFdO1xuICAgIHZhciBjNF9oaSA9IFdbaV07XG4gICAgdmFyIGM0X2xvID0gV1tpICsgMV07XG5cbiAgICB2YXIgVDFfaGkgPSBzdW02NF81X2hpKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcbiAgICB2YXIgVDFfbG8gPSBzdW02NF81X2xvKFxuICAgICAgYzBfaGksIGMwX2xvLFxuICAgICAgYzFfaGksIGMxX2xvLFxuICAgICAgYzJfaGksIGMyX2xvLFxuICAgICAgYzNfaGksIGMzX2xvLFxuICAgICAgYzRfaGksIGM0X2xvKTtcblxuICAgIGMwX2hpID0gczBfNTEyX2hpKGFoLCBhbCk7XG4gICAgYzBfbG8gPSBzMF81MTJfbG8oYWgsIGFsKTtcbiAgICBjMV9oaSA9IG1hajY0X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wpO1xuICAgIGMxX2xvID0gbWFqNjRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCk7XG5cbiAgICB2YXIgVDJfaGkgPSBzdW02NF9oaShjMF9oaSwgYzBfbG8sIGMxX2hpLCBjMV9sbyk7XG4gICAgdmFyIFQyX2xvID0gc3VtNjRfbG8oYzBfaGksIGMwX2xvLCBjMV9oaSwgYzFfbG8pO1xuXG4gICAgaGggPSBnaDtcbiAgICBobCA9IGdsO1xuXG4gICAgZ2ggPSBmaDtcbiAgICBnbCA9IGZsO1xuXG4gICAgZmggPSBlaDtcbiAgICBmbCA9IGVsO1xuXG4gICAgZWggPSBzdW02NF9oaShkaCwgZGwsIFQxX2hpLCBUMV9sbyk7XG4gICAgZWwgPSBzdW02NF9sbyhkbCwgZGwsIFQxX2hpLCBUMV9sbyk7XG5cbiAgICBkaCA9IGNoO1xuICAgIGRsID0gY2w7XG5cbiAgICBjaCA9IGJoO1xuICAgIGNsID0gYmw7XG5cbiAgICBiaCA9IGFoO1xuICAgIGJsID0gYWw7XG5cbiAgICBhaCA9IHN1bTY0X2hpKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgICBhbCA9IHN1bTY0X2xvKFQxX2hpLCBUMV9sbywgVDJfaGksIFQyX2xvKTtcbiAgfVxuXG4gIHN1bTY0KHRoaXMuaCwgMCwgYWgsIGFsKTtcbiAgc3VtNjQodGhpcy5oLCAyLCBiaCwgYmwpO1xuICBzdW02NCh0aGlzLmgsIDQsIGNoLCBjbCk7XG4gIHN1bTY0KHRoaXMuaCwgNiwgZGgsIGRsKTtcbiAgc3VtNjQodGhpcy5oLCA4LCBlaCwgZWwpO1xuICBzdW02NCh0aGlzLmgsIDEwLCBmaCwgZmwpO1xuICBzdW02NCh0aGlzLmgsIDEyLCBnaCwgZ2wpO1xuICBzdW02NCh0aGlzLmgsIDE0LCBoaCwgaGwpO1xufTtcblxuU0hBNTEyLnByb3RvdHlwZS5fZGlnZXN0ID0gZnVuY3Rpb24gZGlnZXN0KGVuYykge1xuICBpZiAoZW5jID09PSAnaGV4JylcbiAgICByZXR1cm4gdXRpbHMudG9IZXgzMih0aGlzLmgsICdiaWcnKTtcbiAgZWxzZVxuICAgIHJldHVybiB1dGlscy5zcGxpdDMyKHRoaXMuaCwgJ2JpZycpO1xufTtcblxuZnVuY3Rpb24gY2g2NF9oaSh4aCwgeGwsIHloLCB5bCwgemgpIHtcbiAgdmFyIHIgPSAoeGggJiB5aCkgXiAoKH54aCkgJiB6aCk7XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gY2g2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKCh+eGwpICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIG1hajY0X2hpKHhoLCB4bCwgeWgsIHlsLCB6aCkge1xuICB2YXIgciA9ICh4aCAmIHloKSBeICh4aCAmIHpoKSBeICh5aCAmIHpoKTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBtYWo2NF9sbyh4aCwgeGwsIHloLCB5bCwgemgsIHpsKSB7XG4gIHZhciByID0gKHhsICYgeWwpIF4gKHhsICYgemwpIF4gKHlsICYgemwpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMwXzUxMl9oaSh4aCwgeGwpIHtcbiAgdmFyIGMwX2hpID0gcm90cjY0X2hpKHhoLCB4bCwgMjgpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGwsIHhoLCAyKTsgIC8vIDM0XG4gIHZhciBjMl9oaSA9IHJvdHI2NF9oaSh4bCwgeGgsIDcpOyAgLy8gMzlcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBzMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDI4KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMik7ICAvLyAzNFxuICB2YXIgYzJfbG8gPSByb3RyNjRfbG8oeGwsIHhoLCA3KTsgIC8vIDM5XG5cbiAgdmFyIHIgPSBjMF9sbyBeIGMxX2xvIF4gYzJfbG87XG4gIGlmIChyIDwgMClcbiAgICByICs9IDB4MTAwMDAwMDAwO1xuICByZXR1cm4gcjtcbn1cblxuZnVuY3Rpb24gczFfNTEyX2hpKHhoLCB4bCkge1xuICB2YXIgYzBfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCAxNCk7XG4gIHZhciBjMV9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE4KTtcbiAgdmFyIGMyX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgOSk7ICAvLyA0MVxuXG4gIHZhciByID0gYzBfaGkgXiBjMV9oaSBeIGMyX2hpO1xuICBpZiAociA8IDApXG4gICAgciArPSAweDEwMDAwMDAwMDtcbiAgcmV0dXJuIHI7XG59XG5cbmZ1bmN0aW9uIHMxXzUxMl9sbyh4aCwgeGwpIHtcbiAgdmFyIGMwX2xvID0gcm90cjY0X2xvKHhoLCB4bCwgMTQpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCAxOCk7XG4gIHZhciBjMl9sbyA9IHJvdHI2NF9sbyh4bCwgeGgsIDkpOyAgLy8gNDFcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDEpO1xuICB2YXIgYzFfaGkgPSByb3RyNjRfaGkoeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMF81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDEpO1xuICB2YXIgYzFfbG8gPSByb3RyNjRfbG8oeGgsIHhsLCA4KTtcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA3KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfaGkoeGgsIHhsKSB7XG4gIHZhciBjMF9oaSA9IHJvdHI2NF9oaSh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2hpID0gcm90cjY0X2hpKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2hpID0gc2hyNjRfaGkoeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2hpIF4gYzFfaGkgXiBjMl9oaTtcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBnMV81MTJfbG8oeGgsIHhsKSB7XG4gIHZhciBjMF9sbyA9IHJvdHI2NF9sbyh4aCwgeGwsIDE5KTtcbiAgdmFyIGMxX2xvID0gcm90cjY0X2xvKHhsLCB4aCwgMjkpOyAgLy8gNjFcbiAgdmFyIGMyX2xvID0gc2hyNjRfbG8oeGgsIHhsLCA2KTtcblxuICB2YXIgciA9IGMwX2xvIF4gYzFfbG8gXiBjMl9sbztcbiAgaWYgKHIgPCAwKVxuICAgIHIgKz0gMHgxMDAwMDAwMDA7XG4gIHJldHVybiByO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIHJvdHIzMiA9IHV0aWxzLnJvdHIzMjtcblxuZnVuY3Rpb24gZnRfMShzLCB4LCB5LCB6KSB7XG4gIGlmIChzID09PSAwKVxuICAgIHJldHVybiBjaDMyKHgsIHksIHopO1xuICBpZiAocyA9PT0gMSB8fCBzID09PSAzKVxuICAgIHJldHVybiBwMzIoeCwgeSwgeik7XG4gIGlmIChzID09PSAyKVxuICAgIHJldHVybiBtYWozMih4LCB5LCB6KTtcbn1cbmV4cG9ydHMuZnRfMSA9IGZ0XzE7XG5cbmZ1bmN0aW9uIGNoMzIoeCwgeSwgeikge1xuICByZXR1cm4gKHggJiB5KSBeICgofngpICYgeik7XG59XG5leHBvcnRzLmNoMzIgPSBjaDMyO1xuXG5mdW5jdGlvbiBtYWozMih4LCB5LCB6KSB7XG4gIHJldHVybiAoeCAmIHkpIF4gKHggJiB6KSBeICh5ICYgeik7XG59XG5leHBvcnRzLm1hajMyID0gbWFqMzI7XG5cbmZ1bmN0aW9uIHAzMih4LCB5LCB6KSB7XG4gIHJldHVybiB4IF4geSBeIHo7XG59XG5leHBvcnRzLnAzMiA9IHAzMjtcblxuZnVuY3Rpb24gczBfMjU2KHgpIHtcbiAgcmV0dXJuIHJvdHIzMih4LCAyKSBeIHJvdHIzMih4LCAxMykgXiByb3RyMzIoeCwgMjIpO1xufVxuZXhwb3J0cy5zMF8yNTYgPSBzMF8yNTY7XG5cbmZ1bmN0aW9uIHMxXzI1Nih4KSB7XG4gIHJldHVybiByb3RyMzIoeCwgNikgXiByb3RyMzIoeCwgMTEpIF4gcm90cjMyKHgsIDI1KTtcbn1cbmV4cG9ydHMuczFfMjU2ID0gczFfMjU2O1xuXG5mdW5jdGlvbiBnMF8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDcpIF4gcm90cjMyKHgsIDE4KSBeICh4ID4+PiAzKTtcbn1cbmV4cG9ydHMuZzBfMjU2ID0gZzBfMjU2O1xuXG5mdW5jdGlvbiBnMV8yNTYoeCkge1xuICByZXR1cm4gcm90cjMyKHgsIDE3KSBeIHJvdHIzMih4LCAxOSkgXiAoeCA+Pj4gMTApO1xufVxuZXhwb3J0cy5nMV8yNTYgPSBnMV8yNTY7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhc3NlcnQgPSByZXF1aXJlKCdtaW5pbWFsaXN0aWMtYXNzZXJ0Jyk7XG52YXIgaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLmluaGVyaXRzID0gaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIGlzU3Vycm9nYXRlUGFpcihtc2csIGkpIHtcbiAgaWYgKChtc2cuY2hhckNvZGVBdChpKSAmIDB4RkMwMCkgIT09IDB4RDgwMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaSA8IDAgfHwgaSArIDEgPj0gbXNnLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKG1zZy5jaGFyQ29kZUF0KGkgKyAxKSAmIDB4RkMwMCkgPT09IDB4REMwMDtcbn1cblxuZnVuY3Rpb24gdG9BcnJheShtc2csIGVuYykge1xuICBpZiAoQXJyYXkuaXNBcnJheShtc2cpKVxuICAgIHJldHVybiBtc2cuc2xpY2UoKTtcbiAgaWYgKCFtc2cpXG4gICAgcmV0dXJuIFtdO1xuICB2YXIgcmVzID0gW107XG4gIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykge1xuICAgIGlmICghZW5jKSB7XG4gICAgICAvLyBJbnNwaXJlZCBieSBzdHJpbmdUb1V0ZjhCeXRlQXJyYXkoKSBpbiBjbG9zdXJlLWxpYnJhcnkgYnkgR29vZ2xlXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iLzg1OThkODcyNDJhZjU5YWFjMjMzMjcwNzQyYzg5ODRlMmIyYmRiZTAvY2xvc3VyZS9nb29nL2NyeXB0L2NyeXB0LmpzI0wxMTctTDE0M1xuICAgICAgLy8gQXBhY2hlIExpY2Vuc2UgMi4wXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtbGlicmFyeS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gICAgICB2YXIgcCA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYyA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgICAgIHJlc1twKytdID0gYztcbiAgICAgICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgICAgIHJlc1twKytdID0gKGMgPj4gNikgfCAxOTI7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfSBlbHNlIGlmIChpc1N1cnJvZ2F0ZVBhaXIobXNnLCBpKSkge1xuICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjICYgMHgwM0ZGKSA8PCAxMCkgKyAobXNnLmNoYXJDb2RlQXQoKytpKSAmIDB4MDNGRik7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gMTIpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgICAgIHJlc1twKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyA+PiAxMikgfCAyMjQ7XG4gICAgICAgICAgcmVzW3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICAgICAgcmVzW3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5jID09PSAnaGV4Jykge1xuICAgICAgbXNnID0gbXNnLnJlcGxhY2UoL1teYS16MC05XSsvaWcsICcnKTtcbiAgICAgIGlmIChtc2cubGVuZ3RoICUgMiAhPT0gMClcbiAgICAgICAgbXNnID0gJzAnICsgbXNnO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkgKz0gMilcbiAgICAgICAgcmVzLnB1c2gocGFyc2VJbnQobXNnW2ldICsgbXNnW2kgKyAxXSwgMTYpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChpID0gMDsgaSA8IG1zZy5sZW5ndGg7IGkrKylcbiAgICAgIHJlc1tpXSA9IG1zZ1tpXSB8IDA7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7XG5cbmZ1bmN0aW9uIHRvSGV4KG1zZykge1xuICB2YXIgcmVzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrKVxuICAgIHJlcyArPSB6ZXJvMihtc2dbaV0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMudG9IZXggPSB0b0hleDtcblxuZnVuY3Rpb24gaHRvbmwodykge1xuICB2YXIgcmVzID0gKHcgPj4+IDI0KSB8XG4gICAgICAgICAgICAoKHcgPj4+IDgpICYgMHhmZjAwKSB8XG4gICAgICAgICAgICAoKHcgPDwgOCkgJiAweGZmMDAwMCkgfFxuICAgICAgICAgICAgKCh3ICYgMHhmZikgPDwgMjQpO1xuICByZXR1cm4gcmVzID4+PiAwO1xufVxuZXhwb3J0cy5odG9ubCA9IGh0b25sO1xuXG5mdW5jdGlvbiB0b0hleDMyKG1zZywgZW5kaWFuKSB7XG4gIHZhciByZXMgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdyA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnbGl0dGxlJylcbiAgICAgIHcgPSBodG9ubCh3KTtcbiAgICByZXMgKz0gemVybzgody50b1N0cmluZygxNikpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLnRvSGV4MzIgPSB0b0hleDMyO1xuXG5mdW5jdGlvbiB6ZXJvMih3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvMiA9IHplcm8yO1xuXG5mdW5jdGlvbiB6ZXJvOCh3b3JkKSB7XG4gIGlmICh3b3JkLmxlbmd0aCA9PT0gNylcbiAgICByZXR1cm4gJzAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDYpXG4gICAgcmV0dXJuICcwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNSlcbiAgICByZXR1cm4gJzAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gNClcbiAgICByZXR1cm4gJzAwMDAnICsgd29yZDtcbiAgZWxzZSBpZiAod29yZC5sZW5ndGggPT09IDMpXG4gICAgcmV0dXJuICcwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMilcbiAgICByZXR1cm4gJzAwMDAwMCcgKyB3b3JkO1xuICBlbHNlIGlmICh3b3JkLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gJzAwMDAwMDAnICsgd29yZDtcbiAgZWxzZVxuICAgIHJldHVybiB3b3JkO1xufVxuZXhwb3J0cy56ZXJvOCA9IHplcm84O1xuXG5mdW5jdGlvbiBqb2luMzIobXNnLCBzdGFydCwgZW5kLCBlbmRpYW4pIHtcbiAgdmFyIGxlbiA9IGVuZCAtIHN0YXJ0O1xuICBhc3NlcnQobGVuICUgNCA9PT0gMCk7XG4gIHZhciByZXMgPSBuZXcgQXJyYXkobGVuIC8gNCk7XG4gIGZvciAodmFyIGkgPSAwLCBrID0gc3RhcnQ7IGkgPCByZXMubGVuZ3RoOyBpKyssIGsgKz0gNCkge1xuICAgIHZhciB3O1xuICAgIGlmIChlbmRpYW4gPT09ICdiaWcnKVxuICAgICAgdyA9IChtc2dba10gPDwgMjQpIHwgKG1zZ1trICsgMV0gPDwgMTYpIHwgKG1zZ1trICsgMl0gPDwgOCkgfCBtc2dbayArIDNdO1xuICAgIGVsc2VcbiAgICAgIHcgPSAobXNnW2sgKyAzXSA8PCAyNCkgfCAobXNnW2sgKyAyXSA8PCAxNikgfCAobXNnW2sgKyAxXSA8PCA4KSB8IG1zZ1trXTtcbiAgICByZXNbaV0gPSB3ID4+PiAwO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnRzLmpvaW4zMiA9IGpvaW4zMjtcblxuZnVuY3Rpb24gc3BsaXQzMihtc2csIGVuZGlhbikge1xuICB2YXIgcmVzID0gbmV3IEFycmF5KG1zZy5sZW5ndGggKiA0KTtcbiAgZm9yICh2YXIgaSA9IDAsIGsgPSAwOyBpIDwgbXNnLmxlbmd0aDsgaSsrLCBrICs9IDQpIHtcbiAgICB2YXIgbSA9IG1zZ1tpXTtcbiAgICBpZiAoZW5kaWFuID09PSAnYmlnJykge1xuICAgICAgcmVzW2tdID0gbSA+Pj4gMjQ7XG4gICAgICByZXNbayArIDFdID0gKG0gPj4+IDE2KSAmIDB4ZmY7XG4gICAgICByZXNbayArIDJdID0gKG0gPj4+IDgpICYgMHhmZjtcbiAgICAgIHJlc1trICsgM10gPSBtICYgMHhmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzW2sgKyAzXSA9IG0gPj4+IDI0O1xuICAgICAgcmVzW2sgKyAyXSA9IChtID4+PiAxNikgJiAweGZmO1xuICAgICAgcmVzW2sgKyAxXSA9IChtID4+PiA4KSAmIDB4ZmY7XG4gICAgICByZXNba10gPSBtICYgMHhmZjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cbmV4cG9ydHMuc3BsaXQzMiA9IHNwbGl0MzI7XG5cbmZ1bmN0aW9uIHJvdHIzMih3LCBiKSB7XG4gIHJldHVybiAodyA+Pj4gYikgfCAodyA8PCAoMzIgLSBiKSk7XG59XG5leHBvcnRzLnJvdHIzMiA9IHJvdHIzMjtcblxuZnVuY3Rpb24gcm90bDMyKHcsIGIpIHtcbiAgcmV0dXJuICh3IDw8IGIpIHwgKHcgPj4+ICgzMiAtIGIpKTtcbn1cbmV4cG9ydHMucm90bDMyID0gcm90bDMyO1xuXG5mdW5jdGlvbiBzdW0zMihhLCBiKSB7XG4gIHJldHVybiAoYSArIGIpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMiA9IHN1bTMyO1xuXG5mdW5jdGlvbiBzdW0zMl8zKGEsIGIsIGMpIHtcbiAgcmV0dXJuIChhICsgYiArIGMpID4+PiAwO1xufVxuZXhwb3J0cy5zdW0zMl8zID0gc3VtMzJfMztcblxuZnVuY3Rpb24gc3VtMzJfNChhLCBiLCBjLCBkKSB7XG4gIHJldHVybiAoYSArIGIgKyBjICsgZCkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzQgPSBzdW0zMl80O1xuXG5mdW5jdGlvbiBzdW0zMl81KGEsIGIsIGMsIGQsIGUpIHtcbiAgcmV0dXJuIChhICsgYiArIGMgKyBkICsgZSkgPj4+IDA7XG59XG5leHBvcnRzLnN1bTMyXzUgPSBzdW0zMl81O1xuXG5mdW5jdGlvbiBzdW02NChidWYsIHBvcywgYWgsIGFsKSB7XG4gIHZhciBiaCA9IGJ1Zltwb3NdO1xuICB2YXIgYmwgPSBidWZbcG9zICsgMV07XG5cbiAgdmFyIGxvID0gKGFsICsgYmwpID4+PiAwO1xuICB2YXIgaGkgPSAobG8gPCBhbCA/IDEgOiAwKSArIGFoICsgYmg7XG4gIGJ1Zltwb3NdID0gaGkgPj4+IDA7XG4gIGJ1Zltwb3MgKyAxXSA9IGxvO1xufVxuZXhwb3J0cy5zdW02NCA9IHN1bTY0O1xuXG5mdW5jdGlvbiBzdW02NF9oaShhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSAoYWwgKyBibCkgPj4+IDA7XG4gIHZhciBoaSA9IChsbyA8IGFsID8gMSA6IDApICsgYWggKyBiaDtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF9oaSA9IHN1bTY0X2hpO1xuXG5mdW5jdGlvbiBzdW02NF9sbyhhaCwgYWwsIGJoLCBibCkge1xuICB2YXIgbG8gPSBhbCArIGJsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0X2xvID0gc3VtNjRfbG87XG5cbmZ1bmN0aW9uIHN1bTY0XzRfaGkoYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgY2Fycnk7XG4gIHJldHVybiBoaSA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNF9oaSA9IHN1bTY0XzRfaGk7XG5cbmZ1bmN0aW9uIHN1bTY0XzRfbG8oYWgsIGFsLCBiaCwgYmwsIGNoLCBjbCwgZGgsIGRsKSB7XG4gIHZhciBsbyA9IGFsICsgYmwgKyBjbCArIGRsO1xuICByZXR1cm4gbG8gPj4+IDA7XG59XG5leHBvcnRzLnN1bTY0XzRfbG8gPSBzdW02NF80X2xvO1xuXG5mdW5jdGlvbiBzdW02NF81X2hpKGFoLCBhbCwgYmgsIGJsLCBjaCwgY2wsIGRoLCBkbCwgZWgsIGVsKSB7XG4gIHZhciBjYXJyeSA9IDA7XG4gIHZhciBsbyA9IGFsO1xuICBsbyA9IChsbyArIGJsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBhbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGNsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBjbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGRsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBkbCA/IDEgOiAwO1xuICBsbyA9IChsbyArIGVsKSA+Pj4gMDtcbiAgY2FycnkgKz0gbG8gPCBlbCA/IDEgOiAwO1xuXG4gIHZhciBoaSA9IGFoICsgYmggKyBjaCArIGRoICsgZWggKyBjYXJyeTtcbiAgcmV0dXJuIGhpID4+PiAwO1xufVxuZXhwb3J0cy5zdW02NF81X2hpID0gc3VtNjRfNV9oaTtcblxuZnVuY3Rpb24gc3VtNjRfNV9sbyhhaCwgYWwsIGJoLCBibCwgY2gsIGNsLCBkaCwgZGwsIGVoLCBlbCkge1xuICB2YXIgbG8gPSBhbCArIGJsICsgY2wgKyBkbCArIGVsO1xuXG4gIHJldHVybiBsbyA+Pj4gMDtcbn1cbmV4cG9ydHMuc3VtNjRfNV9sbyA9IHN1bTY0XzVfbG87XG5cbmZ1bmN0aW9uIHJvdHI2NF9oaShhaCwgYWwsIG51bSkge1xuICB2YXIgciA9IChhbCA8PCAoMzIgLSBudW0pKSB8IChhaCA+Pj4gbnVtKTtcbiAgcmV0dXJuIHIgPj4+IDA7XG59XG5leHBvcnRzLnJvdHI2NF9oaSA9IHJvdHI2NF9oaTtcblxuZnVuY3Rpb24gcm90cjY0X2xvKGFoLCBhbCwgbnVtKSB7XG4gIHZhciByID0gKGFoIDw8ICgzMiAtIG51bSkpIHwgKGFsID4+PiBudW0pO1xuICByZXR1cm4gciA+Pj4gMDtcbn1cbmV4cG9ydHMucm90cjY0X2xvID0gcm90cjY0X2xvO1xuXG5mdW5jdGlvbiBzaHI2NF9oaShhaCwgYWwsIG51bSkge1xuICByZXR1cm4gYWggPj4+IG51bTtcbn1cbmV4cG9ydHMuc2hyNjRfaGkgPSBzaHI2NF9oaTtcblxuZnVuY3Rpb24gc2hyNjRfbG8oYWgsIGFsLCBudW0pIHtcbiAgdmFyIHIgPSAoYWggPDwgKDMyIC0gbnVtKSkgfCAoYWwgPj4+IG51bSk7XG4gIHJldHVybiByID4+PiAwO1xufVxuZXhwb3J0cy5zaHI2NF9sbyA9IHNocjY0X2xvO1xuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgaWYgKHN1cGVyQ3Rvcikge1xuICAgICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBpZiAoc3VwZXJDdG9yKSB7XG4gICAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICAgIFRlbXBDdG9yLnByb3RvdHlwZSA9IHN1cGVyQ3Rvci5wcm90b3R5cGVcbiAgICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICAgIH1cbiAgfVxufVxuIiwiLyoqXHJcbiAqIFtqcy1zaGEzXXtAbGluayBodHRwczovL2dpdGh1Yi5jb20vZW1uMTc4L2pzLXNoYTN9XHJcbiAqXHJcbiAqIEB2ZXJzaW9uIDAuNS43XHJcbiAqIEBhdXRob3IgQ2hlbiwgWWktQ3l1YW4gW2VtbjE3OEBnbWFpbC5jb21dXHJcbiAqIEBjb3B5cmlnaHQgQ2hlbiwgWWktQ3l1YW4gMjAxNS0yMDE2XHJcbiAqIEBsaWNlbnNlIE1JVFxyXG4gKi9cclxuLypqc2xpbnQgYml0d2lzZTogdHJ1ZSAqL1xyXG4oZnVuY3Rpb24gKCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgdmFyIHJvb3QgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyA/IHdpbmRvdyA6IHt9O1xyXG4gIHZhciBOT0RFX0pTID0gIXJvb3QuSlNfU0hBM19OT19OT0RFX0pTICYmIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcclxuICBpZiAoTk9ERV9KUykge1xyXG4gICAgcm9vdCA9IGdsb2JhbDtcclxuICB9XHJcbiAgdmFyIENPTU1PTl9KUyA9ICFyb290LkpTX1NIQTNfTk9fQ09NTU9OX0pTICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzO1xyXG4gIHZhciBIRVhfQ0hBUlMgPSAnMDEyMzQ1Njc4OWFiY2RlZicuc3BsaXQoJycpO1xyXG4gIHZhciBTSEFLRV9QQURESU5HID0gWzMxLCA3OTM2LCAyMDMxNjE2LCA1MjAwOTM2OTZdO1xyXG4gIHZhciBLRUNDQUtfUEFERElORyA9IFsxLCAyNTYsIDY1NTM2LCAxNjc3NzIxNl07XHJcbiAgdmFyIFBBRERJTkcgPSBbNiwgMTUzNiwgMzkzMjE2LCAxMDA2NjMyOTZdO1xyXG4gIHZhciBTSElGVCA9IFswLCA4LCAxNiwgMjRdO1xyXG4gIHZhciBSQyA9IFsxLCAwLCAzMjg5OCwgMCwgMzI5MDYsIDIxNDc0ODM2NDgsIDIxNDc1MTY0MTYsIDIxNDc0ODM2NDgsIDMyOTA3LCAwLCAyMTQ3NDgzNjQ5LFxyXG4gICAgICAgICAgICAwLCAyMTQ3NTE2NTQ1LCAyMTQ3NDgzNjQ4LCAzMjc3NywgMjE0NzQ4MzY0OCwgMTM4LCAwLCAxMzYsIDAsIDIxNDc1MTY0MjUsIDAsXHJcbiAgICAgICAgICAgIDIxNDc0ODM2NTgsIDAsIDIxNDc1MTY1NTUsIDAsIDEzOSwgMjE0NzQ4MzY0OCwgMzI5MDUsIDIxNDc0ODM2NDgsIDMyNzcxLFxyXG4gICAgICAgICAgICAyMTQ3NDgzNjQ4LCAzMjc3MCwgMjE0NzQ4MzY0OCwgMTI4LCAyMTQ3NDgzNjQ4LCAzMjc3OCwgMCwgMjE0NzQ4MzY1OCwgMjE0NzQ4MzY0OCxcclxuICAgICAgICAgICAgMjE0NzUxNjU0NSwgMjE0NzQ4MzY0OCwgMzI4OTYsIDIxNDc0ODM2NDgsIDIxNDc0ODM2NDksIDAsIDIxNDc1MTY0MjQsIDIxNDc0ODM2NDhdO1xyXG4gIHZhciBCSVRTID0gWzIyNCwgMjU2LCAzODQsIDUxMl07XHJcbiAgdmFyIFNIQUtFX0JJVFMgPSBbMTI4LCAyNTZdO1xyXG4gIHZhciBPVVRQVVRfVFlQRVMgPSBbJ2hleCcsICdidWZmZXInLCAnYXJyYXlCdWZmZXInLCAnYXJyYXknXTtcclxuXHJcbiAgdmFyIGNyZWF0ZU91dHB1dE1ldGhvZCA9IGZ1bmN0aW9uIChiaXRzLCBwYWRkaW5nLCBvdXRwdXRUeXBlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBLZWNjYWsoYml0cywgcGFkZGluZywgYml0cykudXBkYXRlKG1lc3NhZ2UpW291dHB1dFR5cGVdKCk7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHZhciBjcmVhdGVTaGFrZU91dHB1dE1ldGhvZCA9IGZ1bmN0aW9uIChiaXRzLCBwYWRkaW5nLCBvdXRwdXRUeXBlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKG1lc3NhZ2UsIG91dHB1dEJpdHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBLZWNjYWsoYml0cywgcGFkZGluZywgb3V0cHV0Qml0cykudXBkYXRlKG1lc3NhZ2UpW291dHB1dFR5cGVdKCk7XHJcbiAgICB9O1xyXG4gIH07XHJcblxyXG4gIHZhciBjcmVhdGVNZXRob2QgPSBmdW5jdGlvbiAoYml0cywgcGFkZGluZykge1xyXG4gICAgdmFyIG1ldGhvZCA9IGNyZWF0ZU91dHB1dE1ldGhvZChiaXRzLCBwYWRkaW5nLCAnaGV4Jyk7XHJcbiAgICBtZXRob2QuY3JlYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gbmV3IEtlY2NhayhiaXRzLCBwYWRkaW5nLCBiaXRzKTtcclxuICAgIH07XHJcbiAgICBtZXRob2QudXBkYXRlID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcclxuICAgICAgcmV0dXJuIG1ldGhvZC5jcmVhdGUoKS51cGRhdGUobWVzc2FnZSk7XHJcbiAgICB9O1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBPVVRQVVRfVFlQRVMubGVuZ3RoOyArK2kpIHtcclxuICAgICAgdmFyIHR5cGUgPSBPVVRQVVRfVFlQRVNbaV07XHJcbiAgICAgIG1ldGhvZFt0eXBlXSA9IGNyZWF0ZU91dHB1dE1ldGhvZChiaXRzLCBwYWRkaW5nLCB0eXBlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtZXRob2Q7XHJcbiAgfTtcclxuXHJcbiAgdmFyIGNyZWF0ZVNoYWtlTWV0aG9kID0gZnVuY3Rpb24gKGJpdHMsIHBhZGRpbmcpIHtcclxuICAgIHZhciBtZXRob2QgPSBjcmVhdGVTaGFrZU91dHB1dE1ldGhvZChiaXRzLCBwYWRkaW5nLCAnaGV4Jyk7XHJcbiAgICBtZXRob2QuY3JlYXRlID0gZnVuY3Rpb24gKG91dHB1dEJpdHMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBLZWNjYWsoYml0cywgcGFkZGluZywgb3V0cHV0Qml0cyk7XHJcbiAgICB9O1xyXG4gICAgbWV0aG9kLnVwZGF0ZSA9IGZ1bmN0aW9uIChtZXNzYWdlLCBvdXRwdXRCaXRzKSB7XHJcbiAgICAgIHJldHVybiBtZXRob2QuY3JlYXRlKG91dHB1dEJpdHMpLnVwZGF0ZShtZXNzYWdlKTtcclxuICAgIH07XHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE9VVFBVVF9UWVBFUy5sZW5ndGg7ICsraSkge1xyXG4gICAgICB2YXIgdHlwZSA9IE9VVFBVVF9UWVBFU1tpXTtcclxuICAgICAgbWV0aG9kW3R5cGVdID0gY3JlYXRlU2hha2VPdXRwdXRNZXRob2QoYml0cywgcGFkZGluZywgdHlwZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWV0aG9kO1xyXG4gIH07XHJcblxyXG4gIHZhciBhbGdvcml0aG1zID0gW1xyXG4gICAge25hbWU6ICdrZWNjYWsnLCBwYWRkaW5nOiBLRUNDQUtfUEFERElORywgYml0czogQklUUywgY3JlYXRlTWV0aG9kOiBjcmVhdGVNZXRob2R9LFxyXG4gICAge25hbWU6ICdzaGEzJywgcGFkZGluZzogUEFERElORywgYml0czogQklUUywgY3JlYXRlTWV0aG9kOiBjcmVhdGVNZXRob2R9LFxyXG4gICAge25hbWU6ICdzaGFrZScsIHBhZGRpbmc6IFNIQUtFX1BBRERJTkcsIGJpdHM6IFNIQUtFX0JJVFMsIGNyZWF0ZU1ldGhvZDogY3JlYXRlU2hha2VNZXRob2R9XHJcbiAgXTtcclxuXHJcbiAgdmFyIG1ldGhvZHMgPSB7fSwgbWV0aG9kTmFtZXMgPSBbXTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGdvcml0aG1zLmxlbmd0aDsgKytpKSB7XHJcbiAgICB2YXIgYWxnb3JpdGhtID0gYWxnb3JpdGhtc1tpXTtcclxuICAgIHZhciBiaXRzICA9IGFsZ29yaXRobS5iaXRzO1xyXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBiaXRzLmxlbmd0aDsgKytqKSB7XHJcbiAgICAgIHZhciBtZXRob2ROYW1lID0gYWxnb3JpdGhtLm5hbWUgKydfJyArIGJpdHNbal07XHJcbiAgICAgIG1ldGhvZE5hbWVzLnB1c2gobWV0aG9kTmFtZSk7XHJcbiAgICAgIG1ldGhvZHNbbWV0aG9kTmFtZV0gPSBhbGdvcml0aG0uY3JlYXRlTWV0aG9kKGJpdHNbal0sIGFsZ29yaXRobS5wYWRkaW5nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIEtlY2NhayhiaXRzLCBwYWRkaW5nLCBvdXRwdXRCaXRzKSB7XHJcbiAgICB0aGlzLmJsb2NrcyA9IFtdO1xyXG4gICAgdGhpcy5zID0gW107XHJcbiAgICB0aGlzLnBhZGRpbmcgPSBwYWRkaW5nO1xyXG4gICAgdGhpcy5vdXRwdXRCaXRzID0gb3V0cHV0Qml0cztcclxuICAgIHRoaXMucmVzZXQgPSB0cnVlO1xyXG4gICAgdGhpcy5ibG9jayA9IDA7XHJcbiAgICB0aGlzLnN0YXJ0ID0gMDtcclxuICAgIHRoaXMuYmxvY2tDb3VudCA9ICgxNjAwIC0gKGJpdHMgPDwgMSkpID4+IDU7XHJcbiAgICB0aGlzLmJ5dGVDb3VudCA9IHRoaXMuYmxvY2tDb3VudCA8PCAyO1xyXG4gICAgdGhpcy5vdXRwdXRCbG9ja3MgPSBvdXRwdXRCaXRzID4+IDU7XHJcbiAgICB0aGlzLmV4dHJhQnl0ZXMgPSAob3V0cHV0Qml0cyAmIDMxKSA+PiAzO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNTA7ICsraSkge1xyXG4gICAgICB0aGlzLnNbaV0gPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgS2VjY2FrLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAobWVzc2FnZSkge1xyXG4gICAgdmFyIG5vdFN0cmluZyA9IHR5cGVvZiBtZXNzYWdlICE9PSAnc3RyaW5nJztcclxuICAgIGlmIChub3RTdHJpbmcgJiYgbWVzc2FnZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpIHtcclxuICAgICAgbWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gICAgdmFyIGxlbmd0aCA9IG1lc3NhZ2UubGVuZ3RoLCBibG9ja3MgPSB0aGlzLmJsb2NrcywgYnl0ZUNvdW50ID0gdGhpcy5ieXRlQ291bnQsXHJcbiAgICAgIGJsb2NrQ291bnQgPSB0aGlzLmJsb2NrQ291bnQsIGluZGV4ID0gMCwgcyA9IHRoaXMucywgaSwgY29kZTtcclxuXHJcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcclxuICAgICAgaWYgKHRoaXMucmVzZXQpIHtcclxuICAgICAgICB0aGlzLnJlc2V0ID0gZmFsc2U7XHJcbiAgICAgICAgYmxvY2tzWzBdID0gdGhpcy5ibG9jaztcclxuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYmxvY2tDb3VudCArIDE7ICsraSkge1xyXG4gICAgICAgICAgYmxvY2tzW2ldID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vdFN0cmluZykge1xyXG4gICAgICAgIGZvciAoaSA9IHRoaXMuc3RhcnQ7IGluZGV4IDwgbGVuZ3RoICYmIGkgPCBieXRlQ291bnQ7ICsraW5kZXgpIHtcclxuICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9IG1lc3NhZ2VbaW5kZXhdIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmb3IgKGkgPSB0aGlzLnN0YXJ0OyBpbmRleCA8IGxlbmd0aCAmJiBpIDwgYnl0ZUNvdW50OyArK2luZGV4KSB7XHJcbiAgICAgICAgICBjb2RlID0gbWVzc2FnZS5jaGFyQ29kZUF0KGluZGV4KTtcclxuICAgICAgICAgIGlmIChjb2RlIDwgMHg4MCkge1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSBjb2RlIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlIDwgMHg4MDApIHtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4YzAgfCAoY29kZSA+PiA2KSkgPDwgU0hJRlRbaSsrICYgM107XHJcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgKGNvZGUgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPCAweGQ4MDAgfHwgY29kZSA+PSAweGUwMDApIHtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ZTAgfCAoY29kZSA+PiAxMikpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+PiA2KSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ODAgfCAoY29kZSAmIDB4M2YpKSA8PCBTSElGVFtpKysgJiAzXTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvZGUgPSAweDEwMDAwICsgKCgoY29kZSAmIDB4M2ZmKSA8PCAxMCkgfCAobWVzc2FnZS5jaGFyQ29kZUF0KCsraW5kZXgpICYgMHgzZmYpKTtcclxuICAgICAgICAgICAgYmxvY2tzW2kgPj4gMl0gfD0gKDB4ZjAgfCAoY29kZSA+PiAxOCkpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8ICgoY29kZSA+PiAxMikgJiAweDNmKSkgPDwgU0hJRlRbaSsrICYgM107XHJcbiAgICAgICAgICAgIGJsb2Nrc1tpID4+IDJdIHw9ICgweDgwIHwgKChjb2RlID4+IDYpICYgMHgzZikpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgICBibG9ja3NbaSA+PiAyXSB8PSAoMHg4MCB8IChjb2RlICYgMHgzZikpIDw8IFNISUZUW2krKyAmIDNdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLmxhc3RCeXRlSW5kZXggPSBpO1xyXG4gICAgICBpZiAoaSA+PSBieXRlQ291bnQpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0ID0gaSAtIGJ5dGVDb3VudDtcclxuICAgICAgICB0aGlzLmJsb2NrID0gYmxvY2tzW2Jsb2NrQ291bnRdO1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50OyArK2kpIHtcclxuICAgICAgICAgIHNbaV0gXj0gYmxvY2tzW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmKHMpO1xyXG4gICAgICAgIHRoaXMucmVzZXQgPSB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3RhcnQgPSBpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG5cclxuICBLZWNjYWsucHJvdG90eXBlLmZpbmFsaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGJsb2NrcyA9IHRoaXMuYmxvY2tzLCBpID0gdGhpcy5sYXN0Qnl0ZUluZGV4LCBibG9ja0NvdW50ID0gdGhpcy5ibG9ja0NvdW50LCBzID0gdGhpcy5zO1xyXG4gICAgYmxvY2tzW2kgPj4gMl0gfD0gdGhpcy5wYWRkaW5nW2kgJiAzXTtcclxuICAgIGlmICh0aGlzLmxhc3RCeXRlSW5kZXggPT09IHRoaXMuYnl0ZUNvdW50KSB7XHJcbiAgICAgIGJsb2Nrc1swXSA9IGJsb2Nrc1tibG9ja0NvdW50XTtcclxuICAgICAgZm9yIChpID0gMTsgaSA8IGJsb2NrQ291bnQgKyAxOyArK2kpIHtcclxuICAgICAgICBibG9ja3NbaV0gPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBibG9ja3NbYmxvY2tDb3VudCAtIDFdIHw9IDB4ODAwMDAwMDA7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgKytpKSB7XHJcbiAgICAgIHNbaV0gXj0gYmxvY2tzW2ldO1xyXG4gICAgfVxyXG4gICAgZihzKTtcclxuICB9O1xyXG5cclxuICBLZWNjYWsucHJvdG90eXBlLnRvU3RyaW5nID0gS2VjY2FrLnByb3RvdHlwZS5oZXggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmZpbmFsaXplKCk7XHJcblxyXG4gICAgdmFyIGJsb2NrQ291bnQgPSB0aGlzLmJsb2NrQ291bnQsIHMgPSB0aGlzLnMsIG91dHB1dEJsb2NrcyA9IHRoaXMub3V0cHV0QmxvY2tzLFxyXG4gICAgICAgIGV4dHJhQnl0ZXMgPSB0aGlzLmV4dHJhQnl0ZXMsIGkgPSAwLCBqID0gMDtcclxuICAgIHZhciBoZXggPSAnJywgYmxvY2s7XHJcbiAgICB3aGlsZSAoaiA8IG91dHB1dEJsb2Nrcykge1xyXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudCAmJiBqIDwgb3V0cHV0QmxvY2tzOyArK2ksICsraikge1xyXG4gICAgICAgIGJsb2NrID0gc1tpXTtcclxuICAgICAgICBoZXggKz0gSEVYX0NIQVJTWyhibG9jayA+PiA0KSAmIDB4MEZdICsgSEVYX0NIQVJTW2Jsb2NrICYgMHgwRl0gK1xyXG4gICAgICAgICAgICAgICBIRVhfQ0hBUlNbKGJsb2NrID4+IDEyKSAmIDB4MEZdICsgSEVYX0NIQVJTWyhibG9jayA+PiA4KSAmIDB4MEZdICtcclxuICAgICAgICAgICAgICAgSEVYX0NIQVJTWyhibG9jayA+PiAyMCkgJiAweDBGXSArIEhFWF9DSEFSU1soYmxvY2sgPj4gMTYpICYgMHgwRl0gK1xyXG4gICAgICAgICAgICAgICBIRVhfQ0hBUlNbKGJsb2NrID4+IDI4KSAmIDB4MEZdICsgSEVYX0NIQVJTWyhibG9jayA+PiAyNCkgJiAweDBGXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaiAlIGJsb2NrQ291bnQgPT09IDApIHtcclxuICAgICAgICBmKHMpO1xyXG4gICAgICAgIGkgPSAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZXh0cmFCeXRlcykge1xyXG4gICAgICBibG9jayA9IHNbaV07XHJcbiAgICAgIGlmIChleHRyYUJ5dGVzID4gMCkge1xyXG4gICAgICAgIGhleCArPSBIRVhfQ0hBUlNbKGJsb2NrID4+IDQpICYgMHgwRl0gKyBIRVhfQ0hBUlNbYmxvY2sgJiAweDBGXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmFCeXRlcyA+IDEpIHtcclxuICAgICAgICBoZXggKz0gSEVYX0NIQVJTWyhibG9jayA+PiAxMikgJiAweDBGXSArIEhFWF9DSEFSU1soYmxvY2sgPj4gOCkgJiAweDBGXTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmFCeXRlcyA+IDIpIHtcclxuICAgICAgICBoZXggKz0gSEVYX0NIQVJTWyhibG9jayA+PiAyMCkgJiAweDBGXSArIEhFWF9DSEFSU1soYmxvY2sgPj4gMTYpICYgMHgwRl07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBoZXg7XHJcbiAgfTtcclxuXHJcbiAgS2VjY2FrLnByb3RvdHlwZS5hcnJheUJ1ZmZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMuZmluYWxpemUoKTtcclxuXHJcbiAgICB2YXIgYmxvY2tDb3VudCA9IHRoaXMuYmxvY2tDb3VudCwgcyA9IHRoaXMucywgb3V0cHV0QmxvY2tzID0gdGhpcy5vdXRwdXRCbG9ja3MsXHJcbiAgICAgICAgZXh0cmFCeXRlcyA9IHRoaXMuZXh0cmFCeXRlcywgaSA9IDAsIGogPSAwO1xyXG4gICAgdmFyIGJ5dGVzID0gdGhpcy5vdXRwdXRCaXRzID4+IDM7XHJcbiAgICB2YXIgYnVmZmVyO1xyXG4gICAgaWYgKGV4dHJhQnl0ZXMpIHtcclxuICAgICAgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKChvdXRwdXRCbG9ja3MgKyAxKSA8PCAyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcyk7XHJcbiAgICB9XHJcbiAgICB2YXIgYXJyYXkgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcclxuICAgIHdoaWxlIChqIDwgb3V0cHV0QmxvY2tzKSB7XHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50ICYmIGogPCBvdXRwdXRCbG9ja3M7ICsraSwgKytqKSB7XHJcbiAgICAgICAgYXJyYXlbal0gPSBzW2ldO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChqICUgYmxvY2tDb3VudCA9PT0gMCkge1xyXG4gICAgICAgIGYocyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChleHRyYUJ5dGVzKSB7XHJcbiAgICAgIGFycmF5W2ldID0gc1tpXTtcclxuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKDAsIGJ5dGVzKTtcclxuICAgIH1cclxuICAgIHJldHVybiBidWZmZXI7XHJcbiAgfTtcclxuXHJcbiAgS2VjY2FrLnByb3RvdHlwZS5idWZmZXIgPSBLZWNjYWsucHJvdG90eXBlLmFycmF5QnVmZmVyO1xyXG5cclxuICBLZWNjYWsucHJvdG90eXBlLmRpZ2VzdCA9IEtlY2Nhay5wcm90b3R5cGUuYXJyYXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmZpbmFsaXplKCk7XHJcblxyXG4gICAgdmFyIGJsb2NrQ291bnQgPSB0aGlzLmJsb2NrQ291bnQsIHMgPSB0aGlzLnMsIG91dHB1dEJsb2NrcyA9IHRoaXMub3V0cHV0QmxvY2tzLFxyXG4gICAgICAgIGV4dHJhQnl0ZXMgPSB0aGlzLmV4dHJhQnl0ZXMsIGkgPSAwLCBqID0gMDtcclxuICAgIHZhciBhcnJheSA9IFtdLCBvZmZzZXQsIGJsb2NrO1xyXG4gICAgd2hpbGUgKGogPCBvdXRwdXRCbG9ja3MpIHtcclxuICAgICAgZm9yIChpID0gMDsgaSA8IGJsb2NrQ291bnQgJiYgaiA8IG91dHB1dEJsb2NrczsgKytpLCArK2opIHtcclxuICAgICAgICBvZmZzZXQgPSBqIDw8IDI7XHJcbiAgICAgICAgYmxvY2sgPSBzW2ldO1xyXG4gICAgICAgIGFycmF5W29mZnNldF0gPSBibG9jayAmIDB4RkY7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMV0gPSAoYmxvY2sgPj4gOCkgJiAweEZGO1xyXG4gICAgICAgIGFycmF5W29mZnNldCArIDJdID0gKGJsb2NrID4+IDE2KSAmIDB4RkY7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgM10gPSAoYmxvY2sgPj4gMjQpICYgMHhGRjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaiAlIGJsb2NrQ291bnQgPT09IDApIHtcclxuICAgICAgICBmKHMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZXh0cmFCeXRlcykge1xyXG4gICAgICBvZmZzZXQgPSBqIDw8IDI7XHJcbiAgICAgIGJsb2NrID0gc1tpXTtcclxuICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAwKSB7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0XSA9IGJsb2NrICYgMHhGRjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0cmFCeXRlcyA+IDEpIHtcclxuICAgICAgICBhcnJheVtvZmZzZXQgKyAxXSA9IChibG9jayA+PiA4KSAmIDB4RkY7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAyKSB7XHJcbiAgICAgICAgYXJyYXlbb2Zmc2V0ICsgMl0gPSAoYmxvY2sgPj4gMTYpICYgMHhGRjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH07XHJcblxyXG4gIHZhciBmID0gZnVuY3Rpb24gKHMpIHtcclxuICAgIHZhciBoLCBsLCBuLCBjMCwgYzEsIGMyLCBjMywgYzQsIGM1LCBjNiwgYzcsIGM4LCBjOSxcclxuICAgICAgICBiMCwgYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4LCBiOSwgYjEwLCBiMTEsIGIxMiwgYjEzLCBiMTQsIGIxNSwgYjE2LCBiMTcsXHJcbiAgICAgICAgYjE4LCBiMTksIGIyMCwgYjIxLCBiMjIsIGIyMywgYjI0LCBiMjUsIGIyNiwgYjI3LCBiMjgsIGIyOSwgYjMwLCBiMzEsIGIzMiwgYjMzLFxyXG4gICAgICAgIGIzNCwgYjM1LCBiMzYsIGIzNywgYjM4LCBiMzksIGI0MCwgYjQxLCBiNDIsIGI0MywgYjQ0LCBiNDUsIGI0NiwgYjQ3LCBiNDgsIGI0OTtcclxuICAgIGZvciAobiA9IDA7IG4gPCA0ODsgbiArPSAyKSB7XHJcbiAgICAgIGMwID0gc1swXSBeIHNbMTBdIF4gc1syMF0gXiBzWzMwXSBeIHNbNDBdO1xyXG4gICAgICBjMSA9IHNbMV0gXiBzWzExXSBeIHNbMjFdIF4gc1szMV0gXiBzWzQxXTtcclxuICAgICAgYzIgPSBzWzJdIF4gc1sxMl0gXiBzWzIyXSBeIHNbMzJdIF4gc1s0Ml07XHJcbiAgICAgIGMzID0gc1szXSBeIHNbMTNdIF4gc1syM10gXiBzWzMzXSBeIHNbNDNdO1xyXG4gICAgICBjNCA9IHNbNF0gXiBzWzE0XSBeIHNbMjRdIF4gc1szNF0gXiBzWzQ0XTtcclxuICAgICAgYzUgPSBzWzVdIF4gc1sxNV0gXiBzWzI1XSBeIHNbMzVdIF4gc1s0NV07XHJcbiAgICAgIGM2ID0gc1s2XSBeIHNbMTZdIF4gc1syNl0gXiBzWzM2XSBeIHNbNDZdO1xyXG4gICAgICBjNyA9IHNbN10gXiBzWzE3XSBeIHNbMjddIF4gc1szN10gXiBzWzQ3XTtcclxuICAgICAgYzggPSBzWzhdIF4gc1sxOF0gXiBzWzI4XSBeIHNbMzhdIF4gc1s0OF07XHJcbiAgICAgIGM5ID0gc1s5XSBeIHNbMTldIF4gc1syOV0gXiBzWzM5XSBeIHNbNDldO1xyXG5cclxuICAgICAgaCA9IGM4IF4gKChjMiA8PCAxKSB8IChjMyA+Pj4gMzEpKTtcclxuICAgICAgbCA9IGM5IF4gKChjMyA8PCAxKSB8IChjMiA+Pj4gMzEpKTtcclxuICAgICAgc1swXSBePSBoO1xyXG4gICAgICBzWzFdIF49IGw7XHJcbiAgICAgIHNbMTBdIF49IGg7XHJcbiAgICAgIHNbMTFdIF49IGw7XHJcbiAgICAgIHNbMjBdIF49IGg7XHJcbiAgICAgIHNbMjFdIF49IGw7XHJcbiAgICAgIHNbMzBdIF49IGg7XHJcbiAgICAgIHNbMzFdIF49IGw7XHJcbiAgICAgIHNbNDBdIF49IGg7XHJcbiAgICAgIHNbNDFdIF49IGw7XHJcbiAgICAgIGggPSBjMCBeICgoYzQgPDwgMSkgfCAoYzUgPj4+IDMxKSk7XHJcbiAgICAgIGwgPSBjMSBeICgoYzUgPDwgMSkgfCAoYzQgPj4+IDMxKSk7XHJcbiAgICAgIHNbMl0gXj0gaDtcclxuICAgICAgc1szXSBePSBsO1xyXG4gICAgICBzWzEyXSBePSBoO1xyXG4gICAgICBzWzEzXSBePSBsO1xyXG4gICAgICBzWzIyXSBePSBoO1xyXG4gICAgICBzWzIzXSBePSBsO1xyXG4gICAgICBzWzMyXSBePSBoO1xyXG4gICAgICBzWzMzXSBePSBsO1xyXG4gICAgICBzWzQyXSBePSBoO1xyXG4gICAgICBzWzQzXSBePSBsO1xyXG4gICAgICBoID0gYzIgXiAoKGM2IDw8IDEpIHwgKGM3ID4+PiAzMSkpO1xyXG4gICAgICBsID0gYzMgXiAoKGM3IDw8IDEpIHwgKGM2ID4+PiAzMSkpO1xyXG4gICAgICBzWzRdIF49IGg7XHJcbiAgICAgIHNbNV0gXj0gbDtcclxuICAgICAgc1sxNF0gXj0gaDtcclxuICAgICAgc1sxNV0gXj0gbDtcclxuICAgICAgc1syNF0gXj0gaDtcclxuICAgICAgc1syNV0gXj0gbDtcclxuICAgICAgc1szNF0gXj0gaDtcclxuICAgICAgc1szNV0gXj0gbDtcclxuICAgICAgc1s0NF0gXj0gaDtcclxuICAgICAgc1s0NV0gXj0gbDtcclxuICAgICAgaCA9IGM0IF4gKChjOCA8PCAxKSB8IChjOSA+Pj4gMzEpKTtcclxuICAgICAgbCA9IGM1IF4gKChjOSA8PCAxKSB8IChjOCA+Pj4gMzEpKTtcclxuICAgICAgc1s2XSBePSBoO1xyXG4gICAgICBzWzddIF49IGw7XHJcbiAgICAgIHNbMTZdIF49IGg7XHJcbiAgICAgIHNbMTddIF49IGw7XHJcbiAgICAgIHNbMjZdIF49IGg7XHJcbiAgICAgIHNbMjddIF49IGw7XHJcbiAgICAgIHNbMzZdIF49IGg7XHJcbiAgICAgIHNbMzddIF49IGw7XHJcbiAgICAgIHNbNDZdIF49IGg7XHJcbiAgICAgIHNbNDddIF49IGw7XHJcbiAgICAgIGggPSBjNiBeICgoYzAgPDwgMSkgfCAoYzEgPj4+IDMxKSk7XHJcbiAgICAgIGwgPSBjNyBeICgoYzEgPDwgMSkgfCAoYzAgPj4+IDMxKSk7XHJcbiAgICAgIHNbOF0gXj0gaDtcclxuICAgICAgc1s5XSBePSBsO1xyXG4gICAgICBzWzE4XSBePSBoO1xyXG4gICAgICBzWzE5XSBePSBsO1xyXG4gICAgICBzWzI4XSBePSBoO1xyXG4gICAgICBzWzI5XSBePSBsO1xyXG4gICAgICBzWzM4XSBePSBoO1xyXG4gICAgICBzWzM5XSBePSBsO1xyXG4gICAgICBzWzQ4XSBePSBoO1xyXG4gICAgICBzWzQ5XSBePSBsO1xyXG5cclxuICAgICAgYjAgPSBzWzBdO1xyXG4gICAgICBiMSA9IHNbMV07XHJcbiAgICAgIGIzMiA9IChzWzExXSA8PCA0KSB8IChzWzEwXSA+Pj4gMjgpO1xyXG4gICAgICBiMzMgPSAoc1sxMF0gPDwgNCkgfCAoc1sxMV0gPj4+IDI4KTtcclxuICAgICAgYjE0ID0gKHNbMjBdIDw8IDMpIHwgKHNbMjFdID4+PiAyOSk7XHJcbiAgICAgIGIxNSA9IChzWzIxXSA8PCAzKSB8IChzWzIwXSA+Pj4gMjkpO1xyXG4gICAgICBiNDYgPSAoc1szMV0gPDwgOSkgfCAoc1szMF0gPj4+IDIzKTtcclxuICAgICAgYjQ3ID0gKHNbMzBdIDw8IDkpIHwgKHNbMzFdID4+PiAyMyk7XHJcbiAgICAgIGIyOCA9IChzWzQwXSA8PCAxOCkgfCAoc1s0MV0gPj4+IDE0KTtcclxuICAgICAgYjI5ID0gKHNbNDFdIDw8IDE4KSB8IChzWzQwXSA+Pj4gMTQpO1xyXG4gICAgICBiMjAgPSAoc1syXSA8PCAxKSB8IChzWzNdID4+PiAzMSk7XHJcbiAgICAgIGIyMSA9IChzWzNdIDw8IDEpIHwgKHNbMl0gPj4+IDMxKTtcclxuICAgICAgYjIgPSAoc1sxM10gPDwgMTIpIHwgKHNbMTJdID4+PiAyMCk7XHJcbiAgICAgIGIzID0gKHNbMTJdIDw8IDEyKSB8IChzWzEzXSA+Pj4gMjApO1xyXG4gICAgICBiMzQgPSAoc1syMl0gPDwgMTApIHwgKHNbMjNdID4+PiAyMik7XHJcbiAgICAgIGIzNSA9IChzWzIzXSA8PCAxMCkgfCAoc1syMl0gPj4+IDIyKTtcclxuICAgICAgYjE2ID0gKHNbMzNdIDw8IDEzKSB8IChzWzMyXSA+Pj4gMTkpO1xyXG4gICAgICBiMTcgPSAoc1szMl0gPDwgMTMpIHwgKHNbMzNdID4+PiAxOSk7XHJcbiAgICAgIGI0OCA9IChzWzQyXSA8PCAyKSB8IChzWzQzXSA+Pj4gMzApO1xyXG4gICAgICBiNDkgPSAoc1s0M10gPDwgMikgfCAoc1s0Ml0gPj4+IDMwKTtcclxuICAgICAgYjQwID0gKHNbNV0gPDwgMzApIHwgKHNbNF0gPj4+IDIpO1xyXG4gICAgICBiNDEgPSAoc1s0XSA8PCAzMCkgfCAoc1s1XSA+Pj4gMik7XHJcbiAgICAgIGIyMiA9IChzWzE0XSA8PCA2KSB8IChzWzE1XSA+Pj4gMjYpO1xyXG4gICAgICBiMjMgPSAoc1sxNV0gPDwgNikgfCAoc1sxNF0gPj4+IDI2KTtcclxuICAgICAgYjQgPSAoc1syNV0gPDwgMTEpIHwgKHNbMjRdID4+PiAyMSk7XHJcbiAgICAgIGI1ID0gKHNbMjRdIDw8IDExKSB8IChzWzI1XSA+Pj4gMjEpO1xyXG4gICAgICBiMzYgPSAoc1szNF0gPDwgMTUpIHwgKHNbMzVdID4+PiAxNyk7XHJcbiAgICAgIGIzNyA9IChzWzM1XSA8PCAxNSkgfCAoc1szNF0gPj4+IDE3KTtcclxuICAgICAgYjE4ID0gKHNbNDVdIDw8IDI5KSB8IChzWzQ0XSA+Pj4gMyk7XHJcbiAgICAgIGIxOSA9IChzWzQ0XSA8PCAyOSkgfCAoc1s0NV0gPj4+IDMpO1xyXG4gICAgICBiMTAgPSAoc1s2XSA8PCAyOCkgfCAoc1s3XSA+Pj4gNCk7XHJcbiAgICAgIGIxMSA9IChzWzddIDw8IDI4KSB8IChzWzZdID4+PiA0KTtcclxuICAgICAgYjQyID0gKHNbMTddIDw8IDIzKSB8IChzWzE2XSA+Pj4gOSk7XHJcbiAgICAgIGI0MyA9IChzWzE2XSA8PCAyMykgfCAoc1sxN10gPj4+IDkpO1xyXG4gICAgICBiMjQgPSAoc1syNl0gPDwgMjUpIHwgKHNbMjddID4+PiA3KTtcclxuICAgICAgYjI1ID0gKHNbMjddIDw8IDI1KSB8IChzWzI2XSA+Pj4gNyk7XHJcbiAgICAgIGI2ID0gKHNbMzZdIDw8IDIxKSB8IChzWzM3XSA+Pj4gMTEpO1xyXG4gICAgICBiNyA9IChzWzM3XSA8PCAyMSkgfCAoc1szNl0gPj4+IDExKTtcclxuICAgICAgYjM4ID0gKHNbNDddIDw8IDI0KSB8IChzWzQ2XSA+Pj4gOCk7XHJcbiAgICAgIGIzOSA9IChzWzQ2XSA8PCAyNCkgfCAoc1s0N10gPj4+IDgpO1xyXG4gICAgICBiMzAgPSAoc1s4XSA8PCAyNykgfCAoc1s5XSA+Pj4gNSk7XHJcbiAgICAgIGIzMSA9IChzWzldIDw8IDI3KSB8IChzWzhdID4+PiA1KTtcclxuICAgICAgYjEyID0gKHNbMThdIDw8IDIwKSB8IChzWzE5XSA+Pj4gMTIpO1xyXG4gICAgICBiMTMgPSAoc1sxOV0gPDwgMjApIHwgKHNbMThdID4+PiAxMik7XHJcbiAgICAgIGI0NCA9IChzWzI5XSA8PCA3KSB8IChzWzI4XSA+Pj4gMjUpO1xyXG4gICAgICBiNDUgPSAoc1syOF0gPDwgNykgfCAoc1syOV0gPj4+IDI1KTtcclxuICAgICAgYjI2ID0gKHNbMzhdIDw8IDgpIHwgKHNbMzldID4+PiAyNCk7XHJcbiAgICAgIGIyNyA9IChzWzM5XSA8PCA4KSB8IChzWzM4XSA+Pj4gMjQpO1xyXG4gICAgICBiOCA9IChzWzQ4XSA8PCAxNCkgfCAoc1s0OV0gPj4+IDE4KTtcclxuICAgICAgYjkgPSAoc1s0OV0gPDwgMTQpIHwgKHNbNDhdID4+PiAxOCk7XHJcblxyXG4gICAgICBzWzBdID0gYjAgXiAofmIyICYgYjQpO1xyXG4gICAgICBzWzFdID0gYjEgXiAofmIzICYgYjUpO1xyXG4gICAgICBzWzEwXSA9IGIxMCBeICh+YjEyICYgYjE0KTtcclxuICAgICAgc1sxMV0gPSBiMTEgXiAofmIxMyAmIGIxNSk7XHJcbiAgICAgIHNbMjBdID0gYjIwIF4gKH5iMjIgJiBiMjQpO1xyXG4gICAgICBzWzIxXSA9IGIyMSBeICh+YjIzICYgYjI1KTtcclxuICAgICAgc1szMF0gPSBiMzAgXiAofmIzMiAmIGIzNCk7XHJcbiAgICAgIHNbMzFdID0gYjMxIF4gKH5iMzMgJiBiMzUpO1xyXG4gICAgICBzWzQwXSA9IGI0MCBeICh+YjQyICYgYjQ0KTtcclxuICAgICAgc1s0MV0gPSBiNDEgXiAofmI0MyAmIGI0NSk7XHJcbiAgICAgIHNbMl0gPSBiMiBeICh+YjQgJiBiNik7XHJcbiAgICAgIHNbM10gPSBiMyBeICh+YjUgJiBiNyk7XHJcbiAgICAgIHNbMTJdID0gYjEyIF4gKH5iMTQgJiBiMTYpO1xyXG4gICAgICBzWzEzXSA9IGIxMyBeICh+YjE1ICYgYjE3KTtcclxuICAgICAgc1syMl0gPSBiMjIgXiAofmIyNCAmIGIyNik7XHJcbiAgICAgIHNbMjNdID0gYjIzIF4gKH5iMjUgJiBiMjcpO1xyXG4gICAgICBzWzMyXSA9IGIzMiBeICh+YjM0ICYgYjM2KTtcclxuICAgICAgc1szM10gPSBiMzMgXiAofmIzNSAmIGIzNyk7XHJcbiAgICAgIHNbNDJdID0gYjQyIF4gKH5iNDQgJiBiNDYpO1xyXG4gICAgICBzWzQzXSA9IGI0MyBeICh+YjQ1ICYgYjQ3KTtcclxuICAgICAgc1s0XSA9IGI0IF4gKH5iNiAmIGI4KTtcclxuICAgICAgc1s1XSA9IGI1IF4gKH5iNyAmIGI5KTtcclxuICAgICAgc1sxNF0gPSBiMTQgXiAofmIxNiAmIGIxOCk7XHJcbiAgICAgIHNbMTVdID0gYjE1IF4gKH5iMTcgJiBiMTkpO1xyXG4gICAgICBzWzI0XSA9IGIyNCBeICh+YjI2ICYgYjI4KTtcclxuICAgICAgc1syNV0gPSBiMjUgXiAofmIyNyAmIGIyOSk7XHJcbiAgICAgIHNbMzRdID0gYjM0IF4gKH5iMzYgJiBiMzgpO1xyXG4gICAgICBzWzM1XSA9IGIzNSBeICh+YjM3ICYgYjM5KTtcclxuICAgICAgc1s0NF0gPSBiNDQgXiAofmI0NiAmIGI0OCk7XHJcbiAgICAgIHNbNDVdID0gYjQ1IF4gKH5iNDcgJiBiNDkpO1xyXG4gICAgICBzWzZdID0gYjYgXiAofmI4ICYgYjApO1xyXG4gICAgICBzWzddID0gYjcgXiAofmI5ICYgYjEpO1xyXG4gICAgICBzWzE2XSA9IGIxNiBeICh+YjE4ICYgYjEwKTtcclxuICAgICAgc1sxN10gPSBiMTcgXiAofmIxOSAmIGIxMSk7XHJcbiAgICAgIHNbMjZdID0gYjI2IF4gKH5iMjggJiBiMjApO1xyXG4gICAgICBzWzI3XSA9IGIyNyBeICh+YjI5ICYgYjIxKTtcclxuICAgICAgc1szNl0gPSBiMzYgXiAofmIzOCAmIGIzMCk7XHJcbiAgICAgIHNbMzddID0gYjM3IF4gKH5iMzkgJiBiMzEpO1xyXG4gICAgICBzWzQ2XSA9IGI0NiBeICh+YjQ4ICYgYjQwKTtcclxuICAgICAgc1s0N10gPSBiNDcgXiAofmI0OSAmIGI0MSk7XHJcbiAgICAgIHNbOF0gPSBiOCBeICh+YjAgJiBiMik7XHJcbiAgICAgIHNbOV0gPSBiOSBeICh+YjEgJiBiMyk7XHJcbiAgICAgIHNbMThdID0gYjE4IF4gKH5iMTAgJiBiMTIpO1xyXG4gICAgICBzWzE5XSA9IGIxOSBeICh+YjExICYgYjEzKTtcclxuICAgICAgc1syOF0gPSBiMjggXiAofmIyMCAmIGIyMik7XHJcbiAgICAgIHNbMjldID0gYjI5IF4gKH5iMjEgJiBiMjMpO1xyXG4gICAgICBzWzM4XSA9IGIzOCBeICh+YjMwICYgYjMyKTtcclxuICAgICAgc1szOV0gPSBiMzkgXiAofmIzMSAmIGIzMyk7XHJcbiAgICAgIHNbNDhdID0gYjQ4IF4gKH5iNDAgJiBiNDIpO1xyXG4gICAgICBzWzQ5XSA9IGI0OSBeICh+YjQxICYgYjQzKTtcclxuXHJcbiAgICAgIHNbMF0gXj0gUkNbbl07XHJcbiAgICAgIHNbMV0gXj0gUkNbbiArIDFdO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGlmIChDT01NT05fSlMpIHtcclxuICAgIG1vZHVsZS5leHBvcnRzID0gbWV0aG9kcztcclxuICB9IGVsc2Uge1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRob2ROYW1lcy5sZW5ndGg7ICsraSkge1xyXG4gICAgICByb290W21ldGhvZE5hbWVzW2ldXSA9IG1ldGhvZHNbbWV0aG9kTmFtZXNbaV1dO1xyXG4gICAgfVxyXG4gIH1cclxufSkoKTtcclxuIiwiJ3VzZSBzdHJpY3QnXG5cbnZhciBpc09iamVjdCA9IGZ1bmN0aW9uIGlzT2JqZWN0KHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCkgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCdcbn1cblxudmFyIGNvZGVzID0ge1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEJ5IENvZGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAzOiAnQ2FuY2VsJyxcbiAgNjogJ0hlbHAnLFxuICA4OiAnQmFja3NwYWNlJyxcbiAgOTogJ1RhYicsXG4gIDEyOiAnQ2xlYXInLFxuICAxMzogJ0VudGVyJyxcbiAgMTY6ICdTaGlmdCcsXG4gIDE3OiAnQ29udHJvbCcsXG4gIDE4OiAnQWx0JyxcbiAgMTk6ICdQYXVzZScsXG4gIDIwOiAnQ2Fwc0xvY2snLFxuICAyNzogJ0VzY2FwZScsXG4gIDI4OiAnQ29udmVydCcsXG4gIDI5OiAnTm9uQ29udmVydCcsXG4gIDMwOiAnQWNjZXB0JyxcbiAgMzE6ICdNb2RlQ2hhbmdlJyxcbiAgMzI6ICcgJyxcbiAgMzM6ICdQYWdlVXAnLFxuICAzNDogJ1BhZ2VEb3duJyxcbiAgMzU6ICdFbmQnLFxuICAzNjogJ0hvbWUnLFxuICAzNzogJ0Fycm93TGVmdCcsXG4gIDM4OiAnQXJyb3dVcCcsXG4gIDM5OiAnQXJyb3dSaWdodCcsXG4gIDQwOiAnQXJyb3dEb3duJyxcbiAgNDE6ICdTZWxlY3QnLFxuICA0MjogJ1ByaW50JyxcbiAgNDM6ICdFeGVjdXRlJyxcbiAgNDQ6ICdQcmludFNjcmVlbicsXG4gIDQ1OiAnSW5zZXJ0JyxcbiAgNDY6ICdEZWxldGUnLFxuICA0ODogWycwJywgJyknXSxcbiAgNDk6IFsnMScsICchJ10sXG4gIDUwOiBbJzInLCAnQCddLFxuICA1MTogWyczJywgJyMnXSxcbiAgNTI6IFsnNCcsICckJ10sXG4gIDUzOiBbJzUnLCAnJSddLFxuICA1NDogWyc2JywgJ14nXSxcbiAgNTU6IFsnNycsICcmJ10sXG4gIDU2OiBbJzgnLCAnKiddLFxuICA1NzogWyc5JywgJygnXSxcbiAgOTE6ICdPUycsXG4gIDkzOiAnQ29udGV4dE1lbnUnLFxuICAxNDQ6ICdOdW1Mb2NrJyxcbiAgMTQ1OiAnU2Nyb2xsTG9jaycsXG4gIDE4MTogJ1ZvbHVtZU11dGUnLFxuICAxODI6ICdWb2x1bWVEb3duJyxcbiAgMTgzOiAnVm9sdW1lVXAnLFxuICAxODY6IFsnOycsICc6J10sXG4gIDE4NzogWyc9JywgJysnXSxcbiAgMTg4OiBbJywnLCAnPCddLFxuICAxODk6IFsnLScsICdfJ10sXG4gIDE5MDogWycuJywgJz4nXSxcbiAgMTkxOiBbJy8nLCAnPyddLFxuICAxOTI6IFsnYCcsICd+J10sXG4gIDIxOTogWydbJywgJ3snXSxcbiAgMjIwOiBbJ1xcXFwnLCAnfCddLFxuICAyMjE6IFsnXScsICd9J10sXG4gIDIyMjogW1wiJ1wiLCAnXCInXSxcbiAgMjI0OiAnTWV0YScsXG4gIDIyNTogJ0FsdEdyYXBoJyxcbiAgMjQ2OiAnQXR0bicsXG4gIDI0NzogJ0NyU2VsJyxcbiAgMjQ4OiAnRXhTZWwnLFxuICAyNDk6ICdFcmFzZUVvZicsXG4gIDI1MDogJ1BsYXknLFxuICAyNTE6ICdab29tT3V0Jyxcbn1cblxuLy8gRnVuY3Rpb24gS2V5cyAoRjEtMjQpXG5mb3IgKHZhciBpID0gMDsgaSA8IDI0OyBpICs9IDEpIHtcbiAgY29kZXNbMTEyICsgaV0gPSAnRicgKyAoaSArIDEpXG59XG5cbi8vIEFscGhhYmV0IChhLVopXG5mb3IgKHZhciBqID0gMDsgaiA8IDI2OyBqICs9IDEpIHtcbiAgdmFyIG4gPSBqICsgNjVcbiAgY29kZXNbbl0gPSBbU3RyaW5nLmZyb21DaGFyQ29kZShuICsgMzIpLCBTdHJpbmcuZnJvbUNoYXJDb2RlKG4pXVxufVxuXG52YXIga2V5Ym9hcmRLZXkgPSB7XG4gIGNvZGVzOiBjb2RlcyxcblxuICAvKipcbiAgICogR2V0IHRoZSBga2V5Q29kZWAgb3IgYHdoaWNoYCB2YWx1ZSBmcm9tIGEga2V5Ym9hcmQgZXZlbnQgb3IgYGtleWAgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSBldmVudE9yS2V5IEEga2V5Ym9hcmQgZXZlbnQtbGlrZSBvYmplY3Qgb3IgYGtleWAgbmFtZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudE9yS2V5LmtleV0gSWYgb2JqZWN0LCBpdCBtdXN0IGhhdmUgb25lIG9mIHRoZXNlIGtleXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZXZlbnRPcktleS5rZXlDb2RlXSBJZiBvYmplY3QsIGl0IG11c3QgaGF2ZSBvbmUgb2YgdGhlc2Uga2V5cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtldmVudE9yS2V5LndoaWNoXSBJZiBvYmplY3QsIGl0IG11c3QgaGF2ZSBvbmUgb2YgdGhlc2Uga2V5cy5cbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBnZXRDb2RlOiBmdW5jdGlvbiBnZXRDb2RlKGV2ZW50T3JLZXkpIHtcbiAgICBpZiAoaXNPYmplY3QoZXZlbnRPcktleSkpIHtcbiAgICAgIHJldHVybiBldmVudE9yS2V5LmtleUNvZGUgfHwgZXZlbnRPcktleS53aGljaCB8fCB0aGlzW2V2ZW50T3JLZXkua2V5XVxuICAgIH1cbiAgICByZXR1cm4gdGhpc1tldmVudE9yS2V5XVxuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGtleSBuYW1lIGZyb20gYSBrZXlib2FyZCBldmVudCwgYGtleUNvZGVgLCBvciBgd2hpY2hgIHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcnxvYmplY3R9IGV2ZW50T3JDb2RlIEEga2V5Ym9hcmQgZXZlbnQtbGlrZSBvYmplY3Qgb3Iga2V5IGNvZGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRPckNvZGUua2V5XSBJZiBvYmplY3Qgd2l0aCBhIGBrZXlgIG5hbWUsIGl0IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZXZlbnRPckNvZGUua2V5Q29kZV0gSWYgb2JqZWN0LCBpdCBtdXN0IGhhdmUgb25lIG9mIHRoZXNlIGtleXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZXZlbnRPckNvZGUud2hpY2hdIElmIG9iamVjdCwgaXQgbXVzdCBoYXZlIG9uZSBvZiB0aGVzZSBrZXlzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtldmVudE9yQ29kZS5zaGlmdEtleV0gSWYgb2JqZWN0LCBpdCBtdXN0IGhhdmUgb25lIG9mIHRoZXNlIGtleXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfVxuICAgKi9cbiAgZ2V0S2V5OiBmdW5jdGlvbiBnZXRLZXkoZXZlbnRPckNvZGUpIHtcbiAgICB2YXIgaXNFdmVudCA9IGlzT2JqZWN0KGV2ZW50T3JDb2RlKVxuXG4gICAgLy8gaGFuZGxlIGV2ZW50cyB3aXRoIGEgYGtleWAgYWxyZWFkeSBkZWZpbmVkXG4gICAgaWYgKGlzRXZlbnQgJiYgZXZlbnRPckNvZGUua2V5KSB7XG4gICAgICByZXR1cm4gZXZlbnRPckNvZGUua2V5XG4gICAgfVxuXG4gICAgdmFyIG5hbWUgPSBjb2Rlc1tpc0V2ZW50ID8gZXZlbnRPckNvZGUua2V5Q29kZSB8fCBldmVudE9yQ29kZS53aGljaCA6IGV2ZW50T3JDb2RlXVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZSkpIHtcbiAgICAgIGlmIChpc0V2ZW50KSB7XG4gICAgICAgIG5hbWUgPSBuYW1lW2V2ZW50T3JDb2RlLnNoaWZ0S2V5ID8gMSA6IDBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuYW1lID0gbmFtZVswXVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lXG4gIH0sXG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBCeSBOYW1lXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gZGVjbGFyZSB0aGVzZSBtYW51YWxseSBmb3Igc3RhdGljIGFuYWx5c2lzXG4gIENhbmNlbDogMyxcbiAgSGVscDogNixcbiAgQmFja3NwYWNlOiA4LFxuICBUYWI6IDksXG4gIENsZWFyOiAxMixcbiAgRW50ZXI6IDEzLFxuICBTaGlmdDogMTYsXG4gIENvbnRyb2w6IDE3LFxuICBBbHQ6IDE4LFxuICBQYXVzZTogMTksXG4gIENhcHNMb2NrOiAyMCxcbiAgRXNjYXBlOiAyNyxcbiAgQ29udmVydDogMjgsXG4gIE5vbkNvbnZlcnQ6IDI5LFxuICBBY2NlcHQ6IDMwLFxuICBNb2RlQ2hhbmdlOiAzMSxcbiAgJyAnOiAzMixcbiAgUGFnZVVwOiAzMyxcbiAgUGFnZURvd246IDM0LFxuICBFbmQ6IDM1LFxuICBIb21lOiAzNixcbiAgQXJyb3dMZWZ0OiAzNyxcbiAgQXJyb3dVcDogMzgsXG4gIEFycm93UmlnaHQ6IDM5LFxuICBBcnJvd0Rvd246IDQwLFxuICBTZWxlY3Q6IDQxLFxuICBQcmludDogNDIsXG4gIEV4ZWN1dGU6IDQzLFxuICBQcmludFNjcmVlbjogNDQsXG4gIEluc2VydDogNDUsXG4gIERlbGV0ZTogNDYsXG4gIDA6IDQ4LFxuICAnKSc6IDQ4LFxuICAxOiA0OSxcbiAgJyEnOiA0OSxcbiAgMjogNTAsXG4gICdAJzogNTAsXG4gIDM6IDUxLFxuICAnIyc6IDUxLFxuICA0OiA1MixcbiAgJDogNTIsXG4gIDU6IDUzLFxuICAnJSc6IDUzLFxuICA2OiA1NCxcbiAgJ14nOiA1NCxcbiAgNzogNTUsXG4gICcmJzogNTUsXG4gIDg6IDU2LFxuICAnKic6IDU2LFxuICA5OiA1NyxcbiAgJygnOiA1NyxcbiAgYTogNjUsXG4gIEE6IDY1LFxuICBiOiA2NixcbiAgQjogNjYsXG4gIGM6IDY3LFxuICBDOiA2NyxcbiAgZDogNjgsXG4gIEQ6IDY4LFxuICBlOiA2OSxcbiAgRTogNjksXG4gIGY6IDcwLFxuICBGOiA3MCxcbiAgZzogNzEsXG4gIEc6IDcxLFxuICBoOiA3MixcbiAgSDogNzIsXG4gIGk6IDczLFxuICBJOiA3MyxcbiAgajogNzQsXG4gIEo6IDc0LFxuICBrOiA3NSxcbiAgSzogNzUsXG4gIGw6IDc2LFxuICBMOiA3NixcbiAgbTogNzcsXG4gIE06IDc3LFxuICBuOiA3OCxcbiAgTjogNzgsXG4gIG86IDc5LFxuICBPOiA3OSxcbiAgcDogODAsXG4gIFA6IDgwLFxuICBxOiA4MSxcbiAgUTogODEsXG4gIHI6IDgyLFxuICBSOiA4MixcbiAgczogODMsXG4gIFM6IDgzLFxuICB0OiA4NCxcbiAgVDogODQsXG4gIHU6IDg1LFxuICBVOiA4NSxcbiAgdjogODYsXG4gIFY6IDg2LFxuICB3OiA4NyxcbiAgVzogODcsXG4gIHg6IDg4LFxuICBYOiA4OCxcbiAgeTogODksXG4gIFk6IDg5LFxuICB6OiA5MCxcbiAgWjogOTAsXG4gIE9TOiA5MSxcbiAgQ29udGV4dE1lbnU6IDkzLFxuICBGMTogMTEyLFxuICBGMjogMTEzLFxuICBGMzogMTE0LFxuICBGNDogMTE1LFxuICBGNTogMTE2LFxuICBGNjogMTE3LFxuICBGNzogMTE4LFxuICBGODogMTE5LFxuICBGOTogMTIwLFxuICBGMTA6IDEyMSxcbiAgRjExOiAxMjIsXG4gIEYxMjogMTIzLFxuICBGMTM6IDEyNCxcbiAgRjE0OiAxMjUsXG4gIEYxNTogMTI2LFxuICBGMTY6IDEyNyxcbiAgRjE3OiAxMjgsXG4gIEYxODogMTI5LFxuICBGMTk6IDEzMCxcbiAgRjIwOiAxMzEsXG4gIEYyMTogMTMyLFxuICBGMjI6IDEzMyxcbiAgRjIzOiAxMzQsXG4gIEYyNDogMTM1LFxuICBOdW1Mb2NrOiAxNDQsXG4gIFNjcm9sbExvY2s6IDE0NSxcbiAgVm9sdW1lTXV0ZTogMTgxLFxuICBWb2x1bWVEb3duOiAxODIsXG4gIFZvbHVtZVVwOiAxODMsXG4gICc7JzogMTg2LFxuICAnOic6IDE4NixcbiAgJz0nOiAxODcsXG4gICcrJzogMTg3LFxuICAnLCc6IDE4OCxcbiAgJzwnOiAxODgsXG4gICctJzogMTg5LFxuICBfOiAxODksXG4gICcuJzogMTkwLFxuICAnPic6IDE5MCxcbiAgJy8nOiAxOTEsXG4gICc/JzogMTkxLFxuICAnYCc6IDE5MixcbiAgJ34nOiAxOTIsXG4gICdbJzogMjE5LFxuICAneyc6IDIxOSxcbiAgJ1xcXFwnOiAyMjAsXG4gICd8JzogMjIwLFxuICAnXSc6IDIyMSxcbiAgJ30nOiAyMjEsXG4gIFwiJ1wiOiAyMjIsXG4gICdcIic6IDIyMixcbiAgTWV0YTogMjI0LFxuICBBbHRHcmFwaDogMjI1LFxuICBBdHRuOiAyNDYsXG4gIENyU2VsOiAyNDcsXG4gIEV4U2VsOiAyNDgsXG4gIEVyYXNlRW9mOiAyNDksXG4gIFBsYXk6IDI1MCxcbiAgWm9vbU91dDogMjUxLFxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCeSBBbGlhc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gcHJvdmlkZSBkb3Qtbm90YXRpb24gYWNjZXNzaWJsZSBrZXlzIGZvciBhbGwga2V5IG5hbWVzXG5rZXlib2FyZEtleS5TcGFjZWJhciA9IGtleWJvYXJkS2V5WycgJ11cbmtleWJvYXJkS2V5LkRpZ2l0MCA9IGtleWJvYXJkS2V5WycwJ11cbmtleWJvYXJkS2V5LkRpZ2l0MSA9IGtleWJvYXJkS2V5WycxJ11cbmtleWJvYXJkS2V5LkRpZ2l0MiA9IGtleWJvYXJkS2V5WycyJ11cbmtleWJvYXJkS2V5LkRpZ2l0MyA9IGtleWJvYXJkS2V5WyczJ11cbmtleWJvYXJkS2V5LkRpZ2l0NCA9IGtleWJvYXJkS2V5Wyc0J11cbmtleWJvYXJkS2V5LkRpZ2l0NSA9IGtleWJvYXJkS2V5Wyc1J11cbmtleWJvYXJkS2V5LkRpZ2l0NiA9IGtleWJvYXJkS2V5Wyc2J11cbmtleWJvYXJkS2V5LkRpZ2l0NyA9IGtleWJvYXJkS2V5Wyc3J11cbmtleWJvYXJkS2V5LkRpZ2l0OCA9IGtleWJvYXJkS2V5Wyc4J11cbmtleWJvYXJkS2V5LkRpZ2l0OSA9IGtleWJvYXJkS2V5Wyc5J11cbmtleWJvYXJkS2V5LlRpbGRlID0ga2V5Ym9hcmRLZXlbJ34nXVxua2V5Ym9hcmRLZXkuR3JhdmVBY2NlbnQgPSBrZXlib2FyZEtleVsnYCddXG5rZXlib2FyZEtleS5FeGNsYW1hdGlvblBvaW50ID0ga2V5Ym9hcmRLZXlbJyEnXVxua2V5Ym9hcmRLZXkuQXRTaWduID0ga2V5Ym9hcmRLZXlbJ0AnXVxua2V5Ym9hcmRLZXkuUG91bmRTaWduID0ga2V5Ym9hcmRLZXlbJyMnXVxua2V5Ym9hcmRLZXkuUGVyY2VudFNpZ24gPSBrZXlib2FyZEtleVsnJSddXG5rZXlib2FyZEtleS5DYXJldCA9IGtleWJvYXJkS2V5WydeJ11cbmtleWJvYXJkS2V5LkFtcGVyc2FuZCA9IGtleWJvYXJkS2V5WycmJ11cbmtleWJvYXJkS2V5LlBsdXNTaWduID0ga2V5Ym9hcmRLZXlbJysnXVxua2V5Ym9hcmRLZXkuTWludXNTaWduID0ga2V5Ym9hcmRLZXlbJy0nXVxua2V5Ym9hcmRLZXkuRXF1YWxzU2lnbiA9IGtleWJvYXJkS2V5Wyc9J11cbmtleWJvYXJkS2V5LkRpdmlzaW9uU2lnbiA9IGtleWJvYXJkS2V5WycvJ11cbmtleWJvYXJkS2V5Lk11bHRpcGxpY2F0aW9uU2lnbiA9IGtleWJvYXJkS2V5WycqJ11cbmtleWJvYXJkS2V5LkNvbW1hID0ga2V5Ym9hcmRLZXlbJywnXVxua2V5Ym9hcmRLZXkuRGVjaW1hbCA9IGtleWJvYXJkS2V5WycuJ11cbmtleWJvYXJkS2V5LkNvbG9uID0ga2V5Ym9hcmRLZXlbJzonXVxua2V5Ym9hcmRLZXkuU2VtaWNvbG9uID0ga2V5Ym9hcmRLZXlbJzsnXVxua2V5Ym9hcmRLZXkuUGlwZSA9IGtleWJvYXJkS2V5Wyd8J11cbmtleWJvYXJkS2V5LkJhY2tTbGFzaCA9IGtleWJvYXJkS2V5WydcXFxcJ11cbmtleWJvYXJkS2V5LlF1ZXN0aW9uTWFyayA9IGtleWJvYXJkS2V5Wyc/J11cbmtleWJvYXJkS2V5LlNpbmdsZVF1b3RlID0ga2V5Ym9hcmRLZXlbXCInXCJdXG5rZXlib2FyZEtleS5Eb3VibGVRdW90ZSA9IGtleWJvYXJkS2V5WydcIiddXG5rZXlib2FyZEtleS5MZWZ0Q3VybHlCcmFjZSA9IGtleWJvYXJkS2V5Wyd7J11cbmtleWJvYXJkS2V5LlJpZ2h0Q3VybHlCcmFjZSA9IGtleWJvYXJkS2V5Wyd9J11cbmtleWJvYXJkS2V5LkxlZnRQYXJlbnRoZXNpcyA9IGtleWJvYXJkS2V5WycoJ11cbmtleWJvYXJkS2V5LlJpZ2h0UGFyZW50aGVzaXMgPSBrZXlib2FyZEtleVsnKSddXG5rZXlib2FyZEtleS5MZWZ0QW5nbGVCcmFja2V0ID0ga2V5Ym9hcmRLZXlbJzwnXVxua2V5Ym9hcmRLZXkuUmlnaHRBbmdsZUJyYWNrZXQgPSBrZXlib2FyZEtleVsnPiddXG5rZXlib2FyZEtleS5MZWZ0U3F1YXJlQnJhY2tldCA9IGtleWJvYXJkS2V5WydbJ11cbmtleWJvYXJkS2V5LlJpZ2h0U3F1YXJlQnJhY2tldCA9IGtleWJvYXJkS2V5WyddJ11cblxubW9kdWxlLmV4cG9ydHMgPSBrZXlib2FyZEtleVxuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKTtcblxuZXhwb3J0IGRlZmF1bHQgRGF0YVZpZXc7XG4iLCJpbXBvcnQgaGFzaENsZWFyIGZyb20gJy4vX2hhc2hDbGVhci5qcyc7XG5pbXBvcnQgaGFzaERlbGV0ZSBmcm9tICcuL19oYXNoRGVsZXRlLmpzJztcbmltcG9ydCBoYXNoR2V0IGZyb20gJy4vX2hhc2hHZXQuanMnO1xuaW1wb3J0IGhhc2hIYXMgZnJvbSAnLi9faGFzaEhhcy5qcyc7XG5pbXBvcnQgaGFzaFNldCBmcm9tICcuL19oYXNoU2V0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIEhhc2goZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG5IYXNoLnByb3RvdHlwZS5jbGVhciA9IGhhc2hDbGVhcjtcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XG5IYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuSGFzaC5wcm90b3R5cGUuaGFzID0gaGFzaEhhcztcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XG5cbmV4cG9ydCBkZWZhdWx0IEhhc2g7XG4iLCJpbXBvcnQgYmFzZUNyZWF0ZSBmcm9tICcuL19iYXNlQ3JlYXRlLmpzJztcbmltcG9ydCBiYXNlTG9kYXNoIGZyb20gJy4vX2Jhc2VMb2Rhc2guanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB0aGUgbWF4aW11bSBsZW5ndGggYW5kIGluZGV4IG9mIGFuIGFycmF5LiAqL1xudmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXp5IHdyYXBwZXIgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGxhenkgZXZhbHVhdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICovXG5mdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSkge1xuICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gIHRoaXMuX19hY3Rpb25zX18gPSBbXTtcbiAgdGhpcy5fX2Rpcl9fID0gMTtcbiAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgdGhpcy5fX2l0ZXJhdGVlc19fID0gW107XG4gIHRoaXMuX190YWtlQ291bnRfXyA9IE1BWF9BUlJBWV9MRU5HVEg7XG4gIHRoaXMuX192aWV3c19fID0gW107XG59XG5cbi8vIEVuc3VyZSBgTGF6eVdyYXBwZXJgIGlzIGFuIGluc3RhbmNlIG9mIGBiYXNlTG9kYXNoYC5cbkxhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7XG5cbmV4cG9ydCBkZWZhdWx0IExhenlXcmFwcGVyO1xuIiwiaW1wb3J0IGxpc3RDYWNoZUNsZWFyIGZyb20gJy4vX2xpc3RDYWNoZUNsZWFyLmpzJztcbmltcG9ydCBsaXN0Q2FjaGVEZWxldGUgZnJvbSAnLi9fbGlzdENhY2hlRGVsZXRlLmpzJztcbmltcG9ydCBsaXN0Q2FjaGVHZXQgZnJvbSAnLi9fbGlzdENhY2hlR2V0LmpzJztcbmltcG9ydCBsaXN0Q2FjaGVIYXMgZnJvbSAnLi9fbGlzdENhY2hlSGFzLmpzJztcbmltcG9ydCBsaXN0Q2FjaGVTZXQgZnJvbSAnLi9fbGlzdENhY2hlU2V0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGxpc3QgY2FjaGUgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICB0aGlzLmNsZWFyKCk7XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgTGlzdENhY2hlYC5cbkxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbkxpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbGlzdENhY2hlRGVsZXRlO1xuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XG5MaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbkxpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gbGlzdENhY2hlU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBMaXN0Q2FjaGU7XG4iLCJpbXBvcnQgYmFzZUNyZWF0ZSBmcm9tICcuL19iYXNlQ3JlYXRlLmpzJztcbmltcG9ydCBiYXNlTG9kYXNoIGZyb20gJy4vX2Jhc2VMb2Rhc2guanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFwcGVyIG9iamVjdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGFpbkFsbF0gRW5hYmxlIGV4cGxpY2l0IG1ldGhvZCBjaGFpbiBzZXF1ZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsKSB7XG4gIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICB0aGlzLl9fY2hhaW5fXyA9ICEhY2hhaW5BbGw7XG4gIHRoaXMuX19pbmRleF9fID0gMDtcbiAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xufVxuXG5Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG5leHBvcnQgZGVmYXVsdCBMb2Rhc2hXcmFwcGVyO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpO1xuXG5leHBvcnQgZGVmYXVsdCBNYXA7XG4iLCJpbXBvcnQgbWFwQ2FjaGVDbGVhciBmcm9tICcuL19tYXBDYWNoZUNsZWFyLmpzJztcbmltcG9ydCBtYXBDYWNoZURlbGV0ZSBmcm9tICcuL19tYXBDYWNoZURlbGV0ZS5qcyc7XG5pbXBvcnQgbWFwQ2FjaGVHZXQgZnJvbSAnLi9fbWFwQ2FjaGVHZXQuanMnO1xuaW1wb3J0IG1hcENhY2hlSGFzIGZyb20gJy4vX21hcENhY2hlSGFzLmpzJztcbmltcG9ydCBtYXBDYWNoZVNldCBmcm9tICcuL19tYXBDYWNoZVNldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICovXG5mdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gIHRoaXMuY2xlYXIoKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xuTWFwQ2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IG1hcENhY2hlRGVsZXRlO1xuTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xuTWFwQ2FjaGUucHJvdG90eXBlLnNldCA9IG1hcENhY2hlU2V0O1xuXG5leHBvcnQgZGVmYXVsdCBNYXBDYWNoZTtcbiIsImltcG9ydCBnZXROYXRpdmUgZnJvbSAnLi9fZ2V0TmF0aXZlLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgUHJvbWlzZSA9IGdldE5hdGl2ZShyb290LCAnUHJvbWlzZScpO1xuXG5leHBvcnQgZGVmYXVsdCBQcm9taXNlO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpO1xuXG5leHBvcnQgZGVmYXVsdCBTZXQ7XG4iLCJpbXBvcnQgTWFwQ2FjaGUgZnJvbSAnLi9fTWFwQ2FjaGUuanMnO1xuaW1wb3J0IHNldENhY2hlQWRkIGZyb20gJy4vX3NldENhY2hlQWRkLmpzJztcbmltcG9ydCBzZXRDYWNoZUhhcyBmcm9tICcuL19zZXRDYWNoZUhhcy5qcyc7XG5cbi8qKlxuICpcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjYWNoZS5cbiAqL1xuZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLmxlbmd0aDtcblxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xuICB9XG59XG5cbi8vIEFkZCBtZXRob2RzIHRvIGBTZXRDYWNoZWAuXG5TZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcblNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhcztcblxuZXhwb3J0IGRlZmF1bHQgU2V0Q2FjaGU7XG4iLCJpbXBvcnQgTGlzdENhY2hlIGZyb20gJy4vX0xpc3RDYWNoZS5qcyc7XG5pbXBvcnQgc3RhY2tDbGVhciBmcm9tICcuL19zdGFja0NsZWFyLmpzJztcbmltcG9ydCBzdGFja0RlbGV0ZSBmcm9tICcuL19zdGFja0RlbGV0ZS5qcyc7XG5pbXBvcnQgc3RhY2tHZXQgZnJvbSAnLi9fc3RhY2tHZXQuanMnO1xuaW1wb3J0IHN0YWNrSGFzIGZyb20gJy4vX3N0YWNrSGFzLmpzJztcbmltcG9ydCBzdGFja1NldCBmcm9tICcuL19zdGFja1NldC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0YWNrIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gKi9cbmZ1bmN0aW9uIFN0YWNrKGVudHJpZXMpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xufVxuXG4vLyBBZGQgbWV0aG9kcyB0byBgU3RhY2tgLlxuU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcblN0YWNrLnByb3RvdHlwZS5nZXQgPSBzdGFja0dldDtcblN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcblxuZXhwb3J0IGRlZmF1bHQgU3RhY2s7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbmV4cG9ydCBkZWZhdWx0IFN5bWJvbDtcbiIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBVaW50OEFycmF5ID0gcm9vdC5VaW50OEFycmF5O1xuXG5leHBvcnQgZGVmYXVsdCBVaW50OEFycmF5O1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHRoYXQgYXJlIHZlcmlmaWVkIHRvIGJlIG5hdGl2ZS4gKi9cbnZhciBXZWFrTWFwID0gZ2V0TmF0aXZlKHJvb3QsICdXZWFrTWFwJyk7XG5cbmV4cG9ydCBkZWZhdWx0IFdlYWtNYXA7XG4iLCIvKipcbiAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2BcbiAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLlxuICovXG5mdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwcGx5O1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBgYWNjdW11bGF0b3JgIHZhbHVlcy5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgYWNjdW11bGF0b3JgLlxuICovXG5mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUFnZ3JlZ2F0b3I7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5RWFjaDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmICghcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlFdmVyeTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZpbHRlcmAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlGaWx0ZXI7XG4iLCJpbXBvcnQgYmFzZUluZGV4T2YgZnJvbSAnLi9fYmFzZUluZGV4T2YuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmNsdWRlc2AgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBzcGVjaWZ5aW5nIGFuIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUluY2x1ZGVzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlJbmNsdWRlc1dpdGg7XG4iLCJpbXBvcnQgYmFzZVRpbWVzIGZyb20gJy4vX2Jhc2VUaW1lcy5qcyc7XG5pbXBvcnQgaXNBcmd1bWVudHMgZnJvbSAnLi9pc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5pbXBvcnQgaXNUeXBlZEFycmF5IGZyb20gJy4vaXNUeXBlZEFycmF5LmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7XG4gIHZhciBpc0FyciA9IGlzQXJyYXkodmFsdWUpLFxuICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgaXNCdWZmID0gIWlzQXJyICYmICFpc0FyZyAmJiBpc0J1ZmZlcih2YWx1ZSksXG4gICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHZhbHVlKSxcbiAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgIHJlc3VsdCA9IHNraXBJbmRleGVzID8gYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJlxuICAgICAgICAhKHNraXBJbmRleGVzICYmIChcbiAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHxcbiAgICAgICAgICAgLy8gTm9kZS5qcyAwLjEwIGhhcyBlbnVtZXJhYmxlIG5vbi1pbmRleCBwcm9wZXJ0aWVzIG9uIGJ1ZmZlcnMuXG4gICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuXG4gICAgICAgICAgIChpc1R5cGUgJiYgKGtleSA9PSAnYnVmZmVyJyB8fCBrZXkgPT0gJ2J5dGVMZW5ndGgnIHx8IGtleSA9PSAnYnl0ZU9mZnNldCcpKSB8fFxuICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpXG4gICAgICAgICkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheUxpa2VLZXlzO1xuIiwiLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWFwYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlNYXA7XG4iLCIvKipcbiAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFycmF5UHVzaDtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXJyYXlSZWR1Y2U7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zb21lYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWVcbiAqIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFueSBlbGVtZW50IHBhc3NlcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlTb21lKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhcnJheVNvbWU7XG4iLCJpbXBvcnQgYmFzZVByb3BlcnR5IGZyb20gJy4vX2Jhc2VQcm9wZXJ0eS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBvZiBhbiBBU0NJSSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xudmFyIGFzY2lpU2l6ZSA9IGJhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGFzY2lpU2l6ZTtcbiIsIi8qKlxuICogQ29udmVydHMgYW4gQVNDSUkgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFzY2lpVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGFzY2lpVG9BcnJheTtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xudmFyIHJlQXNjaWlXb3JkID0gL1teXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4N2ZdKy9nO1xuXG4vKipcbiAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBhc2NpaVdvcmRzO1xuIiwiaW1wb3J0IGJhc2VBc3NpZ25WYWx1ZSBmcm9tICcuL19iYXNlQXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEFzc2lnbnMgYHZhbHVlYCB0byBga2V5YCBvZiBgb2JqZWN0YCBpZiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgbm90IGVxdWl2YWxlbnRcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAqL1xuZnVuY3Rpb24gYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICBpZiAoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBlcShvYmpWYWx1ZSwgdmFsdWUpKSB8fFxuICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3NpZ25WYWx1ZTtcbiIsImltcG9ydCBlcSBmcm9tICcuL2VxLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAqL1xuZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgaWYgKGVxKGFycmF5W2xlbmd0aF1bMF0sIGtleSkpIHtcbiAgICAgIHJldHVybiBsZW5ndGg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXNzb2NJbmRleE9mO1xuIiwiaW1wb3J0IGJhc2VFYWNoIGZyb20gJy4vX2Jhc2VFYWNoLmpzJztcblxuLyoqXG4gKiBBZ2dyZWdhdGVzIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCBvbiBgYWNjdW11bGF0b3JgIHdpdGgga2V5cyB0cmFuc2Zvcm1lZFxuICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHNldHRlcihhY2N1bXVsYXRvciwgdmFsdWUsIGl0ZXJhdGVlKHZhbHVlKSwgY29sbGVjdGlvbik7XG4gIH0pO1xuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VBZ2dyZWdhdG9yO1xuIiwiaW1wb3J0IGRlZmluZVByb3BlcnR5IGZyb20gJy4vX2RlZmluZVByb3BlcnR5LmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICogdmFsdWUgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gKi9cbmZ1bmN0aW9uIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgIGRlZmluZVByb3BlcnR5KG9iamVjdCwga2V5LCB7XG4gICAgICAnY29uZmlndXJhYmxlJzogdHJ1ZSxcbiAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICd2YWx1ZSc6IHZhbHVlLFxuICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUFzc2lnblZhbHVlO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbGFtcGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuXG4gKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyXSBUaGUgbG93ZXIgYm91bmQuXG4gKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICBpZiAobnVtYmVyID09PSBudW1iZXIpIHtcbiAgICBpZiAodXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgfVxuICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUNsYW1wO1xuIiwiaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmdcbiAqIHByb3BlcnRpZXMgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvdG8gVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICovXG52YXIgYmFzZUNyZWF0ZSA9IChmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7XG4gICAgaWYgKCFpc09iamVjdChwcm90bykpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgaWYgKG9iamVjdENyZWF0ZSkge1xuICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgfVxuICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bztcbiAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlQ3JlYXRlO1xuIiwiaW1wb3J0IFNldENhY2hlIGZyb20gJy4vX1NldENhY2hlLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzIGZyb20gJy4vX2FycmF5SW5jbHVkZXMuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXNXaXRoIGZyb20gJy4vX2FycmF5SW5jbHVkZXNXaXRoLmpzJztcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5kaWZmZXJlbmNlYCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsXG4gICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSBbXSxcbiAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChpdGVyYXRlZSkge1xuICAgIHZhbHVlcyA9IGFycmF5TWFwKHZhbHVlcywgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gIH1cbiAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXNXaXRoO1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gIH1cbiAgZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgIHZhbHVlcyA9IG5ldyBTZXRDYWNoZSh2YWx1ZXMpO1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7XG5cbiAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDtcbiAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICB2YXIgdmFsdWVzSW5kZXggPSB2YWx1ZXNMZW5ndGg7XG4gICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkge1xuICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZURpZmZlcmVuY2U7XG4iLCJpbXBvcnQgYmFzZUZvck93biBmcm9tICcuL19iYXNlRm9yT3duLmpzJztcbmltcG9ydCBjcmVhdGVCYXNlRWFjaCBmcm9tICcuL19jcmVhdGVCYXNlRWFjaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuXG4gKi9cbnZhciBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xuXG5leHBvcnQgZGVmYXVsdCBiYXNlRWFjaDtcbiIsImltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAqICBlbHNlIGBmYWxzZWBcbiAqL1xuZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgcmVzdWx0ID0gISFwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUV2ZXJ5O1xuIiwiaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYVxuICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZClcbiAgICAgICAgKSkge1xuICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUV4dHJlbXVtO1xuIiwiaW1wb3J0IGJhc2VFYWNoIGZyb20gJy4vX2Jhc2VFYWNoLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRmlsdGVyO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maW5kSW5kZXhgIGFuZCBgXy5maW5kTGFzdEluZGV4YCB3aXRob3V0XG4gKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGluZGV4ID0gZnJvbUluZGV4ICsgKGZyb21SaWdodCA/IDEgOiAtMSk7XG5cbiAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGaW5kSW5kZXg7XG4iLCJpbXBvcnQgYXJyYXlQdXNoIGZyb20gJy4vX2FycmF5UHVzaC5qcyc7XG5pbXBvcnQgaXNGbGF0dGVuYWJsZSBmcm9tICcuL19pc0ZsYXR0ZW5hYmxlLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mbGF0dGVuYCB3aXRoIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW5nIGZsYXR0ZW5pbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbaXNTdHJpY3RdIFJlc3RyaWN0IHRvIHZhbHVlcyB0aGF0IHBhc3MgYHByZWRpY2F0ZWAgY2hlY2tzLlxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IGlzRmxhdHRlbmFibGUpO1xuICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgIGlmIChkZXB0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkge1xuICAgICAgcmVzdWx0W3Jlc3VsdC5sZW5ndGhdID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VGbGF0dGVuO1xuIiwiaW1wb3J0IGNyZWF0ZUJhc2VGb3IgZnJvbSAnLi9fY3JlYXRlQmFzZUZvci5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGBcbiAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG52YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuZXhwb3J0IGRlZmF1bHQgYmFzZUZvcjtcbiIsImltcG9ydCBiYXNlRm9yIGZyb20gJy4vX2Jhc2VGb3IuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlRm9yT3duO1xuIiwiaW1wb3J0IGNhc3RQYXRoIGZyb20gJy4vX2Nhc3RQYXRoLmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgcGF0aCkge1xuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAwLFxuICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cbiAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0W3RvS2V5KHBhdGhbaW5kZXgrK10pXTtcbiAgfVxuICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXQ7XG4iLCJpbXBvcnQgYXJyYXlQdXNoIGZyb20gJy4vX2FycmF5UHVzaC5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlc1xuICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpO1xuICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXRBbGxLZXlzO1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuaW1wb3J0IGdldFJhd1RhZyBmcm9tICcuL19nZXRSYXdUYWcuanMnO1xuaW1wb3J0IG9iamVjdFRvU3RyaW5nIGZyb20gJy4vX29iamVjdFRvU3RyaW5nLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VHZXRUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUhhcyhvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VIYXM7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSGFzSW4ob2JqZWN0LCBrZXkpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUhhc0luO1xuIiwiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmluUmFuZ2VgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgcmV0dXJuIG51bWJlciA+PSBuYXRpdmVNaW4oc3RhcnQsIGVuZCkgJiYgbnVtYmVyIDwgbmF0aXZlTWF4KHN0YXJ0LCBlbmQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW5SYW5nZTtcbiIsImltcG9ydCBiYXNlRmluZEluZGV4IGZyb20gJy4vX2Jhc2VGaW5kSW5kZXguanMnO1xuaW1wb3J0IGJhc2VJc05hTiBmcm9tICcuL19iYXNlSXNOYU4uanMnO1xuaW1wb3J0IHN0cmljdEluZGV4T2YgZnJvbSAnLi9fc3RyaWN0SW5kZXhPZi5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWVcbiAgICA/IHN0cmljdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpXG4gICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJbmRleE9mO1xuIiwiaW1wb3J0IFNldENhY2hlIGZyb20gJy4vX1NldENhY2hlLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzIGZyb20gJy4vX2FycmF5SW5jbHVkZXMuanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXNXaXRoIGZyb20gJy4vX2FycmF5SW5jbHVkZXNXaXRoLmpzJztcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmludGVyc2VjdGlvbmAsIHdpdGhvdXQgc3VwcG9ydFxuICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbnRlcnNlY3Rpb24oYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgbGVuZ3RoID0gYXJyYXlzWzBdLmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgIGNhY2hlcyA9IEFycmF5KG90aExlbmd0aCksXG4gICAgICBtYXhMZW5ndGggPSBJbmZpbml0eSxcbiAgICAgIHJlc3VsdCA9IFtdO1xuXG4gIHdoaWxlIChvdGhJbmRleC0tKSB7XG4gICAgdmFyIGFycmF5ID0gYXJyYXlzW290aEluZGV4XTtcbiAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgIGFycmF5ID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpO1xuICAgIH1cbiAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgIGNhY2hlc1tvdGhJbmRleF0gPSAhY29tcGFyYXRvciAmJiAoaXRlcmF0ZWUgfHwgKGxlbmd0aCA+PSAxMjAgJiYgYXJyYXkubGVuZ3RoID49IDEyMCkpXG4gICAgICA/IG5ldyBTZXRDYWNoZShvdGhJbmRleCAmJiBhcnJheSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG4gIGFycmF5ID0gYXJyYXlzWzBdO1xuXG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgc2VlbiA9IGNhY2hlc1swXTtcblxuICBvdXRlcjpcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKCEoc2VlblxuICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpXG4gICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICApKSB7XG4gICAgICBvdGhJbmRleCA9IG90aExlbmd0aDtcbiAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgIHZhciBjYWNoZSA9IGNhY2hlc1tvdGhJbmRleF07XG4gICAgICAgIGlmICghKGNhY2hlXG4gICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICA6IGluY2x1ZGVzKGFycmF5c1tvdGhJbmRleF0sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc2Vlbikge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW50ZXJzZWN0aW9uO1xuIiwiaW1wb3J0IGJhc2VGb3JPd24gZnJvbSAnLi9fYmFzZUZvck93bi5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52ZXJ0YCBhbmQgYF8uaW52ZXJ0QnlgIHdoaWNoIGludmVydHNcbiAqIGBvYmplY3RgIHdpdGggdmFsdWVzIHRyYW5zZm9ybWVkIGJ5IGBpdGVyYXRlZWAgYW5kIHNldCBieSBgc2V0dGVyYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgaW52ZXJ0ZWQgb2JqZWN0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICBzZXR0ZXIoYWNjdW11bGF0b3IsIGl0ZXJhdGVlKHZhbHVlKSwga2V5LCBvYmplY3QpO1xuICB9KTtcbiAgcmV0dXJuIGFjY3VtdWxhdG9yO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW52ZXJ0ZXI7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGNhc3RQYXRoIGZyb20gJy4vX2Nhc3RQYXRoLmpzJztcbmltcG9ydCBsYXN0IGZyb20gJy4vbGFzdC5qcyc7XG5pbXBvcnQgcGFyZW50IGZyb20gJy4vX3BhcmVudC5qcyc7XG5pbXBvcnQgdG9LZXkgZnJvbSAnLi9fdG9LZXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gKiBtZXRob2QgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQgOiBhcHBseShmdW5jLCBvYmplY3QsIGFyZ3MpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSW52b2tlO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LFxuICovXG5mdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYXJnc1RhZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzQXJndW1lbnRzO1xuIiwiaW1wb3J0IGJhc2VJc0VxdWFsRGVlcCBmcm9tICcuL19iYXNlSXNFcXVhbERlZXAuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29uc1xuICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgaWYgKHZhbHVlID09PSBvdGhlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2UodmFsdWUpICYmICFpc09iamVjdExpa2Uob3RoZXIpKSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xuICB9XG4gIHJldHVybiBiYXNlSXNFcXVhbERlZXAodmFsdWUsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBiYXNlSXNFcXVhbCwgc3RhY2spO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNFcXVhbDtcbiIsImltcG9ydCBTdGFjayBmcm9tICcuL19TdGFjay5qcyc7XG5pbXBvcnQgZXF1YWxBcnJheXMgZnJvbSAnLi9fZXF1YWxBcnJheXMuanMnO1xuaW1wb3J0IGVxdWFsQnlUYWcgZnJvbSAnLi9fZXF1YWxCeVRhZy5qcyc7XG5pbXBvcnQgZXF1YWxPYmplY3RzIGZyb20gJy4vX2VxdWFsT2JqZWN0cy5qcyc7XG5pbXBvcnQgZ2V0VGFnIGZyb20gJy4vX2dldFRhZy5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzQnVmZmVyIGZyb20gJy4vaXNCdWZmZXIuanMnO1xuaW1wb3J0IGlzVHlwZWRBcnJheSBmcm9tICcuL2lzVHlwZWRBcnJheS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJyxcbiAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbGAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLFxuICAgICAgb3RoSXNBcnIgPSBpc0FycmF5KG90aGVyKSxcbiAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpO1xuXG4gIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnO1xuICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICB2YXIgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgb3RoSXNPYmogPSBvdGhUYWcgPT0gb2JqZWN0VGFnLFxuICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHtcbiAgICBpZiAoIWlzQnVmZmVyKG90aGVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBvYmpJc0FyciA9IHRydWU7XG4gICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgfVxuICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikge1xuICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSlcbiAgICAgID8gZXF1YWxBcnJheXMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaylcbiAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICB9XG4gIGlmICghKGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRykpIHtcbiAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTtcblxuICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7XG4gICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgb3RoVW53cmFwcGVkID0gb3RoSXNXcmFwcGVkID8gb3RoZXIudmFsdWUoKSA6IG90aGVyO1xuXG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU2FtZVRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICByZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNFcXVhbERlZXA7XG4iLCJpbXBvcnQgU3RhY2sgZnJvbSAnLi9fU3RhY2suanMnO1xuaW1wb3J0IGJhc2VJc0VxdWFsIGZyb20gJy4vX2Jhc2VJc0VxdWFsLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWF0Y2hgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xuICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLFxuICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICBub0N1c3RvbWl6ZXIgPSAhY3VzdG9taXplcjtcblxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4gIWxlbmd0aDtcbiAgfVxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSlcbiAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdClcbiAgICAgICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XG4gICAgdmFyIGtleSA9IGRhdGFbMF0sXG4gICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTtcblxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xuICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzdGFjayA9IG5ldyBTdGFjaztcbiAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgOiByZXN1bHRcbiAgICAgICAgICApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc01hdGNoO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUlzTmFOO1xuIiwiaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAnLi9pc0Z1bmN0aW9uLmpzJztcbmltcG9ydCBpc01hc2tlZCBmcm9tICcuL19pc01hc2tlZC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgdG9Tb3VyY2UgZnJvbSAnLi9fdG9Tb3VyY2UuanMnO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAqIFtzeW50YXggY2hhcmFjdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcGF0dGVybnMpLlxuICovXG52YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG52YXIgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG52YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgK1xuICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbik7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzTmF0aXZlKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXNOYXRpdmU7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc0xlbmd0aCBmcm9tICcuL2lzTGVuZ3RoLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcbiAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXG4gICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLFxuICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLFxuICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLFxuICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7XG5cbnZhciBhcnJheUJ1ZmZlclRhZyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsXG4gICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLFxuICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICBmbG9hdDY0VGFnID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsXG4gICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgIGludDMyVGFnID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLFxuICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgdWludDE2VGFnID0gJ1tvYmplY3QgVWludDE2QXJyYXldJyxcbiAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nO1xuXG4vKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG52YXIgdHlwZWRBcnJheVRhZ3MgPSB7fTtcbnR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxudHlwZWRBcnJheVRhZ3NbaW50MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cbnR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xudHlwZWRBcnJheVRhZ3NbYXJnc1RhZ10gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxudHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxudHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxudHlwZWRBcnJheVRhZ3Nbc2V0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxudHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkge1xuICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJlxuICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VJc1R5cGVkQXJyYXk7XG4iLCJpbXBvcnQgYmFzZU1hdGNoZXMgZnJvbSAnLi9fYmFzZU1hdGNoZXMuanMnO1xuaW1wb3J0IGJhc2VNYXRjaGVzUHJvcGVydHkgZnJvbSAnLi9fYmFzZU1hdGNoZXNQcm9wZXJ0eS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IHByb3BlcnR5IGZyb20gJy4vcHJvcGVydHkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICovXG5mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHtcbiAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5O1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gYmFzZU1hdGNoZXNQcm9wZXJ0eSh2YWx1ZVswXSwgdmFsdWVbMV0pXG4gICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gcHJvcGVydHkodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlSXRlcmF0ZWU7XG4iLCJpbXBvcnQgaXNQcm90b3R5cGUgZnJvbSAnLi9faXNQcm90b3R5cGUuanMnO1xuaW1wb3J0IG5hdGl2ZUtleXMgZnJvbSAnLi9fbmF0aXZlS2V5cy5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHtcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUtleXMob2JqZWN0KTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSAmJiBrZXkgIT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUtleXM7XG4iLCJpbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5pbXBvcnQgaXNQcm90b3R5cGUgZnJvbSAnLi9faXNQcm90b3R5cGUuanMnO1xuaW1wb3J0IG5hdGl2ZUtleXNJbiBmcm9tICcuL19uYXRpdmVLZXlzSW4uanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICovXG5mdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gIH1cbiAgdmFyIGlzUHJvdG8gPSBpc1Byb3RvdHlwZShvYmplY3QpLFxuICAgICAgcmVzdWx0ID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7XG4gICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlS2V5c0luO1xuIiwiLyoqXG4gKiBUaGUgZnVuY3Rpb24gd2hvc2UgcHJvdG90eXBlIGNoYWluIHNlcXVlbmNlIHdyYXBwZXJzIGluaGVyaXQgZnJvbS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlTG9kYXNoO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5sdGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUx0KHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPCBvdGhlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZUx0O1xuIiwiaW1wb3J0IGJhc2VFYWNoIGZyb20gJy4vX2Jhc2VFYWNoLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXBgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IGlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107XG5cbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1hcDtcbiIsImltcG9ydCBiYXNlSXNNYXRjaCBmcm9tICcuL19iYXNlSXNNYXRjaC5qcyc7XG5pbXBvcnQgZ2V0TWF0Y2hEYXRhIGZyb20gJy4vX2dldE1hdGNoRGF0YS5qcyc7XG5pbXBvcnQgbWF0Y2hlc1N0cmljdENvbXBhcmFibGUgZnJvbSAnLi9fbWF0Y2hlc1N0cmljdENvbXBhcmFibGUuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNvdXJjZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlTWF0Y2hlcyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoRGF0YSA9IGdldE1hdGNoRGF0YShzb3VyY2UpO1xuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1hdGNoZXM7XG4iLCJpbXBvcnQgYmFzZUlzRXF1YWwgZnJvbSAnLi9fYmFzZUlzRXF1YWwuanMnO1xuaW1wb3J0IGdldCBmcm9tICcuL2dldC5qcyc7XG5pbXBvcnQgaGFzSW4gZnJvbSAnLi9oYXNJbi5qcyc7XG5pbXBvcnQgaXNLZXkgZnJvbSAnLi9faXNLZXkuanMnO1xuaW1wb3J0IGlzU3RyaWN0Q29tcGFyYWJsZSBmcm9tICcuL19pc1N0cmljdENvbXBhcmFibGUuanMnO1xuaW1wb3J0IG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlIGZyb20gJy4vX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlLmpzJztcbmltcG9ydCB0b0tleSBmcm9tICcuL190b0tleS5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqL1xudmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICBDT01QQVJFX1VOT1JERVJFRF9GTEFHID0gMjtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzUHJvcGVydHlgIHdoaWNoIGRvZXNuJ3QgY2xvbmUgYHNyY1ZhbHVlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkge1xuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xuICB9XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIgb2JqVmFsdWUgPSBnZXQob2JqZWN0LCBwYXRoKTtcbiAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXG4gICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZU1hdGNoZXNQcm9wZXJ0eTtcbiIsImltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgYmFzZUdldCBmcm9tICcuL19iYXNlR2V0LmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlTWFwIGZyb20gJy4vX2Jhc2VNYXAuanMnO1xuaW1wb3J0IGJhc2VTb3J0QnkgZnJvbSAnLi9fYmFzZVNvcnRCeS5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgY29tcGFyZU11bHRpcGxlIGZyb20gJy4vX2NvbXBhcmVNdWx0aXBsZS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcmRlcnMgVGhlIHNvcnQgb3JkZXJzIG9mIGBpdGVyYXRlZXNgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycykge1xuICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHtcbiAgICAgIGlmIChpc0FycmF5KGl0ZXJhdGVlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRlZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gLTE7XG4gIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xuXG4gIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICB2YXIgY3JpdGVyaWEgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gaXRlcmF0ZWUodmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiB7ICdjcml0ZXJpYSc6IGNyaXRlcmlhLCAnaW5kZXgnOiArK2luZGV4LCAndmFsdWUnOiB2YWx1ZSB9O1xuICB9KTtcblxuICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlT3JkZXJCeTtcbiIsImltcG9ydCBiYXNlUGlja0J5IGZyb20gJy4vX2Jhc2VQaWNrQnkuanMnO1xuaW1wb3J0IGhhc0luIGZyb20gJy4vaGFzSW4uanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbFxuICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGJhc2VQaWNrKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHtcbiAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VQaWNrO1xuIiwiaW1wb3J0IGJhc2VHZXQgZnJvbSAnLi9fYmFzZUdldC5qcyc7XG5pbXBvcnQgYmFzZVNldCBmcm9tICcuL19iYXNlU2V0LmpzJztcbmltcG9ydCBjYXN0UGF0aCBmcm9tICcuL19jYXN0UGF0aC5qcyc7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgIGBfLnBpY2tCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICByZXN1bHQgPSB7fTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBwYXRoID0gcGF0aHNbaW5kZXhdLFxuICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIHBhdGgpKSB7XG4gICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUGlja0J5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVByb3BlcnR5O1xuIiwiaW1wb3J0IGJhc2VHZXQgZnJvbSAnLi9fYmFzZUdldC5qcyc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICByZXR1cm4gYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUHJvcGVydHlEZWVwO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlUHJvcGVydHlPZjtcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VSYW5nZTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVkdWNlYCBhbmQgYF8ucmVkdWNlUmlnaHRgLCB3aXRob3V0IHN1cHBvcnRcbiAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtIHsqfSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICogIGBjb2xsZWN0aW9uYCBhcyB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICovXG5mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBlYWNoRnVuYykge1xuICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICBhY2N1bXVsYXRvciA9IGluaXRBY2N1bVxuICAgICAgPyAoaW5pdEFjY3VtID0gZmFsc2UsIHZhbHVlKVxuICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVJlZHVjZTtcbiIsImltcG9ydCBpZGVudGl0eSBmcm9tICcuL2lkZW50aXR5LmpzJztcbmltcG9ydCBvdmVyUmVzdCBmcm9tICcuL19vdmVyUmVzdC5qcyc7XG5pbXBvcnQgc2V0VG9TdHJpbmcgZnJvbSAnLi9fc2V0VG9TdHJpbmcuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICByZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5KSwgZnVuYyArICcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVJlc3Q7XG4iLCJpbXBvcnQgYXNzaWduVmFsdWUgZnJvbSAnLi9fYXNzaWduVmFsdWUuanMnO1xuaW1wb3J0IGNhc3RQYXRoIGZyb20gJy4vX2Nhc3RQYXRoLmpzJztcbmltcG9ydCBpc0luZGV4IGZyb20gJy4vX2lzSW5kZXguanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zZXRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIHBhdGggY3JlYXRpb24uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpIHtcbiAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoLFxuICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMSxcbiAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSB0b0tleShwYXRoW2luZGV4XSksXG4gICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoa2V5ID09PSAnX19wcm90b19fJyB8fCBrZXkgPT09ICdjb25zdHJ1Y3RvcicgfHwga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7XG4gICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTtcbiAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpXG4gICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgIDogKGlzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pO1xuICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25WYWx1ZShuZXN0ZWQsIGtleSwgbmV3VmFsdWUpO1xuICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VTZXQ7XG4iLCJpbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5pbXBvcnQgbWV0YU1hcCBmcm9tICcuL19tZXRhTWFwLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0RGF0YWAgd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAqL1xudmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgbWV0YU1hcC5zZXQoZnVuYywgZGF0YSk7XG4gIHJldHVybiBmdW5jO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNldERhdGE7XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSAnLi9jb25zdGFudC5qcyc7XG5pbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSAnLi9fZGVmaW5lUHJvcGVydHkuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gKi9cbnZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykge1xuICByZXR1cm4gZGVmaW5lUHJvcGVydHkoZnVuYywgJ3RvU3RyaW5nJywge1xuICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgJ3ZhbHVlJzogY29uc3RhbnQoc3RyaW5nKSxcbiAgICAnd3JpdGFibGUnOiB0cnVlXG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNldFRvU3RyaW5nO1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zbGljZWAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpO1xuICB9XG4gIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuZ3RoO1xuICB9XG4gIGxlbmd0aCA9IHN0YXJ0ID4gZW5kID8gMCA6ICgoZW5kIC0gc3RhcnQpID4+PiAwKTtcbiAgc3RhcnQgPj4+PSAwO1xuXG4gIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU2xpY2U7XG4iLCJpbXBvcnQgYmFzZUVhY2ggZnJvbSAnLi9fYmFzZUVhY2guanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvbWVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIHJlc3VsdDtcblxuICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICByZXR1cm4gIXJlc3VsdDtcbiAgfSk7XG4gIHJldHVybiAhIXJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVNvbWU7XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRCeWAgd2hpY2ggdXNlcyBgY29tcGFyZXJgIHRvIGRlZmluZSB0aGVcbiAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAqIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJlciBUaGUgZnVuY3Rpb24gdG8gZGVmaW5lIHNvcnQgb3JkZXIuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAqL1xuZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSwgY29tcGFyZXIpIHtcbiAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlU29ydEJ5O1xuIiwiLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zdW1gIGFuZCBgXy5zdW1CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gKi9cbmZ1bmN0aW9uIGJhc2VTdW0oYXJyYXksIGl0ZXJhdGVlKSB7XG4gIHZhciByZXN1bHQsXG4gICAgICBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gY3VycmVudCA6IChyZXN1bHQgKyBjdXJyZW50KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVN1bTtcbiIsIi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICogb3IgbWF4IGFycmF5IGxlbmd0aCBjaGVja3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShuKTtcblxuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VUaW1lcztcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBhcnJheU1hcCBmcm9tICcuL19hcnJheU1hcC5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBJTkZJTklUWSA9IDEgLyAwO1xuXG4vKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi9cbnZhciBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXG4gICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvU3RyaW5nYCB3aGljaCBkb2Vzbid0IGNvbnZlcnQgbnVsbGlzaFxuICogdmFsdWVzIHRvIGVtcHR5IHN0cmluZ3MuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUb1N0cmluZyh2YWx1ZSkge1xuICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gIH1cbiAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTtcbiAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBiYXNlVG9TdHJpbmc7XG4iLCJpbXBvcnQgdHJpbW1lZEVuZEluZGV4IGZyb20gJy4vX3RyaW1tZWRFbmRJbmRleC5qcyc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgYmFzZVRyaW07XG4iLCIvKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xuICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VVbmFyeTtcbiIsImltcG9ydCBTZXRDYWNoZSBmcm9tICcuL19TZXRDYWNoZS5qcyc7XG5pbXBvcnQgYXJyYXlJbmNsdWRlcyBmcm9tICcuL19hcnJheUluY2x1ZGVzLmpzJztcbmltcG9ydCBhcnJheUluY2x1ZGVzV2l0aCBmcm9tICcuL19hcnJheUluY2x1ZGVzV2l0aC5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuaW1wb3J0IGNyZWF0ZVNldCBmcm9tICcuL19jcmVhdGVTZXQuanMnO1xuaW1wb3J0IHNldFRvQXJyYXkgZnJvbSAnLi9fc2V0VG9BcnJheS5qcyc7XG5cbi8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xudmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGlzQ29tbW9uID0gdHJ1ZSxcbiAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgfVxuICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkge1xuICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7XG4gICAgfVxuICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICB9XG4gIGVsc2Uge1xuICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICB9XG4gIG91dGVyOlxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkge1xuICAgICAgdmFyIHNlZW5JbmRleCA9IHNlZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgIGlmIChzZWVuW3NlZW5JbmRleF0gPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpdGVyYXRlZSkge1xuICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmICghaW5jbHVkZXMoc2VlbiwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7XG4gICAgICBpZiAoc2VlbiAhPT0gcmVzdWx0KSB7XG4gICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICB9XG4gICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VVbmlxO1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICogYXJyYXkgb2YgYG9iamVjdGAgcHJvcGVydHkgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3BlcnR5IG5hbWVzXG4gKiBvZiBgcHJvcHNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICByZXR1cm4gYXJyYXlNYXAocHJvcHMsIGZ1bmN0aW9uKGtleSkge1xuICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGJhc2VWYWx1ZXM7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBjYWNoZUhhcyhjYWNoZSwga2V5KSB7XG4gIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FjaGVIYXM7XG4iLCJpbXBvcnQgaXNBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9pc0FycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhc3RBcnJheUxpa2VPYmplY3Q7XG4iLCJpbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogQ2FzdHMgYHZhbHVlYCB0byBgaWRlbnRpdHlgIGlmIGl0J3Mgbm90IGEgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNhc3RGdW5jdGlvbjtcbiIsImltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNLZXkgZnJvbSAnLi9faXNLZXkuanMnO1xuaW1wb3J0IHN0cmluZ1RvUGF0aCBmcm9tICcuL19zdHJpbmdUb1BhdGguanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKipcbiAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjYXN0UGF0aDtcbiIsImltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcblxuLyoqXG4gKiBDYXN0cyBgYXJyYXlgIHRvIGEgc2xpY2UgaWYgaXQncyBuZWVkZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBzbGljZS5cbiAqL1xuZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogZW5kO1xuICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FzdFNsaWNlO1xuIiwiaW1wb3J0IGJhc2VJbmRleE9mIGZyb20gJy4vX2Jhc2VJbmRleE9mLmpzJztcblxuLyoqXG4gKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7QXJyYXl9IGNoclN5bWJvbHMgVGhlIGNoYXJhY3RlciBzeW1ib2xzIHRvIGZpbmQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAqL1xuZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSB7XG4gIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleC0tICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNoYXJzRW5kSW5kZXg7XG4iLCJpbXBvcnQgYmFzZUluZGV4T2YgZnJvbSAnLi9fYmFzZUluZGV4T2YuanMnO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1TdGFydGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc3RyaW5nIHN5bWJvbFxuICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAqL1xuZnVuY3Rpb24gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiBiYXNlSW5kZXhPZihjaHJTeW1ib2xzLCBzdHJTeW1ib2xzW2luZGV4XSwgMCkgPiAtMSkge31cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjaGFyc1N0YXJ0SW5kZXg7XG4iLCJpbXBvcnQgaXNTeW1ib2wgZnJvbSAnLi9pc1N5bWJvbC5qcyc7XG5cbi8qKlxuICogQ29tcGFyZXMgdmFsdWVzIHRvIHNvcnQgdGhlbSBpbiBhc2NlbmRpbmcgb3JkZXIuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGB2YWx1ZWAuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gIGlmICh2YWx1ZSAhPT0gb3RoZXIpIHtcbiAgICB2YXIgdmFsSXNEZWZpbmVkID0gdmFsdWUgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlLFxuICAgICAgICB2YWxJc1N5bWJvbCA9IGlzU3ltYm9sKHZhbHVlKTtcblxuICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICBvdGhJc051bGwgPSBvdGhlciA9PT0gbnVsbCxcbiAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsXG4gICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgaWYgKCghb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCAmJiAhdmFsSXNTeW1ib2wgJiYgdmFsdWUgPiBvdGhlcikgfHxcbiAgICAgICAgKHZhbElzU3ltYm9sICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSAmJiAhb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCkgfHxcbiAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICghdmFsSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxuICAgICAgICAhdmFsSXNSZWZsZXhpdmUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBpZiAoKCF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sICYmICFvdGhJc1N5bWJvbCAmJiB2YWx1ZSA8IG90aGVyKSB8fFxuICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAob3RoSXNOdWxsICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgKCFvdGhJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29tcGFyZUFzY2VuZGluZztcbiIsImltcG9ydCBjb21wYXJlQXNjZW5kaW5nIGZyb20gJy4vX2NvbXBhcmVBc2NlbmRpbmcuanMnO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlclxuICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gKlxuICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSxcbiAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAqIG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc29ydCBvcmRlciBpbmRpY2F0b3IgZm9yIGBvYmplY3RgLlxuICovXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgb2JqQ3JpdGVyaWEgPSBvYmplY3QuY3JpdGVyaWEsXG4gICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgbGVuZ3RoID0gb2JqQ3JpdGVyaWEubGVuZ3RoLFxuICAgICAgb3JkZXJzTGVuZ3RoID0gb3JkZXJzLmxlbmd0aDtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpO1xuICAgIH1cbiAgfVxuICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zXG4gIC8vIHRoYXQgY2F1c2VzIGl0LCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHRvIHByb3ZpZGUgdGhlIHNhbWUgdmFsdWUgZm9yXG4gIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICAvL1xuICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy5cbiAgcmV0dXJuIG9iamVjdC5pbmRleCAtIG90aGVyLmluZGV4O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb21wYXJlTXVsdGlwbGU7XG4iLCIvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gKiBwbGFjZWhvbGRlcnMsIGFuZCBwcm92aWRlZCBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpIHtcbiAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgaG9sZGVyc0xlbmd0aCA9IGhvbGRlcnMubGVuZ3RoLFxuICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSxcbiAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICB3aGlsZSAoKytsZWZ0SW5kZXggPCBsZWZ0TGVuZ3RoKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleF0gPSBwYXJ0aWFsc1tsZWZ0SW5kZXhdO1xuICB9XG4gIHdoaWxlICgrK2FyZ3NJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICBpZiAoaXNVbmN1cnJpZWQgfHwgYXJnc0luZGV4IDwgYXJnc0xlbmd0aCkge1xuICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgfVxuICB9XG4gIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgcmVzdWx0W2xlZnRJbmRleCsrXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VBcmdzO1xuIiwiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgY29tcG9zZUFyZ3NgIGV4Y2VwdCB0aGF0IHRoZSBhcmd1bWVudHMgY29tcG9zaXRpb25cbiAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC5cbiAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICBhcmdzTGVuZ3RoID0gYXJncy5sZW5ndGgsXG4gICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgIHJpZ2h0SW5kZXggPSAtMSxcbiAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkocmFuZ2VMZW5ndGggKyByaWdodExlbmd0aCksXG4gICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgd2hpbGUgKCsrYXJnc0luZGV4IDwgcmFuZ2VMZW5ndGgpIHtcbiAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTtcbiAgfVxuICB2YXIgb2Zmc2V0ID0gYXJnc0luZGV4O1xuICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHtcbiAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgfVxuICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgIHJlc3VsdFtvZmZzZXQgKyBob2xkZXJzW2hvbGRlcnNJbmRleF1dID0gYXJnc1thcmdzSW5kZXgrK107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VBcmdzUmlnaHQ7XG4iLCIvKipcbiAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcnJheT1bXV0gVGhlIGFycmF5IHRvIGNvcHkgdmFsdWVzIHRvLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIGNvcHlBcnJheShzb3VyY2UsIGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29weUFycmF5O1xuIiwiaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvdmVycmVhY2hpbmcgY29yZS1qcyBzaGltcy4gKi9cbnZhciBjb3JlSnNEYXRhID0gcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107XG5cbmV4cG9ydCBkZWZhdWx0IGNvcmVKc0RhdGE7XG4iLCIvKipcbiAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gc2VhcmNoIGZvci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGNvdW50LlxuICovXG5mdW5jdGlvbiBjb3VudEhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXN1bHQgPSAwO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIGlmIChhcnJheVtsZW5ndGhdID09PSBwbGFjZWhvbGRlcikge1xuICAgICAgKytyZXN1bHQ7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvdW50SG9sZGVycztcbiIsImltcG9ydCBhcnJheUFnZ3JlZ2F0b3IgZnJvbSAnLi9fYXJyYXlBZ2dyZWdhdG9yLmpzJztcbmltcG9ydCBiYXNlQWdncmVnYXRvciBmcm9tICcuL19iYXNlQWdncmVnYXRvci5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmdyb3VwQnlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBhY2N1bXVsYXRvciB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlBZ2dyZWdhdG9yIDogYmFzZUFnZ3JlZ2F0b3IsXG4gICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307XG5cbiAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGJhc2VJdGVyYXRlZShpdGVyYXRlZSwgMiksIGFjY3VtdWxhdG9yKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQWdncmVnYXRvcjtcbiIsImltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgIH1cbiAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xuICAgIH1cbiAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gZnJvbVJpZ2h0ID8gbGVuZ3RoIDogLTEsXG4gICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuXG4gICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtpbmRleF0sIGluZGV4LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQmFzZUVhY2g7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzRnVuYykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxuICAgICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXG4gICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xuICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQmFzZUZvcjtcbiIsImltcG9ydCBjcmVhdGVDdG9yIGZyb20gJy4vX2NyZWF0ZUN0b3IuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIG9wdGlvbmFsIGB0aGlzYFxuICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJpbmQoZnVuYywgYml0bWFzaywgdGhpc0FyZykge1xuICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgIHJldHVybiBmbi5hcHBseShpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJndW1lbnRzKTtcbiAgfVxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQmluZDtcbiIsImltcG9ydCBjYXN0U2xpY2UgZnJvbSAnLi9fY2FzdFNsaWNlLmpzJztcbmltcG9ydCBoYXNVbmljb2RlIGZyb20gJy4vX2hhc1VuaWNvZGUuanMnO1xuaW1wb3J0IHN0cmluZ1RvQXJyYXkgZnJvbSAnLi9fc3RyaW5nVG9BcnJheS5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcblxuICAgIHZhciBzdHJTeW1ib2xzID0gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgY2hyID0gc3RyU3ltYm9sc1xuICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICA6IHN0cmluZy5jaGFyQXQoMCk7XG5cbiAgICB2YXIgdHJhaWxpbmcgPSBzdHJTeW1ib2xzXG4gICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgOiBzdHJpbmcuc2xpY2UoMSk7XG5cbiAgICByZXR1cm4gY2hyW21ldGhvZE5hbWVdKCkgKyB0cmFpbGluZztcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ2FzZUZpcnN0O1xuIiwiaW1wb3J0IGFycmF5UmVkdWNlIGZyb20gJy4vX2FycmF5UmVkdWNlLmpzJztcbmltcG9ydCBkZWJ1cnIgZnJvbSAnLi9kZWJ1cnIuanMnO1xuaW1wb3J0IHdvcmRzIGZyb20gJy4vd29yZHMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCI7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqL1xudmFyIHJlQXBvcyA9IFJlZ0V4cChyc0Fwb3MsICdnJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCAnJykpLCBjYWxsYmFjaywgJycpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb3VuZGVyO1xuIiwiaW1wb3J0IGJhc2VDcmVhdGUgZnJvbSAnLi9fYmFzZUNyZWF0ZS5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoZXRoZXIgaXQgd2FzIGludm9rZWQgYXMgcGFydCBvZiBhIGBuZXdgIGV4cHJlc3Npb24gb3IgYnkgYGNhbGxgIG9yIGBhcHBseWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IEN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIHdyYXAuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAvLyBodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWZ1bmN0aW9uLW9iamVjdHMtY2FsbC10aGlzYXJndW1lbnQtYXJndW1lbnRzbGlzdFxuICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEN0b3I7XG4gICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIG5ldyBDdG9yKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0pO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbmV3IEN0b3IoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSk7XG4gICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICB9XG4gICAgdmFyIHRoaXNCaW5kaW5nID0gYmFzZUNyZWF0ZShDdG9yLnByb3RvdHlwZSksXG4gICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgLy8gTWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IuXG4gICAgLy8gU2VlIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDEzLjIuMiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUN0b3I7XG4iLCJpbXBvcnQgYXBwbHkgZnJvbSAnLi9fYXBwbHkuanMnO1xuaW1wb3J0IGNyZWF0ZUN0b3IgZnJvbSAnLi9fY3JlYXRlQ3Rvci5qcyc7XG5pbXBvcnQgY3JlYXRlSHlicmlkIGZyb20gJy4vX2NyZWF0ZUh5YnJpZC5qcyc7XG5pbXBvcnQgY3JlYXRlUmVjdXJyeSBmcm9tICcuL19jcmVhdGVSZWN1cnJ5LmpzJztcbmltcG9ydCBnZXRIb2xkZXIgZnJvbSAnLi9fZ2V0SG9sZGVyLmpzJztcbmltcG9ydCByZXBsYWNlSG9sZGVycyBmcm9tICcuL19yZXBsYWNlSG9sZGVycy5qcyc7XG5pbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBhcml0eSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpIHtcbiAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBnZXRIb2xkZXIod3JhcHBlcik7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgIH1cbiAgICB2YXIgaG9sZGVycyA9IChsZW5ndGggPCAzICYmIGFyZ3NbMF0gIT09IHBsYWNlaG9sZGVyICYmIGFyZ3NbbGVuZ3RoIC0gMV0gIT09IHBsYWNlaG9sZGVyKVxuICAgICAgPyBbXVxuICAgICAgOiByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG5cbiAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICByZXR1cm4gY3JlYXRlUmVjdXJyeShcbiAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQsXG4gICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgfVxuICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG4gICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgfVxuICByZXR1cm4gd3JhcHBlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQ3Vycnk7XG4iLCJpbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5pbXBvcnQga2V5cyBmcm9tICcuL2tleXMuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xuICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgY29sbGVjdGlvbiA9IGtleXMoY29sbGVjdGlvbik7XG4gICAgICBwcmVkaWNhdGUgPSBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpOyB9O1xuICAgIH1cbiAgICB2YXIgaW5kZXggPSBmaW5kSW5kZXhGdW5jKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KTtcbiAgICByZXR1cm4gaW5kZXggPiAtMSA/IGl0ZXJhYmxlW2l0ZXJhdGVlID8gY29sbGVjdGlvbltpbmRleF0gOiBpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUZpbmQ7XG4iLCJpbXBvcnQgY29tcG9zZUFyZ3MgZnJvbSAnLi9fY29tcG9zZUFyZ3MuanMnO1xuaW1wb3J0IGNvbXBvc2VBcmdzUmlnaHQgZnJvbSAnLi9fY29tcG9zZUFyZ3NSaWdodC5qcyc7XG5pbXBvcnQgY291bnRIb2xkZXJzIGZyb20gJy4vX2NvdW50SG9sZGVycy5qcyc7XG5pbXBvcnQgY3JlYXRlQ3RvciBmcm9tICcuL19jcmVhdGVDdG9yLmpzJztcbmltcG9ydCBjcmVhdGVSZWN1cnJ5IGZyb20gJy4vX2NyZWF0ZVJlY3VycnkuanMnO1xuaW1wb3J0IGdldEhvbGRlciBmcm9tICcuL19nZXRIb2xkZXIuanMnO1xuaW1wb3J0IHJlb3JkZXIgZnJvbSAnLi9fcmVvcmRlci5qcyc7XG5pbXBvcnQgcmVwbGFjZUhvbGRlcnMgZnJvbSAnLi9fcmVwbGFjZUhvbGRlcnMuanMnO1xuaW1wb3J0IHJvb3QgZnJvbSAnLi9fcm9vdC5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgV1JBUF9BUllfRkxBRyA9IDEyOCxcbiAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gKiBiaW5kaW5nIG9mIGB0aGlzQXJnYCwgcGFydGlhbCBhcHBsaWNhdGlvbiwgYW5kIGN1cnJ5aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG9cbiAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNSaWdodF0gVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWRcbiAqICB0byB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgdmFyIGlzQXJ5ID0gYml0bWFzayAmIFdSQVBfQVJZX0ZMQUcsXG4gICAgICBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsXG4gICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgaXNDdXJyaWVkID0gYml0bWFzayAmIChXUkFQX0NVUlJZX0ZMQUcgfCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpLFxuICAgICAgaXNGbGlwID0gYml0bWFzayAmIFdSQVBfRkxJUF9GTEFHLFxuICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgZnVuY3Rpb24gd3JhcHBlcigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICB9XG4gICAgaWYgKGlzQ3VycmllZCkge1xuICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgIGhvbGRlcnNDb3VudCA9IGNvdW50SG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzKGFyZ3MsIHBhcnRpYWxzLCBob2xkZXJzLCBpc0N1cnJpZWQpO1xuICAgIH1cbiAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgYXJncyA9IGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBpc0N1cnJpZWQpO1xuICAgIH1cbiAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgIGlmIChpc0N1cnJpZWQgJiYgbGVuZ3RoIDwgYXJpdHkpIHtcbiAgICAgIHZhciBuZXdIb2xkZXJzID0gcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgIGZ1bmMsIGJpdG1hc2ssIGNyZWF0ZUh5YnJpZCwgd3JhcHBlci5wbGFjZWhvbGRlciwgdGhpc0FyZyxcbiAgICAgICAgYXJncywgbmV3SG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5IC0gbGVuZ3RoXG4gICAgICApO1xuICAgIH1cbiAgICB2YXIgdGhpc0JpbmRpbmcgPSBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcyxcbiAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICBsZW5ndGggPSBhcmdzLmxlbmd0aDtcbiAgICBpZiAoYXJnUG9zKSB7XG4gICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgIH0gZWxzZSBpZiAoaXNGbGlwICYmIGxlbmd0aCA+IDEpIHtcbiAgICAgIGFyZ3MucmV2ZXJzZSgpO1xuICAgIH1cbiAgICBpZiAoaXNBcnkgJiYgYXJ5IDwgbGVuZ3RoKSB7XG4gICAgICBhcmdzLmxlbmd0aCA9IGFyeTtcbiAgICB9XG4gICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikge1xuICAgICAgZm4gPSBDdG9yIHx8IGNyZWF0ZUN0b3IoZm4pO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuICB9XG4gIHJldHVybiB3cmFwcGVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVIeWJyaWQ7XG4iLCJpbXBvcnQgYmFzZUludmVydGVyIGZyb20gJy4vX2Jhc2VJbnZlcnRlci5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uaW52ZXJ0QnlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXR0ZXIgVGhlIGZ1bmN0aW9uIHRvIHNldCBhY2N1bXVsYXRvciB2YWx1ZXMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICByZXR1cm4gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCB0b0l0ZXJhdGVlKGl0ZXJhdGVlKSwge30pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVJbnZlcnRlcjtcbiIsImltcG9ydCBhcHBseSBmcm9tICcuL19hcHBseS5qcyc7XG5pbXBvcnQgY3JlYXRlQ3RvciBmcm9tICcuL19jcmVhdGVDdG9yLmpzJztcbmltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBXUkFQX0JJTkRfRkxBRyA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGludm9rZSBpdCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZ1xuICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gKiAgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHtcbiAgdmFyIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgbGVmdEluZGV4ID0gLTEsXG4gICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsXG4gICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCksXG4gICAgICAgIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcblxuICAgIHdoaWxlICgrK2xlZnRJbmRleCA8IGxlZnRMZW5ndGgpIHtcbiAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgfVxuICAgIHdoaWxlIChhcmdzTGVuZ3RoLS0pIHtcbiAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFwcGx5KGZuLCBpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJncyk7XG4gIH1cbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVBhcnRpYWw7XG4iLCJpbXBvcnQgYmFzZVJhbmdlIGZyb20gJy4vX2Jhc2VSYW5nZS5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuaW1wb3J0IHRvRmluaXRlIGZyb20gJy4vdG9GaW5pdGUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJhbmdlO1xuIiwiaW1wb3J0IGlzTGF6aWFibGUgZnJvbSAnLi9faXNMYXppYWJsZS5qcyc7XG5pbXBvcnQgc2V0RGF0YSBmcm9tICcuL19zZXREYXRhLmpzJztcbmltcG9ydCBzZXRXcmFwVG9TdHJpbmcgZnJvbSAnLi9fc2V0V3JhcFRvU3RyaW5nLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsXG4gICAgV1JBUF9DVVJSWV9CT1VORF9GTEFHID0gNCxcbiAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gY29udGludWUgY3VycnlpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB2YWx1ZS5cbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSZWN1cnJ5KGZ1bmMsIGJpdG1hc2ssIHdyYXBGdW5jLCBwbGFjZWhvbGRlciwgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIGFyZ1BvcywgYXJ5LCBhcml0eSkge1xuICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsXG4gICAgICBuZXdIb2xkZXJzID0gaXNDdXJyeSA/IGhvbGRlcnMgOiB1bmRlZmluZWQsXG4gICAgICBuZXdIb2xkZXJzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogaG9sZGVycyxcbiAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgbmV3UGFydGlhbHNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBwYXJ0aWFscztcblxuICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgOiBXUkFQX1BBUlRJQUxfRkxBRyk7XG5cbiAgaWYgKCEoYml0bWFzayAmIFdSQVBfQ1VSUllfQk9VTkRfRkxBRykpIHtcbiAgICBiaXRtYXNrICY9IH4oV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcpO1xuICB9XG4gIHZhciBuZXdEYXRhID0gW1xuICAgIGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIG5ld1BhcnRpYWxzLCBuZXdIb2xkZXJzLCBuZXdQYXJ0aWFsc1JpZ2h0LFxuICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5XG4gIF07XG5cbiAgdmFyIHJlc3VsdCA9IHdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCwgbmV3RGF0YSk7XG4gIGlmIChpc0xhemlhYmxlKGZ1bmMpKSB7XG4gICAgc2V0RGF0YShyZXN1bHQsIG5ld0RhdGEpO1xuICB9XG4gIHJlc3VsdC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHJlc3VsdCwgZnVuYywgYml0bWFzayk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJlY3Vycnk7XG4iLCJpbXBvcnQgcm9vdCBmcm9tICcuL19yb290LmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHRvTnVtYmVyIGZyb20gJy4vdG9OdW1iZXIuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNGaW5pdGUgPSByb290LmlzRmluaXRlLFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByb3VuZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICB2YXIgZnVuYyA9IE1hdGhbbWV0aG9kTmFtZV07XG4gIHJldHVybiBmdW5jdGlvbihudW1iZXIsIHByZWNpc2lvbikge1xuICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAwIDogbmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLCAyOTIpO1xuICAgIGlmIChwcmVjaXNpb24gJiYgbmF0aXZlSXNGaW5pdGUobnVtYmVyKSkge1xuICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAvLyBTZWUgW01ETl0oaHR0cHM6Ly9tZG4uaW8vcm91bmQjRXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICB2YXIgcGFpciA9ICh0b1N0cmluZyhudW1iZXIpICsgJ2UnKS5zcGxpdCgnZScpLFxuICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgIHBhaXIgPSAodG9TdHJpbmcodmFsdWUpICsgJ2UnKS5zcGxpdCgnZScpO1xuICAgICAgcmV0dXJuICsocGFpclswXSArICdlJyArICgrcGFpclsxXSAtIHByZWNpc2lvbikpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuYyhudW1iZXIpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSb3VuZDtcbiIsImltcG9ydCBTZXQgZnJvbSAnLi9fU2V0LmpzJztcbmltcG9ydCBub29wIGZyb20gJy4vbm9vcC5qcyc7XG5pbXBvcnQgc2V0VG9BcnJheSBmcm9tICcuL19zZXRUb0FycmF5LmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LlxuICovXG52YXIgY3JlYXRlU2V0ID0gIShTZXQgJiYgKDEgLyBzZXRUb0FycmF5KG5ldyBTZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkpID8gbm9vcCA6IGZ1bmN0aW9uKHZhbHVlcykge1xuICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlU2V0O1xuIiwiaW1wb3J0IGJhc2VTZXREYXRhIGZyb20gJy4vX2Jhc2VTZXREYXRhLmpzJztcbmltcG9ydCBjcmVhdGVCaW5kIGZyb20gJy4vX2NyZWF0ZUJpbmQuanMnO1xuaW1wb3J0IGNyZWF0ZUN1cnJ5IGZyb20gJy4vX2NyZWF0ZUN1cnJ5LmpzJztcbmltcG9ydCBjcmVhdGVIeWJyaWQgZnJvbSAnLi9fY3JlYXRlSHlicmlkLmpzJztcbmltcG9ydCBjcmVhdGVQYXJ0aWFsIGZyb20gJy4vX2NyZWF0ZVBhcnRpYWwuanMnO1xuaW1wb3J0IGdldERhdGEgZnJvbSAnLi9fZ2V0RGF0YS5qcyc7XG5pbXBvcnQgbWVyZ2VEYXRhIGZyb20gJy4vX21lcmdlRGF0YS5qcyc7XG5pbXBvcnQgc2V0RGF0YSBmcm9tICcuL19zZXREYXRhLmpzJztcbmltcG9ydCBzZXRXcmFwVG9TdHJpbmcgZnJvbSAnLi9fc2V0V3JhcFRvU3RyaW5nLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi9cbnZhciBXUkFQX0JJTkRfRkxBRyA9IDEsXG4gICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LFxuICAgIFdSQVBfUEFSVElBTF9GTEFHID0gMzIsXG4gICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NDtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWxcbiAqIGB0aGlzYCBiaW5kaW5nIGFuZCBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSBmdW5jIFRoZSBmdW5jdGlvbiBvciBtZXRob2QgbmFtZSB0byB3cmFwLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gKiAgICAxIC0gYF8uYmluZGBcbiAqICAgIDIgLSBgXy5iaW5kS2V5YFxuICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gKiAgICA4IC0gYF8uY3VycnlgXG4gKiAgIDE2IC0gYF8uY3VycnlSaWdodGBcbiAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICogICA2NCAtIGBfLnBhcnRpYWxSaWdodGBcbiAqICAxMjggLSBgXy5yZWFyZ2BcbiAqICAyNTYgLSBgXy5hcnlgXG4gKiAgNTEyIC0gYF8uZmxpcGBcbiAqIEBwYXJhbSB7Kn0gW3RoaXNBcmddIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgdmFyIGlzQmluZEtleSA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfS0VZX0ZMQUc7XG4gIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBiaXRtYXNrICY9IH4oV1JBUF9QQVJUSUFMX0ZMQUcgfCBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7XG4gICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICB9XG4gIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkID8gYXJ5IDogbmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLCAwKTtcbiAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICBsZW5ndGggLT0gaG9sZGVycyA/IGhvbGRlcnMubGVuZ3RoIDogMDtcblxuICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7XG4gICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgaG9sZGVyc1JpZ2h0ID0gaG9sZGVycztcblxuICAgIHBhcnRpYWxzID0gaG9sZGVycyA9IHVuZGVmaW5lZDtcbiAgfVxuICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGdldERhdGEoZnVuYyk7XG5cbiAgdmFyIG5ld0RhdGEgPSBbXG4gICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICBhcmdQb3MsIGFyeSwgYXJpdHlcbiAgXTtcblxuICBpZiAoZGF0YSkge1xuICAgIG1lcmdlRGF0YShuZXdEYXRhLCBkYXRhKTtcbiAgfVxuICBmdW5jID0gbmV3RGF0YVswXTtcbiAgYml0bWFzayA9IG5ld0RhdGFbMV07XG4gIHRoaXNBcmcgPSBuZXdEYXRhWzJdO1xuICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gIGhvbGRlcnMgPSBuZXdEYXRhWzRdO1xuICBhcml0eSA9IG5ld0RhdGFbOV0gPSBuZXdEYXRhWzldID09PSB1bmRlZmluZWRcbiAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgOiBuYXRpdmVNYXgobmV3RGF0YVs5XSAtIGxlbmd0aCwgMCk7XG5cbiAgaWYgKCFhcml0eSAmJiBiaXRtYXNrICYgKFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfQ1VSUllfUklHSFRfRkxBRykpIHtcbiAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgfVxuICBpZiAoIWJpdG1hc2sgfHwgYml0bWFzayA9PSBXUkFQX0JJTkRfRkxBRykge1xuICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICB9IGVsc2UgaWYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHIHx8IGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSB7XG4gICAgcmVzdWx0ID0gY3JlYXRlQ3VycnkoZnVuYywgYml0bWFzaywgYXJpdHkpO1xuICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgfVxuICB2YXIgc2V0dGVyID0gZGF0YSA/IGJhc2VTZXREYXRhIDogc2V0RGF0YTtcbiAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdyYXA7XG4iLCJpbXBvcnQgYmFzZVByb3BlcnR5T2YgZnJvbSAnLi9fYmFzZVByb3BlcnR5T2YuanMnO1xuXG4vKiogVXNlZCB0byBtYXAgTGF0aW4gVW5pY29kZSBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMuICovXG52YXIgZGVidXJyZWRMZXR0ZXJzID0ge1xuICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICdcXHhjMCc6ICdBJywgICdcXHhjMSc6ICdBJywgJ1xceGMyJzogJ0EnLCAnXFx4YzMnOiAnQScsICdcXHhjNCc6ICdBJywgJ1xceGM1JzogJ0EnLFxuICAnXFx4ZTAnOiAnYScsICAnXFx4ZTEnOiAnYScsICdcXHhlMic6ICdhJywgJ1xceGUzJzogJ2EnLCAnXFx4ZTQnOiAnYScsICdcXHhlNSc6ICdhJyxcbiAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAnXFx4ZDAnOiAnRCcsICAnXFx4ZjAnOiAnZCcsXG4gICdcXHhjOCc6ICdFJywgICdcXHhjOSc6ICdFJywgJ1xceGNhJzogJ0UnLCAnXFx4Y2InOiAnRScsXG4gICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICdcXHhjYyc6ICdJJywgICdcXHhjZCc6ICdJJywgJ1xceGNlJzogJ0knLCAnXFx4Y2YnOiAnSScsXG4gICdcXHhlYyc6ICdpJywgICdcXHhlZCc6ICdpJywgJ1xceGVlJzogJ2knLCAnXFx4ZWYnOiAnaScsXG4gICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgJ1xceGQyJzogJ08nLCAgJ1xceGQzJzogJ08nLCAnXFx4ZDQnOiAnTycsICdcXHhkNSc6ICdPJywgJ1xceGQ2JzogJ08nLCAnXFx4ZDgnOiAnTycsXG4gICdcXHhmMic6ICdvJywgICdcXHhmMyc6ICdvJywgJ1xceGY0JzogJ28nLCAnXFx4ZjUnOiAnbycsICdcXHhmNic6ICdvJywgJ1xceGY4JzogJ28nLFxuICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAnXFx4ZjknOiAndScsICAnXFx4ZmEnOiAndScsICdcXHhmYic6ICd1JywgJ1xceGZjJzogJ3UnLFxuICAnXFx4ZGQnOiAnWScsICAnXFx4ZmQnOiAneScsICdcXHhmZic6ICd5JyxcbiAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgJ1xceGRlJzogJ1RoJywgJ1xceGZlJzogJ3RoJyxcbiAgJ1xceGRmJzogJ3NzJyxcbiAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgJ1xcdTAxMDAnOiAnQScsICAnXFx1MDEwMic6ICdBJywgJ1xcdTAxMDQnOiAnQScsXG4gICdcXHUwMTAxJzogJ2EnLCAgJ1xcdTAxMDMnOiAnYScsICdcXHUwMTA1JzogJ2EnLFxuICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICdcXHUwMTA3JzogJ2MnLCAgJ1xcdTAxMDknOiAnYycsICdcXHUwMTBiJzogJ2MnLCAnXFx1MDEwZCc6ICdjJyxcbiAgJ1xcdTAxMGUnOiAnRCcsICAnXFx1MDExMCc6ICdEJywgJ1xcdTAxMGYnOiAnZCcsICdcXHUwMTExJzogJ2QnLFxuICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAnXFx1MDExMyc6ICdlJywgICdcXHUwMTE1JzogJ2UnLCAnXFx1MDExNyc6ICdlJywgJ1xcdTAxMTknOiAnZScsICdcXHUwMTFiJzogJ2UnLFxuICAnXFx1MDExYyc6ICdHJywgICdcXHUwMTFlJzogJ0cnLCAnXFx1MDEyMCc6ICdHJywgJ1xcdTAxMjInOiAnRycsXG4gICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgJ1xcdTAxMjQnOiAnSCcsICAnXFx1MDEyNic6ICdIJywgJ1xcdTAxMjUnOiAnaCcsICdcXHUwMTI3JzogJ2gnLFxuICAnXFx1MDEyOCc6ICdJJywgICdcXHUwMTJhJzogJ0knLCAnXFx1MDEyYyc6ICdJJywgJ1xcdTAxMmUnOiAnSScsICdcXHUwMTMwJzogJ0knLFxuICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAnXFx1MDEzNCc6ICdKJywgICdcXHUwMTM1JzogJ2onLFxuICAnXFx1MDEzNic6ICdLJywgICdcXHUwMTM3JzogJ2snLCAnXFx1MDEzOCc6ICdrJyxcbiAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgJ1xcdTAxM2EnOiAnbCcsICAnXFx1MDEzYyc6ICdsJywgJ1xcdTAxM2UnOiAnbCcsICdcXHUwMTQwJzogJ2wnLCAnXFx1MDE0Mic6ICdsJyxcbiAgJ1xcdTAxNDMnOiAnTicsICAnXFx1MDE0NSc6ICdOJywgJ1xcdTAxNDcnOiAnTicsICdcXHUwMTRhJzogJ04nLFxuICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICdcXHUwMTRjJzogJ08nLCAgJ1xcdTAxNGUnOiAnTycsICdcXHUwMTUwJzogJ08nLFxuICAnXFx1MDE0ZCc6ICdvJywgICdcXHUwMTRmJzogJ28nLCAnXFx1MDE1MSc6ICdvJyxcbiAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICdcXHUwMTU1JzogJ3InLCAgJ1xcdTAxNTcnOiAncicsICdcXHUwMTU5JzogJ3InLFxuICAnXFx1MDE1YSc6ICdTJywgICdcXHUwMTVjJzogJ1MnLCAnXFx1MDE1ZSc6ICdTJywgJ1xcdTAxNjAnOiAnUycsXG4gICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgJ1xcdTAxNjInOiAnVCcsICAnXFx1MDE2NCc6ICdUJywgJ1xcdTAxNjYnOiAnVCcsXG4gICdcXHUwMTYzJzogJ3QnLCAgJ1xcdTAxNjUnOiAndCcsICdcXHUwMTY3JzogJ3QnLFxuICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgJ1xcdTAxNjknOiAndScsICAnXFx1MDE2Yic6ICd1JywgJ1xcdTAxNmQnOiAndScsICdcXHUwMTZmJzogJ3UnLCAnXFx1MDE3MSc6ICd1JywgJ1xcdTAxNzMnOiAndScsXG4gICdcXHUwMTc0JzogJ1cnLCAgJ1xcdTAxNzUnOiAndycsXG4gICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAnXFx1MDE3OSc6ICdaJywgICdcXHUwMTdiJzogJ1onLCAnXFx1MDE3ZCc6ICdaJyxcbiAgJ1xcdTAxN2EnOiAneicsICAnXFx1MDE3Yyc6ICd6JywgJ1xcdTAxN2UnOiAneicsXG4gICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAnXFx1MDE1Mic6ICdPZScsICdcXHUwMTUzJzogJ29lJyxcbiAgJ1xcdTAxNDknOiBcIiduXCIsICdcXHUwMTdmJzogJ3MnXG59O1xuXG4vKipcbiAqIFVzZWQgYnkgYF8uZGVidXJyYCB0byBjb252ZXJ0IExhdGluLTEgU3VwcGxlbWVudCBhbmQgTGF0aW4gRXh0ZW5kZWQtQVxuICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbGV0dGVyIFRoZSBtYXRjaGVkIGxldHRlciB0byBkZWJ1cnIuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gKi9cbnZhciBkZWJ1cnJMZXR0ZXIgPSBiYXNlUHJvcGVydHlPZihkZWJ1cnJlZExldHRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBkZWJ1cnJMZXR0ZXI7XG4iLCJpbXBvcnQgZ2V0TmF0aXZlIGZyb20gJy4vX2dldE5hdGl2ZS5qcyc7XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgIGZ1bmMoe30sICcnLCB7fSk7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVQcm9wZXJ0eTtcbiIsImltcG9ydCBTZXRDYWNoZSBmcm9tICcuL19TZXRDYWNoZS5qcyc7XG5pbXBvcnQgYXJyYXlTb21lIGZyb20gJy4vX2FycmF5U29tZS5qcyc7XG5pbXBvcnQgY2FjaGVIYXMgZnJvbSAnLi9fY2FjaGVIYXMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsXG4gICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvclxuICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7QXJyYXl9IG90aGVyIFRoZSBvdGhlciBhcnJheSB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcblxuICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gIHZhciBhcnJTdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTtcbiAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgcmV0dXJuIGFyclN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBhcnJheTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IHRydWUsXG4gICAgICBzZWVuID0gKGJpdG1hc2sgJiBDT01QQVJFX1VOT1JERVJFRF9GTEFHKSA/IG5ldyBTZXRDYWNoZSA6IHVuZGVmaW5lZDtcblxuICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XG5cbiAgLy8gSWdub3JlIG5vbi1pbmRleCBwcm9wZXJ0aWVzLlxuICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgIHZhciBhcnJWYWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltpbmRleF07XG5cbiAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgfVxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgIGlmIChzZWVuKSB7XG4gICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7XG4gICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spKSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkge1xuICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghKFxuICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spXG4gICAgICAgICkpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XG4gIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGVxdWFsQXJyYXlzO1xuIiwiaW1wb3J0IFN5bWJvbCBmcm9tICcuL19TeW1ib2wuanMnO1xuaW1wb3J0IFVpbnQ4QXJyYXkgZnJvbSAnLi9fVWludDhBcnJheS5qcyc7XG5pbXBvcnQgZXEgZnJvbSAnLi9lcS5qcyc7XG5pbXBvcnQgZXF1YWxBcnJheXMgZnJvbSAnLi9fZXF1YWxBcnJheXMuanMnO1xuaW1wb3J0IG1hcFRvQXJyYXkgZnJvbSAnLi9fbWFwVG9BcnJheS5qcyc7XG5pbXBvcnQgc2V0VG9BcnJheSBmcm9tICcuL19zZXRUb0FycmF5LmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovXG52YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLFxuICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJyxcbiAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLFxuICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJyxcbiAgICBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcbiAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxudmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XSc7XG5cbi8qKiBVc2VkIHRvIGNvbnZlcnQgc3ltYm9scyB0byBwcmltaXRpdmVzIGFuZCBzdHJpbmdzLiAqL1xudmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3IgY29tcGFyaW5nIG9iamVjdHMgb2ZcbiAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gKlxuICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjb21wYXJpbmcgdmFsdWVzIHdpdGggdGFncyBvZlxuICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdHMgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgKG9iamVjdC5ieXRlT2Zmc2V0ICE9IG90aGVyLmJ5dGVPZmZzZXQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XG4gICAgICBvdGhlciA9IG90aGVyLmJ1ZmZlcjtcblxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSBib29sVGFnOlxuICAgIGNhc2UgZGF0ZVRhZzpcbiAgICBjYXNlIG51bWJlclRhZzpcbiAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLlxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XG5cbiAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcblxuICAgIGNhc2UgcmVnZXhwVGFnOlxuICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cyxcbiAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmdcbiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTtcblxuICAgIGNhc2UgbWFwVGFnOlxuICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgY2FzZSBzZXRUYWc6XG4gICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHO1xuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KG9iamVjdCk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XG4gICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgIGlmIChzeW1ib2xWYWx1ZU9mKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpO1xuICAgICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXF1YWxCeVRhZztcbiIsImltcG9ydCBnZXRBbGxLZXlzIGZyb20gJy4vX2dldEFsbEtleXMuanMnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbnZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDE7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3JcbiAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7XG4gIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsXG4gICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCxcbiAgICAgIG90aFByb3BzID0gZ2V0QWxsS2V5cyhvdGhlciksXG4gICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7XG4gIHdoaWxlIChpbmRleC0tKSB7XG4gICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLlxuICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHtcbiAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgfVxuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcbiAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICBzdGFjay5zZXQob3RoZXIsIG9iamVjdCk7XG5cbiAgdmFyIHNraXBDdG9yID0gaXNQYXJ0aWFsO1xuICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICB2YXIgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcbiAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpXG4gICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICApKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7XG4gIH1cbiAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHtcbiAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgLy8gTm9uIGBPYmplY3RgIG9iamVjdCBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1YWwuXG4gICAgaWYgKG9iakN0b3IgIT0gb3RoQ3RvciAmJlxuICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgISh0eXBlb2Ygb2JqQ3RvciA9PSAnZnVuY3Rpb24nICYmIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXG4gICAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvdGhDdG9yIGluc3RhbmNlb2Ygb3RoQ3RvcikpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXF1YWxPYmplY3RzO1xuIiwiaW1wb3J0IGZsYXR0ZW4gZnJvbSAnLi9mbGF0dGVuLmpzJztcbmltcG9ydCBvdmVyUmVzdCBmcm9tICcuL19vdmVyUmVzdC5qcyc7XG5pbXBvcnQgc2V0VG9TdHJpbmcgZnJvbSAnLi9fc2V0VG9TdHJpbmcuanMnO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCwgZmxhdHRlbiksIGZ1bmMgKyAnJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZsYXRSZXN0O1xuIiwiLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuZXhwb3J0IGRlZmF1bHQgZnJlZUdsb2JhbDtcbiIsImltcG9ydCBiYXNlR2V0QWxsS2V5cyBmcm9tICcuL19iYXNlR2V0QWxsS2V5cy5qcyc7XG5pbXBvcnQgZ2V0U3ltYm9scyBmcm9tICcuL19nZXRTeW1ib2xzLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5cywgZ2V0U3ltYm9scyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldEFsbEtleXM7XG4iLCJpbXBvcnQgYmFzZUdldEFsbEtleXMgZnJvbSAnLi9fYmFzZUdldEFsbEtleXMuanMnO1xuaW1wb3J0IGdldFN5bWJvbHNJbiBmcm9tICcuL19nZXRTeW1ib2xzSW4uanMnO1xuaW1wb3J0IGtleXNJbiBmcm9tICcuL2tleXNJbi5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZFxuICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy5cbiAqL1xuZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldEFsbEtleXNJbjtcbiIsImltcG9ydCBtZXRhTWFwIGZyb20gJy4vX21ldGFNYXAuanMnO1xuaW1wb3J0IG5vb3AgZnJvbSAnLi9ub29wLmpzJztcblxuLyoqXG4gKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gKi9cbnZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykge1xuICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXREYXRhO1xuIiwiaW1wb3J0IHJlYWxOYW1lcyBmcm9tICcuL19yZWFsTmFtZXMuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgdmFyIHJlc3VsdCA9IChmdW5jLm5hbWUgKyAnJyksXG4gICAgICBhcnJheSA9IHJlYWxOYW1lc1tyZXN1bHRdLFxuICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHZhciBkYXRhID0gYXJyYXlbbGVuZ3RoXSxcbiAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgIGlmIChvdGhlckZ1bmMgPT0gbnVsbCB8fCBvdGhlckZ1bmMgPT0gZnVuYykge1xuICAgICAgcmV0dXJuIGRhdGEubmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0RnVuY05hbWU7XG4iLCIvKipcbiAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gIHZhciBvYmplY3QgPSBmdW5jO1xuICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRIb2xkZXI7XG4iLCJpbXBvcnQgaXNLZXlhYmxlIGZyb20gJy4vX2lzS2V5YWJsZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHtcbiAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187XG4gIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddXG4gICAgOiBkYXRhLm1hcDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0TWFwRGF0YTtcbiIsImltcG9ydCBpc1N0cmljdENvbXBhcmFibGUgZnJvbSAnLi9faXNTdHJpY3RDb21wYXJhYmxlLmpzJztcbmltcG9ydCBrZXlzIGZyb20gJy4va2V5cy5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbWF0Y2ggZGF0YSBvZiBgb2JqZWN0YC5cbiAqL1xuZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxuICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sXG4gICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICByZXN1bHRbbGVuZ3RoXSA9IFtrZXksIHZhbHVlLCBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRNYXRjaERhdGE7XG4iLCJpbXBvcnQgYmFzZUlzTmF0aXZlIGZyb20gJy4vX2Jhc2VJc05hdGl2ZS5qcyc7XG5pbXBvcnQgZ2V0VmFsdWUgZnJvbSAnLi9fZ2V0VmFsdWUuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZ1bmN0aW9uIGlmIGl0J3MgbmF0aXZlLCBlbHNlIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHtcbiAgdmFyIHZhbHVlID0gZ2V0VmFsdWUob2JqZWN0LCBrZXkpO1xuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXROYXRpdmU7XG4iLCJpbXBvcnQgb3ZlckFyZyBmcm9tICcuL19vdmVyQXJnLmpzJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbmV4cG9ydCBkZWZhdWx0IGdldFByb3RvdHlwZTtcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRSYXdUYWc7XG4iLCJpbXBvcnQgYXJyYXlGaWx0ZXIgZnJvbSAnLi9fYXJyYXlGaWx0ZXIuanMnO1xuaW1wb3J0IHN0dWJBcnJheSBmcm9tICcuL3N0dWJBcnJheS5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlID0gb2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gKi9cbnZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXkgOiBmdW5jdGlvbihvYmplY3QpIHtcbiAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICByZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChvYmplY3QsIHN5bWJvbCk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZ2V0U3ltYm9scztcbiIsImltcG9ydCBhcnJheVB1c2ggZnJvbSAnLi9fYXJyYXlQdXNoLmpzJztcbmltcG9ydCBnZXRQcm90b3R5cGUgZnJvbSAnLi9fZ2V0UHJvdG90eXBlLmpzJztcbmltcG9ydCBnZXRTeW1ib2xzIGZyb20gJy4vX2dldFN5bWJvbHMuanMnO1xuaW1wb3J0IHN0dWJBcnJheSBmcm9tICcuL3N0dWJBcnJheS5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy5cbiAqL1xudmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgd2hpbGUgKG9iamVjdCkge1xuICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgb2JqZWN0ID0gZ2V0UHJvdG90eXBlKG9iamVjdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldFN5bWJvbHNJbjtcbiIsImltcG9ydCBEYXRhVmlldyBmcm9tICcuL19EYXRhVmlldy5qcyc7XG5pbXBvcnQgTWFwIGZyb20gJy4vX01hcC5qcyc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICcuL19Qcm9taXNlLmpzJztcbmltcG9ydCBTZXQgZnJvbSAnLi9fU2V0LmpzJztcbmltcG9ydCBXZWFrTWFwIGZyb20gJy4vX1dlYWtNYXAuanMnO1xuaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgdG9Tb3VyY2UgZnJvbSAnLi9fdG9Tb3VyY2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXG4gICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcbiAgICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xuXG52YXIgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgbWFwcywgc2V0cywgYW5kIHdlYWttYXBzLiAqL1xudmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICBtYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoTWFwKSxcbiAgICBwcm9taXNlQ3RvclN0cmluZyA9IHRvU291cmNlKFByb21pc2UpLFxuICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gdG9Tb3VyY2UoV2Vha01hcCk7XG5cbi8qKlxuICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbnZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4vLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuXG5pZiAoKERhdGFWaWV3ICYmIGdldFRhZyhuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWcpIHx8XG4gICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHxcbiAgICAoU2V0ICYmIGdldFRhZyhuZXcgU2V0KSAhPSBzZXRUYWcpIHx8XG4gICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciByZXN1bHQgPSBiYXNlR2V0VGFnKHZhbHVlKSxcbiAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgY3RvclN0cmluZyA9IEN0b3IgPyB0b1NvdXJjZShDdG9yKSA6ICcnO1xuXG4gICAgaWYgKGN0b3JTdHJpbmcpIHtcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICBjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzogcmV0dXJuIGRhdGFWaWV3VGFnO1xuICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWc7XG4gICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICBjYXNlIHNldEN0b3JTdHJpbmc6IHJldHVybiBzZXRUYWc7XG4gICAgICAgIGNhc2Ugd2Vha01hcEN0b3JTdHJpbmc6IHJldHVybiB3ZWFrTWFwVGFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZXRUYWc7XG4iLCIvKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBrZXlgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0VmFsdWU7XG4iLCIvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi9cbnZhciByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgIHJlU3BsaXREZXRhaWxzID0gLyw/ICYgLztcblxuLyoqXG4gKiBFeHRyYWN0cyB3cmFwcGVyIGRldGFpbHMgZnJvbSB0aGUgYHNvdXJjZWAgYm9keSBjb21tZW50LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIFRoZSBzb3VyY2UgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBnZXRXcmFwRGV0YWlscyhzb3VyY2UpIHtcbiAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscykgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZ2V0V3JhcERldGFpbHM7XG4iLCJpbXBvcnQgY2FzdFBhdGggZnJvbSAnLi9fY2FzdFBhdGguanMnO1xuaW1wb3J0IGlzQXJndW1lbnRzIGZyb20gJy4vaXNBcmd1bWVudHMuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc0luZGV4IGZyb20gJy4vX2lzSW5kZXguanMnO1xuaW1wb3J0IGlzTGVuZ3RoIGZyb20gJy4vaXNMZW5ndGguanMnO1xuaW1wb3J0IHRvS2V5IGZyb20gJy4vX3RvS2V5LmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGV4aXN0cyBvbiBgb2JqZWN0YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xuXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgfVxuICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJlxuICAgIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc1BhdGg7XG4iLCIvKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2hhcmFjdGVyIGNsYXNzZXMuICovXG52YXIgcnNBc3RyYWxSYW5nZSA9ICdcXFxcdWQ4MDAtXFxcXHVkZmZmJyxcbiAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgY2FwdHVyZSBncm91cHMuICovXG52YXIgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHN0cmluZ3Mgd2l0aCBbemVyby13aWR0aCBqb2luZXJzIG9yIGNvZGUgcG9pbnRzIGZyb20gdGhlIGFzdHJhbCBwbGFuZXNdKGh0dHA6Ly9lZXYuZWUvYmxvZy8yMDE1LzA5LzEyL2RhcmstY29ybmVycy1vZi11bmljb2RlLykuICovXG52YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykge1xuICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzVW5pY29kZTtcbiIsIi8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHRoYXQgbmVlZCBhIG1vcmUgcm9idXN0IHJlZ2V4cCB0byBtYXRjaCB3b3Jkcy4gKi9cbnZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNVbmljb2RlV29yZDtcbiIsImltcG9ydCBuYXRpdmVDcmVhdGUgZnJvbSAnLi9fbmF0aXZlQ3JlYXRlLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBoYXNoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIEhhc2hcbiAqL1xuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307XG4gIHRoaXMuc2l6ZSA9IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc2hDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xuICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhhc2hEZWxldGU7XG4iLCJpbXBvcnQgbmF0aXZlQ3JlYXRlIGZyb20gJy4vX25hdGl2ZUNyZWF0ZS5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbnZhciBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgSGFzaFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKG5hdGl2ZUNyZWF0ZSkge1xuICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaEdldDtcbiIsImltcG9ydCBuYXRpdmVDcmVhdGUgZnJvbSAnLi9fbmF0aXZlQ3JlYXRlLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIEhhc2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBoYXNoSGFzKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQpIDogaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoSGFzO1xuIiwiaW1wb3J0IG5hdGl2ZUNyZWF0ZSBmcm9tICcuL19uYXRpdmVDcmVhdGUuanMnO1xuXG4vKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovXG52YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7XG5cbi8qKlxuICogU2V0cyB0aGUgaGFzaCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBIYXNoXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGhhc2hTZXQoa2V5LCB2YWx1ZSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gIHRoaXMuc2l6ZSArPSB0aGlzLmhhcyhrZXkpID8gMCA6IDE7XG4gIGRhdGFba2V5XSA9IChuYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCA6IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaGFzaFNldDtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xudmFyIHJlV3JhcENvbW1lbnQgPSAvXFx7KD86XFxuXFwvXFwqIFxcW3dyYXBwZWQgd2l0aCAuK1xcXSBcXCpcXC8pP1xcbj8vO1xuXG4vKipcbiAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc291cmNlLlxuICovXG5mdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgdmFyIGxlbmd0aCA9IGRldGFpbHMubGVuZ3RoO1xuICBpZiAoIWxlbmd0aCkge1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgZGV0YWlscyA9IGRldGFpbHMuam9pbihsZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xcbi8qIFt3cmFwcGVkIHdpdGggJyArIGRldGFpbHMgKyAnXSAqL1xcbicpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbnNlcnRXcmFwRGV0YWlscztcbiIsImltcG9ydCBTeW1ib2wgZnJvbSAnLi9fU3ltYm9sLmpzJztcbmltcG9ydCBpc0FyZ3VtZW50cyBmcm9tICcuL2lzQXJndW1lbnRzLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHtcbiAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICEhKHNwcmVhZGFibGVTeW1ib2wgJiYgdmFsdWUgJiYgdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZsYXR0ZW5hYmxlO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcy4gKi9cbnZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGluZGV4LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgaW5kZXgsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XG5cbiAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgKHR5cGUgPT0gJ251bWJlcicgfHxcbiAgICAgICh0eXBlICE9ICdzeW1ib2wnICYmIHJlSXNVaW50LnRlc3QodmFsdWUpKSkgJiZcbiAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0luZGV4O1xuIiwiaW1wb3J0IGVxIGZyb20gJy4vZXEuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNJdGVyYXRlZUNhbGw7XG4iLCJpbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzU3ltYm9sIGZyb20gJy4vaXNTeW1ib2wuanMnO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC87XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lIGFuZCBub3QgYSBwcm9wZXJ0eSBwYXRoLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHxcbiAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzS2V5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJylcbiAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpXG4gICAgOiAodmFsdWUgPT09IG51bGwpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0tleWFibGU7XG4iLCJpbXBvcnQgTGF6eVdyYXBwZXIgZnJvbSAnLi9fTGF6eVdyYXBwZXIuanMnO1xuaW1wb3J0IGdldERhdGEgZnJvbSAnLi9fZ2V0RGF0YS5qcyc7XG5pbXBvcnQgZ2V0RnVuY05hbWUgZnJvbSAnLi9fZ2V0RnVuY05hbWUuanMnO1xuaW1wb3J0IGxvZGFzaCBmcm9tICcuL3dyYXBwZXJMb2Rhc2guanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0xhemlhYmxlKGZ1bmMpIHtcbiAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksXG4gICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgaWYgKHR5cGVvZiBvdGhlciAhPSAnZnVuY3Rpb24nIHx8ICEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoZnVuYyA9PT0gb3RoZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgZGF0YSA9IGdldERhdGEob3RoZXIpO1xuICByZXR1cm4gISFkYXRhICYmIGZ1bmMgPT09IGRhdGFbMF07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTGF6aWFibGU7XG4iLCJpbXBvcnQgY29yZUpzRGF0YSBmcm9tICcuL19jb3JlSnNEYXRhLmpzJztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbnZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdWlkID0gL1teLl0rJC8uZXhlYyhjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8gfHwgJycpO1xuICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG59KCkpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2VkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHtcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiAobWFza1NyY0tleSBpbiBmdW5jKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNNYXNrZWQ7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxpa2VseSBhIHByb3RvdHlwZSBvYmplY3QuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpIHtcbiAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xuXG4gIHJldHVybiB2YWx1ZSA9PT0gcHJvdG87XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzUHJvdG90eXBlO1xuIiwiaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciBzdHJpY3QgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGkuZS4gYD09PWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdFxuICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzU3RyaWN0Q29tcGFyYWJsZTtcbiIsIi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuX19kYXRhX18gPSBbXTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlQ2xlYXI7XG4iLCJpbXBvcnQgYXNzb2NJbmRleE9mIGZyb20gJy4vX2Fzc29jSW5kZXhPZi5qcyc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcblxuLyoqXG4gKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZGVsZXRlXG4gKiBAbWVtYmVyT2YgTGlzdENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xuXG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTtcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgIGRhdGEucG9wKCk7XG4gIH0gZWxzZSB7XG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICB9XG4gIC0tdGhpcy5zaXplO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlRGVsZXRlO1xuIiwiaW1wb3J0IGFzc29jSW5kZXhPZiBmcm9tICcuL19hc3NvY0luZGV4T2YuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyxcbiAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0Q2FjaGVHZXQ7XG4iLCJpbXBvcnQgYXNzb2NJbmRleE9mIGZyb20gJy4vX2Fzc29jSW5kZXhPZi5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgbGlzdCBjYWNoZSB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsaXN0Q2FjaGVIYXM7XG4iLCJpbXBvcnQgYXNzb2NJbmRleE9mIGZyb20gJy4vX2Fzc29jSW5kZXhPZi5qcyc7XG5cbi8qKlxuICogU2V0cyB0aGUgbGlzdCBjYWNoZSBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gbGlzdENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgKyt0aGlzLnNpemU7XG4gICAgZGF0YS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0gZWxzZSB7XG4gICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGlzdENhY2hlU2V0O1xuIiwiaW1wb3J0IEhhc2ggZnJvbSAnLi9fSGFzaC5qcyc7XG5pbXBvcnQgTGlzdENhY2hlIGZyb20gJy4vX0xpc3RDYWNoZS5qcyc7XG5pbXBvcnQgTWFwIGZyb20gJy4vX01hcC5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgbWFwLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBjbGVhclxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKSB7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX19kYXRhX18gPSB7XG4gICAgJ2hhc2gnOiBuZXcgSGFzaCxcbiAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAnc3RyaW5nJzogbmV3IEhhc2hcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwQ2FjaGVDbGVhcjtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGRlbGV0ZVxuICogQG1lbWJlck9mIE1hcENhY2hlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAqL1xuZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7XG4gIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwQ2FjaGVEZWxldGU7XG4iLCJpbXBvcnQgZ2V0TWFwRGF0YSBmcm9tICcuL19nZXRNYXBEYXRhLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXAgdmFsdWUgZm9yIGBrZXlgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBnZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmdldChrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUdldDtcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIG1hcCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xuICByZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtYXBDYWNoZUhhcztcbiIsImltcG9ydCBnZXRNYXBEYXRhIGZyb20gJy4vX2dldE1hcERhdGEuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBzZXRcbiAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcbiAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICBzaXplID0gZGF0YS5zaXplO1xuXG4gIGRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcENhY2hlU2V0O1xuIiwiLyoqXG4gKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICovXG5mdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICBtYXAuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgcmVzdWx0WysraW5kZXhdID0gW2tleSwgdmFsdWVdO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwVG9BcnJheTtcbiIsIi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkge1xuICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiZcbiAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7XG4iLCJpbXBvcnQgbWVtb2l6ZSBmcm9tICcuL21lbW9pemUuanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgbWF4aW11bSBtZW1vaXplIGNhY2hlIHNpemUuICovXG52YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gKiBjYWNoZSB3aGVuIGl0IGV4Y2VlZHMgYE1BWF9NRU1PSVpFX1NJWkVgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gbWVtb2l6ZUNhcHBlZChmdW5jKSB7XG4gIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkge1xuICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICBjYWNoZS5jbGVhcigpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9KTtcblxuICB2YXIgY2FjaGUgPSByZXN1bHQuY2FjaGU7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1lbW9pemVDYXBwZWQ7XG4iLCJpbXBvcnQgY29tcG9zZUFyZ3MgZnJvbSAnLi9fY29tcG9zZUFyZ3MuanMnO1xuaW1wb3J0IGNvbXBvc2VBcmdzUmlnaHQgZnJvbSAnLi9fY29tcG9zZUFyZ3NSaWdodC5qcyc7XG5pbXBvcnQgcmVwbGFjZUhvbGRlcnMgZnJvbSAnLi9fcmVwbGFjZUhvbGRlcnMuanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgaW50ZXJuYWwgYXJndW1lbnQgcGxhY2Vob2xkZXIuICovXG52YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgV1JBUF9DVVJSWV9GTEFHID0gOCxcbiAgICBXUkFQX0FSWV9GTEFHID0gMTI4LFxuICAgIFdSQVBfUkVBUkdfRkxBRyA9IDI1NjtcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIE1lcmdlcyB0aGUgZnVuY3Rpb24gbWV0YWRhdGEgb2YgYHNvdXJjZWAgaW50byBgZGF0YWAuXG4gKlxuICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgdXNlZCB0byBpbnZva2UgYSBmdW5jdGlvbi5cbiAqIFRoaXMgaXMgcG9zc2libGUgYmVjYXVzZSBtZXRob2RzIGxpa2UgYF8uYmluZGAsIGBfLmN1cnJ5YCwgYW5kIGBfLnBhcnRpYWxgXG4gKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gKiBgXy5yZWFyZ2AgbW9kaWZ5IGZ1bmN0aW9uIGFyZ3VtZW50cywgbWFraW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZVxuICogZXhlY3V0ZWQgaW1wb3J0YW50LCBwcmV2ZW50aW5nIHRoZSBtZXJnaW5nIG9mIG1ldGFkYXRhLiBIb3dldmVyLCB3ZSBtYWtlXG4gKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICogYW5kIG9yIGBfLnJlYXJnYCBhcHBsaWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fSBkYXRhIFRoZSBkZXN0aW5hdGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgc291cmNlIG1ldGFkYXRhLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VEYXRhKGRhdGEsIHNvdXJjZSkge1xuICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICBzcmNCaXRtYXNrID0gc291cmNlWzFdLFxuICAgICAgbmV3Qml0bWFzayA9IGJpdG1hc2sgfCBzcmNCaXRtYXNrLFxuICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgdmFyIGlzQ29tYm8gPVxuICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fFxuICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICgoc3JjQml0bWFzayA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfUkVBUkdfRkxBRykpICYmIChzb3VyY2VbN10ubGVuZ3RoIDw9IHNvdXJjZVs4XSkgJiYgKGJpdG1hc2sgPT0gV1JBUF9DVVJSWV9GTEFHKSk7XG5cbiAgLy8gRXhpdCBlYXJseSBpZiBtZXRhZGF0YSBjYW4ndCBiZSBtZXJnZWQuXG4gIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICBpZiAoc3JjQml0bWFzayAmIFdSQVBfQklORF9GTEFHKSB7XG4gICAgZGF0YVsyXSA9IHNvdXJjZVsyXTtcbiAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgIG5ld0JpdG1hc2sgfD0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHID8gMCA6IFdSQVBfQ1VSUllfQk9VTkRfRkxBRztcbiAgfVxuICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICB2YXIgdmFsdWUgPSBzb3VyY2VbM107XG4gIGlmICh2YWx1ZSkge1xuICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgZGF0YVszXSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3MocGFydGlhbHMsIHZhbHVlLCBzb3VyY2VbNF0pIDogdmFsdWU7XG4gICAgZGF0YVs0XSA9IHBhcnRpYWxzID8gcmVwbGFjZUhvbGRlcnMoZGF0YVszXSwgUExBQ0VIT0xERVIpIDogc291cmNlWzRdO1xuICB9XG4gIC8vIENvbXBvc2UgcGFydGlhbCByaWdodCBhcmd1bWVudHMuXG4gIHZhbHVlID0gc291cmNlWzVdO1xuICBpZiAodmFsdWUpIHtcbiAgICBwYXJ0aWFscyA9IGRhdGFbNV07XG4gICAgZGF0YVs1XSA9IHBhcnRpYWxzID8gY29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscywgdmFsdWUsIHNvdXJjZVs2XSkgOiB2YWx1ZTtcbiAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gIH1cbiAgLy8gVXNlIHNvdXJjZSBgYXJnUG9zYCBpZiBhdmFpbGFibGUuXG4gIHZhbHVlID0gc291cmNlWzddO1xuICBpZiAodmFsdWUpIHtcbiAgICBkYXRhWzddID0gdmFsdWU7XG4gIH1cbiAgLy8gVXNlIHNvdXJjZSBgYXJ5YCBpZiBpdCdzIHNtYWxsZXIuXG4gIGlmIChzcmNCaXRtYXNrICYgV1JBUF9BUllfRkxBRykge1xuICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgfVxuICAvLyBVc2Ugc291cmNlIGBhcml0eWAgaWYgb25lIGlzIG5vdCBwcm92aWRlZC5cbiAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgIGRhdGFbOV0gPSBzb3VyY2VbOV07XG4gIH1cbiAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICBkYXRhWzBdID0gc291cmNlWzBdO1xuICBkYXRhWzFdID0gbmV3Qml0bWFzaztcblxuICByZXR1cm4gZGF0YTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWVyZ2VEYXRhO1xuIiwiaW1wb3J0IFdlYWtNYXAgZnJvbSAnLi9fV2Vha01hcC5qcyc7XG5cbi8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIG1ldGFNYXAgPSBXZWFrTWFwICYmIG5ldyBXZWFrTWFwO1xuXG5leHBvcnQgZGVmYXVsdCBtZXRhTWFwO1xuIiwiaW1wb3J0IGdldE5hdGl2ZSBmcm9tICcuL19nZXROYXRpdmUuanMnO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovXG52YXIgbmF0aXZlQ3JlYXRlID0gZ2V0TmF0aXZlKE9iamVjdCwgJ2NyZWF0ZScpO1xuXG5leHBvcnQgZGVmYXVsdCBuYXRpdmVDcmVhdGU7XG4iLCJpbXBvcnQgb3ZlckFyZyBmcm9tICcuL19vdmVyQXJnLmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpO1xuXG5leHBvcnQgZGVmYXVsdCBuYXRpdmVLZXlzO1xuIiwiLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBpZiAob2JqZWN0ICE9IG51bGwpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG5hdGl2ZUtleXNJbjtcbiIsImltcG9ydCBmcmVlR2xvYmFsIGZyb20gJy4vX2ZyZWVHbG9iYWwuanMnO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGV4cG9ydHNgLiAqL1xudmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuICovXG52YXIgZnJlZU1vZHVsZSA9IGZyZWVFeHBvcnRzICYmIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXG4vKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xudmFyIG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbi8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqL1xudmFyIG5vZGVVdGlsID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLlxuICAgIHZhciB0eXBlcyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlICYmIGZyZWVNb2R1bGUucmVxdWlyZSgndXRpbCcpLnR5cGVzO1xuXG4gICAgaWYgKHR5cGVzKSB7XG4gICAgICByZXR1cm4gdHlwZXM7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICByZXR1cm4gZnJlZVByb2Nlc3MgJiYgZnJlZVByb2Nlc3MuYmluZGluZyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nKCd1dGlsJyk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59KCkpO1xuXG5leHBvcnQgZGVmYXVsdCBub2RlVXRpbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBvYmplY3RUb1N0cmluZztcbiIsIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBvdmVyQXJnO1xuIiwiaW1wb3J0IGFwcGx5IGZyb20gJy4vX2FwcGx5LmpzJztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHtcbiAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSxcbiAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFycmF5W2luZGV4XSA9IGFyZ3Nbc3RhcnQgKyBpbmRleF07XG4gICAgfVxuICAgIGluZGV4ID0gLTE7XG4gICAgdmFyIG90aGVyQXJncyA9IEFycmF5KHN0YXJ0ICsgMSk7XG4gICAgd2hpbGUgKCsraW5kZXggPCBzdGFydCkge1xuICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgIH1cbiAgICBvdGhlckFyZ3Nbc3RhcnRdID0gdHJhbnNmb3JtKGFycmF5KTtcbiAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgb3ZlclJlc3Q7XG4iLCJpbXBvcnQgYmFzZUdldCBmcm9tICcuL19iYXNlR2V0LmpzJztcbmltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcblxuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fSBwYXRoIFRoZSBwYXRoIHRvIGdldCB0aGUgcGFyZW50IHZhbHVlIG9mLlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gcGFyZW50KG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwYXJlbnQ7XG4iLCIvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi9cbnZhciByZWFsTmFtZXMgPSB7fTtcblxuZXhwb3J0IGRlZmF1bHQgcmVhbE5hbWVzO1xuIiwiaW1wb3J0IGNvcHlBcnJheSBmcm9tICcuL19jb3B5QXJyYXkuanMnO1xuaW1wb3J0IGlzSW5kZXggZnJvbSAnLi9faXNJbmRleC5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdFxuICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICogdGhlIHNlY29uZCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgc2Vjb25kIGVsZW1lbnQsIGFuZCBzbyBvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHJlb3JkZXIuXG4gKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gKi9cbmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHtcbiAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCwgYXJyTGVuZ3RoKSxcbiAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07XG4gICAgYXJyYXlbbGVuZ3RoXSA9IGlzSW5kZXgoaW5kZXgsIGFyckxlbmd0aCkgPyBvbGRBcnJheVtpbmRleF0gOiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG5leHBvcnQgZGVmYXVsdCByZW9yZGVyO1xuIiwiLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xudmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nO1xuXG4vKipcbiAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHJlcGxhY2UuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICovXG5mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgYXJyYXlbaW5kZXhdID0gUExBQ0VIT0xERVI7XG4gICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgcmVwbGFjZUhvbGRlcnM7XG4iLCJpbXBvcnQgZnJlZUdsb2JhbCBmcm9tICcuL19mcmVlR2xvYmFsLmpzJztcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5leHBvcnQgZGVmYXVsdCByb290O1xuIiwiLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqL1xudmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4vKipcbiAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGFkZFxuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAYWxpYXMgcHVzaFxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcbiAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldENhY2hlQWRkO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiB0aGUgYXJyYXkgY2FjaGUuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIGhhc1xuICogQG1lbWJlck9mIFNldENhY2hlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXRDYWNoZUhhcztcbiIsImltcG9ydCBiYXNlU2V0RGF0YSBmcm9tICcuL19iYXNlU2V0RGF0YS5qcyc7XG5pbXBvcnQgc2hvcnRPdXQgZnJvbSAnLi9fc2hvcnRPdXQuanMnO1xuXG4vKipcbiAqIFNldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAqXG4gKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAqIHBlcmlvZCBvZiB0aW1lLCBpdCB3aWxsIHRyaXAgaXRzIGJyZWFrZXIgYW5kIHRyYW5zaXRpb24gdG8gYW4gaWRlbnRpdHlcbiAqIGZ1bmN0aW9uIHRvIGF2b2lkIGdhcmJhZ2UgY29sbGVjdGlvbiBwYXVzZXMgaW4gVjguIFNlZVxuICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAqIEBwYXJhbSB7Kn0gZGF0YSBUaGUgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0RGF0YSA9IHNob3J0T3V0KGJhc2VTZXREYXRhKTtcblxuZXhwb3J0IGRlZmF1bHQgc2V0RGF0YTtcbiIsIi8qKlxuICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgdmFyIGluZGV4ID0gLTEsXG4gICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7XG5cbiAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNldFRvQXJyYXk7XG4iLCJpbXBvcnQgYmFzZVNldFRvU3RyaW5nIGZyb20gJy4vX2Jhc2VTZXRUb1N0cmluZy5qcyc7XG5pbXBvcnQgc2hvcnRPdXQgZnJvbSAnLi9fc2hvcnRPdXQuanMnO1xuXG4vKipcbiAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICovXG52YXIgc2V0VG9TdHJpbmcgPSBzaG9ydE91dChiYXNlU2V0VG9TdHJpbmcpO1xuXG5leHBvcnQgZGVmYXVsdCBzZXRUb1N0cmluZztcbiIsImltcG9ydCBnZXRXcmFwRGV0YWlscyBmcm9tICcuL19nZXRXcmFwRGV0YWlscy5qcyc7XG5pbXBvcnQgaW5zZXJ0V3JhcERldGFpbHMgZnJvbSAnLi9faW5zZXJ0V3JhcERldGFpbHMuanMnO1xuaW1wb3J0IHNldFRvU3RyaW5nIGZyb20gJy4vX3NldFRvU3RyaW5nLmpzJztcbmltcG9ydCB1cGRhdGVXcmFwRGV0YWlscyBmcm9tICcuL191cGRhdGVXcmFwRGV0YWlscy5qcyc7XG5cbi8qKlxuICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYHdyYXBwZXJgIHRvIG1pbWljIHRoZSBzb3VyY2Ugb2YgYHJlZmVyZW5jZWBcbiAqIHdpdGggd3JhcHBlciBkZXRhaWxzIGluIGEgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgYm9keS5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcHBlciBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGB3cmFwcGVyYC5cbiAqL1xuZnVuY3Rpb24gc2V0V3JhcFRvU3RyaW5nKHdyYXBwZXIsIHJlZmVyZW5jZSwgYml0bWFzaykge1xuICB2YXIgc291cmNlID0gKHJlZmVyZW5jZSArICcnKTtcbiAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2V0V3JhcFRvU3RyaW5nO1xuIiwiLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xudmFyIEhPVF9DT1VOVCA9IDgwMCxcbiAgICBIT1RfU1BBTiA9IDE2O1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTm93ID0gRGF0ZS5ub3c7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQnbGwgc2hvcnQgb3V0IGFuZCBpbnZva2UgYGlkZW50aXR5YCBpbnN0ZWFkXG4gKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAqIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzaG9ydGFibGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHtcbiAgdmFyIGNvdW50ID0gMCxcbiAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSxcbiAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgIGxhc3RDYWxsZWQgPSBzdGFtcDtcbiAgICBpZiAocmVtYWluaW5nID4gMCkge1xuICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHNbMF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaG9ydE91dDtcbiIsImltcG9ydCBMaXN0Q2FjaGUgZnJvbSAnLi9fTGlzdENhY2hlLmpzJztcblxuLyoqXG4gKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgY2xlYXJcbiAqIEBtZW1iZXJPZiBTdGFja1xuICovXG5mdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTtcbiAgdGhpcy5zaXplID0gMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhY2tDbGVhcjtcbiIsIi8qKlxuICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBkZWxldGVcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpO1xuXG4gIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhY2tEZWxldGU7XG4iLCIvKipcbiAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQG5hbWUgZ2V0XG4gKiBAbWVtYmVyT2YgU3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICovXG5mdW5jdGlvbiBzdGFja0dldChrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0YWNrR2V0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAbmFtZSBoYXNcbiAqIEBtZW1iZXJPZiBTdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIHN0YWNrSGFzKGtleSkge1xuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhY2tIYXM7XG4iLCJpbXBvcnQgTGlzdENhY2hlIGZyb20gJy4vX0xpc3RDYWNoZS5qcyc7XG5pbXBvcnQgTWFwIGZyb20gJy4vX01hcC5qcyc7XG5pbXBvcnQgTWFwQ2FjaGUgZnJvbSAnLi9fTWFwQ2FjaGUuanMnO1xuXG4vKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi9cbnZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwO1xuXG4vKipcbiAqIFNldHMgdGhlIHN0YWNrIGBrZXlgIHRvIGB2YWx1ZWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBuYW1lIHNldFxuICogQG1lbWJlck9mIFN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIHN0YWNrIGNhY2hlIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBzdGFja1NldChrZXksIHZhbHVlKSB7XG4gIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXztcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fO1xuICAgIGlmICghTWFwIHx8IChwYWlycy5sZW5ndGggPCBMQVJHRV9BUlJBWV9TSVpFIC0gMSkpIHtcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIHRoaXMuc2l6ZSA9ICsrZGF0YS5zaXplO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKHBhaXJzKTtcbiAgfVxuICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICByZXR1cm4gdGhpcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhY2tTZXQ7XG4iLCIvKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICovXG5mdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsXG4gICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmljdEluZGV4T2Y7XG4iLCJpbXBvcnQgYXNjaWlTaXplIGZyb20gJy4vX2FzY2lpU2l6ZS5qcyc7XG5pbXBvcnQgaGFzVW5pY29kZSBmcm9tICcuL19oYXNVbmljb2RlLmpzJztcbmltcG9ydCB1bmljb2RlU2l6ZSBmcm9tICcuL191bmljb2RlU2l6ZS5qcyc7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7XG4gIHJldHVybiBoYXNVbmljb2RlKHN0cmluZylcbiAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICA6IGFzY2lpU2l6ZShzdHJpbmcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdTaXplO1xuIiwiaW1wb3J0IGFzY2lpVG9BcnJheSBmcm9tICcuL19hc2NpaVRvQXJyYXkuanMnO1xuaW1wb3J0IGhhc1VuaWNvZGUgZnJvbSAnLi9faGFzVW5pY29kZS5qcyc7XG5pbXBvcnQgdW5pY29kZVRvQXJyYXkgZnJvbSAnLi9fdW5pY29kZVRvQXJyYXkuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5KHN0cmluZykge1xuICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgOiBhc2NpaVRvQXJyYXkoc3RyaW5nKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RyaW5nVG9BcnJheTtcbiIsImltcG9ydCBtZW1vaXplQ2FwcGVkIGZyb20gJy4vX21lbW9pemVDYXBwZWQuanMnO1xuXG4vKiogVXNlZCB0byBtYXRjaCBwcm9wZXJ0eSBuYW1lcyB3aXRoaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVQcm9wTmFtZSA9IC9bXi5bXFxdXSt8XFxbKD86KC0/XFxkKyg/OlxcLlxcZCspPyl8KFtcIiddKSgoPzooPyFcXDIpW15cXFxcXXxcXFxcLikqPylcXDIpXFxdfCg/PSg/OlxcLnxcXFtcXF0pKD86XFwufFxcW1xcXXwkKSkvZztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG52YXIgcmVFc2NhcGVDaGFyID0gL1xcXFwoXFxcXCk/L2c7XG5cbi8qKlxuICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAqL1xudmFyIHN0cmluZ1RvUGF0aCA9IG1lbW9pemVDYXBwZWQoZnVuY3Rpb24oc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgcmVzdWx0LnB1c2goJycpO1xuICB9XG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiAobnVtYmVyIHx8IG1hdGNoKSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0cmluZ1RvUGF0aDtcbiIsImltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LlxuICovXG5mdW5jdGlvbiB0b0tleSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvS2V5O1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY2AgdG8gaXRzIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuXG4gKi9cbmZ1bmN0aW9uIHRvU291cmNlKGZ1bmMpIHtcbiAgaWYgKGZ1bmMgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnVuY1RvU3RyaW5nLmNhbGwoZnVuYyk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChmdW5jICsgJycpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1NvdXJjZTtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJpbW1lZEVuZEluZGV4O1xuIiwiLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqL1xudmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFxcXHUwMzAwLVxcXFx1MDM2ZicsXG4gICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlID0gJ1xcXFx1ZmUyMC1cXFxcdWZlMmYnLFxuICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLFxuICAgIHJzVmFyUmFuZ2UgPSAnXFxcXHVmZTBlXFxcXHVmZTBmJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXN0cmFsID0gJ1snICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4vKiogVXNlZCB0byBjb21wb3NlIHVuaWNvZGUgcmVnZXhlcy4gKi9cbnZhciByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgcnNPcHRWYXIgPSAnWycgKyByc1ZhclJhbmdlICsgJ10/JyxcbiAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLFxuICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggW3N0cmluZyBzeW1ib2xzXShodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlKS4gKi9cbnZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTtcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAqL1xuZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7XG4gIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDtcbiAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICArK3Jlc3VsdDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlU2l6ZTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZic7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLFxuICAgIHJzTm9uQXN0cmFsID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICByc1N1cnJQYWlyID0gJ1tcXFxcdWQ4MDAtXFxcXHVkYmZmXVtcXFxcdWRjMDAtXFxcXHVkZmZmXScsXG4gICAgcnNaV0ogPSAnXFxcXHUyMDBkJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovXG52YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLFxuICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsXG4gICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovXG52YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbi8qKlxuICogQ29udmVydHMgYSBVbmljb2RlIGBzdHJpbmdgIHRvIGFuIGFycmF5LlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiB1bmljb2RlVG9BcnJheShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmljb2RlVG9BcnJheTtcbiIsIi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0FzdHJhbFJhbmdlID0gJ1xcXFx1ZDgwMC1cXFxcdWRmZmYnLFxuICAgIHJzQ29tYm9NYXJrc1JhbmdlID0gJ1xcXFx1MDMwMC1cXFxcdTAzNmYnLFxuICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICByc0NvbWJvU3ltYm9sc1JhbmdlID0gJ1xcXFx1MjBkMC1cXFxcdTIwZmYnLFxuICAgIHJzQ29tYm9SYW5nZSA9IHJzQ29tYm9NYXJrc1JhbmdlICsgcmVDb21ib0hhbGZNYXJrc1JhbmdlICsgcnNDb21ib1N5bWJvbHNSYW5nZSxcbiAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICByc0xvd2VyUmFuZ2UgPSAnYS16XFxcXHhkZi1cXFxceGY2XFxcXHhmOC1cXFxceGZmJyxcbiAgICByc01hdGhPcFJhbmdlID0gJ1xcXFx4YWNcXFxceGIxXFxcXHhkN1xcXFx4ZjcnLFxuICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcXFx1MjAwMC1cXFxcdTIwNmYnLFxuICAgIHJzU3BhY2VSYW5nZSA9ICcgXFxcXHRcXFxceDBiXFxcXGZcXFxceGEwXFxcXHVmZWZmXFxcXG5cXFxcclxcXFx1MjAyOFxcXFx1MjAyOVxcXFx1MTY4MFxcXFx1MTgwZVxcXFx1MjAwMFxcXFx1MjAwMVxcXFx1MjAwMlxcXFx1MjAwM1xcXFx1MjAwNFxcXFx1MjAwNVxcXFx1MjAwNlxcXFx1MjAwN1xcXFx1MjAwOFxcXFx1MjAwOVxcXFx1MjAwYVxcXFx1MjAyZlxcXFx1MjA1ZlxcXFx1MzAwMCcsXG4gICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgcnNWYXJSYW5nZSA9ICdcXFxcdWZlMGVcXFxcdWZlMGYnLFxuICAgIHJzQnJlYWtSYW5nZSA9IHJzTWF0aE9wUmFuZ2UgKyByc05vbkNoYXJSYW5nZSArIHJzUHVuY3R1YXRpb25SYW5nZSArIHJzU3BhY2VSYW5nZTtcblxuLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xudmFyIHJzQXBvcyA9IFwiWydcXHUyMDE5XVwiLFxuICAgIHJzQnJlYWsgPSAnWycgKyByc0JyZWFrUmFuZ2UgKyAnXScsXG4gICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICByc0RpZ2l0cyA9ICdcXFxcZCsnLFxuICAgIHJzRGluZ2JhdCA9ICdbJyArIHJzRGluZ2JhdFJhbmdlICsgJ10nLFxuICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgIHJzRml0eiA9ICdcXFxcdWQ4M2NbXFxcXHVkZmZiLVxcXFx1ZGZmZl0nLFxuICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJyxcbiAgICByc1JlZ2lvbmFsID0gJyg/OlxcXFx1ZDgzY1tcXFxcdWRkZTYtXFxcXHVkZGZmXSl7Mn0nLFxuICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICByc1VwcGVyID0gJ1snICsgcnNVcHBlclJhbmdlICsgJ10nLFxuICAgIHJzWldKID0gJ1xcXFx1MjAwZCc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xudmFyIHJzTWlzY0xvd2VyID0gJyg/OicgKyByc0xvd2VyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgIHJzTWlzY1VwcGVyID0gJyg/OicgKyByc1VwcGVyICsgJ3wnICsgcnNNaXNjICsgJyknLFxuICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgIHJzT3B0Q29udHJVcHBlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OkR8TEx8TXxSRXxTfFR8VkUpKT8nLFxuICAgIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JyxcbiAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgIHJzT3B0Sm9pbiA9ICcoPzonICsgcnNaV0ogKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsXG4gICAgcnNPcmRMb3dlciA9ICdcXFxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXFxcZHRoKSg/PVxcXFxifFtBLVpfXSknLFxuICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICByc1NlcSA9IHJzT3B0VmFyICsgcmVPcHRNb2QgKyByc09wdEpvaW4sXG4gICAgcnNFbW9qaSA9ICcoPzonICsgW3JzRGluZ2JhdCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNTZXE7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovXG52YXIgcmVVbmljb2RlV29yZCA9IFJlZ0V4cChbXG4gIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJyxcbiAgcnNVcHBlciArICc/JyArIHJzTWlzY0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyLFxuICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICByc09yZFVwcGVyLFxuICByc09yZExvd2VyLFxuICByc0RpZ2l0cyxcbiAgcnNFbW9qaVxuXS5qb2luKCd8JyksICdnJyk7XG5cbi8qKlxuICogU3BsaXRzIGEgVW5pY29kZSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gKi9cbmZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdW5pY29kZVdvcmRzO1xuIiwiaW1wb3J0IGFycmF5RWFjaCBmcm9tICcuL19hcnJheUVhY2guanMnO1xuaW1wb3J0IGFycmF5SW5jbHVkZXMgZnJvbSAnLi9fYXJyYXlJbmNsdWRlcy5qcyc7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xudmFyIFdSQVBfQklORF9GTEFHID0gMSxcbiAgICBXUkFQX0JJTkRfS0VZX0ZMQUcgPSAyLFxuICAgIFdSQVBfQ1VSUllfRkxBRyA9IDgsXG4gICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMixcbiAgICBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyA9IDY0LFxuICAgIFdSQVBfQVJZX0ZMQUcgPSAxMjgsXG4gICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LFxuICAgIFdSQVBfRkxJUF9GTEFHID0gNTEyO1xuXG4vKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL1xudmFyIHdyYXBGbGFncyA9IFtcbiAgWydhcnknLCBXUkFQX0FSWV9GTEFHXSxcbiAgWydiaW5kJywgV1JBUF9CSU5EX0ZMQUddLFxuICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLFxuICBbJ2N1cnJ5JywgV1JBUF9DVVJSWV9GTEFHXSxcbiAgWydjdXJyeVJpZ2h0JywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxcbiAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLFxuICBbJ3BhcnRpYWwnLCBXUkFQX1BBUlRJQUxfRkxBR10sXG4gIFsncGFydGlhbFJpZ2h0JywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFxuICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXVxuXTtcblxuLyoqXG4gKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRldGFpbHNgLlxuICovXG5mdW5jdGlvbiB1cGRhdGVXcmFwRGV0YWlscyhkZXRhaWxzLCBiaXRtYXNrKSB7XG4gIGFycmF5RWFjaCh3cmFwRmxhZ3MsIGZ1bmN0aW9uKHBhaXIpIHtcbiAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICBpZiAoKGJpdG1hc2sgJiBwYWlyWzFdKSAmJiAhYXJyYXlJbmNsdWRlcyhkZXRhaWxzLCB2YWx1ZSkpIHtcbiAgICAgIGRldGFpbHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGRldGFpbHMuc29ydCgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1cGRhdGVXcmFwRGV0YWlscztcbiIsImltcG9ydCBMYXp5V3JhcHBlciBmcm9tICcuL19MYXp5V3JhcHBlci5qcyc7XG5pbXBvcnQgTG9kYXNoV3JhcHBlciBmcm9tICcuL19Mb2Rhc2hXcmFwcGVyLmpzJztcbmltcG9ydCBjb3B5QXJyYXkgZnJvbSAnLi9fY29weUFycmF5LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCB3cmFwcGVyLlxuICovXG5mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcikge1xuICBpZiAod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgfVxuICB2YXIgcmVzdWx0ID0gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlci5fX3dyYXBwZWRfXywgd3JhcHBlci5fX2NoYWluX18pO1xuICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gIHJlc3VsdC5fX2luZGV4X18gID0gd3JhcHBlci5fX2luZGV4X187XG4gIHJlc3VsdC5fX3ZhbHVlc19fID0gd3JhcHBlci5fX3ZhbHVlc19fO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyQ2xvbmU7XG4iLCJpbXBvcnQgYmFzZUNsYW1wIGZyb20gJy4vX2Jhc2VDbGFtcC5qcyc7XG5pbXBvcnQgdG9OdW1iZXIgZnJvbSAnLi90b051bWJlci5qcyc7XG5cbi8qKlxuICogQ2xhbXBzIGBudW1iZXJgIHdpdGhpbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBOdW1iZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjbGFtcGVkIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5jbGFtcCgtMTAsIC01LCA1KTtcbiAqIC8vID0+IC01XG4gKlxuICogXy5jbGFtcCgxMCwgLTUsIDUpO1xuICogLy8gPT4gNVxuICovXG5mdW5jdGlvbiBjbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHVwcGVyID0gbG93ZXI7XG4gICAgbG93ZXIgPSB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICB1cHBlciA9IHRvTnVtYmVyKHVwcGVyKTtcbiAgICB1cHBlciA9IHVwcGVyID09PSB1cHBlciA/IHVwcGVyIDogMDtcbiAgfVxuICBpZiAobG93ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvd2VyID0gdG9OdW1iZXIobG93ZXIpO1xuICAgIGxvd2VyID0gbG93ZXIgPT09IGxvd2VyID8gbG93ZXIgOiAwO1xuICB9XG4gIHJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSwgbG93ZXIsIHVwcGVyKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhbXA7XG4iLCIvKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgd2l0aCBhbGwgZmFsc2V5IHZhbHVlcyByZW1vdmVkLiBUaGUgdmFsdWVzIGBmYWxzZWAsIGBudWxsYCxcbiAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5jb21wYWN0KFswLCAxLCBmYWxzZSwgMiwgJycsIDNdKTtcbiAqIC8vID0+IFsxLCAyLCAzXVxuICovXG5mdW5jdGlvbiBjb21wYWN0KGFycmF5KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICByZXNJbmRleCA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjb21wYWN0O1xuIiwiLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb25zdGFudCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uY29uc3RhbnQoeyAnYSc6IDEgfSkpO1xuICpcbiAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICogLy8gPT4gW3sgJ2EnOiAxIH0sIHsgJ2EnOiAxIH1dXG4gKlxuICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnN0YW50O1xuIiwiaW1wb3J0IGRlYnVyckxldHRlciBmcm9tICcuL19kZWJ1cnJMZXR0ZXIuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuXG4vKiogVXNlZCB0byBtYXRjaCBMYXRpbiBVbmljb2RlIGxldHRlcnMgKGV4Y2x1ZGluZyBtYXRoZW1hdGljYWwgb3BlcmF0b3JzKS4gKi9cbnZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbnZhciByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgPSAnXFxcXHVmZTIwLVxcXFx1ZmUyZicsXG4gICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXFxcdTIwZDAtXFxcXHUyMGZmJyxcbiAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2U7XG5cbi8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi9cbnZhciByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlICsgJ10nO1xuXG4vKipcbiAqIFVzZWQgdG8gbWF0Y2ggW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKSBhbmRcbiAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gKi9cbnZhciByZUNvbWJvTWFyayA9IFJlZ0V4cChyc0NvbWJvLCAnZycpO1xuXG4vKipcbiAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZ1xuICogW0xhdGluLTEgU3VwcGxlbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW4tMV9TdXBwbGVtZW50XyhVbmljb2RlX2Jsb2NrKSNDaGFyYWN0ZXJfdGFibGUpXG4gKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nXG4gKiBbY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3MpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGRlYnVyci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWJ1cnIoJ2TDqWrDoCB2dScpO1xuICogLy8gPT4gJ2RlamEgdnUnXG4gKi9cbmZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgcmV0dXJuIHN0cmluZyAmJiBzdHJpbmcucmVwbGFjZShyZUxhdGluLCBkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssICcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZGVidXJyO1xuIiwiaW1wb3J0IGJhc2VEaWZmZXJlbmNlIGZyb20gJy4vX2Jhc2VEaWZmZXJlbmNlLmpzJztcbmltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgYGFycmF5YCB2YWx1ZXMgbm90IGluY2x1ZGVkIGluIHRoZSBvdGhlciBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICogQHNlZSBfLndpdGhvdXQsIF8ueG9yXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGlmZmVyZW5jZShbMiwgMV0sIFsyLCAzXSk7XG4gKiAvLyA9PiBbMV1cbiAqL1xudmFyIGRpZmZlcmVuY2UgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICA6IFtdO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2U7XG4iLCJpbXBvcnQgYmFzZVNsaWNlIGZyb20gJy4vX2Jhc2VTbGljZS5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRyb3BSaWdodChbMSwgMiwgM10pO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTtcbiAqIC8vID0+IFsxXVxuICpcbiAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7XG4gKiAvLyA9PiBbXVxuICpcbiAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqL1xuZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gIG4gPSBsZW5ndGggLSBuO1xuICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZHJvcFJpZ2h0O1xuIiwiZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4vZm9yRWFjaC5qcydcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlcTtcbiIsImltcG9ydCB0b1N0cmluZyBmcm9tICcuL3RvU3RyaW5nLmpzJztcblxuLyoqXG4gKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgXG4gKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS5cbiAqL1xudmFyIHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZyxcbiAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7XG5cbi8qKlxuICogRXNjYXBlcyB0aGUgYFJlZ0V4cGAgc3BlY2lhbCBjaGFyYWN0ZXJzIFwiXlwiLCBcIiRcIiwgXCJcXFwiLCBcIi5cIiwgXCIqXCIsIFwiK1wiLFxuICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5lc2NhcGVSZWdFeHAoJ1tsb2Rhc2hdKGh0dHBzOi8vbG9kYXNoLmNvbS8pJyk7XG4gKiAvLyA9PiAnXFxbbG9kYXNoXFxdXFwoaHR0cHM6Ly9sb2Rhc2hcXC5jb20vXFwpJ1xuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXFxcJCYnKVxuICAgIDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBlc2NhcGVSZWdFeHA7XG4iLCJpbXBvcnQgYXJyYXlFdmVyeSBmcm9tICcuL19hcnJheUV2ZXJ5LmpzJztcbmltcG9ydCBiYXNlRXZlcnkgZnJvbSAnLi9fYmFzZUV2ZXJ5LmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbGwqKiBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAuXG4gKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzXG4gKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgIGZvclxuICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAqIFtldmVyeXRoaW5nIGlzIHRydWVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhY3VvdXNfdHJ1dGgpIG9mXG4gKiBlbGVtZW50cyBvZiBlbXB0eSBjb2xsZWN0aW9ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLFxuICogIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfVxuICogXTtcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZXZlcnkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZXZlcnkodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGV2ZXJ5KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgcHJlZGljYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZXZlcnk7XG4iLCJpbXBvcnQgYXJyYXlGaWx0ZXIgZnJvbSAnLi9fYXJyYXlGaWx0ZXIuanMnO1xuaW1wb3J0IGJhc2VGaWx0ZXIgZnJvbSAnLi9fYmFzZUZpbHRlci5qcyc7XG5pbXBvcnQgYmFzZUl0ZXJhdGVlIGZyb20gJy4vX2Jhc2VJdGVyYXRlZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgYWxsIGVsZW1lbnRzXG4gKiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRocmVlXG4gKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAqXG4gKiAqKk5vdGU6KiogVW5saWtlIGBfLnJlbW92ZWAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICogQHNlZSBfLnJlamVjdFxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAqIF07XG4gKlxuICogXy5maWx0ZXIodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbHRlcih1c2VycywgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5maWx0ZXIodXNlcnMsICdhY3RpdmUnKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J11cbiAqXG4gKiAvLyBDb21iaW5pbmcgc2V2ZXJhbCBwcmVkaWNhdGVzIHVzaW5nIGBfLm92ZXJFdmVyeWAgb3IgYF8ub3ZlclNvbWVgLlxuICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW3sgJ2FnZSc6IDM2IH0sIFsnYWdlJywgNDBdXSkpO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbHRlcjtcbiIsImltcG9ydCBjcmVhdGVGaW5kIGZyb20gJy4vX2NyZWF0ZUZpbmQuanMnO1xuaW1wb3J0IGZpbmRJbmRleCBmcm9tICcuL2ZpbmRJbmRleC5qcyc7XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZVxuICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSxcbiAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gKlxuICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJ1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCdcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICovXG52YXIgZmluZCA9IGNyZWF0ZUZpbmQoZmluZEluZGV4KTtcblxuZXhwb3J0IGRlZmF1bHQgZmluZDtcbiIsImltcG9ydCBiYXNlRmluZEluZGV4IGZyb20gJy4vX2Jhc2VGaW5kSW5kZXguanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAxLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9XG4gKiBdO1xuICpcbiAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pO1xuICogLy8gPT4gMFxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gMVxuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gKiAvLyA9PiAwXG4gKlxuICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gMlxuICovXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmRJbmRleDtcbiIsImV4cG9ydCB7IGRlZmF1bHQgfSBmcm9tICcuL2hlYWQuanMnXG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuXG4vKipcbiAqIEZsYXR0ZW5zIGBhcnJheWAgYSBzaW5nbGUgbGV2ZWwgZGVlcC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgMSkgOiBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmxhdHRlbjtcbiIsImltcG9ydCBhcnJheUVhY2ggZnJvbSAnLi9fYXJyYXlFYWNoLmpzJztcbmltcG9ydCBiYXNlRWFjaCBmcm9tICcuL19iYXNlRWFjaC5qcyc7XG5pbXBvcnQgY2FzdEZ1bmN0aW9uIGZyb20gJy4vX2Nhc3RGdW5jdGlvbi5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuXG4gKlxuICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgXCJDb2xsZWN0aW9uc1wiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhIFwibGVuZ3RoXCJcbiAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gXG4gKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBhbGlhcyBlYWNoXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAqIEBzZWUgXy5mb3JFYWNoUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5mb3JFYWNoKFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAqICAgY29uc29sZS5sb2codmFsdWUpO1xuICogfSk7XG4gKiAvLyA9PiBMb2dzIGAxYCB0aGVuIGAyYC5cbiAqXG4gKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gKiAgIGNvbnNvbGUubG9nKGtleSk7XG4gKiB9KTtcbiAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICovXG5mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBjYXN0RnVuY3Rpb24oaXRlcmF0ZWUpKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9yRWFjaDtcbiIsImltcG9ydCBiYXNlR2V0IGZyb20gJy4vX2Jhc2VHZXQuanMnO1xuXG4vKipcbiAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAqXG4gKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICogLy8gPT4gM1xuICpcbiAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAqIC8vID0+ICdkZWZhdWx0J1xuICovXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogYmFzZUdldChvYmplY3QsIHBhdGgpO1xuICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldDtcbiIsImltcG9ydCBiYXNlSGFzIGZyb20gJy4vX2Jhc2VIYXMuanMnO1xuaW1wb3J0IGhhc1BhdGggZnJvbSAnLi9faGFzUGF0aC5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9O1xuICogdmFyIG90aGVyID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pO1xuICpcbiAqIF8uaGFzKG9iamVjdCwgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaGFzKG90aGVyLCAnYScpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkge1xuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXM7XG4iLCJpbXBvcnQgYmFzZUhhc0luIGZyb20gJy4vX2Jhc2VIYXNJbi5qcyc7XG5pbXBvcnQgaGFzUGF0aCBmcm9tICcuL19oYXNQYXRoLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdhLmInKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5oYXNJbihvYmplY3QsICdiJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcbiAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBoYXNJbjtcbiIsIi8qKlxuICogR2V0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBhbGlhcyBmaXJzdFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmhlYWQoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDFcbiAqXG4gKiBfLmhlYWQoW10pO1xuICogLy8gPT4gdW5kZWZpbmVkXG4gKi9cbmZ1bmN0aW9uIGhlYWQoYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYXJyYXlbMF0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGhlYWQ7XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50IGl0IHJlY2VpdmVzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0geyp9IHZhbHVlIEFueSB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICpcbiAqIGNvbnNvbGUubG9nKF8uaWRlbnRpdHkob2JqZWN0KSA9PT0gb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpZGVudGl0eTtcbiIsImltcG9ydCBiYXNlSW5SYW5nZSBmcm9tICcuL19iYXNlSW5SYW5nZS5qcyc7XG5pbXBvcnQgdG9GaW5pdGUgZnJvbSAnLi90b0Zpbml0ZS5qcyc7XG5pbXBvcnQgdG9OdW1iZXIgZnJvbSAnLi90b051bWJlci5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBuYCBpcyBiZXR3ZWVuIGBzdGFydGAgYW5kIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIElmXG4gKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKiBJZiBgc3RhcnRgIGlzIGdyZWF0ZXIgdGhhbiBgZW5kYCB0aGUgcGFyYW1zIGFyZSBzd2FwcGVkIHRvIHN1cHBvcnRcbiAqIG5lZ2F0aXZlIHJhbmdlcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMy4wXG4gKiBAY2F0ZWdvcnkgTnVtYmVyXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBudW1iZXJgIGlzIGluIHRoZSByYW5nZSwgZWxzZSBgZmFsc2VgLlxuICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5pblJhbmdlKDMsIDIsIDQpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaW5SYW5nZSg0LCA4KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluUmFuZ2UoNCwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5SYW5nZSgyLCAyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pblJhbmdlKDEuMiwgMik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pblJhbmdlKDUuMiwgNCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gMDtcbiAgfSBlbHNlIHtcbiAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICB9XG4gIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gIHJldHVybiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpblJhbmdlO1xuIiwiaW1wb3J0IGJhc2VJbmRleE9mIGZyb20gJy4vX2Jhc2VJbmRleE9mLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc1N0cmluZyBmcm9tICcuL2lzU3RyaW5nLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuaW1wb3J0IHZhbHVlcyBmcm9tICcuL3ZhbHVlcy5qcyc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heDtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICogY2hlY2tlZCBmb3IgYSBzdWJzdHJpbmcgb2YgYHZhbHVlYCwgb3RoZXJ3aXNlXG4gKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBjb2xsZWN0aW9uYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R8c3RyaW5nfSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ucmVkdWNlYC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7XG4gIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gIGZyb21JbmRleCA9IChmcm9tSW5kZXggJiYgIWd1YXJkKSA/IHRvSW50ZWdlcihmcm9tSW5kZXgpIDogMDtcblxuICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGZyb21JbmRleCwgMCk7XG4gIH1cbiAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgPyAoZnJvbUluZGV4IDw9IGxlbmd0aCAmJiBjb2xsZWN0aW9uLmluZGV4T2YodmFsdWUsIGZyb21JbmRleCkgPiAtMSlcbiAgICA6ICghIWxlbmd0aCAmJiBiYXNlSW5kZXhPZihjb2xsZWN0aW9uLCB2YWx1ZSwgZnJvbUluZGV4KSA+IC0xKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5jbHVkZXM7XG4iLCJpbXBvcnQgYXJyYXlNYXAgZnJvbSAnLi9fYXJyYXlNYXAuanMnO1xuaW1wb3J0IGJhc2VJbnRlcnNlY3Rpb24gZnJvbSAnLi9fYmFzZUludGVyc2VjdGlvbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGNhc3RBcnJheUxpa2VPYmplY3QgZnJvbSAnLi9fY2FzdEFycmF5TGlrZU9iamVjdC5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB1bmlxdWUgdmFsdWVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGFsbCBnaXZlbiBhcnJheXNcbiAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7XG4gKiAvLyA9PiBbMl1cbiAqL1xudmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKVxuICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpXG4gICAgOiBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBpbnRlcnNlY3Rpb247XG4iLCJpbXBvcnQgY29uc3RhbnQgZnJvbSAnLi9jb25zdGFudC5qcyc7XG5pbXBvcnQgY3JlYXRlSW52ZXJ0ZXIgZnJvbSAnLi9fY3JlYXRlSW52ZXJ0ZXIuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgaW52ZXJ0ZWQga2V5cyBhbmQgdmFsdWVzIG9mIGBvYmplY3RgLlxuICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gKiBwcm9wZXJ0eSBhc3NpZ25tZW50cyBvZiBwcmV2aW91cyB2YWx1ZXMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjcuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGludmVydC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAqXG4gKiBfLmludmVydChvYmplY3QpO1xuICogLy8gPT4geyAnMSc6ICdjJywgJzInOiAnYicgfVxuICovXG52YXIgaW52ZXJ0ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICByZXN1bHRbdmFsdWVdID0ga2V5O1xufSwgY29uc3RhbnQoaWRlbnRpdHkpKTtcblxuZXhwb3J0IGRlZmF1bHQgaW52ZXJ0O1xuIiwiaW1wb3J0IGJhc2VJbnZva2UgZnJvbSAnLi9fYmFzZUludm9rZS5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuXG4vKipcbiAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYG9iamVjdGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnZva2VkIG1ldGhvZC5cbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiBbMSwgMiwgMywgNF0gfSB9XSB9O1xuICpcbiAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7XG4gKiAvLyA9PiBbMiwgM11cbiAqL1xudmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpO1xuXG5leHBvcnQgZGVmYXVsdCBpbnZva2U7XG4iLCJpbXBvcnQgYmFzZUlzQXJndW1lbnRzIGZyb20gJy4vX2Jhc2VJc0FyZ3VtZW50cy5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJndW1lbnRzO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQXJyYXk7XG4iLCJpbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzRnVuY3Rpb24uanMnO1xuaW1wb3J0IGlzTGVuZ3RoIGZyb20gJy4vaXNMZW5ndGguanMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3NcbiAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWFsIHRvIGAwYCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNBcnJheUxpa2U7XG4iLCJpbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gKiBpcyBhbiBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXktbGlrZSBvYmplY3QsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaXNBcnJheUxpa2UodmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0FycmF5TGlrZU9iamVjdDtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBib29sZWFuLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNCb29sZWFuKGZhbHNlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQm9vbGVhbihudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYm9vbFRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzQm9vbGVhbjtcbiIsImltcG9ydCByb290IGZyb20gJy4vX3Jvb3QuanMnO1xuaW1wb3J0IHN0dWJGYWxzZSBmcm9tICcuL3N0dWJGYWxzZS5qcyc7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovXG52YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbnZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cbi8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovXG52YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgQnVmZmVyID0gbW9kdWxlRXhwb3J0cyA/IHJvb3QuQnVmZmVyIDogdW5kZWZpbmVkO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjMuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTtcblxuZXhwb3J0IGRlZmF1bHQgaXNCdWZmZXI7XG4iLCJpbXBvcnQgYmFzZUtleXMgZnJvbSAnLi9fYmFzZUtleXMuanMnO1xuaW1wb3J0IGdldFRhZyBmcm9tICcuL19nZXRUYWcuanMnO1xuaW1wb3J0IGlzQXJndW1lbnRzIGZyb20gJy4vaXNBcmd1bWVudHMuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcbmltcG9ydCBpc0J1ZmZlciBmcm9tICcuL2lzQnVmZmVyLmpzJztcbmltcG9ydCBpc1Byb3RvdHlwZSBmcm9tICcuL19pc1Byb3RvdHlwZS5qcyc7XG5pbXBvcnQgaXNUeXBlZEFycmF5IGZyb20gJy4vaXNUeXBlZEFycmF5LmpzJztcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLFxuICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuXG4gKlxuICogT2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgbm8gb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkXG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIEFycmF5LWxpa2UgdmFsdWVzIHN1Y2ggYXMgYGFyZ3VtZW50c2Agb2JqZWN0cywgYXJyYXlzLCBidWZmZXJzLCBzdHJpbmdzLCBvclxuICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLlxuICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZW1wdHksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0VtcHR5KG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFbXB0eSh0cnVlKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRW1wdHkoMSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0VtcHR5KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNFbXB0eSh7ICdhJzogMSB9KTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmXG4gICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICBpc0J1ZmZlcih2YWx1ZSkgfHwgaXNUeXBlZEFycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkpKSB7XG4gICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSk7XG4gIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gIH1cbiAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkge1xuICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgfVxuICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNFbXB0eTtcbiIsImltcG9ydCBiYXNlSXNFcXVhbCBmcm9tICcuL19iYXNlSXNFcXVhbC5qcyc7XG5cbi8qKlxuICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICogZXF1aXZhbGVudC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gKiBkYXRlIG9iamVjdHMsIGVycm9yIG9iamVjdHMsIG1hcHMsIG51bWJlcnMsIGBPYmplY3RgIG9iamVjdHMsIHJlZ2V4ZXMsXG4gKiBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQgYXJyYXlzLiBgT2JqZWN0YCBvYmplY3RzIGFyZSBjb21wYXJlZFxuICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gKiBub2RlcyBhcmUgY29tcGFyZWQgYnkgc3RyaWN0IGVxdWFsaXR5LCBpLmUuIGA9PT1gLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogb2JqZWN0ID09PSBvdGhlcjtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0VxdWFsO1xuIiwiaW1wb3J0IGJhc2VHZXRUYWcgZnJvbSAnLi9fYmFzZUdldFRhZy5qcyc7XG5pbXBvcnQgaXNPYmplY3QgZnJvbSAnLi9pc09iamVjdC5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBhc3luY1RhZyA9ICdbb2JqZWN0IEFzeW5jRnVuY3Rpb25dJyxcbiAgICBmdW5jVGFnID0gJ1tvYmplY3QgRnVuY3Rpb25dJyxcbiAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgIHByb3h5VGFnID0gJ1tvYmplY3QgUHJveHldJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oXyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Z1bmN0aW9uKC9hYmMvKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gIC8vIGluIFNhZmFyaSA5IHdoaWNoIHJldHVybnMgJ29iamVjdCcgZm9yIHR5cGVkIGFycmF5cyBhbmQgb3RoZXIgY29uc3RydWN0b3JzLlxuICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7XG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTGVuZ3RoO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbnVsbGlzaCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTmlsKG51bGwpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOaWwodm9pZCAwKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTmlsKE5hTik7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc05pbCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNOaWw7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzTnVtYmVyO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzT2JqZWN0O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzT2JqZWN0TGlrZTtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGdldFByb3RvdHlwZSBmcm9tICcuL19nZXRQcm90b3R5cGUuanMnO1xuaW1wb3J0IGlzT2JqZWN0TGlrZSBmcm9tICcuL2lzT2JqZWN0TGlrZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSxcbiAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKiBVc2VkIHRvIGluZmVyIHRoZSBgT2JqZWN0YCBjb25zdHJ1Y3Rvci4gKi9cbnZhciBvYmplY3RDdG9yU3RyaW5nID0gZnVuY1RvU3RyaW5nLmNhbGwoT2JqZWN0KTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh2YWx1ZSkgfHwgYmFzZUdldFRhZyh2YWx1ZSkgIT0gb2JqZWN0VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwcm90byA9IGdldFByb3RvdHlwZSh2YWx1ZSk7XG4gIGlmIChwcm90byA9PT0gbnVsbCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgZnVuY1RvU3RyaW5nLmNhbGwoQ3RvcikgPT0gb2JqZWN0Q3RvclN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNQbGFpbk9iamVjdDtcbiIsImltcG9ydCBiYXNlR2V0VGFnIGZyb20gJy4vX2Jhc2VHZXRUYWcuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaXNTdHJpbmc7XG4iLCJpbXBvcnQgYmFzZUdldFRhZyBmcm9tICcuL19iYXNlR2V0VGFnLmpzJztcbmltcG9ydCBpc09iamVjdExpa2UgZnJvbSAnLi9pc09iamVjdExpa2UuanMnO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGlzU3ltYm9sO1xuIiwiaW1wb3J0IGJhc2VJc1R5cGVkQXJyYXkgZnJvbSAnLi9fYmFzZUlzVHlwZWRBcnJheS5qcyc7XG5pbXBvcnQgYmFzZVVuYXJ5IGZyb20gJy4vX2Jhc2VVbmFyeS5qcyc7XG5pbXBvcnQgbm9kZVV0aWwgZnJvbSAnLi9fbm9kZVV0aWwuanMnO1xuXG4vKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqL1xudmFyIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbnZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuZXhwb3J0IGRlZmF1bHQgaXNUeXBlZEFycmF5O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc1VuZGVmaW5lZDtcbiIsImltcG9ydCBiYXNlQXNzaWduVmFsdWUgZnJvbSAnLi9fYmFzZUFzc2lnblZhbHVlLmpzJztcbmltcG9ydCBjcmVhdGVBZ2dyZWdhdG9yIGZyb20gJy4vX2NyZWF0ZUFnZ3JlZ2F0b3IuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIG9mXG4gKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBhcnJheSA9IFtcbiAqICAgeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sXG4gKiAgIHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH1cbiAqIF07XG4gKlxuICogXy5rZXlCeShhcnJheSwgZnVuY3Rpb24obykge1xuICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICogfSk7XG4gKiAvLyA9PiB7ICdhJzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdkJzogeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfSB9XG4gKlxuICogXy5rZXlCeShhcnJheSwgJ2RpcicpO1xuICogLy8gPT4geyAnbGVmdCc6IHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LCAncmlnaHQnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAqL1xudmFyIGtleUJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCB2YWx1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQga2V5Qnk7XG4iLCJpbXBvcnQgYXJyYXlMaWtlS2V5cyBmcm9tICcuL19hcnJheUxpa2VLZXlzLmpzJztcbmltcG9ydCBiYXNlS2V5cyBmcm9tICcuL19iYXNlS2V5cy5qcyc7XG5pbXBvcnQgaXNBcnJheUxpa2UgZnJvbSAnLi9pc0FycmF5TGlrZS5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuXG4gKlxuICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cylcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogICB0aGlzLmIgPSAyO1xuICogfVxuICpcbiAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gKlxuICogXy5rZXlzKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8ua2V5cygnaGknKTtcbiAqIC8vID0+IFsnMCcsICcxJ11cbiAqL1xuZnVuY3Rpb24ga2V5cyhvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBrZXlzO1xuIiwiaW1wb3J0IGFycmF5TGlrZUtleXMgZnJvbSAnLi9fYXJyYXlMaWtlS2V5cy5qcyc7XG5pbXBvcnQgYmFzZUtleXNJbiBmcm9tICcuL19iYXNlS2V5c0luLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZSBmcm9tICcuL2lzQXJyYXlMaWtlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqICAgdGhpcy5iID0gMjtcbiAqIH1cbiAqXG4gKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICpcbiAqIF8ua2V5c0luKG5ldyBGb28pO1xuICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIGtleXNJbihvYmplY3QpIHtcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGtleXNJbjtcbiIsIi8qKlxuICogR2V0cyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ubGFzdChbMSwgMiwgM10pO1xuICogLy8gPT4gM1xuICovXG5mdW5jdGlvbiBsYXN0KGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBsYXN0O1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlTWFwIGZyb20gJy4vX2Jhc2VNYXAuanMnO1xuaW1wb3J0IGlzQXJyYXkgZnJvbSAnLi9pc0FycmF5LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHZhbHVlcyBieSBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydVxuICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC5cbiAqXG4gKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsXG4gKiBgZmlsbGAsIGBpbnZlcnRgLCBgcGFyc2VJbnRgLCBgcmFuZG9tYCwgYHJhbmdlYCwgYHJhbmdlUmlnaHRgLCBgcmVwZWF0YCxcbiAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2BcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gKiAgIHJldHVybiBuICogbjtcbiAqIH1cbiAqXG4gKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7XG4gKiAvLyA9PiBbMTYsIDY0XVxuICpcbiAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTtcbiAqIC8vID0+IFsxNiwgNjRdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKlxuICogdmFyIHVzZXJzID0gW1xuICogICB7ICd1c2VyJzogJ2Jhcm5leScgfSxcbiAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICogXy5tYXAodXNlcnMsICd1c2VyJyk7XG4gKiAvLyA9PiBbJ2Jhcm5leScsICdmcmVkJ11cbiAqL1xuZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5TWFwIDogYmFzZU1hcDtcbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IG1hcDtcbiIsImltcG9ydCBiYXNlQXNzaWduVmFsdWUgZnJvbSAnLi9fYmFzZUFzc2lnblZhbHVlLmpzJztcbmltcG9ydCBiYXNlRm9yT3duIGZyb20gJy4vX2Jhc2VGb3JPd24uanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZFxuICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1XG4gKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAqICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICogQHNlZSBfLm1hcEtleXNcbiAqIEBleGFtcGxlXG4gKlxuICogdmFyIHVzZXJzID0ge1xuICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LFxuICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAqIH07XG4gKlxuICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7XG4gKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWFwVmFsdWVzO1xuIiwiaW1wb3J0IE1hcENhY2hlIGZyb20gJy4vX01hcENhY2hlLmpzJztcblxuLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZVxuICogYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGFyZ3VtZW50XG4gKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKlxuICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgXG4gKiBjb25zdHJ1Y3RvciB3aXRoIG9uZSB3aG9zZSBpbnN0YW5jZXMgaW1wbGVtZW50IHRoZVxuICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Jlc29sdmVyXSBUaGUgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgY2FjaGUga2V5LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07XG4gKlxuICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIHZhbHVlcyhvdGhlcik7XG4gKiAvLyA9PiBbMywgNF1cbiAqXG4gKiBvYmplY3QuYSA9IDI7XG4gKiB2YWx1ZXMob2JqZWN0KTtcbiAqIC8vID0+IFsxLCAyXVxuICpcbiAqIC8vIE1vZGlmeSB0aGUgcmVzdWx0IGNhY2hlLlxuICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICogdmFsdWVzKG9iamVjdCk7XG4gKiAvLyA9PiBbJ2EnLCAnYiddXG4gKlxuICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC5cbiAqIF8ubWVtb2l6ZS5DYWNoZSA9IFdlYWtNYXA7XG4gKi9cbmZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHtcbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicgfHwgKHJlc29sdmVyICE9IG51bGwgJiYgdHlwZW9mIHJlc29sdmVyICE9ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHZhciBtZW1vaXplZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSxcbiAgICAgICAgY2FjaGUgPSBtZW1vaXplZC5jYWNoZTtcblxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUuQ2FjaGUgfHwgTWFwQ2FjaGUpO1xuICByZXR1cm4gbWVtb2l6ZWQ7XG59XG5cbi8vIEV4cG9zZSBgTWFwQ2FjaGVgLlxubWVtb2l6ZS5DYWNoZSA9IE1hcENhY2hlO1xuXG5leHBvcnQgZGVmYXVsdCBtZW1vaXplO1xuIiwiaW1wb3J0IGJhc2VFeHRyZW11bSBmcm9tICcuL19iYXNlRXh0cmVtdW0uanMnO1xuaW1wb3J0IGJhc2VMdCBmcm9tICcuL19iYXNlTHQuanMnO1xuaW1wb3J0IGlkZW50aXR5IGZyb20gJy4vaWRlbnRpdHkuanMnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICogYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5taW4oWzQsIDIsIDgsIDZdKTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLm1pbihbXSk7XG4gKiAvLyA9PiB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gbWluKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgID8gYmFzZUV4dHJlbXVtKGFycmF5LCBpZGVudGl0eSwgYmFzZUx0KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtaW47XG4iLCIvKipcbiAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLm5vb3ApO1xuICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICovXG5mdW5jdGlvbiBub29wKCkge1xuICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkLlxufVxuXG5leHBvcnQgZGVmYXVsdCBub29wO1xuIiwiaW1wb3J0IGJhc2VSZXN0IGZyb20gJy4vX2Jhc2VSZXN0LmpzJztcbmltcG9ydCBjcmVhdGVXcmFwIGZyb20gJy4vX2NyZWF0ZVdyYXAuanMnO1xuaW1wb3J0IGdldEhvbGRlciBmcm9tICcuL19nZXRIb2xkZXIuanMnO1xuaW1wb3J0IHJlcGxhY2VIb2xkZXJzIGZyb20gJy4vX3JlcGxhY2VIb2xkZXJzLmpzJztcblxuLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgZnVuY3Rpb24gbWV0YWRhdGEuICovXG52YXIgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NDtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICogYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gKlxuICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gKiBhcHBsaWVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMC4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uXG4gKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lO1xuICogfVxuICpcbiAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2ZyZWQnKTtcbiAqIGdyZWV0RnJlZCgnaGknKTtcbiAqIC8vID0+ICdoaSBmcmVkJ1xuICpcbiAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gKiBzYXlIZWxsb1RvKCdmcmVkJyk7XG4gKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAqL1xudmFyIHBhcnRpYWxSaWdodCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7XG4gIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsUmlnaHQpKTtcbiAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xufSk7XG5cbi8vIEFzc2lnbiBkZWZhdWx0IHBsYWNlaG9sZGVycy5cbnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlciA9IHt9O1xuXG5leHBvcnQgZGVmYXVsdCBwYXJ0aWFsUmlnaHQ7XG4iLCJpbXBvcnQgYmFzZVBpY2sgZnJvbSAnLi9fYmFzZVBpY2suanMnO1xuaW1wb3J0IGZsYXRSZXN0IGZyb20gJy4vX2ZsYXRSZXN0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIGBvYmplY3RgIHByb3BlcnRpZXMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IE9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2sob2JqZWN0LCBbJ2EnLCAnYyddKTtcbiAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICovXG52YXIgcGljayA9IGZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHtcbiAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBwaWNrO1xuIiwiaW1wb3J0IGFycmF5TWFwIGZyb20gJy4vX2FycmF5TWFwLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlUGlja0J5IGZyb20gJy4vX2Jhc2VQaWNrQnkuanMnO1xuaW1wb3J0IGdldEFsbEtleXNJbiBmcm9tICcuL19nZXRBbGxLZXlzSW4uanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAqXG4gKiBfLnBpY2tCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gKi9cbmZ1bmN0aW9uIHBpY2tCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICByZXR1cm4gW3Byb3BdO1xuICB9KTtcbiAgcHJlZGljYXRlID0gYmFzZUl0ZXJhdGVlKHByZWRpY2F0ZSk7XG4gIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBwaWNrQnk7XG4iLCJpbXBvcnQgYmFzZVByb3BlcnR5IGZyb20gJy4vX2Jhc2VQcm9wZXJ0eS5qcyc7XG5pbXBvcnQgYmFzZVByb3BlcnR5RGVlcCBmcm9tICcuL19iYXNlUHJvcGVydHlEZWVwLmpzJztcbmltcG9ydCBpc0tleSBmcm9tICcuL19pc0tleS5qcyc7XG5pbXBvcnQgdG9LZXkgZnJvbSAnLi9fdG9LZXkuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0cyA9IFtcbiAqICAgeyAnYSc6IHsgJ2InOiAyIH0gfSxcbiAqICAgeyAnYSc6IHsgJ2InOiAxIH0gfVxuICogXTtcbiAqXG4gKiBfLm1hcChvYmplY3RzLCBfLnByb3BlcnR5KCdhLmInKSk7XG4gKiAvLyA9PiBbMiwgMV1cbiAqXG4gKiBfLm1hcChfLnNvcnRCeShvYmplY3RzLCBfLnByb3BlcnR5KFsnYScsICdiJ10pKSwgJ2EuYicpO1xuICogLy8gPT4gWzEsIDJdXG4gKi9cbmZ1bmN0aW9uIHByb3BlcnR5KHBhdGgpIHtcbiAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHByb3BlcnR5O1xuIiwiaW1wb3J0IGNyZWF0ZVJhbmdlIGZyb20gJy4vX2NyZWF0ZVJhbmdlLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgKHBvc2l0aXZlIGFuZC9vciBuZWdhdGl2ZSkgcHJvZ3Jlc3NpbmcgZnJvbVxuICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAqIGBzdGFydGAgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYW4gYGVuZGAgb3IgYHN0ZXBgLiBJZiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLFxuICogaXQncyBzZXQgdG8gYHN0YXJ0YCB3aXRoIGBzdGFydGAgdGhlbiBzZXQgdG8gYDBgLlxuICpcbiAqICoqTm90ZToqKiBKYXZhU2NyaXB0IGZvbGxvd3MgdGhlIElFRUUtNzU0IHN0YW5kYXJkIGZvciByZXNvbHZpbmdcbiAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IFV0aWxcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0ZXA9MV0gVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucmFuZ2UoNCk7XG4gKiAvLyA9PiBbMCwgMSwgMiwgM11cbiAqXG4gKiBfLnJhbmdlKC00KTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNSk7XG4gKiAvLyA9PiBbMSwgMiwgMywgNF1cbiAqXG4gKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAqIC8vID0+IFswLCA1LCAxMCwgMTVdXG4gKlxuICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA0LCAwKTtcbiAqIC8vID0+IFsxLCAxLCAxXVxuICpcbiAqIF8ucmFuZ2UoMCk7XG4gKiAvLyA9PiBbXVxuICovXG52YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG5leHBvcnQgZGVmYXVsdCByYW5nZTtcbiIsImltcG9ydCBhcnJheVJlZHVjZSBmcm9tICcuL19hcnJheVJlZHVjZS5qcyc7XG5pbXBvcnQgYmFzZUVhY2ggZnJvbSAnLi9fYmFzZUVhY2guanMnO1xuaW1wb3J0IGJhc2VJdGVyYXRlZSBmcm9tICcuL19iYXNlSXRlcmF0ZWUuanMnO1xuaW1wb3J0IGJhc2VSZWR1Y2UgZnJvbSAnLi9fYmFzZVJlZHVjZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuXG4vKipcbiAqIFJlZHVjZXMgYGNvbGxlY3Rpb25gIHRvIGEgdmFsdWUgd2hpY2ggaXMgdGhlIGFjY3VtdWxhdGVkIHJlc3VsdCBvZiBydW5uaW5nXG4gKiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYCwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gKiBpcyBub3QgZ2l2ZW4sIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCBpcyB1c2VkIGFzIHRoZSBpbml0aWFsXG4gKiB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBmb3VyIGFyZ3VtZW50czpcbiAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICpcbiAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOlxuICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gKiBhbmQgYHNvcnRCeWBcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gKiBAc2VlIF8ucmVkdWNlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yZWR1Y2UoWzEsIDJdLCBmdW5jdGlvbihzdW0sIG4pIHtcbiAqICAgcmV0dXJuIHN1bSArIG47XG4gKiB9LCAwKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnJlZHVjZSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiAgIHJldHVybiByZXN1bHQ7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2UgOiBiYXNlUmVkdWNlLFxuICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xufVxuXG5leHBvcnQgZGVmYXVsdCByZWR1Y2U7XG4iLCJpbXBvcnQgY3JlYXRlUm91bmQgZnJvbSAnLi9fY3JlYXRlUm91bmQuanMnO1xuXG4vKipcbiAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdG8gYHByZWNpc2lvbmAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjEwLjBcbiAqIEBjYXRlZ29yeSBNYXRoXG4gKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8ucm91bmQoNC4wMDYpO1xuICogLy8gPT4gNFxuICpcbiAqIF8ucm91bmQoNC4wMDYsIDIpO1xuICogLy8gPT4gNC4wMVxuICpcbiAqIF8ucm91bmQoNDA2MCwgLTIpO1xuICogLy8gPT4gNDEwMFxuICovXG52YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTtcblxuZXhwb3J0IGRlZmF1bHQgcm91bmQ7XG4iLCJpbXBvcnQgYmFzZVNldCBmcm9tICcuL19iYXNlU2V0LmpzJztcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCxcbiAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICogYXJlIGNyZWF0ZWQgZm9yIGFsbCBvdGhlciBtaXNzaW5nIHByb3BlcnRpZXMuIFVzZSBgXy5zZXRXaXRoYCB0byBjdXN0b21pemVcbiAqIGBwYXRoYCBjcmVhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuNy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC5cbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gKlxuICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gKiAvLyA9PiA0XG4gKlxuICogXy5zZXQob2JqZWN0LCBbJ3gnLCAnMCcsICd5JywgJ3onXSwgNSk7XG4gKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICogLy8gPT4gNVxuICovXG5mdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkge1xuICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzZXQ7XG4iLCJpbXBvcnQgYmFzZUtleXMgZnJvbSAnLi9fYmFzZUtleXMuanMnO1xuaW1wb3J0IGdldFRhZyBmcm9tICcuL19nZXRUYWcuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlIGZyb20gJy4vaXNBcnJheUxpa2UuanMnO1xuaW1wb3J0IGlzU3RyaW5nIGZyb20gJy4vaXNTdHJpbmcuanMnO1xuaW1wb3J0IHN0cmluZ1NpemUgZnJvbSAnLi9fc3RyaW5nU2l6ZS5qcyc7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBtYXBUYWcgPSAnW29iamVjdCBNYXBdJyxcbiAgICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJztcblxuLyoqXG4gKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNpemUoWzEsIDIsIDNdKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTtcbiAqIC8vID0+IDJcbiAqXG4gKiBfLnNpemUoJ3BlYmJsZXMnKTtcbiAqIC8vID0+IDdcbiAqL1xuZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7XG4gIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICByZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbikgPyBzdHJpbmdTaXplKGNvbGxlY3Rpb24pIDogY29sbGVjdGlvbi5sZW5ndGg7XG4gIH1cbiAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgIHJldHVybiBjb2xsZWN0aW9uLnNpemU7XG4gIH1cbiAgcmV0dXJuIGJhc2VLZXlzKGNvbGxlY3Rpb24pLmxlbmd0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc2l6ZTtcbiIsImltcG9ydCBhcnJheVNvbWUgZnJvbSAnLi9fYXJyYXlTb21lLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBiYXNlU29tZSBmcm9tICcuL19iYXNlU29tZS5qcyc7XG5pbXBvcnQgaXNBcnJheSBmcm9tICcuL2lzQXJyYXkuanMnO1xuaW1wb3J0IGlzSXRlcmF0ZWVDYWxsIGZyb20gJy4vX2lzSXRlcmF0ZWVDYWxsLmpzJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYW55KiogZWxlbWVudCBvZiBgY29sbGVjdGlvbmAuXG4gKiBJdGVyYXRpb24gaXMgc3RvcHBlZCBvbmNlIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5LiBUaGUgcHJlZGljYXRlIGlzXG4gKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIHZhciB1c2VycyA9IFtcbiAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9LFxuICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gKiBdO1xuICpcbiAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvbWUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gKiBfLnNvbWUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7XG4gIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBiYXNlSXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNvbWU7XG4iLCJpbXBvcnQgYmFzZUZsYXR0ZW4gZnJvbSAnLi9fYmFzZUZsYXR0ZW4uanMnO1xuaW1wb3J0IGJhc2VPcmRlckJ5IGZyb20gJy4vX2Jhc2VPcmRlckJ5LmpzJztcbmltcG9ydCBiYXNlUmVzdCBmcm9tICcuL19iYXNlUmVzdC5qcyc7XG5pbXBvcnQgaXNJdGVyYXRlZUNhbGwgZnJvbSAnLi9faXNJdGVyYXRlZUNhbGwuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aHJ1IGVhY2ggaXRlcmF0ZWUuIFRoaXMgbWV0aG9kXG4gKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2ZcbiAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dXG4gKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgdXNlcnMgPSBbXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sXG4gKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH1cbiAqIF07XG4gKlxuICogXy5zb3J0QnkodXNlcnMsIFtmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH1dKTtcbiAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgMzBdXVxuICpcbiAqIF8uc29ydEJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10pO1xuICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgMzBdLCBbJ2ZyZWQnLCA0OF1dXG4gKi9cbnZhciBzb3J0QnkgPSBiYXNlUmVzdChmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZXMpIHtcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICB2YXIgbGVuZ3RoID0gaXRlcmF0ZWVzLmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgaXRlcmF0ZWVzID0gW107XG4gIH0gZWxzZSBpZiAobGVuZ3RoID4gMiAmJiBpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkge1xuICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICB9XG4gIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBiYXNlRmxhdHRlbihpdGVyYXRlZXMsIDEpLCBbXSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc29ydEJ5O1xuIiwiaW1wb3J0IGNyZWF0ZUNvbXBvdW5kZXIgZnJvbSAnLi9fY3JlYXRlQ29tcG91bmRlci5qcyc7XG5pbXBvcnQgdXBwZXJGaXJzdCBmcm9tICcuL3VwcGVyRmlyc3QuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGBzdHJpbmdgIHRvXG4gKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMS4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTtcbiAqIC8vID0+ICdGb28gQmFyJ1xuICpcbiAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTtcbiAqIC8vID0+ICdGb28gQmFyJ1xuICpcbiAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpO1xuICogLy8gPT4gJ0ZPTyBCQVInXG4gKi9cbnZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHVwcGVyRmlyc3Qod29yZCk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgc3RhcnRDYXNlO1xuIiwiaW1wb3J0IGJhc2VDbGFtcCBmcm9tICcuL19iYXNlQ2xhbXAuanMnO1xuaW1wb3J0IGJhc2VUb1N0cmluZyBmcm9tICcuL19iYXNlVG9TdHJpbmcuanMnO1xuaW1wb3J0IHRvSW50ZWdlciBmcm9tICcuL3RvSW50ZWdlci5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMy4wLjBcbiAqIEBjYXRlZ29yeSBTdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggYHRhcmdldGAsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJywgMSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHBvc2l0aW9uID0gcG9zaXRpb24gPT0gbnVsbFxuICAgID8gMFxuICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpO1xuICByZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIHRhcmdldC5sZW5ndGgpID09IHRhcmdldDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3RhcnRzV2l0aDtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTMuMFxuICogQGNhdGVnb3J5IFV0aWxcbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7XG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAqIC8vID0+IFtbXSwgW11dXG4gKlxuICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN0dWJBcnJheTtcbiIsIi8qKlxuICogVGhpcyBtZXRob2QgcmV0dXJucyBgZmFsc2VgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMy4wXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50aW1lcygyLCBfLnN0dWJGYWxzZSk7XG4gKiAvLyA9PiBbZmFsc2UsIGZhbHNlXVxuICovXG5mdW5jdGlvbiBzdHViRmFsc2UoKSB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgc3R1YkZhbHNlO1xuIiwiaW1wb3J0IGJhc2VTdW0gZnJvbSAnLi9fYmFzZVN1bS5qcyc7XG5pbXBvcnQgaWRlbnRpdHkgZnJvbSAnLi9pZGVudGl0eS5qcyc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjQuMFxuICogQGNhdGVnb3J5IE1hdGhcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gKiAvLyA9PiAyMFxuICovXG5mdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgPyBiYXNlU3VtKGFycmF5LCBpZGVudGl0eSlcbiAgICA6IDA7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHN1bTtcbiIsImltcG9ydCBiYXNlU2xpY2UgZnJvbSAnLi9fYmFzZVNsaWNlLmpzJztcbmltcG9ydCB0b0ludGVnZXIgZnJvbSAnLi90b0ludGVnZXIuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IFsxXVxuICpcbiAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICogLy8gPT4gWzEsIDJdXG4gKlxuICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gKiAvLyA9PiBbMSwgMiwgM11cbiAqXG4gKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAqIC8vID0+IFtdXG4gKi9cbmZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQpID8gMSA6IHRvSW50ZWdlcihuKTtcbiAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgMCwgbiA8IDAgPyAwIDogbik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRha2U7XG4iLCJpbXBvcnQgYmFzZVRpbWVzIGZyb20gJy4vX2Jhc2VUaW1lcy5qcyc7XG5pbXBvcnQgY2FzdEZ1bmN0aW9uIGZyb20gJy4vX2Nhc3RGdW5jdGlvbi5qcyc7XG5pbXBvcnQgdG9JbnRlZ2VyIGZyb20gJy4vdG9JbnRlZ2VyLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG52YXIgTUFYX0FSUkFZX0xFTkdUSCA9IDQyOTQ5NjcyOTU7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZlxuICogZWFjaCBpbnZvY2F0aW9uLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKGluZGV4KS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRpbWVzKDMsIFN0cmluZyk7XG4gKiAvLyA9PiBbJzAnLCAnMScsICcyJ11cbiAqXG4gKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTtcbiAqIC8vID0+IFswLCAwLCAwLCAwXVxuICovXG5mdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkge1xuICBuID0gdG9JbnRlZ2VyKG4pO1xuICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTtcblxuICBpdGVyYXRlZSA9IGNhc3RGdW5jdGlvbihpdGVyYXRlZSk7XG4gIG4gLT0gTUFYX0FSUkFZX0xFTkdUSDtcblxuICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICB3aGlsZSAoKytpbmRleCA8IG4pIHtcbiAgICBpdGVyYXRlZShpbmRleCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGltZXM7XG4iLCJpbXBvcnQgdG9OdW1iZXIgZnJvbSAnLi90b051bWJlci5qcyc7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0Zpbml0ZTtcbiIsImltcG9ydCB0b0Zpbml0ZSBmcm9tICcuL3RvRmluaXRlLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuXG4gKlxuICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b0ludGVnZXIoMy4yKTtcbiAqIC8vID0+IDNcbiAqXG4gKiBfLnRvSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDBcbiAqXG4gKiBfLnRvSW50ZWdlcihJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9JbnRlZ2VyKCczLjInKTtcbiAqIC8vID0+IDNcbiAqL1xuZnVuY3Rpb24gdG9JbnRlZ2VyKHZhbHVlKSB7XG4gIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxO1xuXG4gIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdG9JbnRlZ2VyO1xuIiwiaW1wb3J0IGJhc2VUcmltIGZyb20gJy4vX2Jhc2VUcmltLmpzJztcbmltcG9ydCBpc09iamVjdCBmcm9tICcuL2lzT2JqZWN0LmpzJztcbmltcG9ydCBpc1N5bWJvbCBmcm9tICcuL2lzU3ltYm9sLmpzJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvTnVtYmVyO1xuIiwiaW1wb3J0IGJhc2VUb1N0cmluZyBmcm9tICcuL19iYXNlVG9TdHJpbmcuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcuIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBmb3IgYG51bGxgXG4gKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9TdHJpbmcobnVsbCk7XG4gKiAvLyA9PiAnJ1xuICpcbiAqIF8udG9TdHJpbmcoLTApO1xuICogLy8gPT4gJy0wJ1xuICpcbiAqIF8udG9TdHJpbmcoWzEsIDIsIDNdKTtcbiAqIC8vID0+ICcxLDIsMydcbiAqL1xuZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAnJyA6IGJhc2VUb1N0cmluZyh2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHRvU3RyaW5nO1xuIiwiaW1wb3J0IGFycmF5RWFjaCBmcm9tICcuL19hcnJheUVhY2guanMnO1xuaW1wb3J0IGJhc2VDcmVhdGUgZnJvbSAnLi9fYmFzZUNyZWF0ZS5qcyc7XG5pbXBvcnQgYmFzZUZvck93biBmcm9tICcuL19iYXNlRm9yT3duLmpzJztcbmltcG9ydCBiYXNlSXRlcmF0ZWUgZnJvbSAnLi9fYmFzZUl0ZXJhdGVlLmpzJztcbmltcG9ydCBnZXRQcm90b3R5cGUgZnJvbSAnLi9fZ2V0UHJvdG90eXBlLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNCdWZmZXIgZnJvbSAnLi9pc0J1ZmZlci5qcyc7XG5pbXBvcnQgaXNGdW5jdGlvbiBmcm9tICcuL2lzRnVuY3Rpb24uanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4vaXNPYmplY3QuanMnO1xuaW1wb3J0IGlzVHlwZWRBcnJheSBmcm9tICcuL2lzVHlwZWRBcnJheS5qcyc7XG5cbi8qKlxuICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ld1xuICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uXG4gKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90XG4gKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS5cbiAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDEuMy4wXG4gKiBAY2F0ZWdvcnkgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS5cbiAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHtcbiAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gKiB9LCBbXSk7XG4gKiAvLyA9PiBbNCwgOV1cbiAqXG4gKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gKiB9LCB7fSk7XG4gKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICB2YXIgaXNBcnIgPSBpc0FycmF5KG9iamVjdCksXG4gICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gIGl0ZXJhdGVlID0gYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgaWYgKGFjY3VtdWxhdG9yID09IG51bGwpIHtcbiAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgYWNjdW11bGF0b3IgPSBpc0FyciA/IG5ldyBDdG9yIDogW107XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXNGdW5jdGlvbihDdG9yKSA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpIDoge307XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYWNjdW11bGF0b3IgPSB7fTtcbiAgICB9XG4gIH1cbiAgKGlzQXJyTGlrZSA/IGFycmF5RWFjaCA6IGJhc2VGb3JPd24pKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBvYmplY3QpIHtcbiAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTtcbiAgfSk7XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNmb3JtO1xuIiwiaW1wb3J0IGJhc2VUb1N0cmluZyBmcm9tICcuL19iYXNlVG9TdHJpbmcuanMnO1xuaW1wb3J0IGJhc2VUcmltIGZyb20gJy4vX2Jhc2VUcmltLmpzJztcbmltcG9ydCBjYXN0U2xpY2UgZnJvbSAnLi9fY2FzdFNsaWNlLmpzJztcbmltcG9ydCBjaGFyc0VuZEluZGV4IGZyb20gJy4vX2NoYXJzRW5kSW5kZXguanMnO1xuaW1wb3J0IGNoYXJzU3RhcnRJbmRleCBmcm9tICcuL19jaGFyc1N0YXJ0SW5kZXguanMnO1xuaW1wb3J0IHN0cmluZ1RvQXJyYXkgZnJvbSAnLi9fc3RyaW5nVG9BcnJheS5qcyc7XG5pbXBvcnQgdG9TdHJpbmcgZnJvbSAnLi90b1N0cmluZy5qcyc7XG5cbi8qKlxuICogUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9yIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGZyb20gYHN0cmluZ2AuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAzLjAuMFxuICogQGNhdGVnb3J5IFN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50cmltKCcgIGFiYyAgJyk7XG4gKiAvLyA9PiAnYWJjJ1xuICpcbiAqIF8udHJpbSgnLV8tYWJjLV8tJywgJ18tJyk7XG4gKiAvLyA9PiAnYWJjJ1xuICpcbiAqIF8ubWFwKFsnICBmb28gICcsICcgIGJhciAgJ10sIF8udHJpbSk7XG4gKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICovXG5mdW5jdGlvbiB0cmltKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQpKSB7XG4gICAgcmV0dXJuIGJhc2VUcmltKHN0cmluZyk7XG4gIH1cbiAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgcmV0dXJuIHN0cmluZztcbiAgfVxuICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgIGNoclN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KGNoYXJzKSxcbiAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7XG5cbiAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCwgZW5kKS5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdHJpbTtcbiIsImltcG9ydCBiYXNlRmxhdHRlbiBmcm9tICcuL19iYXNlRmxhdHRlbi5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGJhc2VVbmlxIGZyb20gJy4vX2Jhc2VVbmlxLmpzJztcbmltcG9ydCBpc0FycmF5TGlrZU9iamVjdCBmcm9tICcuL2lzQXJyYXlMaWtlT2JqZWN0LmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udW5pb24oWzJdLCBbMSwgMl0pO1xuICogLy8gPT4gWzIsIDFdXG4gKi9cbnZhciB1bmlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHVuaW9uO1xuIiwiaW1wb3J0IGJhc2VVbmlxIGZyb20gJy4vX2Jhc2VVbmlxLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiBhbiBhcnJheSwgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMsIGluIHdoaWNoIG9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaCBlbGVtZW50XG4gKiBpcyBrZXB0LiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyXG4gKiBpbiB0aGUgYXJyYXkuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEFycmF5XG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnVuaXEoWzIsIDEsIDJdKTtcbiAqIC8vID0+IFsyLCAxXVxuICovXG5mdW5jdGlvbiB1bmlxKGFycmF5KSB7XG4gIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5KSA6IFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCB1bmlxO1xuIiwiaW1wb3J0IGNyZWF0ZUNhc2VGaXJzdCBmcm9tICcuL19jcmVhdGVDYXNlRmlyc3QuanMnO1xuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqIEBleGFtcGxlXG4gKlxuICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gKiAvLyA9PiAnRnJlZCdcbiAqXG4gKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAqIC8vID0+ICdGUkVEJ1xuICovXG52YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuZXhwb3J0IGRlZmF1bHQgdXBwZXJGaXJzdDtcbiIsImltcG9ydCBiYXNlVmFsdWVzIGZyb20gJy4vX2Jhc2VWYWx1ZXMuanMnO1xuaW1wb3J0IGtleXMgZnJvbSAnLi9rZXlzLmpzJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLlxuICpcbiAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBPYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiAgIHRoaXMuYiA9IDI7XG4gKiB9XG4gKlxuICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAqXG4gKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICpcbiAqIF8udmFsdWVzKCdoaScpO1xuICogLy8gPT4gWydoJywgJ2knXVxuICovXG5mdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbHVlcztcbiIsImltcG9ydCBiYXNlRGlmZmVyZW5jZSBmcm9tICcuL19iYXNlRGlmZmVyZW5jZS5qcyc7XG5pbXBvcnQgYmFzZVJlc3QgZnJvbSAnLi9fYmFzZVJlc3QuanMnO1xuaW1wb3J0IGlzQXJyYXlMaWtlT2JqZWN0IGZyb20gJy4vaXNBcnJheUxpa2VPYmplY3QuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmdcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gKlxuICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgQXJyYXlcbiAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAqIEBleGFtcGxlXG4gKlxuICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gKiAvLyA9PiBbM11cbiAqL1xudmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpXG4gICAgOiBbXTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCB3aXRob3V0O1xuIiwiaW1wb3J0IGFzY2lpV29yZHMgZnJvbSAnLi9fYXNjaWlXb3Jkcy5qcyc7XG5pbXBvcnQgaGFzVW5pY29kZVdvcmQgZnJvbSAnLi9faGFzVW5pY29kZVdvcmQuanMnO1xuaW1wb3J0IHRvU3RyaW5nIGZyb20gJy4vdG9TdHJpbmcuanMnO1xuaW1wb3J0IHVuaWNvZGVXb3JkcyBmcm9tICcuL191bmljb2RlV29yZHMuanMnO1xuXG4vKipcbiAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDMuMC4wXG4gKiBAY2F0ZWdvcnkgU3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbcGF0dGVybl0gVGhlIHBhdHRlcm4gdG8gbWF0Y2ggd29yZHMuXG4gKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAncGViYmxlcyddXG4gKlxuICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICogLy8gPT4gWydmcmVkJywgJ2Jhcm5leScsICcmJywgJ3BlYmJsZXMnXVxuICovXG5mdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gIHBhdHRlcm4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IHBhdHRlcm47XG5cbiAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBoYXNVbmljb2RlV29yZChzdHJpbmcpID8gdW5pY29kZVdvcmRzKHN0cmluZykgOiBhc2NpaVdvcmRzKHN0cmluZyk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgd29yZHM7XG4iLCJpbXBvcnQgTGF6eVdyYXBwZXIgZnJvbSAnLi9fTGF6eVdyYXBwZXIuanMnO1xuaW1wb3J0IExvZGFzaFdyYXBwZXIgZnJvbSAnLi9fTG9kYXNoV3JhcHBlci5qcyc7XG5pbXBvcnQgYmFzZUxvZGFzaCBmcm9tICcuL19iYXNlTG9kYXNoLmpzJztcbmltcG9ydCBpc0FycmF5IGZyb20gJy4vaXNBcnJheS5qcyc7XG5pbXBvcnQgaXNPYmplY3RMaWtlIGZyb20gJy4vaXNPYmplY3RMaWtlLmpzJztcbmltcG9ydCB3cmFwcGVyQ2xvbmUgZnJvbSAnLi9fd3JhcHBlckNsb25lLmpzJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgYGxvZGFzaGAgb2JqZWN0IHdoaWNoIHdyYXBzIGB2YWx1ZWAgdG8gZW5hYmxlIGltcGxpY2l0IG1ldGhvZFxuICogY2hhaW4gc2VxdWVuY2VzLiBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBhbmQgcmV0dXJuIGFycmF5cywgY29sbGVjdGlvbnMsXG4gKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAqIG9yIG1heSByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUgd2lsbCBhdXRvbWF0aWNhbGx5IGVuZCB0aGUgY2hhaW4gc2VxdWVuY2VcbiAqIGFuZCByZXR1cm4gdGhlIHVud3JhcHBlZCB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgbXVzdCBiZSB1bndyYXBwZWRcbiAqIHdpdGggYF8jdmFsdWVgLlxuICpcbiAqIEV4cGxpY2l0IGNoYWluIHNlcXVlbmNlcywgd2hpY2ggbXVzdCBiZSB1bndyYXBwZWQgd2l0aCBgXyN2YWx1ZWAsIG1heSBiZVxuICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gKlxuICogVGhlIGV4ZWN1dGlvbiBvZiBjaGFpbmVkIG1ldGhvZHMgaXMgbGF6eSwgdGhhdCBpcywgaXQncyBkZWZlcnJlZCB1bnRpbFxuICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gKlxuICogTGF6eSBldmFsdWF0aW9uIGFsbG93cyBzZXZlcmFsIG1ldGhvZHMgdG8gc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24uXG4gKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICogdGhlIGNyZWF0aW9uIG9mIGludGVybWVkaWF0ZSBhcnJheXMgYW5kIGNhbiBncmVhdGx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mXG4gKiBpdGVyYXRlZSBleGVjdXRpb25zLiBTZWN0aW9ucyBvZiBhIGNoYWluIHNlcXVlbmNlIHF1YWxpZnkgZm9yIHNob3J0Y3V0XG4gKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gKiBvbmUgYXJndW1lbnQuIFRoZSBoZXVyaXN0aWMgZm9yIHdoZXRoZXIgYSBzZWN0aW9uIHF1YWxpZmllcyBmb3Igc2hvcnRjdXRcbiAqIGZ1c2lvbiBpcyBzdWJqZWN0IHRvIGNoYW5nZS5cbiAqXG4gKiBDaGFpbmluZyBpcyBzdXBwb3J0ZWQgaW4gY3VzdG9tIGJ1aWxkcyBhcyBsb25nIGFzIHRoZSBgXyN2YWx1ZWAgbWV0aG9kIGlzXG4gKiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluY2x1ZGVkIGluIHRoZSBidWlsZC5cbiAqXG4gKiBJbiBhZGRpdGlvbiB0byBsb2Rhc2ggbWV0aG9kcywgd3JhcHBlcnMgaGF2ZSBgQXJyYXlgIGFuZCBgU3RyaW5nYCBtZXRob2RzLlxuICpcbiAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gKiBgY29uY2F0YCwgYGpvaW5gLCBgcG9wYCwgYHB1c2hgLCBgc2hpZnRgLCBgc29ydGAsIGBzcGxpY2VgLCBhbmQgYHVuc2hpZnRgXG4gKlxuICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gKiBgcmVwbGFjZWAgYW5kIGBzcGxpdGBcbiAqXG4gKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICogYGF0YCwgYGNvbXBhY3RgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZHJvcFdoaWxlYCwgYGZpbHRlcmAsIGBmaW5kYCxcbiAqIGBmaW5kTGFzdGAsIGBoZWFkYCwgYGluaXRpYWxgLCBgbGFzdGAsIGBtYXBgLCBgcmVqZWN0YCwgYHJldmVyc2VgLCBgc2xpY2VgLFxuICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICpcbiAqIFRoZSBjaGFpbmFibGUgd3JhcHBlciBtZXRob2RzIGFyZTpcbiAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAqIGBiZWZvcmVgLCBgYmluZGAsIGBiaW5kQWxsYCwgYGJpbmRLZXlgLCBgY2FzdEFycmF5YCwgYGNoYWluYCwgYGNodW5rYCxcbiAqIGBjb21taXRgLCBgY29tcGFjdGAsIGBjb25jYXRgLCBgY29uZm9ybXNgLCBgY29uc3RhbnRgLCBgY291bnRCeWAsIGBjcmVhdGVgLFxuICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gKiBgZGlmZmVyZW5jZWAsIGBkaWZmZXJlbmNlQnlgLCBgZGlmZmVyZW5jZVdpdGhgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLFxuICogYGRyb3BSaWdodFdoaWxlYCwgYGRyb3BXaGlsZWAsIGBleHRlbmRgLCBgZXh0ZW5kV2l0aGAsIGBmaWxsYCwgYGZpbHRlcmAsXG4gKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gKiBgZmxhdHRlbkRlcHRoYCwgYGZsaXBgLCBgZmxvd2AsIGBmbG93UmlnaHRgLCBgZnJvbVBhaXJzYCwgYGZ1bmN0aW9uc2AsXG4gKiBgZnVuY3Rpb25zSW5gLCBgZ3JvdXBCeWAsIGBpbml0aWFsYCwgYGludGVyc2VjdGlvbmAsIGBpbnRlcnNlY3Rpb25CeWAsXG4gKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAqIGBrZXlzYCwgYGtleXNJbmAsIGBtYXBgLCBgbWFwS2V5c2AsIGBtYXBWYWx1ZXNgLCBgbWF0Y2hlc2AsIGBtYXRjaGVzUHJvcGVydHlgLFxuICogYG1lbW9pemVgLCBgbWVyZ2VgLCBgbWVyZ2VXaXRoYCwgYG1ldGhvZGAsIGBtZXRob2RPZmAsIGBtaXhpbmAsIGBuZWdhdGVgLFxuICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gKiBgb3ZlckV2ZXJ5YCwgYG92ZXJTb21lYCwgYHBhcnRpYWxgLCBgcGFydGlhbFJpZ2h0YCwgYHBhcnRpdGlvbmAsIGBwaWNrYCxcbiAqIGBwaWNrQnlgLCBgcGxhbnRgLCBgcHJvcGVydHlgLCBgcHJvcGVydHlPZmAsIGBwdWxsYCwgYHB1bGxBbGxgLCBgcHVsbEFsbEJ5YCxcbiAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gKiBgcmVtb3ZlYCwgYHJlc3RgLCBgcmV2ZXJzZWAsIGBzYW1wbGVTaXplYCwgYHNldGAsIGBzZXRXaXRoYCwgYHNodWZmbGVgLFxuICogYHNsaWNlYCwgYHNvcnRgLCBgc29ydEJ5YCwgYHNwbGljZWAsIGBzcHJlYWRgLCBgdGFpbGAsIGB0YWtlYCwgYHRha2VSaWdodGAsXG4gKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICogYHRvUGFpcnNgLCBgdG9QYWlyc0luYCwgYHRvUGF0aGAsIGB0b1BsYWluT2JqZWN0YCwgYHRyYW5zZm9ybWAsIGB1bmFyeWAsXG4gKiBgdW5pb25gLCBgdW5pb25CeWAsIGB1bmlvbldpdGhgLCBgdW5pcWAsIGB1bmlxQnlgLCBgdW5pcVdpdGhgLCBgdW5zZXRgLFxuICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gKiBgdmFsdWVzSW5gLCBgd2l0aG91dGAsIGB3cmFwYCwgYHhvcmAsIGB4b3JCeWAsIGB4b3JXaXRoYCwgYHppcGAsXG4gKiBgemlwT2JqZWN0YCwgYHppcE9iamVjdERlZXBgLCBhbmQgYHppcFdpdGhgXG4gKlxuICogVGhlIHdyYXBwZXIgbWV0aG9kcyB0aGF0IGFyZSAqKm5vdCoqIGNoYWluYWJsZSBieSBkZWZhdWx0IGFyZTpcbiAqIGBhZGRgLCBgYXR0ZW1wdGAsIGBjYW1lbENhc2VgLCBgY2FwaXRhbGl6ZWAsIGBjZWlsYCwgYGNsYW1wYCwgYGNsb25lYCxcbiAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICogYGRlZmF1bHRUb2AsIGBkaXZpZGVgLCBgZWFjaGAsIGBlYWNoUmlnaHRgLCBgZW5kc1dpdGhgLCBgZXFgLCBgZXNjYXBlYCxcbiAqIGBlc2NhcGVSZWdFeHBgLCBgZXZlcnlgLCBgZmluZGAsIGBmaW5kSW5kZXhgLCBgZmluZEtleWAsIGBmaW5kTGFzdGAsXG4gKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gKiBgZm9ySW5gLCBgZm9ySW5SaWdodGAsIGBmb3JPd25gLCBgZm9yT3duUmlnaHRgLCBgZ2V0YCwgYGd0YCwgYGd0ZWAsIGBoYXNgLFxuICogYGhhc0luYCwgYGhlYWRgLCBgaWRlbnRpdHlgLCBgaW5jbHVkZXNgLCBgaW5kZXhPZmAsIGBpblJhbmdlYCwgYGludm9rZWAsXG4gKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAqIGBpc0Jvb2xlYW5gLCBgaXNCdWZmZXJgLCBgaXNEYXRlYCwgYGlzRWxlbWVudGAsIGBpc0VtcHR5YCwgYGlzRXF1YWxgLFxuICogYGlzRXF1YWxXaXRoYCwgYGlzRXJyb3JgLCBgaXNGaW5pdGVgLCBgaXNGdW5jdGlvbmAsIGBpc0ludGVnZXJgLCBgaXNMZW5ndGhgLFxuICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAqIGBpc051bWJlcmAsIGBpc09iamVjdGAsIGBpc09iamVjdExpa2VgLCBgaXNQbGFpbk9iamVjdGAsIGBpc1JlZ0V4cGAsXG4gKiBgaXNTYWZlSW50ZWdlcmAsIGBpc1NldGAsIGBpc1N0cmluZ2AsIGBpc1VuZGVmaW5lZGAsIGBpc1R5cGVkQXJyYXlgLFxuICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gKiBgbG93ZXJDYXNlYCwgYGxvd2VyRmlyc3RgLCBgbHRgLCBgbHRlYCwgYG1heGAsIGBtYXhCeWAsIGBtZWFuYCwgYG1lYW5CeWAsXG4gKiBgbWluYCwgYG1pbkJ5YCwgYG11bHRpcGx5YCwgYG5vQ29uZmxpY3RgLCBgbm9vcGAsIGBub3dgLCBgbnRoYCwgYHBhZGAsXG4gKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAqIGByZXBlYXRgLCBgcmVzdWx0YCwgYHJvdW5kYCwgYHJ1bkluQ29udGV4dGAsIGBzYW1wbGVgLCBgc2hpZnRgLCBgc2l6ZWAsXG4gKiBgc25ha2VDYXNlYCwgYHNvbWVgLCBgc29ydGVkSW5kZXhgLCBgc29ydGVkSW5kZXhCeWAsIGBzb3J0ZWRMYXN0SW5kZXhgLFxuICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICogYHN0dWJPYmplY3RgLCBgc3R1YlN0cmluZ2AsIGBzdHViVHJ1ZWAsIGBzdWJ0cmFjdGAsIGBzdW1gLCBgc3VtQnlgLFxuICogYHRlbXBsYXRlYCwgYHRpbWVzYCwgYHRvRmluaXRlYCwgYHRvSW50ZWdlcmAsIGB0b0pTT05gLCBgdG9MZW5ndGhgLFxuICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICogYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYHRydW5jYXRlYCwgYHVuZXNjYXBlYCwgYHVuaXF1ZUlkYCwgYHVwcGVyQ2FzZWAsXG4gKiBgdXBwZXJGaXJzdGAsIGB2YWx1ZWAsIGFuZCBgd29yZHNgXG4gKlxuICogQG5hbWUgX1xuICogQGNvbnN0cnVjdG9yXG4gKiBAY2F0ZWdvcnkgU2VxXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwIGluIGEgYGxvZGFzaGAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAqICAgcmV0dXJuIG4gKiBuO1xuICogfVxuICpcbiAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICpcbiAqIC8vIFJldHVybnMgYW4gdW53cmFwcGVkIHZhbHVlLlxuICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICogLy8gPT4gNlxuICpcbiAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICogdmFyIHNxdWFyZXMgPSB3cmFwcGVkLm1hcChzcXVhcmUpO1xuICpcbiAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICBpZiAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNBcnJheSh2YWx1ZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvZGFzaFdyYXBwZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdfX3dyYXBwZWRfXycpKSB7XG4gICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbn1cblxuLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLlxubG9kYXNoLnByb3RvdHlwZSA9IGJhc2VMb2Rhc2gucHJvdG90eXBlO1xubG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuZXhwb3J0IGRlZmF1bHQgbG9kYXNoO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBhc3NlcnQ7XG5cbmZ1bmN0aW9uIGFzc2VydCh2YWwsIG1zZykge1xuICBpZiAoIXZhbClcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG59XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGFzc2VydEVxdWFsKGwsIHIsIG1zZykge1xuICBpZiAobCAhPSByKVxuICAgIHRocm93IG5ldyBFcnJvcihtc2cgfHwgKCdBc3NlcnRpb24gZmFpbGVkOiAnICsgbCArICcgIT0gJyArIHIpKTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjt2YXIgYXNzaWduPU9iamVjdC5hc3NpZ24uYmluZChPYmplY3QpO21vZHVsZS5leHBvcnRzPWFzc2lnbjttb2R1bGUuZXhwb3J0cy5kZWZhdWx0PW1vZHVsZS5leHBvcnRzO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9b2JqZWN0LWFzc2lnbi5qcy5tYXAiLCJcbiAgICAod2luZG93Ll9fTkVYVF9QID0gd2luZG93Ll9fTkVYVF9QIHx8IFtdKS5wdXNoKFtcbiAgICAgIFwiL1wiLFxuICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZShcIkc6XFxcXHR5cGVzY3JpcHQtc29saWRpdHktZGV2LXN0YXJ0ZXIta2l0XFxcXHNyY1xcXFxwYWdlc1xcXFxpbmRleC50c3hcIik7XG4gICAgICB9XG4gICAgXSk7XG4gICIsIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbigpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDE0OTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxudmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuXG5cbi8qKiovIH0pXG5cbi8qKioqKiovIFx0fSk7XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fbmNjd3Bja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG4vKioqKioqLyBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuLyoqKioqKi8gXHRcdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0dmFyIHRocmV3ID0gdHJ1ZTtcbi8qKioqKiovIFx0XHR0cnkge1xuLyoqKioqKi8gXHRcdFx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX19uY2N3cGNrX3JlcXVpcmVfXyk7XG4vKioqKioqLyBcdFx0XHR0aHJldyA9IGZhbHNlO1xuLyoqKioqKi8gXHRcdH0gZmluYWxseSB7XG4vKioqKioqLyBcdFx0XHRpZih0aHJldykgZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi8gXHRcbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqLyBcdC8qIHdlYnBhY2svcnVudGltZS9jb21wYXQgKi9cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdF9fbmNjd3Bja19yZXF1aXJlX18uYWIgPSBfX2Rpcm5hbWUgKyBcIi9cIjsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvLyBtb2R1bGUgZXhwb3J0cyBtdXN0IGJlIHJldHVybmVkIGZyb20gcnVudGltZSBzbyBlbnRyeSBpbmxpbmluZyBpcyBkaXNhYmxlZFxuLyoqKioqKi8gXHQvLyBzdGFydHVwXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX19uY2N3cGNrX3JlcXVpcmVfXygxNDkpO1xuLyoqKioqKi8gfSkoKVxuOyIsIm1vZHVsZS5leHBvcnRzID1cbi8qKioqKiovIChmdW5jdGlvbigpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZXNfXyA9ICh7XG5cbi8qKiovIDkzMTpcbi8qKiovIChmdW5jdGlvbihtb2R1bGUpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvcmlnaW5hbE1vZHVsZSkge1xuXHRpZiAoIW9yaWdpbmFsTW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdHZhciBtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG9yaWdpbmFsTW9kdWxlKTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJleHBvcnRzXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWVcblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oOTMxKTtcbi8qKioqKiovIH0pKClcbjsiLCJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA4ODA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oODgwKTtcbi8qKioqKiovIH0pKClcbjsiLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIHZhciBoYXMgPSBGdW5jdGlvbi5jYWxsLmJpbmQoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgJiYgIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgIChjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycpICsgJzogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICcgK1xuICAgICAgICAgICAgbG9jYXRpb24gKyAnIGAnICsgdHlwZVNwZWNOYW1lICsgJ2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAnICsgdHlwZW9mIGVycm9yICsgJy4gJyArXG4gICAgICAgICAgICAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArXG4gICAgICAgICAgICAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICtcbiAgICAgICAgICAgICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdGYWlsZWQgJyArIGxvY2F0aW9uICsgJyB0eXBlOiAnICsgZXJyb3IubWVzc2FnZSArIChzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVzZXRzIHdhcm5pbmcgY2FjaGUgd2hlbiB0ZXN0aW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG52YXIgYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG52YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xudmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHByaW50V2FybmluZyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgdGV4dDtcbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9IGNhdGNoICh4KSB7fVxuICB9O1xufVxuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAvKiBnbG9iYWwgU3ltYm9sICovXG4gIHZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbiAgdmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAgICpcbiAgICogQmUgc3VyZSB0byBpbnZva2UgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZXJhYmxlIGFzIGNvbnRleHQ6XG4gICAqXG4gICAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gICAqICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gICAqICAgICAgIC4uLlxuICAgKiAgICAgfVxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBtYXliZUl0ZXJhYmxlICYmIChJVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtJVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIG1ldGhvZHMgdGhhdCBhbGxvdyBkZWNsYXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBvZiBwcm9wcyB0aGF0IGFyZVxuICAgKiBzdXBwbGllZCB0byBSZWFjdCBjb21wb25lbnRzLiBFeGFtcGxlIHVzYWdlOlxuICAgKlxuICAgKiAgIHZhciBQcm9wcyA9IHJlcXVpcmUoJ1JlYWN0UHJvcFR5cGVzJyk7XG4gICAqICAgdmFyIE15QXJ0aWNsZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgcHJvcCBuYW1lZCBcImRlc2NyaXB0aW9uXCIuXG4gICAqICAgICAgIGRlc2NyaXB0aW9uOiBQcm9wcy5zdHJpbmcsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcmVxdWlyZWQgZW51bSBwcm9wIG5hbWVkIFwiY2F0ZWdvcnlcIi5cbiAgICogICAgICAgY2F0ZWdvcnk6IFByb3BzLm9uZU9mKFsnTmV3cycsJ1Bob3RvcyddKS5pc1JlcXVpcmVkLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHByb3AgbmFtZWQgXCJkaWFsb2dcIiB0aGF0IHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIERpYWxvZy5cbiAgICogICAgICAgZGlhbG9nOiBQcm9wcy5pbnN0YW5jZU9mKERpYWxvZykuaXNSZXF1aXJlZFxuICAgKiAgICAgfSxcbiAgICogICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7IC4uLiB9XG4gICAqICAgfSk7XG4gICAqXG4gICAqIEEgbW9yZSBmb3JtYWwgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZDpcbiAgICpcbiAgICogICB0eXBlIDo9IGFycmF5fGJvb2x8ZnVuY3xvYmplY3R8bnVtYmVyfHN0cmluZ3xvbmVPZihbLi4uXSl8aW5zdGFuY2VPZiguLi4pXG4gICAqICAgZGVjbCA6PSBSZWFjdFByb3BUeXBlcy57dHlwZX0oLmlzUmVxdWlyZWQpP1xuICAgKlxuICAgKiBFYWNoIGFuZCBldmVyeSBkZWNsYXJhdGlvbiBwcm9kdWNlcyBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBUaGlzXG4gICAqIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogIHZhciBNeUxpbmsgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgIHByb3BUeXBlczoge1xuICAgKiAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBvciBVUkkgcHJvcCBuYW1lZCBcImhyZWZcIi5cbiAgICogICAgICBocmVmOiBmdW5jdGlvbihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICogICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAqICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHByb3BWYWx1ZSAhPT0gJ3N0cmluZycgJiZcbiAgICogICAgICAgICAgICAhKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFVSSSkpIHtcbiAgICogICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcbiAgICogICAgICAgICAgICAnRXhwZWN0ZWQgYSBzdHJpbmcgb3IgYW4gVVJJIGZvciAnICsgcHJvcE5hbWUgKyAnIGluICcgK1xuICAgKiAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICogICAgICAgICAgKTtcbiAgICogICAgICAgIH1cbiAgICogICAgICB9XG4gICAqICAgIH0sXG4gICAqICAgIHJlbmRlcjogZnVuY3Rpb24oKSB7Li4ufVxuICAgKiAgfSk7XG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICB2YXIgQU5PTllNT1VTID0gJzw8YW5vbnltb3VzPj4nO1xuXG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMuanNgLlxuICB2YXIgUmVhY3RQcm9wVHlwZXMgPSB7XG4gICAgYXJyYXk6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdhcnJheScpLFxuICAgIGJvb2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdib29sZWFuJyksXG4gICAgZnVuYzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Z1bmN0aW9uJyksXG4gICAgbnVtYmVyOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignbnVtYmVyJyksXG4gICAgb2JqZWN0OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignb2JqZWN0JyksXG4gICAgc3RyaW5nOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3RyaW5nJyksXG4gICAgc3ltYm9sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignc3ltYm9sJyksXG5cbiAgICBhbnk6IGNyZWF0ZUFueVR5cGVDaGVja2VyKCksXG4gICAgYXJyYXlPZjogY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyLFxuICAgIGVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpLFxuICAgIGVsZW1lbnRUeXBlOiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyLFxuICAgIGV4YWN0OiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyLFxuICB9O1xuXG4gIC8qKlxuICAgKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pc1xuICAgKi9cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICAgIGlmICh4ID09PSB5KSB7XG4gICAgICAvLyBTdGVwcyAxLTUsIDctMTBcbiAgICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgICByZXR1cm4geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICAgIH1cbiAgfVxuICAvKmVzbGludC1lbmFibGUgbm8tc2VsZi1jb21wYXJlKi9cblxuICAvKipcbiAgICogV2UgdXNlIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzIHBlb3BsZSBtYXkgY2FsbFxuICAgKiBQcm9wVHlwZXMgZGlyZWN0bHkgYW5kIGluc3BlY3QgdGhlaXIgb3V0cHV0LiBIb3dldmVyLCB3ZSBkb24ndCB1c2UgcmVhbFxuICAgKiBFcnJvcnMgYW55bW9yZS4gV2UgZG9uJ3QgaW5zcGVjdCB0aGVpciBzdGFjayBhbnl3YXksIGFuZCBjcmVhdGluZyB0aGVtXG4gICAqIGlzIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIGlmIHRoZXkgYXJlIGNyZWF0ZWQgdG9vIG9mdGVuLCBzdWNoIGFzIHdoYXRcbiAgICogaGFwcGVucyBpbiBvbmVPZlR5cGUoKSBmb3IgYW55IHR5cGUgYmVmb3JlIHRoZSBvbmUgdGhhdCBtYXRjaGVkLlxuICAgKi9cbiAgZnVuY3Rpb24gUHJvcFR5cGVFcnJvcihtZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSAgKyAnYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIVJlYWN0SXMuaXNWYWxpZEVsZW1lbnRUeXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50IHR5cGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyKGV4cGVjdGVkQ2xhc3MpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghKHByb3BzW3Byb3BOYW1lXSBpbnN0YW5jZW9mIGV4cGVjdGVkQ2xhc3MpKSB7XG4gICAgICAgIHZhciBleHBlY3RlZENsYXNzTmFtZSA9IGV4cGVjdGVkQ2xhc3MubmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICAgIHZhciBhY3R1YWxDbGFzc05hbWUgPSBnZXRDbGFzc05hbWUocHJvcHNbcHJvcE5hbWVdKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgYWN0dWFsQ2xhc3NOYW1lICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkICcpICsgKCdpbnN0YW5jZSBvZiBgJyArIGV4cGVjdGVkQ2xhc3NOYW1lICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIoZXhwZWN0ZWRWYWx1ZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZXhwZWN0ZWRWYWx1ZXMpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudHMgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LCBnb3QgJyArIGFyZ3VtZW50cy5sZW5ndGggKyAnIGFyZ3VtZW50cy4gJyArXG4gICAgICAgICAgICAnQSBjb21tb24gbWlzdGFrZSBpcyB0byB3cml0ZSBvbmVPZih4LCB5LCB6KSBpbnN0ZWFkIG9mIG9uZU9mKFt4LCB5LCB6XSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mLCBleHBlY3RlZCBhbiBhcnJheS4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMsIGZ1bmN0aW9uIHJlcGxhY2VyKGtleSwgdmFsdWUpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgICAgIGlmICh0eXBlID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIFN0cmluZyhwcm9wVmFsdWUpICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIG9uZSBvZiAnICsgdmFsdWVzU3RyaW5nICsgJy4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIG9iamVjdC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gcHJvcFZhbHVlKSB7XG4gICAgICAgIGlmIChoYXMocHJvcFZhbHVlLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAnICsgZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKGNoZWNrZXIpICsgJyBhdCBpbmRleCAnICsgaSArICcuJ1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTdHJpY3RTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIGFsbCBrZXlzIGluIGNhc2Ugc29tZSBhcmUgcmVxdWlyZWQgYnV0IG1pc3NpbmcgZnJvbVxuICAgICAgLy8gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Aga2V5IGAnICsga2V5ICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AuJyArXG4gICAgICAgICAgICAnXFxuQmFkIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KHByb3BzW3Byb3BOYW1lXSwgbnVsbCwgJyAgJykgK1xuICAgICAgICAgICAgJ1xcblZhbGlkIGtleXM6ICcgKyAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmtleXMoc2hhcGVUeXBlcyksIG51bGwsICcgICcpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTm9kZShwcm9wVmFsdWUpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wVmFsdWUpIHtcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgcmV0dXJuICFwcm9wVmFsdWU7XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BWYWx1ZS5ldmVyeShpc05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IG51bGwgfHwgaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKHByb3BWYWx1ZSk7XG4gICAgICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKHByb3BWYWx1ZSk7XG4gICAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IHByb3BWYWx1ZS5lbnRyaWVzKSB7XG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIGlmICghaXNOb2RlKHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTm9kZShlbnRyeVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkge1xuICAgIC8vIE5hdGl2ZSBTeW1ib2wuXG4gICAgaWYgKHByb3BUeXBlID09PSAnc3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZmFsc3kgdmFsdWUgY2FuJ3QgYmUgYSBTeW1ib2xcbiAgICBpZiAoIXByb3BWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlID0gY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGU7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKFJlYWN0SXMuaXNFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC1kb20uZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG52YXIgU2NoZWR1bGVyID0gcmVxdWlyZSgnc2NoZWR1bGVyJyk7XG52YXIgdHJhY2luZyA9IHJlcXVpcmUoJ3NjaGVkdWxlci90cmFjaW5nJyk7XG5cbnZhciBSZWFjdFNoYXJlZEludGVybmFscyA9IFJlYWN0Ll9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1xuXG4vLyBieSBjYWxscyB0byB0aGVzZSBtZXRob2RzIGJ5IGEgQmFiZWwgcGx1Z2luLlxuLy9cbi8vIEluIFBST0QgKG9yIGluIHBhY2thZ2VzIHdpdGhvdXQgYWNjZXNzIHRvIFJlYWN0IGludGVybmFscyksXG4vLyB0aGV5IGFyZSBsZWZ0IGFzIHRoZXkgYXJlIGluc3RlYWQuXG5cbmZ1bmN0aW9uIHdhcm4oZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ3dhcm4nLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5mdW5jdGlvbiBlcnJvcihmb3JtYXQpIHtcbiAge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHByaW50V2FybmluZygnZXJyb3InLCBmb3JtYXQsIGFyZ3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzKSB7XG4gIC8vIFdoZW4gY2hhbmdpbmcgdGhpcyBsb2dpYywgeW91IG1pZ2h0IHdhbnQgdG8gYWxzb1xuICAvLyB1cGRhdGUgY29uc29sZVdpdGhTdGFja0Rldi53d3cuanMgYXMgd2VsbC5cbiAge1xuICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICB2YXIgc3RhY2sgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldFN0YWNrQWRkZW5kdW0oKTtcblxuICAgIGlmIChzdGFjayAhPT0gJycpIHtcbiAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KFtzdGFja10pO1xuICAgIH1cblxuICAgIHZhciBhcmdzV2l0aEZvcm1hdCA9IGFyZ3MubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICByZXR1cm4gJycgKyBpdGVtO1xuICAgIH0pOyAvLyBDYXJlZnVsOiBSTiBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGlzIHByZWZpeFxuXG4gICAgYXJnc1dpdGhGb3JtYXQudW5zaGlmdCgnV2FybmluZzogJyArIGZvcm1hdCk7IC8vIFdlIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIHNwcmVhZCAob3IgLmFwcGx5KSBkaXJlY3RseSBiZWNhdXNlIGl0XG4gICAgLy8gYnJlYWtzIElFOTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMzYxMFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmdcblxuICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzV2l0aEZvcm1hdCk7XG4gIH1cbn1cblxuaWYgKCFSZWFjdCkge1xuICB7XG4gICAgdGhyb3cgRXJyb3IoIFwiUmVhY3RET00gd2FzIGxvYWRlZCBiZWZvcmUgUmVhY3QuIE1ha2Ugc3VyZSB5b3UgbG9hZCB0aGUgUmVhY3QgcGFja2FnZSBiZWZvcmUgbG9hZGluZyBSZWFjdERPTS5cIiApO1xuICB9XG59XG5cbnZhciBGdW5jdGlvbkNvbXBvbmVudCA9IDA7XG52YXIgQ2xhc3NDb21wb25lbnQgPSAxO1xudmFyIEluZGV0ZXJtaW5hdGVDb21wb25lbnQgPSAyOyAvLyBCZWZvcmUgd2Uga25vdyB3aGV0aGVyIGl0IGlzIGZ1bmN0aW9uIG9yIGNsYXNzXG5cbnZhciBIb3N0Um9vdCA9IDM7IC8vIFJvb3Qgb2YgYSBob3N0IHRyZWUuIENvdWxkIGJlIG5lc3RlZCBpbnNpZGUgYW5vdGhlciBub2RlLlxuXG52YXIgSG9zdFBvcnRhbCA9IDQ7IC8vIEEgc3VidHJlZS4gQ291bGQgYmUgYW4gZW50cnkgcG9pbnQgdG8gYSBkaWZmZXJlbnQgcmVuZGVyZXIuXG5cbnZhciBIb3N0Q29tcG9uZW50ID0gNTtcbnZhciBIb3N0VGV4dCA9IDY7XG52YXIgRnJhZ21lbnQgPSA3O1xudmFyIE1vZGUgPSA4O1xudmFyIENvbnRleHRDb25zdW1lciA9IDk7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gMTA7XG52YXIgRm9yd2FyZFJlZiA9IDExO1xudmFyIFByb2ZpbGVyID0gMTI7XG52YXIgU3VzcGVuc2VDb21wb25lbnQgPSAxMztcbnZhciBNZW1vQ29tcG9uZW50ID0gMTQ7XG52YXIgU2ltcGxlTWVtb0NvbXBvbmVudCA9IDE1O1xudmFyIExhenlDb21wb25lbnQgPSAxNjtcbnZhciBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQgPSAxNztcbnZhciBEZWh5ZHJhdGVkRnJhZ21lbnQgPSAxODtcbnZhciBTdXNwZW5zZUxpc3RDb21wb25lbnQgPSAxOTtcbnZhciBGdW5kYW1lbnRhbENvbXBvbmVudCA9IDIwO1xudmFyIFNjb3BlQ29tcG9uZW50ID0gMjE7XG52YXIgQmxvY2sgPSAyMjtcbnZhciBPZmZzY3JlZW5Db21wb25lbnQgPSAyMztcbnZhciBMZWdhY3lIaWRkZW5Db21wb25lbnQgPSAyNDtcblxuLy8gRmlsdGVyIGNlcnRhaW4gRE9NIGF0dHJpYnV0ZXMgKGUuZy4gc3JjLCBocmVmKSBpZiB0aGVpciB2YWx1ZXMgYXJlIGVtcHR5IHN0cmluZ3MuXG5cbnZhciBlbmFibGVQcm9maWxlclRpbWVyID0gdHJ1ZTsgLy8gUmVjb3JkIGR1cmF0aW9ucyBmb3IgY29tbWl0IGFuZCBwYXNzaXZlIGVmZmVjdHMgcGhhc2VzLlxuXG52YXIgZW5hYmxlRnVuZGFtZW50YWxBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIFNjb3BlIHN1cHBvcnQuXG52YXIgZW5hYmxlTmV3UmVjb25jaWxlciA9IGZhbHNlOyAvLyBFcnJvcnMgdGhhdCBhcmUgdGhyb3duIHdoaWxlIHVubW91bnRpbmcgKG9yIGFmdGVyIGluIHRoZSBjYXNlIG9mIHBhc3NpdmUgZWZmZWN0cylcbnZhciB3YXJuQWJvdXRTdHJpbmdSZWZzID0gZmFsc2U7XG5cbnZhciBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCk7XG4vKipcbiAqIE1hcHBpbmcgZnJvbSByZWdpc3RyYXRpb24gbmFtZSB0byBldmVudCBuYW1lXG4gKi9cblxuXG52YXIgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcyA9IHt9O1xuLyoqXG4gKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAqIHVzZWQgdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGV2ZW50IGhhbmRsZXJzLiBBdmFpbGFibGVcbiAqIG9ubHkgaW4gdHJ1ZS5cbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cblxudmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSAge30gOyAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gdHJ1ZVxuXG5mdW5jdGlvbiByZWdpc3RlclR3b1BoYXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgJ0NhcHR1cmUnLCBkZXBlbmRlbmNpZXMpO1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpIHtcbiAge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdKSB7XG4gICAgICBlcnJvcignRXZlbnRSZWdpc3RyeTogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgJyArICdyZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuXG4gIHtcbiAgICB2YXIgbG93ZXJDYXNlZE5hbWUgPSByZWdpc3RyYXRpb25OYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgIGFsbE5hdGl2ZUV2ZW50cy5hZGQoZGVwZW5kZW5jaWVzW2ldKTtcbiAgfVxufVxuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ICE9PSAndW5kZWZpbmVkJyk7XG5cbi8vIEEgcmVzZXJ2ZWQgYXR0cmlidXRlLlxuLy8gSXQgaXMgaGFuZGxlZCBieSBSZWFjdCBzZXBhcmF0ZWx5IGFuZCBzaG91bGRuJ3QgYmUgd3JpdHRlbiB0byB0aGUgRE9NLlxudmFyIFJFU0VSVkVEID0gMDsgLy8gQSBzaW1wbGUgc3RyaW5nIGF0dHJpYnV0ZS5cbi8vIEF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpbHRlciBhcmUgcHJlc3VtZWQgdG8gaGF2ZSB0aGlzIHR5cGUuXG5cbnZhciBTVFJJTkcgPSAxOyAvLyBBIHN0cmluZyBhdHRyaWJ1dGUgdGhhdCBhY2NlcHRzIGJvb2xlYW5zIGluIFJlYWN0LiBJbiBIVE1MLCB0aGVzZSBhcmUgY2FsbGVkXG4vLyBcImVudW1lcmF0ZWRcIiBhdHRyaWJ1dGVzIHdpdGggXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIiBhcyBwb3NzaWJsZSB2YWx1ZXMuXG4vLyBXaGVuIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gYSBcInRydWVcIiBzdHJpbmcuXG4vLyBXaGVuIGZhbHNlLCBpdCBzaG91bGQgYmUgc2V0IHRvIGEgXCJmYWxzZVwiIHN0cmluZy5cblxudmFyIEJPT0xFQU5JU0hfU1RSSU5HID0gMjsgLy8gQSByZWFsIGJvb2xlYW4gYXR0cmlidXRlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG5cbnZhciBCT09MRUFOID0gMzsgLy8gQW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIGFzIHdlbGwgYXMgd2l0aCBhIHZhbHVlLlxuLy8gV2hlbiB0cnVlLCBpdCBzaG91bGQgYmUgcHJlc2VudCAoc2V0IGVpdGhlciB0byBhbiBlbXB0eSBzdHJpbmcgb3IgaXRzIG5hbWUpLlxuLy8gV2hlbiBmYWxzZSwgaXQgc2hvdWxkIGJlIG9taXR0ZWQuXG4vLyBGb3IgYW55IG90aGVyIHZhbHVlLCBzaG91bGQgYmUgcHJlc2VudCB3aXRoIHRoYXQgdmFsdWUuXG5cbnZhciBPVkVSTE9BREVEX0JPT0xFQU4gPSA0OyAvLyBBbiBhdHRyaWJ1dGUgdGhhdCBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljLlxuLy8gV2hlbiBmYWxzeSwgaXQgc2hvdWxkIGJlIHJlbW92ZWQuXG5cbnZhciBOVU1FUklDID0gNTsgLy8gQW4gYXR0cmlidXRlIHRoYXQgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmUgbnVtZXJpYy5cbi8vIFdoZW4gZmFsc3ksIGl0IHNob3VsZCBiZSByZW1vdmVkLlxuXG52YXIgUE9TSVRJVkVfTlVNRVJJQyA9IDY7XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gXCI6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXCI7XG4vKiBlc2xpbnQtZW5hYmxlIG1heC1sZW4gKi9cblxudmFyIEFUVFJJQlVURV9OQU1FX0NIQVIgPSBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgXCJcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MFwiO1xudmFyIFJPT1RfQVRUUklCVVRFX05BTUUgPSAnZGF0YS1yZWFjdHJvb3QnO1xudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5mdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gdHJ1ZTtcblxuICB7XG4gICAgZXJyb3IoJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUF0dHJpYnV0ZShuYW1lLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICByZXR1cm4gcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEO1xuICB9XG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKG5hbWUubGVuZ3RoID4gMiAmJiAobmFtZVswXSA9PT0gJ28nIHx8IG5hbWVbMF0gPT09ICdPJykgJiYgKG5hbWVbMV0gPT09ICduJyB8fCBuYW1lWzFdID09PSAnTicpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBzaG91bGRSZW1vdmVBdHRyaWJ1dGVXaXRoV2FybmluZyhuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsICYmIHByb3BlcnR5SW5mby50eXBlID09PSBSRVNFUlZFRCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgY2FzZSAnZnVuY3Rpb24nOiAvLyAkRmxvd0lzc3VlIHN5bWJvbCBpcyBwZXJmZWN0bHkgdmFsaWQgaGVyZVxuXG4gICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICB7XG4gICAgICAgIGlmIChpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SW5mby5hY2NlcHRzQm9vbGVhbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHByZWZpeCA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICE9PSAnZGF0YS0nICYmIHByZWZpeCAhPT0gJ2FyaWEtJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocHJvcGVydHlJbmZvICE9PSBudWxsKSB7XG5cbiAgICBzd2l0Y2ggKHByb3BlcnR5SW5mby50eXBlKSB7XG4gICAgICBjYXNlIEJPT0xFQU46XG4gICAgICAgIHJldHVybiAhdmFsdWU7XG5cbiAgICAgIGNhc2UgT1ZFUkxPQURFRF9CT09MRUFOOlxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IGZhbHNlO1xuXG4gICAgICBjYXNlIE5VTUVSSUM6XG4gICAgICAgIHJldHVybiBpc05hTih2YWx1ZSk7XG5cbiAgICAgIGNhc2UgUE9TSVRJVkVfTlVNRVJJQzpcbiAgICAgICAgcmV0dXJuIGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA8IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UHJvcGVydHlJbmZvKG5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBwcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIHR5cGUsIG11c3RVc2VQcm9wZXJ0eSwgYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZXNwYWNlLCBzYW5pdGl6ZVVSTCwgcmVtb3ZlRW1wdHlTdHJpbmcpIHtcbiAgdGhpcy5hY2NlcHRzQm9vbGVhbnMgPSB0eXBlID09PSBCT09MRUFOSVNIX1NUUklORyB8fCB0eXBlID09PSBCT09MRUFOIHx8IHR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTjtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgdGhpcy5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBhdHRyaWJ1dGVOYW1lc3BhY2U7XG4gIHRoaXMubXVzdFVzZVByb3BlcnR5ID0gbXVzdFVzZVByb3BlcnR5O1xuICB0aGlzLnByb3BlcnR5TmFtZSA9IG5hbWU7XG4gIHRoaXMudHlwZSA9IHR5cGU7XG4gIHRoaXMuc2FuaXRpemVVUkwgPSBzYW5pdGl6ZVVSTDtcbiAgdGhpcy5yZW1vdmVFbXB0eVN0cmluZyA9IHJlbW92ZUVtcHR5U3RyaW5nO1xufSAvLyBXaGVuIGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRoaXMgbGlzdCwgYmUgc3VyZSB0byBhbHNvIGFkZCB0aGVtIHRvXG4vLyB0aGUgYHBvc3NpYmxlU3RhbmRhcmROYW1lc2AgbW9kdWxlIHRvIGVuc3VyZSBjYXNpbmcgYW5kIGluY29ycmVjdFxuLy8gbmFtZSB3YXJuaW5ncy5cblxuXG52YXIgcHJvcGVydGllcyA9IHt9OyAvLyBUaGVzZSBwcm9wcyBhcmUgcmVzZXJ2ZWQgYnkgUmVhY3QuIFRoZXkgc2hvdWxkbid0IGJlIHdyaXR0ZW4gdG8gdGhlIERPTS5cblxudmFyIHJlc2VydmVkUHJvcHMgPSBbJ2NoaWxkcmVuJywgJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJywgLy8gVE9ETzogVGhpcyBwcmV2ZW50cyB0aGUgYXNzaWdubWVudCBvZiBkZWZhdWx0VmFsdWUgdG8gcmVndWxhclxuLy8gZWxlbWVudHMgKG5vdCBqdXN0IGlucHV0cykuIE5vdyB0aGF0IFJlYWN0RE9NSW5wdXQgYXNzaWducyB0byB0aGVcbi8vIGRlZmF1bHRWYWx1ZSBwcm9wZXJ0eSAtLSBkbyB3ZSBuZWVkIHRoaXM/XG4nZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgJ2lubmVySFRNTCcsICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLCAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJywgJ3N0eWxlJ107XG5yZXNlcnZlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgUkVTRVJWRUQsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBBIGZldyBSZWFjdCBzdHJpbmcgYXR0cmlidXRlcyBoYXZlIGEgZGlmZmVyZW50IG5hbWUuXG4vLyBUaGlzIGlzIGEgbWFwcGluZyBmcm9tIFJlYWN0IHByb3AgbmFtZXMgdG8gdGhlIGF0dHJpYnV0ZSBuYW1lcy5cblxuW1snYWNjZXB0Q2hhcnNldCcsICdhY2NlcHQtY2hhcnNldCddLCBbJ2NsYXNzTmFtZScsICdjbGFzcyddLCBbJ2h0bWxGb3InLCAnZm9yJ10sIFsnaHR0cEVxdWl2JywgJ2h0dHAtZXF1aXYnXV0uZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICB2YXIgbmFtZSA9IF9yZWZbMF0sXG4gICAgICBhdHRyaWJ1dGVOYW1lID0gX3JlZlsxXTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIFwiZW51bWVyYXRlZFwiIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFjY2VwdCBcInRydWVcIiBhbmQgXCJmYWxzZVwiLlxuLy8gSW4gUmVhY3QsIHdlIGxldCB1c2VycyBwYXNzIGB0cnVlYCBhbmQgYGZhbHNlYCBldmVuIHRob3VnaCB0ZWNobmljYWxseVxuLy8gdGhlc2UgYXJlbid0IGJvb2xlYW4gYXR0cmlidXRlcyAodGhleSBhcmUgY29lcmNlZCB0byBzdHJpbmdzKS5cblxuWydjb250ZW50RWRpdGFibGUnLCAnZHJhZ2dhYmxlJywgJ3NwZWxsQ2hlY2snLCAndmFsdWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gIHByb3BlcnRpZXNbbmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKG5hbWUsIEJPT0xFQU5JU0hfU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgXCJlbnVtZXJhdGVkXCIgU1ZHIGF0dHJpYnV0ZXMgdGhhdCBhY2NlcHQgXCJ0cnVlXCIgYW5kIFwiZmFsc2VcIi5cbi8vIEluIFJlYWN0LCB3ZSBsZXQgdXNlcnMgcGFzcyBgdHJ1ZWAgYW5kIGBmYWxzZWAgZXZlbiB0aG91Z2ggdGVjaG5pY2FsbHlcbi8vIHRoZXNlIGFyZW4ndCBib29sZWFuIGF0dHJpYnV0ZXMgKHRoZXkgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncykuXG4vLyBTaW5jZSB0aGVzZSBhcmUgU1ZHIGF0dHJpYnV0ZXMsIHRoZWlyIGF0dHJpYnV0ZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG5cblsnYXV0b1JldmVyc2UnLCAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsICdmb2N1c2FibGUnLCAncHJlc2VydmVBbHBoYSddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTklTSF9TVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgbmFtZSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgSFRNTCBib29sZWFuIGF0dHJpYnV0ZXMuXG5cblsnYWxsb3dGdWxsU2NyZWVuJywgJ2FzeW5jJywgLy8gTm90ZTogdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIERPTVxuLy8gb24gdGhlIGNsaWVudCBzaWRlIGJlY2F1c2UgdGhlIGJyb3dzZXJzIGFyZSBpbmNvbnNpc3RlbnQuIEluc3RlYWQgd2UgY2FsbCBmb2N1cygpLlxuJ2F1dG9Gb2N1cycsICdhdXRvUGxheScsICdjb250cm9scycsICdkZWZhdWx0JywgJ2RlZmVyJywgJ2Rpc2FibGVkJywgJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJywgJ2Rpc2FibGVSZW1vdGVQbGF5YmFjaycsICdmb3JtTm9WYWxpZGF0ZScsICdoaWRkZW4nLCAnbG9vcCcsICdub01vZHVsZScsICdub1ZhbGlkYXRlJywgJ29wZW4nLCAncGxheXNJbmxpbmUnLCAncmVhZE9ubHknLCAncmVxdWlyZWQnLCAncmV2ZXJzZWQnLCAnc2NvcGVkJywgJ3NlYW1sZXNzJywgLy8gTWljcm9kYXRhXG4naXRlbVNjb3BlJ10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBCT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBUaGVzZSBhcmUgdGhlIGZldyBSZWFjdCBwcm9wcyB0aGF0IHdlIHNldCBhcyBET00gcHJvcGVydGllc1xuLy8gcmF0aGVyIHRoYW4gYXR0cmlidXRlcy4gVGhlc2UgYXJlIGFsbCBib29sZWFucy5cblxuWydjaGVja2VkJywgLy8gTm90ZTogYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbi8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuIFdlIGhhdmUgc3BlY2lhbCBsb2dpYyBmb3IgaGFuZGxpbmcgdGhpcy5cbidtdWx0aXBsZScsICdtdXRlZCcsICdzZWxlY3RlZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgQk9PTEVBTiwgdHJ1ZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IGFyZSBcIm92ZXJsb2FkZWQgYm9vbGVhbnNcIjogdGhleSBiZWhhdmUgbGlrZVxuLy8gYm9vbGVhbnMsIGJ1dCBjYW4gYWxzbyBhY2NlcHQgYSBzdHJpbmcgdmFsdWUuXG5cblsnY2FwdHVyZScsICdkb3dubG9hZCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgT1ZFUkxPQURFRF9CT09MRUFOLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcG9zaXRpdmUgbnVtYmVycy5cblxuWydjb2xzJywgJ3Jvd3MnLCAnc2l6ZScsICdzcGFuJyAvLyBOT1RFOiBpZiB5b3UgYWRkIGEgY2FtZWxDYXNlZCBwcm9wIHRvIHRoaXMgbGlzdCxcbi8vIHlvdSdsbCBuZWVkIHRvIHNldCBhdHRyaWJ1dGVOYW1lIHRvIG5hbWUudG9Mb3dlckNhc2UoKVxuLy8gaW5zdGVhZCBpbiB0aGUgYXNzaWdubWVudCBiZWxvdy5cbl0uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBQT1NJVElWRV9OVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUsIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gVGhlc2UgYXJlIEhUTUwgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgbnVtYmVycy5cblxuWydyb3dTcGFuJywgJ3N0YXJ0J10uZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBOVU1FUklDLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIG5hbWUudG9Mb3dlckNhc2UoKSwgLy8gYXR0cmlidXRlTmFtZVxuICBudWxsLCAvLyBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pO1xudmFyIENBTUVMSVpFID0gL1tcXC1cXDpdKFthLXpdKS9nO1xuXG52YXIgY2FwaXRhbGl6ZSA9IGZ1bmN0aW9uICh0b2tlbikge1xuICByZXR1cm4gdG9rZW5bMV0udG9VcHBlckNhc2UoKTtcbn07IC8vIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBTVkcgYXR0cmlidXRlcyB0aGF0IG5lZWQgc3BlY2lhbCBjYXNpbmcsIG5hbWVzcGFjaW5nLFxuLy8gb3IgYm9vbGVhbiB2YWx1ZSBhc3NpZ25tZW50LiBSZWd1bGFyIGF0dHJpYnV0ZXMgdGhhdCBqdXN0IGFjY2VwdCBzdHJpbmdzXG4vLyBhbmQgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcmUgb21pdHRlZCwganVzdCBsaWtlIGluIHRoZSBIVE1MIGF0dHJpYnV0ZSBmaWx0ZXIuXG4vLyBTb21lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIGhhcmQgdG8gZmluZC4gVGhpcyBsaXN0IHdhcyBjcmVhdGVkIGJ5XG4vLyBzY3JhcGluZyB0aGUgTUROIGRvY3VtZW50YXRpb24uXG5cblxuWydhY2NlbnQtaGVpZ2h0JywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhcmFiaWMtZm9ybScsICdiYXNlbGluZS1zaGlmdCcsICdjYXAtaGVpZ2h0JywgJ2NsaXAtcGF0aCcsICdjbGlwLXJ1bGUnLCAnY29sb3ItaW50ZXJwb2xhdGlvbicsICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLCAnY29sb3ItcHJvZmlsZScsICdjb2xvci1yZW5kZXJpbmcnLCAnZG9taW5hbnQtYmFzZWxpbmUnLCAnZW5hYmxlLWJhY2tncm91bmQnLCAnZmlsbC1vcGFjaXR5JywgJ2ZpbGwtcnVsZScsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdnbHlwaC1uYW1lJywgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLCAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLCAnaG9yaXotYWR2LXgnLCAnaG9yaXotb3JpZ2luLXgnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2xldHRlci1zcGFjaW5nJywgJ2xpZ2h0aW5nLWNvbG9yJywgJ21hcmtlci1lbmQnLCAnbWFya2VyLW1pZCcsICdtYXJrZXItc3RhcnQnLCAnb3ZlcmxpbmUtcG9zaXRpb24nLCAnb3ZlcmxpbmUtdGhpY2tuZXNzJywgJ3BhaW50LW9yZGVyJywgJ3Bhbm9zZS0xJywgJ3BvaW50ZXItZXZlbnRzJywgJ3JlbmRlcmluZy1pbnRlbnQnLCAnc2hhcGUtcmVuZGVyaW5nJywgJ3N0b3AtY29sb3InLCAnc3RvcC1vcGFjaXR5JywgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlLXdpZHRoJywgJ3RleHQtYW5jaG9yJywgJ3RleHQtZGVjb3JhdGlvbicsICd0ZXh0LXJlbmRlcmluZycsICd1bmRlcmxpbmUtcG9zaXRpb24nLCAndW5kZXJsaW5lLXRoaWNrbmVzcycsICd1bmljb2RlLWJpZGknLCAndW5pY29kZS1yYW5nZScsICd1bml0cy1wZXItZW0nLCAndi1hbHBoYWJldGljJywgJ3YtaGFuZ2luZycsICd2LWlkZW9ncmFwaGljJywgJ3YtbWF0aGVtYXRpY2FsJywgJ3ZlY3Rvci1lZmZlY3QnLCAndmVydC1hZHYteScsICd2ZXJ0LW9yaWdpbi14JywgJ3ZlcnQtb3JpZ2luLXknLCAnd29yZC1zcGFjaW5nJywgJ3dyaXRpbmctbW9kZScsICd4bWxuczp4bGluaycsICd4LWhlaWdodCcgLy8gTk9URTogaWYgeW91IGFkZCBhIGNhbWVsQ2FzZWQgcHJvcCB0byB0aGlzIGxpc3QsXG4vLyB5b3UnbGwgbmVlZCB0byBzZXQgYXR0cmlidXRlTmFtZSB0byBuYW1lLnRvTG93ZXJDYXNlKClcbi8vIGluc3RlYWQgaW4gdGhlIGFzc2lnbm1lbnQgYmVsb3cuXG5dLmZvckVhY2goZnVuY3Rpb24gKGF0dHJpYnV0ZU5hbWUpIHtcbiAgdmFyIG5hbWUgPSBhdHRyaWJ1dGVOYW1lLnJlcGxhY2UoQ0FNRUxJWkUsIGNhcGl0YWxpemUpO1xuICBwcm9wZXJ0aWVzW25hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChuYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZSwgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIGZhbHNlLCAvLyBzYW5pdGl6ZVVSTFxuICBmYWxzZSk7XG59KTsgLy8gU3RyaW5nIFNWRyBhdHRyaWJ1dGVzIHdpdGggdGhlIHhsaW5rIG5hbWVzcGFjZS5cblxuWyd4bGluazphY3R1YXRlJywgJ3hsaW5rOmFyY3JvbGUnLCAneGxpbms6cm9sZScsICd4bGluazpzaG93JywgJ3hsaW5rOnRpdGxlJywgJ3hsaW5rOnR5cGUnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgZmFsc2UsIC8vIHNhbml0aXplVVJMXG4gIGZhbHNlKTtcbn0pOyAvLyBTdHJpbmcgU1ZHIGF0dHJpYnV0ZXMgd2l0aCB0aGUgeG1sIG5hbWVzcGFjZS5cblxuWyd4bWw6YmFzZScsICd4bWw6bGFuZycsICd4bWw6c3BhY2UnIC8vIE5PVEU6IGlmIHlvdSBhZGQgYSBjYW1lbENhc2VkIHByb3AgdG8gdGhpcyBsaXN0LFxuLy8geW91J2xsIG5lZWQgdG8gc2V0IGF0dHJpYnV0ZU5hbWUgdG8gbmFtZS50b0xvd2VyQ2FzZSgpXG4vLyBpbnN0ZWFkIGluIHRoZSBhc3NpZ25tZW50IGJlbG93LlxuXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHZhciBuYW1lID0gYXR0cmlidXRlTmFtZS5yZXBsYWNlKENBTUVMSVpFLCBjYXBpdGFsaXplKTtcbiAgcHJvcGVydGllc1tuYW1lXSA9IG5ldyBQcm9wZXJ0eUluZm9SZWNvcmQobmFtZSwgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4gIGF0dHJpYnV0ZU5hbWUsICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnLCBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZSBleGlzdHMgYm90aCBpbiBIVE1MIGFuZCBTVkcuXG4vLyBUaGUgYXR0cmlidXRlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUgaW4gU1ZHIHNvIHdlIGNhbid0IGp1c3QgdXNlXG4vLyB0aGUgUmVhY3QgbmFtZSBsaWtlIHdlIGRvIGZvciBhdHRyaWJ1dGVzIHRoYXQgZXhpc3Qgb25seSBpbiBIVE1MLlxuXG5bJ3RhYkluZGV4JywgJ2Nyb3NzT3JpZ2luJ10uZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICBwcm9wZXJ0aWVzW2F0dHJpYnV0ZU5hbWVdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZChhdHRyaWJ1dGVOYW1lLCBTVFJJTkcsIGZhbHNlLCAvLyBtdXN0VXNlUHJvcGVydHlcbiAgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpLCAvLyBhdHRyaWJ1dGVOYW1lXG4gIG51bGwsIC8vIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICBmYWxzZSwgLy8gc2FuaXRpemVVUkxcbiAgZmFsc2UpO1xufSk7IC8vIFRoZXNlIGF0dHJpYnV0ZXMgYWNjZXB0IFVSTHMuIFRoZXNlIG11c3Qgbm90IGFsbG93IGphdmFzY3JpcHQ6IFVSTFMuXG4vLyBUaGVzZSB3aWxsIGFsc28gbmVlZCB0byBhY2NlcHQgVHJ1c3RlZCBUeXBlcyBvYmplY3QgaW4gdGhlIGZ1dHVyZS5cblxudmFyIHhsaW5rSHJlZiA9ICd4bGlua0hyZWYnO1xucHJvcGVydGllc1t4bGlua0hyZWZdID0gbmV3IFByb3BlcnR5SW5mb1JlY29yZCgneGxpbmtIcmVmJywgU1RSSU5HLCBmYWxzZSwgLy8gbXVzdFVzZVByb3BlcnR5XG4neGxpbms6aHJlZicsICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgdHJ1ZSwgLy8gc2FuaXRpemVVUkxcbmZhbHNlKTtcblsnc3JjJywgJ2hyZWYnLCAnYWN0aW9uJywgJ2Zvcm1BY3Rpb24nXS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gIHByb3BlcnRpZXNbYXR0cmlidXRlTmFtZV0gPSBuZXcgUHJvcGVydHlJbmZvUmVjb3JkKGF0dHJpYnV0ZU5hbWUsIFNUUklORywgZmFsc2UsIC8vIG11c3RVc2VQcm9wZXJ0eVxuICBhdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCksIC8vIGF0dHJpYnV0ZU5hbWVcbiAgbnVsbCwgLy8gYXR0cmlidXRlTmFtZXNwYWNlXG4gIHRydWUsIC8vIHNhbml0aXplVVJMXG4gIHRydWUpO1xufSk7XG5cbi8vIGFuZCBhbnkgbmV3bGluZSBvciB0YWIgYXJlIGZpbHRlcmVkIG91dCBhcyBpZiB0aGV5J3JlIG5vdCBwYXJ0IG9mIHRoZSBVUkwuXG4vLyBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI3VybC1wYXJzaW5nXG4vLyBUYWIgb3IgbmV3bGluZSBhcmUgZGVmaW5lZCBhcyBcXHJcXG5cXHQ6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYXNjaWktdGFiLW9yLW5ld2xpbmVcbi8vIEEgQzAgY29udHJvbCBpcyBhIGNvZGUgcG9pbnQgaW4gdGhlIHJhbmdlIFxcdTAwMDAgTlVMTCB0byBcXHUwMDFGXG4vLyBJTkZPUk1BVElPTiBTRVBBUkFUT1IgT05FLCBpbmNsdXNpdmU6XG4vLyBodHRwczovL2luZnJhLnNwZWMud2hhdHdnLm9yZy8jYzAtY29udHJvbC1vci1zcGFjZVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5cbnZhciBpc0phdmFTY3JpcHRQcm90b2NvbCA9IC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyXFxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSpcXDovaTtcbnZhciBkaWRXYXJuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHNhbml0aXplVVJMKHVybCkge1xuICB7XG4gICAgaWYgKCFkaWRXYXJuICYmIGlzSmF2YVNjcmlwdFByb3RvY29sLnRlc3QodXJsKSkge1xuICAgICAgZGlkV2FybiA9IHRydWU7XG5cbiAgICAgIGVycm9yKCdBIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0IHdpbGwgYmxvY2sgamF2YXNjcmlwdDogVVJMcyBhcyBhIHNlY3VyaXR5IHByZWNhdXRpb24uICcgKyAnVXNlIGV2ZW50IGhhbmRsZXJzIGluc3RlYWQgaWYgeW91IGNhbi4gSWYgeW91IG5lZWQgdG8gZ2VuZXJhdGUgdW5zYWZlIEhUTUwgdHJ5ICcgKyAndXNpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgaW5zdGVhZC4gUmVhY3Qgd2FzIHBhc3NlZCAlcy4nLCBKU09OLnN0cmluZ2lmeSh1cmwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgXCJleHBlY3RlZFwiIGFyZ3VtZW50IGlzIHVzZWQgYXMgYSBoaW50IG9mIHdoYXQgdGhlIGV4cGVjdGVkIHZhbHVlIGlzLlxuICogU29tZSBwcm9wZXJ0aWVzIGhhdmUgbXVsdGlwbGUgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbykge1xuICB7XG4gICAgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lO1xuICAgICAgcmV0dXJuIG5vZGVbcHJvcGVydHlOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCBwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBmdWxseSBkaXNhYmxlZCBqYXZhc2NyaXB0OiBVUkxzLCBhbmQgaWZcbiAgICAgICAgLy8gdGhlIGh5ZHJhdGlvbiBpcyBzdWNjZXNzZnVsIG9mIGEgamF2YXNjcmlwdDogVVJMLCB3ZVxuICAgICAgICAvLyBzdGlsbCB3YW50IHRvIHdhcm4gb24gdGhlIGNsaWVudC5cbiAgICAgICAgc2FuaXRpemVVUkwoJycgKyBleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICB2YXIgc3RyaW5nVmFsdWUgPSBudWxsO1xuXG4gICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IE9WRVJMT0FERURfQk9PTEVBTikge1xuICAgICAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIGlmIChzaG91bGRSZW1vdmVBdHRyaWJ1dGUobmFtZSwgZXhwZWN0ZWQsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICAgICAgLy8gV2UgaGFkIGFuIGF0dHJpYnV0ZSBidXQgc2hvdWxkbid0IGhhdmUgaGFkIG9uZSwgc28gcmVhZCBpdFxuICAgICAgICAgIC8vIGZvciB0aGUgZXJyb3IgbWVzc2FnZS5cbiAgICAgICAgICByZXR1cm4gbm9kZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHlJbmZvLnR5cGUgPT09IEJPT0xFQU4pIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGJvb2xlYW4sIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHZhbHVlIGlzXG4gICAgICAgICAgLy8gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIGl0IGlzIHRoZSBzYW1lIGFzIHRoZSBleHBlY3RlZC5cbiAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgIH0gLy8gRXZlbiBpZiB0aGlzIHByb3BlcnR5IHVzZXMgYSBuYW1lc3BhY2Ugd2UgdXNlIGdldEF0dHJpYnV0ZVxuICAgICAgICAvLyBiZWNhdXNlIHdlIGFzc3VtZSBpdHMgbmFtZXNwYWNlZCBuYW1lIGlzIHRoZSBzYW1lIGFzIG91ciBjb25maWcuXG4gICAgICAgIC8vIFRvIHVzZSBnZXRBdHRyaWJ1dGVOUyB3ZSBuZWVkIHRoZSBsb2NhbCBuYW1lIHdoaWNoIHdlIGRvbid0IGhhdmVcbiAgICAgICAgLy8gaW4gb3VyIGNvbmZpZyBhdG0uXG5cblxuICAgICAgICBzdHJpbmdWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlKG5hbWUsIGV4cGVjdGVkLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUgPT09IG51bGwgPyBleHBlY3RlZCA6IHN0cmluZ1ZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChzdHJpbmdWYWx1ZSA9PT0gJycgKyBleHBlY3RlZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEdldCB0aGUgdmFsdWUgZm9yIGEgYXR0cmlidXRlIG9uIGEgbm9kZS4gT25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdXNlZCBhcyBhIGhpbnQgb2Ygd2hhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMuIFNvbWVcbiAqIGF0dHJpYnV0ZXMgaGF2ZSBtdWx0aXBsZSBlcXVpdmFsZW50IHZhbHVlcy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUZvckF0dHJpYnV0ZShub2RlLCBuYW1lLCBleHBlY3RlZCkge1xuICB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBJZiB0aGUgb2JqZWN0IGlzIGFuIG9wYXF1ZSByZWZlcmVuY2UgSUQsIGl0J3MgZXhwZWN0ZWQgdGhhdFxuICAgIC8vIHRoZSBuZXh0IHByb3AgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHNlcnZlciB2YWx1ZSwgc28ganVzdCByZXR1cm5cbiAgICAvLyBleHBlY3RlZFxuXG5cbiAgICBpZiAoaXNPcGFxdWVIeWRyYXRpbmdPYmplY3QoZXhwZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKCFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBudWxsO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuXG4gICAgaWYgKHZhbHVlID09PSAnJyArIGV4cGVjdGVkKSB7XG4gICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKi9cblxuZnVuY3Rpb24gc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBuYW1lLCB2YWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpIHtcbiAgdmFyIHByb3BlcnR5SW5mbyA9IGdldFByb3BlcnR5SW5mbyhuYW1lKTtcblxuICBpZiAoc2hvdWxkSWdub3JlQXR0cmlidXRlKG5hbWUsIHByb3BlcnR5SW5mbywgaXNDdXN0b21Db21wb25lbnRUYWcpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNob3VsZFJlbW92ZUF0dHJpYnV0ZShuYW1lLCB2YWx1ZSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICB2YWx1ZSA9IG51bGw7XG4gIH0gLy8gSWYgdGhlIHByb3AgaXNuJ3QgaW4gdGhlIHNwZWNpYWwgbGlzdCwgdHJlYXQgaXQgYXMgYSBzaW1wbGUgYXR0cmlidXRlLlxuXG5cbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnIHx8IHByb3BlcnR5SW5mbyA9PT0gbnVsbCkge1xuICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0ZU5hbWUgPSBuYW1lO1xuXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoX2F0dHJpYnV0ZU5hbWUsICAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbXVzdFVzZVByb3BlcnR5ID0gcHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eTtcblxuICBpZiAobXVzdFVzZVByb3BlcnR5KSB7XG4gICAgdmFyIHByb3BlcnR5TmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHZhciB0eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgICBub2RlW3Byb3BlcnR5TmFtZV0gPSB0eXBlID09PSBCT09MRUFOID8gZmFsc2UgOiAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgLy8gYHRvU3RyaW5nYGVkIGJ5IElFOC85LlxuICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9IC8vIFRoZSByZXN0IGFyZSB0cmVhdGVkIGFzIGF0dHJpYnV0ZXMgd2l0aCBzcGVjaWFsIGNhc2VzLlxuXG5cbiAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSxcbiAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG5cbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF90eXBlID0gcHJvcGVydHlJbmZvLnR5cGU7XG4gICAgdmFyIGF0dHJpYnV0ZVZhbHVlO1xuXG4gICAgaWYgKF90eXBlID09PSBCT09MRUFOIHx8IF90eXBlID09PSBPVkVSTE9BREVEX0JPT0xFQU4gJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgIC8vIElmIGF0dHJpYnV0ZSB0eXBlIGlzIGJvb2xlYW4sIHdlIGtub3cgZm9yIHN1cmUgaXQgd29uJ3QgYmUgYW4gZXhlY3V0aW9uIHNpbmtcbiAgICAgIC8vIGFuZCB3ZSB3b24ndCByZXF1aXJlIFRydXN0ZWQgVHlwZSBoZXJlLlxuICAgICAgYXR0cmlidXRlVmFsdWUgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHNldEF0dHJpYnV0ZWAgd2l0aCBvYmplY3RzIGJlY29tZXMgb25seSBgW29iamVjdF1gIGluIElFOC85LFxuICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGVWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uc2FuaXRpemVVUkwpIHtcbiAgICAgICAgc2FuaXRpemVVUkwoYXR0cmlidXRlVmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGF0dHJpYnV0ZU5hbWVzcGFjZSkge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhhdHRyaWJ1dGVOYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZVZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1NDT1BFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNjb3BlJyk7XG4gIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vcGFxdWUuaWQnKTtcbiAgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmRlYnVnX3RyYWNlX21vZGUnKTtcbiAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9mZnNjcmVlbicpO1xuICBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxlZ2FjeV9oaWRkZW4nKTtcbn1cblxudmFyIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIGlmIChtYXliZUl0ZXJhYmxlID09PSBudWxsIHx8IHR5cGVvZiBtYXliZUl0ZXJhYmxlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG1heWJlSXRlcmF0b3IgPSBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdIHx8IG1heWJlSXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdO1xuXG4gIGlmICh0eXBlb2YgbWF5YmVJdGVyYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtYXliZUl0ZXJhdG9yO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShjdG9yLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGN0b3IsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlcikge1xuICB2YXIgb3duZXIgPSAgZmliZXIuX2RlYnVnT3duZXIgPyBmaWJlci5fZGVidWdPd25lci50eXBlIDogbnVsbCA7XG4gIHZhciBzb3VyY2UgPSAgZmliZXIuX2RlYnVnU291cmNlIDtcblxuICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGNhc2UgTGF6eUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnTGF6eScpO1xuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2UnKTtcblxuICAgIGNhc2UgU3VzcGVuc2VMaXN0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKCdTdXNwZW5zZUxpc3QnKTtcblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZSk7XG5cbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUucmVuZGVyKTtcblxuICAgIGNhc2UgQmxvY2s6XG4gICAgICByZXR1cm4gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUuX3JlbmRlcik7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIGRlc2NyaWJlQ2xhc3NDb21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gIHRyeSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB2YXIgbm9kZSA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgZG8ge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKG5vZGUpO1xuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH0gd2hpbGUgKG5vZGUpO1xuXG4gICAgcmV0dXJuIGluZm87XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICByZXR1cm4gJ1xcbkVycm9yIGdlbmVyYXRpbmcgc3RhY2s6ICcgKyB4Lm1lc3NhZ2UgKyAnXFxuJyArIHguc3RhY2s7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHROYW1lKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgJ0NvbnRleHQnO1xufVxuXG5mdW5jdGlvbiBnZXRDb21wb25lbnROYW1lKHR5cGUpIHtcbiAgaWYgKHR5cGUgPT0gbnVsbCkge1xuICAgIC8vIEhvc3Qgcm9vdCwgdGV4dCBub2RlIG9yIGp1c3QgaW52YWxpZCB0eXBlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICh0eXBlb2YgdHlwZS50YWcgPT09ICdudW1iZXInKSB7XG4gICAgICBlcnJvcignUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZSgpLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgIHJldHVybiAnRnJhZ21lbnQnO1xuXG4gICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgIHJldHVybiAnUG9ydGFsJztcblxuICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgIHJldHVybiAnUHJvZmlsZXInO1xuXG4gICAgY2FzZSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG52YXIgY3VycmVudCA9IG51bGw7XG52YXIgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICB7XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBvd25lciA9IGN1cnJlbnQuX2RlYnVnT3duZXI7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgdHlwZW9mIG93bmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlclN0YWNrSW5EZXYoKSB7XG4gIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH0gLy8gU2FmZSBiZWNhdXNlIGlmIGN1cnJlbnQgZmliZXIgZXhpc3RzLCB3ZSBhcmUgcmVjb25jaWxpbmcsXG4gICAgLy8gYW5kIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgdmVyc2lvbi5cblxuXG4gICAgcmV0dXJuIGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChjdXJyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNldEN1cnJlbnRGaWJlcigpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gbnVsbDtcbiAgICBjdXJyZW50ID0gbnVsbDtcbiAgICBpc1JlbmRlcmluZyA9IGZhbHNlO1xuICB9XG59XG5mdW5jdGlvbiBzZXRDdXJyZW50RmliZXIoZmliZXIpIHtcbiAge1xuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0Q3VycmVudFN0YWNrID0gZ2V0Q3VycmVudEZpYmVyU3RhY2tJbkRldjtcbiAgICBjdXJyZW50ID0gZmliZXI7XG4gICAgaXNSZW5kZXJpbmcgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0SXNSZW5kZXJpbmcocmVuZGVyaW5nKSB7XG4gIHtcbiAgICBpc1JlbmRlcmluZyA9IHJlbmRlcmluZztcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SXNSZW5kZXJpbmcoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNSZW5kZXJpbmc7XG4gIH1cbn1cblxuLy8gRmxvdyBkb2VzIG5vdCBhbGxvdyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBvZiBtb3N0IG5vbi1zdHJpbmcgdHlwZXMuIFRvIHdvcmtcbi8vIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24sIHdlIHVzZSBhbiBvcGFxdWUgdHlwZSB0aGF0IGNhbiBvbmx5IGJlIG9idGFpbmVkIGJ5XG4vLyBwYXNzaW5nIHRoZSB2YWx1ZSB0aHJvdWdoIGdldFRvU3RyaW5nVmFsdWUgZmlyc3QuXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gJycgKyB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIGZ1bmN0aW9uLCBzeW1ib2wgYXJlIGFzc2lnbmVkIGFzIGVtcHR5IHN0cmluZ3NcbiAgICAgIHJldHVybiAnJztcbiAgfVxufVxuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgYnV0dG9uOiB0cnVlLFxuICBjaGVja2JveDogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGhpZGRlbjogdHJ1ZSxcbiAgcmFkaW86IHRydWUsXG4gIHJlc2V0OiB0cnVlLFxuICBzdWJtaXQ6IHRydWVcbn07XG5mdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gIHtcbiAgICBpZiAoIShoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLm9uSW5wdXQgfHwgcHJvcHMucmVhZE9ubHkgfHwgcHJvcHMuZGlzYWJsZWQgfHwgcHJvcHMudmFsdWUgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdFZhbHVlYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICAgIH1cblxuICAgIGlmICghKHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkIHx8IHByb3BzLmNoZWNrZWQgPT0gbnVsbCkpIHtcbiAgICAgIGVycm9yKCdZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDaGVja2FibGUoZWxlbSkge1xuICB2YXIgdHlwZSA9IGVsZW0udHlwZTtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKHR5cGUgPT09ICdjaGVja2JveCcgfHwgdHlwZSA9PT0gJ3JhZGlvJyk7XG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrZXIobm9kZSkge1xuICByZXR1cm4gbm9kZS5fdmFsdWVUcmFja2VyO1xufVxuXG5mdW5jdGlvbiBkZXRhY2hUcmFja2VyKG5vZGUpIHtcbiAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWVGcm9tTm9kZShub2RlKSB7XG4gIHZhciB2YWx1ZSA9ICcnO1xuXG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChpc0NoZWNrYWJsZShub2RlKSkge1xuICAgIHZhbHVlID0gbm9kZS5jaGVja2VkID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRyYWNrVmFsdWVPbk5vZGUobm9kZSkge1xuICB2YXIgdmFsdWVGaWVsZCA9IGlzQ2hlY2thYmxlKG5vZGUpID8gJ2NoZWNrZWQnIDogJ3ZhbHVlJztcbiAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5vZGUuY29uc3RydWN0b3IucHJvdG90eXBlLCB2YWx1ZUZpZWxkKTtcbiAgdmFyIGN1cnJlbnRWYWx1ZSA9ICcnICsgbm9kZVt2YWx1ZUZpZWxkXTsgLy8gaWYgc29tZW9uZSBoYXMgYWxyZWFkeSBkZWZpbmVkIGEgdmFsdWUgb3IgU2FmYXJpLCB0aGVuIGJhaWxcbiAgLy8gYW5kIGRvbid0IHRyYWNrIHZhbHVlIHdpbGwgY2F1c2Ugb3ZlciByZXBvcnRpbmcgb2YgY2hhbmdlcyxcbiAgLy8gYnV0IGl0J3MgYmV0dGVyIHRoZW4gYSBoYXJkIGZhaWx1cmVcbiAgLy8gKG5lZWRlZCBmb3IgY2VydGFpbiB0ZXN0cyB0aGF0IHNweU9uIGlucHV0IHZhbHVlcyBhbmQgU2FmYXJpKVxuXG4gIGlmIChub2RlLmhhc093blByb3BlcnR5KHZhbHVlRmllbGQpIHx8IHR5cGVvZiBkZXNjcmlwdG9yID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgZGVzY3JpcHRvci5nZXQgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGdldCA9IGRlc2NyaXB0b3IuZ2V0LFxuICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGdldC5jYWxsKHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICBzZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgfVxuICB9KTsgLy8gV2UgY291bGQndmUgcGFzc2VkIHRoaXMgdGhlIGZpcnN0IHRpbWVcbiAgLy8gYnV0IGl0IHRyaWdnZXJzIGEgYnVnIGluIElFMTEgYW5kIEVkZ2UgMTQvMTUuXG4gIC8vIENhbGxpbmcgZGVmaW5lUHJvcGVydHkoKSBhZ2FpbiBzaG91bGQgYmUgZXF1aXZhbGVudC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTc2OFxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci5lbnVtZXJhYmxlXG4gIH0pO1xuICB2YXIgdHJhY2tlciA9IHtcbiAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9LFxuICAgIHNldFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRWYWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgfSxcbiAgICBzdG9wVHJhY2tpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGRldGFjaFRyYWNrZXIobm9kZSk7XG4gICAgICBkZWxldGUgbm9kZVt2YWx1ZUZpZWxkXTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB0cmFja2VyO1xufVxuXG5mdW5jdGlvbiB0cmFjayhub2RlKSB7XG4gIGlmIChnZXRUcmFja2VyKG5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIFRPRE86IE9uY2UgaXQncyBqdXN0IEZpYmVyIHdlIGNhbiBtb3ZlIHRoaXMgdG8gbm9kZS5fd3JhcHBlclN0YXRlXG5cblxuICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKG5vZGUpO1xufVxuZnVuY3Rpb24gdXBkYXRlVmFsdWVJZkNoYW5nZWQobm9kZSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIobm9kZSk7IC8vIGlmIHRoZXJlIGlzIG5vIHRyYWNrZXIgYXQgdGhpcyBwb2ludCBpdCdzIHVubGlrZWx5XG4gIC8vIHRoYXQgdHJ5aW5nIGFnYWluIHdpbGwgc3VjY2VlZFxuXG4gIGlmICghdHJhY2tlcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdmFyIGxhc3RWYWx1ZSA9IHRyYWNrZXIuZ2V0VmFsdWUoKTtcbiAgdmFyIG5leHRWYWx1ZSA9IGdldFZhbHVlRnJvbU5vZGUobm9kZSk7XG5cbiAgaWYgKG5leHRWYWx1ZSAhPT0gbGFzdFZhbHVlKSB7XG4gICAgdHJhY2tlci5zZXRWYWx1ZShuZXh0VmFsdWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHR5cGVvZiBkb2MgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG52YXIgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGlzQ29udHJvbGxlZChwcm9wcykge1xuICB2YXIgdXNlc0NoZWNrZWQgPSBwcm9wcy50eXBlID09PSAnY2hlY2tib3gnIHx8IHByb3BzLnR5cGUgPT09ICdyYWRpbyc7XG4gIHJldHVybiB1c2VzQ2hlY2tlZCA/IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA6IHByb3BzLnZhbHVlICE9IG51bGw7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMi9XRC1odG1sNS0yMDEyMTAyNS90aGUtaW5wdXQtZWxlbWVudC5odG1sXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWRcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ2lucHV0JywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJywgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKTtcblxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgZXJyb3IoJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpO1xuXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsID8gJycgOiBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsQ2hlY2tlZDogcHJvcHMuY2hlY2tlZCAhPSBudWxsID8gcHJvcHMuY2hlY2tlZCA6IHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgIGluaXRpYWxWYWx1ZTogZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSAhPSBudWxsID8gcHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWUpLFxuICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgfTtcbn1cbmZ1bmN0aW9uIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG5cbiAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgIHNldFZhbHVlRm9yUHJvcGVydHkobm9kZSwgJ2NoZWNrZWQnLCBjaGVja2VkLCBmYWxzZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZVdyYXBwZXIoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuXG4gIHtcbiAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG5cbiAgICBpZiAoIW5vZGUuX3dyYXBwZXJTdGF0ZS5jb250cm9sbGVkICYmIGNvbnRyb2xsZWQgJiYgIWRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgY29udHJvbGxlZC4gJyArICdUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvICcgKyAnYSBkZWZpbmVkIHZhbHVlLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gJyArICdEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50cycpO1xuXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ1RoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gJyArICd1bmRlZmluZWQsIHdoaWNoIHNob3VsZCBub3QgaGFwcGVuLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzJyk7XG5cbiAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrZWQoZWxlbWVudCwgcHJvcHMpO1xuICB2YXIgdmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLnZhbHVlKTtcbiAgdmFyIHR5cGUgPSBwcm9wcy50eXBlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAodmFsdWUgPT09IDAgJiYgbm9kZS52YWx1ZSA9PT0gJycgfHwgLy8gV2UgZXhwbGljaXRseSB3YW50IHRvIGNvZXJjZSB0byBudW1iZXIgaGVyZSBpZiBwb3NzaWJsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgbm9kZS52YWx1ZSAhPSB2YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZS52YWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLnZhbHVlID0gdG9TdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnKSB7XG4gICAgLy8gU3VibWl0L3Jlc2V0IGlucHV0cyBuZWVkIHRoZSBhdHRyaWJ1dGUgcmVtb3ZlZCBjb21wbGV0ZWx5IHRvIGF2b2lkXG4gICAgLy8gYmxhbmstdGV4dCBidXR0b25zLlxuICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIHZhbHVlIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIGNvbWVzIGZyb20gYSBjYXNjYWRlIG9mXG4gICAgLy8gcHJvcGVydGllczpcbiAgICAvLyAgMS4gVGhlIHZhbHVlIFJlYWN0IHByb3BlcnR5XG4gICAgLy8gIDIuIFRoZSBkZWZhdWx0VmFsdWUgUmVhY3QgcHJvcGVydHlcbiAgICAvLyAgMy4gT3RoZXJ3aXNlIHRoZXJlIHNob3VsZCBiZSBubyBjaGFuZ2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgnZGVmYXVsdFZhbHVlJykpIHtcbiAgICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCBwcm9wcy50eXBlLCBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyBXaGVuIHN5bmNpbmcgdGhlIGNoZWNrZWQgYXR0cmlidXRlLCBpdCBvbmx5IGNoYW5nZXMgd2hlbiBpdCBuZWVkc1xuICAgIC8vIHRvIGJlIHJlbW92ZWQsIHN1Y2ggYXMgdHJhbnNpdGlvbmluZyBmcm9tIGEgY2hlY2tib3ggaW50byBhIHRleHQgaW5wdXRcbiAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIXByb3BzLmRlZmF1bHRDaGVja2VkO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlcihlbGVtZW50LCBwcm9wcywgaXNIeWRyYXRpbmcpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50OyAvLyBEbyBub3QgYXNzaWduIHZhbHVlIGlmIGl0IGlzIGFscmVhZHkgc2V0LiBUaGlzIHByZXZlbnRzIHVzZXIgdGV4dCBpbnB1dFxuICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpIHx8IHByb3BzLmhhc093blByb3BlcnR5KCdkZWZhdWx0VmFsdWUnKSkge1xuICAgIHZhciB0eXBlID0gcHJvcHMudHlwZTtcbiAgICB2YXIgaXNCdXR0b24gPSB0eXBlID09PSAnc3VibWl0JyB8fCB0eXBlID09PSAncmVzZXQnOyAvLyBBdm9pZCBzZXR0aW5nIHZhbHVlIGF0dHJpYnV0ZSBvbiBzdWJtaXQvcmVzZXQgaW5wdXRzIGFzIGl0IG92ZXJyaWRlcyB0aGVcbiAgICAvLyBkZWZhdWx0IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBicm93c2VyLiBTZWU6ICMxMjg3MlxuXG4gICAgaWYgKGlzQnV0dG9uICYmIChwcm9wcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHByb3BzLnZhbHVlID09PSBudWxsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsVmFsdWUgPSB0b1N0cmluZyhub2RlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKTsgLy8gRG8gbm90IGFzc2lnbiB2YWx1ZSBpZiBpdCBpcyBhbHJlYWR5IHNldC4gVGhpcyBwcmV2ZW50cyB1c2VyIHRleHQgaW5wdXRcbiAgICAvLyBmcm9tIGJlaW5nIGxvc3QgZHVyaW5nIFNTUiBoeWRyYXRpb24uXG5cbiAgICBpZiAoIWlzSHlkcmF0aW5nKSB7XG4gICAgICB7XG4gICAgICAgIC8vIFdoZW4gc3luY2luZyB0aGUgdmFsdWUgYXR0cmlidXRlLCB0aGUgdmFsdWUgcHJvcGVydHkgc2hvdWxkIHVzZVxuICAgICAgICAvLyB0aGUgd3JhcHBlclN0YXRlLl9pbml0aWFsVmFsdWUgcHJvcGVydHkuIFRoaXMgdXNlczpcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAxLiBUaGUgdmFsdWUgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgICAgIC8vICAgMi4gVGhlIGRlZmF1bHRWYWx1ZSBSZWFjdCBwcm9wZXJ0eSB3aGVuIHByZXNlbnRcbiAgICAgICAgLy8gICAzLiBBbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgaWYgKGluaXRpYWxWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAgIG5vZGUudmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICAvLyBPdGhlcndpc2UsIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgaXMgc3luY2hyb25pemVkIHRvIHRoZSBwcm9wZXJ0eSxcbiAgICAgIC8vIHNvIHdlIGFzc2lnbiBkZWZhdWx0VmFsdWUgdG8gdGhlIHNhbWUgdGhpbmcgYXMgdGhlIHZhbHVlIHByb3BlcnR5XG4gICAgICAvLyBhc3NpZ25tZW50IHN0ZXAgYWJvdmUuXG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICB9XG4gIH0gLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgLy8gd2lsbCBzb21ldGltZXMgaW5mbHVlbmNlIHRoZSB2YWx1ZSBvZiBjaGVja2VkIChldmVuIGFmdGVyIGRldGFjaG1lbnQpLlxuICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuXG5cbiAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG5cbiAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgbm9kZS5uYW1lID0gJyc7XG4gIH1cblxuICB7XG4gICAgLy8gV2hlbiBzeW5jaW5nIHRoZSBjaGVja2VkIGF0dHJpYnV0ZSwgYm90aCB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBhdHRyaWJ1dGUgYXJlIGFzc2lnbmVkIGF0IHRoZSBzYW1lIHRpbWUgdXNpbmcgZGVmYXVsdENoZWNrZWQuIFRoaXMgdXNlczpcbiAgICAvL1xuICAgIC8vICAgMS4gVGhlIGNoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAyLiBUaGUgZGVmYXVsdENoZWNrZWQgUmVhY3QgcHJvcGVydHkgd2hlbiBwcmVzZW50XG4gICAgLy8gICAzLiBPdGhlcndpc2UsIGZhbHNlXG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhIW5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZDtcbiAgfVxuXG4gIGlmIChuYW1lICE9PSAnJykge1xuICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc3RvcmVDb250cm9sbGVkU3RhdGUoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB1cGRhdGVXcmFwcGVyKG5vZGUsIHByb3BzKTtcbiAgdXBkYXRlTmFtZWRDb3VzaW5zKG5vZGUsIHByb3BzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTmFtZWRDb3VzaW5zKHJvb3ROb2RlLCBwcm9wcykge1xuICB2YXIgbmFtZSA9IHByb3BzLm5hbWU7XG5cbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9IC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0uIEl0IG1pZ2h0IG5vdCBldmVuIGJlIGluIHRoZVxuICAgIC8vIGRvY3VtZW50LiBMZXQncyBqdXN0IHVzZSB0aGUgbG9jYWwgYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndFxuICAgIC8vIG1pc3MgYW55dGhpbmcuXG5cblxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG5cbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgcmFkaW8gYnV0dG9ucyByZW5kZXJlZCBieSBkaWZmZXJlbnQgY29waWVzIG9mIFJlYWN0XG4gICAgICAvLyBhbmQgdGhlIHNhbWUgbmFtZSBhcmUgcmVuZGVyZWQgaW50byB0aGUgc2FtZSBmb3JtIChzYW1lIGFzICMxOTM5KS5cbiAgICAgIC8vIFRoYXQncyBwcm9iYWJseSBva2F5OyB3ZSBkb24ndCBzdXBwb3J0IGl0IGp1c3QgYXMgd2UgZG9uJ3Qgc3VwcG9ydFxuICAgICAgLy8gbWl4aW5nIFJlYWN0IHJhZGlvIGJ1dHRvbnMgd2l0aCBub24tUmVhY3Qgb25lcy5cblxuXG4gICAgICB2YXIgb3RoZXJQcm9wcyA9IGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUob3RoZXJOb2RlKTtcblxuICAgICAgaWYgKCFvdGhlclByb3BzKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJSZWFjdERPTUlucHV0OiBNaXhpbmcgUmVhY3QgYW5kIG5vbi1SZWFjdCByYWRpbyBpbnB1dHMgd2l0aCB0aGUgc2FtZSBgbmFtZWAgaXMgbm90IHN1cHBvcnRlZC5cIiApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFdlIG5lZWQgdXBkYXRlIHRoZSB0cmFja2VkIHZhbHVlIG9uIHRoZSBuYW1lZCBjb3VzaW4gc2luY2UgdGhlIHZhbHVlXG4gICAgICAvLyB3YXMgY2hhbmdlZCBidXQgdGhlIGlucHV0IHNhdyBubyBldmVudCBvciB2YWx1ZSBzZXRcblxuXG4gICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpOyAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cblxuICAgICAgdXBkYXRlV3JhcHBlcihvdGhlck5vZGUsIG90aGVyUHJvcHMpO1xuICAgIH1cbiAgfVxufSAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuLy8gRm9yIG51bWJlciBpbnB1dHMsIHRoZSBkaXNwbGF5IHZhbHVlIGxvc2VzIHRyYWlsaW5nIGRlY2ltYWwgcG9pbnRzLiBGb3IgZW1haWwgaW5wdXRzLFxuLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbi8vXG4vLyBIZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGVmYXVsdFZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkLCBhdm9pZGluZyB0aGVzZSBwcm9ibGVtc1xuLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuLy9cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI1M1xuXG5cbmZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZShub2RlLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoIC8vIEZvY3VzZWQgbnVtYmVyIGlucHV0cyBzeW5jaHJvbml6ZSBvbiBibHVyLiBTZWUgQ2hhbmdlRXZlbnRQbHVnaW4uanNcbiAgdHlwZSAhPT0gJ251bWJlcicgfHwgZ2V0QWN0aXZlRWxlbWVudChub2RlLm93bmVyRG9jdW1lbnQpICE9PSBub2RlKSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSk7XG4gICAgfSBlbHNlIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gdG9TdHJpbmcodmFsdWUpKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gZmFsc2U7XG52YXIgZGlkV2FybkludmFsaWRDaGlsZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4pIHtcbiAgdmFyIGNvbnRlbnQgPSAnJzsgLy8gRmxhdHRlbiBjaGlsZHJlbi4gV2UnbGwgd2FybiBpZiB0aGV5IGFyZSBpbnZhbGlkXG4gIC8vIGR1cmluZyB2YWxpZGF0ZVByb3BzKCkgd2hpY2ggcnVucyBmb3IgaHlkcmF0aW9uIHRvby5cbiAgLy8gTm90ZSB0aGF0IHRoaXMgd291bGQgdGhyb3cgb24gbm9uLWVsZW1lbnQgb2JqZWN0cy5cbiAgLy8gRWxlbWVudHMgYXJlIHN0cmluZ2lmaWVkICh3aGljaCBpcyBub3JtYWxseSBpcnJlbGV2YW50XG4gIC8vIGJ1dCBtYXR0ZXJzIGZvciA8ZmJ0PikuXG5cbiAgUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGNoaWxkID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZW50ICs9IGNoaWxkOyAvLyBOb3RlOiB3ZSBkb24ndCB3YXJuIGFib3V0IGludmFsaWQgY2hpbGRyZW4gaGVyZS5cbiAgICAvLyBJbnN0ZWFkLCB0aGlzIGlzIGRvbmUgc2VwYXJhdGVseSBiZWxvdyBzbyB0aGF0XG4gICAgLy8gaXQgaGFwcGVucyBkdXJpbmcgdGhlIGh5ZHJhdGlvbiBjb2RlIHBhdGggdG9vLlxuICB9KTtcbiAgcmV0dXJuIGNvbnRlbnQ7XG59XG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhlbGVtZW50LCBwcm9wcykge1xuICB7XG4gICAgLy8gVGhpcyBtaXJyb3JzIHRoZSBjb2RlIHBhdGggYWJvdmUsIGJ1dCBydW5zIGZvciBoeWRyYXRpb24gdG9vLlxuICAgIC8vIFdhcm4gYWJvdXQgaW52YWxpZCBjaGlsZHJlbiBoZXJlIHNvIHRoYXQgY2xpZW50IGFuZCBoeWRyYXRpb24gYXJlIGNvbnNpc3RlbnQuXG4gICAgLy8gVE9ETzogdGhpcyBzZWVtcyBsaWtlIGl0IGNvdWxkIGNhdXNlIGEgREVWLW9ubHkgdGhyb3cgZm9yIGh5ZHJhdGlvblxuICAgIC8vIGlmIGNoaWxkcmVuIGNvbnRhaW5zIGEgbm9uLWVsZW1lbnQgb2JqZWN0LiBXZSBzaG91bGQgdHJ5IHRvIGF2b2lkIHRoYXQuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ29iamVjdCcgJiYgcHJvcHMuY2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIFJlYWN0LkNoaWxkcmVuLmZvckVhY2gocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNoaWxkLnR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRXYXJuSW52YWxpZENoaWxkKSB7XG4gICAgICAgICAgZGlkV2FybkludmFsaWRDaGlsZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gLy8gVE9ETzogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG5cblxuICAgIGlmIChwcm9wcy5zZWxlY3RlZCAhPSBudWxsICYmICFkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbikge1xuICAgICAgZXJyb3IoJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpO1xuXG4gICAgICBkaWRXYXJuU2VsZWN0ZWRTZXRPbk9wdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3N0TW91bnRXcmFwcGVyJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSkpKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0SG9zdFByb3BzJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe1xuICAgIGNoaWxkcmVuOiB1bmRlZmluZWRcbiAgfSwgcHJvcHMpO1xuXG4gIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICBpZiAoY29udGVudCkge1xuICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gIH1cblxuICByZXR1cm4gaG9zdFByb3BzO1xufVxuXG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDE7XG5cbntcbiAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB2YXIgb3duZXJOYW1lID0gZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKTtcblxuICBpZiAob3duZXJOYW1lKSB7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbnZhciB2YWx1ZVByb3BOYW1lcyA9IFsndmFsdWUnLCAnZGVmYXVsdFZhbHVlJ107XG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICovXG5cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKHByb3BzKSB7XG4gIHtcbiAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKCdzZWxlY3QnLCBwcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcblxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcblxuICAgICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICAgIGVycm9yKCdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkpO1xuICAgICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgaXNBcnJheSkge1xuICAgICAgICBlcnJvcignVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMobm9kZSwgbXVsdGlwbGUsIHByb3BWYWx1ZSwgc2V0RGVmYXVsdFNlbGVjdGVkKSB7XG4gIHZhciBvcHRpb25zID0gbm9kZS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHZhciBzZWxlY3RlZFZhbHVlcyA9IHByb3BWYWx1ZTtcbiAgICB2YXIgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gUHJlZml4IHRvIGF2b2lkIGNoYW9zIHdpdGggc3BlY2lhbCBrZXlzLlxuICAgICAgc2VsZWN0ZWRWYWx1ZVsnJCcgKyBzZWxlY3RlZFZhbHVlc1tpXV0gPSB0cnVlO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBvcHRpb25zLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIHNlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eSgnJCcgKyBvcHRpb25zW19pXS52YWx1ZSk7XG5cbiAgICAgIGlmIChvcHRpb25zW19pXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tfaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGVkICYmIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgICBvcHRpb25zW19pXS5kZWZhdWx0U2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgdmFyIF9zZWxlY3RlZFZhbHVlID0gdG9TdHJpbmcoZ2V0VG9TdHJpbmdWYWx1ZShwcm9wVmFsdWUpKTtcblxuICAgIHZhciBkZWZhdWx0U2VsZWN0ZWQgPSBudWxsO1xuXG4gICAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgb3B0aW9ucy5sZW5ndGg7IF9pMisrKSB7XG4gICAgICBpZiAob3B0aW9uc1tfaTJdLnZhbHVlID09PSBfc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW19pMl0uc2VsZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChzZXREZWZhdWx0U2VsZWN0ZWQpIHtcbiAgICAgICAgICBvcHRpb25zW19pMl0uZGVmYXVsdFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRlZmF1bHRTZWxlY3RlZCA9PT0gbnVsbCAmJiAhb3B0aW9uc1tfaTJdLmRpc2FibGVkKSB7XG4gICAgICAgIGRlZmF1bHRTZWxlY3RlZCA9IG9wdGlvbnNbX2kyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFNlbGVjdGVkICE9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0U2VsZWN0ZWQuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRIb3N0UHJvcHMkMihlbGVtZW50LCBwcm9wcykge1xuICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICB2YWx1ZTogdW5kZWZpbmVkXG4gIH0pO1xufVxuZnVuY3Rpb24gaW5pdFdyYXBwZXJTdGF0ZSQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICB7XG4gICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMocHJvcHMpO1xuICB9XG5cbiAgbm9kZS5fd3JhcHBlclN0YXRlID0ge1xuICAgIHdhc011bHRpcGxlOiAhIXByb3BzLm11bHRpcGxlXG4gIH07XG5cbiAge1xuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSkge1xuICAgICAgZXJyb3IoJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnKTtcblxuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlJDEgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQyKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgbm9kZS5tdWx0aXBsZSA9ICEhcHJvcHMubXVsdGlwbGU7XG4gIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlO1xuXG4gIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCB2YWx1ZSwgZmFsc2UpO1xuICB9IGVsc2UgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgdXBkYXRlT3B0aW9ucyhub2RlLCAhIXByb3BzLm11bHRpcGxlLCBwcm9wcy5kZWZhdWx0VmFsdWUsIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBwb3N0VXBkYXRlV3JhcHBlcihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG4gIHZhciB3YXNNdWx0aXBsZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZTtcbiAgbm9kZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gISFwcm9wcy5tdWx0aXBsZTtcbiAgdmFyIHZhbHVlID0gcHJvcHMudmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHZhbHVlLCBmYWxzZSk7XG4gIH0gZWxzZSBpZiAod2FzTXVsdGlwbGUgIT09ICEhcHJvcHMubXVsdGlwbGUpIHtcbiAgICAvLyBGb3Igc2ltcGxpY2l0eSwgcmVhcHBseSBgZGVmYXVsdFZhbHVlYCBpZiBgbXVsdGlwbGVgIGlzIHRvZ2dsZWQuXG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKG5vZGUsICEhcHJvcHMubXVsdGlwbGUsIHByb3BzLmRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJldmVydCB0aGUgc2VsZWN0IGJhY2sgdG8gaXRzIGRlZmF1bHQgdW5zZWxlY3RlZCBzdGF0ZS5cbiAgICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnLCBmYWxzZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDEoZWxlbWVudCwgcHJvcHMpIHtcbiAgdmFyIG5vZGUgPSBlbGVtZW50O1xuICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZU9wdGlvbnMobm9kZSwgISFwcm9wcy5tdWx0aXBsZSwgdmFsdWUsIGZhbHNlKTtcbiAgfVxufVxuXG52YXIgZGlkV2FyblZhbERlZmF1bHRWYWwgPSBmYWxzZTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHRleHRhcmVhPiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIGB2YWx1ZWAsIGFuZFxuICogYGRlZmF1bHRWYWx1ZWAuIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB0cmFkaXRpb25hbCBET00gQVBJIGJlY2F1c2UgdmFsdWUgaXNcbiAqIHVzdWFsbHkgc2V0IGFzIFBDREFUQSBjaGlsZHJlbi5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlXG4gKiB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiBgdmFsdWVgIGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbFxuICogbm90IHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIGB2YWx1ZWAgcHJvcCBtdXN0IGNoYW5nZSBpblxuICogb3JkZXIgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGFuIGVtcHR5IHZhbHVlLCB0aGUgcHJvcFxuICogYGRlZmF1bHRWYWx1ZWAgaWYgc3BlY2lmaWVkLCBvciB0aGUgY2hpbGRyZW4gY29udGVudCAoZGVwcmVjYXRlZCkuXG4gKi9cbmZ1bmN0aW9uIGdldEhvc3RQcm9wcyQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcblxuICBpZiAoIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImBkYW5nZXJvdXNseVNldElubmVySFRNTGAgZG9lcyBub3QgbWFrZSBzZW5zZSBvbiA8dGV4dGFyZWE+LlwiICk7XG4gICAgfVxuICB9IC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gIC8vIGdldCByZXNldCBpZiBgdGV4dENvbnRlbnRgIGlzIG11dGF0ZWQuICBXZSBjb3VsZCBhZGQgYSBjaGVjayBpbiBzZXRUZXh0Q29udGVudFxuICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rU29waGllIHNlZW1lZCB0byBsaWtlIHRoaXNcbiAgLy8gc29sdXRpb24uIFRoZSB2YWx1ZSBjYW4gYmUgYSBib29sZWFuIG9yIG9iamVjdCBzbyB0aGF0J3Mgd2h5IGl0J3MgZm9yY2VkXG4gIC8vIHRvIGJlIGEgc3RyaW5nLlxuXG5cbiAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICBjaGlsZHJlbjogdG9TdHJpbmcobm9kZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSlcbiAgfSk7XG5cbiAgcmV0dXJuIGhvc3RQcm9wcztcbn1cbmZ1bmN0aW9uIGluaXRXcmFwcGVyU3RhdGUkMihlbGVtZW50LCBwcm9wcykge1xuICB2YXIgbm9kZSA9IGVsZW1lbnQ7XG5cbiAge1xuICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoJ3RleHRhcmVhJywgcHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWxEZWZhdWx0VmFsKSB7XG4gICAgICBlcnJvcignJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gJyArICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHMnLCBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8ICdBIGNvbXBvbmVudCcpO1xuXG4gICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGluaXRpYWxWYWx1ZSA9IHByb3BzLnZhbHVlOyAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuXG4gIGlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkge1xuICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICBlcnJvcignVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJyk7XG4gICAgICB9XG5cbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZGVmYXVsdFZhbHVlID09IG51bGwpKSB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKCEoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRocm93IEVycm9yKCBcIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC5cIiApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgIH1cblxuICAgIGluaXRpYWxWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIG5vZGUuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICBpbml0aWFsVmFsdWU6IGdldFRvU3RyaW5nVmFsdWUoaW5pdGlhbFZhbHVlKVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDtcbiAgdmFyIHZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZShwcm9wcy52YWx1ZSk7XG4gIHZhciBkZWZhdWx0VmFsdWUgPSBnZXRUb1N0cmluZ1ZhbHVlKHByb3BzLmRlZmF1bHRWYWx1ZSk7XG5cbiAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICB2YXIgbmV3VmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7IC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG5cbiAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgIG5vZGUudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwgJiYgbm9kZS5kZWZhdWx0VmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gdG9TdHJpbmcoZGVmYXVsdFZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gcG9zdE1vdW50V3JhcHBlciQzKGVsZW1lbnQsIHByb3BzKSB7XG4gIHZhciBub2RlID0gZWxlbWVudDsgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cblxuICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50OyAvLyBPbmx5IHNldCBub2RlLnZhbHVlIGlmIHRleHRDb250ZW50IGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZFxuICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwMTUyNS9cblxuICBpZiAodGV4dENvbnRlbnQgPT09IG5vZGUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUpIHtcbiAgICBpZiAodGV4dENvbnRlbnQgIT09ICcnICYmIHRleHRDb250ZW50ICE9PSBudWxsKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiByZXN0b3JlQ29udHJvbGxlZFN0YXRlJDIoZWxlbWVudCwgcHJvcHMpIHtcbiAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgdXBkYXRlV3JhcHBlciQxKGVsZW1lbnQsIHByb3BzKTtcbn1cblxudmFyIEhUTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnO1xudmFyIE1BVEhfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xudmFyIFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xudmFyIE5hbWVzcGFjZXMgPSB7XG4gIGh0bWw6IEhUTUxfTkFNRVNQQUNFLFxuICBtYXRobWw6IE1BVEhfTkFNRVNQQUNFLFxuICBzdmc6IFNWR19OQU1FU1BBQ0Vcbn07IC8vIEFzc3VtZXMgdGhlcmUgaXMgbm8gcGFyZW50IG5hbWVzcGFjZS5cblxuZnVuY3Rpb24gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc3ZnJzpcbiAgICAgIHJldHVybiBTVkdfTkFNRVNQQUNFO1xuXG4gICAgY2FzZSAnbWF0aCc6XG4gICAgICByZXR1cm4gTUFUSF9OQU1FU1BBQ0U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIEhUTUxfTkFNRVNQQUNFO1xuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZE5hbWVzcGFjZShwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgaWYgKHBhcmVudE5hbWVzcGFjZSA9PSBudWxsIHx8IHBhcmVudE5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UpIHtcbiAgICAvLyBObyAob3IgZGVmYXVsdCkgcGFyZW50IG5hbWVzcGFjZTogcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuICAgIHJldHVybiBnZXRJbnRyaW5zaWNOYW1lc3BhY2UodHlwZSk7XG4gIH1cblxuICBpZiAocGFyZW50TmFtZXNwYWNlID09PSBTVkdfTkFNRVNQQUNFICYmIHR5cGUgPT09ICdmb3JlaWduT2JqZWN0Jykge1xuICAgIC8vIFdlJ3JlIGxlYXZpbmcgU1ZHLlxuICAgIHJldHVybiBIVE1MX05BTUVTUEFDRTtcbiAgfSAvLyBCeSBkZWZhdWx0LCBwYXNzIG5hbWVzcGFjZSBiZWxvdy5cblxuXG4gIHJldHVybiBwYXJlbnROYW1lc3BhY2U7XG59XG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiB3aGljaCBoYXMgJ3Vuc2FmZScgcHJpdmlsZWdlcyAocmVxdWlyZWQgYnkgd2luZG93czggYXBwcylcbiAqL1xudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcbi8qKlxuICogU2V0IHRoZSBpbm5lckhUTUwgcHJvcGVydHkgb2YgYSBub2RlXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cblxudmFyIHNldElubmVySFRNTCA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKG5vZGUsIGh0bWwpIHtcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBOYW1lc3BhY2VzLnN2Zykge1xuXG4gICAgaWYgKCEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICAgIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAgICAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAgICAgLy8gdGhlIHRhcmdldCBub2RlXG4gICAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcmV1c2FibGVTVkdDb250YWluZXIuaW5uZXJIVE1MID0gJzxzdmc+JyArIGh0bWwudmFsdWVPZigpLnRvU3RyaW5nKCkgKyAnPC9zdmc+JztcbiAgICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcblxuICAgICAgd2hpbGUgKG5vZGUuZmlyc3RDaGlsZCkge1xuICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZChzdmdOb2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xufSk7XG5cbi8qKlxuICogSFRNTCBub2RlVHlwZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgb2YgdGhlIG5vZGVcbiAqL1xudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xudmFyIERPQ1VNRU5UX05PREUgPSA5O1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPSAxMTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZS4gRm9yIHRleHQgdXBkYXRlcywgaXQncyBmYXN0ZXJcbiAqIHRvIHNldCB0aGUgYG5vZGVWYWx1ZWAgb2YgdGhlIFRleHQgbm9kZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nXG4gKiBgLnRleHRDb250ZW50YCB3aGljaCB3aWxsIHJlbW92ZSB0aGUgZXhpc3Rpbmcgbm9kZSBhbmQgY3JlYXRlIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59O1xuXG4vLyBMaXN0IGRlcml2ZWQgZnJvbSBHZWNrbyBzb3VyY2UgY29kZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2dlY2tvLWRldi9ibG9iLzRlNjM4ZWZjNzEvbGF5b3V0L3N0eWxlL3Rlc3QvcHJvcGVydHlfZGF0YWJhc2UuanNcbnZhciBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICBhbmltYXRpb246IFsnYW5pbWF0aW9uRGVsYXknLCAnYW5pbWF0aW9uRGlyZWN0aW9uJywgJ2FuaW1hdGlvbkR1cmF0aW9uJywgJ2FuaW1hdGlvbkZpbGxNb2RlJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50JywgJ2FuaW1hdGlvbk5hbWUnLCAnYW5pbWF0aW9uUGxheVN0YXRlJywgJ2FuaW1hdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIGJhY2tncm91bmQ6IFsnYmFja2dyb3VuZEF0dGFjaG1lbnQnLCAnYmFja2dyb3VuZENsaXAnLCAnYmFja2dyb3VuZENvbG9yJywgJ2JhY2tncm91bmRJbWFnZScsICdiYWNrZ3JvdW5kT3JpZ2luJywgJ2JhY2tncm91bmRQb3NpdGlvblgnLCAnYmFja2dyb3VuZFBvc2l0aW9uWScsICdiYWNrZ3JvdW5kUmVwZWF0JywgJ2JhY2tncm91bmRTaXplJ10sXG4gIGJhY2tncm91bmRQb3NpdGlvbjogWydiYWNrZ3JvdW5kUG9zaXRpb25YJywgJ2JhY2tncm91bmRQb3NpdGlvblknXSxcbiAgYm9yZGVyOiBbJ2JvcmRlckJvdHRvbUNvbG9yJywgJ2JvcmRlckJvdHRvbVN0eWxlJywgJ2JvcmRlckJvdHRvbVdpZHRoJywgJ2JvcmRlckltYWdlT3V0c2V0JywgJ2JvcmRlckltYWdlUmVwZWF0JywgJ2JvcmRlckltYWdlU2xpY2UnLCAnYm9yZGVySW1hZ2VTb3VyY2UnLCAnYm9yZGVySW1hZ2VXaWR0aCcsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyTGVmdFN0eWxlJywgJ2JvcmRlckxlZnRXaWR0aCcsICdib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCcsICdib3JkZXJUb3BDb2xvcicsICdib3JkZXJUb3BTdHlsZScsICdib3JkZXJUb3BXaWR0aCddLFxuICBib3JkZXJCbG9ja0VuZDogWydib3JkZXJCbG9ja0VuZENvbG9yJywgJ2JvcmRlckJsb2NrRW5kU3R5bGUnLCAnYm9yZGVyQmxvY2tFbmRXaWR0aCddLFxuICBib3JkZXJCbG9ja1N0YXJ0OiBbJ2JvcmRlckJsb2NrU3RhcnRDb2xvcicsICdib3JkZXJCbG9ja1N0YXJ0U3R5bGUnLCAnYm9yZGVyQmxvY2tTdGFydFdpZHRoJ10sXG4gIGJvcmRlckJvdHRvbTogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJCb3R0b21XaWR0aCddLFxuICBib3JkZXJDb2xvcjogWydib3JkZXJCb3R0b21Db2xvcicsICdib3JkZXJMZWZ0Q29sb3InLCAnYm9yZGVyUmlnaHRDb2xvcicsICdib3JkZXJUb3BDb2xvciddLFxuICBib3JkZXJJbWFnZTogWydib3JkZXJJbWFnZU91dHNldCcsICdib3JkZXJJbWFnZVJlcGVhdCcsICdib3JkZXJJbWFnZVNsaWNlJywgJ2JvcmRlckltYWdlU291cmNlJywgJ2JvcmRlckltYWdlV2lkdGgnXSxcbiAgYm9yZGVySW5saW5lRW5kOiBbJ2JvcmRlcklubGluZUVuZENvbG9yJywgJ2JvcmRlcklubGluZUVuZFN0eWxlJywgJ2JvcmRlcklubGluZUVuZFdpZHRoJ10sXG4gIGJvcmRlcklubGluZVN0YXJ0OiBbJ2JvcmRlcklubGluZVN0YXJ0Q29sb3InLCAnYm9yZGVySW5saW5lU3RhcnRTdHlsZScsICdib3JkZXJJbmxpbmVTdGFydFdpZHRoJ10sXG4gIGJvcmRlckxlZnQ6IFsnYm9yZGVyTGVmdENvbG9yJywgJ2JvcmRlckxlZnRTdHlsZScsICdib3JkZXJMZWZ0V2lkdGgnXSxcbiAgYm9yZGVyUmFkaXVzOiBbJ2JvcmRlckJvdHRvbUxlZnRSYWRpdXMnLCAnYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMnLCAnYm9yZGVyVG9wTGVmdFJhZGl1cycsICdib3JkZXJUb3BSaWdodFJhZGl1cyddLFxuICBib3JkZXJSaWdodDogWydib3JkZXJSaWdodENvbG9yJywgJ2JvcmRlclJpZ2h0U3R5bGUnLCAnYm9yZGVyUmlnaHRXaWR0aCddLFxuICBib3JkZXJTdHlsZTogWydib3JkZXJCb3R0b21TdHlsZScsICdib3JkZXJMZWZ0U3R5bGUnLCAnYm9yZGVyUmlnaHRTdHlsZScsICdib3JkZXJUb3BTdHlsZSddLFxuICBib3JkZXJUb3A6IFsnYm9yZGVyVG9wQ29sb3InLCAnYm9yZGVyVG9wU3R5bGUnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgYm9yZGVyV2lkdGg6IFsnYm9yZGVyQm90dG9tV2lkdGgnLCAnYm9yZGVyTGVmdFdpZHRoJywgJ2JvcmRlclJpZ2h0V2lkdGgnLCAnYm9yZGVyVG9wV2lkdGgnXSxcbiAgY29sdW1uUnVsZTogWydjb2x1bW5SdWxlQ29sb3InLCAnY29sdW1uUnVsZVN0eWxlJywgJ2NvbHVtblJ1bGVXaWR0aCddLFxuICBjb2x1bW5zOiBbJ2NvbHVtbkNvdW50JywgJ2NvbHVtbldpZHRoJ10sXG4gIGZsZXg6IFsnZmxleEJhc2lzJywgJ2ZsZXhHcm93JywgJ2ZsZXhTaHJpbmsnXSxcbiAgZmxleEZsb3c6IFsnZmxleERpcmVjdGlvbicsICdmbGV4V3JhcCddLFxuICBmb250OiBbJ2ZvbnRGYW1pbHknLCAnZm9udEZlYXR1cmVTZXR0aW5ncycsICdmb250S2VybmluZycsICdmb250TGFuZ3VhZ2VPdmVycmlkZScsICdmb250U2l6ZScsICdmb250U2l6ZUFkanVzdCcsICdmb250U3RyZXRjaCcsICdmb250U3R5bGUnLCAnZm9udFZhcmlhbnQnLCAnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbicsICdmb250V2VpZ2h0JywgJ2xpbmVIZWlnaHQnXSxcbiAgZm9udFZhcmlhbnQ6IFsnZm9udFZhcmlhbnRBbHRlcm5hdGVzJywgJ2ZvbnRWYXJpYW50Q2FwcycsICdmb250VmFyaWFudEVhc3RBc2lhbicsICdmb250VmFyaWFudExpZ2F0dXJlcycsICdmb250VmFyaWFudE51bWVyaWMnLCAnZm9udFZhcmlhbnRQb3NpdGlvbiddLFxuICBnYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkOiBbJ2dyaWRBdXRvQ29sdW1ucycsICdncmlkQXV0b0Zsb3cnLCAnZ3JpZEF1dG9Sb3dzJywgJ2dyaWRUZW1wbGF0ZUFyZWFzJywgJ2dyaWRUZW1wbGF0ZUNvbHVtbnMnLCAnZ3JpZFRlbXBsYXRlUm93cyddLFxuICBncmlkQXJlYTogWydncmlkQ29sdW1uRW5kJywgJ2dyaWRDb2x1bW5TdGFydCcsICdncmlkUm93RW5kJywgJ2dyaWRSb3dTdGFydCddLFxuICBncmlkQ29sdW1uOiBbJ2dyaWRDb2x1bW5FbmQnLCAnZ3JpZENvbHVtblN0YXJ0J10sXG4gIGdyaWRDb2x1bW5HYXA6IFsnY29sdW1uR2FwJ10sXG4gIGdyaWRHYXA6IFsnY29sdW1uR2FwJywgJ3Jvd0dhcCddLFxuICBncmlkUm93OiBbJ2dyaWRSb3dFbmQnLCAnZ3JpZFJvd1N0YXJ0J10sXG4gIGdyaWRSb3dHYXA6IFsncm93R2FwJ10sXG4gIGdyaWRUZW1wbGF0ZTogWydncmlkVGVtcGxhdGVBcmVhcycsICdncmlkVGVtcGxhdGVDb2x1bW5zJywgJ2dyaWRUZW1wbGF0ZVJvd3MnXSxcbiAgbGlzdFN0eWxlOiBbJ2xpc3RTdHlsZUltYWdlJywgJ2xpc3RTdHlsZVBvc2l0aW9uJywgJ2xpc3RTdHlsZVR5cGUnXSxcbiAgbWFyZ2luOiBbJ21hcmdpbkJvdHRvbScsICdtYXJnaW5MZWZ0JywgJ21hcmdpblJpZ2h0JywgJ21hcmdpblRvcCddLFxuICBtYXJrZXI6IFsnbWFya2VyRW5kJywgJ21hcmtlck1pZCcsICdtYXJrZXJTdGFydCddLFxuICBtYXNrOiBbJ21hc2tDbGlwJywgJ21hc2tDb21wb3NpdGUnLCAnbWFza0ltYWdlJywgJ21hc2tNb2RlJywgJ21hc2tPcmlnaW4nLCAnbWFza1Bvc2l0aW9uWCcsICdtYXNrUG9zaXRpb25ZJywgJ21hc2tSZXBlYXQnLCAnbWFza1NpemUnXSxcbiAgbWFza1Bvc2l0aW9uOiBbJ21hc2tQb3NpdGlvblgnLCAnbWFza1Bvc2l0aW9uWSddLFxuICBvdXRsaW5lOiBbJ291dGxpbmVDb2xvcicsICdvdXRsaW5lU3R5bGUnLCAnb3V0bGluZVdpZHRoJ10sXG4gIG92ZXJmbG93OiBbJ292ZXJmbG93WCcsICdvdmVyZmxvd1knXSxcbiAgcGFkZGluZzogWydwYWRkaW5nQm90dG9tJywgJ3BhZGRpbmdMZWZ0JywgJ3BhZGRpbmdSaWdodCcsICdwYWRkaW5nVG9wJ10sXG4gIHBsYWNlQ29udGVudDogWydhbGlnbkNvbnRlbnQnLCAnanVzdGlmeUNvbnRlbnQnXSxcbiAgcGxhY2VJdGVtczogWydhbGlnbkl0ZW1zJywgJ2p1c3RpZnlJdGVtcyddLFxuICBwbGFjZVNlbGY6IFsnYWxpZ25TZWxmJywgJ2p1c3RpZnlTZWxmJ10sXG4gIHRleHREZWNvcmF0aW9uOiBbJ3RleHREZWNvcmF0aW9uQ29sb3InLCAndGV4dERlY29yYXRpb25MaW5lJywgJ3RleHREZWNvcmF0aW9uU3R5bGUnXSxcbiAgdGV4dEVtcGhhc2lzOiBbJ3RleHRFbXBoYXNpc0NvbG9yJywgJ3RleHRFbXBoYXNpc1N0eWxlJ10sXG4gIHRyYW5zaXRpb246IFsndHJhbnNpdGlvbkRlbGF5JywgJ3RyYW5zaXRpb25EdXJhdGlvbicsICd0cmFuc2l0aW9uUHJvcGVydHknLCAndHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uJ10sXG4gIHdvcmRXcmFwOiBbJ292ZXJmbG93V3JhcCddXG59O1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiB0cnVlLFxuICBib3JkZXJJbWFnZU91dHNldDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VTbGljZTogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VXaWR0aDogdHJ1ZSxcbiAgYm94RmxleDogdHJ1ZSxcbiAgYm94RmxleEdyb3VwOiB0cnVlLFxuICBib3hPcmRpbmFsR3JvdXA6IHRydWUsXG4gIGNvbHVtbkNvdW50OiB0cnVlLFxuICBjb2x1bW5zOiB0cnVlLFxuICBmbGV4OiB0cnVlLFxuICBmbGV4R3JvdzogdHJ1ZSxcbiAgZmxleFBvc2l0aXZlOiB0cnVlLFxuICBmbGV4U2hyaW5rOiB0cnVlLFxuICBmbGV4TmVnYXRpdmU6IHRydWUsXG4gIGZsZXhPcmRlcjogdHJ1ZSxcbiAgZ3JpZEFyZWE6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRSb3dFbmQ6IHRydWUsXG4gIGdyaWRSb3dTcGFuOiB0cnVlLFxuICBncmlkUm93U3RhcnQ6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGdyaWRDb2x1bW5FbmQ6IHRydWUsXG4gIGdyaWRDb2x1bW5TcGFuOiB0cnVlLFxuICBncmlkQ29sdW1uU3RhcnQ6IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IHZlbmRvci1zcGVjaWZpYyBwcmVmaXgsIGVnOiBXZWJraXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgc3R5bGUgbmFtZSwgZWc6IHRyYW5zaXRpb25EdXJhdGlvblxuICogQHJldHVybiB7c3RyaW5nfSBzdHlsZSBuYW1lIHByZWZpeGVkIHdpdGggYHByZWZpeGAsIHByb3Blcmx5IGNhbWVsQ2FzZWQsIGVnOlxuICogV2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuLyoqXG4gKiBTdXBwb3J0IHN0eWxlIG5hbWVzIHRoYXQgbWF5IGNvbWUgcGFzc2VkIGluIHByZWZpeGVkIGJ5IGFkZGluZyBwZXJtdXRhdGlvbnNcbiAqIG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107IC8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuXG5PYmplY3Qua2V5cyhpc1VuaXRsZXNzTnVtYmVyKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHByZWZpeGVzLmZvckVhY2goZnVuY3Rpb24gKHByZWZpeCkge1xuICAgIGlzVW5pdGxlc3NOdW1iZXJbcHJlZml4S2V5KHByZWZpeCwgcHJvcCldID0gaXNVbml0bGVzc051bWJlcltwcm9wXTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBpc0N1c3RvbVByb3BlcnR5KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG4gIHZhciBpc0VtcHR5ID0gdmFsdWUgPT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB2YWx1ZSA9PT0gJyc7XG5cbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAoIWlzQ3VzdG9tUHJvcGVydHkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gMCAmJiAhKGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkpIHtcbiAgICByZXR1cm4gdmFsdWUgKyAncHgnOyAvLyBQcmVzdW1lcyBpbXBsaWNpdCAncHgnIHN1ZmZpeCBmb3IgdW5pdGxlc3MgbnVtYmVyc1xuICB9XG5cbiAgcmV0dXJuICgnJyArIHZhbHVlKS50cmltKCk7XG59XG5cbnZhciB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG4vKipcbiAqIEh5cGhlbmF0ZXMgYSBjYW1lbGNhc2VkIENTUyBwcm9wZXJ0eSBuYW1lLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdNb3pUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tb3otdHJhbnNpdGlvblwiXG4gKiAgID4gaHlwaGVuYXRlU3R5bGVOYW1lKCdtc1RyYW5zaXRpb24nKVxuICogICA8IFwiLW1zLXRyYW5zaXRpb25cIlxuICpcbiAqIEFzIE1vZGVybml6ciBzdWdnZXN0cyAoaHR0cDovL21vZGVybml6ci5jb20vZG9jcy8jcHJlZml4ZWQpLCBhbiBgbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGAtbXMtYC5cbiAqL1xuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKHVwcGVyY2FzZVBhdHRlcm4sICctJDEnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxuXG52YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG4gIHZhciBtc1BhdHRlcm4kMSA9IC9eLW1zLS87XG4gIHZhciBoeXBoZW5QYXR0ZXJuID0gLy0oLikvZzsgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG5cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG4gIHZhciB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIGNhbWVsaXplID0gZnVuY3Rpb24gKHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShoeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCAvLyBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gICAgLy8gKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICAgIC8vIGlzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYG1zYC5cbiAgICBjYW1lbGl6ZShuYW1lLnJlcGxhY2UobXNQYXR0ZXJuJDEsICdtcy0nKSkpO1xuICB9O1xuXG4gIHZhciB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKCdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8nLCBuYW1lLCBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSk7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcblxuICAgIGVycm9yKFwiU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uLiBcIiArICdUcnkgXCIlczogJXNcIiBpbnN0ZWFkLicsIG5hbWUsIHZhbHVlLnJlcGxhY2UoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLCAnJykpO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZUlzTmFOID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuXG4gICAgZXJyb3IoJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5ID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKHdhcm5lZEZvckluZmluaXR5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlID0gdHJ1ZTtcblxuICAgIGVycm9yKCdgSW5maW5pdHlgIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4nLCBuYW1lKTtcbiAgfTtcblxuICB3YXJuVmFsaWRTdHlsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChuYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB3YXJuSHlwaGVuYXRlZFN0eWxlTmFtZShuYW1lKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSk7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICAgICAgd2FyblN0eWxlVmFsdWVJc0luZmluaXR5KG5hbWUsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVmFsaWRTdHlsZSQxID0gd2FyblZhbGlkU3R5bGU7XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogVGhpcyBjcmVhdGVzIGEgc3RyaW5nIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgc3R5bGVcbiAqIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgYnkgc2VydmVyLXNpZGUgcmVuZGVyaW5nLiBJdCBieS1wYXNzZXMgd2FybmluZ3MgYW5kXG4gKiBzZWN1cml0eSBjaGVja3Mgc28gaXQncyBub3Qgc2FmZSB0byB1c2UgdGhpcyB2YWx1ZSBmb3IgYW55dGhpbmcgb3RoZXIgdGhhblxuICogY29tcGFyaXNvbi4gSXQgaXMgb25seSB1c2VkIGluIERFViBmb3IgU1NSIHZhbGlkYXRpb24uXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlRGFuZ2Vyb3VzU3RyaW5nRm9yU3R5bGVzKHN0eWxlcykge1xuICB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICB2YXIgZGVsaW1pdGVyID0gJyc7XG5cbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IHN0eWxlc1tzdHlsZU5hbWVdO1xuXG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gc3R5bGVOYW1lLmluZGV4T2YoJy0tJykgPT09IDA7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGVsaW1pdGVyICsgKGlzQ3VzdG9tUHJvcGVydHkgPyBzdHlsZU5hbWUgOiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKSkgKyAnOic7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGlzQ3VzdG9tUHJvcGVydHkpO1xuICAgICAgICBkZWxpbWl0ZXIgPSAnOyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfVxufVxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAqL1xuXG5mdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMpIHtcbiAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcblxuICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzQ3VzdG9tUHJvcGVydHkgPSBzdHlsZU5hbWUuaW5kZXhPZignLS0nKSA9PT0gMDtcblxuICAgIHtcbiAgICAgIGlmICghaXNDdXN0b21Qcm9wZXJ0eSkge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZSQxKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBpc0N1c3RvbVByb3BlcnR5KTtcblxuICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcpIHtcbiAgICAgIHN0eWxlTmFtZSA9ICdjc3NGbG9hdCc7XG4gICAgfVxuXG4gICAgaWYgKGlzQ3VzdG9tUHJvcGVydHkpIHtcbiAgICAgIHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbHVlRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xufVxuLyoqXG4gKiBHaXZlbiB7Y29sb3I6ICdyZWQnLCBvdmVyZmxvdzogJ2hpZGRlbid9IHJldHVybnMge1xuICogICBjb2xvcjogJ2NvbG9yJyxcbiAqICAgb3ZlcmZsb3dYOiAnb3ZlcmZsb3cnLFxuICogICBvdmVyZmxvd1k6ICdvdmVyZmxvdycsXG4gKiB9LiBUaGlzIGNhbiBiZSByZWFkIGFzIFwidGhlIG92ZXJmbG93WSBwcm9wZXJ0eSB3YXMgc2V0IGJ5IHRoZSBvdmVyZmxvd1xuICogc2hvcnRoYW5kXCIuIFRoYXQgaXMsIHRoZSB2YWx1ZXMgYXJlIHRoZSBwcm9wZXJ0eSB0aGF0IGVhY2ggd2FzIGRlcml2ZWQgZnJvbS5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZXMpIHtcbiAgdmFyIGV4cGFuZGVkID0ge307XG5cbiAgZm9yICh2YXIga2V5IGluIHN0eWxlcykge1xuICAgIHZhciBsb25naGFuZHMgPSBzaG9ydGhhbmRUb0xvbmdoYW5kW2tleV0gfHwgW2tleV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmdoYW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwYW5kZWRbbG9uZ2hhbmRzW2ldXSA9IGtleTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhwYW5kZWQ7XG59XG4vKipcbiAqIFdoZW4gbWl4aW5nIHNob3J0aGFuZCBhbmQgbG9uZ2hhbmQgcHJvcGVydHkgbmFtZXMsIHdlIHdhcm4gZHVyaW5nIHVwZGF0ZXMgaWZcbiAqIHdlIGV4cGVjdCBhbiBpbmNvcnJlY3QgcmVzdWx0IHRvIG9jY3VyLiBJbiBwYXJ0aWN1bGFyLCB3ZSB3YXJuIGZvcjpcbiAqXG4gKiBVcGRhdGluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBvdmVyd3JpdHRlbik6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udDogJ2JheicsIGZvbnRWYXJpYW50OiAnYmFyJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udCA9ICdiYXonXG4gKiBSZW1vdmluZyBhIHNob3J0aGFuZCBwcm9wZXJ0eSAobG9uZ2hhbmQgZ2V0cyBsb3N0IHRvbyk6XG4gKiAgIHtmb250OiAnZm9vJywgZm9udFZhcmlhbnQ6ICdiYXInfSAtPiB7Zm9udFZhcmlhbnQ6ICdiYXInfVxuICogICBiZWNvbWVzIC5zdHlsZS5mb250ID0gJydcbiAqIFJlbW92aW5nIGEgbG9uZ2hhbmQgcHJvcGVydHkgKHNob3VsZCByZXZlcnQgdG8gc2hvcnRoYW5kOyBkb2Vzbid0KTpcbiAqICAge2ZvbnQ6ICdmb28nLCBmb250VmFyaWFudDogJ2Jhcid9IC0+IHtmb250OiAnZm9vJ31cbiAqICAgYmVjb21lcyAuc3R5bGUuZm9udFZhcmlhbnQgPSAnJ1xuICovXG5cblxuZnVuY3Rpb24gdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFN0eWxlcykge1xuICB7XG4gICAgaWYgKCFuZXh0U3R5bGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChzdHlsZVVwZGF0ZXMpO1xuICAgIHZhciBleHBhbmRlZFN0eWxlcyA9IGV4cGFuZFNob3J0aGFuZE1hcChuZXh0U3R5bGVzKTtcbiAgICB2YXIgd2FybmVkQWJvdXQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBleHBhbmRlZFVwZGF0ZXMpIHtcbiAgICAgIHZhciBvcmlnaW5hbEtleSA9IGV4cGFuZGVkVXBkYXRlc1trZXldO1xuICAgICAgdmFyIGNvcnJlY3RPcmlnaW5hbEtleSA9IGV4cGFuZGVkU3R5bGVzW2tleV07XG5cbiAgICAgIGlmIChjb3JyZWN0T3JpZ2luYWxLZXkgJiYgb3JpZ2luYWxLZXkgIT09IGNvcnJlY3RPcmlnaW5hbEtleSkge1xuICAgICAgICB2YXIgd2FybmluZ0tleSA9IG9yaWdpbmFsS2V5ICsgJywnICsgY29ycmVjdE9yaWdpbmFsS2V5O1xuXG4gICAgICAgIGlmICh3YXJuZWRBYm91dFt3YXJuaW5nS2V5XSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgd2FybmVkQWJvdXRbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclcyBhIHN0eWxlIHByb3BlcnR5IGR1cmluZyByZXJlbmRlciAoJXMpIHdoZW4gYSAnICsgJ2NvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gJyArIFwiYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIFwiICsgJ2ZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggJyArICdzZXBhcmF0ZSB2YWx1ZXMuJywgaXNWYWx1ZUVtcHR5KHN0eWxlVXBkYXRlc1tvcmlnaW5hbEtleV0pID8gJ1JlbW92aW5nJyA6ICdVcGRhdGluZycsIG9yaWdpbmFsS2V5LCBjb3JyZWN0T3JpZ2luYWxLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIGxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cbnZhciBvbWl0dGVkQ2xvc2VUYWdzID0ge1xuICBhcmVhOiB0cnVlLFxuICBiYXNlOiB0cnVlLFxuICBicjogdHJ1ZSxcbiAgY29sOiB0cnVlLFxuICBlbWJlZDogdHJ1ZSxcbiAgaHI6IHRydWUsXG4gIGltZzogdHJ1ZSxcbiAgaW5wdXQ6IHRydWUsXG4gIGtleWdlbjogdHJ1ZSxcbiAgbGluazogdHJ1ZSxcbiAgbWV0YTogdHJ1ZSxcbiAgcGFyYW06IHRydWUsXG4gIHNvdXJjZTogdHJ1ZSxcbiAgdHJhY2s6IHRydWUsXG4gIHdicjogdHJ1ZSAvLyBOT1RFOiBtZW51aXRlbSdzIGNsb3NlIHRhZyBzaG91bGQgYmUgb21pdHRlZCwgYnV0IHRoYXQgY2F1c2VzIHByb2JsZW1zLlxuXG59O1xuXG4vLyBgb21pdHRlZENsb3NlVGFnc2AgZXhjZXB0IHRoYXQgYG1lbnVpdGVtYCBzaG91bGQgc3RpbGwgaGF2ZSBpdHMgY2xvc2luZyB0YWcuXG5cbnZhciB2b2lkRWxlbWVudFRhZ3MgPSBfYXNzaWduKHtcbiAgbWVudWl0ZW06IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG52YXIgSFRNTCA9ICdfX2h0bWwnO1xuXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKHRhZywgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfSAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuXG5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1t0YWddKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggdGFnICsgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgaWYgKCEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIEhUTUwgaW4gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKCFwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgJiYgcHJvcHMuY29udGVudEVkaXRhYmxlICYmIHByb3BzLmNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGVycm9yKCdBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5ICcgKyAnUmVhY3QuIEl0IGlzIG5vdyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGd1YXJhbnRlZSB0aGF0IG5vbmUgb2YgJyArICd0aG9zZSBub2RlcyBhcmUgdW5leHBlY3RlZGx5IG1vZGlmaWVkIG9yIGR1cGxpY2F0ZWQuIFRoaXMgaXMgJyArICdwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocHJvcHMuc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2YgcHJvcHMuc3R5bGUgPT09ICdvYmplY3QnKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIHVzaW5nIEpTWC5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICBpZiAodGFnTmFtZS5pbmRleE9mKCctJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZyc7XG4gIH1cblxuICBzd2l0Y2ggKHRhZ05hbWUpIHtcbiAgICAvLyBUaGVzZSBhcmUgcmVzZXJ2ZWQgU1ZHIGFuZCBNYXRoTUwgZWxlbWVudHMuXG4gICAgLy8gV2UgZG9uJ3QgbWluZCB0aGlzIGxpc3QgdG9vIG11Y2ggYmVjYXVzZSB3ZSBleHBlY3QgaXQgdG8gbmV2ZXIgZ3Jvdy5cbiAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgaXMgdG8gdHJhY2sgdGhlIG5hbWVzcGFjZSBpbiBhIGZldyBwbGFjZXMgd2hpY2ggaXMgY29udm9sdXRlZC5cbiAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL2N1c3RvbS8jY3VzdG9tLWVsZW1lbnRzLWNvcmUtY29uY2VwdHNcbiAgICBjYXNlICdhbm5vdGF0aW9uLXhtbCc6XG4gICAgY2FzZSAnY29sb3ItcHJvZmlsZSc6XG4gICAgY2FzZSAnZm9udC1mYWNlJzpcbiAgICBjYXNlICdmb250LWZhY2Utc3JjJzpcbiAgICBjYXNlICdmb250LWZhY2UtdXJpJzpcbiAgICBjYXNlICdmb250LWZhY2UtZm9ybWF0JzpcbiAgICBjYXNlICdmb250LWZhY2UtbmFtZSc6XG4gICAgY2FzZSAnbWlzc2luZy1nbHlwaCc6XG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLy8gV2hlbiBhZGRpbmcgYXR0cmlidXRlcyB0byB0aGUgSFRNTCBvciBTVkcgYWxsb3dlZCBhdHRyaWJ1dGUgbGlzdCwgYmUgc3VyZSB0b1xuLy8gYWxzbyBhZGQgdGhlbSB0byB0aGlzIG1vZHVsZSB0byBlbnN1cmUgY2FzaW5nIGFuZCBpbmNvcnJlY3QgbmFtZVxuLy8gd2FybmluZ3MuXG52YXIgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAvLyBIVE1MXG4gIGFjY2VwdDogJ2FjY2VwdCcsXG4gIGFjY2VwdGNoYXJzZXQ6ICdhY2NlcHRDaGFyc2V0JyxcbiAgJ2FjY2VwdC1jaGFyc2V0JzogJ2FjY2VwdENoYXJzZXQnLFxuICBhY2Nlc3NrZXk6ICdhY2Nlc3NLZXknLFxuICBhY3Rpb246ICdhY3Rpb24nLFxuICBhbGxvd2Z1bGxzY3JlZW46ICdhbGxvd0Z1bGxTY3JlZW4nLFxuICBhbHQ6ICdhbHQnLFxuICBhczogJ2FzJyxcbiAgYXN5bmM6ICdhc3luYycsXG4gIGF1dG9jYXBpdGFsaXplOiAnYXV0b0NhcGl0YWxpemUnLFxuICBhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGUnLFxuICBhdXRvY29ycmVjdDogJ2F1dG9Db3JyZWN0JyxcbiAgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyxcbiAgYXV0b3BsYXk6ICdhdXRvUGxheScsXG4gIGF1dG9zYXZlOiAnYXV0b1NhdmUnLFxuICBjYXB0dXJlOiAnY2FwdHVyZScsXG4gIGNlbGxwYWRkaW5nOiAnY2VsbFBhZGRpbmcnLFxuICBjZWxsc3BhY2luZzogJ2NlbGxTcGFjaW5nJyxcbiAgY2hhbGxlbmdlOiAnY2hhbGxlbmdlJyxcbiAgY2hhcnNldDogJ2NoYXJTZXQnLFxuICBjaGVja2VkOiAnY2hlY2tlZCcsXG4gIGNoaWxkcmVuOiAnY2hpbGRyZW4nLFxuICBjaXRlOiAnY2l0ZScsXG4gIGNsYXNzOiAnY2xhc3NOYW1lJyxcbiAgY2xhc3NpZDogJ2NsYXNzSUQnLFxuICBjbGFzc25hbWU6ICdjbGFzc05hbWUnLFxuICBjb2xzOiAnY29scycsXG4gIGNvbHNwYW46ICdjb2xTcGFuJyxcbiAgY29udGVudDogJ2NvbnRlbnQnLFxuICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnLFxuICBjb250ZXh0bWVudTogJ2NvbnRleHRNZW51JyxcbiAgY29udHJvbHM6ICdjb250cm9scycsXG4gIGNvbnRyb2xzbGlzdDogJ2NvbnRyb2xzTGlzdCcsXG4gIGNvb3JkczogJ2Nvb3JkcycsXG4gIGNyb3Nzb3JpZ2luOiAnY3Jvc3NPcmlnaW4nLFxuICBkYW5nZXJvdXNseXNldGlubmVyaHRtbDogJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyxcbiAgZGF0YTogJ2RhdGEnLFxuICBkYXRldGltZTogJ2RhdGVUaW1lJyxcbiAgZGVmYXVsdDogJ2RlZmF1bHQnLFxuICBkZWZhdWx0Y2hlY2tlZDogJ2RlZmF1bHRDaGVja2VkJyxcbiAgZGVmYXVsdHZhbHVlOiAnZGVmYXVsdFZhbHVlJyxcbiAgZGVmZXI6ICdkZWZlcicsXG4gIGRpcjogJ2RpcicsXG4gIGRpc2FibGVkOiAnZGlzYWJsZWQnLFxuICBkaXNhYmxlcGljdHVyZWlucGljdHVyZTogJ2Rpc2FibGVQaWN0dXJlSW5QaWN0dXJlJyxcbiAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiAnZGlzYWJsZVJlbW90ZVBsYXliYWNrJyxcbiAgZG93bmxvYWQ6ICdkb3dubG9hZCcsXG4gIGRyYWdnYWJsZTogJ2RyYWdnYWJsZScsXG4gIGVuY3R5cGU6ICdlbmNUeXBlJyxcbiAgZW50ZXJrZXloaW50OiAnZW50ZXJLZXlIaW50JyxcbiAgZm9yOiAnaHRtbEZvcicsXG4gIGZvcm06ICdmb3JtJyxcbiAgZm9ybW1ldGhvZDogJ2Zvcm1NZXRob2QnLFxuICBmb3JtYWN0aW9uOiAnZm9ybUFjdGlvbicsXG4gIGZvcm1lbmN0eXBlOiAnZm9ybUVuY1R5cGUnLFxuICBmb3Jtbm92YWxpZGF0ZTogJ2Zvcm1Ob1ZhbGlkYXRlJyxcbiAgZm9ybXRhcmdldDogJ2Zvcm1UYXJnZXQnLFxuICBmcmFtZWJvcmRlcjogJ2ZyYW1lQm9yZGVyJyxcbiAgaGVhZGVyczogJ2hlYWRlcnMnLFxuICBoZWlnaHQ6ICdoZWlnaHQnLFxuICBoaWRkZW46ICdoaWRkZW4nLFxuICBoaWdoOiAnaGlnaCcsXG4gIGhyZWY6ICdocmVmJyxcbiAgaHJlZmxhbmc6ICdocmVmTGFuZycsXG4gIGh0bWxmb3I6ICdodG1sRm9yJyxcbiAgaHR0cGVxdWl2OiAnaHR0cEVxdWl2JyxcbiAgJ2h0dHAtZXF1aXYnOiAnaHR0cEVxdWl2JyxcbiAgaWNvbjogJ2ljb24nLFxuICBpZDogJ2lkJyxcbiAgaW5uZXJodG1sOiAnaW5uZXJIVE1MJyxcbiAgaW5wdXRtb2RlOiAnaW5wdXRNb2RlJyxcbiAgaW50ZWdyaXR5OiAnaW50ZWdyaXR5JyxcbiAgaXM6ICdpcycsXG4gIGl0ZW1pZDogJ2l0ZW1JRCcsXG4gIGl0ZW1wcm9wOiAnaXRlbVByb3AnLFxuICBpdGVtcmVmOiAnaXRlbVJlZicsXG4gIGl0ZW1zY29wZTogJ2l0ZW1TY29wZScsXG4gIGl0ZW10eXBlOiAnaXRlbVR5cGUnLFxuICBrZXlwYXJhbXM6ICdrZXlQYXJhbXMnLFxuICBrZXl0eXBlOiAna2V5VHlwZScsXG4gIGtpbmQ6ICdraW5kJyxcbiAgbGFiZWw6ICdsYWJlbCcsXG4gIGxhbmc6ICdsYW5nJyxcbiAgbGlzdDogJ2xpc3QnLFxuICBsb29wOiAnbG9vcCcsXG4gIGxvdzogJ2xvdycsXG4gIG1hbmlmZXN0OiAnbWFuaWZlc3QnLFxuICBtYXJnaW53aWR0aDogJ21hcmdpbldpZHRoJyxcbiAgbWFyZ2luaGVpZ2h0OiAnbWFyZ2luSGVpZ2h0JyxcbiAgbWF4OiAnbWF4JyxcbiAgbWF4bGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgbWVkaWE6ICdtZWRpYScsXG4gIG1lZGlhZ3JvdXA6ICdtZWRpYUdyb3VwJyxcbiAgbWV0aG9kOiAnbWV0aG9kJyxcbiAgbWluOiAnbWluJyxcbiAgbWlubGVuZ3RoOiAnbWluTGVuZ3RoJyxcbiAgbXVsdGlwbGU6ICdtdWx0aXBsZScsXG4gIG11dGVkOiAnbXV0ZWQnLFxuICBuYW1lOiAnbmFtZScsXG4gIG5vbW9kdWxlOiAnbm9Nb2R1bGUnLFxuICBub25jZTogJ25vbmNlJyxcbiAgbm92YWxpZGF0ZTogJ25vVmFsaWRhdGUnLFxuICBvcGVuOiAnb3BlbicsXG4gIG9wdGltdW06ICdvcHRpbXVtJyxcbiAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICBwbGFjZWhvbGRlcjogJ3BsYWNlaG9sZGVyJyxcbiAgcGxheXNpbmxpbmU6ICdwbGF5c0lubGluZScsXG4gIHBvc3RlcjogJ3Bvc3RlcicsXG4gIHByZWxvYWQ6ICdwcmVsb2FkJyxcbiAgcHJvZmlsZTogJ3Byb2ZpbGUnLFxuICByYWRpb2dyb3VwOiAncmFkaW9Hcm91cCcsXG4gIHJlYWRvbmx5OiAncmVhZE9ubHknLFxuICByZWZlcnJlcnBvbGljeTogJ3JlZmVycmVyUG9saWN5JyxcbiAgcmVsOiAncmVsJyxcbiAgcmVxdWlyZWQ6ICdyZXF1aXJlZCcsXG4gIHJldmVyc2VkOiAncmV2ZXJzZWQnLFxuICByb2xlOiAncm9sZScsXG4gIHJvd3M6ICdyb3dzJyxcbiAgcm93c3BhbjogJ3Jvd1NwYW4nLFxuICBzYW5kYm94OiAnc2FuZGJveCcsXG4gIHNjb3BlOiAnc2NvcGUnLFxuICBzY29wZWQ6ICdzY29wZWQnLFxuICBzY3JvbGxpbmc6ICdzY3JvbGxpbmcnLFxuICBzZWFtbGVzczogJ3NlYW1sZXNzJyxcbiAgc2VsZWN0ZWQ6ICdzZWxlY3RlZCcsXG4gIHNoYXBlOiAnc2hhcGUnLFxuICBzaXplOiAnc2l6ZScsXG4gIHNpemVzOiAnc2l6ZXMnLFxuICBzcGFuOiAnc3BhbicsXG4gIHNwZWxsY2hlY2s6ICdzcGVsbENoZWNrJyxcbiAgc3JjOiAnc3JjJyxcbiAgc3JjZG9jOiAnc3JjRG9jJyxcbiAgc3JjbGFuZzogJ3NyY0xhbmcnLFxuICBzcmNzZXQ6ICdzcmNTZXQnLFxuICBzdGFydDogJ3N0YXJ0JyxcbiAgc3RlcDogJ3N0ZXAnLFxuICBzdHlsZTogJ3N0eWxlJyxcbiAgc3VtbWFyeTogJ3N1bW1hcnknLFxuICB0YWJpbmRleDogJ3RhYkluZGV4JyxcbiAgdGFyZ2V0OiAndGFyZ2V0JyxcbiAgdGl0bGU6ICd0aXRsZScsXG4gIHR5cGU6ICd0eXBlJyxcbiAgdXNlbWFwOiAndXNlTWFwJyxcbiAgdmFsdWU6ICd2YWx1ZScsXG4gIHdpZHRoOiAnd2lkdGgnLFxuICB3bW9kZTogJ3dtb2RlJyxcbiAgd3JhcDogJ3dyYXAnLFxuICAvLyBTVkdcbiAgYWJvdXQ6ICdhYm91dCcsXG4gIGFjY2VudGhlaWdodDogJ2FjY2VudEhlaWdodCcsXG4gICdhY2NlbnQtaGVpZ2h0JzogJ2FjY2VudEhlaWdodCcsXG4gIGFjY3VtdWxhdGU6ICdhY2N1bXVsYXRlJyxcbiAgYWRkaXRpdmU6ICdhZGRpdGl2ZScsXG4gIGFsaWdubWVudGJhc2VsaW5lOiAnYWxpZ25tZW50QmFzZWxpbmUnLFxuICAnYWxpZ25tZW50LWJhc2VsaW5lJzogJ2FsaWdubWVudEJhc2VsaW5lJyxcbiAgYWxsb3dyZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogJ2FscGhhYmV0aWMnLFxuICBhbXBsaXR1ZGU6ICdhbXBsaXR1ZGUnLFxuICBhcmFiaWNmb3JtOiAnYXJhYmljRm9ybScsXG4gICdhcmFiaWMtZm9ybSc6ICdhcmFiaWNGb3JtJyxcbiAgYXNjZW50OiAnYXNjZW50JyxcbiAgYXR0cmlidXRlbmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGV0eXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9yZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAnYXppbXV0aCcsXG4gIGJhc2VmcmVxdWVuY3k6ICdiYXNlRnJlcXVlbmN5JyxcbiAgYmFzZWxpbmVzaGlmdDogJ2Jhc2VsaW5lU2hpZnQnLFxuICAnYmFzZWxpbmUtc2hpZnQnOiAnYmFzZWxpbmVTaGlmdCcsXG4gIGJhc2Vwcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYm94OiAnYmJveCcsXG4gIGJlZ2luOiAnYmVnaW4nLFxuICBiaWFzOiAnYmlhcycsXG4gIGJ5OiAnYnknLFxuICBjYWxjbW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwaGVpZ2h0OiAnY2FwSGVpZ2h0JyxcbiAgJ2NhcC1oZWlnaHQnOiAnY2FwSGVpZ2h0JyxcbiAgY2xpcDogJ2NsaXAnLFxuICBjbGlwcGF0aDogJ2NsaXBQYXRoJyxcbiAgJ2NsaXAtcGF0aCc6ICdjbGlwUGF0aCcsXG4gIGNsaXBwYXRodW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY2xpcHJ1bGU6ICdjbGlwUnVsZScsXG4gICdjbGlwLXJ1bGUnOiAnY2xpcFJ1bGUnLFxuICBjb2xvcjogJ2NvbG9yJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgJ2NvbG9yLWludGVycG9sYXRpb24nOiAnY29sb3JJbnRlcnBvbGF0aW9uJyxcbiAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJzogJ2NvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMnLFxuICBjb2xvcnByb2ZpbGU6ICdjb2xvclByb2ZpbGUnLFxuICAnY29sb3ItcHJvZmlsZSc6ICdjb2xvclByb2ZpbGUnLFxuICBjb2xvcnJlbmRlcmluZzogJ2NvbG9yUmVuZGVyaW5nJyxcbiAgJ2NvbG9yLXJlbmRlcmluZyc6ICdjb2xvclJlbmRlcmluZycsXG4gIGNvbnRlbnRzY3JpcHR0eXBlOiAnY29udGVudFNjcmlwdFR5cGUnLFxuICBjb250ZW50c3R5bGV0eXBlOiAnY29udGVudFN0eWxlVHlwZScsXG4gIGN1cnNvcjogJ2N1cnNvcicsXG4gIGN4OiAnY3gnLFxuICBjeTogJ2N5JyxcbiAgZDogJ2QnLFxuICBkYXRhdHlwZTogJ2RhdGF0eXBlJyxcbiAgZGVjZWxlcmF0ZTogJ2RlY2VsZXJhdGUnLFxuICBkZXNjZW50OiAnZGVzY2VudCcsXG4gIGRpZmZ1c2Vjb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogJ2RpcmVjdGlvbicsXG4gIGRpc3BsYXk6ICdkaXNwbGF5JyxcbiAgZGl2aXNvcjogJ2Rpdmlzb3InLFxuICBkb21pbmFudGJhc2VsaW5lOiAnZG9taW5hbnRCYXNlbGluZScsXG4gICdkb21pbmFudC1iYXNlbGluZSc6ICdkb21pbmFudEJhc2VsaW5lJyxcbiAgZHVyOiAnZHVyJyxcbiAgZHg6ICdkeCcsXG4gIGR5OiAnZHknLFxuICBlZGdlbW9kZTogJ2VkZ2VNb2RlJyxcbiAgZWxldmF0aW9uOiAnZWxldmF0aW9uJyxcbiAgZW5hYmxlYmFja2dyb3VuZDogJ2VuYWJsZUJhY2tncm91bmQnLFxuICAnZW5hYmxlLWJhY2tncm91bmQnOiAnZW5hYmxlQmFja2dyb3VuZCcsXG4gIGVuZDogJ2VuZCcsXG4gIGV4cG9uZW50OiAnZXhwb25lbnQnLFxuICBleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkOiAnZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCcsXG4gIGZpbGw6ICdmaWxsJyxcbiAgZmlsbG9wYWNpdHk6ICdmaWxsT3BhY2l0eScsXG4gICdmaWxsLW9wYWNpdHknOiAnZmlsbE9wYWNpdHknLFxuICBmaWxscnVsZTogJ2ZpbGxSdWxlJyxcbiAgJ2ZpbGwtcnVsZSc6ICdmaWxsUnVsZScsXG4gIGZpbHRlcjogJ2ZpbHRlcicsXG4gIGZpbHRlcnJlczogJ2ZpbHRlclJlcycsXG4gIGZpbHRlcnVuaXRzOiAnZmlsdGVyVW5pdHMnLFxuICBmbG9vZG9wYWNpdHk6ICdmbG9vZE9wYWNpdHknLFxuICAnZmxvb2Qtb3BhY2l0eSc6ICdmbG9vZE9wYWNpdHknLFxuICBmbG9vZGNvbG9yOiAnZmxvb2RDb2xvcicsXG4gICdmbG9vZC1jb2xvcic6ICdmbG9vZENvbG9yJyxcbiAgZm9jdXNhYmxlOiAnZm9jdXNhYmxlJyxcbiAgZm9udGZhbWlseTogJ2ZvbnRGYW1pbHknLFxuICAnZm9udC1mYW1pbHknOiAnZm9udEZhbWlseScsXG4gIGZvbnRzaXplOiAnZm9udFNpemUnLFxuICAnZm9udC1zaXplJzogJ2ZvbnRTaXplJyxcbiAgZm9udHNpemVhZGp1c3Q6ICdmb250U2l6ZUFkanVzdCcsXG4gICdmb250LXNpemUtYWRqdXN0JzogJ2ZvbnRTaXplQWRqdXN0JyxcbiAgZm9udHN0cmV0Y2g6ICdmb250U3RyZXRjaCcsXG4gICdmb250LXN0cmV0Y2gnOiAnZm9udFN0cmV0Y2gnLFxuICBmb250c3R5bGU6ICdmb250U3R5bGUnLFxuICAnZm9udC1zdHlsZSc6ICdmb250U3R5bGUnLFxuICBmb250dmFyaWFudDogJ2ZvbnRWYXJpYW50JyxcbiAgJ2ZvbnQtdmFyaWFudCc6ICdmb250VmFyaWFudCcsXG4gIGZvbnR3ZWlnaHQ6ICdmb250V2VpZ2h0JyxcbiAgJ2ZvbnQtd2VpZ2h0JzogJ2ZvbnRXZWlnaHQnLFxuICBmb3JtYXQ6ICdmb3JtYXQnLFxuICBmcm9tOiAnZnJvbScsXG4gIGZ4OiAnZngnLFxuICBmeTogJ2Z5JyxcbiAgZzE6ICdnMScsXG4gIGcyOiAnZzInLFxuICBnbHlwaG5hbWU6ICdnbHlwaE5hbWUnLFxuICAnZ2x5cGgtbmFtZSc6ICdnbHlwaE5hbWUnLFxuICBnbHlwaG9yaWVudGF0aW9uaG9yaXpvbnRhbDogJ2dseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsJyxcbiAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiAnZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWwnLFxuICBnbHlwaG9yaWVudGF0aW9udmVydGljYWw6ICdnbHlwaE9yaWVudGF0aW9uVmVydGljYWwnLFxuICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiAnZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsJyxcbiAgZ2x5cGhyZWY6ICdnbHlwaFJlZicsXG4gIGdyYWRpZW50dHJhbnNmb3JtOiAnZ3JhZGllbnRUcmFuc2Zvcm0nLFxuICBncmFkaWVudHVuaXRzOiAnZ3JhZGllbnRVbml0cycsXG4gIGhhbmdpbmc6ICdoYW5naW5nJyxcbiAgaG9yaXphZHZ4OiAnaG9yaXpBZHZYJyxcbiAgJ2hvcml6LWFkdi14JzogJ2hvcml6QWR2WCcsXG4gIGhvcml6b3JpZ2lueDogJ2hvcml6T3JpZ2luWCcsXG4gICdob3Jpei1vcmlnaW4teCc6ICdob3Jpek9yaWdpblgnLFxuICBpZGVvZ3JhcGhpYzogJ2lkZW9ncmFwaGljJyxcbiAgaW1hZ2VyZW5kZXJpbmc6ICdpbWFnZVJlbmRlcmluZycsXG4gICdpbWFnZS1yZW5kZXJpbmcnOiAnaW1hZ2VSZW5kZXJpbmcnLFxuICBpbjI6ICdpbjInLFxuICBpbjogJ2luJyxcbiAgaW5saXN0OiAnaW5saXN0JyxcbiAgaW50ZXJjZXB0OiAnaW50ZXJjZXB0JyxcbiAgazE6ICdrMScsXG4gIGsyOiAnazInLFxuICBrMzogJ2szJyxcbiAgazQ6ICdrNCcsXG4gIGs6ICdrJyxcbiAga2VybmVsbWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsdW5pdGxlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAna2VybmluZycsXG4gIGtleXBvaW50czogJ2tleVBvaW50cycsXG4gIGtleXNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5dGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aGFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlcnNwYWNpbmc6ICdsZXR0ZXJTcGFjaW5nJyxcbiAgJ2xldHRlci1zcGFjaW5nJzogJ2xldHRlclNwYWNpbmcnLFxuICBsaWdodGluZ2NvbG9yOiAnbGlnaHRpbmdDb2xvcicsXG4gICdsaWdodGluZy1jb2xvcic6ICdsaWdodGluZ0NvbG9yJyxcbiAgbGltaXRpbmdjb25lYW5nbGU6ICdsaW1pdGluZ0NvbmVBbmdsZScsXG4gIGxvY2FsOiAnbG9jYWwnLFxuICBtYXJrZXJlbmQ6ICdtYXJrZXJFbmQnLFxuICAnbWFya2VyLWVuZCc6ICdtYXJrZXJFbmQnLFxuICBtYXJrZXJoZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJtaWQ6ICdtYXJrZXJNaWQnLFxuICAnbWFya2VyLW1pZCc6ICdtYXJrZXJNaWQnLFxuICBtYXJrZXJzdGFydDogJ21hcmtlclN0YXJ0JyxcbiAgJ21hcmtlci1zdGFydCc6ICdtYXJrZXJTdGFydCcsXG4gIG1hcmtlcnVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJ3aWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogJ21hc2snLFxuICBtYXNrY29udGVudHVuaXRzOiAnbWFza0NvbnRlbnRVbml0cycsXG4gIG1hc2t1bml0czogJ21hc2tVbml0cycsXG4gIG1hdGhlbWF0aWNhbDogJ21hdGhlbWF0aWNhbCcsXG4gIG1vZGU6ICdtb2RlJyxcbiAgbnVtb2N0YXZlczogJ251bU9jdGF2ZXMnLFxuICBvZmZzZXQ6ICdvZmZzZXQnLFxuICBvcGFjaXR5OiAnb3BhY2l0eScsXG4gIG9wZXJhdG9yOiAnb3BlcmF0b3InLFxuICBvcmRlcjogJ29yZGVyJyxcbiAgb3JpZW50OiAnb3JpZW50JyxcbiAgb3JpZW50YXRpb246ICdvcmllbnRhdGlvbicsXG4gIG9yaWdpbjogJ29yaWdpbicsXG4gIG92ZXJmbG93OiAnb3ZlcmZsb3cnLFxuICBvdmVybGluZXBvc2l0aW9uOiAnb3ZlcmxpbmVQb3NpdGlvbicsXG4gICdvdmVybGluZS1wb3NpdGlvbic6ICdvdmVybGluZVBvc2l0aW9uJyxcbiAgb3ZlcmxpbmV0aGlja25lc3M6ICdvdmVybGluZVRoaWNrbmVzcycsXG4gICdvdmVybGluZS10aGlja25lc3MnOiAnb3ZlcmxpbmVUaGlja25lc3MnLFxuICBwYWludG9yZGVyOiAncGFpbnRPcmRlcicsXG4gICdwYWludC1vcmRlcic6ICdwYWludE9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZTEnLFxuICAncGFub3NlLTEnOiAncGFub3NlMScsXG4gIHBhdGhsZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybmNvbnRlbnR1bml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJudHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm51bml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJldmVudHM6ICdwb2ludGVyRXZlbnRzJyxcbiAgJ3BvaW50ZXItZXZlbnRzJzogJ3BvaW50ZXJFdmVudHMnLFxuICBwb2ludHM6ICdwb2ludHMnLFxuICBwb2ludHNhdHg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNhdHk6ICdwb2ludHNBdFknLFxuICBwb2ludHNhdHo6ICdwb2ludHNBdFonLFxuICBwcmVmaXg6ICdwcmVmaXgnLFxuICBwcmVzZXJ2ZWFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlYXNwZWN0cmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZldW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHByb3BlcnR5OiAncHJvcGVydHknLFxuICByOiAncicsXG4gIHJhZGl1czogJ3JhZGl1cycsXG4gIHJlZng6ICdyZWZYJyxcbiAgcmVmeTogJ3JlZlknLFxuICByZW5kZXJpbmdpbnRlbnQ6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICAncmVuZGVyaW5nLWludGVudCc6ICdyZW5kZXJpbmdJbnRlbnQnLFxuICByZXBlYXRjb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0ZHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRleHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRmZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXNvdXJjZTogJ3Jlc291cmNlJyxcbiAgcmVzdGFydDogJ3Jlc3RhcnQnLFxuICByZXN1bHQ6ICdyZXN1bHQnLFxuICByZXN1bHRzOiAncmVzdWx0cycsXG4gIHJvdGF0ZTogJ3JvdGF0ZScsXG4gIHJ4OiAncngnLFxuICByeTogJ3J5JyxcbiAgc2NhbGU6ICdzY2FsZScsXG4gIHNlY3VyaXR5OiAnc2VjdXJpdHknLFxuICBzZWVkOiAnc2VlZCcsXG4gIHNoYXBlcmVuZGVyaW5nOiAnc2hhcGVSZW5kZXJpbmcnLFxuICAnc2hhcGUtcmVuZGVyaW5nJzogJ3NoYXBlUmVuZGVyaW5nJyxcbiAgc2xvcGU6ICdzbG9wZScsXG4gIHNwYWNpbmc6ICdzcGFjaW5nJyxcbiAgc3BlY3VsYXJjb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhcmV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAnc3BlZWQnLFxuICBzcHJlYWRtZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydG9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkZGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6ICdzdGVtaCcsXG4gIHN0ZW12OiAnc3RlbXYnLFxuICBzdGl0Y2h0aWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcGNvbG9yOiAnc3RvcENvbG9yJyxcbiAgJ3N0b3AtY29sb3InOiAnc3RvcENvbG9yJyxcbiAgc3RvcG9wYWNpdHk6ICdzdG9wT3BhY2l0eScsXG4gICdzdG9wLW9wYWNpdHknOiAnc3RvcE9wYWNpdHknLFxuICBzdHJpa2V0aHJvdWdocG9zaXRpb246ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbic6ICdzdHJpa2V0aHJvdWdoUG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaFRoaWNrbmVzcycsXG4gICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyc6ICdzdHJpa2V0aHJvdWdoVGhpY2tuZXNzJyxcbiAgc3RyaW5nOiAnc3RyaW5nJyxcbiAgc3Ryb2tlOiAnc3Ryb2tlJyxcbiAgc3Ryb2tlZGFzaGFycmF5OiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgJ3N0cm9rZS1kYXNoYXJyYXknOiAnc3Ryb2tlRGFzaGFycmF5JyxcbiAgc3Ryb2tlZGFzaG9mZnNldDogJ3N0cm9rZURhc2hvZmZzZXQnLFxuICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAnc3Ryb2tlRGFzaG9mZnNldCcsXG4gIHN0cm9rZWxpbmVjYXA6ICdzdHJva2VMaW5lY2FwJyxcbiAgJ3N0cm9rZS1saW5lY2FwJzogJ3N0cm9rZUxpbmVjYXAnLFxuICBzdHJva2VsaW5lam9pbjogJ3N0cm9rZUxpbmVqb2luJyxcbiAgJ3N0cm9rZS1saW5lam9pbic6ICdzdHJva2VMaW5lam9pbicsXG4gIHN0cm9rZW1pdGVybGltaXQ6ICdzdHJva2VNaXRlcmxpbWl0JyxcbiAgJ3N0cm9rZS1taXRlcmxpbWl0JzogJ3N0cm9rZU1pdGVybGltaXQnLFxuICBzdHJva2V3aWR0aDogJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZS13aWR0aCc6ICdzdHJva2VXaWR0aCcsXG4gIHN0cm9rZW9wYWNpdHk6ICdzdHJva2VPcGFjaXR5JyxcbiAgJ3N0cm9rZS1vcGFjaXR5JzogJ3N0cm9rZU9wYWNpdHknLFxuICBzdXBwcmVzc2NvbnRlbnRlZGl0YWJsZXdhcm5pbmc6ICdzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcnLFxuICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6ICdzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcnLFxuICBzdXJmYWNlc2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1sYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGV2YWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldHg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0eTogJ3RhcmdldFknLFxuICB0ZXh0YW5jaG9yOiAndGV4dEFuY2hvcicsXG4gICd0ZXh0LWFuY2hvcic6ICd0ZXh0QW5jaG9yJyxcbiAgdGV4dGRlY29yYXRpb246ICd0ZXh0RGVjb3JhdGlvbicsXG4gICd0ZXh0LWRlY29yYXRpb24nOiAndGV4dERlY29yYXRpb24nLFxuICB0ZXh0bGVuZ3RoOiAndGV4dExlbmd0aCcsXG4gIHRleHRyZW5kZXJpbmc6ICd0ZXh0UmVuZGVyaW5nJyxcbiAgJ3RleHQtcmVuZGVyaW5nJzogJ3RleHRSZW5kZXJpbmcnLFxuICB0bzogJ3RvJyxcbiAgdHJhbnNmb3JtOiAndHJhbnNmb3JtJyxcbiAgdHlwZW9mOiAndHlwZW9mJyxcbiAgdTE6ICd1MScsXG4gIHUyOiAndTInLFxuICB1bmRlcmxpbmVwb3NpdGlvbjogJ3VuZGVybGluZVBvc2l0aW9uJyxcbiAgJ3VuZGVybGluZS1wb3NpdGlvbic6ICd1bmRlcmxpbmVQb3NpdGlvbicsXG4gIHVuZGVybGluZXRoaWNrbmVzczogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogJ3VuZGVybGluZVRoaWNrbmVzcycsXG4gIHVuaWNvZGU6ICd1bmljb2RlJyxcbiAgdW5pY29kZWJpZGk6ICd1bmljb2RlQmlkaScsXG4gICd1bmljb2RlLWJpZGknOiAndW5pY29kZUJpZGknLFxuICB1bmljb2RlcmFuZ2U6ICd1bmljb2RlUmFuZ2UnLFxuICAndW5pY29kZS1yYW5nZSc6ICd1bmljb2RlUmFuZ2UnLFxuICB1bml0c3BlcmVtOiAndW5pdHNQZXJFbScsXG4gICd1bml0cy1wZXItZW0nOiAndW5pdHNQZXJFbScsXG4gIHVuc2VsZWN0YWJsZTogJ3Vuc2VsZWN0YWJsZScsXG4gIHZhbHBoYWJldGljOiAndkFscGhhYmV0aWMnLFxuICAndi1hbHBoYWJldGljJzogJ3ZBbHBoYWJldGljJyxcbiAgdmFsdWVzOiAndmFsdWVzJyxcbiAgdmVjdG9yZWZmZWN0OiAndmVjdG9yRWZmZWN0JyxcbiAgJ3ZlY3Rvci1lZmZlY3QnOiAndmVjdG9yRWZmZWN0JyxcbiAgdmVyc2lvbjogJ3ZlcnNpb24nLFxuICB2ZXJ0YWR2eTogJ3ZlcnRBZHZZJyxcbiAgJ3ZlcnQtYWR2LXknOiAndmVydEFkdlknLFxuICB2ZXJ0b3JpZ2lueDogJ3ZlcnRPcmlnaW5YJyxcbiAgJ3ZlcnQtb3JpZ2luLXgnOiAndmVydE9yaWdpblgnLFxuICB2ZXJ0b3JpZ2lueTogJ3ZlcnRPcmlnaW5ZJyxcbiAgJ3ZlcnQtb3JpZ2luLXknOiAndmVydE9yaWdpblknLFxuICB2aGFuZ2luZzogJ3ZIYW5naW5nJyxcbiAgJ3YtaGFuZ2luZyc6ICd2SGFuZ2luZycsXG4gIHZpZGVvZ3JhcGhpYzogJ3ZJZGVvZ3JhcGhpYycsXG4gICd2LWlkZW9ncmFwaGljJzogJ3ZJZGVvZ3JhcGhpYycsXG4gIHZpZXdib3g6ICd2aWV3Qm94JyxcbiAgdmlld3RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAndmlzaWJpbGl0eScsXG4gIHZtYXRoZW1hdGljYWw6ICd2TWF0aGVtYXRpY2FsJyxcbiAgJ3YtbWF0aGVtYXRpY2FsJzogJ3ZNYXRoZW1hdGljYWwnLFxuICB2b2NhYjogJ3ZvY2FiJyxcbiAgd2lkdGhzOiAnd2lkdGhzJyxcbiAgd29yZHNwYWNpbmc6ICd3b3JkU3BhY2luZycsXG4gICd3b3JkLXNwYWNpbmcnOiAnd29yZFNwYWNpbmcnLFxuICB3cml0aW5nbW9kZTogJ3dyaXRpbmdNb2RlJyxcbiAgJ3dyaXRpbmctbW9kZSc6ICd3cml0aW5nTW9kZScsXG4gIHgxOiAneDEnLFxuICB4MjogJ3gyJyxcbiAgeDogJ3gnLFxuICB4Y2hhbm5lbHNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhoZWlnaHQ6ICd4SGVpZ2h0JyxcbiAgJ3gtaGVpZ2h0JzogJ3hIZWlnaHQnLFxuICB4bGlua2FjdHVhdGU6ICd4bGlua0FjdHVhdGUnLFxuICAneGxpbms6YWN0dWF0ZSc6ICd4bGlua0FjdHVhdGUnLFxuICB4bGlua2FyY3JvbGU6ICd4bGlua0FyY3JvbGUnLFxuICAneGxpbms6YXJjcm9sZSc6ICd4bGlua0FyY3JvbGUnLFxuICB4bGlua2hyZWY6ICd4bGlua0hyZWYnLFxuICAneGxpbms6aHJlZic6ICd4bGlua0hyZWYnLFxuICB4bGlua3JvbGU6ICd4bGlua1JvbGUnLFxuICAneGxpbms6cm9sZSc6ICd4bGlua1JvbGUnLFxuICB4bGlua3Nob3c6ICd4bGlua1Nob3cnLFxuICAneGxpbms6c2hvdyc6ICd4bGlua1Nob3cnLFxuICB4bGlua3RpdGxlOiAneGxpbmtUaXRsZScsXG4gICd4bGluazp0aXRsZSc6ICd4bGlua1RpdGxlJyxcbiAgeGxpbmt0eXBlOiAneGxpbmtUeXBlJyxcbiAgJ3hsaW5rOnR5cGUnOiAneGxpbmtUeXBlJyxcbiAgeG1sYmFzZTogJ3htbEJhc2UnLFxuICAneG1sOmJhc2UnOiAneG1sQmFzZScsXG4gIHhtbGxhbmc6ICd4bWxMYW5nJyxcbiAgJ3htbDpsYW5nJzogJ3htbExhbmcnLFxuICB4bWxuczogJ3htbG5zJyxcbiAgJ3htbDpzcGFjZSc6ICd4bWxTcGFjZScsXG4gIHhtbG5zeGxpbms6ICd4bWxuc1hsaW5rJyxcbiAgJ3htbG5zOnhsaW5rJzogJ3htbG5zWGxpbmsnLFxuICB4bWxzcGFjZTogJ3htbFNwYWNlJyxcbiAgeTE6ICd5MScsXG4gIHkyOiAneTInLFxuICB5OiAneScsXG4gIHljaGFubmVsc2VsZWN0b3I6ICd5Q2hhbm5lbFNlbGVjdG9yJyxcbiAgejogJ3onLFxuICB6b29tYW5kcGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBhcmlhUHJvcGVydGllcyA9IHtcbiAgJ2FyaWEtY3VycmVudCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWRldGFpbHMnOiAwLFxuICAnYXJpYS1kaXNhYmxlZCc6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWhpZGRlbic6IDAsXG4gIC8vIHN0YXRlXG4gICdhcmlhLWludmFsaWQnOiAwLFxuICAvLyBzdGF0ZVxuICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAnYXJpYS1sYWJlbCc6IDAsXG4gICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICdhcmlhLWF1dG9jb21wbGV0ZSc6IDAsXG4gICdhcmlhLWNoZWNrZWQnOiAwLFxuICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICdhcmlhLWhhc3BvcHVwJzogMCxcbiAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAnYXJpYS1tb2RhbCc6IDAsXG4gICdhcmlhLW11bHRpbGluZSc6IDAsXG4gICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgJ2FyaWEtcGxhY2Vob2xkZXInOiAwLFxuICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAnYXJpYS1yZXF1aXJlZCc6IDAsXG4gICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgJ2FyaWEtc29ydCc6IDAsXG4gICdhcmlhLXZhbHVlbWF4JzogMCxcbiAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICdhcmlhLXZhbHVldGV4dCc6IDAsXG4gIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgJ2FyaWEtYXRvbWljJzogMCxcbiAgJ2FyaWEtYnVzeSc6IDAsXG4gICdhcmlhLWxpdmUnOiAwLFxuICAnYXJpYS1yZWxldmFudCc6IDAsXG4gIC8vIERyYWctYW5kLURyb3AgQXR0cmlidXRlc1xuICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gIC8vIFJlbGF0aW9uc2hpcCBBdHRyaWJ1dGVzXG4gICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICdhcmlhLWNvbGluZGV4JzogMCxcbiAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgJ2FyaWEtZGVzY3JpYmVkYnknOiAwLFxuICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAnYXJpYS1mbG93dG8nOiAwLFxuICAnYXJpYS1sYWJlbGxlZGJ5JzogMCxcbiAgJ2FyaWEtb3ducyc6IDAsXG4gICdhcmlhLXBvc2luc2V0JzogMCxcbiAgJ2FyaWEtcm93Y291bnQnOiAwLFxuICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICdhcmlhLXJvd3NwYW4nOiAwLFxuICAnYXJpYS1zZXRzaXplJzogMFxufTtcblxudmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcbnZhciByQVJJQSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIHJBUklBQ2FtZWwgPSBuZXcgUmVnRXhwKCdeKGFyaWEpW0EtWl1bJyArIEFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG52YXIgaGFzT3duUHJvcGVydHkkMSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSkge1xuICB7XG4gICAgaWYgKGhhc093blByb3BlcnR5JDEuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAockFSSUFDYW1lbC50ZXN0KG5hbWUpKSB7XG4gICAgICB2YXIgYXJpYU5hbWUgPSAnYXJpYS0nICsgbmFtZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIGNvcnJlY3ROYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoYXJpYU5hbWUpID8gYXJpYU5hbWUgOiBudWxsOyAvLyBJZiB0aGlzIGlzIGFuIGFyaWEtKiBhdHRyaWJ1dGUsIGJ1dCBpcyBub3QgbGlzdGVkIGluIHRoZSBrbm93biBET01cbiAgICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cblxuICAgICAgaWYgKGNvcnJlY3ROYW1lID09IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgQVJJQSBhdHRyaWJ1dGUgYCVzYC4gQVJJQSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgcGF0dGVybiBhcmlhLSogYW5kIG11c3QgYmUgbG93ZXJjYXNlLicsIG5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IGNvcnJlY3ROYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIEFSSUEgYXR0cmlidXRlIGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgPycsIG5hbWUsIGNvcnJlY3ROYW1lKTtcblxuICAgICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJBUklBLnRlc3QobmFtZSkpIHtcbiAgICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBhcmlhUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBsb3dlckNhc2VkTmFtZSA6IG51bGw7IC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gLy8gYXJpYS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb24uXG5cblxuICAgICAgaWYgKG5hbWUgIT09IHN0YW5kYXJkTmFtZSkge1xuICAgICAgICBlcnJvcignVW5rbm93biBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHModHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBwcm9wcykge1xuICAgICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtYXJpYS1wcm9wcycsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKSB7XG4gIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyh0eXBlLCBwcm9wcyk7XG59XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcykge1xuICB7XG4gICAgaWYgKHR5cGUgIT09ICdpbnB1dCcgJiYgdHlwZSAhPT0gJ3RleHRhcmVhJyAmJiB0eXBlICE9PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wcyAhPSBudWxsICYmIHByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGUgPT09ICdzZWxlY3QnICYmIHByb3BzLm11bHRpcGxlKSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgJyArICd0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgIGZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4nLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBjb21wb25lbnQgb3IgYHVuZGVmaW5lZGAgJyArICdmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciB2YWxpZGF0ZVByb3BlcnR5JDEgPSBmdW5jdGlvbiAoKSB7fTtcblxue1xuICB2YXIgd2FybmVkUHJvcGVydGllcyQxID0ge307XG4gIHZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgRVZFTlRfTkFNRV9SRUdFWCA9IC9eb24uLztcbiAgdmFyIElOVkFMSURfRVZFTlRfTkFNRV9SRUdFWCA9IC9eb25bXkEtWl0vO1xuICB2YXIgckFSSUEkMSA9IG5ldyBSZWdFeHAoJ14oYXJpYSktWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuICB2YXIgckFSSUFDYW1lbCQxID0gbmV3IFJlZ0V4cCgnXihhcmlhKVtBLVpdWycgKyBBVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xuXG4gIHZhbGlkYXRlUHJvcGVydHkkMSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCB2YWx1ZSwgZXZlbnRSZWdpc3RyeSkge1xuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKGxvd2VyQ2FzZWROYW1lID09PSAnb25mb2N1c2luJyB8fCBsb3dlckNhc2VkTmFtZSA9PT0gJ29uZm9jdXNvdXQnKSB7XG4gICAgICBlcnJvcignUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gLy8gV2UgY2FuJ3QgcmVseSBvbiB0aGUgZXZlbnQgc3lzdGVtIGJlaW5nIGluamVjdGVkIG9uIHRoZSBzZXJ2ZXIuXG5cblxuICAgIGlmIChldmVudFJlZ2lzdHJ5ICE9IG51bGwpIHtcbiAgICAgIHZhciByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0gZXZlbnRSZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVnaXN0cmF0aW9uTmFtZSA9IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/JywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBJdCB3aWxsIGJlIGlnbm9yZWQuJywgbmFtZSk7XG5cbiAgICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgIC8vIElmIG5vIGV2ZW50IHBsdWdpbnMgaGF2ZSBiZWVuIGluamVjdGVkLCB3ZSBhcmUgaW4gYSBzZXJ2ZXIgZW52aXJvbm1lbnQuXG4gICAgICAvLyBTbyB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBldmVudCBuYW1lIGlzIGNvcnJlY3QgZm9yIHN1cmUsIGJ1dCB3ZSBjYW4gZmlsdGVyXG4gICAgICAvLyBvdXQga25vd24gYmFkIG9uZXMgbGlrZSBgb25jbGlja2AuIFdlIGNhbid0IHN1Z2dlc3QgYSBzcGVjaWZpYyByZXBsYWNlbWVudCB0aG91Z2guXG4gICAgICBpZiAoSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpIHtcbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiAnICsgJ1JlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLicsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBMZXQgdGhlIEFSSUEgYXR0cmlidXRlIGhvb2sgdmFsaWRhdGUgQVJJQSBhdHRyaWJ1dGVzXG5cblxuICAgIGlmIChyQVJJQSQxLnRlc3QobmFtZSkgfHwgckFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lubmVyaHRtbCcpIHtcbiAgICAgIGVycm9yKCdEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIGxvb2t1cCBkb2N1bWVudGF0aW9uIG9uIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJyk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobG93ZXJDYXNlZE5hbWUgPT09ICdhcmlhJykge1xuICAgICAgZXJyb3IoJ1RoZSBgYXJpYWAgYXR0cmlidXRlIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlIGluIFJlYWN0LiAnICsgJ1Bhc3MgaW5kaXZpZHVhbCBgYXJpYS1gIGF0dHJpYnV0ZXMgaW5zdGVhZC4nKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChsb3dlckNhc2VkTmFtZSA9PT0gJ2lzJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhIGAlc2AgZm9yIGEgc3RyaW5nIGF0dHJpYnV0ZSBgaXNgLiBJZiB0aGlzIGlzIGV4cGVjdGVkLCBjYXN0ICcgKyAndGhlIHZhbHVlIHRvIGEgc3RyaW5nLicsIHR5cGVvZiB2YWx1ZSk7XG5cbiAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCAnICsgJ3RoZSB2YWx1ZSB0byBhIHN0cmluZy4nLCBuYW1lKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8obmFtZSk7XG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBwcm9wZXJ0eUluZm8gIT09IG51bGwgJiYgcHJvcGVydHlJbmZvLnR5cGUgPT09IFJFU0VSVkVEOyAvLyBLbm93biBhdHRyaWJ1dGVzIHNob3VsZCBtYXRjaCB0aGUgY2FzaW5nIHNwZWNpZmllZCBpbiB0aGUgcHJvcGVydHkgY29uZmlnLlxuXG4gICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgIHZhciBzdGFuZGFyZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdO1xuXG4gICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBuYW1lKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIERPTSBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD8nLCBuYW1lLCBzdGFuZGFyZE5hbWUpO1xuXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWlzUmVzZXJ2ZWQgJiYgbmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpIHtcbiAgICAgIC8vIFVua25vd24gYXR0cmlidXRlcyBzaG91bGQgaGF2ZSBsb3dlcmNhc2UgY2FzaW5nIHNpbmNlIHRoYXQncyBob3cgdGhleVxuICAgICAgLy8gd2lsbCBiZSBjYXNlZCBhbnl3YXkgd2l0aCBzZXJ2ZXIgcmVuZGVyaW5nLlxuICAgICAgZXJyb3IoJ1JlYWN0IGRvZXMgbm90IHJlY29nbml6ZSB0aGUgYCVzYCBwcm9wIG9uIGEgRE9NIGVsZW1lbnQuIElmIHlvdSAnICsgJ2ludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSAnICsgJ2F0dHJpYnV0ZSwgc3BlbGwgaXQgYXMgbG93ZXJjYXNlIGAlc2AgaW5zdGVhZC4gJyArICdJZiB5b3UgYWNjaWRlbnRhbGx5IHBhc3NlZCBpdCBmcm9tIGEgcGFyZW50IGNvbXBvbmVudCwgcmVtb3ZlICcgKyAnaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuJywgbmFtZSwgbG93ZXJDYXNlZE5hbWUpO1xuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nICYmIHNob3VsZFJlbW92ZUF0dHJpYnV0ZVdpdGhXYXJuaW5nKG5hbWUsIHZhbHVlLCBwcm9wZXJ0eUluZm8sIGZhbHNlKSkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJywgdmFsdWUsIG5hbWUsIG5hbWUsIHZhbHVlLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCdSZWNlaXZlZCBgJXNgIGZvciBhIG5vbi1ib29sZWFuIGF0dHJpYnV0ZSBgJXNgLlxcblxcbicgKyAnSWYgeW91IHdhbnQgdG8gd3JpdGUgaXQgdG8gdGhlIERPTSwgcGFzcyBhIHN0cmluZyBpbnN0ZWFkOiAnICsgJyVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuJyArICdJZiB5b3UgdXNlZCB0byBjb25kaXRpb25hbGx5IG9taXQgaXQgd2l0aCAlcz17Y29uZGl0aW9uICYmIHZhbHVlfSwgJyArICdwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC4nLCB2YWx1ZSwgbmFtZSwgbmFtZSwgdmFsdWUsIG5hbWUsIG5hbWUsIG5hbWUpO1xuICAgICAgfVxuXG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBOb3cgdGhhdCB3ZSd2ZSB2YWxpZGF0ZWQgY2FzaW5nLCBkbyBub3QgdmFsaWRhdGVcbiAgICAvLyBkYXRhIHR5cGVzIGZvciByZXNlcnZlZCBwcm9wc1xuXG5cbiAgICBpZiAoaXNSZXNlcnZlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSAvLyBXYXJuIHdoZW4gYSBrbm93biBhdHRyaWJ1dGUgaXMgYSBiYWQgdHlwZVxuXG5cbiAgICBpZiAoc2hvdWxkUmVtb3ZlQXR0cmlidXRlV2l0aFdhcm5pbmcobmFtZSwgdmFsdWUsIHByb3BlcnR5SW5mbywgZmFsc2UpKSB7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gV2FybiB3aGVuIHBhc3NpbmcgdGhlIHN0cmluZ3MgJ2ZhbHNlJyBvciAndHJ1ZScgaW50byBhIGJvb2xlYW4gcHJvcFxuXG5cbiAgICBpZiAoKHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlID09PSAndHJ1ZScpICYmIHByb3BlcnR5SW5mbyAhPT0gbnVsbCAmJiBwcm9wZXJ0eUluZm8udHlwZSA9PT0gQk9PTEVBTikge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIHRoZSBzdHJpbmcgYCVzYCBmb3IgdGhlIGJvb2xlYW4gYXR0cmlidXRlIGAlc2AuICcgKyAnJXMgJyArICdEaWQgeW91IG1lYW4gJXM9eyVzfT8nLCB2YWx1ZSwgbmFtZSwgdmFsdWUgPT09ICdmYWxzZScgPyAnVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuJyA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsIG5hbWUsIHZhbHVlKTtcblxuICAgICAgd2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG52YXIgd2FyblVua25vd25Qcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gIHtcbiAgICB2YXIgdW5rbm93blByb3BzID0gW107XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eSQxKHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSk7XG5cbiAgICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB1bmtub3duUHJvcFN0cmluZyA9IHVua25vd25Qcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICAgIH0pLmpvaW4oJywgJyk7XG5cbiAgICBpZiAodW5rbm93blByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgZXJyb3IoJ0ludmFsaWQgdmFsdWUgZm9yIHByb3AgJXMgb24gPCVzPiB0YWcuIEVpdGhlciByZW1vdmUgaXQgZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIGl0IGluIHRoZSBET00uICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yICcsIHVua25vd25Qcm9wU3RyaW5nLCB0eXBlKTtcbiAgICB9IGVsc2UgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgICBlcnJvcignSW52YWxpZCB2YWx1ZXMgZm9yIHByb3BzICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZWxlbWVudCwgJyArICdvciBwYXNzIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZSB0byBrZWVwIHRoZW0gaW4gdGhlIERPTS4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9hdHRyaWJ1dGUtYmVoYXZpb3IgJywgdW5rbm93blByb3BTdHJpbmcsIHR5cGUpO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIGV2ZW50UmVnaXN0cnkpIHtcbiAgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHR5cGUsIHByb3BzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG59XG5cbnZhciBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSA9IDE7XG52YXIgSVNfTk9OX0RFTEVHQVRFRCA9IDEgPDwgMTtcbnZhciBJU19DQVBUVVJFX1BIQVNFID0gMSA8PCAyO1xudmFyIElTX1JFUExBWUVEID0gMSA8PCA0O1xuLy8gc2V0IHRvIExFR0FDWV9GQl9TVVBQT1JULiBMRUdBQ1lfRkJfU1VQUE9SVCBvbmx5IGdldHMgc2V0IHdoZW5cbi8vIHdlIGNhbGwgd2lsbERlZmVyTGF0ZXJGb3JMZWdhY3lGQlN1cHBvcnQsIHRodXMgbm90IGJhaWxpbmcgb3V0XG4vLyB3aWxsIHJlc3VsdCBpbiBlbmRsZXNzIGN5Y2xlcyBsaWtlIGFuIGluZmluaXRlIGxvb3AuXG4vLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gZGVmZXIgZHVyaW5nIGV2ZW50IHJlcGxheWluZy5cblxudmFyIFNIT1VMRF9OT1RfUFJPQ0VTU19QT0xZRklMTF9FVkVOVF9QTFVHSU5TID0gSVNfRVZFTlRfSEFORExFX05PTl9NQU5BR0VEX05PREUgfCBJU19OT05fREVMRUdBVEVEIHwgSVNfQ0FQVFVSRV9QSEFTRTtcblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICAvLyBGYWxsYmFjayB0byBuYXRpdmVFdmVudC5zcmNFbGVtZW50IGZvciBJRTlcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjUwNlxuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93OyAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG5cbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfSAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuXG5cbiAgcmV0dXJuIHRhcmdldC5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbnZhciByZXN0b3JlSW1wbCA9IG51bGw7XG52YXIgcmVzdG9yZVRhcmdldCA9IG51bGw7XG52YXIgcmVzdG9yZVF1ZXVlID0gbnVsbDtcblxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gIC8vIFdlIHBlcmZvcm0gdGhpcyB0cmFuc2xhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBsb29wIHNvIHRoYXQgd2VcbiAgLy8gYWx3YXlzIHJlY2VpdmUgdGhlIGNvcnJlY3QgZmliZXIgaGVyZVxuICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcblxuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAvLyBVbm1vdW50ZWRcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0eXBlb2YgcmVzdG9yZUltcGwgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0UmVzdG9yZUltcGxlbWVudGF0aW9uKCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGhhbmRsZSBhIHRhcmdldCBmb3IgY29udHJvbGxlZCBldmVudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGVOb2RlID0gaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGU7IC8vIEd1YXJkIGFnYWluc3QgRmliZXIgYmVpbmcgdW5tb3VudGVkLlxuXG4gIGlmIChzdGF0ZU5vZGUpIHtcbiAgICB2YXIgX3Byb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gICAgcmVzdG9yZUltcGwoaW50ZXJuYWxJbnN0YW5jZS5zdGF0ZU5vZGUsIGludGVybmFsSW5zdGFuY2UudHlwZSwgX3Byb3BzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzZXRSZXN0b3JlSW1wbGVtZW50YXRpb24oaW1wbCkge1xuICByZXN0b3JlSW1wbCA9IGltcGw7XG59XG5mdW5jdGlvbiBlbnF1ZXVlU3RhdGVSZXN0b3JlKHRhcmdldCkge1xuICBpZiAocmVzdG9yZVRhcmdldCkge1xuICAgIGlmIChyZXN0b3JlUXVldWUpIHtcbiAgICAgIHJlc3RvcmVRdWV1ZS5wdXNoKHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3RvcmVRdWV1ZSA9IFt0YXJnZXRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN0b3JlVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG59XG5mdW5jdGlvbiBuZWVkc1N0YXRlUmVzdG9yZSgpIHtcbiAgcmV0dXJuIHJlc3RvcmVUYXJnZXQgIT09IG51bGwgfHwgcmVzdG9yZVF1ZXVlICE9PSBudWxsO1xufVxuZnVuY3Rpb24gcmVzdG9yZVN0YXRlSWZOZWVkZWQoKSB7XG4gIGlmICghcmVzdG9yZVRhcmdldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0YXJnZXQgPSByZXN0b3JlVGFyZ2V0O1xuICB2YXIgcXVldWVkVGFyZ2V0cyA9IHJlc3RvcmVRdWV1ZTtcbiAgcmVzdG9yZVRhcmdldCA9IG51bGw7XG4gIHJlc3RvcmVRdWV1ZSA9IG51bGw7XG4gIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHRhcmdldCk7XG5cbiAgaWYgKHF1ZXVlZFRhcmdldHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZFRhcmdldHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KHF1ZXVlZFRhcmdldHNbaV0pO1xuICAgIH1cbiAgfVxufVxuXG4vLyB0aGUgcmVuZGVyZXIuIFN1Y2ggYXMgd2hlbiB3ZSdyZSBkaXNwYXRjaGluZyBldmVudHMgb3IgaWYgdGhpcmQgcGFydHlcbi8vIGxpYnJhcmllcyBuZWVkIHRvIGNhbGwgYmF0Y2hlZFVwZGF0ZXMuIEV2ZW50dWFsbHksIHRoaXMgQVBJIHdpbGwgZ28gYXdheSB3aGVuXG4vLyBldmVyeXRoaW5nIGlzIGJhdGNoZWQgYnkgZGVmYXVsdC4gV2UnbGwgdGhlbiBoYXZlIGEgc2ltaWxhciBBUEkgdG8gb3B0LW91dCBvZlxuLy8gc2NoZWR1bGVkIHdvcmsgYW5kIGluc3RlYWQgZG8gc3luY2hyb25vdXMgd29yay5cbi8vIERlZmF1bHRzXG5cbnZhciBiYXRjaGVkVXBkYXRlc0ltcGwgPSBmdW5jdGlvbiAoZm4sIGJvb2trZWVwaW5nKSB7XG4gIHJldHVybiBmbihib29ra2VlcGluZyk7XG59O1xuXG52YXIgZGlzY3JldGVVcGRhdGVzSW1wbCA9IGZ1bmN0aW9uIChmbiwgYSwgYiwgYywgZCkge1xuICByZXR1cm4gZm4oYSwgYiwgYywgZCk7XG59O1xuXG52YXIgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJbXBsID0gZnVuY3Rpb24gKCkge307XG5cbnZhciBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCA9IGJhdGNoZWRVcGRhdGVzSW1wbDtcbnZhciBpc0luc2lkZUV2ZW50SGFuZGxlciA9IGZhbHNlO1xudmFyIGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMgPSBmYWxzZTtcblxuZnVuY3Rpb24gZmluaXNoRXZlbnRIYW5kbGVyKCkge1xuICAvLyBIZXJlIHdlIHdhaXQgdW50aWwgYWxsIHVwZGF0ZXMgaGF2ZSBwcm9wYWdhdGVkLCB3aGljaCBpcyBpbXBvcnRhbnRcbiAgLy8gd2hlbiB1c2luZyBjb250cm9sbGVkIGNvbXBvbmVudHMgd2l0aGluIGxheWVyczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjk4XG4gIC8vIFRoZW4gd2UgcmVzdG9yZSBzdGF0ZSBvZiBhbnkgY29udHJvbGxlZCBjb21wb25lbnQuXG4gIHZhciBjb250cm9sbGVkQ29tcG9uZW50c0hhdmVQZW5kaW5nVXBkYXRlcyA9IG5lZWRzU3RhdGVSZXN0b3JlKCk7XG5cbiAgaWYgKGNvbnRyb2xsZWRDb21wb25lbnRzSGF2ZVBlbmRpbmdVcGRhdGVzKSB7XG4gICAgLy8gSWYgYSBjb250cm9sbGVkIGV2ZW50IHdhcyBmaXJlZCwgd2UgbWF5IG5lZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2ZcbiAgICAvLyB0aGUgRE9NIG5vZGUgYmFjayB0byB0aGUgY29udHJvbGxlZCB2YWx1ZS4gVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbiBSZWFjdFxuICAgIC8vIGJhaWxzIG91dCBvZiB0aGUgdXBkYXRlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIERPTS5cbiAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICByZXN0b3JlU3RhdGVJZk5lZWRlZCgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGZuLCBib29ra2VlcGluZykge1xuICBpZiAoaXNJbnNpZGVFdmVudEhhbmRsZXIpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYm9va2tlZXBpbmcpO1xuICB9XG5cbiAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhdGNoZWRVcGRhdGVzSW1wbChmbiwgYm9va2tlZXBpbmcpO1xuICB9IGZpbmFsbHkge1xuICAgIGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gZmFsc2U7XG4gICAgZmluaXNoRXZlbnRIYW5kbGVyKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGJhdGNoZWRFdmVudFVwZGF0ZXMoZm4sIGEsIGIpIHtcbiAgaWYgKGlzQmF0Y2hpbmdFdmVudFVwZGF0ZXMpIHtcbiAgICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGluc2lkZSBhbm90aGVyIGJhdGNoLCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgaXRcbiAgICAvLyBmdWxseSBjb21wbGV0ZXMgYmVmb3JlIHJlc3RvcmluZyBzdGF0ZS5cbiAgICByZXR1cm4gZm4oYSwgYik7XG4gIH1cblxuICBpc0JhdGNoaW5nRXZlbnRVcGRhdGVzID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIHJldHVybiBiYXRjaGVkRXZlbnRVcGRhdGVzSW1wbChmbiwgYSwgYik7XG4gIH0gZmluYWxseSB7XG4gICAgaXNCYXRjaGluZ0V2ZW50VXBkYXRlcyA9IGZhbHNlO1xuICAgIGZpbmlzaEV2ZW50SGFuZGxlcigpO1xuICB9XG59XG5mdW5jdGlvbiBkaXNjcmV0ZVVwZGF0ZXMoZm4sIGEsIGIsIGMsIGQpIHtcbiAgdmFyIHByZXZJc0luc2lkZUV2ZW50SGFuZGxlciA9IGlzSW5zaWRlRXZlbnRIYW5kbGVyO1xuICBpc0luc2lkZUV2ZW50SGFuZGxlciA9IHRydWU7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZGlzY3JldGVVcGRhdGVzSW1wbChmbiwgYSwgYiwgYywgZCk7XG4gIH0gZmluYWxseSB7XG4gICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSBwcmV2SXNJbnNpZGVFdmVudEhhbmRsZXI7XG5cbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmaW5pc2hFdmVudEhhbmRsZXIoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoRGlzY3JldGVVcGRhdGVzSWZOZWVkZWQodGltZVN0YW1wKSB7XG4gIHtcbiAgICBpZiAoIWlzSW5zaWRlRXZlbnRIYW5kbGVyKSB7XG4gICAgICBmbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oX2JhdGNoZWRVcGRhdGVzSW1wbCwgX2Rpc2NyZXRlVXBkYXRlc0ltcGwsIF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGwsIF9iYXRjaGVkRXZlbnRVcGRhdGVzSW1wbCkge1xuICBiYXRjaGVkVXBkYXRlc0ltcGwgPSBfYmF0Y2hlZFVwZGF0ZXNJbXBsO1xuICBkaXNjcmV0ZVVwZGF0ZXNJbXBsID0gX2Rpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGZsdXNoRGlzY3JldGVVcGRhdGVzSW1wbCA9IF9mbHVzaERpc2NyZXRlVXBkYXRlc0ltcGw7XG4gIGJhdGNoZWRFdmVudFVwZGF0ZXNJbXBsID0gX2JhdGNoZWRFdmVudFVwZGF0ZXNJbXBsO1xufVxuXG5mdW5jdGlvbiBpc0ludGVyYWN0aXZlKHRhZykge1xuICByZXR1cm4gdGFnID09PSAnYnV0dG9uJyB8fCB0YWcgPT09ICdpbnB1dCcgfHwgdGFnID09PSAnc2VsZWN0JyB8fCB0YWcgPT09ICd0ZXh0YXJlYSc7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KG5hbWUsIHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAobmFtZSkge1xuICAgIGNhc2UgJ29uQ2xpY2snOlxuICAgIGNhc2UgJ29uQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrJzpcbiAgICBjYXNlICdvbkRvdWJsZUNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZURvd24nOlxuICAgIGNhc2UgJ29uTW91c2VEb3duQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Nb3VzZVVwJzpcbiAgICBjYXNlICdvbk1vdXNlVXBDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRW50ZXInOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICB2YXIgc3RhdGVOb2RlID0gaW5zdC5zdGF0ZU5vZGU7XG5cbiAgaWYgKHN0YXRlTm9kZSA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MgKGV4OiBvbmxvYWQgZXZlbnRzIGluIGluY3JlbWVudGFsIG1vZGUpLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHByb3BzID0gZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZShzdGF0ZU5vZGUpO1xuXG4gIGlmIChwcm9wcyA9PT0gbnVsbCkge1xuICAgIC8vIFdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC50eXBlLCBwcm9wcykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghKCFsaXN0ZW5lciB8fCB0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgYFwiICsgcmVnaXN0cmF0aW9uTmFtZSArIFwiYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGBcIiArIHR5cGVvZiBsaXN0ZW5lciArIFwiYCB0eXBlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuXG52YXIgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTsgLy8gQ2hlY2sgaWYgYnJvd3NlciBzdXBwb3J0IGV2ZW50cyB3aXRoIHBhc3NpdmUgbGlzdGVuZXJzXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG5cbmlmIChjYW5Vc2VET00pIHtcbiAgdHJ5IHtcbiAgICB2YXIgb3B0aW9ucyA9IHt9OyAvLyAkRmxvd0ZpeE1lOiBJZ25vcmUgRmxvdyBjb21wbGFpbmluZyBhYm91dCBuZWVkaW5nIGEgdmFsdWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcHRpb25zLCAncGFzc2l2ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcGFzc2l2ZUJyb3dzZXJFdmVudHNTdXBwb3J0ZWQgPSBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kKG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICB0cnkge1xuICAgIGZ1bmMuYXBwbHkoY29udGV4dCwgZnVuY0FyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cbn1cblxudmFyIGludm9rZUd1YXJkZWRDYWxsYmFja0ltcGwgPSBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kO1xuXG57XG4gIC8vIEluIERFViBtb2RlLCB3ZSBzd2FwIG91dCBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgZm9yIGEgc3BlY2lhbCB2ZXJzaW9uXG4gIC8vIHRoYXQgcGxheXMgbW9yZSBuaWNlbHkgd2l0aCB0aGUgYnJvd3NlcidzIERldlRvb2xzLiBUaGUgaWRlYSBpcyB0byBwcmVzZXJ2ZVxuICAvLyBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvci4gQmVjYXVzZSBSZWFjdCB3cmFwcyBhbGwgdXNlci1wcm92aWRlZFxuICAvLyBmdW5jdGlvbnMgaW4gaW52b2tlR3VhcmRlZENhbGxiYWNrLCBhbmQgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiBvZlxuICAvLyBpbnZva2VHdWFyZGVkQ2FsbGJhY2sgdXNlcyBhIHRyeS1jYXRjaCwgYWxsIHVzZXIgZXhjZXB0aW9ucyBhcmUgdHJlYXRlZFxuICAvLyBsaWtlIGNhdWdodCBleGNlcHRpb25zLCBhbmQgdGhlIERldlRvb2xzIHdvbid0IHBhdXNlIHVubGVzcyB0aGUgZGV2ZWxvcGVyXG4gIC8vIHRha2VzIHRoZSBleHRyYSBzdGVwIG9mIGVuYWJsaW5nIHBhdXNlIG9uIGNhdWdodCBleGNlcHRpb25zLiBUaGlzIGlzXG4gIC8vIHVuaW50dWl0aXZlLCB0aG91Z2gsIGJlY2F1c2UgZXZlbiB0aG91Z2ggUmVhY3QgaGFzIGNhdWdodCB0aGUgZXJyb3IsIGZyb21cbiAgLy8gdGhlIGRldmVsb3BlcidzIHBlcnNwZWN0aXZlLCB0aGUgZXJyb3IgaXMgdW5jYXVnaHQuXG4gIC8vXG4gIC8vIFRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBcIlBhdXNlIG9uIGV4Y2VwdGlvbnNcIiBiZWhhdmlvciwgd2UgZG9uJ3QgdXNlIGFcbiAgLy8gdHJ5LWNhdGNoIGluIERFVi4gSW5zdGVhZCwgd2Ugc3luY2hyb25vdXNseSBkaXNwYXRjaCBhIGZha2UgZXZlbnQgdG8gYSBmYWtlXG4gIC8vIERPTSBub2RlLCBhbmQgY2FsbCB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayBmcm9tIGluc2lkZSBhbiBldmVudCBoYW5kbGVyXG4gIC8vIGZvciB0aGF0IGZha2UgZXZlbnQuIElmIHRoZSBjYWxsYmFjayB0aHJvd3MsIHRoZSBlcnJvciBpcyBcImNhcHR1cmVkXCIgdXNpbmdcbiAgLy8gYSBnbG9iYWwgZXZlbnQgaGFuZGxlci4gQnV0IGJlY2F1c2UgdGhlIGVycm9yIGhhcHBlbnMgaW4gYSBkaWZmZXJlbnRcbiAgLy8gZXZlbnQgbG9vcCBjb250ZXh0LCBpdCBkb2VzIG5vdCBpbnRlcnJ1cHQgdGhlIG5vcm1hbCBwcm9ncmFtIGZsb3cuXG4gIC8vIEVmZmVjdGl2ZWx5LCB0aGlzIGdpdmVzIHVzIHRyeS1jYXRjaCBiZWhhdmlvciB3aXRob3V0IGFjdHVhbGx5IHVzaW5nXG4gIC8vIHRyeS1jYXRjaC4gTmVhdCFcbiAgLy8gQ2hlY2sgdGhhdCB0aGUgYnJvd3NlciBzdXBwb3J0cyB0aGUgQVBJcyB3ZSBuZWVkIHRvIGltcGxlbWVudCBvdXIgc3BlY2lhbFxuICAvLyBERVYgdmVyc2lvbiBvZiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG5cbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tJbXBsID0gZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrRGV2KG5hbWUsIGZ1bmMsIGNvbnRleHQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgICAgIC8vIElmIGRvY3VtZW50IGRvZXNuJ3QgZXhpc3Qgd2Uga25vdyBmb3Igc3VyZSB3ZSB3aWxsIGNyYXNoIGluIHRoaXMgbWV0aG9kXG4gICAgICAvLyB3aGVuIHdlIGNhbGwgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKS4gSG93ZXZlciB0aGlzIGNhbiBjYXVzZSBjb25mdXNpbmdcbiAgICAgIC8vIGVycm9yczogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29raW5jdWJhdG9yL2NyZWF0ZS1yZWFjdC1hcHAvaXNzdWVzLzM0ODJcbiAgICAgIC8vIFNvIHdlIHByZWVtcHRpdmVseSB0aHJvdyB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UgaW5zdGVhZC5cbiAgICAgIGlmICghKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGUgYGRvY3VtZW50YCBnbG9iYWwgd2FzIGRlZmluZWQgd2hlbiBSZWFjdCB3YXMgaW5pdGlhbGl6ZWQsIGJ1dCBpcyBub3QgZGVmaW5lZCBhbnltb3JlLiBUaGlzIGNhbiBoYXBwZW4gaW4gYSB0ZXN0IGVudmlyb25tZW50IGlmIGEgY29tcG9uZW50IHNjaGVkdWxlcyBhbiB1cGRhdGUgZnJvbSBhbiBhc3luY2hyb25vdXMgY2FsbGJhY2ssIGJ1dCB0aGUgdGVzdCBoYXMgYWxyZWFkeSBmaW5pc2hlZCBydW5uaW5nLiBUbyBzb2x2ZSB0aGlzLCB5b3UgY2FuIGVpdGhlciB1bm1vdW50IHRoZSBjb21wb25lbnQgYXQgdGhlIGVuZCBvZiB5b3VyIHRlc3QgKGFuZCBlbnN1cmUgdGhhdCBhbnkgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgZ2V0IGNhbmNlbGVkIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGApLCBvciB5b3UgY2FuIGNoYW5nZSB0aGUgdGVzdCBpdHNlbGYgdG8gYmUgYXN5bmNocm9ub3VzLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgdmFyIGRpZENhbGwgPSBmYWxzZTsgLy8gS2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aHJldyBhbiBlcnJvci4gV2VcbiAgICAgIC8vIHNldCB0aGlzIHRvIHRydWUgYXQgdGhlIGJlZ2lubmluZywgdGhlbiBzZXQgaXQgdG8gZmFsc2UgcmlnaHQgYWZ0ZXJcbiAgICAgIC8vIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gZXJyb3JzLCBgZGlkRXJyb3JgIHdpbGwgbmV2ZXIgYmVcbiAgICAgIC8vIHNldCB0byBmYWxzZS4gVGhpcyBzdHJhdGVneSB3b3JrcyBldmVuIGlmIHRoZSBicm93c2VyIGlzIGZsYWt5IGFuZFxuICAgICAgLy8gZmFpbHMgdG8gY2FsbCBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIsIGJlY2F1c2UgaXQgZG9lc24ndCByZWx5IG9uXG4gICAgICAvLyB0aGUgZXJyb3IgZXZlbnQgYXQgYWxsLlxuXG4gICAgICB2YXIgZGlkRXJyb3IgPSB0cnVlOyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgdmFsdWUgb2Ygd2luZG93LmV2ZW50IHNvIHRoYXQgd2UgY2FuIHJlc2V0IGl0XG4gICAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrIHRvIGxldCB1c2VyIGNvZGUgYWNjZXNzIHdpbmRvdy5ldmVudCBpbiB0aGVcbiAgICAgIC8vIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBpdC5cblxuICAgICAgdmFyIHdpbmRvd0V2ZW50ID0gd2luZG93LmV2ZW50OyAvLyBLZWVwcyB0cmFjayBvZiB0aGUgZGVzY3JpcHRvciBvZiB3aW5kb3cuZXZlbnQgdG8gcmVzdG9yZSBpdCBhZnRlciBldmVudFxuICAgICAgLy8gZGlzcGF0Y2hpbmc6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2ODhcblxuICAgICAgdmFyIHdpbmRvd0V2ZW50RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZXZlbnQnKTtcblxuICAgICAgZnVuY3Rpb24gcmVzdG9yZUFmdGVyRGlzcGF0Y2goKSB7XG4gICAgICAgIC8vIFdlIGltbWVkaWF0ZWx5IHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSBldmVudCBsaXN0ZW5lcnMgc28gdGhhdFxuICAgICAgICAvLyBuZXN0ZWQgYGludm9rZUd1YXJkZWRDYWxsYmFja2AgY2FsbHMgZG8gbm90IGNsYXNoLiBPdGhlcndpc2UsIGFcbiAgICAgICAgLy8gbmVzdGVkIGNhbGwgd291bGQgdHJpZ2dlciB0aGUgZmFrZSBldmVudCBoYW5kbGVycyBvZiBhbnkgY2FsbCBoaWdoZXJcbiAgICAgICAgLy8gaW4gdGhlIHN0YWNrLlxuICAgICAgICBmYWtlTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2dFR5cGUsIGNhbGxDYWxsYmFjaywgZmFsc2UpOyAvLyBXZSBjaGVjayBmb3Igd2luZG93Lmhhc093blByb3BlcnR5KCdldmVudCcpIHRvIHByZXZlbnQgdGhlXG4gICAgICAgIC8vIHdpbmRvdy5ldmVudCBhc3NpZ25tZW50IGluIGJvdGggSUUgPD0gMTAgYXMgdGhleSB0aHJvdyBhbiBlcnJvclxuICAgICAgICAvLyBcIk1lbWJlciBub3QgZm91bmRcIiBpbiBzdHJpY3QgbW9kZSwgYW5kIGluIEZpcmVmb3ggd2hpY2ggZG9lcyBub3RcbiAgICAgICAgLy8gc3VwcG9ydCB3aW5kb3cuZXZlbnQuXG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuZXZlbnQgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnZXZlbnQnKSkge1xuICAgICAgICAgIHdpbmRvdy5ldmVudCA9IHdpbmRvd0V2ZW50O1xuICAgICAgICB9XG4gICAgICB9IC8vIENyZWF0ZSBhbiBldmVudCBoYW5kbGVyIGZvciBvdXIgZmFrZSBldmVudC4gV2Ugd2lsbCBzeW5jaHJvbm91c2x5XG4gICAgICAvLyBkaXNwYXRjaCBvdXIgZmFrZSBldmVudCB1c2luZyBgZGlzcGF0Y2hFdmVudGAuIEluc2lkZSB0aGUgaGFuZGxlciwgd2VcbiAgICAgIC8vIGNhbGwgdGhlIHVzZXItcHJvdmlkZWQgY2FsbGJhY2suXG5cblxuICAgICAgdmFyIGZ1bmNBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAzKTtcblxuICAgICAgZnVuY3Rpb24gY2FsbENhbGxiYWNrKCkge1xuICAgICAgICBkaWRDYWxsID0gdHJ1ZTtcbiAgICAgICAgcmVzdG9yZUFmdGVyRGlzcGF0Y2goKTtcbiAgICAgICAgZnVuYy5hcHBseShjb250ZXh0LCBmdW5jQXJncyk7XG4gICAgICAgIGRpZEVycm9yID0gZmFsc2U7XG4gICAgICB9IC8vIENyZWF0ZSBhIGdsb2JhbCBlcnJvciBldmVudCBoYW5kbGVyLiBXZSB1c2UgdGhpcyB0byBjYXB0dXJlIHRoZSB2YWx1ZVxuICAgICAgLy8gdGhhdCB3YXMgdGhyb3duLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBlcnJvciBoYW5kbGVyIHdpbGwgZmlyZSBtb3JlXG4gICAgICAvLyB0aGFuIG9uY2U7IGZvciBleGFtcGxlLCBpZiBub24tUmVhY3QgY29kZSBhbHNvIGNhbGxzIGBkaXNwYXRjaEV2ZW50YFxuICAgICAgLy8gYW5kIGEgaGFuZGxlciBmb3IgdGhhdCBldmVudCB0aHJvd3MuIFdlIHNob3VsZCBiZSByZXNpbGllbnQgdG8gbW9zdCBvZlxuICAgICAgLy8gdGhvc2UgY2FzZXMuIEV2ZW4gaWYgb3VyIGVycm9yIGV2ZW50IGhhbmRsZXIgZmlyZXMgbW9yZSB0aGFuIG9uY2UsIHRoZVxuICAgICAgLy8gbGFzdCBlcnJvciBldmVudCBpcyBhbHdheXMgdXNlZC4gSWYgdGhlIGNhbGxiYWNrIGFjdHVhbGx5IGRvZXMgZXJyb3IsXG4gICAgICAvLyB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZXJyb3IgZXZlbnQgaXMgdGhlIGNvcnJlY3Qgb25lLCBiZWNhdXNlIGl0J3Mgbm90XG4gICAgICAvLyBwb3NzaWJsZSBmb3IgYW55dGhpbmcgZWxzZSB0byBoYXZlIGhhcHBlbmVkIGluIGJldHdlZW4gb3VyIGNhbGxiYWNrXG4gICAgICAvLyBlcnJvcmluZyBhbmQgdGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoZSBgZGlzcGF0Y2hFdmVudGAgY2FsbCBiZWxvdy4gSWZcbiAgICAgIC8vIHRoZSBjYWxsYmFjayBkb2Vzbid0IGVycm9yLCBidXQgdGhlIGVycm9yIGV2ZW50IHdhcyBmaXJlZCwgd2Uga25vdyB0b1xuICAgICAgLy8gaWdub3JlIGl0IGJlY2F1c2UgYGRpZEVycm9yYCB3aWxsIGJlIGZhbHNlLCBhcyBkZXNjcmliZWQgYWJvdmUuXG5cblxuICAgICAgdmFyIGVycm9yOyAvLyBVc2UgdGhpcyB0byB0cmFjayB3aGV0aGVyIHRoZSBlcnJvciBldmVudCBpcyBldmVyIGNhbGxlZC5cblxuICAgICAgdmFyIGRpZFNldEVycm9yID0gZmFsc2U7XG4gICAgICB2YXIgaXNDcm9zc09yaWdpbkVycm9yID0gZmFsc2U7XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0Vycm9yKGV2ZW50KSB7XG4gICAgICAgIGVycm9yID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGRpZFNldEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoZXJyb3IgPT09IG51bGwgJiYgZXZlbnQuY29sbm8gPT09IDAgJiYgZXZlbnQubGluZW5vID09PSAwKSB7XG4gICAgICAgICAgaXNDcm9zc09yaWdpbkVycm9yID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgLy8gU29tZSBvdGhlciBlcnJvciBoYW5kbGVyIGhhcyBwcmV2ZW50ZWQgZGVmYXVsdC5cbiAgICAgICAgICAvLyBCcm93c2VycyBzaWxlbmNlIHRoZSBlcnJvciByZXBvcnQgaWYgdGhpcyBoYXBwZW5zLlxuICAgICAgICAgIC8vIFdlJ2xsIHJlbWVtYmVyIHRoaXMgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIgdG8gbG9nIGl0IG9yIG5vdC5cbiAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBlcnJvci5fc3VwcHJlc3NMb2dnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGlubmVyKSB7Ly8gSWdub3JlLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSAvLyBDcmVhdGUgYSBmYWtlIGV2ZW50IHR5cGUuXG5cblxuICAgICAgdmFyIGV2dFR5cGUgPSBcInJlYWN0LVwiICsgKG5hbWUgPyBuYW1lIDogJ2ludm9rZWd1YXJkZWRjYWxsYmFjaycpOyAvLyBBdHRhY2ggb3VyIGV2ZW50IGhhbmRsZXJzXG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcbiAgICAgIGZha2VOb2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgY2FsbENhbGxiYWNrLCBmYWxzZSk7IC8vIFN5bmNocm9ub3VzbHkgZGlzcGF0Y2ggb3VyIGZha2UgZXZlbnQuIElmIHRoZSB1c2VyLXByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgICAvLyBlcnJvcnMsIGl0IHdpbGwgdHJpZ2dlciBvdXIgZ2xvYmFsIGVycm9yIGhhbmRsZXIuXG5cbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcblxuICAgICAgaWYgKHdpbmRvd0V2ZW50RGVzY3JpcHRvcikge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZXZlbnQnLCB3aW5kb3dFdmVudERlc2NyaXB0b3IpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlkQ2FsbCAmJiBkaWRFcnJvcikge1xuICAgICAgICBpZiAoIWRpZFNldEVycm9yKSB7XG4gICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGVycm9yZWQsIGJ1dCB0aGUgZXJyb3IgZXZlbnQgbmV2ZXIgZmlyZWQuXG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0FuIGVycm9yIHdhcyB0aHJvd24gaW5zaWRlIG9uZSBvZiB5b3VyIGNvbXBvbmVudHMsIGJ1dCBSZWFjdCAnICsgXCJkb2Vzbid0IGtub3cgd2hhdCBpdCB3YXMuIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBicm93c2VyIFwiICsgJ2ZsYWtpbmVzcy4gUmVhY3QgZG9lcyBpdHMgYmVzdCB0byBwcmVzZXJ2ZSB0aGUgXCJQYXVzZSBvbiAnICsgJ2V4Y2VwdGlvbnNcIiBiZWhhdmlvciBvZiB0aGUgRGV2VG9vbHMsIHdoaWNoIHJlcXVpcmVzIHNvbWUgJyArIFwiREVWLW1vZGUgb25seSB0cmlja3MuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVzZSBkb24ndCB3b3JrIGluIFwiICsgJ3lvdXIgYnJvd3Nlci4gVHJ5IHRyaWdnZXJpbmcgdGhlIGVycm9yIGluIHByb2R1Y3Rpb24gbW9kZSwgJyArICdvciBzd2l0Y2hpbmcgdG8gYSBtb2Rlcm4gYnJvd3Nlci4gSWYgeW91IHN1c3BlY3QgdGhhdCB0aGlzIGlzICcgKyAnYWN0dWFsbHkgYW4gaXNzdWUgd2l0aCBSZWFjdCwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNDcm9zc09yaWdpbkVycm9yKSB7XG4gICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXCJBIGNyb3NzLW9yaWdpbiBlcnJvciB3YXMgdGhyb3duLiBSZWFjdCBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIFwiICsgJ3RoZSBhY3R1YWwgZXJyb3Igb2JqZWN0IGluIGRldmVsb3BtZW50LiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvY3Jvc3NvcmlnaW4tZXJyb3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgfSAvLyBSZW1vdmUgb3VyIGV2ZW50IGxpc3RlbmVyc1xuXG5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGhhbmRsZVdpbmRvd0Vycm9yKTtcblxuICAgICAgaWYgKCFkaWRDYWxsKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHJlYWxseSB3cm9uZywgYW5kIG91ciBldmVudCB3YXMgbm90IGRpc3BhdGNoZWQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY3MzRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNjU4NVxuICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIHByb2R1Y3Rpb24gaW1wbGVtZW50YXRpb24uXG4gICAgICAgIHJlc3RvcmVBZnRlckRpc3BhdGNoKCk7XG4gICAgICAgIHJldHVybiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tQcm9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG52YXIgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxID0gaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbDtcblxudmFyIGhhc0Vycm9yID0gZmFsc2U7XG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsOyAvLyBVc2VkIGJ5IGV2ZW50IHN5c3RlbSB0byBjYXB0dXJlL3JldGhyb3cgdGhlIGZpcnN0IGVycm9yLlxuXG52YXIgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG52YXIgcmV0aHJvd0Vycm9yID0gbnVsbDtcbnZhciByZXBvcnRlciA9IHtcbiAgb25FcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn07XG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICogUmV0dXJucyBhbiBlcnJvciBpZiBpdCB0aHJvd3MsIG90aGVyd2lzZSBudWxsLlxuICpcbiAqIEluIHByb2R1Y3Rpb24sIHRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSB0cnktY2F0Y2guIFRoZSByZWFzb24gd2UgZG9uJ3RcbiAqIHVzZSBhIHRyeS1jYXRjaCBkaXJlY3RseSBpcyBzbyB0aGF0IHdlIGNhbiBzd2FwIG91dCBhIGRpZmZlcmVudFxuICogaW1wbGVtZW50YXRpb24gaW4gREVWIG1vZGUuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgdGhlIGd1YXJkIHRvIHVzZSBmb3IgbG9nZ2luZyBvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZVxuICogQHBhcmFtIHsqfSBjb250ZXh0IFRoZSBjb250ZXh0IHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uXG4gKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJndW1lbnRzIGZvciBmdW5jdGlvblxuICovXG5cbmZ1bmN0aW9uIGludm9rZUd1YXJkZWRDYWxsYmFjayhuYW1lLCBmdW5jLCBjb250ZXh0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGhhc0Vycm9yID0gZmFsc2U7XG4gIGNhdWdodEVycm9yID0gbnVsbDtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrSW1wbCQxLmFwcGx5KHJlcG9ydGVyLCBhcmd1bWVudHMpO1xufVxuLyoqXG4gKiBTYW1lIGFzIGludm9rZUd1YXJkZWRDYWxsYmFjaywgYnV0IGluc3RlYWQgb2YgcmV0dXJuaW5nIGFuIGVycm9yLCBpdCBzdG9yZXNcbiAqIGl0IGluIGEgZ2xvYmFsIHNvIGl0IGNhbiBiZSByZXRocm93biBieSBgcmV0aHJvd0NhdWdodEVycm9yYCBsYXRlci5cbiAqIFRPRE86IFNlZSBpZiBjYXVnaHRFcnJvciBhbmQgcmV0aHJvd0Vycm9yIGNhbiBiZSB1bmlmaWVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBUaGUgY29udGV4dCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoZSBmdW5jdGlvblxuICogQHBhcmFtIHsuLi4qfSBhcmdzIEFyZ3VtZW50cyBmb3IgZnVuY3Rpb25cbiAqL1xuXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IobmFtZSwgZnVuYywgY29udGV4dCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBpZiAoaGFzRXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICBpZiAoIWhhc1JldGhyb3dFcnJvcikge1xuICAgICAgaGFzUmV0aHJvd0Vycm9yID0gdHJ1ZTtcbiAgICAgIHJldGhyb3dFcnJvciA9IGVycm9yO1xuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBEdXJpbmcgZXhlY3V0aW9uIG9mIGd1YXJkZWQgZnVuY3Rpb25zIHdlIHdpbGwgY2FwdHVyZSB0aGUgZmlyc3QgZXJyb3Igd2hpY2hcbiAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAqL1xuXG5mdW5jdGlvbiByZXRocm93Q2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNSZXRocm93RXJyb3IpIHtcbiAgICB2YXIgZXJyb3IgPSByZXRocm93RXJyb3I7XG4gICAgaGFzUmV0aHJvd0Vycm9yID0gZmFsc2U7XG4gICAgcmV0aHJvd0Vycm9yID0gbnVsbDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gaGFzQ2F1Z2h0RXJyb3IoKSB7XG4gIHJldHVybiBoYXNFcnJvcjtcbn1cbmZ1bmN0aW9uIGNsZWFyQ2F1Z2h0RXJyb3IoKSB7XG4gIGlmIChoYXNFcnJvcikge1xuICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgIGhhc0Vycm9yID0gZmFsc2U7XG4gICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgIHJldHVybiBlcnJvcjtcbiAgfSBlbHNlIHtcbiAgICB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcImNsZWFyQ2F1Z2h0RXJyb3Igd2FzIGNhbGxlZCBidXQgbm8gZXJyb3Igd2FzIGNhcHR1cmVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogYFJlYWN0SW5zdGFuY2VNYXBgIG1haW50YWlucyBhIG1hcHBpbmcgZnJvbSBhIHB1YmxpYyBmYWNpbmcgc3RhdGVmdWxcbiAqIGluc3RhbmNlIChrZXkpIGFuZCB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKHZhbHVlKS4gVGhpcyBhbGxvd3MgcHVibGljXG4gKiBtZXRob2RzIHRvIGFjY2VwdCB0aGUgdXNlciBmYWNpbmcgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgYW5kIG1hcCB0aGVtIGJhY2tcbiAqIHRvIGludGVybmFsIG1ldGhvZHMuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgbW9kdWxlIGlzIGN1cnJlbnRseSBzaGFyZWQgYW5kIGFzc3VtZWQgdG8gYmUgc3RhdGVsZXNzLlxuICogSWYgdGhpcyBiZWNvbWVzIGFuIGFjdHVhbCBNYXAsIHRoYXQgd2lsbCBicmVhay5cbiAqL1xuZnVuY3Rpb24gZ2V0KGtleSkge1xuICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFscztcbn1cbmZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbHMgIT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gIGtleS5fcmVhY3RJbnRlcm5hbHMgPSB2YWx1ZTtcbn1cblxuLy8gRG9uJ3QgY2hhbmdlIHRoZXNlIHR3byB2YWx1ZXMuIFRoZXkncmUgdXNlZCBieSBSZWFjdCBEZXYgVG9vbHMuXG52YXIgTm9GbGFncyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBQZXJmb3JtZWRXb3JrID1cbi8qICAgICAgICAgICAgICAgICovXG4xOyAvLyBZb3UgY2FuIGNoYW5nZSB0aGUgcmVzdCAoYW5kIGFkZCBtb3JlKS5cblxudmFyIFBsYWNlbWVudCA9XG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgVXBkYXRlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDtcbnZhciBQbGFjZW1lbnRBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG42O1xudmFyIERlbGV0aW9uID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjg7XG52YXIgQ29udGVudFJlc2V0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ2FsbGJhY2sgPVxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgRGlkQ2FwdHVyZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuNjQ7XG52YXIgUmVmID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMTI4O1xudmFyIFNuYXBzaG90ID1cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBQYXNzaXZlID1cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG41MTI7IC8vIFRPRE8gKGVmZmVjdHMpIFJlbW92ZSB0aGlzIGJpdCBvbmNlIHRoZSBuZXcgcmVjb25jaWxlciBpcyBzeW5jZWQgdG8gdGhlIG9sZC5cblxudmFyIFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldiA9XG4vKiAgICAgKi9cbjgxOTI7XG52YXIgSHlkcmF0aW5nID1cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuMTAyNDtcbnZhciBIeWRyYXRpbmdBbmRVcGRhdGUgPVxuLyogICAgICAgICAgICovXG4xMDI4OyAvLyBQYXNzaXZlICYgVXBkYXRlICYgQ2FsbGJhY2sgJiBSZWYgJiBTbmFwc2hvdFxuXG52YXIgTGlmZWN5Y2xlRWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAqL1xuOTMyOyAvLyBVbmlvbiBvZiBhbGwgaG9zdCBlZmZlY3RzXG5cbnZhciBIb3N0RWZmZWN0TWFzayA9XG4vKiAgICAgICAgICAgICAgICovXG4yMDQ3OyAvLyBUaGVzZSBhcmUgbm90IHJlYWxseSBzaWRlIGVmZmVjdHMsIGJ1dCB3ZSBzdGlsbCByZXVzZSB0aGlzIGZpZWxkLlxuXG52YXIgSW5jb21wbGV0ZSA9XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuMjA0ODtcbnZhciBTaG91bGRDYXB0dXJlID1cbi8qICAgICAgICAgICAgICAgICovXG40MDk2O1xudmFyIEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2UgPVxuLyogKi9cbjE2Mzg0OyAvLyBTdGF0aWMgdGFncyBkZXNjcmliZSBhc3BlY3RzIG9mIGEgZmliZXIgdGhhdCBhcmUgbm90IHNwZWNpZmljIHRvIGEgcmVuZGVyLFxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRPd25lcjtcbmZ1bmN0aW9uIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpIHtcbiAgdmFyIG5vZGUgPSBmaWJlcjtcbiAgdmFyIG5lYXJlc3RNb3VudGVkID0gZmliZXI7XG5cbiAgaWYgKCFmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBhbHRlcm5hdGUsIHRoaXMgbWlnaHQgYmUgYSBuZXcgdHJlZSB0aGF0IGlzbid0IGluc2VydGVkXG4gICAgLy8geWV0LiBJZiBpdCBpcywgdGhlbiBpdCB3aWxsIGhhdmUgYSBwZW5kaW5nIGluc2VydGlvbiBlZmZlY3Qgb24gaXQuXG4gICAgdmFyIG5leHROb2RlID0gbm9kZTtcblxuICAgIGRvIHtcbiAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcblxuICAgICAgaWYgKChub2RlLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYW4gaW5zZXJ0aW9uIG9yIGluLXByb2dyZXNzIGh5ZHJhdGlvbi4gVGhlIG5lYXJlc3QgcG9zc2libGVcbiAgICAgICAgLy8gbW91bnRlZCBmaWJlciBpcyB0aGUgcGFyZW50IGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIGZpZ3VyZSBvdXRcbiAgICAgICAgLy8gaWYgdGhhdCBvbmUgaXMgc3RpbGwgbW91bnRlZC5cbiAgICAgICAgbmVhcmVzdE1vdW50ZWQgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbmV4dE5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChuZXh0Tm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKG5vZGUucmV0dXJuKSB7XG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIFRPRE86IENoZWNrIGlmIHRoaXMgd2FzIGEgbmVzdGVkIEhvc3RSb290IHdoZW4gdXNlZCB3aXRoXG4gICAgLy8gcmVuZGVyQ29udGFpbmVySW50b1N1YnRyZWUuXG4gICAgcmV0dXJuIG5lYXJlc3RNb3VudGVkO1xuICB9IC8vIElmIHdlIGRpZG4ndCBoaXQgdGhlIHJvb3QsIHRoYXQgbWVhbnMgdGhhdCB3ZSdyZSBpbiBhbiBkaXNjb25uZWN0ZWQgdHJlZVxuICAvLyB0aGF0IGhhcyBiZWVuIHVubW91bnRlZC5cblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIGlmIChzdXNwZW5zZVN0YXRlID09PSBudWxsKSB7XG4gICAgICB2YXIgY3VycmVudCA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGdldENvbnRhaW5lckZyb21GaWJlcihmaWJlcikge1xuICByZXR1cm4gZmliZXIudGFnID09PSBIb3N0Um9vdCA/IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGlzRmliZXJNb3VudGVkKGZpYmVyKSB7XG4gIHJldHVybiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSA9PT0gZmliZXI7XG59XG5mdW5jdGlvbiBpc01vdW50ZWQoY29tcG9uZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuXG4gICAgaWYgKG93bmVyICE9PSBudWxsICYmIG93bmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBvd25lckZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKCFpbnN0YW5jZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIpIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXJGaWJlci50eXBlKSB8fCAnQSBjb21wb25lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaW5zdGFuY2UuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQoY29tcG9uZW50KTtcblxuICBpZiAoIWZpYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcjtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0SXNNb3VudGVkKGZpYmVyKSB7XG4gIGlmICghKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpID09PSBmaWJlcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEN1cnJlbnRGaWJlclVzaW5nU2xvd1BhdGgoZmliZXIpIHtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoIWFsdGVybmF0ZSkge1xuICAgIC8vIElmIHRoZXJlIGlzIG5vIGFsdGVybmF0ZSwgdGhlbiB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZC5cbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKTtcblxuICAgIGlmICghKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmVhcmVzdE1vdW50ZWQgIT09IGZpYmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gSWYgd2UgaGF2ZSB0d28gcG9zc2libGUgYnJhbmNoZXMsIHdlJ2xsIHdhbGsgYmFja3dhcmRzIHVwIHRvIHRoZSByb290XG4gIC8vIHRvIHNlZSB3aGF0IHBhdGggdGhlIHJvb3QgcG9pbnRzIHRvLiBPbiB0aGUgd2F5IHdlIG1heSBoaXQgb25lIG9mIHRoZVxuICAvLyBzcGVjaWFsIGNhc2VzIGFuZCB3ZSdsbCBkZWFsIHdpdGggdGhlbS5cblxuXG4gIHZhciBhID0gZmliZXI7XG4gIHZhciBiID0gYWx0ZXJuYXRlO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEEgPSBhLnJldHVybjtcblxuICAgIGlmIChwYXJlbnRBID09PSBudWxsKSB7XG4gICAgICAvLyBXZSdyZSBhdCB0aGUgcm9vdC5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnRCID0gcGFyZW50QS5hbHRlcm5hdGU7XG5cbiAgICBpZiAocGFyZW50QiA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gYWx0ZXJuYXRlLiBUaGlzIGlzIGFuIHVudXN1YWwgY2FzZS4gQ3VycmVudGx5LCBpdCBvbmx5XG4gICAgICAvLyBoYXBwZW5zIHdoZW4gYSBTdXNwZW5zZSBjb21wb25lbnQgaXMgaGlkZGVuLiBBbiBleHRyYSBmcmFnbWVudCBmaWJlclxuICAgICAgLy8gaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbiB0aGUgU3VzcGVuc2UgZmliZXIgYW5kIGl0cyBjaGlsZHJlbi4gU2tpcFxuICAgICAgLy8gb3ZlciB0aGlzIGV4dHJhIGZyYWdtZW50IGZpYmVyIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0IHBhcmVudC5cbiAgICAgIHZhciBuZXh0UGFyZW50ID0gcGFyZW50QS5yZXR1cm47XG5cbiAgICAgIGlmIChuZXh0UGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGEgPSBiID0gbmV4dFBhcmVudDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IC8vIElmIHRoZXJlJ3Mgbm8gcGFyZW50LCB3ZSdyZSBhdCB0aGUgcm9vdC5cblxuXG4gICAgICBicmVhaztcbiAgICB9IC8vIElmIGJvdGggY29waWVzIG9mIHRoZSBwYXJlbnQgZmliZXIgcG9pbnQgdG8gdGhlIHNhbWUgY2hpbGQsIHdlIGNhblxuICAgIC8vIGFzc3VtZSB0aGF0IHRoZSBjaGlsZCBpcyBjdXJyZW50LiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBiYWlsb3V0IG9uIGxvd1xuICAgIC8vIHByaW9yaXR5OiB0aGUgYmFpbGVkIG91dCBmaWJlcidzIGNoaWxkIHJldXNlcyB0aGUgY3VycmVudCBjaGlsZC5cblxuXG4gICAgaWYgKHBhcmVudEEuY2hpbGQgPT09IHBhcmVudEIuY2hpbGQpIHtcbiAgICAgIHZhciBjaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IGEpIHtcbiAgICAgICAgICAvLyBXZSd2ZSBkZXRlcm1pbmVkIHRoYXQgQSBpcyB0aGUgY3VycmVudCBicmFuY2guXG4gICAgICAgICAgYXNzZXJ0SXNNb3VudGVkKHBhcmVudEEpO1xuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCA9PT0gYikge1xuICAgICAgICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBCIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICAgICAgICBhc3NlcnRJc01vdW50ZWQocGFyZW50QSk7XG4gICAgICAgICAgcmV0dXJuIGFsdGVybmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH0gLy8gV2Ugc2hvdWxkIG5ldmVyIGhhdmUgYW4gYWx0ZXJuYXRlIGZvciBhbnkgbW91bnRpbmcgbm9kZS4gU28gdGhlIG9ubHlcbiAgICAgIC8vIHdheSB0aGlzIGNvdWxkIHBvc3NpYmx5IGhhcHBlbiBpcyBpZiB0aGlzIHdhcyB1bm1vdW50ZWQsIGlmIGF0IGFsbC5cblxuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlciBvZiBBIGFuZCB0aGUgcmV0dXJuIHBvaW50ZXIgb2YgQiBwb2ludCB0byBkaWZmZXJlbnRcbiAgICAgIC8vIGZpYmVycy4gV2UgYXNzdW1lIHRoYXQgcmV0dXJuIHBvaW50ZXJzIG5ldmVyIGNyaXNzLWNyb3NzLCBzbyBBIG11c3RcbiAgICAgIC8vIGJlbG9uZyB0byB0aGUgY2hpbGQgc2V0IG9mIEEucmV0dXJuLCBhbmQgQiBtdXN0IGJlbG9uZyB0byB0aGUgY2hpbGRcbiAgICAgIC8vIHNldCBvZiBCLnJldHVybi5cbiAgICAgIGEgPSBwYXJlbnRBO1xuICAgICAgYiA9IHBhcmVudEI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSByZXR1cm4gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgZmliZXIuIFdlJ2xsIGhhdmUgdG8gdXNlIHRoZVxuICAgICAgLy8gZGVmYXVsdCwgc2xvdyBwYXRoOiBzY2FuIHRoZSBjaGlsZCBzZXRzIG9mIGVhY2ggcGFyZW50IGFsdGVybmF0ZSB0byBzZWVcbiAgICAgIC8vIHdoaWNoIGNoaWxkIGJlbG9uZ3MgdG8gd2hpY2ggc2V0LlxuICAgICAgLy9cbiAgICAgIC8vIFNlYXJjaCBwYXJlbnQgQSdzIGNoaWxkIHNldFxuICAgICAgdmFyIGRpZEZpbmRDaGlsZCA9IGZhbHNlO1xuICAgICAgdmFyIF9jaGlsZCA9IHBhcmVudEEuY2hpbGQ7XG5cbiAgICAgIHdoaWxlIChfY2hpbGQpIHtcbiAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgIGRpZEZpbmRDaGlsZCA9IHRydWU7XG4gICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICBiID0gcGFyZW50QTtcbiAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZEZpbmRDaGlsZCkge1xuICAgICAgICAvLyBTZWFyY2ggcGFyZW50IEIncyBjaGlsZCBzZXRcbiAgICAgICAgX2NoaWxkID0gcGFyZW50Qi5jaGlsZDtcblxuICAgICAgICB3aGlsZSAoX2NoaWxkKSB7XG4gICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgZGlkRmluZENoaWxkID0gdHJ1ZTtcbiAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgYiA9IHBhcmVudEE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoX2NoaWxkID09PSBiKSB7XG4gICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSB0cnVlO1xuICAgICAgICAgICAgYiA9IHBhcmVudEI7XG4gICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIF9jaGlsZCA9IF9jaGlsZC5zaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJDaGlsZCB3YXMgbm90IGZvdW5kIGluIGVpdGhlciBwYXJlbnQgc2V0LiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdCByZWxhdGVkIHRvIHRoZSByZXR1cm4gcG9pbnRlci4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIShhLmFsdGVybmF0ZSA9PT0gYikpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmV0dXJuIGZpYmVycyBzaG91bGQgYWx3YXlzIGJlIGVhY2ggb3RoZXJzJyBhbHRlcm5hdGVzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIElmIHRoZSByb290IGlzIG5vdCBhIGhvc3QgY29udGFpbmVyLCB3ZSdyZSBpbiBhIGRpc2Nvbm5lY3RlZCB0cmVlLiBJLmUuXG4gIC8vIHVubW91bnRlZC5cblxuXG4gIGlmICghKGEudGFnID09PSBIb3N0Um9vdCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYS5zdGF0ZU5vZGUuY3VycmVudCA9PT0gYSkge1xuICAgIC8vIFdlJ3ZlIGRldGVybWluZWQgdGhhdCBBIGlzIHRoZSBjdXJyZW50IGJyYW5jaC5cbiAgICByZXR1cm4gZmliZXI7XG4gIH0gLy8gT3RoZXJ3aXNlIEIgaGFzIHRvIGJlIGN1cnJlbnQgYnJhbmNoLlxuXG5cbiAgcmV0dXJuIGFsdGVybmF0ZTtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyKHBhcmVudCkge1xuICB2YXIgY3VycmVudFBhcmVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKHBhcmVudCk7XG5cbiAgaWYgKCFjdXJyZW50UGFyZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTmV4dCB3ZSdsbCBkcmlsbCBkb3duIHRoaXMgY29tcG9uZW50IHRvIGZpbmQgdGhlIGZpcnN0IEhvc3RDb21wb25lbnQvVGV4dC5cblxuXG4gIHZhciBub2RlID0gY3VycmVudFBhcmVudDtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH0gZWxzZSBpZiAobm9kZS5jaGlsZCkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKCFub2RlLnNpYmxpbmcpIHtcbiAgICAgIGlmICghbm9kZS5yZXR1cm4gfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnRQYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfSAvLyBGbG93IG5lZWRzIHRoZSByZXR1cm4gbnVsbCBoZXJlLCBidXQgRVNMaW50IGNvbXBsYWlucyBhYm91dCBpdC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlXG5cblxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVyV2l0aE5vUG9ydGFscyhwYXJlbnQpIHtcbiAgdmFyIGN1cnJlbnRQYXJlbnQgPSBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChwYXJlbnQpO1xuXG4gIGlmICghY3VycmVudFBhcmVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIE5leHQgd2UnbGwgZHJpbGwgZG93biB0aGlzIGNvbXBvbmVudCB0byBmaW5kIHRoZSBmaXJzdCBIb3N0Q29tcG9uZW50L1RleHQuXG5cblxuICB2YXIgbm9kZSA9IGN1cnJlbnRQYXJlbnQ7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgbm9kZS50YWcgPT09IEhvc3RUZXh0IHx8IGVuYWJsZUZ1bmRhbWVudGFsQVBJICkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICYmIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSBjdXJyZW50UGFyZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB3aGlsZSAoIW5vZGUuc2libGluZykge1xuICAgICAgaWYgKCFub2RlLnJldHVybiB8fCBub2RlLnJldHVybiA9PT0gY3VycmVudFBhcmVudCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc2libGluZy5yZXR1cm4gPSBub2RlLnJldHVybjtcbiAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICB9IC8vIEZsb3cgbmVlZHMgdGhlIHJldHVybiBudWxsIGhlcmUsIGJ1dCBFU0xpbnQgY29tcGxhaW5zIGFib3V0IGl0LlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5yZWFjaGFibGVcblxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gZG9lc0ZpYmVyQ29udGFpbihwYXJlbnRGaWJlciwgY2hpbGRGaWJlcikge1xuICB2YXIgbm9kZSA9IGNoaWxkRmliZXI7XG4gIHZhciBwYXJlbnRGaWJlckFsdGVybmF0ZSA9IHBhcmVudEZpYmVyLmFsdGVybmF0ZTtcblxuICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgIGlmIChub2RlID09PSBwYXJlbnRGaWJlciB8fCBub2RlID09PSBwYXJlbnRGaWJlckFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbjtcbmZ1bmN0aW9uIHNldEF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdFVzZXJCbG9ja2luZ0h5ZHJhdGlvbiA9IGZuO1xufVxudmFyIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uO1xuZnVuY3Rpb24gc2V0QXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oZm4pIHtcbiAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24gPSBmbjtcbn1cbnZhciBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkoZm4pIHtcbiAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5ID0gZm47XG59XG52YXIgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHk7XG5mdW5jdGlvbiBzZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShmbikge1xuICBhdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eSA9IGZuO1xufSAvLyBUT0RPOiBVcGdyYWRlIHRoaXMgZGVmaW5pdGlvbiBvbmNlIHdlJ3JlIG9uIGEgbmV3ZXIgdmVyc2lvbiBvZiBGbG93IHRoYXRcbnZhciBoYXNTY2hlZHVsZWRSZXBsYXlBdHRlbXB0ID0gZmFsc2U7IC8vIFRoZSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMgdG8gYmUgcmVwbGF5ZWQuXG5cbnZhciBxdWV1ZWREaXNjcmV0ZUV2ZW50cyA9IFtdOyAvLyBJbmRpY2F0ZXMgaWYgYW55IGNvbnRpbnVvdXMgZXZlbnQgdGFyZ2V0cyBhcmUgbm9uLW51bGwgZm9yIGVhcmx5IGJhaWxvdXQuXG4vLyBpZiB0aGUgbGFzdCB0YXJnZXQgd2FzIGRlaHlkcmF0ZWQuXG5cbnZhciBxdWV1ZWRGb2N1cyA9IG51bGw7XG52YXIgcXVldWVkRHJhZyA9IG51bGw7XG52YXIgcXVldWVkTW91c2UgPSBudWxsOyAvLyBGb3IgcG9pbnRlciBldmVudHMgdGhlcmUgY2FuIGJlIG9uZSBsYXRlc3QgZXZlbnQgcGVyIHBvaW50ZXJJZC5cblxudmFyIHF1ZXVlZFBvaW50ZXJzID0gbmV3IE1hcCgpO1xudmFyIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcyA9IG5ldyBNYXAoKTsgLy8gV2UgY291bGQgY29uc2lkZXIgcmVwbGF5aW5nIHNlbGVjdGlvbmNoYW5nZSBhbmQgdG91Y2htb3ZlcyB0b28uXG5cbnZhciBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXTtcbmZ1bmN0aW9uIGhhc1F1ZXVlZERpc2NyZXRlRXZlbnRzKCkge1xuICByZXR1cm4gcXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMDtcbn1cbnZhciBkaXNjcmV0ZVJlcGxheWFibGVFdmVudHMgPSBbJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ3RvdWNoY2FuY2VsJywgJ3RvdWNoZW5kJywgJ3RvdWNoc3RhcnQnLCAnYXV4Y2xpY2snLCAnZGJsY2xpY2snLCAncG9pbnRlcmNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVydXAnLCAnZHJhZ2VuZCcsICdkcmFnc3RhcnQnLCAnZHJvcCcsICdjb21wb3NpdGlvbmVuZCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnaW5wdXQnLCAndGV4dElucHV0JywgLy8gSW50ZW50aW9uYWxseSBjYW1lbENhc2Vcbidjb3B5JywgJ2N1dCcsICdwYXN0ZScsICdjbGljaycsICdjaGFuZ2UnLCAnY29udGV4dG1lbnUnLCAncmVzZXQnLCAnc3VibWl0J107XG5mdW5jdGlvbiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGV2ZW50VHlwZSkge1xuICByZXR1cm4gZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZXZlbnRUeXBlKSA+IC0xO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBibG9ja2VkT246IGJsb2NrZWRPbixcbiAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICBldmVudFN5c3RlbUZsYWdzOiBldmVudFN5c3RlbUZsYWdzIHwgSVNfUkVQTEFZRUQsXG4gICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50LFxuICAgIHRhcmdldENvbnRhaW5lcnM6IFt0YXJnZXRDb250YWluZXJdXG4gIH07XG59XG5cbmZ1bmN0aW9uIHF1ZXVlRGlzY3JldGVFdmVudChibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5wdXNoKHF1ZXVlZEV2ZW50KTtcbn0gLy8gUmVzZXRzIHRoZSByZXBsYXlpbmcgZm9yIHRoaXMgdHlwZSBvZiBjb250aW51b3VzIGV2ZW50IHRvIG5vIGV2ZW50LlxuXG5mdW5jdGlvbiBjbGVhcklmQ29udGludW91c0V2ZW50KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICBxdWV1ZWRGb2N1cyA9IG51bGw7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJvdXQnOlxuICAgICAge1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVycy5kZWxldGUocG9pbnRlcklkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgY2FzZSAnbG9zdHBvaW50ZXJjYXB0dXJlJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9wb2ludGVySWQgPSBuYXRpdmVFdmVudC5wb2ludGVySWQ7XG4gICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUoX3BvaW50ZXJJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoZXhpc3RpbmdRdWV1ZWRFdmVudCwgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgaWYgKGV4aXN0aW5nUXVldWVkRXZlbnQgPT09IG51bGwgfHwgZXhpc3RpbmdRdWV1ZWRFdmVudC5uYXRpdmVFdmVudCAhPT0gbmF0aXZlRXZlbnQpIHtcbiAgICB2YXIgcXVldWVkRXZlbnQgPSBjcmVhdGVRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKGJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgdmFyIF9maWJlcjIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoaXMgdGFyZ2V0LlxuICAgICAgICBhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihfZmliZXIyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVldWVkRXZlbnQ7XG4gIH0gLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IHF1ZXVlZCB0aGlzIGV4YWN0IGV2ZW50LCB0aGVuIGl0J3MgYmVjYXVzZVxuICAvLyB0aGUgZGlmZmVyZW50IGV2ZW50IHN5c3RlbXMgaGF2ZSBkaWZmZXJlbnQgRE9NIGV2ZW50IGxpc3RlbmVycy5cbiAgLy8gV2UgY2FuIGFjY3VtdWxhdGUgdGhlIGZsYWdzLCBhbmQgdGhlIHRhcmdldENvbnRhaW5lcnMsIGFuZFxuICAvLyBzdG9yZSBhIHNpbmdsZSBldmVudCB0byBiZSByZXBsYXllZC5cblxuXG4gIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IGV4aXN0aW5nUXVldWVkRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICBpZiAodGFyZ2V0Q29udGFpbmVyICE9PSBudWxsICYmIHRhcmdldENvbnRhaW5lcnMuaW5kZXhPZih0YXJnZXRDb250YWluZXIpID09PSAtMSkge1xuICAgIHRhcmdldENvbnRhaW5lcnMucHVzaCh0YXJnZXRDb250YWluZXIpO1xuICB9XG5cbiAgcmV0dXJuIGV4aXN0aW5nUXVldWVkRXZlbnQ7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gVGhlc2Ugc2V0IHJlbGF0ZWRUYXJnZXQgdG8gbnVsbCBiZWNhdXNlIHRoZSByZXBsYXllZCBldmVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgd2VcbiAgLy8gbW92ZWQgZnJvbSBvdXRzaWRlIHRoZSB3aW5kb3cgKG5vIHRhcmdldCkgb250byB0aGUgdGFyZ2V0IG9uY2UgaXQgaHlkcmF0ZXMuXG4gIC8vIEluc3RlYWQgb2YgbXV0YXRpbmcgd2UgY291bGQgY2xvbmUgdGhlIGV2ZW50LlxuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAge1xuICAgICAgICB2YXIgZm9jdXNFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRGb2N1cyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRm9jdXMsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIGZvY3VzRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICB7XG4gICAgICAgIHZhciBkcmFnRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgcXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkRHJhZywgYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgZHJhZ0V2ZW50KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgICAge1xuICAgICAgICB2YXIgbW91c2VFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICBxdWV1ZWRNb3VzZSA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQocXVldWVkTW91c2UsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG1vdXNlRXZlbnQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ3BvaW50ZXJvdmVyJzpcbiAgICAgIHtcbiAgICAgICAgdmFyIHBvaW50ZXJFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICAgICAgICB2YXIgcG9pbnRlcklkID0gcG9pbnRlckV2ZW50LnBvaW50ZXJJZDtcbiAgICAgICAgcXVldWVkUG9pbnRlcnMuc2V0KHBvaW50ZXJJZCwgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChxdWV1ZWRQb2ludGVycy5nZXQocG9pbnRlcklkKSB8fCBudWxsLCBibG9ja2VkT24sIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBwb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICBjYXNlICdnb3Rwb2ludGVyY2FwdHVyZSc6XG4gICAgICB7XG4gICAgICAgIHZhciBfcG9pbnRlckV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgIHZhciBfcG9pbnRlcklkMiA9IF9wb2ludGVyRXZlbnQucG9pbnRlcklkO1xuICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuc2V0KF9wb2ludGVySWQyLCBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5nZXQoX3BvaW50ZXJJZDIpIHx8IG51bGwsIGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIF9wb2ludGVyRXZlbnQpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59IC8vIENoZWNrIGlmIHRoaXMgdGFyZ2V0IGlzIHVuYmxvY2tlZC4gUmV0dXJucyB0cnVlIGlmIGl0J3MgdW5ibG9ja2VkLlxuXG5mdW5jdGlvbiBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQocXVldWVkVGFyZ2V0KSB7XG4gIC8vIFRPRE86IFRoaXMgZnVuY3Rpb24gc2hhcmVzIGEgbG90IG9mIGxvZ2ljIHdpdGggYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudC5cbiAgLy8gVHJ5IHRvIHVuaWZ5IHRoZW0uIEl0J3MgYSBiaXQgdHJpY2t5IHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgdHdvIHJldHVyblxuICAvLyB2YWx1ZXMuXG4gIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkICE9PSBudWxsKSB7XG4gICAgICB2YXIgdGFnID0gbmVhcmVzdE1vdW50ZWQudGFnO1xuXG4gICAgICBpZiAodGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSdyZSBibG9ja2VkIG9uIGh5ZHJhdGluZyB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIC8vIEluY3JlYXNlIGl0cyBwcmlvcml0eS5cbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gaW5zdGFuY2U7XG4gICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0UHJpb3JpdHkocXVldWVkVGFyZ2V0LmxhbmVQcmlvcml0eSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID0gZ2V0Q29udGFpbmVyRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKTsgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mXG4gICAgICAgICAgLy8gYSByb290IG90aGVyIHRoYW4gc3luYy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG5cbiAgd2hpbGUgKHRhcmdldENvbnRhaW5lcnMubGVuZ3RoID4gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgIHZhciBuZXh0QmxvY2tlZE9uID0gYXR0ZW1wdFRvRGlzcGF0Y2hFdmVudChxdWV1ZWRFdmVudC5kb21FdmVudE5hbWUsIHF1ZXVlZEV2ZW50LmV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgcXVldWVkRXZlbnQubmF0aXZlRXZlbnQpO1xuXG4gICAgaWYgKG5leHRCbG9ja2VkT24gIT09IG51bGwpIHtcbiAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgIHZhciBfZmliZXIzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKTtcblxuICAgICAgaWYgKF9maWJlcjMgIT09IG51bGwpIHtcbiAgICAgICAgYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24oX2ZpYmVyMyk7XG4gICAgICB9XG5cbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT247XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSAvLyBUaGlzIHRhcmdldCBjb250YWluZXIgd2FzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLiBUcnkgdGhlIG5leHQuXG5cblxuICAgIHRhcmdldENvbnRhaW5lcnMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXAocXVldWVkRXZlbnQsIGtleSwgbWFwKSB7XG4gIGlmIChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSkge1xuICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYXlVbmJsb2NrZWRFdmVudHMoKSB7XG4gIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSBmYWxzZTsgLy8gRmlyc3QgcmVwbGF5IGRpc2NyZXRlIGV2ZW50cy5cblxuICB3aGlsZSAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RGlzY3JldGVFdmVudCA9IHF1ZXVlZERpc2NyZXRlRXZlbnRzWzBdO1xuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIC8vIEluY3JlYXNlIHRoZSBwcmlvcml0eSBvZiB0aGlzIGJvdW5kYXJ5IHRvIHVuYmxvY2tcbiAgICAgIC8vIHRoZSBuZXh0IGRpc2NyZXRlIGV2ZW50LlxuICAgICAgdmFyIF9maWJlcjQgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbik7XG5cbiAgICAgIGlmIChfZmliZXI0ICE9PSBudWxsKSB7XG4gICAgICAgIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24oX2ZpYmVyNCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXRDb250YWluZXJzID0gbmV4dERpc2NyZXRlRXZlbnQudGFyZ2V0Q29udGFpbmVycztcblxuICAgIHdoaWxlICh0YXJnZXRDb250YWluZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciB0YXJnZXRDb250YWluZXIgPSB0YXJnZXRDb250YWluZXJzWzBdO1xuICAgICAgdmFyIG5leHRCbG9ja2VkT24gPSBhdHRlbXB0VG9EaXNwYXRjaEV2ZW50KG5leHREaXNjcmV0ZUV2ZW50LmRvbUV2ZW50TmFtZSwgbmV4dERpc2NyZXRlRXZlbnQuZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuZXh0RGlzY3JldGVFdmVudC5uYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChuZXh0QmxvY2tlZE9uICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlJ3JlIHN0aWxsIGJsb2NrZWQuIFRyeSBhZ2FpbiBsYXRlci5cbiAgICAgICAgbmV4dERpc2NyZXRlRXZlbnQuYmxvY2tlZE9uID0gbmV4dEJsb2NrZWRPbjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IC8vIFRoaXMgdGFyZ2V0IGNvbnRhaW5lciB3YXMgc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQuIFRyeSB0aGUgbmV4dC5cblxuXG4gICAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgfVxuXG4gICAgaWYgKG5leHREaXNjcmV0ZUV2ZW50LmJsb2NrZWRPbiA9PT0gbnVsbCkge1xuICAgICAgLy8gV2UndmUgc3VjY2Vzc2Z1bGx5IHJlcGxheWVkIHRoZSBmaXJzdCBldmVudC4gTGV0J3MgdHJ5IHRoZSBuZXh0IG9uZS5cbiAgICAgIHF1ZXVlZERpc2NyZXRlRXZlbnRzLnNoaWZ0KCk7XG4gICAgfVxuICB9IC8vIE5leHQgcmVwbGF5IGFueSBjb250aW51b3VzIGV2ZW50cy5cblxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEZvY3VzKSkge1xuICAgIHF1ZXVlZEZvY3VzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsICYmIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykpIHtcbiAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWV1ZWRNb3VzZSAhPT0gbnVsbCAmJiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZE1vdXNlKSkge1xuICAgIHF1ZXVlZE1vdXNlID0gbnVsbDtcbiAgfVxuXG4gIHF1ZXVlZFBvaW50ZXJzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgaWYgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkKSB7XG4gICAgcXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbDtcblxuICAgIGlmICghaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9IHRydWU7IC8vIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gYXR0ZW1wdCByZXBsYXlpbmcgYXMgbWFueSBldmVudHMgYXMgYXJlXG4gICAgICAvLyBub3cgdW5ibG9ja2VkLiBUaGlzIGZpcnN0IG1pZ2h0IG5vdCBhY3R1YWxseSBiZSB1bmJsb2NrZWQgeWV0LlxuICAgICAgLy8gV2UgY291bGQgY2hlY2sgaXQgZWFybHkgdG8gYXZvaWQgc2NoZWR1bGluZyBhbiB1bm5lY2Vzc2FyeSBjYWxsYmFjay5cblxuICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LCByZXBsYXlVbmJsb2NrZWRFdmVudHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXRyeUlmQmxvY2tlZE9uKHVuYmxvY2tlZCkge1xuICAvLyBNYXJrIGFueXRoaW5nIHRoYXQgd2FzIGJsb2NrZWQgb24gdGhpcyBhcyBubyBsb25nZXIgYmxvY2tlZFxuICAvLyBhbmQgZWxpZ2libGUgZm9yIGEgcmVwbGF5LlxuICBpZiAocXVldWVkRGlzY3JldGVFdmVudHMubGVuZ3RoID4gMCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWREaXNjcmV0ZUV2ZW50c1swXSwgdW5ibG9ja2VkKTsgLy8gVGhpcyBpcyBhIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgZWFjaCBib3VuZGFyeSB0aGF0IGNvbW1pdHMuIEkgdGhpbmsgaXQnc1xuICAgIC8vIHdvcnRoIGl0IGJlY2F1c2Ugd2UgZXhwZWN0IHZlcnkgZmV3IGRpc2NyZXRlIGV2ZW50cyB0byBxdWV1ZSB1cCBhbmQgb25jZVxuICAgIC8vIHdlIGFyZSBhY3R1YWxseSBmdWxseSB1bmJsb2NrZWQgaXQgd2lsbCBiZSBmYXN0IHRvIHJlcGxheSB0aGVtLlxuXG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBxdWV1ZWREaXNjcmV0ZUV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHF1ZXVlZEV2ZW50ID0gcXVldWVkRGlzY3JldGVFdmVudHNbaV07XG5cbiAgICAgIGlmIChxdWV1ZWRFdmVudC5ibG9ja2VkT24gPT09IHVuYmxvY2tlZCkge1xuICAgICAgICBxdWV1ZWRFdmVudC5ibG9ja2VkT24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChxdWV1ZWRGb2N1cyAhPT0gbnVsbCkge1xuICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgfVxuXG4gIGlmIChxdWV1ZWREcmFnICE9PSBudWxsKSB7XG4gICAgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gIH1cblxuICBpZiAocXVldWVkTW91c2UgIT09IG51bGwpIHtcbiAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gIH1cblxuICB2YXIgdW5ibG9jayA9IGZ1bmN0aW9uIChxdWV1ZWRFdmVudCkge1xuICAgIHJldHVybiBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkRXZlbnQsIHVuYmxvY2tlZCk7XG4gIH07XG5cbiAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaCh1bmJsb2NrKTtcbiAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW19pXTtcblxuICAgIGlmIChxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHdoaWxlIChxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoID4gMCkge1xuICAgIHZhciBuZXh0RXhwbGljaXRUYXJnZXQgPSBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHNbMF07XG5cbiAgICBpZiAobmV4dEV4cGxpY2l0VGFyZ2V0LmJsb2NrZWRPbiAhPT0gbnVsbCkge1xuICAgICAgLy8gV2UncmUgc3RpbGwgYmxvY2tlZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRlbXB0RXhwbGljaXRIeWRyYXRpb25UYXJnZXQobmV4dEV4cGxpY2l0VGFyZ2V0KTtcblxuICAgICAgaWYgKG5leHRFeHBsaWNpdFRhcmdldC5ibG9ja2VkT24gPT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UncmUgdW5ibG9ja2VkLlxuICAgICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIERpc2NyZXRlRXZlbnQgPSAwO1xudmFyIFVzZXJCbG9ja2luZ0V2ZW50ID0gMTtcbnZhciBDb250aW51b3VzRXZlbnQgPSAyO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICByZXR1cm4gcHJlZml4ZXM7XG59XG4vKipcbiAqIEEgbGlzdCBvZiBldmVudCBuYW1lcyB0byBhIGNvbmZpZ3VyYWJsZSBsaXN0IG9mIHZlbmRvciBwcmVmaXhlcy5cbiAqL1xuXG5cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cblxudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xuXG52YXIgc3R5bGUgPSB7fTtcbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7IC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cblxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9IC8vIFNhbWUgYXMgYWJvdmVcblxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG59XG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV2ZW50TmFtZTtcbn1cblxudmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uZW5kJyk7XG52YXIgQU5JTUFUSU9OX0lURVJBVElPTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKTtcbnZhciBBTklNQVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKTtcbnZhciBUUkFOU0lUSU9OX0VORCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJyk7XG5cbnZhciB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKTtcbnZhciBldmVudFByaW9yaXRpZXMgPSBuZXcgTWFwKCk7IC8vIFdlIHN0b3JlIG1vc3Qgb2YgdGhlIGV2ZW50cyBpbiB0aGlzIG1vZHVsZSBpbiBwYWlycyBvZiB0d28gc3RyaW5ncyBzbyB3ZSBjYW4gcmUtdXNlXG4vLyB0aGUgY29kZSByZXF1aXJlZCB0byBhcHBseSB0aGUgc2FtZSBsb2dpYyBmb3IgZXZlbnQgcHJpb3JpdGl6YXRpb24gYW5kIHRoYXQgb2YgdGhlXG4vLyBTaW1wbGVFdmVudFBsdWdpbi4gVGhpcyBjb21wbGljYXRlcyB0aGluZ3Mgc2xpZ2h0bHksIGJ1dCB0aGUgYWltIGlzIHRvIHJlZHVjZSBjb2RlXG4vLyBkdXBsaWNhdGlvbiAoZm9yIHdoaWNoIHRoZXJlIHdvdWxkIGJlIHF1aXRlIGEgYml0KS4gRm9yIHRoZSBldmVudHMgdGhhdCBhcmUgbm90IG5lZWRlZFxuLy8gZm9yIHRoZSBTaW1wbGVFdmVudFBsdWdpbiAob3RoZXJEaXNjcmV0ZUV2ZW50cykgd2UgcHJvY2VzcyB0aGVtIHNlcGFyYXRlbHkgYXMgYW5cbi8vIGFycmF5IG9mIHRvcCBsZXZlbCBldmVudHMuXG4vLyBMYXN0bHksIHdlIGlnbm9yZSBwcmV0dGllciBzbyB3ZSBjYW4ga2VlcCB0aGUgZm9ybWF0dGluZyBzYW5lLlxuLy8gcHJldHRpZXItaWdub3JlXG5cbnZhciBkaXNjcmV0ZUV2ZW50UGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiA9IFsnY2FuY2VsJywgJ2NhbmNlbCcsICdjbGljaycsICdjbGljaycsICdjbG9zZScsICdjbG9zZScsICdjb250ZXh0bWVudScsICdjb250ZXh0TWVudScsICdjb3B5JywgJ2NvcHknLCAnY3V0JywgJ2N1dCcsICdhdXhjbGljaycsICdhdXhDbGljaycsICdkYmxjbGljaycsICdkb3VibGVDbGljaycsIC8vIENhcmVmdWwhXG4nZHJhZ2VuZCcsICdkcmFnRW5kJywgJ2RyYWdzdGFydCcsICdkcmFnU3RhcnQnLCAnZHJvcCcsICdkcm9wJywgJ2ZvY3VzaW4nLCAnZm9jdXMnLCAvLyBDYXJlZnVsIVxuJ2ZvY3Vzb3V0JywgJ2JsdXInLCAvLyBDYXJlZnVsIVxuJ2lucHV0JywgJ2lucHV0JywgJ2ludmFsaWQnLCAnaW52YWxpZCcsICdrZXlkb3duJywgJ2tleURvd24nLCAna2V5cHJlc3MnLCAna2V5UHJlc3MnLCAna2V5dXAnLCAna2V5VXAnLCAnbW91c2Vkb3duJywgJ21vdXNlRG93bicsICdtb3VzZXVwJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGFzdGUnLCAncGF1c2UnLCAncGF1c2UnLCAncGxheScsICdwbGF5JywgJ3BvaW50ZXJjYW5jZWwnLCAncG9pbnRlckNhbmNlbCcsICdwb2ludGVyZG93bicsICdwb2ludGVyRG93bicsICdwb2ludGVydXAnLCAncG9pbnRlclVwJywgJ3JhdGVjaGFuZ2UnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdyZXNldCcsICdzZWVrZWQnLCAnc2Vla2VkJywgJ3N1Ym1pdCcsICdzdWJtaXQnLCAndG91Y2hjYW5jZWwnLCAndG91Y2hDYW5jZWwnLCAndG91Y2hlbmQnLCAndG91Y2hFbmQnLCAndG91Y2hzdGFydCcsICd0b3VjaFN0YXJ0JywgJ3ZvbHVtZWNoYW5nZScsICd2b2x1bWVDaGFuZ2UnXTtcbnZhciBvdGhlckRpc2NyZXRlRXZlbnRzID0gWydjaGFuZ2UnLCAnc2VsZWN0aW9uY2hhbmdlJywgJ3RleHRJbnB1dCcsICdjb21wb3NpdGlvbnN0YXJ0JywgJ2NvbXBvc2l0aW9uZW5kJywgJ2NvbXBvc2l0aW9udXBkYXRlJ107XG5cblxudmFyIHVzZXJCbG9ja2luZ1BhaXJzRm9yU2ltcGxlRXZlbnRQbHVnaW4gPSBbJ2RyYWcnLCAnZHJhZycsICdkcmFnZW50ZXInLCAnZHJhZ0VudGVyJywgJ2RyYWdleGl0JywgJ2RyYWdFeGl0JywgJ2RyYWdsZWF2ZScsICdkcmFnTGVhdmUnLCAnZHJhZ292ZXInLCAnZHJhZ092ZXInLCAnbW91c2Vtb3ZlJywgJ21vdXNlTW92ZScsICdtb3VzZW91dCcsICdtb3VzZU91dCcsICdtb3VzZW92ZXInLCAnbW91c2VPdmVyJywgJ3BvaW50ZXJtb3ZlJywgJ3BvaW50ZXJNb3ZlJywgJ3BvaW50ZXJvdXQnLCAncG9pbnRlck91dCcsICdwb2ludGVyb3ZlcicsICdwb2ludGVyT3ZlcicsICdzY3JvbGwnLCAnc2Nyb2xsJywgJ3RvZ2dsZScsICd0b2dnbGUnLCAndG91Y2htb3ZlJywgJ3RvdWNoTW92ZScsICd3aGVlbCcsICd3aGVlbCddOyAvLyBwcmV0dGllci1pZ25vcmVcblxudmFyIGNvbnRpbnVvdXNQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luID0gWydhYm9ydCcsICdhYm9ydCcsIEFOSU1BVElPTl9FTkQsICdhbmltYXRpb25FbmQnLCBBTklNQVRJT05fSVRFUkFUSU9OLCAnYW5pbWF0aW9uSXRlcmF0aW9uJywgQU5JTUFUSU9OX1NUQVJULCAnYW5pbWF0aW9uU3RhcnQnLCAnY2FucGxheScsICdjYW5QbGF5JywgJ2NhbnBsYXl0aHJvdWdoJywgJ2NhblBsYXlUaHJvdWdoJywgJ2R1cmF0aW9uY2hhbmdlJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2Vycm9yJywgJ2dvdHBvaW50ZXJjYXB0dXJlJywgJ2dvdFBvaW50ZXJDYXB0dXJlJywgJ2xvYWQnLCAnbG9hZCcsICdsb2FkZWRkYXRhJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkbWV0YWRhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZHN0YXJ0JywgJ2xvYWRTdGFydCcsICdsb3N0cG9pbnRlcmNhcHR1cmUnLCAnbG9zdFBvaW50ZXJDYXB0dXJlJywgJ3BsYXlpbmcnLCAncGxheWluZycsICdwcm9ncmVzcycsICdwcm9ncmVzcycsICdzZWVraW5nJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAnc3VzcGVuZCcsICd0aW1ldXBkYXRlJywgJ3RpbWVVcGRhdGUnLCBUUkFOU0lUSU9OX0VORCwgJ3RyYW5zaXRpb25FbmQnLCAnd2FpdGluZycsICd3YWl0aW5nJ107XG4vKipcbiAqIFR1cm5zXG4gKiBbJ2Fib3J0JywgLi4uXVxuICpcbiAqIGludG9cbiAqXG4gKiB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoW1xuICogICBbJ2Fib3J0JywgJ29uQWJvcnQnXSxcbiAqIF0pO1xuICpcbiAqIGFuZCByZWdpc3RlcnMgdGhlbS5cbiAqL1xuXG5mdW5jdGlvbiByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhldmVudFR5cGVzLCBwcmlvcml0eSkge1xuICAvLyBBcyB0aGUgZXZlbnQgdHlwZXMgYXJlIGluIHBhaXJzIG9mIHR3bywgd2UgbmVlZCB0byBpdGVyYXRlXG4gIC8vIHRocm91Z2ggaW4gdHdvcy4gVGhlIGV2ZW50cyBhcmUgaW4gcGFpcnMgb2YgdHdvIHRvIHNhdmUgY29kZVxuICAvLyBhbmQgaW1wcm92ZSBpbml0IHBlcmYgb2YgcHJvY2Vzc2luZyB0aGlzIGFycmF5LCBhcyBpdCB3aWxsXG4gIC8vIHJlc3VsdCBpbiBmYXIgZmV3ZXIgb2JqZWN0IGFsbG9jYXRpb25zIGFuZCBwcm9wZXJ0eSBhY2Nlc3Nlc1xuICAvLyBpZiB3ZSBvbmx5IHVzZSB0aHJlZSBhcnJheXMgdG8gcHJvY2VzcyBhbGwgdGhlIGNhdGVnb3JpZXMgb2ZcbiAgLy8gaW5zdGVhZCBvZiB0dXBsZXMuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciB0b3BFdmVudCA9IGV2ZW50VHlwZXNbaV07XG4gICAgdmFyIGV2ZW50ID0gZXZlbnRUeXBlc1tpICsgMV07XG4gICAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gICAgdmFyIHJlYWN0TmFtZSA9ICdvbicgKyBjYXBpdGFsaXplZEV2ZW50O1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQodG9wRXZlbnQsIHByaW9yaXR5KTtcbiAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5zZXQodG9wRXZlbnQsIHJlYWN0TmFtZSk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlYWN0TmFtZSwgW3RvcEV2ZW50XSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0RXZlbnRQcmlvcml0aWVzKGV2ZW50VHlwZXMsIHByaW9yaXR5KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgIGV2ZW50UHJpb3JpdGllcy5zZXQoZXZlbnRUeXBlc1tpXSwgcHJpb3JpdHkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJpb3JpdHlGb3JQbHVnaW5TeXN0ZW0oZG9tRXZlbnROYW1lKSB7XG4gIHZhciBwcmlvcml0eSA9IGV2ZW50UHJpb3JpdGllcy5nZXQoZG9tRXZlbnROYW1lKTsgLy8gRGVmYXVsdCB0byBhIENvbnRpbnVvdXNFdmVudC4gTm90ZTogd2UgbWlnaHRcbiAgLy8gd2FudCB0byB3YXJuIGlmIHdlIGNhbid0IGRldGVjdCB0aGUgcHJpb3JpdHlcbiAgLy8gZm9yIHRoZSBldmVudC5cblxuICByZXR1cm4gcHJpb3JpdHkgPT09IHVuZGVmaW5lZCA/IENvbnRpbnVvdXNFdmVudCA6IHByaW9yaXR5O1xufVxuZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudHMoKSB7XG4gIHJlZ2lzdGVyU2ltcGxlUGx1Z2luRXZlbnRzQW5kU2V0VGhlaXJQcmlvcml0aWVzKGRpc2NyZXRlRXZlbnRQYWlyc0ZvclNpbXBsZUV2ZW50UGx1Z2luLCBEaXNjcmV0ZUV2ZW50KTtcbiAgcmVnaXN0ZXJTaW1wbGVQbHVnaW5FdmVudHNBbmRTZXRUaGVpclByaW9yaXRpZXModXNlckJsb2NraW5nUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgVXNlckJsb2NraW5nRXZlbnQpO1xuICByZWdpc3RlclNpbXBsZVBsdWdpbkV2ZW50c0FuZFNldFRoZWlyUHJpb3JpdGllcyhjb250aW51b3VzUGFpcnNGb3JTaW1wbGVFdmVudFBsdWdpbiwgQ29udGludW91c0V2ZW50KTtcbiAgc2V0RXZlbnRQcmlvcml0aWVzKG90aGVyRGlzY3JldGVFdmVudHMsIERpc2NyZXRlRXZlbnQpO1xufVxuXG52YXIgU2NoZWR1bGVyX25vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3c7XG5cbntcbiAgLy8gUHJvdmlkZSBleHBsaWNpdCBlcnJvciBtZXNzYWdlIHdoZW4gcHJvZHVjdGlvbitwcm9maWxpbmcgYnVuZGxlIG9mIGUuZy5cbiAgLy8gcmVhY3QtZG9tIGlzIHVzZWQgd2l0aCBwcm9kdWN0aW9uIChub24tcHJvZmlsaW5nKSBidW5kbGUgb2ZcbiAgLy8gc2NoZWR1bGVyL3RyYWNpbmdcbiAgaWYgKCEodHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZiAhPSBudWxsICYmIHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCAhPSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gcnVuIHRoZSBwcm9maWxpbmcgdmVyc2lvbiBvZiBhIHJlbmRlcmVyIChmb3IgZXhhbXBsZSwgYHJlYWN0LWRvbS9wcm9maWxpbmdgKSB3aXRob3V0IGFsc28gcmVwbGFjaW5nIHRoZSBgc2NoZWR1bGVyL3RyYWNpbmdgIG1vZHVsZSB3aXRoIGBzY2hlZHVsZXIvdHJhY2luZy1wcm9maWxpbmdgLiBZb3VyIGJ1bmRsZXIgbWlnaHQgaGF2ZSBhIHNldHRpbmcgZm9yIGFsaWFzaW5nIGJvdGggbW9kdWxlcy4gTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcHJvZmlsaW5nXCIgKTtcbiAgICB9XG4gIH1cbn1cbi8vIGFzY2VuZGluZyBudW1iZXJzIHNvIHdlIGNhbiBjb21wYXJlIHRoZW0gbGlrZSBudW1iZXJzLiBUaGV5IHN0YXJ0IGF0IDkwIHRvXG4vLyBhdm9pZCBjbGFzaGluZyB3aXRoIFNjaGVkdWxlcidzIHByaW9yaXRpZXMuXG5cbnZhciBJbW1lZGlhdGVQcmlvcml0eSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5ID0gOTg7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSA5NztcbnZhciBMb3dQcmlvcml0eSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSA9IDk1OyAvLyBOb1ByaW9yaXR5IGlzIHRoZSBhYnNlbmNlIG9mIHByaW9yaXR5LiBBbHNvIFJlYWN0LW9ubHkuXG5cbnZhciBOb1ByaW9yaXR5ID0gOTA7XG52YXIgaW5pdGlhbFRpbWVNcyA9IFNjaGVkdWxlcl9ub3coKTsgLy8gSWYgdGhlIGluaXRpYWwgdGltZXN0YW1wIGlzIHJlYXNvbmFibHkgc21hbGwsIHVzZSBTY2hlZHVsZXIncyBgbm93YCBkaXJlY3RseS5cblxudmFyIFN5bmNMYW5lUHJpb3JpdHkgPSAxNTtcbnZhciBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSA9IDE0O1xudmFyIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAxMztcbnZhciBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5ID0gMTI7XG52YXIgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5ID0gMTE7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5ID0gMTA7XG52YXIgRGVmYXVsdEh5ZHJhdGlvbkxhbmVQcmlvcml0eSA9IDk7XG52YXIgRGVmYXVsdExhbmVQcmlvcml0eSA9IDg7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvblByaW9yaXR5ID0gNztcbnZhciBUcmFuc2l0aW9uUHJpb3JpdHkgPSA2O1xudmFyIFJldHJ5TGFuZVByaW9yaXR5ID0gNTtcbnZhciBTZWxlY3RpdmVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSA0O1xudmFyIElkbGVIeWRyYXRpb25MYW5lUHJpb3JpdHkgPSAzO1xudmFyIElkbGVMYW5lUHJpb3JpdHkgPSAyO1xudmFyIE9mZnNjcmVlbkxhbmVQcmlvcml0eSA9IDE7XG52YXIgTm9MYW5lUHJpb3JpdHkgPSAwO1xudmFyIFRvdGFsTGFuZXMgPSAzMTtcbnZhciBOb0xhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjA7XG52YXIgTm9MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuMDtcbnZhciBTeW5jTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4xO1xudmFyIFN5bmNCYXRjaGVkTGFuZSA9XG4vKiAgICAgICAgICAgICAgICAgKi9cbjI7XG52YXIgSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAqL1xuNDtcbnZhciBJbnB1dERpc2NyZXRlTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgICovXG4yNDtcbnZhciBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAqL1xuMzI7XG52YXIgSW5wdXRDb250aW51b3VzTGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAqL1xuMTkyO1xudmFyIERlZmF1bHRIeWRyYXRpb25MYW5lID1cbi8qICAgICAgICAgICAgKi9cbjI1NjtcbnZhciBEZWZhdWx0TGFuZXMgPVxuLyogICAgICAgICAgICAgICAgICAgKi9cbjM1ODQ7XG52YXIgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAgKi9cbjQwOTY7XG52YXIgVHJhbnNpdGlvbkxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuNDE4NjExMjtcbnZhciBSZXRyeUxhbmVzID1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG42MjkxNDU2MDtcbnZhciBTb21lUmV0cnlMYW5lID1cbi8qICAgICAgICAgICAgICAgICAgKi9cbjMzNTU0NDMyO1xudmFyIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgKi9cbjY3MTA4ODY0O1xudmFyIE5vbklkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4xMzQyMTc3Mjc7XG52YXIgSWRsZUh5ZHJhdGlvbkxhbmUgPVxuLyogICAgICAgICAgICAgICAqL1xuMTM0MjE3NzI4O1xudmFyIElkbGVMYW5lcyA9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbjgwNTMwNjM2ODtcbnZhciBPZmZzY3JlZW5MYW5lID1cbi8qICAgICAgICAgICAgICAgICAgICovXG4xMDczNzQxODI0O1xudmFyIE5vVGltZXN0YW1wID0gLTE7XG5mdW5jdGlvbiBzZXRDdXJyZW50VXBkYXRlTGFuZVByaW9yaXR5KG5ld0xhbmVQcmlvcml0eSkge1xufSAvLyBcIlJlZ2lzdGVyc1wiIHVzZWQgdG8gXCJyZXR1cm5cIiBtdWx0aXBsZSB2YWx1ZXNcbi8vIFVzZWQgYnkgZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMgYW5kIGdldE5leHRMYW5lczpcblxudmFyIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gRGVmYXVsdExhbmVQcmlvcml0eTtcblxuZnVuY3Rpb24gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobGFuZXMpIHtcbiAgaWYgKChTeW5jTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gU3luY0xhbmU7XG4gIH1cblxuICBpZiAoKFN5bmNCYXRjaGVkTGFuZSAmIGxhbmVzKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIFN5bmNCYXRjaGVkTGFuZTtcbiAgfVxuXG4gIGlmICgoSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmUgJiBsYW5lcykgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0RGlzY3JldGVMYW5lcyA9IElucHV0RGlzY3JldGVMYW5lcyAmIGxhbmVzO1xuXG4gIGlmIChpbnB1dERpc2NyZXRlTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIGlucHV0RGlzY3JldGVMYW5lcztcbiAgfVxuXG4gIGlmICgobGFuZXMgJiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBJbnB1dENvbnRpbnVvdXNIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIGlucHV0Q29udGludW91c0xhbmVzID0gSW5wdXRDb250aW51b3VzTGFuZXMgJiBsYW5lcztcblxuICBpZiAoaW5wdXRDb250aW51b3VzTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaW5wdXRDb250aW51b3VzTGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgRGVmYXVsdEh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBEZWZhdWx0SHlkcmF0aW9uTGFuZTtcbiAgfVxuXG4gIHZhciBkZWZhdWx0TGFuZXMgPSBEZWZhdWx0TGFuZXMgJiBsYW5lcztcblxuICBpZiAoZGVmYXVsdExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBEZWZhdWx0TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBkZWZhdWx0TGFuZXM7XG4gIH1cblxuICBpZiAoKGxhbmVzICYgVHJhbnNpdGlvbkh5ZHJhdGlvbkxhbmUpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBUcmFuc2l0aW9uSHlkcmF0aW9uUHJpb3JpdHk7XG4gICAgcmV0dXJuIFRyYW5zaXRpb25IeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgdmFyIHRyYW5zaXRpb25MYW5lcyA9IFRyYW5zaXRpb25MYW5lcyAmIGxhbmVzO1xuXG4gIGlmICh0cmFuc2l0aW9uTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFRyYW5zaXRpb25Qcmlvcml0eTtcbiAgICByZXR1cm4gdHJhbnNpdGlvbkxhbmVzO1xuICB9XG5cbiAgdmFyIHJldHJ5TGFuZXMgPSBSZXRyeUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKHJldHJ5TGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IFJldHJ5TGFuZVByaW9yaXR5O1xuICAgIHJldHVybiByZXRyeUxhbmVzO1xuICB9XG5cbiAgaWYgKGxhbmVzICYgU2VsZWN0aXZlSHlkcmF0aW9uTGFuZSkge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZVByaW9yaXR5O1xuICAgIHJldHVybiBTZWxlY3RpdmVIeWRyYXRpb25MYW5lO1xuICB9XG5cbiAgaWYgKChsYW5lcyAmIElkbGVIeWRyYXRpb25MYW5lKSAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gSWRsZUh5ZHJhdGlvbkxhbmU7XG4gIH1cblxuICB2YXIgaWRsZUxhbmVzID0gSWRsZUxhbmVzICYgbGFuZXM7XG5cbiAgaWYgKGlkbGVMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gSWRsZUxhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gaWRsZUxhbmVzO1xuICB9XG5cbiAgaWYgKChPZmZzY3JlZW5MYW5lICYgbGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBPZmZzY3JlZW5MYW5lUHJpb3JpdHk7XG4gICAgcmV0dXJuIE9mZnNjcmVlbkxhbmU7XG4gIH1cblxuICB7XG4gICAgZXJyb3IoJ1Nob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICB9IC8vIFRoaXMgc2hvdWxkbid0IGJlIHJlYWNoYWJsZSwgYnV0IGFzIGEgZmFsbGJhY2ssIHJldHVybiB0aGUgZW50aXJlIGJpdG1hc2suXG5cblxuICByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eSA9IERlZmF1bHRMYW5lUHJpb3JpdHk7XG4gIHJldHVybiBsYW5lcztcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAoc2NoZWR1bGVyUHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0xhbmVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBOb3JtYWxQcmlvcml0eTpcbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgLy8gVE9ETzogSGFuZGxlIExvd1NjaGVkdWxlclByaW9yaXR5LCBzb21laG93LiBNYXliZSB0aGUgc2FtZSBsYW5lIGFzIGh5ZHJhdGlvbi5cbiAgICAgIHJldHVybiBEZWZhdWx0TGFuZVByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSWRsZUxhbmVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gTm9MYW5lUHJpb3JpdHk7XG4gIH1cbn1cbmZ1bmN0aW9uIGxhbmVQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkobGFuZVByaW9yaXR5KSB7XG4gIHN3aXRjaCAobGFuZVByaW9yaXR5KSB7XG4gICAgY2FzZSBTeW5jTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gSW1tZWRpYXRlUHJpb3JpdHk7XG5cbiAgICBjYXNlIElucHV0RGlzY3JldGVIeWRyYXRpb25MYW5lUHJpb3JpdHk6XG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuXG4gICAgY2FzZSBEZWZhdWx0SHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgRGVmYXVsdExhbmVQcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25IeWRyYXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTpcbiAgICBjYXNlIFNlbGVjdGl2ZUh5ZHJhdGlvbkxhbmVQcmlvcml0eTpcbiAgICBjYXNlIFJldHJ5TGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBJZGxlSHlkcmF0aW9uTGFuZVByaW9yaXR5OlxuICAgIGNhc2UgSWRsZUxhbmVQcmlvcml0eTpcbiAgICBjYXNlIE9mZnNjcmVlbkxhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJZGxlUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vTGFuZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vUHJpb3JpdHk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiSW52YWxpZCB1cGRhdGUgcHJpb3JpdHk6IFwiICsgbGFuZVByaW9yaXR5ICsgXCIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cbmZ1bmN0aW9uIGdldE5leHRMYW5lcyhyb290LCB3aXBMYW5lcykge1xuICAvLyBFYXJseSBiYWlsb3V0IGlmIHRoZXJlJ3Mgbm8gcGVuZGluZyB3b3JrIGxlZnQuXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcblxuICBpZiAocGVuZGluZ0xhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICByZXR1cm4gTm9MYW5lcztcbiAgfVxuXG4gIHZhciBuZXh0TGFuZXMgPSBOb0xhbmVzO1xuICB2YXIgbmV4dExhbmVQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB2YXIgZXhwaXJlZExhbmVzID0gcm9vdC5leHBpcmVkTGFuZXM7XG4gIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXM7XG4gIHZhciBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7IC8vIENoZWNrIGlmIGFueSB3b3JrIGhhcyBleHBpcmVkLlxuXG4gIGlmIChleHBpcmVkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICBuZXh0TGFuZXMgPSBleHBpcmVkTGFuZXM7XG4gICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gU3luY0xhbmVQcmlvcml0eTtcbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgd29yayBvbiBhbnkgaWRsZSB3b3JrIHVudGlsIGFsbCB0aGUgbm9uLWlkbGUgd29yayBoYXMgZmluaXNoZWQsXG4gICAgLy8gZXZlbiBpZiB0aGUgd29yayBpcyBzdXNwZW5kZWQuXG4gICAgdmFyIG5vbklkbGVQZW5kaW5nTGFuZXMgPSBwZW5kaW5nTGFuZXMgJiBOb25JZGxlTGFuZXM7XG5cbiAgICBpZiAobm9uSWRsZVBlbmRpbmdMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgdmFyIG5vbklkbGVVbmJsb2NrZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXM7XG5cbiAgICAgIGlmIChub25JZGxlVW5ibG9ja2VkTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIG5vbklkbGVQaW5nZWRMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiBwaW5nZWRMYW5lcztcblxuICAgICAgICBpZiAobm9uSWRsZVBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMobm9uSWRsZVBpbmdlZExhbmVzKTtcbiAgICAgICAgICBuZXh0TGFuZVByaW9yaXR5ID0gcmV0dXJuX2hpZ2hlc3RMYW5lUHJpb3JpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIG9ubHkgcmVtYWluaW5nIHdvcmsgaXMgSWRsZS5cbiAgICAgIHZhciB1bmJsb2NrZWRMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIH5zdXNwZW5kZWRMYW5lcztcblxuICAgICAgaWYgKHVuYmxvY2tlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHVuYmxvY2tlZExhbmVzKTtcbiAgICAgICAgbmV4dExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHBpbmdlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgICAgbmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpO1xuICAgICAgICAgIG5leHRMYW5lUHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChuZXh0TGFuZXMgPT09IE5vTGFuZXMpIHtcbiAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoYWJsZSBpZiB3ZSdyZSBzdXNwZW5kZWRcbiAgICAvLyBUT0RPOiBDb25zaWRlciB3YXJuaW5nIGluIHRoaXMgcGF0aCBpZiBhIGZhbGxiYWNrIHRpbWVyIGlzIG5vdCBzY2hlZHVsZWQuXG4gICAgcmV0dXJuIE5vTGFuZXM7XG4gIH0gLy8gSWYgdGhlcmUgYXJlIGhpZ2hlciBwcmlvcml0eSBsYW5lcywgd2UnbGwgaW5jbHVkZSB0aGVtIGV2ZW4gaWYgdGhleVxuICAvLyBhcmUgc3VzcGVuZGVkLlxuXG5cbiAgbmV4dExhbmVzID0gcGVuZGluZ0xhbmVzICYgZ2V0RXF1YWxPckhpZ2hlclByaW9yaXR5TGFuZXMobmV4dExhbmVzKTsgLy8gSWYgd2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVuZGVyLCBzd2l0Y2hpbmcgbGFuZXMgd2lsbCBpbnRlcnJ1cHRcbiAgLy8gaXQgYW5kIHdlJ2xsIGxvc2Ugb3VyIHByb2dyZXNzLiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHRoZSBuZXcgbGFuZXMgYXJlXG4gIC8vIGhpZ2hlciBwcmlvcml0eS5cblxuICBpZiAod2lwTGFuZXMgIT09IE5vTGFuZXMgJiYgd2lwTGFuZXMgIT09IG5leHRMYW5lcyAmJiAvLyBJZiB3ZSBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHRoZW4gaW50ZXJydXB0aW5nIGlzIGZpbmUuIERvbid0XG4gIC8vIGJvdGhlciB3YWl0aW5nIHVudGlsIHRoZSByb290IGlzIGNvbXBsZXRlLlxuICAod2lwTGFuZXMgJiBzdXNwZW5kZWRMYW5lcykgPT09IE5vTGFuZXMpIHtcbiAgICBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyh3aXBMYW5lcyk7XG4gICAgdmFyIHdpcExhbmVQcmlvcml0eSA9IHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xuXG4gICAgaWYgKG5leHRMYW5lUHJpb3JpdHkgPD0gd2lwTGFuZVByaW9yaXR5KSB7XG4gICAgICByZXR1cm4gd2lwTGFuZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5ID0gbmV4dExhbmVQcmlvcml0eTtcbiAgICB9XG4gIH0gLy8gQ2hlY2sgZm9yIGVudGFuZ2xlZCBsYW5lcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGJhdGNoLlxuICAvL1xuICAvLyBBIGxhbmUgaXMgc2FpZCB0byBiZSBlbnRhbmdsZWQgd2l0aCBhbm90aGVyIHdoZW4gaXQncyBub3QgYWxsb3dlZCB0byByZW5kZXJcbiAgLy8gaW4gYSBiYXRjaCB0aGF0IGRvZXMgbm90IGFsc28gaW5jbHVkZSB0aGUgb3RoZXIgbGFuZS4gVHlwaWNhbGx5IHdlIGRvIHRoaXNcbiAgLy8gd2hlbiBtdWx0aXBsZSB1cGRhdGVzIGhhdmUgdGhlIHNhbWUgc291cmNlLCBhbmQgd2Ugb25seSB3YW50IHRvIHJlc3BvbmQgdG9cbiAgLy8gdGhlIG1vc3QgcmVjZW50IGV2ZW50IGZyb20gdGhhdCBzb3VyY2UuXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB3ZSBhcHBseSBlbnRhbmdsZW1lbnRzICphZnRlciogY2hlY2tpbmcgZm9yIHBhcnRpYWwgd29yayBhYm92ZS5cbiAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIGEgbGFuZSBpcyBlbnRhbmdsZWQgZHVyaW5nIGFuIGludGVybGVhdmVkIGV2ZW50IHdoaWxlXG4gIC8vIGl0J3MgYWxyZWFkeSByZW5kZXJpbmcsIHdlIHdvbid0IGludGVycnVwdCBpdC4gVGhpcyBpcyBpbnRlbnRpb25hbCwgc2luY2VcbiAgLy8gZW50YW5nbGVtZW50IGlzIHVzdWFsbHkgXCJiZXN0IGVmZm9ydFwiOiB3ZSdsbCB0cnkgb3VyIGJlc3QgdG8gcmVuZGVyIHRoZVxuICAvLyBsYW5lcyBpbiB0aGUgc2FtZSBiYXRjaCwgYnV0IGl0J3Mgbm90IHdvcnRoIHRocm93aW5nIG91dCBwYXJ0aWFsbHlcbiAgLy8gY29tcGxldGVkIHdvcmsgaW4gb3JkZXIgdG8gZG8gaXQuXG4gIC8vXG4gIC8vIEZvciB0aG9zZSBleGNlcHRpb25zIHdoZXJlIGVudGFuZ2xlbWVudCBpcyBzZW1hbnRpY2FsbHkgaW1wb3J0YW50LCBsaWtlXG4gIC8vIHVzZU11dGFibGVTb3VyY2UsIHdlIHNob3VsZCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwYXJ0aWFsIHdvcmsgYXQgdGhlXG4gIC8vIHRpbWUgd2UgYXBwbHkgdGhlIGVudGFuZ2xlbWVudC5cblxuXG4gIHZhciBlbnRhbmdsZWRMYW5lcyA9IHJvb3QuZW50YW5nbGVkTGFuZXM7XG5cbiAgaWYgKGVudGFuZ2xlZExhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgdmFyIGVudGFuZ2xlbWVudHMgPSByb290LmVudGFuZ2xlbWVudHM7XG4gICAgdmFyIGxhbmVzID0gbmV4dExhbmVzICYgZW50YW5nbGVkTGFuZXM7XG5cbiAgICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgIG5leHRMYW5lcyB8PSBlbnRhbmdsZW1lbnRzW2luZGV4XTtcbiAgICAgIGxhbmVzICY9IH5sYW5lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0TGFuZXM7XG59XG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50RXZlbnRUaW1lKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBldmVudFRpbWVzID0gcm9vdC5ldmVudFRpbWVzO1xuICB2YXIgbW9zdFJlY2VudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgdmFyIGV2ZW50VGltZSA9IGV2ZW50VGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV2ZW50VGltZSA+IG1vc3RSZWNlbnRFdmVudFRpbWUpIHtcbiAgICAgIG1vc3RSZWNlbnRFdmVudFRpbWUgPSBldmVudFRpbWU7XG4gICAgfVxuXG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cblxuICByZXR1cm4gbW9zdFJlY2VudEV2ZW50VGltZTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IEV4cGlyYXRpb24gaGV1cmlzdGljIGlzIGNvbnN0YW50IHBlciBsYW5lLCBzbyBjb3VsZCB1c2UgYSBtYXAuXG4gIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmUpO1xuICB2YXIgcHJpb3JpdHkgPSByZXR1cm5faGlnaGVzdExhbmVQcmlvcml0eTtcblxuICBpZiAocHJpb3JpdHkgPj0gSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5KSB7XG4gICAgLy8gVXNlciBpbnRlcmFjdGlvbnMgc2hvdWxkIGV4cGlyZSBzbGlnaHRseSBtb3JlIHF1aWNrbHkuXG4gICAgLy9cbiAgICAvLyBOT1RFOiBUaGlzIGlzIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBjb25zdGFudCBhcyBpbiBTY2hlZHVsZXIuanMuIFdoZW5cbiAgICAvLyB3ZSBtYWRlIGl0IGxhcmdlciwgYSBwcm9kdWN0IG1ldHJpYyBpbiB3d3cgcmVncmVzc2VkLCBzdWdnZXN0aW5nIHRoZXJlJ3NcbiAgICAvLyBhIHVzZXIgaW50ZXJhY3Rpb24gdGhhdCdzIGJlaW5nIHN0YXJ2ZWQgYnkgYSBzZXJpZXMgb2Ygc3luY2hyb25vdXNcbiAgICAvLyB1cGRhdGVzLiBJZiB0aGF0IHRoZW9yeSBpcyBjb3JyZWN0LCB0aGUgcHJvcGVyIHNvbHV0aW9uIGlzIHRvIGZpeCB0aGVcbiAgICAvLyBzdGFydmF0aW9uLiBIb3dldmVyLCB0aGlzIHNjZW5hcmlvIHN1cHBvcnRzIHRoZSBpZGVhIHRoYXQgZXhwaXJhdGlvblxuICAgIC8vIHRpbWVzIGFyZSBhbiBpbXBvcnRhbnQgc2FmZWd1YXJkIHdoZW4gc3RhcnZhdGlvbiBkb2VzIGhhcHBlbi5cbiAgICAvL1xuICAgIC8vIEFsc28gbm90ZSB0aGF0LCBpbiB0aGUgY2FzZSBvZiB1c2VyIGlucHV0IHNwZWNpZmljYWxseSwgdGhpcyB3aWxsIHNvb24gbm9cbiAgICAvLyBsb25nZXIgYmUgYW4gaXNzdWUgYmVjYXVzZSB3ZSBwbGFuIHRvIG1ha2UgdXNlciBpbnB1dCBzeW5jaHJvbm91cyBieVxuICAgIC8vIGRlZmF1bHQgKHVudGlsIHlvdSBlbnRlciBgc3RhcnRUcmFuc2l0aW9uYCwgb2YgY291cnNlLilcbiAgICAvL1xuICAgIC8vIElmIHdlcmVuJ3QgcGxhbm5pbmcgdG8gbWFrZSB0aGVzZSB1cGRhdGVzIHN5bmNocm9ub3VzIHNvb24gYW55d2F5LCBJXG4gICAgLy8gd291bGQgcHJvYmFibHkgbWFrZSB0aGlzIG51bWJlciBhIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuXG4gICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuICB9IGVsc2UgaWYgKHByaW9yaXR5ID49IFRyYW5zaXRpb25Qcmlvcml0eSkge1xuICAgIHJldHVybiBjdXJyZW50VGltZSArIDUwMDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gQW55dGhpbmcgaWRsZSBwcmlvcml0eSBvciBsb3dlciBzaG91bGQgbmV2ZXIgZXhwaXJlLlxuICAgIHJldHVybiBOb1RpbWVzdGFtcDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrU3RhcnZlZExhbmVzQXNFeHBpcmVkKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gIC8vIFRPRE86IFRoaXMgZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB3ZSB5aWVsZC4gV2UgY2FuIG9wdGltaXplIGJ5IHN0b3JpbmdcbiAgLy8gdGhlIGVhcmxpZXN0IGV4cGlyYXRpb24gdGltZSBvbiB0aGUgcm9vdC4gVGhlbiB1c2UgdGhhdCB0byBxdWlja2x5IGJhaWwgb3V0XG4gIC8vIG9mIHRoaXMgZnVuY3Rpb24uXG4gIHZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgdmFyIHN1c3BlbmRlZExhbmVzID0gcm9vdC5zdXNwZW5kZWRMYW5lcztcbiAgdmFyIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgdmFyIGV4cGlyYXRpb25UaW1lcyA9IHJvb3QuZXhwaXJhdGlvblRpbWVzOyAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHBlbmRpbmcgbGFuZXMgYW5kIGNoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlaXJcbiAgLy8gZXhwaXJhdGlvbiB0aW1lLiBJZiBzbywgd2UnbGwgYXNzdW1lIHRoZSB1cGRhdGUgaXMgYmVpbmcgc3RhcnZlZCBhbmQgbWFya1xuICAvLyBpdCBhcyBleHBpcmVkIHRvIGZvcmNlIGl0IHRvIGZpbmlzaC5cblxuICB2YXIgbGFuZXMgPSBwZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICB2YXIgZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZXNbaW5kZXhdO1xuXG4gICAgaWYgKGV4cGlyYXRpb25UaW1lID09PSBOb1RpbWVzdGFtcCkge1xuICAgICAgLy8gRm91bmQgYSBwZW5kaW5nIGxhbmUgd2l0aCBubyBleHBpcmF0aW9uIHRpbWUuIElmIGl0J3Mgbm90IHN1c3BlbmRlZCwgb3JcbiAgICAgIC8vIGlmIGl0J3MgcGluZ2VkLCBhc3N1bWUgaXQncyBDUFUtYm91bmQuIENvbXB1dGUgYSBuZXcgZXhwaXJhdGlvbiB0aW1lXG4gICAgICAvLyB1c2luZyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgaWYgKChsYW5lICYgc3VzcGVuZGVkTGFuZXMpID09PSBOb0xhbmVzIHx8IChsYW5lICYgcGluZ2VkTGFuZXMpICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIC8vIEFzc3VtZXMgdGltZXN0YW1wcyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLlxuICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaGlzIGxhbmUgZXhwaXJlZFxuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgfD0gbGFuZTtcbiAgICB9XG5cbiAgICBsYW5lcyAmPSB+bGFuZTtcbiAgfVxufSAvLyBUaGlzIHJldHVybnMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcGVuZGluZyBsYW5lcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleVxuZnVuY3Rpb24gZ2V0TGFuZXNUb1JldHJ5U3luY2hyb25vdXNseU9uRXJyb3Iocm9vdCkge1xuICB2YXIgZXZlcnl0aGluZ0J1dE9mZnNjcmVlbiA9IHJvb3QucGVuZGluZ0xhbmVzICYgfk9mZnNjcmVlbkxhbmU7XG5cbiAgaWYgKGV2ZXJ5dGhpbmdCdXRPZmZzY3JlZW4gIT09IE5vTGFuZXMpIHtcbiAgICByZXR1cm4gZXZlcnl0aGluZ0J1dE9mZnNjcmVlbjtcbiAgfVxuXG4gIGlmIChldmVyeXRoaW5nQnV0T2Zmc2NyZWVuICYgT2Zmc2NyZWVuTGFuZSkge1xuICAgIHJldHVybiBPZmZzY3JlZW5MYW5lO1xuICB9XG5cbiAgcmV0dXJuIE5vTGFuZXM7XG59XG5mdW5jdGlvbiByZXR1cm5OZXh0TGFuZXNQcmlvcml0eSgpIHtcbiAgcmV0dXJuIHJldHVybl9oaWdoZXN0TGFuZVByaW9yaXR5O1xufVxuZnVuY3Rpb24gaW5jbHVkZXNOb25JZGxlV29yayhsYW5lcykge1xuICByZXR1cm4gKGxhbmVzICYgTm9uSWRsZUxhbmVzKSAhPT0gTm9MYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVJldHJpZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIFJldHJ5TGFuZXMpID09PSBsYW5lcztcbn1cbmZ1bmN0aW9uIGluY2x1ZGVzT25seVRyYW5zaXRpb25zKGxhbmVzKSB7XG4gIHJldHVybiAobGFuZXMgJiBUcmFuc2l0aW9uTGFuZXMpID09PSBsYW5lcztcbn0gLy8gVG8gZW5zdXJlIGNvbnNpc3RlbmN5IGFjcm9zcyBtdWx0aXBsZSB1cGRhdGVzIGluIHRoZSBzYW1lIGV2ZW50LCB0aGlzIHNob3VsZFxuLy8gYmUgYSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFVwZGF0ZUxhbmUobGFuZVByaW9yaXR5LCB3aXBMYW5lcykge1xuICBzd2l0Y2ggKGxhbmVQcmlvcml0eSkge1xuICAgIGNhc2UgTm9MYW5lUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3luY0xhbmVQcmlvcml0eTpcbiAgICAgIHJldHVybiBTeW5jTGFuZTtcblxuICAgIGNhc2UgU3luY0JhdGNoZWRMYW5lUHJpb3JpdHk6XG4gICAgICByZXR1cm4gU3luY0JhdGNoZWRMYW5lO1xuXG4gICAgY2FzZSBJbnB1dERpc2NyZXRlTGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJbnB1dERpc2NyZXRlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgIGlmIChfbGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgLy8gU2hpZnQgdG8gdGhlIG5leHQgcHJpb3JpdHkgbGV2ZWxcbiAgICAgICAgICByZXR1cm4gZmluZFVwZGF0ZUxhbmUoSW5wdXRDb250aW51b3VzTGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmU7XG4gICAgICB9XG5cbiAgICBjYXNlIElucHV0Q29udGludW91c0xhbmVQcmlvcml0eTpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9sYW5lMiA9IHBpY2tBcmJpdHJhcnlMYW5lKElucHV0Q29udGludW91c0xhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUyID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBTaGlmdCB0byB0aGUgbmV4dCBwcmlvcml0eSBsZXZlbFxuICAgICAgICAgIHJldHVybiBmaW5kVXBkYXRlTGFuZShEZWZhdWx0TGFuZVByaW9yaXR5LCB3aXBMYW5lcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2xhbmUyO1xuICAgICAgfVxuXG4gICAgY2FzZSBEZWZhdWx0TGFuZVByaW9yaXR5OlxuICAgICAge1xuICAgICAgICB2YXIgX2xhbmUzID0gcGlja0FyYml0cmFyeUxhbmUoRGVmYXVsdExhbmVzICYgfndpcExhbmVzKTtcblxuICAgICAgICBpZiAoX2xhbmUzID09PSBOb0xhbmUpIHtcbiAgICAgICAgICAvLyBJZiBhbGwgdGhlIGRlZmF1bHQgbGFuZXMgYXJlIGFscmVhZHkgYmVpbmcgd29ya2VkIG9uLCBsb29rIGZvciBhXG4gICAgICAgICAgLy8gbGFuZSBpbiB0aGUgdHJhbnNpdGlvbiByYW5nZS5cbiAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICAgICAgaWYgKF9sYW5lMyA9PT0gTm9MYW5lKSB7XG4gICAgICAgICAgICAvLyBBbGwgdGhlIHRyYW5zaXRpb24gbGFuZXMgYXJlIHRha2VuLCB0b28uIFRoaXMgc2hvdWxkIGJlIHZlcnlcbiAgICAgICAgICAgIC8vIHJhcmUsIGJ1dCBhcyBhIGxhc3QgcmVzb3J0LCBwaWNrIGEgZGVmYXVsdCBsYW5lLiBUaGlzIHdpbGwgaGF2ZVxuICAgICAgICAgICAgLy8gdGhlIGVmZmVjdCBvZiBpbnRlcnJ1cHRpbmcgdGhlIGN1cnJlbnQgd29yay1pbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgICAgICBfbGFuZTMgPSBwaWNrQXJiaXRyYXJ5TGFuZShEZWZhdWx0TGFuZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfbGFuZTM7XG4gICAgICB9XG5cbiAgICBjYXNlIFRyYW5zaXRpb25Qcmlvcml0eTogLy8gU2hvdWxkIGJlIGhhbmRsZWQgYnkgZmluZFRyYW5zaXRpb25MYW5lIGluc3RlYWRcblxuICAgIGNhc2UgUmV0cnlMYW5lUHJpb3JpdHk6XG4gICAgICAvLyBTaG91bGQgYmUgaGFuZGxlZCBieSBmaW5kUmV0cnlMYW5lIGluc3RlYWRcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlTGFuZVByaW9yaXR5OlxuICAgICAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShJZGxlTGFuZXMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGFuZTtcbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIHVwZGF0ZSBwcmlvcml0eTogXCIgKyBsYW5lUHJpb3JpdHkgKyBcIi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIiApO1xuICAgIH1cbiAgfVxufSAvLyBUbyBlbnN1cmUgY29uc2lzdGVuY3kgYWNyb3NzIG11bHRpcGxlIHVwZGF0ZXMgaW4gdGhlIHNhbWUgZXZlbnQsIHRoaXMgc2hvdWxkXG4vLyBiZSBwdXJlIGZ1bmN0aW9uLCBzbyB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIHRoZSBzYW1lIGxhbmUgZm9yIGdpdmVuIGlucHV0cy5cblxuZnVuY3Rpb24gZmluZFRyYW5zaXRpb25MYW5lKHdpcExhbmVzLCBwZW5kaW5nTGFuZXMpIHtcbiAgLy8gRmlyc3QgbG9vayBmb3IgbGFuZXMgdGhhdCBhcmUgY29tcGxldGVseSB1bmNsYWltZWQsIGkuZS4gaGF2ZSBub1xuICAvLyBwZW5kaW5nIHdvcmsuXG4gIHZhciBsYW5lID0gcGlja0FyYml0cmFyeUxhbmUoVHJhbnNpdGlvbkxhbmVzICYgfnBlbmRpbmdMYW5lcyk7XG5cbiAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgIC8vIElmIGFsbCBsYW5lcyBoYXZlIHBlbmRpbmcgd29yaywgbG9vayBmb3IgYSBsYW5lIHRoYXQgaXNuJ3QgY3VycmVudGx5XG4gICAgLy8gYmVpbmcgd29ya2VkIG9uLlxuICAgIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShUcmFuc2l0aW9uTGFuZXMgJiB+d2lwTGFuZXMpO1xuXG4gICAgaWYgKGxhbmUgPT09IE5vTGFuZSkge1xuICAgICAgLy8gSWYgZXZlcnl0aGluZyBpcyBiZWluZyB3b3JrZWQgb24sIHBpY2sgYW55IGxhbmUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCB3b3JrLWluLXByb2dyZXNzLlxuICAgICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFRyYW5zaXRpb25MYW5lcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59IC8vIFRvIGVuc3VyZSBjb25zaXN0ZW5jeSBhY3Jvc3MgbXVsdGlwbGUgdXBkYXRlcyBpbiB0aGUgc2FtZSBldmVudCwgdGhpcyBzaG91bGRcbi8vIGJlIHB1cmUgZnVuY3Rpb24sIHNvIHRoYXQgaXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgbGFuZSBmb3IgZ2l2ZW4gaW5wdXRzLlxuXG5mdW5jdGlvbiBmaW5kUmV0cnlMYW5lKHdpcExhbmVzKSB7XG4gIC8vIFRoaXMgaXMgYSBmb3JrIG9mIGBmaW5kVXBkYXRlTGFuZWAgZGVzaWduZWQgc3BlY2lmaWNhbGx5IGZvciBTdXNwZW5zZVxuICAvLyBcInJldHJpZXNcIiDigJQgYSBzcGVjaWFsIHVwZGF0ZSB0aGF0IGF0dGVtcHRzIHRvIGZsaXAgYSBTdXNwZW5zZSBib3VuZGFyeVxuICAvLyBmcm9tIGl0cyBwbGFjZWhvbGRlciBzdGF0ZSB0byBpdHMgcHJpbWFyeS9yZXNvbHZlZCBzdGF0ZS5cbiAgdmFyIGxhbmUgPSBwaWNrQXJiaXRyYXJ5TGFuZShSZXRyeUxhbmVzICYgfndpcExhbmVzKTtcblxuICBpZiAobGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKFJldHJ5TGFuZXMpO1xuICB9XG5cbiAgcmV0dXJuIGxhbmU7XG59XG5cbmZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgcmV0dXJuIGxhbmVzICYgLWxhbmVzO1xufVxuXG5mdW5jdGlvbiBnZXRMb3dlc3RQcmlvcml0eUxhbmUobGFuZXMpIHtcbiAgLy8gVGhpcyBmaW5kcyB0aGUgbW9zdCBzaWduaWZpY2FudCBub24temVybyBiaXQuXG4gIHZhciBpbmRleCA9IDMxIC0gY2x6MzIobGFuZXMpO1xuICByZXR1cm4gaW5kZXggPCAwID8gTm9MYW5lcyA6IDEgPDwgaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdldEVxdWFsT3JIaWdoZXJQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gIHJldHVybiAoZ2V0TG93ZXN0UHJpb3JpdHlMYW5lKGxhbmVzKSA8PCAxKSAtIDE7XG59XG5cbmZ1bmN0aW9uIHBpY2tBcmJpdHJhcnlMYW5lKGxhbmVzKSB7XG4gIC8vIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBnZXRzIGlubGluZWQuIE9ubHkgZXhpc3RzIHNvIHRvIGNvbW11bmljYXRlIHRoYXQgaXRcbiAgLy8gZG9lc24ndCBtYXR0ZXIgd2hpY2ggYml0IGlzIHNlbGVjdGVkOyB5b3UgY2FuIHBpY2sgYW55IGJpdCB3aXRob3V0XG4gIC8vIGFmZmVjdGluZyB0aGUgYWxnb3JpdGhtcyB3aGVyZSBpdHMgdXNlZC4gSGVyZSBJJ20gdXNpbmdcbiAgLy8gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZSBiZWNhdXNlIGl0IHJlcXVpcmVzIHRoZSBmZXdlc3Qgb3BlcmF0aW9ucy5cbiAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUxhbmUobGFuZXMpO1xufVxuXG5mdW5jdGlvbiBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKSB7XG4gIHJldHVybiAzMSAtIGNsejMyKGxhbmVzKTtcbn1cblxuZnVuY3Rpb24gbGFuZVRvSW5kZXgobGFuZSkge1xuICByZXR1cm4gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lKTtcbn1cblxuZnVuY3Rpb24gaW5jbHVkZXNTb21lTGFuZShhLCBiKSB7XG4gIHJldHVybiAoYSAmIGIpICE9PSBOb0xhbmVzO1xufVxuZnVuY3Rpb24gaXNTdWJzZXRPZkxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiAoc2V0ICYgc3Vic2V0KSA9PT0gc3Vic2V0O1xufVxuZnVuY3Rpb24gbWVyZ2VMYW5lcyhhLCBiKSB7XG4gIHJldHVybiBhIHwgYjtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxhbmVzKHNldCwgc3Vic2V0KSB7XG4gIHJldHVybiBzZXQgJiB+c3Vic2V0O1xufSAvLyBTZWVtcyByZWR1bmRhbnQsIGJ1dCBpdCBjaGFuZ2VzIHRoZSB0eXBlIGZyb20gYSBzaW5nbGUgbGFuZSAodXNlZCBmb3Jcbi8vIHVwZGF0ZXMpIHRvIGEgZ3JvdXAgb2YgbGFuZXMgKHVzZWQgZm9yIGZsdXNoaW5nIHdvcmspLlxuXG5mdW5jdGlvbiBsYW5lVG9MYW5lcyhsYW5lKSB7XG4gIHJldHVybiBsYW5lO1xufVxuZnVuY3Rpb24gaGlnaGVyUHJpb3JpdHlMYW5lKGEsIGIpIHtcbiAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBiaXQgcmFuZ2VzIGRlY3JlYXNlIGluIHByaW9yaXR5IGFzIHlvdSBnbyBsZWZ0LlxuICByZXR1cm4gYSAhPT0gTm9MYW5lICYmIGEgPCBiID8gYSA6IGI7XG59XG5mdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgLy8gSW50ZW50aW9uYWxseSBwdXNoaW5nIG9uZSBieSBvbmUuXG4gIC8vIGh0dHBzOi8vdjguZGV2L2Jsb2cvZWxlbWVudHMta2luZHMjYXZvaWQtY3JlYXRpbmctaG9sZXNcbiAgdmFyIGxhbmVNYXAgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IFRvdGFsTGFuZXM7IGkrKykge1xuICAgIGxhbmVNYXAucHVzaChpbml0aWFsKTtcbiAgfVxuXG4gIHJldHVybiBsYW5lTWFwO1xufVxuZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkKHJvb3QsIHVwZGF0ZUxhbmUsIGV2ZW50VGltZSkge1xuICByb290LnBlbmRpbmdMYW5lcyB8PSB1cGRhdGVMYW5lOyAvLyBUT0RPOiBUaGVvcmV0aWNhbGx5LCBhbnkgdXBkYXRlIHRvIGFueSBsYW5lIGNhbiB1bmJsb2NrIGFueSBvdGhlciBsYW5lLiBCdXRcbiAgLy8gaXQncyBub3QgcHJhY3RpY2FsIHRvIHRyeSBldmVyeSBzaW5nbGUgcG9zc2libGUgY29tYmluYXRpb24uIFdlIG5lZWQgYVxuICAvLyBoZXVyaXN0aWMgdG8gZGVjaWRlIHdoaWNoIGxhbmVzIHRvIGF0dGVtcHQgdG8gcmVuZGVyLCBhbmQgaW4gd2hpY2ggYmF0Y2hlcy5cbiAgLy8gRm9yIG5vdywgd2UgdXNlIHRoZSBzYW1lIGhldXJpc3RpYyBhcyBpbiB0aGUgb2xkIEV4cGlyYXRpb25UaW1lcyBtb2RlbDpcbiAgLy8gcmV0cnkgYW55IGxhbmUgYXQgZXF1YWwgb3IgbG93ZXIgcHJpb3JpdHksIGJ1dCBkb24ndCB0cnkgdXBkYXRlcyBhdCBoaWdoZXJcbiAgLy8gcHJpb3JpdHkgd2l0aG91dCBhbHNvIGluY2x1ZGluZyB0aGUgbG93ZXIgcHJpb3JpdHkgdXBkYXRlcy4gVGhpcyB3b3JrcyB3ZWxsXG4gIC8vIHdoZW4gY29uc2lkZXJpbmcgdXBkYXRlcyBhY3Jvc3MgZGlmZmVyZW50IHByaW9yaXR5IGxldmVscywgYnV0IGlzbid0XG4gIC8vIHN1ZmZpY2llbnQgZm9yIHVwZGF0ZXMgd2l0aGluIHRoZSBzYW1lIHByaW9yaXR5LCBzaW5jZSB3ZSB3YW50IHRvIHRyZWF0XG4gIC8vIHRob3NlIHVwZGF0ZXMgYXMgcGFyYWxsZWwuXG4gIC8vIFVuc3VzcGVuZCBhbnkgdXBkYXRlIGF0IGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5LlxuXG4gIHZhciBoaWdoZXJQcmlvcml0eUxhbmVzID0gdXBkYXRlTGFuZSAtIDE7IC8vIFR1cm5zIDBiMTAwMCBpbnRvIDBiMDExMVxuXG4gIHJvb3Quc3VzcGVuZGVkTGFuZXMgJj0gaGlnaGVyUHJpb3JpdHlMYW5lcztcbiAgcm9vdC5waW5nZWRMYW5lcyAmPSBoaWdoZXJQcmlvcml0eUxhbmVzO1xuICB2YXIgZXZlbnRUaW1lcyA9IHJvb3QuZXZlbnRUaW1lcztcbiAgdmFyIGluZGV4ID0gbGFuZVRvSW5kZXgodXBkYXRlTGFuZSk7IC8vIFdlIGNhbiBhbHdheXMgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHRpbWVzdGFtcCBiZWNhdXNlIHdlIHByZWZlciB0aGUgbW9zdFxuICAvLyByZWNlbnQgZXZlbnQsIGFuZCB3ZSBhc3N1bWUgdGltZSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuXG5cbiAgZXZlbnRUaW1lc1tpbmRleF0gPSBldmVudFRpbWU7XG59XG5mdW5jdGlvbiBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBzdXNwZW5kZWRMYW5lcykge1xuICByb290LnN1c3BlbmRlZExhbmVzIHw9IHN1c3BlbmRlZExhbmVzO1xuICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lczsgLy8gVGhlIHN1c3BlbmRlZCBsYW5lcyBhcmUgbm8gbG9uZ2VyIENQVS1ib3VuZC4gQ2xlYXIgdGhlaXIgZXhwaXJhdGlvbiB0aW1lcy5cblxuICB2YXIgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXM7XG4gIHZhciBsYW5lcyA9IHN1c3BlbmRlZExhbmVzO1xuXG4gIHdoaWxlIChsYW5lcyA+IDApIHtcbiAgICB2YXIgaW5kZXggPSBwaWNrQXJiaXRyYXJ5TGFuZUluZGV4KGxhbmVzKTtcbiAgICB2YXIgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgZXhwaXJhdGlvblRpbWVzW2luZGV4XSA9IE5vVGltZXN0YW1wO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG5mdW5jdGlvbiBtYXJrUm9vdFBpbmdlZChyb290LCBwaW5nZWRMYW5lcywgZXZlbnRUaW1lKSB7XG4gIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xufVxuZnVuY3Rpb24gbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCkge1xuICByb290LmV4cGlyZWRMYW5lcyB8PSBJbnB1dERpc2NyZXRlTGFuZXMgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIGhhc0Rpc2NyZXRlTGFuZXMobGFuZXMpIHtcbiAgcmV0dXJuIChsYW5lcyAmIElucHV0RGlzY3JldGVMYW5lcykgIT09IE5vTGFuZXM7XG59XG5mdW5jdGlvbiBtYXJrUm9vdE11dGFibGVSZWFkKHJvb3QsIHVwZGF0ZUxhbmUpIHtcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzIHw9IHVwZGF0ZUxhbmUgJiByb290LnBlbmRpbmdMYW5lcztcbn1cbmZ1bmN0aW9uIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpIHtcbiAgdmFyIG5vTG9uZ2VyUGVuZGluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7IC8vIExldCdzIHRyeSBldmVyeXRoaW5nIGFnYWluXG5cbiAgcm9vdC5zdXNwZW5kZWRMYW5lcyA9IDA7XG4gIHJvb3QucGluZ2VkTGFuZXMgPSAwO1xuICByb290LmV4cGlyZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgcm9vdC5tdXRhYmxlUmVhZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICB2YXIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cztcbiAgdmFyIGV2ZW50VGltZXMgPSByb290LmV2ZW50VGltZXM7XG4gIHZhciBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lczsgLy8gQ2xlYXIgdGhlIGxhbmVzIHRoYXQgbm8gbG9uZ2VyIGhhdmUgcGVuZGluZyB3b3JrXG5cbiAgdmFyIGxhbmVzID0gbm9Mb25nZXJQZW5kaW5nTGFuZXM7XG5cbiAgd2hpbGUgKGxhbmVzID4gMCkge1xuICAgIHZhciBpbmRleCA9IHBpY2tBcmJpdHJhcnlMYW5lSW5kZXgobGFuZXMpO1xuICAgIHZhciBsYW5lID0gMSA8PCBpbmRleDtcbiAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IE5vTGFuZXM7XG4gICAgZXZlbnRUaW1lc1tpbmRleF0gPSBOb1RpbWVzdGFtcDtcbiAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gTm9UaW1lc3RhbXA7XG4gICAgbGFuZXMgJj0gfmxhbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGVudGFuZ2xlZExhbmVzKSB7XG4gIHJvb3QuZW50YW5nbGVkTGFuZXMgfD0gZW50YW5nbGVkTGFuZXM7XG4gIHZhciBlbnRhbmdsZW1lbnRzID0gcm9vdC5lbnRhbmdsZW1lbnRzO1xuICB2YXIgbGFuZXMgPSBlbnRhbmdsZWRMYW5lcztcblxuICB3aGlsZSAobGFuZXMgPiAwKSB7XG4gICAgdmFyIGluZGV4ID0gcGlja0FyYml0cmFyeUxhbmVJbmRleChsYW5lcyk7XG4gICAgdmFyIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgIGVudGFuZ2xlbWVudHNbaW5kZXhdIHw9IGVudGFuZ2xlZExhbmVzO1xuICAgIGxhbmVzICY9IH5sYW5lO1xuICB9XG59XG52YXIgY2x6MzIgPSBNYXRoLmNsejMyID8gTWF0aC5jbHozMiA6IGNsejMyRmFsbGJhY2s7IC8vIENvdW50IGxlYWRpbmcgemVyb3MuIE9ubHkgdXNlZCBvbiBsYW5lcywgc28gYXNzdW1lIGlucHV0IGlzIGFuIGludGVnZXIuXG4vLyBCYXNlZCBvbjpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvY2x6MzJcblxudmFyIGxvZyA9IE1hdGgubG9nO1xudmFyIExOMiA9IE1hdGguTE4yO1xuXG5mdW5jdGlvbiBjbHozMkZhbGxiYWNrKGxhbmVzKSB7XG4gIGlmIChsYW5lcyA9PT0gMCkge1xuICAgIHJldHVybiAzMjtcbiAgfVxuXG4gIHJldHVybiAzMSAtIChsb2cobGFuZXMpIC8gTE4yIHwgMCkgfCAwO1xufVxuXG4vLyBJbnRlbnRpb25hbGx5IG5vdCBuYW1lZCBpbXBvcnRzIGJlY2F1c2UgUm9sbHVwIHdvdWxkIHVzZSBkeW5hbWljIGRpc3BhdGNoIGZvclxudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksXG4gICAgcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eTsgLy8gVE9ETzogY2FuIHdlIHN0b3AgZXhwb3J0aW5nIHRoZXNlP1xuXG52YXIgX2VuYWJsZWQgPSB0cnVlOyAvLyBUaGlzIGlzIGV4cG9ydGVkIGluIEZCIGJ1aWxkcyBmb3IgdXNlIGJ5IGxlZ2FjeSBGQiBsYXllciBpbmZyYS5cbi8vIFdlJ2QgbGlrZSB0byByZW1vdmUgdGhpcyBidXQgaXQncyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzYWZlLlxuXG5mdW5jdGlvbiBzZXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgX2VuYWJsZWQgPSAhIWVuYWJsZWQ7XG59XG5mdW5jdGlvbiBpc0VuYWJsZWQoKSB7XG4gIHJldHVybiBfZW5hYmxlZDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50TGlzdGVuZXJXcmFwcGVyV2l0aFByaW9yaXR5KHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBldmVudFByaW9yaXR5ID0gZ2V0RXZlbnRQcmlvcml0eUZvclBsdWdpblN5c3RlbShkb21FdmVudE5hbWUpO1xuICB2YXIgbGlzdGVuZXJXcmFwcGVyO1xuXG4gIHN3aXRjaCAoZXZlbnRQcmlvcml0eSkge1xuICAgIGNhc2UgRGlzY3JldGVFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBVc2VyQmxvY2tpbmdFdmVudDpcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIENvbnRpbnVvdXNFdmVudDpcbiAgICBkZWZhdWx0OlxuICAgICAgbGlzdGVuZXJXcmFwcGVyID0gZGlzcGF0Y2hFdmVudDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RlbmVyV3JhcHBlci5iaW5kKG51bGwsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKTtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNJZk5lZWRlZChuYXRpdmVFdmVudC50aW1lU3RhbXApO1xuICB9XG5cbiAgZGlzY3JldGVVcGRhdGVzKGRpc3BhdGNoRXZlbnQsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoVXNlckJsb2NraW5nVXBkYXRlKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICB7XG4gICAgcnVuV2l0aFByaW9yaXR5KFVzZXJCbG9ja2luZ1ByaW9yaXR5JDEsIGRpc3BhdGNoRXZlbnQuYmluZChudWxsLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGNvbnRhaW5lciwgbmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCkge1xuICBpZiAoIV9lbmFibGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFsbG93UmVwbGF5ID0gdHJ1ZTtcblxuICB7XG4gICAgLy8gVE9ETzogcmVwbGF5aW5nIGNhcHR1cmUgcGhhc2UgZXZlbnRzIGlzIGN1cnJlbnRseSBicm9rZW5cbiAgICAvLyBiZWNhdXNlIHdlIHVzZWQgdG8gZG8gaXQgZHVyaW5nIHRvcC1sZXZlbCBuYXRpdmUgYnViYmxlIGhhbmRsZXJzXG4gICAgLy8gYnV0IG5vdyB3ZSB1c2UgZGlmZmVyZW50IGJ1YmJsZSBhbmQgY2FwdHVyZSBoYW5kbGVycy5cbiAgICAvLyBJbiBlYWdlciBtb2RlLCB3ZSBhdHRhY2ggY2FwdHVyZSBsaXN0ZW5lcnMgZWFybHksIHNvIHdlIG5lZWRcbiAgICAvLyB0byBmaWx0ZXIgdGhlbSBvdXQgdW50aWwgd2UgZml4IHRoZSBsb2dpYyB0byBoYW5kbGUgdGhlbSBjb3JyZWN0bHkuXG4gICAgLy8gVGhpcyBjb3VsZCd2ZSBiZWVuIG91dHNpZGUgdGhlIGZsYWcgYnV0IEkgcHV0IGl0IGluc2lkZSB0byByZWR1Y2Ugcmlzay5cbiAgICBhbGxvd1JlcGxheSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgPT09IDA7XG4gIH1cblxuICBpZiAoYWxsb3dSZXBsYXkgJiYgaGFzUXVldWVkRGlzY3JldGVFdmVudHMoKSAmJiBpc1JlcGxheWFibGVEaXNjcmV0ZUV2ZW50KGRvbUV2ZW50TmFtZSkpIHtcbiAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBxdWV1ZSBvZiBkaXNjcmV0ZSBldmVudHMsIGFuZCB0aGlzIGlzIGFub3RoZXIgZGlzY3JldGVcbiAgICAvLyBldmVudCwgdGhlbiB3ZSBjYW4ndCBkaXNwYXRjaCBpdCByZWdhcmRsZXNzIG9mIGl0cyB0YXJnZXQsIHNpbmNlIHRoZXlcbiAgICAvLyBuZWVkIHRvIGRpc3BhdGNoIGluIG9yZGVyLlxuICAgIHF1ZXVlRGlzY3JldGVFdmVudChudWxsLCAvLyBGbGFncyB0aGF0IHdlJ3JlIG5vdCBhY3R1YWxseSBibG9ja2VkIG9uIGFueXRoaW5nIGFzIGZhciBhcyB3ZSBrbm93LlxuICAgIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGJsb2NrZWRPbiA9IGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcblxuICBpZiAoYmxvY2tlZE9uID09PSBudWxsKSB7XG4gICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGRpc3BhdGNoZWQgdGhpcyBldmVudC5cbiAgICBpZiAoYWxsb3dSZXBsYXkpIHtcbiAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFsbG93UmVwbGF5KSB7XG4gICAgaWYgKGlzUmVwbGF5YWJsZURpc2NyZXRlRXZlbnQoZG9tRXZlbnROYW1lKSkge1xuICAgICAgLy8gVGhpcyB0aGlzIHRvIGJlIHJlcGxheWVkIGxhdGVyIG9uY2UgdGhlIHRhcmdldCBpcyBhdmFpbGFibGUuXG4gICAgICBxdWV1ZURpc2NyZXRlRXZlbnQoYmxvY2tlZE9uLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lciwgbmF0aXZlRXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChxdWV1ZUlmQ29udGludW91c0V2ZW50KGJsb2NrZWRPbiwgZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2UgbmVlZCB0byBjbGVhciBvbmx5IGlmIHdlIGRpZG4ndCBxdWV1ZSBiZWNhdXNlXG4gICAgLy8gcXVldWVpbmcgaXMgYWNjdW1tdWxhdGl2ZS5cblxuXG4gICAgY2xlYXJJZkNvbnRpbnVvdXNFdmVudChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KTtcbiAgfSAvLyBUaGlzIGlzIG5vdCByZXBsYXlhYmxlIHNvIHdlJ2xsIGludm9rZSBpdCBidXQgd2l0aG91dCBhIHRhcmdldCxcbiAgLy8gaW4gY2FzZSB0aGUgZXZlbnQgc3lzdGVtIG5lZWRzIHRvIHRyYWNlIGl0LlxuXG5cbiAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIG51bGwsIHRhcmdldENvbnRhaW5lcik7XG59IC8vIEF0dGVtcHQgZGlzcGF0Y2hpbmcgYW4gZXZlbnQuIFJldHVybnMgYSBTdXNwZW5zZUluc3RhbmNlIG9yIENvbnRhaW5lciBpZiBpdCdzIGJsb2NrZWQuXG5cbmZ1bmN0aW9uIGF0dGVtcHRUb0Rpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIsIG5hdGl2ZUV2ZW50KSB7XG4gIC8vIFRPRE86IFdhcm4gaWYgX2VuYWJsZWQgaXMgZmFsc2UuXG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKHRhcmdldEluc3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuXG4gICAgaWYgKG5lYXJlc3RNb3VudGVkID09PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIHRyZWUgaGFzIGJlZW4gdW5tb3VudGVkIGFscmVhZHkuIERpc3BhdGNoIHdpdGhvdXQgYSB0YXJnZXQuXG4gICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcblxuICAgICAgaWYgKHRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0U3VzcGVuc2VJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG5cbiAgICAgICAgaWYgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIGV2ZW50IHRvIGJlIHJlcGxheWVkIGxhdGVyLiBBYm9ydCBkaXNwYXRjaGluZyBzaW5jZSB3ZVxuICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhpcyBldmVudCBkaXNwYXRjaGVkIHR3aWNlIHRocm91Z2ggdGhlIGV2ZW50IHN5c3RlbS5cbiAgICAgICAgICAvLyBUT0RPOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXNjcmV0ZSBldmVudCBpbiB0aGUgcXVldWUuIFNjaGVkdWxlIGFuIGluY3JlYXNlZFxuICAgICAgICAgIC8vIHByaW9yaXR5IGZvciB0aGlzIGJvdW5kYXJ5LlxuICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgfSAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIHNvbWV0aGluZyB3ZW50IHdyb25nIGJ1dCB0byBhdm9pZCBibG9ja2luZ1xuICAgICAgICAvLyB0aGUgd2hvbGUgc3lzdGVtLCBkaXNwYXRjaCB0aGUgZXZlbnQgd2l0aG91dCBhIHRhcmdldC5cbiAgICAgICAgLy8gVE9ETzogV2Fybi5cblxuXG4gICAgICAgIHRhcmdldEluc3QgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RSb290KSB7XG4gICAgICAgIHZhciByb290ID0gbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAvLyBJZiB0aGlzIGhhcHBlbnMgZHVyaW5nIGEgcmVwbGF5IHNvbWV0aGluZyB3ZW50IHdyb25nIGFuZCBpdCBtaWdodCBibG9ja1xuICAgICAgICAgIC8vIHRoZSB3aG9sZSBzeXN0ZW0uXG4gICAgICAgICAgcmV0dXJuIGdldENvbnRhaW5lckZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE1vdW50ZWQgIT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgLy8gSWYgd2UgZ2V0IGFuIGV2ZW50IChleDogaW1nIG9ubG9hZCkgYmVmb3JlIGNvbW1pdHRpbmcgdGhhdFxuICAgICAgICAvLyBjb21wb25lbnQncyBtb3VudCwgaWdub3JlIGl0IGZvciBub3cgKHRoYXQgaXMsIHRyZWF0IGl0IGFzIGlmIGl0IHdhcyBhblxuICAgICAgICAvLyBldmVudCBvbiBhIG5vbi1SZWFjdCB0cmVlKS4gV2UgbWlnaHQgYWxzbyBjb25zaWRlciBxdWV1ZWluZyBldmVudHMgYW5kXG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIHRoZW0gYWZ0ZXIgdGhlIG1vdW50LlxuICAgICAgICB0YXJnZXRJbnN0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBkaXNwYXRjaEV2ZW50Rm9yUGx1Z2luRXZlbnRTeXN0ZW0oZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBuYXRpdmVFdmVudCwgdGFyZ2V0SW5zdCwgdGFyZ2V0Q29udGFpbmVyKTsgLy8gV2UncmUgbm90IGJsb2NrZWQgb24gYW55dGhpbmcuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRDYXB0dXJlTGlzdGVuZXIodGFyZ2V0LCBldmVudFR5cGUsIGxpc3RlbmVyKSB7XG4gIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHRydWUpO1xuICByZXR1cm4gbGlzdGVuZXI7XG59XG5mdW5jdGlvbiBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIGNhcHR1cmU6IHRydWUsXG4gICAgcGFzc2l2ZTogcGFzc2l2ZVxuICB9KTtcbiAgcmV0dXJuIGxpc3RlbmVyO1xufVxuZnVuY3Rpb24gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXQsIGV2ZW50VHlwZSwgbGlzdGVuZXIsIHBhc3NpdmUpIHtcbiAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwge1xuICAgIHBhc3NpdmU6IHBhc3NpdmVcbiAgfSk7XG4gIHJldHVybiBsaXN0ZW5lcjtcbn1cblxuLyoqXG4gKiBUaGVzZSB2YXJpYWJsZXMgc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgdGV4dCBjb250ZW50IG9mIGEgdGFyZ2V0IG5vZGUsXG4gKiBhbGxvd2luZyBjb21wYXJpc29uIG9mIGNvbnRlbnQgYmVmb3JlIGFuZCBhZnRlciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIElkZW50aWZ5IHRoZSBub2RlIHdoZXJlIHNlbGVjdGlvbiBjdXJyZW50bHkgYmVnaW5zLCB0aGVuIG9ic2VydmVcbiAqIGJvdGggaXRzIHRleHQgY29udGVudCBhbmQgaXRzIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIERPTS4gU2luY2UgdGhlXG4gKiBicm93c2VyIG1heSBuYXRpdmVseSByZXBsYWNlIHRoZSB0YXJnZXQgbm9kZSBkdXJpbmcgY29tcG9zaXRpb24sIHdlIGNhblxuICogdXNlIGl0cyBwb3NpdGlvbiB0byBmaW5kIGl0cyByZXBsYWNlbWVudC5cbiAqXG4gKlxuICovXG52YXIgcm9vdCA9IG51bGw7XG52YXIgc3RhcnRUZXh0ID0gbnVsbDtcbnZhciBmYWxsYmFja1RleHQgPSBudWxsO1xuZnVuY3Rpb24gaW5pdGlhbGl6ZShuYXRpdmVFdmVudFRhcmdldCkge1xuICByb290ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gIHN0YXJ0VGV4dCA9IGdldFRleHQoKTtcbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiByZXNldCgpIHtcbiAgcm9vdCA9IG51bGw7XG4gIHN0YXJ0VGV4dCA9IG51bGw7XG4gIGZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5mdW5jdGlvbiBnZXREYXRhKCkge1xuICBpZiAoZmFsbGJhY2tUZXh0KSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbiAgfVxuXG4gIHZhciBzdGFydDtcbiAgdmFyIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQ7XG4gIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICB2YXIgZW5kO1xuICB2YXIgZW5kVmFsdWUgPSBnZXRUZXh0KCk7XG4gIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgc3RhcnRMZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG5cbiAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgIGlmIChzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSAhPT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICBmYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgcmV0dXJuIGZhbGxiYWNrVGV4dDtcbn1cbmZ1bmN0aW9uIGdldFRleHQoKSB7XG4gIGlmICgndmFsdWUnIGluIHJvb3QpIHtcbiAgICByZXR1cm4gcm9vdC52YWx1ZTtcbiAgfVxuXG4gIHJldHVybiByb290LnRleHRDb250ZW50O1xufVxuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBjaGFyQ29kZTtcbiAgdmFyIGtleUNvZGUgPSBuYXRpdmVFdmVudC5rZXlDb2RlO1xuXG4gIGlmICgnY2hhckNvZGUnIGluIG5hdGl2ZUV2ZW50KSB7XG4gICAgY2hhckNvZGUgPSBuYXRpdmVFdmVudC5jaGFyQ29kZTsgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfSAvLyBJRSBhbmQgRWRnZSAob24gV2luZG93cykgYW5kIENocm9tZSAvIFNhZmFyaSAob24gV2luZG93cyBhbmQgTGludXgpXG4gIC8vIHJlcG9ydCBFbnRlciBhcyBjaGFyQ29kZSAxMCB3aGVuIGN0cmwgaXMgcHJlc3NlZC5cblxuXG4gIGlmIChjaGFyQ29kZSA9PT0gMTApIHtcbiAgICBjaGFyQ29kZSA9IDEzO1xuICB9IC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuXG5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGZ1bmN0aW9uVGhhdFJldHVybnNGYWxzZSgpIHtcbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYSBmYWN0b3J5IHNvIHRoYXQgd2UgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuZWQgY29uc3RydWN0b3JzLlxuLy8gSWYgd2UgaGFkIGEgc2luZ2xlIGNvbnN0cnVjdG9yLCBpdCB3b3VsZCBiZSBtZWdhbW9ycGhpYyBhbmQgZW5naW5lcyB3b3VsZCBkZW9wdC5cblxuXG5mdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgLyoqXG4gICAqIFN5bnRoZXRpYyBldmVudHMgYXJlIGRpc3BhdGNoZWQgYnkgZXZlbnQgcGx1Z2lucywgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIGFcbiAgICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAgICpcbiAgICogVGhlc2Ugc3lzdGVtcyBzaG91bGQgZ2VuZXJhbGx5IHVzZSBwb29saW5nIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIGdhcmJhZ2VcbiAgICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gICAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAgICogbmVlZCBhIHBlcnNpc3RlZCBldmVudCBzaG91bGQgaW52b2tlIGBwZXJzaXN0YC5cbiAgICpcbiAgICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICAgKiBub3JtYWxpemluZyBicm93c2VyIHF1aXJrcy4gU3ViY2xhc3NlcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0byBpbXBsZW1lbnQgYVxuICAgKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gICAqL1xuICBmdW5jdGlvbiBTeW50aGV0aWNCYXNlRXZlbnQocmVhY3ROYW1lLCByZWFjdEV2ZW50VHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICAgIHRoaXMudHlwZSA9IHJlYWN0RXZlbnRUeXBlO1xuICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICB0aGlzLnRhcmdldCA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICAgIHRoaXMuY3VycmVudFRhcmdldCA9IG51bGw7XG5cbiAgICBmb3IgKHZhciBfcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW19wcm9wTmFtZV07XG5cbiAgICAgIGlmIChub3JtYWxpemUpIHtcbiAgICAgICAgdGhpc1tfcHJvcE5hbWVdID0gbm9ybWFsaXplKG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbX3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W19wcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRQcmV2ZW50ZWQgPSBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkIDogbmF0aXZlRXZlbnQucmV0dXJuVmFsdWUgPT09IGZhbHNlO1xuXG4gICAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zRmFsc2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBfYXNzaWduKFN5bnRoZXRpY0Jhc2VFdmVudC5wcm90b3R5cGUsIHtcbiAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG5cbiAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlO1xuICAgIH0sXG4gICAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8gJEZsb3dGaXhNZSAtIGZsb3cgaXMgbm90IGF3YXJlIG9mIGB1bmtub3duYCBpbiBJRVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgICAgLy8gYW55IHJlZmVyZW5jZXMgdG8gY2FuY2VsQnViYmxlIHRocm93IFwiTWVtYmVyIG5vdCBmb3VuZFwiLiAgQVxuICAgICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc1RydWU7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICAgKiB0aGVtIGJhY2sgaW50byB0aGUgcG9vbC4gVGhpcyBhbGxvd3MgYSB3YXkgdG8gaG9sZCBvbnRvIGEgcmVmZXJlbmNlIHRoYXRcbiAgICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAgICovXG4gICAgcGVyc2lzdDogZnVuY3Rpb24gKCkgey8vIE1vZGVybiBldmVudCBzeXN0ZW0gZG9lc24ndCB1c2UgcG9vbGluZy5cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBzaG91bGQgbm90IGJlIHJlbGVhc2VkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNQZXJzaXN0ZW50OiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICB9KTtcblxuICByZXR1cm4gU3ludGhldGljQmFzZUV2ZW50O1xufVxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBFdmVudEludGVyZmFjZSA9IHtcbiAgZXZlbnRQaGFzZTogMCxcbiAgYnViYmxlczogMCxcbiAgY2FuY2VsYWJsZTogMCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gIGlzVHJ1c3RlZDogMFxufTtcbnZhciBTeW50aGV0aWNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEV2ZW50SW50ZXJmYWNlKTtcblxudmFyIFVJRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICB2aWV3OiAwLFxuICBkZXRhaWw6IDBcbn0pO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpO1xudmFyIGxhc3RNb3ZlbWVudFg7XG52YXIgbGFzdE1vdmVtZW50WTtcbnZhciBsYXN0TW91c2VFdmVudDtcblxuZnVuY3Rpb24gdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICE9PSBsYXN0TW91c2VFdmVudCkge1xuICAgIGlmIChsYXN0TW91c2VFdmVudCAmJiBldmVudC50eXBlID09PSAnbW91c2Vtb3ZlJykge1xuICAgICAgbGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YO1xuICAgICAgbGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0TW92ZW1lbnRYID0gMDtcbiAgICAgIGxhc3RNb3ZlbWVudFkgPSAwO1xuICAgIH1cblxuICAgIGxhc3RNb3VzZUV2ZW50ID0gZXZlbnQ7XG4gIH1cbn1cbi8qKlxuICogQGludGVyZmFjZSBNb3VzZUV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBzY3JlZW5YOiAwLFxuICBzY3JlZW5ZOiAwLFxuICBjbGllbnRYOiAwLFxuICBjbGllbnRZOiAwLFxuICBwYWdlWDogMCxcbiAgcGFnZVk6IDAsXG4gIGN0cmxLZXk6IDAsXG4gIHNoaWZ0S2V5OiAwLFxuICBhbHRLZXk6IDAsXG4gIG1ldGFLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgYnV0dG9uOiAwLFxuICBidXR0b25zOiAwLFxuICByZWxhdGVkVGFyZ2V0OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnNyY0VsZW1lbnQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDtcbiAgICByZXR1cm4gZXZlbnQucmVsYXRlZFRhcmdldDtcbiAgfSxcbiAgbW92ZW1lbnRYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoJ21vdmVtZW50WCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgfVxuXG4gICAgdXBkYXRlTW91c2VNb3ZlbWVudFBvbHlmaWxsU3RhdGUoZXZlbnQpO1xuICAgIHJldHVybiBsYXN0TW92ZW1lbnRYO1xuICB9LFxuICBtb3ZlbWVudFk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICgnbW92ZW1lbnRZJyBpbiBldmVudCkge1xuICAgICAgcmV0dXJuIGV2ZW50Lm1vdmVtZW50WTtcbiAgICB9IC8vIERvbid0IG5lZWQgdG8gY2FsbCB1cGRhdGVNb3VzZU1vdmVtZW50UG9seWZpbGxTdGF0ZSgpIGhlcmVcbiAgICAvLyBiZWNhdXNlIGl0J3MgZ3VhcmFudGVlZCB0byBoYXZlIGFscmVhZHkgcnVuIHdoZW4gbW92ZW1lbnRYXG4gICAgLy8gd2FzIGNvcGllZC5cblxuXG4gICAgcmV0dXJuIGxhc3RNb3ZlbWVudFk7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KE1vdXNlRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIERyYWdFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgZGF0YVRyYW5zZmVyOiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0RyYWdFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KERyYWdFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBVSUV2ZW50SW50ZXJmYWNlLCB7XG4gIHJlbGF0ZWRUYXJnZXQ6IDBcbn0pO1xuXG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG5cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGFuaW1hdGlvbk5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG5cbnZhciBDbGlwYm9hcmRFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn0pO1xuXG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xuXG52YXIgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gIGRhdGE6IDBcbn0pO1xuXG52YXIgU3ludGhldGljQ29tcG9zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbi8vIEhhcHBlbnMgdG8gc2hhcmUgdGhlIHNhbWUgbGlzdCBmb3Igbm93LlxuXG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7XG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIG5vcm1hbGl6ZUtleSA9IHtcbiAgRXNjOiAnRXNjYXBlJyxcbiAgU3BhY2ViYXI6ICcgJyxcbiAgTGVmdDogJ0Fycm93TGVmdCcsXG4gIFVwOiAnQXJyb3dVcCcsXG4gIFJpZ2h0OiAnQXJyb3dSaWdodCcsXG4gIERvd246ICdBcnJvd0Rvd24nLFxuICBEZWw6ICdEZWxldGUnLFxuICBXaW46ICdPUycsXG4gIE1lbnU6ICdDb250ZXh0TWVudScsXG4gIEFwcHM6ICdDb250ZXh0TWVudScsXG4gIFNjcm9sbDogJ1Njcm9sbExvY2snLFxuICBNb3pQcmludGFibGVLZXk6ICdVbmlkZW50aWZpZWQnXG59O1xuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cblxudmFyIHRyYW5zbGF0ZVRvS2V5ID0ge1xuICAnOCc6ICdCYWNrc3BhY2UnLFxuICAnOSc6ICdUYWInLFxuICAnMTInOiAnQ2xlYXInLFxuICAnMTMnOiAnRW50ZXInLFxuICAnMTYnOiAnU2hpZnQnLFxuICAnMTcnOiAnQ29udHJvbCcsXG4gICcxOCc6ICdBbHQnLFxuICAnMTknOiAnUGF1c2UnLFxuICAnMjAnOiAnQ2Fwc0xvY2snLFxuICAnMjcnOiAnRXNjYXBlJyxcbiAgJzMyJzogJyAnLFxuICAnMzMnOiAnUGFnZVVwJyxcbiAgJzM0JzogJ1BhZ2VEb3duJyxcbiAgJzM1JzogJ0VuZCcsXG4gICczNic6ICdIb21lJyxcbiAgJzM3JzogJ0Fycm93TGVmdCcsXG4gICczOCc6ICdBcnJvd1VwJyxcbiAgJzM5JzogJ0Fycm93UmlnaHQnLFxuICAnNDAnOiAnQXJyb3dEb3duJyxcbiAgJzQ1JzogJ0luc2VydCcsXG4gICc0Nic6ICdEZWxldGUnLFxuICAnMTEyJzogJ0YxJyxcbiAgJzExMyc6ICdGMicsXG4gICcxMTQnOiAnRjMnLFxuICAnMTE1JzogJ0Y0JyxcbiAgJzExNic6ICdGNScsXG4gICcxMTcnOiAnRjYnLFxuICAnMTE4JzogJ0Y3JyxcbiAgJzExOSc6ICdGOCcsXG4gICcxMjAnOiAnRjknLFxuICAnMTIxJzogJ0YxMCcsXG4gICcxMjInOiAnRjExJyxcbiAgJzEyMyc6ICdGMTInLFxuICAnMTQ0JzogJ051bUxvY2snLFxuICAnMTQ1JzogJ1Njcm9sbExvY2snLFxuICAnMjI0JzogJ01ldGEnXG59O1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRLZXkobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LmtleSkge1xuICAgIC8vIE5vcm1hbGl6ZSBpbmNvbnNpc3RlbnQgdmFsdWVzIHJlcG9ydGVkIGJ5IGJyb3dzZXJzIGR1ZSB0b1xuICAgIC8vIGltcGxlbWVudGF0aW9ucyBvZiBhIHdvcmtpbmcgZHJhZnQgc3BlY2lmaWNhdGlvbi5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG5cbiAgICBpZiAoa2V5ICE9PSAnVW5pZGVudGlmaWVkJykge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH0gLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuXG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTsgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG5cbiAgICByZXR1cm4gY2hhckNvZGUgPT09IDEzID8gJ0VudGVyJyA6IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICB9XG5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIG1vZGlmaWVyIGtleSB0byB0aGUgYXNzb2NpYXRlZCBwcm9wZXJ0eSBpbiB0aGUgZXZlbnQuXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5cy1Nb2RpZmllcnNcbiAqL1xuXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgQWx0OiAnYWx0S2V5JyxcbiAgQ29udHJvbDogJ2N0cmxLZXknLFxuICBNZXRhOiAnbWV0YUtleScsXG4gIFNoaWZ0OiAnc2hpZnRLZXknXG59OyAvLyBPbGRlciBicm93c2VycyAoU2FmYXJpIDw9IDEwLCBpT1MgU2FmYXJpIDw9IDEwLjIpIGRvIG5vdCBzdXBwb3J0XG4vLyBnZXRNb2RpZmllclN0YXRlLiBJZiBnZXRNb2RpZmllclN0YXRlIGlzIG5vdCBzdXBwb3J0ZWQsIHdlIG1hcCBpdCB0byBhIHNldCBvZlxuLy8gbW9kaWZpZXIga2V5cyBleHBvc2VkIGJ5IHRoZSBldmVudC4gSW4gdGhpcyBjYXNlLCBMb2NrLWtleXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG5cbmZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gIHZhciBzeW50aGV0aWNFdmVudCA9IHRoaXM7XG4gIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50O1xuXG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuXG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xuXG5cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBjb2RlOiAwLFxuICBsb2NhdGlvbjogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgcmVwZWF0OiAwLFxuICBsb2NhbGU6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgIC8vIEtleVByZXNzIGlzIGRlcHJlY2F0ZWQsIGJ1dCBpdHMgcmVwbGFjZW1lbnQgaXMgbm90IHlldCBmaW5hbCBhbmQgbm90XG4gICAgLy8gaW1wbGVtZW50ZWQgaW4gYW55IG1ham9yIGJyb3dzZXIuIE9ubHkgS2V5UHJlc3MgaGFzIGNoYXJDb2RlLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICByZXR1cm4gZ2V0RXZlbnRDaGFyQ29kZShldmVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG4gICAgLy8gVGhlIGFjdHVhbCBtZWFuaW5nIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB1c2Vycycga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gd2hpY2ggY2Fubm90IGJlIGRldGVjdGVkLiBBc3N1bWluZyB0aGF0IGl0IGlzIGEgVVMga2V5Ym9hcmQgbGF5b3V0XG4gICAgLy8gcHJvdmlkZXMgYSBzdXJwcmlzaW5nbHkgYWNjdXJhdGUgbWFwcGluZyBmb3IgVVMgYW5kIEV1cm9wZWFuIHVzZXJzLlxuICAgIC8vIER1ZSB0byB0aGlzLCBpdCBpcyBsZWZ0IHRvIHRoZSB1c2VyIHRvIGltcGxlbWVudCBhdCB0aGlzIHRpbWUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9XG59KTtcblxudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBQb2ludGVyRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvcG9pbnRlcmV2ZW50cy9cbiAqL1xuXG52YXIgUG9pbnRlckV2ZW50SW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICBwb2ludGVySWQ6IDAsXG4gIHdpZHRoOiAwLFxuICBoZWlnaHQ6IDAsXG4gIHByZXNzdXJlOiAwLFxuICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gIHRpbHRYOiAwLFxuICB0aWx0WTogMCxcbiAgdHdpc3Q6IDAsXG4gIHBvaW50ZXJUeXBlOiAwLFxuICBpc1ByaW1hcnk6IDBcbn0pO1xuXG52YXIgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKTtcbi8qKlxuICogQGludGVyZmFjZSBUb3VjaEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3RvdWNoLWV2ZW50cy9cbiAqL1xuXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IF9hc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgdG91Y2hlczogMCxcbiAgdGFyZ2V0VG91Y2hlczogMCxcbiAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gIGFsdEtleTogMCxcbiAgbWV0YUtleTogMCxcbiAgY3RybEtleTogMCxcbiAgc2hpZnRLZXk6IDAsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufSk7XG5cbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOS9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMDkwMzIwLyN0cmFuc2l0aW9uLWV2ZW50cy1cbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RyYW5zaXRpb25FdmVudFxuICovXG5cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwge1xuICBwcm9wZXJ0eU5hbWU6IDAsXG4gIGVsYXBzZWRUaW1lOiAwLFxuICBwc2V1ZG9FbGVtZW50OiAwXG59KTtcblxudmFyIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG4vKipcbiAqIEBpbnRlcmZhY2UgV2hlZWxFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cblxudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBNb3VzZUV2ZW50SW50ZXJmYWNlLCB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDogLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFYYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKHJpZ2h0IGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YVgnIGluIGV2ZW50ID8gLWV2ZW50LndoZWVsRGVsdGFYIDogMDtcbiAgfSxcbiAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWScgaW4gZXZlbnQgPyBldmVudC5kZWx0YVkgOiAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6IC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogMCxcbiAgLy8gQnJvd3NlcnMgd2l0aG91dCBcImRlbHRhTW9kZVwiIGlzIHJlcG9ydGluZyBpbiByYXcgd2hlZWwgZGVsdGEgd2hlcmUgb25lXG4gIC8vIG5vdGNoIG9uIHRoZSBzY3JvbGwgaXMgYWx3YXlzICsvLSAxMjAsIHJvdWdobHkgZXF1aXZhbGVudCB0byBwaXhlbHMuXG4gIC8vIEEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIERPTV9ERUxUQV9MSU5FICgxKSBpcyA1JSBvZiB2aWV3cG9ydCBzaXplIG9yXG4gIC8vIH40MCBwaXhlbHMsIGZvciBET01fREVMVEFfU0NSRUVOICgyKSBpdCBpcyA4Ny41JSBvZiB2aWV3cG9ydCBzaXplLlxuICBkZWx0YU1vZGU6IDBcbn0pO1xuXG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFdoZWVsRXZlbnRJbnRlcmZhY2UpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxuXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG52YXIgZG9jdW1lbnRNb2RlID0gbnVsbDtcblxuaWYgKGNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59IC8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG5cblxudmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID0gY2FuVXNlRE9NICYmICdUZXh0RXZlbnQnIGluIHdpbmRvdyAmJiAhZG9jdW1lbnRNb2RlOyAvLyBJbiBJRTkrLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wb3NpdGlvbiBldmVudHMsIGJ1dCB0aGUgZGF0YSBzdXBwbGllZFxuLy8gYnkgdGhlIG5hdGl2ZSBjb21wb3NpdGlvbmVuZCBldmVudCBtYXkgYmUgaW5jb3JyZWN0LiBKYXBhbmVzZSBpZGVvZ3JhcGhpY1xuLy8gc3BhY2VzLCBmb3IgaW5zdGFuY2UgKFxcdTMwMDApIGFyZSBub3QgcmVjb3JkZWQgY29ycmVjdGx5LlxuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBjYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cygpIHtcbiAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KCdvbkJlZm9yZUlucHV0JywgWydjb21wb3NpdGlvbmVuZCcsICdrZXlwcmVzcycsICd0ZXh0SW5wdXQnLCAncGFzdGUnXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvbkVuZCcsIFsnY29tcG9zaXRpb25lbmQnLCAnZm9jdXNvdXQnLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcsICdtb3VzZWRvd24nXSk7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25Db21wb3NpdGlvblN0YXJ0JywgWydjb21wb3NpdGlvbnN0YXJ0JywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uQ29tcG9zaXRpb25VcGRhdGUnLCBbJ2NvbXBvc2l0aW9udXBkYXRlJywgJ2ZvY3Vzb3V0JywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnbW91c2Vkb3duJ10pO1xufSAvLyBUcmFjayB3aGV0aGVyIHdlJ3ZlIGV2ZXIgaGFuZGxlZCBhIGtleXByZXNzIG9uIHRoZSBzcGFjZSBrZXkuXG5cblxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cblxuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJiAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUoZG9tRXZlbnROYW1lKSB7XG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAnY29tcG9zaXRpb25zdGFydCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25TdGFydCc7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gJ29uQ29tcG9zaXRpb25FbmQnO1xuXG4gICAgY2FzZSAnY29tcG9zaXRpb251cGRhdGUnOlxuICAgICAgcmV0dXJuICdvbkNvbXBvc2l0aW9uVXBkYXRlJztcbiAgfVxufVxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqL1xuXG5cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSA9PT0gJ2tleWRvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKi9cblxuXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcblxuICAgIGNhc2UgJ2tleWRvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcblxuICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ2ZvY3Vzb3V0JzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cblxuXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG5cbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSBjb21wb3NpdGlvbiBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IEtvcmVhbiBJTUUuXG4gKiBPdXIgZmFsbGJhY2sgbW9kZSBkb2VzIG5vdCB3b3JrIHdlbGwgd2l0aCBJRSdzIEtvcmVhbiBJTUUsXG4gKiBzbyBqdXN0IHVzZSBuYXRpdmUgY29tcG9zaXRpb24gZXZlbnRzIHdoZW4gS29yZWFuIElNRSBpcyB1c2VkLlxuICogQWx0aG91Z2ggQ29tcG9zaXRpb25FdmVudC5sb2NhbGUgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCxcbiAqIGl0IGlzIGF2YWlsYWJsZSBpbiBJRSwgd2hlcmUgb3VyIGZhbGxiYWNrIG1vZGUgaXMgZW5hYmxlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cblxuXG5mdW5jdGlvbiBpc1VzaW5nS29yZWFuSU1FKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiBuYXRpdmVFdmVudC5sb2NhbGUgPT09ICdrbyc7XG59IC8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBzdGF0dXMsIGlmIGFueS5cblxuXG52YXIgaXNDb21wb3NpbmcgPSBmYWxzZTtcbi8qKlxuICogQHJldHVybiB7P29iamVjdH0gQSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZShkb21FdmVudE5hbWUpO1xuICB9IGVsc2UgaWYgKCFpc0NvbXBvc2luZykge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gJ29uQ29tcG9zaXRpb25TdGFydCc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSkge1xuICAgIGV2ZW50VHlwZSA9ICdvbkNvbXBvc2l0aW9uRW5kJztcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpKSB7XG4gICAgLy8gVGhlIGN1cnJlbnQgY29tcG9zaXRpb24gaXMgc3RvcmVkIHN0YXRpY2FsbHkgYW5kIG11c3Qgbm90IGJlXG4gICAgLy8gb3ZlcndyaXR0ZW4gd2hpbGUgY29tcG9zaXRpb24gY29udGludWVzLlxuICAgIGlmICghaXNDb21wb3NpbmcgJiYgZXZlbnRUeXBlID09PSAnb25Db21wb3NpdGlvblN0YXJ0Jykge1xuICAgICAgaXNDb21wb3NpbmcgPSBpbml0aWFsaXplKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ29uQ29tcG9zaXRpb25FbmQnKSB7XG4gICAgICBpZiAoaXNDb21wb3NpbmcpIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gZ2V0RGF0YSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgZXZlbnRUeXBlKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljQ29tcG9zaXRpb25FdmVudChldmVudFR5cGUsIGRvbUV2ZW50TmFtZSwgbnVsbCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgbGlzdGVuZXJzOiBsaXN0ZW5lcnNcbiAgICB9KTtcblxuICAgIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBwcm9wZXJ0eSBvZiBuYXRpdmUgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZS5cbiAgICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjdXN0b21EYXRhID0gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICAgIGV2ZW50LmRhdGEgPSBjdXN0b21EYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpIHtcbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCk7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcblxuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTsgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBpZ25vcmUgaXQuXG5cbiAgICAgIGlmIChjaGFycyA9PT0gU1BBQ0VCQVJfQ0hBUiAmJiBoYXNTcGFjZUtleXByZXNzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY2hhcnM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gRm9yIG90aGVyIG5hdGl2ZSBldmVudCB0eXBlcywgZG8gbm90aGluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChpc0NvbXBvc2luZykge1xuICAgIGlmIChkb21FdmVudE5hbWUgPT09ICdjb21wb3NpdGlvbmVuZCcgfHwgIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiYgaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgICB2YXIgY2hhcnMgPSBnZXREYXRhKCk7XG4gICAgICByZXNldCgpO1xuICAgICAgaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIEFzIG9mIHYyNywgRmlyZWZveCBtYXkgZmlyZSBrZXlwcmVzcyBldmVudHMgZXZlbiB3aGVuIG5vIGNoYXJhY3RlclxuICAgICAgICogd2lsbCBiZSBpbnNlcnRlZC4gQSBmZXcgcG9zc2liaWxpdGllczpcbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgYDBgLiBBcnJvdyBrZXlzLCBFc2Mga2V5LCBldGMuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgbm8gY2hhciBpcyBhdmFpbGFibGUuXG4gICAgICAgKiAgIEV4OiAnQWx0R3IgKyBkYCBpbiBQb2xpc2guIFRoZXJlIGlzIG5vIG1vZGlmaWVkIGNoYXJhY3RlciBmb3JcbiAgICAgICAqICAgdGhpcyBrZXkgY29tYmluYXRpb24gYW5kIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICogICBkb2N1bWVudCwgYnV0IEZGIGZpcmVzIHRoZSBrZXlwcmVzcyBmb3IgY2hhciBjb2RlIGAxMDBgIGFueXdheS5cbiAgICAgICAqICAgTm8gYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IGEgY29tbWFuZCBjb21iaW5hdGlvbiBpc1xuICAgICAgICogICBiZWluZyB1c2VkLiBFeDogYENtZCtDYC4gTm8gY2hhcmFjdGVyIGlzIGluc2VydGVkLCBhbmQgbm9cbiAgICAgICAqICAgYGlucHV0YCBldmVudCB3aWxsIG9jY3VyLlxuICAgICAgICovXG4gICAgICBpZiAoIWlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSkge1xuICAgICAgICAvLyBJRSBmaXJlcyB0aGUgYGtleXByZXNzYCBldmVudCB3aGVuIGEgdXNlciB0eXBlcyBhbiBlbW9qaSB2aWFcbiAgICAgICAgLy8gVG91Y2gga2V5Ym9hcmQgb2YgV2luZG93cy4gIEluIHN1Y2ggYSBjYXNlLCB0aGUgYGNoYXJgIHByb3BlcnR5XG4gICAgICAgIC8vIGhvbGRzIGFuIGVtb2ppIGNoYXJhY3RlciBsaWtlIGBcXHVEODNEXFx1REUwQWAuICBCZWNhdXNlIGl0cyBsZW5ndGhcbiAgICAgICAgLy8gaXMgMiwgdGhlIHByb3BlcnR5IGB3aGljaGAgZG9lcyBub3QgcmVwcmVzZW50IGFuIGVtb2ppIGNvcnJlY3RseS5cbiAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2UsIHdlIGRpcmVjdGx5IHJldHVybiB0aGUgYGNoYXJgIHByb3BlcnR5IGluc3RlYWQgb2ZcbiAgICAgICAgLy8gdXNpbmcgYHdoaWNoYC5cbiAgICAgICAgaWYgKG5hdGl2ZUV2ZW50LmNoYXIgJiYgbmF0aXZlRXZlbnQuY2hhci5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgIH0gZWxzZSBpZiAobmF0aXZlRXZlbnQud2hpY2gpIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuYXRpdmVFdmVudC53aGljaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlICdjb21wb3NpdGlvbmVuZCc6XG4gICAgICByZXR1cm4gdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgJiYgIWlzVXNpbmdLb3JlYW5JTUUobmF0aXZlRXZlbnQpID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gIH0gLy8gSWYgbm8gY2hhcmFjdGVycyBhcmUgYmVpbmcgaW5zZXJ0ZWQsIG5vIEJlZm9yZUlucHV0IGV2ZW50IHNob3VsZFxuICAvLyBiZSBmaXJlZC5cblxuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBsaXN0ZW5lcnMgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnModGFyZ2V0SW5zdCwgJ29uQmVmb3JlSW5wdXQnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljSW5wdXRFdmVudCgnb25CZWZvcmVJbnB1dCcsICdiZWZvcmVpbnB1dCcsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgIGxpc3RlbmVyczogbGlzdGVuZXJzXG4gICAgfSk7XG4gICAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICB9XG59XG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICBleHRyYWN0QmVmb3JlSW5wdXRFdmVudChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cbnZhciBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICBjb2xvcjogdHJ1ZSxcbiAgZGF0ZTogdHJ1ZSxcbiAgZGF0ZXRpbWU6IHRydWUsXG4gICdkYXRldGltZS1sb2NhbCc6IHRydWUsXG4gIGVtYWlsOiB0cnVlLFxuICBtb250aDogdHJ1ZSxcbiAgbnVtYmVyOiB0cnVlLFxuICBwYXNzd29yZDogdHJ1ZSxcbiAgcmFuZ2U6IHRydWUsXG4gIHNlYXJjaDogdHJ1ZSxcbiAgdGVsOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICB0aW1lOiB0cnVlLFxuICB1cmw6IHRydWUsXG4gIHdlZWs6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4KSB7XG4gIGlmICghY2FuVXNlRE9NKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IChldmVudE5hbWUgaW4gZG9jdW1lbnQpO1xuXG4gIGlmICghaXNTdXBwb3J0ZWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGV2ZW50TmFtZSwgJ3JldHVybjsnKTtcbiAgICBpc1N1cHBvcnRlZCA9IHR5cGVvZiBlbGVtZW50W2V2ZW50TmFtZV0gPT09ICdmdW5jdGlvbic7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRXZlbnRzJDEoKSB7XG4gIHJlZ2lzdGVyVHdvUGhhc2VFdmVudCgnb25DaGFuZ2UnLCBbJ2NoYW5nZScsICdjbGljaycsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2lucHV0JywgJ2tleWRvd24nLCAna2V5dXAnLCAnc2VsZWN0aW9uY2hhbmdlJ10pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgaW5zdCwgbmF0aXZlRXZlbnQsIHRhcmdldCkge1xuICAvLyBGbGFnIHRoaXMgZXZlbnQgbG9vcCBhcyBuZWVkaW5nIHN0YXRlIHJlc3RvcmUuXG4gIGVucXVldWVTdGF0ZVJlc3RvcmUodGFyZ2V0KTtcbiAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCAnb25DaGFuZ2UnKTtcblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoJ29uQ2hhbmdlJywgJ2NoYW5nZScsIG51bGwsIG5hdGl2ZUV2ZW50LCB0YXJnZXQpO1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59XG4vKipcbiAqIEZvciBJRSBzaGltc1xuICovXG5cblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjaGFuZ2VgIGV2ZW50XG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoZGlzcGF0Y2hRdWV1ZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpOyAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cblxuICBiYXRjaGVkVXBkYXRlcyhydW5FdmVudEluQmF0Y2gsIGRpc3BhdGNoUXVldWUpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZGlzcGF0Y2hRdWV1ZSkge1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCAwKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpIHtcbiAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuXG4gIGlmICh1cGRhdGVWYWx1ZUlmQ2hhbmdlZCh0YXJnZXROb2RlKSkge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2NoYW5nZScpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGlucHV0YCBldmVudFxuICovXG5cblxudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIC8vIElFOSBjbGFpbXMgdG8gc3VwcG9ydCB0aGUgaW5wdXQgZXZlbnQgYnV0IGZhaWxzIHRvIHRyaWdnZXIgaXQgd2hlblxuICAvLyBkZWxldGluZyB0ZXh0LCBzbyB3ZSBpZ25vcmUgaXRzIGlucHV0IGV2ZW50cy5cbiAgaXNJbnB1dEV2ZW50U3VwcG9ydGVkID0gaXNFdmVudFN1cHBvcnRlZCgnaW5wdXQnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA5KTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cblxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbn1cbi8qKlxuICogKEZvciBJRSA8PTkpIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSBjdXJyZW50bHktdHJhY2tlZCBlbGVtZW50LFxuICogaWYgYW55IGV4aXN0cy5cbiAqL1xuXG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuLyoqXG4gKiAoRm9yIElFIDw9OSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cblxuXG5mdW5jdGlvbiBoYW5kbGVQcm9wZXJ0eUNoYW5nZShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICE9PSAndmFsdWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCkpIHtcbiAgICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3VzaW4nKSB7XG4gICAgLy8gSW4gSUU5LCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ2ZvY3Vzb3V0Jykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn0gLy8gRm9yIElFOCBhbmQgSUU5LlxuXG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGwoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdzZWxlY3Rpb25jaGFuZ2UnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ2tleXVwJyB8fCBkb21FdmVudE5hbWUgPT09ICdrZXlkb3duJykge1xuICAgIC8vIE9uIHRoZSBzZWxlY3Rpb25jaGFuZ2UgZXZlbnQsIHRoZSB0YXJnZXQgaXMganVzdCBkb2N1bWVudCB3aGljaCBpc24ndFxuICAgIC8vIGhlbHBmdWwgZm9yIHVzIHNvIGp1c3QgY2hlY2sgYWN0aXZlRWxlbWVudCBpbnN0ZWFkLlxuICAgIC8vXG4gICAgLy8gOTklIG9mIHRoZSB0aW1lLCBrZXlkb3duIGFuZCBrZXl1cCBhcmVuJ3QgbmVjZXNzYXJ5LiBJRTggZmFpbHMgdG8gZmlyZVxuICAgIC8vIHByb3BlcnR5Y2hhbmdlIG9uIHRoZSBmaXJzdCBpbnB1dCBldmVudCBhZnRlciBzZXR0aW5nIGB2YWx1ZWAgZnJvbSBhXG4gICAgLy8gc2NyaXB0IGFuZCBmaXJlcyBvbmx5IGtleWRvd24sIGtleXByZXNzLCBrZXl1cC4gQ2F0Y2hpbmcga2V5dXAgdXN1YWxseVxuICAgIC8vIGdldHMgaXQgYW5kIGNhdGNoaW5nIGtleWRvd24gbGV0cyB1cyBmaXJlIGFuIGV2ZW50IGZvciB0aGUgZmlyc3RcbiAgICAvLyBrZXlzdHJva2UgaWYgdXNlciBkb2VzIGEga2V5IHJlcGVhdCAoaXQnbGwgYmUgYSBsaXR0bGUgZGVsYXllZDogcmlnaHRcbiAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBrZXlzdHJva2UpLiBPdGhlciBpbnB1dCBtZXRob2RzIChlLmcuLCBwYXN0ZSkgc2VlbSB0b1xuICAgIC8vIGZpcmUgc2VsZWN0aW9uY2hhbmdlIG5vcm1hbGx5LlxuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQoYWN0aXZlRWxlbWVudEluc3QpO1xuICB9XG59XG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cblxuXG5mdW5jdGlvbiBzaG91bGRVc2VDbGlja0V2ZW50KGVsZW0pIHtcbiAgLy8gVXNlIHRoZSBgY2xpY2tgIGV2ZW50IHRvIGRldGVjdCBjaGFuZ2VzIHRvIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMuXG4gIC8vIFRoaXMgYXBwcm9hY2ggd29ya3MgYWNyb3NzIGFsbCBicm93c2Vycywgd2hlcmVhcyBgY2hhbmdlYCBkb2VzIG5vdCBmaXJlXG4gIC8vIHVudGlsIGBibHVyYCBpbiBJRTguXG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWU7XG4gIHJldHVybiBub2RlTmFtZSAmJiBub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdjbGljaycpIHtcbiAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gIGlmIChkb21FdmVudE5hbWUgPT09ICdpbnB1dCcgfHwgZG9tRXZlbnROYW1lID09PSAnY2hhbmdlJykge1xuICAgIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cihub2RlKSB7XG4gIHZhciBzdGF0ZSA9IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICAgIHNldERlZmF1bHRWYWx1ZShub2RlLCAnbnVtYmVyJywgbm9kZS52YWx1ZSk7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBwbHVnaW4gY3JlYXRlcyBhbiBgb25DaGFuZ2VgIGV2ZW50IHRoYXQgbm9ybWFsaXplcyBjaGFuZ2UgZXZlbnRzXG4gKiBhY3Jvc3MgZm9ybSBlbGVtZW50cy4gVGhpcyBldmVudCBmaXJlcyBhdCBhIHRpbWUgd2hlbiBpdCdzIHBvc3NpYmxlIHRvXG4gKiBjaGFuZ2UgdGhlIGVsZW1lbnQncyB2YWx1ZSB3aXRob3V0IHNlZWluZyBhIGZsaWNrZXIuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gc2VsZWN0XG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDEoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcblxuICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgfSBlbHNlIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoc2hvdWxkVXNlQ2xpY2tFdmVudCh0YXJnZXROb2RlKSkge1xuICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gIH1cblxuICBpZiAoZ2V0VGFyZ2V0SW5zdEZ1bmMpIHtcbiAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCk7XG5cbiAgICBpZiAoaW5zdCkge1xuICAgICAgY3JlYXRlQW5kQWNjdW11bGF0ZUNoYW5nZUV2ZW50KGRpc3BhdGNoUXVldWUsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKGhhbmRsZUV2ZW50RnVuYykge1xuICAgIGhhbmRsZUV2ZW50RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICB9IC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnZm9jdXNvdXQnKSB7XG4gICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXROb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQyKCkge1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvbk1vdXNlRW50ZXInLCBbJ21vdXNlb3V0JywgJ21vdXNlb3ZlciddKTtcbiAgcmVnaXN0ZXJEaXJlY3RFdmVudCgnb25Nb3VzZUxlYXZlJywgWydtb3VzZW91dCcsICdtb3VzZW92ZXInXSk7XG4gIHJlZ2lzdGVyRGlyZWN0RXZlbnQoJ29uUG9pbnRlckVudGVyJywgWydwb2ludGVyb3V0JywgJ3BvaW50ZXJvdmVyJ10pO1xuICByZWdpc3RlckRpcmVjdEV2ZW50KCdvblBvaW50ZXJMZWF2ZScsIFsncG9pbnRlcm91dCcsICdwb2ludGVyb3ZlciddKTtcbn1cbi8qKlxuICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAqIHdlIGRvIG5vdCBleHRyYWN0IGR1cGxpY2F0ZSBldmVudHMuIEhvd2V2ZXIsIG1vdmluZyB0aGUgbW91c2UgaW50byB0aGVcbiAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncywgdGFyZ2V0Q29udGFpbmVyKSB7XG4gIHZhciBpc092ZXJFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3ZlcicgfHwgZG9tRXZlbnROYW1lID09PSAncG9pbnRlcm92ZXInO1xuICB2YXIgaXNPdXRFdmVudCA9IGRvbUV2ZW50TmFtZSA9PT0gJ21vdXNlb3V0JyB8fCBkb21FdmVudE5hbWUgPT09ICdwb2ludGVyb3V0JztcblxuICBpZiAoaXNPdmVyRXZlbnQgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19SRVBMQVlFRCkgPT09IDApIHtcbiAgICAvLyBJZiB0aGlzIGlzIGFuIG92ZXIgZXZlbnQgd2l0aCBhIHRhcmdldCwgd2UgbWlnaHQgaGF2ZSBhbHJlYWR5IGRpc3BhdGNoZWRcbiAgICAvLyB0aGUgZXZlbnQgaW4gdGhlIG91dCBldmVudCBvZiB0aGUgb3RoZXIgdGFyZ2V0LiBJZiB0aGlzIGlzIHJlcGxheWVkLFxuICAgIC8vIHRoZW4gaXQncyBiZWNhdXNlIHdlIGNvdWxkbid0IGRpc3BhdGNoIGFnYWluc3QgdGhpcyB0YXJnZXQgcHJldmlvdXNseVxuICAgIC8vIHNvIHdlIGhhdmUgdG8gZG8gaXQgbm93IGluc3RlYWQuXG4gICAgdmFyIHJlbGF0ZWQgPSBuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50O1xuXG4gICAgaWYgKHJlbGF0ZWQpIHtcbiAgICAgIC8vIElmIHRoZSByZWxhdGVkIG5vZGUgaXMgbWFuYWdlZCBieSBSZWFjdCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGhhdmVcbiAgICAgIC8vIGFscmVhZHkgZGlzcGF0Y2hlZCB0aGUgY29ycmVzcG9uZGluZyBldmVudHMgZHVyaW5nIGl0cyBtb3VzZW91dC5cbiAgICAgIGlmIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWxhdGVkKSB8fCBpc0NvbnRhaW5lck1hcmtlZEFzUm9vdChyZWxhdGVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpc091dEV2ZW50ICYmICFpc092ZXJFdmVudCkge1xuICAgIC8vIE11c3Qgbm90IGJlIGEgbW91c2Ugb3IgcG9pbnRlciBpbiBvciBvdXQgLSBpZ25vcmluZy5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgd2luOyAvLyBUT0RPOiB3aHkgaXMgdGhpcyBudWxsYWJsZSBpbiB0aGUgdHlwZXMgYnV0IHdlIHJlYWQgZnJvbSBpdD9cblxuICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgIHdpbiA9IG5hdGl2ZUV2ZW50VGFyZ2V0O1xuICB9IGVsc2Uge1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICB2YXIgZG9jID0gbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcblxuICAgIGlmIChkb2MpIHtcbiAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW4gPSB3aW5kb3c7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZyb207XG4gIHZhciB0bztcblxuICBpZiAoaXNPdXRFdmVudCkge1xuICAgIHZhciBfcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgdG8gPSBfcmVsYXRlZCA/IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKF9yZWxhdGVkKSA6IG51bGw7XG5cbiAgICBpZiAodG8gIT09IG51bGwpIHtcbiAgICAgIHZhciBuZWFyZXN0TW91bnRlZCA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIodG8pO1xuXG4gICAgICBpZiAodG8gIT09IG5lYXJlc3RNb3VudGVkIHx8IHRvLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiB0by50YWcgIT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHRvID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICBmcm9tID0gbnVsbDtcbiAgICB0byA9IHRhcmdldEluc3Q7XG4gIH1cblxuICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gIHZhciBsZWF2ZUV2ZW50VHlwZSA9ICdvbk1vdXNlTGVhdmUnO1xuICB2YXIgZW50ZXJFdmVudFR5cGUgPSAnb25Nb3VzZUVudGVyJztcbiAgdmFyIGV2ZW50VHlwZVByZWZpeCA9ICdtb3VzZSc7XG5cbiAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdXQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3BvaW50ZXJvdmVyJykge1xuICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICBsZWF2ZUV2ZW50VHlwZSA9ICdvblBvaW50ZXJMZWF2ZSc7XG4gICAgZW50ZXJFdmVudFR5cGUgPSAnb25Qb2ludGVyRW50ZXInO1xuICAgIGV2ZW50VHlwZVByZWZpeCA9ICdwb2ludGVyJztcbiAgfVxuXG4gIHZhciBmcm9tTm9kZSA9IGZyb20gPT0gbnVsbCA/IHdpbiA6IGdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gIHZhciB0b05vZGUgPSB0byA9PSBudWxsID8gd2luIDogZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG4gIHZhciBsZWF2ZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IobGVhdmVFdmVudFR5cGUsIGV2ZW50VHlwZVByZWZpeCArICdsZWF2ZScsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuICB2YXIgZW50ZXIgPSBudWxsOyAvLyBXZSBzaG91bGQgb25seSBwcm9jZXNzIHRoaXMgbmF0aXZlRXZlbnQgaWYgd2UgYXJlIHByb2Nlc3NpbmdcbiAgLy8gdGhlIGZpcnN0IGFuY2VzdG9yLiBOZXh0IHRpbWUsIHdlIHdpbGwgaWdub3JlIHRoZSBldmVudC5cblxuICB2YXIgbmF0aXZlVGFyZ2V0SW5zdCA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICBpZiAobmF0aXZlVGFyZ2V0SW5zdCA9PT0gdGFyZ2V0SW5zdCkge1xuICAgIHZhciBlbnRlckV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50Q3RvcihlbnRlckV2ZW50VHlwZSwgZXZlbnRUeXBlUHJlZml4ICsgJ2VudGVyJywgdG8sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgZW50ZXJFdmVudC50YXJnZXQgPSB0b05vZGU7XG4gICAgZW50ZXJFdmVudC5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG4gICAgZW50ZXIgPSBlbnRlckV2ZW50O1xuICB9XG5cbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcbn1cblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICByZXR1cm4geCA9PT0geSAmJiAoeCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkpIHx8IHggIT09IHggJiYgeSAhPT0geSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuICA7XG59XG5cbnZhciBvYmplY3RJcyA9IHR5cGVvZiBPYmplY3QuaXMgPT09ICdmdW5jdGlvbicgPyBPYmplY3QuaXMgOiBpcztcblxudmFyIGhhc093blByb3BlcnR5JDIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmplY3RJcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzT3duUHJvcGVydHkkMi5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhb2JqZWN0SXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChyb290LCBvZmZzZXQpIHtcbiAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgdmFyIG5vZGVTdGFydCA9IDA7XG4gIHZhciBub2RlRW5kID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb3V0ZXJOb2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGdldE9mZnNldHMob3V0ZXJOb2RlKSB7XG4gIHZhciBvd25lckRvY3VtZW50ID0gb3V0ZXJOb2RlLm93bmVyRG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBvd25lckRvY3VtZW50ICYmIG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93O1xuICB2YXIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbiAmJiB3aW4uZ2V0U2VsZWN0aW9uKCk7XG5cbiAgaWYgKCFzZWxlY3Rpb24gfHwgc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBhbmNob3JOb2RlID0gc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQgPSBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZSxcbiAgICAgIGZvY3VzT2Zmc2V0ID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0OyAvLyBJbiBGaXJlZm94LCBhbmNob3JOb2RlIGFuZCBmb2N1c05vZGUgY2FuIGJlIFwiYW5vbnltb3VzIGRpdnNcIiwgZS5nLiB0aGVcbiAgLy8gdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXMgZGl2cyBkbyBub3Qgc2VlbSB0b1xuICAvLyBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWQgZXJyb3JcIiBpZiBhbnkgb2YgaXRzXG4gIC8vIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGUgd2F5IHRvIGF2b2lkIGVycm9yaW5nXG4gIC8vIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvciBub24tYW5vbnltb3VzIGRpdnMgYW5kXG4gIC8vIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcblxuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGFuY2hvck5vZGUubm9kZVR5cGU7XG4gICAgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCk7XG59XG4vKipcbiAqIFJldHVybnMge3N0YXJ0LCBlbmR9IHdoZXJlIGBzdGFydGAgaXMgdGhlIGNoYXJhY3Rlci9jb2RlcG9pbnQgaW5kZXggb2ZcbiAqIChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQpIHdpdGhpbiB0aGUgdGV4dENvbnRlbnQgb2YgYG91dGVyTm9kZWAsIGFuZFxuICogYGVuZGAgaXMgdGhlIGluZGV4IG9mIChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KS5cbiAqXG4gKiBSZXR1cm5zIG51bGwgaWYgeW91IHBhc3MgaW4gZ2FyYmFnZSBpbnB1dCBidXQgd2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgY3Jhc2guXG4gKlxuICogRXhwb3J0ZWQgb25seSBmb3IgdGVzdGluZy5cbiAqL1xuXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzRnJvbVBvaW50cyhvdXRlck5vZGUsIGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCwgZm9jdXNOb2RlLCBmb2N1c09mZnNldCkge1xuICB2YXIgbGVuZ3RoID0gMDtcbiAgdmFyIHN0YXJ0ID0gLTE7XG4gIHZhciBlbmQgPSAtMTtcbiAgdmFyIGluZGV4V2l0aGluQW5jaG9yID0gMDtcbiAgdmFyIGluZGV4V2l0aGluRm9jdXMgPSAwO1xuICB2YXIgbm9kZSA9IG91dGVyTm9kZTtcbiAgdmFyIHBhcmVudE5vZGUgPSBudWxsO1xuXG4gIG91dGVyOiB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0ID0gbnVsbDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gYW5jaG9yTm9kZSAmJiAoYW5jaG9yT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGggKyBhbmNob3JPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmb2N1c05vZGUgJiYgKGZvY3VzT2Zmc2V0ID09PSAwIHx8IG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkpIHtcbiAgICAgICAgZW5kID0gbGVuZ3RoICsgZm9jdXNPZmZzZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgICAgbGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aDtcbiAgICAgIH1cblxuICAgICAgaWYgKChuZXh0ID0gbm9kZS5maXJzdENoaWxkKSA9PT0gbnVsbCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gLy8gTW92aW5nIGZyb20gYG5vZGVgIHRvIGl0cyBmaXJzdCBjaGlsZCBgbmV4dGAuXG5cblxuICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICBub2RlID0gbmV4dDtcbiAgICB9XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG91dGVyTm9kZSkge1xuICAgICAgICAvLyBJZiBgb3V0ZXJOb2RlYCBoYXMgY2hpbGRyZW4sIHRoaXMgaXMgYWx3YXlzIHRoZSBzZWNvbmQgdGltZSB2aXNpdGluZ1xuICAgICAgICAvLyBpdC4gSWYgaXQgaGFzIG5vIGNoaWxkcmVuLCB0aGlzIGlzIHN0aWxsIHRoZSBmaXJzdCBsb29wLCBhbmQgdGhlIG9ubHlcbiAgICAgICAgLy8gdmFsaWQgc2VsZWN0aW9uIGlzIGFuY2hvck5vZGUgYW5kIGZvY3VzTm9kZSBib3RoIGVxdWFsIHRvIHRoaXMgbm9kZVxuICAgICAgICAvLyBhbmQgYm90aCBvZmZzZXRzIDAsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbCBoYXZlIGhhbmRsZWQgYWJvdmUuXG4gICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Tm9kZSA9PT0gYW5jaG9yTm9kZSAmJiArK2luZGV4V2l0aGluQW5jaG9yID09PSBhbmNob3JPZmZzZXQpIHtcbiAgICAgICAgc3RhcnQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXJlbnROb2RlID09PSBmb2N1c05vZGUgJiYgKytpbmRleFdpdGhpbkZvY3VzID09PSBmb2N1c09mZnNldCkge1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG5cbiAgICAgIGlmICgobmV4dCA9IG5vZGUubmV4dFNpYmxpbmcpICE9PSBudWxsKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gcGFyZW50Tm9kZTtcbiAgICAgIHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSAvLyBNb3ZpbmcgZnJvbSBgbm9kZWAgdG8gaXRzIG5leHQgc2libGluZyBgbmV4dGAuXG5cblxuICAgIG5vZGUgPSBuZXh0O1xuICB9XG5cbiAgaWYgKHN0YXJ0ID09PSAtMSB8fCBlbmQgPT09IC0xKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAoV291bGQgaGFwcGVuIGlmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYXJlbid0XG4gICAgLy8gYWN0dWFsbHkgaW5zaWRlIHRoZSBwYXNzZWQtaW4gbm9kZS4pXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydCxcbiAgICBlbmQ6IGVuZFxuICB9O1xufVxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cblxuZnVuY3Rpb24gc2V0T2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG4gIHZhciB3aW4gPSBkb2MgJiYgZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsgLy8gRWRnZSBmYWlscyB3aXRoIFwiT2JqZWN0IGV4cGVjdGVkXCIgaW4gc29tZSBzY2VuYXJpb3MuXG4gIC8vIChGb3IgaW5zdGFuY2U6IFRpbnlNQ0UgZWRpdG9yIHVzZWQgaW4gYSBsaXN0IGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIHBhc3RpbmcgdG8gYWRkIG1vcmUsXG4gIC8vIGZhaWxzIHdoZW4gcGFzdGluZyAxMDArIGl0ZW1zKVxuXG4gIGlmICghd2luLmdldFNlbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzZWxlY3Rpb24gPSB3aW4uZ2V0U2VsZWN0aW9uKCk7XG4gIHZhciBsZW5ndGggPSBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpOyAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICBpZiAoc2VsZWN0aW9uLnJhbmdlQ291bnQgPT09IDEgJiYgc2VsZWN0aW9uLmFuY2hvck5vZGUgPT09IHN0YXJ0TWFya2VyLm5vZGUgJiYgc2VsZWN0aW9uLmFuY2hvck9mZnNldCA9PT0gc3RhcnRNYXJrZXIub2Zmc2V0ICYmIHNlbGVjdGlvbi5mb2N1c05vZGUgPT09IGVuZE1hcmtlci5ub2RlICYmIHNlbGVjdGlvbi5mb2N1c09mZnNldCA9PT0gZW5kTWFya2VyLm9mZnNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciByYW5nZSA9IGRvYy5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNJbkRvY3VtZW50KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIGNvbnRhaW5zTm9kZShub2RlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuZnVuY3Rpb24gaXNTYW1lT3JpZ2luRnJhbWUoaWZyYW1lKSB7XG4gIHRyeSB7XG4gICAgLy8gQWNjZXNzaW5nIHRoZSBjb250ZW50RG9jdW1lbnQgb2YgYSBIVE1MSWZyYW1lRWxlbWVudCBjYW4gY2F1c2UgdGhlIGJyb3dzZXJcbiAgICAvLyB0byB0aHJvdywgZS5nLiBpZiBpdCBoYXMgYSBjcm9zcy1vcmlnaW4gc3JjIGF0dHJpYnV0ZS5cbiAgICAvLyBTYWZhcmkgd2lsbCBzaG93IGFuIGVycm9yIGluIHRoZSBjb25zb2xlIHdoZW4gdGhlIGFjY2VzcyByZXN1bHRzIGluIFwiQmxvY2tlZCBhIGZyYW1lIHdpdGggb3JpZ2luXCIuIGUuZzpcbiAgICAvLyBpZnJhbWUuY29udGVudERvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgIC8vIEEgc2FmZXR5IHdheSBpcyB0byBhY2Nlc3Mgb25lIG9mIHRoZSBjcm9zcyBvcmlnaW4gcHJvcGVydGllczogV2luZG93IG9yIExvY2F0aW9uXG4gICAgLy8gV2hpY2ggbWlnaHQgcmVzdWx0IGluIFwiU2VjdXJpdHlFcnJvclwiIERPTSBFeGNlcHRpb24gYW5kIGl0IGlzIGNvbXBhdGlibGUgdG8gU2FmYXJpLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Jyb3dzZXJzLmh0bWwjaW50ZWdyYXRpb24td2l0aC1pZGxcbiAgICByZXR1cm4gdHlwZW9mIGlmcmFtZS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgPT09ICdzdHJpbmcnO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudERlZXAoKSB7XG4gIHZhciB3aW4gPSB3aW5kb3c7XG4gIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuXG4gIHdoaWxlIChlbGVtZW50IGluc3RhbmNlb2Ygd2luLkhUTUxJRnJhbWVFbGVtZW50KSB7XG4gICAgaWYgKGlzU2FtZU9yaWdpbkZyYW1lKGVsZW1lbnQpKSB7XG4gICAgICB3aW4gPSBlbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIGVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KHdpbi5kb2N1bWVudCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG5cbi8qKlxuICogQGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogd2UgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIHRoYXQgc3VwcG9ydCBzZWxlY3Rpb25cbiAqIGZyb20gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG8tbm90LWFwcGx5LCBsb29raW5nIGF0IGBzZWxlY3Rpb25TdGFydGBcbiAqIGFuZCBgc2VsZWN0aW9uRW5kYCByb3dzLlxuICovXG5cblxuZnVuY3Rpb24gaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lICYmIChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoZWxlbS50eXBlID09PSAndGV4dCcgfHwgZWxlbS50eXBlID09PSAnc2VhcmNoJyB8fCBlbGVtLnR5cGUgPT09ICd0ZWwnIHx8IGVsZW0udHlwZSA9PT0gJ3VybCcgfHwgZWxlbS50eXBlID09PSAncGFzc3dvcmQnKSB8fCBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJyB8fCBlbGVtLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKTtcbn1cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uKCkge1xuICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcCgpO1xuICByZXR1cm4ge1xuICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICBzZWxlY3Rpb25SYW5nZTogaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGZvY3VzZWRFbGVtKSA/IGdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gIH07XG59XG4vKipcbiAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICogcmVzdG9yZSBpdC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgdGhhdCBjb3VsZCByZW1vdmUgZG9tXG4gKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAqL1xuXG5mdW5jdGlvbiByZXN0b3JlU2VsZWN0aW9uKHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24pIHtcbiAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudERlZXAoKTtcbiAgdmFyIHByaW9yRm9jdXNlZEVsZW0gPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLmZvY3VzZWRFbGVtO1xuICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG5cbiAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgIGlmIChwcmlvclNlbGVjdGlvblJhbmdlICE9PSBudWxsICYmIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgIH0gLy8gRm9jdXNpbmcgYSBub2RlIGNhbiBjaGFuZ2UgdGhlIHNjcm9sbCBwb3NpdGlvbiwgd2hpY2ggaXMgdW5kZXNpcmFibGVcblxuXG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgIHZhciBhbmNlc3RvciA9IHByaW9yRm9jdXNlZEVsZW07XG5cbiAgICB3aGlsZSAoYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAoYW5jZXN0b3Iubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICBhbmNlc3RvcnMucHVzaCh7XG4gICAgICAgICAgZWxlbWVudDogYW5jZXN0b3IsXG4gICAgICAgICAgbGVmdDogYW5jZXN0b3Iuc2Nyb2xsTGVmdCxcbiAgICAgICAgICB0b3A6IGFuY2VzdG9yLnNjcm9sbFRvcFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByaW9yRm9jdXNlZEVsZW0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluZm8gPSBhbmNlc3RvcnNbaV07XG4gICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgIGluZm8uZWxlbWVudC5zY3JvbGxUb3AgPSBpbmZvLnRvcDtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAqIC1AaW5wdXQ6IExvb2sgdXAgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0XG4gKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAqL1xuXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24oaW5wdXQpIHtcbiAgdmFyIHNlbGVjdGlvbjtcblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIC8vIE1vZGVybiBicm93c2VyIHdpdGggaW5wdXQgb3IgdGV4dGFyZWEuXG4gICAgc2VsZWN0aW9uID0ge1xuICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBpbnB1dC5zZWxlY3Rpb25FbmRcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIENvbnRlbnQgZWRpdGFibGUgb3Igb2xkIElFIHRleHRhcmVhLlxuICAgIHNlbGVjdGlvbiA9IGdldE9mZnNldHMoaW5wdXQpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGVjdGlvbiB8fCB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG4vKipcbiAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICogdGhlIGlucHV0LlxuICogLUBpbnB1dCAgICAgU2V0IHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dCBvciB0ZXh0YXJlYVxuICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICovXG5cbmZ1bmN0aW9uIHNldFNlbGVjdGlvbihpbnB1dCwgb2Zmc2V0cykge1xuICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH1cblxuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgIGlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIHNldE9mZnNldHMoaW5wdXQsIG9mZnNldHMpO1xuICB9XG59XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBjYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG5mdW5jdGlvbiByZWdpc3RlckV2ZW50cyQzKCkge1xuICByZWdpc3RlclR3b1BoYXNlRXZlbnQoJ29uU2VsZWN0JywgWydmb2N1c291dCcsICdjb250ZXh0bWVudScsICdkcmFnZW5kJywgJ2ZvY3VzaW4nLCAna2V5ZG93bicsICdrZXl1cCcsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdzZWxlY3Rpb25jaGFuZ2UnXSk7XG59XG5cbnZhciBhY3RpdmVFbGVtZW50JDEgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xudmFyIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xudmFyIG1vdXNlRG93biA9IGZhbHNlO1xuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICovXG5cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbiQxKG5vZGUpIHtcbiAgaWYgKCdzZWxlY3Rpb25TdGFydCcgaW4gbm9kZSAmJiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgd2luID0gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbi5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfVxufVxuLyoqXG4gKiBHZXQgZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCB0YXJnZXQuXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldERvY3VtZW50KGV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBldmVudFRhcmdldC53aW5kb3cgPT09IGV2ZW50VGFyZ2V0ID8gZXZlbnRUYXJnZXQuZG9jdW1lbnQgOiBldmVudFRhcmdldC5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSA/IGV2ZW50VGFyZ2V0IDogZXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbn1cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gKiBAcmV0dXJuIHs/U3ludGhldGljRXZlbnR9XG4gKi9cblxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChkaXNwYXRjaFF1ZXVlLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgdmFyIGRvYyA9IGdldEV2ZW50VGFyZ2V0RG9jdW1lbnQobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCQxID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCQxICE9PSBnZXRBY3RpdmVFbGVtZW50KGRvYykpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuXG5cbiAgdmFyIGN1cnJlbnRTZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24kMShhY3RpdmVFbGVtZW50JDEpO1xuXG4gIGlmICghbGFzdFNlbGVjdGlvbiB8fCAhc2hhbGxvd0VxdWFsKGxhc3RTZWxlY3Rpb24sIGN1cnJlbnRTZWxlY3Rpb24pKSB7XG4gICAgbGFzdFNlbGVjdGlvbiA9IGN1cnJlbnRTZWxlY3Rpb247XG4gICAgdmFyIGxpc3RlbmVycyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhhY3RpdmVFbGVtZW50SW5zdCQxLCAnb25TZWxlY3QnKTtcblxuICAgIGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KCdvblNlbGVjdCcsICdzZWxlY3QnLCBudWxsLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgICBldmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50JDE7XG4gICAgfVxuICB9XG59XG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cblxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuXG4gIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IGdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICBjYXNlICdmb2N1c2luJzpcbiAgICAgIGlmIChpc1RleHRJbnB1dEVsZW1lbnQodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJykge1xuICAgICAgICBhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXROb2RlO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNvdXQnOlxuICAgICAgYWN0aXZlRWxlbWVudCQxID0gbnVsbDtcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBudWxsO1xuICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICBicmVhaztcbiAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBtb3VzZURvd24gPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjb250ZXh0bWVudSc6XG4gICAgY2FzZSAnbW91c2V1cCc6XG4gICAgY2FzZSAnZHJhZ2VuZCc6XG4gICAgICBtb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KGRpc3BhdGNoUXVldWUsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICBicmVhaztcbiAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgIC8vIHRvIGtleSBhbmQgaW5wdXQgZXZlbnRzIG9uIGRlbGV0aW9uLCBzbyB3ZSBkaXNjYXJkIGl0LlxuICAgIC8vXG4gICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgLy8gYWZ0ZXIgZWFjaCBrZXkgZW50cnkuIFRoZSBzZWxlY3Rpb24gY2hhbmdlcyBhZnRlciBrZXlkb3duIGFuZCBiZWZvcmVcbiAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgIC8vIFRoaXMgaXMgYWxzbyBvdXIgYXBwcm9hY2ggZm9yIElFIGhhbmRsaW5nLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cblxuICAgIGNhc2UgJ3NlbGVjdGlvbmNoYW5nZSc6XG4gICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgLy8gZmFsbHMgdGhyb3VnaFxuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoZGlzcGF0Y2hRdWV1ZSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0RXZlbnRzJDQoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgcmVhY3ROYW1lID0gdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuZ2V0KGRvbUV2ZW50TmFtZSk7XG5cbiAgaWYgKHJlYWN0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICB2YXIgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG5cbiAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICBjYXNlICdrZXlwcmVzcyc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgIC8vIG5vbi1wcmludGFibGUuIE9uZSB3b3VsZCBleHBlY3QgVGFiIHRvIGJlIGFzIHdlbGwgKGJ1dCBpdCBpc24ndCkuXG4gICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAna2V5ZG93bic6XG4gICAgY2FzZSAna2V5dXAnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdmb2N1cyc7XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdmb2N1c291dCc6XG4gICAgICByZWFjdEV2ZW50VHlwZSA9ICdibHVyJztcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2JlZm9yZWJsdXInOlxuICAgIGNhc2UgJ2FmdGVyYmx1cic6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdjbGljayc6XG4gICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgIC8vIHVud2FudGVkIGNsaWNrIGV2ZW50cy5cbiAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuXG4gICAgY2FzZSAnYXV4Y2xpY2snOlxuICAgIGNhc2UgJ2RibGNsaWNrJzpcbiAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgIGNhc2UgJ21vdXNlbW92ZSc6XG4gICAgY2FzZSAnbW91c2V1cCc6IC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcblxuICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICBjYXNlICdtb3VzZW92ZXInOlxuICAgIGNhc2UgJ2NvbnRleHRtZW51JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY01vdXNlRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RyYWcnOlxuICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgY2FzZSAnZHJhZ2V4aXQnOlxuICAgIGNhc2UgJ2RyYWdsZWF2ZSc6XG4gICAgY2FzZSAnZHJhZ292ZXInOlxuICAgIGNhc2UgJ2RyYWdzdGFydCc6XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RvdWNoY2FuY2VsJzpcbiAgICBjYXNlICd0b3VjaGVuZCc6XG4gICAgY2FzZSAndG91Y2htb3ZlJzpcbiAgICBjYXNlICd0b3VjaHN0YXJ0JzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RvdWNoRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgQU5JTUFUSU9OX0VORDpcbiAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgY2FzZSBBTklNQVRJT05fU1RBUlQ6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBUUkFOU0lUSU9OX0VORDpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2Nyb2xsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2NvcHknOlxuICAgIGNhc2UgJ2N1dCc6XG4gICAgY2FzZSAncGFzdGUnOlxuICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2dvdHBvaW50ZXJjYXB0dXJlJzpcbiAgICBjYXNlICdsb3N0cG9pbnRlcmNhcHR1cmUnOlxuICAgIGNhc2UgJ3BvaW50ZXJjYW5jZWwnOlxuICAgIGNhc2UgJ3BvaW50ZXJkb3duJzpcbiAgICBjYXNlICdwb2ludGVybW92ZSc6XG4gICAgY2FzZSAncG9pbnRlcm91dCc6XG4gICAgY2FzZSAncG9pbnRlcm92ZXInOlxuICAgIGNhc2UgJ3BvaW50ZXJ1cCc6XG4gICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAge1xuICAgIC8vIFNvbWUgZXZlbnRzIGRvbid0IGJ1YmJsZSBpbiB0aGUgYnJvd3Nlci5cbiAgICAvLyBJbiB0aGUgcGFzdCwgUmVhY3QgaGFzIGFsd2F5cyBidWJibGVkIHRoZW0sIGJ1dCB0aGlzIGNhbiBiZSBzdXJwcmlzaW5nLlxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHRyeSBhbGlnbmluZyBjbG9zZXIgdG8gdGhlIGJyb3dzZXIgYmVoYXZpb3IgYnkgbm90IGJ1YmJsaW5nXG4gICAgLy8gdGhlbSBpbiBSZWFjdCBlaXRoZXIuIFdlJ2xsIHN0YXJ0IGJ5IG5vdCBidWJibGluZyBvblNjcm9sbCwgYW5kIHRoZW4gZXhwYW5kLlxuICAgIHZhciBhY2N1bXVsYXRlVGFyZ2V0T25seSA9ICFpbkNhcHR1cmVQaGFzZSAmJiAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYWRkIGFsbCBldmVudHMgZnJvbVxuICAgIC8vIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0IGluIERPTVBsdWdpbkV2ZW50U3lzdGVtLlxuICAgIC8vIFRoZW4gd2UgY2FuIHJlbW92ZSB0aGlzIHNwZWNpYWwgbGlzdC5cbiAgICAvLyBUaGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRoYXQgY2FuIHdhaXQgdW50aWwgUmVhY3QgMTguXG4gICAgZG9tRXZlbnROYW1lID09PSAnc2Nyb2xsJztcblxuICAgIHZhciBfbGlzdGVuZXJzID0gYWNjdW11bGF0ZVNpbmdsZVBoYXNlTGlzdGVuZXJzKHRhcmdldEluc3QsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnQudHlwZSwgaW5DYXB0dXJlUGhhc2UsIGFjY3VtdWxhdGVUYXJnZXRPbmx5KTtcblxuICAgIGlmIChfbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgY3JlYXRlIGV2ZW50IGxhemlseS5cbiAgICAgIHZhciBfZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnRDdG9yKHJlYWN0TmFtZSwgcmVhY3RFdmVudFR5cGUsIG51bGwsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiBfZXZlbnQsXG4gICAgICAgIGxpc3RlbmVyczogX2xpc3RlbmVyc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFRPRE86IHJlbW92ZSB0b3AtbGV2ZWwgc2lkZSBlZmZlY3QuXG5yZWdpc3RlclNpbXBsZUV2ZW50cygpO1xucmVnaXN0ZXJFdmVudHMkMigpO1xucmVnaXN0ZXJFdmVudHMkMSgpO1xucmVnaXN0ZXJFdmVudHMkMygpO1xucmVnaXN0ZXJFdmVudHMoKTtcblxuZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQ1KGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0LCBldmVudFN5c3RlbUZsYWdzLCB0YXJnZXRDb250YWluZXIpIHtcbiAgLy8gVE9ETzogd2Ugc2hvdWxkIHJlbW92ZSB0aGUgY29uY2VwdCBvZiBhIFwiU2ltcGxlRXZlbnRQbHVnaW5cIi5cbiAgLy8gVGhpcyBpcyB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZXZlbnQgc3lzdGVtLiBBbGxcbiAgLy8gdGhlIG90aGVyIHBsdWdpbnMgYXJlIGVzc2VudGlhbGx5IHBvbHlmaWxscy4gU28gdGhlIHBsdWdpblxuICAvLyBzaG91bGQgcHJvYmFibHkgYmUgaW5saW5lZCBzb21ld2hlcmUgYW5kIGhhdmUgaXRzIGxvZ2ljXG4gIC8vIGJlIGNvcmUgdGhlIHRvIGV2ZW50IHN5c3RlbS4gVGhpcyB3b3VsZCBwb3RlbnRpYWxseSBhbGxvd1xuICAvLyB1cyB0byBzaGlwIGJ1aWxkcyBvZiBSZWFjdCB3aXRob3V0IHRoZSBwb2x5ZmlsbGVkIHBsdWdpbnMgYmVsb3cuXG4gIGV4dHJhY3RFdmVudHMkNChkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gIHZhciBzaG91bGRQcm9jZXNzUG9seWZpbGxQbHVnaW5zID0gKGV2ZW50U3lzdGVtRmxhZ3MgJiBTSE9VTERfTk9UX1BST0NFU1NfUE9MWUZJTExfRVZFTlRfUExVR0lOUykgPT09IDA7IC8vIFdlIGRvbid0IHByb2Nlc3MgdGhlc2UgZXZlbnRzIHVubGVzcyB3ZSBhcmUgaW4gdGhlXG4gIC8vIGV2ZW50J3MgbmF0aXZlIFwiYnViYmxlXCIgcGhhc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2UncmVcbiAgLy8gbm90IGluIHRoZSBjYXB0dXJlIHBoYXNlLiBUaGF0J3MgYmVjYXVzZSB3ZSBlbXVsYXRlXG4gIC8vIHRoZSBjYXB0dXJlIHBoYXNlIGhlcmUgc3RpbGwuIFRoaXMgaXMgYSB0cmFkZS1vZmYsXG4gIC8vIGJlY2F1c2UgaW4gYW4gaWRlYWwgd29ybGQgd2Ugd291bGQgbm90IGVtdWxhdGUgYW5kIHVzZVxuICAvLyB0aGUgcGhhc2VzIHByb3Blcmx5LCBsaWtlIHdlIGRvIHdpdGggdGhlIFNpbXBsZUV2ZW50XG4gIC8vIHBsdWdpbi4gSG93ZXZlciwgdGhlIHBsdWdpbnMgYmVsb3cgZWl0aGVyIGV4cGVjdFxuICAvLyBlbXVsYXRpb24gKEVudGVyTGVhdmUpIG9yIHVzZSBzdGF0ZSBsb2NhbGl6ZWQgdG8gdGhhdFxuICAvLyBwbHVnaW4gKEJlZm9yZUlucHV0LCBDaGFuZ2UsIFNlbGVjdCkuIFRoZSBzdGF0ZSBpblxuICAvLyB0aGVzZSBtb2R1bGVzIGNvbXBsaWNhdGVzIHRoaW5ncywgYXMgeW91J2xsIGVzc2VudGlhbGx5XG4gIC8vIGdldCB0aGUgY2FzZSB3aGVyZSB0aGUgY2FwdHVyZSBwaGFzZSBldmVudCBtaWdodCBjaGFuZ2VcbiAgLy8gc3RhdGUsIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgYnViYmxlIGV2ZW50IHRvIGNvbWUgaW5cbiAgLy8gbGF0ZXIgYW5kIG5vdCB0cmlnZ2VyIGFueXRoaW5nIGFzIHRoZSBzdGF0ZSBub3dcbiAgLy8gaW52YWxpZGF0ZXMgdGhlIGhldXJpc3RpY3Mgb2YgdGhlIGV2ZW50IHBsdWdpbi4gV2VcbiAgLy8gY291bGQgYWx0ZXIgYWxsIHRoZXNlIHBsdWdpbnMgdG8gd29yayBpbiBzdWNoIHdheXMsIGJ1dFxuICAvLyB0aGF0IG1pZ2h0IGNhdXNlIG90aGVyIHVua25vd24gc2lkZS1lZmZlY3RzIHRoYXQgd2VcbiAgLy8gY2FuJ3QgZm9yc2VlIHJpZ2h0IG5vdy5cblxuICBpZiAoc2hvdWxkUHJvY2Vzc1BvbHlmaWxsUGx1Z2lucykge1xuICAgIGV4dHJhY3RFdmVudHMkMihkaXNwYXRjaFF1ZXVlLCBkb21FdmVudE5hbWUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCwgZXZlbnRTeXN0ZW1GbGFncyk7XG4gICAgZXh0cmFjdEV2ZW50cyQxKGRpc3BhdGNoUXVldWUsIGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBleHRyYWN0RXZlbnRzJDMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGV4dHJhY3RFdmVudHMoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICB9XG59IC8vIExpc3Qgb2YgZXZlbnRzIHRoYXQgbmVlZCB0byBiZSBpbmRpdmlkdWFsbHkgYXR0YWNoZWQgdG8gbWVkaWEgZWxlbWVudHMuXG5cblxudmFyIG1lZGlhRXZlbnRUeXBlcyA9IFsnYWJvcnQnLCAnY2FucGxheScsICdjYW5wbGF5dGhyb3VnaCcsICdkdXJhdGlvbmNoYW5nZScsICdlbXB0aWVkJywgJ2VuY3J5cHRlZCcsICdlbmRlZCcsICdlcnJvcicsICdsb2FkZWRkYXRhJywgJ2xvYWRlZG1ldGFkYXRhJywgJ2xvYWRzdGFydCcsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZWNoYW5nZScsICdzZWVrZWQnLCAnc2Vla2luZycsICdzdGFsbGVkJywgJ3N1c3BlbmQnLCAndGltZXVwZGF0ZScsICd2b2x1bWVjaGFuZ2UnLCAnd2FpdGluZyddOyAvLyBXZSBzaG91bGQgbm90IGRlbGVnYXRlIHRoZXNlIGV2ZW50cyB0byB0aGUgY29udGFpbmVyLCBidXQgcmF0aGVyXG4vLyBzZXQgdGhlbSBvbiB0aGUgYWN0dWFsIHRhcmdldCBlbGVtZW50IGl0c2VsZi4gVGhpcyBpcyBwcmltYXJpbHlcbi8vIGJlY2F1c2UgdGhlc2UgZXZlbnRzIGRvIG5vdCBjb25zaXN0ZW50bHkgYnViYmxlIGluIHRoZSBET00uXG5cbnZhciBub25EZWxlZ2F0ZWRFdmVudHMgPSBuZXcgU2V0KFsnY2FuY2VsJywgJ2Nsb3NlJywgJ2ludmFsaWQnLCAnbG9hZCcsICdzY3JvbGwnLCAndG9nZ2xlJ10uY29uY2F0KG1lZGlhRXZlbnRUeXBlcykpO1xuXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gIHZhciB0eXBlID0gZXZlbnQudHlwZSB8fCAndW5rbm93bi1ldmVudCc7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0O1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tBbmRDYXRjaEZpcnN0RXJyb3IodHlwZSwgbGlzdGVuZXIsIHVuZGVmaW5lZCwgZXZlbnQpO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWVJdGVtc0luT3JkZXIoZXZlbnQsIGRpc3BhdGNoTGlzdGVuZXJzLCBpbkNhcHR1cmVQaGFzZSkge1xuICB2YXIgcHJldmlvdXNJbnN0YW5jZTtcblxuICBpZiAoaW5DYXB0dXJlUGhhc2UpIHtcbiAgICBmb3IgKHZhciBpID0gZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IGRpc3BhdGNoTGlzdGVuZXJzW2ldLFxuICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2UsXG4gICAgICAgICAgY3VycmVudFRhcmdldCA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgICAgbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5saXN0ZW5lcjtcblxuICAgICAgaWYgKGluc3RhbmNlICE9PSBwcmV2aW91c0luc3RhbmNlICYmIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KTtcbiAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRfaSA9IGRpc3BhdGNoTGlzdGVuZXJzW19pXSxcbiAgICAgICAgICBfaW5zdGFuY2UgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuaW5zdGFuY2UsXG4gICAgICAgICAgX2N1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kuY3VycmVudFRhcmdldCxcbiAgICAgICAgICBfbGlzdGVuZXIgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkX2kubGlzdGVuZXI7XG5cbiAgICAgIGlmIChfaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgX2xpc3RlbmVyLCBfY3VycmVudFRhcmdldCk7XG4gICAgICBwcmV2aW91c0luc3RhbmNlID0gX2luc3RhbmNlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKSB7XG4gIHZhciBpbkNhcHR1cmVQaGFzZSA9IChldmVudFN5c3RlbUZsYWdzICYgSVNfQ0FQVFVSRV9QSEFTRSkgIT09IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldLFxuICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQsXG4gICAgICAgIGxpc3RlbmVycyA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlSXRlbXNJbk9yZGVyKGV2ZW50LCBsaXN0ZW5lcnMsIGluQ2FwdHVyZVBoYXNlKTsgLy8gIGV2ZW50IHN5c3RlbSBkb2Vzbid0IHVzZSBwb29saW5nLlxuICB9IC8vIFRoaXMgd291bGQgYmUgYSBnb29kIHRpbWUgdG8gcmV0aHJvdyBpZiBhbnkgb2YgdGhlIGV2ZW50IGhhbmRsZXJzIHRocmV3LlxuXG5cbiAgcmV0aHJvd0NhdWdodEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnRzRm9yUGx1Z2lucyhkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIG5hdGl2ZUV2ZW50LCB0YXJnZXRJbnN0LCB0YXJnZXRDb250YWluZXIpIHtcbiAgdmFyIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICB2YXIgZGlzcGF0Y2hRdWV1ZSA9IFtdO1xuICBleHRyYWN0RXZlbnRzJDUoZGlzcGF0Y2hRdWV1ZSwgZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICBwcm9jZXNzRGlzcGF0Y2hRdWV1ZShkaXNwYXRjaFF1ZXVlLCBldmVudFN5c3RlbUZsYWdzKTtcbn1cblxuZnVuY3Rpb24gbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChkb21FdmVudE5hbWUsIHRhcmdldEVsZW1lbnQpIHtcbiAgdmFyIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIgPSBmYWxzZTtcbiAgdmFyIGxpc3RlbmVyU2V0ID0gZ2V0RXZlbnRMaXN0ZW5lclNldCh0YXJnZXRFbGVtZW50KTtcbiAgdmFyIGxpc3RlbmVyU2V0S2V5ID0gZ2V0TGlzdGVuZXJTZXRLZXkoZG9tRXZlbnROYW1lLCBpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKTtcblxuICBpZiAoIWxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkpIHtcbiAgICBhZGRUcmFwcGVkRXZlbnRMaXN0ZW5lcih0YXJnZXRFbGVtZW50LCBkb21FdmVudE5hbWUsIElTX05PTl9ERUxFR0FURUQsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cbnZhciBsaXN0ZW5pbmdNYXJrZXIgPSAnX3JlYWN0TGlzdGVuaW5nJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdKSB7XG4gICAgICAvLyBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb246IGRvbid0IGl0ZXJhdGUgdGhyb3VnaCBldmVudHNcbiAgICAgIC8vIGZvciB0aGUgc2FtZSBwb3J0YWwgY29udGFpbmVyIG9yIHJvb3Qgbm9kZSBtb3JlIHRoYW4gb25jZS5cbiAgICAgIC8vIFRPRE86IG9uY2Ugd2UgcmVtb3ZlIHRoZSBmbGFnLCB3ZSBtYXkgYmUgYWJsZSB0byBhbHNvXG4gICAgICAvLyByZW1vdmUgc29tZSBvZiB0aGUgYm9va2tlZXBpbmcgbWFwcyB1c2VkIGZvciBsYXppbmVzcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gdHJ1ZTtcbiAgICBhbGxOYXRpdmVFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZG9tRXZlbnROYW1lKSB7XG4gICAgICBpZiAoIW5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgZmFsc2UsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIHRydWUsIHJvb3RDb250YWluZXJFbGVtZW50LCBudWxsKTtcbiAgICB9KTtcbiAgfVxufVxuZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHJvb3RDb250YWluZXJFbGVtZW50LCB0YXJnZXRFbGVtZW50KSB7XG4gIHZhciBldmVudFN5c3RlbUZsYWdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDQgJiYgYXJndW1lbnRzWzRdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbNF0gOiAwO1xuICB2YXIgdGFyZ2V0ID0gcm9vdENvbnRhaW5lckVsZW1lbnQ7IC8vIHNlbGVjdGlvbmNoYW5nZSBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgZG9jdW1lbnRcbiAgLy8gb3RoZXJ3aXNlIGl0IHdvbid0IGNhcHR1cmUgaW5jb21pbmcgZXZlbnRzIHRoYXQgYXJlIG9ubHlcbiAgLy8gdHJpZ2dlcmVkIG9uIHRoZSBkb2N1bWVudCBkaXJlY3RseS5cblxuICBpZiAoZG9tRXZlbnROYW1lID09PSAnc2VsZWN0aW9uY2hhbmdlJyAmJiByb290Q29udGFpbmVyRWxlbWVudC5ub2RlVHlwZSAhPT0gRE9DVU1FTlRfTk9ERSkge1xuICAgIHRhcmdldCA9IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gIH0gLy8gSWYgdGhlIGV2ZW50IGNhbiBiZSBkZWxlZ2F0ZWQgKG9yIGlzIGNhcHR1cmUgcGhhc2UpLCB3ZSBjYW5cbiAgLy8gcmVnaXN0ZXIgaXQgdG8gdGhlIHJvb3QgY29udGFpbmVyLiBPdGhlcndpc2UsIHdlIHNob3VsZFxuICAvLyByZWdpc3RlciB0aGUgZXZlbnQgdG8gdGhlIHRhcmdldCBlbGVtZW50IGFuZCBtYXJrIGl0IGFzXG4gIC8vIGEgbm9uLWRlbGVnYXRlZCBldmVudC5cblxuXG4gIGlmICh0YXJnZXRFbGVtZW50ICE9PSBudWxsICYmICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyICYmIG5vbkRlbGVnYXRlZEV2ZW50cy5oYXMoZG9tRXZlbnROYW1lKSkge1xuICAgIC8vIEZvciBhbGwgbm9uLWRlbGVnYXRlZCBldmVudHMsIGFwYXJ0IGZyb20gc2Nyb2xsLCB3ZSBhdHRhY2hcbiAgICAvLyB0aGVpciBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHJlc3BlY3RpdmUgZWxlbWVudHMgdGhhdCB0aGVpclxuICAgIC8vIGV2ZW50cyBmaXJlIG9uLiBUaGF0IG1lYW5zIHdlIGNhbiBza2lwIHRoaXMgc3RlcCwgYXMgZXZlbnRcbiAgICAvLyBsaXN0ZW5lciBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHByZXZpb3VzbHkuIEhvd2V2ZXIsIHdlXG4gICAgLy8gc3BlY2lhbCBjYXNlIHRoZSBzY3JvbGwgZXZlbnQgYmVjYXVzZSB0aGUgcmVhbGl0eSBpcyB0aGF0IGFueVxuICAgIC8vIGVsZW1lbnQgY2FuIHNjcm9sbC5cbiAgICAvLyBUT0RPOiBpZGVhbGx5LCB3ZSdkIGV2ZW50dWFsbHkgYXBwbHkgdGhlIHNhbWUgbG9naWMgdG8gYWxsXG4gICAgLy8gZXZlbnRzIGZyb20gdGhlIG5vbkRlbGVnYXRlZEV2ZW50cyBsaXN0LiBUaGVuIHdlIGNhbiByZW1vdmVcbiAgICAvLyB0aGlzIHNwZWNpYWwgY2FzZSBhbmQgdXNlIHRoZSBzYW1lIGxvZ2ljIGZvciBhbGwgZXZlbnRzLlxuICAgIGlmIChkb21FdmVudE5hbWUgIT09ICdzY3JvbGwnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnRTeXN0ZW1GbGFncyB8PSBJU19OT05fREVMRUdBVEVEO1xuICAgIHRhcmdldCA9IHRhcmdldEVsZW1lbnQ7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJTZXQgPSBnZXRFdmVudExpc3RlbmVyU2V0KHRhcmdldCk7XG4gIHZhciBsaXN0ZW5lclNldEtleSA9IGdldExpc3RlbmVyU2V0S2V5KGRvbUV2ZW50TmFtZSwgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lcik7IC8vIElmIHRoZSBsaXN0ZW5lciBlbnRyeSBpcyBlbXB0eSBvciB3ZSBzaG91bGQgdXBncmFkZSwgdGhlblxuICAvLyB3ZSBuZWVkIHRvIHRyYXAgYW4gZXZlbnQgbGlzdGVuZXIgb250byB0aGUgdGFyZ2V0LlxuXG4gIGlmICghbGlzdGVuZXJTZXQuaGFzKGxpc3RlbmVyU2V0S2V5KSkge1xuICAgIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgICBldmVudFN5c3RlbUZsYWdzIHw9IElTX0NBUFRVUkVfUEhBU0U7XG4gICAgfVxuXG4gICAgYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIpO1xuICAgIGxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lclNldEtleSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIGlzRGVmZXJyZWRMaXN0ZW5lckZvckxlZ2FjeUZCU3VwcG9ydCkge1xuICB2YXIgbGlzdGVuZXIgPSBjcmVhdGVFdmVudExpc3RlbmVyV3JhcHBlcldpdGhQcmlvcml0eSh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncyk7IC8vIElmIHBhc3NpdmUgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZW4gdGhlIGV2ZW50IHdpbGwgYmVcbiAgLy8gYWN0aXZlIGFuZCBub3QgcGFzc2l2ZS5cblxuICB2YXIgaXNQYXNzaXZlTGlzdGVuZXIgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkKSB7XG4gICAgLy8gQnJvd3NlcnMgaW50cm9kdWNlZCBhbiBpbnRlcnZlbnRpb24sIG1ha2luZyB0aGVzZSBldmVudHNcbiAgICAvLyBwYXNzaXZlIGJ5IGRlZmF1bHQgb24gZG9jdW1lbnQuIFJlYWN0IGRvZXNuJ3QgYmluZCB0aGVtXG4gICAgLy8gdG8gZG9jdW1lbnQgYW55bW9yZSwgYnV0IGNoYW5naW5nIHRoaXMgbm93IHdvdWxkIHVuZG9cbiAgICAvLyB0aGUgcGVyZm9ybWFuY2Ugd2lucyBmcm9tIHRoZSBjaGFuZ2UuIFNvIHdlIGVtdWxhdGVcbiAgICAvLyB0aGUgZXhpc3RpbmcgYmVoYXZpb3IgbWFudWFsbHkgb24gdGhlIHJvb3RzIG5vdy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE5NjUxXG4gICAgaWYgKGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IGRvbUV2ZW50TmFtZSA9PT0gJ3RvdWNobW92ZScgfHwgZG9tRXZlbnROYW1lID09PSAnd2hlZWwnKSB7XG4gICAgICBpc1Bhc3NpdmVMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0Q29udGFpbmVyID0gIHRhcmdldENvbnRhaW5lcjtcbiAgdmFyIHVuc3Vic2NyaWJlTGlzdGVuZXI7IC8vIFdoZW4gbGVnYWN5RkJTdXBwb3J0IGlzIGVuYWJsZWQsIGl0J3MgZm9yIHdoZW4gd2VcblxuXG4gIGlmIChpc0NhcHR1cmVQaGFzZUxpc3RlbmVyKSB7XG4gICAgaWYgKGlzUGFzc2l2ZUxpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuc3Vic2NyaWJlTGlzdGVuZXIgPSBhZGRFdmVudENhcHR1cmVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50Q2FwdHVyZUxpc3RlbmVyKHRhcmdldENvbnRhaW5lciwgZG9tRXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChpc1Bhc3NpdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bnN1YnNjcmliZUxpc3RlbmVyID0gYWRkRXZlbnRCdWJibGVMaXN0ZW5lcldpdGhQYXNzaXZlRmxhZyh0YXJnZXRDb250YWluZXIsIGRvbUV2ZW50TmFtZSwgbGlzdGVuZXIsIGlzUGFzc2l2ZUxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5zdWJzY3JpYmVMaXN0ZW5lciA9IGFkZEV2ZW50QnViYmxlTGlzdGVuZXIodGFyZ2V0Q29udGFpbmVyLCBkb21FdmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNNYXRjaGluZ1Jvb3RDb250YWluZXIoZ3JhbmRDb250YWluZXIsIHRhcmdldENvbnRhaW5lcikge1xuICByZXR1cm4gZ3JhbmRDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lciB8fCBncmFuZENvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGdyYW5kQ29udGFpbmVyLnBhcmVudE5vZGUgPT09IHRhcmdldENvbnRhaW5lcjtcbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIHRhcmdldEluc3QsIHRhcmdldENvbnRhaW5lcikge1xuICB2YXIgYW5jZXN0b3JJbnN0ID0gdGFyZ2V0SW5zdDtcblxuICBpZiAoKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19FVkVOVF9IQU5ETEVfTk9OX01BTkFHRURfTk9ERSkgPT09IDAgJiYgKGV2ZW50U3lzdGVtRmxhZ3MgJiBJU19OT05fREVMRUdBVEVEKSA9PT0gMCkge1xuICAgIHZhciB0YXJnZXRDb250YWluZXJOb2RlID0gdGFyZ2V0Q29udGFpbmVyOyAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGxlZ2FjeSBGQiBzdXBwb3J0IGZsYWcsIHdlXG5cbiAgICBpZiAodGFyZ2V0SW5zdCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhlIGJlbG93IGxvZ2ljIGF0dGVtcHRzIHRvIHdvcmsgb3V0IGlmIHdlIG5lZWQgdG8gY2hhbmdlXG4gICAgICAvLyB0aGUgdGFyZ2V0IGZpYmVyIHRvIGEgZGlmZmVyZW50IGFuY2VzdG9yLiBXZSBoYWQgc2ltaWxhciBsb2dpY1xuICAgICAgLy8gaW4gdGhlIGxlZ2FjeSBldmVudCBzeXN0ZW0sIGV4Y2VwdCB0aGUgYmlnIGRpZmZlcmVuY2UgYmV0d2VlblxuICAgICAgLy8gc3lzdGVtcyBpcyB0aGF0IHRoZSBtb2Rlcm4gZXZlbnQgc3lzdGVtIG5vdyBoYXMgYW4gZXZlbnQgbGlzdGVuZXJcbiAgICAgIC8vIGF0dGFjaGVkIHRvIGVhY2ggUmVhY3QgUm9vdCBhbmQgUmVhY3QgUG9ydGFsIFJvb3QuIFRvZ2V0aGVyLFxuICAgICAgLy8gdGhlIERPTSBub2RlcyByZXByZXNlbnRpbmcgdGhlc2Ugcm9vdHMgYXJlIHRoZSBcInJvb3RDb250YWluZXJcIi5cbiAgICAgIC8vIFRvIGZpZ3VyZSBvdXQgd2hpY2ggYW5jZXN0b3IgaW5zdGFuY2Ugd2Ugc2hvdWxkIHVzZSwgd2UgdHJhdmVyc2VcbiAgICAgIC8vIHVwIHRoZSBmaWJlciB0cmVlIGZyb20gdGhlIHRhcmdldCBpbnN0YW5jZSBhbmQgYXR0ZW1wdCB0byBmaW5kXG4gICAgICAvLyByb290IGJvdW5kYXJpZXMgdGhhdCBtYXRjaCB0aGF0IG9mIG91ciBjdXJyZW50IFwicm9vdENvbnRhaW5lclwiLlxuICAgICAgLy8gSWYgd2UgZmluZCB0aGF0IFwicm9vdENvbnRhaW5lclwiLCB3ZSBmaW5kIHRoZSBwYXJlbnQgZmliZXJcbiAgICAgIC8vIHN1Yi10cmVlIGZvciB0aGF0IHJvb3QgYW5kIG1ha2UgdGhhdCBvdXIgYW5jZXN0b3IgaW5zdGFuY2UuXG4gICAgICB2YXIgbm9kZSA9IHRhcmdldEluc3Q7XG5cbiAgICAgIG1haW5Mb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlVGFnID0gbm9kZS50YWc7XG5cbiAgICAgICAgaWYgKG5vZGVUYWcgPT09IEhvc3RSb290IHx8IG5vZGVUYWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcblxuICAgICAgICAgIGlmIChpc01hdGNoaW5nUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhcmdldENvbnRhaW5lck5vZGUpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZVRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBpcyBhIHBvcnRhbCwgYnV0IGl0J3Mgbm90IHRoZSByb290Q29udGFpbmVyIHdlJ3JlIGxvb2tpbmcgZm9yLlxuICAgICAgICAgICAgLy8gTm9ybWFsbHkgcG9ydGFscyBoYW5kbGUgdGhlaXIgb3duIGV2ZW50cyBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSByb290LlxuICAgICAgICAgICAgLy8gU28gd2Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBub3cuIEhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgdGhpcyBwb3J0YWxcbiAgICAgICAgICAgIC8vIHdhcyBwYXJ0IG9mICpvdXIqIHJvb3QuXG4gICAgICAgICAgICB2YXIgZ3JhbmROb2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgICAgICAgIHdoaWxlIChncmFuZE5vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdmFyIGdyYW5kVGFnID0gZ3JhbmROb2RlLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZ3JhbmRUYWcgPT09IEhvc3RSb290IHx8IGdyYW5kVGFnID09PSBIb3N0UG9ydGFsKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdyYW5kQ29udGFpbmVyID0gZ3JhbmROb2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTWF0Y2hpbmdSb290Q29udGFpbmVyKGdyYW5kQ29udGFpbmVyLCB0YXJnZXRDb250YWluZXJOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgcm9vdENvbnRhaW5lciB3ZSdyZSBsb29raW5nIGZvciBhbmQgd2UgZm91bmQgaXQgYXNcbiAgICAgICAgICAgICAgICAgIC8vIGEgcGFyZW50IG9mIHRoZSBQb3J0YWwuIFRoYXQgbWVhbnMgd2UgY2FuIGlnbm9yZSBpdCBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgLy8gUG9ydGFsIHdpbGwgYnViYmxlIHRocm91Z2ggdG8gdXMuXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZ3JhbmROb2RlID0gZ3JhbmROb2RlLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgaXQncyBjb3JyZXNwb25kaW5nIGhvc3QgZmliZXIgaW4gdGhlIG90aGVyXG4gICAgICAgICAgLy8gdHJlZS4gVG8gZG8gdGhpcyB3ZSBjYW4gdXNlIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLCBidXQgd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpYmVyIGlzIGEgaG9zdCBpbnN0YW5jZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgLy8gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aHJvdWdoIHRoZSBET00gdGlsbCB3ZSBmaW5kIHRoZSBjb3JyZWN0XG4gICAgICAgICAgLy8gbm9kZSB0aGF0IGlzIGZyb20gdGhlIG90aGVyIHRyZWUuXG5cblxuICAgICAgICAgIHdoaWxlIChjb250YWluZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwYXJlbnROb2RlID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50Tm9kZS50YWc7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUYWcgPT09IEhvc3RDb21wb25lbnQgfHwgcGFyZW50VGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICAgICAgICBub2RlID0gYW5jZXN0b3JJbnN0ID0gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY29udGludWUgbWFpbkxvb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBiYXRjaGVkRXZlbnRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2hFdmVudHNGb3JQbHVnaW5zKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgbmF0aXZlRXZlbnQsIGFuY2VzdG9ySW5zdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICByZXR1cm4ge1xuICAgIGluc3RhbmNlOiBpbnN0YW5jZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXIsXG4gICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICB9O1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlU2luZ2xlUGhhc2VMaXN0ZW5lcnModGFyZ2V0RmliZXIsIHJlYWN0TmFtZSwgbmF0aXZlRXZlbnRUeXBlLCBpbkNhcHR1cmVQaGFzZSwgYWNjdW11bGF0ZVRhcmdldE9ubHkpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICE9PSBudWxsID8gcmVhY3ROYW1lICsgJ0NhcHR1cmUnIDogbnVsbDtcbiAgdmFyIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2UgPyBjYXB0dXJlTmFtZSA6IHJlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXRGaWJlcjtcbiAgdmFyIGxhc3RIb3N0Q29tcG9uZW50ID0gbnVsbDsgLy8gQWNjdW11bGF0ZSBhbGwgaW5zdGFuY2VzIGFuZCBsaXN0ZW5lcnMgdmlhIHRoZSB0YXJnZXQgLT4gcm9vdCBwYXRoLlxuXG4gIHdoaWxlIChpbnN0YW5jZSAhPT0gbnVsbCkge1xuICAgIHZhciBfaW5zdGFuY2UyID0gaW5zdGFuY2UsXG4gICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTIuc3RhdGVOb2RlLFxuICAgICAgICB0YWcgPSBfaW5zdGFuY2UyLnRhZzsgLy8gSGFuZGxlIGxpc3RlbmVycyB0aGF0IGFyZSBvbiBIb3N0Q29tcG9uZW50cyAoaS5lLiA8ZGl2PilcblxuICAgIGlmICh0YWcgPT09IEhvc3RDb21wb25lbnQgJiYgc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICBsYXN0SG9zdENvbXBvbmVudCA9IHN0YXRlTm9kZTsgLy8gY3JlYXRlRXZlbnRIYW5kbGUgbGlzdGVuZXJzXG5cblxuICAgICAgaWYgKHJlYWN0RXZlbnROYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCByZWFjdEV2ZW50TmFtZSk7XG5cbiAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBsaXN0ZW5lciwgbGFzdEhvc3RDb21wb25lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gLy8gSWYgd2UgYXJlIG9ubHkgYWNjdW11bGF0aW5nIGV2ZW50cyBmb3IgdGhlIHRhcmdldCwgdGhlbiB3ZSBkb24ndFxuICAgIC8vIGNvbnRpbnVlIHRvIHByb3BhZ2F0ZSB0aHJvdWdoIHRoZSBSZWFjdCBmaWJlciB0cmVlIHRvIGZpbmQgb3RoZXJcbiAgICAvLyBsaXN0ZW5lcnMuXG5cblxuICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufSAvLyBXZSBzaG91bGQgb25seSB1c2UgdGhpcyBmdW5jdGlvbiBmb3I6XG4vLyAtIEJlZm9yZUlucHV0RXZlbnRQbHVnaW5cbi8vIC0gQ2hhbmdlRXZlbnRQbHVnaW5cbi8vIC0gU2VsZWN0RXZlbnRQbHVnaW5cbi8vIFRoaXMgaXMgYmVjYXVzZSB3ZSBvbmx5IHByb2Nlc3MgdGhlc2UgcGx1Z2luc1xuLy8gaW4gdGhlIGJ1YmJsZSBwaGFzZSwgc28gd2UgbmVlZCB0byBhY2N1bXVsYXRlIHR3b1xuLy8gcGhhc2UgZXZlbnQgbGlzdGVuZXJzICh2aWEgZW11bGF0aW9uKS5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgdmFyIGNhcHR1cmVOYW1lID0gcmVhY3ROYW1lICsgJ0NhcHR1cmUnO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBpbnN0YW5jZSA9IHRhcmdldEZpYmVyOyAvLyBBY2N1bXVsYXRlIGFsbCBpbnN0YW5jZXMgYW5kIGxpc3RlbmVycyB2aWEgdGhlIHRhcmdldCAtPiByb290IHBhdGguXG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgdmFyIF9pbnN0YW5jZTMgPSBpbnN0YW5jZSxcbiAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlMy5zdGF0ZU5vZGUsXG4gICAgICAgIHRhZyA9IF9pbnN0YW5jZTMudGFnOyAvLyBIYW5kbGUgbGlzdGVuZXJzIHRoYXQgYXJlIG9uIEhvc3RDb21wb25lbnRzIChpLmUuIDxkaXY+KVxuXG4gICAgaWYgKHRhZyA9PT0gSG9zdENvbXBvbmVudCAmJiBzdGF0ZU5vZGUgIT09IG51bGwpIHtcbiAgICAgIHZhciBjdXJyZW50VGFyZ2V0ID0gc3RhdGVOb2RlO1xuICAgICAgdmFyIGNhcHR1cmVMaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTmFtZSk7XG5cbiAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICBsaXN0ZW5lcnMudW5zaGlmdChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBjYXB0dXJlTGlzdGVuZXIsIGN1cnJlbnRUYXJnZXQpKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGJ1YmJsZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0TmFtZSk7XG5cbiAgICAgIGlmIChidWJibGVMaXN0ZW5lciAhPSBudWxsKSB7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGJ1YmJsZUxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICByZXR1cm4gbGlzdGVuZXJzO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICBpZiAoaW5zdCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZG8ge1xuICAgIGluc3QgPSBpbnN0LnJldHVybjsgLy8gVE9ETzogSWYgdGhpcyBpcyBhIEhvc3RSb290IHdlIG1pZ2h0IHdhbnQgdG8gYmFpbCBvdXQuXG4gICAgLy8gVGhhdCBpcyBkZXBlbmRpbmcgb24gaWYgd2Ugd2FudCBuZXN0ZWQgc3VidHJlZXMgKGxheWVycykgdG8gYnViYmxlXG4gICAgLy8gZXZlbnRzIHRvIHRoZWlyIHBhcmVudC4gV2UgY291bGQgYWxzbyBnbyB0aHJvdWdoIHBhcmVudE5vZGUgb24gdGhlXG4gICAgLy8gaG9zdCBub2RlIGJ1dCB0aGF0IHdvdWxkbid0IHdvcmsgZm9yIFJlYWN0IE5hdGl2ZSBhbmQgZG9lc24ndCBsZXQgdXNcbiAgICAvLyBkbyB0aGUgcG9ydGFsIGZlYXR1cmUuXG4gIH0gd2hpbGUgKGluc3QgJiYgaW5zdC50YWcgIT09IEhvc3RDb21wb25lbnQpO1xuXG4gIGlmIChpbnN0KSB7XG4gICAgcmV0dXJuIGluc3Q7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICB2YXIgbm9kZUEgPSBpbnN0QTtcbiAgdmFyIG5vZGVCID0gaW5zdEI7XG4gIHZhciBkZXB0aEEgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBBID0gbm9kZUE7IHRlbXBBOyB0ZW1wQSA9IGdldFBhcmVudCh0ZW1wQSkpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuXG4gIHZhciBkZXB0aEIgPSAwO1xuXG4gIGZvciAodmFyIHRlbXBCID0gbm9kZUI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHtcbiAgICBkZXB0aEIrKztcbiAgfSAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhBIC0gZGVwdGhCID4gMCkge1xuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBkZXB0aEEtLTtcbiAgfSAvLyBJZiBCIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG5cblxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIG5vZGVCID0gZ2V0UGFyZW50KG5vZGVCKTtcbiAgICBkZXB0aEItLTtcbiAgfSAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cblxuXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcblxuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChub2RlQSA9PT0gbm9kZUIgfHwgbm9kZUIgIT09IG51bGwgJiYgbm9kZUEgPT09IG5vZGVCLmFsdGVybmF0ZSkge1xuICAgICAgcmV0dXJuIG5vZGVBO1xuICAgIH1cblxuICAgIG5vZGVBID0gZ2V0UGFyZW50KG5vZGVBKTtcbiAgICBub2RlQiA9IGdldFBhcmVudChub2RlQik7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChkaXNwYXRjaFF1ZXVlLCBldmVudCwgdGFyZ2V0LCBjb21tb24sIGluQ2FwdHVyZVBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuX3JlYWN0TmFtZTtcbiAgdmFyIGxpc3RlbmVycyA9IFtdO1xuICB2YXIgaW5zdGFuY2UgPSB0YXJnZXQ7XG5cbiAgd2hpbGUgKGluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgaWYgKGluc3RhbmNlID09PSBjb21tb24pIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBfaW5zdGFuY2U0ID0gaW5zdGFuY2UsXG4gICAgICAgIGFsdGVybmF0ZSA9IF9pbnN0YW5jZTQuYWx0ZXJuYXRlLFxuICAgICAgICBzdGF0ZU5vZGUgPSBfaW5zdGFuY2U0LnN0YXRlTm9kZSxcbiAgICAgICAgdGFnID0gX2luc3RhbmNlNC50YWc7XG5cbiAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZSA9PT0gY29tbW9uKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSBIb3N0Q29tcG9uZW50ICYmIHN0YXRlTm9kZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBzdGF0ZU5vZGU7XG5cbiAgICAgIGlmIChpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgY2FwdHVyZUxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuXG4gICAgICAgIGlmIChjYXB0dXJlTGlzdGVuZXIgIT0gbnVsbCkge1xuICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGNhcHR1cmVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFpbkNhcHR1cmVQaGFzZSkge1xuICAgICAgICB2YXIgYnViYmxlTGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0YW5jZSwgcmVnaXN0cmF0aW9uTmFtZSk7XG5cbiAgICAgICAgaWYgKGJ1YmJsZUxpc3RlbmVyICE9IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMucHVzaChjcmVhdGVEaXNwYXRjaExpc3RlbmVyKGluc3RhbmNlLCBidWJibGVMaXN0ZW5lciwgY3VycmVudFRhcmdldCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5yZXR1cm47XG4gIH1cblxuICBpZiAobGlzdGVuZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICBsaXN0ZW5lcnM6IGxpc3RlbmVyc1xuICAgIH0pO1xuICB9XG59IC8vIFdlIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGZvcjpcbi8vIC0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luXG4vLyBUaGlzIGlzIGJlY2F1c2Ugd2Ugb25seSBwcm9jZXNzIHRoaXMgcGx1Z2luXG4vLyBpbiB0aGUgYnViYmxlIHBoYXNlLCBzbyB3ZSBuZWVkIHRvIGFjY3VtdWxhdGUgdHdvXG4vLyBwaGFzZSBldmVudCBsaXN0ZW5lcnMuXG5cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVUd29QaGFzZUxpc3RlbmVycyhkaXNwYXRjaFF1ZXVlLCBsZWF2ZUV2ZW50LCBlbnRlckV2ZW50LCBmcm9tLCB0bykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG5cbiAgaWYgKGZyb20gIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGxlYXZlRXZlbnQsIGZyb20sIGNvbW1vbiwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHRvICE9PSBudWxsICYmIGVudGVyRXZlbnQgIT09IG51bGwpIHtcbiAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KGRpc3BhdGNoUXVldWUsIGVudGVyRXZlbnQsIHRvLCBjb21tb24sIHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBnZXRMaXN0ZW5lclNldEtleShkb21FdmVudE5hbWUsIGNhcHR1cmUpIHtcbiAgcmV0dXJuIGRvbUV2ZW50TmFtZSArIFwiX19cIiArIChjYXB0dXJlID8gJ2NhcHR1cmUnIDogJ2J1YmJsZScpO1xufVxuXG52YXIgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSBmYWxzZTtcbnZhciBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCA9ICdkYW5nZXJvdXNseVNldElubmVySFRNTCc7XG52YXIgU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HID0gJ3N1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyc7XG52YXIgU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbnZhciBBVVRPRk9DVVMgPSAnYXV0b0ZvY3VzJztcbnZhciBDSElMRFJFTiA9ICdjaGlsZHJlbic7XG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwkMSA9ICdfX2h0bWwnO1xudmFyIEhUTUxfTkFNRVNQQUNFJDEgPSBOYW1lc3BhY2VzLmh0bWw7XG52YXIgd2FybmVkVW5rbm93blRhZ3M7XG52YXIgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nO1xudmFyIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQ7XG52YXIgd2FybkZvclRleHREaWZmZXJlbmNlO1xudmFyIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZTtcbnZhciB3YXJuRm9yRXh0cmFBdHRyaWJ1dGVzO1xudmFyIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcjtcbnZhciBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nO1xudmFyIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZTtcbnZhciBub3JtYWxpemVIVE1MO1xuXG57XG4gIHdhcm5lZFVua25vd25UYWdzID0ge1xuICAgIC8vIFRoZXJlIGFyZSB3b3JraW5nIHBvbHlmaWxscyBmb3IgPGRpYWxvZz4uIExldCBwZW9wbGUgdXNlIGl0LlxuICAgIGRpYWxvZzogdHJ1ZSxcbiAgICAvLyBFbGVjdHJvbiBzaGlwcyBhIGN1c3RvbSA8d2Vidmlldz4gdGFnIHRvIGRpc3BsYXkgZXh0ZXJuYWwgd2ViIGNvbnRlbnQgaW5cbiAgICAvLyBhbiBpc29sYXRlZCBmcmFtZSBhbmQgcHJvY2Vzcy5cbiAgICAvLyBUaGlzIHRhZyBpcyBub3QgcHJlc2VudCBpbiBub24gRWxlY3Ryb24gZW52aXJvbm1lbnRzIHN1Y2ggYXMgSlNEb20gd2hpY2hcbiAgICAvLyBpcyBvZnRlbiB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9lbGVjdHJvbmpzLm9yZy9kb2NzL2FwaS93ZWJ2aWV3LXRhZ1xuICAgIHdlYnZpZXc6IHRydWVcbiAgfTtcblxuICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50ID0gZnVuY3Rpb24gKHR5cGUsIHByb3BzKSB7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzKHR5cGUsIHByb3BzKTtcbiAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMSh0eXBlLCBwcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzJDIodHlwZSwgcHJvcHMsIHtcbiAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzXG4gICAgfSk7XG4gIH07IC8vIElFIDExIHBhcnNlcyAmIG5vcm1hbGl6ZXMgdGhlIHN0eWxlIGF0dHJpYnV0ZSBhcyBvcHBvc2VkIHRvIG90aGVyXG4gIC8vIGJyb3dzZXJzLiBJdCBhZGRzIHNwYWNlcyBhbmQgc29ydHMgdGhlIHByb3BlcnRpZXMgaW4gc29tZVxuICAvLyBub24tYWxwaGFiZXRpY2FsIG9yZGVyLiBIYW5kbGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgc29ydGluZyBDU1NcbiAgLy8gcHJvcGVydGllcyBpbiB0aGUgY2xpZW50ICYgc2VydmVyIHZlcnNpb25zIG9yIGFwcGx5aW5nXG4gIC8vIGBleHBlY3RlZFN0eWxlYCB0byBhIHRlbXBvcmFyeSBET00gbm9kZSB0byByZWFkIGl0cyBgc3R5bGVgIGF0dHJpYnV0ZVxuICAvLyBub3JtYWxpemVkLiBTaW5jZSBpdCBvbmx5IGFmZmVjdHMgSUUsIHdlJ3JlIHNraXBwaW5nIHN0eWxlIHdhcm5pbmdzXG4gIC8vIGluIHRoYXQgYnJvd3NlciBjb21wbGV0ZWx5IGluIGZhdm9yIG9mIGRvaW5nIGFsbCB0aGF0IHdvcmsuXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzExODA3XG5cblxuICBjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nID0gY2FuVXNlRE9NICYmICFkb2N1bWVudC5kb2N1bWVudE1vZGU7IC8vIEhUTUwgcGFyc2luZyBub3JtYWxpemVzIENSIGFuZCBDUkxGIHRvIExGLlxuICAvLyBJdCBhbHNvIGNhbiB0dXJuIFxcdTAwMDAgaW50byBcXHVGRkZEIGluc2lkZSBhdHRyaWJ1dGVzLlxuICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2luZ2xlLXBhZ2UuaHRtbCNwcmVwcm9jZXNzaW5nLXRoZS1pbnB1dC1zdHJlYW1cbiAgLy8gSWYgd2UgaGF2ZSBhIG1pc21hdGNoLCBpdCBtaWdodCBiZSBjYXVzZWQgYnkgdGhhdC5cbiAgLy8gV2Ugd2lsbCBzdGlsbCBwYXRjaCB1cCBpbiB0aGlzIGNhc2UgYnV0IG5vdCBmaXJlIHRoZSB3YXJuaW5nLlxuXG4gIHZhciBOT1JNQUxJWkVfTkVXTElORVNfUkVHRVggPSAvXFxyXFxuPy9nO1xuICB2YXIgTk9STUFMSVpFX05VTExfQU5EX1JFUExBQ0VNRU5UX1JFR0VYID0gL1xcdTAwMDB8XFx1RkZGRC9nO1xuXG4gIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChtYXJrdXApIHtcbiAgICB2YXIgbWFya3VwU3RyaW5nID0gdHlwZW9mIG1hcmt1cCA9PT0gJ3N0cmluZycgPyBtYXJrdXAgOiAnJyArIG1hcmt1cDtcbiAgICByZXR1cm4gbWFya3VwU3RyaW5nLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCAnXFxuJykucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsICcnKTtcbiAgfTtcblxuICB3YXJuRm9yVGV4dERpZmZlcmVuY2UgPSBmdW5jdGlvbiAoc2VydmVyVGV4dCwgY2xpZW50VGV4dCkge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub3JtYWxpemVkQ2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclRleHQgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCk7XG5cbiAgICBpZiAobm9ybWFsaXplZFNlcnZlclRleHQgPT09IG5vcm1hbGl6ZWRDbGllbnRUZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ1RleHQgY29udGVudCBkaWQgbm90IG1hdGNoLiBTZXJ2ZXI6IFwiJXNcIiBDbGllbnQ6IFwiJXNcIicsIG5vcm1hbGl6ZWRTZXJ2ZXJUZXh0LCBub3JtYWxpemVkQ2xpZW50VGV4dCk7XG4gIH07XG5cbiAgd2FybkZvclByb3BEaWZmZXJlbmNlID0gZnVuY3Rpb24gKHByb3BOYW1lLCBzZXJ2ZXJWYWx1ZSwgY2xpZW50VmFsdWUpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbm9ybWFsaXplZENsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKTtcbiAgICB2YXIgbm9ybWFsaXplZFNlcnZlclZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKHNlcnZlclZhbHVlKTtcblxuICAgIGlmIChub3JtYWxpemVkU2VydmVyVmFsdWUgPT09IG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdQcm9wIGAlc2AgZGlkIG5vdCBtYXRjaC4gU2VydmVyOiAlcyBDbGllbnQ6ICVzJywgcHJvcE5hbWUsIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRTZXJ2ZXJWYWx1ZSksIEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZWRDbGllbnRWYWx1ZSkpO1xuICB9O1xuXG4gIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZXMpIHtcbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG4gICAgdmFyIG5hbWVzID0gW107XG4gICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgbmFtZXMucHVzaChuYW1lKTtcbiAgICB9KTtcblxuICAgIGVycm9yKCdFeHRyYSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNlcnZlcjogJXMnLCBuYW1lcyk7XG4gIH07XG5cbiAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKGxpc3RlbmVyID09PSBmYWxzZSkge1xuICAgICAgZXJyb3IoJ0V4cGVjdGVkIGAlc2AgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYGZhbHNlYC5cXG5cXG4nICsgJ0lmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCAnICsgJ3Bhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBhIHZhbHVlIG9mIGAlc2AgdHlwZS4nLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTsgLy8gUGFyc2UgdGhlIEhUTUwgYW5kIHJlYWQgaXQgYmFjayB0byBub3JtYWxpemUgdGhlIEhUTUwgc3RyaW5nIHNvIHRoYXQgaXRcbiAgLy8gY2FuIGJlIHVzZWQgZm9yIGNvbXBhcmlzb24uXG5cblxuICBub3JtYWxpemVIVE1MID0gZnVuY3Rpb24gKHBhcmVudCwgaHRtbCkge1xuICAgIC8vIFdlIGNvdWxkIGhhdmUgY3JlYXRlZCBhIHNlcGFyYXRlIGRvY3VtZW50IGhlcmUgdG8gYXZvaWRcbiAgICAvLyByZS1pbml0aWFsaXppbmcgY3VzdG9tIGVsZW1lbnRzIGlmIHRoZXkgZXhpc3QuIEJ1dCB0aGlzIGJyZWFrc1xuICAgIC8vIGhvdyA8bm9zY3JpcHQ+IGlzIGJlaW5nIGhhbmRsZWQuIFNvIHdlIHVzZSB0aGUgc2FtZSBkb2N1bWVudC5cbiAgICAvLyBTZWUgdGhlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTExNTcuXG4gICAgdmFyIHRlc3RFbGVtZW50ID0gcGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSA/IHBhcmVudC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocGFyZW50LnRhZ05hbWUpIDogcGFyZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHBhcmVudC5uYW1lc3BhY2VVUkksIHBhcmVudC50YWdOYW1lKTtcbiAgICB0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgIHJldHVybiB0ZXN0RWxlbWVudC5pbm5lckhUTUw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICByZXR1cm4gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyByb290Q29udGFpbmVyRWxlbWVudCA6IHJvb3RDb250YWluZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5mdW5jdGlvbiB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChub2RlKSB7XG4gIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgLy8gZmlyZS4gVGhlIHdvcmthcm91bmQgZm9yIHRoaXMgYnVnIGludm9sdmVzIGF0dGFjaGluZyBhbiBlbXB0eSBjbGlja1xuICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gIC8vIGh0dHBzOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAvLyBKdXN0IHNldCBpdCB1c2luZyB0aGUgb25jbGljayBwcm9wZXJ0eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbWFuYWdlIGFueVxuICAvLyBib29ra2VlcGluZyBmb3IgaXQuIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2xlYXIgaXQgd2hlbiB0aGUgbGlzdGVuZXIgaXNcbiAgLy8gcmVtb3ZlZC5cbiAgLy8gVE9ETzogT25seSBkbyB0aGlzIGZvciB0aGUgcmVsZXZhbnQgU2FmYXJpcyBtYXliZT9cbiAgbm9kZS5vbmNsaWNrID0gbm9vcDtcbn1cblxuZnVuY3Rpb24gc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgbmV4dFByb3BzLCBpc0N1c3RvbUNvbXBvbmVudFRhZykge1xuICBmb3IgKHZhciBwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG5cbiAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKG5leHRQcm9wKSB7XG4gICAgICAgICAgLy8gRnJlZXplIHRoZSBuZXh0IHN0eWxlIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgYmVcbiAgICAgICAgICAvLyBtdXRhdGVkLiBXZSBoYXZlIGFscmVhZHkgd2FybmVkIGZvciB0aGlzIGluIHRoZSBwYXN0LlxuICAgICAgICAgIE9iamVjdC5mcmVlemUobmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuXG5cbiAgICAgIHNldFZhbHVlRm9yU3R5bGVzKGRvbUVsZW1lbnQsIG5leHRQcm9wKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICB2YXIgbmV4dEh0bWwgPSBuZXh0UHJvcCA/IG5leHRQcm9wW0hUTUwkMV0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICAgIHNldElubmVySFRNTChkb21FbGVtZW50LCBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyBpbml0aWFsIHRleHRDb250ZW50IHdoZW4gdGhlIHRleHQgaXMgZW1wdHkuIEluIElFMTEgc2V0dGluZ1xuICAgICAgICAvLyB0ZXh0Q29udGVudCBvbiBhIDx0ZXh0YXJlYT4gd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSA8dGV4dGFyZWE+IHVudGlsIGl0IGhhcyBiZWVuIGZvY3VzZWQgYW5kIGJsdXJyZWQgYWdhaW4uXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjczMSNpc3N1ZWNvbW1lbnQtMjU0ODc0NTUzXG4gICAgICAgIHZhciBjYW5TZXRUZXh0Q29udGVudCA9IHRhZyAhPT0gJ3RleHRhcmVhJyB8fCBuZXh0UHJvcCAhPT0gJyc7XG5cbiAgICAgICAgaWYgKGNhblNldFRleHRDb250ZW50KSB7XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCwgJycgKyBuZXh0UHJvcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIGlmICggdHlwZW9mIG5leHRQcm9wICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wS2V5ID09PSAnb25TY3JvbGwnKSB7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnc2Nyb2xsJywgZG9tRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgIHNldFZhbHVlRm9yUHJvcGVydHkoZG9tRWxlbWVudCwgcHJvcEtleSwgbmV4dFByb3AsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gIC8vIFRPRE86IEhhbmRsZSB3YXNDdXN0b21Db21wb25lbnRUYWdcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB1cGRhdGVQYXlsb2FkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHByb3BLZXkgPSB1cGRhdGVQYXlsb2FkW2ldO1xuICAgIHZhciBwcm9wVmFsdWUgPSB1cGRhdGVQYXlsb2FkW2kgKyAxXTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICBzZXRJbm5lckhUTUwoZG9tRWxlbWVudCwgcHJvcFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHByb3BLZXkgPT09IENISUxEUkVOKSB7XG4gICAgICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCBwcm9wVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRWYWx1ZUZvclByb3BlcnR5KGRvbUVsZW1lbnQsIHByb3BLZXksIHByb3BWYWx1ZSwgaXNDdXN0b21Db21wb25lbnRUYWcpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVyRWxlbWVudCwgcGFyZW50TmFtZXNwYWNlKSB7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZzsgLy8gV2UgY3JlYXRlIHRhZ3MgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGVpciBwYXJlbnQgY29udGFpbmVyLCBleGNlcHQgSFRNTFxuICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG5cbiAgdmFyIG93bmVyRG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpO1xuICB2YXIgZG9tRWxlbWVudDtcbiAgdmFyIG5hbWVzcGFjZVVSSSA9IHBhcmVudE5hbWVzcGFjZTtcblxuICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgbmFtZXNwYWNlVVJJID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHR5cGUpO1xuICB9XG5cbiAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgIHtcbiAgICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodHlwZSwgcHJvcHMpOyAvLyBTaG91bGQgdGhpcyBjaGVjayBiZSBnYXRlZCBieSBwYXJlbnQgbmFtZXNwYWNlPyBOb3Qgc3VyZSB3ZSB3YW50IHRvXG4gICAgICAvLyBhbGxvdyA8U1ZHPiBvciA8bUFUSD4uXG5cbiAgICAgIGlmICghaXNDdXN0b21Db21wb25lbnRUYWcgJiYgdHlwZSAhPT0gdHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGVycm9yKCc8JXMgLz4gaXMgdXNpbmcgaW5jb3JyZWN0IGNhc2luZy4gJyArICdVc2UgUGFzY2FsQ2FzZSBmb3IgUmVhY3QgY29tcG9uZW50cywgJyArICdvciBsb3dlcmNhc2UgZm9yIEhUTUwgZWxlbWVudHMuJywgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09ICdzY3JpcHQnKSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgdmFyIGRpdiA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGRpdi5pbm5lckhUTUwgPSAnPHNjcmlwdD48JyArICcvc2NyaXB0Pic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICAgIC8vIFRoaXMgaXMgZ3VhcmFudGVlZCB0byB5aWVsZCBhIHNjcmlwdCBlbGVtZW50LlxuXG4gICAgICB2YXIgZmlyc3RDaGlsZCA9IGRpdi5maXJzdENoaWxkO1xuICAgICAgZG9tRWxlbWVudCA9IGRpdi5yZW1vdmVDaGlsZChmaXJzdENoaWxkKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9wcy5pcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vICRGbG93SXNzdWUgYGNyZWF0ZUVsZW1lbnRgIHNob3VsZCBiZSB1cGRhdGVkIGZvciBXZWIgQ29tcG9uZW50c1xuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgIGlzOiBwcm9wcy5pc1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjYXVzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgLy8gYW5kIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI3NjI0MFxuICAgICAgZG9tRWxlbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0eXBlKTsgLy8gTm9ybWFsbHkgYXR0cmlidXRlcyBhcmUgYXNzaWduZWQgaW4gYHNldEluaXRpYWxET01Qcm9wZXJ0aWVzYCwgaG93ZXZlciB0aGUgYG11bHRpcGxlYCBhbmQgYHNpemVgXG4gICAgICAvLyBhdHRyaWJ1dGVzIG9uIGBzZWxlY3RgcyBuZWVkcyB0byBiZSBhZGRlZCBiZWZvcmUgYG9wdGlvbmBzIGFyZSBpbnNlcnRlZC5cbiAgICAgIC8vIFRoaXMgcHJldmVudHM6XG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBkb2VzIG5vdCBzY3JvbGwgdG8gdGhlIGNvcnJlY3Qgb3B0aW9uIGJlY2F1c2Ugc2luZ3VsYXJcbiAgICAgIC8vICBgc2VsZWN0YCBlbGVtZW50cyBhdXRvbWF0aWNhbGx5IHBpY2sgdGhlIGZpcnN0IGl0ZW0gIzEzMjIyXG4gICAgICAvLyAtIGEgYnVnIHdoZXJlIHRoZSBgc2VsZWN0YCBzZXQgdGhlIGZpcnN0IGl0ZW0gYXMgc2VsZWN0ZWQgZGVzcGl0ZSB0aGUgYHNpemVgIGF0dHJpYnV0ZSAjMTQyMzlcbiAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzMjIyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xNDIzOVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBkb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChwcm9wcy5tdWx0aXBsZSkge1xuICAgICAgICAgIG5vZGUubXVsdGlwbGUgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLnNpemUpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGEgc2l6ZSBncmVhdGVyIHRoYW4gMSBjYXVzZXMgYSBzZWxlY3QgdG8gYmVoYXZlIGxpa2UgYG11bHRpcGxlPXRydWVgLCB3aGVyZVxuICAgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgbm8gb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIGEgc2VsZWN0IGluIFwic2luZ2xlIHNlbGVjdGlvbiBtb2RlXCIuXG4gICAgICAgICAgbm9kZS5zaXplID0gcHJvcHMuc2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkb21FbGVtZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0eXBlKTtcbiAgfVxuXG4gIHtcbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSQxKSB7XG4gICAgICBpZiAoIWlzQ3VzdG9tQ29tcG9uZW50VGFnICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb21FbGVtZW50KSA9PT0gJ1tvYmplY3QgSFRNTFVua25vd25FbGVtZW50XScgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkpIHtcbiAgICAgICAgd2FybmVkVW5rbm93blRhZ3NbdHlwZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgdGFnIDwlcz4gaXMgdW5yZWNvZ25pemVkIGluIHRoaXMgYnJvd3Nlci4gJyArICdJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoICcgKyAnYW4gdXBwZXJjYXNlIGxldHRlci4nLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVRleHROb2RlKHRleHQsIHJvb3RDb250YWluZXJFbGVtZW50KSB7XG4gIHJldHVybiBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckVsZW1lbnQpLmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gc2V0SW5pdGlhbFByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCByYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG5cbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCByYXdQcm9wcyk7XG4gIH0gLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgd2UgY2hlY2sgaXNNb3VudGVkIGJlZm9yZSBmaXJpbmcgYW55IG9mIHRoZXNlIGV2ZW50cy5cblxuXG4gIHZhciBwcm9wcztcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjYW5jZWwnLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Nsb3NlJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd2aWRlbyc6XG4gICAgY2FzZSAnYXVkaW8nOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoZXNlIGV2ZW50cyBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciBhbGwgdGhlIG1lZGlhIGV2ZW50cy5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQobWVkaWFFdmVudFR5cGVzW2ldLCBkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBlcnJvciBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2Vycm9yJywgZG9tRWxlbWVudCk7XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIHByb3BzID0gcmF3UHJvcHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIHRvZ2dsZSBldmVudC5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3RvZ2dsZScsIGRvbUVsZW1lbnQpO1xuICAgICAgcHJvcHMgPSByYXdQcm9wcztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBwcm9wcyA9IGdldEhvc3RQcm9wcyhkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIHZhbGlkYXRlUHJvcHMoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBpbml0V3JhcHBlclN0YXRlJDEoZG9tRWxlbWVudCwgcmF3UHJvcHMpO1xuICAgICAgcHJvcHMgPSBnZXRIb3N0UHJvcHMkMihkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIHByb3BzID0gZ2V0SG9zdFByb3BzJDMoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcm9wcyA9IHJhd1Byb3BzO1xuICB9XG5cbiAgYXNzZXJ0VmFsaWRQcm9wcyh0YWcsIHByb3BzKTtcbiAgc2V0SW5pdGlhbERPTVByb3BlcnRpZXModGFnLCBkb21FbGVtZW50LCByb290Q29udGFpbmVyRWxlbWVudCwgcHJvcHMsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTtcblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIGZhbHNlKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHdlIGNoZWNrIGlmIHRoaXMgaXMgc3RpbGwgdW5tb3VudGVkIG9yIGRvIGFueSBjbGVhblxuICAgICAgLy8gdXAgbmVjZXNzYXJ5IHNpbmNlIHdlIG5ldmVyIHN0b3AgdHJhY2tpbmcgYW55bW9yZS5cbiAgICAgIHRyYWNrKGRvbUVsZW1lbnQpO1xuICAgICAgcG9zdE1vdW50V3JhcHBlciQzKGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdvcHRpb24nOlxuICAgICAgcG9zdE1vdW50V3JhcHBlciQxKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIkMihkb21FbGVtZW50LCByYXdQcm9wcyk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodHlwZW9mIHByb3BzLm9uQ2xpY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBjYXN0IG1heSBub3QgYmUgc291bmQgZm9yIFNWRywgTWF0aE1MIG9yIGN1c3RvbSBlbGVtZW50cy5cbiAgICAgICAgdHJhcENsaWNrT25Ob25JbnRlcmFjdGl2ZUVsZW1lbnQoZG9tRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICB9XG59IC8vIENhbGN1bGF0ZSB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cblxuZnVuY3Rpb24gZGlmZlByb3BlcnRpZXMoZG9tRWxlbWVudCwgdGFnLCBsYXN0UmF3UHJvcHMsIG5leHRSYXdQcm9wcywgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAge1xuICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UmF3UHJvcHMpO1xuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuICB2YXIgbGFzdFByb3BzO1xuICB2YXIgbmV4dFByb3BzO1xuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQxKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMShkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgbGFzdFByb3BzID0gZ2V0SG9zdFByb3BzJDIoZG9tRWxlbWVudCwgbGFzdFJhd1Byb3BzKTtcbiAgICAgIG5leHRQcm9wcyA9IGdldEhvc3RQcm9wcyQyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGxhc3RQcm9wcyA9IGdldEhvc3RQcm9wcyQzKGRvbUVsZW1lbnQsIGxhc3RSYXdQcm9wcyk7XG4gICAgICBuZXh0UHJvcHMgPSBnZXRIb3N0UHJvcHMkMyhkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbGFzdFByb3BzID0gbGFzdFJhd1Byb3BzO1xuICAgICAgbmV4dFByb3BzID0gbmV4dFJhd1Byb3BzO1xuXG4gICAgICBpZiAodHlwZW9mIGxhc3RQcm9wcy5vbkNsaWNrICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBuZXh0UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgbmV4dFByb3BzKTtcbiAgdmFyIHByb3BLZXk7XG4gIHZhciBzdHlsZU5hbWU7XG4gIHZhciBzdHlsZVVwZGF0ZXMgPSBudWxsO1xuXG4gIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgdmFyIGxhc3RTdHlsZSA9IGxhc3RQcm9wc1twcm9wS2V5XTtcblxuICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgIGlmIChsYXN0U3R5bGUuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgIGlmICghc3R5bGVVcGRhdGVzKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCB8fCBwcm9wS2V5ID09PSBDSElMRFJFTikgOyBlbHNlIGlmIChwcm9wS2V5ID09PSBTVVBQUkVTU19DT05URU5UX0VESVRBQkxFX1dBUk5JTkcgfHwgcHJvcEtleSA9PT0gU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gQVVUT0ZPQ1VTKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuIElmIGFueSBsaXN0ZW5lciB1cGRhdGVzIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgICAvLyB0aGF0IHRoZSBcImN1cnJlbnRcIiBmaWJlciBwb2ludGVyIGdldHMgdXBkYXRlZCBzbyB3ZSBuZWVkIGEgY29tbWl0XG4gICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgaWYgKCF1cGRhdGVQYXlsb2FkKSB7XG4gICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBkZWxldGVkIHByb3BlcnRpZXMgd2UgYWRkIGl0IHRvIHRoZSBxdWV1ZS4gV2UgdXNlXG4gICAgICAvLyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGluIHRoZSBjb21taXQgcGhhc2UgaW5zdGVhZC5cbiAgICAgICh1cGRhdGVQYXlsb2FkID0gdXBkYXRlUGF5bG9hZCB8fCBbXSkucHVzaChwcm9wS2V5LCBudWxsKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIC8vIEZyZWV6ZSB0aGUgbmV4dCBzdHlsZSBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gYXNzdW1lIGl0IHdvbid0IGJlXG4gICAgICAgICAgLy8gbXV0YXRlZC4gV2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBpbiB0aGUgcGFzdC5cbiAgICAgICAgICBPYmplY3QuZnJlZXplKG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFByb3ApIHtcbiAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgIGlmIChsYXN0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmICghbmV4dFByb3AgfHwgIW5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpKSB7XG4gICAgICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVXBkYXRlIHN0eWxlcyB0aGF0IGNoYW5nZWQgc2luY2UgYGxhc3RQcm9wYC5cblxuXG4gICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKG5leHRQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgbGFzdFByb3Bbc3R5bGVOYW1lXSAhPT0gbmV4dFByb3Bbc3R5bGVOYW1lXSkge1xuICAgICAgICAgICAgaWYgKCFzdHlsZVVwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gbmV4dFByb3Bbc3R5bGVOYW1lXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICBpZiAoIXN0eWxlVXBkYXRlcykge1xuICAgICAgICAgIGlmICghdXBkYXRlUGF5bG9hZCkge1xuICAgICAgICAgICAgdXBkYXRlUGF5bG9hZCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQucHVzaChwcm9wS2V5LCBzdHlsZVVwZGF0ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGVVcGRhdGVzID0gbmV4dFByb3A7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBEQU5HRVJPVVNMWV9TRVRfSU5ORVJfSFRNTCkge1xuICAgICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3AgPyBuZXh0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3AgPyBsYXN0UHJvcFtIVE1MJDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRIdG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gQ0hJTERSRU4pIHtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXh0UHJvcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksICcnICsgbmV4dFByb3ApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HKSA7IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgIGlmIChuZXh0UHJvcCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGVhZ2VybHkgbGlzdGVuIHRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCBjb21taXR0ZWQgeWV0LlxuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXBkYXRlUGF5bG9hZCAmJiBsYXN0UHJvcCAhPT0gbmV4dFByb3ApIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSWYgYW55IGxpc3RlbmVyIHVwZGF0ZXMgd2UgbmVlZCB0byBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB0aGUgXCJjdXJyZW50XCIgcHJvcHMgcG9pbnRlciBnZXRzIHVwZGF0ZWQgc28gd2UgbmVlZCBhIGNvbW1pdFxuICAgICAgICAvLyB0byB1cGRhdGUgdGhpcyBlbGVtZW50LlxuICAgICAgICB1cGRhdGVQYXlsb2FkID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdvYmplY3QnICYmIG5leHRQcm9wICE9PSBudWxsICYmIG5leHRQcm9wLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRSkge1xuICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIHVzZU9wYXF1ZVJlZmVyZW5jZSdzIG9wYXF1ZSBvYmplY3QsIHRoaXMgbWVhbnMgd2UgYXJlIGh5ZHJhdGluZy5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgY2FsbCB0aGUgb3BhcXVlIG9iamVjdCdzIHRvU3RyaW5nIGZ1bmN0aW9uIHdoaWNoIGdlbmVyYXRlcyBhIG5ldyBjbGllbnRcbiAgICAgIC8vIElEIHNvIGNsaWVudCBhbmQgc2VydmVyIElEcyBtYXRjaCBhbmQgdGhyb3dzIHRvIHJlcmVuZGVyLlxuICAgICAgbmV4dFByb3AudG9TdHJpbmcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGFueSBvdGhlciBwcm9wZXJ0eSB3ZSBhbHdheXMgYWRkIGl0IHRvIHRoZSBxdWV1ZSBhbmQgdGhlbiB3ZVxuICAgICAgLy8gZmlsdGVyIGl0IG91dCB1c2luZyB0aGUgYWxsb3dlZCBwcm9wZXJ0eSBsaXN0IGR1cmluZyB0aGUgY29tbWl0LlxuICAgICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKHByb3BLZXksIG5leHRQcm9wKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAge1xuICAgICAgdmFsaWRhdGVTaG9ydGhhbmRQcm9wZXJ0eUNvbGxpc2lvbkluRGV2KHN0eWxlVXBkYXRlcywgbmV4dFByb3BzW1NUWUxFXSk7XG4gICAgfVxuXG4gICAgKHVwZGF0ZVBheWxvYWQgPSB1cGRhdGVQYXlsb2FkIHx8IFtdKS5wdXNoKFNUWUxFLCBzdHlsZVVwZGF0ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVBheWxvYWQ7XG59IC8vIEFwcGx5IHRoZSBkaWZmLlxuXG5mdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHRhZywgbGFzdFJhd1Byb3BzLCBuZXh0UmF3UHJvcHMpIHtcbiAgLy8gVXBkYXRlIGNoZWNrZWQgKmJlZm9yZSogbmFtZS5cbiAgLy8gSW4gdGhlIG1pZGRsZSBvZiBhbiB1cGRhdGUsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgY2hlY2tlZC5cbiAgLy8gV2hlbiBhIGNoZWNrZWQgcmFkaW8gdHJpZXMgdG8gY2hhbmdlIG5hbWUsIGJyb3dzZXIgbWFrZXMgYW5vdGhlciByYWRpbydzIGNoZWNrZWQgZmFsc2UuXG4gIGlmICh0YWcgPT09ICdpbnB1dCcgJiYgbmV4dFJhd1Byb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmV4dFJhd1Byb3BzLm5hbWUgIT0gbnVsbCkge1xuICAgIHVwZGF0ZUNoZWNrZWQoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgfVxuXG4gIHZhciB3YXNDdXN0b21Db21wb25lbnRUYWcgPSBpc0N1c3RvbUNvbXBvbmVudCh0YWcsIGxhc3RSYXdQcm9wcyk7XG4gIHZhciBpc0N1c3RvbUNvbXBvbmVudFRhZyA9IGlzQ3VzdG9tQ29tcG9uZW50KHRhZywgbmV4dFJhd1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYuXG5cbiAgdXBkYXRlRE9NUHJvcGVydGllcyhkb21FbGVtZW50LCB1cGRhdGVQYXlsb2FkLCB3YXNDdXN0b21Db21wb25lbnRUYWcsIGlzQ3VzdG9tQ29tcG9uZW50VGFnKTsgLy8gVE9ETzogRW5zdXJlIHRoYXQgYW4gdXBkYXRlIGdldHMgc2NoZWR1bGVkIGlmIGFueSBvZiB0aGUgc3BlY2lhbCBwcm9wc1xuICAvLyBjaGFuZ2VkLlxuXG4gIHN3aXRjaCAodGFnKSB7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgICAgLy8gVXBkYXRlIHRoZSB3cmFwcGVyIGFyb3VuZCBpbnB1dHMgKmFmdGVyKiB1cGRhdGluZyBwcm9wcy4gVGhpcyBoYXMgdG9cbiAgICAgIC8vIGhhcHBlbiBhZnRlciBgdXBkYXRlRE9NUHJvcGVydGllc2AuIE90aGVyd2lzZSBIVE1MNSBpbnB1dCB2YWxpZGF0aW9uc1xuICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgdXBkYXRlV3JhcHBlcihkb21FbGVtZW50LCBuZXh0UmF3UHJvcHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICB1cGRhdGVXcmFwcGVyJDEoZG9tRWxlbWVudCwgbmV4dFJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgLy8gcmVjb25jaWxpYXRpb25cbiAgICAgIHBvc3RVcGRhdGVXcmFwcGVyKGRvbUVsZW1lbnQsIG5leHRSYXdQcm9wcyk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQb3NzaWJsZVN0YW5kYXJkTmFtZShwcm9wTmFtZSkge1xuICB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmICghcG9zc2libGVTdGFuZGFyZE5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlU3RhbmRhcmROYW1lc1tsb3dlckNhc2VkTmFtZV0gfHwgbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcmF3UHJvcHMsIHBhcmVudE5hbWVzcGFjZSwgcm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgdmFyIGlzQ3VzdG9tQ29tcG9uZW50VGFnO1xuICB2YXIgZXh0cmFBdHRyaWJ1dGVOYW1lcztcblxuICB7XG4gICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nID0gcmF3UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddID09PSB0cnVlO1xuICAgIGlzQ3VzdG9tQ29tcG9uZW50VGFnID0gaXNDdXN0b21Db21wb25lbnQodGFnLCByYXdQcm9wcyk7XG4gICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0YWcsIHJhd1Byb3BzKTtcbiAgfSAvLyBUT0RPOiBNYWtlIHN1cmUgdGhhdCB3ZSBjaGVjayBpc01vdW50ZWQgYmVmb3JlIGZpcmluZyBhbnkgb2YgdGhlc2UgZXZlbnRzLlxuXG5cbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnY2FuY2VsJywgZG9tRWxlbWVudCk7XG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdjbG9zZScsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpZnJhbWUnOlxuICAgIGNhc2UgJ29iamVjdCc6XG4gICAgY2FzZSAnZW1iZWQnOlxuICAgICAgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGxvYWQgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdsb2FkJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhlc2UgZXZlbnRzIGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIGFsbCB0aGUgbWVkaWEgZXZlbnRzLlxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZWRpYUV2ZW50VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbaV0sIGRvbUVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgZXJyb3IgZXZlbnQuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdlcnJvcicsIGRvbUVsZW1lbnQpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgIGNhc2UgJ2ltYWdlJzpcbiAgICBjYXNlICdsaW5rJzpcbiAgICAgIC8vIFdlIGxpc3RlbiB0byB0aGVzZSBldmVudHMgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgZXJyb3IgYW5kIGxvYWQgZXZlbnRzLlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnZXJyb3InLCBkb21FbGVtZW50KTtcbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2xvYWQnLCBkb21FbGVtZW50KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgdG9nZ2xlIGV2ZW50LlxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgndG9nZ2xlJywgZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUoZG9tRWxlbWVudCwgcmF3UHJvcHMpOyAvLyBXZSBsaXN0ZW4gdG8gdGhpcyBldmVudCBpbiBjYXNlIHRvIGVuc3VyZSBlbXVsYXRlZCBidWJibGVcbiAgICAgIC8vIGxpc3RlbmVycyBzdGlsbCBmaXJlIGZvciB0aGUgaW52YWxpZCBldmVudC5cblxuICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgnaW52YWxpZCcsIGRvbUVsZW1lbnQpO1xuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICB2YWxpZGF0ZVByb3BzKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIGluaXRXcmFwcGVyU3RhdGUkMShkb21FbGVtZW50LCByYXdQcm9wcyk7IC8vIFdlIGxpc3RlbiB0byB0aGlzIGV2ZW50IGluIGNhc2UgdG8gZW5zdXJlIGVtdWxhdGVkIGJ1YmJsZVxuICAgICAgLy8gbGlzdGVuZXJzIHN0aWxsIGZpcmUgZm9yIHRoZSBpbnZhbGlkIGV2ZW50LlxuXG4gICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KCdpbnZhbGlkJywgZG9tRWxlbWVudCk7XG5cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5pdFdyYXBwZXJTdGF0ZSQyKGRvbUVsZW1lbnQsIHJhd1Byb3BzKTsgLy8gV2UgbGlzdGVuIHRvIHRoaXMgZXZlbnQgaW4gY2FzZSB0byBlbnN1cmUgZW11bGF0ZWQgYnViYmxlXG4gICAgICAvLyBsaXN0ZW5lcnMgc3RpbGwgZmlyZSBmb3IgdGhlIGludmFsaWQgZXZlbnQuXG5cbiAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ2ludmFsaWQnLCBkb21FbGVtZW50KTtcblxuICAgICAgYnJlYWs7XG4gIH1cblxuICBhc3NlcnRWYWxpZFByb3BzKHRhZywgcmF3UHJvcHMpO1xuXG4gIHtcbiAgICBleHRyYUF0dHJpYnV0ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgIHZhciBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgbmFtZSA9IGF0dHJpYnV0ZXNbX2ldLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIC8vIEJ1aWx0LWluIFNTUiBhdHRyaWJ1dGUgaXMgYWxsb3dlZFxuICAgICAgICBjYXNlICdkYXRhLXJlYWN0cm9vdCc6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgICAvLyBUT0RPOiBPbmx5IGlnbm9yZSB0aGVtIG9uIGNvbnRyb2xsZWQgdGFncy5cblxuICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hlY2tlZCc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc2VsZWN0ZWQnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW50ZW50aW9uYWxseSB1c2UgdGhlIG9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTA2NzYuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlc1tfaV0ubmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBudWxsO1xuXG4gIGZvciAodmFyIHByb3BLZXkgaW4gcmF3UHJvcHMpIHtcbiAgICBpZiAoIXJhd1Byb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dFByb3AgPSByYXdQcm9wc1twcm9wS2V5XTtcblxuICAgIGlmIChwcm9wS2V5ID09PSBDSElMRFJFTikge1xuICAgICAgLy8gRm9yIHRleHQgY29udGVudCBjaGlsZHJlbiB3ZSBjb21wYXJlIGFnYWluc3QgdGV4dENvbnRlbnQuIFRoaXNcbiAgICAgIC8vIG1pZ2h0IG1hdGNoIGFkZGl0aW9uYWwgSFRNTCB0aGF0IGlzIGhpZGRlbiB3aGVuIHdlIHJlYWQgaXQgdXNpbmdcbiAgICAgIC8vIHRleHRDb250ZW50LiBFLmcuIFwiZm9vXCIgd2lsbCBtYXRjaCBcImY8c3Bhbj5vbzwvc3Bhbj5cIiBidXQgdGhhdCBzdGlsbFxuICAgICAgLy8gc2F0aXNmaWVzIG91ciByZXF1aXJlbWVudC4gT3VyIHJlcXVpcmVtZW50IGlzIG5vdCB0byBwcm9kdWNlIHBlcmZlY3RcbiAgICAgIC8vIEhUTUwgYW5kIGF0dHJpYnV0ZXMuIElkZWFsbHkgd2Ugc2hvdWxkIHByZXNlcnZlIHN0cnVjdHVyZSBidXQgaXQnc1xuICAgICAgLy8gb2sgbm90IHRvIGlmIHRoZSB2aXNpYmxlIGNvbnRlbnQgaXMgc3RpbGwgZW5vdWdoIHRvIGluZGljYXRlIHdoYXRcbiAgICAgIC8vIGV2ZW4gbGlzdGVuZXJzIHRoZXNlIG5vZGVzIG1pZ2h0IGJlIHdpcmVkIHVwIHRvLlxuICAgICAgLy8gVE9ETzogV2FybiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gYSBzaW5nbGUgdGV4dE5vZGUgYXMgYSBjaGlsZC5cbiAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB1c2UgZG9tRWxlbWVudC5maXJzdENoaWxkLm5vZGVWYWx1ZSB0byBjb21wYXJlP1xuICAgICAgaWYgKHR5cGVvZiBuZXh0UHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKGRvbUVsZW1lbnQudGV4dENvbnRlbnQgIT09IG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sIG5leHRQcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3AgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50LnRleHRDb250ZW50ICE9PSAnJyArIG5leHRQcm9wKSB7XG4gICAgICAgICAgaWYgKCAhc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgICB3YXJuRm9yVGV4dERpZmZlcmVuY2UoZG9tRWxlbWVudC50ZXh0Q29udGVudCwgbmV4dFByb3ApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZVBheWxvYWQgPSBbQ0hJTERSRU4sICcnICsgbmV4dFByb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICBpZiAoIHR5cGVvZiBuZXh0UHJvcCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcEtleSA9PT0gJ29uU2Nyb2xsJykge1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoJ3Njcm9sbCcsIGRvbUVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICggLy8gQ29udmluY2UgRmxvdyB3ZSd2ZSBjYWxjdWxhdGVkIGl0IChpdCdzIERFVi1vbmx5IGluIHRoaXMgbWV0aG9kLilcbiAgICB0eXBlb2YgaXNDdXN0b21Db21wb25lbnRUYWcgPT09ICdib29sZWFuJykge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgcHJvcGVydGllcyBjb3JyZXNwb25kIHRvIHRoZWlyIGV4cGVjdGVkIHZhbHVlcy5cbiAgICAgIHZhciBzZXJ2ZXJWYWx1ZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSBnZXRQcm9wZXJ0eUluZm8ocHJvcEtleSk7XG5cbiAgICAgIGlmIChzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIDsgZWxzZSBpZiAocHJvcEtleSA9PT0gU1VQUFJFU1NfQ09OVEVOVF9FRElUQUJMRV9XQVJOSU5HIHx8IHByb3BLZXkgPT09IFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HIHx8IC8vIENvbnRyb2xsZWQgYXR0cmlidXRlcyBhcmUgbm90IHZhbGlkYXRlZFxuICAgICAgLy8gVE9ETzogT25seSBpZ25vcmUgdGhlbSBvbiBjb250cm9sbGVkIHRhZ3MuXG4gICAgICBwcm9wS2V5ID09PSAndmFsdWUnIHx8IHByb3BLZXkgPT09ICdjaGVja2VkJyB8fCBwcm9wS2V5ID09PSAnc2VsZWN0ZWQnKSA7IGVsc2UgaWYgKHByb3BLZXkgPT09IERBTkdFUk9VU0xZX1NFVF9JTk5FUl9IVE1MKSB7XG4gICAgICAgIHZhciBzZXJ2ZXJIVE1MID0gZG9tRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wID8gbmV4dFByb3BbSFRNTCQxXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAobmV4dEh0bWwgIT0gbnVsbCkge1xuICAgICAgICAgIHZhciBleHBlY3RlZEhUTUwgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIG5leHRIdG1sKTtcblxuICAgICAgICAgIGlmIChleHBlY3RlZEhUTUwgIT09IHNlcnZlckhUTUwpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJIVE1MLCBleHBlY3RlZEhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgIGV4dHJhQXR0cmlidXRlTmFtZXMuZGVsZXRlKHByb3BLZXkpO1xuXG4gICAgICAgIGlmIChjYW5EaWZmU3R5bGVGb3JIeWRyYXRpb25XYXJuaW5nKSB7XG4gICAgICAgICAgdmFyIGV4cGVjdGVkU3R5bGUgPSBjcmVhdGVEYW5nZXJvdXNTdHJpbmdGb3JTdHlsZXMobmV4dFByb3ApO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cbiAgICAgICAgICBpZiAoZXhwZWN0ZWRTdHlsZSAhPT0gc2VydmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgZXhwZWN0ZWRTdHlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50VGFnKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cbiAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9PSBzZXJ2ZXJWYWx1ZSkge1xuICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBzZXJ2ZXJWYWx1ZSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFzaG91bGRJZ25vcmVBdHRyaWJ1dGUocHJvcEtleSwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykgJiYgIXNob3VsZFJlbW92ZUF0dHJpYnV0ZShwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvLCBpc0N1c3RvbUNvbXBvbmVudFRhZykpIHtcbiAgICAgICAgdmFyIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8gIT09IG51bGwpIHtcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgIHNlcnZlclZhbHVlID0gZ2V0VmFsdWVGb3JQcm9wZXJ0eShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCwgcHJvcGVydHlJbmZvKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gcGFyZW50TmFtZXNwYWNlO1xuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgb3duTmFtZXNwYWNlID0gZ2V0SW50cmluc2ljTmFtZXNwYWNlKHRhZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG93bk5hbWVzcGFjZSA9PT0gSFRNTF9OQU1FU1BBQ0UkMSkge1xuICAgICAgICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHN0YW5kYXJkTmFtZSA9IGdldFBvc3NpYmxlU3RhbmRhcmROYW1lKHByb3BLZXkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhbmRhcmROYW1lICE9PSBudWxsICYmIHN0YW5kYXJkTmFtZSAhPT0gcHJvcEtleSkge1xuICAgICAgICAgICAgICAvLyBJZiBhbiBTVkcgcHJvcCBpcyBzdXBwbGllZCB3aXRoIGJhZCBjYXNpbmcsIGl0IHdpbGxcbiAgICAgICAgICAgICAgLy8gYmUgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBmcm9tIEhUTUwsIGJ1dCB3aWxsIHByb2R1Y2UgYSBtaXNtYXRjaFxuICAgICAgICAgICAgICAvLyAoYW5kIHdvdWxkIGJlIGluY29ycmVjdGx5IHJlbmRlcmVkIG9uIHRoZSBjbGllbnQpLlxuICAgICAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBhbHJlYWR5IHdhcm4gYWJvdXQgYmFkIGNhc2luZyBlbHNld2hlcmUuXG4gICAgICAgICAgICAgIC8vIFNvIHdlJ2xsIHNraXAgdGhlIG1pc2xlYWRpbmcgZXh0cmEgbWlzbWF0Y2ggd2FybmluZyBpbiB0aGlzIGNhc2UuXG4gICAgICAgICAgICAgIGlzTWlzbWF0Y2hEdWVUb0JhZENhc2luZyA9IHRydWU7IC8vICRGbG93Rml4TWUgLSBTaG91bGQgYmUgaW5mZXJyZWQgYXMgbm90IHVuZGVmaW5lZC5cblxuICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZU5hbWVzLmRlbGV0ZShzdGFuZGFyZE5hbWUpO1xuICAgICAgICAgICAgfSAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG5cblxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVOYW1lcy5kZWxldGUocHJvcEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VydmVyVmFsdWUgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dFByb3AgIT09IHNlcnZlclZhbHVlICYmICFpc01pc21hdGNoRHVlVG9CYWRDYXNpbmcpIHtcbiAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UocHJvcEtleSwgc2VydmVyVmFsdWUsIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIC0gU2hvdWxkIGJlIGluZmVycmVkIGFzIG5vdCB1bmRlZmluZWQuXG4gICAgaWYgKGV4dHJhQXR0cmlidXRlTmFtZXMuc2l6ZSA+IDAgJiYgIXN1cHByZXNzSHlkcmF0aW9uV2FybmluZykge1xuICAgICAgLy8gJEZsb3dGaXhNZSAtIFNob3VsZCBiZSBpbmZlcnJlZCBhcyBub3QgdW5kZWZpbmVkLlxuICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhleHRyYUF0dHJpYnV0ZU5hbWVzKTtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHRhZykge1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIC8vIFRPRE86IE1ha2Ugc3VyZSB3ZSBjaGVjayBpZiB0aGlzIGlzIHN0aWxsIHVubW91bnRlZCBvciBkbyBhbnkgY2xlYW5cbiAgICAgIC8vIHVwIG5lY2Vzc2FyeSBzaW5jZSB3ZSBuZXZlciBzdG9wIHRyYWNraW5nIGFueW1vcmUuXG4gICAgICB0cmFjayhkb21FbGVtZW50KTtcbiAgICAgIHBvc3RNb3VudFdyYXBwZXIoZG9tRWxlbWVudCwgcmF3UHJvcHMsIHRydWUpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhpcyBpcyBzdGlsbCB1bm1vdW50ZWQgb3IgZG8gYW55IGNsZWFuXG4gICAgICAvLyB1cCBuZWNlc3Nhcnkgc2luY2Ugd2UgbmV2ZXIgc3RvcCB0cmFja2luZyBhbnltb3JlLlxuICAgICAgdHJhY2soZG9tRWxlbWVudCk7XG4gICAgICBwb3N0TW91bnRXcmFwcGVyJDMoZG9tRWxlbWVudCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgIC8vIEZvciBpbnB1dCBhbmQgdGV4dGFyZWEgd2UgY3VycmVudCBhbHdheXMgc2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSBhdFxuICAgICAgLy8gcG9zdCBtb3VudCB0byBmb3JjZSBpdCB0byBkaXZlcmdlIGZyb20gYXR0cmlidXRlcy4gSG93ZXZlciwgZm9yXG4gICAgICAvLyBvcHRpb24gYW5kIHNlbGVjdCB3ZSBkb24ndCBxdWl0ZSBkbyB0aGUgc2FtZSB0aGluZyBhbmQgc2VsZWN0XG4gICAgICAvLyBpcyBub3QgcmVzaWxpZW50IHRvIHRoZSBET00gc3RhdGUgY2hhbmdpbmcgc28gd2UgZG9uJ3QgZG8gdGhhdCBoZXJlLlxuICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZm9yIGlucHV0IGFuZCB0ZXh0YXJlYS5cbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICh0eXBlb2YgcmF3UHJvcHMub25DbGljayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgICAgICB0cmFwQ2xpY2tPbk5vbkludGVyYWN0aXZlRWxlbWVudChkb21FbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gdXBkYXRlUGF5bG9hZDtcbn1cbmZ1bmN0aW9uIGRpZmZIeWRyYXRlZFRleHQodGV4dE5vZGUsIHRleHQpIHtcbiAgdmFyIGlzRGlmZmVyZW50ID0gdGV4dE5vZGUubm9kZVZhbHVlICE9PSB0ZXh0O1xuICByZXR1cm4gaXNEaWZmZXJlbnQ7XG59XG5mdW5jdGlvbiB3YXJuRm9yVW5tYXRjaGVkVGV4dCh0ZXh0Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclRleHREaWZmZXJlbmNlKHRleHROb2RlLm5vZGVWYWx1ZSwgdGV4dCk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIGEgPCVzPiBpbiA8JXM+LicsIGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Tm9kZSwgY2hpbGQpIHtcbiAge1xuICAgIGlmIChkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uID0gdHJ1ZTtcblxuICAgIGVycm9yKCdEaWQgbm90IGV4cGVjdCBzZXJ2ZXIgSFRNTCB0byBjb250YWluIHRoZSB0ZXh0IG5vZGUgXCIlc1wiIGluIDwlcz4uJywgY2hpbGQubm9kZVZhbHVlLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZEVsZW1lbnQocGFyZW50Tm9kZSwgdGFnLCBwcm9wcykge1xuICB7XG4gICAgaWYgKGRpZFdhcm5JbnZhbGlkSHlkcmF0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlkV2FybkludmFsaWRIeWRyYXRpb24gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0V4cGVjdGVkIHNlcnZlciBIVE1MIHRvIGNvbnRhaW4gYSBtYXRjaGluZyA8JXM+IGluIDwlcz4uJywgdGFnLCBwYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG59XG5mdW5jdGlvbiB3YXJuRm9ySW5zZXJ0ZWRIeWRyYXRlZFRleHQocGFyZW50Tm9kZSwgdGV4dCkge1xuICB7XG4gICAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgICAvLyBXZSBleHBlY3QgdG8gaW5zZXJ0IGVtcHR5IHRleHQgbm9kZXMgc2luY2UgdGhleSdyZSBub3QgcmVwcmVzZW50ZWQgaW5cbiAgICAgIC8vIHRoZSBIVE1MLlxuICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgc3BlY2lhbCBjYXNlIGlmIHdlIGNhbiBqdXN0IGF2b2lkIGluc2VydGluZyBlbXB0eVxuICAgICAgLy8gdGV4dCBub2Rlcy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGlkV2FybkludmFsaWRIeWRyYXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkaWRXYXJuSW52YWxpZEh5ZHJhdGlvbiA9IHRydWU7XG5cbiAgICBlcnJvcignRXhwZWN0ZWQgc2VydmVyIEhUTUwgdG8gY29udGFpbiBhIG1hdGNoaW5nIHRleHQgbm9kZSBmb3IgXCIlc1wiIGluIDwlcz4uJywgdGV4dCwgcGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxufVxuZnVuY3Rpb24gcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMpIHtcbiAgc3dpdGNoICh0YWcpIHtcbiAgICBjYXNlICdpbnB1dCc6XG4gICAgICByZXN0b3JlQ29udHJvbGxlZFN0YXRlKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcblxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIHJlc3RvcmVDb250cm9sbGVkU3RhdGUkMihkb21FbGVtZW50LCBwcm9wcyk7XG4gICAgICByZXR1cm47XG5cbiAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgcmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQxKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgIHJldHVybjtcbiAgfVxufVxuXG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKCkge307XG5cbnZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKCkge307XG5cbntcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjc3BlY2lhbFxuICB2YXIgc3BlY2lhbFRhZ3MgPSBbJ2FkZHJlc3MnLCAnYXBwbGV0JywgJ2FyZWEnLCAnYXJ0aWNsZScsICdhc2lkZScsICdiYXNlJywgJ2Jhc2Vmb250JywgJ2Jnc291bmQnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYXB0aW9uJywgJ2NlbnRlcicsICdjb2wnLCAnY29sZ3JvdXAnLCAnZGQnLCAnZGV0YWlscycsICdkaXInLCAnZGl2JywgJ2RsJywgJ2R0JywgJ2VtYmVkJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2Zvb3RlcicsICdmb3JtJywgJ2ZyYW1lJywgJ2ZyYW1lc2V0JywgJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2JywgJ2hlYWQnLCAnaGVhZGVyJywgJ2hncm91cCcsICdocicsICdodG1sJywgJ2lmcmFtZScsICdpbWcnLCAnaW5wdXQnLCAnaXNpbmRleCcsICdsaScsICdsaW5rJywgJ2xpc3RpbmcnLCAnbWFpbicsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0YScsICduYXYnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdvYmplY3QnLCAnb2wnLCAncCcsICdwYXJhbScsICdwbGFpbnRleHQnLCAncHJlJywgJ3NjcmlwdCcsICdzZWN0aW9uJywgJ3NlbGVjdCcsICdzb3VyY2UnLCAnc3R5bGUnLCAnc3VtbWFyeScsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aXRsZScsICd0cicsICd0cmFjaycsICd1bCcsICd3YnInLCAneG1wJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG5cbiAgdmFyIGluU2NvcGVUYWdzID0gWydhcHBsZXQnLCAnY2FwdGlvbicsICdodG1sJywgJ3RhYmxlJywgJ3RkJywgJ3RoJywgJ21hcnF1ZWUnLCAnb2JqZWN0JywgJ3RlbXBsYXRlJywgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7IC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcblxuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIGZvcm1UYWc6IG51bGwsXG4gICAgYVRhZ0luU2NvcGU6IG51bGwsXG4gICAgYnV0dG9uVGFnSW5TY29wZTogbnVsbCxcbiAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICBwVGFnSW5CdXR0b25TY29wZTogbnVsbCxcbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdXBkYXRlZEFuY2VzdG9ySW5mbyA9IGZ1bmN0aW9uIChvbGRJbmZvLCB0YWcpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gX2Fzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG5cbiAgICB2YXIgaW5mbyA9IHtcbiAgICAgIHRhZzogdGFnXG4gICAgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfSAvLyBTZWUgcnVsZXMgZm9yICdsaScsICdkZCcsICdkdCcgc3RhcnQgdGFncyBpblxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnYScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuXG4gICAgaWYgKHRhZyA9PT0gJ3AnKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBpbmZvO1xuICAgIH1cblxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuXG5cbiAgdmFyIGlzVGFnVmFsaWRXaXRoUGFyZW50ID0gZnVuY3Rpb24gKHRhZywgcGFyZW50VGFnKSB7XG4gICAgLy8gRmlyc3QsIGxldCdzIGNoZWNrIGlmIHdlJ3JlIGluIGFuIHVudXN1YWwgcGFyc2luZyBtb2RlLi4uXG4gICAgc3dpdGNoIChwYXJlbnRUYWcpIHtcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnNlbGVjdFxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ29wdGlvbicgfHwgdGFnID09PSAnb3B0Z3JvdXAnIHx8IHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcblxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRyXG5cbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGJvZHlcblxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNvbGdyb3VwXG5cbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGFibGVcblxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmhlYWRcblxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudFxuXG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknIHx8IHRhZyA9PT0gJ2ZyYW1lc2V0JztcblxuICAgICAgY2FzZSAnZnJhbWVzZXQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnZnJhbWUnO1xuXG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfSAvLyBQcm9iYWJseSBpbiB0aGUgXCJpbiBib2R5XCIgcGFyc2luZyBtb2RlLCBzbyB3ZSBvdXRsYXcgb25seSB0YWcgY29tYm9zXG4gICAgLy8gd2hlcmUgdGhlIHBhcnNpbmcgcnVsZXMgY2F1c2UgaW1wbGljaXQgb3BlbnMgb3IgY2xvc2VzIHRvIGJlIGFkZGVkLlxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHlcblxuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lc2V0JzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG5cblxuICB2YXIgZmluZEludmFsaWRBbmNlc3RvckZvclRhZyA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdhZGRyZXNzJzpcbiAgICAgIGNhc2UgJ2FydGljbGUnOlxuICAgICAgY2FzZSAnYXNpZGUnOlxuICAgICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgY2FzZSAnZGV0YWlscyc6XG4gICAgICBjYXNlICdkaWFsb2cnOlxuICAgICAgY2FzZSAnZGlyJzpcbiAgICAgIGNhc2UgJ2Rpdic6XG4gICAgICBjYXNlICdkbCc6XG4gICAgICBjYXNlICdmaWVsZHNldCc6XG4gICAgICBjYXNlICdmaWdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2ZpZ3VyZSc6XG4gICAgICBjYXNlICdmb290ZXInOlxuICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgIGNhc2UgJ2hncm91cCc6XG4gICAgICBjYXNlICdtYWluJzpcbiAgICAgIGNhc2UgJ21lbnUnOlxuICAgICAgY2FzZSAnbmF2JzpcbiAgICAgIGNhc2UgJ29sJzpcbiAgICAgIGNhc2UgJ3AnOlxuICAgICAgY2FzZSAnc2VjdGlvbic6XG4gICAgICBjYXNlICdzdW1tYXJ5JzpcbiAgICAgIGNhc2UgJ3VsJzpcbiAgICAgIGNhc2UgJ3ByZSc6XG4gICAgICBjYXNlICdsaXN0aW5nJzpcbiAgICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGNhc2UgJ2hyJzpcbiAgICAgIGNhc2UgJ3htcCc6XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmZvcm1UYWcgfHwgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdsaSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnZGQnOlxuICAgICAgY2FzZSAnZHQnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgICAvLyBTcGVjIHNheXMgc29tZXRoaW5nIGFib3V0IHN0b3JpbmcgYSBsaXN0IG9mIG1hcmtlcnMsIGJ1dCBpdCBzb3VuZHNcbiAgICAgICAgLy8gZXF1aXZhbGVudCB0byB0aGlzIGNoZWNrLlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdub2JyJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICB2YXIgZGlkV2FybiQxID0ge307XG5cbiAgdmFsaWRhdGVET01OZXN0aW5nID0gZnVuY3Rpb24gKGNoaWxkVGFnLCBjaGlsZFRleHQsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuXG4gICAgaWYgKGNoaWxkVGV4dCAhPSBudWxsKSB7XG4gICAgICBpZiAoY2hpbGRUYWcgIT0gbnVsbCkge1xuICAgICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJyk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW52YWxpZFBhcmVudE9yQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmICghaW52YWxpZFBhcmVudE9yQW5jZXN0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYW5jZXN0b3JUYWcgPSBpbnZhbGlkUGFyZW50T3JBbmNlc3Rvci50YWc7XG4gICAgdmFyIHdhcm5LZXkgPSAhIWludmFsaWRQYXJlbnQgKyAnfCcgKyBjaGlsZFRhZyArICd8JyArIGFuY2VzdG9yVGFnO1xuXG4gICAgaWYgKGRpZFdhcm4kMVt3YXJuS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRpZFdhcm4kMVt3YXJuS2V5XSA9IHRydWU7XG4gICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgdmFyIHdoaXRlc3BhY2VJbmZvID0gJyc7XG5cbiAgICBpZiAoY2hpbGRUYWcgPT09ICcjdGV4dCcpIHtcbiAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9IFwiIE1ha2Ugc3VyZSB5b3UgZG9uJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gXCIgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICB9XG5cbiAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgIGluZm8gKz0gJyBBZGQgYSA8dGJvZHk+LCA8dGhlYWQ+IG9yIDx0Zm9vdD4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgfVxuXG4gICAgICBlcnJvcigndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzJXMnLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIHdoaXRlc3BhY2VJbmZvLCBpbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IoJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnKTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxO1xuXG57XG4gIFNVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDEgPSAnc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nJztcbn1cblxudmFyIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSAnJCc7XG52YXIgU1VTUEVOU0VfRU5EX0RBVEEgPSAnLyQnO1xudmFyIFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSA9ICckPyc7XG52YXIgU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSA9ICckISc7XG52YXIgU1RZTEUkMSA9ICdzdHlsZSc7XG52YXIgZXZlbnRzRW5hYmxlZCA9IG51bGw7XG52YXIgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xuXG5mdW5jdGlvbiBzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIHByb3BzKSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgcmV0dXJuICEhcHJvcHMuYXV0b0ZvY3VzO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250ZXh0KHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB2YXIgdHlwZTtcbiAgdmFyIG5hbWVzcGFjZTtcbiAgdmFyIG5vZGVUeXBlID0gcm9vdENvbnRhaW5lckluc3RhbmNlLm5vZGVUeXBlO1xuXG4gIHN3aXRjaCAobm9kZVR5cGUpIHtcbiAgICBjYXNlIERPQ1VNRU5UX05PREU6XG4gICAgY2FzZSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFOlxuICAgICAge1xuICAgICAgICB0eXBlID0gbm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUgPyAnI2RvY3VtZW50JyA6ICcjZnJhZ21lbnQnO1xuICAgICAgICB2YXIgcm9vdCA9IHJvb3RDb250YWluZXJJbnN0YW5jZS5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIG5hbWVzcGFjZSA9IHJvb3QgPyByb290Lm5hbWVzcGFjZVVSSSA6IGdldENoaWxkTmFtZXNwYWNlKG51bGwsICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSA/IHJvb3RDb250YWluZXJJbnN0YW5jZS5wYXJlbnROb2RlIDogcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgICAgICB2YXIgb3duTmFtZXNwYWNlID0gY29udGFpbmVyLm5hbWVzcGFjZVVSSSB8fCBudWxsO1xuICAgICAgICB0eXBlID0gY29udGFpbmVyLnRhZ05hbWU7XG4gICAgICAgIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKG93bk5hbWVzcGFjZSwgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHZhciB2YWxpZGF0ZWRUYWcgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgdmFsaWRhdGVkVGFnKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldENoaWxkSG9zdENvbnRleHQocGFyZW50SG9zdENvbnRleHQsIHR5cGUsIHJvb3RDb250YWluZXJJbnN0YW5jZSkge1xuICB7XG4gICAgdmFyIHBhcmVudEhvc3RDb250ZXh0RGV2ID0gcGFyZW50SG9zdENvbnRleHQ7XG4gICAgdmFyIG5hbWVzcGFjZSA9IGdldENoaWxkTmFtZXNwYWNlKHBhcmVudEhvc3RDb250ZXh0RGV2Lm5hbWVzcGFjZSwgdHlwZSk7XG4gICAgdmFyIGFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXNwYWNlOiBuYW1lc3BhY2UsXG4gICAgICBhbmNlc3RvckluZm86IGFuY2VzdG9ySW5mb1xuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFB1YmxpY0luc3RhbmNlKGluc3RhbmNlKSB7XG4gIHJldHVybiBpbnN0YW5jZTtcbn1cbmZ1bmN0aW9uIHByZXBhcmVGb3JDb21taXQoY29udGFpbmVySW5mbykge1xuICBldmVudHNFbmFibGVkID0gaXNFbmFibGVkKCk7XG4gIHNlbGVjdGlvbkluZm9ybWF0aW9uID0gZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24oKTtcbiAgdmFyIGFjdGl2ZUluc3RhbmNlID0gbnVsbDtcblxuICBzZXRFbmFibGVkKGZhbHNlKTtcbiAgcmV0dXJuIGFjdGl2ZUluc3RhbmNlO1xufVxuZnVuY3Rpb24gcmVzZXRBZnRlckNvbW1pdChjb250YWluZXJJbmZvKSB7XG4gIHJlc3RvcmVTZWxlY3Rpb24oc2VsZWN0aW9uSW5mb3JtYXRpb24pO1xuICBzZXRFbmFibGVkKGV2ZW50c0VuYWJsZWQpO1xuICBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UodHlwZSwgcHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAgdmFyIHBhcmVudE5hbWVzcGFjZTtcblxuICB7XG4gICAgLy8gVE9ETzogdGFrZSBuYW1lc3BhY2UgaW50byBhY2NvdW50IHdoZW4gdmFsaWRhdGluZy5cbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICB2YWxpZGF0ZURPTU5lc3RpbmcodHlwZSwgbnVsbCwgaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvKTtcblxuICAgIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIHByb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuXG4gICAgcGFyZW50TmFtZXNwYWNlID0gaG9zdENvbnRleHREZXYubmFtZXNwYWNlO1xuICB9XG5cbiAgdmFyIGRvbUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIHBhcmVudE5hbWVzcGFjZSk7XG4gIHByZWNhY2hlRmliZXJOb2RlKGludGVybmFsSW5zdGFuY2VIYW5kbGUsIGRvbUVsZW1lbnQpO1xuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIGRvbUVsZW1lbnQ7XG59XG5mdW5jdGlvbiBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50SW5zdGFuY2UsIGNoaWxkKSB7XG4gIHBhcmVudEluc3RhbmNlLmFwcGVuZENoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGZpbmFsaXplSW5pdGlhbENoaWxkcmVuKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UsIGhvc3RDb250ZXh0KSB7XG4gIHNldEluaXRpYWxQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIHByb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpO1xuICByZXR1cm4gc2hvdWxkQXV0b0ZvY3VzSG9zdENvbXBvbmVudCh0eXBlLCBwcm9wcyk7XG59XG5mdW5jdGlvbiBwcmVwYXJlVXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGhvc3RDb250ZXh0RGV2ID0gaG9zdENvbnRleHQ7XG5cbiAgICBpZiAodHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuICE9PSB0eXBlb2Ygb2xkUHJvcHMuY2hpbGRyZW4gJiYgKHR5cGVvZiBuZXdQcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld1Byb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJykpIHtcbiAgICAgIHZhciBzdHJpbmcgPSAnJyArIG5ld1Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIG93bkFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm8oaG9zdENvbnRleHREZXYuYW5jZXN0b3JJbmZvLCB0eXBlKTtcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBzdHJpbmcsIG93bkFuY2VzdG9ySW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpZmZQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG59XG5mdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICByZXR1cm4gdHlwZSA9PT0gJ3RleHRhcmVhJyB8fCB0eXBlID09PSAnb3B0aW9uJyB8fCB0eXBlID09PSAnbm9zY3JpcHQnIHx8IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHByb3BzLmNoaWxkcmVuID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT09ICdvYmplY3QnICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9PSBudWxsICYmIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCAhPSBudWxsO1xufVxuZnVuY3Rpb24gY3JlYXRlVGV4dEluc3RhbmNlKHRleHQsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGludGVybmFsSW5zdGFuY2VIYW5kbGUpIHtcbiAge1xuICAgIHZhciBob3N0Q29udGV4dERldiA9IGhvc3RDb250ZXh0O1xuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0ZXh0LCBob3N0Q29udGV4dERldi5hbmNlc3RvckluZm8pO1xuICB9XG5cbiAgdmFyIHRleHROb2RlID0gY3JlYXRlVGV4dE5vZGUodGV4dCwgcm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgcHJlY2FjaGVGaWJlck5vZGUoaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSwgdGV4dE5vZGUpO1xuICByZXR1cm4gdGV4dE5vZGU7XG59XG4vLyBpZiBhIGNvbXBvbmVudCBqdXN0IGltcG9ydHMgUmVhY3RET00gKGUuZy4gZm9yIGZpbmRET01Ob2RlKS5cbi8vIFNvbWUgZW52aXJvbm1lbnRzIG1pZ2h0IG5vdCBoYXZlIHNldFRpbWVvdXQgb3IgY2xlYXJUaW1lb3V0LlxuXG52YXIgc2NoZWR1bGVUaW1lb3V0ID0gdHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicgPyBzZXRUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIGNhbmNlbFRpbWVvdXQgPSB0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nID8gY2xlYXJUaW1lb3V0IDogdW5kZWZpbmVkO1xudmFyIG5vVGltZW91dCA9IC0xOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjb21taXRNb3VudChkb21FbGVtZW50LCB0eXBlLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBEZXNwaXRlIHRoZSBuYW1pbmcgdGhhdCBtaWdodCBpbXBseSBvdGhlcndpc2UsIHRoaXMgbWV0aG9kIG9ubHlcbiAgLy8gZmlyZXMgaWYgdGhlcmUgaXMgYW4gYFVwZGF0ZWAgZWZmZWN0IHNjaGVkdWxlZCBkdXJpbmcgbW91bnRpbmcuXG4gIC8vIFRoaXMgaGFwcGVucyBpZiBgZmluYWxpemVJbml0aWFsQ2hpbGRyZW5gIHJldHVybnMgYHRydWVgICh3aGljaCBpdFxuICAvLyBkb2VzIHRvIGltcGxlbWVudCB0aGUgYGF1dG9Gb2N1c2AgYXR0cmlidXRlIG9uIHRoZSBjbGllbnQpLiBCdXRcbiAgLy8gdGhlcmUgYXJlIGFsc28gb3RoZXIgY2FzZXMgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbiAoc3VjaCBhcyBwYXRjaGluZ1xuICAvLyB1cCB0ZXh0IGNvbnRlbnQgZHVyaW5nIGh5ZHJhdGlvbiBtaXNtYXRjaCkuIFNvIHdlJ2xsIGNoZWNrIHRoaXMgYWdhaW4uXG4gIGlmIChzaG91bGRBdXRvRm9jdXNIb3N0Q29tcG9uZW50KHR5cGUsIG5ld1Byb3BzKSkge1xuICAgIGRvbUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICAvLyBVcGRhdGUgdGhlIHByb3BzIGhhbmRsZSBzbyB0aGF0IHdlIGtub3cgd2hpY2ggcHJvcHMgYXJlIHRoZSBvbmVzIHdpdGhcbiAgLy8gd2l0aCBjdXJyZW50IGV2ZW50IGhhbmRsZXJzLlxuICB1cGRhdGVGaWJlclByb3BzKGRvbUVsZW1lbnQsIG5ld1Byb3BzKTsgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIERPTSBub2RlLlxuXG4gIHVwZGF0ZVByb3BlcnRpZXMoZG9tRWxlbWVudCwgdXBkYXRlUGF5bG9hZCwgdHlwZSwgb2xkUHJvcHMsIG5ld1Byb3BzKTtcbn1cbmZ1bmN0aW9uIHJlc2V0VGV4dENvbnRlbnQoZG9tRWxlbWVudCkge1xuICBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCAnJyk7XG59XG5mdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gbmV3VGV4dDtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudEluc3RhbmNlLCBjaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgdmFyIHBhcmVudE5vZGU7XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgcGFyZW50Tm9kZSA9IGNvbnRhaW5lci5wYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBjb250YWluZXIpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUgPSBjb250YWluZXI7XG4gICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gIH0gLy8gVGhpcyBjb250YWluZXIgbWlnaHQgYmUgdXNlZCBmb3IgYSBwb3J0YWwuXG4gIC8vIElmIHNvbWV0aGluZyBpbnNpZGUgYSBwb3J0YWwgaXMgY2xpY2tlZCwgdGhhdCBjbGljayBzaG91bGQgYnViYmxlXG4gIC8vIHRocm91Z2ggdGhlIFJlYWN0IHRyZWUuIEhvd2V2ZXIsIG9uIE1vYmlsZSBTYWZhcmkgdGhlIGNsaWNrIHdvdWxkXG4gIC8vIG5ldmVyIGJ1YmJsZSB0aHJvdWdoIHRoZSAqRE9NKiB0cmVlIHVubGVzcyBhbiBhbmNlc3RvciB3aXRoIG9uY2xpY2tcbiAgLy8gZXZlbnQgZXhpc3RzLiBTbyB3ZSB3b3VsZG4ndCBzZWUgaXQgYW5kIGRpc3BhdGNoIGl0LlxuICAvLyBUaGlzIGlzIHdoeSB3ZSBlbnN1cmUgdGhhdCBub24gUmVhY3Qgcm9vdCBjb250YWluZXJzIGhhdmUgaW5saW5lIG9uY2xpY2tcbiAgLy8gZGVmaW5lZC5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMTkxOFxuXG5cbiAgdmFyIHJlYWN0Um9vdENvbnRhaW5lciA9IGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuXG4gIGlmICgocmVhY3RSb290Q29udGFpbmVyID09PSBudWxsIHx8IHJlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSAmJiBwYXJlbnROb2RlLm9uY2xpY2sgPT09IG51bGwpIHtcbiAgICAvLyBUT0RPOiBUaGlzIGNhc3QgbWF5IG5vdCBiZSBzb3VuZCBmb3IgU1ZHLCBNYXRoTUwgb3IgY3VzdG9tIGVsZW1lbnRzLlxuICAgIHRyYXBDbGlja09uTm9uSW50ZXJhY3RpdmVFbGVtZW50KHBhcmVudE5vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50SW5zdGFuY2UsIGNoaWxkLCBiZWZvcmVDaGlsZCkge1xuICBwYXJlbnRJbnN0YW5jZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbn1cbmZ1bmN0aW9uIGluc2VydEluQ29udGFpbmVyQmVmb3JlKGNvbnRhaW5lciwgY2hpbGQsIGJlZm9yZUNoaWxkKSB7XG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuICAgIGNvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgYmVmb3JlQ2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZUNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgcGFyZW50SW5zdGFuY2UucmVtb3ZlQ2hpbGQoY2hpbGQpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjaGlsZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAvLyBUT0RPOiBEb2VzIHRoaXMgd29yayBmb3IgYWxsIGVsZW1lbnQgdHlwZXM/IFdoYXQgYWJvdXQgTWF0aE1MPyBTaG91bGQgd2VcbiAgLy8gcGFzcyBob3N0IGNvbnRleHQgdG8gdGhpcyBtZXRob2Q/XG4gIGluc3RhbmNlID0gaW5zdGFuY2U7XG4gIHZhciBzdHlsZSA9IGluc3RhbmNlLnN0eWxlO1xuXG4gIGlmICh0eXBlb2Ygc3R5bGUuc2V0UHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJywgJ2ltcG9ydGFudCcpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cbn1cbmZ1bmN0aW9uIGhpZGVUZXh0SW5zdGFuY2UodGV4dEluc3RhbmNlKSB7XG4gIHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPSAnJztcbn1cbmZ1bmN0aW9uIHVuaGlkZUluc3RhbmNlKGluc3RhbmNlLCBwcm9wcykge1xuICBpbnN0YW5jZSA9IGluc3RhbmNlO1xuICB2YXIgc3R5bGVQcm9wID0gcHJvcHNbU1RZTEUkMV07XG4gIHZhciBkaXNwbGF5ID0gc3R5bGVQcm9wICE9PSB1bmRlZmluZWQgJiYgc3R5bGVQcm9wICE9PSBudWxsICYmIHN0eWxlUHJvcC5oYXNPd25Qcm9wZXJ0eSgnZGlzcGxheScpID8gc3R5bGVQcm9wLmRpc3BsYXkgOiBudWxsO1xuICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZSgnZGlzcGxheScsIGRpc3BsYXkpO1xufVxuZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlID0gdGV4dDtcbn1cbmZ1bmN0aW9uIGNsZWFyQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICBjb250YWluZXIudGV4dENvbnRlbnQgPSAnJztcbiAgfSBlbHNlIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ1VNRU5UX05PREUpIHtcbiAgICB2YXIgYm9keSA9IGNvbnRhaW5lci5ib2R5O1xuXG4gICAgaWYgKGJvZHkgIT0gbnVsbCkge1xuICAgICAgYm9keS50ZXh0Q29udGVudCA9ICcnO1xuICAgIH1cbiAgfVxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG5mdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gIGlmIChpbnN0YW5jZS5ub2RlVHlwZSAhPT0gRUxFTUVOVF9OT0RFIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gaW5zdGFuY2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoaXMgaGFzIG5vdyBiZWVuIHJlZmluZWQgdG8gYW4gZWxlbWVudCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycgfHwgaW5zdGFuY2Uubm9kZVR5cGUgIT09IFRFWFRfTk9ERSkge1xuICAgIC8vIEVtcHR5IHN0cmluZ3MgYXJlIG5vdCBwYXJzZWQgYnkgSFRNTCBzbyB0aGVyZSB3b24ndCBiZSBhIGNvcnJlY3QgbWF0Y2ggaGVyZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBUaGlzIGhhcyBub3cgYmVlbiByZWZpbmVkIHRvIGEgdGV4dCBub2RlLlxuXG5cbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZUluc3RhbmNlRmFsbGJhY2soaW5zdGFuY2UpIHtcbiAgcmV0dXJuIGluc3RhbmNlLmRhdGEgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEE7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlKG5vZGUpIHtcbiAgLy8gU2tpcCBub24taHlkcmF0YWJsZSBub2Rlcy5cbiAgZm9yICg7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICB2YXIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuXG4gICAgaWYgKG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhpbnN0YW5jZSkge1xuICByZXR1cm4gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xufVxuZnVuY3Rpb24gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpIHtcbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKHBhcmVudEluc3RhbmNlLmZpcnN0Q2hpbGQpO1xufVxuZnVuY3Rpb24gaHlkcmF0ZUluc3RhbmNlKGluc3RhbmNlLCB0eXBlLCBwcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCBpbnN0YW5jZSk7IC8vIFRPRE86IFBvc3NpYmx5IGRlZmVyIHRoaXMgdW50aWwgdGhlIGNvbW1pdCBwaGFzZSB3aGVyZSBhbGwgdGhlIGV2ZW50c1xuICAvLyBnZXQgYXR0YWNoZWQuXG5cbiAgdXBkYXRlRmliZXJQcm9wcyhpbnN0YW5jZSwgcHJvcHMpO1xuICB2YXIgcGFyZW50TmFtZXNwYWNlO1xuXG4gIHtcbiAgICB2YXIgaG9zdENvbnRleHREZXYgPSBob3N0Q29udGV4dDtcbiAgICBwYXJlbnROYW1lc3BhY2UgPSBob3N0Q29udGV4dERldi5uYW1lc3BhY2U7XG4gIH1cblxuICByZXR1cm4gZGlmZkh5ZHJhdGVkUHJvcGVydGllcyhpbnN0YW5jZSwgdHlwZSwgcHJvcHMsIHBhcmVudE5hbWVzcGFjZSk7XG59XG5mdW5jdGlvbiBoeWRyYXRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCwgaW50ZXJuYWxJbnN0YW5jZUhhbmRsZSkge1xuICBwcmVjYWNoZUZpYmVyTm9kZShpbnRlcm5hbEluc3RhbmNlSGFuZGxlLCB0ZXh0SW5zdGFuY2UpO1xuICByZXR1cm4gZGlmZkh5ZHJhdGVkVGV4dCh0ZXh0SW5zdGFuY2UsIHRleHQpO1xufVxuZnVuY3Rpb24gZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVyU3VzcGVuc2VJbnN0YW5jZShzdXNwZW5zZUluc3RhbmNlKSB7XG4gIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZzsgLy8gU2tpcCBwYXN0IGFsbCBub2RlcyB3aXRoaW4gdGhpcyBzdXNwZW5zZSBib3VuZGFyeS5cbiAgLy8gVGhlcmUgbWlnaHQgYmUgbmVzdGVkIG5vZGVzIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBob3dcbiAgLy8gZGVlcCB3ZSBhcmUgYW5kIG9ubHkgYnJlYWsgb3V0IHdoZW4gd2UncmUgYmFjayBvbiB0b3AuXG5cbiAgdmFyIGRlcHRoID0gMDtcblxuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHtcbiAgICAgIHZhciBkYXRhID0gbm9kZS5kYXRhO1xuXG4gICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlU2libGluZyhub2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgZGVwdGgrKztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5uZXh0U2libGluZztcbiAgfSAvLyBUT0RPOiBXYXJuLCB3ZSBkaWRuJ3QgZmluZCB0aGUgZW5kIGNvbW1lbnQgYm91bmRhcnkuXG5cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gUmV0dXJucyB0aGUgU3VzcGVuc2VJbnN0YW5jZSBpZiB0aGlzIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2YgYVxuLy8gU3VzcGVuc2VJbnN0YW5jZS4gSS5lLiBpZiBpdHMgcHJldmlvdXMgc2libGluZyBpcyBhIENvbW1lbnQgd2l0aFxuLy8gU1VTUEVOU0VfeF9TVEFSVF9EQVRBLiBPdGhlcndpc2UsIG51bGwuXG5cbmZ1bmN0aW9uIGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2UodGFyZ2V0SW5zdGFuY2UpIHtcbiAgdmFyIG5vZGUgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7IC8vIFNraXAgcGFzdCBhbGwgbm9kZXMgd2l0aGluIHRoaXMgc3VzcGVuc2UgYm91bmRhcnkuXG4gIC8vIFRoZXJlIG1pZ2h0IGJlIG5lc3RlZCBub2RlcyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaG93XG4gIC8vIGRlZXAgd2UgYXJlIGFuZCBvbmx5IGJyZWFrIG91dCB3aGVuIHdlJ3JlIGJhY2sgb24gdG9wLlxuXG4gIHZhciBkZXB0aCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICB2YXIgZGF0YSA9IG5vZGUuZGF0YTtcblxuICAgICAgaWYgKGRhdGEgPT09IFNVU1BFTlNFX1NUQVJUX0RBVEEgfHwgZGF0YSA9PT0gU1VTUEVOU0VfRkFMTEJBQ0tfU1RBUlRfREFUQSB8fCBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEpIHtcbiAgICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkYXRhID09PSBTVVNQRU5TRV9FTkRfREFUQSkge1xuICAgICAgICBkZXB0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gIC8vIFJldHJ5IGlmIGFueSBldmVudCByZXBsYXlpbmcgd2FzIGJsb2NrZWQgb24gdGhpcy5cbiAgcmV0cnlJZkJsb2NrZWRPbihjb250YWluZXIpO1xufVxuZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgLy8gUmV0cnkgaWYgYW55IGV2ZW50IHJlcGxheWluZyB3YXMgYmxvY2tlZCBvbiB0aGlzLlxuICByZXRyeUlmQmxvY2tlZE9uKHN1c3BlbnNlSW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZENvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvclVubWF0Y2hlZFRleHQodGV4dEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpIHtcbiAge1xuICAgIGlmIChpbnN0YW5jZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVFbGVtZW50KHBhcmVudENvbnRhaW5lciwgaW5zdGFuY2UpO1xuICAgIH0gZWxzZSBpZiAoaW5zdGFuY2Uubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkgOyBlbHNlIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZVRleHQocGFyZW50Q29udGFpbmVyLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RIeWRyYXRlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgIHdhcm5Gb3JEZWxldGVkSHlkcmF0YWJsZUVsZW1lbnQocGFyZW50SW5zdGFuY2UsIGluc3RhbmNlKTtcbiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIDsgZWxzZSB7XG4gICAgICB3YXJuRm9yRGVsZXRlZEh5ZHJhdGFibGVUZXh0KHBhcmVudEluc3RhbmNlLCBpbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lckluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdHlwZSwgcHJvcHMpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUNvbnRhaW5lclRleHRJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHRleHQpIHtcbiAge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkVGV4dChwYXJlbnRDb250YWluZXIsIHRleHQpO1xuICB9XG59XG5mdW5jdGlvbiBkaWROb3RGaW5kSHlkcmF0YWJsZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdHlwZSwgcHJvcHMpIHtcbiAgaWYgKCBwYXJlbnRQcm9wc1tTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyQxXSAhPT0gdHJ1ZSkge1xuICAgIHdhcm5Gb3JJbnNlcnRlZEh5ZHJhdGVkRWxlbWVudChwYXJlbnRJbnN0YW5jZSwgdHlwZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgdGV4dCkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSB7XG4gICAgd2FybkZvckluc2VydGVkSHlkcmF0ZWRUZXh0KHBhcmVudEluc3RhbmNlLCB0ZXh0KTtcbiAgfVxufVxuZnVuY3Rpb24gZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSkge1xuICBpZiAoIHBhcmVudFByb3BzW1NVUFBSRVNTX0hZRFJBVElPTl9XQVJOSU5HJDFdICE9PSB0cnVlKSA7XG59XG52YXIgY2xpZW50SWQgPSAwO1xuZnVuY3Rpb24gbWFrZUNsaWVudElkSW5ERVYod2Fybk9uQWNjZXNzSW5ERVYpIHtcbiAgdmFyIGlkID0gJ3I6JyArIChjbGllbnRJZCsrKS50b1N0cmluZygzNik7XG4gIHJldHVybiB7XG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHdhcm5PbkFjY2Vzc0luREVWKCk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfSxcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICB3YXJuT25BY2Nlc3NJbkRFVigpO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGlzT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9PUEFRVUVfSURfVFlQRTtcbn1cbmZ1bmN0aW9uIG1ha2VPcGFxdWVIeWRyYXRpbmdPYmplY3QoYXR0ZW1wdFRvUmVhZFZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX09QQVFVRV9JRF9UWVBFLFxuICAgIHRvU3RyaW5nOiBhdHRlbXB0VG9SZWFkVmFsdWUsXG4gICAgdmFsdWVPZjogYXR0ZW1wdFRvUmVhZFZhbHVlXG4gIH07XG59XG5mdW5jdGlvbiBwcmVwYXJlUG9ydGFsTW91bnQocG9ydGFsSW5zdGFuY2UpIHtcbiAge1xuICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKHBvcnRhbEluc3RhbmNlKTtcbiAgfVxufVxuXG52YXIgcmFuZG9tS2V5ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0RmliZXIkJyArIHJhbmRvbUtleTtcbnZhciBpbnRlcm5hbFByb3BzS2V5ID0gJ19fcmVhY3RQcm9wcyQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXkgPSAnX19yZWFjdENvbnRhaW5lciQnICsgcmFuZG9tS2V5O1xudmFyIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9ICdfX3JlYWN0RXZlbnRzJCcgKyByYW5kb21LZXk7XG5mdW5jdGlvbiBwcmVjYWNoZUZpYmVyTm9kZShob3N0SW5zdCwgbm9kZSkge1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5mdW5jdGlvbiBtYXJrQ29udGFpbmVyQXNSb290KGhvc3RSb290LCBub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBob3N0Um9vdDtcbn1cbmZ1bmN0aW9uIHVubWFya0NvbnRhaW5lckFzUm9vdChub2RlKSB7XG4gIG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xufVxuZnVuY3Rpb24gaXNDb250YWluZXJNYXJrZWRBc1Jvb3Qobm9kZSkge1xuICByZXR1cm4gISFub2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldO1xufSAvLyBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgSG9zdENvbXBvbmVudCBvciBIb3N0VGV4dCBmaWJlciBhbmNlc3Rvci5cbi8vIElmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgaHlkcmF0ZWQgb3Igbm90IHlldCByZW5kZXJlZCBzdWJ0cmVlLCB0aGVuXG4vLyB0aGlzIG1heSBhbHNvIHJldHVybiBhIFN1c3BlbnNlQ29tcG9uZW50IG9yIEhvc3RSb290IHRvIGluZGljYXRlIHRoYXQuXG4vLyBDb25jZXB0dWFsbHkgdGhlIEhvc3RSb290IGZpYmVyIGlzIGEgY2hpbGQgb2YgdGhlIENvbnRhaW5lciBub2RlLiBTbyBpZiB5b3Vcbi8vIHBhc3MgdGhlIENvbnRhaW5lciBub2RlIGFzIHRoZSB0YXJnZXROb2RlLCB5b3Ugd2lsbCBub3QgYWN0dWFsbHkgZ2V0IHRoZVxuLy8gSG9zdFJvb3QgYmFjay4gVG8gZ2V0IHRvIHRoZSBIb3N0Um9vdCwgeW91IG5lZWQgdG8gcGFzcyBhIGNoaWxkIG9mIGl0LlxuLy8gVGhlIHNhbWUgdGhpbmcgYXBwbGllcyB0byBTdXNwZW5zZSBib3VuZGFyaWVzLlxuXG5mdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gIHZhciB0YXJnZXRJbnN0ID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcblxuICBpZiAodGFyZ2V0SW5zdCkge1xuICAgIC8vIERvbid0IHJldHVybiBIb3N0Um9vdCBvciBTdXNwZW5zZUNvbXBvbmVudCBoZXJlLlxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9IC8vIElmIHRoZSBkaXJlY3QgZXZlbnQgdGFyZ2V0IGlzbid0IGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUsIHdlIG5lZWQgdG8gbG9va1xuICAvLyB0byBzZWUgaWYgb25lIG9mIGl0cyBwYXJlbnRzIGlzIGEgUmVhY3Qgb3duZWQgRE9NIG5vZGUuXG5cblxuICB2YXIgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcblxuICB3aGlsZSAocGFyZW50Tm9kZSkge1xuICAgIC8vIFdlJ2xsIGNoZWNrIGlmIHRoaXMgaXMgYSBjb250YWluZXIgcm9vdCB0aGF0IGNvdWxkIGluY2x1ZGVcbiAgICAvLyBSZWFjdCBub2RlcyBpbiB0aGUgZnV0dXJlLiBXZSBuZWVkIHRvIGNoZWNrIHRoaXMgZmlyc3QgYmVjYXVzZVxuICAgIC8vIGlmIHdlJ3JlIGEgY2hpbGQgb2YgYSBkZWh5ZHJhdGVkIGNvbnRhaW5lciwgd2UgbmVlZCB0byBmaXJzdFxuICAgIC8vIGZpbmQgdGhhdCBpbm5lciBjb250YWluZXIgYmVmb3JlIG1vdmluZyBvbiB0byBmaW5kaW5nIHRoZSBwYXJlbnRcbiAgICAvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrIHRoaXMgZmllbGQgb24gIHRoZSB0YXJnZXROb2RlXG4gICAgLy8gaXRzZWxmIGJlY2F1c2UgdGhlIGZpYmVycyBhcmUgY29uY2VwdHVhbGx5IGJldHdlZW4gdGhlIGNvbnRhaW5lclxuICAgIC8vIG5vZGUgYW5kIHRoZSBmaXJzdCBjaGlsZC4gSXQgaXNuJ3Qgc3Vycm91bmRpbmcgdGhlIGNvbnRhaW5lciBub2RlLlxuICAgIC8vIElmIGl0J3Mgbm90IGEgY29udGFpbmVyLCB3ZSBjaGVjayBpZiBpdCdzIGFuIGluc3RhbmNlLlxuICAgIHRhcmdldEluc3QgPSBwYXJlbnROb2RlW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldIHx8IHBhcmVudE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICBpZiAodGFyZ2V0SW5zdCkge1xuICAgICAgLy8gU2luY2UgdGhpcyB3YXNuJ3QgdGhlIGRpcmVjdCB0YXJnZXQgb2YgdGhlIGV2ZW50LCB3ZSBtaWdodCBoYXZlXG4gICAgICAvLyBzdGVwcGVkIHBhc3QgZGVoeWRyYXRlZCBET00gbm9kZXMgdG8gZ2V0IGhlcmUuIEhvd2V2ZXIgdGhleSBjb3VsZFxuICAgICAgLy8gYWxzbyBoYXZlIGJlZW4gbm9uLVJlYWN0IG5vZGVzLiBXZSBuZWVkIHRvIGFuc3dlciB3aGljaCBvbmUuXG4gICAgICAvLyBJZiB3ZSB0aGUgaW5zdGFuY2UgZG9lc24ndCBoYXZlIGFueSBjaGlsZHJlbiwgdGhlbiB0aGVyZSBjYW4ndCBiZVxuICAgICAgLy8gYSBuZXN0ZWQgc3VzcGVuc2UgYm91bmRhcnkgd2l0aGluIGl0LiBTbyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBmYXN0XG4gICAgICAvLyBiYWlsb3V0LiBNb3N0IG9mIHRoZSB0aW1lLCB3aGVuIHBlb3BsZSBhZGQgbm9uLVJlYWN0IGNoaWxkcmVuIHRvXG4gICAgICAvLyB0aGUgdHJlZSwgaXQgaXMgdXNpbmcgYSByZWYgdG8gYSBjaGlsZC1sZXNzIERPTSBub2RlLlxuICAgICAgLy8gTm9ybWFsbHkgd2UnZCBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9mIHRoZSBmaWJlcnMgYmVjYXVzZSBpZiBpdFxuICAgICAgLy8gaGFzIGV2ZXIgZ29uZSBmcm9tIGhhdmluZyBjaGlsZHJlbiB0byBkZWxldGluZyB0aGVtIG9yIHZpY2UgdmVyc2FcbiAgICAgIC8vIGl0IHdvdWxkIGhhdmUgZGVsZXRlZCB0aGUgZGVoeWRyYXRlZCBib3VuZGFyeSBuZXN0ZWQgaW5zaWRlIGFscmVhZHkuXG4gICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGUgSG9zdFJvb3Qgc3RhcnRzIG91dCB3aXRoIGFuIGFsdGVybmF0ZSBpdCBtaWdodFxuICAgICAgLy8gaGF2ZSBvbmUgb24gdGhlIGFsdGVybmF0ZSBzbyB3ZSBuZWVkIHRvIGNoZWNrIGluIGNhc2UgdGhpcyB3YXMgYVxuICAgICAgLy8gcm9vdC5cbiAgICAgIHZhciBhbHRlcm5hdGUgPSB0YXJnZXRJbnN0LmFsdGVybmF0ZTtcblxuICAgICAgaWYgKHRhcmdldEluc3QuY2hpbGQgIT09IG51bGwgfHwgYWx0ZXJuYXRlICE9PSBudWxsICYmIGFsdGVybmF0ZS5jaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBOZXh0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgbm9kZSB0aGF0IHNraXBwZWQgcGFzdCBpc1xuICAgICAgICAvLyBuZXN0ZWQgd2l0aGluIGEgZGVoeWRyYXRlZCBib3VuZGFyeSBhbmQgaWYgc28sIHdoaWNoIG9uZS5cbiAgICAgICAgdmFyIHN1c3BlbnNlSW5zdGFuY2UgPSBnZXRQYXJlbnRTdXNwZW5zZUluc3RhbmNlKHRhcmdldE5vZGUpO1xuXG4gICAgICAgIHdoaWxlIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UgZm91bmQgYSBzdXNwZW5zZSBpbnN0YW5jZS4gVGhhdCBtZWFucyB0aGF0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAvLyBoeWRyYXRlZCBpdCB5ZXQuIEV2ZW4gdGhvdWdoIHdlIGxlYXZlIHRoZSBjb21tZW50cyBpbiB0aGVcbiAgICAgICAgICAvLyBET00gYWZ0ZXIgaHlkcmF0aW5nLCBhbmQgdGhlcmUgYXJlIGJvdW5kYXJpZXMgaW4gdGhlIERPTVxuICAgICAgICAgIC8vIHRoYXQgY291bGQgYWxyZWFkeSBiZSBoeWRyYXRlZCwgd2Ugd291bGRuJ3QgaGF2ZSBmb3VuZCB0aGVtXG4gICAgICAgICAgLy8gdGhyb3VnaCB0aGlzIHBhc3Mgc2luY2UgaWYgdGhlIHRhcmdldCBpcyBoeWRyYXRlZCBpdCB3b3VsZFxuICAgICAgICAgIC8vIGhhdmUgaGFkIGFuIGludGVybmFsSW5zdGFuY2VLZXkgb24gaXQuXG4gICAgICAgICAgLy8gTGV0J3MgZ2V0IHRoZSBmaWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIFN1c3BlbnNlQ29tcG9uZW50XG4gICAgICAgICAgLy8gYXMgdGhlIGRlZXBlc3QgaW5zdGFuY2UuXG4gICAgICAgICAgdmFyIHRhcmdldFN1c3BlbnNlSW5zdCA9IHN1c3BlbnNlSW5zdGFuY2VbaW50ZXJuYWxJbnN0YW5jZUtleV07XG5cbiAgICAgICAgICBpZiAodGFyZ2V0U3VzcGVuc2VJbnN0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0U3VzcGVuc2VJbnN0O1xuICAgICAgICAgIH0gLy8gSWYgd2UgZG9uJ3QgZmluZCBhIEZpYmVyIG9uIHRoZSBjb21tZW50LCBpdCBtaWdodCBiZSBiZWNhdXNlXG4gICAgICAgICAgLy8gd2UgaGF2ZW4ndCBnb3R0ZW4gdG8gaHlkcmF0ZSBpdCB5ZXQuIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIGFcbiAgICAgICAgICAvLyBwYXJlbnQgYm91bmRhcnkgdGhhdCBoYXNuJ3QgYWJvdmUgdGhpcyBvbmUgc28gd2UgbmVlZCB0byBmaW5kXG4gICAgICAgICAgLy8gdGhlIG91dGVyIG1vc3QgdGhhdCBpcyBrbm93bi5cblxuXG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZSA9IGdldFBhcmVudFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7IC8vIElmIHdlIGRvbid0IGZpbmQgb25lLCB0aGVuIHRoYXQgc2hvdWxkIG1lYW4gdGhhdCB0aGUgcGFyZW50XG4gICAgICAgICAgLy8gaG9zdCBjb21wb25lbnQgYWxzbyBoYXNuJ3QgaHlkcmF0ZWQgeWV0LiBXZSBjYW4gcmV0dXJuIGl0XG4gICAgICAgICAgLy8gYmVsb3cgc2luY2UgaXQgd2lsbCBiYWlsIG91dCBvbiB0aGUgaXNNb3VudGVkIGNoZWNrIGxhdGVyLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIHRhcmdldE5vZGUgPSBwYXJlbnROb2RlO1xuICAgIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV07XG5cbiAgaWYgKGluc3QpIHtcbiAgICBpZiAoaW5zdC50YWcgPT09IEhvc3RDb21wb25lbnQgfHwgaW5zdC50YWcgPT09IEhvc3RUZXh0IHx8IGluc3QudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFJvb3QpIHtcbiAgICAgIHJldHVybiBpbnN0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gIGlmIChpbnN0LnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBpbnN0LnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAvLyBJbiBGaWJlciB0aGlzLCBpcyBqdXN0IHRoZSBzdGF0ZSBub2RlIHJpZ2h0IG5vdy4gV2UgYXNzdW1lIGl0IHdpbGwgYmVcbiAgICAvLyBhIGhvc3QgY29tcG9uZW50IG9yIGhvc3QgdGV4dC5cbiAgICByZXR1cm4gaW5zdC5zdGF0ZU5vZGU7XG4gIH0gLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuXG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcImdldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZpYmVyQ3VycmVudFByb3BzRnJvbU5vZGUobm9kZSkge1xuICByZXR1cm4gbm9kZVtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xufVxuZnVuY3Rpb24gdXBkYXRlRmliZXJQcm9wcyhub2RlLCBwcm9wcykge1xuICBub2RlW2ludGVybmFsUHJvcHNLZXldID0gcHJvcHM7XG59XG5mdW5jdGlvbiBnZXRFdmVudExpc3RlbmVyU2V0KG5vZGUpIHtcbiAgdmFyIGVsZW1lbnRMaXN0ZW5lclNldCA9IG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcblxuICBpZiAoZWxlbWVudExpc3RlbmVyU2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbGVtZW50TGlzdGVuZXJTZXQgPSBub2RlW2ludGVybmFsRXZlbnRIYW5kbGVyc0tleV0gPSBuZXcgU2V0KCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudExpc3RlbmVyU2V0O1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCkge1xuICB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSwgZWxlbWVudC5fc291cmNlLCBvd25lciA/IG93bmVyLnR5cGUgOiBudWxsKTtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQpIHtcbiAge1xuICAgIC8vICRGbG93Rml4TWUgVGhpcyBpcyBva2F5IGJ1dCBGbG93IGRvZXNuJ3Qga25vdyBpdC5cbiAgICB2YXIgaGFzID0gRnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yJDEgPSB2b2lkIDA7IC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAgIGlmICh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciBlcnIgPSBFcnJvcigoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgKyAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICsgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLicpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXJyb3IkMSA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJyk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IkMSA9IGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgJiYgIShlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcycgKyAnIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvciQxKTtcblxuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yJDEgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yJDEubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IkMS5tZXNzYWdlXSA9IHRydWU7XG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgICAgICBlcnJvcignRmFpbGVkICVzIHR5cGU6ICVzJywgbG9jYXRpb24sIGVycm9yJDEubWVzc2FnZSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgdmFsdWVTdGFjayA9IFtdO1xudmFyIGZpYmVyU3RhY2s7XG5cbntcbiAgZmliZXJTdGFjayA9IFtdO1xufVxuXG52YXIgaW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY3JlYXRlQ3Vyc29yKGRlZmF1bHRWYWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1VuZXhwZWN0ZWQgcG9wLicpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHtcbiAgICBpZiAoZmliZXIgIT09IGZpYmVyU3RhY2tbaW5kZXhdKSB7XG4gICAgICBlcnJvcignVW5leHBlY3RlZCBGaWJlciBwb3BwZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgY3Vyc29yLmN1cnJlbnQgPSB2YWx1ZVN0YWNrW2luZGV4XTtcbiAgdmFsdWVTdGFja1tpbmRleF0gPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlclN0YWNrW2luZGV4XSA9IG51bGw7XG4gIH1cblxuICBpbmRleC0tO1xufVxuXG5mdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gIGluZGV4Kys7XG4gIHZhbHVlU3RhY2tbaW5kZXhdID0gY3Vyc29yLmN1cnJlbnQ7XG5cbiAge1xuICAgIGZpYmVyU3RhY2tbaW5kZXhdID0gZmliZXI7XG4gIH1cblxuICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xufVxuXG52YXIgd2FybmVkQWJvdXRNaXNzaW5nR2V0Q2hpbGRDb250ZXh0O1xuXG57XG4gIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dCA9IHt9O1xufVxuXG52YXIgZW1wdHlDb250ZXh0T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eUNvbnRleHRPYmplY3QpO1xufSAvLyBBIGN1cnNvciB0byB0aGUgY3VycmVudCBtZXJnZWQgY29udGV4dCBvYmplY3Qgb24gdGhlIHN0YWNrLlxuXG5cbnZhciBjb250ZXh0U3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZW1wdHlDb250ZXh0T2JqZWN0KTsgLy8gQSBjdXJzb3IgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29udGV4dCBoYXMgY2hhbmdlZC5cblxudmFyIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoZmFsc2UpOyAvLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBjb250ZXh0IG9iamVjdCB0aGF0IHdhcyBvbiB0aGUgc3RhY2suXG4vLyBXZSB1c2UgdGhpcyB0byBnZXQgYWNjZXNzIHRvIHRoZSBwYXJlbnQgY29udGV4dCBhZnRlciB3ZSBoYXZlIGFscmVhZHlcbi8vIHB1c2hlZCB0aGUgbmV4dCBjb250ZXh0IHByb3ZpZGVyLCBhbmQgbm93IG5lZWQgdG8gbWVyZ2UgdGhlaXIgY29udGV4dHMuXG5cbnZhciBwcmV2aW91c0NvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbmZ1bmN0aW9uIGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIpIHtcbiAge1xuICAgIGlmIChkaWRQdXNoT3duQ29udGV4dElmUHJvdmlkZXIgJiYgaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgLy8gSWYgdGhlIGZpYmVyIGlzIGEgY29udGV4dCBwcm92aWRlciBpdHNlbGYsIHdoZW4gd2UgcmVhZCBpdHMgY29udGV4dFxuICAgICAgLy8gd2UgbWF5IGhhdmUgYWxyZWFkeSBwdXNoZWQgaXRzIG93biBjaGlsZCBjb250ZXh0IG9uIHRoZSBzdGFjay4gQSBjb250ZXh0XG4gICAgICAvLyBwcm92aWRlciBzaG91bGQgbm90IFwic2VlXCIgaXRzIG93biBjaGlsZCBjb250ZXh0LiBUaGVyZWZvcmUgd2UgcmVhZCB0aGVcbiAgICAgIC8vIHByZXZpb3VzIChwYXJlbnQpIGNvbnRleHQgaW5zdGVhZCBmb3IgYSBjb250ZXh0IHByb3ZpZGVyLlxuICAgICAgcmV0dXJuIHByZXZpb3VzQ29udGV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIG1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0ID0gbWFza2VkQ29udGV4dDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gdHlwZS5jb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICB9IC8vIEF2b2lkIHJlY3JlYXRpbmcgbWFza2VkIGNvbnRleHQgdW5sZXNzIHVubWFza2VkIGNvbnRleHQgaGFzIGNoYW5nZWQuXG4gICAgLy8gRmFpbGluZyB0byBkbyB0aGlzIHdpbGwgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuXG4gICAgLy8gVGhpcyBtYXkgdHJpZ2dlciBpbmZpbml0ZSBsb29wcyBpZiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGNhbGxzIHNldFN0YXRlLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICBpZiAoaW5zdGFuY2UgJiYgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dCA9PT0gdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcblxuICAgIGZvciAodmFyIGtleSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIGNvbnRleHRba2V5XSA9IHVubWFza2VkQ29udGV4dFtrZXldO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjb250ZXh0VHlwZXMsIGNvbnRleHQsICdjb250ZXh0JywgbmFtZSk7XG4gICAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gICAgLy8gQ29udGV4dCBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgY2xhc3MgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBzbyBjaGVjayBmb3IgaW5zdGFuY2UuXG5cblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2FjaGVDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhc0NvbnRleHRDaGFuZ2VkKCkge1xuICB7XG4gICAgcmV0dXJuIGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRleHRQcm92aWRlcih0eXBlKSB7XG4gIHtcbiAgICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB0eXBlLmNoaWxkQ29udGV4dFR5cGVzO1xuICAgIHJldHVybiBjaGlsZENvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjaGlsZENvbnRleHRUeXBlcyAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcENvbnRleHQoZmliZXIpIHtcbiAge1xuICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlcikge1xuICB7XG4gICAgcG9wKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHVzaFRvcExldmVsQ29udGV4dE9iamVjdChmaWJlciwgY29udGV4dCwgZGlkQ2hhbmdlKSB7XG4gIHtcbiAgICBpZiAoIShjb250ZXh0U3RhY2tDdXJzb3IuY3VycmVudCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0KSkge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJVbmV4cGVjdGVkIGNvbnRleHQgZm91bmQgb24gc3RhY2suIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCBmaWJlcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgdHlwZSwgcGFyZW50Q29udGV4dCkge1xuICB7XG4gICAgdmFyIGluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgIHZhciBjaGlsZENvbnRleHRUeXBlcyA9IHR5cGUuY2hpbGRDb250ZXh0VHlwZXM7IC8vIFRPRE8gKGJ2YXVnaG4pIFJlcGxhY2UgdGhpcyBiZWhhdmlvciB3aXRoIGFuIGludmFyaWFudCgpIGluIHRoZSBmdXR1cmUuXG4gICAgLy8gSXQgaGFzIG9ubHkgYmVlbiBhZGRlZCBpbiBGaWJlciB0byBtYXRjaCB0aGUgKHVuaW50ZW50aW9uYWwpIGJlaGF2aW9yIGluIFN0YWNrLlxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJztcblxuICAgICAgICBpZiAoIXdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHdhcm5lZEFib3V0TWlzc2luZ0dldENoaWxkQ29udGV4dFtjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcignJXMuY2hpbGRDb250ZXh0VHlwZXMgaXMgc3BlY2lmaWVkIGJ1dCB0aGVyZSBpcyBubyBnZXRDaGlsZENvbnRleHQoKSBtZXRob2QgJyArICdvbiB0aGUgaW5zdGFuY2UuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSBnZXRDaGlsZENvbnRleHQoKSBvbiAlcyBvciByZW1vdmUgJyArICdjaGlsZENvbnRleHRUeXBlcyBmcm9tIGl0LicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJlbnRDb250ZXh0O1xuICAgIH1cblxuICAgIHZhciBjaGlsZENvbnRleHQgPSBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQoKTtcblxuICAgIGZvciAodmFyIGNvbnRleHRLZXkgaW4gY2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoIShjb250ZXh0S2V5IGluIGNoaWxkQ29udGV4dFR5cGVzKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHR5cGUpIHx8ICdVbmtub3duJykgKyBcIi5nZXRDaGlsZENvbnRleHQoKToga2V5IFxcXCJcIiArIGNvbnRleHRLZXkgKyBcIlxcXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB8fCAnVW5rbm93bic7XG4gICAgICBjaGVja1Byb3BUeXBlcyhjaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcsIG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBfYXNzaWduKHt9LCBwYXJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTsgLy8gV2UgcHVzaCB0aGUgY29udGV4dCBhcyBlYXJseSBhcyBwb3NzaWJsZSB0byBlbnN1cmUgc3RhY2sgaW50ZWdyaXR5LlxuICAgIC8vIElmIHRoZSBpbnN0YW5jZSBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIHdpbGwgcHVzaCBudWxsIGF0IGZpcnN0LFxuICAgIC8vIGFuZCByZXBsYWNlIGl0IG9uIHRoZSBzdGFjayBsYXRlciB3aGVuIGludmFsaWRhdGluZyB0aGUgY29udGV4dC5cblxuICAgIHZhciBtZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dCA9IGluc3RhbmNlICYmIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0IHx8IGVtcHR5Q29udGV4dE9iamVjdDsgLy8gUmVtZW1iZXIgdGhlIHBhcmVudCBjb250ZXh0IHNvIHdlIGNhbiBtZXJnZSB3aXRoIGl0IGxhdGVyLlxuICAgIC8vIEluaGVyaXQgdGhlIHBhcmVudCdzIGRpZC1wZXJmb3JtLXdvcmsgdmFsdWUgdG8gYXZvaWQgaW5hZHZlcnRlbnRseSBibG9ja2luZyB1cGRhdGVzLlxuXG4gICAgcHJldmlvdXNDb250ZXh0ID0gY29udGV4dFN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgcHVzaChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCBkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLmN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnZhbGlkYXRlQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCB0eXBlLCBkaWRDaGFuZ2UpIHtcbiAge1xuICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhbiBpbnN0YW5jZSBieSB0aGlzIHBvaW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRpZENoYW5nZSkge1xuICAgICAgLy8gTWVyZ2UgcGFyZW50IGFuZCBvd24gY29udGV4dC5cbiAgICAgIC8vIFNraXAgdGhpcyBpZiB3ZSdyZSBub3QgdXBkYXRpbmcgZHVlIHRvIHNDVS5cbiAgICAgIC8vIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJpbHkgcmVjb21wdXRpbmcgbWVtb2l6ZWQgdmFsdWVzLlxuICAgICAgdmFyIG1lcmdlZENvbnRleHQgPSBwcm9jZXNzQ2hpbGRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB0eXBlLCBwcmV2aW91c0NvbnRleHQpO1xuICAgICAgaW5zdGFuY2UuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQgPSBtZXJnZWRDb250ZXh0OyAvLyBSZXBsYWNlIHRoZSBvbGQgKG9yIGVtcHR5KSBjb250ZXh0IHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gdW53aW5kIHRoZSBjb250ZXh0IGluIHRoZSByZXZlcnNlIG9yZGVyLlxuXG4gICAgICBwb3AoZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgd29ya0luUHJvZ3Jlc3MpOyAvLyBOb3cgcHVzaCB0aGUgbmV3IGNvbnRleHQgYW5kIG1hcmsgdGhhdCBpdCBoYXMgY2hhbmdlZC5cblxuICAgICAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IsIG1lcmdlZENvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHB1c2goZGlkUGVyZm9ybVdvcmtTdGFja0N1cnNvciwgZGlkQ2hhbmdlLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcChkaWRQZXJmb3JtV29ya1N0YWNrQ3Vyc29yLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoKGRpZFBlcmZvcm1Xb3JrU3RhY2tDdXJzb3IsIGRpZENoYW5nZSwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcikge1xuICB7XG4gICAgLy8gQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIHdpdGggcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IG5vdCBzdXJlIGlmIGl0XG4gICAgLy8gbWFrZXMgc2Vuc2UgZWxzZXdoZXJlXG4gICAgaWYgKCEoaXNGaWJlck1vdW50ZWQoZmliZXIpICYmIGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpKSB7XG4gICAgICB7XG4gICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHN1YnRyZWUgcGFyZW50IHRvIGJlIGEgbW91bnRlZCBjbGFzcyBjb21wb25lbnQuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgc3dpdGNoIChub2RlLnRhZykge1xuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIHJldHVybiBub2RlLnN0YXRlTm9kZS5jb250ZXh0O1xuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIENvbXBvbmVudCA9IG5vZGUudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9IHdoaWxlIChub2RlICE9PSBudWxsKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiRm91bmQgdW5leHBlY3RlZCBkZXRhY2hlZCBzdWJ0cmVlIHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgTGVnYWN5Um9vdCA9IDA7XG52YXIgQmxvY2tpbmdSb290ID0gMTtcbnZhciBDb25jdXJyZW50Um9vdCA9IDI7XG5cbnZhciByZW5kZXJlcklEID0gbnVsbDtcbnZhciBpbmplY3RlZEhvb2sgPSBudWxsO1xudmFyIGhhc0xvZ2dlZEVycm9yID0gZmFsc2U7XG52YXIgaXNEZXZUb29sc1ByZXNlbnQgPSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJztcbmZ1bmN0aW9uIGluamVjdEludGVybmFscyhpbnRlcm5hbHMpIHtcbiAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gTm8gRGV2VG9vbHNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaG9vayA9IF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICBpZiAoaG9vay5pc0Rpc2FibGVkKSB7XG4gICAgLy8gVGhpcyBpc24ndCBhIHJlYWwgcHJvcGVydHkgb24gdGhlIGhvb2ssIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIG9wdCBvdXRcbiAgICAvLyBvZiBEZXZUb29scyBpbnRlZ3JhdGlvbiBhbmQgYXNzb2NpYXRlZCB3YXJuaW5ncyBhbmQgbG9ncy5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzM4NzdcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaG9vay5zdXBwb3J0c0ZpYmVyKSB7XG4gICAge1xuICAgICAgZXJyb3IoJ1RoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiBSZWFjdCBEZXZUb29scyBpcyB0b28gb2xkIGFuZCB3aWxsIG5vdCB3b3JrICcgKyAnd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scycpO1xuICAgIH0gLy8gRGV2VG9vbHMgZXhpc3RzLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHN1cHBvcnQgRmliZXIuXG5cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZW5kZXJlcklEID0gaG9vay5pbmplY3QoaW50ZXJuYWxzKTsgLy8gV2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5qZWN0ZWQsIHNvIG5vdyBpdCBpcyBzYWZlIHRvIHNldCB1cCBob29rcy5cblxuICAgIGluamVjdGVkSG9vayA9IGhvb2s7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENhdGNoIGFsbCBlcnJvcnMgYmVjYXVzZSBpdCBpcyB1bnNhZmUgdG8gdGhyb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uLlxuICAgIHtcbiAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzLicsIGVycik7XG4gICAgfVxuICB9IC8vIERldlRvb2xzIGV4aXN0c1xuXG5cbiAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiBvblNjaGVkdWxlUm9vdChyb290LCBjaGlsZHJlbikge1xuICB7XG4gICAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIGNoaWxkcmVuKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoICFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRSb290KHJvb3QsIHByaW9yaXR5TGV2ZWwpIHtcbiAgaWYgKGluamVjdGVkSG9vayAmJiB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBkaWRFcnJvciA9IChyb290LmN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSA9PT0gRGlkQ2FwdHVyZTtcblxuICAgICAgaWYgKGVuYWJsZVByb2ZpbGVyVGltZXIpIHtcbiAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290KHJlbmRlcmVySUQsIHJvb3QsIHByaW9yaXR5TGV2ZWwsIGRpZEVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyUm9vdChyZW5kZXJlcklELCByb290LCB1bmRlZmluZWQsIGRpZEVycm9yKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFoYXNMb2dnZWRFcnJvcikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yID0gdHJ1ZTtcblxuICAgICAgICAgIGVycm9yKCdSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVzJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gb25Db21taXRVbm1vdW50KGZpYmVyKSB7XG4gIGlmIChpbmplY3RlZEhvb2sgJiYgdHlwZW9mIGluamVjdGVkSG9vay5vbkNvbW1pdEZpYmVyVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclVubW91bnQocmVuZGVyZXJJRCwgZmliZXIpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAge1xuICAgICAgICBpZiAoIWhhc0xvZ2dlZEVycm9yKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJXMnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTY2hlZHVsZXJfcnVuV2l0aFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFxuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgICBTY2hlZHVsZXJfc2hvdWxkWWllbGQgPSBTY2hlZHVsZXIudW5zdGFibGVfc2hvdWxkWWllbGQsXG4gICAgU2NoZWR1bGVyX3JlcXVlc3RQYWludCA9IFNjaGVkdWxlci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsXG4gICAgU2NoZWR1bGVyX25vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdyxcbiAgICBTY2hlZHVsZXJfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBTY2hlZHVsZXIudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwsXG4gICAgU2NoZWR1bGVyX0ltbWVkaWF0ZVByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9Vc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxcbiAgICBTY2hlZHVsZXJfTm9ybWFsUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgU2NoZWR1bGVyX0xvd1ByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFxuICAgIFNjaGVkdWxlcl9JZGxlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSWRsZVByaW9yaXR5O1xuXG57XG4gIC8vIFByb3ZpZGUgZXhwbGljaXQgZXJyb3IgbWVzc2FnZSB3aGVuIHByb2R1Y3Rpb24rcHJvZmlsaW5nIGJ1bmRsZSBvZiBlLmcuXG4gIC8vIHJlYWN0LWRvbSBpcyB1c2VkIHdpdGggcHJvZHVjdGlvbiAobm9uLXByb2ZpbGluZykgYnVuZGxlIG9mXG4gIC8vIHNjaGVkdWxlci90cmFjaW5nXG4gIGlmICghKHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYgIT0gbnVsbCAmJiB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgIT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIHJ1biB0aGUgcHJvZmlsaW5nIHZlcnNpb24gb2YgYSByZW5kZXJlciAoZm9yIGV4YW1wbGUsIGByZWFjdC1kb20vcHJvZmlsaW5nYCkgd2l0aG91dCBhbHNvIHJlcGxhY2luZyB0aGUgYHNjaGVkdWxlci90cmFjaW5nYCBtb2R1bGUgd2l0aCBgc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nYC4gWW91ciBidW5kbGVyIG1pZ2h0IGhhdmUgYSBzZXR0aW5nIGZvciBhbGlhc2luZyBib3RoIG1vZHVsZXMuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Byb2ZpbGluZ1wiICk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlQ2FsbGJhY2tOb2RlID0ge307IC8vIEV4Y2VwdCBmb3IgTm9Qcmlvcml0eSwgdGhlc2UgY29ycmVzcG9uZCB0byBTY2hlZHVsZXIgcHJpb3JpdGllcy4gV2UgdXNlXG4vLyBhc2NlbmRpbmcgbnVtYmVycyBzbyB3ZSBjYW4gY29tcGFyZSB0aGVtIGxpa2UgbnVtYmVycy4gVGhleSBzdGFydCBhdCA5MCB0b1xuLy8gYXZvaWQgY2xhc2hpbmcgd2l0aCBTY2hlZHVsZXIncyBwcmlvcml0aWVzLlxuXG52YXIgSW1tZWRpYXRlUHJpb3JpdHkkMSA9IDk5O1xudmFyIFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgPSA5ODtcbnZhciBOb3JtYWxQcmlvcml0eSQxID0gOTc7XG52YXIgTG93UHJpb3JpdHkkMSA9IDk2O1xudmFyIElkbGVQcmlvcml0eSQxID0gOTU7IC8vIE5vUHJpb3JpdHkgaXMgdGhlIGFic2VuY2Ugb2YgcHJpb3JpdHkuIEFsc28gUmVhY3Qtb25seS5cblxudmFyIE5vUHJpb3JpdHkkMSA9IDkwO1xudmFyIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyX3Nob3VsZFlpZWxkO1xudmFyIHJlcXVlc3RQYWludCA9IC8vIEZhbGwgYmFjayBncmFjZWZ1bGx5IGlmIHdlJ3JlIHJ1bm5pbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiBTY2hlZHVsZXIuXG5TY2hlZHVsZXJfcmVxdWVzdFBhaW50ICE9PSB1bmRlZmluZWQgPyBTY2hlZHVsZXJfcmVxdWVzdFBhaW50IDogZnVuY3Rpb24gKCkge307XG52YXIgc3luY1F1ZXVlID0gbnVsbDtcbnZhciBpbW1lZGlhdGVRdWV1ZUNhbGxiYWNrTm9kZSA9IG51bGw7XG52YXIgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xudmFyIGluaXRpYWxUaW1lTXMkMSA9IFNjaGVkdWxlcl9ub3ckMSgpOyAvLyBJZiB0aGUgaW5pdGlhbCB0aW1lc3RhbXAgaXMgcmVhc29uYWJseSBzbWFsbCwgdXNlIFNjaGVkdWxlcidzIGBub3dgIGRpcmVjdGx5LlxuLy8gVGhpcyB3aWxsIGJlIHRoZSBjYXNlIGZvciBtb2Rlcm4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IGBwZXJmb3JtYW5jZS5ub3dgLiBJblxuLy8gb2xkZXIgYnJvd3NlcnMsIFNjaGVkdWxlciBmYWxscyBiYWNrIHRvIGBEYXRlLm5vd2AsIHdoaWNoIHJldHVybnMgYSBVbml4XG4vLyB0aW1lc3RhbXAuIEluIHRoYXQgY2FzZSwgc3VidHJhY3QgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lIHRvIHNpbXVsYXRlXG4vLyB0aGUgYmVoYXZpb3Igb2YgcGVyZm9ybWFuY2Uubm93IGFuZCBrZWVwIG91ciB0aW1lcyBzbWFsbCBlbm91Z2ggdG8gZml0XG4vLyB3aXRoaW4gMzIgYml0cy5cbi8vIFRPRE86IENvbnNpZGVyIGxpZnRpbmcgdGhpcyBpbnRvIFNjaGVkdWxlci5cblxudmFyIG5vdyA9IGluaXRpYWxUaW1lTXMkMSA8IDEwMDAwID8gU2NoZWR1bGVyX25vdyQxIDogZnVuY3Rpb24gKCkge1xuICByZXR1cm4gU2NoZWR1bGVyX25vdyQxKCkgLSBpbml0aWFsVGltZU1zJDE7XG59O1xuZnVuY3Rpb24gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHN3aXRjaCAoU2NoZWR1bGVyX2dldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICBjYXNlIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTpcbiAgICAgIHJldHVybiBJbW1lZGlhdGVQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk6XG4gICAgICByZXR1cm4gVXNlckJsb2NraW5nUHJpb3JpdHkkMjtcblxuICAgIGNhc2UgU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5OlxuICAgICAgcmV0dXJuIE5vcm1hbFByaW9yaXR5JDE7XG5cbiAgICBjYXNlIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTpcbiAgICAgIHJldHVybiBMb3dQcmlvcml0eSQxO1xuXG4gICAgY2FzZSBTY2hlZHVsZXJfSWRsZVByaW9yaXR5OlxuICAgICAgcmV0dXJuIElkbGVQcmlvcml0eSQxO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcHJpb3JpdHkgbGV2ZWwuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhY3RQcmlvcml0eVRvU2NoZWR1bGVyUHJpb3JpdHkocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gIHN3aXRjaCAocmVhY3RQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eTtcblxuICAgIGNhc2UgVXNlckJsb2NraW5nUHJpb3JpdHkkMjpcbiAgICAgIHJldHVybiBTY2hlZHVsZXJfVXNlckJsb2NraW5nUHJpb3JpdHk7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX05vcm1hbFByaW9yaXR5O1xuXG4gICAgY2FzZSBMb3dQcmlvcml0eSQxOlxuICAgICAgcmV0dXJuIFNjaGVkdWxlcl9Mb3dQcmlvcml0eTtcblxuICAgIGNhc2UgSWRsZVByaW9yaXR5JDE6XG4gICAgICByZXR1cm4gU2NoZWR1bGVyX0lkbGVQcmlvcml0eTtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmtub3duIHByaW9yaXR5IGxldmVsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQxKHJlYWN0UHJpb3JpdHlMZXZlbCwgZm4pIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3J1bldpdGhQcmlvcml0eShwcmlvcml0eUxldmVsLCBmbik7XG59XG5mdW5jdGlvbiBzY2hlZHVsZUNhbGxiYWNrKHJlYWN0UHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSByZWFjdFByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShyZWFjdFByaW9yaXR5TGV2ZWwpO1xuICByZXR1cm4gU2NoZWR1bGVyX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gc2NoZWR1bGVTeW5jQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgLy8gUHVzaCB0aGlzIGNhbGxiYWNrIGludG8gYW4gaW50ZXJuYWwgcXVldWUuIFdlJ2xsIGZsdXNoIHRoZXNlIGVpdGhlciBpblxuICAvLyB0aGUgbmV4dCB0aWNrLCBvciBlYXJsaWVyIGlmIHNvbWV0aGluZyBjYWxscyBgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZWAuXG4gIGlmIChzeW5jUXVldWUgPT09IG51bGwpIHtcbiAgICBzeW5jUXVldWUgPSBbY2FsbGJhY2tdOyAvLyBGbHVzaCB0aGUgcXVldWUgaW4gdGhlIG5leHQgdGljaywgYXQgdGhlIGVhcmxpZXN0LlxuXG4gICAgaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgPSBTY2hlZHVsZXJfc2NoZWR1bGVDYWxsYmFjayhTY2hlZHVsZXJfSW1tZWRpYXRlUHJpb3JpdHksIGZsdXNoU3luY0NhbGxiYWNrUXVldWVJbXBsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBQdXNoIG9udG8gZXhpc3RpbmcgcXVldWUuIERvbid0IG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFjayBiZWNhdXNlXG4gICAgLy8gd2UgYWxyZWFkeSBzY2hlZHVsZWQgb25lIHdoZW4gd2UgY3JlYXRlZCB0aGUgcXVldWUuXG4gICAgc3luY1F1ZXVlLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgcmV0dXJuIGZha2VDYWxsYmFja05vZGU7XG59XG5mdW5jdGlvbiBjYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpIHtcbiAgaWYgKGNhbGxiYWNrTm9kZSAhPT0gZmFrZUNhbGxiYWNrTm9kZSkge1xuICAgIFNjaGVkdWxlcl9jYW5jZWxDYWxsYmFjayhjYWxsYmFja05vZGUpO1xuICB9XG59XG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCkge1xuICBpZiAoaW1tZWRpYXRlUXVldWVDYWxsYmFja05vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgbm9kZSA9IGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlO1xuICAgIGltbWVkaWF0ZVF1ZXVlQ2FsbGJhY2tOb2RlID0gbnVsbDtcbiAgICBTY2hlZHVsZXJfY2FuY2VsQ2FsbGJhY2sobm9kZSk7XG4gIH1cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlSW1wbCgpIHtcbiAgaWYgKCFpc0ZsdXNoaW5nU3luY1F1ZXVlICYmIHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFByZXZlbnQgcmUtZW50cmFuY3kuXG4gICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IHRydWU7XG4gICAgdmFyIGkgPSAwO1xuXG4gICAge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIF9pc1N5bmMyID0gdHJ1ZTtcbiAgICAgICAgdmFyIF9xdWV1ZSA9IHN5bmNRdWV1ZTtcbiAgICAgICAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAoOyBpIDwgX3F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2FsbGJhY2sgPSBfcXVldWVbaV07XG5cbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjYWxsYmFjayhfaXNTeW5jMik7XG4gICAgICAgICAgICB9IHdoaWxlIChjYWxsYmFjayAhPT0gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgc3luY1F1ZXVlID0gbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHNvbWV0aGluZyB0aHJvd3MsIGxlYXZlIHRoZSByZW1haW5pbmcgY2FsbGJhY2tzIG9uIHRoZSBxdWV1ZS5cbiAgICAgICAgaWYgKHN5bmNRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHN5bmNRdWV1ZSA9IHN5bmNRdWV1ZS5zbGljZShpICsgMSk7XG4gICAgICAgIH0gLy8gUmVzdW1lIGZsdXNoaW5nIGluIHRoZSBuZXh0IHRpY2tcblxuXG4gICAgICAgIFNjaGVkdWxlcl9zY2hlZHVsZUNhbGxiYWNrKFNjaGVkdWxlcl9JbW1lZGlhdGVQcmlvcml0eSwgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNGbHVzaGluZ1N5bmNRdWV1ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxudmFyIE5vTW9kZSA9IDA7XG52YXIgU3RyaWN0TW9kZSA9IDE7IC8vIFRPRE86IFJlbW92ZSBCbG9ja2luZ01vZGUgYW5kIENvbmN1cnJlbnRNb2RlIGJ5IHJlYWRpbmcgZnJvbSB0aGUgcm9vdFxuLy8gdGFnIGluc3RlYWRcblxudmFyIEJsb2NraW5nTW9kZSA9IDI7XG52YXIgQ29uY3VycmVudE1vZGUgPSA0O1xudmFyIFByb2ZpbGVNb2RlID0gODtcbnZhciBEZWJ1Z1RyYWNpbmdNb2RlID0gMTY7XG5cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO1xudmFyIE5vVHJhbnNpdGlvbiA9IDA7XG5mdW5jdGlvbiByZXF1ZXN0Q3VycmVudFRyYW5zaXRpb24oKSB7XG4gIHJldHVybiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZy50cmFuc2l0aW9uO1xufVxuXG52YXIgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoZmliZXIsIGluc3RhbmNlKSB7fSxcbiAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge30sXG4gIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxufTtcblxue1xuICB2YXIgZmluZFN0cmljdFJvb3QgPSBmdW5jdGlvbiAoZmliZXIpIHtcbiAgICB2YXIgbWF5YmVTdHJpY3RSb290ID0gbnVsbDtcbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIG1heWJlU3RyaWN0Um9vdCA9IG5vZGU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF5YmVTdHJpY3RSb290O1xuICB9O1xuXG4gIHZhciBzZXRUb1NvcnRlZFN0cmluZyA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgICB2YXIgYXJyYXkgPSBbXTtcbiAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGFycmF5LnB1c2godmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbignLCAnKTtcbiAgfTtcblxuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gIHZhciBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICB2YXIgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTsgLy8gVHJhY2tzIGNvbXBvbmVudHMgd2UgaGF2ZSBhbHJlYWR5IHdhcm5lZCBhYm91dC5cblxuICB2YXIgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcyA9IG5ldyBTZXQoKTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uIChmaWJlciwgaW5zdGFuY2UpIHtcbiAgICAvLyBEZWR1cCBzdHJhdGVneTogV2FybiBvbmNlIHBlciBjb21wb25lbnQuXG4gICAgaWYgKGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicgJiYgLy8gRG9uJ3Qgd2FybiBhYm91dCByZWFjdC1saWZlY3ljbGVzLWNvbXBhdCBwb2x5ZmlsbGVkIGNvbXBvbmVudHMuXG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmcgIT09IHRydWUpIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MucHVzaChmaWJlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUgJiYgdHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cblxuICAgIGlmIChmaWJlci5tb2RlICYgU3RyaWN0TW9kZSAmJiB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLnB1c2goZmliZXIpO1xuICAgIH1cbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBXZSBkbyBhbiBpbml0aWFsIHBhc3MgdG8gZ2F0aGVyIGNvbXBvbmVudCBuYW1lc1xuICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIGNvbXBvbmVudFdpbGxNb3VudFVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIH1cblxuICAgIHZhciBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG5cbiAgICBpZiAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgfVxuXG4gICAgdmFyIGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICB9XG5cbiAgICB2YXIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcblxuICAgIGlmIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLmFkZChnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICB9KTtcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgfSAvLyBGaW5hbGx5LCB3ZSBmbHVzaCBhbGwgdGhlIHdhcm5pbmdzXG4gICAgLy8gVU5TQUZFXyBvbmVzIGJlZm9yZSB0aGUgZGVwcmVjYXRlZCBvbmVzLCBzaW5jZSB0aGV5J2xsIGJlICdsb3VkZXInXG5cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50VW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIGVycm9yKCdVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgbWF5IGluZGljYXRlIGJ1Z3MgaW4geW91ciBjb2RlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBzb3J0ZWROYW1lcyk7XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSA+IDApIHtcbiAgICAgIHZhciBfc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzKTtcblxuICAgICAgZXJyb3IoJ1VzaW5nIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGluIHN0cmljdCBtb2RlIGlzIG5vdCByZWNvbW1lbmRlZCAnICsgJ2FuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuJyArIFwiKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCBcIiArICdyZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byAnICsgJ3N0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9kZXJpdmVkLXN0YXRlXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMpO1xuICAgIH1cblxuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzMiA9IHNldFRvU29ydGVkU3RyaW5nKFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICBlcnJvcignVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkICcgKyAnYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczIpO1xuICAgIH1cblxuICAgIGlmIChjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxNb3VudCBoYXMgYmVlbiByZW5hbWVkLCBhbmQgaXMgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICcgKyAnU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuJyArICcqIE1vdmUgY29kZSB3aXRoIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRNb3VudCwgYW5kIHNldCBpbml0aWFsIHN0YXRlIGluIHRoZSBjb25zdHJ1Y3Rvci5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxNb3VudCB0byBVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IHRvIHN1cHByZXNzICcgKyAndGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gJyArICdUbyByZW5hbWUgYWxsIGRlcHJlY2F0ZWQgbGlmZWN5Y2xlcyB0byB0aGVpciBuZXcgbmFtZXMsIHlvdSBjYW4gcnVuICcgKyAnYG5weCByZWFjdC1jb2RlbW9kIHJlbmFtZS11bnNhZmUtbGlmZWN5Y2xlc2AgaW4geW91ciBwcm9qZWN0IHNvdXJjZSBmb2xkZXIuXFxuJyArICdcXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXMnLCBfc29ydGVkTmFtZXMzKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLnNpemUgPiAwKSB7XG4gICAgICB2YXIgX3NvcnRlZE5hbWVzNCA9IHNldFRvU29ydGVkU3RyaW5nKGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyk7XG5cbiAgICAgIHdhcm4oJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAnICsgJ1NlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbicgKyAnKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbicgKyBcIiogSWYgeW91J3JlIHVwZGF0aW5nIHN0YXRlIHdoZW5ldmVyIHByb3BzIGNoYW5nZSwgcmVmYWN0b3IgeW91ciBcIiArICdjb2RlIHRvIHVzZSBtZW1vaXphdGlvbiB0ZWNobmlxdWVzIG9yIG1vdmUgaXQgdG8gJyArICdzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvZGVyaXZlZC1zdGF0ZVxcbicgKyAnKiBSZW5hbWUgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyB0byBzdXBwcmVzcyAnICsgJ3RoaXMgd2FybmluZyBpbiBub24tc3RyaWN0IG1vZGUuIEluIFJlYWN0IDE4LngsIG9ubHkgdGhlIFVOU0FGRV8gbmFtZSB3aWxsIHdvcmsuICcgKyAnVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biAnICsgJ2BucHggcmVhY3QtY29kZW1vZCByZW5hbWUtdW5zYWZlLWxpZmVjeWNsZXNgIGluIHlvdXIgcHJvamVjdCBzb3VyY2UgZm9sZGVyLlxcbicgKyAnXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzJywgX3NvcnRlZE5hbWVzNCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5zaXplID4gMCkge1xuICAgICAgdmFyIF9zb3J0ZWROYW1lczUgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMpO1xuXG4gICAgICB3YXJuKCdjb21wb25lbnRXaWxsVXBkYXRlIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gJyArICdTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4nICsgJyogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4nICsgJyogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgJyArICd0aGlzIHdhcm5pbmcgaW4gbm9uLXN0cmljdCBtb2RlLiBJbiBSZWFjdCAxOC54LCBvbmx5IHRoZSBVTlNBRkVfIG5hbWUgd2lsbCB3b3JrLiAnICsgJ1RvIHJlbmFtZSBhbGwgZGVwcmVjYXRlZCBsaWZlY3ljbGVzIHRvIHRoZWlyIG5ldyBuYW1lcywgeW91IGNhbiBydW4gJyArICdgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG4nICsgJ1xcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycsIF9zb3J0ZWROYW1lczUpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGVuZGluZ0xlZ2FjeUNvbnRleHRXYXJuaW5nID0gbmV3IE1hcCgpOyAvLyBUcmFja3MgY29tcG9uZW50cyB3ZSBoYXZlIGFscmVhZHkgd2FybmVkIGFib3V0LlxuXG4gIHZhciBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuXG4gIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKGZpYmVyLCBpbnN0YW5jZSkge1xuICAgIHZhciBzdHJpY3RSb290ID0gZmluZFN0cmljdFJvb3QoZmliZXIpO1xuXG4gICAgaWYgKHN0cmljdFJvb3QgPT09IG51bGwpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiAnICsgJ1RoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIERlZHVwIHN0cmF0ZWd5OiBXYXJuIG9uY2UgcGVyIGNvbXBvbmVudC5cblxuXG4gICAgaWYgKGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuaGFzKGZpYmVyLnR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHdhcm5pbmdzRm9yUm9vdCA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCk7XG5cbiAgICBpZiAoZmliZXIudHlwZS5jb250ZXh0VHlwZXMgIT0gbnVsbCB8fCBmaWJlci50eXBlLmNoaWxkQ29udGV4dFR5cGVzICE9IG51bGwgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHdhcm5pbmdzRm9yUm9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdhcm5pbmdzRm9yUm9vdCA9IFtdO1xuICAgICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIHdhcm5pbmdzRm9yUm9vdCk7XG4gICAgICB9XG5cbiAgICAgIHdhcm5pbmdzRm9yUm9vdC5wdXNoKGZpYmVyKTtcbiAgICB9XG4gIH07XG5cbiAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MuZmx1c2hMZWdhY3lDb250ZXh0V2FybmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSwgc3RyaWN0Um9vdCkge1xuICAgICAgaWYgKGZpYmVyQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpcnN0RmliZXIgPSBmaWJlckFycmF5WzBdO1xuICAgICAgdmFyIHVuaXF1ZU5hbWVzID0gbmV3IFNldCgpO1xuICAgICAgZmliZXJBcnJheS5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUNvbnRleHQuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgfSk7XG4gICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaXJzdEZpYmVyKTtcblxuICAgICAgICBlcnJvcignTGVnYWN5IGNvbnRleHQgQVBJIGhhcyBiZWVuIGRldGVjdGVkIHdpdGhpbiBhIHN0cmljdC1tb2RlIHRyZWUuJyArICdcXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyAnICsgJ3VzaW5nIGl0IHNob3VsZCBtaWdyYXRlIHRvIHRoZSBuZXcgdmVyc2lvbi4nICsgJ1xcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlcycgKyAnXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2xlZ2FjeS1jb250ZXh0Jywgc29ydGVkTmFtZXMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdO1xuICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW107XG4gICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgaWYgKENvbXBvbmVudCAmJiBDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzLiBUYWtlbiBmcm9tIFJlYWN0RWxlbWVudFxuICAgIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGJhc2VQcm9wcyk7XG5cbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcztcblxuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGJhc2VQcm9wcztcbn1cblxuLy8gTWF4IDMxIGJpdCBpbnRlZ2VyLiBUaGUgbWF4IGludGVnZXIgc2l6ZSBpbiBWOCBmb3IgMzItYml0IHN5c3RlbXMuXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxudmFyIE1BWF9TSUdORURfMzFfQklUX0lOVCA9IDEwNzM3NDE4MjM7XG5cbnZhciB2YWx1ZUN1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbnZhciByZW5kZXJlclNpZ2lsO1xuXG57XG4gIC8vIFVzZSB0aGlzIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgY29udGV4dFxuICByZW5kZXJlclNpZ2lsID0ge307XG59XG5cbnZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG52YXIgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbnVsbDtcbnZhciBsYXN0Q29udGV4dFdpdGhBbGxCaXRzT2JzZXJ2ZWQgPSBudWxsO1xudmFyIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbmZ1bmN0aW9uIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpIHtcbiAgLy8gVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIFJlYWN0IHlpZWxkcyBleGVjdXRpb24sIHRvIGVuc3VyZSBgcmVhZENvbnRleHRgXG4gIC8vIGNhbm5vdCBiZSBjYWxsZWQgb3V0c2lkZSB0aGUgcmVuZGVyIHBoYXNlLlxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9IG51bGw7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG5cbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpIHtcbiAge1xuICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSB0cnVlO1xuICB9XG59XG5mdW5jdGlvbiBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKSB7XG4gIHtcbiAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gZmFsc2U7XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBuZXh0VmFsdWUpIHtcbiAgdmFyIGNvbnRleHQgPSBwcm92aWRlckZpYmVyLnR5cGUuX2NvbnRleHQ7XG5cbiAge1xuICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gbmV4dFZhbHVlO1xuXG4gICAge1xuICAgICAgaWYgKGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gbnVsbCAmJiBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgIT09IHJlbmRlcmVyU2lnaWwpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBwb3BQcm92aWRlcihwcm92aWRlckZpYmVyKSB7XG4gIHZhciBjdXJyZW50VmFsdWUgPSB2YWx1ZUN1cnNvci5jdXJyZW50O1xuICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyRmliZXIudHlwZS5fY29udGV4dDtcblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVDaGFuZ2VkQml0cyhjb250ZXh0LCBuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcbiAgaWYgKG9iamVjdElzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAvLyBObyBjaGFuZ2VcbiAgICByZXR1cm4gMDtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY2hhbmdlZEJpdHMgPSB0eXBlb2YgY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHMgPT09ICdmdW5jdGlvbicgPyBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0cyhvbGRWYWx1ZSwgbmV3VmFsdWUpIDogTUFYX1NJR05FRF8zMV9CSVRfSU5UO1xuXG4gICAge1xuICAgICAgaWYgKChjaGFuZ2VkQml0cyAmIE1BWF9TSUdORURfMzFfQklUX0lOVCkgIT09IGNoYW5nZWRCaXRzKSB7XG4gICAgICAgIGVycm9yKCdjYWxjdWxhdGVDaGFuZ2VkQml0czogRXhwZWN0ZWQgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhICcgKyAnMzEtYml0IGludGVnZXIuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkQml0cyB8IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIHNjaGVkdWxlV29ya09uUGFyZW50UGF0aChwYXJlbnQsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFVwZGF0ZSB0aGUgY2hpbGQgbGFuZXMgb2YgYWxsIHRoZSBhbmNlc3RvcnMsIGluY2x1ZGluZyB0aGUgYWx0ZXJuYXRlcy5cbiAgdmFyIG5vZGUgPSBwYXJlbnQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICB2YXIgYWx0ZXJuYXRlID0gbm9kZS5hbHRlcm5hdGU7XG5cbiAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgICAgbm9kZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhub2RlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuY2hpbGRMYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCAmJiAhaXNTdWJzZXRPZkxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgIGFsdGVybmF0ZS5jaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUuY2hpbGRMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZWl0aGVyIGFsdGVybmF0ZSB3YXMgdXBkYXRlZCwgd2hpY2ggbWVhbnMgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAvLyBhbmNlc3RvciBwYXRoIGFscmVhZHkgaGFzIHN1ZmZpY2llbnQgcHJpb3JpdHkuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIGNvbnRleHQsIGNoYW5nZWRCaXRzLCByZW5kZXJMYW5lcykge1xuICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICBpZiAoZmliZXIgIT09IG51bGwpIHtcbiAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICBmaWJlci5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgfVxuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIHZhciBuZXh0RmliZXIgPSB2b2lkIDA7IC8vIFZpc2l0IHRoaXMgZmliZXIuXG5cbiAgICB2YXIgbGlzdCA9IGZpYmVyLmRlcGVuZGVuY2llcztcblxuICAgIGlmIChsaXN0ICE9PSBudWxsKSB7XG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgIHZhciBkZXBlbmRlbmN5ID0gbGlzdC5maXJzdENvbnRleHQ7XG5cbiAgICAgIHdoaWxlIChkZXBlbmRlbmN5ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZXh0IG1hdGNoZXMuXG4gICAgICAgIGlmIChkZXBlbmRlbmN5LmNvbnRleHQgPT09IGNvbnRleHQgJiYgKGRlcGVuZGVuY3kub2JzZXJ2ZWRCaXRzICYgY2hhbmdlZEJpdHMpICE9PSAwKSB7XG4gICAgICAgICAgLy8gTWF0Y2ghIFNjaGVkdWxlIGFuIHVwZGF0ZSBvbiB0aGlzIGZpYmVyLlxuICAgICAgICAgIGlmIChmaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAvLyBTY2hlZHVsZSBhIGZvcmNlIHVwZGF0ZSBvbiB0aGUgd29yay1pbi1wcm9ncmVzcy5cbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoTm9UaW1lc3RhbXAsIHBpY2tBcmJpdHJhcnlMYW5lKHJlbmRlckxhbmVzKSk7XG4gICAgICAgICAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7IC8vIFRPRE86IEJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhIHdvcmstaW4tcHJvZ3Jlc3MsIHRoaXMgd2lsbCBhZGQgdGhlXG4gICAgICAgICAgICAvLyB1cGRhdGUgdG8gdGhlIGN1cnJlbnQgZmliZXIsIHRvbywgd2hpY2ggbWVhbnMgaXQgd2lsbCBwZXJzaXN0IGV2ZW4gaWZcbiAgICAgICAgICAgIC8vIHRoaXMgcmVuZGVyIGlzIHRocm93biBhd2F5LiBTaW5jZSBpdCdzIGEgcmFjZSBjb25kaXRpb24sIG5vdCBzdXJlIGl0J3NcbiAgICAgICAgICAgIC8vIHdvcnRoIGZpeGluZy5cblxuICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmaWJlci5sYW5lcyA9IG1lcmdlTGFuZXMoZmliZXIubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7IC8vIE1hcmsgdGhlIHVwZGF0ZWQgbGFuZXMgb24gdGhlIGxpc3QsIHRvby5cblxuICAgICAgICAgIGxpc3QubGFuZXMgPSBtZXJnZUxhbmVzKGxpc3QubGFuZXMsIHJlbmRlckxhbmVzKTsgLy8gU2luY2Ugd2UgYWxyZWFkeSBmb3VuZCBhIG1hdGNoLCB3ZSBjYW4gc3RvcCB0cmF2ZXJzaW5nIHRoZVxuICAgICAgICAgIC8vIGRlcGVuZGVuY3kgbGlzdC5cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3kubmV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ29udGV4dFByb3ZpZGVyKSB7XG4gICAgICAvLyBEb24ndCBzY2FuIGRlZXBlciBpZiB0aGlzIGlzIGEgbWF0Y2hpbmcgcHJvdmlkZXJcbiAgICAgIG5leHRGaWJlciA9IGZpYmVyLnR5cGUgPT09IHdvcmtJblByb2dyZXNzLnR5cGUgPyBudWxsIDogZmliZXIuY2hpbGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRyYXZlcnNlIGRvd24uXG4gICAgICBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICB9XG5cbiAgICBpZiAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBjaGlsZCB0byB0aGUgd29yay1pbi1wcm9ncmVzcyBmaWJlci5cbiAgICAgIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gY2hpbGQuIFRyYXZlcnNlIHRvIG5leHQgc2libGluZy5cbiAgICAgIG5leHRGaWJlciA9IGZpYmVyO1xuXG4gICAgICB3aGlsZSAobmV4dEZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChuZXh0RmliZXIgPT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgICAgLy8gV2UncmUgYmFjayB0byB0aGUgcm9vdCBvZiB0aGlzIHN1YnRyZWUuIEV4aXQuXG4gICAgICAgICAgbmV4dEZpYmVyID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzaWJsaW5nID0gbmV4dEZpYmVyLnNpYmxpbmc7XG5cbiAgICAgICAgaWYgKHNpYmxpbmcgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBTZXQgdGhlIHJldHVybiBwb2ludGVyIG9mIHRoZSBzaWJsaW5nIHRvIHRoZSB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuICAgICAgICAgIHNpYmxpbmcucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICBuZXh0RmliZXIgPSBzaWJsaW5nO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IC8vIE5vIG1vcmUgc2libGluZ3MuIFRyYXZlcnNlIHVwLlxuXG5cbiAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmaWJlciA9IG5leHRGaWJlcjtcbiAgfVxufVxuZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IG51bGw7XG4gIHZhciBkZXBlbmRlbmNpZXMgPSB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKGRlcGVuZGVuY2llcyAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdENvbnRleHQgPSBkZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0O1xuXG4gICAgaWYgKGZpcnN0Q29udGV4dCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUoZGVwZW5kZW5jaWVzLmxhbmVzLCByZW5kZXJMYW5lcykpIHtcbiAgICAgICAgLy8gQ29udGV4dCBsaXN0IGhhcyBhIHBlbmRpbmcgdXBkYXRlLiBNYXJrIHRoYXQgdGhpcyBmaWJlciBwZXJmb3JtZWQgd29yay5cbiAgICAgICAgbWFya1dvcmtJblByb2dyZXNzUmVjZWl2ZWRVcGRhdGUoKTtcbiAgICAgIH0gLy8gUmVzZXQgdGhlIHdvcmstaW4tcHJvZ3Jlc3MgbGlzdFxuXG5cbiAgICAgIGRlcGVuZGVuY2llcy5maXJzdENvbnRleHQgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gIHtcbiAgICAvLyBUaGlzIHdhcm5pbmcgd291bGQgZmlyZSBpZiB5b3UgcmVhZCBjb250ZXh0IGluc2lkZSBhIEhvb2sgbGlrZSB1c2VNZW1vLlxuICAgIC8vIFVubGlrZSB0aGUgY2xhc3MgY2hlY2sgYmVsb3csIGl0J3Mgbm90IGVuZm9yY2VkIGluIHByb2R1Y3Rpb24gZm9yIHBlcmYuXG4gICAgaWYgKGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYpIHtcbiAgICAgIGVycm9yKCdDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiAnICsgJ0luIGNsYXNzZXMsIHlvdSBjYW4gcmVhZCBpdCBpbiB0aGUgcmVuZGVyIG1ldGhvZCBvciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuICcgKyAnSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90ICcgKyAnaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAobGFzdENvbnRleHRXaXRoQWxsQml0c09ic2VydmVkID09PSBjb250ZXh0KSA7IGVsc2UgaWYgKG9ic2VydmVkQml0cyA9PT0gZmFsc2UgfHwgb2JzZXJ2ZWRCaXRzID09PSAwKSA7IGVsc2Uge1xuICAgIHZhciByZXNvbHZlZE9ic2VydmVkQml0czsgLy8gQXZvaWQgZGVvcHRpbmcgb24gb2JzZXJ2YWJsZSBhcmd1bWVudHMgb3IgaGV0ZXJvZ2VuZW91cyB0eXBlcy5cblxuICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZWRCaXRzICE9PSAnbnVtYmVyJyB8fCBvYnNlcnZlZEJpdHMgPT09IE1BWF9TSUdORURfMzFfQklUX0lOVCkge1xuICAgICAgLy8gT2JzZXJ2ZSBhbGwgdXBkYXRlcy5cbiAgICAgIGxhc3RDb250ZXh0V2l0aEFsbEJpdHNPYnNlcnZlZCA9IGNvbnRleHQ7XG4gICAgICByZXNvbHZlZE9ic2VydmVkQml0cyA9IE1BWF9TSUdORURfMzFfQklUX0lOVDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzb2x2ZWRPYnNlcnZlZEJpdHMgPSBvYnNlcnZlZEJpdHM7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHRJdGVtID0ge1xuICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIG9ic2VydmVkQml0czogcmVzb2x2ZWRPYnNlcnZlZEJpdHMsXG4gICAgICBuZXh0OiBudWxsXG4gICAgfTtcblxuICAgIGlmIChsYXN0Q29udGV4dERlcGVuZGVuY3kgPT09IG51bGwpIHtcbiAgICAgIGlmICghKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90IGluc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCBkZXBlbmRlbmN5IGZvciB0aGlzIGNvbXBvbmVudC4gQ3JlYXRlIGEgbmV3IGxpc3QuXG5cblxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY29udGV4dEl0ZW07XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgIGxhbmVzOiBOb0xhbmVzLFxuICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHRJdGVtLFxuICAgICAgICByZXNwb25kZXJzOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBcHBlbmQgYSBuZXcgY29udGV4dCBpdGVtLlxuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0SXRlbTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA7XG59XG5cbnZhciBVcGRhdGVTdGF0ZSA9IDA7XG52YXIgUmVwbGFjZVN0YXRlID0gMTtcbnZhciBGb3JjZVVwZGF0ZSA9IDI7XG52YXIgQ2FwdHVyZVVwZGF0ZSA9IDM7IC8vIEdsb2JhbCBzdGF0ZSB0aGF0IGlzIHJlc2V0IGF0IHRoZSBiZWdpbm5pbmcgb2YgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYC5cbi8vIEl0IHNob3VsZCBvbmx5IGJlIHJlYWQgcmlnaHQgYWZ0ZXIgY2FsbGluZyBgcHJvY2Vzc1VwZGF0ZVF1ZXVlYCwgdmlhXG4vLyBgY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZ2AuXG5cbnZhciBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGU7XG52YXIgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlO1xuXG57XG4gIGRpZFdhcm5VcGRhdGVJbnNpZGVVcGRhdGUgPSBmYWxzZTtcbiAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gIHZhciBxdWV1ZSA9IHtcbiAgICBiYXNlU3RhdGU6IGZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgZmlyc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgIHNoYXJlZDoge1xuICAgICAgcGVuZGluZzogbnVsbFxuICAgIH0sXG4gICAgZWZmZWN0czogbnVsbFxuICB9O1xuICBmaWJlci51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xufVxuZnVuY3Rpb24gY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAvLyBDbG9uZSB0aGUgdXBkYXRlIHF1ZXVlIGZyb20gY3VycmVudC4gVW5sZXNzIGl0J3MgYWxyZWFkeSBhIGNsb25lLlxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgaWYgKHF1ZXVlID09PSBjdXJyZW50UXVldWUpIHtcbiAgICB2YXIgY2xvbmUgPSB7XG4gICAgICBiYXNlU3RhdGU6IGN1cnJlbnRRdWV1ZS5iYXNlU3RhdGUsXG4gICAgICBmaXJzdEJhc2VVcGRhdGU6IGN1cnJlbnRRdWV1ZS5maXJzdEJhc2VVcGRhdGUsXG4gICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgc2hhcmVkOiBjdXJyZW50UXVldWUuc2hhcmVkLFxuICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICB9O1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY2xvbmU7XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IHtcbiAgICBldmVudFRpbWU6IGV2ZW50VGltZSxcbiAgICBsYW5lOiBsYW5lLFxuICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgcGF5bG9hZDogbnVsbCxcbiAgICBjYWxsYmFjazogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG4gIHJldHVybiB1cGRhdGU7XG59XG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpIHtcbiAgdmFyIHVwZGF0ZVF1ZXVlID0gZmliZXIudXBkYXRlUXVldWU7XG5cbiAgaWYgKHVwZGF0ZVF1ZXVlID09PSBudWxsKSB7XG4gICAgLy8gT25seSBvY2N1cnMgaWYgdGhlIGZpYmVyIGhhcyBiZWVuIHVubW91bnRlZC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2hhcmVkUXVldWUgPSB1cGRhdGVRdWV1ZS5zaGFyZWQ7XG4gIHZhciBwZW5kaW5nID0gc2hhcmVkUXVldWUucGVuZGluZztcblxuICBpZiAocGVuZGluZyA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZS4gQ3JlYXRlIGEgY2lyY3VsYXIgbGlzdC5cbiAgICB1cGRhdGUubmV4dCA9IHVwZGF0ZTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dDtcbiAgICBwZW5kaW5nLm5leHQgPSB1cGRhdGU7XG4gIH1cblxuICBzaGFyZWRRdWV1ZS5wZW5kaW5nID0gdXBkYXRlO1xuXG4gIHtcbiAgICBpZiAoY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID09PSBzaGFyZWRRdWV1ZSAmJiAhZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSkge1xuICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgJyArICdmcm9tIGluc2lkZSBhbiB1cGRhdGUgZnVuY3Rpb24uIFVwZGF0ZSBmdW5jdGlvbnMgc2hvdWxkIGJlIHB1cmUsICcgKyAnd2l0aCB6ZXJvIHNpZGUtZWZmZWN0cy4gQ29uc2lkZXIgdXNpbmcgY29tcG9uZW50RGlkVXBkYXRlIG9yIGEgJyArICdjYWxsYmFjay4nKTtcblxuICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGNhcHR1cmVkVXBkYXRlKSB7XG4gIC8vIENhcHR1cmVkIHVwZGF0ZXMgYXJlIHVwZGF0ZXMgdGhhdCBhcmUgdGhyb3duIGJ5IGEgY2hpbGQgZHVyaW5nIHRoZSByZW5kZXJcbiAgLy8gcGhhc2UuIFRoZXkgc2hvdWxkIGJlIGRpc2NhcmRlZCBpZiB0aGUgcmVuZGVyIGlzIGFib3J0ZWQuIFRoZXJlZm9yZSxcbiAgLy8gd2Ugc2hvdWxkIG9ubHkgcHV0IHRoZW0gb24gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUsIG5vdCB0aGUgY3VycmVudCBvbmUuXG4gIHZhciBxdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlOyAvLyBDaGVjayBpZiB0aGUgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSBpcyBhIGNsb25lLlxuXG4gIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICBpZiAocXVldWUgPT09IGN1cnJlbnRRdWV1ZSkge1xuICAgICAgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgaXMgdGhlIHNhbWUgYXMgY3VycmVudC4gVGhpcyBoYXBwZW5zIHdoZW5cbiAgICAgIC8vIHdlIGJhaWwgb3V0IG9uIGEgcGFyZW50IGZpYmVyIHRoYXQgdGhlbiBjYXB0dXJlcyBhbiBlcnJvciB0aHJvd24gYnlcbiAgICAgIC8vIGEgY2hpbGQuIFNpbmNlIHdlIHdhbnQgdG8gYXBwZW5kIHRoZSB1cGRhdGUgb25seSB0byB0aGUgd29yay1pblxuICAgICAgLy8gLXByb2dyZXNzIHF1ZXVlLCB3ZSBuZWVkIHRvIGNsb25lIHRoZSB1cGRhdGVzLiBXZSB1c3VhbGx5IGNsb25lIGR1cmluZ1xuICAgICAgLy8gcHJvY2Vzc1VwZGF0ZVF1ZXVlLCBidXQgdGhhdCBkaWRuJ3QgaGFwcGVuIGluIHRoaXMgY2FzZSBiZWNhdXNlIHdlXG4gICAgICAvLyBza2lwcGVkIG92ZXIgdGhlIHBhcmVudCB3aGVuIHdlIGJhaWxlZCBvdXQuXG4gICAgICB2YXIgbmV3Rmlyc3QgPSBudWxsO1xuICAgICAgdmFyIG5ld0xhc3QgPSBudWxsO1xuICAgICAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcblxuICAgICAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHVwZGF0ZXMgYW5kIGNsb25lIHRoZW0uXG4gICAgICAgIHZhciB1cGRhdGUgPSBmaXJzdEJhc2VVcGRhdGU7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlLmV2ZW50VGltZSxcbiAgICAgICAgICAgIGxhbmU6IHVwZGF0ZS5sYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAobmV3TGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld0xhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICAgICAgbmV3TGFzdCA9IGNsb25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlICh1cGRhdGUgIT09IG51bGwpOyAvLyBBcHBlbmQgdGhlIGNhcHR1cmVkIHVwZGF0ZSB0aGUgZW5kIG9mIHRoZSBjbG9uZWQgbGlzdC5cblxuXG4gICAgICAgIGlmIChuZXdMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdC5uZXh0ID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgICAgICAgbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGVyZSBhcmUgbm8gYmFzZSB1cGRhdGVzLlxuICAgICAgICBuZXdGaXJzdCA9IG5ld0xhc3QgPSBjYXB0dXJlZFVwZGF0ZTtcbiAgICAgIH1cblxuICAgICAgcXVldWUgPSB7XG4gICAgICAgIGJhc2VTdGF0ZTogY3VycmVudFF1ZXVlLmJhc2VTdGF0ZSxcbiAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBuZXdGaXJzdCxcbiAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgIHNoYXJlZDogY3VycmVudFF1ZXVlLnNoYXJlZCxcbiAgICAgICAgZWZmZWN0czogY3VycmVudFF1ZXVlLmVmZmVjdHNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHF1ZXVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSAvLyBBcHBlbmQgdGhlIHVwZGF0ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuXG5cbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgaWYgKGxhc3RCYXNlVXBkYXRlID09PSBudWxsKSB7XG4gICAgcXVldWUuZmlyc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gIH0gZWxzZSB7XG4gICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGNhcHR1cmVkVXBkYXRlO1xuICB9XG5cbiAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdGVGcm9tVXBkYXRlKHdvcmtJblByb2dyZXNzLCBxdWV1ZSwgdXBkYXRlLCBwcmV2U3RhdGUsIG5leHRQcm9wcywgaW5zdGFuY2UpIHtcbiAgc3dpdGNoICh1cGRhdGUudGFnKSB7XG4gICAgY2FzZSBSZXBsYWNlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBwYXlsb2FkID0gdXBkYXRlLnBheWxvYWQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gVXBkYXRlciBmdW5jdGlvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVudGVyRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV4dFN0YXRlID0gcGF5bG9hZC5jYWxsKGluc3RhbmNlLCBwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgICAgICB9IC8vIFN0YXRlIG9iamVjdFxuXG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIENhcHR1cmVVcGRhdGU6XG4gICAgICB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG4gICAgICB9XG4gICAgLy8gSW50ZW50aW9uYWwgZmFsbHRocm91Z2hcblxuICAgIGNhc2UgVXBkYXRlU3RhdGU6XG4gICAgICB7XG4gICAgICAgIHZhciBfcGF5bG9hZCA9IHVwZGF0ZS5wYXlsb2FkO1xuICAgICAgICB2YXIgcGFydGlhbFN0YXRlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX3BheWxvYWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAvLyBVcGRhdGVyIGZ1bmN0aW9uXG4gICAgICAgICAge1xuICAgICAgICAgICAgZW50ZXJEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFVigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIF9wYXlsb2FkLmNhbGwoaW5zdGFuY2UsIHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBleGl0RGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUGFydGlhbCBzdGF0ZSBvYmplY3RcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBfcGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJ0aWFsU3RhdGUgPT09IG51bGwgfHwgcGFydGlhbFN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBOdWxsIGFuZCB1bmRlZmluZWQgYXJlIHRyZWF0ZWQgYXMgbm8tb3BzLlxuICAgICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICAgIH0gLy8gTWVyZ2UgdGhlIHBhcnRpYWwgc3RhdGUgYW5kIHRoZSBwcmV2aW91cyBzdGF0ZS5cblxuXG4gICAgICAgIHJldHVybiBfYXNzaWduKHt9LCBwcmV2U3RhdGUsIHBhcnRpYWxTdGF0ZSk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAge1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGU7XG4gICAgICB9XG4gIH1cblxuICByZXR1cm4gcHJldlN0YXRlO1xufVxuXG5mdW5jdGlvbiBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIHByb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVGhpcyBpcyBhbHdheXMgbm9uLW51bGwgb24gYSBDbGFzc0NvbXBvbmVudCBvciBIb3N0Um9vdFxuICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgaGFzRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICB7XG4gICAgY3VycmVudGx5UHJvY2Vzc2luZ1F1ZXVlID0gcXVldWUuc2hhcmVkO1xuICB9XG5cbiAgdmFyIGZpcnN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmZpcnN0QmFzZVVwZGF0ZTtcbiAgdmFyIGxhc3RCYXNlVXBkYXRlID0gcXVldWUubGFzdEJhc2VVcGRhdGU7IC8vIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHVwZGF0ZXMuIElmIHNvLCB0cmFuc2ZlciB0aGVtIHRvIHRoZSBiYXNlIHF1ZXVlLlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcblxuICBpZiAocGVuZGluZ1F1ZXVlICE9PSBudWxsKSB7XG4gICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsOyAvLyBUaGUgcGVuZGluZyBxdWV1ZSBpcyBjaXJjdWxhci4gRGlzY29ubmVjdCB0aGUgcG9pbnRlciBiZXR3ZWVuIGZpcnN0XG4gICAgLy8gYW5kIGxhc3Qgc28gdGhhdCBpdCdzIG5vbi1jaXJjdWxhci5cblxuICAgIHZhciBsYXN0UGVuZGluZ1VwZGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICB2YXIgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICBsYXN0UGVuZGluZ1VwZGF0ZS5uZXh0ID0gbnVsbDsgLy8gQXBwZW5kIHBlbmRpbmcgdXBkYXRlcyB0byBiYXNlIHF1ZXVlXG5cbiAgICBpZiAobGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIGZpcnN0QmFzZVVwZGF0ZSA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGFzdEJhc2VVcGRhdGUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZTtcbiAgICB9XG5cbiAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlOyAvLyBJZiB0aGVyZSdzIGEgY3VycmVudCBxdWV1ZSwgYW5kIGl0J3MgZGlmZmVyZW50IGZyb20gdGhlIGJhc2UgcXVldWUsIHRoZW5cbiAgICAvLyB3ZSBuZWVkIHRvIHRyYW5zZmVyIHRoZSB1cGRhdGVzIHRvIHRoYXQgcXVldWUsIHRvby4gQmVjYXVzZSB0aGUgYmFzZVxuICAgIC8vIHF1ZXVlIGlzIGEgc2luZ2x5LWxpbmtlZCBsaXN0IHdpdGggbm8gY3ljbGVzLCB3ZSBjYW4gYXBwZW5kIHRvIGJvdGhcbiAgICAvLyBsaXN0cyBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2Ygc3RydWN0dXJhbCBzaGFyaW5nLlxuICAgIC8vIFRPRE86IFBhc3MgYGN1cnJlbnRgIGFzIGFyZ3VtZW50XG5cbiAgICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGFsd2F5cyBub24tbnVsbCBvbiBhIENsYXNzQ29tcG9uZW50IG9yIEhvc3RSb290XG4gICAgICB2YXIgY3VycmVudFF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHZhciBjdXJyZW50TGFzdEJhc2VVcGRhdGUgPSBjdXJyZW50UXVldWUubGFzdEJhc2VVcGRhdGU7XG5cbiAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgIT09IGxhc3RCYXNlVXBkYXRlKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICBjdXJyZW50UXVldWUuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1cnJlbnRMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gZmlyc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudFF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFRoZXNlIHZhbHVlcyBtYXkgY2hhbmdlIGFzIHdlIHByb2Nlc3MgdGhlIHF1ZXVlLlxuXG5cbiAgaWYgKGZpcnN0QmFzZVVwZGF0ZSAhPT0gbnVsbCkge1xuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGlzdCBvZiB1cGRhdGVzIHRvIGNvbXB1dGUgdGhlIHJlc3VsdC5cbiAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7IC8vIFRPRE86IERvbid0IG5lZWQgdG8gYWNjdW11bGF0ZSB0aGlzLiBJbnN0ZWFkLCB3ZSBjYW4gcmVtb3ZlIHJlbmRlckxhbmVzXG4gICAgLy8gZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cbiAgICB2YXIgbmV3TGFuZXMgPSBOb0xhbmVzO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdGaXJzdEJhc2VVcGRhdGUgPSBudWxsO1xuICAgIHZhciBuZXdMYXN0QmFzZVVwZGF0ZSA9IG51bGw7XG4gICAgdmFyIHVwZGF0ZSA9IGZpcnN0QmFzZVVwZGF0ZTtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG4gICAgICB2YXIgdXBkYXRlRXZlbnRUaW1lID0gdXBkYXRlLmV2ZW50VGltZTtcblxuICAgICAgaWYgKCFpc1N1YnNldE9mTGFuZXMocmVuZGVyTGFuZXMsIHVwZGF0ZUxhbmUpKSB7XG4gICAgICAgIC8vIFByaW9yaXR5IGlzIGluc3VmZmljaWVudC4gU2tpcCB0aGlzIHVwZGF0ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3RcbiAgICAgICAgLy8gc2tpcHBlZCB1cGRhdGUsIHRoZSBwcmV2aW91cyB1cGRhdGUvc3RhdGUgaXMgdGhlIG5ldyBiYXNlXG4gICAgICAgIC8vIHVwZGF0ZS9zdGF0ZS5cbiAgICAgICAgdmFyIGNsb25lID0ge1xuICAgICAgICAgIGV2ZW50VGltZTogdXBkYXRlRXZlbnRUaW1lLFxuICAgICAgICAgIGxhbmU6IHVwZGF0ZUxhbmUsXG4gICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5wYXlsb2FkLFxuICAgICAgICAgIGNhbGxiYWNrOiB1cGRhdGUuY2FsbGJhY2ssXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdMYXN0QmFzZVVwZGF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIG5ld0ZpcnN0QmFzZVVwZGF0ZSA9IG5ld0xhc3RCYXNlVXBkYXRlID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gY2xvbmU7XG4gICAgICAgIH0gLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgcHJpb3JpdHkgaW4gdGhlIHF1ZXVlLlxuXG5cbiAgICAgICAgbmV3TGFuZXMgPSBtZXJnZUxhbmVzKG5ld0xhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX2Nsb25lID0ge1xuICAgICAgICAgICAgZXZlbnRUaW1lOiB1cGRhdGVFdmVudFRpbWUsXG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgdGFnOiB1cGRhdGUudGFnLFxuICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLnBheWxvYWQsXG4gICAgICAgICAgICBjYWxsYmFjazogdXBkYXRlLmNhbGxiYWNrLFxuICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgIH07XG4gICAgICAgICAgbmV3TGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZS5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBuZXdTdGF0ZSA9IGdldFN0YXRlRnJvbVVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgcXVldWUsIHVwZGF0ZSwgbmV3U3RhdGUsIHByb3BzLCBpbnN0YW5jZSk7XG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZS5jYWxsYmFjaztcblxuICAgICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBDYWxsYmFjaztcbiAgICAgICAgICB2YXIgZWZmZWN0cyA9IHF1ZXVlLmVmZmVjdHM7XG5cbiAgICAgICAgICBpZiAoZWZmZWN0cyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWUuZWZmZWN0cyA9IFt1cGRhdGVdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlZmZlY3RzLnB1c2godXBkYXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG5cbiAgICAgIGlmICh1cGRhdGUgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUuc2hhcmVkLnBlbmRpbmc7XG5cbiAgICAgICAgaWYgKHBlbmRpbmdRdWV1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEFuIHVwZGF0ZSB3YXMgc2NoZWR1bGVkIGZyb20gaW5zaWRlIGEgcmVkdWNlci4gQWRkIHRoZSBuZXdcbiAgICAgICAgICAvLyBwZW5kaW5nIHVwZGF0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBhbmQga2VlcCBwcm9jZXNzaW5nLlxuICAgICAgICAgIHZhciBfbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWU7IC8vIEludGVudGlvbmFsbHkgdW5zb3VuZC4gUGVuZGluZyB1cGRhdGVzIGZvcm0gYSBjaXJjdWxhciBsaXN0LCBidXQgd2VcbiAgICAgICAgICAvLyB1bnJhdmVsIHRoZW0gd2hlbiB0cmFuc2ZlcnJpbmcgdGhlbSB0byB0aGUgYmFzZSBxdWV1ZS5cblxuICAgICAgICAgIHZhciBfZmlyc3RQZW5kaW5nVXBkYXRlID0gX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQ7XG4gICAgICAgICAgX2xhc3RQZW5kaW5nVXBkYXRlLm5leHQgPSBudWxsO1xuICAgICAgICAgIHVwZGF0ZSA9IF9maXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBfbGFzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAodHJ1ZSk7XG5cbiAgICBpZiAobmV3TGFzdEJhc2VVcGRhdGUgPT09IG51bGwpIHtcbiAgICAgIG5ld0Jhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IG5ld0Jhc2VTdGF0ZTtcbiAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBuZXdGaXJzdEJhc2VVcGRhdGU7XG4gICAgcXVldWUubGFzdEJhc2VVcGRhdGUgPSBuZXdMYXN0QmFzZVVwZGF0ZTsgLy8gU2V0IHRoZSByZW1haW5pbmcgZXhwaXJhdGlvbiB0aW1lIHRvIGJlIHdoYXRldmVyIGlzIHJlbWFpbmluZyBpbiB0aGUgcXVldWUuXG4gICAgLy8gVGhpcyBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHRoZSBvbmx5IHR3byBvdGhlciB0aGluZ3MgdGhhdCBjb250cmlidXRlIHRvXG4gICAgLy8gZXhwaXJhdGlvbiB0aW1lIGFyZSBwcm9wcyBhbmQgY29udGV4dC4gV2UncmUgYWxyZWFkeSBpbiB0aGUgbWlkZGxlIG9mIHRoZVxuICAgIC8vIGJlZ2luIHBoYXNlIGJ5IHRoZSB0aW1lIHdlIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzbyB3ZSd2ZSBhbHJlYWR5XG4gICAgLy8gZGVhbHQgd2l0aCB0aGUgcHJvcHMuIENvbnRleHQgaW4gY29tcG9uZW50cyB0aGF0IHNwZWNpZnlcbiAgICAvLyBzaG91bGRDb21wb25lbnRVcGRhdGUgaXMgdHJpY2t5OyBidXQgd2UnbGwgaGF2ZSB0byBhY2NvdW50IGZvclxuICAgIC8vIHRoYXQgcmVnYXJkbGVzcy5cblxuICAgIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMobmV3TGFuZXMpO1xuICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbmV3TGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9XG5cbiAge1xuICAgIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gIGlmICghKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogXCIgKyBjYWxsYmFjayApO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0SGFzRm9yY2VVcGRhdGVCZWZvcmVQcm9jZXNzaW5nKCkge1xuICBoYXNGb3JjZVVwZGF0ZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpIHtcbiAgcmV0dXJuIGhhc0ZvcmNlVXBkYXRlO1xufVxuZnVuY3Rpb24gY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFF1ZXVlLCBpbnN0YW5jZSkge1xuICAvLyBDb21taXQgdGhlIGVmZmVjdHNcbiAgdmFyIGVmZmVjdHMgPSBmaW5pc2hlZFF1ZXVlLmVmZmVjdHM7XG4gIGZpbmlzaGVkUXVldWUuZWZmZWN0cyA9IG51bGw7XG5cbiAgaWYgKGVmZmVjdHMgIT09IG51bGwpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVmZmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlZmZlY3QgPSBlZmZlY3RzW2ldO1xuICAgICAgdmFyIGNhbGxiYWNrID0gZWZmZWN0LmNhbGxiYWNrO1xuXG4gICAgICBpZiAoY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgICAgZWZmZWN0LmNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgY2FsbENhbGxiYWNrKGNhbGxiYWNrLCBpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmYWtlSW50ZXJuYWxJbnN0YW5jZSA9IHt9O1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5OyAvLyBSZWFjdC5Db21wb25lbnQgdXNlcyBhIHNoYXJlZCBmcm96ZW4gb2JqZWN0IGJ5IGRlZmF1bHQuXG4vLyBXZSdsbCB1c2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplIGxlZ2FjeSByZWZzLlxuXG52YXIgZW1wdHlSZWZzT2JqZWN0ID0gbmV3IFJlYWN0LkNvbXBvbmVudCgpLnJlZnM7XG52YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGU7XG52YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGU7XG52YXIgd2Fybk9uVW5kZWZpbmVkRGVyaXZlZFN0YXRlO1xudmFyIHdhcm5PbkludmFsaWRDYWxsYmFjaztcbnZhciBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZTtcbnZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcztcbnZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGU7XG5cbntcbiAgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMgPSBuZXcgU2V0KCk7XG4gIGRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZSA9IG5ldyBTZXQoKTtcbiAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcblxuICB3YXJuT25JbnZhbGlkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAoY2FsbGJhY2sgPT09IG51bGwgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IGNhbGxlck5hbWUgKyAnXycgKyBjYWxsYmFjaztcblxuICAgIGlmICghZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpKSB7XG4gICAgICBkaWRXYXJuT25JbnZhbGlkQ2FsbGJhY2suYWRkKGtleSk7XG5cbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfTtcblxuICB3YXJuT25VbmRlZmluZWREZXJpdmVkU3RhdGUgPSBmdW5jdGlvbiAodHlwZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHBhcnRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSkgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgIGlmICghZGlkV2FybkFib3V0VW5kZWZpbmVkRGVyaXZlZFN0YXRlLmhhcyhjb21wb25lbnROYW1lKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclcy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKTogQSB2YWxpZCBzdGF0ZSBvYmplY3QgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuICcgKyAnWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTsgLy8gVGhpcyBpcyBzbyBncm9zcyBidXQgaXQncyBhdCBsZWFzdCBub24tY3JpdGljYWwgYW5kIGNhbiBiZSByZW1vdmVkIGlmXG4gIC8vIGl0IGNhdXNlcyBwcm9ibGVtcy4gVGhpcyBpcyBtZWFudCB0byBnaXZlIGEgbmljZXIgZXJyb3IgbWVzc2FnZSBmb3JcbiAgLy8gUmVhY3RET00xNS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihyZWFjdERPTTE2Q29tcG9uZW50LFxuICAvLyAuLi4pKSB3aGljaCBvdGhlcndpc2UgdGhyb3dzIGEgXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYSBmdW5jdGlvblwiXG4gIC8vIGV4Y2VwdGlvbi5cblxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmYWtlSW50ZXJuYWxJbnN0YW5jZSwgJ19wcm9jZXNzQ2hpbGRDb250ZXh0Jywge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJfcHJvY2Vzc0NoaWxkQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGluIFJlYWN0IDE2Ky4gVGhpcyBsaWtlbHkgbWVhbnMgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGFuZCBhcmUgYXR0ZW1wdGluZyB0byBuZXN0IGEgUmVhY3QgMTUgdHJlZSBpbnNpZGUgYSBSZWFjdCAxNiB0cmVlIHVzaW5nIHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLCB3aGljaCBpc24ndCBzdXBwb3J0ZWQuIFRyeSB0byBtYWtlIHN1cmUgeW91IGhhdmUgb25seSBvbmUgY29weSBvZiBSZWFjdCAoYW5kIGlkZWFsbHksIHN3aXRjaCB0byBSZWFjdERPTS5jcmVhdGVQb3J0YWwpLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV4dFByb3BzKSB7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHBhcnRpYWxTdGF0ZSA9IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIHByZXZTdGF0ZSk7XG5cbiAge1xuICAgIHdhcm5PblVuZGVmaW5lZERlcml2ZWRTdGF0ZShjdG9yLCBwYXJ0aWFsU3RhdGUpO1xuICB9IC8vIE1lcmdlIHRoZSBwYXJ0aWFsIHN0YXRlIGFuZCB0aGUgcHJldmlvdXMgc3RhdGUuXG5cblxuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZSA9PT0gbnVsbCB8fCBwYXJ0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCA/IHByZXZTdGF0ZSA6IF9hc3NpZ24oe30sIHByZXZTdGF0ZSwgcGFydGlhbFN0YXRlKTtcbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG1lbW9pemVkU3RhdGU7IC8vIE9uY2UgdGhlIHVwZGF0ZSBxdWV1ZSBpcyBlbXB0eSwgcGVyc2lzdCB0aGUgZGVyaXZlZCBzdGF0ZSBvbnRvIHRoZVxuICAvLyBiYXNlIHN0YXRlLlxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFF1ZXVlIGlzIGFsd2F5cyBub24tbnVsbCBmb3IgY2xhc3Nlc1xuICAgIHZhciB1cGRhdGVRdWV1ZSA9IHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlO1xuICAgIHVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IG1lbW9pemVkU3RhdGU7XG4gIH1cbn1cbnZhciBjbGFzc0NvbXBvbmVudFVwZGF0ZXIgPSB7XG4gIGlzTW91bnRlZDogaXNNb3VudGVkLFxuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfSxcbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGluc3QpO1xuICAgIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShldmVudFRpbWUsIGxhbmUpO1xuICAgIHVwZGF0ZS50YWcgPSBSZXBsYWNlU3RhdGU7XG4gICAgdXBkYXRlLnBheWxvYWQgPSBwYXlsb2FkO1xuXG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHtcbiAgICAgICAgd2Fybk9uSW52YWxpZENhbGxiYWNrKGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoZmliZXIsIHVwZGF0ZSk7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICB9LFxuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgIHZhciBmaWJlciA9IGdldChpbnN0KTtcbiAgICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICAgIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTtcbiAgICB1cGRhdGUudGFnID0gRm9yY2VVcGRhdGU7XG5cbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCAmJiBjYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAge1xuICAgICAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2ssICdmb3JjZVVwZGF0ZScpO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUpO1xuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCkge1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICAgIGRpc2FibGVMb2dzKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuIGV4dHJhIHRpbWUgdG8gaGVscCBkZXRlY3Qgc2lkZS1lZmZlY3RzLlxuICAgICAgICAgIGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzaG91bGRVcGRhdGUgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUobmV3UHJvcHMsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgICB7XG4gICAgICBpZiAoc2hvdWxkVXBkYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IoJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzaG91bGRVcGRhdGU7XG4gIH1cblxuICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChvbGRQcm9wcywgbmV3UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjaGVja0NsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG5ld1Byb3BzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcblxuICB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuICAgIHZhciByZW5kZXJQcmVzZW50ID0gaW5zdGFuY2UucmVuZGVyO1xuXG4gICAgaWYgKCFyZW5kZXJQcmVzZW50KSB7XG4gICAgICBpZiAoY3Rvci5wcm90b3R5cGUgJiYgdHlwZW9mIGN0b3IucHJvdG90eXBlLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignJXMoLi4uKTogTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSByZXR1cm5lZCBjb21wb25lbnQgJyArICdpbnN0YW5jZTogZGlkIHlvdSBhY2NpZGVudGFsbHkgcmV0dXJuIGFuIG9iamVjdCBmcm9tIHRoZSBjb25zdHJ1Y3Rvcj8nLCBuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlICYmICFpbnN0YW5jZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiYgIWluc3RhbmNlLnN0YXRlKSB7XG4gICAgICBlcnJvcignZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMgJiYgIWluc3RhbmNlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wVHlwZXMpIHtcbiAgICAgIGVycm9yKCdwcm9wVHlwZXMgd2FzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMuIFVzZSBhIHN0YXRpYyAnICsgJ3Byb3BlcnR5IHRvIGRlZmluZSBwcm9wVHlwZXMgaW5zdGVhZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuY29udGV4dFR5cGUpIHtcbiAgICAgIGVycm9yKCdjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlIGluc3RlYWQuJywgbmFtZSk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKGluc3RhbmNlLmNvbnRleHRUeXBlcykge1xuICAgICAgICBlcnJvcignY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgbmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdG9yLmNvbnRleHRUeXBlICYmIGN0b3IuY29udGV4dFR5cGVzICYmICFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZUFuZENvbnRleHRUeXBlcy5oYXMoY3RvcikpIHtcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVBbmRDb250ZXh0VHlwZXMuYWRkKGN0b3IpO1xuXG4gICAgICAgIGVycm9yKCclcyBkZWNsYXJlcyBib3RoIGNvbnRleHRUeXBlcyBhbmQgY29udGV4dFR5cGUgc3RhdGljIHByb3BlcnRpZXMuICcgKyAnVGhlIGxlZ2FjeSBjb250ZXh0VHlwZXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLicsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0b3IucHJvdG90eXBlICYmIGN0b3IucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmIHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBlcnJvcignJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBzaG91bGRDb21wb25lbnRVcGRhdGUoKS4gJyArICdzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuICcgKyAnUGxlYXNlIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIGlzIHVzZWQuJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQSBwdXJlIGNvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnSWYgeW91IG1lYW50IHRvIHVwZGF0ZSB0aGUgc3RhdGUgaW4gcmVzcG9uc2UgdG8gY2hhbmdpbmcgcHJvcHMsICcgKyAndXNlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKS4gSWYgeW91IG1lYW50IHRvIGZldGNoIGRhdGEgb3IgJyArICdydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgbmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIGhhc011dGF0ZWRQcm9wcyA9IGluc3RhbmNlLnByb3BzICE9PSBuZXdQcm9wcztcblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gdW5kZWZpbmVkICYmIGhhc011dGF0ZWRQcm9wcykge1xuICAgICAgZXJyb3IoJyVzKC4uLik6IFdoZW4gY2FsbGluZyBzdXBlcigpIGluIGAlc2AsIG1ha2Ugc3VyZSB0byBwYXNzICcgKyBcInVwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnQncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLlwiLCBuYW1lLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuZGVmYXVsdFByb3BzKSB7XG4gICAgICBlcnJvcignU2V0dGluZyBkZWZhdWx0UHJvcHMgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgb24gJXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkLicgKyAnIEluc3RlYWQsIGRlZmluZSBkZWZhdWx0UHJvcHMgYXMgYSBzdGF0aWMgcHJvcGVydHkgb24gJXMuJywgbmFtZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICFkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuaGFzKGN0b3IpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZVdpdGhvdXREaWRVcGRhdGUuYWRkKGN0b3IpO1xuXG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgc2hvdWxkIGJlIHVzZWQgd2l0aCBjb21wb25lbnREaWRVcGRhdGUoKS4gJyArICdUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS4nLCBnZXRDb21wb25lbnROYW1lKGN0b3IpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJyVzOiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIG1ldGhvZCAnICsgJ2FuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYSBzdGF0aWMgbWV0aG9kLicsIG5hbWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpIGlzIGRlZmluZWQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kICcgKyAnYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignJXM6IGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgaXMgZGVmaW5lZCBhcyBhIHN0YXRpYyBtZXRob2QgJyArICdhbmQgd2lsbCBiZSBpZ25vcmVkLiBJbnN0ZWFkLCBkZWNsYXJlIGl0IGFzIGFuIGluc3RhbmNlIG1ldGhvZC4nLCBuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgX3N0YXRlID0gaW5zdGFuY2Uuc3RhdGU7XG5cbiAgICBpZiAoX3N0YXRlICYmICh0eXBlb2YgX3N0YXRlICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KF9zdGF0ZSkpKSB7XG4gICAgICBlcnJvcignJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGN0b3IuY2hpbGRDb250ZXh0VHlwZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvcignJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byAnICsgJ3VzZSBnZXRDaGlsZENvbnRleHQoKS4nLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRvcHRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gVGhlIGluc3RhbmNlIG5lZWRzIGFjY2VzcyB0byB0aGUgZmliZXIgc28gdGhhdCBpdCBjYW4gc2NoZWR1bGUgdXBkYXRlc1xuXG4gIHNldChpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MpO1xuXG4gIHtcbiAgICBpbnN0YW5jZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gZmFrZUludGVybmFsSW5zdGFuY2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgcHJvcHMpIHtcbiAgdmFyIGlzTGVnYWN5Q29udGV4dENvbnN1bWVyID0gZmFsc2U7XG4gIHZhciB1bm1hc2tlZENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIHZhciBjb250ZXh0ID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuXG4gIHtcbiAgICBpZiAoJ2NvbnRleHRUeXBlJyBpbiBjdG9yKSB7XG4gICAgICB2YXIgaXNWYWxpZCA9IC8vIEFsbG93IG51bGwgZm9yIGNvbmRpdGlvbmFsIGRlY2xhcmF0aW9uXG4gICAgICBjb250ZXh0VHlwZSA9PT0gbnVsbCB8fCBjb250ZXh0VHlwZSAhPT0gdW5kZWZpbmVkICYmIGNvbnRleHRUeXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgJiYgY29udGV4dFR5cGUuX2NvbnRleHQgPT09IHVuZGVmaW5lZDsgLy8gTm90IGEgPENvbnRleHQuQ29uc3VtZXI+XG5cbiAgICAgIGlmICghaXNWYWxpZCAmJiAhZGlkV2FybkFib3V0SW52YWxpZGF0ZUNvbnRleHRUeXBlLmhhcyhjdG9yKSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKGN0b3IpO1xuICAgICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAgICBpZiAoY29udGV4dFR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiAnICsgJ1RoaXMgY2FuIGJlIGNhdXNlZCBieSBhIHR5cG8gb3IgYnkgbWl4aW5nIHVwIG5hbWVkIGFuZCBkZWZhdWx0IGltcG9ydHMuICcgKyAnVGhpcyBjYW4gYWxzbyBoYXBwZW4gZHVlIHRvIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSwgc28gJyArICd0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuJztcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEhvd2V2ZXIsIGl0IGlzIHNldCB0byBhICcgKyB0eXBlb2YgY29udGV4dFR5cGUgKyAnLic7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyB0aGUgQ29udGV4dC5Qcm92aWRlciBpbnN0ZWFkPyc7XG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFR5cGUuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICAgIGFkZGVuZHVtID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBwYXNzIHRoZSBDb250ZXh0LkNvbnN1bWVyIGluc3RlYWQ/JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSG93ZXZlciwgaXQgaXMgc2V0IHRvIGFuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjb250ZXh0VHlwZSkuam9pbignLCAnKSArICd9Lic7XG4gICAgICAgIH1cblxuICAgICAgICBlcnJvcignJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiAnICsgJ2NvbnRleHRUeXBlIHNob3VsZCBwb2ludCB0byB0aGUgQ29udGV4dCBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlQ29udGV4dCgpLiVzJywgZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JywgYWRkZW5kdW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgY29udGV4dFR5cGUgPT09ICdvYmplY3QnICYmIGNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgY29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIHZhciBjb250ZXh0VHlwZXMgPSBjdG9yLmNvbnRleHRUeXBlcztcbiAgICBpc0xlZ2FjeUNvbnRleHRDb25zdW1lciA9IGNvbnRleHRUeXBlcyAhPT0gbnVsbCAmJiBjb250ZXh0VHlwZXMgIT09IHVuZGVmaW5lZDtcbiAgICBjb250ZXh0ID0gaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIgPyBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICB9IC8vIEluc3RhbnRpYXRlIHR3aWNlIHRvIGhlbHAgZGV0ZWN0IHNpZGUtZWZmZWN0cy5cblxuXG4gIHtcbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSBuZXcgY3Rvcihwcm9wcywgY29udGV4dCk7XG4gIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSAhPT0gbnVsbCAmJiBpbnN0YW5jZS5zdGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5zdGFuY2Uuc3RhdGUgOiBudWxsO1xuICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcblxuICB7XG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyAmJiBzdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGN0b3IpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChjb21wb25lbnROYW1lKTtcblxuICAgICAgICBlcnJvcignYCVzYCB1c2VzIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGJ1dCBpdHMgaW5pdGlhbCBzdGF0ZSBpcyAnICsgJyVzLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4gSW5zdGVhZCwgZGVmaW5lIHRoZSBpbml0aWFsIHN0YXRlIGJ5ICcgKyAnYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuICcgKyAnVGhpcyBlbnN1cmVzIHRoYXQgYGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc2AgYXJndW1lbnRzIGhhdmUgYSBjb25zaXN0ZW50IHNoYXBlLicsIGNvbXBvbmVudE5hbWUsIGluc3RhbmNlLnN0YXRlID09PSBudWxsID8gJ251bGwnIDogJ3VuZGVmaW5lZCcsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH0gLy8gSWYgbmV3IGNvbXBvbmVudCBBUElzIGFyZSBkZWZpbmVkLCBcInVuc2FmZVwiIGxpZmVjeWNsZXMgd29uJ3QgYmUgY2FsbGVkLlxuICAgIC8vIFdhcm4gYWJvdXQgdGhlc2UgbGlmZWN5Y2xlcyBpZiB0aGV5IGFyZSBwcmVzZW50LlxuICAgIC8vIERvbid0IHdhcm4gYWJvdXQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBtZXRob2RzIHRob3VnaC5cblxuXG4gICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBmb3VuZFdpbGxNb3VudE5hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSBudWxsO1xuICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBudWxsO1xuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxNb3VudE5hbWUgPSAnY29tcG9uZW50V2lsbE1vdW50JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsTW91bnROYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsTW91bnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicgJiYgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICE9PSB0cnVlKSB7XG4gICAgICAgIGZvdW5kV2lsbFJlY2VpdmVQcm9wc05hbWUgPSAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyc7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lID0gJ1VOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJztcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlID09PSAnZnVuY3Rpb24nICYmIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAhPT0gdHJ1ZSkge1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID0gJ2NvbXBvbmVudFdpbGxVcGRhdGUnO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSA9ICdVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSc7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3VuZFdpbGxNb3VudE5hbWUgIT09IG51bGwgfHwgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSAhPT0gbnVsbCB8fCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBfY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoY3RvcikgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICAgICAgdmFyIG5ld0FwaU5hbWUgPSB0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgPyAnZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCknIDogJ2dldFNuYXBzaG90QmVmb3JlVXBkYXRlKCknO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5oYXMoX2NvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgICAgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZS5hZGQoX2NvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgICAgZXJyb3IoJ1Vuc2FmZSBsZWdhY3kgbGlmZWN5Y2xlcyB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgbmV3IGNvbXBvbmVudCBBUElzLlxcblxcbicgKyAnJXMgdXNlcyAlcyBidXQgYWxzbyBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlZ2FjeSBsaWZlY3ljbGVzOiVzJXMlc1xcblxcbicgKyAnVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzJywgX2NvbXBvbmVudE5hbWUsIG5ld0FwaU5hbWUsIGZvdW5kV2lsbE1vdW50TmFtZSAhPT0gbnVsbCA/IFwiXFxuICBcIiArIGZvdW5kV2lsbE1vdW50TmFtZSA6ICcnLCBmb3VuZFdpbGxSZWNlaXZlUHJvcHNOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsUmVjZWl2ZVByb3BzTmFtZSA6ICcnLCBmb3VuZFdpbGxVcGRhdGVOYW1lICE9PSBudWxsID8gXCJcXG4gIFwiICsgZm91bmRXaWxsVXBkYXRlTmFtZSA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSAvLyBDYWNoZSB1bm1hc2tlZCBjb250ZXh0IHNvIHdlIGNhbiBhdm9pZCByZWNyZWF0aW5nIG1hc2tlZCBjb250ZXh0IHVubGVzcyBuZWNlc3NhcnkuXG4gIC8vIFJlYWN0RmliZXJDb250ZXh0IHVzdWFsbHkgdXBkYXRlcyB0aGlzIGNhY2hlIGJ1dCBjYW4ndCBmb3IgbmV3bHktY3JlYXRlZCBpbnN0YW5jZXMuXG5cblxuICBpZiAoaXNMZWdhY3lDb250ZXh0Q29uc3VtZXIpIHtcbiAgICBjYWNoZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCwgY29udGV4dCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gIH1cblxuICBpZiAob2xkU3RhdGUgIT09IGluc3RhbmNlLnN0YXRlKSB7XG4gICAge1xuICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxNb3VudCgpOiBBc3NpZ25pbmcgZGlyZWN0bHkgdG8gdGhpcy5zdGF0ZSBpcyAnICsgXCJkZXByZWNhdGVkIChleGNlcHQgaW5zaWRlIGEgY29tcG9uZW50J3MgXCIgKyAnY29uc3RydWN0b3IpLiBVc2Ugc2V0U3RhdGUgaW5zdGVhZC4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdDb21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShpbnN0YW5jZSwgaW5zdGFuY2Uuc3RhdGUsIG51bGwpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICB9XG5cbiAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBvbGRTdGF0ZSkge1xuICAgIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFN0YXRlQXNzaWdubWVudEZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgICAgZXJyb3IoJyVzLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvICcgKyBcInRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIFwiICsgJ2NvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuJywgY29tcG9uZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoaW5zdGFuY2UsIGluc3RhbmNlLnN0YXRlLCBudWxsKTtcbiAgfVxufSAvLyBJbnZva2VzIHRoZSBtb3VudCBsaWZlLWN5Y2xlcyBvbiBhIHByZXZpb3VzbHkgbmV2ZXIgcmVuZGVyZWQgaW5zdGFuY2UuXG5cblxuZnVuY3Rpb24gbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGNoZWNrQ2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gIGluc3RhbmNlLnJlZnMgPSBlbXB0eVJlZnNPYmplY3Q7XG4gIGluaXRpYWxpemVVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBpbnN0YW5jZS5jb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN0b3IsIHRydWUpO1xuICAgIGluc3RhbmNlLmNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAge1xuICAgIGlmIChpbnN0YW5jZS5zdGF0ZSA9PT0gbmV3UHJvcHMpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdG9yKSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICAgIGVycm9yKCclczogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGFzc2lnbiBwcm9wcyBkaXJlY3RseSB0byBzdGF0ZSAnICsgXCJiZWNhdXNlIHVwZGF0ZXMgdG8gcHJvcHMgd29uJ3QgYmUgcmVmbGVjdGVkIGluIHN0YXRlLiBcIiArICdJbiBtb3N0IGNhc2VzLCBpdCBpcyBiZXR0ZXIgdG8gdXNlIHByb3BzIGRpcmVjdGx5LicsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkTGVnYWN5Q29udGV4dFdhcm5pbmcod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyh3b3JrSW5Qcm9ncmVzcywgaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMsIGluc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfSAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuXG4gIGlmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlICE9PSAnZnVuY3Rpb24nICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGNhbGxDb21wb25lbnRXaWxsTW91bnQod29ya0luUHJvZ3Jlc3MsIGluc3RhbmNlKTsgLy8gSWYgd2UgaGFkIGFkZGl0aW9uYWwgc3RhdGUgdXBkYXRlcyBkdXJpbmcgdGhpcyBsaWZlLWN5Y2xlLCBsZXQnc1xuICAgIC8vIHByb2Nlc3MgdGhlbSBub3cuXG5cbiAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgIGluc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzdW1lTW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdG9yLCBuZXdQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGluc3RhbmNlID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICBpbnN0YW5jZS5wcm9wcyA9IG9sZFByb3BzO1xuICB2YXIgb2xkQ29udGV4dCA9IGluc3RhbmNlLmNvbnRleHQ7XG4gIHZhciBjb250ZXh0VHlwZSA9IGN0b3IuY29udGV4dFR5cGU7XG4gIHZhciBuZXh0Q29udGV4dCA9IGVtcHR5Q29udGV4dE9iamVjdDtcblxuICBpZiAodHlwZW9mIGNvbnRleHRUeXBlID09PSAnb2JqZWN0JyAmJiBjb250ZXh0VHlwZSAhPT0gbnVsbCkge1xuICAgIG5leHRDb250ZXh0ID0gcmVhZENvbnRleHQoY29udGV4dFR5cGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBuZXh0TGVnYWN5VW5tYXNrZWRDb250ZXh0ID0gZ2V0VW5tYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBjdG9yLCB0cnVlKTtcbiAgICBuZXh0Q29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIG5leHRMZWdhY3lVbm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgdmFyIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGN0b3IuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICB2YXIgaGFzTmV3TGlmZWN5Y2xlcyA9IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlID09PSAnZnVuY3Rpb24nOyAvLyBOb3RlOiBEdXJpbmcgdGhlc2UgbGlmZS1jeWNsZXMsIGluc3RhbmNlLnByb3BzL2luc3RhbmNlLnN0YXRlIGFyZSB3aGF0XG4gIC8vIGV2ZXIgdGhlIHByZXZpb3VzbHkgYXR0ZW1wdGVkIHRvIHJlbmRlciAtIG5vdCB0aGUgXCJjdXJyZW50XCIuIEhvd2V2ZXIsXG4gIC8vIGR1cmluZyBjb21wb25lbnREaWRVcGRhdGUgd2UgcGFzcyB0aGUgXCJjdXJyZW50XCIgcHJvcHMuXG4gIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAvLyBVbnNhZmUgbGlmZWN5Y2xlcyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBvbmVudHMgdXNpbmcgdGhlIG5ldyBBUElzLlxuXG4gIGlmICghaGFzTmV3TGlmZWN5Y2xlcyAmJiAodHlwZW9mIGluc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID09PSAnZnVuY3Rpb24nKSkge1xuICAgIGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcyAmJiBvbGRTdGF0ZSA9PT0gbmV3U3RhdGUgJiYgIWhhc0NvbnRleHRDaGFuZ2VkKCkgJiYgIWNoZWNrSGFzRm9yY2VVcGRhdGVBZnRlclByb2Nlc3NpbmcoKSkge1xuICAgIC8vIElmIGFuIHVwZGF0ZSB3YXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgd2Ugc2hvdWxkIHNjaGVkdWxlIGFuIFVwZGF0ZVxuICAgIC8vIGVmZmVjdCBldmVuIHRob3VnaCB3ZSdyZSBiYWlsaW5nIG91dCwgc28gdGhhdCBjV1UvY0RVIGFyZSBjYWxsZWQuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50ID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICB9IC8vIElmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5lZCBmYWxzZSwgd2Ugc2hvdWxkIHN0aWxsIHVwZGF0ZSB0aGVcbiAgICAvLyBtZW1vaXplZCBzdGF0ZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgd29yayBjYW4gYmUgcmV1c2VkLlxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV3UHJvcHM7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICB9IC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgaW5zdGFuY2UncyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHBvaW50ZXJzIGV2ZW5cbiAgLy8gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2UuXG5cblxuICBpbnN0YW5jZS5wcm9wcyA9IG5ld1Byb3BzO1xuICBpbnN0YW5jZS5zdGF0ZSA9IG5ld1N0YXRlO1xuICBpbnN0YW5jZS5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59IC8vIEludm9rZXMgdGhlIHVwZGF0ZSBsaWZlLWN5Y2xlcyBhbmQgcmV0dXJucyBmYWxzZSBpZiBpdCBzaG91bGRuJ3QgcmVyZW5kZXIuXG5cblxuZnVuY3Rpb24gdXBkYXRlQ2xhc3NJbnN0YW5jZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgY3RvciwgbmV3UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy50eXBlID09PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA/IHVucmVzb2x2ZWRPbGRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgdW5yZXNvbHZlZE9sZFByb3BzKTtcbiAgaW5zdGFuY2UucHJvcHMgPSBvbGRQcm9wcztcbiAgdmFyIHVucmVzb2x2ZWROZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG9sZENvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICB2YXIgY29udGV4dFR5cGUgPSBjdG9yLmNvbnRleHRUeXBlO1xuICB2YXIgbmV4dENvbnRleHQgPSBlbXB0eUNvbnRleHRPYmplY3Q7XG5cbiAgaWYgKHR5cGVvZiBjb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgY29udGV4dFR5cGUgIT09IG51bGwpIHtcbiAgICBuZXh0Q29udGV4dCA9IHJlYWRDb250ZXh0KGNvbnRleHRUeXBlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV4dFVubWFza2VkQ29udGV4dCA9IGdldFVubWFza2VkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgY3RvciwgdHJ1ZSk7XG4gICAgbmV4dENvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgfVxuXG4gIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgdmFyIGhhc05ld0xpZmVjeWNsZXMgPSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJzsgLy8gTm90ZTogRHVyaW5nIHRoZXNlIGxpZmUtY3ljbGVzLCBpbnN0YW5jZS5wcm9wcy9pbnN0YW5jZS5zdGF0ZSBhcmUgd2hhdFxuICAvLyBldmVyIHRoZSBwcmV2aW91c2x5IGF0dGVtcHRlZCB0byByZW5kZXIgLSBub3QgdGhlIFwiY3VycmVudFwiLiBIb3dldmVyLFxuICAvLyBkdXJpbmcgY29tcG9uZW50RGlkVXBkYXRlIHdlIHBhc3MgdGhlIFwiY3VycmVudFwiIHByb3BzLlxuICAvLyBJbiBvcmRlciB0byBzdXBwb3J0IHJlYWN0LWxpZmVjeWNsZXMtY29tcGF0IHBvbHlmaWxsZWQgY29tcG9uZW50cyxcbiAgLy8gVW5zYWZlIGxpZmVjeWNsZXMgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wb25lbnRzIHVzaW5nIHRoZSBuZXcgQVBJcy5cblxuICBpZiAoIWhhc05ld0xpZmVjeWNsZXMgJiYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSB1bnJlc29sdmVkTmV3UHJvcHMgfHwgb2xkQ29udGV4dCAhPT0gbmV4dENvbnRleHQpIHtcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHdvcmtJblByb2dyZXNzLCBpbnN0YW5jZSwgbmV3UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXNldEhhc0ZvcmNlVXBkYXRlQmVmb3JlUHJvY2Vzc2luZygpO1xuICB2YXIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgbmV3U3RhdGUgPSBpbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLCBpbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICBuZXdTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyA9PT0gdW5yZXNvbHZlZE5ld1Byb3BzICYmIG9sZFN0YXRlID09PSBuZXdTdGF0ZSAmJiAhaGFzQ29udGV4dENoYW5nZWQoKSAmJiAhY2hlY2tIYXNGb3JjZVVwZGF0ZUFmdGVyUHJvY2Vzc2luZygpKSB7XG4gICAgLy8gSWYgYW4gdXBkYXRlIHdhcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3ZSBzaG91bGQgc2NoZWR1bGUgYW4gVXBkYXRlXG4gICAgLy8gZWZmZWN0IGV2ZW4gdGhvdWdoIHdlJ3JlIGJhaWxpbmcgb3V0LCBzbyB0aGF0IGNXVS9jRFUgYXJlIGNhbGxlZC5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh1bnJlc29sdmVkT2xkUHJvcHMgIT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB8fCBvbGRTdGF0ZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMod29ya0luUHJvZ3Jlc3MsIGN0b3IsIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcywgbmV3UHJvcHMpO1xuICAgIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgfVxuXG4gIHZhciBzaG91bGRVcGRhdGUgPSBjaGVja0hhc0ZvcmNlVXBkYXRlQWZ0ZXJQcm9jZXNzaW5nKCkgfHwgY2hlY2tTaG91bGRDb21wb25lbnRVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGN0b3IsIG9sZFByb3BzLCBuZXdQcm9wcywgb2xkU3RhdGUsIG5ld1N0YXRlLCBuZXh0Q29udGV4dCk7XG5cbiAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgIC8vIEluIG9yZGVyIHRvIHN1cHBvcnQgcmVhY3QtbGlmZWN5Y2xlcy1jb21wYXQgcG9seWZpbGxlZCBjb21wb25lbnRzLFxuICAgIC8vIFVuc2FmZSBsaWZlY3ljbGVzIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcG9uZW50cyB1c2luZyB0aGUgbmV3IEFQSXMuXG4gICAgaWYgKCFoYXNOZXdMaWZlY3ljbGVzICYmICh0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZShuZXdQcm9wcywgbmV3U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFNuYXBzaG90O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhbiB1cGRhdGUgd2FzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdlIHNob3VsZCBzY2hlZHVsZSBhbiBVcGRhdGVcbiAgICAvLyBlZmZlY3QgZXZlbiB0aG91Z2ggd2UncmUgYmFpbGluZyBvdXQsIHNvIHRoYXQgY1dVL2NEVSBhcmUgY2FsbGVkLlxuICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodW5yZXNvbHZlZE9sZFByb3BzICE9PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgfHwgb2xkU3RhdGUgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHVucmVzb2x2ZWRPbGRQcm9wcyAhPT0gY3VycmVudC5tZW1vaXplZFByb3BzIHx8IG9sZFN0YXRlICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU25hcHNob3Q7XG4gICAgICB9XG4gICAgfSAvLyBJZiBzaG91bGRDb21wb25lbnRVcGRhdGUgcmV0dXJuZWQgZmFsc2UsIHdlIHNob3VsZCBzdGlsbCB1cGRhdGUgdGhlXG4gICAgLy8gbWVtb2l6ZWQgcHJvcHMvc3RhdGUgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHdvcmsgY2FuIGJlIHJldXNlZC5cblxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5ld1Byb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgfSAvLyBVcGRhdGUgdGhlIGV4aXN0aW5nIGluc3RhbmNlJ3Mgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCBwb2ludGVycyBldmVuXG4gIC8vIGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSByZXR1cm5zIGZhbHNlLlxuXG5cbiAgaW5zdGFuY2UucHJvcHMgPSBuZXdQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBuZXdTdGF0ZTtcbiAgaW5zdGFuY2UuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICByZXR1cm4gc2hvdWxkVXBkYXRlO1xufVxuXG52YXIgZGlkV2FybkFib3V0TWFwcztcbnZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzO1xudmFyIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nO1xudmFyIG93bmVySGFzRnVuY3Rpb25UeXBlV2FybmluZztcblxudmFyIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKGNoaWxkLCByZXR1cm5GaWJlcikge307XG5cbntcbiAgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbiAgLyoqXG4gICAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAgICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gICAqIHVwZGF0ZXMuXG4gICAqL1xuXG4gIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcblxuICB3YXJuRm9yTWlzc2luZ0tleSA9IGZ1bmN0aW9uIChjaGlsZCwgcmV0dXJuRmliZXIpIHtcbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY2hpbGQuX3N0b3JlIHx8IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgfHwgY2hpbGQua2V5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoISh0eXBlb2YgY2hpbGQuX3N0b3JlID09PSAnb2JqZWN0JykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QgQ29tcG9uZW50IGluIHdhcm5Gb3JNaXNzaW5nS2V5IHNob3VsZCBoYXZlIGEgX3N0b3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2hpbGQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjb21wb25lbnROYW1lXSA9IHRydWU7XG5cbiAgICBlcnJvcignRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgJyArICdcImtleVwiIHByb3AuIFNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd2FybmluZy1rZXlzIGZvciAnICsgJ21vcmUgaW5mb3JtYXRpb24uJyk7XG4gIH07XG59XG5cbnZhciBpc0FycmF5JDEgPSBBcnJheS5pc0FycmF5O1xuXG5mdW5jdGlvbiBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpIHtcbiAgdmFyIG1peGVkUmVmID0gZWxlbWVudC5yZWY7XG5cbiAgaWYgKG1peGVkUmVmICE9PSBudWxsICYmIHR5cGVvZiBtaXhlZFJlZiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWl4ZWRSZWYgIT09ICdvYmplY3QnKSB7XG4gICAge1xuICAgICAgLy8gVE9ETzogQ2xlYW4gdGhpcyB1cCBvbmNlIHdlIHR1cm4gb24gdGhlIHN0cmluZyByZWYgd2FybmluZyBmb3JcbiAgICAgIC8vIGV2ZXJ5b25lLCBiZWNhdXNlIHRoZSBzdHJpY3QgbW9kZSBjYXNlIHdpbGwgbm8gbG9uZ2VyIGJlIHJlbGV2YW50XG4gICAgICBpZiAoKHJldHVybkZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlIHx8IHdhcm5BYm91dFN0cmluZ1JlZnMpICYmIC8vIFdlIHdhcm4gaW4gUmVhY3RFbGVtZW50LmpzIGlmIG93bmVyIGFuZCBzZWxmIGFyZSBlcXVhbCBmb3Igc3RyaW5nIHJlZnNcbiAgICAgIC8vIGJlY2F1c2UgdGhlc2UgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGFuIGFycm93IGZ1bmN0aW9uXG4gICAgICAvLyB1c2luZyBhIGNvZGVtb2QuIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byB3YXJuIGFib3V0IHN0cmluZyByZWZzIGFnYWluLlxuICAgICAgIShlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9zZWxmICYmIGVsZW1lbnQuX293bmVyLnN0YXRlTm9kZSAhPT0gZWxlbWVudC5fc2VsZikpIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICAgIGlmICghZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9yKCdBIHN0cmluZyByZWYsIFwiJXNcIiwgaGFzIGJlZW4gZm91bmQgd2l0aGluIGEgc3RyaWN0IG1vZGUgdHJlZS4gJyArICdTdHJpbmcgcmVmcyBhcmUgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgYW5kIHNob3VsZCBiZSBhdm9pZGVkLiAnICsgJ1dlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBvciBjcmVhdGVSZWYoKSBpbnN0ZWFkLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIG1peGVkUmVmKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50Ll9vd25lcikge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgaW5zdDtcblxuICAgICAgaWYgKG93bmVyKSB7XG4gICAgICAgIHZhciBvd25lckZpYmVyID0gb3duZXI7XG5cbiAgICAgICAgaWYgKCEob3duZXJGaWJlci50YWcgPT09IENsYXNzQ29tcG9uZW50KSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgc3RyaW5nIHJlZnMuIFdlIHJlY29tbWVuZCB1c2luZyB1c2VSZWYoKSBpbnN0ZWFkLiBMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0ID0gb3duZXJGaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaW5zdCkge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiTWlzc2luZyBvd25lciBmb3Igc3RyaW5nIHJlZiBcIiArIG1peGVkUmVmICsgXCIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgc3RyaW5nUmVmID0gJycgKyBtaXhlZFJlZjsgLy8gQ2hlY2sgaWYgcHJldmlvdXMgc3RyaW5nIHJlZiBtYXRjaGVzIG5ldyBzdHJpbmcgcmVmXG5cbiAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGN1cnJlbnQucmVmICE9PSBudWxsICYmIHR5cGVvZiBjdXJyZW50LnJlZiA9PT0gJ2Z1bmN0aW9uJyAmJiBjdXJyZW50LnJlZi5fc3RyaW5nUmVmID09PSBzdHJpbmdSZWYpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQucmVmO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVmID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciByZWZzID0gaW5zdC5yZWZzO1xuXG4gICAgICAgIGlmIChyZWZzID09PSBlbXB0eVJlZnNPYmplY3QpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgbGF6eSBwb29sZWQgZnJvemVuIG9iamVjdCwgc28gd2UgbmVlZCB0byBpbml0aWFsaXplLlxuICAgICAgICAgIHJlZnMgPSBpbnN0LnJlZnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGRlbGV0ZSByZWZzW3N0cmluZ1JlZl07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVmc1tzdHJpbmdSZWZdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlZi5fc3RyaW5nUmVmID0gc3RyaW5nUmVmO1xuICAgICAgcmV0dXJuIHJlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEodHlwZW9mIG1peGVkUmVmID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhIHN0cmluZywgYW4gb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZVJlZigpLCBvciBudWxsLlwiICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFlbGVtZW50Ll9vd25lcikge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCByZWYgd2FzIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoXCIgKyBtaXhlZFJlZiArIFwiKSBidXQgbm8gb3duZXIgd2FzIHNldC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1heSBiZSBhZGRpbmcgYSByZWYgdG8gYSBmdW5jdGlvbiBjb21wb25lbnRcXG4yLiBZb3UgbWF5IGJlIGFkZGluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnQncyByZW5kZXIgbWV0aG9kXFxuMy4gWW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVmcy1tdXN0LWhhdmUtb3duZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtaXhlZFJlZjtcbn1cblxuZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCkge1xuICBpZiAocmV0dXJuRmliZXIudHlwZSAhPT0gJ3RleHRhcmVhJykge1xuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3Q2hpbGQpID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMobmV3Q2hpbGQpLmpvaW4oJywgJykgKyAnfScgOiBuZXdDaGlsZCkgKyBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShyZXR1cm5GaWJlci50eXBlKSB8fCAnQ29tcG9uZW50JztcblxuICAgIGlmIChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbY29tcG9uZW50TmFtZV0gPSB0cnVlO1xuXG4gICAgZXJyb3IoJ0Z1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiAnICsgJ3lvdSByZXR1cm4gYSBDb21wb25lbnQgaW5zdGVhZCBvZiA8Q29tcG9uZW50IC8+IGZyb20gcmVuZGVyLiAnICsgJ09yIG1heWJlIHlvdSBtZWFudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuIGl0LicpO1xuICB9XG59IC8vIFdlIGF2b2lkIGlubGluaW5nIHRoaXMgdG8gYXZvaWQgcG90ZW50aWFsIGRlb3B0cyBmcm9tIHVzaW5nIHRyeS9jYXRjaC5cbi8vIHRvIGJlIGFibGUgdG8gb3B0aW1pemUgZWFjaCBwYXRoIGluZGl2aWR1YWxseSBieSBicmFuY2hpbmcgZWFybHkuIFRoaXMgbmVlZHNcbi8vIGEgY29tcGlsZXIgb3Igd2UgY2FuIGRvIGl0IG1hbnVhbGx5LiBIZWxwZXJzIHRoYXQgZG9uJ3QgbmVlZCB0aGlzIGJyYW5jaGluZ1xuLy8gbGl2ZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24uXG5cblxuZnVuY3Rpb24gQ2hpbGRSZWNvbmNpbGVyKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICBpZiAoIXNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIE5vb3AuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBEZWxldGlvbnMgYXJlIGFkZGVkIGluIHJldmVyc2VkIG9yZGVyIHNvIHdlIGFkZCBpdCB0byB0aGUgZnJvbnQuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJldHVybiBmaWJlcidzIGVmZmVjdCBsaXN0IGlzIGVtcHR5IGV4Y2VwdCBmb3JcbiAgICAvLyBkZWxldGlvbnMsIHNvIHdlIGNhbiBqdXN0IGFwcGVuZCB0aGUgZGVsZXRpb24gdG8gdGhlIGxpc3QuIFRoZSByZW1haW5pbmdcbiAgICAvLyBlZmZlY3RzIGFyZW4ndCBhZGRlZCB1bnRpbCB0aGUgY29tcGxldGUgcGhhc2UuIE9uY2Ugd2UgaW1wbGVtZW50XG4gICAgLy8gcmVzdW1pbmcsIHRoaXMgbWF5IG5vdCBiZSB0cnVlLlxuXG5cbiAgICB2YXIgbGFzdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3Q7XG5cbiAgICBpZiAobGFzdCAhPT0gbnVsbCkge1xuICAgICAgbGFzdC5uZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm5GaWJlci5maXJzdEVmZmVjdCA9IHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjaGlsZFRvRGVsZXRlO1xuICAgIH1cblxuICAgIGNoaWxkVG9EZWxldGUubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgY2hpbGRUb0RlbGV0ZS5mbGFncyA9IERlbGV0aW9uO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBOb29wLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSAvLyBUT0RPOiBGb3IgdGhlIHNob3VsZENsb25lIGNhc2UsIHRoaXMgY291bGQgYmUgbWljcm8tb3B0aW1pemVkIGEgYml0IGJ5XG4gICAgLy8gYXNzdW1pbmcgdGhhdCBhZnRlciB0aGUgZmlyc3QgY2hpbGQgd2UndmUgYWxyZWFkeSBhZGRlZCBldmVyeXRoaW5nLlxuXG5cbiAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkVG9EZWxldGUgIT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZFRvRGVsZXRlKTtcbiAgICAgIGNoaWxkVG9EZWxldGUgPSBjaGlsZFRvRGVsZXRlLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBtYXBSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyBjaGlsZHJlbiB0byBhIHRlbXBvcmFyeSBtYXAgc28gdGhhdCB3ZSBjYW4gZmluZCB0aGVtIGJ5XG4gICAgLy8ga2V5cyBxdWlja2x5LiBJbXBsaWNpdCAobnVsbCkga2V5cyBnZXQgYWRkZWQgdG8gdGhpcyBzZXQgd2l0aCB0aGVpciBpbmRleFxuICAgIC8vIGluc3RlYWQuXG4gICAgdmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7XG4gICAgdmFyIGV4aXN0aW5nQ2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChleGlzdGluZ0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBpZiAoZXhpc3RpbmdDaGlsZC5rZXkgIT09IG51bGwpIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5rZXksIGV4aXN0aW5nQ2hpbGQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5zZXQoZXhpc3RpbmdDaGlsZC5pbmRleCwgZXhpc3RpbmdDaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGV4aXN0aW5nQ2hpbGQgPSBleGlzdGluZ0NoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gIH1cblxuICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IHNldCBzaWJsaW5nIHRvIG51bGwgYW5kIGluZGV4IHRvIDAgaGVyZSBiZWNhdXNlIGl0IGlzIGVhc3lcbiAgICAvLyB0byBmb3JnZXQgdG8gZG8gYmVmb3JlIHJldHVybmluZyBpdC4gRS5nLiBmb3IgdGhlIHNpbmdsZSBjaGlsZCBjYXNlLlxuICAgIHZhciBjbG9uZSA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKGZpYmVyLCBwZW5kaW5nUHJvcHMpO1xuICAgIGNsb25lLmluZGV4ID0gMDtcbiAgICBjbG9uZS5zaWJsaW5nID0gbnVsbDtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0luZGV4KSB7XG4gICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcblxuICAgIGlmICghc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgLy8gTm9vcC5cbiAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnQgPSBuZXdGaWJlci5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEluZGV4ID0gY3VycmVudC5pbmRleDtcblxuICAgICAgaWYgKG9sZEluZGV4IDwgbGFzdFBsYWNlZEluZGV4KSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBtb3ZlLlxuICAgICAgICBuZXdGaWJlci5mbGFncyA9IFBsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXRlbSBjYW4gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgcmV0dXJuIG9sZEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGlzIGFuIGluc2VydGlvbi5cbiAgICAgIG5ld0ZpYmVyLmZsYWdzID0gUGxhY2VtZW50O1xuICAgICAgcmV0dXJuIGxhc3RQbGFjZWRJbmRleDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgLy8gVGhpcyBpcyBzaW1wbGVyIGZvciB0aGUgc2luZ2xlIGNoaWxkIGNhc2UuIFdlIG9ubHkgbmVlZCB0byBkbyBhXG4gICAgLy8gcGxhY2VtZW50IGZvciBpbnNlcnRpbmcgbmV3IGNoaWxkcmVuLlxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgbmV3RmliZXIuZmxhZ3MgPSBQbGFjZW1lbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0ZpYmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8IGN1cnJlbnQudGFnICE9PSBIb3N0VGV4dCkge1xuICAgICAgLy8gSW5zZXJ0XG4gICAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVRleHQodGV4dENvbnRlbnQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlXG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCB0ZXh0Q29udGVudCk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoY3VycmVudC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGN1cnJlbnQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgLy8gTW92ZSBiYXNlZCBvbiBpbmRleFxuICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKTtcbiAgICAgICAgZXhpc3RpbmcucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAge1xuICAgICAgICAgIGV4aXN0aW5nLl9kZWJ1Z1NvdXJjZSA9IGVsZW1lbnQuX3NvdXJjZTtcbiAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgfVxuICAgIH0gLy8gSW5zZXJ0XG5cblxuICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnQsIGVsZW1lbnQpO1xuICAgIGNyZWF0ZWQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gSG9zdFBvcnRhbCB8fCBjdXJyZW50LnN0YXRlTm9kZS5jb250YWluZXJJbmZvICE9PSBwb3J0YWwuY29udGFpbmVySW5mbyB8fCBjdXJyZW50LnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiAhPT0gcG9ydGFsLmltcGxlbWVudGF0aW9uKSB7XG4gICAgICAvLyBJbnNlcnRcbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGVcbiAgICAgIHZhciBleGlzdGluZyA9IHVzZUZpYmVyKGN1cnJlbnQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICBleGlzdGluZy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBleGlzdGluZztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LnRhZyAhPT0gRnJhZ21lbnQpIHtcbiAgICAgIC8vIEluc2VydFxuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmcmFnbWVudCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIGtleSk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZVxuICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY3VycmVudCwgZnJhZ21lbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBrZXlzLiBJZiB0aGUgcHJldmlvdXMgbm9kZSBpcyBpbXBsaWNpdGx5IGtleWVkXG4gICAgICAvLyB3ZSBjYW4gY29udGludWUgdG8gcmVwbGFjZSBpdCB3aXRob3V0IGFib3J0aW5nIGV2ZW4gaWYgaXQgaXMgbm90IGEgdGV4dFxuICAgICAgLy8gbm9kZS5cbiAgICAgIHZhciBjcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tVGV4dCgnJyArIG5ld0NoaWxkLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9jcmVhdGVkID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpO1xuXG4gICAgICAgICAgICBfY3JlYXRlZC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIG51bGwsIG5ld0NoaWxkKTtcbiAgICAgICAgICAgIF9jcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfY3JlYXRlZDIgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwobmV3Q2hpbGQsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcblxuICAgICAgICAgICAgX2NyZWF0ZWQyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVkMjtcbiAgICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0FycmF5JDEobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgIHZhciBfY3JlYXRlZDMgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChuZXdDaGlsZCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMsIG51bGwpO1xuXG4gICAgICAgIF9jcmVhdGVkMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVkMztcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgIC8vIFVwZGF0ZSB0aGUgZmliZXIgaWYgdGhlIGtleXMgbWF0Y2gsIG90aGVyd2lzZSByZXR1cm4gbnVsbC5cbiAgICB2YXIga2V5ID0gb2xkRmliZXIgIT09IG51bGwgPyBvbGRGaWJlci5rZXkgOiBudWxsO1xuXG4gICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIG5ld0NoaWxkID09PSAnbnVtYmVyJykge1xuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIGtleXMuIElmIHRoZSBwcmV2aW91cyBub2RlIGlzIGltcGxpY2l0bHkga2V5ZWRcbiAgICAgIC8vIHdlIGNhbiBjb250aW51ZSB0byByZXBsYWNlIGl0IHdpdGhvdXQgYWJvcnRpbmcgZXZlbiBpZiBpdCBpcyBub3QgYSB0ZXh0XG4gICAgICAvLyBub2RlLlxuICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVRleHROb2RlKHJldHVybkZpYmVyLCBvbGRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywga2V5KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlmIChuZXdDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgaWYgKGtleSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KHJldHVybkZpYmVyLCBvbGRGaWJlciwgbmV3Q2hpbGQsIGxhbmVzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgfVxuXG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBuZXdDaGlsZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuT25GdW5jdGlvblR5cGUocmV0dXJuRmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUZXh0IG5vZGVzIGRvbid0IGhhdmUga2V5cywgc28gd2UgbmVpdGhlciBoYXZlIHRvIGNoZWNrIHRoZSBvbGQgbm9yXG4gICAgICAvLyBuZXcgbm9kZSBmb3IgdGhlIGtleS4gSWYgYm90aCBhcmUgdGV4dCBub2RlcywgdGhleSBtYXRjaC5cbiAgICAgIHZhciBtYXRjaGVkRmliZXIgPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG1hdGNoZWRGaWJlciwgJycgKyBuZXdDaGlsZCwgbGFuZXMpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsKSB7XG4gICAgICBzd2l0Y2ggKG5ld0NoaWxkLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBfbWF0Y2hlZEZpYmVyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICBpZiAobmV3Q2hpbGQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlRnJhZ21lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLCBsYW5lcywgbmV3Q2hpbGQua2V5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUVsZW1lbnQocmV0dXJuRmliZXIsIF9tYXRjaGVkRmliZXIsIG5ld0NoaWxkLCBsYW5lcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIyID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3Q2hpbGQua2V5ID09PSBudWxsID8gbmV3SWR4IDogbmV3Q2hpbGQua2V5KSB8fCBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBfbWF0Y2hlZEZpYmVyMiwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkgfHwgZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgICAgdmFyIF9tYXRjaGVkRmliZXIzID0gZXhpc3RpbmdDaGlsZHJlbi5nZXQobmV3SWR4KSB8fCBudWxsO1xuXG4gICAgICAgIHJldHVybiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgX21hdGNoZWRGaWJlcjMsIG5ld0NoaWxkLCBsYW5lcywgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogV2FybnMgaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUgb3IgbWlzc2luZyBrZXlcbiAgICovXG5cblxuICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkS2V5KGNoaWxkLCBrbm93bktleXMsIHJldHVybkZpYmVyKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcgfHwgY2hpbGQgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChjaGlsZC4kJHR5cGVvZikge1xuICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICB3YXJuRm9yTWlzc2luZ0tleShjaGlsZCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgIHZhciBrZXkgPSBjaGlsZC5rZXk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChrbm93bktleXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgha25vd25LZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlcnJvcignRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCBgJXNgLiAnICsgJ0tleXMgc2hvdWxkIGJlIHVuaXF1ZSBzbyB0aGF0IGNvbXBvbmVudHMgbWFpbnRhaW4gdGhlaXIgaWRlbnRpdHkgJyArICdhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSAnICsgJ2R1cGxpY2F0ZWQgYW5kL29yIG9taXR0ZWQg4oCUIHRoZSBiZWhhdmlvciBpcyB1bnN1cHBvcnRlZCBhbmQgJyArICdjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi4nLCBrZXkpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtub3duS2V5cztcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbiwgbGFuZXMpIHtcbiAgICAvLyBUaGlzIGFsZ29yaXRobSBjYW4ndCBvcHRpbWl6ZSBieSBzZWFyY2hpbmcgZnJvbSBib3RoIGVuZHMgc2luY2Ugd2VcbiAgICAvLyBkb24ndCBoYXZlIGJhY2twb2ludGVycyBvbiBmaWJlcnMuIEknbSB0cnlpbmcgdG8gc2VlIGhvdyBmYXIgd2UgY2FuIGdldFxuICAgIC8vIHdpdGggdGhhdCBtb2RlbC4gSWYgaXQgZW5kcyB1cCBub3QgYmVpbmcgd29ydGggdGhlIHRyYWRlb2Zmcywgd2UgY2FuXG4gICAgLy8gYWRkIGl0IGxhdGVyLlxuICAgIC8vIEV2ZW4gd2l0aCBhIHR3byBlbmRlZCBvcHRpbWl6YXRpb24sIHdlJ2Qgd2FudCB0byBvcHRpbWl6ZSBmb3IgdGhlIGNhc2VcbiAgICAvLyB3aGVyZSB0aGVyZSBhcmUgZmV3IGNoYW5nZXMgYW5kIGJydXRlIGZvcmNlIHRoZSBjb21wYXJpc29uIGluc3RlYWQgb2ZcbiAgICAvLyBnb2luZyBmb3IgdGhlIE1hcC4gSXQnZCBsaWtlIHRvIGV4cGxvcmUgaGl0dGluZyB0aGF0IHBhdGggZmlyc3QgaW5cbiAgICAvLyBmb3J3YXJkLW9ubHkgbW9kZSBhbmQgb25seSBnbyBmb3IgdGhlIE1hcCBvbmNlIHdlIG5vdGljZSB0aGF0IHdlIG5lZWRcbiAgICAvLyBsb3RzIG9mIGxvb2sgYWhlYWQuIFRoaXMgZG9lc24ndCBoYW5kbGUgcmV2ZXJzYWwgYXMgd2VsbCBhcyB0d28gZW5kZWRcbiAgICAvLyBzZWFyY2ggYnV0IHRoYXQncyB1bnVzdWFsLiBCZXNpZGVzLCBmb3IgdGhlIHR3byBlbmRlZCBvcHRpbWl6YXRpb24gdG9cbiAgICAvLyB3b3JrIG9uIEl0ZXJhYmxlcywgd2UnZCBuZWVkIHRvIGNvcHkgdGhlIHdob2xlIHNldC5cbiAgICAvLyBJbiB0aGlzIGZpcnN0IGl0ZXJhdGlvbiwgd2UnbGwganVzdCBsaXZlIHdpdGggaGl0dGluZyB0aGUgYmFkIGNhc2VcbiAgICAvLyAoYWRkaW5nIGV2ZXJ5dGhpbmcgdG8gYSBNYXApIGluIGZvciBldmVyeSBpbnNlcnQvbW92ZS5cbiAgICAvLyBJZiB5b3UgY2hhbmdlIHRoaXMgY29kZSwgYWxzbyB1cGRhdGUgcmVjb25jaWxlQ2hpbGRyZW5JdGVyYXRvcigpIHdoaWNoXG4gICAgLy8gdXNlcyB0aGUgc2FtZSBhbGdvcml0aG0uXG4gICAge1xuICAgICAgLy8gRmlyc3QsIHZhbGlkYXRlIGtleXMuXG4gICAgICB2YXIga25vd25LZXlzID0gbnVsbDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBuZXdDaGlsZHJlbltpXTtcbiAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShjaGlsZCwga25vd25LZXlzLCByZXR1cm5GaWJlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKSB7XG4gICAgICBpZiAob2xkRmliZXIuaW5kZXggPiBuZXdJZHgpIHtcbiAgICAgICAgbmV4dE9sZEZpYmVyID0gb2xkRmliZXI7XG4gICAgICAgIG9sZEZpYmVyID0gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyLnNpYmxpbmc7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdGaWJlciA9IHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChuZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBUaGlzIGJyZWFrcyBvbiBlbXB0eSBzbG90cyBsaWtlIG51bGwgY2hpbGRyZW4uIFRoYXQnc1xuICAgICAgICAvLyB1bmZvcnR1bmF0ZSBiZWNhdXNlIGl0IHRyaWdnZXJzIHRoZSBzbG93IHBhdGggYWxsIHRoZSB0aW1lLiBXZSBuZWVkXG4gICAgICAgIC8vIGEgYmV0dGVyIHdheSB0byBjb21tdW5pY2F0ZSB3aGV0aGVyIHRoaXMgd2FzIGEgbWlzcyBvciBudWxsLFxuICAgICAgICAvLyBib29sZWFuLCB1bmRlZmluZWQsIGV0Yy5cbiAgICAgICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgaWYgKG9sZEZpYmVyICYmIG5ld0ZpYmVyLmFsdGVybmF0ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIHNsb3QsIGJ1dCB3ZSBkaWRuJ3QgcmV1c2UgdGhlIGV4aXN0aW5nIGZpYmVyLCBzbyB3ZVxuICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBleGlzdGluZyBjaGlsZC5cbiAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSBvdXQgb2YgdGhlIGxvb3AuIFRoaXMgb25seSBoYXBwZW5zIGZvciB0aGUgZmlyc3QgcnVuLlxuICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gbmV3RmliZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPOiBEZWZlciBzaWJsaW5ncyBpZiB3ZSdyZSBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IGZvciB0aGlzIHNsb3QuXG4gICAgICAgIC8vIEkuZS4gaWYgd2UgaGFkIG51bGwgdmFsdWVzIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIGRlZmVyIHRoaXNcbiAgICAgICAgLy8gZm9yIGVhY2ggbnVsbCB2YWx1ZS4gSG93ZXZlciwgd2UgYWxzbyBkb24ndCB3YW50IHRvIGNhbGwgdXBkYXRlU2xvdFxuICAgICAgICAvLyB3aXRoIHRoZSBwcmV2aW91cyBvbmUuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyO1xuICAgICAgfVxuXG4gICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICB9XG5cbiAgICBpZiAobmV3SWR4ID09PSBuZXdDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbmV3IGNoaWxkcmVuLiBXZSBjYW4gZGVsZXRlIHRoZSByZXN0LlxuICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH1cblxuICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgbW9yZSBleGlzdGluZyBjaGlsZHJlbiB3ZSBjYW4gY2hvb3NlIGEgZmFzdCBwYXRoXG4gICAgICAvLyBzaW5jZSB0aGUgcmVzdCB3aWxsIGFsbCBiZSBpbnNlcnRpb25zLlxuICAgICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgICAgaWYgKF9uZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IF9uZXdGaWJlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7IG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgbmV3SWR4KyspIHtcbiAgICAgIHZhciBfbmV3RmliZXIyID0gdXBkYXRlRnJvbU1hcChleGlzdGluZ0NoaWxkcmVuLCByZXR1cm5GaWJlciwgbmV3SWR4LCBuZXdDaGlsZHJlbltuZXdJZHhdLCBsYW5lcyk7XG5cbiAgICAgIGlmIChfbmV3RmliZXIyICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgICAgaWYgKF9uZXdGaWJlcjIuYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgbmV3IGZpYmVyIGlzIGEgd29yayBpbiBwcm9ncmVzcywgYnV0IGlmIHRoZXJlIGV4aXN0cyBhXG4gICAgICAgICAgICAvLyBjdXJyZW50LCB0aGF0IG1lYW5zIHRoYXQgd2UgcmV1c2VkIHRoZSBmaWJlci4gV2UgbmVlZCB0byBkZWxldGVcbiAgICAgICAgICAgIC8vIGl0IGZyb20gdGhlIGNoaWxkIGxpc3Qgc28gdGhhdCB3ZSBkb24ndCBhZGQgaXQgdG8gdGhlIGRlbGV0aW9uXG4gICAgICAgICAgICAvLyBsaXN0LlxuICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5kZWxldGUoX25ld0ZpYmVyMi5rZXkgPT09IG51bGwgPyBuZXdJZHggOiBfbmV3RmliZXIyLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGFzdFBsYWNlZEluZGV4ID0gcGxhY2VDaGlsZChfbmV3RmliZXIyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgICAgaWYgKHByZXZpb3VzTmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIyO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgIC8vIEFueSBleGlzdGluZyBjaGlsZHJlbiB0aGF0IHdlcmVuJ3QgY29uc3VtZWQgYWJvdmUgd2VyZSBkZWxldGVkLiBXZSBuZWVkXG4gICAgICAvLyB0byBhZGQgdGhlbSB0byB0aGUgZGVsZXRpb24gbGlzdC5cbiAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZHJlbkl0ZXJhYmxlLCBsYW5lcykge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgcmVjb25jaWxlQ2hpbGRyZW5BcnJheSgpLFxuICAgIC8vIGJ1dCB1c2luZyB0aGUgaXRlcmF0b3IgaW5zdGVhZC5cbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICBpZiAoISh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVuZGVyaW5nIEdlbmVyYXRvcnMgYmVjYXVzZSBpdCdzIGEgbXV0YXRpb24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xMjk5NVxuICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgLy8gJEZsb3dGaXhNZSBGbG93IGRvZXNuJ3Qga25vdyBhYm91dCB0b1N0cmluZ1RhZ1xuICAgICAgbmV3Q2hpbGRyZW5JdGVyYWJsZVtTeW1ib2wudG9TdHJpbmdUYWddID09PSAnR2VuZXJhdG9yJykge1xuICAgICAgICBpZiAoIWRpZFdhcm5BYm91dEdlbmVyYXRvcnMpIHtcbiAgICAgICAgICBlcnJvcignVXNpbmcgR2VuZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgJyArICd1bmV4cGVjdGVkIHJlc3VsdHMgYmVjYXVzZSBlbnVtZXJhdGluZyBhIGdlbmVyYXRvciBtdXRhdGVzIGl0LiAnICsgJ1lvdSBtYXkgY29udmVydCBpdCB0byBhbiBhcnJheSB3aXRoIGBBcnJheS5mcm9tKClgIG9yIHRoZSAnICsgJ2BbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gS2VlcCBpbiBtaW5kICcgKyAneW91IG1pZ2h0IG5lZWQgdG8gcG9seWZpbGwgdGhlc2UgZmVhdHVyZXMgZm9yIG9sZGVyIGJyb3dzZXJzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2VuZXJhdG9ycyA9IHRydWU7XG4gICAgICB9IC8vIFdhcm4gYWJvdXQgdXNpbmcgTWFwcyBhcyBjaGlsZHJlblxuXG5cbiAgICAgIGlmIChuZXdDaGlsZHJlbkl0ZXJhYmxlLmVudHJpZXMgPT09IGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgZXJyb3IoJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICB9IC8vIEZpcnN0LCB2YWxpZGF0ZSBrZXlzLlxuICAgICAgLy8gV2UnbGwgZ2V0IGEgZGlmZmVyZW50IGl0ZXJhdG9yIGxhdGVyIGZvciB0aGUgbWFpbiBwYXNzLlxuXG5cbiAgICAgIHZhciBfbmV3Q2hpbGRyZW4gPSBpdGVyYXRvckZuLmNhbGwobmV3Q2hpbGRyZW5JdGVyYWJsZSk7XG5cbiAgICAgIGlmIChfbmV3Q2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIGtub3duS2V5cyA9IG51bGw7XG5cbiAgICAgICAgdmFyIF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgICAgICBmb3IgKDsgIV9zdGVwLmRvbmU7IF9zdGVwID0gX25ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IF9zdGVwLnZhbHVlO1xuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoY2hpbGQsIGtub3duS2V5cywgcmV0dXJuRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5ld0NoaWxkcmVuID0gaXRlcmF0b3JGbi5jYWxsKG5ld0NoaWxkcmVuSXRlcmFibGUpO1xuXG4gICAgaWYgKCEobmV3Q2hpbGRyZW4gIT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQW4gaXRlcmFibGUgb2JqZWN0IHByb3ZpZGVkIG5vIGl0ZXJhdG9yLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsO1xuICAgIHZhciBwcmV2aW91c05ld0ZpYmVyID0gbnVsbDtcbiAgICB2YXIgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZDtcbiAgICB2YXIgbGFzdFBsYWNlZEluZGV4ID0gMDtcbiAgICB2YXIgbmV3SWR4ID0gMDtcbiAgICB2YXIgbmV4dE9sZEZpYmVyID0gbnVsbDtcbiAgICB2YXIgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKTtcblxuICAgIGZvciAoOyBvbGRGaWJlciAhPT0gbnVsbCAmJiAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSkge1xuICAgICAgaWYgKG9sZEZpYmVyLmluZGV4ID4gbmV3SWR4KSB7XG4gICAgICAgIG5leHRPbGRGaWJlciA9IG9sZEZpYmVyO1xuICAgICAgICBvbGRGaWJlciA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KHJldHVybkZpYmVyLCBvbGRGaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAobmV3RmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBicmVha3Mgb24gZW1wdHkgc2xvdHMgbGlrZSBudWxsIGNoaWxkcmVuLiBUaGF0J3NcbiAgICAgICAgLy8gdW5mb3J0dW5hdGUgYmVjYXVzZSBpdCB0cmlnZ2VycyB0aGUgc2xvdyBwYXRoIGFsbCB0aGUgdGltZS4gV2UgbmVlZFxuICAgICAgICAvLyBhIGJldHRlciB3YXkgdG8gY29tbXVuaWNhdGUgd2hldGhlciB0aGlzIHdhcyBhIG1pc3Mgb3IgbnVsbCxcbiAgICAgICAgLy8gYm9vbGVhbiwgdW5kZWZpbmVkLCBldGMuXG4gICAgICAgIGlmIChvbGRGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIG9sZEZpYmVyID0gbmV4dE9sZEZpYmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAgIGlmIChvbGRGaWJlciAmJiBuZXdGaWJlci5hbHRlcm5hdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBzbG90LCBidXQgd2UgZGlkbid0IHJldXNlIHRoZSBleGlzdGluZyBmaWJlciwgc28gd2VcbiAgICAgICAgICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGUgZXhpc3RpbmcgY2hpbGQuXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKG5ld0ZpYmVyLCBsYXN0UGxhY2VkSW5kZXgsIG5ld0lkeCk7XG5cbiAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogRGVmZXIgc2libGluZ3MgaWYgd2UncmUgbm90IGF0IHRoZSByaWdodCBpbmRleCBmb3IgdGhpcyBzbG90LlxuICAgICAgICAvLyBJLmUuIGlmIHdlIGhhZCBudWxsIHZhbHVlcyBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byBkZWZlciB0aGlzXG4gICAgICAgIC8vIGZvciBlYWNoIG51bGwgdmFsdWUuIEhvd2V2ZXIsIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBjYWxsIHVwZGF0ZVNsb3RcbiAgICAgICAgLy8gd2l0aCB0aGUgcHJldmlvdXMgb25lLlxuICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBuZXdGaWJlcjtcbiAgICAgIH1cblxuICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG5ld0ZpYmVyO1xuICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgfVxuXG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBuZXcgY2hpbGRyZW4uIFdlIGNhbiBkZWxldGUgdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgfVxuXG4gICAgaWYgKG9sZEZpYmVyID09PSBudWxsKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGV4aXN0aW5nIGNoaWxkcmVuIHdlIGNhbiBjaG9vc2UgYSBmYXN0IHBhdGhcbiAgICAgIC8vIHNpbmNlIHRoZSByZXN0IHdpbGwgYWxsIGJlIGluc2VydGlvbnMuXG4gICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KCkpIHtcbiAgICAgICAgdmFyIF9uZXdGaWJlcjMgPSBjcmVhdGVDaGlsZChyZXR1cm5GaWJlciwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChfbmV3RmliZXIzID09PSBudWxsKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsYXN0UGxhY2VkSW5kZXggPSBwbGFjZUNoaWxkKF9uZXdGaWJlcjMsIGxhc3RQbGFjZWRJbmRleCwgbmV3SWR4KTtcblxuICAgICAgICBpZiAocHJldmlvdXNOZXdGaWJlciA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRPRE86IE1vdmUgb3V0IG9mIHRoZSBsb29wLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IgdGhlIGZpcnN0IHJ1bi5cbiAgICAgICAgICByZXN1bHRpbmdGaXJzdENoaWxkID0gX25ld0ZpYmVyMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBfbmV3RmliZXIzO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IF9uZXdGaWJlcjM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgIH0gLy8gQWRkIGFsbCBjaGlsZHJlbiB0byBhIGtleSBtYXAgZm9yIHF1aWNrIGxvb2t1cHMuXG5cblxuICAgIHZhciBleGlzdGluZ0NoaWxkcmVuID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIG9sZEZpYmVyKTsgLy8gS2VlcCBzY2FubmluZyBhbmQgdXNlIHRoZSBtYXAgdG8gcmVzdG9yZSBkZWxldGVkIGl0ZW1zIGFzIG1vdmVzLlxuXG4gICAgZm9yICg7ICFzdGVwLmRvbmU7IG5ld0lkeCsrLCBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpKSB7XG4gICAgICB2YXIgX25ld0ZpYmVyNCA9IHVwZGF0ZUZyb21NYXAoZXhpc3RpbmdDaGlsZHJlbiwgcmV0dXJuRmliZXIsIG5ld0lkeCwgc3RlcC52YWx1ZSwgbGFuZXMpO1xuXG4gICAgICBpZiAoX25ld0ZpYmVyNCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgICAgIGlmIChfbmV3RmliZXI0LmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gVGhlIG5ldyBmaWJlciBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MsIGJ1dCBpZiB0aGVyZSBleGlzdHMgYVxuICAgICAgICAgICAgLy8gY3VycmVudCwgdGhhdCBtZWFucyB0aGF0IHdlIHJldXNlZCB0aGUgZmliZXIuIFdlIG5lZWQgdG8gZGVsZXRlXG4gICAgICAgICAgICAvLyBpdCBmcm9tIHRoZSBjaGlsZCBsaXN0IHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IHRvIHRoZSBkZWxldGlvblxuICAgICAgICAgICAgLy8gbGlzdC5cbiAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZGVsZXRlKF9uZXdGaWJlcjQua2V5ID09PSBudWxsID8gbmV3SWR4IDogX25ld0ZpYmVyNC5rZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RQbGFjZWRJbmRleCA9IHBsYWNlQ2hpbGQoX25ld0ZpYmVyNCwgbGFzdFBsYWNlZEluZGV4LCBuZXdJZHgpO1xuXG4gICAgICAgIGlmIChwcmV2aW91c05ld0ZpYmVyID09PSBudWxsKSB7XG4gICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZCA9IF9uZXdGaWJlcjQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gX25ld0ZpYmVyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBfbmV3RmliZXI0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaG91bGRUcmFja1NpZGVFZmZlY3RzKSB7XG4gICAgICAvLyBBbnkgZXhpc3RpbmcgY2hpbGRyZW4gdGhhdCB3ZXJlbid0IGNvbnN1bWVkIGFib3ZlIHdlcmUgZGVsZXRlZC4gV2UgbmVlZFxuICAgICAgLy8gdG8gYWRkIHRoZW0gdG8gdGhlIGRlbGV0aW9uIGxpc3QuXG4gICAgICBleGlzdGluZ0NoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBjaGVjayBmb3Iga2V5cyBvbiB0ZXh0IG5vZGVzIHNpbmNlIHdlIGRvbid0IGhhdmUgYVxuICAgIC8vIHdheSB0byBkZWZpbmUgdGhlbS5cbiAgICBpZiAoY3VycmVudEZpcnN0Q2hpbGQgIT09IG51bGwgJiYgY3VycmVudEZpcnN0Q2hpbGQudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG5vZGUgc28gbGV0J3MganVzdCB1cGRhdGUgaXQgYW5kIGRlbGV0ZVxuICAgICAgLy8gdGhlIHJlc3QuXG4gICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQuc2libGluZyk7XG4gICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgdGV4dENvbnRlbnQpO1xuICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICByZXR1cm4gZXhpc3Rpbmc7XG4gICAgfSAvLyBUaGUgZXhpc3RpbmcgZmlyc3QgY2hpbGQgaXMgbm90IGEgdGV4dCBub2RlIHNvIHdlIG5lZWQgdG8gY3JlYXRlIG9uZVxuICAgIC8vIGFuZCBkZWxldGUgdGhlIGV4aXN0aW5nIG9uZXMuXG5cblxuICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21UZXh0KHRleHRDb250ZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZVNpbmdsZUVsZW1lbnQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50LCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgICB2YXIgY2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogSWYga2V5ID09PSBudWxsIGFuZCBjaGlsZC5rZXkgPT09IG51bGwsIHRoZW4gdGhpcyBvbmx5IGFwcGxpZXMgdG9cbiAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAgaWYgKGNoaWxkLmtleSA9PT0ga2V5KSB7XG4gICAgICAgIHN3aXRjaCAoY2hpbGQudGFnKSB7XG4gICAgICAgICAgY2FzZSBGcmFnbWVudDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmcgPSB1c2VGaWJlcihjaGlsZCwgZWxlbWVudC5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgICAgICAgICAgICAgICBleGlzdGluZy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBCbG9jazpcblxuICAgICAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgZmFsbHRocm91Z2ggaGVyZSBpZiBlbmFibGVCbG9ja3NBUEkgaXMgbm90IG9uLlxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZWQgbm8tZmFsbHRocm91Z2hcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZC5lbGVtZW50VHlwZSA9PT0gZWxlbWVudC50eXBlIHx8ICggLy8gS2VlcCB0aGlzIGNoZWNrIGlubGluZSBzbyBpdCBvbmx5IHJ1bnMgb24gdGhlIGZhbHNlIHBhdGg6XG4gICAgICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY2hpbGQsIGVsZW1lbnQpICkpIHtcbiAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgX2V4aXN0aW5nMyA9IHVzZUZpYmVyKGNoaWxkLCBlbGVtZW50LnByb3BzKTtcblxuICAgICAgICAgICAgICAgIF9leGlzdGluZzMucmVmID0gY29lcmNlUmVmKHJldHVybkZpYmVyLCBjaGlsZCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIF9leGlzdGluZzMuX2RlYnVnU291cmNlID0gZWxlbWVudC5fc291cmNlO1xuICAgICAgICAgICAgICAgICAgX2V4aXN0aW5nMy5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZXhpc3RpbmczO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gLy8gRGlkbid0IG1hdGNoLlxuXG5cbiAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4ocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgY2hpbGQpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSkge1xuICAgICAgdmFyIGNyZWF0ZWQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChlbGVtZW50LnByb3BzLmNoaWxkcmVuLCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcywgZWxlbWVudC5rZXkpO1xuICAgICAgY3JlYXRlZC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBjcmVhdGVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgX2NyZWF0ZWQ0ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG5cbiAgICAgIF9jcmVhdGVkNC5yZWYgPSBjb2VyY2VSZWYocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBlbGVtZW50KTtcbiAgICAgIF9jcmVhdGVkNC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgIHJldHVybiBfY3JlYXRlZDQ7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgcG9ydGFsLCBsYW5lcykge1xuICAgIHZhciBrZXkgPSBwb3J0YWwua2V5O1xuICAgIHZhciBjaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAvLyBUT0RPOiBJZiBrZXkgPT09IG51bGwgYW5kIGNoaWxkLmtleSA9PT0gbnVsbCwgdGhlbiB0aGlzIG9ubHkgYXBwbGllcyB0b1xuICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICBpZiAoY2hpbGQua2V5ID09PSBrZXkpIHtcbiAgICAgICAgaWYgKGNoaWxkLnRhZyA9PT0gSG9zdFBvcnRhbCAmJiBjaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT0gcG9ydGFsLmNvbnRhaW5lckluZm8gJiYgY2hpbGQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uID09PSBwb3J0YWwuaW1wbGVtZW50YXRpb24pIHtcbiAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY2hpbGQuc2libGluZyk7XG4gICAgICAgICAgdmFyIGV4aXN0aW5nID0gdXNlRmliZXIoY2hpbGQsIHBvcnRhbC5jaGlsZHJlbiB8fCBbXSk7XG4gICAgICAgICAgZXhpc3RpbmcucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlZCA9IGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIHJldHVybkZpYmVyLm1vZGUsIGxhbmVzKTtcbiAgICBjcmVhdGVkLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgIHJldHVybiBjcmVhdGVkO1xuICB9IC8vIFRoaXMgQVBJIHdpbGwgdGFnIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSBzaWRlLWVmZmVjdCBvZiB0aGUgcmVjb25jaWxpYXRpb25cbiAgLy8gaXRzZWxmLiBUaGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNpZGUtZWZmZWN0IGxpc3QgYXMgd2UgcGFzcyB0aHJvdWdoIHRoZVxuICAvLyBjaGlsZHJlbiBhbmQgdGhlIHBhcmVudC5cblxuXG4gIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkRmliZXJzKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSB7XG4gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBub3QgcmVjdXJzaXZlLlxuICAgIC8vIElmIHRoZSB0b3AgbGV2ZWwgaXRlbSBpcyBhbiBhcnJheSwgd2UgdHJlYXQgaXQgYXMgYSBzZXQgb2YgY2hpbGRyZW4sXG4gICAgLy8gbm90IGFzIGEgZnJhZ21lbnQuIE5lc3RlZCBhcnJheXMgb24gdGhlIG90aGVyIGhhbmQgd2lsbCBiZSB0cmVhdGVkIGFzXG4gICAgLy8gZnJhZ21lbnQgbm9kZXMuIFJlY3Vyc2lvbiBoYXBwZW5zIGF0IHRoZSBub3JtYWwgZmxvdy5cbiAgICAvLyBIYW5kbGUgdG9wIGxldmVsIHVua2V5ZWQgZnJhZ21lbnRzIGFzIGlmIHRoZXkgd2VyZSBhcnJheXMuXG4gICAgLy8gVGhpcyBsZWFkcyB0byBhbiBhbWJpZ3VpdHkgYmV0d2VlbiA8PntbLi4uXX08Lz4gYW5kIDw+Li4uPC8+LlxuICAgIC8vIFdlIHRyZWF0IHRoZSBhbWJpZ3VvdXMgY2FzZXMgYWJvdmUgdGhlIHNhbWUuXG4gICAgdmFyIGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQgPSB0eXBlb2YgbmV3Q2hpbGQgPT09ICdvYmplY3QnICYmIG5ld0NoaWxkICE9PSBudWxsICYmIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgJiYgbmV3Q2hpbGQua2V5ID09PSBudWxsO1xuXG4gICAgaWYgKGlzVW5rZXllZFRvcExldmVsRnJhZ21lbnQpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW47XG4gICAgfSAvLyBIYW5kbGUgb2JqZWN0IHR5cGVzXG5cblxuICAgIHZhciBpc09iamVjdCA9IHR5cGVvZiBuZXdDaGlsZCA9PT0gJ29iamVjdCcgJiYgbmV3Q2hpbGQgIT09IG51bGw7XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlRWxlbWVudChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykpO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIHBsYWNlU2luZ2xlQ2hpbGQocmVjb25jaWxlU2luZ2xlUG9ydGFsKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKSk7XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgbmV3Q2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZWNvbmNpbGVTaW5nbGVUZXh0Tm9kZShyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsICcnICsgbmV3Q2hpbGQsIGxhbmVzKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyYXkkMShuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkFycmF5KHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0SXRlcmF0b3JGbihuZXdDaGlsZCkpIHtcbiAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCwgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3QpIHtcbiAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgbmV3Q2hpbGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5ld0NoaWxkID09PSAndW5kZWZpbmVkJyAmJiAhaXNVbmtleWVkVG9wTGV2ZWxGcmFnbWVudCkge1xuICAgICAgLy8gSWYgdGhlIG5ldyBjaGlsZCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgcmV0dXJuIGZpYmVyIGlzIGEgY29tcG9zaXRlXG4gICAgICAvLyBjb21wb25lbnQsIHRocm93IGFuIGVycm9yLiBJZiBGaWJlciByZXR1cm4gdHlwZXMgYXJlIGRpc2FibGVkLFxuICAgICAgLy8gd2UgYWxyZWFkeSB0aHJldyBhYm92ZS5cbiAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSByZXR1cm5GaWJlci5zdGF0ZU5vZGU7XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnJlbmRlci5faXNNb2NrRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZSwgd2hpY2ggaGFuZGxlcyBib3RoXG4gICAgICAgIC8vIGZ1bmN0aW9ucyBhbmQgY2xhc3Nlc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVkIG5vLWZhbGx0aHJvdWdoXG5cbiAgICAgICAgY2FzZSBCbG9jazpcbiAgICAgICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIChnZXRDb21wb25lbnROYW1lKHJldHVybkZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnKSArIFwiKC4uLik6IE5vdGhpbmcgd2FzIHJldHVybmVkIGZyb20gcmVuZGVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSByZXR1cm4gc3RhdGVtZW50IGlzIG1pc3NpbmcuIE9yLCB0byByZW5kZXIgbm90aGluZywgcmV0dXJuIG51bGwuXCIgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9IC8vIFJlbWFpbmluZyBjYXNlcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZW1wdHkuXG5cblxuICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICB9XG5cbiAgcmV0dXJuIHJlY29uY2lsZUNoaWxkRmliZXJzO1xufVxuXG52YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBDaGlsZFJlY29uY2lsZXIodHJ1ZSk7XG52YXIgbW91bnRDaGlsZEZpYmVycyA9IENoaWxkUmVjb25jaWxlcihmYWxzZSk7XG5mdW5jdGlvbiBjbG9uZUNoaWxkRmliZXJzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSB7XG4gIGlmICghKGN1cnJlbnQgPT09IG51bGwgfHwgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPT09IGN1cnJlbnQuY2hpbGQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzLmNoaWxkID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRDaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICBuZXdDaGlsZC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcblxuICB3aGlsZSAoY3VycmVudENoaWxkLnNpYmxpbmcgIT09IG51bGwpIHtcbiAgICBjdXJyZW50Q2hpbGQgPSBjdXJyZW50Q2hpbGQuc2libGluZztcbiAgICBuZXdDaGlsZCA9IG5ld0NoaWxkLnNpYmxpbmcgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50Q2hpbGQsIGN1cnJlbnRDaGlsZC5wZW5kaW5nUHJvcHMpO1xuICAgIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB9XG5cbiAgbmV3Q2hpbGQuc2libGluZyA9IG51bGw7XG59IC8vIFJlc2V0IGEgd29ya0luUHJvZ3Jlc3MgY2hpbGQgc2V0IHRvIHByZXBhcmUgaXQgZm9yIGEgc2Vjb25kIHBhc3MuXG5cbmZ1bmN0aW9uIHJlc2V0Q2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGxhbmVzKSB7XG4gIHZhciBjaGlsZCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgIHJlc2V0V29ya0luUHJvZ3Jlc3MoY2hpbGQsIGxhbmVzKTtcbiAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gIH1cbn1cblxudmFyIE5PX0NPTlRFWFQgPSB7fTtcbnZhciBjb250ZXh0U3RhY2tDdXJzb3IkMSA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciBjb250ZXh0RmliZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcbnZhciByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihOT19DT05URVhUKTtcblxuZnVuY3Rpb24gcmVxdWlyZWRDb250ZXh0KGMpIHtcbiAgaWYgKCEoYyAhPT0gTk9fQ09OVEVYVCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJFeHBlY3RlZCBob3N0IGNvbnRleHQgdG8gZXhpc3QuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYztcbn1cblxuZnVuY3Rpb24gZ2V0Um9vdEhvc3RDb250YWluZXIoKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHJldHVybiByb290SW5zdGFuY2U7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Q29udGFpbmVyKGZpYmVyLCBuZXh0Um9vdEluc3RhbmNlKSB7XG4gIC8vIFB1c2ggY3VycmVudCByb290IGluc3RhbmNlIG9udG8gdGhlIHN0YWNrO1xuICAvLyBUaGlzIGFsbG93cyB1cyB0byByZXNldCByb290IHdoZW4gcG9ydGFscyBhcmUgcG9wcGVkLlxuICBwdXNoKHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLCBuZXh0Um9vdEluc3RhbmNlLCBmaWJlcik7IC8vIFRyYWNrIHRoZSBjb250ZXh0IGFuZCB0aGUgRmliZXIgdGhhdCBwcm92aWRlZCBpdC5cbiAgLy8gVGhpcyBlbmFibGVzIHVzIHRvIHBvcCBvbmx5IEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuXG4gIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7IC8vIEZpbmFsbHksIHdlIG5lZWQgdG8gcHVzaCB0aGUgaG9zdCBjb250ZXh0IHRvIHRoZSBzdGFjay5cbiAgLy8gSG93ZXZlciwgd2UgY2FuJ3QganVzdCBjYWxsIGdldFJvb3RIb3N0Q29udGV4dCgpIGFuZCBwdXNoIGl0IGJlY2F1c2VcbiAgLy8gd2UnZCBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjayBkZXBlbmRpbmcgb25cbiAgLy8gd2hldGhlciBnZXRSb290SG9zdENvbnRleHQoKSB0aHJvd3Mgc29tZXdoZXJlIGluIHJlbmRlcmVyIGNvZGUgb3Igbm90LlxuICAvLyBTbyB3ZSBwdXNoIGFuIGVtcHR5IHZhbHVlIGZpcnN0LiBUaGlzIGxldHMgdXMgc2FmZWx5IHVud2luZCBvbiBlcnJvcnMuXG5cbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgTk9fQ09OVEVYVCwgZmliZXIpO1xuICB2YXIgbmV4dFJvb3RDb250ZXh0ID0gZ2V0Um9vdEhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpOyAvLyBOb3cgdGhhdCB3ZSBrbm93IHRoaXMgZnVuY3Rpb24gZG9lc24ndCB0aHJvdywgcmVwbGFjZSBpdC5cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcHVzaChjb250ZXh0U3RhY2tDdXJzb3IkMSwgbmV4dFJvb3RDb250ZXh0LCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHBvcEhvc3RDb250YWluZXIoZmliZXIpIHtcbiAgcG9wKGNvbnRleHRTdGFja0N1cnNvciQxLCBmaWJlcik7XG4gIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpO1xuICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gIHZhciByb290SW5zdGFuY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gIHZhciBjb250ZXh0ID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvciQxLmN1cnJlbnQpO1xuICB2YXIgbmV4dENvbnRleHQgPSBnZXRDaGlsZEhvc3RDb250ZXh0KGNvbnRleHQsIGZpYmVyLnR5cGUpOyAvLyBEb24ndCBwdXNoIHRoaXMgRmliZXIncyBjb250ZXh0IHVubGVzcyBpdCdzIHVuaXF1ZS5cblxuICBpZiAoY29udGV4dCA9PT0gbmV4dENvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH0gLy8gVHJhY2sgdGhlIGNvbnRleHQgYW5kIHRoZSBGaWJlciB0aGF0IHByb3ZpZGVkIGl0LlxuICAvLyBUaGlzIGVuYWJsZXMgdXMgdG8gcG9wIG9ubHkgRmliZXJzIHRoYXQgcHJvdmlkZSB1bmlxdWUgY29udGV4dHMuXG5cblxuICBwdXNoKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlciwgZmliZXIpO1xuICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciQxLCBuZXh0Q29udGV4dCwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwb3BIb3N0Q29udGV4dChmaWJlcikge1xuICAvLyBEbyBub3QgcG9wIHVubGVzcyB0aGlzIEZpYmVyIHByb3ZpZGVkIHRoZSBjdXJyZW50IGNvbnRleHQuXG4gIC8vIHB1c2hIb3N0Q29udGV4dCgpIG9ubHkgcHVzaGVzIEZpYmVycyB0aGF0IHByb3ZpZGUgdW5pcXVlIGNvbnRleHRzLlxuICBpZiAoY29udGV4dEZpYmVyU3RhY2tDdXJzb3IuY3VycmVudCAhPT0gZmliZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwb3AoY29udGV4dFN0YWNrQ3Vyc29yJDEsIGZpYmVyKTtcbiAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbnZhciBEZWZhdWx0U3VzcGVuc2VDb250ZXh0ID0gMDsgLy8gVGhlIFN1c3BlbnNlIENvbnRleHQgaXMgc3BsaXQgaW50byB0d28gcGFydHMuIFRoZSBsb3dlciBiaXRzIGlzXG4vLyBpbmhlcml0ZWQgZGVlcGx5IGRvd24gdGhlIHN1YnRyZWUuIFRoZSB1cHBlciBiaXRzIG9ubHkgYWZmZWN0XG4vLyB0aGlzIGltbWVkaWF0ZSBzdXNwZW5zZSBib3VuZGFyeSBhbmQgZ2V0cyByZXNldCBlYWNoIG5ld1xuLy8gYm91bmRhcnkgb3Igc3VzcGVuc2UgbGlzdC5cblxudmFyIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrID0gMTsgLy8gU3VidHJlZSBGbGFnczpcbi8vIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCBpbmRpY2F0ZXMgdGhhdCBvbmUgb2Ygb3VyIHBhcmVudCBTdXNwZW5zZVxuLy8gYm91bmRhcmllcyBpcyBub3QgY3VycmVudGx5IHNob3dpbmcgdmlzaWJsZSBtYWluIGNvbnRlbnQuXG4vLyBFaXRoZXIgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjayBvciBpcyBub3QgbW91bnRlZCBhdCBhbGwuXG4vLyBXZSBjYW4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGRlc2lyYWJsZSB0byB0cmlnZ2VyIGEgZmFsbGJhY2sgYXRcbi8vIHRoZSBwYXJlbnQuIElmIG5vdCwgdGhlbiB3ZSBtaWdodCBuZWVkIHRvIHRyaWdnZXIgdW5kZXNpcmFibGUgYm91bmRhcmllc1xuLy8gYW5kL29yIHN1c3BlbmQgdGhlIGNvbW1pdCB0byBhdm9pZCBoaWRpbmcgdGhlIHBhcmVudCBjb250ZW50LlxuXG52YXIgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0ID0gMTsgLy8gU2hhbGxvdyBGbGFnczpcbi8vIEZvcmNlU3VzcGVuc2VGYWxsYmFjayBjYW4gYmUgdXNlZCBieSBTdXNwZW5zZUxpc3QgdG8gZm9yY2UgbmV3bHkgYWRkZWRcbi8vIGl0ZW1zIGludG8gdGhlaXIgZmFsbGJhY2sgc3RhdGUgZHVyaW5nIG9uZSBvZiB0aGUgcmVuZGVyIHBhc3Nlcy5cblxudmFyIEZvcmNlU3VzcGVuc2VGYWxsYmFjayA9IDI7XG52YXIgc3VzcGVuc2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihEZWZhdWx0U3VzcGVuc2VDb250ZXh0KTtcbmZ1bmN0aW9uIGhhc1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBmbGFnKSB7XG4gIHJldHVybiAocGFyZW50Q29udGV4dCAmIGZsYWcpICE9PSAwO1xufVxuZnVuY3Rpb24gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQocGFyZW50Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrO1xufVxuZnVuY3Rpb24gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChwYXJlbnRDb250ZXh0LCBzaGFsbG93Q29udGV4dCkge1xuICByZXR1cm4gcGFyZW50Q29udGV4dCAmIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrIHwgc2hhbGxvd0NvbnRleHQ7XG59XG5mdW5jdGlvbiBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHBhcmVudENvbnRleHQsIHN1YnRyZWVDb250ZXh0KSB7XG4gIHJldHVybiBwYXJlbnRDb250ZXh0IHwgc3VidHJlZUNvbnRleHQ7XG59XG5mdW5jdGlvbiBwdXNoU3VzcGVuc2VDb250ZXh0KGZpYmVyLCBuZXdDb250ZXh0KSB7XG4gIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgbmV3Q29udGV4dCwgZmliZXIpO1xufVxuZnVuY3Rpb24gcG9wU3VzcGVuc2VDb250ZXh0KGZpYmVyKSB7XG4gIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG59XG5cbmZ1bmN0aW9uIHNob3VsZENhcHR1cmVTdXNwZW5zZSh3b3JrSW5Qcm9ncmVzcywgaGFzSW52aXNpYmxlUGFyZW50KSB7XG4gIC8vIElmIGl0IHdhcyB0aGUgcHJpbWFyeSBjaGlsZHJlbiB0aGF0IGp1c3Qgc3VzcGVuZGVkLCBjYXB0dXJlIGFuZCByZW5kZXIgdGhlXG4gIC8vIGZhbGxiYWNrLiBPdGhlcndpc2UsIGRvbid0IGNhcHR1cmUgYW5kIGJ1YmJsZSB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5leHRTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0U3RhdGUuZGVoeWRyYXRlZCAhPT0gbnVsbCkge1xuICAgICAgLy8gQSBkZWh5ZHJhdGVkIGJvdW5kYXJ5IGFsd2F5cyBjYXB0dXJlcy5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7IC8vIEluIG9yZGVyIHRvIGNhcHR1cmUsIHRoZSBTdXNwZW5zZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgZmFsbGJhY2sgcHJvcC5cblxuICBpZiAocHJvcHMuZmFsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBSZWd1bGFyIGJvdW5kYXJpZXMgYWx3YXlzIGNhcHR1cmUuXG5cblxuICBpZiAocHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2sgIT09IHRydWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSAvLyBJZiBpdCdzIGEgYm91bmRhcnkgd2Ugc2hvdWxkIGF2b2lkLCB0aGVuIHdlIHByZWZlciB0byBidWJibGUgdXAgdG8gdGhlXG4gIC8vIHBhcmVudCBib3VuZGFyeSBpZiBpdCBpcyBjdXJyZW50bHkgaW52aXNpYmxlLlxuXG5cbiAgaWYgKGhhc0ludmlzaWJsZVBhcmVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSAvLyBJZiB0aGUgcGFyZW50IGlzIG5vdCBhYmxlIHRvIGhhbmRsZSBpdCwgd2UgbXVzdCBoYW5kbGUgaXQuXG5cblxuICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgdmFyIG5vZGUgPSByb3c7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgZGVoeWRyYXRlZCA9IHN0YXRlLmRlaHlkcmF0ZWQ7XG5cbiAgICAgICAgaWYgKGRlaHlkcmF0ZWQgPT09IG51bGwgfHwgaXNTdXNwZW5zZUluc3RhbmNlUGVuZGluZyhkZWh5ZHJhdGVkKSB8fCBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhkZWh5ZHJhdGVkKSkge1xuICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gU3VzcGVuc2VMaXN0Q29tcG9uZW50ICYmIC8vIHJldmVhbE9yZGVyIHVuZGVmaW5lZCBjYW4ndCBiZSB0cnVzdGVkIGJlY2F1c2UgaXQgZG9uJ3RcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgaXQgc3VzcGVuZGVkIG9yIG5vdC5cbiAgICBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGRpZFN1c3BlbmQgPSAobm9kZS5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzO1xuXG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IHJvdykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgd2hpbGUgKG5vZGUuc2libGluZyA9PT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgTm9GbGFncyQxID1cbi8qICAqL1xuMDsgLy8gUmVwcmVzZW50cyB3aGV0aGVyIGVmZmVjdCBzaG91bGQgZmlyZS5cblxudmFyIEhhc0VmZmVjdCA9XG4vKiAqL1xuMTsgLy8gUmVwcmVzZW50cyB0aGUgcGhhc2UgaW4gd2hpY2ggdGhlIGVmZmVjdCAobm90IHRoZSBjbGVhbi11cCkgZmlyZXMuXG5cbnZhciBMYXlvdXQgPVxuLyogICAgKi9cbjI7XG52YXIgUGFzc2l2ZSQxID1cbi8qICAgKi9cbjQ7XG5cbi8vIFRoaXMgbWF5IGhhdmUgYmVlbiBhbiBpbnNlcnRpb24gb3IgYSBoeWRyYXRpb24uXG5cbnZhciBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG52YXIgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGw7XG52YXIgaXNIeWRyYXRpbmcgPSBmYWxzZTtcblxuZnVuY3Rpb24gZW50ZXJIeWRyYXRpb25TdGF0ZShmaWJlcikge1xuXG4gIHZhciBwYXJlbnRJbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQocGFyZW50SW5zdGFuY2UpO1xuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBpc0h5ZHJhdGluZyA9IHRydWU7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UocmV0dXJuRmliZXIsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBzd2l0Y2ggKHJldHVybkZpYmVyLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgZGlkTm90SHlkcmF0ZUNvbnRhaW5lckluc3RhbmNlKHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLCBpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGRpZE5vdEh5ZHJhdGVJbnN0YW5jZShyZXR1cm5GaWJlci50eXBlLCByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzLCByZXR1cm5GaWJlci5zdGF0ZU5vZGUsIGluc3RhbmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkVG9EZWxldGUgPSBjcmVhdGVGaWJlckZyb21Ib3N0SW5zdGFuY2VGb3JEZWxldGlvbigpO1xuICBjaGlsZFRvRGVsZXRlLnN0YXRlTm9kZSA9IGluc3RhbmNlO1xuICBjaGlsZFRvRGVsZXRlLnJldHVybiA9IHJldHVybkZpYmVyO1xuICBjaGlsZFRvRGVsZXRlLmZsYWdzID0gRGVsZXRpb247IC8vIFRoaXMgbWlnaHQgc2VlbSBsaWtlIGl0IGJlbG9uZ3Mgb24gcHJvZ3Jlc3NlZEZpcnN0RGVsZXRpb24uIEhvd2V2ZXIsXG4gIC8vIHRoZXNlIGNoaWxkcmVuIGFyZSBub3QgcGFydCBvZiB0aGUgcmVjb25jaWxpYXRpb24gbGlzdCBvZiBjaGlsZHJlbi5cbiAgLy8gRXZlbiBpZiB3ZSBhYm9ydCBhbmQgcmVyZWNvbmNpbGUgdGhlIGNoaWxkcmVuLCB0aGF0IHdpbGwgdHJ5IHRvIGh5ZHJhdGVcbiAgLy8gYWdhaW4gYW5kIHRoZSBub2RlcyBhcmUgc3RpbGwgaW4gdGhlIGhvc3QgdHJlZSBzbyB0aGVzZSB3aWxsIGJlXG4gIC8vIHJlY3JlYXRlZC5cblxuICBpZiAocmV0dXJuRmliZXIubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKHJldHVybkZpYmVyLCBmaWJlcikge1xuICBmaWJlci5mbGFncyA9IGZpYmVyLmZsYWdzICYgfkh5ZHJhdGluZyB8IFBsYWNlbWVudDtcblxuICB7XG4gICAgc3dpdGNoIChyZXR1cm5GaWJlci50YWcpIHtcbiAgICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgcGFyZW50Q29udGFpbmVyID0gcmV0dXJuRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG5cbiAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICB2YXIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVDb250YWluZXJJbnN0YW5jZShwYXJlbnRDb250YWluZXIsIHR5cGUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgICAgICAgICAgdmFyIHRleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBwYXJlbnRUeXBlID0gcmV0dXJuRmliZXIudHlwZTtcbiAgICAgICAgICB2YXIgcGFyZW50UHJvcHMgPSByZXR1cm5GaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgICAgICAgIHZhciBfdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBfcHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlSW5zdGFuY2UocGFyZW50VHlwZSwgcGFyZW50UHJvcHMsIHBhcmVudEluc3RhbmNlLCBfdHlwZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgICAgICAgICB2YXIgX3RleHQgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICAgIGRpZE5vdEZpbmRIeWRyYXRhYmxlVGV4dEluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzLCBwYXJlbnRJbnN0YW5jZSwgX3RleHQpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgICAgICAgICAgZGlkTm90RmluZEh5ZHJhdGFibGVTdXNwZW5zZUluc3RhbmNlKHBhcmVudFR5cGUsIHBhcmVudFByb3BzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0cnlIeWRyYXRlKGZpYmVyLCBuZXh0SW5zdGFuY2UpIHtcbiAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgICAgdmFyIHByb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBjYW5IeWRyYXRlSW5zdGFuY2UobmV4dEluc3RhbmNlLCB0eXBlKTtcblxuICAgICAgICBpZiAoaW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSBpbnN0YW5jZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciB0ZXh0ID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgICB2YXIgdGV4dEluc3RhbmNlID0gY2FuSHlkcmF0ZVRleHRJbnN0YW5jZShuZXh0SW5zdGFuY2UsIHRleHQpO1xuXG4gICAgICAgIGlmICh0ZXh0SW5zdGFuY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBmaWJlci5zdGF0ZU5vZGUgPSB0ZXh0SW5zdGFuY2U7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIpIHtcbiAgaWYgKCFpc0h5ZHJhdGluZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXh0SW5zdGFuY2UgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlO1xuXG4gIGlmICghbmV4dEluc3RhbmNlKSB7XG4gICAgLy8gTm90aGluZyB0byBoeWRyYXRlLiBNYWtlIGl0IGFuIGluc2VydGlvbi5cbiAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBmaXJzdEF0dGVtcHRlZEluc3RhbmNlID0gbmV4dEluc3RhbmNlO1xuXG4gIGlmICghdHJ5SHlkcmF0ZShmaWJlciwgbmV4dEluc3RhbmNlKSkge1xuICAgIC8vIElmIHdlIGNhbid0IGh5ZHJhdGUgdGhpcyBpbnN0YW5jZSBsZXQncyB0cnkgdGhlIG5leHQgb25lLlxuICAgIC8vIFdlIHVzZSB0aGlzIGFzIGEgaGV1cmlzdGljLiBJdCdzIGJhc2VkIG9uIGludHVpdGlvbiBhbmQgbm90IGRhdGEgc28gaXRcbiAgICAvLyBtaWdodCBiZSBmbGF3ZWQgb3IgdW5uZWNlc3NhcnkuXG4gICAgbmV4dEluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGVTaWJsaW5nKGZpcnN0QXR0ZW1wdGVkSW5zdGFuY2UpO1xuXG4gICAgaWYgKCFuZXh0SW5zdGFuY2UgfHwgIXRyeUh5ZHJhdGUoZmliZXIsIG5leHRJbnN0YW5jZSkpIHtcbiAgICAgIC8vIE5vdGhpbmcgdG8gaHlkcmF0ZS4gTWFrZSBpdCBhbiBpbnNlcnRpb24uXG4gICAgICBpbnNlcnROb25IeWRyYXRlZEluc3RhbmNlKGh5ZHJhdGlvblBhcmVudEZpYmVyLCBmaWJlcik7XG4gICAgICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBmaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIG1hdGNoZWQgdGhlIG5leHQgb25lLCB3ZSdsbCBub3cgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IG9uZSB3YXNcbiAgICAvLyBzdXBlcmZsdW91cyBhbmQgd2UnbGwgZGVsZXRlIGl0LiBTaW5jZSB3ZSBjYW4ndCBlYWdlcmx5IGRlbGV0ZSBpdFxuICAgIC8vIHdlJ2xsIGhhdmUgdG8gc2NoZWR1bGUgYSBkZWxldGlvbi4gVG8gZG8gdGhhdCwgdGhpcyBub2RlIG5lZWRzIGEgZHVtbXlcbiAgICAvLyBmaWJlciBhc3NvY2lhdGVkIHdpdGggaXQuXG5cblxuICAgIGRlbGV0ZUh5ZHJhdGFibGVJbnN0YW5jZShoeWRyYXRpb25QYXJlbnRGaWJlciwgZmlyc3RBdHRlbXB0ZWRJbnN0YW5jZSk7XG4gIH1cblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IGZpYmVyO1xuICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0Rmlyc3RIeWRyYXRhYmxlQ2hpbGQobmV4dEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RJbnN0YW5jZShmaWJlciwgcm9vdENvbnRhaW5lckluc3RhbmNlLCBob3N0Q29udGV4dCkge1xuXG4gIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgdmFyIHVwZGF0ZVBheWxvYWQgPSBoeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgaG9zdENvbnRleHQsIGZpYmVyKTsgLy8gVE9ETzogVHlwZSB0aGlzIHNwZWNpZmljIHRvIHRoaXMgdHlwZSBvZiBjb21wb25lbnQuXG5cbiAgZmliZXIudXBkYXRlUXVldWUgPSB1cGRhdGVQYXlsb2FkOyAvLyBJZiB0aGUgdXBkYXRlIHBheWxvYWQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBjaGFuZ2Ugb3IgaWYgdGhlcmVcbiAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuXG5cbiAgaWYgKHVwZGF0ZVBheWxvYWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgdGV4dEluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlO1xuICB2YXIgdGV4dENvbnRlbnQgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICB2YXIgc2hvdWxkVXBkYXRlID0gaHlkcmF0ZVRleHRJbnN0YW5jZSh0ZXh0SW5zdGFuY2UsIHRleHRDb250ZW50LCBmaWJlcik7XG5cbiAge1xuICAgIGlmIChzaG91bGRVcGRhdGUpIHtcbiAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHByZXBhcmVUb0h5ZHJhdGVIb3N0VGV4dEluc3RhbmNlIGlzIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgdGhlXG4gICAgICAvLyBoeWRyYXRpb24gcGFyZW50IGlzIHRoZSBwYXJlbnQgaG9zdCBjb21wb25lbnQgb2YgdGhpcyBob3N0IHRleHQuXG4gICAgICB2YXIgcmV0dXJuRmliZXIgPSBoeWRyYXRpb25QYXJlbnRGaWJlcjtcblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAocmV0dXJuRmliZXIudGFnKSB7XG4gICAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIHBhcmVudENvbnRhaW5lciA9IHJldHVybkZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgICBkaWROb3RNYXRjaEh5ZHJhdGVkQ29udGFpbmVyVGV4dEluc3RhbmNlKHBhcmVudENvbnRhaW5lciwgdGV4dEluc3RhbmNlLCB0ZXh0Q29udGVudCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgcGFyZW50VHlwZSA9IHJldHVybkZpYmVyLnR5cGU7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRQcm9wcyA9IHJldHVybkZpYmVyLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICAgIHZhciBwYXJlbnRJbnN0YW5jZSA9IHJldHVybkZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgZGlkTm90TWF0Y2hIeWRyYXRlZFRleHRJbnN0YW5jZShwYXJlbnRUeXBlLCBwYXJlbnRQcm9wcywgcGFyZW50SW5zdGFuY2UsIHRleHRJbnN0YW5jZSwgdGV4dENvbnRlbnQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaG91bGRVcGRhdGU7XG59XG5cbmZ1bmN0aW9uIHNraXBQYXN0RGVoeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UoZmliZXIpIHtcblxuICB2YXIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gIHZhciBzdXNwZW5zZUluc3RhbmNlID0gc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCA/IHN1c3BlbnNlU3RhdGUuZGVoeWRyYXRlZCA6IG51bGw7XG5cbiAgaWYgKCFzdXNwZW5zZUluc3RhbmNlKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlSW5zdGFuY2VBZnRlclN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpIHtcbiAgdmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50YWcgIT09IEhvc3RDb21wb25lbnQgJiYgcGFyZW50LnRhZyAhPT0gSG9zdFJvb3QgJiYgcGFyZW50LnRhZyAhPT0gU3VzcGVuc2VDb21wb25lbnQpIHtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBwYXJlbnQ7XG59XG5cbmZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG5cbiAgaWYgKGZpYmVyICE9PSBoeWRyYXRpb25QYXJlbnRGaWJlcikge1xuICAgIC8vIFdlJ3JlIGRlZXBlciB0aGFuIHRoZSBjdXJyZW50IGh5ZHJhdGlvbiBjb250ZXh0LCBpbnNpZGUgYW4gaW5zZXJ0ZWRcbiAgICAvLyB0cmVlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaXNIeWRyYXRpbmcpIHtcbiAgICAvLyBJZiB3ZSdyZSBub3QgY3VycmVudGx5IGh5ZHJhdGluZyBidXQgd2UncmUgaW4gYSBoeWRyYXRpb24gY29udGV4dCwgdGhlblxuICAgIC8vIHdlIHdlcmUgYW4gaW5zZXJ0aW9uIGFuZCBub3cgbmVlZCB0byBwb3AgdXAgcmVlbnRlciBoeWRyYXRpb24gb2Ygb3VyXG4gICAgLy8gc2libGluZ3MuXG4gICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgaXNIeWRyYXRpbmcgPSB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciB0eXBlID0gZmliZXIudHlwZTsgLy8gSWYgd2UgaGF2ZSBhbnkgcmVtYWluaW5nIGh5ZHJhdGFibGUgbm9kZXMsIHdlIG5lZWQgdG8gZGVsZXRlIHRoZW0gbm93LlxuICAvLyBXZSBvbmx5IGRvIHRoaXMgZGVlcGVyIHRoYW4gaGVhZCBhbmQgYm9keSBzaW5jZSB0aGV5IHRlbmQgdG8gaGF2ZSByYW5kb21cbiAgLy8gb3RoZXIgbm9kZXMgaW4gdGhlbS4gV2UgYWxzbyBpZ25vcmUgY29tcG9uZW50cyB3aXRoIHB1cmUgdGV4dCBjb250ZW50IGluXG4gIC8vIHNpZGUgb2YgdGhlbS5cbiAgLy8gVE9ETzogQmV0dGVyIGhldXJpc3RpYy5cblxuICBpZiAoZmliZXIudGFnICE9PSBIb3N0Q29tcG9uZW50IHx8IHR5cGUgIT09ICdoZWFkJyAmJiB0eXBlICE9PSAnYm9keScgJiYgIXNob3VsZFNldFRleHRDb250ZW50KHR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKSB7XG4gICAgdmFyIG5leHRJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG5cbiAgICB3aGlsZSAobmV4dEluc3RhbmNlKSB7XG4gICAgICBkZWxldGVIeWRyYXRhYmxlSW5zdGFuY2UoZmliZXIsIG5leHRJbnN0YW5jZSk7XG4gICAgICBuZXh0SW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcobmV4dEluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKTtcblxuICBpZiAoZmliZXIudGFnID09PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBza2lwUGFzdERlaHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKGZpYmVyKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gaHlkcmF0aW9uUGFyZW50RmliZXIgPyBnZXROZXh0SHlkcmF0YWJsZVNpYmxpbmcoZmliZXIuc3RhdGVOb2RlKSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRIeWRyYXRpb25TdGF0ZSgpIHtcblxuICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IG51bGw7XG4gIG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsO1xuICBpc0h5ZHJhdGluZyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRJc0h5ZHJhdGluZygpIHtcbiAgcmV0dXJuIGlzSHlkcmF0aW5nO1xufVxuXG4vLyBhbmQgc2hvdWxkIGJlIHJlc2V0IGJlZm9yZSBzdGFydGluZyBhIG5ldyByZW5kZXIuXG4vLyBUaGlzIHRyYWNrcyB3aGljaCBtdXRhYmxlIHNvdXJjZXMgbmVlZCB0byBiZSByZXNldCBhZnRlciBhIHJlbmRlci5cblxudmFyIHdvcmtJblByb2dyZXNzU291cmNlcyA9IFtdO1xudmFyIHJlbmRlcmVyU2lnaWwkMTtcblxue1xuICAvLyBVc2VkIHRvIGRldGVjdCBtdWx0aXBsZSByZW5kZXJlcnMgdXNpbmcgdGhlIHNhbWUgbXV0YWJsZSBzb3VyY2UuXG4gIHJlbmRlcmVyU2lnaWwkMSA9IHt9O1xufVxuXG5mdW5jdGlvbiBtYXJrU291cmNlQXNEaXJ0eShtdXRhYmxlU291cmNlKSB7XG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmtJblByb2dyZXNzU291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtdXRhYmxlU291cmNlID0gd29ya0luUHJvZ3Jlc3NTb3VyY2VzW2ldO1xuXG4gICAge1xuICAgICAgbXV0YWJsZVNvdXJjZS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3NTb3VyY2VzLmxlbmd0aCA9IDA7XG59XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24obXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAgcmV0dXJuIG11dGFibGVTb3VyY2UuX3dvcmtJblByb2dyZXNzVmVyc2lvblByaW1hcnk7XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFdvcmtJblByb2dyZXNzVmVyc2lvbihtdXRhYmxlU291cmNlLCB2ZXJzaW9uKSB7XG4gIHtcbiAgICBtdXRhYmxlU291cmNlLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5ID0gdmVyc2lvbjtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzU291cmNlcy5wdXNoKG11dGFibGVTb3VyY2UpO1xufVxuZnVuY3Rpb24gd2FybkFib3V0TXVsdGlwbGVSZW5kZXJlcnNERVYobXV0YWJsZVNvdXJjZSkge1xuICB7XG4gICAge1xuICAgICAgaWYgKG11dGFibGVTb3VyY2UuX2N1cnJlbnRQcmltYXJ5UmVuZGVyZXIgPT0gbnVsbCkge1xuICAgICAgICBtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyID0gcmVuZGVyZXJTaWdpbCQxO1xuICAgICAgfSBlbHNlIGlmIChtdXRhYmxlU291cmNlLl9jdXJyZW50UHJpbWFyeVJlbmRlcmVyICE9PSByZW5kZXJlclNpZ2lsJDEpIHtcbiAgICAgICAgZXJyb3IoJ0RldGVjdGVkIG11bHRpcGxlIHJlbmRlcmVycyBjb25jdXJyZW50bHkgcmVuZGVyaW5nIHRoZSAnICsgJ3NhbWUgbXV0YWJsZSBzb3VyY2UuIFRoaXMgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufSAvLyBFYWdlciByZWFkcyB0aGUgdmVyc2lvbiBvZiBhIG11dGFibGUgc291cmNlIGFuZCBzdG9yZXMgaXQgb24gdGhlIHJvb3QuXG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLFxuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZztcbnZhciBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQ7XG52YXIgZGlkV2FybkFib3V0VXNlT3BhcXVlSWRlbnRpZmllcjtcblxue1xuICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyID0ge307XG4gIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbn1cblxuLy8gVGhlc2UgYXJlIHNldCByaWdodCBiZWZvcmUgY2FsbGluZyB0aGUgY29tcG9uZW50LlxudmFyIHJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmstaW4tcHJvZ3Jlc3MgZmliZXIuIEkndmUgbmFtZWQgaXQgZGlmZmVyZW50bHkgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbVxuLy8gdGhlIHdvcmstaW4tcHJvZ3Jlc3MgaG9vay5cblxudmFyIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSBudWxsOyAvLyBIb29rcyBhcmUgc3RvcmVkIGFzIGEgbGlua2VkIGxpc3Qgb24gdGhlIGZpYmVyJ3MgbWVtb2l6ZWRTdGF0ZSBmaWVsZC4gVGhlXG4vLyBjdXJyZW50IGhvb2sgbGlzdCBpcyB0aGUgbGlzdCB0aGF0IGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmliZXIuIFRoZVxuLy8gd29yay1pbi1wcm9ncmVzcyBob29rIGxpc3QgaXMgYSBuZXcgbGlzdCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlXG4vLyB3b3JrLWluLXByb2dyZXNzIGZpYmVyLlxuXG52YXIgY3VycmVudEhvb2sgPSBudWxsO1xudmFyIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7IC8vIFdoZXRoZXIgYW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgcmVuZGVyIHBoYXNlLiBUaGlzXG4vLyBkb2VzIG5vdCBnZXQgcmVzZXQgaWYgd2UgZG8gYW5vdGhlciByZW5kZXIgcGFzczsgb25seSB3aGVuIHdlJ3JlIGNvbXBsZXRlbHlcbi8vIGZpbmlzaGVkIGV2YWx1YXRpbmcgdGhpcyBjb21wb25lbnQuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHNvIHdlIGtub3dcbi8vIHdoZXRoZXIgd2UgbmVlZCB0byBjbGVhciByZW5kZXIgcGhhc2UgdXBkYXRlcyBhZnRlciBhIHRocm93LlxuXG52YXIgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlOyAvLyBXaGVyZSBhbiB1cGRhdGUgd2FzIHNjaGVkdWxlZCBvbmx5IGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIgcGFzcy4gVGhpc1xuLy8gZ2V0cyByZXNldCBhZnRlciBlYWNoIGF0dGVtcHQuXG4vLyBUT0RPOiBNYXliZSB0aGVyZSdzIHNvbWUgd2F5IHRvIGNvbnNvbGlkYXRlIHRoaXMgd2l0aFxuLy8gYGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVgLiBPciB3aXRoIGBudW1iZXJPZlJlUmVuZGVyc2AuXG5cbnZhciBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbnZhciBSRV9SRU5ERVJfTElNSVQgPSAyNTsgLy8gSW4gREVWLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByaW1pdGl2ZSBob29rXG5cbnZhciBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7IC8vIEluIERFViwgdGhpcyBsaXN0IGVuc3VyZXMgdGhhdCBob29rcyBhcmUgY2FsbGVkIGluIHRoZSBzYW1lIG9yZGVyIGJldHdlZW4gcmVuZGVycy5cbi8vIFRoZSBsaXN0IHN0b3JlcyB0aGUgb3JkZXIgb2YgaG9va3MgdXNlZCBkdXJpbmcgdGhlIGluaXRpYWwgcmVuZGVyIChtb3VudCkuXG4vLyBTdWJzZXF1ZW50IHJlbmRlcnMgKHVwZGF0ZXMpIHJlZmVyZW5jZSB0aGlzIGxpc3QuXG5cbnZhciBob29rVHlwZXNEZXYgPSBudWxsO1xudmFyIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIEluIERFViwgdGhpcyB0cmFja3Mgd2hldGhlciBjdXJyZW50bHkgcmVuZGVyaW5nIGNvbXBvbmVudCBuZWVkcyB0byBpZ25vcmVcbi8vIHRoZSBkZXBlbmRlbmNpZXMgZm9yIEhvb2tzIHRoYXQgbmVlZCB0aGVtIChlLmcuIHVzZUVmZmVjdCBvciB1c2VNZW1vKS5cbi8vIFdoZW4gdHJ1ZSwgc3VjaCBIb29rcyB3aWxsIGFsd2F5cyBiZSBcInJlbW91bnRlZFwiLiBPbmx5IHVzZWQgZHVyaW5nIGhvdCByZWxvYWQuXG5cbnZhciBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGZhbHNlO1xuXG5mdW5jdGlvbiBtb3VudEhvb2tUeXBlc0RldigpIHtcbiAge1xuICAgIHZhciBob29rTmFtZSA9IGN1cnJlbnRIb29rTmFtZUluRGV2O1xuXG4gICAgaWYgKGhvb2tUeXBlc0RldiA9PT0gbnVsbCkge1xuICAgICAgaG9va1R5cGVzRGV2ID0gW2hvb2tOYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaG9va1R5cGVzRGV2LnB1c2goaG9va05hbWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB1cGRhdGVIb29rVHlwZXNEZXYoKSB7XG4gIHtcbiAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcblxuICAgIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2Kys7XG5cbiAgICAgIGlmIChob29rVHlwZXNEZXZbaG9va1R5cGVzVXBkYXRlSW5kZXhEZXZdICE9PSBob29rTmFtZSkge1xuICAgICAgICB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihob29rTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpIHtcbiAge1xuICAgIGlmIChkZXBzICE9PSB1bmRlZmluZWQgJiYgZGVwcyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkZXBzKSkge1xuICAgICAgLy8gVmVyaWZ5IGRlcHMsIGJ1dCBvbmx5IG9uIG1vdW50IHRvIGF2b2lkIGV4dHJhIGNoZWNrcy5cbiAgICAgIC8vIEl0J3MgdW5saWtlbHkgdGhlaXIgdHlwZSB3b3VsZCBjaGFuZ2UgYXMgdXN1YWxseSB5b3UgZGVmaW5lIHRoZW0gaW5saW5lLlxuICAgICAgZXJyb3IoJyVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuICcgKyAnc3BlY2lmaWVkLCB0aGUgZmluYWwgYXJndW1lbnQgbXVzdCBiZSBhbiBhcnJheS4nLCBjdXJyZW50SG9va05hbWVJbkRldiwgdHlwZW9mIGRlcHMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25Ib29rTWlzbWF0Y2hJbkRldihjdXJyZW50SG9va05hbWUpIHtcbiAge1xuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnR5cGUpO1xuXG4gICAgaWYgKCFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpKSB7XG4gICAgICBkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuXG4gICAgICBpZiAoaG9va1R5cGVzRGV2ICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB0YWJsZSA9ICcnO1xuICAgICAgICB2YXIgc2Vjb25kQ29sdW1uU3RhcnQgPSAzMDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBob29rVHlwZXNVcGRhdGVJbmRleERldjsgaSsrKSB7XG4gICAgICAgICAgdmFyIG9sZEhvb2tOYW1lID0gaG9va1R5cGVzRGV2W2ldO1xuICAgICAgICAgIHZhciBuZXdIb29rTmFtZSA9IGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gY3VycmVudEhvb2tOYW1lIDogb2xkSG9va05hbWU7XG4gICAgICAgICAgdmFyIHJvdyA9IGkgKyAxICsgXCIuIFwiICsgb2xkSG9va05hbWU7IC8vIEV4dHJhIHNwYWNlIHNvIHNlY29uZCBjb2x1bW4gbGluZXMgdXBcbiAgICAgICAgICAvLyBsb2wgQCBJRSBub3Qgc3VwcG9ydGluZyBTdHJpbmcjcmVwZWF0XG5cbiAgICAgICAgICB3aGlsZSAocm93Lmxlbmd0aCA8IHNlY29uZENvbHVtblN0YXJ0KSB7XG4gICAgICAgICAgICByb3cgKz0gJyAnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJvdyArPSBuZXdIb29rTmFtZSArICdcXG4nO1xuICAgICAgICAgIHRhYmxlICs9IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGVycm9yKCdSZWFjdCBoYXMgZGV0ZWN0ZWQgYSBjaGFuZ2UgaW4gdGhlIG9yZGVyIG9mIEhvb2tzIGNhbGxlZCBieSAlcy4gJyArICdUaGlzIHdpbGwgbGVhZCB0byBidWdzIGFuZCBlcnJvcnMgaWYgbm90IGZpeGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzXFxuXFxuJyArICcgICBQcmV2aW91cyByZW5kZXIgICAgICAgICAgICBOZXh0IHJlbmRlclxcbicgKyAnICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyArICclcycgKyAnICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXFxuJywgY29tcG9uZW50TmFtZSwgdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2ludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSB7XG4gIHtcbiAgICBpZiAoaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMpIHtcbiAgICAgIC8vIE9ubHkgdHJ1ZSB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIGhvdCByZWxvYWRlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJldkRlcHMgPT09IG51bGwpIHtcbiAgICB7XG4gICAgICBlcnJvcignJXMgcmVjZWl2ZWQgYSBmaW5hbCBhcmd1bWVudCBkdXJpbmcgdGhpcyByZW5kZXIsIGJ1dCBub3QgZHVyaW5nICcgKyAndGhlIHByZXZpb3VzIHJlbmRlci4gRXZlbiB0aG91Z2ggdGhlIGZpbmFsIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCAnICsgJ2l0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLicsIGN1cnJlbnRIb29rTmFtZUluRGV2KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgYm90aGVyIGNvbXBhcmluZyBsZW5ndGhzIGluIHByb2QgYmVjYXVzZSB0aGVzZSBhcnJheXMgc2hvdWxkIGJlXG4gICAgLy8gcGFzc2VkIGlubGluZS5cbiAgICBpZiAobmV4dERlcHMubGVuZ3RoICE9PSBwcmV2RGVwcy5sZW5ndGgpIHtcbiAgICAgIGVycm9yKCdUaGUgZmluYWwgYXJndW1lbnQgcGFzc2VkIHRvICVzIGNoYW5nZWQgc2l6ZSBiZXR3ZWVuIHJlbmRlcnMuIFRoZSAnICsgJ29yZGVyIGFuZCBzaXplIG9mIHRoaXMgYXJyYXkgbXVzdCByZW1haW4gY29uc3RhbnQuXFxuXFxuJyArICdQcmV2aW91czogJXNcXG4nICsgJ0luY29taW5nOiAlcycsIGN1cnJlbnRIb29rTmFtZUluRGV2LCBcIltcIiArIHByZXZEZXBzLmpvaW4oJywgJykgKyBcIl1cIiwgXCJbXCIgKyBuZXh0RGVwcy5qb2luKCcsICcpICsgXCJdXCIpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcsIG5leHRSZW5kZXJMYW5lcykge1xuICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IHdvcmtJblByb2dyZXNzO1xuXG4gIHtcbiAgICBob29rVHlwZXNEZXYgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7IC8vIFVzZWQgZm9yIGhvdCByZWxvYWRpbmc6XG5cbiAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9IGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB9XG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzOyAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZXNldFxuICAvLyBjdXJyZW50SG9vayA9IG51bGw7XG4gIC8vIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGw7XG4gIC8vIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgLy8gVE9ETyBXYXJuIGlmIG5vIGhvb2tzIGFyZSB1c2VkIGF0IGFsbCBkdXJpbmcgbW91bnQsIHRoZW4gc29tZSBhcmUgdXNlZCBkdXJpbmcgdXBkYXRlLlxuICAvLyBDdXJyZW50bHkgd2Ugd2lsbCBpZGVudGlmeSB0aGUgdXBkYXRlIHJlbmRlciBhcyBhIG1vdW50IGJlY2F1c2UgbWVtb2l6ZWRTdGF0ZSA9PT0gbnVsbC5cbiAgLy8gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBpdCdzIHZhbGlkIGZvciBjZXJ0YWluIHR5cGVzIG9mIGNvbXBvbmVudHMgKGUuZy4gUmVhY3QubGF6eSlcbiAgLy8gVXNpbmcgbWVtb2l6ZWRTdGF0ZSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbW91bnQvdXBkYXRlIG9ubHkgd29ya3MgaWYgYXQgbGVhc3Qgb25lIHN0YXRlZnVsIGhvb2sgaXMgdXNlZC5cbiAgLy8gTm9uLXN0YXRlZnVsIGhvb2tzIChlLmcuIGNvbnRleHQpIGRvbid0IGdldCBhZGRlZCB0byBtZW1vaXplZFN0YXRlLFxuICAvLyBzbyBtZW1vaXplZFN0YXRlIHdvdWxkIGJlIG51bGwgZHVyaW5nIHVwZGF0ZXMgYW5kIG1vdW50cy5cblxuICB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwgJiYgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgfSBlbHNlIGlmIChob29rVHlwZXNEZXYgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgZGlzcGF0Y2hlciBoYW5kbGVzIGFuIGVkZ2UgY2FzZSB3aGVyZSBhIGNvbXBvbmVudCBpcyB1cGRhdGluZyxcbiAgICAgIC8vIGJ1dCBubyBzdGF0ZWZ1bCBob29rcyBoYXZlIGJlZW4gdXNlZC5cbiAgICAgIC8vIFdlIHdhbnQgdG8gbWF0Y2ggdGhlIHByb2R1Y3Rpb24gY29kZSBiZWhhdmlvciAod2hpY2ggd2lsbCB1c2UgSG9va3NEaXNwYXRjaGVyT25Nb3VudCksXG4gICAgICAvLyBidXQgd2l0aCB0aGUgZXh0cmEgREVWIHZhbGlkYXRpb24gdG8gZW5zdXJlIGhvb2tzIG9yZGVyaW5nIGhhc24ndCBjaGFuZ2VkLlxuICAgICAgLy8gVGhpcyBkaXNwYXRjaGVyIGRvZXMgdGhhdC5cbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVjtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNoaWxkcmVuID0gQ29tcG9uZW50KHByb3BzLCBzZWNvbmRBcmcpOyAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYSByZW5kZXIgcGhhc2UgdXBkYXRlXG5cbiAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcykge1xuICAgIC8vIEtlZXAgcmVuZGVyaW5nIGluIGEgbG9vcCBmb3IgYXMgbG9uZyBhcyByZW5kZXIgcGhhc2UgdXBkYXRlcyBjb250aW51ZSB0b1xuICAgIC8vIGJlIHNjaGVkdWxlZC4gVXNlIGEgY291bnRlciB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLlxuICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG5cbiAgICBkbyB7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcblxuICAgICAgaWYgKCEobnVtYmVyT2ZSZVJlbmRlcnMgPCBSRV9SRU5ERVJfTElNSVQpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cIiApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gRXZlbiB3aGVuIGhvdCByZWxvYWRpbmcsIGFsbG93IGRlcGVuZGVuY2llcyB0byBzdGFiaWxpemVcbiAgICAgICAgLy8gYWZ0ZXIgZmlyc3QgcmVuZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuXG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gZmFsc2U7XG4gICAgICB9IC8vIFN0YXJ0IG92ZXIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0XG5cblxuICAgICAgY3VycmVudEhvb2sgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAge1xuICAgICAgICAvLyBBbHNvIHZhbGlkYXRlIGhvb2sgb3JkZXIgZm9yIGNhc2NhZGluZyB1cGRhdGVzLlxuICAgICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgfVxuXG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9ICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgO1xuICAgICAgY2hpbGRyZW4gPSBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgfSB3aGlsZSAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzKTtcbiAgfSAvLyBXZSBjYW4gYXNzdW1lIHRoZSBwcmV2aW91cyBkaXNwYXRjaGVyIGlzIGFsd2F5cyB0aGlzIG9uZSwgc2luY2Ugd2Ugc2V0IGl0XG4gIC8vIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlbmRlciBwaGFzZSBhbmQgdGhlcmUncyBubyByZS1lbnRyYW5jeS5cblxuXG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuXG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBob29rVHlwZXNEZXY7XG4gIH0gLy8gVGhpcyBjaGVjayB1c2VzIGN1cnJlbnRIb29rIHNvIHRoYXQgaXQgd29ya3MgdGhlIHNhbWUgaW4gREVWIGFuZCBwcm9kIGJ1bmRsZXMuXG4gIC8vIGhvb2tUeXBlc0RldiBjb3VsZCBjYXRjaCBtb3JlIGNhc2VzIChlLmcuIGNvbnRleHQpIGJ1dCBvbmx5IGluIERFViBidW5kbGVzLlxuXG5cbiAgdmFyIGRpZFJlbmRlclRvb0Zld0hvb2tzID0gY3VycmVudEhvb2sgIT09IG51bGwgJiYgY3VycmVudEhvb2submV4dCAhPT0gbnVsbDtcbiAgcmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbDtcbiAgY3VycmVudEhvb2sgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBudWxsO1xuXG4gIHtcbiAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICB9XG5cbiAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IGZhbHNlO1xuXG4gIGlmICghIWRpZFJlbmRlclRvb0Zld0hvb2tzKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgZmV3ZXIgaG9va3MgdGhhbiBleHBlY3RlZC4gVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IGFuIGFjY2lkZW50YWwgZWFybHkgcmV0dXJuIHN0YXRlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSB+KFBhc3NpdmUgfCBVcGRhdGUpO1xuICBjdXJyZW50LmxhbmVzID0gcmVtb3ZlTGFuZXMoY3VycmVudC5sYW5lcywgbGFuZXMpO1xufVxuZnVuY3Rpb24gcmVzZXRIb29rc0FmdGVyVGhyb3coKSB7XG4gIC8vIFdlIGNhbiBhc3N1bWUgdGhlIHByZXZpb3VzIGRpc3BhdGNoZXIgaXMgYWx3YXlzIHRoaXMgb25lLCBzaW5jZSB3ZSBzZXQgaXRcbiAgLy8gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVuZGVyIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlLWVudHJhbmN5LlxuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAoZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgIC8vIFRoZXJlIHdlcmUgcmVuZGVyIHBoYXNlIHVwZGF0ZXMuIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciB0aGlzIHJlbmRlclxuICAgIC8vIHBoYXNlLCB3aGljaCB3ZSBhcmUgbm93IGFib3J0aW5nLiBSZW1vdmUgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWVzIHNvXG4gICAgLy8gdGhleSBkbyBub3QgcGVyc2lzdCB0byB0aGUgbmV4dCByZW5kZXIuIERvIG5vdCByZW1vdmUgdXBkYXRlcyBmcm9tIGhvb2tzXG4gICAgLy8gdGhhdCB3ZXJlbid0IHByb2Nlc3NlZC5cbiAgICAvL1xuICAgIC8vIE9ubHkgcmVzZXQgdGhlIHVwZGF0ZXMgZnJvbSB0aGUgcXVldWUgaWYgaXQgaGFzIGEgY2xvbmUuIElmIGl0IGRvZXNcbiAgICAvLyBub3QgaGF2ZSBhIGNsb25lLCB0aGF0IG1lYW5zIGl0IHdhc24ndCBwcm9jZXNzZWQsIGFuZCB0aGUgdXBkYXRlcyB3ZXJlXG4gICAgLy8gc2NoZWR1bGVkIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgdmFyIGhvb2sgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGU7XG5cbiAgICB3aGlsZSAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICAgICAgaWYgKHF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBob29rID0gaG9vay5uZXh0O1xuICAgIH1cblxuICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSBmYWxzZTtcbiAgfVxuXG4gIHJlbmRlckxhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gIGN1cnJlbnRIb29rID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NIb29rID0gbnVsbDtcblxuICB7XG4gICAgaG9va1R5cGVzRGV2ID0gbnVsbDtcbiAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbDtcbiAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG4gIH1cblxuICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSB7XG4gIHZhciBob29rID0ge1xuICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgYmFzZVN0YXRlOiBudWxsLFxuICAgIGJhc2VRdWV1ZTogbnVsbCxcbiAgICBxdWV1ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGhvb2sgaW4gdGhlIGxpc3RcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLm1lbW9pemVkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc0hvb2sgPSBob29rO1xuICB9IGVsc2Uge1xuICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rO1xuICB9XG5cbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzSG9vaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYm90aCBmb3IgdXBkYXRlcyBhbmQgZm9yIHJlLXJlbmRlcnMgdHJpZ2dlcmVkIGJ5IGFcbiAgLy8gcmVuZGVyIHBoYXNlIHVwZGF0ZS4gSXQgYXNzdW1lcyB0aGVyZSBpcyBlaXRoZXIgYSBjdXJyZW50IGhvb2sgd2UgY2FuXG4gIC8vIGNsb25lLCBvciBhIHdvcmstaW4tcHJvZ3Jlc3MgaG9vayBmcm9tIGEgcHJldmlvdXMgcmVuZGVyIHBhc3MgdGhhdCB3ZSBjYW5cbiAgLy8gdXNlIGFzIGEgYmFzZS4gV2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBiYXNlIGxpc3QsIHdlIG11c3Qgc3dpdGNoIHRvXG4gIC8vIHRoZSBkaXNwYXRjaGVyIHVzZWQgZm9yIG1vdW50cy5cbiAgdmFyIG5leHRDdXJyZW50SG9vaztcblxuICBpZiAoY3VycmVudEhvb2sgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIG5leHRDdXJyZW50SG9vayA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dEN1cnJlbnRIb29rID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgfVxuXG4gIHZhciBuZXh0V29ya0luUHJvZ3Jlc3NIb29rO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc0hvb2sgPT09IG51bGwpIHtcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5tZW1vaXplZFN0YXRlO1xuICB9IGVsc2Uge1xuICAgIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPSB3b3JrSW5Qcm9ncmVzc0hvb2submV4dDtcbiAgfVxuXG4gIGlmIChuZXh0V29ya0luUHJvZ3Jlc3NIb29rICE9PSBudWxsKSB7XG4gICAgLy8gVGhlcmUncyBhbHJlYWR5IGEgd29yay1pbi1wcm9ncmVzcy4gUmV1c2UgaXQuXG4gICAgd29ya0luUHJvZ3Jlc3NIb29rID0gbmV4dFdvcmtJblByb2dyZXNzSG9vaztcbiAgICBuZXh0V29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQ7XG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ2xvbmUgZnJvbSB0aGUgY3VycmVudCBob29rLlxuICAgIGlmICghKG5leHRDdXJyZW50SG9vayAhPT0gbnVsbCkpIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiUmVuZGVyZWQgbW9yZSBob29rcyB0aGFuIGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLlwiICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2s7XG4gICAgdmFyIG5ld0hvb2sgPSB7XG4gICAgICBtZW1vaXplZFN0YXRlOiBjdXJyZW50SG9vay5tZW1vaXplZFN0YXRlLFxuICAgICAgYmFzZVN0YXRlOiBjdXJyZW50SG9vay5iYXNlU3RhdGUsXG4gICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgIHF1ZXVlOiBjdXJyZW50SG9vay5xdWV1ZSxcbiAgICAgIG5leHQ6IG51bGxcbiAgICB9O1xuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzSG9vayA9PT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgaG9vayBpbiB0aGUgbGlzdC5cbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubWVtb2l6ZWRTdGF0ZSA9IHdvcmtJblByb2dyZXNzSG9vayA9IG5ld0hvb2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBuZXdIb29rO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gIHJldHVybiB7XG4gICAgbGFzdEVmZmVjdDogbnVsbFxuICB9O1xufVxuXG5mdW5jdGlvbiBiYXNpY1N0YXRlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSB7XG4gIC8vICRGbG93Rml4TWU6IEZsb3cgZG9lc24ndCBsaWtlIG1peGVkIHR5cGVzXG4gIHJldHVybiB0eXBlb2YgYWN0aW9uID09PSAnZnVuY3Rpb24nID8gYWN0aW9uKHN0YXRlKSA6IGFjdGlvbjtcbn1cblxuZnVuY3Rpb24gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgaW5pdGlhbFN0YXRlO1xuXG4gIGlmIChpbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICB9IGVsc2Uge1xuICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxBcmc7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZSA9IHtcbiAgICBwZW5kaW5nOiBudWxsLFxuICAgIGRpc3BhdGNoOiBudWxsLFxuICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnQgPSBjdXJyZW50SG9vazsgLy8gVGhlIGxhc3QgcmViYXNlIHVwZGF0ZSB0aGF0IGlzIE5PVCBwYXJ0IG9mIHRoZSBiYXNlIHN0YXRlLlxuXG4gIHZhciBiYXNlUXVldWUgPSBjdXJyZW50LmJhc2VRdWV1ZTsgLy8gVGhlIGxhc3QgcGVuZGluZyB1cGRhdGUgdGhhdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LlxuXG4gIHZhciBwZW5kaW5nUXVldWUgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nUXVldWUgIT09IG51bGwpIHtcbiAgICAvLyBXZSBoYXZlIG5ldyB1cGRhdGVzIHRoYXQgaGF2ZW4ndCBiZWVuIHByb2Nlc3NlZCB5ZXQuXG4gICAgLy8gV2UnbGwgYWRkIHRoZW0gdG8gdGhlIGJhc2UgcXVldWUuXG4gICAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcXVldWUgYW5kIHRoZSBiYXNlIHF1ZXVlLlxuICAgICAgdmFyIGJhc2VGaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgdmFyIHBlbmRpbmdGaXJzdCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgYmFzZVF1ZXVlLm5leHQgPSBwZW5kaW5nRmlyc3Q7XG4gICAgICBwZW5kaW5nUXVldWUubmV4dCA9IGJhc2VGaXJzdDtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoY3VycmVudC5iYXNlUXVldWUgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAvLyBJbnRlcm5hbCBpbnZhcmlhbnQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZmVhc2libHkgY291bGQgaW5cbiAgICAgICAgLy8gdGhlIGZ1dHVyZSBpZiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcsIG9yIHNvbWUgZm9ybSBvZiB0aGF0LlxuICAgICAgICBlcnJvcignSW50ZXJuYWwgZXJyb3I6IEV4cGVjdGVkIHdvcmstaW4tcHJvZ3Jlc3MgcXVldWUgdG8gYmUgYSBjbG9uZS4gJyArICdUaGlzIGlzIGEgYnVnIGluIFJlYWN0LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN1cnJlbnQuYmFzZVF1ZXVlID0gYmFzZVF1ZXVlID0gcGVuZGluZ1F1ZXVlO1xuICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgaWYgKGJhc2VRdWV1ZSAhPT0gbnVsbCkge1xuICAgIC8vIFdlIGhhdmUgYSBxdWV1ZSB0byBwcm9jZXNzLlxuICAgIHZhciBmaXJzdCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgIHZhciBuZXdTdGF0ZSA9IGN1cnJlbnQuYmFzZVN0YXRlO1xuICAgIHZhciBuZXdCYXNlU3RhdGUgPSBudWxsO1xuICAgIHZhciBuZXdCYXNlUXVldWVGaXJzdCA9IG51bGw7XG4gICAgdmFyIG5ld0Jhc2VRdWV1ZUxhc3QgPSBudWxsO1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciB1cGRhdGVMYW5lID0gdXBkYXRlLmxhbmU7XG5cbiAgICAgIGlmICghaXNTdWJzZXRPZkxhbmVzKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lKSkge1xuICAgICAgICAvLyBQcmlvcml0eSBpcyBpbnN1ZmZpY2llbnQuIFNraXAgdGhpcyB1cGRhdGUuIElmIHRoaXMgaXMgdGhlIGZpcnN0XG4gICAgICAgIC8vIHNraXBwZWQgdXBkYXRlLCB0aGUgcHJldmlvdXMgdXBkYXRlL3N0YXRlIGlzIHRoZSBuZXcgYmFzZVxuICAgICAgICAvLyB1cGRhdGUvc3RhdGUuXG4gICAgICAgIHZhciBjbG9uZSA9IHtcbiAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICBlYWdlclJlZHVjZXI6IHVwZGF0ZS5lYWdlclJlZHVjZXIsXG4gICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlRmlyc3QgPSBuZXdCYXNlUXVldWVMYXN0ID0gY2xvbmU7XG4gICAgICAgICAgbmV3QmFzZVN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QubmV4dCA9IGNsb25lO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIHByaW9yaXR5IGluIHRoZSBxdWV1ZS5cbiAgICAgICAgLy8gVE9ETzogRG9uJ3QgbmVlZCB0byBhY2N1bXVsYXRlIHRoaXMuIEluc3RlYWQsIHdlIGNhbiByZW1vdmVcbiAgICAgICAgLy8gcmVuZGVyTGFuZXMgZnJvbSB0aGUgb3JpZ2luYWwgbGFuZXMuXG5cblxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzID0gbWVyZ2VMYW5lcyhjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmxhbmVzLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgbWFya1NraXBwZWRVcGRhdGVMYW5lcyh1cGRhdGVMYW5lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgdXBkYXRlIGRvZXMgaGF2ZSBzdWZmaWNpZW50IHByaW9yaXR5LlxuICAgICAgICBpZiAobmV3QmFzZVF1ZXVlTGFzdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBfY2xvbmUgPSB7XG4gICAgICAgICAgICAvLyBUaGlzIHVwZGF0ZSBpcyBnb2luZyB0byBiZSBjb21taXR0ZWQgc28gd2UgbmV2ZXIgd2FudCB1bmNvbW1pdFxuICAgICAgICAgICAgLy8gaXQuIFVzaW5nIE5vTGFuZSB3b3JrcyBiZWNhdXNlIDAgaXMgYSBzdWJzZXQgb2YgYWxsIGJpdG1hc2tzLCBzb1xuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5ldmVyIGJlIHNraXBwZWQgYnkgdGhlIGNoZWNrIGFib3ZlLlxuICAgICAgICAgICAgbGFuZTogTm9MYW5lLFxuICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgZWFnZXJSZWR1Y2VyOiB1cGRhdGUuZWFnZXJSZWR1Y2VyLFxuICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gX2Nsb25lO1xuICAgICAgICB9IC8vIFByb2Nlc3MgdGhpcyB1cGRhdGUuXG5cblxuICAgICAgICBpZiAodXBkYXRlLmVhZ2VyUmVkdWNlciA9PT0gcmVkdWNlcikge1xuICAgICAgICAgIC8vIElmIHRoaXMgdXBkYXRlIHdhcyBwcm9jZXNzZWQgZWFnZXJseSwgYW5kIGl0cyByZWR1Y2VyIG1hdGNoZXMgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCByZWR1Y2VyLCB3ZSBjYW4gdXNlIHRoZSBlYWdlcmx5IGNvbXB1dGVkIHN0YXRlLlxuICAgICAgICAgIG5ld1N0YXRlID0gdXBkYXRlLmVhZ2VyU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGFjdGlvbiA9IHVwZGF0ZS5hY3Rpb247XG4gICAgICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgIH0gd2hpbGUgKHVwZGF0ZSAhPT0gbnVsbCAmJiB1cGRhdGUgIT09IGZpcnN0KTtcblxuICAgIGlmIChuZXdCYXNlUXVldWVMYXN0ID09PSBudWxsKSB7XG4gICAgICBuZXdCYXNlU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID0gbmV3QmFzZVF1ZXVlRmlyc3Q7XG4gICAgfSAvLyBNYXJrIHRoYXQgdGhlIGZpYmVyIHBlcmZvcm1lZCB3b3JrLCBidXQgb25seSBpZiB0aGUgbmV3IHN0YXRlIGlzXG4gICAgLy8gZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgc3RhdGUuXG5cblxuICAgIGlmICghb2JqZWN0SXMobmV3U3RhdGUsIGhvb2subWVtb2l6ZWRTdGF0ZSkpIHtcbiAgICAgIG1hcmtXb3JrSW5Qcm9ncmVzc1JlY2VpdmVkVXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgaG9vay5iYXNlU3RhdGUgPSBuZXdCYXNlU3RhdGU7XG4gICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaDtcbiAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbn1cblxuZnVuY3Rpb24gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIHF1ZXVlID0gaG9vay5xdWV1ZTtcblxuICBpZiAoIShxdWV1ZSAhPT0gbnVsbCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJTaG91bGQgaGF2ZSBhIHF1ZXVlLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cblxuICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjsgLy8gVGhpcyBpcyBhIHJlLXJlbmRlci4gQXBwbHkgdGhlIG5ldyByZW5kZXIgcGhhc2UgdXBkYXRlcyB0byB0aGUgcHJldmlvdXNcbiAgLy8gd29yay1pbi1wcm9ncmVzcyBob29rLlxuXG4gIHZhciBkaXNwYXRjaCA9IHF1ZXVlLmRpc3BhdGNoO1xuICB2YXIgbGFzdFJlbmRlclBoYXNlVXBkYXRlID0gcXVldWUucGVuZGluZztcbiAgdmFyIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuXG4gIGlmIChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgcXVldWUgZG9lc24ndCBwZXJzaXN0IHBhc3QgdGhpcyByZW5kZXIgcGFzcy5cbiAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICB2YXIgZmlyc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZS5uZXh0O1xuICAgIHZhciB1cGRhdGUgPSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlO1xuXG4gICAgZG8ge1xuICAgICAgLy8gUHJvY2VzcyB0aGlzIHJlbmRlciBwaGFzZSB1cGRhdGUuIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlXG4gICAgICAvLyBwcmlvcml0eSBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50XG4gICAgICAvLyByZW5kZXIncy5cbiAgICAgIHZhciBhY3Rpb24gPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgbmV3U3RhdGUgPSByZWR1Y2VyKG5ld1N0YXRlLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlID0gdXBkYXRlLm5leHQ7XG4gICAgfSB3aGlsZSAodXBkYXRlICE9PSBmaXJzdFJlbmRlclBoYXNlVXBkYXRlKTsgLy8gTWFyayB0aGF0IHRoZSBmaWJlciBwZXJmb3JtZWQgd29yaywgYnV0IG9ubHkgaWYgdGhlIG5ldyBzdGF0ZSBpc1xuICAgIC8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLlxuXG5cbiAgICBpZiAoIW9iamVjdElzKG5ld1N0YXRlLCBob29rLm1lbW9pemVkU3RhdGUpKSB7XG4gICAgICBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpO1xuICAgIH1cblxuICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlOyAvLyBEb24ndCBwZXJzaXN0IHRoZSBzdGF0ZSBhY2N1bXVsYXRlZCBmcm9tIHRoZSByZW5kZXIgcGhhc2UgdXBkYXRlcyB0b1xuICAgIC8vIHRoZSBiYXNlIHN0YXRlIHVubGVzcyB0aGUgcXVldWUgaXMgZW1wdHkuXG4gICAgLy8gVE9ETzogTm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgZGVzaXJlZCBzZW1hbnRpY3MsIGJ1dCBpdCdzIHdoYXQgd2VcbiAgICAvLyBkbyBmb3IgZ0RTRlAuIEkgY2FuJ3QgcmVtZW1iZXIgd2h5LlxuXG4gICAgaWYgKGhvb2suYmFzZVF1ZXVlID09PSBudWxsKSB7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlO1xuICAgIH1cblxuICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFN0YXRlID0gbmV3U3RhdGU7XG4gIH1cblxuICByZXR1cm4gW25ld1N0YXRlLCBkaXNwYXRjaF07XG59XG5cbmZ1bmN0aW9uIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpIHtcbiAge1xuICAgIHdhcm5BYm91dE11bHRpcGxlUmVuZGVyZXJzREVWKHNvdXJjZSk7XG4gIH1cblxuICB2YXIgZ2V0VmVyc2lvbiA9IHNvdXJjZS5fZ2V0VmVyc2lvbjtcbiAgdmFyIHZlcnNpb24gPSBnZXRWZXJzaW9uKHNvdXJjZS5fc291cmNlKTsgLy8gSXMgaXQgc2FmZSBmb3IgdGhpcyBjb21wb25lbnQgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXI/XG5cbiAgdmFyIGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UgPSBmYWxzZTsgLy8gQ2hlY2sgdGhlIHZlcnNpb24gZmlyc3QuXG4gIC8vIElmIHRoaXMgcmVuZGVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCB3aXRoIGEgc3BlY2lmaWMgdmVyc2lvbixcbiAgLy8gd2UgY2FuIHVzZSBpdCBhbG9uZSB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHNhZmVseSByZWFkIGZyb20gdGhlIHNvdXJjZS5cblxuICB2YXIgY3VycmVudFJlbmRlclZlcnNpb24gPSBnZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb24oc291cmNlKTtcblxuICBpZiAoY3VycmVudFJlbmRlclZlcnNpb24gIT09IG51bGwpIHtcbiAgICAvLyBJdCdzIHNhZmUgdG8gcmVhZCBpZiB0aGUgc3RvcmUgaGFzbid0IGJlZW4gbXV0YXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lXG4gICAgLy8gd2UgcmVhZCBzb21ldGhpbmcuXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGN1cnJlbnRSZW5kZXJWZXJzaW9uID09PSB2ZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gdmVyc2lvbiwgdGhlbiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHJlYWQgZnJvbSB0aGVcbiAgICAvLyBzb3VyY2UgZHVyaW5nIHRoZSBjdXJyZW50IHJlbmRlciBwYXNzLCBzbyB3ZSBuZWVkIHRvIGRvIGEgYml0IG1vcmUgd29yay5cbiAgICAvLyBXaGF0IHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlzIGlmIHRoZXJlIGFyZSBhbnkgaG9va3MgdGhhdCBhbHJlYWR5XG4gICAgLy8gc3Vic2NyaWJlZCB0byB0aGUgc291cmNlLCBhbmQgaWYgc28sIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwZW5kaW5nXG4gICAgLy8gbXV0YXRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIHN5bmNocm9uaXplZCB5ZXQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVuZGluZyBtdXRhdGlvbnMsIHRoZW4gYHJvb3QubXV0YWJsZVJlYWRMYW5lc2Agd2lsbCBiZVxuICAgIC8vIGVtcHR5LCBhbmQgd2Uga25vdyB3ZSBjYW4gc2FmZWx5IHJlYWQuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSAqYXJlKiBwZW5kaW5nIG11dGF0aW9ucywgd2UgbWF5IHN0aWxsIGJlIGFibGUgdG8gc2FmZWx5IHJlYWRcbiAgICAvLyBpZiB0aGUgY3VycmVudGx5IHJlbmRlcmluZyBsYW5lcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBwZW5kaW5nIG11dGF0aW9uXG4gICAgLy8gbGFuZXMsIHNpbmNlIHRoYXQgZ3VhcmFudGVlcyB0aGF0IHRoZSB2YWx1ZSB3ZSdyZSBhYm91dCB0byByZWFkIGZyb21cbiAgICAvLyB0aGUgc291cmNlIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWVzIHRoYXQgd2UgcmVhZCBkdXJpbmcgdGhlIG1vc3RcbiAgICAvLyByZWNlbnQgbXV0YXRpb24uXG4gICAgaXNTYWZlVG9SZWFkRnJvbVNvdXJjZSA9IGlzU3Vic2V0T2ZMYW5lcyhyZW5kZXJMYW5lcywgcm9vdC5tdXRhYmxlUmVhZExhbmVzKTtcblxuICAgIGlmIChpc1NhZmVUb1JlYWRGcm9tU291cmNlKSB7XG4gICAgICAvLyBJZiBpdCdzIHNhZmUgdG8gcmVhZCBmcm9tIHRoaXMgc291cmNlIGR1cmluZyB0aGUgY3VycmVudCByZW5kZXIsXG4gICAgICAvLyBzdG9yZSB0aGUgdmVyc2lvbiBpbiBjYXNlIG90aGVyIGNvbXBvbmVudHMgcmVhZCBmcm9tIGl0LlxuICAgICAgLy8gQSBjaGFuZ2VkIHZlcnNpb24gbnVtYmVyIHdpbGwgbGV0IHRob3NlIGNvbXBvbmVudHMga25vdyB0byB0aHJvdyBhbmQgcmVzdGFydCB0aGUgcmVuZGVyLlxuICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKHNvdXJjZSwgdmVyc2lvbik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGlzU2FmZVRvUmVhZEZyb21Tb3VyY2UpIHtcbiAgICB2YXIgc25hcHNob3QgPSBnZXRTbmFwc2hvdChzb3VyY2UuX3NvdXJjZSk7XG5cbiAgICB7XG4gICAgICBpZiAodHlwZW9mIHNuYXBzaG90ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVycm9yKCdNdXRhYmxlIHNvdXJjZSBzaG91bGQgbm90IHJldHVybiBhIGZ1bmN0aW9uIGFzIHRoZSBzbmFwc2hvdCB2YWx1ZS4gJyArICdGdW5jdGlvbnMgbWF5IGNsb3NlIG92ZXIgbXV0YWJsZSB2YWx1ZXMgYW5kIGNhdXNlIHRlYXJpbmcuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbXV0YWJsZSBzb3VyY2UgYmVpbmcgc2hhcmVkIGJldHdlZW4gcmVuZGVyZXJzLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgaWYgdGhlIHNvdXJjZSBpcyBtdXRhdGVkIGJldHdlZW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgcmVuZGVyZXIsXG4gICAgLy8gVGhlIHNlY29uZCByZW5kZXJlciBkb24ndCBrbm93IHRoYXQgaXQgbmVlZHMgdG8gcmVzZXQgdGhlIFdJUCB2ZXJzaW9uIGR1cmluZyB1bndpbmQsXG4gICAgLy8gKGJlY2F1c2UgdGhlIGhvb2sgb25seSBtYXJrcyBzb3VyY2VzIGFzIGRpcnR5IGlmIGl0J3Mgd3JpdHRlbiB0byB0aGVpciBXSVAgdmVyc2lvbikuXG4gICAgLy8gVGhhdCB3b3VsZCBjYXVzZSB0aGlzIHRlYXIgY2hlY2sgdG8gdGhyb3cgYWdhaW4gYW5kIGV2ZW50dWFsbHkgYmUgdmlzaWJsZSB0byB0aGUgdXNlci5cbiAgICAvLyBXZSBjYW4gYXZvaWQgdGhpcyBpbmZpbml0ZSBsb29wIGJ5IGV4cGxpY2l0bHkgbWFya2luZyB0aGUgc291cmNlIGFzIGRpcnR5LlxuICAgIC8vXG4gICAgLy8gVGhpcyBjYW4gbGVhZCB0byB0ZWFyaW5nIGluIHRoZSBmaXJzdCByZW5kZXJlciB3aGVuIGl0IHJlc3VtZXMsXG4gICAgLy8gYnV0IHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCAoc2hvcnQgb2YgdGhyb3dpbmcgaGVyZSBhbmQgcmVmdXNpbmcgdG8gY29udGludWUgdGhlIHJlbmRlcikuXG4gICAgbWFya1NvdXJjZUFzRGlydHkoc291cmNlKTtcblxuICAgIHtcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoIFwiQ2Fubm90IHJlYWQgZnJvbSBtdXRhYmxlIHNvdXJjZSBkdXJpbmcgdGhlIGN1cnJlbnQgcmVuZGVyIHdpdGhvdXQgdGVhcmluZy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNlTXV0YWJsZVNvdXJjZShob29rLCBzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIHJvb3QgPSBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKTtcblxuICBpZiAoIShyb290ICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBnZXRWZXJzaW9uID0gc291cmNlLl9nZXRWZXJzaW9uO1xuICB2YXIgdmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG5cbiAgdmFyIF9kaXNwYXRjaGVyJHVzZVN0YXRlID0gZGlzcGF0Y2hlci51c2VTdGF0ZShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlYWRGcm9tVW5zdWJjcmliZWRNdXRhYmxlU291cmNlKHJvb3QsIHNvdXJjZSwgZ2V0U25hcHNob3QpO1xuICB9KSxcbiAgICAgIGN1cnJlbnRTbmFwc2hvdCA9IF9kaXNwYXRjaGVyJHVzZVN0YXRlWzBdLFxuICAgICAgc2V0U25hcHNob3QgPSBfZGlzcGF0Y2hlciR1c2VTdGF0ZVsxXTtcblxuICB2YXIgc25hcHNob3QgPSBjdXJyZW50U25hcHNob3Q7IC8vIEdyYWIgYSBoYW5kbGUgdG8gdGhlIHN0YXRlIGhvb2sgYXMgd2VsbC5cbiAgLy8gV2UgdXNlIGl0IHRvIGNsZWFyIHRoZSBwZW5kaW5nIHVwZGF0ZSBxdWV1ZSBpZiB3ZSBoYXZlIGEgbmV3IHNvdXJjZS5cblxuICB2YXIgc3RhdGVIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rO1xuICB2YXIgbWVtb2l6ZWRTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgdmFyIHJlZnMgPSBtZW1vaXplZFN0YXRlLnJlZnM7XG4gIHZhciBwcmV2R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICB2YXIgcHJldlNvdXJjZSA9IG1lbW9pemVkU3RhdGUuc291cmNlO1xuICB2YXIgcHJldlN1YnNjcmliZSA9IG1lbW9pemVkU3RhdGUuc3Vic2NyaWJlO1xuICB2YXIgZmliZXIgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgcmVmczogcmVmcyxcbiAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZVxuICB9OyAvLyBTeW5jIHRoZSB2YWx1ZXMgbmVlZGVkIGJ5IG91ciBzdWJzY3JpcHRpb24gaGFuZGxlciBhZnRlciBlYWNoIGNvbW1pdC5cblxuICBkaXNwYXRjaGVyLnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmVmcy5nZXRTbmFwc2hvdCA9IGdldFNuYXBzaG90OyAvLyBOb3JtYWxseSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24gZm9yIGEgc3RhdGUgaG9vayBuZXZlciBjaGFuZ2VzLFxuICAgIC8vIGJ1dCB0aGlzIGhvb2sgcmVjcmVhdGVzIHRoZSBxdWV1ZSBpbiBjZXJ0YWluIGNhc2VzICB0byBhdm9pZCB1cGRhdGVzIGZyb20gc3RhbGUgc291cmNlcy5cbiAgICAvLyBoYW5kbGVDaGFuZ2UoKSBiZWxvdyBuZWVkcyB0byByZWZlcmVuY2UgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpdGhvdXQgcmUtc3Vic2NyaWJpbmcsXG4gICAgLy8gc28gd2UgdXNlIGEgcmVmIHRvIGVuc3VyZSB0aGF0IGl0IGFsd2F5cyBoYXMgdGhlIGxhdGVzdCB2ZXJzaW9uLlxuXG4gICAgcmVmcy5zZXRTbmFwc2hvdCA9IHNldFNuYXBzaG90OyAvLyBDaGVjayBmb3IgYSBwb3NzaWJsZSBjaGFuZ2UgYmV0d2VlbiB3aGVuIHdlIGxhc3QgcmVuZGVyZWQgbm93LlxuXG4gICAgdmFyIG1heWJlTmV3VmVyc2lvbiA9IGdldFZlcnNpb24oc291cmNlLl9zb3VyY2UpO1xuXG4gICAgaWYgKCFvYmplY3RJcyh2ZXJzaW9uLCBtYXliZU5ld1ZlcnNpb24pKSB7XG4gICAgICB2YXIgbWF5YmVOZXdTbmFwc2hvdCA9IGdldFNuYXBzaG90KHNvdXJjZS5fc291cmNlKTtcblxuICAgICAge1xuICAgICAgICBpZiAodHlwZW9mIG1heWJlTmV3U25hcHNob3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBlcnJvcignTXV0YWJsZSBzb3VyY2Ugc2hvdWxkIG5vdCByZXR1cm4gYSBmdW5jdGlvbiBhcyB0aGUgc25hcHNob3QgdmFsdWUuICcgKyAnRnVuY3Rpb25zIG1heSBjbG9zZSBvdmVyIG11dGFibGUgdmFsdWVzIGFuZCBjYXVzZSB0ZWFyaW5nLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghb2JqZWN0SXMoc25hcHNob3QsIG1heWJlTmV3U25hcHNob3QpKSB7XG4gICAgICAgIHNldFNuYXBzaG90KG1heWJlTmV3U25hcHNob3QpO1xuICAgICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgICAgbWFya1Jvb3RNdXRhYmxlUmVhZChyb290LCBsYW5lKTtcbiAgICAgIH0gLy8gSWYgdGhlIHNvdXJjZSBtdXRhdGVkIGJldHdlZW4gcmVuZGVyIGFuZCBub3csXG4gICAgICAvLyB0aGVyZSBtYXkgYmUgc3RhdGUgdXBkYXRlcyBhbHJlYWR5IHNjaGVkdWxlZCBmcm9tIHRoZSBvbGQgc291cmNlLlxuICAgICAgLy8gRW50YW5nbGUgdGhlIHVwZGF0ZXMgc28gdGhhdCB0aGV5IHJlbmRlciBpbiB0aGUgc2FtZSBiYXRjaC5cblxuXG4gICAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCByb290Lm11dGFibGVSZWFkTGFuZXMpO1xuICAgIH1cbiAgfSwgW2dldFNuYXBzaG90LCBzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiB3ZSBnb3QgYSBuZXcgc291cmNlIG9yIHN1YnNjcmliZSBmdW5jdGlvbiwgcmUtc3Vic2NyaWJlIGluIGEgcGFzc2l2ZSBlZmZlY3QuXG5cbiAgZGlzcGF0Y2hlci51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBoYW5kbGVDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbGF0ZXN0R2V0U25hcHNob3QgPSByZWZzLmdldFNuYXBzaG90O1xuICAgICAgdmFyIGxhdGVzdFNldFNuYXBzaG90ID0gcmVmcy5zZXRTbmFwc2hvdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGF0ZXN0U2V0U25hcHNob3QobGF0ZXN0R2V0U25hcHNob3Qoc291cmNlLl9zb3VyY2UpKTsgLy8gUmVjb3JkIGEgcGVuZGluZyBtdXRhYmxlIHNvdXJjZSB1cGRhdGUgd2l0aCB0aGUgc2FtZSBleHBpcmF0aW9uIHRpbWUuXG5cbiAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgICAgIG1hcmtSb290TXV0YWJsZVJlYWQocm9vdCwgbGFuZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBBIHNlbGVjdG9yIG1pZ2h0IHRocm93IGFmdGVyIGEgc291cmNlIG11dGF0aW9uLlxuICAgICAgICAvLyBlLmcuIGl0IG1pZ2h0IHRyeSB0byByZWFkIGZyb20gYSBwYXJ0IG9mIHRoZSBzdG9yZSB0aGF0IG5vIGxvbmdlciBleGlzdHMuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgc3RpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIHdpdGggUmVhY3QuXG4gICAgICAgIC8vIFdvcnN0IGNhc2UgdGhlIHNlbGVjdG9yIHdpbGwgdGhyb3cgYWdhaW4gYW5kIHRoZW4gYW4gZXJyb3IgYm91bmRhcnkgd2lsbCBoYW5kbGUgaXQuXG4gICAgICAgIGxhdGVzdFNldFNuYXBzaG90KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciB1bnN1YnNjcmliZSA9IHN1YnNjcmliZShzb3VyY2UuX3NvdXJjZSwgaGFuZGxlQ2hhbmdlKTtcblxuICAgIHtcbiAgICAgIGlmICh0eXBlb2YgdW5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXJyb3IoJ011dGFibGUgc291cmNlIHN1YnNjcmliZSBmdW5jdGlvbiBtdXN0IHJldHVybiBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5zdWJzY3JpYmU7XG4gIH0sIFtzb3VyY2UsIHN1YnNjcmliZV0pOyAvLyBJZiBhbnkgb2YgdGhlIGlucHV0cyB0byB1c2VNdXRhYmxlU291cmNlIGNoYW5nZSwgcmVhZGluZyBpcyBwb3RlbnRpYWxseSB1bnNhZmUuXG4gIC8vXG4gIC8vIElmIGVpdGhlciB0aGUgc291cmNlIG9yIHRoZSBzdWJzY3JpcHRpb24gaGF2ZSBjaGFuZ2VkIHdlIGNhbid0IGNhbid0IHRydXN0IHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIE1heWJlIHRoZSBzb3VyY2UgY2hhbmdlZCBpbiBhIHdheSB0aGF0IHRoZSBvbGQgc3Vic2NyaXB0aW9uIGlnbm9yZWQgYnV0IHRoZSBuZXcgb25lIGRlcGVuZHMgb24uXG4gIC8vXG4gIC8vIElmIHRoZSBnZXRTbmFwc2hvdCBmdW5jdGlvbiBjaGFuZ2VkLCB3ZSBhbHNvIHNob3VsZG4ndCByZWx5IG9uIHRoZSB1cGRhdGUgcXVldWUuXG4gIC8vIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgdW5kZXJseWluZyBzb3VyY2Ugd2FzIG11dGF0ZWQgYmV0d2VlbiB0aGUgd2hlbiB0aGUgbGFzdCBcImNoYW5nZVwiIGV2ZW50IGZpcmVkLFxuICAvLyBhbmQgd2hlbiB0aGUgY3VycmVudCByZW5kZXIgKHdpdGggdGhlIG5ldyBnZXRTbmFwc2hvdCBmdW5jdGlvbikgaXMgcHJvY2Vzc2VkLlxuICAvL1xuICAvLyBJbiBib3RoIGNhc2VzLCB3ZSBuZWVkIHRvIHRocm93IGF3YXkgcGVuZGluZyB1cGRhdGVzIChzaW5jZSB0aGV5IGFyZSBubyBsb25nZXIgcmVsZXZhbnQpXG4gIC8vIGFuZCB0cmVhdCByZWFkaW5nIGZyb20gdGhlIHNvdXJjZSBhcyB3ZSBkbyBpbiB0aGUgbW91bnQgY2FzZS5cblxuICBpZiAoIW9iamVjdElzKHByZXZHZXRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHx8ICFvYmplY3RJcyhwcmV2U291cmNlLCBzb3VyY2UpIHx8ICFvYmplY3RJcyhwcmV2U3Vic2NyaWJlLCBzdWJzY3JpYmUpKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IHF1ZXVlIGFuZCBzZXRTdGF0ZSBtZXRob2QsXG4gICAgLy8gU28gaWYgdGhlcmUgYXJlIGludGVybGVhdmVkIHVwZGF0ZXMsIHRoZXkgZ2V0IHB1c2hlZCB0byB0aGUgb2xkZXIgcXVldWUuXG4gICAgLy8gV2hlbiB0aGlzIGJlY29tZXMgY3VycmVudCwgdGhlIHByZXZpb3VzIHF1ZXVlIGFuZCBkaXNwYXRjaCBtZXRob2Qgd2lsbCBiZSBkaXNjYXJkZWQsXG4gICAgLy8gaW5jbHVkaW5nIGFueSBpbnRlcmxlYXZpbmcgdXBkYXRlcyB0aGF0IG9jY3VyLlxuICAgIHZhciBuZXdRdWV1ZSA9IHtcbiAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IHNuYXBzaG90XG4gICAgfTtcbiAgICBuZXdRdWV1ZS5kaXNwYXRjaCA9IHNldFNuYXBzaG90ID0gZGlzcGF0Y2hBY3Rpb24uYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLCBuZXdRdWV1ZSk7XG4gICAgc3RhdGVIb29rLnF1ZXVlID0gbmV3UXVldWU7XG4gICAgc3RhdGVIb29rLmJhc2VRdWV1ZSA9IG51bGw7XG4gICAgc25hcHNob3QgPSByZWFkRnJvbVVuc3ViY3JpYmVkTXV0YWJsZVNvdXJjZShyb290LCBzb3VyY2UsIGdldFNuYXBzaG90KTtcbiAgICBzdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZSA9IHN0YXRlSG9vay5iYXNlU3RhdGUgPSBzbmFwc2hvdDtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcbn1cblxuZnVuY3Rpb24gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICByZWZzOiB7XG4gICAgICBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsXG4gICAgICBzZXRTbmFwc2hvdDogbnVsbFxuICAgIH0sXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmVcbiAgfTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIHVzZU11dGFibGVTb3VyY2UoaG9vaywgc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbn1cblxuZnVuY3Rpb24gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuXG4gIGlmICh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogRmxvdyBkb2Vzbid0IGxpa2UgbWl4ZWQgdHlwZXNcbiAgICBpbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGUoKTtcbiAgfVxuXG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IGhvb2suYmFzZVN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICB2YXIgcXVldWUgPSBob29rLnF1ZXVlID0ge1xuICAgIHBlbmRpbmc6IG51bGwsXG4gICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVxuICB9O1xuICB2YXIgZGlzcGF0Y2ggPSBxdWV1ZS5kaXNwYXRjaCA9IGRpc3BhdGNoQWN0aW9uLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSwgcXVldWUpO1xuICByZXR1cm4gW2hvb2subWVtb2l6ZWRTdGF0ZSwgZGlzcGF0Y2hdO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgcmV0dXJuIHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbn1cblxuZnVuY3Rpb24gcHVzaEVmZmVjdCh0YWcsIGNyZWF0ZSwgZGVzdHJveSwgZGVwcykge1xuICB2YXIgZWZmZWN0ID0ge1xuICAgIHRhZzogdGFnLFxuICAgIGNyZWF0ZTogY3JlYXRlLFxuICAgIGRlc3Ryb3k6IGRlc3Ryb3ksXG4gICAgZGVwczogZGVwcyxcbiAgICAvLyBDaXJjdWxhclxuICAgIG5leHQ6IG51bGxcbiAgfTtcbiAgdmFyIGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS51cGRhdGVRdWV1ZTtcblxuICBpZiAoY29tcG9uZW50VXBkYXRlUXVldWUgPT09IG51bGwpIHtcbiAgICBjb21wb25lbnRVcGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKTtcbiAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLnVwZGF0ZVF1ZXVlID0gY29tcG9uZW50VXBkYXRlUXVldWU7XG4gICAgY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdCA9IGVmZmVjdC5uZXh0ID0gZWZmZWN0O1xuICB9IGVsc2Uge1xuICAgIHZhciBsYXN0RWZmZWN0ID0gY29tcG9uZW50VXBkYXRlUXVldWUubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0Lm5leHQgPSBlZmZlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgIGxhc3RFZmZlY3QubmV4dCA9IGVmZmVjdDtcbiAgICAgIGVmZmVjdC5uZXh0ID0gZmlyc3RFZmZlY3Q7XG4gICAgICBjb21wb25lbnRVcGRhdGVRdWV1ZS5sYXN0RWZmZWN0ID0gZWZmZWN0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlZmZlY3Q7XG59XG5cbmZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciByZWYgPSB7XG4gICAgY3VycmVudDogaW5pdGlhbFZhbHVlXG4gIH07XG5cbiAge1xuICAgIE9iamVjdC5zZWFsKHJlZik7XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSByZWY7XG4gIHJldHVybiByZWY7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgcmV0dXJuIGhvb2subWVtb2l6ZWRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEuZmxhZ3MgfD0gZmliZXJGbGFncztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBob29rRmxhZ3MsIGNyZWF0ZSwgdW5kZWZpbmVkLCBuZXh0RGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUVmZmVjdEltcGwoZmliZXJGbGFncywgaG9va0ZsYWdzLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBkZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gIGlmIChjdXJyZW50SG9vayAhPT0gbnVsbCkge1xuICAgIHZhciBwcmV2RWZmZWN0ID0gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICBkZXN0cm95ID0gcHJldkVmZmVjdC5kZXN0cm95O1xuXG4gICAgaWYgKG5leHREZXBzICE9PSBudWxsKSB7XG4gICAgICB2YXIgcHJldkRlcHMgPSBwcmV2RWZmZWN0LmRlcHM7XG5cbiAgICAgIGlmIChhcmVIb29rSW5wdXRzRXF1YWwobmV4dERlcHMsIHByZXZEZXBzKSkge1xuICAgICAgICBwdXNoRWZmZWN0KGhvb2tGbGFncywgY3JlYXRlLCBkZXN0cm95LCBuZXh0RGVwcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxLmZsYWdzIHw9IGZpYmVyRmxhZ3M7XG4gIGhvb2subWVtb2l6ZWRTdGF0ZSA9IHB1c2hFZmZlY3QoSGFzRWZmZWN0IHwgaG9va0ZsYWdzLCBjcmVhdGUsIGRlc3Ryb3ksIG5leHREZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlIHwgUGFzc2l2ZSwgUGFzc2l2ZSQxLCBjcmVhdGUsIGRlcHMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmTm90Q3VycmVudGx5QWN0aW5nRWZmZWN0c0luREVWKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSB8IFBhc3NpdmUsIFBhc3NpdmUkMSwgY3JlYXRlLCBkZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gIHJldHVybiBtb3VudEVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoVXBkYXRlLCBMYXlvdXQsIGNyZWF0ZSwgZGVwcyk7XG59XG5cbmZ1bmN0aW9uIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QoY3JlYXRlLCByZWYpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVmQ2FsbGJhY2sgPSByZWY7XG5cbiAgICB2YXIgX2luc3QgPSBjcmVhdGUoKTtcblxuICAgIHJlZkNhbGxiYWNrKF9pbnN0KTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmVmQ2FsbGJhY2sobnVsbCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgcmVmT2JqZWN0ID0gcmVmO1xuXG4gICAge1xuICAgICAgaWYgKCFyZWZPYmplY3QuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIGZpcnN0IGFyZ3VtZW50IHRvIGVpdGhlciBiZSBhICcgKyAncmVmIGNhbGxiYWNrIG9yIFJlYWN0LmNyZWF0ZVJlZigpIG9iamVjdC4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgJ2FuIG9iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhyZWZPYmplY3QpLmpvaW4oJywgJykgKyAnfScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBfaW5zdDIgPSBjcmVhdGUoKTtcblxuICAgIHJlZk9iamVjdC5jdXJyZW50ID0gX2luc3QyO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICByZWZPYmplY3QuY3VycmVudCA9IG51bGw7XG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgY3JlYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBlcnJvcignRXhwZWN0ZWQgdXNlSW1wZXJhdGl2ZUhhbmRsZSgpIHNlY29uZCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uICcgKyAndGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjcmVhdGUgIT09IG51bGwgPyB0eXBlb2YgY3JlYXRlIDogJ251bGwnKTtcbiAgICB9XG4gIH0gLy8gVE9ETzogSWYgZGVwcyBhcmUgcHJvdmlkZWQsIHNob3VsZCB3ZSBza2lwIGNvbXBhcmluZyB0aGUgcmVmIGl0c2VsZj9cblxuXG4gIHZhciBlZmZlY3REZXBzID0gZGVwcyAhPT0gbnVsbCAmJiBkZXBzICE9PSB1bmRlZmluZWQgPyBkZXBzLmNvbmNhdChbcmVmXSkgOiBudWxsO1xuICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gJyArICd0aGF0IGNyZWF0ZXMgYSBoYW5kbGUuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLicsIGNyZWF0ZSAhPT0gbnVsbCA/IHR5cGVvZiBjcmVhdGUgOiAnbnVsbCcpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiBJZiBkZXBzIGFyZSBwcm92aWRlZCwgc2hvdWxkIHdlIHNraXAgY29tcGFyaW5nIHRoZSByZWYgaXRzZWxmP1xuXG5cbiAgdmFyIGVmZmVjdERlcHMgPSBkZXBzICE9PSBudWxsICYmIGRlcHMgIT09IHVuZGVmaW5lZCA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKFVwZGF0ZSwgTGF5b3V0LCBpbXBlcmF0aXZlSGFuZGxlRWZmZWN0LmJpbmQobnVsbCwgY3JlYXRlLCByZWYpLCBlZmZlY3REZXBzKTtcbn1cblxuZnVuY3Rpb24gbW91bnREZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikgey8vIFRoaXMgaG9vayBpcyBub3JtYWxseSBhIG5vLW9wLlxuICAvLyBUaGUgcmVhY3QtZGVidWctaG9va3MgcGFja2FnZSBpbmplY3RzIGl0cyBvd24gaW1wbGVtZW50YXRpb25cbiAgLy8gc28gdGhhdCBlLmcuIERldlRvb2xzIGNhbiBkaXNwbGF5IGN1c3RvbSBob29rIHZhbHVlcy5cbn1cblxudmFyIHVwZGF0ZURlYnVnVmFsdWUgPSBtb3VudERlYnVnVmFsdWU7XG5cbmZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW2NhbGxiYWNrLCBuZXh0RGVwc107XG4gIHJldHVybiBjYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgdmFyIG5leHREZXBzID0gZGVwcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGRlcHM7XG4gIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgIGlmIChuZXh0RGVwcyAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZEZXBzID0gcHJldlN0YXRlWzFdO1xuXG4gICAgICBpZiAoYXJlSG9va0lucHV0c0VxdWFsKG5leHREZXBzLCBwcmV2RGVwcykpIHtcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBob29rLm1lbW9pemVkU3RhdGUgPSBbY2FsbGJhY2ssIG5leHREZXBzXTtcbiAgcmV0dXJuIGNhbGxiYWNrO1xufVxuXG5mdW5jdGlvbiBtb3VudE1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gIHZhciBuZXh0RGVwcyA9IGRlcHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkZXBzO1xuICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBuZXh0RGVwc107XG4gIHJldHVybiBuZXh0VmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICB2YXIgbmV4dERlcHMgPSBkZXBzID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVwcztcbiAgdmFyIHByZXZTdGF0ZSA9IGhvb2subWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgLy8gQXNzdW1lIHRoZXNlIGFyZSBkZWZpbmVkLiBJZiB0aGV5J3JlIG5vdCwgYXJlSG9va0lucHV0c0VxdWFsIHdpbGwgd2Fybi5cbiAgICBpZiAobmV4dERlcHMgIT09IG51bGwpIHtcbiAgICAgIHZhciBwcmV2RGVwcyA9IHByZXZTdGF0ZVsxXTtcblxuICAgICAgaWYgKGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpKSB7XG4gICAgICAgIHJldHVybiBwcmV2U3RhdGVbMF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIG5leHRWYWx1ZSA9IG5leHRDcmVhdGUoKTtcbiAgaG9vay5tZW1vaXplZFN0YXRlID0gW25leHRWYWx1ZSwgbmV4dERlcHNdO1xuICByZXR1cm4gbmV4dFZhbHVlO1xufVxuXG5mdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9tb3VudFN0YXRlID0gbW91bnRTdGF0ZSh2YWx1ZSksXG4gICAgICBwcmV2VmFsdWUgPSBfbW91bnRTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX21vdW50U3RhdGVbMV07XG5cbiAgbW91bnRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldFZhbHVlKHZhbHVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgfVxuICB9LCBbdmFsdWVdKTtcbiAgcmV0dXJuIHByZXZWYWx1ZTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSkge1xuICB2YXIgX3VwZGF0ZVN0YXRlID0gdXBkYXRlU3RhdGUoKSxcbiAgICAgIHByZXZWYWx1ZSA9IF91cGRhdGVTdGF0ZVswXSxcbiAgICAgIHNldFZhbHVlID0gX3VwZGF0ZVN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUpIHtcbiAgdmFyIF9yZXJlbmRlclN0YXRlID0gcmVyZW5kZXJTdGF0ZSgpLFxuICAgICAgcHJldlZhbHVlID0gX3JlcmVuZGVyU3RhdGVbMF0sXG4gICAgICBzZXRWYWx1ZSA9IF9yZXJlbmRlclN0YXRlWzFdO1xuXG4gIHVwZGF0ZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uO1xuICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICB0cnkge1xuICAgICAgc2V0VmFsdWUodmFsdWUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyQxLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gcHJldlZhbHVlO1xufVxuXG5mdW5jdGlvbiBzdGFydFRyYW5zaXRpb24oc2V0UGVuZGluZywgY2FsbGJhY2spIHtcbiAgdmFyIHByaW9yaXR5TGV2ZWwgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpO1xuXG4gIHtcbiAgICBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsIDwgVXNlckJsb2NraW5nUHJpb3JpdHkkMiA/IFVzZXJCbG9ja2luZ1ByaW9yaXR5JDIgOiBwcmlvcml0eUxldmVsLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRQZW5kaW5nKHRydWUpO1xuICAgIH0pO1xuICAgIHJ1bldpdGhQcmlvcml0eSQxKHByaW9yaXR5TGV2ZWwgPiBOb3JtYWxQcmlvcml0eSQxID8gTm9ybWFsUHJpb3JpdHkkMSA6IHByaW9yaXR5TGV2ZWwsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwcmV2VHJhbnNpdGlvbiA9IFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbjtcbiAgICAgIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnJDEudHJhbnNpdGlvbiA9IDE7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldFBlbmRpbmcoZmFsc2UpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50QmF0Y2hDb25maWckMS50cmFuc2l0aW9uID0gcHJldlRyYW5zaXRpb247XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRUcmFuc2l0aW9uKCkge1xuICB2YXIgX21vdW50U3RhdGUyID0gbW91bnRTdGF0ZShmYWxzZSksXG4gICAgICBpc1BlbmRpbmcgPSBfbW91bnRTdGF0ZTJbMF0sXG4gICAgICBzZXRQZW5kaW5nID0gX21vdW50U3RhdGUyWzFdOyAvLyBUaGUgYHN0YXJ0YCBtZXRob2QgY2FuIGJlIHN0b3JlZCBvbiBhIHJlZiwgc2luY2UgYHNldFBlbmRpbmdgXG4gIC8vIG5ldmVyIGNoYW5nZXMuXG5cblxuICB2YXIgc3RhcnQgPSBzdGFydFRyYW5zaXRpb24uYmluZChudWxsLCBzZXRQZW5kaW5nKTtcbiAgbW91bnRSZWYoc3RhcnQpO1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVUcmFuc2l0aW9uKCkge1xuICB2YXIgX3VwZGF0ZVN0YXRlMiA9IHVwZGF0ZVN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfdXBkYXRlU3RhdGUyWzBdO1xuXG4gIHZhciBzdGFydFJlZiA9IHVwZGF0ZVJlZigpO1xuICB2YXIgc3RhcnQgPSBzdGFydFJlZi5jdXJyZW50O1xuICByZXR1cm4gW3N0YXJ0LCBpc1BlbmRpbmddO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlclRyYW5zaXRpb24oKSB7XG4gIHZhciBfcmVyZW5kZXJTdGF0ZTIgPSByZXJlbmRlclN0YXRlKCksXG4gICAgICBpc1BlbmRpbmcgPSBfcmVyZW5kZXJTdGF0ZTJbMF07XG5cbiAgdmFyIHN0YXJ0UmVmID0gdXBkYXRlUmVmKCk7XG4gIHZhciBzdGFydCA9IHN0YXJ0UmVmLmN1cnJlbnQ7XG4gIHJldHVybiBbc3RhcnQsIGlzUGVuZGluZ107XG59XG5cbnZhciBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRJc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlSW5ERVYoKSB7XG4gIHtcbiAgICByZXR1cm4gaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuT25PcGFxdWVJZGVudGlmaWVyQWNjZXNzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIC8vIFRPRE86IFNob3VsZCB3YXJuIGluIGVmZmVjdHMgYW5kIGNhbGxiYWNrcywgdG9vXG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJztcblxuICAgIGlmIChnZXRJc1JlbmRlcmluZygpICYmICFkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdKSB7XG4gICAgICBlcnJvcignVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgJyArICdwYXNzZWQgdGhyb3VnaCB0byBhdHRyaWJ1dGVzIG9ubHkuIERvIG5vdCByZWFkIHRoZSAnICsgJ3ZhbHVlIGRpcmVjdGx5LicpO1xuXG4gICAgICBkaWRXYXJuQWJvdXRVc2VPcGFxdWVJZGVudGlmaWVyW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRPcGFxdWVJZGVudGlmaWVyKCkge1xuICB2YXIgbWFrZUlkID0gIG1ha2VDbGllbnRJZEluREVWLmJpbmQobnVsbCwgd2Fybk9uT3BhcXVlSWRlbnRpZmllckFjY2Vzc0luREVWLmJpbmQobnVsbCwgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSkpIDtcblxuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIHZhciBkaWRVcGdyYWRlID0gZmFsc2U7XG4gICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMTtcblxuICAgIHZhciByZWFkVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWRpZFVwZ3JhZGUpIHtcbiAgICAgICAgLy8gT25seSB1cGdyYWRlIG9uY2UuIFRoaXMgd29ya3MgZXZlbiBpbnNpZGUgdGhlIHJlbmRlciBwaGFzZSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB1cGRhdGUgaXMgYWRkZWQgdG8gYSBzaGFyZWQgcXVldWUsIHdoaWNoIG91dGxhc3RzIHRoZVxuICAgICAgICAvLyBpbi1wcm9ncmVzcyByZW5kZXIuXG4gICAgICAgIGRpZFVwZ3JhZGUgPSB0cnVlO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpc1VwZGF0aW5nT3BhcXVlVmFsdWVJblJlbmRlclBoYXNlID0gdHJ1ZTtcbiAgICAgICAgICBzZXRJZChtYWtlSWQoKSk7XG4gICAgICAgICAgaXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZSA9IGZhbHNlO1xuICAgICAgICAgIHdhcm5Pbk9wYXF1ZUlkZW50aWZpZXJBY2Nlc3NJbkRFVihmaWJlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiVGhlIG9iamVjdCBwYXNzZWQgYmFjayBmcm9tIHVzZU9wYXF1ZUlkZW50aWZpZXIgaXMgbWVhbnQgdG8gYmUgcGFzc2VkIHRocm91Z2ggdG8gYXR0cmlidXRlcyBvbmx5LiBEbyBub3QgcmVhZCB0aGUgdmFsdWUgZGlyZWN0bHkuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgaWQgPSBtYWtlT3BhcXVlSHlkcmF0aW5nT2JqZWN0KHJlYWRWYWx1ZSk7XG4gICAgdmFyIHNldElkID0gbW91bnRTdGF0ZShpZClbMV07XG5cbiAgICBpZiAoKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMS5mbGFncyB8PSBVcGRhdGUgfCBQYXNzaXZlO1xuICAgICAgcHVzaEVmZmVjdChIYXNFZmZlY3QgfCBQYXNzaXZlJDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0SWQobWFrZUlkKCkpO1xuICAgICAgfSwgdW5kZWZpbmVkLCBudWxsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWQ7XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9pZCA9IG1ha2VJZCgpO1xuXG4gICAgbW91bnRTdGF0ZShfaWQpO1xuICAgIHJldHVybiBfaWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpIHtcbiAgdmFyIGlkID0gdXBkYXRlU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZXJlbmRlck9wYXF1ZUlkZW50aWZpZXIoKSB7XG4gIHZhciBpZCA9IHJlcmVuZGVyU3RhdGUoKVswXTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBkaXNwYXRjaEFjdGlvbihmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbM10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKFwiU3RhdGUgdXBkYXRlcyBmcm9tIHRoZSB1c2VTdGF0ZSgpIGFuZCB1c2VSZWR1Y2VyKCkgSG9va3MgZG9uJ3Qgc3VwcG9ydCB0aGUgXCIgKyAnc2Vjb25kIGNhbGxiYWNrIGFyZ3VtZW50LiBUbyBleGVjdXRlIGEgc2lkZSBlZmZlY3QgYWZ0ZXIgJyArICdyZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gIHZhciB1cGRhdGUgPSB7XG4gICAgbGFuZTogbGFuZSxcbiAgICBhY3Rpb246IGFjdGlvbixcbiAgICBlYWdlclJlZHVjZXI6IG51bGwsXG4gICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICBuZXh0OiBudWxsXG4gIH07IC8vIEFwcGVuZCB0aGUgdXBkYXRlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuXG5cbiAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuXG4gIGlmIChwZW5kaW5nID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdXBkYXRlLiBDcmVhdGUgYSBjaXJjdWxhciBsaXN0LlxuICAgIHVwZGF0ZS5uZXh0ID0gdXBkYXRlO1xuICB9IGVsc2Uge1xuICAgIHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0O1xuICAgIHBlbmRpbmcubmV4dCA9IHVwZGF0ZTtcbiAgfVxuXG4gIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGZpYmVyID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxIHx8IGFsdGVybmF0ZSAhPT0gbnVsbCAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEpIHtcbiAgICAvLyBUaGlzIGlzIGEgcmVuZGVyIHBoYXNlIHVwZGF0ZS4gU3Rhc2ggaXQgaW4gYSBsYXppbHktY3JlYXRlZCBtYXAgb2ZcbiAgICAvLyBxdWV1ZSAtPiBsaW5rZWQgbGlzdCBvZiB1cGRhdGVzLiBBZnRlciB0aGlzIHJlbmRlciBwYXNzLCB3ZSdsbCByZXN0YXJ0XG4gICAgLy8gYW5kIGFwcGx5IHRoZSBzdGFzaGVkIHVwZGF0ZXMgb24gdG9wIG9mIHRoZSB3b3JrLWluLXByb2dyZXNzIGhvb2suXG4gICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZUR1cmluZ1RoaXNQYXNzID0gZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGZpYmVyLmxhbmVzID09PSBOb0xhbmVzICYmIChhbHRlcm5hdGUgPT09IG51bGwgfHwgYWx0ZXJuYXRlLmxhbmVzID09PSBOb0xhbmVzKSkge1xuICAgICAgLy8gVGhlIHF1ZXVlIGlzIGN1cnJlbnRseSBlbXB0eSwgd2hpY2ggbWVhbnMgd2UgY2FuIGVhZ2VybHkgY29tcHV0ZSB0aGVcbiAgICAgIC8vIG5leHQgc3RhdGUgYmVmb3JlIGVudGVyaW5nIHRoZSByZW5kZXIgcGhhc2UuIElmIHRoZSBuZXcgc3RhdGUgaXMgdGhlXG4gICAgICAvLyBzYW1lIGFzIHRoZSBjdXJyZW50IHN0YXRlLCB3ZSBtYXkgYmUgYWJsZSB0byBiYWlsIG91dCBlbnRpcmVseS5cbiAgICAgIHZhciBsYXN0UmVuZGVyZWRSZWR1Y2VyID0gcXVldWUubGFzdFJlbmRlcmVkUmVkdWNlcjtcblxuICAgICAgaWYgKGxhc3RSZW5kZXJlZFJlZHVjZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBjdXJyZW50U3RhdGUgPSBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZTtcbiAgICAgICAgICB2YXIgZWFnZXJTdGF0ZSA9IGxhc3RSZW5kZXJlZFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pOyAvLyBTdGFzaCB0aGUgZWFnZXJseSBjb21wdXRlZCBzdGF0ZSwgYW5kIHRoZSByZWR1Y2VyIHVzZWQgdG8gY29tcHV0ZVxuICAgICAgICAgIC8vIGl0LCBvbiB0aGUgdXBkYXRlIG9iamVjdC4gSWYgdGhlIHJlZHVjZXIgaGFzbid0IGNoYW5nZWQgYnkgdGhlXG4gICAgICAgICAgLy8gdGltZSB3ZSBlbnRlciB0aGUgcmVuZGVyIHBoYXNlLCB0aGVuIHRoZSBlYWdlciBzdGF0ZSBjYW4gYmUgdXNlZFxuICAgICAgICAgIC8vIHdpdGhvdXQgY2FsbGluZyB0aGUgcmVkdWNlciBhZ2Fpbi5cblxuICAgICAgICAgIHVwZGF0ZS5lYWdlclJlZHVjZXIgPSBsYXN0UmVuZGVyZWRSZWR1Y2VyO1xuICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcblxuICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGguIFdlIGNhbiBiYWlsIG91dCB3aXRob3V0IHNjaGVkdWxpbmcgUmVhY3QgdG8gcmUtcmVuZGVyLlxuICAgICAgICAgICAgLy8gSXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IHdlJ2xsIG5lZWQgdG8gcmViYXNlIHRoaXMgdXBkYXRlIGxhdGVyLFxuICAgICAgICAgICAgLy8gaWYgdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIGZvciBhIGRpZmZlcmVudCByZWFzb24gYW5kIGJ5IHRoYXRcbiAgICAgICAgICAgIC8vIHRpbWUgdGhlIHJlZHVjZXIgaGFzIGNoYW5nZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikgey8vIFN1cHByZXNzIHRoZSBlcnJvci4gSXQgd2lsbCB0aHJvdyBhZ2FpbiBpbiB0aGUgcmVuZGVyIHBoYXNlLlxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgLy8gJEZsb3dFeHBlY3RlZEVycm9yIC0gamVzdCBpc24ndCBhIGdsb2JhbCwgYW5kIGlzbid0IHJlY29nbml6ZWQgb3V0c2lkZSBvZiB0ZXN0c1xuICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgICB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpO1xuICAgICAgICB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5EZXYoZmliZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgfVxufVxuXG52YXIgQ29udGV4dE9ubHlEaXNwYXRjaGVyID0ge1xuICByZWFkQ29udGV4dDogcmVhZENvbnRleHQsXG4gIHVzZUNhbGxiYWNrOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUNvbnRleHQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTGF5b3V0RWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgdXNlTXV0YWJsZVNvdXJjZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICB1c2VPcGFxdWVJZGVudGlmaWVyOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxufTtcbnZhciBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGw7XG52YXIgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSBudWxsO1xudmFyIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsO1xuXG57XG4gIHZhciB3YXJuSW52YWxpZENvbnRleHRBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0NvbnRleHQgY2FuIG9ubHkgYmUgcmVhZCB3aGlsZSBSZWFjdCBpcyByZW5kZXJpbmcuICcgKyAnSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gJyArICdJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgJyArICdpbnNpZGUgSG9va3MgbGlrZSB1c2VSZWR1Y2VyKCkgb3IgdXNlTWVtbygpLicpO1xuICB9O1xuXG4gIHZhciB3YXJuSW52YWxpZEhvb2tBY2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgZXJyb3IoJ0RvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gJyArICdZb3UgY2FuIG9ubHkgY2FsbCBIb29rcyBhdCB0aGUgdG9wIGxldmVsIG9mIHlvdXIgUmVhY3QgZnVuY3Rpb24uICcgKyAnRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ydWxlcy1vZi1ob29rcycpO1xuICB9O1xuXG4gIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIGNoZWNrRGVwc0FyZUFycmF5RGV2KGRlcHMpO1xuICAgICAgcmV0dXJuIG1vdW50TGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudFRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE11dGFibGVTb3VyY2Uoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKTtcbiAgICB9LFxuICAgIHVzZU9wYXF1ZUlkZW50aWZpZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU9wYXF1ZUlkZW50aWZpZXInO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50V2l0aEhvb2tUeXBlc0luREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudEltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50TWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudFJlZHVjZXIocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVmOiBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWYnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRUcmFuc2l0aW9uKCk7XG4gICAgfSxcbiAgICB1c2VNdXRhYmxlU291cmNlOiBmdW5jdGlvbiAoc291cmNlLCBnZXRTbmFwc2hvdCwgc3Vic2NyaWJlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNdXRhYmxlU291cmNlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50TXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWJ1Z1ZhbHVlKCk7XG4gICAgfSxcbiAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlZmVycmVkVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTXV0YWJsZVNvdXJjZShzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpO1xuICAgIH0sXG4gICAgdXNlT3BhcXVlSWRlbnRpZmllcjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlT3BhcXVlSWRlbnRpZmllcic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbiAgSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRWZmZWN0JztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VNZW1vJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZHVjZXInO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVSZWYoKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZURlYnVnVmFsdWUnO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyRGVmZXJyZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSxcbiAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VUcmFuc2l0aW9uJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlcmVuZGVyT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDb250ZXh0JztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlOiBmdW5jdGlvbiAocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUltcGVyYXRpdmVIYW5kbGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVJlZic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VTdGF0ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudERlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgIH0sXG4gICAgdXNlTXV0YWJsZVNvdXJjZTogZnVuY3Rpb24gKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTXV0YWJsZVNvdXJjZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gbW91bnRNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiBtb3VudE9wYXF1ZUlkZW50aWZpZXIoKTtcbiAgICB9LFxuICAgIHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjogZW5hYmxlTmV3UmVjb25jaWxlclxuICB9O1xuICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IHtcbiAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCwgb2JzZXJ2ZWRCaXRzKTtcbiAgICB9LFxuICAgIHVzZUNhbGxiYWNrOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNhbGxiYWNrJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQsIG9ic2VydmVkQml0cykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlQ29udGV4dCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VJbXBlcmF0aXZlSGFuZGxlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgfSxcbiAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUxheW91dEVmZmVjdCc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTWVtbzogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlTWVtbyc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VSZWR1Y2VyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudDtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVidWdWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlYnVnVmFsdWUoKTtcbiAgICB9LFxuICAgIHVzZURlZmVycmVkVmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlRGVmZXJyZWRWYWx1ZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUpO1xuICAgIH0sXG4gICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlVHJhbnNpdGlvbic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlT3BhcXVlSWRlbnRpZmllcigpO1xuICAgIH0sXG4gICAgdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiBlbmFibGVOZXdSZWNvbmNpbGVyXG4gIH07XG4gIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQsIG9ic2VydmVkQml0cyk7XG4gICAgfSxcbiAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VDYWxsYmFjayc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0LCBvYnNlcnZlZEJpdHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZUNvbnRleHQnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0LCBvYnNlcnZlZEJpdHMpO1xuICAgIH0sXG4gICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlSW1wZXJhdGl2ZUhhbmRsZSc7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgIH0sXG4gICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VMYXlvdXRFZmZlY3QnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9LFxuICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU1lbW8nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVkdWNlcic7XG4gICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIH1cbiAgICB9LFxuICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlUmVmJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVmKCk7XG4gICAgfSxcbiAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKGluaXRpYWxTdGF0ZSkge1xuICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSAndXNlU3RhdGUnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50O1xuICAgICAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQgPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyU3RhdGUoaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICB9XG4gICAgfSxcbiAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWJ1Z1ZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gdXBkYXRlRGVidWdWYWx1ZSgpO1xuICAgIH0sXG4gICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VEZWZlcnJlZFZhbHVlJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlKTtcbiAgICB9LFxuICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZVRyYW5zaXRpb24nO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICB9LFxuICAgIHVzZU11dGFibGVTb3VyY2U6IGZ1bmN0aW9uIChzb3VyY2UsIGdldFNuYXBzaG90LCBzdWJzY3JpYmUpIHtcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gJ3VzZU11dGFibGVTb3VyY2UnO1xuICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIHJldHVybiB1cGRhdGVNdXRhYmxlU291cmNlKHNvdXJjZSwgZ2V0U25hcHNob3QsIHN1YnNjcmliZSk7XG4gICAgfSxcbiAgICB1c2VPcGFxdWVJZGVudGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9ICd1c2VPcGFxdWVJZGVudGlmaWVyJztcbiAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICByZXR1cm4gcmVyZW5kZXJPcGFxdWVJZGVudGlmaWVyKCk7XG4gICAgfSxcbiAgICB1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6IGVuYWJsZU5ld1JlY29uY2lsZXJcbiAgfTtcbn1cblxudmFyIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdztcbnZhciBjb21taXRUaW1lID0gMDtcbnZhciBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuXG5mdW5jdGlvbiBnZXRDb21taXRUaW1lKCkge1xuICByZXR1cm4gY29tbWl0VGltZTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkQ29tbWl0VGltZSgpIHtcblxuICBjb21taXRUaW1lID0gbm93JDEoKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRQcm9maWxlclRpbWVyKGZpYmVyKSB7XG5cbiAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3ckMSgpO1xuXG4gIGlmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPCAwKSB7XG4gICAgZmliZXIuYWN0dWFsU3RhcnRUaW1lID0gbm93JDEoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZyhmaWJlcikge1xuXG4gIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG59XG5cbmZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoZmliZXIsIG92ZXJyaWRlQmFzZVRpbWUpIHtcblxuICBpZiAocHJvZmlsZXJTdGFydFRpbWUgPj0gMCkge1xuICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdyQxKCkgLSBwcm9maWxlclN0YXJ0VGltZTtcbiAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcblxuICAgIGlmIChvdmVycmlkZUJhc2VUaW1lKSB7XG4gICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgfVxuXG4gICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cmFuc2ZlckFjdHVhbER1cmF0aW9uKGZpYmVyKSB7XG4gIC8vIFRyYW5zZmVyIHRpbWUgc3BlbnQgcmVuZGVyaW5nIHRoZXNlIGNoaWxkcmVuIHNvIHdlIGRvbid0IGxvc2UgaXRcbiAgLy8gYWZ0ZXIgd2UgcmVyZW5kZXIuIFRoaXMgaXMgdXNlZCBhcyBhIGhlbHBlciBpbiBzcGVjaWFsIGNhc2VzXG4gIC8vIHdoZXJlIHdlIHNob3VsZCBjb3VudCB0aGUgd29yayBvZiBtdWx0aXBsZSBwYXNzZXMuXG4gIHZhciBjaGlsZCA9IGZpYmVyLmNoaWxkO1xuXG4gIHdoaWxlIChjaGlsZCkge1xuICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50T3duZXIkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyO1xudmFyIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcztcbnZhciBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dENvbnRleHRUeXBlT25GdW5jdGlvbkNvbXBvbmVudDtcbnZhciBkaWRXYXJuQWJvdXRHZXREZXJpdmVkU3RhdGVPbkZ1bmN0aW9uQ29tcG9uZW50O1xudmFyIGRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmcztcbnZhciBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzO1xudmFyIGRpZFdhcm5BYm91dFJldmVhbE9yZGVyO1xudmFyIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zO1xuXG57XG4gIGRpZFdhcm5BYm91dEJhZENsYXNzID0ge307XG4gIGRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50ID0ge307XG4gIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgZGlkV2FybkFib3V0RnVuY3Rpb25SZWZzID0ge307XG4gIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgPSBmYWxzZTtcbiAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXIgPSB7fTtcbiAgZGlkV2FybkFib3V0VGFpbE9wdGlvbnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJZiB0aGlzIGlzIGEgZnJlc2ggbmV3IGNvbXBvbmVudCB0aGF0IGhhc24ndCBiZWVuIHJlbmRlcmVkIHlldCwgd2VcbiAgICAvLyB3b24ndCB1cGRhdGUgaXRzIGNoaWxkIHNldCBieSBhcHBseWluZyBtaW5pbWFsIHNpZGUtZWZmZWN0cy4gSW5zdGVhZCxcbiAgICAvLyB3ZSB3aWxsIGFkZCB0aGVtIGFsbCB0byB0aGUgY2hpbGQgYmVmb3JlIGl0IGdldHMgcmVuZGVyZWQuIFRoYXQgbWVhbnNcbiAgICAvLyB3ZSBjYW4gb3B0aW1pemUgdGhpcyByZWNvbmNpbGlhdGlvbiBwYXNzIGJ5IG5vdCB0cmFja2luZyBzaWRlLWVmZmVjdHMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBtb3VudENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGUgY3VycmVudCBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgd29yayBpbiBwcm9ncmVzcywgaXQgbWVhbnMgdGhhdFxuICAgIC8vIHdlIGhhdmVuJ3QgeWV0IHN0YXJ0ZWQgYW55IHdvcmsgb24gdGhlc2UgY2hpbGRyZW4uIFRoZXJlZm9yZSwgd2UgdXNlXG4gICAgLy8gdGhlIGNsb25lIGFsZ29yaXRobSB0byBjcmVhdGUgYSBjb3B5IG9mIGFsbCB0aGUgY3VycmVudCBjaGlsZHJlbi5cbiAgICAvLyBJZiB3ZSBoYWQgYW55IHByb2dyZXNzZWQgd29yayBhbHJlYWR5LCB0aGF0IGlzIGludmFsaWQgYXQgdGhpcyBwb2ludCBzb1xuICAgIC8vIGxldCdzIHRocm93IGl0IG91dC5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgZm9yayBvZiByZWNvbmNpbGVDaGlsZHJlbi4gSXQncyB1c2VkIGluIGNhc2VzIHdoZXJlIHdlXG4gIC8vIHdhbnQgdG8gcmVjb25jaWxlIHdpdGhvdXQgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgZXhpc3Rpbmcgc2V0LiBUaGlzIGhhcyB0aGVcbiAgLy8gZWZmZWN0IG9mIGFsbCBjdXJyZW50IGNoaWxkcmVuIGJlaW5nIHVubW91bnRlZDsgZXZlbiBpZiB0aGUgdHlwZSBhbmQga2V5XG4gIC8vIGFyZSB0aGUgc2FtZSwgdGhlIG9sZCBjaGlsZCBpcyB1bm1vdW50ZWQgYW5kIGEgbmV3IGNoaWxkIGlzIGNyZWF0ZWQuXG4gIC8vXG4gIC8vIFRvIGRvIHRoaXMsIHdlJ3JlIGdvaW5nIHRvIGdvIHRocm91Z2ggdGhlIHJlY29uY2lsZSBhbGdvcml0aG0gdHdpY2UuIEluXG4gIC8vIHRoZSBmaXJzdCBwYXNzLCB3ZSBzY2hlZHVsZSBhIGRlbGV0aW9uIGZvciBhbGwgdGhlIGN1cnJlbnQgY2hpbGRyZW4gYnlcbiAgLy8gcGFzc2luZyBudWxsLlxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBjdXJyZW50LmNoaWxkLCBudWxsLCByZW5kZXJMYW5lcyk7IC8vIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgbW91bnQgdGhlIG5ldyBjaGlsZHJlbi4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB3ZVxuICAvLyBwYXNzIG51bGwgaW4gcGxhY2Ugb2Ygd2hlcmUgd2UgdXN1YWxseSBwYXNzIHRoZSBjdXJyZW50IGNoaWxkIHNldC4gVGhpcyBoYXNcbiAgLy8gdGhlIGVmZmVjdCBvZiByZW1vdW50aW5nIGFsbCBjaGlsZHJlbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlaXJcbiAgLy8gaWRlbnRpdGllcyBtYXRjaC5cblxuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKSB7XG4gIC8vIFRPRE86IGN1cnJlbnQgY2FuIGJlIG5vbi1udWxsIGhlcmUgZXZlbiBpZiB0aGUgY29tcG9uZW50XG4gIC8vIGhhc24ndCB5ZXQgbW91bnRlZC4gVGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBmaXJzdCByZW5kZXIgc3VzcGVuZHMuXG4gIC8vIFdlJ2xsIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIGlzIGZpbmUgb3IgY2FuIGNhdXNlIGlzc3Vlcy5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlbmRlciA9IENvbXBvbmVudC5yZW5kZXI7XG4gIHZhciByZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7IC8vIFRoZSByZXN0IGlzIGEgZm9yayBvZiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudFxuXG4gIHZhciBuZXh0Q2hpbGRyZW47XG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCA9IHdvcmtJblByb2dyZXNzO1xuICAgIHNldElzUmVuZGVyaW5nKHRydWUpO1xuICAgIG5leHRDaGlsZHJlbiA9IHJlbmRlcldpdGhIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyLCBuZXh0UHJvcHMsIHJlZiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV4dENoaWxkcmVuID0gcmVuZGVyV2l0aEhvb2tzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXIsIG5leHRQcm9wcywgcmVmLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB2YXIgdHlwZSA9IENvbXBvbmVudC50eXBlO1xuXG4gICAgaWYgKGlzU2ltcGxlRnVuY3Rpb25Db21wb25lbnQodHlwZSkgJiYgQ29tcG9uZW50LmNvbXBhcmUgPT09IG51bGwgJiYgLy8gU2ltcGxlTWVtb0NvbXBvbmVudCBjb2RlcGF0aCBkb2Vzbid0IHJlc29sdmUgb3V0ZXIgcHJvcHMgZWl0aGVyLlxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgcGxhaW4gZnVuY3Rpb24gY29tcG9uZW50IHdpdGhvdXQgZGVmYXVsdCBwcm9wcyxcbiAgICAgIC8vIGFuZCB3aXRoIG9ubHkgdGhlIGRlZmF1bHQgc2hhbGxvdyBjb21wYXJpc29uLCB3ZSB1cGdyYWRlIGl0XG4gICAgICAvLyB0byBhIFNpbXBsZU1lbW9Db21wb25lbnQgdG8gYWxsb3cgZmFzdCBwYXRoIHVwZGF0ZXMuXG5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gU2ltcGxlTWVtb0NvbXBvbmVudDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlZFR5cGU7XG5cbiAgICAgIHtcbiAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCB0eXBlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlc29sdmVkVHlwZSwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cblxuICAgIHtcbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuXG4gICAgICBpZiAoaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgICAgLy8gSW5uZXIgbWVtbyBjb21wb25lbnQgcHJvcHMgYXJlbid0IGN1cnJlbnRseSB2YWxpZGF0ZWQgaW4gY3JlYXRlRWxlbWVudC5cbiAgICAgICAgLy8gV2UgY291bGQgbW92ZSBpdCB0aGVyZSwgYnV0IHdlJ2Qgc3RpbGwgbmVlZCB0aGlzIGZvciBsYXp5IGNvZGUgcGF0aC5cbiAgICAgICAgY2hlY2tQcm9wVHlwZXMoaW5uZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgcHJvcHNcbiAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKHR5cGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoQ29tcG9uZW50LnR5cGUsIG51bGwsIG5leHRQcm9wcywgd29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLm1vZGUsIHJlbmRlckxhbmVzKTtcbiAgICBjaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgY2hpbGQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICB7XG4gICAgdmFyIF90eXBlID0gQ29tcG9uZW50LnR5cGU7XG4gICAgdmFyIF9pbm5lclByb3BUeXBlcyA9IF90eXBlLnByb3BUeXBlcztcblxuICAgIGlmIChfaW5uZXJQcm9wVHlwZXMpIHtcbiAgICAgIC8vIElubmVyIG1lbW8gY29tcG9uZW50IHByb3BzIGFyZW4ndCBjdXJyZW50bHkgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnQuXG4gICAgICAvLyBXZSBjb3VsZCBtb3ZlIGl0IHRoZXJlLCBidXQgd2UnZCBzdGlsbCBuZWVkIHRoaXMgZm9yIGxhenkgY29kZSBwYXRoLlxuICAgICAgY2hlY2tQcm9wVHlwZXMoX2lubmVyUHJvcFR5cGVzLCBuZXh0UHJvcHMsIC8vIFJlc29sdmVkIHByb3BzXG4gICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUpKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudENoaWxkID0gY3VycmVudC5jaGlsZDsgLy8gVGhpcyBpcyBhbHdheXMgZXhhY3RseSBvbmUgY2hpbGRcblxuICBpZiAoIWluY2x1ZGVzU29tZUxhbmUodXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKSkge1xuICAgIC8vIFRoaXMgd2lsbCBiZSB0aGUgcHJvcHMgd2l0aCByZXNvbHZlZCBkZWZhdWx0UHJvcHMsXG4gICAgLy8gdW5saWtlIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyB3aGljaCB3aWxsIGJlIHRoZSB1bnJlc29sdmVkIG9uZXMuXG4gICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnRDaGlsZC5tZW1vaXplZFByb3BzOyAvLyBEZWZhdWx0IHRvIHNoYWxsb3cgY29tcGFyaXNvblxuXG4gICAgdmFyIGNvbXBhcmUgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICBjb21wYXJlID0gY29tcGFyZSAhPT0gbnVsbCA/IGNvbXBhcmUgOiBzaGFsbG93RXF1YWw7XG5cbiAgICBpZiAoY29tcGFyZShwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgdmFyIG5ld0NoaWxkID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudENoaWxkLCBuZXh0UHJvcHMpO1xuICBuZXdDaGlsZC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gIG5ld0NoaWxkLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG5ld0NoaWxkO1xuICByZXR1cm4gbmV3Q2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVNpbXBsZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogY3VycmVudCBjYW4gYmUgbm9uLW51bGwgaGVyZSBldmVuIGlmIHRoZSBjb21wb25lbnRcbiAgLy8gaGFzbid0IHlldCBtb3VudGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgaW5uZXIgcmVuZGVyIHN1c3BlbmRzLlxuICAvLyBXZSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBpcyBmaW5lIG9yIGNhbiBjYXVzZSBpc3N1ZXMuXG4gIHtcbiAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIExhenkgY29tcG9uZW50IHByb3BzIGNhbid0IGJlIHZhbGlkYXRlZCBpbiBjcmVhdGVFbGVtZW50XG4gICAgICAvLyBiZWNhdXNlIHRoZXkncmUgb25seSBndWFyYW50ZWVkIHRvIGJlIHJlc29sdmVkIGhlcmUuXG4gICAgICB2YXIgb3V0ZXJNZW1vVHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuXG4gICAgICBpZiAob3V0ZXJNZW1vVHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgIC8vIFdlIHdhcm4gd2hlbiB5b3UgZGVmaW5lIHByb3BUeXBlcyBvbiBsYXp5KClcbiAgICAgICAgLy8gc28gbGV0J3MganVzdCBza2lwIG92ZXIgaXQgdG8gZmluZCBtZW1vKCkgb3V0ZXIgd3JhcHBlci5cbiAgICAgICAgLy8gSW5uZXIgcHJvcHMgZm9yIG1lbW8gYXJlIHZhbGlkYXRlZCBsYXRlci5cbiAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSBvdXRlck1lbW9UeXBlO1xuICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgIHZhciBpbml0ID0gbGF6eUNvbXBvbmVudC5faW5pdDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIG91dGVyTWVtb1R5cGUgPSBpbml0KHBheWxvYWQpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgb3V0ZXJNZW1vVHlwZSA9IG51bGw7XG4gICAgICAgIH0gLy8gSW5uZXIgcHJvcFR5cGVzIHdpbGwgYmUgdmFsaWRhdGVkIGluIHRoZSBmdW5jdGlvbiBjb21wb25lbnQgcGF0aC5cblxuXG4gICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IG91dGVyTWVtb1R5cGUgJiYgb3V0ZXJNZW1vVHlwZS5wcm9wVHlwZXM7XG5cbiAgICAgICAgaWYgKG91dGVyUHJvcFR5cGVzKSB7XG4gICAgICAgICAgY2hlY2tQcm9wVHlwZXMob3V0ZXJQcm9wVHlwZXMsIG5leHRQcm9wcywgLy8gUmVzb2x2ZWQgKFNpbXBsZU1lbW9Db21wb25lbnQgaGFzIG5vIGRlZmF1bHRQcm9wcylcbiAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUob3V0ZXJNZW1vVHlwZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgcHJldlByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKHNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgJiYgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJiAoIC8vIFByZXZlbnQgYmFpbG91dCBpZiB0aGUgaW1wbGVtZW50YXRpb24gY2hhbmdlZCBkdWUgdG8gaG90IHJlbG9hZC5cbiAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9PT0gY3VycmVudC50eXBlICkpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgICAgLy8gVGhlIHBlbmRpbmcgbGFuZXMgd2VyZSBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYmVnaW5Xb3JrLiBXZSdyZVxuICAgICAgICAvLyBhYm91dCB0byBiYWlsIG91dCwgYnV0IHRoZXJlIG1pZ2h0IGJlIG90aGVyIGxhbmVzIHRoYXQgd2VyZW4ndFxuICAgICAgICAvLyBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCByZW5kZXIuIFVzdWFsbHksIHRoZSBwcmlvcml0eSBsZXZlbCBvZiB0aGVcbiAgICAgICAgLy8gcmVtYWluaW5nIHVwZGF0ZXMgaXMgYWNjdW1sYXRlZCBkdXJpbmcgdGhlIGV2YWx1YXRpb24gb2YgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCAoaS5lLiB3aGVuIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZSkuIEJ1dCBzaW5jZSBzaW5jZVxuICAgICAgICAvLyB3ZSdyZSBiYWlsaW5nIG91dCBlYXJseSAqd2l0aG91dCogZXZhbHVhdGluZyB0aGUgY29tcG9uZW50LCB3ZSBuZWVkXG4gICAgICAgIC8vIHRvIGFjY291bnQgZm9yIGl0IGhlcmUsIHRvby4gUmVzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IGZpYmVyLlxuICAgICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgYXBwbGllcyB0byBTaW1wbGVNZW1vQ29tcG9uZW50LCBub3QgTWVtb0NvbXBvbmVudCxcbiAgICAgICAgLy8gYmVjYXVzZSBhIE1lbW9Db21wb25lbnQgZmliZXIgZG9lcyBub3QgaGF2ZSBob29rcyBvciBhbiB1cGRhdGUgcXVldWU7XG4gICAgICAgIC8vIHJhdGhlciwgaXQgd3JhcHMgYXJvdW5kIGFuIGlubmVyIGNvbXBvbmVudCwgd2hpY2ggbWF5IG9yIG1heSBub3RcbiAgICAgICAgLy8gY29udGFpbnMgaG9va3MuXG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhlIHJlc2V0IGF0IGluIGJlZ2luV29yayBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIHNvIHRoYXRcbiAgICAgICAgLy8gdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LlxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXM7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKChjdXJyZW50LmZsYWdzICYgRm9yY2VVcGRhdGVGb3JMZWdhY3lTdXNwZW5zZSkgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB0aGF0IG9ubHkgZXhpc3RzIGZvciBsZWdhY3kgbW9kZS5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzE5MjE2LlxuICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsO1xuXG4gIGlmIChuZXh0UHJvcHMubW9kZSA9PT0gJ2hpZGRlbicgfHwgbmV4dFByb3BzLm1vZGUgPT09ICd1bnN0YWJsZS1kZWZlci13aXRob3V0LWhpZGluZycpIHtcbiAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBDb25jdXJyZW50TW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gSW4gbGVnYWN5IHN5bmMgbW9kZSwgZG9uJ3QgZGVmZXIgdGhlIHN1YnRyZWUuIFJlbmRlciBpdCBub3cuXG4gICAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgd2Ugc2hvdWxkIGRvIGluIEJsb2NraW5nIG1vZGUuXG4gICAgICB2YXIgbmV4dFN0YXRlID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkpIHtcbiAgICAgIHZhciBuZXh0QmFzZUxhbmVzO1xuXG4gICAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBwcmV2QmFzZUxhbmVzID0gcHJldlN0YXRlLmJhc2VMYW5lcztcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IG1lcmdlTGFuZXMocHJldkJhc2VMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dEJhc2VMYW5lcyA9IHJlbmRlckxhbmVzO1xuICAgICAgfSAvLyBTY2hlZHVsZSB0aGlzIGZpYmVyIHRvIHJlLXJlbmRlciBhdCBvZmZzY3JlZW4gcHJpb3JpdHkuIFRoZW4gYmFpbG91dC5cblxuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhPZmZzY3JlZW5MYW5lKTtcbiAgICAgIH1cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gbGFuZVRvTGFuZXMoT2Zmc2NyZWVuTGFuZSk7XG4gICAgICB2YXIgX25leHRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzXG4gICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IF9uZXh0U3RhdGU7IC8vIFdlJ3JlIGFib3V0IHRvIGJhaWwgb3V0LCBidXQgd2UgbmVlZCB0byBwdXNoIHRoaXMgdG8gdGhlIHN0YWNrIGFueXdheVxuICAgICAgLy8gdG8gYXZvaWQgYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG5cbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgbmV4dEJhc2VMYW5lcyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVuZGVyaW5nIGF0IG9mZnNjcmVlbiwgc28gd2UgY2FuIGNsZWFyIHRoZSBiYXNlIGxhbmVzLlxuICAgICAgdmFyIF9uZXh0U3RhdGUyID0ge1xuICAgICAgICBiYXNlTGFuZXM6IE5vTGFuZXNcbiAgICAgIH07XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gX25leHRTdGF0ZTI7IC8vIFB1c2ggdGhlIGxhbmVzIHRoYXQgd2VyZSBza2lwcGVkIHdoZW4gd2UgYmFpbGVkIG91dC5cblxuICAgICAgdmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IHByZXZTdGF0ZSAhPT0gbnVsbCA/IHByZXZTdGF0ZS5iYXNlTGFuZXMgOiByZW5kZXJMYW5lcztcbiAgICAgIHB1c2hSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIF9zdWJ0cmVlUmVuZGVyTGFuZXM7XG5cbiAgICBpZiAocHJldlN0YXRlICE9PSBudWxsKSB7XG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gbWVyZ2VMYW5lcyhwcmV2U3RhdGUuYmFzZUxhbmVzLCByZW5kZXJMYW5lcyk7IC8vIFNpbmNlIHdlJ3JlIG5vdCBoaWRkZW4gYW55bW9yZSwgcmVzZXQgdGhlIHN0YXRlXG5cbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlbid0IHByZXZpb3VzbHkgaGlkZGVuLCBhbmQgd2Ugc3RpbGwgYXJlbid0LCBzbyB0aGVyZSdzIG5vdGhpbmdcbiAgICAgIC8vIHNwZWNpYWwgdG8gZG8uIE5lZWQgdG8gcHVzaCB0byB0aGUgc3RhY2sgcmVnYXJkbGVzcywgdGhvdWdoLCB0byBhdm9pZFxuICAgICAgLy8gYSBwdXNoL3BvcCBtaXNhbGlnbm1lbnQuXG4gICAgICBfc3VidHJlZVJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXM7XG4gICAgfVxuXG4gICAgcHVzaFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzLCBfc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufSAvLyBOb3RlOiBUaGVzZSBoYXBwZW4gdG8gaGF2ZSBpZGVudGljYWwgYmVnaW4gcGhhc2VzLCBmb3Igbm93LiBXZSBzaG91bGRuJ3QgaG9sZFxuLy8gb3Vyc2VsdmVzIHRvIHRoaXMgY29uc3RyYWludCwgdGhvdWdoLiBJZiB0aGUgYmVoYXZpb3IgZGl2ZXJnZXMsIHdlIHNob3VsZFxuLy8gZm9yayB0aGUgZnVuY3Rpb24uXG5cblxudmFyIHVwZGF0ZUxlZ2FjeUhpZGRlbkNvbXBvbmVudCA9IHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudDtcblxuZnVuY3Rpb24gdXBkYXRlRnJhZ21lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0Q2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVNb2RlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUHJvZmlsZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHtcbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAvLyBUaGVzZSBhcmUgcmVzZXQgZHVyaW5nIHJlbmRlciB0byBhbGxvdyB0aGUgRGV2VG9vbHMgY29tbWl0IGhvb2sgYSBjaGFuY2UgdG8gcmVhZCB0aGVtLFxuXG4gICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICBzdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gPSAwO1xuICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICB9XG5cbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiByZWYgIT09IG51bGwgfHwgY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50LnJlZiAhPT0gcmVmKSB7XG4gICAgLy8gU2NoZWR1bGUgYSBSZWYgZWZmZWN0XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUmVmO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gICAgY29udGV4dCA9IGdldE1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHVubWFza2VkQ29udGV4dCk7XG4gIH1cblxuICB2YXIgbmV4dENoaWxkcmVuO1xuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gIHtcbiAgICBSZWFjdEN1cnJlbnRPd25lciQxLmN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICBzZXRJc1JlbmRlcmluZyh0cnVlKTtcbiAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXh0Q2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICByZWVuYWJsZUxvZ3MoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH1cblxuICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSkge1xuICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcbiAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkge1xuICAgICAgLy8gTGF6eSBjb21wb25lbnQgcHJvcHMgY2FuJ3QgYmUgdmFsaWRhdGVkIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgcmVzb2x2ZWQgaGVyZS5cbiAgICAgIHZhciBpbm5lclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgIGlmIChpbm5lclByb3BUeXBlcykge1xuICAgICAgICBjaGVja1Byb3BUeXBlcyhpbm5lclByb3BUeXBlcywgbmV4dFByb3BzLCAvLyBSZXNvbHZlZCBwcm9wc1xuICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoQ29tcG9uZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9IC8vIFB1c2ggY29udGV4dCBwcm92aWRlcnMgZWFybHkgdG8gcHJldmVudCBjb250ZXh0IHN0YWNrIG1pc21hdGNoZXMuXG4gIC8vIER1cmluZyBtb3VudGluZyB3ZSBkb24ndCBrbm93IHRoZSBjaGlsZCBjb250ZXh0IHlldCBhcyB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGlzdC5cbiAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG5cbiAgdmFyIGhhc0NvbnRleHQ7XG5cbiAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICBwdXNoQ29udGV4dFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gIH1cblxuICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gIHZhciBzaG91bGRVcGRhdGU7XG5cbiAgaWYgKGluc3RhbmNlID09PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIC8vIEEgY2xhc3MgY29tcG9uZW50IHdpdGhvdXQgYW4gaW5zdGFuY2Ugb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkXG4gICAgICAvLyBpbnNpZGUgYSBub24tY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG9cbiAgICAgIC8vIHRyZWF0IGl0IGxpa2UgYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeVxuICAgICAgLy8gY29tbWl0dGVkLiBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgICBjdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgICB9IC8vIEluIHRoZSBpbml0aWFsIHBhc3Mgd2UgbWlnaHQgbmVlZCB0byBjb25zdHJ1Y3QgdGhlIGluc3RhbmNlLlxuXG5cbiAgICBjb25zdHJ1Y3RDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcyk7XG4gICAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgIHNob3VsZFVwZGF0ZSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIEluIGEgcmVzdW1lLCB3ZSdsbCBhbHJlYWR5IGhhdmUgYW4gaW5zdGFuY2Ugd2UgY2FuIHJldXNlLlxuICAgIHNob3VsZFVwZGF0ZSA9IHJlc3VtZU1vdW50Q2xhc3NJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRVcGRhdGUgPSB1cGRhdGVDbGFzc0luc3RhbmNlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICB9XG5cbiAgdmFyIG5leHRVbml0T2ZXb3JrID0gZmluaXNoQ2xhc3NDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgc2hvdWxkVXBkYXRlLCBoYXNDb250ZXh0LCByZW5kZXJMYW5lcyk7XG5cbiAge1xuICAgIHZhciBpbnN0ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZSAmJiBpbnN0LnByb3BzICE9PSBuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICBlcnJvcignSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuICcgKyAnVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCBjYW4gbGVhZCB0byBjb25mdXNpbmcgYnVncy4nLCBnZXRDb21wb25lbnROYW1lKHdvcmtJblByb2dyZXNzLnR5cGUpIHx8ICdhIGNvbXBvbmVudCcpO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFVuaXRPZldvcms7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaENsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHNob3VsZFVwZGF0ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gUmVmcyBzaG91bGQgdXBkYXRlIGV2ZW4gaWYgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHJldHVybnMgZmFsc2VcbiAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyk7XG4gIHZhciBkaWRDYXB0dXJlRXJyb3IgPSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICBpZiAoIXNob3VsZFVwZGF0ZSAmJiAhZGlkQ2FwdHVyZUVycm9yKSB7XG4gICAgLy8gQ29udGV4dCBwcm92aWRlcnMgc2hvdWxkIGRlZmVyIHRvIHNDVSBmb3IgcmVuZGVyaW5nXG4gICAgaWYgKGhhc0NvbnRleHQpIHtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7IC8vIFJlcmVuZGVyXG5cbiAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gIHZhciBuZXh0Q2hpbGRyZW47XG5cbiAgaWYgKGRpZENhcHR1cmVFcnJvciAmJiB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIElmIHdlIGNhcHR1cmVkIGFuIGVycm9yLCBidXQgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIGlzIG5vdCBkZWZpbmVkLFxuICAgIC8vIHVubW91bnQgYWxsIHRoZSBjaGlsZHJlbi4gY29tcG9uZW50RGlkQ2F0Y2ggd2lsbCBzY2hlZHVsZSBhbiB1cGRhdGUgdG9cbiAgICAvLyByZS1yZW5kZXIgYSBmYWxsYmFjay4gVGhpcyBpcyB0ZW1wb3JhcnkgdW50aWwgd2UgbWlncmF0ZSBldmVyeW9uZSB0b1xuICAgIC8vIHRoZSBuZXcgQVBJLlxuICAgIC8vIFRPRE86IFdhcm4gaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuXG4gICAge1xuICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBpbnN0YW5jZS5yZW5kZXIoKTtcblxuICAgICAgaWYgKCB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgICBkaXNhYmxlTG9ncygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0SXNSZW5kZXJpbmcoZmFsc2UpO1xuICAgIH1cbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsICYmIGRpZENhcHR1cmVFcnJvcikge1xuICAgIC8vIElmIHdlJ3JlIHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVjb25jaWxlIHdpdGhvdXQgcmV1c2luZyBhbnkgb2ZcbiAgICAvLyB0aGUgZXhpc3RpbmcgY2hpbGRyZW4uIENvbmNlcHR1YWxseSwgdGhlIG5vcm1hbCBjaGlsZHJlbiBhbmQgdGhlIGNoaWxkcmVuXG4gICAgLy8gdGhhdCBhcmUgc2hvd24gb24gZXJyb3IgYXJlIHR3byBkaWZmZXJlbnQgc2V0cywgc28gd2Ugc2hvdWxkbid0IHJldXNlXG4gICAgLy8gbm9ybWFsIGNoaWxkcmVuIGV2ZW4gaWYgdGhlaXIgaWRlbnRpdGllcyBtYXRjaC5cbiAgICBmb3JjZVVubW91bnRDdXJyZW50QW5kUmVjb25jaWxlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH0gLy8gTWVtb2l6ZSBzdGF0ZSB1c2luZyB0aGUgdmFsdWVzIHdlIGp1c3QgdXNlZCB0byByZW5kZXIuXG4gIC8vIFRPRE86IFJlc3RydWN0dXJlIHNvIHdlIG5ldmVyIHJlYWQgdmFsdWVzIGZyb20gdGhlIGluc3RhbmNlLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlOyAvLyBUaGUgY29udGV4dCBtaWdodCBoYXZlIGNoYW5nZWQgc28gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpdC5cblxuICBpZiAoaGFzQ29udGV4dCkge1xuICAgIGludmFsaWRhdGVDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbmZ1bmN0aW9uIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgdmFyIHJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgaWYgKHJvb3QucGVuZGluZ0NvbnRleHQpIHtcbiAgICBwdXNoVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzLCByb290LnBlbmRpbmdDb250ZXh0LCByb290LnBlbmRpbmdDb250ZXh0ICE9PSByb290LmNvbnRleHQpO1xuICB9IGVsc2UgaWYgKHJvb3QuY29udGV4dCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgYmUgc2V0XG4gICAgcHVzaFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250ZXh0LCBmYWxzZSk7XG4gIH1cblxuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgcm9vdC5jb250YWluZXJJbmZvKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHB1c2hIb3N0Um9vdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICB2YXIgdXBkYXRlUXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcblxuICBpZiAoIShjdXJyZW50ICE9PSBudWxsICYmIHVwZGF0ZVF1ZXVlICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIklmIHRoZSByb290IGRvZXMgbm90IGhhdmUgYW4gdXBkYXRlUXVldWUsIHdlIHNob3VsZCBoYXZlIGFscmVhZHkgYmFpbGVkIG91dC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICB2YXIgcHJldkNoaWxkcmVuID0gcHJldlN0YXRlICE9PSBudWxsID8gcHJldlN0YXRlLmVsZW1lbnQgOiBudWxsO1xuICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7IC8vIENhdXRpb246IFJlYWN0IERldlRvb2xzIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJvcGVydHlcbiAgLy8gYmVpbmcgY2FsbGVkIFwiZWxlbWVudFwiLlxuXG4gIHZhciBuZXh0Q2hpbGRyZW4gPSBuZXh0U3RhdGUuZWxlbWVudDtcblxuICBpZiAobmV4dENoaWxkcmVuID09PSBwcmV2Q2hpbGRyZW4pIHtcbiAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgcmV0dXJuIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHZhciByb290ID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuXG4gIGlmIChyb290Lmh5ZHJhdGUgJiYgZW50ZXJIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFueSBjdXJyZW50IGNoaWxkcmVuIHRoaXMgbWlnaHQgYmUgdGhlIGZpcnN0IHBhc3MuXG4gICAgLy8gV2UgYWx3YXlzIHRyeSB0byBoeWRyYXRlLiBJZiB0aGlzIGlzbid0IGEgaHlkcmF0aW9uIHBhc3MgdGhlcmUgd29uJ3RcbiAgICAvLyBiZSBhbnkgY2hpbGRyZW4gdG8gaHlkcmF0ZSB3aGljaCBpcyBlZmZlY3RpdmVseSB0aGUgc2FtZSB0aGluZyBhc1xuICAgIC8vIG5vdCBoeWRyYXRpbmcuXG4gICAge1xuICAgICAgdmFyIG11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGEgPSByb290Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE7XG5cbiAgICAgIGlmIChtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhICE9IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgdmFyIG11dGFibGVTb3VyY2UgPSBtdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhW2ldO1xuICAgICAgICAgIHZhciB2ZXJzaW9uID0gbXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YVtpICsgMV07XG4gICAgICAgICAgc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9uKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjaGlsZDtcbiAgICB2YXIgbm9kZSA9IGNoaWxkO1xuXG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIC8vIE1hcmsgZWFjaCBjaGlsZCBhcyBoeWRyYXRpbmcuIFRoaXMgaXMgYSBmYXN0IHBhdGggdG8ga25vdyB3aGV0aGVyIHRoaXNcbiAgICAgIC8vIHRyZWUgaXMgcGFydCBvZiBhIGh5ZHJhdGluZyB0cmVlLiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgY2hpbGRcbiAgICAgIC8vIG5vZGUgaGFzIGZ1bGx5IG1vdW50ZWQgeWV0LCBhbmQgZm9yIHNjaGVkdWxpbmcgZXZlbnQgcmVwbGF5aW5nLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5IHRoaXMgaXMgc2ltaWxhciB0byBQbGFjZW1lbnQgaW4gdGhhdCBhIG5ldyBzdWJ0cmVlIGlzXG4gICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSBSZWFjdCB0cmVlIGhlcmUuIEl0IGp1c3QgaGFwcGVucyB0byBub3QgbmVlZCBET01cbiAgICAgIC8vIG11dGF0aW9ucyBiZWNhdXNlIGl0IGFscmVhZHkgZXhpc3RzLlxuICAgICAgbm9kZS5mbGFncyA9IG5vZGUuZmxhZ3MgJiB+UGxhY2VtZW50IHwgSHlkcmF0aW5nO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlIHJlc2V0IGh5ZHJhdGlvbiBzdGF0ZSBpbiBjYXNlIHdlIGFib3J0ZWQgYW5kIHJlc3VtZWQgYW5vdGhlclxuICAgIC8vIHJvb3QuXG4gICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIHJlc2V0SHlkcmF0aW9uU3RhdGUoKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIHRyeVRvQ2xhaW1OZXh0SHlkcmF0YWJsZUluc3RhbmNlKHdvcmtJblByb2dyZXNzKTtcbiAgfVxuXG4gIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsO1xuICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICB2YXIgaXNEaXJlY3RUZXh0Q2hpbGQgPSBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBuZXh0UHJvcHMpO1xuXG4gIGlmIChpc0RpcmVjdFRleHRDaGlsZCkge1xuICAgIC8vIFdlIHNwZWNpYWwgY2FzZSBhIGRpcmVjdCB0ZXh0IGNoaWxkIG9mIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgY29tbW9uXG4gICAgLy8gY2FzZS4gV2Ugd29uJ3QgaGFuZGxlIGl0IGFzIGEgcmVpZmllZCBjaGlsZC4gV2Ugd2lsbCBpbnN0ZWFkIGhhbmRsZVxuICAgIC8vIHRoaXMgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQgdGhhdCBhbHNvIGhhcyBhY2Nlc3MgdG8gdGhpcyBwcm9wLiBUaGF0XG4gICAgLy8gYXZvaWRzIGFsbG9jYXRpbmcgYW5vdGhlciBIb3N0VGV4dCBmaWJlciBhbmQgdHJhdmVyc2luZyBpdC5cbiAgICBuZXh0Q2hpbGRyZW4gPSBudWxsO1xuICB9IGVsc2UgaWYgKHByZXZQcm9wcyAhPT0gbnVsbCAmJiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcmV2UHJvcHMpKSB7XG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gYSBkaXJlY3QgdGV4dCBjaGlsZCB0byBhIG5vcm1hbCBjaGlsZCwgb3IgdG9cbiAgICAvLyBlbXB0eSwgd2UgbmVlZCB0byBzY2hlZHVsZSB0aGUgdGV4dCBjb250ZW50IHRvIGJlIHJlc2V0LlxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IENvbnRlbnRSZXNldDtcbiAgfVxuXG4gIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlSG9zdFRleHQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICB0cnlUb0NsYWltTmV4dEh5ZHJhdGFibGVJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcyk7XG4gIH0gLy8gTm90aGluZyB0byBkbyBoZXJlLiBUaGlzIGlzIHRlcm1pbmFsLiBXZSdsbCBkbyB0aGUgY29tcGxldGlvbiBzdGVwXG4gIC8vIGltbWVkaWF0ZWx5IGFmdGVyLlxuXG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIG1vdW50TGF6eUNvbXBvbmVudChfY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIGVsZW1lbnRUeXBlLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQSBsYXp5IGNvbXBvbmVudCBvbmx5IG1vdW50cyBpZiBpdCBzdXNwZW5kZWQgaW5zaWRlIGEgbm9uLVxuICAgIC8vIGNvbmN1cnJlbnQgdHJlZSwgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBXZSB3YW50IHRvIHRyZWF0IGl0IGxpa2VcbiAgICAvLyBhIG5ldyBtb3VudCwgZXZlbiB0aG91Z2ggYW4gZW1wdHkgdmVyc2lvbiBvZiBpdCBhbHJlYWR5IGNvbW1pdHRlZC5cbiAgICAvLyBEaXNjb25uZWN0IHRoZSBhbHRlcm5hdGUgcG9pbnRlcnMuXG4gICAgX2N1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBTaW5jZSB0aGlzIGlzIGNvbmNlcHR1YWxseSBhIG5ldyBmaWJlciwgc2NoZWR1bGUgYSBQbGFjZW1lbnQgZWZmZWN0XG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQbGFjZW1lbnQ7XG4gIH1cblxuICB2YXIgcHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciBsYXp5Q29tcG9uZW50ID0gZWxlbWVudFR5cGU7XG4gIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuICB2YXIgQ29tcG9uZW50ID0gaW5pdChwYXlsb2FkKTsgLy8gU3RvcmUgdGhlIHVud3JhcHBlZCBjb21wb25lbnQgaW4gdGhlIHR5cGUuXG5cbiAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudDtcbiAgdmFyIHJlc29sdmVkVGFnID0gd29ya0luUHJvZ3Jlc3MudGFnID0gcmVzb2x2ZUxhenlDb21wb25lbnRUYWcoQ29tcG9uZW50KTtcbiAgdmFyIHJlc29sdmVkUHJvcHMgPSByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudCwgcHJvcHMpO1xuICB2YXIgY2hpbGQ7XG5cbiAgc3dpdGNoIChyZXNvbHZlZFRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGdW5jdGlvbkZvckhvdFJlbG9hZGluZyhDb21wb25lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGQgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlID0gQ29tcG9uZW50ID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUNsYXNzQ29tcG9uZW50KG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuXG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKENvbXBvbmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZCA9IHVwZGF0ZUZvcndhcmRSZWYobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcmVzb2x2ZWRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICB9XG5cbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgcmVzb2x2ZWRQcm9wcywgLy8gUmVzb2x2ZWQgZm9yIG91dGVyIG9ubHlcbiAgICAgICAgICAgICAgJ3Byb3AnLCBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNoaWxkID0gdXBkYXRlTWVtb0NvbXBvbmVudChudWxsLCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZXNvbHZlRGVmYXVsdFByb3BzKENvbXBvbmVudC50eXBlLCByZXNvbHZlZFByb3BzKSwgLy8gVGhlIGlubmVyIHR5cGUgY2FuIGhhdmUgZGVmYXVsdHMgdG9vXG4gICAgICAgIHVwZGF0ZUxhbmVzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgIH1cbiAgfVxuXG4gIHZhciBoaW50ID0gJyc7XG5cbiAge1xuICAgIGlmIChDb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIENvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgIGhpbnQgPSAnIERpZCB5b3Ugd3JhcCBhIGNvbXBvbmVudCBpbiBSZWFjdC5sYXp5KCkgbW9yZSB0aGFuIG9uY2U/JztcbiAgICB9XG4gIH0gLy8gVGhpcyBtZXNzYWdlIGludGVudGlvbmFsbHkgZG9lc24ndCBtZW50aW9uIEZvcndhcmRSZWYgb3IgTWVtb0NvbXBvbmVudFxuICAvLyBiZWNhdXNlIHRoZSBmYWN0IHRoYXQgaXQncyBhIHNlcGFyYXRlIHR5cGUgb2Ygd29yayBpcyBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuXG5cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiRWxlbWVudCB0eXBlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArIENvbXBvbmVudCArIFwiLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArIGhpbnQgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpIHtcbiAgaWYgKF9jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gQW4gaW5jb21wbGV0ZSBjb21wb25lbnQgb25seSBtb3VudHMgaWYgaXQgc3VzcGVuZGVkIGluc2lkZSBhIG5vbi1cbiAgICAvLyBjb25jdXJyZW50IHRyZWUsIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gV2Ugd2FudCB0byB0cmVhdCBpdCBsaWtlXG4gICAgLy8gYSBuZXcgbW91bnQsIGV2ZW4gdGhvdWdoIGFuIGVtcHR5IHZlcnNpb24gb2YgaXQgYWxyZWFkeSBjb21taXR0ZWQuXG4gICAgLy8gRGlzY29ubmVjdCB0aGUgYWx0ZXJuYXRlIHBvaW50ZXJzLlxuICAgIF9jdXJyZW50LmFsdGVybmF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDsgLy8gU2luY2UgdGhpcyBpcyBjb25jZXB0dWFsbHkgYSBuZXcgZmliZXIsIHNjaGVkdWxlIGEgUGxhY2VtZW50IGVmZmVjdFxuXG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9IC8vIFByb21vdGUgdGhlIGZpYmVyIHRvIGEgY2xhc3MgYW5kIHRyeSByZW5kZXJpbmcgYWdhaW4uXG5cblxuICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIGZvcmsgb2YgYHVwZGF0ZUNsYXNzQ29tcG9uZW50YFxuICAvLyBQdXNoIGNvbnRleHQgcHJvdmlkZXJzIGVhcmx5IHRvIHByZXZlbnQgY29udGV4dCBzdGFjayBtaXNtYXRjaGVzLlxuICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gIC8vIFdlIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2hpbGQgY29udGV4dCBpbiBmaW5pc2hDbGFzc0NvbXBvbmVudCgpIHJpZ2h0IGFmdGVyIHJlbmRlcmluZy5cblxuICB2YXIgaGFzQ29udGV4dDtcblxuICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgIGhhc0NvbnRleHQgPSB0cnVlO1xuICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICB9IGVsc2Uge1xuICAgIGhhc0NvbnRleHQgPSBmYWxzZTtcbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIGNvbnN0cnVjdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgbmV4dFByb3BzKTtcbiAgbW91bnRDbGFzc0luc3RhbmNlKHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIG5leHRQcm9wcywgcmVuZGVyTGFuZXMpO1xuICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBtb3VudEluZGV0ZXJtaW5hdGVDb21wb25lbnQoX2N1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChfY3VycmVudCAhPT0gbnVsbCkge1xuICAgIC8vIEFuIGluZGV0ZXJtaW5hdGUgY29tcG9uZW50IG9ubHkgbW91bnRzIGlmIGl0IHN1c3BlbmRlZCBpbnNpZGUgYSBub24tXG4gICAgLy8gY29uY3VycmVudCB0cmVlLCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuIFdlIHdhbnQgdG8gdHJlYXQgaXQgbGlrZVxuICAgIC8vIGEgbmV3IG1vdW50LCBldmVuIHRob3VnaCBhbiBlbXB0eSB2ZXJzaW9uIG9mIGl0IGFscmVhZHkgY29tbWl0dGVkLlxuICAgIC8vIERpc2Nvbm5lY3QgdGhlIGFsdGVybmF0ZSBwb2ludGVycy5cbiAgICBfY3VycmVudC5hbHRlcm5hdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IG51bGw7IC8vIFNpbmNlIHRoaXMgaXMgY29uY2VwdHVhbGx5IGEgbmV3IGZpYmVyLCBzY2hlZHVsZSBhIFBsYWNlbWVudCBlZmZlY3RcblxuICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFBsYWNlbWVudDtcbiAgfVxuXG4gIHZhciBwcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgdmFyIGNvbnRleHQ7XG5cbiAge1xuICAgIHZhciB1bm1hc2tlZENvbnRleHQgPSBnZXRVbm1hc2tlZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgZmFsc2UpO1xuICAgIGNvbnRleHQgPSBnZXRNYXNrZWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCB1bm1hc2tlZENvbnRleHQpO1xuICB9XG5cbiAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgdmFyIHZhbHVlO1xuXG4gIHtcbiAgICBpZiAoQ29tcG9uZW50LnByb3RvdHlwZSAmJiB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcihcIlRoZSA8JXMgLz4gY29tcG9uZW50IGFwcGVhcnMgdG8gaGF2ZSBhIHJlbmRlciBtZXRob2QsIGJ1dCBkb2Vzbid0IGV4dGVuZCBSZWFjdC5Db21wb25lbnQuIFwiICsgJ1RoaXMgaXMgbGlrZWx5IHRvIGNhdXNlIGVycm9ycy4gQ2hhbmdlICVzIHRvIGV4dGVuZCBSZWFjdC5Db21wb25lbnQgaW5zdGVhZC4nLCBjb21wb25lbnROYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RNb2RlKSB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyh3b3JrSW5Qcm9ncmVzcywgbnVsbCk7XG4gICAgfVxuXG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgdmFsdWUgPSByZW5kZXJXaXRoSG9va3MobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIGNvbnRleHQsIHJlbmRlckxhbmVzKTtcbiAgICBzZXRJc1JlbmRlcmluZyhmYWxzZSk7XG4gIH0gLy8gUmVhY3QgRGV2VG9vbHMgcmVhZHMgdGhpcyBmbGFnLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGVyZm9ybWVkV29yaztcblxuICB7XG4gICAgLy8gU3VwcG9ydCBmb3IgbW9kdWxlIGNvbXBvbmVudHMgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcmVtb3ZlZCBiZWhpbmQgYSBmbGFnLlxuICAgIC8vIFdoZXRoZXIgb3Igbm90IGl0IHdvdWxkIGNyYXNoIGxhdGVyLCB3ZSB3YW50IHRvIHNob3cgYSBnb29kIG1lc3NhZ2UgaW4gREVWIGZpcnN0LlxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIF9jb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZSwgX2NvbXBvbmVudE5hbWUsIF9jb21wb25lbnROYW1lKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCAvLyBSdW4gdGhlc2UgY2hlY2tzIGluIHByb2R1Y3Rpb24gb25seSBpZiB0aGUgZmxhZyBpcyBvZmYuXG4gIC8vIEV2ZW50dWFsbHkgd2UnbGwgZGVsZXRlIHRoaXMgYnJhbmNoIGFsdG9nZXRoZXIuXG4gICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5yZW5kZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsdWUuJCR0eXBlb2YgPT09IHVuZGVmaW5lZCkge1xuICAgIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTIgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dE1vZHVsZVBhdHRlcm5Db21wb25lbnRbX2NvbXBvbmVudE5hbWUyXSkge1xuICAgICAgICBlcnJvcignVGhlIDwlcyAvPiBjb21wb25lbnQgYXBwZWFycyB0byBiZSBhIGZ1bmN0aW9uIGNvbXBvbmVudCB0aGF0IHJldHVybnMgYSBjbGFzcyBpbnN0YW5jZS4gJyArICdDaGFuZ2UgJXMgdG8gYSBjbGFzcyB0aGF0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuICcgKyBcIklmIHlvdSBjYW4ndCB1c2UgYSBjbGFzcyB0cnkgYXNzaWduaW5nIHRoZSBwcm90b3R5cGUgb24gdGhlIGZ1bmN0aW9uIGFzIGEgd29ya2Fyb3VuZC4gXCIgKyBcImAlcy5wcm90b3R5cGUgPSBSZWFjdC5Db21wb25lbnQucHJvdG90eXBlYC4gRG9uJ3QgdXNlIGFuIGFycm93IGZ1bmN0aW9uIHNpbmNlIGl0IFwiICsgJ2Nhbm5vdCBiZSBjYWxsZWQgd2l0aCBgbmV3YCBieSBSZWFjdC4nLCBfY29tcG9uZW50TmFtZTIsIF9jb21wb25lbnROYW1lMiwgX2NvbXBvbmVudE5hbWUyKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRNb2R1bGVQYXR0ZXJuQ29tcG9uZW50W19jb21wb25lbnROYW1lMl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gLy8gUHJvY2VlZCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoaXMgaXMgYSBjbGFzcyBpbnN0YW5jZVxuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSBDbGFzc0NvbXBvbmVudDsgLy8gVGhyb3cgb3V0IGFueSBob29rcyB0aGF0IHdlcmUgdXNlZC5cblxuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gbnVsbDsgLy8gUHVzaCBjb250ZXh0IHByb3ZpZGVycyBlYXJseSB0byBwcmV2ZW50IGNvbnRleHQgc3RhY2sgbWlzbWF0Y2hlcy5cbiAgICAvLyBEdXJpbmcgbW91bnRpbmcgd2UgZG9uJ3Qga25vdyB0aGUgY2hpbGQgY29udGV4dCB5ZXQgYXMgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZXhpc3QuXG4gICAgLy8gV2Ugd2lsbCBpbnZhbGlkYXRlIHRoZSBjaGlsZCBjb250ZXh0IGluIGZpbmlzaENsYXNzQ29tcG9uZW50KCkgcmlnaHQgYWZ0ZXIgcmVuZGVyaW5nLlxuXG4gICAgdmFyIGhhc0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICBoYXNDb250ZXh0ID0gdHJ1ZTtcbiAgICAgIHB1c2hDb250ZXh0UHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNDb250ZXh0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHZhbHVlLnN0YXRlICE9PSBudWxsICYmIHZhbHVlLnN0YXRlICE9PSB1bmRlZmluZWQgPyB2YWx1ZS5zdGF0ZSA6IG51bGw7XG4gICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzKTtcbiAgICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcblxuICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyh3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsIHByb3BzKTtcbiAgICB9XG5cbiAgICBhZG9wdENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHZhbHVlKTtcbiAgICBtb3VudENsYXNzSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICByZXR1cm4gZmluaXNoQ2xhc3NDb21wb25lbnQobnVsbCwgd29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgdHJ1ZSwgaGFzQ29udGV4dCwgcmVuZGVyTGFuZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGlzIGlzIGEgZnVuY3Rpb24gY29tcG9uZW50XG4gICAgd29ya0luUHJvZ3Jlc3MudGFnID0gRnVuY3Rpb25Db21wb25lbnQ7XG5cbiAgICB7XG5cbiAgICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgZGlzYWJsZUxvZ3MoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gcmVuZGVyV2l0aEhvb2tzKG51bGwsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHByb3BzLCBjb250ZXh0LCByZW5kZXJMYW5lcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgcmVlbmFibGVMb2dzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZWNvbmNpbGVDaGlsZHJlbihudWxsLCB3b3JrSW5Qcm9ncmVzcywgdmFsdWUsIHJlbmRlckxhbmVzKTtcblxuICAgIHtcbiAgICAgIHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQpIHtcbiAge1xuICAgIGlmIChDb21wb25lbnQpIHtcbiAgICAgIGlmIChDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICAgICAgZXJyb3IoJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb24gY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzLnJlZiAhPT0gbnVsbCkge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIHZhciBvd25lck5hbWUgPSBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpO1xuXG4gICAgICBpZiAob3duZXJOYW1lKSB7XG4gICAgICAgIGluZm8gKz0gJ1xcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgb3duZXJOYW1lICsgJ2AuJztcbiAgICAgIH1cblxuICAgICAgdmFyIHdhcm5pbmdLZXkgPSBvd25lck5hbWUgfHwgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSUQgfHwgJyc7XG4gICAgICB2YXIgZGVidWdTb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdTb3VyY2U7XG5cbiAgICAgIGlmIChkZWJ1Z1NvdXJjZSkge1xuICAgICAgICB3YXJuaW5nS2V5ID0gZGVidWdTb3VyY2UuZmlsZU5hbWUgKyAnOicgKyBkZWJ1Z1NvdXJjZS5saW5lTnVtYmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZ1bmN0aW9uUmVmc1t3YXJuaW5nS2V5XSkge1xuICAgICAgICBkaWRXYXJuQWJvdXRGdW5jdGlvblJlZnNbd2FybmluZ0tleV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdGdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuICcgKyAnRGlkIHlvdSBtZWFuIHRvIHVzZSBSZWFjdC5mb3J3YXJkUmVmKCk/JXMnLCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfY29tcG9uZW50TmFtZTMgPSBnZXRDb21wb25lbnROYW1lKENvbXBvbmVudCkgfHwgJ1Vua25vd24nO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWUzXSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLicsIF9jb21wb25lbnROYW1lMyk7XG5cbiAgICAgICAgZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFtfY29tcG9uZW50TmFtZTNdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIENvbXBvbmVudC5jb250ZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgQ29tcG9uZW50LmNvbnRleHRUeXBlICE9PSBudWxsKSB7XG4gICAgICB2YXIgX2NvbXBvbmVudE5hbWU0ID0gZ2V0Q29tcG9uZW50TmFtZShDb21wb25lbnQpIHx8ICdVbmtub3duJztcblxuICAgICAgaWYgKCFkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSkge1xuICAgICAgICBlcnJvcignJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuJywgX2NvbXBvbmVudE5hbWU0KTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbX2NvbXBvbmVudE5hbWU0XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBTVVNQRU5ERURfTUFSS0VSID0ge1xuICBkZWh5ZHJhdGVkOiBudWxsLFxuICByZXRyeUxhbmU6IE5vTGFuZVxufTtcblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKSB7XG4gIHJldHVybiB7XG4gICAgYmFzZUxhbmVzOiByZW5kZXJMYW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHByZXZPZmZzY3JlZW5TdGF0ZSwgcmVuZGVyTGFuZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlTGFuZXM6IG1lcmdlTGFuZXMocHJldk9mZnNjcmVlblN0YXRlLmJhc2VMYW5lcywgcmVuZGVyTGFuZXMpXG4gIH07XG59IC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCBpbmxpbmUgdGhpcyBiYWNrXG5cblxuZnVuY3Rpb24gc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBJZiB3ZSdyZSBhbHJlYWR5IHNob3dpbmcgYSBmYWxsYmFjaywgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHdlIG5lZWQgdG9cbiAgLy8gcmVtYWluIG9uIHRoYXQgZmFsbGJhY2sgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyByZXNvbHZlZC5cbiAgLy8gRm9yIGV4YW1wbGUsIFN1c3BlbnNlTGlzdCBjb29yZGluYXRlcyB3aGVuIG5lc3RlZCBjb250ZW50IGFwcGVhcnMuXG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAgICBpZiAoc3VzcGVuc2VTdGF0ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gQ3VycmVudGx5IHNob3dpbmcgY29udGVudC4gRG9uJ3QgaGlkZSBpdCwgZXZlbiBpZiBGb3JjZVN1c3BlbnNlRmFsbGFja1xuICAgICAgLy8gaXMgdHJ1ZS4gTW9yZSBwcmVjaXNlIG5hbWUgbWlnaHQgYmUgXCJGb3JjZVJlbWFpblN1c3BlbnNlRmFsbGJhY2tcIi5cbiAgICAgIC8vIE5vdGU6IFRoaXMgaXMgYSBmYWN0b3Jpbmcgc21lbGwuIENhbid0IHJlbWFpbiBvbiBhIGZhbGxiYWNrIGlmIHRoZXJlJ3NcbiAgICAgIC8vIG5vIGZhbGxiYWNrIHRvIHJlbWFpbiBvbi5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gLy8gTm90IGN1cnJlbnRseSBzaG93aW5nIGNvbnRlbnQuIENvbnN1bHQgdGhlIFN1c3BlbnNlIGNvbnRleHQuXG5cblxuICByZXR1cm4gaGFzU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gVE9ETzogU2hvdWxkIG5vdCByZW1vdmUgcmVuZGVyIGxhbmVzIHRoYXQgd2VyZSBwaW5nZWQgZHVyaW5nIHRoaXMgcmVuZGVyXG4gIHJldHVybiByZW1vdmVMYW5lcyhjdXJyZW50LmNoaWxkTGFuZXMsIHJlbmRlckxhbmVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7IC8vIFRoaXMgaXMgdXNlZCBieSBEZXZUb29scyB0byBmb3JjZSBhIGJvdW5kYXJ5IHRvIHN1c3BlbmQuXG5cbiAge1xuICAgIGlmIChzaG91bGRTdXNwZW5kKHdvcmtJblByb2dyZXNzKSkge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuICB2YXIgc2hvd0ZhbGxiYWNrID0gZmFsc2U7XG4gIHZhciBkaWRTdXNwZW5kID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgaWYgKGRpZFN1c3BlbmQgfHwgc2hvdWxkUmVtYWluT25GYWxsYmFjayhzdXNwZW5zZUNvbnRleHQsIGN1cnJlbnQpKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoaXMgYm91bmRhcnkncyBzdWJ0cmVlIGFscmVhZHkgc3VzcGVuZGVkLiBTd2l0Y2ggdG9cbiAgICAvLyByZW5kZXJpbmcgdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgIHNob3dGYWxsYmFjayA9IHRydWU7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gfkRpZENhcHR1cmU7XG4gIH0gZWxzZSB7XG4gICAgLy8gQXR0ZW1wdGluZyB0aGUgbWFpbiBjb250ZW50XG4gICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudC5tZW1vaXplZFN0YXRlICE9PSBudWxsKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgbmV3IG1vdW50IG9yIHRoaXMgYm91bmRhcnkgaXMgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2sgc3RhdGUuXG4gICAgICAvLyBNYXJrIHRoaXMgc3VidHJlZSBjb250ZXh0IGFzIGhhdmluZyBhdCBsZWFzdCBvbmUgaW52aXNpYmxlIHBhcmVudCB0aGF0IGNvdWxkXG4gICAgICAvLyBoYW5kbGUgdGhlIGZhbGxiYWNrIHN0YXRlLlxuICAgICAgLy8gQm91bmRhcmllcyB3aXRob3V0IGZhbGxiYWNrcyBvciBzaG91bGQgYmUgYXZvaWRlZCBhcmUgbm90IGNvbnNpZGVyZWQgc2luY2VcbiAgICAgIC8vIHRoZXkgY2Fubm90IGhhbmRsZSBwcmVmZXJyZWQgZmFsbGJhY2sgc3RhdGVzLlxuICAgICAgaWYgKG5leHRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIG5leHRQcm9wcy51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjayAhPT0gdHJ1ZSkge1xuICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBhZGRTdWJ0cmVlU3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgSW52aXNpYmxlUGFyZW50U3VzcGVuc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdXNwZW5zZUNvbnRleHQgPSBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQpO1xuICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBPSywgdGhlIG5leHQgcGFydCBpcyBjb25mdXNpbmcuIFdlJ3JlIGFib3V0IHRvIHJlY29uY2lsZSB0aGUgU3VzcGVuc2VcbiAgLy8gYm91bmRhcnkncyBjaGlsZHJlbi4gVGhpcyBpbnZvbHZlcyBzb21lIGN1c3RvbSByZWNvbmNpbGF0aW9uIGxvZ2ljLiBUd29cbiAgLy8gbWFpbiByZWFzb25zIHRoaXMgaXMgc28gY29tcGxpY2F0ZWQuXG4gIC8vXG4gIC8vIEZpcnN0LCBMZWdhY3kgTW9kZSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZVxuICAvLyBwcmltYXJ5IHRyZWUgd2lsbCBjb21taXQgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzbyB3aGVuIHdlIGRvIHRoZVxuICAvLyBzZWNvbmQgcGFzcyB0byByZW5kZXIgdGhlIGZhbGxiYWNrLCB3ZSBkbyBzb21lIGV4Y2VlZGluZ2x5LCB1aCwgY2xldmVyXG4gIC8vIGhhY2tzIHRvIG1ha2UgdGhhdCBub3QgdG90YWxseSBicmVhay4gTGlrZSB0cmFuc2ZlcnJpbmcgZWZmZWN0cyBhbmRcbiAgLy8gZGVsZXRpb25zIGZyb20gaGlkZGVuIHRyZWUuIEluIENvbmN1cnJlbnQgTW9kZSwgaXQncyBtdWNoIHNpbXBsZXIsXG4gIC8vIGJlY2F1c2Ugd2UgYmFpbG91dCBvbiB0aGUgcHJpbWFyeSB0cmVlIGNvbXBsZXRlbHkgYW5kIGxlYXZlIGl0IGluIGl0cyBvbGRcbiAgLy8gc3RhdGUsIG5vIGVmZmVjdHMuIFNhbWUgYXMgd2hhdCB3ZSBkbyBmb3IgT2Zmc2NyZWVuIChleGNlcHQgdGhhdFxuICAvLyBPZmZzY3JlZW4gZG9lc24ndCBoYXZlIHRoZSBmaXJzdCByZW5kZXIgcGFzcykuXG4gIC8vXG4gIC8vIFNlY29uZCBpcyBoeWRyYXRpb24uIER1cmluZyBoeWRyYXRpb24sIHRoZSBTdXNwZW5zZSBmaWJlciBoYXMgYSBzbGlnaHRseVxuICAvLyBkaWZmZXJlbnQgbGF5b3V0LCB3aGVyZSB0aGUgY2hpbGQgcG9pbnRzIHRvIGEgZGVoeWRyYXRlZCBmcmFnbWVudCwgd2hpY2hcbiAgLy8gY29udGFpbnMgdGhlIERPTSByZW5kZXJlZCBieSB0aGUgc2VydmVyLlxuICAvL1xuICAvLyBUaGlyZCwgZXZlbiBpZiB5b3Ugc2V0IGFsbCB0aGF0IGFzaWRlLCBTdXNwZW5zZSBpcyBsaWtlIGVycm9yIGJvdW5kYXJpZXMgaW5cbiAgLy8gdGhhdCB3ZSBmaXJzdCB3ZSB0cnkgdG8gcmVuZGVyIG9uZSB0cmVlLCBhbmQgaWYgdGhhdCBmYWlscywgd2UgcmVuZGVyIGFnYWluXG4gIC8vIGFuZCBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgdHJlZS4gTGlrZSBhIHRyeS9jYXRjaCBibG9jay4gU28gd2UgaGF2ZSB0byB0cmFja1xuICAvLyB3aGljaCBicmFuY2ggd2UncmUgY3VycmVudGx5IHJlbmRlcmluZy4gSWRlYWxseSB3ZSB3b3VsZCBtb2RlbCB0aGlzIHVzaW5nXG4gIC8vIGEgc3RhY2suXG5cbiAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAvLyBJbml0aWFsIG1vdW50XG4gICAgLy8gSWYgd2UncmUgY3VycmVudGx5IGh5ZHJhdGluZywgdHJ5IHRvIGh5ZHJhdGUgdGhpcyBib3VuZGFyeS5cbiAgICAvLyBCdXQgb25seSBpZiB0aGlzIGhhcyBhIGZhbGxiYWNrLlxuICAgIGlmIChuZXh0UHJvcHMuZmFsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5VG9DbGFpbU5leHRIeWRyYXRhYmxlSW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpOyAvLyBUaGlzIGNvdWxkJ3ZlIGJlZW4gYSBkZWh5ZHJhdGVkIHN1c3BlbnNlIGNvbXBvbmVudC5cbiAgICB9XG5cbiAgICB2YXIgbmV4dFByaW1hcnlDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dEZhbGxiYWNrQ2hpbGRyZW4gPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG5cbiAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICB2YXIgZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5tZW1vaXplZFN0YXRlID0gbW91bnRTdXNwZW5zZU9mZnNjcmVlblN0YXRlKHJlbmRlckxhbmVzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrRnJhZ21lbnQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmV4dFByb3BzLnVuc3RhYmxlX2V4cGVjdGVkTG9hZFRpbWUgPT09ICdudW1iZXInKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgQ1BVLWJvdW5kIHRyZWUuIFNraXAgdGhpcyB0cmVlIGFuZCBzaG93IGEgcGxhY2Vob2xkZXIgdG9cbiAgICAgIC8vIHVuYmxvY2sgdGhlIHN1cnJvdW5kaW5nIGNvbnRlbnQuIFRoZW4gaW1tZWRpYXRlbHkgcmV0cnkgYWZ0ZXIgdGhlXG4gICAgICAvLyBpbml0aWFsIGNvbW1pdC5cbiAgICAgIHZhciBfZmFsbGJhY2tGcmFnbWVudCA9IG1vdW50U3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJpbWFyeUNoaWxkcmVuLCBuZXh0RmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQubWVtb2l6ZWRTdGF0ZSA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXMgdG9cbiAgICAgIC8vIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtcyBvZlxuICAgICAgLy8gcHJpb3JpdHkgdGhpcyB3b3JrIGhhcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGlzIGN1cnJlbnQgcmVuZGVyLCBpdCdzXG4gICAgICAvLyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzIGNvbW1pdHRlZC4gSWZcbiAgICAgIC8vIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZSBwYWludGVkLlxuICAgICAgLy8gQ29uY2VwdHVhbGx5LCB0aGlzIGlzIHJlYWxseSB0aGUgc2FtZSBhcyBwaW5naW5nLiBXZSBjYW4gdXNlIGFueVxuICAgICAgLy8gUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmcgc2luY2Ugd2UncmUgbGVhdmluZ1xuICAgICAgLy8gaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBTb21lUmV0cnlMYW5lO1xuXG4gICAgICB7XG4gICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9mYWxsYmFja0ZyYWdtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByaW1hcnlDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBUaGlzIGlzIGFuIHVwZGF0ZS5cbiAgICAvLyBJZiB0aGUgY3VycmVudCBmaWJlciBoYXMgYSBTdXNwZW5zZVN0YXRlLCB0aGF0IG1lYW5zIGl0J3MgYWxyZWFkeSBzaG93aW5nXG4gICAgLy8gYSBmYWxsYmFjay5cbiAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIHZhciBfbmV4dEZhbGxiYWNrQ2hpbGRyZW4yID0gbmV4dFByb3BzLmZhbGxiYWNrO1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4yID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjIsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjIsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50MyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgcHJldk9mZnNjcmVlblN0YXRlID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfcHJpbWFyeUNoaWxkRnJhZ21lbnQzLm1lbW9pemVkU3RhdGUgPSBwcmV2T2Zmc2NyZWVuU3RhdGUgPT09IG51bGwgPyBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIDogdXBkYXRlU3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShwcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50My5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gU1VTUEVOREVEX01BUktFUjtcbiAgICAgICAgcmV0dXJuIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW4zID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ0ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuMywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdHJlZSBpcyBub3QgYWxyZWFkeSBzaG93aW5nIGEgZmFsbGJhY2suXG4gICAgICBpZiAoc2hvd0ZhbGxiYWNrKSB7XG4gICAgICAgIC8vIFRpbWVkIG91dC5cbiAgICAgICAgdmFyIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIHZhciBfbmV4dFByaW1hcnlDaGlsZHJlbjQgPSBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAgICAgdmFyIF9mYWxsYmFja0NoaWxkRnJhZ21lbnQyID0gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfbmV4dFByaW1hcnlDaGlsZHJlbjQsIF9uZXh0RmFsbGJhY2tDaGlsZHJlbjMsIHJlbmRlckxhbmVzKTtcblxuICAgICAgICB2YXIgX3ByaW1hcnlDaGlsZEZyYWdtZW50NSA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICB2YXIgX3ByZXZPZmZzY3JlZW5TdGF0ZSA9IGN1cnJlbnQuY2hpbGQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5tZW1vaXplZFN0YXRlID0gX3ByZXZPZmZzY3JlZW5TdGF0ZSA9PT0gbnVsbCA/IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykgOiB1cGRhdGVTdXNwZW5zZU9mZnNjcmVlblN0YXRlKF9wcmV2T2Zmc2NyZWVuU3RhdGUsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgX3ByaW1hcnlDaGlsZEZyYWdtZW50NS5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoY3VycmVudCwgcmVuZGVyTGFuZXMpOyAvLyBTa2lwIHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBhbmQgY29udGludWUgd29ya2luZyBvbiB0aGVcbiAgICAgICAgLy8gZmFsbGJhY2sgY2hpbGRyZW4uXG5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBfZmFsbGJhY2tDaGlsZEZyYWdtZW50MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFN0aWxsIGhhdmVuJ3QgdGltZWQgb3V0LiBDb250aW51ZSByZW5kZXJpbmcgdGhlIGNoaWxkcmVuLCBsaWtlIHdlXG4gICAgICAgIC8vIG5vcm1hbGx5IGRvLlxuICAgICAgICB2YXIgX25leHRQcmltYXJ5Q2hpbGRyZW41ID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgICAgIHZhciBfcHJpbWFyeUNoaWxkRnJhZ21lbnQ2ID0gdXBkYXRlU3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF9uZXh0UHJpbWFyeUNoaWxkcmVuNSwgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgICByZXR1cm4gX3ByaW1hcnlDaGlsZEZyYWdtZW50NjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZVByaW1hcnlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgcHJpbWFyeUNoaWxkcmVuLCByZW5kZXJMYW5lcykge1xuICB2YXIgbW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGU7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAndmlzaWJsZScsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21PZmZzY3JlZW4ocHJpbWFyeUNoaWxkUHJvcHMsIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gbW91bnRTdXNwZW5zZUZhbGxiYWNrQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIHByaW1hcnlDaGlsZHJlbiwgZmFsbGJhY2tDaGlsZHJlbiwgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIG1vZGUgPSB3b3JrSW5Qcm9ncmVzcy5tb2RlO1xuICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICB2YXIgcHJpbWFyeUNoaWxkUHJvcHMgPSB7XG4gICAgbW9kZTogJ2hpZGRlbicsXG4gICAgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlblxuICB9O1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKChtb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlICYmIHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBJbiBsZWdhY3kgbW9kZSwgd2UgY29tbWl0IHRoZSBwcmltYXJ5IHRyZWUgYXMgaWYgaXQgc3VjY2Vzc2Z1bGx5XG4gICAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IHByb2dyZXNzZWRQcmltYXJ5RnJhZ21lbnQ7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucGVuZGluZ1Byb3BzID0gcHJpbWFyeUNoaWxkUHJvcHM7XG5cbiAgICBpZiAoIHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIGR1cmF0aW9ucyBmcm9tIHRoZSBmaXJzdCBwYXNzIHNvIHRoZXkgYXJlbid0IGluY2x1ZGVkIGluIHRoZVxuICAgICAgLy8gZmluYWwgYW1vdW50cy4gVGhpcyBzZWVtcyBjb3VudGVyaW50dWl0aXZlLCBzaW5jZSB3ZSdyZSBpbnRlbnRpb25hbGx5XG4gICAgICAvLyBub3QgbWVhc3VyaW5nIHBhcnQgb2YgdGhlIHJlbmRlciBwaGFzZSwgYnV0IHRoaXMgbWFrZXMgaXQgbWF0Y2ggd2hhdCB3ZVxuICAgICAgLy8gZG8gaW4gQ29uY3VycmVudCBNb2RlLlxuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsRHVyYXRpb24gPSAwO1xuICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuYWN0dWFsU3RhcnRUaW1lID0gLTE7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cblxuICAgIGZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGZhbGxiYWNrQ2hpbGRyZW4sIG1vZGUsIHJlbmRlckxhbmVzLCBudWxsKTtcbiAgfSBlbHNlIHtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwcmltYXJ5Q2hpbGRQcm9wcywgbW9kZSwgTm9MYW5lcywgbnVsbCk7XG4gICAgZmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZmFsbGJhY2tDaGlsZHJlbiwgbW9kZSwgcmVuZGVyTGFuZXMsIG51bGwpO1xuICB9XG5cbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gIGZhbGxiYWNrQ2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcykge1xuICAvLyBUaGUgcHJvcHMgYXJndW1lbnQgdG8gYGNyZWF0ZVdvcmtJblByb2dyZXNzYCBpcyBgYW55YCB0eXBlZCwgc28gd2UgdXNlIHRoaXNcbiAgLy8gd3JhcHBlciBmdW5jdGlvbiB0byBjb25zdHJhaW4gaXQuXG4gIHJldHVybiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBvZmZzY3JlZW5Qcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjdXJyZW50LmNoaWxkO1xuICB2YXIgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudCA9IGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nO1xuICB2YXIgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzc09mZnNjcmVlbkZpYmVyKGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCwge1xuICAgIG1vZGU6ICd2aXNpYmxlJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH0pO1xuXG4gIGlmICgod29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LmxhbmVzID0gcmVuZGVyTGFuZXM7XG4gIH1cblxuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IG51bGw7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICAvLyBEZWxldGUgdGhlIGZhbGxiYWNrIGNoaWxkIGZyYWdtZW50XG4gICAgY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgd29ya0luUHJvZ3Jlc3MuZmlyc3RFZmZlY3QgPSB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0ID0gY3VycmVudEZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQ7XG4gIHJldHVybiBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlU3VzcGVuc2VGYWxsYmFja0NoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4sIGZhbGxiYWNrQ2hpbGRyZW4sIHJlbmRlckxhbmVzKSB7XG4gIHZhciBtb2RlID0gd29ya0luUHJvZ3Jlc3MubW9kZTtcbiAgdmFyIGN1cnJlbnRQcmltYXJ5Q2hpbGRGcmFnbWVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gIHZhciBjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50ID0gY3VycmVudFByaW1hcnlDaGlsZEZyYWdtZW50LnNpYmxpbmc7XG4gIHZhciBwcmltYXJ5Q2hpbGRQcm9wcyA9IHtcbiAgICBtb2RlOiAnaGlkZGVuJyxcbiAgICBjaGlsZHJlbjogcHJpbWFyeUNoaWxkcmVuXG4gIH07XG4gIHZhciBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcblxuICBpZiAoIC8vIEluIGxlZ2FjeSBtb2RlLCB3ZSBjb21taXQgdGhlIHByaW1hcnkgdHJlZSBhcyBpZiBpdCBzdWNjZXNzZnVsbHlcbiAgLy8gY29tcGxldGVkLCBldmVuIHRob3VnaCBpdCdzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS5cbiAgKG1vZGUgJiBCbG9ja2luZ01vZGUpID09PSBOb01vZGUgJiYgLy8gTWFrZSBzdXJlIHdlJ3JlIG9uIHRoZSBzZWNvbmQgcGFzcywgaS5lLiB0aGUgcHJpbWFyeSBjaGlsZCBmcmFnbWVudCB3YXNcbiAgLy8gYWxyZWFkeSBjbG9uZWQuIEluIGxlZ2FjeSBtb2RlLCB0aGUgb25seSBjYXNlIHdoZXJlIHRoaXMgaXNuJ3QgdHJ1ZSBpc1xuICAvLyB3aGVuIERldlRvb2xzIGZvcmNlcyB1cyB0byBkaXNwbGF5IGEgZmFsbGJhY2s7IHdlIHNraXAgdGhlIGZpcnN0IHJlbmRlclxuICAvLyBwYXNzIGVudGlyZWx5IGFuZCBnbyBzdHJhaWdodCB0byByZW5kZXJpbmcgdGhlIGZhbGxiYWNrLiAoSW4gQ29uY3VycmVudFxuICAvLyBNb2RlLCBTdXNwZW5zZUxpc3QgY2FuIGFsc28gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLCBidXQgdGhpcyBpcyBhIGxlZ2FjeS1cbiAgLy8gb25seSBjb2RlcGF0aC4pXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkICE9PSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQpIHtcbiAgICB2YXIgcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudCA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gcHJvZ3Jlc3NlZFByaW1hcnlGcmFnbWVudDtcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5wZW5kaW5nUHJvcHMgPSBwcmltYXJ5Q2hpbGRQcm9wcztcblxuICAgIGlmICggd29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSB7XG4gICAgICAvLyBSZXNldCB0aGUgZHVyYXRpb25zIGZyb20gdGhlIGZpcnN0IHBhc3Mgc28gdGhleSBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlXG4gICAgICAvLyBmaW5hbCBhbW91bnRzLiBUaGlzIHNlZW1zIGNvdW50ZXJpbnR1aXRpdmUsIHNpbmNlIHdlJ3JlIGludGVudGlvbmFsbHlcbiAgICAgIC8vIG5vdCBtZWFzdXJpbmcgcGFydCBvZiB0aGUgcmVuZGVyIHBoYXNlLCBidXQgdGhpcyBtYWtlcyBpdCBtYXRjaCB3aGF0IHdlXG4gICAgICAvLyBkbyBpbiBDb25jdXJyZW50IE1vZGUuXG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxEdXJhdGlvbiA9IDA7XG4gICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5hY3R1YWxTdGFydFRpbWUgPSAtMTtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnNlbGZCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9IC8vIFRoZSBmYWxsYmFjayBmaWJlciB3YXMgYWRkZWQgYXMgYSBkZWxldGlvbiBlZmZlY3QgZHVyaW5nIHRoZSBmaXJzdCBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIGdvaW5nIHRvIHJlbWFpbiBvbiB0aGUgZmFsbGJhY2ssIHdlIG5vIGxvbmdlciB3YW50XG4gICAgLy8gdG8gZGVsZXRlIGl0LiBTbyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LiBEZWxldGlvbnMgYXJlIHN0b3JlZFxuICAgIC8vIG9uIHRoZSBzYW1lIGxpc3QgYXMgZWZmZWN0cy4gV2Ugd2FudCB0byBrZWVwIHRoZSBlZmZlY3RzIGZyb20gdGhlIHByaW1hcnlcbiAgICAvLyB0cmVlLiBTbyB3ZSBjb3B5IHRoZSBwcmltYXJ5IGNoaWxkIGZyYWdtZW50J3MgZWZmZWN0IGxpc3QsIHdoaWNoIGRvZXMgbm90XG4gICAgLy8gaW5jbHVkZSB0aGUgZmFsbGJhY2sgZGVsZXRpb24gZWZmZWN0LlxuXG5cbiAgICB2YXIgcHJvZ3Jlc3NlZExhc3RFZmZlY3QgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudC5sYXN0RWZmZWN0O1xuXG4gICAgaWYgKHByb2dyZXNzZWRMYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmZpcnN0RWZmZWN0O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IHByb2dyZXNzZWRMYXN0RWZmZWN0O1xuICAgICAgcHJvZ3Jlc3NlZExhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IFJlc2V0IHRoaXMgc29tZXdoZXJlIGVsc2U/IExvbCBsZWdhY3kgbW9kZSBpcyBzbyB3ZWlyZC5cbiAgICAgIHdvcmtJblByb2dyZXNzLmZpcnN0RWZmZWN0ID0gd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY3JlYXRlV29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihjdXJyZW50UHJpbWFyeUNoaWxkRnJhZ21lbnQsIHByaW1hcnlDaGlsZFByb3BzKTtcbiAgfVxuXG4gIHZhciBmYWxsYmFja0NoaWxkRnJhZ21lbnQ7XG5cbiAgaWYgKGN1cnJlbnRGYWxsYmFja0NoaWxkRnJhZ21lbnQgIT09IG51bGwpIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50RmFsbGJhY2tDaGlsZEZyYWdtZW50LCBmYWxsYmFja0NoaWxkcmVuKTtcbiAgfSBlbHNlIHtcbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQgPSBjcmVhdGVGaWJlckZyb21GcmFnbWVudChmYWxsYmFja0NoaWxkcmVuLCBtb2RlLCByZW5kZXJMYW5lcywgbnVsbCk7IC8vIE5lZWRzIGEgcGxhY2VtZW50IGVmZmVjdCBiZWNhdXNlIHRoZSBwYXJlbnQgKHRoZSBTdXNwZW5zZSBib3VuZGFyeSkgYWxyZWFkeVxuICAgIC8vIG1vdW50ZWQgYnV0IHRoaXMgaXMgYSBuZXcgZmliZXIuXG5cbiAgICBmYWxsYmFja0NoaWxkRnJhZ21lbnQuZmxhZ3MgfD0gUGxhY2VtZW50O1xuICB9XG5cbiAgZmFsbGJhY2tDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgcHJpbWFyeUNoaWxkRnJhZ21lbnQuc2libGluZyA9IGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgcmV0dXJuIGZhbGxiYWNrQ2hpbGRGcmFnbWVudDtcbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVXb3JrT25GaWJlcihmaWJlciwgcmVuZGVyTGFuZXMpIHtcbiAgZmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKGZpYmVyLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG5cbiAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgIGFsdGVybmF0ZS5sYW5lcyA9IG1lcmdlTGFuZXMoYWx0ZXJuYXRlLmxhbmVzLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICBzY2hlZHVsZVdvcmtPblBhcmVudFBhdGgoZmliZXIucmV0dXJuLCByZW5kZXJMYW5lcyk7XG59XG5cbmZ1bmN0aW9uIHByb3BhZ2F0ZVN1c3BlbnNlQ29udGV4dENoYW5nZSh3b3JrSW5Qcm9ncmVzcywgZmlyc3RDaGlsZCwgcmVuZGVyTGFuZXMpIHtcbiAgLy8gTWFyayBhbnkgU3VzcGVuc2UgYm91bmRhcmllcyB3aXRoIGZhbGxiYWNrcyBhcyBoYXZpbmcgd29yayB0byBkby5cbiAgLy8gSWYgdGhleSB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIGludG8gZmFsbGJhY2tzLCB0aGV5IG1heSBub3cgYmUgYWJsZVxuICAvLyB0byB1bmJsb2NrLlxuICB2YXIgbm9kZSA9IGZpcnN0Q2hpbGQ7XG5cbiAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHtcbiAgICBpZiAobm9kZS50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50KSB7XG4gICAgICB2YXIgc3RhdGUgPSBub2RlLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtPbkZpYmVyKG5vZGUsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBTdXNwZW5zZUxpc3RDb21wb25lbnQpIHtcbiAgICAgIC8vIElmIHRoZSB0YWlsIGlzIGhpZGRlbiB0aGVyZSBtaWdodCBub3QgYmUgYW4gU3VzcGVuc2UgYm91bmRhcmllc1xuICAgICAgLy8gdG8gc2NoZWR1bGUgd29yayBvbi4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgb24gdGhlXG4gICAgICAvLyBsaXN0IGl0c2VsZi5cbiAgICAgIC8vIFdlIGRvbid0IGhhdmUgdG8gdHJhdmVyc2UgdG8gdGhlIGNoaWxkcmVuIG9mIHRoZSBsaXN0IHNpbmNlXG4gICAgICAvLyB0aGUgbGlzdCB3aWxsIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIHdoZW4gaXQgcmVyZW5kZXJzLlxuICAgICAgc2NoZWR1bGVXb3JrT25GaWJlcihub2RlLCByZW5kZXJMYW5lcyk7XG4gICAgfSBlbHNlIGlmIChub2RlLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgLy8gVGhpcyBpcyBnb2luZyB0byBmaW5kIHRoZSBsYXN0IHJvdyBhbW9uZyB0aGVzZSBjaGlsZHJlbiB0aGF0IGlzIGFscmVhZHlcbiAgLy8gc2hvd2luZyBjb250ZW50IG9uIHRoZSBzY3JlZW4sIGFzIG9wcG9zZWQgdG8gYmVpbmcgaW4gZmFsbGJhY2sgc3RhdGUgb3JcbiAgLy8gbmV3LiBJZiBhIHJvdyBoYXMgbXVsdGlwbGUgU3VzcGVuc2UgYm91bmRhcmllcywgYW55IG9mIHRoZW0gYmVpbmcgaW4gdGhlXG4gIC8vIGZhbGxiYWNrIHN0YXRlLCBjb3VudHMgYXMgdGhlIHdob2xlIHJvdyBiZWluZyBpbiBhIGZhbGxiYWNrIHN0YXRlLlxuICAvLyBOb3RlIHRoYXQgdGhlIFwicm93c1wiIHdpbGwgYmUgd29ya0luUHJvZ3Jlc3MsIGJ1dCBhbnkgbmVzdGVkIGNoaWxkcmVuXG4gIC8vIHdpbGwgc3RpbGwgYmUgY3VycmVudCBzaW5jZSB3ZSBoYXZlbid0IHJlbmRlcmVkIHRoZW0geWV0LiBUaGUgbW91bnRlZFxuICAvLyBvcmRlciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBuZXcgb3JkZXIuIFdlIHVzZSB0aGUgbmV3IG9yZGVyLlxuICB2YXIgcm93ID0gZmlyc3RDaGlsZDtcbiAgdmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDtcblxuICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgdmFyIGN1cnJlbnRSb3cgPSByb3cuYWx0ZXJuYXRlOyAvLyBOZXcgcm93cyBjYW4ndCBiZSBjb250ZW50IHJvd3MuXG5cbiAgICBpZiAoY3VycmVudFJvdyAhPT0gbnVsbCAmJiBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgPT09IG51bGwpIHtcbiAgICAgIGxhc3RDb250ZW50Um93ID0gcm93O1xuICAgIH1cblxuICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RDb250ZW50Um93O1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVJldmVhbE9yZGVyKHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAocmV2ZWFsT3JkZXIgIT09IHVuZGVmaW5lZCAmJiByZXZlYWxPcmRlciAhPT0gJ2ZvcndhcmRzJyAmJiByZXZlYWxPcmRlciAhPT0gJ2JhY2t3YXJkcycgJiYgcmV2ZWFsT3JkZXIgIT09ICd0b2dldGhlcicgJiYgIWRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3JldmVhbE9yZGVyXSkge1xuICAgICAgZGlkV2FybkFib3V0UmV2ZWFsT3JkZXJbcmV2ZWFsT3JkZXJdID0gdHJ1ZTtcblxuICAgICAgaWYgKHR5cGVvZiByZXZlYWxPcmRlciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICAgIGNhc2UgJ2ZvcndhcmRzJzpcbiAgICAgICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1VzZSBsb3dlcmNhc2UgXCIlc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6XG4gICAgICAgICAgY2FzZSAnYmFja3dhcmQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcignXCIlc1wiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiAnICsgJ1JlYWN0IHVzZXMgdGhlIC1zIHN1ZmZpeCBpbiB0aGUgc3BlbGxpbmcuIFVzZSBcIiVzc1wiIGluc3RlYWQuJywgcmV2ZWFsT3JkZXIsIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JywgcmV2ZWFsT3JkZXIpO1xuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3IoJyVzIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gJyArICdEaWQgeW91IG1lYW4gXCJ0b2dldGhlclwiLCBcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIj8nLCByZXZlYWxPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKSB7XG4gIHtcbiAgICBpZiAodGFpbE1vZGUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkFib3V0VGFpbE9wdGlvbnNbdGFpbE1vZGVdKSB7XG4gICAgICBpZiAodGFpbE1vZGUgIT09ICdjb2xsYXBzZWQnICYmIHRhaWxNb2RlICE9PSAnaGlkZGVuJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciB0YWlsIG9uIDxTdXNwZW5zZUxpc3QgLz4uICcgKyAnRGlkIHlvdSBtZWFuIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLCB0YWlsTW9kZSk7XG4gICAgICB9IGVsc2UgaWYgKHJldmVhbE9yZGVyICE9PSAnZm9yd2FyZHMnICYmIHJldmVhbE9yZGVyICE9PSAnYmFja3dhcmRzJykge1xuICAgICAgICBkaWRXYXJuQWJvdXRUYWlsT3B0aW9uc1t0YWlsTW9kZV0gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgJyArICdcImZvcndhcmRzXCIgb3IgXCJiYWNrd2FyZHNcIi4gJyArICdEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JywgdGFpbE1vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdE5lc3RlZENoaWxkKGNoaWxkU2xvdCwgaW5kZXgpIHtcbiAge1xuICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShjaGlsZFNsb3QpO1xuICAgIHZhciBpc0l0ZXJhYmxlID0gIWlzQXJyYXkgJiYgdHlwZW9mIGdldEl0ZXJhdG9yRm4oY2hpbGRTbG90KSA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmIChpc0FycmF5IHx8IGlzSXRlcmFibGUpIHtcbiAgICAgIHZhciB0eXBlID0gaXNBcnJheSA/ICdhcnJheScgOiAnaXRlcmFibGUnO1xuXG4gICAgICBlcnJvcignQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gJyArICdhbiBhZGRpdGlvbmFsIFN1c3BlbnNlTGlzdCB0byBjb25maWd1cmUgaXRzIHJldmVhbE9yZGVyOiAnICsgJzxTdXNwZW5zZUxpc3QgcmV2ZWFsT3JkZXI9Li4uPiAuLi4gJyArICc8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiAnICsgJzwvU3VzcGVuc2VMaXN0PicsIHR5cGUsIGluZGV4LCB0eXBlKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN1c3BlbnNlTGlzdENoaWxkcmVuKGNoaWxkcmVuLCByZXZlYWxPcmRlcikge1xuICB7XG4gICAgaWYgKChyZXZlYWxPcmRlciA9PT0gJ2ZvcndhcmRzJyB8fCByZXZlYWxPcmRlciA9PT0gJ2JhY2t3YXJkcycpICYmIGNoaWxkcmVuICE9PSB1bmRlZmluZWQgJiYgY2hpbGRyZW4gIT09IG51bGwgJiYgY2hpbGRyZW4gIT09IGZhbHNlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZHJlbltpXSwgaSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFyIGNoaWxkcmVuSXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuXG4gICAgICAgICAgaWYgKGNoaWxkcmVuSXRlcmF0b3IpIHtcbiAgICAgICAgICAgIHZhciBzdGVwID0gY2hpbGRyZW5JdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICB2YXIgX2kgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKDsgIXN0ZXAuZG9uZTsgc3RlcCA9IGNoaWxkcmVuSXRlcmF0b3IubmV4dCgpKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBfaSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcignQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gJyArICdUaGlzIGlzIG5vdCB1c2VmdWwgc2luY2UgaXQgbmVlZHMgbXVsdGlwbGUgcm93cy4gJyArICdEaWQgeW91IG1lYW4gdG8gcGFzcyBtdWx0aXBsZSBjaGlsZHJlbiBvciBhbiBhcnJheT8nLCByZXZlYWxPcmRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBpc0JhY2t3YXJkcywgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCBsYXN0RWZmZWN0QmVmb3JlUmVuZGVyaW5nKSB7XG4gIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgIGlzQmFja3dhcmRzOiBpc0JhY2t3YXJkcyxcbiAgICAgIHJlbmRlcmluZzogbnVsbCxcbiAgICAgIHJlbmRlcmluZ1N0YXJ0VGltZTogMCxcbiAgICAgIGxhc3Q6IGxhc3RDb250ZW50Um93LFxuICAgICAgdGFpbDogdGFpbCxcbiAgICAgIHRhaWxNb2RlOiB0YWlsTW9kZSxcbiAgICAgIGxhc3RFZmZlY3Q6IGxhc3RFZmZlY3RCZWZvcmVSZW5kZXJpbmdcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGNhbiByZXVzZSB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZyb20gcHJldmlvdXMgcmVuZGVycy5cbiAgICByZW5kZXJTdGF0ZS5pc0JhY2t3YXJkcyA9IGlzQmFja3dhcmRzO1xuICAgIHJlbmRlclN0YXRlLnJlbmRlcmluZyA9IG51bGw7XG4gICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMDtcbiAgICByZW5kZXJTdGF0ZS5sYXN0ID0gbGFzdENvbnRlbnRSb3c7XG4gICAgcmVuZGVyU3RhdGUudGFpbCA9IHRhaWw7XG4gICAgcmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZTtcbiAgICByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0ID0gbGFzdEVmZmVjdEJlZm9yZVJlbmRlcmluZztcbiAgfVxufSAvLyBUaGlzIGNhbiBlbmQgdXAgcmVuZGVyaW5nIHRoaXMgY29tcG9uZW50IG11bHRpcGxlIHBhc3Nlcy5cbi8vIFRoZSBmaXJzdCBwYXNzIHNwbGl0cyB0aGUgY2hpbGRyZW4gZmliZXJzIGludG8gdHdvIHNldHMuIEEgaGVhZCBhbmQgdGFpbC5cbi8vIFdlIGZpcnN0IHJlbmRlciB0aGUgaGVhZC4gSWYgYW55dGhpbmcgaXMgaW4gZmFsbGJhY2sgc3RhdGUsIHdlIGRvIGFub3RoZXJcbi8vIHBhc3MgdGhyb3VnaCBiZWdpbldvcmsgdG8gcmVyZW5kZXIgYWxsIGNoaWxkcmVuIChpbmNsdWRpbmcgdGhlIHRhaWwpIHdpdGhcbi8vIHRoZSBmb3JjZSBzdXNwZW5kIGNvbnRleHQuIElmIHRoZSBmaXJzdCByZW5kZXIgZGlkbid0IGhhdmUgYW55dGhpbmcgaW5cbi8vIGluIGZhbGxiYWNrIHN0YXRlLiBUaGVuIHdlIHJlbmRlciBlYWNoIHJvdyBpbiB0aGUgdGFpbCBvbmUtYnktb25lLlxuLy8gVGhhdCBoYXBwZW5zIGluIHRoZSBjb21wbGV0ZVdvcmsgcGhhc2Ugd2l0aG91dCBnb2luZyBiYWNrIHRvIGJlZ2luV29yay5cblxuXG5mdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXh0UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcjtcbiAgdmFyIHRhaWxNb2RlID0gbmV4dFByb3BzLnRhaWw7XG4gIHZhciBuZXdDaGlsZHJlbiA9IG5leHRQcm9wcy5jaGlsZHJlbjtcbiAgdmFsaWRhdGVSZXZlYWxPcmRlcihyZXZlYWxPcmRlcik7XG4gIHZhbGlkYXRlVGFpbE9wdGlvbnModGFpbE1vZGUsIHJldmVhbE9yZGVyKTtcbiAgdmFsaWRhdGVTdXNwZW5zZUxpc3RDaGlsZHJlbihuZXdDaGlsZHJlbiwgcmV2ZWFsT3JkZXIpO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgdmFyIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgdmFyIHNob3VsZEZvcmNlRmFsbGJhY2sgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0LCBGb3JjZVN1c3BlbnNlRmFsbGJhY2spO1xuXG4gIGlmIChzaG91bGRGb3JjZUZhbGxiYWNrKSB7XG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZUNvbnRleHQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjayk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IGN1cnJlbnQgIT09IG51bGwgJiYgKGN1cnJlbnQuZmxhZ3MgJiBEaWRDYXB0dXJlKSAhPT0gTm9GbGFncztcblxuICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAvLyBJZiB3ZSBwcmV2aW91c2x5IGZvcmNlZCBhIGZhbGxiYWNrLCB3ZSBuZWVkIHRvIHNjaGVkdWxlIHdvcmtcbiAgICAgIC8vIG9uIGFueSBuZXN0ZWQgYm91bmRhcmllcyB0byBsZXQgdGhlbSBrbm93IHRvIHRyeSB0byByZW5kZXJcbiAgICAgIC8vIGFnYWluLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNvbnRleHQgdXBkYXRpbmcuXG4gICAgICBwcm9wYWdhdGVTdXNwZW5zZUNvbnRleHRDaGFuZ2Uod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLmNoaWxkLCByZW5kZXJMYW5lcyk7XG4gICAgfVxuXG4gICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgfVxuXG4gIHB1c2hTdXNwZW5zZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlQ29udGV4dCk7XG5cbiAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgQmxvY2tpbmdNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgLy8gSW4gbGVnYWN5IG1vZGUsIFN1c3BlbnNlTGlzdCBkb2Vzbid0IHdvcmsgc28gd2UganVzdFxuICAgIC8vIHVzZSBtYWtlIGl0IGEgbm9vcCBieSB0cmVhdGluZyBpdCBhcyB0aGUgZGVmYXVsdCByZXZlYWxPcmRlci5cbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHJldmVhbE9yZGVyKSB7XG4gICAgICBjYXNlICdmb3J3YXJkcyc6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgbGFzdENvbnRlbnRSb3cgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpO1xuICAgICAgICAgIHZhciB0YWlsO1xuXG4gICAgICAgICAgaWYgKGxhc3RDb250ZW50Um93ID09PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBUaGUgd2hvbGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSB0YWlsLlxuICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgZmFzdCBwYXRoIGJ5IGp1c3QgcmVuZGVyaW5nIHRoZSB0YWlsIG5vdy5cbiAgICAgICAgICAgIHRhaWwgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgdGFpbCByb3dzIGFmdGVyIHRoZSBjb250ZW50IHJvdy5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkgbGF0ZXIuXG4gICAgICAgICAgICB0YWlsID0gbGFzdENvbnRlbnRSb3cuc2libGluZztcbiAgICAgICAgICAgIGxhc3RDb250ZW50Um93LnNpYmxpbmcgPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZSh3b3JrSW5Qcm9ncmVzcywgZmFsc2UsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgdGFpbCwgbGFzdENvbnRlbnRSb3csIHRhaWxNb2RlLCB3b3JrSW5Qcm9ncmVzcy5sYXN0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlICdiYWNrd2FyZHMnOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2UncmUgZ29pbmcgdG8gZmluZCB0aGUgZmlyc3Qgcm93IHRoYXQgaGFzIGV4aXN0aW5nIGNvbnRlbnQuXG4gICAgICAgICAgLy8gQXQgdGhlIHNhbWUgdGltZSB3ZSdyZSBnb2luZyB0byByZXZlcnNlIHRoZSBsaXN0IG9mIGV2ZXJ5dGhpbmdcbiAgICAgICAgICAvLyB3ZSBwYXNzIGluIHRoZSBtZWFudGltZS4gVGhhdCdzIGdvaW5nIHRvIGJlIG91ciB0YWlsIGluIHJldmVyc2VcbiAgICAgICAgICAvLyBvcmRlci5cbiAgICAgICAgICB2YXIgX3RhaWwgPSBudWxsO1xuICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG5cbiAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFJvdyA9IHJvdy5hbHRlcm5hdGU7IC8vIE5ldyByb3dzIGNhbid0IGJlIGNvbnRlbnQgcm93cy5cblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRSb3cgIT09IG51bGwgJiYgZmluZEZpcnN0U3VzcGVuZGVkKGN1cnJlbnRSb3cpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWFpbiBjb250ZW50LlxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJvdztcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgICAgICByb3cuc2libGluZyA9IF90YWlsO1xuICAgICAgICAgICAgX3RhaWwgPSByb3c7XG4gICAgICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgICAgIH0gLy8gVE9ETzogSWYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgaXMgbnVsbCwgd2UgY2FuIGNvbnRpbnVlIG9uIHRoZSB0YWlsIGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUod29ya0luUHJvZ3Jlc3MsIHRydWUsIC8vIGlzQmFja3dhcmRzXG4gICAgICAgICAgX3RhaWwsIG51bGwsIC8vIGxhc3RcbiAgICAgICAgICB0YWlsTW9kZSwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSAndG9nZXRoZXInOlxuICAgICAgICB7XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKHdvcmtJblByb2dyZXNzLCBmYWxzZSwgLy8gaXNCYWNrd2FyZHNcbiAgICAgICAgICBudWxsLCAvLyB0YWlsXG4gICAgICAgICAgbnVsbCwgLy8gbGFzdFxuICAgICAgICAgIHVuZGVmaW5lZCwgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHJldmVhbCBvcmRlciBpcyB0aGUgc2FtZSBhcyBub3QgaGF2aW5nXG4gICAgICAgICAgLy8gYSBib3VuZGFyeS5cbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlUG9ydGFsQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICBwdXNoSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICB2YXIgbmV4dENoaWxkcmVuID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgLy8gUG9ydGFscyBhcmUgc3BlY2lhbCBiZWNhdXNlIHdlIGRvbid0IGFwcGVuZCB0aGUgY2hpbGRyZW4gZHVyaW5nIG1vdW50XG4gICAgLy8gYnV0IGF0IGNvbW1pdC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gdHJhY2sgaW5zZXJ0aW9ucyB3aGljaCB0aGUgbm9ybWFsXG4gICAgLy8gZmxvdyBkb2Vzbid0IGRvIGR1cmluZyBtb3VudC4gVGhpcyBkb2Vzbid0IGhhcHBlbiBhdCB0aGUgcm9vdCBiZWNhdXNlXG4gICAgLy8gdGhlIHJvb3QgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgXCJjdXJyZW50XCIgd2l0aCBhIG51bGwgY2hpbGQuXG4gICAgLy8gVE9ETzogQ29uc2lkZXIgdW5pZnlpbmcgdGhpcyB3aXRoIGhvdyB0aGUgcm9vdCB3b3Jrcy5cbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCBudWxsLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG59XG5cbnZhciBoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVDb250ZXh0UHJvdmlkZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBwcm92aWRlclR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICB2YXIgY29udGV4dCA9IHByb3ZpZGVyVHlwZS5fY29udGV4dDtcbiAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICB2YXIgb2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICB2YXIgbmV3VmFsdWUgPSBuZXdQcm9wcy52YWx1ZTtcblxuICB7XG4gICAgaWYgKCEoJ3ZhbHVlJyBpbiBuZXdQcm9wcykpIHtcbiAgICAgIGlmICghaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIpIHtcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCdUaGUgYHZhbHVlYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGUgYDxDb250ZXh0LlByb3ZpZGVyPmAuIERpZCB5b3UgbWlzc3BlbGwgaXQgb3IgZm9yZ2V0IHRvIHBhc3MgaXQ/Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3ZpZGVyUHJvcFR5cGVzID0gd29ya0luUHJvZ3Jlc3MudHlwZS5wcm9wVHlwZXM7XG5cbiAgICBpZiAocHJvdmlkZXJQcm9wVHlwZXMpIHtcbiAgICAgIGNoZWNrUHJvcFR5cGVzKHByb3ZpZGVyUHJvcFR5cGVzLCBuZXdQcm9wcywgJ3Byb3AnLCAnQ29udGV4dC5Qcm92aWRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgbmV3VmFsdWUpO1xuXG4gIGlmIChvbGRQcm9wcyAhPT0gbnVsbCkge1xuICAgIHZhciBvbGRWYWx1ZSA9IG9sZFByb3BzLnZhbHVlO1xuICAgIHZhciBjaGFuZ2VkQml0cyA9IGNhbGN1bGF0ZUNoYW5nZWRCaXRzKGNvbnRleHQsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7XG5cbiAgICBpZiAoY2hhbmdlZEJpdHMgPT09IDApIHtcbiAgICAgIC8vIE5vIGNoYW5nZS4gQmFpbG91dCBlYXJseSBpZiBjaGlsZHJlbiBhcmUgdGhlIHNhbWUuXG4gICAgICBpZiAob2xkUHJvcHMuY2hpbGRyZW4gPT09IG5ld1Byb3BzLmNoaWxkcmVuICYmICFoYXNDb250ZXh0Q2hhbmdlZCgpKSB7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBjb250ZXh0IHZhbHVlIGNoYW5nZWQuIFNlYXJjaCBmb3IgbWF0Y2hpbmcgY29uc3VtZXJzIGFuZCBzY2hlZHVsZVxuICAgICAgLy8gdGhlbSB0byB1cGRhdGUuXG4gICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlKHdvcmtJblByb2dyZXNzLCBjb250ZXh0LCBjaGFuZ2VkQml0cywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBuZXdDaGlsZHJlbiA9IG5ld1Byb3BzLmNoaWxkcmVuO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG52YXIgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnRleHRBc0NvbnN1bWVyID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRDb25zdW1lcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIGNvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy50eXBlOyAvLyBUaGUgbG9naWMgYmVsb3cgZm9yIENvbnRleHQgZGlmZmVycyBkZXBlbmRpbmcgb24gUFJPRCBvciBERVYgbW9kZS4gSW5cbiAgLy8gREVWIG1vZGUsIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgQ29udGV4dC5Db25zdW1lciB0aGF0IGFjdHNcbiAgLy8gbGlrZSBhIHByb3h5IHRvIENvbnRleHQuIFRoaXMgcHJveHkgb2JqZWN0IGFkZHMgdW5uZWNlc3NhcnkgY29kZSBpbiBQUk9EXG4gIC8vIHNvIHdlIHVzZSB0aGUgb2xkIGJlaGF2aW91ciAoQ29udGV4dC5Db25zdW1lciByZWZlcmVuY2VzIENvbnRleHQpIHRvXG4gIC8vIHJlZHVjZSBzaXplIGFuZCBvdmVyaGVhZC4gVGhlIHNlcGFyYXRlIG9iamVjdCByZWZlcmVuY2VzIGNvbnRleHQgdmlhXG4gIC8vIGEgcHJvcGVydHkgY2FsbGVkIFwiX2NvbnRleHRcIiwgd2hpY2ggYWxzbyBnaXZlcyB1cyB0aGUgYWJpbGl0eSB0byBjaGVja1xuICAvLyBpbiBERVYgbW9kZSBpZiB0aGlzIHByb3BlcnR5IGV4aXN0cyBvciBub3QgYW5kIHdhcm4gaWYgaXQgZG9lcyBub3QuXG5cbiAge1xuICAgIGlmIChjb250ZXh0Ll9jb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFRoaXMgbWF5IGJlIGJlY2F1c2UgaXQncyBhIENvbnRleHQgKHJhdGhlciB0aGFuIGEgQ29uc3VtZXIpLlxuICAgICAgLy8gT3IgaXQgbWF5IGJlIGJlY2F1c2UgaXQncyBvbGRlciBSZWFjdCB3aGVyZSB0aGV5J3JlIHRoZSBzYW1lIHRoaW5nLlxuICAgICAgLy8gV2Ugb25seSB3YW50IHRvIHdhcm4gaWYgd2UncmUgc3VyZSBpdCdzIGEgbmV3IFJlYWN0LlxuICAgICAgaWYgKGNvbnRleHQgIT09IGNvbnRleHQuQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIpIHtcbiAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29udGV4dEFzQ29uc3VtZXIgPSB0cnVlO1xuXG4gICAgICAgICAgZXJyb3IoJ1JlbmRlcmluZyA8Q29udGV4dD4gZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICcgKyAnYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIHJlbmRlciA8Q29udGV4dC5Db25zdW1lcj4gaW5zdGVhZD8nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZXh0ID0gY29udGV4dC5fY29udGV4dDtcbiAgICB9XG4gIH1cblxuICB2YXIgbmV3UHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gIHZhciByZW5kZXIgPSBuZXdQcm9wcy5jaGlsZHJlbjtcblxuICB7XG4gICAgaWYgKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCdBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgJyArIFwidGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCBcIiArICd0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgJyArICdpcyBubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgYXJvdW5kIGl0LicpO1xuICAgIH1cbiAgfVxuXG4gIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gIHZhciBuZXdWYWx1ZSA9IHJlYWRDb250ZXh0KGNvbnRleHQsIG5ld1Byb3BzLnVuc3RhYmxlX29ic2VydmVkQml0cyk7XG4gIHZhciBuZXdDaGlsZHJlbjtcblxuICB7XG4gICAgUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgc2V0SXNSZW5kZXJpbmcodHJ1ZSk7XG4gICAgbmV3Q2hpbGRyZW4gPSByZW5kZXIobmV3VmFsdWUpO1xuICAgIHNldElzUmVuZGVyaW5nKGZhbHNlKTtcbiAgfSAvLyBSZWFjdCBEZXZUb29scyByZWFkcyB0aGlzIGZsYWcuXG5cblxuICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBQZXJmb3JtZWRXb3JrO1xuICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xufVxuXG5mdW5jdGlvbiBtYXJrV29ya0luUHJvZ3Jlc3NSZWNlaXZlZFVwZGF0ZSgpIHtcbiAgZGlkUmVjZWl2ZVVwZGF0ZSA9IHRydWU7XG59XG5cbmZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgLy8gUmV1c2UgcHJldmlvdXMgZGVwZW5kZW5jaWVzXG4gICAgd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gIH1cblxuICB7XG4gICAgLy8gRG9uJ3QgdXBkYXRlIFwiYmFzZVwiIHJlbmRlciB0aW1lcyBmb3IgYmFpbG91dHMuXG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmcoKTtcbiAgfVxuXG4gIG1hcmtTa2lwcGVkVXBkYXRlTGFuZXMod29ya0luUHJvZ3Jlc3MubGFuZXMpOyAvLyBDaGVjayBpZiB0aGUgY2hpbGRyZW4gaGF2ZSBhbnkgcGVuZGluZyB3b3JrLlxuXG4gIGlmICghaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpIHtcbiAgICAvLyBUaGUgY2hpbGRyZW4gZG9uJ3QgaGF2ZSBhbnkgd29yayBlaXRoZXIuIFdlIGNhbiBza2lwIHRoZW0uXG4gICAgLy8gVE9ETzogT25jZSB3ZSBhZGQgYmFjayByZXN1bWluZywgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjaGlsZHJlbiBhcmVcbiAgICAvLyBhIHdvcmstaW4tcHJvZ3Jlc3Mgc2V0LiBJZiBzbywgd2UgbmVlZCB0byB0cmFuc2ZlciB0aGVpciBlZmZlY3RzLlxuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoaXMgZmliZXIgZG9lc24ndCBoYXZlIHdvcmssIGJ1dCBpdHMgc3VidHJlZSBkb2VzLiBDbG9uZSB0aGUgY2hpbGRcbiAgICAvLyBmaWJlcnMgYW5kIGNvbnRpbnVlLlxuICAgIGNsb25lQ2hpbGRGaWJlcnMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdW50RmliZXIoY3VycmVudCwgb2xkV29ya0luUHJvZ3Jlc3MsIG5ld1dvcmtJblByb2dyZXNzKSB7XG4gIHtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBvbGRXb3JrSW5Qcm9ncmVzcy5yZXR1cm47XG5cbiAgICBpZiAocmV0dXJuRmliZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHN3YXAgdGhlIHJvb3QgZmliZXIuJyk7XG4gICAgfSAvLyBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCBjdXJyZW50LlxuICAgIC8vIEl0IHdpbGwgZ2V0IGRlbGV0ZWQuXG5cblxuICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICBvbGRXb3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUgPSBudWxsOyAvLyBDb25uZWN0IHRvIHRoZSBuZXcgdHJlZS5cblxuICAgIG5ld1dvcmtJblByb2dyZXNzLmluZGV4ID0gb2xkV29ya0luUHJvZ3Jlc3MuaW5kZXg7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3Muc2libGluZyA9IG9sZFdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MucmV0dXJuID0gb2xkV29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIG5ld1dvcmtJblByb2dyZXNzLnJlZiA9IG9sZFdvcmtJblByb2dyZXNzLnJlZjsgLy8gUmVwbGFjZSB0aGUgY2hpbGQvc2libGluZyBwb2ludGVycyBhYm92ZSBpdC5cblxuICAgIGlmIChvbGRXb3JrSW5Qcm9ncmVzcyA9PT0gcmV0dXJuRmliZXIuY2hpbGQpIHtcbiAgICAgIHJldHVybkZpYmVyLmNoaWxkID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwcmV2U2libGluZyA9IHJldHVybkZpYmVyLmNoaWxkO1xuXG4gICAgICBpZiAocHJldlNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBwYXJlbnQgdG8gaGF2ZSBhIGNoaWxkLicpO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocHJldlNpYmxpbmcuc2libGluZyAhPT0gb2xkV29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgcHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nO1xuXG4gICAgICAgIGlmIChwcmV2U2libGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gZmluZCB0aGUgcHJldmlvdXMgc2libGluZy4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBwcmV2U2libGluZy5zaWJsaW5nID0gbmV3V29ya0luUHJvZ3Jlc3M7XG4gICAgfSAvLyBEZWxldGUgdGhlIG9sZCBmaWJlciBhbmQgcGxhY2UgdGhlIG5ldyBvbmUuXG4gICAgLy8gU2luY2UgdGhlIG9sZCBmaWJlciBpcyBkaXNjb25uZWN0ZWQsIHdlIGhhdmUgdG8gc2NoZWR1bGUgaXQgbWFudWFsbHkuXG5cblxuICAgIHZhciBsYXN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdDtcblxuICAgIGlmIChsYXN0ICE9PSBudWxsKSB7XG4gICAgICBsYXN0Lm5leHRFZmZlY3QgPSBjdXJyZW50O1xuICAgICAgcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgY3VycmVudC5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICBjdXJyZW50LmZsYWdzID0gRGVsZXRpb247XG4gICAgbmV3V29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gUGxhY2VtZW50OyAvLyBSZXN0YXJ0IHdvcmsgZnJvbSB0aGUgbmV3IGZpYmVyLlxuXG4gICAgcmV0dXJuIG5ld1dvcmtJblByb2dyZXNzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgdmFyIHVwZGF0ZUxhbmVzID0gd29ya0luUHJvZ3Jlc3MubGFuZXM7XG5cbiAge1xuICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgJiYgY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB3aWxsIHJlc3RhcnQgdGhlIGJlZ2luIHBoYXNlIHdpdGggYSBuZXcgZmliZXIuXG4gICAgICByZXR1cm4gcmVtb3VudEZpYmVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3Mua2V5LCB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8IG51bGwsIHdvcmtJblByb2dyZXNzLm1vZGUsIHdvcmtJblByb2dyZXNzLmxhbmVzKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzICE9PSBuZXdQcm9wcyB8fCBoYXNDb250ZXh0Q2hhbmdlZCgpIHx8ICggLy8gRm9yY2UgYSByZS1yZW5kZXIgaWYgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZWQgZHVlIHRvIGhvdCByZWxvYWQ6XG4gICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZSApKSB7XG4gICAgICAvLyBJZiBwcm9wcyBvciBjb250ZXh0IGNoYW5nZWQsIG1hcmsgdGhlIGZpYmVyIGFzIGhhdmluZyBwZXJmb3JtZWQgd29yay5cbiAgICAgIC8vIFRoaXMgbWF5IGJlIHVuc2V0IGlmIHRoZSBwcm9wcyBhcmUgZGV0ZXJtaW5lZCB0byBiZSBlcXVhbCBsYXRlciAobWVtbykuXG4gICAgICBkaWRSZWNlaXZlVXBkYXRlID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB1cGRhdGVMYW5lcykpIHtcbiAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTsgLy8gVGhpcyBmaWJlciBkb2VzIG5vdCBoYXZlIGFueSBwZW5kaW5nIHdvcmsuIEJhaWxvdXQgd2l0aG91dCBlbnRlcmluZ1xuICAgICAgLy8gdGhlIGJlZ2luIHBoYXNlLiBUaGVyZSdzIHN0aWxsIHNvbWUgYm9va2tlZXBpbmcgd2UgdGhhdCBuZWVkcyB0byBiZSBkb25lXG4gICAgICAvLyBpbiB0aGlzIG9wdGltaXplZCBwYXRoLCBtb3N0bHkgcHVzaGluZyBzdHVmZiBvbnRvIHRoZSBzdGFjay5cblxuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAgICBwdXNoSG9zdFJvb3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICAgICAgaWYgKGlzQ29udGV4dFByb3ZpZGVyKENvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgcHVzaENvbnRleHRQcm92aWRlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgcHVzaEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIENvbnRleHRQcm92aWRlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgbmV3VmFsdWUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnZhbHVlO1xuICAgICAgICAgICAgcHVzaFByb3ZpZGVyKHdvcmtJblByb2dyZXNzLCBuZXdWYWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBQcm9maWxlcjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBQcm9maWxlciBzaG91bGQgb25seSBjYWxsIG9uUmVuZGVyIHdoZW4gb25lIG9mIGl0cyBkZXNjZW5kYW50cyBhY3R1YWxseSByZW5kZXJlZC5cbiAgICAgICAgICAgIHZhciBoYXNDaGlsZFdvcmsgPSBpbmNsdWRlc1NvbWVMYW5lKHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKTtcblxuICAgICAgICAgICAgaWYgKGhhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBVcGRhdGU7XG4gICAgICAgICAgICB9IC8vIFJlc2V0IGVmZmVjdCBkdXJhdGlvbnMgZm9yIHRoZSBuZXh0IGV2ZW50dWFsIGVmZmVjdCBwaGFzZS5cbiAgICAgICAgICAgIC8vIFRoZXNlIGFyZSByZXNldCBkdXJpbmcgcmVuZGVyIHRvIGFsbG93IHRoZSBEZXZUb29scyBjb21taXQgaG9vayBhIGNoYW5jZSB0byByZWFkIHRoZW0sXG5cblxuICAgICAgICAgICAgdmFyIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgICAgICBzdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFN1c3BlbnNlQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHJldHJ5IHRoZSBwcmltYXJ5IGNoaWxkcmVuLCBvciB0byBza2lwIG92ZXIgaXQgYW5kXG4gICAgICAgICAgICAgIC8vIGdvIHN0cmFpZ2h0IHRvIHRoZSBmYWxsYmFjay4gQ2hlY2sgdGhlIHByaW9yaXR5IG9mIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAgIC8vIGNoaWxkIGZyYWdtZW50LlxuXG5cbiAgICAgICAgICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgIHZhciBwcmltYXJ5Q2hpbGRMYW5lcyA9IHByaW1hcnlDaGlsZEZyYWdtZW50LmNoaWxkTGFuZXM7XG5cbiAgICAgICAgICAgICAgaWYgKGluY2x1ZGVzU29tZUxhbmUocmVuZGVyTGFuZXMsIHByaW1hcnlDaGlsZExhbmVzKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBwcmltYXJ5IGNoaWxkcmVuIGhhdmUgcGVuZGluZyB3b3JrLiBVc2UgdGhlIG5vcm1hbCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gdG8gYXR0ZW1wdCB0byByZW5kZXIgdGhlIHByaW1hcnkgY2hpbGRyZW4gYWdhaW4uXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHByaW1hcnkgY2hpbGQgZnJhZ21lbnQgZG9lcyBub3QgaGF2ZSBwZW5kaW5nIHdvcmsgbWFya2VkXG4gICAgICAgICAgICAgICAgLy8gb24gaXRcbiAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzZXREZWZhdWx0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKTsgLy8gVGhlIHByaW1hcnkgY2hpbGRyZW4gZG8gbm90IGhhdmUgcGVuZGluZyB3b3JrIHdpdGggc3VmZmljaWVudFxuICAgICAgICAgICAgICAgIC8vIHByaW9yaXR5LiBCYWlsb3V0LlxuXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvLyBUaGUgZmFsbGJhY2sgY2hpbGRyZW4gaGF2ZSBwZW5kaW5nIHdvcmsuIFNraXAgb3ZlciB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIHByaW1hcnkgY2hpbGRyZW4gYW5kIHdvcmsgb24gdGhlIGZhbGxiYWNrLlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YXIgZGlkU3VzcGVuZEJlZm9yZSA9IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG5cbiAgICAgICAgICAgIHZhciBfaGFzQ2hpbGRXb3JrID0gaW5jbHVkZXNTb21lTGFuZShyZW5kZXJMYW5lcywgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG5cbiAgICAgICAgICAgIGlmIChkaWRTdXNwZW5kQmVmb3JlKSB7XG4gICAgICAgICAgICAgIGlmIChfaGFzQ2hpbGRXb3JrKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc29tZXRoaW5nIHdhcyBpbiBmYWxsYmFjayBzdGF0ZSBsYXN0IHRpbWUsIGFuZCB3ZSBoYXZlIGFsbCB0aGVcbiAgICAgICAgICAgICAgICAvLyBzYW1lIGNoaWxkcmVuIHRoZW4gd2UncmUgc3RpbGwgaW4gcHJvZ3Jlc3NpdmUgbG9hZGluZyBzdGF0ZS5cbiAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgbWlnaHQgZ2V0IHVuYmxvY2tlZCBieSBzdGF0ZSB1cGRhdGVzIG9yIHJldHJpZXMgaW4gdGhlXG4gICAgICAgICAgICAgICAgLy8gdHJlZSB3aGljaCB3aWxsIGFmZmVjdCB0aGUgdGFpbC4gU28gd2UgbmVlZCB0byB1c2UgdGhlIG5vcm1hbFxuICAgICAgICAgICAgICAgIC8vIHBhdGggdG8gY29tcHV0ZSB0aGUgY29ycmVjdCB0YWlsLlxuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgfSAvLyBJZiBub25lIG9mIHRoZSBjaGlsZHJlbiBoYWQgYW55IHdvcmssIHRoYXQgbWVhbnMgdGhhdCBub25lIG9mXG4gICAgICAgICAgICAgIC8vIHRoZW0gZ290IHJldHJpZWQgc28gdGhleSdsbCBzdGlsbCBiZSBibG9ja2VkIGluIHRoZSBzYW1lIHdheVxuICAgICAgICAgICAgICAvLyBhcyBiZWZvcmUuIFdlIGNhbiBmYXN0IGJhaWwgb3V0LlxuXG5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgIH0gLy8gSWYgbm90aGluZyBzdXNwZW5kZWQgYmVmb3JlIGFuZCB3ZSdyZSByZW5kZXJpbmcgdGhlIHNhbWUgY2hpbGRyZW4sXG4gICAgICAgICAgICAvLyB0aGVuIHRoZSB0YWlsIGRvZXNuJ3QgbWF0dGVyLiBBbnl0aGluZyBuZXcgdGhhdCBzdXNwZW5kcyB3aWxsIHdvcmtcbiAgICAgICAgICAgIC8vIGluIHRoZSBcInRvZ2V0aGVyXCIgbW9kZSwgc28gd2UgY2FuIGNvbnRpbnVlIGZyb20gdGhlIHN0YXRlIHdlIGhhZC5cblxuXG4gICAgICAgICAgICB2YXIgcmVuZGVyU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuXG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gUmVzZXQgdG8gdGhlIFwidG9nZXRoZXJcIiBtb2RlIGluIGNhc2Ugd2UndmUgc3RhcnRlZCBhIGRpZmZlcmVudFxuICAgICAgICAgICAgICAvLyB1cGRhdGUgaW4gdGhlIHBhc3QgYnV0IGRpZG4ndCBjb21wbGV0ZSBpdC5cbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nID0gbnVsbDtcbiAgICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3RFZmZlY3QgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAoX2hhc0NoaWxkV29yaykge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoaWxkcmVuIGhhZCBhbnkgd29yaywgdGhhdCBtZWFucyB0aGF0IG5vbmUgb2ZcbiAgICAgICAgICAgICAgLy8gdGhlbSBnb3QgcmV0cmllZCBzbyB0aGV5J2xsIHN0aWxsIGJlIGJsb2NrZWQgaW4gdGhlIHNhbWUgd2F5XG4gICAgICAgICAgICAgIC8vIGFzIGJlZm9yZS4gV2UgY2FuIGZhc3QgYmFpbCBvdXQuXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICAgICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiB0aGUgdHJlZSBzdGlsbCBuZWVkcyB0byBiZSBkZWZlcnJlZC4gVGhpcyBpc1xuICAgICAgICAgICAgLy8gYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgbG9naWMgdXNlZCBpbiB0aGUgbm9ybWFsIHVwZGF0ZSBwYXRoLFxuICAgICAgICAgICAgLy8gc28gd2UnbGwganVzdCBlbnRlciB0aGF0LiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHdlJ2xsIGJhaWwgb3V0XG4gICAgICAgICAgICAvLyBhdCB0aGUgbmV4dCBsZXZlbCBpbnN0ZWFkIG9mIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBjaGlsZCBwcm9wc1xuICAgICAgICAgICAgLy8gaGF2ZSBub3QgY2hhbmdlZC4gV2hpY2ggaXMgZmluZS5cbiAgICAgICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCByZWZhY3RvciBgYmVnaW5Xb3JrYCB0byBzcGxpdCB0aGUgYmFpbG91dFxuICAgICAgICAgICAgLy8gcGF0aCBmcm9tIHRoZSBub3JtYWwgcGF0aC4gSSdtIHRlbXB0ZWQgdG8gZG8gYSBsYWJlbGVkIGJyZWFrIGhlcmVcbiAgICAgICAgICAgIC8vIGJ1dCBJIHdvbid0IDopXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IE5vTGFuZXM7XG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlT2Zmc2NyZWVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoKGN1cnJlbnQuZmxhZ3MgJiBGb3JjZVVwZGF0ZUZvckxlZ2FjeVN1c3BlbnNlKSAhPT0gTm9GbGFncykge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBtb2RlLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTkyMTYuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQW4gdXBkYXRlIHdhcyBzY2hlZHVsZWQgb24gdGhpcyBmaWJlciwgYnV0IHRoZXJlIGFyZSBubyBuZXcgcHJvcHNcbiAgICAgICAgLy8gbm9yIGxlZ2FjeSBjb250ZXh0LiBTZXQgdGhpcyB0byBmYWxzZS4gSWYgYW4gdXBkYXRlIHF1ZXVlIG9yIGNvbnRleHRcbiAgICAgICAgLy8gY29uc3VtZXIgcHJvZHVjZXMgYSBjaGFuZ2VkIHZhbHVlLCBpdCB3aWxsIHNldCB0aGlzIHRvIHRydWUuIE90aGVyd2lzZSxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCB3aWxsIGFzc3VtZSB0aGUgY2hpbGRyZW4gaGF2ZSBub3QgY2hhbmdlZCBhbmQgYmFpbCBvdXQuXG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGlkUmVjZWl2ZVVwZGF0ZSA9IGZhbHNlO1xuICB9IC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNsZWFyIHBlbmRpbmcgdXBkYXRlIHByaW9yaXR5LlxuICAvLyBUT0RPOiBUaGlzIGFzc3VtZXMgdGhhdCB3ZSdyZSBhYm91dCB0byBldmFsdWF0ZSB0aGUgY29tcG9uZW50IGFuZCBwcm9jZXNzXG4gIC8vIHRoZSB1cGRhdGUgcXVldWUuIEhvd2V2ZXIsIHRoZXJlJ3MgYW4gZXhjZXB0aW9uOiBTaW1wbGVNZW1vQ29tcG9uZW50XG4gIC8vIHNvbWV0aW1lcyBiYWlscyBvdXQgbGF0ZXIgaW4gdGhlIGJlZ2luIHBoYXNlLiBUaGlzIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZFxuICAvLyBtb3ZlIHRoaXMgYXNzaWdubWVudCBvdXQgb2YgdGhlIGNvbW1vbiBwYXRoIGFuZCBpbnRvIGVhY2ggYnJhbmNoLlxuXG5cbiAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBOb0xhbmVzO1xuXG4gIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgY2FzZSBJbmRldGVybWluYXRlQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gbW91bnRJbmRldGVybWluYXRlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCB3b3JrSW5Qcm9ncmVzcy50eXBlLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBlbGVtZW50VHlwZSA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlO1xuICAgICAgICByZXR1cm4gbW91bnRMYXp5Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBlbGVtZW50VHlwZSwgdXBkYXRlTGFuZXMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgdmFyIHJlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudCA/IHVucmVzb2x2ZWRQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoX0NvbXBvbmVudCwgdW5yZXNvbHZlZFByb3BzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUZ1bmN0aW9uQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50LCByZXNvbHZlZFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgX0NvbXBvbmVudDIgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSA9PT0gX0NvbXBvbmVudDIgPyBfdW5yZXNvbHZlZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhfQ29tcG9uZW50MiwgX3VucmVzb2x2ZWRQcm9wcyk7XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MiwgX3Jlc29sdmVkUHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICByZXR1cm4gdXBkYXRlSG9zdFJvb3QoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHJldHVybiB1cGRhdGVIb3N0Q29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIEhvc3RUZXh0OlxuICAgICAgcmV0dXJuIHVwZGF0ZUhvc3RUZXh0KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHJldHVybiB1cGRhdGVQb3J0YWxDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgIHtcbiAgICAgICAgdmFyIHR5cGUgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgX3VucmVzb2x2ZWRQcm9wczIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG5cbiAgICAgICAgdmFyIF9yZXNvbHZlZFByb3BzMiA9IHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID09PSB0eXBlID8gX3VucmVzb2x2ZWRQcm9wczIgOiByZXNvbHZlRGVmYXVsdFByb3BzKHR5cGUsIF91bnJlc29sdmVkUHJvcHMyKTtcblxuICAgICAgICByZXR1cm4gdXBkYXRlRm9yd2FyZFJlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgX3Jlc29sdmVkUHJvcHMyLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIEZyYWdtZW50OlxuICAgICAgcmV0dXJuIHVwZGF0ZUZyYWdtZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIE1vZGU6XG4gICAgICByZXR1cm4gdXBkYXRlTW9kZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHJldHVybiB1cGRhdGVQcm9maWxlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICByZXR1cm4gdXBkYXRlQ29udGV4dFByb3ZpZGVyKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG5cbiAgICBjYXNlIENvbnRleHRDb25zdW1lcjpcbiAgICAgIHJldHVybiB1cGRhdGVDb250ZXh0Q29uc3VtZXIoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcblxuICAgIGNhc2UgTWVtb0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF90eXBlMiA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzMyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wczsgLy8gUmVzb2x2ZSBvdXRlciBwcm9wcyBmaXJzdCwgdGhlbiByZXNvbHZlIGlubmVyIHByb3BzLlxuXG4gICAgICAgIHZhciBfcmVzb2x2ZWRQcm9wczMgPSByZXNvbHZlRGVmYXVsdFByb3BzKF90eXBlMiwgX3VucmVzb2x2ZWRQcm9wczMpO1xuXG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MudHlwZSAhPT0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgIHZhciBvdXRlclByb3BUeXBlcyA9IF90eXBlMi5wcm9wVHlwZXM7XG5cbiAgICAgICAgICAgIGlmIChvdXRlclByb3BUeXBlcykge1xuICAgICAgICAgICAgICBjaGVja1Byb3BUeXBlcyhvdXRlclByb3BUeXBlcywgX3Jlc29sdmVkUHJvcHMzLCAvLyBSZXNvbHZlZCBmb3Igb3V0ZXIgb25seVxuICAgICAgICAgICAgICAncHJvcCcsIGdldENvbXBvbmVudE5hbWUoX3R5cGUyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3Jlc29sdmVkUHJvcHMzID0gcmVzb2x2ZURlZmF1bHRQcm9wcyhfdHlwZTIudHlwZSwgX3Jlc29sdmVkUHJvcHMzKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIF90eXBlMiwgX3Jlc29sdmVkUHJvcHMzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLCB1cGRhdGVMYW5lcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBfQ29tcG9uZW50MyA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgIHZhciBfdW5yZXNvbHZlZFByb3BzNCA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICAgICAgICB2YXIgX3Jlc29sdmVkUHJvcHM0ID0gd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPT09IF9Db21wb25lbnQzID8gX3VucmVzb2x2ZWRQcm9wczQgOiByZXNvbHZlRGVmYXVsdFByb3BzKF9Db21wb25lbnQzLCBfdW5yZXNvbHZlZFByb3BzNCk7XG5cbiAgICAgICAgcmV0dXJuIG1vdW50SW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBfQ29tcG9uZW50MywgX3Jlc29sdmVkUHJvcHM0LCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG5cbiAgICBjYXNlIFN1c3BlbnNlTGlzdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN1c3BlbnNlTGlzdENvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgIH1cblxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICByZXR1cm4gdXBkYXRlTGVnYWN5SGlkZGVuQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7XG4gICAgICB9XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVW5rbm93biB1bml0IG9mIHdvcmsgdGFnIChcIiArIHdvcmtJblByb2dyZXNzLnRhZyArIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gIC8vIFRhZyB0aGUgZmliZXIgd2l0aCBhbiB1cGRhdGUgZWZmZWN0LiBUaGlzIHR1cm5zIGEgUGxhY2VtZW50IGludG9cbiAgLy8gYSBQbGFjZW1lbnRBbmRVcGRhdGUuXG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbn1cblxuZnVuY3Rpb24gbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKSB7XG4gIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFJlZjtcbn1cblxudmFyIGFwcGVuZEFsbENoaWxkcmVuO1xudmFyIHVwZGF0ZUhvc3RDb250YWluZXI7XG52YXIgdXBkYXRlSG9zdENvbXBvbmVudCQxO1xudmFyIHVwZGF0ZUhvc3RUZXh0JDE7XG5cbntcbiAgLy8gTXV0YXRpb24gbW9kZVxuICBhcHBlbmRBbGxDaGlsZHJlbiA9IGZ1bmN0aW9uIChwYXJlbnQsIHdvcmtJblByb2dyZXNzLCBuZWVkc1Zpc2liaWxpdHlUb2dnbGUsIGlzSGlkZGVuKSB7XG4gICAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgY3JlYXRlZCBidXQgd2UgbmVlZCByZWN1cnNlIGRvd24gaXRzXG4gICAgLy8gY2hpbGRyZW4gdG8gZmluZCBhbGwgdGhlIHRlcm1pbmFsIG5vZGVzLlxuICAgIHZhciBub2RlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG5cbiAgICB3aGlsZSAobm9kZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50IHx8IG5vZGUudGFnID09PSBIb3N0VGV4dCkge1xuICAgICAgICBhcHBlbmRJbml0aWFsQ2hpbGQocGFyZW50LCBub2RlLnN0YXRlTm9kZSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUudGFnID09PSBIb3N0UG9ydGFsKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsIHx8IG5vZGUucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICB9XG4gIH07XG5cbiAgdXBkYXRlSG9zdENvbnRhaW5lciA9IGZ1bmN0aW9uICh3b3JrSW5Qcm9ncmVzcykgey8vIE5vb3BcbiAgfTtcblxuICB1cGRhdGVIb3N0Q29tcG9uZW50JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpIHtcbiAgICAvLyBJZiB3ZSBoYXZlIGFuIGFsdGVybmF0ZSwgdGhhdCBtZWFucyB0aGlzIGlzIGFuIHVwZGF0ZSBhbmQgd2UgbmVlZCB0b1xuICAgIC8vIHNjaGVkdWxlIGEgc2lkZS1lZmZlY3QgdG8gZG8gdGhlIHVwZGF0ZXMuXG4gICAgdmFyIG9sZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuXG4gICAgaWYgKG9sZFByb3BzID09PSBuZXdQcm9wcykge1xuICAgICAgLy8gSW4gbXV0YXRpb24gbW9kZSwgdGhpcyBpcyBzdWZmaWNpZW50IGZvciBhIGJhaWxvdXQgYmVjYXVzZVxuICAgICAgLy8gd2Ugd29uJ3QgdG91Y2ggdGhpcyBub2RlIGV2ZW4gaWYgY2hpbGRyZW4gY2hhbmdlZC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGdldCB1cGRhdGVkIGJlY2F1c2Ugb25lIG9mIG91ciBjaGlsZHJlbiB1cGRhdGVkLCB3ZSBkb24ndFxuICAgIC8vIGhhdmUgbmV3UHJvcHMgc28gd2UnbGwgaGF2ZSB0byByZXVzZSB0aGVtLlxuICAgIC8vIFRPRE86IFNwbGl0IHRoZSB1cGRhdGUgQVBJIGFzIHNlcGFyYXRlIGZvciB0aGUgcHJvcHMgdnMuIGNoaWxkcmVuLlxuICAgIC8vIEV2ZW4gYmV0dGVyIHdvdWxkIGJlIGlmIGNoaWxkcmVuIHdlcmVuJ3Qgc3BlY2lhbCBjYXNlZCBhdCBhbGwgdGhvLlxuXG5cbiAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IEV4cGVyaWVuY2luZyBhbiBlcnJvciB3aGVyZSBvbGRQcm9wcyBpcyBudWxsLiBTdWdnZXN0cyBhIGhvc3RcbiAgICAvLyBjb21wb25lbnQgaXMgaGl0dGluZyB0aGUgcmVzdW1lIHBhdGguIEZpZ3VyZSBvdXQgd2h5LiBQb3NzaWJseVxuICAgIC8vIHJlbGF0ZWQgdG8gYGhpZGRlbmAuXG5cbiAgICB2YXIgdXBkYXRlUGF5bG9hZCA9IHByZXBhcmVVcGRhdGUoaW5zdGFuY2UsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcywgcm9vdENvbnRhaW5lckluc3RhbmNlLCBjdXJyZW50SG9zdENvbnRleHQpOyAvLyBUT0RPOiBUeXBlIHRoaXMgc3BlY2lmaWMgdG8gdGhpcyB0eXBlIG9mIGNvbXBvbmVudC5cblxuICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gdXBkYXRlUGF5bG9hZDsgLy8gSWYgdGhlIHVwZGF0ZSBwYXlsb2FkIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgY2hhbmdlIG9yIGlmIHRoZXJlXG4gICAgLy8gaXMgYSBuZXcgcmVmIHdlIG1hcmsgdGhpcyBhcyBhbiB1cGRhdGUuIEFsbCB0aGUgd29yayBpcyBkb25lIGluIGNvbW1pdFdvcmsuXG5cbiAgICBpZiAodXBkYXRlUGF5bG9hZCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xuXG4gIHVwZGF0ZUhvc3RUZXh0JDEgPSBmdW5jdGlvbiAoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG9sZFRleHQsIG5ld1RleHQpIHtcbiAgICAvLyBJZiB0aGUgdGV4dCBkaWZmZXJzLCBtYXJrIGl0IGFzIGFuIHVwZGF0ZS4gQWxsIHRoZSB3b3JrIGluIGRvbmUgaW4gY29tbWl0V29yay5cbiAgICBpZiAob2xkVGV4dCAhPT0gbmV3VGV4dCkge1xuICAgICAgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjaykge1xuICBpZiAoZ2V0SXNIeWRyYXRpbmcoKSkge1xuICAgIC8vIElmIHdlJ3JlIGh5ZHJhdGluZywgd2Ugc2hvdWxkIGNvbnN1bWUgYXMgbWFueSBpdGVtcyBhcyB3ZSBjYW5cbiAgICAvLyBzbyB3ZSBkb24ndCBsZWF2ZSBhbnkgYmVoaW5kLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN3aXRjaCAocmVuZGVyU3RhdGUudGFpbE1vZGUpIHtcbiAgICBjYXNlICdoaWRkZW4nOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIHRhaWxOb2RlID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgdmFyIGxhc3RUYWlsTm9kZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKHRhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKHRhaWxOb2RlLmFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGFzdFRhaWxOb2RlID0gdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGFpbE5vZGUgPSB0YWlsTm9kZS5zaWJsaW5nO1xuICAgICAgICB9IC8vIE5leHQgd2UncmUgc2ltcGx5IGdvaW5nIHRvIGRlbGV0ZSBhbGwgaW5zZXJ0aW9ucyBhZnRlciB0aGVcbiAgICAgICAgLy8gbGFzdCByZW5kZXJlZCBpdGVtLlxuXG5cbiAgICAgICAgaWYgKGxhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGV0YWNoIHRoZSBpbnNlcnRpb24gYWZ0ZXIgdGhlIGxhc3Qgbm9kZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgICAgLy8gaW5zZXJ0ZWQuXG4gICAgICAgICAgbGFzdFRhaWxOb2RlLnNpYmxpbmcgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlICdjb2xsYXBzZWQnOlxuICAgICAge1xuICAgICAgICAvLyBBbnkgaW5zZXJ0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSB0YWlsIGxpc3QgYWZ0ZXIgdGhpcyBwb2ludFxuICAgICAgICAvLyBzaG91bGQgYmUgaW52aXNpYmxlLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBtb3VudGVkIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gYW55dGhpbmcgYmVmb3JlIHRoZW0gYXJlIG5vdCBjb25zaWRlcmVkIGZvciBjb2xsYXBzaW5nLlxuICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSB3aG9sZSB0YWlsIHRvIGZpbmQgaWZcbiAgICAgICAgLy8gdGhlcmUgYXJlIGFueS5cbiAgICAgICAgdmFyIF90YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgIHZhciBfbGFzdFRhaWxOb2RlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoX3RhaWxOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKF90YWlsTm9kZS5hbHRlcm5hdGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIF9sYXN0VGFpbE5vZGUgPSBfdGFpbE5vZGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RhaWxOb2RlID0gX3RhaWxOb2RlLnNpYmxpbmc7XG4gICAgICAgIH0gLy8gTmV4dCB3ZSdyZSBzaW1wbHkgZ29pbmcgdG8gZGVsZXRlIGFsbCBpbnNlcnRpb25zIGFmdGVyIHRoZVxuICAgICAgICAvLyBsYXN0IHJlbmRlcmVkIGl0ZW0uXG5cblxuICAgICAgICBpZiAoX2xhc3RUYWlsTm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIEFsbCByZW1haW5pbmcgaXRlbXMgaW4gdGhlIHRhaWwgYXJlIGluc2VydGlvbnMuXG4gICAgICAgICAgaWYgKCFoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgJiYgcmVuZGVyU3RhdGUudGFpbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gV2Ugc3VzcGVuZGVkIGR1cmluZyB0aGUgaGVhZC4gV2Ugd2FudCB0byBzaG93IGF0IGxlYXN0IG9uZVxuICAgICAgICAgICAgLy8gcm93IGF0IHRoZSB0YWlsLiBTbyB3ZSdsbCBrZWVwIG9uIGFuZCBjdXQgb2ZmIHRoZSByZXN0LlxuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVuZGVyU3RhdGUudGFpbCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIERldGFjaCB0aGUgaW5zZXJ0aW9uIGFmdGVyIHRoZSBsYXN0IG5vZGUgdGhhdCB3YXMgYWxyZWFkeVxuICAgICAgICAgIC8vIGluc2VydGVkLlxuICAgICAgICAgIF9sYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gIHZhciBuZXdQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcblxuICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICBjYXNlIExhenlDb21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgRnJhZ21lbnQ6XG4gICAgY2FzZSBNb2RlOlxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgY2FzZSBDb250ZXh0Q29uc3VtZXI6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RSb290OlxuICAgICAge1xuICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmVzZXRXb3JrSW5Qcm9ncmVzc1ZlcnNpb25zKCk7XG4gICAgICAgIHZhciBmaWJlclJvb3QgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCkge1xuICAgICAgICAgIGZpYmVyUm9vdC5jb250ZXh0ID0gZmliZXJSb290LnBlbmRpbmdDb250ZXh0O1xuICAgICAgICAgIGZpYmVyUm9vdC5wZW5kaW5nQ29udGV4dCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50LmNoaWxkID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gSWYgd2UgaHlkcmF0ZWQsIHBvcCBzbyB0aGF0IHdlIGNhbiBkZWxldGUgYW55IHJlbWFpbmluZyBjaGlsZHJlblxuICAgICAgICAgIC8vIHRoYXQgd2VyZW4ndCBoeWRyYXRlZC5cbiAgICAgICAgICB2YXIgd2FzSHlkcmF0ZWQgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgICBpZiAod2FzSHlkcmF0ZWQpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGh5ZHJhdGVkLCB0aGVuIHdlJ2xsIG5lZWQgdG8gc2NoZWR1bGUgYW4gdXBkYXRlIGZvclxuICAgICAgICAgICAgLy8gdGhlIGNvbW1pdCBzaWRlLWVmZmVjdHMgb24gdGhlIHJvb3QuXG4gICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFmaWJlclJvb3QuaHlkcmF0ZSkge1xuICAgICAgICAgICAgLy8gU2NoZWR1bGUgYW4gZWZmZWN0IHRvIGNsZWFyIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjb21taXQuXG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgUmVhY3QgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgd2l0aCBwcmV2aW91cyBjaGlsZHJlbi5cbiAgICAgICAgICAgIC8vIEl0J3MgYWxzbyBzYWZlIHRvIGRvIGZvciB1cGRhdGVzIHRvbywgYmVjYXVzZSBjdXJyZW50LmNoaWxkIHdvdWxkIG9ubHkgYmUgbnVsbFxuICAgICAgICAgICAgLy8gaWYgdGhlIHByZXZpb3VzIHJlbmRlciB3YXMgbnVsbCAoc28gdGhlIHRoZSBjb250YWluZXIgd291bGQgYWxyZWFkeSBiZSBlbXB0eSkuXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIHJvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG4gICAgICAgIHZhciB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHVwZGF0ZUhvc3RDb21wb25lbnQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgdHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudC5yZWYgIT09IHdvcmtJblByb2dyZXNzLnJlZikge1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cblxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGN1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7IC8vIFRPRE86IE1vdmUgY3JlYXRlSW5zdGFuY2UgdG8gYmVnaW5Xb3JrIGFuZCBrZWVwIGl0IG9uIGEgY29udGV4dFxuICAgICAgICAgIC8vIFwic3RhY2tcIiBhcyB0aGUgcGFyZW50LiBUaGVuIGFwcGVuZCBjaGlsZHJlbiBhcyB3ZSBnbyBpbiBiZWdpbldvcmtcbiAgICAgICAgICAvLyBvciBjb21wbGV0ZVdvcmsgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2Ugd2FudCB0byBhZGQgdGhlbSB0b3AtPmRvd24gb3JcbiAgICAgICAgICAvLyBib3R0b20tPnVwLiBUb3AtPmRvd24gaXMgZmFzdGVyIGluIElFMTEuXG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuXG4gICAgICAgICAgaWYgKF93YXNIeWRyYXRlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIGFuZCBjcmVhdGVJbnN0YW5jZSBzdGVwIGludG8gdGhlIGJlZ2luUGhhc2VcbiAgICAgICAgICAgIC8vIHRvIGNvbnNvbGlkYXRlLlxuICAgICAgICAgICAgaWYgKHByZXBhcmVUb0h5ZHJhdGVIb3N0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0KSkge1xuICAgICAgICAgICAgICAvLyBJZiBjaGFuZ2VzIHRvIHRoZSBoeWRyYXRlZCBub2RlIG5lZWQgdG8gYmUgYXBwbGllZCBhdCB0aGVcbiAgICAgICAgICAgICAgLy8gY29tbWl0LXBoYXNlIHdlIG1hcmsgdGhpcyBhcyBzdWNoLlxuICAgICAgICAgICAgICBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UodHlwZSwgbmV3UHJvcHMsIHJvb3RDb250YWluZXJJbnN0YW5jZSwgY3VycmVudEhvc3RDb250ZXh0LCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBhcHBlbmRBbGxDaGlsZHJlbihpbnN0YW5jZSwgd29ya0luUHJvZ3Jlc3MsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBpbnN0YW5jZTsgLy8gQ2VydGFpbiByZW5kZXJlcnMgcmVxdWlyZSBjb21taXQtdGltZSBlZmZlY3RzIGZvciBpbml0aWFsIG1vdW50LlxuICAgICAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBzdXBwb3J0cyBhdXRvLWZvY3VzIGZvciBjZXJ0YWluIGVsZW1lbnRzKS5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBzdWNoIHJlbmRlcmVycyBnZXQgc2NoZWR1bGVkIGZvciBsYXRlciB3b3JrLlxuXG4gICAgICAgICAgICBpZiAoZmluYWxpemVJbml0aWFsQ2hpbGRyZW4oaW5zdGFuY2UsIHR5cGUsIG5ld1Byb3BzLCByb290Q29udGFpbmVySW5zdGFuY2UpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5yZWYgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcmVmIG9uIGEgaG9zdCBub2RlIHdlIG5lZWQgdG8gc2NoZWR1bGUgYSBjYWxsYmFja1xuICAgICAgICAgICAgbWFya1JlZiQxKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gbmV3UHJvcHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wczsgLy8gSWYgd2UgaGF2ZSBhbiBhbHRlcm5hdGUsIHRoYXQgbWVhbnMgdGhpcyBpcyBhbiB1cGRhdGUgYW5kIHdlIG5lZWRcbiAgICAgICAgICAvLyB0byBzY2hlZHVsZSBhIHNpZGUtZWZmZWN0IHRvIGRvIHRoZSB1cGRhdGVzLlxuXG4gICAgICAgICAgdXBkYXRlSG9zdFRleHQkMShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXdUZXh0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKCEod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICE9PSBudWxsKSkge1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFib3J0IHdvcmsuXG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX3Jvb3RDb250YWluZXJJbnN0YW5jZSA9IGdldFJvb3RIb3N0Q29udGFpbmVyKCk7XG5cbiAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG5cbiAgICAgICAgICB2YXIgX3dhc0h5ZHJhdGVkMiA9IHBvcEh5ZHJhdGlvblN0YXRlKHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICAgIGlmIChfd2FzSHlkcmF0ZWQyKSB7XG4gICAgICAgICAgICBpZiAocHJlcGFyZVRvSHlkcmF0ZUhvc3RUZXh0SW5zdGFuY2Uod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjcmVhdGVUZXh0SW5zdGFuY2UobmV3VGV4dCwgX3Jvb3RDb250YWluZXJJbnN0YW5jZSwgX2N1cnJlbnRIb3N0Q29udGV4dCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgdmFyIG5leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpICE9PSBOb0ZsYWdzKSB7XG4gICAgICAgICAgLy8gU29tZXRoaW5nIHN1c3BlbmRlZC4gUmUtcmVuZGVyIHdpdGggdGhlIGZhbGxiYWNrIGNoaWxkcmVuLlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXM7IC8vIERvIG5vdCByZXNldCB0aGUgZWZmZWN0IGxpc3QuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0RGlkVGltZW91dCA9IG5leHRTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgdmFyIHByZXZEaWRUaW1lb3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy5mYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgcHJldkRpZFRpbWVvdXQgPSBwcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dERpZFRpbWVvdXQgJiYgIXByZXZEaWRUaW1lb3V0KSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBzdWJ0cmVlZSBpcyBydW5uaW5nIGluIGJsb2NraW5nIG1vZGUgd2UgY2FuIHN1c3BlbmQsXG4gICAgICAgICAgLy8gb3RoZXJ3aXNlIHdlIHdvbid0IHN1c3BlbmQuXG4gICAgICAgICAgLy8gVE9ETzogVGhpcyB3aWxsIHN0aWxsIHN1c3BlbmQgYSBzeW5jaHJvbm91cyB0cmVlIGlmIGFueXRoaW5nXG4gICAgICAgICAgLy8gaW4gdGhlIGNvbmN1cnJlbnQgdHJlZSBhbHJlYWR5IHN1c3BlbmRlZCBkdXJpbmcgdGhpcyByZW5kZXIuXG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGtub3duIGJ1Zy5cbiAgICAgICAgICBpZiAoKHdvcmtJblByb2dyZXNzLm1vZGUgJiBCbG9ja2luZ01vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBiYWNrIHRvIHRocm93RXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBpcyB0b28gbGF0ZVxuICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyBhIGxhcmdlIHRyZWUgd2hpY2ggaXMgY29tbW9uIGZvciBpbml0aWFsIGxvYWRzLiBXZVxuICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBpZiB3ZSBzaG91bGQgcmVzdGFydCBhIHJlbmRlciBvciBub3QgdW50aWwgd2UgZ2V0XG4gICAgICAgICAgICAvLyB0aGlzIG1hcmtlciwgYW5kIHRoaXMgaXMgdG9vIGxhdGUuXG4gICAgICAgICAgICAvLyBJZiB0aGlzIHJlbmRlciBhbHJlYWR5IGhhZCBhIHBpbmcgb3IgbG93ZXIgcHJpIHVwZGF0ZXMsXG4gICAgICAgICAgICAvLyBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvIHN1c3BlbmQgd2VcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGltbWVkaWF0ZWx5IHJlc3RhcnQgZnJvbSB3aXRoaW4gdGhyb3dFeGNlcHRpb24uXG4gICAgICAgICAgICB2YXIgaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0ID0gY3VycmVudCA9PT0gbnVsbCAmJiB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzLnVuc3RhYmxlX2F2b2lkVGhpc0ZhbGxiYWNrICE9PSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaGFzSW52aXNpYmxlQ2hpbGRDb250ZXh0IHx8IGhhc1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEludmlzaWJsZVBhcmVudFN1c3BlbnNlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgaW4gYW4gaW52aXNpYmxlIHRyZWUgb3IgYSBuZXcgcmVuZGVyLCB0aGVuIHNob3dpbmdcbiAgICAgICAgICAgICAgLy8gdGhpcyBib3VuZGFyeSBpcyBvay5cbiAgICAgICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIGhpZGUgY29udGVudCBzbyB3ZSBzaG91bGRcbiAgICAgICAgICAgICAgLy8gc3VzcGVuZCBmb3IgbG9uZ2VyIGlmIHBvc3NpYmxlLlxuICAgICAgICAgICAgICByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFRPRE86IE9ubHkgc2NoZWR1bGUgdXBkYXRlcyBpZiB0aGVzZSB2YWx1ZXMgYXJlIG5vbiBlcXVhbCwgaS5lLiBpdCBjaGFuZ2VkLlxuICAgICAgICAgIGlmIChuZXh0RGlkVGltZW91dCB8fCBwcmV2RGlkVGltZW91dCkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBib3VuZGFyeSBqdXN0IHRpbWVkIG91dCwgc2NoZWR1bGUgYW4gZWZmZWN0IHRvIGF0dGFjaCBhXG4gICAgICAgICAgICAvLyByZXRyeSBsaXN0ZW5lciB0byB0aGUgcHJvbWlzZS4gVGhpcyBmbGFnIGlzIGFsc28gdXNlZCB0byBoaWRlIHRoZVxuICAgICAgICAgICAgLy8gcHJpbWFyeSBjaGlsZHJlbi4gSW4gbXV0YXRpb24gbW9kZSwgd2UgYWxzbyBuZWVkIHRoZSBmbGFnIHRvXG4gICAgICAgICAgICAvLyAqdW5oaWRlKiBjaGlsZHJlbiB0aGF0IHdlcmUgcHJldmlvdXNseSBoaWRkZW4sIHNvIGNoZWNrIGlmIHRoaXNcbiAgICAgICAgICAgIC8vIGlzIGN1cnJlbnRseSB0aW1lZCBvdXQsIHRvby5cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHBvcEhvc3RDb250YWluZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgdXBkYXRlSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSBudWxsKSB7XG4gICAgICAgIHByZXBhcmVQb3J0YWxNb3VudCh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICAvLyBQb3AgcHJvdmlkZXIgZmliZXJcbiAgICAgIHBvcFByb3ZpZGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIC8vIFNhbWUgYXMgY2xhc3MgY29tcG9uZW50IGNhc2UuIEkgcHV0IGl0IGRvd24gaGVyZSBzbyB0aGF0IHRoZSB0YWdzIGFyZVxuICAgICAgICAvLyBzZXF1ZW50aWFsIHRvIGVuc3VyZSB0aGlzIHN3aXRjaCBpcyBjb21waWxlZCB0byBhIGp1bXAgdGFibGUuXG4gICAgICAgIHZhciBfQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoX0NvbXBvbmVudCkpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciByZW5kZXJTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlID09PSBudWxsKSB7XG4gICAgICAgICAgLy8gV2UncmUgcnVubmluZyBpbiB0aGUgZGVmYXVsdCwgXCJpbmRlcGVuZGVudFwiIG1vZGUuXG4gICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhpcyBtb2RlLlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZFN1c3BlbmRBbHJlYWR5ID0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgRGlkQ2FwdHVyZSkgIT09IE5vRmxhZ3M7XG4gICAgICAgIHZhciByZW5kZXJlZFRhaWwgPSByZW5kZXJTdGF0ZS5yZW5kZXJpbmc7XG5cbiAgICAgICAgaWYgKHJlbmRlcmVkVGFpbCA9PT0gbnVsbCkge1xuICAgICAgICAgIC8vIFdlIGp1c3QgcmVuZGVyZWQgdGhlIGhlYWQuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgcGFzcy4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIGFueXRoaW5nIGlzIHN0aWxsXG4gICAgICAgICAgICAvLyBzdXNwZW5kZWQgaW4gdGhlIHJlbmRlcmVkIHNldC5cbiAgICAgICAgICAgIC8vIElmIG5ldyBjb250ZW50IHVuc3VzcGVuZGVkLCBidXQgdGhlcmUncyBzdGlsbCBzb21lIGNvbnRlbnQgdGhhdFxuICAgICAgICAgICAgLy8gZGlkbid0LiBUaGVuIHdlIG5lZWQgdG8gZG8gYSBzZWNvbmQgcGFzcyB0aGF0IGZvcmNlcyBldmVyeXRoaW5nXG4gICAgICAgICAgICAvLyB0byBrZWVwIHNob3dpbmcgdGhlaXIgZmFsbGJhY2tzLlxuICAgICAgICAgICAgLy8gV2UgbWlnaHQgYmUgc3VzcGVuZGVkIGlmIHNvbWV0aGluZyBpbiB0aGlzIHJlbmRlciBwYXNzIHN1c3BlbmRlZCwgb3JcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBpbiB0aGUgcHJldmlvdXMgY29tbWl0dGVkIHBhc3Mgc3VzcGVuZGVkLiBPdGhlcndpc2UsXG4gICAgICAgICAgICAvLyB0aGVyZSdzIG5vIGNoYW5jZSBzbyB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGNhbGwgdG9cbiAgICAgICAgICAgIC8vIGZpbmRGaXJzdFN1c3BlbmRlZC5cbiAgICAgICAgICAgIHZhciBjYW5ub3RCZVN1c3BlbmRlZCA9IHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpICYmIChjdXJyZW50ID09PSBudWxsIHx8IChjdXJyZW50LmZsYWdzICYgRGlkQ2FwdHVyZSkgPT09IE5vRmxhZ3MpO1xuXG4gICAgICAgICAgICBpZiAoIWNhbm5vdEJlU3VzcGVuZGVkKSB7XG4gICAgICAgICAgICAgIHZhciByb3cgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcblxuICAgICAgICAgICAgICB3aGlsZSAocm93ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbmRlZCA9IGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN1c3BlbmRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgZmFsc2UpOyAvLyBJZiB0aGlzIGlzIGEgbmV3bHkgc3VzcGVuZGVkIHRyZWUsIGl0IG1pZ2h0IG5vdCBnZXQgY29tbWl0dGVkIGFzXG4gICAgICAgICAgICAgICAgICAvLyBwYXJ0IG9mIHRoZSBzZWNvbmQgcGFzcy4gSW4gdGhhdCBjYXNlIG5vdGhpbmcgd2lsbCBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGl0cyB0aGVubmFibGVzLiBJbnN0ZWFkLCB3ZSdsbCB0cmFuc2ZlciBpdHMgdGhlbm5hYmxlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAgIC8vIFN1c3BlbnNlTGlzdCBzbyB0aGF0IGl0IGNhbiByZXRyeSBpZiB0aGV5IHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBtdWx0aXBsZSBvZiB0aGVzZSBpbiB0aGUgbGlzdCBidXQgc2luY2Ugd2UncmVcbiAgICAgICAgICAgICAgICAgIC8vIGdvaW5nIHRvIHdhaXQgZm9yIGFsbCBvZiB0aGVtIGFueXdheSwgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgICAgICAgICAgICAgICAvLyB3aGljaCBvbmVzIGdldHMgdG8gcGluZy4gSW4gdGhlb3J5IHdlIGNvdWxkIGdldCBjbGV2ZXIgYW5kIGtlZXBcbiAgICAgICAgICAgICAgICAgIC8vIHRyYWNrIG9mIGhvdyBtYW55IGRlcGVuZGVuY2llcyByZW1haW4gYnV0IGl0IGdldHMgdHJpY2t5IGJlY2F1c2VcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtZWFudGltZSwgd2UgY2FuIGFkZC9yZW1vdmUvY2hhbmdlIGl0ZW1zIGFuZCBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAgICAgICAvLyBXZSBtaWdodCBiYWlsIG91dCBvZiB0aGUgbG9vcCBiZWZvcmUgZmluZGluZyBhbnkgYnV0IHRoYXRcbiAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoYXQgbWVhbnMgdGhhdCB0aGUgb3RoZXIgYm91bmRhcmllcyB0aGF0XG4gICAgICAgICAgICAgICAgICAvLyB3ZSBkaWQgZmluZCBhbHJlYWR5IGhhcyB0aGVpciBsaXN0ZW5lcnMgYXR0YWNoZWQuXG5cbiAgICAgICAgICAgICAgICAgIHZhciBuZXdUaGVubmFibGVzID0gc3VzcGVuZGVkLnVwZGF0ZVF1ZXVlO1xuXG4gICAgICAgICAgICAgICAgICBpZiAobmV3VGhlbm5hYmxlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG5ld1RoZW5uYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgICAgIH0gLy8gUmVyZW5kZXIgdGhlIHdob2xlIGxpc3QsIGJ1dCB0aGlzIHRpbWUsIHdlJ2xsIGZvcmNlIGZhbGxiYWNrc1xuICAgICAgICAgICAgICAgICAgLy8gdG8gc3RheSBpbiBwbGFjZS5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCBiZWZvcmUgZG9pbmcgdGhlIHNlY29uZCBwYXNzIHNpbmNlIHRoYXQncyBub3cgaW52YWxpZC5cblxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZXNldCB0aGUgY2hpbGQgZmliZXJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuXG4gICAgICAgICAgICAgICAgICByZXNldENoaWxkRmliZXJzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcyk7IC8vIFNldCB1cCB0aGUgU3VzcGVuc2UgQ29udGV4dCB0byBmb3JjZSBzdXNwZW5zZSBhbmQgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgICAgIC8vIHJlcmVuZGVyIHRoZSBjaGlsZHJlbi5cblxuICAgICAgICAgICAgICAgICAgcHVzaFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc2V0U2hhbGxvd1N1c3BlbnNlQ29udGV4dChzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIEZvcmNlU3VzcGVuc2VGYWxsYmFjaykpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvdyA9IHJvdy5zaWJsaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsICE9PSBudWxsICYmIG5vdygpID4gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgb3VyIENQVSBkZWFkbGluZSBidXQgd2Ugc3RpbGwgaGF2ZSByb3dzXG4gICAgICAgICAgICAgIC8vIGxlZnQgaW4gdGhlIHRhaWwuIFdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlbmRlclxuICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IERpZENhcHR1cmU7XG4gICAgICAgICAgICAgIGRpZFN1c3BlbmRBbHJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKHJlbmRlclN0YXRlLCBmYWxzZSk7IC8vIFNpbmNlIG5vdGhpbmcgYWN0dWFsbHkgc3VzcGVuZGVkLCB0aGVyZSB3aWxsIG5vdGhpbmcgdG8gcGluZyB0aGlzXG4gICAgICAgICAgICAgIC8vIHRvIGdldCBpdCBzdGFydGVkIGJhY2sgdXAgdG8gYXR0ZW1wdCB0aGUgbmV4dCBpdGVtLiBXaGlsZSBpbiB0ZXJtc1xuICAgICAgICAgICAgICAvLyBvZiBwcmlvcml0eSB0aGlzIHdvcmsgaGFzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoaXMgY3VycmVudCByZW5kZXIsXG4gICAgICAgICAgICAgIC8vIGl0J3Mgbm90IHBhcnQgb2YgdGhlIHNhbWUgdHJhbnNpdGlvbiBvbmNlIHRoZSB0cmFuc2l0aW9uIGhhc1xuICAgICAgICAgICAgICAvLyBjb21taXR0ZWQuIElmIGl0J3Mgc3luYywgd2Ugc3RpbGwgd2FudCB0byB5aWVsZCBzbyB0aGF0IGl0IGNhbiBiZVxuICAgICAgICAgICAgICAvLyBwYWludGVkLiBDb25jZXB0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHRoZSBzYW1lIGFzIHBpbmdpbmcuXG4gICAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgYW55IFJldHJ5TGFuZSBldmVuIGlmIGl0J3MgdGhlIG9uZSBjdXJyZW50bHkgcmVuZGVyaW5nXG4gICAgICAgICAgICAgIC8vIHNpbmNlIHdlJ3JlIGxlYXZpbmcgaXQgYmVoaW5kIG9uIHRoaXMgbm9kZS5cblxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IFNvbWVSZXRyeUxhbmU7XG5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hcmtTcGF3bmVkV29yayhTb21lUmV0cnlMYW5lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTtcbiAgICAgICAgICB9IC8vIE5leHQgd2UncmUgZ29pbmcgdG8gcmVuZGVyIHRoZSB0YWlsLlxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQXBwZW5kIHRoZSByZW5kZXJlZCByb3cgdG8gdGhlIGNoaWxkIGxpc3QuXG4gICAgICAgICAgaWYgKCFkaWRTdXNwZW5kQWxyZWFkeSkge1xuICAgICAgICAgICAgdmFyIF9zdXNwZW5kZWQgPSBmaW5kRmlyc3RTdXNwZW5kZWQocmVuZGVyZWRUYWlsKTtcblxuICAgICAgICAgICAgaWYgKF9zdXNwZW5kZWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlOyAvLyBFbnN1cmUgd2UgdHJhbnNmZXIgdGhlIHVwZGF0ZSBxdWV1ZSB0byB0aGUgcGFyZW50IHNvIHRoYXQgaXQgZG9lc24ndFxuICAgICAgICAgICAgICAvLyBnZXQgbG9zdCBpZiB0aGlzIHJvdyBlbmRzIHVwIGRyb3BwZWQgZHVyaW5nIGEgc2Vjb25kIHBhc3MuXG5cbiAgICAgICAgICAgICAgdmFyIF9uZXdUaGVubmFibGVzID0gX3N1c3BlbmRlZC51cGRhdGVRdWV1ZTtcblxuICAgICAgICAgICAgICBpZiAoX25ld1RoZW5uYWJsZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IF9uZXdUaGVubmFibGVzO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IFVwZGF0ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgdHJ1ZSk7IC8vIFRoaXMgbWlnaHQgaGF2ZSBiZWVuIG1vZGlmaWVkLlxuXG4gICAgICAgICAgICAgIGlmIChyZW5kZXJTdGF0ZS50YWlsID09PSBudWxsICYmIHJlbmRlclN0YXRlLnRhaWxNb2RlID09PSAnaGlkZGVuJyAmJiAhcmVuZGVyZWRUYWlsLmFsdGVybmF0ZSAmJiAhZ2V0SXNIeWRyYXRpbmcoKSAvLyBXZSBkb24ndCBjdXQgaXQgaWYgd2UncmUgaHlkcmF0aW5nLlxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIHRoZSByb3cgd2UganVzdCByZW5kZXJlZC5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlZmZlY3QgbGlzdCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgd2UgcmVuZGVyZWQgdGhpc1xuICAgICAgICAgICAgICAgICAgLy8gY2hpbGQuIFRoZSBuZXN0ZWQgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGFwcGVuZGVkIHRoZW1zZWx2ZXMuXG4gICAgICAgICAgICAgICAgICB2YXIgbGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSByZW5kZXJTdGF0ZS5sYXN0RWZmZWN0OyAvLyBSZW1vdmUgYW55IGVmZmVjdHMgdGhhdCB3ZXJlIGFwcGVuZGVkIGFmdGVyIHRoaXMgcG9pbnQuXG5cbiAgICAgICAgICAgICAgICAgIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB9IC8vIFdlJ3JlIGRvbmUuXG5cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICggLy8gVGhlIHRpbWUgaXQgdG9vayB0byByZW5kZXIgbGFzdCByb3cgaXMgZ3JlYXRlciB0aGFuIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAgIC8vIHRpbWUgd2UgaGF2ZSB0byByZW5kZXIuIFNvIHJlbmRlcmluZyBvbmUgbW9yZSByb3cgd291bGQgbGlrZWx5XG4gICAgICAgICAgICAvLyBleGNlZWQgaXQuXG4gICAgICAgICAgICBub3coKSAqIDIgLSByZW5kZXJTdGF0ZS5yZW5kZXJpbmdTdGFydFRpbWUgPiBnZXRSZW5kZXJUYXJnZXRUaW1lKCkgJiYgcmVuZGVyTGFuZXMgIT09IE9mZnNjcmVlbkxhbmUpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3cgcGFzc2VkIG91ciBDUFUgZGVhZGxpbmUgYW5kIHdlJ2xsIGp1c3QgZ2l2ZSB1cCBmdXJ0aGVyXG4gICAgICAgICAgICAgIC8vIGF0dGVtcHRzIHRvIHJlbmRlciB0aGUgbWFpbiBjb250ZW50IGFuZCBvbmx5IHJlbmRlciBmYWxsYmFja3MuXG4gICAgICAgICAgICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhpcyBpcyB1c3VhbGx5IGZhc3Rlci5cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gRGlkQ2FwdHVyZTtcbiAgICAgICAgICAgICAgZGlkU3VzcGVuZEFscmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQocmVuZGVyU3RhdGUsIGZhbHNlKTsgLy8gU2luY2Ugbm90aGluZyBhY3R1YWxseSBzdXNwZW5kZWQsIHRoZXJlIHdpbGwgbm90aGluZyB0byBwaW5nIHRoaXNcbiAgICAgICAgICAgICAgLy8gdG8gZ2V0IGl0IHN0YXJ0ZWQgYmFjayB1cCB0byBhdHRlbXB0IHRoZSBuZXh0IGl0ZW0uIFdoaWxlIGluIHRlcm1zXG4gICAgICAgICAgICAgIC8vIG9mIHByaW9yaXR5IHRoaXMgd29yayBoYXMgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhpcyBjdXJyZW50IHJlbmRlcixcbiAgICAgICAgICAgICAgLy8gaXQncyBub3QgcGFydCBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIG9uY2UgdGhlIHRyYW5zaXRpb24gaGFzXG4gICAgICAgICAgICAgIC8vIGNvbW1pdHRlZC4gSWYgaXQncyBzeW5jLCB3ZSBzdGlsbCB3YW50IHRvIHlpZWxkIHNvIHRoYXQgaXQgY2FuIGJlXG4gICAgICAgICAgICAgIC8vIHBhaW50ZWQuIENvbmNlcHR1YWxseSwgdGhpcyBpcyByZWFsbHkgdGhlIHNhbWUgYXMgcGluZ2luZy5cbiAgICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSBhbnkgUmV0cnlMYW5lIGV2ZW4gaWYgaXQncyB0aGUgb25lIGN1cnJlbnRseSByZW5kZXJpbmdcbiAgICAgICAgICAgICAgLy8gc2luY2Ugd2UncmUgbGVhdmluZyBpdCBiZWhpbmQgb24gdGhpcyBub2RlLlxuXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gU29tZVJldHJ5TGFuZTtcblxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFya1NwYXduZWRXb3JrKFNvbWVSZXRyeUxhbmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzKSB7XG4gICAgICAgICAgICAvLyBUaGUgZWZmZWN0IGxpc3Qgb2YgdGhlIGJhY2t3YXJkcyB0YWlsIHdpbGwgaGF2ZSBiZWVuIGFkZGVkXG4gICAgICAgICAgICAvLyB0byB0aGUgZW5kLiBUaGlzIGJyZWFrcyB0aGUgZ3VhcmFudGVlIHRoYXQgbGlmZS1jeWNsZXMgZmlyZSBpblxuICAgICAgICAgICAgLy8gc2libGluZyBvcmRlciBidXQgdGhhdCBpc24ndCBhIHN0cm9uZyBndWFyYW50ZWUgcHJvbWlzZWQgYnkgUmVhY3QuXG4gICAgICAgICAgICAvLyBFc3BlY2lhbGx5IHNpbmNlIHRoZXNlIG1pZ2h0IGFsc28ganVzdCBwb3AgaW4gZHVyaW5nIGZ1dHVyZSBjb21taXRzLlxuICAgICAgICAgICAgLy8gQXBwZW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QuXG4gICAgICAgICAgICByZW5kZXJlZFRhaWwuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c1NpYmxpbmcgPSByZW5kZXJTdGF0ZS5sYXN0O1xuXG4gICAgICAgICAgICBpZiAocHJldmlvdXNTaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2libGluZy5zaWJsaW5nID0gcmVuZGVyZWRUYWlsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlbmRlclN0YXRlLmxhc3QgPSByZW5kZXJlZFRhaWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlbmRlclN0YXRlLnRhaWwgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBXZSBzdGlsbCBoYXZlIHRhaWwgcm93cyB0byByZW5kZXIuXG4gICAgICAgICAgLy8gUG9wIGEgcm93LlxuICAgICAgICAgIHZhciBuZXh0ID0gcmVuZGVyU3RhdGUudGFpbDtcbiAgICAgICAgICByZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBuZXh0O1xuICAgICAgICAgIHJlbmRlclN0YXRlLnRhaWwgPSBuZXh0LnNpYmxpbmc7XG4gICAgICAgICAgcmVuZGVyU3RhdGUubGFzdEVmZmVjdCA9IHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3Q7XG4gICAgICAgICAgcmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgbmV4dC5zaWJsaW5nID0gbnVsbDsgLy8gUmVzdG9yZSB0aGUgY29udGV4dC5cbiAgICAgICAgICAvLyBUT0RPOiBXZSBjYW4gcHJvYmFibHkganVzdCBhdm9pZCBwb3BwaW5nIGl0IGluc3RlYWQgYW5kIG9ubHlcbiAgICAgICAgICAvLyBzZXR0aW5nIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGdvIGZyb20gbm90IHN1c3BlbmRlZCB0byBzdXNwZW5kZWQuXG5cbiAgICAgICAgICB2YXIgc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50O1xuXG4gICAgICAgICAgaWYgKGRpZFN1c3BlbmRBbHJlYWR5KSB7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPSBzZXRTaGFsbG93U3VzcGVuc2VDb250ZXh0KHN1c3BlbnNlQ29udGV4dCwgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3VzcGVuc2VDb250ZXh0ID0gc2V0RGVmYXVsdFNoYWxsb3dTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwdXNoU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpOyAvLyBEbyBhIHBhc3Mgb3ZlciB0aGUgbmV4dCByb3cuXG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICAgIHtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEJsb2NrOlxuXG4gICAgICBicmVhaztcblxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBwb3BSZW5kZXJMYW5lcyh3b3JrSW5Qcm9ncmVzcyk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICB2YXIgX25leHRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIF9wcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgdmFyIHByZXZJc0hpZGRlbiA9IF9wcmV2U3RhdGUgIT09IG51bGw7XG4gICAgICAgICAgdmFyIG5leHRJc0hpZGRlbiA9IF9uZXh0U3RhdGUgIT09IG51bGw7XG5cbiAgICAgICAgICBpZiAocHJldklzSGlkZGVuICE9PSBuZXh0SXNIaWRkZW4gJiYgbmV3UHJvcHMubW9kZSAhPT0gJ3Vuc3RhYmxlLWRlZmVyLXdpdGhvdXQtaGlkaW5nJykge1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gVXBkYXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgKyB3b3JrSW5Qcm9ncmVzcy50YWcgKyBcIikuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdW53aW5kV29yayh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgQ29tcG9uZW50ID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcblxuICAgICAgICBpZiAoaXNDb250ZXh0UHJvdmlkZXIoQ29tcG9uZW50KSkge1xuICAgICAgICAgIHBvcENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKGZsYWdzICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gZmxhZ3MgJiB+U2hvdWxkQ2FwdHVyZSB8IERpZENhcHR1cmU7XG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHBvcFRvcExldmVsQ29udGV4dE9iamVjdCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICB2YXIgX2ZsYWdzID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG5cbiAgICAgICAgaWYgKCEoKF9mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlRoZSByb290IGZhaWxlZCB0byB1bm1vdW50IGFmdGVyIGFuIGVycm9yLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IF9mbGFncyAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTtcbiAgICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICAvLyBUT0RPOiBwb3BIeWRyYXRpb25TdGF0ZVxuICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUNvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wU3VzcGVuc2VDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcblxuICAgICAgICB2YXIgX2ZsYWdzMiA9IHdvcmtJblByb2dyZXNzLmZsYWdzO1xuXG4gICAgICAgIGlmIChfZmxhZ3MyICYgU2hvdWxkQ2FwdHVyZSkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID0gX2ZsYWdzMiAmIH5TaG91bGRDYXB0dXJlIHwgRGlkQ2FwdHVyZTsgLy8gQ2FwdHVyZWQgYSBzdXNwZW5zZSBlZmZlY3QuIFJlLXJlbmRlciB0aGUgYm91bmRhcnkuXG5cbiAgICAgICAgICBpZiAoICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHBvcFN1c3BlbnNlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7IC8vIFN1c3BlbnNlTGlzdCBkb2Vzbid0IGFjdHVhbGx5IGNhdGNoIGFueXRoaW5nLiBJdCBzaG91bGQndmUgYmVlblxuICAgICAgICAvLyBjYXVnaHQgYnkgYSBuZXN0ZWQgYm91bmRhcnkuIElmIG5vdCwgaXQgc2hvdWxkIGJ1YmJsZSB0aHJvdWdoLlxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIGNhc2UgQ29udGV4dFByb3ZpZGVyOlxuICAgICAgcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspIHtcbiAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gaW50ZXJydXB0ZWRXb3JrLnR5cGUuY2hpbGRDb250ZXh0VHlwZXM7XG5cbiAgICAgICAgaWYgKGNoaWxkQ29udGV4dFR5cGVzICE9PSBudWxsICYmIGNoaWxkQ29udGV4dFR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb3BDb250ZXh0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIH1cblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgcG9wVG9wTGV2ZWxDb250ZXh0T2JqZWN0KGludGVycnVwdGVkV29yayk7XG4gICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NWZXJzaW9ucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwb3BIb3N0Q29udGFpbmVyKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICBwb3BTdXNwZW5zZUNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBDb250ZXh0UHJvdmlkZXI6XG4gICAgICBwb3BQcm92aWRlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE9mZnNjcmVlbkNvbXBvbmVudDpcbiAgICBjYXNlIExlZ2FjeUhpZGRlbkNvbXBvbmVudDpcbiAgICAgIHBvcFJlbmRlckxhbmVzKGludGVycnVwdGVkV29yayk7XG4gICAgICBicmVhaztcbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2UpIHtcbiAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGVycm9yLCBjYWxsIHRoaXMgZnVuY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgdGhyb3duXG4gIC8vIHNvIHRoZSBzdGFjayBpcyBhY2N1cmF0ZS5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdmFsdWUsXG4gICAgc291cmNlOiBzb3VyY2UsXG4gICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gIH07XG59XG5cbi8vIFRoaXMgbW9kdWxlIGlzIGZvcmtlZCBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLlxuLy8gQnkgZGVmYXVsdCwgcmV0dXJuIGB0cnVlYCB0byBsb2cgZXJyb3JzIHRvIHRoZSBjb25zb2xlLlxuLy8gRm9ya3MgY2FuIHJldHVybiBgZmFsc2VgIGlmIHRoaXMgaXNuJ3QgZGVzaXJhYmxlLlxuZnVuY3Rpb24gc2hvd0Vycm9yRGlhbG9nKGJvdW5kYXJ5LCBlcnJvckluZm8pIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGxvZ0NhcHR1cmVkRXJyb3IoYm91bmRhcnksIGVycm9ySW5mbykge1xuICB0cnkge1xuICAgIHZhciBsb2dFcnJvciA9IHNob3dFcnJvckRpYWxvZyhib3VuZGFyeSwgZXJyb3JJbmZvKTsgLy8gQWxsb3cgaW5qZWN0ZWQgc2hvd0Vycm9yRGlhbG9nKCkgdG8gcHJldmVudCBkZWZhdWx0IGNvbnNvbGUuZXJyb3IgbG9nZ2luZy5cbiAgICAvLyBUaGlzIGVuYWJsZXMgcmVuZGVyZXJzIGxpa2UgUmVhY3ROYXRpdmUgdG8gYmV0dGVyIG1hbmFnZSByZWRib3ggYmVoYXZpb3IuXG5cbiAgICBpZiAobG9nRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuXG4gICAgaWYgKHRydWUpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBlcnJvckluZm8uc291cmNlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdmFyIGNvbXBvbmVudFN0YWNrID0gc3RhY2sgIT09IG51bGwgPyBzdGFjayA6ICcnOyAvLyBCcm93c2VycyBzdXBwb3J0IHNpbGVuY2luZyB1bmNhdWdodCBlcnJvcnMgYnkgY2FsbGluZ1xuICAgICAgLy8gYHByZXZlbnREZWZhdWx0KClgIGluIHdpbmRvdyBgZXJyb3JgIGhhbmRsZXIuXG4gICAgICAvLyBXZSByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbiBhcyBhbiBleHBhbmRvIG9uIHRoZSBlcnJvci5cblxuICAgICAgaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IuX3N1cHByZXNzTG9nZ2luZykge1xuICAgICAgICBpZiAoYm91bmRhcnkudGFnID09PSBDbGFzc0NvbXBvbmVudCkge1xuICAgICAgICAgIC8vIFRoZSBlcnJvciBpcyByZWNvdmVyYWJsZSBhbmQgd2FzIHNpbGVuY2VkLlxuICAgICAgICAgIC8vIElnbm9yZSBpdCBhbmQgZG9uJ3QgcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuICAgICAgICAgIC8vIFRoaXMgaXMgaGFuZHkgZm9yIHRlc3RpbmcgZXJyb3IgYm91bmRhcmllcyB3aXRob3V0IG5vaXNlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBUaGUgZXJyb3IgaXMgZmF0YWwuIFNpbmNlIHRoZSBzaWxlbmNpbmcgbWlnaHQgaGF2ZVxuICAgICAgICAvLyBiZWVuIGFjY2lkZW50YWwsIHdlJ2xsIHN1cmZhY2UgaXQgYW55d2F5LlxuICAgICAgICAvLyBIb3dldmVyLCB0aGUgYnJvd3NlciB3b3VsZCBoYXZlIHNpbGVuY2VkIHRoZSBvcmlnaW5hbCBlcnJvclxuICAgICAgICAvLyBzbyB3ZSdsbCBwcmludCBpdCBmaXJzdCwgYW5kIHRoZW4gcHJpbnQgdGhlIHN0YWNrIGFkZGVuZHVtLlxuXG5cbiAgICAgICAgY29uc29sZVsnZXJyb3InXShlcnJvcik7IC8vIERvbid0IHRyYW5zZm9ybSB0byBvdXIgd3JhcHBlclxuICAgICAgICAvLyBGb3IgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgYmxvY2ssIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvMTMzODRcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBzb3VyY2UgPyBnZXRDb21wb25lbnROYW1lKHNvdXJjZS50eXBlKSA6IG51bGw7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lID8gXCJUaGUgYWJvdmUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIDxcIiArIGNvbXBvbmVudE5hbWUgKyBcIj4gY29tcG9uZW50OlwiIDogJ1RoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzOic7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU1lc3NhZ2U7XG4gICAgICB2YXIgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lKGJvdW5kYXJ5LnR5cGUpO1xuXG4gICAgICBpZiAoZXJyb3JCb3VuZGFyeU5hbWUpIHtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU1lc3NhZ2UgPSBcIlJlYWN0IHdpbGwgdHJ5IHRvIHJlY3JlYXRlIHRoaXMgY29tcG9uZW50IHRyZWUgZnJvbSBzY3JhdGNoIFwiICsgKFwidXNpbmcgdGhlIGVycm9yIGJvdW5kYXJ5IHlvdSBwcm92aWRlZCwgXCIgKyBlcnJvckJvdW5kYXJ5TmFtZSArIFwiLlwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yQm91bmRhcnlNZXNzYWdlID0gJ0NvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcbicgKyAnVmlzaXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL2Vycm9yLWJvdW5kYXJpZXMgdG8gbGVhcm4gbW9yZSBhYm91dCBlcnJvciBib3VuZGFyaWVzLic7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb21iaW5lZE1lc3NhZ2UgPSBjb21wb25lbnROYW1lTWVzc2FnZSArIFwiXFxuXCIgKyBjb21wb25lbnRTdGFjayArIFwiXFxuXFxuXCIgKyAoXCJcIiArIGVycm9yQm91bmRhcnlNZXNzYWdlKTsgLy8gSW4gZGV2ZWxvcG1lbnQsIHdlIHByb3ZpZGUgb3VyIG93biBtZXNzYWdlIHdpdGgganVzdCB0aGUgY29tcG9uZW50IHN0YWNrLlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0aGUgb3JpZ2luYWwgZXJyb3IgbWVzc2FnZSBhbmQgSlMgc3RhY2sgYmVjYXVzZSB0aGUgYnJvd3NlclxuICAgICAgLy8gaGFzIGFscmVhZHkgcHJpbnRlZCBpdC4gRXZlbiBpZiB0aGUgYXBwbGljYXRpb24gc3dhbGxvd3MgdGhlIGVycm9yLCBpdCBpcyBzdGlsbFxuICAgICAgLy8gZGlzcGxheWVkIGJ5IHRoZSBicm93c2VyIHRoYW5rcyB0byB0aGUgREVWLW9ubHkgZmFrZSBldmVudCB0cmljayBpbiBSZWFjdEVycm9yVXRpbHMuXG5cbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oY29tYmluZWRNZXNzYWdlKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEluIHByb2R1Y3Rpb24sIHdlIHByaW50IHRoZSBlcnJvciBkaXJlY3RseS5cbiAgICAgIC8vIFRoaXMgd2lsbCBpbmNsdWRlIHRoZSBtZXNzYWdlLCB0aGUgSlMgc3RhY2ssIGFuZCBhbnl0aGluZyB0aGUgYnJvd3NlciB3YW50cyB0byBzaG93LlxuICAgICAgLy8gV2UgcGFzcyB0aGUgZXJyb3Igb2JqZWN0IGluc3RlYWQgb2YgY3VzdG9tIG1lc3NhZ2Ugc28gdGhhdCB0aGUgYnJvd3NlciBkaXNwbGF5cyB0aGUgZXJyb3IgbmF0aXZlbHkuXG4gICAgICBjb25zb2xlWydlcnJvciddKGVycm9yKTsgLy8gRG9uJ3QgdHJhbnNmb3JtIHRvIG91ciB3cmFwcGVyXG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBtZXRob2QgbXVzdCBub3QgdGhyb3csIG9yIFJlYWN0IGludGVybmFsIHN0YXRlIHdpbGwgZ2V0IG1lc3NlZCB1cC5cbiAgICAvLyBJZiBjb25zb2xlLmVycm9yIGlzIG92ZXJyaWRkZW4sIG9yIGxvZ0NhcHR1cmVkRXJyb3IoKSBzaG93cyBhIGRpYWxvZyB0aGF0IHRocm93cyxcbiAgICAvLyB3ZSB3YW50IHRvIHJlcG9ydCB0aGlzIGVycm9yIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBzdGFjayBhcyBhIGxhc3QgcmVzb3J0LlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTMxODhcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG4gIH1cbn1cblxudmFyIFBvc3NpYmx5V2Vha01hcCQxID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwO1xuXG5mdW5jdGlvbiBjcmVhdGVSb290RXJyb3JVcGRhdGUoZmliZXIsIGVycm9ySW5mbywgbGFuZSkge1xuICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBsYW5lKTsgLy8gVW5tb3VudCB0aGUgcm9vdCBieSByZW5kZXJpbmcgbnVsbC5cblxuICB1cGRhdGUudGFnID0gQ2FwdHVyZVVwZGF0ZTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogbnVsbFxuICB9O1xuICB2YXIgZXJyb3IgPSBlcnJvckluZm8udmFsdWU7XG5cbiAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIG9uVW5jYXVnaHRFcnJvcihlcnJvcik7XG4gICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIGxhbmUpIHtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZShOb1RpbWVzdGFtcCwgbGFuZSk7XG4gIHVwZGF0ZS50YWcgPSBDYXB0dXJlVXBkYXRlO1xuICB2YXIgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yID0gZmliZXIudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7XG5cbiAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZXJyb3IkMSA9IGVycm9ySW5mby52YWx1ZTtcblxuICAgIHVwZGF0ZS5wYXlsb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgbG9nQ2FwdHVyZWRFcnJvcihmaWJlciwgZXJyb3JJbmZvKTtcbiAgICAgIHJldHVybiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZXJyb3IkMSk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpbnN0ID0gZmliZXIuc3RhdGVOb2RlO1xuXG4gIGlmIChpbnN0ICE9PSBudWxsICYmIHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gY2FsbGJhY2soKSB7XG4gICAgICB7XG4gICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVG8gcHJlc2VydmUgdGhlIHByZWV4aXN0aW5nIHJldHJ5IGJlaGF2aW9yIG9mIGVycm9yIGJvdW5kYXJpZXMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb25lcyBhbHJlYWR5IGZhaWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgICAgLy8gVGhpcyBnZXRzIHJlc2V0IGJlZm9yZSB3ZSB5aWVsZCBiYWNrIHRvIHRoZSBicm93c2VyLlxuICAgICAgICAvLyBUT0RPOiBXYXJuIGluIHN0cmljdCBtb2RlIGlmIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciBpc1xuICAgICAgICAvLyBub3QgZGVmaW5lZC5cbiAgICAgICAgbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZCh0aGlzKTsgLy8gT25seSBsb2cgaGVyZSBpZiBjb21wb25lbnREaWRDYXRjaCBpcyB0aGUgb25seSBlcnJvciBib3VuZGFyeSBtZXRob2QgZGVmaW5lZFxuXG4gICAgICAgIGxvZ0NhcHR1cmVkRXJyb3IoZmliZXIsIGVycm9ySW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBlcnJvciQxID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgdGhpcy5jb21wb25lbnREaWRDYXRjaChlcnJvciQxLCB7XG4gICAgICAgIGNvbXBvbmVudFN0YWNrOiBzdGFjayAhPT0gbnVsbCA/IHN0YWNrIDogJydcbiAgICAgIH0pO1xuXG4gICAgICB7XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gSWYgY29tcG9uZW50RGlkQ2F0Y2ggaXMgdGhlIG9ubHkgZXJyb3IgYm91bmRhcnkgbWV0aG9kIGRlZmluZWQsXG4gICAgICAgICAgLy8gdGhlbiBpdCBuZWVkcyB0byBjYWxsIHNldFN0YXRlIHRvIHJlY292ZXIgZnJvbSBlcnJvcnMuXG4gICAgICAgICAgLy8gSWYgbm8gc3RhdGUgdXBkYXRlIGlzIHNjaGVkdWxlZCB0aGVuIHRoZSBib3VuZGFyeSB3aWxsIHN3YWxsb3cgdGhlIGVycm9yLlxuICAgICAgICAgIGlmICghaW5jbHVkZXNTb21lTGFuZShmaWJlci5sYW5lcywgU3luY0xhbmUpKSB7XG4gICAgICAgICAgICBlcnJvcignJXM6IEVycm9yIGJvdW5kYXJpZXMgc2hvdWxkIGltcGxlbWVudCBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoKS4gJyArICdJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS4nLCBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdVbmtub3duJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICB1cGRhdGUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGU7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB3YWtlYWJsZSwgbGFuZXMpIHtcbiAgLy8gQXR0YWNoIGEgbGlzdGVuZXIgdG8gdGhlIHByb21pc2UgdG8gXCJwaW5nXCIgdGhlIHJvb3QgYW5kIHJldHJ5LiBCdXQgb25seSBpZlxuICAvLyBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGxhbmVzIHdlJ3JlIGN1cnJlbnRseSByZW5kZXJpbmcgKHdoaWNoXG4gIC8vIGFjdHMgbGlrZSBhIFwidGhyZWFkIElEXCIgaGVyZSkuXG4gIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgdmFyIHRocmVhZElEcztcblxuICBpZiAocGluZ0NhY2hlID09PSBudWxsKSB7XG4gICAgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwJDEoKTtcbiAgICB0aHJlYWRJRHMgPSBuZXcgU2V0KCk7XG4gICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKTtcblxuICAgIGlmICh0aHJlYWRJRHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRocmVhZElEcy5oYXMobGFuZXMpKSB7XG4gICAgLy8gTWVtb2l6ZSB1c2luZyB0aGUgdGhyZWFkIElEIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICB0aHJlYWRJRHMuYWRkKGxhbmVzKTtcbiAgICB2YXIgcGluZyA9IHBpbmdTdXNwZW5kZWRSb290LmJpbmQobnVsbCwgcm9vdCwgd2FrZWFibGUsIGxhbmVzKTtcbiAgICB3YWtlYWJsZS50aGVuKHBpbmcsIHBpbmcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKHJvb3QsIHJldHVybkZpYmVyLCBzb3VyY2VGaWJlciwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcykge1xuICAvLyBUaGUgc291cmNlIGZpYmVyIGRpZCBub3QgY29tcGxldGUuXG4gIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7IC8vIEl0cyBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgc291cmNlRmliZXIuZmlyc3RFZmZlY3QgPSBzb3VyY2VGaWJlci5sYXN0RWZmZWN0ID0gbnVsbDtcblxuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIFRoaXMgaXMgYSB3YWtlYWJsZS5cbiAgICB2YXIgd2FrZWFibGUgPSB2YWx1ZTtcblxuICAgIGlmICgoc291cmNlRmliZXIubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgLy8gUmVzZXQgdGhlIG1lbW9pemVkU3RhdGUgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIHdlIGF0dGVtcHRlZFxuICAgICAgLy8gdG8gcmVuZGVyIGl0LlxuICAgICAgdmFyIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgIGlmIChjdXJyZW50U291cmNlKSB7XG4gICAgICAgIHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gY3VycmVudFNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgICAgICAgc291cmNlRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGN1cnJlbnRTb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgc291cmNlRmliZXIubGFuZXMgPSBjdXJyZW50U291cmNlLmxhbmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291cmNlRmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgICBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzSW52aXNpYmxlUGFyZW50Qm91bmRhcnkgPSBoYXNTdXNwZW5zZUNvbnRleHQoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBJbnZpc2libGVQYXJlbnRTdXNwZW5zZUNvbnRleHQpOyAvLyBTY2hlZHVsZSB0aGUgbmVhcmVzdCBTdXNwZW5zZSB0byByZS1yZW5kZXIgdGhlIHRpbWVkIG91dCB2aWV3LlxuXG4gICAgdmFyIF93b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gICAgZG8ge1xuICAgICAgaWYgKF93b3JrSW5Qcm9ncmVzcy50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIHNob3VsZENhcHR1cmVTdXNwZW5zZShfd29ya0luUHJvZ3Jlc3MsIGhhc0ludmlzaWJsZVBhcmVudEJvdW5kYXJ5KSkge1xuICAgICAgICAvLyBGb3VuZCB0aGUgbmVhcmVzdCBib3VuZGFyeS5cbiAgICAgICAgLy8gU3Rhc2ggdGhlIHByb21pc2Ugb24gdGhlIGJvdW5kYXJ5IGZpYmVyLiBJZiB0aGUgYm91bmRhcnkgdGltZXMgb3V0LCB3ZSdsbFxuICAgICAgICAvLyBhdHRhY2ggYW5vdGhlciBsaXN0ZW5lciB0byBmbGlwIHRoZSBib3VuZGFyeSBiYWNrIHRvIGl0cyBub3JtYWwgc3RhdGUuXG4gICAgICAgIHZhciB3YWtlYWJsZXMgPSBfd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHdha2VhYmxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IG5ldyBTZXQoKTtcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5hZGQod2FrZWFibGUpO1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHdha2VhYmxlcy5hZGQod2FrZWFibGUpO1xuICAgICAgICB9IC8vIElmIHRoZSBib3VuZGFyeSBpcyBvdXRzaWRlIG9mIGJsb2NraW5nIG1vZGUsIHdlIHNob3VsZCAqbm90KlxuICAgICAgICAvLyBzdXNwZW5kIHRoZSBjb21taXQuIFByZXRlbmQgYXMgaWYgdGhlIHN1c3BlbmRlZCBjb21wb25lbnQgcmVuZGVyZWRcbiAgICAgICAgLy8gbnVsbCBhbmQga2VlcCByZW5kZXJpbmcuIEluIHRoZSBjb21taXQgcGhhc2UsIHdlJ2xsIHNjaGVkdWxlIGFcbiAgICAgICAgLy8gc3Vic2VxdWVudCBzeW5jaHJvbm91cyB1cGRhdGUgdG8gcmUtcmVuZGVyIHRoZSBTdXNwZW5zZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZTogSXQgZG9lc24ndCBtYXR0ZXIgd2hldGhlciB0aGUgY29tcG9uZW50IHRoYXQgc3VzcGVuZGVkIHdhc1xuICAgICAgICAvLyBpbnNpZGUgYSBibG9ja2luZyBtb2RlIHRyZWUuIElmIHRoZSBTdXNwZW5zZSBpcyBvdXRzaWRlIG9mIGl0LCB3ZVxuICAgICAgICAvLyBzaG91bGQgKm5vdCogc3VzcGVuZCB0aGUgY29tbWl0LlxuXG5cbiAgICAgICAgaWYgKChfd29ya0luUHJvZ3Jlc3MubW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgICAgICAgIF93b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBEaWRDYXB0dXJlO1xuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzIHw9IEZvcmNlVXBkYXRlRm9yTGVnYWN5U3VzcGVuc2U7IC8vIFdlJ3JlIGdvaW5nIHRvIGNvbW1pdCB0aGlzIGZpYmVyIGV2ZW4gdGhvdWdoIGl0IGRpZG4ndCBjb21wbGV0ZS5cbiAgICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkbid0IGNhbGwgYW55IGxpZmVjeWNsZSBtZXRob2RzIG9yIGNhbGxiYWNrcy4gUmVtb3ZlXG4gICAgICAgICAgLy8gYWxsIGxpZmVjeWNsZSBlZmZlY3QgdGFncy5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmZsYWdzICY9IH4oTGlmZWN5Y2xlRWZmZWN0TWFzayB8IEluY29tcGxldGUpO1xuXG4gICAgICAgICAgaWYgKHNvdXJjZUZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50U291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50U291cmNlRmliZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5ldyBtb3VudC4gQ2hhbmdlIHRoZSB0YWcgc28gaXQncyBub3QgbWlzdGFrZW4gZm9yIGFcbiAgICAgICAgICAgICAgLy8gY29tcGxldGVkIGNsYXNzIGNvbXBvbmVudC4gRm9yIGV4YW1wbGUsIHdlIHNob3VsZCBub3QgY2FsbFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBpZiBpdCBpcyBkZWxldGVkLlxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci50YWcgPSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBXaGVuIHdlIHRyeSByZW5kZXJpbmcgYWdhaW4sIHdlIHNob3VsZCBub3QgcmV1c2UgdGhlIGN1cnJlbnQgZmliZXIsXG4gICAgICAgICAgICAgIC8vIHNpbmNlIGl0J3Mga25vd24gdG8gYmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgYSBmb3JjZSB1cGRhdGUgdG9cbiAgICAgICAgICAgICAgLy8gcHJldmVudCBhIGJhaWwgb3V0LlxuICAgICAgICAgICAgICB2YXIgdXBkYXRlID0gY3JlYXRlVXBkYXRlKE5vVGltZXN0YW1wLCBTeW5jTGFuZSk7XG4gICAgICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICAgICAgZW5xdWV1ZVVwZGF0ZShzb3VyY2VGaWJlciwgdXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIFRoZSBzb3VyY2UgZmliZXIgZGlkIG5vdCBjb21wbGV0ZS4gTWFyayBpdCB3aXRoIFN5bmMgcHJpb3JpdHkgdG9cbiAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IHN0aWxsIGhhcyBwZW5kaW5nIHdvcmsuXG5cblxuICAgICAgICAgIHNvdXJjZUZpYmVyLmxhbmVzID0gbWVyZ2VMYW5lcyhzb3VyY2VGaWJlci5sYW5lcywgU3luY0xhbmUpOyAvLyBFeGl0IHdpdGhvdXQgc3VzcGVuZGluZy5cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBDb25maXJtZWQgdGhhdCB0aGUgYm91bmRhcnkgaXMgaW4gYSBjb25jdXJyZW50IG1vZGUgdHJlZS4gQ29udGludWVcbiAgICAgICAgLy8gd2l0aCB0aGUgbm9ybWFsIHN1c3BlbmQgcGF0aC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWZ0ZXIgdGhpcyB3ZSdsbCB1c2UgYSBzZXQgb2YgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzXG4gICAgICAgIC8vIHJlbmRlciBwYXNzIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gb3IgcmVzdGFydCBvciBcInN1c3BlbmRcIiB0aGUgY29tbWl0LlxuICAgICAgICAvLyBUaGUgYWN0dWFsIGxvZ2ljIGZvciB0aGlzIGlzIHNwcmVhZCBvdXQgaW4gZGlmZmVyZW50IHBsYWNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhpcyBmaXJzdCBwcmluY2lwbGUgaXMgdGhhdCBpZiB3ZSdyZSBnb2luZyB0byBzdXNwZW5kIHdoZW4gd2UgY29tcGxldGVcbiAgICAgICAgLy8gYSByb290LCB0aGVuIHdlIHNob3VsZCBhbHNvIHJlc3RhcnQgaWYgd2UgZ2V0IGFuIHVwZGF0ZSBvciBwaW5nIHRoYXRcbiAgICAgICAgLy8gbWlnaHQgdW5zdXNwZW5kIGl0LCBhbmQgdmljZSB2ZXJzYS4gVGhlIG9ubHkgcmVhc29uIHRvIHN1c3BlbmQgaXNcbiAgICAgICAgLy8gYmVjYXVzZSB5b3UgdGhpbmsgeW91IG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBiZWZvcmUgY29tbWl0dGluZy4gSG93ZXZlcixcbiAgICAgICAgLy8gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlc3RhcnQgb25seSB3aGlsZSBpbiB0aGUgcGVyaW9kIHdlJ3JlIHN1c3BlbmRlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVzdGFydGluZyB0b28gYWdncmVzc2l2ZWx5IGlzIGFsc28gbm90IGdvb2QgYmVjYXVzZSBpdCBzdGFydmVzIG91dCBhbnlcbiAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFNvIHdlIHVzZSBoZXVyaXN0aWNzIHRvIGRldGVybWluZSB3aGVuLlxuICAgICAgICAvLyBTdXNwZW5zZSBIZXVyaXN0aWNzXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIG5vdGhpbmcgdGhyZXcgYSBQcm9taXNlIG9yIGFsbCB0aGUgc2FtZSBmYWxsYmFja3MgYXJlIGFscmVhZHkgc2hvd2luZyxcbiAgICAgICAgLy8gdGhlbiBkb24ndCBzdXNwZW5kL3Jlc3RhcnQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gaW5pdGlhbCByZW5kZXIgb2YgYSBuZXcgdHJlZSBvZiBTdXNwZW5zZSBib3VuZGFyaWVzIGFuZFxuICAgICAgICAvLyB0aG9zZSB0cmlnZ2VyIGEgZmFsbGJhY2ssIHRoZW4gZG9uJ3Qgc3VzcGVuZC9yZXN0YXJ0LiBXZSB3YW50IHRvIGVuc3VyZVxuICAgICAgICAvLyB0aGF0IHdlIGNhbiBzaG93IHRoZSBpbml0aWFsIGxvYWRpbmcgc3RhdGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgd2UgaGl0IGEgXCJEZWxheWVkXCIgY2FzZSwgc3VjaCBhcyB3aGVuIHdlJ2Qgc3dpdGNoIGZyb20gY29udGVudCBiYWNrIGludG9cbiAgICAgICAgLy8gYSBmYWxsYmFjaywgdGhlbiB3ZSBzaG91bGQgYWx3YXlzIHN1c3BlbmQvcmVzdGFydC4gVHJhbnNpdGlvbnMgYXBwbHlcbiAgICAgICAgLy8gdG8gdGhpcyBjYXNlLiBJZiBub25lIGlzIGRlZmluZWQsIEpORCBpcyB1c2VkIGluc3RlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHdlJ3JlIGFscmVhZHkgc2hvd2luZyBhIGZhbGxiYWNrIGFuZCBpdCBnZXRzIFwicmV0cmllZFwiLCBhbGxvd2luZyB1cyB0byBzaG93XG4gICAgICAgIC8vIGFub3RoZXIgbGV2ZWwsIGJ1dCB0aGVyZSdzIHN0aWxsIGFuIGlubmVyIGJvdW5kYXJ5IHRoYXQgd291bGQgc2hvdyBhIGZhbGxiYWNrLFxuICAgICAgICAvLyB0aGVuIHdlIHN1c3BlbmQvcmVzdGFydCBmb3IgNTAwbXMgc2luY2UgdGhlIGxhc3QgdGltZSB3ZSBzaG93ZWQgYSBmYWxsYmFja1xuICAgICAgICAvLyBhbnl3aGVyZSBpbiB0aGUgdHJlZS4gVGhpcyBlZmZlY3RpdmVseSB0aHJvdHRsZXMgcHJvZ3Jlc3NpdmUgbG9hZGluZyBpbnRvIGFcbiAgICAgICAgLy8gY29uc2lzdGVudCB0cmFpbiBvZiBjb21taXRzLiBUaGlzIGFsc28gZ2l2ZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVzdGFydCB0b1xuICAgICAgICAvLyBnZXQgdG8gdGhlIGNvbXBsZXRlZCBzdGF0ZSBzbGlnaHRseSBlYXJsaWVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFtYmlndWl0eSBkdWUgdG8gYmF0Y2hpbmcgaXQncyByZXNvbHZlZCBpbiBwcmVmZXJlbmNlIG9mOlxuICAgICAgICAvLyAxKSBcImRlbGF5ZWRcIiwgMikgXCJpbml0aWFsIHJlbmRlclwiLCAzKSBcInJldHJ5XCIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgYSBcImJ1c3lcIiBzdGF0ZSBkb2Vzbid0IGdldCBmb3JjZSBjb21taXR0ZWQuIFdlIHdhbnQgdG9cbiAgICAgICAgLy8gZW5zdXJlIHRoYXQgbmV3IGluaXRpYWwgbG9hZGluZyBzdGF0ZXMgY2FuIGNvbW1pdCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuXG5cbiAgICAgICAgYXR0YWNoUGluZ0xpc3RlbmVyKHJvb3QsIHdha2VhYmxlLCByb290UmVuZGVyTGFuZXMpO1xuICAgICAgICBfd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgX3dvcmtJblByb2dyZXNzLmxhbmVzID0gcm9vdFJlbmRlckxhbmVzO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFRoaXMgYm91bmRhcnkgYWxyZWFkeSBjYXB0dXJlZCBkdXJpbmcgdGhpcyByZW5kZXIuIENvbnRpbnVlIHRvIHRoZSBuZXh0XG4gICAgICAvLyBib3VuZGFyeS5cblxuXG4gICAgICBfd29ya0luUHJvZ3Jlc3MgPSBfd29ya0luUHJvZ3Jlc3MucmV0dXJuO1xuICAgIH0gd2hpbGUgKF93b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCk7IC8vIE5vIGJvdW5kYXJ5IHdhcyBmb3VuZC4gRmFsbHRocm91Z2ggdG8gZXJyb3IgbW9kZS5cbiAgICAvLyBUT0RPOiBVc2UgaW52YXJpYW50IHNvIHRoZSBtZXNzYWdlIGlzIHN0cmlwcGVkIGluIHByb2Q/XG5cblxuICAgIHZhbHVlID0gbmV3IEVycm9yKChnZXRDb21wb25lbnROYW1lKHNvdXJjZUZpYmVyLnR5cGUpIHx8ICdBIFJlYWN0IGNvbXBvbmVudCcpICsgJyBzdXNwZW5kZWQgd2hpbGUgcmVuZGVyaW5nLCBidXQgbm8gZmFsbGJhY2sgVUkgd2FzIHNwZWNpZmllZC5cXG4nICsgJ1xcbicgKyAnQWRkIGEgPFN1c3BlbnNlIGZhbGxiYWNrPS4uLj4gY29tcG9uZW50IGhpZ2hlciBpbiB0aGUgdHJlZSB0byAnICsgJ3Byb3ZpZGUgYSBsb2FkaW5nIGluZGljYXRvciBvciBwbGFjZWhvbGRlciB0byBkaXNwbGF5LicpO1xuICB9IC8vIFdlIGRpZG4ndCBmaW5kIGEgYm91bmRhcnkgdGhhdCBjb3VsZCBoYW5kbGUgdGhpcyB0eXBlIG9mIGV4Y2VwdGlvbi4gU3RhcnRcbiAgLy8gb3ZlciBhbmQgdHJhdmVyc2UgcGFyZW50IHBhdGggYWdhaW4sIHRoaXMgdGltZSB0cmVhdGluZyB0aGUgZXhjZXB0aW9uXG4gIC8vIGFzIGFuIGVycm9yLlxuXG5cbiAgcmVuZGVyRGlkRXJyb3IoKTtcbiAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlKHZhbHVlLCBzb3VyY2VGaWJlcik7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyO1xuXG4gIGRvIHtcbiAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZXJyb3JJbmZvID0gdmFsdWU7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gU2hvdWxkQ2FwdHVyZTtcbiAgICAgICAgICB2YXIgbGFuZSA9IHBpY2tBcmJpdHJhcnlMYW5lKHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBtZXJnZUxhbmVzKHdvcmtJblByb2dyZXNzLmxhbmVzLCBsYW5lKTtcblxuICAgICAgICAgIHZhciBfdXBkYXRlID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfZXJyb3JJbmZvLCBsYW5lKTtcblxuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgX3VwZGF0ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIC8vIENhcHR1cmUgYW5kIHJldHJ5XG4gICAgICAgIHZhciBlcnJvckluZm8gPSB2YWx1ZTtcbiAgICAgICAgdmFyIGN0b3IgPSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIERpZENhcHR1cmUpID09PSBOb0ZsYWdzICYmICh0eXBlb2YgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPT09ICdmdW5jdGlvbicgfHwgaW5zdGFuY2UgIT09IG51bGwgJiYgdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkpIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSBTaG91bGRDYXB0dXJlO1xuXG4gICAgICAgICAgdmFyIF9sYW5lID0gcGlja0FyYml0cmFyeUxhbmUocm9vdFJlbmRlckxhbmVzKTtcblxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzcy5sYW5lcywgX2xhbmUpOyAvLyBTY2hlZHVsZSB0aGUgZXJyb3IgYm91bmRhcnkgdG8gcmUtcmVuZGVyIHVzaW5nIHVwZGF0ZWQgc3RhdGVcblxuICAgICAgICAgIHZhciBfdXBkYXRlMiA9IGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUod29ya0luUHJvZ3Jlc3MsIGVycm9ySW5mbywgX2xhbmUpO1xuXG4gICAgICAgICAgZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBfdXBkYXRlMik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gIH0gd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKTtcbn1cblxudmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZFNuYXBzaG90QmVmb3JlVXBkYXRlID0gbnVsbDtcblxue1xuICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG5ldyBTZXQoKTtcbn1cblxudmFyIFBvc3NpYmx5V2Vha1NldCA9IHR5cGVvZiBXZWFrU2V0ID09PSAnZnVuY3Rpb24nID8gV2Vha1NldCA6IFNldDtcblxudmFyIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudFdpdGhUaW1lciA9IGZ1bmN0aW9uIChjdXJyZW50LCBpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5wcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcztcbiAgaW5zdGFuY2Uuc3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG5cbiAge1xuICAgIGluc3RhbmNlLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gIH1cbn07IC8vIENhcHR1cmUgZXJyb3JzIHNvIHRoZXkgZG9uJ3QgaW50ZXJydXB0IHVubW91bnRpbmcuXG5cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KGN1cnJlbnQsIGluc3RhbmNlKSB7XG4gIHtcbiAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50V2l0aFRpbWVyLCBudWxsLCBjdXJyZW50LCBpbnN0YW5jZSk7XG5cbiAgICBpZiAoaGFzQ2F1Z2h0RXJyb3IoKSkge1xuICAgICAgdmFyIHVubW91bnRFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIHVubW91bnRFcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNhZmVseURldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciByZWYgPSBjdXJyZW50LnJlZjtcblxuICBpZiAocmVmICE9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIHJlZiwgbnVsbCwgbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICB2YXIgcmVmRXJyb3IgPSBjbGVhckNhdWdodEVycm9yKCk7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgcmVmRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSkge1xuICB7XG4gICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuXG4gICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgIHZhciBlcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcbiAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0QmVmb3JlTXV0YXRpb25MaWZlQ3ljbGVzKGN1cnJlbnQsIGZpbmlzaGVkV29yaykge1xuICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBCbG9jazpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgaWYgKGZpbmlzaGVkV29yay5mbGFncyAmIFNuYXBzaG90KSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgICB2YXIgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTsgLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgICAgLy8gYnV0IGluc3RlYWQgd2UgcmVseSBvbiB0aGVtIGJlaW5nIHNldCBkdXJpbmcgbGFzdCByZW5kZXIuXG4gICAgICAgICAgICAvLyBUT0RPOiByZXZpc2l0IHRoaXMgd2hlbiB3ZSBpbXBsZW1lbnQgcmVzdW1pbmcuXG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWYgKGZpbmlzaGVkV29yay50eXBlID09PSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgJiYgIWRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgcHJvcHMgdG8gbWF0Y2ggbWVtb2l6ZWQgcHJvcHMgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICBlcnJvcignRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlICcgKyAnZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNuYXBzaG90ID0gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlID09PSBmaW5pc2hlZFdvcmsudHlwZSA/IHByZXZQcm9wcyA6IHJlc29sdmVEZWZhdWx0UHJvcHMoZmluaXNoZWRXb3JrLnR5cGUsIHByZXZQcm9wcyksIHByZXZTdGF0ZSk7XG5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdmFyIGRpZFdhcm5TZXQgPSBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZTtcblxuICAgICAgICAgICAgICBpZiAoc25hcHNob3QgPT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblNldC5oYXMoZmluaXNoZWRXb3JrLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgZGlkV2FyblNldC5hZGQoZmluaXNoZWRXb3JrLnR5cGUpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3IoJyVzLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCk6IEEgc25hcHNob3QgdmFsdWUgKG9yIG51bGwpICcgKyAnbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IHNuYXBzaG90O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgU25hcHNob3QpIHtcbiAgICAgICAgICAgIHZhciByb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyKHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgIGNhc2UgSW5jb21wbGV0ZUNsYXNzQ29tcG9uZW50OlxuICAgICAgLy8gTm90aGluZyB0byBkbyBmb3IgdGhlc2UgY29tcG9uZW50IHR5cGVzXG4gICAgICByZXR1cm47XG4gIH1cblxuICB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiVGhpcyB1bml0IG9mIHdvcmsgdGFnIHNob3VsZCBub3QgaGF2ZSBzaWRlLWVmZmVjdHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KHRhZywgZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIGlmICgoZWZmZWN0LnRhZyAmIHRhZykgPT09IHRhZykge1xuICAgICAgICAvLyBVbm1vdW50XG4gICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkZXN0cm95ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgfSB3aGlsZSAoZWZmZWN0ICE9PSBmaXJzdEVmZmVjdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudCh0YWcsIGZpbmlzaGVkV29yaykge1xuICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gIHZhciBsYXN0RWZmZWN0ID0gdXBkYXRlUXVldWUgIT09IG51bGwgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcblxuICBpZiAobGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICB2YXIgZWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICBpZiAoKGVmZmVjdC50YWcgJiB0YWcpID09PSB0YWcpIHtcbiAgICAgICAgLy8gTW91bnRcbiAgICAgICAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gICAgICAgIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG5cbiAgICAgICAge1xuICAgICAgICAgIHZhciBkZXN0cm95ID0gZWZmZWN0LmRlc3Ryb3k7XG5cbiAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXN0cm95ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgYWRkZW5kdW0gPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIGlmIChkZXN0cm95ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQgbnVsbC4gSWYgeW91ciBlZmZlY3QgZG9lcyBub3QgcmVxdWlyZSBjbGVhbiAnICsgJ3VwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS4nO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGVzdHJveS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJ1xcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlIHVzZUVmZmVjdChhc3luYyAoKSA9PiAuLi4pIG9yIHJldHVybmVkIGEgUHJvbWlzZS4gJyArICdJbnN0ZWFkLCB3cml0ZSB0aGUgYXN5bmMgZnVuY3Rpb24gaW5zaWRlIHlvdXIgZWZmZWN0ICcgKyAnYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuJyArICd1c2VFZmZlY3QoKCkgPT4ge1xcbicgKyAnICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuJyArICcgICAgLy8gWW91IGNhbiBhd2FpdCBoZXJlXFxuJyArICcgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNeUFQSS5nZXREYXRhKHNvbWVJZCk7XFxuJyArICcgICAgLy8gLi4uXFxuJyArICcgIH1cXG4nICsgJyAgZmV0Y2hEYXRhKCk7XFxuJyArIFwifSwgW3NvbWVJZF0pOyAvLyBPciBbXSBpZiBlZmZlY3QgZG9lc24ndCBuZWVkIHByb3BzIG9yIHN0YXRlXFxuXFxuXCIgKyAnTGVhcm4gbW9yZSBhYm91dCBkYXRhIGZldGNoaW5nIHdpdGggSG9va3M6IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9ob29rcy1kYXRhLWZldGNoaW5nJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID0gJyBZb3UgcmV0dXJuZWQ6ICcgKyBkZXN0cm95O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlcnJvcignQW4gZWZmZWN0IGZ1bmN0aW9uIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sICcgKyAnd2hpY2ggaXMgdXNlZCBmb3IgY2xlYW4tdXAuJXMnLCBhZGRlbmR1bSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGVmZmVjdCA9IGVmZmVjdC5uZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcbiAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZSAhPT0gbnVsbCA/IHVwZGF0ZVF1ZXVlLmxhc3RFZmZlY3QgOiBudWxsO1xuXG4gIGlmIChsYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgIGRvIHtcbiAgICAgIHZhciBfZWZmZWN0ID0gZWZmZWN0LFxuICAgICAgICAgIG5leHQgPSBfZWZmZWN0Lm5leHQsXG4gICAgICAgICAgdGFnID0gX2VmZmVjdC50YWc7XG5cbiAgICAgIGlmICgodGFnICYgUGFzc2l2ZSQxKSAhPT0gTm9GbGFncyQxICYmICh0YWcgJiBIYXNFZmZlY3QpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdFVubW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgICBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0TW91bnQoZmluaXNoZWRXb3JrLCBlZmZlY3QpO1xuICAgICAgfVxuXG4gICAgICBlZmZlY3QgPSBuZXh0O1xuICAgIH0gd2hpbGUgKGVmZmVjdCAhPT0gZmlyc3RFZmZlY3QpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExpZmVDeWNsZXMoZmluaXNoZWRSb290LCBjdXJyZW50LCBmaW5pc2hlZFdvcmssIGNvbW1pdHRlZExhbmVzKSB7XG4gIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgY2FzZSBGb3J3YXJkUmVmOlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGxheW91dCBlZmZlY3RzIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCAoZHVyaW5nIG11dGF0aW9uIHBoYXNlKS5cbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIHRvIHByZXZlbnQgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KExheW91dCB8IEhhc0VmZmVjdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVkdWxlUGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmZsYWdzICYgVXBkYXRlKSB7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5wcm9wcyAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRNb3VudC4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMuc3RhdGVgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuZWxlbWVudFR5cGUgPT09IGZpbmlzaGVkV29yay50eXBlID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcmVzb2x2ZURlZmF1bHRQcm9wcyhmaW5pc2hlZFdvcmsudHlwZSwgY3VycmVudC5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7IC8vIFdlIGNvdWxkIHVwZGF0ZSBpbnN0YW5jZSBwcm9wcyBhbmQgc3RhdGUgaGVyZSxcbiAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIHdoZW4gd2UgaW1wbGVtZW50IHJlc3VtaW5nLlxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsudHlwZSA9PT0gZmluaXNoZWRXb3JrLmVsZW1lbnRUeXBlICYmICFkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykge1xuICAgICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdjb21wb25lbnREaWRVcGRhdGUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUsIGluc3RhbmNlLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cblxuXG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAodXBkYXRlUXVldWUgIT09IG51bGwpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLnR5cGUgPT09IGZpbmlzaGVkV29yay5lbGVtZW50VHlwZSAmJiAhZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcykge1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzKSB7XG4gICAgICAgICAgICAgICAgZXJyb3IoJ0V4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSAnICsgJ3Byb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gJyArICdUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlICcgKyAnYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiAnICsgJ1BsZWFzZSBmaWxlIGFuIGlzc3VlLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpIHx8ICdpbnN0YW5jZScpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGluc3RhbmNlLnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIGVycm9yKCdFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgJyArICdwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuICcgKyAnVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSAnICsgJ2EgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gJyArICdQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLCBnZXRDb21wb25lbnROYW1lKGZpbmlzaGVkV29yay50eXBlKSB8fCAnaW5zdGFuY2UnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gLy8gV2UgY291bGQgdXBkYXRlIGluc3RhbmNlIHByb3BzIGFuZCBzdGF0ZSBoZXJlLFxuICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlbSBiZWluZyBzZXQgZHVyaW5nIGxhc3QgcmVuZGVyLlxuICAgICAgICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyB3aGVuIHdlIGltcGxlbWVudCByZXN1bWluZy5cblxuXG4gICAgICAgICAgY29tbWl0VXBkYXRlUXVldWUoZmluaXNoZWRXb3JrLCB1cGRhdGVRdWV1ZSwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogSSB0aGluayB0aGlzIGlzIG5vdyBhbHdheXMgbm9uLW51bGwgYnkgdGhlIHRpbWUgaXQgcmVhY2hlcyB0aGVcbiAgICAgICAgLy8gY29tbWl0IHBoYXNlLiBDb25zaWRlciByZW1vdmluZyB0aGUgdHlwZSBjaGVjay5cbiAgICAgICAgdmFyIF91cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZTtcblxuICAgICAgICBpZiAoX3VwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IG51bGw7XG5cbiAgICAgICAgICBpZiAoZmluaXNoZWRXb3JrLmNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay5jaGlsZC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgICAgICAgIF9pbnN0YW5jZSA9IGdldFB1YmxpY0luc3RhbmNlKGZpbmlzaGVkV29yay5jaGlsZC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAgICAgICAgX2luc3RhbmNlID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb21taXRVcGRhdGVRdWV1ZShmaW5pc2hlZFdvcmssIF91cGRhdGVRdWV1ZSwgX2luc3RhbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlOyAvLyBSZW5kZXJlcnMgbWF5IHNjaGVkdWxlIHdvcmsgdG8gYmUgZG9uZSBhZnRlciBob3N0IGNvbXBvbmVudHMgYXJlIG1vdW50ZWRcbiAgICAgICAgLy8gKGVnIERPTSByZW5kZXJlciBtYXkgc2NoZWR1bGUgYXV0by1mb2N1cyBmb3IgaW5wdXRzIGFuZCBmb3JtIGNvbnRyb2xzKS5cbiAgICAgICAgLy8gVGhlc2UgZWZmZWN0cyBzaG91bGQgb25seSBiZSBjb21taXR0ZWQgd2hlbiBjb21wb25lbnRzIGFyZSBmaXJzdCBtb3VudGVkLFxuICAgICAgICAvLyBha2Egd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50L2FsdGVybmF0ZS5cblxuICAgICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCAmJiBmaW5pc2hlZFdvcmsuZmxhZ3MgJiBVcGRhdGUpIHtcbiAgICAgICAgICB2YXIgdHlwZSA9IGZpbmlzaGVkV29yay50eXBlO1xuICAgICAgICAgIHZhciBwcm9wcyA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgIGNvbW1pdE1vdW50KF9pbnN0YW5jZTIsIHR5cGUsIHByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFRleHQ6XG4gICAgICB7XG4gICAgICAgIC8vIFdlIGhhdmUgbm8gbGlmZS1jeWNsZXMgYXNzb2NpYXRlZCB3aXRoIHRleHQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2UgaGF2ZSBubyBsaWZlLWN5Y2xlcyBhc3NvY2lhdGVkIHdpdGggcG9ydGFscy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBQcm9maWxlcjpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIG9uQ29tbWl0ID0gX2ZpbmlzaGVkV29yayRtZW1vaXplMi5vbkNvbW1pdCxcbiAgICAgICAgICAgICAgb25SZW5kZXIgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLm9uUmVuZGVyO1xuICAgICAgICAgIHZhciBlZmZlY3REdXJhdGlvbiA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb247XG4gICAgICAgICAgdmFyIGNvbW1pdFRpbWUgPSBnZXRDb21taXRUaW1lKCk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIG9uUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9uUmVuZGVyKGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLmlkLCBjdXJyZW50ID09PSBudWxsID8gJ21vdW50JyA6ICd1cGRhdGUnLCBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sIGZpbmlzaGVkV29yay50cmVlQmFzZUR1cmF0aW9uLCBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLCBjb21taXRUaW1lLCBmaW5pc2hlZFJvb3QubWVtb2l6ZWRJbnRlcmFjdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlSHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgIGNhc2UgT2Zmc2NyZWVuQ29tcG9uZW50OlxuICAgIGNhc2UgTGVnYWN5SGlkZGVuQ29tcG9uZW50OlxuICAgICAgcmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKGZpbmlzaGVkV29yaywgaXNIaWRkZW4pIHtcbiAge1xuICAgIC8vIFdlIG9ubHkgaGF2ZSB0aGUgdG9wIEZpYmVyIHRoYXQgd2FzIGluc2VydGVkIGJ1dCB3ZSBuZWVkIHRvIHJlY3Vyc2UgZG93biBpdHNcbiAgICAvLyBjaGlsZHJlbiB0byBmaW5kIGFsbCB0aGUgdGVybWluYWwgbm9kZXMuXG4gICAgdmFyIG5vZGUgPSBmaW5pc2hlZFdvcms7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKG5vZGUudGFnID09PSBIb3N0Q29tcG9uZW50KSB7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IG5vZGUuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgICAgIGhpZGVJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5oaWRlSW5zdGFuY2Uobm9kZS5zdGF0ZU5vZGUsIG5vZGUubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobm9kZS50YWcgPT09IEhvc3RUZXh0KSB7XG4gICAgICAgIHZhciBfaW5zdGFuY2UzID0gbm9kZS5zdGF0ZU5vZGU7XG5cbiAgICAgICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICAgICAgaGlkZVRleHRJbnN0YW5jZShfaW5zdGFuY2UzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bmhpZGVUZXh0SW5zdGFuY2UoX2luc3RhbmNlMywgbm9kZS5tZW1vaXplZFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICgobm9kZS50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gTGVnYWN5SGlkZGVuQ29tcG9uZW50KSAmJiBub2RlLm1lbW9pemVkU3RhdGUgIT09IG51bGwgJiYgbm9kZSAhPT0gZmluaXNoZWRXb3JrKSA7IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gIHZhciByZWYgPSBmaW5pc2hlZFdvcmsucmVmO1xuXG4gIGlmIChyZWYgIT09IG51bGwpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgIHZhciBpbnN0YW5jZVRvVXNlO1xuXG4gICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICBjYXNlIEhvc3RDb21wb25lbnQ6XG4gICAgICAgIGluc3RhbmNlVG9Vc2UgPSBnZXRQdWJsaWNJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2U7XG4gICAgfSAvLyBNb3ZlZCBvdXRzaWRlIHRvIGVuc3VyZSBEQ0Ugd29ya3Mgd2l0aCB0aGlzIGZsYWdcblxuICAgIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZWYoaW5zdGFuY2VUb1VzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgaWYgKCFyZWYuaGFzT3duUHJvcGVydHkoJ2N1cnJlbnQnKSkge1xuICAgICAgICAgIGVycm9yKCdVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiAnICsgJ1VzZSBlaXRoZXIgYSByZWYtc2V0dGVyIGZ1bmN0aW9uIG9yIFJlYWN0LmNyZWF0ZVJlZigpLicsIGdldENvbXBvbmVudE5hbWUoZmluaXNoZWRXb3JrLnR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2U7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdERldGFjaFJlZihjdXJyZW50KSB7XG4gIHZhciBjdXJyZW50UmVmID0gY3VycmVudC5yZWY7XG5cbiAgaWYgKGN1cnJlbnRSZWYgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZW9mIGN1cnJlbnRSZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRSZWYobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICB9XG59IC8vIFVzZXItb3JpZ2luYXRpbmcgZXJyb3JzIChsaWZlY3ljbGVzIGFuZCByZWZzKSBzaG91bGQgbm90IGludGVycnVwdFxuLy8gZGVsZXRpb24sIHNvIGRvbid0IGxldCB0aGVtIHRocm93LiBIb3N0LW9yaWdpbmF0aW5nIGVycm9ycyBzaG91bGRcbi8vIGludGVycnVwdCBkZWxldGlvbiwgc28gaXQncyBva2F5XG5cblxuZnVuY3Rpb24gY29tbWl0VW5tb3VudChmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgb25Db21taXRVbm1vdW50KGN1cnJlbnQpO1xuXG4gIHN3aXRjaCAoY3VycmVudC50YWcpIHtcbiAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgQmxvY2s6XG4gICAgICB7XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7XG5cbiAgICAgICAgaWYgKHVwZGF0ZVF1ZXVlICE9PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGxhc3RFZmZlY3QgPSB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0O1xuXG4gICAgICAgICAgaWYgKGxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmaXJzdEVmZmVjdCA9IGxhc3RFZmZlY3QubmV4dDtcbiAgICAgICAgICAgIHZhciBlZmZlY3QgPSBmaXJzdEVmZmVjdDtcblxuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICB2YXIgX2VmZmVjdDIgPSBlZmZlY3QsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95ID0gX2VmZmVjdDIuZGVzdHJveSxcbiAgICAgICAgICAgICAgICAgIHRhZyA9IF9lZmZlY3QyLnRhZztcblxuICAgICAgICAgICAgICBpZiAoZGVzdHJveSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCh0YWcgJiBQYXNzaXZlJDEpICE9PSBOb0ZsYWdzJDEpIHtcbiAgICAgICAgICAgICAgICAgIGVucXVldWVQZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RVbm1vdW50KGN1cnJlbnQsIGVmZmVjdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2FmZWx5Q2FsbERlc3Ryb3koY3VycmVudCwgZGVzdHJveSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZWZmZWN0ID0gZWZmZWN0Lm5leHQ7XG4gICAgICAgICAgICB9IHdoaWxlIChlZmZlY3QgIT09IGZpcnN0RWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHZhciBpbnN0YW5jZSA9IGN1cnJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFVubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzYWZlbHlDYWxsQ29tcG9uZW50V2lsbFVubW91bnQoY3VycmVudCwgaW5zdGFuY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFBvcnRhbDpcbiAgICAgIHtcbiAgICAgICAgLy8gVE9ETzogdGhpcyBpcyByZWN1cnNpdmUuXG4gICAgICAgIC8vIFdlIGFyZSBhbHNvIG5vdCB1c2luZyB0aGlzIHBhcmVudCBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSBwb3J0YWwgd2lsbCBnZXQgcHVzaGVkIGltbWVkaWF0ZWx5LlxuICAgICAgICB7XG4gICAgICAgICAgdW5tb3VudEhvc3RDb21wb25lbnRzKGZpbmlzaGVkUm9vdCwgY3VycmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICBjYXNlIEZ1bmRhbWVudGFsQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRGVoeWRyYXRlZEZyYWdtZW50OlxuICAgICAge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU2NvcGVDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgcm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBXaGlsZSB3ZSdyZSBpbnNpZGUgYSByZW1vdmVkIGhvc3Qgbm9kZSB3ZSBkb24ndCB3YW50IHRvIGNhbGxcbiAgLy8gcmVtb3ZlQ2hpbGQgb24gdGhlIGlubmVyIG5vZGVzIGJlY2F1c2UgdGhleSdyZSByZW1vdmVkIGJ5IHRoZSB0b3BcbiAgLy8gY2FsbCBhbnl3YXkuIFdlIGFsc28gd2FudCB0byBjYWxsIGNvbXBvbmVudFdpbGxVbm1vdW50IG9uIGFsbFxuICAvLyBjb21wb3NpdGVzIGJlZm9yZSB0aGlzIGhvc3Qgbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZXJlZm9yZVxuICAvLyB3ZSBkbyBhbiBpbm5lciBsb29wIHdoaWxlIHdlJ3JlIHN0aWxsIGluc2lkZSB0aGUgaG9zdCBub2RlLlxuICB2YXIgbm9kZSA9IHJvb3Q7XG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb21taXRVbm1vdW50KGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIFZpc2l0IGNoaWxkcmVuIGJlY2F1c2UgdGhleSBtYXkgY29udGFpbiBtb3JlIGNvbXBvc2l0ZSBvciBob3N0IG5vZGVzLlxuICAgIC8vIFNraXAgcG9ydGFscyBiZWNhdXNlIGNvbW1pdFVubW91bnQoKSBjdXJyZW50bHkgdmlzaXRzIHRoZW0gcmVjdXJzaXZlbHkuXG5cbiAgICBpZiAobm9kZS5jaGlsZCAhPT0gbnVsbCAmJiAoIC8vIElmIHdlIHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyB1c2luZyBjb21taXRVbm1vdW50IGFib3ZlLlxuICAgIC8vIElmIHdlIGRvbid0IHVzZSBtdXRhdGlvbiB3ZSBkcmlsbCBkb3duIGludG8gcG9ydGFscyBoZXJlIGluc3RlYWQuXG4gICAgIG5vZGUudGFnICE9PSBIb3N0UG9ydGFsKSkge1xuICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgbm9kZSA9IG5vZGUuY2hpbGQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZSA9PT0gcm9vdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdoaWxlIChub2RlLnNpYmxpbmcgPT09IG51bGwpIHtcbiAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gcm9vdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRhY2hGaWJlck11dGF0aW9uKGZpYmVyKSB7XG4gIC8vIEN1dCBvZmYgdGhlIHJldHVybiBwb2ludGVycyB0byBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHRyZWUuIElkZWFsbHksIHdlXG4gIC8vIHNob3VsZCBjbGVhciB0aGUgY2hpbGQgcG9pbnRlciBvZiB0aGUgcGFyZW50IGFsdGVybmF0ZSB0byBsZXQgdGhpc1xuICAvLyBnZXQgR0M6ZWQgYnV0IHdlIGRvbid0IGtub3cgd2hpY2ggZm9yIHN1cmUgd2hpY2ggcGFyZW50IGlzIHRoZSBjdXJyZW50XG4gIC8vIG9uZSBzbyB3ZSdsbCBzZXR0bGUgZm9yIEdDOmluZyB0aGUgc3VidHJlZSBvZiB0aGlzIGNoaWxkLiBUaGlzIGNoaWxkXG4gIC8vIGl0c2VsZiB3aWxsIGJlIEdDOmVkIHdoZW4gdGhlIHBhcmVudCB1cGRhdGVzIHRoZSBuZXh0IHRpbWUuXG4gIC8vIE5vdGU6IHdlIGNhbm5vdCBudWxsIG91dCBzaWJsaW5nIGhlcmUsIG90aGVyd2lzZSBpdCBjYW4gY2F1c2UgaXNzdWVzXG4gIC8vIHdpdGggZmluZERPTU5vZGUgYW5kIGhvdyBpdCByZXF1aXJlcyB0aGUgc2libGluZyBmaWVsZCB0byBjYXJyeSBvdXRcbiAgLy8gdHJhdmVyc2FsIGluIGEgbGF0ZXIgZWZmZWN0LiBTZWUgUFIgIzE2ODIwLiBXZSBub3cgY2xlYXIgdGhlIHNpYmxpbmdcbiAgLy8gZmllbGQgYWZ0ZXIgZWZmZWN0cywgc2VlOiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cy5cbiAgLy9cbiAgLy8gRG9uJ3QgZGlzY29ubmVjdCBzdGF0ZU5vZGUgbm93OyBpdCB3aWxsIGJlIGRldGFjaGVkIGluIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzLlxuICAvLyBJdCBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGN1cnJlbnQgY29tcG9uZW50IGlzIGFuIGVycm9yIGJvdW5kYXJ5LFxuICAvLyBhbmQgb25lIG9mIGl0cyBkZXNjZW5kYW50cyB0aHJvd3Mgd2hpbGUgdW5tb3VudGluZyBhIHBhc3NpdmUgZWZmZWN0LlxuICBmaWJlci5hbHRlcm5hdGUgPSBudWxsO1xuICBmaWJlci5jaGlsZCA9IG51bGw7XG4gIGZpYmVyLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gIGZpYmVyLmZpcnN0RWZmZWN0ID0gbnVsbDtcbiAgZmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICBmaWJlci5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgZmliZXIucGVuZGluZ1Byb3BzID0gbnVsbDtcbiAgZmliZXIucmV0dXJuID0gbnVsbDtcbiAgZmliZXIudXBkYXRlUXVldWUgPSBudWxsO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFBhcmVudEZpYmVyKGZpYmVyKSB7XG4gIHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47XG5cbiAgd2hpbGUgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc0hvc3RQYXJlbnQocGFyZW50KSkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgcmV0dXJuIGZpYmVyLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBmaWJlci50YWcgPT09IEhvc3RSb290IHx8IGZpYmVyLnRhZyA9PT0gSG9zdFBvcnRhbDtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFNpYmxpbmcoZmliZXIpIHtcbiAgLy8gV2UncmUgZ29pbmcgdG8gc2VhcmNoIGZvcndhcmQgaW50byB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgc2libGluZyBob3N0XG4gIC8vIG5vZGUuIFVuZm9ydHVuYXRlbHksIGlmIG11bHRpcGxlIGluc2VydGlvbnMgYXJlIGRvbmUgaW4gYSByb3cgd2UgaGF2ZSB0b1xuICAvLyBzZWFyY2ggcGFzdCB0aGVtLiBUaGlzIGxlYWRzIHRvIGV4cG9uZW50aWFsIHNlYXJjaCBmb3IgdGhlIG5leHQgc2libGluZy5cbiAgLy8gVE9ETzogRmluZCBhIG1vcmUgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLlxuICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gIHNpYmxpbmdzOiB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nLCBsZXQncyB0cnkgdGhlIG5leHQgc2libGluZy5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgaXNIb3N0UGFyZW50KG5vZGUucmV0dXJuKSkge1xuICAgICAgICAvLyBJZiB3ZSBwb3Agb3V0IG9mIHRoZSByb290IG9yIGhpdCB0aGUgcGFyZW50IHRoZSBmaWJlciB3ZSBhcmUgdGhlXG4gICAgICAgIC8vIGxhc3Qgc2libGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcblxuICAgIHdoaWxlIChub2RlLnRhZyAhPT0gSG9zdENvbXBvbmVudCAmJiBub2RlLnRhZyAhPT0gSG9zdFRleHQgJiYgbm9kZS50YWcgIT09IERlaHlkcmF0ZWRGcmFnbWVudCkge1xuICAgICAgLy8gSWYgaXQgaXMgbm90IGhvc3Qgbm9kZSBhbmQsIHdlIG1pZ2h0IGhhdmUgYSBob3N0IG5vZGUgaW5zaWRlIGl0LlxuICAgICAgLy8gVHJ5IHRvIHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgb25lLlxuICAgICAgaWYgKG5vZGUuZmxhZ3MgJiBQbGFjZW1lbnQpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIGNoaWxkLCB0cnkgdGhlIHNpYmxpbmdzIGluc3RlYWQuXG4gICAgICAgIGNvbnRpbnVlIHNpYmxpbmdzO1xuICAgICAgfSAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgY2hpbGQsIHRyeSB0aGUgc2libGluZ3MgaW5zdGVhZC5cbiAgICAgIC8vIFdlIGFsc28gc2tpcCBwb3J0YWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhpcyBob3N0IHRyZWUuXG5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgPT09IG51bGwgfHwgbm9kZS50YWcgPT09IEhvc3RQb3J0YWwpIHtcbiAgICAgICAgY29udGludWUgc2libGluZ3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmNoaWxkLnJldHVybiA9IG5vZGU7XG4gICAgICAgIG5vZGUgPSBub2RlLmNoaWxkO1xuICAgICAgfVxuICAgIH0gLy8gQ2hlY2sgaWYgdGhpcyBob3N0IG5vZGUgaXMgc3RhYmxlIG9yIGFib3V0IHRvIGJlIHBsYWNlZC5cblxuXG4gICAgaWYgKCEobm9kZS5mbGFncyAmIFBsYWNlbWVudCkpIHtcbiAgICAgIC8vIEZvdW5kIGl0IVxuICAgICAgcmV0dXJuIG5vZGUuc3RhdGVOb2RlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRQbGFjZW1lbnQoZmluaXNoZWRXb3JrKSB7XG5cblxuICB2YXIgcGFyZW50RmliZXIgPSBnZXRIb3N0UGFyZW50RmliZXIoZmluaXNoZWRXb3JrKTsgLy8gTm90ZTogdGhlc2UgdHdvIHZhcmlhYmxlcyAqbXVzdCogYWx3YXlzIGJlIHVwZGF0ZWQgdG9nZXRoZXIuXG5cbiAgdmFyIHBhcmVudDtcbiAgdmFyIGlzQ29udGFpbmVyO1xuICB2YXIgcGFyZW50U3RhdGVOb2RlID0gcGFyZW50RmliZXIuc3RhdGVOb2RlO1xuXG4gIHN3aXRjaCAocGFyZW50RmliZXIudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcGFyZW50ID0gcGFyZW50U3RhdGVOb2RlO1xuICAgICAgaXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIb3N0Um9vdDpcbiAgICAgIHBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgaXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICBwYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgIGlzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGdW5kYW1lbnRhbENvbXBvbmVudDpcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZS1uby1mYWxsdGhyb3VnaFxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIH1cblxuICBpZiAocGFyZW50RmliZXIuZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAvLyBSZXNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBwYXJlbnQgYmVmb3JlIGRvaW5nIGFueSBpbnNlcnRpb25zXG4gICAgcmVzZXRUZXh0Q29udGVudChwYXJlbnQpOyAvLyBDbGVhciBDb250ZW50UmVzZXQgZnJvbSB0aGUgZWZmZWN0IHRhZ1xuXG4gICAgcGFyZW50RmliZXIuZmxhZ3MgJj0gfkNvbnRlbnRSZXNldDtcbiAgfVxuXG4gIHZhciBiZWZvcmUgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspOyAvLyBXZSBvbmx5IGhhdmUgdGhlIHRvcCBGaWJlciB0aGF0IHdhcyBpbnNlcnRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cblxuICBpZiAoaXNDb250YWluZXIpIHtcbiAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGZpbmlzaGVkV29yaywgYmVmb3JlLCBwYXJlbnQpO1xuICB9IGVsc2Uge1xuICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShmaW5pc2hlZFdvcmssIGJlZm9yZSwgcGFyZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKG5vZGUsIGJlZm9yZSwgcGFyZW50KSB7XG4gIHZhciB0YWcgPSBub2RlLnRhZztcbiAgdmFyIGlzSG9zdCA9IHRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCB0YWcgPT09IEhvc3RUZXh0O1xuXG4gIGlmIChpc0hvc3QgfHwgZW5hYmxlRnVuZGFtZW50YWxBUEkgKSB7XG4gICAgdmFyIHN0YXRlTm9kZSA9IGlzSG9zdCA/IG5vZGUuc3RhdGVOb2RlIDogbm9kZS5zdGF0ZU5vZGUuaW5zdGFuY2U7XG5cbiAgICBpZiAoYmVmb3JlKSB7XG4gICAgICBpbnNlcnRJbkNvbnRhaW5lckJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihwYXJlbnQsIHN0YXRlTm9kZSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRhZyA9PT0gSG9zdFBvcnRhbCkgOyBlbHNlIHtcbiAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkO1xuXG4gICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGVJbnRvQ29udGFpbmVyKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoc2libGluZywgYmVmb3JlLCBwYXJlbnQpO1xuICAgICAgICBzaWJsaW5nID0gc2libGluZy5zaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUobm9kZSwgYmVmb3JlLCBwYXJlbnQpIHtcbiAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICB2YXIgaXNIb3N0ID0gdGFnID09PSBIb3N0Q29tcG9uZW50IHx8IHRhZyA9PT0gSG9zdFRleHQ7XG5cbiAgaWYgKGlzSG9zdCB8fCBlbmFibGVGdW5kYW1lbnRhbEFQSSApIHtcbiAgICB2YXIgc3RhdGVOb2RlID0gaXNIb3N0ID8gbm9kZS5zdGF0ZU5vZGUgOiBub2RlLnN0YXRlTm9kZS5pbnN0YW5jZTtcblxuICAgIGlmIChiZWZvcmUpIHtcbiAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIHN0YXRlTm9kZSwgYmVmb3JlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwZW5kQ2hpbGQocGFyZW50LCBzdGF0ZU5vZGUpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0YWcgPT09IEhvc3RQb3J0YWwpIDsgZWxzZSB7XG4gICAgdmFyIGNoaWxkID0gbm9kZS5jaGlsZDtcblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlKGNoaWxkLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICB2YXIgc2libGluZyA9IGNoaWxkLnNpYmxpbmc7XG5cbiAgICAgIHdoaWxlIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShzaWJsaW5nLCBiZWZvcmUsIHBhcmVudCk7XG4gICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHVubW91bnRIb3N0Q29tcG9uZW50cyhmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAgLy8gV2Ugb25seSBoYXZlIHRoZSB0b3AgRmliZXIgdGhhdCB3YXMgZGVsZXRlZCBidXQgd2UgbmVlZCB0byByZWN1cnNlIGRvd24gaXRzXG4gIC8vIGNoaWxkcmVuIHRvIGZpbmQgYWxsIHRoZSB0ZXJtaW5hbCBub2Rlcy5cbiAgdmFyIG5vZGUgPSBjdXJyZW50OyAvLyBFYWNoIGl0ZXJhdGlvbiwgY3VycmVudFBhcmVudCBpcyBwb3B1bGF0ZWQgd2l0aCBub2RlJ3MgaG9zdCBwYXJlbnQgaWYgbm90XG4gIC8vIGN1cnJlbnRQYXJlbnRJc1ZhbGlkLlxuXG4gIHZhciBjdXJyZW50UGFyZW50SXNWYWxpZCA9IGZhbHNlOyAvLyBOb3RlOiB0aGVzZSB0d28gdmFyaWFibGVzICptdXN0KiBhbHdheXMgYmUgdXBkYXRlZCB0b2dldGhlci5cblxuICB2YXIgY3VycmVudFBhcmVudDtcbiAgdmFyIGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcjtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmICghY3VycmVudFBhcmVudElzVmFsaWQpIHtcbiAgICAgIHZhciBwYXJlbnQgPSBub2RlLnJldHVybjtcblxuICAgICAgZmluZFBhcmVudDogd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKCEocGFyZW50ICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwYXJlbnRTdGF0ZU5vZGUgPSBwYXJlbnQuc3RhdGVOb2RlO1xuXG4gICAgICAgIHN3aXRjaCAocGFyZW50LnRhZykge1xuICAgICAgICAgIGNhc2UgSG9zdENvbXBvbmVudDpcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwYXJlbnRTdGF0ZU5vZGU7XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudFN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICAgICAgY3VycmVudFBhcmVudElzQ29udGFpbmVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrIGZpbmRQYXJlbnQ7XG5cbiAgICAgICAgICBjYXNlIEhvc3RQb3J0YWw6XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcGFyZW50U3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWsgZmluZFBhcmVudDtcblxuICAgICAgICB9XG5cbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCB8fCBub2RlLnRhZyA9PT0gSG9zdFRleHQpIHtcbiAgICAgIGNvbW1pdE5lc3RlZFVubW91bnRzKGZpbmlzaGVkUm9vdCwgbm9kZSk7IC8vIEFmdGVyIGFsbCB0aGUgY2hpbGRyZW4gaGF2ZSB1bm1vdW50ZWQsIGl0IGlzIG5vdyBzYWZlIHRvIHJlbW92ZSB0aGVcbiAgICAgIC8vIG5vZGUgZnJvbSB0aGUgdHJlZS5cblxuICAgICAgaWYgKGN1cnJlbnRQYXJlbnRJc0NvbnRhaW5lcikge1xuICAgICAgICByZW1vdmVDaGlsZEZyb21Db250YWluZXIoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtb3ZlQ2hpbGQoY3VycmVudFBhcmVudCwgbm9kZS5zdGF0ZU5vZGUpO1xuICAgICAgfSAvLyBEb24ndCB2aXNpdCBjaGlsZHJlbiBiZWNhdXNlIHdlIGFscmVhZHkgdmlzaXRlZCB0aGVtLlxuXG4gICAgfSBlbHNlIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2hlbiB3ZSBnbyBpbnRvIGEgcG9ydGFsLCBpdCBiZWNvbWVzIHRoZSBwYXJlbnQgdG8gcmVtb3ZlIGZyb20uXG4gICAgICAgIC8vIFdlIHdpbGwgcmVhc3NpZ24gaXQgYmFjayB3aGVuIHdlIHBvcCB0aGUgcG9ydGFsIG9uIHRoZSB3YXkgdXAuXG4gICAgICAgIGN1cnJlbnRQYXJlbnQgPSBub2RlLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO1xuICAgICAgICBjdXJyZW50UGFyZW50SXNDb250YWluZXIgPSB0cnVlOyAvLyBWaXNpdCBjaGlsZHJlbiBiZWNhdXNlIHBvcnRhbHMgbWlnaHQgY29udGFpbiBob3N0IGNvbXBvbmVudHMuXG5cbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbW1pdFVubW91bnQoZmluaXNoZWRSb290LCBub2RlKTsgLy8gVmlzaXQgY2hpbGRyZW4gYmVjYXVzZSB3ZSBtYXkgZmluZCBtb3JlIGhvc3QgY29tcG9uZW50cyBiZWxvdy5cblxuICAgICAgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgPT09IGN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICBpZiAobm9kZS5yZXR1cm4gPT09IG51bGwgfHwgbm9kZS5yZXR1cm4gPT09IGN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlID0gbm9kZS5yZXR1cm47XG5cbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdFBvcnRhbCkge1xuICAgICAgICAvLyBXaGVuIHdlIGdvIG91dCBvZiB0aGUgcG9ydGFsLCB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHBhcmVudC5cbiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga2VlcCBhIHN0YWNrIG9mIHRoZW0sIHdlIHdpbGwgc2VhcmNoIGZvciBpdC5cbiAgICAgICAgY3VycmVudFBhcmVudElzVmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXREZWxldGlvbihmaW5pc2hlZFJvb3QsIGN1cnJlbnQsIHJlbmRlclByaW9yaXR5TGV2ZWwpIHtcbiAge1xuICAgIC8vIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgaG9zdCBub2RlcyBmcm9tIHRoZSBwYXJlbnQuXG4gICAgLy8gRGV0YWNoIHJlZnMgYW5kIGNhbGwgY29tcG9uZW50V2lsbFVubW91bnQoKSBvbiB0aGUgd2hvbGUgc3VidHJlZS5cbiAgICB1bm1vdW50SG9zdENvbXBvbmVudHMoZmluaXNoZWRSb290LCBjdXJyZW50KTtcbiAgfVxuXG4gIHZhciBhbHRlcm5hdGUgPSBjdXJyZW50LmFsdGVybmF0ZTtcbiAgZGV0YWNoRmliZXJNdXRhdGlvbihjdXJyZW50KTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgZGV0YWNoRmliZXJNdXRhdGlvbihhbHRlcm5hdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdFdvcmsoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG5cbiAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgY2FzZSBGdW5jdGlvbkNvbXBvbmVudDpcbiAgICBjYXNlIEZvcndhcmRSZWY6XG4gICAgY2FzZSBNZW1vQ29tcG9uZW50OlxuICAgIGNhc2UgU2ltcGxlTWVtb0NvbXBvbmVudDpcbiAgICBjYXNlIEJsb2NrOlxuICAgICAge1xuICAgICAgICAvLyBMYXlvdXQgZWZmZWN0cyBhcmUgZGVzdHJveWVkIGR1cmluZyB0aGUgbXV0YXRpb24gcGhhc2Ugc28gdGhhdCBhbGxcbiAgICAgICAgLy8gZGVzdHJveSBmdW5jdGlvbnMgZm9yIGFsbCBmaWJlcnMgYXJlIGNhbGxlZCBiZWZvcmUgYW55IGNyZWF0ZSBmdW5jdGlvbnMuXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgc2libGluZyBjb21wb25lbnQgZWZmZWN0cyBmcm9tIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlcixcbiAgICAgICAgLy8gZS5nLiBhIGRlc3Ryb3kgZnVuY3Rpb24gaW4gb25lIGNvbXBvbmVudCBzaG91bGQgbmV2ZXIgb3ZlcnJpZGUgYSByZWYgc2V0XG4gICAgICAgIC8vIGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50IGR1cmluZyB0aGUgc2FtZSBjb21taXQuXG4gICAgICAgIHtcbiAgICAgICAgICBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoTGF5b3V0IHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAge1xuICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgIGlmIChpbnN0YW5jZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29tbWl0IHRoZSB3b3JrIHByZXBhcmVkIGVhcmxpZXIuXG4gICAgICAgICAgdmFyIG5ld1Byb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgICAvLyBhcyB0aGUgbmV3UHJvcHMuIFRoZSB1cGRhdGVQYXlsb2FkIHdpbGwgY29udGFpbiB0aGUgcmVhbCBjaGFuZ2UgaW5cbiAgICAgICAgICAvLyB0aGlzIGNhc2UuXG5cbiAgICAgICAgICB2YXIgb2xkUHJvcHMgPSBjdXJyZW50ICE9PSBudWxsID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogbmV3UHJvcHM7XG4gICAgICAgICAgdmFyIHR5cGUgPSBmaW5pc2hlZFdvcmsudHlwZTsgLy8gVE9ETzogVHlwZSB0aGUgdXBkYXRlUXVldWUgdG8gYmUgc3BlY2lmaWMgdG8gaG9zdCBjb21wb25lbnRzLlxuXG4gICAgICAgICAgdmFyIHVwZGF0ZVBheWxvYWQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgICAgICAgIGlmICh1cGRhdGVQYXlsb2FkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21taXRVcGRhdGUoaW5zdGFuY2UsIHVwZGF0ZVBheWxvYWQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBIb3N0VGV4dDpcbiAgICAgIHtcbiAgICAgICAgaWYgKCEoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAhPT0gbnVsbCkpIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHNob3VsZCBoYXZlIGEgdGV4dCBub2RlIGluaXRpYWxpemVkLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRleHRJbnN0YW5jZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgIHZhciBuZXdUZXh0ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7IC8vIEZvciBoeWRyYXRpb24gd2UgcmV1c2UgdGhlIHVwZGF0ZSBwYXRoIGJ1dCB3ZSB0cmVhdCB0aGUgb2xkUHJvcHNcbiAgICAgICAgLy8gYXMgdGhlIG5ld1Byb3BzLiBUaGUgdXBkYXRlUGF5bG9hZCB3aWxsIGNvbnRhaW4gdGhlIHJlYWwgY2hhbmdlIGluXG4gICAgICAgIC8vIHRoaXMgY2FzZS5cblxuICAgICAgICB2YXIgb2xkVGV4dCA9IGN1cnJlbnQgIT09IG51bGwgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBuZXdUZXh0O1xuICAgICAgICBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgSG9zdFJvb3Q6XG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgX3Jvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuXG4gICAgICAgICAgaWYgKF9yb290Lmh5ZHJhdGUpIHtcbiAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgaHlkcmF0ZWQuIE5vIG5lZWQgdG8gaHlkcmF0ZSBhZ2Fpbi5cbiAgICAgICAgICAgIF9yb290Lmh5ZHJhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQ29udGFpbmVyKF9yb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgUHJvZmlsZXI6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgU3VzcGVuc2VDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGNvbW1pdFN1c3BlbnNlQ29tcG9uZW50KGZpbmlzaGVkV29yayk7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBTdXNwZW5zZUxpc3RDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgY2FzZSBJbmNvbXBsZXRlQ2xhc3NDb21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgIGNhc2UgRnVuZGFtZW50YWxDb21wb25lbnQ6XG4gICAgICB7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFNjb3BlQ29tcG9uZW50OlxuICAgICAge1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgY2FzZSBPZmZzY3JlZW5Db21wb25lbnQ6XG4gICAgY2FzZSBMZWdhY3lIaWRkZW5Db21wb25lbnQ6XG4gICAgICB7XG4gICAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgICB2YXIgaXNIaWRkZW4gPSBuZXdTdGF0ZSAhPT0gbnVsbDtcbiAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmluaXNoZWRXb3JrLCBpc0hpZGRlbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgfVxuXG4gIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUaGlzIHVuaXQgb2Ygd29yayB0YWcgc2hvdWxkIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRTdXNwZW5zZUNvbXBvbmVudChmaW5pc2hlZFdvcmspIHtcbiAgdmFyIG5ld1N0YXRlID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG5cbiAgaWYgKG5ld1N0YXRlICE9PSBudWxsKSB7XG4gICAgbWFya0NvbW1pdFRpbWVPZkZhbGxiYWNrKCk7XG5cbiAgICB7XG4gICAgICAvLyBIaWRlIHRoZSBPZmZzY3JlZW4gY29tcG9uZW50IHRoYXQgY29udGFpbnMgdGhlIHByaW1hcnkgY2hpbGRyZW4uIFRPRE86XG4gICAgICAvLyBJZGVhbGx5LCB0aGlzIGVmZmVjdCB3b3VsZCBoYXZlIGJlZW4gc2NoZWR1bGVkIG9uIHRoZSBPZmZzY3JlZW4gZmliZXJcbiAgICAgIC8vIGl0c2VsZi4gVGhhdCdzIGhvdyB1bmhpZGluZyB3b3JrczogdGhlIE9mZnNjcmVlbiBjb21wb25lbnQgc2NoZWR1bGVzIGFuXG4gICAgICAvLyBlZmZlY3Qgb24gaXRzZWxmLiBIb3dldmVyLCBpbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgZGlkbid0IGNvbXBsZXRlLFxuICAgICAgLy8gc28gdGhlIGZpYmVyIHdhcyBuZXZlciBhZGRlZCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIG5vcm1hbCBwYXRoLiBXZVxuICAgICAgLy8gY291bGQgaGF2ZSBhcHBlbmRlZCBpdCB0byB0aGUgZWZmZWN0IGxpc3QgaW4gdGhlIFN1c3BlbnNlIGNvbXBvbmVudCdzXG4gICAgICAvLyBzZWNvbmQgcGFzcywgYnV0IGRvaW5nIGl0IHRoaXMgd2F5IGlzIGxlc3MgY29tcGxpY2F0ZWQuIFRoaXMgd291bGQgYmVcbiAgICAgIC8vIHNpbXBsZXIgaWYgd2UgZ290IHJpZCBvZiB0aGUgZWZmZWN0IGxpc3QgYW5kIHRyYXZlcnNlZCB0aGUgdHJlZSwgbGlrZVxuICAgICAgLy8gd2UncmUgcGxhbm5pbmcgdG8gZG8uXG4gICAgICB2YXIgcHJpbWFyeUNoaWxkUGFyZW50ID0gZmluaXNoZWRXb3JrLmNoaWxkO1xuICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4ocHJpbWFyeUNoaWxkUGFyZW50LCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcblxuICB2YXIgbmV3U3RhdGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAobmV3U3RhdGUgPT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGU7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgdmFyIHByZXZTdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcblxuICAgICAgaWYgKHByZXZTdGF0ZSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgc3VzcGVuc2VJbnN0YW5jZSA9IHByZXZTdGF0ZS5kZWh5ZHJhdGVkO1xuXG4gICAgICAgIGlmIChzdXNwZW5zZUluc3RhbmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgY29tbWl0SHlkcmF0ZWRTdXNwZW5zZUluc3RhbmNlKHN1c3BlbnNlSW5zdGFuY2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrKSB7XG4gIC8vIElmIHRoaXMgYm91bmRhcnkganVzdCB0aW1lZCBvdXQsIHRoZW4gaXQgd2lsbCBoYXZlIGEgc2V0IG9mIHdha2VhYmxlcy5cbiAgLy8gRm9yIGVhY2ggd2FrZWFibGUsIGF0dGFjaCBhIGxpc3RlbmVyIHNvIHRoYXQgd2hlbiBpdCByZXNvbHZlcywgUmVhY3RcbiAgLy8gYXR0ZW1wdHMgdG8gcmUtcmVuZGVyIHRoZSBib3VuZGFyeSBpbiB0aGUgcHJpbWFyeSAocHJlLXRpbWVvdXQpIHN0YXRlLlxuICB2YXIgd2FrZWFibGVzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuXG4gIGlmICh3YWtlYWJsZXMgIT09IG51bGwpIHtcbiAgICBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHZhciByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcblxuICAgIGlmIChyZXRyeUNhY2hlID09PSBudWxsKSB7XG4gICAgICByZXRyeUNhY2hlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgIC8vIE1lbW9pemUgdXNpbmcgdGhlIGJvdW5kYXJ5IGZpYmVyIHRvIHByZXZlbnQgcmVkdW5kYW50IGxpc3RlbmVycy5cbiAgICAgIHZhciByZXRyeSA9IHJlc29sdmVSZXRyeVdha2VhYmxlLmJpbmQobnVsbCwgZmluaXNoZWRXb3JrLCB3YWtlYWJsZSk7XG5cbiAgICAgIGlmICghcmV0cnlDYWNoZS5oYXMod2FrZWFibGUpKSB7XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAod2FrZWFibGUuX19yZWFjdERvTm90VHJhY2VJbnRlcmFjdGlvbnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHJ5ID0gdHJhY2luZy51bnN0YWJsZV93cmFwKHJldHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG4gICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgd2hlbiBhIFN1c3BlbnNlIGJvdW5kYXJ5IGdvZXMgZnJvbSB2aXNpYmxlIHRvIGhpZGRlbi5cbi8vIEl0IHJldHVybnMgZmFsc2UgaWYgdGhlIGJvdW5kYXJ5IGlzIGFscmVhZHkgaGlkZGVuLlxuLy8gVE9ETzogVXNlIGFuIGVmZmVjdCB0YWcuXG5cblxuZnVuY3Rpb24gaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgdmFyIG9sZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuXG4gICAgaWYgKG9sZFN0YXRlID09PSBudWxsIHx8IG9sZFN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIG5ld1N0YXRlICE9PSBudWxsICYmIG5ld1N0YXRlLmRlaHlkcmF0ZWQgPT09IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjb21taXRSZXNldFRleHRDb250ZW50KGN1cnJlbnQpIHtcblxuICByZXNldFRleHRDb250ZW50KGN1cnJlbnQuc3RhdGVOb2RlKTtcbn1cblxudmFyIENPTVBPTkVOVF9UWVBFID0gMDtcbnZhciBIQVNfUFNFVURPX0NMQVNTX1RZUEUgPSAxO1xudmFyIFJPTEVfVFlQRSA9IDI7XG52YXIgVEVTVF9OQU1FX1RZUEUgPSAzO1xudmFyIFRFWFRfVFlQRSA9IDQ7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciQxID0gU3ltYm9sLmZvcjtcbiAgQ09NUE9ORU5UX1RZUEUgPSBzeW1ib2xGb3IkMSgnc2VsZWN0b3IuY29tcG9uZW50Jyk7XG4gIEhBU19QU0VVRE9fQ0xBU1NfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5oYXNfcHNldWRvX2NsYXNzJyk7XG4gIFJPTEVfVFlQRSA9IHN5bWJvbEZvciQxKCdzZWxlY3Rvci5yb2xlJyk7XG4gIFRFU1RfTkFNRV9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRlc3RfaWQnKTtcbiAgVEVYVF9UWVBFID0gc3ltYm9sRm9yJDEoJ3NlbGVjdG9yLnRleHQnKTtcbn1cbnZhciBjb21taXRIb29rcyA9IFtdO1xuZnVuY3Rpb24gb25Db21taXRSb290JDEoKSB7XG4gIHtcbiAgICBjb21taXRIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChjb21taXRIb29rKSB7XG4gICAgICByZXR1cm4gY29tbWl0SG9vaygpO1xuICAgIH0pO1xuICB9XG59XG5cbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudE93bmVyLFxuICAgIElzU29tZVJlbmRlcmVyQWN0aW5nID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSXNTb21lUmVuZGVyZXJBY3Rpbmc7XG52YXIgTm9Db250ZXh0ID1cbi8qICAgICAgICAgICAgICovXG4wO1xudmFyIEJhdGNoZWRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgKi9cbjE7XG52YXIgRXZlbnRDb250ZXh0ID1cbi8qICAgICAgICAgICAgICAgICAqL1xuMjtcbnZhciBEaXNjcmV0ZUV2ZW50Q29udGV4dCA9XG4vKiAgICAgICAgICovXG40O1xudmFyIExlZ2FjeVVuYmF0Y2hlZENvbnRleHQgPVxuLyogICAgICAgKi9cbjg7XG52YXIgUmVuZGVyQ29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMTY7XG52YXIgQ29tbWl0Q29udGV4dCA9XG4vKiAgICAgICAgICAgICAgICAqL1xuMzI7XG52YXIgUmV0cnlBZnRlckVycm9yID1cbi8qICAgICAgICovXG42NDtcbnZhciBSb290SW5jb21wbGV0ZSA9IDA7XG52YXIgUm9vdEZhdGFsRXJyb3JlZCA9IDE7XG52YXIgUm9vdEVycm9yZWQgPSAyO1xudmFyIFJvb3RTdXNwZW5kZWQgPSAzO1xudmFyIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgPSA0O1xudmFyIFJvb3RDb21wbGV0ZWQgPSA1OyAvLyBEZXNjcmliZXMgd2hlcmUgd2UgYXJlIGluIHRoZSBSZWFjdCBleGVjdXRpb24gc3RhY2tcblxudmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBOb0NvbnRleHQ7IC8vIFRoZSByb290IHdlJ3JlIHdvcmtpbmcgb25cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGw7IC8vIFRoZSBmaWJlciB3ZSdyZSB3b3JraW5nIG9uXG5cbnZhciB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7IC8vIFRoZSBsYW5lcyB3ZSdyZSByZW5kZXJpbmdcblxudmFyIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gU3RhY2sgdGhhdCBhbGxvd3MgY29tcG9uZW50cyB0byBjaGFuZ2UgdGhlIHJlbmRlciBsYW5lcyBmb3IgaXRzIHN1YnRyZWVcbi8vIFRoaXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCB3b3JraW5nIG9uIGF0IHRoZSByb290LiBUaGUgb25seVxuLy8gY2FzZSB3aGVyZSBpdCdzIGRpZmZlcmVudCBmcm9tIGB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc2AgaXMgd2hlbiB3ZVxuLy8gZW50ZXIgYSBzdWJ0cmVlIHRoYXQgaXMgaGlkZGVuIGFuZCBuZWVkcyB0byBiZSB1bmhpZGRlbjogU3VzcGVuc2UgYW5kXG4vLyBPZmZzY3JlZW4gY29tcG9uZW50LlxuLy9cbi8vIE1vc3QgdGhpbmdzIGluIHRoZSB3b3JrIGxvb3Agc2hvdWxkIGRlYWwgd2l0aCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcy5cbi8vIE1vc3QgdGhpbmdzIGluIGJlZ2luL2NvbXBsZXRlIHBoYXNlcyBzaG91bGQgZGVhbCB3aXRoIHN1YnRyZWVSZW5kZXJMYW5lcy5cblxudmFyIHN1YnRyZWVSZW5kZXJMYW5lcyA9IE5vTGFuZXM7XG52YXIgc3VidHJlZVJlbmRlckxhbmVzQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKE5vTGFuZXMpOyAvLyBXaGV0aGVyIHRvIHJvb3QgY29tcGxldGVkLCBlcnJvcmVkLCBzdXNwZW5kZWQsIGV0Yy5cblxudmFyIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5jb21wbGV0ZTsgLy8gQSBmYXRhbCBlcnJvciwgaWYgb25lIGlzIHRocm93blxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvciA9IG51bGw7IC8vIFwiSW5jbHVkZWRcIiBsYW5lcyByZWZlciB0byBsYW5lcyB0aGF0IHdlcmUgd29ya2VkIG9uIGR1cmluZyB0aGlzIHJlbmRlci4gSXQnc1xuLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRoYW4gYHJlbmRlckxhbmVzYCBiZWNhdXNlIGByZW5kZXJMYW5lc2AgY2FuIGNoYW5nZSBhcyB5b3Vcbi8vIGVudGVyIGFuZCBleGl0IGFuIE9mZnNjcmVlbiB0cmVlLiBUaGlzIHZhbHVlIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgcmVuZGVyXG4vLyBsYW5lcyBmb3IgdGhlIGVudGlyZSByZW5kZXIgcGhhc2UuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gTm9MYW5lczsgLy8gVGhlIHdvcmsgbGVmdCBvdmVyIGJ5IGNvbXBvbmVudHMgdGhhdCB3ZXJlIHZpc2l0ZWQgZHVyaW5nIHRoaXMgcmVuZGVyLiBPbmx5XG4vLyBpbmNsdWRlcyB1bnByb2Nlc3NlZCB1cGRhdGVzLCBub3Qgd29yayBpbiBiYWlsZWQgb3V0IGNoaWxkcmVuLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gTm9MYW5lczsgLy8gTGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgKGluIGFuIGludGVybGVhdmVkIGV2ZW50KSBkdXJpbmcgdGhpcyByZW5kZXIuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzOyAvLyBMYW5lcyB0aGF0IHdlcmUgcGluZ2VkIChpbiBhbiBpbnRlcmxlYXZlZCBldmVudCkgZHVyaW5nIHRoaXMgcmVuZGVyLlxuXG52YXIgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPSBOb0xhbmVzO1xudmFyIG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ID0gbnVsbDsgLy8gVGhlIG1vc3QgcmVjZW50IHRpbWUgd2UgY29tbWl0dGVkIGEgZmFsbGJhY2suIFRoaXMgbGV0cyB1cyBlbnN1cmUgYSB0cmFpblxuLy8gbW9kZWwgd2hlcmUgd2UgZG9uJ3QgY29tbWl0IG5ldyBsb2FkaW5nIHN0YXRlcyBpbiB0b28gcXVpY2sgc3VjY2Vzc2lvbi5cblxudmFyIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwO1xudmFyIEZBTExCQUNLX1RIUk9UVExFX01TID0gNTAwOyAvLyBUaGUgYWJzb2x1dGUgdGltZSBmb3Igd2hlbiB3ZSBzaG91bGQgc3RhcnQgZ2l2aW5nIHVwIG9uIHJlbmRlcmluZ1xuLy8gbW9yZSBhbmQgcHJlZmVyIENQVSBzdXNwZW5zZSBoZXVyaXN0aWNzIGluc3RlYWQuXG5cbnZhciB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gSW5maW5pdHk7IC8vIEhvdyBsb25nIGEgcmVuZGVyIGlzIHN1cHBvc2VkIHRvIHRha2UgYmVmb3JlIHdlIHN0YXJ0IGZvbGxvd2luZyBDUFVcbi8vIHN1c3BlbnNlIGhldXJpc3RpY3MgYW5kIG9wdCBvdXQgb2YgcmVuZGVyaW5nIG1vcmUgY29udGVudC5cblxudmFyIFJFTkRFUl9USU1FT1VUX01TID0gNTAwO1xuXG5mdW5jdGlvbiByZXNldFJlbmRlclRpbWVyKCkge1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lID0gbm93KCkgKyBSRU5ERVJfVElNRU9VVF9NUztcbn1cblxuZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0VGltZSgpIHtcbiAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWU7XG59XG52YXIgbmV4dEVmZmVjdCA9IG51bGw7XG52YXIgaGFzVW5jYXVnaHRFcnJvciA9IGZhbHNlO1xudmFyIGZpcnN0VW5jYXVnaHRFcnJvciA9IG51bGw7XG52YXIgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xudmFyIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG52YXIgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID0gTm9Qcmlvcml0eSQxO1xudmFyIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gTm9MYW5lcztcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcbnZhciBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xudmFyIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPSBudWxsOyAvLyBVc2UgdGhlc2UgdG8gcHJldmVudCBhbiBpbmZpbml0ZSBsb29wIG9mIG5lc3RlZCB1cGRhdGVzXG5cbnZhciBORVNURURfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkVXBkYXRlQ291bnQgPSAwO1xudmFyIHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGw7XG52YXIgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTA7XG52YXIgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDsgLy8gTWFya3MgdGhlIG5lZWQgdG8gcmVzY2hlZHVsZSBwZW5kaW5nIGludGVyYWN0aW9ucyBhdCB0aGVzZSBsYW5lc1xuLy8gZHVyaW5nIHRoZSBjb21taXQgcGhhc2UuIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIHRyYWNlZCBhY3Jvc3MgY29tcG9uZW50c1xuLy8gdGhhdCBzcGF3biBuZXcgd29yayBkdXJpbmcgcmVuZGVyLiBFLmcuIGhpZGRlbiBib3VuZGFyaWVzLCBzdXNwZW5kZWQgU1NSXG4vLyBoeWRyYXRpb24gb3IgU3VzcGVuc2VMaXN0LlxuLy8gVE9ETzogQ2FuIHVzZSBhIGJpdG1hc2sgaW5zdGVhZCBvZiBhbiBhcnJheVxuXG52YXIgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsOyAvLyBJZiB0d28gdXBkYXRlcyBhcmUgc2NoZWR1bGVkIHdpdGhpbiB0aGUgc2FtZSBldmVudCwgd2Ugc2hvdWxkIHRyZWF0IHRoZWlyXG4vLyBldmVudCB0aW1lcyBhcyBzaW11bHRhbmVvdXMsIGV2ZW4gaWYgdGhlIGFjdHVhbCBjbG9jayB0aW1lIGhhcyBhZHZhbmNlZFxuLy8gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxsLlxuXG52YXIgY3VycmVudEV2ZW50VGltZSA9IE5vVGltZXN0YW1wO1xudmFyIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbnZhciBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgPSBOb0xhbmVzOyAvLyBEZXYgb25seSBmbGFnIHRoYXQgdHJhY2tzIGlmIHBhc3NpdmUgZWZmZWN0cyBhcmUgY3VycmVudGx5IGJlaW5nIGZsdXNoZWQuXG4vLyBXZSB3YXJuIGFib3V0IHN0YXRlIHVwZGF0ZXMgZm9yIHVubW91bnRlZCBjb21wb25lbnRzIGRpZmZlcmVudGx5IGluIHRoaXMgY2FzZS5cblxudmFyIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9IGZhbHNlO1xudmFyIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IG51bGw7XG52YXIgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gZmFsc2U7XG5mdW5jdGlvbiBnZXRXb3JrSW5Qcm9ncmVzc1Jvb3QoKSB7XG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3Q7XG59XG5mdW5jdGlvbiByZXF1ZXN0RXZlbnRUaW1lKCkge1xuICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAgLy8gV2UncmUgaW5zaWRlIFJlYWN0LCBzbyBpdCdzIGZpbmUgdG8gcmVhZCB0aGUgYWN0dWFsIHRpbWUuXG4gICAgcmV0dXJuIG5vdygpO1xuICB9IC8vIFdlJ3JlIG5vdCBpbnNpZGUgUmVhY3QsIHNvIHdlIG1heSBiZSBpbiB0aGUgbWlkZGxlIG9mIGEgYnJvd3NlciBldmVudC5cblxuXG4gIGlmIChjdXJyZW50RXZlbnRUaW1lICE9PSBOb1RpbWVzdGFtcCkge1xuICAgIC8vIFVzZSB0aGUgc2FtZSBzdGFydCB0aW1lIGZvciBhbGwgdXBkYXRlcyB1bnRpbCB3ZSBlbnRlciBSZWFjdCBhZ2Fpbi5cbiAgICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbiAgfSAvLyBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgc2luY2UgUmVhY3QgeWllbGRlZC4gQ29tcHV0ZSBhIG5ldyBzdGFydCB0aW1lLlxuXG5cbiAgY3VycmVudEV2ZW50VGltZSA9IG5vdygpO1xuICByZXR1cm4gY3VycmVudEV2ZW50VGltZTtcbn1cbmZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBUaGUgYWxnb3JpdGhtIGZvciBhc3NpZ25pbmcgYW4gdXBkYXRlIHRvIGEgbGFuZSBzaG91bGQgYmUgc3RhYmxlIGZvciBhbGxcbiAgLy8gdXBkYXRlcyBhdCB0aGUgc2FtZSBwcmlvcml0eSB3aXRoaW4gdGhlIHNhbWUgZXZlbnQuIFRvIGRvIHRoaXMsIHRoZSBpbnB1dHNcbiAgLy8gdG8gdGhlIGFsZ29yaXRobSBtdXN0IGJlIHRoZSBzYW1lLiBGb3IgZXhhbXBsZSwgd2UgdXNlIHRoZSBgcmVuZGVyTGFuZXNgXG4gIC8vIHRvIGF2b2lkIGNob29zaW5nIGEgbGFuZSB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIG1pZGRsZSBvZiByZW5kZXJpbmcuXG4gIC8vXG4gIC8vIEhvd2V2ZXIsIHRoZSBcImluY2x1ZGVkXCIgbGFuZXMgY291bGQgYmUgbXV0YXRlZCBpbiBiZXR3ZWVuIHVwZGF0ZXMgaW4gdGhlXG4gIC8vIHNhbWUgZXZlbnQsIGxpa2UgaWYgeW91IHBlcmZvcm0gYW4gdXBkYXRlIGluc2lkZSBgZmx1c2hTeW5jYC4gT3IgYW55IG90aGVyXG4gIC8vIGNvZGUgcGF0aCB0aGF0IG1pZ2h0IGNhbGwgYHByZXBhcmVGcmVzaFN0YWNrYC5cbiAgLy9cbiAgLy8gVGhlIHRyaWNrIHdlIHVzZSBpcyB0byBjYWNoZSB0aGUgZmlyc3Qgb2YgZWFjaCBvZiB0aGVzZSBpbnB1dHMgd2l0aGluIGFuXG4gIC8vIGV2ZW50LiBUaGVuIHJlc2V0IHRoZSBjYWNoZWQgdmFsdWVzIG9uY2Ugd2UgY2FuIGJlIHN1cmUgdGhlIGV2ZW50IGlzIG92ZXIuXG4gIC8vIE91ciBoZXVyaXN0aWMgZm9yIHRoYXQgaXMgd2hlbmV2ZXIgd2UgZW50ZXIgYSBjb25jdXJyZW50IHdvcmsgbG9vcC5cbiAgLy9cbiAgLy8gV2UnbGwgZG8gdGhlIHNhbWUgZm9yIGBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXNgIGJlbG93LlxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgdmFyIGlzVHJhbnNpdGlvbiA9IHJlcXVlc3RDdXJyZW50VHJhbnNpdGlvbigpICE9PSBOb1RyYW5zaXRpb247XG5cbiAgaWYgKGlzVHJhbnNpdGlvbikge1xuICAgIGlmIChjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMgIT09IE5vTGFuZXMpIHtcbiAgICAgIGN1cnJlbnRFdmVudFBlbmRpbmdMYW5lcyA9IG1vc3RSZWNlbnRseVVwZGF0ZWRSb290ICE9PSBudWxsID8gbW9zdFJlY2VudGx5VXBkYXRlZFJvb3QucGVuZGluZ0xhbmVzIDogTm9MYW5lcztcbiAgICB9XG5cbiAgICByZXR1cm4gZmluZFRyYW5zaXRpb25MYW5lKGN1cnJlbnRFdmVudFdpcExhbmVzLCBjdXJyZW50RXZlbnRQZW5kaW5nTGFuZXMpO1xuICB9IC8vIFRPRE86IFJlbW92ZSB0aGlzIGRlcGVuZGVuY3kgb24gdGhlIFNjaGVkdWxlciBwcmlvcml0eS5cbiAgLy8gVG8gZG8gdGhhdCwgd2UncmUgcmVwbGFjaW5nIGl0IHdpdGggYW4gdXBkYXRlIGxhbmUgcHJpb3JpdHkuXG5cblxuICB2YXIgc2NoZWR1bGVyUHJpb3JpdHkgPSBnZXRDdXJyZW50UHJpb3JpdHlMZXZlbCgpOyAvLyBUaGUgb2xkIGJlaGF2aW9yIHdhcyB1c2luZyB0aGUgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIFNjaGVkdWxlci5cbiAgLy8gVGhpcyBjb3VwbGVzIFJlYWN0IHRvIHRoZSBTY2hlZHVsZXIgaW50ZXJuYWxzLCBzbyB3ZSdyZSByZXBsYWNpbmcgaXRcbiAgLy8gd2l0aCB0aGUgY3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eSBhYm92ZS4gQXMgYW4gZXhhbXBsZSBvZiBob3cgdGhpc1xuICAvLyBjb3VsZCBiZSBwcm9ibGVtYXRpYywgaWYgd2UncmUgbm90IGluc2lkZSBgU2NoZWR1bGVyLnJ1bldpdGhQcmlvcml0eWAsXG4gIC8vIHRoZW4gd2UnbGwgZ2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBydW5uaW5nIFNjaGVkdWxlciB0YXNrLFxuICAvLyB3aGljaCBpcyBwcm9iYWJseSBub3Qgd2hhdCB3ZSB3YW50LlxuXG4gIHZhciBsYW5lO1xuXG4gIGlmICggLy8gVE9ETzogVGVtcG9yYXJ5LiBXZSdyZSByZW1vdmluZyB0aGUgY29uY2VwdCBvZiBkaXNjcmV0ZSB1cGRhdGVzLlxuICAoZXhlY3V0aW9uQ29udGV4dCAmIERpc2NyZXRlRXZlbnRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIHNjaGVkdWxlclByaW9yaXR5ID09PSBVc2VyQmxvY2tpbmdQcmlvcml0eSQyKSB7XG4gICAgbGFuZSA9IGZpbmRVcGRhdGVMYW5lKElucHV0RGlzY3JldGVMYW5lUHJpb3JpdHksIGN1cnJlbnRFdmVudFdpcExhbmVzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc2NoZWR1bGVyTGFuZVByaW9yaXR5ID0gc2NoZWR1bGVyUHJpb3JpdHlUb0xhbmVQcmlvcml0eShzY2hlZHVsZXJQcmlvcml0eSk7XG5cbiAgICBsYW5lID0gZmluZFVwZGF0ZUxhbmUoc2NoZWR1bGVyTGFuZVByaW9yaXR5LCBjdXJyZW50RXZlbnRXaXBMYW5lcyk7XG4gIH1cblxuICByZXR1cm4gbGFuZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdFJldHJ5TGFuZShmaWJlcikge1xuICAvLyBUaGlzIGlzIGEgZm9yayBvZiBgcmVxdWVzdFVwZGF0ZUxhbmVgIGRlc2lnbmVkIHNwZWNpZmljYWxseSBmb3IgU3VzcGVuc2VcbiAgLy8gXCJyZXRyaWVzXCIg4oCUIGEgc3BlY2lhbCB1cGRhdGUgdGhhdCBhdHRlbXB0cyB0byBmbGlwIGEgU3VzcGVuc2UgYm91bmRhcnlcbiAgLy8gZnJvbSBpdHMgcGxhY2Vob2xkZXIgc3RhdGUgdG8gaXRzIHByaW1hcnkvcmVzb2x2ZWQgc3RhdGUuXG4gIC8vIFNwZWNpYWwgY2FzZXNcbiAgdmFyIG1vZGUgPSBmaWJlci5tb2RlO1xuXG4gIGlmICgobW9kZSAmIEJsb2NraW5nTW9kZSkgPT09IE5vTW9kZSkge1xuICAgIHJldHVybiBTeW5jTGFuZTtcbiAgfSBlbHNlIGlmICgobW9kZSAmIENvbmN1cnJlbnRNb2RlKSA9PT0gTm9Nb2RlKSB7XG4gICAgcmV0dXJuIGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkgPT09IEltbWVkaWF0ZVByaW9yaXR5JDEgPyBTeW5jTGFuZSA6IFN5bmNCYXRjaGVkTGFuZTtcbiAgfSAvLyBTZWUgYHJlcXVlc3RVcGRhdGVMYW5lYCBmb3IgZXhwbGFuYXRpb24gb2YgYGN1cnJlbnRFdmVudFdpcExhbmVzYFxuXG5cbiAgaWYgKGN1cnJlbnRFdmVudFdpcExhbmVzID09PSBOb0xhbmVzKSB7XG4gICAgY3VycmVudEV2ZW50V2lwTGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzO1xuICB9XG5cbiAgcmV0dXJuIGZpbmRSZXRyeUxhbmUoY3VycmVudEV2ZW50V2lwTGFuZXMpO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSkge1xuICBjaGVja0Zvck5lc3RlZFVwZGF0ZXMoKTtcbiAgd2FybkFib3V0UmVuZGVyUGhhc2VVcGRhdGVzSW5ERVYoZmliZXIpO1xuICB2YXIgcm9vdCA9IG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBsYW5lKTtcblxuICBpZiAocm9vdCA9PT0gbnVsbCkge1xuICAgIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gTWFyayB0aGF0IHRoZSByb290IGhhcyBhIHBlbmRpbmcgdXBkYXRlLlxuXG5cbiAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIGxhbmUsIGV2ZW50VGltZSk7XG5cbiAgaWYgKHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCkge1xuICAgIC8vIFJlY2VpdmVkIGFuIHVwZGF0ZSB0byBhIHRyZWUgdGhhdCdzIGluIHRoZSBtaWRkbGUgb2YgcmVuZGVyaW5nLiBNYXJrXG4gICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gaW50ZXJsZWF2ZWQgdXBkYXRlIHdvcmsgb24gdGhpcyByb290LiBVbmxlc3MgdGhlXG4gICAgLy8gYGRlZmVyUmVuZGVyUGhhc2VVcGRhdGVUb05leHRCYXRjaGAgZmxhZyBpcyBvZmYgYW5kIHRoaXMgaXMgYSByZW5kZXJcbiAgICAvLyBwaGFzZSB1cGRhdGUuIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3QgdHJlYXQgcmVuZGVyIHBoYXNlIHVwZGF0ZXMgYXMgaWZcbiAgICAvLyB0aGV5IHdlcmUgaW50ZXJsZWF2ZWQsIGZvciBiYWNrd2FyZHMgY29tcGF0IHJlYXNvbnMuXG4gICAge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMsIGxhbmUpO1xuICAgIH1cblxuICAgIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5KSB7XG4gICAgICAvLyBUaGUgcm9vdCBhbHJlYWR5IHN1c3BlbmRlZCB3aXRoIGEgZGVsYXksIHdoaWNoIG1lYW5zIHRoaXMgcmVuZGVyXG4gICAgICAvLyBkZWZpbml0ZWx5IHdvbid0IGZpbmlzaC4gU2luY2Ugd2UgaGF2ZSBhIG5ldyB1cGRhdGUsIGxldCdzIG1hcmsgaXQgYXNcbiAgICAgIC8vIHN1c3BlbmRlZCBub3csIHJpZ2h0IGJlZm9yZSBtYXJraW5nIHRoZSBpbmNvbWluZyB1cGRhdGUuIFRoaXMgaGFzIHRoZVxuICAgICAgLy8gZWZmZWN0IG9mIGludGVycnVwdGluZyB0aGUgY3VycmVudCByZW5kZXIgYW5kIHN3aXRjaGluZyB0byB0aGUgdXBkYXRlLlxuICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBvdmVycmlkZSBwaW5ncyB0aGF0IGhhcHBlbiB3aGlsZSB3ZSd2ZVxuICAgICAgLy8gYWxyZWFkeSBzdGFydGVkIHJlbmRlcmluZy5cbiAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiByZXF1ZXN0VXBkYXRlTGFuZVByaW9yaXR5IGFsc28gcmVhZHMgdGhlIHByaW9yaXR5LiBQYXNzIHRoZVxuICAvLyBwcmlvcml0eSBhcyBhbiBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIGFuZCB0aGlzIG9uZS5cblxuXG4gIHZhciBwcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcblxuICBpZiAobGFuZSA9PT0gU3luY0xhbmUpIHtcbiAgICBpZiAoIC8vIENoZWNrIGlmIHdlJ3JlIGluc2lkZSB1bmJhdGNoZWRVcGRhdGVzXG4gICAgKGV4ZWN1dGlvbkNvbnRleHQgJiBMZWdhY3lVbmJhdGNoZWRDb250ZXh0KSAhPT0gTm9Db250ZXh0ICYmIC8vIENoZWNrIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IHJlbmRlcmluZ1xuICAgIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gUmVnaXN0ZXIgcGVuZGluZyBpbnRlcmFjdGlvbnMgb24gdGhlIHJvb3QgdG8gYXZvaWQgbG9zaW5nIHRyYWNlZCBpbnRlcmFjdGlvbiBkYXRhLlxuICAgICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmUpOyAvLyBUaGlzIGlzIGEgbGVnYWN5IGVkZ2UgY2FzZS4gVGhlIGluaXRpYWwgbW91bnQgb2YgYSBSZWFjdERPTS5yZW5kZXItZWRcbiAgICAgIC8vIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzIHNob3VsZCBiZSBzeW5jaHJvbm91cywgYnV0IGxheW91dCB1cGRhdGVzXG4gICAgICAvLyBzaG91bGQgYmUgZGVmZXJyZWQgdW50aWwgdGhlIGVuZCBvZiB0aGUgYmF0Y2guXG5cbiAgICAgIHBlcmZvcm1TeW5jV29ya09uUm9vdChyb290KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG5cbiAgICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIHN5bmNocm9ub3VzIHdvcmsgbm93LCB1bmxlc3Mgd2UncmUgYWxyZWFkeSB3b3JraW5nIG9yIGluc2lkZVxuICAgICAgICAvLyBhIGJhdGNoLiBUaGlzIGlzIGludGVudGlvbmFsbHkgaW5zaWRlIHNjaGVkdWxlVXBkYXRlT25GaWJlciBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHNjaGVkdWxlQ2FsbGJhY2tGb3JGaWJlciB0byBwcmVzZXJ2ZSB0aGUgYWJpbGl0eSB0byBzY2hlZHVsZSBhIGNhbGxiYWNrXG4gICAgICAgIC8vIHdpdGhvdXQgaW1tZWRpYXRlbHkgZmx1c2hpbmcgaXQuIFdlIG9ubHkgZG8gdGhpcyBmb3IgdXNlci1pbml0aWF0ZWRcbiAgICAgICAgLy8gdXBkYXRlcywgdG8gcHJlc2VydmUgaGlzdG9yaWNhbCBiZWhhdmlvciBvZiBsZWdhY3kgbW9kZS5cbiAgICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFNjaGVkdWxlIGEgZGlzY3JldGUgdXBkYXRlIGJ1dCBvbmx5IGlmIGl0J3Mgbm90IFN5bmMuXG4gICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgRGlzY3JldGVFdmVudENvbnRleHQpICE9PSBOb0NvbnRleHQgJiYgKCAvLyBPbmx5IHVwZGF0ZXMgYXQgdXNlci1ibG9ja2luZyBwcmlvcml0eSBvciBncmVhdGVyIGFyZSBjb25zaWRlcmVkXG4gICAgLy8gZGlzY3JldGUsIGV2ZW4gaW5zaWRlIGEgZGlzY3JldGUgZXZlbnQuXG4gICAgcHJpb3JpdHlMZXZlbCA9PT0gVXNlckJsb2NraW5nUHJpb3JpdHkkMiB8fCBwcmlvcml0eUxldmVsID09PSBJbW1lZGlhdGVQcmlvcml0eSQxKSkge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgcmVzdWx0IG9mIGEgZGlzY3JldGUgZXZlbnQuIFRyYWNrIHRoZSBsb3dlc3QgcHJpb3JpdHlcbiAgICAgIC8vIGRpc2NyZXRlIHVwZGF0ZSBwZXIgcm9vdCBzbyB3ZSBjYW4gZmx1c2ggdGhlbSBlYXJseSwgaWYgbmVlZGVkLlxuICAgICAgaWYgKHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMgPT09IG51bGwpIHtcbiAgICAgICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG5ldyBTZXQoW3Jvb3RdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuYWRkKHJvb3QpO1xuICAgICAgfVxuICAgIH0gLy8gU2NoZWR1bGUgb3RoZXIgdXBkYXRlcyBhZnRlciBpbiBjYXNlIHRoZSBjYWxsYmFjayBpcyBzeW5jLlxuXG5cbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSk7XG4gIH0gLy8gV2UgdXNlIHRoaXMgd2hlbiBhc3NpZ25pbmcgYSBsYW5lIGZvciBhIHRyYW5zaXRpb24gaW5zaWRlXG4gIC8vIGByZXF1ZXN0VXBkYXRlTGFuZWAuIFdlIGFzc3VtZSBpdCdzIHRoZSBzYW1lIGFzIHRoZSByb290IGJlaW5nIHVwZGF0ZWQsXG4gIC8vIHNpbmNlIGluIHRoZSBjb21tb24gY2FzZSBvZiBhIHNpbmdsZSByb290IGFwcCBpdCBwcm9iYWJseSBpcy4gSWYgaXQncyBub3RcbiAgLy8gdGhlIHNhbWUgcm9vdCwgdGhlbiBpdCdzIG5vdCBhIGh1Z2UgZGVhbCwgd2UganVzdCBtaWdodCBiYXRjaCBtb3JlIHN0dWZmXG4gIC8vIHRvZ2V0aGVyIG1vcmUgdGhhbiBuZWNlc3NhcnkuXG5cblxuICBtb3N0UmVjZW50bHlVcGRhdGVkUm9vdCA9IHJvb3Q7XG59IC8vIFRoaXMgaXMgc3BsaXQgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIHdlIGNhbiBtYXJrIGEgZmliZXIgd2l0aCBwZW5kaW5nXG4vLyB3b3JrIHdpdGhvdXQgdHJlYXRpbmcgaXQgYXMgYSB0eXBpY2FsIHVwZGF0ZSB0aGF0IG9yaWdpbmF0ZXMgZnJvbSBhbiBldmVudDtcbi8vIGUuZy4gcmV0cnlpbmcgYSBTdXNwZW5zZSBib3VuZGFyeSBpc24ndCBhbiB1cGRhdGUsIGJ1dCBpdCBkb2VzIHNjaGVkdWxlIHdvcmtcbi8vIG9uIGEgZmliZXIuXG5cbmZ1bmN0aW9uIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KHNvdXJjZUZpYmVyLCBsYW5lKSB7XG4gIC8vIFVwZGF0ZSB0aGUgc291cmNlIGZpYmVyJ3MgbGFuZXNcbiAgc291cmNlRmliZXIubGFuZXMgPSBtZXJnZUxhbmVzKHNvdXJjZUZpYmVyLmxhbmVzLCBsYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgYWx0ZXJuYXRlLmxhbmVzID0gbWVyZ2VMYW5lcyhhbHRlcm5hdGUubGFuZXMsIGxhbmUpO1xuICB9XG5cbiAge1xuICAgIGlmIChhbHRlcm5hdGUgPT09IG51bGwgJiYgKHNvdXJjZUZpYmVyLmZsYWdzICYgKFBsYWNlbWVudCB8IEh5ZHJhdGluZykpICE9PSBOb0ZsYWdzKSB7XG4gICAgICB3YXJuQWJvdXRVcGRhdGVPbk5vdFlldE1vdW50ZWRGaWJlckluREVWKHNvdXJjZUZpYmVyKTtcbiAgICB9XG4gIH0gLy8gV2FsayB0aGUgcGFyZW50IHBhdGggdG8gdGhlIHJvb3QgYW5kIHVwZGF0ZSB0aGUgY2hpbGQgZXhwaXJhdGlvbiB0aW1lLlxuXG5cbiAgdmFyIG5vZGUgPSBzb3VyY2VGaWJlcjtcbiAgdmFyIHBhcmVudCA9IHNvdXJjZUZpYmVyLnJldHVybjtcblxuICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgcGFyZW50LmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKHBhcmVudC5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICBhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmNoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKGFsdGVybmF0ZS5jaGlsZExhbmVzLCBsYW5lKTtcbiAgICB9IGVsc2Uge1xuICAgICAge1xuICAgICAgICBpZiAoKHBhcmVudC5mbGFncyAmIChQbGFjZW1lbnQgfCBIeWRyYXRpbmcpKSAhPT0gTm9GbGFncykge1xuICAgICAgICAgIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoc291cmNlRmliZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbm9kZSA9IHBhcmVudDtcbiAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICB9XG5cbiAgaWYgKG5vZGUudGFnID09PSBIb3N0Um9vdCkge1xuICAgIHZhciByb290ID0gbm9kZS5zdGF0ZU5vZGU7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0gLy8gVXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NoZWR1bGUgYSB0YXNrIGZvciBhIHJvb3QuIFRoZXJlJ3Mgb25seSBvbmUgdGFzayBwZXJcbi8vIHJvb3Q7IGlmIGEgdGFzayB3YXMgYWxyZWFkeSBzY2hlZHVsZWQsIHdlJ2xsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcHJpb3JpdHlcbi8vIG9mIHRoZSBleGlzdGluZyB0YXNrIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmlvcml0eSBvZiB0aGUgbmV4dCBsZXZlbCB0aGF0IHRoZVxuLy8gcm9vdCBoYXMgd29yayBvbi4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgdXBkYXRlLCBhbmQgcmlnaHQgYmVmb3JlXG4vLyBleGl0aW5nIGEgdGFzay5cblxuXG5mdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgY3VycmVudFRpbWUpIHtcbiAgdmFyIGV4aXN0aW5nQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7IC8vIENoZWNrIGlmIGFueSBsYW5lcyBhcmUgYmVpbmcgc3RhcnZlZCBieSBvdGhlciB3b3JrLiBJZiBzbywgbWFyayB0aGVtIGFzXG4gIC8vIGV4cGlyZWQgc28gd2Uga25vdyB0byB3b3JrIG9uIHRob3NlIG5leHQuXG5cbiAgbWFya1N0YXJ2ZWRMYW5lc0FzRXhwaXJlZChyb290LCBjdXJyZW50VGltZSk7IC8vIERldGVybWluZSB0aGUgbmV4dCBsYW5lcyB0byB3b3JrIG9uLCBhbmQgdGhlaXIgcHJpb3JpdHkuXG5cbiAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpOyAvLyBUaGlzIHJldHVybnMgdGhlIHByaW9yaXR5IGxldmVsIGNvbXB1dGVkIGR1cmluZyB0aGUgYGdldE5leHRMYW5lc2AgY2FsbC5cblxuICB2YXIgbmV3Q2FsbGJhY2tQcmlvcml0eSA9IHJldHVybk5leHRMYW5lc1ByaW9yaXR5KCk7XG5cbiAgaWYgKG5leHRMYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogVGhlcmUncyBub3RoaW5nIHRvIHdvcmsgb24uXG4gICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tOb2RlICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxDYWxsYmFjayhleGlzdGluZ0NhbGxiYWNrTm9kZSk7XG4gICAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgICByb290LmNhbGxiYWNrUHJpb3JpdHkgPSBOb0xhbmVQcmlvcml0eTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0gLy8gQ2hlY2sgaWYgdGhlcmUncyBhbiBleGlzdGluZyB0YXNrLiBXZSBtYXkgYmUgYWJsZSB0byByZXVzZSBpdC5cblxuXG4gIGlmIChleGlzdGluZ0NhbGxiYWNrTm9kZSAhPT0gbnVsbCkge1xuICAgIHZhciBleGlzdGluZ0NhbGxiYWNrUHJpb3JpdHkgPSByb290LmNhbGxiYWNrUHJpb3JpdHk7XG5cbiAgICBpZiAoZXhpc3RpbmdDYWxsYmFja1ByaW9yaXR5ID09PSBuZXdDYWxsYmFja1ByaW9yaXR5KSB7XG4gICAgICAvLyBUaGUgcHJpb3JpdHkgaGFzbid0IGNoYW5nZWQuIFdlIGNhbiByZXVzZSB0aGUgZXhpc3RpbmcgdGFzay4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFRoZSBwcmlvcml0eSBjaGFuZ2VkLiBDYW5jZWwgdGhlIGV4aXN0aW5nIGNhbGxiYWNrLiBXZSdsbCBzY2hlZHVsZSBhIG5ld1xuICAgIC8vIG9uZSBiZWxvdy5cblxuXG4gICAgY2FuY2VsQ2FsbGJhY2soZXhpc3RpbmdDYWxsYmFja05vZGUpO1xuICB9IC8vIFNjaGVkdWxlIGEgbmV3IGNhbGxiYWNrLlxuXG5cbiAgdmFyIG5ld0NhbGxiYWNrTm9kZTtcblxuICBpZiAobmV3Q2FsbGJhY2tQcmlvcml0eSA9PT0gU3luY0xhbmVQcmlvcml0eSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogU3luYyBSZWFjdCBjYWxsYmFja3MgYXJlIHNjaGVkdWxlZCBvbiBhIHNwZWNpYWxcbiAgICAvLyBpbnRlcm5hbCBxdWV1ZVxuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlU3luY0NhbGxiYWNrKHBlcmZvcm1TeW5jV29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfSBlbHNlIGlmIChuZXdDYWxsYmFja1ByaW9yaXR5ID09PSBTeW5jQmF0Y2hlZExhbmVQcmlvcml0eSkge1xuICAgIG5ld0NhbGxiYWNrTm9kZSA9IHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgcGVyZm9ybVN5bmNXb3JrT25Sb290LmJpbmQobnVsbCwgcm9vdCkpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzY2hlZHVsZXJQcmlvcml0eUxldmVsID0gbGFuZVByaW9yaXR5VG9TY2hlZHVsZXJQcmlvcml0eShuZXdDYWxsYmFja1ByaW9yaXR5KTtcbiAgICBuZXdDYWxsYmFja05vZGUgPSBzY2hlZHVsZUNhbGxiYWNrKHNjaGVkdWxlclByaW9yaXR5TGV2ZWwsIHBlcmZvcm1Db25jdXJyZW50V29ya09uUm9vdC5iaW5kKG51bGwsIHJvb3QpKTtcbiAgfVxuXG4gIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IG5ld0NhbGxiYWNrUHJpb3JpdHk7XG4gIHJvb3QuY2FsbGJhY2tOb2RlID0gbmV3Q2FsbGJhY2tOb2RlO1xufSAvLyBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgZXZlcnkgY29uY3VycmVudCB0YXNrLCBpLmUuIGFueXRoaW5nIHRoYXRcbi8vIGdvZXMgdGhyb3VnaCBTY2hlZHVsZXIuXG5cblxuZnVuY3Rpb24gcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KHJvb3QpIHtcbiAgLy8gU2luY2Ugd2Uga25vdyB3ZSdyZSBpbiBhIFJlYWN0IGV2ZW50LCB3ZSBjYW4gY2xlYXIgdGhlIGN1cnJlbnRcbiAgLy8gZXZlbnQgdGltZS4gVGhlIG5leHQgdXBkYXRlIHdpbGwgY29tcHV0ZSBhIG5ldyBldmVudCB0aW1lLlxuICBjdXJyZW50RXZlbnRUaW1lID0gTm9UaW1lc3RhbXA7XG4gIGN1cnJlbnRFdmVudFdpcExhbmVzID0gTm9MYW5lcztcbiAgY3VycmVudEV2ZW50UGVuZGluZ0xhbmVzID0gTm9MYW5lcztcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH0gLy8gRmx1c2ggYW55IHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIGJlZm9yZSBkZWNpZGluZyB3aGljaCBsYW5lcyB0byB3b3JrIG9uLFxuICAvLyBpbiBjYXNlIHRoZXkgc2NoZWR1bGUgYWRkaXRpb25hbCB3b3JrLlxuXG5cbiAgdmFyIG9yaWdpbmFsQ2FsbGJhY2tOb2RlID0gcm9vdC5jYWxsYmFja05vZGU7XG4gIHZhciBkaWRGbHVzaFBhc3NpdmVFZmZlY3RzID0gZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuXG4gIGlmIChkaWRGbHVzaFBhc3NpdmVFZmZlY3RzKSB7XG4gICAgLy8gU29tZXRoaW5nIGluIHRoZSBwYXNzaXZlIGVmZmVjdCBwaGFzZSBtYXkgaGF2ZSBjYW5jZWxlZCB0aGUgY3VycmVudCB0YXNrLlxuICAgIC8vIENoZWNrIGlmIHRoZSB0YXNrIG5vZGUgZm9yIHRoaXMgcm9vdCB3YXMgY2hhbmdlZC5cbiAgICBpZiAocm9vdC5jYWxsYmFja05vZGUgIT09IG9yaWdpbmFsQ2FsbGJhY2tOb2RlKSB7XG4gICAgICAvLyBUaGUgY3VycmVudCB0YXNrIHdhcyBjYW5jZWxlZC4gRXhpdC4gV2UgZG9uJ3QgbmVlZCB0byBjYWxsXG4gICAgICAvLyBgZW5zdXJlUm9vdElzU2NoZWR1bGVkYCBiZWNhdXNlIHRoZSBjaGVjayBhYm92ZSBpbXBsaWVzIGVpdGhlciB0aGF0XG4gICAgICAvLyB0aGVyZSdzIGEgbmV3IHRhc2ssIG9yIHRoYXQgdGhlcmUncyBubyByZW1haW5pbmcgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0gLy8gRGV0ZXJtaW5lIHRoZSBuZXh0IGV4cGlyYXRpb24gdGltZSB0byB3b3JrIG9uLCB1c2luZyB0aGUgZmllbGRzIHN0b3JlZFxuICAvLyBvbiB0aGUgcm9vdC5cblxuXG4gIHZhciBsYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA6IE5vTGFuZXMpO1xuXG4gIGlmIChsYW5lcyA9PT0gTm9MYW5lcykge1xuICAgIC8vIERlZmVuc2l2ZSBjb2RpbmcuIFRoaXMgaXMgbmV2ZXIgZXhwZWN0ZWQgdG8gaGFwcGVuLlxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGV4aXRTdGF0dXMgPSByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcyk7XG5cbiAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgIC8vIFRoZSByZW5kZXIgaW5jbHVkZWQgbGFuZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgLy8gRm9yIGV4YW1wbGUsIHdoZW4gdW5oaWRpbmcgYSBoaWRkZW4gdHJlZSwgd2UgaW5jbHVkZSBhbGwgdGhlIGxhbmVzXG4gICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgLy8gbGFuZXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgbGFuZXMgd2Ugc3RhcnRlZCByZW5kZXJpbmcgd2l0aC5cbiAgICAvL1xuICAgIC8vIFNvIHdlJ2xsIHRocm93IG91dCB0aGUgY3VycmVudCB3b3JrIGFuZCByZXN0YXJ0LlxuICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICB9IGVsc2UgaWYgKGV4aXRTdGF0dXMgIT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAgIC8vIGRpc2NhcmQgc2VydmVyIHJlc3BvbnNlIGFuZCBmYWxsIGJhY2sgdG8gY2xpZW50IHNpZGUgcmVuZGVyLlxuXG4gICAgICBpZiAocm9vdC5oeWRyYXRlKSB7XG4gICAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgICBjbGVhckNvbnRhaW5lcihyb290LmNvbnRhaW5lckluZm8pO1xuICAgICAgfSAvLyBJZiBzb21ldGhpbmcgdGhyZXcgYW4gZXJyb3IsIHRyeSByZW5kZXJpbmcgb25lIG1vcmUgdGltZS4gV2UnbGwgcmVuZGVyXG4gICAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgICAgLy8gYWxsIHBlbmRpbmcgdXBkYXRlcyBhcmUgaW5jbHVkZWQuIElmIGl0IHN0aWxsIGZhaWxzIGFmdGVyIHRoZSBzZWNvbmRcbiAgICAgIC8vIGF0dGVtcHQsIHdlJ2xsIGdpdmUgdXAgYW5kIGNvbW1pdCB0aGUgcmVzdWx0aW5nIHRyZWUuXG5cblxuICAgICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgICAgaWYgKGxhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXRTdGF0dXMgPT09IFJvb3RGYXRhbEVycm9yZWQpIHtcbiAgICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIE5vTGFuZXMpO1xuICAgICAgbWFya1Jvb3RTdXNwZW5kZWQkMShyb290LCBsYW5lcyk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgICAgdGhyb3cgZmF0YWxFcnJvcjtcbiAgICB9IC8vIFdlIG5vdyBoYXZlIGEgY29uc2lzdGVudCB0cmVlLiBUaGUgbmV4dCBzdGVwIGlzIGVpdGhlciB0byBjb21taXQgaXQsXG4gICAgLy8gb3IsIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQsIHdhaXQgdG8gY29tbWl0IGl0IGFmdGVyIGEgdGltZW91dC5cblxuXG4gICAgdmFyIGZpbmlzaGVkV29yayA9IHJvb3QuY3VycmVudC5hbHRlcm5hdGU7XG4gICAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgcm9vdC5maW5pc2hlZExhbmVzID0gbGFuZXM7XG4gICAgZmluaXNoQ29uY3VycmVudFJlbmRlcihyb290LCBleGl0U3RhdHVzLCBsYW5lcyk7XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuXG4gIGlmIChyb290LmNhbGxiYWNrTm9kZSA9PT0gb3JpZ2luYWxDYWxsYmFja05vZGUpIHtcbiAgICAvLyBUaGUgdGFzayBub2RlIHNjaGVkdWxlZCBmb3IgdGhpcyByb290IGlzIHRoZSBzYW1lIG9uZSB0aGF0J3NcbiAgICAvLyBjdXJyZW50bHkgZXhlY3V0ZWQuIE5lZWQgdG8gcmV0dXJuIGEgY29udGludWF0aW9uLlxuICAgIHJldHVybiBwZXJmb3JtQ29uY3VycmVudFdvcmtPblJvb3QuYmluZChudWxsLCByb290KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5pc2hDb25jdXJyZW50UmVuZGVyKHJvb3QsIGV4aXRTdGF0dXMsIGxhbmVzKSB7XG4gIHN3aXRjaCAoZXhpdFN0YXR1cykge1xuICAgIGNhc2UgUm9vdEluY29tcGxldGU6XG4gICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgLy8gRmxvdyBrbm93cyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWlucyBpZiBJIGFkZCBhIGJyZWFrXG4gICAgLy8gc3RhdGVtZW50LCBidXQgZXNsaW50IGRvZXNuJ3Qga25vdyBhYm91dCBpbnZhcmlhbnQsIHNvIGl0IGNvbXBsYWluc1xuICAgIC8vIGlmIEkgZG8uIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBhdHRlbXB0ZWQgdG8gcmV0cnkgdGhpcyB0cmVlLiBJZiB3ZSByZWFjaGVkXG4gICAgICAgIC8vIHRoaXMgcG9pbnQsIGl0IGVycm9yZWQgYWdhaW4uIENvbW1pdCBpdC5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWQ6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpOyAvLyBXZSBoYXZlIGFuIGFjY2VwdGFibGUgbG9hZGluZyBzdGF0ZS4gV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHdlXG4gICAgICAgIC8vIHNob3VsZCBpbW1lZGlhdGVseSBjb21taXQgaXQgb3Igd2FpdCBhIGJpdC5cblxuICAgICAgICBpZiAoaW5jbHVkZXNPbmx5UmV0cmllcyhsYW5lcykgJiYgLy8gZG8gbm90IGRlbGF5IGlmIHdlJ3JlIGluc2lkZSBhbiBhY3QoKSBzY29wZVxuICAgICAgICAhc2hvdWxkRm9yY2VGbHVzaEZhbGxiYWNrc0luREVWKCkpIHtcbiAgICAgICAgICAvLyBUaGlzIHJlbmRlciBvbmx5IGluY2x1ZGVkIHJldHJpZXMsIG5vIHVwZGF0ZXMuIFRocm90dGxlIGNvbW1pdHRpbmdcbiAgICAgICAgICAvLyByZXRyaWVzIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyB0b28gbWFueSBsb2FkaW5nIHN0YXRlcyB0b28gcXVpY2tseS5cbiAgICAgICAgICB2YXIgbXNVbnRpbFRpbWVvdXQgPSBnbG9iYWxNb3N0UmVjZW50RmFsbGJhY2tUaW1lICsgRkFMTEJBQ0tfVEhST1RUTEVfTVMgLSBub3coKTsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cbiAgICAgICAgICBpZiAobXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgdmFyIG5leHRMYW5lcyA9IGdldE5leHRMYW5lcyhyb290LCBOb0xhbmVzKTtcblxuICAgICAgICAgICAgaWYgKG5leHRMYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgICAgICAgICAvLyBUaGVyZSdzIGFkZGl0aW9uYWwgd29yayBvbiB0aGlzIHJvb3QuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzO1xuXG4gICAgICAgICAgICBpZiAoIWlzU3Vic2V0T2ZMYW5lcyhzdXNwZW5kZWRMYW5lcywgbGFuZXMpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmVmZXIgdG8gcmVuZGVyIHRoZSBmYWxsYmFjayBvZiBhdCB0aGUgbGFzdFxuICAgICAgICAgICAgICAvLyBzdXNwZW5kZWQgbGV2ZWwuIFBpbmcgdGhlIGxhc3Qgc3VzcGVuZGVkIGxldmVsIHRvIHRyeVxuICAgICAgICAgICAgICAvLyByZW5kZXJpbmcgaXQgYWdhaW4uXG4gICAgICAgICAgICAgIC8vIEZJWE1FOiBXaGF0IGlmIHRoZSBzdXNwZW5kZWQgbGFuZXMgYXJlIElkbGU/IFNob3VsZCBub3QgcmVzdGFydC5cbiAgICAgICAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgICAgICAgbWFya1Jvb3RQaW5nZWQocm9vdCwgc3VzcGVuZGVkTGFuZXMpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gVGhlIHJlbmRlciBpcyBzdXNwZW5kZWQsIGl0IGhhc24ndCB0aW1lZCBvdXQsIGFuZCB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB3b3JrIHRvIGRvLiBJbnN0ZWFkIG9mIGNvbW1pdHRpbmcgdGhlIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhIHRvIGFycml2ZS5cblxuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBtc1VudGlsVGltZW91dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gVGhlIHdvcmsgZXhwaXJlZC4gQ29tbWl0IGltbWVkaWF0ZWx5LlxuXG5cbiAgICAgICAgY29tbWl0Um9vdChyb290KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICBjYXNlIFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk6XG4gICAgICB7XG4gICAgICAgIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChpbmNsdWRlc09ubHlUcmFuc2l0aW9ucyhsYW5lcykpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgdHJhbnNpdGlvbiwgc28gd2Ugc2hvdWxkIGV4aXQgd2l0aG91dCBjb21taXR0aW5nIGFcbiAgICAgICAgICAvLyBwbGFjZWhvbGRlciBhbmQgd2l0aG91dCBzY2hlZHVsaW5nIGEgdGltZW91dC4gRGVsYXkgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgLy8gdW50aWwgd2UgcmVjZWl2ZSBtb3JlIGRhdGEuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBub3QgYSB0cmFuc2l0aW9uLCBidXQgd2UgZGlkIHRyaWdnZXIgYW4gYXZvaWRlZCBzdGF0ZS5cbiAgICAgICAgICAvLyBTY2hlZHVsZSBhIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkgYWZ0ZXIgYSBzaG9ydCBkZWxheSwgdXNpbmcgdGhlIEp1c3RcbiAgICAgICAgICAvLyBOb3RpY2VhYmxlIERpZmZlcmVuY2UuXG4gICAgICAgICAgLy8gVE9ETzogSXMgdGhlIEpORCBvcHRpbWl6YXRpb24gd29ydGggdGhlIGFkZGVkIGNvbXBsZXhpdHk/IElmIHRoaXMgaXNcbiAgICAgICAgICAvLyB0aGUgb25seSByZWFzb24gd2UgdHJhY2sgdGhlIGV2ZW50IHRpbWUsIHRoZW4gcHJvYmFibHkgbm90LlxuICAgICAgICAgIC8vIENvbnNpZGVyIHJlbW92aW5nLlxuICAgICAgICAgIHZhciBtb3N0UmVjZW50RXZlbnRUaW1lID0gZ2V0TW9zdFJlY2VudEV2ZW50VGltZShyb290LCBsYW5lcyk7XG4gICAgICAgICAgdmFyIGV2ZW50VGltZU1zID0gbW9zdFJlY2VudEV2ZW50VGltZTtcbiAgICAgICAgICB2YXIgdGltZUVsYXBzZWRNcyA9IG5vdygpIC0gZXZlbnRUaW1lTXM7XG5cbiAgICAgICAgICB2YXIgX21zVW50aWxUaW1lb3V0ID0gam5kKHRpbWVFbGFwc2VkTXMpIC0gdGltZUVsYXBzZWRNczsgLy8gRG9uJ3QgYm90aGVyIHdpdGggYSB2ZXJ5IHNob3J0IHN1c3BlbnNlIHRpbWUuXG5cblxuICAgICAgICAgIGlmIChfbXNVbnRpbFRpbWVvdXQgPiAxMCkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBjb21taXR0aW5nIHRoZSBmYWxsYmFjayBpbW1lZGlhdGVseSwgd2FpdCBmb3IgbW9yZSBkYXRhXG4gICAgICAgICAgICAvLyB0byBhcnJpdmUuXG4gICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBzY2hlZHVsZVRpbWVvdXQoY29tbWl0Um9vdC5iaW5kKG51bGwsIHJvb3QpLCBfbXNVbnRpbFRpbWVvdXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIENvbW1pdCB0aGUgcGxhY2Vob2xkZXIuXG5cblxuICAgICAgICBjb21taXRSb290KHJvb3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIGNhc2UgUm9vdENvbXBsZXRlZDpcbiAgICAgIHtcbiAgICAgICAgLy8gVGhlIHdvcmsgY29tcGxldGVkLiBSZWFkeSB0byBjb21taXQuXG4gICAgICAgIGNvbW1pdFJvb3Qocm9vdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlVua25vd24gcm9vdCBleGl0IHN0YXR1cy5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtSb290U3VzcGVuZGVkJDEocm9vdCwgc3VzcGVuZGVkTGFuZXMpIHtcbiAgLy8gV2hlbiBzdXNwZW5kaW5nLCB3ZSBzaG91bGQgYWx3YXlzIGV4Y2x1ZGUgbGFuZXMgdGhhdCB3ZXJlIHBpbmdlZCBvciAobW9yZVxuICAvLyByYXJlbHksIHNpbmNlIHdlIHRyeSB0byBhdm9pZCBpdCkgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgLy8gVE9ETzogTG9sIG1heWJlIHRoZXJlJ3MgYSBiZXR0ZXIgd2F5IHRvIGZhY3RvciB0aGlzIGJlc2lkZXMgdGhpc1xuICAvLyBvYm5veGlvdXNseSBuYW1lZCBmdW5jdGlvbiA6KVxuICBzdXNwZW5kZWRMYW5lcyA9IHJlbW92ZUxhbmVzKHN1c3BlbmRlZExhbmVzLCB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyk7XG4gIHN1c3BlbmRlZExhbmVzID0gcmVtb3ZlTGFuZXMoc3VzcGVuZGVkTGFuZXMsIHdvcmtJblByb2dyZXNzUm9vdFVwZGF0ZWRMYW5lcyk7XG4gIG1hcmtSb290U3VzcGVuZGVkKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbn0gLy8gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgZ29cbi8vIHRocm91Z2ggU2NoZWR1bGVyXG5cblxuZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QpIHtcbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLlwiICk7XG4gICAgfVxuICB9XG5cbiAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICB2YXIgbGFuZXM7XG4gIHZhciBleGl0U3RhdHVzO1xuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiYgaW5jbHVkZXNTb21lTGFuZShyb290LmV4cGlyZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMpKSB7XG4gICAgLy8gVGhlcmUncyBhIHBhcnRpYWwgdHJlZSwgYW5kIGF0IGxlYXN0IG9uZSBvZiBpdHMgbGFuZXMgaGFzIGV4cGlyZWQuIEZpbmlzaFxuICAgIC8vIHJlbmRlcmluZyBpdCBiZWZvcmUgcmVuZGVyaW5nIHRoZSByZXN0IG9mIHRoZSBleHBpcmVkIHdvcmsuXG4gICAgbGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgICBleGl0U3RhdHVzID0gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMpO1xuXG4gICAgaWYgKGluY2x1ZGVzU29tZUxhbmUod29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcywgd29ya0luUHJvZ3Jlc3NSb290VXBkYXRlZExhbmVzKSkge1xuICAgICAgLy8gVGhlIHJlbmRlciBpbmNsdWRlZCBsYW5lcyB0aGF0IHdlcmUgdXBkYXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZS5cbiAgICAgIC8vIEZvciBleGFtcGxlLCB3aGVuIHVuaGlkaW5nIGEgaGlkZGVuIHRyZWUsIHdlIGluY2x1ZGUgYWxsIHRoZSBsYW5lc1xuICAgICAgLy8gdGhhdCB3ZXJlIHByZXZpb3VzbHkgc2tpcHBlZCB3aGVuIHRoZSB0cmVlIHdhcyBoaWRkZW4uIFRoYXQgc2V0IG9mXG4gICAgICAvLyBsYW5lcyBpcyBhIHN1cGVyc2V0IG9mIHRoZSBsYW5lcyB3ZSBzdGFydGVkIHJlbmRlcmluZyB3aXRoLlxuICAgICAgLy9cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIHBhcnQgb2YgdGhlIHRyZWUgaXMgcmVuZGVyZWRcbiAgICAgIC8vIGNvbmN1cnJlbnRseS4gSWYgdGhlIHdob2xlIHRyZWUgaXMgcmVuZGVyZWQgc3luY2hyb25vdXNseSwgdGhlbiB0aGVyZVxuICAgICAgLy8gYXJlIG5vIGludGVybGVhdmVkIGV2ZW50cy5cbiAgICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIGxhbmVzKTtcbiAgICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxhbmVzID0gZ2V0TmV4dExhbmVzKHJvb3QsIE5vTGFuZXMpO1xuICAgIGV4aXRTdGF0dXMgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcyk7XG4gIH1cblxuICBpZiAocm9vdC50YWcgIT09IExlZ2FjeVJvb3QgJiYgZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpIHtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IFJldHJ5QWZ0ZXJFcnJvcjsgLy8gSWYgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGh5ZHJhdGlvbixcbiAgICAvLyBkaXNjYXJkIHNlcnZlciByZXNwb25zZSBhbmQgZmFsbCBiYWNrIHRvIGNsaWVudCBzaWRlIHJlbmRlci5cblxuICAgIGlmIChyb290Lmh5ZHJhdGUpIHtcbiAgICAgIHJvb3QuaHlkcmF0ZSA9IGZhbHNlO1xuICAgICAgY2xlYXJDb250YWluZXIocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICB9IC8vIElmIHNvbWV0aGluZyB0aHJldyBhbiBlcnJvciwgdHJ5IHJlbmRlcmluZyBvbmUgbW9yZSB0aW1lLiBXZSdsbCByZW5kZXJcbiAgICAvLyBzeW5jaHJvbm91c2x5IHRvIGJsb2NrIGNvbmN1cnJlbnQgZGF0YSBtdXRhdGlvbnMsIGFuZCB3ZSdsbCBpbmNsdWRlc1xuICAgIC8vIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYXJlIGluY2x1ZGVkLiBJZiBpdCBzdGlsbCBmYWlscyBhZnRlciB0aGUgc2Vjb25kXG4gICAgLy8gYXR0ZW1wdCwgd2UnbGwgZ2l2ZSB1cCBhbmQgY29tbWl0IHRoZSByZXN1bHRpbmcgdHJlZS5cblxuXG4gICAgbGFuZXMgPSBnZXRMYW5lc1RvUmV0cnlTeW5jaHJvbm91c2x5T25FcnJvcihyb290KTtcblxuICAgIGlmIChsYW5lcyAhPT0gTm9MYW5lcykge1xuICAgICAgZXhpdFN0YXR1cyA9IHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgIHZhciBmYXRhbEVycm9yID0gd29ya0luUHJvZ3Jlc3NSb290RmF0YWxFcnJvcjtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBOb0xhbmVzKTtcbiAgICBtYXJrUm9vdFN1c3BlbmRlZCQxKHJvb3QsIGxhbmVzKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIHRocm93IGZhdGFsRXJyb3I7XG4gIH0gLy8gV2Ugbm93IGhhdmUgYSBjb25zaXN0ZW50IHRyZWUuIEJlY2F1c2UgdGhpcyBpcyBhIHN5bmMgcmVuZGVyLCB3ZVxuICAvLyB3aWxsIGNvbW1pdCBpdCBldmVuIGlmIHNvbWV0aGluZyBzdXNwZW5kZWQuXG5cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgcm9vdC5maW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IGxhbmVzO1xuICBjb21taXRSb290KHJvb3QpOyAvLyBCZWZvcmUgZXhpdGluZywgbWFrZSBzdXJlIHRoZXJlJ3MgYSBjYWxsYmFjayBzY2hlZHVsZWQgZm9yIHRoZSBuZXh0XG4gIC8vIHBlbmRpbmcgbGV2ZWwuXG5cbiAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIG5vdygpKTtcbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBmbHVzaERpc2NyZXRlVXBkYXRlcygpIHtcbiAgLy8gVE9ETzogU2hvdWxkIGJlIGFibGUgdG8gZmx1c2ggaW5zaWRlIGJhdGNoZWRVcGRhdGVzLCBidXQgbm90IGluc2lkZSBgYWN0YC5cbiAgLy8gSG93ZXZlciwgYGFjdGAgdXNlcyBgYmF0Y2hlZFVwZGF0ZXNgLCBzbyB0aGVyZSdzIG5vIHdheSB0byBkaXN0aW5ndWlzaFxuICAvLyB0aG9zZSB0d28gY2FzZXMuIE5lZWQgdG8gZml4IHRoaXMgYmVmb3JlIGV4cG9zaW5nIGZsdXNoRGlzY3JldGVVcGRhdGVzXG4gIC8vIGFzIGEgcHVibGljIEFQSS5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKEJhdGNoZWRDb250ZXh0IHwgUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgICAgICBlcnJvcigndW5zdGFibGVfZmx1c2hEaXNjcmV0ZVVwZGF0ZXM6IENhbm5vdCBmbHVzaCB1cGRhdGVzIHdoZW4gUmVhY3QgaXMgJyArICdhbHJlYWR5IHJlbmRlcmluZy4nKTtcbiAgICAgIH1cbiAgICB9IC8vIFdlJ3JlIGFscmVhZHkgcmVuZGVyaW5nLCBzbyB3ZSBjYW4ndCBzeW5jaHJvbm91c2x5IGZsdXNoIHBlbmRpbmcgd29yay5cbiAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGEgbmVzdGVkIGV2ZW50IGRpc3BhdGNoIHRyaWdnZXJlZCBieSBhIGxpZmVjeWNsZS9lZmZlY3QsXG4gICAgLy8gbGlrZSBgZWwuZm9jdXMoKWAuIEV4aXQuXG5cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGZsdXNoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcygpOyAvLyBJZiB0aGUgZGlzY3JldGUgdXBkYXRlcyBzY2hlZHVsZWQgcGFzc2l2ZSBlZmZlY3RzLCBmbHVzaCB0aGVtIG5vdyBzbyB0aGF0XG4gIC8vIHRoZXkgZmlyZSBiZWZvcmUgdGhlIG5leHQgc2VyaWFsIGV2ZW50LlxuXG4gIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbn1cblxuZnVuY3Rpb24gZmx1c2hQZW5kaW5nRGlzY3JldGVVcGRhdGVzKCkge1xuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIC8vIEZvciBlYWNoIHJvb3Qgd2l0aCBwZW5kaW5nIGRpc2NyZXRlIHVwZGF0ZXMsIHNjaGVkdWxlIGEgY2FsbGJhY2sgdG9cbiAgICAvLyBpbW1lZGlhdGVseSBmbHVzaCB0aGVtLlxuICAgIHZhciByb290cyA9IHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXM7XG4gICAgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyA9IG51bGw7XG4gICAgcm9vdHMuZm9yRWFjaChmdW5jdGlvbiAocm9vdCkge1xuICAgICAgbWFya0Rpc2NyZXRlVXBkYXRlc0V4cGlyZWQocm9vdCk7XG4gICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgbm93KCkpO1xuICAgIH0pO1xuICB9IC8vIE5vdyBmbHVzaCB0aGUgaW1tZWRpYXRlIHF1ZXVlLlxuXG5cbiAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xufVxuXG5mdW5jdGlvbiBiYXRjaGVkVXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQmF0Y2hlZENvbnRleHQ7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oYSk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuXG4gICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaFxuICAgICAgcmVzZXRSZW5kZXJUaW1lcigpO1xuICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gYmF0Y2hlZEV2ZW50VXBkYXRlcyQxKGZuLCBhKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRXZlbnRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGRpc2NyZXRlVXBkYXRlcyQxKGZuLCBhLCBiLCBjLCBkKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gRGlzY3JldGVFdmVudENvbnRleHQ7XG5cbiAge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcnVuV2l0aFByaW9yaXR5JDEoVXNlckJsb2NraW5nUHJpb3JpdHkkMiwgZm4uYmluZChudWxsLCBhLCBiLCBjLCBkKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgICAgaWYgKGV4ZWN1dGlvbkNvbnRleHQgPT09IE5vQ29udGV4dCkge1xuICAgICAgICAvLyBGbHVzaCB0aGUgaW1tZWRpYXRlIGNhbGxiYWNrcyB0aGF0IHdlcmUgc2NoZWR1bGVkIGR1cmluZyB0aGlzIGJhdGNoXG4gICAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgICAgZmx1c2hTeW5jQ2FsbGJhY2tRdWV1ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdW5iYXRjaGVkVXBkYXRlcyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICBleGVjdXRpb25Db250ZXh0ICY9IH5CYXRjaGVkQ29udGV4dDtcbiAgZXhlY3V0aW9uQ29udGV4dCB8PSBMZWdhY3lVbmJhdGNoZWRDb250ZXh0O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKGEpO1xuICB9IGZpbmFsbHkge1xuICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuICAgIGlmIChleGVjdXRpb25Db250ZXh0ID09PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIEZsdXNoIHRoZSBpbW1lZGlhdGUgY2FsbGJhY2tzIHRoYXQgd2VyZSBzY2hlZHVsZWQgZHVyaW5nIHRoaXMgYmF0Y2hcbiAgICAgIHJlc2V0UmVuZGVyVGltZXIoKTtcbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGZsdXNoU3luYyhmbiwgYSkge1xuICB2YXIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuXG4gIGlmICgocHJldkV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KSB7XG4gICAge1xuICAgICAgZXJyb3IoJ2ZsdXNoU3luYyB3YXMgY2FsbGVkIGZyb20gaW5zaWRlIGEgbGlmZWN5Y2xlIG1ldGhvZC4gUmVhY3QgY2Fubm90ICcgKyAnZmx1c2ggd2hlbiBSZWFjdCBpcyBhbHJlYWR5IHJlbmRlcmluZy4gQ29uc2lkZXIgbW92aW5nIHRoaXMgY2FsbCB0byAnICsgJ2Egc2NoZWR1bGVyIHRhc2sgb3IgbWljcm8gdGFzay4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oYSk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0IHw9IEJhdGNoZWRDb250ZXh0O1xuXG4gIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZuKSB7XG4gICAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShJbW1lZGlhdGVQcmlvcml0eSQxLCBmbi5iaW5kKG51bGwsIGEpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDsgLy8gRmx1c2ggdGhlIGltbWVkaWF0ZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCBkdXJpbmcgdGhpcyBiYXRjaC5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgaGFwcGVuIGV2ZW4gaWYgYmF0Y2hlZFVwZGF0ZXMgaXMgaGlnaGVyIHVwXG4gICAgICAvLyB0aGUgc3RhY2suXG5cbiAgICAgIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHB1c2hSZW5kZXJMYW5lcyhmaWJlciwgbGFuZXMpIHtcbiAgcHVzaChzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IsIHN1YnRyZWVSZW5kZXJMYW5lcywgZmliZXIpO1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBtZXJnZUxhbmVzKHN1YnRyZWVSZW5kZXJMYW5lcywgbGFuZXMpO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzID0gbWVyZ2VMYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RJbmNsdWRlZExhbmVzLCBsYW5lcyk7XG59XG5mdW5jdGlvbiBwb3BSZW5kZXJMYW5lcyhmaWJlcikge1xuICBzdWJ0cmVlUmVuZGVyTGFuZXMgPSBzdWJ0cmVlUmVuZGVyTGFuZXNDdXJzb3IuY3VycmVudDtcbiAgcG9wKHN1YnRyZWVSZW5kZXJMYW5lc0N1cnNvciwgZmliZXIpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcykge1xuICByb290LmZpbmlzaGVkV29yayA9IG51bGw7XG4gIHJvb3QuZmluaXNoZWRMYW5lcyA9IE5vTGFuZXM7XG4gIHZhciB0aW1lb3V0SGFuZGxlID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuXG4gIGlmICh0aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXQpIHtcbiAgICAvLyBUaGUgcm9vdCBwcmV2aW91cyBzdXNwZW5kZWQgYW5kIHNjaGVkdWxlZCBhIHRpbWVvdXQgdG8gY29tbWl0IGEgZmFsbGJhY2tcbiAgICAvLyBzdGF0ZS4gTm93IHRoYXQgd2UgaGF2ZSBhZGRpdGlvbmFsIHdvcmssIGNhbmNlbCB0aGUgdGltZW91dC5cbiAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7IC8vICRGbG93Rml4TWUgQ29tcGxhaW5zIG5vVGltZW91dCBpcyBub3QgYSBUaW1lb3V0SUQsIGRlc3BpdGUgdGhlIGNoZWNrIGFib3ZlXG5cbiAgICBjYW5jZWxUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICB9XG5cbiAgaWYgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgdmFyIGludGVycnVwdGVkV29yayA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcblxuICAgIHdoaWxlIChpbnRlcnJ1cHRlZFdvcmsgIT09IG51bGwpIHtcbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayhpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybjtcbiAgICB9XG4gIH1cblxuICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICB3b3JrSW5Qcm9ncmVzcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJvb3QuY3VycmVudCwgbnVsbCk7XG4gIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gc3VidHJlZVJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290SW5jbHVkZWRMYW5lcyA9IGxhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEluY29tcGxldGU7XG4gIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMgPSBOb0xhbmVzO1xuICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IE5vTGFuZXM7XG5cbiAge1xuICAgIHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXJyb3Iocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgZG8ge1xuICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc2V0IG1vZHVsZS1sZXZlbCBzdGF0ZSB0aGF0IHdhcyBzZXQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuXG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIHJlc2V0SG9va3NBZnRlclRocm93KCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpOyAvLyBUT0RPOiBJIGZvdW5kIGFuZCBhZGRlZCB0aGlzIG1pc3NpbmcgbGluZSB3aGlsZSBpbnZlc3RpZ2F0aW5nIGFcbiAgICAgIC8vIHNlcGFyYXRlIGlzc3VlLiBXcml0ZSBhIHJlZ3Jlc3Npb24gdGVzdCB1c2luZyBzdHJpbmcgcmVmcy5cblxuICAgICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKGVycm9yZWRXb3JrID09PSBudWxsIHx8IGVycm9yZWRXb3JrLnJldHVybiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBFeHBlY3RlZCB0byBiZSB3b3JraW5nIG9uIGEgbm9uLXJvb3QgZmliZXIuIFRoaXMgaXMgYSBmYXRhbCBlcnJvclxuICAgICAgICAvLyBiZWNhdXNlIHRoZXJlJ3Mgbm8gYW5jZXN0b3IgdGhhdCBjYW4gaGFuZGxlIGl0OyB0aGUgcm9vdCBpc1xuICAgICAgICAvLyBzdXBwb3NlZCB0byBjYXB0dXJlIGFsbCBlcnJvcnMgdGhhdCB3ZXJlbid0IGNhdWdodCBieSBhbiBlcnJvclxuICAgICAgICAvLyBib3VuZGFyeS5cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEZhdGFsRXJyb3IgPSB0aHJvd25WYWx1ZTsgLy8gU2V0IGB3b3JrSW5Qcm9ncmVzc2AgdG8gbnVsbC4gVGhpcyByZXByZXNlbnRzIGFkdmFuY2luZyB0byB0aGUgbmV4dFxuICAgICAgICAvLyBzaWJsaW5nLCBvciB0aGUgcGFyZW50IGlmIHRoZXJlIGFyZSBubyBzaWJsaW5ncy4gQnV0IHNpbmNlIHRoZSByb290XG4gICAgICAgIC8vIGhhcyBubyBzaWJsaW5ncyBub3IgYSBwYXJlbnQsIHdlIHNldCBpdCB0byBudWxsLiBVc3VhbGx5IHRoaXMgaXNcbiAgICAgICAgLy8gaGFuZGxlZCBieSBgY29tcGxldGVVbml0T2ZXb3JrYCBvciBgdW53aW5kV29ya2AsIGJ1dCBzaW5jZSB3ZSdyZVxuICAgICAgICAvLyBpbnRlbnRpb25hbGx5IG5vdCBjYWxsaW5nIHRob3NlLCB3ZSBuZWVkIHNldCBpdCBoZXJlLlxuICAgICAgICAvLyBUT0RPOiBDb25zaWRlciBjYWxsaW5nIGB1bndpbmRXb3JrYCB0byBwb3AgdGhlIGNvbnRleHRzLlxuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW5hYmxlUHJvZmlsZXJUaW1lciAmJiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpIHtcbiAgICAgICAgLy8gUmVjb3JkIHRoZSB0aW1lIHNwZW50IHJlbmRlcmluZyBiZWZvcmUgYW4gZXJyb3Igd2FzIHRocm93bi4gVGhpc1xuICAgICAgICAvLyBhdm9pZHMgaW5hY2N1cmF0ZSBQcm9maWxlciBkdXJhdGlvbnMgaW4gdGhlIGNhc2Ugb2YgYVxuICAgICAgICAvLyBzdXNwZW5kZWQgcmVuZGVyLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGVycm9yZWRXb3JrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3dFeGNlcHRpb24ocm9vdCwgZXJyb3JlZFdvcmsucmV0dXJuLCBlcnJvcmVkV29yaywgdGhyb3duVmFsdWUsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKTtcbiAgICAgIGNvbXBsZXRlVW5pdE9mV29yayhlcnJvcmVkV29yayk7XG4gICAgfSBjYXRjaCAoeWV0QW5vdGhlclRocm93blZhbHVlKSB7XG4gICAgICAvLyBTb21ldGhpbmcgaW4gdGhlIHJldHVybiBwYXRoIGFsc28gdGhyZXcuXG4gICAgICB0aHJvd25WYWx1ZSA9IHlldEFub3RoZXJUaHJvd25WYWx1ZTtcblxuICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSBlcnJvcmVkV29yayAmJiBlcnJvcmVkV29yayAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0aGlzIGJvdW5kYXJ5IGhhcyBhbHJlYWR5IGVycm9yZWQsIHRoZW4gd2UgaGFkIHRyb3VibGUgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB0aGUgZXJyb3IuIEJ1YmJsZSBpdCB0byB0aGUgbmV4dCBib3VuZGFyeS5cbiAgICAgICAgZXJyb3JlZFdvcmsgPSBlcnJvcmVkV29yay5yZXR1cm47XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gZXJyb3JlZFdvcms7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgfVxuXG4gICAgICBjb250aW51ZTtcbiAgICB9IC8vIFJldHVybiB0byB0aGUgbm9ybWFsIHdvcmsgbG9vcC5cblxuXG4gICAgcmV0dXJuO1xuICB9IHdoaWxlICh0cnVlKTtcbn1cblxuZnVuY3Rpb24gcHVzaERpc3BhdGNoZXIoKSB7XG4gIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMi5jdXJyZW50O1xuICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDIuY3VycmVudCA9IENvbnRleHRPbmx5RGlzcGF0Y2hlcjtcblxuICBpZiAocHJldkRpc3BhdGNoZXIgPT09IG51bGwpIHtcbiAgICAvLyBUaGUgUmVhY3QgaXNvbW9ycGhpYyBwYWNrYWdlIGRvZXMgbm90IGluY2x1ZGUgYSBkZWZhdWx0IGRpc3BhdGNoZXIuXG4gICAgLy8gSW5zdGVhZCB0aGUgZmlyc3QgcmVuZGVyZXIgd2lsbCBsYXppbHkgYXR0YWNoIG9uZSwgaW4gb3JkZXIgdG8gZ2l2ZVxuICAgIC8vIG5pY2VyIGVycm9yIG1lc3NhZ2VzLlxuICAgIHJldHVybiBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHByZXZEaXNwYXRjaGVyO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpIHtcbiAgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQyLmN1cnJlbnQgPSBwcmV2RGlzcGF0Y2hlcjtcbn1cblxuZnVuY3Rpb24gcHVzaEludGVyYWN0aW9ucyhyb290KSB7XG4gIHtcbiAgICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHRyYWNpbmcuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zO1xuICAgIHJldHVybiBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvcEludGVyYWN0aW9ucyhwcmV2SW50ZXJhY3Rpb25zKSB7XG4gIHtcbiAgICB0cmFjaW5nLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtDb21taXRUaW1lT2ZGYWxsYmFjaygpIHtcbiAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA9IG5vdygpO1xufVxuZnVuY3Rpb24gbWFya1NraXBwZWRVcGRhdGVMYW5lcyhsYW5lKSB7XG4gIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9IG1lcmdlTGFuZXMobGFuZSwgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzKTtcbn1cbmZ1bmN0aW9uIHJlbmRlckRpZFN1c3BlbmQoKSB7XG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290SW5jb21wbGV0ZSkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkO1xuICB9XG59XG5mdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGUgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkV2l0aERlbGF5O1xuICB9IC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1cGRhdGVzIHRoYXQgd2Ugc2tpcHBlZCB0cmVlIHRoYXQgbWlnaHQgaGF2ZSB1bmJsb2NrZWRcbiAgLy8gdGhpcyByZW5kZXIuXG5cblxuICBpZiAod29ya0luUHJvZ3Jlc3NSb290ICE9PSBudWxsICYmIChpbmNsdWRlc05vbklkbGVXb3JrKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcykgfHwgaW5jbHVkZXNOb25JZGxlV29yayh3b3JrSW5Qcm9ncmVzc1Jvb3RVcGRhdGVkTGFuZXMpKSkge1xuICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgcmVuZGVyIGFzIHN1c3BlbmRlZCBzbyB0aGF0IHdlIHN3aXRjaCB0byB3b3JraW5nIG9uXG4gICAgLy8gdGhlIHVwZGF0ZXMgdGhhdCB3ZXJlIHNraXBwZWQuIFVzdWFsbHkgd2Ugb25seSBzdXNwZW5kIGF0IHRoZSBlbmQgb2ZcbiAgICAvLyB0aGUgcmVuZGVyIHBoYXNlLlxuICAgIC8vIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHdheXMgbWFyayB0aGUgcm9vdCBhcyBzdXNwZW5kZWQgaW1tZWRpYXRlbHlcbiAgICAvLyAoaW5zaWRlIHRoaXMgZnVuY3Rpb24pLCBzaW5jZSBieSBzdXNwZW5kaW5nIGF0IHRoZSBlbmQgb2YgdGhlIHJlbmRlclxuICAgIC8vIHBoYXNlIGludHJvZHVjZXMgYSBwb3RlbnRpYWwgbWlzdGFrZSB3aGVyZSB3ZSBzdXNwZW5kIGxhbmVzIHRoYXQgd2VyZVxuICAgIC8vIHBpbmdlZCBvciB1cGRhdGVkIHdoaWxlIHdlIHdlcmUgcmVuZGVyaW5nLlxuICAgIG1hcmtSb290U3VzcGVuZGVkJDEod29ya0luUHJvZ3Jlc3NSb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlbmRlckRpZEVycm9yKCkge1xuICBpZiAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdENvbXBsZXRlZCkge1xuICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RXJyb3JlZDtcbiAgfVxufSAvLyBDYWxsZWQgZHVyaW5nIHJlbmRlciB0byBkZXRlcm1pbmUgaWYgYW55dGhpbmcgaGFzIHN1c3BlbmRlZC5cbi8vIFJldHVybnMgZmFsc2UgaWYgd2UncmUgbm90IHN1cmUuXG5cbmZ1bmN0aW9uIHJlbmRlckhhc05vdFN1c3BlbmRlZFlldCgpIHtcbiAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgb3IgY29tcGxldGVkLCB3ZSBjYW4ndCByZWFsbHkgYmUgc3VyZSxcbiAgLy8gc28gdGhvc2UgYXJlIGZhbHNlLlxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluY29tcGxldGU7XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RTeW5jKHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCBsYW5lcyk7XG4gICAgc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKTtcbiAgfVxuXG4gIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gcHVzaEludGVyYWN0aW9ucyhyb290KTtcblxuICBkbyB7XG4gICAgdHJ5IHtcbiAgICAgIHdvcmtMb29wU3luYygpO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAodGhyb3duVmFsdWUpIHtcbiAgICAgIGhhbmRsZUVycm9yKHJvb3QsIHRocm93blZhbHVlKTtcbiAgICB9XG4gIH0gd2hpbGUgKHRydWUpO1xuXG4gIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIHBvcERpc3BhdGNoZXIocHJldkRpc3BhdGNoZXIpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuICAgIC8vIFRoaXMgaXMgYSBzeW5jIHJlbmRlciwgc28gd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgdGhlIHdob2xlIHRyZWUuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IGFuIGluY29tcGxldGUgcm9vdC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIiApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbn0gLy8gVGhlIHdvcmsgbG9vcCBpcyBhbiBleHRyZW1lbHkgaG90IHBhdGguIFRlbGwgQ2xvc3VyZSBub3QgdG8gaW5saW5lIGl0LlxuXG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BTeW5jKCkge1xuICAvLyBBbHJlYWR5IHRpbWVkIG91dCwgc28gcGVyZm9ybSB3b3JrIHdpdGhvdXQgY2hlY2tpbmcgaWYgd2UgbmVlZCB0byB5aWVsZC5cbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbmRlclJvb3RDb25jdXJyZW50KHJvb3QsIGxhbmVzKSB7XG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKTsgLy8gSWYgdGhlIHJvb3Qgb3IgbGFuZXMgaGF2ZSBjaGFuZ2VkLCB0aHJvdyBvdXQgdGhlIGV4aXN0aW5nIHN0YWNrXG4gIC8vIGFuZCBwcmVwYXJlIGEgZnJlc2ggb25lLiBPdGhlcndpc2Ugd2UnbGwgY29udGludWUgd2hlcmUgd2UgbGVmdCBvZmYuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXMpIHtcbiAgICByZXNldFJlbmRlclRpbWVyKCk7XG4gICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICAgIHN0YXJ0V29ya09uUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB2YXIgcHJldkludGVyYWN0aW9ucyA9IHB1c2hJbnRlcmFjdGlvbnMocm9vdCk7XG5cbiAgZG8ge1xuICAgIHRyeSB7XG4gICAgICB3b3JrTG9vcENvbmN1cnJlbnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKHRocm93blZhbHVlKSB7XG4gICAgICBoYW5kbGVFcnJvcihyb290LCB0aHJvd25WYWx1ZSk7XG4gICAgfVxuICB9IHdoaWxlICh0cnVlKTtcblxuICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcblxuICB7XG4gICAgcG9wSW50ZXJhY3Rpb25zKHByZXZJbnRlcmFjdGlvbnMpO1xuICB9XG5cbiAgcG9wRGlzcGF0Y2hlcihwcmV2RGlzcGF0Y2hlcik7XG4gIGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dDtcblxuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyAhPT0gbnVsbCkge1xuXG4gICAgcmV0dXJuIFJvb3RJbmNvbXBsZXRlO1xuICB9IGVsc2Uge1xuXG5cbiAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzID0gTm9MYW5lczsgLy8gUmV0dXJuIHRoZSBmaW5hbCBleGl0IHN0YXR1cy5cblxuICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICB9XG59XG4vKiogQG5vaW5saW5lICovXG5cblxuZnVuY3Rpb24gd29ya0xvb3BDb25jdXJyZW50KCkge1xuICAvLyBQZXJmb3JtIHdvcmsgdW50aWwgU2NoZWR1bGVyIGFza3MgdXMgdG8geWllbGRcbiAgd2hpbGUgKHdvcmtJblByb2dyZXNzICE9PSBudWxsICYmICFzaG91bGRZaWVsZCgpKSB7XG4gICAgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1Vbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgLy8gVGhlIGN1cnJlbnQsIGZsdXNoZWQsIHN0YXRlIG9mIHRoaXMgZmliZXIgaXMgdGhlIGFsdGVybmF0ZS4gSWRlYWxseVxuICAvLyBub3RoaW5nIHNob3VsZCByZWx5IG9uIHRoaXMsIGJ1dCByZWx5aW5nIG9uIGl0IGhlcmUgbWVhbnMgdGhhdCB3ZSBkb24ndFxuICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gIHZhciBjdXJyZW50ID0gdW5pdE9mV29yay5hbHRlcm5hdGU7XG4gIHNldEN1cnJlbnRGaWJlcih1bml0T2ZXb3JrKTtcbiAgdmFyIG5leHQ7XG5cbiAgaWYgKCAodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICBzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayk7XG4gICAgbmV4dCA9IGJlZ2luV29yayQxKGN1cnJlbnQsIHVuaXRPZldvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7XG4gICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREZWx0YSh1bml0T2ZXb3JrLCB0cnVlKTtcbiAgfSBlbHNlIHtcbiAgICBuZXh0ID0gYmVnaW5Xb3JrJDEoY3VycmVudCwgdW5pdE9mV29yaywgc3VidHJlZVJlbmRlckxhbmVzKTtcbiAgfVxuXG4gIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuXG4gIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHNwYXduIG5ldyB3b3JrLCBjb21wbGV0ZSB0aGUgY3VycmVudCB3b3JrLlxuICAgIGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gIH1cblxuICBSZWFjdEN1cnJlbnRPd25lciQyLmN1cnJlbnQgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAvLyBBdHRlbXB0IHRvIGNvbXBsZXRlIHRoZSBjdXJyZW50IHVuaXQgb2Ygd29yaywgdGhlbiBtb3ZlIHRvIHRoZSBuZXh0XG4gIC8vIHNpYmxpbmcuIElmIHRoZXJlIGFyZSBubyBtb3JlIHNpYmxpbmdzLCByZXR1cm4gdG8gdGhlIHBhcmVudCBmaWJlci5cbiAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuXG4gIGRvIHtcbiAgICAvLyBUaGUgY3VycmVudCwgZmx1c2hlZCwgc3RhdGUgb2YgdGhpcyBmaWJlciBpcyB0aGUgYWx0ZXJuYXRlLiBJZGVhbGx5XG4gICAgLy8gbm90aGluZyBzaG91bGQgcmVseSBvbiB0aGlzLCBidXQgcmVseWluZyBvbiBpdCBoZXJlIG1lYW5zIHRoYXQgd2UgZG9uJ3RcbiAgICAvLyBuZWVkIGFuIGFkZGl0aW9uYWwgZmllbGQgb24gdGhlIHdvcmsgaW4gcHJvZ3Jlc3MuXG4gICAgdmFyIGN1cnJlbnQgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZTtcbiAgICB2YXIgcmV0dXJuRmliZXIgPSBjb21wbGV0ZWRXb3JrLnJldHVybjsgLy8gQ2hlY2sgaWYgdGhlIHdvcmsgY29tcGxldGVkIG9yIGlmIHNvbWV0aGluZyB0aHJldy5cblxuICAgIGlmICgoY29tcGxldGVkV29yay5mbGFncyAmIEluY29tcGxldGUpID09PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIoY29tcGxldGVkV29yayk7XG4gICAgICB2YXIgbmV4dCA9IHZvaWQgMDtcblxuICAgICAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpID09PSBOb01vZGUpIHtcbiAgICAgICAgbmV4dCA9IGNvbXBsZXRlV29yayhjdXJyZW50LCBjb21wbGV0ZWRXb3JrLCBzdWJ0cmVlUmVuZGVyTGFuZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBuZXh0ID0gY29tcGxldGVXb3JrKGN1cnJlbnQsIGNvbXBsZXRlZFdvcmssIHN1YnRyZWVSZW5kZXJMYW5lcyk7IC8vIFVwZGF0ZSByZW5kZXIgZHVyYXRpb24gYXNzdW1pbmcgd2UgZGlkbid0IGVycm9yLlxuXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRGVsdGEoY29tcGxldGVkV29yaywgZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBDb21wbGV0aW5nIHRoaXMgZmliZXIgc3Bhd25lZCBuZXcgd29yay4gV29yayBvbiB0aGF0IG5leHQuXG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbmV4dDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXNldENoaWxkTGFuZXMoY29tcGxldGVkV29yayk7XG5cbiAgICAgIGlmIChyZXR1cm5GaWJlciAhPT0gbnVsbCAmJiAvLyBEbyBub3QgYXBwZW5kIGVmZmVjdHMgdG8gcGFyZW50cyBpZiBhIHNpYmxpbmcgZmFpbGVkIHRvIGNvbXBsZXRlXG4gICAgICAocmV0dXJuRmliZXIuZmxhZ3MgJiBJbmNvbXBsZXRlKSA9PT0gTm9GbGFncykge1xuICAgICAgICAvLyBBcHBlbmQgYWxsIHRoZSBlZmZlY3RzIG9mIHRoZSBzdWJ0cmVlIGFuZCB0aGlzIGZpYmVyIG9udG8gdGhlIGVmZmVjdFxuICAgICAgICAvLyBsaXN0IG9mIHRoZSBwYXJlbnQuIFRoZSBjb21wbGV0aW9uIG9yZGVyIG9mIHRoZSBjaGlsZHJlbiBhZmZlY3RzIHRoZVxuICAgICAgICAvLyBzaWRlLWVmZmVjdCBvcmRlci5cbiAgICAgICAgaWYgKHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuRmliZXIuZmlyc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbXBsZXRlZFdvcmsubGFzdEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChyZXR1cm5GaWJlci5sYXN0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmZpcnN0RWZmZWN0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QgPSBjb21wbGV0ZWRXb3JrLmxhc3RFZmZlY3Q7XG4gICAgICAgIH0gLy8gSWYgdGhpcyBmaWJlciBoYWQgc2lkZS1lZmZlY3RzLCB3ZSBhcHBlbmQgaXQgQUZURVIgdGhlIGNoaWxkcmVuJ3NcbiAgICAgICAgLy8gc2lkZS1lZmZlY3RzLiBXZSBjYW4gcGVyZm9ybSBjZXJ0YWluIHNpZGUtZWZmZWN0cyBlYXJsaWVyIGlmIG5lZWRlZCxcbiAgICAgICAgLy8gYnkgZG9pbmcgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIGVmZmVjdCBsaXN0LiBXZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIHNjaGVkdWxlIG91ciBvd24gc2lkZS1lZmZlY3Qgb24gb3VyIG93biBsaXN0IGJlY2F1c2UgaWYgZW5kIHVwXG4gICAgICAgIC8vIHJldXNpbmcgY2hpbGRyZW4gd2UnbGwgc2NoZWR1bGUgdGhpcyBlZmZlY3Qgb250byBpdHNlbGYgc2luY2Ugd2UncmVcbiAgICAgICAgLy8gYXQgdGhlIGVuZC5cblxuXG4gICAgICAgIHZhciBmbGFncyA9IGNvbXBsZXRlZFdvcmsuZmxhZ3M7IC8vIFNraXAgYm90aCBOb1dvcmsgYW5kIFBlcmZvcm1lZFdvcmsgdGFncyB3aGVuIGNyZWF0aW5nIHRoZSBlZmZlY3RcbiAgICAgICAgLy8gbGlzdC4gUGVyZm9ybWVkV29yayBlZmZlY3QgaXMgcmVhZCBieSBSZWFjdCBEZXZUb29scyBidXQgc2hvdWxkbid0IGJlXG4gICAgICAgIC8vIGNvbW1pdHRlZC5cblxuICAgICAgICBpZiAoZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgICAgICAgaWYgKHJldHVybkZpYmVyLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmxhc3RFZmZlY3QubmV4dEVmZmVjdCA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm5GaWJlci5sYXN0RWZmZWN0ID0gY29tcGxldGVkV29yaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUgYmVjYXVzZSBzb21ldGhpbmcgdGhyZXcuIFBvcCB2YWx1ZXMgb2ZmXG4gICAgICAvLyB0aGUgc3RhY2sgd2l0aG91dCBlbnRlcmluZyB0aGUgY29tcGxldGUgcGhhc2UuIElmIHRoaXMgaXMgYSBib3VuZGFyeSxcbiAgICAgIC8vIGNhcHR1cmUgdmFsdWVzIGlmIHBvc3NpYmxlLlxuICAgICAgdmFyIF9uZXh0ID0gdW53aW5kV29yayhjb21wbGV0ZWRXb3JrKTsgLy8gQmVjYXVzZSB0aGlzIGZpYmVyIGRpZCBub3QgY29tcGxldGUsIGRvbid0IHJlc2V0IGl0cyBleHBpcmF0aW9uIHRpbWUuXG5cblxuICAgICAgaWYgKF9uZXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGNvbXBsZXRpbmcgdGhpcyB3b3JrIHNwYXduZWQgbmV3IHdvcmssIGRvIHRoYXQgbmV4dC4gV2UnbGwgY29tZVxuICAgICAgICAvLyBiYWNrIGhlcmUgYWdhaW4uXG4gICAgICAgIC8vIFNpbmNlIHdlJ3JlIHJlc3RhcnRpbmcsIHJlbW92ZSBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGhvc3QgZWZmZWN0XG4gICAgICAgIC8vIGZyb20gdGhlIGVmZmVjdCB0YWcuXG4gICAgICAgIF9uZXh0LmZsYWdzICY9IEhvc3RFZmZlY3RNYXNrO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IF9uZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICggKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIC8vIFJlY29yZCB0aGUgcmVuZGVyIGR1cmF0aW9uIGZvciB0aGUgZmliZXIgdGhhdCBlcnJvcmVkLlxuICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZERlbHRhKGNvbXBsZXRlZFdvcmssIGZhbHNlKTsgLy8gSW5jbHVkZSB0aGUgdGltZSBzcGVudCB3b3JraW5nIG9uIGZhaWxlZCBjaGlsZHJlbiBiZWZvcmUgY29udGludWluZy5cblxuICAgICAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgICAgIHdoaWxlIChjaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbXBsZXRlZFdvcmsuYWN0dWFsRHVyYXRpb24gPSBhY3R1YWxEdXJhdGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJldHVybkZpYmVyICE9PSBudWxsKSB7XG4gICAgICAgIC8vIE1hcmsgdGhlIHBhcmVudCBmaWJlciBhcyBpbmNvbXBsZXRlIGFuZCBjbGVhciBpdHMgZWZmZWN0IGxpc3QuXG4gICAgICAgIHJldHVybkZpYmVyLmZpcnN0RWZmZWN0ID0gcmV0dXJuRmliZXIubGFzdEVmZmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybkZpYmVyLmZsYWdzIHw9IEluY29tcGxldGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNpYmxpbmdGaWJlciA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcblxuICAgIGlmIChzaWJsaW5nRmliZXIgIT09IG51bGwpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIG1vcmUgd29yayB0byBkbyBpbiB0aGlzIHJldHVybkZpYmVyLCBkbyB0aGF0IG5leHQuXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHNpYmxpbmdGaWJlcjtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIE90aGVyd2lzZSwgcmV0dXJuIHRvIHRoZSBwYXJlbnRcblxuXG4gICAgY29tcGxldGVkV29yayA9IHJldHVybkZpYmVyOyAvLyBVcGRhdGUgdGhlIG5leHQgdGhpbmcgd2UncmUgd29ya2luZyBvbiBpbiBjYXNlIHNvbWV0aGluZyB0aHJvd3MuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gIH0gd2hpbGUgKGNvbXBsZXRlZFdvcmsgIT09IG51bGwpOyAvLyBXZSd2ZSByZWFjaGVkIHRoZSByb290LlxuXG5cbiAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJbmNvbXBsZXRlKSB7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RDb21wbGV0ZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRDaGlsZExhbmVzKGNvbXBsZXRlZFdvcmspIHtcbiAgaWYgKCAvLyBUT0RPOiBNb3ZlIHRoaXMgY2hlY2sgb3V0IG9mIHRoZSBob3QgcGF0aCBieSBtb3ZpbmcgYHJlc2V0Q2hpbGRMYW5lc2BcbiAgLy8gdG8gc3dpdGNoIHN0YXRlbWVudCBpbiBgY29tcGxldGVXb3JrYC5cbiAgKGNvbXBsZXRlZFdvcmsudGFnID09PSBMZWdhY3lIaWRkZW5Db21wb25lbnQgfHwgY29tcGxldGVkV29yay50YWcgPT09IE9mZnNjcmVlbkNvbXBvbmVudCkgJiYgY29tcGxldGVkV29yay5tZW1vaXplZFN0YXRlICE9PSBudWxsICYmICFpbmNsdWRlc1NvbWVMYW5lKHN1YnRyZWVSZW5kZXJMYW5lcywgT2Zmc2NyZWVuTGFuZSkgJiYgKGNvbXBsZXRlZFdvcmsubW9kZSAmIENvbmN1cnJlbnRNb2RlKSAhPT0gTm9MYW5lcykge1xuICAgIC8vIFRoZSBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvbmVudCBhcmUgaGlkZGVuLiBEb24ndCBidWJibGUgdGhlaXJcbiAgICAvLyBleHBpcmF0aW9uIHRpbWVzLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuZXdDaGlsZExhbmVzID0gTm9MYW5lczsgLy8gQnViYmxlIHVwIHRoZSBlYXJsaWVzdCBleHBpcmF0aW9uIHRpbWUuXG5cbiAgaWYgKCAoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAvLyBJbiBwcm9maWxpbmcgbW9kZSwgcmVzZXRDaGlsZEV4cGlyYXRpb25UaW1lIGlzIGFsc28gdXNlZCB0byByZXNldFxuICAgIC8vIHByb2ZpbGVyIGR1cmF0aW9ucy5cbiAgICB2YXIgYWN0dWFsRHVyYXRpb24gPSBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uO1xuICAgIHZhciB0cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uOyAvLyBXaGVuIGEgZmliZXIgaXMgY2xvbmVkLCBpdHMgYWN0dWFsRHVyYXRpb24gaXMgcmVzZXQgdG8gMC4gVGhpcyB2YWx1ZSB3aWxsXG4gICAgLy8gb25seSBiZSB1cGRhdGVkIGlmIHdvcmsgaXMgZG9uZSBvbiB0aGUgZmliZXIgKGkuZS4gaXQgZG9lc24ndCBiYWlsb3V0KS5cbiAgICAvLyBXaGVuIHdvcmsgaXMgZG9uZSwgaXQgc2hvdWxkIGJ1YmJsZSB0byB0aGUgcGFyZW50J3MgYWN0dWFsRHVyYXRpb24uIElmXG4gICAgLy8gdGhlIGZpYmVyIGhhcyBub3QgYmVlbiBjbG9uZWQgdGhvdWdoLCAobWVhbmluZyBubyB3b3JrIHdhcyBkb25lKSwgdGhlblxuICAgIC8vIHRoaXMgdmFsdWUgd2lsbCByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCB3b3JraW5nIG9uIGEgcHJldmlvdXNcbiAgICAvLyByZW5kZXIuIEluIHRoYXQgY2FzZSBpdCBzaG91bGQgbm90IGJ1YmJsZS4gV2UgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgd2FzXG4gICAgLy8gY2xvbmVkIGJ5IGNvbXBhcmluZyB0aGUgY2hpbGQgcG9pbnRlci5cblxuICAgIHZhciBzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMgPSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZSA9PT0gbnVsbCB8fCBjb21wbGV0ZWRXb3JrLmNoaWxkICE9PSBjb21wbGV0ZWRXb3JrLmFsdGVybmF0ZS5jaGlsZDtcbiAgICB2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkO1xuXG4gICAgd2hpbGUgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICBuZXdDaGlsZExhbmVzID0gbWVyZ2VMYW5lcyhuZXdDaGlsZExhbmVzLCBtZXJnZUxhbmVzKGNoaWxkLmxhbmVzLCBjaGlsZC5jaGlsZExhbmVzKSk7XG5cbiAgICAgIGlmIChzaG91bGRCdWJibGVBY3R1YWxEdXJhdGlvbnMpIHtcbiAgICAgICAgYWN0dWFsRHVyYXRpb24gKz0gY2hpbGQuYWN0dWFsRHVyYXRpb247XG4gICAgICB9XG5cbiAgICAgIHRyZWVCYXNlRHVyYXRpb24gKz0gY2hpbGQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICB9XG5cbiAgICB2YXIgaXNUaW1lZE91dFN1c3BlbnNlID0gY29tcGxldGVkV29yay50YWcgPT09IFN1c3BlbnNlQ29tcG9uZW50ICYmIGNvbXBsZXRlZFdvcmsubWVtb2l6ZWRTdGF0ZSAhPT0gbnVsbDtcblxuICAgIGlmIChpc1RpbWVkT3V0U3VzcGVuc2UpIHtcbiAgICAgIC8vIERvbid0IGNvdW50IHRpbWUgc3BlbnQgaW4gYSB0aW1lZCBvdXQgU3VzcGVuc2Ugc3VidHJlZSBhcyBwYXJ0IG9mIHRoZSBiYXNlIGR1cmF0aW9uLlxuICAgICAgdmFyIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgICAgaWYgKHByaW1hcnlDaGlsZEZyYWdtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHRyZWVCYXNlRHVyYXRpb24gLT0gcHJpbWFyeUNoaWxkRnJhZ21lbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gYWN0dWFsRHVyYXRpb247XG4gICAgY29tcGxldGVkV29yay50cmVlQmFzZUR1cmF0aW9uID0gdHJlZUJhc2VEdXJhdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX2NoaWxkID0gY29tcGxldGVkV29yay5jaGlsZDtcblxuICAgIHdoaWxlIChfY2hpbGQgIT09IG51bGwpIHtcbiAgICAgIG5ld0NoaWxkTGFuZXMgPSBtZXJnZUxhbmVzKG5ld0NoaWxkTGFuZXMsIG1lcmdlTGFuZXMoX2NoaWxkLmxhbmVzLCBfY2hpbGQuY2hpbGRMYW5lcykpO1xuICAgICAgX2NoaWxkID0gX2NoaWxkLnNpYmxpbmc7XG4gICAgfVxuICB9XG5cbiAgY29tcGxldGVkV29yay5jaGlsZExhbmVzID0gbmV3Q2hpbGRMYW5lcztcbn1cblxuZnVuY3Rpb24gY29tbWl0Um9vdChyb290KSB7XG4gIHZhciByZW5kZXJQcmlvcml0eUxldmVsID0gZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKTtcbiAgcnVuV2l0aFByaW9yaXR5JDEoSW1tZWRpYXRlUHJpb3JpdHkkMSwgY29tbWl0Um9vdEltcGwuYmluZChudWxsLCByb290LCByZW5kZXJQcmlvcml0eUxldmVsKSk7XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBjb21taXRSb290SW1wbChyb290LCByZW5kZXJQcmlvcml0eUxldmVsKSB7XG4gIGRvIHtcbiAgICAvLyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBjYWxsIGBmbHVzaFN5bmNVcGRhdGVRdWV1ZWAgYXQgdGhlIGVuZCwgd2hpY2hcbiAgICAvLyBtZWFucyBgZmx1c2hQYXNzaXZlRWZmZWN0c2Agd2lsbCBzb21ldGltZXMgcmVzdWx0IGluIGFkZGl0aW9uYWxcbiAgICAvLyBwYXNzaXZlIGVmZmVjdHMuIFNvIHdlIG5lZWQgdG8ga2VlcCBmbHVzaGluZyBpbiBhIGxvb3AgdW50aWwgdGhlcmUgYXJlXG4gICAgLy8gbm8gbW9yZSBwZW5kaW5nIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWlnaHQgYmUgYmV0dGVyIGlmIGBmbHVzaFBhc3NpdmVFZmZlY3RzYCBkaWQgbm90IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBmbHVzaCBzeW5jaHJvbm91cyB3b3JrIGF0IHRoZSBlbmQsIHRvIGF2b2lkIGZhY3RvcmluZyBoYXphcmRzIGxpa2UgdGhpcy5cbiAgICBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gIH0gd2hpbGUgKHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzICE9PSBudWxsKTtcblxuICBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKTtcblxuICBpZiAoISgoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIG5vdCBhbHJlYWR5IGJlIHdvcmtpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZmluaXNoZWRXb3JrID0gcm9vdC5maW5pc2hlZFdvcms7XG4gIHZhciBsYW5lcyA9IHJvb3QuZmluaXNoZWRMYW5lcztcblxuICBpZiAoZmluaXNoZWRXb3JrID09PSBudWxsKSB7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJvb3QuZmluaXNoZWRXb3JrID0gbnVsbDtcbiAgcm9vdC5maW5pc2hlZExhbmVzID0gTm9MYW5lcztcblxuICBpZiAoIShmaW5pc2hlZFdvcmsgIT09IHJvb3QuY3VycmVudCkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJDYW5ub3QgY29tbWl0IHRoZSBzYW1lIHRyZWUgYXMgYmVmb3JlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiICk7XG4gICAgfVxuICB9IC8vIGNvbW1pdFJvb3QgbmV2ZXIgcmV0dXJucyBhIGNvbnRpbnVhdGlvbjsgaXQgYWx3YXlzIGZpbmlzaGVzIHN5bmNocm9ub3VzbHkuXG4gIC8vIFNvIHdlIGNhbiBjbGVhciB0aGVzZSBub3cgdG8gYWxsb3cgYSBuZXcgY2FsbGJhY2sgdG8gYmUgc2NoZWR1bGVkLlxuXG5cbiAgcm9vdC5jYWxsYmFja05vZGUgPSBudWxsOyAvLyBVcGRhdGUgdGhlIGZpcnN0IGFuZCBsYXN0IHBlbmRpbmcgdGltZXMgb24gdGhpcyByb290LiBUaGUgbmV3IGZpcnN0XG4gIC8vIHBlbmRpbmcgdGltZSBpcyB3aGF0ZXZlciBpcyBsZWZ0IG9uIHRoZSByb290IGZpYmVyLlxuXG4gIHZhciByZW1haW5pbmdMYW5lcyA9IG1lcmdlTGFuZXMoZmluaXNoZWRXb3JrLmxhbmVzLCBmaW5pc2hlZFdvcmsuY2hpbGRMYW5lcyk7XG4gIG1hcmtSb290RmluaXNoZWQocm9vdCwgcmVtYWluaW5nTGFuZXMpOyAvLyBDbGVhciBhbHJlYWR5IGZpbmlzaGVkIGRpc2NyZXRlIHVwZGF0ZXMgaW4gY2FzZSB0aGF0IGEgbGF0ZXIgY2FsbCBvZlxuICAvLyBgZmx1c2hEaXNjcmV0ZVVwZGF0ZXNgIHN0YXJ0cyBhIHVzZWxlc3MgcmVuZGVyIHBhc3Mgd2hpY2ggbWF5IGNhbmNlbHNcbiAgLy8gYSBzY2hlZHVsZWQgdGltZW91dC5cblxuICBpZiAocm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcyAhPT0gbnVsbCkge1xuICAgIGlmICghaGFzRGlzY3JldGVMYW5lcyhyZW1haW5pbmdMYW5lcykgJiYgcm9vdHNXaXRoUGVuZGluZ0Rpc2NyZXRlVXBkYXRlcy5oYXMocm9vdCkpIHtcbiAgICAgIHJvb3RzV2l0aFBlbmRpbmdEaXNjcmV0ZVVwZGF0ZXMuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpIHtcbiAgICAvLyBXZSBjYW4gcmVzZXQgdGhlc2Ugbm93IHRoYXQgdGhleSBhcmUgZmluaXNoZWQuXG4gICAgd29ya0luUHJvZ3Jlc3NSb290ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBOb0xhbmVzO1xuICB9IC8vIEdldCB0aGUgbGlzdCBvZiBlZmZlY3RzLlxuXG5cbiAgdmFyIGZpcnN0RWZmZWN0O1xuXG4gIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgPiBQZXJmb3JtZWRXb3JrKSB7XG4gICAgLy8gQSBmaWJlcidzIGVmZmVjdCBsaXN0IGNvbnNpc3RzIG9ubHkgb2YgaXRzIGNoaWxkcmVuLCBub3QgaXRzZWxmLiBTbyBpZlxuICAgIC8vIHRoZSByb290IGhhcyBhbiBlZmZlY3QsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuIFRoZVxuICAgIC8vIHJlc3VsdGluZyBsaXN0IGlzIHRoZSBzZXQgdGhhdCB3b3VsZCBiZWxvbmcgdG8gdGhlIHJvb3QncyBwYXJlbnQsIGlmIGl0XG4gICAgLy8gaGFkIG9uZTsgdGhhdCBpcywgYWxsIHRoZSBlZmZlY3RzIGluIHRoZSB0cmVlIGluY2x1ZGluZyB0aGUgcm9vdC5cbiAgICBpZiAoZmluaXNoZWRXb3JrLmxhc3RFZmZlY3QgIT09IG51bGwpIHtcbiAgICAgIGZpbmlzaGVkV29yay5sYXN0RWZmZWN0Lm5leHRFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlyc3RFZmZlY3QgPSBmaW5pc2hlZFdvcms7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlIGlzIG5vIGVmZmVjdCBvbiB0aGUgcm9vdC5cbiAgICBmaXJzdEVmZmVjdCA9IGZpbmlzaGVkV29yay5maXJzdEVmZmVjdDtcbiAgfVxuXG4gIGlmIChmaXJzdEVmZmVjdCAhPT0gbnVsbCkge1xuXG4gICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBSZXNldCB0aGlzIHRvIG51bGwgYmVmb3JlIGNhbGxpbmcgbGlmZWN5Y2xlc1xuXG4gICAgUmVhY3RDdXJyZW50T3duZXIkMi5jdXJyZW50ID0gbnVsbDsgLy8gVGhlIGNvbW1pdCBwaGFzZSBpcyBicm9rZW4gaW50byBzZXZlcmFsIHN1Yi1waGFzZXMuIFdlIGRvIGEgc2VwYXJhdGUgcGFzc1xuICAgIC8vIG9mIHRoZSBlZmZlY3QgbGlzdCBmb3IgZWFjaCBwaGFzZTogYWxsIG11dGF0aW9uIGVmZmVjdHMgY29tZSBiZWZvcmUgYWxsXG4gICAgLy8gbGF5b3V0IGVmZmVjdHMsIGFuZCBzbyBvbi5cbiAgICAvLyBUaGUgZmlyc3QgcGhhc2UgYSBcImJlZm9yZSBtdXRhdGlvblwiIHBoYXNlLiBXZSB1c2UgdGhpcyBwaGFzZSB0byByZWFkIHRoZVxuICAgIC8vIHN0YXRlIG9mIHRoZSBob3N0IHRyZWUgcmlnaHQgYmVmb3JlIHdlIG11dGF0ZSBpdC4gVGhpcyBpcyB3aGVyZVxuICAgIC8vIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlIGlzIGNhbGxlZC5cblxuICAgIGZvY3VzZWRJbnN0YW5jZUhhbmRsZSA9IHByZXBhcmVGb3JDb21taXQocm9vdC5jb250YWluZXJJbmZvKTtcbiAgICBzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgPSBmYWxzZTtcbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMsIG51bGwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIGVycm9yKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7IC8vIFdlIG5vIGxvbmdlciBuZWVkIHRvIHRyYWNrIHRoZSBhY3RpdmUgaW5zdGFuY2UgZmliZXJcblxuXG4gICAgZm9jdXNlZEluc3RhbmNlSGFuZGxlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgY29tbWl0IHRpbWUgdG8gYmUgc2hhcmVkIGJ5IGFsbCBQcm9maWxlcnMgaW4gdGhpc1xuICAgICAgLy8gYmF0Y2guIFRoaXMgZW5hYmxlcyB0aGVtIHRvIGJlIGdyb3VwZWQgbGF0ZXIuXG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfSAvLyBUaGUgbmV4dCBwaGFzZSBpcyB0aGUgbXV0YXRpb24gcGhhc2UsIHdoZXJlIHdlIG11dGF0ZSB0aGUgaG9zdCB0cmVlLlxuXG5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICBkbyB7XG4gICAgICB7XG4gICAgICAgIGludm9rZUd1YXJkZWRDYWxsYmFjayhudWxsLCBjb21taXRNdXRhdGlvbkVmZmVjdHMsIG51bGwsIHJvb3QsIHJlbmRlclByaW9yaXR5TGV2ZWwpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTtcblxuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKG5leHRFZmZlY3QsIF9lcnJvcik7XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpO1xuXG4gICAgcmVzZXRBZnRlckNvbW1pdChyb290LmNvbnRhaW5lckluZm8pOyAvLyBUaGUgd29yay1pbi1wcm9ncmVzcyB0cmVlIGlzIG5vdyB0aGUgY3VycmVudCB0cmVlLiBUaGlzIG11c3QgY29tZSBhZnRlclxuICAgIC8vIHRoZSBtdXRhdGlvbiBwaGFzZSwgc28gdGhhdCB0aGUgcHJldmlvdXMgdHJlZSBpcyBzdGlsbCBjdXJyZW50IGR1cmluZ1xuICAgIC8vIGNvbXBvbmVudFdpbGxVbm1vdW50LCBidXQgYmVmb3JlIHRoZSBsYXlvdXQgcGhhc2UsIHNvIHRoYXQgdGhlIGZpbmlzaGVkXG4gICAgLy8gd29yayBpcyBjdXJyZW50IGR1cmluZyBjb21wb25lbnREaWRNb3VudC9VcGRhdGUuXG5cbiAgICByb290LmN1cnJlbnQgPSBmaW5pc2hlZFdvcms7IC8vIFRoZSBuZXh0IHBoYXNlIGlzIHRoZSBsYXlvdXQgcGhhc2UsIHdoZXJlIHdlIGNhbGwgZWZmZWN0cyB0aGF0IHJlYWRcbiAgICAvLyB0aGUgaG9zdCB0cmVlIGFmdGVyIGl0J3MgYmVlbiBtdXRhdGVkLiBUaGUgaWRpb21hdGljIHVzZSBjYXNlIGZvciB0aGlzIGlzXG4gICAgLy8gbGF5b3V0LCBidXQgY2xhc3MgY29tcG9uZW50IGxpZmVjeWNsZXMgYWxzbyBmaXJlIGhlcmUgZm9yIGxlZ2FjeSByZWFzb25zLlxuXG4gICAgbmV4dEVmZmVjdCA9IGZpcnN0RWZmZWN0O1xuXG4gICAgZG8ge1xuICAgICAge1xuICAgICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgY29tbWl0TGF5b3V0RWZmZWN0cywgbnVsbCwgcm9vdCwgbGFuZXMpO1xuXG4gICAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgICAgaWYgKCEobmV4dEVmZmVjdCAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9lcnJvcjIgPSBjbGVhckNhdWdodEVycm9yKCk7XG5cbiAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihuZXh0RWZmZWN0LCBfZXJyb3IyKTtcbiAgICAgICAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCk7XG5cbiAgICBuZXh0RWZmZWN0ID0gbnVsbDsgLy8gVGVsbCBTY2hlZHVsZXIgdG8geWllbGQgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUsIHNvIHRoZSBicm93c2VyIGhhcyBhblxuICAgIC8vIG9wcG9ydHVuaXR5IHRvIHBhaW50LlxuXG4gICAgcmVxdWVzdFBhaW50KCk7XG5cbiAgICB7XG4gICAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgfVxuXG4gICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIGVmZmVjdHMuXG4gICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrOyAvLyBNZWFzdXJlIHRoZXNlIGFueXdheSBzbyB0aGUgZmxhbWVncmFwaCBleHBsaWNpdGx5IHNob3dzIHRoYXQgdGhlcmUgd2VyZVxuICAgIC8vIG5vIGVmZmVjdHMuXG4gICAgLy8gVE9ETzogTWF5YmUgdGhlcmUncyBhIGJldHRlciB3YXkgdG8gcmVwb3J0IHRoaXMuXG5cbiAgICB7XG4gICAgICByZWNvcmRDb21taXRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJvb3REaWRIYXZlUGFzc2l2ZUVmZmVjdHMgPSByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cztcblxuICBpZiAocm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMpIHtcbiAgICAvLyBUaGlzIGNvbW1pdCBoYXMgcGFzc2l2ZSBlZmZlY3RzLiBTdGFzaCBhIHJlZmVyZW5jZSB0byB0aGVtLiBCdXQgZG9uJ3RcbiAgICAvLyBzY2hlZHVsZSBhIGNhbGxiYWNrIHVudGlsIGFmdGVyIGZsdXNoaW5nIGxheW91dCB3b3JrLlxuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gICAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSByb290O1xuICAgIHBlbmRpbmdQYXNzaXZlRWZmZWN0c0xhbmVzID0gbGFuZXM7XG4gICAgcGVuZGluZ1Bhc3NpdmVFZmZlY3RzUmVuZGVyUHJpb3JpdHkgPSByZW5kZXJQcmlvcml0eUxldmVsO1xuICB9IGVsc2Uge1xuICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhlIGVmZmVjdCBjaGFpbiBhdCB0aGlzIHBvaW50IHNvIGxldCdzIGNsZWFyIHRoZVxuICAgIC8vIG5leHRFZmZlY3QgcG9pbnRlcnMgdG8gYXNzaXN0IHdpdGggR0MuIElmIHdlIGhhdmUgcGFzc2l2ZSBlZmZlY3RzLCB3ZSdsbFxuICAgIC8vIGNsZWFyIHRoaXMgaW4gZmx1c2hQYXNzaXZlRWZmZWN0cy5cbiAgICBuZXh0RWZmZWN0ID0gZmlyc3RFZmZlY3Q7XG5cbiAgICB3aGlsZSAobmV4dEVmZmVjdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5leHROZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICAgICAgbmV4dEVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgICAgaWYgKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgICBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhuZXh0RWZmZWN0KTtcbiAgICAgIH1cblxuICAgICAgbmV4dEVmZmVjdCA9IG5leHROZXh0RWZmZWN0O1xuICAgIH1cbiAgfSAvLyBSZWFkIHRoaXMgYWdhaW4sIHNpbmNlIGFuIGVmZmVjdCBtaWdodCBoYXZlIHVwZGF0ZWQgaXRcblxuXG4gIHJlbWFpbmluZ0xhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXM7IC8vIENoZWNrIGlmIHRoZXJlJ3MgcmVtYWluaW5nIHdvcmsgb24gdGhpcyByb290XG5cbiAgaWYgKHJlbWFpbmluZ0xhbmVzICE9PSBOb0xhbmVzKSB7XG4gICAge1xuICAgICAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBleHBpcmF0aW9uVGltZXMgPSBzcGF3bmVkV29ya0R1cmluZ1JlbmRlcjtcbiAgICAgICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBudWxsO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwaXJhdGlvblRpbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgZXhwaXJhdGlvblRpbWVzW2ldLCByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB0aGVyZSdzIG5vIHJlbWFpbmluZyB3b3JrLCB3ZSBjYW4gY2xlYXIgdGhlIHNldCBvZiBhbHJlYWR5IGZhaWxlZFxuICAgIC8vIGVycm9yIGJvdW5kYXJpZXMuXG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsO1xuICB9XG5cbiAge1xuICAgIGlmICghcm9vdERpZEhhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cywgdGhlbiB3ZSBjYW4gY29tcGxldGUgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb25zLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCB3YWl0IHVudGlsIGFmdGVyIHRoZSBwYXNzaXZlIGVmZmVjdHMgYXJlIGZsdXNoZWQuXG4gICAgICAvLyBXYWl0IHRvIGRvIHRoaXMgdW50aWwgYWZ0ZXIgcmVtYWluaW5nIHdvcmsgaGFzIGJlZW4gc2NoZWR1bGVkLFxuICAgICAgLy8gc28gdGhhdCB3ZSBkb24ndCBwcmVtYXR1cmVseSBzaWduYWwgY29tcGxldGUgZm9yIGludGVyYWN0aW9ucyB3aGVuIHRoZXJlJ3MgZS5nLiBoaWRkZW4gd29yay5cbiAgICAgIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgbGFuZXMpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZW1haW5pbmdMYW5lcyA9PT0gU3luY0xhbmUpIHtcbiAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSByb290IHN5bmNocm9ub3VzbHkgcmUtcmVuZGVycyB3aXRob3V0XG4gICAgLy8gZmluaXNoaW5nLiBJZiB0aGVyZSBhcmUgdG9vIG1hbnksIGl0IGluZGljYXRlcyBhbiBpbmZpbml0ZSB1cGRhdGUgbG9vcC5cbiAgICBpZiAocm9vdCA9PT0gcm9vdFdpdGhOZXN0ZWRVcGRhdGVzKSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gICAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSByb290O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBuZXN0ZWRVcGRhdGVDb3VudCA9IDA7XG4gIH1cblxuICBvbkNvbW1pdFJvb3QoZmluaXNoZWRXb3JrLnN0YXRlTm9kZSwgcmVuZGVyUHJpb3JpdHlMZXZlbCk7XG5cbiAge1xuICAgIG9uQ29tbWl0Um9vdCQxKCk7XG4gIH0gLy8gQWx3YXlzIGNhbGwgdGhpcyBiZWZvcmUgZXhpdGluZyBgY29tbWl0Um9vdGAsIHRvIGVuc3VyZSB0aGF0IGFueVxuICAvLyBhZGRpdGlvbmFsIHdvcmsgb24gdGhpcyByb290IGlzIHNjaGVkdWxlZC5cblxuXG4gIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBub3coKSk7XG5cbiAgaWYgKGhhc1VuY2F1Z2h0RXJyb3IpIHtcbiAgICBoYXNVbmNhdWdodEVycm9yID0gZmFsc2U7XG4gICAgdmFyIF9lcnJvcjMgPSBmaXJzdFVuY2F1Z2h0RXJyb3I7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gbnVsbDtcbiAgICB0aHJvdyBfZXJyb3IzO1xuICB9XG5cbiAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgTGVnYWN5VW5iYXRjaGVkQ29udGV4dCkgIT09IE5vQ29udGV4dCkge1xuICAgIC8vIGEgUmVhY3RET00ucmVuZGVyLWVkIHJvb3QgaW5zaWRlIG9mIGJhdGNoZWRVcGRhdGVzLiBUaGUgY29tbWl0IGZpcmVkXG4gICAgLy8gc3luY2hyb25vdXNseSwgYnV0IGxheW91dCB1cGRhdGVzIHNob3VsZCBiZSBkZWZlcnJlZCB1bnRpbCB0aGUgZW5kXG4gICAgLy8gb2YgdGhlIGJhdGNoLlxuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSAvLyBJZiBsYXlvdXQgd29yayB3YXMgc2NoZWR1bGVkLCBmbHVzaCBpdCBub3cuXG5cblxuICBmbHVzaFN5bmNDYWxsYmFja1F1ZXVlKCk7XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0cygpIHtcbiAgd2hpbGUgKG5leHRFZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKCFzaG91bGRGaXJlQWZ0ZXJBY3RpdmVJbnN0YW5jZUJsdXIgJiYgZm9jdXNlZEluc3RhbmNlSGFuZGxlICE9PSBudWxsKSB7XG4gICAgICBpZiAoKG5leHRFZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikgIT09IE5vRmxhZ3MpIHtcbiAgICAgICAgaWYgKGRvZXNGaWJlckNvbnRhaW4obmV4dEVmZmVjdCwgZm9jdXNlZEluc3RhbmNlSGFuZGxlKSkge1xuICAgICAgICAgIHNob3VsZEZpcmVBZnRlckFjdGl2ZUluc3RhbmNlQmx1ciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBvdXQgb2YgdGhlIGhvdCBwYXRoIHVzaW5nIGEgZGVkaWNhdGVkIGVmZmVjdCB0YWcuXG4gICAgICAgIGlmIChuZXh0RWZmZWN0LnRhZyA9PT0gU3VzcGVuc2VDb21wb25lbnQgJiYgaXNTdXNwZW5zZUJvdW5kYXJ5QmVpbmdIaWRkZW4oY3VycmVudCwgbmV4dEVmZmVjdCkgJiYgZG9lc0ZpYmVyQ29udGFpbihuZXh0RWZmZWN0LCBmb2N1c2VkSW5zdGFuY2VIYW5kbGUpKSB7XG4gICAgICAgICAgc2hvdWxkRmlyZUFmdGVyQWN0aXZlSW5zdGFuY2VCbHVyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoKGZsYWdzICYgU25hcHNob3QpICE9PSBOb0ZsYWdzKSB7XG4gICAgICBzZXRDdXJyZW50RmliZXIobmV4dEVmZmVjdCk7XG4gICAgICBjb21taXRCZWZvcmVNdXRhdGlvbkxpZmVDeWNsZXMoY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgIH1cblxuICAgIGlmICgoZmxhZ3MgJiBQYXNzaXZlKSAhPT0gTm9GbGFncykge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIHBhc3NpdmUgZWZmZWN0cywgc2NoZWR1bGUgYSBjYWxsYmFjayB0byBmbHVzaCBhdFxuICAgICAgLy8gdGhlIGVhcmxpZXN0IG9wcG9ydHVuaXR5LlxuICAgICAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgICAgICByb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cyA9IHRydWU7XG4gICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBjb21taXRNdXRhdGlvbkVmZmVjdHMocm9vdCwgcmVuZGVyUHJpb3JpdHlMZXZlbCkge1xuICAvLyBUT0RPOiBTaG91bGQgcHJvYmFibHkgbW92ZSB0aGUgYnVsayBvZiB0aGlzIGZ1bmN0aW9uIHRvIGNvbW1pdFdvcmsuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiBDb250ZW50UmVzZXQpIHtcbiAgICAgIGNvbW1pdFJlc2V0VGV4dENvbnRlbnQobmV4dEVmZmVjdCk7XG4gICAgfVxuXG4gICAgaWYgKGZsYWdzICYgUmVmKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuXG4gICAgICBpZiAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgICBjb21taXREZXRhY2hSZWYoY3VycmVudCk7XG4gICAgICB9XG4gICAgfSAvLyBUaGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQgaXMgb25seSBjb25jZXJuZWQgYWJvdXQgcGxhY2VtZW50LFxuICAgIC8vIHVwZGF0ZXMsIGFuZCBkZWxldGlvbnMuIFRvIGF2b2lkIG5lZWRpbmcgdG8gYWRkIGEgY2FzZSBmb3IgZXZlcnkgcG9zc2libGVcbiAgICAvLyBiaXRtYXAgdmFsdWUsIHdlIHJlbW92ZSB0aGUgc2Vjb25kYXJ5IGVmZmVjdHMgZnJvbSB0aGUgZWZmZWN0IHRhZyBhbmRcbiAgICAvLyBzd2l0Y2ggb24gdGhhdCB2YWx1ZS5cblxuXG4gICAgdmFyIHByaW1hcnlGbGFncyA9IGZsYWdzICYgKFBsYWNlbWVudCB8IFVwZGF0ZSB8IERlbGV0aW9uIHwgSHlkcmF0aW5nKTtcblxuICAgIHN3aXRjaCAocHJpbWFyeUZsYWdzKSB7XG4gICAgICBjYXNlIFBsYWNlbWVudDpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdFBsYWNlbWVudChuZXh0RWZmZWN0KTsgLy8gQ2xlYXIgdGhlIFwicGxhY2VtZW50XCIgZnJvbSBlZmZlY3QgdGFnIHNvIHRoYXQgd2Uga25vdyB0aGF0IHRoaXMgaXNcbiAgICAgICAgICAvLyBpbnNlcnRlZCwgYmVmb3JlIGFueSBsaWZlLWN5Y2xlcyBsaWtlIGNvbXBvbmVudERpZE1vdW50IGdldHMgY2FsbGVkLlxuICAgICAgICAgIC8vIFRPRE86IGZpbmRET01Ob2RlIGRvZXNuJ3QgcmVseSBvbiB0aGlzIGFueSBtb3JlIGJ1dCBpc01vdW50ZWQgZG9lc1xuICAgICAgICAgIC8vIGFuZCBpc01vdW50ZWQgaXMgZGVwcmVjYXRlZCBhbnl3YXkgc28gd2Ugc2hvdWxkIGJlIGFibGUgdG8ga2lsbCB0aGlzLlxuXG4gICAgICAgICAgbmV4dEVmZmVjdC5mbGFncyAmPSB+UGxhY2VtZW50O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUGxhY2VtZW50QW5kVXBkYXRlOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gUGxhY2VtZW50XG4gICAgICAgICAgY29tbWl0UGxhY2VtZW50KG5leHRFZmZlY3QpOyAvLyBDbGVhciB0aGUgXCJwbGFjZW1lbnRcIiBmcm9tIGVmZmVjdCB0YWcgc28gdGhhdCB3ZSBrbm93IHRoYXQgdGhpcyBpc1xuICAgICAgICAgIC8vIGluc2VydGVkLCBiZWZvcmUgYW55IGxpZmUtY3ljbGVzIGxpa2UgY29tcG9uZW50RGlkTW91bnQgZ2V0cyBjYWxsZWQuXG5cbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5QbGFjZW1lbnQ7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50ID0gbmV4dEVmZmVjdC5hbHRlcm5hdGU7XG4gICAgICAgICAgY29tbWl0V29yayhfY3VycmVudCwgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmc6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBIeWRyYXRpbmdBbmRVcGRhdGU6XG4gICAgICAgIHtcbiAgICAgICAgICBuZXh0RWZmZWN0LmZsYWdzICY9IH5IeWRyYXRpbmc7IC8vIFVwZGF0ZVxuXG4gICAgICAgICAgdmFyIF9jdXJyZW50MiA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGNvbW1pdFdvcmsoX2N1cnJlbnQyLCBuZXh0RWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIFVwZGF0ZTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBfY3VycmVudDMgPSBuZXh0RWZmZWN0LmFsdGVybmF0ZTtcbiAgICAgICAgICBjb21taXRXb3JrKF9jdXJyZW50MywgbmV4dEVmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgY2FzZSBEZWxldGlvbjpcbiAgICAgICAge1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uKHJvb3QsIG5leHRFZmZlY3QpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICBuZXh0RWZmZWN0ID0gbmV4dEVmZmVjdC5uZXh0RWZmZWN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbW1pdExheW91dEVmZmVjdHMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuXG4gIHdoaWxlIChuZXh0RWZmZWN0ICE9PSBudWxsKSB7XG4gICAgc2V0Q3VycmVudEZpYmVyKG5leHRFZmZlY3QpO1xuICAgIHZhciBmbGFncyA9IG5leHRFZmZlY3QuZmxhZ3M7XG5cbiAgICBpZiAoZmxhZ3MgJiAoVXBkYXRlIHwgQ2FsbGJhY2spKSB7XG4gICAgICB2YXIgY3VycmVudCA9IG5leHRFZmZlY3QuYWx0ZXJuYXRlO1xuICAgICAgY29tbWl0TGlmZUN5Y2xlcyhyb290LCBjdXJyZW50LCBuZXh0RWZmZWN0KTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoZmxhZ3MgJiBSZWYpIHtcbiAgICAgICAgY29tbWl0QXR0YWNoUmVmKG5leHRFZmZlY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgbmV4dEVmZmVjdCA9IG5leHRFZmZlY3QubmV4dEVmZmVjdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFBhc3NpdmVFZmZlY3RzKCkge1xuICAvLyBSZXR1cm5zIHdoZXRoZXIgcGFzc2l2ZSBlZmZlY3RzIHdlcmUgZmx1c2hlZC5cbiAgaWYgKHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ICE9PSBOb1ByaW9yaXR5JDEpIHtcbiAgICB2YXIgcHJpb3JpdHlMZXZlbCA9IHBlbmRpbmdQYXNzaXZlRWZmZWN0c1JlbmRlclByaW9yaXR5ID4gTm9ybWFsUHJpb3JpdHkkMSA/IE5vcm1hbFByaW9yaXR5JDEgOiBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eTtcbiAgICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNSZW5kZXJQcmlvcml0eSA9IE5vUHJpb3JpdHkkMTtcblxuICAgIHtcbiAgICAgIHJldHVybiBydW5XaXRoUHJpb3JpdHkkMShwcmlvcml0eUxldmVsLCBmbHVzaFBhc3NpdmVFZmZlY3RzSW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZW5xdWV1ZVBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdE1vdW50KGZpYmVyLCBlZmZlY3QpIHtcbiAgcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAgaWYgKCFyb290RG9lc0hhdmVQYXNzaXZlRWZmZWN0cykge1xuICAgIHJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgICBzY2hlZHVsZUNhbGxiYWNrKE5vcm1hbFByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBlbnF1ZXVlUGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0VW5tb3VudChmaWJlciwgZWZmZWN0KSB7XG4gIHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50LnB1c2goZWZmZWN0LCBmaWJlcik7XG5cbiAge1xuICAgIGZpYmVyLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuXG4gICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgYWx0ZXJuYXRlLmZsYWdzIHw9IFBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICB9XG4gIH1cblxuICBpZiAoIXJvb3REb2VzSGF2ZVBhc3NpdmVFZmZlY3RzKSB7XG4gICAgcm9vdERvZXNIYXZlUGFzc2l2ZUVmZmVjdHMgPSB0cnVlO1xuICAgIHNjaGVkdWxlQ2FsbGJhY2soTm9ybWFsUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW52b2tlUGFzc2l2ZUVmZmVjdENyZWF0ZShlZmZlY3QpIHtcbiAgdmFyIGNyZWF0ZSA9IGVmZmVjdC5jcmVhdGU7XG4gIGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHNJbXBsKCkge1xuICBpZiAocm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgcm9vdCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzO1xuICB2YXIgbGFuZXMgPSBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcztcbiAgcm9vdFdpdGhQZW5kaW5nUGFzc2l2ZUVmZmVjdHMgPSBudWxsO1xuICBwZW5kaW5nUGFzc2l2ZUVmZmVjdHNMYW5lcyA9IE5vTGFuZXM7XG5cbiAgaWYgKCEoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSA9PT0gTm9Db250ZXh0KSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkNhbm5vdCBmbHVzaCBwYXNzaXZlIGVmZmVjdHMgd2hpbGUgYWxyZWFkeSByZW5kZXJpbmcuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gIGV4ZWN1dGlvbkNvbnRleHQgfD0gQ29tbWl0Q29udGV4dDtcbiAgdmFyIHByZXZJbnRlcmFjdGlvbnMgPSBwdXNoSW50ZXJhY3Rpb25zKHJvb3QpOyAvLyBJdCdzIGltcG9ydGFudCB0aGF0IEFMTCBwZW5kaW5nIHBhc3NpdmUgZWZmZWN0IGRlc3Ryb3kgZnVuY3Rpb25zIGFyZSBjYWxsZWRcbiAgLy8gYmVmb3JlIEFOWSBwYXNzaXZlIGVmZmVjdCBjcmVhdGUgZnVuY3Rpb25zIGFyZSBjYWxsZWQuXG4gIC8vIE90aGVyd2lzZSBlZmZlY3RzIGluIHNpYmxpbmcgY29tcG9uZW50cyBtaWdodCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyLlxuICAvLyBlLmcuIGEgZGVzdHJveSBmdW5jdGlvbiBpbiBvbmUgY29tcG9uZW50IG1heSB1bmludGVudGlvbmFsbHkgb3ZlcnJpZGUgYSByZWZcbiAgLy8gdmFsdWUgc2V0IGJ5IGEgY3JlYXRlIGZ1bmN0aW9uIGluIGFub3RoZXIgY29tcG9uZW50LlxuICAvLyBMYXlvdXQgZWZmZWN0cyBoYXZlIHRoZSBzYW1lIGNvbnN0cmFpbnQuXG4gIC8vIEZpcnN0IHBhc3M6IERlc3Ryb3kgc3RhbGUgcGFzc2l2ZSBlZmZlY3RzLlxuXG4gIHZhciB1bm1vdW50RWZmZWN0cyA9IHBlbmRpbmdQYXNzaXZlSG9va0VmZmVjdHNVbm1vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzVW5tb3VudCA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdW5tb3VudEVmZmVjdHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgX2VmZmVjdCA9IHVubW91bnRFZmZlY3RzW2ldO1xuICAgIHZhciBmaWJlciA9IHVubW91bnRFZmZlY3RzW2kgKyAxXTtcbiAgICB2YXIgZGVzdHJveSA9IF9lZmZlY3QuZGVzdHJveTtcbiAgICBfZWZmZWN0LmRlc3Ryb3kgPSB1bmRlZmluZWQ7XG5cbiAgICB7XG4gICAgICBmaWJlci5mbGFncyAmPSB+UGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2O1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICAgICAgaWYgKGFsdGVybmF0ZSAhPT0gbnVsbCkge1xuICAgICAgICBhbHRlcm5hdGUuZmxhZ3MgJj0gflBhc3NpdmVVbm1vdW50UGVuZGluZ0RldjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICB7XG4gICAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGRlc3Ryb3ksIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgICBpZiAoIShmaWJlciAhPT0gbnVsbCkpIHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIFwiU2hvdWxkIGJlIHdvcmtpbmcgb24gYW4gZWZmZWN0LlwiICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIGVycm9yID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSAvLyBTZWNvbmQgcGFzczogQ3JlYXRlIG5ldyBwYXNzaXZlIGVmZmVjdHMuXG5cblxuICB2YXIgbW91bnRFZmZlY3RzID0gcGVuZGluZ1Bhc3NpdmVIb29rRWZmZWN0c01vdW50O1xuICBwZW5kaW5nUGFzc2l2ZUhvb2tFZmZlY3RzTW91bnQgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbW91bnRFZmZlY3RzLmxlbmd0aDsgX2kgKz0gMikge1xuICAgIHZhciBfZWZmZWN0MiA9IG1vdW50RWZmZWN0c1tfaV07XG4gICAgdmFyIF9maWJlciA9IG1vdW50RWZmZWN0c1tfaSArIDFdO1xuXG4gICAge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKF9maWJlcik7XG5cbiAgICAgIHtcbiAgICAgICAgaW52b2tlR3VhcmRlZENhbGxiYWNrKG51bGwsIGludm9rZVBhc3NpdmVFZmZlY3RDcmVhdGUsIG51bGwsIF9lZmZlY3QyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0NhdWdodEVycm9yKCkpIHtcbiAgICAgICAgaWYgKCEoX2ZpYmVyICE9PSBudWxsKSkge1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCBcIlNob3VsZCBiZSB3b3JraW5nIG9uIGFuIGVmZmVjdC5cIiApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZXJyb3I0ID0gY2xlYXJDYXVnaHRFcnJvcigpO1xuXG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKF9maWJlciwgX2Vycm9yNCk7XG4gICAgICB9XG5cbiAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgfVxuICB9IC8vIE5vdGU6IFRoaXMgY3VycmVudGx5IGFzc3VtZXMgdGhlcmUgYXJlIG5vIHBhc3NpdmUgZWZmZWN0cyBvbiB0aGUgcm9vdCBmaWJlclxuICAvLyBiZWNhdXNlIHRoZSByb290IGlzIG5vdCBwYXJ0IG9mIGl0cyBvd24gZWZmZWN0IGxpc3QuXG4gIC8vIFRoaXMgY291bGQgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cblxuICB2YXIgZWZmZWN0ID0gcm9vdC5jdXJyZW50LmZpcnN0RWZmZWN0O1xuXG4gIHdoaWxlIChlZmZlY3QgIT09IG51bGwpIHtcbiAgICB2YXIgbmV4dE5leHRFZmZlY3QgPSBlZmZlY3QubmV4dEVmZmVjdDsgLy8gUmVtb3ZlIG5leHRFZmZlY3QgcG9pbnRlciB0byBhc3Npc3QgR0NcblxuICAgIGVmZmVjdC5uZXh0RWZmZWN0ID0gbnVsbDtcblxuICAgIGlmIChlZmZlY3QuZmxhZ3MgJiBEZWxldGlvbikge1xuICAgICAgZGV0YWNoRmliZXJBZnRlckVmZmVjdHMoZWZmZWN0KTtcbiAgICB9XG5cbiAgICBlZmZlY3QgPSBuZXh0TmV4dEVmZmVjdDtcbiAgfVxuXG4gIHtcbiAgICBwb3BJbnRlcmFjdGlvbnMocHJldkludGVyYWN0aW9ucyk7XG4gICAgZmluaXNoUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lcyk7XG4gIH1cblxuICB7XG4gICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzID0gZmFsc2U7XG4gIH1cblxuICBleGVjdXRpb25Db250ZXh0ID0gcHJldkV4ZWN1dGlvbkNvbnRleHQ7XG4gIGZsdXNoU3luY0NhbGxiYWNrUXVldWUoKTsgLy8gSWYgYWRkaXRpb25hbCBwYXNzaXZlIGVmZmVjdHMgd2VyZSBzY2hlZHVsZWQsIGluY3JlbWVudCBhIGNvdW50ZXIuIElmIHRoaXNcbiAgLy8gZXhjZWVkcyB0aGUgbGltaXQsIHdlJ2xsIGZpcmUgYSB3YXJuaW5nLlxuXG4gIG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IHJvb3RXaXRoUGVuZGluZ1Bhc3NpdmVFZmZlY3RzID09PSBudWxsID8gMCA6IG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCArIDE7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSB7XG4gIHJldHVybiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCAhPT0gbnVsbCAmJiBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpO1xufVxuZnVuY3Rpb24gbWFya0xlZ2FjeUVycm9yQm91bmRhcnlBc0ZhaWxlZChpbnN0YW5jZSkge1xuICBpZiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPT09IG51bGwpIHtcbiAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG5ldyBTZXQoW2luc3RhbmNlXSk7XG4gIH0gZWxzZSB7XG4gICAgbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKGluc3RhbmNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmVwYXJlVG9UaHJvd1VuY2F1Z2h0RXJyb3IoZXJyb3IpIHtcbiAgaWYgKCFoYXNVbmNhdWdodEVycm9yKSB7XG4gICAgaGFzVW5jYXVnaHRFcnJvciA9IHRydWU7XG4gICAgZmlyc3RVbmNhdWdodEVycm9yID0gZXJyb3I7XG4gIH1cbn1cblxudmFyIG9uVW5jYXVnaHRFcnJvciA9IHByZXBhcmVUb1Rocm93VW5jYXVnaHRFcnJvcjtcblxuZnVuY3Rpb24gY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qocm9vdEZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpIHtcbiAgdmFyIGVycm9ySW5mbyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWUoZXJyb3IsIHNvdXJjZUZpYmVyKTtcbiAgdmFyIHVwZGF0ZSA9IGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290RmliZXIsIGVycm9ySW5mbywgU3luY0xhbmUpO1xuICBlbnF1ZXVlVXBkYXRlKHJvb3RGaWJlciwgdXBkYXRlKTtcbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChyb290RmliZXIsIFN5bmNMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCBTeW5jTGFuZSwgZXZlbnRUaW1lKTtcbiAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgICBzY2hlZHVsZVBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgU3luY0xhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICBpZiAoc291cmNlRmliZXIudGFnID09PSBIb3N0Um9vdCkge1xuICAgIC8vIEVycm9yIHdhcyB0aHJvd24gYXQgdGhlIHJvb3QuIFRoZXJlIGlzIG5vIHBhcmVudCwgc28gdGhlIHJvb3RcbiAgICAvLyBpdHNlbGYgc2hvdWxkIGNhcHR1cmUgaXQuXG4gICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3JPblJvb3Qoc291cmNlRmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpYmVyID0gc291cmNlRmliZXIucmV0dXJuO1xuXG4gIHdoaWxlIChmaWJlciAhPT0gbnVsbCkge1xuICAgIGlmIChmaWJlci50YWcgPT09IEhvc3RSb290KSB7XG4gICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChmaWJlciwgc291cmNlRmliZXIsIGVycm9yKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgIHZhciBjdG9yID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IGZpYmVyLnN0YXRlTm9kZTtcblxuICAgICAgaWYgKHR5cGVvZiBjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciA9PT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggPT09ICdmdW5jdGlvbicgJiYgIWlzQWxyZWFkeUZhaWxlZExlZ2FjeUVycm9yQm91bmRhcnkoaW5zdGFuY2UpKSB7XG4gICAgICAgIHZhciBlcnJvckluZm8gPSBjcmVhdGVDYXB0dXJlZFZhbHVlKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gICAgICAgIHZhciB1cGRhdGUgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKGZpYmVyLCBlcnJvckluZm8sIFN5bmNMYW5lKTtcbiAgICAgICAgZW5xdWV1ZVVwZGF0ZShmaWJlciwgdXBkYXRlKTtcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgICAgICAgdmFyIHJvb3QgPSBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgU3luY0xhbmUpO1xuXG4gICAgICAgIGlmIChyb290ICE9PSBudWxsKSB7XG4gICAgICAgICAgbWFya1Jvb3RVcGRhdGVkKHJvb3QsIFN5bmNMYW5lLCBldmVudFRpbWUpO1xuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290LCBldmVudFRpbWUpO1xuICAgICAgICAgIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBTeW5jTGFuZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhpcyBjb21wb25lbnQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQuXG4gICAgICAgICAgLy8gV2UgY2FuJ3Qgc2NoZWR1bGUgYW55IGZvbGxvdyB1cCB3b3JrIGZvciB0aGUgcm9vdCBiZWNhdXNlIHRoZSBmaWJlciBpcyBhbHJlYWR5IHVubW91bnRlZCxcbiAgICAgICAgICAvLyBidXQgd2UgY2FuIHN0aWxsIGNhbGwgdGhlIGxvZy1vbmx5IGJvdW5kYXJ5IHNvIHRoZSBlcnJvciBpc24ndCBzd2FsbG93ZWQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUT0RPIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBiYW5kYWlkIGZvciB0aGUgb2xkIHJlY29uY2lsZXIgZm9yay5cbiAgICAgICAgICAvLyBXZSBjYW4gZGVsZXRlIHRoaXMgc3BlY2lhbCBjYXNlIG9uY2UgdGhlIG5ldyBmb3JrIGlzIG1lcmdlZC5cbiAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoID09PSAnZnVuY3Rpb24nICYmICFpc0FscmVhZHlGYWlsZWRMZWdhY3lFcnJvckJvdW5kYXJ5KGluc3RhbmNlKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2goZXJyb3IsIGVycm9ySW5mbyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvclRvSWdub3JlKSB7Ly8gVE9ETyBJZ25vcmUgdGhpcyBlcnJvcj8gUmV0aHJvdyBpdD9cbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBraW5kIG9mIGFuIGVkZ2UgY2FzZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmliZXIgPSBmaWJlci5yZXR1cm47XG4gIH1cbn1cbmZ1bmN0aW9uIHBpbmdTdXNwZW5kZWRSb290KHJvb3QsIHdha2VhYmxlLCBwaW5nZWRMYW5lcykge1xuICB2YXIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG5cbiAgaWYgKHBpbmdDYWNoZSAhPT0gbnVsbCkge1xuICAgIC8vIFRoZSB3YWtlYWJsZSByZXNvbHZlZCwgc28gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gbWVtb2l6ZSwgYmVjYXVzZSBpdCB3aWxsXG4gICAgLy8gbmV2ZXIgYmUgdGhyb3duIGFnYWluLlxuICAgIHBpbmdDYWNoZS5kZWxldGUod2FrZWFibGUpO1xuICB9XG5cbiAgdmFyIGV2ZW50VGltZSA9IHJlcXVlc3RFdmVudFRpbWUoKTtcbiAgbWFya1Jvb3RQaW5nZWQocm9vdCwgcGluZ2VkTGFuZXMpO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzc1Jvb3QgPT09IHJvb3QgJiYgaXNTdWJzZXRPZkxhbmVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLCBwaW5nZWRMYW5lcykpIHtcbiAgICAvLyBSZWNlaXZlZCBhIHBpbmcgYXQgdGhlIHNhbWUgcHJpb3JpdHkgbGV2ZWwgYXQgd2hpY2ggd2UncmUgY3VycmVudGx5XG4gICAgLy8gcmVuZGVyaW5nLiBXZSBtaWdodCB3YW50IHRvIHJlc3RhcnQgdGhpcyByZW5kZXIuIFRoaXMgc2hvdWxkIG1pcnJvclxuICAgIC8vIHRoZSBsb2dpYyBvZiB3aGV0aGVyIG9yIG5vdCBhIHJvb3Qgc3VzcGVuZHMgb25jZSBpdCBjb21wbGV0ZXMuXG4gICAgLy8gVE9ETzogSWYgd2UncmUgcmVuZGVyaW5nIHN5bmMgZWl0aGVyIGR1ZSB0byBTeW5jLCBCYXRjaGVkIG9yIGV4cGlyZWQsXG4gICAgLy8gd2Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIHJlc3RhcnQuXG4gICAgLy8gSWYgd2UncmUgc3VzcGVuZGVkIHdpdGggZGVsYXksIG9yIGlmIGl0J3MgYSByZXRyeSwgd2UnbGwgYWx3YXlzIHN1c3BlbmRcbiAgICAvLyBzbyB3ZSBjYW4gYWx3YXlzIHJlc3RhcnQuXG4gICAgaWYgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXkgfHwgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZCAmJiBpbmNsdWRlc09ubHlSZXRyaWVzKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSAmJiBub3coKSAtIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPCBGQUxMQkFDS19USFJPVFRMRV9NUykge1xuICAgICAgLy8gUmVzdGFydCBmcm9tIHRoZSByb290LlxuICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgTm9MYW5lcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEV2ZW4gdGhvdWdoIHdlIGNhbid0IHJlc3RhcnQgcmlnaHQgbm93LCB3ZSBtaWdodCBnZXQgYW5cbiAgICAgIC8vIG9wcG9ydHVuaXR5IGxhdGVyLiBTbyB3ZSBtYXJrIHRoaXMgcmVuZGVyIGFzIGhhdmluZyBhIHBpbmcuXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyA9IG1lcmdlTGFuZXMod29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMsIHBpbmdlZExhbmVzKTtcbiAgICB9XG4gIH1cblxuICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCwgZXZlbnRUaW1lKTtcbiAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHBpbmdlZExhbmVzKTtcbn1cblxuZnVuY3Rpb24gcmV0cnlUaW1lZE91dEJvdW5kYXJ5KGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSkge1xuICAvLyBUaGUgYm91bmRhcnkgZmliZXIgKGEgU3VzcGVuc2UgY29tcG9uZW50IG9yIFN1c3BlbnNlTGlzdCBjb21wb25lbnQpXG4gIC8vIHByZXZpb3VzbHkgd2FzIHJlbmRlcmVkIGluIGl0cyBmYWxsYmFjayBzdGF0ZS4gT25lIG9mIHRoZSBwcm9taXNlcyB0aGF0XG4gIC8vIHN1c3BlbmRlZCBpdCBoYXMgcmVzb2x2ZWQsIHdoaWNoIG1lYW5zIGF0IGxlYXN0IHBhcnQgb2YgdGhlIHRyZWUgd2FzXG4gIC8vIGxpa2VseSB1bmJsb2NrZWQuIFRyeSByZW5kZXJpbmcgYWdhaW4sIGF0IGEgbmV3IGV4cGlyYXRpb24gdGltZS5cbiAgaWYgKHJldHJ5TGFuZSA9PT0gTm9MYW5lKSB7XG4gICAgcmV0cnlMYW5lID0gcmVxdWVzdFJldHJ5TGFuZShib3VuZGFyeUZpYmVyKTtcbiAgfSAvLyBUT0RPOiBTcGVjaWFsIGNhc2UgaWRsZSBwcmlvcml0eT9cblxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciByb290ID0gbWFya1VwZGF0ZUxhbmVGcm9tRmliZXJUb1Jvb3QoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcblxuICBpZiAocm9vdCAhPT0gbnVsbCkge1xuICAgIG1hcmtSb290VXBkYXRlZChyb290LCByZXRyeUxhbmUsIGV2ZW50VGltZSk7XG4gICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QsIGV2ZW50VGltZSk7XG4gICAgc2NoZWR1bGVQZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIHJldHJ5TGFuZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlc29sdmVSZXRyeVdha2VhYmxlKGJvdW5kYXJ5RmliZXIsIHdha2VhYmxlKSB7XG4gIHZhciByZXRyeUxhbmUgPSBOb0xhbmU7IC8vIERlZmF1bHRcblxuICB2YXIgcmV0cnlDYWNoZTtcblxuICB7XG4gICAgcmV0cnlDYWNoZSA9IGJvdW5kYXJ5RmliZXIuc3RhdGVOb2RlO1xuICB9XG5cbiAgaWYgKHJldHJ5Q2FjaGUgIT09IG51bGwpIHtcbiAgICAvLyBUaGUgd2FrZWFibGUgcmVzb2x2ZWQsIHNvIHdlIG5vIGxvbmdlciBuZWVkIHRvIG1lbW9pemUsIGJlY2F1c2UgaXQgd2lsbFxuICAgIC8vIG5ldmVyIGJlIHRocm93biBhZ2Fpbi5cbiAgICByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gIH1cblxuICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbn0gLy8gQ29tcHV0ZXMgdGhlIG5leHQgSnVzdCBOb3RpY2VhYmxlIERpZmZlcmVuY2UgKEpORCkgYm91bmRhcnkuXG4vLyBUaGUgdGhlb3J5IGlzIHRoYXQgYSBwZXJzb24gY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRpbWUuXG4vLyBUaGVyZWZvcmUsIGlmIHdlIHdhaXQgYSBiaXQgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IHRoYXQgd29uJ3QgdHJhbnNsYXRlIHRvIGEgbm90aWNlYWJsZVxuLy8gZGlmZmVyZW5jZSBpbiB0aGUgZXhwZXJpZW5jZS4gSG93ZXZlciwgd2FpdGluZyBmb3IgbG9uZ2VyIG1pZ2h0IG1lYW4gdGhhdCB3ZSBjYW4gYXZvaWRcbi8vIHNob3dpbmcgYW4gaW50ZXJtZWRpYXRlIGxvYWRpbmcgc3RhdGUuIFRoZSBsb25nZXIgd2UgaGF2ZSBhbHJlYWR5IHdhaXRlZCwgdGhlIGhhcmRlciBpdFxuLy8gaXMgdG8gdGVsbCBzbWFsbCBkaWZmZXJlbmNlcyBpbiB0aW1lLiBUaGVyZWZvcmUsIHRoZSBsb25nZXIgd2UndmUgYWxyZWFkeSB3YWl0ZWQsXG4vLyB0aGUgbG9uZ2VyIHdlIGNhbiB3YWl0IGFkZGl0aW9uYWxseS4gQXQgc29tZSBwb2ludCB3ZSBoYXZlIHRvIGdpdmUgdXAgdGhvdWdoLlxuLy8gV2UgcGljayBhIHRyYWluIG1vZGVsIHdoZXJlIHRoZSBuZXh0IGJvdW5kYXJ5IGNvbW1pdHMgYXQgYSBjb25zaXN0ZW50IHNjaGVkdWxlLlxuLy8gVGhlc2UgcGFydGljdWxhciBudW1iZXJzIGFyZSB2YWd1ZSBlc3RpbWF0ZXMuIFdlIGV4cGVjdCB0byBhZGp1c3QgdGhlbSBiYXNlZCBvbiByZXNlYXJjaC5cblxuZnVuY3Rpb24gam5kKHRpbWVFbGFwc2VkKSB7XG4gIHJldHVybiB0aW1lRWxhcHNlZCA8IDEyMCA/IDEyMCA6IHRpbWVFbGFwc2VkIDwgNDgwID8gNDgwIDogdGltZUVsYXBzZWQgPCAxMDgwID8gMTA4MCA6IHRpbWVFbGFwc2VkIDwgMTkyMCA/IDE5MjAgOiB0aW1lRWxhcHNlZCA8IDMwMDAgPyAzMDAwIDogdGltZUVsYXBzZWQgPCA0MzIwID8gNDMyMCA6IGNlaWwodGltZUVsYXBzZWQgLyAxOTYwKSAqIDE5NjA7XG59XG5cbmZ1bmN0aW9uIGNoZWNrRm9yTmVzdGVkVXBkYXRlcygpIHtcbiAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVCkge1xuICAgIG5lc3RlZFVwZGF0ZUNvdW50ID0gMDtcbiAgICByb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsO1xuXG4gICAge1xuICAgICAge1xuICAgICAgICB0aHJvdyBFcnJvciggXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgcmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciBjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXCIgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB7XG4gICAgaWYgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA+IE5FU1RFRF9QQVNTSVZFX1VQREFURV9MSU1JVCkge1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMDtcblxuICAgICAgZXJyb3IoJ01heGltdW0gdXBkYXRlIGRlcHRoIGV4Y2VlZGVkLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGNvbXBvbmVudCAnICsgXCJjYWxscyBzZXRTdGF0ZSBpbnNpZGUgdXNlRWZmZWN0LCBidXQgdXNlRWZmZWN0IGVpdGhlciBkb2Vzbid0IFwiICsgJ2hhdmUgYSBkZXBlbmRlbmN5IGFycmF5LCBvciBvbmUgb2YgdGhlIGRlcGVuZGVuY2llcyBjaGFuZ2VzIG9uICcgKyAnZXZlcnkgcmVuZGVyLicpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbHVzaFJlbmRlclBoYXNlU3RyaWN0TW9kZVdhcm5pbmdzSW5ERVYoKSB7XG4gIHtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaExlZ2FjeUNvbnRleHRXYXJuaW5nKCk7XG5cbiAgICB7XG4gICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncygpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uTm90WWV0TW91bnRlZEZpYmVySW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpICE9PSBOb0NvbnRleHQpIHtcbiAgICAgIC8vIFdlIGxldCB0aGUgb3RoZXIgd2FybmluZyBhYm91dCByZW5kZXIgcGhhc2UgdXBkYXRlcyBkZWFsIHdpdGggdGhpcyBvbmUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEoZmliZXIubW9kZSAmIChCbG9ja2luZ01vZGUgfCBDb25jdXJyZW50TW9kZSkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEluZGV0ZXJtaW5hdGVDb21wb25lbnQgJiYgdGFnICE9PSBIb3N0Um9vdCAmJiB0YWcgIT09IENsYXNzQ29tcG9uZW50ICYmIHRhZyAhPT0gRnVuY3Rpb25Db21wb25lbnQgJiYgdGFnICE9PSBGb3J3YXJkUmVmICYmIHRhZyAhPT0gTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IFNpbXBsZU1lbW9Db21wb25lbnQgJiYgdGFnICE9PSBCbG9jaykge1xuICAgICAgLy8gT25seSB3YXJuIGZvciB1c2VyLWRlZmluZWQgY29tcG9uZW50cywgbm90IGludGVybmFsIG9uZXMgbGlrZSBTdXNwZW5zZS5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIFdlIHNob3cgdGhlIHdob2xlIHN0YWNrIGJ1dCBkZWR1cGUgb24gdGhlIHRvcCBjb21wb25lbnQncyBuYW1lIGJlY2F1c2VcbiAgICAvLyB0aGUgcHJvYmxlbWF0aWMgY29kZSBhbG1vc3QgYWx3YXlzIGxpZXMgaW5zaWRlIHRoYXQgY29tcG9uZW50LlxuXG5cbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkgfHwgJ1JlYWN0Q29tcG9uZW50JztcblxuICAgIGlmIChkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ICE9PSBudWxsKSB7XG4gICAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50LmFkZChjb21wb25lbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCA9IG5ldyBTZXQoW2NvbXBvbmVudE5hbWVdKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgZXJyb3IoXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBcIiArICdUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCAnICsgJ2FzeW5jaHJvbm91c2x5IGxhdGVyIGNhbGxzIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY29tcG9uZW50LiBNb3ZlIHRoaXMgd29yayB0byAnICsgJ3VzZUVmZmVjdCBpbnN0ZWFkLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IG51bGw7XG5cbmZ1bmN0aW9uIHdhcm5BYm91dFVwZGF0ZU9uVW5tb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICB7XG4gICAgdmFyIHRhZyA9IGZpYmVyLnRhZztcblxuICAgIGlmICh0YWcgIT09IEhvc3RSb290ICYmIHRhZyAhPT0gQ2xhc3NDb21wb25lbnQgJiYgdGFnICE9PSBGdW5jdGlvbkNvbXBvbmVudCAmJiB0YWcgIT09IEZvcndhcmRSZWYgJiYgdGFnICE9PSBNZW1vQ29tcG9uZW50ICYmIHRhZyAhPT0gU2ltcGxlTWVtb0NvbXBvbmVudCAmJiB0YWcgIT09IEJsb2NrKSB7XG4gICAgICAvLyBPbmx5IHdhcm4gZm9yIHVzZXItZGVmaW5lZCBjb21wb25lbnRzLCBub3QgaW50ZXJuYWwgb25lcyBsaWtlIFN1c3BlbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcGFzc2l2ZSBlZmZlY3RzIHVubW91bnRzIGZvciB0aGlzIEZpYmVyLFxuICAgIC8vIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGV5IHdvdWxkIGhhdmUgcHJldmVudGVkIHRoaXMgdXBkYXRlLlxuXG5cbiAgICBpZiAoKGZpYmVyLmZsYWdzICYgUGFzc2l2ZVVubW91bnRQZW5kaW5nRGV2KSAhPT0gTm9GbGFncykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gV2Ugc2hvdyB0aGUgd2hvbGUgc3RhY2sgYnV0IGRlZHVwZSBvbiB0aGUgdG9wIGNvbXBvbmVudCdzIG5hbWUgYmVjYXVzZVxuICAgIC8vIHRoZSBwcm9ibGVtYXRpYyBjb2RlIGFsbW9zdCBhbHdheXMgbGllcyBpbnNpZGUgdGhhdCBjb21wb25lbnQuXG5cblxuICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnUmVhY3RDb21wb25lbnQnO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudC5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQuYWRkKGNvbXBvbmVudE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFtjb21wb25lbnROYW1lXSk7XG4gICAgfVxuXG4gICAgaWYgKGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cykgOyBlbHNlIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gY3VycmVudDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcblxuICAgICAgICBlcnJvcihcIkNhbid0IHBlcmZvcm0gYSBSZWFjdCBzdGF0ZSB1cGRhdGUgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gVGhpcyBcIiArICdpcyBhIG5vLW9wLCBidXQgaXQgaW5kaWNhdGVzIGEgbWVtb3J5IGxlYWsgaW4geW91ciBhcHBsaWNhdGlvbi4gVG8gJyArICdmaXgsIGNhbmNlbCBhbGwgc3Vic2NyaXB0aW9ucyBhbmQgYXN5bmNocm9ub3VzIHRhc2tzIGluICVzLicsIHRhZyA9PT0gQ2xhc3NDb21wb25lbnQgPyAndGhlIGNvbXBvbmVudFdpbGxVbm1vdW50IG1ldGhvZCcgOiAnYSB1c2VFZmZlY3QgY2xlYW51cCBmdW5jdGlvbicpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHByZXZpb3VzRmliZXIpIHtcbiAgICAgICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc2V0Q3VycmVudEZpYmVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIGJlZ2luV29yayQxO1xuXG57XG4gIHZhciBkdW1teUZpYmVyID0gbnVsbDtcblxuICBiZWdpbldvcmskMSA9IGZ1bmN0aW9uIChjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcykge1xuICAgIC8vIElmIGEgY29tcG9uZW50IHRocm93cyBhbiBlcnJvciwgd2UgcmVwbGF5IGl0IGFnYWluIGluIGEgc3luY2hyb25vdXNseVxuICAgIC8vIGRpc3BhdGNoZWQgZXZlbnQsIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIHdpbGwgdHJlYXQgaXQgYXMgYW4gdW5jYXVnaHRcbiAgICAvLyBlcnJvciBTZWUgUmVhY3RFcnJvclV0aWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgYmVnaW4gcGhhc2UsIGNvcHkgdGhlIHdvcmstaW4tcHJvZ3Jlc3Mgb250byBhIGR1bW15XG4gICAgLy8gZmliZXIuIElmIGJlZ2luV29yayB0aHJvd3MsIHdlJ2xsIHVzZSB0aGlzIHRvIHJlc2V0IHRoZSBzdGF0ZS5cbiAgICB2YXIgb3JpZ2luYWxXb3JrSW5Qcm9ncmVzc0NvcHkgPSBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVihkdW1teUZpYmVyLCB1bml0T2ZXb3JrKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYmVnaW5Xb3JrKGN1cnJlbnQsIHVuaXRPZldvcmssIGxhbmVzKTtcbiAgICB9IGNhdGNoIChvcmlnaW5hbEVycm9yKSB7XG4gICAgICBpZiAob3JpZ2luYWxFcnJvciAhPT0gbnVsbCAmJiB0eXBlb2Ygb3JpZ2luYWxFcnJvciA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9yaWdpbmFsRXJyb3IudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBEb24ndCByZXBsYXkgcHJvbWlzZXMuIFRyZWF0IGV2ZXJ5dGhpbmcgZWxzZSBsaWtlIGFuIGVycm9yLlxuICAgICAgICB0aHJvdyBvcmlnaW5hbEVycm9yO1xuICAgICAgfSAvLyBLZWVwIHRoaXMgY29kZSBpbiBzeW5jIHdpdGggaGFuZGxlRXJyb3I7IGFueSBjaGFuZ2VzIGhlcmUgbXVzdCBoYXZlXG4gICAgICAvLyBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdGhlcmUuXG5cblxuICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCk7XG4gICAgICByZXNldEhvb2tzQWZ0ZXJUaHJvdygpOyAvLyBEb24ndCByZXNldCBjdXJyZW50IGRlYnVnIGZpYmVyLCBzaW5jZSB3ZSdyZSBhYm91dCB0byB3b3JrIG9uIHRoZVxuICAgICAgLy8gc2FtZSBmaWJlciBhZ2Fpbi5cbiAgICAgIC8vIFVud2luZCB0aGUgZmFpbGVkIHN0YWNrIGZyYW1lXG5cbiAgICAgIHVud2luZEludGVycnVwdGVkV29yayh1bml0T2ZXb3JrKTsgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyBvZiB0aGUgZmliZXIuXG5cbiAgICAgIGFzc2lnbkZpYmVyUHJvcGVydGllc0luREVWKHVuaXRPZldvcmssIG9yaWdpbmFsV29ya0luUHJvZ3Jlc3NDb3B5KTtcblxuICAgICAgaWYgKCB1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkge1xuICAgICAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIgdGltZXIuXG4gICAgICAgIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIH0gLy8gUnVuIGJlZ2luV29yayBhZ2Fpbi5cblxuXG4gICAgICBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobnVsbCwgYmVnaW5Xb3JrLCBudWxsLCBjdXJyZW50LCB1bml0T2ZXb3JrLCBsYW5lcyk7XG5cbiAgICAgIGlmIChoYXNDYXVnaHRFcnJvcigpKSB7XG4gICAgICAgIHZhciByZXBsYXlFcnJvciA9IGNsZWFyQ2F1Z2h0RXJyb3IoKTsgLy8gYGludm9rZUd1YXJkZWRDYWxsYmFja2Agc29tZXRpbWVzIHNldHMgYW4gZXhwYW5kbyBgX3N1cHByZXNzTG9nZ2luZ2AuXG4gICAgICAgIC8vIFJldGhyb3cgdGhpcyBlcnJvciBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmUuXG5cbiAgICAgICAgdGhyb3cgcmVwbGF5RXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGJyYW5jaCBpcyByZWFjaGFibGUgaWYgdGhlIHJlbmRlciBwaGFzZSBpcyBpbXB1cmUuXG4gICAgICAgIHRocm93IG9yaWdpbmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSBmYWxzZTtcbnZhciBkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQ7XG5cbntcbiAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50ID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRSZW5kZXJQaGFzZVVwZGF0ZXNJbkRFVihmaWJlcikge1xuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJiAhZ2V0SXNVcGRhdGluZ09wYXF1ZVZhbHVlSW5SZW5kZXJQaGFzZUluREVWKCkpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FzZSBTaW1wbGVNZW1vQ29tcG9uZW50OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhciByZW5kZXJpbmdDb21wb25lbnROYW1lID0gd29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZSh3b3JrSW5Qcm9ncmVzcy50eXBlKSB8fCAnVW5rbm93bic7IC8vIERlZHVwZSBieSB0aGUgcmVuZGVyaW5nIGNvbXBvbmVudCBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLlxuXG4gICAgICAgICAgICB2YXIgZGVkdXBlS2V5ID0gcmVuZGVyaW5nQ29tcG9uZW50TmFtZTtcblxuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlckZvckFub3RoZXJDb21wb25lbnQuaGFzKGRlZHVwZUtleSkpIHtcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChkZWR1cGVLZXkpO1xuICAgICAgICAgICAgICB2YXIgc2V0U3RhdGVDb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSB8fCAnVW5rbm93bic7XG5cbiAgICAgICAgICAgICAgZXJyb3IoJ0Nhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgKGAlc2ApIHdoaWxlIHJlbmRlcmluZyBhICcgKyAnZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgJyArICdmb2xsb3cgdGhlIHN0YWNrIHRyYWNlIGFzIGRlc2NyaWJlZCBpbiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvc2V0c3RhdGUtaW4tcmVuZGVyJywgc2V0U3RhdGVDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lLCByZW5kZXJpbmdDb21wb25lbnROYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlcikge1xuICAgICAgICAgICAgICBlcnJvcignQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCkuIFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgJyArICdmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuJyk7XG5cbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXIgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IC8vIGEgJ3NoYXJlZCcgdmFyaWFibGUgdGhhdCBjaGFuZ2VzIHdoZW4gYWN0KCkgb3BlbnMvY2xvc2VzIGluIHRlc3RzLlxuXG5cbnZhciBJc1RoaXNSZW5kZXJlckFjdGluZyA9IHtcbiAgY3VycmVudDogZmFsc2Vcbn07XG5mdW5jdGlvbiB3YXJuSWZOb3RTY29wZWRXaXRoTWF0Y2hpbmdBY3QoZmliZXIpIHtcbiAge1xuICAgIGlmICggSXNTb21lUmVuZGVyZXJBY3RpbmcuY3VycmVudCA9PT0gdHJ1ZSAmJiBJc1RoaXNSZW5kZXJlckFjdGluZy5jdXJyZW50ICE9PSB0cnVlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoXCJJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgd3JvbmcgYWN0KCkgYXJvdW5kIHlvdXIgdGVzdCBpbnRlcmFjdGlvbnMuXFxuXCIgKyAnQmUgc3VyZSB0byB1c2UgdGhlIG1hdGNoaW5nIHZlcnNpb24gb2YgYWN0KCkgY29ycmVzcG9uZGluZyB0byB5b3VyIHJlbmRlcmVyOlxcblxcbicgKyAnLy8gZm9yIHJlYWN0LWRvbTpcXG4nICsgLy8gQnJlYWsgdXAgaW1wb3J0cyB0byBhdm9pZCBhY2NpZGVudGFsbHkgcGFyc2luZyB0aGVtIGFzIGRlcGVuZGVuY2llcy5cbiAgICAgICAgJ2ltcG9ydCB7YWN0fSBmcicgKyBcIm9tICdyZWFjdC1kb20vdGVzdC11dGlscyc7XFxuXCIgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTtcXG5cXG4nICsgJy8vIGZvciByZWFjdC10ZXN0LXJlbmRlcmVyOlxcbicgKyAvLyBCcmVhayB1cCBpbXBvcnRzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICAnaW1wb3J0IFRlc3RSZW5kZXJlciBmcicgKyBcIm9tIHJlYWN0LXRlc3QtcmVuZGVyZXInO1xcblwiICsgJ2NvbnN0IHthY3R9ID0gVGVzdFJlbmRlcmVyO1xcbicgKyAnLy8gLi4uXFxuJyArICdhY3QoKCkgPT4gLi4uKTsnKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChwcmV2aW91c0ZpYmVyKSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGZpYmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdFZmZlY3RzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggKGZpYmVyLm1vZGUgJiBTdHJpY3RNb2RlKSAhPT0gTm9Nb2RlICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICBlcnJvcignQW4gdXBkYXRlIHRvICVzIHJhbiBhbiBlZmZlY3QsIGJ1dCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuJyArICdXaGVuIHRlc3RpbmcsIGNvZGUgdGhhdCBjYXVzZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBzaG91bGQgYmUgJyArICd3cmFwcGVkIGludG8gYWN0KC4uLik6XFxuXFxuJyArICdhY3QoKCkgPT4ge1xcbicgKyAnICAvKiBmaXJlIGV2ZW50cyB0aGF0IHVwZGF0ZSBzdGF0ZSAqL1xcbicgKyAnfSk7XFxuJyArICcvKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcbicgKyBcIlRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgXCIgKyAnaW4gdGhlIGJyb3dzZXIuJyArICcgTGVhcm4gbW9yZSBhdCBodHRwczovL3JlYWN0anMub3JnL2xpbmsvd3JhcC10ZXN0cy13aXRoLWFjdCcsIGdldENvbXBvbmVudE5hbWUoZmliZXIudHlwZSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB3YXJuSWZOb3RDdXJyZW50bHlBY3RpbmdVcGRhdGVzSW5ERVYoZmliZXIpIHtcbiAge1xuICAgIGlmICggZXhlY3V0aW9uQ29udGV4dCA9PT0gTm9Db250ZXh0ICYmIElzU29tZVJlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlICYmIElzVGhpc1JlbmRlcmVyQWN0aW5nLmN1cnJlbnQgPT09IGZhbHNlKSB7XG4gICAgICB2YXIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG5cbiAgICAgICAgZXJyb3IoJ0FuIHVwZGF0ZSB0byAlcyBpbnNpZGUgYSB0ZXN0IHdhcyBub3Qgd3JhcHBlZCBpbiBhY3QoLi4uKS5cXG5cXG4nICsgJ1doZW4gdGVzdGluZywgY29kZSB0aGF0IGNhdXNlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIHNob3VsZCBiZSAnICsgJ3dyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG4nICsgJ2FjdCgoKSA9PiB7XFxuJyArICcgIC8qIGZpcmUgZXZlbnRzIHRoYXQgdXBkYXRlIHN0YXRlICovXFxuJyArICd9KTtcXG4nICsgJy8qIGFzc2VydCBvbiB0aGUgb3V0cHV0ICovXFxuXFxuJyArIFwiVGhpcyBlbnN1cmVzIHRoYXQgeW91J3JlIHRlc3RpbmcgdGhlIGJlaGF2aW9yIHRoZSB1c2VyIHdvdWxkIHNlZSBcIiArICdpbiB0aGUgYnJvd3Nlci4nICsgJyBMZWFybiBtb3JlIGF0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0JywgZ2V0Q29tcG9uZW50TmFtZShmaWJlci50eXBlKSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgIHNldEN1cnJlbnRGaWJlcihmaWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzZXRDdXJyZW50RmliZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luRGV2ID0gd2FybklmTm90Q3VycmVudGx5QWN0aW5nVXBkYXRlc0luREVWOyAvLyBJbiB0ZXN0cywgd2Ugd2FudCB0byBlbmZvcmNlIGEgbW9ja2VkIHNjaGVkdWxlci5cblxudmFyIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gZmFsc2U7IC8vIFRPRE8gQmVmb3JlIHdlIHJlbGVhc2UgY29uY3VycmVudCBtb2RlLCByZXZpc2l0IHRoaXMgYW5kIGRlY2lkZSB3aGV0aGVyIGEgbW9ja2VkXG4vLyBzY2hlZHVsZXIgaXMgdGhlIGFjdHVhbCByZWNvbW1lbmRhdGlvbi4gVGhlIGFsdGVybmF0aXZlIGNvdWxkIGJlIGEgdGVzdGluZyBidWlsZCxcbi8vIGEgbmV3IGxpYiwgb3Igd2hhdGV2ZXI7IHdlIGR1bm5vIGp1c3QgeWV0LiBUaGlzIG1lc3NhZ2UgaXMgZm9yIGVhcmx5IGFkb3B0ZXJzXG4vLyB0byBnZXQgdGhlaXIgdGVzdHMgcmlnaHQuXG5cbmZ1bmN0aW9uIHdhcm5JZlVubW9ja2VkU2NoZWR1bGVyKGZpYmVyKSB7XG4gIHtcbiAgICBpZiAoZGlkV2FybkFib3V0VW5tb2NrZWRTY2hlZHVsZXIgPT09IGZhbHNlICYmIFNjaGVkdWxlci51bnN0YWJsZV9mbHVzaEFsbFdpdGhvdXRBc3NlcnRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGZpYmVyLm1vZGUgJiBCbG9ja2luZ01vZGUgfHwgZmliZXIubW9kZSAmIENvbmN1cnJlbnRNb2RlKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dFVubW9ja2VkU2NoZWR1bGVyID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignSW4gQ29uY3VycmVudCBvciBTeW5jIG1vZGVzLCB0aGUgXCJzY2hlZHVsZXJcIiBtb2R1bGUgbmVlZHMgdG8gYmUgbW9ja2VkICcgKyAndG8gZ3VhcmFudGVlIGNvbnNpc3RlbnQgYmVoYXZpb3VyIGFjcm9zcyB0ZXN0cyBhbmQgYnJvd3NlcnMuICcgKyAnRm9yIGV4YW1wbGUsIHdpdGggamVzdDogXFxuJyArIC8vIEJyZWFrIHVwIHJlcXVpcmVzIHRvIGF2b2lkIGFjY2lkZW50YWxseSBwYXJzaW5nIHRoZW0gYXMgZGVwZW5kZW5jaWVzLlxuICAgICAgICBcImplc3QubW9jaygnc2NoZWR1bGVyJywgKCkgPT4gcmVxdWlyZVwiICsgXCIoJ3NjaGVkdWxlci91bnN0YWJsZV9tb2NrJykpO1xcblxcblwiICsgJ0ZvciBtb3JlIGluZm8sIHZpc2l0IGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9tb2NrLXNjaGVkdWxlcicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wdXRlVGhyZWFkSUQocm9vdCwgbGFuZSkge1xuICAvLyBJbnRlcmFjdGlvbiB0aHJlYWRzIGFyZSB1bmlxdWUgcGVyIHJvb3QgYW5kIGV4cGlyYXRpb24gdGltZS5cbiAgLy8gTk9URTogSW50ZW50aW9uYWxseSB1bnNvdW5kIGNhc3QuIEFsbCB0aGF0IG1hdHRlcnMgaXMgdGhhdCBpdCdzIGEgbnVtYmVyXG4gIC8vIGFuZCBpdCByZXByZXNlbnRzIGEgYmF0Y2ggb2Ygd29yay4gQ291bGQgbWFrZSBhIGhlbHBlciBmdW5jdGlvbiBpbnN0ZWFkLFxuICAvLyBidXQgbWVoIHRoaXMgaXMgZmluZSBmb3Igbm93LlxuICByZXR1cm4gbGFuZSAqIDEwMDAgKyByb290LmludGVyYWN0aW9uVGhyZWFkSUQ7XG59XG5cbmZ1bmN0aW9uIG1hcmtTcGF3bmVkV29yayhsYW5lKSB7XG5cbiAgaWYgKHNwYXduZWRXb3JrRHVyaW5nUmVuZGVyID09PSBudWxsKSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIgPSBbbGFuZV07XG4gIH0gZWxzZSB7XG4gICAgc3Bhd25lZFdvcmtEdXJpbmdSZW5kZXIucHVzaChsYW5lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUludGVyYWN0aW9ucyhyb290LCBsYW5lLCBpbnRlcmFjdGlvbnMpIHtcblxuICBpZiAoaW50ZXJhY3Rpb25zLnNpemUgPiAwKSB7XG4gICAgdmFyIHBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwO1xuICAgIHZhciBwZW5kaW5nSW50ZXJhY3Rpb25zID0gcGVuZGluZ0ludGVyYWN0aW9uTWFwLmdldChsYW5lKTtcblxuICAgIGlmIChwZW5kaW5nSW50ZXJhY3Rpb25zICE9IG51bGwpIHtcbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnRlcmFjdGlvbnMuaGFzKGludGVyYWN0aW9uKSkge1xuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciBwcmV2aW91c2x5IHVuc2NoZWR1bGVkIGludGVyYWN0aW9uLlxuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwZW5kaW5nSW50ZXJhY3Rpb25NYXAuc2V0KGxhbmUsIG5ldyBTZXQoaW50ZXJhY3Rpb25zKSk7IC8vIFVwZGF0ZSB0aGUgcGVuZGluZyBhc3luYyB3b3JrIGNvdW50IGZvciB0aGUgY3VycmVudCBpbnRlcmFjdGlvbnMuXG5cbiAgICAgIGludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICBpbnRlcmFjdGlvbi5fX2NvdW50Kys7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmUpO1xuICAgICAgc3Vic2NyaWJlci5vbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlUGVuZGluZ0ludGVyYWN0aW9ucyhyb290LCBsYW5lKSB7XG5cbiAgc2NoZWR1bGVJbnRlcmFjdGlvbnMocm9vdCwgbGFuZSwgdHJhY2luZy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50KTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXb3JrT25QZW5kaW5nSW50ZXJhY3Rpb25zKHJvb3QsIGxhbmVzKSB7XG4gIC8vIHdlIGNhbiBhY2N1cmF0ZWx5IGF0dHJpYnV0ZSB0aW1lIHNwZW50IHdvcmtpbmcgb24gaXQsIEFuZCBzbyB0aGF0IGNhc2NhZGluZ1xuICAvLyB3b3JrIHRyaWdnZXJlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBpdC5cblxuXG4gIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KCk7XG4gIHJvb3QucGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgc2NoZWR1bGVkTGFuZSkge1xuICAgIGlmIChpbmNsdWRlc1NvbWVMYW5lKGxhbmVzLCBzY2hlZHVsZWRMYW5lKSkge1xuICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBpbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7IC8vIFN0b3JlIHRoZSBjdXJyZW50IHNldCBvZiBpbnRlcmFjdGlvbnMgb24gdGhlIEZpYmVyUm9vdCBmb3IgYSBmZXcgcmVhc29uczpcbiAgLy8gV2UgY2FuIHJlLXVzZSBpdCBpbiBob3QgZnVuY3Rpb25zIGxpa2UgcGVyZm9ybUNvbmN1cnJlbnRXb3JrT25Sb290KClcbiAgLy8gd2l0aG91dCBoYXZpbmcgdG8gcmVjYWxjdWxhdGUgaXQuIFdlIHdpbGwgYWxzbyB1c2UgaXQgaW4gY29tbWl0V29yaygpIHRvXG4gIC8vIHBhc3MgdG8gYW55IFByb2ZpbGVyIG9uUmVuZGVyKCkgaG9va3MuIFRoaXMgYWxzbyBwcm92aWRlcyBEZXZUb29scyB3aXRoIGFcbiAgLy8gd2F5IHRvIGFjY2VzcyBpdCB3aGVuIHRoZSBvbkNvbW1pdFJvb3QoKSBob29rIGlzIGNhbGxlZC5cblxuICByb290Lm1lbW9pemVkSW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25zO1xuXG4gIGlmIChpbnRlcmFjdGlvbnMuc2l6ZSA+IDApIHtcbiAgICB2YXIgc3Vic2NyaWJlciA9IHRyYWNpbmcuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgdmFyIHRocmVhZElEID0gY29tcHV0ZVRocmVhZElEKHJvb3QsIGxhbmVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgdGhlIHN1YnNjcmliZXIgdGhyb3dzLCByZXRocm93IGl0IGluIGEgc2VwYXJhdGUgdGFza1xuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrKEltbWVkaWF0ZVByaW9yaXR5JDEsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmlzaFBlbmRpbmdJbnRlcmFjdGlvbnMocm9vdCwgY29tbWl0dGVkTGFuZXMpIHtcblxuICB2YXIgcmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICB2YXIgc3Vic2NyaWJlcjtcblxuICB0cnkge1xuICAgIHN1YnNjcmliZXIgPSB0cmFjaW5nLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50O1xuXG4gICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgcm9vdC5tZW1vaXplZEludGVyYWN0aW9ucy5zaXplID4gMCkge1xuICAgICAgLy8gRklYTUU6IE1vcmUgdGhhbiBvbmUgbGFuZSBjYW4gZmluaXNoIGluIGEgc2luZ2xlIGNvbW1pdC5cbiAgICAgIHZhciB0aHJlYWRJRCA9IGNvbXB1dGVUaHJlYWRJRChyb290LCBjb21taXR0ZWRMYW5lcyk7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQocm9vdC5tZW1vaXplZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgc2NoZWR1bGVDYWxsYmFjayhJbW1lZGlhdGVQcmlvcml0eSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDbGVhciBjb21wbGV0ZWQgaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBlbmRpbmcgTWFwLlxuICAgIC8vIFVubGVzcyB0aGUgcmVuZGVyIHdhcyBzdXNwZW5kZWQgb3IgY2FzY2FkaW5nIHdvcmsgd2FzIHNjaGVkdWxlZCxcbiAgICAvLyBJbiB3aGljaCBjYXNl4oCTIGxlYXZlIHBlbmRpbmcgaW50ZXJhY3Rpb25zIHVudGlsIHRoZSBzdWJzZXF1ZW50IHJlbmRlci5cbiAgICB2YXIgcGVuZGluZ0ludGVyYWN0aW9uTWFwID0gcm9vdC5wZW5kaW5nSW50ZXJhY3Rpb25NYXA7XG4gICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxlZEludGVyYWN0aW9ucywgbGFuZSkge1xuICAgICAgLy8gT25seSBkZWNyZW1lbnQgdGhlIHBlbmRpbmcgaW50ZXJhY3Rpb24gY291bnQgaWYgd2UncmUgZG9uZS5cbiAgICAgIC8vIElmIHRoZXJlJ3Mgc3RpbGwgd29yayBhdCB0aGUgY3VycmVudCBwcmlvcml0eSxcbiAgICAgIC8vIFRoYXQgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIHN1c3BlbnNlIGRhdGEuXG4gICAgICBpZiAoIWluY2x1ZGVzU29tZUxhbmUocmVtYWluaW5nTGFuZXNBZnRlckNvbW1pdCwgbGFuZSkpIHtcbiAgICAgICAgcGVuZGluZ0ludGVyYWN0aW9uTWFwLmRlbGV0ZShsYW5lKTtcbiAgICAgICAgc2NoZWR1bGVkSW50ZXJhY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVyYWN0aW9uKSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwgJiYgaW50ZXJhY3Rpb24uX19jb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5vbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZChpbnRlcmFjdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgc3Vic2NyaWJlciB0aHJvd3MsIHJldGhyb3cgaXQgaW4gYSBzZXBhcmF0ZSB0YXNrXG4gICAgICAgICAgICAgIHNjaGVkdWxlQ2FsbGJhY2soSW1tZWRpYXRlUHJpb3JpdHkkMSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59IC8vIGBhY3RgIHRlc3RpbmcgQVBJXG5cbmZ1bmN0aW9uIHNob3VsZEZvcmNlRmx1c2hGYWxsYmFja3NJbkRFVigpIHtcbiAgLy8gTmV2ZXIgZm9yY2UgZmx1c2ggaW4gcHJvZHVjdGlvbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZ2V0IHN0cmlwcGVkIG91dC5cbiAgcmV0dXJuICBhY3RpbmdVcGRhdGVzU2NvcGVEZXB0aCA+IDA7XG59XG4vLyBzbyB3ZSBjYW4gdGVsbCBpZiBhbnkgYXN5bmMgYWN0KCkgY2FsbHMgdHJ5IHRvIHJ1biBpbiBwYXJhbGxlbC5cblxuXG52YXIgYWN0aW5nVXBkYXRlc1Njb3BlRGVwdGggPSAwO1xuXG5mdW5jdGlvbiBkZXRhY2hGaWJlckFmdGVyRWZmZWN0cyhmaWJlcikge1xuICBmaWJlci5zaWJsaW5nID0gbnVsbDtcbiAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbn1cblxudmFyIHJlc29sdmVGYW1pbHkgPSBudWxsOyAvLyAkRmxvd0ZpeE1lIEZsb3cgZ2V0cyBjb25mdXNlZCBieSBhIFdlYWtTZXQgZmVhdHVyZSBjaGVjayBiZWxvdy5cblxudmFyIGZhaWxlZEJvdW5kYXJpZXMgPSBudWxsO1xudmFyIHNldFJlZnJlc2hIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAge1xuICAgIHJlc29sdmVGYW1pbHkgPSBoYW5kbGVyO1xuICB9XG59O1xuZnVuY3Rpb24gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkodHlwZSk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgLy8gTm8gaW1wbGVtZW50YXRpb24gZGlmZmVyZW5jZXMuXG4gIHJldHVybiByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcodHlwZSk7XG59XG5mdW5jdGlvbiByZXNvbHZlRm9yd2FyZFJlZkZvckhvdFJlbG9hZGluZyh0eXBlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cblxuICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuXG4gICAgaWYgKGZhbWlseSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZWFsIGZvcndhcmRSZWYuIERvbid0IHdhbnQgdG8gY3Jhc2ggZWFybHkuXG4gICAgICBpZiAodHlwZSAhPT0gbnVsbCAmJiB0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR5cGUucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEZvcndhcmRSZWYgaXMgc3BlY2lhbCBiZWNhdXNlIGl0cyByZXNvbHZlZCAudHlwZSBpcyBhbiBvYmplY3QsXG4gICAgICAgIC8vIGJ1dCBpdCdzIHBvc3NpYmxlIHRoYXQgd2Ugb25seSBoYXZlIGl0cyBpbm5lciByZW5kZXIgZnVuY3Rpb24gaW4gdGhlIG1hcC5cbiAgICAgICAgLy8gSWYgdGhhdCBpbm5lciByZW5kZXIgZnVuY3Rpb24gaXMgZGlmZmVyZW50LCB3ZSdsbCBidWlsZCBhIG5ldyBmb3J3YXJkUmVmIHR5cGUuXG4gICAgICAgIHZhciBjdXJyZW50UmVuZGVyID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHR5cGUucmVuZGVyKTtcblxuICAgICAgICBpZiAodHlwZS5yZW5kZXIgIT09IGN1cnJlbnRSZW5kZXIpIHtcbiAgICAgICAgICB2YXIgc3ludGhldGljVHlwZSA9IHtcbiAgICAgICAgICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgICAgICAgICAgcmVuZGVyOiBjdXJyZW50UmVuZGVyXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0eXBlLmRpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN5bnRoZXRpY1R5cGUuZGlzcGxheU5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzeW50aGV0aWNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0eXBlO1xuICAgIH0gLy8gVXNlIHRoZSBsYXRlc3Qga25vd24gaW1wbGVtZW50YXRpb24uXG5cblxuICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgfVxufVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlRmFtaWx5Rm9ySG90UmVsb2FkaW5nKGZpYmVyLCBlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlR5cGUgPSBmaWJlci5lbGVtZW50VHlwZTtcbiAgICB2YXIgbmV4dFR5cGUgPSBlbGVtZW50LnR5cGU7IC8vIElmIHdlIGdvdCBoZXJlLCB3ZSBrbm93IHR5cGVzIGFyZW4ndCA9PT0gZXF1YWwuXG5cbiAgICB2YXIgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSBmYWxzZTtcbiAgICB2YXIgJCR0eXBlb2ZOZXh0VHlwZSA9IHR5cGVvZiBuZXh0VHlwZSA9PT0gJ29iamVjdCcgJiYgbmV4dFR5cGUgIT09IG51bGwgPyBuZXh0VHlwZS4kJHR5cGVvZiA6IG51bGw7XG5cbiAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgY2FzZSBDbGFzc0NvbXBvbmVudDpcbiAgICAgICAge1xuICAgICAgICAgIGlmICh0eXBlb2YgbmV4dFR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIEZ1bmN0aW9uQ29tcG9uZW50OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuZXh0VHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHRoZSBpbm5lciB0eXBlIHlldC5cbiAgICAgICAgICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGFzc3VtZSB0aGF0IHRoZSBsYXp5IGlubmVyIHR5cGUgaXMgc3RhYmxlLFxuICAgICAgICAgICAgLy8gYW5kIHNvIGl0IGlzIHN1ZmZpY2llbnQgdG8gYXZvaWQgcmVjb25jaWxpbmcgaXQgYXdheS5cbiAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byB1bndyYXAgb3IgYWN0dWFsbHkgdXNlIHRoZSBuZXcgbGF6eSB0eXBlLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAge1xuICAgICAgICAgIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIGlmICgkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUpIHtcbiAgICAgICAgICAgIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICBjYXNlIE1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpZiBpdCB3YXMgYnV0IGNhbiBubyBsb25nZXIgYmUgc2ltcGxlLFxuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkbid0IHNldCB0aGlzLlxuICAgICAgICAgICAgbmVlZHNDb21wYXJlRmFtaWxpZXMgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFKSB7XG4gICAgICAgICAgICBuZWVkc0NvbXBhcmVGYW1pbGllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gQ2hlY2sgaWYgYm90aCB0eXBlcyBoYXZlIGEgZmFtaWx5IGFuZCBpdCdzIHRoZSBzYW1lIG9uZS5cblxuXG4gICAgaWYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzKSB7XG4gICAgICAvLyBOb3RlOiBtZW1vKCkgYW5kIGZvcndhcmRSZWYoKSB3ZSdsbCBjb21wYXJlIG91dGVyIHJhdGhlciB0aGFuIGlubmVyIHR5cGUuXG4gICAgICAvLyBUaGlzIG1lYW5zIGJvdGggb2YgdGhlbSBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgdG8gcHJlc2VydmUgc3RhdGUuXG4gICAgICAvLyBJZiB3ZSB1bndyYXBwZWQgYW5kIGNvbXBhcmVkIHRoZSBpbm5lciB0eXBlcyBmb3Igd3JhcHBlcnMgaW5zdGVhZCxcbiAgICAgIC8vIHRoZW4gd2Ugd291bGQgcmlzayBmYWxzZWx5IHNheWluZyB0d28gc2VwYXJhdGUgbWVtbyhGb28pXG4gICAgICAvLyBjYWxscyBhcmUgZXF1aXZhbGVudCBiZWNhdXNlIHRoZXkgd3JhcCB0aGUgc2FtZSBGb28gZnVuY3Rpb24uXG4gICAgICB2YXIgcHJldkZhbWlseSA9IHJlc29sdmVGYW1pbHkocHJldlR5cGUpO1xuXG4gICAgICBpZiAocHJldkZhbWlseSAhPT0gdW5kZWZpbmVkICYmIHByZXZGYW1pbHkgPT09IHJlc29sdmVGYW1pbHkobmV4dFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gbWFya0ZhaWxlZEVycm9yQm91bmRhcnlGb3JIb3RSZWxvYWRpbmcoZmliZXIpIHtcbiAge1xuICAgIGlmIChyZXNvbHZlRmFtaWx5ID09PSBudWxsKSB7XG4gICAgICAvLyBIb3QgcmVsb2FkaW5nIGlzIGRpc2FibGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgV2Vha1NldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmYWlsZWRCb3VuZGFyaWVzID09PSBudWxsKSB7XG4gICAgICBmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKTtcbiAgICB9XG5cbiAgICBmYWlsZWRCb3VuZGFyaWVzLmFkZChmaWJlcik7XG4gIH1cbn1cbnZhciBzY2hlZHVsZVJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgdXBkYXRlKSB7XG4gIHtcbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgLy8gSG90IHJlbG9hZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3RhbGVGYW1pbGllcyA9IHVwZGF0ZS5zdGFsZUZhbWlsaWVzLFxuICAgICAgICB1cGRhdGVkRmFtaWxpZXMgPSB1cGRhdGUudXBkYXRlZEZhbWlsaWVzO1xuICAgIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKTtcbiAgICBmbHVzaFN5bmMoZnVuY3Rpb24gKCkge1xuICAgICAgc2NoZWR1bGVGaWJlcnNXaXRoRmFtaWxpZXNSZWN1cnNpdmVseShyb290LmN1cnJlbnQsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfSk7XG4gIH1cbn07XG52YXIgc2NoZWR1bGVSb290ID0gZnVuY3Rpb24gKHJvb3QsIGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChyb290LmNvbnRleHQgIT09IGVtcHR5Q29udGV4dE9iamVjdCkge1xuICAgICAgLy8gU3VwZXIgZWRnZSBjYXNlOiByb290IGhhcyBhIGxlZ2FjeSBfcmVuZGVyU3VidHJlZSBjb250ZXh0XG4gICAgICAvLyBidXQgd2UgZG9uJ3Qga25vdyB0aGUgcGFyZW50Q29tcG9uZW50IHNvIHdlIGNhbid0IHBhc3MgaXQuXG4gICAgICAvLyBKdXN0IGlnbm9yZS4gV2UnbGwgZGVsZXRlIHRoaXMgd2l0aCBfcmVuZGVyU3VidHJlZSBjb2RlIHBhdGggbGF0ZXIuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgIGZsdXNoU3luYyhmdW5jdGlvbiAoKSB7XG4gICAgICB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoZmliZXIsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcykge1xuICB7XG4gICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAocmVzb2x2ZUZhbWlseSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCByZXNvbHZlRmFtaWx5IHRvIGJlIHNldCBkdXJpbmcgaG90IHJlbG9hZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgbmVlZHNSZW5kZXIgPSBmYWxzZTtcbiAgICB2YXIgbmVlZHNSZW1vdW50ID0gZmFsc2U7XG5cbiAgICBpZiAoY2FuZGlkYXRlVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdmFyIGZhbWlseSA9IHJlc29sdmVGYW1pbHkoY2FuZGlkYXRlVHlwZSk7XG5cbiAgICAgIGlmIChmYW1pbHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoc3RhbGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodXBkYXRlZEZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgICAgICAgaWYgKHRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICAgICAgICAgIG5lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZWRzUmVuZGVyID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFpbGVkQm91bmRhcmllcyAhPT0gbnVsbCkge1xuICAgICAgaWYgKGZhaWxlZEJvdW5kYXJpZXMuaGFzKGZpYmVyKSB8fCBhbHRlcm5hdGUgIT09IG51bGwgJiYgZmFpbGVkQm91bmRhcmllcy5oYXMoYWx0ZXJuYXRlKSkge1xuICAgICAgICBuZWVkc1JlbW91bnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZWVkc1JlbW91bnQpIHtcbiAgICAgIGZpYmVyLl9kZWJ1Z05lZWRzUmVtb3VudCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKG5lZWRzUmVtb3VudCB8fCBuZWVkc1JlbmRlcikge1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiAhbmVlZHNSZW1vdW50KSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KGNoaWxkLCB1cGRhdGVkRmFtaWxpZXMsIHN0YWxlRmFtaWxpZXMpO1xuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KHNpYmxpbmcsIHVwZGF0ZWRGYW1pbGllcywgc3RhbGVGYW1pbGllcyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2ggPSBmdW5jdGlvbiAocm9vdCwgZmFtaWxpZXMpIHtcbiAge1xuICAgIHZhciBob3N0SW5zdGFuY2VzID0gbmV3IFNldCgpO1xuICAgIHZhciB0eXBlcyA9IG5ldyBTZXQoZmFtaWxpZXMubWFwKGZ1bmN0aW9uIChmYW1pbHkpIHtcbiAgICAgIHJldHVybiBmYW1pbHkuY3VycmVudDtcbiAgICB9KSk7XG4gICAgZmluZEhvc3RJbnN0YW5jZXNGb3JNYXRjaGluZ0ZpYmVyc1JlY3Vyc2l2ZWx5KHJvb3QuY3VycmVudCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIHJldHVybiBob3N0SW5zdGFuY2VzO1xuICB9XG59O1xuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoZmliZXIsIHR5cGVzLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgY2hpbGQgPSBmaWJlci5jaGlsZCxcbiAgICAgICAgc2libGluZyA9IGZpYmVyLnNpYmxpbmcsXG4gICAgICAgIHRhZyA9IGZpYmVyLnRhZyxcbiAgICAgICAgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgdmFyIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuXG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICBjYXNlIENsYXNzQ29tcG9uZW50OlxuICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgY2FuZGlkYXRlVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZGlkTWF0Y2ggPSBmYWxzZTtcblxuICAgIGlmIChjYW5kaWRhdGVUeXBlICE9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZXMuaGFzKGNhbmRpZGF0ZVR5cGUpKSB7XG4gICAgICAgIGRpZE1hdGNoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlkTWF0Y2gpIHtcbiAgICAgIC8vIFdlIGhhdmUgYSBtYXRjaC4gVGhpcyBvbmx5IGRyaWxscyBkb3duIHRvIHRoZSBjbG9zZXN0IGhvc3QgY29tcG9uZW50cy5cbiAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZWFyY2ggZGVlcGVyIGJlY2F1c2UgZm9yIHRoZSBwdXJwb3NlIG9mIGdpdmluZ1xuICAgICAgLy8gdmlzdWFsIGZlZWRiYWNrLCBcImZsYXNoaW5nXCIgb3V0ZXJtb3N0IHBhcmVudCByZWN0YW5nbGVzIGlzIHN1ZmZpY2llbnQuXG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBtYXRjaCwgbWF5YmUgdGhlcmUgd2lsbCBiZSBvbmUgZnVydGhlciBkb3duIGluIHRoZSBjaGlsZCB0cmVlLlxuICAgICAgaWYgKGNoaWxkICE9PSBudWxsKSB7XG4gICAgICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yTWF0Y2hpbmdGaWJlcnNSZWN1cnNpdmVseShjaGlsZCwgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzaWJsaW5nICE9PSBudWxsKSB7XG4gICAgICBmaW5kSG9zdEluc3RhbmNlc0Zvck1hdGNoaW5nRmliZXJzUmVjdXJzaXZlbHkoc2libGluZywgdHlwZXMsIGhvc3RJbnN0YW5jZXMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKSB7XG4gIHtcbiAgICB2YXIgZm91bmRIb3N0SW5zdGFuY2VzID0gZmluZENoaWxkSG9zdEluc3RhbmNlc0ZvckZpYmVyU2hhbGxvd2x5KGZpYmVyLCBob3N0SW5zdGFuY2VzKTtcblxuICAgIGlmIChmb3VuZEhvc3RJbnN0YW5jZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElmIHdlIGRpZG4ndCBmaW5kIGFueSBob3N0IGNoaWxkcmVuLCBmYWxsYmFjayB0byBjbG9zZXN0IGhvc3QgcGFyZW50LlxuXG5cbiAgICB2YXIgbm9kZSA9IGZpYmVyO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHN3aXRjaCAobm9kZS50YWcpIHtcbiAgICAgICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlKTtcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY2FzZSBIb3N0UG9ydGFsOlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjYXNlIEhvc3RSb290OlxuICAgICAgICAgIGhvc3RJbnN0YW5jZXMuYWRkKG5vZGUuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUucmV0dXJuID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdG8gcmVhY2ggcm9vdCBmaXJzdC4nKTtcbiAgICAgIH1cblxuICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGRIb3N0SW5zdGFuY2VzRm9yRmliZXJTaGFsbG93bHkoZmliZXIsIGhvc3RJbnN0YW5jZXMpIHtcbiAge1xuICAgIHZhciBub2RlID0gZmliZXI7XG4gICAgdmFyIGZvdW5kSG9zdEluc3RhbmNlcyA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChub2RlLnRhZyA9PT0gSG9zdENvbXBvbmVudCkge1xuICAgICAgICAvLyBXZSBnb3QgYSBtYXRjaC5cbiAgICAgICAgZm91bmRIb3N0SW5zdGFuY2VzID0gdHJ1ZTtcbiAgICAgICAgaG9zdEluc3RhbmNlcy5hZGQobm9kZS5zdGF0ZU5vZGUpOyAvLyBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSwgc28ga2VlcCBzZWFyY2hpbmcuXG4gICAgICB9IGVsc2UgaWYgKG5vZGUuY2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgbm9kZS5jaGlsZC5yZXR1cm4gPSBub2RlO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlID09PSBmaWJlcikge1xuICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAobm9kZS5zaWJsaW5nID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnJldHVybiA9PT0gbnVsbCB8fCBub2RlLnJldHVybiA9PT0gZmliZXIpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmRIb3N0SW5zdGFuY2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxudmFyIGhhc0JhZE1hcFBvbHlmaWxsO1xuXG57XG4gIGhhc0JhZE1hcFBvbHlmaWxsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tbmV3ICovXG5cbiAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtub25FeHRlbnNpYmxlT2JqZWN0XSk7XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1uZXcgKi9cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFRPRE86IENvbnNpZGVyIHdhcm5pbmcgYWJvdXQgYmFkIHBvbHlmaWxsc1xuICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgZGVidWdDb3VudGVyID0gMTtcblxuZnVuY3Rpb24gRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gSW5zdGFuY2VcbiAgdGhpcy50YWcgPSB0YWc7XG4gIHRoaXMua2V5ID0ga2V5O1xuICB0aGlzLmVsZW1lbnRUeXBlID0gbnVsbDtcbiAgdGhpcy50eXBlID0gbnVsbDtcbiAgdGhpcy5zdGF0ZU5vZGUgPSBudWxsOyAvLyBGaWJlclxuXG4gIHRoaXMucmV0dXJuID0gbnVsbDtcbiAgdGhpcy5jaGlsZCA9IG51bGw7XG4gIHRoaXMuc2libGluZyA9IG51bGw7XG4gIHRoaXMuaW5kZXggPSAwO1xuICB0aGlzLnJlZiA9IG51bGw7XG4gIHRoaXMucGVuZGluZ1Byb3BzID0gcGVuZGluZ1Byb3BzO1xuICB0aGlzLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgdGhpcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgdGhpcy5kZXBlbmRlbmNpZXMgPSBudWxsO1xuICB0aGlzLm1vZGUgPSBtb2RlOyAvLyBFZmZlY3RzXG5cbiAgdGhpcy5mbGFncyA9IE5vRmxhZ3M7XG4gIHRoaXMubmV4dEVmZmVjdCA9IG51bGw7XG4gIHRoaXMuZmlyc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB0aGlzLmxhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5jaGlsZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuXG4gIHtcbiAgICAvLyBOb3RlOiBUaGUgZm9sbG93aW5nIGlzIGRvbmUgdG8gYXZvaWQgYSB2OCBwZXJmb3JtYW5jZSBjbGlmZi5cbiAgICAvL1xuICAgIC8vIEluaXRpYWxpemluZyB0aGUgZmllbGRzIGJlbG93IHRvIHNtaXMgYW5kIGxhdGVyIHVwZGF0aW5nIHRoZW0gd2l0aFxuICAgIC8vIGRvdWJsZSB2YWx1ZXMgd2lsbCBjYXVzZSBGaWJlcnMgdG8gZW5kIHVwIGhhdmluZyBzZXBhcmF0ZSBzaGFwZXMuXG4gICAgLy8gVGhpcyBiZWhhdmlvci9idWcgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9uKCkuXG4gICAgLy8gRm9ydHVuYXRlbHkgdGhpcyBvbmx5IGltcGFjdHMgREVWIGJ1aWxkcy5cbiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IG1ha2VzIFJlYWN0IHVudXNhYmx5IHNsb3cgZm9yIHNvbWUgYXBwbGljYXRpb25zLlxuICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIGluaXRpYWxpemUgdGhlIGZpZWxkcyBiZWxvdyB3aXRoIGRvdWJsZXMuXG4gICAgLy9cbiAgICAvLyBMZWFybiBtb3JlIGFib3V0IHRoaXMgaGVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE0MzY1XG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9ODUzOFxuICAgIHRoaXMuYWN0dWFsRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMuYWN0dWFsU3RhcnRUaW1lID0gTnVtYmVyLk5hTjtcbiAgICB0aGlzLnNlbGZCYXNlRHVyYXRpb24gPSBOdW1iZXIuTmFOO1xuICAgIHRoaXMudHJlZUJhc2VEdXJhdGlvbiA9IE51bWJlci5OYU47IC8vIEl0J3Mgb2theSB0byByZXBsYWNlIHRoZSBpbml0aWFsIGRvdWJsZXMgd2l0aCBzbWlzIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgIC8vIFRoaXMgd29uJ3QgdHJpZ2dlciB0aGUgcGVyZm9ybWFuY2UgY2xpZmYgbWVudGlvbmVkIGFib3ZlLFxuICAgIC8vIGFuZCBpdCBzaW1wbGlmaWVzIG90aGVyIHByb2ZpbGVyIGNvZGUgKGluY2x1ZGluZyBEZXZUb29scykuXG5cbiAgICB0aGlzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICB0aGlzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIHRoaXMuc2VsZkJhc2VEdXJhdGlvbiA9IDA7XG4gICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gMDtcbiAgfVxuXG4gIHtcbiAgICAvLyBUaGlzIGlzbid0IGRpcmVjdGx5IHVzZWQgYnV0IGlzIGhhbmR5IGZvciBkZWJ1Z2dpbmcgaW50ZXJuYWxzOlxuICAgIHRoaXMuX2RlYnVnSUQgPSBkZWJ1Z0NvdW50ZXIrKztcbiAgICB0aGlzLl9kZWJ1Z1NvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdPd25lciA9IG51bGw7XG4gICAgdGhpcy5fZGVidWdOZWVkc1JlbW91bnQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG5cbiAgICBpZiAoIWhhc0JhZE1hcFBvbHlmaWxsICYmIHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh0aGlzKTtcbiAgICB9XG4gIH1cbn0gLy8gVGhpcyBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCByYXRoZXIgdGhhbiBhIFBPSk8gY29uc3RydWN0b3IsIHN0aWxsXG4vLyBwbGVhc2UgZW5zdXJlIHdlIGRvIHRoZSBmb2xsb3dpbmc6XG4vLyAxKSBOb2JvZHkgc2hvdWxkIGFkZCBhbnkgaW5zdGFuY2UgbWV0aG9kcyBvbiB0aGlzLiBJbnN0YW5jZSBtZXRob2RzIGNhbiBiZVxuLy8gICAgbW9yZSBkaWZmaWN1bHQgdG8gcHJlZGljdCB3aGVuIHRoZXkgZ2V0IG9wdGltaXplZCBhbmQgdGhleSBhcmUgYWxtb3N0XG4vLyAgICBuZXZlciBpbmxpbmVkIHByb3Blcmx5IGluIHN0YXRpYyBjb21waWxlcnMuXG4vLyAyKSBOb2JvZHkgc2hvdWxkIHJlbHkgb24gYGluc3RhbmNlb2YgRmliZXJgIGZvciB0eXBlIHRlc3RpbmcuIFdlIHNob3VsZFxuLy8gICAgYWx3YXlzIGtub3cgd2hlbiBpdCBpcyBhIGZpYmVyLlxuLy8gMykgV2UgbWlnaHQgd2FudCB0byBleHBlcmltZW50IHdpdGggdXNpbmcgbnVtZXJpYyBrZXlzIHNpbmNlIHRoZXkgYXJlIGVhc2llclxuLy8gICAgdG8gb3B0aW1pemUgaW4gYSBub24tSklUIGVudmlyb25tZW50LlxuLy8gNCkgV2UgY2FuIGVhc2lseSBnbyBmcm9tIGEgY29uc3RydWN0b3IgdG8gYSBjcmVhdGVGaWJlciBvYmplY3QgbGl0ZXJhbCBpZiB0aGF0XG4vLyAgICBpcyBmYXN0ZXIuXG4vLyA1KSBJdCBzaG91bGQgYmUgZWFzeSB0byBwb3J0IHRoaXMgdG8gYSBDIHN0cnVjdCBhbmQga2VlcCBhIEMgaW1wbGVtZW50YXRpb25cbi8vICAgIGNvbXBhdGlibGUuXG5cblxudmFyIGNyZWF0ZUZpYmVyID0gZnVuY3Rpb24gKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpIHtcbiAgLy8gJEZsb3dGaXhNZTogdGhlIHNoYXBlcyBhcmUgZXhhY3QgaGVyZSBidXQgRmxvdyBkb2Vzbid0IGxpa2UgY29uc3RydWN0b3JzXG4gIHJldHVybiBuZXcgRmliZXJOb2RlKHRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xufTtcblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0JDEoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVGdW5jdGlvbkNvbXBvbmVudCh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2hvdWxkQ29uc3RydWN0JDEodHlwZSkgJiYgdHlwZS5kZWZhdWx0UHJvcHMgPT09IHVuZGVmaW5lZDtcbn1cbmZ1bmN0aW9uIHJlc29sdmVMYXp5Q29tcG9uZW50VGFnKENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzaG91bGRDb25zdHJ1Y3QkMShDb21wb25lbnQpID8gQ2xhc3NDb21wb25lbnQgOiBGdW5jdGlvbkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChDb21wb25lbnQgIT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09IG51bGwpIHtcbiAgICB2YXIgJCR0eXBlb2YgPSBDb21wb25lbnQuJCR0eXBlb2Y7XG5cbiAgICBpZiAoJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUpIHtcbiAgICAgIHJldHVybiBGb3J3YXJkUmVmO1xuICAgIH1cblxuICAgIGlmICgkJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICByZXR1cm4gTWVtb0NvbXBvbmVudDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDtcbn0gLy8gVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUgZmliZXIgdG8gZG8gd29yayBvbi5cblxuZnVuY3Rpb24gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgcGVuZGluZ1Byb3BzKSB7XG4gIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuXG4gIGlmICh3b3JrSW5Qcm9ncmVzcyA9PT0gbnVsbCkge1xuICAgIC8vIFdlIHVzZSBhIGRvdWJsZSBidWZmZXJpbmcgcG9vbGluZyB0ZWNobmlxdWUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgd2UnbGxcbiAgICAvLyBvbmx5IGV2ZXIgbmVlZCBhdCBtb3N0IHR3byB2ZXJzaW9ucyBvZiBhIHRyZWUuIFdlIHBvb2wgdGhlIFwib3RoZXJcIiB1bnVzZWRcbiAgICAvLyBub2RlIHRoYXQgd2UncmUgZnJlZSB0byByZXVzZS4gVGhpcyBpcyBsYXppbHkgY3JlYXRlZCB0byBhdm9pZCBhbGxvY2F0aW5nXG4gICAgLy8gZXh0cmEgb2JqZWN0cyBmb3IgdGhpbmdzIHRoYXQgYXJlIG5ldmVyIHVwZGF0ZWQuIEl0IGFsc28gYWxsb3cgdXMgdG9cbiAgICAvLyByZWNsYWltIHRoZSBleHRyYSBtZW1vcnkgaWYgbmVlZGVkLlxuICAgIHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoY3VycmVudC50YWcsIHBlbmRpbmdQcm9wcywgY3VycmVudC5rZXksIGN1cnJlbnQubW9kZSk7XG4gICAgd29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUgPSBjdXJyZW50LmVsZW1lbnRUeXBlO1xuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudC5zdGF0ZU5vZGU7XG5cbiAgICB7XG4gICAgICAvLyBERVYtb25seSBmaWVsZHNcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0lEID0gY3VycmVudC5fZGVidWdJRDtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z1NvdXJjZSA9IGN1cnJlbnQuX2RlYnVnU291cmNlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgPSBjdXJyZW50Ll9kZWJ1Z093bmVyO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gY3VycmVudC5fZGVidWdIb29rVHlwZXM7XG4gICAgfVxuXG4gICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gY3VycmVudDtcbiAgICBjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzO1xuICB9IGVsc2Uge1xuICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wczsgLy8gTmVlZGVkIGJlY2F1c2UgQmxvY2tzIHN0b3JlIGRhdGEgb24gdHlwZS5cblxuICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGU7IC8vIFdlIGFscmVhZHkgaGF2ZSBhbiBhbHRlcm5hdGUuXG4gICAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IE5vRmxhZ3M7IC8vIFRoZSBlZmZlY3QgbGlzdCBpcyBubyBsb25nZXIgdmFsaWQuXG5cbiAgICB3b3JrSW5Qcm9ncmVzcy5uZXh0RWZmZWN0ID0gbnVsbDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFzdEVmZmVjdCA9IG51bGw7XG5cbiAgICB7XG4gICAgICAvLyBXZSBpbnRlbnRpb25hbGx5IHJlc2V0LCByYXRoZXIgdGhhbiBjb3B5LCBhY3R1YWxEdXJhdGlvbiAmIGFjdHVhbFN0YXJ0VGltZS5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGltZSBmcm9tIGVuZGxlc3NseSBhY2N1bXVsYXRpbmcgaW4gbmV3IGNvbW1pdHMuXG4gICAgICAvLyBUaGlzIGhhcyB0aGUgZG93bnNpZGUgb2YgcmVzZXR0aW5nIHZhbHVlcyBmb3IgZGlmZmVyZW50IHByaW9yaXR5IHJlbmRlcnMsXG4gICAgICAvLyBCdXQgd29ya3MgZm9yIHlpZWxkaW5nICh0aGUgY29tbW9uIGNhc2UpIGFuZCBzaG91bGQgc3VwcG9ydCByZXN1bWluZy5cbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLmFjdHVhbFN0YXJ0VGltZSA9IC0xO1xuICAgIH1cbiAgfVxuXG4gIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWU7IC8vIENsb25lIHRoZSBkZXBlbmRlbmNpZXMgb2JqZWN0LiBUaGlzIGlzIG11dGF0ZWQgZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UsIHNvXG4gIC8vIGl0IGNhbm5vdCBiZSBzaGFyZWQgd2l0aCB0aGUgY3VycmVudCBmaWJlci5cblxuICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzID09PSBudWxsID8gbnVsbCA6IHtcbiAgICBsYW5lczogY3VycmVudERlcGVuZGVuY2llcy5sYW5lcyxcbiAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gIH07IC8vIFRoZXNlIHdpbGwgYmUgb3ZlcnJpZGRlbiBkdXJpbmcgdGhlIHBhcmVudCdzIHJlY29uY2lsaWF0aW9uXG5cbiAgd29ya0luUHJvZ3Jlc3Muc2libGluZyA9IGN1cnJlbnQuc2libGluZztcbiAgd29ya0luUHJvZ3Jlc3MuaW5kZXggPSBjdXJyZW50LmluZGV4O1xuICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcblxuICB7XG4gICAgd29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uID0gY3VycmVudC50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAge1xuICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z05lZWRzUmVtb3VudCA9IGN1cnJlbnQuX2RlYnVnTmVlZHNSZW1vdW50O1xuXG4gICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgIGNhc2UgSW5kZXRlcm1pbmF0ZUNvbXBvbmVudDpcbiAgICAgIGNhc2UgRnVuY3Rpb25Db21wb25lbnQ6XG4gICAgICBjYXNlIFNpbXBsZU1lbW9Db21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlRnVuY3Rpb25Gb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQ2xhc3NDb21wb25lbnQ6XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlQ2xhc3NGb3JIb3RSZWxvYWRpbmcoY3VycmVudC50eXBlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRm9yd2FyZFJlZjpcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKGN1cnJlbnQudHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbn0gLy8gVXNlZCB0byByZXVzZSBhIEZpYmVyIGZvciBhIHNlY29uZCBwYXNzLlxuXG5mdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAvLyBUaGlzIHJlc2V0cyB0aGUgRmliZXIgdG8gd2hhdCBjcmVhdGVGaWJlciBvciBjcmVhdGVXb3JrSW5Qcm9ncmVzcyB3b3VsZFxuICAvLyBoYXZlIHNldCB0aGUgdmFsdWVzIHRvIGJlZm9yZSBkdXJpbmcgdGhlIGZpcnN0IHBhc3MuIElkZWFsbHkgdGhpcyB3b3VsZG4ndFxuICAvLyBiZSBuZWNlc3NhcnkgYnV0IHVuZm9ydHVuYXRlbHkgbWFueSBjb2RlIHBhdGhzIHJlYWRzIGZyb20gdGhlIHdvcmtJblByb2dyZXNzXG4gIC8vIHdoZW4gdGhleSBzaG91bGQgYmUgcmVhZGluZyBmcm9tIGN1cnJlbnQgYW5kIHdyaXRpbmcgdG8gd29ya0luUHJvZ3Jlc3MuXG4gIC8vIFdlIGFzc3VtZSBwZW5kaW5nUHJvcHMsIGluZGV4LCBrZXksIHJlZiwgcmV0dXJuIGFyZSBzdGlsbCB1bnRvdWNoZWQgdG9cbiAgLy8gYXZvaWQgZG9pbmcgYW5vdGhlciByZWNvbmNpbGlhdGlvbi5cbiAgLy8gUmVzZXQgdGhlIGVmZmVjdCB0YWcgYnV0IGtlZXAgYW55IFBsYWNlbWVudCB0YWdzLCBzaW5jZSB0aGF0J3Mgc29tZXRoaW5nXG4gIC8vIHRoYXQgY2hpbGQgZmliZXIgaXMgc2V0dGluZywgbm90IHRoZSByZWNvbmNpbGlhdGlvbi5cbiAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gUGxhY2VtZW50OyAvLyBUaGUgZWZmZWN0IGxpc3QgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuXG4gIHdvcmtJblByb2dyZXNzLm5leHRFZmZlY3QgPSBudWxsO1xuICB3b3JrSW5Qcm9ncmVzcy5maXJzdEVmZmVjdCA9IG51bGw7XG4gIHdvcmtJblByb2dyZXNzLmxhc3RFZmZlY3QgPSBudWxsO1xuICB2YXIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcblxuICBpZiAoY3VycmVudCA9PT0gbnVsbCkge1xuICAgIC8vIFJlc2V0IHRvIGNyZWF0ZUZpYmVyJ3MgaW5pdGlhbCB2YWx1ZXMuXG4gICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IE5vTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSByZW5kZXJMYW5lcztcbiAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IG51bGw7XG4gICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbDtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gMDtcbiAgICAgIHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSAwO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBSZXNldCB0byB0aGUgY2xvbmVkIHZhbHVlcyB0aGF0IGNyZWF0ZVdvcmtJblByb2dyZXNzIHdvdWxkJ3ZlLlxuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkTGFuZXMgPSBjdXJyZW50LmNoaWxkTGFuZXM7XG4gICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSBjdXJyZW50LmxhbmVzO1xuICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gY3VycmVudC5tZW1vaXplZFByb3BzO1xuICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlOyAvLyBOZWVkZWQgYmVjYXVzZSBCbG9ja3Mgc3RvcmUgZGF0YSBvbiB0eXBlLlxuXG4gICAgd29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQudHlwZTsgLy8gQ2xvbmUgdGhlIGRlcGVuZGVuY2llcyBvYmplY3QuIFRoaXMgaXMgbXV0YXRlZCBkdXJpbmcgdGhlIHJlbmRlciBwaGFzZSwgc29cbiAgICAvLyBpdCBjYW5ub3QgYmUgc2hhcmVkIHdpdGggdGhlIGN1cnJlbnQgZmliZXIuXG5cbiAgICB2YXIgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnQuZGVwZW5kZW5jaWVzO1xuICAgIHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMgPT09IG51bGwgPyBudWxsIDoge1xuICAgICAgbGFuZXM6IGN1cnJlbnREZXBlbmRlbmNpZXMubGFuZXMsXG4gICAgICBmaXJzdENvbnRleHQ6IGN1cnJlbnREZXBlbmRlbmNpZXMuZmlyc3RDb250ZXh0XG4gICAgfTtcblxuICAgIHtcbiAgICAgIC8vIE5vdGU6IFdlIGRvbid0IHJlc2V0IHRoZSBhY3R1YWxUaW1lIGNvdW50cy4gSXQncyB1c2VmdWwgdG8gYWNjdW11bGF0ZVxuICAgICAgLy8gYWN0dWFsIHRpbWUgYWNyb3NzIG11bHRpcGxlIHJlbmRlciBwYXNzZXMuXG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG59XG5mdW5jdGlvbiBjcmVhdGVIb3N0Um9vdEZpYmVyKHRhZykge1xuICB2YXIgbW9kZTtcblxuICBpZiAodGFnID09PSBDb25jdXJyZW50Um9vdCkge1xuICAgIG1vZGUgPSBDb25jdXJyZW50TW9kZSB8IEJsb2NraW5nTW9kZSB8IFN0cmljdE1vZGU7XG4gIH0gZWxzZSBpZiAodGFnID09PSBCbG9ja2luZ1Jvb3QpIHtcbiAgICBtb2RlID0gQmxvY2tpbmdNb2RlIHwgU3RyaWN0TW9kZTtcbiAgfSBlbHNlIHtcbiAgICBtb2RlID0gTm9Nb2RlO1xuICB9XG5cbiAgaWYgKCBpc0RldlRvb2xzUHJlc2VudCkge1xuICAgIC8vIEFsd2F5cyBjb2xsZWN0IHByb2ZpbGUgdGltaW5ncyB3aGVuIERldlRvb2xzIGFyZSBwcmVzZW50LlxuICAgIC8vIFRoaXMgZW5hYmxlcyBEZXZUb29scyB0byBzdGFydCBjYXB0dXJpbmcgdGltaW5nIGF0IGFueSBwb2ludOKAk1xuICAgIC8vIFdpdGhvdXQgc29tZSBub2RlcyBpbiB0aGUgdHJlZSBoYXZpbmcgZW1wdHkgYmFzZSB0aW1lcy5cbiAgICBtb2RlIHw9IFByb2ZpbGVNb2RlO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZUZpYmVyKEhvc3RSb290LCBudWxsLCBudWxsLCBtb2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyh0eXBlLCAvLyBSZWFjdCRFbGVtZW50VHlwZVxua2V5LCBwZW5kaW5nUHJvcHMsIG93bmVyLCBtb2RlLCBsYW5lcykge1xuICB2YXIgZmliZXJUYWcgPSBJbmRldGVybWluYXRlQ29tcG9uZW50OyAvLyBUaGUgcmVzb2x2ZWQgdHlwZSBpcyBzZXQgaWYgd2Uga25vdyB3aGF0IHRoZSBmaW5hbCB0eXBlIHdpbGwgYmUuIEkuZS4gaXQncyBub3QgbGF6eS5cblxuICB2YXIgcmVzb2x2ZWRUeXBlID0gdHlwZTtcblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoc2hvdWxkQ29uc3RydWN0JDEodHlwZSkpIHtcbiAgICAgIGZpYmVyVGFnID0gQ2xhc3NDb21wb25lbnQ7XG5cbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUNsYXNzRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHtcbiAgICAgICAgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZUZ1bmN0aW9uRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIGZpYmVyVGFnID0gSG9zdENvbXBvbmVudDtcbiAgfSBlbHNlIHtcbiAgICBnZXRUYWc6IHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQocGVuZGluZ1Byb3BzLmNoaWxkcmVuLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRTpcbiAgICAgICAgZmliZXJUYWcgPSBNb2RlO1xuICAgICAgICBtb2RlIHw9IERlYnVnVHJhY2luZ01vZGU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgIGZpYmVyVGFnID0gTW9kZTtcbiAgICAgICAgbW9kZSB8PSBTdHJpY3RNb2RlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tUHJvZmlsZXIocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICByZXR1cm4gY3JlYXRlRmliZXJGcm9tU3VzcGVuc2UocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZUxpc3QocGVuZGluZ1Byb3BzLCBtb2RlLCBsYW5lcywga2V5KTtcblxuICAgICAgY2FzZSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbU9mZnNjcmVlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTpcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpYmVyRnJvbUxlZ2FjeUhpZGRlbihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpO1xuXG4gICAgICBjYXNlIFJFQUNUX1NDT1BFX1RZUEU6XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gQ29udGV4dFByb3ZpZGVyO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcblxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29uc3VtZXJcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IENvbnRleHRDb25zdW1lcjtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gRm9yd2FyZFJlZjtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmRm9ySG90UmVsb2FkaW5nKHJlc29sdmVkVHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gTWVtb0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICBicmVhayBnZXRUYWc7XG5cbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgZmliZXJUYWcgPSBMYXp5Q29tcG9uZW50O1xuICAgICAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgZ2V0VGFnO1xuXG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgICAgICAgICBmaWJlclRhZyA9IEJsb2NrO1xuICAgICAgICAgICAgICAgIGJyZWFrIGdldFRhZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgaW5mbyA9ICcnO1xuXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgXCIgKyAnbmFtZWQgaW1wb3J0cy4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBnZXRDb21wb25lbnROYW1lKG93bmVyLnR5cGUpIDogbnVsbDtcblxuICAgICAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBpbmZvICs9ICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0aHJvdyBFcnJvciggXCJFbGVtZW50IHR5cGUgaXMgaW52YWxpZDogZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciBidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlIGNvbXBvbmVudHMpIGJ1dCBnb3Q6IFwiICsgKHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSkgKyBcIi5cIiArIGluZm8gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihmaWJlclRhZywgcGVuZGluZ1Byb3BzLCBrZXksIG1vZGUpO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IHR5cGU7XG4gIGZpYmVyLnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG5cbiAge1xuICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gb3duZXI7XG4gIH1cblxuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21FbGVtZW50KGVsZW1lbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBvd25lciA9IG51bGw7XG5cbiAge1xuICAgIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcGVuZGluZ1Byb3BzID0gZWxlbWVudC5wcm9wcztcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKHR5cGUsIGtleSwgcGVuZGluZ1Byb3BzLCBvd25lciwgbW9kZSwgbGFuZXMpO1xuXG4gIHtcbiAgICBmaWJlci5fZGVidWdTb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG4gICAgZmliZXIuX2RlYnVnT3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KGVsZW1lbnRzLCBtb2RlLCBsYW5lcywga2V5KSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEZyYWdtZW50LCBlbGVtZW50cywga2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qcm9maWxlcihwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAge1xuICAgIGlmICh0eXBlb2YgcGVuZGluZ1Byb3BzLmlkICE9PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3IoJ1Byb2ZpbGVyIG11c3Qgc3BlY2lmeSBhbiBcImlkXCIgYXMgYSBwcm9wJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoUHJvZmlsZXIsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlIHwgUHJvZmlsZU1vZGUpOyAvLyBUT0RPOiBUaGUgUHJvZmlsZXIgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuICBmaWJlci50eXBlID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcblxuICB7XG4gICAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgICAgZWZmZWN0RHVyYXRpb246IDAsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZpYmVyO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21TdXNwZW5zZShwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VDb21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIFN1c3BlbnNlQ29tcG9uZW50IGZpYmVyIHNob3VsZG4ndCBoYXZlIGEgdHlwZS4gSXQgaGFzIGEgdGFnLlxuICAvLyBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkIGluIGdldENvbXBvbmVudE5hbWUgc28gdGhhdCBpdCByZWxpZXMgb24gdGhlIHRhZ1xuICAvLyBpbnN0ZWFkLlxuXG4gIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gIGZpYmVyLmxhbmVzID0gbGFuZXM7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVN1c3BlbnNlTGlzdChwZW5kaW5nUHJvcHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoU3VzcGVuc2VMaXN0Q29tcG9uZW50LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG5cbiAge1xuICAgIC8vIFRPRE86IFRoZSBTdXNwZW5zZUxpc3RDb21wb25lbnQgZmliZXIgc2hvdWxkbid0IGhhdmUgYSB0eXBlLiBJdCBoYXMgYSB0YWcuXG4gICAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgICAvLyBpbnN0ZWFkLlxuICAgIGZpYmVyLnR5cGUgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG4gIH1cblxuICBmaWJlci5lbGVtZW50VHlwZSA9IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tT2Zmc2NyZWVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihPZmZzY3JlZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIE9mZnNjcmVlbkNvbXBvbmVudCBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX09GRlNDUkVFTl9UWVBFO1xuICB9XG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSBSRUFDVF9PRkZTQ1JFRU5fVFlQRTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tTGVnYWN5SGlkZGVuKHBlbmRpbmdQcm9wcywgbW9kZSwgbGFuZXMsIGtleSkge1xuICB2YXIgZmliZXIgPSBjcmVhdGVGaWJlcihMZWdhY3lIaWRkZW5Db21wb25lbnQsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTsgLy8gVE9ETzogVGhlIExlZ2FjeUhpZGRlbiBmaWJlciBzaG91bGRuJ3QgaGF2ZSBhIHR5cGUuIEl0IGhhcyBhIHRhZy5cbiAgLy8gVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBnZXRDb21wb25lbnROYW1lIHNvIHRoYXQgaXQgcmVsaWVzIG9uIHRoZSB0YWdcbiAgLy8gaW5zdGVhZC5cblxuICB7XG4gICAgZmliZXIudHlwZSA9IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRTtcbiAgfVxuXG4gIGZpYmVyLmVsZW1lbnRUeXBlID0gUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFO1xuICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICByZXR1cm4gZmliZXI7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RUZXh0LCBjb250ZW50LCBudWxsLCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgcmV0dXJuIGZpYmVyO1xufVxuZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tSG9zdEluc3RhbmNlRm9yRGVsZXRpb24oKSB7XG4gIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKEhvc3RDb21wb25lbnQsIG51bGwsIG51bGwsIE5vTW9kZSk7IC8vIFRPRE86IFRoZXNlIHNob3VsZCBub3QgbmVlZCBhIHR5cGUuXG5cbiAgZmliZXIuZWxlbWVudFR5cGUgPSAnREVMRVRFRCc7XG4gIGZpYmVyLnR5cGUgPSAnREVMRVRFRCc7XG4gIHJldHVybiBmaWJlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUZpYmVyRnJvbVBvcnRhbChwb3J0YWwsIG1vZGUsIGxhbmVzKSB7XG4gIHZhciBwZW5kaW5nUHJvcHMgPSBwb3J0YWwuY2hpbGRyZW4gIT09IG51bGwgPyBwb3J0YWwuY2hpbGRyZW4gOiBbXTtcbiAgdmFyIGZpYmVyID0gY3JlYXRlRmliZXIoSG9zdFBvcnRhbCwgcGVuZGluZ1Byb3BzLCBwb3J0YWwua2V5LCBtb2RlKTtcbiAgZmliZXIubGFuZXMgPSBsYW5lcztcbiAgZmliZXIuc3RhdGVOb2RlID0ge1xuICAgIGNvbnRhaW5lckluZm86IHBvcnRhbC5jb250YWluZXJJbmZvLFxuICAgIHBlbmRpbmdDaGlsZHJlbjogbnVsbCxcbiAgICAvLyBVc2VkIGJ5IHBlcnNpc3RlbnQgdXBkYXRlc1xuICAgIGltcGxlbWVudGF0aW9uOiBwb3J0YWwuaW1wbGVtZW50YXRpb25cbiAgfTtcbiAgcmV0dXJuIGZpYmVyO1xufSAvLyBVc2VkIGZvciBzdGFzaGluZyBXSVAgcHJvcGVydGllcyB0byByZXBsYXkgZmFpbGVkIHdvcmsgaW4gREVWLlxuXG5mdW5jdGlvbiBhc3NpZ25GaWJlclByb3BlcnRpZXNJbkRFVih0YXJnZXQsIHNvdXJjZSkge1xuICBpZiAodGFyZ2V0ID09PSBudWxsKSB7XG4gICAgLy8gVGhpcyBGaWJlcidzIGluaXRpYWwgcHJvcGVydGllcyB3aWxsIGFsd2F5cyBiZSBvdmVyd3JpdHRlbi5cbiAgICAvLyBXZSBvbmx5IHVzZSBhIEZpYmVyIHRvIGVuc3VyZSB0aGUgc2FtZSBoaWRkZW4gY2xhc3Mgc28gREVWIGlzbid0IHNsb3cuXG4gICAgdGFyZ2V0ID0gY3JlYXRlRmliZXIoSW5kZXRlcm1pbmF0ZUNvbXBvbmVudCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgfSAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgd3JpdHRlbiBhcyBhIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMuXG4gIC8vIFdlIHRyaWVkIHRvIHVzZSBPYmplY3QuYXNzaWduKCkgaW5zdGVhZCBidXQgdGhpcyBpcyBjYWxsZWQgaW5cbiAgLy8gdGhlIGhvdHRlc3QgcGF0aCwgYW5kIE9iamVjdC5hc3NpZ24oKSB3YXMgdG9vIHNsb3c6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTI1MDJcbiAgLy8gVGhpcyBjb2RlIGlzIERFVi1vbmx5IHNvIHNpemUgaXMgbm90IGEgY29uY2Vybi5cblxuXG4gIHRhcmdldC50YWcgPSBzb3VyY2UudGFnO1xuICB0YXJnZXQua2V5ID0gc291cmNlLmtleTtcbiAgdGFyZ2V0LmVsZW1lbnRUeXBlID0gc291cmNlLmVsZW1lbnRUeXBlO1xuICB0YXJnZXQudHlwZSA9IHNvdXJjZS50eXBlO1xuICB0YXJnZXQuc3RhdGVOb2RlID0gc291cmNlLnN0YXRlTm9kZTtcbiAgdGFyZ2V0LnJldHVybiA9IHNvdXJjZS5yZXR1cm47XG4gIHRhcmdldC5jaGlsZCA9IHNvdXJjZS5jaGlsZDtcbiAgdGFyZ2V0LnNpYmxpbmcgPSBzb3VyY2Uuc2libGluZztcbiAgdGFyZ2V0LmluZGV4ID0gc291cmNlLmluZGV4O1xuICB0YXJnZXQucmVmID0gc291cmNlLnJlZjtcbiAgdGFyZ2V0LnBlbmRpbmdQcm9wcyA9IHNvdXJjZS5wZW5kaW5nUHJvcHM7XG4gIHRhcmdldC5tZW1vaXplZFByb3BzID0gc291cmNlLm1lbW9pemVkUHJvcHM7XG4gIHRhcmdldC51cGRhdGVRdWV1ZSA9IHNvdXJjZS51cGRhdGVRdWV1ZTtcbiAgdGFyZ2V0Lm1lbW9pemVkU3RhdGUgPSBzb3VyY2UubWVtb2l6ZWRTdGF0ZTtcbiAgdGFyZ2V0LmRlcGVuZGVuY2llcyA9IHNvdXJjZS5kZXBlbmRlbmNpZXM7XG4gIHRhcmdldC5tb2RlID0gc291cmNlLm1vZGU7XG4gIHRhcmdldC5mbGFncyA9IHNvdXJjZS5mbGFncztcbiAgdGFyZ2V0Lm5leHRFZmZlY3QgPSBzb3VyY2UubmV4dEVmZmVjdDtcbiAgdGFyZ2V0LmZpcnN0RWZmZWN0ID0gc291cmNlLmZpcnN0RWZmZWN0O1xuICB0YXJnZXQubGFzdEVmZmVjdCA9IHNvdXJjZS5sYXN0RWZmZWN0O1xuICB0YXJnZXQubGFuZXMgPSBzb3VyY2UubGFuZXM7XG4gIHRhcmdldC5jaGlsZExhbmVzID0gc291cmNlLmNoaWxkTGFuZXM7XG4gIHRhcmdldC5hbHRlcm5hdGUgPSBzb3VyY2UuYWx0ZXJuYXRlO1xuXG4gIHtcbiAgICB0YXJnZXQuYWN0dWFsRHVyYXRpb24gPSBzb3VyY2UuYWN0dWFsRHVyYXRpb247XG4gICAgdGFyZ2V0LmFjdHVhbFN0YXJ0VGltZSA9IHNvdXJjZS5hY3R1YWxTdGFydFRpbWU7XG4gICAgdGFyZ2V0LnNlbGZCYXNlRHVyYXRpb24gPSBzb3VyY2Uuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICB0YXJnZXQudHJlZUJhc2VEdXJhdGlvbiA9IHNvdXJjZS50cmVlQmFzZUR1cmF0aW9uO1xuICB9XG5cbiAgdGFyZ2V0Ll9kZWJ1Z0lEID0gc291cmNlLl9kZWJ1Z0lEO1xuICB0YXJnZXQuX2RlYnVnU291cmNlID0gc291cmNlLl9kZWJ1Z1NvdXJjZTtcbiAgdGFyZ2V0Ll9kZWJ1Z093bmVyID0gc291cmNlLl9kZWJ1Z093bmVyO1xuICB0YXJnZXQuX2RlYnVnTmVlZHNSZW1vdW50ID0gc291cmNlLl9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgdGFyZ2V0Ll9kZWJ1Z0hvb2tUeXBlcyA9IHNvdXJjZS5fZGVidWdIb29rVHlwZXM7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIEZpYmVyUm9vdE5vZGUoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlKSB7XG4gIHRoaXMudGFnID0gdGFnO1xuICB0aGlzLmNvbnRhaW5lckluZm8gPSBjb250YWluZXJJbmZvO1xuICB0aGlzLnBlbmRpbmdDaGlsZHJlbiA9IG51bGw7XG4gIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIHRoaXMucGluZ0NhY2hlID0gbnVsbDtcbiAgdGhpcy5maW5pc2hlZFdvcmsgPSBudWxsO1xuICB0aGlzLnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMucGVuZGluZ0NvbnRleHQgPSBudWxsO1xuICB0aGlzLmh5ZHJhdGUgPSBoeWRyYXRlO1xuICB0aGlzLmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IE5vTGFuZVByaW9yaXR5O1xuICB0aGlzLmV2ZW50VGltZXMgPSBjcmVhdGVMYW5lTWFwKE5vTGFuZXMpO1xuICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoTm9UaW1lc3RhbXApO1xuICB0aGlzLnBlbmRpbmdMYW5lcyA9IE5vTGFuZXM7XG4gIHRoaXMuc3VzcGVuZGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLnBpbmdlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5leHBpcmVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLm11dGFibGVSZWFkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmZpbmlzaGVkTGFuZXMgPSBOb0xhbmVzO1xuICB0aGlzLmVudGFuZ2xlZExhbmVzID0gTm9MYW5lcztcbiAgdGhpcy5lbnRhbmdsZW1lbnRzID0gY3JlYXRlTGFuZU1hcChOb0xhbmVzKTtcblxuICB7XG4gICAgdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICB0aGlzLmludGVyYWN0aW9uVGhyZWFkSUQgPSB0cmFjaW5nLnVuc3RhYmxlX2dldFRocmVhZElEKCk7XG4gICAgdGhpcy5tZW1vaXplZEludGVyYWN0aW9ucyA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLnBlbmRpbmdJbnRlcmFjdGlvbk1hcCA9IG5ldyBNYXAoKTtcbiAgfVxuXG4gIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSBCbG9ja2luZ1Jvb3Q6XG4gICAgICAgIHRoaXMuX2RlYnVnUm9vdFR5cGUgPSAnY3JlYXRlQmxvY2tpbmdSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBDb25jdXJyZW50Um9vdDpcbiAgICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9ICdjcmVhdGVSb290KCknO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBMZWdhY3lSb290OlxuICAgICAgICB0aGlzLl9kZWJ1Z1Jvb3RUeXBlID0gJ2NyZWF0ZUxlZ2FjeVJvb3QoKSc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVGaWJlclJvb3QoY29udGFpbmVySW5mbywgdGFnLCBoeWRyYXRlLCBoeWRyYXRpb25DYWxsYmFja3MpIHtcbiAgdmFyIHJvb3QgPSBuZXcgRmliZXJSb290Tm9kZShjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUpO1xuICAvLyBzdGF0ZU5vZGUgaXMgYW55LlxuXG5cbiAgdmFyIHVuaW5pdGlhbGl6ZWRGaWJlciA9IGNyZWF0ZUhvc3RSb290RmliZXIodGFnKTtcbiAgcm9vdC5jdXJyZW50ID0gdW5pbml0aWFsaXplZEZpYmVyO1xuICB1bmluaXRpYWxpemVkRmliZXIuc3RhdGVOb2RlID0gcm9vdDtcbiAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKHVuaW5pdGlhbGl6ZWRGaWJlcik7XG4gIHJldHVybiByb290O1xufVxuXG4vLyBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdmVyc2lvbiB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nIG1hdGNoZXMgdGhlIG9uZVxuLy8gdGhhdCBpcyBldmVudHVhbGx5IHJlYWQgZHVyaW5nIGh5ZHJhdGlvbi5cbi8vIElmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlcmUncyBhIHBvdGVudGlhbCB0ZWFyIGFuZCBhIGZ1bGwgZGVvcHQgcmVuZGVyIGlzIHJlcXVpcmVkLlxuXG5mdW5jdGlvbiByZWdpc3Rlck11dGFibGVTb3VyY2VGb3JIeWRyYXRpb24ocm9vdCwgbXV0YWJsZVNvdXJjZSkge1xuICB2YXIgZ2V0VmVyc2lvbiA9IG11dGFibGVTb3VyY2UuX2dldFZlcnNpb247XG4gIHZhciB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtdXRhYmxlU291cmNlLl9zb3VyY2UpOyAvLyBUT0RPIENsZWFyIHRoaXMgZGF0YSBvbmNlIGFsbCBwZW5kaW5nIGh5ZHJhdGlvbiB3b3JrIGlzIGZpbmlzaGVkLlxuICAvLyBSZXRhaW5pbmcgaXQgZm9yZXZlciBtYXkgaW50ZXJmZXJlIHdpdGggR0MuXG5cbiAgaWYgKHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YSA9PSBudWxsKSB7XG4gICAgcm9vdC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhID0gW211dGFibGVTb3VyY2UsIHZlcnNpb25dO1xuICB9IGVsc2Uge1xuICAgIHJvb3QubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG11dGFibGVTb3VyY2UsIHZlcnNpb24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBvcnRhbChjaGlsZHJlbiwgY29udGFpbmVySW5mbywgLy8gVE9ETzogZmlndXJlIG91dCB0aGUgQVBJIGZvciBjcm9zcy1yZW5kZXJlciBpbXBsZW1lbnRhdGlvbi5cbmltcGxlbWVudGF0aW9uKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IG51bGw7XG4gIHJldHVybiB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IFBvcnRhbFxuICAgICQkdHlwZW9mOiBSRUFDVF9QT1JUQUxfVFlQRSxcbiAgICBrZXk6IGtleSA9PSBudWxsID8gbnVsbCA6ICcnICsga2V5LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBjb250YWluZXJJbmZvOiBjb250YWluZXJJbmZvLFxuICAgIGltcGxlbWVudGF0aW9uOiBpbXBsZW1lbnRhdGlvblxuICB9O1xufVxuXG52YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcztcbnZhciBkaWRXYXJuQWJvdXRGaW5kTm9kZUluU3RyaWN0TW9kZTtcblxue1xuICBkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gZmFsc2U7XG4gIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlID0ge307XG59XG5cbmZ1bmN0aW9uIGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCkge1xuICBpZiAoIXBhcmVudENvbXBvbmVudCkge1xuICAgIHJldHVybiBlbXB0eUNvbnRleHRPYmplY3Q7XG4gIH1cblxuICB2YXIgZmliZXIgPSBnZXQocGFyZW50Q29tcG9uZW50KTtcbiAgdmFyIHBhcmVudENvbnRleHQgPSBmaW5kQ3VycmVudFVubWFza2VkQ29udGV4dChmaWJlcik7XG5cbiAgaWYgKGZpYmVyLnRhZyA9PT0gQ2xhc3NDb21wb25lbnQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gZmliZXIudHlwZTtcblxuICAgIGlmIChpc0NvbnRleHRQcm92aWRlcihDb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzc0NoaWxkQ29udGV4dChmaWJlciwgQ29tcG9uZW50LCBwYXJlbnRDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFyZW50Q29udGV4dDtcbn1cblxuZnVuY3Rpb24gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudCwgbWV0aG9kTmFtZSkge1xuICB7XG4gICAgdmFyIGZpYmVyID0gZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoZmliZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvciggXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArIE9iamVjdC5rZXlzKGNvbXBvbmVudCkgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaG9zdEZpYmVyID0gZmluZEN1cnJlbnRIb3N0RmliZXIoZmliZXIpO1xuXG4gICAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKGhvc3RGaWJlci5tb2RlICYgU3RyaWN0TW9kZSkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lKGZpYmVyLnR5cGUpIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdKSB7XG4gICAgICAgIGRpZFdhcm5BYm91dEZpbmROb2RlSW5TdHJpY3RNb2RlW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByZXZpb3VzRmliZXIgPSBjdXJyZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc2V0Q3VycmVudEZpYmVyKGhvc3RGaWJlcik7XG5cbiAgICAgICAgICBpZiAoZmliZXIubW9kZSAmIFN0cmljdE1vZGUpIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCBpcyBpbnNpZGUgU3RyaWN0TW9kZS4gJyArICdJbnN0ZWFkLCBhZGQgYSByZWYgZGlyZWN0bHkgdG8gdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gcmVmZXJlbmNlLiAnICsgJ0xlYXJuIG1vcmUgYWJvdXQgdXNpbmcgcmVmcyBzYWZlbHkgaGVyZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3RyaWN0LW1vZGUtZmluZC1ub2RlJywgbWV0aG9kTmFtZSwgbWV0aG9kTmFtZSwgY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCclcyBpcyBkZXByZWNhdGVkIGluIFN0cmljdE1vZGUuICcgKyAnJXMgd2FzIHBhc3NlZCBhbiBpbnN0YW5jZSBvZiAlcyB3aGljaCByZW5kZXJzIFN0cmljdE1vZGUgY2hpbGRyZW4uICcgKyAnSW5zdGVhZCwgYWRkIGEgcmVmIGRpcmVjdGx5IHRvIHRoZSBlbGVtZW50IHlvdSB3YW50IHRvIHJlZmVyZW5jZS4gJyArICdMZWFybiBtb3JlIGFib3V0IHVzaW5nIHJlZnMgc2FmZWx5IGhlcmU6ICcgKyAnaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3N0cmljdC1tb2RlLWZpbmQtbm9kZScsIG1ldGhvZE5hbWUsIG1ldGhvZE5hbWUsIGNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAvLyBJZGVhbGx5IHRoaXMgc2hvdWxkIHJlc2V0IHRvIHByZXZpb3VzIGJ1dCB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgaW5cbiAgICAgICAgICAvLyByZW5kZXIgYW5kIHRoZXJlJ3MgYW5vdGhlciB3YXJuaW5nIGZvciB0aGF0IGFueXdheS5cbiAgICAgICAgICBpZiAocHJldmlvdXNGaWJlcikge1xuICAgICAgICAgICAgc2V0Q3VycmVudEZpYmVyKHByZXZpb3VzRmliZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNldEN1cnJlbnRGaWJlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lcihjb250YWluZXJJbmZvLCB0YWcsIGh5ZHJhdGUsIGh5ZHJhdGlvbkNhbGxiYWNrcykge1xuICByZXR1cm4gY3JlYXRlRmliZXJSb290KGNvbnRhaW5lckluZm8sIHRhZywgaHlkcmF0ZSk7XG59XG5mdW5jdGlvbiB1cGRhdGVDb250YWluZXIoZWxlbWVudCwgY29udGFpbmVyLCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKSB7XG4gIHtcbiAgICBvblNjaGVkdWxlUm9vdChjb250YWluZXIsIGVsZW1lbnQpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnQkMSA9IGNvbnRhaW5lci5jdXJyZW50O1xuICB2YXIgZXZlbnRUaW1lID0gcmVxdWVzdEV2ZW50VGltZSgpO1xuXG4gIHtcbiAgICAvLyAkRmxvd0V4cGVjdGVkRXJyb3IgLSBqZXN0IGlzbid0IGEgZ2xvYmFsLCBhbmQgaXNuJ3QgcmVjb2duaXplZCBvdXRzaWRlIG9mIHRlc3RzXG4gICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgamVzdCkge1xuICAgICAgd2FybklmVW5tb2NrZWRTY2hlZHVsZXIoY3VycmVudCQxKTtcbiAgICAgIHdhcm5JZk5vdFNjb3BlZFdpdGhNYXRjaGluZ0FjdChjdXJyZW50JDEpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoY3VycmVudCQxKTtcblxuICB2YXIgY29udGV4dCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG5cbiAgaWYgKGNvbnRhaW5lci5jb250ZXh0ID09PSBudWxsKSB7XG4gICAgY29udGFpbmVyLmNvbnRleHQgPSBjb250ZXh0O1xuICB9IGVsc2Uge1xuICAgIGNvbnRhaW5lci5wZW5kaW5nQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICB7XG4gICAgaWYgKGlzUmVuZGVyaW5nICYmIGN1cnJlbnQgIT09IG51bGwgJiYgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMpIHtcbiAgICAgIGRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgICBlcnJvcignUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7ICcgKyAndHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSByZW5kZXIgaXMgbm90IGFsbG93ZWQuICcgKyAnSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG4nICsgJ0NoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIGdldENvbXBvbmVudE5hbWUoY3VycmVudC50eXBlKSB8fCAnVW5rbm93bicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1cGRhdGUgPSBjcmVhdGVVcGRhdGUoZXZlbnRUaW1lLCBsYW5lKTsgLy8gQ2F1dGlvbjogUmVhY3QgRGV2VG9vbHMgY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcm9wZXJ0eVxuICAvLyBiZWluZyBjYWxsZWQgXCJlbGVtZW50XCIuXG5cbiAgdXBkYXRlLnBheWxvYWQgPSB7XG4gICAgZWxlbWVudDogZWxlbWVudFxuICB9O1xuICBjYWxsYmFjayA9IGNhbGxiYWNrID09PSB1bmRlZmluZWQgPyBudWxsIDogY2FsbGJhY2s7XG5cbiAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAge1xuICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSAnICsgJ2Z1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICBlbnF1ZXVlVXBkYXRlKGN1cnJlbnQkMSwgdXBkYXRlKTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGN1cnJlbnQkMSwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgcmV0dXJuIGxhbmU7XG59XG5mdW5jdGlvbiBnZXRQdWJsaWNSb290SW5zdGFuY2UoY29udGFpbmVyKSB7XG4gIHZhciBjb250YWluZXJGaWJlciA9IGNvbnRhaW5lci5jdXJyZW50O1xuXG4gIGlmICghY29udGFpbmVyRmliZXIuY2hpbGQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAoY29udGFpbmVyRmliZXIuY2hpbGQudGFnKSB7XG4gICAgY2FzZSBIb3N0Q29tcG9uZW50OlxuICAgICAgcmV0dXJuIGdldFB1YmxpY0luc3RhbmNlKGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGNvbnRhaW5lckZpYmVyLmNoaWxkLnN0YXRlTm9kZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKSB7XG4gIHZhciBzdXNwZW5zZVN0YXRlID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICBpZiAoc3VzcGVuc2VTdGF0ZSAhPT0gbnVsbCAmJiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQgIT09IG51bGwpIHtcbiAgICBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGhpZ2hlclByaW9yaXR5TGFuZShzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSwgcmV0cnlMYW5lKTtcbiAgfVxufSAvLyBJbmNyZWFzZXMgdGhlIHByaW9yaXR5IG9mIHRoZW5uYWJsZXMgd2hlbiB0aGV5IHJlc29sdmUgd2l0aGluIHRoaXMgYm91bmRhcnkuXG5cblxuZnVuY3Rpb24gbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIHJldHJ5TGFuZSkge1xuICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcblxuICBpZiAoYWx0ZXJuYXRlKSB7XG4gICAgbWFya1JldHJ5TGFuZUltcGwoYWx0ZXJuYXRlLCByZXRyeUxhbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gSW5wdXREaXNjcmV0ZUh5ZHJhdGlvbkxhbmU7XG4gIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgbGFuZSwgZXZlbnRUaW1lKTtcbiAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIGxhbmUpO1xufVxuZnVuY3Rpb24gYXR0ZW1wdENvbnRpbnVvdXNIeWRyYXRpb24kMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgYW5kIHRoZXkgc2hvdWxkIG5vdCBzdXNwZW5kIG9uIEkvTyxcbiAgICAvLyBzaW5jZSB5b3UgaGF2ZSB0byB3cmFwIGFueXRoaW5nIHRoYXQgbWlnaHQgc3VzcGVuZCBpblxuICAgIC8vIFN1c3BlbnNlLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gU2VsZWN0aXZlSHlkcmF0aW9uTGFuZTtcbiAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBsYW5lLCBldmVudFRpbWUpO1xuICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG59XG5mdW5jdGlvbiBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMShmaWJlcikge1xuICBpZiAoZmliZXIudGFnICE9PSBTdXNwZW5zZUNvbXBvbmVudCkge1xuICAgIC8vIFdlIGlnbm9yZSBIb3N0Um9vdHMgaGVyZSBiZWNhdXNlIHdlIGNhbid0IGluY3JlYXNlXG4gICAgLy8gdGhlaXIgcHJpb3JpdHkgb3RoZXIgdGhhbiBzeW5jaHJvbm91c2x5IGZsdXNoIGl0LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBldmVudFRpbWUgPSByZXF1ZXN0RXZlbnRUaW1lKCk7XG4gIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpO1xuICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIGxhbmUsIGV2ZW50VGltZSk7XG4gIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCBsYW5lKTtcbn1cbmZ1bmN0aW9uIHJ1bldpdGhQcmlvcml0eSQyKHByaW9yaXR5LCBmbikge1xuXG4gIHRyeSB7XG4gICAgc2V0Q3VycmVudFVwZGF0ZUxhbmVQcmlvcml0eShwcmlvcml0eSk7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gIH1cbn1cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcldpdGhOb1BvcnRhbHMoZmliZXIpO1xuXG4gIGlmIChob3N0RmliZXIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChob3N0RmliZXIudGFnID09PSBGdW5kYW1lbnRhbENvbXBvbmVudCkge1xuICAgIHJldHVybiBob3N0RmliZXIuc3RhdGVOb2RlLmluc3RhbmNlO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbnZhciBzaG91bGRTdXNwZW5kSW1wbCA9IGZ1bmN0aW9uIChmaWJlcikge1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBzaG91bGRTdXNwZW5kKGZpYmVyKSB7XG4gIHJldHVybiBzaG91bGRTdXNwZW5kSW1wbChmaWJlcik7XG59XG52YXIgb3ZlcnJpZGVIb29rU3RhdGUgPSBudWxsO1xudmFyIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzID0gbnVsbDtcbnZhciBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IG51bGw7XG52YXIgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsO1xudmFyIHNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbnZhciBzZXRTdXNwZW5zZUhhbmRsZXIgPSBudWxsO1xuXG57XG4gIHZhciBjb3B5V2l0aERlbGV0ZUltcGwgPSBmdW5jdGlvbiAob2JqLCBwYXRoLCBpbmRleCkge1xuICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IHBhdGgubGVuZ3RoKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShrZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRba2V5XTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfSAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cblxuICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoRGVsZXRlSW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhEZWxldGUgPSBmdW5jdGlvbiAob2JqLCBwYXRoKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoRGVsZXRlSW1wbChvYmosIHBhdGgsIDApO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFJlbmFtZUltcGwgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCBpbmRleCkge1xuICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XTtcbiAgICB2YXIgdXBkYXRlZCA9IEFycmF5LmlzQXJyYXkob2JqKSA/IG9iai5zbGljZSgpIDogX2Fzc2lnbih7fSwgb2JqKTtcblxuICAgIGlmIChpbmRleCArIDEgPT09IG9sZFBhdGgubGVuZ3RoKSB7XG4gICAgICB2YXIgbmV3S2V5ID0gbmV3UGF0aFtpbmRleF07IC8vICRGbG93Rml4TWUgbnVtYmVyIG9yIHN0cmluZyBpcyBmaW5lIGhlcmVcblxuICAgICAgdXBkYXRlZFtuZXdLZXldID0gdXBkYXRlZFtvbGRLZXldO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh1cGRhdGVkKSkge1xuICAgICAgICB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbb2xkS2V5XTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJEZsb3dGaXhNZSBudW1iZXIgb3Igc3RyaW5nIGlzIGZpbmUgaGVyZVxuICAgICAgdXBkYXRlZFtvbGRLZXldID0gY29weVdpdGhSZW5hbWVJbXBsKCAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG4gICAgICBvYmpbb2xkS2V5XSwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfTtcblxuICB2YXIgY29weVdpdGhSZW5hbWUgPSBmdW5jdGlvbiAob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgaWYgKG9sZFBhdGgubGVuZ3RoICE9PSBuZXdQYXRoLmxlbmd0aCkge1xuICAgICAgd2FybignY29weVdpdGhSZW5hbWUoKSBleHBlY3RzIHBhdGhzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICB3YXJuKCdjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXknKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgfTtcblxuICB2YXIgY29weVdpdGhTZXRJbXBsID0gZnVuY3Rpb24gKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaWYgKGluZGV4ID49IHBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdO1xuICAgIHZhciB1cGRhdGVkID0gQXJyYXkuaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBfYXNzaWduKHt9LCBvYmopOyAvLyAkRmxvd0ZpeE1lIG51bWJlciBvciBzdHJpbmcgaXMgZmluZSBoZXJlXG5cbiAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aFNldEltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSwgdmFsdWUpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9O1xuXG4gIHZhciBjb3B5V2l0aFNldCA9IGZ1bmN0aW9uIChvYmosIHBhdGgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIGNvcHlXaXRoU2V0SW1wbChvYmosIHBhdGgsIDAsIHZhbHVlKTtcbiAgfTtcblxuICB2YXIgZmluZEhvb2sgPSBmdW5jdGlvbiAoZmliZXIsIGlkKSB7XG4gICAgLy8gRm9yIG5vdywgdGhlIFwiaWRcIiBvZiBzdGF0ZWZ1bCBob29rcyBpcyBqdXN0IHRoZSBzdGF0ZWZ1bCBob29rIGluZGV4LlxuICAgIC8vIFRoaXMgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlIHdpdGggZS5nLiBuZXN0ZWQgaG9va3MuXG4gICAgdmFyIGN1cnJlbnRIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcblxuICAgIHdoaWxlIChjdXJyZW50SG9vayAhPT0gbnVsbCAmJiBpZCA+IDApIHtcbiAgICAgIGN1cnJlbnRIb29rID0gY3VycmVudEhvb2submV4dDtcbiAgICAgIGlkLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRIb29rO1xuICB9OyAvLyBTdXBwb3J0IERldlRvb2xzIGVkaXRhYmxlIHZhbHVlcyBmb3IgdXNlU3RhdGUgYW5kIHVzZVJlZHVjZXIuXG5cblxuICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoU2V0KGhvb2subWVtb2l6ZWRTdGF0ZSwgcGF0aCwgdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlOyAvLyBXZSBhcmVuJ3QgYWN0dWFsbHkgYWRkaW5nIGFuIHVwZGF0ZSB0byB0aGUgcXVldWUsXG4gICAgICAvLyBiZWNhdXNlIHRoZXJlIGlzIG5vIHVwZGF0ZSB3ZSBjYW4gYWRkIGZvciB1c2VSZWR1Y2VyIGhvb2tzIHRoYXQgd29uJ3QgdHJpZ2dlciBhbiBlcnJvci5cbiAgICAgIC8vIChUaGVyZSdzIG5vIGFwcHJvcHJpYXRlIGFjdGlvbiB0eXBlIGZvciBEZXZUb29scyBvdmVycmlkZXMuKVxuICAgICAgLy8gQXMgYSByZXN1bHQgdGhvdWdoLCBSZWFjdCB3aWxsIHNlZSB0aGUgc2NoZWR1bGVkIHVwZGF0ZSBhcyBhIG5vb3AgYW5kIGJhaWxvdXQuXG4gICAgICAvLyBTaGFsbG93IGNsb25pbmcgcHJvcHMgd29ya3MgYXMgYSB3b3JrYXJvdW5kIGZvciBub3cgdG8gYnlwYXNzIHRoZSBiYWlsb3V0IGNoZWNrLlxuXG4gICAgICBmaWJlci5tZW1vaXplZFByb3BzID0gX2Fzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcyk7XG4gICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gICAgfVxuICB9O1xuXG4gIG92ZXJyaWRlSG9va1N0YXRlRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgpIHtcbiAgICB2YXIgaG9vayA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG5cbiAgICBpZiAoaG9vayAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5ld1N0YXRlID0gY29weVdpdGhEZWxldGUoaG9vay5tZW1vaXplZFN0YXRlLCBwYXRoKTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5ld1N0YXRlO1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBuZXdTdGF0ZTsgLy8gV2UgYXJlbid0IGFjdHVhbGx5IGFkZGluZyBhbiB1cGRhdGUgdG8gdGhlIHF1ZXVlLFxuICAgICAgLy8gYmVjYXVzZSB0aGVyZSBpcyBubyB1cGRhdGUgd2UgY2FuIGFkZCBmb3IgdXNlUmVkdWNlciBob29rcyB0aGF0IHdvbid0IHRyaWdnZXIgYW4gZXJyb3IuXG4gICAgICAvLyAoVGhlcmUncyBubyBhcHByb3ByaWF0ZSBhY3Rpb24gdHlwZSBmb3IgRGV2VG9vbHMgb3ZlcnJpZGVzLilcbiAgICAgIC8vIEFzIGEgcmVzdWx0IHRob3VnaCwgUmVhY3Qgd2lsbCBzZWUgdGhlIHNjaGVkdWxlZCB1cGRhdGUgYXMgYSBub29wIGFuZCBiYWlsb3V0LlxuICAgICAgLy8gU2hhbGxvdyBjbG9uaW5nIHByb3BzIHdvcmtzIGFzIGEgd29ya2Fyb3VuZCBmb3Igbm93IHRvIGJ5cGFzcyB0aGUgYmFpbG91dCBjaGVjay5cblxuICAgICAgZmliZXIubWVtb2l6ZWRQcm9wcyA9IF9hc3NpZ24oe30sIGZpYmVyLm1lbW9pemVkUHJvcHMpO1xuICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIGlkLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgdmFyIGhvb2sgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuXG4gICAgaWYgKGhvb2sgIT09IG51bGwpIHtcbiAgICAgIHZhciBuZXdTdGF0ZSA9IGNvcHlXaXRoUmVuYW1lKGhvb2subWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIGhvb2suYmFzZVN0YXRlID0gbmV3U3RhdGU7IC8vIFdlIGFyZW4ndCBhY3R1YWxseSBhZGRpbmcgYW4gdXBkYXRlIHRvIHRoZSBxdWV1ZSxcbiAgICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMgbm8gdXBkYXRlIHdlIGNhbiBhZGQgZm9yIHVzZVJlZHVjZXIgaG9va3MgdGhhdCB3b24ndCB0cmlnZ2VyIGFuIGVycm9yLlxuICAgICAgLy8gKFRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgYWN0aW9uIHR5cGUgZm9yIERldlRvb2xzIG92ZXJyaWRlcy4pXG4gICAgICAvLyBBcyBhIHJlc3VsdCB0aG91Z2gsIFJlYWN0IHdpbGwgc2VlIHRoZSBzY2hlZHVsZWQgdXBkYXRlIGFzIGEgbm9vcCBhbmQgYmFpbG91dC5cbiAgICAgIC8vIFNoYWxsb3cgY2xvbmluZyBwcm9wcyB3b3JrcyBhcyBhIHdvcmthcm91bmQgZm9yIG5vdyB0byBieXBhc3MgdGhlIGJhaWxvdXQgY2hlY2suXG5cbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBfYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKTtcbiAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgICB9XG4gIH07IC8vIFN1cHBvcnQgRGV2VG9vbHMgcHJvcHMgZm9yIGZ1bmN0aW9uIGNvbXBvbmVudHMsIGZvcndhcmRSZWYsIG1lbW8sIGhvc3QgY29tcG9uZW50cywgZXRjLlxuXG5cbiAgb3ZlcnJpZGVQcm9wcyA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCwgdmFsdWUpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFNldChmaWJlci5tZW1vaXplZFByb3BzLCBwYXRoLCB2YWx1ZSk7XG5cbiAgICBpZiAoZmliZXIuYWx0ZXJuYXRlKSB7XG4gICAgICBmaWJlci5hbHRlcm5hdGUucGVuZGluZ1Byb3BzID0gZmliZXIucGVuZGluZ1Byb3BzO1xuICAgIH1cblxuICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihmaWJlciwgU3luY0xhbmUsIE5vVGltZXN0YW1wKTtcbiAgfTtcblxuICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgcGF0aCkge1xuICAgIGZpYmVyLnBlbmRpbmdQcm9wcyA9IGNvcHlXaXRoRGVsZXRlKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgpO1xuXG4gICAgaWYgKGZpYmVyLmFsdGVybmF0ZSkge1xuICAgICAgZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcztcbiAgICB9XG5cbiAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoZmliZXIsIFN5bmNMYW5lLCBOb1RpbWVzdGFtcCk7XG4gIH07XG5cbiAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBmdW5jdGlvbiAoZmliZXIsIG9sZFBhdGgsIG5ld1BhdGgpIHtcbiAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aFJlbmFtZShmaWJlci5tZW1vaXplZFByb3BzLCBvbGRQYXRoLCBuZXdQYXRoKTtcblxuICAgIGlmIChmaWJlci5hbHRlcm5hdGUpIHtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHM7XG4gICAgfVxuXG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNjaGVkdWxlVXBkYXRlID0gZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGZpYmVyLCBTeW5jTGFuZSwgTm9UaW1lc3RhbXApO1xuICB9O1xuXG4gIHNldFN1c3BlbnNlSGFuZGxlciA9IGZ1bmN0aW9uIChuZXdTaG91bGRTdXNwZW5kSW1wbCkge1xuICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyKGZpYmVyKSB7XG4gIHZhciBob3N0RmliZXIgPSBmaW5kQ3VycmVudEhvc3RGaWJlcihmaWJlcik7XG5cbiAgaWYgKGhvc3RGaWJlciA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhvc3RGaWJlci5zdGF0ZU5vZGU7XG59XG5cbmZ1bmN0aW9uIGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UoaW5zdGFuY2UpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICByZXR1cm4gY3VycmVudDtcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50b0RldlRvb2xzKGRldlRvb2xzQ29uZmlnKSB7XG4gIHZhciBmaW5kRmliZXJCeUhvc3RJbnN0YW5jZSA9IGRldlRvb2xzQ29uZmlnLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlO1xuICB2YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0Q3VycmVudERpc3BhdGNoZXI7XG4gIHJldHVybiBpbmplY3RJbnRlcm5hbHMoe1xuICAgIGJ1bmRsZVR5cGU6IGRldlRvb2xzQ29uZmlnLmJ1bmRsZVR5cGUsXG4gICAgdmVyc2lvbjogZGV2VG9vbHNDb25maWcudmVyc2lvbixcbiAgICByZW5kZXJlclBhY2thZ2VOYW1lOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlclBhY2thZ2VOYW1lLFxuICAgIHJlbmRlcmVyQ29uZmlnOiBkZXZUb29sc0NvbmZpZy5yZW5kZXJlckNvbmZpZyxcbiAgICBvdmVycmlkZUhvb2tTdGF0ZTogb3ZlcnJpZGVIb29rU3RhdGUsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoOiBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wczogb3ZlcnJpZGVQcm9wcyxcbiAgICBvdmVycmlkZVByb3BzRGVsZXRlUGF0aDogb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGgsXG4gICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGg6IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoLFxuICAgIHNldFN1c3BlbnNlSGFuZGxlcjogc2V0U3VzcGVuc2VIYW5kbGVyLFxuICAgIHNjaGVkdWxlVXBkYXRlOiBzY2hlZHVsZVVwZGF0ZSxcbiAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixcbiAgICBmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjogZmluZEhvc3RJbnN0YW5jZUJ5RmliZXIsXG4gICAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlIHx8IGVtcHR5RmluZEZpYmVyQnlIb3N0SW5zdGFuY2UsXG4gICAgLy8gUmVhY3QgUmVmcmVzaFxuICAgIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaDogIGZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaCAsXG4gICAgc2NoZWR1bGVSZWZyZXNoOiAgc2NoZWR1bGVSZWZyZXNoICxcbiAgICBzY2hlZHVsZVJvb3Q6ICBzY2hlZHVsZVJvb3QgLFxuICAgIHNldFJlZnJlc2hIYW5kbGVyOiAgc2V0UmVmcmVzaEhhbmRsZXIgLFxuICAgIC8vIEVuYWJsZXMgRGV2VG9vbHMgdG8gYXBwZW5kIG93bmVyIHN0YWNrcyB0byBlcnJvciBtZXNzYWdlcyBpbiBERVYgbW9kZS5cbiAgICBnZXRDdXJyZW50RmliZXI6ICBnZXRDdXJyZW50RmliZXJGb3JEZXZUb29scyBcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NUm9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgdGhpcy5faW50ZXJuYWxSb290ID0gY3JlYXRlUm9vdEltcGwoY29udGFpbmVyLCBDb25jdXJyZW50Um9vdCwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIFJlYWN0RE9NQmxvY2tpbmdSb290KGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIHRoaXMuX2ludGVybmFsUm9vdCA9IGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKTtcbn1cblxuUmVhY3RET01Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTUJsb2NraW5nUm9vdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuXG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuICcgKyAnVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiBhIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuJyk7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lciA9IHJvb3QuY29udGFpbmVySW5mbztcblxuICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKHJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhlICcgKyAncm9vdCBjb250YWluZXIgd2FzIHJlbW92ZWQgd2l0aG91dCB1c2luZyBSZWFjdC4gVGhpcyBpcyBub3QgJyArICdzdXBwb3J0ZWQgYW5kIHdpbGwgY2F1c2UgZXJyb3JzLiBJbnN0ZWFkLCBjYWxsICcgKyBcInJvb3QudW5tb3VudCgpIHRvIGVtcHR5IGEgcm9vdCdzIGNvbnRhaW5lci5cIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb250YWluZXIoY2hpbGRyZW4sIHJvb3QsIG51bGwsIG51bGwpO1xufTtcblxuUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01CbG9ja2luZ1Jvb3QucHJvdG90eXBlLnVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1swXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ3VubW91bnQoLi4uKTogZG9lcyBub3Qgc3VwcG9ydCBhIGNhbGxiYWNrIGFyZ3VtZW50LiAnICsgJ1RvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLicpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByb290ID0gdGhpcy5faW50ZXJuYWxSb290O1xuICB2YXIgY29udGFpbmVyID0gcm9vdC5jb250YWluZXJJbmZvO1xuICB1cGRhdGVDb250YWluZXIobnVsbCwgcm9vdCwgbnVsbCwgZnVuY3Rpb24gKCkge1xuICAgIHVubWFya0NvbnRhaW5lckFzUm9vdChjb250YWluZXIpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZVJvb3RJbXBsKGNvbnRhaW5lciwgdGFnLCBvcHRpb25zKSB7XG4gIC8vIFRhZyBpcyBlaXRoZXIgTGVnYWN5Um9vdCBvciBDb25jdXJyZW50IFJvb3RcbiAgdmFyIGh5ZHJhdGUgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRlID09PSB0cnVlO1xuICB2YXIgaHlkcmF0aW9uQ2FsbGJhY2tzID0gb3B0aW9ucyAhPSBudWxsICYmIG9wdGlvbnMuaHlkcmF0aW9uT3B0aW9ucyB8fCBudWxsO1xuICB2YXIgbXV0YWJsZVNvdXJjZXMgPSBvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5oeWRyYXRpb25PcHRpb25zLm11dGFibGVTb3VyY2VzIHx8IG51bGw7XG4gIHZhciByb290ID0gY3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lciwgdGFnLCBoeWRyYXRlKTtcbiAgbWFya0NvbnRhaW5lckFzUm9vdChyb290LmN1cnJlbnQsIGNvbnRhaW5lcik7XG4gIHZhciBjb250YWluZXJOb2RlVHlwZSA9IGNvbnRhaW5lci5ub2RlVHlwZTtcblxuICB7XG4gICAgdmFyIHJvb3RDb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSBDT01NRU5UX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcjtcbiAgICBsaXN0ZW5Ub0FsbFN1cHBvcnRlZEV2ZW50cyhyb290Q29udGFpbmVyRWxlbWVudCk7XG4gIH1cblxuICBpZiAobXV0YWJsZVNvdXJjZXMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG11dGFibGVTb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbXV0YWJsZVNvdXJjZSA9IG11dGFibGVTb3VyY2VzW2ldO1xuICAgICAgcmVnaXN0ZXJNdXRhYmxlU291cmNlRm9ySHlkcmF0aW9uKHJvb3QsIG11dGFibGVTb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByb290O1xufVxuZnVuY3Rpb24gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBSZWFjdERPTUJsb2NraW5nUm9vdChjb250YWluZXIsIExlZ2FjeVJvb3QsIG9wdGlvbnMpO1xufVxuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfTk9ERSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAnKSk7XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQzID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgdG9wTGV2ZWxVcGRhdGVXYXJuaW5ncztcbnZhciB3YXJuZWRBYm91dEh5ZHJhdGVBUEkgPSBmYWxzZTtcblxue1xuICB0b3BMZXZlbFVwZGF0ZVdhcm5pbmdzID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIGlmIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciAmJiBjb250YWluZXIubm9kZVR5cGUgIT09IENPTU1FTlRfTk9ERSkge1xuICAgICAgdmFyIGhvc3RJbnN0YW5jZSA9IGZpbmRIb3N0SW5zdGFuY2VXaXRoTm9Qb3J0YWxzKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyLl9pbnRlcm5hbFJvb3QuY3VycmVudCk7XG5cbiAgICAgIGlmIChob3N0SW5zdGFuY2UpIHtcbiAgICAgICAgaWYgKGhvc3RJbnN0YW5jZS5wYXJlbnROb2RlICE9PSBjb250YWluZXIpIHtcbiAgICAgICAgICBlcnJvcigncmVuZGVyKC4uLik6IEl0IGxvb2tzIGxpa2UgdGhlIFJlYWN0LXJlbmRlcmVkIGNvbnRlbnQgb2YgdGhpcyAnICsgJ2NvbnRhaW5lciB3YXMgcmVtb3ZlZCB3aXRob3V0IHVzaW5nIFJlYWN0LiBUaGlzIGlzIG5vdCAnICsgJ3N1cHBvcnRlZCBhbmQgd2lsbCBjYXVzZSBlcnJvcnMuIEluc3RlYWQsIGNhbGwgJyArICdSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlIHRvIGVtcHR5IGEgY29udGFpbmVyLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGlzUm9vdFJlbmRlcmVkQnlTb21lUmVhY3QgPSAhIWNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyO1xuICAgIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICB2YXIgaGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSAhIShyb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpKTtcblxuICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCAmJiAhaXNSb290UmVuZGVyZWRCeVNvbWVSZWFjdCkge1xuICAgICAgZXJyb3IoJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIGNvbnRhaW5lci50YWdOYW1lICYmIGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdCT0RZJykge1xuICAgICAgZXJyb3IoJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NVTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHJldHVybiAhIShyb290RWxlbWVudCAmJiByb290RWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RFbGVtZW50Lmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKSB7XG4gIHZhciBzaG91bGRIeWRyYXRlID0gZm9yY2VIeWRyYXRlIHx8IHNob3VsZEh5ZHJhdGVEdWVUb0xlZ2FjeUhldXJpc3RpYyhjb250YWluZXIpOyAvLyBGaXJzdCBjbGVhciBhbnkgZXhpc3RpbmcgY29udGVudC5cblxuICBpZiAoIXNob3VsZEh5ZHJhdGUpIHtcbiAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgdmFyIHJvb3RTaWJsaW5nO1xuXG4gICAgd2hpbGUgKHJvb3RTaWJsaW5nID0gY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAge1xuICAgICAgICBpZiAoIXdhcm5lZCAmJiByb290U2libGluZy5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIHJvb3RTaWJsaW5nLmhhc0F0dHJpYnV0ZShST09UX0FUVFJJQlVURV9OQU1FKSkge1xuICAgICAgICAgIHdhcm5lZCA9IHRydWU7XG5cbiAgICAgICAgICBlcnJvcigncmVuZGVyKCk6IFRhcmdldCBub2RlIGhhcyBtYXJrdXAgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCB0aGVyZSAnICsgJ2FyZSB1bnJlbGF0ZWQgbm9kZXMgYXMgd2VsbC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGNhdXNlZCBieSAnICsgJ3doaXRlLXNwYWNlIGluc2VydGVkIGFyb3VuZCBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwLicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChyb290U2libGluZyk7XG4gICAgfVxuICB9XG5cbiAge1xuICAgIGlmIChzaG91bGRIeWRyYXRlICYmICFmb3JjZUh5ZHJhdGUgJiYgIXdhcm5lZEFib3V0SHlkcmF0ZUFQSSkge1xuICAgICAgd2FybmVkQWJvdXRIeWRyYXRlQVBJID0gdHJ1ZTtcblxuICAgICAgd2FybigncmVuZGVyKCk6IENhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgdG8gaHlkcmF0ZSBzZXJ2ZXItcmVuZGVyZWQgbWFya3VwICcgKyAnd2lsbCBzdG9wIHdvcmtpbmcgaW4gUmVhY3QgdjE4LiBSZXBsYWNlIHRoZSBSZWFjdERPTS5yZW5kZXIoKSBjYWxsICcgKyAnd2l0aCBSZWFjdERPTS5oeWRyYXRlKCkgaWYgeW91IHdhbnQgUmVhY3QgdG8gYXR0YWNoIHRvIHRoZSBzZXJ2ZXIgSFRNTC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlTGVnYWN5Um9vdChjb250YWluZXIsIHNob3VsZEh5ZHJhdGUgPyB7XG4gICAgaHlkcmF0ZTogdHJ1ZVxuICB9IDogdW5kZWZpbmVkKTtcbn1cblxuZnVuY3Rpb24gd2Fybk9uSW52YWxpZENhbGxiYWNrJDEoY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIGlmIChjYWxsYmFjayAhPT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yKCclcyguLi4pOiBFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgJyArICdmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGNoaWxkcmVuLCBjb250YWluZXIsIGZvcmNlSHlkcmF0ZSwgY2FsbGJhY2spIHtcbiAge1xuICAgIHRvcExldmVsVXBkYXRlV2FybmluZ3MoY29udGFpbmVyKTtcbiAgICB3YXJuT25JbnZhbGlkQ2FsbGJhY2skMShjYWxsYmFjayA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNhbGxiYWNrLCAncmVuZGVyJyk7XG4gIH0gLy8gVE9ETzogV2l0aG91dCBgYW55YCB0eXBlLCBGbG93IHNheXMgXCJQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgb24gYW55XG4gIC8vIG1lbWJlciBvZiBpbnRlcnNlY3Rpb24gdHlwZS5cIiBXaHl5eXl5eS5cblxuXG4gIHZhciByb290ID0gY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXI7XG4gIHZhciBmaWJlclJvb3Q7XG5cbiAgaWYgKCFyb290KSB7XG4gICAgLy8gSW5pdGlhbCBtb3VudFxuICAgIHJvb3QgPSBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9IGxlZ2FjeUNyZWF0ZVJvb3RGcm9tRE9NQ29udGFpbmVyKGNvbnRhaW5lciwgZm9yY2VIeWRyYXRlKTtcbiAgICBmaWJlclJvb3QgPSByb290Ll9pbnRlcm5hbFJvb3Q7XG5cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG4gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gSW5pdGlhbCBtb3VudCBzaG91bGQgbm90IGJlIGJhdGNoZWQuXG5cblxuICAgIHVuYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlQ29udGFpbmVyKGNoaWxkcmVuLCBmaWJlclJvb3QsIHBhcmVudENvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZpYmVyUm9vdCA9IHJvb3QuX2ludGVybmFsUm9vdDtcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBfb3JpZ2luYWxDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgICBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZ2V0UHVibGljUm9vdEluc3RhbmNlKGZpYmVyUm9vdCk7XG5cbiAgICAgICAgX29yaWdpbmFsQ2FsbGJhY2suY2FsbChpbnN0YW5jZSk7XG4gICAgICB9O1xuICAgIH0gLy8gVXBkYXRlXG5cblxuICAgIHVwZGF0ZUNvbnRhaW5lcihjaGlsZHJlbiwgZmliZXJSb290LCBwYXJlbnRDb21wb25lbnQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHJldHVybiBnZXRQdWJsaWNSb290SW5zdGFuY2UoZmliZXJSb290KTtcbn1cblxuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lciQzLmN1cnJlbnQ7XG5cbiAgICBpZiAob3duZXIgIT09IG51bGwgJiYgb3duZXIuc3RhdGVOb2RlICE9PSBudWxsKSB7XG4gICAgICB2YXIgd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBvd25lci5zdGF0ZU5vZGUuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyO1xuXG4gICAgICBpZiAoIXdhcm5lZEFib3V0UmVmc0luUmVuZGVyKSB7XG4gICAgICAgIGVycm9yKCclcyBpcyBhY2Nlc3NpbmcgZmluZERPTU5vZGUgaW5zaWRlIGl0cyByZW5kZXIoKS4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIGdldENvbXBvbmVudE5hbWUob3duZXIudHlwZSkgfHwgJ0EgY29tcG9uZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIG93bmVyLnN0YXRlTm9kZS5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnRPckVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHtcbiAgICByZXR1cm4gZmluZEhvc3RJbnN0YW5jZVdpdGhXYXJuaW5nKGNvbXBvbmVudE9yRWxlbWVudCwgJ2ZpbmRET01Ob2RlJyk7XG4gIH1cbn1cbmZ1bmN0aW9uIGh5ZHJhdGUoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00uaHlkcmF0ZSgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgJyArICdwYXNzZWQgdG8gUmVhY3RET00uY3JlYXRlUm9vdCgpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgY3JlYXRlUm9vdChjb250YWluZXIsIHtoeWRyYXRlOiB0cnVlfSkucmVuZGVyKGVsZW1lbnQpPycpO1xuICAgIH1cbiAgfSAvLyBUT0RPOiB0aHJvdyBvciB3YXJuIGlmIHdlIGNvdWxkbid0IGh5ZHJhdGU/XG5cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCB0cnVlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiByZW5kZXIoZWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIgKTtcbiAgICB9XG4gIH1cblxuICB7XG4gICAgdmFyIGlzTW9kZXJuUm9vdCA9IGlzQ29udGFpbmVyTWFya2VkQXNSb290KGNvbnRhaW5lcikgJiYgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc01vZGVyblJvb3QpIHtcbiAgICAgIGVycm9yKCdZb3UgYXJlIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gJyArICdEaWQgeW91IG1lYW4gdG8gY2FsbCByb290LnJlbmRlcihlbGVtZW50KT8nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbGVnYWN5UmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgZWxlbWVudCwgY29udGFpbmVyLCBmYWxzZSwgY2FsbGJhY2spO1xufVxuZnVuY3Rpb24gdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyTm9kZSkpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgaGFzKHBhcmVudENvbXBvbmVudCkpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwicGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnRcIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGZhbHNlLCBjYWxsYmFjayk7XG59XG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRhaW5lcikge1xuICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInVubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHtcbiAgICB2YXIgaXNNb2Rlcm5Sb290ID0gaXNDb250YWluZXJNYXJrZWRBc1Jvb3QoY29udGFpbmVyKSAmJiBjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lciA9PT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTW9kZXJuUm9vdCkge1xuICAgICAgZXJyb3IoJ1lvdSBhcmUgY2FsbGluZyBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKCkgb24gYSBjb250YWluZXIgdGhhdCB3YXMgcHJldmlvdXNseSAnICsgJ3Bhc3NlZCB0byBSZWFjdERPTS5jcmVhdGVSb290KCkuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgcm9vdC51bm1vdW50KCk/Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyKSB7XG4gICAge1xuICAgICAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgdmFyIHJlbmRlcmVkQnlEaWZmZXJlbnRSZWFjdCA9IHJvb3RFbCAmJiAhZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuXG4gICAgICBpZiAocmVuZGVyZWRCeURpZmZlcmVudFJlYWN0KSB7XG4gICAgICAgIGVycm9yKFwidW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3UncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50IFwiICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJyk7XG4gICAgICB9XG4gICAgfSAvLyBVbm1vdW50IHNob3VsZCBub3QgYmUgYmF0Y2hlZC5cblxuXG4gICAgdW5iYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoKSB7XG4gICAgICBsZWdhY3lSZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihudWxsLCBudWxsLCBjb250YWluZXIsIGZhbHNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICRGbG93Rml4TWUgVGhpcyBzaG91bGQgcHJvYmFibHkgdXNlIGBkZWxldGUgY29udGFpbmVyLl9yZWFjdFJvb3RDb250YWluZXJgXG4gICAgICAgIGNvbnRhaW5lci5fcmVhY3RSb290Q29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgdW5tYXJrQ29udGFpbmVyQXNSb290KGNvbnRhaW5lcik7XG4gICAgICB9KTtcbiAgICB9KTsgLy8gSWYgeW91IGNhbGwgdW5tb3VudENvbXBvbmVudEF0Tm9kZSB0d2ljZSBpbiBxdWljayBzdWNjZXNzaW9uLCB5b3UnbGxcbiAgICAvLyBnZXQgYHRydWVgIHR3aWNlLiBUaGF0J3MgcHJvYmFibHkgZmluZT9cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHtcbiAgICAgIHZhciBfcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICAgIHZhciBoYXNOb25Sb290UmVhY3RDaGlsZCA9ICEhKF9yb290RWwgJiYgZ2V0SW5zdGFuY2VGcm9tTm9kZShfcm9vdEVsKSk7IC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuXG4gICAgICB2YXIgaXNDb250YWluZXJSZWFjdFJvb3QgPSBjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSAmJiBpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lci5wYXJlbnROb2RlKSAmJiAhIWNvbnRhaW5lci5wYXJlbnROb2RlLl9yZWFjdFJvb3RDb250YWluZXI7XG5cbiAgICAgIGlmIChoYXNOb25Sb290UmVhY3RDaGlsZCkge1xuICAgICAgICBlcnJvcihcInVubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91J3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCBcIiArICd3YXMgcmVuZGVyZWQgYnkgUmVhY3QgYW5kIGlzIG5vdCBhIHRvcC1sZXZlbCBjb250YWluZXIuICVzJywgaXNDb250YWluZXJSZWFjdFJvb3QgPyAnWW91IG1heSBoYXZlIGFjY2lkZW50YWxseSBwYXNzZWQgaW4gYSBSZWFjdCByb290IG5vZGUgaW5zdGVhZCAnICsgJ29mIGl0cyBjb250YWluZXIuJyA6ICdJbnN0ZWFkLCBoYXZlIHRoZSBwYXJlbnQgY29tcG9uZW50IHVwZGF0ZSBpdHMgc3RhdGUgYW5kICcgKyAncmVyZW5kZXIgaW4gb3JkZXIgdG8gcmVtb3ZlIHRoaXMgY29tcG9uZW50LicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5zZXRBdHRlbXB0VXNlckJsb2NraW5nSHlkcmF0aW9uKGF0dGVtcHRVc2VyQmxvY2tpbmdIeWRyYXRpb24kMSk7XG5zZXRBdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbihhdHRlbXB0Q29udGludW91c0h5ZHJhdGlvbiQxKTtcbnNldEF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkkMSk7XG5zZXRBdHRlbXB0SHlkcmF0aW9uQXRQcmlvcml0eShydW5XaXRoUHJpb3JpdHkkMik7XG52YXIgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSBmYWxzZTtcblxue1xuICBpZiAodHlwZW9mIE1hcCAhPT0gJ2Z1bmN0aW9uJyB8fCAvLyAkRmxvd0lzc3VlIEZsb3cgaW5jb3JyZWN0bHkgdGhpbmtzIE1hcCBoYXMgbm8gcHJvdG90eXBlXG4gIE1hcC5wcm90b3R5cGUgPT0gbnVsbCB8fCB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBTZXQgIT09ICdmdW5jdGlvbicgfHwgLy8gJEZsb3dJc3N1ZSBGbG93IGluY29ycmVjdGx5IHRoaW5rcyBTZXQgaGFzIG5vIHByb3RvdHlwZVxuICBTZXQucHJvdG90eXBlID09IG51bGwgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuY2xlYXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIFNldC5wcm90b3R5cGUuZm9yRWFjaCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGVycm9yKCdSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhICcgKyAncG9seWZpbGwgaW4gb2xkZXIgYnJvd3NlcnMuIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1wb2x5ZmlsbHMnKTtcbiAgfVxufVxuXG5zZXRSZXN0b3JlSW1wbGVtZW50YXRpb24ocmVzdG9yZUNvbnRyb2xsZWRTdGF0ZSQzKTtcbnNldEJhdGNoaW5nSW1wbGVtZW50YXRpb24oYmF0Y2hlZFVwZGF0ZXMkMSwgZGlzY3JldGVVcGRhdGVzJDEsIGZsdXNoRGlzY3JldGVVcGRhdGVzLCBiYXRjaGVkRXZlbnRVcGRhdGVzJDEpO1xuXG5mdW5jdGlvbiBjcmVhdGVQb3J0YWwkMShjaGlsZHJlbiwgY29udGFpbmVyKSB7XG4gIHZhciBrZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7XG5cbiAgaWYgKCFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikpIHtcbiAgICB7XG4gICAgICB0aHJvdyBFcnJvciggXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiICk7XG4gICAgfVxuICB9IC8vIFRPRE86IHBhc3MgUmVhY3RET00gcG9ydGFsIGltcGxlbWVudGF0aW9uIGFzIHRoaXJkIGFyZ3VtZW50XG4gIC8vICRGbG93Rml4TWUgVGhlIEZsb3cgdHlwZSBpcyBvcGFxdWUgYnV0IHRoZXJlJ3Mgbm8gd2F5IHRvIGFjdHVhbGx5IGNyZWF0ZSBpdC5cblxuXG4gIHJldHVybiBjcmVhdGVQb3J0YWwoY2hpbGRyZW4sIGNvbnRhaW5lciwgbnVsbCwga2V5KTtcbn1cblxuZnVuY3Rpb24gcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBlbGVtZW50LCBjb250YWluZXJOb2RlLCBjYWxsYmFjaykge1xuXG4gIHJldHVybiB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIGVsZW1lbnQsIGNvbnRhaW5lck5vZGUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCBjb250YWluZXIpIHtcbiAgdmFyIGtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDtcblxuICB7XG4gICAgaWYgKCFkaWRXYXJuQWJvdXRVbnN0YWJsZUNyZWF0ZVBvcnRhbCkge1xuICAgICAgZGlkV2FybkFib3V0VW5zdGFibGVDcmVhdGVQb3J0YWwgPSB0cnVlO1xuXG4gICAgICB3YXJuKCdUaGUgUmVhY3RET00udW5zdGFibGVfY3JlYXRlUG9ydGFsKCkgYWxpYXMgaGFzIGJlZW4gZGVwcmVjYXRlZCwgJyArICdhbmQgd2lsbCBiZSByZW1vdmVkIGluIFJlYWN0IDE4Ky4gVXBkYXRlIHlvdXIgY29kZSB0byB1c2UgJyArICdSZWFjdERPTS5jcmVhdGVQb3J0YWwoKSBpbnN0ZWFkLiBJdCBoYXMgdGhlIGV4YWN0IHNhbWUgQVBJLCAnICsgJ2J1dCB3aXRob3V0IHRoZSBcInVuc3RhYmxlX1wiIHByZWZpeC4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlUG9ydGFsJDEoY2hpbGRyZW4sIGNvbnRhaW5lciwga2V5KTtcbn1cblxudmFyIEludGVybmFscyA9IHtcbiAgLy8gS2VlcCBpbiBzeW5jIHdpdGggUmVhY3RUZXN0VXRpbHMuanMsIGFuZCBSZWFjdFRlc3RVdGlsc0FjdC5qcy5cbiAgLy8gVGhpcyBpcyBhbiBhcnJheSBmb3IgYmV0dGVyIG1pbmlmaWNhdGlvbi5cbiAgRXZlbnRzOiBbZ2V0SW5zdGFuY2VGcm9tTm9kZSwgZ2V0Tm9kZUZyb21JbnN0YW5jZSwgZ2V0RmliZXJDdXJyZW50UHJvcHNGcm9tTm9kZSwgZW5xdWV1ZVN0YXRlUmVzdG9yZSwgcmVzdG9yZVN0YXRlSWZOZWVkZWQsIGZsdXNoUGFzc2l2ZUVmZmVjdHMsIC8vIFRPRE86IFRoaXMgaXMgcmVsYXRlZCB0byBgYWN0YCwgbm90IGV2ZW50cy4gTW92ZSB0byBzZXBhcmF0ZSBrZXk/XG4gIElzVGhpc1JlbmRlcmVyQWN0aW5nXVxufTtcbnZhciBmb3VuZERldlRvb2xzID0gaW5qZWN0SW50b0RldlRvb2xzKHtcbiAgZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBidW5kbGVUeXBlOiAgMSAsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcbiAgcmVuZGVyZXJQYWNrYWdlTmFtZTogJ3JlYWN0LWRvbSdcbn0pO1xuXG57XG4gIGlmICghZm91bmREZXZUb29scyAmJiBjYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcbiAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUnKSA+IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID09PSAtMSB8fCBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xKSB7XG4gICAgICB2YXIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7IC8vIERvbid0IHdhcm4gaW4gZXhvdGljIGNhc2VzIGxpa2UgY2hyb21lLWV4dGVuc2lvbjovLy5cblxuICAgICAgaWYgKC9eKGh0dHBzP3xmaWxlKTokLy50ZXN0KHByb3RvY29sKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG4gICAgICAgIGNvbnNvbGUuaW5mbygnJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtZGV2dG9vbHMnICsgKHByb3RvY29sID09PSAnZmlsZTonID8gJ1xcbllvdSBtaWdodCBuZWVkIHRvIHVzZSBhIGxvY2FsIEhUVFAgc2VydmVyIChpbnN0ZWFkIG9mIGZpbGU6Ly8pOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9yZWFjdC1kZXZ0b29scy1mYXEnIDogJycpLCAnZm9udC13ZWlnaHQ6Ym9sZCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gSW50ZXJuYWxzO1xuZXhwb3J0cy5jcmVhdGVQb3J0YWwgPSBjcmVhdGVQb3J0YWwkMTtcbmV4cG9ydHMuZmluZERPTU5vZGUgPSBmaW5kRE9NTm9kZTtcbmV4cG9ydHMuZmx1c2hTeW5jID0gZmx1c2hTeW5jO1xuZXhwb3J0cy5oeWRyYXRlID0gaHlkcmF0ZTtcbmV4cG9ydHMucmVuZGVyID0gcmVuZGVyO1xuZXhwb3J0cy51bm1vdW50Q29tcG9uZW50QXROb2RlID0gdW5tb3VudENvbXBvbmVudEF0Tm9kZTtcbmV4cG9ydHMudW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgPSBiYXRjaGVkVXBkYXRlcyQxO1xuZXhwb3J0cy51bnN0YWJsZV9jcmVhdGVQb3J0YWwgPSB1bnN0YWJsZV9jcmVhdGVQb3J0YWw7XG5leHBvcnRzLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVuZGVyU3VidHJlZUludG9Db250YWluZXI7XG5leHBvcnRzLnZlcnNpb24gPSBSZWFjdFZlcnNpb247XG4gIH0pKCk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGNoZWNrRENFKCkge1xuICAvKiBnbG9iYWwgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICovXG4gIGlmIChcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fID09PSAndW5kZWZpbmVkJyB8fFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UgIT09ICdmdW5jdGlvbidcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhpcyBicmFuY2ggaXMgdW5yZWFjaGFibGUgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkXG4gICAgLy8gaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBjb25kaXRpb24gaXMgdHJ1ZSBvbmx5IGluIGRldmVsb3BtZW50LlxuICAgIC8vIFRoZXJlZm9yZSBpZiB0aGUgYnJhbmNoIGlzIHN0aWxsIGhlcmUsIGRlYWQgY29kZSBlbGltaW5hdGlvbiB3YXNuJ3RcbiAgICAvLyBwcm9wZXJseSBhcHBsaWVkLlxuICAgIC8vIERvbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4gUmVhY3QgRGV2VG9vbHMgcmVsaWVzIG9uIGl0LiBBbHNvIG1ha2Ugc3VyZVxuICAgIC8vIHRoaXMgbWVzc2FnZSBkb2Vzbid0IG9jY3VyIGVsc2V3aGVyZSBpbiB0aGlzIGZ1bmN0aW9uLCBvciBpdCB3aWxsIGNhdXNlXG4gICAgLy8gYSBmYWxzZSBwb3NpdGl2ZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ15fXicpO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvZGUgYWJvdmUgaGFzIGJlZW4gZGVhZCBjb2RlIGVsaW1pbmF0ZWQgKERDRSdkKS5cbiAgICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UoY2hlY2tEQ0UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBEZXZUb29scyBzaG91bGRuJ3QgY3Jhc2ggUmVhY3QsIG5vIG1hdHRlciB3aGF0LlxuICAgIC8vIFdlIHNob3VsZCBzdGlsbCByZXBvcnQgaW4gY2FzZSB3ZSBicmVhayB0aGlzIGNvZGUuXG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vIERDRSBjaGVjayBzaG91bGQgaGFwcGVuIGJlZm9yZSBSZWFjdERPTSBidW5kbGUgZXhlY3V0ZXMgc28gdGhhdFxuICAvLyBEZXZUb29scyBjYW4gcmVwb3J0IGJhZCBtaW5pZmljYXRpb24gZHVyaW5nIGluamVjdGlvbi5cbiAgY2hlY2tEQ0UoKTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLCIvKiBnbG9iYWwgTWFwOnJlYWRvbmx5LCBTZXQ6cmVhZG9ubHksIEFycmF5QnVmZmVyOnJlYWRvbmx5ICovXG5cbnZhciBoYXNFbGVtZW50VHlwZSA9IHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciBoYXNNYXAgPSB0eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nO1xudmFyIGhhc1NldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbic7XG52YXIgaGFzQXJyYXlCdWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgISFBcnJheUJ1ZmZlci5pc1ZpZXc7XG5cbi8vIE5vdGU6IFdlICoqZG9uJ3QqKiBuZWVkIGBlbnZIYXNCaWdJbnQ2NEFycmF5YCBpbiBmZGUgZXM2L2luZGV4LmpzXG5cbmZ1bmN0aW9uIGVxdWFsKGEsIGIpIHtcbiAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbCBlczYvaW5kZXguanMgMy4xLjFcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuXG4gIGlmIChhICYmIGIgJiYgdHlwZW9mIGEgPT0gJ29iamVjdCcgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcpIHtcbiAgICBpZiAoYS5jb25zdHJ1Y3RvciAhPT0gYi5jb25zdHJ1Y3RvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbmd0aCwgaSwga2V5cztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgICAgbGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSAhPT0gMDspXG4gICAgICAgIGlmICghZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIFNUQVJUOiBNb2RpZmljYXRpb25zOlxuICAgIC8vIDEuIEV4dHJhIGBoYXM8VHlwZT4gJiZgIGhlbHBlcnMgaW4gaW5pdGlhbCBjb25kaXRpb24gYWxsb3cgZXM2IGNvZGVcbiAgICAvLyAgICB0byBjby1leGlzdCB3aXRoIGVzNS5cbiAgICAvLyAyLiBSZXBsYWNlIGBmb3Igb2ZgIHdpdGggZXM1IGNvbXBsaWFudCBpdGVyYXRpb24gdXNpbmcgYGZvcmAuXG4gICAgLy8gICAgQmFzaWNhbGx5LCB0YWtlOlxuICAgIC8vXG4gICAgLy8gICAgYGBganNcbiAgICAvLyAgICBmb3IgKGkgb2YgYS5lbnRyaWVzKCkpXG4gICAgLy8gICAgICBpZiAoIWIuaGFzKGlbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gICAgYGBgXG4gICAgLy9cbiAgICAvLyAgICAuLi4gYW5kIGNvbnZlcnQgdG86XG4gICAgLy9cbiAgICAvLyAgICBgYGBqc1xuICAgIC8vICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgLy8gICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAvLyAgICAgIGlmICghYi5oYXMoaS52YWx1ZVswXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyAgICBgYGBcbiAgICAvL1xuICAgIC8vICAgICoqTm90ZSoqOiBgaWAgYWNjZXNzIHN3aXRjaGVzIHRvIGBpLnZhbHVlYC5cbiAgICB2YXIgaXQ7XG4gICAgaWYgKGhhc01hcCAmJiAoYSBpbnN0YW5jZW9mIE1hcCkgJiYgKGIgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICAgIGl0ID0gYS5lbnRyaWVzKCk7XG4gICAgICB3aGlsZSAoIShpID0gaXQubmV4dCgpKS5kb25lKVxuICAgICAgICBpZiAoIWIuaGFzKGkudmFsdWVbMF0pKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFlcXVhbChpLnZhbHVlWzFdLCBiLmdldChpLnZhbHVlWzBdKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChoYXNTZXQgJiYgKGEgaW5zdGFuY2VvZiBTZXQpICYmIChiIGluc3RhbmNlb2YgU2V0KSkge1xuICAgICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgICBpdCA9IGEuZW50cmllcygpO1xuICAgICAgd2hpbGUgKCEoaSA9IGl0Lm5leHQoKSkuZG9uZSlcbiAgICAgICAgaWYgKCFiLmhhcyhpLnZhbHVlWzBdKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIEVORDogTW9kaWZpY2F0aW9uc1xuXG4gICAgaWYgKGhhc0FycmF5QnVmZmVyICYmIEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcoYikpIHtcbiAgICAgIGxlbmd0aCA9IGEubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGEuY29uc3RydWN0b3IgPT09IFJlZ0V4cCkgcmV0dXJuIGEuc291cmNlID09PSBiLnNvdXJjZSAmJiBhLmZsYWdzID09PSBiLmZsYWdzO1xuICAgIGlmIChhLnZhbHVlT2YgIT09IE9iamVjdC5wcm90b3R5cGUudmFsdWVPZikgcmV0dXJuIGEudmFsdWVPZigpID09PSBiLnZhbHVlT2YoKTtcbiAgICBpZiAoYS50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgcmV0dXJuIGEudG9TdHJpbmcoKSA9PT0gYi50b1N0cmluZygpO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICAgIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIGlmIChsZW5ndGggIT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gIT09IDA7KVxuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwga2V5c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBFTkQ6IGZhc3QtZGVlcC1lcXVhbFxuXG4gICAgLy8gU1RBUlQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuICAgIC8vIGN1c3RvbSBoYW5kbGluZyBmb3IgRE9NIGVsZW1lbnRzXG4gICAgaWYgKGhhc0VsZW1lbnRUeXBlICYmIGEgaW5zdGFuY2VvZiBFbGVtZW50KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBjdXN0b20gaGFuZGxpbmcgZm9yIFJlYWN0L1ByZWFjdFxuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tICE9PSAwOykge1xuICAgICAgaWYgKChrZXlzW2ldID09PSAnX293bmVyJyB8fCBrZXlzW2ldID09PSAnX192JyB8fCBrZXlzW2ldID09PSAnX19vJykgJiYgYS4kJHR5cGVvZikge1xuICAgICAgICAvLyBSZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBSZWFjdCBlbGVtZW50cycgX293bmVyXG4gICAgICAgIC8vIFByZWFjdC1zcGVjaWZpYzogYXZvaWQgdHJhdmVyc2luZyBQcmVhY3QgZWxlbWVudHMnIF9fdiBhbmQgX19vXG4gICAgICAgIC8vICAgIF9fdiA9ICRfb3JpZ2luYWwgLyAkX3Zub2RlXG4gICAgICAgIC8vICAgIF9fbyA9ICRfb3duZXJcbiAgICAgICAgLy8gVGhlc2UgcHJvcGVydGllcyBjb250YWluIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIGFyZSBub3QgbmVlZGVkIHdoZW5cbiAgICAgICAgLy8gY29tcGFyaW5nIHRoZSBhY3R1YWwgZWxlbWVudHMgKGFuZCBub3QgdGhlaXIgb3duZXJzKVxuICAgICAgICAvLyAuJCR0eXBlb2YgYW5kIC5fc3RvcmUgb24ganVzdCByZWFzb25hYmxlIG1hcmtlcnMgb2YgZWxlbWVudHNcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIGJlIHRyYXZlcnNlZCBhcyB1c3VhbFxuICAgICAgaWYgKCFlcXVhbChhW2tleXNbaV1dLCBiW2tleXNbaV1dKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBFTkQ6IHJlYWN0LWZhc3QtY29tcGFyZVxuXG4gICAgLy8gU1RBUlQ6IGZhc3QtZGVlcC1lcXVhbFxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGEgIT09IGEgJiYgYiAhPT0gYjtcbn1cbi8vIGVuZCBmYXN0LWRlZXAtZXF1YWxcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZXF1YWwoYSwgYik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKCgoZXJyb3IubWVzc2FnZSB8fCAnJykubWF0Y2goL3N0YWNrfHJlY3Vyc2lvbi9pKSkpIHtcbiAgICAgIC8vIHdhcm4gb24gY2lyY3VsYXIgcmVmZXJlbmNlcywgZG9uJ3QgY3Jhc2hcbiAgICAgIC8vIGJyb3dzZXJzIGdpdmUgdGhpcyBkaWZmZXJlbnQgZXJyb3JzIG5hbWUgYW5kIG1lc3NhZ2VzOlxuICAgICAgLy8gY2hyb21lL3NhZmFyaTogXCJSYW5nZUVycm9yXCIsIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIlxuICAgICAgLy8gZmlyZWZveDogXCJJbnRlcm5hbEVycm9yXCIsIHRvbyBtdWNoIHJlY3Vyc2lvblwiXG4gICAgICAvLyBlZGdlOiBcIkVycm9yXCIsIFwiT3V0IG9mIHN0YWNrIHNwYWNlXCJcbiAgICAgIGNvbnNvbGUud2FybigncmVhY3QtZmFzdC1jb21wYXJlIGNhbm5vdCBoYW5kbGUgY2lyY3VsYXIgcmVmcycpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBzb21lIG90aGVyIGVycm9yLiB3ZSBzaG91bGQgZGVmaW5pdGVseSBrbm93IGFib3V0IHRoZXNlXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG4iLCIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjEzLjFcbiAqIHJlYWN0LWlzLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgaGFzU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mcmFnbWVudCcpIDogMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpIDogMHhlYWNjO1xudmFyIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm92aWRlcicpIDogMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDB4ZWFjZTsgLy8gVE9ETzogV2UgZG9uJ3QgdXNlIEFzeW5jTW9kZSBvciBDb25jdXJyZW50TW9kZSBhbnltb3JlLiBUaGV5IHdlcmUgdGVtcG9yYXJ5XG4vLyAodW5zdGFibGUpIEFQSXMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC4gQ2FuIHdlIHJlbW92ZSB0aGUgc3ltYm9scz9cblxudmFyIFJFQUNUX0FTWU5DX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDB4ZWFjZjtcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG5cbmZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgLy8gTm90ZTogaXRzIHR5cGVvZiBtaWdodCBiZSBvdGhlciB0aGFuICdzeW1ib2wnIG9yICdudW1iZXInIGlmIGl0J3MgYSBwb2x5ZmlsbC5cbiAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1JFU1BPTkRFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1NDT1BFX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSk7XG59XG5cbmZ1bmN0aW9uIHR5cGVPZihvYmplY3QpIHtcbiAgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCkge1xuICAgIHZhciAkJHR5cGVvZiA9IG9iamVjdC4kJHR5cGVvZjtcblxuICAgIHN3aXRjaCAoJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICB2YXIgdHlwZSA9IG9iamVjdC50eXBlO1xuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdmFyICQkdHlwZW9mVHlwZSA9IHR5cGUgJiYgdHlwZS4kJHR5cGVvZjtcblxuICAgICAgICAgICAgc3dpdGNoICgkJHR5cGVvZlR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mVHlwZTtcblxuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgIHJldHVybiAkJHR5cGVvZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufSAvLyBBc3luY01vZGUgaXMgZGVwcmVjYXRlZCBhbG9uZyB3aXRoIGlzQXN5bmNNb2RlXG5cbnZhciBBc3luY01vZGUgPSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG52YXIgQ29uY3VycmVudE1vZGUgPSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbnZhciBDb250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG52YXIgQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbnZhciBFbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xudmFyIEZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xudmFyIEZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbnZhciBMYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xudmFyIE1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG52YXIgUG9ydGFsID0gUkVBQ1RfUE9SVEFMX1RZUEU7XG52YXIgUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xudmFyIFN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xudmFyIFN1c3BlbnNlID0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbnZhciBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IGZhbHNlOyAvLyBBc3luY01vZGUgc2hvdWxkIGJlIGRlcHJlY2F0ZWRcblxuZnVuY3Rpb24gaXNBc3luY01vZGUob2JqZWN0KSB7XG4gIHtcbiAgICBpZiAoIWhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlKSB7XG4gICAgICBoYXNXYXJuZWRBYm91dERlcHJlY2F0ZWRJc0FzeW5jTW9kZSA9IHRydWU7IC8vIFVzaW5nIGNvbnNvbGVbJ3dhcm4nXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG5cbiAgICAgIGNvbnNvbGVbJ3dhcm4nXSgnVGhlIFJlYWN0SXMuaXNBc3luY01vZGUoKSBhbGlhcyBoYXMgYmVlbiBkZXByZWNhdGVkLCAnICsgJ2FuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUmVhY3QgMTcrLiBVcGRhdGUgeW91ciBjb2RlIHRvIHVzZSAnICsgJ1JlYWN0SXMuaXNDb25jdXJyZW50TW9kZSgpIGluc3RlYWQuIEl0IGhhcyB0aGUgZXhhY3Qgc2FtZSBBUEkuJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzQ29uY3VycmVudE1vZGUob2JqZWN0KSB8fCB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQVNZTkNfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dENvbnN1bWVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzQ29udGV4dFByb3ZpZGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST1ZJREVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5mdW5jdGlvbiBpc0ZvcndhcmRSZWYob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRnJhZ21lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTGF6eShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG59XG5mdW5jdGlvbiBpc01lbW8ob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xufVxuZnVuY3Rpb24gaXNQb3J0YWwob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUE9SVEFMX1RZUEU7XG59XG5mdW5jdGlvbiBpc1Byb2ZpbGVyKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG59XG5mdW5jdGlvbiBpc1N0cmljdE1vZGUob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3VzcGVuc2Uob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRTtcbn1cblxuZXhwb3J0cy5Bc3luY01vZGUgPSBBc3luY01vZGU7XG5leHBvcnRzLkNvbmN1cnJlbnRNb2RlID0gQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLkNvbnRleHRDb25zdW1lciA9IENvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuQ29udGV4dFByb3ZpZGVyID0gQ29udGV4dFByb3ZpZGVyO1xuZXhwb3J0cy5FbGVtZW50ID0gRWxlbWVudDtcbmV4cG9ydHMuRm9yd2FyZFJlZiA9IEZvcndhcmRSZWY7XG5leHBvcnRzLkZyYWdtZW50ID0gRnJhZ21lbnQ7XG5leHBvcnRzLkxhenkgPSBMYXp5O1xuZXhwb3J0cy5NZW1vID0gTWVtbztcbmV4cG9ydHMuUG9ydGFsID0gUG9ydGFsO1xuZXhwb3J0cy5Qcm9maWxlciA9IFByb2ZpbGVyO1xuZXhwb3J0cy5TdHJpY3RNb2RlID0gU3RyaWN0TW9kZTtcbmV4cG9ydHMuU3VzcGVuc2UgPSBTdXNwZW5zZTtcbmV4cG9ydHMuaXNBc3luY01vZGUgPSBpc0FzeW5jTW9kZTtcbmV4cG9ydHMuaXNDb25jdXJyZW50TW9kZSA9IGlzQ29uY3VycmVudE1vZGU7XG5leHBvcnRzLmlzQ29udGV4dENvbnN1bWVyID0gaXNDb250ZXh0Q29uc3VtZXI7XG5leHBvcnRzLmlzQ29udGV4dFByb3ZpZGVyID0gaXNDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLmlzRWxlbWVudCA9IGlzRWxlbWVudDtcbmV4cG9ydHMuaXNGb3J3YXJkUmVmID0gaXNGb3J3YXJkUmVmO1xuZXhwb3J0cy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDtcbmV4cG9ydHMuaXNMYXp5ID0gaXNMYXp5O1xuZXhwb3J0cy5pc01lbW8gPSBpc01lbW87XG5leHBvcnRzLmlzUG9ydGFsID0gaXNQb3J0YWw7XG5leHBvcnRzLmlzUHJvZmlsZXIgPSBpc1Byb2ZpbGVyO1xuZXhwb3J0cy5pc1N0cmljdE1vZGUgPSBpc1N0cmljdE1vZGU7XG5leHBvcnRzLmlzU3VzcGVuc2UgPSBpc1N1c3BlbnNlO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudFR5cGUgPSBpc1ZhbGlkRWxlbWVudFR5cGU7XG5leHBvcnRzLnR5cGVPZiA9IHR5cGVPZjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuZXhwb3J0IHZhciBNYW5hZ2VyUmVmZXJlbmNlTm9kZUNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KCk7XG5leHBvcnQgdmFyIE1hbmFnZXJSZWZlcmVuY2VOb2RlU2V0dGVyQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoKTtcbmV4cG9ydCBmdW5jdGlvbiBNYW5hZ2VyKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcblxuICB2YXIgX1JlYWN0JHVzZVN0YXRlID0gUmVhY3QudXNlU3RhdGUobnVsbCksXG4gICAgICByZWZlcmVuY2VOb2RlID0gX1JlYWN0JHVzZVN0YXRlWzBdLFxuICAgICAgc2V0UmVmZXJlbmNlTm9kZSA9IF9SZWFjdCR1c2VTdGF0ZVsxXTtcblxuICB2YXIgaGFzVW5tb3VudGVkID0gUmVhY3QudXNlUmVmKGZhbHNlKTtcbiAgUmVhY3QudXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgaGFzVW5tb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIGhhbmRsZVNldFJlZmVyZW5jZU5vZGUgPSBSZWFjdC51c2VDYWxsYmFjayhmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmICghaGFzVW5tb3VudGVkLmN1cnJlbnQpIHtcbiAgICAgIHNldFJlZmVyZW5jZU5vZGUobm9kZSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYW5hZ2VyUmVmZXJlbmNlTm9kZUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogcmVmZXJlbmNlTm9kZVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNYW5hZ2VyUmVmZXJlbmNlTm9kZVNldHRlckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogaGFuZGxlU2V0UmVmZXJlbmNlTm9kZVxuICB9LCBjaGlsZHJlbikpO1xufSIsImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1hbmFnZXJSZWZlcmVuY2VOb2RlQ29udGV4dCB9IGZyb20gJy4vTWFuYWdlcic7XG5pbXBvcnQgeyB1bndyYXBBcnJheSwgc2V0UmVmIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyB1c2VQb3BwZXIgfSBmcm9tICcuL3VzZVBvcHBlcic7XG5cbnZhciBOT09QID0gZnVuY3Rpb24gTk9PUCgpIHtcbiAgcmV0dXJuIHZvaWQgMDtcbn07XG5cbnZhciBOT09QX1BST01JU0UgPSBmdW5jdGlvbiBOT09QX1BST01JU0UoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG59O1xuXG52YXIgRU1QVFlfTU9ESUZJRVJTID0gW107XG5leHBvcnQgZnVuY3Rpb24gUG9wcGVyKF9yZWYpIHtcbiAgdmFyIF9yZWYkcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmJHBsYWNlbWVudCA9PT0gdm9pZCAwID8gJ2JvdHRvbScgOiBfcmVmJHBsYWNlbWVudCxcbiAgICAgIF9yZWYkc3RyYXRlZ3kgPSBfcmVmLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfcmVmJHN0cmF0ZWd5ID09PSB2b2lkIDAgPyAnYWJzb2x1dGUnIDogX3JlZiRzdHJhdGVneSxcbiAgICAgIF9yZWYkbW9kaWZpZXJzID0gX3JlZi5tb2RpZmllcnMsXG4gICAgICBtb2RpZmllcnMgPSBfcmVmJG1vZGlmaWVycyA9PT0gdm9pZCAwID8gRU1QVFlfTU9ESUZJRVJTIDogX3JlZiRtb2RpZmllcnMsXG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gX3JlZi5yZWZlcmVuY2VFbGVtZW50LFxuICAgICAgb25GaXJzdFVwZGF0ZSA9IF9yZWYub25GaXJzdFVwZGF0ZSxcbiAgICAgIGlubmVyUmVmID0gX3JlZi5pbm5lclJlZixcbiAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgdmFyIHJlZmVyZW5jZU5vZGUgPSBSZWFjdC51c2VDb250ZXh0KE1hbmFnZXJSZWZlcmVuY2VOb2RlQ29udGV4dCk7XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZSA9IFJlYWN0LnVzZVN0YXRlKG51bGwpLFxuICAgICAgcG9wcGVyRWxlbWVudCA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFBvcHBlckVsZW1lbnQgPSBfUmVhY3QkdXNlU3RhdGVbMV07XG5cbiAgdmFyIF9SZWFjdCR1c2VTdGF0ZTIgPSBSZWFjdC51c2VTdGF0ZShudWxsKSxcbiAgICAgIGFycm93RWxlbWVudCA9IF9SZWFjdCR1c2VTdGF0ZTJbMF0sXG4gICAgICBzZXRBcnJvd0VsZW1lbnQgPSBfUmVhY3QkdXNlU3RhdGUyWzFdO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgc2V0UmVmKGlubmVyUmVmLCBwb3BwZXJFbGVtZW50KTtcbiAgfSwgW2lubmVyUmVmLCBwb3BwZXJFbGVtZW50XSk7XG4gIHZhciBvcHRpb25zID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgc3RyYXRlZ3k6IHN0cmF0ZWd5LFxuICAgICAgb25GaXJzdFVwZGF0ZTogb25GaXJzdFVwZGF0ZSxcbiAgICAgIG1vZGlmaWVyczogW10uY29uY2F0KG1vZGlmaWVycywgW3tcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgZW5hYmxlZDogYXJyb3dFbGVtZW50ICE9IG51bGwsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbGVtZW50OiBhcnJvd0VsZW1lbnRcbiAgICAgICAgfVxuICAgICAgfV0pXG4gICAgfTtcbiAgfSwgW3BsYWNlbWVudCwgc3RyYXRlZ3ksIG9uRmlyc3RVcGRhdGUsIG1vZGlmaWVycywgYXJyb3dFbGVtZW50XSk7XG5cbiAgdmFyIF91c2VQb3BwZXIgPSB1c2VQb3BwZXIocmVmZXJlbmNlRWxlbWVudCB8fCByZWZlcmVuY2VOb2RlLCBwb3BwZXJFbGVtZW50LCBvcHRpb25zKSxcbiAgICAgIHN0YXRlID0gX3VzZVBvcHBlci5zdGF0ZSxcbiAgICAgIHN0eWxlcyA9IF91c2VQb3BwZXIuc3R5bGVzLFxuICAgICAgZm9yY2VVcGRhdGUgPSBfdXNlUG9wcGVyLmZvcmNlVXBkYXRlLFxuICAgICAgdXBkYXRlID0gX3VzZVBvcHBlci51cGRhdGU7XG5cbiAgdmFyIGNoaWxkcmVuUHJvcHMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmOiBzZXRQb3BwZXJFbGVtZW50LFxuICAgICAgc3R5bGU6IHN0eWxlcy5wb3BwZXIsXG4gICAgICBwbGFjZW1lbnQ6IHN0YXRlID8gc3RhdGUucGxhY2VtZW50IDogcGxhY2VtZW50LFxuICAgICAgaGFzUG9wcGVyRXNjYXBlZDogc3RhdGUgJiYgc3RhdGUubW9kaWZpZXJzRGF0YS5oaWRlID8gc3RhdGUubW9kaWZpZXJzRGF0YS5oaWRlLmhhc1BvcHBlckVzY2FwZWQgOiBudWxsLFxuICAgICAgaXNSZWZlcmVuY2VIaWRkZW46IHN0YXRlICYmIHN0YXRlLm1vZGlmaWVyc0RhdGEuaGlkZSA/IHN0YXRlLm1vZGlmaWVyc0RhdGEuaGlkZS5pc1JlZmVyZW5jZUhpZGRlbiA6IG51bGwsXG4gICAgICBhcnJvd1Byb3BzOiB7XG4gICAgICAgIHN0eWxlOiBzdHlsZXMuYXJyb3csXG4gICAgICAgIHJlZjogc2V0QXJyb3dFbGVtZW50XG4gICAgICB9LFxuICAgICAgZm9yY2VVcGRhdGU6IGZvcmNlVXBkYXRlIHx8IE5PT1AsXG4gICAgICB1cGRhdGU6IHVwZGF0ZSB8fCBOT09QX1BST01JU0VcbiAgICB9O1xuICB9LCBbc2V0UG9wcGVyRWxlbWVudCwgc2V0QXJyb3dFbGVtZW50LCBwbGFjZW1lbnQsIHN0YXRlLCBzdHlsZXMsIHVwZGF0ZSwgZm9yY2VVcGRhdGVdKTtcbiAgcmV0dXJuIHVud3JhcEFycmF5KGNoaWxkcmVuKShjaGlsZHJlblByb3BzKTtcbn0iLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgd2FybmluZyBmcm9tICd3YXJuaW5nJztcbmltcG9ydCB7IE1hbmFnZXJSZWZlcmVuY2VOb2RlU2V0dGVyQ29udGV4dCB9IGZyb20gJy4vTWFuYWdlcic7XG5pbXBvcnQgeyBzYWZlSW52b2tlLCB1bndyYXBBcnJheSwgc2V0UmVmIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gUmVmZXJlbmNlKF9yZWYpIHtcbiAgdmFyIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbixcbiAgICAgIGlubmVyUmVmID0gX3JlZi5pbm5lclJlZjtcbiAgdmFyIHNldFJlZmVyZW5jZU5vZGUgPSBSZWFjdC51c2VDb250ZXh0KE1hbmFnZXJSZWZlcmVuY2VOb2RlU2V0dGVyQ29udGV4dCk7XG4gIHZhciByZWZIYW5kbGVyID0gUmVhY3QudXNlQ2FsbGJhY2soZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBzZXRSZWYoaW5uZXJSZWYsIG5vZGUpO1xuICAgIHNhZmVJbnZva2Uoc2V0UmVmZXJlbmNlTm9kZSwgbm9kZSk7XG4gIH0sIFtpbm5lclJlZiwgc2V0UmVmZXJlbmNlTm9kZV0pOyAvLyByYW4gb24gdW5tb3VudFxuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzZXRSZWYoaW5uZXJSZWYsIG51bGwpO1xuICAgIH07XG4gIH0pO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHdhcm5pbmcoQm9vbGVhbihzZXRSZWZlcmVuY2VOb2RlKSwgJ2BSZWZlcmVuY2VgIHNob3VsZCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEgYE1hbmFnZXJgIGNvbXBvbmVudC4nKTtcbiAgfSwgW3NldFJlZmVyZW5jZU5vZGVdKTtcbiAgcmV0dXJuIHVud3JhcEFycmF5KGNoaWxkcmVuKSh7XG4gICAgcmVmOiByZWZIYW5kbGVyXG4gIH0pO1xufSIsIi8vIFB1YmxpYyBjb21wb25lbnRzXG5pbXBvcnQgeyBQb3BwZXIgfSBmcm9tICcuL1BvcHBlcic7XG5pbXBvcnQgeyBNYW5hZ2VyIH0gZnJvbSAnLi9NYW5hZ2VyJztcbmltcG9ydCB7IFJlZmVyZW5jZSB9IGZyb20gJy4vUmVmZXJlbmNlJztcbmltcG9ydCB7IHVzZVBvcHBlciB9IGZyb20gJy4vdXNlUG9wcGVyJztcbmV4cG9ydCB7IFBvcHBlciwgTWFuYWdlciwgUmVmZXJlbmNlLCB1c2VQb3BwZXIgfTsgLy8gUHVibGljIHR5cGVzIiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGRlZmF1bHRDcmVhdGVQb3BwZXIgfSBmcm9tICdAcG9wcGVyanMvY29yZSc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdyZWFjdC1mYXN0LWNvbXBhcmUnO1xuaW1wb3J0IHsgZnJvbUVudHJpZXMsIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgfSBmcm9tICcuL3V0aWxzJztcbnZhciBFTVBUWV9NT0RJRklFUlMgPSBbXTtcbmV4cG9ydCB2YXIgdXNlUG9wcGVyID0gZnVuY3Rpb24gdXNlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHBvcHBlckVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBwcmV2T3B0aW9ucyA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgdmFyIG9wdGlvbnNXaXRoRGVmYXVsdHMgPSB7XG4gICAgb25GaXJzdFVwZGF0ZTogb3B0aW9ucy5vbkZpcnN0VXBkYXRlLFxuICAgIHBsYWNlbWVudDogb3B0aW9ucy5wbGFjZW1lbnQgfHwgJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3kgfHwgJ2Fic29sdXRlJyxcbiAgICBtb2RpZmllcnM6IG9wdGlvbnMubW9kaWZpZXJzIHx8IEVNUFRZX01PRElGSUVSU1xuICB9O1xuXG4gIHZhciBfUmVhY3QkdXNlU3RhdGUgPSBSZWFjdC51c2VTdGF0ZSh7XG4gICAgc3R5bGVzOiB7XG4gICAgICBwb3BwZXI6IHtcbiAgICAgICAgcG9zaXRpb246IG9wdGlvbnNXaXRoRGVmYXVsdHMuc3RyYXRlZ3ksXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgdG9wOiAnMCdcbiAgICAgIH0sXG4gICAgICBhcnJvdzoge1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgICAgfVxuICAgIH0sXG4gICAgYXR0cmlidXRlczoge31cbiAgfSksXG4gICAgICBzdGF0ZSA9IF9SZWFjdCR1c2VTdGF0ZVswXSxcbiAgICAgIHNldFN0YXRlID0gX1JlYWN0JHVzZVN0YXRlWzFdO1xuXG4gIHZhciB1cGRhdGVTdGF0ZU1vZGlmaWVyID0gUmVhY3QudXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICd1cGRhdGVTdGF0ZScsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcGhhc2U6ICd3cml0ZScsXG4gICAgICBmbjogZnVuY3Rpb24gZm4oX3JlZikge1xuICAgICAgICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICAgICAgICB2YXIgZWxlbWVudHMgPSBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cyk7XG4gICAgICAgIHNldFN0YXRlKHtcbiAgICAgICAgICBzdHlsZXM6IGZyb21FbnRyaWVzKGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIFtlbGVtZW50LCBzdGF0ZS5zdHlsZXNbZWxlbWVudF0gfHwge31dO1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiBmcm9tRW50cmllcyhlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZWxlbWVudCwgc3RhdGUuYXR0cmlidXRlc1tlbGVtZW50XV07XG4gICAgICAgICAgfSkpXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIHJlcXVpcmVzOiBbJ2NvbXB1dGVTdHlsZXMnXVxuICAgIH07XG4gIH0sIFtdKTtcbiAgdmFyIHBvcHBlck9wdGlvbnMgPSBSZWFjdC51c2VNZW1vKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbmV3T3B0aW9ucyA9IHtcbiAgICAgIG9uRmlyc3RVcGRhdGU6IG9wdGlvbnNXaXRoRGVmYXVsdHMub25GaXJzdFVwZGF0ZSxcbiAgICAgIHBsYWNlbWVudDogb3B0aW9uc1dpdGhEZWZhdWx0cy5wbGFjZW1lbnQsXG4gICAgICBzdHJhdGVneTogb3B0aW9uc1dpdGhEZWZhdWx0cy5zdHJhdGVneSxcbiAgICAgIG1vZGlmaWVyczogW10uY29uY2F0KG9wdGlvbnNXaXRoRGVmYXVsdHMubW9kaWZpZXJzLCBbdXBkYXRlU3RhdGVNb2RpZmllciwge1xuICAgICAgICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfV0pXG4gICAgfTtcblxuICAgIGlmIChpc0VxdWFsKHByZXZPcHRpb25zLmN1cnJlbnQsIG5ld09wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gcHJldk9wdGlvbnMuY3VycmVudCB8fCBuZXdPcHRpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2T3B0aW9ucy5jdXJyZW50ID0gbmV3T3B0aW9ucztcbiAgICAgIHJldHVybiBuZXdPcHRpb25zO1xuICAgIH1cbiAgfSwgW29wdGlvbnNXaXRoRGVmYXVsdHMub25GaXJzdFVwZGF0ZSwgb3B0aW9uc1dpdGhEZWZhdWx0cy5wbGFjZW1lbnQsIG9wdGlvbnNXaXRoRGVmYXVsdHMuc3RyYXRlZ3ksIG9wdGlvbnNXaXRoRGVmYXVsdHMubW9kaWZpZXJzLCB1cGRhdGVTdGF0ZU1vZGlmaWVyXSk7XG4gIHZhciBwb3BwZXJJbnN0YW5jZVJlZiA9IFJlYWN0LnVzZVJlZigpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCkge1xuICAgICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5zZXRPcHRpb25zKHBvcHBlck9wdGlvbnMpO1xuICAgIH1cbiAgfSwgW3BvcHBlck9wdGlvbnNdKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHJlZmVyZW5jZUVsZW1lbnQgPT0gbnVsbCB8fCBwb3BwZXJFbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY3JlYXRlUG9wcGVyID0gb3B0aW9ucy5jcmVhdGVQb3BwZXIgfHwgZGVmYXVsdENyZWF0ZVBvcHBlcjtcbiAgICB2YXIgcG9wcGVySW5zdGFuY2UgPSBjcmVhdGVQb3BwZXIocmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgcG9wcGVyT3B0aW9ucyk7XG4gICAgcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA9IHBvcHBlckluc3RhbmNlO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBwb3BwZXJJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9O1xuICB9LCBbcmVmZXJlbmNlRWxlbWVudCwgcG9wcGVyRWxlbWVudCwgb3B0aW9ucy5jcmVhdGVQb3BwZXJdKTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0ZTogcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudCA/IHBvcHBlckluc3RhbmNlUmVmLmN1cnJlbnQuc3RhdGUgOiBudWxsLFxuICAgIHN0eWxlczogc3RhdGUuc3R5bGVzLFxuICAgIGF0dHJpYnV0ZXM6IHN0YXRlLmF0dHJpYnV0ZXMsXG4gICAgdXBkYXRlOiBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ID8gcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC51cGRhdGUgOiBudWxsLFxuICAgIGZvcmNlVXBkYXRlOiBwb3BwZXJJbnN0YW5jZVJlZi5jdXJyZW50ID8gcG9wcGVySW5zdGFuY2VSZWYuY3VycmVudC5mb3JjZVVwZGF0ZSA6IG51bGxcbiAgfTtcbn07IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG4vKipcbiAqIFRha2VzIGFuIGFyZ3VtZW50IGFuZCBpZiBpdCdzIGFuIGFycmF5LCByZXR1cm5zIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcnJheSxcbiAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBhcmd1bWVudC4gVXNlZCBmb3IgUHJlYWN0IGNvbXBhdGliaWxpdHkuXG4gKi9cbmV4cG9ydCB2YXIgdW53cmFwQXJyYXkgPSBmdW5jdGlvbiB1bndyYXBBcnJheShhcmcpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKSA/IGFyZ1swXSA6IGFyZztcbn07XG4vKipcbiAqIFRha2VzIGEgbWF5YmUtdW5kZWZpbmVkIGZ1bmN0aW9uIGFuZCBhcmJpdHJhcnkgYXJncyBhbmQgaW52b2tlcyB0aGUgZnVuY3Rpb25cbiAqIG9ubHkgaWYgaXQgaXMgZGVmaW5lZC5cbiAqL1xuXG5leHBvcnQgdmFyIHNhZmVJbnZva2UgPSBmdW5jdGlvbiBzYWZlSW52b2tlKGZuKSB7XG4gIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgfVxufTtcbi8qKlxuICogU2V0cyBhIHJlZiB1c2luZyBlaXRoZXIgYSByZWYgY2FsbGJhY2sgb3IgYSByZWYgb2JqZWN0XG4gKi9cblxuZXhwb3J0IHZhciBzZXRSZWYgPSBmdW5jdGlvbiBzZXRSZWYocmVmLCBub2RlKSB7XG4gIC8vIGlmIGl0cyBhIGZ1bmN0aW9uIGNhbGwgaXRcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2FmZUludm9rZShyZWYsIG5vZGUpO1xuICB9IC8vIG90aGVyd2lzZSB3ZSBzaG91bGQgdHJlYXQgaXQgYXMgYSByZWYgb2JqZWN0XG4gIGVsc2UgaWYgKHJlZiAhPSBudWxsKSB7XG4gICAgICByZWYuY3VycmVudCA9IG5vZGU7XG4gICAgfVxufTtcbi8qKlxuICogU2ltcGxlIHBvbnlmaWxsIGZvciBPYmplY3QuZnJvbUVudHJpZXNcbiAqL1xuXG5leHBvcnQgdmFyIGZyb21FbnRyaWVzID0gZnVuY3Rpb24gZnJvbUVudHJpZXMoZW50cmllcykge1xuICByZXR1cm4gZW50cmllcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgX3JlZikge1xuICAgIHZhciBrZXkgPSBfcmVmWzBdLFxuICAgICAgICB2YWx1ZSA9IF9yZWZbMV07XG4gICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG59O1xuLyoqXG4gKiBTbWFsbCB3cmFwcGVyIGFyb3VuZCBgdXNlTGF5b3V0RWZmZWN0YCB0byBnZXQgcmlkIG9mIHRoZSB3YXJuaW5nIG9uIFNTUiBlbnZzXG4gKi9cblxuZXhwb3J0IHZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0OyIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbi8vIEFUVEVOVElPTlxuLy8gV2hlbiBhZGRpbmcgbmV3IHN5bWJvbHMgdG8gdGhpcyBmaWxlLFxuLy8gUGxlYXNlIGNvbnNpZGVyIGFsc28gYWRkaW5nIHRvICdyZWFjdC1kZXZ0b29scy1zaGFyZWQvc3JjL2JhY2tlbmQvUmVhY3RTeW1ib2xzJ1xuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAweGVhYzc7XG52YXIgUkVBQ1RfUE9SVEFMX1RZUEUgPSAweGVhY2E7XG5leHBvcnRzLkZyYWdtZW50ID0gMHhlYWNiO1xudmFyIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IDB4ZWFkMjtcbnZhciBSRUFDVF9QUk9WSURFUl9UWVBFID0gMHhlYWNkO1xudmFyIFJFQUNUX0NPTlRFWFRfVFlQRSA9IDB4ZWFjZTtcbnZhciBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IDB4ZWFkOTtcbnZhciBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IDB4ZWFkYTtcbnZhciBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gMHhlYWQ1O1xudmFyIFJFQUNUX1NDT1BFX1RZUEUgPSAweGVhZDc7XG52YXIgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSAweGVhZTA7XG52YXIgUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgPSAweGVhZTE7XG52YXIgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSAweGVhZTI7XG52YXIgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gMHhlYWUzO1xuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuZm9yKSB7XG4gIHZhciBzeW1ib2xGb3IgPSBTeW1ib2wuZm9yO1xuICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmVsZW1lbnQnKTtcbiAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnBvcnRhbCcpO1xuICBleHBvcnRzLkZyYWdtZW50ID0gc3ltYm9sRm9yKCdyZWFjdC5mcmFnbWVudCcpO1xuICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSBSZWFjdC5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRDtcblxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgfHwgZW5hYmxlU2NvcGVBUEkgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwpIHtcbiAgICBpZiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQkxPQ0tfVFlQRSB8fCB0eXBlWzBdID09PSBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRXcmFwcGVkTmFtZShvdXRlclR5cGUsIGlubmVyVHlwZSwgd3JhcHBlck5hbWUpIHtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCAnJztcbiAgcmV0dXJuIG91dGVyVHlwZS5kaXNwbGF5TmFtZSB8fCAoZnVuY3Rpb25OYW1lICE9PSAnJyA/IHdyYXBwZXJOYW1lICsgXCIoXCIgKyBmdW5jdGlvbk5hbWUgKyBcIilcIiA6IHdyYXBwZXJOYW1lKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGV4dE5hbWUodHlwZSkge1xuICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCAnQ29udGV4dCc7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBleHBvcnRzLkZyYWdtZW50OlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuICdQcm9maWxlcic7XG5cbiAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N0cmljdE1vZGUnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2VMaXN0JztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICB2YXIgY29udGV4dCA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShjb250ZXh0KSArICcuQ29uc3VtZXInO1xuXG4gICAgICBjYXNlIFJFQUNUX1BST1ZJREVSX1RZUEU6XG4gICAgICAgIHZhciBwcm92aWRlciA9IHR5cGU7XG4gICAgICAgIHJldHVybiBnZXRDb250ZXh0TmFtZShwcm92aWRlci5fY29udGV4dCkgKyAnLlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUuX3JlbmRlcik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIGxhenlDb21wb25lbnQgPSB0eXBlO1xuICAgICAgICAgIHZhciBwYXlsb2FkID0gbGF6eUNvbXBvbmVudC5fcGF5bG9hZDtcbiAgICAgICAgICB2YXIgaW5pdCA9IGxhenlDb21wb25lbnQuX2luaXQ7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUoaW5pdChwYXlsb2FkKSk7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIEhlbHBlcnMgdG8gcGF0Y2ggY29uc29sZS5sb2dzIHRvIGF2b2lkIGxvZ2dpbmcgZHVyaW5nIHNpZGUtZWZmZWN0IGZyZWVcbi8vIHJlcGxheWluZyBvbiByZW5kZXIgZnVuY3Rpb24uIFRoaXMgY3VycmVudGx5IG9ubHkgcGF0Y2hlcyB0aGUgb2JqZWN0XG4vLyBsYXppbHkgd2hpY2ggd29uJ3QgY292ZXIgaWYgdGhlIGxvZyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGVhZ2VybHkuXG4vLyBXZSBjb3VsZCBhbHNvIGVhZ2VybHkgcGF0Y2ggdGhlIG1ldGhvZC5cbnZhciBkaXNhYmxlZERlcHRoID0gMDtcbnZhciBwcmV2TG9nO1xudmFyIHByZXZJbmZvO1xudmFyIHByZXZXYXJuO1xudmFyIHByZXZFcnJvcjtcbnZhciBwcmV2R3JvdXA7XG52YXIgcHJldkdyb3VwQ29sbGFwc2VkO1xudmFyIHByZXZHcm91cEVuZDtcblxuZnVuY3Rpb24gZGlzYWJsZWRMb2coKSB7fVxuXG5kaXNhYmxlZExvZy5fX3JlYWN0RGlzYWJsZWRMb2cgPSB0cnVlO1xuZnVuY3Rpb24gZGlzYWJsZUxvZ3MoKSB7XG4gIHtcbiAgICBpZiAoZGlzYWJsZWREZXB0aCA9PT0gMCkge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgICBwcmV2TG9nID0gY29uc29sZS5sb2c7XG4gICAgICBwcmV2SW5mbyA9IGNvbnNvbGUuaW5mbztcbiAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgcHJldkVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICAgIHByZXZHcm91cCA9IGNvbnNvbGUuZ3JvdXA7XG4gICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgcHJldkdyb3VwRW5kID0gY29uc29sZS5ncm91cEVuZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8xOTA5OVxuXG4gICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGRpc2FibGVkTG9nLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgbG9nOiBwcm9wcyxcbiAgICAgICAgd2FybjogcHJvcHMsXG4gICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgZ3JvdXA6IHByb3BzLFxuICAgICAgICBncm91cENvbGxhcHNlZDogcHJvcHMsXG4gICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGRpc2FibGVkRGVwdGgrKztcbiAgfVxufVxuZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICB7XG4gICAgZGlzYWJsZWREZXB0aC0tO1xuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lIEZsb3cgdGhpbmtzIGNvbnNvbGUgaXMgaW1tdXRhYmxlLlxuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhjb25zb2xlLCB7XG4gICAgICAgIGxvZzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkxvZ1xuICAgICAgICB9KSxcbiAgICAgICAgaW5mbzogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkluZm9cbiAgICAgICAgfSksXG4gICAgICAgIHdhcm46IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZXYXJuXG4gICAgICAgIH0pLFxuICAgICAgICBlcnJvcjogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkVycm9yXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cENvbGxhcHNlZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwQ29sbGFwc2VkXG4gICAgICAgIH0pLFxuICAgICAgICBncm91cEVuZDogX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogcHJldkdyb3VwRW5kXG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICAgIC8qIGVzbGludC1lbmFibGUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nICovXG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkRGVwdGggPCAwKSB7XG4gICAgICBlcnJvcignZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uICcgKyAnVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlci5jdXJyZW50OyAvLyBTZXQgdGhlIGRpc3BhdGNoZXIgaW4gREVWIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBjYWxsIGluIHRoZSByZW5kZXIgZnVuY3Rpb25cbiAgICAvLyBmb3Igd2FybmluZ3MuXG5cbiAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyLmN1cnJlbnQgPSBudWxsO1xuICAgIGRpc2FibGVMb2dzKCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRoaXMgc2hvdWxkIHRocm93LlxuICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBzaG91bGQgYmUgc2V0dGluZyB0aGUgcHJvcHMgaW4gdGhlIGNvbnN0cnVjdG9yLlxuICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICB9OyAvLyAkRmxvd0ZpeE1lXG5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCAncHJvcHMnLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIFdlIHVzZSBhIHRocm93aW5nIHNldHRlciBpbnN0ZWFkIG9mIGZyb3plbiBvciBub24td3JpdGFibGUgcHJvcHNcbiAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgd29uJ3QgdGhyb3cgaW4gYSBub24tc3RyaWN0IG1vZGUgZnVuY3Rpb24uXG4gICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gJ29iamVjdCcgJiYgUmVmbGVjdC5jb25zdHJ1Y3QpIHtcbiAgICAgICAgLy8gV2UgY29uc3RydWN0IGEgZGlmZmVyZW50IGNvbnRyb2wgZm9yIHRoaXMgY2FzZSB0byBpbmNsdWRlIGFueSBleHRyYVxuICAgICAgICAvLyBmcmFtZXMgYWRkZWQgYnkgdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGNvbnRyb2wgPSB4O1xuICAgICAgICB9XG5cbiAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoZm4sIFtdLCBGYWtlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgRmFrZS5jYWxsKCk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuLmNhbGwoRmFrZS5wcm90b3R5cGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBjb250cm9sID0geDtcbiAgICAgIH1cblxuICAgICAgZm4oKTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgIC8vIFRoaXMgaXMgaW5saW5lZCBtYW51YWxseSBiZWNhdXNlIGNsb3N1cmUgZG9lc24ndCBkbyBpdCBmb3IgdXMuXG4gICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIHR5cGVvZiBzYW1wbGUuc3RhY2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSBmaXJzdCBmcmFtZSBmcm9tIHRoZSBzYW1wbGUgdGhhdCBpc24ndCBhbHNvIGluIHRoZSBjb250cm9sLlxuICAgICAgLy8gU2tpcHBpbmcgb25lIGZyYW1lIHRoYXQgd2UgYXNzdW1lIGlzIHRoZSBmcmFtZSB0aGF0IGNhbGxzIHRoZSB0d28uXG4gICAgICB2YXIgc2FtcGxlTGluZXMgPSBzYW1wbGUuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIGNvbnRyb2xMaW5lcyA9IGNvbnRyb2wuc3RhY2suc3BsaXQoJ1xcbicpO1xuICAgICAgdmFyIHMgPSBzYW1wbGVMaW5lcy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGMgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKHMgPj0gMSAmJiBjID49IDAgJiYgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAvLyBXZSBleHBlY3QgYXQgbGVhc3Qgb25lIHN0YWNrIGZyYW1lIHRvIGJlIHNoYXJlZC5cbiAgICAgICAgLy8gVHlwaWNhbGx5IHRoaXMgd2lsbCBiZSB0aGUgcm9vdCBtb3N0IG9uZS4gSG93ZXZlciwgc3RhY2sgZnJhbWVzIG1heSBiZVxuICAgICAgICAvLyBjdXQgb2ZmIGR1ZSB0byBtYXhpbXVtIHN0YWNrIGxpbWl0cy4gSW4gdGhpcyBjYXNlLCBvbmUgbWF5YmUgY3V0IG9mZlxuICAgICAgICAvLyBlYXJsaWVyIHRoYW4gdGhlIG90aGVyLiBXZSBhc3N1bWUgdGhhdCB0aGUgc2FtcGxlIGlzIGxvbmdlciBvciB0aGUgc2FtZVxuICAgICAgICAvLyBhbmQgdGhlcmUgZm9yIGN1dCBvZmYgZWFybGllci4gU28gd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QgbW9zdCBmcmFtZSBpblxuICAgICAgICAvLyB0aGUgc2FtcGxlIHNvbWV3aGVyZSBpbiB0aGUgY29udHJvbC5cbiAgICAgICAgYy0tO1xuICAgICAgfVxuXG4gICAgICBmb3IgKDsgcyA+PSAxICYmIGMgPj0gMDsgcy0tLCBjLS0pIHtcbiAgICAgICAgLy8gTmV4dCB3ZSBmaW5kIHRoZSBmaXJzdCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSB3aGljaCBzaG91bGQgYmUgdGhlXG4gICAgICAgIC8vIGZyYW1lIHRoYXQgY2FsbGVkIG91ciBzYW1wbGUgZnVuY3Rpb24gYW5kIHRoZSBjb250cm9sLlxuICAgICAgICBpZiAoc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgIC8vIEluIFY4LCB0aGUgZmlyc3QgbGluZSBpcyBkZXNjcmliaW5nIHRoZSBtZXNzYWdlIGJ1dCBvdGhlciBWTXMgZG9uJ3QuXG4gICAgICAgICAgLy8gSWYgd2UncmUgYWJvdXQgdG8gcmV0dXJuIHRoZSBmaXJzdCBsaW5lLCBhbmQgdGhlIGNvbnRyb2wgaXMgYWxzbyBvbiB0aGUgc2FtZVxuICAgICAgICAgIC8vIGxpbmUsIHRoYXQncyBhIHByZXR0eSBnb29kIGluZGljYXRvciB0aGF0IG91ciBzYW1wbGUgdGhyZXcgYXQgc2FtZSBsaW5lIGFzXG4gICAgICAgICAgLy8gdGhlIGNvbnRyb2wuIEkuZS4gYmVmb3JlIHdlIGVudGVyZWQgdGhlIHNhbXBsZSBmcmFtZS4gU28gd2UgaWdub3JlIHRoaXMgcmVzdWx0LlxuICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB5b3UgcGFzc2VkIGEgY2xhc3MgdG8gZnVuY3Rpb24gY29tcG9uZW50LCBvciBub24tZnVuY3Rpb24uXG4gICAgICAgICAgaWYgKHMgIT09IDEgfHwgYyAhPT0gMSkge1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICBzLS07XG4gICAgICAgICAgICAgIGMtLTsgLy8gV2UgbWF5IHN0aWxsIGhhdmUgc2ltaWxhciBpbnRlcm1lZGlhdGUgZnJhbWVzIGZyb20gdGhlIGNvbnN0cnVjdCBjYWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgbmV4dCBvbmUgdGhhdCBpc24ndCB0aGUgc2FtZSBzaG91bGQgYmUgb3VyIG1hdGNoIHRob3VnaC5cblxuICAgICAgICAgICAgICBpZiAoYyA8IDAgfHwgc2FtcGxlTGluZXNbc10gIT09IGNvbnRyb2xMaW5lc1tjXSkge1xuICAgICAgICAgICAgICAgIC8vIFY4IGFkZHMgYSBcIm5ld1wiIHByZWZpeCBmb3IgbmF0aXZlIGNsYXNzZXMuIExldCdzIHJlbW92ZSBpdCB0byBtYWtlIGl0IHByZXR0aWVyLlxuICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPSAnXFxuJyArIHNhbXBsZUxpbmVzW3NdLnJlcGxhY2UoJyBhdCBuZXcgJywgJyBhdCAnKTtcblxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSAvLyBSZXR1cm4gdGhlIGxpbmUgd2UgZm91bmQuXG5cblxuICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gd2hpbGUgKHMgPj0gMSAmJiBjID49IDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlZW50cnkgPSBmYWxzZTtcblxuICAgIHtcbiAgICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lO1xuXG5mdW5jdGlvbiBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5zZXRFeHRyYVN0YWNrRnJhbWUoc3RhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bjtcbnZhciBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bjtcbnZhciBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZikge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIHNlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IHNlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpLCBjb25maWcucmVmKTtcblxuICAgICAgICBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzW2NvbXBvbmVudE5hbWVdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHtcbiAgICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3NwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYuaXNSZWFjdFdhcm5pbmcgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIG5vdCB3b3JrLiBJbnN0ZWFkIHRlc3QgJCR0eXBlb2YgZmllbGQgYWdhaW5zdCBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgdG8gY2hlY2tcbiAqIGlmIHNvbWV0aGluZyBpcyBhIFJlYWN0IEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHsqfSB0eXBlXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAcGFyYW0geyp9IGtleVxuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fSByZWZcbiAqIEBwYXJhbSB7Kn0gb3duZXJcbiAqIEBwYXJhbSB7Kn0gc2VsZiBBICp0ZW1wb3JhcnkqIGhlbHBlciB0byBkZXRlY3QgcGxhY2VzIHdoZXJlIGB0aGlzYCBpc1xuICogZGlmZmVyZW50IGZyb20gdGhlIGBvd25lcmAgd2hlbiBSZWFjdC5jcmVhdGVFbGVtZW50IGlzIGNhbGxlZCwgc28gdGhhdCB3ZVxuICogY2FuIHdhcm4uIFdlIHdhbnQgdG8gZ2V0IHJpZCBvZiBvd25lciBhbmQgcmVwbGFjZSBzdHJpbmcgYHJlZmBzIHdpdGggYXJyb3dcbiAqIGZ1bmN0aW9ucywgYW5kIGFzIGxvbmcgYXMgYHRoaXNgIGFuZCBvd25lciBhcmUgdGhlIHNhbWUsIHRoZXJlIHdpbGwgYmUgbm9cbiAqIGNoYW5nZSBpbiBiZWhhdmlvci5cbiAqIEBwYXJhbSB7Kn0gc291cmNlIEFuIGFubm90YXRpb24gb2JqZWN0IChhZGRlZCBieSBhIHRyYW5zcGlsZXIgb3Igb3RoZXJ3aXNlKVxuICogaW5kaWNhdGluZyBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGFuZC9vciBvdGhlciBpbmZvcm1hdGlvbi5cbiAqIEBpbnRlcm5hbFxuICovXG5cblxudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3dzIHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICAvLyBCdWlsdC1pbiBwcm9wZXJ0aWVzIHRoYXQgYmVsb25nIG9uIHRoZSBlbGVtZW50XG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSxcbiAgICByZWY6IHJlZixcbiAgICBwcm9wczogcHJvcHMsXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9OyAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBmYWxzZVxuICAgIH0pOyAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IHNlbGZcbiAgICB9KTsgLy8gVHdvIGVsZW1lbnRzIGNyZWF0ZWQgaW4gdHdvIGRpZmZlcmVudCBwbGFjZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICB9KTtcblxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JmY3MvcHVsbC8xMDdcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cblxuZnVuY3Rpb24ganN4REVWKHR5cGUsIGNvbmZpZywgbWF5YmVLZXksIHNvdXJjZSwgc2VsZikge1xuICB7XG4gICAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgICB2YXIgcHJvcHMgPSB7fTtcbiAgICB2YXIga2V5ID0gbnVsbDtcbiAgICB2YXIgcmVmID0gbnVsbDsgLy8gQ3VycmVudGx5LCBrZXkgY2FuIGJlIHNwcmVhZCBpbiBhcyBhIHByb3AuIFRoaXMgY2F1c2VzIGEgcG90ZW50aWFsXG4gICAgLy8gaXNzdWUgaWYga2V5IGlzIGFsc28gZXhwbGljaXRseSBkZWNsYXJlZCAoaWUuIDxkaXYgey4uLnByb3BzfSBrZXk9XCJIaVwiIC8+XG4gICAgLy8gb3IgPGRpdiBrZXk9XCJIaVwiIHsuLi5wcm9wc30gLz4gKS4gV2Ugd2FudCB0byBkZXByZWNhdGUga2V5IHNwcmVhZCxcbiAgICAvLyBidXQgYXMgYW4gaW50ZXJtZWRpYXJ5IHN0ZXAsIHdlIHdpbGwgdXNlIGpzeERFViBmb3IgZXZlcnl0aGluZyBleGNlcHRcbiAgICAvLyA8ZGl2IHsuLi5wcm9wc30ga2V5PVwiSGlcIiAvPiwgYmVjYXVzZSB3ZSBhcmVuJ3QgY3VycmVudGx5IGFibGUgdG8gdGVsbCBpZlxuICAgIC8vIGtleSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIHRvIGJlIHVuZGVmaW5lZCBvciBub3QuXG5cbiAgICBpZiAobWF5YmVLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5ID0gJycgKyBtYXliZUtleTtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZywgc2VsZik7XG4gICAgfSAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG5cblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gICAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcblxuICAgICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZikge1xuICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xuICB9XG59XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50T3duZXI7XG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShzdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMS5zZXRFeHRyYVN0YWNrRnJhbWUobnVsbCk7XG4gICAgfVxuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuLyoqXG4gKiBWZXJpZmllcyB0aGUgb2JqZWN0IGlzIGEgUmVhY3RFbGVtZW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNpc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBAZmluYWxcbiAqL1xuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudChvYmplY3QpIHtcbiAge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICB7XG4gICAgaWYgKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudCkge1xuICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyJDEuY3VycmVudC50eXBlKTtcblxuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpIHtcbiAge1xuICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB7XG4gICAgdmFyIGluZm8gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcblxuICAgIGlmICghaW5mbykge1xuICAgICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICB7XG4gICAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gICAgaWYgKG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1tjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7IC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gICAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAgIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICAgIHZhciBjaGlsZE93bmVyID0gJyc7XG5cbiAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIkMS5jdXJyZW50KSB7XG4gICAgICAvLyBHaXZlIHRoZSBjb21wb25lbnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhpcyBjaGlsZC5cbiAgICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAge1xuICAgIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG5cbiAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobm9kZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24ganN4V2l0aFZhbGlkYXRpb24odHlwZSwgcHJvcHMsIGtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKSB7XG4gIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgdmFyIGluZm8gPSAnJztcblxuICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShzb3VyY2UpO1xuXG4gICAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdHlwZVN0cmluZztcblxuICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgICAgdHlwZVN0cmluZyA9ICdudWxsJztcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICAgIH0gZWxzZSBpZiAodHlwZSAhPT0gdW5kZWZpbmVkICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgICB9XG5cbiAgICAgIGVycm9yKCdSZWFjdC5qc3g6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgc291cmNlLCBzZWxmKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IC8vIFNraXAga2V5IHdhcm5pbmcgaWYgdGhlIHR5cGUgaXNuJ3QgdmFsaWQgc2luY2Ugb3VyIGtleSB2YWxpZGF0aW9uIGxvZ2ljXG4gICAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAgIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgICAvLyAoUmVuZGVyaW5nIHdpbGwgdGhyb3cgd2l0aCBhIGhlbHBmdWwgbWVzc2FnZSBhbmQgYXMgc29vbiBhcyB0aGUgdHlwZSBpc1xuICAgIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW47XG5cbiAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpc1N0YXRpY0NoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuW2ldLCB0eXBlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKE9iamVjdC5mcmVlemUpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShjaGlsZHJlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yKCdSZWFjdC5qc3g6IFN0YXRpYyBjaGlsZHJlbiBzaG91bGQgYWx3YXlzIGJlIGFuIGFycmF5LiAnICsgJ1lvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gJyArICdVc2UgdGhlIEJhYmVsIHRyYW5zZm9ybSBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbiwgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufSAvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGV4aXN0IHRvIHN0aWxsIGdldCBjaGlsZCB3YXJuaW5ncyBpbiBkZXZcblxudmFyIGpzeERFViQxID0gIGpzeFdpdGhWYWxpZGF0aW9uIDtcblxuZXhwb3J0cy5qc3hERVYgPSBqc3hERVYkMTtcbiAgfSkoKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTcuMC4yXG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAoZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBUT0RPOiB0aGlzIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBnZXRzIGltcG9ydGVkIGR1cmluZyBidWlsZC5cbnZhciBSZWFjdFZlcnNpb24gPSAnMTcuMC4yJztcblxuLy8gQVRURU5USU9OXG4vLyBXaGVuIGFkZGluZyBuZXcgc3ltYm9scyB0byB0aGlzIGZpbGUsXG4vLyBQbGVhc2UgY29uc2lkZXIgYWxzbyBhZGRpbmcgdG8gJ3JlYWN0LWRldnRvb2xzLXNoYXJlZC9zcmMvYmFja2VuZC9SZWFjdFN5bWJvbHMnXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQtbGlrZSB0eXBlcy4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IDB4ZWFjNztcbnZhciBSRUFDVF9QT1JUQUxfVFlQRSA9IDB4ZWFjYTtcbmV4cG9ydHMuRnJhZ21lbnQgPSAweGVhY2I7XG5leHBvcnRzLlN0cmljdE1vZGUgPSAweGVhY2M7XG5leHBvcnRzLlByb2ZpbGVyID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG5leHBvcnRzLlN1c3BlbnNlID0gMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSAweGVhZDk7XG52YXIgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSAweGVhZGE7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IDB4ZWFkNTtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gMHhlYWQ3O1xudmFyIFJFQUNUX09QQVFVRV9JRF9UWVBFID0gMHhlYWUwO1xudmFyIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gMHhlYWUxO1xudmFyIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gMHhlYWUyO1xudmFyIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IDB4ZWFlMztcblxuaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLmZvcikge1xuICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5lbGVtZW50Jyk7XG4gIFJFQUNUX1BPUlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wb3J0YWwnKTtcbiAgZXhwb3J0cy5GcmFnbWVudCA9IHN5bWJvbEZvcigncmVhY3QuZnJhZ21lbnQnKTtcbiAgZXhwb3J0cy5TdHJpY3RNb2RlID0gc3ltYm9sRm9yKCdyZWFjdC5zdHJpY3RfbW9kZScpO1xuICBleHBvcnRzLlByb2ZpbGVyID0gc3ltYm9sRm9yKCdyZWFjdC5wcm9maWxlcicpO1xuICBSRUFDVF9QUk9WSURFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5wcm92aWRlcicpO1xuICBSRUFDVF9DT05URVhUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmNvbnRleHQnKTtcbiAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZm9yd2FyZF9yZWYnKTtcbiAgZXhwb3J0cy5TdXNwZW5zZSA9IHN5bWJvbEZvcigncmVhY3Quc3VzcGVuc2UnKTtcbiAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0Jyk7XG4gIFJFQUNUX01FTU9fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubWVtbycpO1xuICBSRUFDVF9MQVpZX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmxhenknKTtcbiAgUkVBQ1RfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuYmxvY2snKTtcbiAgUkVBQ1RfU0VSVkVSX0JMT0NLX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnNlcnZlci5ibG9jaycpO1xuICBSRUFDVF9GVU5EQU1FTlRBTF9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpO1xuICBSRUFDVF9TQ09QRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zY29wZScpO1xuICBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub3BhcXVlLmlkJyk7XG4gIFJFQUNUX0RFQlVHX1RSQUNJTkdfTU9ERV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5kZWJ1Z190cmFjZV9tb2RlJyk7XG4gIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5vZmZzY3JlZW4nKTtcbiAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5sZWdhY3lfaGlkZGVuJyk7XG59XG5cbnZhciBNQVlCRV9JVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICBpZiAobWF5YmVJdGVyYWJsZSA9PT0gbnVsbCB8fCB0eXBlb2YgbWF5YmVJdGVyYWJsZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBtYXliZUl0ZXJhdG9yID0gTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXTtcblxuICBpZiAodHlwZW9mIG1heWJlSXRlcmF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGRpc3BhdGNoZXIuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnREaXNwYXRjaGVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgYmF0Y2gncyBjb25maWd1cmF0aW9uIHN1Y2ggYXMgaG93IGxvbmcgYW4gdXBkYXRlXG4gKiBzaG91bGQgc3VzcGVuZCBmb3IgaWYgaXQgbmVlZHMgdG8uXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyA9IHtcbiAgdHJhbnNpdGlvbjogMFxufTtcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBudWxsO1xuZnVuY3Rpb24gc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKSB7XG4gIHtcbiAgICBjdXJyZW50RXh0cmFTdGFja0ZyYW1lID0gc3RhY2s7XG4gIH1cbn1cblxue1xuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLnNldEV4dHJhU3RhY2tGcmFtZSA9IGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHtcbiAgICAgIGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUgPSBzdGFjaztcbiAgICB9XG4gIH07IC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuXG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuXG4gIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc3RhY2sgPSAnJzsgLy8gQWRkIGFuIGV4dHJhIHRvcCBmcmFtZSB3aGlsZSBhbiBlbGVtZW50IGlzIGJlaW5nIHZhbGlkYXRlZFxuXG4gICAgaWYgKGN1cnJlbnRFeHRyYVN0YWNrRnJhbWUpIHtcbiAgICAgIHN0YWNrICs9IGN1cnJlbnRFeHRyYVN0YWNrRnJhbWU7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vKipcbiAqIFVzZWQgYnkgYWN0KCkgdG8gdHJhY2sgd2hldGhlciB5b3UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlLlxuICovXG52YXIgSXNTb21lUmVuZGVyZXJBY3RpbmcgPSB7XG4gIGN1cnJlbnQ6IGZhbHNlXG59O1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyLFxuICBJc1NvbWVSZW5kZXJlckFjdGluZzogSXNTb21lUmVuZGVyZXJBY3RpbmcsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBSZWFjdFNoYXJlZEludGVybmFscy5SZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG4gICAgdmFyIHN0YWNrID0gUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKCk7XG5cbiAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICBmb3JtYXQgKz0gJyVzJztcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChbc3RhY2tdKTtcbiAgICB9XG5cbiAgICB2YXIgYXJnc1dpdGhGb3JtYXQgPSBhcmdzLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgcmV0dXJuICcnICsgaXRlbTtcbiAgICB9KTsgLy8gQ2FyZWZ1bDogUk4gY3VycmVudGx5IGRlcGVuZHMgb24gdGhpcyBwcmVmaXhcblxuICAgIGFyZ3NXaXRoRm9ybWF0LnVuc2hpZnQoJ1dhcm5pbmc6ICcgKyBmb3JtYXQpOyAvLyBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBzcHJlYWQgKG9yIC5hcHBseSkgZGlyZWN0bHkgYmVjYXVzZSBpdFxuICAgIC8vIGJyZWFrcyBJRTk6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTM2MTBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaW50ZXJuYWwvbm8tcHJvZHVjdGlvbi1sb2dnaW5nXG5cbiAgICBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChjb25zb2xlW2xldmVsXSwgY29uc29sZSwgYXJnc1dpdGhGb3JtYXQpO1xuICB9XG59XG5cbnZhciBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnQgPSB7fTtcblxuZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAge1xuICAgIHZhciBfY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IF9jb25zdHJ1Y3RvciAmJiAoX2NvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IF9jb25zdHJ1Y3Rvci5uYW1lKSB8fCAnUmVhY3RDbGFzcyc7XG4gICAgdmFyIHdhcm5pbmdLZXkgPSBjb21wb25lbnROYW1lICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuXG4gICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVycm9yKFwiQ2FuJ3QgY2FsbCAlcyBvbiBhIGNvbXBvbmVudCB0aGF0IGlzIG5vdCB5ZXQgbW91bnRlZC4gXCIgKyAnVGhpcyBpcyBhIG5vLW9wLCBidXQgaXQgbWlnaHQgaW5kaWNhdGUgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gJyArICdJbnN0ZWFkLCBhc3NpZ24gdG8gYHRoaXMuc3RhdGVgIGRpcmVjdGx5IG9yIGRlZmluZSBhIGBzdGF0ZSA9IHt9O2AgJyArICdjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY29tcG9uZW50TmFtZSk7XG5cbiAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JVbm1vdW50ZWRDb21wb25lbnRbd2FybmluZ0tleV0gPSB0cnVlO1xuICB9XG59XG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG5cblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGNhbGxlck5hbWUgbmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIGNvbXBvbmVudCBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IE5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG57XG4gIE9iamVjdC5mcmVlemUoZW1wdHlPYmplY3QpO1xufVxuLyoqXG4gKiBCYXNlIGNsYXNzIGhlbHBlcnMgZm9yIHRoZSB1cGRhdGluZyBzdGF0ZSBvZiBhIGNvbXBvbmVudC5cbiAqL1xuXG5cbmZ1bmN0aW9uIENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0OyAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cblxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5Db21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbi8qKlxuICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyB0byBtdXRhdGVcbiAqIHN0YXRlLiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gKlxuICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgY2FsbHMgdG8gYHNldFN0YXRlYCB3aWxsIHJ1biBzeW5jaHJvbm91c2x5LFxuICogYXMgdGhleSBtYXkgZXZlbnR1YWxseSBiZSBiYXRjaGVkIHRvZ2V0aGVyLiAgWW91IGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsXG4gKiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbCB0byBzZXRTdGF0ZSBpcyBhY3R1YWxseVxuICogY29tcGxldGVkLlxuICpcbiAqIFdoZW4gYSBmdW5jdGlvbiBpcyBwcm92aWRlZCB0byBzZXRTdGF0ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYXQgc29tZSBwb2ludCBpblxuICogdGhlIGZ1dHVyZSAobm90IHN5bmNocm9ub3VzbHkpLiBJdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSB1cCB0byBkYXRlXG4gKiBjb21wb25lbnQgYXJndW1lbnRzIChzdGF0ZSwgcHJvcHMsIGNvbnRleHQpLiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRpZmZlcmVudFxuICogZnJvbSB0aGlzLiogYmVjYXVzZSB5b3VyIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgcmVjZWl2ZVByb3BzIGJ1dCBiZWZvcmVcbiAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSwgYW5kIHRoaXMgbmV3IHN0YXRlLCBwcm9wcywgYW5kIGNvbnRleHQgd2lsbCBub3QgeWV0IGJlXG4gKiBhc3NpZ25lZCB0byB0aGlzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIG9yIGZ1bmN0aW9uIHRvXG4gKiAgICAgICAgcHJvZHVjZSBuZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggY3VycmVudCBzdGF0ZS5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAocGFydGlhbFN0YXRlLCBjYWxsYmFjaykge1xuICBpZiAoISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLlwiICk7XG4gICAgfVxuICB9XG5cbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbn07XG4vKipcbiAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICpcbiAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICpcbiAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gKlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciB1cGRhdGUgaXMgY29tcGxldGUuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5cbkNvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG59O1xuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cblxuXG57XG4gIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICBpc01vdW50ZWQ6IFsnaXNNb3VudGVkJywgJ0luc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluICcgKyAnY29tcG9uZW50V2lsbFVubW91bnQgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuJ10sXG4gICAgcmVwbGFjZVN0YXRlOiBbJ3JlcGxhY2VTdGF0ZScsICdSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSAnICsgJ2h0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMzIzNikuJ11cbiAgfTtcblxuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJyVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzJywgaW5mb1swXSwgaW5mb1sxXSk7XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBmb3IgKHZhciBmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpIHtcbiAgICBpZiAoZGVwcmVjYXRlZEFQSXMuaGFzT3duUHJvcGVydHkoZm5OYW1lKSkge1xuICAgICAgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKGZuTmFtZSwgZGVwcmVjYXRlZEFQSXNbZm5OYW1lXSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIENvbXBvbmVudER1bW15KCkge31cblxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gQ29tcG9uZW50LnByb3RvdHlwZTtcbi8qKlxuICogQ29udmVuaWVuY2UgY29tcG9uZW50IHdpdGggZGVmYXVsdCBzaGFsbG93IGVxdWFsaXR5IGNoZWNrIGZvciBzQ1UuXG4gKi9cblxuZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7IC8vIElmIGEgY29tcG9uZW50IGhhcyBzdHJpbmcgcmVmcywgd2Ugd2lsbCBhc3NpZ24gYSBkaWZmZXJlbnQgb2JqZWN0IGxhdGVyLlxuXG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG52YXIgcHVyZUNvbXBvbmVudFByb3RvdHlwZSA9IFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5wdXJlQ29tcG9uZW50UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDsgLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5cbl9hc3NpZ24ocHVyZUNvbXBvbmVudFByb3RvdHlwZSwgQ29tcG9uZW50LnByb3RvdHlwZSk7XG5cbnB1cmVDb21wb25lbnRQcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQgPSB0cnVlO1xuXG4vLyBhbiBpbW11dGFibGUgb2JqZWN0IHdpdGggYSBzaW5nbGUgbXV0YWJsZSB2YWx1ZVxuZnVuY3Rpb24gY3JlYXRlUmVmKCkge1xuICB2YXIgcmVmT2JqZWN0ID0ge1xuICAgIGN1cnJlbnQ6IG51bGxcbiAgfTtcblxuICB7XG4gICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgfVxuXG4gIHJldHVybiByZWZPYmplY3Q7XG59XG5cbmZ1bmN0aW9uIGdldFdyYXBwZWROYW1lKG91dGVyVHlwZSwgaW5uZXJUeXBlLCB3cmFwcGVyTmFtZSkge1xuICB2YXIgZnVuY3Rpb25OYW1lID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8ICcnO1xuICByZXR1cm4gb3V0ZXJUeXBlLmRpc3BsYXlOYW1lIHx8IChmdW5jdGlvbk5hbWUgIT09ICcnID8gd3JhcHBlck5hbWUgKyBcIihcIiArIGZ1bmN0aW9uTmFtZSArIFwiKVwiIDogd3JhcHBlck5hbWUpO1xufVxuXG5mdW5jdGlvbiBnZXRDb250ZXh0TmFtZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8ICdDb250ZXh0Jztcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZSh0eXBlKSB7XG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICAvLyBIb3N0IHJvb3QsIHRleHQgbm9kZSBvciBqdXN0IGludmFsaWQgdHlwZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHtcbiAgICBpZiAodHlwZW9mIHR5cGUudGFnID09PSAnbnVtYmVyJykge1xuICAgICAgZXJyb3IoJ1JlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgb2JqZWN0IGluIGdldENvbXBvbmVudE5hbWUoKS4gJyArICdUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuRnJhZ21lbnQ6XG4gICAgICByZXR1cm4gJ0ZyYWdtZW50JztcblxuICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICByZXR1cm4gJ1BvcnRhbCc7XG5cbiAgICBjYXNlIGV4cG9ydHMuUHJvZmlsZXI6XG4gICAgICByZXR1cm4gJ1Byb2ZpbGVyJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdHJpY3RNb2RlOlxuICAgICAgcmV0dXJuICdTdHJpY3RNb2RlJztcblxuICAgIGNhc2UgZXhwb3J0cy5TdXNwZW5zZTpcbiAgICAgIHJldHVybiAnU3VzcGVuc2UnO1xuXG4gICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlTGlzdCc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUoY29udGV4dCkgKyAnLkNvbnN1bWVyJztcblxuICAgICAgY2FzZSBSRUFDVF9QUk9WSURFUl9UWVBFOlxuICAgICAgICB2YXIgcHJvdmlkZXIgPSB0eXBlO1xuICAgICAgICByZXR1cm4gZ2V0Q29udGV4dE5hbWUocHJvdmlkZXIuX2NvbnRleHQpICsgJy5Qcm92aWRlcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldFdyYXBwZWROYW1lKHR5cGUsIHR5cGUucmVuZGVyLCAnRm9yd2FyZFJlZicpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWUodHlwZS50eXBlKTtcblxuICAgICAgY2FzZSBSRUFDVF9CTE9DS19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKGluaXQocGF5bG9hZCkpO1xuICAgICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBrZXk6IHRydWUsXG4gIHJlZjogdHJ1ZSxcbiAgX19zZWxmOiB0cnVlLFxuICBfX3NvdXJjZTogdHJ1ZVxufTtcbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24sIGRpZFdhcm5BYm91dFN0cmluZ1JlZnM7XG5cbntcbiAgZGlkV2FybkFib3V0U3RyaW5nUmVmcyA9IHt9O1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ3JlZicpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdyZWYnKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG5cbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29uZmlnLmtleSAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmFyIHdhcm5BYm91dEFjY2Vzc2luZ0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB7XG4gICAgICBpZiAoIXNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgICBlcnJvcignJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL3JlYWN0anMub3JnL2xpbmsvc3BlY2lhbC1wcm9wcyknLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIHtcbiAgICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuXG4gICAgICAgIGVycm9yKCclczogYHJlZmAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCAnICsgJ2luIGB1bmRlZmluZWRgIGJlaW5nIHJldHVybmVkLiBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIHNhbWUgJyArICd2YWx1ZSB3aXRoaW4gdGhlIGNoaWxkIGNvbXBvbmVudCwgeW91IHNob3VsZCBwYXNzIGl0IGFzIGEgZGlmZmVyZW50ICcgKyAncHJvcC4gKGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay9zdHJpY3QtbW9kZS1zdHJpbmctcmVmJywgY29tcG9uZW50TmFtZSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9IGtleS5yZXBsYWNlKGVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UodXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXgsICckJi8nKTtcbn1cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGVsZW1lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gZWxlbWVudCBBIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuXG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ29iamVjdCcgJiYgZWxlbWVudCAhPT0gbnVsbCAmJiBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIGVzY2FwZSgnJyArIGVsZW1lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgdmFyIGludm9rZUNhbGxiYWNrID0gZmFsc2U7XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsKSB7XG4gICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBpZiAoaW52b2tlQ2FsbGJhY2spIHtcbiAgICB2YXIgX2NoaWxkID0gY2hpbGRyZW47XG4gICAgdmFyIG1hcHBlZENoaWxkID0gY2FsbGJhY2soX2NoaWxkKTsgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzOlxuXG4gICAgdmFyIGNoaWxkS2V5ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldEVsZW1lbnRLZXkoX2NoaWxkLCAwKSA6IG5hbWVTb0ZhcjtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgICAgdmFyIGVzY2FwZWRDaGlsZEtleSA9ICcnO1xuXG4gICAgICBpZiAoY2hpbGRLZXkgIT0gbnVsbCkge1xuICAgICAgICBlc2NhcGVkQ2hpbGRLZXkgPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkoY2hpbGRLZXkpICsgJy8nO1xuICAgICAgfVxuXG4gICAgICBtYXBJbnRvQXJyYXkobWFwcGVkQ2hpbGQsIGFycmF5LCBlc2NhcGVkQ2hpbGRLZXksICcnLCBmdW5jdGlvbiAoYykge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgICBtYXBwZWRDaGlsZCA9IGNsb25lQW5kUmVwbGFjZUtleShtYXBwZWRDaGlsZCwgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICAgIGVzY2FwZWRQcmVmaXggKyAoIC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgUmVhY3QuUG9ydGFsIGRvZXNuJ3QgaGF2ZSBhIGtleVxuICAgICAgICBtYXBwZWRDaGlsZC5rZXkgJiYgKCFfY2hpbGQgfHwgX2NoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IC8vICRGbG93Rml4TWUgRmxvdyBpbmNvcnJlY3RseSB0aGlua3MgZXhpc3RpbmcgZWxlbWVudCdzIGtleSBjYW4gYmUgYSBudW1iZXJcbiAgICAgICAgZXNjYXBlVXNlclByb3ZpZGVkS2V5KCcnICsgbWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICAgIH1cblxuICAgICAgYXJyYXkucHVzaChtYXBwZWRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldEVsZW1lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG5cbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciBpdGVyYWJsZUNoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBpdGVyYWJsZUNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAoIWRpZFdhcm5BYm91dE1hcHMpIHtcbiAgICAgICAgICAgIHdhcm4oJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHN1cHBvcnRlZC4gJyArICdVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZUNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRFbGVtZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgc3VidHJlZUNvdW50ICs9IG1hcEludG9BcnJheShjaGlsZCwgYXJyYXksIGVzY2FwZWRQcmVmaXgsIG5leHROYW1lLCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gJycgKyBjaGlsZHJlbjtcblxuICAgICAge1xuICAgICAgICB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoIFwiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiBcIiArIChjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcpICsgXCIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuXCIgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogTWFwcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgY291bnQgPSAwO1xuICBtYXBJbnRvQXJyYXkoY2hpbGRyZW4sIHJlc3VsdCwgJycsICcnLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5cblxuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgbiA9IDA7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgbisrOyAvLyBEb24ndCByZXR1cm4gYW55dGhpbmdcbiAgfSk7XG4gIHJldHVybiBuO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yRWFjaEZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gRG9uJ3QgcmV0dXJuIGFueXRoaW5nLlxuICB9LCBmb3JFYWNoQ29udGV4dCk7XG59XG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbnRvYXJyYXlcbiAqL1xuXG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pIHx8IFtdO1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpIHtcbiAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWxjdWxhdGVDaGFuZ2VkQml0cyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSBudWxsICYmIHR5cGVvZiBjYWxjdWxhdGVDaGFuZ2VkQml0cyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignY3JlYXRlQ29udGV4dDogRXhwZWN0ZWQgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjYWxjdWxhdGVDaGFuZ2VkQml0cyxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuICB2YXIgaGFzV2FybmVkQWJvdXREaXNwbGF5TmFtZU9uQ29uc3VtZXIgPSBmYWxzZTtcblxuICB7XG4gICAgLy8gQSBzZXBhcmF0ZSBvYmplY3QsIGJ1dCBwcm94aWVzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRleHQgb2JqZWN0IGZvclxuICAgIC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBoYXMgYSBkaWZmZXJlbnQgJCR0eXBlb2YsIHNvIHdlIGNhbiBwcm9wZXJseVxuICAgIC8vIHdhcm4gZm9yIHRoZSBpbmNvcnJlY3QgdXNhZ2Ugb2YgQ29udGV4dCBhcyBhIENvbnN1bWVyLlxuICAgIHZhciBDb25zdW1lciA9IHtcbiAgICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgICBfY29udGV4dDogY29udGV4dCxcbiAgICAgIF9jYWxjdWxhdGVDaGFuZ2VkQml0czogY29udGV4dC5fY2FsY3VsYXRlQ2hhbmdlZEJpdHNcbiAgICB9OyAvLyAkRmxvd0ZpeE1lOiBGbG93IGNvbXBsYWlucyBhYm91dCBub3Qgc2V0dGluZyBhIHZhbHVlLCB3aGljaCBpcyBpbnRlbnRpb25hbCBoZXJlXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDb25zdW1lciwge1xuICAgICAgUHJvdmlkZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlcikge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ0NvbnN1bWVyUHJvdmlkZXIgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLlByb3ZpZGVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LlByb3ZpZGVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LlByb3ZpZGVyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfUHJvdmlkZXIpIHtcbiAgICAgICAgICBjb250ZXh0LlByb3ZpZGVyID0gX1Byb3ZpZGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlID0gX2N1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF9jdXJyZW50VmFsdWUyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChfY3VycmVudFZhbHVlMikge1xuICAgICAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTIgPSBfY3VycmVudFZhbHVlMjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIF90aHJlYWRDb3VudDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gY29udGV4dC5fdGhyZWFkQ291bnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF90aHJlYWRDb3VudCkge1xuICAgICAgICAgIGNvbnRleHQuX3RocmVhZENvdW50ID0gX3RocmVhZENvdW50O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgQ29uc3VtZXI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycykge1xuICAgICAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05lc3RlZENvbnRleHRDb25zdW1lcnMgPSB0cnVlO1xuXG4gICAgICAgICAgICBlcnJvcignUmVuZGVyaW5nIDxDb250ZXh0LkNvbnN1bWVyLkNvbnN1bWVyPiBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBEaWQgeW91IG1lYW4gdG8gcmVuZGVyIDxDb250ZXh0LkNvbnN1bWVyPiBpbnN0ZWFkPycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250ZXh0LkNvbnN1bWVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZGlzcGxheU5hbWU6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlzcGxheU5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKGRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lcikge1xuICAgICAgICAgICAgd2FybignU2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIENvbnRleHQuQ29uc3VtZXIgaGFzIG5vIGVmZmVjdC4gJyArIFwiWW91IHNob3VsZCBzZXQgaXQgZGlyZWN0bHkgb24gdGhlIGNvbnRleHQgd2l0aCBDb250ZXh0LmRpc3BsYXlOYW1lID0gJyVzJy5cIiwgZGlzcGxheU5hbWUpO1xuXG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dERpc3BsYXlOYW1lT25Db25zdW1lciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG1pc3NpbmcgcHJvcGVydGllcyBiZWNhdXNlIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCBkZWZpbmVQcm9wZXJ0eVxuXG4gICAgY29udGV4dC5Db25zdW1lciA9IENvbnN1bWVyO1xuICB9XG5cbiAge1xuICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyMiA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gY29udGV4dDtcbn1cblxudmFyIFVuaW5pdGlhbGl6ZWQgPSAtMTtcbnZhciBQZW5kaW5nID0gMDtcbnZhciBSZXNvbHZlZCA9IDE7XG52YXIgUmVqZWN0ZWQgPSAyO1xuXG5mdW5jdGlvbiBsYXp5SW5pdGlhbGl6ZXIocGF5bG9hZCkge1xuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBVbmluaXRpYWxpemVkKSB7XG4gICAgdmFyIGN0b3IgPSBwYXlsb2FkLl9yZXN1bHQ7XG4gICAgdmFyIHRoZW5hYmxlID0gY3RvcigpOyAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG4gICAgdmFyIHBlbmRpbmcgPSBwYXlsb2FkO1xuICAgIHBlbmRpbmcuX3N0YXR1cyA9IFBlbmRpbmc7XG4gICAgcGVuZGluZy5fcmVzdWx0ID0gdGhlbmFibGU7XG4gICAgdGhlbmFibGUudGhlbihmdW5jdGlvbiAobW9kdWxlT2JqZWN0KSB7XG4gICAgICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBQZW5kaW5nKSB7XG4gICAgICAgIHZhciBkZWZhdWx0RXhwb3J0ID0gbW9kdWxlT2JqZWN0LmRlZmF1bHQ7XG5cbiAgICAgICAge1xuICAgICAgICAgIGlmIChkZWZhdWx0RXhwb3J0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVycm9yKCdsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiAnICsgJ0luc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgJyArIC8vIEJyZWFrIHVwIGltcG9ydHMgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHBhcnNpbmcgdGhlbSBhcyBkZXBlbmRlbmNpZXMuXG4gICAgICAgICAgICAnY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcCcgKyBcIm9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLCBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBUcmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLlxuXG5cbiAgICAgICAgdmFyIHJlc29sdmVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVzb2x2ZWQuX3N0YXR1cyA9IFJlc29sdmVkO1xuICAgICAgICByZXNvbHZlZC5fcmVzdWx0ID0gZGVmYXVsdEV4cG9ydDtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChwYXlsb2FkLl9zdGF0dXMgPT09IFBlbmRpbmcpIHtcbiAgICAgICAgLy8gVHJhbnNpdGlvbiB0byB0aGUgbmV4dCBzdGF0ZS5cbiAgICAgICAgdmFyIHJlamVjdGVkID0gcGF5bG9hZDtcbiAgICAgICAgcmVqZWN0ZWQuX3N0YXR1cyA9IFJlamVjdGVkO1xuICAgICAgICByZWplY3RlZC5fcmVzdWx0ID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAocGF5bG9hZC5fc3RhdHVzID09PSBSZXNvbHZlZCkge1xuICAgIHJldHVybiBwYXlsb2FkLl9yZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGxhenkoY3Rvcikge1xuICB2YXIgcGF5bG9hZCA9IHtcbiAgICAvLyBXZSB1c2UgdGhlc2UgZmllbGRzIHRvIHN0b3JlIHRoZSByZXN1bHQuXG4gICAgX3N0YXR1czogLTEsXG4gICAgX3Jlc3VsdDogY3RvclxuICB9O1xuICB2YXIgbGF6eVR5cGUgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0xBWllfVFlQRSxcbiAgICBfcGF5bG9hZDogcGF5bG9hZCxcbiAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7IC8vICRGbG93Rml4TWVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlUeXBlLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb3BzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdEZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgZGVmYXVsdFByb3BzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gbmV3RGVmYXVsdFByb3BzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdkZWZhdWx0UHJvcHMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwcm9wVHlwZXM6IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFR5cGVzO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdQcm9wVHlwZXMpIHtcbiAgICAgICAgICBlcnJvcignUmVhY3QubGF6eSguLi4pOiBJdCBpcyBub3Qgc3VwcG9ydGVkIHRvIGFzc2lnbiBgcHJvcFR5cGVzYCB0byAnICsgJ2EgbGF6eSBjb21wb25lbnQgaW1wb3J0LiBFaXRoZXIgc3BlY2lmeSB0aGVtIHdoZXJlIHRoZSBjb21wb25lbnQgJyArICdpcyBkZWZpbmVkLCBvciBjcmVhdGUgYSB3cmFwcGluZyBjb21wb25lbnQgYXJvdW5kIGl0LicpO1xuXG4gICAgICAgICAgcHJvcFR5cGVzID0gbmV3UHJvcFR5cGVzOyAvLyBNYXRjaCBwcm9kdWN0aW9uIGJlaGF2aW9yIG1vcmUgY2xvc2VseTpcbiAgICAgICAgICAvLyAkRmxvd0ZpeE1lXG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFLFxuICAgIHJlbmRlcjogcmVuZGVyXG4gIH07XG5cbiAge1xuICAgIHZhciBvd25OYW1lO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgJ2Rpc3BsYXlOYW1lJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICBvd25OYW1lID0gbmFtZTtcblxuICAgICAgICBpZiAocmVuZGVyLmRpc3BsYXlOYW1lID09IG51bGwpIHtcbiAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbi8vIEZpbHRlciBjZXJ0YWluIERPTSBhdHRyaWJ1dGVzIChlLmcuIHNyYywgaHJlZikgaWYgdGhlaXIgdmFsdWVzIGFyZSBlbXB0eSBzdHJpbmdzLlxuXG52YXIgZW5hYmxlU2NvcGVBUEkgPSBmYWxzZTsgLy8gRXhwZXJpbWVudGFsIENyZWF0ZSBFdmVudCBIYW5kbGUgQVBJLlxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICBpZiAodHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gTm90ZTogdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgKGUuZy4gaWYgaXQncyBhIHBvbHlmaWxsKS5cblxuXG4gIGlmICh0eXBlID09PSBleHBvcnRzLkZyYWdtZW50IHx8IHR5cGUgPT09IGV4cG9ydHMuUHJvZmlsZXIgfHwgdHlwZSA9PT0gUkVBQ1RfREVCVUdfVFJBQ0lOR19NT0RFX1RZUEUgfHwgdHlwZSA9PT0gZXhwb3J0cy5TdHJpY3RNb2RlIHx8IHR5cGUgPT09IGV4cG9ydHMuU3VzcGVuc2UgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSB8fCBlbmFibGVTY29wZUFQSSApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgIGlmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFIHx8IHR5cGVbMF0gPT09IFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1lbW8odHlwZSwgY29tcGFyZSkge1xuICB7XG4gICAgaWYgKCFpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkpIHtcbiAgICAgIGVycm9yKCdtZW1vOiBUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIGNvbXBvbmVudC4gSW5zdGVhZCAnICsgJ3JlY2VpdmVkOiAlcycsIHR5cGUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdHlwZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnRUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9NRU1PX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb21wYXJlOiBjb21wYXJlID09PSB1bmRlZmluZWQgPyBudWxsIDogY29tcGFyZVxuICB9O1xuXG4gIHtcbiAgICB2YXIgb3duTmFtZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudFR5cGUsICdkaXNwbGF5TmFtZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvd25OYW1lO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgb3duTmFtZSA9IG5hbWU7XG5cbiAgICAgICAgaWYgKHR5cGUuZGlzcGxheU5hbWUgPT0gbnVsbCkge1xuICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgPSBuYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudFR5cGU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICBpZiAoIShkaXNwYXRjaGVyICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL3JlYWN0anMub3JnL2xpbmsvaW52YWxpZC1ob29rLWNhbGwgZm9yIHRpcHMgYWJvdXQgaG93IHRvIGRlYnVnIGFuZCBmaXggdGhpcyBwcm9ibGVtLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5cbmZ1bmN0aW9uIHVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcblxuICB7XG4gICAgaWYgKHVuc3RhYmxlX29ic2VydmVkQml0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvcigndXNlQ29udGV4dCgpIHNlY29uZCBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlICcgKyAndXNlIGluIFJlYWN0LiBQYXNzaW5nIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnWW91IHBhc3NlZDogJXMuJXMnLCB1bnN0YWJsZV9vYnNlcnZlZEJpdHMsIHR5cGVvZiB1bnN0YWJsZV9vYnNlcnZlZEJpdHMgPT09ICdudW1iZXInICYmIEFycmF5LmlzQXJyYXkoYXJndW1lbnRzWzJdKSA/ICdcXG5cXG5EaWQgeW91IGNhbGwgYXJyYXkubWFwKHVzZUNvbnRleHQpPyAnICsgJ0NhbGxpbmcgSG9va3MgaW5zaWRlIGEgbG9vcCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0xlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdGpzLm9yZy9saW5rL3J1bGVzLW9mLWhvb2tzJyA6ICcnKTtcbiAgICB9IC8vIFRPRE86IGFkZCBhIG1vcmUgZ2VuZXJpYyB3YXJuaW5nIGZvciBpbnZhbGlkIHZhbHVlcy5cblxuXG4gICAgaWYgKENvbnRleHQuX2NvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFyIHJlYWxDb250ZXh0ID0gQ29udGV4dC5fY29udGV4dDsgLy8gRG9uJ3QgZGVkdXBsaWNhdGUgYmVjYXVzZSB0aGlzIGxlZ2l0aW1hdGVseSBjYXVzZXMgYnVnc1xuICAgICAgLy8gYW5kIG5vYm9keSBzaG91bGQgYmUgdXNpbmcgdGhpcyBpbiBleGlzdGluZyBjb2RlLlxuXG4gICAgICBpZiAocmVhbENvbnRleHQuQ29uc3VtZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkLCBtYXkgY2F1c2UgYnVncywgYW5kIHdpbGwgYmUgJyArICdyZW1vdmVkIGluIGEgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH0gZWxzZSBpZiAocmVhbENvbnRleHQuUHJvdmlkZXIgPT09IENvbnRleHQpIHtcbiAgICAgICAgZXJyb3IoJ0NhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LlByb3ZpZGVyKSBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cyk7XG59XG5mdW5jdGlvbiB1c2VTdGF0ZShpbml0aWFsU3RhdGUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xufVxuZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbn1cbmZ1bmN0aW9uIHVzZVJlZihpbml0aWFsVmFsdWUpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbn1cbmZ1bmN0aW9uIHVzZUVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUNhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTWVtbyhjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VNZW1vKGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gIHZhciBkaXNwYXRjaGVyID0gcmVzb2x2ZURpc3BhdGNoZXIoKTtcbiAgcmV0dXJuIGRpc3BhdGNoZXIudXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VEZWJ1Z1ZhbHVlKHZhbHVlLCBmb3JtYXR0ZXJGbikge1xuICB7XG4gICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgIHJldHVybiBkaXNwYXRjaGVyLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgfVxufVxuXG4vLyBIZWxwZXJzIHRvIHBhdGNoIGNvbnNvbGUubG9ncyB0byBhdm9pZCBsb2dnaW5nIGR1cmluZyBzaWRlLWVmZmVjdCBmcmVlXG4vLyByZXBsYXlpbmcgb24gcmVuZGVyIGZ1bmN0aW9uLiBUaGlzIGN1cnJlbnRseSBvbmx5IHBhdGNoZXMgdGhlIG9iamVjdFxuLy8gbGF6aWx5IHdoaWNoIHdvbid0IGNvdmVyIGlmIHRoZSBsb2cgZnVuY3Rpb24gd2FzIGV4dHJhY3RlZCBlYWdlcmx5LlxuLy8gV2UgY291bGQgYWxzbyBlYWdlcmx5IHBhdGNoIHRoZSBtZXRob2QuXG52YXIgZGlzYWJsZWREZXB0aCA9IDA7XG52YXIgcHJldkxvZztcbnZhciBwcmV2SW5mbztcbnZhciBwcmV2V2FybjtcbnZhciBwcmV2RXJyb3I7XG52YXIgcHJldkdyb3VwO1xudmFyIHByZXZHcm91cENvbGxhcHNlZDtcbnZhciBwcmV2R3JvdXBFbmQ7XG5cbmZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cblxuZGlzYWJsZWRMb2cuX19yZWFjdERpc2FibGVkTG9nID0gdHJ1ZTtcbmZ1bmN0aW9uIGRpc2FibGVMb2dzKCkge1xuICB7XG4gICAgaWYgKGRpc2FibGVkRGVwdGggPT09IDApIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgICAgcHJldkxvZyA9IGNvbnNvbGUubG9nO1xuICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICBwcmV2V2FybiA9IGNvbnNvbGUud2FybjtcbiAgICAgIHByZXZFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkID0gY29uc29sZS5ncm91cENvbGxhcHNlZDtcbiAgICAgIHByZXZHcm91cEVuZCA9IGNvbnNvbGUuZ3JvdXBFbmQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTkwOTlcblxuICAgICAgdmFyIHByb3BzID0ge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBkaXNhYmxlZExvZyxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH07IC8vICRGbG93Rml4TWUgRmxvdyB0aGlua3MgY29uc29sZSBpcyBpbW11dGFibGUuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgaW5mbzogcHJvcHMsXG4gICAgICAgIGxvZzogcHJvcHMsXG4gICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICBlcnJvcjogcHJvcHMsXG4gICAgICAgIGdyb3VwOiBwcm9wcyxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICBncm91cEVuZDogcHJvcHNcbiAgICAgIH0pO1xuICAgICAgLyogZXNsaW50LWVuYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICB9XG5cbiAgICBkaXNhYmxlZERlcHRoKys7XG4gIH1cbn1cbmZ1bmN0aW9uIHJlZW5hYmxlTG9ncygpIHtcbiAge1xuICAgIGRpc2FibGVkRGVwdGgtLTtcblxuICAgIGlmIChkaXNhYmxlZERlcHRoID09PSAwKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZSByZWFjdC1pbnRlcm5hbC9uby1wcm9kdWN0aW9uLWxvZ2dpbmcgKi9cbiAgICAgIHZhciBwcm9wcyA9IHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfTsgLy8gJEZsb3dGaXhNZSBGbG93IHRoaW5rcyBjb25zb2xlIGlzIGltbXV0YWJsZS5cblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY29uc29sZSwge1xuICAgICAgICBsb2c6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZMb2dcbiAgICAgICAgfSksXG4gICAgICAgIGluZm86IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZJbmZvXG4gICAgICAgIH0pLFxuICAgICAgICB3YXJuOiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgIHZhbHVlOiBwcmV2V2FyblxuICAgICAgICB9KSxcbiAgICAgICAgZXJyb3I6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZFcnJvclxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXA6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cENvbGxhcHNlZFxuICAgICAgICB9KSxcbiAgICAgICAgZ3JvdXBFbmQ6IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICAgICAgdmFsdWU6IHByZXZHcm91cEVuZFxuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZyAqL1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZERlcHRoIDwgMCkge1xuICAgICAgZXJyb3IoJ2Rpc2FibGVkRGVwdGggZmVsbCBiZWxvdyB6ZXJvLiAnICsgJ1RoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcjtcbnZhciBwcmVmaXg7XG5mdW5jdGlvbiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyRm4pIHtcbiAge1xuICAgIGlmIChwcmVmaXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRXh0cmFjdCB0aGUgVk0gc3BlY2lmaWMgcHJlZml4IHVzZWQgYnkgZWFjaCBsaW5lLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgcHJlZml4ID0gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG4gICAgICB9XG4gICAgfSAvLyBXZSB1c2UgdGhlIHByZWZpeCB0byBlbnN1cmUgb3VyIHN0YWNrcyBsaW5lIHVwIHdpdGggbmF0aXZlIHN0YWNrIGZyYW1lcy5cblxuXG4gICAgcmV0dXJuICdcXG4nICsgcHJlZml4ICsgbmFtZTtcbiAgfVxufVxudmFyIHJlZW50cnkgPSBmYWxzZTtcbnZhciBjb21wb25lbnRGcmFtZUNhY2hlO1xuXG57XG4gIHZhciBQb3NzaWJseVdlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJyA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAvLyBJZiBzb21ldGhpbmcgYXNrZWQgZm9yIGEgc3RhY2sgaW5zaWRlIGEgZmFrZSByZW5kZXIsIGl0IHNob3VsZCBnZXQgaWdub3JlZC5cbiAgaWYgKCFmbiB8fCByZWVudHJ5KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAge1xuICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbnRyb2w7XG4gIHJlZW50cnkgPSB0cnVlO1xuICB2YXIgcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlOyAvLyAkRmxvd0ZpeE1lIEl0IGRvZXMgYWNjZXB0IHVuZGVmaW5lZC5cblxuICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHVuZGVmaW5lZDtcbiAgdmFyIHByZXZpb3VzRGlzcGF0Y2hlcjtcblxuICB7XG4gICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RDdXJyZW50RGlzcGF0Y2hlciQxLmN1cnJlbnQ7IC8vIFNldCB0aGUgZGlzcGF0Y2hlciBpbiBERVYgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGNhbGwgaW4gdGhlIHJlbmRlciBmdW5jdGlvblxuICAgIC8vIGZvciB3YXJuaW5ncy5cblxuICAgIFJlYWN0Q3VycmVudERpc3BhdGNoZXIkMS5jdXJyZW50ID0gbnVsbDtcbiAgICBkaXNhYmxlTG9ncygpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIHNob3VsZCB0aHJvdy5cbiAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAvLyBTb21ldGhpbmcgc2hvdWxkIGJlIHNldHRpbmcgdGhlIHByb3BzIGluIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIHZhciBGYWtlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgfTsgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGYWtlLnByb3RvdHlwZSwgJ3Byb3BzJywge1xuICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBXZSB1c2UgYSB0aHJvd2luZyBzZXR0ZXIgaW5zdGVhZCBvZiBmcm96ZW4gb3Igbm9uLXdyaXRhYmxlIHByb3BzXG4gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IHdvbid0IHRocm93IGluIGEgbm9uLXN0cmljdCBtb2RlIGZ1bmN0aW9uLlxuICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIGRpZmZlcmVudCBjb250cm9sIGZvciB0aGlzIGNhc2UgdG8gaW5jbHVkZSBhbnkgZXh0cmFcbiAgICAgICAgLy8gZnJhbWVzIGFkZGVkIGJ5IHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChGYWtlLCBbXSk7XG4gICAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgICBjb250cm9sID0geDtcbiAgICAgICAgfVxuXG4gICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICAgIH1cblxuICAgICAgICBmbi5jYWxsKEZha2UucHJvdG90eXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgY29udHJvbCA9IHg7XG4gICAgICB9XG5cbiAgICAgIGZuKCk7XG4gICAgfVxuICB9IGNhdGNoIChzYW1wbGUpIHtcbiAgICAvLyBUaGlzIGlzIGlubGluZWQgbWFudWFsbHkgYmVjYXVzZSBjbG9zdXJlIGRvZXNuJ3QgZG8gaXQgZm9yIHVzLlxuICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiB0eXBlb2Ygc2FtcGxlLnN0YWNrID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgc2FtcGxlIHRoYXQgaXNuJ3QgYWxzbyBpbiB0aGUgY29udHJvbC5cbiAgICAgIC8vIFNraXBwaW5nIG9uZSBmcmFtZSB0aGF0IHdlIGFzc3VtZSBpcyB0aGUgZnJhbWUgdGhhdCBjYWxscyB0aGUgdHdvLlxuICAgICAgdmFyIHNhbXBsZUxpbmVzID0gc2FtcGxlLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBjb250cm9sTGluZXMgPSBjb250cm9sLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgIHZhciBzID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBjID0gY29udHJvbExpbmVzLmxlbmd0aCAtIDE7XG5cbiAgICAgIHdoaWxlIChzID49IDEgJiYgYyA+PSAwICYmIHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgLy8gV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBzdGFjayBmcmFtZSB0byBiZSBzaGFyZWQuXG4gICAgICAgIC8vIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgdGhlIHJvb3QgbW9zdCBvbmUuIEhvd2V2ZXIsIHN0YWNrIGZyYW1lcyBtYXkgYmVcbiAgICAgICAgLy8gY3V0IG9mZiBkdWUgdG8gbWF4aW11bSBzdGFjayBsaW1pdHMuIEluIHRoaXMgY2FzZSwgb25lIG1heWJlIGN1dCBvZmZcbiAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBvdGhlci4gV2UgYXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBpcyBsb25nZXIgb3IgdGhlIHNhbWVcbiAgICAgICAgLy8gYW5kIHRoZXJlIGZvciBjdXQgb2ZmIGVhcmxpZXIuIFNvIHdlIHNob3VsZCBmaW5kIHRoZSByb290IG1vc3QgZnJhbWUgaW5cbiAgICAgICAgLy8gdGhlIHNhbXBsZSBzb21ld2hlcmUgaW4gdGhlIGNvbnRyb2wuXG4gICAgICAgIGMtLTtcbiAgICAgIH1cblxuICAgICAgZm9yICg7IHMgPj0gMSAmJiBjID49IDA7IHMtLSwgYy0tKSB7XG4gICAgICAgIC8vIE5leHQgd2UgZmluZCB0aGUgZmlyc3Qgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgd2hpY2ggc2hvdWxkIGJlIHRoZVxuICAgICAgICAvLyBmcmFtZSB0aGF0IGNhbGxlZCBvdXIgc2FtcGxlIGZ1bmN0aW9uIGFuZCB0aGUgY29udHJvbC5cbiAgICAgICAgaWYgKHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAvLyBJbiBWOCwgdGhlIGZpcnN0IGxpbmUgaXMgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBidXQgb3RoZXIgVk1zIGRvbid0LlxuICAgICAgICAgIC8vIElmIHdlJ3JlIGFib3V0IHRvIHJldHVybiB0aGUgZmlyc3QgbGluZSwgYW5kIHRoZSBjb250cm9sIGlzIGFsc28gb24gdGhlIHNhbWVcbiAgICAgICAgICAvLyBsaW5lLCB0aGF0J3MgYSBwcmV0dHkgZ29vZCBpbmRpY2F0b3IgdGhhdCBvdXIgc2FtcGxlIHRocmV3IGF0IHNhbWUgbGluZSBhc1xuICAgICAgICAgIC8vIHRoZSBjb250cm9sLiBJLmUuIGJlZm9yZSB3ZSBlbnRlcmVkIHRoZSBzYW1wbGUgZnJhbWUuIFNvIHdlIGlnbm9yZSB0aGlzIHJlc3VsdC5cbiAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IHBhc3NlZCBhIGNsYXNzIHRvIGZ1bmN0aW9uIGNvbXBvbmVudCwgb3Igbm9uLWZ1bmN0aW9uLlxuICAgICAgICAgIGlmIChzICE9PSAxIHx8IGMgIT09IDEpIHtcbiAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgcy0tO1xuICAgICAgICAgICAgICBjLS07IC8vIFdlIG1heSBzdGlsbCBoYXZlIHNpbWlsYXIgaW50ZXJtZWRpYXRlIGZyYW1lcyBmcm9tIHRoZSBjb25zdHJ1Y3QgY2FsbC5cbiAgICAgICAgICAgICAgLy8gVGhlIG5leHQgb25lIHRoYXQgaXNuJ3QgdGhlIHNhbWUgc2hvdWxkIGJlIG91ciBtYXRjaCB0aG91Z2guXG5cbiAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IHNhbXBsZUxpbmVzW3NdICE9PSBjb250cm9sTGluZXNbY10pIHtcbiAgICAgICAgICAgICAgICAvLyBWOCBhZGRzIGEgXCJuZXdcIiBwcmVmaXggZm9yIG5hdGl2ZSBjbGFzc2VzLiBMZXQncyByZW1vdmUgaXQgdG8gbWFrZSBpdCBwcmV0dGllci5cbiAgICAgICAgICAgICAgICB2YXIgX2ZyYW1lID0gJ1xcbicgKyBzYW1wbGVMaW5lc1tzXS5yZXBsYWNlKCcgYXQgbmV3ICcsICcgYXQgJyk7XG5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEZyYW1lQ2FjaGUuc2V0KGZuLCBfZnJhbWUpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gLy8gUmV0dXJuIHRoZSBsaW5lIHdlIGZvdW5kLlxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZyYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChzID49IDEgJiYgYyA+PSAwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICByZWVudHJ5ID0gZmFsc2U7XG5cbiAgICB7XG4gICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyJDEuY3VycmVudCA9IHByZXZpb3VzRGlzcGF0Y2hlcjtcbiAgICAgIHJlZW5hYmxlTG9ncygpO1xuICAgIH1cblxuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJldmlvdXNQcmVwYXJlU3RhY2tUcmFjZTtcbiAgfSAvLyBGYWxsYmFjayB0byBqdXN0IHVzaW5nIHRoZSBuYW1lIGlmIHdlIGNvdWxkbid0IG1ha2UgaXQgdGhyb3cuXG5cblxuICB2YXIgbmFtZSA9IGZuID8gZm4uZGlzcGxheU5hbWUgfHwgZm4ubmFtZSA6ICcnO1xuICB2YXIgc3ludGhldGljRnJhbWUgPSBuYW1lID8gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUobmFtZSkgOiAnJztcblxuICB7XG4gICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHN5bnRoZXRpY0ZyYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3ludGhldGljRnJhbWU7XG59XG5mdW5jdGlvbiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUoZm4sIHNvdXJjZSwgb3duZXJGbikge1xuICB7XG4gICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHZhciBwcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICByZXR1cm4gISEocHJvdG90eXBlICYmIHByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKHR5cGUsIHNvdXJjZSwgb3duZXJGbikge1xuXG4gIGlmICh0eXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICB7XG4gICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZSh0eXBlLCBzaG91bGRDb25zdHJ1Y3QodHlwZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUodHlwZSk7XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIGV4cG9ydHMuU3VzcGVuc2U6XG4gICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoJ1N1c3BlbnNlJyk7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZSgnU3VzcGVuc2VMaXN0Jyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgIHJldHVybiBkZXNjcmliZUZ1bmN0aW9uQ29tcG9uZW50RnJhbWUodHlwZS5yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgLy8gTWVtbyBtYXkgY29udGFpbiBhbnkgY29tcG9uZW50IHR5cGUgc28gd2UgcmVjdXJzaXZlbHkgcmVzb2x2ZSBpdC5cbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUsIHNvdXJjZSwgb3duZXJGbik7XG5cbiAgICAgIGNhc2UgUkVBQ1RfQkxPQ0tfVFlQRTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZSh0eXBlLl9yZW5kZXIpO1xuXG4gICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAge1xuICAgICAgICAgIHZhciBsYXp5Q29tcG9uZW50ID0gdHlwZTtcbiAgICAgICAgICB2YXIgcGF5bG9hZCA9IGxhenlDb21wb25lbnQuX3BheWxvYWQ7XG4gICAgICAgICAgdmFyIGluaXQgPSBsYXp5Q29tcG9uZW50Ll9pbml0O1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIExhenkgbWF5IGNvbnRhaW4gYW55IGNvbXBvbmVudCB0eXBlIHNvIHdlIHJlY3Vyc2l2ZWx5IHJlc29sdmUgaXQuXG4gICAgICAgICAgICByZXR1cm4gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGluaXQocGF5bG9hZCksIHNvdXJjZSwgb3duZXJGbik7XG4gICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xudmFyIFJlYWN0RGVidWdDdXJyZW50RnJhbWUkMSA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlJlYWN0RGVidWdDdXJyZW50RnJhbWU7XG5cbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBzdGFjayA9IGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVihlbGVtZW50LnR5cGUsIGVsZW1lbnQuX3NvdXJjZSwgb3duZXIgPyBvd25lci50eXBlIDogbnVsbCk7XG4gICAgICBSZWFjdERlYnVnQ3VycmVudEZyYW1lJDEuc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSQxLnNldEV4dHJhU3RhY2tGcmFtZShudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50KSB7XG4gIHtcbiAgICAvLyAkRmxvd0ZpeE1lIFRoaXMgaXMgb2theSBidXQgRmxvdyBkb2Vzbid0IGtub3cgaXQuXG4gICAgdmFyIGhhcyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmIChoYXModHlwZVNwZWNzLCB0eXBlU3BlY05hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciQxID0gdm9pZCAwOyAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpZiAodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YXIgZXJyID0gRXJyb3IoKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiAnICsgbG9jYXRpb24gKyAnIHR5cGUgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyAnICsgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdICsgJ2AuJyArICdUaGlzIG9mdGVuIGhhcHBlbnMgYmVjYXVzZSBvZiB0eXBvcyBzdWNoIGFzIGBQcm9wVHlwZXMuZnVuY3Rpb25gIGluc3RlYWQgb2YgYFByb3BUeXBlcy5mdW5jYC4nKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVycm9yJDEgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCcpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yJDEgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxICYmICEoZXJyb3IkMSBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMnICsgJyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IkMSk7XG5cbiAgICAgICAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciQxIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvciQxLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yJDEubWVzc2FnZV0gPSB0cnVlO1xuICAgICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgZXJyb3IoJ0ZhaWxlZCAlcyB0eXBlOiAlcycsIGxvY2F0aW9uLCBlcnJvciQxLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShlbGVtZW50KSB7XG4gIHtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlLCBlbGVtZW50Ll9zb3VyY2UsIG93bmVyID8gb3duZXIudHlwZSA6IG51bGwpO1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKHN0YWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RXh0cmFTdGFja0ZyYW1lKG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd247XG5cbntcbiAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSBmYWxzZTtcbn1cblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHNvdXJjZSkge1xuICBpZiAoc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmlsZU5hbWUgPSBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpO1xuICAgIHZhciBsaW5lTnVtYmVyID0gc291cmNlLmxpbmVOdW1iZXI7XG4gICAgcmV0dXJuICdcXG5cXG5DaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMuX19zb3VyY2UpO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cblxuXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuXG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50TmFtZSArIFwiPi5cIjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5mbztcbn1cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gIHZhciBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvID0gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKTtcblxuICBpZiAob3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3duZXJIYXNLZXlVc2VXYXJuaW5nW2N1cnJlbnRDb21wb25lbnRFcnJvckluZm9dID0gdHJ1ZTsgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG5cbiAgdmFyIGNoaWxkT3duZXIgPSAnJztcblxuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSBcIiBJdCB3YXMgcGFzc2VkIGEgY2hpbGQgZnJvbSBcIiArIGdldENvbXBvbmVudE5hbWUoZWxlbWVudC5fb3duZXIudHlwZSkgKyBcIi5cIjtcbiAgfVxuXG4gIHtcbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKGVsZW1lbnQpO1xuXG4gICAgZXJyb3IoJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lcik7XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudCQxKG51bGwpO1xuICB9XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGV2ZXJ5IGVsZW1lbnQgZWl0aGVyIGlzIHBhc3NlZCBpbiBhIHN0YXRpYyBsb2NhdGlvbiwgaW4gYW5cbiAqIGFycmF5IHdpdGggYW4gZXhwbGljaXQga2V5cyBwcm9wZXJ0eSBkZWZpbmVkLCBvciBpbiBhbiBvYmplY3QgbGl0ZXJhbFxuICogd2l0aCB2YWxpZCBrZXkgcHJvcGVydHkuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZSBTdGF0aWNhbGx5IHBhc3NlZCBjaGlsZCBvZiBhbnkgdHlwZS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBub2RlJ3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuXG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgIC8vIFRoaXMgZWxlbWVudCB3YXMgcGFzc2VkIGluIGEgdmFsaWQgbG9jYXRpb24uXG4gICAgaWYgKG5vZGUuX3N0b3JlKSB7XG4gICAgICBub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG5vZGUpO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBFbnRyeSBpdGVyYXRvcnMgdXNlZCB0byBwcm92aWRlIGltcGxpY2l0IGtleXMsXG4gICAgICAvLyBidXQgbm93IHdlIHByaW50IGEgc2VwYXJhdGUgd2FybmluZyBmb3IgdGhlbSBsYXRlci5cbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBub2RlLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG5vZGUpO1xuICAgICAgICB2YXIgc3RlcDtcblxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpIHtcbiAge1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwgfHwgdHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcm9wVHlwZXM7XG5cbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IC8vIE5vdGU6IE1lbW8gb25seSBjaGVja3Mgb3V0ZXIgcHJvcHMgaGVyZS5cbiAgICAvLyBJbm5lciBwcm9wcyBhcmUgY2hlY2tlZCBpbiB0aGUgcmVjb25jaWxlci5cbiAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUpKSB7XG4gICAgICBwcm9wVHlwZXMgPSB0eXBlLnByb3BUeXBlcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wVHlwZXMpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgaW5zaWRlIHRvIGF2b2lkIHRyaWdnZXJpbmcgbGF6eSBpbml0aWFsaXplcnM6XG4gICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0eXBlLlByb3BUeXBlcyAhPT0gdW5kZWZpbmVkICYmICFwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bikge1xuICAgICAgcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24gPSB0cnVlOyAvLyBJbnRlbnRpb25hbGx5IGluc2lkZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGxhenkgaW5pdGlhbGl6ZXJzOlxuXG4gICAgICB2YXIgX25hbWUgPSBnZXRDb21wb25lbnROYW1lKHR5cGUpO1xuXG4gICAgICBlcnJvcignQ29tcG9uZW50ICVzIGRlY2xhcmVkIGBQcm9wVHlwZXNgIGluc3RlYWQgb2YgYHByb3BUeXBlc2AuIERpZCB5b3UgbWlzc3BlbGwgdGhlIHByb3BlcnR5IGFzc2lnbm1lbnQ/JywgX25hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmcmFnbWVudC5wcm9wcyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuXG4gICAgICBpZiAoa2V5ICE9PSAnY2hpbGRyZW4nICYmIGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShmcmFnbWVudCk7XG5cbiAgICAgICAgZXJyb3IoJ0ludmFsaWQgcHJvcCBgJXNgIHN1cHBsaWVkIHRvIGBSZWFjdC5GcmFnbWVudGAuICcgKyAnUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCBhbmQgYGNoaWxkcmVuYCBwcm9wcy4nLCBrZXkpO1xuXG4gICAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEobnVsbCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmcmFnbWVudC5yZWYgIT09IG51bGwpIHtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50JDEoZnJhZ21lbnQpO1xuXG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcblxuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQkMShudWxsKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbih0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIHZhbGlkVHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKTsgLy8gV2Ugd2FybiBpbiB0aGlzIGNhc2UgYnV0IGRvbid0IHRocm93LiBXZSBleHBlY3QgdGhlIGVsZW1lbnQgY3JlYXRpb24gdG9cbiAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cblxuICBpZiAoIXZhbGlkVHlwZSkge1xuICAgIHZhciBpbmZvID0gJyc7XG5cbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyArPSAnIFlvdSBsaWtlbHkgZm9yZ290IHRvIGV4cG9ydCB5b3VyIGNvbXBvbmVudCBmcm9tIHRoZSBmaWxlICcgKyBcIml0J3MgZGVmaW5lZCBpbiwgb3IgeW91IG1pZ2h0IGhhdmUgbWl4ZWQgdXAgZGVmYXVsdCBhbmQgbmFtZWQgaW1wb3J0cy5cIjtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtRm9yUHJvcHMocHJvcHMpO1xuXG4gICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgIGluZm8gKz0gc291cmNlSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZVN0cmluZztcblxuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ251bGwnO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkge1xuICAgICAgdHlwZVN0cmluZyA9ICdhcnJheSc7XG4gICAgfSBlbHNlIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICB0eXBlU3RyaW5nID0gXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpIHx8ICdVbmtub3duJykgKyBcIiAvPlwiO1xuICAgICAgaW5mbyA9ICcgRGlkIHlvdSBhY2NpZGVudGFsbHkgZXhwb3J0IGEgSlNYIGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNvbXBvbmVudD8nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eXBlU3RyaW5nID0gdHlwZW9mIHR5cGU7XG4gICAgfVxuXG4gICAge1xuICAgICAgZXJyb3IoJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZVN0cmluZywgaW5mbyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGVsZW1lbnQgPSBjcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IC8vIFRoZSByZXN1bHQgY2FuIGJlIG51bGxpc2ggaWYgYSBtb2NrIG9yIGEgY3VzdG9tIGZ1bmN0aW9uIGlzIHVzZWQuXG4gIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cblxuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH0gLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgLy8gZG9lc24ndCBleHBlY3QgYSBub24tc3RyaW5nL2Z1bmN0aW9uIHR5cGUgYW5kIGNhbiB0aHJvdyBjb25mdXNpbmcgZXJyb3JzLlxuICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gIC8vIGZpeGVkLCB0aGUga2V5IHdhcm5pbmdzIHdpbGwgYXBwZWFyLilcblxuXG4gIGlmICh2YWxpZFR5cGUpIHtcbiAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZSA9PT0gZXhwb3J0cy5GcmFnbWVudCkge1xuICAgIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhlbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxudmFyIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gZmFsc2U7XG5mdW5jdGlvbiBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24odHlwZSkge1xuICB2YXIgdmFsaWRhdGVkRmFjdG9yeSA9IGNyZWF0ZUVsZW1lbnRXaXRoVmFsaWRhdGlvbi5iaW5kKG51bGwsIHR5cGUpO1xuICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gIHtcbiAgICBpZiAoIWRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5KSB7XG4gICAgICBkaWRXYXJuQWJvdXREZXByZWNhdGVkQ3JlYXRlRmFjdG9yeSA9IHRydWU7XG5cbiAgICAgIHdhcm4oJ1JlYWN0LmNyZWF0ZUZhY3RvcnkoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gJyArICdhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiBDb25zaWRlciB1c2luZyBKU1ggJyArICdvciB1c2UgUmVhY3QuY3JlYXRlRWxlbWVudCgpIGRpcmVjdGx5IGluc3RlYWQuJyk7XG4gICAgfSAvLyBMZWdhY3kgaG9vazogcmVtb3ZlIGl0XG5cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2YWxpZGF0ZWRGYWN0b3J5LCAndHlwZScsIHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHdhcm4oJ0ZhY3RvcnkudHlwZSBpcyBkZXByZWNhdGVkLiBBY2Nlc3MgdGhlIGNsYXNzIGRpcmVjdGx5ICcgKyAnYmVmb3JlIHBhc3NpbmcgaXQgdG8gY3JlYXRlRmFjdG9yeS4nKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG59XG5mdW5jdGlvbiBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbihlbGVtZW50LCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBjbG9uZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgfVxuXG4gIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICByZXR1cm4gbmV3RWxlbWVudDtcbn1cblxue1xuXG4gIHRyeSB7XG4gICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLW5ldyAqL1xuXG4gICAgbmV3IE1hcChbW2Zyb3plbk9iamVjdCwgbnVsbF1dKTtcbiAgICBuZXcgU2V0KFtmcm96ZW5PYmplY3RdKTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLW5ldyAqL1xuICB9IGNhdGNoIChlKSB7XG4gIH1cbn1cblxudmFyIGNyZWF0ZUVsZW1lbnQkMSA9ICBjcmVhdGVFbGVtZW50V2l0aFZhbGlkYXRpb24gO1xudmFyIGNsb25lRWxlbWVudCQxID0gIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbiA7XG52YXIgQ2hpbGRyZW4gPSB7XG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXksXG4gIG9ubHk6IG9ubHlDaGlsZFxufTtcblxuZXhwb3J0cy5DaGlsZHJlbiA9IENoaWxkcmVuO1xuZXhwb3J0cy5Db21wb25lbnQgPSBDb21wb25lbnQ7XG5leHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzO1xuZXhwb3J0cy5jbG9uZUVsZW1lbnQgPSBjbG9uZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ7XG5leHBvcnRzLmNyZWF0ZUVsZW1lbnQgPSBjcmVhdGVFbGVtZW50JDE7XG5leHBvcnRzLmNyZWF0ZUZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5O1xuZXhwb3J0cy5jcmVhdGVSZWYgPSBjcmVhdGVSZWY7XG5leHBvcnRzLmZvcndhcmRSZWYgPSBmb3J3YXJkUmVmO1xuZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuZXhwb3J0cy5sYXp5ID0gbGF6eTtcbmV4cG9ydHMubWVtbyA9IG1lbW87XG5leHBvcnRzLnVzZUNhbGxiYWNrID0gdXNlQ2FsbGJhY2s7XG5leHBvcnRzLnVzZUNvbnRleHQgPSB1c2VDb250ZXh0O1xuZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlID0gdXNlRGVidWdWYWx1ZTtcbmV4cG9ydHMudXNlRWZmZWN0ID0gdXNlRWZmZWN0O1xuZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gdXNlSW1wZXJhdGl2ZUhhbmRsZTtcbmV4cG9ydHMudXNlTGF5b3V0RWZmZWN0ID0gdXNlTGF5b3V0RWZmZWN0O1xuZXhwb3J0cy51c2VNZW1vID0gdXNlTWVtbztcbmV4cG9ydHMudXNlUmVkdWNlciA9IHVzZVJlZHVjZXI7XG5leHBvcnRzLnVzZVJlZiA9IHVzZVJlZjtcbmV4cG9ydHMudXNlU3RhdGUgPSB1c2VTdGF0ZTtcbmV4cG9ydHMudmVyc2lvbiA9IFJlYWN0VmVyc2lvbjtcbiAgfSkoKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjIwLjJcbiAqIHNjaGVkdWxlci10cmFjaW5nLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIERFRkFVTFRfVEhSRUFEX0lEID0gMDsgLy8gQ291bnRlcnMgdXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLlxuXG52YXIgaW50ZXJhY3Rpb25JRENvdW50ZXIgPSAwO1xudmFyIHRocmVhZElEQ291bnRlciA9IDA7IC8vIFNldCBvZiBjdXJyZW50bHkgdHJhY2VkIGludGVyYWN0aW9ucy5cbi8vIEludGVyYWN0aW9ucyBcInN0YWNrXCLigJNcbi8vIE1lYW5pbmcgdGhhdCBuZXdseSB0cmFjZWQgaW50ZXJhY3Rpb25zIGFyZSBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXNseSBhY3RpdmUgc2V0LlxuLy8gV2hlbiBhbiBpbnRlcmFjdGlvbiBnb2VzIG91dCBvZiBzY29wZSwgdGhlIHByZXZpb3VzIHNldCAoaWYgYW55KSBpcyByZXN0b3JlZC5cblxuZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZiA9IG51bGw7IC8vIExpc3RlbmVyKHMpIHRvIG5vdGlmeSB3aGVuIGludGVyYWN0aW9ucyBiZWdpbiBhbmQgZW5kLlxuXG5leHBvcnRzLl9fc3Vic2NyaWJlclJlZiA9IG51bGw7XG5cbntcbiAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZiA9IHtcbiAgICBjdXJyZW50OiBuZXcgU2V0KClcbiAgfTtcbiAgZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xufVxuZnVuY3Rpb24gdW5zdGFibGVfY2xlYXIoY2FsbGJhY2spIHtcblxuICB2YXIgcHJldkludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDtcbiAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gbmV3IFNldCgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH0gZmluYWxseSB7XG4gICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcbiAgfVxufVxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudCgpIHtcbiAge1xuICAgIHJldHVybiBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gIH1cbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX2dldFRocmVhZElEKCkge1xuICByZXR1cm4gKyt0aHJlYWRJRENvdW50ZXI7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV90cmFjZShuYW1lLCB0aW1lc3RhbXAsIGNhbGxiYWNrKSB7XG4gIHZhciB0aHJlYWRJRCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogREVGQVVMVF9USFJFQURfSUQ7XG5cbiAgdmFyIGludGVyYWN0aW9uID0ge1xuICAgIF9fY291bnQ6IDEsXG4gICAgaWQ6IGludGVyYWN0aW9uSURDb3VudGVyKyssXG4gICAgbmFtZTogbmFtZSxcbiAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcFxuICB9O1xuICB2YXIgcHJldkludGVyYWN0aW9ucyA9IGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudDsgLy8gVHJhY2VkIGludGVyYWN0aW9ucyBzaG91bGQgc3RhY2svYWNjdW11bGF0ZS5cbiAgLy8gVG8gZG8gdGhhdCwgY2xvbmUgdGhlIGN1cnJlbnQgaW50ZXJhY3Rpb25zLlxuICAvLyBUaGUgcHJldmlvdXMgc2V0IHdpbGwgYmUgcmVzdG9yZWQgdXBvbiBjb21wbGV0aW9uLlxuXG4gIHZhciBpbnRlcmFjdGlvbnMgPSBuZXcgU2V0KHByZXZJbnRlcmFjdGlvbnMpO1xuICBpbnRlcmFjdGlvbnMuYWRkKGludGVyYWN0aW9uKTtcbiAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gaW50ZXJhY3Rpb25zO1xuICB2YXIgc3Vic2NyaWJlciA9IGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG4gIHZhciByZXR1cm5WYWx1ZTtcblxuICB0cnkge1xuICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25UcmFjZWQoaW50ZXJhY3Rpb24pO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgc3Vic2NyaWJlci5vbldvcmtTdGFydGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IGNhbGxiYWNrKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQgPSBwcmV2SW50ZXJhY3Rpb25zO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RvcHBlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tOyAvLyBJZiBubyBhc3luYyB3b3JrIHdhcyBzY2hlZHVsZWQgZm9yIHRoaXMgaW50ZXJhY3Rpb24sXG4gICAgICAgICAgLy8gTm90aWZ5IHN1YnNjcmliZXJzIHRoYXQgaXQncyBjb21wbGV0ZWQuXG5cbiAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCAmJiBpbnRlcmFjdGlvbi5fX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5mdW5jdGlvbiB1bnN0YWJsZV93cmFwKGNhbGxiYWNrKSB7XG4gIHZhciB0aHJlYWRJRCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogREVGQVVMVF9USFJFQURfSUQ7XG5cbiAgdmFyIHdyYXBwZWRJbnRlcmFjdGlvbnMgPSBleHBvcnRzLl9faW50ZXJhY3Rpb25zUmVmLmN1cnJlbnQ7XG4gIHZhciBzdWJzY3JpYmVyID0gZXhwb3J0cy5fX3N1YnNjcmliZXJSZWYuY3VycmVudDtcblxuICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgIHN1YnNjcmliZXIub25Xb3JrU2NoZWR1bGVkKHdyYXBwZWRJbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgfSAvLyBVcGRhdGUgdGhlIHBlbmRpbmcgYXN5bmMgd29yayBjb3VudCBmb3IgdGhlIGN1cnJlbnQgaW50ZXJhY3Rpb25zLlxuICAvLyBVcGRhdGUgYWZ0ZXIgY2FsbGluZyBzdWJzY3JpYmVycyBpbiBjYXNlIG9mIGVycm9yLlxuXG5cbiAgd3JhcHBlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgIGludGVyYWN0aW9uLl9fY291bnQrKztcbiAgfSk7XG4gIHZhciBoYXNSdW4gPSBmYWxzZTtcblxuICBmdW5jdGlvbiB3cmFwcGVkKCkge1xuICAgIHZhciBwcmV2SW50ZXJhY3Rpb25zID0gZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50O1xuICAgIGV4cG9ydHMuX19pbnRlcmFjdGlvbnNSZWYuY3VycmVudCA9IHdyYXBwZWRJbnRlcmFjdGlvbnM7XG4gICAgc3Vic2NyaWJlciA9IGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHJldHVyblZhbHVlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoc3Vic2NyaWJlciAhPT0gbnVsbCkge1xuICAgICAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZCh3cmFwcGVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBjYWxsYmFjay5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZXhwb3J0cy5fX2ludGVyYWN0aW9uc1JlZi5jdXJyZW50ID0gcHJldkludGVyYWN0aW9ucztcblxuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQod3JhcHBlZEludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghaGFzUnVuKSB7XG4gICAgICAgIC8vIFdlIG9ubHkgZXhwZWN0IGEgd3JhcHBlZCBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBvbmNlLFxuICAgICAgICAvLyBCdXQgaW4gdGhlIGV2ZW50IHRoYXQgaXQncyBleGVjdXRlZCBtb3JlIHRoYW4gb25jZeKAk1xuICAgICAgICAvLyBPbmx5IGRlY3JlbWVudCB0aGUgb3V0c3RhbmRpbmcgaW50ZXJhY3Rpb24gY291bnRzIG9uY2UuXG4gICAgICAgIGhhc1J1biA9IHRydWU7IC8vIFVwZGF0ZSBwZW5kaW5nIGFzeW5jIGNvdW50cyBmb3IgYWxsIHdyYXBwZWQgaW50ZXJhY3Rpb25zLlxuICAgICAgICAvLyBJZiB0aGlzIHdhcyB0aGUgbGFzdCBzY2hlZHVsZWQgYXN5bmMgd29yayBmb3IgYW55IG9mIHRoZW0sXG4gICAgICAgIC8vIE1hcmsgdGhlbSBhcyBjb21wbGV0ZWQuXG5cbiAgICAgICAgd3JhcHBlZEludGVyYWN0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpbnRlcmFjdGlvbikge1xuICAgICAgICAgIGludGVyYWN0aW9uLl9fY291bnQtLTtcblxuICAgICAgICAgIGlmIChzdWJzY3JpYmVyICE9PSBudWxsICYmIGludGVyYWN0aW9uLl9fY291bnQgPT09IDApIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgd3JhcHBlZC5jYW5jZWwgPSBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgc3Vic2NyaWJlciA9IGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHN1YnNjcmliZXIgIT09IG51bGwpIHtcbiAgICAgICAgc3Vic2NyaWJlci5vbldvcmtDYW5jZWxlZCh3cmFwcGVkSW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFVwZGF0ZSBwZW5kaW5nIGFzeW5jIGNvdW50cyBmb3IgYWxsIHdyYXBwZWQgaW50ZXJhY3Rpb25zLlxuICAgICAgLy8gSWYgdGhpcyB3YXMgdGhlIGxhc3Qgc2NoZWR1bGVkIGFzeW5jIHdvcmsgZm9yIGFueSBvZiB0aGVtLFxuICAgICAgLy8gTWFyayB0aGVtIGFzIGNvbXBsZXRlZC5cbiAgICAgIHdyYXBwZWRJbnRlcmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgaW50ZXJhY3Rpb24uX19jb3VudC0tO1xuXG4gICAgICAgIGlmIChzdWJzY3JpYmVyICYmIGludGVyYWN0aW9uLl9fY291bnQgPT09IDApIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB3cmFwcGVkO1xufVxuXG52YXIgc3Vic2NyaWJlcnMgPSBudWxsO1xuXG57XG4gIHN1YnNjcmliZXJzID0gbmV3IFNldCgpO1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9zdWJzY3JpYmUoc3Vic2NyaWJlcikge1xuICB7XG4gICAgc3Vic2NyaWJlcnMuYWRkKHN1YnNjcmliZXIpO1xuXG4gICAgaWYgKHN1YnNjcmliZXJzLnNpemUgPT09IDEpIHtcbiAgICAgIGV4cG9ydHMuX19zdWJzY3JpYmVyUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIG9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkOiBvbkludGVyYWN0aW9uU2NoZWR1bGVkV29ya0NvbXBsZXRlZCxcbiAgICAgICAgb25JbnRlcmFjdGlvblRyYWNlZDogb25JbnRlcmFjdGlvblRyYWNlZCxcbiAgICAgICAgb25Xb3JrQ2FuY2VsZWQ6IG9uV29ya0NhbmNlbGVkLFxuICAgICAgICBvbldvcmtTY2hlZHVsZWQ6IG9uV29ya1NjaGVkdWxlZCxcbiAgICAgICAgb25Xb3JrU3RhcnRlZDogb25Xb3JrU3RhcnRlZCxcbiAgICAgICAgb25Xb3JrU3RvcHBlZDogb25Xb3JrU3RvcHBlZFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHVuc3RhYmxlX3Vuc3Vic2NyaWJlKHN1YnNjcmliZXIpIHtcbiAge1xuICAgIHN1YnNjcmliZXJzLmRlbGV0ZShzdWJzY3JpYmVyKTtcblxuICAgIGlmIChzdWJzY3JpYmVycy5zaXplID09PSAwKSB7XG4gICAgICBleHBvcnRzLl9fc3Vic2NyaWJlclJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gb25JbnRlcmFjdGlvblRyYWNlZChpbnRlcmFjdGlvbikge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25JbnRlcmFjdGlvblRyYWNlZChpbnRlcmFjdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25JbnRlcmFjdGlvblNjaGVkdWxlZFdvcmtDb21wbGV0ZWQoaW50ZXJhY3Rpb24pIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uSW50ZXJhY3Rpb25TY2hlZHVsZWRXb3JrQ29tcGxldGVkKGludGVyYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTY2hlZHVsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCkge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU2NoZWR1bGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWRpZENhdGNoRXJyb3IpIHtcbiAgICAgICAgZGlkQ2F0Y2hFcnJvciA9IHRydWU7XG4gICAgICAgIGNhdWdodEVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBpZiAoZGlkQ2F0Y2hFcnJvcikge1xuICAgIHRocm93IGNhdWdodEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIG9uV29ya1N0YXJ0ZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCkge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrU3RhcnRlZChpbnRlcmFjdGlvbnMsIHRocmVhZElEKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFkaWRDYXRjaEVycm9yKSB7XG4gICAgICAgIGRpZENhdGNoRXJyb3IgPSB0cnVlO1xuICAgICAgICBjYXVnaHRFcnJvciA9IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRpZENhdGNoRXJyb3IpIHtcbiAgICB0aHJvdyBjYXVnaHRFcnJvcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBvbldvcmtTdG9wcGVkKGludGVyYWN0aW9ucywgdGhyZWFkSUQpIHtcbiAgdmFyIGRpZENhdGNoRXJyb3IgPSBmYWxzZTtcbiAgdmFyIGNhdWdodEVycm9yID0gbnVsbDtcbiAgc3Vic2NyaWJlcnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaWJlcikge1xuICAgIHRyeSB7XG4gICAgICBzdWJzY3JpYmVyLm9uV29ya1N0b3BwZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25Xb3JrQ2FuY2VsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCkge1xuICB2YXIgZGlkQ2F0Y2hFcnJvciA9IGZhbHNlO1xuICB2YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICBzdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpYmVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmliZXIub25Xb3JrQ2FuY2VsZWQoaW50ZXJhY3Rpb25zLCB0aHJlYWRJRCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghZGlkQ2F0Y2hFcnJvcikge1xuICAgICAgICBkaWRDYXRjaEVycm9yID0gdHJ1ZTtcbiAgICAgICAgY2F1Z2h0RXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGlmIChkaWRDYXRjaEVycm9yKSB7XG4gICAgdGhyb3cgY2F1Z2h0RXJyb3I7XG4gIH1cbn1cblxuZXhwb3J0cy51bnN0YWJsZV9jbGVhciA9IHVuc3RhYmxlX2NsZWFyO1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50ID0gdW5zdGFibGVfZ2V0Q3VycmVudDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0VGhyZWFkSUQgPSB1bnN0YWJsZV9nZXRUaHJlYWRJRDtcbmV4cG9ydHMudW5zdGFibGVfc3Vic2NyaWJlID0gdW5zdGFibGVfc3Vic2NyaWJlO1xuZXhwb3J0cy51bnN0YWJsZV90cmFjZSA9IHVuc3RhYmxlX3RyYWNlO1xuZXhwb3J0cy51bnN0YWJsZV91bnN1YnNjcmliZSA9IHVuc3RhYmxlX3Vuc3Vic2NyaWJlO1xuZXhwb3J0cy51bnN0YWJsZV93cmFwID0gdW5zdGFibGVfd3JhcDtcbiAgfSkoKTtcbn1cbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MC4yMC4yXG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5hYmxlU2NoZWR1bGVyRGVidWdnaW5nID0gZmFsc2U7XG52YXIgZW5hYmxlUHJvZmlsaW5nID0gZmFsc2U7XG5cbnZhciByZXF1ZXN0SG9zdENhbGxiYWNrO1xudmFyIHJlcXVlc3RIb3N0VGltZW91dDtcbnZhciBjYW5jZWxIb3N0VGltZW91dDtcbnZhciByZXF1ZXN0UGFpbnQ7XG52YXIgaGFzUGVyZm9ybWFuY2VOb3cgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICdvYmplY3QnICYmIHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgPT09ICdmdW5jdGlvbic7XG5cbmlmIChoYXNQZXJmb3JtYW5jZU5vdykge1xuICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuXG4gIGV4cG9ydHMudW5zdGFibGVfbm93ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBsb2NhbFBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgdmFyIGxvY2FsRGF0ZSA9IERhdGU7XG4gIHZhciBpbml0aWFsVGltZSA9IGxvY2FsRGF0ZS5ub3coKTtcblxuICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbG9jYWxEYXRlLm5vdygpIC0gaW5pdGlhbFRpbWU7XG4gIH07XG59XG5cbmlmICggLy8gSWYgU2NoZWR1bGVyIHJ1bnMgaW4gYSBub24tRE9NIGVudmlyb25tZW50LCBpdCBmYWxscyBiYWNrIHRvIGEgbmFpdmVcbi8vIGltcGxlbWVudGF0aW9uIHVzaW5nIHNldFRpbWVvdXQuXG50eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fCAvLyBDaGVjayBpZiBNZXNzYWdlQ2hhbm5lbCBpcyBzdXBwb3J0ZWQsIHRvby5cbnR5cGVvZiBNZXNzYWdlQ2hhbm5lbCAhPT0gJ2Z1bmN0aW9uJykge1xuICAvLyBJZiB0aGlzIGFjY2lkZW50YWxseSBnZXRzIGltcG9ydGVkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIGUuZy4gSmF2YVNjcmlwdENvcmUsXG4gIC8vIGZhbGxiYWNrIHRvIGEgbmFpdmUgaW1wbGVtZW50YXRpb24uXG4gIHZhciBfY2FsbGJhY2sgPSBudWxsO1xuICB2YXIgX3RpbWVvdXRJRCA9IG51bGw7XG5cbiAgdmFyIF9mbHVzaENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgIHZhciBoYXNSZW1haW5pbmdUaW1lID0gdHJ1ZTtcblxuICAgICAgICBfY2FsbGJhY2soaGFzUmVtYWluaW5nVGltZSwgY3VycmVudFRpbWUpO1xuXG4gICAgICAgIF9jYWxsYmFjayA9IG51bGw7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoX2ZsdXNoQ2FsbGJhY2ssIDApO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXF1ZXN0SG9zdENhbGxiYWNrID0gZnVuY3Rpb24gKGNiKSB7XG4gICAgaWYgKF9jYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IHJlLWVudHJhbmN5LlxuICAgICAgc2V0VGltZW91dChyZXF1ZXN0SG9zdENhbGxiYWNrLCAwLCBjYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9jYWxsYmFjayA9IGNiO1xuICAgICAgc2V0VGltZW91dChfZmx1c2hDYWxsYmFjaywgMCk7XG4gICAgfVxuICB9O1xuXG4gIHJlcXVlc3RIb3N0VGltZW91dCA9IGZ1bmN0aW9uIChjYiwgbXMpIHtcbiAgICBfdGltZW91dElEID0gc2V0VGltZW91dChjYiwgbXMpO1xuICB9O1xuXG4gIGNhbmNlbEhvc3RUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dChfdGltZW91dElEKTtcbiAgfTtcblxuICBleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXF1ZXN0UGFpbnQgPSBleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZnVuY3Rpb24gKCkge307XG59IGVsc2Uge1xuICAvLyBDYXB0dXJlIGxvY2FsIHJlZmVyZW5jZXMgdG8gbmF0aXZlIEFQSXMsIGluIGNhc2UgYSBwb2x5ZmlsbCBvdmVycmlkZXMgdGhlbS5cbiAgdmFyIF9zZXRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQ7XG4gIHZhciBfY2xlYXJUaW1lb3V0ID0gd2luZG93LmNsZWFyVGltZW91dDtcblxuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gVE9ETzogU2NoZWR1bGVyIG5vIGxvbmdlciByZXF1aXJlcyB0aGVzZSBtZXRob2RzIHRvIGJlIHBvbHlmaWxsZWQuIEJ1dFxuICAgIC8vIG1heWJlIHdlIHdhbnQgdG8gY29udGludWUgd2FybmluZyBpZiB0aGV5IGRvbid0IGV4aXN0LCB0byBwcmVzZXJ2ZSB0aGVcbiAgICAvLyBvcHRpb24gdG8gcmVseSBvbiBpdCBpbiB0aGUgZnV0dXJlP1xuICAgIHZhciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO1xuICAgIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZTtcblxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBVc2luZyBjb25zb2xlWydlcnJvciddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcbiAgICAgIGNvbnNvbGVbJ2Vycm9yJ10oXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RBbmltYXRpb25GcmFtZS4gXCIgKyAnTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYW5jZWxBbmltYXRpb25GcmFtZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgICBjb25zb2xlWydlcnJvciddKFwiVGhpcyBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjYW5jZWxBbmltYXRpb25GcmFtZS4gXCIgKyAnTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSAnICsgJ3BvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0anMub3JnL2xpbmsvcmVhY3QtcG9seWZpbGxzJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gIHZhciBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICB2YXIgdGFza1RpbWVvdXRJRCA9IC0xOyAvLyBTY2hlZHVsZXIgcGVyaW9kaWNhbGx5IHlpZWxkcyBpbiBjYXNlIHRoZXJlIGlzIG90aGVyIHdvcmsgb24gdGhlIG1haW5cbiAgLy8gdGhyZWFkLCBsaWtlIHVzZXIgZXZlbnRzLiBCeSBkZWZhdWx0LCBpdCB5aWVsZHMgbXVsdGlwbGUgdGltZXMgcGVyIGZyYW1lLlxuICAvLyBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIGFsaWduIHdpdGggZnJhbWUgYm91bmRhcmllcywgc2luY2UgbW9zdCB0YXNrcyBkb24ndFxuICAvLyBuZWVkIHRvIGJlIGZyYW1lIGFsaWduZWQ7IGZvciB0aG9zZSB0aGF0IGRvLCB1c2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lLlxuXG4gIHZhciB5aWVsZEludGVydmFsID0gNTtcbiAgdmFyIGRlYWRsaW5lID0gMDsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuXG4gIHtcbiAgICAvLyBgaXNJbnB1dFBlbmRpbmdgIGlzIG5vdCBhdmFpbGFibGUuIFNpbmNlIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgaWZcbiAgICAvLyB0aGVyZSdzIHBlbmRpbmcgaW5wdXQsIGFsd2F5cyB5aWVsZCBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZS5cbiAgICBleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMudW5zdGFibGVfbm93KCkgPj0gZGVhZGxpbmU7XG4gICAgfTsgLy8gU2luY2Ugd2UgeWllbGQgZXZlcnkgZnJhbWUgcmVnYXJkbGVzcywgYHJlcXVlc3RQYWludGAgaGFzIG5vIGVmZmVjdC5cblxuXG4gICAgcmVxdWVzdFBhaW50ID0gZnVuY3Rpb24gKCkge307XG4gIH1cblxuICBleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZnVuY3Rpb24gKGZwcykge1xuICAgIGlmIChmcHMgPCAwIHx8IGZwcyA+IDEyNSkge1xuICAgICAgLy8gVXNpbmcgY29uc29sZVsnZXJyb3InXSB0byBldmFkZSBCYWJlbCBhbmQgRVNMaW50XG4gICAgICBjb25zb2xlWydlcnJvciddKCdmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgJyArICdmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmcHMgPiAwKSB7XG4gICAgICB5aWVsZEludGVydmFsID0gTWF0aC5mbG9vcigxMDAwIC8gZnBzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVzZXQgdGhlIGZyYW1lcmF0ZVxuICAgICAgeWllbGRJbnRlcnZhbCA9IDU7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjaGVkdWxlZEhvc3RDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTsgLy8gWWllbGQgYWZ0ZXIgYHlpZWxkSW50ZXJ2YWxgIG1zLCByZWdhcmRsZXNzIG9mIHdoZXJlIHdlIGFyZSBpbiB0aGUgdnN5bmNcbiAgICAgIC8vIGN5Y2xlLiBUaGlzIG1lYW5zIHRoZXJlJ3MgYWx3YXlzIHRpbWUgcmVtYWluaW5nIGF0IHRoZSBiZWdpbm5pbmcgb2ZcbiAgICAgIC8vIHRoZSBtZXNzYWdlIGV2ZW50LlxuXG4gICAgICBkZWFkbGluZSA9IGN1cnJlbnRUaW1lICsgeWllbGRJbnRlcnZhbDtcbiAgICAgIHZhciBoYXNUaW1lUmVtYWluaW5nID0gdHJ1ZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIGhhc01vcmVXb3JrID0gc2NoZWR1bGVkSG9zdENhbGxiYWNrKGhhc1RpbWVSZW1haW5pbmcsIGN1cnJlbnRUaW1lKTtcblxuICAgICAgICBpZiAoIWhhc01vcmVXb3JrKSB7XG4gICAgICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICBzY2hlZHVsZWRIb3N0Q2FsbGJhY2sgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZXJlJ3MgbW9yZSB3b3JrLCBzY2hlZHVsZSB0aGUgbmV4dCBtZXNzYWdlIGV2ZW50IGF0IHRoZSBlbmRcbiAgICAgICAgICAvLyBvZiB0aGUgcHJlY2VkaW5nIG9uZS5cbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiBhIHNjaGVkdWxlciB0YXNrIHRocm93cywgZXhpdCB0aGUgY3VycmVudCBicm93c2VyIHRhc2sgc28gdGhlXG4gICAgICAgIC8vIGVycm9yIGNhbiBiZSBvYnNlcnZlZC5cbiAgICAgICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gZmFsc2U7XG4gICAgfSAvLyBZaWVsZGluZyB0byB0aGUgYnJvd3NlciB3aWxsIGdpdmUgaXQgYSBjaGFuY2UgdG8gcGFpbnQsIHNvIHdlIGNhblxuICB9O1xuXG4gIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gIHZhciBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBwZXJmb3JtV29ya1VudGlsRGVhZGxpbmU7XG5cbiAgcmVxdWVzdEhvc3RDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIHNjaGVkdWxlZEhvc3RDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgaWYgKCFpc01lc3NhZ2VMb29wUnVubmluZykge1xuICAgICAgaXNNZXNzYWdlTG9vcFJ1bm5pbmcgPSB0cnVlO1xuICAgICAgcG9ydC5wb3N0TWVzc2FnZShudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgcmVxdWVzdEhvc3RUaW1lb3V0ID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBtcykge1xuICAgIHRhc2tUaW1lb3V0SUQgPSBfc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsYmFjayhleHBvcnRzLnVuc3RhYmxlX25vdygpKTtcbiAgICB9LCBtcyk7XG4gIH07XG5cbiAgY2FuY2VsSG9zdFRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX2NsZWFyVGltZW91dCh0YXNrVGltZW91dElEKTtcblxuICAgIHRhc2tUaW1lb3V0SUQgPSAtMTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHVzaChoZWFwLCBub2RlKSB7XG4gIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICBoZWFwLnB1c2gobm9kZSk7XG4gIHNpZnRVcChoZWFwLCBub2RlLCBpbmRleCk7XG59XG5mdW5jdGlvbiBwZWVrKGhlYXApIHtcbiAgdmFyIGZpcnN0ID0gaGVhcFswXTtcbiAgcmV0dXJuIGZpcnN0ID09PSB1bmRlZmluZWQgPyBudWxsIDogZmlyc3Q7XG59XG5mdW5jdGlvbiBwb3AoaGVhcCkge1xuICB2YXIgZmlyc3QgPSBoZWFwWzBdO1xuXG4gIGlmIChmaXJzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGxhc3QgPSBoZWFwLnBvcCgpO1xuXG4gICAgaWYgKGxhc3QgIT09IGZpcnN0KSB7XG4gICAgICBoZWFwWzBdID0gbGFzdDtcbiAgICAgIHNpZnREb3duKGhlYXAsIGxhc3QsIDApO1xuICAgIH1cblxuICAgIHJldHVybiBmaXJzdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaWZ0VXAoaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIHBhcmVudEluZGV4ID0gaW5kZXggLSAxID4+PiAxO1xuICAgIHZhciBwYXJlbnQgPSBoZWFwW3BhcmVudEluZGV4XTtcblxuICAgIGlmIChwYXJlbnQgIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlKHBhcmVudCwgbm9kZSkgPiAwKSB7XG4gICAgICAvLyBUaGUgcGFyZW50IGlzIGxhcmdlci4gU3dhcCBwb3NpdGlvbnMuXG4gICAgICBoZWFwW3BhcmVudEluZGV4XSA9IG5vZGU7XG4gICAgICBoZWFwW2luZGV4XSA9IHBhcmVudDtcbiAgICAgIGluZGV4ID0gcGFyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZSBwYXJlbnQgaXMgc21hbGxlci4gRXhpdC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gc2lmdERvd24oaGVhcCwgbm9kZSwgaSkge1xuICB2YXIgaW5kZXggPSBpO1xuICB2YXIgbGVuZ3RoID0gaGVhcC5sZW5ndGg7XG5cbiAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgdmFyIGxlZnRJbmRleCA9IChpbmRleCArIDEpICogMiAtIDE7XG4gICAgdmFyIGxlZnQgPSBoZWFwW2xlZnRJbmRleF07XG4gICAgdmFyIHJpZ2h0SW5kZXggPSBsZWZ0SW5kZXggKyAxO1xuICAgIHZhciByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07IC8vIElmIHRoZSBsZWZ0IG9yIHJpZ2h0IG5vZGUgaXMgc21hbGxlciwgc3dhcCB3aXRoIHRoZSBzbWFsbGVyIG9mIHRob3NlLlxuXG4gICAgaWYgKGxlZnQgIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlKGxlZnQsIG5vZGUpIDwgMCkge1xuICAgICAgaWYgKHJpZ2h0ICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZShyaWdodCwgbGVmdCkgPCAwKSB7XG4gICAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICAgIGhlYXBbcmlnaHRJbmRleF0gPSBub2RlO1xuICAgICAgICBpbmRleCA9IHJpZ2h0SW5kZXg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWFwW2luZGV4XSA9IGxlZnQ7XG4gICAgICAgIGhlYXBbbGVmdEluZGV4XSA9IG5vZGU7XG4gICAgICAgIGluZGV4ID0gbGVmdEluZGV4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmlnaHQgIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlKHJpZ2h0LCBub2RlKSA8IDApIHtcbiAgICAgIGhlYXBbaW5kZXhdID0gcmlnaHQ7XG4gICAgICBoZWFwW3JpZ2h0SW5kZXhdID0gbm9kZTtcbiAgICAgIGluZGV4ID0gcmlnaHRJbmRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTmVpdGhlciBjaGlsZCBpcyBzbWFsbGVyLiBFeGl0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgLy8gQ29tcGFyZSBzb3J0IGluZGV4IGZpcnN0LCB0aGVuIHRhc2sgaWQuXG4gIHZhciBkaWZmID0gYS5zb3J0SW5kZXggLSBiLnNvcnRJbmRleDtcbiAgcmV0dXJuIGRpZmYgIT09IDAgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG59XG5cbi8vIFRPRE86IFVzZSBzeW1ib2xzP1xudmFyIEltbWVkaWF0ZVByaW9yaXR5ID0gMTtcbnZhciBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IDI7XG52YXIgTm9ybWFsUHJpb3JpdHkgPSAzO1xudmFyIExvd1ByaW9yaXR5ID0gNDtcbnZhciBJZGxlUHJpb3JpdHkgPSA1O1xuXG5mdW5jdGlvbiBtYXJrVGFza0Vycm9yZWQodGFzaywgbXMpIHtcbn1cblxuLyogZXNsaW50LWRpc2FibGUgbm8tdmFyICovXG4vLyBNYXRoLnBvdygyLCAzMCkgLSAxXG4vLyAwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVxuXG52YXIgbWF4U2lnbmVkMzFCaXRJbnQgPSAxMDczNzQxODIzOyAvLyBUaW1lcyBvdXQgaW1tZWRpYXRlbHlcblxudmFyIElNTUVESUFURV9QUklPUklUWV9USU1FT1VUID0gLTE7IC8vIEV2ZW50dWFsbHkgdGltZXMgb3V0XG5cbnZhciBVU0VSX0JMT0NLSU5HX1BSSU9SSVRZX1RJTUVPVVQgPSAyNTA7XG52YXIgTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQgPSA1MDAwO1xudmFyIExPV19QUklPUklUWV9USU1FT1VUID0gMTAwMDA7IC8vIE5ldmVyIHRpbWVzIG91dFxuXG52YXIgSURMRV9QUklPUklUWV9USU1FT1VUID0gbWF4U2lnbmVkMzFCaXRJbnQ7IC8vIFRhc2tzIGFyZSBzdG9yZWQgb24gYSBtaW4gaGVhcFxuXG52YXIgdGFza1F1ZXVlID0gW107XG52YXIgdGltZXJRdWV1ZSA9IFtdOyAvLyBJbmNyZW1lbnRpbmcgaWQgY291bnRlci4gVXNlZCB0byBtYWludGFpbiBpbnNlcnRpb24gb3JkZXIuXG5cbnZhciB0YXNrSWRDb3VudGVyID0gMTsgLy8gUGF1c2luZyB0aGUgc2NoZWR1bGVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxudmFyIGN1cnJlbnRUYXNrID0gbnVsbDtcbnZhciBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5OyAvLyBUaGlzIGlzIHNldCB3aGlsZSBwZXJmb3JtaW5nIHdvcmssIHRvIHByZXZlbnQgcmUtZW50cmFuY3kuXG5cbnZhciBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG52YXIgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSBmYWxzZTtcbnZhciBpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgLy8gQ2hlY2sgZm9yIHRhc2tzIHRoYXQgYXJlIG5vIGxvbmdlciBkZWxheWVkIGFuZCBhZGQgdGhlbSB0byB0aGUgcXVldWUuXG4gIHZhciB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgd2hpbGUgKHRpbWVyICE9PSBudWxsKSB7XG4gICAgaWYgKHRpbWVyLmNhbGxiYWNrID09PSBudWxsKSB7XG4gICAgICAvLyBUaW1lciB3YXMgY2FuY2VsbGVkLlxuICAgICAgcG9wKHRpbWVyUXVldWUpO1xuICAgIH0gZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKSB7XG4gICAgICAvLyBUaW1lciBmaXJlZC4gVHJhbnNmZXIgdG8gdGhlIHRhc2sgcXVldWUuXG4gICAgICBwb3AodGltZXJRdWV1ZSk7XG4gICAgICB0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZTtcbiAgICAgIHB1c2godGFza1F1ZXVlLCB0aW1lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbWFpbmluZyB0aW1lcnMgYXJlIHBlbmRpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkKSB7XG4gICAgaWYgKHBlZWsodGFza1F1ZXVlKSAhPT0gbnVsbCkge1xuICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcmVxdWVzdEhvc3RDYWxsYmFjayhmbHVzaFdvcmspO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICAgIGlmIChmaXJzdFRpbWVyICE9PSBudWxsKSB7XG4gICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChoYW5kbGVUaW1lb3V0LCBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZmx1c2hXb3JrKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKSB7XG5cblxuICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gIGlmIChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkKSB7XG4gICAgLy8gV2Ugc2NoZWR1bGVkIGEgdGltZW91dCBidXQgaXQncyBubyBsb25nZXIgbmVlZGVkLiBDYW5jZWwgaXQuXG4gICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9IGZhbHNlO1xuICAgIGNhbmNlbEhvc3RUaW1lb3V0KCk7XG4gIH1cblxuICBpc1BlcmZvcm1pbmdXb3JrID0gdHJ1ZTtcbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuXG4gIHRyeSB7XG4gICAgaWYgKGVuYWJsZVByb2ZpbGluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHdvcmtMb29wKGhhc1RpbWVSZW1haW5pbmcsIGluaXRpYWxUaW1lKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChjdXJyZW50VGFzayAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgICAgbWFya1Rhc2tFcnJvcmVkKGN1cnJlbnRUYXNrLCBjdXJyZW50VGltZSk7XG4gICAgICAgICAgY3VycmVudFRhc2suaXNRdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBjYXRjaCBpbiBwcm9kIGNvZGUgcGF0aC5cbiAgICAgIHJldHVybiB3b3JrTG9vcChoYXNUaW1lUmVtYWluaW5nLCBpbml0aWFsVGltZSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGN1cnJlbnRUYXNrID0gbnVsbDtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICBpc1BlcmZvcm1pbmdXb3JrID0gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gd29ya0xvb3AoaGFzVGltZVJlbWFpbmluZywgaW5pdGlhbFRpbWUpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gaW5pdGlhbFRpbWU7XG4gIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcblxuICB3aGlsZSAoY3VycmVudFRhc2sgIT09IG51bGwgJiYgIShlbmFibGVTY2hlZHVsZXJEZWJ1Z2dpbmcgKSkge1xuICAgIGlmIChjdXJyZW50VGFzay5leHBpcmF0aW9uVGltZSA+IGN1cnJlbnRUaW1lICYmICghaGFzVGltZVJlbWFpbmluZyB8fCBleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkKCkpKSB7XG4gICAgICAvLyBUaGlzIGN1cnJlbnRUYXNrIGhhc24ndCBleHBpcmVkLCBhbmQgd2UndmUgcmVhY2hlZCB0aGUgZGVhZGxpbmUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgY2FsbGJhY2sgPSBjdXJyZW50VGFzay5jYWxsYmFjaztcblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gbnVsbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFRhc2sucHJpb3JpdHlMZXZlbDtcbiAgICAgIHZhciBkaWRVc2VyQ2FsbGJhY2tUaW1lb3V0ID0gY3VycmVudFRhc2suZXhwaXJhdGlvblRpbWUgPD0gY3VycmVudFRpbWU7XG5cbiAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKGRpZFVzZXJDYWxsYmFja1RpbWVvdXQpO1xuICAgICAgY3VycmVudFRpbWUgPSBleHBvcnRzLnVuc3RhYmxlX25vdygpO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1cnJlbnRUYXNrLmNhbGxiYWNrID0gY29udGludWF0aW9uQ2FsbGJhY2s7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmIChjdXJyZW50VGFzayA9PT0gcGVlayh0YXNrUXVldWUpKSB7XG4gICAgICAgICAgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcCh0YXNrUXVldWUpO1xuICAgIH1cblxuICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICB9IC8vIFJldHVybiB3aGV0aGVyIHRoZXJlJ3MgYWRkaXRpb25hbCB3b3JrXG5cblxuICBpZiAoY3VycmVudFRhc2sgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZmlyc3RUaW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG5cbiAgICBpZiAoZmlyc3RUaW1lciAhPT0gbnVsbCkge1xuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIGZpcnN0VGltZXIuc3RhcnRUaW1lIC0gY3VycmVudFRpbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkocHJpb3JpdHlMZXZlbCwgZXZlbnRIYW5kbGVyKSB7XG4gIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgY2FzZSBVc2VyQmxvY2tpbmdQcmlvcml0eTpcbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGNhc2UgTG93UHJpb3JpdHk6XG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICBwcmlvcml0eUxldmVsID0gTm9ybWFsUHJpb3JpdHk7XG4gIH1cblxuICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcblxuICB0cnkge1xuICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9uZXh0KGV2ZW50SGFuZGxlcikge1xuICB2YXIgcHJpb3JpdHlMZXZlbDtcblxuICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgY2FzZSBJbW1lZGlhdGVQcmlvcml0eTpcbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgIGNhc2UgTm9ybWFsUHJpb3JpdHk6XG4gICAgICAvLyBTaGlmdCBkb3duIHRvIG5vcm1hbCBwcmlvcml0eVxuICAgICAgcHJpb3JpdHlMZXZlbCA9IE5vcm1hbFByaW9yaXR5O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgLy8gQW55dGhpbmcgbG93ZXIgdGhhbiBub3JtYWwgcHJpb3JpdHkgc2hvdWxkIHJlbWFpbiBhdCB0aGUgY3VycmVudCBsZXZlbC5cbiAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgdmFyIHByZXZpb3VzUHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRQcmlvcml0eUxldmVsO1xuICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWw7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZXZlbnRIYW5kbGVyKCk7XG4gIH0gZmluYWxseSB7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwcmV2aW91c1ByaW9yaXR5TGV2ZWw7XG4gIH1cbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfd3JhcENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gVGhpcyBpcyBhIGZvcmsgb2YgcnVuV2l0aFByaW9yaXR5LCBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZS5cbiAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgY3VycmVudFByaW9yaXR5TGV2ZWwgPSBwYXJlbnRQcmlvcml0eUxldmVsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2socHJpb3JpdHlMZXZlbCwgY2FsbGJhY2ssIG9wdGlvbnMpIHtcbiAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgdmFyIHN0YXJ0VGltZTtcblxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMgIT09IG51bGwpIHtcbiAgICB2YXIgZGVsYXkgPSBvcHRpb25zLmRlbGF5O1xuXG4gICAgaWYgKHR5cGVvZiBkZWxheSA9PT0gJ251bWJlcicgJiYgZGVsYXkgPiAwKSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZSArIGRlbGF5O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFydFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc3RhcnRUaW1lID0gY3VycmVudFRpbWU7XG4gIH1cblxuICB2YXIgdGltZW91dDtcblxuICBzd2l0Y2ggKHByaW9yaXR5TGV2ZWwpIHtcbiAgICBjYXNlIEltbWVkaWF0ZVByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IElNTUVESUFURV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IFVTRVJfQkxPQ0tJTkdfUFJJT1JJVFlfVElNRU9VVDtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBJZGxlUHJpb3JpdHk6XG4gICAgICB0aW1lb3V0ID0gSURMRV9QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgdGltZW91dCA9IExPV19QUklPUklUWV9USU1FT1VUO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIE5vcm1hbFByaW9yaXR5OlxuICAgIGRlZmF1bHQ6XG4gICAgICB0aW1lb3V0ID0gTk9STUFMX1BSSU9SSVRZX1RJTUVPVVQ7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHZhciBleHBpcmF0aW9uVGltZSA9IHN0YXJ0VGltZSArIHRpbWVvdXQ7XG4gIHZhciBuZXdUYXNrID0ge1xuICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgIHByaW9yaXR5TGV2ZWw6IHByaW9yaXR5TGV2ZWwsXG4gICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgZXhwaXJhdGlvblRpbWU6IGV4cGlyYXRpb25UaW1lLFxuICAgIHNvcnRJbmRleDogLTFcbiAgfTtcblxuICBpZiAoc3RhcnRUaW1lID4gY3VycmVudFRpbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZGVsYXllZCB0YXNrLlxuICAgIG5ld1Rhc2suc29ydEluZGV4ID0gc3RhcnRUaW1lO1xuICAgIHB1c2godGltZXJRdWV1ZSwgbmV3VGFzayk7XG5cbiAgICBpZiAocGVlayh0YXNrUXVldWUpID09PSBudWxsICYmIG5ld1Rhc2sgPT09IHBlZWsodGltZXJRdWV1ZSkpIHtcbiAgICAgIC8vIEFsbCB0YXNrcyBhcmUgZGVsYXllZCwgYW5kIHRoaXMgaXMgdGhlIHRhc2sgd2l0aCB0aGUgZWFybGllc3QgZGVsYXkuXG4gICAgICBpZiAoaXNIb3N0VGltZW91dFNjaGVkdWxlZCkge1xuICAgICAgICAvLyBDYW5jZWwgYW4gZXhpc3RpbmcgdGltZW91dC5cbiAgICAgICAgY2FuY2VsSG9zdFRpbWVvdXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgfSAvLyBTY2hlZHVsZSBhIHRpbWVvdXQuXG5cblxuICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIHN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbmV3VGFzay5zb3J0SW5kZXggPSBleHBpcmF0aW9uVGltZTtcbiAgICBwdXNoKHRhc2tRdWV1ZSwgbmV3VGFzayk7XG4gICAgLy8gd2FpdCB1bnRpbCB0aGUgbmV4dCB0aW1lIHdlIHlpZWxkLlxuXG5cbiAgICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICByZXF1ZXN0SG9zdENhbGxiYWNrKGZsdXNoV29yayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld1Rhc2s7XG59XG5cbmZ1bmN0aW9uIHVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uKCkge1xufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbigpIHtcblxuICBpZiAoIWlzSG9zdENhbGxiYWNrU2NoZWR1bGVkICYmICFpc1BlcmZvcm1pbmdXb3JrKSB7XG4gICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHJlcXVlc3RIb3N0Q2FsbGJhY2soZmx1c2hXb3JrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZSgpIHtcbiAgcmV0dXJuIHBlZWsodGFza1F1ZXVlKTtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sodGFzaykge1xuICAvLyByZW1vdmUgZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB5b3UgY2FuJ3QgcmVtb3ZlIGFyYml0cmFyeSBub2RlcyBmcm9tIGFuXG4gIC8vIGFycmF5IGJhc2VkIGhlYXAsIG9ubHkgdGhlIGZpcnN0IG9uZS4pXG5cblxuICB0YXNrLmNhbGxiYWNrID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwoKSB7XG4gIHJldHVybiBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbn1cblxudmFyIHVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHJlcXVlc3RQYWludDtcbnZhciB1bnN0YWJsZV9Qcm9maWxpbmcgPSAgbnVsbDtcblxuZXhwb3J0cy51bnN0YWJsZV9JZGxlUHJpb3JpdHkgPSBJZGxlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5ID0gSW1tZWRpYXRlUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5ID0gTG93UHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHk7XG5leHBvcnRzLnVuc3RhYmxlX1Byb2ZpbGluZyA9IHVuc3RhYmxlX1Byb2ZpbGluZztcbmV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbmV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSB1bnN0YWJsZV9jYW5jZWxDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfY29udGludWVFeGVjdXRpb24gPSB1bnN0YWJsZV9jb250aW51ZUV4ZWN1dGlvbjtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSB1bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbDtcbmV4cG9ydHMudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGUgPSB1bnN0YWJsZV9nZXRGaXJzdENhbGxiYWNrTm9kZTtcbmV4cG9ydHMudW5zdGFibGVfbmV4dCA9IHVuc3RhYmxlX25leHQ7XG5leHBvcnRzLnVuc3RhYmxlX3BhdXNlRXhlY3V0aW9uID0gdW5zdGFibGVfcGF1c2VFeGVjdXRpb247XG5leHBvcnRzLnVuc3RhYmxlX3JlcXVlc3RQYWludCA9IHVuc3RhYmxlX3JlcXVlc3RQYWludDtcbmV4cG9ydHMudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5ID0gdW5zdGFibGVfcnVuV2l0aFByaW9yaXR5O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gdW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaztcbmV4cG9ydHMudW5zdGFibGVfd3JhcENhbGxiYWNrID0gdW5zdGFibGVfd3JhcENhbGxiYWNrO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXItdHJhY2luZy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXItdHJhY2luZy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbihyb290KSB7XG4gICAgY29uc3QgTUFYX1ZBTFVFID0gMHg3ZmZmZmZmZjtcblxuICAgIC8vIFRoZSBTSEEyNTYgYW5kIFBCS0RGMiBpbXBsZW1lbnRhdGlvbiBhcmUgZnJvbSBzY3J5cHQtYXN5bmMtanM6XG4gICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGNoZXN0L3NjcnlwdC1hc3luYy1qc1xuICAgIGZ1bmN0aW9uIFNIQTI1NihtKSB7XG4gICAgICAgIGNvbnN0IEsgPSBuZXcgVWludDMyQXJyYXkoW1xuICAgICAgICAgICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LCAweDM5NTZjMjViLFxuICAgICAgICAgICAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LCAweGQ4MDdhYTk4LCAweDEyODM1YjAxLFxuICAgICAgICAgICAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLCAweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LFxuICAgICAgICAgICAweGMxOWJmMTc0LCAweGU0OWI2OWMxLCAweGVmYmU0Nzg2LCAweDBmYzE5ZGM2LCAweDI0MGNhMWNjLFxuICAgICAgICAgICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLCAweDk4M2U1MTUyLFxuICAgICAgICAgICAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LFxuICAgICAgICAgICAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LCAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLFxuICAgICAgICAgICAweDUzMzgwZDEzLCAweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1LFxuICAgICAgICAgICAweGEyYmZlOGExLCAweGE4MWE2NjRiLCAweGMyNGI4YjcwLCAweGM3NmM1MWEzLCAweGQxOTJlODE5LFxuICAgICAgICAgICAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLCAweDE5YTRjMTE2LCAweDFlMzc2YzA4LFxuICAgICAgICAgICAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLFxuICAgICAgICAgICAweDY4MmU2ZmYzLCAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAgICAgICAgICAweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyXG4gICAgICAgXSk7XG5cbiAgICAgICAgbGV0IGgwID0gMHg2YTA5ZTY2NywgaDEgPSAweGJiNjdhZTg1LCBoMiA9IDB4M2M2ZWYzNzIsIGgzID0gMHhhNTRmZjUzYTtcbiAgICAgICAgbGV0IGg0ID0gMHg1MTBlNTI3ZiwgaDUgPSAweDliMDU2ODhjLCBoNiA9IDB4MWY4M2Q5YWIsIGg3ID0gMHg1YmUwY2QxOTtcbiAgICAgICAgY29uc3QgdyA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG5cbiAgICAgICAgZnVuY3Rpb24gYmxvY2tzKHApIHtcbiAgICAgICAgICAgIGxldCBvZmYgPSAwLCBsZW4gPSBwLmxlbmd0aDtcbiAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gNjQpIHtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IGgwLCBiID0gaDEsIGMgPSBoMiwgZCA9IGgzLCBlID0gaDQsIGYgPSBoNSwgZyA9IGg2LCBoID0gaDcsIHUsIGksIGosIHQxLCB0MjtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGogPSBvZmYgKyBpKjQ7XG4gICAgICAgICAgICAgICAgICAgIHdbaV0gPSAoKHBbal0gJiAweGZmKTw8MjQpIHwgKChwW2orMV0gJiAweGZmKTw8MTYpIHxcbiAgICAgICAgICAgICAgICAgICAgKChwW2orMl0gJiAweGZmKTw8OCkgfCAocFtqKzNdICYgMHhmZik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMTY7IGkgPCA2NDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHUgPSB3W2ktMl07XG4gICAgICAgICAgICAgICAgICAgIHQxID0gKCh1Pj4+MTcpIHwgKHU8PCgzMi0xNykpKSBeICgodT4+PjE5KSB8ICh1PDwoMzItMTkpKSkgXiAodT4+PjEwKTtcblxuICAgICAgICAgICAgICAgICAgICB1ID0gd1tpLTE1XTtcbiAgICAgICAgICAgICAgICAgICAgdDIgPSAoKHU+Pj43KSB8ICh1PDwoMzItNykpKSBeICgodT4+PjE4KSB8ICh1PDwoMzItMTgpKSkgXiAodT4+PjMpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdbaV0gPSAoKCh0MSArIHdbaS03XSkgfCAwKSArICgodDIgKyB3W2ktMTZdKSB8IDApKSB8IDA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdDEgPSAoKCgoKChlPj4+NikgfCAoZTw8KDMyLTYpKSkgXiAoKGU+Pj4xMSkgfCAoZTw8KDMyLTExKSkpIF5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlPj4+MjUpIHwgKGU8PCgzMi0yNSkpKSkgKyAoKGUgJiBmKSBeICh+ZSAmIGcpKSkgfCAwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgoaCArICgoS1tpXSArIHdbaV0pIHwgMCkpIHwgMCkpIHwgMDtcblxuICAgICAgICAgICAgICAgICAgICB0MiA9ICgoKChhPj4+MikgfCAoYTw8KDMyLTIpKSkgXiAoKGE+Pj4xMykgfCAoYTw8KDMyLTEzKSkpIF5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYT4+PjIyKSB8IChhPDwoMzItMjIpKSkpICsgKChhICYgYikgXiAoYSAmIGMpIF4gKGIgJiBjKSkpIHwgMDtcblxuICAgICAgICAgICAgICAgICAgICBoID0gZztcbiAgICAgICAgICAgICAgICAgICAgZyA9IGY7XG4gICAgICAgICAgICAgICAgICAgIGYgPSBlO1xuICAgICAgICAgICAgICAgICAgICBlID0gKGQgKyB0MSkgfCAwO1xuICAgICAgICAgICAgICAgICAgICBkID0gYztcbiAgICAgICAgICAgICAgICAgICAgYyA9IGI7XG4gICAgICAgICAgICAgICAgICAgIGIgPSBhO1xuICAgICAgICAgICAgICAgICAgICBhID0gKHQxICsgdDIpIHwgMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBoMCA9IChoMCArIGEpIHwgMDtcbiAgICAgICAgICAgICAgICBoMSA9IChoMSArIGIpIHwgMDtcbiAgICAgICAgICAgICAgICBoMiA9IChoMiArIGMpIHwgMDtcbiAgICAgICAgICAgICAgICBoMyA9IChoMyArIGQpIHwgMDtcbiAgICAgICAgICAgICAgICBoNCA9IChoNCArIGUpIHwgMDtcbiAgICAgICAgICAgICAgICBoNSA9IChoNSArIGYpIHwgMDtcbiAgICAgICAgICAgICAgICBoNiA9IChoNiArIGcpIHwgMDtcbiAgICAgICAgICAgICAgICBoNyA9IChoNyArIGgpIHwgMDtcblxuICAgICAgICAgICAgICAgIG9mZiArPSA2NDtcbiAgICAgICAgICAgICAgICBsZW4gLT0gNjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBibG9ja3MobSk7XG5cbiAgICAgICAgbGV0IGksIGJ5dGVzTGVmdCA9IG0ubGVuZ3RoICUgNjQsXG4gICAgICAgIGJpdExlbkhpID0gKG0ubGVuZ3RoIC8gMHgyMDAwMDAwMCkgfCAwLFxuICAgICAgICBiaXRMZW5MbyA9IG0ubGVuZ3RoIDw8IDMsXG4gICAgICAgIG51bVplcm9zID0gKGJ5dGVzTGVmdCA8IDU2KSA/IDU2IDogMTIwLFxuICAgICAgICBwID0gbS5zbGljZShtLmxlbmd0aCAtIGJ5dGVzTGVmdCwgbS5sZW5ndGgpO1xuXG4gICAgICAgIHAucHVzaCgweDgwKTtcbiAgICAgICAgZm9yIChpID0gYnl0ZXNMZWZ0ICsgMTsgaSA8IG51bVplcm9zOyBpKyspIHsgcC5wdXNoKDApOyB9XG4gICAgICAgIHAucHVzaCgoYml0TGVuSGkgPj4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwLnB1c2goKGJpdExlbkhpID4+PiAxNikgJiAweGZmKTtcbiAgICAgICAgcC5wdXNoKChiaXRMZW5IaSA+Pj4gOCkgICYgMHhmZik7XG4gICAgICAgIHAucHVzaCgoYml0TGVuSGkgPj4+IDApICAmIDB4ZmYpO1xuICAgICAgICBwLnB1c2goKGJpdExlbkxvID4+PiAyNCkgJiAweGZmKTtcbiAgICAgICAgcC5wdXNoKChiaXRMZW5MbyA+Pj4gMTYpICYgMHhmZik7XG4gICAgICAgIHAucHVzaCgoYml0TGVuTG8gPj4+IDgpICAmIDB4ZmYpO1xuICAgICAgICBwLnB1c2goKGJpdExlbkxvID4+PiAwKSAgJiAweGZmKTtcblxuICAgICAgICBibG9ja3MocCk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIChoMCA+Pj4gMjQpICYgMHhmZiwgKGgwID4+PiAxNikgJiAweGZmLCAoaDAgPj4+IDgpICYgMHhmZiwgKGgwID4+PiAwKSAmIDB4ZmYsXG4gICAgICAgICAgICAoaDEgPj4+IDI0KSAmIDB4ZmYsIChoMSA+Pj4gMTYpICYgMHhmZiwgKGgxID4+PiA4KSAmIDB4ZmYsIChoMSA+Pj4gMCkgJiAweGZmLFxuICAgICAgICAgICAgKGgyID4+PiAyNCkgJiAweGZmLCAoaDIgPj4+IDE2KSAmIDB4ZmYsIChoMiA+Pj4gOCkgJiAweGZmLCAoaDIgPj4+IDApICYgMHhmZixcbiAgICAgICAgICAgIChoMyA+Pj4gMjQpICYgMHhmZiwgKGgzID4+PiAxNikgJiAweGZmLCAoaDMgPj4+IDgpICYgMHhmZiwgKGgzID4+PiAwKSAmIDB4ZmYsXG4gICAgICAgICAgICAoaDQgPj4+IDI0KSAmIDB4ZmYsIChoNCA+Pj4gMTYpICYgMHhmZiwgKGg0ID4+PiA4KSAmIDB4ZmYsIChoNCA+Pj4gMCkgJiAweGZmLFxuICAgICAgICAgICAgKGg1ID4+PiAyNCkgJiAweGZmLCAoaDUgPj4+IDE2KSAmIDB4ZmYsIChoNSA+Pj4gOCkgJiAweGZmLCAoaDUgPj4+IDApICYgMHhmZixcbiAgICAgICAgICAgIChoNiA+Pj4gMjQpICYgMHhmZiwgKGg2ID4+PiAxNikgJiAweGZmLCAoaDYgPj4+IDgpICYgMHhmZiwgKGg2ID4+PiAwKSAmIDB4ZmYsXG4gICAgICAgICAgICAoaDcgPj4+IDI0KSAmIDB4ZmYsIChoNyA+Pj4gMTYpICYgMHhmZiwgKGg3ID4+PiA4KSAmIDB4ZmYsIChoNyA+Pj4gMCkgJiAweGZmXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUEJLREYyX0hNQUNfU0hBMjU2X09uZUl0ZXIocGFzc3dvcmQsIHNhbHQsIGRrTGVuKSB7XG4gICAgICAgIC8vIGNvbXByZXNzIHBhc3N3b3JkIGlmIGl0J3MgbG9uZ2VyIHRoYW4gaGFzaCBibG9jayBsZW5ndGhcbiAgICAgICAgcGFzc3dvcmQgPSAocGFzc3dvcmQubGVuZ3RoIDw9IDY0KSA/IHBhc3N3b3JkIDogU0hBMjU2KHBhc3N3b3JkKTtcblxuICAgICAgICBjb25zdCBpbm5lckxlbiA9IDY0ICsgc2FsdC5sZW5ndGggKyA0O1xuICAgICAgICBjb25zdCBpbm5lciA9IG5ldyBBcnJheShpbm5lckxlbik7XG4gICAgICAgIGNvbnN0IG91dGVyS2V5ID0gbmV3IEFycmF5KDY0KTtcblxuICAgICAgICBsZXQgaTtcbiAgICAgICAgbGV0IGRrID0gW107XG5cbiAgICAgICAgLy8gaW5uZXIgPSAocGFzc3dvcmQgXiBpcGFkKSB8fCBzYWx0IHx8IGNvdW50ZXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsgaW5uZXJbaV0gPSAweDM2OyB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGg7IGkrKykgeyBpbm5lcltpXSBePSBwYXNzd29yZFtpXTsgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FsdC5sZW5ndGg7IGkrKykgeyBpbm5lcls2NCArIGldID0gc2FsdFtpXTsgfVxuICAgICAgICBmb3IgKGkgPSBpbm5lckxlbiAtIDQ7IGkgPCBpbm5lckxlbjsgaSsrKSB7IGlubmVyW2ldID0gMDsgfVxuXG4gICAgICAgIC8vIG91dGVyS2V5ID0gcGFzc3dvcmQgXiBvcGFkXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSBvdXRlcktleVtpXSA9IDB4NWM7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGg7IGkrKykgb3V0ZXJLZXlbaV0gXj0gcGFzc3dvcmRbaV07XG5cbiAgICAgICAgLy8gaW5jcmVtZW50cyBjb3VudGVyIGluc2lkZSBpbm5lclxuICAgICAgICBmdW5jdGlvbiBpbmNyZW1lbnRDb3VudGVyKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IGlubmVyTGVuIC0gMTsgaSA+PSBpbm5lckxlbiAtIDQ7IGktLSkge1xuICAgICAgICAgICAgICAgIGlubmVyW2ldKys7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyW2ldIDw9IDB4ZmYpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpbm5lcltpXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXQgYmxvY2tzID0gU0hBMjU2KG91dGVyS2V5IHx8IFNIQTI1Nihpbm5lcikpIC4uLlxuICAgICAgICB3aGlsZSAoZGtMZW4gPj0gMzIpIHtcbiAgICAgICAgICAgIGluY3JlbWVudENvdW50ZXIoKTtcbiAgICAgICAgICAgIGRrID0gZGsuY29uY2F0KFNIQTI1NihvdXRlcktleS5jb25jYXQoU0hBMjU2KGlubmVyKSkpKTtcbiAgICAgICAgICAgIGRrTGVuIC09IDMyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChka0xlbiA+IDApIHtcbiAgICAgICAgICAgIGluY3JlbWVudENvdW50ZXIoKTtcbiAgICAgICAgICAgIGRrID0gZGsuY29uY2F0KFNIQTI1NihvdXRlcktleS5jb25jYXQoU0hBMjU2KGlubmVyKSkpLnNsaWNlKDAsIGRrTGVuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGs7XG4gICAgfVxuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhbiBhZGFwdGF0aW9uIG9mIHNjcnlwdHN5XG4gICAgLy8gU2VlOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9zY3J5cHRzeVxuICAgIGZ1bmN0aW9uIGJsb2NrbWl4X3NhbHNhOChCWSwgWWksIHIsIHgsIF9YKSB7XG4gICAgICAgIGxldCBpO1xuXG4gICAgICAgIGFycmF5Y29weShCWSwgKDIgKiByIC0gMSkgKiAxNiwgX1gsIDAsIDE2KTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiByOyBpKyspIHtcbiAgICAgICAgICAgIGJsb2NreG9yKEJZLCBpICogMTYsIF9YLCAxNik7XG4gICAgICAgICAgICBzYWxzYTIwXzgoX1gsIHgpO1xuICAgICAgICAgICAgYXJyYXljb3B5KF9YLCAwLCBCWSwgWWkgKyAoaSAqIDE2KSwgMTYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykge1xuICAgICAgICAgICAgYXJyYXljb3B5KEJZLCBZaSArIChpICogMikgKiAxNiwgQlksIChpICogMTYpLCAxNik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKSB7XG4gICAgICAgICAgICBhcnJheWNvcHkoQlksIFlpICsgKGkgKiAyICsgMSkgKiAxNiwgQlksIChpICsgcikgKiAxNiwgMTYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gUihhLCBiKSB7XG4gICAgICAgIHJldHVybiAoYSA8PCBiKSB8IChhID4+PiAoMzIgLSBiKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2Fsc2EyMF84KEIsIHgpIHtcbiAgICAgICAgYXJyYXljb3B5KEIsIDAsIHgsIDAsIDE2KTtcblxuICAgICAgICBmb3IgKGxldCBpID0gODsgaSA+IDA7IGkgLT0gMikge1xuICAgICAgICAgICAgeFsgNF0gXj0gUih4WyAwXSArIHhbMTJdLCA3KTtcbiAgICAgICAgICAgIHhbIDhdIF49IFIoeFsgNF0gKyB4WyAwXSwgOSk7XG4gICAgICAgICAgICB4WzEyXSBePSBSKHhbIDhdICsgeFsgNF0sIDEzKTtcbiAgICAgICAgICAgIHhbIDBdIF49IFIoeFsxMl0gKyB4WyA4XSwgMTgpO1xuICAgICAgICAgICAgeFsgOV0gXj0gUih4WyA1XSArIHhbIDFdLCA3KTtcbiAgICAgICAgICAgIHhbMTNdIF49IFIoeFsgOV0gKyB4WyA1XSwgOSk7XG4gICAgICAgICAgICB4WyAxXSBePSBSKHhbMTNdICsgeFsgOV0sIDEzKTtcbiAgICAgICAgICAgIHhbIDVdIF49IFIoeFsgMV0gKyB4WzEzXSwgMTgpO1xuICAgICAgICAgICAgeFsxNF0gXj0gUih4WzEwXSArIHhbIDZdLCA3KTtcbiAgICAgICAgICAgIHhbIDJdIF49IFIoeFsxNF0gKyB4WzEwXSwgOSk7XG4gICAgICAgICAgICB4WyA2XSBePSBSKHhbIDJdICsgeFsxNF0sIDEzKTtcbiAgICAgICAgICAgIHhbMTBdIF49IFIoeFsgNl0gKyB4WyAyXSwgMTgpO1xuICAgICAgICAgICAgeFsgM10gXj0gUih4WzE1XSArIHhbMTFdLCA3KTtcbiAgICAgICAgICAgIHhbIDddIF49IFIoeFsgM10gKyB4WzE1XSwgOSk7XG4gICAgICAgICAgICB4WzExXSBePSBSKHhbIDddICsgeFsgM10sIDEzKTtcbiAgICAgICAgICAgIHhbMTVdIF49IFIoeFsxMV0gKyB4WyA3XSwgMTgpO1xuICAgICAgICAgICAgeFsgMV0gXj0gUih4WyAwXSArIHhbIDNdLCA3KTtcbiAgICAgICAgICAgIHhbIDJdIF49IFIoeFsgMV0gKyB4WyAwXSwgOSk7XG4gICAgICAgICAgICB4WyAzXSBePSBSKHhbIDJdICsgeFsgMV0sIDEzKTtcbiAgICAgICAgICAgIHhbIDBdIF49IFIoeFsgM10gKyB4WyAyXSwgMTgpO1xuICAgICAgICAgICAgeFsgNl0gXj0gUih4WyA1XSArIHhbIDRdLCA3KTtcbiAgICAgICAgICAgIHhbIDddIF49IFIoeFsgNl0gKyB4WyA1XSwgOSk7XG4gICAgICAgICAgICB4WyA0XSBePSBSKHhbIDddICsgeFsgNl0sIDEzKTtcbiAgICAgICAgICAgIHhbIDVdIF49IFIoeFsgNF0gKyB4WyA3XSwgMTgpO1xuICAgICAgICAgICAgeFsxMV0gXj0gUih4WzEwXSArIHhbIDldLCA3KTtcbiAgICAgICAgICAgIHhbIDhdIF49IFIoeFsxMV0gKyB4WzEwXSwgOSk7XG4gICAgICAgICAgICB4WyA5XSBePSBSKHhbIDhdICsgeFsxMV0sIDEzKTtcbiAgICAgICAgICAgIHhbMTBdIF49IFIoeFsgOV0gKyB4WyA4XSwgMTgpO1xuICAgICAgICAgICAgeFsxMl0gXj0gUih4WzE1XSArIHhbMTRdLCA3KTtcbiAgICAgICAgICAgIHhbMTNdIF49IFIoeFsxMl0gKyB4WzE1XSwgOSk7XG4gICAgICAgICAgICB4WzE0XSBePSBSKHhbMTNdICsgeFsxMl0sIDEzKTtcbiAgICAgICAgICAgIHhbMTVdIF49IFIoeFsxNF0gKyB4WzEzXSwgMTgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgICAgICBCW2ldICs9IHhbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBuYWl2ZSBhcHByb2FjaC4uLiBnb2luZyBiYWNrIHRvIGxvb3AgdW5yb2xsaW5nIG1heSB5aWVsZCBhZGRpdGlvbmFsIHBlcmZvcm1hbmNlXG4gICAgZnVuY3Rpb24gYmxvY2t4b3IoUywgU2ksIEQsIGxlbikge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBEW2ldIF49IFNbU2kgKyBpXVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXJyYXljb3B5KHNyYywgc3JjUG9zLCBkZXN0LCBkZXN0UG9zLCBsZW5ndGgpIHtcbiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgICAgICBkZXN0W2Rlc3RQb3MrK10gPSBzcmNbc3JjUG9zKytdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tCdWZmZXJpc2gobykge1xuICAgICAgICBpZiAoIW8gfHwgdHlwZW9mKG8ubGVuZ3RoKSAhPT0gJ251bWJlcicpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB2ID0gb1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YodikgIT09ICdudW1iZXInIHx8IHYgJSAxIHx8IHYgPCAwIHx8IHYgPj0gMjU2KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZW5zdXJlSW50ZWdlcih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mKHZhbHVlKSAhPT0gXCJudW1iZXJcIiB8fCAodmFsdWUgJSAxKSkgeyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgJyArIG5hbWUpOyB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBOID0gQ3B1IGNvc3QsIHIgPSBNZW1vcnkgY29zdCwgcCA9IHBhcmFsbGVsaXphdGlvbiBjb3N0XG4gICAgLy8gY2FsbGJhY2soZXJyb3IsIHByb2dyZXNzLCBrZXkpXG4gICAgZnVuY3Rpb24gX3NjcnlwdChwYXNzd29yZCwgc2FsdCwgTiwgciwgcCwgZGtMZW4sIGNhbGxiYWNrKSB7XG5cbiAgICAgICAgTiA9IGVuc3VyZUludGVnZXIoTiwgJ04nKTtcbiAgICAgICAgciA9IGVuc3VyZUludGVnZXIociwgJ3InKTtcbiAgICAgICAgcCA9IGVuc3VyZUludGVnZXIocCwgJ3AnKTtcblxuICAgICAgICBka0xlbiA9IGVuc3VyZUludGVnZXIoZGtMZW4sICdka0xlbicpO1xuXG4gICAgICAgIGlmIChOID09PSAwIHx8IChOICYgKE4gLSAxKSkgIT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdOIG11c3QgYmUgcG93ZXIgb2YgMicpOyB9XG5cbiAgICAgICAgaWYgKE4gPiBNQVhfVkFMVUUgLyAxMjggLyByKSB7IHRocm93IG5ldyBFcnJvcignTiB0b28gbGFyZ2UnKTsgfVxuICAgICAgICBpZiAociA+IE1BWF9WQUxVRSAvIDEyOCAvIHApIHsgdGhyb3cgbmV3IEVycm9yKCdyIHRvbyBsYXJnZScpOyB9XG5cbiAgICAgICAgaWYgKCFjaGVja0J1ZmZlcmlzaChwYXNzd29yZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncGFzc3dvcmQgbXVzdCBiZSBhbiBhcnJheSBvciBidWZmZXInKTtcbiAgICAgICAgfVxuICAgICAgICBwYXNzd29yZCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHBhc3N3b3JkKTtcblxuICAgICAgICBpZiAoIWNoZWNrQnVmZmVyaXNoKHNhbHQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NhbHQgbXVzdCBiZSBhbiBhcnJheSBvciBidWZmZXInKTtcbiAgICAgICAgfVxuICAgICAgICBzYWx0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc2FsdCk7XG5cbiAgICAgICAgbGV0IGIgPSBQQktERjJfSE1BQ19TSEEyNTZfT25lSXRlcihwYXNzd29yZCwgc2FsdCwgcCAqIDEyOCAqIHIpO1xuICAgICAgICBjb25zdCBCID0gbmV3IFVpbnQzMkFycmF5KHAgKiAzMiAqIHIpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaiA9IGkgKiA0O1xuICAgICAgICAgICAgQltpXSA9ICgoYltqICsgM10gJiAweGZmKSA8PCAyNCkgfFxuICAgICAgICAgICAgICAgICAgICgoYltqICsgMl0gJiAweGZmKSA8PCAxNikgfFxuICAgICAgICAgICAgICAgICAgICgoYltqICsgMV0gJiAweGZmKSA8PCA4KSB8XG4gICAgICAgICAgICAgICAgICAgKChiW2ogKyAwXSAmIDB4ZmYpIDw8IDApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgWFkgPSBuZXcgVWludDMyQXJyYXkoNjQgKiByKTtcbiAgICAgICAgY29uc3QgViA9IG5ldyBVaW50MzJBcnJheSgzMiAqIHIgKiBOKTtcblxuICAgICAgICBjb25zdCBZaSA9IDMyICogcjtcblxuICAgICAgICAvLyBzY3JhdGNoIHNwYWNlXG4gICAgICAgIGNvbnN0IHggPSBuZXcgVWludDMyQXJyYXkoMTYpOyAgICAgICAvLyBzYWxzYTIwXzhcbiAgICAgICAgY29uc3QgX1ggPSBuZXcgVWludDMyQXJyYXkoMTYpOyAgICAgIC8vIGJsb2NrbWl4X3NhbHNhOFxuXG4gICAgICAgIGNvbnN0IHRvdGFsT3BzID0gcCAqIE4gKiAyO1xuICAgICAgICBsZXQgY3VycmVudE9wID0gMDtcbiAgICAgICAgbGV0IGxhc3RQZXJjZW50MTAgPSBudWxsO1xuXG4gICAgICAgIC8vIFNldCB0aGlzIHRvIHRydWUgdG8gYWJhbmRvbiB0aGUgc2NyeXB0IG9uIHRoZSBuZXh0IHN0ZXBcbiAgICAgICAgbGV0IHN0b3AgPSBmYWxzZTtcblxuICAgICAgICAvLyBTdGF0ZSBpbmZvcm1hdGlvblxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgaTAgPSAwLCBpMTtcbiAgICAgICAgbGV0IEJpO1xuXG4gICAgICAgIC8vIEhvdyBtYW55IGJsb2NrbWl4X3NhbHNhOCBjYW4gd2UgZG8gcGVyIHN0ZXA/XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gY2FsbGJhY2sgPyBwYXJzZUludCgxMDAwIC8gcik6IDB4ZmZmZmZmZmY7XG5cbiAgICAgICAgLy8gVHJpY2sgZnJvbSBzY3J5cHQtYXN5bmM7IGlmIHRoZXJlIGlzIGEgc2V0SW1tZWRpYXRlIHNoaW0gaW4gcGxhY2UsIHVzZSBpdFxuICAgICAgICBjb25zdCBuZXh0VGljayA9ICh0eXBlb2Yoc2V0SW1tZWRpYXRlKSAhPT0gJ3VuZGVmaW5lZCcpID8gc2V0SW1tZWRpYXRlIDogc2V0VGltZW91dDtcblxuICAgICAgICAvLyBUaGlzIGlzIHJlYWxseSBhbGwgSSBjaGFuZ2VkOyBtYWtpbmcgc2NyeXB0c3kgYSBzdGF0ZSBtYWNoaW5lIHNvIHdlIG9jY2FzaW9uYWxseVxuICAgICAgICAvLyBzdG9wIGFuZCBnaXZlIG90aGVyIGV2bnRzIG9uIHRoZSBldm50IGxvb3AgYSBjaGFuY2UgdG8gcnVuLiB+UmljTW9vXG4gICAgICAgIGNvbnN0IGluY3JlbWVudGFsU01peCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHN0b3ApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKCdjYW5jZWxsZWQnKSwgY3VycmVudE9wIC8gdG90YWxPcHMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgc3RlcHM7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgcDsgaSsrKS4uLlxuICAgICAgICAgICAgICAgICAgICBCaSA9IGkwICogMzIgKiByO1xuXG4gICAgICAgICAgICAgICAgICAgIGFycmF5Y29weShCLCBCaSwgWFksIDAsIFlpKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFJPTWl4IC0gMVxuXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gUk9NaXggMlxuICAgICAgICAgICAgICAgICAgICBpMSA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoXG5cbiAgICAgICAgICAgICAgICBjYXNlIDE6XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHVwIHRvIDEwMDAgc3RlcHMgb2YgdGhlIGZpcnN0IGlubmVyIHNtaXggbG9vcFxuICAgICAgICAgICAgICAgICAgICBzdGVwcyA9IE4gLSBpMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBzID4gbGltaXQpIHsgc3RlcHMgPSBsaW1pdDsgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBzOyBpKyspIHsgICAgICAgICAgICAgICAgICAvLyBST01peCAtIDJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5Y29weShYWSwgMCwgViwgKGkxICsgaSkgKiBZaSwgWWkpICAgICAgICAgLy8gUk9NaXggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja21peF9zYWxzYTgoWFksIFlpLCByLCB4LCBfWCk7ICAgICAgICAgICAgIC8vIFJPTWl4IC0gNFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yICh2YXIgaSA9IDA7IGkgPCBOOyBpKyspXG4gICAgICAgICAgICAgICAgICAgIGkxICs9IHN0ZXBzO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3AgKz0gc3RlcHM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSBjYWxsYmFjayB3aXRoIHRoZSBwcm9ncmVzcyAob3B0aW9uYWxseSBzdG9wcGluZyB1cylcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnQxMCA9IHBhcnNlSW50KDEwMDAgKiBjdXJyZW50T3AgLyB0b3RhbE9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudDEwICE9PSBsYXN0UGVyY2VudDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IGNhbGxiYWNrKG51bGwsIGN1cnJlbnRPcCAvIHRvdGFsT3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkgeyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQZXJjZW50MTAgPSBwZXJjZW50MTA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaTEgPCBOKSB7IGJyZWFrOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgaTEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdG8gUk9NaXggNlxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDI7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoXG5cbiAgICAgICAgICAgICAgICBjYXNlIDI6XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHVwIHRvIDEwMDAgc3RlcHMgb2YgdGhlIHNlY29uZCBpbm5lciBzbWl4IGxvb3BcbiAgICAgICAgICAgICAgICAgICAgc3RlcHMgPSBOIC0gaTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGVwcyA+IGxpbWl0KSB7IHN0ZXBzID0gbGltaXQ7IH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwczsgaSsrKSB7ICAgICAgICAgICAgICAgIC8vIFJPTWl4IC0gNlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKDIgKiByIC0gMSkgKiAxNjsgICAgICAgICAgICAgLy8gUk9NaXggLSA3XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqID0gWFlbb2Zmc2V0XSAmIChOIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBibG9ja3hvcihWLCBqICogWWksIFhZLCBZaSk7ICAgICAgICAgICAgICAgICAvLyBST01peCAtIDggKGlubmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ttaXhfc2Fsc2E4KFhZLCBZaSwgciwgeCwgX1gpOyAgICAgICAgICAgLy8gUk9NaXggLSA5IChvdXRlcilcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKS4uLlxuICAgICAgICAgICAgICAgICAgICBpMSArPSBzdGVwcztcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wICs9IHN0ZXBzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHByb2dyZXNzIChvcHRpb25hbGx5IHN0b3BwaW5nIHVzKVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnQxMCA9IHBhcnNlSW50KDEwMDAgKiBjdXJyZW50T3AgLyB0b3RhbE9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVyY2VudDEwICE9PSBsYXN0UGVyY2VudDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IGNhbGxiYWNrKG51bGwsIGN1cnJlbnRPcCAvIHRvdGFsT3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcCkgeyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQZXJjZW50MTAgPSBwZXJjZW50MTA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaTEgPCBOKSB7IGJyZWFrOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXJyYXljb3B5KFhZLCAwLCBCLCBCaSwgWWkpOyAgICAgICAgICAgICAgICAgICAgIC8vIFJPTWl4IC0gMTBcblxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKHZhciBpID0gMDsgaSA8IHA7IGkrKykuLi5cbiAgICAgICAgICAgICAgICAgICAgaTArKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkwIDwgcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBiID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKChCW2ldID4+ICAwKSAmIDB4ZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKChCW2ldID4+ICA4KSAmIDB4ZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKChCW2ldID4+IDE2KSAmIDB4ZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKChCW2ldID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVyaXZlZEtleSA9IFBCS0RGMl9ITUFDX1NIQTI1Nl9PbmVJdGVyKHBhc3N3b3JkLCBiLCBka0xlbik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgcmVzdWx0IHRvIHRoZSBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2sobnVsbCwgMS4wLCBkZXJpdmVkS2V5KTsgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbmU7IGRvbid0IGJyZWFrICh3aGljaCB3b3VsZCByZXNjaGVkdWxlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVyaXZlZEtleTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2NoZWR1bGUgdGhlIG5leHQgc3RlcHNcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBuZXh0VGljayhpbmNyZW1lbnRhbFNNaXgpOyB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSdW4gdGhlIHNtaXggc3RhdGUgbWFjaGluZSB1bnRpbCBjb21wbGV0aW9uXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVyaXZlZEtleSA9IGluY3JlbWVudGFsU01peCgpO1xuICAgICAgICAgICAgICAgIGlmIChkZXJpdmVkS2V5ICE9IHVuZGVmaW5lZCkgeyByZXR1cm4gZGVyaXZlZEtleTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQm9vdHN0cmFwIHRoZSBhc3luYyBpbmNyZW1lbnRhbCBzbWl4XG4gICAgICAgIGluY3JlbWVudGFsU01peCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpYiA9IHtcbiAgICAgICAgc2NyeXB0OiBmdW5jdGlvbihwYXNzd29yZCwgc2FsdCwgTiwgciwgcCwgZGtMZW4sIHByb2dyZXNzQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdFByb2dyZXNzID0gMDtcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3NDYWxsYmFjaykgeyBwcm9ncmVzc0NhbGxiYWNrKDApOyB9XG4gICAgICAgICAgICAgICAgX3NjcnlwdChwYXNzd29yZCwgc2FsdCwgTiwgciwgcCwgZGtMZW4sIGZ1bmN0aW9uKGVycm9yLCBwcm9ncmVzcywga2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzc0NhbGxiYWNrICYmIGxhc3RQcm9ncmVzcyAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2soMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGtleSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2dyZXNzQ2FsbGJhY2sgJiYgcHJvZ3Jlc3MgIT09IGxhc3RQcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NDYWxsYmFjayhwcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzeW5jU2NyeXB0OiBmdW5jdGlvbihwYXNzd29yZCwgc2FsdCwgTiwgciwgcCwgZGtMZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShfc2NyeXB0KHBhc3N3b3JkLCBzYWx0LCBOLCByLCBwLCBka0xlbikpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIG5vZGUuanNcbiAgICBpZiAodHlwZW9mKGV4cG9ydHMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgIG1vZHVsZS5leHBvcnRzID0gbGliO1xuXG4gICAgLy8gUmVxdWlyZUpTL0FNRFxuICAgIC8vIGh0dHA6Ly93d3cucmVxdWlyZWpzLm9yZy9kb2NzL2FwaS5odG1sXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FtZGpzL2FtZGpzLWFwaS93aWtpL0FNRFxuICAgIH0gZWxzZSBpZiAodHlwZW9mKGRlZmluZSkgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUobGliKTtcblxuICAgIC8vIFdlYiBCcm93c2Vyc1xuICAgIH0gZWxzZSBpZiAocm9vdCkge1xuXG4gICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBleGlzdGluZyBsaWJyYXJ5IFwic2NyeXB0XCIsIG1ha2Ugc3VyZSBpdCBpcyBzdGlsbCBhdmFpbGFibGVcbiAgICAgICAgaWYgKHJvb3Quc2NyeXB0KSB7XG4gICAgICAgICAgICByb290Ll9zY3J5cHQgPSByb290LnNjcnlwdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJvb3Quc2NyeXB0ID0gbGliO1xuICAgIH1cblxufSkodGhpcyk7XG4iLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9oYXMgZnJvbSBcImxvZGFzaC1lcy9oYXNcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGN1c3RvbVByb3BUeXBlcywgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuLi8uLi9lbGVtZW50cy9CdXR0b24nO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4uLy4uL21vZHVsZXMvTW9kYWwnO1xuLyoqXG4gKiBBIENvbmZpcm0gbW9kYWwgZ2l2ZXMgdGhlIHVzZXIgYSBjaG9pY2UgdG8gY29uZmlybSBvciBjYW5jZWwgYW4gYWN0aW9uL1xuICogQHNlZSBNb2RhbFxuICovXG5cbnZhciBDb25maXJtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKENvbmZpcm0sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbmZpcm0oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVDYW5jZWwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2FuY2VsJywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDYW5jZWxPdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUsIGJ1dHRvblByb3BzKSB7XG4gICAgICAgICAgX2ludm9rZShwcmVkZWZpbmVkUHJvcHMsICdvbkNsaWNrJywgZSwgYnV0dG9uUHJvcHMpO1xuXG4gICAgICAgICAgX3RoaXMuaGFuZGxlQ2FuY2VsKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDb25maXJtT3ZlcnJpZGVzID0gZnVuY3Rpb24gKHByZWRlZmluZWRQcm9wcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlLCBidXR0b25Qcm9wcykge1xuICAgICAgICAgIF9pbnZva2UocHJlZGVmaW5lZFByb3BzLCAnb25DbGljaycsIGUsIGJ1dHRvblByb3BzKTtcblxuICAgICAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNvbmZpcm0nLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBDb25maXJtLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNhbmNlbEJ1dHRvbiA9IF90aGlzJHByb3BzLmNhbmNlbEJ1dHRvbixcbiAgICAgICAgY29uZmlybUJ1dHRvbiA9IF90aGlzJHByb3BzLmNvbmZpcm1CdXR0b24sXG4gICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wcy5jb250ZW50LFxuICAgICAgICBoZWFkZXIgPSBfdGhpcyRwcm9wcy5oZWFkZXIsXG4gICAgICAgIG9wZW4gPSBfdGhpcyRwcm9wcy5vcGVuLFxuICAgICAgICBzaXplID0gX3RoaXMkcHJvcHMuc2l6ZTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKENvbmZpcm0sIHRoaXMucHJvcHMpOyAvLyBgb3BlbmAgaXMgYXV0byBjb250cm9sbGVkIGJ5IHRoZSBNb2RhbFxuICAgIC8vIEl0IGNhbm5vdCBiZSBwcmVzZW50IChldmVuIHVuZGVmaW5lZCkgd2l0aCBgZGVmYXVsdE9wZW5gXG4gICAgLy8gb25seSBhcHBseSBpdCBpZiB0aGUgdXNlciBwcm92aWRlZCBhbiBvcGVuIHByb3BcblxuICAgIHZhciBvcGVuUHJvcCA9IHt9O1xuICAgIGlmIChfaGFzKHRoaXMucHJvcHMsICdvcGVuJykpIG9wZW5Qcm9wLm9wZW4gPSBvcGVuO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb2RhbCwgX2V4dGVuZHMoe30sIHJlc3QsIG9wZW5Qcm9wLCB7XG4gICAgICBzaXplOiBzaXplLFxuICAgICAgb25DbG9zZTogdGhpcy5oYW5kbGVDYW5jZWxcbiAgICB9KSwgTW9kYWwuSGVhZGVyLmNyZWF0ZShoZWFkZXIsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgTW9kYWwuQ29udGVudC5jcmVhdGUoY29udGVudCwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNb2RhbC5BY3Rpb25zLCBudWxsLCBCdXR0b24uY3JlYXRlKGNhbmNlbEJ1dHRvbiwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZSxcbiAgICAgIG92ZXJyaWRlUHJvcHM6IHRoaXMuaGFuZGxlQ2FuY2VsT3ZlcnJpZGVzXG4gICAgfSksIEJ1dHRvbi5jcmVhdGUoY29uZmlybUJ1dHRvbiwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZSxcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBwcmltYXJ5OiB0cnVlXG4gICAgICB9LFxuICAgICAgb3ZlcnJpZGVQcm9wczogdGhpcy5oYW5kbGVDb25maXJtT3ZlcnJpZGVzXG4gICAgfSkpKTtcbiAgfTtcblxuICByZXR1cm4gQ29uZmlybTtcbn0oQ29tcG9uZW50KTtcblxuQ29uZmlybS5oYW5kbGVkUHJvcHMgPSBbXCJjYW5jZWxCdXR0b25cIiwgXCJjb25maXJtQnV0dG9uXCIsIFwiY29udGVudFwiLCBcImhlYWRlclwiLCBcIm9uQ2FuY2VsXCIsIFwib25Db25maXJtXCIsIFwib3BlblwiLCBcInNpemVcIl07XG5Db25maXJtLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIFRoZSBjYW5jZWwgYnV0dG9uIHRleHQuICovXG4gIGNhbmNlbEJ1dHRvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFRoZSBPSyBidXR0b24gdGV4dC4gKi9cbiAgY29uZmlybUJ1dHRvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFRoZSBNb2RhbENvbnRlbnQgdGV4dC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFRoZSBNb2RhbEhlYWRlciB0ZXh0LiAqL1xuICBoZWFkZXI6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgTW9kYWwgaXMgY2xvc2VkIHdpdGhvdXQgY2xpY2tpbmcgY29uZmlybS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25Db25maXJtOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogV2hldGhlciBvciBub3QgdGhlIG1vZGFsIGlzIHZpc2libGUuICovXG4gIG9wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIENvbmZpcm0gY2FuIHZhcnkgaW4gc2l6ZSAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydtaW5pJywgJ3RpbnknLCAnc21hbGwnLCAnbGFyZ2UnLCAnZnVsbHNjcmVlbiddKVxufSA6IHt9O1xuQ29uZmlybS5kZWZhdWx0UHJvcHMgPSB7XG4gIGNhbmNlbEJ1dHRvbjogJ0NhbmNlbCcsXG4gIGNvbmZpcm1CdXR0b246ICdPSycsXG4gIGNvbnRlbnQ6ICdBcmUgeW91IHN1cmU/JyxcbiAgc2l6ZTogJ3NtYWxsJ1xufTtcbmV4cG9ydCBkZWZhdWx0IENvbmZpcm07IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vQ29uZmlybSc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfbWFwIGZyb20gXCJsb2Rhc2gtZXMvbWFwXCI7XG5pbXBvcnQgX2lzTmlsIGZyb20gXCJsb2Rhc2gtZXMvaXNOaWxcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50IGFzIENvbXBvbmVudCwgY3JlYXRlUGFnaW5hdGlvbkl0ZW1zLCBjdXN0b21Qcm9wVHlwZXMsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBNZW51IGZyb20gJy4uLy4uL2NvbGxlY3Rpb25zL01lbnUnO1xuaW1wb3J0IFBhZ2luYXRpb25JdGVtIGZyb20gJy4vUGFnaW5hdGlvbkl0ZW0nO1xuLyoqXG4gKiBBIGNvbXBvbmVudCB0byByZW5kZXIgYSBwYWdpbmF0aW9uLlxuICovXG5cbnZhciBQYWdpbmF0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFBhZ2luYXRpb24sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBhZ2luYXRpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVJdGVtQ2xpY2sgPSBmdW5jdGlvbiAoZSwgX3JlZikge1xuICAgICAgdmFyIG5leHRBY3RpdmVQYWdlID0gX3JlZi52YWx1ZTtcbiAgICAgIHZhciBwcmV2QWN0aXZlUGFnZSA9IF90aGlzLnN0YXRlLmFjdGl2ZVBhZ2U7IC8vIEhlYWRzIHVwISBXZSBuZWVkIHRoZSBjYXN0IHRvIHRoZSBcIm51bWJlclwiIHR5cGUgdGhlcmUsIGFzIGBhY3RpdmVQYWdlYCBjYW4gYmUgYSBzdHJpbmdcblxuICAgICAgaWYgKCtwcmV2QWN0aXZlUGFnZSA9PT0gK25leHRBY3RpdmVQYWdlKSByZXR1cm47XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYWN0aXZlUGFnZTogbmV4dEFjdGl2ZVBhZ2VcbiAgICAgIH0pO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25QYWdlQ2hhbmdlJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIGFjdGl2ZVBhZ2U6IG5leHRBY3RpdmVQYWdlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUl0ZW1PdmVycmlkZXMgPSBmdW5jdGlvbiAoYWN0aXZlLCB0eXBlLCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChwcmVkZWZpbmVkUHJvcHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIGtleTogdHlwZSArIFwiLVwiICsgdmFsdWUsXG4gICAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlLCBpdGVtUHJvcHMpIHtcbiAgICAgICAgICAgIF9pbnZva2UocHJlZGVmaW5lZFByb3BzLCAnb25DbGljaycsIGUsIGl0ZW1Qcm9wcyk7XG5cbiAgICAgICAgICAgIGlmIChpdGVtUHJvcHMudHlwZSAhPT0gJ2VsbGlwc2lzSXRlbScpIF90aGlzLmhhbmRsZUl0ZW1DbGljayhlLCBpdGVtUHJvcHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQYWdpbmF0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0SW5pdGlhbEF1dG9Db250cm9sbGVkU3RhdGUgPSBmdW5jdGlvbiBnZXRJbml0aWFsQXV0b0NvbnRyb2xsZWRTdGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZlUGFnZTogMVxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFyaWFMYWJlbCA9IF90aGlzJHByb3BzWydhcmlhLWxhYmVsJ10sXG4gICAgICAgIGJvdW5kYXJ5UmFuZ2UgPSBfdGhpcyRwcm9wcy5ib3VuZGFyeVJhbmdlLFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzLmRpc2FibGVkLFxuICAgICAgICBlbGxpcHNpc0l0ZW0gPSBfdGhpcyRwcm9wcy5lbGxpcHNpc0l0ZW0sXG4gICAgICAgIHNpYmxpbmdSYW5nZSA9IF90aGlzJHByb3BzLnNpYmxpbmdSYW5nZSxcbiAgICAgICAgdG90YWxQYWdlcyA9IF90aGlzJHByb3BzLnRvdGFsUGFnZXM7XG4gICAgdmFyIGFjdGl2ZVBhZ2UgPSB0aGlzLnN0YXRlLmFjdGl2ZVBhZ2U7XG4gICAgdmFyIGl0ZW1zID0gY3JlYXRlUGFnaW5hdGlvbkl0ZW1zKHtcbiAgICAgIGFjdGl2ZVBhZ2U6IGFjdGl2ZVBhZ2UsXG4gICAgICBib3VuZGFyeVJhbmdlOiBib3VuZGFyeVJhbmdlLFxuICAgICAgaGlkZUVsbGlwc2lzOiBfaXNOaWwoZWxsaXBzaXNJdGVtKSxcbiAgICAgIHNpYmxpbmdSYW5nZTogc2libGluZ1JhbmdlLFxuICAgICAgdG90YWxQYWdlczogdG90YWxQYWdlc1xuICAgIH0pO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUGFnaW5hdGlvbiwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBcImFyaWEtbGFiZWxcIjogYXJpYUxhYmVsLFxuICAgICAgcGFnaW5hdGlvbjogdHJ1ZSxcbiAgICAgIHJvbGU6IFwibmF2aWdhdGlvblwiXG4gICAgfSksIF9tYXAoaXRlbXMsIGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgdmFyIGFjdGl2ZSA9IF9yZWYyLmFjdGl2ZSxcbiAgICAgICAgICB0eXBlID0gX3JlZjIudHlwZSxcbiAgICAgICAgICB2YWx1ZSA9IF9yZWYyLnZhbHVlO1xuICAgICAgcmV0dXJuIFBhZ2luYXRpb25JdGVtLmNyZWF0ZShfdGhpczIucHJvcHNbdHlwZV0sIHtcbiAgICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgICAgY29udGVudDogdmFsdWUsXG4gICAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBvdmVycmlkZVByb3BzOiBfdGhpczIuaGFuZGxlSXRlbU92ZXJyaWRlcyhhY3RpdmUsIHR5cGUsIHZhbHVlKVxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBQYWdpbmF0aW9uO1xufShDb21wb25lbnQpO1xuXG5QYWdpbmF0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVBhZ2VcIiwgXCJhcmlhLWxhYmVsXCIsIFwiYm91bmRhcnlSYW5nZVwiLCBcImRlZmF1bHRBY3RpdmVQYWdlXCIsIFwiZGlzYWJsZWRcIiwgXCJlbGxpcHNpc0l0ZW1cIiwgXCJmaXJzdEl0ZW1cIiwgXCJsYXN0SXRlbVwiLCBcIm5leHRJdGVtXCIsIFwib25QYWdlQ2hhbmdlXCIsIFwicGFnZUl0ZW1cIiwgXCJwcmV2SXRlbVwiLCBcInNpYmxpbmdSYW5nZVwiLCBcInRvdGFsUGFnZXNcIl07XG5leHBvcnQgeyBQYWdpbmF0aW9uIGFzIGRlZmF1bHQgfTtcblBhZ2luYXRpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQSBwYWdpbmF0aW9uIGl0ZW0gY2FuIGhhdmUgYW4gYXJpYSBsYWJlbC4gKi9cbiAgJ2FyaWEtbGFiZWwnOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBJbml0aWFsIGFjdGl2ZVBhZ2UgdmFsdWUuICovXG4gIGRlZmF1bHRBY3RpdmVQYWdlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIEluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHBhZ2UuICovXG4gIGFjdGl2ZVBhZ2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogTnVtYmVyIG9mIGFsd2F5cyB2aXNpYmxlIHBhZ2VzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZC4gKi9cbiAgYm91bmRhcnlSYW5nZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBBIHBhZ2luYXRpb24gY2FuIGJlIGRpc2FibGVkLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgc2hvcnRoYW5kIGZvciBQYWdpbmF0aW9uSXRlbS4gKi9cbiAgZWxsaXBzaXNJdGVtOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBzaG9ydGhhbmQgZm9yIFBhZ2luYXRpb25JdGVtLiAqL1xuICBmaXJzdEl0ZW06IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIHNob3J0aGFuZCBmb3IgUGFnaW5hdGlvbkl0ZW0uICovXG4gIGxhc3RJdGVtOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBzaG9ydGhhbmQgZm9yIFBhZ2luYXRpb25JdGVtLiAqL1xuICBuZXh0SXRlbTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEEgc2hvcnRoYW5kIGZvciBQYWdpbmF0aW9uSXRlbS4gKi9cbiAgcGFnZUl0ZW06IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIHNob3J0aGFuZCBmb3IgUGFnaW5hdGlvbkl0ZW0uICovXG4gIHByZXZJdGVtOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNoYW5nZSBvZiBhbiBhY3RpdmUgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uUGFnZUNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIE51bWJlciBvZiBhbHdheXMgdmlzaWJsZSBwYWdlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjdXJyZW50IG9uZS4gKi9cbiAgc2libGluZ1JhbmdlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBwYWdlcy4gKi9cbiAgdG90YWxQYWdlczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLmlzUmVxdWlyZWRcbn0gOiB7fTtcblBhZ2luYXRpb24uYXV0b0NvbnRyb2xsZWRQcm9wcyA9IFsnYWN0aXZlUGFnZSddO1xuUGFnaW5hdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gICdhcmlhLWxhYmVsJzogJ1BhZ2luYXRpb24gTmF2aWdhdGlvbicsXG4gIGJvdW5kYXJ5UmFuZ2U6IDEsXG4gIGVsbGlwc2lzSXRlbTogJy4uLicsXG4gIGZpcnN0SXRlbToge1xuICAgICdhcmlhLWxhYmVsJzogJ0ZpcnN0IGl0ZW0nLFxuICAgIGNvbnRlbnQ6ICfCqydcbiAgfSxcbiAgbGFzdEl0ZW06IHtcbiAgICAnYXJpYS1sYWJlbCc6ICdMYXN0IGl0ZW0nLFxuICAgIGNvbnRlbnQ6ICfCuydcbiAgfSxcbiAgbmV4dEl0ZW06IHtcbiAgICAnYXJpYS1sYWJlbCc6ICdOZXh0IGl0ZW0nLFxuICAgIGNvbnRlbnQ6ICfin6knXG4gIH0sXG4gIHBhZ2VJdGVtOiB7fSxcbiAgcHJldkl0ZW06IHtcbiAgICAnYXJpYS1sYWJlbCc6ICdQcmV2aW91cyBpdGVtJyxcbiAgICBjb250ZW50OiAn4p+oJ1xuICB9LFxuICBzaWJsaW5nUmFuZ2U6IDFcbn07XG5QYWdpbmF0aW9uLkl0ZW0gPSBQYWdpbmF0aW9uSXRlbTsiLCJpbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQga2V5Ym9hcmRLZXkgZnJvbSAna2V5Ym9hcmQta2V5JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBNZW51SXRlbSBmcm9tICcuLi8uLi9jb2xsZWN0aW9ucy9NZW51L01lbnVJdGVtJztcbi8qKlxuICogQW4gaXRlbSBvZiBhIHBhZ2luYXRpb24uXG4gKi9cblxudmFyIFBhZ2luYXRpb25JdGVtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFBhZ2luYXRpb25JdGVtLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYWdpbmF0aW9uSXRlbSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbktleURvd24nLCBlLCBfdGhpcy5wcm9wcyk7XG5cbiAgICAgIGlmIChrZXlib2FyZEtleS5nZXRDb2RlKGUpID09PSBrZXlib2FyZEtleS5FbnRlcikgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xpY2snLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU92ZXJyaWRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uQ2xpY2s6IF90aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgICBvbktleURvd246IF90aGlzLmhhbmRsZUtleURvd25cbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQYWdpbmF0aW9uSXRlbS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIHR5cGUgPSBfdGhpcyRwcm9wcy50eXBlO1xuICAgIHZhciBkaXNhYmxlZCA9IHRoaXMucHJvcHMuZGlzYWJsZWQgfHwgdHlwZSA9PT0gJ2VsbGlwc2lzSXRlbSc7XG4gICAgcmV0dXJuIE1lbnVJdGVtLmNyZWF0ZSh0aGlzLnByb3BzLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgICdhcmlhLWN1cnJlbnQnOiBhY3RpdmUsXG4gICAgICAgICdhcmlhLWRpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGljayxcbiAgICAgICAgb25LZXlEb3duOiB0aGlzLmhhbmRsZUtleURvd24sXG4gICAgICAgIHRhYkluZGV4OiBkaXNhYmxlZCA/IC0xIDogMFxuICAgICAgfSxcbiAgICAgIG92ZXJyaWRlUHJvcHM6IHRoaXMuaGFuZGxlT3ZlcnJpZGVzXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFBhZ2luYXRpb25JdGVtO1xufShDb21wb25lbnQpO1xuXG5QYWdpbmF0aW9uSXRlbS5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJkaXNhYmxlZFwiLCBcIm9uQ2xpY2tcIiwgXCJvbktleURvd25cIiwgXCJ0eXBlXCJdO1xuUGFnaW5hdGlvbkl0ZW0ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQSBwYWdpbmF0aW9uIGl0ZW0gY2FuIGJlIGFjdGl2ZS4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBwYWdpbmF0aW9uIGl0ZW0gY2FuIGJlIGRpc2FibGVkLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBjbGljay5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24ga2V5IGRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbktleURvd246IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBBIHBhZ2luYXRpb24gc2hvdWxkIGhhdmUgYSB0eXBlLiAqL1xuICB0eXBlOiBQcm9wVHlwZXMub25lT2YoWydlbGxpcHNpc0l0ZW0nLCAnZmlyc3RJdGVtJywgJ3ByZXZJdGVtJywgJ3BhZ2VJdGVtJywgJ25leHRJdGVtJywgJ2xhc3RJdGVtJ10pXG59IDoge307XG5QYWdpbmF0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KFBhZ2luYXRpb25JdGVtLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgUGFnaW5hdGlvbkl0ZW07IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vUGFnaW5hdGlvbic7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgRXZlbnRTdGFjayBmcm9tICdAc2VtYW50aWMtdWktcmVhY3QvZXZlbnQtc3RhY2snO1xuaW1wb3J0IHsgaGFuZGxlUmVmLCBSZWYgfSBmcm9tICdAZmx1ZW50dWkvcmVhY3QtY29tcG9uZW50LXJlZic7XG5pbXBvcnQga2V5Ym9hcmRLZXkgZnJvbSAna2V5Ym9hcmQta2V5JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgQ29tcG9uZW50LCBjdXN0b21Qcm9wVHlwZXMsIGRvZXNOb2RlQ29udGFpbkNsaWNrIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB2YWxpZGF0ZVRyaWdnZXIgZnJvbSAnLi91dGlscy92YWxpZGF0ZVRyaWdnZXInO1xuaW1wb3J0IFBvcnRhbElubmVyIGZyb20gJy4vUG9ydGFsSW5uZXInO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgYWxsb3dzIHlvdSB0byByZW5kZXIgY2hpbGRyZW4gb3V0c2lkZSB0aGVpciBwYXJlbnQuXG4gKiBAc2VlIE1vZGFsXG4gKiBAc2VlIFBvcHVwXG4gKiBAc2VlIERpbW1lclxuICogQHNlZSBDb25maXJtXG4gKi9cbnZhciBQb3J0YWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUG9ydGFsLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQb3J0YWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgX3RoaXMuY29udGVudFJlZiA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy50cmlnZ2VyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICAgIF90aGlzLmxhdGVzdERvY3VtZW50TW91c2VEb3duRXZlbnQgPSBudWxsO1xuXG4gICAgX3RoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZURvd24gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMubGF0ZXN0RG9jdW1lbnRNb3VzZURvd25FdmVudCA9IGU7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZURvY3VtZW50Q2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNsb3NlT25Eb2N1bWVudENsaWNrID0gX3RoaXMucHJvcHMuY2xvc2VPbkRvY3VtZW50Q2xpY2s7XG4gICAgICB2YXIgY3VycmVudE1vdXNlRG93bkV2ZW50ID0gX3RoaXMubGF0ZXN0RG9jdW1lbnRNb3VzZURvd25FdmVudDtcbiAgICAgIF90aGlzLmxhdGVzdERvY3VtZW50TW91c2VEb3duRXZlbnQgPSBudWxsO1xuXG4gICAgICBpZiAoIV90aGlzLmNvbnRlbnRSZWYuY3VycmVudCB8fCAvLyBubyBwb3J0YWxcbiAgICAgIGRvZXNOb2RlQ29udGFpbkNsaWNrKF90aGlzLnRyaWdnZXJSZWYuY3VycmVudCwgZSkgfHwgLy8gZXZlbnQgaGFwcGVuZWQgaW4gdHJpZ2dlciAoZGVsZWdhdGUgdG8gdHJpZ2dlciBoYW5kbGVycylcbiAgICAgIGN1cnJlbnRNb3VzZURvd25FdmVudCAmJiBkb2VzTm9kZUNvbnRhaW5DbGljayhfdGhpcy5jb250ZW50UmVmLmN1cnJlbnQsIGN1cnJlbnRNb3VzZURvd25FdmVudCkgfHwgLy8gZXZlbnQgb3JpZ2luYXRlZCBpbiB0aGUgcG9ydGFsIGJ1dCB3YXMgZW5kZWQgb3V0c2lkZVxuICAgICAgZG9lc05vZGVDb250YWluQ2xpY2soX3RoaXMuY29udGVudFJlZi5jdXJyZW50LCBlKSAvLyBldmVudCBoYXBwZW5lZCBpbiB0aGUgcG9ydGFsXG4gICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gaWdub3JlIHRoZSBjbGlja1xuXG5cbiAgICAgIGlmIChjbG9zZU9uRG9jdW1lbnRDbGljaykge1xuICAgICAgICBfdGhpcy5jbG9zZShlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlRXNjYXBlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghX3RoaXMucHJvcHMuY2xvc2VPbkVzY2FwZSkgcmV0dXJuO1xuICAgICAgaWYgKGtleWJvYXJkS2V5LmdldENvZGUoZSkgIT09IGtleWJvYXJkS2V5LkVzY2FwZSkgcmV0dXJuO1xuXG4gICAgICBfdGhpcy5jbG9zZShlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUG9ydGFsTW91c2VMZWF2ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjbG9zZU9uUG9ydGFsTW91c2VMZWF2ZSA9IF90aGlzJHByb3BzLmNsb3NlT25Qb3J0YWxNb3VzZUxlYXZlLFxuICAgICAgICAgIG1vdXNlTGVhdmVEZWxheSA9IF90aGlzJHByb3BzLm1vdXNlTGVhdmVEZWxheTtcbiAgICAgIGlmICghY2xvc2VPblBvcnRhbE1vdXNlTGVhdmUpIHJldHVybjsgLy8gRG8gbm90IGNsb3NlIHRoZSBwb3J0YWwgd2hlbiAnbW91c2VsZWF2ZScgaXMgdHJpZ2dlcmVkIGJ5IGNoaWxkcmVuXG5cbiAgICAgIGlmIChlLnRhcmdldCAhPT0gX3RoaXMuY29udGVudFJlZi5jdXJyZW50KSByZXR1cm47XG4gICAgICBfdGhpcy5tb3VzZUxlYXZlVGltZXIgPSBfdGhpcy5jbG9zZVdpdGhUaW1lb3V0KGUsIG1vdXNlTGVhdmVEZWxheSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVBvcnRhbE1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBJbiBvcmRlciB0byBlbmFibGUgbW91c2luZyBmcm9tIHRoZSB0cmlnZ2VyIHRvIHRoZSBwb3J0YWwsIHdlIG5lZWQgdG9cbiAgICAgIC8vIGNsZWFyIHRoZSBtb3VzZWxlYXZlIHRpbWVyIHRoYXQgd2FzIHNldCB3aGVuIGxlYXZpbmcgdGhlIHRyaWdnZXIuXG4gICAgICB2YXIgY2xvc2VPblBvcnRhbE1vdXNlTGVhdmUgPSBfdGhpcy5wcm9wcy5jbG9zZU9uUG9ydGFsTW91c2VMZWF2ZTtcbiAgICAgIGlmICghY2xvc2VPblBvcnRhbE1vdXNlTGVhdmUpIHJldHVybjtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpcy5tb3VzZUxlYXZlVGltZXIpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmlnZ2VyQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzMi50cmlnZ2VyLFxuICAgICAgICAgIGNsb3NlT25UcmlnZ2VyQmx1ciA9IF90aGlzJHByb3BzMi5jbG9zZU9uVHJpZ2dlckJsdXI7IC8vIENhbGwgb3JpZ2luYWwgZXZlbnQgaGFuZGxlclxuXG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICByZXN0W19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBfaW52b2tlLmFwcGx5KHZvaWQgMCwgW3RyaWdnZXIsICdwcm9wcy5vbkJsdXInLCBlXS5jb25jYXQocmVzdCkpOyAvLyBJRSAxMSBkb2Vzbid0IHdvcmsgd2l0aCByZWxhdGVkVGFyZ2V0IGluIGJsdXIgZXZlbnRzXG5cblxuICAgICAgdmFyIHRhcmdldCA9IGUucmVsYXRlZFRhcmdldCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50OyAvLyBkbyBub3QgY2xvc2UgaWYgZm9jdXMgaXMgZ2l2ZW4gdG8gdGhlIHBvcnRhbFxuXG4gICAgICB2YXIgZGlkRm9jdXNQb3J0YWwgPSBfaW52b2tlKF90aGlzLmNvbnRlbnRSZWYuY3VycmVudCwgJ2NvbnRhaW5zJywgdGFyZ2V0KTtcblxuICAgICAgaWYgKCFjbG9zZU9uVHJpZ2dlckJsdXIgfHwgZGlkRm9jdXNQb3J0YWwpIHJldHVybjtcblxuICAgICAgX3RoaXMuY2xvc2UoZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyaWdnZXJDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzMy50cmlnZ2VyLFxuICAgICAgICAgIGNsb3NlT25UcmlnZ2VyQ2xpY2sgPSBfdGhpcyRwcm9wczMuY2xvc2VPblRyaWdnZXJDbGljayxcbiAgICAgICAgICBvcGVuT25UcmlnZ2VyQ2xpY2sgPSBfdGhpcyRwcm9wczMub3Blbk9uVHJpZ2dlckNsaWNrO1xuICAgICAgdmFyIG9wZW4gPSBfdGhpcy5zdGF0ZS5vcGVuOyAvLyBDYWxsIG9yaWdpbmFsIGV2ZW50IGhhbmRsZXJcblxuICAgICAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4zID4gMSA/IF9sZW4zIC0gMSA6IDApLCBfa2V5MyA9IDE7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICAgICAgcmVzdFtfa2V5MyAtIDFdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgICAgIH1cblxuICAgICAgX2ludm9rZS5hcHBseSh2b2lkIDAsIFt0cmlnZ2VyLCAncHJvcHMub25DbGljaycsIGVdLmNvbmNhdChyZXN0KSk7XG5cbiAgICAgIGlmIChvcGVuICYmIGNsb3NlT25UcmlnZ2VyQ2xpY2spIHtcbiAgICAgICAgX3RoaXMuY2xvc2UoZSk7XG4gICAgICB9IGVsc2UgaWYgKCFvcGVuICYmIG9wZW5PblRyaWdnZXJDbGljaykge1xuICAgICAgICBfdGhpcy5vcGVuKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmlnZ2VyRm9jdXMgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczQudHJpZ2dlcixcbiAgICAgICAgICBvcGVuT25UcmlnZ2VyRm9jdXMgPSBfdGhpcyRwcm9wczQub3Blbk9uVHJpZ2dlckZvY3VzOyAvLyBDYWxsIG9yaWdpbmFsIGV2ZW50IGhhbmRsZXJcblxuICAgICAgZm9yICh2YXIgX2xlbjQgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW40ID4gMSA/IF9sZW40IC0gMSA6IDApLCBfa2V5NCA9IDE7IF9rZXk0IDwgX2xlbjQ7IF9rZXk0KyspIHtcbiAgICAgICAgcmVzdFtfa2V5NCAtIDFdID0gYXJndW1lbnRzW19rZXk0XTtcbiAgICAgIH1cblxuICAgICAgX2ludm9rZS5hcHBseSh2b2lkIDAsIFt0cmlnZ2VyLCAncHJvcHMub25Gb2N1cycsIGVdLmNvbmNhdChyZXN0KSk7XG5cbiAgICAgIGlmICghb3Blbk9uVHJpZ2dlckZvY3VzKSByZXR1cm47XG5cbiAgICAgIF90aGlzLm9wZW4oZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyaWdnZXJNb3VzZUxlYXZlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNsZWFyVGltZW91dChfdGhpcy5tb3VzZUVudGVyVGltZXIpO1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczUudHJpZ2dlcixcbiAgICAgICAgICBjbG9zZU9uVHJpZ2dlck1vdXNlTGVhdmUgPSBfdGhpcyRwcm9wczUuY2xvc2VPblRyaWdnZXJNb3VzZUxlYXZlLFxuICAgICAgICAgIG1vdXNlTGVhdmVEZWxheSA9IF90aGlzJHByb3BzNS5tb3VzZUxlYXZlRGVsYXk7IC8vIENhbGwgb3JpZ2luYWwgZXZlbnQgaGFuZGxlclxuXG4gICAgICBmb3IgKHZhciBfbGVuNSA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbjUgPiAxID8gX2xlbjUgLSAxIDogMCksIF9rZXk1ID0gMTsgX2tleTUgPCBfbGVuNTsgX2tleTUrKykge1xuICAgICAgICByZXN0W19rZXk1IC0gMV0gPSBhcmd1bWVudHNbX2tleTVdO1xuICAgICAgfVxuXG4gICAgICBfaW52b2tlLmFwcGx5KHZvaWQgMCwgW3RyaWdnZXIsICdwcm9wcy5vbk1vdXNlTGVhdmUnLCBlXS5jb25jYXQocmVzdCkpO1xuXG4gICAgICBpZiAoIWNsb3NlT25UcmlnZ2VyTW91c2VMZWF2ZSkgcmV0dXJuO1xuICAgICAgX3RoaXMubW91c2VMZWF2ZVRpbWVyID0gX3RoaXMuY2xvc2VXaXRoVGltZW91dChlLCBtb3VzZUxlYXZlRGVsYXkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmlnZ2VyTW91c2VFbnRlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBjbGVhclRpbWVvdXQoX3RoaXMubW91c2VMZWF2ZVRpbWVyKTtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICB0cmlnZ2VyID0gX3RoaXMkcHJvcHM2LnRyaWdnZXIsXG4gICAgICAgICAgbW91c2VFbnRlckRlbGF5ID0gX3RoaXMkcHJvcHM2Lm1vdXNlRW50ZXJEZWxheSxcbiAgICAgICAgICBvcGVuT25UcmlnZ2VyTW91c2VFbnRlciA9IF90aGlzJHByb3BzNi5vcGVuT25UcmlnZ2VyTW91c2VFbnRlcjsgLy8gQ2FsbCBvcmlnaW5hbCBldmVudCBoYW5kbGVyXG5cbiAgICAgIGZvciAodmFyIF9sZW42ID0gYXJndW1lbnRzLmxlbmd0aCwgcmVzdCA9IG5ldyBBcnJheShfbGVuNiA+IDEgPyBfbGVuNiAtIDEgOiAwKSwgX2tleTYgPSAxOyBfa2V5NiA8IF9sZW42OyBfa2V5NisrKSB7XG4gICAgICAgIHJlc3RbX2tleTYgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Nl07XG4gICAgICB9XG5cbiAgICAgIF9pbnZva2UuYXBwbHkodm9pZCAwLCBbdHJpZ2dlciwgJ3Byb3BzLm9uTW91c2VFbnRlcicsIGVdLmNvbmNhdChyZXN0KSk7XG5cbiAgICAgIGlmICghb3Blbk9uVHJpZ2dlck1vdXNlRW50ZXIpIHJldHVybjtcbiAgICAgIF90aGlzLm1vdXNlRW50ZXJUaW1lciA9IF90aGlzLm9wZW5XaXRoVGltZW91dChlLCBtb3VzZUVudGVyRGVsYXkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5vcGVuID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbk9wZW4nLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgb3BlbjogdHJ1ZVxuICAgICAgfSkpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG9wZW46IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5vcGVuV2l0aFRpbWVvdXQgPSBmdW5jdGlvbiAoZSwgZGVsYXkpIHtcbiAgICAgIC8vIFJlYWN0IHdpcGVzIHRoZSBlbnRpcmUgZXZlbnQgb2JqZWN0IGFuZCBzdWdnZXN0cyB1c2luZyBlLnBlcnNpc3QoKSBpZlxuICAgICAgLy8geW91IG5lZWQgdGhlIGV2ZW50IGZvciBhc3luYyBhY2Nlc3MuIEhvd2V2ZXIsIGV2ZW4gd2l0aCBlLnBlcnNpc3RcbiAgICAgIC8vIGNlcnRhaW4gcmVxdWlyZWQgcHJvcHMgKGUuZy4gY3VycmVudFRhcmdldCkgYXJlIG51bGwgc28gd2UncmUgZm9yY2VkIHRvIGNsb25lLlxuICAgICAgdmFyIGV2ZW50Q2xvbmUgPSBfZXh0ZW5kcyh7fSwgZSk7XG5cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLm9wZW4oZXZlbnRDbG9uZSk7XG4gICAgICB9LCBkZWxheSB8fCAwKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuY2xvc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xvc2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgb3BlbjogZmFsc2VcbiAgICAgIH0pKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmNsb3NlV2l0aFRpbWVvdXQgPSBmdW5jdGlvbiAoZSwgZGVsYXkpIHtcbiAgICAgIC8vIFJlYWN0IHdpcGVzIHRoZSBlbnRpcmUgZXZlbnQgb2JqZWN0IGFuZCBzdWdnZXN0cyB1c2luZyBlLnBlcnNpc3QoKSBpZlxuICAgICAgLy8geW91IG5lZWQgdGhlIGV2ZW50IGZvciBhc3luYyBhY2Nlc3MuIEhvd2V2ZXIsIGV2ZW4gd2l0aCBlLnBlcnNpc3RcbiAgICAgIC8vIGNlcnRhaW4gcmVxdWlyZWQgcHJvcHMgKGUuZy4gY3VycmVudFRhcmdldCkgYXJlIG51bGwgc28gd2UncmUgZm9yY2VkIHRvIGNsb25lLlxuICAgICAgdmFyIGV2ZW50Q2xvbmUgPSBfZXh0ZW5kcyh7fSwgZSk7XG5cbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmNsb3NlKGV2ZW50Q2xvbmUpO1xuICAgICAgfSwgZGVsYXkgfHwgMCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vdW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91bnQnLCBudWxsLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVVubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25Vbm1vdW50JywgbnVsbCwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVUcmlnZ2VyUmVmID0gZnVuY3Rpb24gKGMpIHtcbiAgICAgIF90aGlzLnRyaWdnZXJSZWYuY3VycmVudCA9IGM7XG4gICAgICBoYW5kbGVSZWYoX3RoaXMucHJvcHMudHJpZ2dlclJlZiwgYyk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQb3J0YWwucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIC8vIENsZWFuIHVwIHRpbWVyc1xuICAgIGNsZWFyVGltZW91dCh0aGlzLm1vdXNlRW50ZXJUaW1lcik7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubW91c2VMZWF2ZVRpbWVyKTtcbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIERvY3VtZW50IEV2ZW50IEhhbmRsZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzNyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHM3LmNoaWxkcmVuLFxuICAgICAgICBldmVudFBvb2wgPSBfdGhpcyRwcm9wczcuZXZlbnRQb29sLFxuICAgICAgICBtb3VudE5vZGUgPSBfdGhpcyRwcm9wczcubW91bnROb2RlLFxuICAgICAgICB0cmlnZ2VyID0gX3RoaXMkcHJvcHM3LnRyaWdnZXI7XG4gICAgdmFyIG9wZW4gPSB0aGlzLnN0YXRlLm9wZW47XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVRyaWdnZXIodHJpZ2dlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBvcGVuICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWxJbm5lciwge1xuICAgICAgaW5uZXJSZWY6IHRoaXMuY29udGVudFJlZixcbiAgICAgIG1vdW50Tm9kZTogbW91bnROb2RlLFxuICAgICAgb25Nb3VudDogdGhpcy5oYW5kbGVNb3VudCxcbiAgICAgIG9uVW5tb3VudDogdGhpcy5oYW5kbGVVbm1vdW50XG4gICAgfSwgY2hpbGRyZW4pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFdmVudFN0YWNrLCB7XG4gICAgICBuYW1lOiBcIm1vdXNlbGVhdmVcIixcbiAgICAgIG9uOiB0aGlzLmhhbmRsZVBvcnRhbE1vdXNlTGVhdmUsXG4gICAgICBwb29sOiBldmVudFBvb2wsXG4gICAgICB0YXJnZXQ6IHRoaXMuY29udGVudFJlZlxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFdmVudFN0YWNrLCB7XG4gICAgICBuYW1lOiBcIm1vdXNlZW50ZXJcIixcbiAgICAgIG9uOiB0aGlzLmhhbmRsZVBvcnRhbE1vdXNlRW50ZXIsXG4gICAgICBwb29sOiBldmVudFBvb2wsXG4gICAgICB0YXJnZXQ6IHRoaXMuY29udGVudFJlZlxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFdmVudFN0YWNrLCB7XG4gICAgICBuYW1lOiBcIm1vdXNlZG93blwiLFxuICAgICAgb246IHRoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZURvd24sXG4gICAgICBwb29sOiBldmVudFBvb2xcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRTdGFjaywge1xuICAgICAgbmFtZTogXCJjbGlja1wiLFxuICAgICAgb246IHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljayxcbiAgICAgIHBvb2w6IGV2ZW50UG9vbFxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFdmVudFN0YWNrLCB7XG4gICAgICBuYW1lOiBcImtleWRvd25cIixcbiAgICAgIG9uOiB0aGlzLmhhbmRsZUVzY2FwZSxcbiAgICAgIHBvb2w6IGV2ZW50UG9vbFxuICAgIH0pKSwgdHJpZ2dlciAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWYsIHtcbiAgICAgIGlubmVyUmVmOiB0aGlzLmhhbmRsZVRyaWdnZXJSZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KHRyaWdnZXIsIHtcbiAgICAgIG9uQmx1cjogdGhpcy5oYW5kbGVUcmlnZ2VyQmx1cixcbiAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlVHJpZ2dlckNsaWNrLFxuICAgICAgb25Gb2N1czogdGhpcy5oYW5kbGVUcmlnZ2VyRm9jdXMsXG4gICAgICBvbk1vdXNlTGVhdmU6IHRoaXMuaGFuZGxlVHJpZ2dlck1vdXNlTGVhdmUsXG4gICAgICBvbk1vdXNlRW50ZXI6IHRoaXMuaGFuZGxlVHJpZ2dlck1vdXNlRW50ZXJcbiAgICB9KSkpO1xuICB9O1xuXG4gIHJldHVybiBQb3J0YWw7XG59KENvbXBvbmVudCk7XG5cblBvcnRhbC5oYW5kbGVkUHJvcHMgPSBbXCJjaGlsZHJlblwiLCBcImNsb3NlT25Eb2N1bWVudENsaWNrXCIsIFwiY2xvc2VPbkVzY2FwZVwiLCBcImNsb3NlT25Qb3J0YWxNb3VzZUxlYXZlXCIsIFwiY2xvc2VPblRyaWdnZXJCbHVyXCIsIFwiY2xvc2VPblRyaWdnZXJDbGlja1wiLCBcImNsb3NlT25UcmlnZ2VyTW91c2VMZWF2ZVwiLCBcImRlZmF1bHRPcGVuXCIsIFwiZXZlbnRQb29sXCIsIFwibW91bnROb2RlXCIsIFwibW91c2VFbnRlckRlbGF5XCIsIFwibW91c2VMZWF2ZURlbGF5XCIsIFwib25DbG9zZVwiLCBcIm9uTW91bnRcIiwgXCJvbk9wZW5cIiwgXCJvblVubW91bnRcIiwgXCJvcGVuXCIsIFwib3Blbk9uVHJpZ2dlckNsaWNrXCIsIFwib3Blbk9uVHJpZ2dlckZvY3VzXCIsIFwib3Blbk9uVHJpZ2dlck1vdXNlRW50ZXJcIiwgXCJ0cmlnZ2VyXCIsIFwidHJpZ2dlclJlZlwiXTtcblBvcnRhbC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9ydGFsIHNob3VsZCBjbG9zZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBjbGlja2VkLiAqL1xuICBjbG9zZU9uRG9jdW1lbnRDbGljazogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBwb3J0YWwgc2hvdWxkIGNsb3NlIHdoZW4gZXNjYXBlIGlzIHByZXNzZWQgaXMgZGlzcGxheWVkLiAqL1xuICBjbG9zZU9uRXNjYXBlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHBvcnRhbCBzaG91bGQgY2xvc2Ugd2hlbiBtb3VzaW5nIG91dCBvZiB0aGUgcG9ydGFsLlxuICAgKiBOT1RFOiBUaGlzIHdpbGwgcHJldmVudCBgY2xvc2VPblRyaWdnZXJNb3VzZUxlYXZlYCB3aGVuIG1vdXNpbmcgb3ZlciB0aGVcbiAgICogZ2FwIGZyb20gdGhlIHRyaWdnZXIgdG8gdGhlIHBvcnRhbC5cbiAgICovXG4gIGNsb3NlT25Qb3J0YWxNb3VzZUxlYXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHBvcnRhbCBzaG91bGQgY2xvc2Ugb24gYmx1ciBvZiB0aGUgdHJpZ2dlci4gKi9cbiAgY2xvc2VPblRyaWdnZXJCbHVyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHBvcnRhbCBzaG91bGQgY2xvc2Ugb24gY2xpY2sgb2YgdGhlIHRyaWdnZXIuICovXG4gIGNsb3NlT25UcmlnZ2VyQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9ydGFsIHNob3VsZCBjbG9zZSB3aGVuIG1vdXNpbmcgb3V0IG9mIHRoZSB0cmlnZ2VyLiAqL1xuICBjbG9zZU9uVHJpZ2dlck1vdXNlTGVhdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBJbml0aWFsIHZhbHVlIG9mIG9wZW4uICovXG4gIGRlZmF1bHRPcGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRXZlbnQgcG9vbCBuYW1lc3BhY2UgdGhhdCBpcyB1c2VkIHRvIGhhbmRsZSBjb21wb25lbnQgZXZlbnRzICovXG4gIGV2ZW50UG9vbDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogVGhlIG5vZGUgd2hlcmUgdGhlIHBvcnRhbCBzaG91bGQgbW91bnQuICovXG4gIG1vdW50Tm9kZTogUHJvcFR5cGVzLmFueSxcblxuICAvKiogTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIG9wZW5pbmcgb24gbW91c2Ugb3ZlciAqL1xuICBtb3VzZUVudGVyRGVsYXk6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjbG9zaW5nIG9uIG1vdXNlIGxlYXZlICovXG4gIG1vdXNlTGVhdmVEZWxheTogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBjbG9zZSBldmVudCBoYXBwZW5zXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBvcnRhbCBpcyBtb3VudGVkIG9uIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk1vdW50OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYW4gb3BlbiBldmVudCBoYXBwZW5zXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk9wZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcG9ydGFsIGlzIHVubW91bnRlZCBmcm9tIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvblVubW91bnQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9ydGFsIGlzIGRpc3BsYXllZC4gKi9cbiAgb3BlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBwb3J0YWwgc2hvdWxkIG9wZW4gd2hlbiB0aGUgdHJpZ2dlciBpcyBjbGlja2VkLiAqL1xuICBvcGVuT25UcmlnZ2VyQ2xpY2s6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9ydGFsIHNob3VsZCBvcGVuIG9uIGZvY3VzIG9mIHRoZSB0cmlnZ2VyLiAqL1xuICBvcGVuT25UcmlnZ2VyRm9jdXM6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgcG9ydGFsIHNob3VsZCBvcGVuIHdoZW4gbW91c2luZyBvdmVyIHRoZSB0cmlnZ2VyLiAqL1xuICBvcGVuT25UcmlnZ2VyTW91c2VFbnRlcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEVsZW1lbnQgdG8gYmUgcmVuZGVyZWQgaW4tcGxhY2Ugd2hlcmUgdGhlIHBvcnRhbCBpcyBkZWZpbmVkLiAqL1xuICB0cmlnZ2VyOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQ2FsbGVkIHdpdGggYSByZWYgdG8gdGhlIHRyaWdnZXIgbm9kZS4gKi9cbiAgdHJpZ2dlclJlZjogY3VzdG9tUHJvcFR5cGVzLnJlZlxufSA6IHt9O1xuUG9ydGFsLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xvc2VPbkRvY3VtZW50Q2xpY2s6IHRydWUsXG4gIGNsb3NlT25Fc2NhcGU6IHRydWUsXG4gIGV2ZW50UG9vbDogJ2RlZmF1bHQnLFxuICBvcGVuT25UcmlnZ2VyQ2xpY2s6IHRydWVcbn07XG5Qb3J0YWwuYXV0b0NvbnRyb2xsZWRQcm9wcyA9IFsnb3BlbiddO1xuUG9ydGFsLklubmVyID0gUG9ydGFsSW5uZXI7XG5leHBvcnQgZGVmYXVsdCBQb3J0YWw7IiwiaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IHsgaGFuZGxlUmVmLCBSZWYgfSBmcm9tICdAZmx1ZW50dWkvcmVhY3QtY29tcG9uZW50LXJlZic7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgeyBjdXN0b21Qcm9wVHlwZXMsIGlzQnJvd3NlciB9IGZyb20gJy4uLy4uL2xpYic7XG5cbi8qKlxuICogQW4gaW5uZXIgY29tcG9uZW50IHRoYXQgYWxsb3dzIHlvdSB0byByZW5kZXIgY2hpbGRyZW4gb3V0c2lkZSB0aGVpciBwYXJlbnQuXG4gKi9cbnZhciBQb3J0YWxJbm5lciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShQb3J0YWxJbm5lciwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUG9ydGFsSW5uZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVSZWYgPSBmdW5jdGlvbiAoYykge1xuICAgICAgaGFuZGxlUmVmKF90aGlzLnByb3BzLmlubmVyUmVmLCBjKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFBvcnRhbElubmVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBfaW52b2tlKHRoaXMucHJvcHMsICdvbk1vdW50JywgbnVsbCwgdGhpcy5wcm9wcyk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgX2ludm9rZSh0aGlzLnByb3BzLCAnb25Vbm1vdW50JywgbnVsbCwgdGhpcy5wcm9wcyk7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm4gbnVsbDtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBfdGhpcyRwcm9wcyRtb3VudE5vZGUgPSBfdGhpcyRwcm9wcy5tb3VudE5vZGUsXG4gICAgICAgIG1vdW50Tm9kZSA9IF90aGlzJHByb3BzJG1vdW50Tm9kZSA9PT0gdm9pZCAwID8gZG9jdW1lbnQuYm9keSA6IF90aGlzJHByb3BzJG1vdW50Tm9kZTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL2NyZWF0ZVBvcnRhbCggLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVmLCB7XG4gICAgICBpbm5lclJlZjogdGhpcy5oYW5kbGVSZWZcbiAgICB9LCBjaGlsZHJlbiksIG1vdW50Tm9kZSk7XG4gIH07XG5cbiAgcmV0dXJuIFBvcnRhbElubmVyO1xufShDb21wb25lbnQpO1xuXG5Qb3J0YWxJbm5lci5oYW5kbGVkUHJvcHMgPSBbXCJjaGlsZHJlblwiLCBcImlubmVyUmVmXCIsIFwibW91bnROb2RlXCIsIFwib25Nb3VudFwiLCBcIm9uVW5tb3VudFwiXTtcblBvcnRhbElubmVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqIENhbGxlZCB3aXRoIGEgcmVmIHRvIHRoZSBpbm5lciBub2RlLiAqL1xuICBpbm5lclJlZjogY3VzdG9tUHJvcFR5cGVzLnJlZixcblxuICAvKiogVGhlIG5vZGUgd2hlcmUgdGhlIHBvcnRhbCBzaG91bGQgbW91bnQuICovXG4gIG1vdW50Tm9kZTogUHJvcFR5cGVzLmFueSxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBvcnRhbCBpcyBtb3VudGVkIG9uIHRoZSBET01cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uTW91bnQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcG9ydGFsIGlzIHVubW91bnRlZCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uVW5tb3VudDogUHJvcFR5cGVzLmZ1bmNcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IFBvcnRhbElubmVyOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1BvcnRhbCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCAqIGFzIFJlYWN0SXMgZnJvbSAncmVhY3QtaXMnO1xuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYSBwYXNzZWQgZWxlbWVudCBjYW4gYmUgdXNlZCBjbG9uZWQgYSBwcm9wcyB3aWxsIGJlIGFwcGxpZWQgcHJvcGVybHkuXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdmFsaWRhdGVUcmlnZ2VyKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQpIHtcbiAgICBSZWFjdC5DaGlsZHJlbi5vbmx5KGVsZW1lbnQpO1xuXG4gICAgaWYgKFJlYWN0SXMuaXNGcmFnbWVudChlbGVtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBcIlJlYWN0LkZyYWdtZW50XCIgY2Fubm90IGJlIHVzZWQgYXMgYSBgdHJpZ2dlcmAuJyk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IENoZWNrYm94IGZyb20gJy4uLy4uL21vZHVsZXMvQ2hlY2tib3gnO1xuLyoqXG4gKiBBIFJhZGlvIGlzIHN1Z2FyIGZvciA8Q2hlY2tib3ggcmFkaW8gLz4uXG4gKiBVc2VmdWwgZm9yIGV4Y2x1c2l2ZSBncm91cHMgb2Ygc2xpZGVycyBvciB0b2dnbGVzLlxuICogQHNlZSBDaGVja2JveFxuICogQHNlZSBGb3JtXG4gKi9cblxuZnVuY3Rpb24gUmFkaW8ocHJvcHMpIHtcbiAgdmFyIHNsaWRlciA9IHByb3BzLnNsaWRlcixcbiAgICAgIHRvZ2dsZSA9IHByb3BzLnRvZ2dsZSxcbiAgICAgIHR5cGUgPSBwcm9wcy50eXBlO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFJhZGlvLCBwcm9wcyk7IC8vIGNvbnN0IEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUmFkaW8sIHByb3BzKVxuICAvLyByYWRpbywgc2xpZGVyLCB0b2dnbGUgYXJlIGV4Y2x1c2l2ZVxuICAvLyB1c2UgYW4gdW5kZWZpbmVkIHJhZGlvIGlmIHNsaWRlciBvciB0b2dnbGUgYXJlIHByZXNlbnRcblxuICB2YXIgcmFkaW8gPSAhKHNsaWRlciB8fCB0b2dnbGUpIHx8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIHR5cGU6IHR5cGUsXG4gICAgcmFkaW86IHJhZGlvLFxuICAgIHNsaWRlcjogc2xpZGVyLFxuICAgIHRvZ2dsZTogdG9nZ2xlXG4gIH0pKTtcbn1cblxuUmFkaW8uaGFuZGxlZFByb3BzID0gW1wic2xpZGVyXCIsIFwidG9nZ2xlXCIsIFwidHlwZVwiXTtcblJhZGlvLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEZvcm1hdCB0byBlbXBoYXNpemUgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlLiAqL1xuICBzbGlkZXI6IENoZWNrYm94LnByb3BUeXBlcy5zbGlkZXIsXG5cbiAgLyoqIEZvcm1hdCB0byBzaG93IGFuIG9uIG9yIG9mZiBjaG9pY2UuICovXG4gIHRvZ2dsZTogQ2hlY2tib3gucHJvcFR5cGVzLnRvZ2dsZSxcblxuICAvKiogSFRNTCBpbnB1dCB0eXBlLCBlaXRoZXIgY2hlY2tib3ggb3IgcmFkaW8uICovXG4gIHR5cGU6IENoZWNrYm94LnByb3BUeXBlcy50eXBlXG59IDoge307XG5SYWRpby5kZWZhdWx0UHJvcHMgPSB7XG4gIHR5cGU6ICdyYWRpbydcbn07XG5leHBvcnQgZGVmYXVsdCBSYWRpbzsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9SYWRpbyc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuLi8uLi9tb2R1bGVzL0Ryb3Bkb3duJztcbi8qKlxuICogQSBTZWxlY3QgaXMgc3VnYXIgZm9yIDxEcm9wZG93biBzZWxlY3Rpb24gLz4uXG4gKiBAc2VlIERyb3Bkb3duXG4gKiBAc2VlIEZvcm1cbiAqL1xuXG5mdW5jdGlvbiBTZWxlY3QocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duLCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICBzZWxlY3Rpb246IHRydWVcbiAgfSkpO1xufVxuXG5TZWxlY3QuaGFuZGxlZFByb3BzID0gW1wib3B0aW9uc1wiXTtcblNlbGVjdC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBcnJheSBvZiBEcm9wZG93bi5JdGVtIHByb3BzIGUuZy4gYHsgdGV4dDogJycsIHZhbHVlOiAnJyB9YCAqL1xuICBvcHRpb25zOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoRHJvcGRvd24uSXRlbS5wcm9wVHlwZXMpKS5pc1JlcXVpcmVkXG59IDoge307XG5TZWxlY3QuRGl2aWRlciA9IERyb3Bkb3duLkRpdmlkZXI7XG5TZWxlY3QuSGVhZGVyID0gRHJvcGRvd24uSGVhZGVyO1xuU2VsZWN0Lkl0ZW0gPSBEcm9wZG93bi5JdGVtO1xuU2VsZWN0Lk1lbnUgPSBEcm9wZG93bi5NZW51O1xuZXhwb3J0IGRlZmF1bHQgU2VsZWN0OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1NlbGVjdCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoLWVzL2dldFwiO1xuaW1wb3J0IHsgUmVmIH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgVGV4dEFyZWEgY2FuIGJlIHVzZWQgdG8gYWxsb3cgZm9yIGV4dGVuZGVkIHVzZXIgaW5wdXQuXG4gKiBAc2VlIEZvcm1cbiAqL1xuXG52YXIgVGV4dEFyZWEgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVGV4dEFyZWEsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRleHRBcmVhKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnJlZiA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBfZ2V0KGUsICd0YXJnZXQudmFsdWUnKTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2hhbmdlJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVJbnB1dCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgdmFsdWUgPSBfZ2V0KGUsICd0YXJnZXQudmFsdWUnKTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uSW5wdXQnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUZXh0QXJlYS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICByb3dzID0gX3RoaXMkcHJvcHMucm93cyxcbiAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFRleHRBcmVhLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShUZXh0QXJlYSwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgICAgaW5uZXJSZWY6IHRoaXMucmVmXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBvbkNoYW5nZTogdGhpcy5oYW5kbGVDaGFuZ2UsXG4gICAgICBvbklucHV0OiB0aGlzLmhhbmRsZUlucHV0LFxuICAgICAgcm93czogcm93cyxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pKSk7XG4gIH07XG5cbiAgcmV0dXJuIFRleHRBcmVhO1xufShDb21wb25lbnQpO1xuXG5UZXh0QXJlYS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcIm9uQ2hhbmdlXCIsIFwib25JbnB1dFwiLCBcInJvd3NcIiwgXCJ2YWx1ZVwiXTtcblRleHRBcmVhLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBjaGFuZ2UuXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gVGhlIFJlYWN0IFN5bnRoZXRpY0V2ZW50IG9iamVjdFxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgdGhlIGV2ZW50IHZhbHVlLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gaW5wdXQuXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gVGhlIFJlYWN0IFN5bnRoZXRpY0V2ZW50IG9iamVjdFxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgdGhlIGV2ZW50IHZhbHVlLlxuICAgKi9cbiAgb25JbnB1dDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEluZGljYXRlcyByb3cgY291bnQgZm9yIGEgVGV4dEFyZWEuICovXG4gIHJvd3M6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogVGhlIHZhbHVlIG9mIHRoZSB0ZXh0YXJlYS4gKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKVxufSA6IHt9O1xuVGV4dEFyZWEuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ3RleHRhcmVhJyxcbiAgcm93czogM1xufTtcbmV4cG9ydCBkZWZhdWx0IFRleHRBcmVhOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1RleHRBcmVhJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBfaXNVbmRlZmluZWQgZnJvbSBcImxvZGFzaC1lcy9pc1VuZGVmaW5lZFwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUG9ydGFsIGZyb20gJy4uL1BvcnRhbCc7XG5pbXBvcnQgVHJhbnNpdGlvbiBmcm9tICcuLi8uLi9tb2R1bGVzL1RyYW5zaXRpb24nO1xuaW1wb3J0IHsgVFJBTlNJVElPTl9TVEFUVVNfRU5URVJJTkcgfSBmcm9tICcuLi8uLi9tb2R1bGVzL1RyYW5zaXRpb24vdXRpbHMvY29tcHV0ZVN0YXR1c2VzJztcbmltcG9ydCB7IGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcblxuLyoqXG4gKiBBIHN1Z2FyIGZvciBgUG9ydGFsYCBhbmQgYFRyYW5zaXRpb25gLlxuICogQHNlZSBQb3J0YWxcbiAqIEBzZWUgVHJhbnNpdGlvblxuICovXG52YXIgVHJhbnNpdGlvbmFibGVQb3J0YWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVHJhbnNpdGlvbmFibGVQb3J0YWwsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zaXRpb25hYmxlUG9ydGFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnN0YXRlID0ge307XG5cbiAgICBfdGhpcy5oYW5kbGVQb3J0YWxDbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcG9ydGFsT3BlbjogLTFcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVQb3J0YWxPcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwb3J0YWxPcGVuOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlVHJhbnNpdGlvbkhpZGUgPSBmdW5jdGlvbiAobm90aGluZywgZGF0YSkge1xuICAgICAgdmFyIHBvcnRhbE9wZW4gPSBfdGhpcy5zdGF0ZS5wb3J0YWxPcGVuO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHRyYW5zaXRpb25WaXNpYmxlOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsb3NlJywgbnVsbCwgX2V4dGVuZHMoe30sIGRhdGEsIHtcbiAgICAgICAgcG9ydGFsT3BlbjogZmFsc2UsXG4gICAgICAgIHRyYW5zaXRpb25WaXNpYmxlOiBmYWxzZVxuICAgICAgfSkpO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25IaWRlJywgbnVsbCwgX2V4dGVuZHMoe30sIGRhdGEsIHtcbiAgICAgICAgcG9ydGFsT3BlbjogcG9ydGFsT3BlbixcbiAgICAgICAgdHJhbnNpdGlvblZpc2libGU6IGZhbHNlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRyYW5zaXRpb25TdGFydCA9IGZ1bmN0aW9uIChub3RoaW5nLCBkYXRhKSB7XG4gICAgICB2YXIgcG9ydGFsT3BlbiA9IF90aGlzLnN0YXRlLnBvcnRhbE9wZW47XG4gICAgICB2YXIgc3RhdHVzID0gZGF0YS5zdGF0dXM7XG4gICAgICB2YXIgdHJhbnNpdGlvblZpc2libGUgPSBzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX0VOVEVSSU5HO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25TdGFydCcsIG51bGwsIF9leHRlbmRzKHt9LCBkYXRhLCB7XG4gICAgICAgIHBvcnRhbE9wZW46IHBvcnRhbE9wZW4sXG4gICAgICAgIHRyYW5zaXRpb25WaXNpYmxlOiB0cmFuc2l0aW9uVmlzaWJsZVxuICAgICAgfSkpOyAvLyBIZWFkcyB1cCEgVHJhbnNpdGlvbmFibGVQb3J0YWwgZmlyZXMgb25PcGVuIGNhbGxiYWNrIG9uIHRoZSBzdGFydCBvZiB0cmFuc2l0aW9uIGFuaW1hdGlvblxuXG5cbiAgICAgIGlmICghdHJhbnNpdGlvblZpc2libGUpIHJldHVybjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICB0cmFuc2l0aW9uVmlzaWJsZTogdHJhbnNpdGlvblZpc2libGVcbiAgICAgIH0pO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25PcGVuJywgbnVsbCwgX2V4dGVuZHMoe30sIGRhdGEsIHtcbiAgICAgICAgdHJhbnNpdGlvblZpc2libGU6IHRyYW5zaXRpb25WaXNpYmxlLFxuICAgICAgICBwb3J0YWxPcGVuOiB0cnVlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTGlmZWN5Y2xlXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgVHJhbnNpdGlvbmFibGVQb3J0YWwuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIC8vIFRoaXMgaXMgZGVmaW5pdGVseSBhIGhhY2sgOihcbiAgICAvL1xuICAgIC8vIEl0J3MgY291cGxlZCB3aXRoIGhhbmRsZVBvcnRhbENsb3NlKCkgZm9yIGZvcmNlIHNldCB0aGUgc3RhdGUgb2YgYHBvcnRhbE9wZW5gIG9taXR0aW5nXG4gICAgLy8gcHJvcHMub3Blbi4gSXQncyByZWxhdGVkIHRvIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wb25lbnQgaXRzZWxmIGFzIGBvbkNsb3NlKClgIHdpbGwgYmVcbiAgICAvLyBjYWxsZWQgYWZ0ZXIgYSB0cmFuc2l0aW9uIHdpbGwgZW5kLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUktUmVhY3QvaXNzdWVzLzIzODJcbiAgICBpZiAoc3RhdGUucG9ydGFsT3BlbiA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbE9wZW46IGZhbHNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChfaXNVbmRlZmluZWQocHJvcHMub3BlbikpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3J0YWxPcGVuOiBwcm9wcy5vcGVuXG4gICAgfTtcbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENhbGxiYWNrIGhhbmRsaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgO1xuXG4gIHZhciBfcHJvdG8gPSBUcmFuc2l0aW9uYWJsZVBvcnRhbC5wcm90b3R5cGU7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBSZW5kZXJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHRyYW5zaXRpb24gPSBfdGhpcyRwcm9wcy50cmFuc2l0aW9uO1xuICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIHBvcnRhbE9wZW4gPSBfdGhpcyRzdGF0ZS5wb3J0YWxPcGVuLFxuICAgICAgICB0cmFuc2l0aW9uVmlzaWJsZSA9IF90aGlzJHN0YXRlLnRyYW5zaXRpb25WaXNpYmxlO1xuICAgIHZhciBvcGVuID0gcG9ydGFsT3BlbiB8fCB0cmFuc2l0aW9uVmlzaWJsZTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFRyYW5zaXRpb25hYmxlUG9ydGFsLCB0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9ydGFsLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgb3Blbjogb3BlbixcbiAgICAgIG9uT3BlbjogdGhpcy5oYW5kbGVQb3J0YWxPcGVuLFxuICAgICAgb25DbG9zZTogdGhpcy5oYW5kbGVQb3J0YWxDbG9zZVxuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUcmFuc2l0aW9uLCBfZXh0ZW5kcyh7fSwgdHJhbnNpdGlvbiwge1xuICAgICAgdHJhbnNpdGlvbk9uTW91bnQ6IHRydWUsXG4gICAgICBvblN0YXJ0OiB0aGlzLmhhbmRsZVRyYW5zaXRpb25TdGFydCxcbiAgICAgIG9uSGlkZTogdGhpcy5oYW5kbGVUcmFuc2l0aW9uSGlkZSxcbiAgICAgIHZpc2libGU6IHBvcnRhbE9wZW5cbiAgICB9KSwgY2hpbGRyZW4pKTtcbiAgfTtcblxuICByZXR1cm4gVHJhbnNpdGlvbmFibGVQb3J0YWw7XG59KENvbXBvbmVudCk7XG5cblRyYW5zaXRpb25hYmxlUG9ydGFsLmhhbmRsZWRQcm9wcyA9IFtcImNoaWxkcmVuXCIsIFwib25DbG9zZVwiLCBcIm9uSGlkZVwiLCBcIm9uT3BlblwiLCBcIm9uU3RhcnRcIiwgXCJvcGVuXCIsIFwidHJhbnNpdGlvblwiXTtcbmV4cG9ydCB7IFRyYW5zaXRpb25hYmxlUG9ydGFsIGFzIGRlZmF1bHQgfTtcblRyYW5zaXRpb25hYmxlUG9ydGFsLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgY2xvc2UgZXZlbnQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBvbkNsb3NlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgb24gZWFjaCB0cmFuc2l0aW9uIHRoYXQgY2hhbmdlcyB2aXNpYmlsaXR5IHRvIGhpZGRlbi5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyB3aXRoIHRyYW5zaXRpb24gc3RhdHVzIGFuZCBpbnRlcm5hbCBzdGF0ZS5cbiAgICovXG4gIG9uSGlkZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIG9wZW4gZXZlbnQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBvbk9wZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBvbiBhbmltYXRpb24gc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMgd2l0aCB0cmFuc2l0aW9uIHN0YXR1cyBhbmQgaW50ZXJuYWwgc3RhdGUuXG4gICAqL1xuICBvblN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHBvcnRhbCBpcyBkaXNwbGF5ZWQuICovXG4gIG9wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBUcmFuc2l0aW9uIHByb3BzLiAqL1xuICB0cmFuc2l0aW9uOiBQcm9wVHlwZXMub2JqZWN0XG59IDoge307XG5UcmFuc2l0aW9uYWJsZVBvcnRhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHRyYW5zaXRpb246IHtcbiAgICBhbmltYXRpb246ICdzY2FsZScsXG4gICAgZHVyYXRpb246IDQwMFxuICB9XG59OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1RyYW5zaXRpb25hYmxlUG9ydGFsJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBfZm9yRWFjaCBmcm9tIFwibG9kYXNoLWVzL2ZvckVhY2hcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC1lcy9pbmNsdWRlc1wiO1xuaW1wb3J0IHsgUmVmIH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGV2ZW50U3RhY2ssIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgbm9ybWFsaXplT2Zmc2V0LCBpc0Jyb3dzZXIgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBWaXNpYmlsaXR5IHByb3ZpZGVzIGEgc2V0IG9mIGNhbGxiYWNrcyBmb3Igd2hlbiBhIGNvbnRlbnQgYXBwZWFycyBpbiB0aGUgdmlld3BvcnQuXG4gKi9cblxudmFyIFZpc2liaWxpdHkgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVmlzaWJpbGl0eSwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVmlzaWJpbGl0eSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5jYWxjdWxhdGlvbnMgPSB7XG4gICAgICBib3R0b21QYXNzZWQ6IGZhbHNlLFxuICAgICAgYm90dG9tVmlzaWJsZTogZmFsc2UsXG4gICAgICBmaXRzOiBmYWxzZSxcbiAgICAgIHBhc3Npbmc6IGZhbHNlLFxuICAgICAgb2ZmU2NyZWVuOiBmYWxzZSxcbiAgICAgIG9uU2NyZWVuOiBmYWxzZSxcbiAgICAgIHRvcFBhc3NlZDogZmFsc2UsXG4gICAgICB0b3BWaXNpYmxlOiBmYWxzZVxuICAgIH07XG4gICAgX3RoaXMuZmlyZWRDYWxsYmFja3MgPSBbXTtcbiAgICBfdGhpcy5yZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG5cbiAgICBfdGhpcy5maXJlID0gZnVuY3Rpb24gKF9yZWYsIHZhbHVlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgY2FsbGJhY2sgPSBfcmVmLmNhbGxiYWNrLFxuICAgICAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG5cbiAgICAgIGlmIChyZXZlcnNlID09PSB2b2lkIDApIHtcbiAgICAgICAgcmV2ZXJzZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjb250aW51b3VzID0gX3RoaXMkcHJvcHMuY29udGludW91cyxcbiAgICAgICAgICBvbmNlID0gX3RoaXMkcHJvcHMub25jZTsgLy8gSGVhZHMgdXAhIEZvciB0aGUgZXhlY3V0aW9uIGlzIHJlcXVpcmVkOlxuICAgICAgLy8gLSBjdXJyZW50IHZhbHVlIGNvcnJlc3BvbmQgdG8gdGhlIGZpcmVkIGRpcmVjdGlvblxuICAgICAgLy8gLSBgY29udGludW91c2AgaXMgdHJ1ZSBvciBjYWxjdWxhdGlvbiB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuXG4gICAgICB2YXIgbWF0Y2hlc0RpcmVjdGlvbiA9IF90aGlzLmNhbGN1bGF0aW9uc1t2YWx1ZV0gIT09IHJldmVyc2U7XG4gICAgICB2YXIgZXhlY3V0aW9uUG9zc2libGUgPSBjb250aW51b3VzIHx8IF90aGlzLmNhbGN1bGF0aW9uc1t2YWx1ZV0gIT09IF90aGlzLm9sZENhbGN1bGF0aW9uc1t2YWx1ZV07XG4gICAgICBpZiAobWF0Y2hlc0RpcmVjdGlvbiAmJiBleGVjdXRpb25Qb3NzaWJsZSkgX3RoaXMuZXhlY3V0ZShjYWxsYmFjaywgbmFtZSk7IC8vIEhlYWRzIHVwISBXZSBzaG91bGQgcmVtb3ZlIGNhbGxiYWNrIGZyb20gdGhlIGhhcHBlbmVkIHdoZW4gaXQncyBub3QgYG9uY2VgXG5cbiAgICAgIGlmICghb25jZSkgX3RoaXMuZmlyZWRDYWxsYmFja3MgPSBfd2l0aG91dChfdGhpcy5maXJlZENhbGxiYWNrcywgbmFtZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy50aWNraW5nKSByZXR1cm47XG4gICAgICBfdGhpcy50aWNraW5nID0gdHJ1ZTtcbiAgICAgIF90aGlzLmZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMudXBkYXRlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5tb3VudGVkKSByZXR1cm47XG4gICAgICBfdGhpcy50aWNraW5nID0gZmFsc2U7XG4gICAgICBfdGhpcy5vbGRDYWxjdWxhdGlvbnMgPSBfdGhpcy5jYWxjdWxhdGlvbnM7XG4gICAgICBfdGhpcy5jYWxjdWxhdGlvbnMgPSBfdGhpcy5jb21wdXRlQ2FsY3VsYXRpb25zKCk7XG4gICAgICBfdGhpcy5wYWdlWU9mZnNldCA9IF90aGlzLmdldFBhZ2VZT2Zmc2V0KCk7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb25Cb3R0b21QYXNzZWQgPSBfdGhpcyRwcm9wczIub25Cb3R0b21QYXNzZWQsXG4gICAgICAgICAgb25Cb3R0b21QYXNzZWRSZXZlcnNlID0gX3RoaXMkcHJvcHMyLm9uQm90dG9tUGFzc2VkUmV2ZXJzZSxcbiAgICAgICAgICBvbkJvdHRvbVZpc2libGUgPSBfdGhpcyRwcm9wczIub25Cb3R0b21WaXNpYmxlLFxuICAgICAgICAgIG9uQm90dG9tVmlzaWJsZVJldmVyc2UgPSBfdGhpcyRwcm9wczIub25Cb3R0b21WaXNpYmxlUmV2ZXJzZSxcbiAgICAgICAgICBvblBhc3NpbmcgPSBfdGhpcyRwcm9wczIub25QYXNzaW5nLFxuICAgICAgICAgIG9uUGFzc2luZ1JldmVyc2UgPSBfdGhpcyRwcm9wczIub25QYXNzaW5nUmV2ZXJzZSxcbiAgICAgICAgICBvblRvcFBhc3NlZCA9IF90aGlzJHByb3BzMi5vblRvcFBhc3NlZCxcbiAgICAgICAgICBvblRvcFBhc3NlZFJldmVyc2UgPSBfdGhpcyRwcm9wczIub25Ub3BQYXNzZWRSZXZlcnNlLFxuICAgICAgICAgIG9uVG9wVmlzaWJsZSA9IF90aGlzJHByb3BzMi5vblRvcFZpc2libGUsXG4gICAgICAgICAgb25Ub3BWaXNpYmxlUmV2ZXJzZSA9IF90aGlzJHByb3BzMi5vblRvcFZpc2libGVSZXZlcnNlLFxuICAgICAgICAgIG9uT2ZmU2NyZWVuID0gX3RoaXMkcHJvcHMyLm9uT2ZmU2NyZWVuLFxuICAgICAgICAgIG9uT25TY3JlZW4gPSBfdGhpcyRwcm9wczIub25PblNjcmVlbixcbiAgICAgICAgICB1cGRhdGVPbiA9IF90aGlzJHByb3BzMi51cGRhdGVPbjtcbiAgICAgIHZhciBmb3J3YXJkID0ge1xuICAgICAgICBib3R0b21QYXNzZWQ6IHtcbiAgICAgICAgICBjYWxsYmFjazogb25Cb3R0b21QYXNzZWQsXG4gICAgICAgICAgbmFtZTogJ29uQm90dG9tUGFzc2VkJ1xuICAgICAgICB9LFxuICAgICAgICBib3R0b21WaXNpYmxlOiB7XG4gICAgICAgICAgY2FsbGJhY2s6IG9uQm90dG9tVmlzaWJsZSxcbiAgICAgICAgICBuYW1lOiAnb25Cb3R0b21WaXNpYmxlJ1xuICAgICAgICB9LFxuICAgICAgICBwYXNzaW5nOiB7XG4gICAgICAgICAgY2FsbGJhY2s6IG9uUGFzc2luZyxcbiAgICAgICAgICBuYW1lOiAnb25QYXNzaW5nJ1xuICAgICAgICB9LFxuICAgICAgICBvZmZTY3JlZW46IHtcbiAgICAgICAgICBjYWxsYmFjazogb25PZmZTY3JlZW4sXG4gICAgICAgICAgbmFtZTogJ29uT2ZmU2NyZWVuJ1xuICAgICAgICB9LFxuICAgICAgICBvblNjcmVlbjoge1xuICAgICAgICAgIGNhbGxiYWNrOiBvbk9uU2NyZWVuLFxuICAgICAgICAgIG5hbWU6ICdvbk9uU2NyZWVuJ1xuICAgICAgICB9LFxuICAgICAgICB0b3BQYXNzZWQ6IHtcbiAgICAgICAgICBjYWxsYmFjazogb25Ub3BQYXNzZWQsXG4gICAgICAgICAgbmFtZTogJ29uVG9wUGFzc2VkJ1xuICAgICAgICB9LFxuICAgICAgICB0b3BWaXNpYmxlOiB7XG4gICAgICAgICAgY2FsbGJhY2s6IG9uVG9wVmlzaWJsZSxcbiAgICAgICAgICBuYW1lOiAnb25Ub3BWaXNpYmxlJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdmFyIHJldmVyc2UgPSB7XG4gICAgICAgIGJvdHRvbVBhc3NlZDoge1xuICAgICAgICAgIGNhbGxiYWNrOiBvbkJvdHRvbVBhc3NlZFJldmVyc2UsXG4gICAgICAgICAgbmFtZTogJ29uQm90dG9tUGFzc2VkUmV2ZXJzZSdcbiAgICAgICAgfSxcbiAgICAgICAgYm90dG9tVmlzaWJsZToge1xuICAgICAgICAgIGNhbGxiYWNrOiBvbkJvdHRvbVZpc2libGVSZXZlcnNlLFxuICAgICAgICAgIG5hbWU6ICdvbkJvdHRvbVZpc2libGVSZXZlcnNlJ1xuICAgICAgICB9LFxuICAgICAgICBwYXNzaW5nOiB7XG4gICAgICAgICAgY2FsbGJhY2s6IG9uUGFzc2luZ1JldmVyc2UsXG4gICAgICAgICAgbmFtZTogJ29uUGFzc2luZ1JldmVyc2UnXG4gICAgICAgIH0sXG4gICAgICAgIHRvcFBhc3NlZDoge1xuICAgICAgICAgIGNhbGxiYWNrOiBvblRvcFBhc3NlZFJldmVyc2UsXG4gICAgICAgICAgbmFtZTogJ29uVG9wUGFzc2VkUmV2ZXJzZSdcbiAgICAgICAgfSxcbiAgICAgICAgdG9wVmlzaWJsZToge1xuICAgICAgICAgIGNhbGxiYWNrOiBvblRvcFZpc2libGVSZXZlcnNlLFxuICAgICAgICAgIG5hbWU6ICdvblRvcFZpc2libGVSZXZlcnNlJ1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25VcGRhdGUnLCBudWxsLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgY2FsY3VsYXRpb25zOiBfdGhpcy5jYWxjdWxhdGlvbnNcbiAgICAgIH0pKTtcblxuICAgICAgX3RoaXMuZmlyZU9uUGFzc2VkKCk7IC8vIEhlYWRzIHVwISBSZXZlcnNlIGNhbGxiYWNrcyBzaG91bGQgYmUgZmlyZWQgZmlyc3RcblxuXG4gICAgICBfZm9yRWFjaChyZXZlcnNlLCBmdW5jdGlvbiAoZGF0YSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmZpcmUoZGF0YSwgdmFsdWUsIHRydWUpO1xuICAgICAgfSk7XG5cbiAgICAgIF9mb3JFYWNoKGZvcndhcmQsIGZ1bmN0aW9uIChkYXRhLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZmlyZShkYXRhLCB2YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHVwZGF0ZU9uID09PSAncmVwYWludCcpIF90aGlzLmhhbmRsZVVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVmlzaWJpbGl0eS5wcm90b3R5cGU7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLm1vdW50ZWQgPSB0cnVlO1xuICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybjtcbiAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY29udGV4dCA9IF90aGlzJHByb3BzMy5jb250ZXh0LFxuICAgICAgICBmaXJlT25Nb3VudCA9IF90aGlzJHByb3BzMy5maXJlT25Nb3VudCxcbiAgICAgICAgdXBkYXRlT24gPSBfdGhpcyRwcm9wczMudXBkYXRlT247XG4gICAgdGhpcy5wYWdlWU9mZnNldCA9IHRoaXMuZ2V0UGFnZVlPZmZzZXQoKTtcbiAgICB0aGlzLmF0dGFjaEhhbmRsZXJzKGNvbnRleHQsIHVwZGF0ZU9uKTtcbiAgICBpZiAoZmlyZU9uTW91bnQpIHRoaXMudXBkYXRlKCk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgY2xlYW5IYXBwZW5lZCA9IHByZXZQcm9wcy5jb250aW51b3VzICE9PSB0aGlzLnByb3BzLmNvbnRpbnVvdXMgfHwgcHJldlByb3BzLm9uY2UgIT09IHRoaXMucHJvcHMub25jZSB8fCBwcmV2UHJvcHMudXBkYXRlT24gIT09IHRoaXMucHJvcHMudXBkYXRlT247IC8vIEhlYWRzIHVwISBXZSBzaG91bGQgY2xlYW4gdXAgYXJyYXkgb2YgaGFwcGVuZWQgY2FsbGJhY2tzLCBpZiB2YWx1ZXMgb2YgdGhlc2UgcHJvcHMgYXJlIGNoYW5nZWRcblxuICAgIGlmIChjbGVhbkhhcHBlbmVkKSB0aGlzLmZpcmVkQ2FsbGJhY2tzID0gW107XG5cbiAgICBpZiAocHJldlByb3BzLmNvbnRleHQgIT09IHRoaXMucHJvcHMuY29udGV4dCB8fCBwcmV2UHJvcHMudXBkYXRlT24gIT09IHRoaXMucHJvcHMudXBkYXRlT24pIHtcbiAgICAgIHRoaXMudW5hdHRhY2hIYW5kbGVycyhwcmV2UHJvcHMuY29udGV4dCk7XG4gICAgICB0aGlzLmF0dGFjaEhhbmRsZXJzKHRoaXMucHJvcHMuY29udGV4dCwgdGhpcy5wcm9wcy51cGRhdGVPbik7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5wcm9wcy5jb250ZXh0O1xuICAgIHRoaXMudW5hdHRhY2hIYW5kbGVycyhjb250ZXh0KTtcbiAgICB0aGlzLm1vdW50ZWQgPSBmYWxzZTtcbiAgfTtcblxuICBfcHJvdG8uYXR0YWNoSGFuZGxlcnMgPSBmdW5jdGlvbiBhdHRhY2hIYW5kbGVycyhjb250ZXh0LCB1cGRhdGVPbikge1xuICAgIGlmICh1cGRhdGVPbiA9PT0gJ2V2ZW50cycpIHtcbiAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgIGV2ZW50U3RhY2suc3ViKCdyZXNpemUnLCB0aGlzLmhhbmRsZVVwZGF0ZSwge1xuICAgICAgICAgIHRhcmdldDogY29udGV4dFxuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRTdGFjay5zdWIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlVXBkYXRlLCB7XG4gICAgICAgICAgdGFyZ2V0OiBjb250ZXh0XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBIZWFkcyB1cCFcbiAgICAvLyBXZSB3aWxsIGRlYWwgd2l0aCBgcmVwYWludGAgdGhlcmVcblxuXG4gICAgdGhpcy5oYW5kbGVVcGRhdGUoKTtcbiAgfTtcblxuICBfcHJvdG8udW5hdHRhY2hIYW5kbGVycyA9IGZ1bmN0aW9uIHVuYXR0YWNoSGFuZGxlcnMoY29udGV4dCkge1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBldmVudFN0YWNrLnVuc3ViKCdyZXNpemUnLCB0aGlzLmhhbmRsZVVwZGF0ZSwge1xuICAgICAgICB0YXJnZXQ6IGNvbnRleHRcbiAgICAgIH0pO1xuICAgICAgZXZlbnRTdGFjay51bnN1Yignc2Nyb2xsJywgdGhpcy5oYW5kbGVVcGRhdGUsIHtcbiAgICAgICAgdGFyZ2V0OiBjb250ZXh0XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5mcmFtZUlkKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lSWQpO1xuICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ2FsbGJhY2sgaGFuZGxpbmdcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICA7XG5cbiAgX3Byb3RvLmV4ZWN1dGUgPSBmdW5jdGlvbiBleGVjdXRlKGNhbGxiYWNrLCBuYW1lKSB7XG4gICAgdmFyIGNvbnRpbnVvdXMgPSB0aGlzLnByb3BzLmNvbnRpbnVvdXM7XG4gICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuOyAvLyBIZWFkcyB1cCEgV2hlbiBgY29udGludW91c2AgaXMgdHJ1ZSwgY2FsbGJhY2sgd2lsbCBiZSBmaXJlZCBhbHdheXNcblxuICAgIGlmICghY29udGludW91cyAmJiBfaW5jbHVkZXModGhpcy5maXJlZENhbGxiYWNrcywgbmFtZSkpIHJldHVybjtcbiAgICBjYWxsYmFjayhudWxsLCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgY2FsY3VsYXRpb25zOiB0aGlzLmNhbGN1bGF0aW9uc1xuICAgIH0pKTtcbiAgICB0aGlzLmZpcmVkQ2FsbGJhY2tzLnB1c2gobmFtZSk7XG4gIH07XG5cbiAgX3Byb3RvLmZpcmVPblBhc3NlZCA9IGZ1bmN0aW9uIGZpcmVPblBhc3NlZCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRjYWxjdWxhdGlvbnMgPSB0aGlzLmNhbGN1bGF0aW9ucyxcbiAgICAgICAgcGVyY2VudGFnZVBhc3NlZCA9IF90aGlzJGNhbGN1bGF0aW9ucy5wZXJjZW50YWdlUGFzc2VkLFxuICAgICAgICBwaXhlbHNQYXNzZWQgPSBfdGhpcyRjYWxjdWxhdGlvbnMucGl4ZWxzUGFzc2VkO1xuICAgIHZhciBvblBhc3NlZCA9IHRoaXMucHJvcHMub25QYXNzZWQ7XG5cbiAgICBfZm9yRWFjaChvblBhc3NlZCwgZnVuY3Rpb24gKGNhbGxiYWNrLCBwYXNzZWQpIHtcbiAgICAgIHZhciBwaXhlbHNWYWx1ZSA9IE51bWJlcihwYXNzZWQpO1xuXG4gICAgICBpZiAocGl4ZWxzVmFsdWUgJiYgcGl4ZWxzUGFzc2VkID49IHBpeGVsc1ZhbHVlKSB7XG4gICAgICAgIF90aGlzMi5leGVjdXRlKGNhbGxiYWNrLCBwYXNzZWQpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIG1hdGNoUGVyY2VudGFnZSA9IChcIlwiICsgcGFzc2VkKS5tYXRjaCgvXihcXGQrKSUkLyk7XG4gICAgICBpZiAoIW1hdGNoUGVyY2VudGFnZSkgcmV0dXJuO1xuICAgICAgdmFyIHBlcmNlbnRhZ2VWYWx1ZSA9IE51bWJlcihtYXRjaFBlcmNlbnRhZ2VbMV0pIC8gMTAwO1xuICAgICAgaWYgKHBlcmNlbnRhZ2VQYXNzZWQgPj0gcGVyY2VudGFnZVZhbHVlKSBfdGhpczIuZXhlY3V0ZShjYWxsYmFjaywgcGFzc2VkKTtcbiAgICB9KTtcbiAgfTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEhlbHBlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBfcHJvdG8uY29tcHV0ZUNhbGN1bGF0aW9ucyA9IGZ1bmN0aW9uIGNvbXB1dGVDYWxjdWxhdGlvbnMoKSB7XG4gICAgdmFyIG9mZnNldCA9IHRoaXMucHJvcHMub2Zmc2V0O1xuXG4gICAgdmFyIF90aGlzJHJlZiRjdXJyZW50JGdldCA9IHRoaXMucmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksXG4gICAgICAgIGJvdHRvbSA9IF90aGlzJHJlZiRjdXJyZW50JGdldC5ib3R0b20sXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHJlZiRjdXJyZW50JGdldC5oZWlnaHQsXG4gICAgICAgIHRvcCA9IF90aGlzJHJlZiRjdXJyZW50JGdldC50b3AsXG4gICAgICAgIHdpZHRoID0gX3RoaXMkcmVmJGN1cnJlbnQkZ2V0LndpZHRoO1xuXG4gICAgdmFyIF9ub3JtYWxpemVPZmZzZXQgPSBub3JtYWxpemVPZmZzZXQob2Zmc2V0KSxcbiAgICAgICAgdG9wT2Zmc2V0ID0gX25vcm1hbGl6ZU9mZnNldFswXSxcbiAgICAgICAgYm90dG9tT2Zmc2V0ID0gX25vcm1hbGl6ZU9mZnNldFsxXTtcblxuICAgIHZhciBuZXdPZmZzZXQgPSB0aGlzLmdldFBhZ2VZT2Zmc2V0KCk7XG4gICAgdmFyIGRpcmVjdGlvbiA9IG5ld09mZnNldCA+IHRoaXMucGFnZVlPZmZzZXQgPyAnZG93bicgOiAndXAnO1xuICAgIHZhciB0b3BQYXNzZWQgPSB0b3AgPCB0b3BPZmZzZXQ7XG4gICAgdmFyIGJvdHRvbVBhc3NlZCA9IGJvdHRvbSA8IGJvdHRvbU9mZnNldDtcbiAgICB2YXIgcGl4ZWxzUGFzc2VkID0gYm90dG9tUGFzc2VkID8gMCA6IE1hdGgubWF4KHRvcCAqIC0xLCAwKTtcbiAgICB2YXIgcGVyY2VudGFnZVBhc3NlZCA9IHBpeGVsc1Bhc3NlZCAvIGhlaWdodDtcbiAgICB2YXIgYm90dG9tVmlzaWJsZSA9IGJvdHRvbSA+PSBib3R0b21PZmZzZXQgJiYgYm90dG9tIDw9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB2YXIgdG9wVmlzaWJsZSA9IHRvcCA+PSB0b3BPZmZzZXQgJiYgdG9wIDw9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB2YXIgZml0cyA9IHRvcFZpc2libGUgJiYgYm90dG9tVmlzaWJsZTtcbiAgICB2YXIgcGFzc2luZyA9IHRvcFBhc3NlZCAmJiAhYm90dG9tUGFzc2VkO1xuICAgIHZhciBvblNjcmVlbiA9ICh0b3BWaXNpYmxlIHx8IHRvcFBhc3NlZCkgJiYgIWJvdHRvbVBhc3NlZDtcbiAgICB2YXIgb2ZmU2NyZWVuID0gIW9uU2NyZWVuO1xuICAgIHJldHVybiB7XG4gICAgICBib3R0b21QYXNzZWQ6IGJvdHRvbVBhc3NlZCxcbiAgICAgIGJvdHRvbVZpc2libGU6IGJvdHRvbVZpc2libGUsXG4gICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgIGZpdHM6IGZpdHMsXG4gICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIHBhc3Npbmc6IHBhc3NpbmcsXG4gICAgICBwZXJjZW50YWdlUGFzc2VkOiBwZXJjZW50YWdlUGFzc2VkLFxuICAgICAgcGl4ZWxzUGFzc2VkOiBwaXhlbHNQYXNzZWQsXG4gICAgICBvZmZTY3JlZW46IG9mZlNjcmVlbixcbiAgICAgIG9uU2NyZWVuOiBvblNjcmVlbixcbiAgICAgIHRvcFBhc3NlZDogdG9wUGFzc2VkLFxuICAgICAgdG9wVmlzaWJsZTogdG9wVmlzaWJsZSxcbiAgICAgIHdpZHRoOiB3aWR0aFxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLmdldFBhZ2VZT2Zmc2V0ID0gZnVuY3Rpb24gZ2V0UGFnZVlPZmZzZXQoKSB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLnByb3BzLmNvbnRleHQ7XG5cbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgLy8gSGVhZHMgdXAhIGB3aW5kb3dgIGRvZXNuJ3QgaGF2ZSBgcGFnZVlPZmZzZXRgIHByb3BlcnR5XG4gICAgICByZXR1cm4gY29udGV4dCA9PT0gd2luZG93ID8gd2luZG93LnBhZ2VZT2Zmc2V0IDogY29udGV4dC5zY3JvbGxUb3A7XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBSZW5kZXJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICA7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFZpc2liaWxpdHksIHRoaXMucHJvcHMpO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoVmlzaWJpbGl0eSwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgICAgaW5uZXJSZWY6IHRoaXMucmVmXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIHJlc3QsIGNoaWxkcmVuKSk7XG4gIH07XG5cbiAgcmV0dXJuIFZpc2liaWxpdHk7XG59KENvbXBvbmVudCk7XG5cblZpc2liaWxpdHkuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNvbnRleHRcIiwgXCJjb250aW51b3VzXCIsIFwiZmlyZU9uTW91bnRcIiwgXCJvZmZzZXRcIiwgXCJvbkJvdHRvbVBhc3NlZFwiLCBcIm9uQm90dG9tUGFzc2VkUmV2ZXJzZVwiLCBcIm9uQm90dG9tVmlzaWJsZVwiLCBcIm9uQm90dG9tVmlzaWJsZVJldmVyc2VcIiwgXCJvbk9mZlNjcmVlblwiLCBcIm9uT25TY3JlZW5cIiwgXCJvblBhc3NlZFwiLCBcIm9uUGFzc2luZ1wiLCBcIm9uUGFzc2luZ1JldmVyc2VcIiwgXCJvblRvcFBhc3NlZFwiLCBcIm9uVG9wUGFzc2VkUmV2ZXJzZVwiLCBcIm9uVG9wVmlzaWJsZVwiLCBcIm9uVG9wVmlzaWJsZVJldmVyc2VcIiwgXCJvblVwZGF0ZVwiLCBcIm9uY2VcIiwgXCJ1cGRhdGVPblwiXTtcbmV4cG9ydCB7IFZpc2liaWxpdHkgYXMgZGVmYXVsdCB9O1xuVmlzaWJpbGl0eS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQ29udGV4dCB3aGljaCB2aXNpYmlsaXR5IHNob3VsZCBhdHRhY2ggb25zY3JvbGwgZXZlbnRzLiAqL1xuICBjb250ZXh0OiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byB0cnVlIGEgY2FsbGJhY2sgd2lsbCBvY2N1ciBhbnl0aW1lIGFuIGVsZW1lbnQgcGFzc2VzIGEgY29uZGl0aW9uIG5vdCBqdXN0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZVxuICAgKiB0aHJlc2hvbGQgaXMgbWV0LlxuICAgKi9cbiAgY29udGludW91czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEZpcmVzIGNhbGxiYWNrcyBpbW1lZGlhdGVseSBhZnRlciBtb3VudC4gKi9cbiAgZmlyZU9uTW91bnQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBFbGVtZW50J3MgYm90dG9tIGVkZ2UgaGFzIHBhc3NlZCB0b3Agb2Ygc2NyZWVuLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25Cb3R0b21QYXNzZWQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBFbGVtZW50J3MgYm90dG9tIGVkZ2UgaGFzIG5vdCBwYXNzZWQgdG9wIG9mIHNjcmVlbi5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQm90dG9tUGFzc2VkUmV2ZXJzZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEVsZW1lbnQncyBib3R0b20gZWRnZSBoYXMgcGFzc2VkIGJvdHRvbSBvZiBzY3JlZW5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQm90dG9tVmlzaWJsZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEVsZW1lbnQncyBib3R0b20gZWRnZSBoYXMgbm90IHBhc3NlZCBib3R0b20gb2Ygc2NyZWVuLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25Cb3R0b21WaXNpYmxlUmV2ZXJzZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFZhbHVlIHRoYXQgY29udGV4dCBzaG91bGQgYmUgYWRqdXN0ZWQgaW4gcGl4ZWxzLiBVc2VmdWwgZm9yIG1ha2luZyBjb250ZW50IGFwcGVhciBiZWxvdyBjb250ZW50IGZpeGVkIHRvIHRoZVxuICAgKiBwYWdlLlxuICAgKi9cbiAgb2Zmc2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSkpXSksXG5cbiAgLyoqIFdoZW4gc2V0IHRvIGZhbHNlIGEgY2FsbGJhY2sgd2lsbCBvY2N1ciBlYWNoIHRpbWUgYW4gZWxlbWVudCBwYXNzZXMgdGhlIHRocmVzaG9sZCBmb3IgYSBjb25kaXRpb24uICovXG4gIG9uY2U6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBFbGVtZW50IGlzIG5vdCB2aXNpYmxlIG9uIHRoZSBzY3JlZW4uICovXG4gIG9uUGFzc2VkOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBBbnkgcGFydCBvZiBhbiBlbGVtZW50IGlzIHZpc2libGUgb24gc2NyZWVuLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25QYXNzaW5nOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogRWxlbWVudCdzIHRvcCBoYXMgbm90IHBhc3NlZCB0b3Agb2Ygc2NyZWVuIGJ1dCBib3R0b20gaGFzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25QYXNzaW5nUmV2ZXJzZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEVsZW1lbnQgaXMgbm90IHZpc2libGUgb24gdGhlIHNjcmVlbi5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uT2ZmU2NyZWVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogRWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk9uU2NyZWVuOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogRWxlbWVudCdzIHRvcCBlZGdlIGhhcyBwYXNzZWQgdG9wIG9mIHRoZSBzY3JlZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvblRvcFBhc3NlZDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEVsZW1lbnQncyB0b3AgZWRnZSBoYXMgbm90IHBhc3NlZCB0b3Agb2YgdGhlIHNjcmVlbi5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uVG9wUGFzc2VkUmV2ZXJzZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEVsZW1lbnQncyB0b3AgZWRnZSBoYXMgcGFzc2VkIGJvdHRvbSBvZiBzY3JlZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvblRvcFZpc2libGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBFbGVtZW50J3MgdG9wIGVkZ2UgaGFzIG5vdCBwYXNzZWQgYm90dG9tIG9mIHNjcmVlbi5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uVG9wVmlzaWJsZVJldmVyc2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBFbGVtZW50J3MgdG9wIGVkZ2UgaGFzIHBhc3NlZCBib3R0b20gb2Ygc2NyZWVuLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25VcGRhdGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8gY2hvb3NlIHRoZSBtb2RlIG9mIHRoZSBwb3NpdGlvbiBjYWxjdWxhdGlvbnM6XG4gICAqIC0gYGV2ZW50c2AgLSAoZGVmYXVsdCkgdXBkYXRlIGFuZCBmaXJlIGNhbGxiYWNrcyBvbmx5IG9uIHNjcm9sbC9yZXNpemUgZXZlbnRzXG4gICAqIC0gYHJlcGFpbnRgIC0gdXBkYXRlIGFuZCBmaXJlIGNhbGxiYWNrcyBvbiBicm93c2VyIHJlcGFpbnQgKGFuaW1hdGlvbiBmcmFtZXMpXG4gICAqL1xuICB1cGRhdGVPbjogUHJvcFR5cGVzLm9uZU9mKFsnZXZlbnRzJywgJ3JlcGFpbnQnXSlcbn0gOiB7fTtcblZpc2liaWxpdHkuZGVmYXVsdFByb3BzID0ge1xuICBjb250ZXh0OiBpc0Jyb3dzZXIoKSA/IHdpbmRvdyA6IG51bGwsXG4gIGNvbnRpbnVvdXM6IGZhbHNlLFxuICBvZmZzZXQ6IFswLCAwXSxcbiAgb25jZTogdHJ1ZSxcbiAgdXBkYXRlT246ICdldmVudHMnXG59OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1Zpc2liaWxpdHknO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IF9lYWNoIGZyb20gXCJsb2Rhc2gtZXMvZWFjaFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldFVuaGFuZGxlZFByb3BzLCBnZXRFbGVtZW50VHlwZSwgU1VJIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBCcmVhZGNydW1iRGl2aWRlciBmcm9tICcuL0JyZWFkY3J1bWJEaXZpZGVyJztcbmltcG9ydCBCcmVhZGNydW1iU2VjdGlvbiBmcm9tICcuL0JyZWFkY3J1bWJTZWN0aW9uJztcbi8qKlxuICogQSBicmVhZGNydW1iIGlzIHVzZWQgdG8gc2hvdyBoaWVyYXJjaHkgYmV0d2VlbiBjb250ZW50LlxuICovXG5cbmZ1bmN0aW9uIEJyZWFkY3J1bWIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBkaXZpZGVyID0gcHJvcHMuZGl2aWRlcixcbiAgICAgIGljb24gPSBwcm9wcy5pY29uLFxuICAgICAgc2VjdGlvbnMgPSBwcm9wcy5zZWN0aW9ucyxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHNpemUsICdicmVhZGNydW1iJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhCcmVhZGNydW1iLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEJyZWFkY3J1bWIsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIHZhciBjaGlsZEVsZW1lbnRzID0gW107XG5cbiAgX2VhY2goc2VjdGlvbnMsIGZ1bmN0aW9uIChzZWN0aW9uLCBpbmRleCkge1xuICAgIC8vIHNlY3Rpb25cbiAgICB2YXIgYnJlYWRjcnVtYkVsZW1lbnQgPSBCcmVhZGNydW1iU2VjdGlvbi5jcmVhdGUoc2VjdGlvbik7XG4gICAgY2hpbGRFbGVtZW50cy5wdXNoKGJyZWFkY3J1bWJFbGVtZW50KTsgLy8gZGl2aWRlclxuXG4gICAgaWYgKGluZGV4ICE9PSBzZWN0aW9ucy5sZW5ndGggLSAxKSB7XG4gICAgICB2YXIga2V5ID0gYnJlYWRjcnVtYkVsZW1lbnQua2V5ICsgXCJfZGl2aWRlclwiIHx8IEpTT04uc3RyaW5naWZ5KHNlY3Rpb24pO1xuICAgICAgY2hpbGRFbGVtZW50cy5wdXNoKEJyZWFkY3J1bWJEaXZpZGVyLmNyZWF0ZSh7XG4gICAgICAgIGNvbnRlbnQ6IGRpdmlkZXIsXG4gICAgICAgIGljb246IGljb24sXG4gICAgICAgIGtleToga2V5XG4gICAgICB9KSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZEVsZW1lbnRzKTtcbn1cblxuQnJlYWRjcnVtYi5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGl2aWRlclwiLCBcImljb25cIiwgXCJzZWN0aW9uc1wiLCBcInNpemVcIl07XG5CcmVhZGNydW1iLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQgb2YgdGhlIEJyZWFkY3J1bWIuRGl2aWRlci4gKi9cbiAgZGl2aWRlcjogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydpY29uJ10pLCBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZF0pLFxuXG4gIC8qKiBGb3IgdXNlIHdpdGggdGhlIHNlY3Rpb25zIHByb3AuIFJlbmRlciBhcyBhbiBgSWNvbmAgY29tcG9uZW50IHdpdGggYGRpdmlkZXJgIGNsYXNzIGluc3RlYWQgb2YgYSBgZGl2YCBpblxuICAgKiAgQnJlYWRjcnVtYi5EaXZpZGVyLiAqL1xuICBpY29uOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2RpdmlkZXInXSksIGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kXSksXG5cbiAgLyoqIFNob3J0aGFuZCBhcnJheSBvZiBwcm9wcyBmb3IgQnJlYWRjcnVtYi5TZWN0aW9uLiAqL1xuICBzZWN0aW9uczogY3VzdG9tUHJvcFR5cGVzLmNvbGxlY3Rpb25TaG9ydGhhbmQsXG5cbiAgLyoqIFNpemUgb2YgQnJlYWRjcnVtYi4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScpKVxufSA6IHt9O1xuQnJlYWRjcnVtYi5EaXZpZGVyID0gQnJlYWRjcnVtYkRpdmlkZXI7XG5CcmVhZGNydW1iLlNlY3Rpb24gPSBCcmVhZGNydW1iU2VjdGlvbjtcbmV4cG9ydCBkZWZhdWx0IEJyZWFkY3J1bWI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2lzTmlsIGZyb20gXCJsb2Rhc2gtZXMvaXNOaWxcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRVbmhhbmRsZWRQcm9wcywgZ2V0RWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vLi4vZWxlbWVudHMvSWNvbic7XG4vKipcbiAqIEEgZGl2aWRlciBzdWItY29tcG9uZW50IGZvciBCcmVhZGNydW1iIGNvbXBvbmVudC5cbiAqL1xuXG5mdW5jdGlvbiBCcmVhZGNydW1iRGl2aWRlcihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgaWNvbiA9IHByb3BzLmljb247XG4gIHZhciBjbGFzc2VzID0gY3goJ2RpdmlkZXInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEJyZWFkY3J1bWJEaXZpZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEJyZWFkY3J1bWJEaXZpZGVyLCBwcm9wcyk7XG5cbiAgaWYgKCFfaXNOaWwoaWNvbikpIHtcbiAgICByZXR1cm4gSWNvbi5jcmVhdGUoaWNvbiwge1xuICAgICAgZGVmYXVsdFByb3BzOiBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICAgIH0pLFxuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFfaXNOaWwoY29udGVudCkpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY29udGVudCk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/ICcvJyA6IGNoaWxkcmVuKTtcbn1cblxuQnJlYWRjcnVtYkRpdmlkZXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJpY29uXCJdO1xuQnJlYWRjcnVtYkRpdmlkZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFJlbmRlciBhcyBhbiBgSWNvbmAgY29tcG9uZW50IHdpdGggYGRpdmlkZXJgIGNsYXNzIGluc3RlYWQgb2YgYSBgZGl2YC4gKi9cbiAgaWNvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRcbn0gOiB7fTtcbkJyZWFkY3J1bWJEaXZpZGVyLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoQnJlYWRjcnVtYkRpdmlkZXIsIGZ1bmN0aW9uIChpY29uKSB7XG4gIHJldHVybiB7XG4gICAgaWNvbjogaWNvblxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBCcmVhZGNydW1iRGl2aWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRVbmhhbmRsZWRQcm9wcywgZ2V0RWxlbWVudFR5cGUsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIHNlY3Rpb24gc3ViLWNvbXBvbmVudCBmb3IgQnJlYWRjcnVtYiBjb21wb25lbnQuXG4gKi9cblxudmFyIEJyZWFkY3J1bWJTZWN0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEJyZWFkY3J1bWJTZWN0aW9uLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCcmVhZGNydW1iU2VjdGlvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmNvbXB1dGVFbGVtZW50VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGxpbmsgPSBfdGhpcyRwcm9wcy5saW5rLFxuICAgICAgICAgIG9uQ2xpY2sgPSBfdGhpcyRwcm9wcy5vbkNsaWNrO1xuICAgICAgaWYgKGxpbmsgfHwgb25DbGljaykgcmV0dXJuICdhJztcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQnJlYWRjcnVtYlNlY3Rpb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzMi5hY3RpdmUsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMyLmNvbnRlbnQsXG4gICAgICAgIGhyZWYgPSBfdGhpcyRwcm9wczIuaHJlZjtcbiAgICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkoYWN0aXZlLCAnYWN0aXZlJyksICdzZWN0aW9uJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEJyZWFkY3J1bWJTZWN0aW9uLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShCcmVhZGNydW1iU2VjdGlvbiwgdGhpcy5wcm9wcywgdGhpcy5jb21wdXRlRWxlbWVudFR5cGUpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIGhyZWY6IGhyZWYsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbiAgfTtcblxuICByZXR1cm4gQnJlYWRjcnVtYlNlY3Rpb247XG59KENvbXBvbmVudCk7XG5cbkJyZWFkY3J1bWJTZWN0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiaHJlZlwiLCBcImxpbmtcIiwgXCJvbkNsaWNrXCJdO1xuZXhwb3J0IHsgQnJlYWRjcnVtYlNlY3Rpb24gYXMgZGVmYXVsdCB9O1xuQnJlYWRjcnVtYlNlY3Rpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogU3R5bGUgYXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2VjdGlvbi4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFJlbmRlciBhcyBhbiBgYWAgdGFnIGluc3RlYWQgb2YgYSBgZGl2YCBhbmQgYWRkcyB0aGUgaHJlZiBhdHRyaWJ1dGUuICovXG4gIGhyZWY6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnbGluayddKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBSZW5kZXIgYXMgYW4gYGFgIHRhZyBpbnN0ZWFkIG9mIGEgYGRpdmAuICovXG4gIGxpbms6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnaHJlZiddKSwgUHJvcFR5cGVzLmJvb2xdKSxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNsaWNrLiBXaGVuIHBhc3NlZCwgdGhlIGNvbXBvbmVudCB3aWxsIHJlbmRlciBhcyBhbiBgYWBcbiAgICogdGFnIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBhIGBkaXZgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmNcbn0gOiB7fTtcbkJyZWFkY3J1bWJTZWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoQnJlYWRjcnVtYlNlY3Rpb24sIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudCxcbiAgICBsaW5rOiB0cnVlXG4gIH07XG59KTsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9CcmVhZGNydW1iJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZVdpZHRoUHJvcCB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgRm9ybUJ1dHRvbiBmcm9tICcuL0Zvcm1CdXR0b24nO1xuaW1wb3J0IEZvcm1DaGVja2JveCBmcm9tICcuL0Zvcm1DaGVja2JveCc7XG5pbXBvcnQgRm9ybURyb3Bkb3duIGZyb20gJy4vRm9ybURyb3Bkb3duJztcbmltcG9ydCBGb3JtRmllbGQgZnJvbSAnLi9Gb3JtRmllbGQnO1xuaW1wb3J0IEZvcm1Hcm91cCBmcm9tICcuL0Zvcm1Hcm91cCc7XG5pbXBvcnQgRm9ybUlucHV0IGZyb20gJy4vRm9ybUlucHV0JztcbmltcG9ydCBGb3JtUmFkaW8gZnJvbSAnLi9Gb3JtUmFkaW8nO1xuaW1wb3J0IEZvcm1TZWxlY3QgZnJvbSAnLi9Gb3JtU2VsZWN0JztcbmltcG9ydCBGb3JtVGV4dEFyZWEgZnJvbSAnLi9Gb3JtVGV4dEFyZWEnO1xuLyoqXG4gKiBBIEZvcm0gZGlzcGxheXMgYSBzZXQgb2YgcmVsYXRlZCB1c2VyIGlucHV0IGZpZWxkcyBpbiBhIHN0cnVjdHVyZWQgd2F5LlxuICogQHNlZSBCdXR0b25cbiAqIEBzZWUgQ2hlY2tib3hcbiAqIEBzZWUgRHJvcGRvd25cbiAqIEBzZWUgSW5wdXRcbiAqIEBzZWUgTWVzc2FnZVxuICogQHNlZSBSYWRpb1xuICogQHNlZSBTZWxlY3RcbiAqIEBzZWUgVmlzaWJpbGl0eVxuICovXG5cbnZhciBGb3JtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEZvcm0sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm0oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChfYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVTdWJtaXQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGFjdGlvbiA9IF90aGlzLnByb3BzLmFjdGlvbjsgLy8gSGVhZHMgdXAhIFRoaXJkIHBhcnR5IGxpYnMgY2FuIHBhc3Mgb3duIGRhdGEgYXMgZmlyc3QgYXJndW1lbnQsIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCBpdCBoYXMgcHJldmVudERlZmF1bHQoKVxuICAgICAgLy8gbWV0aG9kLlxuXG4gICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ3N0cmluZycpIF9pbnZva2UoZSwgJ3ByZXZlbnREZWZhdWx0Jyk7XG5cbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiA+IDEgPyBfbGVuMiAtIDEgOiAwKSwgX2tleTIgPSAxOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIF9pbnZva2UuYXBwbHkodm9pZCAwLCBbX3RoaXMucHJvcHMsICdvblN1Ym1pdCcsIGUsIF90aGlzLnByb3BzXS5jb25jYXQoYXJncykpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gRm9ybS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wcy5hY3Rpb24sXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgZXJyb3IgPSBfdGhpcyRwcm9wcy5lcnJvcixcbiAgICAgICAgaW52ZXJ0ZWQgPSBfdGhpcyRwcm9wcy5pbnZlcnRlZCxcbiAgICAgICAgbG9hZGluZyA9IF90aGlzJHByb3BzLmxvYWRpbmcsXG4gICAgICAgIHJlcGx5ID0gX3RoaXMkcHJvcHMucmVwbHksXG4gICAgICAgIHNpemUgPSBfdGhpcyRwcm9wcy5zaXplLFxuICAgICAgICBzdWNjZXNzID0gX3RoaXMkcHJvcHMuc3VjY2VzcyxcbiAgICAgICAgdW5zdGFja2FibGUgPSBfdGhpcyRwcm9wcy51bnN0YWNrYWJsZSxcbiAgICAgICAgd2FybmluZyA9IF90aGlzJHByb3BzLndhcm5pbmcsXG4gICAgICAgIHdpZHRocyA9IF90aGlzJHByb3BzLndpZHRocztcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHNpemUsIHVzZUtleU9ubHkoZXJyb3IsICdlcnJvcicpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlS2V5T25seShsb2FkaW5nLCAnbG9hZGluZycpLCB1c2VLZXlPbmx5KHJlcGx5LCAncmVwbHknKSwgdXNlS2V5T25seShzdWNjZXNzLCAnc3VjY2VzcycpLCB1c2VLZXlPbmx5KHVuc3RhY2thYmxlLCAndW5zdGFja2FibGUnKSwgdXNlS2V5T25seSh3YXJuaW5nLCAnd2FybmluZycpLCB1c2VXaWR0aFByb3Aod2lkdGhzLCBudWxsLCB0cnVlKSwgJ2Zvcm0nLCBjbGFzc05hbWUpO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRm9ybSwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRm9ybSwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBvblN1Ym1pdDogdGhpcy5oYW5kbGVTdWJtaXRcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9O1xuXG4gIHJldHVybiBGb3JtO1xufShDb21wb25lbnQpO1xuXG5Gb3JtLmhhbmRsZWRQcm9wcyA9IFtcImFjdGlvblwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJlcnJvclwiLCBcImludmVydGVkXCIsIFwibG9hZGluZ1wiLCBcIm9uU3VibWl0XCIsIFwicmVwbHlcIiwgXCJzaXplXCIsIFwic3VjY2Vzc1wiLCBcInVuc3RhY2thYmxlXCIsIFwid2FybmluZ1wiLCBcIndpZHRoc1wiXTtcbkZvcm0ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogVGhlIEhUTUwgZm9ybSBhY3Rpb24gKi9cbiAgYWN0aW9uOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEF1dG9tYXRpY2FsbHkgc2hvdyBhbnkgZXJyb3IgTWVzc2FnZSBjaGlsZHJlbi4gKi9cbiAgZXJyb3I6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGZvcm0gY2FuIGhhdmUgaXRzIGNvbG9yIGludmVydGVkIGZvciBjb250cmFzdC4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBdXRvbWF0aWNhbGx5IHNob3cgYSBsb2FkaW5nIGluZGljYXRvci4gKi9cbiAgbG9hZGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFRoZSBIVE1MIGZvcm0gc3VibWl0IGhhbmRsZXIuICovXG4gIG9uU3VibWl0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogQSBjb21tZW50IGNhbiBjb250YWluIGEgZm9ybSB0byByZXBseSB0byBhIGNvbW1lbnQuIFRoaXMgbWF5IGhhdmUgYXJiaXRyYXJ5IGNvbnRlbnQuICovXG4gIHJlcGx5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBmb3JtIGNhbiB2YXJ5IGluIHNpemUuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuU0laRVMsICdtZWRpdW0nKSksXG5cbiAgLyoqIEF1dG9tYXRpY2FsbHkgc2hvdyBhbnkgc3VjY2VzcyBNZXNzYWdlIGNoaWxkcmVuLiAqL1xuICBzdWNjZXNzOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBmb3JtIGNhbiBwcmV2ZW50IGl0c2VsZiBmcm9tIHN0YWNraW5nIG9uIG1vYmlsZS4gKi9cbiAgdW5zdGFja2FibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBdXRvbWF0aWNhbGx5IHNob3cgYW55IHdhcm5pbmcgTWVzc2FnZSBjaGlsZHJlbi4gKi9cbiAgd2FybmluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEZvcm1zIGNhbiBhdXRvbWF0aWNhbGx5IGRpdmlkZSBmaWVsZHMgdG8gYmUgZXF1YWwgd2lkdGguICovXG4gIHdpZHRoczogUHJvcFR5cGVzLm9uZU9mKFsnZXF1YWwnXSlcbn0gOiB7fTtcbkZvcm0uZGVmYXVsdFByb3BzID0ge1xuICBhczogJ2Zvcm0nXG59O1xuRm9ybS5GaWVsZCA9IEZvcm1GaWVsZDtcbkZvcm0uQnV0dG9uID0gRm9ybUJ1dHRvbjtcbkZvcm0uQ2hlY2tib3ggPSBGb3JtQ2hlY2tib3g7XG5Gb3JtLkRyb3Bkb3duID0gRm9ybURyb3Bkb3duO1xuRm9ybS5Hcm91cCA9IEZvcm1Hcm91cDtcbkZvcm0uSW5wdXQgPSBGb3JtSW5wdXQ7XG5Gb3JtLlJhZGlvID0gRm9ybVJhZGlvO1xuRm9ybS5TZWxlY3QgPSBGb3JtU2VsZWN0O1xuRm9ybS5UZXh0QXJlYSA9IEZvcm1UZXh0QXJlYTtcbmV4cG9ydCBkZWZhdWx0IEZvcm07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgQnV0dG9uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0J1dHRvbic7XG5pbXBvcnQgRm9ybUZpZWxkIGZyb20gJy4vRm9ybUZpZWxkJztcbi8qKlxuICogU3VnYXIgZm9yIDxGb3JtLkZpZWxkIGNvbnRyb2w9e0J1dHRvbn0gLz4uXG4gKiBAc2VlIEJ1dHRvblxuICogQHNlZSBGb3JtXG4gKi9cblxuZnVuY3Rpb24gRm9ybUJ1dHRvbihwcm9wcykge1xuICB2YXIgY29udHJvbCA9IHByb3BzLmNvbnRyb2w7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRm9ybUJ1dHRvbiwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShGb3JtQnV0dG9uLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjb250cm9sOiBjb250cm9sXG4gIH0pKTtcbn1cblxuRm9ybUJ1dHRvbi5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNvbnRyb2xcIl07XG5Gb3JtQnV0dG9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgRm9ybUZpZWxkIGNvbnRyb2wgcHJvcC4gKi9cbiAgY29udHJvbDogRm9ybUZpZWxkLnByb3BUeXBlcy5jb250cm9sXG59IDoge307XG5Gb3JtQnV0dG9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgYXM6IEZvcm1GaWVsZCxcbiAgY29udHJvbDogQnV0dG9uXG59O1xuZXhwb3J0IGRlZmF1bHQgRm9ybUJ1dHRvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuLi8uLi9tb2R1bGVzL0NoZWNrYm94JztcbmltcG9ydCBGb3JtRmllbGQgZnJvbSAnLi9Gb3JtRmllbGQnO1xuLyoqXG4gKiBTdWdhciBmb3IgPEZvcm0uRmllbGQgY29udHJvbD17Q2hlY2tib3h9IC8+LlxuICogQHNlZSBDaGVja2JveFxuICogQHNlZSBGb3JtXG4gKi9cblxuZnVuY3Rpb24gRm9ybUNoZWNrYm94KHByb3BzKSB7XG4gIHZhciBjb250cm9sID0gcHJvcHMuY29udHJvbDtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhGb3JtQ2hlY2tib3gsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRm9ybUNoZWNrYm94LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjb250cm9sOiBjb250cm9sXG4gIH0pKTtcbn1cblxuRm9ybUNoZWNrYm94LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY29udHJvbFwiXTtcbkZvcm1DaGVja2JveC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIEZvcm1GaWVsZCBjb250cm9sIHByb3AuICovXG4gIGNvbnRyb2w6IEZvcm1GaWVsZC5wcm9wVHlwZXMuY29udHJvbFxufSA6IHt9O1xuRm9ybUNoZWNrYm94LmRlZmF1bHRQcm9wcyA9IHtcbiAgYXM6IEZvcm1GaWVsZCxcbiAgY29udHJvbDogQ2hlY2tib3hcbn07XG5leHBvcnQgZGVmYXVsdCBGb3JtQ2hlY2tib3g7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgRHJvcGRvd24gZnJvbSAnLi4vLi4vbW9kdWxlcy9Ecm9wZG93bic7XG5pbXBvcnQgRm9ybUZpZWxkIGZyb20gJy4vRm9ybUZpZWxkJztcbi8qKlxuICogU3VnYXIgZm9yIDxGb3JtLkZpZWxkIGNvbnRyb2w9e0Ryb3Bkb3dufSAvPi5cbiAqIEBzZWUgRHJvcGRvd25cbiAqIEBzZWUgRm9ybVxuICovXG5cbmZ1bmN0aW9uIEZvcm1Ecm9wZG93bihwcm9wcykge1xuICB2YXIgY29udHJvbCA9IHByb3BzLmNvbnRyb2w7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRm9ybURyb3Bkb3duLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZvcm1Ecm9wZG93biwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY29udHJvbDogY29udHJvbFxuICB9KSk7XG59XG5cbkZvcm1Ecm9wZG93bi5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNvbnRyb2xcIl07XG5Gb3JtRHJvcGRvd24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBGb3JtRmllbGQgY29udHJvbCBwcm9wLiAqL1xuICBjb250cm9sOiBGb3JtRmllbGQucHJvcFR5cGVzLmNvbnRyb2xcbn0gOiB7fTtcbkZvcm1Ecm9wZG93bi5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiBGb3JtRmllbGQsXG4gIGNvbnRyb2w6IERyb3Bkb3duXG59O1xuZXhwb3J0IGRlZmF1bHQgRm9ybURyb3Bkb3duOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoLWVzL2dldFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlSFRNTExhYmVsLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VXaWR0aFByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IExhYmVsIGZyb20gJy4uLy4uL2VsZW1lbnRzL0xhYmVsJztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuLi8uLi9tb2R1bGVzL0NoZWNrYm94JztcbmltcG9ydCBSYWRpbyBmcm9tICcuLi8uLi9hZGRvbnMvUmFkaW8nO1xuLyoqXG4gKiBBIGZpZWxkIGlzIGEgZm9ybSBlbGVtZW50IGNvbnRhaW5pbmcgYSBsYWJlbCBhbmQgYW4gaW5wdXQuXG4gKiBAc2VlIEZvcm1cbiAqIEBzZWUgQnV0dG9uXG4gKiBAc2VlIENoZWNrYm94XG4gKiBAc2VlIERyb3Bkb3duXG4gKiBAc2VlIElucHV0XG4gKiBAc2VlIFJhZGlvXG4gKiBAc2VlIFNlbGVjdFxuICogQHNlZSBWaXNpYmlsaXR5XG4gKi9cblxuZnVuY3Rpb24gRm9ybUZpZWxkKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBjb250cm9sID0gcHJvcHMuY29udHJvbCxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBlcnJvciA9IHByb3BzLmVycm9yLFxuICAgICAgaW5saW5lID0gcHJvcHMuaW5saW5lLFxuICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgIHJlcXVpcmVkID0gcHJvcHMucmVxdWlyZWQsXG4gICAgICB0eXBlID0gcHJvcHMudHlwZSxcbiAgICAgIHdpZHRoID0gcHJvcHMud2lkdGgsXG4gICAgICBpZCA9IHByb3BzLmlkO1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGVycm9yLCAnZXJyb3InKSwgdXNlS2V5T25seShpbmxpbmUsICdpbmxpbmUnKSwgdXNlS2V5T25seShyZXF1aXJlZCwgJ3JlcXVpcmVkJyksIHVzZVdpZHRoUHJvcCh3aWR0aCwgJ3dpZGUnKSwgJ2ZpZWxkJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhGb3JtRmllbGQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRm9ybUZpZWxkLCBwcm9wcyk7XG5cbiAgdmFyIGVycm9yUG9pbnRpbmcgPSBfZ2V0KGVycm9yLCAncG9pbnRpbmcnLCAnYWJvdmUnKTtcblxuICB2YXIgZXJyb3JMYWJlbCA9IExhYmVsLmNyZWF0ZShlcnJvciwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2UsXG4gICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICBwcm9tcHQ6IHRydWUsXG4gICAgICBwb2ludGluZzogZXJyb3JQb2ludGluZyxcbiAgICAgIGlkOiBpZCA/IGlkICsgXCItZXJyb3ItbWVzc2FnZVwiIDogdW5kZWZpbmVkLFxuICAgICAgcm9sZTogJ2FsZXJ0JyxcbiAgICAgICdhcmlhLWF0b21pYyc6IHRydWVcbiAgICB9XG4gIH0pO1xuICB2YXIgZXJyb3JMYWJlbEJlZm9yZSA9IChlcnJvclBvaW50aW5nID09PSAnYmVsb3cnIHx8IGVycm9yUG9pbnRpbmcgPT09ICdyaWdodCcpICYmIGVycm9yTGFiZWw7XG4gIHZhciBlcnJvckxhYmVsQWZ0ZXIgPSAoZXJyb3JQb2ludGluZyA9PT0gJ2Fib3ZlJyB8fCBlcnJvclBvaW50aW5nID09PSAnbGVmdCcpICYmIGVycm9yTGFiZWw7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTm8gQ29udHJvbFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgaWYgKF9pc05pbChjb250cm9sKSkge1xuICAgIGlmIChfaXNOaWwobGFiZWwpKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgaWQ6IGlkXG4gICAgICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIGlkOiBpZFxuICAgIH0pLCBlcnJvckxhYmVsQmVmb3JlLCBjcmVhdGVIVE1MTGFiZWwobGFiZWwsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgZXJyb3JMYWJlbEFmdGVyKTtcbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENoZWNrYm94L1JhZGlvIENvbnRyb2xcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgdmFyIGFyaWFEZXNjcmliZWRCeSA9IGlkICYmIGVycm9yID8gaWQgKyBcIi1lcnJvci1tZXNzYWdlXCIgOiBudWxsO1xuICB2YXIgYXJpYUF0dHJzID0ge1xuICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogYXJpYURlc2NyaWJlZEJ5LFxuICAgICdhcmlhLWludmFsaWQnOiBlcnJvciA/IHRydWUgOiB1bmRlZmluZWRcbiAgfTtcblxuICB2YXIgY29udHJvbFByb3BzID0gX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjb250ZW50OiBjb250ZW50LFxuICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgcmVxdWlyZWQ6IHJlcXVpcmVkLFxuICAgIHR5cGU6IHR5cGUsXG4gICAgaWQ6IGlkXG4gIH0pOyAvLyB3cmFwIEhUTUwgY2hlY2tib3hlcy9yYWRpb3MgaW4gdGhlIGxhYmVsXG5cblxuICBpZiAoY29udHJvbCA9PT0gJ2lucHV0JyAmJiAodHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0eXBlID09PSAncmFkaW8nKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiLCBudWxsLCBlcnJvckxhYmVsQmVmb3JlLCAvKiNfX1BVUkVfXyovY3JlYXRlRWxlbWVudChjb250cm9sLCBfZXh0ZW5kcyh7fSwgYXJpYUF0dHJzLCBjb250cm9sUHJvcHMpKSwgXCIgXCIsIGxhYmVsLCBlcnJvckxhYmVsQWZ0ZXIpKTtcbiAgfSAvLyBwYXNzIGxhYmVsIHByb3AgdG8gY29udHJvbHMgdGhhdCBzdXBwb3J0IGl0XG5cblxuICBpZiAoY29udHJvbCA9PT0gQ2hlY2tib3ggfHwgY29udHJvbCA9PT0gUmFkaW8pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0sIGVycm9yTGFiZWxCZWZvcmUsIC8qI19fUFVSRV9fKi9jcmVhdGVFbGVtZW50KGNvbnRyb2wsIF9leHRlbmRzKHt9LCBhcmlhQXR0cnMsIGNvbnRyb2xQcm9wcywge1xuICAgICAgbGFiZWw6IGxhYmVsXG4gICAgfSkpLCBlcnJvckxhYmVsQWZ0ZXIpO1xuICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gT3RoZXIgQ29udHJvbFxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSwgY3JlYXRlSFRNTExhYmVsKGxhYmVsLCB7XG4gICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICBodG1sRm9yOiBpZFxuICAgIH0sXG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgZXJyb3JMYWJlbEJlZm9yZSwgLyojX19QVVJFX18qL2NyZWF0ZUVsZW1lbnQoY29udHJvbCwgX2V4dGVuZHMoe30sIGFyaWFBdHRycywgY29udHJvbFByb3BzKSksIGVycm9yTGFiZWxBZnRlcik7XG59XG5cbkZvcm1GaWVsZC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImNvbnRyb2xcIiwgXCJkaXNhYmxlZFwiLCBcImVycm9yXCIsIFwiaWRcIiwgXCJpbmxpbmVcIiwgXCJsYWJlbFwiLCBcInJlcXVpcmVkXCIsIFwidHlwZVwiLCBcIndpZHRoXCJdO1xuRm9ybUZpZWxkLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKlxuICAgKiBBIGZvcm0gY29udHJvbCBjb21wb25lbnQgKGkuZS4gRHJvcGRvd24pIG9yIEhUTUwgdGFnTmFtZSAoaS5lLiAnaW5wdXQnKS5cbiAgICogRXh0cmEgRm9ybUZpZWxkIHByb3BzIGFyZSBwYXNzZWQgdG8gdGhlIGNvbnRyb2wgY29tcG9uZW50LlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGlsZHJlbi5cbiAgICovXG4gIGNvbnRyb2w6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5lbGVtZW50VHlwZSwgUHJvcFR5cGVzLm9uZU9mKFsnYnV0dG9uJywgJ2lucHV0JywgJ3NlbGVjdCcsICd0ZXh0YXJlYSddKV0pLFxuXG4gIC8qKiBJbmRpdmlkdWFsIGZpZWxkcyBtYXkgYmUgZGlzYWJsZWQuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogSW5kaXZpZHVhbCBmaWVsZHMgbWF5IGRpc3BsYXkgYW4gZXJyb3Igc3RhdGUgYWxvbmcgd2l0aCBhIG1lc3NhZ2UuICovXG4gIGVycm9yOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRdKSxcblxuICAvKiogVGhlIGlkIG9mIHRoZSBjb250cm9sICovXG4gIGlkOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBIGZpZWxkIGNhbiBoYXZlIGl0cyBsYWJlbCBuZXh0IHRvIGluc3RlYWQgb2YgYWJvdmUgaXQuICovXG4gIGlubGluZTogUHJvcFR5cGVzLmJvb2wsXG4gIC8vIEhlYWRzIFVwIVxuICAvLyBEbyBub3QgZGlzYWxsb3cgY2hpbGRyZW4gd2l0aCBgbGFiZWxgIHNob3J0aGFuZFxuICAvLyBUaGUgYGNvbnRyb2xgIG1pZ2h0IGFjY2VwdCBhIGBsYWJlbGAgcHJvcCBhbmQgYGNoaWxkcmVuYFxuXG4gIC8qKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGlsZHJlbi4gKi9cbiAgbGFiZWw6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMub2JqZWN0XSksXG5cbiAgLyoqIEEgZmllbGQgY2FuIHNob3cgdGhhdCBpbnB1dCBpcyBtYW5kYXRvcnkuICovXG4gIHJlcXVpcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUGFzc2VkIHRvIHRoZSBjb250cm9sIGNvbXBvbmVudCAoaS5lLiA8aW5wdXQgdHlwZT0ncGFzc3dvcmQnIC8+KSAqL1xuICB0eXBlOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kZW1hbmQoWydjb250cm9sJ10pIC8vIGRvbid0IHN0cmljdGx5IHZhbGlkYXRlIEhUTUwgdHlwZXNcbiAgLy8gYSBjb250cm9sIG1pZ2h0IGJlIHBhc3NlZCB0aGF0IHVzZXMgYSBgdHlwZWAgcHJvcCB3aXRoIHVua25vd24gdmFsdWVzXG4gIC8vIGxldCB0aGUgY29udHJvbCB2YWxpZGF0ZSBpZiBmb3IgdXNcbiAgXSksXG5cbiAgLyoqIEEgZmllbGQgY2FuIHNwZWNpZnkgaXRzIHdpZHRoIGluIGdyaWQgY29sdW1ucyAqL1xuICB3aWR0aDogUHJvcFR5cGVzLm9uZU9mKFNVSS5XSURUSFMpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBGb3JtRmllbGQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZVdpZHRoUHJvcCB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgc2V0IG9mIGZpZWxkcyBjYW4gYXBwZWFyIGdyb3VwZWQgdG9nZXRoZXIuXG4gKiBAc2VlIEZvcm1cbiAqL1xuXG5mdW5jdGlvbiBGb3JtR3JvdXAocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBncm91cGVkID0gcHJvcHMuZ3JvdXBlZCxcbiAgICAgIGlubGluZSA9IHByb3BzLmlubGluZSxcbiAgICAgIHVuc3RhY2thYmxlID0gcHJvcHMudW5zdGFja2FibGUsXG4gICAgICB3aWR0aHMgPSBwcm9wcy53aWR0aHM7XG4gIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShncm91cGVkLCAnZ3JvdXBlZCcpLCB1c2VLZXlPbmx5KGlubGluZSwgJ2lubGluZScpLCB1c2VLZXlPbmx5KHVuc3RhY2thYmxlLCAndW5zdGFja2FibGUnKSwgdXNlV2lkdGhQcm9wKHdpZHRocywgbnVsbCwgdHJ1ZSksICdmaWVsZHMnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEZvcm1Hcm91cCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShGb3JtR3JvdXAsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW4pO1xufVxuXG5Gb3JtR3JvdXAuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImdyb3VwZWRcIiwgXCJpbmxpbmVcIiwgXCJ1bnN0YWNrYWJsZVwiLCBcIndpZHRoc1wiXTtcbkZvcm1Hcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEZpZWxkcyBjYW4gc2hvdyByZWxhdGVkIGNob2ljZXMuICovXG4gIGdyb3VwZWQ6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnaW5saW5lJ10pLCBQcm9wVHlwZXMuYm9vbF0pLFxuXG4gIC8qKiBNdWx0aXBsZSBmaWVsZHMgbWF5IGJlIGlubGluZSBpbiBhIHJvdy4gKi9cbiAgaW5saW5lOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2dyb3VwZWQnXSksIFByb3BUeXBlcy5ib29sXSksXG5cbiAgLyoqIEEgZm9ybSBncm91cCBjYW4gcHJldmVudCBpdHNlbGYgZnJvbSBzdGFja2luZyBvbiBtb2JpbGUuICovXG4gIHVuc3RhY2thYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRmllbGRzIEdyb3VwcyBjYW4gc3BlY2lmeSB0aGVpciB3aWR0aCBpbiBncmlkIGNvbHVtbnMgb3IgYXV0b21hdGljYWxseSBkaXZpZGUgZmllbGRzIHRvIGJlIGVxdWFsIHdpZHRoLiAqL1xuICB3aWR0aHM6IFByb3BUeXBlcy5vbmVPZihbXS5jb25jYXQoU1VJLldJRFRIUywgWydlcXVhbCddKSlcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1Hcm91cDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJbnB1dCBmcm9tICcuLi8uLi9lbGVtZW50cy9JbnB1dCc7XG5pbXBvcnQgRm9ybUZpZWxkIGZyb20gJy4vRm9ybUZpZWxkJztcbi8qKlxuICogU3VnYXIgZm9yIDxGb3JtLkZpZWxkIGNvbnRyb2w9e0lucHV0fSAvPi5cbiAqIEBzZWUgRm9ybVxuICogQHNlZSBJbnB1dFxuICovXG5cbmZ1bmN0aW9uIEZvcm1JbnB1dChwcm9wcykge1xuICB2YXIgY29udHJvbCA9IHByb3BzLmNvbnRyb2w7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRm9ybUlucHV0LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZvcm1JbnB1dCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY29udHJvbDogY29udHJvbFxuICB9KSk7XG59XG5cbkZvcm1JbnB1dC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNvbnRyb2xcIl07XG5Gb3JtSW5wdXQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBGb3JtRmllbGQgY29udHJvbCBwcm9wLiAqL1xuICBjb250cm9sOiBGb3JtRmllbGQucHJvcFR5cGVzLmNvbnRyb2xcbn0gOiB7fTtcbkZvcm1JbnB1dC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiBGb3JtRmllbGQsXG4gIGNvbnRyb2w6IElucHV0XG59O1xuZXhwb3J0IGRlZmF1bHQgRm9ybUlucHV0OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IFJhZGlvIGZyb20gJy4uLy4uL2FkZG9ucy9SYWRpbyc7XG5pbXBvcnQgRm9ybUZpZWxkIGZyb20gJy4vRm9ybUZpZWxkJztcbi8qKlxuICogU3VnYXIgZm9yIDxGb3JtLkZpZWxkIGNvbnRyb2w9e1JhZGlvfSAvPi5cbiAqIEBzZWUgRm9ybVxuICogQHNlZSBSYWRpb1xuICovXG5cbmZ1bmN0aW9uIEZvcm1SYWRpbyhwcm9wcykge1xuICB2YXIgY29udHJvbCA9IHByb3BzLmNvbnRyb2w7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRm9ybVJhZGlvLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZvcm1SYWRpbywgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY29udHJvbDogY29udHJvbFxuICB9KSk7XG59XG5cbkZvcm1SYWRpby5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNvbnRyb2xcIl07XG5Gb3JtUmFkaW8ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBGb3JtRmllbGQgY29udHJvbCBwcm9wLiAqL1xuICBjb250cm9sOiBGb3JtRmllbGQucHJvcFR5cGVzLmNvbnRyb2xcbn0gOiB7fTtcbkZvcm1SYWRpby5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiBGb3JtRmllbGQsXG4gIGNvbnRyb2w6IFJhZGlvXG59O1xuZXhwb3J0IGRlZmF1bHQgRm9ybVJhZGlvOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IFNlbGVjdCBmcm9tICcuLi8uLi9hZGRvbnMvU2VsZWN0JztcbmltcG9ydCBEcm9wZG93biBmcm9tICcuLi8uLi9tb2R1bGVzL0Ryb3Bkb3duJztcbmltcG9ydCBGb3JtRmllbGQgZnJvbSAnLi9Gb3JtRmllbGQnO1xuLyoqXG4gKiBTdWdhciBmb3IgPEZvcm0uRmllbGQgY29udHJvbD17U2VsZWN0fSAvPi5cbiAqIEBzZWUgRm9ybVxuICogQHNlZSBTZWxlY3RcbiAqL1xuXG5mdW5jdGlvbiBGb3JtU2VsZWN0KHByb3BzKSB7XG4gIHZhciBjb250cm9sID0gcHJvcHMuY29udHJvbCxcbiAgICAgIG9wdGlvbnMgPSBwcm9wcy5vcHRpb25zO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEZvcm1TZWxlY3QsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRm9ybVNlbGVjdCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY29udHJvbDogY29udHJvbCxcbiAgICBvcHRpb25zOiBvcHRpb25zXG4gIH0pKTtcbn1cblxuRm9ybVNlbGVjdC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNvbnRyb2xcIiwgXCJvcHRpb25zXCJdO1xuRm9ybVNlbGVjdC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIEZvcm1GaWVsZCBjb250cm9sIHByb3AuICovXG4gIGNvbnRyb2w6IEZvcm1GaWVsZC5wcm9wVHlwZXMuY29udHJvbCxcblxuICAvKiogQXJyYXkgb2YgRHJvcGRvd24uSXRlbSBwcm9wcyBlLmcuIGB7IHRleHQ6ICcnLCB2YWx1ZTogJycgfWAgKi9cbiAgb3B0aW9uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKERyb3Bkb3duLkl0ZW0ucHJvcFR5cGVzKSkuaXNSZXF1aXJlZFxufSA6IHt9O1xuRm9ybVNlbGVjdC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiBGb3JtRmllbGQsXG4gIGNvbnRyb2w6IFNlbGVjdFxufTtcbmV4cG9ydCBkZWZhdWx0IEZvcm1TZWxlY3Q7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgVGV4dEFyZWEgZnJvbSAnLi4vLi4vYWRkb25zL1RleHRBcmVhJztcbmltcG9ydCBGb3JtRmllbGQgZnJvbSAnLi9Gb3JtRmllbGQnO1xuLyoqXG4gKiBTdWdhciBmb3IgPEZvcm0uRmllbGQgY29udHJvbD17VGV4dEFyZWF9IC8+LlxuICogQHNlZSBGb3JtXG4gKiBAc2VlIFRleHRBcmVhXG4gKi9cblxuZnVuY3Rpb24gRm9ybVRleHRBcmVhKHByb3BzKSB7XG4gIHZhciBjb250cm9sID0gcHJvcHMuY29udHJvbDtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhGb3JtVGV4dEFyZWEsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRm9ybVRleHRBcmVhLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjb250cm9sOiBjb250cm9sXG4gIH0pKTtcbn1cblxuRm9ybVRleHRBcmVhLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY29udHJvbFwiXTtcbkZvcm1UZXh0QXJlYS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIEZvcm1GaWVsZCBjb250cm9sIHByb3AuICovXG4gIGNvbnRyb2w6IEZvcm1GaWVsZC5wcm9wVHlwZXMuY29udHJvbFxufSA6IHt9O1xuRm9ybVRleHRBcmVhLmRlZmF1bHRQcm9wcyA9IHtcbiAgYXM6IEZvcm1GaWVsZCxcbiAgY29udHJvbDogVGV4dEFyZWFcbn07XG5leHBvcnQgZGVmYXVsdCBGb3JtVGV4dEFyZWE7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vRm9ybSc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZUtleU9yVmFsdWVBbmRLZXksIHVzZU11bHRpcGxlUHJvcCwgdXNlVGV4dEFsaWduUHJvcCwgdXNlVmVydGljYWxBbGlnblByb3AsIHVzZVdpZHRoUHJvcCB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgR3JpZENvbHVtbiBmcm9tICcuL0dyaWRDb2x1bW4nO1xuaW1wb3J0IEdyaWRSb3cgZnJvbSAnLi9HcmlkUm93Jztcbi8qKlxuICogQSBncmlkIGlzIHVzZWQgdG8gaGFybW9uaXplIG5lZ2F0aXZlIHNwYWNlIGluIGEgbGF5b3V0LlxuICovXG5cbmZ1bmN0aW9uIEdyaWQocHJvcHMpIHtcbiAgdmFyIGNlbGxlZCA9IHByb3BzLmNlbGxlZCxcbiAgICAgIGNlbnRlcmVkID0gcHJvcHMuY2VudGVyZWQsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sdW1ucyA9IHByb3BzLmNvbHVtbnMsXG4gICAgICBjb250YWluZXIgPSBwcm9wcy5jb250YWluZXIsXG4gICAgICBkaXZpZGVkID0gcHJvcHMuZGl2aWRlZCxcbiAgICAgIGRvdWJsaW5nID0gcHJvcHMuZG91YmxpbmcsXG4gICAgICBpbnZlcnRlZCA9IHByb3BzLmludmVydGVkLFxuICAgICAgcGFkZGVkID0gcHJvcHMucGFkZGVkLFxuICAgICAgcmVsYXhlZCA9IHByb3BzLnJlbGF4ZWQsXG4gICAgICByZXZlcnNlZCA9IHByb3BzLnJldmVyc2VkLFxuICAgICAgc3RhY2thYmxlID0gcHJvcHMuc3RhY2thYmxlLFxuICAgICAgc3RyZXRjaGVkID0gcHJvcHMuc3RyZXRjaGVkLFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbiA9IHByb3BzLnZlcnRpY2FsQWxpZ247XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShjZW50ZXJlZCwgJ2NlbnRlcmVkJyksIHVzZUtleU9ubHkoY29udGFpbmVyLCAnY29udGFpbmVyJyksIHVzZUtleU9ubHkoZG91YmxpbmcsICdkb3VibGluZycpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlS2V5T25seShzdGFja2FibGUsICdzdGFja2FibGUnKSwgdXNlS2V5T25seShzdHJldGNoZWQsICdzdHJldGNoZWQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShjZWxsZWQsICdjZWxsZWQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShkaXZpZGVkLCAnZGl2aWRlZCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KHBhZGRlZCwgJ3BhZGRlZCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KHJlbGF4ZWQsICdyZWxheGVkJyksIHVzZU11bHRpcGxlUHJvcChyZXZlcnNlZCwgJ3JldmVyc2VkJyksIHVzZVRleHRBbGlnblByb3AodGV4dEFsaWduKSwgdXNlVmVydGljYWxBbGlnblByb3AodmVydGljYWxBbGlnbiksIHVzZVdpZHRoUHJvcChjb2x1bW5zLCAnY29sdW1uJywgdHJ1ZSksICdncmlkJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhHcmlkLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEdyaWQsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW4pO1xufVxuXG5HcmlkLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2VsbGVkXCIsIFwiY2VudGVyZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbHVtbnNcIiwgXCJjb250YWluZXJcIiwgXCJkaXZpZGVkXCIsIFwiZG91YmxpbmdcIiwgXCJpbnZlcnRlZFwiLCBcInBhZGRlZFwiLCBcInJlbGF4ZWRcIiwgXCJyZXZlcnNlZFwiLCBcInN0YWNrYWJsZVwiLCBcInN0cmV0Y2hlZFwiLCBcInRleHRBbGlnblwiLCBcInZlcnRpY2FsQWxpZ25cIl07XG5HcmlkLkNvbHVtbiA9IEdyaWRDb2x1bW47XG5HcmlkLlJvdyA9IEdyaWRSb3c7XG5HcmlkLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgZ3JpZCBjYW4gaGF2ZSByb3dzIGRpdmlkZWQgaW50byBjZWxscy4gKi9cbiAgY2VsbGVkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnaW50ZXJuYWxseSddKV0pLFxuXG4gIC8qKiBBIGdyaWQgY2FuIGhhdmUgaXRzIGNvbHVtbnMgY2VudGVyZWQuICovXG4gIGNlbnRlcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBSZXByZXNlbnRzIGNvbHVtbiBjb3VudCBwZXIgcm93IGluIEdyaWQuICovXG4gIGNvbHVtbnM6IFByb3BUeXBlcy5vbmVPZihbXS5jb25jYXQoU1VJLldJRFRIUywgWydlcXVhbCddKSksXG5cbiAgLyoqIEEgZ3JpZCBjYW4gYmUgY29tYmluZWQgd2l0aCBhIGNvbnRhaW5lciB0byB1c2UgdGhlIGF2YWlsYWJsZSBsYXlvdXQgYW5kIGFsaWdubWVudC4gKi9cbiAgY29udGFpbmVyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBncmlkIGNhbiBoYXZlIGRpdmlkZXJzIGJldHdlZW4gaXRzIGNvbHVtbnMuICovXG4gIGRpdmlkZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd2ZXJ0aWNhbGx5J10pXSksXG5cbiAgLyoqIEEgZ3JpZCBjYW4gZG91YmxlIGl0cyBjb2x1bW4gd2lkdGggb24gdGFibGV0IGFuZCBtb2JpbGUgc2l6ZXMuICovXG4gIGRvdWJsaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBncmlkJ3MgY29sb3JzIGNhbiBiZSBpbnZlcnRlZC4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGdyaWQgY2FuIHByZXNlcnZlIGl0cyB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBndXR0ZXJzIG9uIGZpcnN0IGFuZCBsYXN0IGNvbHVtbnMuICovXG4gIHBhZGRlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ2hvcml6b250YWxseScsICd2ZXJ0aWNhbGx5J10pXSksXG5cbiAgLyoqIEEgZ3JpZCBjYW4gaW5jcmVhc2UgaXRzIGd1dHRlcnMgdG8gYWxsb3cgZm9yIG1vcmUgbmVnYXRpdmUgc3BhY2UuICovXG4gIHJlbGF4ZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd2ZXJ5J10pXSksXG5cbiAgLyoqIEEgZ3JpZCBjYW4gc3BlY2lmeSB0aGF0IGl0cyBjb2x1bW5zIHNob3VsZCByZXZlcnNlIG9yZGVyIGF0IGRpZmZlcmVudCBkZXZpY2Ugc2l6ZXMuICovXG4gIHJldmVyc2VkOiBjdXN0b21Qcm9wVHlwZXMubXVsdGlwbGVQcm9wKFsnY29tcHV0ZXInLCAnY29tcHV0ZXIgdmVydGljYWxseScsICdtb2JpbGUnLCAnbW9iaWxlIHZlcnRpY2FsbHknLCAndGFibGV0JywgJ3RhYmxldCB2ZXJ0aWNhbGx5J10pLFxuXG4gIC8qKiBBIGdyaWQgY2FuIGhhdmUgaXRzIGNvbHVtbnMgc3RhY2sgb24tdG9wIG9mIGVhY2ggb3RoZXIgYWZ0ZXIgcmVhY2hpbmcgbW9iaWxlIGJyZWFrcG9pbnRzLiAqL1xuICBzdGFja2FibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGdyaWQgY2FuIHN0cmV0Y2ggaXRzIGNvbnRlbnRzIHRvIHRha2UgdXAgdGhlIGVudGlyZSBncmlkIGhlaWdodC4gKi9cbiAgc3RyZXRjaGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBncmlkIGNhbiBzcGVjaWZ5IGl0cyB0ZXh0IGFsaWdubWVudC4gKi9cbiAgdGV4dEFsaWduOiBQcm9wVHlwZXMub25lT2YoU1VJLlRFWFRfQUxJR05NRU5UUyksXG5cbiAgLyoqIEEgZ3JpZCBjYW4gc3BlY2lmeSBpdHMgdmVydGljYWwgYWxpZ25tZW50IHRvIGhhdmUgYWxsIGl0cyBjb2x1bW5zIHZlcnRpY2FsbHkgY2VudGVyZWQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUylcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEdyaWQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGN1c3RvbVByb3BUeXBlcywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZU11bHRpcGxlUHJvcCwgdXNlVGV4dEFsaWduUHJvcCwgdXNlVmFsdWVBbmRLZXksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wLCB1c2VXaWR0aFByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNvbHVtbiBzdWItY29tcG9uZW50IGZvciBHcmlkLlxuICovXG5cbmZ1bmN0aW9uIEdyaWRDb2x1bW4ocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb21wdXRlciA9IHByb3BzLmNvbXB1dGVyLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGZsb2F0ZWQgPSBwcm9wcy5mbG9hdGVkLFxuICAgICAgbGFyZ2VTY3JlZW4gPSBwcm9wcy5sYXJnZVNjcmVlbixcbiAgICAgIG1vYmlsZSA9IHByb3BzLm1vYmlsZSxcbiAgICAgIG9ubHkgPSBwcm9wcy5vbmx5LFxuICAgICAgc3RyZXRjaGVkID0gcHJvcHMuc3RyZXRjaGVkLFxuICAgICAgdGFibGV0ID0gcHJvcHMudGFibGV0LFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbiA9IHByb3BzLnZlcnRpY2FsQWxpZ24sXG4gICAgICB3aWRlc2NyZWVuID0gcHJvcHMud2lkZXNjcmVlbixcbiAgICAgIHdpZHRoID0gcHJvcHMud2lkdGg7XG4gIHZhciBjbGFzc2VzID0gY3goY29sb3IsIHVzZUtleU9ubHkoc3RyZXRjaGVkLCAnc3RyZXRjaGVkJyksIHVzZU11bHRpcGxlUHJvcChvbmx5LCAnb25seScpLCB1c2VUZXh0QWxpZ25Qcm9wKHRleHRBbGlnbiksIHVzZVZhbHVlQW5kS2V5KGZsb2F0ZWQsICdmbG9hdGVkJyksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wKHZlcnRpY2FsQWxpZ24pLCB1c2VXaWR0aFByb3AoY29tcHV0ZXIsICd3aWRlIGNvbXB1dGVyJyksIHVzZVdpZHRoUHJvcChsYXJnZVNjcmVlbiwgJ3dpZGUgbGFyZ2Ugc2NyZWVuJyksIHVzZVdpZHRoUHJvcChtb2JpbGUsICd3aWRlIG1vYmlsZScpLCB1c2VXaWR0aFByb3AodGFibGV0LCAnd2lkZSB0YWJsZXQnKSwgdXNlV2lkdGhQcm9wKHdpZGVzY3JlZW4sICd3aWRlIHdpZGVzY3JlZW4nKSwgdXNlV2lkdGhQcm9wKHdpZHRoLCAnd2lkZScpLCAnY29sdW1uJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhHcmlkQ29sdW1uLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEdyaWRDb2x1bW4sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW4pO1xufVxuXG5HcmlkQ29sdW1uLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbXB1dGVyXCIsIFwiZmxvYXRlZFwiLCBcImxhcmdlU2NyZWVuXCIsIFwibW9iaWxlXCIsIFwib25seVwiLCBcInN0cmV0Y2hlZFwiLCBcInRhYmxldFwiLCBcInRleHRBbGlnblwiLCBcInZlcnRpY2FsQWxpZ25cIiwgXCJ3aWRlc2NyZWVuXCIsIFwid2lkdGhcIl07XG5HcmlkQ29sdW1uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBncmlkIGNvbHVtbiBjYW4gYmUgY29sb3JlZC4gKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihTVUkuQ09MT1JTKSxcblxuICAvKiogQSBjb2x1bW4gY2FuIHNwZWNpZnkgYSB3aWR0aCBmb3IgYSBjb21wdXRlci4gKi9cbiAgY29tcHV0ZXI6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnd2lkdGgnXSksIFByb3BUeXBlcy5vbmVPZihTVUkuV0lEVEhTKV0pLFxuXG4gIC8qKiBBIGNvbHVtbiBjYW4gc2l0IGZsdXNoIGFnYWluc3QgdGhlIGxlZnQgb3IgcmlnaHQgZWRnZSBvZiBhIHJvdy4gKi9cbiAgZmxvYXRlZDogUHJvcFR5cGVzLm9uZU9mKFNVSS5GTE9BVFMpLFxuXG4gIC8qKiBBIGNvbHVtbiBjYW4gc3BlY2lmeSBhIHdpZHRoIGZvciBhIGxhcmdlIHNjcmVlbiBkZXZpY2UuICovXG4gIGxhcmdlU2NyZWVuOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ3dpZHRoJ10pLCBQcm9wVHlwZXMub25lT2YoU1VJLldJRFRIUyldKSxcblxuICAvKiogQSBjb2x1bW4gY2FuIHNwZWNpZnkgYSB3aWR0aCBmb3IgYSBtb2JpbGUgZGV2aWNlLiAqL1xuICBtb2JpbGU6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnd2lkdGgnXSksIFByb3BUeXBlcy5vbmVPZihTVUkuV0lEVEhTKV0pLFxuXG4gIC8qKiBBIGNvbHVtbiBjYW4gYXBwZWFyIG9ubHkgZm9yIGEgc3BlY2lmaWMgZGV2aWNlLCBvciBzY3JlZW4gc2l6ZXMuICovXG4gIG9ubHk6IGN1c3RvbVByb3BUeXBlcy5tdWx0aXBsZVByb3AoU1VJLlZJU0lCSUxJVFkpLFxuXG4gIC8qKiBBIGNvbHVtbiBjYW4gc3RyZXRjaCBpdHMgY29udGVudHMgdG8gdGFrZSB1cCB0aGUgZW50aXJlIGdyaWQgb3Igcm93IGhlaWdodC4gKi9cbiAgc3RyZXRjaGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBjb2x1bW4gY2FuIHNwZWNpZnkgYSB3aWR0aCBmb3IgYSB0YWJsZXQgZGV2aWNlLiAqL1xuICB0YWJsZXQ6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnd2lkdGgnXSksIFByb3BUeXBlcy5vbmVPZihTVUkuV0lEVEhTKV0pLFxuXG4gIC8qKiBBIGNvbHVtbiBjYW4gc3BlY2lmeSBpdHMgdGV4dCBhbGlnbm1lbnQuICovXG4gIHRleHRBbGlnbjogUHJvcFR5cGVzLm9uZU9mKFNVSS5URVhUX0FMSUdOTUVOVFMpLFxuXG4gIC8qKiBBIGNvbHVtbiBjYW4gc3BlY2lmeSBpdHMgdmVydGljYWwgYWxpZ25tZW50IHRvIGhhdmUgYWxsIGl0cyBjb2x1bW5zIHZlcnRpY2FsbHkgY2VudGVyZWQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUyksXG5cbiAgLyoqIEEgY29sdW1uIGNhbiBzcGVjaWZ5IGEgd2lkdGggZm9yIGEgd2lkZSBzY3JlZW4gZGV2aWNlLiAqL1xuICB3aWRlc2NyZWVuOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ3dpZHRoJ10pLCBQcm9wVHlwZXMub25lT2YoU1VJLldJRFRIUyldKSxcblxuICAvKiogUmVwcmVzZW50cyB3aWR0aCBvZiBjb2x1bW4uICovXG4gIHdpZHRoOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2NvbXB1dGVyJywgJ2xhcmdlU2NyZWVuJywgJ21vYmlsZScsICd0YWJsZXQnLCAnd2lkZXNjcmVlbiddKSwgUHJvcFR5cGVzLm9uZU9mKFNVSS5XSURUSFMpXSlcbn0gOiB7fTtcbkdyaWRDb2x1bW4uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShHcmlkQ29sdW1uLCBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgR3JpZENvbHVtbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlS2V5T25seSwgdXNlTXVsdGlwbGVQcm9wLCB1c2VUZXh0QWxpZ25Qcm9wLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCwgdXNlV2lkdGhQcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSByb3cgc3ViLWNvbXBvbmVudCBmb3IgR3JpZC5cbiAqL1xuXG5mdW5jdGlvbiBHcmlkUm93KHByb3BzKSB7XG4gIHZhciBjZW50ZXJlZCA9IHByb3BzLmNlbnRlcmVkLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb2x1bW5zID0gcHJvcHMuY29sdW1ucyxcbiAgICAgIGRpdmlkZWQgPSBwcm9wcy5kaXZpZGVkLFxuICAgICAgb25seSA9IHByb3BzLm9ubHksXG4gICAgICByZXZlcnNlZCA9IHByb3BzLnJldmVyc2VkLFxuICAgICAgc3RyZXRjaGVkID0gcHJvcHMuc3RyZXRjaGVkLFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbiA9IHByb3BzLnZlcnRpY2FsQWxpZ247XG4gIHZhciBjbGFzc2VzID0gY3goY29sb3IsIHVzZUtleU9ubHkoY2VudGVyZWQsICdjZW50ZXJlZCcpLCB1c2VLZXlPbmx5KGRpdmlkZWQsICdkaXZpZGVkJyksIHVzZUtleU9ubHkoc3RyZXRjaGVkLCAnc3RyZXRjaGVkJyksIHVzZU11bHRpcGxlUHJvcChvbmx5LCAnb25seScpLCB1c2VNdWx0aXBsZVByb3AocmV2ZXJzZWQsICdyZXZlcnNlZCcpLCB1c2VUZXh0QWxpZ25Qcm9wKHRleHRBbGlnbiksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wKHZlcnRpY2FsQWxpZ24pLCB1c2VXaWR0aFByb3AoY29sdW1ucywgJ2NvbHVtbicsIHRydWUpLCAncm93JywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhHcmlkUm93LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEdyaWRSb3csIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW4pO1xufVxuXG5HcmlkUm93LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2VudGVyZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29sdW1uc1wiLCBcImRpdmlkZWRcIiwgXCJvbmx5XCIsIFwicmV2ZXJzZWRcIiwgXCJzdHJldGNoZWRcIiwgXCJ0ZXh0QWxpZ25cIiwgXCJ2ZXJ0aWNhbEFsaWduXCJdO1xuR3JpZFJvdy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIHJvdyBjYW4gaGF2ZSBpdHMgY29sdW1ucyBjZW50ZXJlZC4gKi9cbiAgY2VudGVyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgZ3JpZCByb3cgY2FuIGJlIGNvbG9yZWQuICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoU1VJLkNPTE9SUyksXG5cbiAgLyoqIFJlcHJlc2VudHMgY29sdW1uIGNvdW50IHBlciBsaW5lIGluIFJvdy4gKi9cbiAgY29sdW1uczogUHJvcFR5cGVzLm9uZU9mKFtdLmNvbmNhdChTVUkuV0lEVEhTLCBbJ2VxdWFsJ10pKSxcblxuICAvKiogQSByb3cgY2FuIGhhdmUgZGl2aWRlcnMgYmV0d2VlbiBpdHMgY29sdW1ucy4gKi9cbiAgZGl2aWRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgcm93IGNhbiBhcHBlYXIgb25seSBmb3IgYSBzcGVjaWZpYyBkZXZpY2UsIG9yIHNjcmVlbiBzaXplcy4gKi9cbiAgb25seTogY3VzdG9tUHJvcFR5cGVzLm11bHRpcGxlUHJvcChTVUkuVklTSUJJTElUWSksXG5cbiAgLyoqIEEgcm93IGNhbiBzcGVjaWZ5IHRoYXQgaXRzIGNvbHVtbnMgc2hvdWxkIHJldmVyc2Ugb3JkZXIgYXQgZGlmZmVyZW50IGRldmljZSBzaXplcy4gKi9cbiAgcmV2ZXJzZWQ6IGN1c3RvbVByb3BUeXBlcy5tdWx0aXBsZVByb3AoWydjb21wdXRlcicsICdjb21wdXRlciB2ZXJ0aWNhbGx5JywgJ21vYmlsZScsICdtb2JpbGUgdmVydGljYWxseScsICd0YWJsZXQnLCAndGFibGV0IHZlcnRpY2FsbHknXSksXG5cbiAgLyoqIEEgcm93IGNhbiBzdHJldGNoIGl0cyBjb250ZW50cyB0byB0YWtlIHVwIHRoZSBlbnRpcmUgY29sdW1uIGhlaWdodC4gKi9cbiAgc3RyZXRjaGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSByb3cgY2FuIHNwZWNpZnkgaXRzIHRleHQgYWxpZ25tZW50LiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVEVYVF9BTElHTk1FTlRTKSxcblxuICAvKiogQSByb3cgY2FuIHNwZWNpZnkgaXRzIHZlcnRpY2FsIGFsaWdubWVudCB0byBoYXZlIGFsbCBpdHMgY29sdW1ucyB2ZXJ0aWNhbGx5IGNlbnRlcmVkLiAqL1xuICB2ZXJ0aWNhbEFsaWduOiBQcm9wVHlwZXMub25lT2YoU1VJLlZFUlRJQ0FMX0FMSUdOTUVOVFMpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBHcmlkUm93OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0dyaWQnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgQ29tcG9uZW50LCBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5LCB1c2VWYWx1ZUFuZEtleSwgdXNlV2lkdGhQcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBNZW51SGVhZGVyIGZyb20gJy4vTWVudUhlYWRlcic7XG5pbXBvcnQgTWVudUl0ZW0gZnJvbSAnLi9NZW51SXRlbSc7XG5pbXBvcnQgTWVudU1lbnUgZnJvbSAnLi9NZW51TWVudSc7XG4vKipcbiAqIEEgbWVudSBkaXNwbGF5cyBncm91cGVkIG5hdmlnYXRpb24gYWN0aW9ucy5cbiAqIEBzZWUgRHJvcGRvd25cbiAqL1xuXG52YXIgTWVudSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShNZW51LCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZW51KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlSXRlbU92ZXJyaWRlcyA9IGZ1bmN0aW9uIChwcmVkZWZpbmVkUHJvcHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSwgaXRlbVByb3BzKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gaXRlbVByb3BzLmluZGV4O1xuXG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgYWN0aXZlSW5kZXg6IGluZGV4XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfaW52b2tlKHByZWRlZmluZWRQcm9wcywgJ29uQ2xpY2snLCBlLCBpdGVtUHJvcHMpO1xuXG4gICAgICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uSXRlbUNsaWNrJywgZSwgaXRlbVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE1lbnUucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXJJdGVtcyA9IGZ1bmN0aW9uIHJlbmRlckl0ZW1zKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGl0ZW1zID0gdGhpcy5wcm9wcy5pdGVtcztcbiAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLnN0YXRlLmFjdGl2ZUluZGV4O1xuICAgIHJldHVybiBfbWFwKGl0ZW1zLCBmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBNZW51SXRlbS5jcmVhdGUoaXRlbSwge1xuICAgICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgICBhY3RpdmU6IHBhcnNlSW50KGFjdGl2ZUluZGV4LCAxMCkgPT09IGluZGV4LFxuICAgICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgICB9LFxuICAgICAgICBvdmVycmlkZVByb3BzOiBfdGhpczIuaGFuZGxlSXRlbU92ZXJyaWRlc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhdHRhY2hlZCA9IF90aGlzJHByb3BzLmF0dGFjaGVkLFxuICAgICAgICBib3JkZXJsZXNzID0gX3RoaXMkcHJvcHMuYm9yZGVybGVzcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvciA9IF90aGlzJHByb3BzLmNvbG9yLFxuICAgICAgICBjb21wYWN0ID0gX3RoaXMkcHJvcHMuY29tcGFjdCxcbiAgICAgICAgZml4ZWQgPSBfdGhpcyRwcm9wcy5maXhlZCxcbiAgICAgICAgZmxvYXRlZCA9IF90aGlzJHByb3BzLmZsb2F0ZWQsXG4gICAgICAgIGZsdWlkID0gX3RoaXMkcHJvcHMuZmx1aWQsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wcy5pY29uLFxuICAgICAgICBpbnZlcnRlZCA9IF90aGlzJHByb3BzLmludmVydGVkLFxuICAgICAgICBwYWdpbmF0aW9uID0gX3RoaXMkcHJvcHMucGFnaW5hdGlvbixcbiAgICAgICAgcG9pbnRpbmcgPSBfdGhpcyRwcm9wcy5wb2ludGluZyxcbiAgICAgICAgc2Vjb25kYXJ5ID0gX3RoaXMkcHJvcHMuc2Vjb25kYXJ5LFxuICAgICAgICBzaXplID0gX3RoaXMkcHJvcHMuc2l6ZSxcbiAgICAgICAgc3RhY2thYmxlID0gX3RoaXMkcHJvcHMuc3RhY2thYmxlLFxuICAgICAgICB0YWJ1bGFyID0gX3RoaXMkcHJvcHMudGFidWxhcixcbiAgICAgICAgdGV4dCA9IF90aGlzJHByb3BzLnRleHQsXG4gICAgICAgIHZlcnRpY2FsID0gX3RoaXMkcHJvcHMudmVydGljYWwsXG4gICAgICAgIHdpZHRocyA9IF90aGlzJHByb3BzLndpZHRocztcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIGNvbG9yLCBzaXplLCB1c2VLZXlPbmx5KGJvcmRlcmxlc3MsICdib3JkZXJsZXNzJyksIHVzZUtleU9ubHkoY29tcGFjdCwgJ2NvbXBhY3QnKSwgdXNlS2V5T25seShmbHVpZCwgJ2ZsdWlkJyksIHVzZUtleU9ubHkoaW52ZXJ0ZWQsICdpbnZlcnRlZCcpLCB1c2VLZXlPbmx5KHBhZ2luYXRpb24sICdwYWdpbmF0aW9uJyksIHVzZUtleU9ubHkocG9pbnRpbmcsICdwb2ludGluZycpLCB1c2VLZXlPbmx5KHNlY29uZGFyeSwgJ3NlY29uZGFyeScpLCB1c2VLZXlPbmx5KHN0YWNrYWJsZSwgJ3N0YWNrYWJsZScpLCB1c2VLZXlPbmx5KHRleHQsICd0ZXh0JyksIHVzZUtleU9ubHkodmVydGljYWwsICd2ZXJ0aWNhbCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGF0dGFjaGVkLCAnYXR0YWNoZWQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShmbG9hdGVkLCAnZmxvYXRlZCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGljb24sICdpY29uJyksIHVzZUtleU9yVmFsdWVBbmRLZXkodGFidWxhciwgJ3RhYnVsYXInKSwgdXNlVmFsdWVBbmRLZXkoZml4ZWQsICdmaXhlZCcpLCB1c2VXaWR0aFByb3Aod2lkdGhzLCAnaXRlbScpLCBjbGFzc05hbWUsICdtZW51Jyk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhNZW51LCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShNZW51LCB0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyB0aGlzLnJlbmRlckl0ZW1zKCkgOiBjaGlsZHJlbik7XG4gIH07XG5cbiAgcmV0dXJuIE1lbnU7XG59KENvbXBvbmVudCk7XG5cbk1lbnUuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlSW5kZXhcIiwgXCJhc1wiLCBcImF0dGFjaGVkXCIsIFwiYm9yZGVybGVzc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb21wYWN0XCIsIFwiZGVmYXVsdEFjdGl2ZUluZGV4XCIsIFwiZml4ZWRcIiwgXCJmbG9hdGVkXCIsIFwiZmx1aWRcIiwgXCJpY29uXCIsIFwiaW52ZXJ0ZWRcIiwgXCJpdGVtc1wiLCBcIm9uSXRlbUNsaWNrXCIsIFwicGFnaW5hdGlvblwiLCBcInBvaW50aW5nXCIsIFwic2Vjb25kYXJ5XCIsIFwic2l6ZVwiLCBcInN0YWNrYWJsZVwiLCBcInRhYnVsYXJcIiwgXCJ0ZXh0XCIsIFwidmVydGljYWxcIiwgXCJ3aWR0aHNcIl07XG5NZW51LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0uICovXG4gIGFjdGl2ZUluZGV4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIEEgbWVudSBtYXkgYmUgYXR0YWNoZWQgdG8gb3RoZXIgY29udGVudCBzZWdtZW50cy4gKi9cbiAgYXR0YWNoZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd0b3AnLCAnYm90dG9tJ10pXSksXG5cbiAgLyoqIEEgbWVudSBpdGVtIG9yIG1lbnUgY2FuIGhhdmUgbm8gYm9yZGVycy4gKi9cbiAgYm9yZGVybGVzczogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQWRkaXRpb25hbCBjb2xvcnMgY2FuIGJlIHNwZWNpZmllZC4gKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihTVUkuQ09MT1JTKSxcblxuICAvKiogQSBtZW51IGNhbiB0YWtlIHVwIG9ubHkgdGhlIHNwYWNlIG5lY2Vzc2FyeSB0byBmaXQgaXRzIGNvbnRlbnQuICovXG4gIGNvbXBhY3Q6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBJbml0aWFsIGFjdGl2ZUluZGV4IHZhbHVlLiAqL1xuICBkZWZhdWx0QWN0aXZlSW5kZXg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogQSBtZW51IGNhbiBiZSBmaXhlZCB0byBhIHNpZGUgb2YgaXRzIGNvbnRleHQuICovXG4gIGZpeGVkOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScsICd0b3AnXSksXG5cbiAgLyoqIEEgbWVudSBjYW4gYmUgZmxvYXRlZC4gKi9cbiAgZmxvYXRlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ3JpZ2h0J10pXSksXG5cbiAgLyoqIEEgdmVydGljYWwgbWVudSBtYXkgdGFrZSB0aGUgc2l6ZSBvZiBpdHMgY29udGFpbmVyLiAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgbWVudSBtYXkgaGF2ZSBqdXN0IGljb25zIChib29sKSBvciBsYWJlbGVkIGljb25zLiAqL1xuICBpY29uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnbGFiZWxlZCddKV0pLFxuXG4gIC8qKiBBIG1lbnUgbWF5IGhhdmUgaXRzIGNvbG9ycyBpbnZlcnRlZCB0byBzaG93IGdyZWF0ZXIgY29udHJhc3QuICovXG4gIGludmVydGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGFycmF5IG9mIHByb3BzIGZvciBNZW51LiAqL1xuICBpdGVtczogY3VzdG9tUHJvcFR5cGVzLmNvbGxlY3Rpb25TaG9ydGhhbmQsXG5cbiAgLyoqXG4gICAqIG9uQ2xpY2sgaGFuZGxlciBmb3IgTWVudUl0ZW0uIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGNoaWxkcmVuLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIGl0ZW0gcHJvcHMuXG4gICAqL1xuICBvbkl0ZW1DbGljazogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydjaGlsZHJlbiddKSwgUHJvcFR5cGVzLmZ1bmNdKSxcblxuICAvKiogQSBwYWdpbmF0aW9uIG1lbnUgaXMgc3BlY2lhbGx5IGZvcm1hdHRlZCB0byBwcmVzZW50IGxpbmtzIHRvIHBhZ2VzIG9mIGNvbnRlbnQuICovXG4gIHBhZ2luYXRpb246IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lbnUgY2FuIHBvaW50IHRvIHNob3cgaXRzIHJlbGF0aW9uc2hpcCB0byBuZWFyYnkgY29udGVudC4gKi9cbiAgcG9pbnRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lbnUgY2FuIGFkanVzdCBpdHMgYXBwZWFyYW5jZSB0byBkZS1lbXBoYXNpemUgaXRzIGNvbnRlbnRzLiAqL1xuICBzZWNvbmRhcnk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lbnUgY2FuIHZhcnkgaW4gc2l6ZS4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScsICdiaWcnKSksXG5cbiAgLyoqIEEgbWVudSBjYW4gc3RhY2sgYXQgbW9iaWxlIHJlc29sdXRpb25zLiAqL1xuICBzdGFja2FibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lbnUgY2FuIGJlIGZvcm1hdHRlZCB0byBzaG93IHRhYnMgb2YgaW5mb3JtYXRpb24uICovXG4gIHRhYnVsYXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWydyaWdodCddKV0pLFxuXG4gIC8qKiBBIG1lbnUgY2FuIGJlIGZvcm1hdHRlZCBmb3IgdGV4dCBjb250ZW50LiAqL1xuICB0ZXh0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSB2ZXJ0aWNhbCBtZW51IGRpc3BsYXlzIGVsZW1lbnRzIHZlcnRpY2FsbHkuICovXG4gIHZlcnRpY2FsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBtZW51IGNhbiBoYXZlIGl0cyBpdGVtcyBkaXZpZGVkIGV2ZW5seS4gKi9cbiAgd2lkdGhzOiBQcm9wVHlwZXMub25lT2YoU1VJLldJRFRIUylcbn0gOiB7fTtcbk1lbnUuYXV0b0NvbnRyb2xsZWRQcm9wcyA9IFsnYWN0aXZlSW5kZXgnXTtcbk1lbnUuSGVhZGVyID0gTWVudUhlYWRlcjtcbk1lbnUuSXRlbSA9IE1lbnVJdGVtO1xuTWVudS5NZW51ID0gTWVudU1lbnU7XG5NZW51LmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoTWVudSwgZnVuY3Rpb24gKGl0ZW1zKSB7XG4gIHJldHVybiB7XG4gICAgaXRlbXM6IGl0ZW1zXG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IE1lbnU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBtZW51IGl0ZW0gbWF5IGluY2x1ZGUgYSBoZWFkZXIgb3IgbWF5IGl0c2VsZiBiZSBhIGhlYWRlci5cbiAqL1xuXG5mdW5jdGlvbiBNZW51SGVhZGVyKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2hlYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoTWVudUhlYWRlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShNZW51SGVhZGVyLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuTWVudUhlYWRlci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbk1lbnVIZWFkZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IE1lbnVIZWFkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfc3RhcnRDYXNlIGZyb20gXCJsb2Rhc2gtZXMvc3RhcnRDYXNlXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ljb24nO1xuLyoqXG4gKiBBIG1lbnUgY2FuIGNvbnRhaW4gYW4gaXRlbS5cbiAqL1xuXG52YXIgTWVudUl0ZW0gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoTWVudUl0ZW0sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lbnVJdGVtKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGRpc2FibGVkID0gX3RoaXMucHJvcHMuZGlzYWJsZWQ7XG4gICAgICBpZiAoIWRpc2FibGVkKSBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DbGljaycsIGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE1lbnVJdGVtLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzLmFjdGl2ZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvciA9IF90aGlzJHByb3BzLmNvbG9yLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMuY29udGVudCxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgZml0dGVkID0gX3RoaXMkcHJvcHMuZml0dGVkLFxuICAgICAgICBoZWFkZXIgPSBfdGhpcyRwcm9wcy5oZWFkZXIsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wcy5pY29uLFxuICAgICAgICBsaW5rID0gX3RoaXMkcHJvcHMubGluayxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzLm5hbWUsXG4gICAgICAgIG9uQ2xpY2sgPSBfdGhpcyRwcm9wcy5vbkNsaWNrLFxuICAgICAgICBwb3NpdGlvbiA9IF90aGlzJHByb3BzLnBvc2l0aW9uO1xuICAgIHZhciBjbGFzc2VzID0gY3goY29sb3IsIHBvc2l0aW9uLCB1c2VLZXlPbmx5KGFjdGl2ZSwgJ2FjdGl2ZScpLCB1c2VLZXlPbmx5KGRpc2FibGVkLCAnZGlzYWJsZWQnKSwgdXNlS2V5T25seShpY29uID09PSB0cnVlIHx8IGljb24gJiYgIShuYW1lIHx8IGNvbnRlbnQpLCAnaWNvbicpLCB1c2VLZXlPbmx5KGhlYWRlciwgJ2hlYWRlcicpLCB1c2VLZXlPbmx5KGxpbmssICdsaW5rJyksIHVzZUtleU9yVmFsdWVBbmRLZXkoZml0dGVkLCAnZml0dGVkJyksICdpdGVtJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShNZW51SXRlbSwgdGhpcy5wcm9wcywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKG9uQ2xpY2spIHJldHVybiAnYSc7XG4gICAgfSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhNZW51SXRlbSwgdGhpcy5wcm9wcyk7XG5cbiAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIGNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSksIEljb24uY3JlYXRlKGljb24sIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSA/IF9zdGFydENhc2UobmFtZSkgOiBjb250ZW50KTtcbiAgfTtcblxuICByZXR1cm4gTWVudUl0ZW07XG59KENvbXBvbmVudCk7XG5cbk1lbnVJdGVtLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbnRlbnRcIiwgXCJkaXNhYmxlZFwiLCBcImZpdHRlZFwiLCBcImhlYWRlclwiLCBcImljb25cIiwgXCJpbmRleFwiLCBcImxpbmtcIiwgXCJuYW1lXCIsIFwib25DbGlja1wiLCBcInBvc2l0aW9uXCJdO1xuZXhwb3J0IHsgTWVudUl0ZW0gYXMgZGVmYXVsdCB9O1xuTWVudUl0ZW0ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBtZW51IGl0ZW0gY2FuIGJlIGFjdGl2ZS4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNvbG9ycyBjYW4gYmUgc3BlY2lmaWVkLiAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFNVSS5DT0xPUlMpLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgbWVudSBpdGVtIGNhbiBiZSBkaXNhYmxlZC4gKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lbnUgaXRlbSBvciBtZW51IGNhbiByZW1vdmUgZWxlbWVudCBwYWRkaW5nLCB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS4gKi9cbiAgZml0dGVkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnaG9yaXpvbnRhbGx5JywgJ3ZlcnRpY2FsbHknXSldKSxcblxuICAvKiogQSBtZW51IGl0ZW0gbWF5IGluY2x1ZGUgYSBoZWFkZXIgb3IgbWF5IGl0c2VsZiBiZSBhIGhlYWRlci4gKi9cbiAgaGVhZGVyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogTWVudUl0ZW0gY2FuIGJlIG9ubHkgaWNvbi4gKi9cbiAgaWNvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kXSksXG5cbiAgLyoqIE1lbnVJdGVtIGluZGV4IGluc2lkZSBNZW51LiAqL1xuICBpbmRleDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKiogQSBtZW51IGl0ZW0gY2FuIGJlIGxpbmsuICovXG4gIGxpbms6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBJbnRlcm5hbCBuYW1lIG9mIHRoZSBNZW51SXRlbS4gKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNsaWNrLiBXaGVuIHBhc3NlZCwgdGhlIGNvbXBvbmVudCB3aWxsIHJlbmRlciBhcyBhbiBgYWBcbiAgICogdGFnIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBhIGBkaXZgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgbWVudSBpdGVtIGNhbiB0YWtlIGxlZnQgb3IgcmlnaHQgcG9zaXRpb24uICovXG4gIHBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0J10pXG59IDoge307XG5NZW51SXRlbS5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KE1lbnVJdGVtLCBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogdmFsLFxuICAgIG5hbWU6IHZhbFxuICB9O1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBtZW51IGNhbiBjb250YWluIGEgc3ViIG1lbnUuXG4gKi9cblxuZnVuY3Rpb24gTWVudU1lbnUocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIHBvc2l0aW9uID0gcHJvcHMucG9zaXRpb247XG4gIHZhciBjbGFzc2VzID0gY3gocG9zaXRpb24sICdtZW51JywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhNZW51TWVudSwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShNZW51TWVudSwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbk1lbnVNZW51LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwicG9zaXRpb25cIl07XG5NZW51TWVudS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBzdWIgbWVudSBjYW4gdGFrZSBsZWZ0IG9yIHJpZ2h0IHBvc2l0aW9uLiAqL1xuICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdyaWdodCddKVxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgTWVudU1lbnU7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vTWVudSc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC1lcy9pc05pbFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVIVE1MUGFyYWdyYXBoLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ljb24nO1xuaW1wb3J0IE1lc3NhZ2VDb250ZW50IGZyb20gJy4vTWVzc2FnZUNvbnRlbnQnO1xuaW1wb3J0IE1lc3NhZ2VIZWFkZXIgZnJvbSAnLi9NZXNzYWdlSGVhZGVyJztcbmltcG9ydCBNZXNzYWdlTGlzdCBmcm9tICcuL01lc3NhZ2VMaXN0JztcbmltcG9ydCBNZXNzYWdlSXRlbSBmcm9tICcuL01lc3NhZ2VJdGVtJztcbi8qKlxuICogQSBtZXNzYWdlIGRpc3BsYXlzIGluZm9ybWF0aW9uIHRoYXQgZXhwbGFpbnMgbmVhcmJ5IGNvbnRlbnQuXG4gKiBAc2VlIEZvcm1cbiAqL1xuXG52YXIgTWVzc2FnZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShNZXNzYWdlLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZXNzYWdlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlRGlzbWlzcyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25EaXNtaXNzID0gX3RoaXMucHJvcHMub25EaXNtaXNzO1xuICAgICAgaWYgKG9uRGlzbWlzcykgb25EaXNtaXNzKGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IE1lc3NhZ2UucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYXR0YWNoZWQgPSBfdGhpcyRwcm9wcy5hdHRhY2hlZCxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvciA9IF90aGlzJHByb3BzLmNvbG9yLFxuICAgICAgICBjb21wYWN0ID0gX3RoaXMkcHJvcHMuY29tcGFjdCxcbiAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzLmNvbnRlbnQsXG4gICAgICAgIGVycm9yID0gX3RoaXMkcHJvcHMuZXJyb3IsXG4gICAgICAgIGZsb2F0aW5nID0gX3RoaXMkcHJvcHMuZmxvYXRpbmcsXG4gICAgICAgIGhlYWRlciA9IF90aGlzJHByb3BzLmhlYWRlcixcbiAgICAgICAgaGlkZGVuID0gX3RoaXMkcHJvcHMuaGlkZGVuLFxuICAgICAgICBpY29uID0gX3RoaXMkcHJvcHMuaWNvbixcbiAgICAgICAgaW5mbyA9IF90aGlzJHByb3BzLmluZm8sXG4gICAgICAgIGxpc3QgPSBfdGhpcyRwcm9wcy5saXN0LFxuICAgICAgICBuZWdhdGl2ZSA9IF90aGlzJHByb3BzLm5lZ2F0aXZlLFxuICAgICAgICBvbkRpc21pc3MgPSBfdGhpcyRwcm9wcy5vbkRpc21pc3MsXG4gICAgICAgIHBvc2l0aXZlID0gX3RoaXMkcHJvcHMucG9zaXRpdmUsXG4gICAgICAgIHNpemUgPSBfdGhpcyRwcm9wcy5zaXplLFxuICAgICAgICBzdWNjZXNzID0gX3RoaXMkcHJvcHMuc3VjY2VzcyxcbiAgICAgICAgdmlzaWJsZSA9IF90aGlzJHByb3BzLnZpc2libGUsXG4gICAgICAgIHdhcm5pbmcgPSBfdGhpcyRwcm9wcy53YXJuaW5nO1xuICAgIHZhciBjbGFzc2VzID0gY3goJ3VpJywgY29sb3IsIHNpemUsIHVzZUtleU9ubHkoY29tcGFjdCwgJ2NvbXBhY3QnKSwgdXNlS2V5T25seShlcnJvciwgJ2Vycm9yJyksIHVzZUtleU9ubHkoZmxvYXRpbmcsICdmbG9hdGluZycpLCB1c2VLZXlPbmx5KGhpZGRlbiwgJ2hpZGRlbicpLCB1c2VLZXlPbmx5KGljb24sICdpY29uJyksIHVzZUtleU9ubHkoaW5mbywgJ2luZm8nKSwgdXNlS2V5T25seShuZWdhdGl2ZSwgJ25lZ2F0aXZlJyksIHVzZUtleU9ubHkocG9zaXRpdmUsICdwb3NpdGl2ZScpLCB1c2VLZXlPbmx5KHN1Y2Nlc3MsICdzdWNjZXNzJyksIHVzZUtleU9ubHkodmlzaWJsZSwgJ3Zpc2libGUnKSwgdXNlS2V5T25seSh3YXJuaW5nLCAnd2FybmluZycpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGF0dGFjaGVkLCAnYXR0YWNoZWQnKSwgJ21lc3NhZ2UnLCBjbGFzc05hbWUpO1xuICAgIHZhciBkaXNtaXNzSWNvbiA9IG9uRGlzbWlzcyAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uLCB7XG4gICAgICBuYW1lOiBcImNsb3NlXCIsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZURpc21pc3NcbiAgICB9KTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKE1lc3NhZ2UsIHRoaXMucHJvcHMpO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1lc3NhZ2UsIHRoaXMucHJvcHMpO1xuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICAgIH0pLCBkaXNtaXNzSWNvbiwgY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBkaXNtaXNzSWNvbiwgSWNvbi5jcmVhdGUoaWNvbiwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCAoIV9pc05pbChoZWFkZXIpIHx8ICFfaXNOaWwoY29udGVudCkgfHwgIV9pc05pbChsaXN0KSkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVzc2FnZUNvbnRlbnQsIG51bGwsIE1lc3NhZ2VIZWFkZXIuY3JlYXRlKGhlYWRlciwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCBNZXNzYWdlTGlzdC5jcmVhdGUobGlzdCwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCBjcmVhdGVIVE1MUGFyYWdyYXBoKGNvbnRlbnQsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSkpO1xuICB9O1xuXG4gIHJldHVybiBNZXNzYWdlO1xufShDb21wb25lbnQpO1xuXG5NZXNzYWdlLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiYXR0YWNoZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29tcGFjdFwiLCBcImNvbnRlbnRcIiwgXCJlcnJvclwiLCBcImZsb2F0aW5nXCIsIFwiaGVhZGVyXCIsIFwiaGlkZGVuXCIsIFwiaWNvblwiLCBcImluZm9cIiwgXCJsaXN0XCIsIFwibmVnYXRpdmVcIiwgXCJvbkRpc21pc3NcIiwgXCJwb3NpdGl2ZVwiLCBcInNpemVcIiwgXCJzdWNjZXNzXCIsIFwidmlzaWJsZVwiLCBcIndhcm5pbmdcIl07XG5leHBvcnQgeyBNZXNzYWdlIGFzIGRlZmF1bHQgfTtcbk1lc3NhZ2UucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBtZXNzYWdlIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYXR0YWNoIGl0c2VsZiB0byBvdGhlciBjb250ZW50LiAqL1xuICBhdHRhY2hlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSldKSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBIG1lc3NhZ2UgY2FuIGJlIGZvcm1hdHRlZCB0byBiZSBkaWZmZXJlbnQgY29sb3JzLiAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFNVSS5DT0xPUlMpLFxuXG4gIC8qKiBBIG1lc3NhZ2UgY2FuIG9ubHkgdGFrZSB1cCB0aGUgd2lkdGggb2YgaXRzIGNvbnRlbnQuICovXG4gIGNvbXBhY3Q6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgbWVzc2FnZSBtYXkgYmUgZm9ybWF0dGVkIHRvIGRpc3BsYXkgYSBuZWdhdGl2ZSBtZXNzYWdlLiBTYW1lIGFzIGBuZWdhdGl2ZWAuICovXG4gIGVycm9yOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBtZXNzYWdlIGNhbiBmbG9hdCBhYm92ZSBjb250ZW50IHRoYXQgaXQgaXMgcmVsYXRlZCB0by4gKi9cbiAgZmxvYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIE1lc3NhZ2VIZWFkZXIuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEEgbWVzc2FnZSBjYW4gYmUgaGlkZGVuLiAqL1xuICBoaWRkZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lc3NhZ2UgY2FuIGNvbnRhaW4gYW4gaWNvbi4gKi9cbiAgaWNvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsIFByb3BUeXBlcy5ib29sXSksXG5cbiAgLyoqIEEgbWVzc2FnZSBtYXkgYmUgZm9ybWF0dGVkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24uICovXG4gIGluZm86IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBcnJheSBzaG9ydGhhbmQgaXRlbXMgZm9yIHRoZSBNZXNzYWdlTGlzdC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY2hpbGRyZW4uICovXG4gIGxpc3Q6IGN1c3RvbVByb3BUeXBlcy5jb2xsZWN0aW9uU2hvcnRoYW5kLFxuXG4gIC8qKiBBIG1lc3NhZ2UgbWF5IGJlIGZvcm1hdHRlZCB0byBkaXNwbGF5IGEgbmVnYXRpdmUgbWVzc2FnZS4gU2FtZSBhcyBgZXJyb3JgLiAqL1xuICBuZWdhdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgbWVzc2FnZSB0aGF0IHRoZSB1c2VyIGNhbiBjaG9vc2UgdG8gaGlkZS5cbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcInhcIiBpY29uLiBUaGlzIGFsc28gYWRkcyB0aGUgXCJ4XCIgaWNvbi5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uRGlzbWlzczogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgbWVzc2FnZSBtYXkgYmUgZm9ybWF0dGVkIHRvIGRpc3BsYXkgYSBwb3NpdGl2ZSBtZXNzYWdlLiAgU2FtZSBhcyBgc3VjY2Vzc2AuICovXG4gIHBvc2l0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBtZXNzYWdlIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScpKSxcblxuICAvKiogQSBtZXNzYWdlIG1heSBiZSBmb3JtYXR0ZWQgdG8gZGlzcGxheSBhIHBvc2l0aXZlIG1lc3NhZ2UuICBTYW1lIGFzIGBwb3NpdGl2ZWAuICovXG4gIHN1Y2Nlc3M6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1lc3NhZ2UgY2FuIGJlIHNldCB0byB2aXNpYmxlIHRvIGZvcmNlIGl0c2VsZiB0byBiZSBzaG93bi4gKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgbWVzc2FnZSBtYXkgYmUgZm9ybWF0dGVkIHRvIGRpc3BsYXkgd2FybmluZyBtZXNzYWdlcy4gKi9cbiAgd2FybmluZzogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbk1lc3NhZ2UuQ29udGVudCA9IE1lc3NhZ2VDb250ZW50O1xuTWVzc2FnZS5IZWFkZXIgPSBNZXNzYWdlSGVhZGVyO1xuTWVzc2FnZS5MaXN0ID0gTWVzc2FnZUxpc3Q7XG5NZXNzYWdlLkl0ZW0gPSBNZXNzYWdlSXRlbTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIG1lc3NhZ2UgY2FuIGNvbnRhaW4gYSBjb250ZW50LlxuICovXG5cbmZ1bmN0aW9uIE1lc3NhZ2VDb250ZW50KHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKE1lc3NhZ2VDb250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1lc3NhZ2VDb250ZW50LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuTWVzc2FnZUNvbnRlbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5NZXNzYWdlQ29udGVudC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUNvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBtZXNzYWdlIGNhbiBjb250YWluIGEgaGVhZGVyLlxuICovXG5cbmZ1bmN0aW9uIE1lc3NhZ2VIZWFkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnaGVhZGVyJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhNZXNzYWdlSGVhZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1lc3NhZ2VIZWFkZXIsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5NZXNzYWdlSGVhZGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuTWVzc2FnZUhlYWRlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuTWVzc2FnZUhlYWRlci5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KE1lc3NhZ2VIZWFkZXIsIGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiB2YWxcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIG1lc3NhZ2UgbGlzdCBjYW4gY29udGFpbiBhbiBpdGVtLlxuICovXG5cbmZ1bmN0aW9uIE1lc3NhZ2VJdGVtKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKE1lc3NhZ2VJdGVtLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1lc3NhZ2VJdGVtLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuTWVzc2FnZUl0ZW0uaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5NZXNzYWdlSXRlbS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuTWVzc2FnZUl0ZW0uZGVmYXVsdFByb3BzID0ge1xuICBhczogJ2xpJ1xufTtcbk1lc3NhZ2VJdGVtLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoTWVzc2FnZUl0ZW0sIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlSXRlbTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfbWFwIGZyb20gXCJsb2Rhc2gtZXMvbWFwXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBNZXNzYWdlSXRlbSBmcm9tICcuL01lc3NhZ2VJdGVtJztcbi8qKlxuICogQSBtZXNzYWdlIGNhbiBjb250YWluIGEgbGlzdCBvZiBpdGVtcy5cbiAqL1xuXG5mdW5jdGlvbiBNZXNzYWdlTGlzdChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGl0ZW1zID0gcHJvcHMuaXRlbXM7XG4gIHZhciBjbGFzc2VzID0gY3goJ2xpc3QnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKE1lc3NhZ2VMaXN0LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1lc3NhZ2VMaXN0LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gX21hcChpdGVtcywgTWVzc2FnZUl0ZW0uY3JlYXRlKSA6IGNoaWxkcmVuKTtcbn1cblxuTWVzc2FnZUxpc3QuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcIml0ZW1zXCJdO1xuTWVzc2FnZUxpc3QucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgTWVzc2FnZS5JdGVtcy4gKi9cbiAgaXRlbXM6IGN1c3RvbVByb3BUeXBlcy5jb2xsZWN0aW9uU2hvcnRoYW5kXG59IDoge307XG5NZXNzYWdlTGlzdC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAndWwnXG59O1xuTWVzc2FnZUxpc3QuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShNZXNzYWdlTGlzdCwgZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4ge1xuICAgIGl0ZW1zOiB2YWxcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUxpc3Q7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vTWVzc2FnZSc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5LCB1c2VUZXh0QWxpZ25Qcm9wLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCwgdXNlV2lkdGhQcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBUYWJsZUJvZHkgZnJvbSAnLi9UYWJsZUJvZHknO1xuaW1wb3J0IFRhYmxlQ2VsbCBmcm9tICcuL1RhYmxlQ2VsbCc7XG5pbXBvcnQgVGFibGVGb290ZXIgZnJvbSAnLi9UYWJsZUZvb3Rlcic7XG5pbXBvcnQgVGFibGVIZWFkZXIgZnJvbSAnLi9UYWJsZUhlYWRlcic7XG5pbXBvcnQgVGFibGVIZWFkZXJDZWxsIGZyb20gJy4vVGFibGVIZWFkZXJDZWxsJztcbmltcG9ydCBUYWJsZVJvdyBmcm9tICcuL1RhYmxlUm93Jztcbi8qKlxuICogQSB0YWJsZSBkaXNwbGF5cyBhIGNvbGxlY3Rpb25zIG9mIGRhdGEgZ3JvdXBlZCBpbnRvIHJvd3MuXG4gKi9cblxuZnVuY3Rpb24gVGFibGUocHJvcHMpIHtcbiAgdmFyIGF0dGFjaGVkID0gcHJvcHMuYXR0YWNoZWQsXG4gICAgICBiYXNpYyA9IHByb3BzLmJhc2ljLFxuICAgICAgY2VsbGVkID0gcHJvcHMuY2VsbGVkLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbGxhcHNpbmcgPSBwcm9wcy5jb2xsYXBzaW5nLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbHVtbnMgPSBwcm9wcy5jb2x1bW5zLFxuICAgICAgY29tcGFjdCA9IHByb3BzLmNvbXBhY3QsXG4gICAgICBkZWZpbml0aW9uID0gcHJvcHMuZGVmaW5pdGlvbixcbiAgICAgIGZpeGVkID0gcHJvcHMuZml4ZWQsXG4gICAgICBmb290ZXJSb3cgPSBwcm9wcy5mb290ZXJSb3csXG4gICAgICBoZWFkZXJSb3cgPSBwcm9wcy5oZWFkZXJSb3csXG4gICAgICBoZWFkZXJSb3dzID0gcHJvcHMuaGVhZGVyUm93cyxcbiAgICAgIGludmVydGVkID0gcHJvcHMuaW52ZXJ0ZWQsXG4gICAgICBwYWRkZWQgPSBwcm9wcy5wYWRkZWQsXG4gICAgICByZW5kZXJCb2R5Um93ID0gcHJvcHMucmVuZGVyQm9keVJvdyxcbiAgICAgIHNlbGVjdGFibGUgPSBwcm9wcy5zZWxlY3RhYmxlLFxuICAgICAgc2luZ2xlTGluZSA9IHByb3BzLnNpbmdsZUxpbmUsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHNvcnRhYmxlID0gcHJvcHMuc29ydGFibGUsXG4gICAgICBzdGFja2FibGUgPSBwcm9wcy5zdGFja2FibGUsXG4gICAgICBzdHJpcGVkID0gcHJvcHMuc3RyaXBlZCxcbiAgICAgIHN0cnVjdHVyZWQgPSBwcm9wcy5zdHJ1Y3R1cmVkLFxuICAgICAgdGFibGVEYXRhID0gcHJvcHMudGFibGVEYXRhLFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduLFxuICAgICAgdW5zdGFja2FibGUgPSBwcm9wcy51bnN0YWNrYWJsZSxcbiAgICAgIHZlcnRpY2FsQWxpZ24gPSBwcm9wcy52ZXJ0aWNhbEFsaWduO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIGNvbG9yLCBzaXplLCB1c2VLZXlPbmx5KGNlbGxlZCwgJ2NlbGxlZCcpLCB1c2VLZXlPbmx5KGNvbGxhcHNpbmcsICdjb2xsYXBzaW5nJyksIHVzZUtleU9ubHkoZGVmaW5pdGlvbiwgJ2RlZmluaXRpb24nKSwgdXNlS2V5T25seShmaXhlZCwgJ2ZpeGVkJyksIHVzZUtleU9ubHkoaW52ZXJ0ZWQsICdpbnZlcnRlZCcpLCB1c2VLZXlPbmx5KHNlbGVjdGFibGUsICdzZWxlY3RhYmxlJyksIHVzZUtleU9ubHkoc2luZ2xlTGluZSwgJ3NpbmdsZSBsaW5lJyksIHVzZUtleU9ubHkoc29ydGFibGUsICdzb3J0YWJsZScpLCB1c2VLZXlPbmx5KHN0YWNrYWJsZSwgJ3N0YWNrYWJsZScpLCB1c2VLZXlPbmx5KHN0cmlwZWQsICdzdHJpcGVkJyksIHVzZUtleU9ubHkoc3RydWN0dXJlZCwgJ3N0cnVjdHVyZWQnKSwgdXNlS2V5T25seSh1bnN0YWNrYWJsZSwgJ3Vuc3RhY2thYmxlJyksIHVzZUtleU9yVmFsdWVBbmRLZXkoYXR0YWNoZWQsICdhdHRhY2hlZCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGJhc2ljLCAnYmFzaWMnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShjb21wYWN0LCAnY29tcGFjdCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KHBhZGRlZCwgJ3BhZGRlZCcpLCB1c2VUZXh0QWxpZ25Qcm9wKHRleHRBbGlnbiksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wKHZlcnRpY2FsQWxpZ24pLCB1c2VXaWR0aFByb3AoY29sdW1ucywgJ2NvbHVtbicpLCAndGFibGUnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFRhYmxlLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFRhYmxlLCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICB2YXIgaGFzSGVhZGVyUm93cyA9IGhlYWRlclJvdyB8fCBoZWFkZXJSb3dzO1xuICB2YXIgaGVhZGVyU2hvcnRoYW5kT3B0aW9ucyA9IHtcbiAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgIGNlbGxBczogJ3RoJ1xuICAgIH1cbiAgfTtcbiAgdmFyIGhlYWRlckVsZW1lbnQgPSBoYXNIZWFkZXJSb3dzICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlSGVhZGVyLCBudWxsLCBUYWJsZVJvdy5jcmVhdGUoaGVhZGVyUm93LCBoZWFkZXJTaG9ydGhhbmRPcHRpb25zKSwgX21hcChoZWFkZXJSb3dzLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHJldHVybiBUYWJsZVJvdy5jcmVhdGUoZGF0YSwgaGVhZGVyU2hvcnRoYW5kT3B0aW9ucyk7XG4gIH0pKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgaGVhZGVyRWxlbWVudCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVCb2R5LCBudWxsLCByZW5kZXJCb2R5Um93ICYmIF9tYXAodGFibGVEYXRhLCBmdW5jdGlvbiAoZGF0YSwgaW5kZXgpIHtcbiAgICByZXR1cm4gVGFibGVSb3cuY3JlYXRlKHJlbmRlckJvZHlSb3coZGF0YSwgaW5kZXgpKTtcbiAgfSkpLCBmb290ZXJSb3cgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVGb290ZXIsIG51bGwsIFRhYmxlUm93LmNyZWF0ZShmb290ZXJSb3cpKSk7XG59XG5cblRhYmxlLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiYXR0YWNoZWRcIiwgXCJiYXNpY1wiLCBcImNlbGxlZFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sbGFwc2luZ1wiLCBcImNvbG9yXCIsIFwiY29sdW1uc1wiLCBcImNvbXBhY3RcIiwgXCJkZWZpbml0aW9uXCIsIFwiZml4ZWRcIiwgXCJmb290ZXJSb3dcIiwgXCJoZWFkZXJSb3dcIiwgXCJoZWFkZXJSb3dzXCIsIFwiaW52ZXJ0ZWRcIiwgXCJwYWRkZWRcIiwgXCJyZW5kZXJCb2R5Um93XCIsIFwic2VsZWN0YWJsZVwiLCBcInNpbmdsZUxpbmVcIiwgXCJzaXplXCIsIFwic29ydGFibGVcIiwgXCJzdGFja2FibGVcIiwgXCJzdHJpcGVkXCIsIFwic3RydWN0dXJlZFwiLCBcInRhYmxlRGF0YVwiLCBcInRleHRBbGlnblwiLCBcInVuc3RhY2thYmxlXCIsIFwidmVydGljYWxBbGlnblwiXTtcblRhYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgYXM6ICd0YWJsZSdcbn07XG5UYWJsZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBdHRhY2ggdGFibGUgdG8gb3RoZXIgY29udGVudCAqL1xuICBhdHRhY2hlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdib3R0b20nXSldKSxcblxuICAvKiogQSB0YWJsZSBjYW4gcmVkdWNlIGl0cyBjb21wbGV4aXR5IHRvIGluY3JlYXNlIHJlYWRhYmlsaXR5LiAqL1xuICBiYXNpYzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFsndmVyeSddKSwgUHJvcFR5cGVzLmJvb2xdKSxcblxuICAvKiogQSB0YWJsZSBtYXkgYmUgZGl2aWRlZCBlYWNoIHJvdyBpbnRvIHNlcGFyYXRlIGNlbGxzLiAqL1xuICBjZWxsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgdGFibGUgY2FuIGJlIGNvbGxhcHNpbmcsIHRha2luZyB1cCBvbmx5IGFzIG11Y2ggc3BhY2UgYXMgaXRzIHJvd3MuICovXG4gIGNvbGxhcHNpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBiZSBnaXZlbiBhIGNvbG9yIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gb3RoZXIgdGFibGVzLiAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFNVSS5DT0xPUlMpLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBzcGVjaWZ5IGl0cyBjb2x1bW4gY291bnQgdG8gZGl2aWRlIGl0cyBjb250ZW50IGV2ZW5seS4gKi9cbiAgY29sdW1uczogUHJvcFR5cGVzLm9uZU9mKFNVSS5XSURUSFMpLFxuXG4gIC8qKiBBIHRhYmxlIG1heSBzb21ldGltZXMgbmVlZCB0byBiZSBtb3JlIGNvbXBhY3QgdG8gbWFrZSBtb3JlIHJvd3MgdmlzaWJsZSBhdCBhIHRpbWUuICovXG4gIGNvbXBhY3Q6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd2ZXJ5J10pXSksXG5cbiAgLyoqIEEgdGFibGUgbWF5IGJlIGZvcm1hdHRlZCB0byBlbXBoYXNpemUgYSBmaXJzdCBjb2x1bW4gdGhhdCBkZWZpbmVzIGEgcm93cyBjb250ZW50LiAqL1xuICBkZWZpbml0aW9uOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQSB0YWJsZSBjYW4gdXNlIGZpeGVkIGEgc3BlY2lhbCBmYXN0ZXIgZm9ybSBvZiB0YWJsZSByZW5kZXJpbmcgdGhhdCBkb2VzIG5vdCByZXNpemUgdGFibGUgY2VsbHMgYmFzZWQgb24gY29udGVudFxuICAgKi9cbiAgZml4ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIGEgVGFibGVSb3cgdG8gYmUgcGxhY2VkIHdpdGhpbiBUYWJsZS5Gb290ZXIuICovXG4gIGZvb3RlclJvdzogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgYSBUYWJsZVJvdyB0byBiZSBwbGFjZWQgd2l0aGluIFRhYmxlLkhlYWRlci4gKi9cbiAgaGVhZGVyUm93OiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2hlYWRlclJvd3MnXSksIGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kXSksXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgbXVsdGlwbGUgVGFibGVSb3dzIHRvIGJlIHBsYWNlZCB3aXRoaW4gVGFibGUuSGVhZGVyLiAqL1xuICBoZWFkZXJSb3dzOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2hlYWRlclJvdyddKSwgY3VzdG9tUHJvcFR5cGVzLmNvbGxlY3Rpb25TaG9ydGhhbmRdKSxcblxuICAvKiogQSB0YWJsZSdzIGNvbG9ycyBjYW4gYmUgaW52ZXJ0ZWQuICovXG4gIGludmVydGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSB0YWJsZSBtYXkgc29tZXRpbWVzIG5lZWQgdG8gYmUgbW9yZSBwYWRkZWQgZm9yIGxlZ2liaWxpdHkuICovXG4gIHBhZGRlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ3ZlcnknXSldKSxcblxuICAvKipcbiAgICogTWFwcGVkIG92ZXIgYHRhYmxlRGF0YWAgYW5kIHNob3VsZCByZXR1cm4gc2hvcnRoYW5kIGZvciBlYWNoIFRhYmxlLlJvdyB0byBiZSBwbGFjZWQgd2l0aGluIFRhYmxlLkJvZHkuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZGF0YSAtIEFuIGVsZW1lbnQgaW4gdGhlIGB0YWJsZURhdGFgIGFycmF5LlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgZWxlbWVudCBpbiBgdGFibGVEYXRhYC5cbiAgICogQHJldHVybnMgeyp9IFNob3J0aGFuZCBmb3IgYSBUYWJsZS5Sb3cuXG4gICAqL1xuICByZW5kZXJCb2R5Um93OiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2NoaWxkcmVuJ10pLCBjdXN0b21Qcm9wVHlwZXMuZGVtYW5kKFsndGFibGVEYXRhJ10pLCBQcm9wVHlwZXMuZnVuY10pLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBoYXZlIGl0cyByb3dzIGFwcGVhciBzZWxlY3RhYmxlLiAqL1xuICBzZWxlY3RhYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSB0YWJsZSBjYW4gc3BlY2lmeSB0aGF0IGl0cyBjZWxsIGNvbnRlbnRzIHNob3VsZCByZW1haW4gb24gYSBzaW5nbGUgbGluZSBhbmQgbm90IHdyYXAuICovXG4gIHNpbmdsZUxpbmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBhbHNvIGJlIHNtYWxsIG9yIGxhcmdlLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnbWluaScsICd0aW55JywgJ21lZGl1bScsICdiaWcnLCAnaHVnZScsICdtYXNzaXZlJykpLFxuXG4gIC8qKiBBIHRhYmxlIG1heSBhbGxvdyBhIHVzZXIgdG8gc29ydCBjb250ZW50cyBieSBjbGlja2luZyBvbiBhIHRhYmxlIGhlYWRlci4gKi9cbiAgc29ydGFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBzcGVjaWZ5IGhvdyBpdCBzdGFja3MgdGFibGUgY29udGVudCByZXNwb25zaXZlbHkuICovXG4gIHN0YWNrYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgdGFibGUgY2FuIHN0cmlwZSBhbHRlcm5hdGUgcm93cyBvZiBjb250ZW50IHdpdGggYSBkYXJrZXIgY29sb3IgdG8gaW5jcmVhc2UgY29udHJhc3QuICovXG4gIHN0cmlwZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBiZSBmb3JtYXR0ZWQgdG8gZGlzcGxheSBjb21wbGV4IHN0cnVjdHVyZWQgZGF0YS4gKi9cbiAgc3RydWN0dXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIERhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSByZW5kZXJCb2R5Um93IGZ1bmN0aW9uLiAqL1xuICB0YWJsZURhdGE6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnY2hpbGRyZW4nXSksIGN1c3RvbVByb3BUeXBlcy5kZW1hbmQoWydyZW5kZXJCb2R5Um93J10pLCBQcm9wVHlwZXMuYXJyYXldKSxcblxuICAvKiogQSB0YWJsZSBjYW4gYWRqdXN0IGl0cyB0ZXh0IGFsaWdubWVudC4gKi9cbiAgdGV4dEFsaWduOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlRFWFRfQUxJR05NRU5UUywgJ2p1c3RpZmllZCcpKSxcblxuICAvKiogQSB0YWJsZSBjYW4gc3BlY2lmeSBob3cgaXQgc3RhY2tzIHRhYmxlIGNvbnRlbnQgcmVzcG9uc2l2ZWx5LiAqL1xuICB1bnN0YWNrYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgdGFibGUgY2FuIGFkanVzdCBpdHMgdGV4dCBhbGlnbm1lbnQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUylcbn0gOiB7fTtcblRhYmxlLkJvZHkgPSBUYWJsZUJvZHk7XG5UYWJsZS5DZWxsID0gVGFibGVDZWxsO1xuVGFibGUuRm9vdGVyID0gVGFibGVGb290ZXI7XG5UYWJsZS5IZWFkZXIgPSBUYWJsZUhlYWRlcjtcblRhYmxlLkhlYWRlckNlbGwgPSBUYWJsZUhlYWRlckNlbGw7XG5UYWJsZS5Sb3cgPSBUYWJsZVJvdztcbmV4cG9ydCBkZWZhdWx0IFRhYmxlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuXG5mdW5jdGlvbiBUYWJsZUJvZHkocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWU7XG4gIHZhciBjbGFzc2VzID0gY3goY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhUYWJsZUJvZHksIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoVGFibGVCb2R5LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuKTtcbn1cblxuVGFibGVCb2R5LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIl07XG5UYWJsZUJvZHkuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ3Rib2R5J1xufTtcblRhYmxlQm9keS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IFRhYmxlQm9keTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlS2V5T25seSwgdXNlVGV4dEFsaWduUHJvcCwgdXNlVmVydGljYWxBbGlnblByb3AsIHVzZVdpZHRoUHJvcCB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi8uLi9lbGVtZW50cy9JY29uJztcbi8qKlxuICogQSB0YWJsZSByb3cgY2FuIGhhdmUgY2VsbHMuXG4gKi9cblxuZnVuY3Rpb24gVGFibGVDZWxsKHByb3BzKSB7XG4gIHZhciBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sbGFwc2luZyA9IHByb3BzLmNvbGxhcHNpbmcsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGRpc2FibGVkID0gcHJvcHMuZGlzYWJsZWQsXG4gICAgICBlcnJvciA9IHByb3BzLmVycm9yLFxuICAgICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBuZWdhdGl2ZSA9IHByb3BzLm5lZ2F0aXZlLFxuICAgICAgcG9zaXRpdmUgPSBwcm9wcy5wb3NpdGl2ZSxcbiAgICAgIHNlbGVjdGFibGUgPSBwcm9wcy5zZWxlY3RhYmxlLFxuICAgICAgc2luZ2xlTGluZSA9IHByb3BzLnNpbmdsZUxpbmUsXG4gICAgICB0ZXh0QWxpZ24gPSBwcm9wcy50ZXh0QWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduID0gcHJvcHMudmVydGljYWxBbGlnbixcbiAgICAgIHdhcm5pbmcgPSBwcm9wcy53YXJuaW5nLFxuICAgICAgd2lkdGggPSBwcm9wcy53aWR0aDtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGFjdGl2ZSwgJ2FjdGl2ZScpLCB1c2VLZXlPbmx5KGNvbGxhcHNpbmcsICdjb2xsYXBzaW5nJyksIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGVycm9yLCAnZXJyb3InKSwgdXNlS2V5T25seShuZWdhdGl2ZSwgJ25lZ2F0aXZlJyksIHVzZUtleU9ubHkocG9zaXRpdmUsICdwb3NpdGl2ZScpLCB1c2VLZXlPbmx5KHNlbGVjdGFibGUsICdzZWxlY3RhYmxlJyksIHVzZUtleU9ubHkoc2luZ2xlTGluZSwgJ3NpbmdsZSBsaW5lJyksIHVzZUtleU9ubHkod2FybmluZywgJ3dhcm5pbmcnKSwgdXNlVGV4dEFsaWduUHJvcCh0ZXh0QWxpZ24pLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCh2ZXJ0aWNhbEFsaWduKSwgdXNlV2lkdGhQcm9wKHdpZHRoLCAnd2lkZScpLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFRhYmxlQ2VsbCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShUYWJsZUNlbGwsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIEljb24uY3JlYXRlKGljb24pLCBjb250ZW50KTtcbn1cblxuVGFibGVDZWxsLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xsYXBzaW5nXCIsIFwiY29udGVudFwiLCBcImRpc2FibGVkXCIsIFwiZXJyb3JcIiwgXCJpY29uXCIsIFwibmVnYXRpdmVcIiwgXCJwb3NpdGl2ZVwiLCBcInNlbGVjdGFibGVcIiwgXCJzaW5nbGVMaW5lXCIsIFwidGV4dEFsaWduXCIsIFwidmVydGljYWxBbGlnblwiLCBcIndhcm5pbmdcIiwgXCJ3aWR0aFwiXTtcblRhYmxlQ2VsbC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAndGQnXG59O1xuVGFibGVDZWxsLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgY2VsbCBjYW4gYmUgYWN0aXZlIG9yIHNlbGVjdGVkIGJ5IGEgdXNlci4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBIGNlbGwgY2FuIGJlIGNvbGxhcHNpbmcgc28gdGhhdCBpdCBvbmx5IHVzZXMgYXMgbXVjaCBzcGFjZSBhcyByZXF1aXJlZC4gKi9cbiAgY29sbGFwc2luZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBjZWxsIGNhbiBiZSBkaXNhYmxlZC4gKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGNlbGwgbWF5IGNhbGwgYXR0ZW50aW9uIHRvIGFuIGVycm9yIG9yIGEgbmVnYXRpdmUgdmFsdWUuICovXG4gIGVycm9yOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQWRkIGFuIEljb24gYnkgbmFtZSwgcHJvcHMgb2JqZWN0LCBvciBwYXNzIGFuIDxJY29uIC8+ICovXG4gIGljb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIGNlbGwgbWF5IGxldCBhIHVzZXIga25vdyB3aGV0aGVyIGEgdmFsdWUgaXMgYmFkLiAqL1xuICBuZWdhdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgY2VsbCBtYXkgbGV0IGEgdXNlciBrbm93IHdoZXRoZXIgYSB2YWx1ZSBpcyBnb29kLiAqL1xuICBwb3NpdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgY2VsbCBjYW4gYmUgc2VsZWN0YWJsZS4gKi9cbiAgc2VsZWN0YWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgY2VsbCBjYW4gc3BlY2lmeSB0aGF0IGl0cyBjb250ZW50cyBzaG91bGQgcmVtYWluIG9uIGEgc2luZ2xlIGxpbmUgYW5kIG5vdCB3cmFwLiAqL1xuICBzaW5nbGVMaW5lOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSB0YWJsZSBjZWxsIGNhbiBhZGp1c3QgaXRzIHRleHQgYWxpZ25tZW50LiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuVEVYVF9BTElHTk1FTlRTLCAnanVzdGlmaWVkJykpLFxuXG4gIC8qKiBBIHRhYmxlIGNlbGwgY2FuIGFkanVzdCBpdHMgdGV4dCBhbGlnbm1lbnQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUyksXG5cbiAgLyoqIEEgY2VsbCBtYXkgd2FybiBhIHVzZXIuICovXG4gIHdhcm5pbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHRhYmxlIGNhbiBzcGVjaWZ5IHRoZSB3aWR0aCBvZiBpbmRpdmlkdWFsIGNvbHVtbnMgaW5kZXBlbmRlbnRseS4gKi9cbiAgd2lkdGg6IFByb3BUeXBlcy5vbmVPZihTVUkuV0lEVEhTKVxufSA6IHt9O1xuVGFibGVDZWxsLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoVGFibGVDZWxsLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgVGFibGVDZWxsOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgVGFibGVIZWFkZXIgZnJvbSAnLi9UYWJsZUhlYWRlcic7XG4vKipcbiAqIEEgdGFibGUgY2FuIGhhdmUgYSBmb290ZXIuXG4gKi9cblxuZnVuY3Rpb24gVGFibGVGb290ZXIocHJvcHMpIHtcbiAgdmFyIGFzID0gcHJvcHMuYXM7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoVGFibGVGb290ZXIsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhYmxlSGVhZGVyLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGFzOiBhc1xuICB9KSk7XG59XG5cblRhYmxlRm9vdGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCJdO1xuVGFibGVGb290ZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZVxufSA6IHt9O1xuVGFibGVGb290ZXIuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ3Rmb290J1xufTtcbmV4cG9ydCBkZWZhdWx0IFRhYmxlRm9vdGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgdGFibGUgY2FuIGhhdmUgYSBoZWFkZXIuXG4gKi9cblxuZnVuY3Rpb24gVGFibGVIZWFkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGZ1bGxXaWR0aCA9IHByb3BzLmZ1bGxXaWR0aDtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGZ1bGxXaWR0aCwgJ2Z1bGwtd2lkdGgnKSwgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhUYWJsZUhlYWRlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShUYWJsZUhlYWRlciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cblRhYmxlSGVhZGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZnVsbFdpZHRoXCJdO1xuVGFibGVIZWFkZXIuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ3RoZWFkJ1xufTtcblRhYmxlSGVhZGVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIGRlZmluaXRpb24gdGFibGUgY2FuIGhhdmUgYSBmdWxsIHdpZHRoIGhlYWRlciBvciBmb290ZXIsIGZpbGxpbmcgaW4gdGhlIGdhcCBsZWZ0IGJ5IHRoZSBmaXJzdCBjb2x1bW4uICovXG4gIGZ1bGxXaWR0aDogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IFRhYmxlSGVhZGVyOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRVbmhhbmRsZWRQcm9wcywgdXNlVmFsdWVBbmRLZXkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IFRhYmxlQ2VsbCBmcm9tICcuL1RhYmxlQ2VsbCc7XG4vKipcbiAqIEEgdGFibGUgY2FuIGhhdmUgYSBoZWFkZXIgY2VsbC5cbiAqL1xuXG5mdW5jdGlvbiBUYWJsZUhlYWRlckNlbGwocHJvcHMpIHtcbiAgdmFyIGFzID0gcHJvcHMuYXMsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzb3J0ZWQgPSBwcm9wcy5zb3J0ZWQ7XG4gIHZhciBjbGFzc2VzID0gY3godXNlVmFsdWVBbmRLZXkoc29ydGVkLCAnc29ydGVkJyksIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoVGFibGVIZWFkZXJDZWxsLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWJsZUNlbGwsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgYXM6IGFzLFxuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSk7XG59XG5cblRhYmxlSGVhZGVyQ2VsbC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNsYXNzTmFtZVwiLCBcInNvcnRlZFwiXTtcblRhYmxlSGVhZGVyQ2VsbC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBoZWFkZXIgY2VsbCBjYW4gYmUgc29ydGVkIGluIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIG9yZGVyLiAqL1xuICBzb3J0ZWQ6IFByb3BUeXBlcy5vbmVPZihbJ2FzY2VuZGluZycsICdkZXNjZW5kaW5nJ10pXG59IDoge307XG5UYWJsZUhlYWRlckNlbGwuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ3RoJ1xufTtcbmV4cG9ydCBkZWZhdWx0IFRhYmxlSGVhZGVyQ2VsbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfbWFwIGZyb20gXCJsb2Rhc2gtZXMvbWFwXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZVRleHRBbGlnblByb3AsIHVzZVZlcnRpY2FsQWxpZ25Qcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBUYWJsZUNlbGwgZnJvbSAnLi9UYWJsZUNlbGwnO1xuLyoqXG4gKiBBIHRhYmxlIGNhbiBoYXZlIHJvd3MuXG4gKi9cblxuZnVuY3Rpb24gVGFibGVSb3cocHJvcHMpIHtcbiAgdmFyIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICAgIGNlbGxBcyA9IHByb3BzLmNlbGxBcyxcbiAgICAgIGNlbGxzID0gcHJvcHMuY2VsbHMsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIGVycm9yID0gcHJvcHMuZXJyb3IsXG4gICAgICBuZWdhdGl2ZSA9IHByb3BzLm5lZ2F0aXZlLFxuICAgICAgcG9zaXRpdmUgPSBwcm9wcy5wb3NpdGl2ZSxcbiAgICAgIHRleHRBbGlnbiA9IHByb3BzLnRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ24gPSBwcm9wcy52ZXJ0aWNhbEFsaWduLFxuICAgICAgd2FybmluZyA9IHByb3BzLndhcm5pbmc7XG4gIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgdXNlS2V5T25seShkaXNhYmxlZCwgJ2Rpc2FibGVkJyksIHVzZUtleU9ubHkoZXJyb3IsICdlcnJvcicpLCB1c2VLZXlPbmx5KG5lZ2F0aXZlLCAnbmVnYXRpdmUnKSwgdXNlS2V5T25seShwb3NpdGl2ZSwgJ3Bvc2l0aXZlJyksIHVzZUtleU9ubHkod2FybmluZywgJ3dhcm5pbmcnKSwgdXNlVGV4dEFsaWduUHJvcCh0ZXh0QWxpZ24pLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCh2ZXJ0aWNhbEFsaWduKSwgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhUYWJsZVJvdywgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShUYWJsZVJvdywgcHJvcHMpO1xuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgX21hcChjZWxscywgZnVuY3Rpb24gKGNlbGwpIHtcbiAgICByZXR1cm4gVGFibGVDZWxsLmNyZWF0ZShjZWxsLCB7XG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgYXM6IGNlbGxBc1xuICAgICAgfVxuICAgIH0pO1xuICB9KSk7XG59XG5cblRhYmxlUm93LmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2VsbEFzXCIsIFwiY2VsbHNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVkXCIsIFwiZXJyb3JcIiwgXCJuZWdhdGl2ZVwiLCBcInBvc2l0aXZlXCIsIFwidGV4dEFsaWduXCIsIFwidmVydGljYWxBbGlnblwiLCBcIndhcm5pbmdcIl07XG5UYWJsZVJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAndHInLFxuICBjZWxsQXM6ICd0ZCdcbn07XG5UYWJsZVJvdy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIHJvdyBjYW4gYmUgYWN0aXZlIG9yIHNlbGVjdGVkIGJ5IGEgdXNlci4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgY2VsbEFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFNob3J0aGFuZCBhcnJheSBvZiBwcm9wcyBmb3IgVGFibGVDZWxsLiAqL1xuICBjZWxsczogY3VzdG9tUHJvcFR5cGVzLmNvbGxlY3Rpb25TaG9ydGhhbmQsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSByb3cgY2FuIGJlIGRpc2FibGVkLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgcm93IG1heSBjYWxsIGF0dGVudGlvbiB0byBhbiBlcnJvciBvciBhIG5lZ2F0aXZlIHZhbHVlLiAqL1xuICBlcnJvcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgcm93IG1heSBsZXQgYSB1c2VyIGtub3cgd2hldGhlciBhIHZhbHVlIGlzIGJhZC4gKi9cbiAgbmVnYXRpdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHJvdyBtYXkgbGV0IGEgdXNlciBrbm93IHdoZXRoZXIgYSB2YWx1ZSBpcyBnb29kLiAqL1xuICBwb3NpdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgdGFibGUgcm93IGNhbiBhZGp1c3QgaXRzIHRleHQgYWxpZ25tZW50LiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuVEVYVF9BTElHTk1FTlRTLCAnanVzdGlmaWVkJykpLFxuXG4gIC8qKiBBIHRhYmxlIHJvdyBjYW4gYWRqdXN0IGl0cyB2ZXJ0aWNhbCBhbGlnbm1lbnQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUyksXG5cbiAgLyoqIEEgcm93IG1heSB3YXJuIGEgdXNlci4gKi9cbiAgd2FybmluZzogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcblRhYmxlUm93LmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoVGFibGVSb3csIGZ1bmN0aW9uIChjZWxscykge1xuICByZXR1cm4ge1xuICAgIGNlbGxzOiBjZWxsc1xuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBUYWJsZVJvdzsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9UYWJsZSc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgX2lzTmlsIGZyb20gXCJsb2Rhc2gtZXMvaXNOaWxcIjtcbmltcG9ydCB7IFJlZiB9IGZyb20gJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtcmVmJztcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBjcmVhdGVSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5LCB1c2VWYWx1ZUFuZEtleSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi9JY29uL0ljb24nO1xuaW1wb3J0IExhYmVsIGZyb20gJy4uL0xhYmVsL0xhYmVsJztcbmltcG9ydCBCdXR0b25Db250ZW50IGZyb20gJy4vQnV0dG9uQ29udGVudCc7XG5pbXBvcnQgQnV0dG9uR3JvdXAgZnJvbSAnLi9CdXR0b25Hcm91cCc7XG5pbXBvcnQgQnV0dG9uT3IgZnJvbSAnLi9CdXR0b25Pcic7XG4vKipcbiAqIEEgQnV0dG9uIGluZGljYXRlcyBhIHBvc3NpYmxlIHVzZXIgYWN0aW9uLlxuICogQHNlZSBGb3JtXG4gKiBAc2VlIEljb25cbiAqIEBzZWUgTGFiZWxcbiAqL1xuXG52YXIgQnV0dG9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEJ1dHRvbiwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQnV0dG9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnJlZiA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLmNvbXB1dGVFbGVtZW50VHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGF0dGFjaGVkID0gX3RoaXMkcHJvcHMuYXR0YWNoZWQsXG4gICAgICAgICAgbGFiZWwgPSBfdGhpcyRwcm9wcy5sYWJlbDtcbiAgICAgIGlmICghX2lzTmlsKGF0dGFjaGVkKSB8fCAhX2lzTmlsKGxhYmVsKSkgcmV0dXJuICdkaXYnO1xuICAgIH07XG5cbiAgICBfdGhpcy5jb21wdXRlVGFiSW5kZXggPSBmdW5jdGlvbiAoRWxlbWVudFR5cGUpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMi50YWJJbmRleDtcbiAgICAgIGlmICghX2lzTmlsKHRhYkluZGV4KSkgcmV0dXJuIHRhYkluZGV4O1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm4gLTE7XG4gICAgICBpZiAoRWxlbWVudFR5cGUgPT09ICdkaXYnKSByZXR1cm4gMDtcbiAgICB9O1xuXG4gICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX2ludm9rZShfdGhpcy5yZWYuY3VycmVudCwgJ2ZvY3VzJyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBkaXNhYmxlZCA9IF90aGlzLnByb3BzLmRpc2FibGVkO1xuXG4gICAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYXNJY29uQ2xhc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbGFiZWxQb3NpdGlvbiA9IF90aGlzJHByb3BzMy5sYWJlbFBvc2l0aW9uLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMzLmNoaWxkcmVuLFxuICAgICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wczMuY29udGVudCxcbiAgICAgICAgICBpY29uID0gX3RoaXMkcHJvcHMzLmljb247XG4gICAgICBpZiAoaWNvbiA9PT0gdHJ1ZSkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gaWNvbiAmJiAobGFiZWxQb3NpdGlvbiB8fCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSAmJiBfaXNOaWwoY29udGVudCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQnV0dG9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcHV0ZUJ1dHRvbkFyaWFSb2xlID0gZnVuY3Rpb24gY29tcHV0ZUJ1dHRvbkFyaWFSb2xlKEVsZW1lbnRUeXBlKSB7XG4gICAgdmFyIHJvbGUgPSB0aGlzLnByb3BzLnJvbGU7XG4gICAgaWYgKCFfaXNOaWwocm9sZSkpIHJldHVybiByb2xlO1xuICAgIGlmIChFbGVtZW50VHlwZSAhPT0gJ2J1dHRvbicpIHJldHVybiAnYnV0dG9uJztcbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wczQuYWN0aXZlLFxuICAgICAgICBhbmltYXRlZCA9IF90aGlzJHByb3BzNC5hbmltYXRlZCxcbiAgICAgICAgYXR0YWNoZWQgPSBfdGhpcyRwcm9wczQuYXR0YWNoZWQsXG4gICAgICAgIGJhc2ljID0gX3RoaXMkcHJvcHM0LmJhc2ljLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzNC5jaGlsZHJlbixcbiAgICAgICAgY2lyY3VsYXIgPSBfdGhpcyRwcm9wczQuY2lyY3VsYXIsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNC5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yID0gX3RoaXMkcHJvcHM0LmNvbG9yLFxuICAgICAgICBjb21wYWN0ID0gX3RoaXMkcHJvcHM0LmNvbXBhY3QsXG4gICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wczQuY29udGVudCxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczQuZGlzYWJsZWQsXG4gICAgICAgIGZsb2F0ZWQgPSBfdGhpcyRwcm9wczQuZmxvYXRlZCxcbiAgICAgICAgZmx1aWQgPSBfdGhpcyRwcm9wczQuZmx1aWQsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wczQuaWNvbixcbiAgICAgICAgaW52ZXJ0ZWQgPSBfdGhpcyRwcm9wczQuaW52ZXJ0ZWQsXG4gICAgICAgIGxhYmVsID0gX3RoaXMkcHJvcHM0LmxhYmVsLFxuICAgICAgICBsYWJlbFBvc2l0aW9uID0gX3RoaXMkcHJvcHM0LmxhYmVsUG9zaXRpb24sXG4gICAgICAgIGxvYWRpbmcgPSBfdGhpcyRwcm9wczQubG9hZGluZyxcbiAgICAgICAgbmVnYXRpdmUgPSBfdGhpcyRwcm9wczQubmVnYXRpdmUsXG4gICAgICAgIHBvc2l0aXZlID0gX3RoaXMkcHJvcHM0LnBvc2l0aXZlLFxuICAgICAgICBwcmltYXJ5ID0gX3RoaXMkcHJvcHM0LnByaW1hcnksXG4gICAgICAgIHNlY29uZGFyeSA9IF90aGlzJHByb3BzNC5zZWNvbmRhcnksXG4gICAgICAgIHNpemUgPSBfdGhpcyRwcm9wczQuc2l6ZSxcbiAgICAgICAgdG9nZ2xlID0gX3RoaXMkcHJvcHM0LnRvZ2dsZTtcbiAgICB2YXIgYmFzZUNsYXNzZXMgPSBjeChjb2xvciwgc2l6ZSwgdXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgdXNlS2V5T25seShiYXNpYywgJ2Jhc2ljJyksIHVzZUtleU9ubHkoY2lyY3VsYXIsICdjaXJjdWxhcicpLCB1c2VLZXlPbmx5KGNvbXBhY3QsICdjb21wYWN0JyksIHVzZUtleU9ubHkoZmx1aWQsICdmbHVpZCcpLCB1c2VLZXlPbmx5KHRoaXMuaGFzSWNvbkNsYXNzKCksICdpY29uJyksIHVzZUtleU9ubHkoaW52ZXJ0ZWQsICdpbnZlcnRlZCcpLCB1c2VLZXlPbmx5KGxvYWRpbmcsICdsb2FkaW5nJyksIHVzZUtleU9ubHkobmVnYXRpdmUsICduZWdhdGl2ZScpLCB1c2VLZXlPbmx5KHBvc2l0aXZlLCAncG9zaXRpdmUnKSwgdXNlS2V5T25seShwcmltYXJ5LCAncHJpbWFyeScpLCB1c2VLZXlPbmx5KHNlY29uZGFyeSwgJ3NlY29uZGFyeScpLCB1c2VLZXlPbmx5KHRvZ2dsZSwgJ3RvZ2dsZScpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGFuaW1hdGVkLCAnYW5pbWF0ZWQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShhdHRhY2hlZCwgJ2F0dGFjaGVkJykpO1xuICAgIHZhciBsYWJlbGVkQ2xhc3NlcyA9IGN4KHVzZUtleU9yVmFsdWVBbmRLZXkobGFiZWxQb3NpdGlvbiB8fCAhIWxhYmVsLCAnbGFiZWxlZCcpKTtcbiAgICB2YXIgd3JhcHBlckNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGRpc2FibGVkLCAnZGlzYWJsZWQnKSwgdXNlVmFsdWVBbmRLZXkoZmxvYXRlZCwgJ2Zsb2F0ZWQnKSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhCdXR0b24sIHRoaXMucHJvcHMpO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEJ1dHRvbiwgdGhpcy5wcm9wcywgdGhpcy5jb21wdXRlRWxlbWVudFR5cGUpO1xuICAgIHZhciB0YWJJbmRleCA9IHRoaXMuY29tcHV0ZVRhYkluZGV4KEVsZW1lbnRUeXBlKTtcblxuICAgIGlmICghX2lzTmlsKGxhYmVsKSkge1xuICAgICAgdmFyIGJ1dHRvbkNsYXNzZXMgPSBjeCgndWknLCBiYXNlQ2xhc3NlcywgJ2J1dHRvbicsIGNsYXNzTmFtZSk7XG4gICAgICB2YXIgY29udGFpbmVyQ2xhc3NlcyA9IGN4KCd1aScsIGxhYmVsZWRDbGFzc2VzLCAnYnV0dG9uJywgY2xhc3NOYW1lLCB3cmFwcGVyQ2xhc3Nlcyk7XG4gICAgICB2YXIgbGFiZWxFbGVtZW50ID0gTGFiZWwuY3JlYXRlKGxhYmVsLCB7XG4gICAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICAgIGJhc2ljOiB0cnVlLFxuICAgICAgICAgIHBvaW50aW5nOiBsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgPyAncmlnaHQnIDogJ2xlZnQnXG4gICAgICAgIH0sXG4gICAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNvbnRhaW5lckNsYXNzZXMsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCBsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgJiYgbGFiZWxFbGVtZW50LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWYsIHtcbiAgICAgICAgaW5uZXJSZWY6IHRoaXMucmVmXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYnV0dG9uQ2xhc3NlcyxcbiAgICAgICAgXCJhcmlhLXByZXNzZWRcIjogdG9nZ2xlID8gISFhY3RpdmUgOiB1bmRlZmluZWQsXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4XG4gICAgICB9LCBJY29uLmNyZWF0ZShpY29uLCB7XG4gICAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICAgIH0pLCBcIiBcIiwgY29udGVudCkpLCAobGFiZWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyB8fCAhbGFiZWxQb3NpdGlvbikgJiYgbGFiZWxFbGVtZW50KTtcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIGJhc2VDbGFzc2VzLCB3cmFwcGVyQ2xhc3NlcywgbGFiZWxlZENsYXNzZXMsICdidXR0b24nLCBjbGFzc05hbWUpO1xuICAgIHZhciBoYXNDaGlsZHJlbiA9ICFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKTtcbiAgICB2YXIgcm9sZSA9IHRoaXMuY29tcHV0ZUJ1dHRvbkFyaWFSb2xlKEVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVmLCB7XG4gICAgICBpbm5lclJlZjogdGhpcy5yZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHRvZ2dsZSA/ICEhYWN0aXZlIDogdW5kZWZpbmVkLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkICYmIEVsZW1lbnRUeXBlID09PSAnYnV0dG9uJyB8fCB1bmRlZmluZWQsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgcm9sZTogcm9sZSxcbiAgICAgIHRhYkluZGV4OiB0YWJJbmRleFxuICAgIH0pLCBoYXNDaGlsZHJlbiAmJiBjaGlsZHJlbiwgIWhhc0NoaWxkcmVuICYmIEljb24uY3JlYXRlKGljb24sIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgIWhhc0NoaWxkcmVuICYmIGNvbnRlbnQpKTtcbiAgfTtcblxuICByZXR1cm4gQnV0dG9uO1xufShDb21wb25lbnQpO1xuXG5CdXR0b24uaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYW5pbWF0ZWRcIiwgXCJhc1wiLCBcImF0dGFjaGVkXCIsIFwiYmFzaWNcIiwgXCJjaGlsZHJlblwiLCBcImNpcmN1bGFyXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb21wYWN0XCIsIFwiY29udGVudFwiLCBcImRpc2FibGVkXCIsIFwiZmxvYXRlZFwiLCBcImZsdWlkXCIsIFwiaWNvblwiLCBcImludmVydGVkXCIsIFwibGFiZWxcIiwgXCJsYWJlbFBvc2l0aW9uXCIsIFwibG9hZGluZ1wiLCBcIm5lZ2F0aXZlXCIsIFwib25DbGlja1wiLCBcInBvc2l0aXZlXCIsIFwicHJpbWFyeVwiLCBcInJvbGVcIiwgXCJzZWNvbmRhcnlcIiwgXCJzaXplXCIsIFwidGFiSW5kZXhcIiwgXCJ0b2dnbGVcIl07XG5CdXR0b24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBidXR0b24gY2FuIHNob3cgaXQgaXMgY3VycmVudGx5IHRoZSBhY3RpdmUgdXNlciBzZWxlY3Rpb24uICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgYnV0dG9uIGNhbiBhbmltYXRlIHRvIHNob3cgaGlkZGVuIGNvbnRlbnQuICovXG4gIGFuaW1hdGVkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnZmFkZScsICd2ZXJ0aWNhbCddKV0pLFxuXG4gIC8qKiBBIGJ1dHRvbiBjYW4gYmUgYXR0YWNoZWQgdG8gb3RoZXIgY29udGVudC4gKi9cbiAgYXR0YWNoZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nXSldKSxcblxuICAvKiogQSBiYXNpYyBidXR0b24gaXMgbGVzcyBwcm9ub3VuY2VkLiAqL1xuICBiYXNpYzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbUHJvcFR5cGVzLm5vZGUsIGN1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2xhYmVsJ10pLCBjdXN0b21Qcm9wVHlwZXMuZ2l2ZW5Qcm9wcyh7XG4gICAgaWNvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLCBQcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsIFByb3BUeXBlcy5lbGVtZW50LmlzUmVxdWlyZWRdKVxuICB9LCBjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydpY29uJ10pKV0pLFxuXG4gIC8qKiBBIGJ1dHRvbiBjYW4gYmUgY2lyY3VsYXIuICovXG4gIGNpcmN1bGFyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgYnV0dG9uIGNhbiBoYXZlIGRpZmZlcmVudCBjb2xvcnMgKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihbXS5jb25jYXQoU1VJLkNPTE9SUywgWydmYWNlYm9vaycsICdnb29nbGUgcGx1cycsICdpbnN0YWdyYW0nLCAnbGlua2VkaW4nLCAndHdpdHRlcicsICd2aycsICd5b3V0dWJlJ10pKSxcblxuICAvKiogQSBidXR0b24gY2FuIHJlZHVjZSBpdHMgcGFkZGluZyB0byBmaXQgaW50byB0aWdodGVyIHNwYWNlcy4gKi9cbiAgY29tcGFjdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBidXR0b24gY2FuIHNob3cgaXQgaXMgY3VycmVudGx5IHVuYWJsZSB0byBiZSBpbnRlcmFjdGVkIHdpdGguICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBidXR0b24gY2FuIGJlIGFsaWduZWQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgb2YgaXRzIGNvbnRhaW5lci4gKi9cbiAgZmxvYXRlZDogUHJvcFR5cGVzLm9uZU9mKFNVSS5GTE9BVFMpLFxuXG4gIC8qKiBBIGJ1dHRvbiBjYW4gdGFrZSB0aGUgd2lkdGggb2YgaXRzIGNvbnRhaW5lci4gKi9cbiAgZmx1aWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBZGQgYW4gSWNvbiBieSBuYW1lLCBwcm9wcyBvYmplY3QsIG9yIHBhc3MgYW4gPEljb24gLz4uICovXG4gIGljb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuZWxlbWVudF0pLFxuXG4gIC8qKiBBIGJ1dHRvbiBjYW4gYmUgZm9ybWF0dGVkIHRvIGFwcGVhciBvbiBkYXJrIGJhY2tncm91bmRzLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFkZCBhIExhYmVsIGJ5IHRleHQsIHByb3BzIG9iamVjdCwgb3IgcGFzcyBhIDxMYWJlbCAvPi4gKi9cbiAgbGFiZWw6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5lbGVtZW50XSksXG5cbiAgLyoqIEEgbGFiZWxlZCBidXR0b24gY2FuIGZvcm1hdCBhIExhYmVsIG9yIEljb24gdG8gYXBwZWFyIG9uIHRoZSBsZWZ0IG9yIHJpZ2h0LiAqL1xuICBsYWJlbFBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YoWydyaWdodCcsICdsZWZ0J10pLFxuXG4gIC8qKiBBIGJ1dHRvbiBjYW4gc2hvdyBhIGxvYWRpbmcgaW5kaWNhdG9yLiAqL1xuICBsb2FkaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBidXR0b24gY2FuIGhpbnQgdG93YXJkcyBhIG5lZ2F0aXZlIGNvbnNlcXVlbmNlLiAqL1xuICBuZWdhdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciB1c2VyJ3MgY2xpY2suXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogQSBidXR0b24gY2FuIGhpbnQgdG93YXJkcyBhIHBvc2l0aXZlIGNvbnNlcXVlbmNlLiAqL1xuICBwb3NpdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgYnV0dG9uIGNhbiBiZSBmb3JtYXR0ZWQgdG8gc2hvdyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGVtcGhhc2lzLiAqL1xuICBwcmltYXJ5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogVGhlIHJvbGUgb2YgdGhlIEhUTUwgZWxlbWVudC4gKi9cbiAgcm9sZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBidXR0b24gY2FuIGJlIGZvcm1hdHRlZCB0byBzaG93IGRpZmZlcmVudCBsZXZlbHMgb2YgZW1waGFzaXMuICovXG4gIHNlY29uZGFyeTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgYnV0dG9uIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFNVSS5TSVpFUyksXG5cbiAgLyoqIEEgYnV0dG9uIGNhbiByZWNlaXZlIGZvY3VzLiAqL1xuICB0YWJJbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBBIGJ1dHRvbiBjYW4gYmUgZm9ybWF0dGVkIHRvIHRvZ2dsZSBvbiBhbmQgb2ZmLiAqL1xuICB0b2dnbGU6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5CdXR0b24uZGVmYXVsdFByb3BzID0ge1xuICBhczogJ2J1dHRvbidcbn07XG5CdXR0b24uQ29udGVudCA9IEJ1dHRvbkNvbnRlbnQ7XG5CdXR0b24uR3JvdXAgPSBCdXR0b25Hcm91cDtcbkJ1dHRvbi5PciA9IEJ1dHRvbk9yO1xuQnV0dG9uLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoQnV0dG9uLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiB2YWx1ZVxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBCdXR0b247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogVXNlZCBpbiBzb21lIEJ1dHRvbiB0eXBlcywgc3VjaCBhcyBgYW5pbWF0ZWRgLlxuICovXG5cbmZ1bmN0aW9uIEJ1dHRvbkNvbnRlbnQocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGhpZGRlbiA9IHByb3BzLmhpZGRlbixcbiAgICAgIHZpc2libGUgPSBwcm9wcy52aXNpYmxlO1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkodmlzaWJsZSwgJ3Zpc2libGUnKSwgdXNlS2V5T25seShoaWRkZW4sICdoaWRkZW4nKSwgJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEJ1dHRvbkNvbnRlbnQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQnV0dG9uQ29udGVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkJ1dHRvbkNvbnRlbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJoaWRkZW5cIiwgXCJ2aXNpYmxlXCJdO1xuQnV0dG9uQ29udGVudC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogSW5pdGlhbGx5IGhpZGRlbiwgdmlzaWJsZSBvbiBob3Zlci4gKi9cbiAgaGlkZGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogSW5pdGlhbGx5IHZpc2libGUsIGhpZGRlbiBvbiBob3Zlci4gKi9cbiAgdmlzaWJsZTogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbkNvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZUtleU9yVmFsdWVBbmRLZXksIHVzZVZhbHVlQW5kS2V5LCB1c2VXaWR0aFByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEJ1dHRvbiBmcm9tICcuL0J1dHRvbic7XG4vKipcbiAqIEJ1dHRvbnMgY2FuIGJlIGdyb3VwZWQuXG4gKi9cblxuZnVuY3Rpb24gQnV0dG9uR3JvdXAocHJvcHMpIHtcbiAgdmFyIGF0dGFjaGVkID0gcHJvcHMuYXR0YWNoZWQsXG4gICAgICBiYXNpYyA9IHByb3BzLmJhc2ljLFxuICAgICAgYnV0dG9ucyA9IHByb3BzLmJ1dHRvbnMsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbXBhY3QgPSBwcm9wcy5jb21wYWN0LFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBmbG9hdGVkID0gcHJvcHMuZmxvYXRlZCxcbiAgICAgIGZsdWlkID0gcHJvcHMuZmx1aWQsXG4gICAgICBpY29uID0gcHJvcHMuaWNvbixcbiAgICAgIGludmVydGVkID0gcHJvcHMuaW52ZXJ0ZWQsXG4gICAgICBsYWJlbGVkID0gcHJvcHMubGFiZWxlZCxcbiAgICAgIG5lZ2F0aXZlID0gcHJvcHMubmVnYXRpdmUsXG4gICAgICBwb3NpdGl2ZSA9IHByb3BzLnBvc2l0aXZlLFxuICAgICAgcHJpbWFyeSA9IHByb3BzLnByaW1hcnksXG4gICAgICBzZWNvbmRhcnkgPSBwcm9wcy5zZWNvbmRhcnksXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHRvZ2dsZSA9IHByb3BzLnRvZ2dsZSxcbiAgICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWwsXG4gICAgICB3aWR0aHMgPSBwcm9wcy53aWR0aHM7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgY29sb3IsIHNpemUsIHVzZUtleU9ubHkoYmFzaWMsICdiYXNpYycpLCB1c2VLZXlPbmx5KGNvbXBhY3QsICdjb21wYWN0JyksIHVzZUtleU9ubHkoZmx1aWQsICdmbHVpZCcpLCB1c2VLZXlPbmx5KGljb24sICdpY29uJyksIHVzZUtleU9ubHkoaW52ZXJ0ZWQsICdpbnZlcnRlZCcpLCB1c2VLZXlPbmx5KGxhYmVsZWQsICdsYWJlbGVkJyksIHVzZUtleU9ubHkobmVnYXRpdmUsICduZWdhdGl2ZScpLCB1c2VLZXlPbmx5KHBvc2l0aXZlLCAncG9zaXRpdmUnKSwgdXNlS2V5T25seShwcmltYXJ5LCAncHJpbWFyeScpLCB1c2VLZXlPbmx5KHNlY29uZGFyeSwgJ3NlY29uZGFyeScpLCB1c2VLZXlPbmx5KHRvZ2dsZSwgJ3RvZ2dsZScpLCB1c2VLZXlPbmx5KHZlcnRpY2FsLCAndmVydGljYWwnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShhdHRhY2hlZCwgJ2F0dGFjaGVkJyksIHVzZVZhbHVlQW5kS2V5KGZsb2F0ZWQsICdmbG9hdGVkJyksIHVzZVdpZHRoUHJvcCh3aWR0aHMpLCAnYnV0dG9ucycsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoQnV0dG9uR3JvdXAsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQnV0dG9uR3JvdXAsIHByb3BzKTtcblxuICBpZiAoX2lzTmlsKGJ1dHRvbnMpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIF9tYXAoYnV0dG9ucywgZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgIHJldHVybiBCdXR0b24uY3JlYXRlKGJ1dHRvbik7XG4gIH0pKTtcbn1cblxuQnV0dG9uR3JvdXAuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJhdHRhY2hlZFwiLCBcImJhc2ljXCIsIFwiYnV0dG9uc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb21wYWN0XCIsIFwiY29udGVudFwiLCBcImZsb2F0ZWRcIiwgXCJmbHVpZFwiLCBcImljb25cIiwgXCJpbnZlcnRlZFwiLCBcImxhYmVsZWRcIiwgXCJuZWdhdGl2ZVwiLCBcInBvc2l0aXZlXCIsIFwicHJpbWFyeVwiLCBcInNlY29uZGFyeVwiLCBcInNpemVcIiwgXCJ0b2dnbGVcIiwgXCJ2ZXJ0aWNhbFwiLCBcIndpZHRoc1wiXTtcbkJ1dHRvbkdyb3VwLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEdyb3VwcyBjYW4gYmUgYXR0YWNoZWQgdG8gb3RoZXIgY29udGVudC4gKi9cbiAgYXR0YWNoZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nXSldKSxcblxuICAvKiogR3JvdXBzIGNhbiBiZSBsZXNzIHByb25vdW5jZWQuICovXG4gIGJhc2ljOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQXJyYXkgb2Ygc2hvcnRoYW5kIEJ1dHRvbiB2YWx1ZXMuICovXG4gIGJ1dHRvbnM6IGN1c3RvbVByb3BUeXBlcy5jb2xsZWN0aW9uU2hvcnRoYW5kLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEdyb3VwcyBjYW4gaGF2ZSBhIHNoYXJlZCBjb2xvci4gKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihTVUkuQ09MT1JTKSxcblxuICAvKiogR3JvdXBzIGNhbiByZWR1Y2UgdGhlaXIgcGFkZGluZyB0byBmaXQgaW50byB0aWdodGVyIHNwYWNlcy4gKi9cbiAgY29tcGFjdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogR3JvdXBzIGNhbiBiZSBhbGlnbmVkIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IG9mIGl0cyBjb250YWluZXIuICovXG4gIGZsb2F0ZWQ6IFByb3BUeXBlcy5vbmVPZihTVUkuRkxPQVRTKSxcblxuICAvKiogR3JvdXBzIGNhbiB0YWtlIHRoZSB3aWR0aCBvZiB0aGVpciBjb250YWluZXIuICovXG4gIGZsdWlkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogR3JvdXBzIGNhbiBiZSBmb3JtYXR0ZWQgYXMgaWNvbnMuICovXG4gIGljb246IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBHcm91cHMgY2FuIGJlIGZvcm1hdHRlZCB0byBhcHBlYXIgb24gZGFyayBiYWNrZ3JvdW5kcy4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBHcm91cHMgY2FuIGJlIGZvcm1hdHRlZCBhcyBsYWJlbGVkIGljb24gYnV0dG9ucy4gKi9cbiAgbGFiZWxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEdyb3VwcyBjYW4gaGludCB0b3dhcmRzIGEgbmVnYXRpdmUgY29uc2VxdWVuY2UuICovXG4gIG5lZ2F0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogR3JvdXBzIGNhbiBoaW50IHRvd2FyZHMgYSBwb3NpdGl2ZSBjb25zZXF1ZW5jZS4gKi9cbiAgcG9zaXRpdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBHcm91cHMgY2FuIGJlIGZvcm1hdHRlZCB0byBzaG93IGRpZmZlcmVudCBsZXZlbHMgb2YgZW1waGFzaXMuICovXG4gIHByaW1hcnk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBHcm91cHMgY2FuIGJlIGZvcm1hdHRlZCB0byBzaG93IGRpZmZlcmVudCBsZXZlbHMgb2YgZW1waGFzaXMuICovXG4gIHNlY29uZGFyeTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEdyb3VwcyBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihTVUkuU0laRVMpLFxuXG4gIC8qKiBHcm91cHMgY2FuIGJlIGZvcm1hdHRlZCB0byB0b2dnbGUgb24gYW5kIG9mZi4gKi9cbiAgdG9nZ2xlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogR3JvdXBzIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYXBwZWFyIHZlcnRpY2FsbHkuICovXG4gIHZlcnRpY2FsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogR3JvdXBzIGNhbiBoYXZlIHRoZWlyIHdpZHRocyBkaXZpZGVkIGV2ZW5seS4gKi9cbiAgd2lkdGhzOiBQcm9wVHlwZXMub25lT2YoU1VJLldJRFRIUylcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEJ1dHRvbkdyb3VwOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBCdXR0b24gZ3JvdXBzIGNhbiBjb250YWluIGNvbmRpdGlvbmFscy5cbiAqL1xuXG5mdW5jdGlvbiBCdXR0b25Pcihwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgdGV4dCA9IHByb3BzLnRleHQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ29yJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhCdXR0b25PciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShCdXR0b25PciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIFwiZGF0YS10ZXh0XCI6IHRleHRcbiAgfSkpO1xufVxuXG5CdXR0b25Pci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNsYXNzTmFtZVwiLCBcInRleHRcIl07XG5CdXR0b25Pci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogT3IgYnV0dG9ucyBjYW4gaGF2ZSB0aGVpciB0ZXh0IGxvY2FsaXplZCwgb3IgYWRqdXN0ZWQgYnkgdXNpbmcgdGhlIHRleHQgcHJvcC4gKi9cbiAgdGV4dDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBCdXR0b25PcjsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9CdXR0b24nO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VUZXh0QWxpZ25Qcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBjb250YWluZXIgbGltaXRzIGNvbnRlbnQgdG8gYSBtYXhpbXVtIHdpZHRoLlxuICovXG5cbmZ1bmN0aW9uIENvbnRhaW5lcihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZmx1aWQgPSBwcm9wcy5mbHVpZCxcbiAgICAgIHRleHQgPSBwcm9wcy50ZXh0LFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHVzZUtleU9ubHkodGV4dCwgJ3RleHQnKSwgdXNlS2V5T25seShmbHVpZCwgJ2ZsdWlkJyksIHVzZVRleHRBbGlnblByb3AodGV4dEFsaWduKSwgJ2NvbnRhaW5lcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoQ29udGFpbmVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKENvbnRhaW5lciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkNvbnRhaW5lci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImZsdWlkXCIsIFwidGV4dFwiLCBcInRleHRBbGlnblwiXTtcbkNvbnRhaW5lci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQ29udGFpbmVyIGhhcyBubyBtYXhpbXVtIHdpZHRoLiAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFJlZHVjZSBtYXhpbXVtIHdpZHRoIHRvIG1vcmUgbmF0dXJhbGx5IGFjY29tbW9kYXRlIHRleHQuICovXG4gIHRleHQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBbGlnbiBjb250YWluZXIgdGV4dC4gKi9cbiAgdGV4dEFsaWduOiBQcm9wVHlwZXMub25lT2YoU1VJLlRFWFRfQUxJR05NRU5UUylcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENvbnRhaW5lcjsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9Db250YWluZXInO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgZGl2aWRlciB2aXN1YWxseSBzZWdtZW50cyBjb250ZW50IGludG8gZ3JvdXBzLlxuICovXG5cbmZ1bmN0aW9uIERpdmlkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGVhcmluZyA9IHByb3BzLmNsZWFyaW5nLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBmaXR0ZWQgPSBwcm9wcy5maXR0ZWQsXG4gICAgICBoaWRkZW4gPSBwcm9wcy5oaWRkZW4sXG4gICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIGludmVydGVkID0gcHJvcHMuaW52ZXJ0ZWQsXG4gICAgICBzZWN0aW9uID0gcHJvcHMuc2VjdGlvbixcbiAgICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWw7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShjbGVhcmluZywgJ2NsZWFyaW5nJyksIHVzZUtleU9ubHkoZml0dGVkLCAnZml0dGVkJyksIHVzZUtleU9ubHkoaGlkZGVuLCAnaGlkZGVuJyksIHVzZUtleU9ubHkoaG9yaXpvbnRhbCwgJ2hvcml6b250YWwnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkoc2VjdGlvbiwgJ3NlY3Rpb24nKSwgdXNlS2V5T25seSh2ZXJ0aWNhbCwgJ3ZlcnRpY2FsJyksICdkaXZpZGVyJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhEaXZpZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKERpdmlkZXIsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5EaXZpZGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjbGVhcmluZ1wiLCBcImNvbnRlbnRcIiwgXCJmaXR0ZWRcIiwgXCJoaWRkZW5cIiwgXCJob3Jpem9udGFsXCIsIFwiaW52ZXJ0ZWRcIiwgXCJzZWN0aW9uXCIsIFwidmVydGljYWxcIl07XG5EaXZpZGVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogRGl2aWRlciBjYW4gY2xlYXIgdGhlIGNvbnRlbnQgYWJvdmUgaXQuICovXG4gIGNsZWFyaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBEaXZpZGVyIGNhbiBiZSBmaXR0ZWQgd2l0aG91dCBhbnkgc3BhY2UgYWJvdmUgb3IgYmVsb3cgaXQuICovXG4gIGZpdHRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIERpdmlkZXIgY2FuIGRpdmlkZSBjb250ZW50IHdpdGhvdXQgY3JlYXRpbmcgYSBkaXZpZGluZyBsaW5lLiAqL1xuICBoaWRkZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBEaXZpZGVyIGNhbiBzZWdtZW50IGNvbnRlbnQgaG9yaXpvbnRhbGx5LiAqL1xuICBob3Jpem9udGFsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRGl2aWRlciBjYW4gaGF2ZSBpdHMgY29sb3VycyBpbnZlcnRlZC4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBEaXZpZGVyIGNhbiBwcm92aWRlIGdyZWF0ZXIgbWFyZ2lucyB0byBkaXZpZGUgc2VjdGlvbnMgb2YgY29udGVudC4gKi9cbiAgc2VjdGlvbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIERpdmlkZXIgY2FuIHNlZ21lbnQgY29udGVudCB2ZXJ0aWNhbGx5LiAqL1xuICB2ZXJ0aWNhbDogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IERpdmlkZXI7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vRGl2aWRlcic7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmV4cG9ydCB2YXIgbmFtZXMgPSBbJ2FkJywgJ2FuZG9ycmEnLCAnYWUnLCAndW5pdGVkIGFyYWIgZW1pcmF0ZXMnLCAndWFlJywgJ2FmJywgJ2FmZ2hhbmlzdGFuJywgJ2FnJywgJ2FudGlndWEnLCAnYWknLCAnYW5ndWlsbGEnLCAnYWwnLCAnYWxiYW5pYScsICdhbScsICdhcm1lbmlhJywgJ2FuJywgJ25ldGhlcmxhbmRzIGFudGlsbGVzJywgJ2FvJywgJ2FuZ29sYScsICdhcicsICdhcmdlbnRpbmEnLCAnYXMnLCAnYW1lcmljYW4gc2Ftb2EnLCAnYXQnLCAnYXVzdHJpYScsICdhdScsICdhdXN0cmFsaWEnLCAnYXcnLCAnYXJ1YmEnLCAnYXgnLCAnYWxhbmQgaXNsYW5kcycsICdheicsICdhemVyYmFpamFuJywgJ2JhJywgJ2Jvc25pYScsICdiYicsICdiYXJiYWRvcycsICdiZCcsICdiYW5nbGFkZXNoJywgJ2JlJywgJ2JlbGdpdW0nLCAnYmYnLCAnYnVya2luYSBmYXNvJywgJ2JnJywgJ2J1bGdhcmlhJywgJ2JoJywgJ2JhaHJhaW4nLCAnYmknLCAnYnVydW5kaScsICdiaicsICdiZW5pbicsICdibScsICdiZXJtdWRhJywgJ2JuJywgJ2JydW5laScsICdibycsICdib2xpdmlhJywgJ2JyJywgJ2JyYXppbCcsICdicycsICdiYWhhbWFzJywgJ2J0JywgJ2JodXRhbicsICdidicsICdib3V2ZXQgaXNsYW5kJywgJ2J3JywgJ2JvdHN3YW5hJywgJ2J5JywgJ2JlbGFydXMnLCAnYnonLCAnYmVsaXplJywgJ2NhJywgJ2NhbmFkYScsICdjYycsICdjb2NvcyBpc2xhbmRzJywgJ2NkJywgJ2NvbmdvJywgJ2NmJywgJ2NlbnRyYWwgYWZyaWNhbiByZXB1YmxpYycsICdjZycsICdjb25nbyBicmF6emF2aWxsZScsICdjaCcsICdzd2l0emVybGFuZCcsICdjaScsICdjb3RlIGRpdm9pcmUnLCAnY2snLCAnY29vayBpc2xhbmRzJywgJ2NsJywgJ2NoaWxlJywgJ2NtJywgJ2NhbWVyb29uJywgJ2NuJywgJ2NoaW5hJywgJ2NvJywgJ2NvbG9tYmlhJywgJ2NyJywgJ2Nvc3RhIHJpY2EnLCAnY3MnLCAnY3UnLCAnY3ViYScsICdjdicsICdjYXBlIHZlcmRlJywgJ2N4JywgJ2NocmlzdG1hcyBpc2xhbmQnLCAnY3knLCAnY3lwcnVzJywgJ2N6JywgJ2N6ZWNoIHJlcHVibGljJywgJ2RlJywgJ2dlcm1hbnknLCAnZGonLCAnZGppYm91dGknLCAnZGsnLCAnZGVubWFyaycsICdkbScsICdkb21pbmljYScsICdkbycsICdkb21pbmljYW4gcmVwdWJsaWMnLCAnZHonLCAnYWxnZXJpYScsICdlYycsICdlY3VhZG9yJywgJ2VuZ2xhbmQnLCAnZ2IgZW5nJywgJ2VlJywgJ2VzdG9uaWEnLCAnZWcnLCAnZWd5cHQnLCAnZWgnLCAnd2VzdGVybiBzYWhhcmEnLCAnZXInLCAnZXJpdHJlYScsICdlcycsICdzcGFpbicsICdldCcsICdldGhpb3BpYScsICdldScsICdldXJvcGVhbiB1bmlvbicsICdmaScsICdmaW5sYW5kJywgJ2ZqJywgJ2ZpamknLCAnZmsnLCAnZmFsa2xhbmQgaXNsYW5kcycsICdmbScsICdtaWNyb25lc2lhJywgJ2ZvJywgJ2Zhcm9lIGlzbGFuZHMnLCAnZnInLCAnZnJhbmNlJywgJ2dhJywgJ2dhYm9uJywgJ2diJywgJ3VrJywgJ3VuaXRlZCBraW5nZG9tJywgJ2dkJywgJ2dyZW5hZGEnLCAnZ2UnLCAnZ2VvcmdpYScsICdnZicsICdmcmVuY2ggZ3VpYW5hJywgJ2doJywgJ2doYW5hJywgJ2dpJywgJ2dpYnJhbHRhcicsICdnbCcsICdncmVlbmxhbmQnLCAnZ20nLCAnZ2FtYmlhJywgJ2duJywgJ2d1aW5lYScsICdncCcsICdndWFkZWxvdXBlJywgJ2dxJywgJ2VxdWF0b3JpYWwgZ3VpbmVhJywgJ2dyJywgJ2dyZWVjZScsICdncycsICdzYW5kd2ljaCBpc2xhbmRzJywgJ2d0JywgJ2d1YXRlbWFsYScsICdndScsICdndWFtJywgJ2d3JywgJ2d1aW5lYS1iaXNzYXUnLCAnZ3knLCAnZ3V5YW5hJywgJ2hrJywgJ2hvbmcga29uZycsICdobScsICdoZWFyZCBpc2xhbmQnLCAnaG4nLCAnaG9uZHVyYXMnLCAnaHInLCAnY3JvYXRpYScsICdodCcsICdoYWl0aScsICdodScsICdodW5nYXJ5JywgJ2lkJywgJ2luZG9uZXNpYScsICdpZScsICdpcmVsYW5kJywgJ2lsJywgJ2lzcmFlbCcsICdpbicsICdpbmRpYScsICdpbycsICdpbmRpYW4gb2NlYW4gdGVycml0b3J5JywgJ2lxJywgJ2lyYXEnLCAnaXInLCAnaXJhbicsICdpcycsICdpY2VsYW5kJywgJ2l0JywgJ2l0YWx5JywgJ2ptJywgJ2phbWFpY2EnLCAnam8nLCAnam9yZGFuJywgJ2pwJywgJ2phcGFuJywgJ2tlJywgJ2tlbnlhJywgJ2tnJywgJ2t5cmd5enN0YW4nLCAna2gnLCAnY2FtYm9kaWEnLCAna2knLCAna2lyaWJhdGknLCAna20nLCAnY29tb3JvcycsICdrbicsICdzYWludCBraXR0cyBhbmQgbmV2aXMnLCAna3AnLCAnbm9ydGgga29yZWEnLCAna3InLCAnc291dGgga29yZWEnLCAna3cnLCAna3V3YWl0JywgJ2t5JywgJ2NheW1hbiBpc2xhbmRzJywgJ2t6JywgJ2themFraHN0YW4nLCAnbGEnLCAnbGFvcycsICdsYicsICdsZWJhbm9uJywgJ2xjJywgJ3NhaW50IGx1Y2lhJywgJ2xpJywgJ2xpZWNodGVuc3RlaW4nLCAnbGsnLCAnc3JpIGxhbmthJywgJ2xyJywgJ2xpYmVyaWEnLCAnbHMnLCAnbGVzb3RobycsICdsdCcsICdsaXRodWFuaWEnLCAnbHUnLCAnbHV4ZW1ib3VyZycsICdsdicsICdsYXR2aWEnLCAnbHknLCAnbGlieWEnLCAnbWEnLCAnbW9yb2NjbycsICdtYycsICdtb25hY28nLCAnbWQnLCAnbW9sZG92YScsICdtZScsICdtb250ZW5lZ3JvJywgJ21nJywgJ21hZGFnYXNjYXInLCAnbWgnLCAnbWFyc2hhbGwgaXNsYW5kcycsICdtaycsICdtYWNlZG9uaWEnLCAnbWwnLCAnbWFsaScsICdtbScsICdteWFubWFyJywgJ2J1cm1hJywgJ21uJywgJ21vbmdvbGlhJywgJ21vJywgJ21hY2F1JywgJ21wJywgJ25vcnRoZXJuIG1hcmlhbmEgaXNsYW5kcycsICdtcScsICdtYXJ0aW5pcXVlJywgJ21yJywgJ21hdXJpdGFuaWEnLCAnbXMnLCAnbW9udHNlcnJhdCcsICdtdCcsICdtYWx0YScsICdtdScsICdtYXVyaXRpdXMnLCAnbXYnLCAnbWFsZGl2ZXMnLCAnbXcnLCAnbWFsYXdpJywgJ214JywgJ21leGljbycsICdteScsICdtYWxheXNpYScsICdteicsICdtb3phbWJpcXVlJywgJ25hJywgJ25hbWliaWEnLCAnbmMnLCAnbmV3IGNhbGVkb25pYScsICduZScsICduaWdlcicsICduZicsICdub3Jmb2xrIGlzbGFuZCcsICduZycsICduaWdlcmlhJywgJ25pJywgJ25pY2FyYWd1YScsICdubCcsICduZXRoZXJsYW5kcycsICdubycsICdub3J3YXknLCAnbnAnLCAnbmVwYWwnLCAnbnInLCAnbmF1cnUnLCAnbnUnLCAnbml1ZScsICdueicsICduZXcgemVhbGFuZCcsICdvbScsICdvbWFuJywgJ3BhJywgJ3BhbmFtYScsICdwZScsICdwZXJ1JywgJ3BmJywgJ2ZyZW5jaCBwb2x5bmVzaWEnLCAncGcnLCAnbmV3IGd1aW5lYScsICdwaCcsICdwaGlsaXBwaW5lcycsICdwaycsICdwYWtpc3RhbicsICdwbCcsICdwb2xhbmQnLCAncG0nLCAnc2FpbnQgcGllcnJlJywgJ3BuJywgJ3BpdGNhaXJuIGlzbGFuZHMnLCAncHInLCAncHVlcnRvIHJpY28nLCAncHMnLCAncGFsZXN0aW5lJywgJ3B0JywgJ3BvcnR1Z2FsJywgJ3B3JywgJ3BhbGF1JywgJ3B5JywgJ3BhcmFndWF5JywgJ3FhJywgJ3FhdGFyJywgJ3JlJywgJ3JldW5pb24nLCAncm8nLCAncm9tYW5pYScsICdycycsICdzZXJiaWEnLCAncnUnLCAncnVzc2lhJywgJ3J3JywgJ3J3YW5kYScsICdzYScsICdzYXVkaSBhcmFiaWEnLCAnc2InLCAnc29sb21vbiBpc2xhbmRzJywgJ3NjJywgJ3NleWNoZWxsZXMnLCAnZ2Igc2N0JywgJ3Njb3RsYW5kJywgJ3NkJywgJ3N1ZGFuJywgJ3NlJywgJ3N3ZWRlbicsICdzZycsICdzaW5nYXBvcmUnLCAnc2gnLCAnc2FpbnQgaGVsZW5hJywgJ3NpJywgJ3Nsb3ZlbmlhJywgJ3NqJywgJ3N2YWxiYXJkJywgJ2phbiBtYXllbicsICdzaycsICdzbG92YWtpYScsICdzbCcsICdzaWVycmEgbGVvbmUnLCAnc20nLCAnc2FuIG1hcmlubycsICdzbicsICdzZW5lZ2FsJywgJ3NvJywgJ3NvbWFsaWEnLCAnc3InLCAnc3VyaW5hbWUnLCAnc3QnLCAnc2FvIHRvbWUnLCAnc3YnLCAnZWwgc2FsdmFkb3InLCAnc3knLCAnc3lyaWEnLCAnc3onLCAnc3dhemlsYW5kJywgJ3RjJywgJ2NhaWNvcyBpc2xhbmRzJywgJ3RkJywgJ2NoYWQnLCAndGYnLCAnZnJlbmNoIHRlcnJpdG9yaWVzJywgJ3RnJywgJ3RvZ28nLCAndGgnLCAndGhhaWxhbmQnLCAndGonLCAndGFqaWtpc3RhbicsICd0aycsICd0b2tlbGF1JywgJ3RsJywgJ3RpbW9ybGVzdGUnLCAndG0nLCAndHVya21lbmlzdGFuJywgJ3RuJywgJ3R1bmlzaWEnLCAndG8nLCAndG9uZ2EnLCAndHInLCAndHVya2V5JywgJ3R0JywgJ3RyaW5pZGFkJywgJ3R2JywgJ3R1dmFsdScsICd0dycsICd0YWl3YW4nLCAndHonLCAndGFuemFuaWEnLCAndWEnLCAndWtyYWluZScsICd1ZycsICd1Z2FuZGEnLCAndW0nLCAndXMgbWlub3IgaXNsYW5kcycsICd1cycsICdhbWVyaWNhJywgJ3VuaXRlZCBzdGF0ZXMnLCAndXknLCAndXJ1Z3VheScsICd1eicsICd1emJla2lzdGFuJywgJ3ZhJywgJ3ZhdGljYW4gY2l0eScsICd2YycsICdzYWludCB2aW5jZW50JywgJ3ZlJywgJ3ZlbmV6dWVsYScsICd2ZycsICdicml0aXNoIHZpcmdpbiBpc2xhbmRzJywgJ3ZpJywgJ3VzIHZpcmdpbiBpc2xhbmRzJywgJ3ZuJywgJ3ZpZXRuYW0nLCAndnUnLCAndmFudWF0dScsICdnYiB3bHMnLCAnd2FsZXMnLCAnd2YnLCAnd2FsbGlzIGFuZCBmdXR1bmEnLCAnd3MnLCAnc2Ftb2EnLCAneWUnLCAneWVtZW4nLCAneXQnLCAnbWF5b3R0ZScsICd6YScsICdzb3V0aCBhZnJpY2EnLCAnem0nLCAnemFtYmlhJywgJ3p3JywgJ3ppbWJhYndlJ107XG4vKipcbiAqIEEgZmxhZyBpcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHBvbGl0aWNhbCBzdGF0ZS5cbiAqL1xuXG52YXIgRmxhZyA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX1B1cmVDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRmxhZywgX1B1cmVDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZsYWcoKSB7XG4gICAgcmV0dXJuIF9QdXJlQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBGbGFnLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgbmFtZSA9IF90aGlzJHByb3BzLm5hbWU7XG4gICAgdmFyIGNsYXNzZXMgPSBjeChuYW1lLCAnZmxhZycsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhGbGFnLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShGbGFnLCB0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEZsYWc7XG59KFB1cmVDb21wb25lbnQpO1xuXG5GbGFnLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2xhc3NOYW1lXCIsIFwibmFtZVwiXTtcbkZsYWcucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEZsYWcgbmFtZSwgY2FuIHVzZSB0aGUgdHdvIGRpZ2l0IGNvdW50cnkgY29kZSwgdGhlIGZ1bGwgbmFtZSwgb3IgYSBjb21tb24gYWxpYXMuICovXG4gIG5hbWU6IGN1c3RvbVByb3BUeXBlcy5zdWdnZXN0KG5hbWVzKVxufSA6IHt9O1xuRmxhZy5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAnaSdcbn07XG5GbGFnLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoRmxhZywgZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogdmFsdWVcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgRmxhZzsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9GbGFnJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlVmFsdWVBbmRLZXksIHVzZVRleHRBbGlnblByb3AsIHVzZUtleU9yVmFsdWVBbmRLZXksIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vSWNvbic7XG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi4vSW1hZ2UnO1xuaW1wb3J0IEhlYWRlclN1YmhlYWRlciBmcm9tICcuL0hlYWRlclN1YmhlYWRlcic7XG5pbXBvcnQgSGVhZGVyQ29udGVudCBmcm9tICcuL0hlYWRlckNvbnRlbnQnO1xuLyoqXG4gKiBBIGhlYWRlciBwcm92aWRlcyBhIHNob3J0IHN1bW1hcnkgb2YgY29udGVudFxuICovXG5cbmZ1bmN0aW9uIEhlYWRlcihwcm9wcykge1xuICB2YXIgYXR0YWNoZWQgPSBwcm9wcy5hdHRhY2hlZCxcbiAgICAgIGJsb2NrID0gcHJvcHMuYmxvY2ssXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZCxcbiAgICAgIGRpdmlkaW5nID0gcHJvcHMuZGl2aWRpbmcsXG4gICAgICBmbG9hdGVkID0gcHJvcHMuZmxvYXRlZCxcbiAgICAgIGljb24gPSBwcm9wcy5pY29uLFxuICAgICAgaW1hZ2UgPSBwcm9wcy5pbWFnZSxcbiAgICAgIGludmVydGVkID0gcHJvcHMuaW52ZXJ0ZWQsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHN1YiA9IHByb3BzLnN1YixcbiAgICAgIHN1YmhlYWRlciA9IHByb3BzLnN1YmhlYWRlcixcbiAgICAgIHRleHRBbGlnbiA9IHByb3BzLnRleHRBbGlnbjtcbiAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBjb2xvciwgc2l6ZSwgdXNlS2V5T25seShibG9jaywgJ2Jsb2NrJyksIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGRpdmlkaW5nLCAnZGl2aWRpbmcnKSwgdXNlVmFsdWVBbmRLZXkoZmxvYXRlZCwgJ2Zsb2F0ZWQnKSwgdXNlS2V5T25seShpY29uID09PSB0cnVlLCAnaWNvbicpLCB1c2VLZXlPbmx5KGltYWdlID09PSB0cnVlLCAnaW1hZ2UnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkoc3ViLCAnc3ViJyksIHVzZUtleU9yVmFsdWVBbmRLZXkoYXR0YWNoZWQsICdhdHRhY2hlZCcpLCB1c2VUZXh0QWxpZ25Qcm9wKHRleHRBbGlnbiksICdoZWFkZXInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEhlYWRlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShIZWFkZXIsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIHZhciBpY29uRWxlbWVudCA9IEljb24uY3JlYXRlKGljb24sIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pO1xuICB2YXIgaW1hZ2VFbGVtZW50ID0gSW1hZ2UuY3JlYXRlKGltYWdlLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KTtcbiAgdmFyIHN1YmhlYWRlckVsZW1lbnQgPSBIZWFkZXJTdWJoZWFkZXIuY3JlYXRlKHN1YmhlYWRlciwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSk7XG5cbiAgaWYgKGljb25FbGVtZW50IHx8IGltYWdlRWxlbWVudCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBpY29uRWxlbWVudCB8fCBpbWFnZUVsZW1lbnQsIChjb250ZW50IHx8IHN1YmhlYWRlckVsZW1lbnQpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhlYWRlckNvbnRlbnQsIG51bGwsIGNvbnRlbnQsIHN1YmhlYWRlckVsZW1lbnQpKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNvbnRlbnQsIHN1YmhlYWRlckVsZW1lbnQpO1xufVxuXG5IZWFkZXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJhdHRhY2hlZFwiLCBcImJsb2NrXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbnRlbnRcIiwgXCJkaXNhYmxlZFwiLCBcImRpdmlkaW5nXCIsIFwiZmxvYXRlZFwiLCBcImljb25cIiwgXCJpbWFnZVwiLCBcImludmVydGVkXCIsIFwic2l6ZVwiLCBcInN1YlwiLCBcInN1YmhlYWRlclwiLCBcInRleHRBbGlnblwiXTtcbkhlYWRlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBdHRhY2ggaGVhZGVyICB0byBvdGhlciBjb250ZW50LCBsaWtlIGEgc2VnbWVudC4gKi9cbiAgYXR0YWNoZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd0b3AnLCAnYm90dG9tJ10pXSksXG5cbiAgLyoqIEZvcm1hdCBoZWFkZXIgdG8gYXBwZWFyIGluc2lkZSBhIGNvbnRlbnQgYmxvY2suICovXG4gIGJsb2NrOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBDb2xvciBvZiB0aGUgaGVhZGVyLiAqL1xuICBjb2xvcjogUHJvcFR5cGVzLm9uZU9mKFNVSS5DT0xPUlMpLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFNob3cgdGhhdCB0aGUgaGVhZGVyIGlzIGluYWN0aXZlLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIERpdmlkZSBoZWFkZXIgZnJvbSB0aGUgY29udGVudCBiZWxvdyBpdC4gKi9cbiAgZGl2aWRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBIZWFkZXIgY2FuIHNpdCB0byB0aGUgbGVmdCBvciByaWdodCBvZiBvdGhlciBjb250ZW50LiAqL1xuICBmbG9hdGVkOiBQcm9wVHlwZXMub25lT2YoU1VJLkZMT0FUUyksXG5cbiAgLyoqIEFkZCBhbiBpY29uIGJ5IGljb24gbmFtZSBvciBwYXNzIGFuIEljb24uICovXG4gIGljb246IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnaW1hZ2UnXSksIFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZF0pXSksXG5cbiAgLyoqIEFkZCBhbiBpbWFnZSBieSBpbWcgc3JjIG9yIHBhc3MgYW4gSW1hZ2UuICovXG4gIGltYWdlOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2ljb24nXSksIFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZF0pXSksXG5cbiAgLyoqIEludmVydHMgdGhlIGNvbG9yIG9mIHRoZSBoZWFkZXIgZm9yIGRhcmsgYmFja2dyb3VuZHMuICovXG4gIGludmVydGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQ29udGVudCBoZWFkaW5ncyBhcmUgc2l6ZWQgd2l0aCBlbSBhbmQgYXJlIGJhc2VkIG9uIHRoZSBmb250LXNpemUgb2YgdGhlaXIgY29udGFpbmVyLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnYmlnJywgJ21hc3NpdmUnLCAnbWluaScpKSxcblxuICAvKiogSGVhZGVycyBtYXkgYmUgZm9ybWF0dGVkIHRvIGxhYmVsIHNtYWxsZXIgb3IgZGUtZW1waGFzaXplZCBjb250ZW50LiAqL1xuICBzdWI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEhlYWRlci5TdWJoZWFkZXIuICovXG4gIHN1YmhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEFsaWduIGhlYWRlciBjb250ZW50LiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVEVYVF9BTElHTk1FTlRTKVxufSA6IHt9O1xuSGVhZGVyLkNvbnRlbnQgPSBIZWFkZXJDb250ZW50O1xuSGVhZGVyLlN1YmhlYWRlciA9IEhlYWRlclN1YmhlYWRlcjtcbmV4cG9ydCBkZWZhdWx0IEhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBIZWFkZXIgY29udGVudCB3cmFwcyB0aGUgbWFpbiBjb250ZW50IHdoZW4gdGhlcmUgaXMgYW4gYWRqYWNlbnQgSWNvbiBvciBJbWFnZS5cbiAqL1xuXG5mdW5jdGlvbiBIZWFkZXJDb250ZW50KHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEhlYWRlckNvbnRlbnQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSGVhZGVyQ29udGVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkhlYWRlckNvbnRlbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5IZWFkZXJDb250ZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBIZWFkZXJDb250ZW50OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEhlYWRlcnMgbWF5IGNvbnRhaW4gc3ViaGVhZGVycy5cbiAqL1xuXG5mdW5jdGlvbiBIZWFkZXJTdWJoZWFkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnc3ViIGhlYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoSGVhZGVyU3ViaGVhZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEhlYWRlclN1YmhlYWRlciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkhlYWRlclN1YmhlYWRlci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbkhlYWRlclN1YmhlYWRlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuSGVhZGVyU3ViaGVhZGVyLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoSGVhZGVyU3ViaGVhZGVyLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgSGVhZGVyU3ViaGVhZGVyOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0hlYWRlcic7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgX2lzTmlsIGZyb20gXCJsb2Rhc2gtZXMvaXNOaWxcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgUHVyZUNvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZUtleU9yVmFsdWVBbmRLZXksIHVzZVZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uR3JvdXAgZnJvbSAnLi9JY29uR3JvdXAnO1xuLyoqXG4gKiBBbiBpY29uIGlzIGEgZ2x5cGggdXNlZCB0byByZXByZXNlbnQgc29tZXRoaW5nIGVsc2UuXG4gKiBAc2VlIEltYWdlXG4gKi9cblxudmFyIEljb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9QdXJlQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEljb24sIF9QdXJlQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJY29uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9QdXJlQ29tcG9uZW50LmNhbGwuYXBwbHkoX1B1cmVDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZGlzYWJsZWQgPSBfdGhpcy5wcm9wcy5kaXNhYmxlZDtcblxuICAgICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DbGljaycsIGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEljb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRJY29uQXJpYU9wdGlvbnMgPSBmdW5jdGlvbiBnZXRJY29uQXJpYU9wdGlvbnMoKSB7XG4gICAgdmFyIGFyaWFPcHRpb25zID0ge307XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYXJpYUxhYmVsID0gX3RoaXMkcHJvcHNbJ2FyaWEtbGFiZWwnXSxcbiAgICAgICAgYXJpYUhpZGRlbiA9IF90aGlzJHByb3BzWydhcmlhLWhpZGRlbiddO1xuXG4gICAgaWYgKF9pc05pbChhcmlhTGFiZWwpKSB7XG4gICAgICBhcmlhT3B0aW9uc1snYXJpYS1oaWRkZW4nXSA9ICd0cnVlJztcbiAgICB9IGVsc2Uge1xuICAgICAgYXJpYU9wdGlvbnNbJ2FyaWEtbGFiZWwnXSA9IGFyaWFMYWJlbDtcbiAgICB9XG5cbiAgICBpZiAoIV9pc05pbChhcmlhSGlkZGVuKSkge1xuICAgICAgYXJpYU9wdGlvbnNbJ2FyaWEtaGlkZGVuJ10gPSBhcmlhSGlkZGVuO1xuICAgIH1cblxuICAgIHJldHVybiBhcmlhT3B0aW9ucztcbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBib3JkZXJlZCA9IF90aGlzJHByb3BzMi5ib3JkZXJlZCxcbiAgICAgICAgY2lyY3VsYXIgPSBfdGhpcyRwcm9wczIuY2lyY3VsYXIsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yID0gX3RoaXMkcHJvcHMyLmNvbG9yLFxuICAgICAgICBjb3JuZXIgPSBfdGhpcyRwcm9wczIuY29ybmVyLFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgZml0dGVkID0gX3RoaXMkcHJvcHMyLmZpdHRlZCxcbiAgICAgICAgZmxpcHBlZCA9IF90aGlzJHByb3BzMi5mbGlwcGVkLFxuICAgICAgICBpbnZlcnRlZCA9IF90aGlzJHByb3BzMi5pbnZlcnRlZCxcbiAgICAgICAgbGluayA9IF90aGlzJHByb3BzMi5saW5rLFxuICAgICAgICBsb2FkaW5nID0gX3RoaXMkcHJvcHMyLmxvYWRpbmcsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczIubmFtZSxcbiAgICAgICAgcm90YXRlZCA9IF90aGlzJHByb3BzMi5yb3RhdGVkLFxuICAgICAgICBzaXplID0gX3RoaXMkcHJvcHMyLnNpemU7XG4gICAgdmFyIGNsYXNzZXMgPSBjeChjb2xvciwgbmFtZSwgc2l6ZSwgdXNlS2V5T25seShib3JkZXJlZCwgJ2JvcmRlcmVkJyksIHVzZUtleU9ubHkoY2lyY3VsYXIsICdjaXJjdWxhcicpLCB1c2VLZXlPbmx5KGRpc2FibGVkLCAnZGlzYWJsZWQnKSwgdXNlS2V5T25seShmaXR0ZWQsICdmaXR0ZWQnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkobGluaywgJ2xpbmsnKSwgdXNlS2V5T25seShsb2FkaW5nLCAnbG9hZGluZycpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGNvcm5lciwgJ2Nvcm5lcicpLCB1c2VWYWx1ZUFuZEtleShmbGlwcGVkLCAnZmxpcHBlZCcpLCB1c2VWYWx1ZUFuZEtleShyb3RhdGVkLCAncm90YXRlZCcpLCAnaWNvbicsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhJY29uLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShJY29uLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgYXJpYU9wdGlvbnMgPSB0aGlzLmdldEljb25BcmlhT3B0aW9ucygpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIGFyaWFPcHRpb25zLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBJY29uO1xufShQdXJlQ29tcG9uZW50KTtcblxuSWNvbi5oYW5kbGVkUHJvcHMgPSBbXCJhcmlhLWhpZGRlblwiLCBcImFyaWEtbGFiZWxcIiwgXCJhc1wiLCBcImJvcmRlcmVkXCIsIFwiY2lyY3VsYXJcIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvcm5lclwiLCBcImRpc2FibGVkXCIsIFwiZml0dGVkXCIsIFwiZmxpcHBlZFwiLCBcImludmVydGVkXCIsIFwibGlua1wiLCBcImxvYWRpbmdcIiwgXCJuYW1lXCIsIFwicm90YXRlZFwiLCBcInNpemVcIl07XG5JY29uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEZvcm1hdHRlZCB0byBhcHBlYXIgYm9yZGVyZWQuICovXG4gIGJvcmRlcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogSWNvbiBjYW4gZm9ybWF0dGVkIHRvIGFwcGVhciBjaXJjdWxhci4gKi9cbiAgY2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQ29sb3Igb2YgdGhlIGljb24uICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoU1VJLkNPTE9SUyksXG5cbiAgLyoqIEljb25zIGNhbiBkaXNwbGF5IGEgc21hbGxlciBjb3JuZXIgaWNvbi4gKi9cbiAgY29ybmVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsndG9wIGxlZnQnLCAndG9wIHJpZ2h0JywgJ2JvdHRvbSBsZWZ0JywgJ2JvdHRvbSByaWdodCddKV0pLFxuXG4gIC8qKiBTaG93IHRoYXQgdGhlIGljb24gaXMgaW5hY3RpdmUuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRml0dGVkLCB3aXRob3V0IHNwYWNlIHRvIGxlZnQgb3IgcmlnaHQgb2YgSWNvbi4gKi9cbiAgZml0dGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogSWNvbiBjYW4gYmUgZmxpcHBlZC4gKi9cbiAgZmxpcHBlZDogUHJvcFR5cGVzLm9uZU9mKFsnaG9yaXpvbnRhbGx5JywgJ3ZlcnRpY2FsbHknXSksXG5cbiAgLyoqIEZvcm1hdHRlZCB0byBoYXZlIGl0cyBjb2xvcnMgaW52ZXJ0ZWQgZm9yIGNvbnRyYXN0LiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEljb24gY2FuIGJlIGZvcm1hdHRlZCBhcyBhIGxpbmsuICovXG4gIGxpbms6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBJY29uIGNhbiBiZSB1c2VkIGFzIGEgc2ltcGxlIGxvYWRlci4gKi9cbiAgbG9hZGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIE5hbWUgb2YgdGhlIGljb24uICovXG4gIG5hbWU6IGN1c3RvbVByb3BUeXBlcy5zdWdnZXN0KFNVSS5BTExfSUNPTlNfSU5fQUxMX0NPTlRFWFRTKSxcblxuICAvKiogSWNvbiBjYW4gcm90YXRlZC4gKi9cbiAgcm90YXRlZDogUHJvcFR5cGVzLm9uZU9mKFsnY2xvY2t3aXNlJywgJ2NvdW50ZXJjbG9ja3dpc2UnXSksXG5cbiAgLyoqIFNpemUgb2YgdGhlIGljb24uICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuU0laRVMsICdtZWRpdW0nKSksXG5cbiAgLyoqIEljb24gY2FuIGhhdmUgYW4gYXJpYSBsYWJlbC4gKi9cbiAgJ2FyaWEtaGlkZGVuJzogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogSWNvbiBjYW4gaGF2ZSBhbiBhcmlhIGxhYmVsLiAqL1xuICAnYXJpYS1sYWJlbCc6IFByb3BUeXBlcy5zdHJpbmdcbn0gOiB7fTtcbkljb24uZGVmYXVsdFByb3BzID0ge1xuICBhczogJ2knXG59O1xuSWNvbi5Hcm91cCA9IEljb25Hcm91cDtcbkljb24uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShJY29uLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiB2YWx1ZVxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBJY29uOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogU2V2ZXJhbCBpY29ucyBjYW4gYmUgdXNlZCB0b2dldGhlciBhcyBhIGdyb3VwLlxuICovXG5cbmZ1bmN0aW9uIEljb25Hcm91cChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemU7XG4gIHZhciBjbGFzc2VzID0gY3goc2l6ZSwgJ2ljb25zJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhJY29uR3JvdXAsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSWNvbkdyb3VwLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuSWNvbkdyb3VwLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwic2l6ZVwiXTtcbkljb25Hcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogU2l6ZSBvZiB0aGUgaWNvbiBncm91cC4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScpKVxufSA6IHt9O1xuSWNvbkdyb3VwLmRlZmF1bHRQcm9wcyA9IHtcbiAgYXM6ICdpJ1xufTtcbmV4cG9ydCBkZWZhdWx0IEljb25Hcm91cDsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9JY29uJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC1lcy9pc05pbFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgaHRtbEltYWdlUHJvcHMsIHBhcnRpdGlvbkhUTUxQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5LCB1c2VWYWx1ZUFuZEtleSwgdXNlVmVydGljYWxBbGlnblByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IERpbW1lciBmcm9tICcuLi8uLi9tb2R1bGVzL0RpbW1lcic7XG5pbXBvcnQgTGFiZWwgZnJvbSAnLi4vTGFiZWwvTGFiZWwnO1xuaW1wb3J0IEltYWdlR3JvdXAgZnJvbSAnLi9JbWFnZUdyb3VwJztcbi8qKlxuICogQW4gaW1hZ2UgaXMgYSBncmFwaGljIHJlcHJlc2VudGF0aW9uIG9mIHNvbWV0aGluZy5cbiAqIEBzZWUgSWNvblxuICovXG5cbmZ1bmN0aW9uIEltYWdlKHByb3BzKSB7XG4gIHZhciBhdmF0YXIgPSBwcm9wcy5hdmF0YXIsXG4gICAgICBib3JkZXJlZCA9IHByb3BzLmJvcmRlcmVkLFxuICAgICAgY2VudGVyZWQgPSBwcm9wcy5jZW50ZXJlZCxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjaXJjdWxhciA9IHByb3BzLmNpcmN1bGFyLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkaW1tZXIgPSBwcm9wcy5kaW1tZXIsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZmxvYXRlZCA9IHByb3BzLmZsb2F0ZWQsXG4gICAgICBmbHVpZCA9IHByb3BzLmZsdWlkLFxuICAgICAgaGlkZGVuID0gcHJvcHMuaGlkZGVuLFxuICAgICAgaHJlZiA9IHByb3BzLmhyZWYsXG4gICAgICBpbmxpbmUgPSBwcm9wcy5pbmxpbmUsXG4gICAgICBsYWJlbCA9IHByb3BzLmxhYmVsLFxuICAgICAgcm91bmRlZCA9IHByb3BzLnJvdW5kZWQsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHNwYWNlZCA9IHByb3BzLnNwYWNlZCxcbiAgICAgIHZlcnRpY2FsQWxpZ24gPSBwcm9wcy52ZXJ0aWNhbEFsaWduLFxuICAgICAgd3JhcHBlZCA9IHByb3BzLndyYXBwZWQsXG4gICAgICB1aSA9IHByb3BzLnVpO1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkodWksICd1aScpLCBzaXplLCB1c2VLZXlPbmx5KGF2YXRhciwgJ2F2YXRhcicpLCB1c2VLZXlPbmx5KGJvcmRlcmVkLCAnYm9yZGVyZWQnKSwgdXNlS2V5T25seShjaXJjdWxhciwgJ2NpcmN1bGFyJyksIHVzZUtleU9ubHkoY2VudGVyZWQsICdjZW50ZXJlZCcpLCB1c2VLZXlPbmx5KGRpc2FibGVkLCAnZGlzYWJsZWQnKSwgdXNlS2V5T25seShmbHVpZCwgJ2ZsdWlkJyksIHVzZUtleU9ubHkoaGlkZGVuLCAnaGlkZGVuJyksIHVzZUtleU9ubHkoaW5saW5lLCAnaW5saW5lJyksIHVzZUtleU9ubHkocm91bmRlZCwgJ3JvdW5kZWQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShzcGFjZWQsICdzcGFjZWQnKSwgdXNlVmFsdWVBbmRLZXkoZmxvYXRlZCwgJ2Zsb2F0ZWQnKSwgdXNlVmVydGljYWxBbGlnblByb3AodmVydGljYWxBbGlnbiwgJ2FsaWduZWQnKSwgJ2ltYWdlJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhJbWFnZSwgcHJvcHMpO1xuXG4gIHZhciBfcGFydGl0aW9uSFRNTFByb3BzID0gcGFydGl0aW9uSFRNTFByb3BzKHJlc3QsIHtcbiAgICBodG1sUHJvcHM6IGh0bWxJbWFnZVByb3BzXG4gIH0pLFxuICAgICAgaW1nVGFnUHJvcHMgPSBfcGFydGl0aW9uSFRNTFByb3BzWzBdLFxuICAgICAgcm9vdFByb3BzID0gX3BhcnRpdGlvbkhUTUxQcm9wc1sxXTtcblxuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShJbWFnZSwgcHJvcHMsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV9pc05pbChkaW1tZXIpIHx8ICFfaXNOaWwobGFiZWwpIHx8ICFfaXNOaWwod3JhcHBlZCkgfHwgIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICByZXR1cm4gJ2Rpdic7XG4gICAgfVxuICB9KTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjb250ZW50KTtcbiAgfVxuXG4gIGlmIChFbGVtZW50VHlwZSA9PT0gJ2ltZycpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByb290UHJvcHMsIGltZ1RhZ1Byb3BzLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSk7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByb290UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgaHJlZjogaHJlZlxuICB9KSwgRGltbWVyLmNyZWF0ZShkaW1tZXIsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pLCBMYWJlbC5jcmVhdGUobGFiZWwsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCBpbWdUYWdQcm9wcykpO1xufVxuXG5JbWFnZS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImF2YXRhclwiLCBcImJvcmRlcmVkXCIsIFwiY2VudGVyZWRcIiwgXCJjaGlsZHJlblwiLCBcImNpcmN1bGFyXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRpbW1lclwiLCBcImRpc2FibGVkXCIsIFwiZmxvYXRlZFwiLCBcImZsdWlkXCIsIFwiaGlkZGVuXCIsIFwiaHJlZlwiLCBcImlubGluZVwiLCBcImxhYmVsXCIsIFwicm91bmRlZFwiLCBcInNpemVcIiwgXCJzcGFjZWRcIiwgXCJ1aVwiLCBcInZlcnRpY2FsQWxpZ25cIiwgXCJ3cmFwcGVkXCJdO1xuSW1hZ2UuR3JvdXAgPSBJbWFnZUdyb3VwO1xuSW1hZ2UucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQW4gaW1hZ2UgbWF5IGJlIGZvcm1hdHRlZCB0byBhcHBlYXIgaW5saW5lIHdpdGggdGV4dCBhcyBhbiBhdmF0YXIuICovXG4gIGF2YXRhcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFuIGltYWdlIG1heSBpbmNsdWRlIGEgYm9yZGVyIHRvIGVtcGhhc2l6ZSB0aGUgZWRnZXMgb2Ygd2hpdGUgb3IgdHJhbnNwYXJlbnQgY29udGVudC4gKi9cbiAgYm9yZGVyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBbiBpbWFnZSBjYW4gYXBwZWFyIGNlbnRlcmVkIGluIGEgY29udGVudCBibG9jay4gKi9cbiAgY2VudGVyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQW4gaW1hZ2UgbWF5IGFwcGVhciBjaXJjdWxhci4gKi9cbiAgY2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBbiBpbWFnZSBjYW4gc2hvdyB0aGF0IGl0IGlzIGRpc2FibGVkIGFuZCBjYW5ub3QgYmUgc2VsZWN0ZWQuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBEaW1tZXIuICovXG4gIGRpbW1lcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEFuIGltYWdlIGNhbiBzaXQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgb2Ygb3RoZXIgY29udGVudC4gKi9cbiAgZmxvYXRlZDogUHJvcFR5cGVzLm9uZU9mKFNVSS5GTE9BVFMpLFxuXG4gIC8qKiBBbiBpbWFnZSBjYW4gdGFrZSB1cCB0aGUgd2lkdGggb2YgaXRzIGNvbnRhaW5lci4gKi9cbiAgZmx1aWQ6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbUHJvcFR5cGVzLmJvb2wsIGN1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ3NpemUnXSldKSxcblxuICAvKiogQW4gaW1hZ2UgY2FuIGJlIGhpZGRlbi4gKi9cbiAgaGlkZGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUmVuZGVycyB0aGUgSW1hZ2UgYXMgYW4gPGE+IHRhZyB3aXRoIHRoaXMgaHJlZi4gKi9cbiAgaHJlZjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQW4gaW1hZ2UgbWF5IGFwcGVhciBpbmxpbmUuICovXG4gIGlubGluZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgTGFiZWwuICovXG4gIGxhYmVsOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQW4gaW1hZ2UgbWF5IGFwcGVhciByb3VuZGVkLiAqL1xuICByb3VuZGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQW4gaW1hZ2UgbWF5IGFwcGVhciBhdCBkaWZmZXJlbnQgc2l6ZXMuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihTVUkuU0laRVMpLFxuXG4gIC8qKiBBbiBpbWFnZSBjYW4gc3BlY2lmeSB0aGF0IGl0IG5lZWRzIGFuIGFkZGl0aW9uYWwgc3BhY2luZyB0byBzZXBhcmF0ZSBpdCBmcm9tIG5lYXJieSBjb250ZW50LiAqL1xuICBzcGFjZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0J10pXSksXG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRvIGFkZCB0aGUgdWkgY2xhc3NOYW1lLiAqL1xuICB1aTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFuIGltYWdlIGNhbiBzcGVjaWZ5IGl0cyB2ZXJ0aWNhbCBhbGlnbm1lbnQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUyksXG5cbiAgLyoqIEFuIGltYWdlIGNhbiByZW5kZXIgd3JhcHBlZCBpbiBhIGBkaXYudWkuaW1hZ2VgIGFzIGFsdGVybmF0aXZlIEhUTUwgbWFya3VwLiAqL1xuICB3cmFwcGVkOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuSW1hZ2UuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ2ltZycsXG4gIHVpOiB0cnVlXG59O1xuSW1hZ2UuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShJbWFnZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgc3JjOiB2YWx1ZVxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBJbWFnZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgZ3JvdXAgb2YgaW1hZ2VzLlxuICovXG5cbmZ1bmN0aW9uIEltYWdlR3JvdXAocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHNpemUsIGNsYXNzTmFtZSwgJ2ltYWdlcycpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEltYWdlR3JvdXAsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSW1hZ2VHcm91cCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkltYWdlR3JvdXAuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJzaXplXCJdO1xuSW1hZ2VHcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBncm91cCBvZiBpbWFnZXMgY2FuIGJlIGZvcm1hdHRlZCB0byBoYXZlIHRoZSBzYW1lIHNpemUuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihTVUkuU0laRVMpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBJbWFnZUdyb3VwOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0ltYWdlJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwibG9kYXNoLWVzL2luY2x1ZGVzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gtZXMvZ2V0XCI7XG5pbXBvcnQgX2lzTmlsIGZyb20gXCJsb2Rhc2gtZXMvaXNOaWxcIjtcbmltcG9ydCB7IGhhbmRsZVJlZiB9IGZyb20gJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtcmVmJztcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ2hpbGRyZW4sIGNsb25lRWxlbWVudCwgQ29tcG9uZW50LCBjcmVhdGVSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVIVE1MSW5wdXQsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBwYXJ0aXRpb25IVE1MUHJvcHMsIHVzZUtleU9ubHksIHVzZVZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vQnV0dG9uJztcbmltcG9ydCBJY29uIGZyb20gJy4uL0ljb24nO1xuaW1wb3J0IExhYmVsIGZyb20gJy4uL0xhYmVsJztcbi8qKlxuICogQW4gSW5wdXQgaXMgYSBmaWVsZCB1c2VkIHRvIGVsaWNpdCBhIHJlc3BvbnNlIGZyb20gYSB1c2VyLlxuICogQHNlZSBCdXR0b25cbiAqIEBzZWUgRm9ybVxuICogQHNlZSBJY29uXG4gKiBAc2VlIExhYmVsXG4gKi9cblxudmFyIElucHV0ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKElucHV0LCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJbnB1dCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5pbnB1dFJlZiA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcblxuICAgIF90aGlzLmNvbXB1dGVJY29uID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbG9hZGluZyA9IF90aGlzJHByb3BzLmxvYWRpbmcsXG4gICAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzLmljb247XG4gICAgICBpZiAoIV9pc05pbChpY29uKSkgcmV0dXJuIGljb247XG4gICAgICBpZiAobG9hZGluZykgcmV0dXJuICdzcGlubmVyJztcbiAgICB9O1xuXG4gICAgX3RoaXMuY29tcHV0ZVRhYkluZGV4ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMyLmRpc2FibGVkLFxuICAgICAgICAgIHRhYkluZGV4ID0gX3RoaXMkcHJvcHMyLnRhYkluZGV4O1xuICAgICAgaWYgKCFfaXNOaWwodGFiSW5kZXgpKSByZXR1cm4gdGFiSW5kZXg7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVybiAtMTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaW5wdXRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaW5wdXRSZWYuY3VycmVudC5zZWxlY3QoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9nZXQoZSwgJ3RhcmdldC52YWx1ZScpO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DaGFuZ2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNoaWxkT3ZlcnJpZGVzID0gZnVuY3Rpb24gKGNoaWxkLCBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgZGVmYXVsdFByb3BzLCBjaGlsZC5wcm9wcywge1xuICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICAgICAgaGFuZGxlUmVmKGNoaWxkLnJlZiwgYyk7XG4gICAgICAgICAgX3RoaXMuaW5wdXRSZWYuY3VycmVudCA9IGM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5wYXJ0aXRpb25Qcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMy5kaXNhYmxlZCxcbiAgICAgICAgICB0eXBlID0gX3RoaXMkcHJvcHMzLnR5cGU7XG5cbiAgICAgIHZhciB0YWJJbmRleCA9IF90aGlzLmNvbXB1dGVUYWJJbmRleCgpO1xuXG4gICAgICB2YXIgdW5oYW5kbGVkID0gZ2V0VW5oYW5kbGVkUHJvcHMoSW5wdXQsIF90aGlzLnByb3BzKTtcblxuICAgICAgdmFyIF9wYXJ0aXRpb25IVE1MUHJvcHMgPSBwYXJ0aXRpb25IVE1MUHJvcHModW5oYW5kbGVkKSxcbiAgICAgICAgICBodG1sSW5wdXRQcm9wcyA9IF9wYXJ0aXRpb25IVE1MUHJvcHNbMF0sXG4gICAgICAgICAgcmVzdCA9IF9wYXJ0aXRpb25IVE1MUHJvcHNbMV07XG5cbiAgICAgIHJldHVybiBbX2V4dGVuZHMoe30sIGh0bWxJbnB1dFByb3BzLCB7XG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4LFxuICAgICAgICBvbkNoYW5nZTogX3RoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgICByZWY6IF90aGlzLmlucHV0UmVmXG4gICAgICB9KSwgcmVzdF07XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBJbnB1dC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRwcm9wczQgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb24gPSBfdGhpcyRwcm9wczQuYWN0aW9uLFxuICAgICAgICBhY3Rpb25Qb3NpdGlvbiA9IF90aGlzJHByb3BzNC5hY3Rpb25Qb3NpdGlvbixcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczQuY2hpbGRyZW4sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNC5jbGFzc05hbWUsXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHM0LmRpc2FibGVkLFxuICAgICAgICBlcnJvciA9IF90aGlzJHByb3BzNC5lcnJvcixcbiAgICAgICAgZmx1aWQgPSBfdGhpcyRwcm9wczQuZmx1aWQsXG4gICAgICAgIGZvY3VzID0gX3RoaXMkcHJvcHM0LmZvY3VzLFxuICAgICAgICBpY29uID0gX3RoaXMkcHJvcHM0Lmljb24sXG4gICAgICAgIGljb25Qb3NpdGlvbiA9IF90aGlzJHByb3BzNC5pY29uUG9zaXRpb24sXG4gICAgICAgIGlucHV0ID0gX3RoaXMkcHJvcHM0LmlucHV0LFxuICAgICAgICBpbnZlcnRlZCA9IF90aGlzJHByb3BzNC5pbnZlcnRlZCxcbiAgICAgICAgbGFiZWwgPSBfdGhpcyRwcm9wczQubGFiZWwsXG4gICAgICAgIGxhYmVsUG9zaXRpb24gPSBfdGhpcyRwcm9wczQubGFiZWxQb3NpdGlvbixcbiAgICAgICAgbG9hZGluZyA9IF90aGlzJHByb3BzNC5sb2FkaW5nLFxuICAgICAgICBzaXplID0gX3RoaXMkcHJvcHM0LnNpemUsXG4gICAgICAgIHRyYW5zcGFyZW50ID0gX3RoaXMkcHJvcHM0LnRyYW5zcGFyZW50LFxuICAgICAgICB0eXBlID0gX3RoaXMkcHJvcHM0LnR5cGU7XG4gICAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBzaXplLCB1c2VLZXlPbmx5KGRpc2FibGVkLCAnZGlzYWJsZWQnKSwgdXNlS2V5T25seShlcnJvciwgJ2Vycm9yJyksIHVzZUtleU9ubHkoZmx1aWQsICdmbHVpZCcpLCB1c2VLZXlPbmx5KGZvY3VzLCAnZm9jdXMnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkobG9hZGluZywgJ2xvYWRpbmcnKSwgdXNlS2V5T25seSh0cmFuc3BhcmVudCwgJ3RyYW5zcGFyZW50JyksIHVzZVZhbHVlQW5kS2V5KGFjdGlvblBvc2l0aW9uLCAnYWN0aW9uJykgfHwgdXNlS2V5T25seShhY3Rpb24sICdhY3Rpb24nKSwgdXNlVmFsdWVBbmRLZXkoaWNvblBvc2l0aW9uLCAnaWNvbicpIHx8IHVzZUtleU9ubHkoaWNvbiB8fCBsb2FkaW5nLCAnaWNvbicpLCB1c2VWYWx1ZUFuZEtleShsYWJlbFBvc2l0aW9uLCAnbGFiZWxlZCcpIHx8IHVzZUtleU9ubHkobGFiZWwsICdsYWJlbGVkJyksICdpbnB1dCcsIGNsYXNzTmFtZSk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSW5wdXQsIHRoaXMucHJvcHMpO1xuXG4gICAgdmFyIF90aGlzJHBhcnRpdGlvblByb3BzID0gdGhpcy5wYXJ0aXRpb25Qcm9wcygpLFxuICAgICAgICBodG1sSW5wdXRQcm9wcyA9IF90aGlzJHBhcnRpdGlvblByb3BzWzBdLFxuICAgICAgICByZXN0ID0gX3RoaXMkcGFydGl0aW9uUHJvcHNbMV07IC8vIFJlbmRlciB3aXRoIGNoaWxkcmVuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICAvLyBhZGQgaHRtbElucHV0UHJvcHMgdG8gdGhlIGA8aW5wdXQgLz5gIGNoaWxkXG4gICAgICB2YXIgY2hpbGRFbGVtZW50cyA9IF9tYXAoQ2hpbGRyZW4udG9BcnJheShjaGlsZHJlbiksIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBpZiAoY2hpbGQudHlwZSAhPT0gJ2lucHV0JykgcmV0dXJuIGNoaWxkO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL2Nsb25lRWxlbWVudChjaGlsZCwgX3RoaXMyLmhhbmRsZUNoaWxkT3ZlcnJpZGVzKGNoaWxkLCBodG1sSW5wdXRQcm9wcykpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgICB9KSwgY2hpbGRFbGVtZW50cyk7XG4gICAgfSAvLyBSZW5kZXIgU2hvcnRoYW5kXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgICB2YXIgYWN0aW9uRWxlbWVudCA9IEJ1dHRvbi5jcmVhdGUoYWN0aW9uLCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIGxhYmVsRWxlbWVudCA9IExhYmVsLmNyZWF0ZShsYWJlbCwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNsYXNzTmFtZTogY3goJ2xhYmVsJywgLy8gYWRkICdsZWZ0fHJpZ2h0IGNvcm5lcidcbiAgICAgICAgX2luY2x1ZGVzKGxhYmVsUG9zaXRpb24sICdjb3JuZXInKSAmJiBsYWJlbFBvc2l0aW9uKVxuICAgICAgfSxcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgYWN0aW9uUG9zaXRpb24gPT09ICdsZWZ0JyAmJiBhY3Rpb25FbGVtZW50LCBsYWJlbFBvc2l0aW9uICE9PSAncmlnaHQnICYmIGxhYmVsRWxlbWVudCwgY3JlYXRlSFRNTElucHV0KGlucHV0IHx8IHR5cGUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczogaHRtbElucHV0UHJvcHMsXG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgfSksIEljb24uY3JlYXRlKHRoaXMuY29tcHV0ZUljb24oKSwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCBhY3Rpb25Qb3NpdGlvbiAhPT0gJ2xlZnQnICYmIGFjdGlvbkVsZW1lbnQsIGxhYmVsUG9zaXRpb24gPT09ICdyaWdodCcgJiYgbGFiZWxFbGVtZW50KTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXQ7XG59KENvbXBvbmVudCk7XG5cbklucHV0LmhhbmRsZWRQcm9wcyA9IFtcImFjdGlvblwiLCBcImFjdGlvblBvc2l0aW9uXCIsIFwiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImRpc2FibGVkXCIsIFwiZXJyb3JcIiwgXCJmbHVpZFwiLCBcImZvY3VzXCIsIFwiaWNvblwiLCBcImljb25Qb3NpdGlvblwiLCBcImlucHV0XCIsIFwiaW52ZXJ0ZWRcIiwgXCJsYWJlbFwiLCBcImxhYmVsUG9zaXRpb25cIiwgXCJsb2FkaW5nXCIsIFwib25DaGFuZ2VcIiwgXCJzaXplXCIsIFwidGFiSW5kZXhcIiwgXCJ0cmFuc3BhcmVudFwiLCBcInR5cGVcIl07XG5JbnB1dC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBbiBJbnB1dCBjYW4gYmUgZm9ybWF0dGVkIHRvIGFsZXJ0IHRoZSB1c2VyIHRvIGFuIGFjdGlvbiB0aGV5IG1heSBwZXJmb3JtLiAqL1xuICBhY3Rpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZF0pLFxuXG4gIC8qKiBBbiBhY3Rpb24gY2FuIGFwcGVhciBhbG9uZyBzaWRlIGFuIElucHV0IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0LiAqL1xuICBhY3Rpb25Qb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCddKSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBbiBJbnB1dCBmaWVsZCBjYW4gc2hvdyB0aGF0IGl0IGlzIGRpc2FibGVkLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFuIElucHV0IGZpZWxkIGNhbiBzaG93IHRoZSBkYXRhIGNvbnRhaW5zIGVycm9ycy4gKi9cbiAgZXJyb3I6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBUYWtlIG9uIHRoZSBzaXplIG9mIGl0cyBjb250YWluZXIuICovXG4gIGZsdWlkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQW4gSW5wdXQgZmllbGQgY2FuIHNob3cgYSB1c2VyIGlzIGN1cnJlbnRseSBpbnRlcmFjdGluZyB3aXRoIGl0LiAqL1xuICBmb2N1czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIE9wdGlvbmFsIEljb24gdG8gZGlzcGxheSBpbnNpZGUgdGhlIElucHV0LiAqL1xuICBpY29uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRdKSxcblxuICAvKiogQW4gSWNvbiBjYW4gYXBwZWFyIGluc2lkZSBhbiBJbnB1dCBvbiB0aGUgbGVmdCBvciByaWdodC4gKi9cbiAgaWNvblBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0J10pLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIGNyZWF0aW5nIHRoZSBIVE1MIElucHV0LiAqL1xuICBpbnB1dDogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEZvcm1hdCB0byBhcHBlYXIgb24gZGFyayBiYWNrZ3JvdW5kcy4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBPcHRpb25hbCBMYWJlbCB0byBkaXNwbGF5IGFsb25nIHNpZGUgdGhlIElucHV0LiAqL1xuICBsYWJlbDogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEEgTGFiZWwgY2FuIGFwcGVhciBvdXRzaWRlIGFuIElucHV0IG9uIHRoZSBsZWZ0IG9yIHJpZ2h0LiAqL1xuICBsYWJlbFBvc2l0aW9uOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0JywgJ2xlZnQgY29ybmVyJywgJ3JpZ2h0IGNvcm5lciddKSxcblxuICAvKiogQW4gSWNvbiBJbnB1dCBmaWVsZCBjYW4gc2hvdyB0aGF0IGl0IGlzIGN1cnJlbnRseSBsb2FkaW5nIGRhdGEuICovXG4gIGxvYWRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0NoYW5nZUV2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzIGFuZCBhIHByb3Bvc2VkIHZhbHVlLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBBbiBJbnB1dCBjYW4gdmFyeSBpbiBzaXplLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoWydtaW5pJywgJ3NtYWxsJywgJ2xhcmdlJywgJ2JpZycsICdodWdlJywgJ21hc3NpdmUnXSksXG5cbiAgLyoqIEFuIElucHV0IGNhbiByZWNlaXZlIGZvY3VzLiAqL1xuICB0YWJJbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBUcmFuc3BhcmVudCBJbnB1dCBoYXMgbm8gYmFja2dyb3VuZC4gKi9cbiAgdHJhbnNwYXJlbnQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBUaGUgSFRNTCBpbnB1dCB0eXBlLiAqL1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5JbnB1dC5kZWZhdWx0UHJvcHMgPSB7XG4gIHR5cGU6ICd0ZXh0J1xufTtcbklucHV0LmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoSW5wdXQsIGZ1bmN0aW9uICh0eXBlKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZVxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBJbnB1dDsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9JbnB1dCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaXNVbmRlZmluZWQgZnJvbSBcImxvZGFzaC1lcy9pc1VuZGVmaW5lZFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlS2V5T25seSwgdXNlS2V5T3JWYWx1ZUFuZEtleSwgdXNlVmFsdWVBbmRLZXkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vSWNvbi9JY29uJztcbmltcG9ydCBJbWFnZSBmcm9tICcuLi9JbWFnZS9JbWFnZSc7XG5pbXBvcnQgTGFiZWxEZXRhaWwgZnJvbSAnLi9MYWJlbERldGFpbCc7XG5pbXBvcnQgTGFiZWxHcm91cCBmcm9tICcuL0xhYmVsR3JvdXAnO1xuLyoqXG4gKiBBIGxhYmVsIGRpc3BsYXlzIGNvbnRlbnQgY2xhc3NpZmljYXRpb24uXG4gKi9cblxudmFyIExhYmVsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKExhYmVsLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMYWJlbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbkNsaWNrID0gX3RoaXMucHJvcHMub25DbGljaztcbiAgICAgIGlmIChvbkNsaWNrKSBvbkNsaWNrKGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSWNvbk92ZXJyaWRlcyA9IGZ1bmN0aW9uIChwcmVkZWZpbmVkUHJvcHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgIF9pbnZva2UocHJlZGVmaW5lZFByb3BzLCAnb25DbGljaycsIGUpO1xuXG4gICAgICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uUmVtb3ZlJywgZSwgX3RoaXMucHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gTGFiZWwucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlID0gX3RoaXMkcHJvcHMuYWN0aXZlLFxuICAgICAgICBhdHRhY2hlZCA9IF90aGlzJHByb3BzLmF0dGFjaGVkLFxuICAgICAgICBiYXNpYyA9IF90aGlzJHByb3BzLmJhc2ljLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBjaXJjdWxhciA9IF90aGlzJHByb3BzLmNpcmN1bGFyLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNvbG9yID0gX3RoaXMkcHJvcHMuY29sb3IsXG4gICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wcy5jb250ZW50LFxuICAgICAgICBjb3JuZXIgPSBfdGhpcyRwcm9wcy5jb3JuZXIsXG4gICAgICAgIGRldGFpbCA9IF90aGlzJHByb3BzLmRldGFpbCxcbiAgICAgICAgZW1wdHkgPSBfdGhpcyRwcm9wcy5lbXB0eSxcbiAgICAgICAgZmxvYXRpbmcgPSBfdGhpcyRwcm9wcy5mbG9hdGluZyxcbiAgICAgICAgaG9yaXpvbnRhbCA9IF90aGlzJHByb3BzLmhvcml6b250YWwsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wcy5pY29uLFxuICAgICAgICBpbWFnZSA9IF90aGlzJHByb3BzLmltYWdlLFxuICAgICAgICBvblJlbW92ZSA9IF90aGlzJHByb3BzLm9uUmVtb3ZlLFxuICAgICAgICBwb2ludGluZyA9IF90aGlzJHByb3BzLnBvaW50aW5nLFxuICAgICAgICBwcm9tcHQgPSBfdGhpcyRwcm9wcy5wcm9tcHQsXG4gICAgICAgIHJlbW92ZUljb24gPSBfdGhpcyRwcm9wcy5yZW1vdmVJY29uLFxuICAgICAgICByaWJib24gPSBfdGhpcyRwcm9wcy5yaWJib24sXG4gICAgICAgIHNpemUgPSBfdGhpcyRwcm9wcy5zaXplLFxuICAgICAgICB0YWcgPSBfdGhpcyRwcm9wcy50YWc7XG4gICAgdmFyIHBvaW50aW5nQ2xhc3MgPSBwb2ludGluZyA9PT0gdHJ1ZSAmJiAncG9pbnRpbmcnIHx8IChwb2ludGluZyA9PT0gJ2xlZnQnIHx8IHBvaW50aW5nID09PSAncmlnaHQnKSAmJiBwb2ludGluZyArIFwiIHBvaW50aW5nXCIgfHwgKHBvaW50aW5nID09PSAnYWJvdmUnIHx8IHBvaW50aW5nID09PSAnYmVsb3cnKSAmJiBcInBvaW50aW5nIFwiICsgcG9pbnRpbmc7XG4gICAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBjb2xvciwgcG9pbnRpbmdDbGFzcywgc2l6ZSwgdXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgdXNlS2V5T25seShiYXNpYywgJ2Jhc2ljJyksIHVzZUtleU9ubHkoY2lyY3VsYXIsICdjaXJjdWxhcicpLCB1c2VLZXlPbmx5KGVtcHR5LCAnZW1wdHknKSwgdXNlS2V5T25seShmbG9hdGluZywgJ2Zsb2F0aW5nJyksIHVzZUtleU9ubHkoaG9yaXpvbnRhbCwgJ2hvcml6b250YWwnKSwgdXNlS2V5T25seShpbWFnZSA9PT0gdHJ1ZSwgJ2ltYWdlJyksIHVzZUtleU9ubHkocHJvbXB0LCAncHJvbXB0JyksIHVzZUtleU9ubHkodGFnLCAndGFnJyksIHVzZUtleU9yVmFsdWVBbmRLZXkoY29ybmVyLCAnY29ybmVyJyksIHVzZUtleU9yVmFsdWVBbmRLZXkocmliYm9uLCAncmliYm9uJyksIHVzZVZhbHVlQW5kS2V5KGF0dGFjaGVkLCAnYXR0YWNoZWQnKSwgJ2xhYmVsJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKExhYmVsLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShMYWJlbCwgdGhpcy5wcm9wcyk7XG5cbiAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIGNoaWxkcmVuKTtcbiAgICB9XG5cbiAgICB2YXIgcmVtb3ZlSWNvblNob3J0aGFuZCA9IF9pc1VuZGVmaW5lZChyZW1vdmVJY29uKSA/ICdkZWxldGUnIDogcmVtb3ZlSWNvbjtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICB9LCByZXN0KSwgSWNvbi5jcmVhdGUoaWNvbiwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCB0eXBlb2YgaW1hZ2UgIT09ICdib29sZWFuJyAmJiBJbWFnZS5jcmVhdGUoaW1hZ2UsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgY29udGVudCwgTGFiZWxEZXRhaWwuY3JlYXRlKGRldGFpbCwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pLCBvblJlbW92ZSAmJiBJY29uLmNyZWF0ZShyZW1vdmVJY29uU2hvcnRoYW5kLCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVQcm9wczogdGhpcy5oYW5kbGVJY29uT3ZlcnJpZGVzXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBMYWJlbDtcbn0oQ29tcG9uZW50KTtcblxuTGFiZWwuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYXNcIiwgXCJhdHRhY2hlZFwiLCBcImJhc2ljXCIsIFwiY2hpbGRyZW5cIiwgXCJjaXJjdWxhclwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29udGVudFwiLCBcImNvcm5lclwiLCBcImRldGFpbFwiLCBcImVtcHR5XCIsIFwiZmxvYXRpbmdcIiwgXCJob3Jpem9udGFsXCIsIFwiaWNvblwiLCBcImltYWdlXCIsIFwib25DbGlja1wiLCBcIm9uUmVtb3ZlXCIsIFwicG9pbnRpbmdcIiwgXCJwcm9tcHRcIiwgXCJyZW1vdmVJY29uXCIsIFwicmliYm9uXCIsIFwic2l6ZVwiLCBcInRhZ1wiXTtcbmV4cG9ydCB7IExhYmVsIGFzIGRlZmF1bHQgfTtcbkxhYmVsLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgbGFiZWwgY2FuIGJlIGFjdGl2ZS4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBsYWJlbCBjYW4gYXR0YWNoIHRvIGEgY29udGVudCBzZWdtZW50LiAqL1xuICBhdHRhY2hlZDogUHJvcFR5cGVzLm9uZU9mKFsndG9wJywgJ2JvdHRvbScsICd0b3AgcmlnaHQnLCAndG9wIGxlZnQnLCAnYm90dG9tIGxlZnQnLCAnYm90dG9tIHJpZ2h0J10pLFxuXG4gIC8qKiBBIGxhYmVsIGNhbiByZWR1Y2UgaXRzIGNvbXBsZXhpdHkuICovXG4gIGJhc2ljOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEEgbGFiZWwgY2FuIGJlIGNpcmN1bGFyLiAqL1xuICBjaXJjdWxhcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBDb2xvciBvZiB0aGUgbGFiZWwuICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoU1VJLkNPTE9SUyksXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBsYWJlbCBjYW4gcG9zaXRpb24gaXRzZWxmIGluIHRoZSBjb3JuZXIgb2YgYW4gZWxlbWVudC4gKi9cbiAgY29ybmVyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdyaWdodCddKV0pLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIExhYmVsRGV0YWlsLiAqL1xuICBkZXRhaWw6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBGb3JtYXRzIHRoZSBsYWJlbCBhcyBhIGRvdC4gKi9cbiAgZW1wdHk6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbUHJvcFR5cGVzLmJvb2wsIGN1c3RvbVByb3BUeXBlcy5kZW1hbmQoWydjaXJjdWxhciddKV0pLFxuXG4gIC8qKiBGbG9hdCBhYm92ZSBhbm90aGVyIGVsZW1lbnQgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gKi9cbiAgZmxvYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGhvcml6b250YWwgbGFiZWwgaXMgZm9ybWF0dGVkIHRvIGxhYmVsIGNvbnRlbnQgYWxvbmctc2lkZSBpdCBob3Jpem9udGFsbHkuICovXG4gIGhvcml6b250YWw6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEljb24uICovXG4gIGljb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIGxhYmVsIGNhbiBiZSBmb3JtYXR0ZWQgdG8gZW1waGFzaXplIGFuIGltYWdlIG9yIHByb3AgY2FuIGJlIHVzZWQgYXMgc2hvcnRoYW5kIGZvciBJbWFnZS4gKi9cbiAgaW1hZ2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZF0pLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gY2xpY2suXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQWRkcyBhbiBcInhcIiBpY29uLCBjYWxsZWQgd2hlbiBcInhcIiBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25SZW1vdmU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBBIGxhYmVsIGNhbiBwb2ludCB0byBjb250ZW50IG5leHQgdG8gaXQuICovXG4gIHBvaW50aW5nOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnYWJvdmUnLCAnYmVsb3cnLCAnbGVmdCcsICdyaWdodCddKV0pLFxuXG4gIC8qKiBBIGxhYmVsIGNhbiBwcm9tcHQgZm9yIGFuIGVycm9yIGluIHlvdXIgZm9ybXMuICovXG4gIHByb21wdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgSWNvbiB0byBhcHBlYXIgYXMgdGhlIGxhc3QgY2hpbGQgYW5kIHRyaWdnZXIgb25SZW1vdmUuICovXG4gIHJlbW92ZUljb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIGxhYmVsIGNhbiBhcHBlYXIgYXMgYSByaWJib24gYXR0YWNoaW5nIGl0c2VsZiB0byBhbiBlbGVtZW50LiAqL1xuICByaWJib246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWydyaWdodCddKV0pLFxuXG4gIC8qKiBBIGxhYmVsIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFNVSS5TSVpFUyksXG5cbiAgLyoqIEEgbGFiZWwgY2FuIGFwcGVhciBhcyBhIHRhZy4gKi9cbiAgdGFnOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuTGFiZWwuRGV0YWlsID0gTGFiZWxEZXRhaWw7XG5MYWJlbC5Hcm91cCA9IExhYmVsR3JvdXA7XG5MYWJlbC5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KExhYmVsLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiB2YWx1ZVxuICB9O1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcblxuZnVuY3Rpb24gTGFiZWxEZXRhaWwocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnZGV0YWlsJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhMYWJlbERldGFpbCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShMYWJlbERldGFpbCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkxhYmVsRGV0YWlsLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuTGFiZWxEZXRhaWwucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbkxhYmVsRGV0YWlsLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoTGFiZWxEZXRhaWwsIGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiB2YWxcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTGFiZWxEZXRhaWw7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGxhYmVsIGNhbiBiZSBncm91cGVkLlxuICovXG5cbmZ1bmN0aW9uIExhYmVsR3JvdXAocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjaXJjdWxhciA9IHByb3BzLmNpcmN1bGFyLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICB0YWcgPSBwcm9wcy50YWc7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgY29sb3IsIHNpemUsIHVzZUtleU9ubHkoY2lyY3VsYXIsICdjaXJjdWxhcicpLCB1c2VLZXlPbmx5KHRhZywgJ3RhZycpLCAnbGFiZWxzJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhMYWJlbEdyb3VwLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKExhYmVsR3JvdXAsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5MYWJlbEdyb3VwLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjaXJjdWxhclwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29udGVudFwiLCBcInNpemVcIiwgXCJ0YWdcIl07XG5MYWJlbEdyb3VwLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBMYWJlbHMgY2FuIHNoYXJlIHNoYXBlcy4gKi9cbiAgY2lyY3VsYXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogTGFiZWwgZ3JvdXAgY2FuIHNoYXJlIGNvbG9ycyB0b2dldGhlci4gKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihTVUkuQ09MT1JTKSxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBMYWJlbCBncm91cCBjYW4gc2hhcmUgc2l6ZXMgdG9nZXRoZXIuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihTVUkuU0laRVMpLFxuXG4gIC8qKiBMYWJlbCBncm91cCBjYW4gc2hhcmUgdGFnIGZvcm1hdHRpbmcuICovXG4gIHRhZzogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IExhYmVsR3JvdXA7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vTGFiZWwnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlS2V5T25seSwgdXNlS2V5T3JWYWx1ZUFuZEtleSwgdXNlVmFsdWVBbmRLZXksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBMaXN0Q29udGVudCBmcm9tICcuL0xpc3RDb250ZW50JztcbmltcG9ydCBMaXN0RGVzY3JpcHRpb24gZnJvbSAnLi9MaXN0RGVzY3JpcHRpb24nO1xuaW1wb3J0IExpc3RIZWFkZXIgZnJvbSAnLi9MaXN0SGVhZGVyJztcbmltcG9ydCBMaXN0SWNvbiBmcm9tICcuL0xpc3RJY29uJztcbmltcG9ydCBMaXN0SXRlbSBmcm9tICcuL0xpc3RJdGVtJztcbmltcG9ydCBMaXN0TGlzdCBmcm9tICcuL0xpc3RMaXN0Jztcbi8qKlxuICogQSBsaXN0IGdyb3VwcyByZWxhdGVkIGNvbnRlbnQuXG4gKi9cblxudmFyIExpc3QgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoTGlzdCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTGlzdCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUl0ZW1PdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUsIGl0ZW1Qcm9wcykge1xuICAgICAgICAgIF9pbnZva2UocHJlZGVmaW5lZFByb3BzLCAnb25DbGljaycsIGUsIGl0ZW1Qcm9wcyk7XG5cbiAgICAgICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25JdGVtQ2xpY2snLCBlLCBpdGVtUHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gTGlzdC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFuaW1hdGVkID0gX3RoaXMkcHJvcHMuYW5pbWF0ZWQsXG4gICAgICAgIGJ1bGxldGVkID0gX3RoaXMkcHJvcHMuYnVsbGV0ZWQsXG4gICAgICAgIGNlbGxlZCA9IF90aGlzJHByb3BzLmNlbGxlZCxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMuY29udGVudCxcbiAgICAgICAgZGl2aWRlZCA9IF90aGlzJHByb3BzLmRpdmlkZWQsXG4gICAgICAgIGZsb2F0ZWQgPSBfdGhpcyRwcm9wcy5mbG9hdGVkLFxuICAgICAgICBob3Jpem9udGFsID0gX3RoaXMkcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgICAgaW52ZXJ0ZWQgPSBfdGhpcyRwcm9wcy5pbnZlcnRlZCxcbiAgICAgICAgaXRlbXMgPSBfdGhpcyRwcm9wcy5pdGVtcyxcbiAgICAgICAgbGluayA9IF90aGlzJHByb3BzLmxpbmssXG4gICAgICAgIG9yZGVyZWQgPSBfdGhpcyRwcm9wcy5vcmRlcmVkLFxuICAgICAgICByZWxheGVkID0gX3RoaXMkcHJvcHMucmVsYXhlZCxcbiAgICAgICAgc2VsZWN0aW9uID0gX3RoaXMkcHJvcHMuc2VsZWN0aW9uLFxuICAgICAgICBzaXplID0gX3RoaXMkcHJvcHMuc2l6ZSxcbiAgICAgICAgdmVydGljYWxBbGlnbiA9IF90aGlzJHByb3BzLnZlcnRpY2FsQWxpZ247XG4gICAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBzaXplLCB1c2VLZXlPbmx5KGFuaW1hdGVkLCAnYW5pbWF0ZWQnKSwgdXNlS2V5T25seShidWxsZXRlZCwgJ2J1bGxldGVkJyksIHVzZUtleU9ubHkoY2VsbGVkLCAnY2VsbGVkJyksIHVzZUtleU9ubHkoZGl2aWRlZCwgJ2RpdmlkZWQnKSwgdXNlS2V5T25seShob3Jpem9udGFsLCAnaG9yaXpvbnRhbCcpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlS2V5T25seShsaW5rLCAnbGluaycpLCB1c2VLZXlPbmx5KG9yZGVyZWQsICdvcmRlcmVkJyksIHVzZUtleU9ubHkoc2VsZWN0aW9uLCAnc2VsZWN0aW9uJyksIHVzZUtleU9yVmFsdWVBbmRLZXkocmVsYXhlZCwgJ3JlbGF4ZWQnKSwgdXNlVmFsdWVBbmRLZXkoZmxvYXRlZCwgJ2Zsb2F0ZWQnKSwgdXNlVmVydGljYWxBbGlnblByb3AodmVydGljYWxBbGlnbiksICdsaXN0JywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKExpc3QsIHRoaXMucHJvcHMpO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKExpc3QsIHRoaXMucHJvcHMpO1xuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7XG4gICAgICAgIHJvbGU6IFwibGlzdFwiLFxuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICAgIH0sIHJlc3QpLCBjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHtcbiAgICAgICAgcm9sZTogXCJsaXN0XCIsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgICAgfSwgcmVzdCksIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe1xuICAgICAgcm9sZTogXCJsaXN0XCIsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9LCByZXN0KSwgX21hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBMaXN0SXRlbS5jcmVhdGUoaXRlbSwge1xuICAgICAgICBvdmVycmlkZVByb3BzOiBfdGhpczIuaGFuZGxlSXRlbU92ZXJyaWRlc1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBMaXN0O1xufShDb21wb25lbnQpO1xuXG5MaXN0LmhhbmRsZWRQcm9wcyA9IFtcImFuaW1hdGVkXCIsIFwiYXNcIiwgXCJidWxsZXRlZFwiLCBcImNlbGxlZFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRpdmlkZWRcIiwgXCJmbG9hdGVkXCIsIFwiaG9yaXpvbnRhbFwiLCBcImludmVydGVkXCIsIFwiaXRlbXNcIiwgXCJsaW5rXCIsIFwib25JdGVtQ2xpY2tcIiwgXCJvcmRlcmVkXCIsIFwicmVsYXhlZFwiLCBcInNlbGVjdGlvblwiLCBcInNpemVcIiwgXCJ2ZXJ0aWNhbEFsaWduXCJdO1xuTGlzdC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIGxpc3QgY2FuIGFuaW1hdGUgdG8gc2V0IHRoZSBjdXJyZW50IGl0ZW0gYXBhcnQgZnJvbSB0aGUgbGlzdC4gKi9cbiAgYW5pbWF0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGxpc3QgY2FuIG1hcmsgaXRlbXMgd2l0aCBhIGJ1bGxldC4gKi9cbiAgYnVsbGV0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGxpc3QgY2FuIGRpdmlkZSBpdHMgaXRlbXMgaW50byBjZWxscy4gKi9cbiAgY2VsbGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgbGlzdCBjYW4gc2hvdyBkaXZpc2lvbnMgYmV0d2VlbiBjb250ZW50LiAqL1xuICBkaXZpZGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQW4gbGlzdCBjYW4gYmUgZmxvYXRlZCBsZWZ0IG9yIHJpZ2h0LiAqL1xuICBmbG9hdGVkOiBQcm9wVHlwZXMub25lT2YoU1VJLkZMT0FUUyksXG5cbiAgLyoqIEEgbGlzdCBjYW4gYmUgZm9ybWF0dGVkIHRvIGhhdmUgaXRlbXMgYXBwZWFyIGhvcml6b250YWxseS4gKi9cbiAgaG9yaXpvbnRhbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgbGlzdCBjYW4gYmUgaW52ZXJ0ZWQgdG8gYXBwZWFyIG9uIGEgZGFyayBiYWNrZ3JvdW5kLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBhcnJheSBvZiBwcm9wcyBmb3IgTGlzdEl0ZW0uICovXG4gIGl0ZW1zOiBjdXN0b21Qcm9wVHlwZXMuY29sbGVjdGlvblNob3J0aGFuZCxcblxuICAvKiogQSBsaXN0IGNhbiBiZSBzcGVjaWFsbHkgZm9ybWF0dGVkIGZvciBuYXZpZ2F0aW9uIGxpbmtzLiAqL1xuICBsaW5rOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogb25DbGljayBoYW5kbGVyIGZvciBMaXN0SXRlbS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY2hpbGRyZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgaXRlbSBwcm9wcy5cbiAgICovXG4gIG9uSXRlbUNsaWNrOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2NoaWxkcmVuJ10pLCBQcm9wVHlwZXMuZnVuY10pLFxuXG4gIC8qKiBBIGxpc3QgY2FuIGJlIG9yZGVyZWQgbnVtZXJpY2FsbHkuICovXG4gIG9yZGVyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGxpc3QgY2FuIHJlbGF4IGl0cyBwYWRkaW5nIHRvIHByb3ZpZGUgbW9yZSBuZWdhdGl2ZSBzcGFjZS4gKi9cbiAgcmVsYXhlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ3ZlcnknXSldKSxcblxuICAvKiogQSBzZWxlY3Rpb24gbGlzdCBmb3JtYXRzIGxpc3QgaXRlbXMgYXMgcG9zc2libGUgY2hvaWNlcy4gKi9cbiAgc2VsZWN0aW9uOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBsaXN0IGNhbiB2YXJ5IGluIHNpemUuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihTVUkuU0laRVMpLFxuXG4gIC8qKiBBbiBlbGVtZW50IGluc2lkZSBhIGxpc3QgY2FuIGJlIHZlcnRpY2FsbHkgYWxpZ25lZC4gKi9cbiAgdmVydGljYWxBbGlnbjogUHJvcFR5cGVzLm9uZU9mKFNVSS5WRVJUSUNBTF9BTElHTk1FTlRTKVxufSA6IHt9O1xuTGlzdC5Db250ZW50ID0gTGlzdENvbnRlbnQ7XG5MaXN0LkRlc2NyaXB0aW9uID0gTGlzdERlc2NyaXB0aW9uO1xuTGlzdC5IZWFkZXIgPSBMaXN0SGVhZGVyO1xuTGlzdC5JY29uID0gTGlzdEljb247XG5MaXN0Lkl0ZW0gPSBMaXN0SXRlbTtcbkxpc3QuTGlzdCA9IExpc3RMaXN0O1xuZXhwb3J0IGRlZmF1bHQgTGlzdDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlVmFsdWVBbmRLZXksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBMaXN0RGVzY3JpcHRpb24gZnJvbSAnLi9MaXN0RGVzY3JpcHRpb24nO1xuaW1wb3J0IExpc3RIZWFkZXIgZnJvbSAnLi9MaXN0SGVhZGVyJztcbi8qKlxuICogQSBsaXN0IGl0ZW0gY2FuIGNvbnRhaW4gYSBjb250ZW50LlxuICovXG5cbmZ1bmN0aW9uIExpc3RDb250ZW50KHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZmxvYXRlZCA9IHByb3BzLmZsb2F0ZWQsXG4gICAgICBoZWFkZXIgPSBwcm9wcy5oZWFkZXIsXG4gICAgICB2ZXJ0aWNhbEFsaWduID0gcHJvcHMudmVydGljYWxBbGlnbjtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VWYWx1ZUFuZEtleShmbG9hdGVkLCAnZmxvYXRlZCcpLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCh2ZXJ0aWNhbEFsaWduKSwgJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKExpc3RDb250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKExpc3RDb250ZW50LCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBMaXN0SGVhZGVyLmNyZWF0ZShoZWFkZXIpLCBMaXN0RGVzY3JpcHRpb24uY3JlYXRlKGRlc2NyaXB0aW9uKSwgY29udGVudCk7XG59XG5cbkxpc3RDb250ZW50LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGVzY3JpcHRpb25cIiwgXCJmbG9hdGVkXCIsIFwiaGVhZGVyXCIsIFwidmVydGljYWxBbGlnblwiXTtcbkxpc3RDb250ZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIExpc3REZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBbiBsaXN0IGNvbnRlbnQgY2FuIGJlIGZsb2F0ZWQgbGVmdCBvciByaWdodC4gKi9cbiAgZmxvYXRlZDogUHJvcFR5cGVzLm9uZU9mKFNVSS5GTE9BVFMpLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIExpc3RIZWFkZXIuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEFuIGVsZW1lbnQgaW5zaWRlIGEgbGlzdCBjYW4gYmUgdmVydGljYWxseSBhbGlnbmVkLiAqL1xuICB2ZXJ0aWNhbEFsaWduOiBQcm9wVHlwZXMub25lT2YoU1VJLlZFUlRJQ0FMX0FMSUdOTUVOVFMpXG59IDoge307XG5MaXN0Q29udGVudC5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KExpc3RDb250ZW50LCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTGlzdENvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBsaXN0IGl0ZW0gY2FuIGNvbnRhaW4gYSBkZXNjcmlwdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBMaXN0RGVzY3JpcHRpb24ocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeChjbGFzc05hbWUsICdkZXNjcmlwdGlvbicpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKExpc3REZXNjcmlwdGlvbiwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShMaXN0RGVzY3JpcHRpb24sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5MaXN0RGVzY3JpcHRpb24uaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5MaXN0RGVzY3JpcHRpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbkxpc3REZXNjcmlwdGlvbi5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KExpc3REZXNjcmlwdGlvbiwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IExpc3REZXNjcmlwdGlvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGxpc3QgaXRlbSBjYW4gY29udGFpbiBhIGhlYWRlci5cbiAqL1xuXG5mdW5jdGlvbiBMaXN0SGVhZGVyKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2hlYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoTGlzdEhlYWRlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShMaXN0SGVhZGVyLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuTGlzdEhlYWRlci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbkxpc3RIZWFkZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbkxpc3RIZWFkZXIuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShMaXN0SGVhZGVyLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTGlzdEhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlVmVydGljYWxBbGlnblByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vSWNvbi9JY29uJztcbi8qKlxuICogQSBsaXN0IGl0ZW0gY2FuIGNvbnRhaW4gYW4gaWNvbi5cbiAqL1xuXG5mdW5jdGlvbiBMaXN0SWNvbihwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgdmVydGljYWxBbGlnbiA9IHByb3BzLnZlcnRpY2FsQWxpZ247XG4gIHZhciBjbGFzc2VzID0gY3godXNlVmVydGljYWxBbGlnblByb3AodmVydGljYWxBbGlnbiksIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoTGlzdEljb24sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb24sIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pKTtcbn1cblxuTGlzdEljb24uaGFuZGxlZFByb3BzID0gW1wiY2xhc3NOYW1lXCIsIFwidmVydGljYWxBbGlnblwiXTtcbkxpc3RJY29uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBbiBlbGVtZW50IGluc2lkZSBhIGxpc3QgY2FuIGJlIHZlcnRpY2FsbHkgYWxpZ25lZC4gKi9cbiAgdmVydGljYWxBbGlnbjogUHJvcFR5cGVzLm9uZU9mKFNVSS5WRVJUSUNBTF9BTElHTk1FTlRTKVxufSA6IHt9O1xuTGlzdEljb24uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShMaXN0SWNvbiwgZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBuYW1lXG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IExpc3RJY29uOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2lzUGxhaW5PYmplY3QgZnJvbSBcImxvZGFzaC1lcy9pc1BsYWluT2JqZWN0XCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEltYWdlIGZyb20gJy4uL0ltYWdlJztcbmltcG9ydCBMaXN0Q29udGVudCBmcm9tICcuL0xpc3RDb250ZW50JztcbmltcG9ydCBMaXN0RGVzY3JpcHRpb24gZnJvbSAnLi9MaXN0RGVzY3JpcHRpb24nO1xuaW1wb3J0IExpc3RIZWFkZXIgZnJvbSAnLi9MaXN0SGVhZGVyJztcbmltcG9ydCBMaXN0SWNvbiBmcm9tICcuL0xpc3RJY29uJztcbi8qKlxuICogQSBsaXN0IGl0ZW0gY2FuIGNvbnRhaW4gYSBzZXQgb2YgaXRlbXMuXG4gKi9cblxudmFyIExpc3RJdGVtID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKExpc3RJdGVtLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMaXN0SXRlbSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBkaXNhYmxlZCA9IF90aGlzLnByb3BzLmRpc2FibGVkO1xuICAgICAgaWYgKCFkaXNhYmxlZCkgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xpY2snLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMaXN0SXRlbS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzLmNvbnRlbnQsXG4gICAgICAgIGRlc2NyaXB0aW9uID0gX3RoaXMkcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIGhlYWRlciA9IF90aGlzJHByb3BzLmhlYWRlcixcbiAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzLmljb24sXG4gICAgICAgIGltYWdlID0gX3RoaXMkcHJvcHMuaW1hZ2UsXG4gICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMudmFsdWU7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoTGlzdEl0ZW0sIHRoaXMucHJvcHMpO1xuICAgIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgdXNlS2V5T25seShkaXNhYmxlZCwgJ2Rpc2FibGVkJyksIHVzZUtleU9ubHkoRWxlbWVudFR5cGUgIT09ICdsaScsICdpdGVtJyksIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhMaXN0SXRlbSwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIHZhbHVlUHJvcCA9IEVsZW1lbnRUeXBlID09PSAnbGknID8ge1xuICAgICAgdmFsdWU6IHZhbHVlXG4gICAgfSA6IHtcbiAgICAgICdkYXRhLXZhbHVlJzogdmFsdWVcbiAgICB9O1xuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgdmFsdWVQcm9wLCB7XG4gICAgICAgIHJvbGU6IFwibGlzdGl0ZW1cIixcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9LCByZXN0KSwgY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIHZhciBpY29uRWxlbWVudCA9IExpc3RJY29uLmNyZWF0ZShpY29uLCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIGltYWdlRWxlbWVudCA9IEltYWdlLmNyZWF0ZShpbWFnZSwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pOyAvLyBTZWUgZGVzY3JpcHRpb24gb2YgYGNvbnRlbnRgIHByb3AgZm9yIGV4cGxhbmF0aW9uIGFib3V0IHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS5cblxuICAgIGlmICghIC8qI19fUFVSRV9fKi9pc1ZhbGlkRWxlbWVudChjb250ZW50KSAmJiBfaXNQbGFpbk9iamVjdChjb250ZW50KSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgdmFsdWVQcm9wLCB7XG4gICAgICAgIHJvbGU6IFwibGlzdGl0ZW1cIixcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9LCByZXN0KSwgaWNvbkVsZW1lbnQgfHwgaW1hZ2VFbGVtZW50LCBMaXN0Q29udGVudC5jcmVhdGUoY29udGVudCwge1xuICAgICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlLFxuICAgICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgICBoZWFkZXI6IGhlYWRlcixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb25cbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHZhciBoZWFkZXJFbGVtZW50ID0gTGlzdEhlYWRlci5jcmVhdGUoaGVhZGVyLCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIGRlc2NyaXB0aW9uRWxlbWVudCA9IExpc3REZXNjcmlwdGlvbi5jcmVhdGUoZGVzY3JpcHRpb24sIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KTtcblxuICAgIGlmIChpY29uRWxlbWVudCB8fCBpbWFnZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHZhbHVlUHJvcCwge1xuICAgICAgICByb2xlOiBcImxpc3RpdGVtXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSwgcmVzdCksIGljb25FbGVtZW50IHx8IGltYWdlRWxlbWVudCwgKGNvbnRlbnQgfHwgaGVhZGVyRWxlbWVudCB8fCBkZXNjcmlwdGlvbkVsZW1lbnQpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3RDb250ZW50LCBudWxsLCBoZWFkZXJFbGVtZW50LCBkZXNjcmlwdGlvbkVsZW1lbnQsIGNvbnRlbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCB2YWx1ZVByb3AsIHtcbiAgICAgIHJvbGU6IFwibGlzdGl0ZW1cIixcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICB9LCByZXN0KSwgaGVhZGVyRWxlbWVudCwgZGVzY3JpcHRpb25FbGVtZW50LCBjb250ZW50KTtcbiAgfTtcblxuICByZXR1cm4gTGlzdEl0ZW07XG59KENvbXBvbmVudCk7XG5cbkxpc3RJdGVtLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGVzY3JpcHRpb25cIiwgXCJkaXNhYmxlZFwiLCBcImhlYWRlclwiLCBcImljb25cIiwgXCJpbWFnZVwiLCBcIm9uQ2xpY2tcIiwgXCJ2YWx1ZVwiXTtcbkxpc3RJdGVtLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgbGlzdCBpdGVtIGNhbiBhY3RpdmUuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuXG4gICAqXG4gICAqIEhlYWRzIHVwIVxuICAgKlxuICAgKiBUaGlzIGlzIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdGhhbiB0aGUgdHlwaWNhbCBgY29udGVudGAgcHJvcCBzaW5jZVxuICAgKiB0aGUgd3JhcHBpbmcgTGlzdENvbnRlbnQgaXMgbm90IHVzZWQgd2hlbiB0aGVyZSdzIG5vIGljb24gb3IgaW1hZ2UuXG4gICAqXG4gICAqIElmIHlvdSBwYXNzIGNvbnRlbnQgYXM6XG4gICAqIC0gYW4gZWxlbWVudC9saXRlcmFsLCBpdCdzIHRyZWF0ZWQgYXMgdGhlIHNpYmxpbmcgbm9kZSB0b1xuICAgKiBoZWFkZXIvZGVzY3JpcHRpb24gKHdoZXRoZXIgd3JhcHBlZCBpbiBJdGVtLkNvbnRlbnQgb3Igbm90KS5cbiAgICogLSBhIHByb3BzIG9iamVjdCwgaXQgZm9yY2VzIHRoZSBwcmVzZW5jZSBvZiBJdGVtLkNvbnRlbnQgYW5kIHBhc3NlcyB0aG9zZVxuICAgKiBwcm9wcyB0byBpdC4gSWYgeW91IHBhc3MgYSBjb250ZW50IHByb3Agd2l0aGluIHRoYXQgcHJvcHMgb2JqZWN0LCBpdFxuICAgKiB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIHNpYmxpbmcgbm9kZSB0byBoZWFkZXIvZGVzY3JpcHRpb24uXG4gICAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBMaXN0RGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBsaXN0IGl0ZW0gY2FuIGRpc2FibGVkLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgTGlzdEhlYWRlci4gKi9cbiAgaGVhZGVyOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBMaXN0SWNvbi4gKi9cbiAgaWNvbjogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydpbWFnZSddKSwgY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRdKSxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJbWFnZS4gKi9cbiAgaW1hZ2U6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnaWNvbiddKSwgY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRdKSxcblxuICAvKiogQSBMaXN0SXRlbSBjYW4gYmUgY2xpY2tlZCAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogQSB2YWx1ZSBmb3IgYW4gb3JkZXJlZCBsaXN0LiAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuTGlzdEl0ZW0uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShMaXN0SXRlbSwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IExpc3RJdGVtOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgbGlzdCBjYW4gY29udGFpbiBhIHN1YiBsaXN0LlxuICovXG5cbmZ1bmN0aW9uIExpc3RMaXN0KHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoTGlzdExpc3QsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoTGlzdExpc3QsIHByb3BzKTtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KEVsZW1lbnRUeXBlICE9PSAndWwnICYmIEVsZW1lbnRUeXBlICE9PSAnb2wnLCAnbGlzdCcpLCBjbGFzc05hbWUpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkxpc3RMaXN0LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuTGlzdExpc3QucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IExpc3RMaXN0OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0xpc3QnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBsb2FkZXIgYWxlcnRzIGEgdXNlciB0byB3YWl0IGZvciBhbiBhY3Rpdml0eSB0byBjb21wbGV0ZS5cbiAqIEBzZWUgRGltbWVyXG4gKi9cblxuZnVuY3Rpb24gTG9hZGVyKHByb3BzKSB7XG4gIHZhciBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgaW5kZXRlcm1pbmF0ZSA9IHByb3BzLmluZGV0ZXJtaW5hdGUsXG4gICAgICBpbmxpbmUgPSBwcm9wcy5pbmxpbmUsXG4gICAgICBpbnZlcnRlZCA9IHByb3BzLmludmVydGVkLFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemU7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgc2l6ZSwgdXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgdXNlS2V5T25seShkaXNhYmxlZCwgJ2Rpc2FibGVkJyksIHVzZUtleU9ubHkoaW5kZXRlcm1pbmF0ZSwgJ2luZGV0ZXJtaW5hdGUnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkoY2hpbGRyZW4gfHwgY29udGVudCwgJ3RleHQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShpbmxpbmUsICdpbmxpbmUnKSwgJ2xvYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoTG9hZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKExvYWRlciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkxvYWRlci5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRpc2FibGVkXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcImlubGluZVwiLCBcImludmVydGVkXCIsIFwic2l6ZVwiXTtcbkxvYWRlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIGxvYWRlciBjYW4gYmUgYWN0aXZlIG9yIHZpc2libGUuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIGxvYWRlciBjYW4gYmUgZGlzYWJsZWQgb3IgaGlkZGVuLiAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgbG9hZGVyIGNhbiBzaG93IGl0J3MgdW5zdXJlIG9mIGhvdyBsb25nIGEgdGFzayB3aWxsIHRha2UuICovXG4gIGluZGV0ZXJtaW5hdGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBMb2FkZXJzIGNhbiBhcHBlYXIgaW5saW5lIHdpdGggY29udGVudC4gKi9cbiAgaW5saW5lOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnY2VudGVyZWQnXSldKSxcblxuICAvKiogTG9hZGVycyBjYW4gaGF2ZSB0aGVpciBjb2xvcnMgaW52ZXJ0ZWQuICovXG4gIGludmVydGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogTG9hZGVycyBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihTVUkuU0laRVMpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBMb2FkZXI7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vTG9hZGVyJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IFBsYWNlaG9sZGVySGVhZGVyIGZyb20gJy4vUGxhY2Vob2xkZXJIZWFkZXInO1xuaW1wb3J0IFBsYWNlaG9sZGVySW1hZ2UgZnJvbSAnLi9QbGFjZWhvbGRlckltYWdlJztcbmltcG9ydCBQbGFjZWhvbGRlckxpbmUgZnJvbSAnLi9QbGFjZWhvbGRlckxpbmUnO1xuaW1wb3J0IFBsYWNlaG9sZGVyUGFyYWdyYXBoIGZyb20gJy4vUGxhY2Vob2xkZXJQYXJhZ3JhcGgnO1xuLyoqXG4gKiBBIHBsYWNlaG9sZGVyIGlzIHVzZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgY29udGVudCB0aGF0IHNvb24gd2lsbCBhcHBlYXIgaW4gYSBsYXlvdXQuXG4gKi9cblxuZnVuY3Rpb24gUGxhY2Vob2xkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGZsdWlkID0gcHJvcHMuZmx1aWQsXG4gICAgICBpbnZlcnRlZCA9IHByb3BzLmludmVydGVkO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHVzZUtleU9ubHkoZmx1aWQsICdmbHVpZCcpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgJ3BsYWNlaG9sZGVyJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhQbGFjZWhvbGRlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShQbGFjZWhvbGRlciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cblBsYWNlaG9sZGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZmx1aWRcIiwgXCJpbnZlcnRlZFwiXTtcblBsYWNlaG9sZGVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIGZsdWlkIHBsYWNlaG9sZGVyIHRha2VzIHVwIHRoZSB3aWR0aCBvZiBpdHMgY29udGFpbmVyLiAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgcGxhY2Vob2xkZXIgY2FuIGhhdmUgdGhlaXIgY29sb3JzIGludmVydGVkLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcblBsYWNlaG9sZGVyLkhlYWRlciA9IFBsYWNlaG9sZGVySGVhZGVyO1xuUGxhY2Vob2xkZXIuSW1hZ2UgPSBQbGFjZWhvbGRlckltYWdlO1xuUGxhY2Vob2xkZXIuTGluZSA9IFBsYWNlaG9sZGVyTGluZTtcblBsYWNlaG9sZGVyLlBhcmFncmFwaCA9IFBsYWNlaG9sZGVyUGFyYWdyYXBoO1xuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBwbGFjZWhvbGRlciBjYW4gY29udGFpbiBhIGhlYWRlci5cbiAqL1xuXG5mdW5jdGlvbiBQbGFjZWhvbGRlckhlYWRlcihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgaW1hZ2UgPSBwcm9wcy5pbWFnZTtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGltYWdlLCAnaW1hZ2UnKSwgJ2hlYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUGxhY2Vob2xkZXJIZWFkZXIsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUGxhY2Vob2xkZXJIZWFkZXIsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5QbGFjZWhvbGRlckhlYWRlci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImltYWdlXCJdO1xuUGxhY2Vob2xkZXJIZWFkZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgcGxhY2Vob2xkZXIgY2FuIGNvbnRhaW4gYW4gaW1hZ2UuICovXG4gIGltYWdlOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJIZWFkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBwbGFjZWhvbGRlciBjYW4gY29udGFpbiBhbiBpbWFnZS5cbiAqL1xuXG5mdW5jdGlvbiBQbGFjZWhvbGRlckltYWdlKHByb3BzKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBzcXVhcmUgPSBwcm9wcy5zcXVhcmUsXG4gICAgICByZWN0YW5ndWxhciA9IHByb3BzLnJlY3Rhbmd1bGFyO1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkoc3F1YXJlLCAnc3F1YXJlJyksIHVzZUtleU9ubHkocmVjdGFuZ3VsYXIsICdyZWN0YW5ndWxhcicpLCAnaW1hZ2UnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFBsYWNlaG9sZGVySW1hZ2UsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUGxhY2Vob2xkZXJJbWFnZSwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pKTtcbn1cblxuUGxhY2Vob2xkZXJJbWFnZS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNsYXNzTmFtZVwiLCBcInJlY3Rhbmd1bGFyXCIsIFwic3F1YXJlXCJdO1xuUGxhY2Vob2xkZXJJbWFnZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQW4gaW1hZ2UgY2FuIG1vZGlmeSBzaXplIGNvcnJlY3RseSB3aXRoIHJlc3BvbnNpdmUgc3R5bGVzLiAqL1xuICBzcXVhcmU6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsncmVjdGFuZ3VsYXInXSksIFByb3BUeXBlcy5ib29sXSksXG5cbiAgLyoqIEFuIGltYWdlIGNhbiBtb2RpZnkgc2l6ZSBjb3JyZWN0bHkgd2l0aCByZXNwb25zaXZlIHN0eWxlcy4gKi9cbiAgcmVjdGFuZ3VsYXI6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnc3F1YXJlJ10pLCBQcm9wVHlwZXMuYm9vbF0pXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlckltYWdlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIHBsYWNlaG9sZGVyIGNhbiBjb250YWluIGhhdmUgbGluZXMgb2YgdGV4dC5cbiAqL1xuXG5mdW5jdGlvbiBQbGFjZWhvbGRlckxpbmUocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnbGluZScsIGxlbmd0aCwgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhQbGFjZWhvbGRlckxpbmUsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUGxhY2Vob2xkZXJMaW5lLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSkpO1xufVxuXG5QbGFjZWhvbGRlckxpbmUuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjbGFzc05hbWVcIiwgXCJsZW5ndGhcIl07XG5QbGFjZWhvbGRlckxpbmUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgbGluZSBjYW4gc3BlY2lmeSBob3cgbG9uZyBpdHMgY29udGVudHMgc2hvdWxkIGFwcGVhci4gKi9cbiAgbGVuZ3RoOiBQcm9wVHlwZXMub25lT2YoWydmdWxsJywgJ3ZlcnkgbG9uZycsICdsb25nJywgJ21lZGl1bScsICdzaG9ydCcsICd2ZXJ5IHNob3J0J10pXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBQbGFjZWhvbGRlckxpbmU7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBwbGFjZWhvbGRlciBjYW4gY29udGFpbiBhIHBhcmFncmFwaC5cbiAqL1xuXG5mdW5jdGlvbiBQbGFjZWhvbGRlclBhcmFncmFwaChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdwYXJhZ3JhcGgnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFBsYWNlaG9sZGVyUGFyYWdyYXBoLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFBsYWNlaG9sZGVyUGFyYWdyYXBoLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuUGxhY2Vob2xkZXJQYXJhZ3JhcGguaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5QbGFjZWhvbGRlclBhcmFncmFwaC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgUGxhY2Vob2xkZXJQYXJhZ3JhcGg7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vUGxhY2Vob2xkZXInO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSByYWlsIGlzIHVzZWQgdG8gc2hvdyBhY2NvbXBhbnlpbmcgY29udGVudCBvdXRzaWRlIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBtYWluIHZpZXcgb2YgYSBzaXRlLlxuICovXG5cbmZ1bmN0aW9uIFJhaWwocHJvcHMpIHtcbiAgdmFyIGF0dGFjaGVkID0gcHJvcHMuYXR0YWNoZWQsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2xvc2UgPSBwcm9wcy5jbG9zZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZGl2aWRpbmcgPSBwcm9wcy5kaXZpZGluZyxcbiAgICAgIGludGVybmFsID0gcHJvcHMuaW50ZXJuYWwsXG4gICAgICBwb3NpdGlvbiA9IHByb3BzLnBvc2l0aW9uLFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemU7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgcG9zaXRpb24sIHNpemUsIHVzZUtleU9ubHkoYXR0YWNoZWQsICdhdHRhY2hlZCcpLCB1c2VLZXlPbmx5KGRpdmlkaW5nLCAnZGl2aWRpbmcnKSwgdXNlS2V5T25seShpbnRlcm5hbCwgJ2ludGVybmFsJyksIHVzZUtleU9yVmFsdWVBbmRLZXkoY2xvc2UsICdjbG9zZScpLCAncmFpbCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUmFpbCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShSYWlsLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuUmFpbC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImF0dGFjaGVkXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjbG9zZVwiLCBcImNvbnRlbnRcIiwgXCJkaXZpZGluZ1wiLCBcImludGVybmFsXCIsIFwicG9zaXRpb25cIiwgXCJzaXplXCJdO1xuUmFpbC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIHJhaWwgY2FuIGFwcGVhciBhdHRhY2hlZCB0byB0aGUgbWFpbiB2aWV3cG9ydC4gKi9cbiAgYXR0YWNoZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgcmFpbCBjYW4gYXBwZWFyIGNsb3NlciB0byB0aGUgbWFpbiB2aWV3cG9ydC4gKi9cbiAgY2xvc2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd2ZXJ5J10pXSksXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSByYWlsIGNhbiBjcmVhdGUgYSBkaXZpc2lvbiBiZXR3ZWVuIGl0c2VsZiBhbmQgYSBjb250YWluZXIuICovXG4gIGRpdmlkaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSByYWlsIGNhbiBhdHRhY2ggaXRzZWxmIHRvIHRoZSBpbnNpZGUgb2YgYSBjb250YWluZXIuICovXG4gIGludGVybmFsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSByYWlsIGNhbiBiZSBwcmVzZW50ZWQgb24gdGhlIGxlZnQgb3IgcmlnaHQgc2lkZSBvZiBhIGNvbnRhaW5lci4gKi9cbiAgcG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihTVUkuRkxPQVRTKS5pc1JlcXVpcmVkLFxuXG4gIC8qKiBBIHJhaWwgY2FuIGhhdmUgZGlmZmVyZW50IHNpemVzLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnbWVkaXVtJykpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBSYWlsOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1JhaWwnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgUmV2ZWFsQ29udGVudCBmcm9tICcuL1JldmVhbENvbnRlbnQnO1xuLyoqXG4gKiBBIHJldmVhbCBkaXNwbGF5cyBhZGRpdGlvbmFsIGNvbnRlbnQgaW4gcGxhY2Ugb2YgcHJldmlvdXMgY29udGVudCB3aGVuIGFjdGl2YXRlZC5cbiAqL1xuXG5mdW5jdGlvbiBSZXZlYWwocHJvcHMpIHtcbiAgdmFyIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICAgIGFuaW1hdGVkID0gcHJvcHMuYW5pbWF0ZWQsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgaW5zdGFudCA9IHByb3BzLmluc3RhbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgYW5pbWF0ZWQsIHVzZUtleU9ubHkoYWN0aXZlLCAnYWN0aXZlJyksIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGluc3RhbnQsICdpbnN0YW50JyksICdyZXZlYWwnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFJldmVhbCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShSZXZlYWwsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5SZXZlYWwuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYW5pbWF0ZWRcIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRpc2FibGVkXCIsIFwiaW5zdGFudFwiXTtcblJldmVhbC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBbiBhY3RpdmUgcmV2ZWFsIGRpc3BsYXlzIGl0cyBoaWRkZW4gY29udGVudC4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQW4gYW5pbWF0aW9uIG5hbWUgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gUmV2ZWFsLiAqL1xuICBhbmltYXRlZDogUHJvcFR5cGVzLm9uZU9mKFsnZmFkZScsICdzbWFsbCBmYWRlJywgJ21vdmUnLCAnbW92ZSByaWdodCcsICdtb3ZlIHVwJywgJ21vdmUgZG93bicsICdyb3RhdGUnLCAncm90YXRlIGxlZnQnXSksXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIGRpc2FibGVkIHJldmVhbCB3aWxsIG5vdCBhbmltYXRlIHdoZW4gaG92ZXJlZC4gKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBbiBlbGVtZW50IGNhbiBzaG93IGl0cyBjb250ZW50IHdpdGhvdXQgZGVsYXkuICovXG4gIGluc3RhbnQ6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5SZXZlYWwuQ29udGVudCA9IFJldmVhbENvbnRlbnQ7XG5leHBvcnQgZGVmYXVsdCBSZXZlYWw7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBjb250ZW50IHN1Yi1jb21wb25lbnQgZm9yIHRoZSBSZXZlYWwuXG4gKi9cblxuZnVuY3Rpb24gUmV2ZWFsQ29udGVudChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgaGlkZGVuID0gcHJvcHMuaGlkZGVuLFxuICAgICAgdmlzaWJsZSA9IHByb3BzLnZpc2libGU7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShoaWRkZW4sICdoaWRkZW4nKSwgdXNlS2V5T25seSh2aXNpYmxlLCAndmlzaWJsZScpLCAnY29udGVudCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUmV2ZWFsQ29udGVudCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShSZXZlYWxDb250ZW50LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuUmV2ZWFsQ29udGVudC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImhpZGRlblwiLCBcInZpc2libGVcIl07XG5SZXZlYWxDb250ZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIHJldmVhbCBtYXkgY29udGFpbiBjb250ZW50IHRoYXQgaXMgdmlzaWJsZSBiZWZvcmUgaW50ZXJhY3Rpb24uICovXG4gIGhpZGRlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgcmV2ZWFsIG1heSBjb250YWluIGNvbnRlbnQgdGhhdCBpcyBoaWRkZW4gYmVmb3JlIHVzZXIgaW50ZXJhY3Rpb24uICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBSZXZlYWxDb250ZW50OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1JldmVhbCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZUtleU9yVmFsdWVBbmRLZXksIHVzZVRleHRBbGlnblByb3AsIHVzZVZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBTZWdtZW50R3JvdXAgZnJvbSAnLi9TZWdtZW50R3JvdXAnO1xuaW1wb3J0IFNlZ21lbnRJbmxpbmUgZnJvbSAnLi9TZWdtZW50SW5saW5lJztcbi8qKlxuICogQSBzZWdtZW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgZ3JvdXBpbmcgb2YgcmVsYXRlZCBjb250ZW50LlxuICovXG5cbmZ1bmN0aW9uIFNlZ21lbnQocHJvcHMpIHtcbiAgdmFyIGF0dGFjaGVkID0gcHJvcHMuYXR0YWNoZWQsXG4gICAgICBiYXNpYyA9IHByb3BzLmJhc2ljLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNpcmN1bGFyID0gcHJvcHMuY2lyY3VsYXIsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjbGVhcmluZyA9IHByb3BzLmNsZWFyaW5nLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbXBhY3QgPSBwcm9wcy5jb21wYWN0LFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkaXNhYmxlZCA9IHByb3BzLmRpc2FibGVkLFxuICAgICAgZmxvYXRlZCA9IHByb3BzLmZsb2F0ZWQsXG4gICAgICBpbnZlcnRlZCA9IHByb3BzLmludmVydGVkLFxuICAgICAgbG9hZGluZyA9IHByb3BzLmxvYWRpbmcsXG4gICAgICBwbGFjZWhvbGRlciA9IHByb3BzLnBsYWNlaG9sZGVyLFxuICAgICAgcGFkZGVkID0gcHJvcHMucGFkZGVkLFxuICAgICAgcGlsZWQgPSBwcm9wcy5waWxlZCxcbiAgICAgIHJhaXNlZCA9IHByb3BzLnJhaXNlZCxcbiAgICAgIHNlY29uZGFyeSA9IHByb3BzLnNlY29uZGFyeSxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc3RhY2tlZCA9IHByb3BzLnN0YWNrZWQsXG4gICAgICB0ZXJ0aWFyeSA9IHByb3BzLnRlcnRpYXJ5LFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWwgPSBwcm9wcy52ZXJ0aWNhbDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBjb2xvciwgc2l6ZSwgdXNlS2V5T25seShiYXNpYywgJ2Jhc2ljJyksIHVzZUtleU9ubHkoY2lyY3VsYXIsICdjaXJjdWxhcicpLCB1c2VLZXlPbmx5KGNsZWFyaW5nLCAnY2xlYXJpbmcnKSwgdXNlS2V5T25seShjb21wYWN0LCAnY29tcGFjdCcpLCB1c2VLZXlPbmx5KGRpc2FibGVkLCAnZGlzYWJsZWQnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkobG9hZGluZywgJ2xvYWRpbmcnKSwgdXNlS2V5T25seShwbGFjZWhvbGRlciwgJ3BsYWNlaG9sZGVyJyksIHVzZUtleU9ubHkocGlsZWQsICdwaWxlZCcpLCB1c2VLZXlPbmx5KHJhaXNlZCwgJ3JhaXNlZCcpLCB1c2VLZXlPbmx5KHNlY29uZGFyeSwgJ3NlY29uZGFyeScpLCB1c2VLZXlPbmx5KHN0YWNrZWQsICdzdGFja2VkJyksIHVzZUtleU9ubHkodGVydGlhcnksICd0ZXJ0aWFyeScpLCB1c2VLZXlPbmx5KHZlcnRpY2FsLCAndmVydGljYWwnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShhdHRhY2hlZCwgJ2F0dGFjaGVkJyksIHVzZUtleU9yVmFsdWVBbmRLZXkocGFkZGVkLCAncGFkZGVkJyksIHVzZVRleHRBbGlnblByb3AodGV4dEFsaWduKSwgdXNlVmFsdWVBbmRLZXkoZmxvYXRlZCwgJ2Zsb2F0ZWQnKSwgJ3NlZ21lbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFNlZ21lbnQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU2VnbWVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cblNlZ21lbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJhdHRhY2hlZFwiLCBcImJhc2ljXCIsIFwiY2hpbGRyZW5cIiwgXCJjaXJjdWxhclwiLCBcImNsYXNzTmFtZVwiLCBcImNsZWFyaW5nXCIsIFwiY29sb3JcIiwgXCJjb21wYWN0XCIsIFwiY29udGVudFwiLCBcImRpc2FibGVkXCIsIFwiZmxvYXRlZFwiLCBcImludmVydGVkXCIsIFwibG9hZGluZ1wiLCBcInBhZGRlZFwiLCBcInBpbGVkXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJyYWlzZWRcIiwgXCJzZWNvbmRhcnlcIiwgXCJzaXplXCIsIFwic3RhY2tlZFwiLCBcInRlcnRpYXJ5XCIsIFwidGV4dEFsaWduXCIsIFwidmVydGljYWxcIl07XG5TZWdtZW50Lkdyb3VwID0gU2VnbWVudEdyb3VwO1xuU2VnbWVudC5JbmxpbmUgPSBTZWdtZW50SW5saW5lO1xuU2VnbWVudC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBdHRhY2ggc2VnbWVudCB0byBvdGhlciBjb250ZW50LCBsaWtlIGEgaGVhZGVyLiAqL1xuICBhdHRhY2hlZDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdib3R0b20nXSldKSxcblxuICAvKiogQSBiYXNpYyBzZWdtZW50IGhhcyBubyBzcGVjaWFsIGZvcm1hdHRpbmcuICovXG4gIGJhc2ljOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEEgc2VnbWVudCBjYW4gYmUgY2lyY3VsYXIuICovXG4gIGNpcmN1bGFyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgc2VnbWVudCBjYW4gY2xlYXIgZmxvYXRlZCBjb250ZW50LiAqL1xuICBjbGVhcmluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNlZ21lbnQgY2FuIGJlIGNvbG9yZWQuICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoU1VJLkNPTE9SUyksXG5cbiAgLyoqIEEgc2VnbWVudCBtYXkgdGFrZSB1cCBvbmx5IGFzIG11Y2ggc3BhY2UgYXMgaXMgbmVjZXNzYXJ5LiAqL1xuICBjb21wYWN0OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIHNlZ21lbnQgbWF5IHNob3cgaXRzIGNvbnRlbnQgaXMgZGlzYWJsZWQuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2VnbWVudCBjb250ZW50IGNhbiBiZSBmbG9hdGVkIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0LiAqL1xuICBmbG9hdGVkOiBQcm9wVHlwZXMub25lT2YoU1VJLkZMT0FUUyksXG5cbiAgLyoqIEEgc2VnbWVudCBjYW4gaGF2ZSBpdHMgY29sb3JzIGludmVydGVkIGZvciBjb250cmFzdC4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHNlZ21lbnQgbWF5IHNob3cgaXRzIGNvbnRlbnQgaXMgYmVpbmcgbG9hZGVkLiAqL1xuICBsb2FkaW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBzZWdtZW50IGNhbiBpbmNyZWFzZSBpdHMgcGFkZGluZy4gKi9cbiAgcGFkZGVkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsndmVyeSddKV0pLFxuXG4gIC8qKiBBIHNlZ21lbnQgY2FuIGJlIHVzZWQgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgY29uZGl0aW9uYWxseSBkaXNwbGF5ZWQgY29udGVudC4gKi9cbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBGb3JtYXR0ZWQgdG8gbG9vayBsaWtlIGEgcGlsZSBvZiBwYWdlcy4gKi9cbiAgcGlsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHNlZ21lbnQgbWF5IGJlIGZvcm1hdHRlZCB0byByYWlzZSBhYm92ZSB0aGUgcGFnZS4gKi9cbiAgcmFpc2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBzZWdtZW50IGNhbiBiZSBmb3JtYXR0ZWQgdG8gYXBwZWFyIGxlc3Mgbm90aWNlYWJsZS4gKi9cbiAgc2Vjb25kYXJ5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBzZWdtZW50IGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScpKSxcblxuICAvKiogRm9ybWF0dGVkIHRvIHNob3cgaXQgY29udGFpbnMgbXVsdGlwbGUgcGFnZXMuICovXG4gIHN0YWNrZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHNlZ21lbnQgY2FuIGJlIGZvcm1hdHRlZCB0byBhcHBlYXIgZXZlbiBsZXNzIG5vdGljZWFibGUuICovXG4gIHRlcnRpYXJ5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRm9ybWF0cyBjb250ZW50IHRvIGJlIGFsaWduZWQgYXMgcGFydCBvZiBhIHZlcnRpY2FsIGdyb3VwLiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuVEVYVF9BTElHTk1FTlRTLCAnanVzdGlmaWVkJykpLFxuXG4gIC8qKiBGb3JtYXRzIGNvbnRlbnQgdG8gYmUgYWxpZ25lZCB2ZXJ0aWNhbGx5LiAqL1xuICB2ZXJ0aWNhbDogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IFNlZ21lbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGdyb3VwIG9mIHNlZ21lbnRzIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYXBwZWFyIHRvZ2V0aGVyLlxuICovXG5cbmZ1bmN0aW9uIFNlZ21lbnRHcm91cChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbXBhY3QgPSBwcm9wcy5jb21wYWN0LFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIHBpbGVkID0gcHJvcHMucGlsZWQsXG4gICAgICByYWlzZWQgPSBwcm9wcy5yYWlzZWQsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHN0YWNrZWQgPSBwcm9wcy5zdGFja2VkO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHNpemUsIHVzZUtleU9ubHkoY29tcGFjdCwgJ2NvbXBhY3QnKSwgdXNlS2V5T25seShob3Jpem9udGFsLCAnaG9yaXpvbnRhbCcpLCB1c2VLZXlPbmx5KHBpbGVkLCAncGlsZWQnKSwgdXNlS2V5T25seShyYWlzZWQsICdyYWlzZWQnKSwgdXNlS2V5T25seShzdGFja2VkLCAnc3RhY2tlZCcpLCAnc2VnbWVudHMnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFNlZ21lbnRHcm91cCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTZWdtZW50R3JvdXAsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5TZWdtZW50R3JvdXAuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbXBhY3RcIiwgXCJjb250ZW50XCIsIFwiaG9yaXpvbnRhbFwiLCBcInBpbGVkXCIsIFwicmFpc2VkXCIsIFwic2l6ZVwiLCBcInN0YWNrZWRcIl07XG5TZWdtZW50R3JvdXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBIHNlZ21lbnQgbWF5IHRha2UgdXAgb25seSBhcyBtdWNoIHNwYWNlIGFzIGlzIG5lY2Vzc2FyeS4gKi9cbiAgY29tcGFjdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogRm9ybWF0cyBjb250ZW50IHRvIGJlIGFsaWduZWQgaG9yaXpvbnRhbGx5LiAqL1xuICBob3Jpem9udGFsOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRm9ybWF0dGVkIHRvIGxvb2sgbGlrZSBhIHBpbGUgb2YgcGFnZXMuICovXG4gIHBpbGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBzZWdtZW50IGdyb3VwIG1heSBiZSBmb3JtYXR0ZWQgdG8gcmFpc2UgYWJvdmUgdGhlIHBhZ2UuICovXG4gIHJhaXNlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgc2VnbWVudCBncm91cCBjYW4gaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuICovXG4gIHNpemU6IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuU0laRVMsICdtZWRpdW0nKSksXG5cbiAgLyoqIEZvcm1hdHRlZCB0byBzaG93IGl0IGNvbnRhaW5zIG11bHRpcGxlIHBhZ2VzLiAqL1xuICBzdGFja2VkOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgU2VnbWVudEdyb3VwOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgcGxhY2Vob2xkZXIgc2VnbWVudCBjYW4gYmUgaW5saW5lLlxuICovXG5cbmZ1bmN0aW9uIFNlZ21lbnRJbmxpbmUocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnaW5saW5lJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhTZWdtZW50SW5saW5lLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFNlZ21lbnRJbmxpbmUsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5TZWdtZW50SW5saW5lLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuU2VnbWVudElubGluZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgU2VnbWVudElubGluZTsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9TZWdtZW50JztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vSWNvbic7XG5pbXBvcnQgU3RlcENvbnRlbnQgZnJvbSAnLi9TdGVwQ29udGVudCc7XG5pbXBvcnQgU3RlcERlc2NyaXB0aW9uIGZyb20gJy4vU3RlcERlc2NyaXB0aW9uJztcbmltcG9ydCBTdGVwR3JvdXAgZnJvbSAnLi9TdGVwR3JvdXAnO1xuaW1wb3J0IFN0ZXBUaXRsZSBmcm9tICcuL1N0ZXBUaXRsZSc7XG4vKipcbiAqIEEgc3RlcCBzaG93cyB0aGUgY29tcGxldGlvbiBzdGF0dXMgb2YgYW4gYWN0aXZpdHkgaW4gYSBzZXJpZXMgb2YgYWN0aXZpdGllcy5cbiAqL1xuXG52YXIgU3RlcCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShTdGVwLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTdGVwKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuY29tcHV0ZUVsZW1lbnRUeXBlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9uQ2xpY2sgPSBfdGhpcy5wcm9wcy5vbkNsaWNrO1xuICAgICAgaWYgKG9uQ2xpY2spIHJldHVybiAnYSc7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBkaXNhYmxlZCA9IF90aGlzLnByb3BzLmRpc2FibGVkO1xuICAgICAgaWYgKCFkaXNhYmxlZCkgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xpY2snLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTdGVwLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzLmFjdGl2ZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb21wbGV0ZWQgPSBfdGhpcyRwcm9wcy5jb21wbGV0ZWQsXG4gICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wcy5jb250ZW50LFxuICAgICAgICBkZXNjcmlwdGlvbiA9IF90aGlzJHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzLmRpc2FibGVkLFxuICAgICAgICBocmVmID0gX3RoaXMkcHJvcHMuaHJlZixcbiAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzLmljb24sXG4gICAgICAgIGxpbmsgPSBfdGhpcyRwcm9wcy5saW5rLFxuICAgICAgICB0aXRsZSA9IF90aGlzJHByb3BzLnRpdGxlO1xuICAgIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgdXNlS2V5T25seShjb21wbGV0ZWQsICdjb21wbGV0ZWQnKSwgdXNlS2V5T25seShkaXNhYmxlZCwgJ2Rpc2FibGVkJyksIHVzZUtleU9ubHkobGluaywgJ2xpbmsnKSwgJ3N0ZXAnLCBjbGFzc05hbWUpO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoU3RlcCwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU3RlcCwgdGhpcy5wcm9wcywgdGhpcy5jb21wdXRlRWxlbWVudFR5cGUpO1xuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCBjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNvbnRlbnQpKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgaHJlZjogaHJlZixcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgICAgfSksIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIGhyZWY6IGhyZWYsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSksIEljb24uY3JlYXRlKGljb24sIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgU3RlcENvbnRlbnQuY3JlYXRlKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgIHRpdGxlOiB0aXRsZVxuICAgIH0sIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIFN0ZXA7XG59KENvbXBvbmVudCk7XG5cblN0ZXAuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbXBsZXRlZFwiLCBcImNvbnRlbnRcIiwgXCJkZXNjcmlwdGlvblwiLCBcImRpc2FibGVkXCIsIFwiaHJlZlwiLCBcImljb25cIiwgXCJsaW5rXCIsIFwib25DbGlja1wiLCBcIm9yZGVyZWRcIiwgXCJ0aXRsZVwiXTtcblN0ZXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBzdGVwIGNhbiBiZSBoaWdobGlnaHRlZCBhcyBhY3RpdmUuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBzdGVwIGNhbiBzaG93IHRoYXQgYSB1c2VyIGhhcyBjb21wbGV0ZWQgaXQuICovXG4gIGNvbXBsZXRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBTdGVwRGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvdyB0aGF0IHRoZSBMb2FkZXIgaXMgaW5hY3RpdmUuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUmVuZGVyIGFzIGFuIGBhYCB0YWcgaW5zdGVhZCBvZiBhIGBkaXZgIGFuZCBhZGRzIHRoZSBocmVmIGF0dHJpYnV0ZS4gKi9cbiAgaHJlZjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJY29uLiAqL1xuICBpY29uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBzdGVwIGNhbiBiZSBsaW5rLiAqL1xuICBsaW5rOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNsaWNrLiBXaGVuIHBhc3NlZCwgdGhlIGNvbXBvbmVudCB3aWxsIHJlbmRlciBhcyBhbiBgYWBcbiAgICogdGFnIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBhIGBkaXZgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgc3RlcCBjYW4gc2hvdyBhIG9yZGVyZWQgc2VxdWVuY2Ugb2Ygc3RlcHMuIFBhc3NlZCBmcm9tIFN0ZXBHcm91cC4gKi9cbiAgb3JkZXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgU3RlcFRpdGxlLiAqL1xuICB0aXRsZTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRcbn0gOiB7fTtcblN0ZXAuQ29udGVudCA9IFN0ZXBDb250ZW50O1xuU3RlcC5EZXNjcmlwdGlvbiA9IFN0ZXBEZXNjcmlwdGlvbjtcblN0ZXAuR3JvdXAgPSBTdGVwR3JvdXA7XG5TdGVwLlRpdGxlID0gU3RlcFRpdGxlO1xuU3RlcC5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KFN0ZXAsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBTdGVwOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgU3RlcERlc2NyaXB0aW9uIGZyb20gJy4vU3RlcERlc2NyaXB0aW9uJztcbmltcG9ydCBTdGVwVGl0bGUgZnJvbSAnLi9TdGVwVGl0bGUnO1xuLyoqXG4gKiBBIHN0ZXAgY2FuIGNvbnRhaW4gYSBjb250ZW50LlxuICovXG5cbmZ1bmN0aW9uIFN0ZXBDb250ZW50KHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgdGl0bGUgPSBwcm9wcy50aXRsZTtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnY29udGVudCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoU3RlcENvbnRlbnQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU3RlcENvbnRlbnQsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIFN0ZXBUaXRsZS5jcmVhdGUodGl0bGUsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pLCBTdGVwRGVzY3JpcHRpb24uY3JlYXRlKGRlc2NyaXB0aW9uLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSk7XG59XG5cblN0ZXBDb250ZW50LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGVzY3JpcHRpb25cIiwgXCJ0aXRsZVwiXTtcblN0ZXBDb250ZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIFN0ZXBEZXNjcmlwdGlvbi4gKi9cbiAgZGVzY3JpcHRpb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIFN0ZXBUaXRsZS4gKi9cbiAgdGl0bGU6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kXG59IDoge307XG5TdGVwQ29udGVudC5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KFN0ZXBDb250ZW50LCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgU3RlcENvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcblxuZnVuY3Rpb24gU3RlcERlc2NyaXB0aW9uKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2Rlc2NyaXB0aW9uJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhTdGVwRGVzY3JpcHRpb24sIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU3RlcERlc2NyaXB0aW9uLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuU3RlcERlc2NyaXB0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuU3RlcERlc2NyaXB0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5TdGVwRGVzY3JpcHRpb24uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShTdGVwRGVzY3JpcHRpb24sIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBTdGVwRGVzY3JpcHRpb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3ZhbHVlcyBmcm9tIFwibG9kYXNoLWVzL3ZhbHVlc1wiO1xuaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gtZXMva2V5c1wiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IF9tYXAgZnJvbSBcImxvZGFzaC1lcy9tYXBcIjtcbmltcG9ydCBfcGlja0J5IGZyb20gXCJsb2Rhc2gtZXMvcGlja0J5XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBudW1iZXJUb1dvcmRNYXAsIFNVSSwgdXNlS2V5T25seSwgdXNlS2V5T3JWYWx1ZUFuZEtleSwgdXNlVmFsdWVBbmRLZXksIHVzZVdpZHRoUHJvcCB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgU3RlcCBmcm9tICcuL1N0ZXAnO1xudmFyIG51bWJlck1hcCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IF9waWNrQnkobnVtYmVyVG9Xb3JkTWFwLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgcmV0dXJuIGtleSA8PSA4O1xufSkgOiB7fTtcbi8qKlxuICogQSBzZXQgb2Ygc3RlcHMuXG4gKi9cblxuZnVuY3Rpb24gU3RlcEdyb3VwKHByb3BzKSB7XG4gIHZhciBhdHRhY2hlZCA9IHByb3BzLmF0dGFjaGVkLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZmx1aWQgPSBwcm9wcy5mbHVpZCxcbiAgICAgIGl0ZW1zID0gcHJvcHMuaXRlbXMsXG4gICAgICBvcmRlcmVkID0gcHJvcHMub3JkZXJlZCxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgc3RhY2thYmxlID0gcHJvcHMuc3RhY2thYmxlLFxuICAgICAgdW5zdGFja2FibGUgPSBwcm9wcy51bnN0YWNrYWJsZSxcbiAgICAgIHZlcnRpY2FsID0gcHJvcHMudmVydGljYWwsXG4gICAgICB3aWR0aHMgPSBwcm9wcy53aWR0aHM7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgc2l6ZSwgdXNlS2V5T25seShmbHVpZCwgJ2ZsdWlkJyksIHVzZUtleU9ubHkob3JkZXJlZCwgJ29yZGVyZWQnKSwgdXNlS2V5T25seSh1bnN0YWNrYWJsZSwgJ3Vuc3RhY2thYmxlJyksIHVzZUtleU9ubHkodmVydGljYWwsICd2ZXJ0aWNhbCcpLCB1c2VLZXlPclZhbHVlQW5kS2V5KGF0dGFjaGVkLCAnYXR0YWNoZWQnKSwgdXNlVmFsdWVBbmRLZXkoc3RhY2thYmxlLCAnc3RhY2thYmxlJyksIHVzZVdpZHRoUHJvcCh3aWR0aHMpLCAnc3RlcHMnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFN0ZXBHcm91cCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTdGVwR3JvdXAsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIF9tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgcmV0dXJuIFN0ZXAuY3JlYXRlKGl0ZW0pO1xuICB9KSk7XG59XG5cblN0ZXBHcm91cC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImF0dGFjaGVkXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZmx1aWRcIiwgXCJpdGVtc1wiLCBcIm9yZGVyZWRcIiwgXCJzaXplXCIsIFwic3RhY2thYmxlXCIsIFwidW5zdGFja2FibGVcIiwgXCJ2ZXJ0aWNhbFwiLCBcIndpZHRoc1wiXTtcblN0ZXBHcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBTdGVwcyBjYW4gYmUgYXR0YWNoZWQgdG8gb3RoZXIgZWxlbWVudHMuICovXG4gIGF0dGFjaGVkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsndG9wJywgJ2JvdHRvbSddKV0pLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBmbHVpZCBzdGVwIHRha2VzIHVwIHRoZSB3aWR0aCBvZiBpdHMgY29udGFpbmVyLiAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBhcnJheSBvZiBwcm9wcyBmb3IgU3RlcC4gKi9cbiAgaXRlbXM6IGN1c3RvbVByb3BUeXBlcy5jb2xsZWN0aW9uU2hvcnRoYW5kLFxuXG4gIC8qKiBBIHN0ZXAgY2FuIHNob3cgYSBvcmRlcmVkIHNlcXVlbmNlIG9mIHN0ZXBzLiAqL1xuICBvcmRlcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU3RlcHMgY2FuIGhhdmUgZGlmZmVyZW50IHNpemVzLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnbWVkaXVtJykpLFxuXG4gIC8qKiBBIHN0ZXAgY2FuIHN0YWNrIHZlcnRpY2FsbHkgb25seSBvbiBzbWFsbGVyIHNjcmVlbnMuICovXG4gIHN0YWNrYWJsZTogUHJvcFR5cGVzLm9uZU9mKFsndGFibGV0J10pLFxuXG4gIC8qKiBBIHN0ZXAgY2FuIHByZXZlbnQgaXRzZWxmIGZyb20gc3RhY2tpbmcgb24gbW9iaWxlLiAqL1xuICB1bnN0YWNrYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgc3RlcCBjYW4gYmUgZGlzcGxheWVkIHN0YWNrZWQgdmVydGljYWxseS4gKi9cbiAgdmVydGljYWw6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTdGVwcyBjYW4gYmUgZGl2aWRlZCBldmVubHkgaW5zaWRlIHRoZWlyIHBhcmVudC4gKi9cbiAgd2lkdGhzOiBQcm9wVHlwZXMub25lT2YoW10uY29uY2F0KF9rZXlzKG51bWJlck1hcCksIF9rZXlzKG51bWJlck1hcCkubWFwKE51bWJlciksIF92YWx1ZXMobnVtYmVyTWFwKSkpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBTdGVwR3JvdXA7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBzdGVwIGNhbiBjb250YWluIGEgdGl0bGUuXG4gKi9cblxuZnVuY3Rpb24gU3RlcFRpdGxlKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ3RpdGxlJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhTdGVwVGl0bGUsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU3RlcFRpdGxlLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuU3RlcFRpdGxlLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuU3RlcFRpdGxlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5TdGVwVGl0bGUuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShTdGVwVGl0bGUsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBTdGVwVGl0bGU7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vU3RlcCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiLy8gVGhpcmQgcGFydHlcbmV4cG9ydCB7IFJlZiB9IGZyb20gJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtcmVmJzsgLy8gQWRkb25zXG5cbmltcG9ydCBfQ29uZmlybSBmcm9tICcuL2FkZG9ucy9Db25maXJtJztcbmV4cG9ydCB7IF9Db25maXJtIGFzIENvbmZpcm0gfTtcbmltcG9ydCBfUGFnaW5hdGlvbiBmcm9tICcuL2FkZG9ucy9QYWdpbmF0aW9uJztcbmV4cG9ydCB7IF9QYWdpbmF0aW9uIGFzIFBhZ2luYXRpb24gfTtcbmltcG9ydCBfUGFnaW5hdGlvbkl0ZW0gZnJvbSAnLi9hZGRvbnMvUGFnaW5hdGlvbi9QYWdpbmF0aW9uSXRlbSc7XG5leHBvcnQgeyBfUGFnaW5hdGlvbkl0ZW0gYXMgUGFnaW5hdGlvbkl0ZW0gfTtcbmltcG9ydCBfUG9ydGFsIGZyb20gJy4vYWRkb25zL1BvcnRhbCc7XG5leHBvcnQgeyBfUG9ydGFsIGFzIFBvcnRhbCB9O1xuaW1wb3J0IF9Qb3J0YWxJbm5lciBmcm9tICcuL2FkZG9ucy9Qb3J0YWwvUG9ydGFsSW5uZXInO1xuZXhwb3J0IHsgX1BvcnRhbElubmVyIGFzIFBvcnRhbElubmVyIH07XG5pbXBvcnQgX1JhZGlvIGZyb20gJy4vYWRkb25zL1JhZGlvJztcbmV4cG9ydCB7IF9SYWRpbyBhcyBSYWRpbyB9O1xuaW1wb3J0IF9TZWxlY3QgZnJvbSAnLi9hZGRvbnMvU2VsZWN0JztcbmV4cG9ydCB7IF9TZWxlY3QgYXMgU2VsZWN0IH07XG5pbXBvcnQgX1RleHRBcmVhIGZyb20gJy4vYWRkb25zL1RleHRBcmVhJztcbmV4cG9ydCB7IF9UZXh0QXJlYSBhcyBUZXh0QXJlYSB9O1xuaW1wb3J0IF9UcmFuc2l0aW9uYWJsZVBvcnRhbCBmcm9tICcuL2FkZG9ucy9UcmFuc2l0aW9uYWJsZVBvcnRhbCc7XG5leHBvcnQgeyBfVHJhbnNpdGlvbmFibGVQb3J0YWwgYXMgVHJhbnNpdGlvbmFibGVQb3J0YWwgfTsgLy8gQmVoYXZpb3JzXG5cbmltcG9ydCBfVmlzaWJpbGl0eSBmcm9tICcuL2JlaGF2aW9ycy9WaXNpYmlsaXR5JztcbmV4cG9ydCB7IF9WaXNpYmlsaXR5IGFzIFZpc2liaWxpdHkgfTsgLy8gQ29sbGVjdGlvbnNcblxuaW1wb3J0IF9CcmVhZGNydW1iIGZyb20gJy4vY29sbGVjdGlvbnMvQnJlYWRjcnVtYic7XG5leHBvcnQgeyBfQnJlYWRjcnVtYiBhcyBCcmVhZGNydW1iIH07XG5pbXBvcnQgX0JyZWFkY3J1bWJEaXZpZGVyIGZyb20gJy4vY29sbGVjdGlvbnMvQnJlYWRjcnVtYi9CcmVhZGNydW1iRGl2aWRlcic7XG5leHBvcnQgeyBfQnJlYWRjcnVtYkRpdmlkZXIgYXMgQnJlYWRjcnVtYkRpdmlkZXIgfTtcbmltcG9ydCBfQnJlYWRjcnVtYlNlY3Rpb24gZnJvbSAnLi9jb2xsZWN0aW9ucy9CcmVhZGNydW1iL0JyZWFkY3J1bWJTZWN0aW9uJztcbmV4cG9ydCB7IF9CcmVhZGNydW1iU2VjdGlvbiBhcyBCcmVhZGNydW1iU2VjdGlvbiB9O1xuaW1wb3J0IF9Gb3JtIGZyb20gJy4vY29sbGVjdGlvbnMvRm9ybSc7XG5leHBvcnQgeyBfRm9ybSBhcyBGb3JtIH07XG5pbXBvcnQgX0Zvcm1CdXR0b24gZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1CdXR0b24nO1xuZXhwb3J0IHsgX0Zvcm1CdXR0b24gYXMgRm9ybUJ1dHRvbiB9O1xuaW1wb3J0IF9Gb3JtQ2hlY2tib3ggZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1DaGVja2JveCc7XG5leHBvcnQgeyBfRm9ybUNoZWNrYm94IGFzIEZvcm1DaGVja2JveCB9O1xuaW1wb3J0IF9Gb3JtRHJvcGRvd24gZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1Ecm9wZG93bic7XG5leHBvcnQgeyBfRm9ybURyb3Bkb3duIGFzIEZvcm1Ecm9wZG93biB9O1xuaW1wb3J0IF9Gb3JtRmllbGQgZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1GaWVsZCc7XG5leHBvcnQgeyBfRm9ybUZpZWxkIGFzIEZvcm1GaWVsZCB9O1xuaW1wb3J0IF9Gb3JtR3JvdXAgZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1Hcm91cCc7XG5leHBvcnQgeyBfRm9ybUdyb3VwIGFzIEZvcm1Hcm91cCB9O1xuaW1wb3J0IF9Gb3JtSW5wdXQgZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1JbnB1dCc7XG5leHBvcnQgeyBfRm9ybUlucHV0IGFzIEZvcm1JbnB1dCB9O1xuaW1wb3J0IF9Gb3JtUmFkaW8gZnJvbSAnLi9jb2xsZWN0aW9ucy9Gb3JtL0Zvcm1SYWRpbyc7XG5leHBvcnQgeyBfRm9ybVJhZGlvIGFzIEZvcm1SYWRpbyB9O1xuaW1wb3J0IF9Gb3JtU2VsZWN0IGZyb20gJy4vY29sbGVjdGlvbnMvRm9ybS9Gb3JtU2VsZWN0JztcbmV4cG9ydCB7IF9Gb3JtU2VsZWN0IGFzIEZvcm1TZWxlY3QgfTtcbmltcG9ydCBfRm9ybVRleHRBcmVhIGZyb20gJy4vY29sbGVjdGlvbnMvRm9ybS9Gb3JtVGV4dEFyZWEnO1xuZXhwb3J0IHsgX0Zvcm1UZXh0QXJlYSBhcyBGb3JtVGV4dEFyZWEgfTtcbmltcG9ydCBfR3JpZCBmcm9tICcuL2NvbGxlY3Rpb25zL0dyaWQnO1xuZXhwb3J0IHsgX0dyaWQgYXMgR3JpZCB9O1xuaW1wb3J0IF9HcmlkQ29sdW1uIGZyb20gJy4vY29sbGVjdGlvbnMvR3JpZC9HcmlkQ29sdW1uJztcbmV4cG9ydCB7IF9HcmlkQ29sdW1uIGFzIEdyaWRDb2x1bW4gfTtcbmltcG9ydCBfR3JpZFJvdyBmcm9tICcuL2NvbGxlY3Rpb25zL0dyaWQvR3JpZFJvdyc7XG5leHBvcnQgeyBfR3JpZFJvdyBhcyBHcmlkUm93IH07XG5pbXBvcnQgX01lbnUgZnJvbSAnLi9jb2xsZWN0aW9ucy9NZW51JztcbmV4cG9ydCB7IF9NZW51IGFzIE1lbnUgfTtcbmltcG9ydCBfTWVudUhlYWRlciBmcm9tICcuL2NvbGxlY3Rpb25zL01lbnUvTWVudUhlYWRlcic7XG5leHBvcnQgeyBfTWVudUhlYWRlciBhcyBNZW51SGVhZGVyIH07XG5pbXBvcnQgX01lbnVJdGVtIGZyb20gJy4vY29sbGVjdGlvbnMvTWVudS9NZW51SXRlbSc7XG5leHBvcnQgeyBfTWVudUl0ZW0gYXMgTWVudUl0ZW0gfTtcbmltcG9ydCBfTWVudU1lbnUgZnJvbSAnLi9jb2xsZWN0aW9ucy9NZW51L01lbnVNZW51JztcbmV4cG9ydCB7IF9NZW51TWVudSBhcyBNZW51TWVudSB9O1xuaW1wb3J0IF9NZXNzYWdlIGZyb20gJy4vY29sbGVjdGlvbnMvTWVzc2FnZSc7XG5leHBvcnQgeyBfTWVzc2FnZSBhcyBNZXNzYWdlIH07XG5pbXBvcnQgX01lc3NhZ2VDb250ZW50IGZyb20gJy4vY29sbGVjdGlvbnMvTWVzc2FnZS9NZXNzYWdlQ29udGVudCc7XG5leHBvcnQgeyBfTWVzc2FnZUNvbnRlbnQgYXMgTWVzc2FnZUNvbnRlbnQgfTtcbmltcG9ydCBfTWVzc2FnZUhlYWRlciBmcm9tICcuL2NvbGxlY3Rpb25zL01lc3NhZ2UvTWVzc2FnZUhlYWRlcic7XG5leHBvcnQgeyBfTWVzc2FnZUhlYWRlciBhcyBNZXNzYWdlSGVhZGVyIH07XG5pbXBvcnQgX01lc3NhZ2VJdGVtIGZyb20gJy4vY29sbGVjdGlvbnMvTWVzc2FnZS9NZXNzYWdlSXRlbSc7XG5leHBvcnQgeyBfTWVzc2FnZUl0ZW0gYXMgTWVzc2FnZUl0ZW0gfTtcbmltcG9ydCBfTWVzc2FnZUxpc3QgZnJvbSAnLi9jb2xsZWN0aW9ucy9NZXNzYWdlL01lc3NhZ2VMaXN0JztcbmV4cG9ydCB7IF9NZXNzYWdlTGlzdCBhcyBNZXNzYWdlTGlzdCB9O1xuaW1wb3J0IF9UYWJsZSBmcm9tICcuL2NvbGxlY3Rpb25zL1RhYmxlJztcbmV4cG9ydCB7IF9UYWJsZSBhcyBUYWJsZSB9O1xuaW1wb3J0IF9UYWJsZUJvZHkgZnJvbSAnLi9jb2xsZWN0aW9ucy9UYWJsZS9UYWJsZUJvZHknO1xuZXhwb3J0IHsgX1RhYmxlQm9keSBhcyBUYWJsZUJvZHkgfTtcbmltcG9ydCBfVGFibGVDZWxsIGZyb20gJy4vY29sbGVjdGlvbnMvVGFibGUvVGFibGVDZWxsJztcbmV4cG9ydCB7IF9UYWJsZUNlbGwgYXMgVGFibGVDZWxsIH07XG5pbXBvcnQgX1RhYmxlRm9vdGVyIGZyb20gJy4vY29sbGVjdGlvbnMvVGFibGUvVGFibGVGb290ZXInO1xuZXhwb3J0IHsgX1RhYmxlRm9vdGVyIGFzIFRhYmxlRm9vdGVyIH07XG5pbXBvcnQgX1RhYmxlSGVhZGVyIGZyb20gJy4vY29sbGVjdGlvbnMvVGFibGUvVGFibGVIZWFkZXInO1xuZXhwb3J0IHsgX1RhYmxlSGVhZGVyIGFzIFRhYmxlSGVhZGVyIH07XG5pbXBvcnQgX1RhYmxlSGVhZGVyQ2VsbCBmcm9tICcuL2NvbGxlY3Rpb25zL1RhYmxlL1RhYmxlSGVhZGVyQ2VsbCc7XG5leHBvcnQgeyBfVGFibGVIZWFkZXJDZWxsIGFzIFRhYmxlSGVhZGVyQ2VsbCB9O1xuaW1wb3J0IF9UYWJsZVJvdyBmcm9tICcuL2NvbGxlY3Rpb25zL1RhYmxlL1RhYmxlUm93JztcbmV4cG9ydCB7IF9UYWJsZVJvdyBhcyBUYWJsZVJvdyB9OyAvLyBFbGVtZW50c1xuXG5pbXBvcnQgX0J1dHRvbiBmcm9tICcuL2VsZW1lbnRzL0J1dHRvbi9CdXR0b24nO1xuZXhwb3J0IHsgX0J1dHRvbiBhcyBCdXR0b24gfTtcbmltcG9ydCBfQnV0dG9uQ29udGVudCBmcm9tICcuL2VsZW1lbnRzL0J1dHRvbi9CdXR0b25Db250ZW50JztcbmV4cG9ydCB7IF9CdXR0b25Db250ZW50IGFzIEJ1dHRvbkNvbnRlbnQgfTtcbmltcG9ydCBfQnV0dG9uR3JvdXAgZnJvbSAnLi9lbGVtZW50cy9CdXR0b24vQnV0dG9uR3JvdXAnO1xuZXhwb3J0IHsgX0J1dHRvbkdyb3VwIGFzIEJ1dHRvbkdyb3VwIH07XG5pbXBvcnQgX0J1dHRvbk9yIGZyb20gJy4vZWxlbWVudHMvQnV0dG9uL0J1dHRvbk9yJztcbmV4cG9ydCB7IF9CdXR0b25PciBhcyBCdXR0b25PciB9O1xuaW1wb3J0IF9Db250YWluZXIgZnJvbSAnLi9lbGVtZW50cy9Db250YWluZXInO1xuZXhwb3J0IHsgX0NvbnRhaW5lciBhcyBDb250YWluZXIgfTtcbmltcG9ydCBfRGl2aWRlciBmcm9tICcuL2VsZW1lbnRzL0RpdmlkZXInO1xuZXhwb3J0IHsgX0RpdmlkZXIgYXMgRGl2aWRlciB9O1xuaW1wb3J0IF9GbGFnIGZyb20gJy4vZWxlbWVudHMvRmxhZyc7XG5leHBvcnQgeyBfRmxhZyBhcyBGbGFnIH07XG5pbXBvcnQgX0hlYWRlciBmcm9tICcuL2VsZW1lbnRzL0hlYWRlcic7XG5leHBvcnQgeyBfSGVhZGVyIGFzIEhlYWRlciB9O1xuaW1wb3J0IF9IZWFkZXJDb250ZW50IGZyb20gJy4vZWxlbWVudHMvSGVhZGVyL0hlYWRlckNvbnRlbnQnO1xuZXhwb3J0IHsgX0hlYWRlckNvbnRlbnQgYXMgSGVhZGVyQ29udGVudCB9O1xuaW1wb3J0IF9IZWFkZXJTdWJoZWFkZXIgZnJvbSAnLi9lbGVtZW50cy9IZWFkZXIvSGVhZGVyU3ViaGVhZGVyJztcbmV4cG9ydCB7IF9IZWFkZXJTdWJoZWFkZXIgYXMgSGVhZGVyU3ViaGVhZGVyIH07XG5pbXBvcnQgX0ljb24gZnJvbSAnLi9lbGVtZW50cy9JY29uJztcbmV4cG9ydCB7IF9JY29uIGFzIEljb24gfTtcbmltcG9ydCBfSWNvbkdyb3VwIGZyb20gJy4vZWxlbWVudHMvSWNvbi9JY29uR3JvdXAnO1xuZXhwb3J0IHsgX0ljb25Hcm91cCBhcyBJY29uR3JvdXAgfTtcbmltcG9ydCBfSW1hZ2UgZnJvbSAnLi9lbGVtZW50cy9JbWFnZSc7XG5leHBvcnQgeyBfSW1hZ2UgYXMgSW1hZ2UgfTtcbmltcG9ydCBfSW1hZ2VHcm91cCBmcm9tICcuL2VsZW1lbnRzL0ltYWdlL0ltYWdlR3JvdXAnO1xuZXhwb3J0IHsgX0ltYWdlR3JvdXAgYXMgSW1hZ2VHcm91cCB9O1xuaW1wb3J0IF9JbnB1dCBmcm9tICcuL2VsZW1lbnRzL0lucHV0JztcbmV4cG9ydCB7IF9JbnB1dCBhcyBJbnB1dCB9O1xuaW1wb3J0IF9MYWJlbCBmcm9tICcuL2VsZW1lbnRzL0xhYmVsJztcbmV4cG9ydCB7IF9MYWJlbCBhcyBMYWJlbCB9O1xuaW1wb3J0IF9MYWJlbERldGFpbCBmcm9tICcuL2VsZW1lbnRzL0xhYmVsL0xhYmVsRGV0YWlsJztcbmV4cG9ydCB7IF9MYWJlbERldGFpbCBhcyBMYWJlbERldGFpbCB9O1xuaW1wb3J0IF9MYWJlbEdyb3VwIGZyb20gJy4vZWxlbWVudHMvTGFiZWwvTGFiZWxHcm91cCc7XG5leHBvcnQgeyBfTGFiZWxHcm91cCBhcyBMYWJlbEdyb3VwIH07XG5pbXBvcnQgX0xpc3QgZnJvbSAnLi9lbGVtZW50cy9MaXN0JztcbmV4cG9ydCB7IF9MaXN0IGFzIExpc3QgfTtcbmltcG9ydCBfTGlzdENvbnRlbnQgZnJvbSAnLi9lbGVtZW50cy9MaXN0L0xpc3RDb250ZW50JztcbmV4cG9ydCB7IF9MaXN0Q29udGVudCBhcyBMaXN0Q29udGVudCB9O1xuaW1wb3J0IF9MaXN0RGVzY3JpcHRpb24gZnJvbSAnLi9lbGVtZW50cy9MaXN0L0xpc3REZXNjcmlwdGlvbic7XG5leHBvcnQgeyBfTGlzdERlc2NyaXB0aW9uIGFzIExpc3REZXNjcmlwdGlvbiB9O1xuaW1wb3J0IF9MaXN0SGVhZGVyIGZyb20gJy4vZWxlbWVudHMvTGlzdC9MaXN0SGVhZGVyJztcbmV4cG9ydCB7IF9MaXN0SGVhZGVyIGFzIExpc3RIZWFkZXIgfTtcbmltcG9ydCBfTGlzdEljb24gZnJvbSAnLi9lbGVtZW50cy9MaXN0L0xpc3RJY29uJztcbmV4cG9ydCB7IF9MaXN0SWNvbiBhcyBMaXN0SWNvbiB9O1xuaW1wb3J0IF9MaXN0SXRlbSBmcm9tICcuL2VsZW1lbnRzL0xpc3QvTGlzdEl0ZW0nO1xuZXhwb3J0IHsgX0xpc3RJdGVtIGFzIExpc3RJdGVtIH07XG5pbXBvcnQgX0xpc3RMaXN0IGZyb20gJy4vZWxlbWVudHMvTGlzdC9MaXN0TGlzdCc7XG5leHBvcnQgeyBfTGlzdExpc3QgYXMgTGlzdExpc3QgfTtcbmltcG9ydCBfTG9hZGVyIGZyb20gJy4vZWxlbWVudHMvTG9hZGVyJztcbmV4cG9ydCB7IF9Mb2FkZXIgYXMgTG9hZGVyIH07XG5pbXBvcnQgX1BsYWNlaG9sZGVyIGZyb20gJy4vZWxlbWVudHMvUGxhY2Vob2xkZXInO1xuZXhwb3J0IHsgX1BsYWNlaG9sZGVyIGFzIFBsYWNlaG9sZGVyIH07XG5pbXBvcnQgX1BsYWNlaG9sZGVySGVhZGVyIGZyb20gJy4vZWxlbWVudHMvUGxhY2Vob2xkZXIvUGxhY2Vob2xkZXJIZWFkZXInO1xuZXhwb3J0IHsgX1BsYWNlaG9sZGVySGVhZGVyIGFzIFBsYWNlaG9sZGVySGVhZGVyIH07XG5pbXBvcnQgX1BsYWNlaG9sZGVySW1hZ2UgZnJvbSAnLi9lbGVtZW50cy9QbGFjZWhvbGRlci9QbGFjZWhvbGRlckltYWdlJztcbmV4cG9ydCB7IF9QbGFjZWhvbGRlckltYWdlIGFzIFBsYWNlaG9sZGVySW1hZ2UgfTtcbmltcG9ydCBfUGxhY2Vob2xkZXJMaW5lIGZyb20gJy4vZWxlbWVudHMvUGxhY2Vob2xkZXIvUGxhY2Vob2xkZXJMaW5lJztcbmV4cG9ydCB7IF9QbGFjZWhvbGRlckxpbmUgYXMgUGxhY2Vob2xkZXJMaW5lIH07XG5pbXBvcnQgX1BsYWNlaG9sZGVyUGFyYWdyYXBoIGZyb20gJy4vZWxlbWVudHMvUGxhY2Vob2xkZXIvUGxhY2Vob2xkZXJQYXJhZ3JhcGgnO1xuZXhwb3J0IHsgX1BsYWNlaG9sZGVyUGFyYWdyYXBoIGFzIFBsYWNlaG9sZGVyUGFyYWdyYXBoIH07XG5pbXBvcnQgX1JhaWwgZnJvbSAnLi9lbGVtZW50cy9SYWlsJztcbmV4cG9ydCB7IF9SYWlsIGFzIFJhaWwgfTtcbmltcG9ydCBfUmV2ZWFsIGZyb20gJy4vZWxlbWVudHMvUmV2ZWFsJztcbmV4cG9ydCB7IF9SZXZlYWwgYXMgUmV2ZWFsIH07XG5pbXBvcnQgX1JldmVhbENvbnRlbnQgZnJvbSAnLi9lbGVtZW50cy9SZXZlYWwvUmV2ZWFsQ29udGVudCc7XG5leHBvcnQgeyBfUmV2ZWFsQ29udGVudCBhcyBSZXZlYWxDb250ZW50IH07XG5pbXBvcnQgX1NlZ21lbnQgZnJvbSAnLi9lbGVtZW50cy9TZWdtZW50JztcbmV4cG9ydCB7IF9TZWdtZW50IGFzIFNlZ21lbnQgfTtcbmltcG9ydCBfU2VnbWVudEdyb3VwIGZyb20gJy4vZWxlbWVudHMvU2VnbWVudC9TZWdtZW50R3JvdXAnO1xuZXhwb3J0IHsgX1NlZ21lbnRHcm91cCBhcyBTZWdtZW50R3JvdXAgfTtcbmltcG9ydCBfU2VnbWVudElubGluZSBmcm9tICcuL2VsZW1lbnRzL1NlZ21lbnQvU2VnbWVudElubGluZSc7XG5leHBvcnQgeyBfU2VnbWVudElubGluZSBhcyBTZWdtZW50SW5saW5lIH07XG5pbXBvcnQgX1N0ZXAgZnJvbSAnLi9lbGVtZW50cy9TdGVwJztcbmV4cG9ydCB7IF9TdGVwIGFzIFN0ZXAgfTtcbmltcG9ydCBfU3RlcENvbnRlbnQgZnJvbSAnLi9lbGVtZW50cy9TdGVwL1N0ZXBDb250ZW50JztcbmV4cG9ydCB7IF9TdGVwQ29udGVudCBhcyBTdGVwQ29udGVudCB9O1xuaW1wb3J0IF9TdGVwRGVzY3JpcHRpb24gZnJvbSAnLi9lbGVtZW50cy9TdGVwL1N0ZXBEZXNjcmlwdGlvbic7XG5leHBvcnQgeyBfU3RlcERlc2NyaXB0aW9uIGFzIFN0ZXBEZXNjcmlwdGlvbiB9O1xuaW1wb3J0IF9TdGVwR3JvdXAgZnJvbSAnLi9lbGVtZW50cy9TdGVwL1N0ZXBHcm91cCc7XG5leHBvcnQgeyBfU3RlcEdyb3VwIGFzIFN0ZXBHcm91cCB9O1xuaW1wb3J0IF9TdGVwVGl0bGUgZnJvbSAnLi9lbGVtZW50cy9TdGVwL1N0ZXBUaXRsZSc7XG5leHBvcnQgeyBfU3RlcFRpdGxlIGFzIFN0ZXBUaXRsZSB9OyAvLyBNb2R1bGVzXG5cbmltcG9ydCBfQWNjb3JkaW9uIGZyb20gJy4vbW9kdWxlcy9BY2NvcmRpb24vQWNjb3JkaW9uJztcbmV4cG9ydCB7IF9BY2NvcmRpb24gYXMgQWNjb3JkaW9uIH07XG5pbXBvcnQgX0FjY29yZGlvbkFjY29yZGlvbiBmcm9tICcuL21vZHVsZXMvQWNjb3JkaW9uL0FjY29yZGlvbkFjY29yZGlvbic7XG5leHBvcnQgeyBfQWNjb3JkaW9uQWNjb3JkaW9uIGFzIEFjY29yZGlvbkFjY29yZGlvbiB9O1xuaW1wb3J0IF9BY2NvcmRpb25Db250ZW50IGZyb20gJy4vbW9kdWxlcy9BY2NvcmRpb24vQWNjb3JkaW9uQ29udGVudCc7XG5leHBvcnQgeyBfQWNjb3JkaW9uQ29udGVudCBhcyBBY2NvcmRpb25Db250ZW50IH07XG5pbXBvcnQgX0FjY29yZGlvblBhbmVsIGZyb20gJy4vbW9kdWxlcy9BY2NvcmRpb24vQWNjb3JkaW9uUGFuZWwnO1xuZXhwb3J0IHsgX0FjY29yZGlvblBhbmVsIGFzIEFjY29yZGlvblBhbmVsIH07XG5pbXBvcnQgX0FjY29yZGlvblRpdGxlIGZyb20gJy4vbW9kdWxlcy9BY2NvcmRpb24vQWNjb3JkaW9uVGl0bGUnO1xuZXhwb3J0IHsgX0FjY29yZGlvblRpdGxlIGFzIEFjY29yZGlvblRpdGxlIH07XG5pbXBvcnQgX0NoZWNrYm94IGZyb20gJy4vbW9kdWxlcy9DaGVja2JveCc7XG5leHBvcnQgeyBfQ2hlY2tib3ggYXMgQ2hlY2tib3ggfTtcbmltcG9ydCBfRGltbWVyIGZyb20gJy4vbW9kdWxlcy9EaW1tZXInO1xuZXhwb3J0IHsgX0RpbW1lciBhcyBEaW1tZXIgfTtcbmltcG9ydCBfRGltbWVyRGltbWFibGUgZnJvbSAnLi9tb2R1bGVzL0RpbW1lci9EaW1tZXJEaW1tYWJsZSc7XG5leHBvcnQgeyBfRGltbWVyRGltbWFibGUgYXMgRGltbWVyRGltbWFibGUgfTtcbmltcG9ydCBfRGltbWVySW5uZXIgZnJvbSAnLi9tb2R1bGVzL0RpbW1lci9EaW1tZXJJbm5lcic7XG5leHBvcnQgeyBfRGltbWVySW5uZXIgYXMgRGltbWVySW5uZXIgfTtcbmltcG9ydCBfRHJvcGRvd24gZnJvbSAnLi9tb2R1bGVzL0Ryb3Bkb3duJztcbmV4cG9ydCB7IF9Ecm9wZG93biBhcyBEcm9wZG93biB9O1xuaW1wb3J0IF9Ecm9wZG93bkRpdmlkZXIgZnJvbSAnLi9tb2R1bGVzL0Ryb3Bkb3duL0Ryb3Bkb3duRGl2aWRlcic7XG5leHBvcnQgeyBfRHJvcGRvd25EaXZpZGVyIGFzIERyb3Bkb3duRGl2aWRlciB9O1xuaW1wb3J0IF9Ecm9wZG93bkhlYWRlciBmcm9tICcuL21vZHVsZXMvRHJvcGRvd24vRHJvcGRvd25IZWFkZXInO1xuZXhwb3J0IHsgX0Ryb3Bkb3duSGVhZGVyIGFzIERyb3Bkb3duSGVhZGVyIH07XG5pbXBvcnQgX0Ryb3Bkb3duSXRlbSBmcm9tICcuL21vZHVsZXMvRHJvcGRvd24vRHJvcGRvd25JdGVtJztcbmV4cG9ydCB7IF9Ecm9wZG93bkl0ZW0gYXMgRHJvcGRvd25JdGVtIH07XG5pbXBvcnQgX0Ryb3Bkb3duTWVudSBmcm9tICcuL21vZHVsZXMvRHJvcGRvd24vRHJvcGRvd25NZW51JztcbmV4cG9ydCB7IF9Ecm9wZG93bk1lbnUgYXMgRHJvcGRvd25NZW51IH07XG5pbXBvcnQgX0Ryb3Bkb3duU2VhcmNoSW5wdXQgZnJvbSAnLi9tb2R1bGVzL0Ryb3Bkb3duL0Ryb3Bkb3duU2VhcmNoSW5wdXQnO1xuZXhwb3J0IHsgX0Ryb3Bkb3duU2VhcmNoSW5wdXQgYXMgRHJvcGRvd25TZWFyY2hJbnB1dCB9O1xuaW1wb3J0IF9Ecm9wZG93blRleHQgZnJvbSAnLi9tb2R1bGVzL0Ryb3Bkb3duL0Ryb3Bkb3duVGV4dCc7XG5leHBvcnQgeyBfRHJvcGRvd25UZXh0IGFzIERyb3Bkb3duVGV4dCB9O1xuaW1wb3J0IF9FbWJlZCBmcm9tICcuL21vZHVsZXMvRW1iZWQnO1xuZXhwb3J0IHsgX0VtYmVkIGFzIEVtYmVkIH07XG5pbXBvcnQgX01vZGFsIGZyb20gJy4vbW9kdWxlcy9Nb2RhbCc7XG5leHBvcnQgeyBfTW9kYWwgYXMgTW9kYWwgfTtcbmltcG9ydCBfTW9kYWxBY3Rpb25zIGZyb20gJy4vbW9kdWxlcy9Nb2RhbC9Nb2RhbEFjdGlvbnMnO1xuZXhwb3J0IHsgX01vZGFsQWN0aW9ucyBhcyBNb2RhbEFjdGlvbnMgfTtcbmltcG9ydCBfTW9kYWxDb250ZW50IGZyb20gJy4vbW9kdWxlcy9Nb2RhbC9Nb2RhbENvbnRlbnQnO1xuZXhwb3J0IHsgX01vZGFsQ29udGVudCBhcyBNb2RhbENvbnRlbnQgfTtcbmltcG9ydCBfTW9kYWxEZXNjcmlwdGlvbiBmcm9tICcuL21vZHVsZXMvTW9kYWwvTW9kYWxEZXNjcmlwdGlvbic7XG5leHBvcnQgeyBfTW9kYWxEZXNjcmlwdGlvbiBhcyBNb2RhbERlc2NyaXB0aW9uIH07XG5pbXBvcnQgX01vZGFsRGltbWVyIGZyb20gJy4vbW9kdWxlcy9Nb2RhbC9Nb2RhbERpbW1lcic7XG5leHBvcnQgeyBfTW9kYWxEaW1tZXIgYXMgTW9kYWxEaW1tZXIgfTtcbmltcG9ydCBfTW9kYWxIZWFkZXIgZnJvbSAnLi9tb2R1bGVzL01vZGFsL01vZGFsSGVhZGVyJztcbmV4cG9ydCB7IF9Nb2RhbEhlYWRlciBhcyBNb2RhbEhlYWRlciB9O1xuaW1wb3J0IF9Qb3B1cCBmcm9tICcuL21vZHVsZXMvUG9wdXAnO1xuZXhwb3J0IHsgX1BvcHVwIGFzIFBvcHVwIH07XG5pbXBvcnQgX1BvcHVwQ29udGVudCBmcm9tICcuL21vZHVsZXMvUG9wdXAvUG9wdXBDb250ZW50JztcbmV4cG9ydCB7IF9Qb3B1cENvbnRlbnQgYXMgUG9wdXBDb250ZW50IH07XG5pbXBvcnQgX1BvcHVwSGVhZGVyIGZyb20gJy4vbW9kdWxlcy9Qb3B1cC9Qb3B1cEhlYWRlcic7XG5leHBvcnQgeyBfUG9wdXBIZWFkZXIgYXMgUG9wdXBIZWFkZXIgfTtcbmltcG9ydCBfUHJvZ3Jlc3MgZnJvbSAnLi9tb2R1bGVzL1Byb2dyZXNzJztcbmV4cG9ydCB7IF9Qcm9ncmVzcyBhcyBQcm9ncmVzcyB9O1xuaW1wb3J0IF9SYXRpbmcgZnJvbSAnLi9tb2R1bGVzL1JhdGluZyc7XG5leHBvcnQgeyBfUmF0aW5nIGFzIFJhdGluZyB9O1xuaW1wb3J0IF9SYXRpbmdJY29uIGZyb20gJy4vbW9kdWxlcy9SYXRpbmcvUmF0aW5nSWNvbic7XG5leHBvcnQgeyBfUmF0aW5nSWNvbiBhcyBSYXRpbmdJY29uIH07XG5pbXBvcnQgX1NlYXJjaCBmcm9tICcuL21vZHVsZXMvU2VhcmNoJztcbmV4cG9ydCB7IF9TZWFyY2ggYXMgU2VhcmNoIH07XG5pbXBvcnQgX1NlYXJjaENhdGVnb3J5IGZyb20gJy4vbW9kdWxlcy9TZWFyY2gvU2VhcmNoQ2F0ZWdvcnknO1xuZXhwb3J0IHsgX1NlYXJjaENhdGVnb3J5IGFzIFNlYXJjaENhdGVnb3J5IH07XG5pbXBvcnQgX1NlYXJjaFJlc3VsdCBmcm9tICcuL21vZHVsZXMvU2VhcmNoL1NlYXJjaFJlc3VsdCc7XG5leHBvcnQgeyBfU2VhcmNoUmVzdWx0IGFzIFNlYXJjaFJlc3VsdCB9O1xuaW1wb3J0IF9TZWFyY2hSZXN1bHRzIGZyb20gJy4vbW9kdWxlcy9TZWFyY2gvU2VhcmNoUmVzdWx0cyc7XG5leHBvcnQgeyBfU2VhcmNoUmVzdWx0cyBhcyBTZWFyY2hSZXN1bHRzIH07XG5pbXBvcnQgX1NpZGViYXIgZnJvbSAnLi9tb2R1bGVzL1NpZGViYXInO1xuZXhwb3J0IHsgX1NpZGViYXIgYXMgU2lkZWJhciB9O1xuaW1wb3J0IF9TaWRlYmFyUHVzaGFibGUgZnJvbSAnLi9tb2R1bGVzL1NpZGViYXIvU2lkZWJhclB1c2hhYmxlJztcbmV4cG9ydCB7IF9TaWRlYmFyUHVzaGFibGUgYXMgU2lkZWJhclB1c2hhYmxlIH07XG5pbXBvcnQgX1NpZGViYXJQdXNoZXIgZnJvbSAnLi9tb2R1bGVzL1NpZGViYXIvU2lkZWJhclB1c2hlcic7XG5leHBvcnQgeyBfU2lkZWJhclB1c2hlciBhcyBTaWRlYmFyUHVzaGVyIH07XG5pbXBvcnQgX1N0aWNreSBmcm9tICcuL21vZHVsZXMvU3RpY2t5JztcbmV4cG9ydCB7IF9TdGlja3kgYXMgU3RpY2t5IH07XG5pbXBvcnQgX1RhYiBmcm9tICcuL21vZHVsZXMvVGFiJztcbmV4cG9ydCB7IF9UYWIgYXMgVGFiIH07XG5pbXBvcnQgX1RhYlBhbmUgZnJvbSAnLi9tb2R1bGVzL1RhYi9UYWJQYW5lJztcbmV4cG9ydCB7IF9UYWJQYW5lIGFzIFRhYlBhbmUgfTtcbmltcG9ydCBfVHJhbnNpdGlvbiBmcm9tICcuL21vZHVsZXMvVHJhbnNpdGlvbic7XG5leHBvcnQgeyBfVHJhbnNpdGlvbiBhcyBUcmFuc2l0aW9uIH07XG5pbXBvcnQgX1RyYW5zaXRpb25Hcm91cCBmcm9tICcuL21vZHVsZXMvVHJhbnNpdGlvbi9UcmFuc2l0aW9uR3JvdXAnO1xuZXhwb3J0IHsgX1RyYW5zaXRpb25Hcm91cCBhcyBUcmFuc2l0aW9uR3JvdXAgfTsgLy8gVmlld3NcblxuaW1wb3J0IF9BZHZlcnRpc2VtZW50IGZyb20gJy4vdmlld3MvQWR2ZXJ0aXNlbWVudCc7XG5leHBvcnQgeyBfQWR2ZXJ0aXNlbWVudCBhcyBBZHZlcnRpc2VtZW50IH07XG5pbXBvcnQgX0NhcmQgZnJvbSAnLi92aWV3cy9DYXJkL0NhcmQnO1xuZXhwb3J0IHsgX0NhcmQgYXMgQ2FyZCB9O1xuaW1wb3J0IF9DYXJkQ29udGVudCBmcm9tICcuL3ZpZXdzL0NhcmQvQ2FyZENvbnRlbnQnO1xuZXhwb3J0IHsgX0NhcmRDb250ZW50IGFzIENhcmRDb250ZW50IH07XG5pbXBvcnQgX0NhcmREZXNjcmlwdGlvbiBmcm9tICcuL3ZpZXdzL0NhcmQvQ2FyZERlc2NyaXB0aW9uJztcbmV4cG9ydCB7IF9DYXJkRGVzY3JpcHRpb24gYXMgQ2FyZERlc2NyaXB0aW9uIH07XG5pbXBvcnQgX0NhcmRHcm91cCBmcm9tICcuL3ZpZXdzL0NhcmQvQ2FyZEdyb3VwJztcbmV4cG9ydCB7IF9DYXJkR3JvdXAgYXMgQ2FyZEdyb3VwIH07XG5pbXBvcnQgX0NhcmRIZWFkZXIgZnJvbSAnLi92aWV3cy9DYXJkL0NhcmRIZWFkZXInO1xuZXhwb3J0IHsgX0NhcmRIZWFkZXIgYXMgQ2FyZEhlYWRlciB9O1xuaW1wb3J0IF9DYXJkTWV0YSBmcm9tICcuL3ZpZXdzL0NhcmQvQ2FyZE1ldGEnO1xuZXhwb3J0IHsgX0NhcmRNZXRhIGFzIENhcmRNZXRhIH07XG5pbXBvcnQgX0NvbW1lbnQgZnJvbSAnLi92aWV3cy9Db21tZW50JztcbmV4cG9ydCB7IF9Db21tZW50IGFzIENvbW1lbnQgfTtcbmltcG9ydCBfQ29tbWVudEFjdGlvbiBmcm9tICcuL3ZpZXdzL0NvbW1lbnQvQ29tbWVudEFjdGlvbic7XG5leHBvcnQgeyBfQ29tbWVudEFjdGlvbiBhcyBDb21tZW50QWN0aW9uIH07XG5pbXBvcnQgX0NvbW1lbnRBY3Rpb25zIGZyb20gJy4vdmlld3MvQ29tbWVudC9Db21tZW50QWN0aW9ucyc7XG5leHBvcnQgeyBfQ29tbWVudEFjdGlvbnMgYXMgQ29tbWVudEFjdGlvbnMgfTtcbmltcG9ydCBfQ29tbWVudEF1dGhvciBmcm9tICcuL3ZpZXdzL0NvbW1lbnQvQ29tbWVudEF1dGhvcic7XG5leHBvcnQgeyBfQ29tbWVudEF1dGhvciBhcyBDb21tZW50QXV0aG9yIH07XG5pbXBvcnQgX0NvbW1lbnRBdmF0YXIgZnJvbSAnLi92aWV3cy9Db21tZW50L0NvbW1lbnRBdmF0YXInO1xuZXhwb3J0IHsgX0NvbW1lbnRBdmF0YXIgYXMgQ29tbWVudEF2YXRhciB9O1xuaW1wb3J0IF9Db21tZW50Q29udGVudCBmcm9tICcuL3ZpZXdzL0NvbW1lbnQvQ29tbWVudENvbnRlbnQnO1xuZXhwb3J0IHsgX0NvbW1lbnRDb250ZW50IGFzIENvbW1lbnRDb250ZW50IH07XG5pbXBvcnQgX0NvbW1lbnRHcm91cCBmcm9tICcuL3ZpZXdzL0NvbW1lbnQvQ29tbWVudEdyb3VwJztcbmV4cG9ydCB7IF9Db21tZW50R3JvdXAgYXMgQ29tbWVudEdyb3VwIH07XG5pbXBvcnQgX0NvbW1lbnRNZXRhZGF0YSBmcm9tICcuL3ZpZXdzL0NvbW1lbnQvQ29tbWVudE1ldGFkYXRhJztcbmV4cG9ydCB7IF9Db21tZW50TWV0YWRhdGEgYXMgQ29tbWVudE1ldGFkYXRhIH07XG5pbXBvcnQgX0NvbW1lbnRUZXh0IGZyb20gJy4vdmlld3MvQ29tbWVudC9Db21tZW50VGV4dCc7XG5leHBvcnQgeyBfQ29tbWVudFRleHQgYXMgQ29tbWVudFRleHQgfTtcbmltcG9ydCBfRmVlZCBmcm9tICcuL3ZpZXdzL0ZlZWQnO1xuZXhwb3J0IHsgX0ZlZWQgYXMgRmVlZCB9O1xuaW1wb3J0IF9GZWVkQ29udGVudCBmcm9tICcuL3ZpZXdzL0ZlZWQvRmVlZENvbnRlbnQnO1xuZXhwb3J0IHsgX0ZlZWRDb250ZW50IGFzIEZlZWRDb250ZW50IH07XG5pbXBvcnQgX0ZlZWREYXRlIGZyb20gJy4vdmlld3MvRmVlZC9GZWVkRGF0ZSc7XG5leHBvcnQgeyBfRmVlZERhdGUgYXMgRmVlZERhdGUgfTtcbmltcG9ydCBfRmVlZEV2ZW50IGZyb20gJy4vdmlld3MvRmVlZC9GZWVkRXZlbnQnO1xuZXhwb3J0IHsgX0ZlZWRFdmVudCBhcyBGZWVkRXZlbnQgfTtcbmltcG9ydCBfRmVlZEV4dHJhIGZyb20gJy4vdmlld3MvRmVlZC9GZWVkRXh0cmEnO1xuZXhwb3J0IHsgX0ZlZWRFeHRyYSBhcyBGZWVkRXh0cmEgfTtcbmltcG9ydCBfRmVlZExhYmVsIGZyb20gJy4vdmlld3MvRmVlZC9GZWVkTGFiZWwnO1xuZXhwb3J0IHsgX0ZlZWRMYWJlbCBhcyBGZWVkTGFiZWwgfTtcbmltcG9ydCBfRmVlZExpa2UgZnJvbSAnLi92aWV3cy9GZWVkL0ZlZWRMaWtlJztcbmV4cG9ydCB7IF9GZWVkTGlrZSBhcyBGZWVkTGlrZSB9O1xuaW1wb3J0IF9GZWVkTWV0YSBmcm9tICcuL3ZpZXdzL0ZlZWQvRmVlZE1ldGEnO1xuZXhwb3J0IHsgX0ZlZWRNZXRhIGFzIEZlZWRNZXRhIH07XG5pbXBvcnQgX0ZlZWRTdW1tYXJ5IGZyb20gJy4vdmlld3MvRmVlZC9GZWVkU3VtbWFyeSc7XG5leHBvcnQgeyBfRmVlZFN1bW1hcnkgYXMgRmVlZFN1bW1hcnkgfTtcbmltcG9ydCBfRmVlZFVzZXIgZnJvbSAnLi92aWV3cy9GZWVkL0ZlZWRVc2VyJztcbmV4cG9ydCB7IF9GZWVkVXNlciBhcyBGZWVkVXNlciB9O1xuaW1wb3J0IF9JdGVtIGZyb20gJy4vdmlld3MvSXRlbSc7XG5leHBvcnQgeyBfSXRlbSBhcyBJdGVtIH07XG5pbXBvcnQgX0l0ZW1Db250ZW50IGZyb20gJy4vdmlld3MvSXRlbS9JdGVtQ29udGVudCc7XG5leHBvcnQgeyBfSXRlbUNvbnRlbnQgYXMgSXRlbUNvbnRlbnQgfTtcbmltcG9ydCBfSXRlbURlc2NyaXB0aW9uIGZyb20gJy4vdmlld3MvSXRlbS9JdGVtRGVzY3JpcHRpb24nO1xuZXhwb3J0IHsgX0l0ZW1EZXNjcmlwdGlvbiBhcyBJdGVtRGVzY3JpcHRpb24gfTtcbmltcG9ydCBfSXRlbUV4dHJhIGZyb20gJy4vdmlld3MvSXRlbS9JdGVtRXh0cmEnO1xuZXhwb3J0IHsgX0l0ZW1FeHRyYSBhcyBJdGVtRXh0cmEgfTtcbmltcG9ydCBfSXRlbUdyb3VwIGZyb20gJy4vdmlld3MvSXRlbS9JdGVtR3JvdXAnO1xuZXhwb3J0IHsgX0l0ZW1Hcm91cCBhcyBJdGVtR3JvdXAgfTtcbmltcG9ydCBfSXRlbUhlYWRlciBmcm9tICcuL3ZpZXdzL0l0ZW0vSXRlbUhlYWRlcic7XG5leHBvcnQgeyBfSXRlbUhlYWRlciBhcyBJdGVtSGVhZGVyIH07XG5pbXBvcnQgX0l0ZW1JbWFnZSBmcm9tICcuL3ZpZXdzL0l0ZW0vSXRlbUltYWdlJztcbmV4cG9ydCB7IF9JdGVtSW1hZ2UgYXMgSXRlbUltYWdlIH07XG5pbXBvcnQgX0l0ZW1NZXRhIGZyb20gJy4vdmlld3MvSXRlbS9JdGVtTWV0YSc7XG5leHBvcnQgeyBfSXRlbU1ldGEgYXMgSXRlbU1ldGEgfTtcbmltcG9ydCBfU3RhdGlzdGljIGZyb20gJy4vdmlld3MvU3RhdGlzdGljJztcbmV4cG9ydCB7IF9TdGF0aXN0aWMgYXMgU3RhdGlzdGljIH07XG5pbXBvcnQgX1N0YXRpc3RpY0dyb3VwIGZyb20gJy4vdmlld3MvU3RhdGlzdGljL1N0YXRpc3RpY0dyb3VwJztcbmV4cG9ydCB7IF9TdGF0aXN0aWNHcm91cCBhcyBTdGF0aXN0aWNHcm91cCB9O1xuaW1wb3J0IF9TdGF0aXN0aWNMYWJlbCBmcm9tICcuL3ZpZXdzL1N0YXRpc3RpYy9TdGF0aXN0aWNMYWJlbCc7XG5leHBvcnQgeyBfU3RhdGlzdGljTGFiZWwgYXMgU3RhdGlzdGljTGFiZWwgfTtcbmltcG9ydCBfU3RhdGlzdGljVmFsdWUgZnJvbSAnLi92aWV3cy9TdGF0aXN0aWMvU3RhdGlzdGljVmFsdWUnO1xuZXhwb3J0IHsgX1N0YXRpc3RpY1ZhbHVlIGFzIFN0YXRpc3RpY1ZhbHVlIH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaXNVbmRlZmluZWQgZnJvbSBcImxvZGFzaC1lcy9pc1VuZGVmaW5lZFwiO1xuaW1wb3J0IF9zdGFydHNXaXRoIGZyb20gXCJsb2Rhc2gtZXMvc3RhcnRzV2l0aFwiO1xuaW1wb3J0IF9maWx0ZXIgZnJvbSBcImxvZGFzaC1lcy9maWx0ZXJcIjtcbmltcG9ydCBfaXNFbXB0eSBmcm9tIFwibG9kYXNoLWVzL2lzRW1wdHlcIjtcbmltcG9ydCBfa2V5cyBmcm9tIFwibG9kYXNoLWVzL2tleXNcIjtcbmltcG9ydCBfaW50ZXJzZWN0aW9uIGZyb20gXCJsb2Rhc2gtZXMvaW50ZXJzZWN0aW9uXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwibG9kYXNoLWVzL2hhc1wiO1xuaW1wb3J0IF9lYWNoIGZyb20gXCJsb2Rhc2gtZXMvZWFjaFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbnZhciBnZXREZWZhdWx0UHJvcE5hbWUgPSBmdW5jdGlvbiBnZXREZWZhdWx0UHJvcE5hbWUocHJvcCkge1xuICByZXR1cm4gXCJkZWZhdWx0XCIgKyAocHJvcFswXS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKSk7XG59O1xuLyoqXG4gKiBSZXR1cm4gdGhlIGF1dG8gY29udHJvbGxlZCBzdGF0ZSB2YWx1ZSBmb3IgYSBnaXZlIHByb3AuIFRoZSBpbml0aWFsIHZhbHVlIGlzIGNob3NlbiBpbiB0aGlzIG9yZGVyOlxuICogIC0gcmVndWxhciBwcm9wc1xuICogIC0gdGhlbiwgZGVmYXVsdCBwcm9wc1xuICogIC0gdGhlbiwgaW5pdGlhbCBzdGF0ZVxuICogIC0gdGhlbiwgYGNoZWNrZWRgIGRlZmF1bHRzIHRvIGZhbHNlXG4gKiAgLSB0aGVuLCBgdmFsdWVgIGRlZmF1bHRzIHRvICcnIG9yIFtdIGlmIHByb3BzLm11bHRpcGxlXG4gKiAgLSBlbHNlLCB1bmRlZmluZWRcbiAqXG4gKiAgQHBhcmFtIHtzdHJpbmd9IHByb3BOYW1lIEEgcHJvcCBuYW1lXG4gKiAgQHBhcmFtIHtvYmplY3R9IFtwcm9wc10gQSBwcm9wcyBvYmplY3RcbiAqICBAcGFyYW0ge29iamVjdH0gW3N0YXRlXSBBIHN0YXRlIG9iamVjdFxuICogIEBwYXJhbSB7Ym9vbGVhbn0gW2luY2x1ZGVEZWZhdWx0cz1mYWxzZV0gV2hldGhlciBvciBub3QgdG8gaGVlZCB0aGUgZGVmYXVsdCBwcm9wcyBvciBpbml0aWFsIHN0YXRlXG4gKi9cblxuXG52YXIgZ2V0QXV0b0NvbnRyb2xsZWRTdGF0ZVZhbHVlID0gZnVuY3Rpb24gZ2V0QXV0b0NvbnRyb2xsZWRTdGF0ZVZhbHVlKHByb3BOYW1lLCBwcm9wcywgc3RhdGUsIGluY2x1ZGVEZWZhdWx0cykge1xuICBpZiAoaW5jbHVkZURlZmF1bHRzID09PSB2b2lkIDApIHtcbiAgICBpbmNsdWRlRGVmYXVsdHMgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIHJlZ3VsYXIgcHJvcHNcbiAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgaWYgKHByb3BWYWx1ZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gcHJvcFZhbHVlO1xuXG4gIGlmIChpbmNsdWRlRGVmYXVsdHMpIHtcbiAgICAvLyBkZWZhdWx0UHJvcHNcbiAgICB2YXIgZGVmYXVsdFByb3AgPSBwcm9wc1tnZXREZWZhdWx0UHJvcE5hbWUocHJvcE5hbWUpXTtcbiAgICBpZiAoZGVmYXVsdFByb3AgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRQcm9wOyAvLyBpbml0aWFsIHN0YXRlIC0gc3RhdGUgbWF5IGJlIG51bGwgb3IgdW5kZWZpbmVkXG5cbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHZhciBpbml0aWFsU3RhdGUgPSBzdGF0ZVtwcm9wTmFtZV07XG4gICAgICBpZiAoaW5pdGlhbFN0YXRlICE9PSB1bmRlZmluZWQpIHJldHVybiBpbml0aWFsU3RhdGU7XG4gICAgfVxuICB9IC8vIFJlYWN0IGRvZXNuJ3QgYWxsb3cgY2hhbmdpbmcgZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29udHJvbGxlZCBjb21wb25lbnRzLFxuICAvLyBkZWZhdWx0IGNoZWNrZWQvdmFsdWUgaWYgdGhleSB3ZXJlIG5vdCBwcmVzZW50LlxuXG5cbiAgaWYgKHByb3BOYW1lID09PSAnY2hlY2tlZCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKHByb3BOYW1lID09PSAndmFsdWUnKSByZXR1cm4gcHJvcHMubXVsdGlwbGUgPyBbXSA6ICcnOyAvLyBvdGhlcndpc2UsIHVuZGVmaW5lZFxufTtcblxudmFyIE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2Rlcm5BdXRvQ29udHJvbGxlZENvbXBvbmVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVhY3QkQ29tcG9uZW50LmNhbGwuYXBwbHkoX1JlYWN0JENvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICB2YXIgX3RoaXMkY29uc3RydWN0b3IgPSBfdGhpcy5jb25zdHJ1Y3RvcixcbiAgICAgICAgYXV0b0NvbnRyb2xsZWRQcm9wcyA9IF90aGlzJGNvbnN0cnVjdG9yLmF1dG9Db250cm9sbGVkUHJvcHMsXG4gICAgICAgIGdldEF1dG9Db250cm9sbGVkU3RhdGVGcm9tUHJvcHMgPSBfdGhpcyRjb25zdHJ1Y3Rvci5nZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzO1xuICAgIHZhciBzdGF0ZSA9IF9pbnZva2UoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcyksICdnZXRJbml0aWFsQXV0b0NvbnRyb2xsZWRTdGF0ZScsIF90aGlzLnByb3BzKSB8fCB7fTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgX3RoaXMkY29uc3RydWN0b3IyID0gX3RoaXMuY29uc3RydWN0b3IsXG4gICAgICAgICAgZGVmYXVsdFByb3BzID0gX3RoaXMkY29uc3RydWN0b3IyLmRlZmF1bHRQcm9wcyxcbiAgICAgICAgICBuYW1lID0gX3RoaXMkY29uc3RydWN0b3IyLm5hbWUsXG4gICAgICAgICAgcHJvcFR5cGVzID0gX3RoaXMkY29uc3RydWN0b3IyLnByb3BUeXBlcyxcbiAgICAgICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBfdGhpcyRjb25zdHJ1Y3RvcjIuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyAvLyByZXF1aXJlIHVzYWdlIG9mIGdldEF1dG9Db250cm9sbGVkU3RhdGVGcm9tUHJvcHMoKVxuXG4gICAgICBpZiAoZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9PSBNb2Rlcm5BdXRvQ29udHJvbGxlZENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgKi9cbiAgICAgICAgY29uc29sZS5lcnJvcihcIkF1dG8gY29udHJvbGxlZCBcIiArIG5hbWUgKyBcIiBtdXN0IHNwZWNpZnkgYSBzdGF0aWMgZ2V0QXV0b0NvbnRyb2xsZWRTdGF0ZUZyb21Qcm9wcygpIGluc3RlYWQgb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkuXCIpO1xuICAgICAgfSAvLyByZXF1aXJlIHByb3BUeXBlc1xuXG5cbiAgICAgIF9lYWNoKGF1dG9Db250cm9sbGVkUHJvcHMsIGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgICAgIHZhciBkZWZhdWx0UHJvcCA9IGdldERlZmF1bHRQcm9wTmFtZShwcm9wKTsgLy8gcmVndWxhciBwcm9wXG5cbiAgICAgICAgaWYgKCFfaGFzKHByb3BUeXBlcywgZGVmYXVsdFByb3ApKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihuYW1lICsgXCIgaXMgbWlzc2luZyBcXFwiXCIgKyBkZWZhdWx0UHJvcCArIFwiXFxcIiBwcm9wVHlwZXMgdmFsaWRhdGlvbiBmb3IgYXV0byBjb250cm9sbGVkIHByb3AgXFxcIlwiICsgcHJvcCArIFwiXFxcIi5cIik7XG4gICAgICAgIH0gLy8gaXRzIGRlZmF1bHQgcHJvcFxuXG5cbiAgICAgICAgaWYgKCFfaGFzKHByb3BUeXBlcywgcHJvcCkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKG5hbWUgKyBcIiBpcyBtaXNzaW5nIHByb3BUeXBlcyB2YWxpZGF0aW9uIGZvciBhdXRvIGNvbnRyb2xsZWQgcHJvcCBcXFwiXCIgKyBwcm9wICsgXCJcXFwiLlwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7IC8vIHByZXZlbnQgYXV0b0NvbnRyb2xsZWRQcm9wcyBpbiBkZWZhdWx0UHJvcHNcbiAgICAgIC8vXG4gICAgICAvLyBXaGVuIHNldHRpbmcgc3RhdGUsIGF1dG8gY29udHJvbGxlZCBwcm9wcyB2YWx1ZXMgYWx3YXlzIHdpbiAoc28gdGhlIHBhcmVudCBjYW4gbWFuYWdlIHRoZW0pLlxuICAgICAgLy8gSXQgaXMgbm90IHJlYXNvbmFibGUgdG8gZGVjaXBoZXIgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgYW5kIGRlZmF1bHRQcm9wcy5cbiAgICAgIC8vIEFsbG93aW5nIGRlZmF1bHRQcm9wcyByZXN1bHRzIGluIHRyeVNldFN0YXRlIGFsd2F5cyBkZWZlcnJpbmcgdG8gdGhlIGRlZmF1bHRQcm9wIHZhbHVlLlxuICAgICAgLy8gQXV0byBjb250cm9sbGVkIHByb3BzIGFsc28gbGlzdGVkIGluIGRlZmF1bHRQcm9wcyBjYW4gbmV2ZXIgYmUgdXBkYXRlZC5cbiAgICAgIC8vXG4gICAgICAvLyBUbyBzZXQgZGVmYXVsdHMgZm9yIGFuIEF1dG9Db250cm9sbGVkIHByb3AsIHlvdSBjYW4gc2V0IHRoZSBpbml0aWFsIHN0YXRlIGluIHRoZVxuICAgICAgLy8gY29uc3RydWN0b3Igb3IgYnkgdXNpbmcgYW4gRVM3IHByb3BlcnR5IGluaXRpYWxpemVyOlxuICAgICAgLy8gaHR0cHM6Ly9iYWJlbGpzLmlvL2Jsb2cvMjAxNS8wNi8wNy9yZWFjdC1vbi1lczYtcGx1cyNwcm9wZXJ0eS1pbml0aWFsaXplcnNcblxuXG4gICAgICB2YXIgaWxsZWdhbERlZmF1bHRzID0gX2ludGVyc2VjdGlvbihhdXRvQ29udHJvbGxlZFByb3BzLCBfa2V5cyhkZWZhdWx0UHJvcHMpKTtcblxuICAgICAgaWYgKCFfaXNFbXB0eShpbGxlZ2FsRGVmYXVsdHMpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoWydEbyBub3Qgc2V0IGRlZmF1bHRQcm9wcyBmb3IgYXV0b0NvbnRyb2xsZWRQcm9wcy4gWW91IGNhbiBzZXQgZGVmYXVsdHMgYnknLCAnc2V0dGluZyBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3Igb3IgdXNpbmcgYW4gRVM3IHByb3BlcnR5IGluaXRpYWxpemVyJywgJyhodHRwczovL2JhYmVsanMuaW8vYmxvZy8yMDE1LzA2LzA3L3JlYWN0LW9uLWVzNi1wbHVzI3Byb3BlcnR5LWluaXRpYWxpemVycyknLCBcIlNlZSBcIiArIG5hbWUgKyBcIiBwcm9wczogXFxcIlwiICsgaWxsZWdhbERlZmF1bHRzICsgXCJcXFwiLlwiXS5qb2luKCcgJykpO1xuICAgICAgfSAvLyBwcmV2ZW50IGxpc3RpbmcgZGVmYXVsdFByb3BzIGluIGF1dG9Db250cm9sbGVkUHJvcHNcbiAgICAgIC8vXG4gICAgICAvLyBEZWZhdWx0IHByb3BzIGFyZSBhdXRvbWF0aWNhbGx5IGhhbmRsZWQuXG4gICAgICAvLyBMaXN0aW5nIGRlZmF1bHRzIGluIGF1dG9Db250cm9sbGVkUHJvcHMgd291bGQgcmVzdWx0IGluIGFsbG93aW5nIGRlZmF1bHREZWZhdWx0VmFsdWUgcHJvcHMuXG5cblxuICAgICAgdmFyIGlsbGVnYWxBdXRvQ29udHJvbGxlZCA9IF9maWx0ZXIoYXV0b0NvbnRyb2xsZWRQcm9wcywgZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIF9zdGFydHNXaXRoKHByb3AsICdkZWZhdWx0Jyk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFfaXNFbXB0eShpbGxlZ2FsQXV0b0NvbnRyb2xsZWQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoWydEbyBub3QgYWRkIGRlZmF1bHQgcHJvcHMgdG8gYXV0b0NvbnRyb2xsZWRQcm9wcy4nLCAnRGVmYXVsdCBwcm9wcyBhcmUgYXV0b21hdGljYWxseSBoYW5kbGVkLicsIFwiU2VlIFwiICsgbmFtZSArIFwiIGF1dG9Db250cm9sbGVkUHJvcHM6IFxcXCJcIiArIGlsbGVnYWxBdXRvQ29udHJvbGxlZCArIFwiXFxcIi5cIl0uam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9IC8vIEF1dG8gY29udHJvbGxlZCBwcm9wcyBhcmUgY29waWVkIHRvIHN0YXRlLlxuICAgIC8vIFNldCBpbml0aWFsIHN0YXRlIGJ5IGNvcHlpbmcgYXV0byBjb250cm9sbGVkIHByb3BzIHRvIHN0YXRlLlxuICAgIC8vIEFsc28gbG9vayBmb3IgdGhlIGRlZmF1bHQgcHJvcCBmb3IgYW55IGF1dG8gY29udHJvbGxlZCBwcm9wcyAoZm9vID0+IGRlZmF1bHRGb28pXG4gICAgLy8gc28gd2UgY2FuIHNldCBpbml0aWFsIHZhbHVlcyBmcm9tIGRlZmF1bHRzLlxuXG5cbiAgICB2YXIgaW5pdGlhbEF1dG9Db250cm9sbGVkU3RhdGUgPSBhdXRvQ29udHJvbGxlZFByb3BzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwcm9wKSB7XG4gICAgICBhY2NbcHJvcF0gPSBnZXRBdXRvQ29udHJvbGxlZFN0YXRlVmFsdWUocHJvcCwgX3RoaXMucHJvcHMsIHN0YXRlLCB0cnVlKTtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIGRlZmF1bHRQcm9wTmFtZSA9IGdldERlZmF1bHRQcm9wTmFtZShwcm9wKTtcbiAgICAgICAgdmFyIF9uYW1lID0gX3RoaXMuY29uc3RydWN0b3IubmFtZTsgLy8gcHJldmVudCBkZWZhdWx0Rm9vPXt9IGFsb25nIHNpZGUgZm9vPXt9XG5cbiAgICAgICAgaWYgKCFfaXNVbmRlZmluZWQoX3RoaXMucHJvcHNbZGVmYXVsdFByb3BOYW1lXSkgJiYgIV9pc1VuZGVmaW5lZChfdGhpcy5wcm9wc1twcm9wXSkpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKF9uYW1lICsgXCIgcHJvcCBcXFwiXCIgKyBwcm9wICsgXCJcXFwiIGlzIGF1dG8gY29udHJvbGxlZC4gU3BlY2lmeSBlaXRoZXIgXCIgKyBkZWZhdWx0UHJvcE5hbWUgKyBcIiBvciBcIiArIHByb3AgKyBcIiwgYnV0IG5vdCBib3RoLlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcbiAgICBfdGhpcy5zdGF0ZSA9IF9leHRlbmRzKHt9LCBzdGF0ZSwgaW5pdGlhbEF1dG9Db250cm9sbGVkU3RhdGUsIHtcbiAgICAgIGF1dG9Db250cm9sbGVkUHJvcHM6IGF1dG9Db250cm9sbGVkUHJvcHMsXG4gICAgICBnZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzOiBnZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzXG4gICAgfSk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIHZhciBhdXRvQ29udHJvbGxlZFByb3BzID0gc3RhdGUuYXV0b0NvbnRyb2xsZWRQcm9wcyxcbiAgICAgICAgZ2V0QXV0b0NvbnRyb2xsZWRTdGF0ZUZyb21Qcm9wcyA9IHN0YXRlLmdldEF1dG9Db250cm9sbGVkU3RhdGVGcm9tUHJvcHM7IC8vIFNvbHZlIHRoZSBuZXh0IHN0YXRlIGZvciBhdXRvQ29udHJvbGxlZFByb3BzXG5cbiAgICB2YXIgbmV3U3RhdGVGcm9tUHJvcHMgPSBhdXRvQ29udHJvbGxlZFByb3BzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwcm9wKSB7XG4gICAgICB2YXIgaXNOZXh0RGVmaW5lZCA9ICFfaXNVbmRlZmluZWQocHJvcHNbcHJvcF0pOyAvLyBpZiBuZXh0IGlzIGRlZmluZWQgdGhlbiB1c2UgaXRzIHZhbHVlXG5cbiAgICAgIGlmIChpc05leHREZWZpbmVkKSBhY2NbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pOyAvLyBEdWUgdG8gdGhlIGluaGVyaXRhbmNlIG9mIHRoZSBBdXRvQ29udHJvbGxlZENvbXBvbmVudCB3ZSBzaG91bGQgY2FsbCBpdHNcbiAgICAvLyBnZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzKCkgYW5kIG1lcmdlIGl0IHdpdGggdGhlIGV4aXN0aW5nIHN0YXRlXG5cbiAgICBpZiAoZ2V0QXV0b0NvbnRyb2xsZWRTdGF0ZUZyb21Qcm9wcykge1xuICAgICAgdmFyIGNvbXB1dGVkU3RhdGUgPSBnZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBfZXh0ZW5kcyh7fSwgc3RhdGUsIG5ld1N0YXRlRnJvbVByb3BzKSwgc3RhdGUpOyAvLyBXZSBzaG91bGQgZm9sbG93IHRoZSBpZGVhIG9mIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcygpIGFuZCByZXR1cm4gb25seSBtb2RpZmllZCBzdGF0ZVxuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIG5ld1N0YXRlRnJvbVByb3BzLCBjb21wdXRlZFN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3U3RhdGVGcm9tUHJvcHM7XG4gIH1cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHVzZSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKSBpbiBjaGlsZCBjb21wb25lbnRzLlxuICAgKi9cbiAgO1xuXG4gIE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50LmdldEF1dG9Db250cm9sbGVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHJldHVybiBNb2Rlcm5BdXRvQ29udHJvbGxlZENvbXBvbmVudDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuZXhwb3J0IHsgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdW5pcSBmcm9tIFwibG9kYXNoLWVzL3VuaXFcIjtcbmltcG9ydCBfdmFsdWVzIGZyb20gXCJsb2Rhc2gtZXMvdmFsdWVzXCI7XG5pbXBvcnQgX2tleXMgZnJvbSBcImxvZGFzaC1lcy9rZXlzXCI7XG5pbXBvcnQgeyBudW1iZXJUb1dvcmRNYXAgfSBmcm9tICcuL251bWJlclRvV29yZCc7XG5leHBvcnQgdmFyIENPTE9SUyA9IFsncmVkJywgJ29yYW5nZScsICd5ZWxsb3cnLCAnb2xpdmUnLCAnZ3JlZW4nLCAndGVhbCcsICdibHVlJywgJ3Zpb2xldCcsICdwdXJwbGUnLCAncGluaycsICdicm93bicsICdncmV5JywgJ2JsYWNrJ107XG5leHBvcnQgdmFyIEZMT0FUUyA9IFsnbGVmdCcsICdyaWdodCddO1xuZXhwb3J0IHZhciBTSVpFUyA9IFsnbWluaScsICd0aW55JywgJ3NtYWxsJywgJ21lZGl1bScsICdsYXJnZScsICdiaWcnLCAnaHVnZScsICdtYXNzaXZlJ107XG5leHBvcnQgdmFyIFRFWFRfQUxJR05NRU5UUyA9IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnLCAnanVzdGlmaWVkJ107XG5leHBvcnQgdmFyIFZFUlRJQ0FMX0FMSUdOTUVOVFMgPSBbJ2JvdHRvbScsICdtaWRkbGUnLCAndG9wJ107XG5leHBvcnQgdmFyIFZJU0lCSUxJVFkgPSBbJ21vYmlsZScsICd0YWJsZXQnLCAnY29tcHV0ZXInLCAnbGFyZ2Ugc2NyZWVuJywgJ3dpZGVzY3JlZW4nXTtcbmV4cG9ydCB2YXIgV0lEVEhTID0gW10uY29uY2F0KF9rZXlzKG51bWJlclRvV29yZE1hcCksIF9rZXlzKG51bWJlclRvV29yZE1hcCkubWFwKE51bWJlciksIF92YWx1ZXMobnVtYmVyVG9Xb3JkTWFwKSk7XG5leHBvcnQgdmFyIERJUkVDVElPTkFMX1RSQU5TSVRJT05TID0gWydicm93c2UnLCAnYnJvd3NlIHJpZ2h0JywgJ2Ryb3AnLCAnZmFkZScsICdmYWRlIHVwJywgJ2ZhZGUgZG93bicsICdmYWRlIGxlZnQnLCAnZmFkZSByaWdodCcsICdmbHkgdXAnLCAnZmx5IGRvd24nLCAnZmx5IGxlZnQnLCAnZmx5IHJpZ2h0JywgJ2hvcml6b250YWwgZmxpcCcsICd2ZXJ0aWNhbCBmbGlwJywgJ3NjYWxlJywgJ3NsaWRlIHVwJywgJ3NsaWRlIGRvd24nLCAnc2xpZGUgbGVmdCcsICdzbGlkZSByaWdodCcsICdzd2luZyB1cCcsICdzd2luZyBkb3duJywgJ3N3aW5nIGxlZnQnLCAnc3dpbmcgcmlnaHQnLCAnem9vbSddO1xuZXhwb3J0IHZhciBTVEFUSUNfVFJBTlNJVElPTlMgPSBbJ2ppZ2dsZScsICdmbGFzaCcsICdzaGFrZScsICdwdWxzZScsICd0YWRhJywgJ2JvdW5jZScsICdnbG93J107XG5leHBvcnQgdmFyIFRSQU5TSVRJT05TID0gW10uY29uY2F0KERJUkVDVElPTkFMX1RSQU5TSVRJT05TLCBTVEFUSUNfVFJBTlNJVElPTlMpOyAvLyBHZW5lcmF0ZWQgZnJvbTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUkvYmxvYi9tYXN0ZXIvZGlzdC9jb21wb25lbnRzL2ljb24uY3NzXG5cbmV4cG9ydCB2YXIgQUNDRVNTSUJJTElUWSA9IFsnYW1lcmljYW4gc2lnbiBsYW5ndWFnZSBpbnRlcnByZXRpbmcnLCAnYXNzaXN0aXZlIGxpc3RlbmluZyBzeXN0ZW1zJywgJ2F1ZGlvIGRlc2NyaXB0aW9uJywgJ2JsaW5kJywgJ2JyYWlsbGUnLCAnY2xvc2VkIGNhcHRpb25pbmcnLCAnY2xvc2VkIGNhcHRpb25pbmcgb3V0bGluZScsICdkZWFmJywgJ2xvdyB2aXNpb24nLCAncGhvbmUgdm9sdW1lJywgJ3F1ZXN0aW9uIGNpcmNsZScsICdxdWVzdGlvbiBjaXJjbGUgb3V0bGluZScsICdzaWduIGxhbmd1YWdlJywgJ3R0eScsICd1bml2ZXJzYWwgYWNjZXNzJywgJ3doZWVsY2hhaXInXTtcbmV4cG9ydCB2YXIgQVJST1dTID0gWydhbmdsZSBkb3VibGUgZG93bicsICdhbmdsZSBkb3VibGUgbGVmdCcsICdhbmdsZSBkb3VibGUgcmlnaHQnLCAnYW5nbGUgZG91YmxlIHVwJywgJ2FuZ2xlIGRvd24nLCAnYW5nbGUgbGVmdCcsICdhbmdsZSByaWdodCcsICdhbmdsZSB1cCcsICdhcnJvdyBhbHRlcm5hdGUgY2lyY2xlIGRvd24nLCAnYXJyb3cgYWx0ZXJuYXRlIGNpcmNsZSBkb3duIG91dGxpbmUnLCAnYXJyb3cgYWx0ZXJuYXRlIGNpcmNsZSBsZWZ0JywgJ2Fycm93IGFsdGVybmF0ZSBjaXJjbGUgbGVmdCBvdXRsaW5lJywgJ2Fycm93IGFsdGVybmF0ZSBjaXJjbGUgcmlnaHQnLCAnYXJyb3cgYWx0ZXJuYXRlIGNpcmNsZSByaWdodCBvdXRsaW5lJywgJ2Fycm93IGFsdGVybmF0ZSBjaXJjbGUgdXAnLCAnYXJyb3cgYWx0ZXJuYXRlIGNpcmNsZSB1cCBvdXRsaW5lJywgJ2Fycm93IGNpcmNsZSBkb3duJywgJ2Fycm93IGNpcmNsZSBsZWZ0JywgJ2Fycm93IGNpcmNsZSByaWdodCcsICdhcnJvdyBjaXJjbGUgdXAnLCAnYXJyb3cgZG93bicsICdhcnJvdyBsZWZ0JywgJ2Fycm93IHJpZ2h0JywgJ2Fycm93IHVwJywgJ2Fycm93cyBhbHRlcm5hdGUnLCAnYXJyb3dzIGFsdGVybmF0ZSBob3Jpem9udGFsJywgJ2Fycm93cyBhbHRlcm5hdGUgdmVydGljYWwnLCAnY2FyZXQgZG93bicsICdjYXJldCBsZWZ0JywgJ2NhcmV0IHJpZ2h0JywgJ2NhcmV0IHNxdWFyZSBkb3duJywgJ2NhcmV0IHNxdWFyZSBkb3duIG91dGxpbmUnLCAnY2FyZXQgc3F1YXJlIGxlZnQnLCAnY2FyZXQgc3F1YXJlIGxlZnQgb3V0bGluZScsICdjYXJldCBzcXVhcmUgcmlnaHQnLCAnY2FyZXQgc3F1YXJlIHJpZ2h0IG91dGxpbmUnLCAnY2FyZXQgc3F1YXJlIHVwJywgJ2NhcmV0IHNxdWFyZSB1cCBvdXRsaW5lJywgJ2NhcmV0IHVwJywgJ2NhcnQgYXJyb3cgZG93bicsICdjaGFydCBsaW5lJywgJ2NoZXZyb24gY2lyY2xlIGRvd24nLCAnY2hldnJvbiBjaXJjbGUgbGVmdCcsICdjaGV2cm9uIGNpcmNsZSByaWdodCcsICdjaGV2cm9uIGNpcmNsZSB1cCcsICdjaGV2cm9uIGRvd24nLCAnY2hldnJvbiBsZWZ0JywgJ2NoZXZyb24gcmlnaHQnLCAnY2hldnJvbiB1cCcsICdjbG91ZCBkb3dubG9hZCcsICdjbG91ZCB1cGxvYWQnLCAnZG93bmxvYWQnLCAnZXhjaGFuZ2UnLCAnZXhwYW5kIGFycm93cyBhbHRlcm5hdGUnLCAnZXh0ZXJuYWwgYWx0ZXJuYXRlJywgJ2V4dGVybmFsIHNxdWFyZSBhbHRlcm5hdGUnLCAnaGFuZCBwb2ludCBkb3duJywgJ2hhbmQgcG9pbnQgZG93biBvdXRsaW5lJywgJ2hhbmQgcG9pbnQgbGVmdCcsICdoYW5kIHBvaW50IGxlZnQgb3V0bGluZScsICdoYW5kIHBvaW50IHJpZ2h0JywgJ2hhbmQgcG9pbnQgcmlnaHQgb3V0bGluZScsICdoYW5kIHBvaW50IHVwJywgJ2hhbmQgcG9pbnQgdXAgb3V0bGluZScsICdoYW5kIHBvaW50ZXInLCAnaGFuZCBwb2ludGVyIG91dGxpbmUnLCAnaGlzdG9yeScsICdsZXZlbCBkb3duIGFsdGVybmF0ZScsICdsZXZlbCB1cCBhbHRlcm5hdGUnLCAnbG9jYXRpb24gYXJyb3cnLCAnbG9uZyBhcnJvdyBhbHRlcm5hdGUgZG93bicsICdsb25nIGFycm93IGFsdGVybmF0ZSBsZWZ0JywgJ2xvbmcgYXJyb3cgYWx0ZXJuYXRlIHJpZ2h0JywgJ2xvbmcgYXJyb3cgYWx0ZXJuYXRlIHVwJywgJ21vdXNlIHBvaW50ZXInLCAncGxheScsICdyYW5kb20nLCAncmVjeWNsZScsICdyZWRvJywgJ3JlZG8gYWx0ZXJuYXRlJywgJ3JlcGx5JywgJ3JlcGx5IGFsbCcsICdyZXR3ZWV0JywgJ3NoYXJlJywgJ3NoYXJlIHNxdWFyZScsICdzaGFyZSBzcXVhcmUgb3V0bGluZScsICdzaWduLWluJywgJ3NpZ24tb3V0JywgJ3NpZ24taW4gYWx0ZXJuYXRlJywgJ3NpZ24tb3V0IGFsdGVybmF0ZScsICdzb3J0JywgJ3NvcnQgYWxwaGFiZXQgZG93bicsICdzb3J0IGFscGhhYmV0IHVwJywgJ3NvcnQgYW1vdW50IGRvd24nLCAnc29ydCBhbW91bnQgdXAnLCAnc29ydCBkb3duJywgJ3NvcnQgbnVtZXJpYyBkb3duJywgJ3NvcnQgbnVtZXJpYyB1cCcsICdzb3J0IHVwJywgJ3N5bmMnLCAnc3luYyBhbHRlcm5hdGUnLCAndGV4dCBoZWlnaHQnLCAndGV4dCB3aWR0aCcsICd1bmRvJywgJ3VuZG8gYWx0ZXJuYXRlJywgJ3VwbG9hZCcsICd6b29tLWluJywgJ3pvb20tb3V0J107XG5leHBvcnQgdmFyIEFVRElPX1ZJREVPID0gWydhdWRpbyBkZXNjcmlwdGlvbicsICdiYWNrd2FyZCcsICdjaXJjbGUnLCAnY2lyY2xlIG91dGxpbmUnLCAnY2xvc2VkIGNhcHRpb25pbmcnLCAnY2xvc2VkIGNhcHRpb25pbmcgb3V0bGluZScsICdjb21wcmVzcycsICdlamVjdCcsICdleHBhbmQnLCAnZXhwYW5kIGFycm93cyBhbHRlcm5hdGUnLCAnZmFzdCBiYWNrd2FyZCcsICdmYXN0IGZvcndhcmQnLCAnZmlsZSBhdWRpbycsICdmaWxlIGF1ZGlvIG91dGxpbmUnLCAnZmlsZSB2aWRlbycsICdmaWxlIHZpZGVvIG91dGxpbmUnLCAnZmlsbScsICdmb3J3YXJkJywgJ2hlYWRwaG9uZXMnLCAnbWljcm9waG9uZScsICdtaWNyb3Bob25lIHNsYXNoJywgJ211c2ljJywgJ3BhdXNlJywgJ3BhdXNlIGNpcmNsZScsICdwYXVzZSBjaXJjbGUgb3V0bGluZScsICdwaG9uZSB2b2x1bWUnLCAncGxheScsICdwbGF5IGNpcmNsZScsICdwbGF5IGNpcmNsZSBvdXRsaW5lJywgJ3BvZGNhc3QnLCAncmFuZG9tJywgJ3JlZG8nLCAncmVkbyBhbHRlcm5hdGUnLCAncnNzJywgJ3JzcyBzcXVhcmUnLCAnc3RlcCBiYWNrd2FyZCcsICdzdGVwIGZvcndhcmQnLCAnc3RvcCcsICdzdG9wIGNpcmNsZScsICdzdG9wIGNpcmNsZSBvdXRsaW5lJywgJ3N5bmMnLCAnc3luYyBhbHRlcm5hdGUnLCAndW5kbycsICd1bmRvIGFsdGVybmF0ZScsICd2aWRlbycsICd2b2x1bWUgZG93bicsICd2b2x1bWUgb2ZmJywgJ3ZvbHVtZSB1cCddO1xuZXhwb3J0IHZhciBCVVNJTkVTUyA9IFsnYWRkcmVzcyBib29rJywgJ2FkZHJlc3MgYm9vayBvdXRsaW5lJywgJ2FkZHJlc3MgY2FyZCcsICdhZGRyZXNzIGNhcmQgb3V0bGluZScsICdhcmNoaXZlJywgJ2JhbGFuY2Ugc2NhbGUnLCAnYmlydGhkYXkgY2FrZScsICdib29rJywgJ2JyaWVmY2FzZScsICdidWlsZGluZycsICdidWlsZGluZyBvdXRsaW5lJywgJ2J1bGxob3JuJywgJ2J1bGxzZXllJywgJ2NhbGN1bGF0b3InLCAnY2FsZW5kYXInLCAnY2FsZW5kYXIgb3V0bGluZScsICdjYWxlbmRhciBhbHRlcm5hdGUnLCAnY2FsZW5kYXIgYWx0ZXJuYXRlIG91dGxpbmUnLCAnY2VydGlmaWNhdGUnLCAnY2hhcnQgYXJlYScsICdjaGFydCBiYXInLCAnY2hhcnQgYmFyIG91dGxpbmUnLCAnY2hhcnQgbGluZScsICdjaGFydCBwaWUnLCAnY2xpcGJvYXJkJywgJ2NsaXBib2FyZCBvdXRsaW5lJywgJ2NvZmZlZScsICdjb2x1bW5zJywgJ2NvbXBhc3MnLCAnY29tcGFzcyBvdXRsaW5lJywgJ2NvcHknLCAnY29weSBvdXRsaW5lJywgJ2NvcHlyaWdodCcsICdjb3B5cmlnaHQgb3V0bGluZScsICdjdXQnLCAnZWRpdCcsICdlZGl0IG91dGxpbmUnLCAnZW52ZWxvcGUnLCAnZW52ZWxvcGUgb3V0bGluZScsICdlbnZlbG9wZSBvcGVuJywgJ2VudmVsb3BlIG9wZW4gb3V0bGluZScsICdlbnZlbG9wZSBzcXVhcmUnLCAnZXJhc2VyJywgJ2ZheCcsICdmaWxlJywgJ2ZpbGUgb3V0bGluZScsICdmaWxlIGFsdGVybmF0ZScsICdmaWxlIGFsdGVybmF0ZSBvdXRsaW5lJywgJ2ZvbGRlcicsICdmb2xkZXIgb3V0bGluZScsICdmb2xkZXIgb3BlbicsICdmb2xkZXIgb3BlbiBvdXRsaW5lJywgJ2dsb2JlJywgJ2luZHVzdHJ5JywgJ3BhcGVyY2xpcCcsICdwYXN0ZScsICdwZW4gc3F1YXJlJywgJ3BlbmNpbCBhbHRlcm5hdGUnLCAncGVyY2VudCcsICdwaG9uZScsICdwaG9uZSBzcXVhcmUnLCAncGhvbmUgdm9sdW1lJywgJ3JlZ2lzdGVyZWQnLCAncmVnaXN0ZXJlZCBvdXRsaW5lJywgJ3NhdmUnLCAnc2F2ZSBvdXRsaW5lJywgJ3NpdGVtYXAnLCAnc3RpY2t5IG5vdGUnLCAnc3RpY2t5IG5vdGUgb3V0bGluZScsICdzdWl0Y2FzZScsICd0YWJsZScsICd0YWcnLCAndGFncycsICd0YXNrcycsICd0aHVtYnRhY2snLCAndHJhZGVtYXJrJ107XG5leHBvcnQgdmFyIENIRVNTID0gWydjaGVzcycsICdjaGVzcyBiaXNob3AnLCAnY2hlc3MgYm9hcmQnLCAnY2hlc3Mga2luZycsICdjaGVzcyBrbmlnaHQnLCAnY2hlc3MgcGF3bicsICdjaGVzcyBxdWVlbicsICdjaGVzcyByb29rJywgJ3NxdWFyZSBmdWxsJ107XG5leHBvcnQgdmFyIENPREUgPSBbJ2FyY2hpdmUnLCAnYmFyY29kZScsICdiYXRoJywgJ2J1ZycsICdjb2RlJywgJ2NvZGUgYnJhbmNoJywgJ2NvZmZlZScsICdmaWxlJywgJ2ZpbGUgb3V0bGluZScsICdmaWxlIGFsdGVybmF0ZScsICdmaWxlIGFsdGVybmF0ZSBvdXRsaW5lJywgJ2ZpbGUgY29kZScsICdmaWxlIGNvZGUgb3V0bGluZScsICdmaWx0ZXInLCAnZmlyZSBleHRpbmd1aXNoZXInLCAnZm9sZGVyJywgJ2ZvbGRlciBvdXRsaW5lJywgJ2ZvbGRlciBvcGVuJywgJ2ZvbGRlciBvcGVuIG91dGxpbmUnLCAna2V5Ym9hcmQnLCAna2V5Ym9hcmQgb3V0bGluZScsICdtaWNyb2NoaXAnLCAncXJjb2RlJywgJ3NoaWVsZCBhbHRlcm5hdGUnLCAnc2l0ZW1hcCcsICd0ZXJtaW5hbCcsICd1c2VyIHNlY3JldCcsICd3aW5kb3cgY2xvc2UnLCAnd2luZG93IGNsb3NlIG91dGxpbmUnLCAnd2luZG93IG1heGltaXplJywgJ3dpbmRvdyBtYXhpbWl6ZSBvdXRsaW5lJywgJ3dpbmRvdyBtaW5pbWl6ZScsICd3aW5kb3cgbWluaW1pemUgb3V0bGluZScsICd3aW5kb3cgcmVzdG9yZScsICd3aW5kb3cgcmVzdG9yZSBvdXRsaW5lJ107XG5leHBvcnQgdmFyIENPTU1VTklDQVRJT04gPSBbJ2FkZHJlc3MgYm9vaycsICdhZGRyZXNzIGJvb2sgb3V0bGluZScsICdhZGRyZXNzIGNhcmQnLCAnYWRkcmVzcyBjYXJkIG91dGxpbmUnLCAnYW1lcmljYW4gc2lnbiBsYW5ndWFnZSBpbnRlcnByZXRpbmcnLCAnYXNzaXN0aXZlIGxpc3RlbmluZyBzeXN0ZW1zJywgJ2F0JywgJ2JlbGwnLCAnYmVsbCBvdXRsaW5lJywgJ2JlbGwgc2xhc2gnLCAnYmVsbCBzbGFzaCBvdXRsaW5lJywgJ2J1bGxob3JuJywgJ2NvbW1lbnQnLCAnY29tbWVudCBvdXRsaW5lJywgJ2NvbW1lbnQgYWx0ZXJuYXRlJywgJ2NvbW1lbnQgYWx0ZXJuYXRlIG91dGxpbmUnLCAnY29tbWVudHMnLCAnY29tbWVudHMgb3V0bGluZScsICdlbnZlbG9wZScsICdlbnZlbG9wZSBvdXRsaW5lJywgJ2VudmVsb3BlIG9wZW4nLCAnZW52ZWxvcGUgb3BlbiBvdXRsaW5lJywgJ2VudmVsb3BlIHNxdWFyZScsICdmYXgnLCAnaW5ib3gnLCAnbGFuZ3VhZ2UnLCAnbWljcm9waG9uZScsICdtaWNyb3Bob25lIHNsYXNoJywgJ21vYmlsZScsICdtb2JpbGUgYWx0ZXJuYXRlJywgJ3BhcGVyIHBsYW5lJywgJ3BhcGVyIHBsYW5lIG91dGxpbmUnLCAncGhvbmUnLCAncGhvbmUgc3F1YXJlJywgJ3Bob25lIHZvbHVtZScsICdyc3MnLCAncnNzIHNxdWFyZScsICd0dHknLCAnd2lmaSddO1xuZXhwb3J0IHZhciBDT01QVVRFUlMgPSBbJ2Rlc2t0b3AnLCAnZG93bmxvYWQnLCAnaGRkJywgJ2hkZCBvdXRsaW5lJywgJ2hlYWRwaG9uZXMnLCAna2V5Ym9hcmQnLCAna2V5Ym9hcmQgb3V0bGluZScsICdsYXB0b3AnLCAnbWljcm9jaGlwJywgJ21vYmlsZScsICdtb2JpbGUgYWx0ZXJuYXRlJywgJ3BsdWcnLCAncG93ZXIgb2ZmJywgJ3ByaW50JywgJ3NhdmUnLCAnc2F2ZSBvdXRsaW5lJywgJ3NlcnZlcicsICd0YWJsZXQnLCAndGFibGV0IGFsdGVybmF0ZScsICd0dicsICd1cGxvYWQnXTtcbmV4cG9ydCB2YXIgQ1VSUkVOQ1kgPSBbJ2RvbGxhciBzaWduJywgJ2V1cm8gc2lnbicsICdsaXJhIHNpZ24nLCAnbW9uZXkgYmlsbCBhbHRlcm5hdGUnLCAnbW9uZXkgYmlsbCBhbHRlcm5hdGUgb3V0bGluZScsICdwb3VuZCBzaWduJywgJ3J1YmxlIHNpZ24nLCAncnVwZWUgc2lnbicsICdzaGVrZWwgc2lnbicsICd3b24gc2lnbicsICd5ZW4gc2lnbiddO1xuZXhwb3J0IHZhciBEQVRFX1RJTUUgPSBbJ2JlbGwnLCAnYmVsbCBvdXRsaW5lJywgJ2JlbGwgc2xhc2gnLCAnYmVsbCBzbGFzaCBvdXRsaW5lJywgJ2NhbGVuZGFyJywgJ2NhbGVuZGFyIG91dGxpbmUnLCAnY2FsZW5kYXIgYWx0ZXJuYXRlJywgJ2NhbGVuZGFyIGFsdGVybmF0ZSBvdXRsaW5lJywgJ2NhbGVuZGFyIGNoZWNrJywgJ2NhbGVuZGFyIGNoZWNrIG91dGxpbmUnLCAnY2FsZW5kYXIgbWludXMnLCAnY2FsZW5kYXIgbWludXMgb3V0bGluZScsICdjYWxlbmRhciBwbHVzJywgJ2NhbGVuZGFyIHBsdXMgb3V0bGluZScsICdjYWxlbmRhciB0aW1lcycsICdjYWxlbmRhciB0aW1lcyBvdXRsaW5lJywgJ2Nsb2NrJywgJ2Nsb2NrIG91dGxpbmUnLCAnaG91cmdsYXNzJywgJ2hvdXJnbGFzcyBvdXRsaW5lJywgJ2hvdXJnbGFzcyBlbmQnLCAnaG91cmdsYXNzIGhhbGYnLCAnaG91cmdsYXNzIHN0YXJ0JywgJ3N0b3B3YXRjaCddO1xuZXhwb3J0IHZhciBERVNJR04gPSBbJ2FkanVzdCcsICdjbG9uZScsICdjbG9uZSBvdXRsaW5lJywgJ2NvcHknLCAnY29weSBvdXRsaW5lJywgJ2Nyb3AnLCAnY3Jvc3NoYWlycycsICdjdXQnLCAnZWRpdCcsICdlZGl0IG91dGxpbmUnLCAnZXJhc2VyJywgJ2V5ZScsICdleWUgZHJvcHBlcicsICdleWUgc2xhc2gnLCAnZXllIHNsYXNoIG91dGxpbmUnLCAnb2JqZWN0IGdyb3VwJywgJ29iamVjdCBncm91cCBvdXRsaW5lJywgJ29iamVjdCB1bmdyb3VwJywgJ29iamVjdCB1bmdyb3VwIG91dGxpbmUnLCAncGFpbnQgYnJ1c2gnLCAncGFzdGUnLCAncGVuY2lsIGFsdGVybmF0ZScsICdzYXZlJywgJ3NhdmUgb3V0bGluZScsICd0aW50J107XG5leHBvcnQgdmFyIEVESVRPUlMgPSBbJ2FsaWduIGNlbnRlcicsICdhbGlnbiBqdXN0aWZ5JywgJ2FsaWduIGxlZnQnLCAnYWxpZ24gcmlnaHQnLCAnYm9sZCcsICdjbGlwYm9hcmQnLCAnY2xpcGJvYXJkIG91dGxpbmUnLCAnY2xvbmUnLCAnY2xvbmUgb3V0bGluZScsICdjb2x1bW5zJywgJ2NvcHknLCAnY29weSBvdXRsaW5lJywgJ2N1dCcsICdlZGl0JywgJ2VkaXQgb3V0bGluZScsICdlcmFzZXInLCAnZmlsZScsICdmaWxlIG91dGxpbmUnLCAnZmlsZSBhbHRlcm5hdGUnLCAnZmlsZSBhbHRlcm5hdGUgb3V0bGluZScsICdmb250JywgJ2hlYWRpbmcnLCAnaSBjdXJzb3InLCAnaW5kZW50JywgJ2l0YWxpYycsICdsaW5raWZ5JywgJ2xpc3QnLCAnbGlzdCBhbHRlcm5hdGUnLCAnbGlzdCBhbHRlcm5hdGUgb3V0bGluZScsICdsaXN0IG9sJywgJ2xpc3QgdWwnLCAnb3V0ZGVudCcsICdwYXBlciBwbGFuZScsICdwYXBlciBwbGFuZSBvdXRsaW5lJywgJ3BhcGVyY2xpcCcsICdwYXJhZ3JhcGgnLCAncGFzdGUnLCAncGVuY2lsIGFsdGVybmF0ZScsICdwcmludCcsICdxdW90ZSBsZWZ0JywgJ3F1b3RlIHJpZ2h0JywgJ3JlZG8nLCAncmVkbyBhbHRlcm5hdGUnLCAncmVwbHknLCAncmVwbHkgYWxsJywgJ3NoYXJlJywgJ3N0cmlrZXRocm91Z2gnLCAnc3Vic2NyaXB0JywgJ3N1cGVyc2NyaXB0JywgJ3N5bmMnLCAnc3luYyBhbHRlcm5hdGUnLCAndGFibGUnLCAndGFza3MnLCAndGV4dCBoZWlnaHQnLCAndGV4dCB3aWR0aCcsICd0aCcsICd0aCBsYXJnZScsICd0aCBsaXN0JywgJ3RyYXNoJywgJ3RyYXNoIGFsdGVybmF0ZScsICd0cmFzaCBhbHRlcm5hdGUgb3V0bGluZScsICd1bmRlcmxpbmUnLCAndW5kbycsICd1bmRvIGFsdGVybmF0ZScsICd1bmxpbmsnXTtcbmV4cG9ydCB2YXIgRklMRVMgPSBbJ2FyY2hpdmUnLCAnY2xvbmUnLCAnY2xvbmUgb3V0bGluZScsICdjb3B5JywgJ2NvcHkgb3V0bGluZScsICdjdXQnLCAnZmlsZScsICdmaWxlIG91dGxpbmUnLCAnZmlsZSBhbHRlcm5hdGUnLCAnZmlsZSBhbHRlcm5hdGUgb3V0bGluZScsICdmaWxlIGFyY2hpdmUnLCAnZmlsZSBhcmNoaXZlIG91dGxpbmUnLCAnZmlsZSBhdWRpbycsICdmaWxlIGF1ZGlvIG91dGxpbmUnLCAnZmlsZSBjb2RlJywgJ2ZpbGUgY29kZSBvdXRsaW5lJywgJ2ZpbGUgZXhjZWwnLCAnZmlsZSBleGNlbCBvdXRsaW5lJywgJ2ZpbGUgaW1hZ2UnLCAnZmlsZSBpbWFnZSBvdXRsaW5lJywgJ2ZpbGUgcGRmJywgJ2ZpbGUgcGRmIG91dGxpbmUnLCAnZmlsZSBwb3dlcnBvaW50JywgJ2ZpbGUgcG93ZXJwb2ludCBvdXRsaW5lJywgJ2ZpbGUgdmlkZW8nLCAnZmlsZSB2aWRlbyBvdXRsaW5lJywgJ2ZpbGUgd29yZCcsICdmaWxlIHdvcmQgb3V0bGluZScsICdmb2xkZXInLCAnZm9sZGVyIG91dGxpbmUnLCAnZm9sZGVyIG9wZW4nLCAnZm9sZGVyIG9wZW4gb3V0bGluZScsICdwYXN0ZScsICdzYXZlJywgJ3NhdmUgb3V0bGluZScsICdzdGlja3kgbm90ZScsICdzdGlja3kgbm90ZSBvdXRsaW5lJ107XG5leHBvcnQgdmFyIEdFTkRFUlMgPSBbJ2dlbmRlcmxlc3MnLCAnbWFycycsICdtYXJzIGRvdWJsZScsICdtYXJzIHN0cm9rZScsICdtYXJzIHN0cm9rZSBob3Jpem9udGFsJywgJ21hcnMgc3Ryb2tlIHZlcnRpY2FsJywgJ21lcmN1cnknLCAnbmV1dGVyJywgJ3RyYW5zZ2VuZGVyJywgJ3RyYW5zZ2VuZGVyIGFsdGVybmF0ZScsICd2ZW51cycsICd2ZW51cyBkb3VibGUnLCAndmVudXMgbWFycyddO1xuZXhwb3J0IHZhciBIQU5EU19HRVNUVVJFUyA9IFsnaGFuZCBsaXphcmQnLCAnaGFuZCBsaXphcmQgb3V0bGluZScsICdoYW5kIHBhcGVyJywgJ2hhbmQgcGFwZXIgb3V0bGluZScsICdoYW5kIHBlYWNlJywgJ2hhbmQgcGVhY2Ugb3V0bGluZScsICdoYW5kIHBvaW50IGRvd24nLCAnaGFuZCBwb2ludCBkb3duIG91dGxpbmUnLCAnaGFuZCBwb2ludCBsZWZ0JywgJ2hhbmQgcG9pbnQgbGVmdCBvdXRsaW5lJywgJ2hhbmQgcG9pbnQgcmlnaHQnLCAnaGFuZCBwb2ludCByaWdodCBvdXRsaW5lJywgJ2hhbmQgcG9pbnQgdXAnLCAnaGFuZCBwb2ludCB1cCBvdXRsaW5lJywgJ2hhbmQgcG9pbnRlcicsICdoYW5kIHBvaW50ZXIgb3V0bGluZScsICdoYW5kIHJvY2snLCAnaGFuZCByb2NrIG91dGxpbmUnLCAnaGFuZCBzY2lzc29ycycsICdoYW5kIHNjaXNzb3JzIG91dGxpbmUnLCAnaGFuZCBzcG9jaycsICdoYW5kIHNwb2NrIG91dGxpbmUnLCAnaGFuZHNoYWtlJywgJ2hhbmRzaGFrZSBvdXRsaW5lJywgJ3RodW1icyBkb3duJywgJ3RodW1icyBkb3duIG91dGxpbmUnLCAndGh1bWJzIHVwJywgJ3RodW1icyB1cCBvdXRsaW5lJ107XG5leHBvcnQgdmFyIEhFQUxUSCA9IFsnYW1idWxhbmNlJywgJ2ggc3F1YXJlJywgJ2hlYXJ0JywgJ2hlYXJ0IG91dGxpbmUnLCAnaGVhcnRiZWF0JywgJ2hvc3BpdGFsJywgJ2hvc3BpdGFsIG91dGxpbmUnLCAnbWVka2l0JywgJ3BsdXMgc3F1YXJlJywgJ3BsdXMgc3F1YXJlIG91dGxpbmUnLCAnc3RldGhvc2NvcGUnLCAndXNlciBtZCcsICd3aGVlbGNoYWlyJ107XG5leHBvcnQgdmFyIElNQUdFUyA9IFsnYWRqdXN0JywgJ2JvbHQnLCAnY2FtZXJhJywgJ2NhbWVyYSByZXRybycsICdjbG9uZScsICdjbG9uZSBvdXRsaW5lJywgJ2NvbXByZXNzJywgJ2V4cGFuZCcsICdleWUnLCAnZXllIGRyb3BwZXInLCAnZXllIHNsYXNoJywgJ2V5ZSBzbGFzaCBvdXRsaW5lJywgJ2ZpbGUgaW1hZ2UnLCAnZmlsZSBpbWFnZSBvdXRsaW5lJywgJ2ZpbG0nLCAnaWQgYmFkZ2UnLCAnaWQgYmFkZ2Ugb3V0bGluZScsICdpZCBjYXJkJywgJ2lkIGNhcmQgb3V0bGluZScsICdpbWFnZScsICdpbWFnZSBvdXRsaW5lJywgJ2ltYWdlcycsICdpbWFnZXMgb3V0bGluZScsICdzbGlkZXJzIGhvcml6b250YWwnLCAndGludCddO1xuZXhwb3J0IHZhciBJTlRFUkZBQ0VTID0gWydiYW4nLCAnYmFyY29kZScsICdiYXJzJywgJ2JlZXInLCAnYmVsbCcsICdiZWxsIG91dGxpbmUnLCAnYmVsbCBzbGFzaCcsICdiZWxsIHNsYXNoIG91dGxpbmUnLCAnYnVnJywgJ2J1bGxob3JuJywgJ2J1bGxzZXllJywgJ2NhbGN1bGF0b3InLCAnY2FsZW5kYXInLCAnY2FsZW5kYXIgb3V0bGluZScsICdjYWxlbmRhciBhbHRlcm5hdGUnLCAnY2FsZW5kYXIgYWx0ZXJuYXRlIG91dGxpbmUnLCAnY2FsZW5kYXIgY2hlY2snLCAnY2FsZW5kYXIgY2hlY2sgb3V0bGluZScsICdjYWxlbmRhciBtaW51cycsICdjYWxlbmRhciBtaW51cyBvdXRsaW5lJywgJ2NhbGVuZGFyIHBsdXMnLCAnY2FsZW5kYXIgcGx1cyBvdXRsaW5lJywgJ2NhbGVuZGFyIHRpbWVzJywgJ2NhbGVuZGFyIHRpbWVzIG91dGxpbmUnLCAnY2VydGlmaWNhdGUnLCAnY2hlY2snLCAnY2hlY2sgY2lyY2xlJywgJ2NoZWNrIGNpcmNsZSBvdXRsaW5lJywgJ2NoZWNrIHNxdWFyZScsICdjaGVjayBzcXVhcmUgb3V0bGluZScsICdjaXJjbGUnLCAnY2lyY2xlIG91dGxpbmUnLCAnY2xpcGJvYXJkJywgJ2NsaXBib2FyZCBvdXRsaW5lJywgJ2Nsb25lJywgJ2Nsb25lIG91dGxpbmUnLCAnY2xvdWQnLCAnY2xvdWQgZG93bmxvYWQnLCAnY2xvdWQgdXBsb2FkJywgJ2NvZmZlZScsICdjb2cnLCAnY29ncycsICdjb3B5JywgJ2NvcHkgb3V0bGluZScsICdjdXQnLCAnZGF0YWJhc2UnLCAnZG90IGNpcmNsZScsICdkb3QgY2lyY2xlIG91dGxpbmUnLCAnZG93bmxvYWQnLCAnZWRpdCcsICdlZGl0IG91dGxpbmUnLCAnZWxsaXBzaXMgaG9yaXpvbnRhbCcsICdlbGxpcHNpcyB2ZXJ0aWNhbCcsICdlbnZlbG9wZScsICdlbnZlbG9wZSBvdXRsaW5lJywgJ2VudmVsb3BlIG9wZW4nLCAnZW52ZWxvcGUgb3BlbiBvdXRsaW5lJywgJ2VyYXNlcicsICdleGNsYW1hdGlvbicsICdleGNsYW1hdGlvbiBjaXJjbGUnLCAnZXhjbGFtYXRpb24gdHJpYW5nbGUnLCAnZXh0ZXJuYWwgYWx0ZXJuYXRlJywgJ2V4dGVybmFsIHNxdWFyZSBhbHRlcm5hdGUnLCAnZXllJywgJ2V5ZSBzbGFzaCcsICdleWUgc2xhc2ggb3V0bGluZScsICdmaWxlJywgJ2ZpbGUgb3V0bGluZScsICdmaWxlIGFsdGVybmF0ZScsICdmaWxlIGFsdGVybmF0ZSBvdXRsaW5lJywgJ2ZpbHRlcicsICdmbGFnJywgJ2ZsYWcgb3V0bGluZScsICdmbGFnIGNoZWNrZXJlZCcsICdmb2xkZXInLCAnZm9sZGVyIG91dGxpbmUnLCAnZm9sZGVyIG9wZW4nLCAnZm9sZGVyIG9wZW4gb3V0bGluZScsICdmcm93bicsICdmcm93biBvdXRsaW5lJywgJ2hhc2h0YWcnLCAnaGVhcnQnLCAnaGVhcnQgb3V0bGluZScsICdoaXN0b3J5JywgJ2hvbWUnLCAnaSBjdXJzb3InLCAnaW5mbycsICdpbmZvIGNpcmNsZScsICdsYW5ndWFnZScsICdtYWdpYycsICdtZWgnLCAnbWVoIG91dGxpbmUnLCAnbWljcm9waG9uZScsICdtaWNyb3Bob25lIHNsYXNoJywgJ21pbnVzJywgJ21pbnVzIGNpcmNsZScsICdtaW51cyBzcXVhcmUnLCAnbWludXMgc3F1YXJlIG91dGxpbmUnLCAncGFzdGUnLCAncGVuY2lsIGFsdGVybmF0ZScsICdwbHVzJywgJ3BsdXMgY2lyY2xlJywgJ3BsdXMgc3F1YXJlJywgJ3BsdXMgc3F1YXJlIG91dGxpbmUnLCAncXJjb2RlJywgJ3F1ZXN0aW9uJywgJ3F1ZXN0aW9uIGNpcmNsZScsICdxdWVzdGlvbiBjaXJjbGUgb3V0bGluZScsICdxdW90ZSBsZWZ0JywgJ3F1b3RlIHJpZ2h0JywgJ3JlZG8nLCAncmVkbyBhbHRlcm5hdGUnLCAncmVwbHknLCAncmVwbHkgYWxsJywgJ3JzcycsICdyc3Mgc3F1YXJlJywgJ3NhdmUnLCAnc2F2ZSBvdXRsaW5lJywgJ3NlYXJjaCcsICdzZWFyY2ggbWludXMnLCAnc2VhcmNoIHBsdXMnLCAnc2hhcmUnLCAnc2hhcmUgYWx0ZXJuYXRlJywgJ3NoYXJlIGFsdGVybmF0ZSBzcXVhcmUnLCAnc2hhcmUgc3F1YXJlJywgJ3NoYXJlIHNxdWFyZSBvdXRsaW5lJywgJ3NoaWVsZCBhbHRlcm5hdGUnLCAnc2lnbi1pbicsICdzaWduLW91dCcsICdzaWduYWwnLCAnc2l0ZW1hcCcsICdzbGlkZXJzIGhvcml6b250YWwnLCAnc21pbGUnLCAnc21pbGUgb3V0bGluZScsICdzb3J0JywgJ3NvcnQgYWxwaGFiZXQgZG93bicsICdzb3J0IGFscGhhYmV0IHVwJywgJ3NvcnQgYW1vdW50IGRvd24nLCAnc29ydCBhbW91bnQgdXAnLCAnc29ydCBkb3duJywgJ3NvcnQgbnVtZXJpYyBkb3duJywgJ3NvcnQgbnVtZXJpYyB1cCcsICdzb3J0IHVwJywgJ3N0YXInLCAnc3RhciBvdXRsaW5lJywgJ3N0YXIgaGFsZicsICdzdGFyIGhhbGYgb3V0bGluZScsICdzeW5jJywgJ3N5bmMgYWx0ZXJuYXRlJywgJ3RodW1icyBkb3duJywgJ3RodW1icyBkb3duIG91dGxpbmUnLCAndGh1bWJzIHVwJywgJ3RodW1icyB1cCBvdXRsaW5lJywgJ3RpbWVzJywgJ3RpbWVzIGNpcmNsZScsICd0aW1lcyBjaXJjbGUgb3V0bGluZScsICd0b2dnbGUgb2ZmJywgJ3RvZ2dsZSBvbicsICd0cmFzaCcsICd0cmFzaCBhbHRlcm5hdGUnLCAndHJhc2ggYWx0ZXJuYXRlIG91dGxpbmUnLCAndHJvcGh5JywgJ3VuZG8nLCAndW5kbyBhbHRlcm5hdGUnLCAndXBsb2FkJywgJ3VzZXInLCAndXNlciBvdXRsaW5lJywgJ3VzZXIgY2lyY2xlJywgJ3VzZXIgY2lyY2xlIG91dGxpbmUnLCAnd2lmaSddO1xuZXhwb3J0IHZhciBMT0dJU1RJQ1MgPSBbJ2JveCcsICdib3hlcycsICdjbGlwYm9hcmQgY2hlY2snLCAnY2xpcGJvYXJkIGxpc3QnLCAnZG9sbHknLCAnZG9sbHkgZmxhdGJlZCcsICdwYWxsZXQnLCAnc2hpcHBpbmcgZmFzdCcsICd0cnVjaycsICd3YXJlaG91c2UnXTtcbmV4cG9ydCB2YXIgTUFQUyA9IFsnYW1idWxhbmNlJywgJ2FuY2hvcicsICdiYWxhbmNlIHNjYWxlJywgJ2JhdGgnLCAnYmVkJywgJ2JlZXInLCAnYmVsbCcsICdiZWxsIG91dGxpbmUnLCAnYmVsbCBzbGFzaCcsICdiZWxsIHNsYXNoIG91dGxpbmUnLCAnYmljeWNsZScsICdiaW5vY3VsYXJzJywgJ2JpcnRoZGF5IGNha2UnLCAnYmxpbmQnLCAnYm9tYicsICdib29rJywgJ2Jvb2ttYXJrJywgJ2Jvb2ttYXJrIG91dGxpbmUnLCAnYnJpZWZjYXNlJywgJ2J1aWxkaW5nJywgJ2J1aWxkaW5nIG91dGxpbmUnLCAnY2FyJywgJ2NvZmZlZScsICdjcm9zc2hhaXJzJywgJ2RvbGxhciBzaWduJywgJ2V5ZScsICdleWUgc2xhc2gnLCAnZXllIHNsYXNoIG91dGxpbmUnLCAnZmlnaHRlciBqZXQnLCAnZmlyZScsICdmaXJlIGV4dGluZ3Vpc2hlcicsICdmbGFnJywgJ2ZsYWcgb3V0bGluZScsICdmbGFnIGNoZWNrZXJlZCcsICdmbGFzaycsICdnYW1lcGFkJywgJ2dhdmVsJywgJ2dpZnQnLCAnZ2xhc3MgbWFydGluaScsICdnbG9iZScsICdncmFkdWF0aW9uIGNhcCcsICdoIHNxdWFyZScsICdoZWFydCcsICdoZWFydCBvdXRsaW5lJywgJ2hlYXJ0YmVhdCcsICdob21lJywgJ2hvc3BpdGFsJywgJ2hvc3BpdGFsIG91dGxpbmUnLCAnaW1hZ2UnLCAnaW1hZ2Ugb3V0bGluZScsICdpbWFnZXMnLCAnaW1hZ2VzIG91dGxpbmUnLCAnaW5kdXN0cnknLCAnaW5mbycsICdpbmZvIGNpcmNsZScsICdrZXknLCAnbGVhZicsICdsZW1vbicsICdsZW1vbiBvdXRsaW5lJywgJ2xpZmUgcmluZycsICdsaWZlIHJpbmcgb3V0bGluZScsICdsaWdodGJ1bGInLCAnbGlnaHRidWxiIG91dGxpbmUnLCAnbG9jYXRpb24gYXJyb3cnLCAnbG93IHZpc2lvbicsICdtYWduZXQnLCAnbWFsZScsICdtYXAnLCAnbWFwIG91dGxpbmUnLCAnbWFwIG1hcmtlcicsICdtYXAgbWFya2VyIGFsdGVybmF0ZScsICdtYXAgcGluJywgJ21hcCBzaWducycsICdtZWRraXQnLCAnbW9uZXkgYmlsbCBhbHRlcm5hdGUnLCAnbW9uZXkgYmlsbCBhbHRlcm5hdGUgb3V0bGluZScsICdtb3RvcmN5Y2xlJywgJ211c2ljJywgJ25ld3NwYXBlcicsICduZXdzcGFwZXIgb3V0bGluZScsICdwYXcnLCAncGhvbmUnLCAncGhvbmUgc3F1YXJlJywgJ3Bob25lIHZvbHVtZScsICdwbGFuZScsICdwbHVnJywgJ3BsdXMnLCAncGx1cyBzcXVhcmUnLCAncGx1cyBzcXVhcmUgb3V0bGluZScsICdwcmludCcsICdyZWN5Y2xlJywgJ3JvYWQnLCAncm9ja2V0JywgJ3NlYXJjaCcsICdzZWFyY2ggbWludXMnLCAnc2VhcmNoIHBsdXMnLCAnc2hpcCcsICdzaG9wcGluZyBiYWcnLCAnc2hvcHBpbmcgYmFza2V0JywgJ3Nob3BwaW5nIGNhcnQnLCAnc2hvd2VyJywgJ3N0cmVldCB2aWV3JywgJ3N1YndheScsICdzdWl0Y2FzZScsICd0YWcnLCAndGFncycsICd0YXhpJywgJ3RodW1idGFjaycsICd0aWNrZXQgYWx0ZXJuYXRlJywgJ3RpbnQnLCAndHJhaW4nLCAndHJlZScsICd0cm9waHknLCAndHJ1Y2snLCAndHR5JywgJ3VtYnJlbGxhJywgJ3VuaXZlcnNpdHknLCAndXRlbnNpbCBzcG9vbicsICd1dGVuc2lscycsICd3aGVlbGNoYWlyJywgJ3dpZmknLCAnd3JlbmNoJ107XG5leHBvcnQgdmFyIE1FRElDQUwgPSBbJ2FtYnVsYW5jZScsICdiYW5kIGFpZCcsICdkbmEnLCAnZmlyc3QgYWlkJywgJ2hlYXJ0JywgJ2hlYXJ0IG91dGxpbmUnLCAnaGVhcnRiZWF0JywgJ2hvc3BpdGFsJywgJ2hvc3BpdGFsIG91dGxpbmUnLCAnaG9zcGl0YWwgc3ltYm9sJywgJ3BpbGxzJywgJ3BsdXMnLCAnc3RldGhvc2NvcGUnLCAnc3lyaW5nZScsICd0aGVybW9tZXRlcicsICd1c2VyIG1kJywgJ3dlaWdodCddO1xuZXhwb3J0IHZhciBPQkpFQ1RTID0gWydhbWJ1bGFuY2UnLCAnYW5jaG9yJywgJ2FyY2hpdmUnLCAnYmFsYW5jZSBzY2FsZScsICdiYXRoJywgJ2JlZCcsICdiZWVyJywgJ2JlbGwnLCAnYmVsbCBvdXRsaW5lJywgJ2JpY3ljbGUnLCAnYmlub2N1bGFycycsICdiaXJ0aGRheSBjYWtlJywgJ2JvbWInLCAnYm9vaycsICdib29rbWFyaycsICdib29rbWFyayBvdXRsaW5lJywgJ2JyaWVmY2FzZScsICdidWcnLCAnYnVpbGRpbmcnLCAnYnVpbGRpbmcgb3V0bGluZScsICdidWxsaG9ybicsICdidWxsc2V5ZScsICdidXMnLCAnY2FsY3VsYXRvcicsICdjYWxlbmRhcicsICdjYWxlbmRhciBvdXRsaW5lJywgJ2NhbGVuZGFyIGFsdGVybmF0ZScsICdjYWxlbmRhciBhbHRlcm5hdGUgb3V0bGluZScsICdjYW1lcmEnLCAnY2FtZXJhIHJldHJvJywgJ2NhcicsICdjbGlwYm9hcmQnLCAnY2xpcGJvYXJkIG91dGxpbmUnLCAnY2xvdWQnLCAnY29mZmVlJywgJ2NvZycsICdjb2dzJywgJ2NvbXBhc3MnLCAnY29tcGFzcyBvdXRsaW5lJywgJ2NvcHknLCAnY29weSBvdXRsaW5lJywgJ2N1YmUnLCAnY3ViZXMnLCAnY3V0JywgJ2VudmVsb3BlJywgJ2VudmVsb3BlIG91dGxpbmUnLCAnZW52ZWxvcGUgb3BlbicsICdlbnZlbG9wZSBvcGVuIG91dGxpbmUnLCAnZXJhc2VyJywgJ2V5ZScsICdleWUgZHJvcHBlcicsICdmYXgnLCAnZmlnaHRlciBqZXQnLCAnZmlsZScsICdmaWxlIG91dGxpbmUnLCAnZmlsZSBhbHRlcm5hdGUnLCAnZmlsZSBhbHRlcm5hdGUgb3V0bGluZScsICdmaWxtJywgJ2ZpcmUnLCAnZmlyZSBleHRpbmd1aXNoZXInLCAnZmxhZycsICdmbGFnIG91dGxpbmUnLCAnZmxhZyBjaGVja2VyZWQnLCAnZmxhc2snLCAnZnV0Ym9sJywgJ2Z1dGJvbCBvdXRsaW5lJywgJ2dhbWVwYWQnLCAnZ2F2ZWwnLCAnZ2VtJywgJ2dlbSBvdXRsaW5lJywgJ2dpZnQnLCAnZ2xhc3MgbWFydGluaScsICdnbG9iZScsICdncmFkdWF0aW9uIGNhcCcsICdoZGQnLCAnaGRkIG91dGxpbmUnLCAnaGVhZHBob25lcycsICdoZWFydCcsICdoZWFydCBvdXRsaW5lJywgJ2hvbWUnLCAnaG9zcGl0YWwnLCAnaG9zcGl0YWwgb3V0bGluZScsICdob3VyZ2xhc3MnLCAnaG91cmdsYXNzIG91dGxpbmUnLCAnaW1hZ2UnLCAnaW1hZ2Ugb3V0bGluZScsICdpbWFnZXMnLCAnaW1hZ2VzIG91dGxpbmUnLCAnaW5kdXN0cnknLCAna2V5JywgJ2tleWJvYXJkJywgJ2tleWJvYXJkIG91dGxpbmUnLCAnbGFwdG9wJywgJ2xlYWYnLCAnbGVtb24nLCAnbGVtb24gb3V0bGluZScsICdsaWZlIHJpbmcnLCAnbGlmZSByaW5nIG91dGxpbmUnLCAnbGlnaHRidWxiJywgJ2xpZ2h0YnVsYiBvdXRsaW5lJywgJ2xvY2snLCAnbG9jayBvcGVuJywgJ21hZ2ljJywgJ21hZ25ldCcsICdtYXAnLCAnbWFwIG91dGxpbmUnLCAnbWFwIG1hcmtlcicsICdtYXAgbWFya2VyIGFsdGVybmF0ZScsICdtYXAgcGluJywgJ21hcCBzaWducycsICdtZWRraXQnLCAnbWljcm9jaGlwJywgJ21pY3JvcGhvbmUnLCAnbW9iaWxlJywgJ21vYmlsZSBhbHRlcm5hdGUnLCAnbW9uZXkgYmlsbCBhbHRlcm5hdGUnLCAnbW9uZXkgYmlsbCBhbHRlcm5hdGUgb3V0bGluZScsICdtb29uJywgJ21vb24gb3V0bGluZScsICdtb3RvcmN5Y2xlJywgJ25ld3NwYXBlcicsICduZXdzcGFwZXIgb3V0bGluZScsICdwYWludCBicnVzaCcsICdwYXBlciBwbGFuZScsICdwYXBlciBwbGFuZSBvdXRsaW5lJywgJ3BhcGVyY2xpcCcsICdwYXN0ZScsICdwYXcnLCAncGVuY2lsIGFsdGVybmF0ZScsICdwaG9uZScsICdwbGFuZScsICdwbHVnJywgJ3ByaW50JywgJ3B1enpsZSBwaWVjZScsICdyb2FkJywgJ3JvY2tldCcsICdzYXZlJywgJ3NhdmUgb3V0bGluZScsICdzZWFyY2gnLCAnc2hpZWxkIGFsdGVybmF0ZScsICdzaG9wcGluZyBiYWcnLCAnc2hvcHBpbmcgYmFza2V0JywgJ3Nob3BwaW5nIGNhcnQnLCAnc2hvd2VyJywgJ3Nub3dmbGFrZScsICdzbm93Zmxha2Ugb3V0bGluZScsICdzcGFjZSBzaHV0dGxlJywgJ3N0YXInLCAnc3RhciBvdXRsaW5lJywgJ3N0aWNreSBub3RlJywgJ3N0aWNreSBub3RlIG91dGxpbmUnLCAnc3RvcHdhdGNoJywgJ3N1YndheScsICdzdWl0Y2FzZScsICdzdW4nLCAnc3VuIG91dGxpbmUnLCAndGFibGV0JywgJ3RhYmxldCBhbHRlcm5hdGUnLCAndGFjaG9tZXRlciBhbHRlcm5hdGUnLCAndGFnJywgJ3RhZ3MnLCAndGF4aScsICd0aHVtYnRhY2snLCAndGlja2V0IGFsdGVybmF0ZScsICd0cmFpbicsICd0cmFzaCcsICd0cmFzaCBhbHRlcm5hdGUnLCAndHJhc2ggYWx0ZXJuYXRlIG91dGxpbmUnLCAndHJlZScsICd0cm9waHknLCAndHJ1Y2snLCAndHYnLCAndW1icmVsbGEnLCAndW5pdmVyc2l0eScsICd1bmxvY2snLCAndW5sb2NrIGFsdGVybmF0ZScsICd1dGVuc2lsIHNwb29uJywgJ3V0ZW5zaWxzJywgJ3doZWVsY2hhaXInLCAnd3JlbmNoJ107XG5leHBvcnQgdmFyIFBBWU1FTlRTX1NIT1BQSU5HID0gWydiZWxsJywgJ2JlbGwgb3V0bGluZScsICdib29rbWFyaycsICdib29rbWFyayBvdXRsaW5lJywgJ2J1bGxob3JuJywgJ2NhbWVyYScsICdjYW1lcmEgcmV0cm8nLCAnY2FydCBhcnJvdyBkb3duJywgJ2NhcnQgcGx1cycsICdjZXJ0aWZpY2F0ZScsICdjcmVkaXQgY2FyZCcsICdjcmVkaXQgY2FyZCBvdXRsaW5lJywgJ2dlbScsICdnZW0gb3V0bGluZScsICdnaWZ0JywgJ2hhbmRzaGFrZScsICdoYW5kc2hha2Ugb3V0bGluZScsICdoZWFydCcsICdoZWFydCBvdXRsaW5lJywgJ2tleScsICdzaG9wcGluZyBiYWcnLCAnc2hvcHBpbmcgYmFza2V0JywgJ3Nob3BwaW5nIGNhcnQnLCAnc3RhcicsICdzdGFyIG91dGxpbmUnLCAndGFnJywgJ3RhZ3MnLCAndGh1bWJzIGRvd24nLCAndGh1bWJzIGRvd24gb3V0bGluZScsICd0aHVtYnMgdXAnLCAndGh1bWJzIHVwIG91dGxpbmUnLCAndHJvcGh5J107XG5leHBvcnQgdmFyIFNIQVBFUyA9IFsnYm9va21hcmsnLCAnYm9va21hcmsgb3V0bGluZScsICdjYWxlbmRhcicsICdjYWxlbmRhciBvdXRsaW5lJywgJ2NlcnRpZmljYXRlJywgJ2NpcmNsZScsICdjaXJjbGUgb3V0bGluZScsICdjbG91ZCcsICdjb21tZW50JywgJ2NvbW1lbnQgb3V0bGluZScsICdmaWxlJywgJ2ZpbGUgb3V0bGluZScsICdmb2xkZXInLCAnZm9sZGVyIG91dGxpbmUnLCAnaGVhcnQnLCAnaGVhcnQgb3V0bGluZScsICdtYXAgbWFya2VyJywgJ3BsYXknLCAnc3F1YXJlJywgJ3NxdWFyZSBvdXRsaW5lJywgJ3N0YXInLCAnc3RhciBvdXRsaW5lJ107XG5leHBvcnQgdmFyIFNQSU5ORVJTID0gWydhc3RlcmlzaycsICdjZXJ0aWZpY2F0ZScsICdjaXJjbGUgbm90Y2gnLCAnY29nJywgJ2NvbXBhc3MnLCAnY29tcGFzcyBvdXRsaW5lJywgJ2Nyb3NzaGFpcnMnLCAnbGlmZSByaW5nJywgJ2xpZmUgcmluZyBvdXRsaW5lJywgJ3Nub3dmbGFrZScsICdzbm93Zmxha2Ugb3V0bGluZScsICdzcGlubmVyJywgJ3N1bicsICdzdW4gb3V0bGluZScsICdzeW5jJ107XG5leHBvcnQgdmFyIFNQT1JUUyA9IFsnYmFzZWJhbGwgYmFsbCcsICdiYXNrZXRiYWxsIGJhbGwnLCAnYm93bGluZyBiYWxsJywgJ2Zvb3RiYWxsIGJhbGwnLCAnZnV0Ym9sJywgJ2Z1dGJvbCBvdXRsaW5lJywgJ2dvbGYgYmFsbCcsICdob2NrZXkgcHVjaycsICdxdWlkZGl0Y2gnLCAndGFibGUgdGVubmlzJywgJ3ZvbGxleWJhbGwgYmFsbCddO1xuZXhwb3J0IHZhciBTVEFUVVMgPSBbJ2JhbicsICdiYXR0ZXJ5IGVtcHR5JywgJ2JhdHRlcnkgZnVsbCcsICdiYXR0ZXJ5IGhhbGYnLCAnYmF0dGVyeSBxdWFydGVyJywgJ2JhdHRlcnkgdGhyZWUgcXVhcnRlcnMnLCAnYmVsbCcsICdiZWxsIG91dGxpbmUnLCAnYmVsbCBzbGFzaCcsICdiZWxsIHNsYXNoIG91dGxpbmUnLCAnY2FsZW5kYXInLCAnY2FsZW5kYXIgb3V0bGluZScsICdjYWxlbmRhciBhbHRlcm5hdGUnLCAnY2FsZW5kYXIgYWx0ZXJuYXRlIG91dGxpbmUnLCAnY2FsZW5kYXIgY2hlY2snLCAnY2FsZW5kYXIgY2hlY2sgb3V0bGluZScsICdjYWxlbmRhciBtaW51cycsICdjYWxlbmRhciBtaW51cyBvdXRsaW5lJywgJ2NhbGVuZGFyIHBsdXMnLCAnY2FsZW5kYXIgcGx1cyBvdXRsaW5lJywgJ2NhbGVuZGFyIHRpbWVzJywgJ2NhbGVuZGFyIHRpbWVzIG91dGxpbmUnLCAnY2FydCBhcnJvdyBkb3duJywgJ2NhcnQgcGx1cycsICdleGNsYW1hdGlvbicsICdleGNsYW1hdGlvbiBjaXJjbGUnLCAnZXhjbGFtYXRpb24gdHJpYW5nbGUnLCAnZXllJywgJ2V5ZSBzbGFzaCcsICdleWUgc2xhc2ggb3V0bGluZScsICdmaWxlJywgJ2ZpbGUgb3V0bGluZScsICdmaWxlIGFsdGVybmF0ZScsICdmaWxlIGFsdGVybmF0ZSBvdXRsaW5lJywgJ2ZvbGRlcicsICdmb2xkZXIgb3V0bGluZScsICdmb2xkZXIgb3BlbicsICdmb2xkZXIgb3BlbiBvdXRsaW5lJywgJ2luZm8nLCAnaW5mbyBjaXJjbGUnLCAnbG9jaycsICdsb2NrIG9wZW4nLCAnbWludXMnLCAnbWludXMgY2lyY2xlJywgJ21pbnVzIHNxdWFyZScsICdtaW51cyBzcXVhcmUgb3V0bGluZScsICdwbHVzJywgJ3BsdXMgY2lyY2xlJywgJ3BsdXMgc3F1YXJlJywgJ3BsdXMgc3F1YXJlIG91dGxpbmUnLCAncXVlc3Rpb24nLCAncXVlc3Rpb24gY2lyY2xlJywgJ3F1ZXN0aW9uIGNpcmNsZSBvdXRsaW5lJywgJ3NoaWVsZCBhbHRlcm5hdGUnLCAnc2hvcHBpbmcgY2FydCcsICdzaWduIGluIGFsdGVybmF0ZScsICdzaWduIG91dCBhbHRlcm5hdGUnLCAndGhlcm1vbWV0ZXIgZW1wdHknLCAndGhlcm1vbWV0ZXIgZnVsbCcsICd0aGVybW9tZXRlciBoYWxmJywgJ3RoZXJtb21ldGVyIHF1YXJ0ZXInLCAndGhlcm1vbWV0ZXIgdGhyZWUgcXVhcnRlcnMnLCAndGh1bWJzIGRvd24nLCAndGh1bWJzIGRvd24gb3V0bGluZScsICd0aHVtYnMgdXAnLCAndGh1bWJzIHVwIG91dGxpbmUnLCAndG9nZ2xlIG9mZicsICd0b2dnbGUgb24nLCAndW5sb2NrJywgJ3VubG9jayBhbHRlcm5hdGUnXTtcbmV4cG9ydCB2YXIgVVNFUlNfUEVPUExFID0gWydhZGRyZXNzIGJvb2snLCAnYWRkcmVzcyBib29rIG91dGxpbmUnLCAnYWRkcmVzcyBjYXJkJywgJ2FkZHJlc3MgY2FyZCBvdXRsaW5lJywgJ2JlZCcsICdibGluZCcsICdjaGlsZCcsICdmZW1hbGUnLCAnZnJvd24nLCAnZnJvd24gb3V0bGluZScsICdpZCBiYWRnZScsICdpZCBiYWRnZSBvdXRsaW5lJywgJ2lkIGNhcmQnLCAnaWQgY2FyZCBvdXRsaW5lJywgJ21hbGUnLCAnbWVoJywgJ21laCBvdXRsaW5lJywgJ3Bvd2VyIG9mZicsICdzbWlsZScsICdzbWlsZSBvdXRsaW5lJywgJ3N0cmVldCB2aWV3JywgJ3VzZXInLCAndXNlciBvdXRsaW5lJywgJ3VzZXIgY2lyY2xlJywgJ3VzZXIgY2lyY2xlIG91dGxpbmUnLCAndXNlciBtZCcsICd1c2VyIHBsdXMnLCAndXNlciBzZWNyZXQnLCAndXNlciB0aW1lcycsICd1c2VycycsICd3aGVlbGNoYWlyJ107XG5leHBvcnQgdmFyIFZFSElDTEVTID0gWydhbWJ1bGFuY2UnLCAnYmljeWNsZScsICdidXMnLCAnY2FyJywgJ2ZpZ2h0ZXIgamV0JywgJ21vdG9yY3ljbGUnLCAncGFwZXIgcGxhbmUnLCAncGFwZXIgcGxhbmUgb3V0bGluZScsICdwbGFuZScsICdyb2NrZXQnLCAnc2hpcCcsICdzaG9wcGluZyBjYXJ0JywgJ3NwYWNlIHNodXR0bGUnLCAnc3Vid2F5JywgJ3RheGknLCAndHJhaW4nLCAndHJ1Y2snLCAnd2hlZWxjaGFpciddO1xuZXhwb3J0IHZhciBXUklUSU5HID0gWydhcmNoaXZlJywgJ2Jvb2snLCAnYm9va21hcmsnLCAnYm9va21hcmsgb3V0bGluZScsICdlZGl0JywgJ2VkaXQgb3V0bGluZScsICdlbnZlbG9wZScsICdlbnZlbG9wZSBvdXRsaW5lJywgJ2VudmVsb3BlIG9wZW4nLCAnZW52ZWxvcGUgb3BlbiBvdXRsaW5lJywgJ2VyYXNlcicsICdmaWxlJywgJ2ZpbGUgb3V0bGluZScsICdmaWxlIGFsdGVybmF0ZScsICdmaWxlIGFsdGVybmF0ZSBvdXRsaW5lJywgJ2ZvbGRlcicsICdmb2xkZXIgb3V0bGluZScsICdmb2xkZXIgb3BlbicsICdmb2xkZXIgb3BlbiBvdXRsaW5lJywgJ2tleWJvYXJkJywgJ2tleWJvYXJkIG91dGxpbmUnLCAnbmV3c3BhcGVyJywgJ25ld3NwYXBlciBvdXRsaW5lJywgJ3BhcGVyIHBsYW5lJywgJ3BhcGVyIHBsYW5lIG91dGxpbmUnLCAncGFwZXJjbGlwJywgJ3BhcmFncmFwaCcsICdwZW4gc3F1YXJlJywgJ3BlbmNpbCBhbHRlcm5hdGUnLCAncXVvdGUgbGVmdCcsICdxdW90ZSByaWdodCcsICdzdGlja3kgbm90ZScsICdzdGlja3kgbm90ZSBvdXRsaW5lJywgJ3RodW1idGFjayddO1xuZXhwb3J0IHZhciBCUkFORFMgPSBbJzUwMHB4JywgJ2FjY2Vzc2libGUnLCAnYWNjdXNvZnQnLCAnYWRuJywgJ2FkdmVyc2FsJywgJ2FmZmlsaWF0ZXRoZW1lJywgJ2FsZ29saWEnLCAnYW1hem9uJywgJ2FtYXpvbiBwYXknLCAnYW1pbGlhJywgJ2FuZHJvaWQnLCAnYW5nZWxsaXN0JywgJ2FuZ3J5Y3JlYXRpdmUnLCAnYW5ndWxhcicsICdhcHAgc3RvcmUnLCAnYXBwIHN0b3JlIGlvcycsICdhcHBlcicsICdhcHBsZScsICdhcHBsZSBwYXknLCAnYXN5bW1ldHJpaycsICdhdWRpYmxlJywgJ2F1dG9wcmVmaXhlcicsICdhdmlhbmV4JywgJ2F2aWF0bycsICdhd3MnLCAnYmFuZGNhbXAnLCAnYmVoYW5jZScsICdiZWhhbmNlIHNxdWFyZScsICdiaW1vYmplY3QnLCAnYml0YnVja2V0JywgJ2JpdGNvaW4nLCAnYml0eScsICdibGFjayB0aWUnLCAnYmxhY2tiZXJyeScsICdibG9nZ2VyJywgJ2Jsb2dnZXIgYicsICdibHVldG9vdGgnLCAnYmx1ZXRvb3RoIGInLCAnYnRjJywgJ2J1cm9tb2JlbGV4cGVydGUnLCAnYnV5c2VsbGFkcycsICdjYyBhbWF6b24gcGF5JywgJ2NjIGFtZXgnLCAnY2MgYXBwbGUgcGF5JywgJ2NjIGRpbmVycyBjbHViJywgJ2NjIGRpc2NvdmVyJywgJ2NjIGpjYicsICdjYyBtYXN0ZXJjYXJkJywgJ2NjIHBheXBhbCcsICdjYyBzdHJpcGUnLCAnY2MgdmlzYScsICdjZW50ZXJjb2RlJywgJ2Nocm9tZScsICdjbG91ZHNjYWxlJywgJ2Nsb3Vkc21pdGgnLCAnY2xvdWR2ZXJzaWZ5JywgJ2NvZGVwZW4nLCAnY29kaWVwaWUnLCAnY29ubmVjdGRldmVsb3AnLCAnY29udGFvJywgJ2NwYW5lbCcsICdjcmVhdGl2ZSBjb21tb25zJywgJ2NzczMnLCAnY3NzMyBhbHRlcm5hdGUnLCAnY3V0dGxlZmlzaCcsICdkIGFuZCBkJywgJ2Rhc2hjdWJlJywgJ2RlbGljaW91cycsICdkZXBsb3lkb2cnLCAnZGVza3BybycsICdkZXZpYW50YXJ0JywgJ2RpZ2cnLCAnZGlnaXRhbCBvY2VhbicsICdkaXNjb3JkJywgJ2Rpc2NvdXJzZScsICdkb2NodWInLCAnZG9ja2VyJywgJ2RyYWZ0MmRpZ2l0YWwnLCAnZHJpYmJibGUnLCAnZHJpYmJibGUgc3F1YXJlJywgJ2Ryb3Bib3gnLCAnZHJ1cGFsJywgJ2R5YWxvZycsICdlYXJseWJpcmRzJywgJ2VkZ2UnLCAnZWxlbWVudG9yJywgJ2VtYmVyJywgJ2VtcGlyZScsICdlbnZpcmEnLCAnZXJsYW5nJywgJ2V0aGVyZXVtJywgJ2V0c3knLCAnZXhwZWRpdGVkc3NsJywgJ2ZhY2Vib29rJywgJ2ZhY2Vib29rIGYnLCAnZmFjZWJvb2sgbWVzc2VuZ2VyJywgJ2ZhY2Vib29rIHNxdWFyZScsICdmaXJlZm94JywgJ2ZpcnN0IG9yZGVyJywgJ2ZpcnN0ZHJhZnQnLCAnZmxpY2tyJywgJ2ZsaXBib2FyZCcsICdmbHknLCAnZm9udCBhd2Vzb21lJywgJ2ZvbnQgYXdlc29tZSBhbHRlcm5hdGUnLCAnZm9udCBhd2Vzb21lIGZsYWcnLCAnZm9udGljb25zJywgJ2ZvbnRpY29ucyBmaScsICdmb3J0IGF3ZXNvbWUnLCAnZm9ydCBhd2Vzb21lIGFsdGVybmF0ZScsICdmb3J1bWJlZScsICdmb3Vyc3F1YXJlJywgJ2ZyZWUgY29kZSBjYW1wJywgJ2ZyZWVic2QnLCAnZ2V0IHBvY2tldCcsICdnZycsICdnZyBjaXJjbGUnLCAnZ2l0JywgJ2dpdCBzcXVhcmUnLCAnZ2l0aHViJywgJ2dpdGh1YiBhbHRlcm5hdGUnLCAnZ2l0aHViIHNxdWFyZScsICdnaXRrcmFrZW4nLCAnZ2l0bGFiJywgJ2dpdHRlcicsICdnbGlkZScsICdnbGlkZSBnJywgJ2dvZm9yZScsICdnb29kcmVhZHMnLCAnZ29vZHJlYWRzIGcnLCAnZ29vZ2xlJywgJ2dvb2dsZSBkcml2ZScsICdnb29nbGUgcGxheScsICdnb29nbGUgcGx1cycsICdnb29nbGUgcGx1cyBnJywgJ2dvb2dsZSBwbHVzIHNxdWFyZScsICdnb29nbGUgd2FsbGV0JywgJ2dyYXRpcGF5JywgJ2dyYXYnLCAnZ3JpcGZpcmUnLCAnZ3J1bnQnLCAnZ3VscCcsICdoYWNrZXIgbmV3cycsICdoYWNrZXIgbmV3cyBzcXVhcmUnLCAnaGlwcycsICdoaXJlIGEgaGVscGVyJywgJ2hvb2xpJywgJ2hvdGphcicsICdob3V6eicsICdodG1sNScsICdodWJzcG90JywgJ2ltZGInLCAnaW5zdGFncmFtJywgJ2ludGVybmV0IGV4cGxvcmVyJywgJ2lveGhvc3QnLCAnaXR1bmVzJywgJ2l0dW5lcyBub3RlJywgJ2plbmtpbnMnLCAnam9nZXQnLCAnam9vbWxhJywgJ2pzJywgJ2pzIHNxdWFyZScsICdqc2ZpZGRsZScsICdrZXljZG4nLCAna2lja3N0YXJ0ZXInLCAna2lja3N0YXJ0ZXIgaycsICdrb3J2dWUnLCAnbGFyYXZlbCcsICdsYXN0Zm0nLCAnbGFzdGZtIHNxdWFyZScsICdsZWFucHViJywgJ2xlc3MnLCAnbGluZWNoYXQnLCAnbGlua2VkaW4nLCAnbGlua2VkaW4gYWx0ZXJuYXRlJywgJ2xpbm9kZScsICdsaW51eCcsICdseWZ0JywgJ21hZ2VudG8nLCAnbWF4Y2RuJywgJ21lZGFwcHMnLCAnbWVkaXVtJywgJ21lZGl1bSBtJywgJ21lZHJ0JywgJ21lZXR1cCcsICdtaWNyb3NvZnQnLCAnbWl4JywgJ21peGNsb3VkJywgJ21penVuaScsICdtb2R4JywgJ21vbmVybycsICduYXBzdGVyJywgJ25pbnRlbmRvIHN3aXRjaCcsICdub2RlJywgJ25vZGUganMnLCAnbnBtJywgJ25zOCcsICdudXRyaXRpb25peCcsICdvZG5va2xhc3NuaWtpJywgJ29kbm9rbGFzc25pa2kgc3F1YXJlJywgJ29wZW5jYXJ0JywgJ29wZW5pZCcsICdvcGVyYScsICdvcHRpbiBtb25zdGVyJywgJ29zaScsICdwYWdlNCcsICdwYWdlbGluZXMnLCAncGFsZmVkJywgJ3BhdHJlb24nLCAncGF5cGFsJywgJ3BlcmlzY29wZScsICdwaGFicmljYXRvcicsICdwaG9lbml4IGZyYW1ld29yaycsICdwaHAnLCAncGllZCBwaXBlcicsICdwaWVkIHBpcGVyIGFsdGVybmF0ZScsICdwaWVkIHBpcGVyIHBwJywgJ3BpbnRlcmVzdCcsICdwaW50ZXJlc3QgcCcsICdwaW50ZXJlc3Qgc3F1YXJlJywgJ3BsYXlzdGF0aW9uJywgJ3Byb2R1Y3QgaHVudCcsICdwdXNoZWQnLCAncHl0aG9uJywgJ3FxJywgJ3F1aW5zY2FwZScsICdxdW9yYScsICdyYXZlbHJ5JywgJ3JlYWN0JywgJ3JlYmVsJywgJ3JlZHJpdmVyJywgJ3JlZGRpdCcsICdyZWRkaXQgYWxpZW4nLCAncmVkZGl0IHNxdWFyZScsICdyZW5kYWN0JywgJ3JlbnJlbicsICdyZXBseWQnLCAncmVzb2x2aW5nJywgJ3JvY2tldGNoYXQnLCAncm9ja3JtcycsICdzYWZhcmknLCAnc2FzcycsICdzY2hsaXgnLCAnc2NyaWJkJywgJ3NlYXJjaGVuZ2luJywgJ3NlbGxjYXN0JywgJ3NlbGxzeScsICdzZXJ2aWNlc3RhY2snLCAnc2hpcnRzaW5idWxrJywgJ3NpbXBseWJ1aWx0JywgJ3Npc3RyaXgnLCAnc2t5YXRsYXMnLCAnc2t5cGUnLCAnc2xhY2snLCAnc2xhY2sgaGFzaCcsICdzbGlkZXNoYXJlJywgJ3NuYXBjaGF0JywgJ3NuYXBjaGF0IGdob3N0JywgJ3NuYXBjaGF0IHNxdWFyZScsICdzb3VuZGNsb3VkJywgJ3NwZWFrYXAnLCAnc3BvdGlmeScsICdzdGFjayBleGNoYW5nZScsICdzdGFjayBvdmVyZmxvdycsICdzdGF5bGlua2VkJywgJ3N0ZWFtJywgJ3N0ZWFtIHNxdWFyZScsICdzdGVhbSBzeW1ib2wnLCAnc3RpY2tlciBtdWxlJywgJ3N0cmF2YScsICdzdHJpcGUnLCAnc3RyaXBlIHMnLCAnc3R1ZGlvdmluYXJpJywgJ3N0dW1ibGV1cG9uJywgJ3N0dW1ibGV1cG9uIGNpcmNsZScsICdzdXBlcnBvd2VycycsICdzdXBwbGUnLCAndGVsZWdyYW0nLCAndGVsZWdyYW0gcGxhbmUnLCAndGVuY2VudCB3ZWlibycsICd0aGVtZWlzbGUnLCAndHJlbGxvJywgJ3RyaXBhZHZpc29yJywgJ3R1bWJscicsICd0dW1ibHIgc3F1YXJlJywgJ3R3aXRjaCcsICd0d2l0dGVyJywgJ3R3aXR0ZXIgc3F1YXJlJywgJ3R5cG8zJywgJ3ViZXInLCAndWlraXQnLCAndW5pcmVnaXN0cnknLCAndW50YXBwZCcsICd1c2InLCAndXNzdW5uYWgnLCAndmFhZGluJywgJ3ZpYWNvaW4nLCAndmlhZGVvJywgJ3ZpYWRlbyBzcXVhcmUnLCAndmliZXInLCAndmltZW8nLCAndmltZW8gc3F1YXJlJywgJ3ZpbWVvIHYnLCAndmluZScsICd2aycsICd2bnYnLCAndnVlanMnLCAnd2VjaGF0JywgJ3dlaWJvJywgJ3dlaXhpbicsICd3aGF0c2FwcCcsICd3aGF0c2FwcCBzcXVhcmUnLCAnd2htY3MnLCAnd2lraXBlZGlhIHcnLCAnd2luZG93cycsICd3b3JkcHJlc3MnLCAnd29yZHByZXNzIHNpbXBsZScsICd3cGJlZ2lubmVyJywgJ3dwZXhwbG9yZXInLCAnd3Bmb3JtcycsICd4Ym94JywgJ3hpbmcnLCAneGluZyBzcXVhcmUnLCAneSBjb21iaW5hdG9yJywgJ3lhaG9vJywgJ3lhbmRleCcsICd5YW5kZXggaW50ZXJuYXRpb25hbCcsICd5ZWxwJywgJ3lvYXN0JywgJ3lvdXR1YmUnLCAneW91dHViZSBzcXVhcmUnXTtcbmV4cG9ydCB2YXIgSUNPTlMgPSBfdW5pcShbXS5jb25jYXQoQUNDRVNTSUJJTElUWSwgQVJST1dTLCBBVURJT19WSURFTywgQlVTSU5FU1MsIENIRVNTLCBDT0RFLCBDT01NVU5JQ0FUSU9OLCBDT01QVVRFUlMsIENVUlJFTkNZLCBEQVRFX1RJTUUsIERFU0lHTiwgRURJVE9SUywgRklMRVMsIEdFTkRFUlMsIEhBTkRTX0dFU1RVUkVTLCBIRUFMVEgsIElNQUdFUywgSU5URVJGQUNFUywgTE9HSVNUSUNTLCBNQVBTLCBNRURJQ0FMLCBPQkpFQ1RTLCBQQVlNRU5UU19TSE9QUElORywgU0hBUEVTLCBTUElOTkVSUywgU1BPUlRTLCBTVEFUVVMsIFVTRVJTX1BFT1BMRSwgVkVISUNMRVMsIFdSSVRJTkcsIEJSQU5EUykpO1xuZXhwb3J0IHZhciBJQ09OX0FMSUFTRVMgPSBbJ2NoZXNzIHJvY2snLCAnb3JkZXJlZCBsaXN0JywgJ3Vub3JkZXJlZCBsaXN0JywgJ3VzZXIgZG9jdG9yJywgJ3NoaWVsZCcsICdwdXp6bGUnLCAnYWRkIGNpcmNsZScsICdhZGQgc3F1YXJlJywgJ2FkZCB0byBjYWxlbmRhcicsICdhZGQgdG8gY2FydCcsICdhZGQgdXNlcicsICdhZGQnLCAnYWxhcm0gbXV0ZScsICdhbGFybScsICdhbGQnLCAnYWxzJywgJ2Fubm91bmNlbWVudCcsICdhcmVhIGNoYXJ0JywgJ2FyZWEgZ3JhcGgnLCAnYXJyb3cgZG93biBjYXJ0JywgJ2FzZXh1YWwnLCAnYXNsIGludGVycHJldGluZycsICdhc2wnLCAnYXNzaXN0aXZlIGxpc3RlbmluZyBkZXZpY2VzJywgJ2F0dGFjaCcsICdhdHRlbnRpb24nLCAnYmFsYW5jZScsICdiYXInLCAnYmF0aHR1YicsICdiYXR0ZXJ5IGZvdXInLCAnYmF0dGVyeSBoaWdoJywgJ2JhdHRlcnkgbG93JywgJ2JhdHRlcnkgb25lJywgJ2JhdHRlcnkgdGhyZWUnLCAnYmF0dGVyeSB0d28nLCAnYmF0dGVyeSB6ZXJvJywgJ2JpcnRoZGF5JywgJ2Jsb2NrIGxheW91dCcsICdibHVldG9vdGggYWx0ZXJuYXRpdmUnLCAnYnJva2VuIGNoYWluJywgJ2Jyb3dzZXInLCAnY2FsbCBzcXVhcmUnLCAnY2FsbCcsICdjYW5jZWwnLCAnY2FydCcsICdjYycsICdjaGFpbicsICdjaGF0JywgJ2NoZWNrZWQgY2FsZW5kYXInLCAnY2hlY2ttYXJrJywgJ2NpcmNsZSBub3RjaGVkJywgJ2Nsb3NlJywgJ2NueScsICdjb2NrdGFpbCcsICdjb21tZW50aW5nJywgJ2NvbXB1dGVyJywgJ2NvbmZpZ3VyZScsICdjb250ZW50JywgJ2RlYWZuZXNzJywgJ2RlbGV0ZSBjYWxlbmRhcicsICdkZWxldGUnLCAnZGV0ZWN0aXZlJywgJ2Rpc2N1c3Npb25zJywgJ2RvY3RvcicsICdkb2xsYXInLCAnZG9udCcsICdkcml2ZXJzIGxpY2Vuc2UnLCAnZHJvcGRvd24nLCAnZW1lcmdlbmN5JywgJ2VudmlyYSBnYWxsZXJ5JywgJ2VyYXNlJywgJ2V1cicsICdldXJvJywgJ2V5ZWRyb3BwZXInLCAnZmFjdG9yeScsICdmYXZvcml0ZScsICdmZWVkJywgJ2ZlbWFsZSBob21vc2V4dWFsJywgJ2ZpbGUgdGV4dCcsICdmaWxlIHRleHQgb3V0bGluZScsICdmaW5kJywgJ2ZpcnN0IGFpZCcsICdmb3JrJywgJ2dhbWUnLCAnZ2F5JywgJ2dicCcsICdnb29nbGUgcGx1cyBjaXJjbGUnLCAnZ29vZ2xlIHBsdXMgb2ZmaWNpYWwnLCAnZ3JhYicsICdncmFkdWF0aW9uJywgJ2dyaWQgbGF5b3V0JywgJ2dyb3VwJywgJ2gnLCAnaGFuZCB2aWN0b3J5JywgJ2hhbmRpY2FwJywgJ2hhcmQgb2YgaGVhcmluZycsICdoZWFkZXInLCAnaGVscCBjaXJjbGUnLCAnaGVscCcsICdoZXRlcm9zZXh1YWwnLCAnaGlkZScsICdob3RlbCcsICdob3VyZ2xhc3MgZm91cicsICdob3VyZ2xhc3MgZnVsbCcsICdob3VyZ2xhc3Mgb25lJywgJ2hvdXJnbGFzcyB0aHJlZScsICdob3VyZ2xhc3MgdHdvJywgJ2lkZWEnLCAnaWxzJywgJ2luIGNhcnQnLCAnaW5yJywgJ2ludGVyZ2VuZGVyJywgJ2ludGVyc2V4JywgJ2pweScsICdrcncnLCAnbGFiJywgJ2xhdycsICdsZWdhbCcsICdsZXNiaWFuJywgJ2xpZ2h0bmluZycsICdsaWtlJywgJ2xpbmUgZ3JhcGgnLCAnbGlua2VkaW4gc3F1YXJlJywgJ2xpbmtpZnknLCAnbGlyYScsICdsaXN0IGxheW91dCcsICdtYWduaWZ5JywgJ21haWwgZm9yd2FyZCcsICdtYWlsIG91dGxpbmUnLCAnbWFpbCBzcXVhcmUnLCAnbWFpbCcsICdtYWxlIGhvbW9zZXh1YWwnLCAnbWFuJywgJ21hcmtlcicsICdtYXJzIGFsdGVybmF0ZScsICdtYXJzIGhvcml6b250YWwnLCAnbWFycyB2ZXJ0aWNhbCcsICdtaWNyb3NvZnQgZWRnZScsICdtaWxpdGFyeScsICdtcyBlZGdlJywgJ211dGUnLCAnbmV3IHBpZWQgcGlwZXInLCAnbm9uIGJpbmFyeSB0cmFuc2dlbmRlcicsICdudW1iZXJlZCBsaXN0JywgJ29wdGlvbnMnLCAnb3RoZXIgZ2VuZGVyIGhvcml6b250YWwnLCAnb3RoZXIgZ2VuZGVyIHZlcnRpY2FsJywgJ290aGVyIGdlbmRlcicsICdwYXltZW50JywgJ3BheXBhbCBjYXJkJywgJ3BlbmNpbCBzcXVhcmUnLCAncGhvdG8nLCAncGljdHVyZScsICdwaWUgY2hhcnQnLCAncGllIGdyYXBoJywgJ3BpZWQgcGlwZXIgaGF0JywgJ3BpbicsICdwbHVzIGNhcnQnLCAncG9pbnQnLCAncG9pbnRpbmcgZG93bicsICdwb2ludGluZyBsZWZ0JywgJ3BvaW50aW5nIHJpZ2h0JywgJ3BvaW50aW5nIHVwJywgJ3BvdW5kJywgJ3Bvd2VyIGNvcmQnLCAncG93ZXInLCAncHJpdmFjeScsICdyIGNpcmNsZScsICdyYWluJywgJ3JlY29yZCcsICdyZWZyZXNoJywgJ3JlbW92ZSBjaXJjbGUnLCAncmVtb3ZlIGZyb20gY2FsZW5kYXInLCAncmVtb3ZlIHVzZXInLCAncmVtb3ZlJywgJ3JlcGVhdCcsICdybWInLCAncm91YmxlJywgJ3J1YicsICdydWJsZScsICdydXBlZScsICdzMTUnLCAnc2VsZWN0ZWQgcmFkaW8nLCAnc2VuZCcsICdzZXR0aW5nJywgJ3NldHRpbmdzJywgJ3NoZWtlbCcsICdzaGVxZWwnLCAnc2hpcHBpbmcnLCAnc2hvcCcsICdzaHVmZmxlJywgJ3NodXRkb3duJywgJ3NpZGViYXInLCAnc2lnbmluZycsICdzaWdudXAnLCAnc2xpZGVycycsICdzb2NjZXInLCAnc29ydCBhbHBoYWJldCBhc2NlbmRpbmcnLCAnc29ydCBhbHBoYWJldCBkZXNjZW5kaW5nJywgJ3NvcnQgYXNjZW5kaW5nJywgJ3NvcnQgY29udGVudCBhc2NlbmRpbmcnLCAnc29ydCBjb250ZW50IGRlc2NlbmRpbmcnLCAnc29ydCBkZXNjZW5kaW5nJywgJ3NvcnQgbnVtZXJpYyBhc2NlbmRpbmcnLCAnc29ydCBudW1lcmljIGRlc2NlbmRpbmcnLCAnc291bmQnLCAnc3B5JywgJ3N0cmlwZSBjYXJkJywgJ3N0dWRlbnQnLCAndGFsaycsICd0YXJnZXQnLCAndGVsZXR5cGUnLCAndGVsZXZpc2lvbicsICd0ZXh0IGN1cnNvcicsICd0ZXh0IHRlbGVwaG9uZScsICd0aGVtZScsICd0aGVybW9tZXRlcicsICd0aHVtYiB0YWNrJywgJ3RpbWUnLCAndG0nLCAndG9nZ2xlIGRvd24nLCAndG9nZ2xlIGxlZnQnLCAndG9nZ2xlIHJpZ2h0JywgJ3RvZ2dsZSB1cCcsICd0cmFuc2xhdGUnLCAndHJhdmVsJywgJ3RyZWF0bWVudCcsICd0cmlhbmdsZSBkb3duJywgJ3RyaWFuZ2xlIGxlZnQnLCAndHJpYW5nbGUgcmlnaHQnLCAndHJpYW5nbGUgdXAnLCAndHJ5JywgJ3VuaGlkZScsICd1bmxpbmtpZnknLCAndW5tdXRlJywgJ3VzZCcsICd1c2VyIGNhbmNlbCcsICd1c2VyIGNsb3NlJywgJ3VzZXIgZGVsZXRlJywgJ3VzZXIgeCcsICd2Y2FyZCcsICd2aWRlbyBjYW1lcmEnLCAndmlkZW8gcGxheScsICd2b2x1bWUgY29udHJvbCBwaG9uZScsICd3YWl0JywgJ3dhcm5pbmcgY2lyY2xlJywgJ3dhcm5pbmcgc2lnbicsICd3YXJuaW5nJywgJ3dpLWZpJywgJ3dpbm5lcicsICd3aXphcmQnLCAnd29tYW4nLCAnd29uJywgJ3dvcmRwcmVzcyBiZWdpbm5lcicsICd3b3JkcHJlc3MgZm9ybXMnLCAnd29ybGQnLCAnd3JpdGUgc3F1YXJlJywgJ3gnLCAneWVuJywgJ3ppcCcsICd6b29tIGluJywgJ3pvb20gb3V0JywgJ3pvb20nLCAnYml0YnVja2V0IHNxdWFyZScsICdjaGVja21hcmsgYm94JywgJ2NpcmNsZSB0aGluJywgJ2Nsb3VkIGRvd25sb2FkJywgJ2Nsb3VkIHVwbG9hZCcsICdjb21wb3NlJywgJ2NvbnZlcnNhdGlvbicsICdjcmVkaXQgY2FyZCBhbHRlcm5hdGl2ZScsICdjdXJyZW5jeScsICdkYXNoYm9hcmQnLCAnZGlhbW9uZCcsICdkaXNrJywgJ2V4Y2hhbmdlJywgJ2V4dGVybmFsIHNoYXJlJywgJ2V4dGVybmFsIHNxdWFyZScsICdleHRlcm5hbCcsICdmYWNlYm9vayBvZmZpY2lhbCcsICdmb29kJywgJ2hvdXJnbGFzcyB6ZXJvJywgJ2xldmVsIGRvd24nLCAnbGV2ZWwgdXAnLCAnbG9nIG91dCcsICdtZWFucGF0aCcsICdtb25leScsICdtb3ZlJywgJ3BlbmNpbCcsICdwcm90ZWN0JywgJ3JhZGlvJywgJ3JlbW92ZSBib29rbWFyaycsICdyZXNpemUgaG9yaXpvbnRhbCcsICdyZXNpemUgdmVydGljYWwnLCAnc2lnbiBpbicsICdzaWduIG91dCcsICdzcG9vbicsICdzdGFyIGhhbGYgZW1wdHknLCAnc3RhciBoYWxmIGZ1bGwnLCAndGlja2V0JywgJ3RpbWVzIHJlY3RhbmdsZScsICd3cml0ZScsICd5b3V0dWJlIHBsYXknXTtcbmV4cG9ydCB2YXIgSUNPTlNfQU5EX0FMSUFTRVMgPSBfdW5pcShbXS5jb25jYXQoSUNPTlMsIElDT05fQUxJQVNFUykpOyAvLyBTb21lIGljb24gbmFtZXMgYXJlIG5vdCBwYXJ0IG9mIGljb25zLmNzcy5cbi8vIFRoZXNlIGFyZSBvbmx5IHZhbGlkIGFzIGNoaWxkcmVuIG9mIG90aGVyIGNvbXBvbmVudHMuXG4vLyBUaGVpciBDU1MgcnVsZXMgYXJlIGRlZmluZWQgYnkgYSBzcGVjaWZpYyBjb21wb25lbnQncyBDU1MuXG4vLyBXZSBkb24ndCB3YW50IHRvIHNob3cgbmFtZSB3YXJuaW5ncyBmb3IgdGhvc2UgdXNhZ2VzIHNvIHdlIGFkZCB0aGVtIGFzIHZhbGlkIG5hbWVzIGhlcmUuXG5cbmV4cG9ydCB2YXIgQ09NUE9ORU5UX0NPTlRFWFRfU1BFQ0lGSUNfSUNPTlMgPSBbJ2xlZnQgZHJvcGRvd24nIC8vIG5lc3RlZCBkcm9wZG93biBtZW51IGRpcmVjdGlvbiBpY29uXG5dO1xuZXhwb3J0IHZhciBBTExfSUNPTlNfSU5fQUxMX0NPTlRFWFRTID0gX3VuaXEoW10uY29uY2F0KElDT05TX0FORF9BTElBU0VTLCBDT01QT05FTlRfQ09OVEVYVF9TUEVDSUZJQ19JQ09OUykpOyIsImltcG9ydCBfZmluZCBmcm9tIFwibG9kYXNoLWVzL2ZpbmRcIjtcbmltcG9ydCBfc29tZSBmcm9tIFwibG9kYXNoLWVzL3NvbWVcIjtcbmltcG9ydCB7IENoaWxkcmVuIH0gZnJvbSAncmVhY3QnO1xuLyoqXG4gKiBEZXRlcm1pbmUgaWYgY2hpbGQgYnkgdHlwZSBleGlzdHMgaW4gY2hpbGRyZW4uXG4gKiBAcGFyYW0ge09iamVjdH0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIHByb3Agb2YgYSBjb21wb25lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gdHlwZSBBbiBodG1sIHRhZyBuYW1lIHN0cmluZyBvciBSZWFjdCBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuXG5leHBvcnQgdmFyIHNvbWVCeVR5cGUgPSBmdW5jdGlvbiBzb21lQnlUeXBlKGNoaWxkcmVuLCB0eXBlKSB7XG4gIHJldHVybiBfc29tZShDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKSwge1xuICAgIHR5cGU6IHR5cGVcbiAgfSk7XG59O1xuLyoqXG4gKiBGaW5kIGNoaWxkIGJ5IHR5cGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIHByb3Agb2YgYSBjb21wb25lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xGdW5jdGlvbn0gdHlwZSBBbiBodG1sIHRhZyBuYW1lIHN0cmluZyBvciBSZWFjdCBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfE9iamVjdH1cbiAqL1xuXG5leHBvcnQgdmFyIGZpbmRCeVR5cGUgPSBmdW5jdGlvbiBmaW5kQnlUeXBlKGNoaWxkcmVuLCB0eXBlKSB7XG4gIHJldHVybiBfZmluZChDaGlsZHJlbi50b0FycmF5KGNoaWxkcmVuKSwge1xuICAgIHR5cGU6IHR5cGVcbiAgfSk7XG59O1xuLyoqXG4gKiBUZXN0cyBpZiBjaGlsZHJlbiBhcmUgbmlsIGluIFJlYWN0IGFuZCBQcmVhY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gY2hpbGRyZW4gVGhlIGNoaWxkcmVuIHByb3Agb2YgYSBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuXG5leHBvcnQgdmFyIGlzTmlsID0gZnVuY3Rpb24gaXNOaWwoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIGNoaWxkcmVuID09PSBudWxsIHx8IGNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgY2hpbGRyZW4ubGVuZ3RoID09PSAwO1xufTsiLCJpbXBvcnQgeyBudW1iZXJUb1dvcmQgfSBmcm9tICcuL251bWJlclRvV29yZCc7XG4vKlxuICogVGhlcmUgYXJlIDMgcHJvcCBwYXR0ZXJucyB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBjbGFzc05hbWUgZm9yIGEgY29tcG9uZW50LlxuICogRWFjaCB1dGlsaXR5IGhlcmUgaXMgbWVhbnQgZm9yIHVzZSBpbiBhIGNsYXNzbmFtZXMoKSBhcmd1bWVudC5cbiAqXG4gKiBUaGVyZSBpcyBubyB1dGlsIGZvciB2YWx1ZU9ubHkoKSBiZWNhdXNlIGl0IHdvdWxkIHNpbXBseSByZXR1cm4gdmFsLlxuICogVXNlIHRoZSBwcm9wIHZhbHVlIGlubGluZSBpbnN0ZWFkLlxuICogICA8TGFiZWwgc2l6ZT0nYmlnJyAvPlxuICogICA8ZGl2IGNsYXNzPVwidWkgYmlnIGxhYmVsXCI+PC9kaXY+XG4gKi9cblxuLyoqXG4gKiBQcm9wcyB3aGVyZSBvbmx5IHRoZSBwcm9wIGtleSBpcyB1c2VkIGluIHRoZSBjbGFzc05hbWUuXG4gKiBAcGFyYW0geyp9IHZhbCBBIHByb3BzIHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IEEgcHJvcHMga2V5XG4gKlxuICogQGV4YW1wbGVcbiAqIDxMYWJlbCB0YWcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSB0YWcgbGFiZWxcIj48L2Rpdj5cbiAqL1xuXG5leHBvcnQgdmFyIHVzZUtleU9ubHkgPSBmdW5jdGlvbiB1c2VLZXlPbmx5KHZhbCwga2V5KSB7XG4gIHJldHVybiB2YWwgJiYga2V5O1xufTtcbi8qKlxuICogUHJvcHMgdGhhdCByZXF1aXJlIGJvdGggYSBrZXkgYW5kIHZhbHVlIHRvIGNyZWF0ZSBhIGNsYXNzTmFtZS5cbiAqIEBwYXJhbSB7Kn0gdmFsIEEgcHJvcHMgdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQSBwcm9wcyBrZXlcbiAqXG4gKiBAZXhhbXBsZVxuICogPExhYmVsIGNvcm5lcj0nbGVmdCcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBsZWZ0IGNvcm5lciBsYWJlbFwiPjwvZGl2PlxuICovXG5cbmV4cG9ydCB2YXIgdXNlVmFsdWVBbmRLZXkgPSBmdW5jdGlvbiB1c2VWYWx1ZUFuZEtleSh2YWwsIGtleSkge1xuICByZXR1cm4gdmFsICYmIHZhbCAhPT0gdHJ1ZSAmJiB2YWwgKyBcIiBcIiArIGtleTtcbn07XG4vKipcbiAqIFByb3BzIHdob3NlIGtleSB3aWxsIGJlIHVzZWQgaW4gY2xhc3NOYW1lLCBvciB2YWx1ZSBhbmQga2V5LlxuICogQHBhcmFtIHsqfSB2YWwgQSBwcm9wcyB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBBIHByb3BzIGtleVxuICpcbiAqIEBleGFtcGxlIEtleSBPbmx5XG4gKiA8TGFiZWwgcG9pbnRpbmcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBwb2ludGluZyBsYWJlbFwiPjwvZGl2PlxuICpcbiAqIEBleGFtcGxlIEtleSBhbmQgVmFsdWVcbiAqIDxMYWJlbCBwb2ludGluZz0nbGVmdCcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBsZWZ0IHBvaW50aW5nIGxhYmVsXCI+PC9kaXY+XG4gKi9cblxuZXhwb3J0IHZhciB1c2VLZXlPclZhbHVlQW5kS2V5ID0gZnVuY3Rpb24gdXNlS2V5T3JWYWx1ZUFuZEtleSh2YWwsIGtleSkge1xuICByZXR1cm4gdmFsICYmICh2YWwgPT09IHRydWUgPyBrZXkgOiB2YWwgKyBcIiBcIiArIGtleSk7XG59OyAvL1xuLy8gUHJvcCB0byBjbGFzc05hbWUgZXhjZXB0aW9uc1xuLy9cblxuLyoqXG4gKiBUaGUgXCJtdWx0aXBsZVwiIHByb3AgaW1wbGVtZW50cyBjb250cm9sIG9mIHZpc2liaWxpdHkgYW5kIHJlc2VydmVkIGNsYXNzZXMgZm9yIEdyaWQgc3ViY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgb2YgdGhlIFwibXVsdGlwbGVcIiBwcm9wXG4gKiBAcGFyYW0geyp9IGtleSBBIHByb3BzIGtleVxuICpcbiAqIEBleGFtcGxlXG4gKiA8R3JpZC5Sb3cgb25seT0nbW9iaWxlJyAvPlxuICogPEdyaWQuUm93IG9ubHk9J21vYmlsZSB0YWJsZXQnIC8+XG4gKiA8ZGl2IGNsYXNzPVwibW9iaWxlIG9ubHkgcm93XCI+PC9kaXY+XG4gKiA8ZGl2IGNsYXNzPVwibW9iaWxlIG9ubHkgdGFibGV0IG9ubHkgcm93XCI+PC9kaXY+XG4gKi9cblxuZXhwb3J0IHZhciB1c2VNdWx0aXBsZVByb3AgPSBmdW5jdGlvbiB1c2VNdWx0aXBsZVByb3AodmFsLCBrZXkpIHtcbiAgaWYgKCF2YWwgfHwgdmFsID09PSB0cnVlKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHZhbC5yZXBsYWNlKCdsYXJnZSBzY3JlZW4nLCAnbGFyZ2Utc2NyZWVuJykucmVwbGFjZSgvIHZlcnRpY2FsbHkvZywgJy12ZXJ0aWNhbGx5Jykuc3BsaXQoJyAnKS5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gcHJvcC5yZXBsYWNlKCctJywgJyAnKSArIFwiIFwiICsga2V5O1xuICB9KS5qb2luKCcgJyk7XG59O1xuLyoqXG4gKiBUaGUgXCJ0ZXh0QWxpZ25cIiBwcm9wIGZvbGxvd3MgdGhlIHVzZVZhbHVlQW5kS2V5IGV4Y2VwdCB3aGVuIHRoZSB2YWx1ZSBpcyBcImp1c3RpZmllZCcuXG4gKiBJbiB0aGlzIGNhc2UsIG9ubHkgdGhlIGNsYXNzIFwianVzdGlmaWVkXCIgaXMgdXNlZCwgaWdub3JpbmcgdGhlIFwiYWxpZ25lZFwiIGNsYXNzLlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIG9mIHRoZSBcInRleHRBbGlnblwiIHByb3BcbiAqXG4gKiBAZXhhbXBsZVxuICogPENvbnRhaW5lciB0ZXh0QWxpZ249J2p1c3RpZmllZCcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBqdXN0aWZpZWQgY29udGFpbmVyXCI+PC9kaXY+XG4gKlxuICogQGV4YW1wbGVcbiAqIDxDb250YWluZXIgdGV4dEFsaWduPSdsZWZ0JyAvPlxuICogPGRpdiBjbGFzcz1cInVpIGxlZnQgYWxpZ25lZCBjb250YWluZXJcIj48L2Rpdj5cbiAqL1xuXG5leHBvcnQgdmFyIHVzZVRleHRBbGlnblByb3AgPSBmdW5jdGlvbiB1c2VUZXh0QWxpZ25Qcm9wKHZhbCkge1xuICByZXR1cm4gdmFsID09PSAnanVzdGlmaWVkJyA/ICdqdXN0aWZpZWQnIDogdXNlVmFsdWVBbmRLZXkodmFsLCAnYWxpZ25lZCcpO1xufTtcbi8qKlxuICogVGhlIFwidmVydGljYWxBbGlnblwiIHByb3AgZm9sbG93cyB0aGUgdXNlVmFsdWVBbmRLZXkuXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIG9mIHRoZSBcInZlcnRpY2FsQWxpZ25cIiBwcm9wXG4gKlxuICogQGV4YW1wbGVcbiAqIDxHcmlkIHZlcnRpY2FsQWxpZ249J21pZGRsZScgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBtaWRkbGUgYWxpZ25lZCBncmlkXCI+PC9kaXY+XG4gKi9cblxuZXhwb3J0IHZhciB1c2VWZXJ0aWNhbEFsaWduUHJvcCA9IGZ1bmN0aW9uIHVzZVZlcnRpY2FsQWxpZ25Qcm9wKHZhbCkge1xuICByZXR1cm4gdXNlVmFsdWVBbmRLZXkodmFsLCAnYWxpZ25lZCcpO1xufTtcbi8qKlxuICogQ3JlYXRlIFwiWFwiLCBcIlggd2lkZVwiIGFuZCBcImVxdWFsIHdpZHRoXCIgY2xhc3NOYW1lcy5cbiAqIFwiWFwiIGlzIGEgbnVtYmVyVG9Xb3JkIHZhbHVlIGFuZCBcIndpZGVcIiBpcyBjb25maWd1cmFibGUuXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgcHJvcCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IFt3aWR0aENsYXNzPScnXSBUaGUgY2xhc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NhbkVxdWFsPWZhbHNlXSBGbGFnIHRoYXQgaW5kaWNhdGVzIHBvc3NpYmlsaXR5IG9mIFwiZXF1YWxcIiB2YWx1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiA8R3JpZCBjb2x1bW5zPSdlcXVhbCcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBlcXVhbCB3aWR0aCBncmlkXCI+PC9kaXY+XG4gKlxuICogPEZvcm0gd2lkdGhzPSdlcXVhbCcgLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBlcXVhbCB3aWR0aCBmb3JtXCI+PC9kaXY+XG4gKlxuICogPEZpZWxkR3JvdXAgd2lkdGhzPSdlcXVhbCcgLz5cbiAqIDxkaXYgY2xhc3M9XCJlcXVhbCB3aWR0aCBmaWVsZHNcIj48L2Rpdj5cbiAqXG4gKiBAZXhhbXBsZVxuICogPEdyaWQgY29sdW1ucz17NH0gLz5cbiAqIDxkaXYgY2xhc3M9XCJ1aSBmb3VyIGNvbHVtbiBncmlkXCI+PC9kaXY+XG4gKi9cblxuZXhwb3J0IHZhciB1c2VXaWR0aFByb3AgPSBmdW5jdGlvbiB1c2VXaWR0aFByb3AodmFsLCB3aWR0aENsYXNzLCBjYW5FcXVhbCkge1xuICBpZiAod2lkdGhDbGFzcyA9PT0gdm9pZCAwKSB7XG4gICAgd2lkdGhDbGFzcyA9ICcnO1xuICB9XG5cbiAgaWYgKGNhbkVxdWFsID09PSB2b2lkIDApIHtcbiAgICBjYW5FcXVhbCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGNhbkVxdWFsICYmIHZhbCA9PT0gJ2VxdWFsJykge1xuICAgIHJldHVybiAnZXF1YWwgd2lkdGgnO1xuICB9XG5cbiAgdmFyIHZhbFR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gIGlmICgodmFsVHlwZSA9PT0gJ3N0cmluZycgfHwgdmFsVHlwZSA9PT0gJ251bWJlcicpICYmIHdpZHRoQ2xhc3MpIHtcbiAgICByZXR1cm4gbnVtYmVyVG9Xb3JkKHZhbCkgKyBcIiBcIiArIHdpZHRoQ2xhc3M7XG4gIH1cblxuICByZXR1cm4gbnVtYmVyVG9Xb3JkKHZhbCk7XG59OyIsImltcG9ydCB7IGNyZWF0ZUZpcnN0UGFnZSwgY3JlYXRlTGFzdEl0ZW0sIGNyZWF0ZU5leHRJdGVtLCBjcmVhdGVQYWdlRmFjdG9yeSwgY3JlYXRlUHJldkl0ZW0gfSBmcm9tICcuL2l0ZW1GYWN0b3JpZXMnO1xuaW1wb3J0IHsgY3JlYXRlQ29tcGxleFJhbmdlLCBjcmVhdGVTaW1wbGVSYW5nZSB9IGZyb20gJy4vcmFuZ2VGYWN0b3JpZXMnO1xuaW1wb3J0IHsgaXNTaW1wbGVQYWdpbmF0aW9uLCB0eXBpZnlPcHRpb25zIH0gZnJvbSAnLi9wYWdpbmF0aW9uVXRpbHMnO1xuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcmF3T3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSByYXdPcHRpb25zLmFjdGl2ZVBhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gcmF3T3B0aW9ucy5ib3VuZGFyeVJhbmdlIE51bWJlciBvZiBhbHdheXMgdmlzaWJsZSBwYWdlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJhd09wdGlvbnMuaGlkZUVsbGlwc2lzIE1hcmtzIGlmIGVsbGlwc2lzIHNob3VsZCBiZSBoaWRkZW4uXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHJhd09wdGlvbnMuc2libGluZ1JhbmdlIE51bWJlciBvZiBhbHdheXMgdmlzaWJsZSBwYWdlcyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBjdXJyZW50IG9uZS5cbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gcmF3T3B0aW9ucy50b3RhbFBhZ2VzIFRvdGFsIG51bWJlciBvZiBwYWdlcy5cbiAqL1xuXG52YXIgY3JlYXRlUGFnaW5hdGlvbkl0ZW1zID0gZnVuY3Rpb24gY3JlYXRlUGFnaW5hdGlvbkl0ZW1zKHJhd09wdGlvbnMpIHtcbiAgdmFyIG9wdGlvbnMgPSB0eXBpZnlPcHRpb25zKHJhd09wdGlvbnMpO1xuICB2YXIgYWN0aXZlUGFnZSA9IG9wdGlvbnMuYWN0aXZlUGFnZSxcbiAgICAgIHRvdGFsUGFnZXMgPSBvcHRpb25zLnRvdGFsUGFnZXM7XG4gIHZhciBwYWdlRmFjdG9yeSA9IGNyZWF0ZVBhZ2VGYWN0b3J5KGFjdGl2ZVBhZ2UpO1xuICB2YXIgaW5uZXJSYW5nZSA9IGlzU2ltcGxlUGFnaW5hdGlvbihvcHRpb25zKSA/IGNyZWF0ZVNpbXBsZVJhbmdlKDEsIHRvdGFsUGFnZXMsIHBhZ2VGYWN0b3J5KSA6IGNyZWF0ZUNvbXBsZXhSYW5nZShvcHRpb25zLCBwYWdlRmFjdG9yeSk7XG4gIHJldHVybiBbY3JlYXRlRmlyc3RQYWdlKCksIGNyZWF0ZVByZXZJdGVtKGFjdGl2ZVBhZ2UpXS5jb25jYXQoaW5uZXJSYW5nZSwgW2NyZWF0ZU5leHRJdGVtKGFjdGl2ZVBhZ2UsIHRvdGFsUGFnZXMpLCBjcmVhdGVMYXN0SXRlbSh0b3RhbFBhZ2VzKV0pO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlUGFnaW5hdGlvbkl0ZW1zOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL2NyZWF0ZVBhZ2luYXRpb25JdGVtcyc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bWJlclxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5leHBvcnQgdmFyIGNyZWF0ZUVsbGlwc2lzSXRlbSA9IGZ1bmN0aW9uIGNyZWF0ZUVsbGlwc2lzSXRlbShwYWdlTnVtYmVyKSB7XG4gIHJldHVybiB7XG4gICAgYWN0aXZlOiBmYWxzZSxcbiAgICB0eXBlOiAnZWxsaXBzaXNJdGVtJyxcbiAgICB2YWx1ZTogcGFnZU51bWJlclxuICB9O1xufTtcbi8qKlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5cbmV4cG9ydCB2YXIgY3JlYXRlRmlyc3RQYWdlID0gZnVuY3Rpb24gY3JlYXRlRmlyc3RQYWdlKCkge1xuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgdHlwZTogJ2ZpcnN0SXRlbScsXG4gICAgdmFsdWU6IDFcbiAgfTtcbn07XG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBhY3RpdmVQYWdlXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuZXhwb3J0IHZhciBjcmVhdGVQcmV2SXRlbSA9IGZ1bmN0aW9uIGNyZWF0ZVByZXZJdGVtKGFjdGl2ZVBhZ2UpIHtcbiAgcmV0dXJuIHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHR5cGU6ICdwcmV2SXRlbScsXG4gICAgdmFsdWU6IE1hdGgubWF4KDEsIGFjdGl2ZVBhZ2UgLSAxKVxuICB9O1xufTtcbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGFjdGl2ZVBhZ2VcbiAqIEByZXR1cm4ge2Z1bmN0aW9ufVxuICovXG5cbmV4cG9ydCB2YXIgY3JlYXRlUGFnZUZhY3RvcnkgPSBmdW5jdGlvbiBjcmVhdGVQYWdlRmFjdG9yeShhY3RpdmVQYWdlKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocGFnZU51bWJlcikge1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IGFjdGl2ZVBhZ2UgPT09IHBhZ2VOdW1iZXIsXG4gICAgICB0eXBlOiAncGFnZUl0ZW0nLFxuICAgICAgdmFsdWU6IHBhZ2VOdW1iZXJcbiAgICB9O1xuICB9O1xufTtcbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGFjdGl2ZVBhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3RhbFBhZ2VzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cblxuZXhwb3J0IHZhciBjcmVhdGVOZXh0SXRlbSA9IGZ1bmN0aW9uIGNyZWF0ZU5leHRJdGVtKGFjdGl2ZVBhZ2UsIHRvdGFsUGFnZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHR5cGU6ICduZXh0SXRlbScsXG4gICAgdmFsdWU6IE1hdGgubWluKGFjdGl2ZVBhZ2UgKyAxLCB0b3RhbFBhZ2VzKVxuICB9O1xufTtcbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHRvdGFsUGFnZXNcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuXG5leHBvcnQgdmFyIGNyZWF0ZUxhc3RJdGVtID0gZnVuY3Rpb24gY3JlYXRlTGFzdEl0ZW0odG90YWxQYWdlcykge1xuICByZXR1cm4ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgdHlwZTogJ2xhc3RJdGVtJyxcbiAgICB2YWx1ZTogdG90YWxQYWdlc1xuICB9O1xufTsiLCIvKipcbiAqIENoZWNrcyB0aGUgcG9zc2liaWxpdHkgb2YgdXNpbmcgc2ltcGxlIHJhbmdlIGdlbmVyYXRpb24sIGlmIG51bWJlciBvZiBnZW5lcmF0ZWQgcGFnZXMgaXMgZXF1YWxcbiAqIG9yIGdyZWF0ZXIgdGhhbiB0b3RhbCBwYWdlcyB0byBzaG93LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5ib3VuZGFyeVJhbmdlIE51bWJlciBvZiBhbHdheXMgdmlzaWJsZSBwYWdlcyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQuXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5zaWJsaW5nUmFuZ2UgTnVtYmVyIG9mIGFsd2F5cyB2aXNpYmxlIHBhZ2VzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lLlxuICogQHBhcmFtIHtudW1iZXJ9IG9wdGlvbnMudG90YWxQYWdlcyBUb3RhbCBudW1iZXIgb2YgcGFnZXMuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgdmFyIGlzU2ltcGxlUGFnaW5hdGlvbiA9IGZ1bmN0aW9uIGlzU2ltcGxlUGFnaW5hdGlvbihfcmVmKSB7XG4gIHZhciBib3VuZGFyeVJhbmdlID0gX3JlZi5ib3VuZGFyeVJhbmdlLFxuICAgICAgaGlkZUVsbGlwc2lzID0gX3JlZi5oaWRlRWxsaXBzaXMsXG4gICAgICBzaWJsaW5nUmFuZ2UgPSBfcmVmLnNpYmxpbmdSYW5nZSxcbiAgICAgIHRvdGFsUGFnZXMgPSBfcmVmLnRvdGFsUGFnZXM7XG4gIHZhciBib3VuZGFyeVJhbmdlU2l6ZSA9IDIgKiBib3VuZGFyeVJhbmdlO1xuICB2YXIgZWxsaXBzaXNTaXplID0gaGlkZUVsbGlwc2lzID8gMCA6IDI7XG4gIHZhciBzaWJsaW5nUmFuZ2VTaXplID0gMiAqIHNpYmxpbmdSYW5nZTtcbiAgcmV0dXJuIDEgKyBlbGxpcHNpc1NpemUgKyBzaWJsaW5nUmFuZ2VTaXplICsgYm91bmRhcnlSYW5nZVNpemUgPj0gdG90YWxQYWdlcztcbn07XG5leHBvcnQgdmFyIHR5cGlmeU9wdGlvbnMgPSBmdW5jdGlvbiB0eXBpZnlPcHRpb25zKF9yZWYyKSB7XG4gIHZhciBhY3RpdmVQYWdlID0gX3JlZjIuYWN0aXZlUGFnZSxcbiAgICAgIGJvdW5kYXJ5UmFuZ2UgPSBfcmVmMi5ib3VuZGFyeVJhbmdlLFxuICAgICAgaGlkZUVsbGlwc2lzID0gX3JlZjIuaGlkZUVsbGlwc2lzLFxuICAgICAgc2libGluZ1JhbmdlID0gX3JlZjIuc2libGluZ1JhbmdlLFxuICAgICAgdG90YWxQYWdlcyA9IF9yZWYyLnRvdGFsUGFnZXM7XG4gIHJldHVybiB7XG4gICAgYWN0aXZlUGFnZTogK2FjdGl2ZVBhZ2UsXG4gICAgYm91bmRhcnlSYW5nZTogK2JvdW5kYXJ5UmFuZ2UsXG4gICAgaGlkZUVsbGlwc2lzOiAhIWhpZGVFbGxpcHNpcyxcbiAgICBzaWJsaW5nUmFuZ2U6ICtzaWJsaW5nUmFuZ2UsXG4gICAgdG90YWxQYWdlczogK3RvdGFsUGFnZXNcbiAgfTtcbn07IiwiaW1wb3J0IF9yYW5nZSBmcm9tIFwibG9kYXNoLWVzL3JhbmdlXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IHsgY3JlYXRlSW5uZXJQcmVmaXgsIGNyZWF0ZUlubmVyU3VmZml4IH0gZnJvbSAnLi9zdWZmaXhGYWN0b3JpZXMnO1xuZXhwb3J0IHZhciBjcmVhdGVTaW1wbGVSYW5nZSA9IGZ1bmN0aW9uIGNyZWF0ZVNpbXBsZVJhbmdlKHN0YXJ0LCBlbmQsIHBhZ2VGYWN0b3J5KSB7XG4gIHJldHVybiBfbWFwKF9yYW5nZShzdGFydCwgZW5kICsgMSksIHBhZ2VGYWN0b3J5KTtcbn07XG5leHBvcnQgdmFyIGNyZWF0ZUNvbXBsZXhSYW5nZSA9IGZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhSYW5nZShvcHRpb25zLCBwYWdlRmFjdG9yeSkge1xuICB2YXIgYWN0aXZlUGFnZSA9IG9wdGlvbnMuYWN0aXZlUGFnZSxcbiAgICAgIGJvdW5kYXJ5UmFuZ2UgPSBvcHRpb25zLmJvdW5kYXJ5UmFuZ2UsXG4gICAgICBoaWRlRWxsaXBzaXMgPSBvcHRpb25zLmhpZGVFbGxpcHNpcyxcbiAgICAgIHNpYmxpbmdSYW5nZSA9IG9wdGlvbnMuc2libGluZ1JhbmdlLFxuICAgICAgdG90YWxQYWdlcyA9IG9wdGlvbnMudG90YWxQYWdlcztcbiAgdmFyIGVsbGlwc2lzU2l6ZSA9IGhpZGVFbGxpcHNpcyA/IDAgOiAxO1xuICB2YXIgZmlyc3RHcm91cEVuZCA9IGJvdW5kYXJ5UmFuZ2U7XG4gIHZhciBmaXJzdEdyb3VwID0gY3JlYXRlU2ltcGxlUmFuZ2UoMSwgZmlyc3RHcm91cEVuZCwgcGFnZUZhY3RvcnkpO1xuICB2YXIgbGFzdEdyb3VwU3RhcnQgPSB0b3RhbFBhZ2VzICsgMSAtIGJvdW5kYXJ5UmFuZ2U7XG4gIHZhciBsYXN0R3JvdXAgPSBjcmVhdGVTaW1wbGVSYW5nZShsYXN0R3JvdXBTdGFydCwgdG90YWxQYWdlcywgcGFnZUZhY3RvcnkpO1xuICB2YXIgaW5uZXJHcm91cFN0YXJ0ID0gTWF0aC5taW4oTWF0aC5tYXgoYWN0aXZlUGFnZSAtIHNpYmxpbmdSYW5nZSwgZmlyc3RHcm91cEVuZCArIGVsbGlwc2lzU2l6ZSArIDEpLCBsYXN0R3JvdXBTdGFydCAtIGVsbGlwc2lzU2l6ZSAtIDIgKiBzaWJsaW5nUmFuZ2UgLSAxKTtcbiAgdmFyIGlubmVyR3JvdXBFbmQgPSBpbm5lckdyb3VwU3RhcnQgKyAyICogc2libGluZ1JhbmdlO1xuICB2YXIgaW5uZXJHcm91cCA9IGNyZWF0ZVNpbXBsZVJhbmdlKGlubmVyR3JvdXBTdGFydCwgaW5uZXJHcm91cEVuZCwgcGFnZUZhY3RvcnkpO1xuICByZXR1cm4gW10uY29uY2F0KGZpcnN0R3JvdXAsIFshaGlkZUVsbGlwc2lzICYmIGNyZWF0ZUlubmVyUHJlZml4KGZpcnN0R3JvdXBFbmQsIGlubmVyR3JvdXBTdGFydCwgcGFnZUZhY3RvcnkpXSwgaW5uZXJHcm91cCwgWyFoaWRlRWxsaXBzaXMgJiYgY3JlYXRlSW5uZXJTdWZmaXgoaW5uZXJHcm91cEVuZCwgbGFzdEdyb3VwU3RhcnQsIHBhZ2VGYWN0b3J5KV0sIGxhc3RHcm91cCkuZmlsdGVyKEJvb2xlYW4pO1xufTsiLCJpbXBvcnQgeyBjcmVhdGVFbGxpcHNpc0l0ZW0gfSBmcm9tICcuL2l0ZW1GYWN0b3JpZXMnO1xuZXhwb3J0IHZhciBjcmVhdGVJbm5lclByZWZpeCA9IGZ1bmN0aW9uIGNyZWF0ZUlubmVyUHJlZml4KGZpcnN0R3JvdXBFbmQsIGlubmVyR3JvdXBTdGFydCwgcGFnZUZhY3RvcnkpIHtcbiAgdmFyIHByZWZpeFBhZ2UgPSBpbm5lckdyb3VwU3RhcnQgLSAxO1xuICB2YXIgc2hvd0VsbGlwc2lzID0gcHJlZml4UGFnZSAhPT0gZmlyc3RHcm91cEVuZCArIDE7XG4gIHZhciBwcmVmaXhGYWN0b3J5ID0gc2hvd0VsbGlwc2lzID8gY3JlYXRlRWxsaXBzaXNJdGVtIDogcGFnZUZhY3Rvcnk7XG4gIHJldHVybiBwcmVmaXhGYWN0b3J5KHByZWZpeFBhZ2UpO1xufTtcbmV4cG9ydCB2YXIgY3JlYXRlSW5uZXJTdWZmaXggPSBmdW5jdGlvbiBjcmVhdGVJbm5lclN1ZmZpeChpbm5lckdyb3VwRW5kLCBsYXN0R3JvdXBTdGFydCwgcGFnZUZhY3RvcnkpIHtcbiAgdmFyIHN1ZmZpeFBhZ2UgPSBpbm5lckdyb3VwRW5kICsgMTtcbiAgdmFyIHNob3dFbGxpcHNpcyA9IHN1ZmZpeFBhZ2UgIT09IGxhc3RHcm91cFN0YXJ0IC0gMTtcbiAgdmFyIHN1ZmZpeEZhY3RvcnkgPSBzaG93RWxsaXBzaXMgPyBjcmVhdGVFbGxpcHNpc0l0ZW0gOiBwYWdlRmFjdG9yeTtcbiAgcmV0dXJuIHN1ZmZpeEZhY3Rvcnkoc3VmZml4UGFnZSk7XG59OyIsImltcG9ydCBfZGlmZmVyZW5jZSBmcm9tIFwibG9kYXNoLWVzL2RpZmZlcmVuY2VcIjtcbmltcG9ydCBfdHJpbSBmcm9tIFwibG9kYXNoLWVzL3RyaW1cIjtcbmltcG9ydCBfaXNPYmplY3QgZnJvbSBcImxvZGFzaC1lcy9pc09iamVjdFwiO1xuaW1wb3J0IF9waWNrIGZyb20gXCJsb2Rhc2gtZXMvcGlja1wiO1xuaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gtZXMva2V5c1wiO1xuaW1wb3J0IF9pc1BsYWluT2JqZWN0IGZyb20gXCJsb2Rhc2gtZXMvaXNQbGFpbk9iamVjdFwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX21pbiBmcm9tIFwibG9kYXNoLWVzL21pblwiO1xuaW1wb3J0IF9zdW0gZnJvbSBcImxvZGFzaC1lcy9zdW1cIjtcbmltcG9ydCBfbWFwIGZyb20gXCJsb2Rhc2gtZXMvbWFwXCI7XG5pbXBvcnQgX3NvcnRCeSBmcm9tIFwibG9kYXNoLWVzL3NvcnRCeVwiO1xuaW1wb3J0IF90YWtlIGZyb20gXCJsb2Rhc2gtZXMvdGFrZVwiO1xuaW1wb3J0IF9tZW1vaXplIGZyb20gXCJsb2Rhc2gtZXMvbWVtb2l6ZVwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBsZXZlbiBmcm9tICcuL2xldmVuJztcblxudmFyIHR5cGVPZiA9IGZ1bmN0aW9uIHR5cGVPZigpIHtcbiAgdmFyIF9PYmplY3QkcHJvdG90eXBlJHRvUztcblxuICByZXR1cm4gKF9PYmplY3QkcHJvdG90eXBlJHRvUyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpLmNhbGwuYXBwbHkoX09iamVjdCRwcm90b3R5cGUkdG9TLCBhcmd1bWVudHMpO1xufTtcbi8qKlxuICogRW5zdXJlIGEgcHJvcCBpcyBhIHZhbGlkIERPTSBub2RlLlxuICovXG5cblxuZXhwb3J0IHZhciBkb21Ob2RlID0gZnVuY3Rpb24gZG9tTm9kZShwcm9wcywgcHJvcE5hbWUpIHtcbiAgLy8gc2tpcCBpZiBwcm9wIGlzIHVuZGVmaW5lZFxuICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gc2hvcnQgY2lyY2xlIGZvciBTU1IgZW52XG5cbiAgaWYgKHR5cGVvZiBFbGVtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuOyAvLyBza2lwIGlmIHByb3AgaXMgdmFsaWRcblxuICBpZiAocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgRWxlbWVudCkgcmV0dXJuO1xuICByZXR1cm4gbmV3IEVycm9yKFwiSW52YWxpZCBwcm9wIFxcXCJcIiArIHByb3BOYW1lICsgXCJcXFwiIHN1cHBsaWVkLCBleHBlY3RlZCBhIERPTSBub2RlLlwiKTtcbn07XG4vKipcbiAqIFNpbWlsYXIgdG8gUHJvcFR5cGVzLm9uZU9mIGJ1dCBzaG93cyBjbG9zZXN0IG1hdGNoZXMuXG4gKiBXb3JkIG9yZGVyIGlzIGlnbm9yZWQgYWxsb3dpbmcgYGxlZnQgY2hldnJvbmAgdG8gbWF0Y2ggYGNoZXZyb24gbGVmdGAuXG4gKiBVc2VmdWwgZm9yIHZlcnkgbGFyZ2UgbGlzdHMgb2Ygb3B0aW9ucyAoZS5nLiBJY29uIG5hbWUsIEZsYWcgbmFtZSwgZXRjLilcbiAqIEBwYXJhbSB7c3RyaW5nW119IHN1Z2dlc3Rpb25zIEFuIGFycmF5IG9mIGFsbG93ZWQgdmFsdWVzLlxuICovXG5cbmV4cG9ydCB2YXIgc3VnZ2VzdCA9IGZ1bmN0aW9uIHN1Z2dlc3Qoc3VnZ2VzdGlvbnMpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHN1Z2dlc3Rpb25zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBzdWdnZXN0LCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKTtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbmVzdGVkLWNhbGxiYWNrcyAqL1xuXG5cbiAgdmFyIGZpbmRCZXN0U3VnZ2VzdGlvbnMgPSBfbWVtb2l6ZShmdW5jdGlvbiAoc3RyKSB7XG4gICAgdmFyIHByb3BWYWx1ZVdvcmRzID0gc3RyLnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIF90YWtlKF9zb3J0QnkoX21hcChzdWdnZXN0aW9ucywgZnVuY3Rpb24gKHN1Z2dlc3Rpb24pIHtcbiAgICAgIHZhciBzdWdnZXN0aW9uV29yZHMgPSBzdWdnZXN0aW9uLnNwbGl0KCcgJyk7XG5cbiAgICAgIHZhciBwcm9wVmFsdWVTY29yZSA9IF9zdW0oX21hcChfbWFwKHByb3BWYWx1ZVdvcmRzLCBmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gX21hcChzdWdnZXN0aW9uV29yZHMsIGZ1bmN0aW9uICh5KSB7XG4gICAgICAgICAgcmV0dXJuIGxldmVuKHgsIHkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLCBfbWluKSk7XG5cbiAgICAgIHZhciBzdWdnZXN0aW9uU2NvcmUgPSBfc3VtKF9tYXAoX21hcChzdWdnZXN0aW9uV29yZHMsIGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBfbWFwKHByb3BWYWx1ZVdvcmRzLCBmdW5jdGlvbiAoeSkge1xuICAgICAgICAgIHJldHVybiBsZXZlbih4LCB5KTtcbiAgICAgICAgfSk7XG4gICAgICB9KSwgX21pbikpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWdnZXN0aW9uOiBzdWdnZXN0aW9uLFxuICAgICAgICBzY29yZTogcHJvcFZhbHVlU2NvcmUgKyBzdWdnZXN0aW9uU2NvcmVcbiAgICAgIH07XG4gICAgfSksIFsnc2NvcmUnLCAnc3VnZ2VzdGlvbiddKSwgMyk7XG4gIH0pO1xuICAvKiBlc2xpbnQtZW5hYmxlIG1heC1uZXN0ZWQtY2FsbGJhY2tzICovXG4gIC8vIENvbnZlcnQgdGhlIHN1Z2dlc3Rpb25zIGxpc3QgaW50byBhIGhhc2ggbWFwIGZvciBPKG4pIGxvb2t1cCB0aW1lcy4gRW5zdXJlXG4gIC8vIHRoZSB3b3JkcyBpbiBlYWNoIGtleSBhcmUgc29ydGVkIGFscGhhYmV0aWNhbGx5IHNvIHRoYXQgd2UgaGF2ZSBhIGNvbnNpc3RlbnRcbiAgLy8gd2F5IG9mIGxvb2tpbmcgdXAgYSB2YWx1ZSBpbiB0aGUgbWFwLCBpLmUuIHdlIGNhbiBzb3J0IHRoZSB3b3JkcyBpbiB0aGVcbiAgLy8gaW5jb21pbmcgcHJvcFZhbHVlIGFuZCBsb29rIHRoYXQgdXAgd2l0aG91dCBoYXZpbmcgdG8gY2hlY2sgYWxsIHBlcm11dGF0aW9ucy5cblxuXG4gIHZhciBzdWdnZXN0aW9uc0xvb2t1cCA9IHN1Z2dlc3Rpb25zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBrZXkpIHtcbiAgICBhY2Nba2V5LnNwbGl0KCcgJykuc29ydCgpLmpvaW4oJyAnKV0gPSB0cnVlO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOyAvLyBza2lwIGlmIHByb3AgaXMgdW5kZWZpbmVkIG9yIGlzIGluY2x1ZGVkIGluIHRoZSBzdWdnZXN0aW9uc1xuXG4gICAgaWYgKCFwcm9wVmFsdWUgfHwgc3VnZ2VzdGlvbnNMb29rdXBbcHJvcFZhbHVlXSkgcmV0dXJuOyAvLyBjaGVjayBpZiB0aGUgd29yZHMgd2VyZSBjb3JyZWN0IGJ1dCBvcmRlcmVkIGRpZmZlcmVudGx5LlxuICAgIC8vIFNpbmNlIHdlJ3JlIG1hdGNoaW5nIGZvciBjbGFzc05hbWVzIHdlIG5lZWQgdG8gYWxsb3cgYW55IHdvcmQgb3JkZXJcbiAgICAvLyB0byBwYXNzIHZhbGlkYXRpb24sIGUuZy4gYGxlZnQgY2hldnJvbmAgdnMgYGNoZXZyb24gbGVmdGAuXG5cbiAgICB2YXIgcHJvcFZhbHVlU29ydGVkID0gcHJvcFZhbHVlLnNwbGl0KCcgJykuc29ydCgpLmpvaW4oJyAnKTtcbiAgICBpZiAoc3VnZ2VzdGlvbnNMb29rdXBbcHJvcFZhbHVlU29ydGVkXSkgcmV0dXJuOyAvLyBmaW5kIGJlc3Qgc3VnZ2VzdGlvbnNcblxuICAgIHZhciBiZXN0TWF0Y2hlcyA9IGZpbmRCZXN0U3VnZ2VzdGlvbnMocHJvcFZhbHVlKTsgLy8gc2tpcCBpZiBhIG1hdGNoIHNjb3JlZCAwXG5cbiAgICBpZiAoYmVzdE1hdGNoZXMuc29tZShmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHguc2NvcmUgPT09IDA7XG4gICAgfSkpIHJldHVybjtcbiAgICByZXR1cm4gbmV3IEVycm9yKFtcIkludmFsaWQgcHJvcCBgXCIgKyBwcm9wTmFtZSArIFwiYCBvZiB2YWx1ZSBgXCIgKyBwcm9wVmFsdWUgKyBcImAgc3VwcGxpZWQgdG8gYFwiICsgY29tcG9uZW50TmFtZSArIFwiYC5cIiwgXCJcXG5cXG5JbnN0ZWFkIG9mIGBcIiArIHByb3BWYWx1ZSArIFwiYCwgZGlkIHlvdSBtZWFuOlwiLCBiZXN0TWF0Y2hlcy5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBcIlxcbiAgLSBcIiArIHguc3VnZ2VzdGlvbjtcbiAgICB9KS5qb2luKCcnKSwgJ1xcbiddLmpvaW4oJycpKTtcbiAgfTtcbn07XG4vKipcbiAqIERpc2FsbG93IG90aGVyIHByb3BzIGZyb20gYmVpbmcgZGVmaW5lZCB3aXRoIHRoaXMgcHJvcC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IGRpc2FsbG93ZWRQcm9wcyBBbiBhcnJheSBvZiBwcm9wcyB0aGF0IGNhbm5vdCBiZSB1c2VkIHdpdGggdGhpcyBwcm9wLlxuICovXG5cbmV4cG9ydCB2YXIgZGlzYWxsb3cgPSBmdW5jdGlvbiBkaXNhbGxvdyhkaXNhbGxvd2VkUHJvcHMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGlzYWxsb3dlZFByb3BzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFsnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBkaXNhbGxvdywgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJywgXCIgU2VlIGBcIiArIHByb3BOYW1lICsgXCJgIHByb3AgaW4gYFwiICsgY29tcG9uZW50TmFtZSArIFwiYC5cIl0uam9pbignJykpO1xuICAgIH0gLy8gc2tpcCBpZiBwcm9wIGlzIHVuZGVmaW5lZFxuXG5cbiAgICBpZiAoX2lzTmlsKHByb3BzW3Byb3BOYW1lXSkgfHwgcHJvcHNbcHJvcE5hbWVdID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gZmluZCBkaXNhbGxvd2VkIHByb3BzIHdpdGggdmFsdWVzXG5cblxuICAgIHZhciBkaXNhbGxvd2VkID0gZGlzYWxsb3dlZFByb3BzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBkaXNhbGxvd2VkUHJvcCkge1xuICAgICAgaWYgKCFfaXNOaWwocHJvcHNbZGlzYWxsb3dlZFByb3BdKSAmJiBwcm9wc1tkaXNhbGxvd2VkUHJvcF0gIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXS5jb25jYXQoYWNjLCBbZGlzYWxsb3dlZFByb3BdKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFtcIlByb3AgYFwiICsgcHJvcE5hbWUgKyBcImAgaW4gYFwiICsgY29tcG9uZW50TmFtZSArIFwiYCBjb25mbGljdHMgd2l0aCBwcm9wczogYFwiICsgZGlzYWxsb3dlZC5qb2luKCdgLCBgJykgKyBcImAuXCIsICdUaGV5IGNhbm5vdCBiZSBkZWZpbmVkIHRvZ2V0aGVyLCBjaG9vc2Ugb25lIG9yIHRoZSBvdGhlci4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEVuc3VyZSBhIHByb3AgYWRoZXJlcnMgdG8gbXVsdGlwbGUgcHJvcCB0eXBlIHZhbGlkYXRvcnMuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uW119IHZhbGlkYXRvcnMgQW4gYXJyYXkgb2YgcHJvcFR5cGUgZnVuY3Rpb25zLlxuICovXG5cbmV4cG9ydCB2YXIgZXZlcnkgPSBmdW5jdGlvbiBldmVyeSh2YWxpZGF0b3JzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJlc3QgPSBuZXcgQXJyYXkoX2xlbiA+IDMgPyBfbGVuIC0gMyA6IDApLCBfa2V5ID0gMzsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgcmVzdFtfa2V5IC0gM10gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbGlkYXRvcnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoWydJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIGV2ZXJ5LCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nLCBcIlNlZSBgXCIgKyBwcm9wTmFtZSArIFwiYCBwcm9wIGluIGBcIiArIGNvbXBvbmVudE5hbWUgKyBcImAuXCJdLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgdmFyIGVycm9ycyA9IFtdO1xuICAgIHZhbGlkYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJldmVyeSgpIGFyZ3VtZW50IFxcXCJ2YWxpZGF0b3JzXFxcIiBzaG91bGQgY29udGFpbiBmdW5jdGlvbnMsIGZvdW5kOiBcIiArIHR5cGVPZih2YWxpZGF0b3IpICsgXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICB2YXIgZXJyb3IgPSB2YWxpZGF0b3IuYXBwbHkodm9pZCAwLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lXS5jb25jYXQocmVzdCkpO1xuXG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH0pOyAvLyB3ZSBjYW4gb25seSByZXR1cm4gb25lIGVycm9yIGF0IGEgdGltZVxuXG4gICAgcmV0dXJuIGVycm9yc1swXTtcbiAgfTtcbn07XG4vKipcbiAqIEVuc3VyZSBhIHZhbGlkYXRvciBwYXNzZXMgb25seSB3aGVuIGEgY29tcG9uZW50IGhhcyBhIGdpdmVuIHByb3BzU2hhcGUuXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHNTaGFwZSBBbiBvYmplY3QgZGVzY3JpYmluZyB0aGUgcHJvcCBzaGFwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHZhbGlkYXRvciBBIHByb3BUeXBlIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCB2YXIgZ2l2ZW5Qcm9wcyA9IGZ1bmN0aW9uIGdpdmVuUHJvcHMocHJvcHNTaGFwZSwgdmFsaWRhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCByZXN0ID0gbmV3IEFycmF5KF9sZW4yID4gMyA/IF9sZW4yIC0gMyA6IDApLCBfa2V5MiA9IDM7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgIHJlc3RbX2tleTIgLSAzXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgaWYgKCFfaXNQbGFpbk9iamVjdChwcm9wc1NoYXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFsnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBnaXZlblByb3BzLCBleHBlY3RlZCBhbiBvYmplY3QuJywgXCJTZWUgYFwiICsgcHJvcE5hbWUgKyBcImAgcHJvcCBpbiBgXCIgKyBjb21wb25lbnROYW1lICsgXCJgLlwiXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsaWRhdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoWydJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIGdpdmVuUHJvcHMsIGV4cGVjdGVkIGEgZnVuY3Rpb24uJywgXCJTZWUgYFwiICsgcHJvcE5hbWUgKyBcImAgcHJvcCBpbiBgXCIgKyBjb21wb25lbnROYW1lICsgXCJgLlwiXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIHZhciBzaG91bGRWYWxpZGF0ZSA9IF9rZXlzKHByb3BzU2hhcGUpLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciB2YWwgPSBwcm9wc1NoYXBlW2tleV07IC8vIHJlcXVpcmUgcHJvcFNoYXBlIHZhbGlkYXRvcnMgdG8gcGFzcyBvciBwcm9wIHZhbHVlcyB0byBtYXRjaFxuXG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyA/ICF2YWwuYXBwbHkodm9pZCAwLCBbcHJvcHMsIGtleSwgY29tcG9uZW50TmFtZV0uY29uY2F0KHJlc3QpKSA6IHZhbCA9PT0gcHJvcHNbcHJvcE5hbWVdO1xuICAgIH0pO1xuXG4gICAgaWYgKCFzaG91bGRWYWxpZGF0ZSkgcmV0dXJuO1xuICAgIHZhciBlcnJvciA9IHZhbGlkYXRvci5hcHBseSh2b2lkIDAsIFtwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWVdLmNvbmNhdChyZXN0KSk7XG5cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIC8vIHBvb3IgbWFucyBzaGFsbG93IHByZXR0eSBwcmludCwgcHJldmVudHMgSlNPTiBjaXJjdWxhciByZWZlcmVuY2UgZXJyb3JzXG4gICAgICB2YXIgcHJldHR5UHJvcHMgPSBcInsgXCIgKyBfa2V5cyhfcGljayhfa2V5cyhwcm9wc1NoYXBlKSwgcHJvcHMpKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdmFsID0gcHJvcHNba2V5XTtcbiAgICAgICAgdmFyIHJlbmRlcmVkVmFsdWUgPSB2YWw7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgcmVuZGVyZWRWYWx1ZSA9IFwiXFxcIlwiICsgdmFsICsgXCJcXFwiXCI7ZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZW5kZXJlZFZhbHVlID0gXCJbXCIgKyB2YWwuam9pbignLCAnKSArIFwiXVwiO2Vsc2UgaWYgKF9pc09iamVjdCh2YWwpKSByZW5kZXJlZFZhbHVlID0gJ3suLi59JztcbiAgICAgICAgcmV0dXJuIGtleSArIFwiOiBcIiArIHJlbmRlcmVkVmFsdWU7XG4gICAgICB9KS5qb2luKCcsICcpICsgXCIgfVwiO1xuICAgICAgZXJyb3IubWVzc2FnZSA9IFwiR2l2ZW4gcHJvcHMgXCIgKyBwcmV0dHlQcm9wcyArIFwiOiBcIiArIGVycm9yLm1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICB9O1xufTtcbi8qKlxuICogRGVmaW5lIHByb3AgZGVwZW5kZW5jaWVzIGJ5IHJlcXVpcmluZyBvdGhlciBwcm9wcy5cbiAqIEBwYXJhbSB7c3RyaW5nW119IHJlcXVpcmVkUHJvcHMgQW4gYXJyYXkgb2YgcmVxdWlyZWQgcHJvcCBuYW1lcy5cbiAqL1xuXG5leHBvcnQgdmFyIGRlbWFuZCA9IGZ1bmN0aW9uIGRlbWFuZChyZXF1aXJlZFByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlcXVpcmVkUHJvcHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoWydJbnZhbGlkIGByZXF1aXJlZFByb3BzYCBhcmd1bWVudCBzdXBwbGllZCB0byByZXF1aXJlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nLCBcIiBTZWUgYFwiICsgcHJvcE5hbWUgKyBcImAgcHJvcCBpbiBgXCIgKyBjb21wb25lbnROYW1lICsgXCJgLlwiXS5qb2luKCcnKSk7XG4gICAgfSAvLyBza2lwIGlmIHByb3AgaXMgdW5kZWZpbmVkXG5cblxuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHZhciBtaXNzaW5nUmVxdWlyZWQgPSByZXF1aXJlZFByb3BzLmZpbHRlcihmdW5jdGlvbiAocmVxdWlyZWRQcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcHNbcmVxdWlyZWRQcm9wXSA9PT0gdW5kZWZpbmVkO1xuICAgIH0pO1xuXG4gICAgaWYgKG1pc3NpbmdSZXF1aXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFwiYFwiICsgcHJvcE5hbWUgKyBcImAgcHJvcCBpbiBgXCIgKyBjb21wb25lbnROYW1lICsgXCJgIHJlcXVpcmVzIHByb3BzOiBgXCIgKyBtaXNzaW5nUmVxdWlyZWQuam9pbignYCwgYCcpICsgXCJgLlwiKTtcbiAgICB9XG4gIH07XG59O1xuLyoqXG4gKiBFbnN1cmUgYW4gbXVsdGlwbGUgcHJvcCBjb250YWlucyBhIHN0cmluZyB3aXRoIG9ubHkgcG9zc2libGUgdmFsdWVzLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcG9zc2libGUgQW4gYXJyYXkgb2YgcG9zc2libGUgdmFsdWVzIHRvIHByb3AuXG4gKi9cblxuZXhwb3J0IHZhciBtdWx0aXBsZVByb3AgPSBmdW5jdGlvbiBtdWx0aXBsZVByb3AocG9zc2libGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9zc2libGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoWydJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIHNvbWUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicsIFwiU2VlIGBcIiArIHByb3BOYW1lICsgXCJgIHByb3AgaW4gYFwiICsgY29tcG9uZW50TmFtZSArIFwiYC5cIl0uam9pbignICcpKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdOyAvLyBza2lwIGlmIHByb3AgaXMgdW5kZWZpbmVkXG5cbiAgICBpZiAoX2lzTmlsKHByb3BWYWx1ZSkgfHwgcHJvcFZhbHVlID09PSBmYWxzZSkgcmV0dXJuO1xuICAgIHZhciB2YWx1ZXMgPSBwcm9wVmFsdWUucmVwbGFjZSgnbGFyZ2Ugc2NyZWVuJywgJ2xhcmdlLXNjcmVlbicpLnJlcGxhY2UoLyB2ZXJ0aWNhbGx5L2csICctdmVydGljYWxseScpLnNwbGl0KCcgJykubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgIHJldHVybiBfdHJpbSh2YWwpLnJlcGxhY2UoJy0nLCAnICcpO1xuICAgIH0pO1xuXG4gICAgdmFyIGludmFsaWQgPSBfZGlmZmVyZW5jZSh2YWx1ZXMsIHBvc3NpYmxlKTsgLy8gZmFpbCBvbmx5IGlmIHRoZXJlIGFyZSBpbnZhbGlkIHZhbHVlc1xuXG5cbiAgICBpZiAoaW52YWxpZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKFwiYFwiICsgcHJvcE5hbWUgKyBcImAgcHJvcCBpbiBgXCIgKyBjb21wb25lbnROYW1lICsgXCJgIGhhcyBpbnZhbGlkIHZhbHVlczogYFwiICsgaW52YWxpZC5qb2luKCdgLCBgJykgKyBcImAuXCIpO1xuICAgIH1cbiAgfTtcbn07XG4vKipcbiAqIEVuc3VyZSBhIGNvbXBvbmVudCBjYW4gcmVuZGVyIGFzIGEgbm9kZSBwYXNzZWQgYXMgYSBwcm9wIHZhbHVlIGluIHBsYWNlIG9mIGNoaWxkcmVuLlxuICovXG5cbmV4cG9ydCB2YXIgY29udGVudFNob3J0aGFuZCA9IGZ1bmN0aW9uIGNvbnRlbnRTaG9ydGhhbmQoKSB7XG4gIHJldHVybiBldmVyeShbZGlzYWxsb3coWydjaGlsZHJlbiddKSwgUHJvcFR5cGVzLm5vZGVdKS5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7XG59O1xuLyoqXG4gKiBJdGVtIHNob3J0aGFuZCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgY29tcG9uZW50IHRoYXQgY2FuIGJlIGEgbGl0ZXJhbCxcbiAqIGEgcHJvcHMgb2JqZWN0LCBvciBhbiBlbGVtZW50LlxuICovXG5cbmV4cG9ydCB2YXIgaXRlbVNob3J0aGFuZCA9IGZ1bmN0aW9uIGl0ZW1TaG9ydGhhbmQoKSB7XG4gIHJldHVybiBldmVyeShbZGlzYWxsb3coWydjaGlsZHJlbiddKSwgUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmZ1bmMsIFByb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMub2JqZWN0LCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLm9iamVjdF0pKV0pXSkuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xufTtcbi8qKlxuICogQ29sbGVjdGlvbiBzaG9ydGhhbmQgZW5zdXJlcyBhIHByb3AgaXMgYW4gYXJyYXkgb2YgaXRlbSBzaG9ydGhhbmQuXG4gKi9cblxuZXhwb3J0IHZhciBjb2xsZWN0aW9uU2hvcnRoYW5kID0gZnVuY3Rpb24gY29sbGVjdGlvblNob3J0aGFuZCgpIHtcbiAgcmV0dXJuIGV2ZXJ5KFtkaXNhbGxvdyhbJ2NoaWxkcmVuJ10pLCBQcm9wVHlwZXMuYXJyYXlPZihpdGVtU2hvcnRoYW5kKV0pLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbn07XG4vKipcbiAqIFNob3cgYSBkZXByZWNhdGVkIHdhcm5pbmcgZm9yIGNvbXBvbmVudCBwcm9wcyB3aXRoIGEgaGVscCBtZXNzYWdlIGFuZCBvcHRpb25hbCB2YWxpZGF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gaGVscCBBIGhlbHAgbWVzc2FnZSB0byBkaXNwbGF5IHdpdGggdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbdmFsaWRhdG9yXSBBIHByb3BUeXBlIGZ1bmN0aW9uLlxuICovXG5cbmV4cG9ydCB2YXIgZGVwcmVjYXRlID0gZnVuY3Rpb24gZGVwcmVjYXRlKGhlbHAsIHZhbGlkYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgIGlmICh0eXBlb2YgaGVscCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihbJ0ludmFsaWQgYGhlbHBgIGFyZ3VtZW50IHN1cHBsaWVkIHRvIGRlcHJlY2F0ZSwgZXhwZWN0ZWQgYSBzdHJpbmcuJywgXCJTZWUgYFwiICsgcHJvcE5hbWUgKyBcImAgcHJvcCBpbiBgXCIgKyBjb21wb25lbnROYW1lICsgXCJgLlwiXS5qb2luKCcgJykpO1xuICAgIH0gLy8gc2tpcCBpZiBwcm9wIGlzIHVuZGVmaW5lZFxuXG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHJldHVybjsgLy8gZGVwcmVjYXRpb24gZXJyb3IgYW5kIGhlbHBcblxuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcIlRoZSBgXCIgKyBwcm9wTmFtZSArIFwiYCBwcm9wIGluIGBcIiArIGNvbXBvbmVudE5hbWUgKyBcImAgaXMgZGVwcmVjYXRlZC5cIik7XG4gICAgaWYgKGhlbHApIGVycm9yLm1lc3NhZ2UgKz0gXCIgXCIgKyBoZWxwOyAvLyBhZGQgb3B0aW9uYWwgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlXG5cbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjMgPiAzID8gX2xlbjMgLSAzIDogMCksIF9rZXkzID0gMzsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgICAgICAgIGFyZ3NbX2tleTMgLSAzXSA9IGFyZ3VtZW50c1tfa2V5M107XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdG9yLmFwcGx5KHZvaWQgMCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZV0uY29uY2F0KGFyZ3MpKTtcblxuICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgZXJyb3IubWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgKyBcIiBcIiArIHZhbGlkYXRpb25FcnJvci5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoWydJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIGRlcHJlY2F0ZSwgZXhwZWN0ZWQgYSBmdW5jdGlvbi4nLCBcIlNlZSBgXCIgKyBwcm9wTmFtZSArIFwiYCBwcm9wIGluIGBcIiArIGNvbXBvbmVudE5hbWUgKyBcImAuXCJdLmpvaW4oJyAnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufTtcbi8qKiBBIGNoZWNrZXIgdGhhdCBtYXRjaGVzIHRoZSBSZWFjdC5SZWZPYmplY3QgdHlwZS4gKi9cblxuZXhwb3J0IHZhciByZWZPYmplY3QgPSBQcm9wVHlwZXMuc2hhcGUoe1xuICBjdXJyZW50OiBQcm9wVHlwZXMub2JqZWN0XG59KTtcbi8qKiBBIGNoZWNrZXIgdGhhdCBtYXRjaGVzIHRoZSBSZWFjdC5SZWYgdHlwZS4gKi9cblxuZXhwb3J0IHZhciByZWYgPSBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuZnVuYywgcmVmT2JqZWN0XSk7IiwiaW1wb3J0IF9pblJhbmdlIGZyb20gXCJsb2Rhc2gtZXMvaW5SYW5nZVwiO1xuaW1wb3J0IF9maXJzdCBmcm9tIFwibG9kYXNoLWVzL2ZpcnN0XCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX3NvbWUgZnJvbSBcImxvZGFzaC1lcy9zb21lXCI7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIGNsaWNrJ3MgY29vcmRpbmF0ZXMgYXJlIHdpdGhpbiB0aGUgYm91bmRzIG9mIGEgbm9kZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUktUmVhY3QvcHVsbC8yMzg0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5vZGUgLSBBIERPTSBub2RlLlxuICogQHBhcmFtIHtvYmplY3R9IGUgLSBBIFN5bnRoZXRpY0V2ZW50IG9yIERPTSBFdmVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG52YXIgZG9lc05vZGVDb250YWluQ2xpY2sgPSBmdW5jdGlvbiBkb2VzTm9kZUNvbnRhaW5DbGljayhub2RlLCBlKSB7XG4gIGlmIChfc29tZShbZSwgbm9kZV0sIF9pc05pbCkpIHJldHVybiBmYWxzZTsgLy8gaWYgdGhlcmUgaXMgYW4gZS50YXJnZXQgYW5kIGl0IGlzIGluIHRoZSBkb2N1bWVudCwgdXNlIGEgc2ltcGxlIG5vZGUuY29udGFpbnMoKSBjaGVja1xuXG4gIGlmIChlLnRhcmdldCkge1xuICAgIF9pbnZva2UoZS50YXJnZXQsICdzZXRBdHRyaWJ1dGUnLCAnZGF0YS1zdWlyLWNsaWNrLXRhcmdldCcsIHRydWUpO1xuXG4gICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXN1aXItY2xpY2stdGFyZ2V0PXRydWVdJykpIHtcbiAgICAgIF9pbnZva2UoZS50YXJnZXQsICdyZW1vdmVBdHRyaWJ1dGUnLCAnZGF0YS1zdWlyLWNsaWNrLXRhcmdldCcpO1xuXG4gICAgICByZXR1cm4gbm9kZS5jb250YWlucyhlLnRhcmdldCk7XG4gICAgfVxuICB9IC8vIEJlbG93IGxvZ2ljIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGUudGFyZ2V0IGlzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQuXG4gIC8vIFRoZSByZXN1bHQgb2YgdGhlIGNsaWNrIGxpa2VseSBoYXMgcmVtb3ZlZCB0aGUgZS50YXJnZXQgbm9kZS5cbiAgLy8gSW5zdGVhZCBvZiBub2RlLmNvbnRhaW5zKCksIHdlJ2xsIGlkZW50aWZ5IHRoZSBjbGljayBieSBYL1kgcG9zaXRpb24uXG4gIC8vIHJldHVybiBlYXJseSBpZiB0aGUgZXZlbnQgcHJvcGVydGllcyBhcmVuJ3QgYXZhaWxhYmxlXG4gIC8vIHByZXZlbnQgbWVhc3VyaW5nIHRoZSBub2RlIGFuZCByZXBhaW50aW5nIGlmIHdlIGRvbid0IG5lZWQgdG9cblxuXG4gIHZhciBjbGllbnRYID0gZS5jbGllbnRYLFxuICAgICAgY2xpZW50WSA9IGUuY2xpZW50WTtcbiAgaWYgKF9zb21lKFtjbGllbnRYLCBjbGllbnRZXSwgX2lzTmlsKSkgcmV0dXJuIGZhbHNlOyAvLyBmYWxzZSBpZiB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZVxuXG4gIHZhciBjbGllbnRSZWN0cyA9IG5vZGUuZ2V0Q2xpZW50UmVjdHMoKTsgLy8gSGVhZHMgVXAhXG4gIC8vIGdldENsaWVudFJlY3RzIHJldHVybnMgYSBET01SZWN0TGlzdCwgbm90IGFuIGFycmF5IG5vciBhIHBsYWluIG9iamVjdFxuICAvLyBXZSBleHBsaWNpdGx5IGF2b2lkIF8uaXNFbXB0eSBhbmQgY2hlY2sgLmxlbmd0aCB0byBjb3ZlciBhbGwgcG9zc2libGUgc2hhcGVzXG5cbiAgaWYgKCFub2RlLm9mZnNldFdpZHRoIHx8ICFub2RlLm9mZnNldEhlaWdodCB8fCAhY2xpZW50UmVjdHMgfHwgIWNsaWVudFJlY3RzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOyAvLyBmYWxzZSBpZiB0aGUgbm9kZSBkb2Vzbid0IGhhdmUgYSB2YWxpZCBib3VuZGluZyByZWN0XG5cbiAgdmFyIF9maXJzdDIgPSBfZmlyc3QoY2xpZW50UmVjdHMpLFxuICAgICAgdG9wID0gX2ZpcnN0Mi50b3AsXG4gICAgICBib3R0b20gPSBfZmlyc3QyLmJvdHRvbSxcbiAgICAgIGxlZnQgPSBfZmlyc3QyLmxlZnQsXG4gICAgICByaWdodCA9IF9maXJzdDIucmlnaHQ7XG5cbiAgaWYgKF9zb21lKFt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHRdLCBfaXNOaWwpKSByZXR1cm4gZmFsc2U7IC8vIHdlIGFkZCBhIHNtYWxsIGRlY2ltYWwgdG8gdGhlIHVwcGVyIGJvdW5kIGp1c3QgdG8gbWFrZSBpdCBpbmNsdXNpdmVcbiAgLy8gZG9uJ3QgYWRkIGFuIHdob2xlIHBpeGVsICgxKSBhcyB0aGUgZXZlbnQvbm9kZSB2YWx1ZXMgbWF5IGJlIGRlY2ltYWwgc2Vuc2l0aXZlXG5cbiAgcmV0dXJuIF9pblJhbmdlKGNsaWVudFksIHRvcCwgYm90dG9tICsgMC4wMDEpICYmIF9pblJhbmdlKGNsaWVudFgsIGxlZnQsIHJpZ2h0ICsgMC4wMDEpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZG9lc05vZGVDb250YWluQ2xpY2s7IiwiaW1wb3J0IHsgaW5zdGFuY2UgfSBmcm9tICdAc2VtYW50aWMtdWktcmVhY3QvZXZlbnQtc3RhY2snO1xuZXhwb3J0IGRlZmF1bHQgaW5zdGFuY2U7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3VuaXEgZnJvbSBcImxvZGFzaC1lcy91bmlxXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcImxvZGFzaC1lcy9pc0FycmF5XCI7XG5pbXBvcnQgX2lzUGxhaW5PYmplY3QgZnJvbSBcImxvZGFzaC1lcy9pc1BsYWluT2JqZWN0XCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC1lcy9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2lzTnVtYmVyIGZyb20gXCJsb2Rhc2gtZXMvaXNOdW1iZXJcIjtcbmltcG9ydCBfaXNTdHJpbmcgZnJvbSBcImxvZGFzaC1lcy9pc1N0cmluZ1wiO1xuaW1wb3J0IF9pc0Jvb2xlYW4gZnJvbSBcImxvZGFzaC1lcy9pc0Jvb2xlYW5cIjtcbmltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC1lcy9pc05pbFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xudmFyIERFUFJFQ0FURURfQ0FMTFMgPSB7fTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGYWN0b3JpZXNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEEgbW9yZSByb2J1c3QgUmVhY3QuY3JlYXRlRWxlbWVudC4gSXQgY2FuIGNyZWF0ZSBlbGVtZW50cyBmcm9tIHByaW1pdGl2ZSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxzdHJpbmd9IENvbXBvbmVudCBBIFJlYWN0Q2xhc3Mgb3Igc3RyaW5nXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBtYXBWYWx1ZVRvUHJvcHMgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBwcmltaXRpdmUgdmFsdWUgdG8gdGhlIENvbXBvbmVudCBwcm9wc1xuICogQHBhcmFtIHtzdHJpbmd8b2JqZWN0fGZ1bmN0aW9ufSB2YWwgVGhlIHZhbHVlIHRvIGNyZWF0ZSBhIFJlYWN0RWxlbWVudCBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnMuZGVmYXVsdFByb3BzPXt9XSBEZWZhdWx0IHByb3BzIG9iamVjdFxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IFtvcHRpb25zLm92ZXJyaWRlUHJvcHM9e31dIE92ZXJyaWRlIHByb3BzIG9iamVjdCBvciBmdW5jdGlvbiAoY2FsbGVkIHdpdGggcmVndWxhciBwcm9wcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXV0b0dlbmVyYXRlS2V5PXRydWVdIFdoZXRoZXIgb3Igbm90IGF1dG9tYXRpYyBrZXkgZ2VuZXJhdGlvbiBpcyBhbGxvd2VkXG4gKiBAcmV0dXJucyB7b2JqZWN0fG51bGx9XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNob3J0aGFuZChDb21wb25lbnQsIG1hcFZhbHVlVG9Qcm9wcywgdmFsLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICBpZiAodHlwZW9mIENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgQ29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlU2hvcnRoYW5kKCkgQ29tcG9uZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgZnVuY3Rpb24uJyk7XG4gIH0gLy8gc2hvcnQgY2lyY3VpdCBub29wIHZhbHVlc1xuXG5cbiAgaWYgKF9pc05pbCh2YWwpIHx8IF9pc0Jvb2xlYW4odmFsKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHZhbElzU3RyaW5nID0gX2lzU3RyaW5nKHZhbCk7XG5cbiAgdmFyIHZhbElzTnVtYmVyID0gX2lzTnVtYmVyKHZhbCk7XG5cbiAgdmFyIHZhbElzRnVuY3Rpb24gPSBfaXNGdW5jdGlvbih2YWwpO1xuXG4gIHZhciB2YWxJc1JlYWN0RWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5pc1ZhbGlkRWxlbWVudCh2YWwpO1xuXG4gIHZhciB2YWxJc1Byb3BzT2JqZWN0ID0gX2lzUGxhaW5PYmplY3QodmFsKTtcblxuICB2YXIgdmFsSXNQcmltaXRpdmVWYWx1ZSA9IHZhbElzU3RyaW5nIHx8IHZhbElzTnVtYmVyIHx8IF9pc0FycmF5KHZhbCk7IC8vIHVuaGFuZGxlZCB0eXBlIHJldHVybiBudWxsXG5cbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG5cbiAgaWYgKCF2YWxJc0Z1bmN0aW9uICYmICF2YWxJc1JlYWN0RWxlbWVudCAmJiAhdmFsSXNQcm9wc09iamVjdCAmJiAhdmFsSXNQcmltaXRpdmVWYWx1ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnU2hvcnRoYW5kIHZhbHVlIG11c3QgYmUgYSBzdHJpbmd8bnVtYmVyfGFycmF5fG9iamVjdHxSZWFjdEVsZW1lbnR8ZnVuY3Rpb24uJywgJyBVc2UgbnVsbHx1bmRlZmluZWR8Ym9vbGVhbiBmb3Igbm9uZScsIFwiIFJlY2VpdmVkIFwiICsgdHlwZW9mIHZhbCArIFwiLlwiXS5qb2luKCcnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQnVpbGQgdXAgcHJvcHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJGRlZmF1bHRQcm9wcyA9IF9vcHRpb25zLmRlZmF1bHRQcm9wcyxcbiAgICAgIGRlZmF1bHRQcm9wcyA9IF9vcHRpb25zJGRlZmF1bHRQcm9wcyA9PT0gdm9pZCAwID8ge30gOiBfb3B0aW9ucyRkZWZhdWx0UHJvcHM7IC8vIFVzZXIncyBwcm9wc1xuXG4gIHZhciB1c2Vyc1Byb3BzID0gdmFsSXNSZWFjdEVsZW1lbnQgJiYgdmFsLnByb3BzIHx8IHZhbElzUHJvcHNPYmplY3QgJiYgdmFsIHx8IHZhbElzUHJpbWl0aXZlVmFsdWUgJiYgbWFwVmFsdWVUb1Byb3BzKHZhbCk7IC8vIE92ZXJyaWRlIHByb3BzXG5cbiAgdmFyIF9vcHRpb25zMiA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9uczIkb3ZlcnJpZGVQcm8gPSBfb3B0aW9uczIub3ZlcnJpZGVQcm9wcyxcbiAgICAgIG92ZXJyaWRlUHJvcHMgPSBfb3B0aW9uczIkb3ZlcnJpZGVQcm8gPT09IHZvaWQgMCA/IHt9IDogX29wdGlvbnMyJG92ZXJyaWRlUHJvO1xuICBvdmVycmlkZVByb3BzID0gX2lzRnVuY3Rpb24ob3ZlcnJpZGVQcm9wcykgPyBvdmVycmlkZVByb3BzKF9leHRlbmRzKHt9LCBkZWZhdWx0UHJvcHMsIHVzZXJzUHJvcHMpKSA6IG92ZXJyaWRlUHJvcHM7IC8vIE1lcmdlIHByb3BzXG5cbiAgLyogZXNsaW50LWRpc2FibGUgcmVhY3QvcHJvcC10eXBlcyAqL1xuXG4gIHZhciBwcm9wcyA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UHJvcHMsIHVzZXJzUHJvcHMsIG92ZXJyaWRlUHJvcHMpOyAvLyBNZXJnZSBjbGFzc05hbWVcblxuXG4gIGlmIChkZWZhdWx0UHJvcHMuY2xhc3NOYW1lIHx8IG92ZXJyaWRlUHJvcHMuY2xhc3NOYW1lIHx8IHVzZXJzUHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgdmFyIG1lcmdlZENsYXNzZXNOYW1lcyA9IGN4KGRlZmF1bHRQcm9wcy5jbGFzc05hbWUsIG92ZXJyaWRlUHJvcHMuY2xhc3NOYW1lLCB1c2Vyc1Byb3BzLmNsYXNzTmFtZSk7XG4gICAgcHJvcHMuY2xhc3NOYW1lID0gX3VuaXEobWVyZ2VkQ2xhc3Nlc05hbWVzLnNwbGl0KCcgJykpLmpvaW4oJyAnKTtcbiAgfSAvLyBNZXJnZSBzdHlsZVxuXG5cbiAgaWYgKGRlZmF1bHRQcm9wcy5zdHlsZSB8fCBvdmVycmlkZVByb3BzLnN0eWxlIHx8IHVzZXJzUHJvcHMuc3R5bGUpIHtcbiAgICBwcm9wcy5zdHlsZSA9IF9leHRlbmRzKHt9LCBkZWZhdWx0UHJvcHMuc3R5bGUsIHVzZXJzUHJvcHMuc3R5bGUsIG92ZXJyaWRlUHJvcHMuc3R5bGUpO1xuICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gR2V0IGtleVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFVzZSBrZXksIGNoaWxkS2V5LCBvciBnZW5lcmF0ZSBrZXlcblxuXG4gIGlmIChfaXNOaWwocHJvcHMua2V5KSkge1xuICAgIHZhciBjaGlsZEtleSA9IHByb3BzLmNoaWxkS2V5O1xuICAgIHZhciBfb3B0aW9uczMgPSBvcHRpb25zLFxuICAgICAgICBfb3B0aW9uczMkYXV0b0dlbmVyYXQgPSBfb3B0aW9uczMuYXV0b0dlbmVyYXRlS2V5LFxuICAgICAgICBhdXRvR2VuZXJhdGVLZXkgPSBfb3B0aW9uczMkYXV0b0dlbmVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9uczMkYXV0b0dlbmVyYXQ7XG5cbiAgICBpZiAoIV9pc05pbChjaGlsZEtleSkpIHtcbiAgICAgIC8vIGFwcGx5IGFuZCBjb25zdW1lIHRoZSBjaGlsZEtleVxuICAgICAgcHJvcHMua2V5ID0gdHlwZW9mIGNoaWxkS2V5ID09PSAnZnVuY3Rpb24nID8gY2hpbGRLZXkocHJvcHMpIDogY2hpbGRLZXk7XG4gICAgICBkZWxldGUgcHJvcHMuY2hpbGRLZXk7XG4gICAgfSBlbHNlIGlmIChhdXRvR2VuZXJhdGVLZXkgJiYgKHZhbElzU3RyaW5nIHx8IHZhbElzTnVtYmVyKSkge1xuICAgICAgLy8gdXNlIHN0cmluZy9udW1iZXIgc2hvcnRoYW5kIHZhbHVlcyBhcyB0aGUga2V5XG4gICAgICBwcm9wcy5rZXkgPSB2YWw7XG4gICAgfVxuICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gQ3JlYXRlIEVsZW1lbnRcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDbG9uZSBSZWFjdEVsZW1lbnRzXG5cblxuICBpZiAodmFsSXNSZWFjdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNsb25lRWxlbWVudCh2YWwsIHByb3BzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gcHJvcHMuY2hpbGRyZW4oQ29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgcHJvcHMsIHtcbiAgICAgIGNoaWxkcmVuOiB1bmRlZmluZWRcbiAgICB9KSk7XG4gIH0gLy8gQ3JlYXRlIFJlYWN0RWxlbWVudHMgZnJvbSBidWlsdCB1cCBwcm9wc1xuXG5cbiAgaWYgKHZhbElzUHJpbWl0aXZlVmFsdWUgfHwgdmFsSXNQcm9wc09iamVjdCkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHByb3BzKTtcbiAgfSAvLyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGFyZ3Mgc2ltaWxhciB0byBjcmVhdGVFbGVtZW50KClcbiAgLy8gVE9ETzogVjMgcmVtb3ZlIHRoZSBpbXBsZW1lbnRhdGlvblxuXG5cbiAgaWYgKHZhbElzRnVuY3Rpb24pIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFERVBSRUNBVEVEX0NBTExTW0NvbXBvbmVudF0pIHtcbiAgICAgICAgREVQUkVDQVRFRF9DQUxMU1tDb21wb25lbnRdID0gdHJ1ZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgICBjb25zb2xlLndhcm4oXCJXYXJuaW5nOiBUaGVyZSBpcyBhIGRlcHJlY2F0ZWQgc2hvcnRoYW5kIGZ1bmN0aW9uIHVzYWdlIGZvciBcXFwiXCIgKyBDb21wb25lbnQgKyBcIlxcXCIuIEl0IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2MyByZWxlYXNlLiBQbGVhc2UgZm9sbG93IG91ciB1cGdyYWRlIGd1aWRlOiBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJLVJlYWN0L3B1bGwvNDAyOVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsKENvbXBvbmVudCwgcHJvcHMsIHByb3BzLmNoaWxkcmVuKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cblxufSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZhY3RvcnkgQ3JlYXRvcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBgY3JlYXRlU2hvcnRoYW5kYCBmdW5jdGlvbiB0aGF0IGlzIHdhaXRpbmcgZm9yIGEgdmFsdWUgYW5kIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxzdHJpbmd9IENvbXBvbmVudCBBIFJlYWN0Q2xhc3Mgb3Igc3RyaW5nXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBtYXBWYWx1ZVRvUHJvcHMgQSBmdW5jdGlvbiB0aGF0IG1hcHMgYSBwcmltaXRpdmUgdmFsdWUgdG8gdGhlIENvbXBvbmVudCBwcm9wc1xuICogQHJldHVybnMge2Z1bmN0aW9ufSBBIHNob3J0aGFuZCBmYWN0b3J5IGZ1bmN0aW9uIHdhaXRpbmcgZm9yIGB2YWxgIGFuZCBgZGVmYXVsdFByb3BzYC5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShDb21wb25lbnQsIG1hcFZhbHVlVG9Qcm9wcykge1xuICBpZiAodHlwZW9mIENvbXBvbmVudCAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgQ29tcG9uZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSgpIENvbXBvbmVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY3JlYXRlU2hvcnRoYW5kKENvbXBvbmVudCwgbWFwVmFsdWVUb1Byb3BzLCB2YWwsIG9wdGlvbnMpO1xuICB9O1xufSAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEhUTUwgRmFjdG9yaWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHZhciBjcmVhdGVIVE1MRGl2aXNpb24gPSAvKiAjX19QVVJFX18gKi9jcmVhdGVTaG9ydGhhbmRGYWN0b3J5KCdkaXYnLCBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB7XG4gICAgY2hpbGRyZW46IHZhbFxuICB9O1xufSk7XG5leHBvcnQgdmFyIGNyZWF0ZUhUTUxJZnJhbWUgPSAvKiAjX19QVVJFX18gKi9jcmVhdGVTaG9ydGhhbmRGYWN0b3J5KCdpZnJhbWUnLCBmdW5jdGlvbiAoc3JjKSB7XG4gIHJldHVybiB7XG4gICAgc3JjOiBzcmNcbiAgfTtcbn0pO1xuZXhwb3J0IHZhciBjcmVhdGVIVE1MSW1hZ2UgPSAvKiAjX19QVVJFX18gKi9jcmVhdGVTaG9ydGhhbmRGYWN0b3J5KCdpbWcnLCBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB7XG4gICAgc3JjOiB2YWxcbiAgfTtcbn0pO1xuZXhwb3J0IHZhciBjcmVhdGVIVE1MSW5wdXQgPSAvKiAjX19QVVJFX18gKi9jcmVhdGVTaG9ydGhhbmRGYWN0b3J5KCdpbnB1dCcsIGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiB2YWxcbiAgfTtcbn0pO1xuZXhwb3J0IHZhciBjcmVhdGVIVE1MTGFiZWwgPSAvKiAjX19QVVJFX18gKi9jcmVhdGVTaG9ydGhhbmRGYWN0b3J5KCdsYWJlbCcsIGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHtcbiAgICBjaGlsZHJlbjogdmFsXG4gIH07XG59KTtcbmV4cG9ydCB2YXIgY3JlYXRlSFRNTFBhcmFncmFwaCA9IC8qICNfX1BVUkVfXyAqL2NyZWF0ZVNob3J0aGFuZEZhY3RvcnkoJ3AnLCBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB7XG4gICAgY2hpbGRyZW46IHZhbFxuICB9O1xufSk7IiwiLyoqXG4gKiBSZXR1cm5zIGEgY3JlYXRlRWxlbWVudCgpIHR5cGUgYmFzZWQgb24gdGhlIHByb3BzIG9mIHRoZSBDb21wb25lbnQuXG4gKiBVc2VmdWwgZm9yIGNhbGN1bGF0aW5nIHdoYXQgdHlwZSBhIGNvbXBvbmVudCBzaG91bGQgcmVuZGVyIGFzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENvbXBvbmVudCBBIGZ1bmN0aW9uIG9yIFJlYWN0Q2xhc3MuXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgQSBSZWFjdEVsZW1lbnQgcHJvcHMgb2JqZWN0XG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBbZ2V0RGVmYXVsdF0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBkZWZhdWx0IGVsZW1lbnQgdHlwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd8ZnVuY3Rpb259IEEgUmVhY3RFbGVtZW50IHR5cGVcbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudFR5cGUoQ29tcG9uZW50LCBwcm9wcywgZ2V0RGVmYXVsdCkge1xuICB2YXIgX0NvbXBvbmVudCRkZWZhdWx0UHJvID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcyxcbiAgICAgIGRlZmF1bHRQcm9wcyA9IF9Db21wb25lbnQkZGVmYXVsdFBybyA9PT0gdm9pZCAwID8ge30gOiBfQ29tcG9uZW50JGRlZmF1bHRQcm87IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gdXNlciBkZWZpbmVkIFwiYXNcIiBlbGVtZW50IHR5cGVcblxuICBpZiAocHJvcHMuYXMgJiYgcHJvcHMuYXMgIT09IGRlZmF1bHRQcm9wcy5hcykgcmV0dXJuIHByb3BzLmFzOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIGNvbXB1dGVkIGRlZmF1bHQgZWxlbWVudCB0eXBlXG5cbiAgaWYgKGdldERlZmF1bHQpIHtcbiAgICB2YXIgY29tcHV0ZWREZWZhdWx0ID0gZ2V0RGVmYXVsdCgpO1xuICAgIGlmIChjb21wdXRlZERlZmF1bHQpIHJldHVybiBjb21wdXRlZERlZmF1bHQ7XG4gIH0gLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBpbmZlciBhbmNob3IgbGlua3NcblxuXG4gIGlmIChwcm9wcy5ocmVmKSByZXR1cm4gJ2EnOyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHVzZSBkZWZhdWx0UHJvcCBvciAnZGl2J1xuXG4gIHJldHVybiBkZWZhdWx0UHJvcHMuYXMgfHwgJ2Rpdic7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGdldEVsZW1lbnRUeXBlOyIsIi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgY29uc2lzdGluZyBvZiBwcm9wcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoZSBDb21wb25lbnQuXG4gKiBVc2VmdWwgZm9yIGdldHRpbmcgYW5kIHNwcmVhZGluZyB1bmtub3duIHByb3BzIGZyb20gdGhlIHVzZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDb21wb25lbnQgQSBmdW5jdGlvbiBvciBSZWFjdENsYXNzLlxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIEEgUmVhY3RFbGVtZW50IHByb3BzIG9iamVjdFxuICogQHJldHVybnMge3t9fSBBIHNoYWxsb3cgY29weSBvZiB0aGUgcHJvcCBvYmplY3RcbiAqL1xudmFyIGdldFVuaGFuZGxlZFByb3BzID0gZnVuY3Rpb24gZ2V0VW5oYW5kbGVkUHJvcHMoQ29tcG9uZW50LCBwcm9wcykge1xuICAvLyBOb3RlIHRoYXQgYGhhbmRsZWRQcm9wc2AgYXJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGR1cmluZyBidWlsZCB3aXRoIGBiYWJlbC1wbHVnaW4tdHJhbnNmb3JtLXJlYWN0LWhhbmRsZWQtcHJvcHNgXG4gIHZhciBfQ29tcG9uZW50JGhhbmRsZWRQcm8gPSBDb21wb25lbnQuaGFuZGxlZFByb3BzLFxuICAgICAgaGFuZGxlZFByb3BzID0gX0NvbXBvbmVudCRoYW5kbGVkUHJvID09PSB2b2lkIDAgPyBbXSA6IF9Db21wb25lbnQkaGFuZGxlZFBybztcbiAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BzKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcHJvcCkge1xuICAgIGlmIChwcm9wID09PSAnY2hpbGRLZXknKSByZXR1cm4gYWNjO1xuICAgIGlmIChoYW5kbGVkUHJvcHMuaW5kZXhPZihwcm9wKSA9PT0gLTEpIGFjY1twcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGdldFVuaGFuZGxlZFByb3BzOyIsImltcG9ydCB7IGlzUmVmT2JqZWN0IH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0IGZyb20gJy4vdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCc7XG52YXIgQ0xBU1NfTkFNRV9ERUxJVElNSVRFUiA9IC9cXHMrLztcbi8qKlxuICogQWNjZXB0cyBhIHNldCBvZiByZWYgb2JqZWN0cyB0aGF0IGNvbnRhaW4gY2xhc3NuYW1lcyBhcyBhIHN0cmluZyBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB1bmlxdWVcbiAqIGNsYXNzTmFtZXMuXG4gKlxuICogQHBhcmFtIHtTZXQ8UmVhY3QuUmVmT2JqZWN0Pnx1bmRlZmluZWR9IGNsYXNzTmFtZVJlZnNcbiAqIEByZXR1cm5zIFN0cmluZ1tdXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDbGFzc05hbWVzKGNsYXNzTmFtZVJlZnMpIHtcbiAgdmFyIGNsYXNzTmFtZXMgPSBbXTtcblxuICBpZiAoY2xhc3NOYW1lUmVmcykge1xuICAgIGNsYXNzTmFtZVJlZnMuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lUmVmKSB7XG4gICAgICBpZiAodHlwZW9mIGNsYXNzTmFtZVJlZi5jdXJyZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgY2xhc3NOYW1lc0ZvclJlZiA9IGNsYXNzTmFtZVJlZi5jdXJyZW50LnNwbGl0KENMQVNTX05BTUVfREVMSVRJTUlURVIpO1xuICAgICAgICBjbGFzc05hbWVzRm9yUmVmLmZvckVhY2goZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgICAgICAgIGNsYXNzTmFtZXMucHVzaChjbGFzc05hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2xhc3NOYW1lcy5maWx0ZXIoZnVuY3Rpb24gKGNsYXNzTmFtZSwgaSwgYXJyYXkpIHtcbiAgICAgIHJldHVybiBjbGFzc05hbWUubGVuZ3RoID4gMCAmJiBhcnJheS5pbmRleE9mKGNsYXNzTmFtZSkgPT09IGk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gW107XG59XG4vKipcbiAqIENvbXB1dGVzIGNsYXNzbmFtZXMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBhbmQgYWRkZWQgdG8gYSBub2RlIGJhc2VkIG9uIGlucHV0IGRpZmZlcmVuY2VzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nW119IHByZXZDbGFzc05hbWVzXG4gKiBAcGFyYW0ge1N0cmluZ1tdfSBjdXJyZW50Q2xhc3NOYW1lc1xuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2xhc3NOYW1lc0RpZmZlcmVuY2UocHJldkNsYXNzTmFtZXMsIGN1cnJlbnRDbGFzc05hbWVzKSB7XG4gIHJldHVybiBbY3VycmVudENsYXNzTmFtZXMuZmlsdGVyKGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gcHJldkNsYXNzTmFtZXMuaW5kZXhPZihjbGFzc05hbWUpID09PSAtMTtcbiAgfSksIHByZXZDbGFzc05hbWVzLmZpbHRlcihmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRDbGFzc05hbWVzLmluZGV4T2YoY2xhc3NOYW1lKSA9PT0gLTE7XG4gIH0pXTtcbn1cbnZhciBwcmV2Q2xhc3NOYW1lcyA9IG5ldyBNYXAoKTtcbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtTZXQ8UmVhY3QuUmVmT2JqZWN0Pnx1bmRlZmluZWR9IGNsYXNzTmFtZVJlZnNcbiAqL1xuXG5leHBvcnQgdmFyIGhhbmRsZUNsYXNzTmFtZXNDaGFuZ2UgPSBmdW5jdGlvbiBoYW5kbGVDbGFzc05hbWVzQ2hhbmdlKG5vZGUsIGNsYXNzTmFtZVJlZnMpIHtcbiAgdmFyIGN1cnJlbnRDbGFzc05hbWVzID0gY29tcHV0ZUNsYXNzTmFtZXMoY2xhc3NOYW1lUmVmcyk7XG5cbiAgdmFyIF9jb21wdXRlQ2xhc3NOYW1lc0RpZiA9IGNvbXB1dGVDbGFzc05hbWVzRGlmZmVyZW5jZShwcmV2Q2xhc3NOYW1lcy5nZXQobm9kZSkgfHwgW10sIGN1cnJlbnRDbGFzc05hbWVzKSxcbiAgICAgIGZvckFkZCA9IF9jb21wdXRlQ2xhc3NOYW1lc0RpZlswXSxcbiAgICAgIGZvclJlbW92YWwgPSBfY29tcHV0ZUNsYXNzTmFtZXNEaWZbMV07XG5cbiAgaWYgKG5vZGUpIHtcbiAgICBmb3JBZGQuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gICAgfSk7XG4gICAgZm9yUmVtb3ZhbC5mb3JFYWNoKGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByZXZDbGFzc05hbWVzLnNldChub2RlLCBjdXJyZW50Q2xhc3NOYW1lcyk7XG59O1xuZXhwb3J0IHZhciBOb2RlUmVnaXN0cnkgPSBmdW5jdGlvbiBOb2RlUmVnaXN0cnkoKSB7XG4gIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgdGhpcy5hZGQgPSBmdW5jdGlvbiAobm9kZSwgY2xhc3NOYW1lUmVmKSB7XG4gICAgaWYgKF90aGlzLm5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgdmFyIF9zZXQgPSBfdGhpcy5ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICAgIF9zZXQuYWRkKGNsYXNzTmFtZVJlZik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IC8vIElFMTEgZG9lcyBub3Qgc3VwcG9ydCBjb25zdHJ1Y3RvciBwYXJhbXNcblxuXG4gICAgdmFyIHNldCA9IG5ldyBTZXQoKTtcbiAgICBzZXQuYWRkKGNsYXNzTmFtZVJlZik7XG5cbiAgICBfdGhpcy5ub2Rlcy5zZXQobm9kZSwgc2V0KTtcbiAgfTtcblxuICB0aGlzLmRlbCA9IGZ1bmN0aW9uIChub2RlLCBjbGFzc05hbWVSZWYpIHtcbiAgICBpZiAoIV90aGlzLm5vZGVzLmhhcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzZXQgPSBfdGhpcy5ub2Rlcy5nZXQobm9kZSk7XG5cbiAgICBpZiAoc2V0LnNpemUgPT09IDEpIHtcbiAgICAgIF90aGlzLm5vZGVzLmRlbGV0ZShub2RlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldC5kZWxldGUoY2xhc3NOYW1lUmVmKTtcbiAgfTtcblxuICB0aGlzLmVtaXQgPSBmdW5jdGlvbiAobm9kZSwgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayhub2RlLCBfdGhpcy5ub2Rlcy5nZXQobm9kZSkpO1xuICB9O1xuXG4gIHRoaXMubm9kZXMgPSBuZXcgTWFwKCk7XG59O1xudmFyIG5vZGVSZWdpc3RyeSA9IG5ldyBOb2RlUmVnaXN0cnkoKTtcbi8qKlxuICogQSBSZWFjdCBob29rcyB0aGF0IGFsbG93cyB0byBtYW5hZ2UgY2xhc3NOYW1lcyBvbiBhIERPTSBub2RlIGluIGRlY2xhcmF0aXZlIG1hbm5lci4gQWNjZXB0c1xuICogYSBIVE1MIGVsZW1lbnQgb3IgUmVhY3QgcmVmIG9iamVjdHMgd2l0aCBpdC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fFJlYWN0LlJlZk9iamVjdH0gbm9kZVxuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzTmFtZVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNsYXNzTmFtZXNPbk5vZGUobm9kZSwgY2xhc3NOYW1lKSB7XG4gIHZhciBjbGFzc05hbWVSZWYgPSBSZWFjdC51c2VSZWYoKTtcbiAgdmFyIGlzTW91bnRlZCA9IFJlYWN0LnVzZVJlZihmYWxzZSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGNsYXNzTmFtZVJlZi5jdXJyZW50ID0gY2xhc3NOYW1lO1xuXG4gICAgaWYgKGlzTW91bnRlZC5jdXJyZW50KSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGlzUmVmT2JqZWN0KG5vZGUpID8gbm9kZS5jdXJyZW50IDogbm9kZTtcbiAgICAgIG5vZGVSZWdpc3RyeS5lbWl0KGVsZW1lbnQsIGhhbmRsZUNsYXNzTmFtZXNDaGFuZ2UpO1xuICAgIH1cblxuICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgfSwgW2NsYXNzTmFtZV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlbWVudCA9IGlzUmVmT2JqZWN0KG5vZGUpID8gbm9kZS5jdXJyZW50IDogbm9kZTtcbiAgICBub2RlUmVnaXN0cnkuYWRkKGVsZW1lbnQsIGNsYXNzTmFtZVJlZik7XG4gICAgbm9kZVJlZ2lzdHJ5LmVtaXQoZWxlbWVudCwgaGFuZGxlQ2xhc3NOYW1lc0NoYW5nZSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vZGVSZWdpc3RyeS5kZWwoZWxlbWVudCwgY2xhc3NOYW1lUmVmKTtcbiAgICAgIG5vZGVSZWdpc3RyeS5lbWl0KGVsZW1lbnQsIGhhbmRsZUNsYXNzTmFtZXNDaGFuZ2UpO1xuICAgIH07XG4gIH0sIFtub2RlXSk7XG59IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBpc0Jyb3dzZXIgZnJvbSAnLi4vaXNCcm93c2VyJzsgLy8gdXNlTGF5b3V0RWZmZWN0KCkgcHJvZHVjZXMgYSB3YXJuaW5nIHdpdGggU1NSIHJlbmRlcmluZ1xuLy8gaHR0cHM6Ly9tZWRpdW0uY29tL0BhbGV4YW5kZXJlYXJkb24vdXNlbGF5b3V0ZWZmZWN0LWFuZC1zc3ItMTkyOTg2Y2RjZjdhXG5cbnZhciB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gaXNCcm93c2VyKCkgJiYgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyA/IFJlYWN0LnVzZUxheW91dEVmZmVjdCA6IFJlYWN0LnVzZUVmZmVjdDtcbmV4cG9ydCBkZWZhdWx0IHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3Q7IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwibG9kYXNoLWVzL2luY2x1ZGVzXCI7XG5pbXBvcnQgX2ZvckVhY2ggZnJvbSBcImxvZGFzaC1lcy9mb3JFYWNoXCI7XG5leHBvcnQgdmFyIGh0bWxJbnB1dEF0dHJzID0gWy8vIFJFQUNUXG4nc2VsZWN0ZWQnLCAnZGVmYXVsdFZhbHVlJywgJ2RlZmF1bHRDaGVja2VkJywgLy8gTElNSVRFRCBIVE1MIFBST1BTXG4nYWNjZXB0JywgJ2F1dG9DYXBpdGFsaXplJywgJ2F1dG9Db21wbGV0ZScsICdhdXRvQ29ycmVjdCcsICdhdXRvRm9jdXMnLCAnY2hlY2tlZCcsICdkaXNhYmxlZCcsICdmb3JtJywgJ2lkJywgJ2lucHV0TW9kZScsICdsYW5nJywgJ2xpc3QnLCAnbWF4JywgJ21heExlbmd0aCcsICdtaW4nLCAnbWluTGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyZWFkT25seScsICdyZXF1aXJlZCcsICdzdGVwJywgJ3RpdGxlJywgJ3R5cGUnLCAndmFsdWUnXTtcbmV4cG9ydCB2YXIgaHRtbElucHV0RXZlbnRzID0gWy8vIEVWRU5UU1xuLy8ga2V5Ym9hcmRcbidvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJywgLy8gZm9jdXNcbidvbkZvY3VzJywgJ29uQmx1cicsIC8vIGZvcm1cbidvbkNoYW5nZScsICdvbklucHV0JywgLy8gbW91c2VcbidvbkNsaWNrJywgJ29uQ29udGV4dE1lbnUnLCAnb25EcmFnJywgJ29uRHJhZ0VuZCcsICdvbkRyYWdFbnRlcicsICdvbkRyYWdFeGl0JywgJ29uRHJhZ0xlYXZlJywgJ29uRHJhZ092ZXInLCAnb25EcmFnU3RhcnQnLCAnb25Ecm9wJywgJ29uTW91c2VEb3duJywgJ29uTW91c2VFbnRlcicsICdvbk1vdXNlTGVhdmUnLCAnb25Nb3VzZU1vdmUnLCAnb25Nb3VzZU91dCcsICdvbk1vdXNlT3ZlcicsICdvbk1vdXNlVXAnLCAvLyBzZWxlY3Rpb25cbidvblNlbGVjdCcsIC8vIHRvdWNoXG4nb25Ub3VjaENhbmNlbCcsICdvblRvdWNoRW5kJywgJ29uVG91Y2hNb3ZlJywgJ29uVG91Y2hTdGFydCddO1xuZXhwb3J0IHZhciBodG1sSW5wdXRQcm9wcyA9IFtdLmNvbmNhdChodG1sSW5wdXRBdHRycywgaHRtbElucHV0RXZlbnRzKTtcbmV4cG9ydCB2YXIgaHRtbEltYWdlUHJvcHMgPSBbJ2FsdCcsICdoZWlnaHQnLCAnc3JjJywgJ3NyY1NldCcsICd3aWR0aCcsICdsb2FkaW5nJ107XG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb25zaXN0aW5nIG9mOiBwcm9wcyBvZiBodG1sIGlucHV0IGVsZW1lbnQgYW5kIHJlc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgQSBSZWFjdEVsZW1lbnQgcHJvcHMgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5odG1sUHJvcHNdIEFuIGFycmF5IG9mIGh0bWwgaW5wdXQgcHJvcHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuaW5jbHVkZUFyaWFdIEluY2x1ZGVzIGFsbCBpbnB1dCBwcm9wcyB0aGF0IHN0YXJ0cyB3aXRoIFwiYXJpYS1cIlxuICogQHJldHVybnMge1t7fSwge31dfSBBbiBhcnJheSBvZiBvYmplY3RzXG4gKi9cblxuZXhwb3J0IHZhciBwYXJ0aXRpb25IVE1MUHJvcHMgPSBmdW5jdGlvbiBwYXJ0aXRpb25IVE1MUHJvcHMocHJvcHMsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRodG1sUHJvcHMgPSBfb3B0aW9ucy5odG1sUHJvcHMsXG4gICAgICBodG1sUHJvcHMgPSBfb3B0aW9ucyRodG1sUHJvcHMgPT09IHZvaWQgMCA/IGh0bWxJbnB1dFByb3BzIDogX29wdGlvbnMkaHRtbFByb3BzLFxuICAgICAgX29wdGlvbnMkaW5jbHVkZUFyaWEgPSBfb3B0aW9ucy5pbmNsdWRlQXJpYSxcbiAgICAgIGluY2x1ZGVBcmlhID0gX29wdGlvbnMkaW5jbHVkZUFyaWEgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRpbmNsdWRlQXJpYTtcbiAgdmFyIGlucHV0UHJvcHMgPSB7fTtcbiAgdmFyIHJlc3QgPSB7fTtcblxuICBfZm9yRWFjaChwcm9wcywgZnVuY3Rpb24gKHZhbCwgcHJvcCkge1xuICAgIHZhciBwb3NzaWJsZUFyaWEgPSBpbmNsdWRlQXJpYSAmJiAoL15hcmlhLS4qJC8udGVzdChwcm9wKSB8fCBwcm9wID09PSAncm9sZScpO1xuICAgIHZhciB0YXJnZXQgPSBfaW5jbHVkZXMoaHRtbFByb3BzLCBwcm9wKSB8fCBwb3NzaWJsZUFyaWEgPyBpbnB1dFByb3BzIDogcmVzdDtcbiAgICB0YXJnZXRbcHJvcF0gPSB2YWw7XG4gIH0pO1xuXG4gIHJldHVybiBbaW5wdXRQcm9wcywgcmVzdF07XG59OyIsImltcG9ydCBfTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgZnJvbSAnLi9Nb2Rlcm5BdXRvQ29udHJvbGxlZENvbXBvbmVudCc7XG5leHBvcnQgeyBfTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgfTtcbmltcG9ydCAqIGFzIF9jaGlsZHJlblV0aWxzIGZyb20gJy4vY2hpbGRyZW5VdGlscyc7XG5leHBvcnQgeyBfY2hpbGRyZW5VdGlscyBhcyBjaGlsZHJlblV0aWxzIH07XG5leHBvcnQgeyB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5LCB1c2VWYWx1ZUFuZEtleSwgdXNlTXVsdGlwbGVQcm9wLCB1c2VUZXh0QWxpZ25Qcm9wLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCwgdXNlV2lkdGhQcm9wIH0gZnJvbSAnLi9jbGFzc05hbWVCdWlsZGVycyc7XG5pbXBvcnQgKiBhcyBfY3VzdG9tUHJvcFR5cGVzIGZyb20gJy4vY3VzdG9tUHJvcFR5cGVzJztcbmV4cG9ydCB7IF9jdXN0b21Qcm9wVHlwZXMgYXMgY3VzdG9tUHJvcFR5cGVzIH07XG5pbXBvcnQgX2V2ZW50U3RhY2sgZnJvbSAnLi9ldmVudFN0YWNrJztcbmV4cG9ydCB7IF9ldmVudFN0YWNrIGFzIGV2ZW50U3RhY2sgfTtcbmV4cG9ydCAqIGZyb20gJy4vZmFjdG9yaWVzJztcbmltcG9ydCBfZ2V0VW5oYW5kbGVkUHJvcHMgZnJvbSAnLi9nZXRVbmhhbmRsZWRQcm9wcyc7XG5leHBvcnQgeyBfZ2V0VW5oYW5kbGVkUHJvcHMgYXMgZ2V0VW5oYW5kbGVkUHJvcHMgfTtcbmltcG9ydCBfZ2V0RWxlbWVudFR5cGUgZnJvbSAnLi9nZXRFbGVtZW50VHlwZSc7XG5leHBvcnQgeyBfZ2V0RWxlbWVudFR5cGUgYXMgZ2V0RWxlbWVudFR5cGUgfTtcbmV4cG9ydCB7IGh0bWxJbnB1dEF0dHJzLCBodG1sSW5wdXRFdmVudHMsIGh0bWxJbnB1dFByb3BzLCBodG1sSW1hZ2VQcm9wcywgcGFydGl0aW9uSFRNTFByb3BzIH0gZnJvbSAnLi9odG1sUHJvcHNVdGlscyc7XG5pbXBvcnQgX2lzQnJvd3NlciBmcm9tICcuL2lzQnJvd3Nlcic7XG5leHBvcnQgeyBfaXNCcm93c2VyIGFzIGlzQnJvd3NlciB9O1xuaW1wb3J0IF9kb2VzTm9kZUNvbnRhaW5DbGljayBmcm9tICcuL2RvZXNOb2RlQ29udGFpbkNsaWNrJztcbmV4cG9ydCB7IF9kb2VzTm9kZUNvbnRhaW5DbGljayBhcyBkb2VzTm9kZUNvbnRhaW5DbGljayB9O1xuaW1wb3J0IF9sZXZlbiBmcm9tICcuL2xldmVuJztcbmV4cG9ydCB7IF9sZXZlbiBhcyBsZXZlbiB9O1xuaW1wb3J0IF9jcmVhdGVQYWdpbmF0aW9uSXRlbXMgZnJvbSAnLi9jcmVhdGVQYWdpbmF0aW9uSXRlbXMnO1xuZXhwb3J0IHsgX2NyZWF0ZVBhZ2luYXRpb25JdGVtcyBhcyBjcmVhdGVQYWdpbmF0aW9uSXRlbXMgfTtcbmltcG9ydCAqIGFzIF9TVUkgZnJvbSAnLi9TVUknO1xuZXhwb3J0IHsgX1NVSSBhcyBTVUkgfTtcbmV4cG9ydCB7IG51bWJlclRvV29yZE1hcCwgbnVtYmVyVG9Xb3JkIH0gZnJvbSAnLi9udW1iZXJUb1dvcmQnO1xuaW1wb3J0IF9ub3JtYWxpemVPZmZzZXQgZnJvbSAnLi9ub3JtYWxpemVPZmZzZXQnO1xuZXhwb3J0IHsgX25vcm1hbGl6ZU9mZnNldCBhcyBub3JtYWxpemVPZmZzZXQgfTtcbmltcG9ydCBfbm9ybWFsaXplVHJhbnNpdGlvbkR1cmF0aW9uIGZyb20gJy4vbm9ybWFsaXplVHJhbnNpdGlvbkR1cmF0aW9uJztcbmV4cG9ydCB7IF9ub3JtYWxpemVUcmFuc2l0aW9uRHVyYXRpb24gYXMgbm9ybWFsaXplVHJhbnNpdGlvbkR1cmF0aW9uIH07XG5pbXBvcnQgX29iamVjdERpZmYgZnJvbSAnLi9vYmplY3REaWZmJztcbmV4cG9ydCB7IF9vYmplY3REaWZmIGFzIG9iamVjdERpZmYgfTsgLy8gSGVhZHMgdXAhIFdlIGltcG9ydC9leHBvcnQgZm9yIHRoaXMgbW9kdWxlIHRvIHNhZmVseSByZW1vdmUgaXQgd2l0aCBcImJhYmVsLXBsdWdpbi1maWx0ZXItaW1wb3J0c1wiXG5cbi8vXG4vLyBIb29rc1xuLy9cbmltcG9ydCBfdXNlQ2xhc3NOYW1lc09uTm9kZSBmcm9tICcuL2hvb2tzL3VzZUNsYXNzTmFtZXNPbk5vZGUnO1xuZXhwb3J0IHsgX3VzZUNsYXNzTmFtZXNPbk5vZGUgYXMgdXNlQ2xhc3NOYW1lc09uTm9kZSB9OyIsImltcG9ydCBfaXNOaWwgZnJvbSBcImxvZGFzaC1lcy9pc05pbFwiO1xudmFyIGhhc0RvY3VtZW50ID0gdHlwZW9mIGRvY3VtZW50ID09PSAnb2JqZWN0JyAmJiBkb2N1bWVudCAhPT0gbnVsbDtcbnZhciBoYXNXaW5kb3cgPSB0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JyAmJiB3aW5kb3cgIT09IG51bGwgJiYgd2luZG93LnNlbGYgPT09IHdpbmRvdzsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbmZ1c2luZy1hcnJvd1xuXG52YXIgaXNCcm93c2VyID0gZnVuY3Rpb24gaXNCcm93c2VyKCkge1xuICByZXR1cm4gIV9pc05pbChpc0Jyb3dzZXIub3ZlcnJpZGUpID8gaXNCcm93c2VyLm92ZXJyaWRlIDogaGFzRG9jdW1lbnQgJiYgaGFzV2luZG93O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgaXNCcm93c2VyOyIsIi8vIENvcHkgb2Ygc2luZHJlJ3MgbGV2ZW4sIHdyYXBwZWQgaW4gZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGZvciBwcm9kdWN0aW9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2xldmVuL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG5cbi8qIGVzbGludC1kaXNhYmxlIGNvbXBsZXhpdHksIGltcG9ydC9uby1tdXRhYmxlLWV4cG9ydHMsIG5vLW11bHRpLWFzc2lnbiwgbm8tbmVzdGVkLXRlcm5hcnksIG5vLXBsdXNwbHVzICovXG52YXIgbGV2ZW4gPSBmdW5jdGlvbiBsZXZlbigpIHtcbiAgcmV0dXJuIDA7XG59O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgYXJyID0gW107XG4gIHZhciBjaGFyQ29kZUNhY2hlID0gW107XG5cbiAgbGV2ZW4gPSBmdW5jdGlvbiBsZXZlbihhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpIHJldHVybiAwO1xuICAgIHZhciBhTGVuID0gYS5sZW5ndGg7XG4gICAgdmFyIGJMZW4gPSBiLmxlbmd0aDtcbiAgICBpZiAoYUxlbiA9PT0gMCkgcmV0dXJuIGJMZW47XG4gICAgaWYgKGJMZW4gPT09IDApIHJldHVybiBhTGVuO1xuICAgIHZhciBiQ2hhckNvZGU7XG4gICAgdmFyIHJldDtcbiAgICB2YXIgdG1wO1xuICAgIHZhciB0bXAyO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGNoYXJDb2RlQ2FjaGVbaV0gPSBhLmNoYXJDb2RlQXQoaSk7XG4gICAgICBhcnJbaV0gPSArK2k7XG4gICAgfVxuXG4gICAgd2hpbGUgKGogPCBiTGVuKSB7XG4gICAgICBiQ2hhckNvZGUgPSBiLmNoYXJDb2RlQXQoaik7XG4gICAgICB0bXAgPSBqKys7XG4gICAgICByZXQgPSBqO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgYUxlbjsgaSsrKSB7XG4gICAgICAgIHRtcDIgPSBiQ2hhckNvZGUgPT09IGNoYXJDb2RlQ2FjaGVbaV0gPyB0bXAgOiB0bXAgKyAxO1xuICAgICAgICB0bXAgPSBhcnJbaV07XG4gICAgICAgIHJldCA9IGFycltpXSA9IHRtcCA+IHJldCA/IHRtcDIgPiByZXQgPyByZXQgKyAxIDogdG1wMiA6IHRtcDIgPiB0bXAgPyB0bXAgKyAxIDogdG1wMjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBsZXZlbjsiLCIvKipcbiAqIE5vcm1hbGl6ZXMgdGhlIG9mZnNldCB2YWx1ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfGFycmF5fSB2YWx1ZSBUaGUgdmFsdWUgdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gW3ZhbHVlLCB2YWx1ZV0gOiB2YWx1ZTtcbn0pOyIsIi8qKlxuICogTm9ybWFsaXplcyB0aGUgZHVyYXRpb24gb2YgYSB0cmFuc2l0aW9uLlxuICogQHBhcmFtIHtudW1iZXJ8b2JqZWN0fSBkdXJhdGlvbiBUaGUgdmFsdWUgdG8gbm9ybWFsaXplLlxuICogQHBhcmFtIHsnaGlkZSd8J3Nob3cnfSB0eXBlIFRoZSB0eXBlIG9mIHRyYW5zaXRpb24uXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5leHBvcnQgZGVmYXVsdCAoZnVuY3Rpb24gKGR1cmF0aW9uLCB0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgZHVyYXRpb24gPT09ICdudW1iZXInIHx8IHR5cGVvZiBkdXJhdGlvbiA9PT0gJ3N0cmluZycgPyBkdXJhdGlvbiA6IGR1cmF0aW9uW3R5cGVdO1xufSk7IiwiZXhwb3J0IHZhciBudW1iZXJUb1dvcmRNYXAgPSB7XG4gIDE6ICdvbmUnLFxuICAyOiAndHdvJyxcbiAgMzogJ3RocmVlJyxcbiAgNDogJ2ZvdXInLFxuICA1OiAnZml2ZScsXG4gIDY6ICdzaXgnLFxuICA3OiAnc2V2ZW4nLFxuICA4OiAnZWlnaHQnLFxuICA5OiAnbmluZScsXG4gIDEwOiAndGVuJyxcbiAgMTE6ICdlbGV2ZW4nLFxuICAxMjogJ3R3ZWx2ZScsXG4gIDEzOiAndGhpcnRlZW4nLFxuICAxNDogJ2ZvdXJ0ZWVuJyxcbiAgMTU6ICdmaWZ0ZWVuJyxcbiAgMTY6ICdzaXh0ZWVuJ1xufTtcbi8qKlxuICogUmV0dXJuIHRoZSBudW1iZXIgd29yZCBmb3IgbnVtYmVycyAxLTE2LlxuICogUmV0dXJucyBzdHJpbmdzIG9yIG51bWJlcnMgYXMgaXMgaWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyB3b3JkLlxuICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgaWYgdmFsdWUgaXMgbm90IGEgc3RyaW5nIG9yIG51bWJlci5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSB3b3JkLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9Xb3JkKHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gIGlmICh0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBudW1iZXJUb1dvcmRNYXBbdmFsdWVdIHx8IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufSIsImltcG9ydCBfaXNFcXVhbCBmcm9tIFwibG9kYXNoLWVzL2lzRXF1YWxcIjtcbmltcG9ydCBfaGFzIGZyb20gXCJsb2Rhc2gtZXMvaGFzXCI7XG5pbXBvcnQgX3RyYW5zZm9ybSBmcm9tIFwibG9kYXNoLWVzL3RyYW5zZm9ybVwiO1xuXG4vKipcbiAqIE5haXZlIGFuZCBpbmVmZmljaWVudCBvYmplY3QgZGlmZmVyZW5jZSwgaW50ZW5kZWQgZm9yIGRldmVsb3BtZW50IC8gZGVidWdnaW5nIHVzZSBvbmx5LlxuICogRGVsZXRlZCBrZXlzIGFyZSBzaG93biBhcyBbREVMRVRFRF0uXG4gKiBAcGFyYW0ge3t9fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3RcbiAqIEBwYXJhbSB7e319IHRhcmdldCBUaGUgdGFyZ2V0IG9iamVjdC5cbiAqIEByZXR1cm5zIHt7fX0gQSBuZXcgb2JqZWN0IGNvbnRhaW5pbmcgbmV3L21vZGlmaWVkL2RlbGV0ZWQga2V5cy5cbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBvYmplY3REaWZmIH0gZnJvbSAnc3JjL2xpYidcbiAqXG4gKiBjb25zdCBhID0geyBrZXk6ICd2YWwnLCBmb286ICdiYXInIH1cbiAqIGNvbnN0IGIgPSB7IGtleTogJ3ZhbCcsIGZvbzogJ2JheicgfVxuICpcbiAqIG9iamVjdERpZmYoYSwgYilcbiAqIC8vPT4geyBmb286ICdiYXonIH1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uIChzb3VyY2UsIHRhcmdldCkge1xuICByZXR1cm4gX3RyYW5zZm9ybShzb3VyY2UsIGZ1bmN0aW9uIChyZXMsIHZhbCwga2V5KSB7XG4gICAgLy8gZGVsZXRlZCBrZXlzXG4gICAgaWYgKCFfaGFzKHRhcmdldCwga2V5KSkgcmVzW2tleV0gPSAnW0RFTEVURURdJzsgLy8gbmV3IGtleXMgLyBjaGFuZ2VkIHZhbHVlc1xuICAgIC8vIE5vdGUsIHdlIHRvbGVyYXRlIGlzRXF1YWwgaGVyZSBhcyB0aGlzIGlzIGEgZGV2IG9ubHkgdXRpbGl0eSBhbmQgbm90IGluY2x1ZGVkIGluIHByb2R1Y3Rpb24gY29kZVxuICAgIGVsc2UgaWYgKCFfaXNFcXVhbCh2YWwsIHRhcmdldFtrZXldKSkgcmVzW2tleV0gPSB0YXJnZXRba2V5XTtcbiAgfSwge30pO1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBBY2NvcmRpb25BY2NvcmRpb24gZnJvbSAnLi9BY2NvcmRpb25BY2NvcmRpb24nO1xuaW1wb3J0IEFjY29yZGlvbkNvbnRlbnQgZnJvbSAnLi9BY2NvcmRpb25Db250ZW50JztcbmltcG9ydCBBY2NvcmRpb25QYW5lbCBmcm9tICcuL0FjY29yZGlvblBhbmVsJztcbmltcG9ydCBBY2NvcmRpb25UaXRsZSBmcm9tICcuL0FjY29yZGlvblRpdGxlJztcbi8qKlxuICogQW4gYWNjb3JkaW9uIGFsbG93cyB1c2VycyB0byB0b2dnbGUgdGhlIGRpc3BsYXkgb2Ygc2VjdGlvbnMgb2YgY29udGVudC5cbiAqL1xuXG5mdW5jdGlvbiBBY2NvcmRpb24ocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGZsdWlkID0gcHJvcHMuZmx1aWQsXG4gICAgICBpbnZlcnRlZCA9IHByb3BzLmludmVydGVkLFxuICAgICAgc3R5bGVkID0gcHJvcHMuc3R5bGVkO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHVzZUtleU9ubHkoZmx1aWQsICdmbHVpZCcpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlS2V5T25seShzdHlsZWQsICdzdHlsZWQnKSwgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhBY2NvcmRpb24sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEFjY29yZGlvbkFjY29yZGlvbiwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSkpO1xufVxuXG5BY2NvcmRpb24uaGFuZGxlZFByb3BzID0gW1wiY2xhc3NOYW1lXCIsIFwiZmx1aWRcIiwgXCJpbnZlcnRlZFwiLCBcInN0eWxlZFwiXTtcbkFjY29yZGlvbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogRm9ybWF0IHRvIHRha2UgdXAgdGhlIHdpZHRoIG9mIGl0cyBjb250YWluZXIuICovXG4gIGZsdWlkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRm9ybWF0IGZvciBkYXJrIGJhY2tncm91bmRzLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFkZHMgc29tZSBiYXNpYyBzdHlsaW5nIHRvIGFjY29yZGlvbiBwYW5lbHMuICovXG4gIHN0eWxlZDogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbkFjY29yZGlvbi5BY2NvcmRpb24gPSBBY2NvcmRpb25BY2NvcmRpb247XG5BY2NvcmRpb24uQ29udGVudCA9IEFjY29yZGlvbkNvbnRlbnQ7XG5BY2NvcmRpb24uUGFuZWwgPSBBY2NvcmRpb25QYW5lbDtcbkFjY29yZGlvbi5UaXRsZSA9IEFjY29yZGlvblRpdGxlO1xuZXhwb3J0IGRlZmF1bHQgQWNjb3JkaW9uOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC1lcy9pbmNsdWRlc1wiO1xuaW1wb3J0IF9pc0FycmF5IGZyb20gXCJsb2Rhc2gtZXMvaXNBcnJheVwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBNb2Rlcm5BdXRvQ29udHJvbGxlZENvbXBvbmVudCBhcyBDb21wb25lbnQsIGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBBY2NvcmRpb25QYW5lbCBmcm9tICcuL0FjY29yZGlvblBhbmVsJztcblxudmFyIHdhcm5JZlByb3BzQXJlSW52YWxpZCA9IGZ1bmN0aW9uIHdhcm5JZlByb3BzQXJlSW52YWxpZChwcm9wcywgc3RhdGUpIHtcbiAgdmFyIGV4Y2x1c2l2ZSA9IHByb3BzLmV4Y2x1c2l2ZTtcbiAgdmFyIGFjdGl2ZUluZGV4ID0gc3RhdGUuYWN0aXZlSW5kZXg7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cblxuICBpZiAoZXhjbHVzaXZlICYmIHR5cGVvZiBhY3RpdmVJbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICBjb25zb2xlLmVycm9yKCdgYWN0aXZlSW5kZXhgIG11c3QgYmUgYSBudW1iZXIgaWYgYGV4Y2x1c2l2ZWAgaXMgdHJ1ZScpO1xuICB9IGVsc2UgaWYgKCFleGNsdXNpdmUgJiYgIV9pc0FycmF5KGFjdGl2ZUluZGV4KSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2BhY3RpdmVJbmRleGAgbXVzdCBiZSBhbiBhcnJheSBpZiBgZXhjbHVzaXZlYCBpcyBmYWxzZScpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuXG59O1xuLyoqXG4gKiBBbiBBY2NvcmRpb24gY2FuIGNvbnRhaW4gc3ViLWFjY29yZGlvbnMuXG4gKi9cblxuXG52YXIgQWNjb3JkaW9uQWNjb3JkaW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEFjY29yZGlvbkFjY29yZGlvbiwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQWNjb3JkaW9uQWNjb3JkaW9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuY29tcHV0ZU5ld0luZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICB2YXIgZXhjbHVzaXZlID0gX3RoaXMucHJvcHMuZXhjbHVzaXZlO1xuICAgICAgdmFyIGFjdGl2ZUluZGV4ID0gX3RoaXMuc3RhdGUuYWN0aXZlSW5kZXg7XG4gICAgICBpZiAoZXhjbHVzaXZlKSByZXR1cm4gaW5kZXggPT09IGFjdGl2ZUluZGV4ID8gLTEgOiBpbmRleDsgLy8gY2hlY2sgdG8gc2VlIGlmIGluZGV4IGlzIGluIGFycmF5LCBhbmQgcmVtb3ZlIGl0LCBpZiBub3QgdGhlbiBhZGQgaXRcblxuICAgICAgcmV0dXJuIF9pbmNsdWRlcyhhY3RpdmVJbmRleCwgaW5kZXgpID8gX3dpdGhvdXQoYWN0aXZlSW5kZXgsIGluZGV4KSA6IFtdLmNvbmNhdChhY3RpdmVJbmRleCwgW2luZGV4XSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVRpdGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSwgdGl0bGVQcm9wcykge1xuICAgICAgdmFyIGluZGV4ID0gdGl0bGVQcm9wcy5pbmRleDtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVJbmRleDogX3RoaXMuY29tcHV0ZU5ld0luZGV4KGluZGV4KVxuICAgICAgfSk7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvblRpdGxlQ2xpY2snLCBlLCB0aXRsZVByb3BzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNJbmRleEFjdGl2ZSA9IGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgdmFyIGV4Y2x1c2l2ZSA9IF90aGlzLnByb3BzLmV4Y2x1c2l2ZTtcbiAgICAgIHZhciBhY3RpdmVJbmRleCA9IF90aGlzLnN0YXRlLmFjdGl2ZUluZGV4O1xuICAgICAgcmV0dXJuIGV4Y2x1c2l2ZSA/IGFjdGl2ZUluZGV4ID09PSBpbmRleCA6IF9pbmNsdWRlcyhhY3RpdmVJbmRleCwgaW5kZXgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQWNjb3JkaW9uQWNjb3JkaW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0SW5pdGlhbEF1dG9Db250cm9sbGVkU3RhdGUgPSBmdW5jdGlvbiBnZXRJbml0aWFsQXV0b0NvbnRyb2xsZWRTdGF0ZShfcmVmKSB7XG4gICAgdmFyIGV4Y2x1c2l2ZSA9IF9yZWYuZXhjbHVzaXZlO1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVJbmRleDogZXhjbHVzaXZlID8gLTEgOiBbXVxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHdhcm5JZlByb3BzQXJlSW52YWxpZCh0aGlzLnByb3BzLCB0aGlzLnN0YXRlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgd2FybklmUHJvcHNBcmVJbnZhbGlkKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICBwYW5lbHMgPSBfdGhpcyRwcm9wcy5wYW5lbHM7XG4gICAgdmFyIGNsYXNzZXMgPSBjeCgnYWNjb3JkaW9uJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEFjY29yZGlvbkFjY29yZGlvbiwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQWNjb3JkaW9uQWNjb3JkaW9uLCB0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBfbWFwKHBhbmVscywgZnVuY3Rpb24gKHBhbmVsLCBpbmRleCkge1xuICAgICAgcmV0dXJuIEFjY29yZGlvblBhbmVsLmNyZWF0ZShwYW5lbCwge1xuICAgICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgICBhY3RpdmU6IF90aGlzMi5pc0luZGV4QWN0aXZlKGluZGV4KSxcbiAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgb25UaXRsZUNsaWNrOiBfdGhpczIuaGFuZGxlVGl0bGVDbGlja1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KSA6IGNoaWxkcmVuKTtcbiAgfTtcblxuICByZXR1cm4gQWNjb3JkaW9uQWNjb3JkaW9uO1xufShDb21wb25lbnQpO1xuXG5BY2NvcmRpb25BY2NvcmRpb24uaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlSW5kZXhcIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGVmYXVsdEFjdGl2ZUluZGV4XCIsIFwiZXhjbHVzaXZlXCIsIFwib25UaXRsZUNsaWNrXCIsIFwicGFuZWxzXCJdO1xuZXhwb3J0IHsgQWNjb3JkaW9uQWNjb3JkaW9uIGFzIGRlZmF1bHQgfTtcbkFjY29yZGlvbkFjY29yZGlvbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBJbmRleCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwYW5lbC4gKi9cbiAgYWN0aXZlSW5kZXg6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnY2hpbGRyZW4nXSksIFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLCBQcm9wVHlwZXMubnVtYmVyXSldKSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBJbml0aWFsIGFjdGl2ZUluZGV4IHZhbHVlLiAqL1xuICBkZWZhdWx0QWN0aXZlSW5kZXg6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnY2hpbGRyZW4nXSksIFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLCBQcm9wVHlwZXMubnVtYmVyXSldKSxcblxuICAvKiogT25seSBhbGxvdyBvbmUgcGFuZWwgb3BlbiBhdCBhIHRpbWUuICovXG4gIGV4Y2x1c2l2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgcGFuZWwgdGl0bGUgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBpdGVtIHByb3BzLlxuICAgKi9cbiAgb25UaXRsZUNsaWNrOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2NoaWxkcmVuJ10pLCBQcm9wVHlwZXMuZnVuY10pLFxuXG4gIC8qKiBTaG9ydGhhbmQgYXJyYXkgb2YgcHJvcHMgZm9yIEFjY29yZGlvbi4gKi9cbiAgcGFuZWxzOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ2NoaWxkcmVuJ10pLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuICAgIHRpdGxlOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZFxuICB9KSldKVxufSA6IHt9O1xuQWNjb3JkaW9uQWNjb3JkaW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgZXhjbHVzaXZlOiB0cnVlXG59O1xuQWNjb3JkaW9uQWNjb3JkaW9uLmF1dG9Db250cm9sbGVkUHJvcHMgPSBbJ2FjdGl2ZUluZGV4J107XG5BY2NvcmRpb25BY2NvcmRpb24uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShBY2NvcmRpb25BY2NvcmRpb24sIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBjb250ZW50IHN1Yi1jb21wb25lbnQgZm9yIEFjY29yZGlvbiBjb21wb25lbnQuXG4gKi9cblxuZnVuY3Rpb24gQWNjb3JkaW9uQ29udGVudChwcm9wcykge1xuICB2YXIgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdjb250ZW50JywgdXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhBY2NvcmRpb25Db250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEFjY29yZGlvbkNvbnRlbnQsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5BY2NvcmRpb25Db250ZW50LmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuQWNjb3JkaW9uQ29udGVudC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgY29udGVudCBpcyB2aXNpYmxlLiAqL1xuICBhY3RpdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuQWNjb3JkaW9uQ29udGVudC5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KEFjY29yZGlvbkNvbnRlbnQsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25Db250ZW50OyIsImltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBBY2NvcmRpb25UaXRsZSBmcm9tICcuL0FjY29yZGlvblRpdGxlJztcbmltcG9ydCBBY2NvcmRpb25Db250ZW50IGZyb20gJy4vQWNjb3JkaW9uQ29udGVudCc7XG4vKipcbiAqIEEgcGFuZWwgc3ViLWNvbXBvbmVudCBmb3IgQWNjb3JkaW9uIGNvbXBvbmVudC5cbiAqL1xuXG52YXIgQWNjb3JkaW9uUGFuZWwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoQWNjb3JkaW9uUGFuZWwsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFjY29yZGlvblBhbmVsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlVGl0bGVPdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUsIHRpdGxlUHJvcHMpIHtcbiAgICAgICAgICBfaW52b2tlKHByZWRlZmluZWRQcm9wcywgJ29uQ2xpY2snLCBlLCB0aXRsZVByb3BzKTtcblxuICAgICAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvblRpdGxlQ2xpY2snLCBlLCB0aXRsZVByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEFjY29yZGlvblBhbmVsLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzLmFjdGl2ZSxcbiAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzLmNvbnRlbnQsXG4gICAgICAgIGluZGV4ID0gX3RoaXMkcHJvcHMuaW5kZXgsXG4gICAgICAgIHRpdGxlID0gX3RoaXMkcHJvcHMudGl0bGU7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBBY2NvcmRpb25UaXRsZS5jcmVhdGUodGl0bGUsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2UsXG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgYWN0aXZlOiBhY3RpdmUsXG4gICAgICAgIGluZGV4OiBpbmRleFxuICAgICAgfSxcbiAgICAgIG92ZXJyaWRlUHJvcHM6IHRoaXMuaGFuZGxlVGl0bGVPdmVycmlkZXNcbiAgICB9KSwgQWNjb3JkaW9uQ29udGVudC5jcmVhdGUoY29udGVudCwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZSxcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBhY3RpdmU6IGFjdGl2ZVxuICAgICAgfVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQWNjb3JkaW9uUGFuZWw7XG59KENvbXBvbmVudCk7XG5cbkFjY29yZGlvblBhbmVsLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImNvbnRlbnRcIiwgXCJpbmRleFwiLCBcIm9uVGl0bGVDbGlja1wiLCBcInRpdGxlXCJdO1xuQWNjb3JkaW9uUGFuZWwucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogV2hldGhlciBvciBub3QgdGhlIHRpdGxlIGlzIGluIHRoZSBvcGVuIHN0YXRlLiAqL1xuICBhY3RpdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHNob3J0aGFuZCBmb3IgQWNjb3JkaW9uLkNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIHBhbmVsIGluZGV4LiAqL1xuICBpbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHBhbmVsIHRpdGxlIGlzIGNsaWNrZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgaXRlbSBwcm9wcy5cbiAgICovXG4gIG9uVGl0bGVDbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgc2hvcnRoYW5kIGZvciBBY2NvcmRpb24uVGl0bGUuICovXG4gIHRpdGxlOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZFxufSA6IHt9O1xuQWNjb3JkaW9uUGFuZWwuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShBY2NvcmRpb25QYW5lbCwgbnVsbCk7XG5leHBvcnQgZGVmYXVsdCBBY2NvcmRpb25QYW5lbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi8uLi9lbGVtZW50cy9JY29uJztcbi8qKlxuICogQSB0aXRsZSBzdWItY29tcG9uZW50IGZvciBBY2NvcmRpb24gY29tcG9uZW50LlxuICovXG5cbnZhciBBY2NvcmRpb25UaXRsZSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShBY2NvcmRpb25UaXRsZSwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQWNjb3JkaW9uVGl0bGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xpY2snLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBY2NvcmRpb25UaXRsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzLmNvbnRlbnQsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wcy5pY29uO1xuICAgIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgJ3RpdGxlJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEFjY29yZGlvblRpdGxlLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShBY2NvcmRpb25UaXRsZSwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIGljb25WYWx1ZSA9IF9pc05pbChpY29uKSA/ICdkcm9wZG93bicgOiBpY29uO1xuXG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCBjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgIH0pLCBJY29uLmNyZWF0ZShpY29uVmFsdWUsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgY29udGVudCk7XG4gIH07XG5cbiAgcmV0dXJuIEFjY29yZGlvblRpdGxlO1xufShDb21wb25lbnQpO1xuXG5BY2NvcmRpb25UaXRsZS5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImljb25cIiwgXCJpbmRleFwiLCBcIm9uQ2xpY2tcIl07XG5leHBvcnQgeyBBY2NvcmRpb25UaXRsZSBhcyBkZWZhdWx0IH07XG5BY2NvcmRpb25UaXRsZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgdGl0bGUgaXMgaW4gdGhlIG9wZW4gc3RhdGUuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEljb24uICovXG4gIGljb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBY2NvcmRpb25UaXRsZSBpbmRleCBpbnNpZGUgQWNjb3JkaW9uLiAqL1xuICBpbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gY2xpY2suXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuY1xufSA6IHt9O1xuQWNjb3JkaW9uVGl0bGUuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShBY2NvcmRpb25UaXRsZSwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9zZXQgZnJvbSBcImxvZGFzaC1lcy9zZXRcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoLWVzL2dldFwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgeyBSZWYgfSBmcm9tICdAZmx1ZW50dWkvcmVhY3QtY29tcG9uZW50LXJlZic7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50IGFzIENvbXBvbmVudCwgY3JlYXRlSFRNTExhYmVsLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgaHRtbElucHV0QXR0cnMsIHBhcnRpdGlvbkhUTUxQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5cbi8qKlxuICogQSBjaGVja2JveCBhbGxvd3MgYSB1c2VyIHRvIHNlbGVjdCBhIHZhbHVlIGZyb20gYSBzbWFsbCBzZXQgb2Ygb3B0aW9ucywgb2Z0ZW4gYmluYXJ5LlxuICogQHNlZSBGb3JtXG4gKiBAc2VlIFJhZGlvXG4gKi9cbnZhciBDaGVja2JveCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShDaGVja2JveCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ2hlY2tib3goKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgX3RoaXMuaW5wdXRSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMubGFiZWxSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG5cbiAgICBfdGhpcy5jYW5Ub2dnbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgIHJhZGlvID0gX3RoaXMkcHJvcHMucmFkaW8sXG4gICAgICAgICAgcmVhZE9ubHkgPSBfdGhpcyRwcm9wcy5yZWFkT25seTtcbiAgICAgIHZhciBjaGVja2VkID0gX3RoaXMuc3RhdGUuY2hlY2tlZDtcbiAgICAgIHJldHVybiAhZGlzYWJsZWQgJiYgIXJlYWRPbmx5ICYmICEocmFkaW8gJiYgY2hlY2tlZCk7XG4gICAgfTtcblxuICAgIF90aGlzLmNvbXB1dGVUYWJJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzMi50YWJJbmRleDtcbiAgICAgIGlmICghX2lzTmlsKHRhYkluZGV4KSkgcmV0dXJuIHRhYkluZGV4O1xuICAgICAgcmV0dXJuIGRpc2FibGVkID8gLTEgOiAwO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgaWQgPSBfdGhpcy5wcm9wcy5pZDtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGNoZWNrZWQgPSBfdGhpcyRzdGF0ZS5jaGVja2VkLFxuICAgICAgICAgIGluZGV0ZXJtaW5hdGUgPSBfdGhpcyRzdGF0ZS5pbmRldGVybWluYXRlO1xuXG4gICAgICB2YXIgaXNJbnB1dENsaWNrID0gX2ludm9rZShfdGhpcy5pbnB1dFJlZi5jdXJyZW50LCAnY29udGFpbnMnLCBlLnRhcmdldCk7XG5cbiAgICAgIHZhciBpc0xhYmVsQ2xpY2sgPSBfaW52b2tlKF90aGlzLmxhYmVsUmVmLmN1cnJlbnQsICdjb250YWlucycsIGUudGFyZ2V0KTtcblxuICAgICAgdmFyIGlzUm9vdENsaWNrID0gIWlzTGFiZWxDbGljayAmJiAhaXNJbnB1dENsaWNrO1xuICAgICAgdmFyIGhhc0lkID0gIV9pc05pbChpZCk7XG4gICAgICB2YXIgaXNMYWJlbENsaWNrQW5kRm9yd2FyZGVkVG9JbnB1dCA9IGlzTGFiZWxDbGljayAmJiBoYXNJZDsgLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbWFudGljLU9yZy9TZW1hbnRpYy1VSS1SZWFjdC9wdWxsLzMzNTFcblxuICAgICAgaWYgKCFpc0xhYmVsQ2xpY2tBbmRGb3J3YXJkZWRUb0lucHV0KSB7XG4gICAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgICAgY2hlY2tlZDogIWNoZWNrZWQsXG4gICAgICAgICAgaW5kZXRlcm1pbmF0ZTogISFpbmRldGVybWluYXRlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmlzQ2xpY2tGcm9tTW91c2UpIHtcbiAgICAgICAgX3RoaXMuaXNDbGlja0Zyb21Nb3VzZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChpc0xhYmVsQ2xpY2sgJiYgIWhhc0lkKSB7XG4gICAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKGUpO1xuICAgICAgICB9IC8vIENoYW5nZXMgc2hvdWxkIGJlIHRyaWdnZXJlZCBmb3IgdGhlIHNsaWRlciB2YXJpYXRpb25cblxuXG4gICAgICAgIGlmIChpc1Jvb3RDbGljaykge1xuICAgICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0xhYmVsQ2xpY2sgJiYgaGFzSWQpIHtcbiAgICAgICAgICAvLyBUbyBwcmV2ZW50IHR3byBjbGlja3MgZnJvbSBiZWluZyBmaXJlZCBmcm9tIHRoZSBjb21wb25lbnQgd2UgaGF2ZSB0byBzdG9wIHRoZSBwcm9wYWdhdGlvblxuICAgICAgICAgIC8vIGZyb20gdGhlIFwiaW5wdXRcIiBjbGljazogaHR0cHM6Ly9naXRodWIuY29tL1NlbWFudGljLU9yZy9TZW1hbnRpYy1VSS1SZWFjdC9pc3N1ZXMvMzQzM1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjaGVja2VkID0gX3RoaXMuc3RhdGUuY2hlY2tlZDtcbiAgICAgIGlmICghX3RoaXMuY2FuVG9nZ2xlKCkpIHJldHVybjtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2hhbmdlJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIGNoZWNrZWQ6ICFjaGVja2VkLFxuICAgICAgICBpbmRldGVybWluYXRlOiBmYWxzZVxuICAgICAgfSkpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGNoZWNrZWQ6ICFjaGVja2VkLFxuICAgICAgICBpbmRldGVybWluYXRlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUyID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgY2hlY2tlZCA9IF90aGlzJHN0YXRlMi5jaGVja2VkLFxuICAgICAgICAgIGluZGV0ZXJtaW5hdGUgPSBfdGhpcyRzdGF0ZTIuaW5kZXRlcm1pbmF0ZTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91c2VEb3duJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIGNoZWNrZWQ6ICEhY2hlY2tlZCxcbiAgICAgICAgaW5kZXRlcm1pbmF0ZTogISFpbmRldGVybWluYXRlXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghZS5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIF9pbnZva2UoX3RoaXMuaW5wdXRSZWYuY3VycmVudCwgJ2ZvY3VzJyk7XG4gICAgICB9IC8vIEhlYWRzIHVwIVxuICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIFwicHJldmVudERlZmF1bHRcIiB0byBrZWVwIGVsZW1lbnQgZm9jdXNlZC5cblxuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vdXNlVXAgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHN0YXRlMyA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGNoZWNrZWQgPSBfdGhpcyRzdGF0ZTMuY2hlY2tlZCxcbiAgICAgICAgICBpbmRldGVybWluYXRlID0gX3RoaXMkc3RhdGUzLmluZGV0ZXJtaW5hdGU7XG4gICAgICBfdGhpcy5pc0NsaWNrRnJvbU1vdXNlID0gdHJ1ZTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91c2VVcCcsIGUsIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICBjaGVja2VkOiAhIWNoZWNrZWQsXG4gICAgICAgIGluZGV0ZXJtaW5hdGU6ICEhaW5kZXRlcm1pbmF0ZVxuICAgICAgfSkpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXRJbmRldGVybWluYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGluZGV0ZXJtaW5hdGUgPSBfdGhpcy5zdGF0ZS5pbmRldGVybWluYXRlO1xuXG4gICAgICBfc2V0KF90aGlzLmlucHV0UmVmLCAnY3VycmVudC5pbmRldGVybWluYXRlJywgISFpbmRldGVybWluYXRlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENoZWNrYm94LnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnNldEluZGV0ZXJtaW5hdGUoKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHRoaXMuc2V0SW5kZXRlcm1pbmF0ZSgpO1xuICB9O1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMy5jbGFzc05hbWUsXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMzLmRpc2FibGVkLFxuICAgICAgICBsYWJlbCA9IF90aGlzJHByb3BzMy5sYWJlbCxcbiAgICAgICAgaWQgPSBfdGhpcyRwcm9wczMuaWQsXG4gICAgICAgIG5hbWUgPSBfdGhpcyRwcm9wczMubmFtZSxcbiAgICAgICAgcmFkaW8gPSBfdGhpcyRwcm9wczMucmFkaW8sXG4gICAgICAgIHJlYWRPbmx5ID0gX3RoaXMkcHJvcHMzLnJlYWRPbmx5LFxuICAgICAgICBzbGlkZXIgPSBfdGhpcyRwcm9wczMuc2xpZGVyLFxuICAgICAgICB0b2dnbGUgPSBfdGhpcyRwcm9wczMudG9nZ2xlLFxuICAgICAgICB0eXBlID0gX3RoaXMkcHJvcHMzLnR5cGUsXG4gICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMzLnZhbHVlO1xuICAgIHZhciBfdGhpcyRzdGF0ZTQgPSB0aGlzLnN0YXRlLFxuICAgICAgICBjaGVja2VkID0gX3RoaXMkc3RhdGU0LmNoZWNrZWQsXG4gICAgICAgIGluZGV0ZXJtaW5hdGUgPSBfdGhpcyRzdGF0ZTQuaW5kZXRlcm1pbmF0ZTtcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHVzZUtleU9ubHkoY2hlY2tlZCwgJ2NoZWNrZWQnKSwgdXNlS2V5T25seShkaXNhYmxlZCwgJ2Rpc2FibGVkJyksIHVzZUtleU9ubHkoaW5kZXRlcm1pbmF0ZSwgJ2luZGV0ZXJtaW5hdGUnKSwgLy8gYXV0byBhcHBseSBmaXR0ZWQgY2xhc3MgdG8gY29tcGFjdCB3aGl0ZSBzcGFjZSB3aGVuIHRoZXJlIGlzIG5vIGxhYmVsXG4gICAgLy8gaHR0cHM6Ly9zZW1hbnRpYy11aS5jb20vbW9kdWxlcy9jaGVja2JveC5odG1sI2ZpdHRlZFxuICAgIHVzZUtleU9ubHkoX2lzTmlsKGxhYmVsKSwgJ2ZpdHRlZCcpLCB1c2VLZXlPbmx5KHJhZGlvLCAncmFkaW8nKSwgdXNlS2V5T25seShyZWFkT25seSwgJ3JlYWQtb25seScpLCB1c2VLZXlPbmx5KHNsaWRlciwgJ3NsaWRlcicpLCB1c2VLZXlPbmx5KHRvZ2dsZSwgJ3RvZ2dsZScpLCAnY2hlY2tib3gnLCBjbGFzc05hbWUpO1xuICAgIHZhciB1bmhhbmRsZWQgPSBnZXRVbmhhbmRsZWRQcm9wcyhDaGVja2JveCwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQ2hlY2tib3gsIHRoaXMucHJvcHMpO1xuXG4gICAgdmFyIF9wYXJ0aXRpb25IVE1MUHJvcHMgPSBwYXJ0aXRpb25IVE1MUHJvcHModW5oYW5kbGVkLCB7XG4gICAgICBodG1sUHJvcHM6IGh0bWxJbnB1dEF0dHJzXG4gICAgfSksXG4gICAgICAgIGh0bWxJbnB1dFByb3BzID0gX3BhcnRpdGlvbkhUTUxQcm9wc1swXSxcbiAgICAgICAgcmVzdCA9IF9wYXJ0aXRpb25IVE1MUHJvcHNbMV07IC8vIEhlYWRzIFVwIVxuICAgIC8vIERvIG5vdCByZW1vdmUgZW1wdHkgbGFiZWxzLCB0aGV5IGFyZSByZXF1aXJlZCBieSBTVUkgQ1NTXG5cblxuICAgIHZhciBsYWJlbEVsZW1lbnQgPSBjcmVhdGVIVE1MTGFiZWwobGFiZWwsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBodG1sRm9yOiBpZFxuICAgICAgfSxcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSB8fCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImxhYmVsXCIsIHtcbiAgICAgIGh0bWxGb3I6IGlkXG4gICAgfSk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGljayxcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgIG9uTW91c2VEb3duOiB0aGlzLmhhbmRsZU1vdXNlRG93bixcbiAgICAgIG9uTW91c2VVcDogdGhpcy5oYW5kbGVNb3VzZVVwXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgICAgaW5uZXJSZWY6IHRoaXMuaW5wdXRSZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIF9leHRlbmRzKHt9LCBodG1sSW5wdXRQcm9wcywge1xuICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgIGNsYXNzTmFtZTogXCJoaWRkZW5cIixcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgIGlkOiBpZCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgIHRhYkluZGV4OiB0aGlzLmNvbXB1dGVUYWJJbmRleCgpLFxuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIHZhbHVlOiB2YWx1ZVxuICAgIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgICAgaW5uZXJSZWY6IHRoaXMubGFiZWxSZWZcbiAgICB9LCBsYWJlbEVsZW1lbnQpKTtcbiAgfTtcblxuICByZXR1cm4gQ2hlY2tib3g7XG59KENvbXBvbmVudCk7XG5cbkNoZWNrYm94LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hlY2tlZFwiLCBcImNsYXNzTmFtZVwiLCBcImRlZmF1bHRDaGVja2VkXCIsIFwiZGVmYXVsdEluZGV0ZXJtaW5hdGVcIiwgXCJkaXNhYmxlZFwiLCBcImZpdHRlZFwiLCBcImlkXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcImxhYmVsXCIsIFwibmFtZVwiLCBcIm9uQ2hhbmdlXCIsIFwib25DbGlja1wiLCBcIm9uTW91c2VEb3duXCIsIFwib25Nb3VzZVVwXCIsIFwicmFkaW9cIiwgXCJyZWFkT25seVwiLCBcInNsaWRlclwiLCBcInRhYkluZGV4XCIsIFwidG9nZ2xlXCIsIFwidHlwZVwiLCBcInZhbHVlXCJdO1xuZXhwb3J0IHsgQ2hlY2tib3ggYXMgZGVmYXVsdCB9O1xuQ2hlY2tib3gucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogV2hldGhlciBvciBub3QgY2hlY2tib3ggaXMgY2hlY2tlZC4gKi9cbiAgY2hlY2tlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBUaGUgaW5pdGlhbCB2YWx1ZSBvZiBjaGVja2VkLiAqL1xuICBkZWZhdWx0Q2hlY2tlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IGNoZWNrYm94IGlzIGluZGV0ZXJtaW5hdGUuICovXG4gIGRlZmF1bHRJbmRldGVybWluYXRlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBjaGVja2JveCBjYW4gYXBwZWFyIGRpc2FibGVkIGFuZCBiZSB1bmFibGUgdG8gY2hhbmdlIHN0YXRlcyAqL1xuICBkaXNhYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFJlbW92ZXMgcGFkZGluZyBmb3IgYSBsYWJlbC4gQXV0byBhcHBsaWVkIHdoZW4gdGhlcmUgaXMgbm8gbGFiZWwuICovXG4gIGZpdHRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgdW5pcXVlIGlkZW50aWZpZXIuICovXG4gIGlkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IGNoZWNrYm94IGlzIGluZGV0ZXJtaW5hdGUuICovXG4gIGluZGV0ZXJtaW5hdGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBUaGUgdGV4dCBvZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50LiAqL1xuICBsYWJlbDogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFRoZSBIVE1MIGlucHV0IG5hbWUuICovXG4gIG5hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgY2hlY2tlZCBzdGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgcHJvcG9zZWQgY2hlY2tlZC9pbmRldGVybWluYXRlIHN0YXRlLlxuICAgKi9cbiAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hlY2tib3ggb3IgbGFiZWwgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgY3VycmVudCBjaGVja2VkL2luZGV0ZXJtaW5hdGUgc3RhdGUuXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBkb3duIG9uIHRoZSBtb3VzZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgY3VycmVudCBjaGVja2VkL2luZGV0ZXJtaW5hdGUgc3RhdGUuXG4gICAqL1xuICBvbk1vdXNlRG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIHRoZSBtb3VzZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgY3VycmVudCBjaGVja2VkL2luZGV0ZXJtaW5hdGUgc3RhdGUuXG4gICAqL1xuICBvbk1vdXNlVXA6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBGb3JtYXQgYXMgYSByYWRpbyBlbGVtZW50LiBUaGlzIG1lYW5zIGl0IGlzIGFuIGV4Y2x1c2l2ZSBvcHRpb24uICovXG4gIHJhZGlvOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW1Byb3BUeXBlcy5ib29sLCBjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydzbGlkZXInLCAndG9nZ2xlJ10pXSksXG5cbiAgLyoqIEEgY2hlY2tib3ggY2FuIGJlIHJlYWQtb25seSBhbmQgdW5hYmxlIHRvIGNoYW5nZSBzdGF0ZXMuICovXG4gIHJlYWRPbmx5OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRm9ybWF0IHRvIGVtcGhhc2l6ZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gc3RhdGUuICovXG4gIHNsaWRlcjogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtQcm9wVHlwZXMuYm9vbCwgY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsncmFkaW8nLCAndG9nZ2xlJ10pXSksXG5cbiAgLyoqIEEgY2hlY2tib3ggY2FuIHJlY2VpdmUgZm9jdXMuICovXG4gIHRhYkluZGV4OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIEZvcm1hdCB0byBzaG93IGFuIG9uIG9yIG9mZiBjaG9pY2UuICovXG4gIHRvZ2dsZTogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtQcm9wVHlwZXMuYm9vbCwgY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsncmFkaW8nLCAnc2xpZGVyJ10pXSksXG5cbiAgLyoqIEhUTUwgaW5wdXQgdHlwZSwgZWl0aGVyIGNoZWNrYm94IG9yIHJhZGlvLiAqL1xuICB0eXBlOiBQcm9wVHlwZXMub25lT2YoWydjaGVja2JveCcsICdyYWRpbyddKSxcblxuICAvKiogVGhlIEhUTUwgaW5wdXQgdmFsdWUuICovXG4gIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSlcbn0gOiB7fTtcbkNoZWNrYm94LmRlZmF1bHRQcm9wcyA9IHtcbiAgdHlwZTogJ2NoZWNrYm94J1xufTtcbkNoZWNrYm94LmF1dG9Db250cm9sbGVkUHJvcHMgPSBbJ2NoZWNrZWQnLCAnaW5kZXRlcm1pbmF0ZSddOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0NoZWNrYm94JztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBnZXRVbmhhbmRsZWRQcm9wcywgaXNCcm93c2VyIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBQb3J0YWwgZnJvbSAnLi4vLi4vYWRkb25zL1BvcnRhbCc7XG5pbXBvcnQgRGltbWVyRGltbWFibGUgZnJvbSAnLi9EaW1tZXJEaW1tYWJsZSc7XG5pbXBvcnQgRGltbWVySW5uZXIgZnJvbSAnLi9EaW1tZXJJbm5lcic7XG4vKipcbiAqIEEgZGltbWVyIGhpZGVzIGRpc3RyYWN0aW9ucyB0byBmb2N1cyBhdHRlbnRpb24gb24gcGFydGljdWxhciBjb250ZW50LlxuICovXG5cbnZhciBEaW1tZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRGltbWVyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEaW1tZXIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVQb3J0YWxNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybjsgLy8gSGVhZHMgdXAsIElFIGRvZXNuJ3Qgc3VwcG9ydCBzZWNvbmQgYXJndW1lbnQgaW4gYWRkKClcblxuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdkaW1tZWQnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnZGltbWFibGUnKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUG9ydGFsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghaXNCcm93c2VyKCkpIHJldHVybjsgLy8gSGVhZHMgdXAsIElFIGRvZXNuJ3Qgc3VwcG9ydCBzZWNvbmQgYXJndW1lbnQgaW4gYWRkKClcblxuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdkaW1tZWQnKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnZGltbWFibGUnKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IERpbW1lci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIHBhZ2UgPSBfdGhpcyRwcm9wcy5wYWdlO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRGltbWVyLCB0aGlzLnByb3BzKTtcblxuICAgIGlmIChwYWdlKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUG9ydGFsLCB7XG4gICAgICAgIGNsb3NlT25Fc2NhcGU6IGZhbHNlLFxuICAgICAgICBjbG9zZU9uRG9jdW1lbnRDbGljazogZmFsc2UsXG4gICAgICAgIG9uTW91bnQ6IHRoaXMuaGFuZGxlUG9ydGFsTW91bnQsXG4gICAgICAgIG9uVW5tb3VudDogdGhpcy5oYW5kbGVQb3J0YWxVbm1vdW50LFxuICAgICAgICBvcGVuOiBhY3RpdmUsXG4gICAgICAgIG9wZW5PblRyaWdnZXJDbGljazogZmFsc2VcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpbW1lcklubmVyLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgICAgcGFnZTogcGFnZVxuICAgICAgfSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGltbWVySW5uZXIsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgIHBhZ2U6IHBhZ2VcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIERpbW1lcjtcbn0oQ29tcG9uZW50KTtcblxuRGltbWVyLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcInBhZ2VcIl07XG5leHBvcnQgeyBEaW1tZXIgYXMgZGVmYXVsdCB9O1xuRGltbWVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGFjdGl2ZSBkaW1tZXIgd2lsbCBkaW0gaXRzIHBhcmVudCBjb250YWluZXIuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgZGltbWVyIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYmUgZml4ZWQgdG8gdGhlIHBhZ2UuICovXG4gIHBhZ2U6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5EaW1tZXIuRGltbWFibGUgPSBEaW1tZXJEaW1tYWJsZTtcbkRpbW1lci5Jbm5lciA9IERpbW1lcklubmVyO1xuRGltbWVyLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoRGltbWVyLCBmdW5jdGlvbiAodmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiB2YWx1ZVxuICB9O1xufSk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBkaW1tYWJsZSBzdWItY29tcG9uZW50IGZvciBEaW1tZXIuXG4gKi9cblxuZnVuY3Rpb24gRGltbWVyRGltbWFibGUocHJvcHMpIHtcbiAgdmFyIGJsdXJyaW5nID0gcHJvcHMuYmx1cnJpbmcsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkaW1tZWQgPSBwcm9wcy5kaW1tZWQ7XG4gIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShibHVycmluZywgJ2JsdXJyaW5nJyksIHVzZUtleU9ubHkoZGltbWVkLCAnZGltbWVkJyksICdkaW1tYWJsZScsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRGltbWVyRGltbWFibGUsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRGltbWVyRGltbWFibGUsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5EaW1tZXJEaW1tYWJsZS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImJsdXJyaW5nXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGltbWVkXCJdO1xuRGltbWVyRGltbWFibGUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBkaW1tYWJsZSBlbGVtZW50IGNhbiBibHVyIGl0cyBjb250ZW50cy4gKi9cbiAgYmx1cnJpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGRpbSBpcyBkaXNwbGF5ZWQuICovXG4gIGRpbW1lZDogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IERpbW1lckRpbW1hYmxlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IHsgUmVmIH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZG9lc05vZGVDb250YWluQ2xpY2ssIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSwgdXNlVmVydGljYWxBbGlnblByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBbiBpbm5lciBlbGVtZW50IGZvciBhIERpbW1lci5cbiAqL1xuXG52YXIgRGltbWVySW5uZXIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoRGltbWVySW5uZXIsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIERpbW1lcklubmVyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLmNvbnRhaW5lclJlZiA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5jb250ZW50UmVmID0gLyojX19QVVJFX18qL2NyZWF0ZVJlZigpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGNvbnRlbnRSZWYgPSBfdGhpcy5jb250ZW50UmVmLmN1cnJlbnQ7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICBpZiAoY29udGVudFJlZiAmJiBjb250ZW50UmVmICE9PSBlLnRhcmdldCAmJiBkb2VzTm9kZUNvbnRhaW5DbGljayhjb250ZW50UmVmLCBlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrT3V0c2lkZScsIGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IERpbW1lcklubmVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB2YXIgYWN0aXZlID0gdGhpcy5wcm9wcy5hY3RpdmU7XG4gICAgdGhpcy50b2dnbGVTdHlsZXMoYWN0aXZlKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHZhciBjdXJyZW50QWN0aXZlID0gdGhpcy5wcm9wcy5hY3RpdmU7XG4gICAgdmFyIHByZXZBY3RpdmUgPSBwcmV2UHJvcHMuYWN0aXZlO1xuICAgIGlmIChwcmV2QWN0aXZlICE9PSBjdXJyZW50QWN0aXZlKSB0aGlzLnRvZ2dsZVN0eWxlcyhjdXJyZW50QWN0aXZlKTtcbiAgfTtcblxuICBfcHJvdG8udG9nZ2xlU3R5bGVzID0gZnVuY3Rpb24gdG9nZ2xlU3R5bGVzKGFjdGl2ZSkge1xuICAgIHZhciBjb250YWluZXJSZWYgPSB0aGlzLmNvbnRhaW5lclJlZi5jdXJyZW50O1xuICAgIGlmICghY29udGFpbmVyUmVmIHx8ICFjb250YWluZXJSZWYuc3R5bGUpIHJldHVybjtcblxuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIGNvbnRhaW5lclJlZi5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdmbGV4JywgJ2ltcG9ydGFudCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXJSZWYuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wcy5hY3RpdmUsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzLmNvbnRlbnQsXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIGludmVydGVkID0gX3RoaXMkcHJvcHMuaW52ZXJ0ZWQsXG4gICAgICAgIHBhZ2UgPSBfdGhpcyRwcm9wcy5wYWdlLFxuICAgICAgICBzaW1wbGUgPSBfdGhpcyRwcm9wcy5zaW1wbGUsXG4gICAgICAgIHZlcnRpY2FsQWxpZ24gPSBfdGhpcyRwcm9wcy52ZXJ0aWNhbEFsaWduO1xuICAgIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUgdHJhbnNpdGlvbiB2aXNpYmxlJyksIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlS2V5T25seShwYWdlLCAncGFnZScpLCB1c2VLZXlPbmx5KHNpbXBsZSwgJ3NpbXBsZScpLCB1c2VWZXJ0aWNhbEFsaWduUHJvcCh2ZXJ0aWNhbEFsaWduKSwgJ2RpbW1lcicsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhEaW1tZXJJbm5lciwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRGltbWVySW5uZXIsIHRoaXMucHJvcHMpO1xuICAgIHZhciBjaGlsZHJlbkNvbnRlbnQgPSBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbjtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVmLCB7XG4gICAgICBpbm5lclJlZjogdGhpcy5jb250YWluZXJSZWZcbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICB9KSwgY2hpbGRyZW5Db250ZW50ICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjb250ZW50XCIsXG4gICAgICByZWY6IHRoaXMuY29udGVudFJlZlxuICAgIH0sIGNoaWxkcmVuQ29udGVudCkpKTtcbiAgfTtcblxuICByZXR1cm4gRGltbWVySW5uZXI7XG59KENvbXBvbmVudCk7XG5cbkRpbW1lcklubmVyLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGlzYWJsZWRcIiwgXCJpbnZlcnRlZFwiLCBcIm9uQ2xpY2tcIiwgXCJvbkNsaWNrT3V0c2lkZVwiLCBcInBhZ2VcIiwgXCJzaW1wbGVcIiwgXCJ2ZXJ0aWNhbEFsaWduXCJdO1xuZXhwb3J0IHsgRGltbWVySW5uZXIgYXMgZGVmYXVsdCB9O1xuRGltbWVySW5uZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQW4gYWN0aXZlIGRpbW1lciB3aWxsIGRpbSBpdHMgcGFyZW50IGNvbnRhaW5lci4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgZGlzYWJsZWQgZGltbWVyIGNhbm5vdCBiZSBhY3RpdmF0ZWQgKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gY2xpY2suXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogSGFuZGxlcyBjbGljayBvdXRzaWRlIERpbW1lcidzIGNvbnRlbnQsIGJ1dCBpbnNpZGUgRGltbWVyIGFyZWEuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkNsaWNrT3V0c2lkZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgZGltbWVyIGNhbiBiZSBmb3JtYXR0ZWQgdG8gaGF2ZSBpdHMgY29sb3JzIGludmVydGVkLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgZGltbWVyIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYmUgZml4ZWQgdG8gdGhlIHBhZ2UuICovXG4gIHBhZ2U6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGRpbW1lciBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHNpbXBsZSBwcm9wLiAqL1xuICBzaW1wbGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGRpbW1lciBjYW4gaGF2ZSBpdHMgY29udGVudCB0b3Agb3IgYm90dG9tIGFsaWduZWQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihbJ2JvdHRvbScsICd0b3AnXSlcbn0gOiB7fTsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9EaW1tZXInO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gtZXMvaW5jbHVkZXNcIjtcbmltcG9ydCBfY29tcGFjdCBmcm9tIFwibG9kYXNoLWVzL2NvbXBhY3RcIjtcbmltcG9ydCBfbWFwIGZyb20gXCJsb2Rhc2gtZXMvbWFwXCI7XG5pbXBvcnQgX2V2ZXJ5IGZyb20gXCJsb2Rhc2gtZXMvZXZlcnlcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfZmluZCBmcm9tIFwibG9kYXNoLWVzL2ZpbmRcIjtcbmltcG9ydCBfZHJvcFJpZ2h0IGZyb20gXCJsb2Rhc2gtZXMvZHJvcFJpZ2h0XCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC1lcy9pc0VtcHR5XCI7XG5pbXBvcnQgX3NpemUgZnJvbSBcImxvZGFzaC1lcy9zaXplXCI7XG5pbXBvcnQgX2RpZmZlcmVuY2UgZnJvbSBcImxvZGFzaC1lcy9kaWZmZXJlbmNlXCI7XG5pbXBvcnQgX3VuaW9uIGZyb20gXCJsb2Rhc2gtZXMvdW5pb25cIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gtZXMvZ2V0XCI7XG5pbXBvcnQgX25vb3AgZnJvbSBcImxvZGFzaC1lcy9ub29wXCI7XG5pbXBvcnQgX2lzVW5kZWZpbmVkIGZyb20gXCJsb2Rhc2gtZXMvaXNVbmRlZmluZWRcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgX2hhcyBmcm9tIFwibG9kYXNoLWVzL2hhc1wiO1xuaW1wb3J0IF9pc0VxdWFsIGZyb20gXCJsb2Rhc2gtZXMvaXNFcXVhbFwiO1xuaW1wb3J0IF9pc0Z1bmN0aW9uIGZyb20gXCJsb2Rhc2gtZXMvaXNGdW5jdGlvblwiO1xuaW1wb3J0IF9waWNrIGZyb20gXCJsb2Rhc2gtZXMvcGlja1wiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgRXZlbnRTdGFjayBmcm9tICdAc2VtYW50aWMtdWktcmVhY3QvZXZlbnQtc3RhY2snO1xuaW1wb3J0IHsgUmVmIH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGtleWJvYXJkS2V5IGZyb20gJ2tleWJvYXJkLWtleSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IENoaWxkcmVuLCBjbG9uZUVsZW1lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnc2hhbGxvd2VxdWFsJztcbmltcG9ydCB7IE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50IGFzIENvbXBvbmVudCwgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBkb2VzTm9kZUNvbnRhaW5DbGljaywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBvYmplY3REaWZmLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ljb24nO1xuaW1wb3J0IExhYmVsIGZyb20gJy4uLy4uL2VsZW1lbnRzL0xhYmVsJztcbmltcG9ydCBGbGFnIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ZsYWcnO1xuaW1wb3J0IEltYWdlIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ltYWdlJztcbmltcG9ydCBEcm9wZG93bkRpdmlkZXIgZnJvbSAnLi9Ecm9wZG93bkRpdmlkZXInO1xuaW1wb3J0IERyb3Bkb3duSXRlbSBmcm9tICcuL0Ryb3Bkb3duSXRlbSc7XG5pbXBvcnQgRHJvcGRvd25IZWFkZXIgZnJvbSAnLi9Ecm9wZG93bkhlYWRlcic7XG5pbXBvcnQgRHJvcGRvd25NZW51IGZyb20gJy4vRHJvcGRvd25NZW51JztcbmltcG9ydCBEcm9wZG93blNlYXJjaElucHV0IGZyb20gJy4vRHJvcGRvd25TZWFyY2hJbnB1dCc7XG5pbXBvcnQgRHJvcGRvd25UZXh0IGZyb20gJy4vRHJvcGRvd25UZXh0JztcbmltcG9ydCBnZXRNZW51T3B0aW9ucyBmcm9tICcuL3V0aWxzL2dldE1lbnVPcHRpb25zJztcbmltcG9ydCBnZXRTZWxlY3RlZEluZGV4IGZyb20gJy4vdXRpbHMvZ2V0U2VsZWN0ZWRJbmRleCc7XG5cbnZhciBnZXRLZXlPclZhbHVlID0gZnVuY3Rpb24gZ2V0S2V5T3JWYWx1ZShrZXksIHZhbHVlKSB7XG4gIHJldHVybiBfaXNOaWwoa2V5KSA/IHZhbHVlIDoga2V5O1xufTtcblxudmFyIGdldEtleUFuZFZhbHVlcyA9IGZ1bmN0aW9uIGdldEtleUFuZFZhbHVlcyhvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zID8gb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbikge1xuICAgIHJldHVybiBfcGljayhvcHRpb24sIFsna2V5JywgJ3ZhbHVlJ10pO1xuICB9KSA6IG9wdGlvbnM7XG59O1xuXG5mdW5jdGlvbiByZW5kZXJJdGVtQ29udGVudChpdGVtKSB7XG4gIHZhciBmbGFnID0gaXRlbS5mbGFnLFxuICAgICAgaW1hZ2UgPSBpdGVtLmltYWdlLFxuICAgICAgdGV4dCA9IGl0ZW0udGV4dDsgLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW4gdjNcbiAgLy8gVGhpcyBtYWludGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIFNob3J0aGFuZCBBUEkgaW4gdjEgYXMgdGhpcyBtaWdodCBiZSBjYWxsZWQgaW4gXCJMYWJlbC5jcmVhdGUoKVwiXG5cbiAgaWYgKF9pc0Z1bmN0aW9uKHRleHQpKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBGbGFnLmNyZWF0ZShmbGFnKSwgSW1hZ2UuY3JlYXRlKGltYWdlKSwgdGV4dClcbiAgfTtcbn1cbi8qKlxuICogQSBkcm9wZG93biBhbGxvd3MgYSB1c2VyIHRvIHNlbGVjdCBhIHZhbHVlIGZyb20gYSBzZXJpZXMgb2Ygb3B0aW9ucy5cbiAqIEBzZWUgRm9ybVxuICogQHNlZSBTZWxlY3RcbiAqIEBzZWUgTWVudVxuICovXG5cblxudmFyIERyb3Bkb3duID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKERyb3Bkb3duLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5zZWFyY2hSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMuc2l6ZXJSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMucmVmID0gLyojX19QVVJFX18qL2NyZWF0ZVJlZigpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUsIHZhbHVlKSB7XG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DaGFuZ2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmNsb3NlT25DaGFuZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgY2xvc2VPbkNoYW5nZSA9IF90aGlzJHByb3BzLmNsb3NlT25DaGFuZ2UsXG4gICAgICAgICAgbXVsdGlwbGUgPSBfdGhpcyRwcm9wcy5tdWx0aXBsZTtcbiAgICAgIHZhciBzaG91bGRDbG9zZSA9IF9pc1VuZGVmaW5lZChjbG9zZU9uQ2hhbmdlKSA/ICFtdWx0aXBsZSA6IGNsb3NlT25DaGFuZ2U7XG5cbiAgICAgIGlmIChzaG91bGRDbG9zZSkge1xuICAgICAgICBfdGhpcy5jbG9zZShlLCBfbm9vcCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmNsb3NlT25Fc2NhcGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFfdGhpcy5wcm9wcy5jbG9zZU9uRXNjYXBlKSByZXR1cm47XG4gICAgICBpZiAoa2V5Ym9hcmRLZXkuZ2V0Q29kZShlKSAhPT0ga2V5Ym9hcmRLZXkuRXNjYXBlKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIF90aGlzLmNsb3NlKGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5tb3ZlU2VsZWN0aW9uT25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfbW92ZXM7XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzMi5tdWx0aXBsZSxcbiAgICAgICAgICBzZWxlY3RPbk5hdmlnYXRpb24gPSBfdGhpcyRwcm9wczIuc2VsZWN0T25OYXZpZ2F0aW9uO1xuICAgICAgdmFyIG9wZW4gPSBfdGhpcy5zdGF0ZS5vcGVuO1xuXG4gICAgICBpZiAoIW9wZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgbW92ZXMgPSAoX21vdmVzID0ge30sIF9tb3Zlc1trZXlib2FyZEtleS5BcnJvd0Rvd25dID0gMSwgX21vdmVzW2tleWJvYXJkS2V5LkFycm93VXBdID0gLTEsIF9tb3Zlcyk7XG4gICAgICB2YXIgbW92ZSA9IG1vdmVzW2tleWJvYXJkS2V5LmdldENvZGUoZSldO1xuXG4gICAgICBpZiAobW92ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB2YXIgbmV4dEluZGV4ID0gX3RoaXMuZ2V0U2VsZWN0ZWRJbmRleEFmdGVyTW92ZShtb3ZlKTtcblxuICAgICAgaWYgKCFtdWx0aXBsZSAmJiBzZWxlY3RPbk5hdmlnYXRpb24pIHtcbiAgICAgICAgX3RoaXMubWFrZVNlbGVjdGVkSXRlbUFjdGl2ZShlLCBuZXh0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkSW5kZXg6IG5leHRJbmRleFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLm9wZW5PblNwYWNlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfZSR0YXJnZXQsIF9lJHRhcmdldDIsIF9lJHRhcmdldDM7XG5cbiAgICAgIHZhciBzaG91bGRIYW5kbGVFdmVudCA9IF90aGlzLnN0YXRlLmZvY3VzICYmICFfdGhpcy5zdGF0ZS5vcGVuICYmIGtleWJvYXJkS2V5LmdldENvZGUoZSkgPT09IGtleWJvYXJkS2V5LlNwYWNlYmFyO1xuICAgICAgdmFyIHNob3VsZFByZXZlbnREZWZhdWx0ID0gKChfZSR0YXJnZXQgPSBlLnRhcmdldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lJHRhcmdldC50YWdOYW1lKSAhPT0gJ0lOUFVUJyAmJiAoKF9lJHRhcmdldDIgPSBlLnRhcmdldCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lJHRhcmdldDIudGFnTmFtZSkgIT09ICdURVhUQVJFQScgJiYgKChfZSR0YXJnZXQzID0gZS50YXJnZXQpID09IG51bGwgPyB2b2lkIDAgOiBfZSR0YXJnZXQzLmlzQ29udGVudEVkaXRhYmxlKSAhPT0gdHJ1ZTtcblxuICAgICAgaWYgKHNob3VsZEhhbmRsZUV2ZW50KSB7XG4gICAgICAgIGlmIChzaG91bGRQcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLm9wZW4oZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLm9wZW5PbkFycm93ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZSA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIGZvY3VzID0gX3RoaXMkc3RhdGUuZm9jdXMsXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHN0YXRlLm9wZW47XG5cbiAgICAgIGlmIChmb2N1cyAmJiAhb3Blbikge1xuICAgICAgICB2YXIgY29kZSA9IGtleWJvYXJkS2V5LmdldENvZGUoZSk7XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IGtleWJvYXJkS2V5LkFycm93RG93biB8fCBjb2RlID09PSBrZXlib2FyZEtleS5BcnJvd1VwKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgX3RoaXMub3BlbihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5tYWtlU2VsZWN0ZWRJdGVtQWN0aXZlID0gZnVuY3Rpb24gKGUsIHNlbGVjdGVkSW5kZXgpIHtcbiAgICAgIHZhciBfdGhpcyRzdGF0ZTIgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBvcGVuID0gX3RoaXMkc3RhdGUyLm9wZW4sXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZTIudmFsdWU7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBfdGhpcy5wcm9wcy5tdWx0aXBsZTtcblxuICAgICAgdmFyIGl0ZW0gPSBfdGhpcy5nZXRTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJbmRleCk7XG5cbiAgICAgIHZhciBzZWxlY3RlZFZhbHVlID0gX2dldChpdGVtLCAndmFsdWUnKTsgLy8gcHJldmVudCBzZWxlY3RpbmcgbnVsbCBpZiB0aGVyZSB3YXMgbm8gc2VsZWN0ZWQgaXRlbSB2YWx1ZVxuICAgICAgLy8gcHJldmVudCBzZWxlY3RpbmcgZHVwbGljYXRlIGl0ZW1zIHdoZW4gdGhlIGRyb3Bkb3duIGlzIGNsb3NlZFxuXG5cbiAgICAgIGlmIChfaXNOaWwoc2VsZWN0ZWRWYWx1ZSkgfHwgIW9wZW4pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSAvLyBzdGF0ZSB2YWx1ZSBtYXkgYmUgdW5kZWZpbmVkXG5cblxuICAgICAgdmFyIG5ld1ZhbHVlID0gbXVsdGlwbGUgPyBfdW5pb24odmFsdWUsIFtzZWxlY3RlZFZhbHVlXSkgOiBzZWxlY3RlZFZhbHVlO1xuICAgICAgdmFyIHZhbHVlSGFzQ2hhbmdlZCA9IG11bHRpcGxlID8gISFfZGlmZmVyZW5jZShuZXdWYWx1ZSwgdmFsdWUpLmxlbmd0aCA6IG5ld1ZhbHVlICE9PSB2YWx1ZTtcblxuICAgICAgaWYgKHZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICAvLyBub3RpZnkgdGhlIG9uQ2hhbmdlIHByb3AgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gY2hhbmdlIHZhbHVlXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKGUsIG5ld1ZhbHVlKTsgLy8gSGVhZHMgdXAhIFRoaXMgZXZlbnQgaGFuZGxlciBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGBvbkNoYW5nZWBcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvbkFkZEl0ZW0gcHJvcCBpZiB0aGlzIGlzIGEgbmV3IHZhbHVlXG5cblxuICAgICAgICBpZiAoaXRlbVsnZGF0YS1hZGRpdGlvbmFsJ10pIHtcbiAgICAgICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25BZGRJdGVtJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgICAgICB2YWx1ZTogc2VsZWN0ZWRWYWx1ZVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIF90aGlzLnNlbGVjdEl0ZW1PbkVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBzZWFyY2ggPSBfdGhpcy5wcm9wcy5zZWFyY2g7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUzID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHN0YXRlMy5vcGVuLFxuICAgICAgICAgIHNlbGVjdGVkSW5kZXggPSBfdGhpcyRzdGF0ZTMuc2VsZWN0ZWRJbmRleDtcblxuICAgICAgaWYgKCFvcGVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3VsZFNlbGVjdCA9IGtleWJvYXJkS2V5LmdldENvZGUoZSkgPT09IGtleWJvYXJkS2V5LkVudGVyIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUktUmVhY3QvcHVsbC8zNzY2XG4gICAgICAhc2VhcmNoICYmIGtleWJvYXJkS2V5LmdldENvZGUoZSkgPT09IGtleWJvYXJkS2V5LlNwYWNlYmFyO1xuXG4gICAgICBpZiAoIXNob3VsZFNlbGVjdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdmFyIG9wdGlvblNpemUgPSBfc2l6ZShnZXRNZW51T3B0aW9ucyh7XG4gICAgICAgIHZhbHVlOiBfdGhpcy5zdGF0ZS52YWx1ZSxcbiAgICAgICAgb3B0aW9uczogX3RoaXMucHJvcHMub3B0aW9ucyxcbiAgICAgICAgc2VhcmNoUXVlcnk6IF90aGlzLnN0YXRlLnNlYXJjaFF1ZXJ5LFxuICAgICAgICBhZGRpdGlvbkxhYmVsOiBfdGhpcy5wcm9wcy5hZGRpdGlvbkxhYmVsLFxuICAgICAgICBhZGRpdGlvblBvc2l0aW9uOiBfdGhpcy5wcm9wcy5hZGRpdGlvblBvc2l0aW9uLFxuICAgICAgICBhbGxvd0FkZGl0aW9uczogX3RoaXMucHJvcHMuYWxsb3dBZGRpdGlvbnMsXG4gICAgICAgIGRlYnVycjogX3RoaXMucHJvcHMuZGVidXJyLFxuICAgICAgICBtdWx0aXBsZTogX3RoaXMucHJvcHMubXVsdGlwbGUsXG4gICAgICAgIHNlYXJjaDogX3RoaXMucHJvcHMuc2VhcmNoXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChzZWFyY2ggJiYgb3B0aW9uU2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXh0VmFsdWUgPSBfdGhpcy5tYWtlU2VsZWN0ZWRJdGVtQWN0aXZlKGUsIHNlbGVjdGVkSW5kZXgpOyAvLyBUaGlzIGlzIHJlcXVpcmVkIGFzIHNlbGVjdGVkIHZhbHVlIG1heSBiZSB0aGUgc2FtZVxuXG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRJbmRleDogZ2V0U2VsZWN0ZWRJbmRleCh7XG4gICAgICAgICAgYWRkaXRpb25MYWJlbDogX3RoaXMucHJvcHMuYWRkaXRpb25MYWJlbCxcbiAgICAgICAgICBhZGRpdGlvblBvc2l0aW9uOiBfdGhpcy5wcm9wcy5hZGRpdGlvblBvc2l0aW9uLFxuICAgICAgICAgIGFsbG93QWRkaXRpb25zOiBfdGhpcy5wcm9wcy5hbGxvd0FkZGl0aW9ucyxcbiAgICAgICAgICBkZWJ1cnI6IF90aGlzLnByb3BzLmRlYnVycixcbiAgICAgICAgICBtdWx0aXBsZTogX3RoaXMucHJvcHMubXVsdGlwbGUsXG4gICAgICAgICAgc2VhcmNoOiBfdGhpcy5wcm9wcy5zZWFyY2gsXG4gICAgICAgICAgc2VsZWN0ZWRJbmRleDogc2VsZWN0ZWRJbmRleCxcbiAgICAgICAgICB2YWx1ZTogbmV4dFZhbHVlLFxuICAgICAgICAgIG9wdGlvbnM6IF90aGlzLnByb3BzLm9wdGlvbnMsXG4gICAgICAgICAgc2VhcmNoUXVlcnk6ICcnXG4gICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuY2xvc2VPbkNoYW5nZShlKTtcblxuICAgICAgX3RoaXMuY2xlYXJTZWFyY2hRdWVyeSgpO1xuXG4gICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgIF9pbnZva2UoX3RoaXMuc2VhcmNoUmVmLmN1cnJlbnQsICdmb2N1cycpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmVJdGVtT25CYWNrc3BhY2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHMzLm11bHRpcGxlLFxuICAgICAgICAgIHNlYXJjaCA9IF90aGlzJHByb3BzMy5zZWFyY2g7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU0ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgc2VhcmNoUXVlcnkgPSBfdGhpcyRzdGF0ZTQuc2VhcmNoUXVlcnksXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZTQudmFsdWU7XG4gICAgICBpZiAoa2V5Ym9hcmRLZXkuZ2V0Q29kZShlKSAhPT0ga2V5Ym9hcmRLZXkuQmFja3NwYWNlKSByZXR1cm47XG4gICAgICBpZiAoc2VhcmNoUXVlcnkgfHwgIXNlYXJjaCB8fCAhbXVsdGlwbGUgfHwgX2lzRW1wdHkodmFsdWUpKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIHJlbW92ZSBtb3N0IHJlY2VudCB2YWx1ZVxuXG4gICAgICB2YXIgbmV3VmFsdWUgPSBfZHJvcFJpZ2h0KHZhbHVlKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UoZSwgbmV3VmFsdWUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5jbG9zZU9uRG9jdW1lbnRDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoIV90aGlzLnByb3BzLmNsb3NlT25CbHVyKSByZXR1cm47IC8vIElmIGV2ZW50IGhhcHBlbmVkIGluIHRoZSBkcm9wZG93biwgaWdub3JlIGl0XG5cbiAgICAgIGlmIChfdGhpcy5yZWYuY3VycmVudCAmJiBkb2VzTm9kZUNvbnRhaW5DbGljayhfdGhpcy5yZWYuY3VycmVudCwgZSkpIHJldHVybjtcblxuICAgICAgX3RoaXMuY2xvc2UoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91c2VEb3duJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX3RoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZVVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBfdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlVXApO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbWluQ2hhcmFjdGVycyA9IF90aGlzJHByb3BzNC5taW5DaGFyYWN0ZXJzLFxuICAgICAgICAgIHNlYXJjaCA9IF90aGlzJHByb3BzNC5zZWFyY2g7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU1ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgb3BlbiA9IF90aGlzJHN0YXRlNS5vcGVuLFxuICAgICAgICAgIHNlYXJjaFF1ZXJ5ID0gX3RoaXMkc3RhdGU1LnNlYXJjaFF1ZXJ5O1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DbGljaycsIGUsIF90aGlzLnByb3BzKTsgLy8gcHJldmVudCBjbG9zZU9uRG9jdW1lbnRDbGljaygpXG5cblxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICghc2VhcmNoKSByZXR1cm4gX3RoaXMudG9nZ2xlKGUpO1xuXG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBfaW52b2tlKF90aGlzLnNlYXJjaFJlZi5jdXJyZW50LCAnZm9jdXMnKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWFyY2hRdWVyeS5sZW5ndGggPj0gbWluQ2hhcmFjdGVycyB8fCBtaW5DaGFyYWN0ZXJzID09PSAxKSB7XG4gICAgICAgIF90aGlzLm9wZW4oZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfaW52b2tlKF90aGlzLnNlYXJjaFJlZi5jdXJyZW50LCAnZm9jdXMnKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSWNvbkNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjbGVhcmFibGUgPSBfdGhpcy5wcm9wcy5jbGVhcmFibGU7XG5cbiAgICAgIHZhciBoYXNWYWx1ZSA9IF90aGlzLmhhc1ZhbHVlKCk7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX3RoaXMucHJvcHMpOyAvLyBwcmV2ZW50IGhhbmRsZUNsaWNrKClcblxuXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAoY2xlYXJhYmxlICYmIGhhc1ZhbHVlKSB7XG4gICAgICAgIF90aGlzLmNsZWFyVmFsdWUoZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy50b2dnbGUoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUl0ZW1DbGljayA9IGZ1bmN0aW9uIChlLCBpdGVtKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbXVsdGlwbGUgPSBfdGhpcyRwcm9wczUubXVsdGlwbGUsXG4gICAgICAgICAgc2VhcmNoID0gX3RoaXMkcHJvcHM1LnNlYXJjaDtcbiAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBfdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZW0udmFsdWU7IC8vIHByZXZlbnQgdG9nZ2xlKCkgaW4gaGFuZGxlQ2xpY2soKVxuXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBwcmV2ZW50IGNsb3NlT25Eb2N1bWVudENsaWNrKCkgaWYgbXVsdGlwbGUgb3IgaXRlbSBpcyBkaXNhYmxlZFxuXG4gICAgICBpZiAobXVsdGlwbGUgfHwgaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXRlbS5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0FkZGl0aW9uSXRlbSA9IGl0ZW1bJ2RhdGEtYWRkaXRpb25hbCddO1xuICAgICAgdmFyIG5ld1ZhbHVlID0gbXVsdGlwbGUgPyBfdW5pb24oX3RoaXMuc3RhdGUudmFsdWUsIFt2YWx1ZV0pIDogdmFsdWU7XG4gICAgICB2YXIgdmFsdWVIYXNDaGFuZ2VkID0gbXVsdGlwbGUgPyAhIV9kaWZmZXJlbmNlKG5ld1ZhbHVlLCBjdXJyZW50VmFsdWUpLmxlbmd0aCA6IG5ld1ZhbHVlICE9PSBjdXJyZW50VmFsdWU7IC8vIG5vdGlmeSB0aGUgb25DaGFuZ2UgcHJvcCB0aGF0IHRoZSB1c2VyIGlzIHRyeWluZyB0byBjaGFuZ2UgdmFsdWVcblxuICAgICAgaWYgKHZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLmhhbmRsZUNoYW5nZShlLCBuZXdWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmNsZWFyU2VhcmNoUXVlcnkoKTtcblxuICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICBfaW52b2tlKF90aGlzLnNlYXJjaFJlZi5jdXJyZW50LCAnZm9jdXMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pbnZva2UoX3RoaXMucmVmLmN1cnJlbnQsICdmb2N1cycpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5jbG9zZU9uQ2hhbmdlKGUpOyAvLyBIZWFkcyB1cCEgVGhpcyBldmVudCBoYW5kbGVyIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYG9uQ2hhbmdlYFxuICAgICAgLy8gTm90aWZ5IHRoZSBvbkFkZEl0ZW0gcHJvcCBpZiB0aGlzIGlzIGEgbmV3IHZhbHVlXG5cblxuICAgICAgaWYgKGlzQWRkaXRpb25JdGVtKSB7XG4gICAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkFkZEl0ZW0nLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVGb2N1cyA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgZm9jdXMgPSBfdGhpcy5zdGF0ZS5mb2N1cztcbiAgICAgIGlmIChmb2N1cykgcmV0dXJuO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25Gb2N1cycsIGUsIF90aGlzLnByb3BzKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1czogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUJsdXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gSGVhZHMgdXAhIERvbid0IHJlbW92ZSB0aGlzLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbWFudGljLU9yZy9TZW1hbnRpYy1VSS1SZWFjdC9pc3N1ZXMvMTMxNVxuICAgICAgdmFyIGN1cnJlbnRUYXJnZXQgPSBfZ2V0KGUsICdjdXJyZW50VGFyZ2V0Jyk7XG5cbiAgICAgIGlmIChjdXJyZW50VGFyZ2V0ICYmIGN1cnJlbnRUYXJnZXQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHJldHVybjtcbiAgICAgIHZhciBfdGhpcyRwcm9wczYgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjbG9zZU9uQmx1ciA9IF90aGlzJHByb3BzNi5jbG9zZU9uQmx1cixcbiAgICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzNi5tdWx0aXBsZSxcbiAgICAgICAgICBzZWxlY3RPbkJsdXIgPSBfdGhpcyRwcm9wczYuc2VsZWN0T25CbHVyOyAvLyBkbyBub3QgXCJibHVyXCIgd2hlbiB0aGUgbW91c2UgaXMgZG93biBpbnNpZGUgb2YgdGhlIERyb3Bkb3duXG5cbiAgICAgIGlmIChfdGhpcy5pc01vdXNlRG93bikgcmV0dXJuO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25CbHVyJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICBpZiAoc2VsZWN0T25CbHVyICYmICFtdWx0aXBsZSkge1xuICAgICAgICBfdGhpcy5tYWtlU2VsZWN0ZWRJdGVtQWN0aXZlKGUsIF90aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXgpO1xuXG4gICAgICAgIGlmIChjbG9zZU9uQmx1cikgX3RoaXMuY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBmb2N1czogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5jbGVhclNlYXJjaFF1ZXJ5KCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVNlYXJjaENoYW5nZSA9IGZ1bmN0aW9uIChlLCBfcmVmKSB7XG4gICAgICB2YXIgdmFsdWUgPSBfcmVmLnZhbHVlO1xuICAgICAgLy8gcHJldmVudCBwcm9wYWdhdGluZyB0byB0aGlzLnByb3BzLm9uQ2hhbmdlKClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB2YXIgbWluQ2hhcmFjdGVycyA9IF90aGlzLnByb3BzLm1pbkNoYXJhY3RlcnM7XG4gICAgICB2YXIgb3BlbiA9IF90aGlzLnN0YXRlLm9wZW47XG4gICAgICB2YXIgbmV3UXVlcnkgPSB2YWx1ZTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uU2VhcmNoQ2hhbmdlJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIHNlYXJjaFF1ZXJ5OiBuZXdRdWVyeVxuICAgICAgfSkpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlYXJjaFF1ZXJ5OiBuZXdRdWVyeSxcbiAgICAgICAgc2VsZWN0ZWRJbmRleDogMFxuICAgICAgfSk7IC8vIG9wZW4gc2VhcmNoIGRyb3Bkb3duIG9uIHNlYXJjaCBxdWVyeVxuXG5cbiAgICAgIGlmICghb3BlbiAmJiBuZXdRdWVyeS5sZW5ndGggPj0gbWluQ2hhcmFjdGVycykge1xuICAgICAgICBfdGhpcy5vcGVuKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBjbG9zZSBzZWFyY2ggZHJvcGRvd24gaWYgc2VhcmNoIHF1ZXJ5IGlzIHRvbyBzbWFsbFxuXG5cbiAgICAgIGlmIChvcGVuICYmIG1pbkNoYXJhY3RlcnMgIT09IDEgJiYgbmV3UXVlcnkubGVuZ3RoIDwgbWluQ2hhcmFjdGVycykgX3RoaXMuY2xvc2UoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5tb3ZlU2VsZWN0aW9uT25LZXlEb3duKGUpO1xuXG4gICAgICBfdGhpcy5vcGVuT25BcnJvdyhlKTtcblxuICAgICAgX3RoaXMub3Blbk9uU3BhY2UoZSk7XG5cbiAgICAgIF90aGlzLnNlbGVjdEl0ZW1PbkVudGVyKGUpO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25LZXlEb3duJywgZSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldFNlbGVjdGVkSXRlbSA9IGZ1bmN0aW9uIChzZWxlY3RlZEluZGV4KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IGdldE1lbnVPcHRpb25zKHtcbiAgICAgICAgdmFsdWU6IF90aGlzLnN0YXRlLnZhbHVlLFxuICAgICAgICBvcHRpb25zOiBfdGhpcy5wcm9wcy5vcHRpb25zLFxuICAgICAgICBzZWFyY2hRdWVyeTogX3RoaXMuc3RhdGUuc2VhcmNoUXVlcnksXG4gICAgICAgIGFkZGl0aW9uTGFiZWw6IF90aGlzLnByb3BzLmFkZGl0aW9uTGFiZWwsXG4gICAgICAgIGFkZGl0aW9uUG9zaXRpb246IF90aGlzLnByb3BzLmFkZGl0aW9uUG9zaXRpb24sXG4gICAgICAgIGFsbG93QWRkaXRpb25zOiBfdGhpcy5wcm9wcy5hbGxvd0FkZGl0aW9ucyxcbiAgICAgICAgZGVidXJyOiBfdGhpcy5wcm9wcy5kZWJ1cnIsXG4gICAgICAgIG11bHRpcGxlOiBfdGhpcy5wcm9wcy5tdWx0aXBsZSxcbiAgICAgICAgc2VhcmNoOiBfdGhpcy5wcm9wcy5zZWFyY2hcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIF9nZXQob3B0aW9ucywgXCJbXCIgKyBzZWxlY3RlZEluZGV4ICsgXCJdXCIpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRJdGVtQnlWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBfdGhpcy5wcm9wcy5vcHRpb25zO1xuICAgICAgcmV0dXJuIF9maW5kKG9wdGlvbnMsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0RHJvcGRvd25BcmlhT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczcgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBsb2FkaW5nID0gX3RoaXMkcHJvcHM3LmxvYWRpbmcsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczcuZGlzYWJsZWQsXG4gICAgICAgICAgc2VhcmNoID0gX3RoaXMkcHJvcHM3LnNlYXJjaCxcbiAgICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzNy5tdWx0aXBsZTtcbiAgICAgIHZhciBvcGVuID0gX3RoaXMuc3RhdGUub3BlbjtcbiAgICAgIHZhciBhcmlhT3B0aW9ucyA9IHtcbiAgICAgICAgcm9sZTogc2VhcmNoID8gJ2NvbWJvYm94JyA6ICdsaXN0Ym94JyxcbiAgICAgICAgJ2FyaWEtYnVzeSc6IGxvYWRpbmcsXG4gICAgICAgICdhcmlhLWRpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAgICdhcmlhLWV4cGFuZGVkJzogISFvcGVuXG4gICAgICB9O1xuXG4gICAgICBpZiAoYXJpYU9wdGlvbnMucm9sZSA9PT0gJ2xpc3Rib3gnKSB7XG4gICAgICAgIGFyaWFPcHRpb25zWydhcmlhLW11bHRpc2VsZWN0YWJsZSddID0gbXVsdGlwbGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcmlhT3B0aW9ucztcbiAgICB9O1xuXG4gICAgX3RoaXMuY2xlYXJTZWFyY2hRdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWFyY2hRdWVyeSA9IF90aGlzLnN0YXRlLnNlYXJjaFF1ZXJ5O1xuICAgICAgaWYgKHNlYXJjaFF1ZXJ5ID09PSB1bmRlZmluZWQgfHwgc2VhcmNoUXVlcnkgPT09ICcnKSByZXR1cm47XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VhcmNoUXVlcnk6ICcnXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTGFiZWxDbGljayA9IGZ1bmN0aW9uIChlLCBsYWJlbFByb3BzKSB7XG4gICAgICAvLyBwcmV2ZW50IGZvY3VzaW5nIHNlYXJjaCBpbnB1dCBvbiBjbGlja1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZExhYmVsOiBsYWJlbFByb3BzLnZhbHVlXG4gICAgICB9KTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTGFiZWxDbGljaycsIGUsIGxhYmVsUHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVMYWJlbFJlbW92ZSA9IGZ1bmN0aW9uIChlLCBsYWJlbFByb3BzKSB7XG4gICAgICAvLyBwcmV2ZW50IGZvY3VzaW5nIHNlYXJjaCBpbnB1dCBvbiBjbGlja1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnN0YXRlLnZhbHVlO1xuXG4gICAgICB2YXIgbmV3VmFsdWUgPSBfd2l0aG91dCh2YWx1ZSwgbGFiZWxQcm9wcy52YWx1ZSk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmFsdWU6IG5ld1ZhbHVlXG4gICAgICB9KTtcblxuICAgICAgX3RoaXMuaGFuZGxlQ2hhbmdlKGUsIG5ld1ZhbHVlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0U2VsZWN0ZWRJbmRleEFmdGVyTW92ZSA9IGZ1bmN0aW9uIChvZmZzZXQsIHN0YXJ0SW5kZXgpIHtcbiAgICAgIGlmIChzdGFydEluZGV4ID09PSB2b2lkIDApIHtcbiAgICAgICAgc3RhcnRJbmRleCA9IF90aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHZhciBvcHRpb25zID0gZ2V0TWVudU9wdGlvbnMoe1xuICAgICAgICB2YWx1ZTogX3RoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IF90aGlzLnByb3BzLm9wdGlvbnMsXG4gICAgICAgIHNlYXJjaFF1ZXJ5OiBfdGhpcy5zdGF0ZS5zZWFyY2hRdWVyeSxcbiAgICAgICAgYWRkaXRpb25MYWJlbDogX3RoaXMucHJvcHMuYWRkaXRpb25MYWJlbCxcbiAgICAgICAgYWRkaXRpb25Qb3NpdGlvbjogX3RoaXMucHJvcHMuYWRkaXRpb25Qb3NpdGlvbixcbiAgICAgICAgYWxsb3dBZGRpdGlvbnM6IF90aGlzLnByb3BzLmFsbG93QWRkaXRpb25zLFxuICAgICAgICBkZWJ1cnI6IF90aGlzLnByb3BzLmRlYnVycixcbiAgICAgICAgbXVsdGlwbGU6IF90aGlzLnByb3BzLm11bHRpcGxlLFxuICAgICAgICBzZWFyY2g6IF90aGlzLnByb3BzLnNlYXJjaFxuICAgICAgfSk7IC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcFxuICAgICAgLy8gVE9ETzogcmVtb3ZlIGxlZnQgcGFydCBvZiBjb25kaXRpb24gYWZ0ZXIgY2hpbGRyZW4gQVBJIHdpbGwgYmUgcmVtb3ZlZFxuXG4gICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IF9ldmVyeShvcHRpb25zLCAnZGlzYWJsZWQnKSkgcmV0dXJuO1xuICAgICAgdmFyIGxhc3RJbmRleCA9IG9wdGlvbnMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciB3cmFwU2VsZWN0aW9uID0gX3RoaXMucHJvcHMud3JhcFNlbGVjdGlvbjsgLy8gbmV4dCBpcyBhZnRlciBsYXN0LCB3cmFwIHRvIGJlZ2lubmluZ1xuICAgICAgLy8gbmV4dCBpcyBiZWZvcmUgZmlyc3QsIHdyYXAgdG8gZW5kXG5cbiAgICAgIHZhciBuZXh0SW5kZXggPSBzdGFydEluZGV4ICsgb2Zmc2V0OyAvLyBpZiAnd3JhcFNlbGVjdGlvbicgaXMgc2V0IHRvIGZhbHNlIGFuZCBzZWxlY3Rpb24gaXMgYWZ0ZXIgbGFzdCBvciBiZWZvcmUgZmlyc3QsIGl0IGp1c3QgZG9lcyBub3QgY2hhbmdlXG5cbiAgICAgIGlmICghd3JhcFNlbGVjdGlvbiAmJiAobmV4dEluZGV4ID4gbGFzdEluZGV4IHx8IG5leHRJbmRleCA8IDApKSB7XG4gICAgICAgIG5leHRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICB9IGVsc2UgaWYgKG5leHRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICBuZXh0SW5kZXggPSAwO1xuICAgICAgfSBlbHNlIGlmIChuZXh0SW5kZXggPCAwKSB7XG4gICAgICAgIG5leHRJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnNbbmV4dEluZGV4XS5kaXNhYmxlZCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuZ2V0U2VsZWN0ZWRJbmRleEFmdGVyTW92ZShvZmZzZXQsIG5leHRJbmRleCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUljb25PdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICB2YXIgY2xlYXJhYmxlID0gX3RoaXMucHJvcHMuY2xlYXJhYmxlO1xuICAgICAgdmFyIGNsYXNzZXMgPSBjeChjbGVhcmFibGUgJiYgX3RoaXMuaGFzVmFsdWUoKSAmJiAnY2xlYXInLCBwcmVkZWZpbmVkUHJvcHMuY2xhc3NOYW1lKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgX2ludm9rZShwcmVkZWZpbmVkUHJvcHMsICdvbkNsaWNrJywgZSwgcHJlZGVmaW5lZFByb3BzKTtcblxuICAgICAgICAgIF90aGlzLmhhbmRsZUljb25DbGljayhlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuY2xlYXJWYWx1ZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBfdGhpcy5wcm9wcy5tdWx0aXBsZTtcbiAgICAgIHZhciBuZXdWYWx1ZSA9IG11bHRpcGxlID8gW10gOiAnJztcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2YWx1ZTogbmV3VmFsdWVcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5oYW5kbGVDaGFuZ2UoZSwgbmV3VmFsdWUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5jb21wdXRlU2VhcmNoSW5wdXRUYWJJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczggPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzOC5kaXNhYmxlZCxcbiAgICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzOC50YWJJbmRleDtcbiAgICAgIGlmICghX2lzTmlsKHRhYkluZGV4KSkgcmV0dXJuIHRhYkluZGV4O1xuICAgICAgcmV0dXJuIGRpc2FibGVkID8gLTEgOiAwO1xuICAgIH07XG5cbiAgICBfdGhpcy5jb21wdXRlU2VhcmNoSW5wdXRXaWR0aCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZWFyY2hRdWVyeSA9IF90aGlzLnN0YXRlLnNlYXJjaFF1ZXJ5O1xuXG4gICAgICBpZiAoX3RoaXMuc2l6ZXJSZWYuY3VycmVudCAmJiBzZWFyY2hRdWVyeSkge1xuICAgICAgICAvLyByZXNpemUgdGhlIHNlYXJjaCBpbnB1dCwgdGVtcG9yYXJpbHkgc2hvdyB0aGUgc2l6ZXIgc28gd2UgY2FuIG1lYXN1cmUgaXRcbiAgICAgICAgX3RoaXMuc2l6ZXJSZWYuY3VycmVudC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XG4gICAgICAgIF90aGlzLnNpemVyUmVmLmN1cnJlbnQudGV4dENvbnRlbnQgPSBzZWFyY2hRdWVyeTtcbiAgICAgICAgdmFyIHNlYXJjaFdpZHRoID0gTWF0aC5jZWlsKF90aGlzLnNpemVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgpO1xuXG4gICAgICAgIF90aGlzLnNpemVyUmVmLmN1cnJlbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2Rpc3BsYXknKTtcblxuICAgICAgICByZXR1cm4gc2VhcmNoV2lkdGg7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmNvbXB1dGVUYWJJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczkgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzOS5kaXNhYmxlZCxcbiAgICAgICAgICBzZWFyY2ggPSBfdGhpcyRwcm9wczkuc2VhcmNoLFxuICAgICAgICAgIHRhYkluZGV4ID0gX3RoaXMkcHJvcHM5LnRhYkluZGV4OyAvLyBkb24ndCBzZXQgYSByb290IG5vZGUgdGFiSW5kZXggYXMgdGhlIHNlYXJjaCBpbnB1dCBoYXMgaXRzIG93biB0YWJJbmRleFxuXG4gICAgICBpZiAoc2VhcmNoKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm4gLTE7XG4gICAgICByZXR1cm4gX2lzTmlsKHRhYkluZGV4KSA/IDAgOiB0YWJJbmRleDtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlU2VhcmNoSW5wdXRPdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gb25DaGFuZ2UoZSwgaW5wdXRQcm9wcykge1xuICAgICAgICAgIF9pbnZva2UocHJlZGVmaW5lZFByb3BzLCAnb25DaGFuZ2UnLCBlLCBpbnB1dFByb3BzKTtcblxuICAgICAgICAgIF90aGlzLmhhbmRsZVNlYXJjaENoYW5nZShlLCBpbnB1dFByb3BzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFzVmFsdWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbXVsdGlwbGUgPSBfdGhpcy5wcm9wcy5tdWx0aXBsZTtcbiAgICAgIHZhciB2YWx1ZSA9IF90aGlzLnN0YXRlLnZhbHVlO1xuICAgICAgcmV0dXJuIG11bHRpcGxlID8gIV9pc0VtcHR5KHZhbHVlKSA6ICFfaXNOaWwodmFsdWUpICYmIHZhbHVlICE9PSAnJztcbiAgICB9O1xuXG4gICAgX3RoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLnJlZi5jdXJyZW50KSByZXR1cm47XG5cbiAgICAgIHZhciBtZW51ID0gX3RoaXMucmVmLmN1cnJlbnQucXVlcnlTZWxlY3RvcignLm1lbnUudmlzaWJsZScpO1xuXG4gICAgICBpZiAoIW1lbnUpIHJldHVybjtcbiAgICAgIHZhciBpdGVtID0gbWVudS5xdWVyeVNlbGVjdG9yKCcuaXRlbS5zZWxlY3RlZCcpO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG4gICAgICB2YXIgaXNPdXRPZlVwcGVyVmlldyA9IGl0ZW0ub2Zmc2V0VG9wIDwgbWVudS5zY3JvbGxUb3A7XG4gICAgICB2YXIgaXNPdXRPZkxvd2VyVmlldyA9IGl0ZW0ub2Zmc2V0VG9wICsgaXRlbS5jbGllbnRIZWlnaHQgPiBtZW51LnNjcm9sbFRvcCArIG1lbnUuY2xpZW50SGVpZ2h0O1xuXG4gICAgICBpZiAoaXNPdXRPZlVwcGVyVmlldykge1xuICAgICAgICBtZW51LnNjcm9sbFRvcCA9IGl0ZW0ub2Zmc2V0VG9wO1xuICAgICAgfSBlbHNlIGlmIChpc091dE9mTG93ZXJWaWV3KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1taXhlZC1vcGVyYXRvcnNcbiAgICAgICAgbWVudS5zY3JvbGxUb3AgPSBpdGVtLm9mZnNldFRvcCArIGl0ZW0uY2xpZW50SGVpZ2h0IC0gbWVudS5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNldE9wZW5EaXJlY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLnJlZi5jdXJyZW50KSByZXR1cm47XG5cbiAgICAgIHZhciBtZW51ID0gX3RoaXMucmVmLmN1cnJlbnQucXVlcnlTZWxlY3RvcignLm1lbnUudmlzaWJsZScpO1xuXG4gICAgICBpZiAoIW1lbnUpIHJldHVybjtcblxuICAgICAgdmFyIGRyb3Bkb3duUmVjdCA9IF90aGlzLnJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICB2YXIgbWVudUhlaWdodCA9IG1lbnUuY2xpZW50SGVpZ2h0O1xuICAgICAgdmFyIHNwYWNlQXRUaGVCb3R0b20gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gZHJvcGRvd25SZWN0LnRvcCAtIGRyb3Bkb3duUmVjdC5oZWlnaHQgLSBtZW51SGVpZ2h0O1xuICAgICAgdmFyIHNwYWNlQXRUaGVUb3AgPSBkcm9wZG93blJlY3QudG9wIC0gbWVudUhlaWdodDtcbiAgICAgIHZhciB1cHdhcmQgPSBzcGFjZUF0VGhlQm90dG9tIDwgMCAmJiBzcGFjZUF0VGhlVG9wID4gc3BhY2VBdFRoZUJvdHRvbTsgLy8gc2V0IHN0YXRlIG9ubHkgaWYgdGhlcmUncyBhIHJlbGV2YW50IGRpZmZlcmVuY2VcblxuICAgICAgaWYgKCF1cHdhcmQgIT09ICFfdGhpcy5zdGF0ZS51cHdhcmQpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHVwd2FyZDogdXB3YXJkXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5vcGVuID0gZnVuY3Rpb24gKGUsIHRyaWdnZXJTZXRTdGF0ZSkge1xuICAgICAgaWYgKGUgPT09IHZvaWQgMCkge1xuICAgICAgICBlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyaWdnZXJTZXRTdGF0ZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHRyaWdnZXJTZXRTdGF0ZSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBfdGhpcyRwcm9wczEwID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczEwLmRpc2FibGVkLFxuICAgICAgICAgIHNlYXJjaCA9IF90aGlzJHByb3BzMTAuc2VhcmNoO1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47XG4gICAgICBpZiAoc2VhcmNoKSBfaW52b2tlKF90aGlzLnNlYXJjaFJlZi5jdXJyZW50LCAnZm9jdXMnKTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uT3BlbicsIGUsIF90aGlzLnByb3BzKTtcblxuICAgICAgaWYgKHRyaWdnZXJTZXRTdGF0ZSkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuY2xvc2UgPSBmdW5jdGlvbiAoZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChjYWxsYmFjayA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNhbGxiYWNrID0gX3RoaXMuaGFuZGxlQ2xvc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5zdGF0ZS5vcGVuKSB7XG4gICAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsb3NlJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgICB9LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGhhc1NlYXJjaEZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gX3RoaXMuc2VhcmNoUmVmLmN1cnJlbnQ7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUktUmVhY3QvaXNzdWVzLzYyN1xuICAgICAgLy8gQmx1ciB0aGUgRHJvcGRvd24gb24gY2xvc2Ugc28gaXQgaXMgYmx1cnJlZCBhZnRlciBzZWxlY3RpbmcgYW4gaXRlbS5cbiAgICAgIC8vIFRoaXMgaXMgdG8gcHJldmVudCBpdCBmcm9tIHJlLW9wZW5pbmcgd2hlbiBzd2l0Y2hpbmcgdGFicyBhZnRlciBzZWxlY3RpbmcgYW4gaXRlbS5cblxuICAgICAgaWYgKCFoYXNTZWFyY2hGb2N1cyAmJiBfdGhpcy5yZWYuY3VycmVudCkge1xuICAgICAgICBfdGhpcy5yZWYuY3VycmVudC5ibHVyKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBoYXNEcm9wZG93bkZvY3VzID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gX3RoaXMucmVmLmN1cnJlbnQ7XG4gICAgICB2YXIgaGFzRm9jdXMgPSBoYXNTZWFyY2hGb2N1cyB8fCBoYXNEcm9wZG93bkZvY3VzOyAvLyBXZSBuZWVkIHRvIGtlZXAgdGhlIHZpcnR1YWwgbW9kZWwgaW4gc3luYyB3aXRoIHRoZSBicm93c2VyIGZvY3VzIGNoYW5nZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbWFudGljLU9yZy9TZW1hbnRpYy1VSS1SZWFjdC9pc3N1ZXMvNjkyXG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZm9jdXM6IGhhc0ZvY3VzXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMudG9nZ2xlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdGF0ZS5vcGVuID8gX3RoaXMuY2xvc2UoZSkgOiBfdGhpcy5vcGVuKGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMTEgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzMTEubXVsdGlwbGUsXG4gICAgICAgICAgcGxhY2Vob2xkZXIgPSBfdGhpcyRwcm9wczExLnBsYWNlaG9sZGVyLFxuICAgICAgICAgIHNlYXJjaCA9IF90aGlzJHByb3BzMTEuc2VhcmNoLFxuICAgICAgICAgIHRleHQgPSBfdGhpcyRwcm9wczExLnRleHQ7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU2ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgc2VhcmNoUXVlcnkgPSBfdGhpcyRzdGF0ZTYuc2VhcmNoUXVlcnksXG4gICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IF90aGlzJHN0YXRlNi5zZWxlY3RlZEluZGV4LFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkc3RhdGU2LnZhbHVlLFxuICAgICAgICAgIG9wZW4gPSBfdGhpcyRzdGF0ZTYub3BlbjtcblxuICAgICAgdmFyIGhhc1ZhbHVlID0gX3RoaXMuaGFzVmFsdWUoKTtcblxuICAgICAgdmFyIGNsYXNzZXMgPSBjeChwbGFjZWhvbGRlciAmJiAhaGFzVmFsdWUgJiYgJ2RlZmF1bHQnLCAndGV4dCcsIHNlYXJjaCAmJiBzZWFyY2hRdWVyeSAmJiAnZmlsdGVyZWQnKTtcbiAgICAgIHZhciBfdGV4dCA9IHBsYWNlaG9sZGVyO1xuICAgICAgdmFyIHNlbGVjdGVkSXRlbTtcblxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgX3RleHQgPSB0ZXh0O1xuICAgICAgfSBlbHNlIGlmIChvcGVuICYmICFtdWx0aXBsZSkge1xuICAgICAgICBzZWxlY3RlZEl0ZW0gPSBfdGhpcy5nZXRTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJbmRleCk7XG4gICAgICB9IGVsc2UgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgIHNlbGVjdGVkSXRlbSA9IF90aGlzLmdldEl0ZW1CeVZhbHVlKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIERyb3Bkb3duVGV4dC5jcmVhdGUoc2VsZWN0ZWRJdGVtID8gcmVuZGVySXRlbUNvbnRlbnQoc2VsZWN0ZWRJdGVtKSA6IF90ZXh0LCB7XG4gICAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyU2VhcmNoSW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHNlYXJjaCA9IF90aGlzJHByb3BzMTIuc2VhcmNoLFxuICAgICAgICAgIHNlYXJjaElucHV0ID0gX3RoaXMkcHJvcHMxMi5zZWFyY2hJbnB1dDtcbiAgICAgIHZhciBzZWFyY2hRdWVyeSA9IF90aGlzLnN0YXRlLnNlYXJjaFF1ZXJ5O1xuICAgICAgcmV0dXJuIHNlYXJjaCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWYsIHtcbiAgICAgICAgaW5uZXJSZWY6IF90aGlzLnNlYXJjaFJlZlxuICAgICAgfSwgRHJvcGRvd25TZWFyY2hJbnB1dC5jcmVhdGUoc2VhcmNoSW5wdXQsIHtcbiAgICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIHdpZHRoOiBfdGhpcy5jb21wdXRlU2VhcmNoSW5wdXRXaWR0aCgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YWJJbmRleDogX3RoaXMuY29tcHV0ZVNlYXJjaElucHV0VGFiSW5kZXgoKSxcbiAgICAgICAgICB2YWx1ZTogc2VhcmNoUXVlcnlcbiAgICAgICAgfSxcbiAgICAgICAgb3ZlcnJpZGVQcm9wczogX3RoaXMuaGFuZGxlU2VhcmNoSW5wdXRPdmVycmlkZXNcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyU2VhcmNoU2l6ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHNlYXJjaCA9IF90aGlzJHByb3BzMTMuc2VhcmNoLFxuICAgICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHMxMy5tdWx0aXBsZTtcbiAgICAgIHJldHVybiBzZWFyY2ggJiYgbXVsdGlwbGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInNpemVyXCIsXG4gICAgICAgIHJlZjogX3RoaXMuc2l6ZXJSZWZcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJMYWJlbHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxNCA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHMxNC5tdWx0aXBsZSxcbiAgICAgICAgICByZW5kZXJMYWJlbCA9IF90aGlzJHByb3BzMTQucmVuZGVyTGFiZWw7XG4gICAgICB2YXIgX3RoaXMkc3RhdGU3ID0gX3RoaXMuc3RhdGUsXG4gICAgICAgICAgc2VsZWN0ZWRMYWJlbCA9IF90aGlzJHN0YXRlNy5zZWxlY3RlZExhYmVsLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkc3RhdGU3LnZhbHVlO1xuXG4gICAgICBpZiAoIW11bHRpcGxlIHx8IF9pc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzZWxlY3RlZEl0ZW1zID0gX21hcCh2YWx1ZSwgX3RoaXMuZ2V0SXRlbUJ5VmFsdWUpO1xuXG4gICAgICAvLyBpZiBubyBpdGVtIGNvdWxkIGJlIGZvdW5kIGZvciBhIGdpdmVuIHN0YXRlIHZhbHVlIHRoZSBzZWxlY3RlZCBpdGVtIHdpbGwgYmUgdW5kZWZpbmVkXG4gICAgICAvLyBjb21wYWN0IHRoZSBzZWxlY3RlZEl0ZW1zIHNvIHdlIG9ubHkgaGF2ZSBhY3R1YWwgb2JqZWN0cyBsZWZ0XG4gICAgICByZXR1cm4gX21hcChfY29tcGFjdChzZWxlY3RlZEl0ZW1zKSwgZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgIHZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICAgICAgICAgYWN0aXZlOiBpdGVtLnZhbHVlID09PSBzZWxlY3RlZExhYmVsLFxuICAgICAgICAgIGFzOiAnYScsXG4gICAgICAgICAga2V5OiBnZXRLZXlPclZhbHVlKGl0ZW0ua2V5LCBpdGVtLnZhbHVlKSxcbiAgICAgICAgICBvbkNsaWNrOiBfdGhpcy5oYW5kbGVMYWJlbENsaWNrLFxuICAgICAgICAgIG9uUmVtb3ZlOiBfdGhpcy5oYW5kbGVMYWJlbFJlbW92ZSxcbiAgICAgICAgICB2YWx1ZTogaXRlbS52YWx1ZVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gTGFiZWwuY3JlYXRlKHJlbmRlckxhYmVsKGl0ZW0sIGluZGV4LCBkZWZhdWx0UHJvcHMpLCB7XG4gICAgICAgICAgZGVmYXVsdFByb3BzOiBkZWZhdWx0UHJvcHNcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczE1ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbGF6eUxvYWQgPSBfdGhpcyRwcm9wczE1LmxhenlMb2FkLFxuICAgICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHMxNS5tdWx0aXBsZSxcbiAgICAgICAgICBzZWFyY2ggPSBfdGhpcyRwcm9wczE1LnNlYXJjaCxcbiAgICAgICAgICBub1Jlc3VsdHNNZXNzYWdlID0gX3RoaXMkcHJvcHMxNS5ub1Jlc3VsdHNNZXNzYWdlO1xuICAgICAgdmFyIF90aGlzJHN0YXRlOCA9IF90aGlzLnN0YXRlLFxuICAgICAgICAgIG9wZW4gPSBfdGhpcyRzdGF0ZTgub3BlbixcbiAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gX3RoaXMkc3RhdGU4LnNlbGVjdGVkSW5kZXgsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRzdGF0ZTgudmFsdWU7IC8vIGxhenkgbG9hZCwgb25seSByZW5kZXIgb3B0aW9ucyB3aGVuIG9wZW5cblxuICAgICAgaWYgKGxhenlMb2FkICYmICFvcGVuKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBvcHRpb25zID0gZ2V0TWVudU9wdGlvbnMoe1xuICAgICAgICB2YWx1ZTogX3RoaXMuc3RhdGUudmFsdWUsXG4gICAgICAgIG9wdGlvbnM6IF90aGlzLnByb3BzLm9wdGlvbnMsXG4gICAgICAgIHNlYXJjaFF1ZXJ5OiBfdGhpcy5zdGF0ZS5zZWFyY2hRdWVyeSxcbiAgICAgICAgYWRkaXRpb25MYWJlbDogX3RoaXMucHJvcHMuYWRkaXRpb25MYWJlbCxcbiAgICAgICAgYWRkaXRpb25Qb3NpdGlvbjogX3RoaXMucHJvcHMuYWRkaXRpb25Qb3NpdGlvbixcbiAgICAgICAgYWxsb3dBZGRpdGlvbnM6IF90aGlzLnByb3BzLmFsbG93QWRkaXRpb25zLFxuICAgICAgICBkZWJ1cnI6IF90aGlzLnByb3BzLmRlYnVycixcbiAgICAgICAgbXVsdGlwbGU6IF90aGlzLnByb3BzLm11bHRpcGxlLFxuICAgICAgICBzZWFyY2g6IF90aGlzLnByb3BzLnNlYXJjaFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChub1Jlc3VsdHNNZXNzYWdlICE9PSBudWxsICYmIHNlYXJjaCAmJiBfaXNFbXB0eShvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogXCJtZXNzYWdlXCJcbiAgICAgICAgfSwgbm9SZXN1bHRzTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0FjdGl2ZSA9IG11bHRpcGxlID8gZnVuY3Rpb24gKG9wdFZhbHVlKSB7XG4gICAgICAgIHJldHVybiBfaW5jbHVkZXModmFsdWUsIG9wdFZhbHVlKTtcbiAgICAgIH0gOiBmdW5jdGlvbiAob3B0VmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG9wdFZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH07XG4gICAgICByZXR1cm4gX21hcChvcHRpb25zLCBmdW5jdGlvbiAob3B0LCBpKSB7XG4gICAgICAgIHJldHVybiBEcm9wZG93bkl0ZW0uY3JlYXRlKF9leHRlbmRzKHtcbiAgICAgICAgICBhY3RpdmU6IGlzQWN0aXZlKG9wdC52YWx1ZSksXG4gICAgICAgICAgb25DbGljazogX3RoaXMuaGFuZGxlSXRlbUNsaWNrLFxuICAgICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZEluZGV4ID09PSBpXG4gICAgICAgIH0sIG9wdCwge1xuICAgICAgICAgIGtleTogZ2V0S2V5T3JWYWx1ZShvcHQua2V5LCBvcHQudmFsdWUpLFxuICAgICAgICAgIC8vIE5lZWRlZCBmb3IgaGFuZGxpbmcgY2xpY2sgZXZlbnRzIG9uIGRpc2FibGVkIGl0ZW1zXG4gICAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBvcHQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdhbGwnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlck1lbnUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMxNiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMxNi5jaGlsZHJlbixcbiAgICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wczE2LmRpcmVjdGlvbixcbiAgICAgICAgICBoZWFkZXIgPSBfdGhpcyRwcm9wczE2LmhlYWRlcjtcbiAgICAgIHZhciBvcGVuID0gX3RoaXMuc3RhdGUub3BlbjtcblxuICAgICAgdmFyIGFyaWFPcHRpb25zID0gX3RoaXMuZ2V0RHJvcGRvd25NZW51QXJpYU9wdGlvbnMoKTsgLy8gc2luZ2xlIG1lbnUgY2hpbGRcblxuXG4gICAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICAgIHZhciBtZW51Q2hpbGQgPSBDaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGN4KGRpcmVjdGlvbiwgdXNlS2V5T25seShvcGVuLCAndmlzaWJsZScpLCBtZW51Q2hpbGQucHJvcHMuY2xhc3NOYW1lKTtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQobWVudUNoaWxkLCBfZXh0ZW5kcyh7XG4gICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICAgICAgfSwgYXJpYU9wdGlvbnMpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERyb3Bkb3duTWVudSwgX2V4dGVuZHMoe30sIGFyaWFPcHRpb25zLCB7XG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uLFxuICAgICAgICBvcGVuOiBvcGVuXG4gICAgICB9KSwgRHJvcGRvd25IZWFkZXIuY3JlYXRlKGhlYWRlciwge1xuICAgICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgICB9KSwgX3RoaXMucmVuZGVyT3B0aW9ucygpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IERyb3Bkb3duLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0SW5pdGlhbEF1dG9Db250cm9sbGVkU3RhdGUgPSBmdW5jdGlvbiBnZXRJbml0aWFsQXV0b0NvbnRyb2xsZWRTdGF0ZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9jdXM6IGZhbHNlLFxuICAgICAgc2VhcmNoUXVlcnk6ICcnXG4gICAgfTtcbiAgfTtcblxuICBEcm9wZG93bi5nZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0QXV0b0NvbnRyb2xsZWRTdGF0ZUZyb21Qcm9wcyhuZXh0UHJvcHMsIGNvbXB1dGVkU3RhdGUsIHByZXZTdGF0ZSkge1xuICAgIC8vIFRoZXNlIHZhbHVlcyBhcmUgc3RvcmVkIG9ubHkgZm9yIGEgY29tcGFyaXNvbiBvbiBuZXh0IGdldEF1dG9Db250cm9sbGVkU3RhdGVGcm9tUHJvcHMoKVxuICAgIHZhciBkZXJpdmVkU3RhdGUgPSB7XG4gICAgICBfX29wdGlvbnM6IG5leHRQcm9wcy5vcHRpb25zLFxuICAgICAgX192YWx1ZTogY29tcHV0ZWRTdGF0ZS52YWx1ZVxuICAgIH07IC8vIFRoZSBzZWxlY3RlZCBpbmRleCBpcyBvbmx5IGRlcGVuZGVudDpcblxuICAgIHZhciBzaG91bGRDb21wdXRlU2VsZWN0ZWRJbmRleCA9IC8vIE9uIHZhbHVlIGNoYW5nZVxuICAgICFzaGFsbG93RXF1YWwocHJldlN0YXRlLl9fdmFsdWUsIGNvbXB1dGVkU3RhdGUudmFsdWUpIHx8IC8vIE9uIG9wdGlvbiBrZXlzL3ZhbHVlcywgd2Ugb25seSBjaGVjayB0aG9zZSBwcm9wZXJ0aWVzIHRvIGF2b2lkIHJlY3Vyc2l2ZSBwZXJmb3JtYW5jZSBpbXBhY3RzLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUktUmVhY3QvaXNzdWVzLzMwMDBcbiAgICAhX2lzRXF1YWwoZ2V0S2V5QW5kVmFsdWVzKG5leHRQcm9wcy5vcHRpb25zKSwgZ2V0S2V5QW5kVmFsdWVzKHByZXZTdGF0ZS5fX29wdGlvbnMpKTtcblxuICAgIGlmIChzaG91bGRDb21wdXRlU2VsZWN0ZWRJbmRleCkge1xuICAgICAgZGVyaXZlZFN0YXRlLnNlbGVjdGVkSW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KHtcbiAgICAgICAgYWRkaXRpb25MYWJlbDogbmV4dFByb3BzLmFkZGl0aW9uTGFiZWwsXG4gICAgICAgIGFkZGl0aW9uUG9zaXRpb246IG5leHRQcm9wcy5hZGRpdGlvblBvc2l0aW9uLFxuICAgICAgICBhbGxvd0FkZGl0aW9uczogbmV4dFByb3BzLmFsbG93QWRkaXRpb25zLFxuICAgICAgICBkZWJ1cnI6IG5leHRQcm9wcy5kZWJ1cnIsXG4gICAgICAgIG11bHRpcGxlOiBuZXh0UHJvcHMubXVsdGlwbGUsXG4gICAgICAgIHNlYXJjaDogbmV4dFByb3BzLnNlYXJjaCxcbiAgICAgICAgc2VsZWN0ZWRJbmRleDogY29tcHV0ZWRTdGF0ZS5zZWxlY3RlZEluZGV4LFxuICAgICAgICB2YWx1ZTogY29tcHV0ZWRTdGF0ZS52YWx1ZSxcbiAgICAgICAgb3B0aW9uczogbmV4dFByb3BzLm9wdGlvbnMsXG4gICAgICAgIHNlYXJjaFF1ZXJ5OiBjb21wdXRlZFN0YXRlLnNlYXJjaFF1ZXJ5XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVyaXZlZFN0YXRlO1xuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBvcGVuID0gdGhpcy5zdGF0ZS5vcGVuO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMub3BlbihudWxsLCBmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbChuZXh0UHJvcHMsIHRoaXMucHJvcHMpIHx8ICFzaGFsbG93RXF1YWwobmV4dFN0YXRlLCB0aGlzLnN0YXRlKTtcbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjb21wbGV4aXR5XG4gICAgdmFyIF90aGlzJHByb3BzMTcgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbG9zZU9uQmx1ciA9IF90aGlzJHByb3BzMTcuY2xvc2VPbkJsdXIsXG4gICAgICAgIG1pbkNoYXJhY3RlcnMgPSBfdGhpcyRwcm9wczE3Lm1pbkNoYXJhY3RlcnMsXG4gICAgICAgIG9wZW5PbkZvY3VzID0gX3RoaXMkcHJvcHMxNy5vcGVuT25Gb2N1cyxcbiAgICAgICAgc2VhcmNoID0gX3RoaXMkcHJvcHMxNy5zZWFyY2g7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIGluIGRldmVsb3BtZW50LCB2YWxpZGF0ZSB2YWx1ZSB0eXBlIG1hdGNoZXMgZHJvcGRvd24gdHlwZVxuICAgICAgdmFyIGlzTmV4dFZhbHVlQXJyYXkgPSBBcnJheS5pc0FycmF5KHRoaXMucHJvcHMudmFsdWUpO1xuXG4gICAgICB2YXIgaGFzVmFsdWUgPSBfaGFzKHRoaXMucHJvcHMsICd2YWx1ZScpO1xuXG4gICAgICBpZiAoaGFzVmFsdWUgJiYgdGhpcy5wcm9wcy5tdWx0aXBsZSAmJiAhaXNOZXh0VmFsdWVBcnJheSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdEcm9wZG93biBgdmFsdWVgIG11c3QgYmUgYW4gYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldC4nICsgKFwiIFJlY2VpdmVkIHR5cGU6IGBcIiArIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzLnByb3BzLnZhbHVlKSArIFwiYC5cIikpO1xuICAgICAgfSBlbHNlIGlmIChoYXNWYWx1ZSAmJiAhdGhpcy5wcm9wcy5tdWx0aXBsZSAmJiBpc05leHRWYWx1ZUFycmF5KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Ryb3Bkb3duIGB2YWx1ZWAgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIG5vdCBzZXQuJyArICcgRWl0aGVyIHNldCBgbXVsdGlwbGU9e3RydWV9YCBvciB1c2UgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlLicpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAvLyBmb2N1c2VkIC8gYmx1cnJlZFxuXG5cbiAgICBpZiAoIXByZXZTdGF0ZS5mb2N1cyAmJiB0aGlzLnN0YXRlLmZvY3VzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNNb3VzZURvd24pIHtcbiAgICAgICAgdmFyIG9wZW5hYmxlID0gIXNlYXJjaCB8fCBzZWFyY2ggJiYgbWluQ2hhcmFjdGVycyA9PT0gMSAmJiAhdGhpcy5zdGF0ZS5vcGVuO1xuICAgICAgICBpZiAob3Blbk9uRm9jdXMgJiYgb3BlbmFibGUpIHRoaXMub3BlbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJldlN0YXRlLmZvY3VzICYmICF0aGlzLnN0YXRlLmZvY3VzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNNb3VzZURvd24gJiYgY2xvc2VPbkJsdXIpIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0gLy8gb3BlbmVkIC8gY2xvc2VkXG5cblxuICAgIGlmICghcHJldlN0YXRlLm9wZW4gJiYgdGhpcy5zdGF0ZS5vcGVuKSB7XG4gICAgICB0aGlzLnNldE9wZW5EaXJlY3Rpb24oKTtcbiAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcoKTtcbiAgICB9IGVsc2UgaWYgKHByZXZTdGF0ZS5vcGVuICYmICF0aGlzLnN0YXRlLm9wZW4pIHt9XG5cbiAgICBpZiAocHJldlN0YXRlLnNlbGVjdGVkSW5kZXggIT09IHRoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleCkge1xuICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldygpO1xuICAgIH1cbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIERvY3VtZW50IEV2ZW50IEhhbmRsZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gb25DaGFuZ2UgbmVlZHMgdG8gcmVjZWl2ZSBhIHZhbHVlXG4gIC8vIGNhbid0IHJlbHkgb24gcHJvcHMudmFsdWUgaWYgd2UgYXJlIGNvbnRyb2xsZWRcbiAgO1xuXG4gIF9wcm90by5nZXREcm9wZG93bk1lbnVBcmlhT3B0aW9ucyA9IGZ1bmN0aW9uIGdldERyb3Bkb3duTWVudUFyaWFPcHRpb25zKCkge1xuICAgIHZhciBfdGhpcyRwcm9wczE4ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2VhcmNoID0gX3RoaXMkcHJvcHMxOC5zZWFyY2gsXG4gICAgICAgIG11bHRpcGxlID0gX3RoaXMkcHJvcHMxOC5tdWx0aXBsZTtcbiAgICB2YXIgYXJpYU9wdGlvbnMgPSB7fTtcblxuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIGFyaWFPcHRpb25zWydhcmlhLW11bHRpc2VsZWN0YWJsZSddID0gbXVsdGlwbGU7XG4gICAgICBhcmlhT3B0aW9ucy5yb2xlID0gJ2xpc3Rib3gnO1xuICAgIH1cblxuICAgIHJldHVybiBhcmlhT3B0aW9ucztcbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFNldHRlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICA7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMxOSA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJhc2ljID0gX3RoaXMkcHJvcHMxOS5iYXNpYyxcbiAgICAgICAgYnV0dG9uID0gX3RoaXMkcHJvcHMxOS5idXR0b24sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMTkuY2xhc3NOYW1lLFxuICAgICAgICBjb21wYWN0ID0gX3RoaXMkcHJvcHMxOS5jb21wYWN0LFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMTkuZGlzYWJsZWQsXG4gICAgICAgIGVycm9yID0gX3RoaXMkcHJvcHMxOS5lcnJvcixcbiAgICAgICAgZmx1aWQgPSBfdGhpcyRwcm9wczE5LmZsdWlkLFxuICAgICAgICBmbG9hdGluZyA9IF90aGlzJHByb3BzMTkuZmxvYXRpbmcsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wczE5Lmljb24sXG4gICAgICAgIGlubGluZSA9IF90aGlzJHByb3BzMTkuaW5saW5lLFxuICAgICAgICBpdGVtID0gX3RoaXMkcHJvcHMxOS5pdGVtLFxuICAgICAgICBsYWJlbGVkID0gX3RoaXMkcHJvcHMxOS5sYWJlbGVkLFxuICAgICAgICBsb2FkaW5nID0gX3RoaXMkcHJvcHMxOS5sb2FkaW5nLFxuICAgICAgICBtdWx0aXBsZSA9IF90aGlzJHByb3BzMTkubXVsdGlwbGUsXG4gICAgICAgIHBvaW50aW5nID0gX3RoaXMkcHJvcHMxOS5wb2ludGluZyxcbiAgICAgICAgc2VhcmNoID0gX3RoaXMkcHJvcHMxOS5zZWFyY2gsXG4gICAgICAgIHNlbGVjdGlvbiA9IF90aGlzJHByb3BzMTkuc2VsZWN0aW9uLFxuICAgICAgICBzY3JvbGxpbmcgPSBfdGhpcyRwcm9wczE5LnNjcm9sbGluZyxcbiAgICAgICAgc2ltcGxlID0gX3RoaXMkcHJvcHMxOS5zaW1wbGUsXG4gICAgICAgIHRyaWdnZXIgPSBfdGhpcyRwcm9wczE5LnRyaWdnZXI7XG4gICAgdmFyIF90aGlzJHN0YXRlOSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGZvY3VzID0gX3RoaXMkc3RhdGU5LmZvY3VzLFxuICAgICAgICBvcGVuID0gX3RoaXMkc3RhdGU5Lm9wZW4sXG4gICAgICAgIHVwd2FyZCA9IF90aGlzJHN0YXRlOS51cHdhcmQ7IC8vIENsYXNzZXNcblxuICAgIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShvcGVuLCAnYWN0aXZlIHZpc2libGUnKSwgdXNlS2V5T25seShkaXNhYmxlZCwgJ2Rpc2FibGVkJyksIHVzZUtleU9ubHkoZXJyb3IsICdlcnJvcicpLCB1c2VLZXlPbmx5KGxvYWRpbmcsICdsb2FkaW5nJyksIHVzZUtleU9ubHkoYmFzaWMsICdiYXNpYycpLCB1c2VLZXlPbmx5KGJ1dHRvbiwgJ2J1dHRvbicpLCB1c2VLZXlPbmx5KGNvbXBhY3QsICdjb21wYWN0JyksIHVzZUtleU9ubHkoZmx1aWQsICdmbHVpZCcpLCB1c2VLZXlPbmx5KGZsb2F0aW5nLCAnZmxvYXRpbmcnKSwgdXNlS2V5T25seShpbmxpbmUsICdpbmxpbmUnKSwgLy8gVE9ETzogY29uc2lkZXIgYXVnbWVudGF0aW9uIHRvIHJlbmRlciBEcm9wZG93bnMgYXMgQnV0dG9uL01lbnUsIHNvbHZlcyBpY29uL2xpbmsgaXRlbSBpc3N1ZXNcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJLVJlYWN0L2lzc3Vlcy80MDEjaXNzdWVjb21tZW50LTI0MDQ4NzIyOVxuICAgIC8vIFRPRE86IHRoZSBpY29uIGNsYXNzIGlzIG9ubHkgcmVxdWlyZWQgd2hlbiBhIGRyb3Bkb3duIGlzIGEgYnV0dG9uXG4gICAgLy8gdXNlS2V5T25seShpY29uLCAnaWNvbicpLFxuICAgIHVzZUtleU9ubHkobGFiZWxlZCwgJ2xhYmVsZWQnKSwgdXNlS2V5T25seShpdGVtLCAnaXRlbScpLCB1c2VLZXlPbmx5KG11bHRpcGxlLCAnbXVsdGlwbGUnKSwgdXNlS2V5T25seShzZWFyY2gsICdzZWFyY2gnKSwgdXNlS2V5T25seShzZWxlY3Rpb24sICdzZWxlY3Rpb24nKSwgdXNlS2V5T25seShzaW1wbGUsICdzaW1wbGUnKSwgdXNlS2V5T25seShzY3JvbGxpbmcsICdzY3JvbGxpbmcnKSwgdXNlS2V5T25seSh1cHdhcmQsICd1cHdhcmQnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShwb2ludGluZywgJ3BvaW50aW5nJyksICdkcm9wZG93bicsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhEcm9wZG93biwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRHJvcGRvd24sIHRoaXMucHJvcHMpO1xuICAgIHZhciBhcmlhT3B0aW9ucyA9IHRoaXMuZ2V0RHJvcGRvd25BcmlhT3B0aW9ucyhFbGVtZW50VHlwZSwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgICAgaW5uZXJSZWY6IHRoaXMucmVmXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCBhcmlhT3B0aW9ucywge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgb25CbHVyOiB0aGlzLmhhbmRsZUJsdXIsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrLFxuICAgICAgb25LZXlEb3duOiB0aGlzLmhhbmRsZUtleURvd24sXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5oYW5kbGVNb3VzZURvd24sXG4gICAgICBvbkZvY3VzOiB0aGlzLmhhbmRsZUZvY3VzLFxuICAgICAgb25DaGFuZ2U6IHRoaXMuaGFuZGxlQ2hhbmdlLFxuICAgICAgdGFiSW5kZXg6IHRoaXMuY29tcHV0ZVRhYkluZGV4KClcbiAgICB9KSwgdGhpcy5yZW5kZXJMYWJlbHMoKSwgdGhpcy5yZW5kZXJTZWFyY2hJbnB1dCgpLCB0aGlzLnJlbmRlclNlYXJjaFNpemVyKCksIHRyaWdnZXIgfHwgdGhpcy5yZW5kZXJUZXh0KCksIEljb24uY3JlYXRlKGljb24sIHtcbiAgICAgIG92ZXJyaWRlUHJvcHM6IHRoaXMuaGFuZGxlSWNvbk92ZXJyaWRlcyxcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgdGhpcy5yZW5kZXJNZW51KCksIG9wZW4gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRTdGFjaywge1xuICAgICAgbmFtZTogXCJrZXlkb3duXCIsXG4gICAgICBvbjogdGhpcy5jbG9zZU9uRXNjYXBlXG4gICAgfSksIG9wZW4gJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRTdGFjaywge1xuICAgICAgbmFtZTogXCJjbGlja1wiLFxuICAgICAgb246IHRoaXMuY2xvc2VPbkRvY3VtZW50Q2xpY2tcbiAgICB9KSwgZm9jdXMgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRTdGFjaywge1xuICAgICAgbmFtZTogXCJrZXlkb3duXCIsXG4gICAgICBvbjogdGhpcy5yZW1vdmVJdGVtT25CYWNrc3BhY2VcbiAgICB9KSkpO1xuICB9O1xuXG4gIHJldHVybiBEcm9wZG93bjtcbn0oQ29tcG9uZW50KTtcblxuRHJvcGRvd24uaGFuZGxlZFByb3BzID0gW1wiYWRkaXRpb25MYWJlbFwiLCBcImFkZGl0aW9uUG9zaXRpb25cIiwgXCJhbGxvd0FkZGl0aW9uc1wiLCBcImFzXCIsIFwiYmFzaWNcIiwgXCJidXR0b25cIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNsZWFyYWJsZVwiLCBcImNsb3NlT25CbHVyXCIsIFwiY2xvc2VPbkNoYW5nZVwiLCBcImNsb3NlT25Fc2NhcGVcIiwgXCJjb21wYWN0XCIsIFwiZGVidXJyXCIsIFwiZGVmYXVsdE9wZW5cIiwgXCJkZWZhdWx0U2VhcmNoUXVlcnlcIiwgXCJkZWZhdWx0U2VsZWN0ZWRMYWJlbFwiLCBcImRlZmF1bHRVcHdhcmRcIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJkaXJlY3Rpb25cIiwgXCJkaXNhYmxlZFwiLCBcImVycm9yXCIsIFwiZmxvYXRpbmdcIiwgXCJmbHVpZFwiLCBcImhlYWRlclwiLCBcImljb25cIiwgXCJpbmxpbmVcIiwgXCJpdGVtXCIsIFwibGFiZWxlZFwiLCBcImxhenlMb2FkXCIsIFwibG9hZGluZ1wiLCBcIm1pbkNoYXJhY3RlcnNcIiwgXCJtdWx0aXBsZVwiLCBcIm5vUmVzdWx0c01lc3NhZ2VcIiwgXCJvbkFkZEl0ZW1cIiwgXCJvbkJsdXJcIiwgXCJvbkNoYW5nZVwiLCBcIm9uQ2xpY2tcIiwgXCJvbkNsb3NlXCIsIFwib25Gb2N1c1wiLCBcIm9uTGFiZWxDbGlja1wiLCBcIm9uTW91c2VEb3duXCIsIFwib25PcGVuXCIsIFwib25TZWFyY2hDaGFuZ2VcIiwgXCJvcGVuXCIsIFwib3Blbk9uRm9jdXNcIiwgXCJvcHRpb25zXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJwb2ludGluZ1wiLCBcInJlbmRlckxhYmVsXCIsIFwic2Nyb2xsaW5nXCIsIFwic2VhcmNoXCIsIFwic2VhcmNoSW5wdXRcIiwgXCJzZWFyY2hRdWVyeVwiLCBcInNlbGVjdE9uQmx1clwiLCBcInNlbGVjdE9uTmF2aWdhdGlvblwiLCBcInNlbGVjdGVkTGFiZWxcIiwgXCJzZWxlY3Rpb25cIiwgXCJzaW1wbGVcIiwgXCJ0YWJJbmRleFwiLCBcInRleHRcIiwgXCJ0cmlnZ2VyXCIsIFwidXB3YXJkXCIsIFwidmFsdWVcIiwgXCJ3cmFwU2VsZWN0aW9uXCJdO1xuZXhwb3J0IHsgRHJvcGRvd24gYXMgZGVmYXVsdCB9O1xuRHJvcGRvd24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogTGFiZWwgcHJlZml4ZWQgdG8gYW4gb3B0aW9uIGFkZGVkIGJ5IGEgdXNlci4gKi9cbiAgYWRkaXRpb25MYWJlbDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmVsZW1lbnQsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogUG9zaXRpb24gb2YgdGhlIGBBZGQ6IC4uLmAgb3B0aW9uIGluIHRoZSBkcm9wZG93biBsaXN0ICgndG9wJyBvciAnYm90dG9tJykuICovXG4gIGFkZGl0aW9uUG9zaXRpb246IFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdib3R0b20nXSksXG5cbiAgLyoqXG4gICAqIEFsbG93IHVzZXIgYWRkaXRpb25zIHRvIHRoZSBsaXN0IG9mIG9wdGlvbnMgKGJvb2xlYW4pLlxuICAgKiBSZXF1aXJlcyB0aGUgdXNlIG9mIGBzZWxlY3Rpb25gLCBgb3B0aW9uc2AgYW5kIGBzZWFyY2hgLlxuICAgKi9cbiAgYWxsb3dBZGRpdGlvbnM6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRlbWFuZChbJ29wdGlvbnMnLCAnc2VsZWN0aW9uJywgJ3NlYXJjaCddKSwgUHJvcFR5cGVzLmJvb2xdKSxcblxuICAvKiogQSBEcm9wZG93biBjYW4gcmVkdWNlIGl0cyBjb21wbGV4aXR5LiAqL1xuICBiYXNpYzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEZvcm1hdCB0aGUgRHJvcGRvd24gdG8gYXBwZWFyIGFzIGEgYnV0dG9uLiAqL1xuICBidXR0b246IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ29wdGlvbnMnLCAnc2VsZWN0aW9uJ10pLCBjdXN0b21Qcm9wVHlwZXMuZ2l2ZW5Qcm9wcyh7XG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZFxuICB9LCBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkKV0pLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogVXNpbmcgdGhlIGNsZWFyYWJsZSBzZXR0aW5nIHdpbGwgbGV0IHVzZXJzIHJlbW92ZSB0aGVpciBzZWxlY3Rpb24gZnJvbSBhIGRyb3Bkb3duLiAqL1xuICBjbGVhcmFibGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgbWVudSBzaG91bGQgY2xvc2Ugd2hlbiB0aGUgZHJvcGRvd24gaXMgYmx1cnJlZC4gKi9cbiAgY2xvc2VPbkJsdXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgZHJvcGRvd24gc2hvdWxkIGNsb3NlIHdoZW4gdGhlIGVzY2FwZSBrZXkgaXMgcHJlc3NlZC4gKi9cbiAgY2xvc2VPbkVzY2FwZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBtZW51IHNob3VsZCBjbG9zZSB3aGVuIGEgdmFsdWUgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgZHJvcGRvd24uXG4gICAqIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHNlbGVjdGlvbiBkcm9wZG93bnMgd2lsbCByZW1haW4gb3BlbiBvbiBjaGFuZ2UsIHdoaWxlIHNpbmdsZVxuICAgKiBzZWxlY3Rpb24gZHJvcGRvd25zIHdpbGwgY2xvc2Ugb24gY2hhbmdlLlxuICAgKi9cbiAgY2xvc2VPbkNoYW5nZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgY29tcGFjdCBkcm9wZG93biBoYXMgbm8gbWluaW11bSB3aWR0aC4gKi9cbiAgY29tcGFjdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBkcm9wZG93biBzaG91bGQgc3RyaXAgZGlhY3JpdGljcyBpbiBvcHRpb25zIGFuZCBpbnB1dCBzZWFyY2ggKi9cbiAgZGVidXJyOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogSW5pdGlhbCB2YWx1ZSBvZiBvcGVuLiAqL1xuICBkZWZhdWx0T3BlbjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEluaXRpYWwgdmFsdWUgb2Ygc2VhcmNoUXVlcnkuICovXG4gIGRlZmF1bHRTZWFyY2hRdWVyeTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQ3VycmVudGx5IHNlbGVjdGVkIGxhYmVsIGluIG11bHRpLXNlbGVjdC4gKi9cbiAgZGVmYXVsdFNlbGVjdGVkTGFiZWw6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRlbWFuZChbJ211bHRpcGxlJ10pLCBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSldKSxcblxuICAvKiogSW5pdGlhbCB2YWx1ZSBvZiB1cHdhcmQuICovXG4gIGRlZmF1bHRVcHdhcmQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBJbml0aWFsIHZhbHVlIG9yIHZhbHVlIGFycmF5IGlmIG11bHRpcGxlLiAqL1xuICBkZWZhdWx0VmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuYm9vbF0pKV0pLFxuXG4gIC8qKiBBIGRyb3Bkb3duIG1lbnUgY2FuIG9wZW4gdG8gdGhlIGxlZnQgb3IgdG8gdGhlIHJpZ2h0LiAqL1xuICBkaXJlY3Rpb246IFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnXSksXG5cbiAgLyoqIEEgZGlzYWJsZWQgZHJvcGRvd24gbWVudSBvciBpdGVtIGRvZXMgbm90IGFsbG93IHVzZXIgaW50ZXJhY3Rpb24uICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQW4gZXJyb3JlZCBkcm9wZG93biBjYW4gYWxlcnQgYSB1c2VyIHRvIGEgcHJvYmxlbS4gKi9cbiAgZXJyb3I6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGRyb3Bkb3duIG1lbnUgY2FuIGNvbnRhaW4gZmxvYXRlZCBjb250ZW50LiAqL1xuICBmbG9hdGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgZHJvcGRvd24gY2FuIHRha2UgdGhlIGZ1bGwgd2lkdGggb2YgaXRzIHBhcmVudCAqL1xuICBmbHVpZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgZHJvcGRvd24gbWVudSBjYW4gY29udGFpbiBhIGhlYWRlci4gKi9cbiAgaGVhZGVyOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJY29uLiAqL1xuICBpY29uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubm9kZSwgUHJvcFR5cGVzLm9iamVjdF0pLFxuXG4gIC8qKiBBIGRyb3Bkb3duIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYXBwZWFyIGlubGluZSBpbiBvdGhlciBjb250ZW50LiAqL1xuICBpbmxpbmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGRyb3Bkb3duIGNhbiBiZSBmb3JtYXR0ZWQgYXMgYSBNZW51IGl0ZW0uICovXG4gIGl0ZW06IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGRyb3Bkb3duIGNhbiBiZSBsYWJlbGVkLiAqL1xuICBsYWJlbGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBkcm9wZG93biBjYW4gZGVmZXIgcmVuZGVyaW5nIGl0cyBvcHRpb25zIHVudGlsIGl0IGlzIG9wZW4uICovXG4gIGxhenlMb2FkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBkcm9wZG93biBjYW4gc2hvdyB0aGF0IGl0IGlzIGN1cnJlbnRseSBsb2FkaW5nIGRhdGEuICovXG4gIGxvYWRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBUaGUgbWluaW11bSBjaGFyYWN0ZXJzIGZvciBhIHNlYXJjaCB0byBiZWdpbiBzaG93aW5nIHJlc3VsdHMuICovXG4gIG1pbkNoYXJhY3RlcnM6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqIEEgc2VsZWN0aW9uIGRyb3Bkb3duIGNhbiBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb25zLiAqL1xuICBtdWx0aXBsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIE1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGFyZSBubyByZXN1bHRzLiAqL1xuICBub1Jlc3VsdHNNZXNzYWdlOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSB1c2VyIGFkZHMgYSBuZXcgaXRlbS4gVXNlIHRoaXMgdG8gdXBkYXRlIHRoZSBvcHRpb25zIGxpc3QuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMgYW5kIHRoZSBuZXcgaXRlbSdzIHZhbHVlLlxuICAgKi9cbiAgb25BZGRJdGVtOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGJsdXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkJsdXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBhdHRlbXB0cyB0byBjaGFuZ2UgdGhlIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzIGFuZCBwcm9wb3NlZCB2YWx1ZS5cbiAgICovXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNsaWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgY2xvc2UgZXZlbnQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gZm9jdXMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkZvY3VzOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBtdWx0aS1zZWxlY3QgbGFiZWwgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBsYWJlbCBwcm9wcy5cbiAgICovXG4gIG9uTGFiZWxDbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBtb3VzZWRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk1vdXNlRG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIG9wZW4gZXZlbnQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBzZWFyY2ggaW5wdXQgY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLCBpbmNsdWRlcyBjdXJyZW50IHZhbHVlIG9mIHNlYXJjaFF1ZXJ5LlxuICAgKi9cbiAgb25TZWFyY2hDaGFuZ2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgZHJvcGRvd24gbWVudSBpcyBkaXNwbGF5ZWQuICovXG4gIG9wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgbWVudSBzaG91bGQgb3BlbiB3aGVuIHRoZSBkcm9wZG93biBpcyBmb2N1c2VkLiAqL1xuICBvcGVuT25Gb2N1czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFycmF5IG9mIERyb3Bkb3duLkl0ZW0gcHJvcHMgZS5nLiBgeyB0ZXh0OiAnJywgdmFsdWU6ICcnIH1gICovXG4gIG9wdGlvbnM6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnY2hpbGRyZW4nXSksIFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5zaGFwZShEcm9wZG93bkl0ZW0ucHJvcFR5cGVzKSldKSxcblxuICAvKiogUGxhY2Vob2xkZXIgdGV4dC4gKi9cbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgZHJvcGRvd24gY2FuIGJlIGZvcm1hdHRlZCBzbyB0aGF0IGl0cyBtZW51IGlzIHBvaW50aW5nLiAqL1xuICBwb2ludGluZzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAncmlnaHQnLCAndG9wJywgJ3RvcCBsZWZ0JywgJ3RvcCByaWdodCcsICdib3R0b20nLCAnYm90dG9tIGxlZnQnLCAnYm90dG9tIHJpZ2h0J10pXSksXG5cbiAgLyoqXG4gICAqIE1hcHBlZCBvdmVyIHRoZSBhY3RpdmUgaXRlbXMgYW5kIHJldHVybnMgc2hvcnRoYW5kIGZvciB0aGUgYWN0aXZlIGl0ZW0gTGFiZWxzLlxuICAgKiBPbmx5IGFwcGxpZXMgdG8gYG11bHRpcGxlYCBEcm9wZG93bnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpdGVtIC0gQSBjdXJyZW50bHkgYWN0aXZlIGRyb3Bkb3duIGl0ZW0uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSBjdXJyZW50IGluZGV4LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGVmYXVsdExhYmVsUHJvcHMgLSBUaGUgZGVmYXVsdCBwcm9wcyBmb3IgYW4gYWN0aXZlIGl0ZW0gTGFiZWwuXG4gICAqIEByZXR1cm5zIHsqfSBTaG9ydGhhbmQgZm9yIGEgTGFiZWwuXG4gICAqL1xuICByZW5kZXJMYWJlbDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgZHJvcGRvd24gY2FuIGhhdmUgaXRzIG1lbnUgc2Nyb2xsLiAqL1xuICBzY3JvbGxpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBBIHNlbGVjdGlvbiBkcm9wZG93biBjYW4gYWxsb3cgYSB1c2VyIHRvIHNlYXJjaCB0aHJvdWdoIGEgbGFyZ2UgbGlzdCBvZiBjaG9pY2VzLlxuICAgKiBQYXNzIGEgZnVuY3Rpb24gaGVyZSB0byByZXBsYWNlIHRoZSBkZWZhdWx0IHNlYXJjaC5cbiAgICovXG4gIHNlYXJjaDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5mdW5jXSksXG5cbiAgLyoqIEEgc2hvcnRoYW5kIGZvciBhIHNlYXJjaCBpbnB1dC4gKi9cbiAgc2VhcmNoSW5wdXQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hcnJheSwgUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5vYmplY3RdKSxcblxuICAvKiogQ3VycmVudCB2YWx1ZSBvZiBzZWFyY2hRdWVyeS4gQ3JlYXRlcyBhIGNvbnRyb2xsZWQgY29tcG9uZW50LiAqL1xuICBzZWFyY2hRdWVyeTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLy8gVE9ETyAnc2VhcmNoSW5NZW51JyBvciAnc2VhcmNoPSdpbiBtZW51JyBvciA/Pz8gIEhvdyB0byBoYW5kbGUgdGhpcyBtYXJrdXAgYW5kIGZ1bmN0aW9uYWxpdHk/XG5cbiAgLyoqIERlZmluZSB3aGV0aGVyIHRoZSBoaWdobGlnaHRlZCBpdGVtIHNob3VsZCBiZSBzZWxlY3RlZCBvbiBibHVyLiAqL1xuICBzZWxlY3RPbkJsdXI6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBjaGFuZ2UgdGhlIHZhbHVlIHdoZW4gbmF2aWdhdGluZyB0aGUgbWVudSB1c2luZyBhcnJvdyBrZXlzLlxuICAgKiBTZXR0aW5nIHRvIGZhbHNlIHdpbGwgcmVxdWlyZSBlbnRlciBvciBsZWZ0IGNsaWNrIHRvIGNvbmZpcm0gYSBjaG9pY2UuXG4gICAqL1xuICBzZWxlY3RPbk5hdmlnYXRpb246IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBDdXJyZW50bHkgc2VsZWN0ZWQgbGFiZWwgaW4gbXVsdGktc2VsZWN0LiAqL1xuICBzZWxlY3RlZExhYmVsOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kZW1hbmQoWydtdWx0aXBsZSddKSwgUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pXSksXG5cbiAgLyoqIEEgZHJvcGRvd24gY2FuIGJlIHVzZWQgdG8gc2VsZWN0IGJldHdlZW4gY2hvaWNlcyBpbiBhIGZvcm0uICovXG4gIHNlbGVjdGlvbjogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydjaGlsZHJlbiddKSwgY3VzdG9tUHJvcFR5cGVzLmRlbWFuZChbJ29wdGlvbnMnXSksIFByb3BUeXBlcy5ib29sXSksXG5cbiAgLyoqIEEgc2ltcGxlIGRyb3Bkb3duIGNhbiBvcGVuIHdpdGhvdXQgSmF2YXNjcmlwdC4gKi9cbiAgc2ltcGxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBkcm9wZG93biBjYW4gcmVjZWl2ZSBmb2N1cy4gKi9cbiAgdGFiSW5kZXg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogVGhlIHRleHQgZGlzcGxheWVkIGluIHRoZSBkcm9wZG93biwgdXN1YWxseSBmb3IgdGhlIGFjdGl2ZSBpdGVtLiAqL1xuICB0ZXh0OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBDdXN0b20gZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBtZW51IHRvIGJlY29tZSB2aXNpYmxlLiBUYWtlcyBwbGFjZSBvZiAndGV4dCcuICovXG4gIHRyaWdnZXI6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnc2VsZWN0aW9uJywgJ3RleHQnXSksIFByb3BUeXBlcy5ub2RlXSksXG5cbiAgLyoqIEN1cnJlbnQgdmFsdWUgb3IgdmFsdWUgYXJyYXkgaWYgbXVsdGlwbGUuIENyZWF0ZXMgYSBjb250cm9sbGVkIGNvbXBvbmVudC4gKi9cbiAgdmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pKV0pLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIHRoZSBkcm9wZG93biB3aWxsIG9wZW4gdXB3YXJkLiAqL1xuICB1cHdhcmQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBBIGRyb3Bkb3duIHdpbGwgZ28gdG8gdGhlIGxhc3QgZWxlbWVudCB3aGVuIEFycm93VXAgaXMgcHJlc3NlZCBvbiB0aGUgZmlyc3QsXG4gICAqIG9yIGdvIHRvIHRoZSBmaXJzdCB3aGVuIEFycm93RG93biBpcyBwcmVzc2VkIG9uIHRoZSBsYXN0KCBha2EgaW5maW5pdGUgc2VsZWN0aW9uIClcbiAgICovXG4gIHdyYXBTZWxlY3Rpb246IFByb3BUeXBlcy5ib29sXG59IDoge307XG5Ecm9wZG93bi5kZWZhdWx0UHJvcHMgPSB7XG4gIGFkZGl0aW9uTGFiZWw6ICdBZGQgJyxcbiAgYWRkaXRpb25Qb3NpdGlvbjogJ3RvcCcsXG4gIGNsb3NlT25CbHVyOiB0cnVlLFxuICBjbG9zZU9uRXNjYXBlOiB0cnVlLFxuICBkZWJ1cnI6IGZhbHNlLFxuICBpY29uOiAnZHJvcGRvd24nLFxuICBtaW5DaGFyYWN0ZXJzOiAxLFxuICBub1Jlc3VsdHNNZXNzYWdlOiAnTm8gcmVzdWx0cyBmb3VuZC4nLFxuICBvcGVuT25Gb2N1czogdHJ1ZSxcbiAgcmVuZGVyTGFiZWw6IHJlbmRlckl0ZW1Db250ZW50LFxuICBzZWFyY2hJbnB1dDogJ3RleHQnLFxuICBzZWxlY3RPbkJsdXI6IHRydWUsXG4gIHNlbGVjdE9uTmF2aWdhdGlvbjogdHJ1ZSxcbiAgd3JhcFNlbGVjdGlvbjogdHJ1ZVxufTtcbkRyb3Bkb3duLmF1dG9Db250cm9sbGVkUHJvcHMgPSBbJ29wZW4nLCAnc2VhcmNoUXVlcnknLCAnc2VsZWN0ZWRMYWJlbCcsICd2YWx1ZScsICd1cHdhcmQnXTtcbkRyb3Bkb3duLkRpdmlkZXIgPSBEcm9wZG93bkRpdmlkZXI7XG5Ecm9wZG93bi5IZWFkZXIgPSBEcm9wZG93bkhlYWRlcjtcbkRyb3Bkb3duLkl0ZW0gPSBEcm9wZG93bkl0ZW07XG5Ecm9wZG93bi5NZW51ID0gRHJvcGRvd25NZW51O1xuRHJvcGRvd24uU2VhcmNoSW5wdXQgPSBEcm9wZG93blNlYXJjaElucHV0O1xuRHJvcGRvd24uVGV4dCA9IERyb3Bkb3duVGV4dDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBkcm9wZG93biBtZW51IGNhbiBjb250YWluIGRpdmlkZXJzIHRvIHNlcGFyYXRlIHJlbGF0ZWQgY29udGVudC5cbiAqL1xuXG5mdW5jdGlvbiBEcm9wZG93bkRpdmlkZXIocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZTtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnZGl2aWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRHJvcGRvd25EaXZpZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKERyb3Bkb3duRGl2aWRlciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pKTtcbn1cblxuRHJvcGRvd25EaXZpZGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2xhc3NOYW1lXCJdO1xuRHJvcGRvd25EaXZpZGVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkRpdmlkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ljb24nO1xuLyoqXG4gKiBBIGRyb3Bkb3duIG1lbnUgY2FuIGNvbnRhaW4gYSBoZWFkZXIuXG4gKi9cblxuZnVuY3Rpb24gRHJvcGRvd25IZWFkZXIocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGljb24gPSBwcm9wcy5pY29uO1xuICB2YXIgY2xhc3NlcyA9IGN4KCdoZWFkZXInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKERyb3Bkb3duSGVhZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKERyb3Bkb3duSGVhZGVyLCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBJY29uLmNyZWF0ZShpY29uLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY29udGVudCk7XG59XG5cbkRyb3Bkb3duSGVhZGVyLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiaWNvblwiXTtcbkRyb3Bkb3duSGVhZGVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikgKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgSWNvbi4gKi9cbiAgaWNvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRcbn0gOiB7fTtcbkRyb3Bkb3duSGVhZGVyLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoRHJvcGRvd25IZWFkZXIsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmQsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBGbGFnIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ZsYWcnO1xuaW1wb3J0IEljb24gZnJvbSAnLi4vLi4vZWxlbWVudHMvSWNvbic7XG5pbXBvcnQgSW1hZ2UgZnJvbSAnLi4vLi4vZWxlbWVudHMvSW1hZ2UnO1xuaW1wb3J0IExhYmVsIGZyb20gJy4uLy4uL2VsZW1lbnRzL0xhYmVsJztcbi8qKlxuICogQW4gaXRlbSBzdWItY29tcG9uZW50IGZvciBEcm9wZG93biBjb21wb25lbnQuXG4gKi9cblxudmFyIERyb3Bkb3duSXRlbSA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShEcm9wZG93bkl0ZW0sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIERyb3Bkb3duSXRlbSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkNsaWNrJywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gRHJvcGRvd25JdGVtLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF90aGlzJHByb3BzLmFjdGl2ZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMuY29udGVudCxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgZGVzY3JpcHRpb24gPSBfdGhpcyRwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgZmxhZyA9IF90aGlzJHByb3BzLmZsYWcsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wcy5pY29uLFxuICAgICAgICBpbWFnZSA9IF90aGlzJHByb3BzLmltYWdlLFxuICAgICAgICBsYWJlbCA9IF90aGlzJHByb3BzLmxhYmVsLFxuICAgICAgICBzZWxlY3RlZCA9IF90aGlzJHByb3BzLnNlbGVjdGVkLFxuICAgICAgICB0ZXh0ID0gX3RoaXMkcHJvcHMudGV4dDtcbiAgICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkoYWN0aXZlLCAnYWN0aXZlJyksIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KHNlbGVjdGVkLCAnc2VsZWN0ZWQnKSwgJ2l0ZW0nLCBjbGFzc05hbWUpOyAvLyBhZGQgZGVmYXVsdCBkcm9wZG93biBpY29uIGlmIGl0ZW0gY29udGFpbnMgYW5vdGhlciBtZW51XG5cbiAgICB2YXIgaWNvbk5hbWUgPSBfaXNOaWwoaWNvbikgPyBjaGlsZHJlblV0aWxzLnNvbWVCeVR5cGUoY2hpbGRyZW4sICdEcm9wZG93bk1lbnUnKSAmJiAnZHJvcGRvd24nIDogaWNvbjtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKERyb3Bkb3duSXRlbSwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRHJvcGRvd25JdGVtLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgYXJpYU9wdGlvbnMgPSB7XG4gICAgICByb2xlOiAnb3B0aW9uJyxcbiAgICAgICdhcmlhLWRpc2FibGVkJzogZGlzYWJsZWQsXG4gICAgICAnYXJpYS1jaGVja2VkJzogYWN0aXZlLFxuICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiBzZWxlY3RlZFxuICAgIH07XG5cbiAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCBhcmlhT3B0aW9ucywge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCBjaGlsZHJlbik7XG4gICAgfVxuXG4gICAgdmFyIGZsYWdFbGVtZW50ID0gRmxhZy5jcmVhdGUoZmxhZywge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pO1xuICAgIHZhciBpY29uRWxlbWVudCA9IEljb24uY3JlYXRlKGljb25OYW1lLCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgfSk7XG4gICAgdmFyIGltYWdlRWxlbWVudCA9IEltYWdlLmNyZWF0ZShpbWFnZSwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pO1xuICAgIHZhciBsYWJlbEVsZW1lbnQgPSBMYWJlbC5jcmVhdGUobGFiZWwsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgZGVzY3JpcHRpb25FbGVtZW50ID0gY3JlYXRlU2hvcnRoYW5kKCdzcGFuJywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW46IHZhbFxuICAgICAgfTtcbiAgICB9LCBkZXNjcmlwdGlvbiwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNsYXNzTmFtZTogJ2Rlc2NyaXB0aW9uJ1xuICAgICAgfSxcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KTtcbiAgICB2YXIgdGV4dEVsZW1lbnQgPSBjcmVhdGVTaG9ydGhhbmQoJ3NwYW4nLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjaGlsZHJlbjogdmFsXG4gICAgICB9O1xuICAgIH0sIGNoaWxkcmVuVXRpbHMuaXNOaWwoY29udGVudCkgPyB0ZXh0IDogY29udGVudCwge1xuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGNsYXNzTmFtZTogJ3RleHQnXG4gICAgICB9LFxuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIGFyaWFPcHRpb25zLCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSksIGltYWdlRWxlbWVudCwgaWNvbkVsZW1lbnQsIGZsYWdFbGVtZW50LCBsYWJlbEVsZW1lbnQsIGRlc2NyaXB0aW9uRWxlbWVudCwgdGV4dEVsZW1lbnQpO1xuICB9O1xuXG4gIHJldHVybiBEcm9wZG93bkl0ZW07XG59KENvbXBvbmVudCk7XG5cbkRyb3Bkb3duSXRlbS5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRlc2NyaXB0aW9uXCIsIFwiZGlzYWJsZWRcIiwgXCJmbGFnXCIsIFwiaWNvblwiLCBcImltYWdlXCIsIFwibGFiZWxcIiwgXCJvbkNsaWNrXCIsIFwic2VsZWN0ZWRcIiwgXCJ0ZXh0XCIsIFwidmFsdWVcIl07XG5Ecm9wZG93bkl0ZW0ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogU3R5bGUgYXMgdGhlIGN1cnJlbnRseSBjaG9zZW4gaXRlbS4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEFkZGl0aW9uYWwgdGV4dCB3aXRoIGxlc3MgZW1waGFzaXMuICovXG4gIGRlc2NyaXB0aW9uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBkcm9wZG93biBpdGVtIGNhbiBiZSBkaXNhYmxlZC4gKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEZsYWcuICovXG4gIGZsYWc6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEljb24uICovXG4gIGljb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEltYWdlLiAqL1xuICBpbWFnZTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgTGFiZWwuICovXG4gIGxhYmVsOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNsaWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIGN1cnJlbnRseSBzZWxlY3RlZCBieSBrZXlib2FyZCBzaG9ydGN1dC5cbiAgICogVGhpcyBpcyBub3QgdGhlIGFjdGl2ZSBpdGVtLlxuICAgKi9cbiAgc2VsZWN0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBEaXNwbGF5IHRleHQuICovXG4gIHRleHQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBTdG9yZWQgdmFsdWUuICovXG4gIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pXG59IDoge307XG5Ecm9wZG93bkl0ZW0uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShEcm9wZG93bkl0ZW0sIGZ1bmN0aW9uIChvcHRzKSB7XG4gIHJldHVybiBvcHRzO1xufSk7XG5leHBvcnQgZGVmYXVsdCBEcm9wZG93bkl0ZW07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBkcm9wZG93biBtZW51IGNhbiBjb250YWluIGEgbWVudS5cbiAqL1xuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnUocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGRpcmVjdGlvbiA9IHByb3BzLmRpcmVjdGlvbixcbiAgICAgIG9wZW4gPSBwcm9wcy5vcGVuLFxuICAgICAgc2Nyb2xsaW5nID0gcHJvcHMuc2Nyb2xsaW5nO1xuICB2YXIgY2xhc3NlcyA9IGN4KGRpcmVjdGlvbiwgdXNlS2V5T25seShvcGVuLCAndmlzaWJsZScpLCB1c2VLZXlPbmx5KHNjcm9sbGluZywgJ3Njcm9sbGluZycpLCAnbWVudSB0cmFuc2l0aW9uJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhEcm9wZG93bk1lbnUsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRHJvcGRvd25NZW51LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuRHJvcGRvd25NZW51LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGlyZWN0aW9uXCIsIFwib3BlblwiLCBcInNjcm9sbGluZ1wiXTtcbkRyb3Bkb3duTWVudS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBkcm9wZG93biBtZW51IGNhbiBvcGVuIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSByaWdodC4gKi9cbiAgZGlyZWN0aW9uOiBQcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ3JpZ2h0J10pLFxuXG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgZHJvcGRvd24gbWVudSBpcyBkaXNwbGF5ZWQuICovXG4gIG9wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGRyb3Bkb3duIG1lbnUgY2FuIHNjcm9sbC4gKi9cbiAgc2Nyb2xsaW5nOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRHJvcGRvd25NZW51OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IF9nZXQgZnJvbSBcImxvZGFzaC1lcy9nZXRcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIHNlYXJjaCBpdGVtIHN1Yi1jb21wb25lbnQgZm9yIERyb3Bkb3duIGNvbXBvbmVudC5cbiAqL1xuXG52YXIgRHJvcGRvd25TZWFyY2hJbnB1dCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShEcm9wZG93blNlYXJjaElucHV0LCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93blNlYXJjaElucHV0KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IF9nZXQoZSwgJ3RhcmdldC52YWx1ZScpO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DaGFuZ2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBEcm9wZG93blNlYXJjaElucHV0LnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGF1dG9Db21wbGV0ZSA9IF90aGlzJHByb3BzLmF1dG9Db21wbGV0ZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICB0YWJJbmRleCA9IF90aGlzJHByb3BzLnRhYkluZGV4LFxuICAgICAgICB0eXBlID0gX3RoaXMkcHJvcHMudHlwZSxcbiAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZTtcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCdzZWFyY2gnLCBjbGFzc05hbWUpO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRHJvcGRvd25TZWFyY2hJbnB1dCwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIiwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogXCJsaXN0XCIsXG4gICAgICBhdXRvQ29tcGxldGU6IGF1dG9Db21wbGV0ZSxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIG9uQ2hhbmdlOiB0aGlzLmhhbmRsZUNoYW5nZSxcbiAgICAgIHRhYkluZGV4OiB0YWJJbmRleCxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICB2YWx1ZTogdmFsdWVcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duU2VhcmNoSW5wdXQ7XG59KENvbXBvbmVudCk7XG5cbkRyb3Bkb3duU2VhcmNoSW5wdXQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJhdXRvQ29tcGxldGVcIiwgXCJjbGFzc05hbWVcIiwgXCJ0YWJJbmRleFwiLCBcInR5cGVcIiwgXCJ2YWx1ZVwiXTtcbkRyb3Bkb3duU2VhcmNoSW5wdXQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQW4gaW5wdXQgY2FuIGhhdmUgdGhlIGF1dG8gY29tcGxldGUuICovXG4gIGF1dG9Db21wbGV0ZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEFuIGlucHV0IGNhbiByZWNlaXZlIGZvY3VzLiAqL1xuICB0YWJJbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBUaGUgSFRNTCBpbnB1dCB0eXBlLiAqL1xuICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTdG9yZWQgdmFsdWUuICovXG4gIHZhbHVlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSlcbn0gOiB7fTtcbkRyb3Bkb3duU2VhcmNoSW5wdXQuZGVmYXVsdFByb3BzID0ge1xuICBhdXRvQ29tcGxldGU6ICdvZmYnLFxuICB0eXBlOiAndGV4dCdcbn07XG5Ecm9wZG93blNlYXJjaElucHV0LmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoRHJvcGRvd25TZWFyY2hJbnB1dCwgZnVuY3Rpb24gKHR5cGUpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiB0eXBlXG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duU2VhcmNoSW5wdXQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBkcm9wZG93biBjb250YWlucyBhIHNlbGVjdGVkIHZhbHVlLlxuICovXG5cbmZ1bmN0aW9uIERyb3Bkb3duVGV4dChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdkaXZpZGVyJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhEcm9wZG93blRleHQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRHJvcGRvd25UZXh0LCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe1xuICAgIFwiYXJpYS1hdG9taWNcIjogdHJ1ZSxcbiAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgIHJvbGU6IFwiYWxlcnRcIlxuICB9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkRyb3Bkb3duVGV4dC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbkRyb3Bkb3duVGV4dC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuRHJvcGRvd25UZXh0LmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoRHJvcGRvd25UZXh0LCBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogdmFsXG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IERyb3Bkb3duVGV4dDsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9Ecm9wZG93bic7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9zb21lIGZyb20gXCJsb2Rhc2gtZXMvc29tZVwiO1xuaW1wb3J0IF9lc2NhcGVSZWdFeHAgZnJvbSBcImxvZGFzaC1lcy9lc2NhcGVSZWdFeHBcIjtcbmltcG9ydCBfZGVidXJyIGZyb20gXCJsb2Rhc2gtZXMvZGVidXJyXCI7XG5pbXBvcnQgX2lzRnVuY3Rpb24gZnJvbSBcImxvZGFzaC1lcy9pc0Z1bmN0aW9uXCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gtZXMvaW5jbHVkZXNcIjtcbmltcG9ydCBfZmlsdGVyIGZyb20gXCJsb2Rhc2gtZXMvZmlsdGVyXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnOyAvLyBUaGVyZSBhcmUgdGltZXMgd2hlbiB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgb3B0aW9ucyBiYXNlZCBvbiBhIHZhbHVlXG4vLyB0aGF0IGhhc24ndCB5ZXQgYmVlbiBwZXJzaXN0ZWQgdG8gc3RhdGUuXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE1lbnVPcHRpb25zKGNvbmZpZykge1xuICB2YXIgYWRkaXRpb25MYWJlbCA9IGNvbmZpZy5hZGRpdGlvbkxhYmVsLFxuICAgICAgYWRkaXRpb25Qb3NpdGlvbiA9IGNvbmZpZy5hZGRpdGlvblBvc2l0aW9uLFxuICAgICAgYWxsb3dBZGRpdGlvbnMgPSBjb25maWcuYWxsb3dBZGRpdGlvbnMsXG4gICAgICBkZWJ1cnIgPSBjb25maWcuZGVidXJyLFxuICAgICAgbXVsdGlwbGUgPSBjb25maWcubXVsdGlwbGUsXG4gICAgICBvcHRpb25zID0gY29uZmlnLm9wdGlvbnMsXG4gICAgICBzZWFyY2ggPSBjb25maWcuc2VhcmNoLFxuICAgICAgc2VhcmNoUXVlcnkgPSBjb25maWcuc2VhcmNoUXVlcnksXG4gICAgICB2YWx1ZSA9IGNvbmZpZy52YWx1ZTtcbiAgdmFyIGZpbHRlcmVkT3B0aW9ucyA9IG9wdGlvbnM7IC8vIGZpbHRlciBvdXQgYWN0aXZlIG9wdGlvbnNcblxuICBpZiAobXVsdGlwbGUpIHtcbiAgICBmaWx0ZXJlZE9wdGlvbnMgPSBfZmlsdGVyKGZpbHRlcmVkT3B0aW9ucywgZnVuY3Rpb24gKG9wdCkge1xuICAgICAgcmV0dXJuICFfaW5jbHVkZXModmFsdWUsIG9wdC52YWx1ZSk7XG4gICAgfSk7XG4gIH0gLy8gZmlsdGVyIGJ5IHNlYXJjaCBxdWVyeVxuXG5cbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2hRdWVyeSkge1xuICAgIGlmIChfaXNGdW5jdGlvbihzZWFyY2gpKSB7XG4gICAgICBmaWx0ZXJlZE9wdGlvbnMgPSBzZWFyY2goZmlsdGVyZWRPcHRpb25zLCBzZWFyY2hRdWVyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlbW92ZSBkaWFjcml0aWNzIG9uIHNlYXJjaCBpbnB1dCBhbmQgb3B0aW9ucywgaWYgZGVidXJyIHByb3AgaXMgc2V0XG4gICAgICB2YXIgc3RyaXBwZWRRdWVyeSA9IGRlYnVyciA/IF9kZWJ1cnIoc2VhcmNoUXVlcnkpIDogc2VhcmNoUXVlcnk7XG4gICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKF9lc2NhcGVSZWdFeHAoc3RyaXBwZWRRdWVyeSksICdpJyk7XG4gICAgICBmaWx0ZXJlZE9wdGlvbnMgPSBfZmlsdGVyKGZpbHRlcmVkT3B0aW9ucywgZnVuY3Rpb24gKG9wdCkge1xuICAgICAgICByZXR1cm4gcmUudGVzdChkZWJ1cnIgPyBfZGVidXJyKG9wdC50ZXh0KSA6IG9wdC50ZXh0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSAvLyBpbnNlcnQgdGhlIFwiYWRkXCIgaXRlbVxuXG5cbiAgaWYgKGFsbG93QWRkaXRpb25zICYmIHNlYXJjaCAmJiBzZWFyY2hRdWVyeSAmJiAhX3NvbWUoZmlsdGVyZWRPcHRpb25zLCB7XG4gICAgdGV4dDogc2VhcmNoUXVlcnlcbiAgfSkpIHtcbiAgICB2YXIgYWRkaXRpb25MYWJlbEVsZW1lbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuaXNWYWxpZEVsZW1lbnQoYWRkaXRpb25MYWJlbCkgPyAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KGFkZGl0aW9uTGFiZWwsIHtcbiAgICAgIGtleTogJ2FkZGl0aW9uLWxhYmVsJ1xuICAgIH0pIDogYWRkaXRpb25MYWJlbCB8fCAnJztcbiAgICB2YXIgYWRkSXRlbSA9IHtcbiAgICAgIGtleTogJ2FkZGl0aW9uJyxcbiAgICAgIC8vIGJ5IHVzaW5nIGFuIGFycmF5LCB3ZSBjYW4gcGFzcyBtdWx0aXBsZSBlbGVtZW50cywgYnV0IHdoZW4gZG9pbmcgc29cbiAgICAgIC8vIHdlIG11c3Qgc3BlY2lmeSBhIGBrZXlgIGZvciBSZWFjdCB0byBrbm93IHdoaWNoIG9uZSBpcyB3aGljaFxuICAgICAgdGV4dDogW2FkZGl0aW9uTGFiZWxFbGVtZW50LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJcIiwge1xuICAgICAgICBrZXk6IFwiYWRkaXRpb24tcXVlcnlcIlxuICAgICAgfSwgc2VhcmNoUXVlcnkpXSxcbiAgICAgIHZhbHVlOiBzZWFyY2hRdWVyeSxcbiAgICAgIGNsYXNzTmFtZTogJ2FkZGl0aW9uJyxcbiAgICAgICdkYXRhLWFkZGl0aW9uYWwnOiB0cnVlXG4gICAgfTtcbiAgICBpZiAoYWRkaXRpb25Qb3NpdGlvbiA9PT0gJ3RvcCcpIGZpbHRlcmVkT3B0aW9ucy51bnNoaWZ0KGFkZEl0ZW0pO2Vsc2UgZmlsdGVyZWRPcHRpb25zLnB1c2goYWRkSXRlbSk7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRPcHRpb25zO1xufVxuZ2V0TWVudU9wdGlvbnMuaGFuZGxlZFByb3BzID0gW107IiwiaW1wb3J0IF9pbmNsdWRlcyBmcm9tIFwibG9kYXNoLWVzL2luY2x1ZGVzXCI7XG5pbXBvcnQgX2ZpbmQgZnJvbSBcImxvZGFzaC1lcy9maW5kXCI7XG5pbXBvcnQgX2ZpbmRJbmRleCBmcm9tIFwibG9kYXNoLWVzL2ZpbmRJbmRleFwiO1xuaW1wb3J0IF9yZWR1Y2UgZnJvbSBcImxvZGFzaC1lcy9yZWR1Y2VcIjtcbmltcG9ydCBnZXRNZW51T3B0aW9ucyBmcm9tICcuL2dldE1lbnVPcHRpb25zJztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNlbGVjdGVkSW5kZXgoY29uZmlnKSB7XG4gIHZhciBhZGRpdGlvbkxhYmVsID0gY29uZmlnLmFkZGl0aW9uTGFiZWwsXG4gICAgICBhZGRpdGlvblBvc2l0aW9uID0gY29uZmlnLmFkZGl0aW9uUG9zaXRpb24sXG4gICAgICBhbGxvd0FkZGl0aW9ucyA9IGNvbmZpZy5hbGxvd0FkZGl0aW9ucyxcbiAgICAgIGRlYnVyciA9IGNvbmZpZy5kZWJ1cnIsXG4gICAgICBtdWx0aXBsZSA9IGNvbmZpZy5tdWx0aXBsZSxcbiAgICAgIG9wdGlvbnMgPSBjb25maWcub3B0aW9ucyxcbiAgICAgIHNlYXJjaCA9IGNvbmZpZy5zZWFyY2gsXG4gICAgICBzZWFyY2hRdWVyeSA9IGNvbmZpZy5zZWFyY2hRdWVyeSxcbiAgICAgIHNlbGVjdGVkSW5kZXggPSBjb25maWcuc2VsZWN0ZWRJbmRleCxcbiAgICAgIHZhbHVlID0gY29uZmlnLnZhbHVlO1xuICB2YXIgbWVudU9wdGlvbnMgPSBnZXRNZW51T3B0aW9ucyh7XG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgc2VhcmNoUXVlcnk6IHNlYXJjaFF1ZXJ5LFxuICAgIGFkZGl0aW9uTGFiZWw6IGFkZGl0aW9uTGFiZWwsXG4gICAgYWRkaXRpb25Qb3NpdGlvbjogYWRkaXRpb25Qb3NpdGlvbixcbiAgICBhbGxvd0FkZGl0aW9uczogYWxsb3dBZGRpdGlvbnMsXG4gICAgZGVidXJyOiBkZWJ1cnIsXG4gICAgbXVsdGlwbGU6IG11bHRpcGxlLFxuICAgIHNlYXJjaDogc2VhcmNoXG4gIH0pO1xuXG4gIHZhciBlbmFibGVkSW5kZXhlcyA9IF9yZWR1Y2UobWVudU9wdGlvbnMsIGZ1bmN0aW9uIChtZW1vLCBpdGVtLCBpbmRleCkge1xuICAgIGlmICghaXRlbS5kaXNhYmxlZCkgbWVtby5wdXNoKGluZGV4KTtcbiAgICByZXR1cm4gbWVtbztcbiAgfSwgW10pO1xuXG4gIHZhciBuZXdTZWxlY3RlZEluZGV4OyAvLyB1cGRhdGUgdGhlIHNlbGVjdGVkIGluZGV4XG5cbiAgaWYgKCFzZWxlY3RlZEluZGV4IHx8IHNlbGVjdGVkSW5kZXggPCAwKSB7XG4gICAgdmFyIGZpcnN0SW5kZXggPSBlbmFibGVkSW5kZXhlc1swXTsgLy8gU2VsZWN0IHRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0sIGlmIG5vbmUsIHVzZSB0aGUgZmlyc3QgaXRlbS5cbiAgICAvLyBNdWx0aXBsZSBzZWxlY3RzIHJlbW92ZSBhY3RpdmUgaXRlbXMgZnJvbSB0aGUgbGlzdCxcbiAgICAvLyB0aGVpciBpbml0aWFsIHNlbGVjdGVkIGluZGV4IHNob3VsZCBiZSAwLlxuXG4gICAgbmV3U2VsZWN0ZWRJbmRleCA9IG11bHRpcGxlID8gZmlyc3RJbmRleCA6IF9maW5kSW5kZXgobWVudU9wdGlvbnMsIFsndmFsdWUnLCB2YWx1ZV0pIHx8IGVuYWJsZWRJbmRleGVzWzBdO1xuICB9IGVsc2UgaWYgKG11bHRpcGxlKSB7XG4gICAgbmV3U2VsZWN0ZWRJbmRleCA9IF9maW5kKGVuYWJsZWRJbmRleGVzLCBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIHJldHVybiBpbmRleCA+PSBzZWxlY3RlZEluZGV4O1xuICAgIH0pOyAvLyBtdWx0aXBsZSBzZWxlY3RzIHJlbW92ZSBvcHRpb25zIGZyb20gdGhlIG1lbnUgYXMgdGhleSBhcmUgbWFkZSBhY3RpdmVcbiAgICAvLyBrZWVwIHRoZSBzZWxlY3RlZCBpbmRleCB3aXRoaW4gcmFuZ2Ugb2YgdGhlIHJlbWFpbmluZyBpdGVtc1xuXG4gICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gbWVudU9wdGlvbnMubGVuZ3RoIC0gMSkge1xuICAgICAgbmV3U2VsZWN0ZWRJbmRleCA9IGVuYWJsZWRJbmRleGVzW2VuYWJsZWRJbmRleGVzLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBfZmluZEluZGV4KG1lbnVPcHRpb25zLCBbJ3ZhbHVlJywgdmFsdWVdKTsgLy8gcmVndWxhciBzZWxlY3RzIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSBpdGVtXG4gICAgLy8gc2V0IHRoZSBzZWxlY3RlZCBpbmRleCB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBpdGVtXG5cblxuICAgIG5ld1NlbGVjdGVkSW5kZXggPSBfaW5jbHVkZXMoZW5hYmxlZEluZGV4ZXMsIGFjdGl2ZUluZGV4KSA/IGFjdGl2ZUluZGV4IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFuZXdTZWxlY3RlZEluZGV4IHx8IG5ld1NlbGVjdGVkSW5kZXggPCAwKSB7XG4gICAgbmV3U2VsZWN0ZWRJbmRleCA9IGVuYWJsZWRJbmRleGVzWzBdO1xuICB9XG5cbiAgcmV0dXJuIG5ld1NlbGVjdGVkSW5kZXg7XG59IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgQ29tcG9uZW50LCBjaGlsZHJlblV0aWxzLCBjcmVhdGVIVE1MSWZyYW1lLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi8uLi9lbGVtZW50cy9JY29uJztcbi8qKlxuICogQW4gZW1iZWQgZGlzcGxheXMgY29udGVudCBmcm9tIG90aGVyIHdlYnNpdGVzIGxpa2UgWW91VHViZSB2aWRlb3Mgb3IgR29vZ2xlIE1hcHMuXG4gKi9cblxudmFyIEVtYmVkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKEVtYmVkLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBFbWJlZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbkNsaWNrID0gX3RoaXMucHJvcHMub25DbGljaztcbiAgICAgIHZhciBhY3RpdmUgPSBfdGhpcy5zdGF0ZS5hY3RpdmU7XG4gICAgICBpZiAob25DbGljaykgb25DbGljayhlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgYWN0aXZlOiB0cnVlXG4gICAgICB9KSk7XG4gICAgICBpZiAoIWFjdGl2ZSkgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gRW1iZWQucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRTcmMgPSBmdW5jdGlvbiBnZXRTcmMoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgX3RoaXMkcHJvcHMkYXV0b3BsYXkgPSBfdGhpcyRwcm9wcy5hdXRvcGxheSxcbiAgICAgICAgYXV0b3BsYXkgPSBfdGhpcyRwcm9wcyRhdXRvcGxheSA9PT0gdm9pZCAwID8gdHJ1ZSA6IF90aGlzJHByb3BzJGF1dG9wbGF5LFxuICAgICAgICBfdGhpcyRwcm9wcyRicmFuZGVkVUkgPSBfdGhpcyRwcm9wcy5icmFuZGVkVUksXG4gICAgICAgIGJyYW5kZWRVSSA9IF90aGlzJHByb3BzJGJyYW5kZWRVSSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfdGhpcyRwcm9wcyRicmFuZGVkVUksXG4gICAgICAgIF90aGlzJHByb3BzJGNvbG9yID0gX3RoaXMkcHJvcHMuY29sb3IsXG4gICAgICAgIGNvbG9yID0gX3RoaXMkcHJvcHMkY29sb3IgPT09IHZvaWQgMCA/ICcjNDQ0NDQ0JyA6IF90aGlzJHByb3BzJGNvbG9yLFxuICAgICAgICBfdGhpcyRwcm9wcyRoZCA9IF90aGlzJHByb3BzLmhkLFxuICAgICAgICBoZCA9IF90aGlzJHByb3BzJGhkID09PSB2b2lkIDAgPyB0cnVlIDogX3RoaXMkcHJvcHMkaGQsXG4gICAgICAgIGlkID0gX3RoaXMkcHJvcHMuaWQsXG4gICAgICAgIHNvdXJjZSA9IF90aGlzJHByb3BzLnNvdXJjZSxcbiAgICAgICAgdXJsID0gX3RoaXMkcHJvcHMudXJsO1xuXG4gICAgaWYgKHNvdXJjZSA9PT0gJ3lvdXR1YmUnKSB7XG4gICAgICByZXR1cm4gW1wiLy93d3cueW91dHViZS5jb20vZW1iZWQvXCIgKyBpZCwgJz9hdXRvaGlkZT10cnVlJywgXCImYW1wO2F1dG9wbGF5PVwiICsgYXV0b3BsYXksIFwiJmFtcDtjb2xvcj1cIiArIGVuY29kZVVSSUNvbXBvbmVudChjb2xvciksIFwiJmFtcDtocT1cIiArIGhkLCAnJmFtcDtqc2FwaT1mYWxzZScsIFwiJmFtcDttb2Rlc3RicmFuZGluZz1cIiArIGJyYW5kZWRVSSwgXCImYW1wO3JlbD1cIiArIChicmFuZGVkVUkgPyAwIDogMSldLmpvaW4oJycpO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UgPT09ICd2aW1lbycpIHtcbiAgICAgIHJldHVybiBbXCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vXCIgKyBpZCwgJz9hcGk9ZmFsc2UnLCBcIiZhbXA7YXV0b3BsYXk9XCIgKyBhdXRvcGxheSwgJyZhbXA7YnlsaW5lPWZhbHNlJywgXCImYW1wO2NvbG9yPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KGNvbG9yKSwgJyZhbXA7cG9ydHJhaXQ9ZmFsc2UnLCAnJmFtcDt0aXRsZT1mYWxzZSddLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHJldHVybiB1cmw7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYXNwZWN0UmF0aW8gPSBfdGhpcyRwcm9wczIuYXNwZWN0UmF0aW8sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIGljb24gPSBfdGhpcyRwcm9wczIuaWNvbixcbiAgICAgICAgcGxhY2Vob2xkZXIgPSBfdGhpcyRwcm9wczIucGxhY2Vob2xkZXI7XG4gICAgdmFyIGFjdGl2ZSA9IHRoaXMuc3RhdGUuYWN0aXZlO1xuICAgIHZhciBjbGFzc2VzID0gY3goJ3VpJywgYXNwZWN0UmF0aW8sIHVzZUtleU9ubHkoYWN0aXZlLCAnYWN0aXZlJyksICdlbWJlZCcsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhFbWJlZCwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRW1iZWQsIHRoaXMucHJvcHMpO1xuICAgIHZhciBpY29uU2hvcnRoYW5kID0gaWNvbiAhPT0gdW5kZWZpbmVkID8gaWNvbiA6ICd2aWRlbyBwbGF5JztcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSksIEljb24uY3JlYXRlKGljb25TaG9ydGhhbmQsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgcGxhY2Vob2xkZXIgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcInBsYWNlaG9sZGVyXCIsXG4gICAgICBzcmM6IHBsYWNlaG9sZGVyXG4gICAgfSksIHRoaXMucmVuZGVyRW1iZWQoKSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlckVtYmVkID0gZnVuY3Rpb24gcmVuZGVyRW1iZWQoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMzLmNoaWxkcmVuLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMzLmNvbnRlbnQsXG4gICAgICAgIGlmcmFtZSA9IF90aGlzJHByb3BzMy5pZnJhbWUsXG4gICAgICAgIHNvdXJjZSA9IF90aGlzJHByb3BzMy5zb3VyY2U7XG4gICAgdmFyIGFjdGl2ZSA9IHRoaXMuc3RhdGUuYWN0aXZlO1xuICAgIGlmICghYWN0aXZlKSByZXR1cm4gbnVsbDtcbiAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImVtYmVkXCJcbiAgICB9LCBjaGlsZHJlbik7XG4gICAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNvbnRlbnQpKSByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImVtYmVkXCJcbiAgICB9LCBjb250ZW50KTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImVtYmVkXCJcbiAgICB9LCBjcmVhdGVIVE1MSWZyYW1lKGNoaWxkcmVuVXRpbHMuaXNOaWwoaWZyYW1lKSA/IHRoaXMuZ2V0U3JjKCkgOiBpZnJhbWUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBhbGxvd0Z1bGxTY3JlZW46IGZhbHNlLFxuICAgICAgICBmcmFtZUJvcmRlcjogMCxcbiAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgIHNjcm9sbGluZzogJ25vJyxcbiAgICAgICAgc3JjOiB0aGlzLmdldFNyYygpLFxuICAgICAgICB0aXRsZTogXCJFbWJlZGRlZCBjb250ZW50IGZyb20gXCIgKyBzb3VyY2UgKyBcIi5cIixcbiAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgfSxcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEVtYmVkO1xufShDb21wb25lbnQpO1xuXG5FbWJlZC5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImFzcGVjdFJhdGlvXCIsIFwiYXV0b3BsYXlcIiwgXCJicmFuZGVkVUlcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29udGVudFwiLCBcImRlZmF1bHRBY3RpdmVcIiwgXCJoZFwiLCBcImljb25cIiwgXCJpZFwiLCBcImlmcmFtZVwiLCBcIm9uQ2xpY2tcIiwgXCJwbGFjZWhvbGRlclwiLCBcInNvdXJjZVwiLCBcInVybFwiXTtcbmV4cG9ydCB7IEVtYmVkIGFzIGRlZmF1bHQgfTtcbkVtYmVkLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEFuIGVtYmVkIGNhbiBiZSBhY3RpdmUuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFuIGVtYmVkIGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGFzcGVjdCByYXRpby4gKi9cbiAgYXNwZWN0UmF0aW86IFByb3BUeXBlcy5vbmVPZihbJzQ6MycsICcxNjo5JywgJzIxOjknXSksXG5cbiAgLyoqIFNldHRpbmcgdG8gdHJ1ZSBvciBmYWxzZSB3aWxsIGZvcmNlIGF1dG9wbGF5LiAqL1xuICBhdXRvcGxheTogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGVtYW5kKFsnc291cmNlJ10pLCBQcm9wVHlwZXMuYm9vbF0pLFxuXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgbmV0d29ya3MgYnJhbmRlZCBVSSBsaWtlIHRpdGxlIGNhcmRzLCBvciBhZnRlciB2aWRlbyBjYWxscyB0byBhY3Rpb24uICovXG4gIGJyYW5kZWRVSTogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGVtYW5kKFsnc291cmNlJ10pLCBQcm9wVHlwZXMuYm9vbF0pLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNwZWNpZmllcyBhIGRlZmF1bHQgY2hyb21lIGNvbG9yIHdpdGggVmltZW8gb3IgWW91VHViZS4gKi9cbiAgY29sb3I6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRlbWFuZChbJ3NvdXJjZSddKSwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEluaXRpYWwgdmFsdWUgb2YgYWN0aXZlLiAqL1xuICBkZWZhdWx0QWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogV2hldGhlciB0byBwcmVmZXIgSEQgY29udGVudC4gKi9cbiAgaGQ6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRlbWFuZChbJ3NvdXJjZSddKSwgUHJvcFR5cGVzLmJvb2xdKSxcblxuICAvKiogU3BlY2lmaWVzIGFuIGljb24gdG8gdXNlIHdpdGggcGxhY2Vob2xkZXIgY29udGVudC4gKi9cbiAgaWNvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNwZWNpZmllcyBhbiBpZCBmb3Igc291cmNlLiAqL1xuICBpZDogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGVtYW5kKFsnc291cmNlJ10pLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgSFRNTCBpZnJhbWUuICovXG4gIGlmcmFtZTogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGVtYW5kKFsnc291cmNlJ10pLCBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZF0pLFxuXG4gIC8qKlxuICAgKiDQoWFsbGVkIG9uIGNsaWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzIGFuZCBwcm9wb3NlZCB2YWx1ZS5cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBBIHBsYWNlaG9sZGVyIGltYWdlIGZvciBlbWJlZC4gKi9cbiAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNwZWNpZmllcyBhIHNvdXJjZSB0byB1c2UuICovXG4gIHNvdXJjZTogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydzb3VyY2VVcmwnXSksIFByb3BUeXBlcy5vbmVPZihbJ3lvdXR1YmUnLCAndmltZW8nXSldKSxcblxuICAvKiogU3BlY2lmaWVzIGEgdXJsIHRvIHVzZSBmb3IgZW1iZWQuICovXG4gIHVybDogY3VzdG9tUHJvcFR5cGVzLmV2ZXJ5KFtjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydzb3VyY2UnXSksIFByb3BUeXBlcy5zdHJpbmddKVxufSA6IHt9O1xuRW1iZWQuYXV0b0NvbnRyb2xsZWRQcm9wcyA9IFsnYWN0aXZlJ107IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vRW1iZWQnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2lzUGxhaW5PYmplY3QgZnJvbSBcImxvZGFzaC1lcy9pc1BsYWluT2JqZWN0XCI7XG5pbXBvcnQgX3BpY2sgZnJvbSBcImxvZGFzaC1lcy9waWNrXCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gtZXMvaW5jbHVkZXNcIjtcbmltcG9ydCBfcmVkdWNlIGZyb20gXCJsb2Rhc2gtZXMvcmVkdWNlXCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC1lcy9pc0VtcHR5XCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IHsgUmVmIH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVSZWYsIGlzVmFsaWRFbGVtZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICdzaGFsbG93ZXF1YWwnO1xuaW1wb3J0IHsgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgQ29tcG9uZW50LCBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGRvZXNOb2RlQ29udGFpbkNsaWNrLCBldmVudFN0YWNrLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIGlzQnJvd3NlciwgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgSWNvbiBmcm9tICcuLi8uLi9lbGVtZW50cy9JY29uJztcbmltcG9ydCBQb3J0YWwgZnJvbSAnLi4vLi4vYWRkb25zL1BvcnRhbCc7XG5pbXBvcnQgTW9kYWxBY3Rpb25zIGZyb20gJy4vTW9kYWxBY3Rpb25zJztcbmltcG9ydCBNb2RhbENvbnRlbnQgZnJvbSAnLi9Nb2RhbENvbnRlbnQnO1xuaW1wb3J0IE1vZGFsRGVzY3JpcHRpb24gZnJvbSAnLi9Nb2RhbERlc2NyaXB0aW9uJztcbmltcG9ydCBNb2RhbERpbW1lciBmcm9tICcuL01vZGFsRGltbWVyJztcbmltcG9ydCBNb2RhbEhlYWRlciBmcm9tICcuL01vZGFsSGVhZGVyJztcbmltcG9ydCB7IGNhbkZpdCwgZ2V0TGVnYWN5U3R5bGVzLCBpc0xlZ2FjeSB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIEEgbW9kYWwgZGlzcGxheXMgY29udGVudCB0aGF0IHRlbXBvcmFyaWx5IGJsb2NrcyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgbWFpbiB2aWV3IG9mIGEgc2l0ZS5cbiAqIEBzZWUgQ29uZmlybVxuICogQHNlZSBQb3J0YWxcbiAqL1xudmFyIE1vZGFsID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKE1vZGFsLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcbiAgICBfdGhpcy5sZWdhY3kgPSBpc0Jyb3dzZXIoKSAmJiBpc0xlZ2FjeSgpO1xuICAgIF90aGlzLnJlZiA9IC8qI19fUFVSRV9fKi9jcmVhdGVSZWYoKTtcbiAgICBfdGhpcy5kaW1tZXJSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG4gICAgX3RoaXMubGF0ZXN0RG9jdW1lbnRNb3VzZURvd25FdmVudCA9IG51bGw7XG5cbiAgICBfdGhpcy5nZXRNb3VudE5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaXNCcm93c2VyKCkgPyBfdGhpcy5wcm9wcy5tb3VudE5vZGUgfHwgZG9jdW1lbnQuYm9keSA6IG51bGw7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUFjdGlvbnNPdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbkFjdGlvbkNsaWNrOiBmdW5jdGlvbiBvbkFjdGlvbkNsaWNrKGUsIGFjdGlvblByb3BzKSB7XG4gICAgICAgICAgX2ludm9rZShwcmVkZWZpbmVkUHJvcHMsICdvbkFjdGlvbkNsaWNrJywgZSwgYWN0aW9uUHJvcHMpO1xuXG4gICAgICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQWN0aW9uQ2xpY2snLCBlLCBfdGhpcy5wcm9wcyk7XG5cbiAgICAgICAgICBfdGhpcy5oYW5kbGVDbG9zZShlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xvc2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgb3BlbjogZmFsc2VcbiAgICAgIH0pKTtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZURvY3VtZW50TW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLmxhdGVzdERvY3VtZW50TW91c2VEb3duRXZlbnQgPSBlO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVEb2N1bWVudENsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBjbG9zZU9uRGltbWVyQ2xpY2sgPSBfdGhpcy5wcm9wcy5jbG9zZU9uRGltbWVyQ2xpY2s7XG4gICAgICB2YXIgY3VycmVudERvY3VtZW50TW91c2VEb3duRXZlbnQgPSBfdGhpcy5sYXRlc3REb2N1bWVudE1vdXNlRG93bkV2ZW50O1xuICAgICAgX3RoaXMubGF0ZXN0RG9jdW1lbnRNb3VzZURvd25FdmVudCA9IG51bGw7XG4gICAgICBpZiAoIWNsb3NlT25EaW1tZXJDbGljayB8fCBkb2VzTm9kZUNvbnRhaW5DbGljayhfdGhpcy5yZWYuY3VycmVudCwgY3VycmVudERvY3VtZW50TW91c2VEb3duRXZlbnQpIHx8IGRvZXNOb2RlQ29udGFpbkNsaWNrKF90aGlzLnJlZi5jdXJyZW50LCBlKSkgcmV0dXJuO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DbG9zZScsIGUsIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICBvcGVuOiBmYWxzZVxuICAgICAgfSkpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG9wZW46IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSWNvbk92ZXJyaWRlcyA9IGZ1bmN0aW9uIChwcmVkZWZpbmVkUHJvcHMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgIF9pbnZva2UocHJlZGVmaW5lZFByb3BzLCAnb25DbGljaycsIGUpO1xuXG4gICAgICAgICAgX3RoaXMuaGFuZGxlQ2xvc2UoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU9wZW4gPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uT3BlbicsIGUsIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICBvcGVuOiB0cnVlXG4gICAgICB9KSk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgb3BlbjogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVBvcnRhbE1vdW50ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBldmVudFBvb2wgPSBfdGhpcy5wcm9wcy5ldmVudFBvb2w7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsaW5nOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzLnNldFBvc2l0aW9uQW5kQ2xhc3NOYW1lcygpO1xuXG4gICAgICBldmVudFN0YWNrLnN1YignbW91c2Vkb3duJywgX3RoaXMuaGFuZGxlRG9jdW1lbnRNb3VzZURvd24sIHtcbiAgICAgICAgcG9vbDogZXZlbnRQb29sLFxuICAgICAgICB0YXJnZXQ6IF90aGlzLmRpbW1lclJlZi5jdXJyZW50XG4gICAgICB9KTtcbiAgICAgIGV2ZW50U3RhY2suc3ViKCdjbGljaycsIF90aGlzLmhhbmRsZURvY3VtZW50Q2xpY2ssIHtcbiAgICAgICAgcG9vbDogZXZlbnRQb29sLFxuICAgICAgICB0YXJnZXQ6IF90aGlzLmRpbW1lclJlZi5jdXJyZW50XG4gICAgICB9KTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91bnQnLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVBvcnRhbFVubW91bnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIGV2ZW50UG9vbCA9IF90aGlzLnByb3BzLmV2ZW50UG9vbDtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF90aGlzLmFuaW1hdGlvblJlcXVlc3RJZCk7XG4gICAgICBldmVudFN0YWNrLnVuc3ViKCdtb3VzZWRvd24nLCBfdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlRG93biwge1xuICAgICAgICBwb29sOiBldmVudFBvb2wsXG4gICAgICAgIHRhcmdldDogX3RoaXMuZGltbWVyUmVmLmN1cnJlbnRcbiAgICAgIH0pO1xuICAgICAgZXZlbnRTdGFjay51bnN1YignY2xpY2snLCBfdGhpcy5oYW5kbGVEb2N1bWVudENsaWNrLCB7XG4gICAgICAgIHBvb2w6IGV2ZW50UG9vbCxcbiAgICAgICAgdGFyZ2V0OiBfdGhpcy5kaW1tZXJSZWYuY3VycmVudFxuICAgICAgfSk7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvblVubW91bnQnLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLnNldFBvc2l0aW9uQW5kQ2xhc3NOYW1lcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjZW50ZXJlZCA9IF90aGlzLnByb3BzLmNlbnRlcmVkO1xuICAgICAgdmFyIHNjcm9sbGluZztcbiAgICAgIHZhciBuZXdTdGF0ZSA9IHt9O1xuXG4gICAgICBpZiAoX3RoaXMucmVmLmN1cnJlbnQpIHtcbiAgICAgICAgdmFyIHJlY3QgPSBfdGhpcy5yZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICB2YXIgaXNGaXR0ZWQgPSBjYW5GaXQocmVjdCk7XG4gICAgICAgIHNjcm9sbGluZyA9ICFpc0ZpdHRlZDsgLy8gU3R5bGVzIHNob3VsZCBiZSBjb21wdXRlZCBmb3IgSUUxMVxuXG4gICAgICAgIHZhciBsZWdhY3lTdHlsZXMgPSBfdGhpcy5sZWdhY3kgPyBnZXRMZWdhY3lTdHlsZXMoaXNGaXR0ZWQsIGNlbnRlcmVkLCByZWN0KSA6IHt9O1xuXG4gICAgICAgIGlmICghc2hhbGxvd0VxdWFsKF90aGlzLnN0YXRlLmxlZ2FjeVN0eWxlcywgbGVnYWN5U3R5bGVzKSkge1xuICAgICAgICAgIG5ld1N0YXRlLmxlZ2FjeVN0eWxlcyA9IGxlZ2FjeVN0eWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy5zdGF0ZS5zY3JvbGxpbmcgIT09IHNjcm9sbGluZykge1xuICAgICAgICAgIG5ld1N0YXRlLnNjcm9sbGluZyA9IHNjcm9sbGluZztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIV9pc0VtcHR5KG5ld1N0YXRlKSkgX3RoaXMuc2V0U3RhdGUobmV3U3RhdGUpO1xuICAgICAgX3RoaXMuYW5pbWF0aW9uUmVxdWVzdElkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnNldFBvc2l0aW9uQW5kQ2xhc3NOYW1lcyk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlckNvbnRlbnQgPSBmdW5jdGlvbiAocmVzdCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgYWN0aW9ucyA9IF90aGlzJHByb3BzLmFjdGlvbnMsXG4gICAgICAgICAgYmFzaWMgPSBfdGhpcyRwcm9wcy5iYXNpYyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgICBjbG9zZUljb24gPSBfdGhpcyRwcm9wcy5jbG9zZUljb24sXG4gICAgICAgICAgY29udGVudCA9IF90aGlzJHByb3BzLmNvbnRlbnQsXG4gICAgICAgICAgaGVhZGVyID0gX3RoaXMkcHJvcHMuaGVhZGVyLFxuICAgICAgICAgIHNpemUgPSBfdGhpcyRwcm9wcy5zaXplLFxuICAgICAgICAgIHN0eWxlID0gX3RoaXMkcHJvcHMuc3R5bGU7XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBsZWdhY3lTdHlsZXMgPSBfdGhpcyRzdGF0ZS5sZWdhY3lTdHlsZXMsXG4gICAgICAgICAgc2Nyb2xsaW5nID0gX3RoaXMkc3RhdGUuc2Nyb2xsaW5nO1xuICAgICAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBzaXplLCB1c2VLZXlPbmx5KGJhc2ljLCAnYmFzaWMnKSwgdXNlS2V5T25seShfdGhpcy5sZWdhY3ksICdsZWdhY3knKSwgdXNlS2V5T25seShzY3JvbGxpbmcsICdzY3JvbGxpbmcnKSwgJ21vZGFsIHRyYW5zaXRpb24gdmlzaWJsZSBhY3RpdmUnLCBjbGFzc05hbWUpO1xuICAgICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoTW9kYWwsIF90aGlzLnByb3BzKTtcbiAgICAgIHZhciBjbG9zZUljb25OYW1lID0gY2xvc2VJY29uID09PSB0cnVlID8gJ2Nsb3NlJyA6IGNsb3NlSWNvbjtcbiAgICAgIHZhciBjbG9zZUljb25KU1ggPSBJY29uLmNyZWF0ZShjbG9zZUljb25OYW1lLCB7XG4gICAgICAgIG92ZXJyaWRlUHJvcHM6IF90aGlzLmhhbmRsZUljb25PdmVycmlkZXNcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgICAgICBpbm5lclJlZjogX3RoaXMucmVmXG4gICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIGxlZ2FjeVN0eWxlcywgc3R5bGUpXG4gICAgICB9KSwgY2xvc2VJY29uSlNYLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBNb2RhbEhlYWRlci5jcmVhdGUoaGVhZGVyLCB7XG4gICAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICAgIH0pLCBNb2RhbENvbnRlbnQuY3JlYXRlKGNvbnRlbnQsIHtcbiAgICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgICAgfSksIE1vZGFsQWN0aW9ucy5jcmVhdGUoYWN0aW9ucywge1xuICAgICAgICBvdmVycmlkZVByb3BzOiBfdGhpcy5oYW5kbGVBY3Rpb25zT3ZlcnJpZGVzXG4gICAgICB9KSkgOiBjaGlsZHJlbikpO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gTW9kYWwucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuaGFuZGxlUG9ydGFsVW5tb3VudCgpO1xuICB9IC8vIERvIG5vdCBhY2Nlc3MgZG9jdW1lbnQgd2hlbiBzZXJ2ZXIgc2lkZSByZW5kZXJpbmdcbiAgO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNlbnRlcmVkID0gX3RoaXMkcHJvcHMyLmNlbnRlcmVkLFxuICAgICAgICBjbG9zZU9uRG9jdW1lbnRDbGljayA9IF90aGlzJHByb3BzMi5jbG9zZU9uRG9jdW1lbnRDbGljayxcbiAgICAgICAgZGltbWVyID0gX3RoaXMkcHJvcHMyLmRpbW1lcixcbiAgICAgICAgZXZlbnRQb29sID0gX3RoaXMkcHJvcHMyLmV2ZW50UG9vbCxcbiAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzMi50cmlnZ2VyO1xuICAgIHZhciBfdGhpcyRzdGF0ZTIgPSB0aGlzLnN0YXRlLFxuICAgICAgICBvcGVuID0gX3RoaXMkc3RhdGUyLm9wZW4sXG4gICAgICAgIHNjcm9sbGluZyA9IF90aGlzJHN0YXRlMi5zY3JvbGxpbmc7XG4gICAgdmFyIG1vdW50Tm9kZSA9IHRoaXMuZ2V0TW91bnROb2RlKCk7IC8vIFNob3J0IGNpcmN1aXQgd2hlbiBzZXJ2ZXIgc2lkZSByZW5kZXJpbmdcblxuICAgIGlmICghaXNCcm93c2VyKCkpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovaXNWYWxpZEVsZW1lbnQodHJpZ2dlcikgPyB0cmlnZ2VyIDogbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdW5oYW5kbGVkID0gZ2V0VW5oYW5kbGVkUHJvcHMoTW9kYWwsIHRoaXMucHJvcHMpO1xuICAgIHZhciBwb3J0YWxQcm9wTmFtZXMgPSBQb3J0YWwuaGFuZGxlZFByb3BzO1xuXG4gICAgdmFyIHJlc3QgPSBfcmVkdWNlKHVuaGFuZGxlZCwgZnVuY3Rpb24gKGFjYywgdmFsLCBrZXkpIHtcbiAgICAgIGlmICghX2luY2x1ZGVzKHBvcnRhbFByb3BOYW1lcywga2V5KSkgYWNjW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9KTtcblxuICAgIHZhciBwb3J0YWxQcm9wcyA9IF9waWNrKHVuaGFuZGxlZCwgcG9ydGFsUHJvcE5hbWVzKTsgLy8gSGVhZHMgdXAhXG4gICAgLy9cbiAgICAvLyBUaGUgU1VJIENTUyBzZWxlY3RvciB0byBwcmV2ZW50IHRoZSBtb2RhbCBpdHNlbGYgZnJvbSBibHVycmluZyByZXF1aXJlcyBhbiBpbW1lZGlhdGUgLmRpbW1lciBjaGlsZDpcbiAgICAvLyAuYmx1cnJpbmcuZGltbWVkLmRpbW1hYmxlPjpub3QoLmRpbW1lcikgeyAuLi4gfVxuICAgIC8vXG4gICAgLy8gVGhlIC5ibHVycmluZy5kaW1tZWQuZGltbWFibGUgaXMgdGhlIGJvZHksIHNvIHRoYXQgYWxsIGJvZHkgY29udGVudCBpbnNpZGUgaXMgYmx1cnJlZC5cbiAgICAvLyBXZSBuZWVkIHRoZSBpbW1lZGlhdGUgY2hpbGQgdG8gYmUgdGhlIGRpbW1lciB0byA6bm90KCkgYmx1ciB0aGUgbW9kYWwgaXRzZWxmIVxuICAgIC8vIE90aGVyd2lzZSwgdGhlIHBvcnRhbCBkaXYgaXMgYWxzbyBibHVycmVkLCBibHVycmluZyB0aGUgbW9kYWwuXG4gICAgLy9cbiAgICAvLyBXZSBjYW5ub3QgdGhlbSB3cmFwIHRoZSBtb2RhbEpTWCBpbiBhbiBhY3R1YWwgPERpbW1lciAvPiBpbnN0ZWFkLCB3ZSBhcHBseSB0aGUgZGltbWVyIGNsYXNzZXMgdG8gdGhlIDxQb3J0YWwgLz4uXG5cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQb3J0YWwsIF9leHRlbmRzKHtcbiAgICAgIGNsb3NlT25Eb2N1bWVudENsaWNrOiBjbG9zZU9uRG9jdW1lbnRDbGlja1xuICAgIH0sIHBvcnRhbFByb3BzLCB7XG4gICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgZXZlbnRQb29sOiBldmVudFBvb2wsXG4gICAgICBtb3VudE5vZGU6IG1vdW50Tm9kZSxcbiAgICAgIG9wZW46IG9wZW4sXG4gICAgICBvbkNsb3NlOiB0aGlzLmhhbmRsZUNsb3NlLFxuICAgICAgb25Nb3VudDogdGhpcy5oYW5kbGVQb3J0YWxNb3VudCxcbiAgICAgIG9uT3BlbjogdGhpcy5oYW5kbGVPcGVuLFxuICAgICAgb25Vbm1vdW50OiB0aGlzLmhhbmRsZVBvcnRhbFVubW91bnRcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVmLCB7XG4gICAgICBpbm5lclJlZjogdGhpcy5kaW1tZXJSZWZcbiAgICB9LCBNb2RhbERpbW1lci5jcmVhdGUoX2lzUGxhaW5PYmplY3QoZGltbWVyKSA/IGRpbW1lciA6IHt9LCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlLFxuICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgIGJsdXJyaW5nOiBkaW1tZXIgPT09ICdibHVycmluZycsXG4gICAgICAgIGludmVydGVkOiBkaW1tZXIgPT09ICdpbnZlcnRlZCdcbiAgICAgIH0sXG4gICAgICBvdmVycmlkZVByb3BzOiB7XG4gICAgICAgIGNoaWxkcmVuOiB0aGlzLnJlbmRlckNvbnRlbnQocmVzdCksXG4gICAgICAgIGNlbnRlcmVkOiBjZW50ZXJlZCxcbiAgICAgICAgbW91bnROb2RlOiBtb3VudE5vZGUsXG4gICAgICAgIHNjcm9sbGluZzogc2Nyb2xsaW5nXG4gICAgICB9XG4gICAgfSkpKTtcbiAgfTtcblxuICByZXR1cm4gTW9kYWw7XG59KENvbXBvbmVudCk7XG5cbk1vZGFsLmhhbmRsZWRQcm9wcyA9IFtcImFjdGlvbnNcIiwgXCJhc1wiLCBcImJhc2ljXCIsIFwiY2VudGVyZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNsb3NlSWNvblwiLCBcImNsb3NlT25EaW1tZXJDbGlja1wiLCBcImNsb3NlT25Eb2N1bWVudENsaWNrXCIsIFwiY29udGVudFwiLCBcImRlZmF1bHRPcGVuXCIsIFwiZGltbWVyXCIsIFwiZXZlbnRQb29sXCIsIFwiaGVhZGVyXCIsIFwibW91bnROb2RlXCIsIFwib25BY3Rpb25DbGlja1wiLCBcIm9uQ2xvc2VcIiwgXCJvbk1vdW50XCIsIFwib25PcGVuXCIsIFwib25Vbm1vdW50XCIsIFwib3BlblwiLCBcInNpemVcIiwgXCJzdHlsZVwiLCBcInRyaWdnZXJcIl07XG5Nb2RhbC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIE1vZGFsLkFjdGlvbnMuIFR5cGljYWxseSBhbiBhcnJheSBvZiBidXR0b24gc2hvcnRoYW5kLiAqL1xuICBhY3Rpb25zOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBtb2RhbCBjYW4gcmVkdWNlIGl0cyBjb21wbGV4aXR5ICovXG4gIGJhc2ljOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBtb2RhbCBjYW4gYmUgdmVydGljYWxseSBjZW50ZXJlZCBpbiB0aGUgdmlld3BvcnQgKi9cbiAgY2VudGVyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgdGhlIGNsb3NlIGljb24uIENsb3NlcyB0aGUgbW9kYWwgb24gY2xpY2suICovXG4gIGNsb3NlSWNvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm5vZGUsIFByb3BUeXBlcy5vYmplY3QsIFByb3BUeXBlcy5ib29sXSksXG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBNb2RhbCBzaG91bGQgY2xvc2Ugd2hlbiB0aGUgZGltbWVyIGlzIGNsaWNrZWQuICovXG4gIGNsb3NlT25EaW1tZXJDbGljazogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFdoZXRoZXIgb3Igbm90IHRoZSBNb2RhbCBzaG91bGQgY2xvc2Ugd2hlbiB0aGUgZG9jdW1lbnQgaXMgY2xpY2tlZC4gKi9cbiAgY2xvc2VPbkRvY3VtZW50Q2xpY2s6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaW1wbGUgdGV4dCBjb250ZW50IGZvciB0aGUgTW9kYWwuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBJbml0aWFsIHZhbHVlIG9mIG9wZW4uICovXG4gIGRlZmF1bHRPcGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBNb2RhbCBjYW4gYXBwZWFyIGluIGEgZGltbWVyLiAqL1xuICBkaW1tZXI6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMuZnVuYywgUHJvcFR5cGVzLm9iamVjdCwgUHJvcFR5cGVzLm9uZU9mKFsnaW52ZXJ0ZWQnLCAnYmx1cnJpbmcnXSldKSxcblxuICAvKiogRXZlbnQgcG9vbCBuYW1lc3BhY2UgdGhhdCBpcyB1c2VkIHRvIGhhbmRsZSBjb21wb25lbnQgZXZlbnRzICovXG4gIGV2ZW50UG9vbDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogTW9kYWwgZGlzcGxheWVkIGFib3ZlIHRoZSBjb250ZW50IGluIGJvbGQuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFRoZSBub2RlIHdoZXJlIHRoZSBtb2RhbCBzaG91bGQgbW91bnQuIERlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHkuICovXG4gIG1vdW50Tm9kZTogUHJvcFR5cGVzLmFueSxcblxuICAvKipcbiAgICogQWN0aW9uIG9uQ2xpY2sgaGFuZGxlciB3aGVuIHVzaW5nIHNob3J0aGFuZCBgYWN0aW9uc2AuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkFjdGlvbkNsaWNrOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBjbG9zZSBldmVudCBoYXBwZW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbG9zZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwb3J0YWwgaXMgbW91bnRlZCBvbiB0aGUgRE9NLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25Nb3VudDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGFuIG9wZW4gZXZlbnQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uT3BlbjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwb3J0YWwgaXMgdW5tb3VudGVkIGZyb20gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uVW5tb3VudDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBNb2RhbCBpcyBkaXNwbGF5ZWQuICovXG4gIG9wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIG1vZGFsIGNhbiB2YXJ5IGluIHNpemUgKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKFsnbWluaScsICd0aW55JywgJ3NtYWxsJywgJ2xhcmdlJywgJ2Z1bGxzY3JlZW4nXSksXG5cbiAgLyoqIEN1c3RvbSBzdHlsZXMuICovXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKiBFbGVtZW50IHRvIGJlIHJlbmRlcmVkIGluLXBsYWNlIHdoZXJlIHRoZSBwb3J0YWwgaXMgZGVmaW5lZC4gKi9cbiAgdHJpZ2dlcjogUHJvcFR5cGVzLm5vZGVcbiAgLyoqXG4gICAqIE5PVEU6IEFueSB1bmhhbmRsZWQgcHJvcHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBQb3J0YWwgYXJlIHBhc3NlZC10aHJvdWdoXG4gICAqIHRvIHRoZSB3cmFwcGluZyBQb3J0YWwuXG4gICAqL1xuXG59IDoge307XG5Nb2RhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIGNlbnRlcmVkOiB0cnVlLFxuICBkaW1tZXI6IHRydWUsXG4gIGNsb3NlT25EaW1tZXJDbGljazogdHJ1ZSxcbiAgY2xvc2VPbkRvY3VtZW50Q2xpY2s6IGZhbHNlLFxuICBldmVudFBvb2w6ICdNb2RhbCdcbn07XG5Nb2RhbC5hdXRvQ29udHJvbGxlZFByb3BzID0gWydvcGVuJ107XG5Nb2RhbC5BY3Rpb25zID0gTW9kYWxBY3Rpb25zO1xuTW9kYWwuQ29udGVudCA9IE1vZGFsQ29udGVudDtcbk1vZGFsLkRlc2NyaXB0aW9uID0gTW9kYWxEZXNjcmlwdGlvbjtcbk1vZGFsLkRpbW1lciA9IE1vZGFsRGltbWVyO1xuTW9kYWwuSGVhZGVyID0gTW9kYWxIZWFkZXI7XG5leHBvcnQgZGVmYXVsdCBNb2RhbDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9tYXAgZnJvbSBcImxvZGFzaC1lcy9tYXBcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vLi4vZWxlbWVudHMvQnV0dG9uJztcbi8qKlxuICogQSBtb2RhbCBjYW4gY29udGFpbiBhIHJvdyBvZiBhY3Rpb25zLlxuICovXG5cbnZhciBNb2RhbEFjdGlvbnMgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoTW9kYWxBY3Rpb25zLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbEFjdGlvbnMoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVCdXR0b25PdmVycmlkZXMgPSBmdW5jdGlvbiAocHJlZGVmaW5lZFByb3BzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiBvbkNsaWNrKGUsIGJ1dHRvblByb3BzKSB7XG4gICAgICAgICAgX2ludm9rZShwcmVkZWZpbmVkUHJvcHMsICdvbkNsaWNrJywgZSwgYnV0dG9uUHJvcHMpO1xuXG4gICAgICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQWN0aW9uQ2xpY2snLCBlLCBidXR0b25Qcm9wcyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBNb2RhbEFjdGlvbnMucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3Rpb25zID0gX3RoaXMkcHJvcHMuYWN0aW9ucyxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMuY29udGVudDtcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCdhY3Rpb25zJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKE1vZGFsQWN0aW9ucywgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoTW9kYWxBY3Rpb25zLCB0aGlzLnByb3BzKTtcblxuICAgIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgICB9KSwgY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICAgIH0pLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgX21hcChhY3Rpb25zLCBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICByZXR1cm4gQnV0dG9uLmNyZWF0ZShhY3Rpb24sIHtcbiAgICAgICAgb3ZlcnJpZGVQcm9wczogX3RoaXMyLmhhbmRsZUJ1dHRvbk92ZXJyaWRlc1xuICAgICAgfSk7XG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbEFjdGlvbnM7XG59KENvbXBvbmVudCk7XG5cbk1vZGFsQWN0aW9ucy5oYW5kbGVkUHJvcHMgPSBbXCJhY3Rpb25zXCIsIFwiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJvbkFjdGlvbkNsaWNrXCJdO1xuZXhwb3J0IHsgTW9kYWxBY3Rpb25zIGFzIGRlZmF1bHQgfTtcbk1vZGFsQWN0aW9ucy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBcnJheSBvZiBzaG9ydGhhbmQgYnV0dG9ucy4gKi9cbiAgYWN0aW9uczogY3VzdG9tUHJvcFR5cGVzLmNvbGxlY3Rpb25TaG9ydGhhbmQsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKlxuICAgKiBBY3Rpb24gb25DbGljayBoYW5kbGVyIHdoZW4gdXNpbmcgc2hvcnRoYW5kIGBhY3Rpb25zYC5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBmcm9tIHRoZSBjbGlja2VkIGFjdGlvbi5cbiAgICovXG4gIG9uQWN0aW9uQ2xpY2s6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsnY2hpbGRyZW4nXSksIFByb3BUeXBlcy5mdW5jXSlcbn0gOiB7fTtcbk1vZGFsQWN0aW9ucy5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KE1vZGFsQWN0aW9ucywgZnVuY3Rpb24gKGFjdGlvbnMpIHtcbiAgcmV0dXJuIHtcbiAgICBhY3Rpb25zOiBhY3Rpb25zXG4gIH07XG59KTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIG1vZGFsIGNhbiBjb250YWluIGNvbnRlbnQuXG4gKi9cblxuZnVuY3Rpb24gTW9kYWxDb250ZW50KHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBpbWFnZSA9IHByb3BzLmltYWdlLFxuICAgICAgc2Nyb2xsaW5nID0gcHJvcHMuc2Nyb2xsaW5nO1xuICB2YXIgY2xhc3NlcyA9IGN4KGNsYXNzTmFtZSwgdXNlS2V5T25seShpbWFnZSwgJ2ltYWdlJyksIHVzZUtleU9ubHkoc2Nyb2xsaW5nLCAnc2Nyb2xsaW5nJyksICdjb250ZW50Jyk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoTW9kYWxDb250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1vZGFsQ29udGVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbk1vZGFsQ29udGVudC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImltYWdlXCIsIFwic2Nyb2xsaW5nXCJdO1xuTW9kYWxDb250ZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIG1vZGFsIGNhbiBjb250YWluIGltYWdlIGNvbnRlbnQuICovXG4gIGltYWdlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBtb2RhbCBjYW4gdXNlIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2NyZWVuLiAqL1xuICBzY3JvbGxpbmc6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5Nb2RhbENvbnRlbnQuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShNb2RhbENvbnRlbnQsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBNb2RhbENvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBtb2RhbCBjYW4gY29udGFpbiBhIGRlc2NyaXB0aW9uIHdpdGggb25lIG9yIG1vcmUgcGFyYWdyYXBocy5cbiAqL1xuXG5mdW5jdGlvbiBNb2RhbERlc2NyaXB0aW9uKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2Rlc2NyaXB0aW9uJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhNb2RhbERlc2NyaXB0aW9uLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1vZGFsRGVzY3JpcHRpb24sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Nb2RhbERlc2NyaXB0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuTW9kYWxEZXNjcmlwdGlvbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgTW9kYWxEZXNjcmlwdGlvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCB7IFJlZiB9IGZyb20gJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtcmVmJztcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUNsYXNzTmFtZXNPbk5vZGUsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIG1vZGFsIGhhcyBhIGRpbW1lci5cbiAqL1xuXG5mdW5jdGlvbiBNb2RhbERpbW1lcihwcm9wcykge1xuICB2YXIgYmx1cnJpbmcgPSBwcm9wcy5ibHVycmluZyxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjZW50ZXJlZCA9IHByb3BzLmNlbnRlcmVkLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBpbnZlcnRlZCA9IHByb3BzLmludmVydGVkLFxuICAgICAgbW91bnROb2RlID0gcHJvcHMubW91bnROb2RlLFxuICAgICAgc2Nyb2xsaW5nID0gcHJvcHMuc2Nyb2xsaW5nO1xuICB2YXIgcmVmID0gUmVhY3QudXNlUmVmKCk7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksIHVzZUtleU9ubHkoIWNlbnRlcmVkLCAndG9wIGFsaWduZWQnKSwgJ3BhZ2UgbW9kYWxzIGRpbW1lciB0cmFuc2l0aW9uIHZpc2libGUgYWN0aXZlJywgY2xhc3NOYW1lKTtcbiAgdmFyIGJvZHlDbGFzc2VzID0gY3goJ2RpbW1hYmxlIGRpbW1lZCcsIHVzZUtleU9ubHkoYmx1cnJpbmcsICdibHVycmluZycpLCB1c2VLZXlPbmx5KHNjcm9sbGluZywgJ3Njcm9sbGluZycpKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhNb2RhbERpbW1lciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShNb2RhbERpbW1lciwgcHJvcHMpO1xuICB1c2VDbGFzc05hbWVzT25Ob2RlKG1vdW50Tm9kZSwgYm9keUNsYXNzZXMpO1xuICBSZWFjdC51c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChyZWYuY3VycmVudCAmJiByZWYuY3VycmVudC5zdHlsZSkge1xuICAgICAgcmVmLmN1cnJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnZmxleCcsICdpbXBvcnRhbnQnKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZiwge1xuICAgIGlubmVyUmVmOiByZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbikpO1xufVxuXG5Nb2RhbERpbW1lci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImJsdXJyaW5nXCIsIFwiY2VudGVyZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJpbnZlcnRlZFwiLCBcIm1vdW50Tm9kZVwiLCBcInNjcm9sbGluZ1wiXTtcbk1vZGFsRGltbWVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgZGltbWVyIGNhbiBiZSBibHVycmVkLiAqL1xuICBibHVycmluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBkaW1tZXIgY2FuIGNlbnRlciBpdHMgY29udGVudHMgaW4gdGhlIHZpZXdwb3J0LiAqL1xuICBjZW50ZXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBkaW1tZXIgY2FuIGJlIGludmVydGVkLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFRoZSBub2RlIHdoZXJlIHRoZSBtb2RhbCBzaG91bGQgbW91bnQuIERlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHkuICovXG4gIG1vdW50Tm9kZTogUHJvcFR5cGVzLmFueSxcblxuICAvKiogQSBkaW1tZXIgY2FuIG1ha2UgYm9keSBzY3JvbGxhYmxlLiAqL1xuICBzY3JvbGxpbmc6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5Nb2RhbERpbW1lci5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KE1vZGFsRGltbWVyLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgTW9kYWxEaW1tZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBtb2RhbCBjYW4gaGF2ZSBhIGhlYWRlci5cbiAqL1xuXG5mdW5jdGlvbiBNb2RhbEhlYWRlcihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdoZWFkZXInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKE1vZGFsSGVhZGVyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKE1vZGFsSGVhZGVyLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuTW9kYWxIZWFkZXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5Nb2RhbEhlYWRlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuTW9kYWxIZWFkZXIuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShNb2RhbEhlYWRlciwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IE1vZGFsSGVhZGVyOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL01vZGFsJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJL2Jsb2IvMi40LjEvc3JjL2RlZmluaXRpb25zL21vZHVsZXMvbW9kYWwuanMjTDk1NlxudmFyIE9GRlNFVCA9IDA7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUkvYmxvYi8yLjQuMS9zcmMvZGVmaW5pdGlvbnMvbW9kdWxlcy9tb2RhbC5qcyNMOTkwXG5cbnZhciBQQURESU5HID0gNTA7XG4vKipcbiAqIEVuc3VyZXMgdGhhdCBtb2RhbCBjYW4gZml0IHZpZXdwb3J0IHdpdGhvdXQgc2Nyb2xsLlxuICpcbiAqIEBwYXJhbSBtb2RhbFJlY3Qge0RPTVJlY3R9XG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJL2Jsb2IvMi40LjEvc3JjL2RlZmluaXRpb25zL21vZHVsZXMvbW9kYWwuanMjTDYwOFxuICovXG5cbmV4cG9ydCB2YXIgY2FuRml0ID0gZnVuY3Rpb24gY2FuRml0KG1vZGFsUmVjdCkge1xuICAvLyBvcmlnaW5hbDogc2Nyb2xsSGVpZ2h0ID0gJG1vZHVsZS5wcm9wKCdzY3JvbGxIZWlnaHQnKSxcbiAgLy8gaXMgcmVwbGFjZWQgYnkgLmhlaWdodCBiZWNhdXNlIHNjcm9sbEhlaWdodCBwcm92aWRlcyBpbnRlZ2VyIHdoaWNoIHByb2R1Y2VzIGdsaXRjaGVzXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUktUmVhY3QvaXNzdWVzLzIyMjFcbiAgdmFyIHNjcm9sbEhlaWdodCA9IG1vZGFsUmVjdC5oZWlnaHQgKyBPRkZTRVQ7IC8vICRtb2R1bGUub3V0ZXJIZWlnaHQoKSArIHNldHRpbmdzLm9mZnNldFxuXG4gIHZhciBoZWlnaHQgPSBtb2RhbFJlY3QuaGVpZ2h0ICsgT0ZGU0VUOyAvLyBvcmlnaW5hbDogJCh3aW5kb3cpLmhlaWdodCgpXG5cbiAgdmFyIGNvbnRleHRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gIHZhciB2ZXJ0aWNhbENlbnRlciA9IGNvbnRleHRIZWlnaHQgLyAyO1xuICB2YXIgdG9wT2Zmc2V0ID0gLShoZWlnaHQgLyAyKTsgLy8gcGFkZGluZyB3aXRoIGVkZ2Ugb2YgcGFnZVxuXG4gIHZhciBwYWRkaW5nSGVpZ2h0ID0gUEFERElORztcbiAgdmFyIHN0YXJ0UG9zaXRpb24gPSB2ZXJ0aWNhbENlbnRlciArIHRvcE9mZnNldDsgLy8gMFxuICAvLyBvcmlnaW5hbDogc2Nyb2xsSGVpZ2h0ID4gaGVpZ2h0XG4gIC8vICAgICA/IHN0YXJ0UG9zaXRpb24gKyBzY3JvbGxIZWlnaHQgKyBwYWRkaW5nSGVpZ2h0IDwgY29udGV4dEhlaWdodFxuICAvLyAgICAgOiBoZWlnaHQgKyBwYWRkaW5nSGVpZ2h0ICogMiA8IGNvbnRleHRIZWlnaHRcblxuICByZXR1cm4gc3RhcnRQb3NpdGlvbiArIHNjcm9sbEhlaWdodCArIHBhZGRpbmdIZWlnaHQgPCBjb250ZXh0SGVpZ2h0O1xufTtcbi8qKlxuICogQ3JlYXRlcyBsZWdhY3kgc3R5bGVzIGZvciBJRTExLlxuICpcbiAqIEBwYXJhbSBpc0ZpdHRlZCB7Qm9vbGVhbn1cbiAqIEBwYXJhbSBjZW50ZXJlZCB7Qm9vbGVhbn1cbiAqIEBwYXJhbSBtb2RhbFJlY3Qge0RPTVJlY3R9XG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJL2Jsb2IvMi40LjEvc3JjL2RlZmluaXRpb25zL21vZHVsZXMvbW9kYWwuanMjTDcxOFxuICovXG5cbmV4cG9ydCB2YXIgZ2V0TGVnYWN5U3R5bGVzID0gZnVuY3Rpb24gZ2V0TGVnYWN5U3R5bGVzKGlzRml0dGVkLCBjZW50ZXJlZCwgbW9kYWxSZWN0KSB7XG4gIHZhciBtYXJnaW5Ub3AgPSBjZW50ZXJlZCAmJiBpc0ZpdHRlZCA/IC0obW9kYWxSZWN0LmhlaWdodCAvIDIpIDogMDtcbiAgdmFyIG1hcmdpbkxlZnQgPSAtKG1vZGFsUmVjdC53aWR0aCAvIDIpO1xuICByZXR1cm4ge1xuICAgIG1hcmdpbkxlZnQ6IG1hcmdpbkxlZnQsXG4gICAgbWFyZ2luVG9wOiBtYXJnaW5Ub3BcbiAgfTtcbn07IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9TZW1hbnRpYy1PcmcvU2VtYW50aWMtVUkvYmxvYi8yLjQuMS9zcmMvZGVmaW5pdGlvbnMvbW9kdWxlcy9tb2RhbC5qcyNMNjMxXG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbmV4cG9ydCB2YXIgaXNMZWdhY3kgPSBmdW5jdGlvbiBpc0xlZ2FjeSgpIHtcbiAgcmV0dXJuICF3aW5kb3cuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gd2luZG93O1xufTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX2lzVW5kZWZpbmVkIGZyb20gXCJsb2Rhc2gtZXMvaXNVbmRlZmluZWRcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgX2lzQXJyYXkgZnJvbSBcImxvZGFzaC1lcy9pc0FycmF5XCI7XG5pbXBvcnQgX3BpY2sgZnJvbSBcImxvZGFzaC1lcy9waWNrXCI7XG5pbXBvcnQgX2luY2x1ZGVzIGZyb20gXCJsb2Rhc2gtZXMvaW5jbHVkZXNcIjtcbmltcG9ydCBfcmVkdWNlIGZyb20gXCJsb2Rhc2gtZXMvcmVkdWNlXCI7XG5pbXBvcnQgRXZlbnRTdGFjayBmcm9tICdAc2VtYW50aWMtdWktcmVhY3QvZXZlbnQtc3RhY2snO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBQb3BwZXIgfSBmcm9tICdyZWFjdC1wb3BwZXInO1xuaW1wb3J0IHNoYWxsb3dFcXVhbCBmcm9tICdzaGFsbG93ZXF1YWwnO1xuaW1wb3J0IHsgZXZlbnRTdGFjaywgY2hpbGRyZW5VdGlscywgY3JlYXRlSFRNTERpdmlzaW9uLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VLZXlPclZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBQb3J0YWwgZnJvbSAnLi4vLi4vYWRkb25zL1BvcnRhbCc7XG5pbXBvcnQgeyBwbGFjZW1lbnRNYXBwaW5nLCBwb3NpdGlvbnMsIHBvc2l0aW9uc01hcHBpbmcgfSBmcm9tICcuL2xpYi9wb3NpdGlvbnMnO1xuaW1wb3J0IGNyZWF0ZVJlZmVyZW5jZVByb3h5IGZyb20gJy4vbGliL2NyZWF0ZVJlZmVyZW5jZVByb3h5JztcbmltcG9ydCBQb3B1cENvbnRlbnQgZnJvbSAnLi9Qb3B1cENvbnRlbnQnO1xuaW1wb3J0IFBvcHVwSGVhZGVyIGZyb20gJy4vUG9wdXBIZWFkZXInO1xuXG4vKipcbiAqIEEgUG9wdXAgZGlzcGxheXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0b3Agb2YgYSBwYWdlLlxuICovXG52YXIgUG9wdXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUG9wdXAsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBvcHVwKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnN0YXRlID0ge307XG4gICAgX3RoaXMub3BlbiA9IGZhbHNlO1xuICAgIF90aGlzLnpJbmRleFdhc1N5bmNlZCA9IGZhbHNlO1xuICAgIF90aGlzLnRyaWdnZXJSZWYgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlUmVmKCk7XG5cbiAgICBfdGhpcy5nZXRQb3J0YWxQcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBwb3J0YWxQcm9wcyA9IHt9O1xuICAgICAgdmFyIF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgb24gPSBfdGhpcyRwcm9wcy5vbixcbiAgICAgICAgICBob3ZlcmFibGUgPSBfdGhpcyRwcm9wcy5ob3ZlcmFibGU7XG4gICAgICB2YXIgbm9ybWFsaXplZE9uID0gX2lzQXJyYXkob24pID8gb24gOiBbb25dO1xuXG4gICAgICBpZiAoaG92ZXJhYmxlKSB7XG4gICAgICAgIHBvcnRhbFByb3BzLmNsb3NlT25Qb3J0YWxNb3VzZUxlYXZlID0gdHJ1ZTtcbiAgICAgICAgcG9ydGFsUHJvcHMubW91c2VMZWF2ZURlbGF5ID0gMzAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2luY2x1ZGVzKG5vcm1hbGl6ZWRPbiwgJ2hvdmVyJykpIHtcbiAgICAgICAgcG9ydGFsUHJvcHMub3Blbk9uVHJpZ2dlckNsaWNrID0gZmFsc2U7XG4gICAgICAgIHBvcnRhbFByb3BzLmNsb3NlT25UcmlnZ2VyQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgcG9ydGFsUHJvcHMub3Blbk9uVHJpZ2dlck1vdXNlRW50ZXIgPSB0cnVlO1xuICAgICAgICBwb3J0YWxQcm9wcy5jbG9zZU9uVHJpZ2dlck1vdXNlTGVhdmUgPSB0cnVlOyAvLyBUYWtlbiBmcm9tIFNVSTogaHR0cHM6Ly9naXQuaW8vdlBtQ21cblxuICAgICAgICBwb3J0YWxQcm9wcy5tb3VzZUxlYXZlRGVsYXkgPSA3MDtcbiAgICAgICAgcG9ydGFsUHJvcHMubW91c2VFbnRlckRlbGF5ID0gNTA7XG4gICAgICB9XG5cbiAgICAgIGlmIChfaW5jbHVkZXMobm9ybWFsaXplZE9uLCAnY2xpY2snKSkge1xuICAgICAgICBwb3J0YWxQcm9wcy5vcGVuT25UcmlnZ2VyQ2xpY2sgPSB0cnVlO1xuICAgICAgICBwb3J0YWxQcm9wcy5jbG9zZU9uVHJpZ2dlckNsaWNrID0gdHJ1ZTtcbiAgICAgICAgcG9ydGFsUHJvcHMuY2xvc2VPbkRvY3VtZW50Q2xpY2sgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoX2luY2x1ZGVzKG5vcm1hbGl6ZWRPbiwgJ2ZvY3VzJykpIHtcbiAgICAgICAgcG9ydGFsUHJvcHMub3Blbk9uVHJpZ2dlckZvY3VzID0gdHJ1ZTtcbiAgICAgICAgcG9ydGFsUHJvcHMuY2xvc2VPblRyaWdnZXJCbHVyID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBvcnRhbFByb3BzO1xuICAgIH07XG5cbiAgICBfdGhpcy5oaWRlT25TY3JvbGwgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBjbG9zZWQ6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBldmVudFN0YWNrLnVuc3ViKCdzY3JvbGwnLCBfdGhpcy5oaWRlT25TY3JvbGwsIHtcbiAgICAgICAgdGFyZ2V0OiB3aW5kb3dcbiAgICAgIH0pO1xuICAgICAgX3RoaXMudGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBjbG9zZWQ6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSwgNTApO1xuXG4gICAgICBfdGhpcy5oYW5kbGVDbG9zZShlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xvc2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgb3BlbjogZmFsc2VcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlT3BlbiA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25PcGVuJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIG9wZW46IHRydWVcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlUG9ydGFsTW91bnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91bnQnLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVBvcnRhbFVubW91bnQgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMucG9zaXRpb25VcGRhdGUgPSBudWxsO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25Vbm1vdW50JywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJDb250ZW50ID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBwb3BwZXJQbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudCxcbiAgICAgICAgICBwb3BwZXJSZWYgPSBfcmVmLnJlZixcbiAgICAgICAgICB1cGRhdGUgPSBfcmVmLnVwZGF0ZSxcbiAgICAgICAgICBwb3BwZXJTdHlsZSA9IF9yZWYuc3R5bGU7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgYmFzaWMgPSBfdGhpcyRwcm9wczIuYmFzaWMsXG4gICAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wczIuY2hpbGRyZW4sXG4gICAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMyLmNvbnRlbnQsXG4gICAgICAgICAgaGlkZU9uU2Nyb2xsID0gX3RoaXMkcHJvcHMyLmhpZGVPblNjcm9sbCxcbiAgICAgICAgICBmbG93aW5nID0gX3RoaXMkcHJvcHMyLmZsb3dpbmcsXG4gICAgICAgICAgaGVhZGVyID0gX3RoaXMkcHJvcHMyLmhlYWRlcixcbiAgICAgICAgICBpbnZlcnRlZCA9IF90aGlzJHByb3BzMi5pbnZlcnRlZCxcbiAgICAgICAgICBwb3BwZXIgPSBfdGhpcyRwcm9wczIucG9wcGVyLFxuICAgICAgICAgIHNpemUgPSBfdGhpcyRwcm9wczIuc2l6ZSxcbiAgICAgICAgICBzdHlsZSA9IF90aGlzJHByb3BzMi5zdHlsZSxcbiAgICAgICAgICB3aWRlID0gX3RoaXMkcHJvcHMyLndpZGU7XG4gICAgICB2YXIgY29udGVudFJlc3RQcm9wcyA9IF90aGlzLnN0YXRlLmNvbnRlbnRSZXN0UHJvcHM7XG4gICAgICBfdGhpcy5wb3NpdGlvblVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgIHZhciBjbGFzc2VzID0gY3goJ3VpJywgcGxhY2VtZW50TWFwcGluZ1twb3BwZXJQbGFjZW1lbnRdLCBzaXplLCB1c2VLZXlPclZhbHVlQW5kS2V5KHdpZGUsICd3aWRlJyksIHVzZUtleU9ubHkoYmFzaWMsICdiYXNpYycpLCB1c2VLZXlPbmx5KGZsb3dpbmcsICdmbG93aW5nJyksIHVzZUtleU9ubHkoaW52ZXJ0ZWQsICdpbnZlcnRlZCcpLCAncG9wdXAgdHJhbnNpdGlvbiB2aXNpYmxlJywgY2xhc3NOYW1lKTtcbiAgICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFBvcHVwLCBfdGhpcy5wcm9wcyk7XG5cbiAgICAgIHZhciBzdHlsZXMgPSBfZXh0ZW5kcyh7XG4gICAgICAgIC8vIEhlYWRzIHVwISBXZSBuZWVkIGRlZmF1bHQgc3R5bGVzIHRvIGdldCB3b3JraW5nIGNvcnJlY3RseSBgZmxvd2luZ2BcbiAgICAgICAgbGVmdDogJ2F1dG8nLFxuICAgICAgICByaWdodDogJ2F1dG8nLFxuICAgICAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIHRvIGJlIHByb3Blcmx5IHBvc2l0aW9uZWQgaW5zaWRlIHdyYXBwaW5nIGBkaXZgXG4gICAgICAgIHBvc2l0aW9uOiAnaW5pdGlhbCdcbiAgICAgIH0sIHN0eWxlKTtcblxuICAgICAgdmFyIGlubmVyRWxlbWVudCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgY29udGVudFJlc3RQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICAgIHN0eWxlOiBzdHlsZXNcbiAgICAgIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCBQb3B1cEhlYWRlci5jcmVhdGUoaGVhZGVyLCB7XG4gICAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICAgIH0pLCBQb3B1cENvbnRlbnQuY3JlYXRlKGNvbnRlbnQsIHtcbiAgICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgICAgfSkpIDogY2hpbGRyZW4sIGhpZGVPblNjcm9sbCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFdmVudFN0YWNrLCB7XG4gICAgICAgIG9uOiBfdGhpcy5oaWRlT25TY3JvbGwsXG4gICAgICAgIG5hbWU6IFwic2Nyb2xsXCIsXG4gICAgICAgIHRhcmdldDogXCJ3aW5kb3dcIlxuICAgICAgfSkpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvYmxvYi9mMWY5ZDFhYjc1YjZiMGU5NjJmOTBhNWIyYTUwZjZjZmQzMDdkNzk0L3NyYy9jcmVhdGVQb3BwZXIuanMjTDEzNi1MMTM3XG4gICAgICAvLyBIZWFkcyB1cCFcbiAgICAgIC8vIEEgd3JhcHBpbmcgYGRpdmAgdGhlcmUgaXMgYSBwdXJlIG1hZ2ljLCBpdCdzIHJlcXVpcmVkIGFzIFBvcHBlciB3YXJucyBvbiBtYXJnaW5zIHRoYXQgYXJlXG4gICAgICAvLyBkZWZpbmVkIGJ5IFNVSSBDU1MuIEl0IGFsc28gbWVhbnMgdGhhdCB0aGlzIGBkaXZgIHdpbGwgYmUgcG9zaXRpb25lZCBpbnN0ZWFkIG9mIGBjb250ZW50YC5cblxuICAgICAgcmV0dXJuIGNyZWF0ZUhUTUxEaXZpc2lvbihwb3BwZXIgfHwge30sIHtcbiAgICAgICAgb3ZlcnJpZGVQcm9wczoge1xuICAgICAgICAgIGNoaWxkcmVuOiBpbm5lckVsZW1lbnQsXG4gICAgICAgICAgcmVmOiBwb3BwZXJSZWYsXG4gICAgICAgICAgc3R5bGU6IF9leHRlbmRzKHtcbiAgICAgICAgICAgIC8vIEZpeGVzIGxheW91dCBmb3IgZmxvYXRlZCBlbGVtZW50c1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbWFudGljLU9yZy9TZW1hbnRpYy1VSS1SZWFjdC9pc3N1ZXMvNDA5MlxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgICAgICAgfSwgcG9wcGVyU3R5bGUpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBQb3B1cC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLmNsb3NlZCB8fCBzdGF0ZS5kaXNhYmxlZCkgcmV0dXJuIHt9O1xuICAgIHZhciB1bmhhbmRsZWRQcm9wcyA9IGdldFVuaGFuZGxlZFByb3BzKFBvcHVwLCBwcm9wcyk7XG5cbiAgICB2YXIgY29udGVudFJlc3RQcm9wcyA9IF9yZWR1Y2UodW5oYW5kbGVkUHJvcHMsIGZ1bmN0aW9uIChhY2MsIHZhbCwga2V5KSB7XG4gICAgICBpZiAoIV9pbmNsdWRlcyhQb3J0YWwuaGFuZGxlZFByb3BzLCBrZXkpKSBhY2Nba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuXG4gICAgdmFyIHBvcnRhbFJlc3RQcm9wcyA9IF9waWNrKHVuaGFuZGxlZFByb3BzLCBQb3J0YWwuaGFuZGxlZFByb3BzKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50UmVzdFByb3BzOiBjb250ZW50UmVzdFByb3BzLFxuICAgICAgcG9ydGFsUmVzdFByb3BzOiBwb3J0YWxSZXN0UHJvcHNcbiAgICB9O1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBQb3B1cC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgZGVwc0VxdWFsID0gc2hhbGxvd0VxdWFsKHRoaXMucHJvcHMucG9wcGVyRGVwZW5kZW5jaWVzLCBwcmV2UHJvcHMucG9wcGVyRGVwZW5kZW5jaWVzKTtcblxuICAgIGlmICghZGVwc0VxdWFsKSB7XG4gICAgICB0aGlzLmhhbmRsZVVwZGF0ZSgpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICB9O1xuXG4gIF9wcm90by5oYW5kbGVVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXMucG9zaXRpb25VcGRhdGUpIHRoaXMucG9zaXRpb25VcGRhdGUoKTtcbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIF90aGlzJHByb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNvbnRleHQgPSBfdGhpcyRwcm9wczMuY29udGV4dCxcbiAgICAgICAgZGlzYWJsZWQgPSBfdGhpcyRwcm9wczMuZGlzYWJsZWQsXG4gICAgICAgIGV2ZW50c0VuYWJsZWQgPSBfdGhpcyRwcm9wczMuZXZlbnRzRW5hYmxlZCxcbiAgICAgICAgb2Zmc2V0ID0gX3RoaXMkcHJvcHMzLm9mZnNldCxcbiAgICAgICAgcGlubmVkID0gX3RoaXMkcHJvcHMzLnBpbm5lZCxcbiAgICAgICAgcG9wcGVyID0gX3RoaXMkcHJvcHMzLnBvcHBlcixcbiAgICAgICAgcG9wcGVyTW9kaWZpZXJzID0gX3RoaXMkcHJvcHMzLnBvcHBlck1vZGlmaWVycyxcbiAgICAgICAgcG9zaXRpb24gPSBfdGhpcyRwcm9wczMucG9zaXRpb24sXG4gICAgICAgIHBvc2l0aW9uRml4ZWQgPSBfdGhpcyRwcm9wczMucG9zaXRpb25GaXhlZCxcbiAgICAgICAgdHJpZ2dlciA9IF90aGlzJHByb3BzMy50cmlnZ2VyO1xuICAgIHZhciBfdGhpcyRzdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIGNsb3NlZCA9IF90aGlzJHN0YXRlLmNsb3NlZCxcbiAgICAgICAgcG9ydGFsUmVzdFByb3BzID0gX3RoaXMkc3RhdGUucG9ydGFsUmVzdFByb3BzO1xuXG4gICAgaWYgKGNsb3NlZCB8fCBkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXI7XG4gICAgfVxuXG4gICAgdmFyIG1vZGlmaWVycyA9IFt7XG4gICAgICBuYW1lOiAnYXJyb3cnLFxuICAgICAgZW5hYmxlZDogZmFsc2VcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnZXZlbnRMaXN0ZW5lcnMnLFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBzY3JvbGw6ICEhZXZlbnRzRW5hYmxlZCxcbiAgICAgICAgcmVzaXplOiAhIWV2ZW50c0VuYWJsZWRcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICBlbmFibGVkOiAhcGlubmVkXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICBlbmFibGVkOiAhIW9mZnNldFxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdvZmZzZXQnLFxuICAgICAgZW5hYmxlZDogISFvZmZzZXQsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICB9XG4gICAgfV0uY29uY2F0KHBvcHBlck1vZGlmaWVycywgWy8vIFdlIGFyZSBzeW5jaW5nIHpJbmRleCBmcm9tIGAudWkucG9wdXAuY29udGVudGAgdG8gYXZvaWQgbGF5ZXJpbmcgaXNzdWVzIGFzIGluIFNVSVIgd2UgYXJlIHVzaW5nIGFuIGFkZGl0aW9uYWxcbiAgICAvLyBgZGl2YCBmb3IgUG9wcGVyLmpzXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1NlbWFudGljLU9yZy9TZW1hbnRpYy1VSS1SZWFjdC9pc3N1ZXMvNDA4M1xuICAgIHtcbiAgICAgIG5hbWU6ICdzeW5jWkluZGV4JyxcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBwaGFzZTogJ2JlZm9yZVJlYWQnLFxuICAgICAgZm46IGZ1bmN0aW9uIGZuKF9yZWYyKSB7XG4gICAgICAgIHZhciBfcG9wcGVyJHN0eWxlO1xuXG4gICAgICAgIHZhciBzdGF0ZSA9IF9yZWYyLnN0YXRlO1xuXG4gICAgICAgIGlmIChfdGhpczIuekluZGV4V2FzU3luY2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIGlmIHpJbmRleCBkZWZpbmVkIGluIDxQb3B1cCBwb3BwZXI9e3sgc3R5bGU6IHt9IH19IC8+IHRoZXJlIGlzIG5vIHNlbnNlIHRvIG92ZXJyaWRlIGl0XG5cblxuICAgICAgICB2YXIgZGVmaW5lZFpJbmRleCA9IHBvcHBlciA9PSBudWxsID8gdm9pZCAwIDogKF9wb3BwZXIkc3R5bGUgPSBwb3BwZXIuc3R5bGUpID09IG51bGwgPyB2b2lkIDAgOiBfcG9wcGVyJHN0eWxlLnpJbmRleDtcblxuICAgICAgICBpZiAoX2lzVW5kZWZpbmVkKGRlZmluZWRaSW5kZXgpKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgc3RhdGUuZWxlbWVudHMucG9wcGVyLnN0eWxlLnpJbmRleCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5maXJzdENoaWxkKS56SW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIuekluZGV4V2FzU3luY2VkID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBlZmZlY3Q6IGZ1bmN0aW9uIGVmZmVjdCgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIuekluZGV4V2FzU3luY2VkID0gZmFsc2U7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfV0pO1xuICAgIHZhciByZWZlcmVuY2VFbGVtZW50ID0gY3JlYXRlUmVmZXJlbmNlUHJveHkoX2lzTmlsKGNvbnRleHQpID8gdGhpcy50cmlnZ2VyUmVmIDogY29udGV4dCk7XG5cbiAgICB2YXIgbWVyZ2VkUG9ydGFsUHJvcHMgPSBfZXh0ZW5kcyh7fSwgdGhpcy5nZXRQb3J0YWxQcm9wcygpLCBwb3J0YWxSZXN0UHJvcHMpO1xuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcnRhbCwgX2V4dGVuZHMoe30sIG1lcmdlZFBvcnRhbFByb3BzLCB7XG4gICAgICBvbkNsb3NlOiB0aGlzLmhhbmRsZUNsb3NlLFxuICAgICAgb25Nb3VudDogdGhpcy5oYW5kbGVQb3J0YWxNb3VudCxcbiAgICAgIG9uT3BlbjogdGhpcy5oYW5kbGVPcGVuLFxuICAgICAgb25Vbm1vdW50OiB0aGlzLmhhbmRsZVBvcnRhbFVubW91bnQsXG4gICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgdHJpZ2dlclJlZjogdGhpcy50cmlnZ2VyUmVmXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFBvcHBlciwge1xuICAgICAgbW9kaWZpZXJzOiBtb2RpZmllcnMsXG4gICAgICBwbGFjZW1lbnQ6IHBvc2l0aW9uc01hcHBpbmdbcG9zaXRpb25dLFxuICAgICAgc3RyYXRlZ3k6IHBvc2l0aW9uRml4ZWQgPyAnZml4ZWQnIDogbnVsbCxcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQ6IHJlZmVyZW5jZUVsZW1lbnRcbiAgICB9LCB0aGlzLnJlbmRlckNvbnRlbnQpKTtcbiAgfTtcblxuICByZXR1cm4gUG9wdXA7XG59KENvbXBvbmVudCk7XG5cblBvcHVwLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiYmFzaWNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJjb250ZXh0XCIsIFwiZGlzYWJsZWRcIiwgXCJldmVudHNFbmFibGVkXCIsIFwiZmxvd2luZ1wiLCBcImhlYWRlclwiLCBcImhpZGVPblNjcm9sbFwiLCBcImhvdmVyYWJsZVwiLCBcImludmVydGVkXCIsIFwib2Zmc2V0XCIsIFwib25cIiwgXCJvbkNsb3NlXCIsIFwib25Nb3VudFwiLCBcIm9uT3BlblwiLCBcIm9uVW5tb3VudFwiLCBcInBpbm5lZFwiLCBcInBvcHBlclwiLCBcInBvcHBlckRlcGVuZGVuY2llc1wiLCBcInBvcHBlck1vZGlmaWVyc1wiLCBcInBvc2l0aW9uXCIsIFwicG9zaXRpb25GaXhlZFwiLCBcInNpemVcIiwgXCJzdHlsZVwiLCBcInRyaWdnZXJcIiwgXCJ3aWRlXCJdO1xuZXhwb3J0IHsgUG9wdXAgYXMgZGVmYXVsdCB9O1xuUG9wdXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogRGlzcGxheSB0aGUgcG9wdXAgd2l0aG91dCB0aGUgcG9pbnRpbmcgYXJyb3cuICovXG4gIGJhc2ljOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaW1wbGUgdGV4dCBjb250ZW50IGZvciB0aGUgcG9wb3Zlci4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEV4aXN0aW5nIGVsZW1lbnQgdGhlIHBvcC11cCBzaG91bGQgYmUgYm91bmQgdG8uICovXG4gIGNvbnRleHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5vYmplY3QsIGN1c3RvbVByb3BUeXBlcy5yZWZPYmplY3RdKSxcblxuICAvKiogQSBkaXNhYmxlZCBwb3B1cCBvbmx5IHJlbmRlcnMgaXRzIHRyaWdnZXIuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogRW5hYmxlcyB0aGUgUG9wcGVyLmpzIGV2ZW50IGxpc3RlbmVycy4gKi9cbiAgZXZlbnRzRW5hYmxlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgZmxvd2luZyBQb3B1cCBoYXMgbm8gbWF4aW11bSB3aWR0aCBhbmQgY29udGludWVzIHRvIGZsb3cgdG8gZml0IGl0cyBjb250ZW50LiAqL1xuICBmbG93aW5nOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogVGFrZXMgdXAgdGhlIGVudGlyZSB3aWR0aCBvZiBpdHMgb2Zmc2V0IGNvbnRhaW5lci4gKi9cbiAgLy8gVE9ETzogaW1wbGVtZW50IHRoZSBQb3B1cCBmbHVpZCBsYXlvdXRcbiAgLy8gZmx1aWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBIZWFkZXIgZGlzcGxheWVkIGFib3ZlIHRoZSBjb250ZW50IGluIGJvbGQuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEhpZGUgdGhlIFBvcHVwIHdoZW4gc2Nyb2xsaW5nIHRoZSB3aW5kb3cuICovXG4gIGhpZGVPblNjcm9sbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFdoZXRoZXIgdGhlIHBvcHVwIHNob3VsZCBub3QgY2xvc2Ugb24gaG92ZXIuICovXG4gIGhvdmVyYWJsZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEludmVydCB0aGUgY29sb3JzIG9mIHRoZSBQb3B1cC4gKi9cbiAgaW52ZXJ0ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBPZmZzZXQgdmFsdWVzIGluIHB4IHVuaXQgdG8gYXBwbHkgdG8gcmVuZGVyZWQgcG9wdXAuIFRoZSBiYXNpYyBvZmZzZXQgYWNjZXB0cyBhblxuICAgKiBhcnJheSB3aXRoIHR3byBudW1iZXJzIGluIHRoZSBmb3JtIFtza2lkZGluZywgZGlzdGFuY2VdOlxuICAgKiAtIGBza2lkZGluZ2AgZGlzcGxhY2VzIHRoZSBQb3B1cCBhbG9uZyB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICogLSBgZGlzdGFuY2VgIGRpc3BsYWNlcyB0aGUgUG9wdXAgYXdheSBmcm9tLCBvciB0b3dhcmQsIHRoZSByZWZlcmVuY2UgZWxlbWVudCBpbiB0aGUgZGlyZWN0aW9uIG9mIGl0cyBwbGFjZW1lbnQuIEEgcG9zaXRpdmUgbnVtYmVyIGRpc3BsYWNlcyBpdCBmdXJ0aGVyIGF3YXksIHdoaWxlIGEgbmVnYXRpdmUgbnVtYmVyIGxldHMgaXQgb3ZlcmxhcCB0aGUgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vcG9wcGVyLmpzLm9yZy9kb2NzL3YyL21vZGlmaWVycy9vZmZzZXQvXG4gICAqL1xuICBvZmZzZXQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5mdW5jLCBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKV0pLFxuXG4gIC8qKiBFdmVudHMgdHJpZ2dlcmluZyB0aGUgcG9wdXAuICovXG4gIG9uOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoWydob3ZlcicsICdjbGljaycsICdmb2N1cyddKSwgUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9uZU9mKFsnaG92ZXInLCAnY2xpY2snLCAnZm9jdXMnXSkpXSksXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgY2xvc2UgZXZlbnQgaGFwcGVucy5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQ2xvc2U6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcG9ydGFsIGlzIG1vdW50ZWQgb24gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uTW91bnQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhbiBvcGVuIGV2ZW50IGhhcHBlbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk9wZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcG9ydGFsIGlzIHVubW91bnRlZCBmcm9tIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvblVubW91bnQ6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBEaXNhYmxlcyBhdXRvbWF0aWMgcmVwb3NpdGlvbmluZyBvZiB0aGUgY29tcG9uZW50LCBpdCB3aWxsIGFsd2F5cyBiZSBwbGFjZWQgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbiB2YWx1ZS4gKi9cbiAgcGlubmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUG9zaXRpb24gZm9yIHRoZSBwb3BvdmVyLiAqL1xuICBwb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKHBvc2l0aW9ucyksXG5cbiAgLyoqIFRlbGxzIGBQb3BwZXIuanNgIHRvIHVzZSB0aGUgYHBvc2l0aW9uOiBmaXhlZGAgc3RyYXRlZ3kgdG8gcG9zaXRpb24gdGhlIHBvcG92ZXIuICovXG4gIHBvc2l0aW9uRml4ZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHdyYXBwaW5nIGVsZW1lbnQgZm9yIGFuIGFjdHVhbCBjb250ZW50IHRoYXQgd2lsbCBiZSB1c2VkIGZvciBwb3NpdGlvbmluZy4gKi9cbiAgcG9wcGVyOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQW4gYXJyYXkgY29udGFpbmluZyBjdXN0b20gc2V0dGluZ3MgZm9yIHRoZSBQb3BwZXIuanMgbW9kaWZpZXJzLiAqL1xuICBwb3BwZXJNb2RpZmllcnM6IFByb3BUeXBlcy5hcnJheSxcblxuICAvKiogQSBwb3B1cCBjYW4gaGF2ZSBkZXBlbmRlbmNpZXMgd2hpY2ggdXBkYXRlIHdpbGwgc2NoZWR1bGUgYSBwb3NpdGlvbiB1cGRhdGUuICovXG4gIHBvcHBlckRlcGVuZGVuY2llczogUHJvcFR5cGVzLmFycmF5LFxuXG4gIC8qKiBQb3B1cCBzaXplLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnbWVkaXVtJywgJ2JpZycsICdtYXNzaXZlJykpLFxuXG4gIC8qKiBDdXN0b20gUG9wdXAgc3R5bGUuICovXG4gIHN0eWxlOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKiBFbGVtZW50IHRvIGJlIHJlbmRlcmVkIGluLXBsYWNlIHdoZXJlIHRoZSBwb3B1cCBpcyBkZWZpbmVkLiAqL1xuICB0cmlnZ2VyOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogUG9wdXAgd2lkdGguICovXG4gIHdpZGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd2ZXJ5J10pXSlcbn0gOiB7fTtcblBvcHVwLmRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBldmVudHNFbmFibGVkOiB0cnVlLFxuICBvbjogWydjbGljaycsICdob3ZlciddLFxuICBwaW5uZWQ6IGZhbHNlLFxuICBwb3BwZXJNb2RpZmllcnM6IFtdLFxuICBwb3NpdGlvbjogJ3RvcCBsZWZ0J1xufTtcblBvcHVwLkNvbnRlbnQgPSBQb3B1cENvbnRlbnQ7XG5Qb3B1cC5IZWFkZXIgPSBQb3B1cEhlYWRlcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIFBvcHVwQ29udGVudCBkaXNwbGF5cyB0aGUgY29udGVudCBib2R5IG9mIGEgUG9wb3Zlci5cbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBQb3B1cENvbnRlbnQocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnY29udGVudCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUG9wdXBDb250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFBvcHVwQ29udGVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5Qb3B1cENvbnRlbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5Qb3B1cENvbnRlbnQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogVGhlIGNvbnRlbnQgb2YgdGhlIFBvcHVwICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQ2xhc3NlcyB0byBhZGQgdG8gdGhlIFBvcHVwIGNvbnRlbnQgY2xhc3NOYW1lLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuUG9wdXBDb250ZW50LmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoUG9wdXBDb250ZW50LCBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIHtcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfTtcbn0pOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgUG9wdXBIZWFkZXIgZGlzcGxheXMgYSBoZWFkZXIgaW4gYSBQb3BvdmVyLlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFBvcHVwSGVhZGVyKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2hlYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUG9wdXBIZWFkZXIsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUG9wdXBIZWFkZXIsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuUG9wdXBIZWFkZXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5Qb3B1cEhlYWRlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuUG9wdXBIZWFkZXIuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShQb3B1cEhlYWRlciwgZnVuY3Rpb24gKGNoaWxkcmVuKSB7XG4gIHJldHVybiB7XG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH07XG59KTsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9Qb3B1cCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9jcmVhdGVDbGFzcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3NcIjtcbmltcG9ydCBfbWVtb2l6ZSBmcm9tIFwibG9kYXNoLWVzL21lbW9pemVcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgeyBpc1JlZk9iamVjdCB9IGZyb20gJ0BmbHVlbnR1aS9yZWFjdC1jb21wb25lbnQtcmVmJztcblxudmFyIFJlZmVyZW5jZVByb3h5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUmVmZXJlbmNlUHJveHkocmVmT2JqZWN0KSB7XG4gICAgdGhpcy5yZWYgPSByZWZPYmplY3Q7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUmVmZXJlbmNlUHJveHkucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPSBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgcmV0dXJuIF9pbnZva2UodGhpcy5yZWYuY3VycmVudCwgJ2dldEJvdW5kaW5nQ2xpZW50UmVjdCcpIHx8IHt9O1xuICB9O1xuXG4gIF9jcmVhdGVDbGFzcyhSZWZlcmVuY2VQcm94eSwgW3tcbiAgICBrZXk6IFwiY2xpZW50V2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJjbGllbnRIZWlnaHRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicGFyZW50Tm9kZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVmLmN1cnJlbnQgPyB0aGlzLnJlZi5jdXJyZW50LnBhcmVudE5vZGUgOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlZmVyZW5jZVByb3h5O1xufSgpO1xuLyoqXG4gKiBQb3BwZXIuanMgZG9lcyBub3Qgc3VwcG9ydCByZWYgb2JqZWN0cyBmcm9tIGBjcmVhdGVSZWYoKWAgYXMgcmVmZXJlbmNlRWxlbWVudC4gSWYgd2Ugd2lsbCBwYXNzXG4gKiBkaXJlY3RseSBgcmVmYCwgYHJlZi5jdXJyZW50YCB3aWxsIGJlIGBudWxsYCBhdCB0aGUgcmVuZGVyIHByb2Nlc3MuIFdlIHVzZSBtZW1vaXplIHRvIGtlZXAgdGhlXG4gKiBzYW1lIHJlZmVyZW5jZSBiZXR3ZWVuIHJlbmRlcnMuXG4gKlxuICogQHNlZSBodHRwczovL3BvcHBlci5qcy5vcmcvcG9wcGVyLWRvY3VtZW50YXRpb24uaHRtbCNyZWZlcmVuY2VPYmplY3RcbiAqL1xuXG5cbnZhciBjcmVhdGVSZWZlcmVuY2VQcm94eSA9IF9tZW1vaXplKGZ1bmN0aW9uIChyZWZlcmVuY2UpIHtcbiAgcmV0dXJuIG5ldyBSZWZlcmVuY2VQcm94eShpc1JlZk9iamVjdChyZWZlcmVuY2UpID8gcmVmZXJlbmNlIDoge1xuICAgIGN1cnJlbnQ6IHJlZmVyZW5jZVxuICB9KTtcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSZWZlcmVuY2VQcm94eTsiLCJpbXBvcnQgX2ludmVydCBmcm9tIFwibG9kYXNoLWVzL2ludmVydFwiO1xuaW1wb3J0IF9rZXlzIGZyb20gXCJsb2Rhc2gtZXMva2V5c1wiO1xuZXhwb3J0IHZhciBwb3NpdGlvbnNNYXBwaW5nID0ge1xuICAndG9wIGNlbnRlcic6ICd0b3AnLFxuICAndG9wIGxlZnQnOiAndG9wLXN0YXJ0JyxcbiAgJ3RvcCByaWdodCc6ICd0b3AtZW5kJyxcbiAgJ2JvdHRvbSBjZW50ZXInOiAnYm90dG9tJyxcbiAgJ2JvdHRvbSBsZWZ0JzogJ2JvdHRvbS1zdGFydCcsXG4gICdib3R0b20gcmlnaHQnOiAnYm90dG9tLWVuZCcsXG4gICdyaWdodCBjZW50ZXInOiAncmlnaHQnLFxuICAnbGVmdCBjZW50ZXInOiAnbGVmdCdcbn07XG5leHBvcnQgdmFyIHBvc2l0aW9ucyA9IF9rZXlzKHBvc2l0aW9uc01hcHBpbmcpO1xuZXhwb3J0IHZhciBwbGFjZW1lbnRNYXBwaW5nID0gX2ludmVydChwb3NpdGlvbnNNYXBwaW5nKTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IF9yb3VuZCBmcm9tIFwibG9kYXNoLWVzL3JvdW5kXCI7XG5pbXBvcnQgX2NsYW1wIGZyb20gXCJsb2Rhc2gtZXMvY2xhbXBcIjtcbmltcG9ydCBfaXNVbmRlZmluZWQgZnJvbSBcImxvZGFzaC1lcy9pc1VuZGVmaW5lZFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVIVE1MRGl2aXNpb24sIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZVZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBwcm9ncmVzcyBiYXIgc2hvd3MgdGhlIHByb2dyZXNzaW9uIG9mIGEgdGFzay5cbiAqL1xuXG52YXIgUHJvZ3Jlc3MgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUHJvZ3Jlc3MsIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFByb2dyZXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuY2FsY3VsYXRlUGVyY2VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHBlcmNlbnQgPSBfdGhpcyRwcm9wcy5wZXJjZW50LFxuICAgICAgICAgIHRvdGFsID0gX3RoaXMkcHJvcHMudG90YWwsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wcy52YWx1ZTtcbiAgICAgIGlmICghX2lzVW5kZWZpbmVkKHBlcmNlbnQpKSByZXR1cm4gcGVyY2VudDtcbiAgICAgIGlmICghX2lzVW5kZWZpbmVkKHRvdGFsKSAmJiAhX2lzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuIHZhbHVlIC8gdG90YWwgKiAxMDA7XG4gICAgfTtcblxuICAgIF90aGlzLmNvbXB1dGVWYWx1ZVRleHQgPSBmdW5jdGlvbiAocGVyY2VudCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMiA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHByb2dyZXNzID0gX3RoaXMkcHJvcHMyLnByb2dyZXNzLFxuICAgICAgICAgIHRvdGFsID0gX3RoaXMkcHJvcHMyLnRvdGFsLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHMyLnZhbHVlO1xuICAgICAgaWYgKHByb2dyZXNzID09PSAndmFsdWUnKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAocHJvZ3Jlc3MgPT09ICdyYXRpbycpIHJldHVybiB2YWx1ZSArIFwiL1wiICsgdG90YWw7XG4gICAgICByZXR1cm4gcGVyY2VudCArIFwiJVwiO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRQZXJjZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzMyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIHByZWNpc2lvbiA9IF90aGlzJHByb3BzMy5wcmVjaXNpb24sXG4gICAgICAgICAgcHJvZ3Jlc3MgPSBfdGhpcyRwcm9wczMucHJvZ3Jlc3MsXG4gICAgICAgICAgdG90YWwgPSBfdGhpcyRwcm9wczMudG90YWwsXG4gICAgICAgICAgdmFsdWUgPSBfdGhpcyRwcm9wczMudmFsdWU7XG5cbiAgICAgIHZhciBwZXJjZW50ID0gX2NsYW1wKF90aGlzLmNhbGN1bGF0ZVBlcmNlbnQoKSwgMCwgMTAwKTtcblxuICAgICAgaWYgKCFfaXNVbmRlZmluZWQodG90YWwpICYmICFfaXNVbmRlZmluZWQodmFsdWUpICYmIHByb2dyZXNzID09PSAndmFsdWUnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSAvIHRvdGFsICogMTAwO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvZ3Jlc3MgPT09ICd2YWx1ZScpIHJldHVybiB2YWx1ZTtcbiAgICAgIGlmIChfaXNVbmRlZmluZWQocHJlY2lzaW9uKSkgcmV0dXJuIHBlcmNlbnQ7XG4gICAgICByZXR1cm4gX3JvdW5kKHBlcmNlbnQsIHByZWNpc2lvbik7XG4gICAgfTtcblxuICAgIF90aGlzLmlzQXV0b1N1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM0ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgYXV0b1N1Y2Nlc3MgPSBfdGhpcyRwcm9wczQuYXV0b1N1Y2Nlc3MsXG4gICAgICAgICAgcGVyY2VudCA9IF90aGlzJHByb3BzNC5wZXJjZW50LFxuICAgICAgICAgIHRvdGFsID0gX3RoaXMkcHJvcHM0LnRvdGFsLFxuICAgICAgICAgIHZhbHVlID0gX3RoaXMkcHJvcHM0LnZhbHVlO1xuICAgICAgcmV0dXJuIGF1dG9TdWNjZXNzICYmIChwZXJjZW50ID49IDEwMCB8fCB2YWx1ZSA+PSB0b3RhbCk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlckxhYmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNSA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHM1LmNoaWxkcmVuLFxuICAgICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wczUuY29udGVudCxcbiAgICAgICAgICBsYWJlbCA9IF90aGlzJHByb3BzNS5sYWJlbDtcbiAgICAgIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJsYWJlbFwiXG4gICAgICB9LCBjaGlsZHJlbik7XG4gICAgICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY29udGVudCkpIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJsYWJlbFwiXG4gICAgICB9LCBjb250ZW50KTtcbiAgICAgIHJldHVybiBjcmVhdGVIVE1MRGl2aXNpb24obGFiZWwsIHtcbiAgICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFByb3BzOiB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAnbGFiZWwnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJQcm9ncmVzcyA9IGZ1bmN0aW9uIChwZXJjZW50KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHM2ID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgcHJlY2lzaW9uID0gX3RoaXMkcHJvcHM2LnByZWNpc2lvbixcbiAgICAgICAgICBwcm9ncmVzcyA9IF90aGlzJHByb3BzNi5wcm9ncmVzcztcbiAgICAgIGlmICghcHJvZ3Jlc3MgJiYgX2lzVW5kZWZpbmVkKHByZWNpc2lvbikpIHJldHVybjtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJwcm9ncmVzc1wiXG4gICAgICB9LCBfdGhpcy5jb21wdXRlVmFsdWVUZXh0KHBlcmNlbnQpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFByb2dyZXNzLnByb3RvdHlwZTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wczcgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfdGhpcyRwcm9wczcuYWN0aXZlLFxuICAgICAgICBhdHRhY2hlZCA9IF90aGlzJHByb3BzNy5hdHRhY2hlZCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHM3LmNsYXNzTmFtZSxcbiAgICAgICAgY29sb3IgPSBfdGhpcyRwcm9wczcuY29sb3IsXG4gICAgICAgIGRpc2FibGVkID0gX3RoaXMkcHJvcHM3LmRpc2FibGVkLFxuICAgICAgICBlcnJvciA9IF90aGlzJHByb3BzNy5lcnJvcixcbiAgICAgICAgaW5kaWNhdGluZyA9IF90aGlzJHByb3BzNy5pbmRpY2F0aW5nLFxuICAgICAgICBpbnZlcnRlZCA9IF90aGlzJHByb3BzNy5pbnZlcnRlZCxcbiAgICAgICAgc2l6ZSA9IF90aGlzJHByb3BzNy5zaXplLFxuICAgICAgICBzdWNjZXNzID0gX3RoaXMkcHJvcHM3LnN1Y2Nlc3MsXG4gICAgICAgIHdhcm5pbmcgPSBfdGhpcyRwcm9wczcud2FybmluZztcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIGNvbG9yLCBzaXplLCB1c2VLZXlPbmx5KGFjdGl2ZSB8fCBpbmRpY2F0aW5nLCAnYWN0aXZlJyksIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGVycm9yLCAnZXJyb3InKSwgdXNlS2V5T25seShpbmRpY2F0aW5nLCAnaW5kaWNhdGluZycpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlS2V5T25seShzdWNjZXNzIHx8IHRoaXMuaXNBdXRvU3VjY2VzcygpLCAnc3VjY2VzcycpLCB1c2VLZXlPbmx5KHdhcm5pbmcsICd3YXJuaW5nJyksIHVzZVZhbHVlQW5kS2V5KGF0dGFjaGVkLCAnYXR0YWNoZWQnKSwgJ3Byb2dyZXNzJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFByb2dyZXNzLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShQcm9ncmVzcywgdGhpcy5wcm9wcyk7XG4gICAgdmFyIHBlcmNlbnQgPSB0aGlzLmdldFBlcmNlbnQoKSB8fCAwO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NlcyxcbiAgICAgIFwiZGF0YS1wZXJjZW50XCI6IE1hdGguZmxvb3IocGVyY2VudClcbiAgICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImJhclwiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IHBlcmNlbnQgKyBcIiVcIlxuICAgICAgfVxuICAgIH0sIHRoaXMucmVuZGVyUHJvZ3Jlc3MocGVyY2VudCkpLCB0aGlzLnJlbmRlckxhYmVsKCkpO1xuICB9O1xuXG4gIHJldHVybiBQcm9ncmVzcztcbn0oQ29tcG9uZW50KTtcblxuUHJvZ3Jlc3MuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYXNcIiwgXCJhdHRhY2hlZFwiLCBcImF1dG9TdWNjZXNzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xvclwiLCBcImNvbnRlbnRcIiwgXCJkaXNhYmxlZFwiLCBcImVycm9yXCIsIFwiaW5kaWNhdGluZ1wiLCBcImludmVydGVkXCIsIFwibGFiZWxcIiwgXCJwZXJjZW50XCIsIFwicHJlY2lzaW9uXCIsIFwicHJvZ3Jlc3NcIiwgXCJzaXplXCIsIFwic3VjY2Vzc1wiLCBcInRvdGFsXCIsIFwidmFsdWVcIiwgXCJ3YXJuaW5nXCJdO1xuUHJvZ3Jlc3MucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSBwcm9ncmVzcyBiYXIgY2FuIHNob3cgYWN0aXZpdHkuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgcHJvZ3Jlc3MgYmFyIGNhbiBhdHRhY2ggdG8gYW5kIHNob3cgdGhlIHByb2dyZXNzIG9mIGFuIGVsZW1lbnQgKGkuZS4gQ2FyZCBvciBTZWdtZW50KS4gKi9cbiAgYXR0YWNoZWQ6IFByb3BUeXBlcy5vbmVPZihbJ3RvcCcsICdib3R0b20nXSksXG5cbiAgLyoqIFdoZXRoZXIgc3VjY2VzcyBzdGF0ZSBzaG91bGQgYXV0b21hdGljYWxseSB0cmlnZ2VyIHdoZW4gcHJvZ3Jlc3MgY29tcGxldGVzLiAqL1xuICBhdXRvU3VjY2VzczogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBwcm9ncmVzcyBiYXIgY2FuIGhhdmUgZGlmZmVyZW50IGNvbG9ycy4gKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihTVUkuQ09MT1JTKSxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBiZSBkaXNhYmxlZC4gKi9cbiAgZGlzYWJsZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBjYW4gc2hvdyBhIGVycm9yIHN0YXRlLiAqL1xuICBlcnJvcjogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFuIGluZGljYXRpbmcgcHJvZ3Jlc3MgYmFyIHZpc3VhbGx5IGluZGljYXRlcyB0aGUgY3VycmVudCBsZXZlbCBvZiBwcm9ncmVzcyBvZiBhIHRhc2suICovXG4gIGluZGljYXRpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBjYW4gaGF2ZSBpdHMgY29sb3JzIGludmVydGVkLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIENhbiBiZSBzZXQgdG8gZWl0aGVyIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYXMgcGVyY2VudCBvciByYXRpby4gKi9cbiAgbGFiZWw6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBDdXJyZW50IHBlcmNlbnQgY29tcGxldGUuICovXG4gIHBlcmNlbnQ6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsndG90YWwnLCAndmFsdWUnXSksIFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKV0pLFxuXG4gIC8qKiBEZWNpbWFsIHBvaW50IHByZWNpc2lvbiBmb3IgY2FsY3VsYXRlZCBwcm9ncmVzcy4gKi9cbiAgcHJlY2lzaW9uOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBjYW4gY29udGFpbiBhIHRleHQgdmFsdWUgaW5kaWNhdGluZyBjdXJyZW50IHByb2dyZXNzLiAqL1xuICBwcm9ncmVzczogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIFByb3BUeXBlcy5vbmVPZihbJ3BlcmNlbnQnLCAncmF0aW8nLCAndmFsdWUnXSldKSxcblxuICAvKiogQSBwcm9ncmVzcyBiYXIgY2FuIHZhcnkgaW4gc2l6ZS4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21pbmknLCAnaHVnZScsICdtYXNzaXZlJykpLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBjYW4gc2hvdyBhIHN1Y2Nlc3Mgc3RhdGUuICovXG4gIHN1Y2Nlc3M6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBGb3IgdXNlIHdpdGggdmFsdWUuIFRvZ2V0aGVyLCB0aGVzZSB3aWxsIGNhbGN1bGF0ZSB0aGUgcGVyY2VudC4gTXV0dWFsbHkgZXhjbHVkZXMgcGVyY2VudC4gKi9cbiAgdG90YWw6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRlbWFuZChbJ3ZhbHVlJ10pLCBjdXN0b21Qcm9wVHlwZXMuZGlzYWxsb3coWydwZXJjZW50J10pLCBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSldKSxcblxuICAvKiogRm9yIHVzZSB3aXRoIHRvdGFsLiBUb2dldGhlciwgdGhlc2Ugd2lsbCBjYWxjdWxhdGUgdGhlIHBlcmNlbnQuIE11dHVhbGx5IGV4Y2x1ZGVzIHBlcmNlbnQuICovXG4gIHZhbHVlOiBjdXN0b21Qcm9wVHlwZXMuZXZlcnkoW2N1c3RvbVByb3BUeXBlcy5kaXNhbGxvdyhbJ3BlcmNlbnQnXSksIFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKV0pLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBjYW4gc2hvdyBhIHdhcm5pbmcgc3RhdGUuICovXG4gIHdhcm5pbmc6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzczsiLCJpbXBvcnQgX2RlZmF1bHQgZnJvbSAnLi9Qcm9ncmVzcyc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfd2l0aG91dCBmcm9tIFwibG9kYXNoLWVzL3dpdGhvdXRcIjtcbmltcG9ydCBfdGltZXMgZnJvbSBcImxvZGFzaC1lcy90aW1lc1wiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgTW9kZXJuQXV0b0NvbnRyb2xsZWRDb21wb25lbnQgYXMgQ29tcG9uZW50LCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgUmF0aW5nSWNvbiBmcm9tICcuL1JhdGluZ0ljb24nO1xuLyoqXG4gKiBBIHJhdGluZyBpbmRpY2F0ZXMgdXNlciBpbnRlcmVzdCBpbiBjb250ZW50LlxuICovXG5cbnZhciBSYXRpbmcgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUmF0aW5nLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBSYXRpbmcoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF9hcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgX2FyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChfYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVJY29uQ2xpY2sgPSBmdW5jdGlvbiAoZSwgX3JlZikge1xuICAgICAgdmFyIGluZGV4ID0gX3JlZi5pbmRleDtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGNsZWFyYWJsZSA9IF90aGlzJHByb3BzLmNsZWFyYWJsZSxcbiAgICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgIG1heFJhdGluZyA9IF90aGlzJHByb3BzLm1heFJhdGluZyxcbiAgICAgICAgICBvblJhdGUgPSBfdGhpcyRwcm9wcy5vblJhdGU7XG4gICAgICB2YXIgcmF0aW5nID0gX3RoaXMuc3RhdGUucmF0aW5nO1xuICAgICAgaWYgKGRpc2FibGVkKSByZXR1cm47IC8vIGRlZmF1bHQgbmV3UmF0aW5nIGlzIHRoZSBjbGlja2VkIGljb25cbiAgICAgIC8vIGFsbG93IHRvZ2dsaW5nIGEgYmluYXJ5IHJhdGluZ1xuICAgICAgLy8gYWxsb3cgY2xlYXJpbmcgcmF0aW5nc1xuXG4gICAgICB2YXIgbmV3UmF0aW5nID0gaW5kZXggKyAxO1xuXG4gICAgICBpZiAoY2xlYXJhYmxlID09PSAnYXV0bycgJiYgbWF4UmF0aW5nID09PSAxKSB7XG4gICAgICAgIG5ld1JhdGluZyA9ICshcmF0aW5nO1xuICAgICAgfSBlbHNlIGlmIChjbGVhcmFibGUgPT09IHRydWUgJiYgbmV3UmF0aW5nID09PSByYXRpbmcpIHtcbiAgICAgICAgbmV3UmF0aW5nID0gMDtcbiAgICAgIH0gLy8gc2V0IHJhdGluZ1xuXG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcmF0aW5nOiBuZXdSYXRpbmcsXG4gICAgICAgIGlzU2VsZWN0aW5nOiBmYWxzZVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChvblJhdGUpIG9uUmF0ZShlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgcmF0aW5nOiBuZXdSYXRpbmdcbiAgICAgIH0pKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlSWNvbk1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoZSwgX3JlZjIpIHtcbiAgICAgIHZhciBpbmRleCA9IF9yZWYyLmluZGV4O1xuICAgICAgaWYgKF90aGlzLnByb3BzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRJbmRleDogaW5kZXgsXG4gICAgICAgIGlzU2VsZWN0aW5nOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2VMZWF2ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIF9pbnZva2UuYXBwbHkodm9pZCAwLCBbX3RoaXMucHJvcHMsICdvbk1vdXNlTGVhdmUnXS5jb25jYXQoYXJncykpO1xuXG4gICAgICBpZiAoX3RoaXMucHJvcHMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEluZGV4OiAtMSxcbiAgICAgICAgaXNTZWxlY3Rpbmc6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFJhdGluZy5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBkaXNhYmxlZCA9IF90aGlzJHByb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzMi5pY29uLFxuICAgICAgICBtYXhSYXRpbmcgPSBfdGhpcyRwcm9wczIubWF4UmF0aW5nLFxuICAgICAgICBzaXplID0gX3RoaXMkcHJvcHMyLnNpemU7XG4gICAgdmFyIF90aGlzJHN0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgcmF0aW5nID0gX3RoaXMkc3RhdGUucmF0aW5nLFxuICAgICAgICBzZWxlY3RlZEluZGV4ID0gX3RoaXMkc3RhdGUuc2VsZWN0ZWRJbmRleCxcbiAgICAgICAgaXNTZWxlY3RpbmcgPSBfdGhpcyRzdGF0ZS5pc1NlbGVjdGluZztcbiAgICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIGljb24sIHNpemUsIHVzZUtleU9ubHkoZGlzYWJsZWQsICdkaXNhYmxlZCcpLCB1c2VLZXlPbmx5KGlzU2VsZWN0aW5nICYmICFkaXNhYmxlZCAmJiBzZWxlY3RlZEluZGV4ID49IDAsICdzZWxlY3RlZCcpLCAncmF0aW5nJywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFJhdGluZywgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUmF0aW5nLCB0aGlzLnByb3BzKTtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICByb2xlOiBcInJhZGlvZ3JvdXBcIixcbiAgICAgIG9uTW91c2VMZWF2ZTogdGhpcy5oYW5kbGVNb3VzZUxlYXZlLFxuICAgICAgdGFiSW5kZXg6IGRpc2FibGVkID8gMCA6IC0xXG4gICAgfSksIF90aW1lcyhtYXhSYXRpbmcsIGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmF0aW5nSWNvbiwge1xuICAgICAgICB0YWJJbmRleDogZGlzYWJsZWQgPyAtMSA6IDAsXG4gICAgICAgIGFjdGl2ZTogcmF0aW5nID49IGkgKyAxLFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiByYXRpbmcgPT09IGkgKyAxLFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjogaSArIDEsXG4gICAgICAgIFwiYXJpYS1zZXRzaXplXCI6IG1heFJhdGluZyxcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIGtleTogaSxcbiAgICAgICAgb25DbGljazogX3RoaXMyLmhhbmRsZUljb25DbGljayxcbiAgICAgICAgb25Nb3VzZUVudGVyOiBfdGhpczIuaGFuZGxlSWNvbk1vdXNlRW50ZXIsXG4gICAgICAgIHNlbGVjdGVkOiBzZWxlY3RlZEluZGV4ID49IGkgJiYgaXNTZWxlY3RpbmdcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gUmF0aW5nO1xufShDb21wb25lbnQpO1xuXG5SYXRpbmcuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjbGVhcmFibGVcIiwgXCJkZWZhdWx0UmF0aW5nXCIsIFwiZGlzYWJsZWRcIiwgXCJpY29uXCIsIFwibWF4UmF0aW5nXCIsIFwib25SYXRlXCIsIFwicmF0aW5nXCIsIFwic2l6ZVwiXTtcbmV4cG9ydCB7IFJhdGluZyBhcyBkZWZhdWx0IH07XG5SYXRpbmcucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY2xlYXIgdGhlIHJhdGluZyBieSBjbGlja2luZyBvbiB0aGUgY3VycmVudCBzdGFydCByYXRpbmcuXG4gICAqIEJ5IGRlZmF1bHQgYSByYXRpbmcgd2lsbCBiZSBvbmx5IGNsZWFyYWJsZSBpZiB0aGVyZSBpcyAxIGljb24uXG4gICAqIFNldHRpbmcgdG8gYHRydWVgL2BmYWxzZWAgd2lsbCBhbGxvdyBvciBkaXNhbGxvdyBhIHVzZXIgdG8gY2xlYXIgdGhlaXIgcmF0aW5nLlxuICAgKi9cbiAgY2xlYXJhYmxlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYm9vbCwgUHJvcFR5cGVzLm9uZU9mKFsnYXV0byddKV0pLFxuXG4gIC8qKiBUaGUgaW5pdGlhbCByYXRpbmcgdmFsdWUuICovXG4gIGRlZmF1bHRSYXRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogWW91IGNhbiBkaXNhYmxlIG9yIGVuYWJsZSBpbnRlcmFjdGl2ZSByYXRpbmcuICBNYWtlcyBhIHJlYWQtb25seSByYXRpbmcuICovXG4gIGRpc2FibGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSByYXRpbmcgY2FuIHVzZSBhIHNldCBvZiBzdGFyIG9yIGhlYXJ0IGljb25zLiAqL1xuICBpY29uOiBQcm9wVHlwZXMub25lT2YoWydzdGFyJywgJ2hlYXJ0J10pLFxuXG4gIC8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIGljb25zLiAqL1xuICBtYXhSYXRpbmc6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKipcbiAgICogQ2FsbGVkIGFmdGVyIHVzZXIgc2VsZWN0cyBhIG5ldyByYXRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMgYW5kIHByb3Bvc2VkIHJhdGluZy5cbiAgICovXG4gIG9uUmF0ZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIFRoZSBjdXJyZW50IG51bWJlciBvZiBhY3RpdmUgaWNvbnMuICovXG4gIHJhdGluZzogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKiBBIHByb2dyZXNzIGJhciBjYW4gdmFyeSBpbiBzaXplLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnbWVkaXVtJywgJ2JpZycpKVxufSA6IHt9O1xuUmF0aW5nLmF1dG9Db250cm9sbGVkUHJvcHMgPSBbJ3JhdGluZyddO1xuUmF0aW5nLmRlZmF1bHRQcm9wcyA9IHtcbiAgY2xlYXJhYmxlOiAnYXV0bycsXG4gIG1heFJhdGluZzogMVxufTtcblJhdGluZy5JY29uID0gUmF0aW5nSWNvbjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBrZXlib2FyZEtleSBmcm9tICdrZXlib2FyZC1rZXknO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBbiBpbnRlcm5hbCBpY29uIHN1Yi1jb21wb25lbnQgZm9yIFJhdGluZyBjb21wb25lbnRcbiAqL1xuXG52YXIgUmF0aW5nSWNvbiA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShSYXRpbmdJY29uLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBSYXRpbmdJY29uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uQ2xpY2snLCBlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUtleVVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbktleVVwJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICBzd2l0Y2ggKGtleWJvYXJkS2V5LmdldENvZGUoZSkpIHtcbiAgICAgICAgY2FzZSBrZXlib2FyZEtleS5FbnRlcjpcbiAgICAgICAgY2FzZSBrZXlib2FyZEtleS5TcGFjZWJhcjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25DbGljaycsIGUsIF90aGlzLnByb3BzKTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vdXNlRW50ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uTW91c2VFbnRlcicsIGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFJhdGluZ0ljb24ucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlID0gX3RoaXMkcHJvcHMuYWN0aXZlLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHNlbGVjdGVkID0gX3RoaXMkcHJvcHMuc2VsZWN0ZWQ7XG4gICAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGFjdGl2ZSwgJ2FjdGl2ZScpLCB1c2VLZXlPbmx5KHNlbGVjdGVkLCAnc2VsZWN0ZWQnKSwgJ2ljb24nLCBjbGFzc05hbWUpO1xuICAgIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoUmF0aW5nSWNvbiwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoUmF0aW5nSWNvbiwgdGhpcy5wcm9wcyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGljayxcbiAgICAgIG9uS2V5VXA6IHRoaXMuaGFuZGxlS2V5VXAsXG4gICAgICBvbk1vdXNlRW50ZXI6IHRoaXMuaGFuZGxlTW91c2VFbnRlcixcbiAgICAgIHJvbGU6IFwicmFkaW9cIlxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gUmF0aW5nSWNvbjtcbn0oQ29tcG9uZW50KTtcblxuUmF0aW5nSWNvbi5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImNsYXNzTmFtZVwiLCBcImluZGV4XCIsIFwib25DbGlja1wiLCBcIm9uS2V5VXBcIiwgXCJvbk1vdXNlRW50ZXJcIiwgXCJzZWxlY3RlZFwiXTtcbmV4cG9ydCB7IFJhdGluZ0ljb24gYXMgZGVmYXVsdCB9O1xuUmF0aW5nSWNvbi5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBJbmRpY2F0ZXMgYWN0aXZpdHkgb2YgYW4gaWNvbi4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEFuIGluZGV4IG9mIGljb24gaW5zaWRlIFJhdGluZy4gKi9cbiAgaW5kZXg6IFByb3BUeXBlcy5udW1iZXIsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBjbGljay5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uQ2xpY2s6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24ga2V5dXAuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbktleVVwOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIG1vdXNlZW50ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk1vdXNlRW50ZXI6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKiBJbmRpY2F0ZXMgc2VsZWN0aW9uIG9mIGFuIGljb24uICovXG4gIHNlbGVjdGVkOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuUmF0aW5nSWNvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAnaSdcbn07IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vUmF0aW5nJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgX2lzRW1wdHkgZnJvbSBcImxvZGFzaC1lcy9pc0VtcHR5XCI7XG5pbXBvcnQgX3BhcnRpYWxSaWdodCBmcm9tIFwibG9kYXNoLWVzL3BhcnRpYWxSaWdodFwiO1xuaW1wb3J0IF9pblJhbmdlIGZyb20gXCJsb2Rhc2gtZXMvaW5SYW5nZVwiO1xuaW1wb3J0IF9tYXAgZnJvbSBcImxvZGFzaC1lcy9tYXBcIjtcbmltcG9ydCBfZ2V0IGZyb20gXCJsb2Rhc2gtZXMvZ2V0XCI7XG5pbXBvcnQgX3JlZHVjZSBmcm9tIFwibG9kYXNoLWVzL3JlZHVjZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCBfaXNQbGFpbk9iamVjdCBmcm9tIFwibG9kYXNoLWVzL2lzUGxhaW5PYmplY3RcIjtcbmltcG9ydCBfaXNVbmRlZmluZWQgZnJvbSBcImxvZGFzaC1lcy9pc1VuZGVmaW5lZFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IGtleWJvYXJkS2V5IGZyb20gJ2tleWJvYXJkLWtleSc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBzaGFsbG93RXF1YWwgZnJvbSAnc2hhbGxvd2VxdWFsJztcbmltcG9ydCB7IE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50IGFzIENvbXBvbmVudCwgY3VzdG9tUHJvcFR5cGVzLCBldmVudFN0YWNrLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIGh0bWxJbnB1dEF0dHJzLCBpc0Jyb3dzZXIsIG9iamVjdERpZmYsIHBhcnRpdGlvbkhUTUxQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VWYWx1ZUFuZEtleSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgSW5wdXQgZnJvbSAnLi4vLi4vZWxlbWVudHMvSW5wdXQnO1xuaW1wb3J0IFNlYXJjaENhdGVnb3J5IGZyb20gJy4vU2VhcmNoQ2F0ZWdvcnknO1xuaW1wb3J0IFNlYXJjaFJlc3VsdCBmcm9tICcuL1NlYXJjaFJlc3VsdCc7XG5pbXBvcnQgU2VhcmNoUmVzdWx0cyBmcm9tICcuL1NlYXJjaFJlc3VsdHMnO1xuXG52YXIgb3ZlcnJpZGVTZWFyY2hJbnB1dFByb3BzID0gZnVuY3Rpb24gb3ZlcnJpZGVTZWFyY2hJbnB1dFByb3BzKHByZWRlZmluZWRQcm9wcykge1xuICB2YXIgaW5wdXQgPSBwcmVkZWZpbmVkUHJvcHMuaW5wdXQ7XG5cbiAgaWYgKF9pc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICByZXR1cm4gX2V4dGVuZHMoe30sIHByZWRlZmluZWRQcm9wcywge1xuICAgICAgaW5wdXQ6IHtcbiAgICAgICAgY2xhc3NOYW1lOiAncHJvbXB0J1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKF9pc1BsYWluT2JqZWN0KGlucHV0KSkge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgcHJlZGVmaW5lZFByb3BzLCB7XG4gICAgICBpbnB1dDogX2V4dGVuZHMoe30sIGlucHV0LCB7XG4gICAgICAgIGNsYXNzTmFtZTogY3goaW5wdXQuY2xhc3NOYW1lLCAncHJvbXB0JylcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJlZGVmaW5lZFByb3BzO1xufTtcbi8qKlxuICogQSBzZWFyY2ggbW9kdWxlIGFsbG93cyBhIHVzZXIgdG8gcXVlcnkgZm9yIHJlc3VsdHMgZnJvbSBhIHNlbGVjdGlvbiBvZiBkYXRhXG4gKi9cblxuXG52YXIgU2VhcmNoID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFNlYXJjaCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU2VhcmNoKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuXG4gICAgX3RoaXMuaGFuZGxlUmVzdWx0U2VsZWN0ID0gZnVuY3Rpb24gKGUsIHJlc3VsdCkge1xuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uUmVzdWx0U2VsZWN0JywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIHJlc3VsdDogcmVzdWx0XG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVNlbGVjdGlvbkNoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gX3RoaXMuZ2V0U2VsZWN0ZWRSZXN1bHQoKTtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uU2VsZWN0aW9uQ2hhbmdlJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIHJlc3VsdDogcmVzdWx0XG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLmNsb3NlT25Fc2NhcGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKGtleWJvYXJkS2V5LmdldENvZGUoZSkgIT09IGtleWJvYXJkS2V5LkVzY2FwZSkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBfdGhpcy5jbG9zZSgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5tb3ZlU2VsZWN0aW9uT25LZXlEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHN3aXRjaCAoa2V5Ym9hcmRLZXkuZ2V0Q29kZShlKSkge1xuICAgICAgICBjYXNlIGtleWJvYXJkS2V5LkFycm93RG93bjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBfdGhpcy5tb3ZlU2VsZWN0aW9uQnkoZSwgMSk7XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIGtleWJvYXJkS2V5LkFycm93VXA6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgX3RoaXMubW92ZVNlbGVjdGlvbkJ5KGUsIC0xKTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNlbGVjdEl0ZW1PbkVudGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChrZXlib2FyZEtleS5nZXRDb2RlKGUpICE9PSBrZXlib2FyZEtleS5FbnRlcikgcmV0dXJuO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gX3RoaXMuZ2V0U2VsZWN0ZWRSZXN1bHQoKTsgLy8gcHJldmVudCBzZWxlY3RpbmcgbnVsbCBpZiB0aGVyZSB3YXMgbm8gc2VsZWN0ZWQgaXRlbSB2YWx1ZVxuXG5cbiAgICAgIGlmICghcmVzdWx0KSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIG5vdGlmeSB0aGUgb25SZXN1bHRTZWxlY3QgcHJvcCB0aGF0IHRoZSB1c2VyIGlzIHRyeWluZyB0byBjaGFuZ2UgdmFsdWVcblxuICAgICAgX3RoaXMuc2V0VmFsdWUocmVzdWx0LnRpdGxlKTtcblxuICAgICAgX3RoaXMuaGFuZGxlUmVzdWx0U2VsZWN0KGUsIHJlc3VsdCk7XG5cbiAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmNsb3NlT25Eb2N1bWVudENsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vdXNlRG93biA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfdGhpcy5pc01vdXNlRG93biA9IHRydWU7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbk1vdXNlRG93bicsIGUsIF90aGlzLnByb3BzKTtcblxuICAgICAgZXZlbnRTdGFjay5zdWIoJ21vdXNldXAnLCBfdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlVXApO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVEb2N1bWVudE1vdXNlVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5pc01vdXNlRG93biA9IGZhbHNlO1xuICAgICAgZXZlbnRTdGFjay51bnN1YignbW91c2V1cCcsIF90aGlzLmhhbmRsZURvY3VtZW50TW91c2VVcCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUlucHV0Q2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgLy8gcHJldmVudCBjbG9zZU9uRG9jdW1lbnRDbGljaygpXG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXG4gICAgICBfdGhpcy50cnlPcGVuKCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUl0ZW1DbGljayA9IGZ1bmN0aW9uIChlLCBfcmVmKSB7XG4gICAgICB2YXIgaWQgPSBfcmVmLmlkO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gX3RoaXMuZ2V0U2VsZWN0ZWRSZXN1bHQoaWQpOyAvLyBwcmV2ZW50IGNsb3NlT25Eb2N1bWVudENsaWNrKClcblxuXG4gICAgICBlLm5hdGl2ZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOyAvLyBub3RpZnkgdGhlIG9uUmVzdWx0U2VsZWN0IHByb3AgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gY2hhbmdlIHZhbHVlXG5cbiAgICAgIF90aGlzLnNldFZhbHVlKHJlc3VsdC50aXRsZSk7XG5cbiAgICAgIF90aGlzLmhhbmRsZVJlc3VsdFNlbGVjdChlLCByZXN1bHQpO1xuXG4gICAgICBfdGhpcy5jbG9zZSgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVJdGVtTW91c2VEb3duID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIC8vIEhlYWRzIHVwISBXZSBzaG91bGQgcHJldmVudCBkZWZhdWx0IHRvIHByZXZlbnQgYmx1ciBldmVudHMuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vU2VtYW50aWMtT3JnL1NlbWFudGljLVVJLVJlYWN0L2lzc3Vlcy8zMjk4XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUZvY3VzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsICdvbkZvY3VzJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlQmx1ciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25CbHVyJywgZSwgX3RoaXMucHJvcHMpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGZvY3VzOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZVNlYXJjaENoYW5nZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBwcmV2ZW50IHByb3BhZ2F0aW5nIHRvIHRoaXMucHJvcHMub25DaGFuZ2UoKVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHZhciBtaW5DaGFyYWN0ZXJzID0gX3RoaXMucHJvcHMubWluQ2hhcmFjdGVycztcbiAgICAgIHZhciBvcGVuID0gX3RoaXMuc3RhdGUub3BlbjtcbiAgICAgIHZhciBuZXdRdWVyeSA9IGUudGFyZ2V0LnZhbHVlO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25TZWFyY2hDaGFuZ2UnLCBlLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgdmFsdWU6IG5ld1F1ZXJ5XG4gICAgICB9KSk7IC8vIG9wZW4gc2VhcmNoIGRyb3Bkb3duIG9uIHNlYXJjaCBxdWVyeVxuXG5cbiAgICAgIGlmIChuZXdRdWVyeS5sZW5ndGggPCBtaW5DaGFyYWN0ZXJzKSB7XG4gICAgICAgIF90aGlzLmNsb3NlKCk7XG4gICAgICB9IGVsc2UgaWYgKCFvcGVuKSB7XG4gICAgICAgIF90aGlzLnRyeU9wZW4obmV3UXVlcnkpO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy5zZXRWYWx1ZShuZXdRdWVyeSk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEZsYXR0ZW5lZFJlc3VsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjYXRlZ29yeSA9IF90aGlzJHByb3BzLmNhdGVnb3J5LFxuICAgICAgICAgIHJlc3VsdHMgPSBfdGhpcyRwcm9wcy5yZXN1bHRzO1xuICAgICAgcmV0dXJuICFjYXRlZ29yeSA/IHJlc3VsdHMgOiBfcmVkdWNlKHJlc3VsdHMsIGZ1bmN0aW9uIChtZW1vLCBjYXRlZ29yeURhdGEpIHtcbiAgICAgICAgcmV0dXJuIG1lbW8uY29uY2F0KGNhdGVnb3J5RGF0YS5yZXN1bHRzKTtcbiAgICAgIH0sIFtdKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZ2V0U2VsZWN0ZWRSZXN1bHQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGluZGV4ID0gX3RoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlc3VsdHMgPSBfdGhpcy5nZXRGbGF0dGVuZWRSZXN1bHRzKCk7XG5cbiAgICAgIHJldHVybiBfZ2V0KHJlc3VsdHMsIGluZGV4KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc2V0VmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHZhciBzZWxlY3RGaXJzdFJlc3VsdCA9IF90aGlzLnByb3BzLnNlbGVjdEZpcnN0UmVzdWx0O1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgc2VsZWN0ZWRJbmRleDogc2VsZWN0Rmlyc3RSZXN1bHQgPyAwIDogLTFcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5tb3ZlU2VsZWN0aW9uQnkgPSBmdW5jdGlvbiAoZSwgb2Zmc2V0KSB7XG4gICAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IF90aGlzLnN0YXRlLnNlbGVjdGVkSW5kZXg7XG5cbiAgICAgIHZhciByZXN1bHRzID0gX3RoaXMuZ2V0RmxhdHRlbmVkUmVzdWx0cygpO1xuXG4gICAgICB2YXIgbGFzdEluZGV4ID0gcmVzdWx0cy5sZW5ndGggLSAxOyAvLyBuZXh0IGlzIGFmdGVyIGxhc3QsIHdyYXAgdG8gYmVnaW5uaW5nXG4gICAgICAvLyBuZXh0IGlzIGJlZm9yZSBmaXJzdCwgd3JhcCB0byBlbmRcblxuICAgICAgdmFyIG5leHRJbmRleCA9IHNlbGVjdGVkSW5kZXggKyBvZmZzZXQ7XG4gICAgICBpZiAobmV4dEluZGV4ID4gbGFzdEluZGV4KSBuZXh0SW5kZXggPSAwO2Vsc2UgaWYgKG5leHRJbmRleCA8IDApIG5leHRJbmRleCA9IGxhc3RJbmRleDtcblxuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3RlZEluZGV4OiBuZXh0SW5kZXhcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldygpO1xuXG4gICAgICBfdGhpcy5oYW5kbGVTZWxlY3Rpb25DaGFuZ2UoZSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRG8gbm90IGFjY2VzcyBkb2N1bWVudCB3aGVuIHNlcnZlciBzaWRlIHJlbmRlcmluZ1xuICAgICAgaWYgKCFpc0Jyb3dzZXIoKSkgcmV0dXJuO1xuICAgICAgdmFyIG1lbnUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcudWkuc2VhcmNoLmFjdGl2ZS52aXNpYmxlIC5yZXN1bHRzLnZpc2libGUnKTtcbiAgICAgIGlmICghbWVudSkgcmV0dXJuO1xuICAgICAgdmFyIGl0ZW0gPSBtZW51LnF1ZXJ5U2VsZWN0b3IoJy5yZXN1bHQuYWN0aXZlJyk7XG4gICAgICBpZiAoIWl0ZW0pIHJldHVybjtcbiAgICAgIHZhciBpc091dE9mVXBwZXJWaWV3ID0gaXRlbS5vZmZzZXRUb3AgPCBtZW51LnNjcm9sbFRvcDtcbiAgICAgIHZhciBpc091dE9mTG93ZXJWaWV3ID0gaXRlbS5vZmZzZXRUb3AgKyBpdGVtLmNsaWVudEhlaWdodCA+IG1lbnUuc2Nyb2xsVG9wICsgbWVudS5jbGllbnRIZWlnaHQ7XG5cbiAgICAgIGlmIChpc091dE9mVXBwZXJWaWV3KSB7XG4gICAgICAgIG1lbnUuc2Nyb2xsVG9wID0gaXRlbS5vZmZzZXRUb3A7XG4gICAgICB9IGVsc2UgaWYgKGlzT3V0T2ZMb3dlclZpZXcpIHtcbiAgICAgICAgbWVudS5zY3JvbGxUb3AgPSBpdGVtLm9mZnNldFRvcCArIGl0ZW0uY2xpZW50SGVpZ2h0IC0gbWVudS5jbGllbnRIZWlnaHQ7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnRyeU9wZW4gPSBmdW5jdGlvbiAoY3VycmVudFZhbHVlKSB7XG4gICAgICBpZiAoY3VycmVudFZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgICAgY3VycmVudFZhbHVlID0gX3RoaXMuc3RhdGUudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBtaW5DaGFyYWN0ZXJzID0gX3RoaXMucHJvcHMubWluQ2hhcmFjdGVycztcbiAgICAgIGlmIChjdXJyZW50VmFsdWUubGVuZ3RoIDwgbWluQ2hhcmFjdGVycykgcmV0dXJuO1xuXG4gICAgICBfdGhpcy5vcGVuKCk7XG4gICAgfTtcblxuICAgIF90aGlzLm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIG9wZW46IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgb3BlbjogZmFsc2VcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJTZWFyY2hJbnB1dCA9IGZ1bmN0aW9uIChyZXN0KSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMyID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgaWNvbiA9IF90aGlzJHByb3BzMi5pY29uLFxuICAgICAgICAgIGlucHV0ID0gX3RoaXMkcHJvcHMyLmlucHV0O1xuICAgICAgdmFyIHZhbHVlID0gX3RoaXMuc3RhdGUudmFsdWU7XG4gICAgICByZXR1cm4gSW5wdXQuY3JlYXRlKGlucHV0LCB7XG4gICAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRQcm9wczogX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgICAgICBhdXRvQ29tcGxldGU6ICdvZmYnLFxuICAgICAgICAgIGljb246IGljb24sXG4gICAgICAgICAgb25DaGFuZ2U6IF90aGlzLmhhbmRsZVNlYXJjaENoYW5nZSxcbiAgICAgICAgICBvbkNsaWNrOiBfdGhpcy5oYW5kbGVJbnB1dENsaWNrLFxuICAgICAgICAgIHRhYkluZGV4OiAnMCcsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgIH0pLFxuICAgICAgICAvLyBOZXN0ZWQgc2hvcnRoYW5kIHByb3BzIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQgdG8gc3Vydml2ZSB0aGUgc2hhbGxvdyBtZXJnZVxuICAgICAgICBvdmVycmlkZVByb3BzOiBvdmVycmlkZVNlYXJjaElucHV0UHJvcHNcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJOb1Jlc3VsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMkcHJvcHMzID0gX3RoaXMucHJvcHMsXG4gICAgICAgICAgbm9SZXN1bHRzRGVzY3JpcHRpb24gPSBfdGhpcyRwcm9wczMubm9SZXN1bHRzRGVzY3JpcHRpb24sXG4gICAgICAgICAgbm9SZXN1bHRzTWVzc2FnZSA9IF90aGlzJHByb3BzMy5ub1Jlc3VsdHNNZXNzYWdlO1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcIm1lc3NhZ2UgZW1wdHlcIlxuICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiaGVhZGVyXCJcbiAgICAgIH0sIG5vUmVzdWx0c01lc3NhZ2UpLCBub1Jlc3VsdHNEZXNjcmlwdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJkZXNjcmlwdGlvblwiXG4gICAgICB9LCBub1Jlc3VsdHNEZXNjcmlwdGlvbikpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJSZXN1bHQgPSBmdW5jdGlvbiAoX3JlZjIsIGluZGV4LCBfYXJyYXksIG9mZnNldCkge1xuICAgICAgdmFyIGNoaWxkS2V5ID0gX3JlZjIuY2hpbGRLZXksXG4gICAgICAgICAgcmVzdWx0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjIsIFtcImNoaWxkS2V5XCJdKTtcblxuICAgICAgaWYgKG9mZnNldCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIG9mZnNldCA9IDA7XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHRSZW5kZXJlciA9IF90aGlzLnByb3BzLnJlc3VsdFJlbmRlcmVyO1xuICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4O1xuICAgICAgdmFyIG9mZnNldEluZGV4ID0gaW5kZXggKyBvZmZzZXQ7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2VhcmNoUmVzdWx0LCBfZXh0ZW5kcyh7XG4gICAgICAgIGtleTogY2hpbGRLZXkgIT0gbnVsbCA/IGNoaWxkS2V5IDogcmVzdWx0LmlkIHx8IHJlc3VsdC50aXRsZSxcbiAgICAgICAgYWN0aXZlOiBzZWxlY3RlZEluZGV4ID09PSBvZmZzZXRJbmRleCxcbiAgICAgICAgb25DbGljazogX3RoaXMuaGFuZGxlSXRlbUNsaWNrLFxuICAgICAgICBvbk1vdXNlRG93bjogX3RoaXMuaGFuZGxlSXRlbU1vdXNlRG93bixcbiAgICAgICAgcmVuZGVyZXI6IHJlc3VsdFJlbmRlcmVyXG4gICAgICB9LCByZXN1bHQsIHtcbiAgICAgICAgaWQ6IG9mZnNldEluZGV4IC8vIFVzZWQgdG8gbG9va3VwIHRoZSByZXN1bHQgb24gaXRlbSBjbGlja1xuXG4gICAgICB9KSk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbmRlclJlc3VsdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmVzdWx0cyA9IF90aGlzLnByb3BzLnJlc3VsdHM7XG4gICAgICByZXR1cm4gX21hcChyZXN1bHRzLCBfdGhpcy5yZW5kZXJSZXN1bHQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJDYXRlZ29yaWVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF90aGlzJHByb3BzNCA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGNhdGVnb3J5TGF5b3V0UmVuZGVyZXIgPSBfdGhpcyRwcm9wczQuY2F0ZWdvcnlMYXlvdXRSZW5kZXJlcixcbiAgICAgICAgICBjYXRlZ29yeVJlbmRlcmVyID0gX3RoaXMkcHJvcHM0LmNhdGVnb3J5UmVuZGVyZXIsXG4gICAgICAgICAgY2F0ZWdvcmllcyA9IF90aGlzJHByb3BzNC5yZXN1bHRzO1xuICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSBfdGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4O1xuICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgIHJldHVybiBfbWFwKGNhdGVnb3JpZXMsIGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgY2hpbGRLZXkgPSBfcmVmMy5jaGlsZEtleSxcbiAgICAgICAgICAgIGNhdGVnb3J5ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3JlZjMsIFtcImNoaWxkS2V5XCJdKTtcblxuICAgICAgICB2YXIgY2F0ZWdvcnlQcm9wcyA9IF9leHRlbmRzKHtcbiAgICAgICAgICBrZXk6IGNoaWxkS2V5ICE9IG51bGwgPyBjaGlsZEtleSA6IGNhdGVnb3J5Lm5hbWUsXG4gICAgICAgICAgYWN0aXZlOiBfaW5SYW5nZShzZWxlY3RlZEluZGV4LCBjb3VudCwgY291bnQgKyBjYXRlZ29yeS5yZXN1bHRzLmxlbmd0aCksXG4gICAgICAgICAgbGF5b3V0UmVuZGVyZXI6IGNhdGVnb3J5TGF5b3V0UmVuZGVyZXIsXG4gICAgICAgICAgcmVuZGVyZXI6IGNhdGVnb3J5UmVuZGVyZXJcbiAgICAgICAgfSwgY2F0ZWdvcnkpO1xuXG4gICAgICAgIHZhciByZW5kZXJGbiA9IF9wYXJ0aWFsUmlnaHQoX3RoaXMucmVuZGVyUmVzdWx0LCBjb3VudCk7XG5cbiAgICAgICAgY291bnQgKz0gY2F0ZWdvcnkucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWFyY2hDYXRlZ29yeSwgY2F0ZWdvcnlQcm9wcywgY2F0ZWdvcnkucmVzdWx0cy5tYXAocmVuZGVyRm4pKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW5kZXJNZW51Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczUgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjYXRlZ29yeSA9IF90aGlzJHByb3BzNS5jYXRlZ29yeSxcbiAgICAgICAgICBzaG93Tm9SZXN1bHRzID0gX3RoaXMkcHJvcHM1LnNob3dOb1Jlc3VsdHMsXG4gICAgICAgICAgcmVzdWx0cyA9IF90aGlzJHByb3BzNS5yZXN1bHRzO1xuXG4gICAgICBpZiAoX2lzRW1wdHkocmVzdWx0cykpIHtcbiAgICAgICAgcmV0dXJuIHNob3dOb1Jlc3VsdHMgPyBfdGhpcy5yZW5kZXJOb1Jlc3VsdHMoKSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYXRlZ29yeSA/IF90aGlzLnJlbmRlckNhdGVnb3JpZXMoKSA6IF90aGlzLnJlbmRlclJlc3VsdHMoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVuZGVyUmVzdWx0c01lbnUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb3BlbiA9IF90aGlzLnN0YXRlLm9wZW47XG4gICAgICB2YXIgcmVzdWx0c0NsYXNzZXMgPSBvcGVuID8gJ3Zpc2libGUnIDogJyc7XG5cbiAgICAgIHZhciBtZW51Q29udGVudCA9IF90aGlzLnJlbmRlck1lbnVDb250ZW50KCk7XG5cbiAgICAgIGlmICghbWVudUNvbnRlbnQpIHJldHVybjtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZWFyY2hSZXN1bHRzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogcmVzdWx0c0NsYXNzZXNcbiAgICAgIH0sIG1lbnVDb250ZW50KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU2VhcmNoLmdldEF1dG9Db250cm9sbGVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXRBdXRvQ29udHJvbGxlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIC8vIFdlIG5lZWQgdG8gc3RvcmUgYSBgcHJldlZhbHVlYCB0byBjb21wYXJlIGFzIGluIGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIHdlIGRvbid0IGhhdmVcbiAgICAvLyBwcmV2U3RhdGVcbiAgICBpZiAodHlwZW9mIHN0YXRlLnByZXZWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2hhbGxvd0VxdWFsKHN0YXRlLnByZXZWYWx1ZSwgc3RhdGUudmFsdWUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmV2VmFsdWU6IHN0YXRlLnZhbHVlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBzZWxlY3RlZEluZGV4ID0gcHJvcHMuc2VsZWN0Rmlyc3RSZXN1bHQgPyAwIDogLTE7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByZXZWYWx1ZTogc3RhdGUudmFsdWUsXG4gICAgICBzZWxlY3RlZEluZGV4OiBzZWxlY3RlZEluZGV4XG4gICAgfTtcbiAgfTtcblxuICB2YXIgX3Byb3RvID0gU2VhcmNoLnByb3RvdHlwZTtcblxuICBfcHJvdG8uc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWwobmV4dFByb3BzLCB0aGlzLnByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKG5leHRTdGF0ZSwgdGhpcy5zdGF0ZSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY29tcGxleGl0eVxuICAgIC8vIGZvY3VzZWQgLyBibHVycmVkXG4gICAgaWYgKCFwcmV2U3RhdGUuZm9jdXMgJiYgdGhpcy5zdGF0ZS5mb2N1cykge1xuICAgICAgaWYgKCF0aGlzLmlzTW91c2VEb3duKSB7XG4gICAgICAgIHRoaXMudHJ5T3BlbigpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdGF0ZS5vcGVuKSB7XG4gICAgICAgIGV2ZW50U3RhY2suc3ViKCdrZXlkb3duJywgW3RoaXMubW92ZVNlbGVjdGlvbk9uS2V5RG93biwgdGhpcy5zZWxlY3RJdGVtT25FbnRlcl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJldlN0YXRlLmZvY3VzICYmICF0aGlzLnN0YXRlLmZvY3VzKSB7XG4gICAgICBpZiAoIXRoaXMuaXNNb3VzZURvd24pIHtcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgfVxuXG4gICAgICBldmVudFN0YWNrLnVuc3ViKCdrZXlkb3duJywgW3RoaXMubW92ZVNlbGVjdGlvbk9uS2V5RG93biwgdGhpcy5zZWxlY3RJdGVtT25FbnRlcl0pO1xuICAgIH0gLy8gb3BlbmVkIC8gY2xvc2VkXG5cblxuICAgIGlmICghcHJldlN0YXRlLm9wZW4gJiYgdGhpcy5zdGF0ZS5vcGVuKSB7XG4gICAgICB0aGlzLm9wZW4oKTtcbiAgICAgIGV2ZW50U3RhY2suc3ViKCdjbGljaycsIHRoaXMuY2xvc2VPbkRvY3VtZW50Q2xpY2spO1xuICAgICAgZXZlbnRTdGFjay5zdWIoJ2tleWRvd24nLCBbdGhpcy5jbG9zZU9uRXNjYXBlLCB0aGlzLm1vdmVTZWxlY3Rpb25PbktleURvd24sIHRoaXMuc2VsZWN0SXRlbU9uRW50ZXJdKTtcbiAgICB9IGVsc2UgaWYgKHByZXZTdGF0ZS5vcGVuICYmICF0aGlzLnN0YXRlLm9wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgIGV2ZW50U3RhY2sudW5zdWIoJ2NsaWNrJywgdGhpcy5jbG9zZU9uRG9jdW1lbnRDbGljayk7XG4gICAgICBldmVudFN0YWNrLnVuc3ViKCdrZXlkb3duJywgW3RoaXMuY2xvc2VPbkVzY2FwZSwgdGhpcy5tb3ZlU2VsZWN0aW9uT25LZXlEb3duLCB0aGlzLnNlbGVjdEl0ZW1PbkVudGVyXSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGV2ZW50U3RhY2sudW5zdWIoJ2NsaWNrJywgdGhpcy5jbG9zZU9uRG9jdW1lbnRDbGljayk7XG4gICAgZXZlbnRTdGFjay51bnN1Yigna2V5ZG93bicsIFt0aGlzLmNsb3NlT25Fc2NhcGUsIHRoaXMubW92ZVNlbGVjdGlvbk9uS2V5RG93biwgdGhpcy5zZWxlY3RJdGVtT25FbnRlcl0pO1xuICB9IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gRG9jdW1lbnQgRXZlbnQgSGFuZGxlcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICA7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBzZWFyY2hDbGFzc2VzID0gX3RoaXMkc3RhdGUuc2VhcmNoQ2xhc3NlcyxcbiAgICAgICAgZm9jdXMgPSBfdGhpcyRzdGF0ZS5mb2N1cyxcbiAgICAgICAgb3BlbiA9IF90aGlzJHN0YXRlLm9wZW47XG4gICAgdmFyIF90aGlzJHByb3BzNiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFsaWduZWQgPSBfdGhpcyRwcm9wczYuYWxpZ25lZCxcbiAgICAgICAgY2F0ZWdvcnkgPSBfdGhpcyRwcm9wczYuY2F0ZWdvcnksXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzNi5jbGFzc05hbWUsXG4gICAgICAgIGZsdWlkID0gX3RoaXMkcHJvcHM2LmZsdWlkLFxuICAgICAgICBsb2FkaW5nID0gX3RoaXMkcHJvcHM2LmxvYWRpbmcsXG4gICAgICAgIHNpemUgPSBfdGhpcyRwcm9wczYuc2l6ZTsgLy8gQ2xhc3Nlc1xuXG4gICAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBvcGVuICYmICdhY3RpdmUgdmlzaWJsZScsIHNpemUsIHNlYXJjaENsYXNzZXMsIHVzZUtleU9ubHkoY2F0ZWdvcnksICdjYXRlZ29yeScpLCB1c2VLZXlPbmx5KGZvY3VzLCAnZm9jdXMnKSwgdXNlS2V5T25seShmbHVpZCwgJ2ZsdWlkJyksIHVzZUtleU9ubHkobG9hZGluZywgJ2xvYWRpbmcnKSwgdXNlVmFsdWVBbmRLZXkoYWxpZ25lZCwgJ2FsaWduZWQnKSwgJ3NlYXJjaCcsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGdldFVuaGFuZGxlZFByb3BzKFNlYXJjaCwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU2VhcmNoLCB0aGlzLnByb3BzKTtcblxuICAgIHZhciBfcGFydGl0aW9uSFRNTFByb3BzID0gcGFydGl0aW9uSFRNTFByb3BzKHVuaGFuZGxlZCwge1xuICAgICAgaHRtbFByb3BzOiBodG1sSW5wdXRBdHRyc1xuICAgIH0pLFxuICAgICAgICBodG1sSW5wdXRQcm9wcyA9IF9wYXJ0aXRpb25IVE1MUHJvcHNbMF0sXG4gICAgICAgIHJlc3QgPSBfcGFydGl0aW9uSFRNTFByb3BzWzFdO1xuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgb25CbHVyOiB0aGlzLmhhbmRsZUJsdXIsXG4gICAgICBvbkZvY3VzOiB0aGlzLmhhbmRsZUZvY3VzLFxuICAgICAgb25Nb3VzZURvd246IHRoaXMuaGFuZGxlTW91c2VEb3duXG4gICAgfSksIHRoaXMucmVuZGVyU2VhcmNoSW5wdXQoaHRtbElucHV0UHJvcHMpLCB0aGlzLnJlbmRlclJlc3VsdHNNZW51KCkpO1xuICB9O1xuXG4gIHJldHVybiBTZWFyY2g7XG59KENvbXBvbmVudCk7XG5cblNlYXJjaC5oYW5kbGVkUHJvcHMgPSBbXCJhbGlnbmVkXCIsIFwiYXNcIiwgXCJjYXRlZ29yeVwiLCBcImNhdGVnb3J5TGF5b3V0UmVuZGVyZXJcIiwgXCJjYXRlZ29yeVJlbmRlcmVyXCIsIFwiY2xhc3NOYW1lXCIsIFwiZGVmYXVsdE9wZW5cIiwgXCJkZWZhdWx0VmFsdWVcIiwgXCJmbHVpZFwiLCBcImljb25cIiwgXCJpbnB1dFwiLCBcImxvYWRpbmdcIiwgXCJtaW5DaGFyYWN0ZXJzXCIsIFwibm9SZXN1bHRzRGVzY3JpcHRpb25cIiwgXCJub1Jlc3VsdHNNZXNzYWdlXCIsIFwib25CbHVyXCIsIFwib25Gb2N1c1wiLCBcIm9uTW91c2VEb3duXCIsIFwib25SZXN1bHRTZWxlY3RcIiwgXCJvblNlYXJjaENoYW5nZVwiLCBcIm9uU2VsZWN0aW9uQ2hhbmdlXCIsIFwib3BlblwiLCBcInJlc3VsdFJlbmRlcmVyXCIsIFwicmVzdWx0c1wiLCBcInNlbGVjdEZpcnN0UmVzdWx0XCIsIFwic2hvd05vUmVzdWx0c1wiLCBcInNpemVcIiwgXCJ2YWx1ZVwiXTtcbmV4cG9ydCB7IFNlYXJjaCBhcyBkZWZhdWx0IH07XG5TZWFyY2gucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEJlaGF2aW9yXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIC8qKiBJbml0aWFsIHZhbHVlIG9mIG9wZW4uICovXG4gIGRlZmF1bHRPcGVuOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogSW5pdGlhbCB2YWx1ZS4gKi9cbiAgZGVmYXVsdFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEljb24uICovXG4gIGljb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ub2RlLCBQcm9wVHlwZXMub2JqZWN0XSksXG5cbiAgLyoqIE1pbmltdW0gY2hhcmFjdGVycyB0byBxdWVyeSBmb3IgcmVzdWx0cyAqL1xuICBtaW5DaGFyYWN0ZXJzOiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKiBBZGRpdGlvbmFsIHRleHQgZm9yIFwiTm8gUmVzdWx0c1wiIG1lc3NhZ2Ugd2l0aCBsZXNzIGVtcGhhc2lzLiAqL1xuICBub1Jlc3VsdHNEZXNjcmlwdGlvbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIE1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGFyZSBubyByZXN1bHRzLiAqL1xuICBub1Jlc3VsdHNNZXNzYWdlOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHJlc3VsdHMgbWVudSBpcyBkaXNwbGF5ZWQuICovXG4gIG9wZW46IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKlxuICAgKiBPbmUgb2Y6XG4gICAqIC0gYXJyYXkgb2YgU2VhcmNoLlJlc3VsdCBwcm9wcyBlLmcuIGB7IHRpdGxlOiAnJywgZGVzY3JpcHRpb246ICcnIH1gIG9yXG4gICAqIC0gb2JqZWN0IG9mIGNhdGVnb3JpZXMgZS5nLiBgeyBuYW1lOiAnJywgcmVzdWx0czogW3sgdGl0bGU6ICcnLCBkZXNjcmlwdGlvbjogJycgfV1gXG4gICAqL1xuICByZXN1bHRzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc2hhcGUoU2VhcmNoUmVzdWx0LnByb3BUeXBlcykpLCBQcm9wVHlwZXMuc2hhcGUoU2VhcmNoQ2F0ZWdvcnkucHJvcFR5cGVzKV0pLFxuXG4gIC8qKiBXaGV0aGVyIHRoZSBzZWFyY2ggc2hvdWxkIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBmaXJzdCByZXN1bHQgYWZ0ZXIgc2VhcmNoaW5nLiAqL1xuICBzZWxlY3RGaXJzdFJlc3VsdDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFdoZXRoZXIgYSBcIm5vIHJlc3VsdHNcIiBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBpZiBubyByZXN1bHRzIGFyZSBmb3VuZC4gKi9cbiAgc2hvd05vUmVzdWx0czogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEN1cnJlbnQgdmFsdWUgb2YgdGhlIHNlYXJjaCBpbnB1dC4gQ3JlYXRlcyBhIGNvbnRyb2xsZWQgY29tcG9uZW50LiAqL1xuICB2YWx1ZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFJlbmRlcmluZ1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgU2VhcmNoQ2F0ZWdvcnkgbGF5b3V0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gY2F0ZWdvcnlDb250ZW50IC0gVGhlIFJlbmRlcmFibGUgU2VhcmNoQ2F0ZWdvcnkgY29udGVudHMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHRzQ29udGVudCAtIFRoZSBSZW5kZXJhYmxlIFNlYXJjaFJlc3VsdCBjb250ZW50cy5cbiAgICogQHJldHVybnMgeyp9IC0gUmVuZGVyYWJsZSBTZWFyY2hDYXRlZ29yeSBsYXlvdXQuXG4gICAqL1xuICBjYXRlZ29yeUxheW91dFJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgU2VhcmNoQ2F0ZWdvcnkgY29udGVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyAtIFRoZSBTZWFyY2hDYXRlZ29yeSBwcm9wcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHsqfSAtIFJlbmRlcmFibGUgU2VhcmNoQ2F0ZWdvcnkgY29udGVudHMuXG4gICAqL1xuICBjYXRlZ29yeVJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgU2VhcmNoUmVzdWx0IGNvbnRlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgLSBUaGUgU2VhcmNoUmVzdWx0IHByb3BzIG9iamVjdC5cbiAgICogQHJldHVybnMgeyp9IC0gUmVuZGVyYWJsZSBTZWFyY2hSZXN1bHQgY29udGVudHMuXG4gICAqL1xuICByZXN1bHRSZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDYWxsYmFja3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBibHVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25CbHVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGZvY3VzLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25Gb2N1czogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBtb3VzZWRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbk1vdXNlRG93bjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgcmVzdWx0IGlzIHNlbGVjdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25SZXN1bHRTZWxlY3Q6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gc2VhcmNoIGlucHV0IGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcywgaW5jbHVkZXMgY3VycmVudCB2YWx1ZSBvZiBzZWFyY2ggaW5wdXQuXG4gICAqL1xuICBvblNlYXJjaENoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBhY3RpdmUgc2VsZWN0aW9uIGluZGV4IGlzIGNoYW5nZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvblNlbGVjdGlvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTdHlsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogQSBzZWFyY2ggY2FuIGhhdmUgaXRzIHJlc3VsdHMgYWxpZ25lZCB0byBpdHMgbGVmdCBvciByaWdodCBjb250YWluZXIgZWRnZS4gKi9cbiAgYWxpZ25lZDogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBzZWFyY2ggY2FuIGRpc3BsYXkgcmVzdWx0cyBmcm9tIHJlbW90ZSBjb250ZW50IG9yZGVyZWQgYnkgY2F0ZWdvcmllcy4gKi9cbiAgY2F0ZWdvcnk6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSBzZWFyY2ggY2FuIGhhdmUgaXRzIHJlc3VsdHMgdGFrZSB1cCB0aGUgd2lkdGggb2YgaXRzIGNvbnRhaW5lci4gKi9cbiAgZmx1aWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIGlucHV0IGVsZW1lbnQuICovXG4gIGlucHV0OiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBzZWFyY2ggY2FuIHNob3cgYSBsb2FkaW5nIGluZGljYXRvci4gKi9cbiAgbG9hZGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgc2VhcmNoIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScpKVxufSA6IHt9O1xuU2VhcmNoLmRlZmF1bHRQcm9wcyA9IHtcbiAgaWNvbjogJ3NlYXJjaCcsXG4gIGlucHV0OiAndGV4dCcsXG4gIG1pbkNoYXJhY3RlcnM6IDEsXG4gIG5vUmVzdWx0c01lc3NhZ2U6ICdObyByZXN1bHRzIGZvdW5kLicsXG4gIHNob3dOb1Jlc3VsdHM6IHRydWVcbn07XG5TZWFyY2guYXV0b0NvbnRyb2xsZWRQcm9wcyA9IFsnb3BlbicsICd2YWx1ZSddO1xuU2VhcmNoLkNhdGVnb3J5ID0gU2VhcmNoQ2F0ZWdvcnk7XG5TZWFyY2guUmVzdWx0ID0gU2VhcmNoUmVzdWx0O1xuU2VhcmNoLlJlc3VsdHMgPSBTZWFyY2hSZXN1bHRzOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgU2VhcmNoQ2F0ZWdvcnlMYXlvdXQgZnJvbSAnLi9TZWFyY2hDYXRlZ29yeUxheW91dCc7XG5cbmZ1bmN0aW9uIFNlYXJjaENhdGVnb3J5KHByb3BzKSB7XG4gIHZhciBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBsYXlvdXRSZW5kZXJlciA9IHByb3BzLmxheW91dFJlbmRlcmVyLFxuICAgICAgcmVuZGVyZXIgPSBwcm9wcy5yZW5kZXJlcjtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGFjdGl2ZSwgJ2FjdGl2ZScpLCAnY2F0ZWdvcnknLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFNlYXJjaENhdGVnb3J5LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFNlYXJjaENhdGVnb3J5LCBwcm9wcyk7XG4gIHZhciBjYXRlZ29yeUNvbnRlbnQgPSByZW5kZXJlcihwcm9wcyk7XG4gIHZhciByZXN1bHRzQ29udGVudCA9IGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBsYXlvdXRSZW5kZXJlcih7XG4gICAgY2F0ZWdvcnlDb250ZW50OiBjYXRlZ29yeUNvbnRlbnQsXG4gICAgcmVzdWx0c0NvbnRlbnQ6IHJlc3VsdHNDb250ZW50XG4gIH0pKTtcbn1cblxuU2VhcmNoQ2F0ZWdvcnkuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJsYXlvdXRSZW5kZXJlclwiLCBcIm5hbWVcIiwgXCJyZW5kZXJlclwiLCBcInJlc3VsdHNcIl07XG5TZWFyY2hDYXRlZ29yeS5kZWZhdWx0UHJvcHMgPSB7XG4gIGxheW91dFJlbmRlcmVyOiBTZWFyY2hDYXRlZ29yeUxheW91dCxcbiAgcmVuZGVyZXI6IGZ1bmN0aW9uIHJlbmRlcmVyKF9yZWYpIHtcbiAgICB2YXIgbmFtZSA9IF9yZWYubmFtZTtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxufTtcblNlYXJjaENhdGVnb3J5LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFRoZSBpdGVtIGN1cnJlbnRseSBzZWxlY3RlZCBieSBrZXlib2FyZCBzaG9ydGN1dC4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIERpc3BsYXkgbmFtZS4gKi9cbiAgbmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgY2F0ZWdvcnkgbGF5b3V0IGNvbnRlbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHMgLSBUaGUgU2VhcmNoQ2F0ZWdvcnlMYXlvdXQgcHJvcHMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Kn0gLSBSZW5kZXJhYmxlIGNhdGVnb3J5IGxheW91dCBjb250ZW50cy5cbiAgICovXG4gIGxheW91dFJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgY2F0ZWdvcnkgY29udGVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyAtIFRoZSBTZWFyY2hDYXRlZ29yeSBwcm9wcyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHsqfSAtIFJlbmRlcmFibGUgY2F0ZWdvcnkgY29udGVudHMuXG4gICAqL1xuICByZW5kZXJlcjogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEFycmF5IG9mIFNlYXJjaC5SZXN1bHQgcHJvcHMuICovXG4gIHJlc3VsdHM6IFByb3BUeXBlcy5hcnJheVxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgU2VhcmNoQ2F0ZWdvcnk7IiwiaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmZ1bmN0aW9uIFNlYXJjaENhdGVnb3J5TGF5b3V0KHByb3BzKSB7XG4gIHZhciBjYXRlZ29yeUNvbnRlbnQgPSBwcm9wcy5jYXRlZ29yeUNvbnRlbnQsXG4gICAgICByZXN1bHRzQ29udGVudCA9IHByb3BzLnJlc3VsdHNDb250ZW50O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwibmFtZVwiXG4gIH0sIGNhdGVnb3J5Q29udGVudCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwicmVzdWx0c1wiXG4gIH0sIHJlc3VsdHNDb250ZW50KSk7XG59XG5cblNlYXJjaENhdGVnb3J5TGF5b3V0LmhhbmRsZWRQcm9wcyA9IFtcImNhdGVnb3J5Q29udGVudFwiLCBcInJlc3VsdHNDb250ZW50XCJdO1xuU2VhcmNoQ2F0ZWdvcnlMYXlvdXQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogVGhlIHJlbmRlcmVkIGNhdGVnb3J5IGNvbnRlbnQgKi9cbiAgY2F0ZWdvcnlDb250ZW50OiBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkLFxuXG4gIC8qKiBUaGUgcmVuZGVyZWQgcmVzdWx0cyBjb250ZW50ICovXG4gIHJlc3VsdHNDb250ZW50OiBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBTZWFyY2hDYXRlZ29yeUxheW91dDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjcmVhdGVIVE1MSW1hZ2UsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJzsgLy8gTm90ZTogWW91IHRlY2huaWNhbGx5IG9ubHkgbmVlZCB0aGUgJ2NvbnRlbnQnIHdyYXBwZXIgd2hlbiB0aGVyZSdzIGFuXG4vLyBpbWFnZS4gSG93ZXZlciwgb3B0aW9uYWxseSB3cmFwcGluZyBpdCBtYWtlcyB0aGlzIGZ1bmN0aW9uIGEgbG90IG1vcmVcbi8vIGNvbXBsaWNhdGVkIGFuZCBoYXJkZXIgdG8gcmVhZC4gU2luY2UgYWx3YXlzIHdyYXBwaW5nIGl0IGRvZXNuJ3QgYWZmZWN0XG4vLyB0aGUgc3R5bGUgaW4gYW55IHdheSBsZXQncyBqdXN0IGRvIHRoYXQuXG4vL1xuLy8gTm90ZTogVG8gYXZvaWQgcmVxdWlyaW5nIGEgd3JhcHBpbmcgZGl2LCB3ZSByZXR1cm4gYW4gYXJyYXkgaGVyZSBzbyB0b1xuLy8gcHJldmVudCByZW5kZXJpbmcgaXNzdWVzIGVhY2ggbm9kZSBuZWVkcyBhIHVuaXF1ZSBrZXkuXG5cbnZhciBkZWZhdWx0UmVuZGVyZXIgPSBmdW5jdGlvbiBkZWZhdWx0UmVuZGVyZXIoX3JlZikge1xuICB2YXIgaW1hZ2UgPSBfcmVmLmltYWdlLFxuICAgICAgcHJpY2UgPSBfcmVmLnByaWNlLFxuICAgICAgdGl0bGUgPSBfcmVmLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb24gPSBfcmVmLmRlc2NyaXB0aW9uO1xuICByZXR1cm4gW2ltYWdlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBrZXk6IFwiaW1hZ2VcIixcbiAgICBjbGFzc05hbWU6IFwiaW1hZ2VcIlxuICB9LCBjcmVhdGVIVE1MSW1hZ2UoaW1hZ2UsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGtleTogXCJjb250ZW50XCIsXG4gICAgY2xhc3NOYW1lOiBcImNvbnRlbnRcIlxuICB9LCBwcmljZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcInByaWNlXCJcbiAgfSwgcHJpY2UpLCB0aXRsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcInRpdGxlXCJcbiAgfSwgdGl0bGUpLCBkZXNjcmlwdGlvbiAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImRlc2NyaXB0aW9uXCJcbiAgfSwgZGVzY3JpcHRpb24pKV07XG59O1xuXG5kZWZhdWx0UmVuZGVyZXIuaGFuZGxlZFByb3BzID0gW107XG5cbnZhciBTZWFyY2hSZXN1bHQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoU2VhcmNoUmVzdWx0LCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTZWFyY2hSZXN1bHQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgb25DbGljayA9IF90aGlzLnByb3BzLm9uQ2xpY2s7XG4gICAgICBpZiAob25DbGljaykgb25DbGljayhlLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTZWFyY2hSZXN1bHQucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlID0gX3RoaXMkcHJvcHMuYWN0aXZlLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJlbmRlcmVyID0gX3RoaXMkcHJvcHMucmVuZGVyZXI7XG4gICAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGFjdGl2ZSwgJ2FjdGl2ZScpLCAncmVzdWx0JywgY2xhc3NOYW1lKTtcbiAgICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFNlYXJjaFJlc3VsdCwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU2VhcmNoUmVzdWx0LCB0aGlzLnByb3BzKTsgLy8gTm90ZTogWW91IHRlY2huaWNhbGx5IG9ubHkgbmVlZCB0aGUgJ2NvbnRlbnQnIHdyYXBwZXIgd2hlbiB0aGVyZSdzIGFuXG4gICAgLy8gaW1hZ2UuIEhvd2V2ZXIsIG9wdGlvbmFsbHkgd3JhcHBpbmcgaXQgbWFrZXMgdGhpcyBmdW5jdGlvbiBhIGxvdCBtb3JlXG4gICAgLy8gY29tcGxpY2F0ZWQgYW5kIGhhcmRlciB0byByZWFkLiBTaW5jZSBhbHdheXMgd3JhcHBpbmcgaXQgZG9lc24ndCBhZmZlY3RcbiAgICAvLyB0aGUgc3R5bGUgaW4gYW55IHdheSBsZXQncyBqdXN0IGRvIHRoYXQuXG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgfSksIHJlbmRlcmVyKHRoaXMucHJvcHMpKTtcbiAgfTtcblxuICByZXR1cm4gU2VhcmNoUmVzdWx0O1xufShDb21wb25lbnQpO1xuXG5TZWFyY2hSZXN1bHQuaGFuZGxlZFByb3BzID0gW1wiYWN0aXZlXCIsIFwiYXNcIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGVzY3JpcHRpb25cIiwgXCJpZFwiLCBcImltYWdlXCIsIFwib25DbGlja1wiLCBcInByaWNlXCIsIFwicmVuZGVyZXJcIiwgXCJ0aXRsZVwiXTtcbmV4cG9ydCB7IFNlYXJjaFJlc3VsdCBhcyBkZWZhdWx0IH07XG5TZWFyY2hSZXN1bHQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogVGhlIGl0ZW0gY3VycmVudGx5IHNlbGVjdGVkIGJ5IGtleWJvYXJkIHNob3J0Y3V0LiAqL1xuICBhY3RpdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBZGRpdGlvbmFsIHRleHQgd2l0aCBsZXNzIGVtcGhhc2lzLiAqL1xuICBkZXNjcmlwdGlvbjogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQSB1bmlxdWUgaWRlbnRpZmllci4gKi9cbiAgaWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogQWRkIGFuIGltYWdlIHRvIHRoZSBpdGVtLiAqL1xuICBpbWFnZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGNsaWNrLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEN1c3RvbWl6ZWQgdGV4dCBmb3IgcHJpY2UuICovXG4gIHByaWNlOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSByZXN1bHQgY29udGVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyAtIFRoZSBTZWFyY2hSZXN1bHQgcHJvcHMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7Kn0gLSBSZW5kZXJhYmxlIHJlc3VsdCBjb250ZW50cy5cbiAgICovXG4gIHJlbmRlcmVyOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogRGlzcGxheSB0aXRsZS4gKi9cbiAgdGl0bGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufSA6IHt9O1xuU2VhcmNoUmVzdWx0LmRlZmF1bHRQcm9wcyA9IHtcbiAgcmVuZGVyZXI6IGRlZmF1bHRSZW5kZXJlclxufTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuXG5mdW5jdGlvbiBTZWFyY2hSZXN1bHRzKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ3Jlc3VsdHMgdHJhbnNpdGlvbicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoU2VhcmNoUmVzdWx0cywgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTZWFyY2hSZXN1bHRzLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuU2VhcmNoUmVzdWx0cy5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcblNlYXJjaFJlc3VsdHMucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IFNlYXJjaFJlc3VsdHM7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vU2VhcmNoJztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBfaW5oZXJpdHNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vaW5oZXJpdHNMb29zZVwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcbmltcG9ydCB7IEV2ZW50TGlzdGVuZXIsIGRvY3VtZW50UmVmIH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1ldmVudC1saXN0ZW5lcic7XG5pbXBvcnQgeyBSZWYsIGlzUmVmT2JqZWN0IH0gZnJvbSAnQGZsdWVudHVpL3JlYWN0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIGNyZWF0ZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZG9lc05vZGVDb250YWluQ2xpY2ssIGdldFVuaGFuZGxlZFByb3BzLCBnZXRFbGVtZW50VHlwZSwgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgU2lkZWJhclB1c2hhYmxlIGZyb20gJy4vU2lkZWJhclB1c2hhYmxlJztcbmltcG9ydCBTaWRlYmFyUHVzaGVyIGZyb20gJy4vU2lkZWJhclB1c2hlcic7XG4vKipcbiAqIEEgc2lkZWJhciBoaWRlcyBhZGRpdGlvbmFsIGNvbnRlbnQgYmVzaWRlIGEgcGFnZS5cbiAqL1xuXG52YXIgU2lkZWJhciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBfaW5oZXJpdHNMb29zZShTaWRlYmFyLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTaWRlYmFyKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMpIHx8IHRoaXM7XG4gICAgX3RoaXMucmVmID0gLyojX19QVVJFX18qL2NyZWF0ZVJlZigpO1xuXG4gICAgX3RoaXMuaGFuZGxlQW5pbWF0aW9uU3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmlzaWJsZSA9IF90aGlzLnByb3BzLnZpc2libGU7XG4gICAgICB2YXIgY2FsbGJhY2sgPSB2aXNpYmxlID8gJ29uVmlzaWJsZScgOiAnb25IaWRlJztcbiAgICAgIGNsZWFyVGltZW91dChfdGhpcy5hbmltYXRpb25UaW1lcik7XG4gICAgICBfdGhpcy5hbmltYXRpb25UaW1lciA9IHNldFRpbWVvdXQoX3RoaXMuaGFuZGxlQW5pbWF0aW9uRW5kLCBTaWRlYmFyLmFuaW1hdGlvbkR1cmF0aW9uKTtcblxuICAgICAgaWYgKF90aGlzLnNraXBOZXh0Q2FsbGJhY2spIHtcbiAgICAgICAgX3RoaXMuc2tpcE5leHRDYWxsYmFjayA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsIGNhbGxiYWNrLCBudWxsLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUFuaW1hdGlvbkVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2aXNpYmxlID0gX3RoaXMucHJvcHMudmlzaWJsZTtcbiAgICAgIHZhciBjYWxsYmFjayA9IHZpc2libGUgPyAnb25TaG93JyA6ICdvbkhpZGRlbic7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYW5pbWF0aW9uVGljazogMFxuICAgICAgfSk7XG5cbiAgICAgIF9pbnZva2UoX3RoaXMucHJvcHMsIGNhbGxiYWNrLCBudWxsLCBfdGhpcy5wcm9wcyk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZURvY3VtZW50Q2xpY2sgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFkb2VzTm9kZUNvbnRhaW5DbGljayhfdGhpcy5yZWYuY3VycmVudCwgZSkpIHtcbiAgICAgICAgX3RoaXMuc2tpcE5leHRDYWxsYmFjayA9IHRydWU7XG5cbiAgICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uSGlkZScsIGUsIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBhbmltYXRpb25UaWNrOiAwLFxuICAgICAgdmlzaWJsZTogcHJvcHMudmlzaWJsZVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgU2lkZWJhci5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgLy8gV2UgdXNlIGBhbmltYXRpb25UaWNrYCB0byB1bmRlcnN0YW5kIHdoZW4gYW4gYW5pbWF0aW9uIHNob3VsZCBiZSBzY2hlZHVsZWRcbiAgICB2YXIgdGlja0luY3JlbWVudCA9ICEhcHJvcHMudmlzaWJsZSA9PT0gISFzdGF0ZS52aXNpYmxlID8gMCA6IDE7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuaW1hdGlvblRpY2s6IHN0YXRlLmFuaW1hdGlvblRpY2sgKyB0aWNrSW5jcmVtZW50LFxuICAgICAgdmlzaWJsZTogcHJvcHMudmlzaWJsZVxuICAgIH07XG4gIH07XG5cbiAgdmFyIF9wcm90byA9IFNpZGViYXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5hbmltYXRpb25UaWNrID4gcHJldlN0YXRlLmFuaW1hdGlvblRpY2spIHtcbiAgICAgIHRoaXMuaGFuZGxlQW5pbWF0aW9uU3RhcnQoKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuYW5pbWF0aW9uVGltZXIpO1xuICB9O1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYW5pbWF0aW9uID0gX3RoaXMkcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgICBjbGFzc05hbWUgPSBfdGhpcyRwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNvbnRlbnQgPSBfdGhpcyRwcm9wcy5jb250ZW50LFxuICAgICAgICBkaXJlY3Rpb24gPSBfdGhpcyRwcm9wcy5kaXJlY3Rpb24sXG4gICAgICAgIHRhcmdldCA9IF90aGlzJHByb3BzLnRhcmdldCxcbiAgICAgICAgdmlzaWJsZSA9IF90aGlzJHByb3BzLnZpc2libGUsXG4gICAgICAgIHdpZHRoID0gX3RoaXMkcHJvcHMud2lkdGg7XG4gICAgdmFyIGFuaW1hdGlvblRpY2sgPSB0aGlzLnN0YXRlLmFuaW1hdGlvblRpY2s7XG4gICAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBhbmltYXRpb24sIGRpcmVjdGlvbiwgd2lkdGgsIHVzZUtleU9ubHkoYW5pbWF0aW9uVGljayA+IDAsICdhbmltYXRpbmcnKSwgdXNlS2V5T25seSh2aXNpYmxlLCAndmlzaWJsZScpLCAnc2lkZWJhcicsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhTaWRlYmFyLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTaWRlYmFyLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgdGFyZ2V0UHJvcCA9IGlzUmVmT2JqZWN0KHRhcmdldCkgPyB7XG4gICAgICB0YXJnZXRSZWY6IHRhcmdldFxuICAgIH0gOiB7XG4gICAgICB0YXJnZXQ6IHRhcmdldFxuICAgIH07XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWYsIHtcbiAgICAgIGlubmVyUmVmOiB0aGlzLnJlZlxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKSksIHZpc2libGUgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRXZlbnRMaXN0ZW5lciwgX2V4dGVuZHMoe1xuICAgICAgbGlzdGVuZXI6IHRoaXMuaGFuZGxlRG9jdW1lbnRDbGljayxcbiAgICAgIHR5cGU6IFwiY2xpY2tcIlxuICAgIH0sIHRhcmdldFByb3ApKSk7XG4gIH07XG5cbiAgcmV0dXJuIFNpZGViYXI7XG59KENvbXBvbmVudCk7XG5cblNpZGViYXIuaGFuZGxlZFByb3BzID0gW1wiYW5pbWF0aW9uXCIsIFwiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJkaXJlY3Rpb25cIiwgXCJvbkhpZGRlblwiLCBcIm9uSGlkZVwiLCBcIm9uU2hvd1wiLCBcIm9uVmlzaWJsZVwiLCBcInRhcmdldFwiLCBcInZpc2libGVcIiwgXCJ3aWR0aFwiXTtcblNpZGViYXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQW5pbWF0aW9uIHN0eWxlLiAqL1xuICBhbmltYXRpb246IFByb3BUeXBlcy5vbmVPZihbJ292ZXJsYXknLCAncHVzaCcsICdzY2FsZSBkb3duJywgJ3VuY292ZXInLCAnc2xpZGUgb3V0JywgJ3NsaWRlIGFsb25nJ10pLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogRGlyZWN0aW9uIHRoZSBzaWRlYmFyIHNob3VsZCBhcHBlYXIgb24uICovXG4gIGRpcmVjdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10pLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYmVmb3JlIGEgc2lkZWJhciBiZWdpbnMgdG8gYW5pbWF0ZSBvdXQuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvbkhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBzaWRlYmFyIGhhcyBmaW5pc2hlZCBhbmltYXRpbmcgb3V0LlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25IaWRkZW46IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBhIHNpZGViYXIgaGFzIGZpbmlzaGVkIGFuaW1hdGluZyBpbi5cbiAgICpcbiAgICogQHBhcmFtIHtudWxsfVxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uU2hvdzogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgc2lkZWJhciBiZWdpbnMgYW5pbWF0aW5nIGluLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25WaXNpYmxlOiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogQSBzaWRlYmFyIGNhbiBoYW5kbGUgY2xpY2tzIG9uIHRoZSBwYXNzZWQgZWxlbWVudC4gKi9cbiAgdGFyZ2V0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtjdXN0b21Qcm9wVHlwZXMuZG9tTm9kZSwgY3VzdG9tUHJvcFR5cGVzLnJlZk9iamVjdF0pLFxuXG4gIC8qKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgc2lkZWJhciBpcyB2aXNpYmxlIG9uIHRoZSBwYWdlLiAqL1xuICB2aXNpYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2lkZWJhciB3aWR0aC4gKi9cbiAgd2lkdGg6IFByb3BUeXBlcy5vbmVPZihbJ3ZlcnkgdGhpbicsICd0aGluJywgJ3dpZGUnLCAndmVyeSB3aWRlJ10pXG59IDoge307XG5TaWRlYmFyLmRlZmF1bHRQcm9wcyA9IHtcbiAgZGlyZWN0aW9uOiAnbGVmdCcsXG4gIHRhcmdldDogZG9jdW1lbnRSZWYsXG4gIHZpc2libGU6IGZhbHNlXG59O1xuU2lkZWJhci5hbmltYXRpb25EdXJhdGlvbiA9IDUwMDtcblNpZGViYXIuYXV0b0NvbnRyb2xsZWRQcm9wcyA9IFsndmlzaWJsZSddO1xuU2lkZWJhci5QdXNoYWJsZSA9IFNpZGViYXJQdXNoYWJsZTtcblNpZGViYXIuUHVzaGVyID0gU2lkZWJhclB1c2hlcjtcbmV4cG9ydCBkZWZhdWx0IFNpZGViYXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBwdXNoYWJsZSBzdWItY29tcG9uZW50IGZvciBTaWRlYmFyLlxuICovXG5cbmZ1bmN0aW9uIFNpZGViYXJQdXNoYWJsZShwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdwdXNoYWJsZScsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoU2lkZWJhclB1c2hhYmxlLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFNpZGViYXJQdXNoYWJsZSwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cblNpZGViYXJQdXNoYWJsZS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcblNpZGViYXJQdXNoYWJsZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgU2lkZWJhclB1c2hhYmxlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgcHVzaGFibGUgc3ViLWNvbXBvbmVudCBmb3IgU2lkZWJhci5cbiAqL1xuXG5mdW5jdGlvbiBTaWRlYmFyUHVzaGVyKHByb3BzKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBkaW1tZWQgPSBwcm9wcy5kaW1tZWQsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ3B1c2hlcicsIHVzZUtleU9ubHkoZGltbWVkLCAnZGltbWVkJyksIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoU2lkZWJhclB1c2hlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTaWRlYmFyUHVzaGVyLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuU2lkZWJhclB1c2hlci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRpbW1lZFwiXTtcblNpZGViYXJQdXNoZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBkaW0gaXMgZGlzcGxheWVkLiAqL1xuICBkaW1tZWQ6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBTaWRlYmFyUHVzaGVyOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1NpZGViYXInO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX2ludm9rZSBmcm9tIFwibG9kYXNoLWVzL2ludm9rZVwiO1xuaW1wb3J0IHsgaXNSZWZPYmplY3QgfSBmcm9tICdAZmx1ZW50dWkvcmVhY3QtY29tcG9uZW50LXJlZic7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgY3JlYXRlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3VzdG9tUHJvcFR5cGVzLCBldmVudFN0YWNrLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIGlzQnJvd3NlciB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIFN0aWNreSBjb250ZW50IHN0YXlzIGZpeGVkIHRvIHRoZSBicm93c2VyIHZpZXdwb3J0IHdoaWxlIGFub3RoZXIgY29sdW1uIG9mIGNvbnRlbnQgaXMgdmlzaWJsZSBvbiB0aGUgcGFnZS5cbiAqL1xuXG52YXIgU3RpY2t5ID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFN0aWNreSwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3RpY2t5KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9Db21wb25lbnQuY2FsbC5hcHBseShfQ29tcG9uZW50LCBbdGhpc10uY29uY2F0KGFyZ3MpKSB8fCB0aGlzO1xuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgc3RpY2t5OiBmYWxzZVxuICAgIH07XG4gICAgX3RoaXMuc3RpY2t5UmVmID0gLyojX19QVVJFX18qL2NyZWF0ZVJlZigpO1xuICAgIF90aGlzLnRyaWdnZXJSZWYgPSAvKiNfX1BVUkVfXyovY3JlYXRlUmVmKCk7XG5cbiAgICBfdGhpcy5hZGRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoc2Nyb2xsQ29udGV4dCkge1xuICAgICAgdmFyIHNjcm9sbENvbnRleHROb2RlID0gaXNSZWZPYmplY3Qoc2Nyb2xsQ29udGV4dCkgPyBzY3JvbGxDb250ZXh0LmN1cnJlbnQgOiBzY3JvbGxDb250ZXh0O1xuXG4gICAgICBpZiAoc2Nyb2xsQ29udGV4dE5vZGUpIHtcbiAgICAgICAgZXZlbnRTdGFjay5zdWIoJ3Jlc2l6ZScsIF90aGlzLmhhbmRsZVVwZGF0ZSwge1xuICAgICAgICAgIHRhcmdldDogc2Nyb2xsQ29udGV4dE5vZGVcbiAgICAgICAgfSk7XG4gICAgICAgIGV2ZW50U3RhY2suc3ViKCdzY3JvbGwnLCBfdGhpcy5oYW5kbGVVcGRhdGUsIHtcbiAgICAgICAgICB0YXJnZXQ6IHNjcm9sbENvbnRleHROb2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoc2Nyb2xsQ29udGV4dCkge1xuICAgICAgdmFyIHNjcm9sbENvbnRleHROb2RlID0gaXNSZWZPYmplY3Qoc2Nyb2xsQ29udGV4dCkgPyBzY3JvbGxDb250ZXh0LmN1cnJlbnQgOiBzY3JvbGxDb250ZXh0O1xuXG4gICAgICBpZiAoc2Nyb2xsQ29udGV4dE5vZGUpIHtcbiAgICAgICAgZXZlbnRTdGFjay51bnN1YigncmVzaXplJywgX3RoaXMuaGFuZGxlVXBkYXRlLCB7XG4gICAgICAgICAgdGFyZ2V0OiBzY3JvbGxDb250ZXh0Tm9kZVxuICAgICAgICB9KTtcbiAgICAgICAgZXZlbnRTdGFjay51bnN1Yignc2Nyb2xsJywgX3RoaXMuaGFuZGxlVXBkYXRlLCB7XG4gICAgICAgICAgdGFyZ2V0OiBzY3JvbGxDb250ZXh0Tm9kZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBwdXNoaW5nID0gX3RoaXMuc3RhdGUucHVzaGluZztcbiAgICAgIF90aGlzLnRpY2tpbmcgPSBmYWxzZTtcblxuICAgICAgX3RoaXMuYXNzaWduUmVjdHMoKTtcblxuICAgICAgaWYgKHB1c2hpbmcpIHtcbiAgICAgICAgaWYgKF90aGlzLmRpZFJlYWNoU3RhcnRpbmdQb2ludCgpKSByZXR1cm4gX3RoaXMuc3RpY2tUb0NvbnRleHRUb3AoZSk7XG4gICAgICAgIGlmIChfdGhpcy5kaWRUb3VjaFNjcmVlbkJvdHRvbSgpKSByZXR1cm4gX3RoaXMuc3RpY2tUb1NjcmVlbkJvdHRvbShlKTtcbiAgICAgICAgcmV0dXJuIF90aGlzLnN0aWNrVG9Db250ZXh0Qm90dG9tKGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuaXNPdmVyc2l6ZWQoKSkge1xuICAgICAgICBpZiAoX3RoaXMuY29udGV4dFJlY3QudG9wID4gMCkgcmV0dXJuIF90aGlzLnN0aWNrVG9Db250ZXh0VG9wKGUpO1xuICAgICAgICBpZiAoX3RoaXMuY29udGV4dFJlY3QuYm90dG9tIDwgd2luZG93LmlubmVySGVpZ2h0KSByZXR1cm4gX3RoaXMuc3RpY2tUb0NvbnRleHRCb3R0b20oZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5kaWRUb3VjaFNjcmVlblRvcCgpKSB7XG4gICAgICAgIGlmIChfdGhpcy5kaWRSZWFjaENvbnRleHRCb3R0b20oKSkgcmV0dXJuIF90aGlzLnN0aWNrVG9Db250ZXh0Qm90dG9tKGUpO1xuICAgICAgICByZXR1cm4gX3RoaXMuc3RpY2tUb1NjcmVlblRvcChlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF90aGlzLnN0aWNrVG9Db250ZXh0VG9wKGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVVcGRhdGUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFfdGhpcy50aWNraW5nKSB7XG4gICAgICAgIF90aGlzLnRpY2tpbmcgPSB0cnVlO1xuICAgICAgICBfdGhpcy5mcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMudXBkYXRlKGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuYXNzaWduUmVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgY29udGV4dCA9IF90aGlzLnByb3BzLmNvbnRleHQ7XG4gICAgICB2YXIgY29udGV4dE5vZGUgPSBpc1JlZk9iamVjdChjb250ZXh0KSA/IGNvbnRleHQuY3VycmVudCA6IGNvbnRleHQgfHwgZG9jdW1lbnQuYm9keTtcbiAgICAgIF90aGlzLnRyaWdnZXJSZWN0ID0gX3RoaXMudHJpZ2dlclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgX3RoaXMuY29udGV4dFJlY3QgPSBjb250ZXh0Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIF90aGlzLnN0aWNreVJlY3QgPSBfdGhpcy5zdGlja3lSZWYuY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZGlkUmVhY2hDb250ZXh0Qm90dG9tID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9mZnNldCA9IF90aGlzLnByb3BzLm9mZnNldDtcbiAgICAgIHJldHVybiBfdGhpcy5zdGlja3lSZWN0LmhlaWdodCArIG9mZnNldCA+PSBfdGhpcy5jb250ZXh0UmVjdC5ib3R0b207XG4gICAgfTtcblxuICAgIF90aGlzLmRpZFJlYWNoU3RhcnRpbmdQb2ludCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdGlja3lSZWN0LnRvcCA8PSBfdGhpcy50cmlnZ2VyUmVjdC50b3A7XG4gICAgfTtcblxuICAgIF90aGlzLmRpZFRvdWNoU2NyZWVuVG9wID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnRyaWdnZXJSZWN0LnRvcCA8IF90aGlzLnByb3BzLm9mZnNldDtcbiAgICB9O1xuXG4gICAgX3RoaXMuZGlkVG91Y2hTY3JlZW5Cb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgYm90dG9tT2Zmc2V0ID0gX3RoaXMucHJvcHMuYm90dG9tT2Zmc2V0O1xuICAgICAgcmV0dXJuIF90aGlzLmNvbnRleHRSZWN0LmJvdHRvbSArIGJvdHRvbU9mZnNldCA+IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNPdmVyc2l6ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc3RpY2t5UmVjdC5oZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQ7XG4gICAgfTtcblxuICAgIF90aGlzLnB1c2hpbmcgPSBmdW5jdGlvbiAocHVzaGluZykge1xuICAgICAgdmFyIHBvc3NpYmxlID0gX3RoaXMucHJvcHMucHVzaGluZztcbiAgICAgIGlmIChwb3NzaWJsZSkgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwdXNoaW5nOiBwdXNoaW5nXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RpY2sgPSBmdW5jdGlvbiAoZSwgYm91bmQpIHtcbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYm91bmQ6IGJvdW5kLFxuICAgICAgICBzdGlja3k6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25TdGljaycsIGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgX3RoaXMudW5zdGljayA9IGZ1bmN0aW9uIChlLCBib3VuZCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoe1xuICAgICAgICBib3VuZDogYm91bmQsXG4gICAgICAgIHN0aWNreTogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25VbnN0aWNrJywgZSwgX3RoaXMucHJvcHMpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdGlja1RvQ29udGV4dEJvdHRvbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25Cb3R0b20nLCBlLCBfdGhpcy5wcm9wcyk7XG5cbiAgICAgIF90aGlzLnN0aWNrKGUsIHRydWUpO1xuXG4gICAgICBfdGhpcy5wdXNoaW5nKHRydWUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdGlja1RvQ29udGV4dFRvcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25Ub3AnLCBlLCBfdGhpcy5wcm9wcyk7XG5cbiAgICAgIF90aGlzLnVuc3RpY2soZSwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5wdXNoaW5nKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RpY2tUb1NjcmVlbkJvdHRvbSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICB2YXIgYm90dG9tID0gX3RoaXMucHJvcHMuYm90dG9tT2Zmc2V0O1xuXG4gICAgICBfdGhpcy5zdGljayhlLCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgYm90dG9tOiBib3R0b20sXG4gICAgICAgIHRvcDogbnVsbFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF90aGlzLnN0aWNrVG9TY3JlZW5Ub3AgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgdmFyIHRvcCA9IF90aGlzLnByb3BzLm9mZnNldDtcblxuICAgICAgX3RoaXMuc3RpY2soZSwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHRvcDogdG9wLFxuICAgICAgICBib3R0b206IG51bGxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU3RpY2t5LnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAoIWlzQnJvd3NlcigpKSByZXR1cm47XG4gICAgdmFyIGFjdGl2ZSA9IHRoaXMuc3RhdGUuYWN0aXZlO1xuXG4gICAgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy5oYW5kbGVVcGRhdGUoKTtcbiAgICAgIHRoaXMuYWRkTGlzdGVuZXJzKHRoaXMucHJvcHMuc2Nyb2xsQ29udGV4dCk7XG4gICAgfVxuICB9O1xuXG4gIFN0aWNreS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPSBmdW5jdGlvbiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMocHJvcHMsIHN0YXRlKSB7XG4gICAgaWYgKHN0YXRlLmFjdGl2ZSAhPT0gcHJvcHMuYWN0aXZlICYmICFwcm9wcy5hY3RpdmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGl2ZTogcHJvcHMuYWN0aXZlLFxuICAgICAgICBzdGlja3k6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmU6IHByb3BzLmFjdGl2ZVxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGlmIChwcmV2U3RhdGUuYWN0aXZlID09PSB0aGlzLnN0YXRlLmFjdGl2ZSkge1xuICAgICAgaWYgKHByZXZQcm9wcy5zY3JvbGxDb250ZXh0ICE9PSB0aGlzLnByb3BzLnNjcm9sbENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMocHJldlByb3BzLnNjcm9sbENvbnRleHQpO1xuICAgICAgICB0aGlzLmFkZExpc3RlbmVycyh0aGlzLnByb3BzLnNjcm9sbENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlKSB7XG4gICAgICB0aGlzLmhhbmRsZVVwZGF0ZSgpO1xuICAgICAgdGhpcy5hZGRMaXN0ZW5lcnModGhpcy5wcm9wcy5zY3JvbGxDb250ZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycyhwcmV2UHJvcHMuc2Nyb2xsQ29udGV4dCk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKCFpc0Jyb3dzZXIoKSkgcmV0dXJuO1xuICAgIHZhciBhY3RpdmUgPSB0aGlzLnN0YXRlLmFjdGl2ZTtcblxuICAgIGlmIChhY3RpdmUpIHtcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJzKHRoaXMucHJvcHMuc2Nyb2xsQ29udGV4dCk7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lSWQpO1xuICAgIH1cbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEV2ZW50c1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIDtcblxuICBfcHJvdG8uY29tcHV0ZVN0eWxlID0gZnVuY3Rpb24gY29tcHV0ZVN0eWxlKCkge1xuICAgIHZhciBzdHlsZUVsZW1lbnQgPSB0aGlzLnByb3BzLnN0eWxlRWxlbWVudDtcbiAgICB2YXIgX3RoaXMkc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBib3R0b20gPSBfdGhpcyRzdGF0ZS5ib3R0b20sXG4gICAgICAgIGJvdW5kID0gX3RoaXMkc3RhdGUuYm91bmQsXG4gICAgICAgIHN0aWNreSA9IF90aGlzJHN0YXRlLnN0aWNreSxcbiAgICAgICAgdG9wID0gX3RoaXMkc3RhdGUudG9wO1xuICAgIGlmICghc3RpY2t5KSByZXR1cm4gc3R5bGVFbGVtZW50O1xuICAgIHJldHVybiBfZXh0ZW5kcyh7XG4gICAgICBib3R0b206IGJvdW5kID8gMCA6IGJvdHRvbSxcbiAgICAgIHRvcDogYm91bmQgPyB1bmRlZmluZWQgOiB0b3AsXG4gICAgICB3aWR0aDogdGhpcy50cmlnZ2VyUmVjdC53aWR0aFxuICAgIH0sIHN0eWxlRWxlbWVudCk7XG4gIH0gLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgY29tcG9uZW50IHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGV4dFxuICA7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBSZW5kZXJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIGNsYXNzTmFtZSA9IF90aGlzJHByb3BzLmNsYXNzTmFtZTtcbiAgICB2YXIgX3RoaXMkc3RhdGUyID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgYm90dG9tID0gX3RoaXMkc3RhdGUyLmJvdHRvbSxcbiAgICAgICAgYm91bmQgPSBfdGhpcyRzdGF0ZTIuYm91bmQsXG4gICAgICAgIHN0aWNreSA9IF90aGlzJHN0YXRlMi5zdGlja3k7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhTdGlja3ksIHRoaXMucHJvcHMpO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFN0aWNreSwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIGNvbnRhaW5lckNsYXNzZXMgPSBjeChzdGlja3kgJiYgJ3VpJywgc3RpY2t5ICYmICdzdHVjay1jb250YWluZXInLCBzdGlja3kgJiYgKGJvdW5kID8gJ2JvdW5kLWNvbnRhaW5lcicgOiAnZml4ZWQtY29udGFpbmVyJyksIGNsYXNzTmFtZSk7XG4gICAgdmFyIGVsZW1lbnRDbGFzc2VzID0gY3goJ3VpJywgc3RpY2t5ICYmIChib3VuZCA/ICdib3VuZCBib3R0b20nIDogJ2ZpeGVkJyksIHN0aWNreSAmJiAhYm91bmQgJiYgKGJvdHRvbSA9PT0gbnVsbCA/ICd0b3AnIDogJ2JvdHRvbScpLCAnc3RpY2t5Jyk7XG4gICAgdmFyIHRyaWdnZXJTdHlsZXMgPSBzdGlja3kgJiYgdGhpcy5zdGlja3lSZWN0ID8ge1xuICAgICAgaGVpZ2h0OiB0aGlzLnN0aWNreVJlY3QuaGVpZ2h0XG4gICAgfSA6IHt9O1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY29udGFpbmVyQ2xhc3Nlc1xuICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICByZWY6IHRoaXMudHJpZ2dlclJlZixcbiAgICAgIHN0eWxlOiB0cmlnZ2VyU3R5bGVzXG4gICAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogZWxlbWVudENsYXNzZXMsXG4gICAgICByZWY6IHRoaXMuc3RpY2t5UmVmLFxuICAgICAgc3R5bGU6IHRoaXMuY29tcHV0ZVN0eWxlKClcbiAgICB9LCBjaGlsZHJlbikpO1xuICB9O1xuXG4gIHJldHVybiBTdGlja3k7XG59KENvbXBvbmVudCk7XG5cblN0aWNreS5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImJvdHRvbU9mZnNldFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGV4dFwiLCBcIm9mZnNldFwiLCBcIm9uQm90dG9tXCIsIFwib25TdGlja1wiLCBcIm9uVG9wXCIsIFwib25VbnN0aWNrXCIsIFwicHVzaGluZ1wiLCBcInNjcm9sbENvbnRleHRcIiwgXCJzdHlsZUVsZW1lbnRcIl07XG5leHBvcnQgeyBTdGlja3kgYXMgZGVmYXVsdCB9O1xuU3RpY2t5LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEEgU3RpY2t5IGNhbiBiZSBhY3RpdmUuICovXG4gIGFjdGl2ZTogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIE9mZnNldCBpbiBwaXhlbHMgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gd2hlbiBmaXhpbmcgZWxlbWVudCB0byB2aWV3cG9ydC4gKi9cbiAgYm90dG9tT2Zmc2V0OiBQcm9wVHlwZXMubnVtYmVyLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIENvbnRleHQgd2hpY2ggc3RpY2t5IGVsZW1lbnQgc2hvdWxkIHN0aWNrIHRvLiAqL1xuICBjb250ZXh0OiBQcm9wVHlwZXMub25lT2ZUeXBlKFtjdXN0b21Qcm9wVHlwZXMuZG9tTm9kZSwgY3VzdG9tUHJvcFR5cGVzLnJlZk9iamVjdF0pLFxuXG4gIC8qKiBPZmZzZXQgaW4gcGl4ZWxzIGZyb20gdGhlIHRvcCBvZiB0aGUgc2NyZWVuIHdoZW4gZml4aW5nIGVsZW1lbnQgdG8gdmlld3BvcnQuICovXG4gIG9mZnNldDogUHJvcFR5cGVzLm51bWJlcixcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBlbGVtZW50IGlzIGJvdW5kIHRvIGJvdHRvbSBvZiBwYXJlbnQgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25Cb3R0b206IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGVsZW1lbnQgaXMgZml4ZWQgdG8gcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uU3RpY2s6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGVsZW1lbnQgaXMgYm91bmQgdG8gdG9wIG9mIHBhcmVudCBjb250YWluZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IC0gUmVhY3QncyBvcmlnaW5hbCBTeW50aGV0aWNFdmVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMuXG4gICAqL1xuICBvblRvcDogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gZWxlbWVudCBpcyB1bmZpeGVkIGZyb20gcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcy5cbiAgICovXG4gIG9uVW5zdGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIFdoZXRoZXIgZWxlbWVudCBzaG91bGQgYmUgXCJwdXNoZWRcIiBieSB0aGUgdmlld3BvcnQsIGF0dGFjaGluZyB0byB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gd2hlbiBzY3JvbGxpbmcgdXAuICovXG4gIHB1c2hpbmc6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBDb250ZXh0IHdoaWNoIHN0aWNreSBzaG91bGQgYXR0YWNoIG9uc2Nyb2xsIGV2ZW50cy4gKi9cbiAgc2Nyb2xsQ29udGV4dDogUHJvcFR5cGVzLm9uZU9mVHlwZShbY3VzdG9tUHJvcFR5cGVzLmRvbU5vZGUsIGN1c3RvbVByb3BUeXBlcy5yZWZPYmplY3RdKSxcblxuICAvKiogQ3VzdG9tIHN0eWxlIGZvciBzdGlja3kgZWxlbWVudC4gKi9cbiAgc3R5bGVFbGVtZW50OiBQcm9wVHlwZXMub2JqZWN0XG59IDoge307XG5TdGlja3kuZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IHRydWUsXG4gIGJvdHRvbU9mZnNldDogMCxcbiAgb2Zmc2V0OiAwLFxuICBzY3JvbGxDb250ZXh0OiBpc0Jyb3dzZXIoKSA/IHdpbmRvdyA6IG51bGxcbn07IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vU3RpY2t5JztcbmV4cG9ydCB7IF9kZWZhdWx0IGFzIGRlZmF1bHQgfTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IF9nZXQgZnJvbSBcImxvZGFzaC1lcy9nZXRcIjtcbmltcG9ydCBfaW52b2tlIGZyb20gXCJsb2Rhc2gtZXMvaW52b2tlXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IE1vZGVybkF1dG9Db250cm9sbGVkQ29tcG9uZW50IGFzIENvbXBvbmVudCwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEdyaWQgZnJvbSAnLi4vLi4vY29sbGVjdGlvbnMvR3JpZC9HcmlkJztcbmltcG9ydCBHcmlkQ29sdW1uIGZyb20gJy4uLy4uL2NvbGxlY3Rpb25zL0dyaWQvR3JpZENvbHVtbic7XG5pbXBvcnQgTWVudSBmcm9tICcuLi8uLi9jb2xsZWN0aW9ucy9NZW51L01lbnUnO1xuaW1wb3J0IFRhYlBhbmUgZnJvbSAnLi9UYWJQYW5lJztcbi8qKlxuICogQSBUYWIgaXMgYSBoaWRkZW4gc2VjdGlvbiBvZiBjb250ZW50IGFjdGl2YXRlZCBieSBhIE1lbnUuXG4gKiBAc2VlIE1lbnVcbiAqIEBzZWUgU2VnbWVudFxuICovXG5cbnZhciBUYWIgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVGFiLCBfQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUYWIoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVJdGVtQ2xpY2sgPSBmdW5jdGlvbiAoZSwgX3JlZikge1xuICAgICAgdmFyIGluZGV4ID0gX3JlZi5pbmRleDtcblxuICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uVGFiQ2hhbmdlJywgZSwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgIGFjdGl2ZUluZGV4OiBpbmRleFxuICAgICAgfSkpO1xuXG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZUluZGV4OiBpbmRleFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUYWIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRJbml0aWFsQXV0b0NvbnRyb2xsZWRTdGF0ZSA9IGZ1bmN0aW9uIGdldEluaXRpYWxBdXRvQ29udHJvbGxlZFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVJbmRleDogMFxuICAgIH07XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlckl0ZW1zID0gZnVuY3Rpb24gcmVuZGVySXRlbXMoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcGFuZXMgPSBfdGhpcyRwcm9wcy5wYW5lcyxcbiAgICAgICAgcmVuZGVyQWN0aXZlT25seSA9IF90aGlzJHByb3BzLnJlbmRlckFjdGl2ZU9ubHk7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5zdGF0ZS5hY3RpdmVJbmRleDtcbiAgICBpZiAocmVuZGVyQWN0aXZlT25seSkgcmV0dXJuIF9pbnZva2UoX2dldChwYW5lcywgXCJbXCIgKyBhY3RpdmVJbmRleCArIFwiXVwiKSwgJ3JlbmRlcicsIHRoaXMucHJvcHMpO1xuICAgIHJldHVybiBfbWFwKHBhbmVzLCBmdW5jdGlvbiAoX3JlZjIsIGluZGV4KSB7XG4gICAgICB2YXIgcGFuZSA9IF9yZWYyLnBhbmU7XG4gICAgICByZXR1cm4gVGFiUGFuZS5jcmVhdGUocGFuZSwge1xuICAgICAgICBvdmVycmlkZVByb3BzOiB7XG4gICAgICAgICAgYWN0aXZlOiBpbmRleCA9PT0gYWN0aXZlSW5kZXhcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnJlbmRlck1lbnUgPSBmdW5jdGlvbiByZW5kZXJNZW51KCkge1xuICAgIHZhciBfdGhpcyRwcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBtZW51ID0gX3RoaXMkcHJvcHMyLm1lbnUsXG4gICAgICAgIHBhbmVzID0gX3RoaXMkcHJvcHMyLnBhbmVzLFxuICAgICAgICBtZW51UG9zaXRpb24gPSBfdGhpcyRwcm9wczIubWVudVBvc2l0aW9uO1xuICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuc3RhdGUuYWN0aXZlSW5kZXg7XG5cbiAgICBpZiAobWVudS50YWJ1bGFyID09PSB0cnVlICYmIG1lbnVQb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgbWVudS50YWJ1bGFyID0gJ3JpZ2h0JztcbiAgICB9XG5cbiAgICByZXR1cm4gTWVudS5jcmVhdGUobWVudSwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZSxcbiAgICAgIG92ZXJyaWRlUHJvcHM6IHtcbiAgICAgICAgaXRlbXM6IF9tYXAocGFuZXMsICdtZW51SXRlbScpLFxuICAgICAgICBvbkl0ZW1DbGljazogdGhpcy5oYW5kbGVJdGVtQ2xpY2ssXG4gICAgICAgIGFjdGl2ZUluZGV4OiBhY3RpdmVJbmRleFxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5yZW5kZXJWZXJ0aWNhbCA9IGZ1bmN0aW9uIHJlbmRlclZlcnRpY2FsKG1lbnUpIHtcbiAgICB2YXIgX3RoaXMkcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZ3JpZCA9IF90aGlzJHByb3BzMy5ncmlkLFxuICAgICAgICBtZW51UG9zaXRpb24gPSBfdGhpcyRwcm9wczMubWVudVBvc2l0aW9uO1xuXG4gICAgdmFyIHBhbmVXaWR0aCA9IGdyaWQucGFuZVdpZHRoLFxuICAgICAgICB0YWJXaWR0aCA9IGdyaWQudGFiV2lkdGgsXG4gICAgICAgIGdyaWRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKGdyaWQsIFtcInBhbmVXaWR0aFwiLCBcInRhYldpZHRoXCJdKTtcblxuICAgIHZhciBwb3NpdGlvbiA9IG1lbnVQb3NpdGlvbiB8fCBtZW51LnByb3BzLnRhYnVsYXIgPT09ICdyaWdodCcgJiYgJ3JpZ2h0JyB8fCAnbGVmdCc7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEdyaWQsIGdyaWRQcm9wcywgcG9zaXRpb24gPT09ICdsZWZ0JyAmJiBHcmlkQ29sdW1uLmNyZWF0ZSh7XG4gICAgICB3aWR0aDogdGFiV2lkdGgsXG4gICAgICBjaGlsZHJlbjogbWVudVxuICAgIH0sIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgICB9KSwgR3JpZENvbHVtbi5jcmVhdGUoe1xuICAgICAgd2lkdGg6IHBhbmVXaWR0aCxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnJlbmRlckl0ZW1zKCksXG4gICAgICBzdHJldGNoZWQ6IHRydWVcbiAgICB9LCB7XG4gICAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gICAgfSksIHBvc2l0aW9uID09PSAncmlnaHQnICYmIEdyaWRDb2x1bW4uY3JlYXRlKHtcbiAgICAgIHdpZHRoOiB0YWJXaWR0aCxcbiAgICAgIGNoaWxkcmVuOiBtZW51XG4gICAgfSwge1xuICAgICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICAgIH0pKTtcbiAgfTtcblxuICBfcHJvdG8ucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBtZW51ID0gdGhpcy5yZW5kZXJNZW51KCk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhUYWIsIHRoaXMucHJvcHMpO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFRhYiwgdGhpcy5wcm9wcyk7XG5cbiAgICBpZiAobWVudS5wcm9wcy52ZXJ0aWNhbCkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCByZXN0LCB0aGlzLnJlbmRlclZlcnRpY2FsKG1lbnUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIHJlc3QsIG1lbnUucHJvcHMuYXR0YWNoZWQgIT09ICdib3R0b20nICYmIG1lbnUsIHRoaXMucmVuZGVySXRlbXMoKSwgbWVudS5wcm9wcy5hdHRhY2hlZCA9PT0gJ2JvdHRvbScgJiYgbWVudSk7XG4gIH07XG5cbiAgcmV0dXJuIFRhYjtcbn0oQ29tcG9uZW50KTtcblxuVGFiLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZUluZGV4XCIsIFwiYXNcIiwgXCJkZWZhdWx0QWN0aXZlSW5kZXhcIiwgXCJncmlkXCIsIFwibWVudVwiLCBcIm1lbnVQb3NpdGlvblwiLCBcIm9uVGFiQ2hhbmdlXCIsIFwicGFuZXNcIiwgXCJyZW5kZXJBY3RpdmVPbmx5XCJdO1xuVGFiLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFRoZSBpbml0aWFsIGFjdGl2ZUluZGV4LiAqL1xuICBkZWZhdWx0QWN0aXZlSW5kZXg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogSW5kZXggb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiLiAqL1xuICBhY3RpdmVJbmRleDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBTaG9ydGhhbmQgcHJvcHMgZm9yIHRoZSBNZW51LlxuICAgKiB0YWJ1bGFyLCBpZiB0cnVlLCB3aWxsIGRlcml2ZSBmaW5hbCB2YWx1ZSBmcm9tIGBtZW51UG9zaXRpb25gLCBvdGhlcndpc2Ugc2V0ICdsZWZ0JyBvciAncmlnaHQnIGV4cGxpY2l0bHkuXG4gICAqL1xuICBtZW51OiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKiBBbGlnbiB2ZXJ0aWNhbCBtZW51ICovXG4gIG1lbnVQb3NpdGlvbjogUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdyaWdodCddKSxcblxuICAvKiogU2hvcnRoYW5kIHByb3BzIGZvciB0aGUgR3JpZC4gT25seSBhcHBsaWNhYmxlIHRvIHZlcnRpY2FsIG1lbnVzLiAqL1xuICBncmlkOiBQcm9wVHlwZXMub2JqZWN0LFxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gdGFiIGNoYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgLSBSZWFjdCdzIG9yaWdpbmFsIFN5bnRoZXRpY0V2ZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YSAtIEFsbCBwcm9wcyBhbmQgcHJvcG9zZWQgbmV3IGFjdGl2ZUluZGV4LlxuICAgKiBAcGFyYW0ge29iamVjdH0gZGF0YS5hY3RpdmVJbmRleCAtIFRoZSBuZXcgcHJvcG9zZWQgYWN0aXZlSW5kZXguXG4gICAqL1xuICBvblRhYkNoYW5nZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIG9iamVjdHMgZGVzY3JpYmluZyBlYWNoIE1lbnUuSXRlbSBhbmQgVGFiLlBhbmU6XG4gICAqIHsgbWVudUl0ZW06ICdIb21lJywgcmVuZGVyOiAoKSA9PiA8VGFiLlBhbmUgLz4gfVxuICAgKiBvclxuICAgKiB7IG1lbnVJdGVtOiAnSG9tZScsIHBhbmU6ICdXZWxjb21lJyB9XG4gICAqL1xuICBwYW5lczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBtZW51SXRlbTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG4gICAgcGFuZTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG4gICAgcmVuZGVyOiBQcm9wVHlwZXMuZnVuY1xuICB9KSksXG5cbiAgLyoqIEEgVGFiIGNhbiByZW5kZXIgb25seSBhY3RpdmUgcGFuZS4gKi9cbiAgcmVuZGVyQWN0aXZlT25seTogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcblRhYi5hdXRvQ29udHJvbGxlZFByb3BzID0gWydhY3RpdmVJbmRleCddO1xuVGFiLmRlZmF1bHRQcm9wcyA9IHtcbiAgZ3JpZDoge1xuICAgIHBhbmVXaWR0aDogMTIsXG4gICAgdGFiV2lkdGg6IDRcbiAgfSxcbiAgbWVudToge1xuICAgIGF0dGFjaGVkOiB0cnVlLFxuICAgIHRhYnVsYXI6IHRydWVcbiAgfSxcbiAgcmVuZGVyQWN0aXZlT25seTogdHJ1ZVxufTtcblRhYi5QYW5lID0gVGFiUGFuZTtcbmV4cG9ydCBkZWZhdWx0IFRhYjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IFNlZ21lbnQgZnJvbSAnLi4vLi4vZWxlbWVudHMvU2VnbWVudC9TZWdtZW50Jztcbi8qKlxuICogQSB0YWIgcGFuZSBob2xkcyB0aGUgY29udGVudCBvZiBhIHRhYi5cbiAqL1xuXG5mdW5jdGlvbiBUYWJQYW5lKHByb3BzKSB7XG4gIHZhciBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBsb2FkaW5nID0gcHJvcHMubG9hZGluZztcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGFjdGl2ZSwgJ2FjdGl2ZScpLCB1c2VLZXlPbmx5KGxvYWRpbmcsICdsb2FkaW5nJyksICd0YWInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFRhYlBhbmUsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoVGFiUGFuZSwgcHJvcHMpO1xuICB2YXIgY2FsY3VsYXRlZERlZmF1bHRQcm9wcyA9IHt9O1xuXG4gIGlmIChFbGVtZW50VHlwZSA9PT0gU2VnbWVudCkge1xuICAgIGNhbGN1bGF0ZWREZWZhdWx0UHJvcHMuYXR0YWNoZWQgPSAnYm90dG9tJztcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIGNhbGN1bGF0ZWREZWZhdWx0UHJvcHMsIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuVGFiUGFuZS5oYW5kbGVkUHJvcHMgPSBbXCJhY3RpdmVcIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImxvYWRpbmdcIl07XG5UYWJQYW5lLmRlZmF1bHRQcm9wcyA9IHtcbiAgYXM6IFNlZ21lbnQsXG4gIGFjdGl2ZTogdHJ1ZVxufTtcblRhYlBhbmUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogQSB0YWIgcGFuZSBjYW4gYmUgYWN0aXZlLiAqL1xuICBhY3RpdmU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBUYWIuUGFuZSBjYW4gZGlzcGxheSBhIGxvYWRpbmcgaW5kaWNhdG9yLiAqL1xuICBsb2FkaW5nOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuVGFiUGFuZS5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KFRhYlBhbmUsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBUYWJQYW5lOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1RhYic7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfaW5jbHVkZXMgZnJvbSBcImxvZGFzaC1lcy9pbmNsdWRlc1wiO1xuaW1wb3J0IF9pc05pbCBmcm9tIFwibG9kYXNoLWVzL2lzTmlsXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoLWVzL2dldFwiO1xuaW1wb3J0IF9pbnZva2UgZnJvbSBcImxvZGFzaC1lcy9pbnZva2VcIjtcblxudmFyIF9UUkFOU0lUSU9OX0NBTExCQUNLXywgX1RSQU5TSVRJT05fU1RZTEVfVFlQO1xuXG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgY2xvbmVFbGVtZW50LCBDb21wb25lbnQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBub3JtYWxpemVUcmFuc2l0aW9uRHVyYXRpb24sIFNVSSwgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgVHJhbnNpdGlvbkdyb3VwIGZyb20gJy4vVHJhbnNpdGlvbkdyb3VwJztcbmltcG9ydCB7IGNvbXB1dGVTdGF0dXNlcywgVFJBTlNJVElPTl9TVEFUVVNfRU5URVJFRCwgVFJBTlNJVElPTl9TVEFUVVNfRU5URVJJTkcsIFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRCwgVFJBTlNJVElPTl9TVEFUVVNfRVhJVElORywgVFJBTlNJVElPTl9TVEFUVVNfSU5JVElBTCwgVFJBTlNJVElPTl9TVEFUVVNfVU5NT1VOVEVEIH0gZnJvbSAnLi91dGlscy9jb21wdXRlU3RhdHVzZXMnO1xudmFyIFRSQU5TSVRJT05fQ0FMTEJBQ0tfVFlQRSA9IChfVFJBTlNJVElPTl9DQUxMQkFDS18gPSB7fSwgX1RSQU5TSVRJT05fQ0FMTEJBQ0tfW1RSQU5TSVRJT05fU1RBVFVTX0VOVEVSRURdID0gJ3Nob3cnLCBfVFJBTlNJVElPTl9DQUxMQkFDS19bVFJBTlNJVElPTl9TVEFUVVNfRVhJVEVEXSA9ICdoaWRlJywgX1RSQU5TSVRJT05fQ0FMTEJBQ0tfKTtcbnZhciBUUkFOU0lUSU9OX1NUWUxFX1RZUEUgPSAoX1RSQU5TSVRJT05fU1RZTEVfVFlQID0ge30sIF9UUkFOU0lUSU9OX1NUWUxFX1RZUFtUUkFOU0lUSU9OX1NUQVRVU19FTlRFUklOR10gPSAnc2hvdycsIF9UUkFOU0lUSU9OX1NUWUxFX1RZUFtUUkFOU0lUSU9OX1NUQVRVU19FWElUSU5HXSA9ICdoaWRlJywgX1RSQU5TSVRJT05fU1RZTEVfVFlQKTtcbi8qKlxuICogQSB0cmFuc2l0aW9uIGlzIGFuIGFuaW1hdGlvbiB1c3VhbGx5IHVzZWQgdG8gbW92ZSBjb250ZW50IGluIG9yIG91dCBvZiB2aWV3LlxuICovXG5cbnZhciBUcmFuc2l0aW9uID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0c0xvb3NlKFRyYW5zaXRpb24sIF9Db21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zaXRpb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX0NvbXBvbmVudC5jYWxsLmFwcGx5KF9Db21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBzdGF0dXM6IFRSQU5TSVRJT05fU1RBVFVTX0lOSVRJQUxcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlU3RhcnQgPSBmdW5jdGlvbiAobmV4dFN0YXR1cykge1xuICAgICAgdmFyIGR1cmF0aW9uID0gX3RoaXMucHJvcHMuZHVyYXRpb247XG4gICAgICB2YXIgZHVyYXRpb25UeXBlID0gVFJBTlNJVElPTl9DQUxMQkFDS19UWVBFW25leHRTdGF0dXNdO1xuICAgICAgdmFyIGR1cmF0aW9uVmFsdWUgPSBub3JtYWxpemVUcmFuc2l0aW9uRHVyYXRpb24oZHVyYXRpb24sIGR1cmF0aW9uVHlwZSk7XG4gICAgICBfdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICBzdGF0dXM6IG5leHRTdGF0dXNcbiAgICAgICAgfSk7XG4gICAgICB9LCBkdXJhdGlvblZhbHVlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMudXBkYXRlU3RhdHVzID0gZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgaWYgKHByZXZTdGF0ZS5zdGF0dXMgIT09IF90aGlzLnN0YXRlLnN0YXR1cykge1xuICAgICAgICAvLyBUaW1lb3V0IHNob3VsZCBiZSBjbGVhcmVkIGluIGFueSBjYXNlIGFzIHByZXZpb3VzIGNhbiBsZWFkIHNldCB0byB1bmV4cGVjdGVkIGBuZXh0U3RhdHVzYFxuICAgICAgICBjbGVhclRpbWVvdXQoX3RoaXMudGltZW91dElkKTtcblxuICAgICAgICBpZiAoX3RoaXMuc3RhdGUubmV4dFN0YXR1cykge1xuICAgICAgICAgIF90aGlzLmhhbmRsZVN0YXJ0KF90aGlzLnN0YXRlLm5leHRTdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcHJldlN0YXRlLmFuaW1hdGluZyAmJiBfdGhpcy5zdGF0ZS5hbmltYXRpbmcpIHtcbiAgICAgICAgX2ludm9rZShfdGhpcy5wcm9wcywgJ29uU3RhcnQnLCBudWxsLCBfZXh0ZW5kcyh7fSwgX3RoaXMucHJvcHMsIHtcbiAgICAgICAgICBzdGF0dXM6IF90aGlzLnN0YXRlLnN0YXR1c1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2U3RhdGUuYW5pbWF0aW5nICYmICFfdGhpcy5zdGF0ZS5hbmltYXRpbmcpIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gX3RoaXMuc3RhdGUuc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUkVEID8gJ29uU2hvdycgOiAnb25IaWRlJztcblxuICAgICAgICBfaW52b2tlKF90aGlzLnByb3BzLCAnb25Db21wbGV0ZScsIG51bGwsIF9leHRlbmRzKHt9LCBfdGhpcy5wcm9wcywge1xuICAgICAgICAgIHN0YXR1czogX3RoaXMuc3RhdGUuc3RhdHVzXG4gICAgICAgIH0pKTtcblxuICAgICAgICBfaW52b2tlKF90aGlzLnByb3BzLCBjYWxsYmFjaywgbnVsbCwgX2V4dGVuZHMoe30sIF90aGlzLnByb3BzLCB7XG4gICAgICAgICAgc3RhdHVzOiBfdGhpcy5zdGF0ZS5zdGF0dXNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5jb21wdXRlQ2xhc3NlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wcyA9IF90aGlzLnByb3BzLFxuICAgICAgICAgIGFuaW1hdGlvbiA9IF90aGlzJHByb3BzLmFuaW1hdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb25hbCA9IF90aGlzJHByb3BzLmRpcmVjdGlvbmFsLFxuICAgICAgICAgIGNoaWxkcmVuID0gX3RoaXMkcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgX3RoaXMkc3RhdGUgPSBfdGhpcy5zdGF0ZSxcbiAgICAgICAgICBhbmltYXRpbmcgPSBfdGhpcyRzdGF0ZS5hbmltYXRpbmcsXG4gICAgICAgICAgc3RhdHVzID0gX3RoaXMkc3RhdGUuc3RhdHVzO1xuXG4gICAgICB2YXIgY2hpbGRDbGFzc2VzID0gX2dldChjaGlsZHJlbiwgJ3Byb3BzLmNsYXNzTmFtZScpO1xuXG4gICAgICB2YXIgaXNEaXJlY3Rpb25hbCA9IF9pc05pbChkaXJlY3Rpb25hbCkgPyBfaW5jbHVkZXMoU1VJLkRJUkVDVElPTkFMX1RSQU5TSVRJT05TLCBhbmltYXRpb24pIDogZGlyZWN0aW9uYWw7XG5cbiAgICAgIGlmIChpc0RpcmVjdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBjeChhbmltYXRpb24sIGNoaWxkQ2xhc3NlcywgdXNlS2V5T25seShhbmltYXRpbmcsICdhbmltYXRpbmcnKSwgdXNlS2V5T25seShzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX0VOVEVSSU5HLCAnaW4nKSwgdXNlS2V5T25seShzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRJTkcsICdvdXQnKSwgdXNlS2V5T25seShzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRCwgJ2hpZGRlbicpLCB1c2VLZXlPbmx5KHN0YXR1cyAhPT0gVFJBTlNJVElPTl9TVEFUVVNfRVhJVEVELCAndmlzaWJsZScpLCAndHJhbnNpdGlvbicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3goYW5pbWF0aW9uLCBjaGlsZENsYXNzZXMsIHVzZUtleU9ubHkoYW5pbWF0aW5nLCAnYW5pbWF0aW5nIHRyYW5zaXRpb24nKSk7XG4gICAgfTtcblxuICAgIF90aGlzLmNvbXB1dGVTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyRwcm9wczIgPSBfdGhpcy5wcm9wcyxcbiAgICAgICAgICBjaGlsZHJlbiA9IF90aGlzJHByb3BzMi5jaGlsZHJlbixcbiAgICAgICAgICBkdXJhdGlvbiA9IF90aGlzJHByb3BzMi5kdXJhdGlvbjtcbiAgICAgIHZhciBzdGF0dXMgPSBfdGhpcy5zdGF0ZS5zdGF0dXM7XG5cbiAgICAgIHZhciBjaGlsZFN0eWxlID0gX2dldChjaGlsZHJlbiwgJ3Byb3BzLnN0eWxlJyk7XG5cbiAgICAgIHZhciB0eXBlID0gVFJBTlNJVElPTl9TVFlMRV9UWVBFW3N0YXR1c107XG4gICAgICB2YXIgYW5pbWF0aW9uRHVyYXRpb24gPSB0eXBlICYmIG5vcm1hbGl6ZVRyYW5zaXRpb25EdXJhdGlvbihkdXJhdGlvbiwgdHlwZSkgKyBcIm1zXCI7XG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIGNoaWxkU3R5bGUsIHtcbiAgICAgICAgYW5pbWF0aW9uRHVyYXRpb246IGFuaW1hdGlvbkR1cmF0aW9uXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBMaWZlY3ljbGVcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBUcmFuc2l0aW9uLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9IGZ1bmN0aW9uIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhwcm9wcywgc3RhdGUpIHtcbiAgICB2YXIgZGVyaXZlZFN0YXRlID0gY29tcHV0ZVN0YXR1c2VzKHtcbiAgICAgIG1vdW50T25TaG93OiBwcm9wcy5tb3VudE9uU2hvdyxcbiAgICAgIHN0YXR1czogc3RhdGUuc3RhdHVzLFxuICAgICAgdHJhbnNpdGlvbk9uTW91bnQ6IHByb3BzLnRyYW5zaXRpb25Pbk1vdW50LFxuICAgICAgdmlzaWJsZTogcHJvcHMudmlzaWJsZSxcbiAgICAgIHVubW91bnRPbkhpZGU6IHByb3BzLnVubW91bnRPbkhpZGVcbiAgICB9KTtcbiAgICByZXR1cm4gZGVyaXZlZFN0YXRlO1xuICB9O1xuXG4gIHZhciBfcHJvdG8gPSBUcmFuc2l0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLnVwZGF0ZVN0YXR1cyh7fSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKHByZXZTdGF0ZSk7XG4gIH07XG5cbiAgX3Byb3RvLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgfSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENhbGxiYWNrIGhhbmRsaW5nXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUmVuZGVyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuICAgIGlmIChzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX1VOTU9VTlRFRCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9jbG9uZUVsZW1lbnQoY2hpbGRyZW4sIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5jb21wdXRlQ2xhc3NlcygpLFxuICAgICAgc3R5bGU6IHRoaXMuY29tcHV0ZVN0eWxlKClcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gVHJhbnNpdGlvbjtcbn0oQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5JTklUSUFMID0gVFJBTlNJVElPTl9TVEFUVVNfSU5JVElBTDtcblRyYW5zaXRpb24uRU5URVJFRCA9IFRSQU5TSVRJT05fU1RBVFVTX0VOVEVSRUQ7XG5UcmFuc2l0aW9uLkVOVEVSSU5HID0gVFJBTlNJVElPTl9TVEFUVVNfRU5URVJJTkc7XG5UcmFuc2l0aW9uLkVYSVRFRCA9IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRDtcblRyYW5zaXRpb24uRVhJVElORyA9IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRJTkc7XG5UcmFuc2l0aW9uLlVOTU9VTlRFRCA9IFRSQU5TSVRJT05fU1RBVFVTX1VOTU9VTlRFRDtcblRyYW5zaXRpb24uR3JvdXAgPSBUcmFuc2l0aW9uR3JvdXA7XG5UcmFuc2l0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFuaW1hdGlvblwiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0aW9uYWxcIiwgXCJkdXJhdGlvblwiLCBcIm1vdW50T25TaG93XCIsIFwib25Db21wbGV0ZVwiLCBcIm9uSGlkZVwiLCBcIm9uU2hvd1wiLCBcIm9uU3RhcnRcIiwgXCJyZWFjdEtleVwiLCBcInRyYW5zaXRpb25Pbk1vdW50XCIsIFwidW5tb3VudE9uSGlkZVwiLCBcInZpc2libGVcIl07XG5leHBvcnQgeyBUcmFuc2l0aW9uIGFzIGRlZmF1bHQgfTtcblRyYW5zaXRpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogTmFtZWQgYW5pbWF0aW9uIGV2ZW50IHRvIHVzZWQuIE11c3QgYmUgZGVmaW5lZCBpbiBDU1MuICovXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFNVSS5UUkFOU0lUSU9OUyksIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLmVsZW1lbnQuaXNSZXF1aXJlZCxcblxuICAvKiogV2hldGhlciBpdCBpcyBkaXJlY3Rpb25hbCBhbmltYXRpb24gZXZlbnQgb3Igbm90LiBVc2UgaXQgb25seSBmb3IgY3VzdG9tIHRyYW5zaXRpb25zLiAqL1xuICBkaXJlY3Rpb25hbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIER1cmF0aW9uIG9mIHRoZSBDU1MgdHJhbnNpdGlvbiBhbmltYXRpb24gaW4gbWlsbGlzZWNvbmRzLiAqL1xuICBkdXJhdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm51bWJlciwgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBoaWRlOiBQcm9wVHlwZXMubnVtYmVyLFxuICAgIHNob3c6IFByb3BUeXBlcy5udW1iZXJcbiAgfSksIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBhbmltYXRpb24uICovXG4gIHZpc2libGU6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBXYWl0IHVudGlsIHRoZSBmaXJzdCBcImVudGVyXCIgdHJhbnNpdGlvbiB0byBtb3VudCB0aGUgY29tcG9uZW50IChhZGQgaXQgdG8gdGhlIERPTSkuICovXG4gIG1vdW50T25TaG93OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgb24gZWFjaCB0cmFuc2l0aW9uIHRoYXQgY2hhbmdlcyB2aXNpYmlsaXR5IHRvIHNob3duLlxuICAgKlxuICAgKiBAcGFyYW0ge251bGx9XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzIHdpdGggc3RhdHVzLlxuICAgKi9cbiAgb25Db21wbGV0ZTogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIG9uIGVhY2ggdHJhbnNpdGlvbiB0aGF0IGNoYW5nZXMgdmlzaWJpbGl0eSB0byBoaWRkZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMgd2l0aCBzdGF0dXMuXG4gICAqL1xuICBvbkhpZGU6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBvbiBlYWNoIHRyYW5zaXRpb24gdGhhdCBjaGFuZ2VzIHZpc2liaWxpdHkgdG8gc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMgd2l0aCBzdGF0dXMuXG4gICAqL1xuICBvblNob3c6IFByb3BUeXBlcy5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBvbiBhbmltYXRpb24gc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVsbH1cbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBBbGwgcHJvcHMgd2l0aCBzdGF0dXMuXG4gICAqL1xuICBvblN0YXJ0OiBQcm9wVHlwZXMuZnVuYyxcblxuICAvKiogUmVhY3QncyBrZXkgb2YgdGhlIGVsZW1lbnQuICovXG4gIHJlYWN0S2V5OiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBSdW4gdGhlIGVudGVyIGFuaW1hdGlvbiB3aGVuIHRoZSBjb21wb25lbnQgbW91bnRzLCBpZiBpdCBpcyBpbml0aWFsbHkgc2hvd24uICovXG4gIHRyYW5zaXRpb25Pbk1vdW50OiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogVW5tb3VudCB0aGUgY29tcG9uZW50IChyZW1vdmUgaXQgZnJvbSB0aGUgRE9NKSB3aGVuIGl0IGlzIG5vdCBzaG93bi4gKi9cbiAgdW5tb3VudE9uSGlkZTogUHJvcFR5cGVzLmJvb2xcbn0gOiB7fTtcblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBhbmltYXRpb246ICdmYWRlJyxcbiAgZHVyYXRpb246IDUwMCxcbiAgdmlzaWJsZTogdHJ1ZSxcbiAgbW91bnRPblNob3c6IHRydWUsXG4gIHRyYW5zaXRpb25Pbk1vdW50OiBmYWxzZSxcbiAgdW5tb3VudE9uSGlkZTogZmFsc2Vcbn07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX2luaGVyaXRzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2VcIjtcbmltcG9ydCBfdmFsdWVzIGZyb20gXCJsb2Rhc2gtZXMvdmFsdWVzXCI7XG5pbXBvcnQgX2dldCBmcm9tIFwibG9kYXNoLWVzL2dldFwiO1xuaW1wb3J0IF9oYXMgZnJvbSBcImxvZGFzaC1lcy9oYXNcIjtcbmltcG9ydCBfZm9yRWFjaCBmcm9tIFwibG9kYXNoLWVzL2ZvckVhY2hcIjtcbmltcG9ydCBfbWFwVmFsdWVzIGZyb20gXCJsb2Rhc2gtZXMvbWFwVmFsdWVzXCI7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IGdldENoaWxkTWFwcGluZywgbWVyZ2VDaGlsZE1hcHBpbmdzIH0gZnJvbSAnLi91dGlscy9jaGlsZE1hcHBpbmcnO1xuaW1wb3J0IHdyYXBDaGlsZCBmcm9tICcuL3V0aWxzL3dyYXBDaGlsZCc7XG5cbi8qKlxuICogQSBUcmFuc2l0aW9uLkdyb3VwIGFuaW1hdGVzIGNoaWxkcmVuIGFzIHRoZXkgbW91bnQgYW5kIHVubW91bnQuXG4gKi9cbnZhciBUcmFuc2l0aW9uR3JvdXAgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVHJhbnNpdGlvbkdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUcmFuc2l0aW9uR3JvdXAoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIF90aGlzID0gX1JlYWN0JENvbXBvbmVudC5jYWxsLmFwcGx5KF9SZWFjdCRDb21wb25lbnQsIFt0aGlzXS5jb25jYXQoYXJncykpIHx8IHRoaXM7XG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICAvLyBLZWVwaW5nIGEgY2FsbGJhY2sgdW5kZXIgdGhlIHN0YXRlIGlzIGEgaGFjayB0byBtYWtlIGl0IGFjY2Vzc2libGUgdW5kZXIgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKClcbiAgICAgIGhhbmRsZU9uSGlkZTogZnVuY3Rpb24gaGFuZGxlT25IaWRlKG5vdGhpbmcsIGNoaWxkUHJvcHMpIHtcbiAgICAgICAgdmFyIHJlYWN0S2V5ID0gY2hpbGRQcm9wcy5yZWFjdEtleTtcblxuICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBfZXh0ZW5kcyh7fSwgc3RhdGUuY2hpbGRyZW4pO1xuXG4gICAgICAgICAgZGVsZXRlIGNoaWxkcmVuW3JlYWN0S2V5XTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBUcmFuc2l0aW9uR3JvdXAuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzID0gZnVuY3Rpb24gZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKHByb3BzLCBzdGF0ZSkge1xuICAgIHZhciBhbmltYXRpb24gPSBwcm9wcy5hbmltYXRpb24sXG4gICAgICAgIGR1cmF0aW9uID0gcHJvcHMuZHVyYXRpb24sXG4gICAgICAgIGRpcmVjdGlvbmFsID0gcHJvcHMuZGlyZWN0aW9uYWw7XG4gICAgdmFyIHByZXZNYXBwaW5nID0gc3RhdGUuY2hpbGRyZW47IC8vIEEgc2hvcnQgY2lyY3VpdCBmb3IgYW4gaW5pdGlhbCByZW5kZXIgYXMgdGhlcmUgd2lsbCBiZSBubyBgcHJldk1hcHBpbmdgXG5cbiAgICBpZiAodHlwZW9mIHByZXZNYXBwaW5nID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY2hpbGRyZW46IF9tYXBWYWx1ZXMoZ2V0Q2hpbGRNYXBwaW5nKHByb3BzLmNoaWxkcmVuKSwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBDaGlsZChjaGlsZCwgc3RhdGUuaGFuZGxlT25IaWRlLCB7XG4gICAgICAgICAgICBhbmltYXRpb246IGFuaW1hdGlvbixcbiAgICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICAgIGRpcmVjdGlvbmFsOiBkaXJlY3Rpb25hbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbmV4dE1hcHBpbmcgPSBnZXRDaGlsZE1hcHBpbmcocHJvcHMuY2hpbGRyZW4pO1xuICAgIHZhciBjaGlsZHJlbiA9IG1lcmdlQ2hpbGRNYXBwaW5ncyhwcmV2TWFwcGluZywgbmV4dE1hcHBpbmcpO1xuXG4gICAgX2ZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCwga2V5KSB7XG4gICAgICB2YXIgaGFzUHJldiA9IF9oYXMocHJldk1hcHBpbmcsIGtleSk7XG5cbiAgICAgIHZhciBoYXNOZXh0ID0gX2hhcyhuZXh0TWFwcGluZywga2V5KTtcblxuICAgICAgdmFyIHByZXZDaGlsZCA9IHByZXZNYXBwaW5nW2tleV07XG4gICAgICB2YXIgaXNMZWF2aW5nID0gIV9nZXQocHJldkNoaWxkLCAncHJvcHMudmlzaWJsZScpOyAvLyBIZWFkcyB1cCFcbiAgICAgIC8vIEFuIGl0ZW0gaXMgbmV3IChlbnRlcmluZyksIGl0IHdpbGwgYmUgcGlja2VkIGZyb20gYG5leHRDaGlsZHJlbmAsIHNvIGl0IHNob3VsZCBiZSB3cmFwcGVkXG5cbiAgICAgIGlmIChoYXNOZXh0ICYmICghaGFzUHJldiB8fCBpc0xlYXZpbmcpKSB7XG4gICAgICAgIGNoaWxkcmVuW2tleV0gPSB3cmFwQ2hpbGQoY2hpbGQsIHN0YXRlLmhhbmRsZU9uSGlkZSwge1xuICAgICAgICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgICBkaXJlY3Rpb25hbDogZGlyZWN0aW9uYWwsXG4gICAgICAgICAgdHJhbnNpdGlvbk9uTW91bnQ6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gSGVhZHMgdXAhXG4gICAgICAvLyBBbiBpdGVtIGlzIG9sZCAoZXhpdGluZyksIGl0IHdpbGwgYmUgcGlja2VkIGZyb20gYHByZXZDaGlsZHJlbmAsIHNvIGl0IGhhcyBiZWVuIGFscmVhZHlcbiAgICAgIC8vIHdyYXBwZWQsIHNvIHNob3VsZCBiZSBvbmx5IHVwZGF0ZWRcblxuXG4gICAgICBpZiAoIWhhc05leHQgJiYgaGFzUHJldiAmJiAhaXNMZWF2aW5nKSB7XG4gICAgICAgIGNoaWxkcmVuW2tleV0gPSAvKiNfX1BVUkVfXyovUmVhY3QuY2xvbmVFbGVtZW50KHByZXZDaGlsZCwge1xuICAgICAgICAgIHZpc2libGU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIEhlYWRzIHVwIVxuICAgICAgLy8gQW4gaXRlbSBpdGVtIGhhc24ndCBjaGFuZ2VkIHRyYW5zaXRpb24gc3RhdGVzLCBidXQgaXQgd2lsbCBiZSBwaWNrZWQgZnJvbSBgbmV4dENoaWxkcmVuYCxcbiAgICAgIC8vIHNvIHdlIHNob3VsZCB3cmFwIGl0IGFnYWluXG5cblxuICAgICAgdmFyIF9wcmV2Q2hpbGQkcHJvcHMgPSBwcmV2Q2hpbGQucHJvcHMsXG4gICAgICAgICAgdmlzaWJsZSA9IF9wcmV2Q2hpbGQkcHJvcHMudmlzaWJsZSxcbiAgICAgICAgICB0cmFuc2l0aW9uT25Nb3VudCA9IF9wcmV2Q2hpbGQkcHJvcHMudHJhbnNpdGlvbk9uTW91bnQ7XG4gICAgICBjaGlsZHJlbltrZXldID0gd3JhcENoaWxkKGNoaWxkLCBzdGF0ZS5oYW5kbGVPbkhpZGUsIHtcbiAgICAgICAgYW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgICAgIGR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICAgICAgZGlyZWN0aW9uYWw6IGRpcmVjdGlvbmFsLFxuICAgICAgICB0cmFuc2l0aW9uT25Nb3VudDogdHJhbnNpdGlvbk9uTW91bnQsXG4gICAgICAgIHZpc2libGU6IHZpc2libGVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlblxuICAgIH07XG4gIH07XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zaXRpb25Hcm91cC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnN0YXRlLmNoaWxkcmVuO1xuICAgIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFRyYW5zaXRpb25Hcm91cCwgdGhpcy5wcm9wcyk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhUcmFuc2l0aW9uR3JvdXAsIHRoaXMucHJvcHMpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgcmVzdCwgX3ZhbHVlcyhjaGlsZHJlbikpO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2l0aW9uR3JvdXA7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cblRyYW5zaXRpb25Hcm91cC5oYW5kbGVkUHJvcHMgPSBbXCJhbmltYXRpb25cIiwgXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiZGlyZWN0aW9uYWxcIiwgXCJkdXJhdGlvblwiXTtcbmV4cG9ydCB7IFRyYW5zaXRpb25Hcm91cCBhcyBkZWZhdWx0IH07XG5UcmFuc2l0aW9uR3JvdXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogTmFtZWQgYW5pbWF0aW9uIGV2ZW50IHRvIHVzZWQuIE11c3QgYmUgZGVmaW5lZCBpbiBDU1MuICovXG4gIGFuaW1hdGlvbjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFNVSS5UUkFOU0lUSU9OUyksIFByb3BUeXBlcy5zdHJpbmddKSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIFdoZXRoZXIgaXQgaXMgZGlyZWN0aW9uYWwgYW5pbWF0aW9uIGV2ZW50IG9yIG5vdC4gVXNlIGl0IG9ubHkgZm9yIGN1c3RvbSB0cmFuc2l0aW9ucy4gKi9cbiAgZGlyZWN0aW9uYWw6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBEdXJhdGlvbiBvZiB0aGUgQ1NTIHRyYW5zaXRpb24gYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcy4gKi9cbiAgZHVyYXRpb246IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5zaGFwZSh7XG4gICAgaGlkZTogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICAgIHNob3c6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9KSwgUHJvcFR5cGVzLnN0cmluZ10pXG59IDoge307XG5UcmFuc2l0aW9uR3JvdXAuZGVmYXVsdFByb3BzID0ge1xuICBhczogUmVhY3QuRnJhZ21lbnQsXG4gIGFuaW1hdGlvbjogJ2ZhZGUnLFxuICBkdXJhdGlvbjogNTAwXG59OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1RyYW5zaXRpb24nO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfaGFzIGZyb20gXCJsb2Rhc2gtZXMvaGFzXCI7XG5pbXBvcnQgX2tleXMgZnJvbSBcImxvZGFzaC1lcy9rZXlzXCI7XG5pbXBvcnQgX2ZvckVhY2ggZnJvbSBcImxvZGFzaC1lcy9mb3JFYWNoXCI7XG5pbXBvcnQgX2ZpbHRlciBmcm9tIFwibG9kYXNoLWVzL2ZpbHRlclwiO1xuaW1wb3J0IF9rZXlCeSBmcm9tIFwibG9kYXNoLWVzL2tleUJ5XCI7XG5pbXBvcnQgeyBDaGlsZHJlbiwgaXNWYWxpZEVsZW1lbnQgfSBmcm9tICdyZWFjdCc7XG4vKipcbiAqIEdpdmVuIGB0aGlzLnByb3BzLmNoaWxkcmVuYCwgcmV0dXJuIGFuIG9iamVjdCBtYXBwaW5nIGtleSB0byBjaGlsZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2hpbGRyZW4gRWxlbWVudCdzIGNoaWxkcmVuXG4gKiBAcmV0dXJuIHtvYmplY3R9IE1hcHBpbmcgb2Yga2V5IHRvIGNoaWxkXG4gKi9cblxuZXhwb3J0IHZhciBnZXRDaGlsZE1hcHBpbmcgPSBmdW5jdGlvbiBnZXRDaGlsZE1hcHBpbmcoY2hpbGRyZW4pIHtcbiAgcmV0dXJuIF9rZXlCeShfZmlsdGVyKENoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLCBpc1ZhbGlkRWxlbWVudCksICdrZXknKTtcbn07XG5cbnZhciBnZXRQZW5kaW5nS2V5cyA9IGZ1bmN0aW9uIGdldFBlbmRpbmdLZXlzKHByZXYsIG5leHQpIHtcbiAgdmFyIG5leHRLZXlzUGVuZGluZyA9IHt9O1xuICB2YXIgcGVuZGluZ0tleXMgPSBbXTtcblxuICBfZm9yRWFjaChfa2V5cyhwcmV2KSwgZnVuY3Rpb24gKHByZXZLZXkpIHtcbiAgICBpZiAoIV9oYXMobmV4dCwgcHJldktleSkpIHtcbiAgICAgIHBlbmRpbmdLZXlzLnB1c2gocHJldktleSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHBlbmRpbmdLZXlzLmxlbmd0aCkge1xuICAgICAgbmV4dEtleXNQZW5kaW5nW3ByZXZLZXldID0gcGVuZGluZ0tleXM7XG4gICAgICBwZW5kaW5nS2V5cyA9IFtdO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIFtuZXh0S2V5c1BlbmRpbmcsIHBlbmRpbmdLZXlzXTtcbn07XG5cbnZhciBnZXRWYWx1ZSA9IGZ1bmN0aW9uIGdldFZhbHVlKGtleSwgcHJldiwgbmV4dCkge1xuICByZXR1cm4gX2hhcyhuZXh0LCBrZXkpID8gbmV4dFtrZXldIDogcHJldltrZXldO1xufTtcbi8qKlxuICogV2hlbiB5b3UncmUgYWRkaW5nIG9yIHJlbW92aW5nIGNoaWxkcmVuIHNvbWUgbWF5IGJlIGFkZGVkIG9yIHJlbW92ZWQgaW4gdGhlIHNhbWUgcmVuZGVyIHBhc3MuIFdlIHdhbnQgdG8gc2hvdyAqYm90aCpcbiAqIHNpbmNlIHdlIHdhbnQgdG8gc2ltdWx0YW5lb3VzbHkgYW5pbWF0ZSBlbGVtZW50cyBpbiBhbmQgb3V0LiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcHJldmlvdXMgc2V0IG9mIGtleXMgYW5kIGEgbmV3IHNldFxuICogb2Yga2V5cyBhbmQgbWVyZ2VzIHRoZW0gd2l0aCBpdHMgYmVzdCBndWVzcyBvZiB0aGUgY29ycmVjdCBvcmRlcmluZy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcHJldiBQcmV2IGNoaWxkcmVuIGFzIHJldHVybmVkIGZyb20gYGdldENoaWxkTWFwcGluZygpYFxuICogQHBhcmFtIHtvYmplY3R9IG5leHQgTmV4dCBjaGlsZHJlbiBhcyByZXR1cm5lZCBmcm9tIGBnZXRDaGlsZE1hcHBpbmcoKWBcbiAqIEByZXR1cm4ge29iamVjdH0gQSBrZXkgc2V0IHRoYXQgY29udGFpbnMgYWxsIGtleXMgaW4gYHByZXZgIGFuZCBhbGwga2V5cyBpbiBgbmV4dGAgaW4gYSByZWFzb25hYmxlIG9yZGVyXG4gKi9cblxuXG5leHBvcnQgdmFyIG1lcmdlQ2hpbGRNYXBwaW5ncyA9IGZ1bmN0aW9uIG1lcmdlQ2hpbGRNYXBwaW5ncyhwcmV2LCBuZXh0KSB7XG4gIGlmIChwcmV2ID09PSB2b2lkIDApIHtcbiAgICBwcmV2ID0ge307XG4gIH1cblxuICBpZiAobmV4dCA9PT0gdm9pZCAwKSB7XG4gICAgbmV4dCA9IHt9O1xuICB9XG5cbiAgdmFyIGNoaWxkTWFwcGluZyA9IHt9O1xuXG4gIHZhciBfZ2V0UGVuZGluZ0tleXMgPSBnZXRQZW5kaW5nS2V5cyhwcmV2LCBuZXh0KSxcbiAgICAgIG5leHRLZXlzUGVuZGluZyA9IF9nZXRQZW5kaW5nS2V5c1swXSxcbiAgICAgIHBlbmRpbmdLZXlzID0gX2dldFBlbmRpbmdLZXlzWzFdO1xuXG4gIF9mb3JFYWNoKF9rZXlzKG5leHQpLCBmdW5jdGlvbiAobmV4dEtleSkge1xuICAgIGlmIChfaGFzKG5leHRLZXlzUGVuZGluZywgbmV4dEtleSkpIHtcbiAgICAgIF9mb3JFYWNoKG5leHRLZXlzUGVuZGluZ1tuZXh0S2V5XSwgZnVuY3Rpb24gKHBlbmRpbmdLZXkpIHtcbiAgICAgICAgY2hpbGRNYXBwaW5nW3BlbmRpbmdLZXldID0gZ2V0VmFsdWUocGVuZGluZ0tleSwgcHJldiwgbmV4dCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjaGlsZE1hcHBpbmdbbmV4dEtleV0gPSBnZXRWYWx1ZShuZXh0S2V5LCBwcmV2LCBuZXh0KTtcbiAgfSk7XG5cbiAgX2ZvckVhY2gocGVuZGluZ0tleXMsIGZ1bmN0aW9uIChwZW5kaW5nS2V5KSB7XG4gICAgY2hpbGRNYXBwaW5nW3BlbmRpbmdLZXldID0gZ2V0VmFsdWUocGVuZGluZ0tleSwgcHJldiwgbmV4dCk7XG4gIH0pO1xuXG4gIHJldHVybiBjaGlsZE1hcHBpbmc7XG59OyIsImV4cG9ydCB2YXIgVFJBTlNJVElPTl9TVEFUVVNfSU5JVElBTCA9ICdJTklUSUFMJztcbmV4cG9ydCB2YXIgVFJBTlNJVElPTl9TVEFUVVNfRU5URVJFRCA9ICdFTlRFUkVEJztcbmV4cG9ydCB2YXIgVFJBTlNJVElPTl9TVEFUVVNfRU5URVJJTkcgPSAnRU5URVJJTkcnO1xuZXhwb3J0IHZhciBUUkFOU0lUSU9OX1NUQVRVU19FWElURUQgPSAnRVhJVEVEJztcbmV4cG9ydCB2YXIgVFJBTlNJVElPTl9TVEFUVVNfRVhJVElORyA9ICdFWElUSU5HJztcbmV4cG9ydCB2YXIgVFJBTlNJVElPTl9TVEFUVVNfVU5NT1VOVEVEID0gJ1VOTU9VTlRFRCc7XG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zdGF0dXNdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1vdW50T25TaG93XVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy50cmFuc2l0aW9uT25Nb3VudF1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudmlzaWJsZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudW5tb3VudE9uSGlkZV1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0YXR1c2VzKG9wdGlvbnMpIHtcbiAgdmFyIG1vdW50T25TaG93ID0gb3B0aW9ucy5tb3VudE9uU2hvdyxcbiAgICAgIHN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzLFxuICAgICAgdHJhbnNpdGlvbk9uTW91bnQgPSBvcHRpb25zLnRyYW5zaXRpb25Pbk1vdW50LFxuICAgICAgdmlzaWJsZSA9IG9wdGlvbnMudmlzaWJsZSxcbiAgICAgIHVubW91bnRPbkhpZGUgPSBvcHRpb25zLnVubW91bnRPbkhpZGU7XG5cbiAgaWYgKHZpc2libGUpIHtcbiAgICBpZiAoc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19JTklUSUFMKSB7XG4gICAgICBpZiAodHJhbnNpdGlvbk9uTW91bnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbmltYXRpbmc6IHRydWUsXG4gICAgICAgICAgc3RhdHVzOiBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUklORyxcbiAgICAgICAgICBuZXh0U3RhdHVzOiBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUkVEXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIHN0YXR1czogVFJBTlNJVElPTl9TVEFUVVNfRU5URVJFRCxcbiAgICAgICAgbmV4dFN0YXR1czogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX1VOTU9VTlRFRCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW5nOiB0cnVlLFxuICAgICAgICBzdGF0dXM6IFRSQU5TSVRJT05fU1RBVFVTX0VOVEVSSU5HLFxuICAgICAgICBuZXh0U3RhdHVzOiBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUkVEXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRCB8fCBzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRJTkcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFuaW1hdGluZzogdHJ1ZSxcbiAgICAgICAgc3RhdHVzOiBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUklORyxcbiAgICAgICAgbmV4dFN0YXR1czogVFJBTlNJVElPTl9TVEFUVVNfRU5URVJFRFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUklORykge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuXG5cbiAgICBpZiAoc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUkVEKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbmltYXRpbmc6IGZhbHNlLFxuICAgICAgICBzdGF0dXM6IFRSQU5TSVRJT05fU1RBVFVTX0VOVEVSRUQsXG4gICAgICAgIG5leHRTdGF0dXM6IHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19JTklUSUFMKSB7XG4gICAgaWYgKG1vdW50T25TaG93IHx8IHVubW91bnRPbkhpZGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIHN0YXR1czogVFJBTlNJVElPTl9TVEFUVVNfVU5NT1VOVEVELFxuICAgICAgICBuZXh0U3RhdHVzOiB1bmRlZmluZWRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFuaW1hdGluZzogZmFsc2UsXG4gICAgICBzdGF0dXM6IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRCxcbiAgICAgIG5leHRTdGF0dXM6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICBpZiAoc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19FTlRFUkVEIHx8IHN0YXR1cyA9PT0gVFJBTlNJVElPTl9TVEFUVVNfRU5URVJJTkcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYW5pbWF0aW5nOiB0cnVlLFxuICAgICAgc3RhdHVzOiBUUkFOU0lUSU9OX1NUQVRVU19FWElUSU5HLFxuICAgICAgbmV4dFN0YXR1czogdW5tb3VudE9uSGlkZSA/IFRSQU5TSVRJT05fU1RBVFVTX1VOTU9VTlRFRCA6IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRFxuICAgIH07XG4gIH1cblxuICBpZiAoc3RhdHVzID09PSBUUkFOU0lUSU9OX1NUQVRVU19FWElUSU5HKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgaWYgKHN0YXR1cyA9PT0gVFJBTlNJVElPTl9TVEFUVVNfRVhJVEVEKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuaW1hdGluZzogZmFsc2UsXG4gICAgICBzdGF0dXM6IFRSQU5TSVRJT05fU1RBVFVTX0VYSVRFRCxcbiAgICAgIG5leHRTdGF0dXM6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuXG4gIGlmIChzdGF0dXMgPT09IFRSQU5TSVRJT05fU1RBVFVTX1VOTU9VTlRFRCkge1xuICAgIHJldHVybiB7XG4gICAgICBhbmltYXRpbmc6IGZhbHNlLFxuICAgICAgc3RhdHVzOiBUUkFOU0lUSU9OX1NUQVRVU19VTk1PVU5URUQsXG4gICAgICBuZXh0U3RhdHVzOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cblxuICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2l0aW9uOmNvbXB1dGVTdGF0dXNlcygpOiBhbiB1bmV4cGVjdGVkIHN0YXR1cyB0cmFuc2l0aW9uOiB7IHZpc2libGU6IFwiICsgdmlzaWJsZSArIFwiLCBzdGF0dXM6IFwiICsgc3RhdHVzICsgXCIgfVwiKTtcbn0iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFRyYW5zaXRpb24gZnJvbSAnLi4vVHJhbnNpdGlvbic7XG4vKipcbiAqIFdyYXBzIGEgUmVhY3QgZWxlbWVudCB3aXRoIGEgVHJhbnNpdGlvbiBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtSZWFjdC5SZWFjdEVsZW1lbnR9IGNoaWxkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkhpZGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5hbmltYXRpb25dXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHVyYXRpb25dXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRpcmVjdGlvbmFsXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy50cmFuc2l0aW9uT25Nb3VudD1mYWxzZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudmlzaWJsZT10cnVlXVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdyYXBDaGlsZChjaGlsZCwgb25IaWRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIga2V5ID0gY2hpbGQua2V5O1xuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgYW5pbWF0aW9uID0gX29wdGlvbnMuYW5pbWF0aW9uLFxuICAgICAgZGlyZWN0aW9uYWwgPSBfb3B0aW9ucy5kaXJlY3Rpb25hbCxcbiAgICAgIGR1cmF0aW9uID0gX29wdGlvbnMuZHVyYXRpb24sXG4gICAgICBfb3B0aW9ucyR0cmFuc2l0aW9uT24gPSBfb3B0aW9ucy50cmFuc2l0aW9uT25Nb3VudCxcbiAgICAgIHRyYW5zaXRpb25Pbk1vdW50ID0gX29wdGlvbnMkdHJhbnNpdGlvbk9uID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJHRyYW5zaXRpb25PbixcbiAgICAgIF9vcHRpb25zJHZpc2libGUgPSBfb3B0aW9ucy52aXNpYmxlLFxuICAgICAgdmlzaWJsZSA9IF9vcHRpb25zJHZpc2libGUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyR2aXNpYmxlO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVHJhbnNpdGlvbiwge1xuICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgIGRpcmVjdGlvbmFsOiBkaXJlY3Rpb25hbCxcbiAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAga2V5OiBrZXksXG4gICAgb25IaWRlOiBvbkhpZGUsXG4gICAgcmVhY3RLZXk6IGtleSxcbiAgICB0cmFuc2l0aW9uT25Nb3VudDogdHJhbnNpdGlvbk9uTW91bnQsXG4gICAgdmlzaWJsZTogdmlzaWJsZVxuICB9LCBjaGlsZCk7XG59XG53cmFwQ2hpbGQuaGFuZGxlZFByb3BzID0gW107IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQW4gYWQgZGlzcGxheXMgdGhpcmQtcGFydHkgcHJvbW90aW9uYWwgY29udGVudC5cbiAqL1xuXG5mdW5jdGlvbiBBZHZlcnRpc2VtZW50KHByb3BzKSB7XG4gIHZhciBjZW50ZXJlZCA9IHByb3BzLmNlbnRlcmVkLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgdGVzdCA9IHByb3BzLnRlc3QsXG4gICAgICB1bml0ID0gcHJvcHMudW5pdDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCB1bml0LCB1c2VLZXlPbmx5KGNlbnRlcmVkLCAnY2VudGVyZWQnKSwgdXNlS2V5T25seSh0ZXN0LCAndGVzdCcpLCAnYWQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEFkdmVydGlzZW1lbnQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQWR2ZXJ0aXNlbWVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgIFwiZGF0YS10ZXh0XCI6IHRlc3RcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuQWR2ZXJ0aXNlbWVudC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNlbnRlcmVkXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwidGVzdFwiLCBcInVuaXRcIl07XG5BZHZlcnRpc2VtZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIENlbnRlciB0aGUgYWR2ZXJ0aXNlbWVudC4gKi9cbiAgY2VudGVyZWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogVGV4dCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIGFkdmVydGlzZW1lbnQuICovXG4gIHRlc3Q6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMubnVtYmVyLCBQcm9wVHlwZXMuc3RyaW5nXSksXG5cbiAgLyoqIFZhcmllcyB0aGUgc2l6ZSBvZiB0aGUgYWR2ZXJ0aXNlbWVudC4gKi9cbiAgdW5pdDogUHJvcFR5cGVzLm9uZU9mKFsnbWVkaXVtIHJlY3RhbmdsZScsICdsYXJnZSByZWN0YW5nbGUnLCAndmVydGljYWwgcmVjdGFuZ2xlJywgJ3NtYWxsIHJlY3RhbmdsZScsICdtb2JpbGUgYmFubmVyJywgJ2Jhbm5lcicsICd2ZXJ0aWNhbCBiYW5uZXInLCAndG9wIGJhbm5lcicsICdoYWxmIGJhbm5lcicsICdidXR0b24nLCAnc3F1YXJlIGJ1dHRvbicsICdzbWFsbCBidXR0b24nLCAnc2t5c2NyYXBlcicsICd3aWRlIHNreXNjcmFwZXInLCAnbGVhZGVyYm9hcmQnLCAnbGFyZ2UgbGVhZGVyYm9hcmQnLCAnbW9iaWxlIGxlYWRlcmJvYXJkJywgJ2JpbGxib2FyZCcsICdwYW5vcmFtYScsICduZXRib2FyZCcsICdoYWxmIHBhZ2UnLCAnc3F1YXJlJywgJ3NtYWxsIHNxdWFyZSddKS5pc1JlcXVpcmVkXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBBZHZlcnRpc2VtZW50OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0FkdmVydGlzZW1lbnQnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEltYWdlIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ltYWdlJztcbmltcG9ydCBDYXJkQ29udGVudCBmcm9tICcuL0NhcmRDb250ZW50JztcbmltcG9ydCBDYXJkRGVzY3JpcHRpb24gZnJvbSAnLi9DYXJkRGVzY3JpcHRpb24nO1xuaW1wb3J0IENhcmRHcm91cCBmcm9tICcuL0NhcmRHcm91cCc7XG5pbXBvcnQgQ2FyZEhlYWRlciBmcm9tICcuL0NhcmRIZWFkZXInO1xuaW1wb3J0IENhcmRNZXRhIGZyb20gJy4vQ2FyZE1ldGEnO1xuLyoqXG4gKiBBIGNhcmQgZGlzcGxheXMgc2l0ZSBjb250ZW50IGluIGEgbWFubmVyIHNpbWlsYXIgdG8gYSBwbGF5aW5nIGNhcmQuXG4gKi9cblxudmFyIENhcmQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgX2luaGVyaXRzTG9vc2UoQ2FyZCwgX0NvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ2FyZCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfQ29tcG9uZW50LmNhbGwuYXBwbHkoX0NvbXBvbmVudCwgW3RoaXNdLmNvbmNhdChhcmdzKSkgfHwgdGhpcztcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBvbkNsaWNrID0gX3RoaXMucHJvcHMub25DbGljaztcbiAgICAgIGlmIChvbkNsaWNrKSBvbkNsaWNrKGUsIF90aGlzLnByb3BzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENhcmQucHJvdG90eXBlO1xuXG4gIF9wcm90by5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2VudGVyZWQgPSBfdGhpcyRwcm9wcy5jZW50ZXJlZCxcbiAgICAgICAgY2hpbGRyZW4gPSBfdGhpcyRwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3RoaXMkcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjb2xvciA9IF90aGlzJHByb3BzLmNvbG9yLFxuICAgICAgICBjb250ZW50ID0gX3RoaXMkcHJvcHMuY29udGVudCxcbiAgICAgICAgZGVzY3JpcHRpb24gPSBfdGhpcyRwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgZXh0cmEgPSBfdGhpcyRwcm9wcy5leHRyYSxcbiAgICAgICAgZmx1aWQgPSBfdGhpcyRwcm9wcy5mbHVpZCxcbiAgICAgICAgaGVhZGVyID0gX3RoaXMkcHJvcHMuaGVhZGVyLFxuICAgICAgICBocmVmID0gX3RoaXMkcHJvcHMuaHJlZixcbiAgICAgICAgaW1hZ2UgPSBfdGhpcyRwcm9wcy5pbWFnZSxcbiAgICAgICAgbGluayA9IF90aGlzJHByb3BzLmxpbmssXG4gICAgICAgIG1ldGEgPSBfdGhpcyRwcm9wcy5tZXRhLFxuICAgICAgICBvbkNsaWNrID0gX3RoaXMkcHJvcHMub25DbGljayxcbiAgICAgICAgcmFpc2VkID0gX3RoaXMkcHJvcHMucmFpc2VkO1xuICAgIHZhciBjbGFzc2VzID0gY3goJ3VpJywgY29sb3IsIHVzZUtleU9ubHkoY2VudGVyZWQsICdjZW50ZXJlZCcpLCB1c2VLZXlPbmx5KGZsdWlkLCAnZmx1aWQnKSwgdXNlS2V5T25seShsaW5rLCAnbGluaycpLCB1c2VLZXlPbmx5KHJhaXNlZCwgJ3JhaXNlZCcpLCAnY2FyZCcsIGNsYXNzTmFtZSk7XG4gICAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDYXJkLCB0aGlzLnByb3BzKTtcbiAgICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDYXJkLCB0aGlzLnByb3BzLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAob25DbGljaykgcmV0dXJuICdhJztcbiAgICB9KTtcblxuICAgIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzLFxuICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrXG4gICAgICB9KSwgY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICAgIGhyZWY6IGhyZWYsXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICAgIH0pLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXMsXG4gICAgICBocmVmOiBocmVmLFxuICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgIH0pLCBJbWFnZS5jcmVhdGUoaW1hZ2UsIHtcbiAgICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2UsXG4gICAgICBkZWZhdWx0UHJvcHM6IHtcbiAgICAgICAgdWk6IGZhbHNlLFxuICAgICAgICB3cmFwcGVkOiB0cnVlXG4gICAgICB9XG4gICAgfSksIChkZXNjcmlwdGlvbiB8fCBoZWFkZXIgfHwgbWV0YSkgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FyZENvbnRlbnQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgIGhlYWRlcjogaGVhZGVyLFxuICAgICAgbWV0YTogbWV0YVxuICAgIH0pLCBleHRyYSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYXJkQ29udGVudCwge1xuICAgICAgZXh0cmE6IHRydWVcbiAgICB9LCBleHRyYSkpO1xuICB9O1xuXG4gIHJldHVybiBDYXJkO1xufShDb21wb25lbnQpO1xuXG5DYXJkLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2VudGVyZWRcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbG9yXCIsIFwiY29udGVudFwiLCBcImRlc2NyaXB0aW9uXCIsIFwiZXh0cmFcIiwgXCJmbHVpZFwiLCBcImhlYWRlclwiLCBcImhyZWZcIiwgXCJpbWFnZVwiLCBcImxpbmtcIiwgXCJtZXRhXCIsIFwib25DbGlja1wiLCBcInJhaXNlZFwiXTtcbmV4cG9ydCB7IENhcmQgYXMgZGVmYXVsdCB9O1xuQ2FyZC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIENhcmQgY2FuIGNlbnRlciBpdHNlbGYgaW5zaWRlIGl0cyBjb250YWluZXIuICovXG4gIGNlbnRlcmVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBIENhcmQgY2FuIGJlIGZvcm1hdHRlZCB0byBkaXNwbGF5IGRpZmZlcmVudCBjb2xvcnMuICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoU1VJLkNPTE9SUyksXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBDYXJkRGVzY3JpcHRpb24uICovXG4gIGRlc2NyaXB0aW9uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQgb2YgQ2FyZENvbnRlbnQuICovXG4gIGV4dHJhOiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBDYXJkIGNhbiBiZSBmb3JtYXR0ZWQgdG8gdGFrZSB1cCB0aGUgd2lkdGggb2YgaXRzIGNvbnRhaW5lci4gKi9cbiAgZmx1aWQ6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIENhcmRIZWFkZXIuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFJlbmRlciBhcyBhbiBgYWAgdGFnIGluc3RlYWQgb2YgYSBgZGl2YCBhbmQgYWRkcyB0aGUgaHJlZiBhdHRyaWJ1dGUuICovXG4gIGhyZWY6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgY2FyZCBjYW4gY29udGFpbiBhbiBJbWFnZSBjb21wb25lbnQuICovXG4gIGltYWdlOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQSBjYXJkIGNhbiBiZSBmb3JtYXR0ZWQgdG8gbGluayB0byBvdGhlciBjb250ZW50LiAqL1xuICBsaW5rOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBDYXJkTWV0YS4gKi9cbiAgbWV0YTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqXG4gICAqIENhbGxlZCBvbiBjbGljay4gV2hlbiBwYXNzZWQsIHRoZSBjb21wb25lbnQgcmVuZGVycyBhcyBhbiBgYWBcbiAgICogdGFnIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBhIGBkaXZgLlxuICAgKlxuICAgKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudCAtIFJlYWN0J3Mgb3JpZ2luYWwgU3ludGhldGljRXZlbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhIC0gQWxsIHByb3BzLlxuICAgKi9cbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmMsXG5cbiAgLyoqIEEgQ2FyZCBjYW4gYmUgZm9ybWF0dGVkIHRvIHJhaXNlIGFib3ZlIHRoZSBwYWdlLiAqL1xuICByYWlzZWQ6IFByb3BUeXBlcy5ib29sXG59IDoge307XG5DYXJkLkNvbnRlbnQgPSBDYXJkQ29udGVudDtcbkNhcmQuRGVzY3JpcHRpb24gPSBDYXJkRGVzY3JpcHRpb247XG5DYXJkLkdyb3VwID0gQ2FyZEdyb3VwO1xuQ2FyZC5IZWFkZXIgPSBDYXJkSGVhZGVyO1xuQ2FyZC5NZXRhID0gQ2FyZE1ldGE7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZCwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIFNVSSwgdXNlS2V5T25seSwgdXNlVGV4dEFsaWduUHJvcCB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgQ2FyZERlc2NyaXB0aW9uIGZyb20gJy4vQ2FyZERlc2NyaXB0aW9uJztcbmltcG9ydCBDYXJkSGVhZGVyIGZyb20gJy4vQ2FyZEhlYWRlcic7XG5pbXBvcnQgQ2FyZE1ldGEgZnJvbSAnLi9DYXJkTWV0YSc7XG4vKipcbiAqIEEgY2FyZCBjYW4gY29udGFpbiBibG9ja3Mgb2YgY29udGVudCBvciBleHRyYSBjb250ZW50IG1lYW50IHRvIGJlIGZvcm1hdHRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIG1haW4gY29udGVudC5cbiAqL1xuXG5mdW5jdGlvbiBDYXJkQ29udGVudChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGV4dHJhID0gcHJvcHMuZXh0cmEsXG4gICAgICBoZWFkZXIgPSBwcm9wcy5oZWFkZXIsXG4gICAgICBtZXRhID0gcHJvcHMubWV0YSxcbiAgICAgIHRleHRBbGlnbiA9IHByb3BzLnRleHRBbGlnbjtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGV4dHJhLCAnZXh0cmEnKSwgdXNlVGV4dEFsaWduUHJvcCh0ZXh0QWxpZ24pLCAnY29udGVudCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoQ2FyZENvbnRlbnQsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQ2FyZENvbnRlbnQsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNyZWF0ZVNob3J0aGFuZChDYXJkSGVhZGVyLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IHZhbFxuICAgIH07XG4gIH0sIGhlYWRlciwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSksIGNyZWF0ZVNob3J0aGFuZChDYXJkTWV0YSwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiB2YWxcbiAgICB9O1xuICB9LCBtZXRhLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY3JlYXRlU2hvcnRoYW5kKENhcmREZXNjcmlwdGlvbiwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiB2YWxcbiAgICB9O1xuICB9LCBkZXNjcmlwdGlvbiwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSkpO1xufVxuXG5DYXJkQ29udGVudC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRlc2NyaXB0aW9uXCIsIFwiZXh0cmFcIiwgXCJoZWFkZXJcIiwgXCJtZXRhXCIsIFwidGV4dEFsaWduXCJdO1xuQ2FyZENvbnRlbnQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgQ2FyZERlc2NyaXB0aW9uLiAqL1xuICBkZXNjcmlwdGlvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIEEgY2FyZCBjYW4gY29udGFpbiBleHRyYSBjb250ZW50IG1lYW50IHRvIGJlIGZvcm1hdHRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIG1haW4gY29udGVudC4gKi9cbiAgZXh0cmE6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIENhcmRIZWFkZXIuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgQ2FyZE1ldGEuICovXG4gIG1ldGE6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBIGNhcmQgY29udGVudCBjYW4gYWRqdXN0IGl0cyB0ZXh0IGFsaWdubWVudC4gKi9cbiAgdGV4dEFsaWduOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlRFWFRfQUxJR05NRU5UUywgJ2p1c3RpZmllZCcpKVxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgQ2FyZENvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZVRleHRBbGlnblByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNhcmQgY2FuIGNvbnRhaW4gYSBkZXNjcmlwdGlvbiB3aXRoIG9uZSBvciBtb3JlIHBhcmFncmFwaHMuXG4gKi9cblxuZnVuY3Rpb24gQ2FyZERlc2NyaXB0aW9uKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICB0ZXh0QWxpZ24gPSBwcm9wcy50ZXh0QWxpZ247XG4gIHZhciBjbGFzc2VzID0gY3godXNlVGV4dEFsaWduUHJvcCh0ZXh0QWxpZ24pLCAnZGVzY3JpcHRpb24nLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKENhcmREZXNjcmlwdGlvbiwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDYXJkRGVzY3JpcHRpb24sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5DYXJkRGVzY3JpcHRpb24uaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJ0ZXh0QWxpZ25cIl07XG5DYXJkRGVzY3JpcHRpb24ucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgY2FyZCBjb250ZW50IGNhbiBhZGp1c3QgaXRzIHRleHQgYWxpZ25tZW50LiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuVEVYVF9BTElHTk1FTlRTLCAnanVzdGlmaWVkJykpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBDYXJkRGVzY3JpcHRpb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VUZXh0QWxpZ25Qcm9wLCB1c2VXaWR0aFByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IENhcmQgZnJvbSAnLi9DYXJkJztcbi8qKlxuICogQSBncm91cCBvZiBjYXJkcy5cbiAqL1xuXG5mdW5jdGlvbiBDYXJkR3JvdXAocHJvcHMpIHtcbiAgdmFyIGNlbnRlcmVkID0gcHJvcHMuY2VudGVyZWQsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkb3VibGluZyA9IHByb3BzLmRvdWJsaW5nLFxuICAgICAgaXRlbXMgPSBwcm9wcy5pdGVtcyxcbiAgICAgIGl0ZW1zUGVyUm93ID0gcHJvcHMuaXRlbXNQZXJSb3csXG4gICAgICBzdGFja2FibGUgPSBwcm9wcy5zdGFja2FibGUsXG4gICAgICB0ZXh0QWxpZ24gPSBwcm9wcy50ZXh0QWxpZ247XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgdXNlS2V5T25seShjZW50ZXJlZCwgJ2NlbnRlcmVkJyksIHVzZUtleU9ubHkoZG91YmxpbmcsICdkb3VibGluZycpLCB1c2VLZXlPbmx5KHN0YWNrYWJsZSwgJ3N0YWNrYWJsZScpLCB1c2VUZXh0QWxpZ25Qcm9wKHRleHRBbGlnbiksIHVzZVdpZHRoUHJvcChpdGVtc1BlclJvdyksICdjYXJkcycsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoQ2FyZEdyb3VwLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKENhcmRHcm91cCwgcHJvcHMpO1xuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNvbnRlbnQpO1xuICB9XG5cbiAgdmFyIGl0ZW1zSlNYID0gX21hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICB2YXIgX2l0ZW0ka2V5O1xuXG4gICAgdmFyIGtleSA9IChfaXRlbSRrZXkgPSBpdGVtLmtleSkgIT0gbnVsbCA/IF9pdGVtJGtleSA6IFtpdGVtLmhlYWRlciwgaXRlbS5kZXNjcmlwdGlvbl0uam9pbignLScpO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDYXJkLCBfZXh0ZW5kcyh7XG4gICAgICBrZXk6IGtleVxuICAgIH0sIGl0ZW0pKTtcbiAgfSk7XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgaXRlbXNKU1gpO1xufVxuXG5DYXJkR3JvdXAuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjZW50ZXJlZFwiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRvdWJsaW5nXCIsIFwiaXRlbXNcIiwgXCJpdGVtc1BlclJvd1wiLCBcInN0YWNrYWJsZVwiLCBcInRleHRBbGlnblwiXTtcbkNhcmRHcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBBIGdyb3VwIG9mIGNhcmRzIGNhbiBjZW50ZXIgaXRzZWxmIGluc2lkZSBpdHMgY29udGFpbmVyLiAqL1xuICBjZW50ZXJlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIGdyb3VwIG9mIGNhcmRzIGNhbiBkb3VibGUgaXRzIGNvbHVtbiB3aWR0aCBmb3IgbW9iaWxlLiAqL1xuICBkb3VibGluZzogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFNob3J0aGFuZCBhcnJheSBvZiBwcm9wcyBmb3IgQ2FyZC4gKi9cbiAgaXRlbXM6IGN1c3RvbVByb3BUeXBlcy5jb2xsZWN0aW9uU2hvcnRoYW5kLFxuXG4gIC8qKiBBIGdyb3VwIG9mIGNhcmRzIGNhbiBzZXQgaG93IG1hbnkgY2FyZHMgc2hvdWxkIGV4aXN0IGluIGEgcm93LiAqL1xuICBpdGVtc1BlclJvdzogUHJvcFR5cGVzLm9uZU9mKFNVSS5XSURUSFMpLFxuXG4gIC8qKiBBIGdyb3VwIG9mIGNhcmRzIGNhbiBhdXRvbWF0aWNhbGx5IHN0YWNrIHJvd3MgdG8gYSBzaW5nbGUgY29sdW1ucyBvbiBtb2JpbGUgZGV2aWNlcy4gKi9cbiAgc3RhY2thYmxlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogQSBjYXJkIGdyb3VwIGNhbiBhZGp1c3QgaXRzIHRleHQgYWxpZ25tZW50LiAqL1xuICB0ZXh0QWxpZ246IFByb3BUeXBlcy5vbmVPZihfd2l0aG91dChTVUkuVEVYVF9BTElHTk1FTlRTLCAnanVzdGlmaWVkJykpXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBDYXJkR3JvdXA7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZVRleHRBbGlnblByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNhcmQgY2FuIGNvbnRhaW4gYSBoZWFkZXIuXG4gKi9cblxuZnVuY3Rpb24gQ2FyZEhlYWRlcihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduO1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZVRleHRBbGlnblByb3AodGV4dEFsaWduKSwgJ2hlYWRlcicsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoQ2FyZEhlYWRlciwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDYXJkSGVhZGVyLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuQ2FyZEhlYWRlci5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcInRleHRBbGlnblwiXTtcbkNhcmRIZWFkZXIucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEEgY2FyZCBoZWFkZXIgY2FuIGFkanVzdCBpdHMgdGV4dCBhbGlnbm1lbnQuICovXG4gIHRleHRBbGlnbjogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5URVhUX0FMSUdOTUVOVFMsICdqdXN0aWZpZWQnKSlcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENhcmRIZWFkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZVRleHRBbGlnblByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNhcmQgY2FuIGNvbnRhaW4gY29udGVudCBtZXRhZGF0YS5cbiAqL1xuXG5mdW5jdGlvbiBDYXJkTWV0YShwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgdGV4dEFsaWduID0gcHJvcHMudGV4dEFsaWduO1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZVRleHRBbGlnblByb3AodGV4dEFsaWduKSwgJ21ldGEnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKENhcmRNZXRhLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKENhcmRNZXRhLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuQ2FyZE1ldGEuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJ0ZXh0QWxpZ25cIl07XG5DYXJkTWV0YS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBjYXJkIG1ldGEgY2FuIGFkanVzdCBpdHMgdGV4dCBhbGlnbm1lbnQuICovXG4gIHRleHRBbGlnbjogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5URVhUX0FMSUdOTUVOVFMsICdqdXN0aWZpZWQnKSlcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENhcmRNZXRhOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgdXNlS2V5T25seSB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgQ29tbWVudEFjdGlvbiBmcm9tICcuL0NvbW1lbnRBY3Rpb24nO1xuaW1wb3J0IENvbW1lbnRBY3Rpb25zIGZyb20gJy4vQ29tbWVudEFjdGlvbnMnO1xuaW1wb3J0IENvbW1lbnRBdXRob3IgZnJvbSAnLi9Db21tZW50QXV0aG9yJztcbmltcG9ydCBDb21tZW50QXZhdGFyIGZyb20gJy4vQ29tbWVudEF2YXRhcic7XG5pbXBvcnQgQ29tbWVudENvbnRlbnQgZnJvbSAnLi9Db21tZW50Q29udGVudCc7XG5pbXBvcnQgQ29tbWVudEdyb3VwIGZyb20gJy4vQ29tbWVudEdyb3VwJztcbmltcG9ydCBDb21tZW50TWV0YWRhdGEgZnJvbSAnLi9Db21tZW50TWV0YWRhdGEnO1xuaW1wb3J0IENvbW1lbnRUZXh0IGZyb20gJy4vQ29tbWVudFRleHQnO1xuLyoqXG4gKiBBIGNvbW1lbnQgZGlzcGxheXMgdXNlciBmZWVkYmFjayB0byBzaXRlIGNvbnRlbnQuXG4gKi9cblxuZnVuY3Rpb24gQ29tbWVudChwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNvbGxhcHNlZCA9IHByb3BzLmNvbGxhcHNlZCxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KHVzZUtleU9ubHkoY29sbGFwc2VkLCAnY29sbGFwc2VkJyksICdjb21tZW50JywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDb21tZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKENvbW1lbnQsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Db21tZW50LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb2xsYXBzZWRcIiwgXCJjb250ZW50XCJdO1xuQ29tbWVudC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIENvbW1lbnQgY2FuIGJlIGNvbGxhcHNlZCwgb3IgaGlkZGVuIGZyb20gdmlldy4gKi9cbiAgY29sbGFwc2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5Db21tZW50LkF1dGhvciA9IENvbW1lbnRBdXRob3I7XG5Db21tZW50LkFjdGlvbiA9IENvbW1lbnRBY3Rpb247XG5Db21tZW50LkFjdGlvbnMgPSBDb21tZW50QWN0aW9ucztcbkNvbW1lbnQuQXZhdGFyID0gQ29tbWVudEF2YXRhcjtcbkNvbW1lbnQuQ29udGVudCA9IENvbW1lbnRDb250ZW50O1xuQ29tbWVudC5Hcm91cCA9IENvbW1lbnRHcm91cDtcbkNvbW1lbnQuTWV0YWRhdGEgPSBDb21tZW50TWV0YWRhdGE7XG5Db21tZW50LlRleHQgPSBDb21tZW50VGV4dDtcbmV4cG9ydCBkZWZhdWx0IENvbW1lbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBjb21tZW50IGNhbiBjb250YWluIGFuIGFjdGlvbi5cbiAqL1xuXG5mdW5jdGlvbiBDb21tZW50QWN0aW9uKHByb3BzKSB7XG4gIHZhciBhY3RpdmUgPSBwcm9wcy5hY3RpdmUsXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seShhY3RpdmUsICdhY3RpdmUnKSwgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDb21tZW50QWN0aW9uLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKENvbW1lbnRBY3Rpb24sIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Db21tZW50QWN0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFjdGl2ZVwiLCBcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuQ29tbWVudEFjdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAnYSdcbn07XG5Db21tZW50QWN0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFN0eWxlIGFzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGFjdGlvbi4gKi9cbiAgYWN0aXZlOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENvbW1lbnRBY3Rpb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBjb21tZW50IGNhbiBjb250YWluIGFuIGxpc3Qgb2YgYWN0aW9ucyBhIHVzZXIgbWF5IHBlcmZvcm0gcmVsYXRlZCB0byB0aGlzIGNvbW1lbnQuXG4gKi9cblxuZnVuY3Rpb24gQ29tbWVudEFjdGlvbnMocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnYWN0aW9ucycsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoQ29tbWVudEFjdGlvbnMsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQ29tbWVudEFjdGlvbnMsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Db21tZW50QWN0aW9ucy5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbkNvbW1lbnRBY3Rpb25zLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBDb21tZW50QWN0aW9uczsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNvbW1lbnQgY2FuIGNvbnRhaW4gYW4gYXV0aG9yLlxuICovXG5cbmZ1bmN0aW9uIENvbW1lbnRBdXRob3IocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnYXV0aG9yJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDb21tZW50QXV0aG9yLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKENvbW1lbnRBdXRob3IsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Db21tZW50QXV0aG9yLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuQ29tbWVudEF1dGhvci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgQ29tbWVudEF1dGhvcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlSFRNTEltYWdlLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIGh0bWxJbWFnZVByb3BzLCBwYXJ0aXRpb25IVE1MUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNvbW1lbnQgY2FuIGNvbnRhaW4gYW4gaW1hZ2Ugb3IgYXZhdGFyLlxuICovXG5cbmZ1bmN0aW9uIENvbW1lbnRBdmF0YXIocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIHNyYyA9IHByb3BzLnNyYztcbiAgdmFyIGNsYXNzZXMgPSBjeCgnYXZhdGFyJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDb21tZW50QXZhdGFyLCBwcm9wcyk7XG5cbiAgdmFyIF9wYXJ0aXRpb25IVE1MUHJvcHMgPSBwYXJ0aXRpb25IVE1MUHJvcHMocmVzdCwge1xuICAgIGh0bWxQcm9wczogaHRtbEltYWdlUHJvcHNcbiAgfSksXG4gICAgICBpbWFnZVByb3BzID0gX3BhcnRpdGlvbkhUTUxQcm9wc1swXSxcbiAgICAgIHJvb3RQcm9wcyA9IF9wYXJ0aXRpb25IVE1MUHJvcHNbMV07XG5cbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoQ29tbWVudEF2YXRhciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByb290UHJvcHMsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNyZWF0ZUhUTUxJbWFnZShzcmMsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlLFxuICAgIGRlZmF1bHRQcm9wczogaW1hZ2VQcm9wc1xuICB9KSk7XG59XG5cbkNvbW1lbnRBdmF0YXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjbGFzc05hbWVcIiwgXCJzcmNcIl07XG5Db21tZW50QXZhdGFyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTcGVjaWZpZXMgdGhlIFVSTCBvZiB0aGUgaW1hZ2UuICovXG4gIHNyYzogUHJvcFR5cGVzLnN0cmluZ1xufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgQ29tbWVudEF2YXRhcjsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNvbW1lbnQgY2FuIGNvbnRhaW4gY29udGVudC5cbiAqL1xuXG5mdW5jdGlvbiBDb21tZW50Q29udGVudChwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KGNsYXNzTmFtZSwgJ2NvbnRlbnQnKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDb21tZW50Q29udGVudCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDb21tZW50Q29udGVudCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkNvbW1lbnRDb250ZW50LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuQ29tbWVudENvbnRlbnQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENvbW1lbnRDb250ZW50OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF93aXRob3V0IGZyb20gXCJsb2Rhc2gtZXMvd2l0aG91dFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQ29tbWVudHMgY2FuIGJlIGdyb3VwZWQuXG4gKi9cblxuZnVuY3Rpb24gQ29tbWVudEdyb3VwKHByb3BzKSB7XG4gIHZhciBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY29sbGFwc2VkID0gcHJvcHMuY29sbGFwc2VkLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBtaW5pbWFsID0gcHJvcHMubWluaW1hbCxcbiAgICAgIHNpemUgPSBwcm9wcy5zaXplLFxuICAgICAgdGhyZWFkZWQgPSBwcm9wcy50aHJlYWRlZDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBzaXplLCB1c2VLZXlPbmx5KGNvbGxhcHNlZCwgJ2NvbGxhcHNlZCcpLCB1c2VLZXlPbmx5KG1pbmltYWwsICdtaW5pbWFsJyksIHVzZUtleU9ubHkodGhyZWFkZWQsICd0aHJlYWRlZCcpLCAnY29tbWVudHMnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKENvbW1lbnRHcm91cCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDb21tZW50R3JvdXAsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Db21tZW50R3JvdXAuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbGxhcHNlZFwiLCBcImNvbnRlbnRcIiwgXCJtaW5pbWFsXCIsIFwic2l6ZVwiLCBcInRocmVhZGVkXCJdO1xuQ29tbWVudEdyb3VwLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogQ29tbWVudHMgY2FuIGJlIGNvbGxhcHNlZCwgb3IgaGlkZGVuIGZyb20gdmlldy4gKi9cbiAgY29sbGFwc2VkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBDb21tZW50cyBjYW4gaGlkZSBleHRyYSBpbmZvcm1hdGlvbiB1bmxlc3MgYSB1c2VyIHNob3dzIGludGVudCB0byBpbnRlcmFjdCB3aXRoIGEgY29tbWVudC4gKi9cbiAgbWluaW1hbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIENvbW1lbnRzIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21lZGl1bScpKSxcblxuICAvKiogQSBjb21tZW50IGxpc3QgY2FuIGJlIHRocmVhZGVkIHRvIHNob3dpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbnZlcnNhdGlvbnMuICovXG4gIHRocmVhZGVkOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgQ29tbWVudEdyb3VwOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEEgY29tbWVudCBjYW4gY29udGFpbiBtZXRhZGF0YSBhYm91dCB0aGUgY29tbWVudCwgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiBtZXRhZGF0YSBtYXkgYmUgZGVmaW5lZC5cbiAqL1xuXG5mdW5jdGlvbiBDb21tZW50TWV0YWRhdGEocHJvcHMpIHtcbiAgdmFyIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnbWV0YWRhdGEnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKENvbW1lbnRNZXRhZGF0YSwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDb21tZW50TWV0YWRhdGEsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5Db21tZW50TWV0YWRhdGEuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5Db21tZW50TWV0YWRhdGEucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENvbW1lbnRNZXRhZGF0YTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBIGNvbW1lbnQgY2FuIGNvbnRhaW4gdGV4dC5cbiAqL1xuXG5mdW5jdGlvbiBDb21tZW50VGV4dChwcm9wcykge1xuICB2YXIgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KGNsYXNzTmFtZSwgJ3RleHQnKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhDb21tZW50VGV4dCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShDb21tZW50VGV4dCwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkNvbW1lbnRUZXh0LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuQ29tbWVudFRleHQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IENvbW1lbnRUZXh0OyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL0NvbW1lbnQnO1xuZXhwb3J0IHsgX2RlZmF1bHQgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZVwiO1xuaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBGZWVkQ29udGVudCBmcm9tICcuL0ZlZWRDb250ZW50JztcbmltcG9ydCBGZWVkRGF0ZSBmcm9tICcuL0ZlZWREYXRlJztcbmltcG9ydCBGZWVkRXZlbnQgZnJvbSAnLi9GZWVkRXZlbnQnO1xuaW1wb3J0IEZlZWRFeHRyYSBmcm9tICcuL0ZlZWRFeHRyYSc7XG5pbXBvcnQgRmVlZExhYmVsIGZyb20gJy4vRmVlZExhYmVsJztcbmltcG9ydCBGZWVkTGlrZSBmcm9tICcuL0ZlZWRMaWtlJztcbmltcG9ydCBGZWVkTWV0YSBmcm9tICcuL0ZlZWRNZXRhJztcbmltcG9ydCBGZWVkU3VtbWFyeSBmcm9tICcuL0ZlZWRTdW1tYXJ5JztcbmltcG9ydCBGZWVkVXNlciBmcm9tICcuL0ZlZWRVc2VyJztcbi8qKlxuICogQSBmZWVkIHByZXNlbnRzIHVzZXIgYWN0aXZpdHkgY2hyb25vbG9naWNhbGx5LlxuICovXG5cbmZ1bmN0aW9uIEZlZWQocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBldmVudHMgPSBwcm9wcy5ldmVudHMsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZTtcbiAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBzaXplLCAnZmVlZCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRmVlZCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShGZWVkLCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICB2YXIgZXZlbnRFbGVtZW50cyA9IF9tYXAoZXZlbnRzLCBmdW5jdGlvbiAoZXZlbnRQcm9wcykge1xuICAgIHZhciBjaGlsZEtleSA9IGV2ZW50UHJvcHMuY2hpbGRLZXksXG4gICAgICAgIGRhdGUgPSBldmVudFByb3BzLmRhdGUsXG4gICAgICAgIG1ldGEgPSBldmVudFByb3BzLm1ldGEsXG4gICAgICAgIHN1bW1hcnkgPSBldmVudFByb3BzLnN1bW1hcnksXG4gICAgICAgIGV2ZW50RGF0YSA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKGV2ZW50UHJvcHMsIFtcImNoaWxkS2V5XCIsIFwiZGF0ZVwiLCBcIm1ldGFcIiwgXCJzdW1tYXJ5XCJdKTtcblxuICAgIHZhciBmaW5hbEtleSA9IGNoaWxkS2V5ICE9IG51bGwgPyBjaGlsZEtleSA6IFtkYXRlLCBtZXRhLCBzdW1tYXJ5XS5qb2luKCctJyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEZlZWRFdmVudCwgX2V4dGVuZHMoe1xuICAgICAgZGF0ZTogZGF0ZSxcbiAgICAgIGtleTogZmluYWxLZXksXG4gICAgICBtZXRhOiBtZXRhLFxuICAgICAgc3VtbWFyeTogc3VtbWFyeVxuICAgIH0sIGV2ZW50RGF0YSkpO1xuICB9KTtcblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBldmVudEVsZW1lbnRzKTtcbn1cblxuRmVlZC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiZXZlbnRzXCIsIFwic2l6ZVwiXTtcbkZlZWQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgYXJyYXkgb2YgcHJvcHMgZm9yIEZlZWRFdmVudC4gKi9cbiAgZXZlbnRzOiBjdXN0b21Qcm9wVHlwZXMuY29sbGVjdGlvblNob3J0aGFuZCxcblxuICAvKiogQSBmZWVkIGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ21pbmknLCAndGlueScsICdtZWRpdW0nLCAnYmlnJywgJ2h1Z2UnLCAnbWFzc2l2ZScpKVxufSA6IHt9O1xuRmVlZC5Db250ZW50ID0gRmVlZENvbnRlbnQ7XG5GZWVkLkRhdGUgPSBGZWVkRGF0ZTtcbkZlZWQuRXZlbnQgPSBGZWVkRXZlbnQ7XG5GZWVkLkV4dHJhID0gRmVlZEV4dHJhO1xuRmVlZC5MYWJlbCA9IEZlZWRMYWJlbDtcbkZlZWQuTGlrZSA9IEZlZWRMaWtlO1xuRmVlZC5NZXRhID0gRmVlZE1ldGE7XG5GZWVkLlN1bW1hcnkgPSBGZWVkU3VtbWFyeTtcbkZlZWQuVXNlciA9IEZlZWRVc2VyO1xuZXhwb3J0IGRlZmF1bHQgRmVlZDsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgRmVlZERhdGUgZnJvbSAnLi9GZWVkRGF0ZSc7XG5pbXBvcnQgRmVlZEV4dHJhIGZyb20gJy4vRmVlZEV4dHJhJztcbmltcG9ydCBGZWVkTWV0YSBmcm9tICcuL0ZlZWRNZXRhJztcbmltcG9ydCBGZWVkU3VtbWFyeSBmcm9tICcuL0ZlZWRTdW1tYXJ5JztcblxuZnVuY3Rpb24gRmVlZENvbnRlbnQocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGV4dHJhSW1hZ2VzID0gcHJvcHMuZXh0cmFJbWFnZXMsXG4gICAgICBleHRyYVRleHQgPSBwcm9wcy5leHRyYVRleHQsXG4gICAgICBkYXRlID0gcHJvcHMuZGF0ZSxcbiAgICAgIG1ldGEgPSBwcm9wcy5tZXRhLFxuICAgICAgc3VtbWFyeSA9IHByb3BzLnN1bW1hcnk7XG4gIHZhciBjbGFzc2VzID0gY3goJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEZlZWRDb250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZlZWRDb250ZW50LCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjcmVhdGVTaG9ydGhhbmQoRmVlZERhdGUsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogdmFsXG4gICAgfTtcbiAgfSwgZGF0ZSwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSksIGNyZWF0ZVNob3J0aGFuZChGZWVkU3VtbWFyeSwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiB2YWxcbiAgICB9O1xuICB9LCBzdW1tYXJ5LCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY29udGVudCwgY3JlYXRlU2hvcnRoYW5kKEZlZWRFeHRyYSwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0OiB0cnVlLFxuICAgICAgY29udGVudDogdmFsXG4gICAgfTtcbiAgfSwgZXh0cmFUZXh0LCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY3JlYXRlU2hvcnRoYW5kKEZlZWRFeHRyYSwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbWFnZXM6IHZhbFxuICAgIH07XG4gIH0sIGV4dHJhSW1hZ2VzLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY3JlYXRlU2hvcnRoYW5kKEZlZWRNZXRhLCBmdW5jdGlvbiAodmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IHZhbFxuICAgIH07XG4gIH0sIG1ldGEsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pKTtcbn1cblxuRmVlZENvbnRlbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJkYXRlXCIsIFwiZXh0cmFJbWFnZXNcIiwgXCJleHRyYVRleHRcIiwgXCJtZXRhXCIsIFwic3VtbWFyeVwiXTtcbkZlZWRDb250ZW50LnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBbiBldmVudCBjYW4gY29udGFpbiBhIGRhdGUuICovXG4gIGRhdGU6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEZlZWRFeHRyYSB3aXRoIGltYWdlcy4gKi9cbiAgZXh0cmFJbWFnZXM6IEZlZWRFeHRyYS5wcm9wVHlwZXMuaW1hZ2VzLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEZlZWRFeHRyYSB3aXRoIHRleHQuICovXG4gIGV4dHJhVGV4dDogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgRmVlZE1ldGEuICovXG4gIG1ldGE6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEZlZWRTdW1tYXJ5LiAqL1xuICBzdW1tYXJ5OiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRmVlZENvbnRlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQW4gZXZlbnQgb3IgYW4gZXZlbnQgc3VtbWFyeSBjYW4gY29udGFpbiBhIGRhdGUuXG4gKi9cblxuZnVuY3Rpb24gRmVlZERhdGUocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnZGF0ZScsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRmVlZERhdGUsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRmVlZERhdGUsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5GZWVkRGF0ZS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbkZlZWREYXRlLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBGZWVkRGF0ZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlU2hvcnRoYW5kLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgRmVlZENvbnRlbnQgZnJvbSAnLi9GZWVkQ29udGVudCc7XG5pbXBvcnQgRmVlZExhYmVsIGZyb20gJy4vRmVlZExhYmVsJztcbi8qKlxuICogQSBmZWVkIGNvbnRhaW5zIGFuIGV2ZW50LlxuICovXG5cbmZ1bmN0aW9uIEZlZWRFdmVudChwcm9wcykge1xuICB2YXIgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgZGF0ZSA9IHByb3BzLmRhdGUsXG4gICAgICBleHRyYUltYWdlcyA9IHByb3BzLmV4dHJhSW1hZ2VzLFxuICAgICAgZXh0cmFUZXh0ID0gcHJvcHMuZXh0cmFUZXh0LFxuICAgICAgaW1hZ2UgPSBwcm9wcy5pbWFnZSxcbiAgICAgIGljb24gPSBwcm9wcy5pY29uLFxuICAgICAgbWV0YSA9IHByb3BzLm1ldGEsXG4gICAgICBzdW1tYXJ5ID0gcHJvcHMuc3VtbWFyeTtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnZXZlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEZlZWRFdmVudCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShGZWVkRXZlbnQsIHByb3BzKTtcbiAgdmFyIGhhc0NvbnRlbnRQcm9wID0gY29udGVudCB8fCBkYXRlIHx8IGV4dHJhSW1hZ2VzIHx8IGV4dHJhVGV4dCB8fCBtZXRhIHx8IHN1bW1hcnk7XG4gIHZhciBjb250ZW50UHJvcHMgPSB7XG4gICAgY29udGVudDogY29udGVudCxcbiAgICBkYXRlOiBkYXRlLFxuICAgIGV4dHJhSW1hZ2VzOiBleHRyYUltYWdlcyxcbiAgICBleHRyYVRleHQ6IGV4dHJhVGV4dCxcbiAgICBtZXRhOiBtZXRhLFxuICAgIHN1bW1hcnk6IHN1bW1hcnlcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY3JlYXRlU2hvcnRoYW5kKEZlZWRMYWJlbCwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpY29uOiB2YWxcbiAgICB9O1xuICB9LCBpY29uLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY3JlYXRlU2hvcnRoYW5kKEZlZWRMYWJlbCwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbWFnZTogdmFsXG4gICAgfTtcbiAgfSwgaW1hZ2UsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pLCBoYXNDb250ZW50UHJvcCAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGZWVkQ29udGVudCwgY29udGVudFByb3BzKSwgY2hpbGRyZW4pO1xufVxuXG5GZWVkRXZlbnQuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJkYXRlXCIsIFwiZXh0cmFJbWFnZXNcIiwgXCJleHRyYVRleHRcIiwgXCJpY29uXCIsIFwiaW1hZ2VcIiwgXCJtZXRhXCIsIFwic3VtbWFyeVwiXTtcbkZlZWRFdmVudC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgRmVlZENvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEZlZWREYXRlLiAqL1xuICBkYXRlOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBGZWVkRXh0cmEgd2l0aCBpbWFnZXMuICovXG4gIGV4dHJhSW1hZ2VzOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBGZWVkRXh0cmEgd2l0aCBjb250ZW50LiAqL1xuICBleHRyYVRleHQ6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBbiBldmVudCBjYW4gY29udGFpbiBpY29uIGxhYmVsLiAqL1xuICBpY29uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogQW4gZXZlbnQgY2FuIGNvbnRhaW4gaW1hZ2UgbGFiZWwuICovXG4gIGltYWdlOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBGZWVkTWV0YS4gKi9cbiAgbWV0YTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgRmVlZFN1bW1hcnkuICovXG4gIHN1bW1hcnk6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBGZWVkRXZlbnQ7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVIVE1MSW1hZ2UsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBmZWVkIGNhbiBjb250YWluIGFuIGV4dHJhIGNvbnRlbnQuXG4gKi9cblxuZnVuY3Rpb24gRmVlZEV4dHJhKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBpbWFnZXMgPSBwcm9wcy5pbWFnZXMsXG4gICAgICB0ZXh0ID0gcHJvcHMudGV4dDtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VLZXlPbmx5KGltYWdlcywgJ2ltYWdlcycpLCB1c2VLZXlPbmx5KGNvbnRlbnQgfHwgdGV4dCwgJ3RleHQnKSwgJ2V4dHJhJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhGZWVkRXh0cmEsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRmVlZEV4dHJhLCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH0gLy8gVE9ETyBuZWVkIGEgXCJjb2xsZWN0aW9uIGZhY3RvcnlcIiB0byBoYW5kbGUgY3JlYXRpbmcgbXVsdGlwbGUgaW1hZ2UgZWxlbWVudHMgYW5kIHRoZWlyIGtleXNcblxuXG4gIHZhciBpbWFnZUVsZW1lbnRzID0gX21hcChpbWFnZXMsIGZ1bmN0aW9uIChpbWFnZSwgaW5kZXgpIHtcbiAgICB2YXIga2V5ID0gW2luZGV4LCBpbWFnZV0uam9pbignLScpO1xuICAgIHJldHVybiBjcmVhdGVIVE1MSW1hZ2UoaW1hZ2UsIHtcbiAgICAgIGtleToga2V5XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNvbnRlbnQsIGltYWdlRWxlbWVudHMpO1xufVxuXG5GZWVkRXh0cmEuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJpbWFnZXNcIiwgXCJ0ZXh0XCJdO1xuRmVlZEV4dHJhLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBbiBldmVudCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxpa2UgYSBzZXQgb2YgaW1hZ2VzLiAqL1xuICBpbWFnZXM6IGN1c3RvbVByb3BUeXBlcy5ldmVyeShbY3VzdG9tUHJvcFR5cGVzLmRpc2FsbG93KFsndGV4dCddKSwgUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmJvb2wsIGN1c3RvbVByb3BUeXBlcy5jb2xsZWN0aW9uU2hvcnRoYW5kXSldKSxcblxuICAvKiogQW4gZXZlbnQgY2FuIGNvbnRhaW4gYWRkaXRpb25hbCB0ZXh0IGluZm9ybWF0aW9uLiAqL1xuICB0ZXh0OiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRmVlZEV4dHJhOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVIVE1MSW1hZ2UsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ljb24nO1xuLyoqXG4gKiBBbiBldmVudCBjYW4gY29udGFpbiBhbiBpbWFnZSBvciBpY29uIGxhYmVsLlxuICovXG5cbmZ1bmN0aW9uIEZlZWRMYWJlbChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgaWNvbiA9IHByb3BzLmljb24sXG4gICAgICBpbWFnZSA9IHByb3BzLmltYWdlO1xuICB2YXIgY2xhc3NlcyA9IGN4KCdsYWJlbCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRmVlZExhYmVsLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZlZWRMYWJlbCwgcHJvcHMpO1xuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY29udGVudCwgSWNvbi5jcmVhdGUoaWNvbiwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSksIGNyZWF0ZUhUTUxJbWFnZShpbWFnZSkpO1xufVxuXG5GZWVkTGFiZWwuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJpY29uXCIsIFwiaW1hZ2VcIl07XG5GZWVkTGFiZWwucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEFuIGV2ZW50IGNhbiBjb250YWluIGljb24gbGFiZWwuICovXG4gIGljb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBBbiBldmVudCBjYW4gY29udGFpbiBpbWFnZSBsYWJlbC4gKi9cbiAgaW1hZ2U6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kXG59IDoge307XG5leHBvcnQgZGVmYXVsdCBGZWVkTGFiZWw7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJY29uIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ljb24nO1xuLyoqXG4gKiBBIGZlZWQgY2FuIGNvbnRhaW4gYSBsaWtlIGVsZW1lbnQuXG4gKi9cblxuZnVuY3Rpb24gRmVlZExpa2UocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGljb24gPSBwcm9wcy5pY29uO1xuICB2YXIgY2xhc3NlcyA9IGN4KCdsaWtlJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhGZWVkTGlrZSwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShGZWVkTGlrZSwgcHJvcHMpO1xuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgSWNvbi5jcmVhdGUoaWNvbiwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSksIGNvbnRlbnQpO1xufVxuXG5GZWVkTGlrZS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImljb25cIl07XG5GZWVkTGlrZS5kZWZhdWx0UHJvcHMgPSB7XG4gIGFzOiAnYSdcbn07XG5GZWVkTGlrZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBpY29uLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGlsZHJlbi4gKi9cbiAgaWNvbjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZlZWRMaWtlOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmQsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBGZWVkTGlrZSBmcm9tICcuL0ZlZWRMaWtlJztcbi8qKlxuICogQSBmZWVkIGNhbiBjb250YWluIGEgbWV0YS5cbiAqL1xuXG5mdW5jdGlvbiBGZWVkTWV0YShwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgbGlrZSA9IHByb3BzLmxpa2U7XG4gIHZhciBjbGFzc2VzID0gY3goJ21ldGEnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEZlZWRNZXRhLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZlZWRNZXRhLCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjcmVhdGVTaG9ydGhhbmQoRmVlZExpa2UsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogdmFsXG4gICAgfTtcbiAgfSwgbGlrZSwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSksIGNvbnRlbnQpO1xufVxuXG5GZWVkTWV0YS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImxpa2VcIl07XG5GZWVkTWV0YS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBGZWVkTGlrZS4gKi9cbiAgbGlrZTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEZlZWRNZXRhOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmQsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBGZWVkRGF0ZSBmcm9tICcuL0ZlZWREYXRlJztcbmltcG9ydCBGZWVkVXNlciBmcm9tICcuL0ZlZWRVc2VyJztcbi8qKlxuICogQSBmZWVkIGNhbiBjb250YWluIGEgc3VtbWFyeS5cbiAqL1xuXG5mdW5jdGlvbiBGZWVkU3VtbWFyeShwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZGF0ZSA9IHByb3BzLmRhdGUsXG4gICAgICB1c2VyID0gcHJvcHMudXNlcjtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnc3VtbWFyeScsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoRmVlZFN1bW1hcnksIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoRmVlZFN1bW1hcnksIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNyZWF0ZVNob3J0aGFuZChGZWVkVXNlciwgZnVuY3Rpb24gKHZhbCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiB2YWxcbiAgICB9O1xuICB9LCB1c2VyLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY29udGVudCAmJiAnICcsIGNvbnRlbnQsIGNvbnRlbnQgJiYgJyAnLCBjcmVhdGVTaG9ydGhhbmQoRmVlZERhdGUsIGZ1bmN0aW9uICh2YWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogdmFsXG4gICAgfTtcbiAgfSwgZGF0ZSwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSkpO1xufVxuXG5GZWVkU3VtbWFyeS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiLCBcImRhdGVcIiwgXCJ1c2VyXCJdO1xuRmVlZFN1bW1hcnkucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgRmVlZERhdGUuICovXG4gIGRhdGU6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEZlZWRVc2VyLiAqL1xuICB1c2VyOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgRmVlZFN1bW1hcnk7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBmZWVkIGNhbiBjb250YWluIGEgdXNlciBlbGVtZW50LlxuICovXG5cbmZ1bmN0aW9uIEZlZWRVc2VyKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VzZXInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEZlZWRVc2VyLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEZlZWRVc2VyLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuRmVlZFVzZXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5GZWVkVXNlci5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZFxufSA6IHt9O1xuRmVlZFVzZXIuZGVmYXVsdFByb3BzID0ge1xuICBhczogJ2EnXG59O1xuZXhwb3J0IGRlZmF1bHQgRmVlZFVzZXI7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vRmVlZCc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJdGVtQ29udGVudCBmcm9tICcuL0l0ZW1Db250ZW50JztcbmltcG9ydCBJdGVtRGVzY3JpcHRpb24gZnJvbSAnLi9JdGVtRGVzY3JpcHRpb24nO1xuaW1wb3J0IEl0ZW1FeHRyYSBmcm9tICcuL0l0ZW1FeHRyYSc7XG5pbXBvcnQgSXRlbUdyb3VwIGZyb20gJy4vSXRlbUdyb3VwJztcbmltcG9ydCBJdGVtSGVhZGVyIGZyb20gJy4vSXRlbUhlYWRlcic7XG5pbXBvcnQgSXRlbUltYWdlIGZyb20gJy4vSXRlbUltYWdlJztcbmltcG9ydCBJdGVtTWV0YSBmcm9tICcuL0l0ZW1NZXRhJztcbi8qKlxuICogQW4gaXRlbSB2aWV3IHByZXNlbnRzIGxhcmdlIGNvbGxlY3Rpb25zIG9mIHNpdGUgY29udGVudCBmb3IgZGlzcGxheS5cbiAqL1xuXG5mdW5jdGlvbiBJdGVtKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQsXG4gICAgICBkZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZXh0cmEgPSBwcm9wcy5leHRyYSxcbiAgICAgIGhlYWRlciA9IHByb3BzLmhlYWRlcixcbiAgICAgIGltYWdlID0gcHJvcHMuaW1hZ2UsXG4gICAgICBtZXRhID0gcHJvcHMubWV0YTtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnaXRlbScsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoSXRlbSwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShJdGVtLCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBJdGVtSW1hZ2UuY3JlYXRlKGltYWdlLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSXRlbUNvbnRlbnQsIHtcbiAgICBjb250ZW50OiBjb250ZW50LFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICBleHRyYTogZXh0cmEsXG4gICAgaGVhZGVyOiBoZWFkZXIsXG4gICAgbWV0YTogbWV0YVxuICB9KSk7XG59XG5cbkl0ZW0uaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJkZXNjcmlwdGlvblwiLCBcImV4dHJhXCIsIFwiaGVhZGVyXCIsIFwiaW1hZ2VcIiwgXCJtZXRhXCJdO1xuSXRlbS5Db250ZW50ID0gSXRlbUNvbnRlbnQ7XG5JdGVtLkRlc2NyaXB0aW9uID0gSXRlbURlc2NyaXB0aW9uO1xuSXRlbS5FeHRyYSA9IEl0ZW1FeHRyYTtcbkl0ZW0uR3JvdXAgPSBJdGVtR3JvdXA7XG5JdGVtLkhlYWRlciA9IEl0ZW1IZWFkZXI7XG5JdGVtLkltYWdlID0gSXRlbUltYWdlO1xuSXRlbS5NZXRhID0gSXRlbU1ldGE7XG5JdGVtLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJdGVtQ29udGVudCBjb21wb25lbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEl0ZW1EZXNjcmlwdGlvbiBjb21wb25lbnQuICovXG4gIGRlc2NyaXB0aW9uOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJdGVtRXh0cmEgY29tcG9uZW50LiAqL1xuICBleHRyYTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgSXRlbUhlYWRlciBjb21wb25lbnQuICovXG4gIGhlYWRlcjogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgSXRlbUltYWdlIGNvbXBvbmVudC4gKi9cbiAgaW1hZ2U6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEl0ZW1NZXRhIGNvbXBvbmVudC4gKi9cbiAgbWV0YTogY3VzdG9tUHJvcFR5cGVzLml0ZW1TaG9ydGhhbmRcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEl0ZW07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZVZlcnRpY2FsQWxpZ25Qcm9wIH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBJdGVtSGVhZGVyIGZyb20gJy4vSXRlbUhlYWRlcic7XG5pbXBvcnQgSXRlbURlc2NyaXB0aW9uIGZyb20gJy4vSXRlbURlc2NyaXB0aW9uJztcbmltcG9ydCBJdGVtRXh0cmEgZnJvbSAnLi9JdGVtRXh0cmEnO1xuaW1wb3J0IEl0ZW1NZXRhIGZyb20gJy4vSXRlbU1ldGEnO1xuLyoqXG4gKiBBbiBpdGVtIGNhbiBjb250YWluIGNvbnRlbnQuXG4gKi9cblxuZnVuY3Rpb24gSXRlbUNvbnRlbnQocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBleHRyYSA9IHByb3BzLmV4dHJhLFxuICAgICAgaGVhZGVyID0gcHJvcHMuaGVhZGVyLFxuICAgICAgbWV0YSA9IHByb3BzLm1ldGEsXG4gICAgICB2ZXJ0aWNhbEFsaWduID0gcHJvcHMudmVydGljYWxBbGlnbjtcbiAgdmFyIGNsYXNzZXMgPSBjeCh1c2VWZXJ0aWNhbEFsaWduUHJvcCh2ZXJ0aWNhbEFsaWduKSwgJ2NvbnRlbnQnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEl0ZW1Db250ZW50LCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKEl0ZW1Db250ZW50LCBwcm9wcyk7XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjaGlsZHJlbik7XG4gIH1cblxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBJdGVtSGVhZGVyLmNyZWF0ZShoZWFkZXIsIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pLCBJdGVtTWV0YS5jcmVhdGUobWV0YSwge1xuICAgIGF1dG9HZW5lcmF0ZUtleTogZmFsc2VcbiAgfSksIEl0ZW1EZXNjcmlwdGlvbi5jcmVhdGUoZGVzY3JpcHRpb24sIHtcbiAgICBhdXRvR2VuZXJhdGVLZXk6IGZhbHNlXG4gIH0pLCBJdGVtRXh0cmEuY3JlYXRlKGV4dHJhLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgY29udGVudCk7XG59XG5cbkl0ZW1Db250ZW50LmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGVzY3JpcHRpb25cIiwgXCJleHRyYVwiLCBcImhlYWRlclwiLCBcIm1ldGFcIiwgXCJ2ZXJ0aWNhbEFsaWduXCJdO1xuSXRlbUNvbnRlbnQucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgSXRlbURlc2NyaXB0aW9uIGNvbXBvbmVudC4gKi9cbiAgZGVzY3JpcHRpb246IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIEl0ZW1FeHRyYSBjb21wb25lbnQuICovXG4gIGV4dHJhOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJdGVtSGVhZGVyIGNvbXBvbmVudC4gKi9cbiAgaGVhZGVyOiBjdXN0b21Qcm9wVHlwZXMuaXRlbVNob3J0aGFuZCxcblxuICAvKiogU2hvcnRoYW5kIGZvciBJdGVtTWV0YSBjb21wb25lbnQuICovXG4gIG1ldGE6IGN1c3RvbVByb3BUeXBlcy5pdGVtU2hvcnRoYW5kLFxuXG4gIC8qKiBDb250ZW50IGNhbiBzcGVjaWZ5IGl0cyB2ZXJ0aWNhbCBhbGlnbm1lbnQuICovXG4gIHZlcnRpY2FsQWxpZ246IFByb3BUeXBlcy5vbmVPZihTVUkuVkVSVElDQUxfQUxJR05NRU5UUylcbn0gOiB7fTtcbmV4cG9ydCBkZWZhdWx0IEl0ZW1Db250ZW50OyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEFuIGl0ZW0gY2FuIGNvbnRhaW4gYSBkZXNjcmlwdGlvbiB3aXRoIGEgc2luZ2xlIG9yIG11bHRpcGxlIHBhcmFncmFwaHMuXG4gKi9cblxuZnVuY3Rpb24gSXRlbURlc2NyaXB0aW9uKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gIHZhciBjbGFzc2VzID0gY3goJ2Rlc2NyaXB0aW9uJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhJdGVtRGVzY3JpcHRpb24sIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSXRlbURlc2NyaXB0aW9uLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuSXRlbURlc2NyaXB0aW9uLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCJdO1xuSXRlbURlc2NyaXB0aW9uLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5JdGVtRGVzY3JpcHRpb24uY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShJdGVtRGVzY3JpcHRpb24sIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBJdGVtRGVzY3JpcHRpb247IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQW4gaXRlbSBjYW4gY29udGFpbiBleHRyYSBjb250ZW50IG1lYW50IHRvIGJlIGZvcm1hdHRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIG1haW4gY29udGVudC5cbiAqL1xuXG5mdW5jdGlvbiBJdGVtRXh0cmEocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnZXh0cmEnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEl0ZW1FeHRyYSwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShJdGVtRXh0cmEsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5JdGVtRXh0cmEuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5JdGVtRXh0cmEucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmRcbn0gOiB7fTtcbkl0ZW1FeHRyYS5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KEl0ZW1FeHRyYSwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IEl0ZW1FeHRyYTsiLCJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2VcIjtcbmltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IF9tYXAgZnJvbSBcImxvZGFzaC1lcy9tYXBcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMsIHVzZUtleU9ubHksIHVzZUtleU9yVmFsdWVBbmRLZXkgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEl0ZW0gZnJvbSAnLi9JdGVtJztcbi8qKlxuICogQSBncm91cCBvZiBpdGVtcy5cbiAqL1xuXG5mdW5jdGlvbiBJdGVtR3JvdXAocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGRpdmlkZWQgPSBwcm9wcy5kaXZpZGVkLFxuICAgICAgaXRlbXMgPSBwcm9wcy5pdGVtcyxcbiAgICAgIGxpbmsgPSBwcm9wcy5saW5rLFxuICAgICAgcmVsYXhlZCA9IHByb3BzLnJlbGF4ZWQsXG4gICAgICB1bnN0YWNrYWJsZSA9IHByb3BzLnVuc3RhY2thYmxlO1xuICB2YXIgY2xhc3NlcyA9IGN4KCd1aScsIHVzZUtleU9ubHkoZGl2aWRlZCwgJ2RpdmlkZWQnKSwgdXNlS2V5T25seShsaW5rLCAnbGluaycpLCB1c2VLZXlPbmx5KHVuc3RhY2thYmxlLCAndW5zdGFja2FibGUnKSwgdXNlS2V5T3JWYWx1ZUFuZEtleShyZWxheGVkLCAncmVsYXhlZCcpLCAnaXRlbXMnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEl0ZW1Hcm91cCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShJdGVtR3JvdXAsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjb250ZW50KTtcbiAgfVxuXG4gIHZhciBpdGVtc0pTWCA9IF9tYXAoaXRlbXMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGNoaWxkS2V5ID0gaXRlbS5jaGlsZEtleSxcbiAgICAgICAgaXRlbVByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoaXRlbSwgW1wiY2hpbGRLZXlcIl0pO1xuXG4gICAgdmFyIGZpbmFsS2V5ID0gY2hpbGRLZXkgIT0gbnVsbCA/IGNoaWxkS2V5IDogW2l0ZW1Qcm9wcy5jb250ZW50LCBpdGVtUHJvcHMuZGVzY3JpcHRpb24sIGl0ZW1Qcm9wcy5oZWFkZXIsIGl0ZW1Qcm9wcy5tZXRhXS5qb2luKCctJyk7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEl0ZW0sIF9leHRlbmRzKHt9LCBpdGVtUHJvcHMsIHtcbiAgICAgIGtleTogZmluYWxLZXlcbiAgICB9KSk7XG4gIH0pO1xuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGl0ZW1zSlNYKTtcbn1cblxuSXRlbUdyb3VwLmhhbmRsZWRQcm9wcyA9IFtcImFzXCIsIFwiY2hpbGRyZW5cIiwgXCJjbGFzc05hbWVcIiwgXCJjb250ZW50XCIsIFwiZGl2aWRlZFwiLCBcIml0ZW1zXCIsIFwibGlua1wiLCBcInJlbGF4ZWRcIiwgXCJ1bnN0YWNrYWJsZVwiXTtcbkl0ZW1Hcm91cC5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogSXRlbXMgY2FuIGJlIGRpdmlkZWQgdG8gYmV0dGVyIGRpc3Rpbmd1aXNoIGJldHdlZW4gZ3JvdXBlZCBjb250ZW50LiAqL1xuICBkaXZpZGVkOiBQcm9wVHlwZXMuYm9vbCxcblxuICAvKiogU2hvcnRoYW5kIGFycmF5IG9mIHByb3BzIGZvciBJdGVtLiAqL1xuICBpdGVtczogY3VzdG9tUHJvcFR5cGVzLmNvbGxlY3Rpb25TaG9ydGhhbmQsXG5cbiAgLyoqIEFuIGl0ZW0gY2FuIGJlIGZvcm1hdHRlZCBzbyB0aGF0IHRoZSBlbnRpcmUgY29udGVudHMgbGluayB0byBhbm90aGVyIHBhZ2UuICovXG4gIGxpbms6IFByb3BUeXBlcy5ib29sLFxuXG4gIC8qKiBBIGdyb3VwIG9mIGl0ZW1zIGNhbiByZWxheCBpdHMgcGFkZGluZyB0byBwcm92aWRlIG1vcmUgbmVnYXRpdmUgc3BhY2UuICovXG4gIHJlbGF4ZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5ib29sLCBQcm9wVHlwZXMub25lT2YoWyd2ZXJ5J10pXSksXG5cbiAgLyoqIFByZXZlbnQgaXRlbXMgZnJvbSBzdGFja2luZyBvbiBtb2JpbGUuICovXG4gIHVuc3RhY2thYmxlOiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgSXRlbUdyb3VwOyIsImltcG9ydCBfZXh0ZW5kcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZXh0ZW5kc1wiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5LCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcyB9IGZyb20gJy4uLy4uL2xpYic7XG4vKipcbiAqIEFuIGl0ZW0gY2FuIGNvbnRhaW4gYSBoZWFkZXIuXG4gKi9cblxuZnVuY3Rpb24gSXRlbUhlYWRlcihwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdoZWFkZXInLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEl0ZW1IZWFkZXIsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSXRlbUhlYWRlciwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gIH0pLCBjaGlsZHJlblV0aWxzLmlzTmlsKGNoaWxkcmVuKSA/IGNvbnRlbnQgOiBjaGlsZHJlbik7XG59XG5cbkl0ZW1IZWFkZXIuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIl07XG5JdGVtSGVhZGVyLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5JdGVtSGVhZGVyLmNyZWF0ZSA9IGNyZWF0ZVNob3J0aGFuZEZhY3RvcnkoSXRlbUhlYWRlciwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IEl0ZW1IZWFkZXI7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IEltYWdlIGZyb20gJy4uLy4uL2VsZW1lbnRzL0ltYWdlJztcbi8qKlxuICogQW4gaXRlbSBjYW4gY29udGFpbiBhbiBpbWFnZS5cbiAqL1xuXG5mdW5jdGlvbiBJdGVtSW1hZ2UocHJvcHMpIHtcbiAgdmFyIHNpemUgPSBwcm9wcy5zaXplO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKEl0ZW1JbWFnZSwgcHJvcHMpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSW1hZ2UsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgc2l6ZTogc2l6ZSxcbiAgICB1aTogISFzaXplLFxuICAgIHdyYXBwZWQ6IHRydWVcbiAgfSkpO1xufVxuXG5JdGVtSW1hZ2UuaGFuZGxlZFByb3BzID0gW1wic2l6ZVwiXTtcbkl0ZW1JbWFnZS5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBpbWFnZSBtYXkgYXBwZWFyIGF0IGRpZmZlcmVudCBzaXplcy4gKi9cbiAgc2l6ZTogSW1hZ2UucHJvcFR5cGVzLnNpemVcbn0gOiB7fTtcbkl0ZW1JbWFnZS5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KEl0ZW1JbWFnZSwgZnVuY3Rpb24gKHNyYykge1xuICByZXR1cm4ge1xuICAgIHNyYzogc3JjXG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IEl0ZW1JbWFnZTsiLCJpbXBvcnQgX2V4dGVuZHMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHNcIjtcbmltcG9ydCBjeCBmcm9tICdjbHN4JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY2hpbGRyZW5VdGlscywgY3JlYXRlU2hvcnRoYW5kRmFjdG9yeSwgY3VzdG9tUHJvcFR5cGVzLCBnZXRFbGVtZW50VHlwZSwgZ2V0VW5oYW5kbGVkUHJvcHMgfSBmcm9tICcuLi8uLi9saWInO1xuLyoqXG4gKiBBbiBpdGVtIGNhbiBjb250YWluIGNvbnRlbnQgbWV0YWRhdGEuXG4gKi9cblxuZnVuY3Rpb24gSXRlbU1ldGEocHJvcHMpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudDtcbiAgdmFyIGNsYXNzZXMgPSBjeCgnbWV0YScsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoSXRlbU1ldGEsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoSXRlbU1ldGEsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5JdGVtTWV0YS5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcbkl0ZW1NZXRhLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5JdGVtTWV0YS5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KEl0ZW1NZXRhLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgSXRlbU1ldGE7IiwiaW1wb3J0IF9kZWZhdWx0IGZyb20gJy4vSXRlbSc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCBTVUksIHVzZUtleU9ubHksIHVzZVZhbHVlQW5kS2V5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCBTdGF0aXN0aWNHcm91cCBmcm9tICcuL1N0YXRpc3RpY0dyb3VwJztcbmltcG9ydCBTdGF0aXN0aWNMYWJlbCBmcm9tICcuL1N0YXRpc3RpY0xhYmVsJztcbmltcG9ydCBTdGF0aXN0aWNWYWx1ZSBmcm9tICcuL1N0YXRpc3RpY1ZhbHVlJztcbi8qKlxuICogQSBzdGF0aXN0aWMgZW1waGFzaXplcyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuXG4gKi9cblxuZnVuY3Rpb24gU3RhdGlzdGljKHByb3BzKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuLFxuICAgICAgY2xhc3NOYW1lID0gcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgY29sb3IgPSBwcm9wcy5jb2xvcixcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgZmxvYXRlZCA9IHByb3BzLmZsb2F0ZWQsXG4gICAgICBob3Jpem9udGFsID0gcHJvcHMuaG9yaXpvbnRhbCxcbiAgICAgIGludmVydGVkID0gcHJvcHMuaW52ZXJ0ZWQsXG4gICAgICBsYWJlbCA9IHByb3BzLmxhYmVsLFxuICAgICAgc2l6ZSA9IHByb3BzLnNpemUsXG4gICAgICB0ZXh0ID0gcHJvcHMudGV4dCxcbiAgICAgIHZhbHVlID0gcHJvcHMudmFsdWU7XG4gIHZhciBjbGFzc2VzID0gY3goJ3VpJywgY29sb3IsIHNpemUsIHVzZVZhbHVlQW5kS2V5KGZsb2F0ZWQsICdmbG9hdGVkJyksIHVzZUtleU9ubHkoaG9yaXpvbnRhbCwgJ2hvcml6b250YWwnKSwgdXNlS2V5T25seShpbnZlcnRlZCwgJ2ludmVydGVkJyksICdzdGF0aXN0aWMnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFN0YXRpc3RpYywgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTdGF0aXN0aWMsIHByb3BzKTtcblxuICBpZiAoIWNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNoaWxkcmVuKTtcbiAgfVxuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjb250ZW50KSkge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICAgIH0pLCBjb250ZW50KTtcbiAgfVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIFN0YXRpc3RpY1ZhbHVlLmNyZWF0ZSh2YWx1ZSwge1xuICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgdGV4dDogdGV4dFxuICAgIH0sXG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSwgU3RhdGlzdGljTGFiZWwuY3JlYXRlKGxhYmVsLCB7XG4gICAgYXV0b0dlbmVyYXRlS2V5OiBmYWxzZVxuICB9KSk7XG59XG5cblN0YXRpc3RpYy5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb250ZW50XCIsIFwiZmxvYXRlZFwiLCBcImhvcml6b250YWxcIiwgXCJpbnZlcnRlZFwiLCBcImxhYmVsXCIsIFwic2l6ZVwiLCBcInRleHRcIiwgXCJ2YWx1ZVwiXTtcblN0YXRpc3RpYy5wcm9wVHlwZXMgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB7XG4gIC8qKiBBbiBlbGVtZW50IHR5cGUgdG8gcmVuZGVyIGFzIChzdHJpbmcgb3IgZnVuY3Rpb24pLiAqL1xuICBhczogUHJvcFR5cGVzLmVsZW1lbnRUeXBlLFxuXG4gIC8qKiBQcmltYXJ5IGNvbnRlbnQuICovXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMubm9kZSxcblxuICAvKiogQWRkaXRpb25hbCBjbGFzc2VzLiAqL1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG5cbiAgLyoqIEEgc3RhdGlzdGljIGNhbiBiZSBmb3JtYXR0ZWQgdG8gYmUgZGlmZmVyZW50IGNvbG9ycy4gKi9cbiAgY29sb3I6IFByb3BUeXBlcy5vbmVPZihTVUkuQ09MT1JTKSxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIHN0YXRpc3RpYyBjYW4gc2l0IHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IG9mIG90aGVyIGNvbnRlbnQuICovXG4gIGZsb2F0ZWQ6IFByb3BUeXBlcy5vbmVPZihTVUkuRkxPQVRTKSxcblxuICAvKiogQSBzdGF0aXN0aWMgY2FuIHByZXNlbnQgaXRzIG1lYXN1cmVtZW50IGhvcml6b250YWxseS4gKi9cbiAgaG9yaXpvbnRhbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgc3RhdGlzdGljIGNhbiBiZSBmb3JtYXR0ZWQgdG8gZml0IG9uIGEgZGFyayBiYWNrZ3JvdW5kLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIExhYmVsIGNvbnRlbnQgb2YgdGhlIFN0YXRpc3RpYy4gKi9cbiAgbGFiZWw6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kLFxuXG4gIC8qKiBBIHN0YXRpc3RpYyBjYW4gdmFyeSBpbiBzaXplLiAqL1xuICBzaXplOiBQcm9wVHlwZXMub25lT2YoX3dpdGhvdXQoU1VJLlNJWkVTLCAnYmlnJywgJ21hc3NpdmUnLCAnbWVkaXVtJykpLFxuXG4gIC8qKiBGb3JtYXQgdGhlIFN0YXRpc3RpY1ZhbHVlIHdpdGggc21hbGxlciBmb250IHNpemUgdG8gZml0IG5pY2VseSBiZXNpZGUgbnVtYmVyIHZhbHVlcy4gKi9cbiAgdGV4dDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIFZhbHVlIGNvbnRlbnQgb2YgdGhlIFN0YXRpc3RpYy4gKi9cbiAgdmFsdWU6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5TdGF0aXN0aWMuR3JvdXAgPSBTdGF0aXN0aWNHcm91cDtcblN0YXRpc3RpYy5MYWJlbCA9IFN0YXRpc3RpY0xhYmVsO1xuU3RhdGlzdGljLlZhbHVlID0gU3RhdGlzdGljVmFsdWU7XG5TdGF0aXN0aWMuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShTdGF0aXN0aWMsIGZ1bmN0aW9uIChjb250ZW50KSB7XG4gIHJldHVybiB7XG4gICAgY29udGVudDogY29udGVudFxuICB9O1xufSk7XG5leHBvcnQgZGVmYXVsdCBTdGF0aXN0aWM7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgX3dpdGhvdXQgZnJvbSBcImxvZGFzaC1lcy93aXRob3V0XCI7XG5pbXBvcnQgX21hcCBmcm9tIFwibG9kYXNoLWVzL21hcFwiO1xuaW1wb3J0IGN4IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBjaGlsZHJlblV0aWxzLCBjdXN0b21Qcm9wVHlwZXMsIGdldEVsZW1lbnRUeXBlLCBnZXRVbmhhbmRsZWRQcm9wcywgU1VJLCB1c2VLZXlPbmx5LCB1c2VXaWR0aFByb3AgfSBmcm9tICcuLi8uLi9saWInO1xuaW1wb3J0IFN0YXRpc3RpYyBmcm9tICcuL1N0YXRpc3RpYyc7XG4vKipcbiAqIEEgZ3JvdXAgb2Ygc3RhdGlzdGljcy5cbiAqL1xuXG5mdW5jdGlvbiBTdGF0aXN0aWNHcm91cChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbG9yID0gcHJvcHMuY29sb3IsXG4gICAgICBjb250ZW50ID0gcHJvcHMuY29udGVudCxcbiAgICAgIGhvcml6b250YWwgPSBwcm9wcy5ob3Jpem9udGFsLFxuICAgICAgaW52ZXJ0ZWQgPSBwcm9wcy5pbnZlcnRlZCxcbiAgICAgIGl0ZW1zID0gcHJvcHMuaXRlbXMsXG4gICAgICBzaXplID0gcHJvcHMuc2l6ZSxcbiAgICAgIHdpZHRocyA9IHByb3BzLndpZHRocztcbiAgdmFyIGNsYXNzZXMgPSBjeCgndWknLCBjb2xvciwgc2l6ZSwgdXNlS2V5T25seShob3Jpem9udGFsLCAnaG9yaXpvbnRhbCcpLCB1c2VLZXlPbmx5KGludmVydGVkLCAnaW52ZXJ0ZWQnKSwgdXNlV2lkdGhQcm9wKHdpZHRocyksICdzdGF0aXN0aWNzJywgY2xhc3NOYW1lKTtcbiAgdmFyIHJlc3QgPSBnZXRVbmhhbmRsZWRQcm9wcyhTdGF0aXN0aWNHcm91cCwgcHJvcHMpO1xuICB2YXIgRWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZShTdGF0aXN0aWNHcm91cCwgcHJvcHMpO1xuXG4gIGlmICghY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikpIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRWxlbWVudFR5cGUsIF9leHRlbmRzKHt9LCByZXN0LCB7XG4gICAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgICB9KSwgY2hpbGRyZW4pO1xuICB9XG5cbiAgaWYgKCFjaGlsZHJlblV0aWxzLmlzTmlsKGNvbnRlbnQpKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgICAgY2xhc3NOYW1lOiBjbGFzc2VzXG4gICAgfSksIGNvbnRlbnQpO1xuICB9XG5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgX21hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICByZXR1cm4gU3RhdGlzdGljLmNyZWF0ZShpdGVtKTtcbiAgfSkpO1xufVxuXG5TdGF0aXN0aWNHcm91cC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29sb3JcIiwgXCJjb250ZW50XCIsIFwiaG9yaXpvbnRhbFwiLCBcImludmVydGVkXCIsIFwiaXRlbXNcIiwgXCJzaXplXCIsIFwid2lkdGhzXCJdO1xuU3RhdGlzdGljR3JvdXAucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBBIHN0YXRpc3RpYyBncm91cCBjYW4gYmUgZm9ybWF0dGVkIHRvIGJlIGRpZmZlcmVudCBjb2xvcnMuICovXG4gIGNvbG9yOiBQcm9wVHlwZXMub25lT2YoU1VJLkNPTE9SUyksXG5cbiAgLyoqIFNob3J0aGFuZCBmb3IgcHJpbWFyeSBjb250ZW50LiAqL1xuICBjb250ZW50OiBjdXN0b21Qcm9wVHlwZXMuY29udGVudFNob3J0aGFuZCxcblxuICAvKiogQSBzdGF0aXN0aWMgZ3JvdXAgY2FuIHByZXNlbnQgaXRzIG1lYXN1cmVtZW50IGhvcml6b250YWxseS4gKi9cbiAgaG9yaXpvbnRhbDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEEgc3RhdGlzdGljIGdyb3VwIGNhbiBiZSBmb3JtYXR0ZWQgdG8gZml0IG9uIGEgZGFyayBiYWNrZ3JvdW5kLiAqL1xuICBpbnZlcnRlZDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLyoqIEFycmF5IG9mIHByb3BzIGZvciBTdGF0aXN0aWMuICovXG4gIGl0ZW1zOiBjdXN0b21Qcm9wVHlwZXMuY29sbGVjdGlvblNob3J0aGFuZCxcblxuICAvKiogQSBzdGF0aXN0aWMgZ3JvdXAgY2FuIHZhcnkgaW4gc2l6ZS4gKi9cbiAgc2l6ZTogUHJvcFR5cGVzLm9uZU9mKF93aXRob3V0KFNVSS5TSVpFUywgJ2JpZycsICdtYXNzaXZlJywgJ21lZGl1bScpKSxcblxuICAvKiogQSBzdGF0aXN0aWMgZ3JvdXAgY2FuIGhhdmUgaXRzIGl0ZW1zIGRpdmlkZWQgZXZlbmx5LiAqL1xuICB3aWR0aHM6IFByb3BUeXBlcy5vbmVPZihTVUkuV0lEVEhTKVxufSA6IHt9O1xuZXhwb3J0IGRlZmF1bHQgU3RhdGlzdGljR3JvdXA7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzIH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBzdGF0aXN0aWMgY2FuIGNvbnRhaW4gYSBsYWJlbCB0byBoZWxwIHByb3ZpZGUgY29udGV4dCBmb3IgdGhlIHByZXNlbnRlZCB2YWx1ZS5cbiAqL1xuXG5mdW5jdGlvbiBTdGF0aXN0aWNMYWJlbChwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50O1xuICB2YXIgY2xhc3NlcyA9IGN4KCdsYWJlbCcsIGNsYXNzTmFtZSk7XG4gIHZhciByZXN0ID0gZ2V0VW5oYW5kbGVkUHJvcHMoU3RhdGlzdGljTGFiZWwsIHByb3BzKTtcbiAgdmFyIEVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudFR5cGUoU3RhdGlzdGljTGFiZWwsIHByb3BzKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEVsZW1lbnRUeXBlLCBfZXh0ZW5kcyh7fSwgcmVzdCwge1xuICAgIGNsYXNzTmFtZTogY2xhc3Nlc1xuICB9KSwgY2hpbGRyZW5VdGlscy5pc05pbChjaGlsZHJlbikgPyBjb250ZW50IDogY2hpbGRyZW4pO1xufVxuXG5TdGF0aXN0aWNMYWJlbC5oYW5kbGVkUHJvcHMgPSBbXCJhc1wiLCBcImNoaWxkcmVuXCIsIFwiY2xhc3NOYW1lXCIsIFwiY29udGVudFwiXTtcblN0YXRpc3RpY0xhYmVsLnByb3BUeXBlcyA9IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHtcbiAgLyoqIEFuIGVsZW1lbnQgdHlwZSB0byByZW5kZXIgYXMgKHN0cmluZyBvciBmdW5jdGlvbikuICovXG4gIGFzOiBQcm9wVHlwZXMuZWxlbWVudFR5cGUsXG5cbiAgLyoqIFByaW1hcnkgY29udGVudC4gKi9cbiAgY2hpbGRyZW46IFByb3BUeXBlcy5ub2RlLFxuXG4gIC8qKiBBZGRpdGlvbmFsIGNsYXNzZXMuICovXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcblxuICAvKiogU2hvcnRoYW5kIGZvciBwcmltYXJ5IGNvbnRlbnQuICovXG4gIGNvbnRlbnQ6IGN1c3RvbVByb3BUeXBlcy5jb250ZW50U2hvcnRoYW5kXG59IDoge307XG5TdGF0aXN0aWNMYWJlbC5jcmVhdGUgPSBjcmVhdGVTaG9ydGhhbmRGYWN0b3J5KFN0YXRpc3RpY0xhYmVsLCBmdW5jdGlvbiAoY29udGVudCkge1xuICByZXR1cm4ge1xuICAgIGNvbnRlbnQ6IGNvbnRlbnRcbiAgfTtcbn0pO1xuZXhwb3J0IGRlZmF1bHQgU3RhdGlzdGljTGFiZWw7IiwiaW1wb3J0IF9leHRlbmRzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9leHRlbmRzXCI7XG5pbXBvcnQgY3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNoaWxkcmVuVXRpbHMsIGNyZWF0ZVNob3J0aGFuZEZhY3RvcnksIGN1c3RvbVByb3BUeXBlcywgZ2V0RWxlbWVudFR5cGUsIGdldFVuaGFuZGxlZFByb3BzLCB1c2VLZXlPbmx5IH0gZnJvbSAnLi4vLi4vbGliJztcbi8qKlxuICogQSBzdGF0aXN0aWMgY2FuIGNvbnRhaW4gYSBudW1lcmljLCBpY29uLCBpbWFnZSwgb3IgdGV4dCB2YWx1ZS5cbiAqL1xuXG5mdW5jdGlvbiBTdGF0aXN0aWNWYWx1ZShwcm9wcykge1xuICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgIGNvbnRlbnQgPSBwcm9wcy5jb250ZW50LFxuICAgICAgdGV4dCA9IHByb3BzLnRleHQ7XG4gIHZhciBjbGFzc2VzID0gY3godXNlS2V5T25seSh0ZXh0LCAndGV4dCcpLCAndmFsdWUnLCBjbGFzc05hbWUpO1xuICB2YXIgcmVzdCA9IGdldFVuaGFuZGxlZFByb3BzKFN0YXRpc3RpY1ZhbHVlLCBwcm9wcyk7XG4gIHZhciBFbGVtZW50VHlwZSA9IGdldEVsZW1lbnRUeXBlKFN0YXRpc3RpY1ZhbHVlLCBwcm9wcyk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChFbGVtZW50VHlwZSwgX2V4dGVuZHMoe30sIHJlc3QsIHtcbiAgICBjbGFzc05hbWU6IGNsYXNzZXNcbiAgfSksIGNoaWxkcmVuVXRpbHMuaXNOaWwoY2hpbGRyZW4pID8gY29udGVudCA6IGNoaWxkcmVuKTtcbn1cblxuU3RhdGlzdGljVmFsdWUuaGFuZGxlZFByb3BzID0gW1wiYXNcIiwgXCJjaGlsZHJlblwiLCBcImNsYXNzTmFtZVwiLCBcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdO1xuU3RhdGlzdGljVmFsdWUucHJvcFR5cGVzID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8ge1xuICAvKiogQW4gZWxlbWVudCB0eXBlIHRvIHJlbmRlciBhcyAoc3RyaW5nIG9yIGZ1bmN0aW9uKS4gKi9cbiAgYXM6IFByb3BUeXBlcy5lbGVtZW50VHlwZSxcblxuICAvKiogUHJpbWFyeSBjb250ZW50LiAqL1xuICBjaGlsZHJlbjogUHJvcFR5cGVzLm5vZGUsXG5cbiAgLyoqIEFkZGl0aW9uYWwgY2xhc3Nlcy4gKi9cbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuXG4gIC8qKiBTaG9ydGhhbmQgZm9yIHByaW1hcnkgY29udGVudC4gKi9cbiAgY29udGVudDogY3VzdG9tUHJvcFR5cGVzLmNvbnRlbnRTaG9ydGhhbmQsXG5cbiAgLyoqIEZvcm1hdCB0aGUgdmFsdWUgd2l0aCBzbWFsbGVyIGZvbnQgc2l6ZSB0byBmaXQgbmljZWx5IGJlc2lkZSBudW1iZXIgdmFsdWVzLiAqL1xuICB0ZXh0OiBQcm9wVHlwZXMuYm9vbFxufSA6IHt9O1xuU3RhdGlzdGljVmFsdWUuY3JlYXRlID0gY3JlYXRlU2hvcnRoYW5kRmFjdG9yeShTdGF0aXN0aWNWYWx1ZSwgZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBjb250ZW50XG4gIH07XG59KTtcbmV4cG9ydCBkZWZhdWx0IFN0YXRpc3RpY1ZhbHVlOyIsImltcG9ydCBfZGVmYXVsdCBmcm9tICcuL1N0YXRpc3RpYyc7XG5leHBvcnQgeyBfZGVmYXVsdCBhcyBkZWZhdWx0IH07IiwiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAoX19ERVZfXykge1xuICB2YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24gcHJpbnRXYXJuaW5nKGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMSA/IGxlbiAtIDEgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAxOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDFdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSk7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfVxuXG4gIHdhcm5pbmcgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYXJncykge1xuICAgIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuID4gMiA/IGxlbiAtIDIgOiAwKTtcbiAgICBmb3IgKHZhciBrZXkgPSAyOyBrZXkgPCBsZW47IGtleSsrKSB7XG4gICAgICBhcmdzW2tleSAtIDJdID0gYXJndW1lbnRzW2tleV07XG4gICAgfVxuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICBwcmludFdhcm5pbmcuYXBwbHkobnVsbCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbiIsImltcG9ydCB7IEZvcm1FdmVudCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgQnV0dG9uLCBDb250YWluZXIsIEZvcm0sIElucHV0IH0gZnJvbSAnc2VtYW50aWMtdWktcmVhY3QnO1xyXG5pbXBvcnQgeyB2ZXJpZnlFdGhBZGRyZXNzIH0gZnJvbSAnLi4vdXRpbCc7XHJcbmltcG9ydCBGYXVjZXQgZnJvbSAnLi4vYXJ0aWZhY3RzL2NvbnRyYWN0cy9GYXVjZXQuc29sL0ZhdWNldC5qc29uJztcclxuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcclxuXHJcbmRlY2xhcmUgY29uc3Qgd2luZG93OiBhbnk7XHJcblxyXG50eXBlIFByb3BzID0ge1xyXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gSG9tZSh7IGNvbnRyYWN0QWRkcmVzcyB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgY29uc3QgW3RvdWNoZWQsIHNldFRvdWNoZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc1ZhbGlkLCBzZXRJc1ZhbGlkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcclxuICBjb25zdCBbY29udHJhY3RCYWxhbmNlLCBzZXRDb250cmFjdEJhbGFuY2VdID0gdXNlU3RhdGU8c3RyaW5nPigpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHNldFRvdWNoZWQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SXNWYWxpZCh2ZXJpZnlFdGhBZGRyZXNzKHZhbHVlKSk7XHJcbiAgfSwgW3ZhbHVlXSk7XHJcblxyXG4gIGNvbnN0IG9uU3VibWl0ID0gYXN5bmMgKGU6IEZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBhd2FpdCByZXF1ZXN0RnVuZHMoKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBnZXRDb250cmFjdEJhbGFuY2UgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5ldGhlcmV1bSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZXRoZXJzLnByb3ZpZGVycy5XZWIzUHJvdmlkZXIod2luZG93LmV0aGVyZXVtKTtcclxuICAgICAgY29uc3QgY29udHJhY3RCYWxhbmNlID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmFsYW5jZShjb250cmFjdEFkZHJlc3MpO1xyXG4gICAgICByZXR1cm4gY29udHJhY3RCYWxhbmNlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcmVxdWVzdEZ1bmRzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZXRoZXJldW0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGF3YWl0IHdpbmRvdy5ldGhlcmV1bS5yZXF1ZXN0KHtcclxuICAgICAgICBtZXRob2Q6ICdldGhfcmVxdWVzdEFjY291bnRzJyxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGV0aGVycy5wcm92aWRlcnMuV2ViM1Byb3ZpZGVyKHdpbmRvdy5ldGhlcmV1bSk7XHJcbiAgICAgIGNvbnN0IHNpZ25lciA9IHByb3ZpZGVyLmdldFNpZ25lcigpO1xyXG4gICAgICBjb25zdCBjb250cmFjdCA9IG5ldyBldGhlcnMuQ29udHJhY3QoY29udHJhY3RBZGRyZXNzLCBGYXVjZXQuYWJpLCBzaWduZXIpO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IGNvbnRyYWN0LndpdGhkcmF3KHZhbHVlKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2Vzc2Z1bGx5IHdpdGhkcmF3ZWQgZnVuZHMnKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yOiAnLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh3aW5kb3cuZXRoZXJldW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBnZXRDb250cmFjdEJhbGFuY2UoKS50aGVuKChiYWwpID0+IHNldENvbnRyYWN0QmFsYW5jZShiYWwpKTtcclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8Q29udGFpbmVyPlxyXG4gICAgICA8Rm9ybSBvblN1Ym1pdD17b25TdWJtaXR9PlxyXG4gICAgICAgIDxoMT5Sb3BzdGVuIEZhdWNldDwvaDE+XHJcbiAgICAgICAgPEZvcm0uRmllbGQgZXJyb3I9e3RvdWNoZWQgJiYgIWlzVmFsaWR9PlxyXG4gICAgICAgICAgPGxhYmVsPllvdXIgUm9wc3RlbiB3YWxsZXQgYWRkcmVzczwvbGFiZWw+XHJcbiAgICAgICAgICA8SW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICB2YWx1ZT17dmFsdWV9XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L0Zvcm0uRmllbGQ+XHJcbiAgICAgICAgPEJ1dHRvbiBwcmltYXJ5PlJlcXVlc3QgRXRoZXI8L0J1dHRvbj5cclxuICAgICAgPC9Gb3JtPlxyXG4gICAgICA8c3Bhbj5cclxuICAgICAgICBDb250cmFjdCBiYWxhbmNlIC0ge3BhcnNlSW50KGNvbnRyYWN0QmFsYW5jZSB8fCAnJykgLyBNYXRoLnBvdygxMCwgMTgpfXsnICd9XHJcbiAgICAgICAgZXRoZXJcclxuICAgICAgPC9zcGFuPlxyXG4gICAgPC9Db250YWluZXI+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YXRpY1Byb3BzKCkge1xyXG4gIHJldHVybiB7XHJcbiAgICBwcm9wczoge1xyXG4gICAgICBjb250cmFjdEFkZHJlc3M6IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0NPTlRSQUNUX0FERFJFU1MsXHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhvbWU7XHJcbiIsImV4cG9ydCBjb25zdCB2ZXJpZnlFdGhBZGRyZXNzID0gKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xyXG4gIGNvbnN0IHJlZ2V4ID0gL14weFthLWZBLUYwLTldezQwfSQvO1xyXG4gIHJldHVybiByZWdleC50ZXN0KGFkZHJlc3MpO1xyXG59O1xyXG4iLCIvKiAoaWdub3JlZCkgKi8iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/.next/static/chunks/polyfills.js b/.next/static/chunks/polyfills.js new file mode 100644 index 0000000..555473b --- /dev/null +++ b/.next/static/chunks/polyfills.js @@ -0,0 +1,257 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["polyfills"],{ + +/***/ "./node_modules/next/dist/build/polyfills/polyfill-nomodule.js": +/*!*********************************************************************!*\ + !*** ./node_modules/next/dist/build/polyfills/polyfill-nomodule.js ***! + \*********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(global) {!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var r=function(t){return t&&t.Math==Math&&t},n=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof t&&t)||Function("return this")(),o=function(t){try{return!!t()}catch(t){return!0}},i=!o(function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}),a={}.propertyIsEnumerable,u=Object.getOwnPropertyDescriptor,s={f:u&&!a.call({1:2},1)?function(t){var e=u(this,t);return!!e&&e.enumerable}:a},c=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},f={}.toString,l=function(t){return f.call(t).slice(8,-1)},h="".split,p=o(function(){return!Object("z").propertyIsEnumerable(0)})?function(t){return"String"==l(t)?h.call(t,""):Object(t)}:Object,d=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},v=function(t){return p(d(t))},g=function(t){return"object"==typeof t?null!==t:"function"==typeof t},y=function(t,e){if(!g(t))return t;var r,n;if(e&&"function"==typeof(r=t.toString)&&!g(n=r.call(t)))return n;if("function"==typeof(r=t.valueOf)&&!g(n=r.call(t)))return n;if(!e&&"function"==typeof(r=t.toString)&&!g(n=r.call(t)))return n;throw TypeError("Can't convert object to primitive value")},m={}.hasOwnProperty,b=function(t,e){return m.call(t,e)},w=n.document,S=g(w)&&g(w.createElement),E=function(t){return S?w.createElement(t):{}},x=!i&&!o(function(){return 7!=Object.defineProperty(E("div"),"a",{get:function(){return 7}}).a}),A=Object.getOwnPropertyDescriptor,O={f:i?A:function(t,e){if(t=v(t),e=y(e,!0),x)try{return A(t,e)}catch(t){}if(b(t,e))return c(!s.f.call(t,e),t[e])}},R=function(t){if(!g(t))throw TypeError(String(t)+" is not an object");return t},j=Object.defineProperty,P={f:i?j:function(t,e,r){if(R(t),e=y(e,!0),R(r),x)try{return j(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},I=i?function(t,e,r){return P.f(t,e,c(1,r))}:function(t,e,r){return t[e]=r,t},T=function(t,e){try{I(n,t,e)}catch(r){n[t]=e}return e},k="__core-js_shared__",L=n[k]||T(k,{}),U=Function.toString;"function"!=typeof L.inspectSource&&(L.inspectSource=function(t){return U.call(t)});var M,_,N,C=L.inspectSource,F=n.WeakMap,B="function"==typeof F&&/native code/.test(C(F)),D=!1,q=e(function(t){(t.exports=function(t,e){return L[t]||(L[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})}),z=0,W=Math.random(),K=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++z+W).toString(36)},G=q("keys"),$=function(t){return G[t]||(G[t]=K(t))},V={};if(B){var H=new(0,n.WeakMap),X=H.get,Y=H.has,J=H.set;M=function(t,e){return J.call(H,t,e),e},_=function(t){return X.call(H,t)||{}},N=function(t){return Y.call(H,t)}}else{var Q=$("state");V[Q]=!0,M=function(t,e){return I(t,Q,e),e},_=function(t){return b(t,Q)?t[Q]:{}},N=function(t){return b(t,Q)}}var Z,tt={set:M,get:_,has:N,enforce:function(t){return N(t)?_(t):M(t,{})},getterFor:function(t){return function(e){var r;if(!g(e)||(r=_(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},et=e(function(t){var e=tt.get,r=tt.enforce,o=String(String).split("String");(t.exports=function(t,e,i,a){var u=!!a&&!!a.unsafe,s=!!a&&!!a.enumerable,c=!!a&&!!a.noTargetGet;"function"==typeof i&&("string"!=typeof e||b(i,"name")||I(i,"name",e),r(i).source=o.join("string"==typeof e?e:"")),t!==n?(u?!c&&t[e]&&(s=!0):delete t[e],s?t[e]=i:I(t,e,i)):s?t[e]=i:T(e,i)})(Function.prototype,"toString",function(){return"function"==typeof this&&e(this).source||C(this)})}),rt=n,nt=function(t){return"function"==typeof t?t:void 0},ot=function(t,e){return arguments.length<2?nt(rt[t])||nt(n[t]):rt[t]&&rt[t][e]||n[t]&&n[t][e]},it=Math.ceil,at=Math.floor,ut=function(t){return isNaN(t=+t)?0:(t>0?at:it)(t)},st=Math.min,ct=function(t){return t>0?st(ut(t),9007199254740991):0},ft=Math.max,lt=Math.min,ht=function(t,e){var r=ut(t);return r<0?ft(r+e,0):lt(r,e)},pt=function(t){return function(e,r,n){var o,i=v(e),a=ct(i.length),u=ht(n,a);if(t&&r!=r){for(;a>u;)if((o=i[u++])!=o)return!0}else for(;a>u;u++)if((t||u in i)&&i[u]===r)return t||u||0;return!t&&-1}},dt={includes:pt(!0),indexOf:pt(!1)},vt=dt.indexOf,gt=function(t,e){var r,n=v(t),o=0,i=[];for(r in n)!b(V,r)&&b(n,r)&&i.push(r);for(;e.length>o;)b(n,r=e[o++])&&(~vt(i,r)||i.push(r));return i},yt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],mt=yt.concat("length","prototype"),bt={f:Object.getOwnPropertyNames||function(t){return gt(t,mt)}},wt={f:Object.getOwnPropertySymbols},St=ot("Reflect","ownKeys")||function(t){var e=bt.f(R(t)),r=wt.f;return r?e.concat(r(t)):e},Et=function(t,e){for(var r=St(e),n=P.f,o=O.f,i=0;i<r.length;i++){var a=r[i];b(t,a)||n(t,a,o(e,a))}},xt=/#|\.prototype\./,At=function(t,e){var r=Rt[Ot(t)];return r==Pt||r!=jt&&("function"==typeof e?o(e):!!e)},Ot=At.normalize=function(t){return String(t).replace(xt,".").toLowerCase()},Rt=At.data={},jt=At.NATIVE="N",Pt=At.POLYFILL="P",It=At,Tt=O.f,kt=function(t,e){var r,o,i,a,u,s=t.target,c=t.global,f=t.stat;if(r=c?n:f?n[s]||T(s,{}):(n[s]||{}).prototype)for(o in e){if(a=e[o],i=t.noTargetGet?(u=Tt(r,o))&&u.value:r[o],!It(c?o:s+(f?".":"#")+o,t.forced)&&void 0!==i){if(typeof a==typeof i)continue;Et(a,i)}(t.sham||i&&i.sham)&&I(a,"sham",!0),et(r,o,a,t)}},Lt=function(t){return Object(d(t))},Ut=Math.min,Mt=[].copyWithin||function(t,e){var r=Lt(this),n=ct(r.length),o=ht(t,n),i=ht(e,n),a=arguments.length>2?arguments[2]:void 0,u=Ut((void 0===a?n:ht(a,n))-i,n-o),s=1;for(i<o&&o<i+u&&(s=-1,i+=u-1,o+=u-1);u-- >0;)i in r?r[o]=r[i]:delete r[o],o+=s,i+=s;return r},_t=!!Object.getOwnPropertySymbols&&!o(function(){return!String(Symbol())}),Nt=_t&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Ct=q("wks"),Ft=n.Symbol,Bt=Nt?Ft:Ft&&Ft.withoutSetter||K,Dt=function(t){return b(Ct,t)||(Ct[t]=_t&&b(Ft,t)?Ft[t]:Bt("Symbol."+t)),Ct[t]},qt=Object.keys||function(t){return gt(t,yt)},zt=i?Object.defineProperties:function(t,e){R(t);for(var r,n=qt(e),o=n.length,i=0;o>i;)P.f(t,r=n[i++],e[r]);return t},Wt=ot("document","documentElement"),Kt=$("IE_PROTO"),Gt=function(){},$t=function(t){return"<script>"+t+"<\/script>"},Vt=function(){try{Z=document.domain&&new ActiveXObject("htmlfile")}catch(t){}var t,e;Vt=Z?function(t){t.write($t("")),t.close();var e=t.parentWindow.Object;return t=null,e}(Z):((e=E("iframe")).style.display="none",Wt.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write($t("document.F=Object")),t.close(),t.F);for(var r=yt.length;r--;)delete Vt.prototype[yt[r]];return Vt()};V[Kt]=!0;var Ht=Object.create||function(t,e){var r;return null!==t?(Gt.prototype=R(t),r=new Gt,Gt.prototype=null,r[Kt]=t):r=Vt(),void 0===e?r:zt(r,e)},Xt=Dt("unscopables"),Yt=Array.prototype;null==Yt[Xt]&&P.f(Yt,Xt,{configurable:!0,value:Ht(null)});var Jt=function(t){Yt[Xt][t]=!0};kt({target:"Array",proto:!0},{copyWithin:Mt}),Jt("copyWithin");var Qt=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},Zt=function(t,e,r){if(Qt(t),void 0===e)return t;switch(r){case 0:return function(){return t.call(e)};case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,o){return t.call(e,r,n,o)}}return function(){return t.apply(e,arguments)}},te=Function.call,ee=function(t,e,r){return Zt(te,n[t].prototype[e],r)};ee("Array","copyWithin"),kt({target:"Array",proto:!0},{fill:function(t){for(var e=Lt(this),r=ct(e.length),n=arguments.length,o=ht(n>1?arguments[1]:void 0,r),i=n>2?arguments[2]:void 0,a=void 0===i?r:ht(i,r);a>o;)e[o++]=t;return e}}),Jt("fill"),ee("Array","fill");var re=Array.isArray||function(t){return"Array"==l(t)},ne=Dt("species"),oe=function(t,e){var r;return re(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!re(r.prototype)?g(r)&&null===(r=r[ne])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===e?0:e)},ie=[].push,ae=function(t){var e=1==t,r=2==t,n=3==t,o=4==t,i=6==t,a=5==t||i;return function(u,s,c,f){for(var l,h,d=Lt(u),v=p(d),g=Zt(s,c,3),y=ct(v.length),m=0,b=f||oe,w=e?b(u,y):r?b(u,0):void 0;y>m;m++)if((a||m in v)&&(h=g(l=v[m],m,d),t))if(e)w[m]=h;else if(h)switch(t){case 3:return!0;case 5:return l;case 6:return m;case 2:ie.call(w,l)}else if(o)return!1;return i?-1:n||o?o:w}},ue={forEach:ae(0),map:ae(1),filter:ae(2),some:ae(3),every:ae(4),find:ae(5),findIndex:ae(6)},se=Object.defineProperty,ce={},fe=function(t){throw t},le=function(t,e){if(b(ce,t))return ce[t];e||(e={});var r=[][t],n=!!b(e,"ACCESSORS")&&e.ACCESSORS,a=b(e,0)?e[0]:fe,u=b(e,1)?e[1]:void 0;return ce[t]=!!r&&!o(function(){if(n&&!i)return!0;var t={length:-1};n?se(t,1,{enumerable:!0,get:fe}):t[1]=1,r.call(t,a,u)})},he=ue.find,pe="find",de=!0,ve=le(pe);pe in[]&&Array(1).find(function(){de=!1}),kt({target:"Array",proto:!0,forced:de||!ve},{find:function(t){return he(this,t,arguments.length>1?arguments[1]:void 0)}}),Jt(pe),ee("Array","find");var ge=ue.findIndex,ye="findIndex",me=!0,be=le(ye);ye in[]&&Array(1).findIndex(function(){me=!1}),kt({target:"Array",proto:!0,forced:me||!be},{findIndex:function(t){return ge(this,t,arguments.length>1?arguments[1]:void 0)}}),Jt(ye),ee("Array","findIndex");var we=function t(e,r,n,o,i,a,u,s){for(var c,f=i,l=0,h=!!u&&Zt(u,s,3);l<o;){if(l in n){if(c=h?h(n[l],l,r):n[l],a>0&&re(c))f=t(e,r,c,ct(c.length),f,a-1)-1;else{if(f>=9007199254740991)throw TypeError("Exceed the acceptable array length");e[f]=c}f++}l++}return f};kt({target:"Array",proto:!0},{flatMap:function(t){var e,r=Lt(this),n=ct(r.length);return Qt(t),(e=oe(r,0)).length=we(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}}),Jt("flatMap"),ee("Array","flatMap"),kt({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=Lt(this),r=ct(e.length),n=oe(e,0);return n.length=we(n,e,e,r,0,void 0===t?1:ut(t)),n}}),Jt("flat"),ee("Array","flat");var Se,Ee,xe,Ae=function(t){return function(e,r){var n,o,i=String(d(e)),a=ut(r),u=i.length;return a<0||a>=u?t?"":void 0:(n=i.charCodeAt(a))<55296||n>56319||a+1===u||(o=i.charCodeAt(a+1))<56320||o>57343?t?i.charAt(a):n:t?i.slice(a,a+2):o-56320+(n-55296<<10)+65536}},Oe={codeAt:Ae(!1),charAt:Ae(!0)},Re=!o(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),je=$("IE_PROTO"),Pe=Object.prototype,Ie=Re?Object.getPrototypeOf:function(t){return t=Lt(t),b(t,je)?t[je]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?Pe:null},Te=Dt("iterator"),ke=!1;[].keys&&("next"in(xe=[].keys())?(Ee=Ie(Ie(xe)))!==Object.prototype&&(Se=Ee):ke=!0),null==Se&&(Se={}),b(Se,Te)||I(Se,Te,function(){return this});var Le={IteratorPrototype:Se,BUGGY_SAFARI_ITERATORS:ke},Ue=P.f,Me=Dt("toStringTag"),_e=function(t,e,r){t&&!b(t=r?t:t.prototype,Me)&&Ue(t,Me,{configurable:!0,value:e})},Ne={},Ce=Le.IteratorPrototype,Fe=function(){return this},Be=function(t,e,r){var n=e+" Iterator";return t.prototype=Ht(Ce,{next:c(1,r)}),_e(t,n,!1),Ne[n]=Fe,t},De=function(t){if(!g(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype");return t},qe=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,r={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(r,[]),e=r instanceof Array}catch(t){}return function(r,n){return R(r),De(n),e?t.call(r,n):r.__proto__=n,r}}():void 0),ze=Le.IteratorPrototype,We=Le.BUGGY_SAFARI_ITERATORS,Ke=Dt("iterator"),Ge="keys",$e="values",Ve="entries",He=function(){return this},Xe=function(t,e,r,n,o,i,a){Be(r,e,n);var u,s,c,f=function(t){if(t===o&&v)return v;if(!We&&t in p)return p[t];switch(t){case Ge:case $e:case Ve:return function(){return new r(this,t)}}return function(){return new r(this)}},l=e+" Iterator",h=!1,p=t.prototype,d=p[Ke]||p["@@iterator"]||o&&p[o],v=!We&&d||f(o),g="Array"==e&&p.entries||d;if(g&&(u=Ie(g.call(new t)),ze!==Object.prototype&&u.next&&(Ie(u)!==ze&&(qe?qe(u,ze):"function"!=typeof u[Ke]&&I(u,Ke,He)),_e(u,l,!0))),o==$e&&d&&d.name!==$e&&(h=!0,v=function(){return d.call(this)}),p[Ke]!==v&&I(p,Ke,v),Ne[e]=v,o)if(s={values:f($e),keys:i?v:f(Ge),entries:f(Ve)},a)for(c in s)(We||h||!(c in p))&&et(p,c,s[c]);else kt({target:e,proto:!0,forced:We||h},s);return s},Ye=Oe.charAt,Je="String Iterator",Qe=tt.set,Ze=tt.getterFor(Je);Xe(String,"String",function(t){Qe(this,{type:Je,string:String(t),index:0})},function(){var t,e=Ze(this),r=e.string,n=e.index;return n>=r.length?{value:void 0,done:!0}:(t=Ye(r,n),e.index+=t.length,{value:t,done:!1})});var tr=function(t,e,r,n){try{return n?e(R(r)[0],r[1]):e(r)}catch(e){var o=t.return;throw void 0!==o&&R(o.call(t)),e}},er=Dt("iterator"),rr=Array.prototype,nr=function(t){return void 0!==t&&(Ne.Array===t||rr[er]===t)},or=function(t,e,r){var n=y(e);n in t?P.f(t,n,c(0,r)):t[n]=r},ir={};ir[Dt("toStringTag")]="z";var ar="[object z]"===String(ir),ur=Dt("toStringTag"),sr="Arguments"==l(function(){return arguments}()),cr=ar?l:function(t){var e,r,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),ur))?r:sr?l(e):"Object"==(n=l(e))&&"function"==typeof e.callee?"Arguments":n},fr=Dt("iterator"),lr=function(t){if(null!=t)return t[fr]||t["@@iterator"]||Ne[cr(t)]},hr=function(t){var e,r,n,o,i,a,u=Lt(t),s="function"==typeof this?this:Array,c=arguments.length,f=c>1?arguments[1]:void 0,l=void 0!==f,h=lr(u),p=0;if(l&&(f=Zt(f,c>2?arguments[2]:void 0,2)),null==h||s==Array&&nr(h))for(r=new s(e=ct(u.length));e>p;p++)a=l?f(u[p],p):u[p],or(r,p,a);else for(i=(o=h.call(u)).next,r=new s;!(n=i.call(o)).done;p++)a=l?tr(o,f,[n.value,p],!0):n.value,or(r,p,a);return r.length=p,r},pr=Dt("iterator"),dr=!1;try{var vr=0,gr={next:function(){return{done:!!vr++}},return:function(){dr=!0}};gr[pr]=function(){return this},Array.from(gr,function(){throw 2})}catch(t){}var yr=function(t,e){if(!e&&!dr)return!1;var r=!1;try{var n={};n[pr]=function(){return{next:function(){return{done:r=!0}}}},t(n)}catch(t){}return r},mr=!yr(function(t){Array.from(t)});kt({target:"Array",stat:!0,forced:mr},{from:hr});var br=dt.includes,wr=le("indexOf",{ACCESSORS:!0,1:0});kt({target:"Array",proto:!0,forced:!wr},{includes:function(t){return br(this,t,arguments.length>1?arguments[1]:void 0)}}),Jt("includes"),ee("Array","includes");var Sr="Array Iterator",Er=tt.set,xr=tt.getterFor(Sr),Ar=Xe(Array,"Array",function(t,e){Er(this,{type:Sr,target:v(t),index:0,kind:e})},function(){var t=xr(this),e=t.target,r=t.kind,n=t.index++;return!e||n>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:e[n],done:!1}:{value:[n,e[n]],done:!1}},"values");Ne.Arguments=Ne.Array,Jt("keys"),Jt("values"),Jt("entries"),ee("Array","values");var Or=o(function(){function t(){}return!(Array.of.call(t)instanceof t)});kt({target:"Array",stat:!0,forced:Or},{of:function(){for(var t=0,e=arguments.length,r=new("function"==typeof this?this:Array)(e);e>t;)or(r,t,arguments[t++]);return r.length=e,r}});var Rr=Dt("hasInstance"),jr=Function.prototype;Rr in jr||P.f(jr,Rr,{value:function(t){if("function"!=typeof this||!g(t))return!1;if(!g(this.prototype))return t instanceof this;for(;t=Ie(t);)if(this.prototype===t)return!0;return!1}}),Dt("hasInstance");var Pr=Function.prototype,Ir=Pr.toString,Tr=/^\s*function ([^ (]*)/,kr="name";i&&!(kr in Pr)&&(0,P.f)(Pr,kr,{configurable:!0,get:function(){try{return Ir.call(this).match(Tr)[1]}catch(t){return""}}});var Lr=!o(function(){return Object.isExtensible(Object.preventExtensions({}))}),Ur=e(function(t){var e=P.f,r=K("meta"),n=0,o=Object.isExtensible||function(){return!0},i=function(t){e(t,r,{value:{objectID:"O"+ ++n,weakData:{}}})},a=t.exports={REQUIRED:!1,fastKey:function(t,e){if(!g(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!b(t,r)){if(!o(t))return"F";if(!e)return"E";i(t)}return t[r].objectID},getWeakData:function(t,e){if(!b(t,r)){if(!o(t))return!0;if(!e)return!1;i(t)}return t[r].weakData},onFreeze:function(t){return Lr&&a.REQUIRED&&o(t)&&!b(t,r)&&i(t),t}};V[r]=!0}),Mr=e(function(t){var e=function(t,e){this.stopped=t,this.result=e};(t.exports=function(t,r,n,o,i){var a,u,s,c,f,l,h,p=Zt(r,n,o?2:1);if(i)a=t;else{if("function"!=typeof(u=lr(t)))throw TypeError("Target is not iterable");if(nr(u)){for(s=0,c=ct(t.length);c>s;s++)if((f=o?p(R(h=t[s])[0],h[1]):p(t[s]))&&f instanceof e)return f;return new e(!1)}a=u.call(t)}for(l=a.next;!(h=l.call(a)).done;)if("object"==typeof(f=tr(a,p,h.value,o))&&f&&f instanceof e)return f;return new e(!1)}).stop=function(t){return new e(!0,t)}}),_r=function(t,e,r){if(!(t instanceof e))throw TypeError("Incorrect "+(r?r+" ":"")+"invocation");return t},Nr=function(t,e,r){var n,o;return qe&&"function"==typeof(n=e.constructor)&&n!==r&&g(o=n.prototype)&&o!==r.prototype&&qe(t,o),t},Cr=function(t,e,r){var i=-1!==t.indexOf("Map"),a=-1!==t.indexOf("Weak"),u=i?"set":"add",s=n[t],c=s&&s.prototype,f=s,l={},h=function(t){var e=c[t];et(c,t,"add"==t?function(t){return e.call(this,0===t?0:t),this}:"delete"==t?function(t){return!(a&&!g(t))&&e.call(this,0===t?0:t)}:"get"==t?function(t){return a&&!g(t)?void 0:e.call(this,0===t?0:t)}:"has"==t?function(t){return!(a&&!g(t))&&e.call(this,0===t?0:t)}:function(t,r){return e.call(this,0===t?0:t,r),this})};if(It(t,"function"!=typeof s||!(a||c.forEach&&!o(function(){(new s).entries().next()}))))f=r.getConstructor(e,t,i,u),Ur.REQUIRED=!0;else if(It(t,!0)){var p=new f,d=p[u](a?{}:-0,1)!=p,v=o(function(){p.has(1)}),y=yr(function(t){new s(t)}),m=!a&&o(function(){for(var t=new s,e=5;e--;)t[u](e,e);return!t.has(-0)});y||((f=e(function(e,r){_r(e,f,t);var n=Nr(new s,e,f);return null!=r&&Mr(r,n[u],n,i),n})).prototype=c,c.constructor=f),(v||m)&&(h("delete"),h("has"),i&&h("get")),(m||d)&&h(u),a&&c.clear&&delete c.clear}return l[t]=f,kt({global:!0,forced:f!=s},l),_e(f,t),a||r.setStrong(f,t,i),f},Fr=function(t,e,r){for(var n in e)et(t,n,e[n],r);return t},Br=Dt("species"),Dr=function(t){var e=ot(t);i&&e&&!e[Br]&&(0,P.f)(e,Br,{configurable:!0,get:function(){return this}})},qr=P.f,zr=Ur.fastKey,Wr=tt.set,Kr=tt.getterFor,Gr={getConstructor:function(t,e,r,n){var o=t(function(t,a){_r(t,o,e),Wr(t,{type:e,index:Ht(null),first:void 0,last:void 0,size:0}),i||(t.size=0),null!=a&&Mr(a,t[n],t,r)}),a=Kr(e),u=function(t,e,r){var n,o,u=a(t),c=s(t,e);return c?c.value=r:(u.last=c={index:o=zr(e,!0),key:e,value:r,previous:n=u.last,next:void 0,removed:!1},u.first||(u.first=c),n&&(n.next=c),i?u.size++:t.size++,"F"!==o&&(u.index[o]=c)),t},s=function(t,e){var r,n=a(t),o=zr(e);if("F"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key==e)return r};return Fr(o.prototype,{clear:function(){for(var t=a(this),e=t.index,r=t.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete e[r.index],r=r.next;t.first=t.last=void 0,i?t.size=0:this.size=0},delete:function(t){var e=this,r=a(e),n=s(e,t);if(n){var o=n.next,u=n.previous;delete r.index[n.index],n.removed=!0,u&&(u.next=o),o&&(o.previous=u),r.first==n&&(r.first=o),r.last==n&&(r.last=u),i?r.size--:e.size--}return!!n},forEach:function(t){for(var e,r=a(this),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!s(this,t)}}),Fr(o.prototype,r?{get:function(t){var e=s(this,t);return e&&e.value},set:function(t,e){return u(this,0===t?0:t,e)}}:{add:function(t){return u(this,t=0===t?0:t,t)}}),i&&qr(o.prototype,"size",{get:function(){return a(this).size}}),o},setStrong:function(t,e,r){var n=e+" Iterator",o=Kr(e),i=Kr(n);Xe(t,e,function(t,e){Wr(this,{type:n,target:t,state:o(t),kind:e,last:void 0})},function(){for(var t=i(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?"keys"==e?{value:r.key,done:!1}:"values"==e?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})},r?"entries":"values",!r,!0),Dr(e)}},$r=Cr("Map",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Gr);ar||et(Object.prototype,"toString",ar?{}.toString:function(){return"[object "+cr(this)+"]"},{unsafe:!0});var Vr={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Hr=Dt("iterator"),Xr=Dt("toStringTag"),Yr=Ar.values;for(var Jr in Vr){var Qr=n[Jr],Zr=Qr&&Qr.prototype;if(Zr){if(Zr[Hr]!==Yr)try{I(Zr,Hr,Yr)}catch(t){Zr[Hr]=Yr}if(Zr[Xr]||I(Zr,Xr,Jr),Vr[Jr])for(var tn in Ar)if(Zr[tn]!==Ar[tn])try{I(Zr,tn,Ar[tn])}catch(t){Zr[tn]=Ar[tn]}}}var en=function(t){var e,r,n,o,i=arguments.length,a=i>1?arguments[1]:void 0;return Qt(this),(e=void 0!==a)&&Qt(a),null==t?new this:(r=[],e?(n=0,o=Zt(a,i>2?arguments[2]:void 0,2),Mr(t,function(t){r.push(o(t,n++))})):Mr(t,r.push,r),new this(r))};kt({target:"Map",stat:!0},{from:en});var rn=function(){for(var t=arguments.length,e=new Array(t);t--;)e[t]=arguments[t];return new this(e)};kt({target:"Map",stat:!0},{of:rn});var nn=function(){for(var t,e=R(this),r=Qt(e.delete),n=!0,o=0,i=arguments.length;o<i;o++)t=r.call(e,arguments[o]),n=n&&t;return!!n};kt({target:"Map",proto:!0,real:!0,forced:D},{deleteAll:function(){return nn.apply(this,arguments)}});var on=function(t){var e=lr(t);if("function"!=typeof e)throw TypeError(String(t)+" is not iterable");return R(e.call(t))},an=function(t){return Map.prototype.entries.call(t)};kt({target:"Map",proto:!0,real:!0,forced:D},{every:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return!Mr(r,function(t,r){if(!n(r,t,e))return Mr.stop()},void 0,!0,!0).stopped}});var un=Dt("species"),sn=function(t,e){var r,n=R(t).constructor;return void 0===n||null==(r=R(n)[un])?e:Qt(r)};kt({target:"Map",proto:!0,real:!0,forced:D},{filter:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3),o=new(sn(e,ot("Map"))),i=Qt(o.set);return Mr(r,function(t,r){n(r,t,e)&&i.call(o,t,r)},void 0,!0,!0),o}}),kt({target:"Map",proto:!0,real:!0,forced:D},{find:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return Mr(r,function(t,r){if(n(r,t,e))return Mr.stop(r)},void 0,!0,!0).result}}),kt({target:"Map",proto:!0,real:!0,forced:D},{findKey:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return Mr(r,function(t,r){if(n(r,t,e))return Mr.stop(t)},void 0,!0,!0).result}}),kt({target:"Map",stat:!0},{groupBy:function(t,e){var r=new this;Qt(e);var n=Qt(r.has),o=Qt(r.get),i=Qt(r.set);return Mr(t,function(t){var a=e(t);n.call(r,a)?o.call(r,a).push(t):i.call(r,a,[t])}),r}}),kt({target:"Map",proto:!0,real:!0,forced:D},{includes:function(t){return Mr(an(R(this)),function(e,r){if((n=r)===(o=t)||n!=n&&o!=o)return Mr.stop();var n,o},void 0,!0,!0).stopped}}),kt({target:"Map",stat:!0},{keyBy:function(t,e){var r=new this;Qt(e);var n=Qt(r.set);return Mr(t,function(t){n.call(r,e(t),t)}),r}}),kt({target:"Map",proto:!0,real:!0,forced:D},{keyOf:function(t){return Mr(an(R(this)),function(e,r){if(r===t)return Mr.stop(e)},void 0,!0,!0).result}}),kt({target:"Map",proto:!0,real:!0,forced:D},{mapKeys:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3),o=new(sn(e,ot("Map"))),i=Qt(o.set);return Mr(r,function(t,r){i.call(o,n(r,t,e),r)},void 0,!0,!0),o}}),kt({target:"Map",proto:!0,real:!0,forced:D},{mapValues:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3),o=new(sn(e,ot("Map"))),i=Qt(o.set);return Mr(r,function(t,r){i.call(o,t,n(r,t,e))},void 0,!0,!0),o}}),kt({target:"Map",proto:!0,real:!0,forced:D},{merge:function(t){for(var e=R(this),r=Qt(e.set),n=0;n<arguments.length;)Mr(arguments[n++],r,e,!0);return e}}),kt({target:"Map",proto:!0,real:!0,forced:D},{reduce:function(t){var e=R(this),r=an(e),n=arguments.length<2,o=n?void 0:arguments[1];if(Qt(t),Mr(r,function(r,i){n?(n=!1,o=i):o=t(o,i,r,e)},void 0,!0,!0),n)throw TypeError("Reduce of empty map with no initial value");return o}}),kt({target:"Map",proto:!0,real:!0,forced:D},{some:function(t){var e=R(this),r=an(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return Mr(r,function(t,r){if(n(r,t,e))return Mr.stop()},void 0,!0,!0).stopped}}),kt({target:"Map",proto:!0,real:!0,forced:D},{update:function(t,e){var r=R(this),n=arguments.length;Qt(e);var o=r.has(t);if(!o&&n<3)throw TypeError("Updating absent value");var i=o?r.get(t):Qt(n>2?arguments[2]:void 0)(t,r);return r.set(t,e(i,t,r)),r}});var cn=function(t,e){var r,n=R(this),o=arguments.length>2?arguments[2]:void 0;if("function"!=typeof e&&"function"!=typeof o)throw TypeError("At least one callback required");return n.has(t)?(r=n.get(t),"function"==typeof e&&(r=e(r),n.set(t,r))):"function"==typeof o&&(r=o(),n.set(t,r)),r};kt({target:"Map",proto:!0,real:!0,forced:D},{upsert:cn}),kt({target:"Map",proto:!0,real:!0,forced:D},{updateOrInsert:cn});var fn="\t\n\v\f\r                 \u2028\u2029\ufeff",ln="["+fn+"]",hn=RegExp("^"+ln+ln+"*"),pn=RegExp(ln+ln+"*$"),dn=function(t){return function(e){var r=String(d(e));return 1&t&&(r=r.replace(hn,"")),2&t&&(r=r.replace(pn,"")),r}},vn={start:dn(1),end:dn(2),trim:dn(3)},gn=bt.f,yn=O.f,mn=P.f,bn=vn.trim,wn="Number",Sn=n.Number,En=Sn.prototype,xn=l(Ht(En))==wn,An=function(t){var e,r,n,o,i,a,u,s,c=y(t,!1);if("string"==typeof c&&c.length>2)if(43===(e=(c=bn(c)).charCodeAt(0))||45===e){if(88===(r=c.charCodeAt(2))||120===r)return NaN}else if(48===e){switch(c.charCodeAt(1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+c}for(a=(i=c.slice(2)).length,u=0;u<a;u++)if((s=i.charCodeAt(u))<48||s>o)return NaN;return parseInt(i,n)}return+c};if(It(wn,!Sn(" 0o1")||!Sn("0b1")||Sn("+0x1"))){for(var On,Rn=function(t){var e=arguments.length<1?0:t,r=this;return r instanceof Rn&&(xn?o(function(){En.valueOf.call(r)}):l(r)!=wn)?Nr(new Sn(An(e)),r,Rn):An(e)},jn=i?gn(Sn):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Pn=0;jn.length>Pn;Pn++)b(Sn,On=jn[Pn])&&!b(Rn,On)&&mn(Rn,On,yn(Sn,On));Rn.prototype=En,En.constructor=Rn,et(n,wn,Rn)}kt({target:"Number",stat:!0},{EPSILON:Math.pow(2,-52)});var In=n.isFinite;kt({target:"Number",stat:!0},{isFinite:Number.isFinite||function(t){return"number"==typeof t&&In(t)}});var Tn=Math.floor,kn=function(t){return!g(t)&&isFinite(t)&&Tn(t)===t};kt({target:"Number",stat:!0},{isInteger:kn}),kt({target:"Number",stat:!0},{isNaN:function(t){return t!=t}});var Ln=Math.abs;kt({target:"Number",stat:!0},{isSafeInteger:function(t){return kn(t)&&Ln(t)<=9007199254740991}}),kt({target:"Number",stat:!0},{MAX_SAFE_INTEGER:9007199254740991}),kt({target:"Number",stat:!0},{MIN_SAFE_INTEGER:-9007199254740991});var Un=vn.trim,Mn=n.parseFloat,_n=1/Mn(fn+"-0")!=-Infinity?function(t){var e=Un(String(t)),r=Mn(e);return 0===r&&"-"==e.charAt(0)?-0:r}:Mn;kt({target:"Number",stat:!0,forced:Number.parseFloat!=_n},{parseFloat:_n});var Nn=vn.trim,Cn=n.parseInt,Fn=/^[+-]?0[Xx]/,Bn=8!==Cn(fn+"08")||22!==Cn(fn+"0x16")?function(t,e){var r=Nn(String(t));return Cn(r,e>>>0||(Fn.test(r)?16:10))}:Cn;kt({target:"Number",stat:!0,forced:Number.parseInt!=Bn},{parseInt:Bn});var Dn=s.f,qn=function(t){return function(e){for(var r,n=v(e),o=qt(n),a=o.length,u=0,s=[];a>u;)r=o[u++],i&&!Dn.call(n,r)||s.push(t?[r,n[r]]:n[r]);return s}},zn={entries:qn(!0),values:qn(!1)},Wn=zn.entries;kt({target:"Object",stat:!0},{entries:function(t){return Wn(t)}}),kt({target:"Object",stat:!0,sham:!i},{getOwnPropertyDescriptors:function(t){for(var e,r,n=v(t),o=O.f,i=St(n),a={},u=0;i.length>u;)void 0!==(r=o(n,e=i[u++]))&&or(a,e,r);return a}});var Kn=o(function(){qt(1)});kt({target:"Object",stat:!0,forced:Kn},{keys:function(t){return qt(Lt(t))}});var Gn=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e};kt({target:"Object",stat:!0},{is:Gn});var $n=zn.values;kt({target:"Object",stat:!0},{values:function(t){return $n(t)}});var Vn=ot("Reflect","apply"),Hn=Function.apply,Xn=!o(function(){Vn(function(){})});kt({target:"Reflect",stat:!0,forced:Xn},{apply:function(t,e,r){return Qt(t),R(r),Vn?Vn(t,e,r):Hn.call(t,e,r)}});var Yn=[].slice,Jn={},Qn=function(t,e,r){if(!(e in Jn)){for(var n=[],o=0;o<e;o++)n[o]="a["+o+"]";Jn[e]=Function("C,a","return new C("+n.join(",")+")")}return Jn[e](t,r)},Zn=Function.bind||function(t){var e=Qt(this),r=Yn.call(arguments,1),n=function(){var o=r.concat(Yn.call(arguments));return this instanceof n?Qn(e,o.length,o):e.apply(t,o)};return g(e.prototype)&&(n.prototype=e.prototype),n},to=ot("Reflect","construct"),eo=o(function(){function t(){}return!(to(function(){},[],t)instanceof t)}),ro=!o(function(){to(function(){})}),no=eo||ro;kt({target:"Reflect",stat:!0,forced:no,sham:no},{construct:function(t,e){Qt(t),R(e);var r=arguments.length<3?t:Qt(arguments[2]);if(ro&&!eo)return to(t,e,r);if(t==r){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var n=[null];return n.push.apply(n,e),new(Zn.apply(t,n))}var o=r.prototype,i=Ht(g(o)?o:Object.prototype),a=Function.apply.call(t,i,e);return g(a)?a:i}});var oo=o(function(){Reflect.defineProperty(P.f({},1,{value:1}),1,{value:2})});kt({target:"Reflect",stat:!0,forced:oo,sham:!i},{defineProperty:function(t,e,r){R(t);var n=y(e,!0);R(r);try{return P.f(t,n,r),!0}catch(t){return!1}}});var io=O.f;kt({target:"Reflect",stat:!0},{deleteProperty:function(t,e){var r=io(R(t),e);return!(r&&!r.configurable)&&delete t[e]}}),kt({target:"Reflect",stat:!0},{get:function t(e,r){var n,o,i=arguments.length<3?e:arguments[2];return R(e)===i?e[r]:(n=O.f(e,r))?b(n,"value")?n.value:void 0===n.get?void 0:n.get.call(i):g(o=Ie(e))?t(o,r,i):void 0}}),kt({target:"Reflect",stat:!0,sham:!i},{getOwnPropertyDescriptor:function(t,e){return O.f(R(t),e)}}),kt({target:"Reflect",stat:!0,sham:!Re},{getPrototypeOf:function(t){return Ie(R(t))}}),kt({target:"Reflect",stat:!0},{has:function(t,e){return e in t}});var ao=Object.isExtensible;kt({target:"Reflect",stat:!0},{isExtensible:function(t){return R(t),!ao||ao(t)}}),kt({target:"Reflect",stat:!0},{ownKeys:St}),kt({target:"Reflect",stat:!0,sham:!Lr},{preventExtensions:function(t){R(t);try{var e=ot("Object","preventExtensions");return e&&e(t),!0}catch(t){return!1}}});var uo=o(function(){var t=P.f({},"a",{configurable:!0});return!1!==Reflect.set(Ie(t),"a",1,t)});kt({target:"Reflect",stat:!0,forced:uo},{set:function t(e,r,n){var o,i,a=arguments.length<4?e:arguments[3],u=O.f(R(e),r);if(!u){if(g(i=Ie(e)))return t(i,r,n,a);u=c(0)}if(b(u,"value")){if(!1===u.writable||!g(a))return!1;if(o=O.f(a,r)){if(o.get||o.set||!1===o.writable)return!1;o.value=n,P.f(a,r,o)}else P.f(a,r,c(0,n));return!0}return void 0!==u.set&&(u.set.call(a,n),!0)}}),qe&&kt({target:"Reflect",stat:!0},{setPrototypeOf:function(t,e){R(t),De(e);try{return qe(t,e),!0}catch(t){return!1}}});var so=Ur.getWeakData,co=tt.set,fo=tt.getterFor,lo=ue.find,ho=ue.findIndex,po=0,vo=function(t){return t.frozen||(t.frozen=new go)},go=function(){this.entries=[]},yo=function(t,e){return lo(t.entries,function(t){return t[0]===e})};go.prototype={get:function(t){var e=yo(this,t);if(e)return e[1]},has:function(t){return!!yo(this,t)},set:function(t,e){var r=yo(this,t);r?r[1]=e:this.entries.push([t,e])},delete:function(t){var e=ho(this.entries,function(e){return e[0]===t});return~e&&this.entries.splice(e,1),!!~e}};var mo={getConstructor:function(t,e,r,n){var o=t(function(t,i){_r(t,o,e),co(t,{type:e,id:po++,frozen:void 0}),null!=i&&Mr(i,t[n],t,r)}),i=fo(e),a=function(t,e,r){var n=i(t),o=so(R(e),!0);return!0===o?vo(n).set(e,r):o[n.id]=r,t};return Fr(o.prototype,{delete:function(t){var e=i(this);if(!g(t))return!1;var r=so(t);return!0===r?vo(e).delete(t):r&&b(r,e.id)&&delete r[e.id]},has:function(t){var e=i(this);if(!g(t))return!1;var r=so(t);return!0===r?vo(e).has(t):r&&b(r,e.id)}}),Fr(o.prototype,r?{get:function(t){var e=i(this);if(g(t)){var r=so(t);return!0===r?vo(e).get(t):r?r[e.id]:void 0}},set:function(t,e){return a(this,t,e)}}:{add:function(t){return a(this,t,!0)}}),o}},bo=e(function(t){var e,r=tt.enforce,o=!n.ActiveXObject&&"ActiveXObject"in n,i=Object.isExtensible,a=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},u=t.exports=Cr("WeakMap",a,mo);if(B&&o){e=mo.getConstructor(a,"WeakMap",!0),Ur.REQUIRED=!0;var s=u.prototype,c=s.delete,f=s.has,l=s.get,h=s.set;Fr(s,{delete:function(t){if(g(t)&&!i(t)){var n=r(this);return n.frozen||(n.frozen=new e),c.call(this,t)||n.frozen.delete(t)}return c.call(this,t)},has:function(t){if(g(t)&&!i(t)){var n=r(this);return n.frozen||(n.frozen=new e),f.call(this,t)||n.frozen.has(t)}return f.call(this,t)},get:function(t){if(g(t)&&!i(t)){var n=r(this);return n.frozen||(n.frozen=new e),f.call(this,t)?l.call(this,t):n.frozen.get(t)}return l.call(this,t)},set:function(t,n){if(g(t)&&!i(t)){var o=r(this);o.frozen||(o.frozen=new e),f.call(this,t)?h.call(this,t,n):o.frozen.set(t,n)}else h.call(this,t,n);return this}})}}),wo=q("metadata"),So=wo.store||(wo.store=new bo),Eo=function(t,e,r){var n=So.get(t);if(!n){if(!r)return;So.set(t,n=new $r)}var o=n.get(e);if(!o){if(!r)return;n.set(e,o=new $r)}return o},xo={store:So,getMap:Eo,has:function(t,e,r){var n=Eo(e,r,!1);return void 0!==n&&n.has(t)},get:function(t,e,r){var n=Eo(e,r,!1);return void 0===n?void 0:n.get(t)},set:function(t,e,r,n){Eo(r,n,!0).set(t,e)},keys:function(t,e){var r=Eo(t,e,!1),n=[];return r&&r.forEach(function(t,e){n.push(e)}),n},toKey:function(t){return void 0===t||"symbol"==typeof t?t:String(t)}},Ao=xo.toKey,Oo=xo.set;kt({target:"Reflect",stat:!0},{defineMetadata:function(t,e,r){var n=arguments.length<4?void 0:Ao(arguments[3]);Oo(t,e,R(r),n)}});var Ro=xo.toKey,jo=xo.getMap,Po=xo.store;kt({target:"Reflect",stat:!0},{deleteMetadata:function(t,e){var r=arguments.length<3?void 0:Ro(arguments[2]),n=jo(R(e),r,!1);if(void 0===n||!n.delete(t))return!1;if(n.size)return!0;var o=Po.get(e);return o.delete(r),!!o.size||Po.delete(e)}});var Io=xo.has,To=xo.get,ko=xo.toKey,Lo=function t(e,r,n){if(Io(e,r,n))return To(e,r,n);var o=Ie(r);return null!==o?t(e,o,n):void 0};kt({target:"Reflect",stat:!0},{getMetadata:function(t,e){var r=arguments.length<3?void 0:ko(arguments[2]);return Lo(t,R(e),r)}});var Uo=Cr("Set",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},Gr),Mo=xo.keys,_o=xo.toKey,No=function t(e,r){var n=Mo(e,r),o=Ie(e);if(null===o)return n;var i,a,u=t(o,r);return u.length?n.length?(i=new Uo(n.concat(u)),Mr(i,(a=[]).push,a),a):u:n};kt({target:"Reflect",stat:!0},{getMetadataKeys:function(t){var e=arguments.length<2?void 0:_o(arguments[1]);return No(R(t),e)}});var Co=xo.get,Fo=xo.toKey;kt({target:"Reflect",stat:!0},{getOwnMetadata:function(t,e){var r=arguments.length<3?void 0:Fo(arguments[2]);return Co(t,R(e),r)}});var Bo=xo.keys,Do=xo.toKey;kt({target:"Reflect",stat:!0},{getOwnMetadataKeys:function(t){var e=arguments.length<2?void 0:Do(arguments[1]);return Bo(R(t),e)}});var qo=xo.has,zo=xo.toKey,Wo=function t(e,r,n){if(qo(e,r,n))return!0;var o=Ie(r);return null!==o&&t(e,o,n)};kt({target:"Reflect",stat:!0},{hasMetadata:function(t,e){var r=arguments.length<3?void 0:zo(arguments[2]);return Wo(t,R(e),r)}});var Ko=xo.has,Go=xo.toKey;kt({target:"Reflect",stat:!0},{hasOwnMetadata:function(t,e){var r=arguments.length<3?void 0:Go(arguments[2]);return Ko(t,R(e),r)}});var $o=xo.toKey,Vo=xo.set;kt({target:"Reflect",stat:!0},{metadata:function(t,e){return function(r,n){Vo(t,e,R(r),$o(n))}}});var Ho=Dt("match"),Xo=function(t){var e;return g(t)&&(void 0!==(e=t[Ho])?!!e:"RegExp"==l(t))},Yo=function(){var t=R(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.dotAll&&(e+="s"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e};function Jo(t,e){return RegExp(t,e)}var Qo={UNSUPPORTED_Y:o(function(){var t=Jo("a","y");return t.lastIndex=2,null!=t.exec("abcd")}),BROKEN_CARET:o(function(){var t=Jo("^r","gy");return t.lastIndex=2,null!=t.exec("str")})},Zo=P.f,ti=bt.f,ei=tt.set,ri=Dt("match"),ni=n.RegExp,oi=ni.prototype,ii=/a/g,ai=/a/g,ui=new ni(ii)!==ii,si=Qo.UNSUPPORTED_Y;if(i&&It("RegExp",!ui||si||o(function(){return ai[ri]=!1,ni(ii)!=ii||ni(ai)==ai||"/a/i"!=ni(ii,"i")}))){for(var ci=function(t,e){var r,n=this instanceof ci,o=Xo(t),i=void 0===e;if(!n&&o&&t.constructor===ci&&i)return t;ui?o&&!i&&(t=t.source):t instanceof ci&&(i&&(e=Yo.call(t)),t=t.source),si&&(r=!!e&&e.indexOf("y")>-1)&&(e=e.replace(/y/g,""));var a=Nr(ui?new ni(t,e):ni(t,e),n?this:oi,ci);return si&&r&&ei(a,{sticky:r}),a},fi=function(t){t in ci||Zo(ci,t,{configurable:!0,get:function(){return ni[t]},set:function(e){ni[t]=e}})},li=ti(ni),hi=0;li.length>hi;)fi(li[hi++]);oi.constructor=ci,ci.prototype=oi,et(n,"RegExp",ci)}Dr("RegExp");var pi="toString",di=RegExp.prototype,vi=di.toString;(o(function(){return"/a/b"!=vi.call({source:"a",flags:"b"})})||vi.name!=pi)&&et(RegExp.prototype,pi,function(){var t=R(this),e=String(t.source),r=t.flags;return"/"+e+"/"+String(void 0===r&&t instanceof RegExp&&!("flags"in di)?Yo.call(t):r)},{unsafe:!0});var gi=RegExp.prototype.exec,yi=String.prototype.replace,mi=gi,bi=function(){var t=/a/,e=/b*/g;return gi.call(t,"a"),gi.call(e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),wi=Qo.UNSUPPORTED_Y||Qo.BROKEN_CARET,Si=void 0!==/()??/.exec("")[1];(bi||Si||wi)&&(mi=function(t){var e,r,n,o,i=this,a=wi&&i.sticky,u=Yo.call(i),s=i.source,c=0,f=t;return a&&(-1===(u=u.replace("y","")).indexOf("g")&&(u+="g"),f=String(t).slice(i.lastIndex),i.lastIndex>0&&(!i.multiline||i.multiline&&"\n"!==t[i.lastIndex-1])&&(s="(?: "+s+")",f=" "+f,c++),r=new RegExp("^(?:"+s+")",u)),Si&&(r=new RegExp("^"+s+"$(?!\\s)",u)),bi&&(e=i.lastIndex),n=gi.call(a?r:i,f),a?n?(n.input=n.input.slice(c),n[0]=n[0].slice(c),n.index=i.lastIndex,i.lastIndex+=n[0].length):i.lastIndex=0:bi&&n&&(i.lastIndex=i.global?n.index+n[0].length:e),Si&&n&&n.length>1&&yi.call(n[0],r,function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(n[o]=void 0)}),n});var Ei=mi;kt({target:"RegExp",proto:!0,forced:/./.exec!==Ei},{exec:Ei}),i&&("g"!=/./g.flags||Qo.UNSUPPORTED_Y)&&P.f(RegExp.prototype,"flags",{configurable:!0,get:Yo});var xi=tt.get,Ai=RegExp.prototype;i&&Qo.UNSUPPORTED_Y&&(0,P.f)(RegExp.prototype,"sticky",{configurable:!0,get:function(){if(this!==Ai){if(this instanceof RegExp)return!!xi(this).sticky;throw TypeError("Incompatible receiver, RegExp required")}}});var Oi,Ri,ji=(Oi=!1,(Ri=/[ac]/).exec=function(){return Oi=!0,/./.exec.apply(this,arguments)},!0===Ri.test("abc")&&Oi),Pi=/./.test;kt({target:"RegExp",proto:!0,forced:!ji},{test:function(t){if("function"!=typeof this.exec)return Pi.call(this,t);var e=this.exec(t);if(null!==e&&!g(e))throw new Error("RegExp exec method returned something other than an Object or null");return!!e}});var Ii=Dt("species"),Ti=!o(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$<a>")}),ki="$0"==="a".replace(/./,"$0"),Li=Dt("replace"),Ui=!!/./[Li]&&""===/./[Li]("a","$0"),Mi=!o(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2!==r.length||"a"!==r[0]||"b"!==r[1]}),_i=function(t,e,r,n){var i=Dt(t),a=!o(function(){var e={};return e[i]=function(){return 7},7!=""[t](e)}),u=a&&!o(function(){var e=!1,r=/a/;return"split"===t&&((r={}).constructor={},r.constructor[Ii]=function(){return r},r.flags="",r[i]=/./[i]),r.exec=function(){return e=!0,null},r[i](""),!e});if(!a||!u||"replace"===t&&(!Ti||!ki||Ui)||"split"===t&&!Mi){var s=/./[i],c=r(i,""[t],function(t,e,r,n,o){return e.exec===Ei?a&&!o?{done:!0,value:s.call(e,r,n)}:{done:!0,value:t.call(r,e,n)}:{done:!1}},{REPLACE_KEEPS_$0:ki,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Ui}),f=c[1];et(String.prototype,t,c[0]),et(RegExp.prototype,i,2==e?function(t,e){return f.call(t,this,e)}:function(t){return f.call(t,this)})}n&&I(RegExp.prototype[i],"sham",!0)},Ni=Oe.charAt,Ci=function(t,e,r){return e+(r?Ni(t,e).length:1)},Fi=function(t,e){var r=t.exec;if("function"==typeof r){var n=r.call(t,e);if("object"!=typeof n)throw TypeError("RegExp exec method returned something other than an Object or null");return n}if("RegExp"!==l(t))throw TypeError("RegExp#exec called on incompatible receiver");return Ei.call(t,e)};_i("match",1,function(t,e,r){return[function(e){var r=d(this),n=null==e?void 0:e[t];return void 0!==n?n.call(e,r):new RegExp(e)[t](String(r))},function(t){var n=r(e,t,this);if(n.done)return n.value;var o=R(t),i=String(this);if(!o.global)return Fi(o,i);var a=o.unicode;o.lastIndex=0;for(var u,s=[],c=0;null!==(u=Fi(o,i));){var f=String(u[0]);s[c]=f,""===f&&(o.lastIndex=Ci(i,ct(o.lastIndex),a)),c++}return 0===c?null:s}]});var Bi=Math.max,Di=Math.min,qi=Math.floor,zi=/\$([$&'`]|\d\d?|<[^>]*>)/g,Wi=/\$([$&'`]|\d\d?)/g;_i("replace",2,function(t,e,r,n){var o=n.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,i=n.REPLACE_KEEPS_$0,a=o?"$":"$0";return[function(r,n){var o=d(this),i=null==r?void 0:r[t];return void 0!==i?i.call(r,o,n):e.call(String(o),r,n)},function(t,n){if(!o&&i||"string"==typeof n&&-1===n.indexOf(a)){var s=r(e,t,this,n);if(s.done)return s.value}var c=R(t),f=String(this),l="function"==typeof n;l||(n=String(n));var h=c.global;if(h){var p=c.unicode;c.lastIndex=0}for(var d=[];;){var v=Fi(c,f);if(null===v)break;if(d.push(v),!h)break;""===String(v[0])&&(c.lastIndex=Ci(f,ct(c.lastIndex),p))}for(var g,y="",m=0,b=0;b<d.length;b++){v=d[b];for(var w=String(v[0]),S=Bi(Di(ut(v.index),f.length),0),E=[],x=1;x<v.length;x++)E.push(void 0===(g=v[x])?g:String(g));var A=v.groups;if(l){var O=[w].concat(E,S,f);void 0!==A&&O.push(A);var j=String(n.apply(void 0,O))}else j=u(w,f,S,E,A,n);S>=m&&(y+=f.slice(m,S)+j,m=S+w.length)}return y+f.slice(m)}];function u(t,r,n,o,i,a){var u=n+t.length,s=o.length,c=Wi;return void 0!==i&&(i=Lt(i),c=zi),e.call(a,c,function(e,a){var c;switch(a.charAt(0)){case"$":return"$";case"&":return t;case"`":return r.slice(0,n);case"'":return r.slice(u);case"<":c=i[a.slice(1,-1)];break;default:var f=+a;if(0===f)return e;if(f>s){var l=qi(f/10);return 0===l?e:l<=s?void 0===o[l-1]?a.charAt(1):o[l-1]+a.charAt(1):e}c=o[f-1]}return void 0===c?"":c})}}),_i("search",1,function(t,e,r){return[function(e){var r=d(this),n=null==e?void 0:e[t];return void 0!==n?n.call(e,r):new RegExp(e)[t](String(r))},function(t){var n=r(e,t,this);if(n.done)return n.value;var o=R(t),i=String(this),a=o.lastIndex;Gn(a,0)||(o.lastIndex=0);var u=Fi(o,i);return Gn(o.lastIndex,a)||(o.lastIndex=a),null===u?-1:u.index}]});var Ki=[].push,Gi=Math.min,$i=4294967295,Vi=!o(function(){return!RegExp($i,"y")});_i("split",2,function(t,e,r){var n;return n="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,r){var n=String(d(this)),o=void 0===r?$i:r>>>0;if(0===o)return[];if(void 0===t)return[n];if(!Xo(t))return e.call(n,t,o);for(var i,a,u,s=[],c=0,f=new RegExp(t.source,(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":"")+"g");(i=Ei.call(f,n))&&!((a=f.lastIndex)>c&&(s.push(n.slice(c,i.index)),i.length>1&&i.index<n.length&&Ki.apply(s,i.slice(1)),u=i[0].length,c=a,s.length>=o));)f.lastIndex===i.index&&f.lastIndex++;return c===n.length?!u&&f.test("")||s.push(""):s.push(n.slice(c)),s.length>o?s.slice(0,o):s}:"0".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:e.call(this,t,r)}:e,[function(e,r){var o=d(this),i=null==e?void 0:e[t];return void 0!==i?i.call(e,o,r):n.call(String(o),e,r)},function(t,o){var i=r(n,t,this,o,n!==e);if(i.done)return i.value;var a=R(t),u=String(this),s=sn(a,RegExp),c=a.unicode,f=new s(Vi?a:"^(?:"+a.source+")",(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(Vi?"y":"g")),l=void 0===o?$i:o>>>0;if(0===l)return[];if(0===u.length)return null===Fi(f,u)?[u]:[];for(var h=0,p=0,d=[];p<u.length;){f.lastIndex=Vi?p:0;var v,g=Fi(f,Vi?u:u.slice(p));if(null===g||(v=Gi(ct(f.lastIndex+(Vi?0:p)),u.length))===h)p=Ci(u,p,c);else{if(d.push(u.slice(h,p)),d.length===l)return d;for(var y=1;y<=g.length-1;y++)if(d.push(g[y]),d.length===l)return d;p=h=v}}return d.push(u.slice(h)),d}]},!Vi),kt({target:"Set",stat:!0},{from:en}),kt({target:"Set",stat:!0},{of:rn});var Hi=function(){for(var t=R(this),e=Qt(t.add),r=0,n=arguments.length;r<n;r++)e.call(t,arguments[r]);return t};kt({target:"Set",proto:!0,real:!0,forced:D},{addAll:function(){return Hi.apply(this,arguments)}}),kt({target:"Set",proto:!0,real:!0,forced:D},{deleteAll:function(){return nn.apply(this,arguments)}});var Xi=function(t){return Set.prototype.values.call(t)};kt({target:"Set",proto:!0,real:!0,forced:D},{every:function(t){var e=R(this),r=Xi(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return!Mr(r,function(t){if(!n(t,t,e))return Mr.stop()},void 0,!1,!0).stopped}}),kt({target:"Set",proto:!0,real:!0,forced:D},{difference:function(t){var e=R(this),r=new(sn(e,ot("Set")))(e),n=Qt(r.delete);return Mr(t,function(t){n.call(r,t)}),r}}),kt({target:"Set",proto:!0,real:!0,forced:D},{filter:function(t){var e=R(this),r=Xi(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3),o=new(sn(e,ot("Set"))),i=Qt(o.add);return Mr(r,function(t){n(t,t,e)&&i.call(o,t)},void 0,!1,!0),o}}),kt({target:"Set",proto:!0,real:!0,forced:D},{find:function(t){var e=R(this),r=Xi(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return Mr(r,function(t){if(n(t,t,e))return Mr.stop(t)},void 0,!1,!0).result}}),kt({target:"Set",proto:!0,real:!0,forced:D},{intersection:function(t){var e=R(this),r=new(sn(e,ot("Set"))),n=Qt(e.has),o=Qt(r.add);return Mr(t,function(t){n.call(e,t)&&o.call(r,t)}),r}}),kt({target:"Set",proto:!0,real:!0,forced:D},{isDisjointFrom:function(t){var e=R(this),r=Qt(e.has);return!Mr(t,function(t){if(!0===r.call(e,t))return Mr.stop()}).stopped}}),kt({target:"Set",proto:!0,real:!0,forced:D},{isSubsetOf:function(t){var e=on(this),r=R(t),n=r.has;return"function"!=typeof n&&(r=new(ot("Set"))(t),n=Qt(r.has)),!Mr(e,function(t){if(!1===n.call(r,t))return Mr.stop()},void 0,!1,!0).stopped}}),kt({target:"Set",proto:!0,real:!0,forced:D},{isSupersetOf:function(t){var e=R(this),r=Qt(e.has);return!Mr(t,function(t){if(!1===r.call(e,t))return Mr.stop()}).stopped}}),kt({target:"Set",proto:!0,real:!0,forced:D},{join:function(t){var e=R(this),r=Xi(e),n=void 0===t?",":String(t),o=[];return Mr(r,o.push,o,!1,!0),o.join(n)}}),kt({target:"Set",proto:!0,real:!0,forced:D},{map:function(t){var e=R(this),r=Xi(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3),o=new(sn(e,ot("Set"))),i=Qt(o.add);return Mr(r,function(t){i.call(o,n(t,t,e))},void 0,!1,!0),o}}),kt({target:"Set",proto:!0,real:!0,forced:D},{reduce:function(t){var e=R(this),r=Xi(e),n=arguments.length<2,o=n?void 0:arguments[1];if(Qt(t),Mr(r,function(r){n?(n=!1,o=r):o=t(o,r,r,e)},void 0,!1,!0),n)throw TypeError("Reduce of empty set with no initial value");return o}}),kt({target:"Set",proto:!0,real:!0,forced:D},{some:function(t){var e=R(this),r=Xi(e),n=Zt(t,arguments.length>1?arguments[1]:void 0,3);return Mr(r,function(t){if(n(t,t,e))return Mr.stop()},void 0,!1,!0).stopped}}),kt({target:"Set",proto:!0,real:!0,forced:D},{symmetricDifference:function(t){var e=R(this),r=new(sn(e,ot("Set")))(e),n=Qt(r.delete),o=Qt(r.add);return Mr(t,function(t){n.call(r,t)||o.call(r,t)}),r}}),kt({target:"Set",proto:!0,real:!0,forced:D},{union:function(t){var e=R(this),r=new(sn(e,ot("Set")))(e);return Mr(t,Qt(r.add),r),r}});var Yi,Ji,Qi=ot("navigator","userAgent")||"",Zi=n.process,ta=Zi&&Zi.versions,ea=ta&&ta.v8;ea?Ji=(Yi=ea.split("."))[0]+Yi[1]:Qi&&(!(Yi=Qi.match(/Edge\/(\d+)/))||Yi[1]>=74)&&(Yi=Qi.match(/Chrome\/(\d+)/))&&(Ji=Yi[1]);var ra=Ji&&+Ji,na=Dt("species"),oa=Dt("isConcatSpreadable"),ia=9007199254740991,aa="Maximum allowed index exceeded",ua=ra>=51||!o(function(){var t=[];return t[oa]=!1,t.concat()[0]!==t}),sa=ra>=51||!o(function(){var t=[];return(t.constructor={})[na]=function(){return{foo:1}},1!==t.concat(Boolean).foo}),ca=function(t){if(!g(t))return!1;var e=t[oa];return void 0!==e?!!e:re(t)};kt({target:"Array",proto:!0,forced:!ua||!sa},{concat:function(t){var e,r,n,o,i,a=Lt(this),u=oe(a,0),s=0;for(e=-1,n=arguments.length;e<n;e++)if(ca(i=-1===e?a:arguments[e])){if(s+(o=ct(i.length))>ia)throw TypeError(aa);for(r=0;r<o;r++,s++)r in i&&or(u,s,i[r])}else{if(s>=ia)throw TypeError(aa);or(u,s++,i)}return u.length=s,u}});var fa=bt.f,la={}.toString,ha="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],pa={f:function(t){return ha&&"[object Window]"==la.call(t)?function(t){try{return fa(t)}catch(t){return ha.slice()}}(t):fa(v(t))}},da={f:Dt},va=P.f,ga=function(t){var e=rt.Symbol||(rt.Symbol={});b(e,t)||va(e,t,{value:da.f(t)})},ya=ue.forEach,ma=$("hidden"),ba="Symbol",wa=Dt("toPrimitive"),Sa=tt.set,Ea=tt.getterFor(ba),xa=Object.prototype,Aa=n.Symbol,Oa=ot("JSON","stringify"),Ra=O.f,ja=P.f,Pa=pa.f,Ia=s.f,Ta=q("symbols"),ka=q("op-symbols"),La=q("string-to-symbol-registry"),Ua=q("symbol-to-string-registry"),Ma=q("wks"),_a=n.QObject,Na=!_a||!_a.prototype||!_a.prototype.findChild,Ca=i&&o(function(){return 7!=Ht(ja({},"a",{get:function(){return ja(this,"a",{value:7}).a}})).a})?function(t,e,r){var n=Ra(xa,e);n&&delete xa[e],ja(t,e,r),n&&t!==xa&&ja(xa,e,n)}:ja,Fa=function(t,e){var r=Ta[t]=Ht(Aa.prototype);return Sa(r,{type:ba,tag:t,description:e}),i||(r.description=e),r},Ba=Nt?function(t){return"symbol"==typeof t}:function(t){return Object(t)instanceof Aa},Da=function(t,e,r){t===xa&&Da(ka,e,r),R(t);var n=y(e,!0);return R(r),b(Ta,n)?(r.enumerable?(b(t,ma)&&t[ma][n]&&(t[ma][n]=!1),r=Ht(r,{enumerable:c(0,!1)})):(b(t,ma)||ja(t,ma,c(1,{})),t[ma][n]=!0),Ca(t,n,r)):ja(t,n,r)},qa=function(t,e){R(t);var r=v(e),n=qt(r).concat(Ga(r));return ya(n,function(e){i&&!za.call(r,e)||Da(t,e,r[e])}),t},za=function(t){var e=y(t,!0),r=Ia.call(this,e);return!(this===xa&&b(Ta,e)&&!b(ka,e))&&(!(r||!b(this,e)||!b(Ta,e)||b(this,ma)&&this[ma][e])||r)},Wa=function(t,e){var r=v(t),n=y(e,!0);if(r!==xa||!b(Ta,n)||b(ka,n)){var o=Ra(r,n);return!o||!b(Ta,n)||b(r,ma)&&r[ma][n]||(o.enumerable=!0),o}},Ka=function(t){var e=Pa(v(t)),r=[];return ya(e,function(t){b(Ta,t)||b(V,t)||r.push(t)}),r},Ga=function(t){var e=t===xa,r=Pa(e?ka:v(t)),n=[];return ya(r,function(t){!b(Ta,t)||e&&!b(xa,t)||n.push(Ta[t])}),n};if(_t||(et((Aa=function(){if(this instanceof Aa)throw TypeError("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,e=K(t),r=function t(r){this===xa&&t.call(ka,r),b(this,ma)&&b(this[ma],e)&&(this[ma][e]=!1),Ca(this,e,c(1,r))};return i&&Na&&Ca(xa,e,{configurable:!0,set:r}),Fa(e,t)}).prototype,"toString",function(){return Ea(this).tag}),et(Aa,"withoutSetter",function(t){return Fa(K(t),t)}),s.f=za,P.f=Da,O.f=Wa,bt.f=pa.f=Ka,wt.f=Ga,da.f=function(t){return Fa(Dt(t),t)},i&&(ja(Aa.prototype,"description",{configurable:!0,get:function(){return Ea(this).description}}),et(xa,"propertyIsEnumerable",za,{unsafe:!0}))),kt({global:!0,wrap:!0,forced:!_t,sham:!_t},{Symbol:Aa}),ya(qt(Ma),function(t){ga(t)}),kt({target:ba,stat:!0,forced:!_t},{for:function(t){var e=String(t);if(b(La,e))return La[e];var r=Aa(e);return La[e]=r,Ua[r]=e,r},keyFor:function(t){if(!Ba(t))throw TypeError(t+" is not a symbol");if(b(Ua,t))return Ua[t]},useSetter:function(){Na=!0},useSimple:function(){Na=!1}}),kt({target:"Object",stat:!0,forced:!_t,sham:!i},{create:function(t,e){return void 0===e?Ht(t):qa(Ht(t),e)},defineProperty:Da,defineProperties:qa,getOwnPropertyDescriptor:Wa}),kt({target:"Object",stat:!0,forced:!_t},{getOwnPropertyNames:Ka,getOwnPropertySymbols:Ga}),kt({target:"Object",stat:!0,forced:o(function(){wt.f(1)})},{getOwnPropertySymbols:function(t){return wt.f(Lt(t))}}),Oa){var $a=!_t||o(function(){var t=Aa();return"[null]"!=Oa([t])||"{}"!=Oa({a:t})||"{}"!=Oa(Object(t))});kt({target:"JSON",stat:!0,forced:$a},{stringify:function(t,e,r){for(var n,o=[t],i=1;arguments.length>i;)o.push(arguments[i++]);if(n=e,(g(e)||void 0!==t)&&!Ba(t))return re(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!Ba(e))return e}),o[1]=e,Oa.apply(null,o)}})}Aa.prototype[wa]||I(Aa.prototype,wa,Aa.prototype.valueOf),_e(Aa,ba),V[ma]=!0,ga("asyncIterator");var Va=P.f,Ha=n.Symbol;if(i&&"function"==typeof Ha&&(!("description"in Ha.prototype)||void 0!==Ha().description)){var Xa={},Ya=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof Ya?new Ha(t):void 0===t?Ha():Ha(t);return""===t&&(Xa[e]=!0),e};Et(Ya,Ha);var Ja=Ya.prototype=Ha.prototype;Ja.constructor=Ya;var Qa=Ja.toString,Za="Symbol(test)"==String(Ha("test")),tu=/^Symbol\((.*)\)[^)]+$/;Va(Ja,"description",{configurable:!0,get:function(){var t=g(this)?this.valueOf():this,e=Qa.call(t);if(b(Xa,t))return"";var r=Za?e.slice(7,-1):e.replace(tu,"$1");return""===r?void 0:r}}),kt({global:!0,forced:!0},{Symbol:Ya})}ga("hasInstance"),ga("isConcatSpreadable"),ga("iterator"),ga("match"),ga("matchAll"),ga("replace"),ga("search"),ga("species"),ga("split"),ga("toPrimitive"),ga("toStringTag"),ga("unscopables"),_e(Math,"Math",!0),_e(n.JSON,"JSON",!0),ga("asyncDispose"),ga("dispose"),ga("observable"),ga("patternMatch"),ga("replaceAll"),da.f("asyncIterator");var eu=Oe.codeAt;kt({target:"String",proto:!0},{codePointAt:function(t){return eu(this,t)}}),ee("String","codePointAt");var ru,nu=function(t){if(Xo(t))throw TypeError("The method doesn't accept regular expressions");return t},ou=Dt("match"),iu=function(t){var e=/./;try{"/./"[t](e)}catch(r){try{return e[ou]=!1,"/./"[t](e)}catch(t){}}return!1},au=O.f,uu="".endsWith,su=Math.min,cu=iu("endsWith"),fu=!(cu||(ru=au(String.prototype,"endsWith"),!ru||ru.writable));kt({target:"String",proto:!0,forced:!fu&&!cu},{endsWith:function(t){var e=String(d(this));nu(t);var r=arguments.length>1?arguments[1]:void 0,n=ct(e.length),o=void 0===r?n:su(ct(r),n),i=String(t);return uu?uu.call(e,i,o):e.slice(o-i.length,o)===i}}),ee("String","endsWith");var lu=String.fromCharCode,hu=String.fromCodePoint;kt({target:"String",stat:!0,forced:!!hu&&1!=hu.length},{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],ht(e,1114111)!==e)throw RangeError(e+" is not a valid code point");r.push(e<65536?lu(e):lu(55296+((e-=65536)>>10),e%1024+56320))}return r.join("")}}),kt({target:"String",proto:!0,forced:!iu("includes")},{includes:function(t){return!!~String(d(this)).indexOf(nu(t),arguments.length>1?arguments[1]:void 0)}}),ee("String","includes");var pu="".repeat||function(t){var e=String(d(this)),r="",n=ut(t);if(n<0||Infinity==n)throw RangeError("Wrong number of repetitions");for(;n>0;(n>>>=1)&&(e+=e))1&n&&(r+=e);return r},du=Math.ceil,vu=function(t){return function(e,r,n){var o,i,a=String(d(e)),u=a.length,s=void 0===n?" ":String(n),c=ct(r);return c<=u||""==s?a:((i=pu.call(s,du((o=c-u)/s.length))).length>o&&(i=i.slice(0,o)),t?a+i:i+a)}},gu={start:vu(!1),end:vu(!0)},yu=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(Qi),mu=gu.start;kt({target:"String",proto:!0,forced:yu},{padStart:function(t){return mu(this,t,arguments.length>1?arguments[1]:void 0)}}),ee("String","padStart");var bu=gu.end;kt({target:"String",proto:!0,forced:yu},{padEnd:function(t){return bu(this,t,arguments.length>1?arguments[1]:void 0)}}),ee("String","padEnd"),kt({target:"String",stat:!0},{raw:function(t){for(var e=v(t.raw),r=ct(e.length),n=arguments.length,o=[],i=0;r>i;)o.push(String(e[i++])),i<n&&o.push(String(arguments[i]));return o.join("")}}),kt({target:"String",proto:!0},{repeat:pu}),ee("String","repeat");var wu=O.f,Su="".startsWith,Eu=Math.min,xu=iu("startsWith"),Au=!xu&&!!function(){var t=wu(String.prototype,"startsWith");return t&&!t.writable}();kt({target:"String",proto:!0,forced:!Au&&!xu},{startsWith:function(t){var e=String(d(this));nu(t);var r=ct(Eu(arguments.length>1?arguments[1]:void 0,e.length)),n=String(t);return Su?Su.call(e,n,r):e.slice(r,r+n.length)===n}}),ee("String","startsWith");var Ou=function(t){return o(function(){return!!fn[t]()||"​…᠎"!="​…᠎"[t]()||fn[t].name!==t})},Ru=vn.start,ju=Ou("trimStart"),Pu=ju?function(){return Ru(this)}:"".trimStart;kt({target:"String",proto:!0,forced:ju},{trimStart:Pu,trimLeft:Pu}),ee("String","trimLeft");var Iu=vn.end,Tu=Ou("trimEnd"),ku=Tu?function(){return Iu(this)}:"".trimEnd;kt({target:"String",proto:!0,forced:Tu},{trimEnd:ku,trimRight:ku}),ee("String","trimRight");var Lu=Dt("iterator"),Uu=!o(function(){var t=new URL("b?a=1&b=2&c=3","http://a"),e=t.searchParams,r="";return t.pathname="c%20d",e.forEach(function(t,n){e.delete("b"),r+=n+t}),!e.sort||"http://a/c%20d?a=1&c=3"!==t.href||"3"!==e.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!e[Lu]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==r||"x"!==new URL("http://x",void 0).host}),Mu=Object.assign,_u=Object.defineProperty,Nu=!Mu||o(function(){if(i&&1!==Mu({b:1},Mu(_u({},"a",{enumerable:!0,get:function(){_u(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},r=Symbol(),n="abcdefghijklmnopqrst";return t[r]=7,n.split("").forEach(function(t){e[t]=t}),7!=Mu({},t)[r]||qt(Mu({},e)).join("")!=n})?function(t,e){for(var r=Lt(t),n=arguments.length,o=1,a=wt.f,u=s.f;n>o;)for(var c,f=p(arguments[o++]),l=a?qt(f).concat(a(f)):qt(f),h=l.length,d=0;h>d;)c=l[d++],i&&!u.call(f,c)||(r[c]=f[c]);return r}:Mu,Cu=2147483647,Fu=/[^\0-\u007E]/,Bu=/[.\u3002\uFF0E\uFF61]/g,Du="Overflow: input needs wider integers to process",qu=Math.floor,zu=String.fromCharCode,Wu=function(t){return t+22+75*(t<26)},Ku=function(t,e,r){var n=0;for(t=r?qu(t/700):t>>1,t+=qu(t/e);t>455;n+=36)t=qu(t/35);return qu(n+36*t/(t+38))},Gu=function(t){var e,r,n=[],o=(t=function(t){for(var e=[],r=0,n=t.length;r<n;){var o=t.charCodeAt(r++);if(o>=55296&&o<=56319&&r<n){var i=t.charCodeAt(r++);56320==(64512&i)?e.push(((1023&o)<<10)+(1023&i)+65536):(e.push(o),r--)}else e.push(o)}return e}(t)).length,i=128,a=0,u=72;for(e=0;e<t.length;e++)(r=t[e])<128&&n.push(zu(r));var s=n.length,c=s;for(s&&n.push("-");c<o;){var f=Cu;for(e=0;e<t.length;e++)(r=t[e])>=i&&r<f&&(f=r);var l=c+1;if(f-i>qu((Cu-a)/l))throw RangeError(Du);for(a+=(f-i)*l,i=f,e=0;e<t.length;e++){if((r=t[e])<i&&++a>Cu)throw RangeError(Du);if(r==i){for(var h=a,p=36;;p+=36){var d=p<=u?1:p>=u+26?26:p-u;if(h<d)break;var v=h-d,g=36-d;n.push(zu(Wu(d+v%g))),h=qu(v/g)}n.push(zu(Wu(h))),u=Ku(a,l,c==s),a=0,++c}}++a,++i}return n.join("")},$u=ot("fetch"),Vu=ot("Headers"),Hu=Dt("iterator"),Xu="URLSearchParams",Yu="URLSearchParamsIterator",Ju=tt.set,Qu=tt.getterFor(Xu),Zu=tt.getterFor(Yu),ts=/\+/g,es=Array(4),rs=function(t){return es[t-1]||(es[t-1]=RegExp("((?:%[\\da-f]{2}){"+t+"})","gi"))},ns=function(t){try{return decodeURIComponent(t)}catch(e){return t}},os=function(t){var e=t.replace(ts," "),r=4;try{return decodeURIComponent(e)}catch(t){for(;r;)e=e.replace(rs(r--),ns);return e}},is=/[!'()~]|%20/g,as={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},us=function(t){return as[t]},ss=function(t){return encodeURIComponent(t).replace(is,us)},cs=function(t,e){if(e)for(var r,n,o=e.split("&"),i=0;i<o.length;)(r=o[i++]).length&&(n=r.split("="),t.push({key:os(n.shift()),value:os(n.join("="))}))},fs=function(t){this.entries.length=0,cs(this.entries,t)},ls=function(t,e){if(t<e)throw TypeError("Not enough arguments")},hs=Be(function(t,e){Ju(this,{type:Yu,iterator:on(Qu(t).entries),kind:e})},"Iterator",function(){var t=Zu(this),e=t.kind,r=t.iterator.next(),n=r.value;return r.done||(r.value="keys"===e?n.key:"values"===e?n.value:[n.key,n.value]),r}),ps=function(){_r(this,ps,Xu);var t,e,r,n,o,i,a,u,s,c=arguments.length>0?arguments[0]:void 0,f=this,l=[];if(Ju(f,{type:Xu,entries:l,updateURL:function(){},updateSearchParams:fs}),void 0!==c)if(g(c))if("function"==typeof(t=lr(c)))for(r=(e=t.call(c)).next;!(n=r.call(e)).done;){if((a=(i=(o=on(R(n.value))).next).call(o)).done||(u=i.call(o)).done||!i.call(o).done)throw TypeError("Expected sequence with length 2");l.push({key:a.value+"",value:u.value+""})}else for(s in c)b(c,s)&&l.push({key:s,value:c[s]+""});else cs(l,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},ds=ps.prototype;Fr(ds,{append:function(t,e){ls(arguments.length,2);var r=Qu(this);r.entries.push({key:t+"",value:e+""}),r.updateURL()},delete:function(t){ls(arguments.length,1);for(var e=Qu(this),r=e.entries,n=t+"",o=0;o<r.length;)r[o].key===n?r.splice(o,1):o++;e.updateURL()},get:function(t){ls(arguments.length,1);for(var e=Qu(this).entries,r=t+"",n=0;n<e.length;n++)if(e[n].key===r)return e[n].value;return null},getAll:function(t){ls(arguments.length,1);for(var e=Qu(this).entries,r=t+"",n=[],o=0;o<e.length;o++)e[o].key===r&&n.push(e[o].value);return n},has:function(t){ls(arguments.length,1);for(var e=Qu(this).entries,r=t+"",n=0;n<e.length;)if(e[n++].key===r)return!0;return!1},set:function(t,e){ls(arguments.length,1);for(var r,n=Qu(this),o=n.entries,i=!1,a=t+"",u=e+"",s=0;s<o.length;s++)(r=o[s]).key===a&&(i?o.splice(s--,1):(i=!0,r.value=u));i||o.push({key:a,value:u}),n.updateURL()},sort:function(){var t,e,r,n=Qu(this),o=n.entries,i=o.slice();for(o.length=0,r=0;r<i.length;r++){for(t=i[r],e=0;e<r;e++)if(o[e].key>t.key){o.splice(e,0,t);break}e===r&&o.push(t)}n.updateURL()},forEach:function(t){for(var e,r=Qu(this).entries,n=Zt(t,arguments.length>1?arguments[1]:void 0,3),o=0;o<r.length;)n((e=r[o++]).value,e.key,this)},keys:function(){return new hs(this,"keys")},values:function(){return new hs(this,"values")},entries:function(){return new hs(this,"entries")}},{enumerable:!0}),et(ds,Hu,ds.entries),et(ds,"toString",function(){for(var t,e=Qu(this).entries,r=[],n=0;n<e.length;)t=e[n++],r.push(ss(t.key)+"="+ss(t.value));return r.join("&")},{enumerable:!0}),_e(ps,Xu),kt({global:!0,forced:!Uu},{URLSearchParams:ps}),Uu||"function"!=typeof $u||"function"!=typeof Vu||kt({global:!0,enumerable:!0,forced:!0},{fetch:function(t){var e,r,n,o=[t];return arguments.length>1&&(g(e=arguments[1])&&cr(r=e.body)===Xu&&((n=e.headers?new Vu(e.headers):new Vu).has("content-type")||n.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),e=Ht(e,{body:c(0,String(r)),headers:c(0,n)})),o.push(e)),$u.apply(this,o)}});var vs,gs={URLSearchParams:ps,getState:Qu},ys=Oe.codeAt,ms=n.URL,bs=gs.URLSearchParams,ws=gs.getState,Ss=tt.set,Es=tt.getterFor("URL"),xs=Math.floor,As=Math.pow,Os="Invalid scheme",Rs="Invalid host",js="Invalid port",Ps=/[A-Za-z]/,Is=/[\d+-.A-Za-z]/,Ts=/\d/,ks=/^(0x|0X)/,Ls=/^[0-7]+$/,Us=/^\d+$/,Ms=/^[\dA-Fa-f]+$/,_s=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,Ns=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,Cs=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,Fs=/[\u0009\u000A\u000D]/g,Bs=function(t,e){var r,n,o;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return Rs;if(!(r=qs(e.slice(1,-1))))return Rs;t.host=r}else if(Xs(t)){if(e=function(t){var e,r,n=[],o=t.toLowerCase().replace(Bu,".").split(".");for(e=0;e<o.length;e++)n.push(Fu.test(r=o[e])?"xn--"+Gu(r):r);return n.join(".")}(e),_s.test(e))return Rs;if(null===(r=Ds(e)))return Rs;t.host=r}else{if(Ns.test(e))return Rs;for(r="",n=hr(e),o=0;o<n.length;o++)r+=Vs(n[o],Ws);t.host=r}},Ds=function(t){var e,r,n,o,i,a,u,s=t.split(".");if(s.length&&""==s[s.length-1]&&s.pop(),(e=s.length)>4)return t;for(r=[],n=0;n<e;n++){if(""==(o=s[n]))return t;if(i=10,o.length>1&&"0"==o.charAt(0)&&(i=ks.test(o)?16:8,o=o.slice(8==i?1:2)),""===o)a=0;else{if(!(10==i?Us:8==i?Ls:Ms).test(o))return t;a=parseInt(o,i)}r.push(a)}for(n=0;n<e;n++)if(a=r[n],n==e-1){if(a>=As(256,5-e))return null}else if(a>255)return null;for(u=r.pop(),n=0;n<r.length;n++)u+=r[n]*As(256,3-n);return u},qs=function(t){var e,r,n,o,i,a,u,s=[0,0,0,0,0,0,0,0],c=0,f=null,l=0,h=function(){return t.charAt(l)};if(":"==h()){if(":"!=t.charAt(1))return;l+=2,f=++c}for(;h();){if(8==c)return;if(":"!=h()){for(e=r=0;r<4&&Ms.test(h());)e=16*e+parseInt(h(),16),l++,r++;if("."==h()){if(0==r)return;if(l-=r,c>6)return;for(n=0;h();){if(o=null,n>0){if(!("."==h()&&n<4))return;l++}if(!Ts.test(h()))return;for(;Ts.test(h());){if(i=parseInt(h(),10),null===o)o=i;else{if(0==o)return;o=10*o+i}if(o>255)return;l++}s[c]=256*s[c]+o,2!=++n&&4!=n||c++}if(4!=n)return;break}if(":"==h()){if(l++,!h())return}else if(h())return;s[c++]=e}else{if(null!==f)return;l++,f=++c}}if(null!==f)for(a=c-f,c=7;0!=c&&a>0;)u=s[c],s[c--]=s[f+a-1],s[f+--a]=u;else if(8!=c)return;return s},zs=function(t){var e,r,n,o;if("number"==typeof t){for(e=[],r=0;r<4;r++)e.unshift(t%256),t=xs(t/256);return e.join(".")}if("object"==typeof t){for(e="",n=function(t){for(var e=null,r=1,n=null,o=0,i=0;i<8;i++)0!==t[i]?(o>r&&(e=n,r=o),n=null,o=0):(null===n&&(n=i),++o);return o>r&&(e=n,r=o),e}(t),r=0;r<8;r++)o&&0===t[r]||(o&&(o=!1),n===r?(e+=r?":":"::",o=!0):(e+=t[r].toString(16),r<7&&(e+=":")));return"["+e+"]"}return t},Ws={},Ks=Nu({},Ws,{" ":1,'"':1,"<":1,">":1,"`":1}),Gs=Nu({},Ks,{"#":1,"?":1,"{":1,"}":1}),$s=Nu({},Gs,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Vs=function(t,e){var r=ys(t,0);return r>32&&r<127&&!b(e,t)?t:encodeURIComponent(t)},Hs={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Xs=function(t){return b(Hs,t.scheme)},Ys=function(t){return""!=t.username||""!=t.password},Js=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},Qs=function(t,e){var r;return 2==t.length&&Ps.test(t.charAt(0))&&(":"==(r=t.charAt(1))||!e&&"|"==r)},Zs=function(t){var e;return t.length>1&&Qs(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},tc=function(t){var e=t.path,r=e.length;!r||"file"==t.scheme&&1==r&&Qs(e[0],!0)||e.pop()},ec=function(t){return"."===t||"%2e"===t.toLowerCase()},rc={},nc={},oc={},ic={},ac={},uc={},sc={},cc={},fc={},lc={},hc={},pc={},dc={},vc={},gc={},yc={},mc={},bc={},wc={},Sc={},Ec={},xc=function(t,e,r,n){var o,i,a,u,s,c=r||rc,f=0,l="",h=!1,p=!1,d=!1;for(r||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(Cs,"")),e=e.replace(Fs,""),o=hr(e);f<=o.length;){switch(i=o[f],c){case rc:if(!i||!Ps.test(i)){if(r)return Os;c=oc;continue}l+=i.toLowerCase(),c=nc;break;case nc:if(i&&(Is.test(i)||"+"==i||"-"==i||"."==i))l+=i.toLowerCase();else{if(":"!=i){if(r)return Os;l="",c=oc,f=0;continue}if(r&&(Xs(t)!=b(Hs,l)||"file"==l&&(Ys(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=l,r)return void(Xs(t)&&Hs[t.scheme]==t.port&&(t.port=null));l="","file"==t.scheme?c=vc:Xs(t)&&n&&n.scheme==t.scheme?c=ic:Xs(t)?c=cc:"/"==o[f+1]?(c=ac,f++):(t.cannotBeABaseURL=!0,t.path.push(""),c=wc)}break;case oc:if(!n||n.cannotBeABaseURL&&"#"!=i)return Os;if(n.cannotBeABaseURL&&"#"==i){t.scheme=n.scheme,t.path=n.path.slice(),t.query=n.query,t.fragment="",t.cannotBeABaseURL=!0,c=Ec;break}c="file"==n.scheme?vc:uc;continue;case ic:if("/"!=i||"/"!=o[f+1]){c=uc;continue}c=fc,f++;break;case ac:if("/"==i){c=lc;break}c=bc;continue;case uc:if(t.scheme=n.scheme,i==vs)t.username=n.username,t.password=n.password,t.host=n.host,t.port=n.port,t.path=n.path.slice(),t.query=n.query;else if("/"==i||"\\"==i&&Xs(t))c=sc;else if("?"==i)t.username=n.username,t.password=n.password,t.host=n.host,t.port=n.port,t.path=n.path.slice(),t.query="",c=Sc;else{if("#"!=i){t.username=n.username,t.password=n.password,t.host=n.host,t.port=n.port,t.path=n.path.slice(),t.path.pop(),c=bc;continue}t.username=n.username,t.password=n.password,t.host=n.host,t.port=n.port,t.path=n.path.slice(),t.query=n.query,t.fragment="",c=Ec}break;case sc:if(!Xs(t)||"/"!=i&&"\\"!=i){if("/"!=i){t.username=n.username,t.password=n.password,t.host=n.host,t.port=n.port,c=bc;continue}c=lc}else c=fc;break;case cc:if(c=fc,"/"!=i||"/"!=l.charAt(f+1))continue;f++;break;case fc:if("/"!=i&&"\\"!=i){c=lc;continue}break;case lc:if("@"==i){h&&(l="%40"+l),h=!0,a=hr(l);for(var v=0;v<a.length;v++){var g=a[v];if(":"!=g||d){var y=Vs(g,$s);d?t.password+=y:t.username+=y}else d=!0}l=""}else if(i==vs||"/"==i||"?"==i||"#"==i||"\\"==i&&Xs(t)){if(h&&""==l)return"Invalid authority";f-=hr(l).length+1,l="",c=hc}else l+=i;break;case hc:case pc:if(r&&"file"==t.scheme){c=yc;continue}if(":"!=i||p){if(i==vs||"/"==i||"?"==i||"#"==i||"\\"==i&&Xs(t)){if(Xs(t)&&""==l)return Rs;if(r&&""==l&&(Ys(t)||null!==t.port))return;if(u=Bs(t,l))return u;if(l="",c=mc,r)return;continue}"["==i?p=!0:"]"==i&&(p=!1),l+=i}else{if(""==l)return Rs;if(u=Bs(t,l))return u;if(l="",c=dc,r==pc)return}break;case dc:if(!Ts.test(i)){if(i==vs||"/"==i||"?"==i||"#"==i||"\\"==i&&Xs(t)||r){if(""!=l){var m=parseInt(l,10);if(m>65535)return js;t.port=Xs(t)&&m===Hs[t.scheme]?null:m,l=""}if(r)return;c=mc;continue}return js}l+=i;break;case vc:if(t.scheme="file","/"==i||"\\"==i)c=gc;else{if(!n||"file"!=n.scheme){c=bc;continue}if(i==vs)t.host=n.host,t.path=n.path.slice(),t.query=n.query;else if("?"==i)t.host=n.host,t.path=n.path.slice(),t.query="",c=Sc;else{if("#"!=i){Zs(o.slice(f).join(""))||(t.host=n.host,t.path=n.path.slice(),tc(t)),c=bc;continue}t.host=n.host,t.path=n.path.slice(),t.query=n.query,t.fragment="",c=Ec}}break;case gc:if("/"==i||"\\"==i){c=yc;break}n&&"file"==n.scheme&&!Zs(o.slice(f).join(""))&&(Qs(n.path[0],!0)?t.path.push(n.path[0]):t.host=n.host),c=bc;continue;case yc:if(i==vs||"/"==i||"\\"==i||"?"==i||"#"==i){if(!r&&Qs(l))c=bc;else if(""==l){if(t.host="",r)return;c=mc}else{if(u=Bs(t,l))return u;if("localhost"==t.host&&(t.host=""),r)return;l="",c=mc}continue}l+=i;break;case mc:if(Xs(t)){if(c=bc,"/"!=i&&"\\"!=i)continue}else if(r||"?"!=i)if(r||"#"!=i){if(i!=vs&&(c=bc,"/"!=i))continue}else t.fragment="",c=Ec;else t.query="",c=Sc;break;case bc:if(i==vs||"/"==i||"\\"==i&&Xs(t)||!r&&("?"==i||"#"==i)){if(".."===(s=(s=l).toLowerCase())||"%2e."===s||".%2e"===s||"%2e%2e"===s?(tc(t),"/"==i||"\\"==i&&Xs(t)||t.path.push("")):ec(l)?"/"==i||"\\"==i&&Xs(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&Qs(l)&&(t.host&&(t.host=""),l=l.charAt(0)+":"),t.path.push(l)),l="","file"==t.scheme&&(i==vs||"?"==i||"#"==i))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==i?(t.query="",c=Sc):"#"==i&&(t.fragment="",c=Ec)}else l+=Vs(i,Gs);break;case wc:"?"==i?(t.query="",c=Sc):"#"==i?(t.fragment="",c=Ec):i!=vs&&(t.path[0]+=Vs(i,Ws));break;case Sc:r||"#"!=i?i!=vs&&("'"==i&&Xs(t)?t.query+="%27":t.query+="#"==i?"%23":Vs(i,Ws)):(t.fragment="",c=Ec);break;case Ec:i!=vs&&(t.fragment+=Vs(i,Ks))}f++}},Ac=function(t){var e,r,n=_r(this,Ac,"URL"),o=arguments.length>1?arguments[1]:void 0,a=String(t),u=Ss(n,{type:"URL"});if(void 0!==o)if(o instanceof Ac)e=Es(o);else if(r=xc(e={},String(o)))throw TypeError(r);if(r=xc(u,a,null,e))throw TypeError(r);var s=u.searchParams=new bs,c=ws(s);c.updateSearchParams(u.query),c.updateURL=function(){u.query=String(s)||null},i||(n.href=Rc.call(n),n.origin=jc.call(n),n.protocol=Pc.call(n),n.username=Ic.call(n),n.password=Tc.call(n),n.host=kc.call(n),n.hostname=Lc.call(n),n.port=Uc.call(n),n.pathname=Mc.call(n),n.search=_c.call(n),n.searchParams=Nc.call(n),n.hash=Cc.call(n))},Oc=Ac.prototype,Rc=function(){var t=Es(this),e=t.scheme,r=t.username,n=t.password,o=t.host,i=t.port,a=t.path,u=t.query,s=t.fragment,c=e+":";return null!==o?(c+="//",Ys(t)&&(c+=r+(n?":"+n:"")+"@"),c+=zs(o),null!==i&&(c+=":"+i)):"file"==e&&(c+="//"),c+=t.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==u&&(c+="?"+u),null!==s&&(c+="#"+s),c},jc=function(){var t=Es(this),e=t.scheme,r=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&Xs(t)?e+"://"+zs(t.host)+(null!==r?":"+r:""):"null"},Pc=function(){return Es(this).scheme+":"},Ic=function(){return Es(this).username},Tc=function(){return Es(this).password},kc=function(){var t=Es(this),e=t.host,r=t.port;return null===e?"":null===r?zs(e):zs(e)+":"+r},Lc=function(){var t=Es(this).host;return null===t?"":zs(t)},Uc=function(){var t=Es(this).port;return null===t?"":String(t)},Mc=function(){var t=Es(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},_c=function(){var t=Es(this).query;return t?"?"+t:""},Nc=function(){return Es(this).searchParams},Cc=function(){var t=Es(this).fragment;return t?"#"+t:""},Fc=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(i&&zt(Oc,{href:Fc(Rc,function(t){var e=Es(this),r=String(t),n=xc(e,r);if(n)throw TypeError(n);ws(e.searchParams).updateSearchParams(e.query)}),origin:Fc(jc),protocol:Fc(Pc,function(t){var e=Es(this);xc(e,String(t)+":",rc)}),username:Fc(Ic,function(t){var e=Es(this),r=hr(String(t));if(!Js(e)){e.username="";for(var n=0;n<r.length;n++)e.username+=Vs(r[n],$s)}}),password:Fc(Tc,function(t){var e=Es(this),r=hr(String(t));if(!Js(e)){e.password="";for(var n=0;n<r.length;n++)e.password+=Vs(r[n],$s)}}),host:Fc(kc,function(t){var e=Es(this);e.cannotBeABaseURL||xc(e,String(t),hc)}),hostname:Fc(Lc,function(t){var e=Es(this);e.cannotBeABaseURL||xc(e,String(t),pc)}),port:Fc(Uc,function(t){var e=Es(this);Js(e)||(""==(t=String(t))?e.port=null:xc(e,t,dc))}),pathname:Fc(Mc,function(t){var e=Es(this);e.cannotBeABaseURL||(e.path=[],xc(e,t+"",mc))}),search:Fc(_c,function(t){var e=Es(this);""==(t=String(t))?e.query=null:("?"==t.charAt(0)&&(t=t.slice(1)),e.query="",xc(e,t,Sc)),ws(e.searchParams).updateSearchParams(e.query)}),searchParams:Fc(Nc),hash:Fc(Cc,function(t){var e=Es(this);""!=(t=String(t))?("#"==t.charAt(0)&&(t=t.slice(1)),e.fragment="",xc(e,t,Ec)):e.fragment=null})}),et(Oc,"toJSON",function(){return Rc.call(this)},{enumerable:!0}),et(Oc,"toString",function(){return Rc.call(this)},{enumerable:!0}),ms){var Bc=ms.createObjectURL,Dc=ms.revokeObjectURL;Bc&&et(Ac,"createObjectURL",function(t){return Bc.apply(ms,arguments)}),Dc&&et(Ac,"revokeObjectURL",function(t){return Dc.apply(ms,arguments)})}_e(Ac,"URL"),kt({global:!0,forced:!Uu,sham:!i},{URL:Ac}),kt({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}}),kt({target:"WeakMap",stat:!0},{from:en}),kt({target:"WeakMap",stat:!0},{of:rn}),kt({target:"WeakMap",proto:!0,real:!0,forced:D},{deleteAll:function(){return nn.apply(this,arguments)}}),kt({target:"WeakMap",proto:!0,real:!0,forced:D},{upsert:cn}),Cr("WeakSet",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},mo),kt({target:"WeakSet",proto:!0,real:!0,forced:D},{addAll:function(){return Hi.apply(this,arguments)}}),kt({target:"WeakSet",proto:!0,real:!0,forced:D},{deleteAll:function(){return nn.apply(this,arguments)}}),kt({target:"WeakSet",stat:!0},{from:en}),kt({target:"WeakSet",stat:!0},{of:rn});var qc,zc,Wc,Kc=n.Promise,Gc=/(iphone|ipod|ipad).*applewebkit/i.test(Qi),$c=n.location,Vc=n.setImmediate,Hc=n.clearImmediate,Xc=n.process,Yc=n.MessageChannel,Jc=n.Dispatch,Qc=0,Zc={},tf=function(t){if(Zc.hasOwnProperty(t)){var e=Zc[t];delete Zc[t],e()}},ef=function(t){return function(){tf(t)}},rf=function(t){tf(t.data)},nf=function(t){n.postMessage(t+"",$c.protocol+"//"+$c.host)};Vc&&Hc||(Vc=function(t){for(var e=[],r=1;arguments.length>r;)e.push(arguments[r++]);return Zc[++Qc]=function(){("function"==typeof t?t:Function(t)).apply(void 0,e)},qc(Qc),Qc},Hc=function(t){delete Zc[t]},"process"==l(Xc)?qc=function(t){Xc.nextTick(ef(t))}:Jc&&Jc.now?qc=function(t){Jc.now(ef(t))}:Yc&&!Gc?(Wc=(zc=new Yc).port2,zc.port1.onmessage=rf,qc=Zt(Wc.postMessage,Wc,1)):!n.addEventListener||"function"!=typeof postMessage||n.importScripts||o(nf)||"file:"===$c.protocol?qc="onreadystatechange"in E("script")?function(t){Wt.appendChild(E("script")).onreadystatechange=function(){Wt.removeChild(this),tf(t)}}:function(t){setTimeout(ef(t),0)}:(qc=nf,n.addEventListener("message",rf,!1)));var of,af,uf,sf,cf,ff,lf,hf,pf={set:Vc,clear:Hc},df=O.f,vf=pf.set,gf=n.MutationObserver||n.WebKitMutationObserver,yf=n.process,mf=n.Promise,bf="process"==l(yf),wf=df(n,"queueMicrotask"),Sf=wf&&wf.value;Sf||(of=function(){var t,e;for(bf&&(t=yf.domain)&&t.exit();af;){e=af.fn,af=af.next;try{e()}catch(t){throw af?sf():uf=void 0,t}}uf=void 0,t&&t.enter()},bf?sf=function(){yf.nextTick(of)}:gf&&!Gc?(cf=!0,ff=document.createTextNode(""),new gf(of).observe(ff,{characterData:!0}),sf=function(){ff.data=cf=!cf}):mf&&mf.resolve?(lf=mf.resolve(void 0),hf=lf.then,sf=function(){hf.call(lf,of)}):sf=function(){vf.call(n,of)});var Ef,xf,Af,Of,Rf=Sf||function(t){var e={fn:t,next:void 0};uf&&(uf.next=e),af||(af=e,sf()),uf=e},jf=function(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw TypeError("Bad Promise constructor");e=t,r=n}),this.resolve=Qt(e),this.reject=Qt(r)},Pf={f:function(t){return new jf(t)}},If=function(t,e){if(R(t),g(e)&&e.constructor===t)return e;var r=Pf.f(t);return(0,r.resolve)(e),r.promise},Tf=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}},kf=pf.set,Lf=Dt("species"),Uf="Promise",Mf=tt.get,_f=tt.set,Nf=tt.getterFor(Uf),Cf=Kc,Ff=n.TypeError,Bf=n.document,Df=n.process,qf=ot("fetch"),zf=Pf.f,Wf=zf,Kf="process"==l(Df),Gf=!!(Bf&&Bf.createEvent&&n.dispatchEvent),$f="unhandledrejection",Vf=It(Uf,function(){if(C(Cf)===String(Cf)){if(66===ra)return!0;if(!Kf&&"function"!=typeof PromiseRejectionEvent)return!0}if(ra>=51&&/native code/.test(Cf))return!1;var t=Cf.resolve(1),e=function(t){t(function(){},function(){})};return(t.constructor={})[Lf]=e,!(t.then(function(){})instanceof e)}),Hf=Vf||!yr(function(t){Cf.all(t).catch(function(){})}),Xf=function(t){var e;return!(!g(t)||"function"!=typeof(e=t.then))&&e},Yf=function(t,e,r){if(!e.notified){e.notified=!0;var n=e.reactions;Rf(function(){for(var o=e.value,i=1==e.state,a=0;n.length>a;){var u,s,c,f=n[a++],l=i?f.ok:f.fail,h=f.resolve,p=f.reject,d=f.domain;try{l?(i||(2===e.rejection&&tl(t,e),e.rejection=1),!0===l?u=o:(d&&d.enter(),u=l(o),d&&(d.exit(),c=!0)),u===f.promise?p(Ff("Promise-chain cycle")):(s=Xf(u))?s.call(u,h,p):h(u)):p(o)}catch(t){d&&!c&&d.exit(),p(t)}}e.reactions=[],e.notified=!1,r&&!e.rejection&&Qf(t,e)})}},Jf=function(t,e,r){var o,i;Gf?((o=Bf.createEvent("Event")).promise=e,o.reason=r,o.initEvent(t,!1,!0),n.dispatchEvent(o)):o={promise:e,reason:r},(i=n["on"+t])?i(o):t===$f&&function(t,e){var r=n.console;r&&r.error&&(1===arguments.length?r.error(t):r.error(t,e))}("Unhandled promise rejection",r)},Qf=function(t,e){kf.call(n,function(){var r,n=e.value;if(Zf(e)&&(r=Tf(function(){Kf?Df.emit("unhandledRejection",n,t):Jf($f,t,n)}),e.rejection=Kf||Zf(e)?2:1,r.error))throw r.value})},Zf=function(t){return 1!==t.rejection&&!t.parent},tl=function(t,e){kf.call(n,function(){Kf?Df.emit("rejectionHandled",t):Jf("rejectionhandled",t,e.value)})},el=function(t,e,r,n){return function(o){t(e,r,o,n)}},rl=function(t,e,r,n){e.done||(e.done=!0,n&&(e=n),e.value=r,e.state=2,Yf(t,e,!0))},nl=function t(e,r,n,o){if(!r.done){r.done=!0,o&&(r=o);try{if(e===n)throw Ff("Promise can't be resolved itself");var i=Xf(n);i?Rf(function(){var o={done:!1};try{i.call(n,el(t,e,o,r),el(rl,e,o,r))}catch(t){rl(e,o,t,r)}}):(r.value=n,r.state=1,Yf(e,r,!1))}catch(t){rl(e,{done:!1},t,r)}}};Vf&&(Cf=function(t){_r(this,Cf,Uf),Qt(t),Ef.call(this);var e=Mf(this);try{t(el(nl,this,e),el(rl,this,e))}catch(t){rl(this,e,t)}},(Ef=function(t){_f(this,{type:Uf,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Fr(Cf.prototype,{then:function(t,e){var r=Nf(this),n=zf(sn(this,Cf));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=Kf?Df.domain:void 0,r.parent=!0,r.reactions.push(n),0!=r.state&&Yf(this,r,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),xf=function(){var t=new Ef,e=Mf(t);this.promise=t,this.resolve=el(nl,t,e),this.reject=el(rl,t,e)},Pf.f=zf=function(t){return t===Cf||t===Af?new xf(t):Wf(t)},"function"==typeof Kc&&(Of=Kc.prototype.then,et(Kc.prototype,"then",function(t,e){var r=this;return new Cf(function(t,e){Of.call(r,t,e)}).then(t,e)},{unsafe:!0}),"function"==typeof qf&&kt({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return If(Cf,qf.apply(n,arguments))}}))),kt({global:!0,wrap:!0,forced:Vf},{Promise:Cf}),_e(Cf,Uf,!1),Dr(Uf),Af=ot(Uf),kt({target:Uf,stat:!0,forced:Vf},{reject:function(t){var e=zf(this);return e.reject.call(void 0,t),e.promise}}),kt({target:Uf,stat:!0,forced:Vf},{resolve:function(t){return If(this,t)}}),kt({target:Uf,stat:!0,forced:Hf},{all:function(t){var e=this,r=zf(e),n=r.resolve,o=r.reject,i=Tf(function(){var r=Qt(e.resolve),i=[],a=0,u=1;Mr(t,function(t){var s=a++,c=!1;i.push(void 0),u++,r.call(e,t).then(function(t){c||(c=!0,i[s]=t,--u||n(i))},o)}),--u||n(i)});return i.error&&o(i.value),r.promise},race:function(t){var e=this,r=zf(e),n=r.reject,o=Tf(function(){var o=Qt(e.resolve);Mr(t,function(t){o.call(e,t).then(r.resolve,n)})});return o.error&&n(o.value),r.promise}}),kt({target:"Promise",stat:!0},{allSettled:function(t){var e=this,r=Pf.f(e),n=r.resolve,o=r.reject,i=Tf(function(){var r=Qt(e.resolve),o=[],i=0,a=1;Mr(t,function(t){var u=i++,s=!1;o.push(void 0),a++,r.call(e,t).then(function(t){s||(s=!0,o[u]={status:"fulfilled",value:t},--a||n(o))},function(t){s||(s=!0,o[u]={status:"rejected",reason:t},--a||n(o))})}),--a||n(o)});return i.error&&o(i.value),r.promise}});var ol=!!Kc&&o(function(){Kc.prototype.finally.call({then:function(){}},function(){})});kt({target:"Promise",proto:!0,real:!0,forced:ol},{finally:function(t){var e=sn(this,ot("Promise")),r="function"==typeof t;return this.then(r?function(r){return If(e,t()).then(function(){return r})}:t,r?function(r){return If(e,t()).then(function(){throw r})}:t)}}),"function"!=typeof Kc||Kc.prototype.finally||et(Kc.prototype,"finally",ot("Promise").prototype.finally);var il=tt.set,al=tt.getterFor("AggregateError"),ul=function(t,e){var r=this;if(!(r instanceof ul))return new ul(t,e);qe&&(r=qe(new Error(e),Ie(r)));var n=[];return Mr(t,n.push,n),i?il(r,{errors:n,type:"AggregateError"}):r.errors=n,void 0!==e&&I(r,"message",String(e)),r};ul.prototype=Ht(Error.prototype,{constructor:c(5,ul),message:c(5,""),name:c(5,"AggregateError")}),i&&P.f(ul.prototype,"errors",{get:function(){return al(this).errors},configurable:!0}),kt({global:!0},{AggregateError:ul}),kt({target:"Promise",stat:!0},{try:function(t){var e=Pf.f(this),r=Tf(t);return(r.error?e.reject:e.resolve)(r.value),e.promise}});var sl="No one promise resolved";kt({target:"Promise",stat:!0},{any:function(t){var e=this,r=Pf.f(e),n=r.resolve,o=r.reject,i=Tf(function(){var r=Qt(e.resolve),i=[],a=0,u=1,s=!1;Mr(t,function(t){var c=a++,f=!1;i.push(void 0),u++,r.call(e,t).then(function(t){f||s||(s=!0,n(t))},function(t){f||s||(f=!0,i[c]=t,--u||o(new(ot("AggregateError"))(i,sl)))})}),--u||o(new(ot("AggregateError"))(i,sl))});return i.error&&o(i.value),r.promise}}),ee("Promise","finally");var cl="URLSearchParams"in self,fl="Symbol"in self&&"iterator"in Symbol,ll="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(t){return!1}}(),hl="FormData"in self,pl="ArrayBuffer"in self;if(pl)var dl=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],vl=ArrayBuffer.isView||function(t){return t&&dl.indexOf(Object.prototype.toString.call(t))>-1};function gl(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(t))throw new TypeError("Invalid character in header field name");return t.toLowerCase()}function yl(t){return"string"!=typeof t&&(t=String(t)),t}function ml(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return fl&&(e[Symbol.iterator]=function(){return e}),e}function bl(t){this.map={},t instanceof bl?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function wl(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function Sl(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function El(t){var e=new FileReader,r=Sl(e);return e.readAsArrayBuffer(t),r}function xl(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function Al(){return this.bodyUsed=!1,this._initBody=function(t){var e;this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:ll&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:hl&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:cl&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():pl&&ll&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=xl(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):pl&&(ArrayBuffer.prototype.isPrototypeOf(t)||vl(t))?this._bodyArrayBuffer=xl(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):cl&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},ll&&(this.blob=function(){var t=wl(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?wl(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(El)}),this.text=function(){var t=wl(this);if(t)return t;if(this._bodyBlob)return function(t){var e=new FileReader,r=Sl(e);return e.readAsText(t),r}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n<e.length;n++)r[n]=String.fromCharCode(e[n]);return r.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},hl&&(this.formData=function(){return this.text().then(jl)}),this.json=function(){return this.text().then(JSON.parse)},this}bl.prototype.append=function(t,e){t=gl(t),e=yl(e);var r=this.map[t];this.map[t]=r?r+", "+e:e},bl.prototype.delete=function(t){delete this.map[gl(t)]},bl.prototype.get=function(t){return t=gl(t),this.has(t)?this.map[t]:null},bl.prototype.has=function(t){return this.map.hasOwnProperty(gl(t))},bl.prototype.set=function(t,e){this.map[gl(t)]=yl(e)},bl.prototype.forEach=function(t,e){for(var r in this.map)this.map.hasOwnProperty(r)&&t.call(e,this.map[r],r,this)},bl.prototype.keys=function(){var t=[];return this.forEach(function(e,r){t.push(r)}),ml(t)},bl.prototype.values=function(){var t=[];return this.forEach(function(e){t.push(e)}),ml(t)},bl.prototype.entries=function(){var t=[];return this.forEach(function(e,r){t.push([r,e])}),ml(t)},fl&&(bl.prototype[Symbol.iterator]=bl.prototype.entries);var Ol=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function Rl(t,e){var r,n,o=(e=e||{}).body;if(t instanceof Rl){if(t.bodyUsed)throw new TypeError("Already read");this.url=t.url,this.credentials=t.credentials,e.headers||(this.headers=new bl(t.headers)),this.method=t.method,this.mode=t.mode,this.signal=t.signal,o||null==t._bodyInit||(o=t._bodyInit,t.bodyUsed=!0)}else this.url=String(t);if(this.credentials=e.credentials||this.credentials||"same-origin",!e.headers&&this.headers||(this.headers=new bl(e.headers)),this.method=(n=(r=e.method||this.method||"GET").toUpperCase(),Ol.indexOf(n)>-1?n:r),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&o)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(o)}function jl(t){var e=new FormData;return t.trim().split("&").forEach(function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function Pl(t,e){e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in e?e.statusText:"OK",this.headers=new bl(e.headers),this.url=e.url||"",this._initBody(t)}Rl.prototype.clone=function(){return new Rl(this,{body:this._bodyInit})},Al.call(Rl.prototype),Al.call(Pl.prototype),Pl.prototype.clone=function(){return new Pl(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new bl(this.headers),url:this.url})},Pl.error=function(){var t=new Pl(null,{status:0,statusText:""});return t.type="error",t};var Il=[301,302,303,307,308];Pl.redirect=function(t,e){if(-1===Il.indexOf(e))throw new RangeError("Invalid status code");return new Pl(null,{status:e,headers:{location:t}})};var Tl=self.DOMException;try{new Tl}catch(t){(Tl=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),Tl.prototype.constructor=Tl}function kl(t,e){return new Promise(function(r,n){var o=new Rl(t,e);if(o.signal&&o.signal.aborted)return n(new Tl("Aborted","AbortError"));var i=new XMLHttpRequest;function a(){i.abort()}i.onload=function(){var t,e,n={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||"",e=new bl,t.replace(/\r?\n[\t ]+/g," ").split(/\r?\n/).forEach(function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();e.append(n,o)}}),e)};n.url="responseURL"in i?i.responseURL:n.headers.get("X-Request-URL"),r(new Pl("response"in i?i.response:i.responseText,n))},i.onerror=function(){n(new TypeError("Network request failed"))},i.ontimeout=function(){n(new TypeError("Network request failed"))},i.onabort=function(){n(new Tl("Aborted","AbortError"))},i.open(o.method,o.url,!0),"include"===o.credentials?i.withCredentials=!0:"omit"===o.credentials&&(i.withCredentials=!1),"responseType"in i&&ll&&(i.responseType="blob"),o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}),o.signal&&(o.signal.addEventListener("abort",a),i.onreadystatechange=function(){4===i.readyState&&o.signal.removeEventListener("abort",a)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})}kl.polyfill=!0,self.fetch||(self.fetch=kl,self.Headers=bl,self.Request=Rl,self.Response=Pl);var Ll=Object.getOwnPropertySymbols,Ul=Object.prototype.hasOwnProperty,Ml=Object.prototype.propertyIsEnumerable;function _l(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}var Nl=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(t){n[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,n,o=_l(t),i=1;i<arguments.length;i++){for(var a in r=Object(arguments[i]))Ul.call(r,a)&&(o[a]=r[a]);if(Ll){n=Ll(r);for(var u=0;u<n.length;u++)Ml.call(r,n[u])&&(o[n[u]]=r[n[u]])}}return o};Object.assign=Nl}(); + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../compiled/webpack/global.js */ "./node_modules/next/dist/compiled/webpack/global.js"))) + +/***/ }), + +/***/ "./node_modules/next/dist/client/polyfills.js": +/*!****************************************************!*\ + !*** ./node_modules/next/dist/client/polyfills.js ***! + \****************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { + +__webpack_require__(/*! next/dist/build/polyfills/polyfill-nomodule */ "./node_modules/next/dist/build/polyfills/polyfill-nomodule.js"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../compiled/webpack/module.js */ "./node_modules/next/dist/compiled/webpack/module.js")(module))) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/global.js": +/*!***********************************!*\ + !*** (webpack)/webpack/global.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 149: +/***/ (function(module) { + +var g; + +// This works in non-strict mode +g = (function() { + return this; +})(); + +try { + // This works if eval is allowed (see CSP) + g = g || new Function("return this")(); +} catch (e) { + // This works if the window reference is available + if (typeof window === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(149); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }), + +/***/ "./node_modules/next/dist/compiled/webpack/module.js": +/*!***********************************!*\ + !*** (webpack)/webpack/module.js ***! + \***********************************/ +/*! no static exports found */ +/***/ (function(module, exports) { + +/* WEBPACK VAR INJECTION */(function(__dirname) {module.exports = +/******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 880: +/***/ (function(module) { + +module.exports = function(module) { + if (!module.webpackPolyfill) { + module.deprecate = function() {}; + module.paths = []; + // module.parent = undefined by default + if (!module.children) module.children = []; + Object.defineProperty(module, "loaded", { + enumerable: true, + get: function() { + return module.l; + } + }); + Object.defineProperty(module, "id", { + enumerable: true, + get: function() { + return module.i; + } + }); + module.webpackPolyfill = 1; + } + return module; +}; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId](module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __nccwpck_require__(880); +/******/ })() +; +/* WEBPACK VAR INJECTION */}.call(this, "/")) + +/***/ }) + +},[["./node_modules/next/dist/client/polyfills.js","webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL25leHQvZGlzdC9idWlsZC9wb2x5ZmlsbHMvcG9seWZpbGwtbm9tb2R1bGUuanMiLCJ3ZWJwYWNrOi8vX05fRS8uLi8uLi9jbGllbnQvcG9seWZpbGxzLmpzIiwid2VicGFjazovL19OX0UvKHdlYnBhY2spL3dlYnBhY2svZ2xvYmFsLmpzIiwid2VicGFjazovL19OX0UvKHdlYnBhY2spL3dlYnBhY2svbW9kdWxlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSwwREFBWSxxSkFBcUosY0FBYyxPQUFPLFlBQVksZ0NBQWdDLGtCQUFrQiwwQkFBMEIscUxBQXFMLElBQUksWUFBWSxTQUFTLFVBQVUsaUJBQWlCLGtDQUFrQyxJQUFJLGVBQWUsVUFBVSxLQUFLLE1BQU0sMkRBQTJELGNBQWMsSUFBSSxnQkFBZ0IsZ0JBQWdCLHdCQUF3QixHQUFHLGlCQUFpQixPQUFPLCtEQUErRCxLQUFLLHdCQUF3Qiw2QkFBNkIsMkJBQTJCLDJDQUEyQyxjQUFjLDRDQUE0QyxzQkFBc0Isc0RBQXNELFNBQVMsZUFBZSxlQUFlLGVBQWUsdURBQXVELGlCQUFpQixrQkFBa0IsUUFBUSxpRUFBaUUsNkRBQTZELGtFQUFrRSwyREFBMkQsS0FBSyxnQ0FBZ0MsbUJBQW1CLHVEQUF1RCwrQkFBK0IscUJBQXFCLDhDQUE4QyxlQUFlLFVBQVUsSUFBSSx1Q0FBdUMsb0JBQW9CLDBCQUEwQixjQUFjLFVBQVUseUNBQXlDLGVBQWUsd0RBQXdELFNBQVMsNEJBQTRCLHNCQUFzQiw2QkFBNkIsZ0JBQWdCLFVBQVUsbUVBQW1FLHFDQUFxQyxxQkFBcUIsdUJBQXVCLGlCQUFpQixnQkFBZ0IsaUJBQWlCLElBQUksU0FBUyxTQUFTLE9BQU8sU0FBUyxzQ0FBc0Msc0JBQXNCLGlFQUFpRSxpQkFBaUIsRUFBRSw4R0FBOEcseUJBQXlCLGtDQUFrQyxFQUFFLHVCQUF1QiwrRUFBK0UsRUFBRSxvQ0FBb0Msa0VBQWtF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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLEM7Ozs7Ozs7Ozs7OztBQ3ZFQTtBQUNBLHNCQUFzQjtBQUN0Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7O0FBR0EsT0FBTzs7QUFFUCxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1YsQyIsImZpbGUiOiJzdGF0aWMvY2h1bmtzL3BvbHlmaWxscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIiFmdW5jdGlvbigpe3ZhciB0PVwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBlKHQpe3ZhciBlPXtleHBvcnRzOnt9fTtyZXR1cm4gdChlLGUuZXhwb3J0cyksZS5leHBvcnRzfXZhciByPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PU1hdGgmJnR9LG49cihcIm9iamVjdFwiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyl8fHIoXCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8cihcIm9iamVjdFwiPT10eXBlb2Ygc2VsZiYmc2VsZil8fHIoXCJvYmplY3RcIj09dHlwZW9mIHQmJnQpfHxGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCksbz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fSxpPSFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwxLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KVsxXX0pLGE9e30ucHJvcGVydHlJc0VudW1lcmFibGUsdT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHM9e2Y6dSYmIWEuY2FsbCh7MToyfSwxKT9mdW5jdGlvbih0KXt2YXIgZT11KHRoaXMsdCk7cmV0dXJuISFlJiZlLmVudW1lcmFibGV9OmF9LGM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19LGY9e30udG9TdHJpbmcsbD1mdW5jdGlvbih0KXtyZXR1cm4gZi5jYWxsKHQpLnNsaWNlKDgsLTEpfSxoPVwiXCIuc3BsaXQscD1vKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdChcInpcIikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm5cIlN0cmluZ1wiPT1sKHQpP2guY2FsbCh0LFwiXCIpOk9iamVjdCh0KX06T2JqZWN0LGQ9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiBcIit0KTtyZXR1cm4gdH0sdj1mdW5jdGlvbih0KXtyZXR1cm4gcChkKHQpKX0sZz1mdW5jdGlvbih0KXtyZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgdD9udWxsIT09dDpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0fSx5PWZ1bmN0aW9uKHQsZSl7aWYoIWcodCkpcmV0dXJuIHQ7dmFyIHIsbjtpZihlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihyPXQudG9TdHJpbmcpJiYhZyhuPXIuY2FsbCh0KSkpcmV0dXJuIG47aWYoXCJmdW5jdGlvblwiPT10eXBlb2Yocj10LnZhbHVlT2YpJiYhZyhuPXIuY2FsbCh0KSkpcmV0dXJuIG47aWYoIWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKHI9dC50b1N0cmluZykmJiFnKG49ci5jYWxsKHQpKSlyZXR1cm4gbjt0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIil9LG09e30uaGFzT3duUHJvcGVydHksYj1mdW5jdGlvbih0LGUpe3JldHVybiBtLmNhbGwodCxlKX0sdz1uLmRvY3VtZW50LFM9Zyh3KSYmZyh3LmNyZWF0ZUVsZW1lbnQpLEU9ZnVuY3Rpb24odCl7cmV0dXJuIFM/dy5jcmVhdGVFbGVtZW50KHQpOnt9fSx4PSFpJiYhbyhmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoRShcImRpdlwiKSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pLEE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixPPXtmOmk/QTpmdW5jdGlvbih0LGUpe2lmKHQ9dih0KSxlPXkoZSwhMCkseCl0cnl7cmV0dXJuIEEodCxlKX1jYXRjaCh0KXt9aWYoYih0LGUpKXJldHVybiBjKCFzLmYuY2FsbCh0LGUpLHRbZV0pfX0sUj1mdW5jdGlvbih0KXtpZighZyh0KSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpK1wiIGlzIG5vdCBhbiBvYmplY3RcIik7cmV0dXJuIHR9LGo9T2JqZWN0LmRlZmluZVByb3BlcnR5LFA9e2Y6aT9qOmZ1bmN0aW9uKHQsZSxyKXtpZihSKHQpLGU9eShlLCEwKSxSKHIpLHgpdHJ5e3JldHVybiBqKHQsZSxyKX1jYXRjaCh0KXt9aWYoXCJnZXRcImluIHJ8fFwic2V0XCJpbiByKXRocm93IFR5cGVFcnJvcihcIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkXCIpO3JldHVyblwidmFsdWVcImluIHImJih0W2VdPXIudmFsdWUpLHR9fSxJPWk/ZnVuY3Rpb24odCxlLHIpe3JldHVybiBQLmYodCxlLGMoMSxyKSl9OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFtlXT1yLHR9LFQ9ZnVuY3Rpb24odCxlKXt0cnl7SShuLHQsZSl9Y2F0Y2gocil7blt0XT1lfXJldHVybiBlfSxrPVwiX19jb3JlLWpzX3NoYXJlZF9fXCIsTD1uW2tdfHxUKGsse30pLFU9RnVuY3Rpb24udG9TdHJpbmc7XCJmdW5jdGlvblwiIT10eXBlb2YgTC5pbnNwZWN0U291cmNlJiYoTC5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBVLmNhbGwodCl9KTt2YXIgTSxfLE4sQz1MLmluc3BlY3RTb3VyY2UsRj1uLldlYWtNYXAsQj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBGJiYvbmF0aXZlIGNvZGUvLnRlc3QoQyhGKSksRD0hMSxxPWUoZnVuY3Rpb24odCl7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBMW3RdfHwoTFt0XT12b2lkIDAhPT1lP2U6e30pfSkoXCJ2ZXJzaW9uc1wiLFtdKS5wdXNoKHt2ZXJzaW9uOlwiMy42LjVcIixtb2RlOlwiZ2xvYmFsXCIsY29weXJpZ2h0OlwiwqkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KVwifSl9KSx6PTAsVz1NYXRoLnJhbmRvbSgpLEs9ZnVuY3Rpb24odCl7cmV0dXJuXCJTeW1ib2woXCIrU3RyaW5nKHZvaWQgMD09PXQ/XCJcIjp0KStcIilfXCIrKCsreitXKS50b1N0cmluZygzNil9LEc9cShcImtleXNcIiksJD1mdW5jdGlvbih0KXtyZXR1cm4gR1t0XXx8KEdbdF09Syh0KSl9LFY9e307aWYoQil7dmFyIEg9bmV3KDAsbi5XZWFrTWFwKSxYPUguZ2V0LFk9SC5oYXMsSj1ILnNldDtNPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEouY2FsbChILHQsZSksZX0sXz1mdW5jdGlvbih0KXtyZXR1cm4gWC5jYWxsKEgsdCl8fHt9fSxOPWZ1bmN0aW9uKHQpe3JldHVybiBZLmNhbGwoSCx0KX19ZWxzZXt2YXIgUT0kKFwic3RhdGVcIik7VltRXT0hMCxNPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEkodCxRLGUpLGV9LF89ZnVuY3Rpb24odCl7cmV0dXJuIGIodCxRKT90W1FdOnt9fSxOPWZ1bmN0aW9uKHQpe3JldHVybiBiKHQsUSl9fXZhciBaLHR0PXtzZXQ6TSxnZXQ6XyxoYXM6TixlbmZvcmNlOmZ1bmN0aW9uKHQpe3JldHVybiBOKHQpP18odCk6TSh0LHt9KX0sZ2V0dGVyRm9yOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcjtpZighZyhlKXx8KHI9XyhlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKFwiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBcIit0K1wiIHJlcXVpcmVkXCIpO3JldHVybiByfX19LGV0PWUoZnVuY3Rpb24odCl7dmFyIGU9dHQuZ2V0LHI9dHQuZW5mb3JjZSxvPVN0cmluZyhTdHJpbmcpLnNwbGl0KFwiU3RyaW5nXCIpOyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGksYSl7dmFyIHU9ISFhJiYhIWEudW5zYWZlLHM9ISFhJiYhIWEuZW51bWVyYWJsZSxjPSEhYSYmISFhLm5vVGFyZ2V0R2V0O1wiZnVuY3Rpb25cIj09dHlwZW9mIGkmJihcInN0cmluZ1wiIT10eXBlb2YgZXx8YihpLFwibmFtZVwiKXx8SShpLFwibmFtZVwiLGUpLHIoaSkuc291cmNlPW8uam9pbihcInN0cmluZ1wiPT10eXBlb2YgZT9lOlwiXCIpKSx0IT09bj8odT8hYyYmdFtlXSYmKHM9ITApOmRlbGV0ZSB0W2VdLHM/dFtlXT1pOkkodCxlLGkpKTpzP3RbZV09aTpUKGUsaSl9KShGdW5jdGlvbi5wcm90b3R5cGUsXCJ0b1N0cmluZ1wiLGZ1bmN0aW9uKCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcyYmZSh0aGlzKS5zb3VyY2V8fEModGhpcyl9KX0pLHJ0PW4sbnQ9ZnVuY3Rpb24odCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD90OnZvaWQgMH0sb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP250KHJ0W3RdKXx8bnQoblt0XSk6cnRbdF0mJnJ0W3RdW2VdfHxuW3RdJiZuW3RdW2VdfSxpdD1NYXRoLmNlaWwsYXQ9TWF0aC5mbG9vcix1dD1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP2F0Oml0KSh0KX0sc3Q9TWF0aC5taW4sY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9zdCh1dCh0KSw5MDA3MTk5MjU0NzQwOTkxKTowfSxmdD1NYXRoLm1heCxsdD1NYXRoLm1pbixodD1mdW5jdGlvbih0LGUpe3ZhciByPXV0KHQpO3JldHVybiByPDA/ZnQocitlLDApOmx0KHIsZSl9LHB0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7dmFyIG8saT12KGUpLGE9Y3QoaS5sZW5ndGgpLHU9aHQobixhKTtpZih0JiZyIT1yKXtmb3IoO2E+dTspaWYoKG89aVt1KytdKSE9bylyZXR1cm4hMH1lbHNlIGZvcig7YT51O3UrKylpZigodHx8dSBpbiBpKSYmaVt1XT09PXIpcmV0dXJuIHR8fHV8fDA7cmV0dXJuIXQmJi0xfX0sZHQ9e2luY2x1ZGVzOnB0KCEwKSxpbmRleE9mOnB0KCExKX0sdnQ9ZHQuaW5kZXhPZixndD1mdW5jdGlvbih0LGUpe3ZhciByLG49dih0KSxvPTAsaT1bXTtmb3IociBpbiBuKSFiKFYscikmJmIobixyKSYmaS5wdXNoKHIpO2Zvcig7ZS5sZW5ndGg+bzspYihuLHI9ZVtvKytdKSYmKH52dChpLHIpfHxpLnB1c2gocikpO3JldHVybiBpfSx5dD1bXCJjb25zdHJ1Y3RvclwiLFwiaGFzT3duUHJvcGVydHlcIixcImlzUHJvdG90eXBlT2ZcIixcInByb3BlcnR5SXNFbnVtZXJhYmxlXCIsXCJ0b0xvY2FsZVN0cmluZ1wiLFwidG9TdHJpbmdcIixcInZhbHVlT2ZcIl0sbXQ9eXQuY29uY2F0KFwibGVuZ3RoXCIsXCJwcm90b3R5cGVcIiksYnQ9e2Y6T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiBndCh0LG10KX19LHd0PXtmOk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LFN0PW90KFwiUmVmbGVjdFwiLFwib3duS2V5c1wiKXx8ZnVuY3Rpb24odCl7dmFyIGU9YnQuZihSKHQpKSxyPXd0LmY7cmV0dXJuIHI/ZS5jb25jYXQocih0KSk6ZX0sRXQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9U3QoZSksbj1QLmYsbz1PLmYsaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgYT1yW2ldO2IodCxhKXx8bih0LGEsbyhlLGEpKX19LHh0PS8jfFxcLnByb3RvdHlwZVxcLi8sQXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1SdFtPdCh0KV07cmV0dXJuIHI9PVB0fHxyIT1qdCYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/byhlKTohIWUpfSxPdD1BdC5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKHh0LFwiLlwiKS50b0xvd2VyQ2FzZSgpfSxSdD1BdC5kYXRhPXt9LGp0PUF0Lk5BVElWRT1cIk5cIixQdD1BdC5QT0xZRklMTD1cIlBcIixJdD1BdCxUdD1PLmYsa3Q9ZnVuY3Rpb24odCxlKXt2YXIgcixvLGksYSx1LHM9dC50YXJnZXQsYz10Lmdsb2JhbCxmPXQuc3RhdDtpZihyPWM/bjpmP25bc118fFQocyx7fSk6KG5bc118fHt9KS5wcm90b3R5cGUpZm9yKG8gaW4gZSl7aWYoYT1lW29dLGk9dC5ub1RhcmdldEdldD8odT1UdChyLG8pKSYmdS52YWx1ZTpyW29dLCFJdChjP286cysoZj9cIi5cIjpcIiNcIikrbyx0LmZvcmNlZCkmJnZvaWQgMCE9PWkpe2lmKHR5cGVvZiBhPT10eXBlb2YgaSljb250aW51ZTtFdChhLGkpfSh0LnNoYW18fGkmJmkuc2hhbSkmJkkoYSxcInNoYW1cIiwhMCksZXQocixvLGEsdCl9fSxMdD1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KGQodCkpfSxVdD1NYXRoLm1pbixNdD1bXS5jb3B5V2l0aGlufHxmdW5jdGlvbih0LGUpe3ZhciByPUx0KHRoaXMpLG49Y3Qoci5sZW5ndGgpLG89aHQodCxuKSxpPWh0KGUsbiksYT1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMCx1PVV0KCh2b2lkIDA9PT1hP246aHQoYSxuKSktaSxuLW8pLHM9MTtmb3IoaTxvJiZvPGkrdSYmKHM9LTEsaSs9dS0xLG8rPXUtMSk7dS0tID4wOylpIGluIHI/cltvXT1yW2ldOmRlbGV0ZSByW29dLG8rPXMsaSs9cztyZXR1cm4gcn0sX3Q9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhbyhmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSksTnQ9X3QmJiFTeW1ib2wuc2hhbSYmXCJzeW1ib2xcIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcixDdD1xKFwid2tzXCIpLEZ0PW4uU3ltYm9sLEJ0PU50P0Z0OkZ0JiZGdC53aXRob3V0U2V0dGVyfHxLLER0PWZ1bmN0aW9uKHQpe3JldHVybiBiKEN0LHQpfHwoQ3RbdF09X3QmJmIoRnQsdCk/RnRbdF06QnQoXCJTeW1ib2wuXCIrdCkpLEN0W3RdfSxxdD1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIGd0KHQseXQpfSx6dD1pP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7Uih0KTtmb3IodmFyIHIsbj1xdChlKSxvPW4ubGVuZ3RoLGk9MDtvPmk7KVAuZih0LHI9bltpKytdLGVbcl0pO3JldHVybiB0fSxXdD1vdChcImRvY3VtZW50XCIsXCJkb2N1bWVudEVsZW1lbnRcIiksS3Q9JChcIklFX1BST1RPXCIpLEd0PWZ1bmN0aW9uKCl7fSwkdD1mdW5jdGlvbih0KXtyZXR1cm5cIjxzY3JpcHQ+XCIrdCtcIjxcXC9zY3JpcHQ+XCJ9LFZ0PWZ1bmN0aW9uKCl7dHJ5e1o9ZG9jdW1lbnQuZG9tYWluJiZuZXcgQWN0aXZlWE9iamVjdChcImh0bWxmaWxlXCIpfWNhdGNoKHQpe312YXIgdCxlO1Z0PVo/ZnVuY3Rpb24odCl7dC53cml0ZSgkdChcIlwiKSksdC5jbG9zZSgpO3ZhciBlPXQucGFyZW50V2luZG93Lk9iamVjdDtyZXR1cm4gdD1udWxsLGV9KFopOigoZT1FKFwiaWZyYW1lXCIpKS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLFd0LmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZyhcImphdmFzY3JpcHQ6XCIpLCh0PWUuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLHQud3JpdGUoJHQoXCJkb2N1bWVudC5GPU9iamVjdFwiKSksdC5jbG9zZSgpLHQuRik7Zm9yKHZhciByPXl0Lmxlbmd0aDtyLS07KWRlbGV0ZSBWdC5wcm90b3R5cGVbeXRbcl1dO3JldHVybiBWdCgpfTtWW0t0XT0hMDt2YXIgSHQ9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gbnVsbCE9PXQ/KEd0LnByb3RvdHlwZT1SKHQpLHI9bmV3IEd0LEd0LnByb3RvdHlwZT1udWxsLHJbS3RdPXQpOnI9VnQoKSx2b2lkIDA9PT1lP3I6enQocixlKX0sWHQ9RHQoXCJ1bnNjb3BhYmxlc1wiKSxZdD1BcnJheS5wcm90b3R5cGU7bnVsbD09WXRbWHRdJiZQLmYoWXQsWHQse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTpIdChudWxsKX0pO3ZhciBKdD1mdW5jdGlvbih0KXtZdFtYdF1bdF09ITB9O2t0KHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwfSx7Y29weVdpdGhpbjpNdH0pLEp0KFwiY29weVdpdGhpblwiKTt2YXIgUXQ9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpK1wiIGlzIG5vdCBhIGZ1bmN0aW9uXCIpO3JldHVybiB0fSxadD1mdW5jdGlvbih0LGUscil7aWYoUXQodCksdm9pZCAwPT09ZSlyZXR1cm4gdDtzd2l0Y2gocil7Y2FzZSAwOnJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmNhbGwoZSl9O2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHQuY2FsbChlLHIpfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKHIsbil7cmV0dXJuIHQuY2FsbChlLHIsbil9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24ocixuLG8pe3JldHVybiB0LmNhbGwoZSxyLG4sbyl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19LHRlPUZ1bmN0aW9uLmNhbGwsZWU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBadCh0ZSxuW3RdLnByb3RvdHlwZVtlXSxyKX07ZWUoXCJBcnJheVwiLFwiY29weVdpdGhpblwiKSxrdCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMH0se2ZpbGw6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPUx0KHRoaXMpLHI9Y3QoZS5sZW5ndGgpLG49YXJndW1lbnRzLmxlbmd0aCxvPWh0KG4+MT9hcmd1bWVudHNbMV06dm9pZCAwLHIpLGk9bj4yP2FyZ3VtZW50c1syXTp2b2lkIDAsYT12b2lkIDA9PT1pP3I6aHQoaSxyKTthPm87KWVbbysrXT10O3JldHVybiBlfX0pLEp0KFwiZmlsbFwiKSxlZShcIkFycmF5XCIsXCJmaWxsXCIpO3ZhciByZT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm5cIkFycmF5XCI9PWwodCl9LG5lPUR0KFwic3BlY2llc1wiKSxvZT1mdW5jdGlvbih0LGUpe3ZhciByO3JldHVybiByZSh0KSYmKFwiZnVuY3Rpb25cIiE9dHlwZW9mKHI9dC5jb25zdHJ1Y3Rvcil8fHIhPT1BcnJheSYmIXJlKHIucHJvdG90eXBlKT9nKHIpJiZudWxsPT09KHI9cltuZV0pJiYocj12b2lkIDApOnI9dm9pZCAwKSxuZXcodm9pZCAwPT09cj9BcnJheTpyKSgwPT09ZT8wOmUpfSxpZT1bXS5wdXNoLGFlPWZ1bmN0aW9uKHQpe3ZhciBlPTE9PXQscj0yPT10LG49Mz09dCxvPTQ9PXQsaT02PT10LGE9NT09dHx8aTtyZXR1cm4gZnVuY3Rpb24odSxzLGMsZil7Zm9yKHZhciBsLGgsZD1MdCh1KSx2PXAoZCksZz1adChzLGMsMykseT1jdCh2Lmxlbmd0aCksbT0wLGI9Znx8b2Usdz1lP2IodSx5KTpyP2IodSwwKTp2b2lkIDA7eT5tO20rKylpZigoYXx8bSBpbiB2KSYmKGg9ZyhsPXZbbV0sbSxkKSx0KSlpZihlKXdbbV09aDtlbHNlIGlmKGgpc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIGw7Y2FzZSA2OnJldHVybiBtO2Nhc2UgMjppZS5jYWxsKHcsbCl9ZWxzZSBpZihvKXJldHVybiExO3JldHVybiBpPy0xOm58fG8/bzp3fX0sdWU9e2ZvckVhY2g6YWUoMCksbWFwOmFlKDEpLGZpbHRlcjphZSgyKSxzb21lOmFlKDMpLGV2ZXJ5OmFlKDQpLGZpbmQ6YWUoNSksZmluZEluZGV4OmFlKDYpfSxzZT1PYmplY3QuZGVmaW5lUHJvcGVydHksY2U9e30sZmU9ZnVuY3Rpb24odCl7dGhyb3cgdH0sbGU9ZnVuY3Rpb24odCxlKXtpZihiKGNlLHQpKXJldHVybiBjZVt0XTtlfHwoZT17fSk7dmFyIHI9W11bdF0sbj0hIWIoZSxcIkFDQ0VTU09SU1wiKSYmZS5BQ0NFU1NPUlMsYT1iKGUsMCk/ZVswXTpmZSx1PWIoZSwxKT9lWzFdOnZvaWQgMDtyZXR1cm4gY2VbdF09ISFyJiYhbyhmdW5jdGlvbigpe2lmKG4mJiFpKXJldHVybiEwO3ZhciB0PXtsZW5ndGg6LTF9O24/c2UodCwxLHtlbnVtZXJhYmxlOiEwLGdldDpmZX0pOnRbMV09MSxyLmNhbGwodCxhLHUpfSl9LGhlPXVlLmZpbmQscGU9XCJmaW5kXCIsZGU9ITAsdmU9bGUocGUpO3BlIGluW10mJkFycmF5KDEpLmZpbmQoZnVuY3Rpb24oKXtkZT0hMX0pLGt0KHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDpkZXx8IXZlfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gaGUodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxKdChwZSksZWUoXCJBcnJheVwiLFwiZmluZFwiKTt2YXIgZ2U9dWUuZmluZEluZGV4LHllPVwiZmluZEluZGV4XCIsbWU9ITAsYmU9bGUoeWUpO3llIGluW10mJkFycmF5KDEpLmZpbmRJbmRleChmdW5jdGlvbigpe21lPSExfSksa3Qoe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITAsZm9yY2VkOm1lfHwhYmV9LHtmaW5kSW5kZXg6ZnVuY3Rpb24odCl7cmV0dXJuIGdlKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksSnQoeWUpLGVlKFwiQXJyYXlcIixcImZpbmRJbmRleFwiKTt2YXIgd2U9ZnVuY3Rpb24gdChlLHIsbixvLGksYSx1LHMpe2Zvcih2YXIgYyxmPWksbD0wLGg9ISF1JiZadCh1LHMsMyk7bDxvOyl7aWYobCBpbiBuKXtpZihjPWg/aChuW2xdLGwscik6bltsXSxhPjAmJnJlKGMpKWY9dChlLHIsYyxjdChjLmxlbmd0aCksZixhLTEpLTE7ZWxzZXtpZihmPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcihcIkV4Y2VlZCB0aGUgYWNjZXB0YWJsZSBhcnJheSBsZW5ndGhcIik7ZVtmXT1jfWYrK31sKyt9cmV0dXJuIGZ9O2t0KHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwfSx7ZmxhdE1hcDpmdW5jdGlvbih0KXt2YXIgZSxyPUx0KHRoaXMpLG49Y3Qoci5sZW5ndGgpO3JldHVybiBRdCh0KSwoZT1vZShyLDApKS5sZW5ndGg9d2UoZSxyLHIsbiwwLDEsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCksZX19KSxKdChcImZsYXRNYXBcIiksZWUoXCJBcnJheVwiLFwiZmxhdE1hcFwiKSxrdCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMH0se2ZsYXQ6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDAsZT1MdCh0aGlzKSxyPWN0KGUubGVuZ3RoKSxuPW9lKGUsMCk7cmV0dXJuIG4ubGVuZ3RoPXdlKG4sZSxlLHIsMCx2b2lkIDA9PT10PzE6dXQodCkpLG59fSksSnQoXCJmbGF0XCIpLGVlKFwiQXJyYXlcIixcImZsYXRcIik7dmFyIFNlLEVlLHhlLEFlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIpe3ZhciBuLG8saT1TdHJpbmcoZChlKSksYT11dChyKSx1PWkubGVuZ3RoO3JldHVybiBhPDB8fGE+PXU/dD9cIlwiOnZvaWQgMDoobj1pLmNoYXJDb2RlQXQoYSkpPDU1Mjk2fHxuPjU2MzE5fHxhKzE9PT11fHwobz1pLmNoYXJDb2RlQXQoYSsxKSk8NTYzMjB8fG8+NTczNDM/dD9pLmNoYXJBdChhKTpuOnQ/aS5zbGljZShhLGErMik6by01NjMyMCsobi01NTI5Njw8MTApKzY1NTM2fX0sT2U9e2NvZGVBdDpBZSghMSksY2hhckF0OkFlKCEwKX0sUmU9IW8oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgdCkhPT10LnByb3RvdHlwZX0pLGplPSQoXCJJRV9QUk9UT1wiKSxQZT1PYmplY3QucHJvdG90eXBlLEllPVJlP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdD1MdCh0KSxiKHQsamUpP3RbamVdOlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/UGU6bnVsbH0sVGU9RHQoXCJpdGVyYXRvclwiKSxrZT0hMTtbXS5rZXlzJiYoXCJuZXh0XCJpbih4ZT1bXS5rZXlzKCkpPyhFZT1JZShJZSh4ZSkpKSE9PU9iamVjdC5wcm90b3R5cGUmJihTZT1FZSk6a2U9ITApLG51bGw9PVNlJiYoU2U9e30pLGIoU2UsVGUpfHxJKFNlLFRlLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTt2YXIgTGU9e0l0ZXJhdG9yUHJvdG90eXBlOlNlLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6a2V9LFVlPVAuZixNZT1EdChcInRvU3RyaW5nVGFnXCIpLF9lPWZ1bmN0aW9uKHQsZSxyKXt0JiYhYih0PXI/dDp0LnByb3RvdHlwZSxNZSkmJlVlKHQsTWUse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTplfSl9LE5lPXt9LENlPUxlLkl0ZXJhdG9yUHJvdG90eXBlLEZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEJlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lK1wiIEl0ZXJhdG9yXCI7cmV0dXJuIHQucHJvdG90eXBlPUh0KENlLHtuZXh0OmMoMSxyKX0pLF9lKHQsbiwhMSksTmVbbl09RmUsdH0sRGU9ZnVuY3Rpb24odCl7aWYoIWcodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIitTdHJpbmcodCkrXCIgYXMgYSBwcm90b3R5cGVcIik7cmV0dXJuIHR9LHFlPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KFwiX19wcm90b19fXCJpbnt9P2Z1bmN0aW9uKCl7dmFyIHQsZT0hMSxyPXt9O3RyeXsodD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsXCJfX3Byb3RvX19cIikuc2V0KS5jYWxsKHIsW10pLGU9ciBpbnN0YW5jZW9mIEFycmF5fWNhdGNoKHQpe31yZXR1cm4gZnVuY3Rpb24ocixuKXtyZXR1cm4gUihyKSxEZShuKSxlP3QuY2FsbChyLG4pOnIuX19wcm90b19fPW4scn19KCk6dm9pZCAwKSx6ZT1MZS5JdGVyYXRvclByb3RvdHlwZSxXZT1MZS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLEtlPUR0KFwiaXRlcmF0b3JcIiksR2U9XCJrZXlzXCIsJGU9XCJ2YWx1ZXNcIixWZT1cImVudHJpZXNcIixIZT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxYZT1mdW5jdGlvbih0LGUscixuLG8saSxhKXtCZShyLGUsbik7dmFyIHUscyxjLGY9ZnVuY3Rpb24odCl7aWYodD09PW8mJnYpcmV0dXJuIHY7aWYoIVdlJiZ0IGluIHApcmV0dXJuIHBbdF07c3dpdGNoKHQpe2Nhc2UgR2U6Y2FzZSAkZTpjYXNlIFZlOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyl9fSxsPWUrXCIgSXRlcmF0b3JcIixoPSExLHA9dC5wcm90b3R5cGUsZD1wW0tlXXx8cFtcIkBAaXRlcmF0b3JcIl18fG8mJnBbb10sdj0hV2UmJmR8fGYobyksZz1cIkFycmF5XCI9PWUmJnAuZW50cmllc3x8ZDtpZihnJiYodT1JZShnLmNhbGwobmV3IHQpKSx6ZSE9PU9iamVjdC5wcm90b3R5cGUmJnUubmV4dCYmKEllKHUpIT09emUmJihxZT9xZSh1LHplKTpcImZ1bmN0aW9uXCIhPXR5cGVvZiB1W0tlXSYmSSh1LEtlLEhlKSksX2UodSxsLCEwKSkpLG89PSRlJiZkJiZkLm5hbWUhPT0kZSYmKGg9ITAsdj1mdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcyl9KSxwW0tlXSE9PXYmJkkocCxLZSx2KSxOZVtlXT12LG8paWYocz17dmFsdWVzOmYoJGUpLGtleXM6aT92OmYoR2UpLGVudHJpZXM6ZihWZSl9LGEpZm9yKGMgaW4gcykoV2V8fGh8fCEoYyBpbiBwKSkmJmV0KHAsYyxzW2NdKTtlbHNlIGt0KHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6V2V8fGh9LHMpO3JldHVybiBzfSxZZT1PZS5jaGFyQXQsSmU9XCJTdHJpbmcgSXRlcmF0b3JcIixRZT10dC5zZXQsWmU9dHQuZ2V0dGVyRm9yKEplKTtYZShTdHJpbmcsXCJTdHJpbmdcIixmdW5jdGlvbih0KXtRZSh0aGlzLHt0eXBlOkplLHN0cmluZzpTdHJpbmcodCksaW5kZXg6MH0pfSxmdW5jdGlvbigpe3ZhciB0LGU9WmUodGhpcykscj1lLnN0cmluZyxuPWUuaW5kZXg7cmV0dXJuIG4+PXIubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9WWUocixuKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KTt2YXIgdHI9ZnVuY3Rpb24odCxlLHIsbil7dHJ5e3JldHVybiBuP2UoUihyKVswXSxyWzFdKTplKHIpfWNhdGNoKGUpe3ZhciBvPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PW8mJlIoby5jYWxsKHQpKSxlfX0sZXI9RHQoXCJpdGVyYXRvclwiKSxycj1BcnJheS5wcm90b3R5cGUsbnI9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihOZS5BcnJheT09PXR8fHJyW2VyXT09PXQpfSxvcj1mdW5jdGlvbih0LGUscil7dmFyIG49eShlKTtuIGluIHQ/UC5mKHQsbixjKDAscikpOnRbbl09cn0saXI9e307aXJbRHQoXCJ0b1N0cmluZ1RhZ1wiKV09XCJ6XCI7dmFyIGFyPVwiW29iamVjdCB6XVwiPT09U3RyaW5nKGlyKSx1cj1EdChcInRvU3RyaW5nVGFnXCIpLHNyPVwiQXJndW1lbnRzXCI9PWwoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKSxjcj1hcj9sOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbjtyZXR1cm4gdm9pZCAwPT09dD9cIlVuZGVmaW5lZFwiOm51bGw9PT10P1wiTnVsbFwiOlwic3RyaW5nXCI9PXR5cGVvZihyPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLHVyKSk/cjpzcj9sKGUpOlwiT2JqZWN0XCI9PShuPWwoZSkpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmNhbGxlZT9cIkFyZ3VtZW50c1wiOm59LGZyPUR0KFwiaXRlcmF0b3JcIiksbHI9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtmcl18fHRbXCJAQGl0ZXJhdG9yXCJdfHxOZVtjcih0KV19LGhyPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixvLGksYSx1PUx0KHQpLHM9XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGM9YXJndW1lbnRzLmxlbmd0aCxmPWM+MT9hcmd1bWVudHNbMV06dm9pZCAwLGw9dm9pZCAwIT09ZixoPWxyKHUpLHA9MDtpZihsJiYoZj1adChmLGM+Mj9hcmd1bWVudHNbMl06dm9pZCAwLDIpKSxudWxsPT1ofHxzPT1BcnJheSYmbnIoaCkpZm9yKHI9bmV3IHMoZT1jdCh1Lmxlbmd0aCkpO2U+cDtwKyspYT1sP2YodVtwXSxwKTp1W3BdLG9yKHIscCxhKTtlbHNlIGZvcihpPShvPWguY2FsbCh1KSkubmV4dCxyPW5ldyBzOyEobj1pLmNhbGwobykpLmRvbmU7cCsrKWE9bD90cihvLGYsW24udmFsdWUscF0sITApOm4udmFsdWUsb3IocixwLGEpO3JldHVybiByLmxlbmd0aD1wLHJ9LHByPUR0KFwiaXRlcmF0b3JcIiksZHI9ITE7dHJ5e3ZhciB2cj0wLGdyPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISF2cisrfX0scmV0dXJuOmZ1bmN0aW9uKCl7ZHI9ITB9fTtncltwcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sQXJyYXkuZnJvbShncixmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dmFyIHlyPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFkcilyZXR1cm4hMTt2YXIgcj0hMTt0cnl7dmFyIG49e307bltwcl09ZnVuY3Rpb24oKXtyZXR1cm57bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOnI9ITB9fX19LHQobil9Y2F0Y2godCl7fXJldHVybiByfSxtcj0heXIoZnVuY3Rpb24odCl7QXJyYXkuZnJvbSh0KX0pO2t0KHt0YXJnZXQ6XCJBcnJheVwiLHN0YXQ6ITAsZm9yY2VkOm1yfSx7ZnJvbTpocn0pO3ZhciBicj1kdC5pbmNsdWRlcyx3cj1sZShcImluZGV4T2ZcIix7QUNDRVNTT1JTOiEwLDE6MH0pO2t0KHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDohd3J9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gYnIodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxKdChcImluY2x1ZGVzXCIpLGVlKFwiQXJyYXlcIixcImluY2x1ZGVzXCIpO3ZhciBTcj1cIkFycmF5IEl0ZXJhdG9yXCIsRXI9dHQuc2V0LHhyPXR0LmdldHRlckZvcihTciksQXI9WGUoQXJyYXksXCJBcnJheVwiLGZ1bmN0aW9uKHQsZSl7RXIodGhpcyx7dHlwZTpTcix0YXJnZXQ6dih0KSxpbmRleDowLGtpbmQ6ZX0pfSxmdW5jdGlvbigpe3ZhciB0PXhyKHRoaXMpLGU9dC50YXJnZXQscj10LmtpbmQsbj10LmluZGV4Kys7cmV0dXJuIWV8fG4+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6XCJrZXlzXCI9PXI/e3ZhbHVlOm4sZG9uZTohMX06XCJ2YWx1ZXNcIj09cj97dmFsdWU6ZVtuXSxkb25lOiExfTp7dmFsdWU6W24sZVtuXV0sZG9uZTohMX19LFwidmFsdWVzXCIpO05lLkFyZ3VtZW50cz1OZS5BcnJheSxKdChcImtleXNcIiksSnQoXCJ2YWx1ZXNcIiksSnQoXCJlbnRyaWVzXCIpLGVlKFwiQXJyYXlcIixcInZhbHVlc1wiKTt2YXIgT3I9byhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShBcnJheS5vZi5jYWxsKHQpaW5zdGFuY2VvZiB0KX0pO2t0KHt0YXJnZXQ6XCJBcnJheVwiLHN0YXQ6ITAsZm9yY2VkOk9yfSx7b2Y6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcoXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcz90aGlzOkFycmF5KShlKTtlPnQ7KW9yKHIsdCxhcmd1bWVudHNbdCsrXSk7cmV0dXJuIHIubGVuZ3RoPWUscn19KTt2YXIgUnI9RHQoXCJoYXNJbnN0YW5jZVwiKSxqcj1GdW5jdGlvbi5wcm90b3R5cGU7UnIgaW4ganJ8fFAuZihqcixScix7dmFsdWU6ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdGhpc3x8IWcodCkpcmV0dXJuITE7aWYoIWcodGhpcy5wcm90b3R5cGUpKXJldHVybiB0IGluc3RhbmNlb2YgdGhpcztmb3IoO3Q9SWUodCk7KWlmKHRoaXMucHJvdG90eXBlPT09dClyZXR1cm4hMDtyZXR1cm4hMX19KSxEdChcImhhc0luc3RhbmNlXCIpO3ZhciBQcj1GdW5jdGlvbi5wcm90b3R5cGUsSXI9UHIudG9TdHJpbmcsVHI9L15cXHMqZnVuY3Rpb24gKFteIChdKikvLGtyPVwibmFtZVwiO2kmJiEoa3IgaW4gUHIpJiYoMCxQLmYpKFByLGtyLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBJci5jYWxsKHRoaXMpLm1hdGNoKFRyKVsxXX1jYXRjaCh0KXtyZXR1cm5cIlwifX19KTt2YXIgTHI9IW8oZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLFVyPWUoZnVuY3Rpb24odCl7dmFyIGU9UC5mLHI9SyhcIm1ldGFcIiksbj0wLG89T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0saT1mdW5jdGlvbih0KXtlKHQscix7dmFsdWU6e29iamVjdElEOlwiT1wiKyArK24sd2Vha0RhdGE6e319fSl9LGE9dC5leHBvcnRzPXtSRVFVSVJFRDohMSxmYXN0S2V5OmZ1bmN0aW9uKHQsZSl7aWYoIWcodCkpcmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIHQ/dDooXCJzdHJpbmdcIj09dHlwZW9mIHQ/XCJTXCI6XCJQXCIpK3Q7aWYoIWIodCxyKSl7aWYoIW8odCkpcmV0dXJuXCJGXCI7aWYoIWUpcmV0dXJuXCJFXCI7aSh0KX1yZXR1cm4gdFtyXS5vYmplY3RJRH0sZ2V0V2Vha0RhdGE6ZnVuY3Rpb24odCxlKXtpZighYih0LHIpKXtpZighbyh0KSlyZXR1cm4hMDtpZighZSlyZXR1cm4hMTtpKHQpfXJldHVybiB0W3JdLndlYWtEYXRhfSxvbkZyZWV6ZTpmdW5jdGlvbih0KXtyZXR1cm4gTHImJmEuUkVRVUlSRUQmJm8odCkmJiFiKHQscikmJmkodCksdH19O1Zbcl09ITB9KSxNcj1lKGZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKHQsZSl7dGhpcy5zdG9wcGVkPXQsdGhpcy5yZXN1bHQ9ZX07KHQuZXhwb3J0cz1mdW5jdGlvbih0LHIsbixvLGkpe3ZhciBhLHUscyxjLGYsbCxoLHA9WnQocixuLG8/MjoxKTtpZihpKWE9dDtlbHNle2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mKHU9bHIodCkpKXRocm93IFR5cGVFcnJvcihcIlRhcmdldCBpcyBub3QgaXRlcmFibGVcIik7aWYobnIodSkpe2ZvcihzPTAsYz1jdCh0Lmxlbmd0aCk7Yz5zO3MrKylpZigoZj1vP3AoUihoPXRbc10pWzBdLGhbMV0pOnAodFtzXSkpJiZmIGluc3RhbmNlb2YgZSlyZXR1cm4gZjtyZXR1cm4gbmV3IGUoITEpfWE9dS5jYWxsKHQpfWZvcihsPWEubmV4dDshKGg9bC5jYWxsKGEpKS5kb25lOylpZihcIm9iamVjdFwiPT10eXBlb2YoZj10cihhLHAsaC52YWx1ZSxvKSkmJmYmJmYgaW5zdGFuY2VvZiBlKXJldHVybiBmO3JldHVybiBuZXcgZSghMSl9KS5zdG9wPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZSghMCx0KX19KSxfcj1mdW5jdGlvbih0LGUscil7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgVHlwZUVycm9yKFwiSW5jb3JyZWN0IFwiKyhyP3IrXCIgXCI6XCJcIikrXCJpbnZvY2F0aW9uXCIpO3JldHVybiB0fSxOcj1mdW5jdGlvbih0LGUscil7dmFyIG4sbztyZXR1cm4gcWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKG49ZS5jb25zdHJ1Y3RvcikmJm4hPT1yJiZnKG89bi5wcm90b3R5cGUpJiZvIT09ci5wcm90b3R5cGUmJnFlKHQsbyksdH0sQ3I9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPS0xIT09dC5pbmRleE9mKFwiTWFwXCIpLGE9LTEhPT10LmluZGV4T2YoXCJXZWFrXCIpLHU9aT9cInNldFwiOlwiYWRkXCIscz1uW3RdLGM9cyYmcy5wcm90b3R5cGUsZj1zLGw9e30saD1mdW5jdGlvbih0KXt2YXIgZT1jW3RdO2V0KGMsdCxcImFkZFwiPT10P2Z1bmN0aW9uKHQpe3JldHVybiBlLmNhbGwodGhpcywwPT09dD8wOnQpLHRoaXN9OlwiZGVsZXRlXCI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIShhJiYhZyh0KSkmJmUuY2FsbCh0aGlzLDA9PT10PzA6dCl9OlwiZ2V0XCI9PXQ/ZnVuY3Rpb24odCl7cmV0dXJuIGEmJiFnKHQpP3ZvaWQgMDplLmNhbGwodGhpcywwPT09dD8wOnQpfTpcImhhc1wiPT10P2Z1bmN0aW9uKHQpe3JldHVybiEoYSYmIWcodCkpJiZlLmNhbGwodGhpcywwPT09dD8wOnQpfTpmdW5jdGlvbih0LHIpe3JldHVybiBlLmNhbGwodGhpcywwPT09dD8wOnQsciksdGhpc30pfTtpZihJdCh0LFwiZnVuY3Rpb25cIiE9dHlwZW9mIHN8fCEoYXx8Yy5mb3JFYWNoJiYhbyhmdW5jdGlvbigpeyhuZXcgcykuZW50cmllcygpLm5leHQoKX0pKSkpZj1yLmdldENvbnN0cnVjdG9yKGUsdCxpLHUpLFVyLlJFUVVJUkVEPSEwO2Vsc2UgaWYoSXQodCwhMCkpe3ZhciBwPW5ldyBmLGQ9cFt1XShhP3t9Oi0wLDEpIT1wLHY9byhmdW5jdGlvbigpe3AuaGFzKDEpfSkseT15cihmdW5jdGlvbih0KXtuZXcgcyh0KX0pLG09IWEmJm8oZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IHMsZT01O2UtLTspdFt1XShlLGUpO3JldHVybiF0LmhhcygtMCl9KTt5fHwoKGY9ZShmdW5jdGlvbihlLHIpe19yKGUsZix0KTt2YXIgbj1OcihuZXcgcyxlLGYpO3JldHVybiBudWxsIT1yJiZNcihyLG5bdV0sbixpKSxufSkpLnByb3RvdHlwZT1jLGMuY29uc3RydWN0b3I9ZiksKHZ8fG0pJiYoaChcImRlbGV0ZVwiKSxoKFwiaGFzXCIpLGkmJmgoXCJnZXRcIikpLChtfHxkKSYmaCh1KSxhJiZjLmNsZWFyJiZkZWxldGUgYy5jbGVhcn1yZXR1cm4gbFt0XT1mLGt0KHtnbG9iYWw6ITAsZm9yY2VkOmYhPXN9LGwpLF9lKGYsdCksYXx8ci5zZXRTdHJvbmcoZix0LGkpLGZ9LEZyPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG4gaW4gZSlldCh0LG4sZVtuXSxyKTtyZXR1cm4gdH0sQnI9RHQoXCJzcGVjaWVzXCIpLERyPWZ1bmN0aW9uKHQpe3ZhciBlPW90KHQpO2kmJmUmJiFlW0JyXSYmKDAsUC5mKShlLEJyLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9LHFyPVAuZix6cj1Vci5mYXN0S2V5LFdyPXR0LnNldCxLcj10dC5nZXR0ZXJGb3IsR3I9e2dldENvbnN0cnVjdG9yOmZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBvPXQoZnVuY3Rpb24odCxhKXtfcih0LG8sZSksV3IodCx7dHlwZTplLGluZGV4Okh0KG51bGwpLGZpcnN0OnZvaWQgMCxsYXN0OnZvaWQgMCxzaXplOjB9KSxpfHwodC5zaXplPTApLG51bGwhPWEmJk1yKGEsdFtuXSx0LHIpfSksYT1LcihlKSx1PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixvLHU9YSh0KSxjPXModCxlKTtyZXR1cm4gYz9jLnZhbHVlPXI6KHUubGFzdD1jPXtpbmRleDpvPXpyKGUsITApLGtleTplLHZhbHVlOnIscHJldmlvdXM6bj11Lmxhc3QsbmV4dDp2b2lkIDAscmVtb3ZlZDohMX0sdS5maXJzdHx8KHUuZmlyc3Q9YyksbiYmKG4ubmV4dD1jKSxpP3Uuc2l6ZSsrOnQuc2l6ZSsrLFwiRlwiIT09byYmKHUuaW5kZXhbb109YykpLHR9LHM9ZnVuY3Rpb24odCxlKXt2YXIgcixuPWEodCksbz16cihlKTtpZihcIkZcIiE9PW8pcmV0dXJuIG4uaW5kZXhbb107Zm9yKHI9bi5maXJzdDtyO3I9ci5uZXh0KWlmKHIua2V5PT1lKXJldHVybiByfTtyZXR1cm4gRnIoby5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWEodGhpcyksZT10LmluZGV4LHI9dC5maXJzdDtyOylyLnJlbW92ZWQ9ITAsci5wcmV2aW91cyYmKHIucHJldmlvdXM9ci5wcmV2aW91cy5uZXh0PXZvaWQgMCksZGVsZXRlIGVbci5pbmRleF0scj1yLm5leHQ7dC5maXJzdD10Lmxhc3Q9dm9pZCAwLGk/dC5zaXplPTA6dGhpcy5zaXplPTB9LGRlbGV0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9YShlKSxuPXMoZSx0KTtpZihuKXt2YXIgbz1uLm5leHQsdT1uLnByZXZpb3VzO2RlbGV0ZSByLmluZGV4W24uaW5kZXhdLG4ucmVtb3ZlZD0hMCx1JiYodS5uZXh0PW8pLG8mJihvLnByZXZpb3VzPXUpLHIuZmlyc3Q9PW4mJihyLmZpcnN0PW8pLHIubGFzdD09biYmKHIubGFzdD11KSxpP3Iuc2l6ZS0tOmUuc2l6ZS0tfXJldHVybiEhbn0sZm9yRWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUscj1hKHRoaXMpLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtlPWU/ZS5uZXh0OnIuZmlyc3Q7KWZvcihuKGUudmFsdWUsZS5rZXksdGhpcyk7ZSYmZS5yZW1vdmVkOyllPWUucHJldmlvdXN9LGhhczpmdW5jdGlvbih0KXtyZXR1cm4hIXModGhpcyx0KX19KSxGcihvLnByb3RvdHlwZSxyP3tnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9cyh0aGlzLHQpO3JldHVybiBlJiZlLnZhbHVlfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0aGlzLDA9PT10PzA6dCxlKX19OnthZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHUodGhpcyx0PTA9PT10PzA6dCx0KX19KSxpJiZxcihvLnByb3RvdHlwZSxcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcykuc2l6ZX19KSxvfSxzZXRTdHJvbmc6ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUrXCIgSXRlcmF0b3JcIixvPUtyKGUpLGk9S3Iobik7WGUodCxlLGZ1bmN0aW9uKHQsZSl7V3IodGhpcyx7dHlwZTpuLHRhcmdldDp0LHN0YXRlOm8odCksa2luZDplLGxhc3Q6dm9pZCAwfSl9LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWkodGhpcyksZT10LmtpbmQscj10Lmxhc3Q7ciYmci5yZW1vdmVkOylyPXIucHJldmlvdXM7cmV0dXJuIHQudGFyZ2V0JiYodC5sYXN0PXI9cj9yLm5leHQ6dC5zdGF0ZS5maXJzdCk/XCJrZXlzXCI9PWU/e3ZhbHVlOnIua2V5LGRvbmU6ITF9OlwidmFsdWVzXCI9PWU/e3ZhbHVlOnIudmFsdWUsZG9uZTohMX06e3ZhbHVlOltyLmtleSxyLnZhbHVlXSxkb25lOiExfToodC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSxyP1wiZW50cmllc1wiOlwidmFsdWVzXCIsIXIsITApLERyKGUpfX0sJHI9Q3IoXCJNYXBcIixmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSxHcik7YXJ8fGV0KE9iamVjdC5wcm90b3R5cGUsXCJ0b1N0cmluZ1wiLGFyP3t9LnRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuXCJbb2JqZWN0IFwiK2NyKHRoaXMpK1wiXVwifSx7dW5zYWZlOiEwfSk7dmFyIFZyPXtDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfSxIcj1EdChcIml0ZXJhdG9yXCIpLFhyPUR0KFwidG9TdHJpbmdUYWdcIiksWXI9QXIudmFsdWVzO2Zvcih2YXIgSnIgaW4gVnIpe3ZhciBRcj1uW0pyXSxacj1RciYmUXIucHJvdG90eXBlO2lmKFpyKXtpZihacltIcl0hPT1Zcil0cnl7SShacixIcixZcil9Y2F0Y2godCl7WnJbSHJdPVlyfWlmKFpyW1hyXXx8SShacixYcixKciksVnJbSnJdKWZvcih2YXIgdG4gaW4gQXIpaWYoWnJbdG5dIT09QXJbdG5dKXRyeXtJKFpyLHRuLEFyW3RuXSl9Y2F0Y2godCl7WnJbdG5dPUFyW3RuXX19fXZhciBlbj1mdW5jdGlvbih0KXt2YXIgZSxyLG4sbyxpPWFyZ3VtZW50cy5sZW5ndGgsYT1pPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gUXQodGhpcyksKGU9dm9pZCAwIT09YSkmJlF0KGEpLG51bGw9PXQ/bmV3IHRoaXM6KHI9W10sZT8obj0wLG89WnQoYSxpPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSxNcih0LGZ1bmN0aW9uKHQpe3IucHVzaChvKHQsbisrKSl9KSk6TXIodCxyLnB1c2gsciksbmV3IHRoaXMocikpfTtrdCh7dGFyZ2V0OlwiTWFwXCIsc3RhdDohMH0se2Zyb206ZW59KTt2YXIgcm49ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KTt0LS07KWVbdF09YXJndW1lbnRzW3RdO3JldHVybiBuZXcgdGhpcyhlKX07a3Qoe3RhcmdldDpcIk1hcFwiLHN0YXQ6ITB9LHtvZjpybn0pO3ZhciBubj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPVIodGhpcykscj1RdChlLmRlbGV0ZSksbj0hMCxvPTAsaT1hcmd1bWVudHMubGVuZ3RoO288aTtvKyspdD1yLmNhbGwoZSxhcmd1bWVudHNbb10pLG49biYmdDtyZXR1cm4hIW59O2t0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7ZGVsZXRlQWxsOmZ1bmN0aW9uKCl7cmV0dXJuIG5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KTt2YXIgb249ZnVuY3Rpb24odCl7dmFyIGU9bHIodCk7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpK1wiIGlzIG5vdCBpdGVyYWJsZVwiKTtyZXR1cm4gUihlLmNhbGwodCkpfSxhbj1mdW5jdGlvbih0KXtyZXR1cm4gTWFwLnByb3RvdHlwZS5lbnRyaWVzLmNhbGwodCl9O2t0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7ZXZlcnk6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPWFuKGUpLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtyZXR1cm4hTXIocixmdW5jdGlvbih0LHIpe2lmKCFuKHIsdCxlKSlyZXR1cm4gTXIuc3RvcCgpfSx2b2lkIDAsITAsITApLnN0b3BwZWR9fSk7dmFyIHVuPUR0KFwic3BlY2llc1wiKSxzbj1mdW5jdGlvbih0LGUpe3ZhciByLG49Uih0KS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09bnx8bnVsbD09KHI9UihuKVt1bl0pP2U6UXQocil9O2t0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3ZhciBlPVIodGhpcykscj1hbihlKSxuPVp0KHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyksbz1uZXcoc24oZSxvdChcIk1hcFwiKSkpLGk9UXQoby5zZXQpO3JldHVybiBNcihyLGZ1bmN0aW9uKHQscil7bihyLHQsZSkmJmkuY2FsbChvLHQscil9LHZvaWQgMCwhMCwhMCksb319KSxrdCh7dGFyZ2V0OlwiTWFwXCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPWFuKGUpLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtyZXR1cm4gTXIocixmdW5jdGlvbih0LHIpe2lmKG4ocix0LGUpKXJldHVybiBNci5zdG9wKHIpfSx2b2lkIDAsITAsITApLnJlc3VsdH19KSxrdCh7dGFyZ2V0OlwiTWFwXCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2ZpbmRLZXk6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPWFuKGUpLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtyZXR1cm4gTXIocixmdW5jdGlvbih0LHIpe2lmKG4ocix0LGUpKXJldHVybiBNci5zdG9wKHQpfSx2b2lkIDAsITAsITApLnJlc3VsdH19KSxrdCh7dGFyZ2V0OlwiTWFwXCIsc3RhdDohMH0se2dyb3VwQnk6ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgdGhpcztRdChlKTt2YXIgbj1RdChyLmhhcyksbz1RdChyLmdldCksaT1RdChyLnNldCk7cmV0dXJuIE1yKHQsZnVuY3Rpb24odCl7dmFyIGE9ZSh0KTtuLmNhbGwocixhKT9vLmNhbGwocixhKS5wdXNoKHQpOmkuY2FsbChyLGEsW3RdKX0pLHJ9fSksa3Qoe3RhcmdldDpcIk1hcFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gTXIoYW4oUih0aGlzKSksZnVuY3Rpb24oZSxyKXtpZigobj1yKT09PShvPXQpfHxuIT1uJiZvIT1vKXJldHVybiBNci5zdG9wKCk7dmFyIG4sb30sdm9pZCAwLCEwLCEwKS5zdG9wcGVkfX0pLGt0KHt0YXJnZXQ6XCJNYXBcIixzdGF0OiEwfSx7a2V5Qnk6ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgdGhpcztRdChlKTt2YXIgbj1RdChyLnNldCk7cmV0dXJuIE1yKHQsZnVuY3Rpb24odCl7bi5jYWxsKHIsZSh0KSx0KX0pLHJ9fSksa3Qoe3RhcmdldDpcIk1hcFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtrZXlPZjpmdW5jdGlvbih0KXtyZXR1cm4gTXIoYW4oUih0aGlzKSksZnVuY3Rpb24oZSxyKXtpZihyPT09dClyZXR1cm4gTXIuc3RvcChlKX0sdm9pZCAwLCEwLCEwKS5yZXN1bHR9fSksa3Qoe3RhcmdldDpcIk1hcFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHttYXBLZXlzOmZ1bmN0aW9uKHQpe3ZhciBlPVIodGhpcykscj1hbihlKSxuPVp0KHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyksbz1uZXcoc24oZSxvdChcIk1hcFwiKSkpLGk9UXQoby5zZXQpO3JldHVybiBNcihyLGZ1bmN0aW9uKHQscil7aS5jYWxsKG8sbihyLHQsZSkscil9LHZvaWQgMCwhMCwhMCksb319KSxrdCh7dGFyZ2V0OlwiTWFwXCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se21hcFZhbHVlczpmdW5jdGlvbih0KXt2YXIgZT1SKHRoaXMpLHI9YW4oZSksbj1adCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89bmV3KHNuKGUsb3QoXCJNYXBcIikpKSxpPVF0KG8uc2V0KTtyZXR1cm4gTXIocixmdW5jdGlvbih0LHIpe2kuY2FsbChvLHQsbihyLHQsZSkpfSx2b2lkIDAsITAsITApLG99fSksa3Qoe3RhcmdldDpcIk1hcFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHttZXJnZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9Uih0aGlzKSxyPVF0KGUuc2V0KSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoOylNcihhcmd1bWVudHNbbisrXSxyLGUsITApO3JldHVybiBlfX0pLGt0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7cmVkdWNlOmZ1bmN0aW9uKHQpe3ZhciBlPVIodGhpcykscj1hbihlKSxuPWFyZ3VtZW50cy5sZW5ndGg8MixvPW4/dm9pZCAwOmFyZ3VtZW50c1sxXTtpZihRdCh0KSxNcihyLGZ1bmN0aW9uKHIsaSl7bj8obj0hMSxvPWkpOm89dChvLGkscixlKX0sdm9pZCAwLCEwLCEwKSxuKXRocm93IFR5cGVFcnJvcihcIlJlZHVjZSBvZiBlbXB0eSBtYXAgd2l0aCBubyBpbml0aWFsIHZhbHVlXCIpO3JldHVybiBvfX0pLGt0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7c29tZTpmdW5jdGlvbih0KXt2YXIgZT1SKHRoaXMpLHI9YW4oZSksbj1adCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3JldHVybiBNcihyLGZ1bmN0aW9uKHQscil7aWYobihyLHQsZSkpcmV0dXJuIE1yLnN0b3AoKX0sdm9pZCAwLCEwLCEwKS5zdG9wcGVkfX0pLGt0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7dXBkYXRlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9Uih0aGlzKSxuPWFyZ3VtZW50cy5sZW5ndGg7UXQoZSk7dmFyIG89ci5oYXModCk7aWYoIW8mJm48Myl0aHJvdyBUeXBlRXJyb3IoXCJVcGRhdGluZyBhYnNlbnQgdmFsdWVcIik7dmFyIGk9bz9yLmdldCh0KTpRdChuPjI/YXJndW1lbnRzWzJdOnZvaWQgMCkodCxyKTtyZXR1cm4gci5zZXQodCxlKGksdCxyKSkscn19KTt2YXIgY249ZnVuY3Rpb24odCxlKXt2YXIgcixuPVIodGhpcyksbz1hcmd1bWVudHMubGVuZ3RoPjI/YXJndW1lbnRzWzJdOnZvaWQgMDtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBvKXRocm93IFR5cGVFcnJvcihcIkF0IGxlYXN0IG9uZSBjYWxsYmFjayByZXF1aXJlZFwiKTtyZXR1cm4gbi5oYXModCk/KHI9bi5nZXQodCksXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmKHI9ZShyKSxuLnNldCh0LHIpKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgbyYmKHI9bygpLG4uc2V0KHQscikpLHJ9O2t0KHt0YXJnZXQ6XCJNYXBcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7dXBzZXJ0OmNufSksa3Qoe3RhcmdldDpcIk1hcFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHt1cGRhdGVPckluc2VydDpjbn0pO3ZhciBmbj1cIlxcdFxcblxcdlxcZlxcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFxcdTIwMjhcXHUyMDI5XFx1ZmVmZlwiLGxuPVwiW1wiK2ZuK1wiXVwiLGhuPVJlZ0V4cChcIl5cIitsbitsbitcIipcIikscG49UmVnRXhwKGxuK2xuK1wiKiRcIiksZG49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPVN0cmluZyhkKGUpKTtyZXR1cm4gMSZ0JiYocj1yLnJlcGxhY2UoaG4sXCJcIikpLDImdCYmKHI9ci5yZXBsYWNlKHBuLFwiXCIpKSxyfX0sdm49e3N0YXJ0OmRuKDEpLGVuZDpkbigyKSx0cmltOmRuKDMpfSxnbj1idC5mLHluPU8uZixtbj1QLmYsYm49dm4udHJpbSx3bj1cIk51bWJlclwiLFNuPW4uTnVtYmVyLEVuPVNuLnByb3RvdHlwZSx4bj1sKEh0KEVuKSk9PXduLEFuPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixvLGksYSx1LHMsYz15KHQsITEpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBjJiZjLmxlbmd0aD4yKWlmKDQzPT09KGU9KGM9Ym4oYykpLmNoYXJDb2RlQXQoMCkpfHw0NT09PWUpe2lmKDg4PT09KHI9Yy5jaGFyQ29kZUF0KDIpKXx8MTIwPT09cilyZXR1cm4gTmFOfWVsc2UgaWYoNDg9PT1lKXtzd2l0Y2goYy5jaGFyQ29kZUF0KDEpKXtjYXNlIDY2OmNhc2UgOTg6bj0yLG89NDk7YnJlYWs7Y2FzZSA3OTpjYXNlIDExMTpuPTgsbz01NTticmVhaztkZWZhdWx0OnJldHVybitjfWZvcihhPShpPWMuc2xpY2UoMikpLmxlbmd0aCx1PTA7dTxhO3UrKylpZigocz1pLmNoYXJDb2RlQXQodSkpPDQ4fHxzPm8pcmV0dXJuIE5hTjtyZXR1cm4gcGFyc2VJbnQoaSxuKX1yZXR1cm4rY307aWYoSXQod24sIVNuKFwiIDBvMVwiKXx8IVNuKFwiMGIxXCIpfHxTbihcIisweDFcIikpKXtmb3IodmFyIE9uLFJuPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg8MT8wOnQscj10aGlzO3JldHVybiByIGluc3RhbmNlb2YgUm4mJih4bj9vKGZ1bmN0aW9uKCl7RW4udmFsdWVPZi5jYWxsKHIpfSk6bChyKSE9d24pP05yKG5ldyBTbihBbihlKSkscixSbik6QW4oZSl9LGpuPWk/Z24oU24pOlwiTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksRVBTSUxPTixpc0Zpbml0ZSxpc0ludGVnZXIsaXNOYU4saXNTYWZlSW50ZWdlcixNQVhfU0FGRV9JTlRFR0VSLE1JTl9TQUZFX0lOVEVHRVIscGFyc2VGbG9hdCxwYXJzZUludCxpc0ludGVnZXJcIi5zcGxpdChcIixcIiksUG49MDtqbi5sZW5ndGg+UG47UG4rKyliKFNuLE9uPWpuW1BuXSkmJiFiKFJuLE9uKSYmbW4oUm4sT24seW4oU24sT24pKTtSbi5wcm90b3R5cGU9RW4sRW4uY29uc3RydWN0b3I9Um4sZXQobix3bixSbil9a3Qoe3RhcmdldDpcIk51bWJlclwiLHN0YXQ6ITB9LHtFUFNJTE9OOk1hdGgucG93KDIsLTUyKX0pO3ZhciBJbj1uLmlzRmluaXRlO2t0KHt0YXJnZXQ6XCJOdW1iZXJcIixzdGF0OiEwfSx7aXNGaW5pdGU6TnVtYmVyLmlzRmluaXRlfHxmdW5jdGlvbih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdCYmSW4odCl9fSk7dmFyIFRuPU1hdGguZmxvb3Isa249ZnVuY3Rpb24odCl7cmV0dXJuIWcodCkmJmlzRmluaXRlKHQpJiZUbih0KT09PXR9O2t0KHt0YXJnZXQ6XCJOdW1iZXJcIixzdGF0OiEwfSx7aXNJbnRlZ2VyOmtufSksa3Qoe3RhcmdldDpcIk51bWJlclwiLHN0YXQ6ITB9LHtpc05hTjpmdW5jdGlvbih0KXtyZXR1cm4gdCE9dH19KTt2YXIgTG49TWF0aC5hYnM7a3Qoe3RhcmdldDpcIk51bWJlclwiLHN0YXQ6ITB9LHtpc1NhZmVJbnRlZ2VyOmZ1bmN0aW9uKHQpe3JldHVybiBrbih0KSYmTG4odCk8PTkwMDcxOTkyNTQ3NDA5OTF9fSksa3Qoe3RhcmdldDpcIk51bWJlclwiLHN0YXQ6ITB9LHtNQVhfU0FGRV9JTlRFR0VSOjkwMDcxOTkyNTQ3NDA5OTF9KSxrdCh7dGFyZ2V0OlwiTnVtYmVyXCIsc3RhdDohMH0se01JTl9TQUZFX0lOVEVHRVI6LTkwMDcxOTkyNTQ3NDA5OTF9KTt2YXIgVW49dm4udHJpbSxNbj1uLnBhcnNlRmxvYXQsX249MS9NbihmbitcIi0wXCIpIT0tSW5maW5pdHk/ZnVuY3Rpb24odCl7dmFyIGU9VW4oU3RyaW5nKHQpKSxyPU1uKGUpO3JldHVybiAwPT09ciYmXCItXCI9PWUuY2hhckF0KDApPy0wOnJ9Ok1uO2t0KHt0YXJnZXQ6XCJOdW1iZXJcIixzdGF0OiEwLGZvcmNlZDpOdW1iZXIucGFyc2VGbG9hdCE9X259LHtwYXJzZUZsb2F0Ol9ufSk7dmFyIE5uPXZuLnRyaW0sQ249bi5wYXJzZUludCxGbj0vXlsrLV0/MFtYeF0vLEJuPTghPT1DbihmbitcIjA4XCIpfHwyMiE9PUNuKGZuK1wiMHgxNlwiKT9mdW5jdGlvbih0LGUpe3ZhciByPU5uKFN0cmluZyh0KSk7cmV0dXJuIENuKHIsZT4+PjB8fChGbi50ZXN0KHIpPzE2OjEwKSl9OkNuO2t0KHt0YXJnZXQ6XCJOdW1iZXJcIixzdGF0OiEwLGZvcmNlZDpOdW1iZXIucGFyc2VJbnQhPUJufSx7cGFyc2VJbnQ6Qm59KTt2YXIgRG49cy5mLHFuPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHIsbj12KGUpLG89cXQobiksYT1vLmxlbmd0aCx1PTAscz1bXTthPnU7KXI9b1t1KytdLGkmJiFEbi5jYWxsKG4scil8fHMucHVzaCh0P1tyLG5bcl1dOm5bcl0pO3JldHVybiBzfX0sem49e2VudHJpZXM6cW4oITApLHZhbHVlczpxbighMSl9LFduPXpuLmVudHJpZXM7a3Qoe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITB9LHtlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBXbih0KX19KSxrdCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxzaGFtOiFpfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczpmdW5jdGlvbih0KXtmb3IodmFyIGUscixuPXYodCksbz1PLmYsaT1TdChuKSxhPXt9LHU9MDtpLmxlbmd0aD51Oyl2b2lkIDAhPT0ocj1vKG4sZT1pW3UrK10pKSYmb3IoYSxlLHIpO3JldHVybiBhfX0pO3ZhciBLbj1vKGZ1bmN0aW9uKCl7cXQoMSl9KTtrdCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxmb3JjZWQ6S259LHtrZXlzOmZ1bmN0aW9uKHQpe3JldHVybiBxdChMdCh0KSl9fSk7dmFyIEduPU9iamVjdC5pc3x8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWU/MCE9PXR8fDEvdD09MS9lOnQhPXQmJmUhPWV9O2t0KHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwfSx7aXM6R259KTt2YXIgJG49em4udmFsdWVzO2t0KHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwfSx7dmFsdWVzOmZ1bmN0aW9uKHQpe3JldHVybiAkbih0KX19KTt2YXIgVm49b3QoXCJSZWZsZWN0XCIsXCJhcHBseVwiKSxIbj1GdW5jdGlvbi5hcHBseSxYbj0hbyhmdW5jdGlvbigpe1ZuKGZ1bmN0aW9uKCl7fSl9KTtrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITAsZm9yY2VkOlhufSx7YXBwbHk6ZnVuY3Rpb24odCxlLHIpe3JldHVybiBRdCh0KSxSKHIpLFZuP1ZuKHQsZSxyKTpIbi5jYWxsKHQsZSxyKX19KTt2YXIgWW49W10uc2xpY2UsSm49e30sUW49ZnVuY3Rpb24odCxlLHIpe2lmKCEoZSBpbiBKbikpe2Zvcih2YXIgbj1bXSxvPTA7bzxlO28rKyluW29dPVwiYVtcIitvK1wiXVwiO0puW2VdPUZ1bmN0aW9uKFwiQyxhXCIsXCJyZXR1cm4gbmV3IEMoXCIrbi5qb2luKFwiLFwiKStcIilcIil9cmV0dXJuIEpuW2VdKHQscil9LFpuPUZ1bmN0aW9uLmJpbmR8fGZ1bmN0aW9uKHQpe3ZhciBlPVF0KHRoaXMpLHI9WW4uY2FsbChhcmd1bWVudHMsMSksbj1mdW5jdGlvbigpe3ZhciBvPXIuY29uY2F0KFluLmNhbGwoYXJndW1lbnRzKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuP1FuKGUsby5sZW5ndGgsbyk6ZS5hcHBseSh0LG8pfTtyZXR1cm4gZyhlLnByb3RvdHlwZSkmJihuLnByb3RvdHlwZT1lLnByb3RvdHlwZSksbn0sdG89b3QoXCJSZWZsZWN0XCIsXCJjb25zdHJ1Y3RcIiksZW89byhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuISh0byhmdW5jdGlvbigpe30sW10sdClpbnN0YW5jZW9mIHQpfSkscm89IW8oZnVuY3Rpb24oKXt0byhmdW5jdGlvbigpe30pfSksbm89ZW98fHJvO2t0KHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMCxmb3JjZWQ6bm8sc2hhbTpub30se2NvbnN0cnVjdDpmdW5jdGlvbih0LGUpe1F0KHQpLFIoZSk7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDwzP3Q6UXQoYXJndW1lbnRzWzJdKTtpZihybyYmIWVvKXJldHVybiB0byh0LGUscik7aWYodD09cil7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSl9dmFyIG49W251bGxdO3JldHVybiBuLnB1c2guYXBwbHkobixlKSxuZXcoWm4uYXBwbHkodCxuKSl9dmFyIG89ci5wcm90b3R5cGUsaT1IdChnKG8pP286T2JqZWN0LnByb3RvdHlwZSksYT1GdW5jdGlvbi5hcHBseS5jYWxsKHQsaSxlKTtyZXR1cm4gZyhhKT9hOml9fSk7dmFyIG9vPW8oZnVuY3Rpb24oKXtSZWZsZWN0LmRlZmluZVByb3BlcnR5KFAuZih7fSwxLHt2YWx1ZToxfSksMSx7dmFsdWU6Mn0pfSk7a3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwLGZvcmNlZDpvbyxzaGFtOiFpfSx7ZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24odCxlLHIpe1IodCk7dmFyIG49eShlLCEwKTtSKHIpO3RyeXtyZXR1cm4gUC5mKHQsbixyKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19fSk7dmFyIGlvPU8uZjtrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtkZWxldGVQcm9wZXJ0eTpmdW5jdGlvbih0LGUpe3ZhciByPWlvKFIodCksZSk7cmV0dXJuIShyJiYhci5jb25maWd1cmFibGUpJiZkZWxldGUgdFtlXX19KSxrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLHIpe3ZhciBuLG8saT1hcmd1bWVudHMubGVuZ3RoPDM/ZTphcmd1bWVudHNbMl07cmV0dXJuIFIoZSk9PT1pP2Vbcl06KG49Ty5mKGUscikpP2IobixcInZhbHVlXCIpP24udmFsdWU6dm9pZCAwPT09bi5nZXQ/dm9pZCAwOm4uZ2V0LmNhbGwoaSk6ZyhvPUllKGUpKT90KG8scixpKTp2b2lkIDB9fSksa3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwLHNoYW06IWl9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24odCxlKXtyZXR1cm4gTy5mKFIodCksZSl9fSksa3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwLHNoYW06IVJlfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIEllKFIodCkpfX0pLGt0KHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMH0se2hhczpmdW5jdGlvbih0LGUpe3JldHVybiBlIGluIHR9fSk7dmFyIGFvPU9iamVjdC5pc0V4dGVuc2libGU7a3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwfSx7aXNFeHRlbnNpYmxlOmZ1bmN0aW9uKHQpe3JldHVybiBSKHQpLCFhb3x8YW8odCl9fSksa3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwfSx7b3duS2V5czpTdH0pLGt0KHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMCxzaGFtOiFMcn0se3ByZXZlbnRFeHRlbnNpb25zOmZ1bmN0aW9uKHQpe1IodCk7dHJ5e3ZhciBlPW90KFwiT2JqZWN0XCIsXCJwcmV2ZW50RXh0ZW5zaW9uc1wiKTtyZXR1cm4gZSYmZSh0KSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19fSk7dmFyIHVvPW8oZnVuY3Rpb24oKXt2YXIgdD1QLmYoe30sXCJhXCIse2NvbmZpZ3VyYWJsZTohMH0pO3JldHVybiExIT09UmVmbGVjdC5zZXQoSWUodCksXCJhXCIsMSx0KX0pO2t0KHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMCxmb3JjZWQ6dW99LHtzZXQ6ZnVuY3Rpb24gdChlLHIsbil7dmFyIG8saSxhPWFyZ3VtZW50cy5sZW5ndGg8ND9lOmFyZ3VtZW50c1szXSx1PU8uZihSKGUpLHIpO2lmKCF1KXtpZihnKGk9SWUoZSkpKXJldHVybiB0KGkscixuLGEpO3U9YygwKX1pZihiKHUsXCJ2YWx1ZVwiKSl7aWYoITE9PT11LndyaXRhYmxlfHwhZyhhKSlyZXR1cm4hMTtpZihvPU8uZihhLHIpKXtpZihvLmdldHx8by5zZXR8fCExPT09by53cml0YWJsZSlyZXR1cm4hMTtvLnZhbHVlPW4sUC5mKGEscixvKX1lbHNlIFAuZihhLHIsYygwLG4pKTtyZXR1cm4hMH1yZXR1cm4gdm9pZCAwIT09dS5zZXQmJih1LnNldC5jYWxsKGEsbiksITApfX0pLHFlJiZrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0LGUpe1IodCksRGUoZSk7dHJ5e3JldHVybiBxZSh0LGUpLCEwfWNhdGNoKHQpe3JldHVybiExfX19KTt2YXIgc289VXIuZ2V0V2Vha0RhdGEsY289dHQuc2V0LGZvPXR0LmdldHRlckZvcixsbz11ZS5maW5kLGhvPXVlLmZpbmRJbmRleCxwbz0wLHZvPWZ1bmN0aW9uKHQpe3JldHVybiB0LmZyb3plbnx8KHQuZnJvemVuPW5ldyBnbyl9LGdvPWZ1bmN0aW9uKCl7dGhpcy5lbnRyaWVzPVtdfSx5bz1mdW5jdGlvbih0LGUpe3JldHVybiBsbyh0LmVudHJpZXMsZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1lfSl9O2dvLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXlvKHRoaXMsdCk7aWYoZSlyZXR1cm4gZVsxXX0saGFzOmZ1bmN0aW9uKHQpe3JldHVybiEheW8odGhpcyx0KX0sc2V0OmZ1bmN0aW9uKHQsZSl7dmFyIHI9eW8odGhpcyx0KTtyP3JbMV09ZTp0aGlzLmVudHJpZXMucHVzaChbdCxlXSl9LGRlbGV0ZTpmdW5jdGlvbih0KXt2YXIgZT1obyh0aGlzLmVudHJpZXMsZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10fSk7cmV0dXJufmUmJnRoaXMuZW50cmllcy5zcGxpY2UoZSwxKSwhIX5lfX07dmFyIG1vPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbih0LGUscixuKXt2YXIgbz10KGZ1bmN0aW9uKHQsaSl7X3IodCxvLGUpLGNvKHQse3R5cGU6ZSxpZDpwbysrLGZyb3plbjp2b2lkIDB9KSxudWxsIT1pJiZNcihpLHRbbl0sdCxyKX0pLGk9Zm8oZSksYT1mdW5jdGlvbih0LGUscil7dmFyIG49aSh0KSxvPXNvKFIoZSksITApO3JldHVybiEwPT09bz92byhuKS5zZXQoZSxyKTpvW24uaWRdPXIsdH07cmV0dXJuIEZyKG8ucHJvdG90eXBlLHtkZWxldGU6ZnVuY3Rpb24odCl7dmFyIGU9aSh0aGlzKTtpZighZyh0KSlyZXR1cm4hMTt2YXIgcj1zbyh0KTtyZXR1cm4hMD09PXI/dm8oZSkuZGVsZXRlKHQpOnImJmIocixlLmlkKSYmZGVsZXRlIHJbZS5pZF19LGhhczpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpO2lmKCFnKHQpKXJldHVybiExO3ZhciByPXNvKHQpO3JldHVybiEwPT09cj92byhlKS5oYXModCk6ciYmYihyLGUuaWQpfX0pLEZyKG8ucHJvdG90eXBlLHI/e2dldDpmdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMpO2lmKGcodCkpe3ZhciByPXNvKHQpO3JldHVybiEwPT09cj92byhlKS5nZXQodCk6cj9yW2UuaWRdOnZvaWQgMH19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiBhKHRoaXMsdCxlKX19OnthZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIGEodGhpcyx0LCEwKX19KSxvfX0sYm89ZShmdW5jdGlvbih0KXt2YXIgZSxyPXR0LmVuZm9yY2Usbz0hbi5BY3RpdmVYT2JqZWN0JiZcIkFjdGl2ZVhPYmplY3RcImluIG4saT1PYmplY3QuaXNFeHRlbnNpYmxlLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDApfX0sdT10LmV4cG9ydHM9Q3IoXCJXZWFrTWFwXCIsYSxtbyk7aWYoQiYmbyl7ZT1tby5nZXRDb25zdHJ1Y3RvcihhLFwiV2Vha01hcFwiLCEwKSxVci5SRVFVSVJFRD0hMDt2YXIgcz11LnByb3RvdHlwZSxjPXMuZGVsZXRlLGY9cy5oYXMsbD1zLmdldCxoPXMuc2V0O0ZyKHMse2RlbGV0ZTpmdW5jdGlvbih0KXtpZihnKHQpJiYhaSh0KSl7dmFyIG49cih0aGlzKTtyZXR1cm4gbi5mcm96ZW58fChuLmZyb3plbj1uZXcgZSksYy5jYWxsKHRoaXMsdCl8fG4uZnJvemVuLmRlbGV0ZSh0KX1yZXR1cm4gYy5jYWxsKHRoaXMsdCl9LGhhczpmdW5jdGlvbih0KXtpZihnKHQpJiYhaSh0KSl7dmFyIG49cih0aGlzKTtyZXR1cm4gbi5mcm96ZW58fChuLmZyb3plbj1uZXcgZSksZi5jYWxsKHRoaXMsdCl8fG4uZnJvemVuLmhhcyh0KX1yZXR1cm4gZi5jYWxsKHRoaXMsdCl9LGdldDpmdW5jdGlvbih0KXtpZihnKHQpJiYhaSh0KSl7dmFyIG49cih0aGlzKTtyZXR1cm4gbi5mcm96ZW58fChuLmZyb3plbj1uZXcgZSksZi5jYWxsKHRoaXMsdCk/bC5jYWxsKHRoaXMsdCk6bi5mcm96ZW4uZ2V0KHQpfXJldHVybiBsLmNhbGwodGhpcyx0KX0sc2V0OmZ1bmN0aW9uKHQsbil7aWYoZyh0KSYmIWkodCkpe3ZhciBvPXIodGhpcyk7by5mcm96ZW58fChvLmZyb3plbj1uZXcgZSksZi5jYWxsKHRoaXMsdCk/aC5jYWxsKHRoaXMsdCxuKTpvLmZyb3plbi5zZXQodCxuKX1lbHNlIGguY2FsbCh0aGlzLHQsbik7cmV0dXJuIHRoaXN9fSl9fSksd289cShcIm1ldGFkYXRhXCIpLFNvPXdvLnN0b3JlfHwod28uc3RvcmU9bmV3IGJvKSxFbz1mdW5jdGlvbih0LGUscil7dmFyIG49U28uZ2V0KHQpO2lmKCFuKXtpZighcilyZXR1cm47U28uc2V0KHQsbj1uZXcgJHIpfXZhciBvPW4uZ2V0KGUpO2lmKCFvKXtpZighcilyZXR1cm47bi5zZXQoZSxvPW5ldyAkcil9cmV0dXJuIG99LHhvPXtzdG9yZTpTbyxnZXRNYXA6RW8saGFzOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1FbyhlLHIsITEpO3JldHVybiB2b2lkIDAhPT1uJiZuLmhhcyh0KX0sZ2V0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1FbyhlLHIsITEpO3JldHVybiB2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldCh0KX0sc2V0OmZ1bmN0aW9uKHQsZSxyLG4pe0VvKHIsbiwhMCkuc2V0KHQsZSl9LGtleXM6ZnVuY3Rpb24odCxlKXt2YXIgcj1Fbyh0LGUsITEpLG49W107cmV0dXJuIHImJnIuZm9yRWFjaChmdW5jdGlvbih0LGUpe24ucHVzaChlKX0pLG59LHRvS2V5OmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fHxcInN5bWJvbFwiPT10eXBlb2YgdD90OlN0cmluZyh0KX19LEFvPXhvLnRvS2V5LE9vPXhvLnNldDtrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtkZWZpbmVNZXRhZGF0YTpmdW5jdGlvbih0LGUscil7dmFyIG49YXJndW1lbnRzLmxlbmd0aDw0P3ZvaWQgMDpBbyhhcmd1bWVudHNbM10pO09vKHQsZSxSKHIpLG4pfX0pO3ZhciBSbz14by50b0tleSxqbz14by5nZXRNYXAsUG89eG8uc3RvcmU7a3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwfSx7ZGVsZXRlTWV0YWRhdGE6ZnVuY3Rpb24odCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOlJvKGFyZ3VtZW50c1syXSksbj1qbyhSKGUpLHIsITEpO2lmKHZvaWQgMD09PW58fCFuLmRlbGV0ZSh0KSlyZXR1cm4hMTtpZihuLnNpemUpcmV0dXJuITA7dmFyIG89UG8uZ2V0KGUpO3JldHVybiBvLmRlbGV0ZShyKSwhIW8uc2l6ZXx8UG8uZGVsZXRlKGUpfX0pO3ZhciBJbz14by5oYXMsVG89eG8uZ2V0LGtvPXhvLnRvS2V5LExvPWZ1bmN0aW9uIHQoZSxyLG4pe2lmKElvKGUscixuKSlyZXR1cm4gVG8oZSxyLG4pO3ZhciBvPUllKHIpO3JldHVybiBudWxsIT09bz90KGUsbyxuKTp2b2lkIDB9O2t0KHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMH0se2dldE1ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDprbyhhcmd1bWVudHNbMl0pO3JldHVybiBMbyh0LFIoZSkscil9fSk7dmFyIFVvPUNyKFwiU2V0XCIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQodGhpcyxhcmd1bWVudHMubGVuZ3RoP2FyZ3VtZW50c1swXTp2b2lkIDApfX0sR3IpLE1vPXhvLmtleXMsX289eG8udG9LZXksTm89ZnVuY3Rpb24gdChlLHIpe3ZhciBuPU1vKGUsciksbz1JZShlKTtpZihudWxsPT09bylyZXR1cm4gbjt2YXIgaSxhLHU9dChvLHIpO3JldHVybiB1Lmxlbmd0aD9uLmxlbmd0aD8oaT1uZXcgVW8obi5jb25jYXQodSkpLE1yKGksKGE9W10pLnB1c2gsYSksYSk6dTpufTtrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtnZXRNZXRhZGF0YUtleXM6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDwyP3ZvaWQgMDpfbyhhcmd1bWVudHNbMV0pO3JldHVybiBObyhSKHQpLGUpfX0pO3ZhciBDbz14by5nZXQsRm89eG8udG9LZXk7a3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwfSx7Z2V0T3duTWV0YWRhdGE6ZnVuY3Rpb24odCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPDM/dm9pZCAwOkZvKGFyZ3VtZW50c1syXSk7cmV0dXJuIENvKHQsUihlKSxyKX19KTt2YXIgQm89eG8ua2V5cyxEbz14by50b0tleTtrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtnZXRPd25NZXRhZGF0YUtleXM6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDwyP3ZvaWQgMDpEbyhhcmd1bWVudHNbMV0pO3JldHVybiBCbyhSKHQpLGUpfX0pO3ZhciBxbz14by5oYXMsem89eG8udG9LZXksV289ZnVuY3Rpb24gdChlLHIsbil7aWYocW8oZSxyLG4pKXJldHVybiEwO3ZhciBvPUllKHIpO3JldHVybiBudWxsIT09byYmdChlLG8sbil9O2t0KHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMH0se2hhc01ldGFkYXRhOmZ1bmN0aW9uKHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDwzP3ZvaWQgMDp6byhhcmd1bWVudHNbMl0pO3JldHVybiBXbyh0LFIoZSkscil9fSk7dmFyIEtvPXhvLmhhcyxHbz14by50b0tleTtrdCh7dGFyZ2V0OlwiUmVmbGVjdFwiLHN0YXQ6ITB9LHtoYXNPd25NZXRhZGF0YTpmdW5jdGlvbih0LGUpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg8Mz92b2lkIDA6R28oYXJndW1lbnRzWzJdKTtyZXR1cm4gS28odCxSKGUpLHIpfX0pO3ZhciAkbz14by50b0tleSxWbz14by5zZXQ7a3Qoe3RhcmdldDpcIlJlZmxlY3RcIixzdGF0OiEwfSx7bWV0YWRhdGE6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24ocixuKXtWbyh0LGUsUihyKSwkbyhuKSl9fX0pO3ZhciBIbz1EdChcIm1hdGNoXCIpLFhvPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBnKHQpJiYodm9pZCAwIT09KGU9dFtIb10pPyEhZTpcIlJlZ0V4cFwiPT1sKHQpKX0sWW89ZnVuY3Rpb24oKXt2YXIgdD1SKHRoaXMpLGU9XCJcIjtyZXR1cm4gdC5nbG9iYWwmJihlKz1cImdcIiksdC5pZ25vcmVDYXNlJiYoZSs9XCJpXCIpLHQubXVsdGlsaW5lJiYoZSs9XCJtXCIpLHQuZG90QWxsJiYoZSs9XCJzXCIpLHQudW5pY29kZSYmKGUrPVwidVwiKSx0LnN0aWNreSYmKGUrPVwieVwiKSxlfTtmdW5jdGlvbiBKbyh0LGUpe3JldHVybiBSZWdFeHAodCxlKX12YXIgUW89e1VOU1VQUE9SVEVEX1k6byhmdW5jdGlvbigpe3ZhciB0PUpvKFwiYVwiLFwieVwiKTtyZXR1cm4gdC5sYXN0SW5kZXg9MixudWxsIT10LmV4ZWMoXCJhYmNkXCIpfSksQlJPS0VOX0NBUkVUOm8oZnVuY3Rpb24oKXt2YXIgdD1KbyhcIl5yXCIsXCJneVwiKTtyZXR1cm4gdC5sYXN0SW5kZXg9MixudWxsIT10LmV4ZWMoXCJzdHJcIil9KX0sWm89UC5mLHRpPWJ0LmYsZWk9dHQuc2V0LHJpPUR0KFwibWF0Y2hcIiksbmk9bi5SZWdFeHAsb2k9bmkucHJvdG90eXBlLGlpPS9hL2csYWk9L2EvZyx1aT1uZXcgbmkoaWkpIT09aWksc2k9UW8uVU5TVVBQT1JURURfWTtpZihpJiZJdChcIlJlZ0V4cFwiLCF1aXx8c2l8fG8oZnVuY3Rpb24oKXtyZXR1cm4gYWlbcmldPSExLG5pKGlpKSE9aWl8fG5pKGFpKT09YWl8fFwiL2EvaVwiIT1uaShpaSxcImlcIil9KSkpe2Zvcih2YXIgY2k9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXRoaXMgaW5zdGFuY2VvZiBjaSxvPVhvKHQpLGk9dm9pZCAwPT09ZTtpZighbiYmbyYmdC5jb25zdHJ1Y3Rvcj09PWNpJiZpKXJldHVybiB0O3VpP28mJiFpJiYodD10LnNvdXJjZSk6dCBpbnN0YW5jZW9mIGNpJiYoaSYmKGU9WW8uY2FsbCh0KSksdD10LnNvdXJjZSksc2kmJihyPSEhZSYmZS5pbmRleE9mKFwieVwiKT4tMSkmJihlPWUucmVwbGFjZSgveS9nLFwiXCIpKTt2YXIgYT1Ocih1aT9uZXcgbmkodCxlKTpuaSh0LGUpLG4/dGhpczpvaSxjaSk7cmV0dXJuIHNpJiZyJiZlaShhLHtzdGlja3k6cn0pLGF9LGZpPWZ1bmN0aW9uKHQpe3QgaW4gY2l8fFpvKGNpLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmlbdF19LHNldDpmdW5jdGlvbihlKXtuaVt0XT1lfX0pfSxsaT10aShuaSksaGk9MDtsaS5sZW5ndGg+aGk7KWZpKGxpW2hpKytdKTtvaS5jb25zdHJ1Y3Rvcj1jaSxjaS5wcm90b3R5cGU9b2ksZXQobixcIlJlZ0V4cFwiLGNpKX1EcihcIlJlZ0V4cFwiKTt2YXIgcGk9XCJ0b1N0cmluZ1wiLGRpPVJlZ0V4cC5wcm90b3R5cGUsdmk9ZGkudG9TdHJpbmc7KG8oZnVuY3Rpb24oKXtyZXR1cm5cIi9hL2JcIiE9dmkuY2FsbCh7c291cmNlOlwiYVwiLGZsYWdzOlwiYlwifSl9KXx8dmkubmFtZSE9cGkpJiZldChSZWdFeHAucHJvdG90eXBlLHBpLGZ1bmN0aW9uKCl7dmFyIHQ9Uih0aGlzKSxlPVN0cmluZyh0LnNvdXJjZSkscj10LmZsYWdzO3JldHVyblwiL1wiK2UrXCIvXCIrU3RyaW5nKHZvaWQgMD09PXImJnQgaW5zdGFuY2VvZiBSZWdFeHAmJiEoXCJmbGFnc1wiaW4gZGkpP1lvLmNhbGwodCk6cil9LHt1bnNhZmU6ITB9KTt2YXIgZ2k9UmVnRXhwLnByb3RvdHlwZS5leGVjLHlpPVN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxtaT1naSxiaT1mdW5jdGlvbigpe3ZhciB0PS9hLyxlPS9iKi9nO3JldHVybiBnaS5jYWxsKHQsXCJhXCIpLGdpLmNhbGwoZSxcImFcIiksMCE9PXQubGFzdEluZGV4fHwwIT09ZS5sYXN0SW5kZXh9KCksd2k9UW8uVU5TVVBQT1JURURfWXx8UW8uQlJPS0VOX0NBUkVULFNpPXZvaWQgMCE9PS8oKT8/Ly5leGVjKFwiXCIpWzFdOyhiaXx8U2l8fHdpKSYmKG1pPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixvLGk9dGhpcyxhPXdpJiZpLnN0aWNreSx1PVlvLmNhbGwoaSkscz1pLnNvdXJjZSxjPTAsZj10O3JldHVybiBhJiYoLTE9PT0odT11LnJlcGxhY2UoXCJ5XCIsXCJcIikpLmluZGV4T2YoXCJnXCIpJiYodSs9XCJnXCIpLGY9U3RyaW5nKHQpLnNsaWNlKGkubGFzdEluZGV4KSxpLmxhc3RJbmRleD4wJiYoIWkubXVsdGlsaW5lfHxpLm11bHRpbGluZSYmXCJcXG5cIiE9PXRbaS5sYXN0SW5kZXgtMV0pJiYocz1cIig/OiBcIitzK1wiKVwiLGY9XCIgXCIrZixjKyspLHI9bmV3IFJlZ0V4cChcIl4oPzpcIitzK1wiKVwiLHUpKSxTaSYmKHI9bmV3IFJlZ0V4cChcIl5cIitzK1wiJCg/IVxcXFxzKVwiLHUpKSxiaSYmKGU9aS5sYXN0SW5kZXgpLG49Z2kuY2FsbChhP3I6aSxmKSxhP24/KG4uaW5wdXQ9bi5pbnB1dC5zbGljZShjKSxuWzBdPW5bMF0uc2xpY2UoYyksbi5pbmRleD1pLmxhc3RJbmRleCxpLmxhc3RJbmRleCs9blswXS5sZW5ndGgpOmkubGFzdEluZGV4PTA6YmkmJm4mJihpLmxhc3RJbmRleD1pLmdsb2JhbD9uLmluZGV4K25bMF0ubGVuZ3RoOmUpLFNpJiZuJiZuLmxlbmd0aD4xJiZ5aS5jYWxsKG5bMF0scixmdW5jdGlvbigpe2ZvcihvPTE7bzxhcmd1bWVudHMubGVuZ3RoLTI7bysrKXZvaWQgMD09PWFyZ3VtZW50c1tvXSYmKG5bb109dm9pZCAwKX0pLG59KTt2YXIgRWk9bWk7a3Qoe3RhcmdldDpcIlJlZ0V4cFwiLHByb3RvOiEwLGZvcmNlZDovLi8uZXhlYyE9PUVpfSx7ZXhlYzpFaX0pLGkmJihcImdcIiE9Ly4vZy5mbGFnc3x8UW8uVU5TVVBQT1JURURfWSkmJlAuZihSZWdFeHAucHJvdG90eXBlLFwiZmxhZ3NcIix7Y29uZmlndXJhYmxlOiEwLGdldDpZb30pO3ZhciB4aT10dC5nZXQsQWk9UmVnRXhwLnByb3RvdHlwZTtpJiZRby5VTlNVUFBPUlRFRF9ZJiYoMCxQLmYpKFJlZ0V4cC5wcm90b3R5cGUsXCJzdGlja3lcIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHRoaXMhPT1BaSl7aWYodGhpcyBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4hIXhpKHRoaXMpLnN0aWNreTt0aHJvdyBUeXBlRXJyb3IoXCJJbmNvbXBhdGlibGUgcmVjZWl2ZXIsIFJlZ0V4cCByZXF1aXJlZFwiKX19fSk7dmFyIE9pLFJpLGppPShPaT0hMSwoUmk9L1thY10vKS5leGVjPWZ1bmN0aW9uKCl7cmV0dXJuIE9pPSEwLC8uLy5leGVjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sITA9PT1SaS50ZXN0KFwiYWJjXCIpJiZPaSksUGk9Ly4vLnRlc3Q7a3Qoe3RhcmdldDpcIlJlZ0V4cFwiLHByb3RvOiEwLGZvcmNlZDohaml9LHt0ZXN0OmZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXMuZXhlYylyZXR1cm4gUGkuY2FsbCh0aGlzLHQpO3ZhciBlPXRoaXMuZXhlYyh0KTtpZihudWxsIT09ZSYmIWcoZSkpdGhyb3cgbmV3IEVycm9yKFwiUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsXCIpO3JldHVybiEhZX19KTt2YXIgSWk9RHQoXCJzcGVjaWVzXCIpLFRpPSFvKGZ1bmN0aW9uKCl7dmFyIHQ9Ly4vO3JldHVybiB0LmV4ZWM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdC5ncm91cHM9e2E6XCI3XCJ9LHR9LFwiN1wiIT09XCJcIi5yZXBsYWNlKHQsXCIkPGE+XCIpfSksa2k9XCIkMFwiPT09XCJhXCIucmVwbGFjZSgvLi8sXCIkMFwiKSxMaT1EdChcInJlcGxhY2VcIiksVWk9ISEvLi9bTGldJiZcIlwiPT09Ly4vW0xpXShcImFcIixcIiQwXCIpLE1pPSFvKGZ1bmN0aW9uKCl7dmFyIHQ9Lyg/OikvLGU9dC5leGVjO3QuZXhlYz1mdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07dmFyIHI9XCJhYlwiLnNwbGl0KHQpO3JldHVybiAyIT09ci5sZW5ndGh8fFwiYVwiIT09clswXXx8XCJiXCIhPT1yWzFdfSksX2k9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9RHQodCksYT0hbyhmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiBlW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIDd9LDchPVwiXCJbdF0oZSl9KSx1PWEmJiFvKGZ1bmN0aW9uKCl7dmFyIGU9ITEscj0vYS87cmV0dXJuXCJzcGxpdFwiPT09dCYmKChyPXt9KS5jb25zdHJ1Y3Rvcj17fSxyLmNvbnN0cnVjdG9yW0lpXT1mdW5jdGlvbigpe3JldHVybiByfSxyLmZsYWdzPVwiXCIscltpXT0vLi9baV0pLHIuZXhlYz1mdW5jdGlvbigpe3JldHVybiBlPSEwLG51bGx9LHJbaV0oXCJcIiksIWV9KTtpZighYXx8IXV8fFwicmVwbGFjZVwiPT09dCYmKCFUaXx8IWtpfHxVaSl8fFwic3BsaXRcIj09PXQmJiFNaSl7dmFyIHM9Ly4vW2ldLGM9cihpLFwiXCJbdF0sZnVuY3Rpb24odCxlLHIsbixvKXtyZXR1cm4gZS5leGVjPT09RWk/YSYmIW8/e2RvbmU6ITAsdmFsdWU6cy5jYWxsKGUscixuKX06e2RvbmU6ITAsdmFsdWU6dC5jYWxsKHIsZSxuKX06e2RvbmU6ITF9fSx7UkVQTEFDRV9LRUVQU18kMDpraSxSRUdFWFBfUkVQTEFDRV9TVUJTVElUVVRFU19VTkRFRklORURfQ0FQVFVSRTpVaX0pLGY9Y1sxXTtldChTdHJpbmcucHJvdG90eXBlLHQsY1swXSksZXQoUmVnRXhwLnByb3RvdHlwZSxpLDI9PWU/ZnVuY3Rpb24odCxlKXtyZXR1cm4gZi5jYWxsKHQsdGhpcyxlKX06ZnVuY3Rpb24odCl7cmV0dXJuIGYuY2FsbCh0LHRoaXMpfSl9biYmSShSZWdFeHAucHJvdG90eXBlW2ldLFwic2hhbVwiLCEwKX0sTmk9T2UuY2hhckF0LENpPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZSsocj9OaSh0LGUpLmxlbmd0aDoxKX0sRmk9ZnVuY3Rpb24odCxlKXt2YXIgcj10LmV4ZWM7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygcil7dmFyIG49ci5jYWxsKHQsZSk7aWYoXCJvYmplY3RcIiE9dHlwZW9mIG4pdGhyb3cgVHlwZUVycm9yKFwiUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsXCIpO3JldHVybiBufWlmKFwiUmVnRXhwXCIhPT1sKHQpKXRocm93IFR5cGVFcnJvcihcIlJlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXJcIik7cmV0dXJuIEVpLmNhbGwodCxlKX07X2koXCJtYXRjaFwiLDEsZnVuY3Rpb24odCxlLHIpe3JldHVybltmdW5jdGlvbihlKXt2YXIgcj1kKHRoaXMpLG49bnVsbD09ZT92b2lkIDA6ZVt0XTtyZXR1cm4gdm9pZCAwIT09bj9uLmNhbGwoZSxyKTpuZXcgUmVnRXhwKGUpW3RdKFN0cmluZyhyKSl9LGZ1bmN0aW9uKHQpe3ZhciBuPXIoZSx0LHRoaXMpO2lmKG4uZG9uZSlyZXR1cm4gbi52YWx1ZTt2YXIgbz1SKHQpLGk9U3RyaW5nKHRoaXMpO2lmKCFvLmdsb2JhbClyZXR1cm4gRmkobyxpKTt2YXIgYT1vLnVuaWNvZGU7by5sYXN0SW5kZXg9MDtmb3IodmFyIHUscz1bXSxjPTA7bnVsbCE9PSh1PUZpKG8saSkpOyl7dmFyIGY9U3RyaW5nKHVbMF0pO3NbY109ZixcIlwiPT09ZiYmKG8ubGFzdEluZGV4PUNpKGksY3Qoby5sYXN0SW5kZXgpLGEpKSxjKyt9cmV0dXJuIDA9PT1jP251bGw6c31dfSk7dmFyIEJpPU1hdGgubWF4LERpPU1hdGgubWluLHFpPU1hdGguZmxvb3Isemk9L1xcJChbJCYnYF18XFxkXFxkP3w8W14+XSo+KS9nLFdpPS9cXCQoWyQmJ2BdfFxcZFxcZD8pL2c7X2koXCJyZXBsYWNlXCIsMixmdW5jdGlvbih0LGUscixuKXt2YXIgbz1uLlJFR0VYUF9SRVBMQUNFX1NVQlNUSVRVVEVTX1VOREVGSU5FRF9DQVBUVVJFLGk9bi5SRVBMQUNFX0tFRVBTXyQwLGE9bz9cIiRcIjpcIiQwXCI7cmV0dXJuW2Z1bmN0aW9uKHIsbil7dmFyIG89ZCh0aGlzKSxpPW51bGw9PXI/dm9pZCAwOnJbdF07cmV0dXJuIHZvaWQgMCE9PWk/aS5jYWxsKHIsbyxuKTplLmNhbGwoU3RyaW5nKG8pLHIsbil9LGZ1bmN0aW9uKHQsbil7aWYoIW8mJml8fFwic3RyaW5nXCI9PXR5cGVvZiBuJiYtMT09PW4uaW5kZXhPZihhKSl7dmFyIHM9cihlLHQsdGhpcyxuKTtpZihzLmRvbmUpcmV0dXJuIHMudmFsdWV9dmFyIGM9Uih0KSxmPVN0cmluZyh0aGlzKSxsPVwiZnVuY3Rpb25cIj09dHlwZW9mIG47bHx8KG49U3RyaW5nKG4pKTt2YXIgaD1jLmdsb2JhbDtpZihoKXt2YXIgcD1jLnVuaWNvZGU7Yy5sYXN0SW5kZXg9MH1mb3IodmFyIGQ9W107Oyl7dmFyIHY9RmkoYyxmKTtpZihudWxsPT09dilicmVhaztpZihkLnB1c2godiksIWgpYnJlYWs7XCJcIj09PVN0cmluZyh2WzBdKSYmKGMubGFzdEluZGV4PUNpKGYsY3QoYy5sYXN0SW5kZXgpLHApKX1mb3IodmFyIGcseT1cIlwiLG09MCxiPTA7YjxkLmxlbmd0aDtiKyspe3Y9ZFtiXTtmb3IodmFyIHc9U3RyaW5nKHZbMF0pLFM9QmkoRGkodXQodi5pbmRleCksZi5sZW5ndGgpLDApLEU9W10seD0xO3g8di5sZW5ndGg7eCsrKUUucHVzaCh2b2lkIDA9PT0oZz12W3hdKT9nOlN0cmluZyhnKSk7dmFyIEE9di5ncm91cHM7aWYobCl7dmFyIE89W3ddLmNvbmNhdChFLFMsZik7dm9pZCAwIT09QSYmTy5wdXNoKEEpO3ZhciBqPVN0cmluZyhuLmFwcGx5KHZvaWQgMCxPKSl9ZWxzZSBqPXUodyxmLFMsRSxBLG4pO1M+PW0mJih5Kz1mLnNsaWNlKG0sUykraixtPVMrdy5sZW5ndGgpfXJldHVybiB5K2Yuc2xpY2UobSl9XTtmdW5jdGlvbiB1KHQscixuLG8saSxhKXt2YXIgdT1uK3QubGVuZ3RoLHM9by5sZW5ndGgsYz1XaTtyZXR1cm4gdm9pZCAwIT09aSYmKGk9THQoaSksYz16aSksZS5jYWxsKGEsYyxmdW5jdGlvbihlLGEpe3ZhciBjO3N3aXRjaChhLmNoYXJBdCgwKSl7Y2FzZVwiJFwiOnJldHVyblwiJFwiO2Nhc2VcIiZcIjpyZXR1cm4gdDtjYXNlXCJgXCI6cmV0dXJuIHIuc2xpY2UoMCxuKTtjYXNlXCInXCI6cmV0dXJuIHIuc2xpY2UodSk7Y2FzZVwiPFwiOmM9aVthLnNsaWNlKDEsLTEpXTticmVhaztkZWZhdWx0OnZhciBmPSthO2lmKDA9PT1mKXJldHVybiBlO2lmKGY+cyl7dmFyIGw9cWkoZi8xMCk7cmV0dXJuIDA9PT1sP2U6bDw9cz92b2lkIDA9PT1vW2wtMV0/YS5jaGFyQXQoMSk6b1tsLTFdK2EuY2hhckF0KDEpOmV9Yz1vW2YtMV19cmV0dXJuIHZvaWQgMD09PWM/XCJcIjpjfSl9fSksX2koXCJzZWFyY2hcIiwxLGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm5bZnVuY3Rpb24oZSl7dmFyIHI9ZCh0aGlzKSxuPW51bGw9PWU/dm9pZCAwOmVbdF07cmV0dXJuIHZvaWQgMCE9PW4/bi5jYWxsKGUscik6bmV3IFJlZ0V4cChlKVt0XShTdHJpbmcocikpfSxmdW5jdGlvbih0KXt2YXIgbj1yKGUsdCx0aGlzKTtpZihuLmRvbmUpcmV0dXJuIG4udmFsdWU7dmFyIG89Uih0KSxpPVN0cmluZyh0aGlzKSxhPW8ubGFzdEluZGV4O0duKGEsMCl8fChvLmxhc3RJbmRleD0wKTt2YXIgdT1GaShvLGkpO3JldHVybiBHbihvLmxhc3RJbmRleCxhKXx8KG8ubGFzdEluZGV4PWEpLG51bGw9PT11Py0xOnUuaW5kZXh9XX0pO3ZhciBLaT1bXS5wdXNoLEdpPU1hdGgubWluLCRpPTQyOTQ5NjcyOTUsVmk9IW8oZnVuY3Rpb24oKXtyZXR1cm4hUmVnRXhwKCRpLFwieVwiKX0pO19pKFwic3BsaXRcIiwyLGZ1bmN0aW9uKHQsZSxyKXt2YXIgbjtyZXR1cm4gbj1cImNcIj09XCJhYmJjXCIuc3BsaXQoLyhiKSovKVsxXXx8NCE9XCJ0ZXN0XCIuc3BsaXQoLyg/OikvLC0xKS5sZW5ndGh8fDIhPVwiYWJcIi5zcGxpdCgvKD86YWIpKi8pLmxlbmd0aHx8NCE9XCIuXCIuc3BsaXQoLyguPykoLj8pLykubGVuZ3RofHxcIi5cIi5zcGxpdCgvKCkoKS8pLmxlbmd0aD4xfHxcIlwiLnNwbGl0KC8uPy8pLmxlbmd0aD9mdW5jdGlvbih0LHIpe3ZhciBuPVN0cmluZyhkKHRoaXMpKSxvPXZvaWQgMD09PXI/JGk6cj4+PjA7aWYoMD09PW8pcmV0dXJuW107aWYodm9pZCAwPT09dClyZXR1cm5bbl07aWYoIVhvKHQpKXJldHVybiBlLmNhbGwobix0LG8pO2Zvcih2YXIgaSxhLHUscz1bXSxjPTAsZj1uZXcgUmVnRXhwKHQuc291cmNlLCh0Lmlnbm9yZUNhc2U/XCJpXCI6XCJcIikrKHQubXVsdGlsaW5lP1wibVwiOlwiXCIpKyh0LnVuaWNvZGU/XCJ1XCI6XCJcIikrKHQuc3RpY2t5P1wieVwiOlwiXCIpK1wiZ1wiKTsoaT1FaS5jYWxsKGYsbikpJiYhKChhPWYubGFzdEluZGV4KT5jJiYocy5wdXNoKG4uc2xpY2UoYyxpLmluZGV4KSksaS5sZW5ndGg+MSYmaS5pbmRleDxuLmxlbmd0aCYmS2kuYXBwbHkocyxpLnNsaWNlKDEpKSx1PWlbMF0ubGVuZ3RoLGM9YSxzLmxlbmd0aD49bykpOylmLmxhc3RJbmRleD09PWkuaW5kZXgmJmYubGFzdEluZGV4Kys7cmV0dXJuIGM9PT1uLmxlbmd0aD8hdSYmZi50ZXN0KFwiXCIpfHxzLnB1c2goXCJcIik6cy5wdXNoKG4uc2xpY2UoYykpLHMubGVuZ3RoPm8/cy5zbGljZSgwLG8pOnN9OlwiMFwiLnNwbGl0KHZvaWQgMCwwKS5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gdm9pZCAwPT09dCYmMD09PXI/W106ZS5jYWxsKHRoaXMsdCxyKX06ZSxbZnVuY3Rpb24oZSxyKXt2YXIgbz1kKHRoaXMpLGk9bnVsbD09ZT92b2lkIDA6ZVt0XTtyZXR1cm4gdm9pZCAwIT09aT9pLmNhbGwoZSxvLHIpOm4uY2FsbChTdHJpbmcobyksZSxyKX0sZnVuY3Rpb24odCxvKXt2YXIgaT1yKG4sdCx0aGlzLG8sbiE9PWUpO2lmKGkuZG9uZSlyZXR1cm4gaS52YWx1ZTt2YXIgYT1SKHQpLHU9U3RyaW5nKHRoaXMpLHM9c24oYSxSZWdFeHApLGM9YS51bmljb2RlLGY9bmV3IHMoVmk/YTpcIl4oPzpcIithLnNvdXJjZStcIilcIiwoYS5pZ25vcmVDYXNlP1wiaVwiOlwiXCIpKyhhLm11bHRpbGluZT9cIm1cIjpcIlwiKSsoYS51bmljb2RlP1widVwiOlwiXCIpKyhWaT9cInlcIjpcImdcIikpLGw9dm9pZCAwPT09bz8kaTpvPj4+MDtpZigwPT09bClyZXR1cm5bXTtpZigwPT09dS5sZW5ndGgpcmV0dXJuIG51bGw9PT1GaShmLHUpP1t1XTpbXTtmb3IodmFyIGg9MCxwPTAsZD1bXTtwPHUubGVuZ3RoOyl7Zi5sYXN0SW5kZXg9Vmk/cDowO3ZhciB2LGc9RmkoZixWaT91OnUuc2xpY2UocCkpO2lmKG51bGw9PT1nfHwodj1HaShjdChmLmxhc3RJbmRleCsoVmk/MDpwKSksdS5sZW5ndGgpKT09PWgpcD1DaSh1LHAsYyk7ZWxzZXtpZihkLnB1c2godS5zbGljZShoLHApKSxkLmxlbmd0aD09PWwpcmV0dXJuIGQ7Zm9yKHZhciB5PTE7eTw9Zy5sZW5ndGgtMTt5KyspaWYoZC5wdXNoKGdbeV0pLGQubGVuZ3RoPT09bClyZXR1cm4gZDtwPWg9dn19cmV0dXJuIGQucHVzaCh1LnNsaWNlKGgpKSxkfV19LCFWaSksa3Qoe3RhcmdldDpcIlNldFwiLHN0YXQ6ITB9LHtmcm9tOmVufSksa3Qoe3RhcmdldDpcIlNldFwiLHN0YXQ6ITB9LHtvZjpybn0pO3ZhciBIaT1mdW5jdGlvbigpe2Zvcih2YXIgdD1SKHRoaXMpLGU9UXQodC5hZGQpLHI9MCxuPWFyZ3VtZW50cy5sZW5ndGg7cjxuO3IrKyllLmNhbGwodCxhcmd1bWVudHNbcl0pO3JldHVybiB0fTtrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2FkZEFsbDpmdW5jdGlvbigpe3JldHVybiBIaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSksa3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtkZWxldGVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gbm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pO3ZhciBYaT1mdW5jdGlvbih0KXtyZXR1cm4gU2V0LnByb3RvdHlwZS52YWx1ZXMuY2FsbCh0KX07a3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtldmVyeTpmdW5jdGlvbih0KXt2YXIgZT1SKHRoaXMpLHI9WGkoZSksbj1adCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3JldHVybiFNcihyLGZ1bmN0aW9uKHQpe2lmKCFuKHQsdCxlKSlyZXR1cm4gTXIuc3RvcCgpfSx2b2lkIDAsITEsITApLnN0b3BwZWR9fSksa3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtkaWZmZXJlbmNlOmZ1bmN0aW9uKHQpe3ZhciBlPVIodGhpcykscj1uZXcoc24oZSxvdChcIlNldFwiKSkpKGUpLG49UXQoci5kZWxldGUpO3JldHVybiBNcih0LGZ1bmN0aW9uKHQpe24uY2FsbChyLHQpfSkscn19KSxrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2ZpbHRlcjpmdW5jdGlvbih0KXt2YXIgZT1SKHRoaXMpLHI9WGkoZSksbj1adCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLG89bmV3KHNuKGUsb3QoXCJTZXRcIikpKSxpPVF0KG8uYWRkKTtyZXR1cm4gTXIocixmdW5jdGlvbih0KXtuKHQsdCxlKSYmaS5jYWxsKG8sdCl9LHZvaWQgMCwhMSwhMCksb319KSxrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2ZpbmQ6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPVhpKGUpLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKTtyZXR1cm4gTXIocixmdW5jdGlvbih0KXtpZihuKHQsdCxlKSlyZXR1cm4gTXIuc3RvcCh0KX0sdm9pZCAwLCExLCEwKS5yZXN1bHR9fSksa3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtpbnRlcnNlY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPW5ldyhzbihlLG90KFwiU2V0XCIpKSksbj1RdChlLmhhcyksbz1RdChyLmFkZCk7cmV0dXJuIE1yKHQsZnVuY3Rpb24odCl7bi5jYWxsKGUsdCkmJm8uY2FsbChyLHQpfSkscn19KSxrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2lzRGlzam9pbnRGcm9tOmZ1bmN0aW9uKHQpe3ZhciBlPVIodGhpcykscj1RdChlLmhhcyk7cmV0dXJuIU1yKHQsZnVuY3Rpb24odCl7aWYoITA9PT1yLmNhbGwoZSx0KSlyZXR1cm4gTXIuc3RvcCgpfSkuc3RvcHBlZH19KSxrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2lzU3Vic2V0T2Y6ZnVuY3Rpb24odCl7dmFyIGU9b24odGhpcykscj1SKHQpLG49ci5oYXM7cmV0dXJuXCJmdW5jdGlvblwiIT10eXBlb2YgbiYmKHI9bmV3KG90KFwiU2V0XCIpKSh0KSxuPVF0KHIuaGFzKSksIU1yKGUsZnVuY3Rpb24odCl7aWYoITE9PT1uLmNhbGwocix0KSlyZXR1cm4gTXIuc3RvcCgpfSx2b2lkIDAsITEsITApLnN0b3BwZWR9fSksa3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtpc1N1cGVyc2V0T2Y6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPVF0KGUuaGFzKTtyZXR1cm4hTXIodCxmdW5jdGlvbih0KXtpZighMT09PXIuY2FsbChlLHQpKXJldHVybiBNci5zdG9wKCl9KS5zdG9wcGVkfX0pLGt0KHt0YXJnZXQ6XCJTZXRcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7am9pbjpmdW5jdGlvbih0KXt2YXIgZT1SKHRoaXMpLHI9WGkoZSksbj12b2lkIDA9PT10P1wiLFwiOlN0cmluZyh0KSxvPVtdO3JldHVybiBNcihyLG8ucHVzaCxvLCExLCEwKSxvLmpvaW4obil9fSksa3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHttYXA6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPVhpKGUpLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPW5ldyhzbihlLG90KFwiU2V0XCIpKSksaT1RdChvLmFkZCk7cmV0dXJuIE1yKHIsZnVuY3Rpb24odCl7aS5jYWxsKG8sbih0LHQsZSkpfSx2b2lkIDAsITEsITApLG99fSksa3Qoe3RhcmdldDpcIlNldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtyZWR1Y2U6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPVhpKGUpLG49YXJndW1lbnRzLmxlbmd0aDwyLG89bj92b2lkIDA6YXJndW1lbnRzWzFdO2lmKFF0KHQpLE1yKHIsZnVuY3Rpb24ocil7bj8obj0hMSxvPXIpOm89dChvLHIscixlKX0sdm9pZCAwLCExLCEwKSxuKXRocm93IFR5cGVFcnJvcihcIlJlZHVjZSBvZiBlbXB0eSBzZXQgd2l0aCBubyBpbml0aWFsIHZhbHVlXCIpO3JldHVybiBvfX0pLGt0KHt0YXJnZXQ6XCJTZXRcIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDpEfSx7c29tZTpmdW5jdGlvbih0KXt2YXIgZT1SKHRoaXMpLHI9WGkoZSksbj1adCh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3JldHVybiBNcihyLGZ1bmN0aW9uKHQpe2lmKG4odCx0LGUpKXJldHVybiBNci5zdG9wKCl9LHZvaWQgMCwhMSwhMCkuc3RvcHBlZH19KSxrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se3N5bW1ldHJpY0RpZmZlcmVuY2U6ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPW5ldyhzbihlLG90KFwiU2V0XCIpKSkoZSksbj1RdChyLmRlbGV0ZSksbz1RdChyLmFkZCk7cmV0dXJuIE1yKHQsZnVuY3Rpb24odCl7bi5jYWxsKHIsdCl8fG8uY2FsbChyLHQpfSkscn19KSxrdCh7dGFyZ2V0OlwiU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se3VuaW9uOmZ1bmN0aW9uKHQpe3ZhciBlPVIodGhpcykscj1uZXcoc24oZSxvdChcIlNldFwiKSkpKGUpO3JldHVybiBNcih0LFF0KHIuYWRkKSxyKSxyfX0pO3ZhciBZaSxKaSxRaT1vdChcIm5hdmlnYXRvclwiLFwidXNlckFnZW50XCIpfHxcIlwiLFppPW4ucHJvY2Vzcyx0YT1aaSYmWmkudmVyc2lvbnMsZWE9dGEmJnRhLnY4O2VhP0ppPShZaT1lYS5zcGxpdChcIi5cIikpWzBdK1lpWzFdOlFpJiYoIShZaT1RaS5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pKXx8WWlbMV0+PTc0KSYmKFlpPVFpLm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKSkmJihKaT1ZaVsxXSk7dmFyIHJhPUppJiYrSmksbmE9RHQoXCJzcGVjaWVzXCIpLG9hPUR0KFwiaXNDb25jYXRTcHJlYWRhYmxlXCIpLGlhPTkwMDcxOTkyNTQ3NDA5OTEsYWE9XCJNYXhpbXVtIGFsbG93ZWQgaW5kZXggZXhjZWVkZWRcIix1YT1yYT49NTF8fCFvKGZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRbb2FdPSExLHQuY29uY2F0KClbMF0hPT10fSksc2E9cmE+PTUxfHwhbyhmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybih0LmNvbnN0cnVjdG9yPXt9KVtuYV09ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fSwxIT09dC5jb25jYXQoQm9vbGVhbikuZm9vfSksY2E9ZnVuY3Rpb24odCl7aWYoIWcodCkpcmV0dXJuITE7dmFyIGU9dFtvYV07cmV0dXJuIHZvaWQgMCE9PWU/ISFlOnJlKHQpfTtrdCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6IXVhfHwhc2F9LHtjb25jYXQ6ZnVuY3Rpb24odCl7dmFyIGUscixuLG8saSxhPUx0KHRoaXMpLHU9b2UoYSwwKSxzPTA7Zm9yKGU9LTEsbj1hcmd1bWVudHMubGVuZ3RoO2U8bjtlKyspaWYoY2EoaT0tMT09PWU/YTphcmd1bWVudHNbZV0pKXtpZihzKyhvPWN0KGkubGVuZ3RoKSk+aWEpdGhyb3cgVHlwZUVycm9yKGFhKTtmb3Iocj0wO3I8bztyKysscysrKXIgaW4gaSYmb3IodSxzLGlbcl0pfWVsc2V7aWYocz49aWEpdGhyb3cgVHlwZUVycm9yKGFhKTtvcih1LHMrKyxpKX1yZXR1cm4gdS5sZW5ndGg9cyx1fX0pO3ZhciBmYT1idC5mLGxhPXt9LnRvU3RyaW5nLGhhPVwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXSxwYT17ZjpmdW5jdGlvbih0KXtyZXR1cm4gaGEmJlwiW29iamVjdCBXaW5kb3ddXCI9PWxhLmNhbGwodCk/ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBmYSh0KX1jYXRjaCh0KXtyZXR1cm4gaGEuc2xpY2UoKX19KHQpOmZhKHYodCkpfX0sZGE9e2Y6RHR9LHZhPVAuZixnYT1mdW5jdGlvbih0KXt2YXIgZT1ydC5TeW1ib2x8fChydC5TeW1ib2w9e30pO2IoZSx0KXx8dmEoZSx0LHt2YWx1ZTpkYS5mKHQpfSl9LHlhPXVlLmZvckVhY2gsbWE9JChcImhpZGRlblwiKSxiYT1cIlN5bWJvbFwiLHdhPUR0KFwidG9QcmltaXRpdmVcIiksU2E9dHQuc2V0LEVhPXR0LmdldHRlckZvcihiYSkseGE9T2JqZWN0LnByb3RvdHlwZSxBYT1uLlN5bWJvbCxPYT1vdChcIkpTT05cIixcInN0cmluZ2lmeVwiKSxSYT1PLmYsamE9UC5mLFBhPXBhLmYsSWE9cy5mLFRhPXEoXCJzeW1ib2xzXCIpLGthPXEoXCJvcC1zeW1ib2xzXCIpLExhPXEoXCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5XCIpLFVhPXEoXCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5XCIpLE1hPXEoXCJ3a3NcIiksX2E9bi5RT2JqZWN0LE5hPSFfYXx8IV9hLnByb3RvdHlwZXx8IV9hLnByb3RvdHlwZS5maW5kQ2hpbGQsQ2E9aSYmbyhmdW5jdGlvbigpe3JldHVybiA3IT1IdChqYSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGphKHRoaXMsXCJhXCIse3ZhbHVlOjd9KS5hfX0pKS5hfSk/ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVJhKHhhLGUpO24mJmRlbGV0ZSB4YVtlXSxqYSh0LGUsciksbiYmdCE9PXhhJiZqYSh4YSxlLG4pfTpqYSxGYT1mdW5jdGlvbih0LGUpe3ZhciByPVRhW3RdPUh0KEFhLnByb3RvdHlwZSk7cmV0dXJuIFNhKHIse3R5cGU6YmEsdGFnOnQsZGVzY3JpcHRpb246ZX0pLGl8fChyLmRlc2NyaXB0aW9uPWUpLHJ9LEJhPU50P2Z1bmN0aW9uKHQpe3JldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBBYX0sRGE9ZnVuY3Rpb24odCxlLHIpe3Q9PT14YSYmRGEoa2EsZSxyKSxSKHQpO3ZhciBuPXkoZSwhMCk7cmV0dXJuIFIociksYihUYSxuKT8oci5lbnVtZXJhYmxlPyhiKHQsbWEpJiZ0W21hXVtuXSYmKHRbbWFdW25dPSExKSxyPUh0KHIse2VudW1lcmFibGU6YygwLCExKX0pKTooYih0LG1hKXx8amEodCxtYSxjKDEse30pKSx0W21hXVtuXT0hMCksQ2EodCxuLHIpKTpqYSh0LG4scil9LHFhPWZ1bmN0aW9uKHQsZSl7Uih0KTt2YXIgcj12KGUpLG49cXQocikuY29uY2F0KEdhKHIpKTtyZXR1cm4geWEobixmdW5jdGlvbihlKXtpJiYhemEuY2FsbChyLGUpfHxEYSh0LGUscltlXSl9KSx0fSx6YT1mdW5jdGlvbih0KXt2YXIgZT15KHQsITApLHI9SWEuY2FsbCh0aGlzLGUpO3JldHVybiEodGhpcz09PXhhJiZiKFRhLGUpJiYhYihrYSxlKSkmJighKHJ8fCFiKHRoaXMsZSl8fCFiKFRhLGUpfHxiKHRoaXMsbWEpJiZ0aGlzW21hXVtlXSl8fHIpfSxXYT1mdW5jdGlvbih0LGUpe3ZhciByPXYodCksbj15KGUsITApO2lmKHIhPT14YXx8IWIoVGEsbil8fGIoa2Esbikpe3ZhciBvPVJhKHIsbik7cmV0dXJuIW98fCFiKFRhLG4pfHxiKHIsbWEpJiZyW21hXVtuXXx8KG8uZW51bWVyYWJsZT0hMCksb319LEthPWZ1bmN0aW9uKHQpe3ZhciBlPVBhKHYodCkpLHI9W107cmV0dXJuIHlhKGUsZnVuY3Rpb24odCl7YihUYSx0KXx8YihWLHQpfHxyLnB1c2godCl9KSxyfSxHYT1mdW5jdGlvbih0KXt2YXIgZT10PT09eGEscj1QYShlP2thOnYodCkpLG49W107cmV0dXJuIHlhKHIsZnVuY3Rpb24odCl7IWIoVGEsdCl8fGUmJiFiKHhhLHQpfHxuLnB1c2goVGFbdF0pfSksbn07aWYoX3R8fChldCgoQWE9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgQWEpdGhyb3cgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1LKHQpLHI9ZnVuY3Rpb24gdChyKXt0aGlzPT09eGEmJnQuY2FsbChrYSxyKSxiKHRoaXMsbWEpJiZiKHRoaXNbbWFdLGUpJiYodGhpc1ttYV1bZV09ITEpLENhKHRoaXMsZSxjKDEscikpfTtyZXR1cm4gaSYmTmEmJkNhKHhhLGUse2NvbmZpZ3VyYWJsZTohMCxzZXQ6cn0pLEZhKGUsdCl9KS5wcm90b3R5cGUsXCJ0b1N0cmluZ1wiLGZ1bmN0aW9uKCl7cmV0dXJuIEVhKHRoaXMpLnRhZ30pLGV0KEFhLFwid2l0aG91dFNldHRlclwiLGZ1bmN0aW9uKHQpe3JldHVybiBGYShLKHQpLHQpfSkscy5mPXphLFAuZj1EYSxPLmY9V2EsYnQuZj1wYS5mPUthLHd0LmY9R2EsZGEuZj1mdW5jdGlvbih0KXtyZXR1cm4gRmEoRHQodCksdCl9LGkmJihqYShBYS5wcm90b3R5cGUsXCJkZXNjcmlwdGlvblwiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEVhKHRoaXMpLmRlc2NyaXB0aW9ufX0pLGV0KHhhLFwicHJvcGVydHlJc0VudW1lcmFibGVcIix6YSx7dW5zYWZlOiEwfSkpKSxrdCh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOiFfdCxzaGFtOiFfdH0se1N5bWJvbDpBYX0pLHlhKHF0KE1hKSxmdW5jdGlvbih0KXtnYSh0KX0pLGt0KHt0YXJnZXQ6YmEsc3RhdDohMCxmb3JjZWQ6IV90fSx7Zm9yOmZ1bmN0aW9uKHQpe3ZhciBlPVN0cmluZyh0KTtpZihiKExhLGUpKXJldHVybiBMYVtlXTt2YXIgcj1BYShlKTtyZXR1cm4gTGFbZV09cixVYVtyXT1lLHJ9LGtleUZvcjpmdW5jdGlvbih0KXtpZighQmEodCkpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgc3ltYm9sXCIpO2lmKGIoVWEsdCkpcmV0dXJuIFVhW3RdfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtOYT0hMH0sdXNlU2ltcGxlOmZ1bmN0aW9uKCl7TmE9ITF9fSksa3Qoe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITAsZm9yY2VkOiFfdCxzaGFtOiFpfSx7Y3JlYXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/SHQodCk6cWEoSHQodCksZSl9LGRlZmluZVByb3BlcnR5OkRhLGRlZmluZVByb3BlcnRpZXM6cWEsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOldhfSksa3Qoe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITAsZm9yY2VkOiFfdH0se2dldE93blByb3BlcnR5TmFtZXM6S2EsZ2V0T3duUHJvcGVydHlTeW1ib2xzOkdhfSksa3Qoe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITAsZm9yY2VkOm8oZnVuY3Rpb24oKXt3dC5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHd0LmYoTHQodCkpfX0pLE9hKXt2YXIgJGE9IV90fHxvKGZ1bmN0aW9uKCl7dmFyIHQ9QWEoKTtyZXR1cm5cIltudWxsXVwiIT1PYShbdF0pfHxcInt9XCIhPU9hKHthOnR9KXx8XCJ7fVwiIT1PYShPYmplY3QodCkpfSk7a3Qoe3RhcmdldDpcIkpTT05cIixzdGF0OiEwLGZvcmNlZDokYX0se3N0cmluZ2lmeTpmdW5jdGlvbih0LGUscil7Zm9yKHZhciBuLG89W3RdLGk9MTthcmd1bWVudHMubGVuZ3RoPmk7KW8ucHVzaChhcmd1bWVudHNbaSsrXSk7aWYobj1lLChnKGUpfHx2b2lkIDAhPT10KSYmIUJhKHQpKXJldHVybiByZShlKXx8KGU9ZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhQmEoZSkpcmV0dXJuIGV9KSxvWzFdPWUsT2EuYXBwbHkobnVsbCxvKX19KX1BYS5wcm90b3R5cGVbd2FdfHxJKEFhLnByb3RvdHlwZSx3YSxBYS5wcm90b3R5cGUudmFsdWVPZiksX2UoQWEsYmEpLFZbbWFdPSEwLGdhKFwiYXN5bmNJdGVyYXRvclwiKTt2YXIgVmE9UC5mLEhhPW4uU3ltYm9sO2lmKGkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIEhhJiYoIShcImRlc2NyaXB0aW9uXCJpbiBIYS5wcm90b3R5cGUpfHx2b2lkIDAhPT1IYSgpLmRlc2NyaXB0aW9uKSl7dmFyIFhhPXt9LFlhPWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aDwxfHx2b2lkIDA9PT1hcmd1bWVudHNbMF0/dm9pZCAwOlN0cmluZyhhcmd1bWVudHNbMF0pLGU9dGhpcyBpbnN0YW5jZW9mIFlhP25ldyBIYSh0KTp2b2lkIDA9PT10P0hhKCk6SGEodCk7cmV0dXJuXCJcIj09PXQmJihYYVtlXT0hMCksZX07RXQoWWEsSGEpO3ZhciBKYT1ZYS5wcm90b3R5cGU9SGEucHJvdG90eXBlO0phLmNvbnN0cnVjdG9yPVlhO3ZhciBRYT1KYS50b1N0cmluZyxaYT1cIlN5bWJvbCh0ZXN0KVwiPT1TdHJpbmcoSGEoXCJ0ZXN0XCIpKSx0dT0vXlN5bWJvbFxcKCguKilcXClbXildKyQvO1ZhKEphLFwiZGVzY3JpcHRpb25cIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciB0PWcodGhpcyk/dGhpcy52YWx1ZU9mKCk6dGhpcyxlPVFhLmNhbGwodCk7aWYoYihYYSx0KSlyZXR1cm5cIlwiO3ZhciByPVphP2Uuc2xpY2UoNywtMSk6ZS5yZXBsYWNlKHR1LFwiJDFcIik7cmV0dXJuXCJcIj09PXI/dm9pZCAwOnJ9fSksa3Qoe2dsb2JhbDohMCxmb3JjZWQ6ITB9LHtTeW1ib2w6WWF9KX1nYShcImhhc0luc3RhbmNlXCIpLGdhKFwiaXNDb25jYXRTcHJlYWRhYmxlXCIpLGdhKFwiaXRlcmF0b3JcIiksZ2EoXCJtYXRjaFwiKSxnYShcIm1hdGNoQWxsXCIpLGdhKFwicmVwbGFjZVwiKSxnYShcInNlYXJjaFwiKSxnYShcInNwZWNpZXNcIiksZ2EoXCJzcGxpdFwiKSxnYShcInRvUHJpbWl0aXZlXCIpLGdhKFwidG9TdHJpbmdUYWdcIiksZ2EoXCJ1bnNjb3BhYmxlc1wiKSxfZShNYXRoLFwiTWF0aFwiLCEwKSxfZShuLkpTT04sXCJKU09OXCIsITApLGdhKFwiYXN5bmNEaXNwb3NlXCIpLGdhKFwiZGlzcG9zZVwiKSxnYShcIm9ic2VydmFibGVcIiksZ2EoXCJwYXR0ZXJuTWF0Y2hcIiksZ2EoXCJyZXBsYWNlQWxsXCIpLGRhLmYoXCJhc3luY0l0ZXJhdG9yXCIpO3ZhciBldT1PZS5jb2RlQXQ7a3Qoe3RhcmdldDpcIlN0cmluZ1wiLHByb3RvOiEwfSx7Y29kZVBvaW50QXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGV1KHRoaXMsdCl9fSksZWUoXCJTdHJpbmdcIixcImNvZGVQb2ludEF0XCIpO3ZhciBydSxudT1mdW5jdGlvbih0KXtpZihYbyh0KSl0aHJvdyBUeXBlRXJyb3IoXCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnNcIik7cmV0dXJuIHR9LG91PUR0KFwibWF0Y2hcIiksaXU9ZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXtcIi8uL1wiW3RdKGUpfWNhdGNoKHIpe3RyeXtyZXR1cm4gZVtvdV09ITEsXCIvLi9cIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfSxhdT1PLmYsdXU9XCJcIi5lbmRzV2l0aCxzdT1NYXRoLm1pbixjdT1pdShcImVuZHNXaXRoXCIpLGZ1PSEoY3V8fChydT1hdShTdHJpbmcucHJvdG90eXBlLFwiZW5kc1dpdGhcIiksIXJ1fHxydS53cml0YWJsZSkpO2t0KHt0YXJnZXQ6XCJTdHJpbmdcIixwcm90bzohMCxmb3JjZWQ6IWZ1JiYhY3V9LHtlbmRzV2l0aDpmdW5jdGlvbih0KXt2YXIgZT1TdHJpbmcoZCh0aGlzKSk7bnUodCk7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsbj1jdChlLmxlbmd0aCksbz12b2lkIDA9PT1yP246c3UoY3QociksbiksaT1TdHJpbmcodCk7cmV0dXJuIHV1P3V1LmNhbGwoZSxpLG8pOmUuc2xpY2Uoby1pLmxlbmd0aCxvKT09PWl9fSksZWUoXCJTdHJpbmdcIixcImVuZHNXaXRoXCIpO3ZhciBsdT1TdHJpbmcuZnJvbUNoYXJDb2RlLGh1PVN0cmluZy5mcm9tQ29kZVBvaW50O2t0KHt0YXJnZXQ6XCJTdHJpbmdcIixzdGF0OiEwLGZvcmNlZDohIWh1JiYxIT1odS5sZW5ndGh9LHtmcm9tQ29kZVBvaW50OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPVtdLG49YXJndW1lbnRzLmxlbmd0aCxvPTA7bj5vOyl7aWYoZT0rYXJndW1lbnRzW28rK10saHQoZSwxMTE0MTExKSE9PWUpdGhyb3cgUmFuZ2VFcnJvcihlK1wiIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnRcIik7ci5wdXNoKGU8NjU1MzY/bHUoZSk6bHUoNTUyOTYrKChlLT02NTUzNik+PjEwKSxlJTEwMjQrNTYzMjApKX1yZXR1cm4gci5qb2luKFwiXCIpfX0pLGt0KHt0YXJnZXQ6XCJTdHJpbmdcIixwcm90bzohMCxmb3JjZWQ6IWl1KFwiaW5jbHVkZXNcIil9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4hIX5TdHJpbmcoZCh0aGlzKSkuaW5kZXhPZihudSh0KSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksZWUoXCJTdHJpbmdcIixcImluY2x1ZGVzXCIpO3ZhciBwdT1cIlwiLnJlcGVhdHx8ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKGQodGhpcykpLHI9XCJcIixuPXV0KHQpO2lmKG48MHx8SW5maW5pdHk9PW4pdGhyb3cgUmFuZ2VFcnJvcihcIldyb25nIG51bWJlciBvZiByZXBldGl0aW9uc1wiKTtmb3IoO24+MDsobj4+Pj0xKSYmKGUrPWUpKTEmbiYmKHIrPWUpO3JldHVybiByfSxkdT1NYXRoLmNlaWwsdnU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXt2YXIgbyxpLGE9U3RyaW5nKGQoZSkpLHU9YS5sZW5ndGgscz12b2lkIDA9PT1uP1wiIFwiOlN0cmluZyhuKSxjPWN0KHIpO3JldHVybiBjPD11fHxcIlwiPT1zP2E6KChpPXB1LmNhbGwocyxkdSgobz1jLXUpL3MubGVuZ3RoKSkpLmxlbmd0aD5vJiYoaT1pLnNsaWNlKDAsbykpLHQ/YStpOmkrYSl9fSxndT17c3RhcnQ6dnUoITEpLGVuZDp2dSghMCl9LHl1PS9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyggTW9iaWxlXFwvXFx3Kyk/IFNhZmFyaVxcLy8udGVzdChRaSksbXU9Z3Uuc3RhcnQ7a3Qoe3RhcmdldDpcIlN0cmluZ1wiLHByb3RvOiEwLGZvcmNlZDp5dX0se3BhZFN0YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiBtdSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGVlKFwiU3RyaW5nXCIsXCJwYWRTdGFydFwiKTt2YXIgYnU9Z3UuZW5kO2t0KHt0YXJnZXQ6XCJTdHJpbmdcIixwcm90bzohMCxmb3JjZWQ6eXV9LHtwYWRFbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGJ1KHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksZWUoXCJTdHJpbmdcIixcInBhZEVuZFwiKSxrdCh7dGFyZ2V0OlwiU3RyaW5nXCIsc3RhdDohMH0se3JhdzpmdW5jdGlvbih0KXtmb3IodmFyIGU9dih0LnJhdykscj1jdChlLmxlbmd0aCksbj1hcmd1bWVudHMubGVuZ3RoLG89W10saT0wO3I+aTspby5wdXNoKFN0cmluZyhlW2krK10pKSxpPG4mJm8ucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7cmV0dXJuIG8uam9pbihcIlwiKX19KSxrdCh7dGFyZ2V0OlwiU3RyaW5nXCIscHJvdG86ITB9LHtyZXBlYXQ6cHV9KSxlZShcIlN0cmluZ1wiLFwicmVwZWF0XCIpO3ZhciB3dT1PLmYsU3U9XCJcIi5zdGFydHNXaXRoLEV1PU1hdGgubWluLHh1PWl1KFwic3RhcnRzV2l0aFwiKSxBdT0heHUmJiEhZnVuY3Rpb24oKXt2YXIgdD13dShTdHJpbmcucHJvdG90eXBlLFwic3RhcnRzV2l0aFwiKTtyZXR1cm4gdCYmIXQud3JpdGFibGV9KCk7a3Qoe3RhcmdldDpcIlN0cmluZ1wiLHByb3RvOiEwLGZvcmNlZDohQXUmJiF4dX0se3N0YXJ0c1dpdGg6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKGQodGhpcykpO251KHQpO3ZhciByPWN0KEV1KGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLGUubGVuZ3RoKSksbj1TdHJpbmcodCk7cmV0dXJuIFN1P1N1LmNhbGwoZSxuLHIpOmUuc2xpY2UocixyK24ubGVuZ3RoKT09PW59fSksZWUoXCJTdHJpbmdcIixcInN0YXJ0c1dpdGhcIik7dmFyIE91PWZ1bmN0aW9uKHQpe3JldHVybiBvKGZ1bmN0aW9uKCl7cmV0dXJuISFmblt0XSgpfHxcIuKAi8KF4aCOXCIhPVwi4oCLwoXhoI5cIlt0XSgpfHxmblt0XS5uYW1lIT09dH0pfSxSdT12bi5zdGFydCxqdT1PdShcInRyaW1TdGFydFwiKSxQdT1qdT9mdW5jdGlvbigpe3JldHVybiBSdSh0aGlzKX06XCJcIi50cmltU3RhcnQ7a3Qoe3RhcmdldDpcIlN0cmluZ1wiLHByb3RvOiEwLGZvcmNlZDpqdX0se3RyaW1TdGFydDpQdSx0cmltTGVmdDpQdX0pLGVlKFwiU3RyaW5nXCIsXCJ0cmltTGVmdFwiKTt2YXIgSXU9dm4uZW5kLFR1PU91KFwidHJpbUVuZFwiKSxrdT1UdT9mdW5jdGlvbigpe3JldHVybiBJdSh0aGlzKX06XCJcIi50cmltRW5kO2t0KHt0YXJnZXQ6XCJTdHJpbmdcIixwcm90bzohMCxmb3JjZWQ6VHV9LHt0cmltRW5kOmt1LHRyaW1SaWdodDprdX0pLGVlKFwiU3RyaW5nXCIsXCJ0cmltUmlnaHRcIik7dmFyIEx1PUR0KFwiaXRlcmF0b3JcIiksVXU9IW8oZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKFwiYj9hPTEmYj0yJmM9M1wiLFwiaHR0cDovL2FcIiksZT10LnNlYXJjaFBhcmFtcyxyPVwiXCI7cmV0dXJuIHQucGF0aG5hbWU9XCJjJTIwZFwiLGUuZm9yRWFjaChmdW5jdGlvbih0LG4pe2UuZGVsZXRlKFwiYlwiKSxyKz1uK3R9KSwhZS5zb3J0fHxcImh0dHA6Ly9hL2MlMjBkP2E9MSZjPTNcIiE9PXQuaHJlZnx8XCIzXCIhPT1lLmdldChcImNcIil8fFwiYT0xXCIhPT1TdHJpbmcobmV3IFVSTFNlYXJjaFBhcmFtcyhcIj9hPTFcIikpfHwhZVtMdV18fFwiYVwiIT09bmV3IFVSTChcImh0dHBzOi8vYUBiXCIpLnVzZXJuYW1lfHxcImJcIiE9PW5ldyBVUkxTZWFyY2hQYXJhbXMobmV3IFVSTFNlYXJjaFBhcmFtcyhcImE9YlwiKSkuZ2V0KFwiYVwiKXx8XCJ4bi0tZTFheWJjXCIhPT1uZXcgVVJMKFwiaHR0cDovL9GC0LXRgdGCXCIpLmhvc3R8fFwiIyVEMCVCMVwiIT09bmV3IFVSTChcImh0dHA6Ly9hI9CxXCIpLmhhc2h8fFwiYTFjM1wiIT09cnx8XCJ4XCIhPT1uZXcgVVJMKFwiaHR0cDovL3hcIix2b2lkIDApLmhvc3R9KSxNdT1PYmplY3QuYXNzaWduLF91PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxOdT0hTXV8fG8oZnVuY3Rpb24oKXtpZihpJiYxIT09TXUoe2I6MX0sTXUoX3Uoe30sXCJhXCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7X3UodGhpcyxcImJcIix7dmFsdWU6MyxlbnVtZXJhYmxlOiExfSl9fSkse2I6Mn0pKS5iKXJldHVybiEwO3ZhciB0PXt9LGU9e30scj1TeW1ib2woKSxuPVwiYWJjZGVmZ2hpamtsbW5vcHFyc3RcIjtyZXR1cm4gdFtyXT03LG4uc3BsaXQoXCJcIikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXR9KSw3IT1NdSh7fSx0KVtyXXx8cXQoTXUoe30sZSkpLmpvaW4oXCJcIikhPW59KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1MdCh0KSxuPWFyZ3VtZW50cy5sZW5ndGgsbz0xLGE9d3QuZix1PXMuZjtuPm87KWZvcih2YXIgYyxmPXAoYXJndW1lbnRzW28rK10pLGw9YT9xdChmKS5jb25jYXQoYShmKSk6cXQoZiksaD1sLmxlbmd0aCxkPTA7aD5kOyljPWxbZCsrXSxpJiYhdS5jYWxsKGYsYyl8fChyW2NdPWZbY10pO3JldHVybiByfTpNdSxDdT0yMTQ3NDgzNjQ3LEZ1PS9bXlxcMC1cXHUwMDdFXS8sQnU9L1suXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLER1PVwiT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3NcIixxdT1NYXRoLmZsb29yLHp1PVN0cmluZy5mcm9tQ2hhckNvZGUsV3U9ZnVuY3Rpb24odCl7cmV0dXJuIHQrMjIrNzUqKHQ8MjYpfSxLdT1mdW5jdGlvbih0LGUscil7dmFyIG49MDtmb3IodD1yP3F1KHQvNzAwKTp0Pj4xLHQrPXF1KHQvZSk7dD40NTU7bis9MzYpdD1xdSh0LzM1KTtyZXR1cm4gcXUobiszNip0Lyh0KzM4KSl9LEd1PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbj1bXSxvPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47KXt2YXIgbz10LmNoYXJDb2RlQXQocisrKTtpZihvPj01NTI5NiYmbzw9NTYzMTkmJnI8bil7dmFyIGk9dC5jaGFyQ29kZUF0KHIrKyk7NTYzMjA9PSg2NDUxMiZpKT9lLnB1c2goKCgxMDIzJm8pPDwxMCkrKDEwMjMmaSkrNjU1MzYpOihlLnB1c2gobyksci0tKX1lbHNlIGUucHVzaChvKX1yZXR1cm4gZX0odCkpLmxlbmd0aCxpPTEyOCxhPTAsdT03Mjtmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKShyPXRbZV0pPDEyOCYmbi5wdXNoKHp1KHIpKTt2YXIgcz1uLmxlbmd0aCxjPXM7Zm9yKHMmJm4ucHVzaChcIi1cIik7YzxvOyl7dmFyIGY9Q3U7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKykocj10W2VdKT49aSYmcjxmJiYoZj1yKTt2YXIgbD1jKzE7aWYoZi1pPnF1KChDdS1hKS9sKSl0aHJvdyBSYW5nZUVycm9yKER1KTtmb3IoYSs9KGYtaSkqbCxpPWYsZT0wO2U8dC5sZW5ndGg7ZSsrKXtpZigocj10W2VdKTxpJiYrK2E+Q3UpdGhyb3cgUmFuZ2VFcnJvcihEdSk7aWYocj09aSl7Zm9yKHZhciBoPWEscD0zNjs7cCs9MzYpe3ZhciBkPXA8PXU/MTpwPj11KzI2PzI2OnAtdTtpZihoPGQpYnJlYWs7dmFyIHY9aC1kLGc9MzYtZDtuLnB1c2goenUoV3UoZCt2JWcpKSksaD1xdSh2L2cpfW4ucHVzaCh6dShXdShoKSkpLHU9S3UoYSxsLGM9PXMpLGE9MCwrK2N9fSsrYSwrK2l9cmV0dXJuIG4uam9pbihcIlwiKX0sJHU9b3QoXCJmZXRjaFwiKSxWdT1vdChcIkhlYWRlcnNcIiksSHU9RHQoXCJpdGVyYXRvclwiKSxYdT1cIlVSTFNlYXJjaFBhcmFtc1wiLFl1PVwiVVJMU2VhcmNoUGFyYW1zSXRlcmF0b3JcIixKdT10dC5zZXQsUXU9dHQuZ2V0dGVyRm9yKFh1KSxadT10dC5nZXR0ZXJGb3IoWXUpLHRzPS9cXCsvZyxlcz1BcnJheSg0KSxycz1mdW5jdGlvbih0KXtyZXR1cm4gZXNbdC0xXXx8KGVzW3QtMV09UmVnRXhwKFwiKCg/OiVbXFxcXGRhLWZdezJ9KXtcIit0K1wifSlcIixcImdpXCIpKX0sbnM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9Y2F0Y2goZSl7cmV0dXJuIHR9fSxvcz1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UodHMsXCIgXCIpLHI9NDt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaCh0KXtmb3IoO3I7KWU9ZS5yZXBsYWNlKHJzKHItLSksbnMpO3JldHVybiBlfX0saXM9L1shJygpfl18JTIwL2csYXM9e1wiIVwiOlwiJTIxXCIsXCInXCI6XCIlMjdcIixcIihcIjpcIiUyOFwiLFwiKVwiOlwiJTI5XCIsXCJ+XCI6XCIlN0VcIixcIiUyMFwiOlwiK1wifSx1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXNbdF19LHNzPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShpcyx1cyl9LGNzPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIHIsbixvPWUuc3BsaXQoXCImXCIpLGk9MDtpPG8ubGVuZ3RoOykocj1vW2krK10pLmxlbmd0aCYmKG49ci5zcGxpdChcIj1cIiksdC5wdXNoKHtrZXk6b3Mobi5zaGlmdCgpKSx2YWx1ZTpvcyhuLmpvaW4oXCI9XCIpKX0pKX0sZnM9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLGNzKHRoaXMuZW50cmllcyx0KX0sbHM9ZnVuY3Rpb24odCxlKXtpZih0PGUpdGhyb3cgVHlwZUVycm9yKFwiTm90IGVub3VnaCBhcmd1bWVudHNcIil9LGhzPUJlKGZ1bmN0aW9uKHQsZSl7SnUodGhpcyx7dHlwZTpZdSxpdGVyYXRvcjpvbihRdSh0KS5lbnRyaWVzKSxraW5kOmV9KX0sXCJJdGVyYXRvclwiLGZ1bmN0aW9uKCl7dmFyIHQ9WnUodGhpcyksZT10LmtpbmQscj10Lml0ZXJhdG9yLm5leHQoKSxuPXIudmFsdWU7cmV0dXJuIHIuZG9uZXx8KHIudmFsdWU9XCJrZXlzXCI9PT1lP24ua2V5OlwidmFsdWVzXCI9PT1lP24udmFsdWU6W24ua2V5LG4udmFsdWVdKSxyfSkscHM9ZnVuY3Rpb24oKXtfcih0aGlzLHBzLFh1KTt2YXIgdCxlLHIsbixvLGksYSx1LHMsYz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCxmPXRoaXMsbD1bXTtpZihKdShmLHt0eXBlOlh1LGVudHJpZXM6bCx1cGRhdGVVUkw6ZnVuY3Rpb24oKXt9LHVwZGF0ZVNlYXJjaFBhcmFtczpmc30pLHZvaWQgMCE9PWMpaWYoZyhjKSlpZihcImZ1bmN0aW9uXCI9PXR5cGVvZih0PWxyKGMpKSlmb3Iocj0oZT10LmNhbGwoYykpLm5leHQ7IShuPXIuY2FsbChlKSkuZG9uZTspe2lmKChhPShpPShvPW9uKFIobi52YWx1ZSkpKS5uZXh0KS5jYWxsKG8pKS5kb25lfHwodT1pLmNhbGwobykpLmRvbmV8fCFpLmNhbGwobykuZG9uZSl0aHJvdyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBzZXF1ZW5jZSB3aXRoIGxlbmd0aCAyXCIpO2wucHVzaCh7a2V5OmEudmFsdWUrXCJcIix2YWx1ZTp1LnZhbHVlK1wiXCJ9KX1lbHNlIGZvcihzIGluIGMpYihjLHMpJiZsLnB1c2goe2tleTpzLHZhbHVlOmNbc10rXCJcIn0pO2Vsc2UgY3MobCxcInN0cmluZ1wiPT10eXBlb2YgYz9cIj9cIj09PWMuY2hhckF0KDApP2Muc2xpY2UoMSk6YzpjK1wiXCIpfSxkcz1wcy5wcm90b3R5cGU7RnIoZHMse2FwcGVuZDpmdW5jdGlvbih0LGUpe2xzKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIHI9UXUodGhpcyk7ci5lbnRyaWVzLnB1c2goe2tleTp0K1wiXCIsdmFsdWU6ZStcIlwifSksci51cGRhdGVVUkwoKX0sZGVsZXRlOmZ1bmN0aW9uKHQpe2xzKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPVF1KHRoaXMpLHI9ZS5lbnRyaWVzLG49dCtcIlwiLG89MDtvPHIubGVuZ3RoOylyW29dLmtleT09PW4/ci5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe2xzKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPVF1KHRoaXMpLmVudHJpZXMscj10K1wiXCIsbj0wO248ZS5sZW5ndGg7bisrKWlmKGVbbl0ua2V5PT09cilyZXR1cm4gZVtuXS52YWx1ZTtyZXR1cm4gbnVsbH0sZ2V0QWxsOmZ1bmN0aW9uKHQpe2xzKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPVF1KHRoaXMpLmVudHJpZXMscj10K1wiXCIsbj1bXSxvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5rZXk9PT1yJiZuLnB1c2goZVtvXS52YWx1ZSk7cmV0dXJuIG59LGhhczpmdW5jdGlvbih0KXtscyhhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1RdSh0aGlzKS5lbnRyaWVzLHI9dCtcIlwiLG49MDtuPGUubGVuZ3RoOylpZihlW24rK10ua2V5PT09cilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7bHMoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIHIsbj1RdSh0aGlzKSxvPW4uZW50cmllcyxpPSExLGE9dCtcIlwiLHU9ZStcIlwiLHM9MDtzPG8ubGVuZ3RoO3MrKykocj1vW3NdKS5rZXk9PT1hJiYoaT9vLnNwbGljZShzLS0sMSk6KGk9ITAsci52YWx1ZT11KSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTp1fSksbi51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUscixuPVF1KHRoaXMpLG89bi5lbnRyaWVzLGk9by5zbGljZSgpO2ZvcihvLmxlbmd0aD0wLHI9MDtyPGkubGVuZ3RoO3IrKyl7Zm9yKHQ9aVtyXSxlPTA7ZTxyO2UrKylpZihvW2VdLmtleT50LmtleSl7by5zcGxpY2UoZSwwLHQpO2JyZWFrfWU9PT1yJiZvLnB1c2godCl9bi51cGRhdGVVUkwoKX0sZm9yRWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUscj1RdSh0aGlzKS5lbnRyaWVzLG49WnQodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxyLmxlbmd0aDspbigoZT1yW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBocyh0aGlzLFwia2V5c1wiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBocyh0aGlzLFwidmFsdWVzXCIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBocyh0aGlzLFwiZW50cmllc1wiKX19LHtlbnVtZXJhYmxlOiEwfSksZXQoZHMsSHUsZHMuZW50cmllcyksZXQoZHMsXCJ0b1N0cmluZ1wiLGZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9UXUodGhpcykuZW50cmllcyxyPVtdLG49MDtuPGUubGVuZ3RoOyl0PWVbbisrXSxyLnB1c2goc3ModC5rZXkpK1wiPVwiK3NzKHQudmFsdWUpKTtyZXR1cm4gci5qb2luKFwiJlwiKX0se2VudW1lcmFibGU6ITB9KSxfZShwcyxYdSksa3Qoe2dsb2JhbDohMCxmb3JjZWQ6IVV1fSx7VVJMU2VhcmNoUGFyYW1zOnBzfSksVXV8fFwiZnVuY3Rpb25cIiE9dHlwZW9mICR1fHxcImZ1bmN0aW9uXCIhPXR5cGVvZiBWdXx8a3Qoe2dsb2JhbDohMCxlbnVtZXJhYmxlOiEwLGZvcmNlZDohMH0se2ZldGNoOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixvPVt0XTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xJiYoZyhlPWFyZ3VtZW50c1sxXSkmJmNyKHI9ZS5ib2R5KT09PVh1JiYoKG49ZS5oZWFkZXJzP25ldyBWdShlLmhlYWRlcnMpOm5ldyBWdSkuaGFzKFwiY29udGVudC10eXBlXCIpfHxuLnNldChcImNvbnRlbnQtdHlwZVwiLFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLThcIiksZT1IdChlLHtib2R5OmMoMCxTdHJpbmcocikpLGhlYWRlcnM6YygwLG4pfSkpLG8ucHVzaChlKSksJHUuYXBwbHkodGhpcyxvKX19KTt2YXIgdnMsZ3M9e1VSTFNlYXJjaFBhcmFtczpwcyxnZXRTdGF0ZTpRdX0seXM9T2UuY29kZUF0LG1zPW4uVVJMLGJzPWdzLlVSTFNlYXJjaFBhcmFtcyx3cz1ncy5nZXRTdGF0ZSxTcz10dC5zZXQsRXM9dHQuZ2V0dGVyRm9yKFwiVVJMXCIpLHhzPU1hdGguZmxvb3IsQXM9TWF0aC5wb3csT3M9XCJJbnZhbGlkIHNjaGVtZVwiLFJzPVwiSW52YWxpZCBob3N0XCIsanM9XCJJbnZhbGlkIHBvcnRcIixQcz0vW0EtWmEtel0vLElzPS9bXFxkKy0uQS1aYS16XS8sVHM9L1xcZC8sa3M9L14oMHh8MFgpLyxMcz0vXlswLTddKyQvLFVzPS9eXFxkKyQvLE1zPS9eW1xcZEEtRmEtZl0rJC8sX3M9L1tcXHUwMDAwXFx1MDAwOVxcdTAwMEFcXHUwMDBEICMlLzo/QFtcXFxcXV0vLE5zPS9bXFx1MDAwMFxcdTAwMDlcXHUwMDBBXFx1MDAwRCAjLzo/QFtcXFxcXV0vLENzPS9eW1xcdTAwMDAtXFx1MDAxRiBdK3xbXFx1MDAwMC1cXHUwMDFGIF0rJC9nLEZzPS9bXFx1MDAwOVxcdTAwMEFcXHUwMDBEXS9nLEJzPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixvO2lmKFwiW1wiPT1lLmNoYXJBdCgwKSl7aWYoXCJdXCIhPWUuY2hhckF0KGUubGVuZ3RoLTEpKXJldHVybiBScztpZighKHI9cXMoZS5zbGljZSgxLC0xKSkpKXJldHVybiBSczt0Lmhvc3Q9cn1lbHNlIGlmKFhzKHQpKXtpZihlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbj1bXSxvPXQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKEJ1LFwiLlwiKS5zcGxpdChcIi5cIik7Zm9yKGU9MDtlPG8ubGVuZ3RoO2UrKyluLnB1c2goRnUudGVzdChyPW9bZV0pP1wieG4tLVwiK0d1KHIpOnIpO3JldHVybiBuLmpvaW4oXCIuXCIpfShlKSxfcy50ZXN0KGUpKXJldHVybiBScztpZihudWxsPT09KHI9RHMoZSkpKXJldHVybiBSczt0Lmhvc3Q9cn1lbHNle2lmKE5zLnRlc3QoZSkpcmV0dXJuIFJzO2ZvcihyPVwiXCIsbj1ocihlKSxvPTA7bzxuLmxlbmd0aDtvKyspcis9VnMobltvXSxXcyk7dC5ob3N0PXJ9fSxEcz1mdW5jdGlvbih0KXt2YXIgZSxyLG4sbyxpLGEsdSxzPXQuc3BsaXQoXCIuXCIpO2lmKHMubGVuZ3RoJiZcIlwiPT1zW3MubGVuZ3RoLTFdJiZzLnBvcCgpLChlPXMubGVuZ3RoKT40KXJldHVybiB0O2ZvcihyPVtdLG49MDtuPGU7bisrKXtpZihcIlwiPT0obz1zW25dKSlyZXR1cm4gdDtpZihpPTEwLG8ubGVuZ3RoPjEmJlwiMFwiPT1vLmNoYXJBdCgwKSYmKGk9a3MudGVzdChvKT8xNjo4LG89by5zbGljZSg4PT1pPzE6MikpLFwiXCI9PT1vKWE9MDtlbHNle2lmKCEoMTA9PWk/VXM6OD09aT9MczpNcykudGVzdChvKSlyZXR1cm4gdDthPXBhcnNlSW50KG8saSl9ci5wdXNoKGEpfWZvcihuPTA7bjxlO24rKylpZihhPXJbbl0sbj09ZS0xKXtpZihhPj1BcygyNTYsNS1lKSlyZXR1cm4gbnVsbH1lbHNlIGlmKGE+MjU1KXJldHVybiBudWxsO2Zvcih1PXIucG9wKCksbj0wO248ci5sZW5ndGg7bisrKXUrPXJbbl0qQXMoMjU2LDMtbik7cmV0dXJuIHV9LHFzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixvLGksYSx1LHM9WzAsMCwwLDAsMCwwLDAsMF0sYz0wLGY9bnVsbCxsPTAsaD1mdW5jdGlvbigpe3JldHVybiB0LmNoYXJBdChsKX07aWYoXCI6XCI9PWgoKSl7aWYoXCI6XCIhPXQuY2hhckF0KDEpKXJldHVybjtsKz0yLGY9KytjfWZvcig7aCgpOyl7aWYoOD09YylyZXR1cm47aWYoXCI6XCIhPWgoKSl7Zm9yKGU9cj0wO3I8NCYmTXMudGVzdChoKCkpOyllPTE2KmUrcGFyc2VJbnQoaCgpLDE2KSxsKysscisrO2lmKFwiLlwiPT1oKCkpe2lmKDA9PXIpcmV0dXJuO2lmKGwtPXIsYz42KXJldHVybjtmb3Iobj0wO2goKTspe2lmKG89bnVsbCxuPjApe2lmKCEoXCIuXCI9PWgoKSYmbjw0KSlyZXR1cm47bCsrfWlmKCFUcy50ZXN0KGgoKSkpcmV0dXJuO2Zvcig7VHMudGVzdChoKCkpOyl7aWYoaT1wYXJzZUludChoKCksMTApLG51bGw9PT1vKW89aTtlbHNle2lmKDA9PW8pcmV0dXJuO289MTAqbytpfWlmKG8+MjU1KXJldHVybjtsKyt9c1tjXT0yNTYqc1tjXStvLDIhPSsrbiYmNCE9bnx8YysrfWlmKDQhPW4pcmV0dXJuO2JyZWFrfWlmKFwiOlwiPT1oKCkpe2lmKGwrKywhaCgpKXJldHVybn1lbHNlIGlmKGgoKSlyZXR1cm47c1tjKytdPWV9ZWxzZXtpZihudWxsIT09ZilyZXR1cm47bCsrLGY9KytjfX1pZihudWxsIT09Zilmb3IoYT1jLWYsYz03OzAhPWMmJmE+MDspdT1zW2NdLHNbYy0tXT1zW2YrYS0xXSxzW2YrLS1hXT11O2Vsc2UgaWYoOCE9YylyZXR1cm47cmV0dXJuIHN9LHpzPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixvO2lmKFwibnVtYmVyXCI9PXR5cGVvZiB0KXtmb3IoZT1bXSxyPTA7cjw0O3IrKyllLnVuc2hpZnQodCUyNTYpLHQ9eHModC8yNTYpO3JldHVybiBlLmpvaW4oXCIuXCIpfWlmKFwib2JqZWN0XCI9PXR5cGVvZiB0KXtmb3IoZT1cIlwiLG49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW51bGwscj0xLG49bnVsbCxvPTAsaT0wO2k8ODtpKyspMCE9PXRbaV0/KG8+ciYmKGU9bixyPW8pLG49bnVsbCxvPTApOihudWxsPT09biYmKG49aSksKytvKTtyZXR1cm4gbz5yJiYoZT1uLHI9byksZX0odCkscj0wO3I8ODtyKyspbyYmMD09PXRbcl18fChvJiYobz0hMSksbj09PXI/KGUrPXI/XCI6XCI6XCI6OlwiLG89ITApOihlKz10W3JdLnRvU3RyaW5nKDE2KSxyPDcmJihlKz1cIjpcIikpKTtyZXR1cm5cIltcIitlK1wiXVwifXJldHVybiB0fSxXcz17fSxLcz1OdSh7fSxXcyx7XCIgXCI6MSwnXCInOjEsXCI8XCI6MSxcIj5cIjoxLFwiYFwiOjF9KSxHcz1OdSh7fSxLcyx7XCIjXCI6MSxcIj9cIjoxLFwie1wiOjEsXCJ9XCI6MX0pLCRzPU51KHt9LEdzLHtcIi9cIjoxLFwiOlwiOjEsXCI7XCI6MSxcIj1cIjoxLFwiQFwiOjEsXCJbXCI6MSxcIlxcXFxcIjoxLFwiXVwiOjEsXCJeXCI6MSxcInxcIjoxfSksVnM9ZnVuY3Rpb24odCxlKXt2YXIgcj15cyh0LDApO3JldHVybiByPjMyJiZyPDEyNyYmIWIoZSx0KT90OmVuY29kZVVSSUNvbXBvbmVudCh0KX0sSHM9e2Z0cDoyMSxmaWxlOm51bGwsaHR0cDo4MCxodHRwczo0NDMsd3M6ODAsd3NzOjQ0M30sWHM9ZnVuY3Rpb24odCl7cmV0dXJuIGIoSHMsdC5zY2hlbWUpfSxZcz1mdW5jdGlvbih0KXtyZXR1cm5cIlwiIT10LnVzZXJuYW1lfHxcIlwiIT10LnBhc3N3b3JkfSxKcz1mdW5jdGlvbih0KXtyZXR1cm4hdC5ob3N0fHx0LmNhbm5vdEJlQUJhc2VVUkx8fFwiZmlsZVwiPT10LnNjaGVtZX0sUXM9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gMj09dC5sZW5ndGgmJlBzLnRlc3QodC5jaGFyQXQoMCkpJiYoXCI6XCI9PShyPXQuY2hhckF0KDEpKXx8IWUmJlwifFwiPT1yKX0sWnM9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHQubGVuZ3RoPjEmJlFzKHQuc2xpY2UoMCwyKSkmJigyPT10Lmxlbmd0aHx8XCIvXCI9PT0oZT10LmNoYXJBdCgyKSl8fFwiXFxcXFwiPT09ZXx8XCI/XCI9PT1lfHxcIiNcIj09PWUpfSx0Yz1mdW5jdGlvbih0KXt2YXIgZT10LnBhdGgscj1lLmxlbmd0aDshcnx8XCJmaWxlXCI9PXQuc2NoZW1lJiYxPT1yJiZRcyhlWzBdLCEwKXx8ZS5wb3AoKX0sZWM9ZnVuY3Rpb24odCl7cmV0dXJuXCIuXCI9PT10fHxcIiUyZVwiPT09dC50b0xvd2VyQ2FzZSgpfSxyYz17fSxuYz17fSxvYz17fSxpYz17fSxhYz17fSx1Yz17fSxzYz17fSxjYz17fSxmYz17fSxsYz17fSxoYz17fSxwYz17fSxkYz17fSx2Yz17fSxnYz17fSx5Yz17fSxtYz17fSxiYz17fSx3Yz17fSxTYz17fSxFYz17fSx4Yz1mdW5jdGlvbih0LGUscixuKXt2YXIgbyxpLGEsdSxzLGM9cnx8cmMsZj0wLGw9XCJcIixoPSExLHA9ITEsZD0hMTtmb3Iocnx8KHQuc2NoZW1lPVwiXCIsdC51c2VybmFtZT1cIlwiLHQucGFzc3dvcmQ9XCJcIix0Lmhvc3Q9bnVsbCx0LnBvcnQ9bnVsbCx0LnBhdGg9W10sdC5xdWVyeT1udWxsLHQuZnJhZ21lbnQ9bnVsbCx0LmNhbm5vdEJlQUJhc2VVUkw9ITEsZT1lLnJlcGxhY2UoQ3MsXCJcIikpLGU9ZS5yZXBsYWNlKEZzLFwiXCIpLG89aHIoZSk7Zjw9by5sZW5ndGg7KXtzd2l0Y2goaT1vW2ZdLGMpe2Nhc2UgcmM6aWYoIWl8fCFQcy50ZXN0KGkpKXtpZihyKXJldHVybiBPcztjPW9jO2NvbnRpbnVlfWwrPWkudG9Mb3dlckNhc2UoKSxjPW5jO2JyZWFrO2Nhc2UgbmM6aWYoaSYmKElzLnRlc3QoaSl8fFwiK1wiPT1pfHxcIi1cIj09aXx8XCIuXCI9PWkpKWwrPWkudG9Mb3dlckNhc2UoKTtlbHNle2lmKFwiOlwiIT1pKXtpZihyKXJldHVybiBPcztsPVwiXCIsYz1vYyxmPTA7Y29udGludWV9aWYociYmKFhzKHQpIT1iKEhzLGwpfHxcImZpbGVcIj09bCYmKFlzKHQpfHxudWxsIT09dC5wb3J0KXx8XCJmaWxlXCI9PXQuc2NoZW1lJiYhdC5ob3N0KSlyZXR1cm47aWYodC5zY2hlbWU9bCxyKXJldHVybiB2b2lkKFhzKHQpJiZIc1t0LnNjaGVtZV09PXQucG9ydCYmKHQucG9ydD1udWxsKSk7bD1cIlwiLFwiZmlsZVwiPT10LnNjaGVtZT9jPXZjOlhzKHQpJiZuJiZuLnNjaGVtZT09dC5zY2hlbWU/Yz1pYzpYcyh0KT9jPWNjOlwiL1wiPT1vW2YrMV0/KGM9YWMsZisrKToodC5jYW5ub3RCZUFCYXNlVVJMPSEwLHQucGF0aC5wdXNoKFwiXCIpLGM9d2MpfWJyZWFrO2Nhc2Ugb2M6aWYoIW58fG4uY2Fubm90QmVBQmFzZVVSTCYmXCIjXCIhPWkpcmV0dXJuIE9zO2lmKG4uY2Fubm90QmVBQmFzZVVSTCYmXCIjXCI9PWkpe3Quc2NoZW1lPW4uc2NoZW1lLHQucGF0aD1uLnBhdGguc2xpY2UoKSx0LnF1ZXJ5PW4ucXVlcnksdC5mcmFnbWVudD1cIlwiLHQuY2Fubm90QmVBQmFzZVVSTD0hMCxjPUVjO2JyZWFrfWM9XCJmaWxlXCI9PW4uc2NoZW1lP3ZjOnVjO2NvbnRpbnVlO2Nhc2UgaWM6aWYoXCIvXCIhPWl8fFwiL1wiIT1vW2YrMV0pe2M9dWM7Y29udGludWV9Yz1mYyxmKys7YnJlYWs7Y2FzZSBhYzppZihcIi9cIj09aSl7Yz1sYzticmVha31jPWJjO2NvbnRpbnVlO2Nhc2UgdWM6aWYodC5zY2hlbWU9bi5zY2hlbWUsaT09dnMpdC51c2VybmFtZT1uLnVzZXJuYW1lLHQucGFzc3dvcmQ9bi5wYXNzd29yZCx0Lmhvc3Q9bi5ob3N0LHQucG9ydD1uLnBvcnQsdC5wYXRoPW4ucGF0aC5zbGljZSgpLHQucXVlcnk9bi5xdWVyeTtlbHNlIGlmKFwiL1wiPT1pfHxcIlxcXFxcIj09aSYmWHModCkpYz1zYztlbHNlIGlmKFwiP1wiPT1pKXQudXNlcm5hbWU9bi51c2VybmFtZSx0LnBhc3N3b3JkPW4ucGFzc3dvcmQsdC5ob3N0PW4uaG9zdCx0LnBvcnQ9bi5wb3J0LHQucGF0aD1uLnBhdGguc2xpY2UoKSx0LnF1ZXJ5PVwiXCIsYz1TYztlbHNle2lmKFwiI1wiIT1pKXt0LnVzZXJuYW1lPW4udXNlcm5hbWUsdC5wYXNzd29yZD1uLnBhc3N3b3JkLHQuaG9zdD1uLmhvc3QsdC5wb3J0PW4ucG9ydCx0LnBhdGg9bi5wYXRoLnNsaWNlKCksdC5wYXRoLnBvcCgpLGM9YmM7Y29udGludWV9dC51c2VybmFtZT1uLnVzZXJuYW1lLHQucGFzc3dvcmQ9bi5wYXNzd29yZCx0Lmhvc3Q9bi5ob3N0LHQucG9ydD1uLnBvcnQsdC5wYXRoPW4ucGF0aC5zbGljZSgpLHQucXVlcnk9bi5xdWVyeSx0LmZyYWdtZW50PVwiXCIsYz1FY31icmVhaztjYXNlIHNjOmlmKCFYcyh0KXx8XCIvXCIhPWkmJlwiXFxcXFwiIT1pKXtpZihcIi9cIiE9aSl7dC51c2VybmFtZT1uLnVzZXJuYW1lLHQucGFzc3dvcmQ9bi5wYXNzd29yZCx0Lmhvc3Q9bi5ob3N0LHQucG9ydD1uLnBvcnQsYz1iYztjb250aW51ZX1jPWxjfWVsc2UgYz1mYzticmVhaztjYXNlIGNjOmlmKGM9ZmMsXCIvXCIhPWl8fFwiL1wiIT1sLmNoYXJBdChmKzEpKWNvbnRpbnVlO2YrKzticmVhaztjYXNlIGZjOmlmKFwiL1wiIT1pJiZcIlxcXFxcIiE9aSl7Yz1sYztjb250aW51ZX1icmVhaztjYXNlIGxjOmlmKFwiQFwiPT1pKXtoJiYobD1cIiU0MFwiK2wpLGg9ITAsYT1ocihsKTtmb3IodmFyIHY9MDt2PGEubGVuZ3RoO3YrKyl7dmFyIGc9YVt2XTtpZihcIjpcIiE9Z3x8ZCl7dmFyIHk9VnMoZywkcyk7ZD90LnBhc3N3b3JkKz15OnQudXNlcm5hbWUrPXl9ZWxzZSBkPSEwfWw9XCJcIn1lbHNlIGlmKGk9PXZzfHxcIi9cIj09aXx8XCI/XCI9PWl8fFwiI1wiPT1pfHxcIlxcXFxcIj09aSYmWHModCkpe2lmKGgmJlwiXCI9PWwpcmV0dXJuXCJJbnZhbGlkIGF1dGhvcml0eVwiO2YtPWhyKGwpLmxlbmd0aCsxLGw9XCJcIixjPWhjfWVsc2UgbCs9aTticmVhaztjYXNlIGhjOmNhc2UgcGM6aWYociYmXCJmaWxlXCI9PXQuc2NoZW1lKXtjPXljO2NvbnRpbnVlfWlmKFwiOlwiIT1pfHxwKXtpZihpPT12c3x8XCIvXCI9PWl8fFwiP1wiPT1pfHxcIiNcIj09aXx8XCJcXFxcXCI9PWkmJlhzKHQpKXtpZihYcyh0KSYmXCJcIj09bClyZXR1cm4gUnM7aWYociYmXCJcIj09bCYmKFlzKHQpfHxudWxsIT09dC5wb3J0KSlyZXR1cm47aWYodT1Ccyh0LGwpKXJldHVybiB1O2lmKGw9XCJcIixjPW1jLHIpcmV0dXJuO2NvbnRpbnVlfVwiW1wiPT1pP3A9ITA6XCJdXCI9PWkmJihwPSExKSxsKz1pfWVsc2V7aWYoXCJcIj09bClyZXR1cm4gUnM7aWYodT1Ccyh0LGwpKXJldHVybiB1O2lmKGw9XCJcIixjPWRjLHI9PXBjKXJldHVybn1icmVhaztjYXNlIGRjOmlmKCFUcy50ZXN0KGkpKXtpZihpPT12c3x8XCIvXCI9PWl8fFwiP1wiPT1pfHxcIiNcIj09aXx8XCJcXFxcXCI9PWkmJlhzKHQpfHxyKXtpZihcIlwiIT1sKXt2YXIgbT1wYXJzZUludChsLDEwKTtpZihtPjY1NTM1KXJldHVybiBqczt0LnBvcnQ9WHModCkmJm09PT1Ic1t0LnNjaGVtZV0/bnVsbDptLGw9XCJcIn1pZihyKXJldHVybjtjPW1jO2NvbnRpbnVlfXJldHVybiBqc31sKz1pO2JyZWFrO2Nhc2UgdmM6aWYodC5zY2hlbWU9XCJmaWxlXCIsXCIvXCI9PWl8fFwiXFxcXFwiPT1pKWM9Z2M7ZWxzZXtpZighbnx8XCJmaWxlXCIhPW4uc2NoZW1lKXtjPWJjO2NvbnRpbnVlfWlmKGk9PXZzKXQuaG9zdD1uLmhvc3QsdC5wYXRoPW4ucGF0aC5zbGljZSgpLHQucXVlcnk9bi5xdWVyeTtlbHNlIGlmKFwiP1wiPT1pKXQuaG9zdD1uLmhvc3QsdC5wYXRoPW4ucGF0aC5zbGljZSgpLHQucXVlcnk9XCJcIixjPVNjO2Vsc2V7aWYoXCIjXCIhPWkpe1pzKG8uc2xpY2UoZikuam9pbihcIlwiKSl8fCh0Lmhvc3Q9bi5ob3N0LHQucGF0aD1uLnBhdGguc2xpY2UoKSx0Yyh0KSksYz1iYztjb250aW51ZX10Lmhvc3Q9bi5ob3N0LHQucGF0aD1uLnBhdGguc2xpY2UoKSx0LnF1ZXJ5PW4ucXVlcnksdC5mcmFnbWVudD1cIlwiLGM9RWN9fWJyZWFrO2Nhc2UgZ2M6aWYoXCIvXCI9PWl8fFwiXFxcXFwiPT1pKXtjPXljO2JyZWFrfW4mJlwiZmlsZVwiPT1uLnNjaGVtZSYmIVpzKG8uc2xpY2UoZikuam9pbihcIlwiKSkmJihRcyhuLnBhdGhbMF0sITApP3QucGF0aC5wdXNoKG4ucGF0aFswXSk6dC5ob3N0PW4uaG9zdCksYz1iYztjb250aW51ZTtjYXNlIHljOmlmKGk9PXZzfHxcIi9cIj09aXx8XCJcXFxcXCI9PWl8fFwiP1wiPT1pfHxcIiNcIj09aSl7aWYoIXImJlFzKGwpKWM9YmM7ZWxzZSBpZihcIlwiPT1sKXtpZih0Lmhvc3Q9XCJcIixyKXJldHVybjtjPW1jfWVsc2V7aWYodT1Ccyh0LGwpKXJldHVybiB1O2lmKFwibG9jYWxob3N0XCI9PXQuaG9zdCYmKHQuaG9zdD1cIlwiKSxyKXJldHVybjtsPVwiXCIsYz1tY31jb250aW51ZX1sKz1pO2JyZWFrO2Nhc2UgbWM6aWYoWHModCkpe2lmKGM9YmMsXCIvXCIhPWkmJlwiXFxcXFwiIT1pKWNvbnRpbnVlfWVsc2UgaWYocnx8XCI/XCIhPWkpaWYocnx8XCIjXCIhPWkpe2lmKGkhPXZzJiYoYz1iYyxcIi9cIiE9aSkpY29udGludWV9ZWxzZSB0LmZyYWdtZW50PVwiXCIsYz1FYztlbHNlIHQucXVlcnk9XCJcIixjPVNjO2JyZWFrO2Nhc2UgYmM6aWYoaT09dnN8fFwiL1wiPT1pfHxcIlxcXFxcIj09aSYmWHModCl8fCFyJiYoXCI/XCI9PWl8fFwiI1wiPT1pKSl7aWYoXCIuLlwiPT09KHM9KHM9bCkudG9Mb3dlckNhc2UoKSl8fFwiJTJlLlwiPT09c3x8XCIuJTJlXCI9PT1zfHxcIiUyZSUyZVwiPT09cz8odGModCksXCIvXCI9PWl8fFwiXFxcXFwiPT1pJiZYcyh0KXx8dC5wYXRoLnB1c2goXCJcIikpOmVjKGwpP1wiL1wiPT1pfHxcIlxcXFxcIj09aSYmWHModCl8fHQucGF0aC5wdXNoKFwiXCIpOihcImZpbGVcIj09dC5zY2hlbWUmJiF0LnBhdGgubGVuZ3RoJiZRcyhsKSYmKHQuaG9zdCYmKHQuaG9zdD1cIlwiKSxsPWwuY2hhckF0KDApK1wiOlwiKSx0LnBhdGgucHVzaChsKSksbD1cIlwiLFwiZmlsZVwiPT10LnNjaGVtZSYmKGk9PXZzfHxcIj9cIj09aXx8XCIjXCI9PWkpKWZvcig7dC5wYXRoLmxlbmd0aD4xJiZcIlwiPT09dC5wYXRoWzBdOyl0LnBhdGguc2hpZnQoKTtcIj9cIj09aT8odC5xdWVyeT1cIlwiLGM9U2MpOlwiI1wiPT1pJiYodC5mcmFnbWVudD1cIlwiLGM9RWMpfWVsc2UgbCs9VnMoaSxHcyk7YnJlYWs7Y2FzZSB3YzpcIj9cIj09aT8odC5xdWVyeT1cIlwiLGM9U2MpOlwiI1wiPT1pPyh0LmZyYWdtZW50PVwiXCIsYz1FYyk6aSE9dnMmJih0LnBhdGhbMF0rPVZzKGksV3MpKTticmVhaztjYXNlIFNjOnJ8fFwiI1wiIT1pP2khPXZzJiYoXCInXCI9PWkmJlhzKHQpP3QucXVlcnkrPVwiJTI3XCI6dC5xdWVyeSs9XCIjXCI9PWk/XCIlMjNcIjpWcyhpLFdzKSk6KHQuZnJhZ21lbnQ9XCJcIixjPUVjKTticmVhaztjYXNlIEVjOmkhPXZzJiYodC5mcmFnbWVudCs9VnMoaSxLcykpfWYrK319LEFjPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbj1fcih0aGlzLEFjLFwiVVJMXCIpLG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsYT1TdHJpbmcodCksdT1TcyhuLHt0eXBlOlwiVVJMXCJ9KTtpZih2b2lkIDAhPT1vKWlmKG8gaW5zdGFuY2VvZiBBYyllPUVzKG8pO2Vsc2UgaWYocj14YyhlPXt9LFN0cmluZyhvKSkpdGhyb3cgVHlwZUVycm9yKHIpO2lmKHI9eGModSxhLG51bGwsZSkpdGhyb3cgVHlwZUVycm9yKHIpO3ZhciBzPXUuc2VhcmNoUGFyYW1zPW5ldyBicyxjPXdzKHMpO2MudXBkYXRlU2VhcmNoUGFyYW1zKHUucXVlcnkpLGMudXBkYXRlVVJMPWZ1bmN0aW9uKCl7dS5xdWVyeT1TdHJpbmcocyl8fG51bGx9LGl8fChuLmhyZWY9UmMuY2FsbChuKSxuLm9yaWdpbj1qYy5jYWxsKG4pLG4ucHJvdG9jb2w9UGMuY2FsbChuKSxuLnVzZXJuYW1lPUljLmNhbGwobiksbi5wYXNzd29yZD1UYy5jYWxsKG4pLG4uaG9zdD1rYy5jYWxsKG4pLG4uaG9zdG5hbWU9TGMuY2FsbChuKSxuLnBvcnQ9VWMuY2FsbChuKSxuLnBhdGhuYW1lPU1jLmNhbGwobiksbi5zZWFyY2g9X2MuY2FsbChuKSxuLnNlYXJjaFBhcmFtcz1OYy5jYWxsKG4pLG4uaGFzaD1DYy5jYWxsKG4pKX0sT2M9QWMucHJvdG90eXBlLFJjPWZ1bmN0aW9uKCl7dmFyIHQ9RXModGhpcyksZT10LnNjaGVtZSxyPXQudXNlcm5hbWUsbj10LnBhc3N3b3JkLG89dC5ob3N0LGk9dC5wb3J0LGE9dC5wYXRoLHU9dC5xdWVyeSxzPXQuZnJhZ21lbnQsYz1lK1wiOlwiO3JldHVybiBudWxsIT09bz8oYys9XCIvL1wiLFlzKHQpJiYoYys9cisobj9cIjpcIituOlwiXCIpK1wiQFwiKSxjKz16cyhvKSxudWxsIT09aSYmKGMrPVwiOlwiK2kpKTpcImZpbGVcIj09ZSYmKGMrPVwiLy9cIiksYys9dC5jYW5ub3RCZUFCYXNlVVJMP2FbMF06YS5sZW5ndGg/XCIvXCIrYS5qb2luKFwiL1wiKTpcIlwiLG51bGwhPT11JiYoYys9XCI/XCIrdSksbnVsbCE9PXMmJihjKz1cIiNcIitzKSxjfSxqYz1mdW5jdGlvbigpe3ZhciB0PUVzKHRoaXMpLGU9dC5zY2hlbWUscj10LnBvcnQ7aWYoXCJibG9iXCI9PWUpdHJ5e3JldHVybiBuZXcgVVJMKGUucGF0aFswXSkub3JpZ2lufWNhdGNoKHQpe3JldHVyblwibnVsbFwifXJldHVyblwiZmlsZVwiIT1lJiZYcyh0KT9lK1wiOi8vXCIrenModC5ob3N0KSsobnVsbCE9PXI/XCI6XCIrcjpcIlwiKTpcIm51bGxcIn0sUGM9ZnVuY3Rpb24oKXtyZXR1cm4gRXModGhpcykuc2NoZW1lK1wiOlwifSxJYz1mdW5jdGlvbigpe3JldHVybiBFcyh0aGlzKS51c2VybmFtZX0sVGM9ZnVuY3Rpb24oKXtyZXR1cm4gRXModGhpcykucGFzc3dvcmR9LGtjPWZ1bmN0aW9uKCl7dmFyIHQ9RXModGhpcyksZT10Lmhvc3Qscj10LnBvcnQ7cmV0dXJuIG51bGw9PT1lP1wiXCI6bnVsbD09PXI/enMoZSk6enMoZSkrXCI6XCIrcn0sTGM9ZnVuY3Rpb24oKXt2YXIgdD1Fcyh0aGlzKS5ob3N0O3JldHVybiBudWxsPT09dD9cIlwiOnpzKHQpfSxVYz1mdW5jdGlvbigpe3ZhciB0PUVzKHRoaXMpLnBvcnQ7cmV0dXJuIG51bGw9PT10P1wiXCI6U3RyaW5nKHQpfSxNYz1mdW5jdGlvbigpe3ZhciB0PUVzKHRoaXMpLGU9dC5wYXRoO3JldHVybiB0LmNhbm5vdEJlQUJhc2VVUkw/ZVswXTplLmxlbmd0aD9cIi9cIitlLmpvaW4oXCIvXCIpOlwiXCJ9LF9jPWZ1bmN0aW9uKCl7dmFyIHQ9RXModGhpcykucXVlcnk7cmV0dXJuIHQ/XCI/XCIrdDpcIlwifSxOYz1mdW5jdGlvbigpe3JldHVybiBFcyh0aGlzKS5zZWFyY2hQYXJhbXN9LENjPWZ1bmN0aW9uKCl7dmFyIHQ9RXModGhpcykuZnJhZ21lbnQ7cmV0dXJuIHQ/XCIjXCIrdDpcIlwifSxGYz1mdW5jdGlvbih0LGUpe3JldHVybntnZXQ6dCxzZXQ6ZSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH19O2lmKGkmJnp0KE9jLHtocmVmOkZjKFJjLGZ1bmN0aW9uKHQpe3ZhciBlPUVzKHRoaXMpLHI9U3RyaW5nKHQpLG49eGMoZSxyKTtpZihuKXRocm93IFR5cGVFcnJvcihuKTt3cyhlLnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKGUucXVlcnkpfSksb3JpZ2luOkZjKGpjKSxwcm90b2NvbDpGYyhQYyxmdW5jdGlvbih0KXt2YXIgZT1Fcyh0aGlzKTt4YyhlLFN0cmluZyh0KStcIjpcIixyYyl9KSx1c2VybmFtZTpGYyhJYyxmdW5jdGlvbih0KXt2YXIgZT1Fcyh0aGlzKSxyPWhyKFN0cmluZyh0KSk7aWYoIUpzKGUpKXtlLnVzZXJuYW1lPVwiXCI7Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspZS51c2VybmFtZSs9VnMocltuXSwkcyl9fSkscGFzc3dvcmQ6RmMoVGMsZnVuY3Rpb24odCl7dmFyIGU9RXModGhpcykscj1ocihTdHJpbmcodCkpO2lmKCFKcyhlKSl7ZS5wYXNzd29yZD1cIlwiO2Zvcih2YXIgbj0wO248ci5sZW5ndGg7bisrKWUucGFzc3dvcmQrPVZzKHJbbl0sJHMpfX0pLGhvc3Q6RmMoa2MsZnVuY3Rpb24odCl7dmFyIGU9RXModGhpcyk7ZS5jYW5ub3RCZUFCYXNlVVJMfHx4YyhlLFN0cmluZyh0KSxoYyl9KSxob3N0bmFtZTpGYyhMYyxmdW5jdGlvbih0KXt2YXIgZT1Fcyh0aGlzKTtlLmNhbm5vdEJlQUJhc2VVUkx8fHhjKGUsU3RyaW5nKHQpLHBjKX0pLHBvcnQ6RmMoVWMsZnVuY3Rpb24odCl7dmFyIGU9RXModGhpcyk7SnMoZSl8fChcIlwiPT0odD1TdHJpbmcodCkpP2UucG9ydD1udWxsOnhjKGUsdCxkYykpfSkscGF0aG5hbWU6RmMoTWMsZnVuY3Rpb24odCl7dmFyIGU9RXModGhpcyk7ZS5jYW5ub3RCZUFCYXNlVVJMfHwoZS5wYXRoPVtdLHhjKGUsdCtcIlwiLG1jKSl9KSxzZWFyY2g6RmMoX2MsZnVuY3Rpb24odCl7dmFyIGU9RXModGhpcyk7XCJcIj09KHQ9U3RyaW5nKHQpKT9lLnF1ZXJ5PW51bGw6KFwiP1wiPT10LmNoYXJBdCgwKSYmKHQ9dC5zbGljZSgxKSksZS5xdWVyeT1cIlwiLHhjKGUsdCxTYykpLHdzKGUuc2VhcmNoUGFyYW1zKS51cGRhdGVTZWFyY2hQYXJhbXMoZS5xdWVyeSl9KSxzZWFyY2hQYXJhbXM6RmMoTmMpLGhhc2g6RmMoQ2MsZnVuY3Rpb24odCl7dmFyIGU9RXModGhpcyk7XCJcIiE9KHQ9U3RyaW5nKHQpKT8oXCIjXCI9PXQuY2hhckF0KDApJiYodD10LnNsaWNlKDEpKSxlLmZyYWdtZW50PVwiXCIseGMoZSx0LEVjKSk6ZS5mcmFnbWVudD1udWxsfSl9KSxldChPYyxcInRvSlNPTlwiLGZ1bmN0aW9uKCl7cmV0dXJuIFJjLmNhbGwodGhpcyl9LHtlbnVtZXJhYmxlOiEwfSksZXQoT2MsXCJ0b1N0cmluZ1wiLGZ1bmN0aW9uKCl7cmV0dXJuIFJjLmNhbGwodGhpcyl9LHtlbnVtZXJhYmxlOiEwfSksbXMpe3ZhciBCYz1tcy5jcmVhdGVPYmplY3RVUkwsRGM9bXMucmV2b2tlT2JqZWN0VVJMO0JjJiZldChBYyxcImNyZWF0ZU9iamVjdFVSTFwiLGZ1bmN0aW9uKHQpe3JldHVybiBCYy5hcHBseShtcyxhcmd1bWVudHMpfSksRGMmJmV0KEFjLFwicmV2b2tlT2JqZWN0VVJMXCIsZnVuY3Rpb24odCl7cmV0dXJuIERjLmFwcGx5KG1zLGFyZ3VtZW50cyl9KX1fZShBYyxcIlVSTFwiKSxrdCh7Z2xvYmFsOiEwLGZvcmNlZDohVXUsc2hhbTohaX0se1VSTDpBY30pLGt0KHt0YXJnZXQ6XCJVUkxcIixwcm90bzohMCxlbnVtZXJhYmxlOiEwfSx7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJuIFVSTC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0aGlzKX19KSxrdCh7dGFyZ2V0OlwiV2Vha01hcFwiLHN0YXQ6ITB9LHtmcm9tOmVufSksa3Qoe3RhcmdldDpcIldlYWtNYXBcIixzdGF0OiEwfSx7b2Y6cm59KSxrdCh7dGFyZ2V0OlwiV2Vha01hcFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHtkZWxldGVBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gbm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGt0KHt0YXJnZXQ6XCJXZWFrTWFwXCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se3Vwc2VydDpjbn0pLENyKFwiV2Vha1NldFwiLGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19LG1vKSxrdCh7dGFyZ2V0OlwiV2Vha1NldFwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOkR9LHthZGRBbGw6ZnVuY3Rpb24oKXtyZXR1cm4gSGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGt0KHt0YXJnZXQ6XCJXZWFrU2V0XCIscHJvdG86ITAscmVhbDohMCxmb3JjZWQ6RH0se2RlbGV0ZUFsbDpmdW5jdGlvbigpe3JldHVybiBubi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSksa3Qoe3RhcmdldDpcIldlYWtTZXRcIixzdGF0OiEwfSx7ZnJvbTplbn0pLGt0KHt0YXJnZXQ6XCJXZWFrU2V0XCIsc3RhdDohMH0se29mOnJufSk7dmFyIHFjLHpjLFdjLEtjPW4uUHJvbWlzZSxHYz0vKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QoUWkpLCRjPW4ubG9jYXRpb24sVmM9bi5zZXRJbW1lZGlhdGUsSGM9bi5jbGVhckltbWVkaWF0ZSxYYz1uLnByb2Nlc3MsWWM9bi5NZXNzYWdlQ2hhbm5lbCxKYz1uLkRpc3BhdGNoLFFjPTAsWmM9e30sdGY9ZnVuY3Rpb24odCl7aWYoWmMuaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPVpjW3RdO2RlbGV0ZSBaY1t0XSxlKCl9fSxlZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0Zih0KX19LHJmPWZ1bmN0aW9uKHQpe3RmKHQuZGF0YSl9LG5mPWZ1bmN0aW9uKHQpe24ucG9zdE1lc3NhZ2UodCtcIlwiLCRjLnByb3RvY29sK1wiLy9cIiskYy5ob3N0KX07VmMmJkhjfHwoVmM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHI9MTthcmd1bWVudHMubGVuZ3RoPnI7KWUucHVzaChhcmd1bWVudHNbcisrXSk7cmV0dXJuIFpjWysrUWNdPWZ1bmN0aW9uKCl7KFwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dDpGdW5jdGlvbih0KSkuYXBwbHkodm9pZCAwLGUpfSxxYyhRYyksUWN9LEhjPWZ1bmN0aW9uKHQpe2RlbGV0ZSBaY1t0XX0sXCJwcm9jZXNzXCI9PWwoWGMpP3FjPWZ1bmN0aW9uKHQpe1hjLm5leHRUaWNrKGVmKHQpKX06SmMmJkpjLm5vdz9xYz1mdW5jdGlvbih0KXtKYy5ub3coZWYodCkpfTpZYyYmIUdjPyhXYz0oemM9bmV3IFljKS5wb3J0Mix6Yy5wb3J0MS5vbm1lc3NhZ2U9cmYscWM9WnQoV2MucG9zdE1lc3NhZ2UsV2MsMSkpOiFuLmFkZEV2ZW50TGlzdGVuZXJ8fFwiZnVuY3Rpb25cIiE9dHlwZW9mIHBvc3RNZXNzYWdlfHxuLmltcG9ydFNjcmlwdHN8fG8obmYpfHxcImZpbGU6XCI9PT0kYy5wcm90b2NvbD9xYz1cIm9ucmVhZHlzdGF0ZWNoYW5nZVwiaW4gRShcInNjcmlwdFwiKT9mdW5jdGlvbih0KXtXdC5hcHBlbmRDaGlsZChFKFwic2NyaXB0XCIpKS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtXdC5yZW1vdmVDaGlsZCh0aGlzKSx0Zih0KX19OmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQoZWYodCksMCl9OihxYz1uZixuLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIscmYsITEpKSk7dmFyIG9mLGFmLHVmLHNmLGNmLGZmLGxmLGhmLHBmPXtzZXQ6VmMsY2xlYXI6SGN9LGRmPU8uZix2Zj1wZi5zZXQsZ2Y9bi5NdXRhdGlvbk9ic2VydmVyfHxuLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIseWY9bi5wcm9jZXNzLG1mPW4uUHJvbWlzZSxiZj1cInByb2Nlc3NcIj09bCh5Ziksd2Y9ZGYobixcInF1ZXVlTWljcm90YXNrXCIpLFNmPXdmJiZ3Zi52YWx1ZTtTZnx8KG9mPWZ1bmN0aW9uKCl7dmFyIHQsZTtmb3IoYmYmJih0PXlmLmRvbWFpbikmJnQuZXhpdCgpO2FmOyl7ZT1hZi5mbixhZj1hZi5uZXh0O3RyeXtlKCl9Y2F0Y2godCl7dGhyb3cgYWY/c2YoKTp1Zj12b2lkIDAsdH19dWY9dm9pZCAwLHQmJnQuZW50ZXIoKX0sYmY/c2Y9ZnVuY3Rpb24oKXt5Zi5uZXh0VGljayhvZil9OmdmJiYhR2M/KGNmPSEwLGZmPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpLG5ldyBnZihvZikub2JzZXJ2ZShmZix7Y2hhcmFjdGVyRGF0YTohMH0pLHNmPWZ1bmN0aW9uKCl7ZmYuZGF0YT1jZj0hY2Z9KTptZiYmbWYucmVzb2x2ZT8obGY9bWYucmVzb2x2ZSh2b2lkIDApLGhmPWxmLnRoZW4sc2Y9ZnVuY3Rpb24oKXtoZi5jYWxsKGxmLG9mKX0pOnNmPWZ1bmN0aW9uKCl7dmYuY2FsbChuLG9mKX0pO3ZhciBFZix4ZixBZixPZixSZj1TZnx8ZnVuY3Rpb24odCl7dmFyIGU9e2ZuOnQsbmV4dDp2b2lkIDB9O3VmJiYodWYubmV4dD1lKSxhZnx8KGFmPWUsc2YoKSksdWY9ZX0samY9ZnVuY3Rpb24odCl7dmFyIGUscjt0aGlzLnByb21pc2U9bmV3IHQoZnVuY3Rpb24odCxuKXtpZih2b2lkIDAhPT1lfHx2b2lkIDAhPT1yKXRocm93IFR5cGVFcnJvcihcIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yXCIpO2U9dCxyPW59KSx0aGlzLnJlc29sdmU9UXQoZSksdGhpcy5yZWplY3Q9UXQocil9LFBmPXtmOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgamYodCl9fSxJZj1mdW5jdGlvbih0LGUpe2lmKFIodCksZyhlKSYmZS5jb25zdHJ1Y3Rvcj09PXQpcmV0dXJuIGU7dmFyIHI9UGYuZih0KTtyZXR1cm4oMCxyLnJlc29sdmUpKGUpLHIucHJvbWlzZX0sVGY9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19LGtmPXBmLnNldCxMZj1EdChcInNwZWNpZXNcIiksVWY9XCJQcm9taXNlXCIsTWY9dHQuZ2V0LF9mPXR0LnNldCxOZj10dC5nZXR0ZXJGb3IoVWYpLENmPUtjLEZmPW4uVHlwZUVycm9yLEJmPW4uZG9jdW1lbnQsRGY9bi5wcm9jZXNzLHFmPW90KFwiZmV0Y2hcIiksemY9UGYuZixXZj16ZixLZj1cInByb2Nlc3NcIj09bChEZiksR2Y9ISEoQmYmJkJmLmNyZWF0ZUV2ZW50JiZuLmRpc3BhdGNoRXZlbnQpLCRmPVwidW5oYW5kbGVkcmVqZWN0aW9uXCIsVmY9SXQoVWYsZnVuY3Rpb24oKXtpZihDKENmKT09PVN0cmluZyhDZikpe2lmKDY2PT09cmEpcmV0dXJuITA7aWYoIUtmJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBQcm9taXNlUmVqZWN0aW9uRXZlbnQpcmV0dXJuITB9aWYocmE+PTUxJiYvbmF0aXZlIGNvZGUvLnRlc3QoQ2YpKXJldHVybiExO3ZhciB0PUNmLnJlc29sdmUoMSksZT1mdW5jdGlvbih0KXt0KGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30pfTtyZXR1cm4odC5jb25zdHJ1Y3Rvcj17fSlbTGZdPWUsISh0LnRoZW4oZnVuY3Rpb24oKXt9KWluc3RhbmNlb2YgZSl9KSxIZj1WZnx8IXlyKGZ1bmN0aW9uKHQpe0NmLmFsbCh0KS5jYXRjaChmdW5jdGlvbigpe30pfSksWGY9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuISghZyh0KXx8XCJmdW5jdGlvblwiIT10eXBlb2YoZT10LnRoZW4pKSYmZX0sWWY9ZnVuY3Rpb24odCxlLHIpe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciBuPWUucmVhY3Rpb25zO1JmKGZ1bmN0aW9uKCl7Zm9yKHZhciBvPWUudmFsdWUsaT0xPT1lLnN0YXRlLGE9MDtuLmxlbmd0aD5hOyl7dmFyIHUscyxjLGY9blthKytdLGw9aT9mLm9rOmYuZmFpbCxoPWYucmVzb2x2ZSxwPWYucmVqZWN0LGQ9Zi5kb21haW47dHJ5e2w/KGl8fCgyPT09ZS5yZWplY3Rpb24mJnRsKHQsZSksZS5yZWplY3Rpb249MSksITA9PT1sP3U9bzooZCYmZC5lbnRlcigpLHU9bChvKSxkJiYoZC5leGl0KCksYz0hMCkpLHU9PT1mLnByb21pc2U/cChGZihcIlByb21pc2UtY2hhaW4gY3ljbGVcIikpOihzPVhmKHUpKT9zLmNhbGwodSxoLHApOmgodSkpOnAobyl9Y2F0Y2godCl7ZCYmIWMmJmQuZXhpdCgpLHAodCl9fWUucmVhY3Rpb25zPVtdLGUubm90aWZpZWQ9ITEsciYmIWUucmVqZWN0aW9uJiZRZih0LGUpfSl9fSxKZj1mdW5jdGlvbih0LGUscil7dmFyIG8saTtHZj8oKG89QmYuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSkucHJvbWlzZT1lLG8ucmVhc29uPXIsby5pbml0RXZlbnQodCwhMSwhMCksbi5kaXNwYXRjaEV2ZW50KG8pKTpvPXtwcm9taXNlOmUscmVhc29uOnJ9LChpPW5bXCJvblwiK3RdKT9pKG8pOnQ9PT0kZiYmZnVuY3Rpb24odCxlKXt2YXIgcj1uLmNvbnNvbGU7ciYmci5lcnJvciYmKDE9PT1hcmd1bWVudHMubGVuZ3RoP3IuZXJyb3IodCk6ci5lcnJvcih0LGUpKX0oXCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25cIixyKX0sUWY9ZnVuY3Rpb24odCxlKXtrZi5jYWxsKG4sZnVuY3Rpb24oKXt2YXIgcixuPWUudmFsdWU7aWYoWmYoZSkmJihyPVRmKGZ1bmN0aW9uKCl7S2Y/RGYuZW1pdChcInVuaGFuZGxlZFJlamVjdGlvblwiLG4sdCk6SmYoJGYsdCxuKX0pLGUucmVqZWN0aW9uPUtmfHxaZihlKT8yOjEsci5lcnJvcikpdGhyb3cgci52YWx1ZX0pfSxaZj1mdW5jdGlvbih0KXtyZXR1cm4gMSE9PXQucmVqZWN0aW9uJiYhdC5wYXJlbnR9LHRsPWZ1bmN0aW9uKHQsZSl7a2YuY2FsbChuLGZ1bmN0aW9uKCl7S2Y/RGYuZW1pdChcInJlamVjdGlvbkhhbmRsZWRcIix0KTpKZihcInJlamVjdGlvbmhhbmRsZWRcIix0LGUudmFsdWUpfSl9LGVsPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBmdW5jdGlvbihvKXt0KGUscixvLG4pfX0scmw9ZnVuY3Rpb24odCxlLHIsbil7ZS5kb25lfHwoZS5kb25lPSEwLG4mJihlPW4pLGUudmFsdWU9cixlLnN0YXRlPTIsWWYodCxlLCEwKSl9LG5sPWZ1bmN0aW9uIHQoZSxyLG4sbyl7aWYoIXIuZG9uZSl7ci5kb25lPSEwLG8mJihyPW8pO3RyeXtpZihlPT09bil0aHJvdyBGZihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO3ZhciBpPVhmKG4pO2k/UmYoZnVuY3Rpb24oKXt2YXIgbz17ZG9uZTohMX07dHJ5e2kuY2FsbChuLGVsKHQsZSxvLHIpLGVsKHJsLGUsbyxyKSl9Y2F0Y2godCl7cmwoZSxvLHQscil9fSk6KHIudmFsdWU9bixyLnN0YXRlPTEsWWYoZSxyLCExKSl9Y2F0Y2godCl7cmwoZSx7ZG9uZTohMX0sdCxyKX19fTtWZiYmKENmPWZ1bmN0aW9uKHQpe19yKHRoaXMsQ2YsVWYpLFF0KHQpLEVmLmNhbGwodGhpcyk7dmFyIGU9TWYodGhpcyk7dHJ5e3QoZWwobmwsdGhpcyxlKSxlbChybCx0aGlzLGUpKX1jYXRjaCh0KXtybCh0aGlzLGUsdCl9fSwoRWY9ZnVuY3Rpb24odCl7X2YodGhpcyx7dHlwZTpVZixkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOjAsdmFsdWU6dm9pZCAwfSl9KS5wcm90b3R5cGU9RnIoQ2YucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIHI9TmYodGhpcyksbj16Zihzbih0aGlzLENmKSk7cmV0dXJuIG4ub2s9XCJmdW5jdGlvblwiIT10eXBlb2YgdHx8dCxuLmZhaWw9XCJmdW5jdGlvblwiPT10eXBlb2YgZSYmZSxuLmRvbWFpbj1LZj9EZi5kb21haW46dm9pZCAwLHIucGFyZW50PSEwLHIucmVhY3Rpb25zLnB1c2gobiksMCE9ci5zdGF0ZSYmWWYodGhpcyxyLCExKSxuLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfX0pLHhmPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEVmLGU9TWYodCk7dGhpcy5wcm9taXNlPXQsdGhpcy5yZXNvbHZlPWVsKG5sLHQsZSksdGhpcy5yZWplY3Q9ZWwocmwsdCxlKX0sUGYuZj16Zj1mdW5jdGlvbih0KXtyZXR1cm4gdD09PUNmfHx0PT09QWY/bmV3IHhmKHQpOldmKHQpfSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBLYyYmKE9mPUtjLnByb3RvdHlwZS50aGVuLGV0KEtjLnByb3RvdHlwZSxcInRoZW5cIixmdW5jdGlvbih0LGUpe3ZhciByPXRoaXM7cmV0dXJuIG5ldyBDZihmdW5jdGlvbih0LGUpe09mLmNhbGwocix0LGUpfSkudGhlbih0LGUpfSx7dW5zYWZlOiEwfSksXCJmdW5jdGlvblwiPT10eXBlb2YgcWYmJmt0KHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gSWYoQ2YscWYuYXBwbHkobixhcmd1bWVudHMpKX19KSkpLGt0KHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6VmZ9LHtQcm9taXNlOkNmfSksX2UoQ2YsVWYsITEpLERyKFVmKSxBZj1vdChVZiksa3Qoe3RhcmdldDpVZixzdGF0OiEwLGZvcmNlZDpWZn0se3JlamVjdDpmdW5jdGlvbih0KXt2YXIgZT16Zih0aGlzKTtyZXR1cm4gZS5yZWplY3QuY2FsbCh2b2lkIDAsdCksZS5wcm9taXNlfX0pLGt0KHt0YXJnZXQ6VWYsc3RhdDohMCxmb3JjZWQ6VmZ9LHtyZXNvbHZlOmZ1bmN0aW9uKHQpe3JldHVybiBJZih0aGlzLHQpfX0pLGt0KHt0YXJnZXQ6VWYsc3RhdDohMCxmb3JjZWQ6SGZ9LHthbGw6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXpmKGUpLG49ci5yZXNvbHZlLG89ci5yZWplY3QsaT1UZihmdW5jdGlvbigpe3ZhciByPVF0KGUucmVzb2x2ZSksaT1bXSxhPTAsdT0xO01yKHQsZnVuY3Rpb24odCl7dmFyIHM9YSsrLGM9ITE7aS5wdXNoKHZvaWQgMCksdSsrLHIuY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7Y3x8KGM9ITAsaVtzXT10LC0tdXx8bihpKSl9LG8pfSksLS11fHxuKGkpfSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksci5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj16ZihlKSxuPXIucmVqZWN0LG89VGYoZnVuY3Rpb24oKXt2YXIgbz1RdChlLnJlc29sdmUpO01yKHQsZnVuY3Rpb24odCl7by5jYWxsKGUsdCkudGhlbihyLnJlc29sdmUsbil9KX0pO3JldHVybiBvLmVycm9yJiZuKG8udmFsdWUpLHIucHJvbWlzZX19KSxrdCh7dGFyZ2V0OlwiUHJvbWlzZVwiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj1QZi5mKGUpLG49ci5yZXNvbHZlLG89ci5yZWplY3QsaT1UZihmdW5jdGlvbigpe3ZhciByPVF0KGUucmVzb2x2ZSksbz1bXSxpPTAsYT0xO01yKHQsZnVuY3Rpb24odCl7dmFyIHU9aSsrLHM9ITE7by5wdXNoKHZvaWQgMCksYSsrLHIuY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7c3x8KHM9ITAsb1t1XT17c3RhdHVzOlwiZnVsZmlsbGVkXCIsdmFsdWU6dH0sLS1hfHxuKG8pKX0sZnVuY3Rpb24odCl7c3x8KHM9ITAsb1t1XT17c3RhdHVzOlwicmVqZWN0ZWRcIixyZWFzb246dH0sLS1hfHxuKG8pKX0pfSksLS1hfHxuKG8pfSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksci5wcm9taXNlfX0pO3ZhciBvbD0hIUtjJiZvKGZ1bmN0aW9uKCl7S2MucHJvdG90eXBlLmZpbmFsbHkuY2FsbCh7dGhlbjpmdW5jdGlvbigpe319LGZ1bmN0aW9uKCl7fSl9KTtrdCh7dGFyZ2V0OlwiUHJvbWlzZVwiLHByb3RvOiEwLHJlYWw6ITAsZm9yY2VkOm9sfSx7ZmluYWxseTpmdW5jdGlvbih0KXt2YXIgZT1zbih0aGlzLG90KFwiUHJvbWlzZVwiKSkscj1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0O3JldHVybiB0aGlzLnRoZW4ocj9mdW5jdGlvbihyKXtyZXR1cm4gSWYoZSx0KCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gcn0pfTp0LHI/ZnVuY3Rpb24ocil7cmV0dXJuIElmKGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgcn0pfTp0KX19KSxcImZ1bmN0aW9uXCIhPXR5cGVvZiBLY3x8S2MucHJvdG90eXBlLmZpbmFsbHl8fGV0KEtjLnByb3RvdHlwZSxcImZpbmFsbHlcIixvdChcIlByb21pc2VcIikucHJvdG90eXBlLmZpbmFsbHkpO3ZhciBpbD10dC5zZXQsYWw9dHQuZ2V0dGVyRm9yKFwiQWdncmVnYXRlRXJyb3JcIiksdWw9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO2lmKCEociBpbnN0YW5jZW9mIHVsKSlyZXR1cm4gbmV3IHVsKHQsZSk7cWUmJihyPXFlKG5ldyBFcnJvcihlKSxJZShyKSkpO3ZhciBuPVtdO3JldHVybiBNcih0LG4ucHVzaCxuKSxpP2lsKHIse2Vycm9yczpuLHR5cGU6XCJBZ2dyZWdhdGVFcnJvclwifSk6ci5lcnJvcnM9bix2b2lkIDAhPT1lJiZJKHIsXCJtZXNzYWdlXCIsU3RyaW5nKGUpKSxyfTt1bC5wcm90b3R5cGU9SHQoRXJyb3IucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjpjKDUsdWwpLG1lc3NhZ2U6Yyg1LFwiXCIpLG5hbWU6Yyg1LFwiQWdncmVnYXRlRXJyb3JcIil9KSxpJiZQLmYodWwucHJvdG90eXBlLFwiZXJyb3JzXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBhbCh0aGlzKS5lcnJvcnN9LGNvbmZpZ3VyYWJsZTohMH0pLGt0KHtnbG9iYWw6ITB9LHtBZ2dyZWdhdGVFcnJvcjp1bH0pLGt0KHt0YXJnZXQ6XCJQcm9taXNlXCIsc3RhdDohMH0se3RyeTpmdW5jdGlvbih0KXt2YXIgZT1QZi5mKHRoaXMpLHI9VGYodCk7cmV0dXJuKHIuZXJyb3I/ZS5yZWplY3Q6ZS5yZXNvbHZlKShyLnZhbHVlKSxlLnByb21pc2V9fSk7dmFyIHNsPVwiTm8gb25lIHByb21pc2UgcmVzb2x2ZWRcIjtrdCh7dGFyZ2V0OlwiUHJvbWlzZVwiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPVBmLmYoZSksbj1yLnJlc29sdmUsbz1yLnJlamVjdCxpPVRmKGZ1bmN0aW9uKCl7dmFyIHI9UXQoZS5yZXNvbHZlKSxpPVtdLGE9MCx1PTEscz0hMTtNcih0LGZ1bmN0aW9uKHQpe3ZhciBjPWErKyxmPSExO2kucHVzaCh2b2lkIDApLHUrKyxyLmNhbGwoZSx0KS50aGVuKGZ1bmN0aW9uKHQpe2Z8fHN8fChzPSEwLG4odCkpfSxmdW5jdGlvbih0KXtmfHxzfHwoZj0hMCxpW2NdPXQsLS11fHxvKG5ldyhvdChcIkFnZ3JlZ2F0ZUVycm9yXCIpKShpLHNsKSkpfSl9KSwtLXV8fG8obmV3KG90KFwiQWdncmVnYXRlRXJyb3JcIikpKGksc2wpKX0pO3JldHVybiBpLmVycm9yJiZvKGkudmFsdWUpLHIucHJvbWlzZX19KSxlZShcIlByb21pc2VcIixcImZpbmFsbHlcIik7dmFyIGNsPVwiVVJMU2VhcmNoUGFyYW1zXCJpbiBzZWxmLGZsPVwiU3ltYm9sXCJpbiBzZWxmJiZcIml0ZXJhdG9yXCJpbiBTeW1ib2wsbGw9XCJGaWxlUmVhZGVyXCJpbiBzZWxmJiZcIkJsb2JcImluIHNlbGYmJmZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgQmxvYiwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCksaGw9XCJGb3JtRGF0YVwiaW4gc2VsZixwbD1cIkFycmF5QnVmZmVyXCJpbiBzZWxmO2lmKHBsKXZhciBkbD1bXCJbb2JqZWN0IEludDhBcnJheV1cIixcIltvYmplY3QgVWludDhBcnJheV1cIixcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCIsXCJbb2JqZWN0IEludDE2QXJyYXldXCIsXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiLFwiW29iamVjdCBJbnQzMkFycmF5XVwiLFwiW29iamVjdCBVaW50MzJBcnJheV1cIixcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiLFwiW29iamVjdCBGbG9hdDY0QXJyYXldXCJdLHZsPUFycmF5QnVmZmVyLmlzVmlld3x8ZnVuY3Rpb24odCl7cmV0dXJuIHQmJmRsLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKT4tMX07ZnVuY3Rpb24gZ2wodCl7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIHQmJih0PVN0cmluZyh0KSksL1teYS16MC05XFwtIyQlJicqKy5eX2B8fl0vaS50ZXN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGNoYXJhY3RlciBpbiBoZWFkZXIgZmllbGQgbmFtZVwiKTtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHlsKHQpe3JldHVyblwic3RyaW5nXCIhPXR5cGVvZiB0JiYodD1TdHJpbmcodCkpLHR9ZnVuY3Rpb24gbWwodCl7dmFyIGU9e25leHQ6ZnVuY3Rpb24oKXt2YXIgZT10LnNoaWZ0KCk7cmV0dXJue2RvbmU6dm9pZCAwPT09ZSx2YWx1ZTplfX19O3JldHVybiBmbCYmKGVbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBlfSksZX1mdW5jdGlvbiBibCh0KXt0aGlzLm1hcD17fSx0IGluc3RhbmNlb2YgYmw/dC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7dGhpcy5hcHBlbmQoZSx0KX0sdGhpcyk6QXJyYXkuaXNBcnJheSh0KT90LmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5hcHBlbmQodFswXSx0WzFdKX0sdGhpcyk6dCYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmFwcGVuZChlLHRbZV0pfSx0aGlzKX1mdW5jdGlvbiB3bCh0KXtpZih0LmJvZHlVc2VkKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgVHlwZUVycm9yKFwiQWxyZWFkeSByZWFkXCIpKTt0LmJvZHlVc2VkPSEwfWZ1bmN0aW9uIFNsKHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHIpe3Qub25sb2FkPWZ1bmN0aW9uKCl7ZSh0LnJlc3VsdCl9LHQub25lcnJvcj1mdW5jdGlvbigpe3IodC5lcnJvcil9fSl9ZnVuY3Rpb24gRWwodCl7dmFyIGU9bmV3IEZpbGVSZWFkZXIscj1TbChlKTtyZXR1cm4gZS5yZWFkQXNBcnJheUJ1ZmZlcih0KSxyfWZ1bmN0aW9uIHhsKHQpe2lmKHQuc2xpY2UpcmV0dXJuIHQuc2xpY2UoMCk7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodC5ieXRlTGVuZ3RoKTtyZXR1cm4gZS5zZXQobmV3IFVpbnQ4QXJyYXkodCkpLGUuYnVmZmVyfWZ1bmN0aW9uIEFsKCl7cmV0dXJuIHRoaXMuYm9keVVzZWQ9ITEsdGhpcy5faW5pdEJvZHk9ZnVuY3Rpb24odCl7dmFyIGU7dGhpcy5fYm9keUluaXQ9dCx0P1wic3RyaW5nXCI9PXR5cGVvZiB0P3RoaXMuX2JvZHlUZXh0PXQ6bGwmJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodCk/dGhpcy5fYm9keUJsb2I9dDpobCYmRm9ybURhdGEucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodCk/dGhpcy5fYm9keUZvcm1EYXRhPXQ6Y2wmJlVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZih0KT90aGlzLl9ib2R5VGV4dD10LnRvU3RyaW5nKCk6cGwmJmxsJiYoZT10KSYmRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSk/KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj14bCh0LmJ1ZmZlciksdGhpcy5fYm9keUluaXQ9bmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTpwbCYmKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHQpfHx2bCh0KSk/dGhpcy5fYm9keUFycmF5QnVmZmVyPXhsKHQpOnRoaXMuX2JvZHlUZXh0PXQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpOnRoaXMuX2JvZHlUZXh0PVwiXCIsdGhpcy5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKXx8KFwic3RyaW5nXCI9PXR5cGVvZiB0P3RoaXMuaGVhZGVycy5zZXQoXCJjb250ZW50LXR5cGVcIixcInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOFwiKTp0aGlzLl9ib2R5QmxvYiYmdGhpcy5fYm9keUJsb2IudHlwZT90aGlzLmhlYWRlcnMuc2V0KFwiY29udGVudC10eXBlXCIsdGhpcy5fYm9keUJsb2IudHlwZSk6Y2wmJlVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZih0KSYmdGhpcy5oZWFkZXJzLnNldChcImNvbnRlbnQtdHlwZVwiLFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9VVRGLThcIikpfSxsbCYmKHRoaXMuYmxvYj1mdW5jdGlvbigpe3ZhciB0PXdsKHRoaXMpO2lmKHQpcmV0dXJuIHQ7aWYodGhpcy5fYm9keUJsb2IpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5QmxvYik7aWYodGhpcy5fYm9keUFycmF5QnVmZmVyKXJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iXCIpO3JldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpfSx0aGlzLmFycmF5QnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj93bCh0aGlzKXx8UHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcik6dGhpcy5ibG9iKCkudGhlbihFbCl9KSx0aGlzLnRleHQ9ZnVuY3Rpb24oKXt2YXIgdD13bCh0aGlzKTtpZih0KXJldHVybiB0O2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT1uZXcgRmlsZVJlYWRlcixyPVNsKGUpO3JldHVybiBlLnJlYWRBc1RleHQodCkscn0odGhpcy5fYm9keUJsb2IpO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXJbbl09U3RyaW5nLmZyb21DaGFyQ29kZShlW25dKTtyZXR1cm4gci5qb2luKFwiXCIpfSh0aGlzLl9ib2R5QXJyYXlCdWZmZXIpKTtpZih0aGlzLl9ib2R5Rm9ybURhdGEpdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0XCIpO3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keVRleHQpfSxobCYmKHRoaXMuZm9ybURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihqbCl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc31ibC5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQsZSl7dD1nbCh0KSxlPXlsKGUpO3ZhciByPXRoaXMubWFwW3RdO3RoaXMubWFwW3RdPXI/citcIiwgXCIrZTplfSxibC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe2RlbGV0ZSB0aGlzLm1hcFtnbCh0KV19LGJsLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9Z2wodCksdGhpcy5oYXModCk/dGhpcy5tYXBbdF06bnVsbH0sYmwucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXAuaGFzT3duUHJvcGVydHkoZ2wodCkpfSxibC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7dGhpcy5tYXBbZ2wodCldPXlsKGUpfSxibC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgciBpbiB0aGlzLm1hcCl0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShyKSYmdC5jYWxsKGUsdGhpcy5tYXBbcl0scix0aGlzKX0sYmwucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7dC5wdXNoKHIpfSksbWwodCl9LGJsLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QucHVzaChlKX0pLG1sKHQpfSxibC5wcm90b3R5cGUuZW50cmllcz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZSxyKXt0LnB1c2goW3IsZV0pfSksbWwodCl9LGZsJiYoYmwucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl09YmwucHJvdG90eXBlLmVudHJpZXMpO3ZhciBPbD1bXCJERUxFVEVcIixcIkdFVFwiLFwiSEVBRFwiLFwiT1BUSU9OU1wiLFwiUE9TVFwiLFwiUFVUXCJdO2Z1bmN0aW9uIFJsKHQsZSl7dmFyIHIsbixvPShlPWV8fHt9KS5ib2R5O2lmKHQgaW5zdGFuY2VvZiBSbCl7aWYodC5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWxyZWFkeSByZWFkXCIpO3RoaXMudXJsPXQudXJsLHRoaXMuY3JlZGVudGlhbHM9dC5jcmVkZW50aWFscyxlLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IGJsKHQuaGVhZGVycykpLHRoaXMubWV0aG9kPXQubWV0aG9kLHRoaXMubW9kZT10Lm1vZGUsdGhpcy5zaWduYWw9dC5zaWduYWwsb3x8bnVsbD09dC5fYm9keUluaXR8fChvPXQuX2JvZHlJbml0LHQuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKHQpO2lmKHRoaXMuY3JlZGVudGlhbHM9ZS5jcmVkZW50aWFsc3x8dGhpcy5jcmVkZW50aWFsc3x8XCJzYW1lLW9yaWdpblwiLCFlLmhlYWRlcnMmJnRoaXMuaGVhZGVyc3x8KHRoaXMuaGVhZGVycz1uZXcgYmwoZS5oZWFkZXJzKSksdGhpcy5tZXRob2Q9KG49KHI9ZS5tZXRob2R8fHRoaXMubWV0aG9kfHxcIkdFVFwiKS50b1VwcGVyQ2FzZSgpLE9sLmluZGV4T2Yobik+LTE/bjpyKSx0aGlzLm1vZGU9ZS5tb2RlfHx0aGlzLm1vZGV8fG51bGwsdGhpcy5zaWduYWw9ZS5zaWduYWx8fHRoaXMuc2lnbmFsLHRoaXMucmVmZXJyZXI9bnVsbCwoXCJHRVRcIj09PXRoaXMubWV0aG9kfHxcIkhFQURcIj09PXRoaXMubWV0aG9kKSYmbyl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHNcIik7dGhpcy5faW5pdEJvZHkobyl9ZnVuY3Rpb24gamwodCl7dmFyIGU9bmV3IEZvcm1EYXRhO3JldHVybiB0LnRyaW0oKS5zcGxpdChcIiZcIikuZm9yRWFjaChmdW5jdGlvbih0KXtpZih0KXt2YXIgcj10LnNwbGl0KFwiPVwiKSxuPXIuc2hpZnQoKS5yZXBsYWNlKC9cXCsvZyxcIiBcIiksbz1yLmpvaW4oXCI9XCIpLnJlcGxhY2UoL1xcKy9nLFwiIFwiKTtlLmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQobiksZGVjb2RlVVJJQ29tcG9uZW50KG8pKX19KSxlfWZ1bmN0aW9uIFBsKHQsZSl7ZXx8KGU9e30pLHRoaXMudHlwZT1cImRlZmF1bHRcIix0aGlzLnN0YXR1cz12b2lkIDA9PT1lLnN0YXR1cz8yMDA6ZS5zdGF0dXMsdGhpcy5vaz10aGlzLnN0YXR1cz49MjAwJiZ0aGlzLnN0YXR1czwzMDAsdGhpcy5zdGF0dXNUZXh0PVwic3RhdHVzVGV4dFwiaW4gZT9lLnN0YXR1c1RleHQ6XCJPS1wiLHRoaXMuaGVhZGVycz1uZXcgYmwoZS5oZWFkZXJzKSx0aGlzLnVybD1lLnVybHx8XCJcIix0aGlzLl9pbml0Qm9keSh0KX1SbC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJsKHRoaXMse2JvZHk6dGhpcy5fYm9keUluaXR9KX0sQWwuY2FsbChSbC5wcm90b3R5cGUpLEFsLmNhbGwoUGwucHJvdG90eXBlKSxQbC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFBsKHRoaXMuX2JvZHlJbml0LHtzdGF0dXM6dGhpcy5zdGF0dXMsc3RhdHVzVGV4dDp0aGlzLnN0YXR1c1RleHQsaGVhZGVyczpuZXcgYmwodGhpcy5oZWFkZXJzKSx1cmw6dGhpcy51cmx9KX0sUGwuZXJyb3I9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgUGwobnVsbCx7c3RhdHVzOjAsc3RhdHVzVGV4dDpcIlwifSk7cmV0dXJuIHQudHlwZT1cImVycm9yXCIsdH07dmFyIElsPVszMDEsMzAyLDMwMywzMDcsMzA4XTtQbC5yZWRpcmVjdD1mdW5jdGlvbih0LGUpe2lmKC0xPT09SWwuaW5kZXhPZihlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgc3RhdHVzIGNvZGVcIik7cmV0dXJuIG5ldyBQbChudWxsLHtzdGF0dXM6ZSxoZWFkZXJzOntsb2NhdGlvbjp0fX0pfTt2YXIgVGw9c2VsZi5ET01FeGNlcHRpb247dHJ5e25ldyBUbH1jYXRjaCh0KXsoVGw9ZnVuY3Rpb24odCxlKXt0aGlzLm1lc3NhZ2U9dCx0aGlzLm5hbWU9ZTt2YXIgcj1FcnJvcih0KTt0aGlzLnN0YWNrPXIuc3RhY2t9KS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLFRsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UbH1mdW5jdGlvbiBrbCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLG4pe3ZhciBvPW5ldyBSbCh0LGUpO2lmKG8uc2lnbmFsJiZvLnNpZ25hbC5hYm9ydGVkKXJldHVybiBuKG5ldyBUbChcIkFib3J0ZWRcIixcIkFib3J0RXJyb3JcIikpO3ZhciBpPW5ldyBYTUxIdHRwUmVxdWVzdDtmdW5jdGlvbiBhKCl7aS5hYm9ydCgpfWkub25sb2FkPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXtzdGF0dXM6aS5zdGF0dXMsc3RhdHVzVGV4dDppLnN0YXR1c1RleHQsaGVhZGVyczoodD1pLmdldEFsbFJlc3BvbnNlSGVhZGVycygpfHxcIlwiLGU9bmV3IGJsLHQucmVwbGFjZSgvXFxyP1xcbltcXHQgXSsvZyxcIiBcIikuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPXQuc3BsaXQoXCI6XCIpLG49ci5zaGlmdCgpLnRyaW0oKTtpZihuKXt2YXIgbz1yLmpvaW4oXCI6XCIpLnRyaW0oKTtlLmFwcGVuZChuLG8pfX0pLGUpfTtuLnVybD1cInJlc3BvbnNlVVJMXCJpbiBpP2kucmVzcG9uc2VVUkw6bi5oZWFkZXJzLmdldChcIlgtUmVxdWVzdC1VUkxcIikscihuZXcgUGwoXCJyZXNwb25zZVwiaW4gaT9pLnJlc3BvbnNlOmkucmVzcG9uc2VUZXh0LG4pKX0saS5vbmVycm9yPWZ1bmN0aW9uKCl7bihuZXcgVHlwZUVycm9yKFwiTmV0d29yayByZXF1ZXN0IGZhaWxlZFwiKSl9LGkub250aW1lb3V0PWZ1bmN0aW9uKCl7bihuZXcgVHlwZUVycm9yKFwiTmV0d29yayByZXF1ZXN0IGZhaWxlZFwiKSl9LGkub25hYm9ydD1mdW5jdGlvbigpe24obmV3IFRsKFwiQWJvcnRlZFwiLFwiQWJvcnRFcnJvclwiKSl9LGkub3BlbihvLm1ldGhvZCxvLnVybCwhMCksXCJpbmNsdWRlXCI9PT1vLmNyZWRlbnRpYWxzP2kud2l0aENyZWRlbnRpYWxzPSEwOlwib21pdFwiPT09by5jcmVkZW50aWFscyYmKGkud2l0aENyZWRlbnRpYWxzPSExKSxcInJlc3BvbnNlVHlwZVwiaW4gaSYmbGwmJihpLnJlc3BvbnNlVHlwZT1cImJsb2JcIiksby5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odCxlKXtpLnNldFJlcXVlc3RIZWFkZXIoZSx0KX0pLG8uc2lnbmFsJiYoby5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsYSksaS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09aS5yZWFkeVN0YXRlJiZvLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIixhKX0pLGkuc2VuZCh2b2lkIDA9PT1vLl9ib2R5SW5pdD9udWxsOm8uX2JvZHlJbml0KX0pfWtsLnBvbHlmaWxsPSEwLHNlbGYuZmV0Y2h8fChzZWxmLmZldGNoPWtsLHNlbGYuSGVhZGVycz1ibCxzZWxmLlJlcXVlc3Q9Umwsc2VsZi5SZXNwb25zZT1QbCk7dmFyIExsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsVWw9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxNbD1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO2Z1bmN0aW9uIF9sKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkXCIpO3JldHVybiBPYmplY3QodCl9dmFyIE5sPWZ1bmN0aW9uKCl7dHJ5e2lmKCFPYmplY3QuYXNzaWduKXJldHVybiExO3ZhciB0PW5ldyBTdHJpbmcoXCJhYmNcIik7aWYodFs1XT1cImRlXCIsXCI1XCI9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KVswXSlyZXR1cm4hMTtmb3IodmFyIGU9e30scj0wO3I8MTA7cisrKWVbXCJfXCIrU3RyaW5nLmZyb21DaGFyQ29kZShyKV09cjtpZihcIjAxMjM0NTY3ODlcIiE9PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pLmpvaW4oXCJcIikpcmV0dXJuITE7dmFyIG49e307cmV0dXJuXCJhYmNkZWZnaGlqa2xtbm9wcXJzdFwiLnNwbGl0KFwiXCIpLmZvckVhY2goZnVuY3Rpb24odCl7blt0XT10fSksXCJhYmNkZWZnaGlqa2xtbm9wcXJzdFwiPT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxuKSkuam9pbihcIlwiKX1jYXRjaCh0KXtyZXR1cm4hMX19KCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcixuLG89X2wodCksaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe2Zvcih2YXIgYSBpbiByPU9iamVjdChhcmd1bWVudHNbaV0pKVVsLmNhbGwocixhKSYmKG9bYV09clthXSk7aWYoTGwpe249TGwocik7Zm9yKHZhciB1PTA7dTxuLmxlbmd0aDt1KyspTWwuY2FsbChyLG5bdV0pJiYob1tuW3VdXT1yW25bdV1dKX19cmV0dXJuIG99O09iamVjdC5hc3NpZ249Tmx9KCk7XG4iLCJpbXBvcnQgJ25leHQvZGlzdC9idWlsZC9wb2x5ZmlsbHMvcG9seWZpbGwtbm9tb2R1bGUnXG4iLCJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyAxNDk6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbnZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oMTQ5KTtcbi8qKioqKiovIH0pKClcbjsiLCJtb2R1bGUuZXhwb3J0cyA9XG4vKioqKioqLyAoZnVuY3Rpb24oKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0dmFyIF9fd2VicGFja19tb2R1bGVzX18gPSAoe1xuXG4vKioqLyA4ODA6XG4vKioqLyAoZnVuY3Rpb24obW9kdWxlKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcblxuXG4vKioqLyB9KVxuXG4vKioqKioqLyBcdH0pO1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX25jY3dwY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovIFx0XHR9XG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcbi8qKioqKiovIFx0XHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdHZhciB0aHJldyA9IHRydWU7XG4vKioqKioqLyBcdFx0dHJ5IHtcbi8qKioqKiovIFx0XHRcdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fbmNjd3Bja19yZXF1aXJlX18pO1xuLyoqKioqKi8gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbi8qKioqKiovIFx0XHR9IGZpbmFsbHkge1xuLyoqKioqKi8gXHRcdFx0aWYodGhyZXcpIGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovIFx0XG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gXHQvKiB3ZWJwYWNrL3J1bnRpbWUvY29tcGF0ICovXG4vKioqKioqLyBcdFxuLyoqKioqKi8gXHRfX25jY3dwY2tfcmVxdWlyZV9fLmFiID0gX19kaXJuYW1lICsgXCIvXCI7LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIFx0Ly8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8qKioqKiovIFx0Ly8gc3RhcnR1cFxuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fbmNjd3Bja19yZXF1aXJlX18oODgwKTtcbi8qKioqKiovIH0pKClcbjsiXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/.next/static/chunks/react-refresh.js b/.next/static/chunks/react-refresh.js new file mode 100644 index 0000000..f474616 --- /dev/null +++ b/.next/static/chunks/react-refresh.js @@ -0,0 +1,901 @@ +_N_E = +(window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([["react-refresh"],{ + +/***/ "./node_modules/@next/react-refresh-utils/internal/helpers.js": +/*!********************************************************************!*\ + !*** ./node_modules/@next/react-refresh-utils/internal/helpers.js ***! + \********************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +/** + * MIT License + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * 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. + */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// This file is copied from the Metro JavaScript bundler, with minor tweaks for +// webpack 4 compatibility. +// +// https://github.com/facebook/metro/blob/d6b9685c730d0d63577db40f41369157f28dfa3a/packages/metro/src/lib/polyfills/require.js +const runtime_1 = __importDefault(__webpack_require__(/*! react-refresh/runtime */ "./node_modules/react-refresh/runtime.js")); +function isSafeExport(key) { + return (key === '__esModule' || + key === '__N_SSG' || + key === '__N_SSP' || + // TODO: remove this key from page config instead of allow listing it + key === 'config'); +} +function registerExportsForReactRefresh(moduleExports, moduleID) { + runtime_1.default.register(moduleExports, moduleID + ' %exports%'); + if (moduleExports == null || typeof moduleExports !== 'object') { + // Exit if we can't iterate over exports. + // (This is important for legacy environments.) + return; + } + for (var key in moduleExports) { + if (isSafeExport(key)) { + continue; + } + var exportValue = moduleExports[key]; + var typeID = moduleID + ' %exports% ' + key; + runtime_1.default.register(exportValue, typeID); + } +} +function isReactRefreshBoundary(moduleExports) { + if (runtime_1.default.isLikelyComponentType(moduleExports)) { + return true; + } + if (moduleExports == null || typeof moduleExports !== 'object') { + // Exit if we can't iterate over exports. + return false; + } + var hasExports = false; + var areAllExportsComponents = true; + for (var key in moduleExports) { + hasExports = true; + if (isSafeExport(key)) { + continue; + } + var exportValue = moduleExports[key]; + if (!runtime_1.default.isLikelyComponentType(exportValue)) { + areAllExportsComponents = false; + } + } + return hasExports && areAllExportsComponents; +} +function shouldInvalidateReactRefreshBoundary(prevExports, nextExports) { + var prevSignature = getRefreshBoundarySignature(prevExports); + var nextSignature = getRefreshBoundarySignature(nextExports); + if (prevSignature.length !== nextSignature.length) { + return true; + } + for (var i = 0; i < nextSignature.length; i++) { + if (prevSignature[i] !== nextSignature[i]) { + return true; + } + } + return false; +} +function getRefreshBoundarySignature(moduleExports) { + var signature = []; + signature.push(runtime_1.default.getFamilyByType(moduleExports)); + if (moduleExports == null || typeof moduleExports !== 'object') { + // Exit if we can't iterate over exports. + // (This is important for legacy environments.) + return signature; + } + for (var key in moduleExports) { + if (isSafeExport(key)) { + continue; + } + var exportValue = moduleExports[key]; + signature.push(key); + signature.push(runtime_1.default.getFamilyByType(exportValue)); + } + return signature; +} +var isUpdateScheduled = false; +function scheduleUpdate() { + if (isUpdateScheduled) { + return; + } + function canApplyUpdate() { + return module.hot.status() === 'idle'; + } + isUpdateScheduled = true; + setTimeout(function () { + isUpdateScheduled = false; + // Only trigger refresh if the webpack HMR state is idle + if (canApplyUpdate()) { + try { + runtime_1.default.performReactRefresh(); + } + catch (err) { + console.warn('Warning: Failed to re-render. We will retry on the next Fast Refresh event.\n' + + err); + } + return; + } + return scheduleUpdate(); + }, 30); +} +// Needs to be compatible with IE11 +exports.default = { + registerExportsForReactRefresh: registerExportsForReactRefresh, + isReactRefreshBoundary: isReactRefreshBoundary, + shouldInvalidateReactRefreshBoundary: shouldInvalidateReactRefreshBoundary, + getRefreshBoundarySignature: getRefreshBoundarySignature, + scheduleUpdate: scheduleUpdate, +}; +//# sourceMappingURL=helpers.js.map + +/***/ }), + +/***/ "./node_modules/@next/react-refresh-utils/runtime.js": +/*!***********************************************************!*\ + !*** ./node_modules/@next/react-refresh-utils/runtime.js ***! + \***********************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const runtime_1 = __importDefault(__webpack_require__(/*! react-refresh/runtime */ "./node_modules/react-refresh/runtime.js")); +const helpers_1 = __importDefault(__webpack_require__(/*! ./internal/helpers */ "./node_modules/@next/react-refresh-utils/internal/helpers.js")); +// Hook into ReactDOM initialization +runtime_1.default.injectIntoGlobalHook(self); +// Register global helpers +self.$RefreshHelpers$ = helpers_1.default; +// Register a helper for module execution interception +self.$RefreshInterceptModuleExecution$ = function (webpackModuleId) { + var prevRefreshReg = self.$RefreshReg$; + var prevRefreshSig = self.$RefreshSig$; + self.$RefreshReg$ = function (type, id) { + runtime_1.default.register(type, webpackModuleId + ' ' + id); + }; + self.$RefreshSig$ = runtime_1.default.createSignatureFunctionForTransform; + // Modeled after `useEffect` cleanup pattern: + // https://reactjs.org/docs/hooks-effect.html#effects-with-cleanup + return function () { + self.$RefreshReg$ = prevRefreshReg; + self.$RefreshSig$ = prevRefreshSig; + }; +}; +//# sourceMappingURL=runtime.js.map + +/***/ }), + +/***/ "./node_modules/react-refresh/cjs/react-refresh-runtime.development.js": +/*!*****************************************************************************!*\ + !*** ./node_modules/react-refresh/cjs/react-refresh-runtime.development.js ***! + \*****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** @license React vundefined + * react-refresh-runtime.development.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + + + +if (true) { + (function() { +'use strict'; + +// ATTENTION +// When adding new symbols to this file, +// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols' +// The Symbol used to tag the ReactElement-like types. If there is no native Symbol +// nor polyfill, then a plain number is used for performance. +var REACT_ELEMENT_TYPE = 0xeac7; +var REACT_PORTAL_TYPE = 0xeaca; +var REACT_FRAGMENT_TYPE = 0xeacb; +var REACT_STRICT_MODE_TYPE = 0xeacc; +var REACT_PROFILER_TYPE = 0xead2; +var REACT_PROVIDER_TYPE = 0xeacd; +var REACT_CONTEXT_TYPE = 0xeace; +var REACT_FORWARD_REF_TYPE = 0xead0; +var REACT_SUSPENSE_TYPE = 0xead1; +var REACT_SUSPENSE_LIST_TYPE = 0xead8; +var REACT_MEMO_TYPE = 0xead3; +var REACT_LAZY_TYPE = 0xead4; +var REACT_BLOCK_TYPE = 0xead9; +var REACT_SERVER_BLOCK_TYPE = 0xeada; +var REACT_FUNDAMENTAL_TYPE = 0xead5; +var REACT_RESPONDER_TYPE = 0xead6; +var REACT_SCOPE_TYPE = 0xead7; +var REACT_OPAQUE_ID_TYPE = 0xeae0; +var REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1; +var REACT_OFFSCREEN_TYPE = 0xeae2; +var REACT_LEGACY_HIDDEN_TYPE = 0xeae3; + +if (typeof Symbol === 'function' && Symbol.for) { + var symbolFor = Symbol.for; + REACT_ELEMENT_TYPE = symbolFor('react.element'); + REACT_PORTAL_TYPE = symbolFor('react.portal'); + REACT_FRAGMENT_TYPE = symbolFor('react.fragment'); + REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode'); + REACT_PROFILER_TYPE = symbolFor('react.profiler'); + REACT_PROVIDER_TYPE = symbolFor('react.provider'); + REACT_CONTEXT_TYPE = symbolFor('react.context'); + REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref'); + REACT_SUSPENSE_TYPE = symbolFor('react.suspense'); + REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list'); + REACT_MEMO_TYPE = symbolFor('react.memo'); + REACT_LAZY_TYPE = symbolFor('react.lazy'); + REACT_BLOCK_TYPE = symbolFor('react.block'); + REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block'); + REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental'); + REACT_RESPONDER_TYPE = symbolFor('react.responder'); + REACT_SCOPE_TYPE = symbolFor('react.scope'); + REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id'); + REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode'); + REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen'); + REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden'); +} + +var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map; // We never remove these associations. +// It's OK to reference families, but use WeakMap/Set for types. + +var allFamiliesByID = new Map(); +var allFamiliesByType = new PossiblyWeakMap(); +var allSignaturesByType = new PossiblyWeakMap(); // This WeakMap is read by React, so we only put families +// that have actually been edited here. This keeps checks fast. +// $FlowIssue + +var updatedFamiliesByType = new PossiblyWeakMap(); // This is cleared on every performReactRefresh() call. +// It is an array of [Family, NextType] tuples. + +var pendingUpdates = []; // This is injected by the renderer via DevTools global hook. + +var helpersByRendererID = new Map(); +var helpersByRoot = new Map(); // We keep track of mounted roots so we can schedule updates. + +var mountedRoots = new Set(); // If a root captures an error, we remember it so we can retry on edit. + +var failedRoots = new Set(); // In environments that support WeakMap, we also remember the last element for every root. +// It needs to be weak because we do this even for roots that failed to mount. +// If there is no WeakMap, we won't attempt to do retrying. +// $FlowIssue + +var rootElements = // $FlowIssue +typeof WeakMap === 'function' ? new WeakMap() : null; +var isPerformingRefresh = false; + +function computeFullKey(signature) { + if (signature.fullKey !== null) { + return signature.fullKey; + } + + var fullKey = signature.ownKey; + var hooks; + + try { + hooks = signature.getCustomHooks(); + } catch (err) { + // This can happen in an edge case, e.g. if expression like Foo.useSomething + // depends on Foo which is lazily initialized during rendering. + // In that case just assume we'll have to remount. + signature.forceReset = true; + signature.fullKey = fullKey; + return fullKey; + } + + for (var i = 0; i < hooks.length; i++) { + var hook = hooks[i]; + + if (typeof hook !== 'function') { + // Something's wrong. Assume we need to remount. + signature.forceReset = true; + signature.fullKey = fullKey; + return fullKey; + } + + var nestedHookSignature = allSignaturesByType.get(hook); + + if (nestedHookSignature === undefined) { + // No signature means Hook wasn't in the source code, e.g. in a library. + // We'll skip it because we can assume it won't change during this session. + continue; + } + + var nestedHookKey = computeFullKey(nestedHookSignature); + + if (nestedHookSignature.forceReset) { + signature.forceReset = true; + } + + fullKey += '\n---\n' + nestedHookKey; + } + + signature.fullKey = fullKey; + return fullKey; +} + +function haveEqualSignatures(prevType, nextType) { + var prevSignature = allSignaturesByType.get(prevType); + var nextSignature = allSignaturesByType.get(nextType); + + if (prevSignature === undefined && nextSignature === undefined) { + return true; + } + + if (prevSignature === undefined || nextSignature === undefined) { + return false; + } + + if (computeFullKey(prevSignature) !== computeFullKey(nextSignature)) { + return false; + } + + if (nextSignature.forceReset) { + return false; + } + + return true; +} + +function isReactClass(type) { + return type.prototype && type.prototype.isReactComponent; +} + +function canPreserveStateBetween(prevType, nextType) { + if (isReactClass(prevType) || isReactClass(nextType)) { + return false; + } + + if (haveEqualSignatures(prevType, nextType)) { + return true; + } + + return false; +} + +function resolveFamily(type) { + // Only check updated types to keep lookups fast. + return updatedFamiliesByType.get(type); +} // If we didn't care about IE11, we could use new Map/Set(iterable). + + +function cloneMap(map) { + var clone = new Map(); + map.forEach(function (value, key) { + clone.set(key, value); + }); + return clone; +} + +function cloneSet(set) { + var clone = new Set(); + set.forEach(function (value) { + clone.add(value); + }); + return clone; +} + +function performReactRefresh() { + + if (pendingUpdates.length === 0) { + return null; + } + + if (isPerformingRefresh) { + return null; + } + + isPerformingRefresh = true; + + try { + var staleFamilies = new Set(); + var updatedFamilies = new Set(); + var updates = pendingUpdates; + pendingUpdates = []; + updates.forEach(function (_ref) { + var family = _ref[0], + nextType = _ref[1]; + // Now that we got a real edit, we can create associations + // that will be read by the React reconciler. + var prevType = family.current; + updatedFamiliesByType.set(prevType, family); + updatedFamiliesByType.set(nextType, family); + family.current = nextType; // Determine whether this should be a re-render or a re-mount. + + if (canPreserveStateBetween(prevType, nextType)) { + updatedFamilies.add(family); + } else { + staleFamilies.add(family); + } + }); // TODO: rename these fields to something more meaningful. + + var update = { + updatedFamilies: updatedFamilies, + // Families that will re-render preserving state + staleFamilies: staleFamilies // Families that will be remounted + + }; + helpersByRendererID.forEach(function (helpers) { + // Even if there are no roots, set the handler on first update. + // This ensures that if *new* roots are mounted, they'll use the resolve handler. + helpers.setRefreshHandler(resolveFamily); + }); + var didError = false; + var firstError = null; // We snapshot maps and sets that are mutated during commits. + // If we don't do this, there is a risk they will be mutated while + // we iterate over them. For example, trying to recover a failed root + // may cause another root to be added to the failed list -- an infinite loop. + + var failedRootsSnapshot = cloneSet(failedRoots); + var mountedRootsSnapshot = cloneSet(mountedRoots); + var helpersByRootSnapshot = cloneMap(helpersByRoot); + failedRootsSnapshot.forEach(function (root) { + var helpers = helpersByRootSnapshot.get(root); + + if (helpers === undefined) { + throw new Error('Could not find helpers for a root. This is a bug in React Refresh.'); + } + + if (!failedRoots.has(root)) {// No longer failed. + } + + if (rootElements === null) { + return; + } + + if (!rootElements.has(root)) { + return; + } + + var element = rootElements.get(root); + + try { + helpers.scheduleRoot(root, element); + } catch (err) { + if (!didError) { + didError = true; + firstError = err; + } // Keep trying other roots. + + } + }); + mountedRootsSnapshot.forEach(function (root) { + var helpers = helpersByRootSnapshot.get(root); + + if (helpers === undefined) { + throw new Error('Could not find helpers for a root. This is a bug in React Refresh.'); + } + + if (!mountedRoots.has(root)) {// No longer mounted. + } + + try { + helpers.scheduleRefresh(root, update); + } catch (err) { + if (!didError) { + didError = true; + firstError = err; + } // Keep trying other roots. + + } + }); + + if (didError) { + throw firstError; + } + + return update; + } finally { + isPerformingRefresh = false; + } +} +function register(type, id) { + { + if (type === null) { + return; + } + + if (typeof type !== 'function' && typeof type !== 'object') { + return; + } // This can happen in an edge case, e.g. if we register + // return value of a HOC but it returns a cached component. + // Ignore anything but the first registration for each type. + + + if (allFamiliesByType.has(type)) { + return; + } // Create family or remember to update it. + // None of this bookkeeping affects reconciliation + // until the first performReactRefresh() call above. + + + var family = allFamiliesByID.get(id); + + if (family === undefined) { + family = { + current: type + }; + allFamiliesByID.set(id, family); + } else { + pendingUpdates.push([family, type]); + } + + allFamiliesByType.set(type, family); // Visit inner types because we might not have registered them. + + if (typeof type === 'object' && type !== null) { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + register(type.render, id + '$render'); + break; + + case REACT_MEMO_TYPE: + register(type.type, id + '$type'); + break; + } + } + } +} +function setSignature(type, key) { + var forceReset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var getCustomHooks = arguments.length > 3 ? arguments[3] : undefined; + + { + allSignaturesByType.set(type, { + forceReset: forceReset, + ownKey: key, + fullKey: null, + getCustomHooks: getCustomHooks || function () { + return []; + } + }); + } +} // This is lazily called during first render for a type. +// It captures Hook list at that time so inline requires don't break comparisons. + +function collectCustomHooksForSignature(type) { + { + var signature = allSignaturesByType.get(type); + + if (signature !== undefined) { + computeFullKey(signature); + } + } +} +function getFamilyByID(id) { + { + return allFamiliesByID.get(id); + } +} +function getFamilyByType(type) { + { + return allFamiliesByType.get(type); + } +} +function findAffectedHostInstances(families) { + { + var affectedInstances = new Set(); + mountedRoots.forEach(function (root) { + var helpers = helpersByRoot.get(root); + + if (helpers === undefined) { + throw new Error('Could not find helpers for a root. This is a bug in React Refresh.'); + } + + var instancesForRoot = helpers.findHostInstancesForRefresh(root, families); + instancesForRoot.forEach(function (inst) { + affectedInstances.add(inst); + }); + }); + return affectedInstances; + } +} +function injectIntoGlobalHook(globalObject) { + { + // For React Native, the global hook will be set up by require('react-devtools-core'). + // That code will run before us. So we need to monkeypatch functions on existing hook. + // For React Web, the global hook will be set up by the extension. + // This will also run before us. + var hook = globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__; + + if (hook === undefined) { + // However, if there is no DevTools extension, we'll need to set up the global hook ourselves. + // Note that in this case it's important that renderer code runs *after* this method call. + // Otherwise, the renderer will think that there is no global hook, and won't do the injection. + var nextID = 0; + globalObject.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook = { + renderers: new Map(), + supportsFiber: true, + inject: function (injected) { + return nextID++; + }, + onScheduleFiberRoot: function (id, root, children) {}, + onCommitFiberRoot: function (id, root, maybePriorityLevel, didError) {}, + onCommitFiberUnmount: function () {} + }; + } // Here, we just want to get a reference to scheduleRefresh. + + + var oldInject = hook.inject; + + hook.inject = function (injected) { + var id = oldInject.apply(this, arguments); + + if (typeof injected.scheduleRefresh === 'function' && typeof injected.setRefreshHandler === 'function') { + // This version supports React Refresh. + helpersByRendererID.set(id, injected); + } + + return id; + }; // Do the same for any already injected roots. + // This is useful if ReactDOM has already been initialized. + // https://github.com/facebook/react/issues/17626 + + + hook.renderers.forEach(function (injected, id) { + if (typeof injected.scheduleRefresh === 'function' && typeof injected.setRefreshHandler === 'function') { + // This version supports React Refresh. + helpersByRendererID.set(id, injected); + } + }); // We also want to track currently mounted roots. + + var oldOnCommitFiberRoot = hook.onCommitFiberRoot; + + var oldOnScheduleFiberRoot = hook.onScheduleFiberRoot || function () {}; + + hook.onScheduleFiberRoot = function (id, root, children) { + if (!isPerformingRefresh) { + // If it was intentionally scheduled, don't attempt to restore. + // This includes intentionally scheduled unmounts. + failedRoots.delete(root); + + if (rootElements !== null) { + rootElements.set(root, children); + } + } + + return oldOnScheduleFiberRoot.apply(this, arguments); + }; + + hook.onCommitFiberRoot = function (id, root, maybePriorityLevel, didError) { + var helpers = helpersByRendererID.get(id); + + if (helpers === undefined) { + return; + } + + helpersByRoot.set(root, helpers); + var current = root.current; + var alternate = current.alternate; // We need to determine whether this root has just (un)mounted. + // This logic is copy-pasted from similar logic in the DevTools backend. + // If this breaks with some refactoring, you'll want to update DevTools too. + + if (alternate !== null) { + var wasMounted = alternate.memoizedState != null && alternate.memoizedState.element != null; + var isMounted = current.memoizedState != null && current.memoizedState.element != null; + + if (!wasMounted && isMounted) { + // Mount a new root. + mountedRoots.add(root); + failedRoots.delete(root); + } else if (wasMounted && isMounted) ; else if (wasMounted && !isMounted) { + // Unmount an existing root. + mountedRoots.delete(root); + + if (didError) { + // We'll remount it on future edits. + failedRoots.add(root); + } else { + helpersByRoot.delete(root); + } + } else if (!wasMounted && !isMounted) { + if (didError) { + // We'll remount it on future edits. + failedRoots.add(root); + } + } + } else { + // Mount a new root. + mountedRoots.add(root); + } + + return oldOnCommitFiberRoot.apply(this, arguments); + }; + } +} +function hasUnrecoverableErrors() { + // TODO: delete this after removing dependency in RN. + return false; +} // Exposed for testing. + +function _getMountedRootCount() { + { + return mountedRoots.size; + } +} // This is a wrapper over more primitive functions for setting signature. +// Signatures let us decide whether the Hook order has changed on refresh. +// +// This function is intended to be used as a transform target, e.g.: +// var _s = createSignatureFunctionForTransform() +// +// function Hello() { +// const [foo, setFoo] = useState(0); +// const value = useCustomHook(); +// _s(); /* Second call triggers collecting the custom Hook list. +// * This doesn't happen during the module evaluation because we +// * don't want to change the module order with inline requires. +// * Next calls are noops. */ +// return <h1>Hi</h1>; +// } +// +// /* First call specifies the signature: */ +// _s( +// Hello, +// 'useState{[foo, setFoo]}(0)', +// () => [useCustomHook], /* Lazy to avoid triggering inline requires */ +// ); + +function createSignatureFunctionForTransform() { + { + // We'll fill in the signature in two steps. + // First, we'll know the signature itself. This happens outside the component. + // Then, we'll know the references to custom Hooks. This happens inside the component. + // After that, the returned function will be a fast path no-op. + var status = 'needsSignature'; + var savedType; + var hasCustomHooks; + return function (type, key, forceReset, getCustomHooks) { + switch (status) { + case 'needsSignature': + if (type !== undefined) { + // If we received an argument, this is the initial registration call. + savedType = type; + hasCustomHooks = typeof getCustomHooks === 'function'; + setSignature(type, key, forceReset, getCustomHooks); // The next call we expect is from inside a function, to fill in the custom Hooks. + + status = 'needsCustomHooks'; + } + + break; + + case 'needsCustomHooks': + if (hasCustomHooks) { + collectCustomHooksForSignature(savedType); + } + + status = 'resolved'; + break; + } + + return type; + }; + } +} +function isLikelyComponentType(type) { + { + switch (typeof type) { + case 'function': + { + // First, deal with classes. + if (type.prototype != null) { + if (type.prototype.isReactComponent) { + // React class. + return true; + } + + var ownNames = Object.getOwnPropertyNames(type.prototype); + + if (ownNames.length > 1 || ownNames[0] !== 'constructor') { + // This looks like a class. + return false; + } // eslint-disable-next-line no-proto + + + if (type.prototype.__proto__ !== Object.prototype) { + // It has a superclass. + return false; + } // Pass through. + // This looks like a regular function with empty prototype. + + } // For plain functions and arrows, use name as a heuristic. + + + var name = type.name || type.displayName; + return typeof name === 'string' && /^[A-Z]/.test(name); + } + + case 'object': + { + if (type != null) { + switch (type.$$typeof) { + case REACT_FORWARD_REF_TYPE: + case REACT_MEMO_TYPE: + // Definitely React components. + return true; + + default: + return false; + } + } + + return false; + } + + default: + { + return false; + } + } + } +} + +exports._getMountedRootCount = _getMountedRootCount; +exports.collectCustomHooksForSignature = collectCustomHooksForSignature; +exports.createSignatureFunctionForTransform = createSignatureFunctionForTransform; +exports.findAffectedHostInstances = findAffectedHostInstances; +exports.getFamilyByID = getFamilyByID; +exports.getFamilyByType = getFamilyByType; +exports.hasUnrecoverableErrors = hasUnrecoverableErrors; +exports.injectIntoGlobalHook = injectIntoGlobalHook; +exports.isLikelyComponentType = isLikelyComponentType; +exports.performReactRefresh = performReactRefresh; +exports.register = register; +exports.setSignature = setSignature; + })(); +} + + +/***/ }), + +/***/ "./node_modules/react-refresh/runtime.js": +/*!***********************************************!*\ + !*** ./node_modules/react-refresh/runtime.js ***! + \***********************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +if (false) {} else { + module.exports = __webpack_require__(/*! ./cjs/react-refresh-runtime.development.js */ "./node_modules/react-refresh/cjs/react-refresh-runtime.development.js"); +} + + +/***/ }) + +},[["./node_modules/@next/react-refresh-utils/runtime.js","webpack"]]]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LXJlZnJlc2gtdXRpbHMvaW50ZXJuYWwvaGVscGVycy5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL0BuZXh0L3JlYWN0LXJlZnJlc2gtdXRpbHMvcnVudGltZS5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZnJlc2gvY2pzL3JlYWN0LXJlZnJlc2gtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIndlYnBhY2s6Ly9fTl9FLy4vbm9kZV9tb2R1bGVzL3JlYWN0LXJlZnJlc2gvcnVudGltZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0EsOENBQThDLGNBQWM7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsbUJBQU8sQ0FBQyxzRUFBdUI7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDBCQUEwQjtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxvQ0FBb0M7QUFDcEM7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULDZEQUE2RDtBQUM3RCwrRUFBK0U7QUFDL0U7QUFDQTtBQUNBLEtBQUs7OztBQUdMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssRUFBRTs7QUFFUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsb0NBQW9DO0FBQzdDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxjQUFjO0FBQzdCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRUFBZ0U7O0FBRWhFO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOzs7QUFHYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUEsV0FBVzs7O0FBR1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7Ozs7Ozs7QUNscUJhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQztBQUNELG1CQUFtQixtQkFBTyxDQUFDLHlIQUE0QztBQUN2RSIsImZpbGUiOiJzdGF0aWMvY2h1bmtzL3JlYWN0LXJlZnJlc2guanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyBUaGlzIGZpbGUgaXMgY29waWVkIGZyb20gdGhlIE1ldHJvIEphdmFTY3JpcHQgYnVuZGxlciwgd2l0aCBtaW5vciB0d2Vha3MgZm9yXG4vLyB3ZWJwYWNrIDQgY29tcGF0aWJpbGl0eS5cbi8vXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svbWV0cm8vYmxvYi9kNmI5Njg1YzczMGQwZDYzNTc3ZGI0MGY0MTM2OTE1N2YyOGRmYTNhL3BhY2thZ2VzL21ldHJvL3NyYy9saWIvcG9seWZpbGxzL3JlcXVpcmUuanNcbmNvbnN0IHJ1bnRpbWVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicmVhY3QtcmVmcmVzaC9ydW50aW1lXCIpKTtcbmZ1bmN0aW9uIGlzU2FmZUV4cG9ydChrZXkpIHtcbiAgICByZXR1cm4gKGtleSA9PT0gJ19fZXNNb2R1bGUnIHx8XG4gICAgICAgIGtleSA9PT0gJ19fTl9TU0cnIHx8XG4gICAgICAgIGtleSA9PT0gJ19fTl9TU1AnIHx8XG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGtleSBmcm9tIHBhZ2UgY29uZmlnIGluc3RlYWQgb2YgYWxsb3cgbGlzdGluZyBpdFxuICAgICAgICBrZXkgPT09ICdjb25maWcnKTtcbn1cbmZ1bmN0aW9uIHJlZ2lzdGVyRXhwb3J0c0ZvclJlYWN0UmVmcmVzaChtb2R1bGVFeHBvcnRzLCBtb2R1bGVJRCkge1xuICAgIHJ1bnRpbWVfMS5kZWZhdWx0LnJlZ2lzdGVyKG1vZHVsZUV4cG9ydHMsIG1vZHVsZUlEICsgJyAlZXhwb3J0cyUnKTtcbiAgICBpZiAobW9kdWxlRXhwb3J0cyA9PSBudWxsIHx8IHR5cGVvZiBtb2R1bGVFeHBvcnRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBFeGl0IGlmIHdlIGNhbid0IGl0ZXJhdGUgb3ZlciBleHBvcnRzLlxuICAgICAgICAvLyAoVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGxlZ2FjeSBlbnZpcm9ubWVudHMuKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAodmFyIGtleSBpbiBtb2R1bGVFeHBvcnRzKSB7XG4gICAgICAgIGlmIChpc1NhZmVFeHBvcnQoa2V5KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGV4cG9ydFZhbHVlID0gbW9kdWxlRXhwb3J0c1trZXldO1xuICAgICAgICB2YXIgdHlwZUlEID0gbW9kdWxlSUQgKyAnICVleHBvcnRzJSAnICsga2V5O1xuICAgICAgICBydW50aW1lXzEuZGVmYXVsdC5yZWdpc3RlcihleHBvcnRWYWx1ZSwgdHlwZUlEKTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1JlYWN0UmVmcmVzaEJvdW5kYXJ5KG1vZHVsZUV4cG9ydHMpIHtcbiAgICBpZiAocnVudGltZV8xLmRlZmF1bHQuaXNMaWtlbHlDb21wb25lbnRUeXBlKG1vZHVsZUV4cG9ydHMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobW9kdWxlRXhwb3J0cyA9PSBudWxsIHx8IHR5cGVvZiBtb2R1bGVFeHBvcnRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBFeGl0IGlmIHdlIGNhbid0IGl0ZXJhdGUgb3ZlciBleHBvcnRzLlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBoYXNFeHBvcnRzID0gZmFsc2U7XG4gICAgdmFyIGFyZUFsbEV4cG9ydHNDb21wb25lbnRzID0gdHJ1ZTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbW9kdWxlRXhwb3J0cykge1xuICAgICAgICBoYXNFeHBvcnRzID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzU2FmZUV4cG9ydChrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXhwb3J0VmFsdWUgPSBtb2R1bGVFeHBvcnRzW2tleV07XG4gICAgICAgIGlmICghcnVudGltZV8xLmRlZmF1bHQuaXNMaWtlbHlDb21wb25lbnRUeXBlKGV4cG9ydFZhbHVlKSkge1xuICAgICAgICAgICAgYXJlQWxsRXhwb3J0c0NvbXBvbmVudHMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzRXhwb3J0cyAmJiBhcmVBbGxFeHBvcnRzQ29tcG9uZW50cztcbn1cbmZ1bmN0aW9uIHNob3VsZEludmFsaWRhdGVSZWFjdFJlZnJlc2hCb3VuZGFyeShwcmV2RXhwb3J0cywgbmV4dEV4cG9ydHMpIHtcbiAgICB2YXIgcHJldlNpZ25hdHVyZSA9IGdldFJlZnJlc2hCb3VuZGFyeVNpZ25hdHVyZShwcmV2RXhwb3J0cyk7XG4gICAgdmFyIG5leHRTaWduYXR1cmUgPSBnZXRSZWZyZXNoQm91bmRhcnlTaWduYXR1cmUobmV4dEV4cG9ydHMpO1xuICAgIGlmIChwcmV2U2lnbmF0dXJlLmxlbmd0aCAhPT0gbmV4dFNpZ25hdHVyZS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV4dFNpZ25hdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocHJldlNpZ25hdHVyZVtpXSAhPT0gbmV4dFNpZ25hdHVyZVtpXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UmVmcmVzaEJvdW5kYXJ5U2lnbmF0dXJlKG1vZHVsZUV4cG9ydHMpIHtcbiAgICB2YXIgc2lnbmF0dXJlID0gW107XG4gICAgc2lnbmF0dXJlLnB1c2gocnVudGltZV8xLmRlZmF1bHQuZ2V0RmFtaWx5QnlUeXBlKG1vZHVsZUV4cG9ydHMpKTtcbiAgICBpZiAobW9kdWxlRXhwb3J0cyA9PSBudWxsIHx8IHR5cGVvZiBtb2R1bGVFeHBvcnRzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBFeGl0IGlmIHdlIGNhbid0IGl0ZXJhdGUgb3ZlciBleHBvcnRzLlxuICAgICAgICAvLyAoVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGxlZ2FjeSBlbnZpcm9ubWVudHMuKVxuICAgICAgICByZXR1cm4gc2lnbmF0dXJlO1xuICAgIH1cbiAgICBmb3IgKHZhciBrZXkgaW4gbW9kdWxlRXhwb3J0cykge1xuICAgICAgICBpZiAoaXNTYWZlRXhwb3J0KGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBleHBvcnRWYWx1ZSA9IG1vZHVsZUV4cG9ydHNba2V5XTtcbiAgICAgICAgc2lnbmF0dXJlLnB1c2goa2V5KTtcbiAgICAgICAgc2lnbmF0dXJlLnB1c2gocnVudGltZV8xLmRlZmF1bHQuZ2V0RmFtaWx5QnlUeXBlKGV4cG9ydFZhbHVlKSk7XG4gICAgfVxuICAgIHJldHVybiBzaWduYXR1cmU7XG59XG52YXIgaXNVcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlKCkge1xuICAgIGlmIChpc1VwZGF0ZVNjaGVkdWxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbkFwcGx5VXBkYXRlKCkge1xuICAgICAgICByZXR1cm4gbW9kdWxlLmhvdC5zdGF0dXMoKSA9PT0gJ2lkbGUnO1xuICAgIH1cbiAgICBpc1VwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlzVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICAgIC8vIE9ubHkgdHJpZ2dlciByZWZyZXNoIGlmIHRoZSB3ZWJwYWNrIEhNUiBzdGF0ZSBpcyBpZGxlXG4gICAgICAgIGlmIChjYW5BcHBseVVwZGF0ZSgpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJ1bnRpbWVfMS5kZWZhdWx0LnBlcmZvcm1SZWFjdFJlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1dhcm5pbmc6IEZhaWxlZCB0byByZS1yZW5kZXIuIFdlIHdpbGwgcmV0cnkgb24gdGhlIG5leHQgRmFzdCBSZWZyZXNoIGV2ZW50LlxcbicgK1xuICAgICAgICAgICAgICAgICAgICBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzY2hlZHVsZVVwZGF0ZSgpO1xuICAgIH0sIDMwKTtcbn1cbi8vIE5lZWRzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBJRTExXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gICAgcmVnaXN0ZXJFeHBvcnRzRm9yUmVhY3RSZWZyZXNoOiByZWdpc3RlckV4cG9ydHNGb3JSZWFjdFJlZnJlc2gsXG4gICAgaXNSZWFjdFJlZnJlc2hCb3VuZGFyeTogaXNSZWFjdFJlZnJlc2hCb3VuZGFyeSxcbiAgICBzaG91bGRJbnZhbGlkYXRlUmVhY3RSZWZyZXNoQm91bmRhcnk6IHNob3VsZEludmFsaWRhdGVSZWFjdFJlZnJlc2hCb3VuZGFyeSxcbiAgICBnZXRSZWZyZXNoQm91bmRhcnlTaWduYXR1cmU6IGdldFJlZnJlc2hCb3VuZGFyeVNpZ25hdHVyZSxcbiAgICBzY2hlZHVsZVVwZGF0ZTogc2NoZWR1bGVVcGRhdGUsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aGVscGVycy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHJ1bnRpbWVfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicmVhY3QtcmVmcmVzaC9ydW50aW1lXCIpKTtcbmNvbnN0IGhlbHBlcnNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi9pbnRlcm5hbC9oZWxwZXJzXCIpKTtcbi8vIEhvb2sgaW50byBSZWFjdERPTSBpbml0aWFsaXphdGlvblxucnVudGltZV8xLmRlZmF1bHQuaW5qZWN0SW50b0dsb2JhbEhvb2soc2VsZik7XG4vLyBSZWdpc3RlciBnbG9iYWwgaGVscGVyc1xuc2VsZi4kUmVmcmVzaEhlbHBlcnMkID0gaGVscGVyc18xLmRlZmF1bHQ7XG4vLyBSZWdpc3RlciBhIGhlbHBlciBmb3IgbW9kdWxlIGV4ZWN1dGlvbiBpbnRlcmNlcHRpb25cbnNlbGYuJFJlZnJlc2hJbnRlcmNlcHRNb2R1bGVFeGVjdXRpb24kID0gZnVuY3Rpb24gKHdlYnBhY2tNb2R1bGVJZCkge1xuICAgIHZhciBwcmV2UmVmcmVzaFJlZyA9IHNlbGYuJFJlZnJlc2hSZWckO1xuICAgIHZhciBwcmV2UmVmcmVzaFNpZyA9IHNlbGYuJFJlZnJlc2hTaWckO1xuICAgIHNlbGYuJFJlZnJlc2hSZWckID0gZnVuY3Rpb24gKHR5cGUsIGlkKSB7XG4gICAgICAgIHJ1bnRpbWVfMS5kZWZhdWx0LnJlZ2lzdGVyKHR5cGUsIHdlYnBhY2tNb2R1bGVJZCArICcgJyArIGlkKTtcbiAgICB9O1xuICAgIHNlbGYuJFJlZnJlc2hTaWckID0gcnVudGltZV8xLmRlZmF1bHQuY3JlYXRlU2lnbmF0dXJlRnVuY3Rpb25Gb3JUcmFuc2Zvcm07XG4gICAgLy8gTW9kZWxlZCBhZnRlciBgdXNlRWZmZWN0YCBjbGVhbnVwIHBhdHRlcm46XG4gICAgLy8gaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2hvb2tzLWVmZmVjdC5odG1sI2VmZmVjdHMtd2l0aC1jbGVhbnVwXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi4kUmVmcmVzaFJlZyQgPSBwcmV2UmVmcmVzaFJlZztcbiAgICAgICAgc2VsZi4kUmVmcmVzaFNpZyQgPSBwcmV2UmVmcmVzaFNpZztcbiAgICB9O1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXJ1bnRpbWUuanMubWFwIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHZ1bmRlZmluZWRcbiAqIHJlYWN0LXJlZnJlc2gtcnVudGltZS5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyBBVFRFTlRJT05cbi8vIFdoZW4gYWRkaW5nIG5ldyBzeW1ib2xzIHRvIHRoaXMgZmlsZSxcbi8vIFBsZWFzZSBjb25zaWRlciBhbHNvIGFkZGluZyB0byAncmVhY3QtZGV2dG9vbHMtc2hhcmVkL3NyYy9iYWNrZW5kL1JlYWN0U3ltYm9scydcbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudC1saWtlIHR5cGVzLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gMHhlYWNhO1xudmFyIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IDB4ZWFjYztcbnZhciBSRUFDVF9QUk9GSUxFUl9UWVBFID0gMHhlYWQyO1xudmFyIFJFQUNUX1BST1ZJREVSX1RZUEUgPSAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gMHhlYWNlO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IDB4ZWFkMTtcbnZhciBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSAweGVhZDg7XG52YXIgUkVBQ1RfTUVNT19UWVBFID0gMHhlYWQzO1xudmFyIFJFQUNUX0xBWllfVFlQRSA9IDB4ZWFkNDtcbnZhciBSRUFDVF9CTE9DS19UWVBFID0gMHhlYWQ5O1xudmFyIFJFQUNUX1NFUlZFUl9CTE9DS19UWVBFID0gMHhlYWRhO1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IDB4ZWFkNztcbnZhciBSRUFDVF9PUEFRVUVfSURfVFlQRSA9IDB4ZWFlMDtcbnZhciBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IDB4ZWFlMTtcbnZhciBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IDB4ZWFlMjtcbnZhciBSRUFDVF9MRUdBQ1lfSElEREVOX1RZUEUgPSAweGVhZTM7XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3IpIHtcbiAgdmFyIHN5bWJvbEZvciA9IFN5bWJvbC5mb3I7XG4gIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZWxlbWVudCcpO1xuICBSRUFDVF9QT1JUQUxfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QucG9ydGFsJyk7XG4gIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZyYWdtZW50Jyk7XG4gIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN0cmljdF9tb2RlJyk7XG4gIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb2ZpbGVyJyk7XG4gIFJFQUNUX1BST1ZJREVSX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnByb3ZpZGVyJyk7XG4gIFJFQUNUX0NPTlRFWFRfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuY29udGV4dCcpO1xuICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpO1xuICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5zdXNwZW5zZScpO1xuICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKTtcbiAgUkVBQ1RfTUVNT19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5tZW1vJyk7XG4gIFJFQUNUX0xBWllfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGF6eScpO1xuICBSRUFDVF9CTE9DS19UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5ibG9jaycpO1xuICBSRUFDVF9TRVJWRVJfQkxPQ0tfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2VydmVyLmJsb2NrJyk7XG4gIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJyk7XG4gIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gc3ltYm9sRm9yKCdyZWFjdC5yZXNwb25kZXInKTtcbiAgUkVBQ1RfU0NPUEVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3Quc2NvcGUnKTtcbiAgUkVBQ1RfT1BBUVVFX0lEX1RZUEUgPSBzeW1ib2xGb3IoJ3JlYWN0Lm9wYXF1ZS5pZCcpO1xuICBSRUFDVF9ERUJVR19UUkFDSU5HX01PREVfVFlQRSA9IHN5bWJvbEZvcigncmVhY3QuZGVidWdfdHJhY2VfbW9kZScpO1xuICBSRUFDVF9PRkZTQ1JFRU5fVFlQRSA9IHN5bWJvbEZvcigncmVhY3Qub2Zmc2NyZWVuJyk7XG4gIFJFQUNUX0xFR0FDWV9ISURERU5fVFlQRSA9IHN5bWJvbEZvcigncmVhY3QubGVnYWN5X2hpZGRlbicpO1xufVxuXG52YXIgUG9zc2libHlXZWFrTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogTWFwOyAvLyBXZSBuZXZlciByZW1vdmUgdGhlc2UgYXNzb2NpYXRpb25zLlxuLy8gSXQncyBPSyB0byByZWZlcmVuY2UgZmFtaWxpZXMsIGJ1dCB1c2UgV2Vha01hcC9TZXQgZm9yIHR5cGVzLlxuXG52YXIgYWxsRmFtaWxpZXNCeUlEID0gbmV3IE1hcCgpO1xudmFyIGFsbEZhbWlsaWVzQnlUeXBlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xudmFyIGFsbFNpZ25hdHVyZXNCeVR5cGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7IC8vIFRoaXMgV2Vha01hcCBpcyByZWFkIGJ5IFJlYWN0LCBzbyB3ZSBvbmx5IHB1dCBmYW1pbGllc1xuLy8gdGhhdCBoYXZlIGFjdHVhbGx5IGJlZW4gZWRpdGVkIGhlcmUuIFRoaXMga2VlcHMgY2hlY2tzIGZhc3QuXG4vLyAkRmxvd0lzc3VlXG5cbnZhciB1cGRhdGVkRmFtaWxpZXNCeVR5cGUgPSBuZXcgUG9zc2libHlXZWFrTWFwKCk7IC8vIFRoaXMgaXMgY2xlYXJlZCBvbiBldmVyeSBwZXJmb3JtUmVhY3RSZWZyZXNoKCkgY2FsbC5cbi8vIEl0IGlzIGFuIGFycmF5IG9mIFtGYW1pbHksIE5leHRUeXBlXSB0dXBsZXMuXG5cbnZhciBwZW5kaW5nVXBkYXRlcyA9IFtdOyAvLyBUaGlzIGlzIGluamVjdGVkIGJ5IHRoZSByZW5kZXJlciB2aWEgRGV2VG9vbHMgZ2xvYmFsIGhvb2suXG5cbnZhciBoZWxwZXJzQnlSZW5kZXJlcklEID0gbmV3IE1hcCgpO1xudmFyIGhlbHBlcnNCeVJvb3QgPSBuZXcgTWFwKCk7IC8vIFdlIGtlZXAgdHJhY2sgb2YgbW91bnRlZCByb290cyBzbyB3ZSBjYW4gc2NoZWR1bGUgdXBkYXRlcy5cblxudmFyIG1vdW50ZWRSb290cyA9IG5ldyBTZXQoKTsgLy8gSWYgYSByb290IGNhcHR1cmVzIGFuIGVycm9yLCB3ZSByZW1lbWJlciBpdCBzbyB3ZSBjYW4gcmV0cnkgb24gZWRpdC5cblxudmFyIGZhaWxlZFJvb3RzID0gbmV3IFNldCgpOyAvLyBJbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IFdlYWtNYXAsIHdlIGFsc28gcmVtZW1iZXIgdGhlIGxhc3QgZWxlbWVudCBmb3IgZXZlcnkgcm9vdC5cbi8vIEl0IG5lZWRzIHRvIGJlIHdlYWsgYmVjYXVzZSB3ZSBkbyB0aGlzIGV2ZW4gZm9yIHJvb3RzIHRoYXQgZmFpbGVkIHRvIG1vdW50LlxuLy8gSWYgdGhlcmUgaXMgbm8gV2Vha01hcCwgd2Ugd29uJ3QgYXR0ZW1wdCB0byBkbyByZXRyeWluZy5cbi8vICRGbG93SXNzdWVcblxudmFyIHJvb3RFbGVtZW50cyA9IC8vICRGbG93SXNzdWVcbnR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nID8gbmV3IFdlYWtNYXAoKSA6IG51bGw7XG52YXIgaXNQZXJmb3JtaW5nUmVmcmVzaCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjb21wdXRlRnVsbEtleShzaWduYXR1cmUpIHtcbiAgaWYgKHNpZ25hdHVyZS5mdWxsS2V5ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHNpZ25hdHVyZS5mdWxsS2V5O1xuICB9XG5cbiAgdmFyIGZ1bGxLZXkgPSBzaWduYXR1cmUub3duS2V5O1xuICB2YXIgaG9va3M7XG5cbiAgdHJ5IHtcbiAgICBob29rcyA9IHNpZ25hdHVyZS5nZXRDdXN0b21Ib29rcygpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gYW4gZWRnZSBjYXNlLCBlLmcuIGlmIGV4cHJlc3Npb24gbGlrZSBGb28udXNlU29tZXRoaW5nXG4gICAgLy8gZGVwZW5kcyBvbiBGb28gd2hpY2ggaXMgbGF6aWx5IGluaXRpYWxpemVkIGR1cmluZyByZW5kZXJpbmcuXG4gICAgLy8gSW4gdGhhdCBjYXNlIGp1c3QgYXNzdW1lIHdlJ2xsIGhhdmUgdG8gcmVtb3VudC5cbiAgICBzaWduYXR1cmUuZm9yY2VSZXNldCA9IHRydWU7XG4gICAgc2lnbmF0dXJlLmZ1bGxLZXkgPSBmdWxsS2V5O1xuICAgIHJldHVybiBmdWxsS2V5O1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBob29rcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBob29rID0gaG9va3NbaV07XG5cbiAgICBpZiAodHlwZW9mIGhvb2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFNvbWV0aGluZydzIHdyb25nLiBBc3N1bWUgd2UgbmVlZCB0byByZW1vdW50LlxuICAgICAgc2lnbmF0dXJlLmZvcmNlUmVzZXQgPSB0cnVlO1xuICAgICAgc2lnbmF0dXJlLmZ1bGxLZXkgPSBmdWxsS2V5O1xuICAgICAgcmV0dXJuIGZ1bGxLZXk7XG4gICAgfVxuXG4gICAgdmFyIG5lc3RlZEhvb2tTaWduYXR1cmUgPSBhbGxTaWduYXR1cmVzQnlUeXBlLmdldChob29rKTtcblxuICAgIGlmIChuZXN0ZWRIb29rU2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE5vIHNpZ25hdHVyZSBtZWFucyBIb29rIHdhc24ndCBpbiB0aGUgc291cmNlIGNvZGUsIGUuZy4gaW4gYSBsaWJyYXJ5LlxuICAgICAgLy8gV2UnbGwgc2tpcCBpdCBiZWNhdXNlIHdlIGNhbiBhc3N1bWUgaXQgd29uJ3QgY2hhbmdlIGR1cmluZyB0aGlzIHNlc3Npb24uXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbmVzdGVkSG9va0tleSA9IGNvbXB1dGVGdWxsS2V5KG5lc3RlZEhvb2tTaWduYXR1cmUpO1xuXG4gICAgaWYgKG5lc3RlZEhvb2tTaWduYXR1cmUuZm9yY2VSZXNldCkge1xuICAgICAgc2lnbmF0dXJlLmZvcmNlUmVzZXQgPSB0cnVlO1xuICAgIH1cblxuICAgIGZ1bGxLZXkgKz0gJ1xcbi0tLVxcbicgKyBuZXN0ZWRIb29rS2V5O1xuICB9XG5cbiAgc2lnbmF0dXJlLmZ1bGxLZXkgPSBmdWxsS2V5O1xuICByZXR1cm4gZnVsbEtleTtcbn1cblxuZnVuY3Rpb24gaGF2ZUVxdWFsU2lnbmF0dXJlcyhwcmV2VHlwZSwgbmV4dFR5cGUpIHtcbiAgdmFyIHByZXZTaWduYXR1cmUgPSBhbGxTaWduYXR1cmVzQnlUeXBlLmdldChwcmV2VHlwZSk7XG4gIHZhciBuZXh0U2lnbmF0dXJlID0gYWxsU2lnbmF0dXJlc0J5VHlwZS5nZXQobmV4dFR5cGUpO1xuXG4gIGlmIChwcmV2U2lnbmF0dXJlID09PSB1bmRlZmluZWQgJiYgbmV4dFNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocHJldlNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkIHx8IG5leHRTaWduYXR1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChjb21wdXRlRnVsbEtleShwcmV2U2lnbmF0dXJlKSAhPT0gY29tcHV0ZUZ1bGxLZXkobmV4dFNpZ25hdHVyZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAobmV4dFNpZ25hdHVyZS5mb3JjZVJlc2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzUmVhY3RDbGFzcyh0eXBlKSB7XG4gIHJldHVybiB0eXBlLnByb3RvdHlwZSAmJiB0eXBlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50O1xufVxuXG5mdW5jdGlvbiBjYW5QcmVzZXJ2ZVN0YXRlQmV0d2VlbihwcmV2VHlwZSwgbmV4dFR5cGUpIHtcbiAgaWYgKGlzUmVhY3RDbGFzcyhwcmV2VHlwZSkgfHwgaXNSZWFjdENsYXNzKG5leHRUeXBlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChoYXZlRXF1YWxTaWduYXR1cmVzKHByZXZUeXBlLCBuZXh0VHlwZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZhbWlseSh0eXBlKSB7XG4gIC8vIE9ubHkgY2hlY2sgdXBkYXRlZCB0eXBlcyB0byBrZWVwIGxvb2t1cHMgZmFzdC5cbiAgcmV0dXJuIHVwZGF0ZWRGYW1pbGllc0J5VHlwZS5nZXQodHlwZSk7XG59IC8vIElmIHdlIGRpZG4ndCBjYXJlIGFib3V0IElFMTEsIHdlIGNvdWxkIHVzZSBuZXcgTWFwL1NldChpdGVyYWJsZSkuXG5cblxuZnVuY3Rpb24gY2xvbmVNYXAobWFwKSB7XG4gIHZhciBjbG9uZSA9IG5ldyBNYXAoKTtcbiAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICBjbG9uZS5zZXQoa2V5LCB2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gY2xvbmU7XG59XG5cbmZ1bmN0aW9uIGNsb25lU2V0KHNldCkge1xuICB2YXIgY2xvbmUgPSBuZXcgU2V0KCk7XG4gIHNldC5mb3JFYWNoKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGNsb25lLmFkZCh2YWx1ZSk7XG4gIH0pO1xuICByZXR1cm4gY2xvbmU7XG59XG5cbmZ1bmN0aW9uIHBlcmZvcm1SZWFjdFJlZnJlc2goKSB7XG5cbiAgaWYgKHBlbmRpbmdVcGRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGlzUGVyZm9ybWluZ1JlZnJlc2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzUGVyZm9ybWluZ1JlZnJlc2ggPSB0cnVlO1xuXG4gIHRyeSB7XG4gICAgdmFyIHN0YWxlRmFtaWxpZXMgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHVwZGF0ZWRGYW1pbGllcyA9IG5ldyBTZXQoKTtcbiAgICB2YXIgdXBkYXRlcyA9IHBlbmRpbmdVcGRhdGVzO1xuICAgIHBlbmRpbmdVcGRhdGVzID0gW107XG4gICAgdXBkYXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgZmFtaWx5ID0gX3JlZlswXSxcbiAgICAgICAgICBuZXh0VHlwZSA9IF9yZWZbMV07XG4gICAgICAvLyBOb3cgdGhhdCB3ZSBnb3QgYSByZWFsIGVkaXQsIHdlIGNhbiBjcmVhdGUgYXNzb2NpYXRpb25zXG4gICAgICAvLyB0aGF0IHdpbGwgYmUgcmVhZCBieSB0aGUgUmVhY3QgcmVjb25jaWxlci5cbiAgICAgIHZhciBwcmV2VHlwZSA9IGZhbWlseS5jdXJyZW50O1xuICAgICAgdXBkYXRlZEZhbWlsaWVzQnlUeXBlLnNldChwcmV2VHlwZSwgZmFtaWx5KTtcbiAgICAgIHVwZGF0ZWRGYW1pbGllc0J5VHlwZS5zZXQobmV4dFR5cGUsIGZhbWlseSk7XG4gICAgICBmYW1pbHkuY3VycmVudCA9IG5leHRUeXBlOyAvLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIHNob3VsZCBiZSBhIHJlLXJlbmRlciBvciBhIHJlLW1vdW50LlxuXG4gICAgICBpZiAoY2FuUHJlc2VydmVTdGF0ZUJldHdlZW4ocHJldlR5cGUsIG5leHRUeXBlKSkge1xuICAgICAgICB1cGRhdGVkRmFtaWxpZXMuYWRkKGZhbWlseSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFsZUZhbWlsaWVzLmFkZChmYW1pbHkpO1xuICAgICAgfVxuICAgIH0pOyAvLyBUT0RPOiByZW5hbWUgdGhlc2UgZmllbGRzIHRvIHNvbWV0aGluZyBtb3JlIG1lYW5pbmdmdWwuXG5cbiAgICB2YXIgdXBkYXRlID0ge1xuICAgICAgdXBkYXRlZEZhbWlsaWVzOiB1cGRhdGVkRmFtaWxpZXMsXG4gICAgICAvLyBGYW1pbGllcyB0aGF0IHdpbGwgcmUtcmVuZGVyIHByZXNlcnZpbmcgc3RhdGVcbiAgICAgIHN0YWxlRmFtaWxpZXM6IHN0YWxlRmFtaWxpZXMgLy8gRmFtaWxpZXMgdGhhdCB3aWxsIGJlIHJlbW91bnRlZFxuXG4gICAgfTtcbiAgICBoZWxwZXJzQnlSZW5kZXJlcklELmZvckVhY2goZnVuY3Rpb24gKGhlbHBlcnMpIHtcbiAgICAgIC8vIEV2ZW4gaWYgdGhlcmUgYXJlIG5vIHJvb3RzLCBzZXQgdGhlIGhhbmRsZXIgb24gZmlyc3QgdXBkYXRlLlxuICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgaWYgKm5ldyogcm9vdHMgYXJlIG1vdW50ZWQsIHRoZXknbGwgdXNlIHRoZSByZXNvbHZlIGhhbmRsZXIuXG4gICAgICBoZWxwZXJzLnNldFJlZnJlc2hIYW5kbGVyKHJlc29sdmVGYW1pbHkpO1xuICAgIH0pO1xuICAgIHZhciBkaWRFcnJvciA9IGZhbHNlO1xuICAgIHZhciBmaXJzdEVycm9yID0gbnVsbDsgLy8gV2Ugc25hcHNob3QgbWFwcyBhbmQgc2V0cyB0aGF0IGFyZSBtdXRhdGVkIGR1cmluZyBjb21taXRzLlxuICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZXJlIGlzIGEgcmlzayB0aGV5IHdpbGwgYmUgbXV0YXRlZCB3aGlsZVxuICAgIC8vIHdlIGl0ZXJhdGUgb3ZlciB0aGVtLiBGb3IgZXhhbXBsZSwgdHJ5aW5nIHRvIHJlY292ZXIgYSBmYWlsZWQgcm9vdFxuICAgIC8vIG1heSBjYXVzZSBhbm90aGVyIHJvb3QgdG8gYmUgYWRkZWQgdG8gdGhlIGZhaWxlZCBsaXN0IC0tIGFuIGluZmluaXRlIGxvb3AuXG5cbiAgICB2YXIgZmFpbGVkUm9vdHNTbmFwc2hvdCA9IGNsb25lU2V0KGZhaWxlZFJvb3RzKTtcbiAgICB2YXIgbW91bnRlZFJvb3RzU25hcHNob3QgPSBjbG9uZVNldChtb3VudGVkUm9vdHMpO1xuICAgIHZhciBoZWxwZXJzQnlSb290U25hcHNob3QgPSBjbG9uZU1hcChoZWxwZXJzQnlSb290KTtcbiAgICBmYWlsZWRSb290c1NuYXBzaG90LmZvckVhY2goZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgIHZhciBoZWxwZXJzID0gaGVscGVyc0J5Um9vdFNuYXBzaG90LmdldChyb290KTtcblxuICAgICAgaWYgKGhlbHBlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGhlbHBlcnMgZm9yIGEgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCBSZWZyZXNoLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZhaWxlZFJvb3RzLmhhcyhyb290KSkgey8vIE5vIGxvbmdlciBmYWlsZWQuXG4gICAgICB9XG5cbiAgICAgIGlmIChyb290RWxlbWVudHMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXJvb3RFbGVtZW50cy5oYXMocm9vdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZWxlbWVudCA9IHJvb3RFbGVtZW50cy5nZXQocm9vdCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGhlbHBlcnMuc2NoZWR1bGVSb290KHJvb3QsIGVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghZGlkRXJyb3IpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgZmlyc3RFcnJvciA9IGVycjtcbiAgICAgICAgfSAvLyBLZWVwIHRyeWluZyBvdGhlciByb290cy5cblxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vdW50ZWRSb290c1NuYXBzaG90LmZvckVhY2goZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgIHZhciBoZWxwZXJzID0gaGVscGVyc0J5Um9vdFNuYXBzaG90LmdldChyb290KTtcblxuICAgICAgaWYgKGhlbHBlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGhlbHBlcnMgZm9yIGEgcm9vdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdCBSZWZyZXNoLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1vdW50ZWRSb290cy5oYXMocm9vdCkpIHsvLyBObyBsb25nZXIgbW91bnRlZC5cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgaGVscGVycy5zY2hlZHVsZVJlZnJlc2gocm9vdCwgdXBkYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoIWRpZEVycm9yKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGZpcnN0RXJyb3IgPSBlcnI7XG4gICAgICAgIH0gLy8gS2VlcCB0cnlpbmcgb3RoZXIgcm9vdHMuXG5cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChkaWRFcnJvcikge1xuICAgICAgdGhyb3cgZmlyc3RFcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlO1xuICB9IGZpbmFsbHkge1xuICAgIGlzUGVyZm9ybWluZ1JlZnJlc2ggPSBmYWxzZTtcbiAgfVxufVxuZnVuY3Rpb24gcmVnaXN0ZXIodHlwZSwgaWQpIHtcbiAge1xuICAgIGlmICh0eXBlID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gVGhpcyBjYW4gaGFwcGVuIGluIGFuIGVkZ2UgY2FzZSwgZS5nLiBpZiB3ZSByZWdpc3RlclxuICAgIC8vIHJldHVybiB2YWx1ZSBvZiBhIEhPQyBidXQgaXQgcmV0dXJucyBhIGNhY2hlZCBjb21wb25lbnQuXG4gICAgLy8gSWdub3JlIGFueXRoaW5nIGJ1dCB0aGUgZmlyc3QgcmVnaXN0cmF0aW9uIGZvciBlYWNoIHR5cGUuXG5cblxuICAgIGlmIChhbGxGYW1pbGllc0J5VHlwZS5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIENyZWF0ZSBmYW1pbHkgb3IgcmVtZW1iZXIgdG8gdXBkYXRlIGl0LlxuICAgIC8vIE5vbmUgb2YgdGhpcyBib29ra2VlcGluZyBhZmZlY3RzIHJlY29uY2lsaWF0aW9uXG4gICAgLy8gdW50aWwgdGhlIGZpcnN0IHBlcmZvcm1SZWFjdFJlZnJlc2goKSBjYWxsIGFib3ZlLlxuXG5cbiAgICB2YXIgZmFtaWx5ID0gYWxsRmFtaWxpZXNCeUlELmdldChpZCk7XG5cbiAgICBpZiAoZmFtaWx5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZhbWlseSA9IHtcbiAgICAgICAgY3VycmVudDogdHlwZVxuICAgICAgfTtcbiAgICAgIGFsbEZhbWlsaWVzQnlJRC5zZXQoaWQsIGZhbWlseSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlbmRpbmdVcGRhdGVzLnB1c2goW2ZhbWlseSwgdHlwZV0pO1xuICAgIH1cblxuICAgIGFsbEZhbWlsaWVzQnlUeXBlLnNldCh0eXBlLCBmYW1pbHkpOyAvLyBWaXNpdCBpbm5lciB0eXBlcyBiZWNhdXNlIHdlIG1pZ2h0IG5vdCBoYXZlIHJlZ2lzdGVyZWQgdGhlbS5cblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCkge1xuICAgICAgc3dpdGNoICh0eXBlLiQkdHlwZW9mKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICByZWdpc3Rlcih0eXBlLnJlbmRlciwgaWQgKyAnJHJlbmRlcicpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgIHJlZ2lzdGVyKHR5cGUudHlwZSwgaWQgKyAnJHR5cGUnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIHNldFNpZ25hdHVyZSh0eXBlLCBrZXkpIHtcbiAgdmFyIGZvcmNlUmVzZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IGZhbHNlO1xuICB2YXIgZ2V0Q3VzdG9tSG9va3MgPSBhcmd1bWVudHMubGVuZ3RoID4gMyA/IGFyZ3VtZW50c1szXSA6IHVuZGVmaW5lZDtcblxuICB7XG4gICAgYWxsU2lnbmF0dXJlc0J5VHlwZS5zZXQodHlwZSwge1xuICAgICAgZm9yY2VSZXNldDogZm9yY2VSZXNldCxcbiAgICAgIG93bktleToga2V5LFxuICAgICAgZnVsbEtleTogbnVsbCxcbiAgICAgIGdldEN1c3RvbUhvb2tzOiBnZXRDdXN0b21Ib29rcyB8fCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSAvLyBUaGlzIGlzIGxhemlseSBjYWxsZWQgZHVyaW5nIGZpcnN0IHJlbmRlciBmb3IgYSB0eXBlLlxuLy8gSXQgY2FwdHVyZXMgSG9vayBsaXN0IGF0IHRoYXQgdGltZSBzbyBpbmxpbmUgcmVxdWlyZXMgZG9uJ3QgYnJlYWsgY29tcGFyaXNvbnMuXG5cbmZ1bmN0aW9uIGNvbGxlY3RDdXN0b21Ib29rc0ZvclNpZ25hdHVyZSh0eXBlKSB7XG4gIHtcbiAgICB2YXIgc2lnbmF0dXJlID0gYWxsU2lnbmF0dXJlc0J5VHlwZS5nZXQodHlwZSk7XG5cbiAgICBpZiAoc2lnbmF0dXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbXB1dGVGdWxsS2V5KHNpZ25hdHVyZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRGYW1pbHlCeUlEKGlkKSB7XG4gIHtcbiAgICByZXR1cm4gYWxsRmFtaWxpZXNCeUlELmdldChpZCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldEZhbWlseUJ5VHlwZSh0eXBlKSB7XG4gIHtcbiAgICByZXR1cm4gYWxsRmFtaWxpZXNCeVR5cGUuZ2V0KHR5cGUpO1xuICB9XG59XG5mdW5jdGlvbiBmaW5kQWZmZWN0ZWRIb3N0SW5zdGFuY2VzKGZhbWlsaWVzKSB7XG4gIHtcbiAgICB2YXIgYWZmZWN0ZWRJbnN0YW5jZXMgPSBuZXcgU2V0KCk7XG4gICAgbW91bnRlZFJvb3RzLmZvckVhY2goZnVuY3Rpb24gKHJvb3QpIHtcbiAgICAgIHZhciBoZWxwZXJzID0gaGVscGVyc0J5Um9vdC5nZXQocm9vdCk7XG5cbiAgICAgIGlmIChoZWxwZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBoZWxwZXJzIGZvciBhIHJvb3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QgUmVmcmVzaC4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluc3RhbmNlc0ZvclJvb3QgPSBoZWxwZXJzLmZpbmRIb3N0SW5zdGFuY2VzRm9yUmVmcmVzaChyb290LCBmYW1pbGllcyk7XG4gICAgICBpbnN0YW5jZXNGb3JSb290LmZvckVhY2goZnVuY3Rpb24gKGluc3QpIHtcbiAgICAgICAgYWZmZWN0ZWRJbnN0YW5jZXMuYWRkKGluc3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFmZmVjdGVkSW5zdGFuY2VzO1xuICB9XG59XG5mdW5jdGlvbiBpbmplY3RJbnRvR2xvYmFsSG9vayhnbG9iYWxPYmplY3QpIHtcbiAge1xuICAgIC8vIEZvciBSZWFjdCBOYXRpdmUsIHRoZSBnbG9iYWwgaG9vayB3aWxsIGJlIHNldCB1cCBieSByZXF1aXJlKCdyZWFjdC1kZXZ0b29scy1jb3JlJykuXG4gICAgLy8gVGhhdCBjb2RlIHdpbGwgcnVuIGJlZm9yZSB1cy4gU28gd2UgbmVlZCB0byBtb25rZXlwYXRjaCBmdW5jdGlvbnMgb24gZXhpc3RpbmcgaG9vay5cbiAgICAvLyBGb3IgUmVhY3QgV2ViLCB0aGUgZ2xvYmFsIGhvb2sgd2lsbCBiZSBzZXQgdXAgYnkgdGhlIGV4dGVuc2lvbi5cbiAgICAvLyBUaGlzIHdpbGwgYWxzbyBydW4gYmVmb3JlIHVzLlxuICAgIHZhciBob29rID0gZ2xvYmFsT2JqZWN0Ll9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztcblxuICAgIGlmIChob29rID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIG5vIERldlRvb2xzIGV4dGVuc2lvbiwgd2UnbGwgbmVlZCB0byBzZXQgdXAgdGhlIGdsb2JhbCBob29rIG91cnNlbHZlcy5cbiAgICAgIC8vIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgaXQncyBpbXBvcnRhbnQgdGhhdCByZW5kZXJlciBjb2RlIHJ1bnMgKmFmdGVyKiB0aGlzIG1ldGhvZCBjYWxsLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgcmVuZGVyZXIgd2lsbCB0aGluayB0aGF0IHRoZXJlIGlzIG5vIGdsb2JhbCBob29rLCBhbmQgd29uJ3QgZG8gdGhlIGluamVjdGlvbi5cbiAgICAgIHZhciBuZXh0SUQgPSAwO1xuICAgICAgZ2xvYmFsT2JqZWN0Ll9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9IGhvb2sgPSB7XG4gICAgICAgIHJlbmRlcmVyczogbmV3IE1hcCgpLFxuICAgICAgICBzdXBwb3J0c0ZpYmVyOiB0cnVlLFxuICAgICAgICBpbmplY3Q6IGZ1bmN0aW9uIChpbmplY3RlZCkge1xuICAgICAgICAgIHJldHVybiBuZXh0SUQrKztcbiAgICAgICAgfSxcbiAgICAgICAgb25TY2hlZHVsZUZpYmVyUm9vdDogZnVuY3Rpb24gKGlkLCByb290LCBjaGlsZHJlbikge30sXG4gICAgICAgIG9uQ29tbWl0RmliZXJSb290OiBmdW5jdGlvbiAoaWQsIHJvb3QsIG1heWJlUHJpb3JpdHlMZXZlbCwgZGlkRXJyb3IpIHt9LFxuICAgICAgICBvbkNvbW1pdEZpYmVyVW5tb3VudDogZnVuY3Rpb24gKCkge31cbiAgICAgIH07XG4gICAgfSAvLyBIZXJlLCB3ZSBqdXN0IHdhbnQgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHNjaGVkdWxlUmVmcmVzaC5cblxuXG4gICAgdmFyIG9sZEluamVjdCA9IGhvb2suaW5qZWN0O1xuXG4gICAgaG9vay5pbmplY3QgPSBmdW5jdGlvbiAoaW5qZWN0ZWQpIHtcbiAgICAgIHZhciBpZCA9IG9sZEluamVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICBpZiAodHlwZW9mIGluamVjdGVkLnNjaGVkdWxlUmVmcmVzaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5qZWN0ZWQuc2V0UmVmcmVzaEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVGhpcyB2ZXJzaW9uIHN1cHBvcnRzIFJlYWN0IFJlZnJlc2guXG4gICAgICAgIGhlbHBlcnNCeVJlbmRlcmVySUQuc2V0KGlkLCBpbmplY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpZDtcbiAgICB9OyAvLyBEbyB0aGUgc2FtZSBmb3IgYW55IGFscmVhZHkgaW5qZWN0ZWQgcm9vdHMuXG4gICAgLy8gVGhpcyBpcyB1c2VmdWwgaWYgUmVhY3RET00gaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE3NjI2XG5cblxuICAgIGhvb2sucmVuZGVyZXJzLmZvckVhY2goZnVuY3Rpb24gKGluamVjdGVkLCBpZCkge1xuICAgICAgaWYgKHR5cGVvZiBpbmplY3RlZC5zY2hlZHVsZVJlZnJlc2ggPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluamVjdGVkLnNldFJlZnJlc2hIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRoaXMgdmVyc2lvbiBzdXBwb3J0cyBSZWFjdCBSZWZyZXNoLlxuICAgICAgICBoZWxwZXJzQnlSZW5kZXJlcklELnNldChpZCwgaW5qZWN0ZWQpO1xuICAgICAgfVxuICAgIH0pOyAvLyBXZSBhbHNvIHdhbnQgdG8gdHJhY2sgY3VycmVudGx5IG1vdW50ZWQgcm9vdHMuXG5cbiAgICB2YXIgb2xkT25Db21taXRGaWJlclJvb3QgPSBob29rLm9uQ29tbWl0RmliZXJSb290O1xuXG4gICAgdmFyIG9sZE9uU2NoZWR1bGVGaWJlclJvb3QgPSBob29rLm9uU2NoZWR1bGVGaWJlclJvb3QgfHwgZnVuY3Rpb24gKCkge307XG5cbiAgICBob29rLm9uU2NoZWR1bGVGaWJlclJvb3QgPSBmdW5jdGlvbiAoaWQsIHJvb3QsIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoIWlzUGVyZm9ybWluZ1JlZnJlc2gpIHtcbiAgICAgICAgLy8gSWYgaXQgd2FzIGludGVudGlvbmFsbHkgc2NoZWR1bGVkLCBkb24ndCBhdHRlbXB0IHRvIHJlc3RvcmUuXG4gICAgICAgIC8vIFRoaXMgaW5jbHVkZXMgaW50ZW50aW9uYWxseSBzY2hlZHVsZWQgdW5tb3VudHMuXG4gICAgICAgIGZhaWxlZFJvb3RzLmRlbGV0ZShyb290KTtcblxuICAgICAgICBpZiAocm9vdEVsZW1lbnRzICE9PSBudWxsKSB7XG4gICAgICAgICAgcm9vdEVsZW1lbnRzLnNldChyb290LCBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9sZE9uU2NoZWR1bGVGaWJlclJvb3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgaG9vay5vbkNvbW1pdEZpYmVyUm9vdCA9IGZ1bmN0aW9uIChpZCwgcm9vdCwgbWF5YmVQcmlvcml0eUxldmVsLCBkaWRFcnJvcikge1xuICAgICAgdmFyIGhlbHBlcnMgPSBoZWxwZXJzQnlSZW5kZXJlcklELmdldChpZCk7XG5cbiAgICAgIGlmIChoZWxwZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBoZWxwZXJzQnlSb290LnNldChyb290LCBoZWxwZXJzKTtcbiAgICAgIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50O1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGN1cnJlbnQuYWx0ZXJuYXRlOyAvLyBXZSBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgcm9vdCBoYXMganVzdCAodW4pbW91bnRlZC5cbiAgICAgIC8vIFRoaXMgbG9naWMgaXMgY29weS1wYXN0ZWQgZnJvbSBzaW1pbGFyIGxvZ2ljIGluIHRoZSBEZXZUb29scyBiYWNrZW5kLlxuICAgICAgLy8gSWYgdGhpcyBicmVha3Mgd2l0aCBzb21lIHJlZmFjdG9yaW5nLCB5b3UnbGwgd2FudCB0byB1cGRhdGUgRGV2VG9vbHMgdG9vLlxuXG4gICAgICBpZiAoYWx0ZXJuYXRlICE9PSBudWxsKSB7XG4gICAgICAgIHZhciB3YXNNb3VudGVkID0gYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUgIT0gbnVsbCAmJiBhbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5lbGVtZW50ICE9IG51bGw7XG4gICAgICAgIHZhciBpc01vdW50ZWQgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgIT0gbnVsbCAmJiBjdXJyZW50Lm1lbW9pemVkU3RhdGUuZWxlbWVudCAhPSBudWxsO1xuXG4gICAgICAgIGlmICghd2FzTW91bnRlZCAmJiBpc01vdW50ZWQpIHtcbiAgICAgICAgICAvLyBNb3VudCBhIG5ldyByb290LlxuICAgICAgICAgIG1vdW50ZWRSb290cy5hZGQocm9vdCk7XG4gICAgICAgICAgZmFpbGVkUm9vdHMuZGVsZXRlKHJvb3QpO1xuICAgICAgICB9IGVsc2UgaWYgKHdhc01vdW50ZWQgJiYgaXNNb3VudGVkKSA7IGVsc2UgaWYgKHdhc01vdW50ZWQgJiYgIWlzTW91bnRlZCkge1xuICAgICAgICAgIC8vIFVubW91bnQgYW4gZXhpc3Rpbmcgcm9vdC5cbiAgICAgICAgICBtb3VudGVkUm9vdHMuZGVsZXRlKHJvb3QpO1xuXG4gICAgICAgICAgaWYgKGRpZEVycm9yKSB7XG4gICAgICAgICAgICAvLyBXZSdsbCByZW1vdW50IGl0IG9uIGZ1dHVyZSBlZGl0cy5cbiAgICAgICAgICAgIGZhaWxlZFJvb3RzLmFkZChyb290KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVscGVyc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCF3YXNNb3VudGVkICYmICFpc01vdW50ZWQpIHtcbiAgICAgICAgICBpZiAoZGlkRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFdlJ2xsIHJlbW91bnQgaXQgb24gZnV0dXJlIGVkaXRzLlxuICAgICAgICAgICAgZmFpbGVkUm9vdHMuYWRkKHJvb3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTW91bnQgYSBuZXcgcm9vdC5cbiAgICAgICAgbW91bnRlZFJvb3RzLmFkZChyb290KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9sZE9uQ29tbWl0RmliZXJSb290LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gaGFzVW5yZWNvdmVyYWJsZUVycm9ycygpIHtcbiAgLy8gVE9ETzogZGVsZXRlIHRoaXMgYWZ0ZXIgcmVtb3ZpbmcgZGVwZW5kZW5jeSBpbiBSTi5cbiAgcmV0dXJuIGZhbHNlO1xufSAvLyBFeHBvc2VkIGZvciB0ZXN0aW5nLlxuXG5mdW5jdGlvbiBfZ2V0TW91bnRlZFJvb3RDb3VudCgpIHtcbiAge1xuICAgIHJldHVybiBtb3VudGVkUm9vdHMuc2l6ZTtcbiAgfVxufSAvLyBUaGlzIGlzIGEgd3JhcHBlciBvdmVyIG1vcmUgcHJpbWl0aXZlIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyBzaWduYXR1cmUuXG4vLyBTaWduYXR1cmVzIGxldCB1cyBkZWNpZGUgd2hldGhlciB0aGUgSG9vayBvcmRlciBoYXMgY2hhbmdlZCBvbiByZWZyZXNoLlxuLy9cbi8vIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIHRyYW5zZm9ybSB0YXJnZXQsIGUuZy46XG4vLyB2YXIgX3MgPSBjcmVhdGVTaWduYXR1cmVGdW5jdGlvbkZvclRyYW5zZm9ybSgpXG4vL1xuLy8gZnVuY3Rpb24gSGVsbG8oKSB7XG4vLyAgIGNvbnN0IFtmb28sIHNldEZvb10gPSB1c2VTdGF0ZSgwKTtcbi8vICAgY29uc3QgdmFsdWUgPSB1c2VDdXN0b21Ib29rKCk7XG4vLyAgIF9zKCk7IC8qIFNlY29uZCBjYWxsIHRyaWdnZXJzIGNvbGxlY3RpbmcgdGhlIGN1c3RvbSBIb29rIGxpc3QuXG4vLyAgICAgICAgICAqIFRoaXMgZG9lc24ndCBoYXBwZW4gZHVyaW5nIHRoZSBtb2R1bGUgZXZhbHVhdGlvbiBiZWNhdXNlIHdlXG4vLyAgICAgICAgICAqIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBtb2R1bGUgb3JkZXIgd2l0aCBpbmxpbmUgcmVxdWlyZXMuXG4vLyAgICAgICAgICAqIE5leHQgY2FsbHMgYXJlIG5vb3BzLiAqL1xuLy8gICByZXR1cm4gPGgxPkhpPC9oMT47XG4vLyB9XG4vL1xuLy8gLyogRmlyc3QgY2FsbCBzcGVjaWZpZXMgdGhlIHNpZ25hdHVyZTogKi9cbi8vIF9zKFxuLy8gICBIZWxsbyxcbi8vICAgJ3VzZVN0YXRle1tmb28sIHNldEZvb119KDApJyxcbi8vICAgKCkgPT4gW3VzZUN1c3RvbUhvb2tdLCAvKiBMYXp5IHRvIGF2b2lkIHRyaWdnZXJpbmcgaW5saW5lIHJlcXVpcmVzICovXG4vLyApO1xuXG5mdW5jdGlvbiBjcmVhdGVTaWduYXR1cmVGdW5jdGlvbkZvclRyYW5zZm9ybSgpIHtcbiAge1xuICAgIC8vIFdlJ2xsIGZpbGwgaW4gdGhlIHNpZ25hdHVyZSBpbiB0d28gc3RlcHMuXG4gICAgLy8gRmlyc3QsIHdlJ2xsIGtub3cgdGhlIHNpZ25hdHVyZSBpdHNlbGYuIFRoaXMgaGFwcGVucyBvdXRzaWRlIHRoZSBjb21wb25lbnQuXG4gICAgLy8gVGhlbiwgd2UnbGwga25vdyB0aGUgcmVmZXJlbmNlcyB0byBjdXN0b20gSG9va3MuIFRoaXMgaGFwcGVucyBpbnNpZGUgdGhlIGNvbXBvbmVudC5cbiAgICAvLyBBZnRlciB0aGF0LCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gd2lsbCBiZSBhIGZhc3QgcGF0aCBuby1vcC5cbiAgICB2YXIgc3RhdHVzID0gJ25lZWRzU2lnbmF0dXJlJztcbiAgICB2YXIgc2F2ZWRUeXBlO1xuICAgIHZhciBoYXNDdXN0b21Ib29rcztcbiAgICByZXR1cm4gZnVuY3Rpb24gKHR5cGUsIGtleSwgZm9yY2VSZXNldCwgZ2V0Q3VzdG9tSG9va3MpIHtcbiAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgJ25lZWRzU2lnbmF0dXJlJzpcbiAgICAgICAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSByZWNlaXZlZCBhbiBhcmd1bWVudCwgdGhpcyBpcyB0aGUgaW5pdGlhbCByZWdpc3RyYXRpb24gY2FsbC5cbiAgICAgICAgICAgIHNhdmVkVHlwZSA9IHR5cGU7XG4gICAgICAgICAgICBoYXNDdXN0b21Ib29rcyA9IHR5cGVvZiBnZXRDdXN0b21Ib29rcyA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAgIHNldFNpZ25hdHVyZSh0eXBlLCBrZXksIGZvcmNlUmVzZXQsIGdldEN1c3RvbUhvb2tzKTsgLy8gVGhlIG5leHQgY2FsbCB3ZSBleHBlY3QgaXMgZnJvbSBpbnNpZGUgYSBmdW5jdGlvbiwgdG8gZmlsbCBpbiB0aGUgY3VzdG9tIEhvb2tzLlxuXG4gICAgICAgICAgICBzdGF0dXMgPSAnbmVlZHNDdXN0b21Ib29rcyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbmVlZHNDdXN0b21Ib29rcyc6XG4gICAgICAgICAgaWYgKGhhc0N1c3RvbUhvb2tzKSB7XG4gICAgICAgICAgICBjb2xsZWN0Q3VzdG9tSG9va3NGb3JTaWduYXR1cmUoc2F2ZWRUeXBlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzdGF0dXMgPSAncmVzb2x2ZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBpc0xpa2VseUNvbXBvbmVudFR5cGUodHlwZSkge1xuICB7XG4gICAgc3dpdGNoICh0eXBlb2YgdHlwZSkge1xuICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICB7XG4gICAgICAgICAgLy8gRmlyc3QsIGRlYWwgd2l0aCBjbGFzc2VzLlxuICAgICAgICAgIGlmICh0eXBlLnByb3RvdHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCkge1xuICAgICAgICAgICAgICAvLyBSZWFjdCBjbGFzcy5cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvd25OYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHR5cGUucHJvdG90eXBlKTtcblxuICAgICAgICAgICAgaWYgKG93bk5hbWVzLmxlbmd0aCA+IDEgfHwgb3duTmFtZXNbMF0gIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBsaWtlIGEgY2xhc3MuXG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvXG5cblxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlLl9fcHJvdG9fXyAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgICAgICAgICAvLyBJdCBoYXMgYSBzdXBlcmNsYXNzLlxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IC8vIFBhc3MgdGhyb3VnaC5cbiAgICAgICAgICAgIC8vIFRoaXMgbG9va3MgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24gd2l0aCBlbXB0eSBwcm90b3R5cGUuXG5cbiAgICAgICAgICB9IC8vIEZvciBwbGFpbiBmdW5jdGlvbnMgYW5kIGFycm93cywgdXNlIG5hbWUgYXMgYSBoZXVyaXN0aWMuXG5cblxuICAgICAgICAgIHZhciBuYW1lID0gdHlwZS5uYW1lIHx8IHR5cGUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiAvXltBLVpdLy50ZXN0KG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIHtcbiAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgICAgICAvLyBEZWZpbml0ZWx5IFJlYWN0IGNvbXBvbmVudHMuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5fZ2V0TW91bnRlZFJvb3RDb3VudCA9IF9nZXRNb3VudGVkUm9vdENvdW50O1xuZXhwb3J0cy5jb2xsZWN0Q3VzdG9tSG9va3NGb3JTaWduYXR1cmUgPSBjb2xsZWN0Q3VzdG9tSG9va3NGb3JTaWduYXR1cmU7XG5leHBvcnRzLmNyZWF0ZVNpZ25hdHVyZUZ1bmN0aW9uRm9yVHJhbnNmb3JtID0gY3JlYXRlU2lnbmF0dXJlRnVuY3Rpb25Gb3JUcmFuc2Zvcm07XG5leHBvcnRzLmZpbmRBZmZlY3RlZEhvc3RJbnN0YW5jZXMgPSBmaW5kQWZmZWN0ZWRIb3N0SW5zdGFuY2VzO1xuZXhwb3J0cy5nZXRGYW1pbHlCeUlEID0gZ2V0RmFtaWx5QnlJRDtcbmV4cG9ydHMuZ2V0RmFtaWx5QnlUeXBlID0gZ2V0RmFtaWx5QnlUeXBlO1xuZXhwb3J0cy5oYXNVbnJlY292ZXJhYmxlRXJyb3JzID0gaGFzVW5yZWNvdmVyYWJsZUVycm9ycztcbmV4cG9ydHMuaW5qZWN0SW50b0dsb2JhbEhvb2sgPSBpbmplY3RJbnRvR2xvYmFsSG9vaztcbmV4cG9ydHMuaXNMaWtlbHlDb21wb25lbnRUeXBlID0gaXNMaWtlbHlDb21wb25lbnRUeXBlO1xuZXhwb3J0cy5wZXJmb3JtUmVhY3RSZWZyZXNoID0gcGVyZm9ybVJlYWN0UmVmcmVzaDtcbmV4cG9ydHMucmVnaXN0ZXIgPSByZWdpc3RlcjtcbmV4cG9ydHMuc2V0U2lnbmF0dXJlID0gc2V0U2lnbmF0dXJlO1xuICB9KSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LXJlZnJlc2gtcnVudGltZS5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1yZWZyZXNoLXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/static/chunks/webpack.js b/.next/static/chunks/webpack.js new file mode 100644 index 0000000..f291d70 --- /dev/null +++ b/.next/static/chunks/webpack.js @@ -0,0 +1,1024 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ function webpackJsonpCallback(data) { +/******/ var chunkIds = data[0]; +/******/ var moreModules = data[1]; +/******/ var executeModules = data[2]; +/******/ +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(data); +/******/ +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ // add entry modules from loaded chunk to deferred list +/******/ deferredModules.push.apply(deferredModules, executeModules || []); +/******/ +/******/ // run deferred modules when all chunks ready +/******/ return checkDeferredModules(); +/******/ }; +/******/ function checkDeferredModules() { +/******/ var result; +/******/ for(var i = 0; i < deferredModules.length; i++) { +/******/ var deferredModule = deferredModules[i]; +/******/ var fulfilled = true; +/******/ for(var j = 1; j < deferredModule.length; j++) { +/******/ var depId = deferredModule[j]; +/******/ if(installedChunks[depId] !== 0) fulfilled = false; +/******/ } +/******/ if(fulfilled) { +/******/ deferredModules.splice(i--, 1); +/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); +/******/ } +/******/ } +/******/ +/******/ return result; +/******/ } +/******/ function hotDisposeChunk(chunkId) { +/******/ delete installedChunks[chunkId]; +/******/ } +/******/ var parentHotUpdateCallback = window["webpackHotUpdate_N_E"]; +/******/ window["webpackHotUpdate_N_E"] = // eslint-disable-next-line no-unused-vars +/******/ function webpackHotUpdateCallback(chunkId, moreModules) { +/******/ hotAddUpdateChunk(chunkId, moreModules); +/******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules); +/******/ } ; +/******/ +/******/ // eslint-disable-next-line no-unused-vars +/******/ function hotDownloadUpdateChunk(chunkId) { +/******/ var script = document.createElement("script"); +/******/ script.charset = "utf-8"; +/******/ script.src = __webpack_require__.p + "static/webpack/" + chunkId + "." + hotCurrentHash + ".hot-update.js"; +/******/ if (null) script.crossOrigin = null; +/******/ document.head.appendChild(script); +/******/ } +/******/ +/******/ // eslint-disable-next-line no-unused-vars +/******/ function hotDownloadManifest(requestTimeout) { +/******/ requestTimeout = requestTimeout || 10000; +/******/ return new Promise(function(resolve, reject) { +/******/ if (typeof XMLHttpRequest === "undefined") { +/******/ return reject(new Error("No browser support")); +/******/ } +/******/ try { +/******/ var request = new XMLHttpRequest(); +/******/ var requestPath = __webpack_require__.p + "static/webpack/" + hotCurrentHash + ".hot-update.json"; +/******/ request.open("GET", requestPath, true); +/******/ request.timeout = requestTimeout; +/******/ request.send(null); +/******/ } catch (err) { +/******/ return reject(err); +/******/ } +/******/ request.onreadystatechange = function() { +/******/ if (request.readyState !== 4) return; +/******/ if (request.status === 0) { +/******/ // timeout +/******/ reject( +/******/ new Error("Manifest request to " + requestPath + " timed out.") +/******/ ); +/******/ } else if (request.status === 404) { +/******/ // no update available +/******/ resolve(); +/******/ } else if (request.status !== 200 && request.status !== 304) { +/******/ // other failure +/******/ reject(new Error("Manifest request to " + requestPath + " failed.")); +/******/ } else { +/******/ // success +/******/ try { +/******/ var update = JSON.parse(request.responseText); +/******/ } catch (e) { +/******/ reject(e); +/******/ return; +/******/ } +/******/ resolve(update); +/******/ } +/******/ }; +/******/ }); +/******/ } +/******/ +/******/ var hotApplyOnUpdate = true; +/******/ // eslint-disable-next-line no-unused-vars +/******/ var hotCurrentHash = "9040d10b0317f0cf8a58"; +/******/ var hotRequestTimeout = 10000; +/******/ var hotCurrentModuleData = {}; +/******/ var hotCurrentChildModule; +/******/ // eslint-disable-next-line no-unused-vars +/******/ var hotCurrentParents = []; +/******/ // eslint-disable-next-line no-unused-vars +/******/ var hotCurrentParentsTemp = []; +/******/ +/******/ // eslint-disable-next-line no-unused-vars +/******/ function hotCreateRequire(moduleId) { +/******/ var me = installedModules[moduleId]; +/******/ if (!me) return __webpack_require__; +/******/ var fn = function(request) { +/******/ if (me.hot.active) { +/******/ if (installedModules[request]) { +/******/ if (installedModules[request].parents.indexOf(moduleId) === -1) { +/******/ installedModules[request].parents.push(moduleId); +/******/ } +/******/ } else { +/******/ hotCurrentParents = [moduleId]; +/******/ hotCurrentChildModule = request; +/******/ } +/******/ if (me.children.indexOf(request) === -1) { +/******/ me.children.push(request); +/******/ } +/******/ } else { +/******/ console.warn( +/******/ "[HMR] unexpected require(" + +/******/ request + +/******/ ") from disposed module " + +/******/ moduleId +/******/ ); +/******/ hotCurrentParents = []; +/******/ } +/******/ return __webpack_require__(request); +/******/ }; +/******/ var ObjectFactory = function ObjectFactory(name) { +/******/ return { +/******/ configurable: true, +/******/ enumerable: true, +/******/ get: function() { +/******/ return __webpack_require__[name]; +/******/ }, +/******/ set: function(value) { +/******/ __webpack_require__[name] = value; +/******/ } +/******/ }; +/******/ }; +/******/ for (var name in __webpack_require__) { +/******/ if ( +/******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) && +/******/ name !== "e" && +/******/ name !== "t" +/******/ ) { +/******/ Object.defineProperty(fn, name, ObjectFactory(name)); +/******/ } +/******/ } +/******/ fn.e = function(chunkId) { +/******/ if (hotStatus === "ready") hotSetStatus("prepare"); +/******/ hotChunksLoading++; +/******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) { +/******/ finishChunkLoading(); +/******/ throw err; +/******/ }); +/******/ +/******/ function finishChunkLoading() { +/******/ hotChunksLoading--; +/******/ if (hotStatus === "prepare") { +/******/ if (!hotWaitingFilesMap[chunkId]) { +/******/ hotEnsureUpdateChunk(chunkId); +/******/ } +/******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) { +/******/ hotUpdateDownloaded(); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ fn.t = function(value, mode) { +/******/ if (mode & 1) value = fn(value); +/******/ return __webpack_require__.t(value, mode & ~1); +/******/ }; +/******/ return fn; +/******/ } +/******/ +/******/ // eslint-disable-next-line no-unused-vars +/******/ function hotCreateModule(moduleId) { +/******/ var hot = { +/******/ // private stuff +/******/ _acceptedDependencies: {}, +/******/ _declinedDependencies: {}, +/******/ _selfAccepted: false, +/******/ _selfDeclined: false, +/******/ _selfInvalidated: false, +/******/ _disposeHandlers: [], +/******/ _main: hotCurrentChildModule !== moduleId, +/******/ +/******/ // Module API +/******/ active: true, +/******/ accept: function(dep, callback) { +/******/ if (dep === undefined) hot._selfAccepted = true; +/******/ else if (typeof dep === "function") hot._selfAccepted = dep; +/******/ else if (typeof dep === "object") +/******/ for (var i = 0; i < dep.length; i++) +/******/ hot._acceptedDependencies[dep[i]] = callback || function() {}; +/******/ else hot._acceptedDependencies[dep] = callback || function() {}; +/******/ }, +/******/ decline: function(dep) { +/******/ if (dep === undefined) hot._selfDeclined = true; +/******/ else if (typeof dep === "object") +/******/ for (var i = 0; i < dep.length; i++) +/******/ hot._declinedDependencies[dep[i]] = true; +/******/ else hot._declinedDependencies[dep] = true; +/******/ }, +/******/ dispose: function(callback) { +/******/ hot._disposeHandlers.push(callback); +/******/ }, +/******/ addDisposeHandler: function(callback) { +/******/ hot._disposeHandlers.push(callback); +/******/ }, +/******/ removeDisposeHandler: function(callback) { +/******/ var idx = hot._disposeHandlers.indexOf(callback); +/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1); +/******/ }, +/******/ invalidate: function() { +/******/ this._selfInvalidated = true; +/******/ switch (hotStatus) { +/******/ case "idle": +/******/ hotUpdate = {}; +/******/ hotUpdate[moduleId] = modules[moduleId]; +/******/ hotSetStatus("ready"); +/******/ break; +/******/ case "ready": +/******/ hotApplyInvalidatedModule(moduleId); +/******/ break; +/******/ case "prepare": +/******/ case "check": +/******/ case "dispose": +/******/ case "apply": +/******/ (hotQueuedInvalidatedModules = +/******/ hotQueuedInvalidatedModules || []).push(moduleId); +/******/ break; +/******/ default: +/******/ // ignore requests in error states +/******/ break; +/******/ } +/******/ }, +/******/ +/******/ // Management API +/******/ check: hotCheck, +/******/ apply: hotApply, +/******/ status: function(l) { +/******/ if (!l) return hotStatus; +/******/ hotStatusHandlers.push(l); +/******/ }, +/******/ addStatusHandler: function(l) { +/******/ hotStatusHandlers.push(l); +/******/ }, +/******/ removeStatusHandler: function(l) { +/******/ var idx = hotStatusHandlers.indexOf(l); +/******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1); +/******/ }, +/******/ +/******/ //inherit from previous dispose call +/******/ data: hotCurrentModuleData[moduleId] +/******/ }; +/******/ hotCurrentChildModule = undefined; +/******/ return hot; +/******/ } +/******/ +/******/ var hotStatusHandlers = []; +/******/ var hotStatus = "idle"; +/******/ +/******/ function hotSetStatus(newStatus) { +/******/ hotStatus = newStatus; +/******/ for (var i = 0; i < hotStatusHandlers.length; i++) +/******/ hotStatusHandlers[i].call(null, newStatus); +/******/ } +/******/ +/******/ // while downloading +/******/ var hotWaitingFiles = 0; +/******/ var hotChunksLoading = 0; +/******/ var hotWaitingFilesMap = {}; +/******/ var hotRequestedFilesMap = {}; +/******/ var hotAvailableFilesMap = {}; +/******/ var hotDeferred; +/******/ +/******/ // The update info +/******/ var hotUpdate, hotUpdateNewHash, hotQueuedInvalidatedModules; +/******/ +/******/ function toModuleId(id) { +/******/ var isNumber = +id + "" === id; +/******/ return isNumber ? +id : id; +/******/ } +/******/ +/******/ function hotCheck(apply) { +/******/ if (hotStatus !== "idle") { +/******/ throw new Error("check() is only allowed in idle status"); +/******/ } +/******/ hotApplyOnUpdate = apply; +/******/ hotSetStatus("check"); +/******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) { +/******/ if (!update) { +/******/ hotSetStatus(hotApplyInvalidatedModules() ? "ready" : "idle"); +/******/ return null; +/******/ } +/******/ hotRequestedFilesMap = {}; +/******/ hotWaitingFilesMap = {}; +/******/ hotAvailableFilesMap = update.c; +/******/ hotUpdateNewHash = update.h; +/******/ +/******/ hotSetStatus("prepare"); +/******/ var promise = new Promise(function(resolve, reject) { +/******/ hotDeferred = { +/******/ resolve: resolve, +/******/ reject: reject +/******/ }; +/******/ }); +/******/ hotUpdate = {}; +/******/ for(var chunkId in installedChunks) +/******/ // eslint-disable-next-line no-lone-blocks +/******/ { +/******/ hotEnsureUpdateChunk(chunkId); +/******/ } +/******/ if ( +/******/ hotStatus === "prepare" && +/******/ hotChunksLoading === 0 && +/******/ hotWaitingFiles === 0 +/******/ ) { +/******/ hotUpdateDownloaded(); +/******/ } +/******/ return promise; +/******/ }); +/******/ } +/******/ +/******/ // eslint-disable-next-line no-unused-vars +/******/ function hotAddUpdateChunk(chunkId, moreModules) { +/******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId]) +/******/ return; +/******/ hotRequestedFilesMap[chunkId] = false; +/******/ for (var moduleId in moreModules) { +/******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ hotUpdate[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) { +/******/ hotUpdateDownloaded(); +/******/ } +/******/ } +/******/ +/******/ function hotEnsureUpdateChunk(chunkId) { +/******/ if (!hotAvailableFilesMap[chunkId]) { +/******/ hotWaitingFilesMap[chunkId] = true; +/******/ } else { +/******/ hotRequestedFilesMap[chunkId] = true; +/******/ hotWaitingFiles++; +/******/ hotDownloadUpdateChunk(chunkId); +/******/ } +/******/ } +/******/ +/******/ function hotUpdateDownloaded() { +/******/ hotSetStatus("ready"); +/******/ var deferred = hotDeferred; +/******/ hotDeferred = null; +/******/ if (!deferred) return; +/******/ if (hotApplyOnUpdate) { +/******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to +/******/ // avoid triggering uncaught exception warning in Chrome. +/******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666 +/******/ Promise.resolve() +/******/ .then(function() { +/******/ return hotApply(hotApplyOnUpdate); +/******/ }) +/******/ .then( +/******/ function(result) { +/******/ deferred.resolve(result); +/******/ }, +/******/ function(err) { +/******/ deferred.reject(err); +/******/ } +/******/ ); +/******/ } else { +/******/ var outdatedModules = []; +/******/ for (var id in hotUpdate) { +/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) { +/******/ outdatedModules.push(toModuleId(id)); +/******/ } +/******/ } +/******/ deferred.resolve(outdatedModules); +/******/ } +/******/ } +/******/ +/******/ function hotApply(options) { +/******/ if (hotStatus !== "ready") +/******/ throw new Error("apply() is only allowed in ready status"); +/******/ options = options || {}; +/******/ return hotApplyInternal(options); +/******/ } +/******/ +/******/ function hotApplyInternal(options) { +/******/ hotApplyInvalidatedModules(); +/******/ +/******/ var cb; +/******/ var i; +/******/ var j; +/******/ var module; +/******/ var moduleId; +/******/ +/******/ function getAffectedStuff(updateModuleId) { +/******/ var outdatedModules = [updateModuleId]; +/******/ var outdatedDependencies = {}; +/******/ +/******/ var queue = outdatedModules.map(function(id) { +/******/ return { +/******/ chain: [id], +/******/ id: id +/******/ }; +/******/ }); +/******/ while (queue.length > 0) { +/******/ var queueItem = queue.pop(); +/******/ var moduleId = queueItem.id; +/******/ var chain = queueItem.chain; +/******/ module = installedModules[moduleId]; +/******/ if ( +/******/ !module || +/******/ (module.hot._selfAccepted && !module.hot._selfInvalidated) +/******/ ) +/******/ continue; +/******/ if (module.hot._selfDeclined) { +/******/ return { +/******/ type: "self-declined", +/******/ chain: chain, +/******/ moduleId: moduleId +/******/ }; +/******/ } +/******/ if (module.hot._main) { +/******/ return { +/******/ type: "unaccepted", +/******/ chain: chain, +/******/ moduleId: moduleId +/******/ }; +/******/ } +/******/ for (var i = 0; i < module.parents.length; i++) { +/******/ var parentId = module.parents[i]; +/******/ var parent = installedModules[parentId]; +/******/ if (!parent) continue; +/******/ if (parent.hot._declinedDependencies[moduleId]) { +/******/ return { +/******/ type: "declined", +/******/ chain: chain.concat([parentId]), +/******/ moduleId: moduleId, +/******/ parentId: parentId +/******/ }; +/******/ } +/******/ if (outdatedModules.indexOf(parentId) !== -1) continue; +/******/ if (parent.hot._acceptedDependencies[moduleId]) { +/******/ if (!outdatedDependencies[parentId]) +/******/ outdatedDependencies[parentId] = []; +/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]); +/******/ continue; +/******/ } +/******/ delete outdatedDependencies[parentId]; +/******/ outdatedModules.push(parentId); +/******/ queue.push({ +/******/ chain: chain.concat([parentId]), +/******/ id: parentId +/******/ }); +/******/ } +/******/ } +/******/ +/******/ return { +/******/ type: "accepted", +/******/ moduleId: updateModuleId, +/******/ outdatedModules: outdatedModules, +/******/ outdatedDependencies: outdatedDependencies +/******/ }; +/******/ } +/******/ +/******/ function addAllToSet(a, b) { +/******/ for (var i = 0; i < b.length; i++) { +/******/ var item = b[i]; +/******/ if (a.indexOf(item) === -1) a.push(item); +/******/ } +/******/ } +/******/ +/******/ // at begin all updates modules are outdated +/******/ // the "outdated" status can propagate to parents if they don't accept the children +/******/ var outdatedDependencies = {}; +/******/ var outdatedModules = []; +/******/ var appliedUpdate = {}; +/******/ +/******/ var warnUnexpectedRequire = function warnUnexpectedRequire() { +/******/ console.warn( +/******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module" +/******/ ); +/******/ }; +/******/ +/******/ for (var id in hotUpdate) { +/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) { +/******/ moduleId = toModuleId(id); +/******/ /** @type {TODO} */ +/******/ var result; +/******/ if (hotUpdate[id]) { +/******/ result = getAffectedStuff(moduleId); +/******/ } else { +/******/ result = { +/******/ type: "disposed", +/******/ moduleId: id +/******/ }; +/******/ } +/******/ /** @type {Error|false} */ +/******/ var abortError = false; +/******/ var doApply = false; +/******/ var doDispose = false; +/******/ var chainInfo = ""; +/******/ if (result.chain) { +/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> "); +/******/ } +/******/ switch (result.type) { +/******/ case "self-declined": +/******/ if (options.onDeclined) options.onDeclined(result); +/******/ if (!options.ignoreDeclined) +/******/ abortError = new Error( +/******/ "Aborted because of self decline: " + +/******/ result.moduleId + +/******/ chainInfo +/******/ ); +/******/ break; +/******/ case "declined": +/******/ if (options.onDeclined) options.onDeclined(result); +/******/ if (!options.ignoreDeclined) +/******/ abortError = new Error( +/******/ "Aborted because of declined dependency: " + +/******/ result.moduleId + +/******/ " in " + +/******/ result.parentId + +/******/ chainInfo +/******/ ); +/******/ break; +/******/ case "unaccepted": +/******/ if (options.onUnaccepted) options.onUnaccepted(result); +/******/ if (!options.ignoreUnaccepted) +/******/ abortError = new Error( +/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo +/******/ ); +/******/ break; +/******/ case "accepted": +/******/ if (options.onAccepted) options.onAccepted(result); +/******/ doApply = true; +/******/ break; +/******/ case "disposed": +/******/ if (options.onDisposed) options.onDisposed(result); +/******/ doDispose = true; +/******/ break; +/******/ default: +/******/ throw new Error("Unexception type " + result.type); +/******/ } +/******/ if (abortError) { +/******/ hotSetStatus("abort"); +/******/ return Promise.reject(abortError); +/******/ } +/******/ if (doApply) { +/******/ appliedUpdate[moduleId] = hotUpdate[moduleId]; +/******/ addAllToSet(outdatedModules, result.outdatedModules); +/******/ for (moduleId in result.outdatedDependencies) { +/******/ if ( +/******/ Object.prototype.hasOwnProperty.call( +/******/ result.outdatedDependencies, +/******/ moduleId +/******/ ) +/******/ ) { +/******/ if (!outdatedDependencies[moduleId]) +/******/ outdatedDependencies[moduleId] = []; +/******/ addAllToSet( +/******/ outdatedDependencies[moduleId], +/******/ result.outdatedDependencies[moduleId] +/******/ ); +/******/ } +/******/ } +/******/ } +/******/ if (doDispose) { +/******/ addAllToSet(outdatedModules, [result.moduleId]); +/******/ appliedUpdate[moduleId] = warnUnexpectedRequire; +/******/ } +/******/ } +/******/ } +/******/ +/******/ // Store self accepted outdated modules to require them later by the module system +/******/ var outdatedSelfAcceptedModules = []; +/******/ for (i = 0; i < outdatedModules.length; i++) { +/******/ moduleId = outdatedModules[i]; +/******/ if ( +/******/ installedModules[moduleId] && +/******/ installedModules[moduleId].hot._selfAccepted && +/******/ // removed self-accepted modules should not be required +/******/ appliedUpdate[moduleId] !== warnUnexpectedRequire && +/******/ // when called invalidate self-accepting is not possible +/******/ !installedModules[moduleId].hot._selfInvalidated +/******/ ) { +/******/ outdatedSelfAcceptedModules.push({ +/******/ module: moduleId, +/******/ parents: installedModules[moduleId].parents.slice(), +/******/ errorHandler: installedModules[moduleId].hot._selfAccepted +/******/ }); +/******/ } +/******/ } +/******/ +/******/ // Now in "dispose" phase +/******/ hotSetStatus("dispose"); +/******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) { +/******/ if (hotAvailableFilesMap[chunkId] === false) { +/******/ hotDisposeChunk(chunkId); +/******/ } +/******/ }); +/******/ +/******/ var idx; +/******/ var queue = outdatedModules.slice(); +/******/ while (queue.length > 0) { +/******/ moduleId = queue.pop(); +/******/ module = installedModules[moduleId]; +/******/ if (!module) continue; +/******/ +/******/ var data = {}; +/******/ +/******/ // Call dispose handlers +/******/ var disposeHandlers = module.hot._disposeHandlers; +/******/ for (j = 0; j < disposeHandlers.length; j++) { +/******/ cb = disposeHandlers[j]; +/******/ cb(data); +/******/ } +/******/ hotCurrentModuleData[moduleId] = data; +/******/ +/******/ // disable module (this disables requires from this module) +/******/ module.hot.active = false; +/******/ +/******/ // remove module from cache +/******/ delete installedModules[moduleId]; +/******/ +/******/ // when disposing there is no need to call dispose handler +/******/ delete outdatedDependencies[moduleId]; +/******/ +/******/ // remove "parents" references from all children +/******/ for (j = 0; j < module.children.length; j++) { +/******/ var child = installedModules[module.children[j]]; +/******/ if (!child) continue; +/******/ idx = child.parents.indexOf(moduleId); +/******/ if (idx >= 0) { +/******/ child.parents.splice(idx, 1); +/******/ } +/******/ } +/******/ } +/******/ +/******/ // remove outdated dependency from module children +/******/ var dependency; +/******/ var moduleOutdatedDependencies; +/******/ for (moduleId in outdatedDependencies) { +/******/ if ( +/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId) +/******/ ) { +/******/ module = installedModules[moduleId]; +/******/ if (module) { +/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; +/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) { +/******/ dependency = moduleOutdatedDependencies[j]; +/******/ idx = module.children.indexOf(dependency); +/******/ if (idx >= 0) module.children.splice(idx, 1); +/******/ } +/******/ } +/******/ } +/******/ } +/******/ +/******/ // Now in "apply" phase +/******/ hotSetStatus("apply"); +/******/ +/******/ if (hotUpdateNewHash !== undefined) { +/******/ hotCurrentHash = hotUpdateNewHash; +/******/ hotUpdateNewHash = undefined; +/******/ } +/******/ hotUpdate = undefined; +/******/ +/******/ // insert new code +/******/ for (moduleId in appliedUpdate) { +/******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) { +/******/ modules[moduleId] = appliedUpdate[moduleId]; +/******/ } +/******/ } +/******/ +/******/ // call accept handlers +/******/ var error = null; +/******/ for (moduleId in outdatedDependencies) { +/******/ if ( +/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId) +/******/ ) { +/******/ module = installedModules[moduleId]; +/******/ if (module) { +/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; +/******/ var callbacks = []; +/******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) { +/******/ dependency = moduleOutdatedDependencies[i]; +/******/ cb = module.hot._acceptedDependencies[dependency]; +/******/ if (cb) { +/******/ if (callbacks.indexOf(cb) !== -1) continue; +/******/ callbacks.push(cb); +/******/ } +/******/ } +/******/ for (i = 0; i < callbacks.length; i++) { +/******/ cb = callbacks[i]; +/******/ try { +/******/ cb(moduleOutdatedDependencies); +/******/ } catch (err) { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "accept-errored", +/******/ moduleId: moduleId, +/******/ dependencyId: moduleOutdatedDependencies[i], +/******/ error: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ if (!error) error = err; +/******/ } +/******/ } +/******/ } +/******/ } +/******/ } +/******/ } +/******/ +/******/ // Load self accepted modules +/******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) { +/******/ var item = outdatedSelfAcceptedModules[i]; +/******/ moduleId = item.module; +/******/ hotCurrentParents = item.parents; +/******/ hotCurrentChildModule = moduleId; +/******/ try { +/******/ __webpack_require__(moduleId); +/******/ } catch (err) { +/******/ if (typeof item.errorHandler === "function") { +/******/ try { +/******/ item.errorHandler(err); +/******/ } catch (err2) { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "self-accept-error-handler-errored", +/******/ moduleId: moduleId, +/******/ error: err2, +/******/ originalError: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ if (!error) error = err2; +/******/ } +/******/ if (!error) error = err; +/******/ } +/******/ } else { +/******/ if (options.onErrored) { +/******/ options.onErrored({ +/******/ type: "self-accept-errored", +/******/ moduleId: moduleId, +/******/ error: err +/******/ }); +/******/ } +/******/ if (!options.ignoreErrored) { +/******/ if (!error) error = err; +/******/ } +/******/ } +/******/ } +/******/ } +/******/ +/******/ // handle errors in accept handlers and self accepted module load +/******/ if (error) { +/******/ hotSetStatus("fail"); +/******/ return Promise.reject(error); +/******/ } +/******/ +/******/ if (hotQueuedInvalidatedModules) { +/******/ return hotApplyInternal(options).then(function(list) { +/******/ outdatedModules.forEach(function(moduleId) { +/******/ if (list.indexOf(moduleId) < 0) list.push(moduleId); +/******/ }); +/******/ return list; +/******/ }); +/******/ } +/******/ +/******/ hotSetStatus("idle"); +/******/ return new Promise(function(resolve) { +/******/ resolve(outdatedModules); +/******/ }); +/******/ } +/******/ +/******/ function hotApplyInvalidatedModules() { +/******/ if (hotQueuedInvalidatedModules) { +/******/ if (!hotUpdate) hotUpdate = {}; +/******/ hotQueuedInvalidatedModules.forEach(hotApplyInvalidatedModule); +/******/ hotQueuedInvalidatedModules = undefined; +/******/ return true; +/******/ } +/******/ } +/******/ +/******/ function hotApplyInvalidatedModule(moduleId) { +/******/ if (!Object.prototype.hasOwnProperty.call(hotUpdate, moduleId)) +/******/ hotUpdate[moduleId] = modules[moduleId]; +/******/ } +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "webpack": 0 +/******/ }; +/******/ +/******/ var deferredModules = []; +/******/ +/******/ // script path function +/******/ function jsonpScriptSrc(chunkId) { +/******/ return __webpack_require__.p + "static/chunks/" + ({}[chunkId]||chunkId) + ".js" +/******/ } +/******/ +/******/ // noop fns to prevent runtime errors during initialization +/******/ if (typeof self !== "undefined") { +/******/ self.$RefreshReg$ = function () {}; +/******/ self.$RefreshSig$ = function () { +/******/ return function (type) { +/******/ return type; +/******/ }; +/******/ }; +/******/ } +/******/ +/******/ // 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: {}, +/******/ hot: hotCreateModule(moduleId), +/******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp), +/******/ children: [] +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ +/******/ var hasRefresh = typeof self !== "undefined" && !!self.$RefreshInterceptModuleExecution$; +/******/ var cleanup = hasRefresh +/******/ ? self.$RefreshInterceptModuleExecution$(moduleId) +/******/ : function() {}; +/******/ try { +/******/ +/******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId)); +/******/ +/******/ } finally { +/******/ cleanup(); +/******/ } +/******/ +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete installedModules[moduleId]; +/******/ } +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = function requireEnsure(chunkId) { +/******/ var promises = []; +/******/ +/******/ +/******/ // JSONP chunk loading for javascript +/******/ +/******/ var installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise(function(resolve, reject) { +/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; +/******/ }); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var script = document.createElement('script'); +/******/ var onScriptComplete; +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.src = jsonpScriptSrc(chunkId); +/******/ +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ onScriptComplete = function (event) { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var chunk = installedChunks[chunkId]; +/******/ if(chunk !== 0) { +/******/ if(chunk) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ chunk[1](error); +/******/ } +/******/ installedChunks[chunkId] = undefined; +/******/ } +/******/ }; +/******/ var timeout = setTimeout(function(){ +/******/ onScriptComplete({ type: 'timeout', target: script }); +/******/ }, 120000); +/******/ script.onerror = script.onload = onScriptComplete; +/******/ document.head.appendChild(script); +/******/ } +/******/ } +/******/ return Promise.all(promises); +/******/ }; +/******/ +/******/ // 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 = ""; +/******/ +/******/ // on error function for async loading +/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; +/******/ +/******/ // __webpack_hash__ +/******/ __webpack_require__.h = function() { return hotCurrentHash; }; +/******/ +/******/ var jsonpArray = window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []; +/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); +/******/ jsonpArray.push = webpackJsonpCallback; +/******/ jsonpArray = jsonpArray.slice(); +/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); +/******/ var parentJsonpFunction = oldJsonpFunction; +/******/ +/******/ +/******/ // run deferred modules from other chunks +/******/ checkDeferredModules(); +/******/ }) +/************************************************************************/ +/******/ ([]); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FL3dlYnBhY2svYm9vdHN0cmFwIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLFFBQVEsb0JBQW9CO1FBQzVCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsaUJBQWlCLDRCQUE0QjtRQUM3QztRQUNBO1FBQ0Esa0JBQWtCLDJCQUEyQjtRQUM3QztRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsR0FBRzs7UUFFSDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0EsT0FBTztRQUNQO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7O1FBRUw7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsNkJBQTZCO1FBQzdCLDZCQUE2QjtRQUM3QjtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHFCQUFxQixnQkFBZ0I7UUFDckM7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQSxxQkFBcUIsZ0JBQWdCO1FBQ3JDO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7O1FBRUw7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0EsS0FBSzs7UUFFTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0Esa0JBQWtCLDhCQUE4QjtRQUNoRDtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsSUFBSTtRQUNKO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0E7UUFDQTtRQUNBLE9BQU87UUFDUDtRQUNBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLEtBQUs7UUFDTDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxvQkFBb0IsMkJBQTJCO1FBQy9DO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxPQUFPO1FBQ1A7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLG1CQUFtQixjQUFjO1FBQ2pDO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSxnQkFBZ0IsS0FBSztRQUNyQjtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLGdCQUFnQixZQUFZO1FBQzVCO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0EsY0FBYyw0QkFBNEI7UUFDMUM7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxJQUFJOztRQUVKO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTs7UUFFQTtRQUNBO1FBQ0EsZUFBZSw0QkFBNEI7UUFDM0M7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQSxlQUFlLDRCQUE0QjtRQUMzQztRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsaUJBQWlCLHVDQUF1QztRQUN4RDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsaUJBQWlCLHVDQUF1QztRQUN4RDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLGlCQUFpQixzQkFBc0I7UUFDdkM7UUFDQTtRQUNBO1FBQ0EsUUFBUTtRQUNSO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLFVBQVU7UUFDVjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxjQUFjLHdDQUF3QztRQUN0RDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxLQUFLO1FBQ0w7UUFDQTtRQUNBO1FBQ0EsT0FBTztRQUNQO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLFNBQVM7UUFDVDtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSxNQUFNO1FBQ047UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLFFBQVE7UUFDUjtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsTUFBTTtRQUNOO1FBQ0EsS0FBSztRQUNMOztRQUVBO1FBQ0E7UUFDQTtRQUNBLElBQUk7UUFDSjs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBOztRQUVBO1FBQ0E7UUFDQSx3REFBd0Q7UUFDeEQ7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLGVBQWU7UUFDZjtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTs7UUFFQSxZQUFZO1FBQ1o7UUFDQTs7UUFFQTtRQUNBLElBQUk7UUFDSjtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBOzs7UUFHQTs7UUFFQTtRQUNBLGlDQUFpQzs7UUFFakM7UUFDQTtRQUNBO1FBQ0EsS0FBSztRQUNMO1FBQ0E7UUFDQTtRQUNBLE1BQU07UUFDTjs7UUFFQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHdCQUF3QixrQ0FBa0M7UUFDMUQsTUFBTTtRQUNOO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7UUFFQTtRQUNBLDBDQUEwQyxvQkFBb0IsV0FBVzs7UUFFekU7UUFDQSxzQ0FBc0MsdUJBQXVCOztRQUU3RDtRQUNBO1FBQ0E7UUFDQTtRQUNBLGdCQUFnQix1QkFBdUI7UUFDdkM7OztRQUdBO1FBQ0EiLCJmaWxlIjoic3RhdGljL2NodW5rcy93ZWJwYWNrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gaW5zdGFsbCBhIEpTT05QIGNhbGxiYWNrIGZvciBjaHVuayBsb2FkaW5nXG4gXHRmdW5jdGlvbiB3ZWJwYWNrSnNvbnBDYWxsYmFjayhkYXRhKSB7XG4gXHRcdHZhciBjaHVua0lkcyA9IGRhdGFbMF07XG4gXHRcdHZhciBtb3JlTW9kdWxlcyA9IGRhdGFbMV07XG4gXHRcdHZhciBleGVjdXRlTW9kdWxlcyA9IGRhdGFbMl07XG5cbiBcdFx0Ly8gYWRkIFwibW9yZU1vZHVsZXNcIiB0byB0aGUgbW9kdWxlcyBvYmplY3QsXG4gXHRcdC8vIHRoZW4gZmxhZyBhbGwgXCJjaHVua0lkc1wiIGFzIGxvYWRlZCBhbmQgZmlyZSBjYWxsYmFja1xuIFx0XHR2YXIgbW9kdWxlSWQsIGNodW5rSWQsIGkgPSAwLCByZXNvbHZlcyA9IFtdO1xuIFx0XHRmb3IoO2kgPCBjaHVua0lkcy5sZW5ndGg7IGkrKykge1xuIFx0XHRcdGNodW5rSWQgPSBjaHVua0lkc1tpXTtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5zdGFsbGVkQ2h1bmtzLCBjaHVua0lkKSAmJiBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcbiBcdFx0XHRcdHJlc29sdmVzLnB1c2goaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdWzBdKTtcbiBcdFx0XHR9XG4gXHRcdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdID0gMDtcbiBcdFx0fVxuIFx0XHRmb3IobW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcbiBcdFx0XHRpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG4gXHRcdGlmKHBhcmVudEpzb25wRnVuY3Rpb24pIHBhcmVudEpzb25wRnVuY3Rpb24oZGF0YSk7XG5cbiBcdFx0d2hpbGUocmVzb2x2ZXMubGVuZ3RoKSB7XG4gXHRcdFx0cmVzb2x2ZXMuc2hpZnQoKSgpO1xuIFx0XHR9XG5cbiBcdFx0Ly8gYWRkIGVudHJ5IG1vZHVsZXMgZnJvbSBsb2FkZWQgY2h1bmsgdG8gZGVmZXJyZWQgbGlzdFxuIFx0XHRkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzIHx8IFtdKTtcblxuIFx0XHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcbiBcdFx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4gXHR9O1xuIFx0ZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXMoKSB7XG4gXHRcdHZhciByZXN1bHQ7XG4gXHRcdGZvcih2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgZGVmZXJyZWRNb2R1bGUgPSBkZWZlcnJlZE1vZHVsZXNbaV07XG4gXHRcdFx0dmFyIGZ1bGZpbGxlZCA9IHRydWU7XG4gXHRcdFx0Zm9yKHZhciBqID0gMTsgaiA8IGRlZmVycmVkTW9kdWxlLmxlbmd0aDsgaisrKSB7XG4gXHRcdFx0XHR2YXIgZGVwSWQgPSBkZWZlcnJlZE1vZHVsZVtqXTtcbiBcdFx0XHRcdGlmKGluc3RhbGxlZENodW5rc1tkZXBJZF0gIT09IDApIGZ1bGZpbGxlZCA9IGZhbHNlO1xuIFx0XHRcdH1cbiBcdFx0XHRpZihmdWxmaWxsZWQpIHtcbiBcdFx0XHRcdGRlZmVycmVkTW9kdWxlcy5zcGxpY2UoaS0tLCAxKTtcbiBcdFx0XHRcdHJlc3VsdCA9IF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gZGVmZXJyZWRNb2R1bGVbMF0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdHJldHVybiByZXN1bHQ7XG4gXHR9XG4gXHRmdW5jdGlvbiBob3REaXNwb3NlQ2h1bmsoY2h1bmtJZCkge1xuIFx0XHRkZWxldGUgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0fVxuIFx0dmFyIHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrID0gd2luZG93W1wid2VicGFja0hvdFVwZGF0ZV9OX0VcIl07XG4gXHR3aW5kb3dbXCJ3ZWJwYWNrSG90VXBkYXRlX05fRVwiXSA9IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gd2VicGFja0hvdFVwZGF0ZUNhbGxiYWNrKGNodW5rSWQsIG1vcmVNb2R1bGVzKSB7XG4gXHRcdGhvdEFkZFVwZGF0ZUNodW5rKGNodW5rSWQsIG1vcmVNb2R1bGVzKTtcbiBcdFx0aWYgKHBhcmVudEhvdFVwZGF0ZUNhbGxiYWNrKSBwYXJlbnRIb3RVcGRhdGVDYWxsYmFjayhjaHVua0lkLCBtb3JlTW9kdWxlcyk7XG4gXHR9IDtcblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3REb3dubG9hZFVwZGF0ZUNodW5rKGNodW5rSWQpIHtcbiBcdFx0dmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gXHRcdHNjcmlwdC5jaGFyc2V0ID0gXCJ1dGYtOFwiO1xuIFx0XHRzY3JpcHQuc3JjID0gX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgXCJzdGF0aWMvd2VicGFjay9cIiArIGNodW5rSWQgKyBcIi5cIiArIGhvdEN1cnJlbnRIYXNoICsgXCIuaG90LXVwZGF0ZS5qc1wiO1xuIFx0XHRpZiAobnVsbCkgc2NyaXB0LmNyb3NzT3JpZ2luID0gbnVsbDtcbiBcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuIFx0fVxuXG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdGZ1bmN0aW9uIGhvdERvd25sb2FkTWFuaWZlc3QocmVxdWVzdFRpbWVvdXQpIHtcbiBcdFx0cmVxdWVzdFRpbWVvdXQgPSByZXF1ZXN0VGltZW91dCB8fCAxMDAwMDtcbiBcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuIFx0XHRcdGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09IFwidW5kZWZpbmVkXCIpIHtcbiBcdFx0XHRcdHJldHVybiByZWplY3QobmV3IEVycm9yKFwiTm8gYnJvd3NlciBzdXBwb3J0XCIpKTtcbiBcdFx0XHR9XG4gXHRcdFx0dHJ5IHtcbiBcdFx0XHRcdHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gXHRcdFx0XHR2YXIgcmVxdWVzdFBhdGggPSBfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBcInN0YXRpYy93ZWJwYWNrL1wiICsgaG90Q3VycmVudEhhc2ggKyBcIi5ob3QtdXBkYXRlLmpzb25cIjtcbiBcdFx0XHRcdHJlcXVlc3Qub3BlbihcIkdFVFwiLCByZXF1ZXN0UGF0aCwgdHJ1ZSk7XG4gXHRcdFx0XHRyZXF1ZXN0LnRpbWVvdXQgPSByZXF1ZXN0VGltZW91dDtcbiBcdFx0XHRcdHJlcXVlc3Quc2VuZChudWxsKTtcbiBcdFx0XHR9IGNhdGNoIChlcnIpIHtcbiBcdFx0XHRcdHJldHVybiByZWplY3QoZXJyKTtcbiBcdFx0XHR9XG4gXHRcdFx0cmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiBcdFx0XHRcdGlmIChyZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjtcbiBcdFx0XHRcdGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCkge1xuIFx0XHRcdFx0XHQvLyB0aW1lb3V0XG4gXHRcdFx0XHRcdHJlamVjdChcbiBcdFx0XHRcdFx0XHRuZXcgRXJyb3IoXCJNYW5pZmVzdCByZXF1ZXN0IHRvIFwiICsgcmVxdWVzdFBhdGggKyBcIiB0aW1lZCBvdXQuXCIpXG4gXHRcdFx0XHRcdCk7XG4gXHRcdFx0XHR9IGVsc2UgaWYgKHJlcXVlc3Quc3RhdHVzID09PSA0MDQpIHtcbiBcdFx0XHRcdFx0Ly8gbm8gdXBkYXRlIGF2YWlsYWJsZVxuIFx0XHRcdFx0XHRyZXNvbHZlKCk7XG4gXHRcdFx0XHR9IGVsc2UgaWYgKHJlcXVlc3Quc3RhdHVzICE9PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgIT09IDMwNCkge1xuIFx0XHRcdFx0XHQvLyBvdGhlciBmYWlsdXJlXG4gXHRcdFx0XHRcdHJlamVjdChuZXcgRXJyb3IoXCJNYW5pZmVzdCByZXF1ZXN0IHRvIFwiICsgcmVxdWVzdFBhdGggKyBcIiBmYWlsZWQuXCIpKTtcbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdC8vIHN1Y2Nlc3NcbiBcdFx0XHRcdFx0dHJ5IHtcbiBcdFx0XHRcdFx0XHR2YXIgdXBkYXRlID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XG4gXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcbiBcdFx0XHRcdFx0XHRyZWplY3QoZSk7XG4gXHRcdFx0XHRcdFx0cmV0dXJuO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdHJlc29sdmUodXBkYXRlKTtcbiBcdFx0XHRcdH1cbiBcdFx0XHR9O1xuIFx0XHR9KTtcbiBcdH1cblxuIFx0dmFyIGhvdEFwcGx5T25VcGRhdGUgPSB0cnVlO1xuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHR2YXIgaG90Q3VycmVudEhhc2ggPSBcIjkwNDBkMTBiMDMxN2YwY2Y4YTU4XCI7XG4gXHR2YXIgaG90UmVxdWVzdFRpbWVvdXQgPSAxMDAwMDtcbiBcdHZhciBob3RDdXJyZW50TW9kdWxlRGF0YSA9IHt9O1xuIFx0dmFyIGhvdEN1cnJlbnRDaGlsZE1vZHVsZTtcbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0dmFyIGhvdEN1cnJlbnRQYXJlbnRzID0gW107XG4gXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiBcdHZhciBob3RDdXJyZW50UGFyZW50c1RlbXAgPSBbXTtcblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3RDcmVhdGVSZXF1aXJlKG1vZHVsZUlkKSB7XG4gXHRcdHZhciBtZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRpZiAoIW1lKSByZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXztcbiBcdFx0dmFyIGZuID0gZnVuY3Rpb24ocmVxdWVzdCkge1xuIFx0XHRcdGlmIChtZS5ob3QuYWN0aXZlKSB7XG4gXHRcdFx0XHRpZiAoaW5zdGFsbGVkTW9kdWxlc1tyZXF1ZXN0XSkge1xuIFx0XHRcdFx0XHRpZiAoaW5zdGFsbGVkTW9kdWxlc1tyZXF1ZXN0XS5wYXJlbnRzLmluZGV4T2YobW9kdWxlSWQpID09PSAtMSkge1xuIFx0XHRcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbcmVxdWVzdF0ucGFyZW50cy5wdXNoKG1vZHVsZUlkKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdFx0aG90Q3VycmVudFBhcmVudHMgPSBbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHRob3RDdXJyZW50Q2hpbGRNb2R1bGUgPSByZXF1ZXN0O1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKG1lLmNoaWxkcmVuLmluZGV4T2YocmVxdWVzdCkgPT09IC0xKSB7XG4gXHRcdFx0XHRcdG1lLmNoaWxkcmVuLnB1c2gocmVxdWVzdCk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdGNvbnNvbGUud2FybihcbiBcdFx0XHRcdFx0XCJbSE1SXSB1bmV4cGVjdGVkIHJlcXVpcmUoXCIgK1xuIFx0XHRcdFx0XHRcdHJlcXVlc3QgK1xuIFx0XHRcdFx0XHRcdFwiKSBmcm9tIGRpc3Bvc2VkIG1vZHVsZSBcIiArXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWRcbiBcdFx0XHRcdCk7XG4gXHRcdFx0XHRob3RDdXJyZW50UGFyZW50cyA9IFtdO1xuIFx0XHRcdH1cbiBcdFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhyZXF1ZXN0KTtcbiBcdFx0fTtcbiBcdFx0dmFyIE9iamVjdEZhY3RvcnkgPSBmdW5jdGlvbiBPYmplY3RGYWN0b3J5KG5hbWUpIHtcbiBcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG4gXHRcdFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fW25hbWVdO1xuIFx0XHRcdFx0fSxcbiBcdFx0XHRcdHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiBcdFx0XHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfX1tuYW1lXSA9IHZhbHVlO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH07XG4gXHRcdH07XG4gXHRcdGZvciAodmFyIG5hbWUgaW4gX193ZWJwYWNrX3JlcXVpcmVfXykge1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfX3dlYnBhY2tfcmVxdWlyZV9fLCBuYW1lKSAmJlxuIFx0XHRcdFx0bmFtZSAhPT0gXCJlXCIgJiZcbiBcdFx0XHRcdG5hbWUgIT09IFwidFwiXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIG5hbWUsIE9iamVjdEZhY3RvcnkobmFtZSkpO1xuIFx0XHRcdH1cbiBcdFx0fVxuIFx0XHRmbi5lID0gZnVuY3Rpb24oY2h1bmtJZCkge1xuIFx0XHRcdGlmIChob3RTdGF0dXMgPT09IFwicmVhZHlcIikgaG90U2V0U3RhdHVzKFwicHJlcGFyZVwiKTtcbiBcdFx0XHRob3RDaHVua3NMb2FkaW5nKys7XG4gXHRcdFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZShjaHVua0lkKS50aGVuKGZpbmlzaENodW5rTG9hZGluZywgZnVuY3Rpb24oZXJyKSB7XG4gXHRcdFx0XHRmaW5pc2hDaHVua0xvYWRpbmcoKTtcbiBcdFx0XHRcdHRocm93IGVycjtcbiBcdFx0XHR9KTtcblxuIFx0XHRcdGZ1bmN0aW9uIGZpbmlzaENodW5rTG9hZGluZygpIHtcbiBcdFx0XHRcdGhvdENodW5rc0xvYWRpbmctLTtcbiBcdFx0XHRcdGlmIChob3RTdGF0dXMgPT09IFwicHJlcGFyZVwiKSB7XG4gXHRcdFx0XHRcdGlmICghaG90V2FpdGluZ0ZpbGVzTWFwW2NodW5rSWRdKSB7XG4gXHRcdFx0XHRcdFx0aG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0aWYgKGhvdENodW5rc0xvYWRpbmcgPT09IDAgJiYgaG90V2FpdGluZ0ZpbGVzID09PSAwKSB7XG4gXHRcdFx0XHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9O1xuIFx0XHRmbi50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0XHRpZiAobW9kZSAmIDEpIHZhbHVlID0gZm4odmFsdWUpO1xuIFx0XHRcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLnQodmFsdWUsIG1vZGUgJiB+MSk7XG4gXHRcdH07XG4gXHRcdHJldHVybiBmbjtcbiBcdH1cblxuIFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gXHRmdW5jdGlvbiBob3RDcmVhdGVNb2R1bGUobW9kdWxlSWQpIHtcbiBcdFx0dmFyIGhvdCA9IHtcbiBcdFx0XHQvLyBwcml2YXRlIHN0dWZmXG4gXHRcdFx0X2FjY2VwdGVkRGVwZW5kZW5jaWVzOiB7fSxcbiBcdFx0XHRfZGVjbGluZWREZXBlbmRlbmNpZXM6IHt9LFxuIFx0XHRcdF9zZWxmQWNjZXB0ZWQ6IGZhbHNlLFxuIFx0XHRcdF9zZWxmRGVjbGluZWQ6IGZhbHNlLFxuIFx0XHRcdF9zZWxmSW52YWxpZGF0ZWQ6IGZhbHNlLFxuIFx0XHRcdF9kaXNwb3NlSGFuZGxlcnM6IFtdLFxuIFx0XHRcdF9tYWluOiBob3RDdXJyZW50Q2hpbGRNb2R1bGUgIT09IG1vZHVsZUlkLFxuXG4gXHRcdFx0Ly8gTW9kdWxlIEFQSVxuIFx0XHRcdGFjdGl2ZTogdHJ1ZSxcbiBcdFx0XHRhY2NlcHQ6IGZ1bmN0aW9uKGRlcCwgY2FsbGJhY2spIHtcbiBcdFx0XHRcdGlmIChkZXAgPT09IHVuZGVmaW5lZCkgaG90Ll9zZWxmQWNjZXB0ZWQgPSB0cnVlO1xuIFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIGRlcCA9PT0gXCJmdW5jdGlvblwiKSBob3QuX3NlbGZBY2NlcHRlZCA9IGRlcDtcbiBcdFx0XHRcdGVsc2UgaWYgKHR5cGVvZiBkZXAgPT09IFwib2JqZWN0XCIpXG4gXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGVwLmxlbmd0aDsgaSsrKVxuIFx0XHRcdFx0XHRcdGhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwW2ldXSA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gXHRcdFx0XHRlbHNlIGhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwXSA9IGNhbGxiYWNrIHx8IGZ1bmN0aW9uKCkge307XG4gXHRcdFx0fSxcbiBcdFx0XHRkZWNsaW5lOiBmdW5jdGlvbihkZXApIHtcbiBcdFx0XHRcdGlmIChkZXAgPT09IHVuZGVmaW5lZCkgaG90Ll9zZWxmRGVjbGluZWQgPSB0cnVlO1xuIFx0XHRcdFx0ZWxzZSBpZiAodHlwZW9mIGRlcCA9PT0gXCJvYmplY3RcIilcbiBcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZXAubGVuZ3RoOyBpKyspXG4gXHRcdFx0XHRcdFx0aG90Ll9kZWNsaW5lZERlcGVuZGVuY2llc1tkZXBbaV1dID0gdHJ1ZTtcbiBcdFx0XHRcdGVsc2UgaG90Ll9kZWNsaW5lZERlcGVuZGVuY2llc1tkZXBdID0gdHJ1ZTtcbiBcdFx0XHR9LFxuIFx0XHRcdGRpc3Bvc2U6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gXHRcdFx0XHRob3QuX2Rpc3Bvc2VIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTtcbiBcdFx0XHR9LFxuIFx0XHRcdGFkZERpc3Bvc2VIYW5kbGVyOiBmdW5jdGlvbihjYWxsYmFjaykge1xuIFx0XHRcdFx0aG90Ll9kaXNwb3NlSGFuZGxlcnMucHVzaChjYWxsYmFjayk7XG4gXHRcdFx0fSxcbiBcdFx0XHRyZW1vdmVEaXNwb3NlSGFuZGxlcjogZnVuY3Rpb24oY2FsbGJhY2spIHtcbiBcdFx0XHRcdHZhciBpZHggPSBob3QuX2Rpc3Bvc2VIYW5kbGVycy5pbmRleE9mKGNhbGxiYWNrKTtcbiBcdFx0XHRcdGlmIChpZHggPj0gMCkgaG90Ll9kaXNwb3NlSGFuZGxlcnMuc3BsaWNlKGlkeCwgMSk7XG4gXHRcdFx0fSxcbiBcdFx0XHRpbnZhbGlkYXRlOiBmdW5jdGlvbigpIHtcbiBcdFx0XHRcdHRoaXMuX3NlbGZJbnZhbGlkYXRlZCA9IHRydWU7XG4gXHRcdFx0XHRzd2l0Y2ggKGhvdFN0YXR1cykge1xuIFx0XHRcdFx0XHRjYXNlIFwiaWRsZVwiOlxuIFx0XHRcdFx0XHRcdGhvdFVwZGF0ZSA9IHt9O1xuIFx0XHRcdFx0XHRcdGhvdFVwZGF0ZVttb2R1bGVJZF0gPSBtb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdFx0XHRob3RTZXRTdGF0dXMoXCJyZWFkeVwiKTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0Y2FzZSBcInJlYWR5XCI6XG4gXHRcdFx0XHRcdFx0aG90QXBwbHlJbnZhbGlkYXRlZE1vZHVsZShtb2R1bGVJZCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJwcmVwYXJlXCI6XG4gXHRcdFx0XHRcdGNhc2UgXCJjaGVja1wiOlxuIFx0XHRcdFx0XHRjYXNlIFwiZGlzcG9zZVwiOlxuIFx0XHRcdFx0XHRjYXNlIFwiYXBwbHlcIjpcbiBcdFx0XHRcdFx0XHQoaG90UXVldWVkSW52YWxpZGF0ZWRNb2R1bGVzID1cbiBcdFx0XHRcdFx0XHRcdGhvdFF1ZXVlZEludmFsaWRhdGVkTW9kdWxlcyB8fCBbXSkucHVzaChtb2R1bGVJZCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGRlZmF1bHQ6XG4gXHRcdFx0XHRcdFx0Ly8gaWdub3JlIHJlcXVlc3RzIGluIGVycm9yIHN0YXRlc1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH0sXG5cbiBcdFx0XHQvLyBNYW5hZ2VtZW50IEFQSVxuIFx0XHRcdGNoZWNrOiBob3RDaGVjayxcbiBcdFx0XHRhcHBseTogaG90QXBwbHksXG4gXHRcdFx0c3RhdHVzOiBmdW5jdGlvbihsKSB7XG4gXHRcdFx0XHRpZiAoIWwpIHJldHVybiBob3RTdGF0dXM7XG4gXHRcdFx0XHRob3RTdGF0dXNIYW5kbGVycy5wdXNoKGwpO1xuIFx0XHRcdH0sXG4gXHRcdFx0YWRkU3RhdHVzSGFuZGxlcjogZnVuY3Rpb24obCkge1xuIFx0XHRcdFx0aG90U3RhdHVzSGFuZGxlcnMucHVzaChsKTtcbiBcdFx0XHR9LFxuIFx0XHRcdHJlbW92ZVN0YXR1c0hhbmRsZXI6IGZ1bmN0aW9uKGwpIHtcbiBcdFx0XHRcdHZhciBpZHggPSBob3RTdGF0dXNIYW5kbGVycy5pbmRleE9mKGwpO1xuIFx0XHRcdFx0aWYgKGlkeCA+PSAwKSBob3RTdGF0dXNIYW5kbGVycy5zcGxpY2UoaWR4LCAxKTtcbiBcdFx0XHR9LFxuXG4gXHRcdFx0Ly9pbmhlcml0IGZyb20gcHJldmlvdXMgZGlzcG9zZSBjYWxsXG4gXHRcdFx0ZGF0YTogaG90Q3VycmVudE1vZHVsZURhdGFbbW9kdWxlSWRdXG4gXHRcdH07XG4gXHRcdGhvdEN1cnJlbnRDaGlsZE1vZHVsZSA9IHVuZGVmaW5lZDtcbiBcdFx0cmV0dXJuIGhvdDtcbiBcdH1cblxuIFx0dmFyIGhvdFN0YXR1c0hhbmRsZXJzID0gW107XG4gXHR2YXIgaG90U3RhdHVzID0gXCJpZGxlXCI7XG5cbiBcdGZ1bmN0aW9uIGhvdFNldFN0YXR1cyhuZXdTdGF0dXMpIHtcbiBcdFx0aG90U3RhdHVzID0gbmV3U3RhdHVzO1xuIFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGhvdFN0YXR1c0hhbmRsZXJzLmxlbmd0aDsgaSsrKVxuIFx0XHRcdGhvdFN0YXR1c0hhbmRsZXJzW2ldLmNhbGwobnVsbCwgbmV3U3RhdHVzKTtcbiBcdH1cblxuIFx0Ly8gd2hpbGUgZG93bmxvYWRpbmdcbiBcdHZhciBob3RXYWl0aW5nRmlsZXMgPSAwO1xuIFx0dmFyIGhvdENodW5rc0xvYWRpbmcgPSAwO1xuIFx0dmFyIGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuIFx0dmFyIGhvdFJlcXVlc3RlZEZpbGVzTWFwID0ge307XG4gXHR2YXIgaG90QXZhaWxhYmxlRmlsZXNNYXAgPSB7fTtcbiBcdHZhciBob3REZWZlcnJlZDtcblxuIFx0Ly8gVGhlIHVwZGF0ZSBpbmZvXG4gXHR2YXIgaG90VXBkYXRlLCBob3RVcGRhdGVOZXdIYXNoLCBob3RRdWV1ZWRJbnZhbGlkYXRlZE1vZHVsZXM7XG5cbiBcdGZ1bmN0aW9uIHRvTW9kdWxlSWQoaWQpIHtcbiBcdFx0dmFyIGlzTnVtYmVyID0gK2lkICsgXCJcIiA9PT0gaWQ7XG4gXHRcdHJldHVybiBpc051bWJlciA/ICtpZCA6IGlkO1xuIFx0fVxuXG4gXHRmdW5jdGlvbiBob3RDaGVjayhhcHBseSkge1xuIFx0XHRpZiAoaG90U3RhdHVzICE9PSBcImlkbGVcIikge1xuIFx0XHRcdHRocm93IG5ldyBFcnJvcihcImNoZWNrKCkgaXMgb25seSBhbGxvd2VkIGluIGlkbGUgc3RhdHVzXCIpO1xuIFx0XHR9XG4gXHRcdGhvdEFwcGx5T25VcGRhdGUgPSBhcHBseTtcbiBcdFx0aG90U2V0U3RhdHVzKFwiY2hlY2tcIik7XG4gXHRcdHJldHVybiBob3REb3dubG9hZE1hbmlmZXN0KGhvdFJlcXVlc3RUaW1lb3V0KS50aGVuKGZ1bmN0aW9uKHVwZGF0ZSkge1xuIFx0XHRcdGlmICghdXBkYXRlKSB7XG4gXHRcdFx0XHRob3RTZXRTdGF0dXMoaG90QXBwbHlJbnZhbGlkYXRlZE1vZHVsZXMoKSA/IFwicmVhZHlcIiA6IFwiaWRsZVwiKTtcbiBcdFx0XHRcdHJldHVybiBudWxsO1xuIFx0XHRcdH1cbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcCA9IHt9O1xuIFx0XHRcdGhvdFdhaXRpbmdGaWxlc01hcCA9IHt9O1xuIFx0XHRcdGhvdEF2YWlsYWJsZUZpbGVzTWFwID0gdXBkYXRlLmM7XG4gXHRcdFx0aG90VXBkYXRlTmV3SGFzaCA9IHVwZGF0ZS5oO1xuXG4gXHRcdFx0aG90U2V0U3RhdHVzKFwicHJlcGFyZVwiKTtcbiBcdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuIFx0XHRcdFx0aG90RGVmZXJyZWQgPSB7XG4gXHRcdFx0XHRcdHJlc29sdmU6IHJlc29sdmUsXG4gXHRcdFx0XHRcdHJlamVjdDogcmVqZWN0XG4gXHRcdFx0XHR9O1xuIFx0XHRcdH0pO1xuIFx0XHRcdGhvdFVwZGF0ZSA9IHt9O1xuIFx0XHRcdGZvcih2YXIgY2h1bmtJZCBpbiBpbnN0YWxsZWRDaHVua3MpXG4gXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvbmUtYmxvY2tzXG4gXHRcdFx0e1xuIFx0XHRcdFx0aG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdFx0fVxuIFx0XHRcdGlmIChcbiBcdFx0XHRcdGhvdFN0YXR1cyA9PT0gXCJwcmVwYXJlXCIgJiZcbiBcdFx0XHRcdGhvdENodW5rc0xvYWRpbmcgPT09IDAgJiZcbiBcdFx0XHRcdGhvdFdhaXRpbmdGaWxlcyA9PT0gMFxuIFx0XHRcdCkge1xuIFx0XHRcdFx0aG90VXBkYXRlRG93bmxvYWRlZCgpO1xuIFx0XHRcdH1cbiBcdFx0XHRyZXR1cm4gcHJvbWlzZTtcbiBcdFx0fSk7XG4gXHR9XG5cbiBcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuIFx0ZnVuY3Rpb24gaG90QWRkVXBkYXRlQ2h1bmsoY2h1bmtJZCwgbW9yZU1vZHVsZXMpIHtcbiBcdFx0aWYgKCFob3RBdmFpbGFibGVGaWxlc01hcFtjaHVua0lkXSB8fCAhaG90UmVxdWVzdGVkRmlsZXNNYXBbY2h1bmtJZF0pXG4gXHRcdFx0cmV0dXJuO1xuIFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcFtjaHVua0lkXSA9IGZhbHNlO1xuIFx0XHRmb3IgKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuIFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuIFx0XHRcdFx0aG90VXBkYXRlW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHR9XG4gXHRcdH1cbiBcdFx0aWYgKC0taG90V2FpdGluZ0ZpbGVzID09PSAwICYmIGhvdENodW5rc0xvYWRpbmcgPT09IDApIHtcbiBcdFx0XHRob3RVcGRhdGVEb3dubG9hZGVkKCk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90RW5zdXJlVXBkYXRlQ2h1bmsoY2h1bmtJZCkge1xuIFx0XHRpZiAoIWhvdEF2YWlsYWJsZUZpbGVzTWFwW2NodW5rSWRdKSB7XG4gXHRcdFx0aG90V2FpdGluZ0ZpbGVzTWFwW2NodW5rSWRdID0gdHJ1ZTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRob3RSZXF1ZXN0ZWRGaWxlc01hcFtjaHVua0lkXSA9IHRydWU7XG4gXHRcdFx0aG90V2FpdGluZ0ZpbGVzKys7XG4gXHRcdFx0aG90RG93bmxvYWRVcGRhdGVDaHVuayhjaHVua0lkKTtcbiBcdFx0fVxuIFx0fVxuXG4gXHRmdW5jdGlvbiBob3RVcGRhdGVEb3dubG9hZGVkKCkge1xuIFx0XHRob3RTZXRTdGF0dXMoXCJyZWFkeVwiKTtcbiBcdFx0dmFyIGRlZmVycmVkID0gaG90RGVmZXJyZWQ7XG4gXHRcdGhvdERlZmVycmVkID0gbnVsbDtcbiBcdFx0aWYgKCFkZWZlcnJlZCkgcmV0dXJuO1xuIFx0XHRpZiAoaG90QXBwbHlPblVwZGF0ZSkge1xuIFx0XHRcdC8vIFdyYXAgZGVmZXJyZWQgb2JqZWN0IGluIFByb21pc2UgdG8gbWFyayBpdCBhcyBhIHdlbGwtaGFuZGxlZCBQcm9taXNlIHRvXG4gXHRcdFx0Ly8gYXZvaWQgdHJpZ2dlcmluZyB1bmNhdWdodCBleGNlcHRpb24gd2FybmluZyBpbiBDaHJvbWUuXG4gXHRcdFx0Ly8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ2NTY2NlxuIFx0XHRcdFByb21pc2UucmVzb2x2ZSgpXG4gXHRcdFx0XHQudGhlbihmdW5jdGlvbigpIHtcbiBcdFx0XHRcdFx0cmV0dXJuIGhvdEFwcGx5KGhvdEFwcGx5T25VcGRhdGUpO1xuIFx0XHRcdFx0fSlcbiBcdFx0XHRcdC50aGVuKFxuIFx0XHRcdFx0XHRmdW5jdGlvbihyZXN1bHQpIHtcbiBcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKHJlc3VsdCk7XG4gXHRcdFx0XHRcdH0sXG4gXHRcdFx0XHRcdGZ1bmN0aW9uKGVycikge1xuIFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdChlcnIpO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHQpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0XHRmb3IgKHZhciBpZCBpbiBob3RVcGRhdGUpIHtcbiBcdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaG90VXBkYXRlLCBpZCkpIHtcbiBcdFx0XHRcdFx0b3V0ZGF0ZWRNb2R1bGVzLnB1c2godG9Nb2R1bGVJZChpZCkpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0XHRkZWZlcnJlZC5yZXNvbHZlKG91dGRhdGVkTW9kdWxlcyk7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90QXBwbHkob3B0aW9ucykge1xuIFx0XHRpZiAoaG90U3RhdHVzICE9PSBcInJlYWR5XCIpXG4gXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiYXBwbHkoKSBpcyBvbmx5IGFsbG93ZWQgaW4gcmVhZHkgc3RhdHVzXCIpO1xuIFx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiBcdFx0cmV0dXJuIGhvdEFwcGx5SW50ZXJuYWwob3B0aW9ucyk7XG4gXHR9XG5cbiBcdGZ1bmN0aW9uIGhvdEFwcGx5SW50ZXJuYWwob3B0aW9ucykge1xuIFx0XHRob3RBcHBseUludmFsaWRhdGVkTW9kdWxlcygpO1xuXG4gXHRcdHZhciBjYjtcbiBcdFx0dmFyIGk7XG4gXHRcdHZhciBqO1xuIFx0XHR2YXIgbW9kdWxlO1xuIFx0XHR2YXIgbW9kdWxlSWQ7XG5cbiBcdFx0ZnVuY3Rpb24gZ2V0QWZmZWN0ZWRTdHVmZih1cGRhdGVNb2R1bGVJZCkge1xuIFx0XHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbdXBkYXRlTW9kdWxlSWRdO1xuIFx0XHRcdHZhciBvdXRkYXRlZERlcGVuZGVuY2llcyA9IHt9O1xuXG4gXHRcdFx0dmFyIHF1ZXVlID0gb3V0ZGF0ZWRNb2R1bGVzLm1hcChmdW5jdGlvbihpZCkge1xuIFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0Y2hhaW46IFtpZF0sXG4gXHRcdFx0XHRcdGlkOiBpZFxuIFx0XHRcdFx0fTtcbiBcdFx0XHR9KTtcbiBcdFx0XHR3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuIFx0XHRcdFx0dmFyIHF1ZXVlSXRlbSA9IHF1ZXVlLnBvcCgpO1xuIFx0XHRcdFx0dmFyIG1vZHVsZUlkID0gcXVldWVJdGVtLmlkO1xuIFx0XHRcdFx0dmFyIGNoYWluID0gcXVldWVJdGVtLmNoYWluO1xuIFx0XHRcdFx0bW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRpZiAoXG4gXHRcdFx0XHRcdCFtb2R1bGUgfHxcbiBcdFx0XHRcdFx0KG1vZHVsZS5ob3QuX3NlbGZBY2NlcHRlZCAmJiAhbW9kdWxlLmhvdC5fc2VsZkludmFsaWRhdGVkKVxuIFx0XHRcdFx0KVxuIFx0XHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHRcdGlmIChtb2R1bGUuaG90Ll9zZWxmRGVjbGluZWQpIHtcbiBcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHR0eXBlOiBcInNlbGYtZGVjbGluZWRcIixcbiBcdFx0XHRcdFx0XHRjaGFpbjogY2hhaW4sXG4gXHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkXG4gXHRcdFx0XHRcdH07XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAobW9kdWxlLmhvdC5fbWFpbikge1xuIFx0XHRcdFx0XHRyZXR1cm4ge1xuIFx0XHRcdFx0XHRcdHR5cGU6IFwidW5hY2NlcHRlZFwiLFxuIFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbixcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWRcbiBcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbW9kdWxlLnBhcmVudHMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHRcdFx0dmFyIHBhcmVudElkID0gbW9kdWxlLnBhcmVudHNbaV07XG4gXHRcdFx0XHRcdHZhciBwYXJlbnQgPSBpbnN0YWxsZWRNb2R1bGVzW3BhcmVudElkXTtcbiBcdFx0XHRcdFx0aWYgKCFwYXJlbnQpIGNvbnRpbnVlO1xuIFx0XHRcdFx0XHRpZiAocGFyZW50LmhvdC5fZGVjbGluZWREZXBlbmRlbmNpZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0XHRcdFx0cmV0dXJuIHtcbiBcdFx0XHRcdFx0XHRcdHR5cGU6IFwiZGVjbGluZWRcIixcbiBcdFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXG4gXHRcdFx0XHRcdFx0XHRtb2R1bGVJZDogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdFx0XHRwYXJlbnRJZDogcGFyZW50SWRcbiBcdFx0XHRcdFx0XHR9O1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGlmIChvdXRkYXRlZE1vZHVsZXMuaW5kZXhPZihwYXJlbnRJZCkgIT09IC0xKSBjb250aW51ZTtcbiBcdFx0XHRcdFx0aWYgKHBhcmVudC5ob3QuX2FjY2VwdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSkge1xuIFx0XHRcdFx0XHRcdGlmICghb3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdKVxuIFx0XHRcdFx0XHRcdFx0b3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdID0gW107XG4gXHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdLCBbbW9kdWxlSWRdKTtcbiBcdFx0XHRcdFx0XHRjb250aW51ZTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRkZWxldGUgb3V0ZGF0ZWREZXBlbmRlbmNpZXNbcGFyZW50SWRdO1xuIFx0XHRcdFx0XHRvdXRkYXRlZE1vZHVsZXMucHVzaChwYXJlbnRJZCk7XG4gXHRcdFx0XHRcdHF1ZXVlLnB1c2goe1xuIFx0XHRcdFx0XHRcdGNoYWluOiBjaGFpbi5jb25jYXQoW3BhcmVudElkXSksXG4gXHRcdFx0XHRcdFx0aWQ6IHBhcmVudElkXG4gXHRcdFx0XHRcdH0pO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cblxuIFx0XHRcdHJldHVybiB7XG4gXHRcdFx0XHR0eXBlOiBcImFjY2VwdGVkXCIsXG4gXHRcdFx0XHRtb2R1bGVJZDogdXBkYXRlTW9kdWxlSWQsXG4gXHRcdFx0XHRvdXRkYXRlZE1vZHVsZXM6IG91dGRhdGVkTW9kdWxlcyxcbiBcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzOiBvdXRkYXRlZERlcGVuZGVuY2llc1xuIFx0XHRcdH07XG4gXHRcdH1cblxuIFx0XHRmdW5jdGlvbiBhZGRBbGxUb1NldChhLCBiKSB7XG4gXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHR2YXIgaXRlbSA9IGJbaV07XG4gXHRcdFx0XHRpZiAoYS5pbmRleE9mKGl0ZW0pID09PSAtMSkgYS5wdXNoKGl0ZW0pO1xuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIGF0IGJlZ2luIGFsbCB1cGRhdGVzIG1vZHVsZXMgYXJlIG91dGRhdGVkXG4gXHRcdC8vIHRoZSBcIm91dGRhdGVkXCIgc3RhdHVzIGNhbiBwcm9wYWdhdGUgdG8gcGFyZW50cyBpZiB0aGV5IGRvbid0IGFjY2VwdCB0aGUgY2hpbGRyZW5cbiBcdFx0dmFyIG91dGRhdGVkRGVwZW5kZW5jaWVzID0ge307XG4gXHRcdHZhciBvdXRkYXRlZE1vZHVsZXMgPSBbXTtcbiBcdFx0dmFyIGFwcGxpZWRVcGRhdGUgPSB7fTtcblxuIFx0XHR2YXIgd2FyblVuZXhwZWN0ZWRSZXF1aXJlID0gZnVuY3Rpb24gd2FyblVuZXhwZWN0ZWRSZXF1aXJlKCkge1xuIFx0XHRcdGNvbnNvbGUud2FybihcbiBcdFx0XHRcdFwiW0hNUl0gdW5leHBlY3RlZCByZXF1aXJlKFwiICsgcmVzdWx0Lm1vZHVsZUlkICsgXCIpIHRvIGRpc3Bvc2VkIG1vZHVsZVwiXG4gXHRcdFx0KTtcbiBcdFx0fTtcblxuIFx0XHRmb3IgKHZhciBpZCBpbiBob3RVcGRhdGUpIHtcbiBcdFx0XHRpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhvdFVwZGF0ZSwgaWQpKSB7XG4gXHRcdFx0XHRtb2R1bGVJZCA9IHRvTW9kdWxlSWQoaWQpO1xuIFx0XHRcdFx0LyoqIEB0eXBlIHtUT0RPfSAqL1xuIFx0XHRcdFx0dmFyIHJlc3VsdDtcbiBcdFx0XHRcdGlmIChob3RVcGRhdGVbaWRdKSB7XG4gXHRcdFx0XHRcdHJlc3VsdCA9IGdldEFmZmVjdGVkU3R1ZmYobW9kdWxlSWQpO1xuIFx0XHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdFx0cmVzdWx0ID0ge1xuIFx0XHRcdFx0XHRcdHR5cGU6IFwiZGlzcG9zZWRcIixcbiBcdFx0XHRcdFx0XHRtb2R1bGVJZDogaWRcbiBcdFx0XHRcdFx0fTtcbiBcdFx0XHRcdH1cbiBcdFx0XHRcdC8qKiBAdHlwZSB7RXJyb3J8ZmFsc2V9ICovXG4gXHRcdFx0XHR2YXIgYWJvcnRFcnJvciA9IGZhbHNlO1xuIFx0XHRcdFx0dmFyIGRvQXBwbHkgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBkb0Rpc3Bvc2UgPSBmYWxzZTtcbiBcdFx0XHRcdHZhciBjaGFpbkluZm8gPSBcIlwiO1xuIFx0XHRcdFx0aWYgKHJlc3VsdC5jaGFpbikge1xuIFx0XHRcdFx0XHRjaGFpbkluZm8gPSBcIlxcblVwZGF0ZSBwcm9wYWdhdGlvbjogXCIgKyByZXN1bHQuY2hhaW4uam9pbihcIiAtPiBcIik7XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRzd2l0Y2ggKHJlc3VsdC50eXBlKSB7XG4gXHRcdFx0XHRcdGNhc2UgXCJzZWxmLWRlY2xpbmVkXCI6XG4gXHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25EZWNsaW5lZCkgb3B0aW9ucy5vbkRlY2xpbmVkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZURlY2xpbmVkKVxuIFx0XHRcdFx0XHRcdFx0YWJvcnRFcnJvciA9IG5ldyBFcnJvcihcbiBcdFx0XHRcdFx0XHRcdFx0XCJBYm9ydGVkIGJlY2F1c2Ugb2Ygc2VsZiBkZWNsaW5lOiBcIiArXG4gXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm1vZHVsZUlkICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJkZWNsaW5lZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRGVjbGluZWQpIG9wdGlvbnMub25EZWNsaW5lZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVEZWNsaW5lZClcbiBcdFx0XHRcdFx0XHRcdGFib3J0RXJyb3IgPSBuZXcgRXJyb3IoXG4gXHRcdFx0XHRcdFx0XHRcdFwiQWJvcnRlZCBiZWNhdXNlIG9mIGRlY2xpbmVkIGRlcGVuZGVuY3k6IFwiICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQubW9kdWxlSWQgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdFwiIGluIFwiICtcbiBcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQucGFyZW50SWQgK1xuIFx0XHRcdFx0XHRcdFx0XHRcdGNoYWluSW5mb1xuIFx0XHRcdFx0XHRcdFx0KTtcbiBcdFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdFx0Y2FzZSBcInVuYWNjZXB0ZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vblVuYWNjZXB0ZWQpIG9wdGlvbnMub25VbmFjY2VwdGVkKHJlc3VsdCk7XG4gXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZVVuYWNjZXB0ZWQpXG4gXHRcdFx0XHRcdFx0XHRhYm9ydEVycm9yID0gbmV3IEVycm9yKFxuIFx0XHRcdFx0XHRcdFx0XHRcIkFib3J0ZWQgYmVjYXVzZSBcIiArIG1vZHVsZUlkICsgXCIgaXMgbm90IGFjY2VwdGVkXCIgKyBjaGFpbkluZm9cbiBcdFx0XHRcdFx0XHRcdCk7XG4gXHRcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRcdGNhc2UgXCJhY2NlcHRlZFwiOlxuIFx0XHRcdFx0XHRcdGlmIChvcHRpb25zLm9uQWNjZXB0ZWQpIG9wdGlvbnMub25BY2NlcHRlZChyZXN1bHQpO1xuIFx0XHRcdFx0XHRcdGRvQXBwbHkgPSB0cnVlO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRjYXNlIFwiZGlzcG9zZWRcIjpcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkRpc3Bvc2VkKSBvcHRpb25zLm9uRGlzcG9zZWQocmVzdWx0KTtcbiBcdFx0XHRcdFx0XHRkb0Rpc3Bvc2UgPSB0cnVlO1xuIFx0XHRcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdFx0XHRkZWZhdWx0OlxuIFx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuZXhjZXB0aW9uIHR5cGUgXCIgKyByZXN1bHQudHlwZSk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0XHRpZiAoYWJvcnRFcnJvcikge1xuIFx0XHRcdFx0XHRob3RTZXRTdGF0dXMoXCJhYm9ydFwiKTtcbiBcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KGFib3J0RXJyb3IpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0aWYgKGRvQXBwbHkpIHtcbiBcdFx0XHRcdFx0YXBwbGllZFVwZGF0ZVttb2R1bGVJZF0gPSBob3RVcGRhdGVbbW9kdWxlSWRdO1xuIFx0XHRcdFx0XHRhZGRBbGxUb1NldChvdXRkYXRlZE1vZHVsZXMsIHJlc3VsdC5vdXRkYXRlZE1vZHVsZXMpO1xuIFx0XHRcdFx0XHRmb3IgKG1vZHVsZUlkIGluIHJlc3VsdC5vdXRkYXRlZERlcGVuZGVuY2llcykge1xuIFx0XHRcdFx0XHRcdGlmIChcbiBcdFx0XHRcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcbiBcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzLFxuIFx0XHRcdFx0XHRcdFx0XHRtb2R1bGVJZFxuIFx0XHRcdFx0XHRcdFx0KVxuIFx0XHRcdFx0XHRcdCkge1xuIFx0XHRcdFx0XHRcdFx0aWYgKCFvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF0pXG4gXHRcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSA9IFtdO1xuIFx0XHRcdFx0XHRcdFx0YWRkQWxsVG9TZXQoXG4gXHRcdFx0XHRcdFx0XHRcdG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXSxcbiBcdFx0XHRcdFx0XHRcdFx0cmVzdWx0Lm91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXVxuIFx0XHRcdFx0XHRcdFx0KTtcbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHRcdGlmIChkb0Rpc3Bvc2UpIHtcbiBcdFx0XHRcdFx0YWRkQWxsVG9TZXQob3V0ZGF0ZWRNb2R1bGVzLCBbcmVzdWx0Lm1vZHVsZUlkXSk7XG4gXHRcdFx0XHRcdGFwcGxpZWRVcGRhdGVbbW9kdWxlSWRdID0gd2FyblVuZXhwZWN0ZWRSZXF1aXJlO1xuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIFN0b3JlIHNlbGYgYWNjZXB0ZWQgb3V0ZGF0ZWQgbW9kdWxlcyB0byByZXF1aXJlIHRoZW0gbGF0ZXIgYnkgdGhlIG1vZHVsZSBzeXN0ZW1cbiBcdFx0dmFyIG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlcyA9IFtdO1xuIFx0XHRmb3IgKGkgPSAwOyBpIDwgb3V0ZGF0ZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0bW9kdWxlSWQgPSBvdXRkYXRlZE1vZHVsZXNbaV07XG4gXHRcdFx0aWYgKFxuIFx0XHRcdFx0aW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gJiZcbiBcdFx0XHRcdGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkFjY2VwdGVkICYmXG4gXHRcdFx0XHQvLyByZW1vdmVkIHNlbGYtYWNjZXB0ZWQgbW9kdWxlcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkXG4gXHRcdFx0XHRhcHBsaWVkVXBkYXRlW21vZHVsZUlkXSAhPT0gd2FyblVuZXhwZWN0ZWRSZXF1aXJlICYmXG4gXHRcdFx0XHQvLyB3aGVuIGNhbGxlZCBpbnZhbGlkYXRlIHNlbGYtYWNjZXB0aW5nIGlzIG5vdCBwb3NzaWJsZVxuIFx0XHRcdFx0IWluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmhvdC5fc2VsZkludmFsaWRhdGVkXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMucHVzaCh7XG4gXHRcdFx0XHRcdG1vZHVsZTogbW9kdWxlSWQsXG4gXHRcdFx0XHRcdHBhcmVudHM6IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLnBhcmVudHMuc2xpY2UoKSxcbiBcdFx0XHRcdFx0ZXJyb3JIYW5kbGVyOiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5ob3QuX3NlbGZBY2NlcHRlZFxuIFx0XHRcdFx0fSk7XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gTm93IGluIFwiZGlzcG9zZVwiIHBoYXNlXG4gXHRcdGhvdFNldFN0YXR1cyhcImRpc3Bvc2VcIik7XG4gXHRcdE9iamVjdC5rZXlzKGhvdEF2YWlsYWJsZUZpbGVzTWFwKS5mb3JFYWNoKGZ1bmN0aW9uKGNodW5rSWQpIHtcbiBcdFx0XHRpZiAoaG90QXZhaWxhYmxlRmlsZXNNYXBbY2h1bmtJZF0gPT09IGZhbHNlKSB7XG4gXHRcdFx0XHRob3REaXNwb3NlQ2h1bmsoY2h1bmtJZCk7XG4gXHRcdFx0fVxuIFx0XHR9KTtcblxuIFx0XHR2YXIgaWR4O1xuIFx0XHR2YXIgcXVldWUgPSBvdXRkYXRlZE1vZHVsZXMuc2xpY2UoKTtcbiBcdFx0d2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiBcdFx0XHRtb2R1bGVJZCA9IHF1ZXVlLnBvcCgpO1xuIFx0XHRcdG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHRcdGlmICghbW9kdWxlKSBjb250aW51ZTtcblxuIFx0XHRcdHZhciBkYXRhID0ge307XG5cbiBcdFx0XHQvLyBDYWxsIGRpc3Bvc2UgaGFuZGxlcnNcbiBcdFx0XHR2YXIgZGlzcG9zZUhhbmRsZXJzID0gbW9kdWxlLmhvdC5fZGlzcG9zZUhhbmRsZXJzO1xuIFx0XHRcdGZvciAoaiA9IDA7IGogPCBkaXNwb3NlSGFuZGxlcnMubGVuZ3RoOyBqKyspIHtcbiBcdFx0XHRcdGNiID0gZGlzcG9zZUhhbmRsZXJzW2pdO1xuIFx0XHRcdFx0Y2IoZGF0YSk7XG4gXHRcdFx0fVxuIFx0XHRcdGhvdEN1cnJlbnRNb2R1bGVEYXRhW21vZHVsZUlkXSA9IGRhdGE7XG5cbiBcdFx0XHQvLyBkaXNhYmxlIG1vZHVsZSAodGhpcyBkaXNhYmxlcyByZXF1aXJlcyBmcm9tIHRoaXMgbW9kdWxlKVxuIFx0XHRcdG1vZHVsZS5ob3QuYWN0aXZlID0gZmFsc2U7XG5cbiBcdFx0XHQvLyByZW1vdmUgbW9kdWxlIGZyb20gY2FjaGVcbiBcdFx0XHRkZWxldGUgaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF07XG5cbiBcdFx0XHQvLyB3aGVuIGRpc3Bvc2luZyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgZGlzcG9zZSBoYW5kbGVyXG4gXHRcdFx0ZGVsZXRlIG91dGRhdGVkRGVwZW5kZW5jaWVzW21vZHVsZUlkXTtcblxuIFx0XHRcdC8vIHJlbW92ZSBcInBhcmVudHNcIiByZWZlcmVuY2VzIGZyb20gYWxsIGNoaWxkcmVuXG4gXHRcdFx0Zm9yIChqID0gMDsgaiA8IG1vZHVsZS5jaGlsZHJlbi5sZW5ndGg7IGorKykge1xuIFx0XHRcdFx0dmFyIGNoaWxkID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGUuY2hpbGRyZW5bal1dO1xuIFx0XHRcdFx0aWYgKCFjaGlsZCkgY29udGludWU7XG4gXHRcdFx0XHRpZHggPSBjaGlsZC5wYXJlbnRzLmluZGV4T2YobW9kdWxlSWQpO1xuIFx0XHRcdFx0aWYgKGlkeCA+PSAwKSB7XG4gXHRcdFx0XHRcdGNoaWxkLnBhcmVudHMuc3BsaWNlKGlkeCwgMSk7XG4gXHRcdFx0XHR9XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gcmVtb3ZlIG91dGRhdGVkIGRlcGVuZGVuY3kgZnJvbSBtb2R1bGUgY2hpbGRyZW5cbiBcdFx0dmFyIGRlcGVuZGVuY3k7XG4gXHRcdHZhciBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcztcbiBcdFx0Zm9yIChtb2R1bGVJZCBpbiBvdXRkYXRlZERlcGVuZGVuY2llcykge1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXRkYXRlZERlcGVuZGVuY2llcywgbW9kdWxlSWQpXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdGlmIChtb2R1bGUpIHtcbiBcdFx0XHRcdFx0bW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMgPSBvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRcdGZvciAoaiA9IDA7IGogPCBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llcy5sZW5ndGg7IGorKykge1xuIFx0XHRcdFx0XHRcdGRlcGVuZGVuY3kgPSBtb2R1bGVPdXRkYXRlZERlcGVuZGVuY2llc1tqXTtcbiBcdFx0XHRcdFx0XHRpZHggPSBtb2R1bGUuY2hpbGRyZW4uaW5kZXhPZihkZXBlbmRlbmN5KTtcbiBcdFx0XHRcdFx0XHRpZiAoaWR4ID49IDApIG1vZHVsZS5jaGlsZHJlbi5zcGxpY2UoaWR4LCAxKTtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIE5vdyBpbiBcImFwcGx5XCIgcGhhc2VcbiBcdFx0aG90U2V0U3RhdHVzKFwiYXBwbHlcIik7XG5cbiBcdFx0aWYgKGhvdFVwZGF0ZU5ld0hhc2ggIT09IHVuZGVmaW5lZCkge1xuIFx0XHRcdGhvdEN1cnJlbnRIYXNoID0gaG90VXBkYXRlTmV3SGFzaDtcbiBcdFx0XHRob3RVcGRhdGVOZXdIYXNoID0gdW5kZWZpbmVkO1xuIFx0XHR9XG4gXHRcdGhvdFVwZGF0ZSA9IHVuZGVmaW5lZDtcblxuIFx0XHQvLyBpbnNlcnQgbmV3IGNvZGVcbiBcdFx0Zm9yIChtb2R1bGVJZCBpbiBhcHBsaWVkVXBkYXRlKSB7XG4gXHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcHBsaWVkVXBkYXRlLCBtb2R1bGVJZCkpIHtcbiBcdFx0XHRcdG1vZHVsZXNbbW9kdWxlSWRdID0gYXBwbGllZFVwZGF0ZVttb2R1bGVJZF07XG4gXHRcdFx0fVxuIFx0XHR9XG5cbiBcdFx0Ly8gY2FsbCBhY2NlcHQgaGFuZGxlcnNcbiBcdFx0dmFyIGVycm9yID0gbnVsbDtcbiBcdFx0Zm9yIChtb2R1bGVJZCBpbiBvdXRkYXRlZERlcGVuZGVuY2llcykge1xuIFx0XHRcdGlmIChcbiBcdFx0XHRcdE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvdXRkYXRlZERlcGVuZGVuY2llcywgbW9kdWxlSWQpXG4gXHRcdFx0KSB7XG4gXHRcdFx0XHRtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXTtcbiBcdFx0XHRcdGlmIChtb2R1bGUpIHtcbiBcdFx0XHRcdFx0bW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMgPSBvdXRkYXRlZERlcGVuZGVuY2llc1ttb2R1bGVJZF07XG4gXHRcdFx0XHRcdHZhciBjYWxsYmFja3MgPSBbXTtcbiBcdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gXHRcdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IG1vZHVsZU91dGRhdGVkRGVwZW5kZW5jaWVzW2ldO1xuIFx0XHRcdFx0XHRcdGNiID0gbW9kdWxlLmhvdC5fYWNjZXB0ZWREZXBlbmRlbmNpZXNbZGVwZW5kZW5jeV07XG4gXHRcdFx0XHRcdFx0aWYgKGNiKSB7XG4gXHRcdFx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzLmluZGV4T2YoY2IpICE9PSAtMSkgY29udGludWU7XG4gXHRcdFx0XHRcdFx0XHRjYWxsYmFja3MucHVzaChjYik7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHRcdFx0XHRjYiA9IGNhbGxiYWNrc1tpXTtcbiBcdFx0XHRcdFx0XHR0cnkge1xuIFx0XHRcdFx0XHRcdFx0Y2IobW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXMpO1xuIFx0XHRcdFx0XHRcdH0gY2F0Y2ggKGVycikge1xuIFx0XHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMub25FcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcbiBcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdC1lcnJvcmVkXCIsXG4gXHRcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0XHRcdGRlcGVuZGVuY3lJZDogbW9kdWxlT3V0ZGF0ZWREZXBlbmRlbmNpZXNbaV0sXG4gXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGVyclxuIFx0XHRcdFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyO1xuIFx0XHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdH1cbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fVxuIFx0XHRcdH1cbiBcdFx0fVxuXG4gXHRcdC8vIExvYWQgc2VsZiBhY2NlcHRlZCBtb2R1bGVzXG4gXHRcdGZvciAoaSA9IDA7IGkgPCBvdXRkYXRlZFNlbGZBY2NlcHRlZE1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiBcdFx0XHR2YXIgaXRlbSA9IG91dGRhdGVkU2VsZkFjY2VwdGVkTW9kdWxlc1tpXTtcbiBcdFx0XHRtb2R1bGVJZCA9IGl0ZW0ubW9kdWxlO1xuIFx0XHRcdGhvdEN1cnJlbnRQYXJlbnRzID0gaXRlbS5wYXJlbnRzO1xuIFx0XHRcdGhvdEN1cnJlbnRDaGlsZE1vZHVsZSA9IG1vZHVsZUlkO1xuIFx0XHRcdHRyeSB7XG4gXHRcdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKTtcbiBcdFx0XHR9IGNhdGNoIChlcnIpIHtcbiBcdFx0XHRcdGlmICh0eXBlb2YgaXRlbS5lcnJvckhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuIFx0XHRcdFx0XHR0cnkge1xuIFx0XHRcdFx0XHRcdGl0ZW0uZXJyb3JIYW5kbGVyKGVycik7XG4gXHRcdFx0XHRcdH0gY2F0Y2ggKGVycjIpIHtcbiBcdFx0XHRcdFx0XHRpZiAob3B0aW9ucy5vbkVycm9yZWQpIHtcbiBcdFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcbiBcdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJzZWxmLWFjY2VwdC1lcnJvci1oYW5kbGVyLWVycm9yZWRcIixcbiBcdFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyMixcbiBcdFx0XHRcdFx0XHRcdFx0b3JpZ2luYWxFcnJvcjogZXJyXG4gXHRcdFx0XHRcdFx0XHR9KTtcbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdFx0aWYgKCFvcHRpb25zLmlnbm9yZUVycm9yZWQpIHtcbiBcdFx0XHRcdFx0XHRcdGlmICghZXJyb3IpIGVycm9yID0gZXJyMjtcbiBcdFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlcnI7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHRcdGlmIChvcHRpb25zLm9uRXJyb3JlZCkge1xuIFx0XHRcdFx0XHRcdG9wdGlvbnMub25FcnJvcmVkKHtcbiBcdFx0XHRcdFx0XHRcdHR5cGU6IFwic2VsZi1hY2NlcHQtZXJyb3JlZFwiLFxuIFx0XHRcdFx0XHRcdFx0bW9kdWxlSWQ6IG1vZHVsZUlkLFxuIFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGVyclxuIFx0XHRcdFx0XHRcdH0pO1xuIFx0XHRcdFx0XHR9XG4gXHRcdFx0XHRcdGlmICghb3B0aW9ucy5pZ25vcmVFcnJvcmVkKSB7XG4gXHRcdFx0XHRcdFx0aWYgKCFlcnJvcikgZXJyb3IgPSBlcnI7XG4gXHRcdFx0XHRcdH1cbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH1cblxuIFx0XHQvLyBoYW5kbGUgZXJyb3JzIGluIGFjY2VwdCBoYW5kbGVycyBhbmQgc2VsZiBhY2NlcHRlZCBtb2R1bGUgbG9hZFxuIFx0XHRpZiAoZXJyb3IpIHtcbiBcdFx0XHRob3RTZXRTdGF0dXMoXCJmYWlsXCIpO1xuIFx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gXHRcdH1cblxuIFx0XHRpZiAoaG90UXVldWVkSW52YWxpZGF0ZWRNb2R1bGVzKSB7XG4gXHRcdFx0cmV0dXJuIGhvdEFwcGx5SW50ZXJuYWwob3B0aW9ucykudGhlbihmdW5jdGlvbihsaXN0KSB7XG4gXHRcdFx0XHRvdXRkYXRlZE1vZHVsZXMuZm9yRWFjaChmdW5jdGlvbihtb2R1bGVJZCkge1xuIFx0XHRcdFx0XHRpZiAobGlzdC5pbmRleE9mKG1vZHVsZUlkKSA8IDApIGxpc3QucHVzaChtb2R1bGVJZCk7XG4gXHRcdFx0XHR9KTtcbiBcdFx0XHRcdHJldHVybiBsaXN0O1xuIFx0XHRcdH0pO1xuIFx0XHR9XG5cbiBcdFx0aG90U2V0U3RhdHVzKFwiaWRsZVwiKTtcbiBcdFx0cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiBcdFx0XHRyZXNvbHZlKG91dGRhdGVkTW9kdWxlcyk7XG4gXHRcdH0pO1xuIFx0fVxuXG4gXHRmdW5jdGlvbiBob3RBcHBseUludmFsaWRhdGVkTW9kdWxlcygpIHtcbiBcdFx0aWYgKGhvdFF1ZXVlZEludmFsaWRhdGVkTW9kdWxlcykge1xuIFx0XHRcdGlmICghaG90VXBkYXRlKSBob3RVcGRhdGUgPSB7fTtcbiBcdFx0XHRob3RRdWV1ZWRJbnZhbGlkYXRlZE1vZHVsZXMuZm9yRWFjaChob3RBcHBseUludmFsaWRhdGVkTW9kdWxlKTtcbiBcdFx0XHRob3RRdWV1ZWRJbnZhbGlkYXRlZE1vZHVsZXMgPSB1bmRlZmluZWQ7XG4gXHRcdFx0cmV0dXJuIHRydWU7XG4gXHRcdH1cbiBcdH1cblxuIFx0ZnVuY3Rpb24gaG90QXBwbHlJbnZhbGlkYXRlZE1vZHVsZShtb2R1bGVJZCkge1xuIFx0XHRpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChob3RVcGRhdGUsIG1vZHVsZUlkKSlcbiBcdFx0XHRob3RVcGRhdGVbbW9kdWxlSWRdID0gbW9kdWxlc1ttb2R1bGVJZF07XG4gXHR9XG5cbiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgYW5kIGxvYWRpbmcgY2h1bmtzXG4gXHQvLyB1bmRlZmluZWQgPSBjaHVuayBub3QgbG9hZGVkLCBudWxsID0gY2h1bmsgcHJlbG9hZGVkL3ByZWZldGNoZWRcbiBcdC8vIFByb21pc2UgPSBjaHVuayBsb2FkaW5nLCAwID0gY2h1bmsgbG9hZGVkXG4gXHR2YXIgaW5zdGFsbGVkQ2h1bmtzID0ge1xuIFx0XHRcIndlYnBhY2tcIjogMFxuIFx0fTtcblxuIFx0dmFyIGRlZmVycmVkTW9kdWxlcyA9IFtdO1xuXG4gXHQvLyBzY3JpcHQgcGF0aCBmdW5jdGlvblxuIFx0ZnVuY3Rpb24ganNvbnBTY3JpcHRTcmMoY2h1bmtJZCkge1xuIFx0XHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgXCJzdGF0aWMvY2h1bmtzL1wiICsgKHt9W2NodW5rSWRdfHxjaHVua0lkKSArIFwiLmpzXCJcbiBcdH1cblxuIFx0Ly8gbm9vcCBmbnMgdG8gcHJldmVudCBydW50aW1lIGVycm9ycyBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbiBcdGlmICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuIFx0XHRzZWxmLiRSZWZyZXNoUmVnJCA9IGZ1bmN0aW9uICgpIHt9O1xuIFx0XHRzZWxmLiRSZWZyZXNoU2lnJCA9IGZ1bmN0aW9uICgpIHtcbiBcdFx0XHRyZXR1cm4gZnVuY3Rpb24gKHR5cGUpIHtcbiBcdFx0XHRcdHJldHVybiB0eXBlO1xuIFx0XHRcdH07XG4gXHRcdH07XG4gXHR9XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9LFxuIFx0XHRcdGhvdDogaG90Q3JlYXRlTW9kdWxlKG1vZHVsZUlkKSxcbiBcdFx0XHRwYXJlbnRzOiAoaG90Q3VycmVudFBhcmVudHNUZW1wID0gaG90Q3VycmVudFBhcmVudHMsIGhvdEN1cnJlbnRQYXJlbnRzID0gW10sIGhvdEN1cnJlbnRQYXJlbnRzVGVtcCksXG4gXHRcdFx0Y2hpbGRyZW46IFtdXG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdHZhciB0aHJldyA9IHRydWU7XG4gXHRcdHRyeSB7XG5cbiBcdFx0ICAgICAgICB2YXIgaGFzUmVmcmVzaCA9IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmICEhc2VsZi4kUmVmcmVzaEludGVyY2VwdE1vZHVsZUV4ZWN1dGlvbiQ7XG4gXHRcdCAgICAgICAgdmFyIGNsZWFudXAgPSBoYXNSZWZyZXNoXG4gXHRcdCAgICAgICAgICA/IHNlbGYuJFJlZnJlc2hJbnRlcmNlcHRNb2R1bGVFeGVjdXRpb24kKG1vZHVsZUlkKVxuIFx0XHQgICAgICAgICAgOiBmdW5jdGlvbigpIHt9O1xuIFx0XHQgICAgICAgIHRyeSB7XG4gXHRcdCAgICAgICAgXG4gXHRcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgaG90Q3JlYXRlUmVxdWlyZShtb2R1bGVJZCkpO1xuXG4gXHRcdCAgICAgICAgfSBmaW5hbGx5IHtcbiBcdFx0ICAgICAgICAgIGNsZWFudXAoKTtcbiBcdFx0ICAgICAgICB9XG4gXHRcdCAgICAgICAgXG4gXHRcdFx0dGhyZXcgPSBmYWxzZTtcbiBcdFx0fSBmaW5hbGx5IHtcbiBcdFx0XHRpZih0aHJldykgZGVsZXRlIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdO1xuIFx0XHR9XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG4gXHQvLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4gXHQvLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3NcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZSA9IGZ1bmN0aW9uIHJlcXVpcmVFbnN1cmUoY2h1bmtJZCkge1xuIFx0XHR2YXIgcHJvbWlzZXMgPSBbXTtcblxuXG4gXHRcdC8vIEpTT05QIGNodW5rIGxvYWRpbmcgZm9yIGphdmFzY3JpcHRcblxuIFx0XHR2YXIgaW5zdGFsbGVkQ2h1bmtEYXRhID0gaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdO1xuIFx0XHRpZihpbnN0YWxsZWRDaHVua0RhdGEgIT09IDApIHsgLy8gMCBtZWFucyBcImFscmVhZHkgaW5zdGFsbGVkXCIuXG5cbiBcdFx0XHQvLyBhIFByb21pc2UgbWVhbnMgXCJjdXJyZW50bHkgbG9hZGluZ1wiLlxuIFx0XHRcdGlmKGluc3RhbGxlZENodW5rRGF0YSkge1xuIFx0XHRcdFx0cHJvbWlzZXMucHVzaChpbnN0YWxsZWRDaHVua0RhdGFbMl0pO1xuIFx0XHRcdH0gZWxzZSB7XG4gXHRcdFx0XHQvLyBzZXR1cCBQcm9taXNlIGluIGNodW5rIGNhY2hlXG4gXHRcdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuIFx0XHRcdFx0XHRpbnN0YWxsZWRDaHVua0RhdGEgPSBpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiBcdFx0XHRcdH0pO1xuIFx0XHRcdFx0cHJvbWlzZXMucHVzaChpbnN0YWxsZWRDaHVua0RhdGFbMl0gPSBwcm9taXNlKTtcblxuIFx0XHRcdFx0Ly8gc3RhcnQgY2h1bmsgbG9hZGluZ1xuIFx0XHRcdFx0dmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuIFx0XHRcdFx0dmFyIG9uU2NyaXB0Q29tcGxldGU7XG5cbiBcdFx0XHRcdHNjcmlwdC5jaGFyc2V0ID0gJ3V0Zi04JztcbiBcdFx0XHRcdHNjcmlwdC50aW1lb3V0ID0gMTIwO1xuIFx0XHRcdFx0aWYgKF9fd2VicGFja19yZXF1aXJlX18ubmMpIHtcbiBcdFx0XHRcdFx0c2NyaXB0LnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsIF9fd2VicGFja19yZXF1aXJlX18ubmMpO1xuIFx0XHRcdFx0fVxuIFx0XHRcdFx0c2NyaXB0LnNyYyA9IGpzb25wU2NyaXB0U3JjKGNodW5rSWQpO1xuXG4gXHRcdFx0XHQvLyBjcmVhdGUgZXJyb3IgYmVmb3JlIHN0YWNrIHVud291bmQgdG8gZ2V0IHVzZWZ1bCBzdGFja3RyYWNlIGxhdGVyXG4gXHRcdFx0XHR2YXIgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiBcdFx0XHRcdG9uU2NyaXB0Q29tcGxldGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiBcdFx0XHRcdFx0Ly8gYXZvaWQgbWVtIGxlYWtzIGluIElFLlxuIFx0XHRcdFx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuIFx0XHRcdFx0XHRjbGVhclRpbWVvdXQodGltZW91dCk7XG4gXHRcdFx0XHRcdHZhciBjaHVuayA9IGluc3RhbGxlZENodW5rc1tjaHVua0lkXTtcbiBcdFx0XHRcdFx0aWYoY2h1bmsgIT09IDApIHtcbiBcdFx0XHRcdFx0XHRpZihjaHVuaykge1xuIFx0XHRcdFx0XHRcdFx0dmFyIGVycm9yVHlwZSA9IGV2ZW50ICYmIChldmVudC50eXBlID09PSAnbG9hZCcgPyAnbWlzc2luZycgOiBldmVudC50eXBlKTtcbiBcdFx0XHRcdFx0XHRcdHZhciByZWFsU3JjID0gZXZlbnQgJiYgZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5zcmM7XG4gXHRcdFx0XHRcdFx0XHRlcnJvci5tZXNzYWdlID0gJ0xvYWRpbmcgY2h1bmsgJyArIGNodW5rSWQgKyAnIGZhaWxlZC5cXG4oJyArIGVycm9yVHlwZSArICc6ICcgKyByZWFsU3JjICsgJyknO1xuIFx0XHRcdFx0XHRcdFx0ZXJyb3IubmFtZSA9ICdDaHVua0xvYWRFcnJvcic7XG4gXHRcdFx0XHRcdFx0XHRlcnJvci50eXBlID0gZXJyb3JUeXBlO1xuIFx0XHRcdFx0XHRcdFx0ZXJyb3IucmVxdWVzdCA9IHJlYWxTcmM7XG4gXHRcdFx0XHRcdFx0XHRjaHVua1sxXShlcnJvcik7XG4gXHRcdFx0XHRcdFx0fVxuIFx0XHRcdFx0XHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IHVuZGVmaW5lZDtcbiBcdFx0XHRcdFx0fVxuIFx0XHRcdFx0fTtcbiBcdFx0XHRcdHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuIFx0XHRcdFx0XHRvblNjcmlwdENvbXBsZXRlKHsgdHlwZTogJ3RpbWVvdXQnLCB0YXJnZXQ6IHNjcmlwdCB9KTtcbiBcdFx0XHRcdH0sIDEyMDAwMCk7XG4gXHRcdFx0XHRzY3JpcHQub25lcnJvciA9IHNjcmlwdC5vbmxvYWQgPSBvblNjcmlwdENvbXBsZXRlO1xuIFx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuIFx0XHRcdH1cbiBcdFx0fVxuIFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuIFx0fTtcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG4gXHQvLyBvbiBlcnJvciBmdW5jdGlvbiBmb3IgYXN5bmMgbG9hZGluZ1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vZSA9IGZ1bmN0aW9uKGVycikgeyBjb25zb2xlLmVycm9yKGVycik7IHRocm93IGVycjsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX2hhc2hfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5oID0gZnVuY3Rpb24oKSB7IHJldHVybiBob3RDdXJyZW50SGFzaDsgfTtcblxuIFx0dmFyIGpzb25wQXJyYXkgPSB3aW5kb3dbXCJ3ZWJwYWNrSnNvbnBfTl9FXCJdID0gd2luZG93W1wid2VicGFja0pzb25wX05fRVwiXSB8fCBbXTtcbiBcdHZhciBvbGRKc29ucEZ1bmN0aW9uID0ganNvbnBBcnJheS5wdXNoLmJpbmQoanNvbnBBcnJheSk7XG4gXHRqc29ucEFycmF5LnB1c2ggPSB3ZWJwYWNrSnNvbnBDYWxsYmFjaztcbiBcdGpzb25wQXJyYXkgPSBqc29ucEFycmF5LnNsaWNlKCk7XG4gXHRmb3IodmFyIGkgPSAwOyBpIDwganNvbnBBcnJheS5sZW5ndGg7IGkrKykgd2VicGFja0pzb25wQ2FsbGJhY2soanNvbnBBcnJheVtpXSk7XG4gXHR2YXIgcGFyZW50SnNvbnBGdW5jdGlvbiA9IG9sZEpzb25wRnVuY3Rpb247XG5cblxuIFx0Ly8gcnVuIGRlZmVycmVkIG1vZHVsZXMgZnJvbSBvdGhlciBjaHVua3NcbiBcdGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/.next/static/development/_buildManifest.js b/.next/static/development/_buildManifest.js new file mode 100644 index 0000000..0556605 --- /dev/null +++ b/.next/static/development/_buildManifest.js @@ -0,0 +1 @@ +self.__BUILD_MANIFEST = {__rewrites:{beforeFiles:[],afterFiles:[],fallback:[]},"/":["static\u002Fchunks\u002Fpages\u002Findex.js"],"/_error":["static\u002Fchunks\u002Fpages\u002F_error.js"],sortedPages:["\u002F","\u002F_app","\u002F_error"]};self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB() \ No newline at end of file diff --git a/.next/static/development/_ssgManifest.js b/.next/static/development/_ssgManifest.js new file mode 100644 index 0000000..2260768 --- /dev/null +++ b/.next/static/development/_ssgManifest.js @@ -0,0 +1 @@ +self.__SSG_MANIFEST=new Set;self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB() \ No newline at end of file diff --git a/.next/static/media/brand-icons.278156e41e0ad908cf7f841b17130502.woff2 b/.next/static/media/brand-icons.278156e41e0ad908cf7f841b17130502.woff2 new file mode 100644 index 0000000..0d575fd Binary files /dev/null and b/.next/static/media/brand-icons.278156e41e0ad908cf7f841b17130502.woff2 differ diff --git a/.next/static/media/brand-icons.65a2fb6d9aaa164b41a039302093995b.ttf b/.next/static/media/brand-icons.65a2fb6d9aaa164b41a039302093995b.ttf new file mode 100644 index 0000000..f990851 Binary files /dev/null and b/.next/static/media/brand-icons.65a2fb6d9aaa164b41a039302093995b.ttf differ diff --git a/.next/static/media/brand-icons.6729d29753e000c17489ed43135ba8d5.svg b/.next/static/media/brand-icons.6729d29753e000c17489ed43135ba8d5.svg new file mode 100644 index 0000000..4c23753 --- /dev/null +++ b/.next/static/media/brand-icons.6729d29753e000c17489ed43135ba8d5.svg @@ -0,0 +1,1008 @@ +<?xml version="1.0" standalone="no"?> +<!-- +Font Awesome Free 5.0.8 by @fontawesome - https://fontawesome.com +License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +--> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<defs> + <font id="fontawesome-free" horiz-adv-x="640.4"> + <font-face font-family="Font Awesome 5 Brands" + units-per-em="512" ascent="448" + descent="64" + font-weight="400" + font-style="Regular" /> + <missing-glyph horiz-adv-x="0" /> + <glyph glyph-name="500px" + unicode="" + horiz-adv-x="448" d=" M103.3 103.7C96.8 117.9 96.4 122 110.7 126.8C136.3 134.8 118.7 117.6 153.9 77.6H154.2V171.5C155.4 221.7 198.2 263.7 251.9000000000001 263.7C305.8 263.7 349.6 220.2 349.6 166.9C349.6 103.5 288.8 53.7 221.1 73.6C210.6 77.8 219 105.3 229.6 102.2C282.6 102.2 319 112.3 319 166.6C319 227.6 241.9 256.2000000000001 202.1 211.2C178.6 184.8 184.5 169.1 184.5 53.6C235.2 22.6 302.8 31.6 344.9 73.7000000000001C369.7 98.5000000000001 383.4 131.7000000000001 383.4 166.7000000000001C383.4 201.9 369.6 234.9000000000001 344.6 260.0000000000001C319.8 284.8000000000001 286.8 298.5000000000001 251.3 298.5000000000001S182.5 284.7000000000001 157.8 260.0000000000001C157.5 259.7000000000001 141.8 243.5000000000001 136.6 236.1000000000001L136.1 235.5000000000001C132.8 230.8000000000001 129.8 226.4000000000001 116 229.4000000000001C109.1 231.1000000000001 101.7 235.2000000000001 101.7 241.2000000000001V428C101.7 433 105.6 438.5 112.2 438.5H353.5C361.8 438.5 361.8 426.9 361.8 423.4C361.8 419.5 361.8 408.3 353.5 408.3H130.3V275.4H130.6C234.8 385.2 413.4000000000001 311.4 413.4000000000001 166.5C413.4000000000001 -11.6 168.6 -53.8 103.3 103.7zM166.6 364.5C166.1 360.3 171.2 340 181.2 343.9C306 391.4 384 303.5 390.6 303.5C395.4000000000001 303.5 413.4000000000001 318.8 404.9000000000001 326.3C311.7000000000001 415.3 170.4 383.3 166.6 364.5zM393 33.3C283 -76.6 94 -27.5 61 137.5C61 149.7 30.6 144.9 32.1 134.2C56.1 -39.2 278.1 -122.7 413.7000000000001 12.9C420.6 20.7 401.1 41.3 393.0000000000001 33.3zM213.6 141.4C213.6 137.4 217.9 134.1 219.1 132.9C222.1 129.9 225.2 128.5 227.6 128.5C231.4 128.5 230.2 128.3 249.9 148C269.5 128.7 269 128.5 272.2 128.5C277.6 128.5 290.7 138.9 282.9 146.7L265.6 164L283.8 182.2C290.1 189 273.7 204 267.6 197.9L249.7 180C231.1 198.8 231.3 199.5 228.2 199.5C223.2 199.5 210.2 187.8 215.8 182.2L234 164C215.9 146.1 213.6 144.8 213.6 141.4z" /> + <glyph glyph-name="accessible-icon" + unicode="" + horiz-adv-x="448" d=" M423.9 192.2L411 34.9C407.7 -5.8 347.1 -0.2 350.4 39.8L360.4 162.3L319.3 160C329.4 139.3 335.1 116.1 335.1 91.4999999999999C335.1 50.3 319 12.8 292.8 -15.0000000000001L253.5 24.3C311.3999999999999 87.9999999999999 266.6 191.5 179.5 191.5C153.5999999999999 191.5 130 181.6 112.2999999999999 165.5L73 204.8C95 225.5 123.1 239.9 154.4 245L229.7 330.7L187.1 355.5L135.5 309.5C105.5 282.7 64.9 328 95 354.9L163 415.6C172.8 424.4000000000001 187.1 425.8 198.5 419.2C198.5 419.2 337.8 338.3 338 338.1C354.2 328 358.7 302.1 344.1 285.5L285.7 219L391.8 224.9C410.3 226 425.4 210.5 423.9 192.2zM359 346.2C387.1 346.2 409.9 369 409.9 397.1C409.9 425.2 387.1 448 359 448C330.9 448 308.1 425.2 308.1 397.1C308.1 369 330.9000000000001 346.2 359 346.2zM179.6 -8.5C99 -8.5 52.2 82.1 96.9 147.6L57.2 187.3C36.4 161 24 127.7 24 91.6C24 -39.1 174.7 -109.7999999999999 275.4 -30.9L235.7 8.8C219.7 -2.1 200.4 -8.5 179.6 -8.5z" /> + <glyph glyph-name="accusoft" + unicode="" + horiz-adv-x="640" d=" M482.2 75.9C476.5 82.8 250 373 242.3 382.5C228.6 399.7 242.3 399.3 261.5 399.4C271.2 399.5 367.8 400 378 400C402.1 400.1 406.7 399.4 416.4 387.2C418.5 384.5 621.5 141.4 623.5999999999999 138.9C629.0999999999999 132.2 638.8 119.8 630.8 115.5C628.4 114.2 516.1999999999999 67.8 513 66.6C502.9 62.6 495.5 59.8 482.2 75.9M596.9 81.5000000000001S481.9 31.1000000000001 479.4 29.9C463.4 22.6 452.5 33.1 442.7 44.5000000000001L385.6 118.5000000000001C380.2 119.4 325.2 128.1000000000001 320.3 127.8000000000001C317.2 127.6000000000001 310.7 127.0000000000001 305.9 124.9000000000001C301 122.8000000000001 160.7 72.1000000000001 155.7 70.2000000000001C150.6 68.2000000000001 144.3 66.6000000000001 144.6 62.6000000000001C144.8 60.1000000000001 146.6 60.0000000000001 149.2 59.1000000000001C151.9 58.3000000000001 450.1 -8.4999999999999 457.2 -9.9999999999999C472.8 -13.2999999999999 495.7 -20.4999999999999 510.8 -11.6999999999999C512.9 -10.4999999999999 634.6 64.7000000000002 636.6 66.1000000000001C642 70.1000000000001 640.9 72.9000000000002 634.9 74.3000000000001C632.6 74.6000000000001 610.3 79.0000000000001 596.9 81.5000000000001M270.9 262.8000000000002S258.9 261.2000000000002 245.9 247.7000000000002C236.9 238.4000000000001 3.8 8.6000000000001 2.5 6.8000000000001C-4.5 -3.1999999999999 4.1 1e-13 18.2 5.1000000000001C19 5.1000000000001 132.7 41.7000000000002 132.7 41.7000000000002C133.2 42.3000000000002 132.6 41.8000000000002 133.3 42.3000000000002C132.9 47.4000000000002 132.5 68.5000000000002 132.3 70.0000000000002C131.7 75.2000000000002 134.5 76.9000000000002 139.3 78.9000000000002L231.9 112.7000000000002C232.5 113.5000000000002 320.4 194.4000000000002 322.1 196.0000000000002V197.0000000000002L270.9 262.8000000000002" /> + <glyph glyph-name="adn" + unicode="" + horiz-adv-x="496" d=" M248 280.5L312.9 181.7H183.1L248 280.5zM496 192C496 55.1 384.9 -56 248 -56S0 55.1 0 192S111.1 440 248 440S496 328.9 496 192zM396.2 109.3L248 332.5L99.8 109.3H130.2L163.8 161H332.4L366 109.3H396.2z" /> + <glyph glyph-name="adversal" + unicode="" + horiz-adv-x="512" d=" M482.1 416H28.7C5.8 416 0 410.1 0 387.1V-3.1C0 -26.4 5.8 -32 28.7 -32H482.1C506.4999999999999 -32 511.9999999999999 -26.8 511.9999999999999 -2.3V385.8C511.9999999999999 410.4 506.6 416 482.1 416zM178.4 227.7C150.9 247.9 106.3 236.4 94.2 204.3C89.9 193.2 84.9 194.8 76.7 196C67 197.5 59.5 199.2 54.2 201.5C25.4 212.9 62.8 256.8 79.1 265.8C120.2 287.2 162.5 288 204.4 270.6C245.3 253.8 238.9 211.4 238.9 142.1C241.6 116.3 234.6 83.8 248.2 53.3C250.1 48.9 248.6 45.4 245.5 42.6C237.1 35.9 206.2 40.4 198.9 49.9999999999999C197 52.1999999999999 197.1 53.6 195 56.1999999999999C191.4 60.0999999999999 187.7 58.3999999999999 183.1 55.1999999999999C125.7 18.8 42.8 33.8 36.1 98.4999999999999C33 127.8 48.5 155.6 75.7 169.5C113.9 189 187.9 181.3 189.7 200.4C190.8 210.5999999999999 187.8 220.5 178.4 227.7zM465.1 5.7C465.1 -9.4 454 -4.2 447.3 -4.2H52.4C45 -4.2 34.2 -9 34.6 6.5C35 20.4 45.1 15.6 51.7 15.6C184 16 316.2 16 448.5 15.6C455.3 15.6 465.1 20 465.1 5.7zM468.9 346.2V55.2C468.9 49.5 468.2 41.3 460.8 41.3C448.4000000000001 41.7 433.3 34.2 424.7 46.9C418.9 55.6 416.9 50.9 412.3 48.1C358.9000000000001 18.4 284.2000000000001 41 267.9 133.3C261.8 166.7 267.2 200.4 283.6 233.3C295.4 257.2000000000001 340.5 309.4 419.7 263.8V334.8C419.7 361 419.5999999999999 361 445.7 361C448.8 361 452.3 360.6 455.3999999999999 361C465.4999999999999 361.8 468.9999999999999 356.6 468.9999999999999 346.7000000000001C468.8999999999999 346.5 468.8999999999999 346.4000000000001 468.8999999999999 346.2000000000001zM417.4000000000001 113.9C397.9000000000001 66.3 344.5 70.6 327.4000000000001 108.7C312.3 142 311.9000000000001 176.9 327.8 210.2C344.1 244.3 387.5 245.9 409.3 215C429.9000000000001 186.2 424.2 130.4 417.4000000000001 113.9zM122.6 78.6C115.1 79.9 89.6 81.9 88.9 106.4C88.5 120.3 96.7 129.4 108.7 132.2C133.1 138.1 158 142.1 182.4 146.9C191.3000000000001 148.9 189.8000000000001 142.5 190.2000000000001 137.4C191.6000000000001 104.4 164.1000000000001 78.2 122.6000000000001 78.6z" /> + <glyph glyph-name="affiliatetheme" + unicode="" + horiz-adv-x="512" d=" M159.7 210.6C108.4 139.7 43.1 99.8 14 121.4C-15.2 143.1 2.8 218 54.2 288.9C105.5 359.8 170.8 399.7 199.9 378.1C229 356.5 211 281.5 159.7 210.6zM510.9 267.9C437.1 144.5 319 80.2 246.4 124.3C221.4 139.5 205.1 165.5 197.4 198.1C163.8 133.3 104.6 84.3 33.3 64.9C83.1 5.6 157.4 -32 240.3 -32C390.3 -32 511.9 91.1 511.9 242.9C512 251.4 511.6 259.7 510.9 267.9z" /> + <glyph glyph-name="algolia" + unicode="" + horiz-adv-x="448" d=" M229.3 265.4C180 265.4 140.1 225.5 140.1 176.2C140.1 126.9 180 87 229.3 87S318.5 126.9 318.5 176.2C318.5 225.5 278.5 265.4 229.3 265.4zM292 208.8L233.1 178.2C231.3 177.3 229.3 178.6 229.3 180.5V247C229.3 248.5 230.6 249.7 232 249.6C258.2 248.6 280.9 233.9 293.1 212.5C293.8 211.2 293.3 209.5 292 208.8zM389.1 416H58.9C26.4 416 0 389.6 0 357.1V27C0 -5.6 26.4 -32 58.9 -32H389C421.6 -32 447.9 -5.6 447.9 26.9V357.1C448 389.6 421.6 416 389.1 416zM186.5 331.3C186.5 342.1 195.2 350.8 206 350.8H251.3C262.1 350.8 270.8 342.1 270.8 331.3V315.9C270.8 314.1 269.1 312.9 267.5 313.4C255.2 316.8 242.4 318.5 229.4 318.5C215.9 318.5 202.7 316.7 190 313C188.3 312.5 186.6 313.8 186.6 315.5V331.3zM102.1 294.3L111.3 303.5C118.9 311.1 131.2 311.1 138.8 303.5L146.5 295.8C147.6 294.7000000000001 147.5 292.8 146.2 291.8C140 287.3 134.1 282.4 128.6 276.9C123.2 271.5 118.2 265.6 113.8 259.5C112.8 258.2 110.9 258 109.8 259.2L102.1 266.9C94.5 274.4 94.5 286.7 102.1 294.3zM229.3 49.5C159.3 49.5 102.7 106.2 102.7 176.1S159.4 302.7000000000001 229.3 302.7000000000001C299.3 302.7000000000001 355.9 246.1 355.9 176.1C355.9 106.3 299.2 49.5 229.3 49.5z" /> + <glyph glyph-name="amazon-pay" + unicode="" + horiz-adv-x="611.2" d=" M0 122.8C2.3 127 5.2 127.7 9.7 125.3C20.1 119.7 30.3 113.9 40.9 108.6C81.6 88.2000000000001 124.1 73 168.3 62.3C189.2 57.3 210.2 53.3 231.5 50.5C263 46.3 294.7 44.5 326.5 45.3C343.9 45.7 361.3 47.1 378.6 49.1C435 55.8 489.5 69.9 541.9000000000001 91.9C544.8000000000001 93.1 547.8000000000001 93.9 551.0000000000001 93.1C557.7000000000002 91.3 560.0000000000001 84.1 555.1000000000001 79.2000000000001C552.3000000000002 76.4 548.8000000000002 74.1 545.5000000000001 71.8000000000001C514.8000000000001 50.7 481.3000000000001 35.4000000000001 445.9000000000001 23.9000000000001C421.3000000000001 16.0000000000001 396.3000000000001 10.1000000000001 370.8000000000001 6.3000000000001C353.2000000000001 3.7 335.4000000000001 1.9000000000001 317.6000000000001 1.5000000000001C316.8000000000001 1.5000000000001 315.9000000000001 1.3000000000001 315.1000000000001 1.2H294C293.2 1.3000000000001 292.3 1.5000000000001 291.5 1.5000000000001C287.9 1.7 284.3 1.8000000000001 280.8 1.9C263.9000000000001 2.6 247.1 4.5000000000001 230.4 7.2C203 11.7 176.2 18.6 150 28.1C95.9 47.7 47.4 76.7000000000001 4.4 115.1C2.6 116.7000000000001 1.4 118.9 0 120.8V122.8zM158 383C156.6 382.8 155.1 382.6 153.7 382.4C139.7 380.7 127.1 375.5 115.7 367.3C113.3 365.6 111.1 363.8 108.6 361.9C108.4 362.4 108.2 362.9 108.2 363.3C107.8 366 107.4 368.8 106.9 371.5C106.2 376.1 103.9 378.1 99.3 378.1H87.8C80.9 378.1 79.6 376.8 79.6 369.9V160.6C79.6 159.6 79.6 158.6 79.7 157.6C79.9 154.6 81.7 152.7000000000001 84.6 152.6C91.6 152.5 98.7 152.5 105.7 152.6C108.6 152.6 110.4 154.6 110.7 157.6C110.8 158.6 110.8 159.6 110.8 160.6V233C111.9 232.1 112.5 231.6 113 231.1C130.9 216.2 151.5 211.3 174 215.7C194.4 219.7 208.6 232.2 217.8 250.6C224.8 264.5 227.7 279.3 228.1 294.7C228.6 311.8 226.9000000000001 328.6 220 344.5C211.5 364.1 197.4 377 176.1 381.4C172.9 382.1 169.6 382.4 166.3 382.9C163.5 383 160.8 383 158 383zM110.6 341.1C110.6 342.6 111 343.5 112.3 344.4C126 353.9 141.1 358.9 157.9 357.6C172.8 356.5 185 349.2 191.4 331.7C195.3 321 196.3 309.9 196.3 298.7C196.3 288.3 195.5 278.1 192.3 268.1C185.5 246.8 169.9 238.7 149.7 239.6C135.7 240.2 123.5 245.6 112.3 253.5C111.1 254.4 110.6 255.2 110.6 256.8C110.7 270.9 110.6 284.9 110.6 299C110.6 313 110.7 327 110.6 341.1zM316.3 383C315.3 382.9 314.3 382.7 313.4000000000001 382.6C303.6 382.1 294.0000000000001 380.9 284.5000000000001 378.5C278.4000000000001 376.9 272.5000000000001 374.7 266.6000000000001 372.7C263.0000000000001 371.5 261.2000000000001 368.9 261.3000000000001 365C261.4000000000001 361.7 261.2000000000001 358.4 261.3000000000001 355.1C261.4000000000001 350.3 263.4000000000001 349 268.1000000000001 350.2C275.9000000000001 352.2 283.7000000000001 354.4 291.6000000000001 355.9C303.9000000000001 358.2 316.3000000000001 359.2 328.8000000000001 357.3C335.3000000000001 356.3 341.4000000000001 354.4 345.6000000000001 348.9C349.3000000000001 344.1 350.7000000000001 338.4 350.9000000000001 332.5C351.2000000000001 324.2 351.1000000000001 315.9 351.2000000000001 307.6C351.2000000000001 307.2 351.1000000000001 306.7 351.0000000000001 306.2C350.5000000000001 306.3 350.1000000000002 306.2 349.7000000000001 306.3C339.2000000000001 308.8 328.6000000000001 310.6 317.7000000000001 311.2C306.4000000000001 311.8 295.2000000000001 311.1 284.4000000000001 307.3C271.5000000000001 302.8 261.1000000000001 295 255.0000000000001 282.4C250.3000000000001 272.6 249.6000000000001 262.2 251.1000000000001 251.7C253.1000000000001 237.7 260.1000000000001 226.9 272.5000000000001 220C284.4000000000001 213.4 297.3000000000001 212.6 310.4000000000001 214.6C325.5000000000001 216.9 338.9000000000001 223.3 350.7000000000001 233C351.1 233.4 351.6 233.7 352.3000000000001 234.1C352.9000000000001 230.3 353.4000000000001 226.7 354.1000000000001 223.1C354.7000000000001 220 356.6000000000001 218 359.5000000000001 217.9C364.9000000000001 217.8 370.4000000000001 217.8 375.8000000000001 217.9C378.5000000000001 218 380.3000000000001 219.8 380.6000000000001 222.6C380.7000000000001 223.5 380.7000000000001 224.5 380.7000000000001 225.4V331.4C380.7000000000001 335.7 380.5000000000001 340 379.8000000000002 344.3C377.9000000000002 357.2000000000001 372.4000000000002 367.8 360.8000000000002 374.7000000000001C354.1000000000002 378.7000000000001 346.7000000000001 380.7000000000001 339.0000000000001 381.8C335.4000000000001 382.3 331.8000000000002 382.6 328.2000000000001 383.1C324.3000000000002 383 320.3000000000002 383 316.3000000000002 383zM351.3 255.3C351.3 254 350.9000000000001 253.1 349.8 252.3C338.6 244.2 326.3 238.8 312.4000000000001 237.4C306.7000000000001 236.8 301.0000000000001 237 295.6 239.2C289.3 241.7 285.2000000000001 246.1 283.2000000000001 252.5000000000001S281.2000000000001 265.5 283.1 271.9000000000001C285.6 280.2000000000001 291.5 284.9000000000001 299.5 287.5C307.6 290.1 316 290.5 324.3 289.7000000000001C332.7 289 340.9000000000001 287.4 349.3 286.3C350.9000000000001 286.1 351.4000000000001 285.3 351.4000000000001 283.7000000000001C351.3 278.9 351.4000000000001 274.2000000000001 351.4000000000001 269.4C351.3 264.7000000000001 351.2000000000001 260 351.3 255.3zM611.2 125.9C610.2 130.9 606.4000000000001 132.8 602.1 134.2C595.3000000000001 136.5 588.2 137.5 581.1 138.1C568 139.2 554.9 138.6 541.9 136.2C527.6 133.5 514 128.9 501.9 120.6C500.5 119.6 499.1 118.5 498.2 117.1C497.5 116 497.3 114.3 497.7 113.1C498.1 111.6 499.8 111.2 501.3 111.3C502 111.3 502.8 111.3 503.5 111.4C511.3 112.2 519 113.1 526.8 113.9C538.1999999999999 115 549.6999999999999 115.7 561.0999999999999 114.8C565.8999999999999 114.5 570.8 113.4 575.4999999999999 112.1C580.5999999999999 110.7 582.8999999999999 106.9 583.0999999999999 101.7C583.4999999999999 93.7 581.6999999999999 86 579.5999999999999 78.4C575.4999999999999 63 569.5999999999999 48.1 563.8 33.3C563.4 32.3 563 31.3 562.8 30.3C562.3 27.4 564 25.4999999999999 566.9 26.1999999999999C568.6 26.5999999999999 570.5 27.4999999999999 571.6999999999999 28.6999999999999C576.0999999999999 32.9999999999999 580.5999999999999 37.3 584.4 42.0999999999999C597.1999999999999 58.4999999999999 604.6999999999999 77.3999999999999 609.1 97.6999999999999C609.9 101.3 610.5 104.9999999999999 611.2 108.5999999999999V125.8999999999999zM479.1 249.1C466.2 284.8 453.3 320.6 440.4000000000001 356.3C438.4000000000001 362 436.2000000000001 367.6 434.1 373.2C433 376.1 430.9000000000001 378 427.7000000000001 378C420.1 378.1 412.5000000000001 378.2 404.8000000000001 378.1C402.3000000000001 378.1 401.1000000000001 376.1 401.6000000000001 373.6C402.1000000000001 371.5 402.7000000000001 369.5 403.5000000000001 367.5C423.1000000000001 319 442.8000000000001 270.4 462.6000000000001 222C464.3000000000001 217.9 464.7000000000001 214.4 462.8000000000001 210.2C459.5000000000001 202.9 456.9000000000001 195.2 453.5000000000001 187.9C450.5000000000001 181.4 445.5000000000001 176.5 438.3000000000001 174.6C433.2000000000001 173.2 428.1000000000001 173 422.9000000000001 173.5C420.4000000000001 173.6999999999999 417.9000000000001 174.3 415.4000000000001 174.5C412.0000000000001 174.6999999999999 410.3000000000001 173.1999999999999 410.2000000000001 169.6999999999999C410.1000000000001 166.3999999999999 410.1000000000001 163.0999999999999 410.2000000000001 159.8C410.3000000000002 154.3 412.2000000000001 151.8 417.6000000000001 150.9C423.2000000000001 149.9 428.9000000000001 149 434.5000000000001 148.9C451.6000000000001 148.5 465.2 155.4 474.0000000000001 170.3C477.5000000000001 176.1999999999999 480.7 182.4 483.2 188.6999999999999C506.9 248.5 530.3000000000001 308.3999999999999 553.8000000000001 368.3C554.5000000000001 370.0999999999999 555.1 371.8999999999999 555.4000000000001 373.8C555.8000000000001 376.5999999999999 554.5000000000001 378.2 551.7 378.2C545.1 378.3 538.4000000000001 378.2 531.8000000000001 378.2C528.1 378.2 525.5000000000001 376.5999999999999 524.1 373C523.6 371.5999999999999 523 370.3 522.5 368.8999999999999C510.9 335.5999999999999 499.3 302.3 487.7 268.8999999999999C485.2 261.7 482.6 254.3999999999999 480 246.7C479.6 247.8 479.4 248.3999999999999 479.1 249.1z" /> + <glyph glyph-name="amazon" + unicode="" + horiz-adv-x="448" d=" M257.2 285.3C208.5 283.5 87.7 269.8 87.7 167.8C87.7 58.3 226 53.8 271.2 124.6C277.7 114.4 306.6 87.1 316.5 77.8L373.3 133.8S341 159.1 341 186.6V333.7C341 359 316.5 416 228.7 416C140.7 416 94 361 94 311.7L167.5 304.9C183.8 354.4 221.7 354.4 221.7 354.4C262.4 354.5 257.2 324.6 257.2 285.3zM257.2 198.5C257.2 118.5 173 130.5 173 181.3C173 228.5 223.5 238 257.2 239.1V198.5zM393.2 35C385.5 25 323.2 -32 218.7 -32S34.2 39.5 9.7 69C2.9 76.7 10.7 80.3 15.2 77.3C88.5 32.8 203 -40.5 387.7 47C395.2 50.7 401 45 393.2 35zM433 32.8C426.5 17 417 6 411.8 1.8C406.3 -2.7 402.3 -0.9 405.3 5.6S424.6 52.1 418 60.6C411.5 68.9 381 64.9 370 63.8C359.2 62.8 357 61.8 356 64.1C353.7 69.8 377.7 79.6 393.5 81.6C409.2 83.4 434.5 82.4 439.5 75.9C443.2 70.8 439.5 48.8 433 32.8z" /> + <glyph glyph-name="amilia" + unicode="" + horiz-adv-x="448" d=" M240.1 416C178.2 416 108.6 399.1 55.9 360.6C50.8 357.5 46.8 351.4 48.7 341.2C49.8 336.1 53.8 313.8 58.9 301.6C63 291.4 73.1 291.4 79.2 295.5C111.7 317.8 175.7 343.2 231.5 343.2C289.4 343.2 290.4 314.8 290.4 270.1V231.6C203 220.3 78.2 197 46.7 183.8C11.2 167.5 16.3 90.3 16.3 72S31.5 -32 141.2 -32C189 -32 254.9000000000001 -11.3 294.5 10.1V-15.3C294.5 -18.3 296.6 -23.4999999999999 300.6 -24.4C303.7000000000001 -25.4 351.3 -26.4 360.5 -26.4S423 -26.7 427 -25.7C431.1 -24.7 432.1 -19.6 432.1 -16.6V280C432 360.3 374.2000000000001 416 240.1 416zM152.2 88.3C152.2 100.5 149.2 131 170.5 141.2C194.8 154.4 245.6 170.6 290.3 174.7V68C268.9000000000001 54.8 241.6 43.6 211.2 43.6C158.4 43.6 152.3 77.1 152.2 88.3" /> + <glyph glyph-name="android" + unicode="" + horiz-adv-x="448" d=" M89.6 243.5V127.7C89.6 112.3 77.5 100 62.1 100C46.8 100 32 112.4 32 127.7V243.5C32 258.6 46.8 271 62.1 271C77.2 271 89.6 258.6 89.6 243.5zM100.4 86.5C100.4 70.1 113.6 56.9 130 56.9H149.9L150.2 -4.2C150.2 -41.1 205.4 -40.8000000000001 205.4 -4.2V56.9H242.6V-4.2C242.6 -40.9 298.1 -41.0000000000001 298.1 -4.2V56.9H318.3C334.5 56.9 347.7 70.1 347.7 86.5V265.9H100.4V86.5zM348.4 275.6H99.3C99.3 318.4 124.9 355.6 162.9 375L143.8 410.3C141 415.2 148.1 418.3 150.5 414.1L169.9 378.5C204.8 394 244.9 393.2 278.2 378.5L297.5 414C300 418.3 307 415.1 304.2 410.2L285.1 375C322.8 355.6 348.4000000000001 318.4 348.4000000000001 275.6zM177.7 331.1C177.7 336.8 173.1 341.6 167.2 341.6C161.5 341.6 157 336.8 157 331.1S161.6 320.6 167.2 320.6C173.1 320.6 177.7 325.4 177.7 331.1zM291.1 331.1C291.1 336.8 286.5 341.6 280.9000000000001 341.6C275.0000000000001 341.6 270.4000000000001 336.8 270.4000000000001 331.1S275.0000000000001 320.6 280.9000000000001 320.6C286.5000000000001 320.6 291.1 325.4 291.1 331.1zM385.9000000000001 271C370.8 271 358.4000000000001 258.9 358.4000000000001 243.5V127.7C358.4000000000001 112.3 370.8 100 385.9000000000001 100C401.3 100 416.0000000000001 112.4 416.0000000000001 127.7V243.5C416.0000000000001 258.9 401.2000000000001 271 385.9000000000001 271z" /> + <glyph glyph-name="angellist" + unicode="" + horiz-adv-x="448" d=" M347.1 232.6C358.8 265.2 392.5 359.5 392.5 389.7C392.5 416.3 376.8 438.6 348.8 438.6C304.2 438.6 264.2000000000001 306.9 251.7 275.5C242 304 196.6 448 156.6 448C125.5 448 110.9 425.1 110.9 396.3C110.9 361 145.1 269.5 157.5 234.3C151.2 236.6 144.4 238.6 137.5 238.6C114.1 238.6 89.2 209.5 89.2 186C89.2 177.1 94.1 164.6 97.2 156.3C60.3 146.3 46.1 121.7 46.1 84.6C46 12.4 114.4 -64 210.6 -64C328.6 -64 402 24.6 402 138.9C402 182 395.1 220.9 347.1 232.6zM311.7 340C315.7 352.3 332.8 404.3 348.8 404.3C357.4000000000001 404.3 359.7 395.4 359.7 388.3C359.7 369.2 321.1 263.7 312.6 240.3L278.6 246.3L311.7 340zM142.3 399.7C142.3 411.6 156.8 445.4 188.6 352.6L223.2 252.3C207.6 253.6 195.5 255.3 187.8 250.9C176.9 279.7000000000001 142.3 370.6 142.3 399.7000000000001zM140 204C169.3 204 207.1 109.4 207.1 96.6C207.1 91.5 202.2 85.2000000000001 196.5 85.2000000000001C175.6 85.2000000000001 119.6 162.1 119.6 182.9C119.7 190.6 132.3 204 140 204zM324.3 17.7C295.2 -14.3 258 -30.9 214.6 -30.9C155.2 -30.9 108.3 1.7 85.7 57.4C68.6 100.8 89.5 125.7 106.3 125.7C117.7 125.7 160.6 65.4 160.6 52.6C160.6 47.7 152.9 44.3 148.9 44.3C132.8000000000001 44.3 126.5 59.8 97.8 95.7C68.1 66 118.3000000000001 8.8 156.1 8.8C182.2 8.8 199.2 32.9999999999999 194.1 50.8C197.8 50.8 202.4 50.4999999999999 205.8 51.4C206.9 24.3 214.9 -8 247.5 -10.3C247.5 -9.4 249.5 -3.2 249.5 -2.9C249.5 14.4999999999999 238.9 29.7 238.9 47.4C238.9 75.7 260.6 103.1 282.6 119.1C290.6 125.1 300.3 128.8 309.7000000000001 132.2C319.4000000000001 135.9 329.7000000000001 140.2 337.1 147.6C336 158.8 331.4000000000001 168.7 320.2000000000001 168.7C292.5000000000001 168.7 199.6000000000001 164.7 199.6000000000001 208.4C199.6000000000001 215.1 199.7000000000001 221.5 217.0000000000001 221.5C249.3000000000001 221.5 331.3000000000001 213.5 355.3000000000001 192.4C373.4000000000001 176.3 379.6000000000001 79.2 324.3000000000001 17.7zM225.7 143.7C235.4 140.6 245.4 139.7 255.4 137.7C248 132.3 241.4 125.7 235.1 118.6C232.3 127.1 228.9 135.4 225.7 143.7z" /> + <glyph glyph-name="angrycreative" + unicode="" + horiz-adv-x="640" d=" M640 209.8L636.8 181.6L602.3 179.3L600.3 161.2L634.8 163.5L631.5999999999999 135.3L597.1999999999999 133.1L594.9 113L629.3 115.2L626.3 89.1L561.5999999999999 84.9999999999999L574.3 198.1999999999999L527 82.8L495.1 80.8L471.3 198.6L501.6 200.6L515.2 121.2000000000001L546.9000000000001 203.6000000000001L640.0000000000001 209.8000000000001zM426.8 76.5L455.1 78.3L468 198.4L439.6 196.5L426.8 76.5zM162 59.9L142.6 95.9L139.1 58.5L110.9 56.8L113.6 85.9C102.6 67.9 81.6 51.6 56.7 50.1C23.9 48.1 -3 71 0.3 108.3C2.9 137.6 27 171.1 67.8 173.7000000000001C105.5 176.1 115.4 150.5000000000001 119.1 144.9L121.9 175.7000000000001L160.8 178.2000000000001C180.9 179.5000000000001 199.5 174.5000000000001 203.3 154.5000000000001L205.9 181.1000000000001L270.7 185.3000000000001L268 157.4000000000001L231.6 155.0000000000001L229.9 137.1000000000001L266.3 139.4000000000002L263.6 111.5000000000002L227.2 109.2000000000002L225.3 89.3000000000002L261.6 91.6000000000002L259.5 70.8000000000002L314.5 188.0000000000002L338.3 189.6000000000002L370.4 79L379.3 164.6L357 163.2000000000001L359.8999999999999 191.1L434.8999999999999 196L431.8999999999999 168L407.5999999999999 166.4L397.8999999999999 74.5L339.8999999999999 70.8L335.5999999999999 86.4L296.2 83.9L288.2 67.6L162 59.9zM117.7 130.1L91.3 128.4C84.6 140.8 76.9 145 65 144.2C46 143 31.7 126.7 30.4 110.9C29 94.9 37.7 78.4 59.1 79.7C71.9 80.5 80.4 88.3 88 98.6L115 100.3L117.7 130.1zM173.8 137.8C175 150.6999999999999 166.2 151.4 147.7 150.1999999999999L145 121.6999999999999C159.2 122.5999999999999 172.5 123.8 173.8000000000001 137.8zM194.9 66.9999999999999L200.7 127C195.7 113.5 186 105.8999999999999 172.8 100.3999999999999L194.9 66.9999999999999zM330.3 111.9999999999999L322.4000000000001 149.8L306.6 110.4999999999999L330.3 111.9999999999999zM160.2 186.5999999999999L155.9 204.0999999999999L116.3 201.4999999999999L108.2 183.2999999999999L76.3 181.1999999999999L133.3 303.0999999999999L157.2 304.6999999999999L187.9 202.6999999999999L197.8 307.3999999999999L224.8 309.1999999999999L262.6 245.5999999999999L269.1 312.1999999999999L297.6 314.0999999999999L293.6 272.8999999999999C301 286.3999999999999 316.5 317.5999999999999 357.2000000000001 320.3999999999999C397.7000000000001 323.1999999999999 409.6 291.0999999999999 410.6 290.0999999999999L413.9000000000001 322.0999999999999L453.2 324.7999999999999C465.9 325.6999999999999 481.0000000000001 324.4999999999999 489.5000000000001 315.0999999999999L485.1000000000001 326.9999999999999L517.3000000000001 329.1999999999999L530.2 285.9999999999999L553.2 331.6999999999999L584.2 333.8999999999999L540.6 255.4999999999999L535.8000000000001 211.1999999999999L507.4000000000001 209.2999999999999L512.2 253.5999999999999L496.4 296.5999999999999C497.4 274.2999999999999 487.2 256.4999999999999 464.4 246.9999999999999L489.6 208.1999999999999L453.2 205.7999999999999L434.0000000000001 242.5999999999999L430.0000000000001 204.2999999999999L401.6000000000001 202.3999999999998L404.9000000000001 233.8999999999999C398.2000000000001 224.5999999999998 385.2000000000001 198.4999999999998 345.3000000000001 195.8999999999998C319.1000000000001 194.1999999999999 299.7000000000001 206.1999999999999 289.9000000000001 235.0999999999999L285.9000000000001 194.7999999999999L260.9000000000001 193.1999999999999L223.3000000000001 256.4999999999999L217.0000000000001 190.2999999999999L160.2000000000001 186.5999999999999zM436.8000000000001 268.7C447.0000000000001 269.3999999999999 454.3000000000001 270.7999999999999 458.4000000000001 272.9999999999999C462.9000000000001 275.3999999999999 465.4000000000001 279.3999999999999 466.0000000000001 285.0999999999999C466.6000000000001 290.3999999999999 465.4000000000001 293.8999999999999 462.6000000000001 295.4999999999999C459.0000000000001 297.5999999999999 452.0000000000001 298.3 439.7000000000002 297.4999999999999L436.8000000000002 268.7zM327.7 234C333.3 228.1 340.4 225.5 349 226.1C353.7 226.4 358.1 227.9 362.3 230.2C367.8 233.2 372.9000000000001 238.2 377.4000000000001 244.5L343.2000000000001 242.2L345.6 266.1L408.7000000000001 270.4L409.9000000000001 282.4L378.7000000000001 280.3C374.6 284 370.9000000000001 286.9 367.6 288.4C363.6 290.1 359.5 291.2000000000001 355.4000000000001 290.9C347.4000000000001 290.4 340.1 287.3 333.4000000000001 281.7000000000001C325.7000000000001 275.3 321.4000000000001 267.2000000000001 320.5000000000001 257.3C319.4000000000001 247.7 321.9000000000001 240 327.7000000000001 234zM126.4 225.8L150.2 227.4L141.9 265L126.4 225.8z" /> + <glyph glyph-name="angular" + unicode="" + horiz-adv-x="415.6" d=" M169.7 179.9H245.9L207.8 271.5L169.7 179.9zM207.8 416L0 341.6L31.8 65.9L207.8 -32L383.8 65.9L415.6 341.6L207.8 416zM338 74.2H289.4L263.2 139.6H152.6L126.4 74.2000000000001H77.7L207.8 366.5L338 74.2z" /> + <glyph glyph-name="app-store-ios" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM127 63.5C121.5 53.9 109.2 50.7 99.7 56.2C90.1 61.7 86.9 74 92.4 83.5L106.7 108.2C122.8 113.1 136 109.3 146.3 96.8L127 63.5zM265.9 117.4H84C73 117.4 64 126.4 64 137.4S73 157.4 84 157.4H135L200.4 270.6L179.9 306C174.4 315.6 177.7 327.8 187.2 333.3C196.8 338.8 209 335.5 214.5 326L223.4 310.6L232.3000000000001 326C237.8000000000001 335.6 250.1000000000001 338.8 259.6 333.3C269.2000000000001 327.8 272.4000000000001 315.5 266.9000000000001 306L181.1 157.4H243.2C263.4000000000001 157.4 274.7000000000001 133.7 265.9000000000001 117.4zM364 117.4H335L354.6 83.5C360.1 73.9 356.8 61.7 347.3 56.2C337.7 50.7 325.5 54 320 63.5C287.1 120.4 262.5 163.2 246 191.6C229.3 220.6 241.2 249.6 253.1 259.4000000000001C266.2 236.7000000000001 285.8 202.7000000000001 312 157.4H364C375 157.4 384 148.4 384 137.4C384 126.3 375 117.4 364 117.4z" /> + <glyph glyph-name="app-store" + unicode="" + horiz-adv-x="512" d=" M255.9 327.1L265 342.8C270.6 352.6 283.1 355.9 292.9 350.3C302.7 344.7 306 332.2 300.4 322.4L212.9 170.9H276.2C296.7 170.9 308.2 146.8 299.3 130.1H113.8C102.5 130.1 93.4 139.2 93.4 150.5C93.4 161.8 102.5 170.8999999999999 113.8 170.8999999999999H165.8L232.4 286.3L211.6 322.3999999999999C206 332.2 209.3 344.5999999999999 219.1 350.3C228.9 355.8999999999999 241.3 352.5999999999999 247 342.8L255.9 327.0999999999999zM177.2 109.1L157.6 75.1C152 65.3 139.5 62 129.7 67.6C119.9 73.2000000000001 116.6 85.7000000000001 122.2 95.5L136.8 120.7C153.2 125.8 166.6 121.9 177.2 109.1zM346.1 170.8H399.2000000000001C410.5000000000001 170.8 419.6 161.7 419.6 150.4C419.6 139.1 410.5 130.0000000000001 399.2000000000001 130.0000000000001H369.7000000000001L389.6 95.5000000000001C395.2000000000001 85.7000000000001 391.9000000000001 73.3000000000001 382.1 67.6000000000001C372.3 62.0000000000001 359.9000000000001 65.3000000000001 354.2000000000001 75.1000000000001C320.7000000000001 133.2000000000001 295.5000000000001 176.7000000000001 278.8000000000001 205.7000000000001C261.7000000000001 235.2000000000001 273.9000000000001 264.8000000000001 286.0000000000001 274.8000000000001C299.4000000000001 251.8000000000001 319.4000000000001 217.1000000000001 346.1000000000001 170.8000000000001zM256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM472 192C472 73.3 375.9 -24 256 -24C137.3 -24 40 72.1 40 192C40 310.7 136.1 408 256 408C374.7 408 472 311.9 472 192z" /> + <glyph glyph-name="apper" + unicode="" + horiz-adv-x="640" d=" M42.1 208.9C64.3 208.9 71.1 206.1 75.6 194.3H76.4V217.2C76.4 228.5000000000001 71.6 232.6 58.5 232.6C47.2 232.6 44.1 230.1 43.4 219.8H4.8C5.1 233.7 6.3 238.9 10.6 244.2C17.9 253 29.5 256 56.7 256C89.7 256 103.8 251 110.6 237.1C112.6 232.8 114.6 221.5 114.6 213.4V137.1H76.3L77.6 156.2000000000001H76.6C71.3 140.6 63 135.8000000000001 41.1 135.8000000000001C10.8 135.8000000000001 0 145.9000000000001 0 173.1000000000001C0 198.3000000000001 12.3 208.9000000000001 42.1 208.9000000000001zM59.2 160.8C72.3 160.8 76.1 163.8 76.1 174.2C76.1 183.3 71.8 185.8 56.5 185.8C43.4 185.8 38.6 182.8 38.6 173.7C38.5 163.3 42.3 160.8 59.2 160.8zM137 255.7H175.3L173.8 235.1H174.6C183.7 252.2 190.5 256 212.1 256C226.5000000000001 256 236.8 253.0000000000001 243.6 246.9000000000001C253.4000000000001 238.3000000000001 256.4000000000001 226.5000000000001 256.4000000000001 198.8000000000001C256.4000000000001 168.8000000000001 253.4000000000001 155.7000000000001 244.3000000000001 145.9C237.5000000000001 138.6 227.9000000000001 135.8 211.1 135.8C190.7 135.8 181.9 141.3 177.3 157H176.5V86.7H137V255.7zM217.9 195C217.9 222.5 214.6 227.5 197.2 227.5C180.3 227.5 176.5 222.5 176.5 198.8C176.5 170.8 180 165.3 197.7 165.3C214.1 165.3 217.9 170.9 217.9 195zM275.8 255.7H314.1L312.6 235.1H313.4000000000001C322.5000000000001 252.2 329.3 256 350.9000000000001 256C365.3 256 375.6 253 382.4000000000001 246.9C392.2000000000001 238.3 395.2000000000001 226.5 395.2000000000001 198.8C395.2000000000001 168.8 392.2000000000001 155.7 383.1 145.9C376.3 138.6 366.7000000000001 135.8 349.8 135.8C329.4000000000001 135.8 320.6 141.3 316 157H315.2V86.7H275.7V255.7zM356.7000000000001 195C356.7000000000001 222.5 353.4000000000001 227.5 336.0000000000001 227.5C319.1000000000001 227.5 315.3000000000001 222.5 315.3000000000001 198.8C315.3000000000001 170.8 318.8000000000001 165.3 336.5000000000001 165.3C352.9000000000001 165.3 356.7000000000001 170.9 356.7000000000001 195zM410.5000000000001 198.8C410.5000000000001 224.2 413.8000000000001 236.6 422.8000000000001 244.6C431.6000000000001 252.7 445.0000000000001 255.9000000000001 467.9000000000001 255.9000000000001C510.7000000000001 255.9000000000001 523.6000000000001 243.1 523.6000000000001 200.2000000000001V189.1H448.3000000000002C448.0000000000001 187.1 448.0000000000001 185.1 448.0000000000001 184.3C448.0000000000001 167.4 452.5000000000001 162.4 468.1000000000001 162.4C482.0000000000001 162.4 486.0000000000001 165.4 486.0000000000001 176.3H523.5000000000001V174C523.5000000000001 164.2 521.0000000000001 155.1 516.7000000000002 149.3C509.4000000000001 139.5 497.1000000000001 135.7 472.4000000000001 135.7C444.9000000000002 135.7 430.8000000000002 139 421.8000000000002 148C413.3000000000002 156.5 410.5000000000001 169.3 410.5000000000001 198.8zM486.9000000000001 210.4C486.6000000000001 212.2 486.6000000000001 213.7 486.6000000000001 214.2C486.6000000000001 226.5000000000001 483.3000000000001 228.8 467.0000000000001 228.8C452.6000000000001 228.8 449.9000000000001 225.8 448.9000000000001 213.7L448.6 210.4H486.9zM542.5000000000001 255.7H580.8000000000001L579.0000000000001 235.8H579.7000000000002C586.5000000000001 250.7 594.1000000000001 256 609.4000000000002 256C620.2000000000002 256 628.5000000000002 252.7 632.8000000000002 246.7C638.1000000000001 239.4 639.6000000000001 232.3 639.6000000000001 212.7C639.6000000000001 211.2 639.6000000000001 207.7 639.8000000000002 203.4H604.8000000000002C605.1000000000001 205.2 605.1000000000001 206.7 605.1000000000001 207.4C605.1000000000001 222.8 603.1000000000001 226.8 594.8000000000002 226.8C588.5000000000002 226.8 584.0000000000002 223.5 581.7000000000002 217.5C580.7000000000002 214.5 580.7000000000002 213.1999999999999 580.7000000000002 205.1999999999999V137.1999999999999H542.4000000000002V255.7z" /> + <glyph glyph-name="apple-pay" + unicode="" + horiz-adv-x="640" d=" M116.9 289.5C109.4 280.6 97.4 273.6 85.4 274.6C83.9 286.6 89.8 299.4 96.7 307.2C104.2 316.3 117.3 322.8 128 323.3C129.2 310.9 124.3 298.6 116.9 289.5M127.8 272.3C110.4 273.3 95.5 262.4 87.3 262.4C78.9 262.4 66.3 271.8 52.5 271.5C34.6 271.2 18 261.1 8.9 245C-9.9 212.7 4 165 22.2 138.7C31.1 125.7 41.7 111.4 55.7 111.9C69 112.4 74.2 120.5 90.2 120.5C106.3 120.5 111 111.9 125 112.1C139.5 112.4 148.6 125.1 157.5 138.1C167.6 152.9 171.8 167.2000000000001 172 168C171.7 168.3 144 178.9 143.7 210.9C143.4 237.7 165.6 250.4 166.6 251.2C154.1 269.8 134.6 271.8 127.8 272.3M228.2 308.5V113.6H258.5V180.2000000000001H300.4C338.7 180.2000000000001 365.5 206.5000000000001 365.5 244.5000000000001S339.1 308.5000000000001 301.4 308.5000000000001H228.2zM258.5 283H293.4C319.7 283 334.7 269 334.7 244.4S319.7 205.6 293.3 205.6H258.5V283zM420.7 112.1C439.7 112.1 457.3 121.7000000000001 465.3 137H465.9V113.6H493.9V210.6C493.9 238.7 471.4 256.9000000000001 436.8 256.9000000000001C404.7 256.9000000000001 380.9000000000001 238.5000000000001 380 213.3000000000001H407.3C409.6 225.3000000000001 420.7 233.2000000000001 435.9000000000001 233.2000000000001C454.4 233.2000000000001 464.8 224.6000000000001 464.8 208.7000000000001V197.9L427 195.6C391.9 193.5 372.9 179.1 372.9 154.1C373 128.9 392.6 112.1 420.7 112.1zM428.9 135.2000000000001C412.8 135.2000000000001 402.5 143.0000000000001 402.5 154.8000000000001C402.5 167.1000000000001 412.4 174.2000000000001 431.3 175.3000000000001L464.9 177.4000000000001V166.4000000000001C464.9 148.2000000000001 449.4000000000001 135.2000000000001 428.9000000000001 135.2000000000001zM531.4 60.6C560.9 60.6 574.8 71.9 586.9 106L640 255H609.2L573.6 139.9H573L537.4 255H505.8L557 113.1L554.2 104.5C549.6 89.9 542.1 84.2 528.7 84.2C526.3000000000001 84.2 521.7 84.5 519.8000000000001 84.7V61.3C521.6 60.9 529.1 60.6 531.4000000000001 60.6z" /> + <glyph glyph-name="apple" + unicode="" + horiz-adv-x="376.5" d=" M314.7 179.3C314.5 216 331.1 243.7 364.7 264.1C345.9 291 317.5 305.8 280 308.7000000000001C244.5 311.5 205.7 288 191.5 288C176.5 288 142.1 307.7000000000001 115.1 307.7000000000001C59.3 306.8 0 263.2 0 174.5C0 148.3 4.8 121.2 14.4 93.3C27.2 56.6 73.4 -33.4 121.6 -31.9C146.8 -31.3 164.6 -14 197.4 -14C229.2 -14 245.7 -31.9 273.8 -31.9C322.4000000000001 -31.2 364.2000000000001 50.6 376.4 87.4C311.2 118.1 314.7 177.4 314.7 179.3000000000001zM258.1 343.5C285.4 375.9 282.9 405.4 282.1 416C258 414.6 230.1 399.6 214.2 381.1C196.7 361.3 186.4 336.8 188.6 309.2C214.7 307.2 238.5 320.6 258.1 343.5z" /> + <glyph glyph-name="asymmetrik" + unicode="" + horiz-adv-x="576" d=" M517.5 138.8C556.3 178.8 575.6 218.8 576 254.9C576.8 320.4 516.6 373.1 406.6 389.9C277.9 409.6 118.1 374.4 0 307.5C52 334 110.6 355.7 170.7 365.7C245.2 386.2 323.7 391.1 392 380.5C544.5 356.7 588.8 253 490.8 148.8C480.6 138 468.8 127.7 455.8 118.2L304.9 344.6L114.7 59.1C49.1 88.5 38.2 149.3 95.6 210.3C116.4 232.5 143.9 252.2 175.1 268.4C195.1 280.6 214.8 291 237.1 299.1C172 278.8 114.4 246.2 75.5 206.2C47.8 177.6 34.1 149.1 33.8 123.3C33.3 88.1999999999999 57.2 58.1999999999999 102.2 40.3L67.7 -11.4H169.3L191.3 22.9999999999999C213.5 21.9999999999999 236.6 22.9999999999999 259.9 25.6999999999999L237.1 -11.4000000000001H372.6L340 41.7C358.6 47 376.9 53.2 394.5 60.4L440.4 -11.4H542L468.6 99C487.1 111.1 503.6 124.5 517.5 138.8zM329.9 58.3L304.9 98.9L272.2 45.6C248.8 42.1 225.5 40.5 203 41.2L304.9 200.5000000000001L383.6 77.5000000000001C366.4 70.1000000000001 348.3 63.6000000000001 329.9 58.3000000000001z" /> + <glyph glyph-name="audible" + unicode="" + horiz-adv-x="640" d=" M640 248.1V194.1L320 -5.9L0 194V248L320 48L640 248.1zM445.5 176.1L492.6 205.5C455.4 261.3 391.9000000000001 298.1 319.9000000000001 298.1C247.9000000000001 298.1 184.4 261.4000000000001 147.3000000000001 205.7H147.6000000000001C150.1000000000001 208 152.7000000000001 210.2 155.3000000000001 212.4C245.0000000000001 286.8 374.7000000000001 270.5 445.5 176.1zM225.4 157.3C242.3 169.2 261.9 176 282.8 176C317.2 176 348 157.6 369.2000000000001 128.4L414.6 156.8C393.7000000000001 186.6999999999999 359 206.3 319.8 206.3C280.9000000000001 206.3 246.4 186.9 225.4 157.3zM103.6 286.9C235.4 391.2 421.8 363.3 521.1 224.8L521.8000000000001 223.8L570.6 254.2C517.1 335.9 424.8 389.9 319.9 389.9C216.4 389.9 123.3 336.4 69.4 254.3C79.3 264.8 92.1 277.8 103.6 286.9zM570.6 254.2z" /> + <glyph glyph-name="autoprefixer" + unicode="" + horiz-adv-x="640" d=" M318.4 432L157.4 -48H234.9L260.3 33.4H379.8L405 -48H482.5L318.4 432zM278.1 90.1L319.3 220.5H320.8L361.7 90.1H278.0999999999999zM640 43L630 74.4L462.1 90L481.5 33.5L640 43zM177.9 90L10 74.3L0 43L158.5 33.6L177.9 90z" /> + <glyph glyph-name="avianex" + unicode="" + horiz-adv-x="512" d=" M453.1 416H141.1C102.2 416 64.9 384.8 57.8 346.3L1.2 37.7C-5.9 -0.8 19.9 -32 58.9 -32H370.9C409.8 -32 447.1 -0.8 454.2 37.7L510.9 346.2C517.9 384.8 492.1 416 453.1 416zM394.9000000000001 68.7L362.9000000000001 55.2L247.5000000000001 165.2C232.8000000000001 155.2 218.3000000000001 145.7 205.8 138.1L227.9 73.9L210 61.2L169.4 122.2L117 170.3L132.7 185.7L190.7 154.6C200 165.1 211.5 177.2 223.5 189.5L203 219.1L134.2 318.9L153 347.8L161.9 352.6L265 240.2L269.9 235.7C289.3 254.5 303.7 268.1 303.7 268.1C311.4 274.6 325.2 271 334.4 260.2C343.4 249.7 345 235.5 337.1 228.9C335.3 227.6 321.6 217.5 301.8 203.3L306.3 196L401.2 76.6L394.8999999999999 68.7z" /> + <glyph glyph-name="aviato" + unicode="" + horiz-adv-x="640" d=" M107.2 164.5L88.2 206.3H36.1L17.1 164.5H0L62.2 295.9L124.4 164.5H107.2zM62.2 262.6L42.6 220.1H81.8L62.2 262.6zM174.9 160.2L112.7 291.6H129.8L174.9 195.6L220 291.6H237L174.9 160.2zM255.5 164.5V291.6H271V164.5H255.5zM464.6 280.1V164.5H447.3V280.1H406.1V291.6H505.7V280.1H464.6zM640 229.2C640 220 638.3 211.4 634.9 203.4C631.5 195.4 626.6999999999999 188.3 620.6999999999999 182.3C614.6999999999999 176.3 607.5999999999999 171.5 599.5999999999999 168.1C591.5999999999999 164.7 582.9999999999999 163 573.8 163S556 164.6999999999999 548 168.1C540 171.5 532.9 176.3 526.9 182.3C520.9 188.3 516.1 195.3 512.6999999999999 203.4C509.3 211.4 507.5999999999999 220 507.5999999999999 229.2S509.2999999999999 247 512.6999999999999 255C516.0999999999999 263 520.9 270.1 526.9 276.1C532.9 282.1 539.9 284.5 548 288C556 291.4 564.6 293.1 573.8 293.1S591.5999999999999 291.4 599.5999999999999 288C607.5999999999999 284.6 614.6999999999999 282.2 620.6999999999999 276.1C626.6999999999999 270.1 631.4 263 634.9 255C638.3 247 640 238.4 640 229.2zM624.5 229.2C624.5 236.5 623.2 243.2 620.6 249.5C618 255.8 614.4 261.2 609.8000000000001 265.8C605.2 270.4 599.8000000000001 274 593.6 276.7000000000001C587.4 279.4 580.8000000000001 280.7000000000001 573.8000000000001 280.7000000000001S560.2 279.4 554.0000000000001 276.7000000000001C547.8000000000001 274 542.4000000000001 270.4 537.8000000000001 265.8C533.2 261.2000000000001 529.6 255.8 527.0000000000001 249.5C524.4000000000001 243.2 523.1000000000001 236.4 523.1000000000001 229.2C523.1000000000001 221.9 524.4000000000001 215.2 527.0000000000001 208.9C529.6000000000001 202.6 533.2000000000002 197.2 537.8000000000001 192.6C542.4000000000001 188 547.8000000000001 184.4 554.0000000000001 181.7C560.2000000000002 179 566.8000000000001 177.7 573.8000000000001 177.7S587.4000000000001 179 593.6 181.7C599.8000000000001 184.4 605.2 188 609.8000000000001 192.6C614.4000000000001 197.2 618.0000000000001 202.6 620.6 208.9C623.2 215.2 624.5 222 624.5 229.2zM529.7 132.5V138.8L618.6 148.8L375.7000000000001 135.4C376.3000000000001 137.6 376.8000000000001 140.0000000000001 377.1 142.6C377.4000000000001 144.6 377.6 146.8 377.7000000000001 149.1L442.5000000000001 157.2000000000001L377.6 155.3000000000001C377.6 155.7000000000001 377.5 156.0000000000001 377.5 156.4000000000001C374.7 173.6000000000001 352 180.1000000000001 352 180.1000000000001L350.9 206.4000000000001H374.7L393.7 164.6000000000001H410.8L348.6 296L286.4000000000001 164.6H303.5000000000001L322.5000000000001 206.4H346.1000000000001L345 180S322.3 173.5 319.5 156.3C319.4 156 319.4 155.6 319.4 155.2L254.5 157.1L319.3 149C319.4 146.6999999999999 319.6 144.6 319.9 142.5C320.2 139.8999999999999 320.7 137.5 321.3 135.3L78.4 148.8L167.3 138.8V132.5C161.4 131.6 156.8 126.5 156.8 120.3C156.8 113.5 162.4 107.9 169.2 107.9C176 107.9 181.6 113.5000000000001 181.6 120.3C181.6 126.5 177 131.6 171.1 132.5V138.3L251.4000000000001 129.3V123.9C245.7000000000001 122.8 241.5000000000001 117.7000000000001 241.5000000000001 111.8C241.5000000000001 105 247.1 101.6 253.9000000000001 101.6C260.7000000000001 101.6 266.3 105 266.3 111.8C266.3 117.8 262 122.8 256.4000000000001 123.9V128.8L284.8 125.6V101.9H278.9000000000001V88H284.8V94.6H289.8V88H295.7V101.8H289.8V125L328.1 120.7C336.2000000000001 109.3 347.1 107.1 347.1 107.1L347 100.4L341.9 100.2L341.8 88.1H345.9L346 93.1H351.2L351.3 88.1H355.4000000000001L355.3 100.2L350.2 100.4L350.1 107.1S361 109.2 369.1 120.7L407.4 125V101.8H401.5V88H407.4V94.6H412.4V88H418.3V101.8H412.4V125.5L440.8 128.7V123.8C435.1 122.7 430.9 117.6 430.9 111.7C430.9 104.9 436.5 101.5 443.3 101.5C450.1 101.5 455.6999999999999 104.9 455.6999999999999 111.7C455.6999999999999 117.7 451.3999999999999 122.7 445.8 123.8V129.2L526.0999999999999 138.2V132.4C520.1999999999999 131.5 515.5999999999999 126.4 515.5999999999999 120.2C515.5999999999999 113.4 521.1999999999999 107.8 527.9999999999999 107.8C534.7999999999998 107.8 540.3999999999999 113.4 540.3999999999999 120.2C540.1999999999998 126.5 535.6999999999998 131.6 529.6999999999998 132.5zM328.9000000000001 220.1L348.5000000000001 262.6L368.1000000000001 220.1H350.2000000000001L348.5000000000001 260.4L346.8000000000002 220.1H328.9000000000002z" /> + <glyph glyph-name="aws" + unicode="" + horiz-adv-x="512" d=" M261.2 311.9C247.2 254.4 248.1 257.5 235.4 204.9C233.8 198.4 231.3 196.5 224.7 196.4H210.3C204.5 196.5 202.1 198 200.4 203.7C188.1 243.1 171.6 297.8 160.5 334.4C156.4 347.9 159.1 347.6 169.8 347.3C173.5 347.2000000000001 177.1 347.3 180.8 347.3C185.9 347.2000000000001 188.5 345.3 189.9 340.2000000000001C193.5 327.3 195.9 317.4 216.5 236.1C216.9 234.5000000000001 217.4 233.0000000000001 217.9 231.5000000000001H219C219.5 233.5000000000001 220.1 235.4000000000001 220.6 237.4000000000001C228.4 270.3000000000001 236.1 303.3000000000001 243.9 336.2000000000001C246.3 346.4000000000001 250.6 347.4000000000001 260.9 347.4000000000001H268.5C275.4 347.3000000000001 277.5 345.9000000000001 279.2 339.1C285.2 315.7000000000001 302.7 237.3000000000001 305.9 228.7000000000001C311 247.0000000000001 304.1 220.8000000000001 334.4 337.7000000000001C336.5 345.8000000000001 338.5 347.4000000000001 346.7 347.4000000000001H359.4C364.8 347.3000000000001 366.4 345.6 365.1 340.3000000000001C362.7 330.8000000000001 362.2 330.4000000000001 323.8 207.4C320.7 197.5 319.6 196.6 309.2 196.6H298.5999999999999C291.2999999999999 196.6 289.3999999999999 197.9 287.5999999999999 205C283.2999999999999 221.2 264.2999999999999 300.7000000000001 261.2 311.9000000000001zM125.4 200.7C129.6 194.9 133.5 194.4 139.5 198.3L145.8 202.5C152.6 207 153.1 208.8 149.4 216C145.1 224.4 143 233.3 143.1 242.9C143.1 246 143.7 298.6 142.2 309.7C139.5 329 129.7 342.5 110.5 348.4C99.8 351.8 88.8 351.7 77.8 351.4C62.7 351 48.4 346.8 35 340C33.2 339.1 31.3 336.9 30.9 335.1C30.1 331.2 29.8 327 30.2 323C30.8 317.1 32.8 316 38.4 317.9C43.5 319.6 48.4 321.8 53.5 323.3C68 327.7 82.7 329.7 97.6 325C104.7 322.8 109.3 318.1 111.9 311.2C114.9 303.3 114.3 295.1 114.3 287C114.3 281.5 114.2 281.5 108.8 282.5C94.9 285.1 81.1 287.5 66.9 285.6C51.7 283.5 38.3 278.3 28.7 265.6C19.6 253.6 18.7 240 21.3 226.1C24.1 211.1 33.1 200.4 47.7 195.7C68.3 189 87.8 192.4 105.4 205.2C109.2 208 112.6 211.4 116.5 214.7C119.6 209.7 122.3 205 125.4 200.7zM110.1 262.3C113.1 261.9 114.6 260.4 114.4 257.2C114.2 253.4 114.5 249.6 114.1 245.8C112.9 234.1 106.4 226.1 96.2 220.9C88 216.7 79.3 215.1 70.1 215.9C54.9 217.2 49.1 229 50.5 242.2C51.8 254.8 59 261.8 72 264C85.8 266.4 88 265.1 110.1 262.3zM458.9 197.2C480.2 205.8 491.8 223.4 488.1 247.2C485.9 261.8 476.3 271.4 462.9 276.7C448.2000000000001 282.6 429.1 287 414.8 294.9C410.4000000000001 297.3 407.4000000000001 301.2 407.2 306.8C406.8 317.9 411.4 324 422.6 326.6C431.9 328.7 441.4 328.8 450.7 327C458 325.6 465 322.8 472.1 320.7C474.9 319.8 477.9999999999999 318.6 479.9 322.3C483.7 329.6 480.3 341 472.6 344.1C450.1 353.1 427.1 355.7 404.4 345.7C389.8 339.3 379.8 328.3 378.4 311.5C376.8 292.2 385.3 278.1 402.5 269.8C410.2 266.1 418.6 263.9 426.7 260.9C434.8 257.9 442.9 255.1 450.8 251.8C463.1 246.5 462.4 227.6 452 221.8C424.3 206.5 387.1 224.2 382.8 225.6C379.5 226.7 377.5 225.4 376.5 221.9C373.5 210.6 377.2 203.1 388.1 199.2C409.8 191.3 437.7000000000001 188.7 458.9 197.2zM296 34.5C346.8 40.3 394.7 55.3 438.7 81.5C446.7 86.2 454.2 91.8 461.8 97.2C469.1 102.4 465 115.6 450.5 109.4C396.1 86.2 339.3 73.3 280.3 70.5C249.8 69 219.5 70.8 189.2 75.2C126.1 84.4 66.8 104.4 11.6 136.4C9.5 137.6 7.4 138.9 5.1 139.4C0.2 140.5 -2.6 134.7 2.7 129.7C26.7 107.6 53 88.9 81.8 74C135.5 46.3 192.3 31.3 253 32C267.4 32.8 281.8 32.9 296 34.5zM470.7 126.7C485.5 125.9 490.1 120.8 486.4 106.5C482.6 91.7 477.1 77.3 472.5 62.7C471.6 59.8 468.3 56.4 471.7 53.9C475.4 51.3 478.2 54.9 480.7 57.2C490.9 66.7 498.1 78.2 503.2 91C508.6 104.4 512.5 118.2 511.9 132.9C511.7 139.1 510.1 141.7 504.1 143.4C498.7 144.9 493.1 146.2 487.6 146.6C465.9999999999999 148.4 445.1 146.1 425.6 136C422.5 134.3999999999999 419.6 132.3 416.9 130.1C415.8 129.2 413.7 124.8 419.3 124C421.2 123.6999999999999 423.2 124.1 425.2 124.3C442.0999999999999 125.9 453.8 127.6 470.6999999999999 126.6999999999999z" /> + <glyph glyph-name="bandcamp" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM296.2 113.9H115.2L199.9 270H380.9L296.2 113.9z" /> + <glyph glyph-name="behance-square" + unicode="" + horiz-adv-x="448" d=" M186.5 155C186.5 135.7 172.5 129.6 155.3 129.6H110.2V182.5H156.2C174.8 182.4 186.5 174.7 186.5 155zM178.8 237.3C178.8 255 165.1 259.2000000000001 149.9 259.2000000000001H110.3V214.4H153C168.1 214.4 178.8 221 178.8 237.3000000000001zM311.1 214.1C292.8 214.1 280.6 202.7 279.4000000000001 184.4H341.6C339.9000000000001 202.9 330.3 214.1 311.1 214.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM271.7 263H349.5V281.9H271.7V263zM228.7 152.7C228.7 176.8 217.3 197.6 193.7 204.3C210.9 212.5 219.9 222 219.9 241.3C219.9 279.5 191.4 288.8 158.5 288.8H68V96.8H161.1C196 96.9999999999999 228.7 113.6999999999999 228.7 152.6999999999999zM380 167.5C380 208.6 355.9 242.9 312.4 242.9C270 242.9 241.3 211.1 241.3 169.3C241.3 126 268.6 96.3 312.4 96.3C345.6 96.3 367.1 111.2 377.5 143.1H343.8C340.1 131.2000000000001 325.2 125 313.6 125C291.2000000000001 125 279.5 138.1 279.5 160.3H379.7C379.8 162.6 380 165.1 380 167.5z" /> + <glyph glyph-name="behance" + unicode="" + horiz-adv-x="576" d=" M232 210.8C263.8 226 280.4 249 280.4 284.8C280.4 355.4 227.8 372.6 167.1 372.6H0V18.2H171.8C236.2 18.2 296.7000000000001 49.1 296.7000000000001 121.1C296.7000000000001 165.6 275.6 198.5 232.0000000000001 210.8zM77.9 312.1H151C179.1 312.1 204.4 304.2 204.4 271.6C204.4 241.5 184.7 229.4 156.9 229.4H77.9V312.1zM161.2 78.4H77.9V176H162.8C197.1 176 218.8 161.7 218.8 125.4C218.8 89.6 192.9 78.4 161.2 78.4zM519.7 319.1H376V354H519.7V319.1zM576 142.8C576 218.7 531.6 282 451.1 282C372.9000000000001 282 319.8 223.2 319.8 146.2C319.8 66.3 370.1 11.5 451.1 11.5C512.4 11.5 552.1 39.1 571.2 97.8H509C502.3 75.9 474.7 64.3 453.3 64.3C412 64.3 390.3 88.5 390.3 129.6H575.4C575.6999999999999 133.8 576 138.3 576 142.8zM390.4 174C392.7 207.7 415.1 228.8 448.9 228.8C484.3 228.8 502.1 208 505.1 174H390.4z" /> + <glyph glyph-name="bimobject" + unicode="" + horiz-adv-x="448" d=" M416 416H32C14.4 416 0 401.6 0 384V0C0 -17.6 14.4 -32 32 -32H416C433.6 -32 448 -17.6 448 0V384C448 401.6 433.6 416 416 416zM352 158.6C352 109.2000000000001 340.6 76 248.2 76H231.3C187.2 76 168.9 90.9 160.9 114.8H160V80H96V312H160V237.3H161.1C165.7 267.8 200.8 276.1 230.8 276.1H248.1C340.5 276.1 351.9000000000001 243.0000000000001 351.9000000000001 193.6V158.6zM288 187.5V164.6C288 142.9 284.6 130.8 249.6 130.8H204.3C175.4 130.8 160.2 137.3 160.2 166.5V185.5C160.2 214.8 175.4 221.2 204.3 221.2H249.6C284.6 221.4 288 209.2 288 187.5z" /> + <glyph glyph-name="bitbucket" + unicode="" + horiz-adv-x="512" d=" M23.1 416C14.2 416.1 7 409.1 6.9 400.2C6.9 399.3 7 398.4 7.1 397.4L74.9 -14C76.6 -24.4 85.6 -32 96.1 -32.1H421.2000000000001C429.1 -32.2 435.9000000000001 -26.5 437.2000000000001 -18.7L505.0000000000001 397.3C506.4 406 500.5000000000001 414.2 491.8000000000001 415.6C490.9000000000001 415.7 490.0000000000001 415.8 489.0000000000001 415.8L23.1 416zM308.4000000000001 118.7H204.6L176.5 265.5H333.5L308.4 118.7z" /> + <glyph glyph-name="bitcoin" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM362.349 227.33C367.286 260.329 342.158 278.069 307.799 289.903L318.945 334.605L291.732 341.386L280.881 297.862C273.727 299.645 266.379 301.326 259.078 302.992L270.007 346.802L242.809 353.583L231.656 308.897C225.734 310.246 219.9209999999999 311.579 214.279 312.981L214.31 313.121L176.78 322.491L169.541 293.429S189.732 288.802 189.3059999999999 288.516C200.3279999999999 285.765 202.3199999999999 278.472 201.9859999999999 272.691L189.2899999999999 221.766C190.0499999999999 221.572 191.0339999999999 221.293 192.119 220.859C191.2119999999999 221.084 190.243 221.332 189.243 221.572L171.447 150.2339999999999C170.098 146.8859999999999 166.68 141.8639999999999 158.976 143.7699999999999C159.2469999999999 143.375 139.196 148.7069999999999 139.196 148.7069999999999L125.6859999999999 117.56L161.0999999999999 108.733C167.6879999999999 107.0819999999999 174.1449999999999 105.3539999999999 180.5 103.727L169.238 58.514L196.4199999999999 51.733L207.5729999999999 96.466A1038.209 1038.209 0 0 1 229.26 90.8389999999999L218.1449999999999 46.3159999999999L245.3579999999999 39.5349999999999L256.6199999999999 84.6629999999999C303.0239999999999 75.8819999999999 337.9189999999999 79.4239999999999 352.6059999999999 121.3899999999999C364.4419999999999 155.1799999999999 352.0169999999999 174.6709999999999 327.6019999999999 187.3809999999999C345.3819999999999 191.4789999999999 358.7759999999999 203.1729999999999 362.3489999999999 227.3299999999999zM300.172 140.151C291.762 106.3609999999999 234.864 124.6279999999999 216.417 129.208L231.361 189.107C249.807 184.504 308.961 175.39 300.172 140.151zM308.589 227.818C300.916 197.082 253.558 212.698 238.196 216.526L251.744 270.853C267.107 267.025 316.58 259.88 308.589 227.818z" /> + <glyph glyph-name="bity" + unicode="" + horiz-adv-x="496" d=" M78.4 380.8C173.8 470 324.5 472 421.5 377C435.8 362.9 415.1 339.9 399.1 355.5C314.3 437.9 183.3 435.8 100.2000000000001 358.7C83.9000000000001 343.6 63.7000000000001 367 78.4000000000001 380.8zM177.3 -37.8C196.6 -43.5 206.6 -14.2 185.2 -7.8C73 26.1 9.4 141.9 37.7 253.2C42.7 272.8 12.8 281.3 7.5 260.3C-24.6 132.9 48.6 0.5 177.3 -37.8000000000001zM325.4 -35.8C447.3 4.4 518.3 131.1 489.8 255.2C485.3 274.9 454.9 269 459.8 247.3C483.9999999999999 139.6 422.7 29.4 316.6 -6.1C295.4 -13.1 306.2 -42.1 325.4 -35.8zM262.5 43.2L262.7 115C262.7 123.2 256.1 129.8 247.9 129.8C239.7 129.8 233.1 123.1 233.1 115L232.9 43.2C232.9 35 239.5 28.4 247.7 28.4S262.5 35 262.5 43.2zM333.5 312.2C335.6 221.3 338.2 180.3 248 179.7C155.5 180.4 161.1 224 162.5 312.2C162.5 334 130 331.8 130 312.2V240.6C130 171.3 190.7 149.7 248 150.5C305.3 149.7 366 171.3 366 240.6V312.2C366 331.8 333.5 334 333.5 312.2z" /> + <glyph glyph-name="black-tie" + unicode="" + horiz-adv-x="448" d=" M0 416V-32H448V416H0zM316.5 90.8L224 2.1L131.5 90.8L196 274.8L131.5 361.4H316.4L252 274.8L316.5 90.8z" /> + <glyph glyph-name="blackberry" + unicode="" + horiz-adv-x="512" d=" M166 331.1C166 307.7 149.6 282 93.5 282H23.4L44.4 370.8H112.2C154.3 370.8 166 347.5 166 331.1zM292.2 370.8H224.4L205.7 282H275.8C329.6 282 345.9 307.7 345.9 331.1C346 347.5 334.3 370.8 292.2 370.8zM88.8 239.9H21L0 151.1H70.1C126.2 151.1 142.6 174.5 142.6 200.2C142.6 216.5 130.9 239.9000000000001 88.8 239.9000000000001zM268.9 239.9H201.1L182.4 151.1H252.5C306.3 151.1 322.6 174.5 322.6 200.2C322.6 216.5 310.9 239.9000000000001 268.9 239.9000000000001zM458.2 293.7H390.4L371.7 204.9H441.8C495.6 204.9 511.9 228.3 511.9 254C512 270.3 500.3 293.7 458.2 293.7zM430.2 155.8H362.4L343.7 67H413.8C469.9 67 483.9 90.4 483.9 116.1C483.9 132.4 472.3 155.8 430.2 155.8zM240.8 102H173L154.3 13.2H224.4C280.5 13.2 294.5 38.9 294.5 62.3C294.6 78.6 282.9 102 240.8 102z" /> + <glyph glyph-name="blogger-b" + unicode="" + horiz-adv-x="448" d=" M446.6 225.3C444.8 233.3 439.8 240.7 434.1 243.8C432.3 244.8 421.1 246 409.1 246.5C389 247.4 386.8 247.8 380.4000000000001 251.5C370.3 257.4 367.6 263.8 367.5000000000001 281C367.4000000000001 314 353.7000000000001 344.7 326.6000000000001 372.3C307.3000000000001 392 285.7000000000001 405.3 261.1000000000001 412.8C255.2000000000001 414.6 242.0000000000001 415.2 197.8000000000001 415.7C128.4000000000001 416.5 113.0000000000001 415.1 89.4000000000001 405.7C45.9 388.5 14.7 351.9 3.3 305.1C1.2 296.3 0.7 282.2 0.2 201.2C-0.4 99.7 0.3 84.8 6.6 64.7C22.2 15.1 66.5 -21.6 111 -29.6C125.8 -32.3 308.3 -32.9 327 -30.4C359.5 -26.0000000000001 385 -12.9 408.9 11.4999999999999C426.2 29.1999999999999 437 48.3 444.1 73.6C449 91.2 448.6 216.4 446.6 225.3zM124.5 288.9C132.3 296.8 134.5 297.1 183.3 297.1C227.2 297.1 228.7 297 235.1 293.7C244.4000000000001 289 248.5000000000001 282.4 248.5000000000001 271.8C248.5000000000001 262.3 244.7 255.6 236.2 250.2C231.6 247.3 228.9 247.1 185.9 246.9C159.4 246.7 138.2000000000001 247.3 135.1 248.1C118.5 252.8 112.3 276.6 124.5 288.9zM316.3 89.1L301.4000000000001 86.7000000000001L223.9 85.8000000000001C155.8000000000001 85.0000000000001 136.6 86.2000000000001 133 87.8000000000001C125.9 90.9000000000001 119.2 99.5000000000001 118.1 107.2000000000001C117 114.5000000000001 120.7 124.5000000000001 126.3 129.6C133.4 136 136.5 136.2000000000001 223.6 136.3C313.2000000000001 136.4 312.7000000000001 136.4 321.2000000000001 128.5C333.3000000000001 117.2 330.7000000000001 97.3 316.3000000000001 89.1z" /> + <glyph glyph-name="blogger" + unicode="" + horiz-adv-x="448" d=" M162.4 252C167.2 256.9 168.6 257.1 198.8 257.1C226 257.1 226.9 257 230.9 255C236.7 252.1 239.2 248 239.2 241.4C239.2 235.5 236.8 231.4 231.6 228C228.8 226.2 227.1 226.1 200.5 225.9C184.1 225.8 171 226.1 169 226.7C158.7 229.6 154.9 244.4 162.4 252.0000000000001zM223.8 157.5C169.9 157.5 168 157.3 163.6 153.4C160.1 150.3 157.9 144 158.5 139.5C159.2 134.8 163.3000000000001 129.4 167.7 127.5C169.9 126.5 181.8 125.8 224 126.3L271.9 126.9L281.1 128.4C290.1 133.5000000000001 291.6 145.8 284.2 152.8C278.9 157.5 279.2 157.5 223.8 157.5zM447.2000000000001 27.4C443.7000000000001 -1 424.2000000000001 -23 396.1 -30.1C388.9000000000001 -31.9 386.4000000000001 -32 223.2 -31.9C65.4 -31.9 57.3 -31.8 51.2 -30.1C42.8 -27.9 35.6 -24.6 28.9 -20.1C23.3 -16.3 15 -8.3 11.9 -3.7C8.1 1.9 3.7 11.6 1.9 18.3C0.1 25 0 27.7 0 191.7C0 354.8 0 358.3 1.8 365.4C8.1 390.1 27.7 409 53 414.6C60.3 416.2 385.1 416.5 393 414.9C414.2 410.6 430.9 397.8 440.6 378.5C448.3 363.2 447.6 380 447.9000000000001 197.9C448.1 82.1 447.9000000000001 33.4 447.2000000000001 27.4zM361.8000000000001 212.6C360.7000000000001 217.6 357.6000000000001 222.2 354.1000000000001 224.1C353.0000000000001 224.7 346.1000000000001 225.4 338.6000000000001 225.8C326.2000000000001 226.4 324.8000000000001 226.6 320.8000000000001 228.9C314.6000000000001 232.5 312.9000000000001 236.5 312.8000000000001 247.2C312.8000000000001 267.6 304.3000000000001 286.6 287.5000000000001 303.7C275.5000000000001 315.9 262.2000000000001 324.2 246.9000000000001 328.8C243.3000000000001 329.9 235.1000000000001 330.3 207.7000000000001 330.6C164.8000000000001 331.1 155.2000000000001 330.2 140.6000000000001 324.4C113.6000000000001 313.7 94.3000000000001 291 87.2000000000001 262C85.9000000000001 256.5999999999999 85.6000000000001 247.8 85.3 197.6999999999999C84.9 134.8999999999999 85.3 125.5999999999999 89.3 113.1999999999999C99 82.4999999999999 126.4 59.8 153.9 54.8C163.1 53.1 276.1 52.6999999999999 287.6 54.3C307.7000000000001 56.9999999999999 323.5 65.1 338.3 80.1999999999999C349 91.0999999999999 355.7 102.9999999999999 360.1 118.6999999999999C363.3 129.5999999999999 363 207.0999999999999 361.8 212.5999999999999z" /> + <glyph glyph-name="bluetooth-b" + unicode="" + horiz-adv-x="320" d=" M196.48 187.977L289.106 291.31L143.125 448V241.67L57.014 327.781L25.608 296.376L133.669 187.977L25.608 79.578L57.014 48.173L143.125 134.284L145.84 -64L294.392 84.644L196.48 187.977zM237.34 290.973L187.363 240.995L187.025 341.29L237.34 290.973zM187.363 134.96L237.34 84.982L187.025 34.6659999999999L187.363 134.9599999999999z" /> + <glyph glyph-name="bluetooth" + unicode="" + horiz-adv-x="448" d=" M292.6 276.9L249.7 234L249.4 320L292.6 276.9M249.4 57.1L292.5 100.2000000000001L249.6 143.1L249.4 57.1zM416 188.6C416 -17 344.1 -64 230.9 -64S32 -17 32 188.6S115.4 448 228.6 448S416 394.1 416 188.6zM257.5 188.6L336.9 277.2000000000001L211.8 411.5V234.6L138 308.4L111 281.5L203.7 188.5L111 95.5L137.9 68.6L211.7 142.4L214 -27.6L341.4 99.9L257.5 188.6z" /> + <glyph glyph-name="btc" + unicode="" + horiz-adv-x="384" d=" M310.204 205.362C337.9340000000001 219.542 355.581 244.752 351.4840000000001 286.662C346.1260000000001 344.013 299.0260000000001 363.235 236.6340000000001 368.591V448H188.1060000000001V370.7970000000001C175.5010000000001 370.7970000000001 162.5810000000001 370.482 149.662 370.1670000000001V448H101.134V368.591C83.2920000000001 368.052 62.512 368.315 3.764 368.591V316.913C42.078 317.591 62.181 320.053 66.787 295.486V78.057C63.862 58.565 48.263 61.372 13.532 61.986L3.765 4.32C92.246 4.32 101.135 4.005 101.135 4.005V-64H149.663V3.06C162.897 2.745 175.817 2.745 188.107 2.745V-64H236.635V4.005C317.9340000000001 8.417 372.2820000000001 28.899 379.5300000000001 105.472C385.201 166.918 356.2100000000001 194.334 310.2040000000001 205.362zM150.608 313.447C178.023 313.447 263.7340000000001 321.954 263.7340000000001 264.919C263.7340000000001 210.404 178.0240000000001 216.707 150.608 216.707V313.447zM150.608 61.671V168.179C183.38 168.179 283.735 177.317 283.735 114.924C283.7340000000001 54.738 183.38 61.671 150.608 61.671z" /> + <glyph glyph-name="buromobelexperte" + unicode="" + horiz-adv-x="448" d=" M0 416V288H128V416H0zM120 296H8V408H120V296zM160 416V288H288V416H160zM280 296H168V408H280V296zM320 416V288H448V416H320zM440 296H328V408H440V296zM0 256V128H128V256H0zM120 136H8V248H120V136zM160 256V128H288V256H160zM280 136H168V248H280V136zM320 256V128H448V256H320zM440 136H328V248H440V136zM0 96V-32H128V96H0zM120 -24H8V88H120V-24zM160 96V-32H288V96H160zM280 -24H168V88H280V-24zM320 96V-32H448V96H320z" /> + <glyph glyph-name="buysellads" + unicode="" + horiz-adv-x="448" d=" M224 297.3L266.9 136.6H181.1L224 297.3zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM382.7 42.7L288.2 341.4H159.8L65.3 42.7H156L267.7 134.3L291.9 42.6999999999999H382.7z" /> + <glyph glyph-name="cc-amazon-pay" + unicode="" + horiz-adv-x="576" d=" M124.7 246.2C124.8 258 124.7 269.7 124.7 281.5V316.8C124.7 318.1 125.1 318.8 126.1 319.5C137.6 327.5 150.2 331.6 164.3 330.6C176.8 329.7 187 323.6 192.4 308.9C195.7 300 196.5 290.7000000000001 196.5 281.2000000000001C196.5 272.5 195.8 263.9 193.1 255.6C187.4 237.8 174.4 230.9000000000001 157.4 231.7C145.7 232.2 135.5 236.7 126 243.4C125.1 244.2 124.6 245 124.7 246.2zM279.6 231.6C284.2000000000001 229.8 288.9000000000001 229.6 293.7000000000001 230.1C305.3000000000001 231.3 315.6 235.8 325.0000000000001 242.6C325.9000000000001 243.2 326.3000000000001 243.9 326.3000000000001 245.1C326.2000000000001 249 326.3000000000001 253 326.3000000000001 256.9C326.3000000000001 260.9 326.2000000000001 264.9 326.3000000000001 268.9C326.3000000000001 270.3 325.9000000000001 270.9 324.5000000000001 271.1C317.5000000000001 272 310.6000000000001 273.3 303.6000000000001 274C296.6000000000001 274.6 289.6000000000001 274.3 282.8000000000001 272.1C276.1000000000001 269.9 271.1000000000001 265.9 269.1000000000001 259C267.5000000000001 253.6 267.5000000000001 248.2 269.2000000000001 242.8C270.8000000000002 237.3 274.4000000000001 233.6 279.6000000000001 231.6zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM368.5 344.1C368.9 342.4 369.4 340.7 370.1 339C386.6 298.4 403 257.7 419.6 217.1C421 213.6 421.3 210.7 419.8 207.2C417 201 414.9000000000001 194.6 412 188.5C409.4 183 405.3 179 399.3 177.3C395.1 176.2 390.8 176 386.4000000000001 176.4C384.3 176.6 382.2000000000001 177.1 380.1 177.2000000000001C377.3 177.4 375.9000000000001 176.1 375.8 173.2000000000001C375.7 170.4 375.7 167.6 375.8 164.9C375.9000000000001 160.3 377.4000000000001 158.2000000000001 382 157.4C386.7 156.6 391.4 155.8 396.2 155.7000000000001C410.5 155.4 421.9 161.1 429.3 173.6C432.2 178.5 434.9000000000001 183.7000000000001 437 189C456.8 239.1 476.5 289.3 496.2 339.5C496.8 341 497.3 342.5 497.5 344.1C497.9 346.5 496.8 347.7 494.4 347.8C488.8 347.9 483.3 347.8 477.7 347.8C474.6 347.8 472.4 346.4 471.3 343.5C470.9 342.4 470.4 341.2 470 340.1L440.9 256.4C438.8 250.3 436.7 244.3 434.4 237.8C434 238.7 433.8 239.2 433.6 239.7C422.8 269.6 412 299.6 401.2 329.5C399.5 334.2 397.7 339 395.9 343.7C395 346.2 393.2 347.7 390.5 347.7C384.1 347.8 377.7 347.9 371.3 347.8C369.1 347.8 368 346.2 368.5 344.1zM242.4 242C244.1 230.3 250 221.2 260.4 215.4C270.3 209.9 281.1 209.2 292.1 210.8C304.8 212.7 316 218.1 325.9 226.3C326.3 226.6 326.7 226.9 327.3 227.3C327.8 224.1 328.2 221.1 328.8 218.1C329.3 215.5 330.9 213.8 333.3 213.7C337.9 213.6 342.4 213.6 347 213.7C349.3 213.8 350.8 215.3 351 217.6C351.1 218.4 351.1 219.2 351.1 219.9V308.7000000000001C351.1 312.3000000000001 350.9 315.9000000000001 350.4 319.5000000000001C348.8 330.3000000000001 344.2 339.2000000000001 334.5 344.9000000000001C328.9 348.2000000000001 322.7 349.9000000000001 316.3 350.8000000000001C313.3 351.2000000000001 310.3 351.5000000000001 307.2 351.9000000000001H297.2C296.4 351.8000000000001 295.6 351.6000000000001 294.7 351.6000000000001C286.5 351.2000000000001 278.4 350.2000000000001 270.5 348.1000000000001C265.4 346.8000000000001 260.5 344.9000000000001 255.5 343.2000000000001C252.5 342.2000000000001 251 340.0000000000001 251.1 336.7000000000001C251.2 333.9000000000001 251 331.1000000000001 251.1 328.4000000000001C251.2 324.3000000000001 252.9 323.2000000000001 256.8 324.3000000000001C263.3 326.0000000000001 269.9000000000001 327.8000000000001 276.5 329.1000000000001C286.8 331.0000000000001 297.2 331.8000000000001 307.6 330.3000000000001C313 329.5000000000001 318.1 327.9000000000001 321.7000000000001 323.3000000000001C324.8000000000001 319.3000000000001 325.9000000000001 314.5000000000001 326.1 309.6000000000001C326.4000000000001 302.7000000000001 326.3 295.7000000000001 326.4000000000001 288.8000000000001C326.4000000000001 288.4000000000001 326.3 288.1000000000001 326.2000000000001 287.6000000000001C325.8000000000001 287.6000000000001 325.4000000000001 287.6000000000001 325.1 287.7000000000001C316.3 289.8000000000001 307.4000000000001 291.3000000000001 298.3 291.8000000000001C288.8 292.3000000000001 279.4000000000001 291.7000000000001 270.4000000000001 288.6000000000001C259.6 284.8000000000001 250.9000000000001 278.3000000000001 245.8000000000001 267.8000000000001C241.7000000000001 259.5000000000001 241.2000000000001 250.8000000000001 242.4000000000001 242.0000000000001zM98.7 341.1V165.8C98.7 165 98.7 164.1 98.8 163.3C99 160.8 100.5 159.1999999999999 102.9 159.1C108.8 159 114.7 159 120.6 159.1C123.1 159.1 124.6 160.8 124.7 163.2C124.8 164 124.8 164.9 124.8 165.7V226.4C125.7 225.7 126.2 225.2 126.7 224.8C141.7 212.3 158.9 208.2 177.8 211.9C194.9 215.3 206.7 225.8 214.5 241.1C220.3 252.7 222.8 265.2 223.2 278.1C223.7 292.4 222.2 306.5 216.4 319.8C209.3 336.2 197.5 347.1 179.7 350.7C177 351.3 174.2 351.5 171.5 351.9H164.5C163.3 351.7 162.1 351.6 160.9 351.4C149.2 350 138.6 345.6 129.1 338.7C127.1 337.3 125.2 335.7 123.2 334.2C123.1 334.7 122.9 335 122.8 335.4C122.4 337.7 122.1 340 121.7 342.3C121.1 346.2 119.2 347.8 115.3 347.9H105.6C99.7 348 98.7 346.9 98.7 341.1zM493.6 109C490.9 109.7 488.5 109 486 108C442.1 89.6 396.5 77.8 349.2 72.2C334.7 70.5 320.1 69.4 305.5 69C278.9 68.3 252.3 69.8 225.9 73.3C208.1 75.7 190.4 79 172.9 83.2C135.9 92.1 100.2 104.9 66.2 122C57.4 126.4 48.8 131.3 40.1 136C36.3 138.1 33.9 137.5 31.9 133.9V132.2C33.1 130.6 34.1 128.8 35.6 127.4C71.6 95.2 112.2 70.9 157.6 54.5C179.5 46.6 202 40.8 224.9 37C238.9 34.7 252.9 33.2 267.1 32.5C270.1 32.4 273.1 32.3 276.1 32.1C276.8 32.1 277.5 31.9 278.2 31.8H295.9C296.6 31.9 297.3 32.1 298 32.1C312.9 32.5 327.8 33.9 342.6 36.1C364 39.3 385 44.2 405.5 50.8C435.1 60.4 463.2 73.2 488.9 90.9C491.7 92.8 494.6 94.7000000000001 496.9 97.1C501.2 101.5 499.2 107.5 493.6 109zM544 136.7C543.2 140.9 540 142.5 536.4 143.7C530.6999999999999 145.6 524.8 146.5 518.8 147C507.8 147.9 496.8 147.4 485.9999999999999 145.4C473.9999999999999 143.2 462.6 139.3 452.4999999999999 132.3C451.3 131.5 450.1 130.5 449.3999999999999 129.3C448.7999999999999 128.4 448.7 127 448.8999999999999 125.9C449.2 124.6 450.5999999999999 124.3 451.8999999999999 124.4C452.4999999999999 124.4 453.0999999999999 124.4 453.6999999999999 124.5L473.1999999999999 126.6C482.8 127.5 492.3999999999999 128.1 501.9999999999999 127.4C506.1 127.1 510.1 126.2000000000001 514 125.2000000000001C518.3 124.1 520.2 120.8000000000001 520.4 116.5000000000001C520.6999999999999 109.8000000000001 519.1999999999999 103.4 517.5 97.0000000000001C514 84.1000000000001 509.2 71.6000000000001 504.2 59.2000000000001C503.9 58.4 503.5 57.5000000000001 503.4 56.7000000000001C503 54.2 504.4 52.7 506.8 53.2C508.1999999999999 53.5000000000001 509.8 54.3000000000001 510.8 55.3000000000001C514.5 58.9000000000001 518.3 62.5000000000001 521.4 66.5000000000001C532.1 80.3000000000001 538.4 96.1000000000001 542.1 113.1000000000001C542.8000000000001 116.1000000000001 543.3000000000001 119.2000000000001 543.8000000000001 122.2000000000001C544.0000000000001 126.9000000000001 544.0000000000001 131.8000000000001 544.0000000000001 136.7000000000001z" /> + <glyph glyph-name="cc-amex" + unicode="" + horiz-adv-x="576" d=" M576 192.6C538.1 192.8 531.8 193.5 521.5 187.6V192.6C476.2 192.6 468 194.3 456.6 187.4V192.6H378.4000000000001V187.5C367.0000000000001 194 357.0000000000001 192.6 302.7000000000001 192.6V187C296.4000000000001 190.7 288.2000000000001 192.6 278.4000000000001 192.6H220.4C216.9 188.8 207.9 178.9 204.7000000000001 175.4C192.0000000000001 189.5 194.2000000000001 187 189.2000000000001 192.6H106.1000000000001V100.3H188.1000000000001C191.4000000000001 103.8 201.0000000000001 114.1999999999999 204.2000000000001 117.6999999999999C216.9 103.3999999999999 214.5000000000001 105.9999999999999 219.6000000000001 100.3H268.5000000000001C268.5000000000001 115 268.6000000000001 108.6 268.6000000000001 123.3C280.1000000000001 123.1 292.9000000000001 123.5 302.9000000000001 129.5C302.9000000000001 115.6 302.8000000000001 112.3999999999999 302.8000000000001 100.3H342.4000000000001C342.4000000000001 118.8 342.5000000000001 107.6999999999999 342.5000000000001 125.6C348.7000000000001 125.6 350.2000000000001 125.6 351.9000000000001 125.5C352.0000000000001 124.1999999999999 351.9000000000001 125.5 351.9000000000001 100.3C504.7000000000001 100.3 497.8000000000001 99.1999999999999 508.6000000000001 104.8V100.3C543.4000000000001 100.3 563.4000000000001 98.1 576.1000000000001 106.4V16C576.1000000000001 -10.5 554.6000000000001 -32 528.1000000000001 -32H48C21.5 -32 0 -10.5 0 16V219.7H26.6C30.8 229.8 28.8 225 33 235H52.2C56.4 225 54.4 229.8 58.6 219.7H111.5V231.1C113.7 226.1 112.6 228.6 116.6 219.7H146.1C148.5 225.2 148.7 225.5 151.2 231.1V219.7H286.7V244.8C293.1 244.8 294.7 244.9 296.5 244.6C296.5 244.6 296.3 233.7 296.6 219.8H363.1V228.7C370.5 222.8 380.5 219.8 392.8 219.8H419.6C423.8 229.9 421.8 225.1 426 235.1H445C451.5 220.1 445.2 234.6 451.6 219.8H504.4V241.7C516.2 222 512.2 228.8 517.6 219.8H559.2V311.8H519.3000000000001V293.4C507.1000000000001 313.6 513.0000000000001 303.8 508.1000000000001 311.8H464.8000000000001V291.2C458.6000000000001 305.8 460.2 302 456.0000000000001 311.8H423.6000000000001C423.2000000000001 311.8 421.3000000000001 311.6 421.3000000000001 312.1H393.7000000000001C380.9000000000001 312.1 370.6 308.9 363.0000000000001 302.8V312.1H323.1000000000001V306.8C312.3000000000001 312.9 302.4000000000001 311.9 258.7000000000001 312.1C258.6 312.1 247.1000000000001 312.2 247.1000000000001 312.1H144.1000000000001C141.6000000000001 306 137.3000000000001 295.7 131.5000000000001 282.1C128.7000000000001 288.1 120.5000000000001 305.9 117.6000000000001 312.1H71.6000000000001V291C64.2000000000001 308.4 66.9000000000001 302 62.6000000000001 312.1H22.9C19.5 304.2 9.2 280.1 -0.2 258.2V368C-0.2 394.5 21.3 416 47.8 416H527.8C554.3 416 575.8 394.5 575.8 368V192.6zM389.4 273.2C389.1 273 388 271 388 265.6C388 259.6 388.9 257.9 389.1 257.7C389.3 257.6 390.2000000000001 257.2 392.5 257.2L399.8 274.1C398.7 274.1 397.7 274.2 396.7 274.2C391.1 274.2 389.7 273.5 389.4 273.2zM369.5 142.3C378.7 139 380.5 132.8 380.5 123.9L380.4 110.1H363.8L363.9 121.6C363.9 133.4 360.1 135.4 349.1 135.4H331.5L331.3999999999999 110.1H314.7999999999999L314.8999999999999 179.4H354.2999999999999C367.2999999999999 179.4 381.3999999999999 177.1 381.3999999999999 160.7C381.2999999999999 153.1 377.2 145.4 369.5 142.3zM363.2 157.6999999999999C363.2 164.0999999999999 357.6 165.0999999999999 352.5 165.0999999999999H331.5V149.4999999999999H352.2C357.8 149.4999999999999 363.2 150.7999999999999 363.2 157.6999999999999zM544.9 164.8H575V179.4H542.1C529.3000000000001 179.4 518.3000000000001 172.8 518.3000000000001 158.7C518.3000000000001 125.7 561.0000000000001 145.9 561.0000000000001 131.3C561.0000000000001 126.2 556.7000000000002 124.9 552.6000000000001 124.9H520.6000000000001L520.5000000000001 110.1H552.5000000000001C560.9000000000001 110.1 570.1000000000001 111.9 575.0000000000001 119V144.8C564.5000000000001 158.6 535.7000000000002 146.1 535.7000000000002 158.3C535.7000000000002 164.1 540.3000000000002 164.8 544.9000000000002 164.8zM445.7 165.1V179.4H390.5L390.4 110.1H445.6L445.7 124.4L407.1 124.7V138.5H445V152.6H407.2V165.1H445.7zM487.9 125H455.7L455.6 110.1999999999999H487.8C502.6 110.1999999999999 514 115.8 514 132.1999999999999C514 165.3999999999999 471.1 143.3999999999999 471.1 158.5C471.1 164.1 476 164.8999999999999 480.3 164.8999999999999H510.7V179.5H477.5C464.7 179.5 454 172.8999999999999 454 158.8C454 125.8 496.7 146.3 496.7 131.4C496.6 126 492 125 487.9 125zM409.8 283.7C392.4 284 376.6 287.8 376.6 264C376.6 252.2 379.4 244.1 392.7 244.1H400.1L423.6 298.5999999999999H448.4L476.3 233.2V298.5999999999999H501.6L530.6999999999999 250.5V298.5999999999999H547.5999999999999V229.6H524L492.8 281.5V229.6H459.1L452.5 244.9H418.2L411.8 229.6H392.6C369.8 229.6 359.6 241.4 359.6 263.5999999999999C359.6 286.9 370.1 298.8999999999999 393.6 298.8999999999999H409.7000000000001V283.7zM424.1 259.2H446.9L435.7 286.8L424.1 259.2zM351.5 298.8H334.6V229.5H351.5V298.8zM313.4 261.5C322.9 258.2 324.4 252.3 324.4 243.1V229.6H307.8C307.5 244.4 311.4 254.7 293 254.7H275V229.6H258.6V298.8999999999999L297.7 298.5999999999999C311 298.5999999999999 325.1 296.5999999999999 325.1 280.2C325.2 272.2 320.8 264.4999999999999 313.4 261.4999999999999zM306.7 276.8C306.7 283.2 301.1 284.2 296 284.2H275V268.9H295.7C301.4 268.9 306.7 270.2 306.7 276.8zM247.2 284.2V298.8H191.7V229.5H247.2V243.8H208.3V257.6H246.1V271.7H208.3V284.2H247.2zM162.6 229.5V283.7L138.6 229.5H124L100 283.7V229.5H66.2L59.8 244.8H25.3L18.9 229.5H1L30.7 298.8H55.2L83.3 233.1V298.8H110.4L132.1 251.8L151.8 298.8H179.4V229.5H162.6zM53.9 259.2L42.4 286.8L31.2 259.2H53.9zM306.9 156.7C306.9 128.8 276.5 133.4 257.6 133.4L257.5 110.1H225.3L204.9 133.1L183.5999999999999 110.1H118.1999999999999L118.2999999999999 179.4H184.7999999999999L205.2999999999999 156.6L226.3 179.4H279C294.6 179.4 306.9 174 306.9 156.7zM194.2 144.9L176.3 165.1H134.6V152.6H170.9V138.5H134.6V124.6999999999999H175.2L194.2 144.8999999999999zM241 172L215.7 144.6L241 116.5V172zM289.3 156.7C289.3 162.8 284.7 165.1 279.1 165.1H257.6V147.5H278.8C284.7 147.5 289.3 150.3 289.3 156.6999999999999z" /> + <glyph glyph-name="cc-apple-pay" + unicode="" + horiz-adv-x="576" d=" M302.2 229.6C302.2 212.4 291.7 202.5 273.2 202.5H248.9V256.7H273.3C291.7 256.7 302.2 246.9 302.2 229.6zM349.7 167C349.7 158.7 356.9 153.3 368.2 153.3C382.6 153.3 393.4 162.4 393.4 175.2V182.9L369.9 181.4C356.6 180.5 349.7 175.6 349.7 167zM576 369V17C576 -9.5 554.5 -31 528 -31H48C21.5 -31 0 -9.5 0 17V369C0 395.5 21.5 417 48 417H528C554.5 417 576 395.5 576 369zM127.8 250.8C136.2 250.1 144.6 255 149.9 261.2000000000001C155.1 267.6 158.5 276.2000000000001 157.6 284.9C150.2 284.6 141 280 135.7 273.6C130.9 268.1 126.8 259.2 127.8 250.8zM188.4 176.3C188.2 176.5 168.8 183.9 168.6 206.3C168.4 225 183.9 234 184.6 234.5C175.8 247.5 162.2 248.9 157.5 249.2C145.3 249.9 134.9 242.3 129.1 242.3C123.2 242.3 114.4 248.9 104.8 248.7C92.3 248.5 80.6 241.4 74.3 230.1C61.2 207.5 70.9 174.1 83.6 155.7C89.8 146.6 97.3 136.6 107.1 137C116.4 137.4 120.1 143 131.3 143C142.6 143 145.8 137 155.6 137.1C165.8 137.3 172.1 146.2000000000001 178.4 155.3C185.3 165.7 188.2 175.7 188.4 176.3zM323.8 229.7C323.8 256.3 305.3 274.5 278.9000000000001 274.5H227.7000000000001V138.1H248.9000000000001V184.7000000000001H278.2000000000001C305.0000000000001 184.7000000000001 323.8000000000001 203.1000000000001 323.8000000000001 229.7000000000001zM413.8 206C413.8 225.7 398 238.4000000000001 373.8 238.4000000000001C351.3 238.4000000000001 334.7 225.5000000000001 334.1 207.9H353.2000000000001C354.8000000000001 216.3000000000001 362.6 221.8000000000001 373.2000000000001 221.8000000000001C386.2000000000001 221.8000000000001 393.4000000000001 215.8000000000001 393.4000000000001 204.6000000000001V197.1000000000001L367.0000000000001 195.5000000000001C342.4000000000001 194.0000000000001 329.1000000000001 183.9 329.1000000000001 166.4C329.1000000000001 148.7000000000001 342.8000000000001 137.0000000000001 362.5000000000001 137.0000000000001C375.8000000000001 137.0000000000001 388.1000000000001 143.7000000000001 393.7000000000001 154.4H394.1V138H413.7000000000001V206zM516 237.1H494.5L469.6 156.5H469.2L444.3000000000001 237.1H422L457.9 137.8L456 131.8C452.8 121.6 447.5 117.6 438.1 117.6C436.4000000000001 117.6 433.2000000000001 117.8 431.9000000000001 117.9V101.5000000000001C433.1 101.1000000000001 438.4000000000001 101.0000000000001 440.0000000000001 101.0000000000001C460.7 101.0000000000001 470.4 108.9 478.9 132.8000000000001L516 237.1z" /> + <glyph glyph-name="cc-diners-club" + unicode="" + horiz-adv-x="576" d=" M239.7 368.1C142.8 368.1 63.9 289.5 63.9 192.3C63.9 95.4 142.8 16.5 239.7 16.5C336.9 16.5 415.5 95.4 415.5 192.3C415.5 289.5 336.9 368.1 239.7 368.1zM199.8 88.5C158.1 104.4 128.4 144.9 128.4 192.3S158.1 280.2000000000001 199.8 296.4V88.5zM279.6 88.2V296.4C321.3 280.2000000000001 351 239.7 351 192.3S321.3 104.4 279.6 88.2000000000001zM528 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H528C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 528 416zM329.7 0H239.4C133.2 0 45.6 85.5 45.6 190.2C45.6 304.8 133.2 384 239.4 384H329.7C434.7 384 530.4 304.8 530.4 190.2C530.4 85.5 434.7 0 329.7 0z" /> + <glyph glyph-name="cc-discover" + unicode="" + horiz-adv-x="576" d=" M83 235.9C83 228 79.8 220.4 74.1 215.2C69.2 210.8 62.5 208.8 52.2 208.8H48V263H52.2C62.5 263 68.9 261.3 74.1 256.4C79.8 251.4 83 243.8 83 235.9zM504.8 264H499.9V239.1H504.6C514.9 239.1 520.4 243.5 520.4 251.9C520.4 259.8 514.9 264 504.8 264zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM428 195H473.3V208.8H444V231H472.3V244.8H444V263H473.3V277H428V195zM341.8 277L376.8 192.8H385.4000000000001L420.9000000000001 277H403.4000000000001L381.2000000000001 221.8L359.3000000000001 277H341.8000000000001zM258.8 235.4C258.8 210.8 278.7 190.8 303.4000000000001 190.8C328.0000000000001 190.8 348.0000000000001 210.7 348.0000000000001 235.4C348.0000000000001 260 328.1000000000001 280 303.4000000000001 280C278.8 280 258.8 260.1 258.8 235.4zM190.8 235.9C190.8 203.4 224.4 183.4 254.1 197.7V216.7C234.8 197.4 207.3 210.9 207.3 235.9C207.3 259.6 234 275 254.1 254.9V273.9C223.9 288.9 190.8 267.1 190.8 235.9zM156.9 207.6C149.3 207.6 143.1 211.3 139.4 218.4L129.1 208.5C146.9 182.4 185.7 190.3 185.7 219.8C185.7 232.9 180.3 238.8 162.1 245.4C152.5 248.8 149.8 251.3 149.8 255.7C149.8 264.4 164.3 269.8 174.7 258.2000000000001L183.1 269C164 286.1 133.4 277.9000000000001 133.4 254.7C133.4 243.4 138.6 237.5000000000001 153.6 232.0000000000001C179.3 222.9 168.3 207.6 156.9 207.6zM99.5 235.9C99.5 260 81.5 277 55.4 277H32V195H55.4C86.3 195 99.5 217.4 99.5 235.9zM122.9 277H106.9V195H122.9V277zM544 160C510.7 139.2 317.6 35.6 128 0H529C537.2 0 544 6.8 544 15V160zM544 195L518.1 229.5C530.2 232 536.8000000000001 240.1 536.8000000000001 252.7C536.8000000000001 281.2 506.5000000000001 277.1 483.9000000000001 277.1V195.1H499.9000000000001V227.9H502.1000000000001L524.3000000000001 195.1H544z" /> + <glyph glyph-name="cc-jcb" + unicode="" + horiz-adv-x="576" d=" M431.5 203.7V236C472.7 236 470 235.8 470 235.8C477.3 234.5 483.3 228.5 483.3 219.8C483.3 211 477.3 205.3 470 204C468.8 203.6 466.7 203.7 431.5 203.7zM474.3 183.5C471.5 184.2 471 184 431.5 184V149C471.1 149 471.5 148.8 474.3 149.5C481.8 151 487.8 157.5 487.8 166.5C487.8 175.2 481.8 182 474.3 183.5zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM182 255.7H125C125 188.6 135.7 146 89.2 146C69.7 146 50.4 151.7 32 160.8V132.8C62 124.5 100 124.5 100 124.5C197.9 124.5 182 172.2 182 255.7zM360.5 251.2C297.1 267.2 195.5 266.1 195.5 191.9C195.5 114.8 303.7 118.3 360.5 132.7V161C312.9 136.3 253 139 253 192S312.8 247.6 360.5 223.2V251.2zM544 161.5C544 180 527.5 192 506 193.5V194.3C525.5 197 536.3 209.8 536.3 224.5C536.3 243.5 520.5999999999999 254.5 499.3 255.5C499.3 255.5 505.6 255.8 379 255.8V128.3H501.6999999999999C525.9999999999999 128.2 543.9999999999999 141.2 543.9999999999999 161.5z" /> + <glyph glyph-name="cc-mastercard" + unicode="" + horiz-adv-x="576" d=" M482.9 37.7C482.9 30.9 478.3 26 471.7 26C464.9 26 460.5 31.2 460.5 37.7C460.5 44.2 464.9 49.4 471.7 49.4C478.3 49.4 482.9 44.2 482.9 37.7zM172.1 49.4C165 49.4 160.9 44.2 160.9 37.7C160.9 31.2 165 26 172.1 26C178.6 26 183 30.9 183 37.7C182.9 44.2 178.6 49.4 172.1 49.4zM289.6 49.7C284.2 49.7 280.9 46.2 280.1 41H299.2C298.3 46.7 294.8 49.7 289.6 49.7zM397.4 49.4C390.6 49.4 386.5 44.2 386.5 37.7C386.5 31.2 390.6 26 397.4 26C404.2 26 408.6 30.9 408.6 37.7C408.6 44.2 404.2 49.4 397.4 49.4zM503.3 23.3C503.3 22.9999999999999 503.6 22.8 503.6 22.1999999999999C503.6 21.8999999999999 503.3 21.6999999999999 503.3 21.0999999999999C502.9999999999999 20.7999999999999 502.9999999999999 20.5999999999999 502.8 20.2999999999999C502.4999999999999 19.9999999999999 502.3 19.7999999999999 501.6999999999999 19.7999999999999C501.3999999999999 19.4999999999999 501.1999999999999 19.4999999999999 500.5999999999999 19.4999999999999C500.2999999999999 19.4999999999999 500.0999999999999 19.4999999999999 499.4999999999999 19.7999999999999C499.1999999999999 19.7999999999999 498.9999999999999 20.0999999999999 498.6999999999999 20.2999999999999C498.3999999999999 20.5999999999999 498.1999999999999 20.7999999999999 498.1999999999999 21.0999999999999C497.8999999999999 21.5999999999999 497.8999999999999 21.8999999999999 497.8999999999999 22.1999999999999C497.8999999999999 22.6999999999999 497.8999999999999 22.9999999999999 498.1999999999999 23.3C498.1999999999999 23.8 498.4999999999999 24.1 498.6999999999999 24.4C498.9999999999999 24.7 499.1999999999999 24.7 499.4999999999999 24.9C499.9999999999999 25.2 500.2999999999999 25.2 500.5999999999999 25.2C501.0999999999999 25.2 501.3999999999999 25.2 501.6999999999999 24.9C502.1999999999999 24.6 502.4999999999999 24.6 502.8 24.4S502.9999999999999 23.8 503.3 23.3zM501.1 21.9C501.6 21.9 501.6 22.2 501.9 22.2C502.2 22.5 502.2 22.7 502.2 23C502.2 23.3 502.2 23.5 501.9 23.8C501.6 23.8 501.4 24.1 500.8 24.1H499.1999999999999V20.6H499.9999999999999V22H500.3L501.4 20.6H502.2L501.1 21.9zM576 367V15C576 -11.5 554.5 -33 528 -33H48C21.5 -33 0 -11.5 0 15V367C0 393.5 21.5 415 48 415H528C554.5 415 576 393.5 576 367zM64 227.4C64 150.9 126.1 88.9 202.5 88.9C229.7 88.9 256.4 97.1 279 112C206.1 171.3 206.6 283.2 279 342.5C256.4 357.5 229.7 365.6 202.5 365.6C126.1 365.7 64 303.6 64 227.4zM288 118.6C358.5 173.6 358.2 280.8 288 336.1C217.8 280.8 217.5 173.5 288 118.6zM145.7 42.3C145.7 51 140 56.7 131 57C126.4 57 121.5 55.6 118.2 50.5C115.8 54.6 111.7 57 106 57C102.2 57 98.4 55.6 95.4 51.6V56H87.2V19.3H95.4C95.4 38.2 92.9 49.5 104.4 49.5C114.6 49.5 112.6 39.3 112.6 19.3H120.5C120.5 37.6 118 49.5 129.5 49.5C139.7 49.5 137.7 39.5 137.7 19.3H145.9V42.3zM190.6 56H182.7V51.6C180 54.9 176.2 57 171 57C160.7 57 152.8 48.8 152.8 37.7C152.8 26.5 160.7 18.4 171 18.4C176.2 18.4 180 20.3 182.7 23.8V19.1999999999999H190.6V56zM231.1 30.4C231.1 45.4 208.2 38.6 208.2 45.6C208.2 51.3 220.1 50.4 226.7 46.7L230 53.2C220.6 59.3 199.8 59.2 199.8 45C199.8 30.7 222.7 36.7 222.7 30C222.7 23.7 209.2 24.2 202 29.2L198.5 22.9C209.7 15.3 231.1 16.9 231.1 30.4zM266.5 21.1L264.3 27.9C260.5 25.8 252.1 23.5 252.1 32V48.6H265.2000000000001V56H252.1000000000001V67.2H243.9000000000001V56H236.3000000000001V48.7H243.9000000000001V32C243.9000000000001 14.4 261.2000000000001 17.6 266.5000000000001 21.1zM279.8 34.4999999999999H307.3C307.3 50.6999999999999 299.9000000000001 57.1 289.9000000000001 57.1C279.3 57.1 271.7000000000001 49.2 271.7000000000001 37.8C271.7000000000001 17.3 294.3000000000001 13.9 305.5000000000001 23.6L301.7000000000001 29.6C293.9000000000001 23.2 282.1 23.8 279.8000000000001 34.4999999999999zM338.9000000000001 55.9999999999999C334.3 57.9999999999999 327.3 57.8 323.7000000000001 51.6V56H315.5000000000001V19.3H323.7000000000001V40C323.7000000000001 51.6 333.2000000000001 50.1 336.5000000000001 48.4L338.9000000000001 56zM349.5000000000001 37.6999999999999C349.5000000000001 49.0999999999999 361.1000000000001 52.8 370.2000000000001 46.0999999999999L374.0000000000001 52.5999999999999C362.4000000000001 61.6999999999999 341.3000000000001 56.6999999999999 341.3000000000001 37.5999999999999C341.3000000000001 17.7999999999999 363.7000000000001 13.7999999999999 374.0000000000001 22.5999999999999L370.2000000000001 29.0999999999999C361.0000000000001 22.5999999999999 349.5000000000001 26.4999999999999 349.5000000000001 37.6999999999999zM416.2000000000001 55.9999999999999H408V51.6C399.7 62.6 378.1 56.4 378.1 37.7C378.1 18.5 400.5 13 408 23.8V19.2H416.2V56zM449.9000000000001 55.9999999999999C447.5000000000001 57.1999999999999 438.9000000000001 58.8999999999999 434.7000000000001 51.6V56H426.8000000000001V19.3H434.7000000000001V40C434.7000000000001 51 443.7000000000001 50.3 447.5000000000001 48.4L449.9000000000001 56zM490.2 70.8999999999999H482.3000000000001V51.5999999999999C474.1000000000001 62.4999999999999 452.4000000000001 56.6999999999999 452.4000000000001 37.6999999999999C452.4000000000001 18.3 474.9000000000001 13.0999999999999 482.3000000000001 23.8V19.1999999999999H490.2V70.8999999999999zM497.8000000000001 145.9999999999999V141.3999999999999H498.6000000000001V146H500.5000000000001V146.8H495.9V146H497.8zM504.4000000000001 22.1999999999999C504.4000000000001 22.6999999999999 504.4000000000001 23.2999999999999 504.1000000000001 23.7999999999999C503.8000000000001 24.0999999999999 503.6000000000001 24.5999999999999 503.3000000000001 24.8999999999999C503.0000000000001 25.1999999999999 502.5000000000001 25.3999999999999 502.2 25.6999999999999C501.7 25.6999999999999 501.1 25.9999999999999 500.6 25.9999999999999C500.3 25.9999999999999 499.8 25.6999999999999 499.2 25.6999999999999C498.7 25.3999999999999 498.4 25.1999999999999 498.1 24.8999999999999C497.6 24.5999999999999 497.3 24.0999999999999 497.3 23.7999999999999C497 23.2999999999999 497 22.6999999999999 497 22.1999999999999C497 21.8999999999999 497 21.3999999999999 497.3 20.7999999999999C497.3 20.4999999999999 497.6 19.9999999999999 498.1 19.6999999999999C498.4 19.3999999999999 498.6 19.1999999999999 499.2 18.8999999999999C499.7 18.5999999999999 500.3000000000001 18.5999999999999 500.6 18.5999999999999C501.1 18.5999999999999 501.7 18.5999999999999 502.2 18.8999999999999C502.5000000000001 19.1999999999999 503.0000000000001 19.3999999999999 503.3000000000001 19.6999999999999C503.6000000000001 19.9999999999999 503.8000000000001 20.4999999999999 504.1000000000001 20.7999999999999C504.4000000000001 21.3999999999999 504.4000000000001 21.8999999999999 504.4000000000001 22.1999999999999zM507.6000000000001 146.8999999999999H506.2000000000001L504.6000000000001 143.3999999999999L503.0000000000001 146.8999999999999H501.6000000000001V141.4999999999999H502.4000000000001V145.5999999999999L504.0000000000001 142.0999999999999H505.1000000000001L506.5000000000001 145.5999999999999V141.4999999999999H507.6000000000001V146.8999999999999zM512.0000000000001 227.3999999999999C512.0000000000001 303.5999999999999 449.9000000000001 365.6999999999999 373.5000000000001 365.6999999999999C346.3000000000002 365.6999999999999 319.6000000000002 357.4999999999999 297.0000000000001 342.5999999999999C369.1000000000002 283.2999999999999 370.2000000000001 171.0999999999999 297.0000000000001 112.0999999999999C319.6000000000002 97.0999999999999 346.5000000000001 88.9999999999999 373.5000000000001 88.9999999999999C449.9000000000001 88.8999999999999 512.0000000000001 150.8999999999999 512.0000000000001 227.3999999999999z" /> + <glyph glyph-name="cc-paypal" + unicode="" + horiz-adv-x="576" d=" M186.3 189.8C186.3 177.6 176.6 168.3 164.3 168.3C155.1 168.3 148.3 173.5 148.3 183.3C148.3 195.5 157.8 205.3 170 205.3C179.3 205.3 186.3 199.6 186.3 189.8zM80.5 238.3H75.8C74.3 238.3 72.8 237.3 72.6 235.6L68.3 208.9L76.5 209.2000000000001C87.5 209.2000000000001 96 210.7000000000001 98 223.4C100.3 236.8000000000001 91.8 238.3000000000001 80.5 238.3000000000001zM364.5 238.3H360C358.2 238.3 357 237.3 356.8 235.6L352.6 208.9L360.6 209.2000000000001C373.6 209.2000000000001 382.6 212.2000000000001 382.6 227.2000000000001C382.5 237.8000000000001 373 238.3000000000001 364.5 238.3000000000001zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM128.3 232.6C128.3 253.6 112.1 260.6 93.6 260.6H53.6C51.1 260.6 48.6 258.6 48.4 255.9L32 153.8C31.7 151.8 33.2 149.8 35.2 149.8H54.2C56.9 149.8 59.4 152.7 59.7 155.5L64.2 182.1C65.2 189.3 77.4 186.8 82.2 186.8C110.8 186.8 128.3 203.8 128.3 232.6zM212.5 223.8H193.5C189.7 223.8 189.5 218.3 189.3 215.6C183.5 224.1 175.1 225.6 165.6 225.6C141.1 225.6 122.4 204.1 122.4 180.4C122.4 160.9 134.6 148.2 154.1 148.2C163.1 148.2 174.3 153.1 180.6 160.1C180.1 158.6 179.6 155.4 179.6 153.9C179.6 151.6 180.6 149.9 182.8 149.9H200C202.7 149.9 205 152.8 205.5 155.6L215.7 219.9C216 221.8 214.5 223.8 212.5 223.8zM253 125.9L316.7 218.5C317.2 219 317.2 219.5 317.2 220.2C317.2 221.9 315.7 223.7 314 223.7H294.8C293.1 223.7 291.3 222.7 290.3 221.2L263.8 182.1999999999999L252.8 219.6999999999999C252 221.8999999999999 249.8 223.6999999999999 247.3 223.6999999999999H228.6C226.9000000000001 223.6999999999999 225.4000000000001 221.8999999999999 225.4000000000001 220.1999999999999C225.4000000000001 219 244.9000000000001 163.3999999999999 246.6 158.0999999999999C243.9000000000001 154.2999999999999 226.1 129.4999999999999 226.1 126.4999999999999C226.1 124.6999999999999 227.6 123.2999999999999 229.3 123.2999999999999H248.5C250.3 123.3999999999999 252 124.3999999999999 253 125.8999999999999zM412.3 232.6C412.3 253.6 396.1 260.6 377.6 260.6H337.9000000000001C335.2000000000001 260.6 332.7000000000001 258.6 332.4000000000001 255.9L316.2000000000001 153.9C316.0000000000001 151.9 317.5000000000001 149.9 319.4000000000001 149.9H339.9000000000001C341.9000000000001 149.9 343.4000000000001 151.4 343.9000000000001 153.1L348.4000000000001 182.1C349.4000000000001 189.3 361.6 186.8 366.4000000000001 186.8C394.8 186.8 412.3 203.8 412.3 232.6zM496.5 223.8H477.5C473.7 223.8 473.5 218.3 473.2 215.6C467.7 224.1 459.2 225.6 449.5 225.6C425 225.6 406.3 204.1 406.3 180.4C406.3 160.9 418.5 148.2 438 148.2C447.3 148.2 458.5 153.1 464.5 160.1C464.2 158.6 463.5 155.4 463.5 153.9C463.5 151.6 464.5 149.9 466.7 149.9H484C486.7 149.9 489 152.8 489.5 155.6L499.7 219.9C500 221.8 498.5 223.8 496.5 223.8zM544 257.1C544 259.1 542.5 260.6 540.8 260.6H522.3C520.8 260.6 519.3 259.4 519.0999999999999 257.9L502.8999999999999 153.9L502.5999999999999 153.4C502.5999999999999 151.6 504.0999999999999 149.9 506.0999999999999 149.9H522.5999999999999C525.0999999999999 149.9 527.5999999999999 152.8 527.8 155.6L544 256.8V257.1zM454 205.3C441.8 205.3 432.3 195.6 432.3 183.3C432.3 173.6 439.3 168.3 448.5 168.3C460.5 168.3 470.2 177.5 470.2 189.8C470.3 199.6 463.3 205.3 454 205.3z" /> + <glyph glyph-name="cc-stripe" + unicode="" + horiz-adv-x="576" d=" M396.9 191.5C396.9 172.4 388.1 158.1 375 158.1C366.7 158.1 361.7 161.1 358.2 164.8L358 217.6C361.7 221.7 366.8 224.6 375 224.6C387.9 224.7 396.9 210.1 396.9 191.5zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM122.2 166.9C122.2 209.2 67.9 201.6 67.9 217.6C67.9 223.1 72.5 225.3 80 225.3C90.8 225.3 104.5 222 115.3 216.2V249.6C103.5 254.3 91.8 256.1 80 256.1C51.2 256.1 32 241.1 32 215.9C32 176.6 86 183 86 166C86 159.4 80.3 157.3 72.4 157.3C60.6 157.3 45.5 162.2 33.5 168.6V134.7000000000001C46.7 129.0000000000001 60.1 126.6 72.3 126.6C101.9 126.8 122.2 141.3 122.2 166.9zM191.1 253.8H164.1V284.6L129.4 277.2L129.2000000000001 163.3C129.2000000000001 142.3 145.0000000000001 126.8 166.1000000000001 126.8C177.7000000000001 126.8 186.3000000000001 128.9 191.0000000000001 131.5V160.3999999999999C186.5000000000001 158.5999999999999 164.0000000000001 152.0999999999999 164.0000000000001 173V223.5H191.0000000000001V253.8zM264.9000000000001 253.8C260.2000000000001 255.5 243.6 258.6 235.3000000000001 243.3L233.1000000000001 253.8H202.4000000000001V129.3H237.9000000000001V213.7C246.3000000000001 224.7 260.5000000000001 222.6 265.0000000000001 221.1V253.8zM309.1 253.8H273.4000000000001V129.3H309.1V253.8zM309.1 301.1L273.4000000000001 293.5V264.6L309.1 272.2V301.1zM431.8 192.3C431.8 233.6 408.3 256.1 383.4000000000001 256.1C369.5000000000001 256.1 360.5000000000001 249.5 355.6 245L353.8 253.8H322.5V88L358 95.5L358.1 135.7C363.2000000000001 132 370.8 126.7 383.2000000000001 126.7C408.6 126.8 431.8000000000001 147.2 431.8000000000001 192.3zM544 191.1C544 227.5 526.4 256.2 492.7 256.2C458.9 256.2 438.4 227.5 438.4 191.3C438.4 148.5 462.6 126.8 497.2 126.8C514.2 126.8 526.9 130.6999999999999 536.6 136V164.6C526.9 159.7 515.8000000000001 156.7 501.7 156.7C487.9 156.7 475.7 161.6 474.1 178.2H543.6C543.7 180.2 544 187.6 544 191.1zM492.4 227.2C483.5 227.2 473.7 220.5 473.7 204.5H510.4C510.4 220.5 501.1 227.2 492.4 227.2z" /> + <glyph glyph-name="cc-visa" + unicode="" + horiz-adv-x="576" d=" M470.1 216.7S477.7 179.5 479.4 171.7H446C449.3 180.6 462 215.2 462 215.2C461.8 214.9 465.3 224.3 467.3 230.1L470.1 216.7zM576 368V16C576 -10.5 554.5 -32 528 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368zM152.5 116.8L215.7 272H173.2L133.9 166L129.6 187.5L115.6 258.9C113.3 268.8 106.2 271.6 97.4 272H32.7L32 268.9C47.8 264.9 61.9 259.1 74.2 251.8L110 116.8H152.5zM246.9 116.6L272.1 272H231.9000000000001L206.8000000000001 116.6H246.9000000000001zM386.8 167.4C387 185.1 376.2 198.6 353.1 209.7000000000001C339 216.8000000000001 330.4000000000001 221.6000000000001 330.4000000000001 228.9000000000001C330.6 235.5000000000001 337.7000000000001 242.3000000000001 353.5000000000001 242.3000000000001C366.6000000000001 242.6000000000001 376.2000000000001 239.5000000000001 383.4000000000001 236.4000000000001L387.0000000000001 234.7000000000001L392.5000000000001 268.3000000000001C384.6000000000001 271.4000000000001 372.0000000000001 274.9000000000001 356.5000000000001 274.9000000000001C316.8000000000001 274.9000000000001 288.9000000000001 253.7000000000001 288.7000000000001 223.5C288.4000000000001 201.2 308.7000000000001 188.8 323.9000000000001 181.3C339.4000000000001 173.7 344.7000000000001 168.7 344.7000000000001 162C344.5000000000001 151.6 332.1 146.8 320.6 146.8C304.6 146.8 296 149.3 282.9000000000001 155.1L277.6 157.6L272 122.7000000000001C281.4 118.4 298.8 114.6 316.8 114.4C359 114.3 386.5 135.2000000000001 386.8 167.4zM528 116.6L495.6 272H464.5C454.9 272 447.6 269.2 443.5 259.1L383.8 116.6H426S432.9 135.8 434.4 139.9H486C487.2 134.4 490.8 116.6 490.8 116.6H528z" /> + <glyph glyph-name="centercode" + unicode="" + horiz-adv-x="512" d=" M329.2 179.4C325.4 144.2 293.8 118.8 258.6 122.6C223.4 126.4 198 158 201.8 193.2C205.6 228.4 237.2 253.8 272.4 250C307.5 246.2 333 214.5999999999999 329.2 179.4zM243.4 -55.7C96.7 -48 -8.2 82.5 10.1 223.7C21.3 310.3 75.9 380.6 149.2 415.7C310.2 492.8 498.9 378.3 503.9 199.1C508 52.1 385.5 -63.1 243.4 -55.7zM423.3 124.3C451.1999999999999 242.3 262.8 330.2 186.1 358.5C128.6 302.2 117 169.9 152.3 14.1C221.1 -1.7 321.4 40.4999999999999 423.3 124.3z" /> + <glyph glyph-name="chrome" + unicode="" + horiz-adv-x="496" d=" M131.5 230.5L55.1 347.9C102.7 407.1 174.1 439.7 247.1 440C289.4 440.3 332.6 429.5 371.9 406.8C415.3 381.6 448.3 345.4 469.3 303.8L264 314.6C205.9 318 150.6 285.3 131.5 230.5zM164.4 192C164.4 145.8 201.8 108.4 248 108.4S331.6 145.8 331.6 192S294.2000000000001 275.6 248.0000000000001 275.6S164.4 238.3 164.4 192zM479.3 281.2L339.6 274C377.5 229.7 378.1 165.8 346.2000000000001 116.8L234.1 -55.6C280.6 -58.1 328.5 -47.9 371.9 -22.7C479.3 39.3 522.8 169.3 479.3 281.2zM133.7 144.4L40.4 327.9C14.9 288.9 0 242.1 0 192C0 68 90.8 -34.7 209.5 -52.9L273.2 71.9C215.6 61.1 160 92.7000000000001 133.7 144.4z" /> + <glyph glyph-name="cloudscale" + unicode="" + horiz-adv-x="448" d=" M318.1 294L308.7000000000001 286.4C286.2000000000001 305.7000000000001 257.2000000000001 320 225.4000000000001 320C153.8 320 96 259.2 96 187.7C96 181.1 96.4 174.6 97.4 168.3C95.4 224.3 139.2 265.7000000000001 190 265.7000000000001C214.2 265.7000000000001 236.2 256.3 252.6 241.0000000000001L227.4 220.6C219.1 221.5 210.6 218.8 204.3 212.5C193.2 201.5 193.2 183.6 204.3 172.5C215.4 161.5 233.2 161.5 244.3 172.5C250.6 178.8 253.3 187.4 252.4 195.6L327.6 284.4C333.9000000000001 290.9 324.3 300.3 318.1 294zM234.3 182.5C228.7 177 219.7 177 214.1 182.5C208.5 188.1 208.5 197.1 214.1 202.7S228.7 208.3 234.3 202.7S239.9 188 234.3 182.5zM224 416C100.5 416 0 315.5 0 192S100.5 -32 224 -32S448 68.5 448 192S347.5 416 224 416zM224 32C135.8 32 64 103.8 64 192S135.8 352 224 352S384 280.2 384 192S312.2 32 224 32z" /> + <glyph glyph-name="cloudsmith" + unicode="" + horiz-adv-x="332" d=" M332.5 28.1C332.5 -18.3 294.9 -56 248.5 -56S164.5 -18.3 164.5 28.1S202.1 112.1 248.5 112.1S332.5 74.5 332.5 28.1zM248.5 272C294.9 272 328.5 309.6 328.5 356S294.9 440 248.5 440S160.5 402.4000000000001 160.5 356S130.9 280 84.5 280S0.5 238.4000000000001 0.5 192S38.1 112 84.5 112S168.5 145.6 168.5 192S202.1 272 248.5 272z" /> + <glyph glyph-name="cloudversify" + unicode="" + horiz-adv-x="616" d=" M148.6 144C156.8 75.5 216 28.5 294.6 32.7C345.8 -10.6 431.4000000000001 -13.1 481 38.3C550.2 37.2 599.5 82.9 612.5 137.8C627.3 200.3 594.3 270.3 520.4 292.9C487.4 381 389 394.4 333.9 377.9C276.6 360.6 249.6 324.7 234.6 268.2C226.8 265.5 208.1 259.3 189.6 244.1C201.3 244.1 204.8 235.2 204.8 224.6V204.2C204.8 193.5 196.1 184.7 185.3 184.7H165.1C154.4 184.7 145.6 190.7 145.6 201.4V208H98.8C95 208 88 203.7 88 196.1V155.7C88 149.3 93.3 143.9 99.7 143.9H148.6zM376 136C365.3 89.7 397.7 63.6 431.3 49.2C324.1 15.4 259.7 100 296 160C262.8 138.4 262.3 88.8 266.8 67.1C248.9 79.5 213 99.5 209.4 146.9C206.4 186.8 230.9 222.6 266.4 240.8000000000001C297 256.6 369.9 249.3 400 200C385.9 248 346.2 270.1 298.2 274.8C329.1 305.5 362.6 325.1 412.4 318.5C482.2 309.2 545.5999999999999 235.7 480.1 168C515.0999999999999 184.3 528.8 222.4 527.5999999999999 244.9L538.0999999999999 225.3C549.8999999999999 203.3 553.3 177.7 547.4999999999999 153.3C538.2999999999998 114.3 506.8999999999999 84.5 467.7999999999999 76.8C435.6999999999999 70.5 384.7 81.9 375.9999999999999 136zM128 240H88.2C79.3 240 72 247.3 72 256.2V295.8C72 304.7 79.3 312 88.2 312H128C136.9 312 144.2 304.7 144.2 295.8V256.2C144.2 247.3 136.9 240 128 240zM10.1 280C4.5 280 0 284.5 0 290.1V317.9C0 323.5 4.5 328 10.1 328H37.8C43.3 328 47.9 323.5 47.9 317.9V290.1C47.9 284.5 43.4 280 37.8 280H10.1zM168 305.3V326.7000000000001C168 331.8 172.2 336 177.3 336H198.7C203.8 336 208 331.8 208 326.7000000000001V305.3C208 300.2000000000001 203.8000000000001 296 198.7 296H177.3C172.2 296 168 300.2 168 305.3zM56 212.5V187.5C56 181.2 50.9 176 44.6 176H19.4C13.1 176 8 181.2 8 187.5V212.5C8 218.8 13.1 224 19.4 224H44.5C50.9 224 56 218.8 56 212.5z" /> + <glyph glyph-name="codepen" + unicode="" + horiz-adv-x="512" d=" M502.285 288.296L268.2850000000001 444.296C260.298 449.211 251.7740000000001 449.256 243.7140000000001 444.296L9.714 288.296C3.714 284.2970000000001 0 277.153 0 270.011V114.012C0 106.869 3.714 99.726 9.715 95.726L243.715 -60.296C251.702 -65.211 260.226 -65.256 268.286 -60.296L502.286 95.726C508.286 99.725 512.001 106.869 512.001 114.012V270.011C512 277.153 508.286 284.2970000000001 502.285 288.296zM278 384.8690000000001L450.286 270.011L373.429 218.582L278 282.2970000000001V384.8690000000001zM234 384.8690000000001V282.2970000000001L138.571 218.582L61.714 270.011L234 384.8690000000001zM44 228.868L99.143 192.011L44 155.154V228.868zM234 -0.847L61.714 114.011L138.571 165.4400000000001L234 101.725V-0.847zM256 140.011L178.285 192.011L256 244.011L333.7150000000001 192.011L256 140.011zM278 -0.847V101.725L373.429 165.4400000000001L450.286 114.0110000000001L278 -0.847zM468 155.154L412.857 192.011L468 228.868V155.154z" /> + <glyph glyph-name="codiepie" + unicode="" + horiz-adv-x="472" d=" M422.5 245.1C453.2 245.1 456 192 422.2 192H411.4V147.7H384.8V245.1H422.5zM472 95.4C429.9 3.5 350.4 -56 248 -56C111 -56 0 55 0 192S111 440 248 440C345.4 440 420.8 386.3 466.2 301.6L280.2 192.8L472 95.4zM433.5 82.9L373.2 113.6C346.1 69.3 302.8 42.1999999999999 250.8 42.1999999999999C168.3 42.1999999999999 101.6 108.8999999999999 101.6 191.0999999999999C101.6 273.5999999999999 168.3 340.2999999999999 250.8 340.2999999999999C299.2 340.2999999999999 339.7 316.7999999999999 367.7 276.8999999999999L427.2 311.4999999999999C386.5 374.0999999999999 322.5 411.4999999999999 248 411.4999999999999C126.8 411.4999999999999 28.5 313.1999999999999 28.5 191.9999999999999S126.8 -27.5 248 -27.5C326.6 -27.5 394.5 14.6 433.5 82.9z" /> + <glyph glyph-name="connectdevelop" + unicode="" + horiz-adv-x="576" d=" M550.5 207L500.411 293.786C501.482 295.928 502.286 298.339 502.286 301.0180000000001C502.286 309.054 495.59 315.751 487.554 316.019L432.107 411.9120000000001C432.643 413.519 433.178 415.126 433.178 416.733C433.178 425.304 426.214 432.001 417.91 432.001C413.089 432.001 409.071 429.858 406.124 426.376H299.518C296.839 429.857 292.8210000000001 432 288 432S279.161 429.857 276.482 426.375H170.411C167.464 429.857 163.447 432 158.625 432C150.322 432 143.357 425.304 143.357 416.732C143.357 415.125 143.893 413.25 144.429 411.911L88.446 314.678C83.09 312.2680000000001 79.339 307.178 79.339 301.017C79.339 300.482 79.607 299.9460000000001 79.607 299.41L26.303 207.267C19.071 205.928 13.713 199.767 13.713 192.267C13.713 185.035 18.802 178.874 25.767 177.267L80.946 81.909C80.41 80.302 80.142 78.963 80.142 77.088C80.142 69.8559999999999 85.231 63.6949999999999 92.196 62.356L143.893 -27.376C143.357 -28.983 142.822 -30.858 142.822 -32.733C142.822 -41.304 149.786 -48.001 158.09 -48.001C162.911 -48.001 166.929 -45.858 169.608 -42.6439999999999H276.483C279.161 -45.857 283.447 -48 288 -48S296.839 -45.857 299.5180000000001 -42.643H406.6610000000001C409.3390000000001 -45.589 413.3570000000001 -47.464 417.6430000000001 -47.464C426.2140000000001 -47.464 432.9110000000001 -40.5 432.9110000000001 -32.196C432.9110000000001 -30.589 432.6440000000001 -29.25 432.1080000000001 -27.911L483.8050000000001 62.357C490.7690000000001 63.696 495.859 69.857 495.859 77.0889999999999C495.859 78.696 495.5910000000001 80.3029999999999 495.0550000000001 81.91L549.9660000000001 177.268C556.9300000000002 178.607 562.2880000000001 184.768 562.2880000000001 192.268C562.2860000000002 199.5 557.1960000000001 205.661 550.5000000000001 207zM153.535 -2.732L109.875 73.071H153.535V-2.732zM153.535 81.107H109.875C109.607 82.178 109.071 83.249 108.536 84.321L153.535 131.731V81.107zM153.535 143.518L103.178 90.2139999999999C101.839 90.7499999999999 100.499 91.5539999999999 99.16 91.821L43.447 188.25C43.982 189.589 43.982 190.929 43.982 192.268S43.982 194.678 43.714 195.75L95.679 285.75C98.358 286.0180000000001 101.036 286.822 103.447 288.429L153.536 236.464V143.518zM153.535 245.84L107.732 293.25C109.071 295.393 109.875 298.071 109.875 301.017C109.875 301.285 109.607 301.821 109.607 302.089L153.535 317.893V245.84zM153.535 326.465L109.875 310.661L153.535 386.197V326.465zM480.054 287.357L480.8579999999999 286.018L445.5 118.875L381.75 186.107L479.786 287.625L480.054 287.357zM291.75 92.893L303.2680000000001 81.107H280.5L291.75 92.893zM291.4820000000001 104.143L208.179 189.589L287.7320000000001 273.964L370.7680000000001 186.375L291.4820000000001 104.1429999999999zM296.8390000000001 98.25L376.1250000000001 180.482L443.6250000000001 109.232L437.7330000000001 81.107H313.714L296.839 98.25zM410.411 403.607C411.4820000000001 403.0710000000001 412.553 402.535 413.8930000000001 402.267L471.75 301.553V301.017C471.75 298.0710000000001 472.553 295.3930000000001 473.893 293.25L376.393 192L293.358 279.589L410.411 403.607zM401.304 405.75L287.7320000000001 285.482L230.6780000000001 345.75L397.0170000000001 405.75H401.3040000000001zM277.821 405.75C280.499 403.072 283.981 401.4650000000001 288 401.4650000000001S295.5 403.072 298.1789999999999 405.75H373.1789999999999L224.786 352.179L173.893 405.75H277.8210000000001zM161.572 400.125L162.643 402.267A33.834 33.834 0 0 1 165.322 403.0710000000001L216.483 349.231L161.572 329.41V400.125zM161.572 320.839L222.375 342.803L282.107 279.589L202.554 195.482L161.572 237.535V320.839zM161.572 228.161L198 190.393L161.572 152.089V228.161zM161.572 140.303L203.625 184.767L286.393 98.785L269.25 81.107H161.572V140.303zM168.536 -21.75C166.929 -20.143 165.054 -19.072 162.643 -18.268L161.572 -16.6609999999999V73.071H261.482L169.875 -21.75H168.536zM298.447 -21.75C295.7680000000001 -19.34 292.019 -17.465 288 -17.465S280.233 -19.34 277.553 -21.75H181.124L272.731 73.071H311.035L402.642 -21.75H298.447zM418.447 -9.964L414.161 -17.464C412.822 -17.732 411.751 -18.267 410.679 -18.803L321.483 73.072H435.8589999999999L418.447 -9.964zM431.303 12.268L444.161 73.071H466.125L431.303 12.268zM466.125 81.107H445.7680000000001L450.3210000000001 102.2670000000001L467.4640000000001 84.0530000000001C466.929 83.2500000000001 466.393 82.179 466.1250000000001 81.107zM532.2860000000001 188.518L476.8390000000001 91.821C475.5000000000001 91.286 474.1600000000001 90.75 472.8210000000001 89.947L452.1960000000001 111.911L486.7500000000001 275.839L532.5530000000001 196.553C532.2860000000001 195.214 531.7500000000001 193.875 531.7500000000001 192.268C531.7500000000001 190.929 532.0180000000001 189.857 532.2860000000001 188.518z" /> + <glyph glyph-name="contao" + unicode="" + horiz-adv-x="512" d=" M45.4 143C59.8 75.9 71.8 14 113.6 -32H34C15.3 -32 0 -16.8 0 2V382C0 400.7 15.2 416 34 416H91.7C77.9 403.4 65.6 388.8 54.8 372.4C9.4 302.4 27.8 225.6 45.4 143zM478 416H387.8C409.2 394.6 427 366.5 440.5 331.9L303.4 302.6C288.5 331.6 265.6 355.9 220.8 346.5C196.2 341.2 179.8 327.2 172.5 311.9C163.7 293.2000000000001 159.3 272.1 180.7 171.6C201.8 71.4 214.4 53.9 230.2 40.4C243.1 29.3 263.6 23.4 288.5 28.7C333 38.1 344.2 69.4 345.9 101.9L483.3 131.5000000000001C486.4999999999999 60.0000000000001 464.6 6.3000000000001 425.9 -32.0999999999999H478C496.7 -32.0999999999999 512 -16.8999999999999 512 1.9000000000001V382C512 400.8 496.8 416 478 416z" /> + <glyph glyph-name="cpanel" + unicode="" + horiz-adv-x="640" d=" M52.9 234.3H92.9L86.7 210.7C84.8 204.2 79.3 199.8 72.4 199.8H53.8C28.9 199.8 29.1 162.4 53.8 162.4H65.1C69.3 162.4 72.7 158.5000000000001 71.5 154.1L64.4 128H52C18.5 128 -7 159.4 1.7 193.2C9 220.2 30 234.3 52.9 234.3M73.1 128L108 258.1C109.8 264.5 115.2 269 122.3 269H159.3C183.4 269 204.7 252.6 210.3 227.8C216.9 198.7 195.8 162.5 158.6 162.5H126.6L133 186.3C134.8000000000001 192.5 140.3000000000001 197.1 147.3000000000001 197.1H157.6000000000001C170.0000000000001 197.1 178.4000000000001 208.8 175.9000000000001 219.7C173.8000000000001 228.9 166.0000000000001 234.5000000000001 157.6000000000001 234.5000000000001H137.8000000000001L112 138.8C110.1 132.6 104.6 128.1 97.8 128.1L73.1 128M293.7 197.4C294 198.4 295.6 202.7 291.6 202.7H234.1C224.4 202.7 217.5 211.6 219.9 221.2L223.4 234.6H301.3C320.1 234.6 334.6 217 329.8 197.8L315.8 146C313 135.4 303.6 128.2 292.4 128.2L234.9 128.4C192 128.4 196.4 192.2 235.6 192.2H284L280.5 179C278.6 172.8 273.1 168.2 266.3 168.2H244.7C239.4 168.2 239.4 160.3 244.7 160.3H279.6C284.2000000000001 160.3 284.7000000000001 164.2 285.1 165.6L293.7000000000001 197.4M396.8000000000001 234.3000000000001C431.2000000000001 234.3000000000001 456.1000000000001 202.0000000000001 447.1000000000001 168.9L438.3000000000001 135.8C437.1000000000001 130.9 432.6000000000001 128 428.0000000000001 128H408.9000000000001C404.4000000000001 128 401.3 132 402.5000000000001 136.3L413.1000000000001 176.3C416.4000000000001 187.9 407.5000000000001 199.7 395.0000000000001 199.7H375.2000000000001L358.0000000000001 135.7000000000001C356.8000000000001 130.9 352.4000000000001 127.9 347.6000000000001 127.9H328.7000000000001C324.5000000000001 127.9 321.1000000000001 131.8 322.3000000000002 136.2000000000001L348.5000000000001 234.2000000000001H396.8000000000002M498 196.4L490 166.4C489.1 163.1 491.5 159.7 495.1 159.7H568.4L562.6999999999999 138.7C560.8 132.5 555.3 128 548.4999999999999 128H481.7999999999999C461.7999999999999 128 448.4999999999999 147 453.4999999999999 164.7L464.2999999999999 204.7C469.0999999999999 222.3 484.9999999999999 234.3 502.8999999999999 234.3H550.1999999999999C569.1999999999999 234.3 583.4 216.6 578.4999999999999 197.5L575.2999999999998 185.5C572.3999999999999 174.5 562.5999999999998 167.9 552.0999999999998 167.9H498.6999999999998L502.1999999999998 180.9C503.7999999999998 187.1 509.3999999999998 191.7 516.3999999999999 191.7H538C540 191.7 541.3 192.7 541.9 194.7L542.6 197.3C543.3000000000001 200 541.3000000000001 202.4 538.7 202.4H505.8000000000001C501.7 202.4 498.9000000000001 200.3 498.0000000000001 196.4zM568.2 128L603.8000000000001 261.1C605.0000000000001 265.8 609.3000000000001 269 614.2 269H633.1C637.6 269 640.8000000000001 265 639.6 260.7L613.1 162.5C608 141.8 588.9 128 568.2 128" /> + <glyph glyph-name="creative-commons" + unicode="" + horiz-adv-x="512" d=" M255.547 440C392.884 440 504 333.5610000000001 504 191.996C504 42.021 381.106 -56 255.562 -56C122.319 -56 8 53.443 8 191.996C8 323.175 113.486 440 255.547 440zM256.446 395.266C136.105 395.266 52.719 294.698 52.719 191.988C52.719 85.473 141.703 -10.406 256.446 -10.406C357.974 -10.406 459.2669999999999 69.036 459.2669999999999 191.981C459.266 306.754 367.4939999999999 395.266 256.4459999999999 395.266zM253.338 233.173L220.113 215.898C214.718 227.101 204.863 235.824 192.654 235.824C170.52 235.824 159.437 221.215 159.437 191.982C159.437 168.14 168.883 148.14 192.654 148.14C207.1229999999999 148.14 217.3069999999999 155.231 223.22 169.399L253.771 153.899C240.958 130 216.8839999999999 114.924 188.6699999999999 114.924C145.5079999999999 114.924 114.7109999999999 142.196 114.7109999999999 191.976C114.7109999999999 241.517 147.4169999999999 269.035 187.3449999999999 269.035C218.0589999999999 269.048 240.0459999999999 257.089 253.3379999999999 233.173zM396.382 233.173L363.607 215.898C358.09 227.38 348.283 235.824 335.707 235.824C313.565 235.824 302.482 221.215 302.482 191.982C302.482 168.076 311.984 148.14 335.707 148.14C350.161 148.14 360.352 155.231 366.25 169.399L397.25 153.899C383.887 130.03 359.799 114.924 332.164 114.924C288.725 114.924 258.205 141.912 258.205 191.976C258.205 241.499 290.903 269.035 330.831 269.035C361.5370000000001 269.048 383.4000000000001 257.089 396.382 233.173z" /> + <glyph glyph-name="css3-alt" + unicode="" + horiz-adv-x="384" d=" M0 416L34.9 20.2L192 -32L349.1 20.2L384 416H0zM313.1 336L308.3 288.7L193 239.4L192.7 239.3H304.2L291.4 92.7000000000001L193.2 64.0000000000001L94.4 93.2000000000001L88 167.1H136.9L140.1 128.8L192.7 115.5L247.4 130.9L251.1 192.5L84.8 193V193.1L84.6 193L81 239.3L193.1 286L199.6 288.7H76.7L70.9 336H313.1z" /> + <glyph glyph-name="css3" + unicode="" + horiz-adv-x="512" d=" M480 416L416 48L192.7 -32L0 48L19.6 142.8H101.6L93.6 102.2L210 57.8L344.1 102.2L362.9000000000001 199.3H29.5L45.5 281.3H379.2L389.7 334H56.3L72.6 416H480z" /> + <glyph glyph-name="cuttlefish" + unicode="" + horiz-adv-x="440" d=" M344 142.5C326.5 110.9 286.6 88 248 88C191.4 88 144 135.4 144 192S191.4 296 248 296C286.6 296 326.5 273.1 344 241.5C357.7 292.4 385.7 334.8 431 359.3C385.7 408.9 320.5 440 248 440C111 440 0 329 0 192S111 -56 248 -56C320.5 -56 385.7 -24.9 431 24.7C385.7 49.2 357.7 91.6 344 142.5z" /> + <glyph glyph-name="d-and-d" + unicode="" + horiz-adv-x="576" d=" M82.5 349.1C81.9 366.3 84.5 382.9 95.2 397.3C95.5 389.9 96.4 382.8 99.4 375.7C105.3 403.2 119.1 425 141.7 441.2C139.8 435.3 138.2 429.4 138.7 423.5C147.4 430.9 157.5 441.3 183.1 446.2C197.8 449 212.8 448.2 225.2 445.2C263.7 435.9 286.2 410.9 294.9 372.9C300.2 349.8 295.6 327.9 286.6 306.5C281.4 294.1 274.6 282.1 265.9 271.4C263.9 273.3 262 275.2000000000001 260.1 277C217.3 317.8 233.3 302.2 222.7 314.4C221.6 315.6 221.7 316.6 222.6 318C230.9 331.5 234.4 346.2 232.6 362C231.5 371.8 228.3 380.9 221.3 388.2C206.8 403.5 182.1 403.2 167.8 387.6C156.4 375.1 153.7 360.2 156.9 344C157.0999999999999 342.7 157.3 341.3 156.9 340.1C153.5 326.4 152.3 312.5 154.4 298.5C154.5 298 154.5 297.4 154.5 296.9C154.5 296.6 154.4 296.4 154.3 295.8C132.5 306.8 118.3 324.1 111.1 348C102.8 330.2000000000001 100 312.5 104.5 293.9C88.9 309.1 83.2 328.2 82.5 349.1zM552.1 225.9C540.5 237.5 527.1 246.3 512 252.5C499.2 257.7 486 260.4 472.1 259.6C462.1 259 452.5 256.5 443.1 253.2C440.6 252.3 438 251.6 435.4000000000001 251C430.5000000000001 249.8 428.1 254.1 430.7000000000001 257.8C433.9000000000001 262.4 434.1 262 445.7000000000001 269.8C446.3000000000001 270.2 446.9000000000001 270.6 447.9000000000001 271.3H445.4000000000001C444.8 271.3 444.2000000000001 271.1 443.5000000000001 271C424.2000000000001 267.7 412.8000000000001 255.5 394.6000000000001 241.4C384.2000000000001 233.3 380.8000000000001 237.6 382.6000000000001 241.9C384.0000000000001 245.4 385.9000000000001 248.6 387.7000000000001 251.9C388.7000000000001 253.7 390.0000000000001 255.3 391.2000000000001 257C391.0000000000001 257.2 390.7000000000001 257.3 390.5000000000001 257.5C363.5000000000001 239.2 343.8000000000002 215.1 332.8000000000002 184.2C333.1000000000002 183.9 333.5000000000001 183.6 333.8000000000002 183.3C334.1000000000002 183.9 334.3000000000002 184.5 334.7000000000001 185C345.1000000000001 197.1 357.5000000000001 206.8 371.3000000000002 214.8C389.5000000000001 225.4 408.8000000000002 233.1 430.0000000000001 235C434.3000000000002 235.4 438.7000000000001 235.1 443.1000000000002 235.1C441.3000000000002 234.4 439.6000000000002 234.2 437.8000000000002 234C419.3000000000002 231.6 402.3000000000002 225 386.3000000000002 215.5C356.1000000000002 197.6 331.8000000000002 173.3 311.2000000000002 145.1C310.9000000000002 144.7000000000001 310.8000000000002 144.2000000000001 310.5000000000002 143.8C325.0000000000002 138.5 334.5000000000002 126.5 346.6000000000002 118.2C346.8000000000002 118.3 346.9000000000002 118.4 347.0000000000002 118.6L348.2000000000002 121.3C360.4000000000002 148.1999999999999 375.2000000000002 173.6 394.9000000000002 195.8C411.6000000000002 214.6 432.9000000000002 221.1 457.4000000000001 215.8C463.3000000000001 214.5 468.8000000000001 211.4 474.6000000000001 209C476.9000000000001 210.4 479.7000000000002 212.1999999999999 482.6000000000001 213.6999999999999C491.0000000000001 218 500.0000000000001 220.6999999999999 509.3000000000001 222.6999999999999C524.0000000000001 225.8 538.8000000000002 227.6 553.8000000000002 224V224.5C553.3000000000002 224.9 552.6000000000001 225.3 552.1000000000001 225.9zM316.7 50.4C277.3 83.4 293.9 69.9 274 86C273.2 85.1 274 86.2 272.1 83C260.9000000000001 63.9 246.6 47.7 228.1 35.4C217.8 28.6 206.6 23.6 194 23.6C172.4 23.6 155.8 33.1 144.6 51.4C132.6 70.9 131.3 92.1 136.4 114C144.2000000000001 147.8 166.5 169.2 175 178.3C156.3000000000001 184.5 142 176.6 128.6 164.4C129.4 178.3 132.9 190.6 140.4 201.7000000000001C116.1 191.1 94.5 176.7000000000001 75.6 157.8000000000001C75.3 163.6000000000001 81 201.5000000000001 81.2 202.5000000000001C81.5 205.2000000000001 80.6 207.8000000000001 78.2 209.9000000000001C54 185.2000000000001 33.7 158.1000000000001 22.1 125.3000000000001C29.5 131.2000000000001 37 136.7000000000001 45.7 141.5000000000001C37.4 119.2000000000001 26.1 88.7000000000001 37.9 40.4000000000001C42.5 21.4000000000001 49.8 3.6000000000001 62 -11.8999999999999C64.9 -15.5999999999999 68.3 -18.7999999999999 71.5 -22.1999999999999C71.7 -21.9999999999999 71.9 -21.8999999999999 72.1 -21.6999999999999C70.7 -14.6999999999999 69.9 -7.5999999999999 70.6 0.2C72.8 -2.9999999999999 74.5 -5.8 76.5 -8.4C89.1 -24.4 105.2 -35.8 123.7 -44C148.7000000000001 -55.3 174.8000000000001 -57.3 201.6 -52.6C256.5 -42.9 292.3 -4 317.6 46.2C318.6 48 318.2000000000001 49.1 316.7000000000001 50.4zM488.7 96.8C479.2 99.9 466.5 100.9999999999999 460 99.6999999999999C469.9 95.6999999999999 474.1 93.0999999999999 478.8 87.6999999999999C491.4 73.3 489.2 52.9999999999999 473.4 42.0999999999999C461.7 33.9999999999999 448.5000000000001 31.5999999999999 434.5000000000001 32.9999999999999C433.3000000000001 33.0999999999999 432.2000000000001 33.3999999999999 431.5000000000001 33.5999999999999C434.3000000000001 37.2999999999999 437.5000000000001 40.5999999999999 439.6000000000001 44.3999999999999C449.0000000000001 61.1999999999999 445.0000000000001 86.4999999999999 430.9000000000001 100.4999999999999C428.8000000000001 102.6 426.3000000000001 104.3999999999999 423.9000000000001 106.3999999999999C423.6000000000001 105.0999999999999 423.8000000000001 104.2999999999999 424.0000000000001 103.5999999999999C428.2000000000001 86.9999999999999 415.9000000000001 71.1999999999999 399.2000000000001 71.7999999999999C391.6000000000001 72.0999999999999 385.3000000000002 75.5999999999999 379.6000000000001 80.2999999999999C360.1000000000001 96.3999999999999 340.5000000000001 112.3999999999999 321.1000000000001 128.5999999999999C315.2000000000001 133.4999999999999 308.6000000000001 136.6999999999999 301.0000000000001 137.2999999999999C296.4000000000001 137.6999999999999 291.7000000000001 137.8999999999999 287.1000000000001 138.1999999999999C281.2000000000001 138.5999999999999 278.3000000000001 140.9999999999999 276.7000000000001 146.5999999999999C275.8000000000002 149.9999999999998 275.2000000000001 153.3999999999999 274.5000000000001 156.7999999999999C273.0000000000001 164.8999999999999 268.3000000000002 169.7999999999999 260.2000000000001 170.9999999999998C255.8000000000001 171.6999999999998 251.3000000000001 171.9999999999998 246.9000000000001 172.4999999999998C233.9000000000001 173.8999999999998 227.1000000000001 179.8999999999998 224.3000000000001 192.7999999999999C219.3000000000001 181.7999999999999 222.7000000000001 170.3999999999999 231.6000000000001 162.8999999999999C236.1000000000001 159.0999999999999 240.9000000000001 155.5999999999999 245.4000000000001 151.6999999999999C250.0000000000001 147.8999999999999 252.8000000000002 142.9999999999999 253.3000000000002 136.8999999999999C253.7000000000002 132.1999999999999 254.1000000000002 127.3999999999999 255.1000000000002 122.7999999999999C257.3000000000002 112.1999999999998 264.0000000000001 104.3999999999999 272.1000000000002 97.6999999999998C288.6000000000002 83.9999999999998 305.1000000000002 70.3999999999998 321.6000000000002 56.5999999999998C339.5000000000001 41.5999999999998 335.5000000000001 23.7999999999998 334.6000000000002 0.5999999999998C333.7000000000002 -22.3000000000002 346.8000000000002 -42.3000000000002 368.1000000000002 -50.6000000000002C369.1000000000002 -51.0000000000002 370.1000000000002 -51.2000000000002 371.7000000000002 -51.7000000000002C356.0000000000002 -33.5000000000002 361.6000000000002 -7.6000000000002 372.4000000000002 0.5999999999998C372.7000000000002 -1.6000000000002 372.8000000000002 -3.7000000000002 373.3000000000002 -5.8000000000002C382.7000000000001 -49.9000000000002 418.7000000000001 -70.0000000000002 458.3000000000001 -62.7000000000002C474.3000000000001 -59.8000000000002 488.9000000000001 -53.8000000000002 501.2000000000001 -42.9000000000001C503.2000000000001 -41.1000000000001 504.9000000000001 -38.8000000000001 507.1000000000001 -36.4000000000001C487.8000000000001 -41.0000000000002 471.3000000000001 -36.5000000000002 456.2000000000001 -25.8000000000001C456.9000000000001 -25.5000000000001 457.5000000000001 -25.5000000000001 458.1000000000001 -25.5000000000001C479.4000000000001 -27.3000000000001 498.7000000000001 -22.1000000000001 515.1000000000001 -8.1000000000001C534.6000000000001 8.4999999999999 541.7000000000002 34.7999999999998 532.5000000000001 57.8999999999999C524.2000000000002 77.9999999999999 508.9000000000001 90.1999999999999 488.7000000000001 96.7999999999998zM99.4 268.7C94.1 277.9 86.2 284.3 77.3 290C91 290.5 103.9 289.8 116.9 286.3C109.9 298.5 108.4 311 111.9 325C117.2 313.1 125.6 304.9 135.5 298.2000000000001C155.2 285 171.2 278.6 182.2 268C185.6 264.7000000000001 188.5 260.9000000000001 191.8 257.1C191 259.2000000000001 190.4 261.2000000000001 189.6 263.1C184.6 273.7000000000001 176.6 281.7000000000001 167 288.1C165.2 289.3 164.2 290.6 163.6 292.6C160.3 305.1 160.6 317.7000000000001 162.9 330.2000000000001C163.9 335.7000000000001 165.7 341.1 167.4 346.5C168.2 348.9000000000001 169.7 351.1 171.4 353.1C172 346.2 171.4 327.6 191 307.1C201.8 295.8 213.4 285.2000000000001 224.9 274.4000000000001C233.9 265.9000000000001 243.2 257.7000000000001 250.4 247.6C251.5 246.0000000000001 252.6 244.3 254.2 242.9000000000001C249.2 255.9000000000001 240.0000000000001 267 230.0000000000001 276.7000000000001C220.4 286.0000000000001 210.6 295.1 200.8000000000001 304.1C197.5 307.1 196.2000000000001 310.8000000000001 195.7000000000001 315.0000000000001C194.5000000000001 325.4000000000001 195.7000000000001 335.6 200.0000000000001 345.2000000000001C200.5000000000001 346.2000000000001 201.1000000000001 347.2000000000001 201.9000000000001 348.5000000000001C202.4000000000001 344.3000000000001 202.5000000000001 340.6 203.3000000000001 336.9000000000001C208.1000000000001 313.8000000000001 223.7000000000001 300.6000000000001 252.6000000000001 273.4000000000001C262.6000000000001 264.0000000000001 271.9000000000001 254.2000000000001 278.2000000000001 241.8000000000001C283.0000000000001 232.5000000000001 285.5000000000001 222.8000000000001 283.9000000000001 212.2000000000001C283.8000000000001 211.6000000000001 284.4000000000001 210.5000000000001 285.0000000000001 210.2000000000001C291.2000000000001 207.6000000000001 295.0000000000001 203.3000000000001 294.7000000000001 195.9000000000001C302.4000000000001 198.5000000000001 307.2000000000001 203.9000000000001 311.1000000000001 210.4000000000001C315.3000000000001 190.2000000000001 302.0000000000001 160.1000000000001 283.9000000000001 151.7000000000001C284.3000000000001 156.2000000000001 288.9000000000001 175.1 267.4000000000001 179.4C260.6000000000001 180.7000000000001 254.6000000000001 180.7000000000001 244.5000000000001 181.5000000000001C249.2000000000001 190.5000000000001 254.9000000000001 202.1000000000001 245.0000000000001 203.9000000000001C220.1000000000001 208.5000000000001 192.2000000000001 202.0000000000001 187.2000000000001 199.3000000000001C195.4000000000001 198.9000000000001 203.5000000000001 198.3000000000001 210.7000000000001 196.0000000000001C208.7000000000001 189.5000000000001 206.7000000000001 183.3000000000001 204.9000000000001 177.1000000000001C203.0000000000001 170.6000000000001 207.0000000000001 162.5000000000001 214.2000000000001 167.5000000000001C215.4000000000001 168.4 216.5000000000001 169.4 217.5000000000001 170.2000000000001C214.4000000000001 152.3000000000001 214.6000000000001 154.3000000000001 214.7000000000001 151.9C215.0000000000001 141.7000000000001 224.2000000000001 144.1 230.4000000000001 144.6C227.9000000000001 132.8 200.9000000000001 117.3 185.0000000000001 118.8C192.0000000000001 123.5 197.7000000000001 129.1 200.9000000000001 136.7C194.4000000000001 135.9 188.0000000000001 135.1 181.7000000000001 134.3L181.4000000000001 135.2C186.1000000000001 138.6 189.4000000000001 143 191.6000000000001 148.3C200.3000000000001 169.4 188.0000000000001 186.3 166.6000000000001 188.2C157.5000000000001 189 148.8000000000001 187.4 140.7000000000001 182.7C146.9000000000001 198.3 157.9000000000001 209.3 173.3000000000001 217.2C158.1000000000001 221.5 164.4000000000001 219.9 148.7000000000001 223.5C163.3000000000001 232.8 178.9000000000001 236.7 195.2000000000001 238.1C190.0000000000001 241.3 147.1000000000001 241.7 125.0000000000001 217.2C132.9000000000001 215.8 140.5000000000001 214.4 148.2000000000001 213C124.4000000000001 206 104.2000000000001 193.3 85.8000000000001 177.4C86.9000000000001 182.2 88.5000000000001 186.9 89.1000000000001 191.7C89.7000000000001 196.2 89.9000000000001 200.9 89.2000000000001 205.3C87.7000000000001 214.7 80.3000000000001 220.4 69.5000000000001 221.6C61.6000000000001 222.5 53.9000000000001 221.5 46.2000000000001 220.3C45.3000000000001 220.2 44.5000000000001 220 43.3000000000001 220.3C59.1000000000001 235.1 79.3000000000001 242 96.4000000000001 253.8C102.4000000000001 258.3 103.2000000000001 262 99.4000000000001 268.7zM227.8 241.9C231.1 225.9 240.4 216.4 251.6 217.6C247.0000000000001 228.9 239.5000000000001 237.1 227.8 241.9z" /> + <glyph glyph-name="dashcube" + unicode="" + horiz-adv-x="448" d=" M326.6 344H110.4C59.3 344 19.2 300.7 19.2 250.5V21C19.2 -29.5 59.3 -64 110.4 -64H337.6C388.7000000000001 -64 428.8 -29.5 428.8 21V448L326.6 344zM153.9 31.5C136.2 31.5 121.5 46.6 121.5 64.3V207.2C121.5 224.9 136.2 239.7 153.9 239.7H294.6C312.3 239.7 326.6 224.9 326.6 207.2V83.7L377.7000000000001 31.4H153.9z" /> + <glyph glyph-name="delicious" + unicode="" + horiz-adv-x="448" d=" M446.5 380C446.1 381.5 445.6 383 445.1 384.5C444.2000000000001 387 443.1 389.3 441.8 391.6C440.4000000000001 394 438.8 396.4 437.1 398.5C435 401 432.7000000000001 403.3 430.2000000000001 405.3C429.1 406.2 428.0000000000001 407 426.9000000000001 407.8C425.6 408.7 424.3 409.5 422.9000000000001 410.2C421.1 411.2 419.3 412 417.4000000000001 412.7C415.7000000000001 413.4 413.9000000000001 414 412.0000000000001 414.4C408.2000000000001 415.4 404.1000000000001 415.9 400.0000000000001 415.9H48C21.5 416 0 394.5 0 368V16C0 11.9 0.5 7.8 1.5 4C3.5 -3.7 7.3 -10.6 12.5 -16.3C13.5 -17.4 14.6 -18.5 15.8 -19.6C21.5 -24.8 28.4 -28.6 36.1 -30.6C39.9 -31.6 44 -32.1 48.1 -32.1H400.1C426.6 -32.1 448.1 -10.6 448.1 15.9V368C448 372.1 447.5 376.2 446.5 380zM416 16C416 7.2 408.8 0 400 0H224V192H32V368C32 376.8 39.2 384 48 384H224V192H416V16z" /> + <glyph glyph-name="deploydog" + unicode="" + horiz-adv-x="512" d=" M382.2 312H433.9V72.4H382.2V93.1C362.4 68.3 329.4 68.9999999999999 308.4 78.4C282.2 90.1 264.1 116.5 264.1 150.2C264.1 180 278.9 208.1 307.4 221C327.6 230.1 360.1 231.6 382.2 208.1V312zM317.5 150.2C317.5 132 331.1 116.7 350.7 116.7C370.5 116.7 383.9 133.1 383.9 149.6C383.9 166.7 370.2 182.8 350.7 182.8C331.1 182.8 317.5 166.4 317.5 150.1999999999999zM188.5 312H240.2V72.4H188.5V93.1C168.7 68.3 135.7 68.9999999999999 114.7 78.4C88.5 90.1 70.4 116.5 70.4 150.2C70.4 180 85.2 208.1 113.7 221C133.9 230.1 166.4 231.6 188.5 208.1V312zM123.8 150.2C123.8 132 137.4 116.7 157 116.7C176.8 116.7 190.2 133.1 190.2 149.6C190.2 166.7 176.5 182.8 157 182.8C137.3 182.8 123.8 166.4 123.8 150.1999999999999zM448 352C465.5 352 480 337.6 480 320V64C480 46.5 465.6 32 448 32H64C46.5 32 32 46.4 32 64V320C32 337.5 46.4 352 64 352H448M448 384H64C28.8 384 0 355.2 0 320V64C0 28.8 28.8 0 64 0H448C483.2 0 512 28.8 512 64V320C512 355.2 483.2 384 448 384z" /> + <glyph glyph-name="deskpro" + unicode="" + horiz-adv-x="480" d=" M205.9 -64L237 -25.6C249.3 -25.4 262.6 -24.2 273.5 -19C312.4 -0.4 311.9 42.9 311.8 44.8C311.7 49.8 311 49.2 282.9000000000001 82.2H362C361.8 32.1 354.7 13.7 351.8 6.5C342.4000000000001 -17.2 307.9000000000001 -56.3 256.6 -62.9C247.9000000000001 -64 223.8 -64.1 205.9 -64zM406.3 103.7C444.9000000000001 103.7 464.8 117.3 480 134.6L304.5 134.9L287.1 103.6L406.3 103.7zM362.7 327.6V159.3H289.2L256.5 103.8H250C197.7 103.8 191.9 160.3 191.7 162.6999999999999C190.5 175.8999999999999 170.4 174.3 171.6 160.8999999999999C173 145.0999999999999 180.4 120.8999999999999 198 103.7999999999999H107C81.5 103.7999999999999 -3.8 130.5999999999999 0 217.7999999999999V431.1C0 447.1 9.7 447.7 15 447.9H97C97.2 447.9 97.3 447.8 97.5 447.8C101.8 448.2 147.6 449.9 147.6 404.1C147.6 390.8 167.8 390.7 167.8 404.1C167.8 422.3 162.3 436.9 152 447.8H236.2C344.9 448.2 362.7 368.4 362.7 327.6zM230.2 271.6L294.2 242.3C307.5 287.8 252 314 230.2 271.6z" /> + <glyph glyph-name="deviantart" + unicode="" + horiz-adv-x="320" d=" M320 354.8L221.8 175.7L229.2 166.2H320V38.5H159.1L145.6 29.3L101.9 -54.7C101.6 -54.7 93.3 -63.3 92.7 -63.9H0V29.3L93.2 208.7L85.8 217.9H0V345.5H156L169.5 354.7L213.2 438.7C213.5 438.7 221.8 447.3 222.4 447.9H320V354.8z" /> + <glyph glyph-name="digg" + unicode="" + horiz-adv-x="512" d=" M81.7 275.7H0V101.3H132.7V352H81.7V275.7zM81.7 142.3H50.9V234.6H81.7V142.3zM378.9 275.7V101.3H460.7V72.8H378.9V32H512V275.7H378.9zM460.7 142.3H429.9V234.6H460.7V142.3zM225.1 101.3H307.2V72.8H225.1V32H358.4V275.7H225.1V101.3zM276.3 234.6H307.1V142.3H276.3V234.6zM153.3 352H204.6V301H153.3V352zM153.3 275.7H204.6V101.3H153.3V275.7z" /> + <glyph glyph-name="digital-ocean" + unicode="" + horiz-adv-x="512" d=" M256 -56V40.1C357.8 40.1 436.8 141 397.7 248.1C383.4 287.7000000000001 351.6 319.5 311.9 333.8C204.8 372.6 103.8 293.9000000000001 103.8 192.1H8C8 354.3 164.9 480.8 335 427.7C409.2 404.4 468.6 345.3 491.6 271.1C544.8 100.8 418.6 -56 256 -56zM256.3 135.4H160.7V39.8H256.3V135.4zM160.7 39.8H87V-33.8000000000001H160.7V39.8zM87 101.4H25.4V39.8H87V101.4z" /> + <glyph glyph-name="discord" + unicode="" + horiz-adv-x="448" d=" M297.216 204.8C297.216 189.184 285.6960000000001 176.384 271.104 176.384C256.768 176.384 244.992 189.184 244.992 204.8S256.512 233.216 271.104 233.216C285.696 233.216 297.216 220.416 297.216 204.8zM177.664 233.216C163.072 233.216 151.552 220.416 151.552 204.8S163.328 176.384 177.664 176.384C192.256 176.384 203.776 189.184 203.776 204.8C204.032 220.416 192.256 233.216 177.664 233.216zM448 395.264V-64C383.506 -7.006 404.132 -25.872 329.216 43.776L342.784 -3.584H52.48C23.552 -3.584 0 19.968 0 49.152V395.264C0 424.448 23.552 448 52.48 448H395.5200000000001C424.448 448 448 424.448 448 395.264zM375.04 152.576C375.04 235.0080000000001 338.1760000000001 301.824 338.1760000000001 301.824C301.3120000000001 329.472 266.24 328.704 266.24 328.704L262.656 324.608C306.176 311.296 326.4 292.096 326.4 292.096C265.589 325.425 194.156 325.4310000000001 135.168 299.52C125.696 295.168 120.064 292.096 120.064 292.096S141.312 312.32 187.392 325.632L184.832 328.704S149.76 329.472 112.896 301.824C112.896 301.824 76.032 235.008 76.032 152.576C76.032 152.576 97.536 115.456 154.112 113.6640000000001C154.112 113.6640000000001 163.584 125.184 171.264 134.912C138.752 144.6400000000001 126.464 165.12 126.464 165.12C130.23 162.484 136.44 159.067 136.96 158.72C180.17 134.5220000000001 241.548 126.5940000000001 296.704 149.7600000000001C305.664 153.088 315.648 157.9520000000001 326.144 164.864C326.144 164.864 313.344 143.872 279.808 134.4C287.488 124.672 296.704 113.6640000000001 296.704 113.6640000000001C353.28 115.456 375.04 152.576 375.04 152.576z" /> + <glyph glyph-name="discourse" + unicode="" + horiz-adv-x="448" d=" M225.9 416C103.3 416 0 317.5 0 195.9C0 192 0.1 -32 0.1 -32L225.9 -31.8C348.6 -31.8 448 70.5 448 192.1C448 313.7 348.6 416 225.9 416zM224 64C204.6 64 186.1 68.3 169.6 76.1L88.5 56L111.4 131C101.6 149.1 96 169.9 96 192C96 262.7 153.3 320 224 320S352 262.7 352 192S294.7 64 224 64z" /> + <glyph glyph-name="dochub" + unicode="" + horiz-adv-x="416" d=" M397.9 288H256V428.4L397.9 288zM304 256V126C304 59.2 267.5 25.9 190.7 25.9H96V363.2H190.7C202.7 363.2 213.8 362.4 223.8 360.7V444.7C212.9 446.9 201.4 448 189.2 448H0V-64H189.2C329.7 -64 400 0.6 400 129.9V256H304z" /> + <glyph glyph-name="docker" + unicode="" + horiz-adv-x="640" d=" M349.9 211.7H283.8V271.1H349.9V211.7zM349.9 416H283.8V355.3H349.9V416zM428.1 271.2H362V211.8H428.1V271.2zM271.8 343.3H205.7V283.2H271.8V343.3zM349.9 343.3H283.8V283.2H349.9V343.3zM626.7 243.3C612.3000000000001 253 579.1 256.5 553.6 251.7C550.3000000000001 275.7 536.9 296.6 512.5 315.4L498.5 324.7L489.2 310.7C470.8 282.9 465.8 237.1 485.5 206.9C476.8 202.2 459.7 195.8 437.1 196.2H2.4C-6.3 145.4 8.2 79.4 46.4 34.1C83.5 -9.8 139.1 -32.1 211.8 -32.1C369.2000000000001 -32.1 485.7 40.4 540.2 172.1C561.6 171.7000000000001 607.8000000000001 172 631.5 217.3C633 219.8 638.1 230.5 640 234.4L626.7 243.3zM115.6 271.2H49.6V211.8H115.7V271.2zM193.7 271.2H127.6V211.8H193.7V271.2zM271.8 271.2H205.7V211.8H271.8V271.2zM193.7 343.3H127.6V283.2H193.7V343.3z" /> + <glyph glyph-name="draft2digital" + unicode="" + horiz-adv-x="480" d=" M369.9 22.6V77L417 49.8L369.9 22.6zM82.4 67.4C107.9 94.7 180.1 172.1 233.3 237.4C268.4000000000001 280.5 273.6 319.8 261.7 350.1C254.3 368.9 244.2 380.3 237.4 385.8C282.7 383.7 305.4 362.4 319.6 347.5C319.6 347.5 362 299.3 325.4 234.2C288.4 168.3 214.5 86.7 196.9 67.5H82.4zM134.2 286.6C134.2 274.2 124.2 264.2 111.8 264.2C99.4 264.2 89.4 274.2 89.4 286.6C89.4 299 99.4 309 111.8 309C124.2 309 134.2 298.9 134.2 286.6M336 132.1V67.4H244.7C275.5 102.4 326.5 163.3000000000001 356.5 216.7000000000001C391.7 279.3000000000001 372.6 340.1 343.7 370.0000000000001C339.3 374.6 281.5 432.9000000000001 177.7 411.2000000000001C118.6 398.8000000000001 88.3 367.8000000000001 73.4 343.9000000000001C60.3 323.0000000000001 56.4 304.1000000000001 55.2 296.2000000000001C49.7 263.2000000000001 74.6 229.1000000000001 111.9 229.1000000000001C143.6 229.1000000000001 169.2 254.8000000000001 169.2 286.5000000000001C169.2 313.6 149.5 338.6 121.2 343.3000000000001C123 350.6 138.9 364.4000000000001 147.5 368.0000000000001C188.6 385.3000000000001 225.5 362.8000000000001 230.8 334.5000000000001C239.1 290.2000000000001 193.7 244.1000000000001 161.1 206.9000000000001C84.5 119.9 18.3 51.2 0 32.1L336 32.2V-32L480 49.9L336 132.1z" /> + <glyph glyph-name="dribbble-square" + unicode="" + horiz-adv-x="448" d=" M90.2 219.8C99.1 262.2000000000001 127.6 297.5 165.9 315.5C169.5 310.6 193.9 276.7 216.6 236.5C152.6 219.5 96.3 219.7 90.2 219.8zM314.6 294C281 323.8 235.3 335.1 192 324.6C195.8000000000001 319.5 220.6 285.7 243.0000000000001 244.6C291.6 262.9 312.1 290.5 314.6 294zM140.1 84C180.6 52.4 233.4 47.3 277.4 66C275.4 78 267.4 119.8 248.2 169.6C193.1 150.8 154.4 113.2000000000001 140.1 84zM238.9 192.2C235.5 200 231.7 207.7 227.8 215.4C159.6 195 93.4 195.8 87.4 196C87.4 194.6 87.3 193.2 87.3 191.8C87.3 156.7 100.6 124.7000000000001 122.4 100.4C144.6 138.3 189.5 178.3 238.9 192.2zM273.8 175.9C291.7 126.8 298.9 86.8 300.3 78.5C331 99.2 352.8 132.1 358.9 170.1C354.3 171.6 316.6 182.8 273.8 175.9zM253.5 224.3C258.3 214.5 261.8 206.5 265.5 197.5C311 203.2 356.2 194.1 360.7 193.1C360.3999999999999 225.4 348.8999999999999 255 329.8 278.2C326.9 274.3 304 245 253.5 224.3zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM384 192C384 280.2 312.2 352 224 352S64 280.2 64 192S135.8 32 224 32S384 103.8 384 192z" /> + <glyph glyph-name="dribbble" + unicode="" + horiz-adv-x="512" d=" M256 440C119.252 440 8 328.748 8 192S119.252 -56 256 -56S504 55.252 504 192S392.748 440 256 440zM419.9700000000001 325.634C449.473 289.588 467.3390000000001 243.677 467.805 193.679C460.821 195.156 390.7870000000001 209.361 320.303 200.497C314.551 214.538 309.122 226.89 301.686 242.111C380.007 274.088 415.504 319.593 419.97 325.634zM396.421 350.13C392.611 344.703 360.724 301.844 285.4 273.611C250.688 337.387 212.215 389.779 206.36 397.619C273.536 413.812 344.326 396.349 396.421 350.13zM165.941 383.38C171.526 375.721 209.379 323.264 244.478 260.871C145.391 234.558 58.118 234.937 48.644 235.062C62.38 300.795 106.678 355.427 165.941 383.38zM44.17 191.677C44.17 193.843 44.213 195.999 44.278 198.15C53.546 197.96 156.198 196.637 261.984 228.2960000000001C268.048 216.4280000000001 273.841 204.3810000000001 279.158 192.347C202.559 170.7720000000001 132.964 108.8200000000001 98.627 50.0410000000001C64.794 87.595 44.17 137.27 44.17 191.677zM125.977 24.564C148.104 69.797 208.155 128.186 293.5560000000001 157.3200000000001C323.2960000000001 80.037 335.5950000000001 15.2670000000001 338.7450000000001 -3.318C270.6330000000001 -32.331 188.7300000000001 -24.371 125.9770000000001 24.564zM374.357 16.075C372.186 28.9610000000001 360.911 90.972 333.205 167.1080000000001C399.585 177.734 457.905 160.3400000000001 465.152 158.0530000000001C455.71 99.1120000000001 421.879 48.2090000000001 374.357 16.075z" /> + <glyph glyph-name="dropbox" + unicode="" + horiz-adv-x="528" d=" M264.4 331.7L132.4 247.4L264.4 163.1L132.4 78.8L0 163.9L132.3 248.2L0 331.7L132.3 416L264.4 331.7zM131.6 52.3L263.6 136.6L395.6 52.3L263.6 -32L131.6 52.3zM264.4 163.9L396.4 248.2L264.4 331.8L395.7 416L528 331.7L395.7 247.4L528 163.2L395.7 78.9L264.4 163.9z" /> + <glyph glyph-name="drupal" + unicode="" + horiz-adv-x="448" d=" M319.5 333.3C297.3 347.3 276 352.8 254.8 366.8C241.8 375.6 223.5 396.8 208.3 415.1C205.6 385.8 196.8 373.9 186.3 365.6C165 348.6 151.5 343.4 132.8 333.3C117 325 32 266.5 32 157.5C32 48.3 123.8 -32 225.8 -32C327.5 -32 416 42 416 154C416 266.3 333 325 319.5 333.3zM322 7.7C301.9 -12.4 231.9 -21 205.3 3.5C200.5 8.3 205.6 15.5 211.8 15.5C211.8 15.5 228.8 2.2 263.3 2.2C290.3 2.2 309.3 9.9 317.8 16.2C323.9000000000001 20.8 326.2 11.9 322 7.7zM267.5 60.3C276.2 63.9 296.5 64.1 304.3 59C308.4000000000001 56.2 320.4000000000001 40.2 310.5 35.3C302.1 31.1 309.3 51 284 51C269.3 51 264.5 45.8 257.3 40C250.3 34 247.5 32 245.1 35.3C239.1 43.5 261 57.6 267.5 60.3zM360 43C344.8 44 314.5 91.8 295 92.5C264.1 93.4 190.9 11.8 133.7 50.5C94.9 77.1 119.1 155.3 185.5 155.7C235 156.2 269.3 106.7 294 107.2C315.3 107.5 355.8 149 375.8 149C424.5 149 399.1 39.7 360 43z" /> + <glyph glyph-name="dyalog" + unicode="" + horiz-adv-x="416" d=" M0 416V296.8H64V352H171.2C284.6 352 352 271.8 352 192.1C352 116 293.4 32 171.2 32H0V-32H171.2C331.9 -32 416 80.7 416 192.1C416 250.8 393.9 305.5 353.7 346.4C308.9 392 245.7 416 171.2 416H0z" /> + <glyph glyph-name="earlybirds" + unicode="" + horiz-adv-x="480" d=" M313.2 400.5C314.4 413.5 334.5 414.5 349.8 409.2C350.7 408.9 376 399.5 368.8 394C340.9000000000001 401.4 312.4000000000001 375.8 313.2 400.5zM112.2 393.6C142.9 401.7 174.2 373.6 173.3 400.7C172 414.9 149.9 416 133.1 410.3C132.1 410 104.4 399.8 112.2 393.6zM319.4 288C310.6 288 303.4 280.8 303.4 272S310.6 256 319.4 256S335.4 263.2 335.4 272S328.2 288 319.4 288zM159.7 288C150.9 288 143.7 280.8 143.7 272S150.9 256 159.7 256S175.7 263.2 175.7 272S168.5 288 159.7 288zM478.2 124.8C468.3 100.8 437.5 113.8 414.3 126C400.8 56.9 356.2 14.6 288 1.8C288.3 0.9 286 1.9 312 0.8C345.6 -0.6 375.8 3.9 409.4 8.8C389.6 22.6 398 45.9 399.6 46.9C401 47.8 414.3 45.2 421.2 35.4C429.8 47.9 449.6 50.2 451.4 49.0000000000001C453 47.9 458 28.1000000000001 444.5 14.4C449.2 15.3 452.7 16.0000000000001 454.3 16.5000000000001C456.9 17.3000000000001 472 5.2 457.4 3.2C443.1 0.9 434.8 -1.9 410.3 -7.6C364.4000000000001 -18.3 324.4 -19.4 292.6 -20.4L293.6 -32C297.4000000000001 -50.1 270.2000000000001 -56.3 266 -38.2C266.8 -56.1 238.9 -60 237.6 -37.2L237.1 -42.5C236.4 -60.9 208.7 -60.4 208.8 -41.9C201.3 -55.4 180.7 -48.7 182.4 -33.4L183.6 -21C146.9 -21.9 123.9 -24.1 121.8 -24.1C100.9 -24.1 100.9 7.5 121.8 7.5C124.2 7.5 149.5 6.2 185 4.7C123.9 20.2 81.3 59.7 70.1 122.9C45.1 110.1 12.6 96.1 1.9 122.1C-8.6 147.5 23.4 164.7 68.7 195.5C69.4 202.1 70.3 208.8 71.4 215.3C57 234.9 59.8 251.6 55.3 275.7C38.5 273.3 32.1 284.8 31.7 298.8C32 306.1 33.8 313.7 34.1 314.2C35.2 316 44.2 316.2 46.8 316.8C52.8 348.5 97.4 350 137.7 351.3C157.4 373.1 182.9 392.8 218.6 399.6C203.3 419 215.2 439.5 216.2 440C217.9 440.8 237.4 435.7 242.5 416.8C247.7 425.6 260.8 428.2 262.1 427.5C263.2000000000001 426.9 268.5 412.5 257.2000000000001 401.6C297.5000000000001 398.1 329.4000000000001 376.9 353.2000000000001 350.9C389.3000000000001 349.4 425.0000000000001 345 430.3000000000001 316.9C433.0000000000001 316.3 441.9000000000001 316.1 443.0000000000001 314.3C443.3000000000001 313.8 445.1000000000001 306.2000000000001 445.4000000000001 298.9C444.9000000000001 285 438.6 273.5 421.8 275.8C418.6 258.5 419.1 242.9 413.1 228.1C415.5 216.4 417.1 204.3 417.9000000000001 191.7000000000001C454.9 166.3000000000001 488.2 149.2000000000001 478.2 124.8000000000001zM207.4 288.1C208.3 332.1 169.5 330.3 128.8 328.4C107.1 327.4 89.9 326.5 83.3 314.5C71.9 293.6 89.2 221.6 106.5 213.3C116.3 208.6 179.9 205.4 192.8 220.4C201 229.8 207.8 269.8 207.4 288.1zM259.4 229.8C255.1 242.2 253.4 259.9 244.1 262.5C242.1 263 235.1 263 233.1 262.5C223.1 259.7 222.3 240.4 216.1 225.3C231.5 225.3 235.4 215.6 239.8 215.6C244.1 215.6 246.1 226.9000000000001 259.4 229.8zM395.1 314.5C388.5 326.6 370.3 327.4 348.6 328.4C308.4 330.3 270.4 332.2 271.3 288.1C270.8 269.8 276.3 229.8 284.5 220.3C297.5 205.4 361.0999999999999 208.5 370.8 213.2C386.6 220.8 407.3 292.1 395.1 314.5z" /> + <glyph glyph-name="edge" + unicode="" + horiz-adv-x="512" d=" M25.714 219.837C25.825 219.999 25.944 220.16 26.056 220.322C26.035 220.16 26.011 219.999 25.991 219.837H25.714zM486.286 204.329C486.286 248.361 478.532 288.794 457.485 326.734C416.498 400.121 343.912 439.999 258.893 439.999C118.962 440.276 40.617 334.786 26.056 220.321C68.485 281.633 143.129 341.697 246.431 345.287C246.431 345.287 356.097 345.287 345.85 240.33H169.997C176.366 277.716 188.551 299.316 204.336 319.256C129.288 284.363 82.486 223.16 83.594 130.941C84.424 59.493 133.718 -13.895 204.337 -41.035C287.694 -72.8820000000001 397.113 -48.235 444.469 -19.711V84.693C363.605 28.199 173.598 23.768 172.214 152.265H486.287V204.329z" /> + <glyph glyph-name="elementor" + unicode="" + horiz-adv-x="448" d=" M425.6 416H22.4C10 416 0 406 0 393.6V-9.6C0 -22 10 -32 22.4 -32H425.6C438 -32 448 -22 448 -9.6V393.6C448 406 438 416 425.6 416M164.3 92.5H124.5V291.5H164.3V92.5zM323.6 92.5H204.1V132.3H323.6V92.5zM323.6 172.1H204.1V211.9H323.6V172.1zM323.6 251.8H204.1V291.6H323.6V251.8z" /> + <glyph glyph-name="ember" + unicode="" + horiz-adv-x="640" d=" M639.9 193.4C638.8 204.1 629.1999999999999 200.2 629.1999999999999 200.2S613.5999999999999 188.1 599.9 189.5C586.1999999999999 190.8 590.5 221.5 590.5 221.5S593.5 249.6 585.4 251.9C577.3 254.3 567.4 244.6 567.4 244.6S555 230.9 549.1 213.4L547.5 212.9S549.4 243.5 547.2 250.5C545.6 254 530.8000000000001 253.7 528.4000000000001 247.5S514.2 198.3 513.4000000000001 180.3C513.4000000000001 180.3 490.3000000000001 160.7 470.1000000000001 157.5S445.1000000000001 166.9 445.1000000000001 166.9S499.9000000000001 182.2 498.0000000000001 226C496.1000000000001 269.8 453.8000000000001 253.6 449.0000000000001 250C444.4000000000001 246.5 419.6000000000001 231.6 412.4000000000001 190.3C412.2000000000001 188.9 411.7000000000001 182.8 411.7000000000001 182.8S390.5000000000001 168.6 378.7000000000001 164.8C378.7000000000001 164.8 411.7000000000001 220.4 371.4000000000001 245.7C353.1 256.7 338.6 233.6 338.6 233.6S393.1 294.3 381.1 345.6C375.3 370 363.1 372.7 351.9000000000001 368.7C334.9000000000001 362 328.4000000000001 352 328.4000000000001 352S306.4000000000001 320 301.3 272.5S288.7 167.4 288.7 167.4S278.2 157.2 268.5 156.7S263.1 185.4 263.1 185.4S270.6 230 270.1 237.5S269 249.1 260.2000000000001 251.7C251.3000000000001 254.4 241.7000000000001 243.1 241.7000000000001 243.1S216.2000000000001 204.4 214.0000000000001 198.5L212.7000000000001 196.1L211.4 197.7S229.4000000000001 250.4 212.2000000000001 251.2C195.0000000000001 252 183.7000000000001 232.4 183.7000000000001 232.4S164.1000000000001 199.6 163.3000000000001 195.9L162 197.5S170.1 235.7 168.4 245.1C166.8000000000001 254.5 157.9 252.6 157.9 252.6S146.6 253.9 143.7000000000001 246.7S130.0000000000001 191.3999999999999 128.7000000000001 176C128.7000000000001 176 100.5 155.8 81.9000000000001 155.6C63.4000000000001 155.3 65.2000000000001 167.4 65.2000000000001 167.4S133.2000000000001 190.7 114.6000000000001 236.6C106.3000000000001 248.4 96.6000000000001 252.1 82.9000000000001 251.9C69.2000000000001 251.6 52.6000000000001 243.3 41.6000000000001 218.6C36.3000000000001 206.8 34.8000000000001 195.6 33.8000000000001 187.1C33.8000000000001 187.1 21.5000000000001 184.7 15.0000000000001 190S5.0000000000001 190 5.0000000000001 190S-6.1999999999999 176 4.9000000000001 171.6999999999999S33.0000000000001 165.5999999999999 33.0000000000001 165.5999999999999C34.6000000000001 158.0999999999999 39.2000000000001 146.0999999999999 52.6000000000001 135.8999999999999C72.8000000000001 120.5999999999999 111.4000000000001 137.1999999999999 111.4000000000001 137.1999999999999L127.3000000000001 146S127.8000000000001 131.3999999999999 139.4000000000001 129.3C151.0000000000001 127.1999999999999 155.8000000000001 128.3 175.9000000000001 177.1999999999999C187.7000000000001 202.1999999999999 188.5000000000001 200.7999999999999 188.5000000000001 200.7999999999999L189.8000000000001 201.0999999999999S180.7000000000001 154.3 184.2000000000001 141.3999999999999C187.7 128.6 203 130 203 130S211.3 127.6 218 151.2C224.7 174.8 237.6 201.1 237.6 201.1H239.2S233.6 153 242.2 137.4C250.8 121.8 273.1 132.1 273.1 132.1S288.7 139.9 291.1 142.3C291.1 142.3 309.6 126.5 335.7 129.4C394 140.9 414.8 155.3 414.8 155.3S424.8 130.9 455.9 128.6C491.4 125.9 510.7 147.2 510.7 147.2S510.4 133.7 522.8 128.6C535.1999999999999 123.5 543.5 151.4 543.5 151.4L564.2 208.6H566.1S567.2 171.3 587.6 165.4S634.6 179.1 634.6 179.1S641 182.6 639.9 193.4zM61.9 188.1C62.7 220.1 83.7 234.0000000000001 90.9 227.1C98.2 220.1 95.5 205.1 81.8 195.7C68.1 186.2000000000001 61.9 188.1 61.9 188.1zM334.7 311.9000000000001S353.8 361.6 358.3 337.4000000000001S318.3 241.2000000000001 318.3 241.2000000000001C318.8 257.4000000000001 334.7 311.9000000000001 334.7 311.9000000000001zM357.5 173.5C344.9 140.5 314.2 153.9 314.2 153.9S310.7 165.7 320.6 198.8S353.9 219 353.9 219S370.1 206.6 357.5 173.5zM442.1 188.1S439.1 198.6 450.2000000000001 218.7C461.2 238.9 469.8000000000001 227.8 469.8000000000001 227.8S479.2 217.6 468.5000000000001 202.3S442.1000000000001 188.1 442.1000000000001 188.1z" /> + <glyph glyph-name="empire" + unicode="" + horiz-adv-x="496" d=" M287.6 393.8C276.8 396 265.5 397.1 254.1 397.4V415.6C332.2000000000001 413.4 400.2000000000001 371.6 438.7000000000001 309L422.9000000000001 299.9C416.8 309.6 410.2000000000001 318.7000000000001 402.7000000000001 327L384.7000000000001 311.5C358.7000000000001 341.1 323.3000000000001 362.2 282.8000000000001 369.9L287.6000000000001 393.8zM53.4 125.6L76.4 133.3C70 151.6 66.4 171.5 66.4 192S69.7 232.4 76.1 250.7L53.4 258.4C57 269.2 61.7 279.7 67 289.4L51.2 298.5C34 267 24.1 230.5 24.1 192S34.1 117 51.2 85.4L67 94.5C61.7 104.5 57.3 114.8 53.4 125.6zM213.1 14C172.7 22 137.3 43.1 111.2 72.7L93.2 56.9C85.7 65.5 78.8 74.6 73 84.3L57 74.9C95.5 12.6 163.8 -29.4 241.9 -31.7V-13.4C230.6 -13.1 219.2 -11.7 208.4 -9.8L213.1 14zM93.3 327.1L111.3 311.6C137.3 341.2 172.7 362.3 213.2 370L208.5 393.8C219.3 396 230.6 397.1 242 397.4V415.6C163.9 413.4 95.9 371.6 57.4 309L73.2 299.9C79.2 309.6 85.8 318.8 93.3 327.1zM402.7 56.9L384.7 72.7C358.7 43.1 323.3 22 282.8 14L287.5 -9.8C276.7 -11.7 265.3999999999999 -13.1 254 -13.4V-31.7C332.0999999999999 -29.5000000000001 400.4 12.6 438.9 74.9L422.8 84.3C417.1 74.6 410.2 65.4999999999999 402.7 56.9zM496 192C496 55 385 -56 248 -56S0 55 0 192S111 440 248 440S496 329 496 192zM483.8 192C483.8 322.1 378.1 427.8 248 427.8S12.2 322.1 12.2 192S117.9 -43.8 248 -43.8S483.8 61.9 483.8 192zM444.8 298.6L429 289.5C434.3 279.8 439 269.3 442.6 258.5L419.9000000000001 250.8C426.3 232.5 429.6 212.6 429.6 192.1S426 151.7000000000001 419.6 133.4L442.6 125.7000000000001C438.7000000000001 114.9 434.3 104.7000000000001 429 94.7000000000001L444.8 85.6C462 117 471.9 153.5 471.9 192S462 267 444.8 298.6zM261.8 120.9C278.1 124.2 292.2 132.5 302.5 144.4L353.7 99.6C365.6 113.2 375 128.9 380.8 146.4L316.6 168.5C319.1 176 320.5 183.7 320.5 192S319.1 208.1 316.6 215.5L381.1 237.6C375 255 365.6 270.8 353.7000000000001 284.4L302.5000000000001 239.6C292.3000000000001 251.5 278.1000000000001 260.1 261.8000000000001 263.4L275.1000000000001 329.8C266.5000000000001 331.7 257.4000000000001 332.6 248.0000000000001 332.6C238.6000000000001 332.6 229.5000000000001 331.8 220.9000000000001 329.8L234.2000000000001 263.4C217.9000000000001 260.1 203.8000000000001 251.5 193.5000000000001 239.6L142.3000000000001 284.4C130.4000000000001 270.8 121.0000000000001 255.1 114.9000000000001 237.6L179.4000000000001 215.5C176.9000000000001 208 175.5000000000001 200.3 175.5000000000001 192S176.9000000000001 175.9 179.4000000000001 168.5L115.2000000000001 146.4C121.0000000000001 129 130.4000000000001 113.2 142.3000000000001 99.6L193.5000000000001 144.4C203.7000000000001 132.5 217.9000000000001 124.2 234.2000000000001 120.9L220.9000000000001 54.2C229.5000000000001 52.5 238.6000000000001 51.4 248.0000000000001 51.4C257.4000000000001 51.4 266.5000000000001 52.5 275.1000000000001 54.2L261.8000000000001 120.9z" /> + <glyph glyph-name="envira" + unicode="" + horiz-adv-x="448" d=" M0 416C477.6 416 366.6 98.7 367.1 49.7L448 -32H422L351.6 39.2C312.6 35 227.2 4.7 137.2 76.2C47 147.7 52 233.3 0 416zM79.7 370C30 393.5 74.5 360.8 74.5 360.8C119.7 329.6 140.5 287.1 164.7 240.9C196.2 180.7 243.7 101.2 308.9 73.2C373.9 45.2 343.1 60.7 314.9 81.7C286.7 102.9 246.7 168.7 223.9 211.9C192.2 271.9 162.9 330.5 79.7 370z" /> + <glyph glyph-name="erlang" + unicode="" + horiz-adv-x="640" d=" M21.7 201.6C21.6 114.8 50.7 42.1 100.4 -10.5H0V394.5H87.2C45.7 344.3 21.6 278.3 21.7 201.6zM640 394.4H556.4C587.8 351.7 605.1 296.9 602.6 231.7C603.1 225.7 603.1 220 602.6 207.6H230.2C230 97.9 269.1 12.7 368.8 12.3C437.3 12.6 486.8 63.3 520.6999999999999 118.4L617.0999999999999 70.2C599.6999999999999 39.3 580.5999999999999 12.4 559.1999999999999 -10.6H640V394.4zM559.2 -10.6S559.2 -10.5 559.2 -10.6H559H559.2zM556.1 394.4H556.4L556.3 394.5L556.0999999999999 394.4zM325.4000000000001 384.8C279.5000000000001 384.7 240.3000000000001 351.3 236.2000000000001 301.6H406.1C405 351.3 371.6 384.7 325.4000000000001 384.8z" /> + <glyph glyph-name="ethereum" + unicode="" + horiz-adv-x="320" d=" M311.9 187.2L160 94.4L8 187.2L160 448L311.9 187.2zM160 64.6L8 157.4L160 -64L312 157.4L160 64.6z" /> + <glyph glyph-name="etsy" + unicode="" + horiz-adv-x="384" d=" M384 100C382.25 89.25 370.25 -10 368.5 -32C250.621 -27.701 148.605 -27.257 0 -32V-6.5C45.457 2.448 60.627 1.519 61 28.75C62.793 101.072 64.524 272.8930000000001 61 350.75C59.971 379.2100000000001 48.87 377.515 0 386.75V412.25C73.886 409.892 255.933 403.699 362.999 416C359.499 377.75 355.249 289.5 355.249 289.5H332C320.947 332.335 313.241 380 277.25 380H140.25C130 380 129.5 376.5 129.5 370.25V206.5C187.5 206 218 209 218 209C247.77 209.951 245.56 217.502 258.75 274.251H284.5C280.093 172.9 280.59 212.422 282.75 114.001H257C247.845 154.087 247.935 175.046 217.499 175.501C217.499 175.501 195.999 177.501 129.499 177.501V38.501C129.499 12.501 143.749 0.251 173.749 0.251H263C326.636 0.251 329.564 25.247 361.751 100.001H384z" /> + <glyph glyph-name="expeditedssl" + unicode="" + horiz-adv-x="496" d=" M248 404.6C130.6 404.6 35.4 309.4 35.4 192S130.6 -20.6 248 -20.6S460.6 74.6 460.6 192S365.4 404.6 248 404.6zM150.6 271.7C150.6 325.4 194.3 369.1 248 369.1S345.4 325.4 345.4 271.7V245.1C345.4 240.1 341.5 236.2 336.5 236.2H318.8C313.8 236.2 309.9000000000001 240.1 309.9000000000001 245.1V271.7C309.9000000000001 353.8 185.9 353.8 185.9 271.7V245.1C185.9 240.1 182 236.2 177 236.2H159.3000000000001C154.3000000000001 236.2 150.4 240.1 150.4 245.1V271.7zM389.7 68C389.7 58.3 381.7 50.3 372 50.3H124C114.3 50.3 106.3 58.3 106.3 68V209.7C106.3 219.4 114.3 227.4 124 227.4H372C381.7 227.4 389.7 219.4 389.7 209.7V68zM141.7 205.3V72.4C141.7 69.9 139.8 68 137.3 68H128.4C125.9 68 124 69.9 124 72.4V205.3C124 207.8 125.9 209.7 128.4 209.7H137.3C139.8 209.7 141.7 207.8 141.7 205.3zM283.4 156.6C283.4 143.6 276.2 132.2000000000001 265.7 126.2000000000001V94.6C265.7 89.6 261.8 85.7000000000001 256.8 85.7000000000001H239.1C234.1 85.7000000000001 230.2 89.6 230.2 94.6V126.2000000000001C219.7 132.3000000000001 212.5 143.6 212.5 156.6C212.5 176.3 228.3000000000001 192 247.9000000000001 192S283.4000000000001 176.2000000000001 283.4000000000001 156.6zM248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM248 -38.3C121 -38.3 17.7 65 17.7 192S121 422.3 248 422.3S478.3 319 478.3 192S375 -38.3 248 -38.3z" /> + <glyph glyph-name="facebook-f" + unicode="" + horiz-adv-x="264" d=" M76.7 -64V165H0V256H76.7V327.7C76.7 405.6 124.3 448 193.8 448C227.1 448 255.7 445.5 264 444.4V363H215.8C178 363 170.7 345 170.7 318.7V256H256L244.3 165H170.7V-64" /> + <glyph glyph-name="facebook-messenger" + unicode="" + horiz-adv-x="448" d=" M224 416C15.9 416 -77.5 170 84.6 47.4V-32L160.3 10C302.5 -29.8 445.7 69.9 445.7 208.7C445.8 323.2 346.5 416 224 416zM247.4 137.9L190 197.5L79.6 136.4L200.7 264.9L258.1 205.3L368.5 266.4L247.4 137.9z" /> + <glyph glyph-name="facebook-square" + unicode="" + horiz-adv-x="448" d=" M448 368V16C448 -10.5 426.5 -32 400 -32H314.7V145.2H375.3L384 212.8H314.7V256C314.7 275.6 320.1 288.9 348.2 288.9H384V349.3C377.8 350.1 356.6 352 331.8 352C280.2 352 244.8 320.5 244.8 262.6V212.7H184V145.1H244.9V-32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368z" /> + <glyph glyph-name="facebook" + unicode="" + horiz-adv-x="448" d=" M448 391.3V-7.2C448 -20.9 436.9 -31.9 423.3 -31.9H309.1V141.5H367.3L376 209.1H309V252.3C309 271.9 314.4 285.2000000000001 342.5 285.2000000000001H378.3V345.7000000000001C372.1 346.5 350.9000000000001 348.4000000000001 326.1 348.4000000000001C274.5 348.4000000000001 239.1 316.9000000000001 239.1 259V209.1H180.7V141.5H239.1V-32H24.7C11.1 -32 0 -20.9 0 -7.3V391.3C0 404.9 11.1 416 24.7 416H423.2C436.9 416 448 404.9 448 391.3z" /> + <glyph glyph-name="firefox" + unicode="" + horiz-adv-x="480" d=" M478.1 212.7C477.4 217.2 476.7 219.8 476.7 219.8S474.9 217.8 472.0000000000001 213.9C471.1000000000001 224.6 469.2 235.1 466.2 245.5C462.5000000000001 258.4 457.7 270.9 451.7 282.9C447.9000000000001 290.9 443.5000000000001 298.5 438.4000000000001 305.7C436.6 308.4 434.7000000000001 311.1 432.8 313.6C424 328 413.8 336.9 402.1 353.6C394.5 366.4 389.2000000000001 380.5 386.7000000000001 395.2C383.5000000000001 386.3 381.0000000000001 377.2 379.3000000000001 367.9C367.2000000000001 380.1 356.8000000000001 388.7 350.4000000000001 394.6C319.4 423.8 323 438.9 323 438.9S264.7 373.8 289.9 306C298.6 283 313.7 262.9 333.3 248.1C357.7 227.9 384.1 212.1 398 171.5C386.8 192.8 369.8999999999999 210.7 349.2 223C355.3999999999999 208.3 358.5999999999999 192.4 358.5 176.5C358.5 115.5 308.8999999999999 66 247.9 66.1C239.6 66.1 231.4 67 223.4 68.9C213.9 70.7000000000001 204.7 73.8 196 78.2000000000001C183.0999999999999 86.0000000000001 172 96.3000000000001 163.1999999999999 108.5000000000001L163 108.8000000000001L165 108.1000000000001C169.5999999999999 106.5000000000001 174.1999999999999 105.3000000000001 179 104.4000000000001C197.6999999999999 100.4000000000001 217.3 102.7000000000001 234.6 111.0000000000001C252.1 120.7000000000001 262.5999999999999 127.9000000000001 271.2 125.0000000000001H271.3999999999999C279.7999999999999 122.3000000000001 286.3999999999999 130.5000000000001 280.3999999999999 139.0000000000001C270 152.4000000000001 252.9999999999999 159.0000000000001 236.2 156.0000000000001C218.6999999999999 153.5000000000001 202.6999999999999 141.0000000000001 179.7999999999999 153.1000000000001C178.2999999999999 153.9000000000002 176.8999999999999 154.7000000000002 175.4999999999999 155.6000000000001C173.8999999999999 156.5000000000001 180.3999999999999 154.3000000000001 178.8999999999999 155.3000000000001C173.8999999999999 157.8000000000001 169.0999999999999 160.7000000000001 164.4999999999999 163.9000000000002C164.1999999999999 164.2000000000002 167.9999999999999 162.8000000000001 167.5999999999999 163.1000000000001C161.6999999999999 167.1000000000001 156.5999999999999 172.3000000000001 152.5999999999999 178.3000000000001C148.4999999999999 185.7000000000001 148.0999999999999 194.7000000000001 151.5999999999999 202.4000000000001C153.6999999999999 206.2000000000001 156.9999999999999 209.3000000000001 160.8999999999999 211.1000000000001C163.8999999999999 209.6000000000001 165.6999999999999 208.5000000000001 165.6999999999999 208.5000000000001S164.3999999999999 211.0000000000001 163.5999999999999 212.3000000000001C163.9 212.4000000000001 164.0999999999999 212.3000000000001 164.4 212.5000000000001C167 211.4000000000001 172.7 208.5000000000001 175.8 206.7000000000001C177.9 205.6000000000001 179.6 204.0000000000001 181 202.0000000000001C181 202.0000000000001 182 202.5000000000001 181.3 204.7000000000001C180.2 207.4000000000001 178.4 209.7000000000001 175.9 211.3000000000001H176.0999999999999C178.4 210.1000000000001 180.5999999999999 208.7000000000001 182.6999999999999 207.2000000000001C184.5999999999999 211.6000000000001 185.5 216.4000000000001 185.2999999999999 221.2000000000001C185.4999999999999 223.8000000000001 185.0999999999999 226.5000000000001 184.1999999999999 229.0000000000001C183.3999999999999 230.6000000000001 184.6999999999999 231.2000000000001 186.0999999999999 229.5000000000001C185.9 230.8000000000002 185.4 232.0000000000001 184.9 233.2000000000001V233.3000000000001S185.7 234.4000000000001 186.0999999999999 234.8000000000001C187.0999999999999 235.8000000000001 188.1999999999999 236.7000000000001 189.5 237.5000000000001C196.6999999999999 242.0000000000001 204.3 245.9000000000001 212.1999999999999 249.1000000000001C218.5999999999999 251.9000000000001 223.8999999999999 254.0000000000001 225 254.7000000000001C226.6 255.7000000000001 228.1 256.9000000000001 229.5 258.2000000000001C234.8 262.7000000000001 238.5 269.0000000000001 239.7 275.9000000000001C239.8 276.8000000000001 239.8999999999999 277.7000000000001 240 278.7000000000001V280.2000000000001C239.1 283.7000000000001 233.1 286.3000000000001 201.5999999999999 289.3000000000001C190.5 291.1000000000001 181.5999999999999 299.4000000000001 179.0999999999999 310.4000000000001V310.3000000000001C178.6999999999999 309.2000000000001 178.1999999999999 308.0000000000001 177.7999999999999 306.8000000000001C178.1999999999999 308.0000000000001 178.5999999999999 309.1000000000001 179.0999999999999 310.3000000000001V310.5000000000001C185.0999999999999 326.2000000000001 195.9 339.6 209.9 348.8000000000001C210.7 349.5000000000001 206.7 348.6 207.5 349.3000000000001C210.1999999999999 350.6 212.9 351.8000000000001 215.6999999999999 352.8000000000001C217.0999999999999 353.4000000000001 209.6999999999999 356.2000000000001 203.0999999999999 355.5000000000001C199.0999999999999 355.3000000000001 195.0999999999999 354.3000000000001 191.4 352.7000000000001C193 354.0000000000001 197.5999999999999 355.8000000000001 196.5 355.8000000000001C188.0999999999999 354.2000000000001 180 351.1 172.5999999999999 346.8000000000001C172.5999999999999 347.6 172.6999999999999 348.3000000000001 173.0999999999999 349.0000000000001C167.1999999999999 346.5000000000001 162.0999999999999 342.5000000000001 158.0999999999999 337.5000000000001C158.1999999999999 338.4000000000001 158.2999999999999 339.3000000000001 158.2999999999999 340.2000000000001C155.5999999999999 338.2000000000001 153.0999999999999 335.9000000000001 150.9999999999999 333.3000000000001L150.8999999999999 333.2000000000001C133.4999999999999 339.9000000000001 114.5999999999999 341.5000000000001 96.2999999999999 337.9000000000001L96.0999999999999 338.0000000000001H96.2999999999999C92.4999999999999 341.1 89.1999999999999 344.7000000000001 86.5999999999999 348.9000000000001L86.3999999999999 348.8000000000001L85.9999999999999 349.0000000000001C84.7999999999999 350.8000000000001 83.5999999999999 352.8000000000001 82.2999999999999 355.0000000000001C81.3999999999999 356.6000000000001 80.4999999999999 358.4000000000001 79.5999999999999 360.2000000000001C79.5999999999999 360.3000000000001 79.4999999999999 360.4000000000001 79.3999999999999 360.4000000000001C78.9999999999999 360.4000000000001 78.7999999999999 358.7000000000001 78.4999999999999 359.1000000000001V359.2000000000001C75.2999999999999 367.5000000000001 73.7999999999999 376.4000000000001 74.0999999999999 385.4000000000001L73.8999999999999 385.3000000000001C68.7999999999999 381.8000000000001 64.8999999999999 376.7000000000001 62.7999999999999 370.8000000000001C61.8999999999999 368.7000000000001 61.1999999999999 367.5000000000001 60.5999999999999 366.3000000000001V366.8000000000001C60.6999999999999 367.9000000000001 61.1999999999999 370.1000000000001 61.0999999999999 369.9000000000001C60.9999999999999 369.7000000000001 60.8999999999999 369.6000000000001 60.7999999999999 369.5000000000001C59.2999999999999 367.8000000000001 57.8999999999999 365.8000000000001 56.8999999999999 363.7000000000001C55.9999999999999 361.8000000000001 55.1999999999999 359.8000000000001 54.5999999999999 357.8000000000001C54.4999999999999 357.5000000000001 54.5999999999999 358.1 54.5999999999999 358.8000000000001S54.6999999999999 360.8000000000001 54.5999999999999 360.5000000000001L54.2999999999999 359.8000000000001C47.5999999999999 344.9000000000001 43.3999999999999 329.0000000000001 41.8999999999999 312.7000000000001C41.4999999999999 309.9000000000001 41.2999999999999 307.1 41.3999999999999 304.4000000000001V304.2000000000001C36.5999999999999 299.0000000000001 32.3999999999999 293.2000000000001 28.6999999999999 287.1C16.5999999999999 266.7000000000001 7.5999999999999 244.6000000000001 1.8999999999999 221.5000000000001C5.8999999999999 230.3000000000001 10.6999999999999 238.7000000000001 16.1999999999999 246.6000000000001C5.5 219.5 0 190.6 0 161.4C1.8 170 4.2 178.4 7 186.7C5.3 152.2 11.9 117.8 26.4 86.4C45.8 42.9 78 6.4 118.7 -18.3C135.3 -29.5 153.4 -38.2 172.5 -44.1C175 -45 177.6 -45.9 180.2 -46.8C179.4 -46.5 178.6 -46.1 177.8 -45.8C200.4 -52.6 224 -56.1 247.6 -56.1C331.3 -56.1 358.9 -24.2 361.4 -21.1C365.5 -17.4 368.9 -12.9 371.3 -7.8C372.9 -7.1 374.5 -6.4 376.2 -5.7L377.2 -5.2L379.0999999999999 -4.3C391.7 1.6 403.5999999999999 9.1 414.3999999999999 17.8C430.7 29.5 442.2999999999999 46.5 447.2999999999999 65.9C450.2999999999999 73.0000000000001 450.3999999999999 80.9 447.6999999999999 88.1C448.5999999999999 89.5 449.3999999999999 90.9 450.3999999999999 92.4C468.3999999999999 121.3 478.5999999999999 154.3 479.9999999999999 188.3000000000001V191.1000000000001C479.9999999999999 198.4000000000001 479.3999999999999 205.6000000000001 478.0999999999999 212.7000000000001z" /> + <glyph glyph-name="first-order" + unicode="" + horiz-adv-x="448" d=" M12.9 218.8C13 218.9 13.1 219.1 13.2 219.2C13.2 219.1 13.2 218.9 13.1 218.8H12.9zM224 351.4C216.9 351.4 209.4 350.8 202.6 349.7L206.3 282.3L184.3 346.3C170 342.6 156.6 336.9 144.3 329.7000000000001L173.7 268.3L128.6 319.2000000000001C117.2 310.3 106.9 300.1 98 288.3L148.6 242.9L87.5 272.6C80.4 260.3 74.6 246.9 70.9 232.6L135.2 210L67.2 214C66.3 206.9 65.8 199.4 65.8 192S66.4 177.4 67.2 170.3L134.9 174.3L70.9 151.7C74.6 137.4 80.3 124 87.5 111.4L148.6 141.1L97.7 96C106.6 84.3 116.8 73.7 128.6 65.1L173.5 116L144 54.6C156.3 47.2 169.7 41.5 184 37.7L206.3 102.3000000000001L202.3 34.3000000000001C209.4 33.2 216.9 32.6000000000001 224 32.6000000000001C231.4 32.6000000000001 238.6 33.2000000000001 245.7 34.3000000000001L241.7 102.9000000000001L264.3 37.8000000000001C278.6 41.8000000000001 292 47.2 304.3 54.7L274.9 116L319.8 65.1C331.5 74 341.8 84.2000000000001 350.4 96L299.8 141.1L360.9 111.7000000000001C368 124.0000000000001 373.8 137.4 377.5 152.0000000000001L313.5 174.3000000000001L380.9 170.3000000000001C382 177.4000000000001 382.3 184.6000000000001 382.3 192.0000000000001S382 206.9000000000001 380.9 214.0000000000001L313.2 210.0000000000001L377.2 232.3000000000001C373.5 246.6000000000001 368.1 260.3000000000001 360.6 272.6000000000001L299.7 242.9000000000001L350.3 288.3000000000001C341.4000000000001 300.0000000000001 331.2 310.3000000000001 319.7 319.2000000000001L274.6 268.3000000000001L304 329.4000000000001C291.7 336.8000000000001 278.3 342.5000000000001 264 346.3000000000001L241.7 282L245.7 349.7C238.6 350.9 231.4 351.4 224 351.4zM443.4 320V64L224 -64L4.6 64V320L224 448L443.4 320zM426.3 309.7L224 427.1L21.7 309.7V74.6L224 -43.1L426.3 74.6V309.7zM224 410.9L411.7 301.5V82.6L224 -26.9L36.3 82.6V301.4L224 410.9zM224 360C131.7 360 57.1 284.9 57.1 192C57.1 99.4 131.7 24.3 224 24.3C316 24.3 390.9 99.4 390.9 192C390.9 284.9 316 360 224 360z" /> + <glyph glyph-name="firstdraft" + unicode="" + horiz-adv-x="384" d=" M384 256H320V128H192V0H0V25.6H166.4V153.6H294.4V281.6H384V256zM358.4 217.6V89.6H230.4V-38.4H64V-64H256V64H384V217.6H358.4zM384 25.6H294.4V-64H320V0H384V25.6zM0 448V64H128V192H256V320H384V448H0z" /> + <glyph glyph-name="flickr" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM144.5 129C109.4 129 81 157.4 81 192.5S109.4 256 144.5 256S208 227.6 208 192.5S179.6 129 144.5 129zM303.5 129C268.4 129 240 157.4 240 192.5S268.4 256 303.5 256S367 227.6 367 192.5S338.6 129 303.5 129z" /> + <glyph glyph-name="flipboard" + unicode="" + horiz-adv-x="448" d=" M0 416V-32H448V416H0zM175.7 240.3V55.9H87.8V328.1H175.6V240.3zM360.2 240.3H272.3V143.7000000000001H184.5V231.5000000000001H272.3V240.3000000000001H184.5V328.1000000000001H360.2V240.3000000000001z" /> + <glyph glyph-name="fly" + unicode="" + horiz-adv-x="384" d=" M197.8 20.2C210.7 8.5 231.5 -13.1 231 -30.5C231 -31.3 230.9 -32.1 230.9 -33C229.1 -52.8 212.1 -64.1 191.8 -64C166.8 -63.9 151.9 -47.2 153.1 -28.2C154.1 -12 173.6 8.5 185.5 19.4C187.8000000000001 21.5000000000001 188.2 22.1 191.1 23.0000000000001C194.5 23.0000000000001 195 22.7 197.8 20.2zM331.9 380.7C315.6 406.4 293.3 421.3 268.6 432.8C243.1 443.5 214 448.2 192 448C147.9 448 120.8 434.8 110.9 430.7C57.3 402.8 26.5 360.8 28 289.4C35.1 207.2 125 113.4 183.8 55.6C185.5 54 188.3 51.1 190 50.5L193.3 50.4C195.4 51.1 195.1 50.9 196.8 52.5C249.1 101.7 337.5 198.3 352.7000000000001 268.2C359.7000000000001 307.4 355.8000000000001 340.7 331.9000000000001 380.7zM186.8 96.1C158.8 147.2000000000001 121.6 226.8 117.5 285.1C114.1 332.6 128.9 416.3 186.8 421.8V96.1zM328.7 268C312.3 211.2 251.4 140 209.8 97.7C237.6 149.6 275 231 277 289.6C278.6 335.5 267.2 395.4 229 421C317.8 402.7 344.5 322.9 328.7 268z" /> + <glyph glyph-name="font-awesome-alt" + unicode="" + horiz-adv-x="448" d=" M397.8 380.2C405.6 380.2 412.1 373.6 412.1 365.9V18.3C412.1 10.4999999999999 405.5 3.9999999999999 397.8 3.9999999999999H50.2C42.4 3.9999999999999 35.9 10.6 35.9 18.3V365.8C35.9 373.6 42.5 380.1 50.2 380.1H397.8M397.8 416H50.2C22.7 416 0 393.3 0 365.8V18.2C0 -9.3 22.7 -32 50.2 -32H397.8C425.3 -32 448 -9.3 448 18.2V365.8C448 393.3 425.3 416 397.8 416zM339.3 276.8C333.3 276.8 309.4000000000001 261.3 286.7 261.3C282.5 261.3 278.3 261.9 274.2 263.7000000000001C254.5 271.5 237.2 277.4 215.1 277.4C194.8 277.4 173.3 270.8 155.4 263.7000000000001C153.6 263.1 151.8 262.5 150.6 261.9V279.8C158.4 285.8 163.1 294.7000000000001 163.1 305.5C163.1 323.4 148.8 337.8 130.8 337.8S98.5 323.5 98.5 305.5C98.5 295.3 103.3 285.8 111 279.8V67.7000000000001C111 56.9 120 48.0000000000001 130.7 48.0000000000001C139.7 48.0000000000001 146.8 54.0000000000001 149.2 61.7000000000001V63C149.8 64.8 149.8 66 149.8 67.8V112C151 112 152.2 112.6 152.8 113.2C172.5 121.6 195.8 129.9 218.5 129.9C249.6 129.9 261.5 113.8 287.8 113.8C306.3 113.8 324.2 120.4 339.8 127.5C344 129.3 347 131.1 347 135.3V269.7C348.8 273.8 344.7 276.8 339.3 276.8z" /> + <glyph glyph-name="font-awesome-flag" + unicode="" + horiz-adv-x="448" d=" M444.373 88.576C444.373 81.408 438.229 78.336 431.061 75.264C402.389 62.976 371.669 51.712 338.901 51.712C292.821 51.712 271.317 80.384 216.021 80.384C176.085 80.384 134.101 66.048 100.309 50.688C98.261 49.664 96.213 49.664 94.165 48.64V-29.184C94.165 -50.5890000000001 78.043 -64 60.373 -64C40.9169999999999 -64 25.5569999999999 -48.64 25.5569999999999 -29.184V345.6C12.245 355.8400000000001 3.029 372.224 3.029 390.656C3.029 422.4 28.629 448 60.373 448S117.717 422.4 117.717 390.656C117.717 372.224 109.525 355.8400000000001 95.189 345.6V313.856C99.313 315.23 153.957 342.528 209.877 342.528C275.147 342.528 307.553 314.88 336.853 314.88C375.765 314.88 418.773 342.528 429.0130000000001 342.528C437.2050000000001 342.528 444.3730000000001 336.384 444.3730000000001 329.216V88.576z" /> + <glyph glyph-name="font-awesome" + unicode="" + horiz-adv-x="448" d=" M397.8 416H50.2C22.7 416 0 393.3 0 365.8V18.2C0 -9.3 22.7 -32 50.2 -32H397.8C425.3 -32 448 -9.3 448 18.2V365.8C448 393.3 425.3 416 397.8 416zM352.4000000000001 131.7C352.4000000000001 127.5 348.8 125.7 344.6 123.9C327.9000000000001 116.7 310 110.2 290.8 110.2C263.9000000000001 110.2 251.4 126.9 219.1 126.9C195.8 126.9 171.3 118.5 151.6 109.6C150.4 108.9999999999999 149.2 108.9999999999999 148 108.4V63C148 61.2 148 59.4 147.4 58.2V57C145 48.6 137.2000000000001 42.7 128.3000000000001 42.7C117.0000000000001 42.7 108 51.7 108 63V281.6C100.2000000000001 287.6 94.9000000000001 297.1 94.9000000000001 307.9C94.9000000000001 326.4 109.8000000000001 341.4 128.4 341.4C146.9 341.4 161.9 326.5 161.9 307.9C161.9 297.1 157.1 287.6 148.8000000000001 281.6V263.1C150.6000000000001 263.7 152.4 264.3 154.2000000000001 265.5C172.7000000000001 273.3 194.8000000000001 279.8 215.7000000000001 279.8C238.4000000000001 279.8 256.3000000000001 273.8 276.6 266.1C280.8 264.3 285 263.7000000000001 289.7000000000001 263.7000000000001C312.4000000000001 263.7000000000001 337.5000000000001 279.8 343.5000000000001 279.8C348.3000000000001 279.8 352.5000000000001 276.2000000000001 352.5000000000001 272V131.7z" /> + <glyph glyph-name="fonticons-fi" + unicode="" + horiz-adv-x="384" d=" M114.4 224H206.8L191.6 172.8H115.2V15C115.2 7 112.4 5.8 119.6 5L179.2 -0.6V-35H0V0.2L29.2 3C36.4 3.8 38.4 6.2 38.4 13.8V169.6C38.4 172.8 34.4 172.8 30.4 172.8H0V224H38.4V252.8C38.4 320.8 74.8 348.8 144.4 348.8C191.2 348.8 233.2 337.6 233.2 276.4L163.6 268C164 293.6 157.6 299.6 141.2 299.6C116 299.6 115.2 286 115.2 262V230C115.2 226.8 110.4 224 114.4 224zM384 -35H243.2V-0.6L271.2 3C278.4 3.8 281.6 5.4 281.6 13V161C281.6 166.6 277.6 170.2 272.4 171.8L239.2 180.6L248.4 221H358.4V13C358.4 5 354.8 4.2 362.4 3L384 -0.6V-35zM354 312.2L366.4 266.6L356.4 256.6L313.6 279.4L270.8 256.6L260.8 266.6L273.2 312.2L243.2 348.6L248 358.6H286L307.2 397H320L341.2 358.6H379.2L384 345.4L354 312.2z" /> + <glyph glyph-name="fonticons" + unicode="" + horiz-adv-x="448" d=" M0 416V-32H448V416H0zM167.4 220H234.8L223.7 182.7H168V69.8C168 63.9999999999999 166 63.1 171.2 62.4999999999999L214.7 58.3999999999999V33.2999999999999H84V59L105.3 61C110.5 61.6 112 63.3 112 68.9V180.3C112 182.6 109.1 182.6 106.2 182.6H84V220H112V241C112 290.6 138.5 311 189.3 311C223.4 311 254 302.8 254 258.2L203.3 252.1C203.6 270.8 198.9 275.1 187 275.1C168.6 275.1 168 265.2 168 247.7V224.4C168 222 164.5 220 167.4 220zM364 33.3H261.3V58.4L281.7 61.0000000000001C286.9 61.6000000000001 289.3 62.7000000000001 289.3 68.3000000000001V176.2C289.3 180.3 286.4000000000001 182.9 282.6 184.1L258.4000000000001 190.5L265.1 220H345.3V68.3C345.3 62.4999999999999 342.7 61.9 348.2 60.9999999999999L363.9 58.3999999999999V33.2999999999999zM342.1 288.8L351.1 255.6L343.8 248.3L312.6 264.9L281.4000000000001 248.3L274.1 255.6L283.1 288.8L261.3 313L264.8 322.6H292.5L308 350.6H317.3L332.8 322.6H360.5L364 313L342.1 288.8z" /> + <glyph glyph-name="fort-awesome-alt" + unicode="" + horiz-adv-x="512" d=" M211.7 206.9V155.2C211.7 153.1 210.1 151.5 208 151.5H185.8C183.7 151.5 182.1 153.1 182.1 155.2V206.9C182.1 209 183.7 210.6 185.8 210.6H208C210.1 210.6 211.7 209 211.7 206.9zM326.2 210.6H304C301.9 210.6 300.3 209 300.3 206.9V155.2C300.3 153.1 301.9000000000001 151.5 304 151.5H326.2C328.3 151.5 329.9 153.1 329.9 155.2V206.9C329.8 209 328.2 210.6 326.2 210.6zM297.1 -52.6C296.2 -52.7 295.4 -52.9 294.5 -53C293.5 -53.2 292.3999999999999 -53.3 291.3999999999999 -53.5C290.5 -53.6 289.5999999999999 -53.8 288.5999999999999 -53.9C287.5999999999999 -54 286.5999999999999 -54.2 285.5999999999999 -54.3C284.5999999999999 -54.4 283.5999999999999 -54.4999999999999 282.7 -54.6C281.7 -54.7 280.8 -54.8 279.8 -54.9C278.8 -55 277.7 -55.1 276.7 -55.2C275.8 -55.3 274.8999999999999 -55.4 274 -55.4C272.8999999999999 -55.5 271.7 -55.5 270.6 -55.6C269.8 -55.6 268.9 -55.7 268.1 -55.7C266.8 -55.8 265.5 -55.8 264.2 -55.8C263.5 -55.8 262.8 -55.9 262.1 -55.9C260.1 -55.9 258.1 -56.0000000000001 256.1 -56.0000000000001S252.1 -56.0000000000001 250.1 -55.9C249.4 -55.9 248.7 -55.9 248 -55.8C246.7 -55.8 245.4 -55.7 244.1 -55.7C243.3 -55.7 242.4 -55.6 241.6 -55.6C240.5 -55.4999999999999 239.3 -55.4999999999999 238.2 -55.4C237.3 -55.3 236.4 -55.3 235.5 -55.2C234.5 -55.1 233.4 -55 232.4 -54.9C231.4 -54.8 230.5 -54.7 229.5 -54.6C228.5 -54.4999999999999 227.5 -54.4 226.6 -54.3C225.6 -54.1999999999999 224.6 -54.1 223.6 -53.9C222.7 -53.8 221.8 -53.6 220.8 -53.5C219.8 -53.4 218.7 -53.2 217.7 -53C216.8 -52.9 216 -52.7 215.1 -52.6C149.5 -41.7 92.6 -4.9 55.1 46.8C54.9 46.9999999999999 54.8 47.3 54.6 47.4999999999999C53.8 48.6 53 49.6999999999999 52.3 50.8C52 51.1999999999999 51.7 51.6 51.5 51.9999999999999C50.8 53.1 50.1 54.1 49.4 55.1999999999999C49.1 55.6999999999999 48.8 56.0999999999999 48.5 56.5999999999999C47.8 57.6999999999999 47.1 58.6999999999999 46.5 59.7999999999999C46.2 60.2999999999999 45.9 60.6999999999999 45.6 61.1999999999999C44.9 62.2999999999999 44.3 63.3999999999999 43.6 64.4999999999999C43.4 64.8999999999999 43.1 65.2999999999999 42.9 65.6999999999999C40.5 69.6999999999999 38.3 73.7999999999999 36.1 77.8999999999999C36 78.0999999999999 35.9 78.1999999999999 35.8 78.3999999999999C35.2 79.4999999999999 34.7 80.5999999999999 34.1 81.6999999999999C33.8 82.2999999999999 33.5 82.7999999999999 33.3 83.3999999999999C32.8 84.3999999999999 32.3 85.4999999999999 31.8 86.4999999999999C31.5 87.1999999999999 31.2 87.7999999999999 30.9 88.4999999999999C30.4 89.4999999999999 30 90.4999999999999 29.5 91.4999999999999L28.6 93.5999999999999C28.2 94.5999999999999 27.7 95.5999999999999 27.3 96.5999999999999C27 97.2999999999999 26.7 98.0999999999999 26.4 98.7999999999999L25.2 101.7999999999999C24.9 102.5999999999999 24.6 103.2999999999999 24.3 104.0999999999999C23.9 105.0999999999999 23.5 106.0999999999999 23.2 107.0999999999999C22.9 107.9999999999999 22.6 108.8999999999999 22.2 109.8999999999999C21.6 111.4999999999999 21.1 113.1999999999999 20.5 114.7999999999999C20.2 115.6999999999999 19.9 116.5999999999999 19.6 117.5999999999999C19.3 118.4999999999999 19.1 119.3999999999999 18.8 120.2999999999999C18.5 121.1999999999999 18.2 122.1999999999999 18 123.0999999999999C17.7 123.9999999999999 17.5 124.8999999999999 17.2 125.7999999999999C16.9 126.7999999999999 16.7 127.6999999999999 16.4 128.6999999999999C16.2 129.5999999999999 15.9 130.4999999999999 15.7 131.3999999999999C15.4 132.3999999999999 15.2 133.3999999999999 15 134.3999999999999C14.8 135.2999999999999 14.6 136.0999999999999 14.4 136.9999999999999C14.2 138.0999999999999 13.9 139.1999999999999 13.7 140.1999999999999C13.5 140.9999999999999 13.4 141.7999999999999 13.2 142.5999999999999C12.9 143.8999999999999 12.7 145.2999999999999 12.4 146.5999999999999C12.3 147.1999999999999 12.2 147.6999999999999 12.1 148.2999999999999L11.2 153.9999999999998C11.1 154.5999999999999 11 155.2999999999999 10.9 155.8999999999998C10.7 157.1999999999998 10.5 158.4999999999998 10.4 159.7999999999998C10.3 160.5999999999998 10.2 161.2999999999998 10.1 162.0999999999998C10 163.2999999999998 9.8 164.4999999999998 9.7 165.6999999999998C9.6 166.4999999999998 9.5 167.2999999999999 9.5 168.0999999999998C9.4 169.2999999999998 9.3 170.4999999999998 9.2 171.5999999999998C9.1 172.3999999999998 9.1 173.1999999999998 9 173.9999999999998C8.9 175.1999999999998 8.8 176.3999999999998 8.8 177.6999999999998C8.8 178.4999999999998 8.7 179.1999999999998 8.7 179.9999999999998C8.6 181.2999999999998 8.6 182.6999999999998 8.5 183.9999999999998C8.5 184.6999999999998 8.5 185.2999999999998 8.4 185.9999999999998C8.4 187.9999999999998 8.3 189.9999999999998 8.3 191.9999999999998C8.3 245.4999999999998 25.2 294.9999999999998 54.1 335.5999999999998C56.4 338.7999999999998 58.8 341.9999999999998 61.2 345.0999999999998C66.1 351.2999999999998 71.3 357.3999999999998 76.8 363.0999999999998C79.5 365.9999999999998 82.3 368.7999999999998 85.2 371.4999999999998C88.1 374.1999999999998 91 376.8999999999998 94 379.4999999999998C98.5 383.3999999999998 103.1 387.0999999999998 107.9 390.6999999999998C109.5 391.8999999999998 111.1 393.0999999999998 112.7 394.1999999999998C140 413.8 171.7 427.9 206 435C222.1 438.3 238.9 440 256 440S289.8 438.3 306 435C340.3 428 372 413.9 399.6 394.3C401.2000000000001 393.1 402.8 392 404.4000000000001 390.8C409.2000000000001 387.2 413.8 383.5 418.3 379.6C430.3 369.2 441.3 357.7 451.1 345.2C453.6 342.1 455.9 338.9 458.2 335.7C487.1 295 504 245.5 504 192C504 190 504 188 503.9 186C503.9 185.3 503.9 184.7 503.8 184C503.8 182.7 503.6999999999999 181.3 503.6 180C503.6 179.2 503.4999999999999 178.5 503.4999999999999 177.7C503.3999999999999 176.5 503.3999999999999 175.3 503.3 177C503.1999999999999 176.2 503.1999999999999 175.4 503.1 174.6C502.9999999999999 173.4 502.9 172.2000000000001 502.8 171.1C502.6999999999999 170.3 502.6 169.5 502.6 168.7000000000001C502.4999999999999 167.5000000000001 502.3 166.3000000000001 502.2 165.1C502.1 164.3 502 163.6 501.9 162.8C501.7 161.5 501.5 160.2 501.4 158.9C501.3 158.3 501.2 157.6 501.1 157.0000000000001L500.2 151.3000000000001C500.1 150.7000000000001 500 150.2000000000001 499.9 149.6000000000001C499.7 148.3000000000001 499.4 146.9000000000001 499.1 145.6000000000001C498.9 144.8000000000001 498.8 144.0000000000001 498.6 143.2000000000001C498.4 142.1000000000001 498.1 141.0000000000001 497.9 140.0000000000001C497.7 139.1000000000001 497.5 138.3000000000001 497.3 137.4000000000001C497.1 136.4000000000001 496.8 135.4000000000001 496.6 134.4000000000001C496.4 133.5000000000001 496.1 132.6000000000001 495.9 131.7000000000001C495.6 130.7000000000001 495.4 129.8000000000001 495.1 128.8000000000001C494.9 127.9000000000002 494.6 127.0000000000001 494.3 126.1000000000001C493.9999999999999 125.2000000000002 493.6999999999999 124.2000000000002 493.4999999999999 123.3000000000001C493.1999999999999 122.4000000000002 492.9999999999999 121.5000000000001 492.6999999999999 120.6000000000001C492.3999999999999 119.7000000000002 492.0999999999999 118.8000000000001 491.8 117.8000000000001C491.3 116.2000000000001 490.6999999999999 114.5000000000001 490.1 112.9000000000002C489.8 112.0000000000002 489.4999999999999 111.1000000000001 489.1 110.1000000000001C488.7 109.1000000000001 488.4 108.1000000000001 487.9999999999999 107.1000000000001C487.6999999999999 106.3000000000001 487.3999999999999 105.6000000000001 487.1 104.8000000000001L485.9 101.8000000000001C485.6 101.1000000000001 485.3 100.3000000000001 485 99.6000000000001C484.6 98.6000000000001 484.2 97.6000000000001 483.7 96.6000000000001L482.8 94.5000000000001C482.4 93.5000000000001 481.9 92.5000000000001 481.4 91.5000000000001C481.1 90.8000000000001 480.8 90.2000000000001 480.5000000000001 89.5000000000001C480.0000000000001 88.5000000000001 479.5000000000001 87.4000000000001 479.0000000000001 86.4000000000001C478.7 85.8000000000001 478.4 85.3000000000001 478.2 84.7000000000001C477.6 83.6000000000001 477.1 82.5000000000001 476.5000000000001 81.4000000000001C476.4 81.2000000000001 476.3000000000001 81.1000000000001 476.2 80.9000000000001C474.0000000000001 76.8000000000001 471.8000000000001 72.7000000000001 469.4 68.7000000000001C469.2 68.3000000000001 468.9 67.9000000000001 468.7 67.5000000000001C468.0000000000001 66.4000000000001 467.4 65.3000000000001 466.7 64.2000000000001C466.4 63.7000000000001 466.1 63.3000000000001 465.8000000000001 62.8000000000001C465.1000000000001 61.7000000000001 464.4000000000001 60.7000000000001 463.8000000000001 59.6000000000001C463.5000000000001 59.1000000000001 463.2 58.7000000000002 462.9000000000001 58.2000000000002C462.2000000000001 57.1000000000001 461.5000000000001 56.1000000000001 460.8000000000001 55.0000000000002C460.5000000000001 54.6000000000002 460.2 54.2000000000002 460.0000000000001 53.8000000000002C459.2 52.7000000000002 458.5000000000001 51.6000000000002 457.7 50.5000000000002C457.5000000000001 50.3000000000002 457.4 50.0000000000002 457.2 49.8000000000002C419.6 -4.8999999999998 362.7000000000001 -41.5999999999998 297.1 -52.5999999999998zM414.4 33.6C427.4 46.6 438.6 60.9999999999999 448 76.4999999999999V147.8C448 149.9 446.4 151.5 444.3 151.5H422.1C420 151.5 418.4000000000001 149.8999999999999 418.4000000000001 147.8V122H388.9000000000001V266C388.9000000000001 268.1 387.3 269.7 385.2000000000001 269.7H363.1C361 269.7 359.4000000000001 268.1 359.4000000000001 266V240.1H329.9000000000001V266C329.9000000000001 268.1 328.3 269.7 326.2000000000001 269.7H304C301.9 269.7 300.3 268.1 300.3 266V240.1H270.8V266C270.8 270.8 264.3 269.7 261.3 269.7V300.4C268 302 275.1 303.2 282.1 303.2C290.9000000000001 303.2 298.9000000000001 299.7 307.5 299.7C311.2 299.7 329.9 300.6 329.9 306.2V354.6C329.9 356.7 328.3 358.3 326.2 358.3C322 358.3 314 354.8 306.8 354.8C298.9000000000001 354.8 289.9000000000001 358.3 280.5 358.3C274 358.3 267.6 357.4 261.3 356V359.9C265.7 362 268.7 366.6 268.7 371.4C268.7 388.2 243.3 388.2 243.3 371.4C243.3 366.6 246.3 361.9 250.7 359.9V269.7C247.7 269.7 241.2 270.8 241.2 266V240.1H211.7V266C211.7 268.1 210.1 269.7 208 269.7H185.8C183.7 269.7 182.1 268.1 182.1 266V240.1H152.6V266C152.6 268.1 151 269.7 148.9 269.7H126.8000000000001C124.7000000000001 269.7 123.1 268.1 123.1 266V122H93.5V147.8C93.5 149.9 91.9 151.5 89.8 151.5H67.7C65.6 151.5 64 149.9 64 147.8V76.5C73.4 61 84.6 46.6 97.6 33.6C118.2 13 142.1 -3.1 168.8 -14.4C182.7 -20.3 197 -24.7 211.7 -27.6V48.2C211.7 106.8000000000001 300.3 106.8000000000001 300.3 48.2V-27.6C315 -24.7 329.3 -20.2 343.2 -14.4C369.9 -3.1 393.8 13 414.4 33.6" /> + <glyph glyph-name="fort-awesome" + unicode="" + horiz-adv-x="512" d=" M489.2 160.1H461.8C459.2 160.1 457.2 158.1 457.2 155.5V123.5H420.6V301.8C420.6 304.4 418.6 306.4 416 306.4H388.6C386 306.4 384 304.4 384 301.8V269.8H347.3999999999999V301.8C347.3999999999999 304.4 345.3999999999999 306.4 342.7999999999999 306.4H315.3999999999999C312.7999999999999 306.4 310.7999999999999 304.4 310.7999999999999 301.8V269.8H274.1999999999999V301.8C274.1999999999999 307.8 266.1999999999999 306.4 262.4999999999999 306.4V344.4C270.7999999999999 346.4 279.5999999999999 347.8 288.1999999999999 347.8C299.0999999999999 347.8 309.0999999999999 343.5 319.5999999999999 343.5C324.1999999999999 343.5 347.2999999999999 344.6 347.2999999999999 351.5V411.5C347.2999999999999 414.1 345.2999999999999 416.1 342.6999999999998 416.1C337.5999999999998 416.1 327.5999999999998 411.8 318.6999999999998 411.8C308.9999999999999 411.8 297.7999999999999 416.1 286.0999999999998 416.1C278.0999999999998 416.1 270.0999999999998 415 262.3999999999998 413.2000000000001V418.1C267.7999999999998 420.7000000000001 271.4999999999999 426.4000000000001 271.4999999999999 432.4000000000001C271.4999999999999 453.1 240.0999999999998 453.2 240.0999999999998 432.4000000000001C240.0999999999998 426.4000000000001 243.7999999999998 420.7000000000001 249.1999999999998 418.1V306.4C245.4999999999999 306.4 237.4999999999999 307.8 237.4999999999999 301.8V269.8H200.8999999999998V301.8C200.8999999999998 304.4 198.8999999999998 306.4 196.2999999999999 306.4H168.8999999999998C166.2999999999999 306.4 164.2999999999999 304.4 164.2999999999999 301.8V269.8H128V301.8C128 304.4 126 306.4 123.4 306.4H96C93.4 306.4 91.4 304.4 91.4 301.8V123.5H54.8V155.5C54.8 158.1 52.8 160.1 50.2 160.1H22.8C20.2 160.1 18.2 158.1 18.2 155.5V-64H201.1V32C201.1 104.6 310.8 104.6 310.8 32V-64H493.7V155.5C493.8000000000001 158.1 491.8000000000001 160.1 489.2 160.1zM201.1 164.6C201.1 162 199.1 160 196.5 160H169.1C166.5 160 164.5 162 164.5 164.6V228.6C164.5 231.2 166.5 233.2 169.1 233.2H196.5C199.1 233.2 201.1 231.2 201.1 228.6V164.6zM347.5 164.6C347.5 162 345.5 160 342.9 160H315.5C312.9 160 310.9 162 310.9 164.6V228.6C310.9 231.2 312.9 233.2 315.5 233.2H342.9C345.5 233.2 347.5 231.2 347.5 228.6V164.6z" /> + <glyph glyph-name="forumbee" + unicode="" + horiz-adv-x="448" d=" M5.8 138.3C2 155.3 0 172.5 0 189.7C0 313 99.8 413 223.1 413C239.7 413 256.4 411 272.4 407.5C149 360.5 51.9 262 5.8 138.3zM398.7 327.5C385 345 369 360.2 350.9 372.8C201.3 328.5 84.6 210.7 41.2 60.8C53.7 42.7 69.2 25.2 86.4 11.8C129.5 163.1 247.6 283.5 398.7 327.5zM414.5 74.8C429.7 99.9 439.9 128.5 444 157.6C364.6 114.7000000000001 299 47 256.4 -32.7C286.4 -28.3 315.3 -17.4 341 -1.4C376 -14.5 411.9 -25.7 448 -35C438.7 1.5 427.6 39.5 414.5 74.8zM444.2 220.3C441.6 239.8 436.3 259 428.4 277.1C290.5 231.3 182 120.5 137.1 -18C155.2 -25.6 174.1 -30.5 193.7 -33.2C240 80.9 330.5 173.6 444.2 220.3z" /> + <glyph glyph-name="foursquare" + unicode="" + horiz-adv-x="368" d=" M323.1 445H49.9C12.4 445 0 416.7 0 398.9V-34.9C0 -55.2 12.1 -62.6 18.2 -65C24.4 -67.5 41 -69.6 51.1 -57.9C180 91.5 182.2 94 182.2 94C185.3 97.4 185.6 97.1 189 97.1H272.4C307.5 97.1 313 122.3 316.7 136.8L365.3 379.8C373.8 422.2 363.1 445 323.1 445zM306.8 371.2L295.4000000000001 311.5C294.2000000000001 305 285.9000000000001 298.3 278.5000000000001 298.3H172.1C160.1 298.3 151.5 290 151.5 278V265C151.5 253 160.1 244.4 172.1 244.4H262.5C270.8 244.4 279.1 235.2 277.3 226.2C275.5 217.3 266.8 172.4 265.9000000000001 167.4C265.0000000000001 162.5000000000001 259.1 153.9 249.0000000000001 153.9H175.5C162 153.9 158.3000000000001 152.1 149 141.3C149 141.3 140.1 129.9 59.5 33C58.6 32.1 57.7 32.4 57.7 33.3V372.1C57.7 379.8 64.5 388.7 74.3 388.7H293.3000000000001C301.5000000000001 388.7 308.9000000000001 381 306.8000000000001 371.2z" /> + <glyph glyph-name="free-code-camp" + unicode="" + horiz-adv-x="576" d=" M69.3 303.5C28.3 235 32.9 140.5 70.3 76.5C92.5 38.3 120 24.1 120 10C120 3.2 114 -3 107.2 -3C87.7 -3 8 72.5 8 194.8C8 306.3 86 380.8 105.1 380.8C111.1 380.8 120 376 120 369.7000000000001C120 357 91.7 341.1 69.3 303.5zM265.1 89.7C269.6 87.9 277.4000000000001 84.5 277.4000000000001 90.9C277.4000000000001 93.6 275.2000000000001 93.8 273.1 94.5C264.6 97.9 259.1 102.2 254.0000000000001 109.7C245.8000000000001 121.8 243.9000000000001 133.9 243.9000000000001 148.3C243.9000000000001 180.4 288.1 186.2 288.1 218.3C288.1 230.6 280.4000000000001 234.2 280.4000000000001 237.6C280.4000000000001 239.8 281.1 239.8 283.3 239.8C291.3 239.8 302.4000000000001 226.5 305.8 220C308 215.4 308.2 214 308.2 208.9C308.2 201.9 307.5 194.7 307.5 187.6C307.5 160.6 339.4 167.8 339.4 180.8C339.4 186.8 335.8 192.4 335.8 198.2C335.8 198.9 335.8 199.4 336.5 199.4C339.8999999999999 199.4 345.8999999999999 191.7 347.6 189.3C353.4 180.4 356.1 168.5 356.1 157.9C356.1 125.5000000000001 326.6 108.9 326.6 101.9C326.6 100.9 329.5 94.2000000000001 338.7 100.0000000000001C368.4 115.1000000000001 391.8 147.6000000000001 391.8 189.8000000000001C391.8 223.4000000000001 383.1 247.5000000000001 359.7 272.4000000000001C355.8 276.5000000000001 343.3 289.3000000000001 337.2 289.3000000000001C329 289.3000000000001 344.4 270.7000000000001 344.4 258.1000000000001C344.4 250.9000000000001 339.6 245.8000000000001 332.1 245.8000000000001C320.5 245.8000000000001 317.6 271.2000000000001 316.2 279.1000000000001C310.4 312.9000000000001 303.4 337.3000000000001 269.8 353.2000000000001C259.4000000000001 358.2000000000001 233.3 365.0000000000001 233.3 355.4000000000001C233.3 353.0000000000001 236 351.3000000000001 237.9 350.3000000000001C247.1 344.7000000000001 257.5 328.9000000000001 257.5 312.1000000000001C257.5 266.0000000000001 199.8 223.9000000000001 199.8 175.9000000000001C199.6 135.6000000000001 227.9 103.3000000000001 265.1 89.7000000000001zM470.4 381C464.4 381 456 374.5 456 368.4C456 359.7 468.1 348.8 473.6 343C555.2 257.9 552.2 128.7 491.2 52C484.2 43.1 455.9 16.7 455.9 8.5C455.9 3.4 464.1 -2.9 469.1 -2.9C494.5 -2.9 567.9 77.9 567.9 182.8C568 302.1 491.8 381 470.4 381zM428.1 57.9H167C157.6 57.9 151.5 50.4 151.5 41.5C151.5 33 158.5 26 167 26H428.1C437.5 26 440 33.5 440 42.4C440 50.9 436.5 57.9 428.1 57.9z" /> + <glyph glyph-name="freebsd" + unicode="" + horiz-adv-x="448" d=" M303.7 351.8C314.8 362.9 419.2 428.8 442.9 405C466.6 381.3 400.8 276.9 389.7 265.8C378.6 254.7 350.3 264.9 326.6 288.7000000000001C302.8 312.4 292.5 340.7000000000001 303.7 351.8zM109.9 379.9C73.6 400.5 22 423.4 5.6 406.9C-11 390.3 12.7 337.5 33.5 301.2C52 333.4 78.3 360.5 109.9 379.9zM406.7 274C410 262.7 409.4 253.3 404 247.9C383.7 227.6 316.5 274.9 294.7 318C276.7 350.3 283.6 371.4 309.6 366.7C315.3 370.3 321.9 374.3 329.2 378.3C299.4 393.8 265.6 402.6 229.7 402.6C110.6 402.6 14.1 306.1 14.1 187C14.1 68 110.6 -28.6 229.7 -28.6S445.3 67.9 445.3 187C445.3 225.4 435.2 261.5 417.6 292.8C413.7000000000001 285.8 410 279.5 406.7000000000001 274z" /> + <glyph glyph-name="get-pocket" + unicode="" + horiz-adv-x="448" d=" M407.6 384H40.6C18.5 384 0 365.5 0 343.4V208.2C0 83.5 99.7 -16 224.2 -16C348.2 -16 448 83.5 448 208.2V343.4C448 365.8 430.3 384 407.6 384zM245.6 115.5C233.2 103.7 214.2 104.4 203.2 115.5C89.5 224.4 88.3 220.6 88.3 238.7C88.3 255.6 102.1 269.4 119 269.4C136 269.4 135.1 265.6 224.2 180.1C314.8 267 312.8 269.4 329.7 269.4C346.6 269.4 360.4 255.6 360.4 238.7C360.4 220.9 357.5 223 245.6 115.5z" /> + <glyph glyph-name="gg-circle" + unicode="" + horiz-adv-x="512" d=" M257 440C120 440 9 329 9 192S120 -56 257 -56S505 55 505 192S394 440 257 440zM207.5 65.2L81.8 190.9L207.5 316.6L242.7 281.2L218.5 257L207.4 268.1L130.2 190.9L207.4 113.7L234 140.3L180.9 193.2L205.3 217.6L282.5 140.4L207.5 65.2000000000001zM306.5 67.4L271.3 102.6L295.4000000000001 127L306.5000000000001 115.8999999999999L383.7000000000001 193.0999999999999L306.5000000000001 270.2999999999999L280.0000000000001 243.7999999999999L333.1000000000001 190.8999999999999L308.7000000000001 166.5L231.5000000000001 243.7L306.5000000000001 318.7L432.2 193L306.5 67.4z" /> + <glyph glyph-name="gg" + unicode="" + horiz-adv-x="512" d=" M179.2 217.6L281.6 115.2L179.2 12.8L0 192L179.2 371.2L224 326.4L198.4 300.8L179.2 320L51.2 192L179.2 64L230.7 115.5L153.6 192L179.2 217.6zM332.8 371.2L230.4 268.8L332.8 166.4L358.4000000000001 192L281.3000000000001 268.5L332.8000000000001 320L460.8000000000001 192L332.8000000000001 64L313.6000000000001 83.2L288.0000000000001 57.6L332.8000000000001 12.8L512 192L332.8 371.2z" /> + <glyph glyph-name="git-square" + unicode="" + horiz-adv-x="448" d=" M140.1 99.5C152.2 99.5 169.6 97.4 169.6 81.6C169.6 66.1 155.7 62.8 142.6 62.8C130.3 62.8 111.7 64.8 111.7 80.8S127.4 99.5 140.1 99.5zM115.4 216.1C115.4 201.3 122 192 137.7 192C153.2 192 158.9 202 158.9 216.5C159 250.9 115.4 251.3 115.4 216.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM207 274.3C194.7 269.5 181.5 265.9 168.1 265.9C129.6 288 77.4 265 77.4 216.4C77.4 198.4 89 173.5 107 167.5V166.8C93.6 160.9 89.9 130.7 107.7 119.8V119.1C88.2 112.7000000000001 75.4 100.3 75.4 78.9C75.4 42.1 110.2 31.9 140.8 31.9C177.9 31.9 205.6 45.3 205.6 86.2000000000001C205.6 136.6 133.5 118.0000000000001 133.5 145.3000000000001C133.5 154.9000000000001 138.7 158.7000000000001 147.6 160.5000000000001C177.2 166.0000000000001 195.8 189.1000000000001 195.8 219.2000000000001C195.8 224.4 194.7 229.4000000000001 192.9 234.2000000000001C197.7 235.3000000000001 202.4 236.5000000000001 207 238.1000000000001V274.3000000000001zM263.8 272.5H224.2C225.5000000000001 261.9 225.3 129.9 224.2 117H263.8C262.7 129.8 262.6 262.1 263.8 272.5zM268.3 325.8C268.3 339.2 258.3 352 244.2 352C229.9 352 219.6 339.5 219.6 325.8C219.6 312.2 230.1 299.9 244.2 299.9C257.9000000000001 299.9 268.3 312.4 268.3 325.8zM372.6 272.5H336.2000000000001C336.2000000000001 282.3 335.8000000000001 292.1 337.3000000000001 302H296.8000000000001C298.1000000000001 294.7 297.9000000000001 288.4 297.9000000000001 272.5H280.8000000000001V238.6C292.7000000000001 240.5 292.9000000000001 239.3 297.9000000000001 239.3V238.6H297.5000000000001V175.9C297.5000000000001 144.8 302.0000000000001 114.7 340.2000000000001 114.7C350.9000000000001 114.7 363.2000000000001 116.5 372.7000000000001 121.7V156.7C367.0000000000001 152.8 358.8000000000002 150.8 351.8000000000002 150.8C338.6000000000002 150.8 336.3000000000002 163.7 336.3000000000002 174.2V239.4C359.0000000000001 239.4 372.7000000000001 238.7 372.7000000000001 238.7V272.5z" /> + <glyph glyph-name="git" + unicode="" + horiz-adv-x="448" d=" M18.8 226.3C18.8 201 35 166.3 60.3 157.8V156.8C41.5 148.5 36.3 106.2 61.3 91V90C34 81 16 63.7 16 33.8C16 -17.7 64.8 -32 107.5 -32C159.5 -32 198.2 -13.3 198.2 44C198.2 114.5 97.2 88.5 97.2 126.8C97.2 140.3 104.4 145.5 116.9 148.1C158.4 155.8 184.4 188.1 184.4 230.3C184.4 237.6 182.9 244.5 180.4 251.3C187.1 252.8 193.6 254.6 200.1 256.8V307.3C182.9 300.5 164.4 295.5 145.6 295.5C91.8 326.5 18.8 294.2 18.8 226.3zM106.5 62.5C123.5 62.5 147.7 59.5 147.7 37.5C147.7 15.7 128.2 11.2 110 11.2C92.7 11.2 66.7 13.9 66.7 36.4C66.8 58.7 88.8 62.5 106.5 62.5zM103.3 192C81.3 192 72 205 72 225.8C72 275.1 133 274.6 133 226.3C133 206 125 192 103.3 192zM432 142.5V93.5C418.7 86.2 401.5 83.7 386.5 83.7C333 83.7 326.7 125.9 326.7 169.4V257.1H327.2V258.1C320.2 258.1 319.9 259.7 303.2 257.1V304.6H327.2C327.2 326.9 327.5 335.6 325.7 345.8H382.4C380.4 332 380.9 318.3 380.9 304.6H431.9V257.1S412.6 258.1 380.9 258.1V167C380.9 152.2 384.2 134.2 402.7 134.2C412.5 134.2 424 137 432 142.5zM286 379.3C286 360.6 271.5 343.1 252.2 343.1C232.4 343.1 217.7 360.3 217.7 379.3C217.7 398.6 232.2 416 252.2 416C272 416 286 398 286 379.3zM279.8 304.8C278 290.2000000000001 278.2 105 279.8 87H224.3C225.9 105.1 226.1 290 224.3 304.8H279.8z" /> + <glyph glyph-name="github-alt" + unicode="" + horiz-adv-x="480" d=" M186.1 119.3C186.1 98.4 175.2 64.2 149.4 64.2S112.7 98.4 112.7 119.3S123.6 174.4 149.4 174.4S186.1 140.2000000000001 186.1 119.3zM480 169.8C480 137.9 476.8 104.1 462.5 74.8C424.6 -1.8 320.4 0 245.8 0C170 0 59.6 -2.7 20.2 74.8C5.6 103.8 0 137.9 0 169.8C0 211.7 13.9 251.3 41.5 283.4C36.3 299.2000000000001 33.8 315.8 33.8 332.2C33.8 353.7 38.7 364.5 48.4 384C93.7 384 122.7 375 157.2 348C186.2 354.9 216 358 245.9000000000001 358C272.9000000000001 358 300.1 355.1 326.3000000000001 348.8C360.3000000000001 375.5 389.3000000000001 384 434.1000000000001 384C443.9000000000001 364.5 448.7000000000001 353.7 448.7000000000001 332.2C448.7000000000001 315.8 446.1000000000001 299.5 441.0000000000001 284C468.5000000000001 251.6 480.0000000000001 211.7 480.0000000000001 169.8zM415.7 119.3C415.7 163.2 389 201.9 342.2 201.9C323.3 201.9 305.2 198.5 286.2 195.9C271.3 193.6 256.4 192.7 241.1 192.7C225.9 192.7 211 193.6 196 195.9C177.3 198.5 159 201.9 140 201.9C93.2 201.9 66.5 163.2 66.5 119.3C66.5 31.5 146.9 18 216.9 18H265.1C335.4000000000001 18 415.7000000000001 31.4 415.7000000000001 119.3zM333.1 174.4C307.3 174.4 296.4000000000001 140.2000000000001 296.4000000000001 119.3S307.3 64.2 333.1 64.2S369.8 98.4 369.8 119.3S358.9000000000001 174.4 333.1 174.4z" /> + <glyph glyph-name="github-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM277.3 32.3C268.9000000000001 30.8 265.8 36 265.8 40.3C265.8 45.7 266 73.3 266 95.6C266 111.2000000000001 260.8 121.1 254.7 126.3C291.7 130.4 330.7 135.5 330.7 199.4C330.7 217.6 324.2 226.7 313.6 238.4C315.3 242.7 321 260.4 311.9 283.4C298 287.7000000000001 266.2 265.5 266.2 265.5C253 269.2 238.7 271.1 224.6 271.1C210.5 271.1 196.2 269.2 183 265.5C183 265.5 151.2 287.7 137.3 283.4C128.2 260.5 133.8 242.8 135.6 238.4C125 226.7 120 217.6 120 199.4C120 135.8 157.3 130.4 194.3 126.3C189.5 122 185.2 114.6 183.7 104C174.2 99.7 149.9 92.3 135.4 117.9C126.3000000000001 133.7 109.9 135 109.9 135C93.7 135.2 108.8 124.8 108.8 124.8C119.6 119.8 127.2000000000001 100.6 127.2000000000001 100.6C136.9 70.9 183.3000000000001 80.9 183.3000000000001 80.9C183.3000000000001 67.0000000000001 183.5 44.4 183.5 40.3C183.5 36 180.5 30.8 172 32.3C106 54.4 59.8 117.2000000000001 59.8 190.6C59.8 282.4000000000001 130 352.1 221.8 352.1S388 282.4 388 190.6C388.1 117.2000000000001 343.3 54.3 277.3 32.3zM179.2 93.4C177.3 93.0000000000001 175.5 93.8 175.3 95.1C175.1 96.6 176.4 97.9 178.3 98.3C180.2 98.5 182 97.7 182.2 96.4C182.5 95.1 181.2 93.8 179.2 93.4zM169.7 94.3C169.7 93 168.2 91.9 166.2 91.9C164 91.7000000000001 162.5 92.8 162.5 94.3C162.5 95.6 164 96.7 166 96.7C167.9 96.9 169.7 95.8 169.7 94.3zM156 95.4C155.6 94.1 153.6 93.5000000000001 151.9 94.1C150 94.5 148.7000000000001 96 149.1 97.3C149.5 98.6 151.5 99.2 153.2 98.8C155.2 98.2 156.5 96.7 156 95.4zM143.7 100.8C142.8 99.7 140.9 99.9 139.4 101.4C137.9 102.7000000000001 137.5 104.6 138.5 105.5000000000001C139.4 106.6000000000001 141.3 106.4 142.8 104.9C144.1 103.6 144.6 101.6 143.7 100.8zM134.6 109.9C133.7 109.3 132 109.9 130.9 111.4S129.8000000000001 114.6 130.9 115.3C132 116.2 133.7000000000001 115.5 134.6 114C135.7 112.5 135.7 110.7 134.6 109.9zM128.1 119.6C127.2 118.7000000000001 125.7 119.2000000000001 124.6 120.2000000000001C123.5 121.5000000000001 123.3 123.0000000000001 124.2 123.7000000000001C125.1 124.6 126.6 124.1 127.7 123.1C128.8 121.8 129 120.3 128.1 119.6zM121.4 127C121 126.1 119.7 125.9 118.6 126.6C117.3 127.2000000000001 116.7 128.3 117.1 129.2000000000001C117.5 129.8000000000001 118.6 130.1 119.9 129.6C121.2 128.9 121.8 127.8 121.4 127z" /> + <glyph glyph-name="github" + unicode="" + horiz-adv-x="496" d=" M165.9 50.6C165.9 48.6 163.6 47 160.7 47C157.4 46.7 155.1 48.3 155.1 50.6C155.1 52.6 157.4 54.2 160.3 54.2C163.3 54.5000000000001 165.9 52.9 165.9 50.6zM134.8 55.1C134.1 53.1 136.1 50.8 139.1 50.2C141.7 49.2 144.7 50.2 145.3 52.2S144 56.5000000000001 141 57.4C138.4 58.1 135.5 57.1 134.8 55.1zM179 56.8C176.1 56.1 174.1 54.2 174.4 51.9C174.7 49.9 177.3 48.6 180.3 49.3C183.2 50 185.2 51.9 184.9 53.9C184.6 55.8 181.9 57.1 179 56.8zM244.8 440C106.1 440 0 334.7 0 196C0 85.1 69.8 -9.8 169.5 -43.2C182.3 -45.5 186.8 -37.6 186.8 -31.1C186.8 -24.9 186.5 9.3 186.5 30.3C186.5 30.3 116.5 15.3 101.8 60.1C101.8 60.1 90.4 89.2000000000001 74 96.7000000000001C74 96.7000000000001 51.1 112.4 75.6 112.1C75.6 112.1 100.5 110.1 114.2 86.3C136.1 47.7 172.8 58.8 187.1 65.4C189.4 81.4 195.9 92.5000000000001 203.1 99.1C147.2 105.3 90.8 113.4 90.8 209.6C90.8 237.1 98.4 250.9000000000001 114.4 268.5C111.8 275 103.3 301.8 117 336.4000000000001C137.9 342.9000000000001 186 309.4000000000001 186 309.4000000000001C206 315 227.5 317.9000000000001 248.8 317.9000000000001S291.6 315 311.6 309.4000000000001C311.6 309.4000000000001 359.7000000000001 343 380.6 336.4000000000001C394.3 301.7000000000001 385.8 275 383.2000000000001 268.5C399.2000000000001 250.8000000000001 409.0000000000001 237.0000000000001 409.0000000000001 209.6C409.0000000000001 113.1 350.1000000000001 105.4 294.2000000000001 99.1C303.4000000000001 91.2000000000001 311.2000000000001 76.2000000000001 311.2000000000001 52.7C311.2000000000001 19.0000000000001 310.9000000000001 -22.6999999999999 310.9000000000001 -30.9C310.9000000000001 -37.4 315.5000000000001 -45.3 328.2000000000001 -43C428.2 -9.8 496 85.1 496 196C496 334.7 383.5 440 244.8 440zM97.2 95.1C95.9 94.1 96.2 91.8 97.9 89.9C99.5 88.3 101.8 87.6 103.1 88.9C104.4 89.9 104.1 92.2000000000001 102.4 94.1C100.8 95.7000000000001 98.5 96.4 97.2 95.1zM86.4 103.2000000000001C85.7 101.9 86.7 100.3000000000001 88.7 99.3000000000001C90.3 98.3000000000001 92.3 98.6000000000001 93 100.0000000000001C93.7 101.3000000000001 92.7 102.9 90.7 103.9C88.7 104.5000000000001 87.1 104.2000000000001 86.4 103.2000000000001zM118.8 67.6C117.2 66.3 117.8 63.3 120.1 61.4C122.4 59.1 125.3 58.8 126.6 60.4C127.9 61.7000000000001 127.3 64.7000000000001 125.3 66.6C123.1 68.9 120.1 69.2000000000001 118.8 67.6zM107.4 82.3C105.8 81.3 105.8 78.7 107.4 76.4C109 74.1 111.7 73.1 113 74.1C114.6 75.4 114.6 78 113 80.3C111.6 82.6 109 83.6 107.4 82.3z" /> + <glyph glyph-name="gitkraken" + unicode="" + horiz-adv-x="592" d=" M565.7 329.9C563.4000000000001 336 556.4000000000001 339.1 550.4000000000001 336.5C544.7 334.1 541.9000000000001 327.6 544.1000000000001 321.9C555.0000000000001 292.9 561.0000000000001 261.4 561.0000000000001 228.6C561.0000000000001 94 460.7000000000001 -17.1 330.8000000000002 -34.1V89.6C338.7000000000001 91.1 346.3000000000002 93.2000000000001 353.8000000000002 95.8V-8.2C460.5000000000001 17.7 539.7000000000002 113.9 539.7000000000002 228.6C539.7000000000002 320.4000000000001 488.9000000000001 400.4000000000001 413.9000000000002 441.9000000000001C408.2000000000002 445.1 400.9000000000002 442.8 398.0000000000002 436.9000000000001C395.3000000000002 431.4000000000001 397.4000000000002 424.7000000000001 402.7000000000002 421.8C470.6000000000001 384.2000000000001 516.6000000000001 311.8000000000001 516.6000000000001 228.6000000000001C516.6000000000001 135.3000000000001 458.7000000000002 55.5000000000001 376.8000000000002 23.2V115.4C391.0000000000001 119.9 401.7000000000001 133.1 401.7000000000001 148.9C401.7000000000001 162.0000000000001 394.9000000000001 173.3 384.4000000000001 179.4C392.7000000000001 258.9000000000001 428.9000000000001 238.0000000000001 428.9000000000001 263.3000000000001V278C428.9000000000001 316 341.0000000000001 439.8 299.9000000000001 442.7C297.4000000000001 442.9 294.9000000000001 442.9 292.3000000000001 442.7C251.1 439.7 163.2 316 163.2 278V263.2C163.2 237.9 199.5 258.9 207.7 179.3C197.1 173.1999999999999 190.4 161.9 190.4 148.8C190.4 133 201 119.8 215.2 115.3V23.1C133.3 55.3 75.4 135.1 75.4 228.5C75.4 311.6 121.4 384 189.3 421.7C194.7 424.7 196.7 431.3 194 436.8C191.1 442.7 183.9 445 178.1 441.8C103.1 400.3 52.3 320.3 52.3 228.5C52.3 113.8 131.5 17.6999999999999 238.2 -8.3000000000001V95.6999999999999C245.8 93.1999999999999 253.3 91.0999999999999 261.2 89.4999999999999V-34.2C131.4 -17.2 31 93.9 31 228.5C31 261.3 37 292.8 47.9 321.8C50.1 327.6 47.3 334 41.6 336.4C35.6 339 28.6 336 26.3 329.8C14.5 298.3 8 264.2 8 228.5C8 73.4 130.6 -53.1 284.3 -59.3V86.6C291.1 86.2000000000001 299.3 86.1 307.7 86.6V-59.2C461.4 -53.1 584 73.4 584 228.5C584 264.2 577.5 298.3 565.7 329.9zM365.9 172.5C378.9 172.5 389.6 162 389.6 148.8C389.6 135.7 379 125.1 365.9 125.1C352.9 125.1 342.2 135.6 342.2 148.8C342.2 161.9 352.8 172.5 365.9 172.5zM226.1 125.2C212.9 125.2 202.4 135.9 202.4 148.9S212.9 172.6 226.1 172.6C239.2 172.6 249.8 162 249.8 148.9C249.8 135.9 239.3 125.2 226.1 125.2z" /> + <glyph glyph-name="gitlab" + unicode="" + horiz-adv-x="512" d=" M29.782 248.268L256 -45.714L8.074 138.301C1.218 143.443 -1.638 152.297 0.933 160.294L29.782 248.268zM105.187 423.074C102.045 431.928 89.478 431.928 86.336 423.074L29.782 248.268H161.743L105.187 423.074zM161.743 248.268L256 -45.714L350.257 248.2680000000001H161.743zM511.067 160.294L482.218 248.268L256 -45.714L503.926 138.301C510.781 143.443 513.637 152.297 511.067 160.294zM425.663 423.074C422.521 431.928 409.954 431.928 406.812 423.074L350.257 248.268H482.218L425.663 423.074z" /> + <glyph glyph-name="gitter" + unicode="" + horiz-adv-x="384" d=" M66.4 125.5H16V448H66.4V125.5zM166.9 371.9H116.5V-64H166.9V371.9zM267.5 371.9H217.1V-64H267.5V371.9zM368 372H317.6V125H368V372z" /> + <glyph glyph-name="glide-g" + unicode="" + horiz-adv-x="448" d=" M407.1 236.8C403.6 238.2 395.5 240.6 391.7000000000001 240.6C354.6 240.6 329.5000000000001 223.8 298.2000000000001 206.1L297.3000000000001 207C304.3000000000001 254.3 320.8000000000001 298.9000000000001 320.8000000000001 347.4000000000001C320.8 418.9 282.6 448 212.4 448C97.3 448 39 334.3 39 249.6C39 161.7 90.3 113 177.6 113C189.6 113 188.6 114 188.6 109.2C171.7 -19.7 97.8 -23.9 97.8 14.6C97.8 53.8 142.8 73.2000000000001 143.3 75.6C143 87.8 96.3 103.2000000000001 84.4 103.2000000000001C50.5 103.1 32 52.0000000000001 32 23.9C32 -28 64.8 -64 117.5 -64C194.9 -64 251.5 13.8 268.9 81.4C284 141.9 280.1 144.7 288.6 149C320.8 165.2 346.1 176 382.4 176C400.2 176 412.9 172.3 441.3 167.6C444.2 167.6 448 170.5 448 173.4C448 181.4 414.6 233.9000000000001 407.1 236.8000000000001zM231.8 321.2000000000001C222.5 276.5 213.2 231.6 204 186.9C201.7 176.7 190.7 179.1 182 179.1C143.7 179.1 133 220.9 133 252.2C133 299.2 151 361.5 194.8 385.6C201.8 389.7 209.6 392.3 217.4 392.3C236 392.3 237.4 379 237.4 363.6C237.3 349.3 234.7 335.1 231.8 321.2z" /> + <glyph glyph-name="glide" + unicode="" + horiz-adv-x="448" d=" M252.8 299.4C252.8 290.6 251.2 281.7000000000001 249.4 273C243.6 245.2 237.8 217.2 232.1 189.4C230.7 183.1 223.8 184.5 218.4 184.5C194.6 184.5 187.9 210.5 187.9 230C187.9 259.3 199.1 298.1 226.4 313.1C230.7 315.6 235.6 317.3 240.5 317.3C251.9 317.3 252.8 309 252.8 299.4zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM384 181C384 186.1 363.2 218.7 358.5 220.5C356.3 221.4 351.3 222.8 348.9 222.8C325.8 222.8 310.2 212.3 290.7 201.3L290.2 201.8C294.5 231.2 304.8 259 304.8 289.2000000000001C304.8 333.8 281 351.9000000000001 237.3 351.9000000000001C165.6 351.9000000000001 129.3 281.1 129.3 228.4000000000001C129.3 173.7000000000001 161.3 143.4 215.6 143.4C223.1 143.4 222.5 144.0000000000001 222.5 141.1C212 60.8 166 58.2000000000001 166 82.2000000000001C166 106.6 194 118.7000000000001 194.3000000000001 120.2000000000001C194.1000000000001 127.8000000000001 165 137.4 157.6 137.4C136.5 137.4 124.9 104.4 124.9 86.8C124.9 54.5 145.3 32.1 178.2 32.1C226.4000000000001 32.1 261.6 81.8 272.5 123.8C281.9 161.5 279.5 163.2 284.8 165.9C304.8 176.0000000000001 320.6 182.7000000000001 343.2 182.7000000000001C354.3 182.7000000000001 362.2 180.4 379.9 177.5000000000001C381.7 177.4 384 179.2000000000001 384 181.0000000000001z" /> + <glyph glyph-name="gofore" + unicode="" + horiz-adv-x="400" d=" M324 128.2H310.8V93.5C286.3 70.4 254.5 57.7 220.9 57.7C147.7 57.7 88.5 117.9 88.5 192.1C88.5 266.2 147.7 326.5 220.9 326.5C256.2 326.5 289.5 312.5 314.5 287.1L376.8 350.4C335 392.7 279.7 416 220.7 416C98 416 0 315.4 0 192C0 69.5 97 -32 220.7 -32C283.9 -32 345.2 -5.8 391.7 50.5C389.7 78.1 378.3 128.2 324 128.2zM311.9 240.7H205.6V151.7H324C357.5 151.7 384.5 136.6 400 109.9V140.5C400 205.7 359.6 240.7 311.9 240.7z" /> + <glyph glyph-name="goodreads-g" + unicode="" + horiz-adv-x="384" d=" M42.6 44.7H45.4C58.1 44.7 70.9 44.7 83.6 44.6C85.2 44.6 86.7 44.9999999999999 87.2 42.4999999999999C94.3 7.6 117.2 -12.1000000000001 150.1 -21.4C177 -29.0000000000001 204.2 -29.2 231.4 -23.2C265.2 -15.8000000000001 287.4 5.1 299.4 37.1999999999999C307.4 58.6999999999999 310.1 80.9999999999999 310.4 103.6999999999999C310.5 109.4999999999999 310.7 150.6999999999999 310.2 156.5L309.3 156.8C308.5 155.3 307.6 153.9 306.8 152.4C284.7 109.3 245.5 85 201.4 83.3C98.4 79.3 32 140.3 29.4 259.5C28.9 283.2 31.2 306.4 37.7 329.2C58.3 400.3 112.3 447.4 191.6 448C252.9 448.4 293.1 409.3 307.8 377.7C308.3 376.6 309.1 375.4 310.2 375.8V437.4H354.5C354.5 157.1 354.6 105.2 354.6 105.2C354.5 26.7 327.9000000000001 -38.5 251.6 -57C182.1 -73.9 92.6 -61.8 55.6 0.2C47.6 13.7 43.8 28.5 42.6 44.7zM188.9 411.5C136.4 412 80.4 370.8 73.9 277.7C69.8 218.7 88.7 155.5 145.4 129.1C173 116.2000000000001 219.7 114.1 253.7 137.8C301.3 171 316.4 234.8 308.5 291.8C298.8 362.9 260.7 411.8 188.9 411.5z" /> + <glyph glyph-name="goodreads" + unicode="" + horiz-adv-x="448" d=" M299.9 256.8C305 219.5 295.2 177.8 264 156.1C241.7 140.6 211.2 142 193.2 150.4C156.1 167.7000000000001 143.7 209 146.4 247.6C150.7 308.5 187.3 335.5 221.7 335.1C268.6 335.3 293.5 303.3 299.9 256.8zM448 360V24C448 -6.9 422.9 -32 392 -32H56C25.1 -32 0 -6.9 0 24V360C0 390.9 25.1 416 56 416H392C422.9 416 448 390.9 448 360zM330 134.8S329.9 168.8 329.9 352.1H300.9V311.8C300.1 311.5 299.7 312.3 299.3 313C289.7 333.7 263.4 359.3 223.3 359C171.4 358.6 136.1 327.8 122.7 281.2C118.4 266.3 116.9 251.1 117.2 235.6C118.9 157.7 162.3 117.8 229.6 120.4C258.5 121.5 284.1 137.4 298.6 165.6C299.1 166.6 299.7 167.5 300.3 168.5C300.5 168.3999999999999 300.7 168.3999999999999 300.9 168.3C301.2 164.5 301.1 137.6 301 133.8C300.8 119 299 104.3 293.8 90.3C286 69.3 271.5 55.6 249.3 50.8C231.5 46.9 213.7 46.9999999999999 196.1 51.9999999999999C174.6 58.1 159.6 70.9999999999999 155 93.8C154.7 95.4 153.7 95.1 152.7 95.1H125.9C126.7 84.4999999999999 129.1 74.8 134.4 65.9C158.6 25.4 217.1 17.4 262.6 28.5C312.5 40.8 329.9000000000001 83.4 330 134.8z" /> + <glyph glyph-name="google-drive" + unicode="" + horiz-adv-x="512" d=" M339 133.1L175.4 416H336.6L500.2 133.1H339zM201.5 109.5L120.9 -32H431.4L512 109.5H201.5zM154.1 380.6L0 109.5L80.6 -32L237 239.2L154.1 380.6z" /> + <glyph glyph-name="google-play" + unicode="" + horiz-adv-x="512" d=" M325.3 213.7L104.6 435L385.4 273.8L325.3 213.7zM47 448C34 441.2 25.3 428.8 25.3 412.7V-28.6C25.3 -44.7 34 -57.1 47 -63.9L303.6 192.1L47 448zM472.2 222.4L413.3 256.5L347.6 192L413.3 127.5L473.4 161.6C491.4 175.9 491.4 208.1 472.2 222.4zM104.6 -51L385.4 110.2L325.3 170.3L104.6 -51z" /> + <glyph glyph-name="google-plus-g" + unicode="" + horiz-adv-x="640" d=" M386.061 219.504C387.895 209.812 389.204 200.12 389.204 187.548C389.204 77.795 315.599 0 204.8 0C98.716 0 12.8 85.915 12.8 192S98.716 384 204.8 384C256.664 384 299.8830000000001 365.141 333.411 333.708L281.2850000000001 283.678C267.1400000000001 297.299 242.2570000000001 313.277 204.8 313.277C139.316 313.277 85.88 259.056 85.88 192C85.88 124.944 139.316 70.723 204.8 70.723C280.761 70.723 309.313 125.468 313.765 153.496H204.8V219.505H386.0610000000001zM571.467 213.067V268.8H515.466V213.067H459.733V157.066H515.466V101.333H571.467V157.066H627.2V213.067H571.4670000000001z" /> + <glyph glyph-name="google-plus-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM164 92C108.7 92 64 136.7 64 192S108.7 292 164 292C191 292 213.5 282.2 231 265.8L203.9 239.7C196.5 246.8 183.6 255.1 164.1 255.1C130 255.1 102.2 226.9000000000001 102.2 191.9C102.2 157.0000000000001 130 128.7000000000001 164.1 128.7000000000001C203.7 128.7000000000001 218.5 157.2000000000001 220.9 171.8000000000001H164V206.2000000000001H258.4C259.4 201.2000000000001 260 196.1000000000001 260 189.6000000000001C260 132.5000000000001 221.7 92.0000000000001 164 92.0000000000001zM384 173.8H355V144.8H325.8V173.8H296.8V203H325.8V232H355V203H384V173.8z" /> + <glyph glyph-name="google-plus" + unicode="" + horiz-adv-x="496" d=" M248 440C111.1 440 0 328.9 0 192S111.1 -56 248 -56S496 55.1 496 192S384.9 440 248 440zM177.3 68C108.5 68 53.3 123.5 53.3 192S108.5 316 177.3 316C208.6 316 237.4 305 260.3 283.7L226.7 251.1C213.5 264 195.4 270.2 177.3 270.2C134.4 270.2 100.1 234.7 100.1 192.1S134.3 114 177.3 114C209.9 114 242.2 133.1 247.4 167.3H177.3V209.9H294.2000000000001C295.5000000000001 203.1 296.1 196.3 296.1 189.2C296.1 118.4 248.6 68 177.3 68zM407.5 174.2V138.7H372V174.2H336.5V209.7H372V245.2H407.5V209.7H442.7V174.2H407.5z" /> + <glyph glyph-name="google-wallet" + unicode="" + horiz-adv-x="448" d=" M156.8 321.2C194.4 260.6 221 208.1 241.1 158.7C232.8 124.9 222.3 92.2 209.8 60.4C196.6 112.7 183.3 161.7 153.8 208.9C160.3 245.3 156.1 282.5 156.8 321.2zM109.3 248H16.1C9.6 248 5.6 240.5 9.6 235.3C51.8 181 81.3 117.5 101.3 48H204.8C188.6 117.7 166.1 181.7 122.3 241.5C119.3 245.5 114.3 248 109.3 248zM157.1 336C225.6 228 287.1 101.5 295.3 -32H409C397 106 340.6 233 265.8 336H157.1zM408.9 404.5C407.1 411.3 400.7 416 393.7 416H305.4C300.1 416 296.4 411 297.6 405.7C310.8 359.2 319.9 310.2 324.1 259.7C372.3 173.5 403.8 81.4 414.7 -11.1C430.5 49.4 440 122.4 440 191.9C440 265.5 427.8999999999999 337 408.8999999999999 404.5z" /> + <glyph glyph-name="google" + unicode="" + horiz-adv-x="488" d=" M488 186.2C488 44.7 391.1 -56 248 -56C110.8 -56 0 54.8 0 192S110.8 440 248 440C314.8 440 371 415.5 414.3 375.1L346.8 310.2C258.5 395.4 94.3 331.4 94.3 192C94.3 105.5 163.4 35.4 248 35.4C346.2 35.4 383 105.8 388.8 142.3H248V227.6H484.1C486.4 214.9 488 202.7 488 186.2z" /> + <glyph glyph-name="gratipay" + unicode="" + horiz-adv-x="496" d=" M248 440C111.1 440 0 328.9 0 192S111.1 -56 248 -56S496 55.1 496 192S384.9 440 248 440zM362.6 213.6L249.6 60.9L136.9 213.6C128.2000000000001 225.5 117.8000000000001 264 150.5 285.6C178.6 303.7 205.1 289.8 219 273.7C234.9000000000001 255.8 265.6 256.8 280.7000000000001 273.7C294.6 289.8 321.1 303.7 348.8000000000001 285.6C381.7000000000001 264 371.4000000000001 225.6 362.6000000000001 213.6z" /> + <glyph glyph-name="grav" + unicode="" + horiz-adv-x="512" d=" M301.1 236C305.5 231.6 305.5 224.1 301.1 219.7L291.4000000000001 210C287.0000000000001 205.3 279.5000000000001 205.3 274.8 210L264.3 220.5C259.9000000000001 225.2 259.9000000000001 232.4 264.3 237.1L274 246.8C278.4 251.2 285.9 251.2 290.6 246.8L301.1 236zM270.9000000000001 255.7C273.9000000000001 258.7 273.9000000000001 263.5 270.9000000000001 266.2C268.1 269.2 263.4000000000001 269.2 260.4000000000001 266.2C257.6 263.4 257.6 258.7 260.4000000000001 255.7C263.5000000000001 252.9 268.2000000000001 252.9 270.9000000000001 255.7zM244.9000000000001 250.4C241.9000000000001 247.6 241.9000000000001 242.9 244.9000000000001 240.2C247.7000000000001 237.2 252.4000000000001 237.2 255.4000000000001 240.2C258.2000000000001 243 258.2000000000001 247.7 255.4000000000001 250.4C252.4000000000001 253.4 247.7000000000001 253.4 244.9000000000001 250.4zM317.4000000000001 263.7C297.5000000000001 278.1 283.6 306.9 305.5000000000001 331.8C327.1000000000001 356.7 346.2000000000001 349 365.3000000000001 331C377.2000000000001 319.7 394.6000000000001 306.1 382.5000000000001 282.8C370.0000000000001 259.3 337.4000000000001 249.6 317.4000000000001 263.7zM365.1 308.2C356.2000000000001 318.2 341.8 301.3 349.6 292.1C357 283.1 381.7000000000001 289.7 365.1 308.2zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM437.8 149.4C440.3 165.5 417.6 166 412.6 175.1C399 199.2 384.9000000000001 211.9 358.1 205.5C369.7000000000001 213.5 381.6 211.6 381.6 211.6C381.9000000000001 218 381.6 224.6 372.2000000000001 236.5C376.1 249 372.5000000000001 258.9 372.5000000000001 258.9C388.0000000000001 267.5 399.3000000000001 283.3 401.6000000000001 302.1C405.2000000000001 333.1 382.8000000000001 361.3 351.8000000000001 364.9C329.7000000000001 367.4 308.1000000000001 357.2 297.5000000000001 339.2C274.3000000000001 299.1 298.9000000000001 268.3 319.9000000000001 257.8C305.5000000000001 259.2 285.6 269.7 279.8 292.1C273.2 317.8 282.6 341.9 288.7 353.5C288.7 353.5 284.3 359.3 280.7 362.4C280.7 362.4 266.9 362.4 256.1 357.1C268 372.3 281.3 371.5 281.3 371.5C281.3 377.9 280.7 386.4 277.7 393.1C272.3 404.1 253.8999999999999 406 246 390.3C246.1 390.5 246.3 390.7 246.4 390.8C241.4 378.9 245.3 334.9 263.3 303.6C260.8 302.2 254.2 297.5 250.3 293.6C228.7 283.9 194.1 233.3 194.1 233.3C165.9 222.5 116.9 182.4 123.5 153.6C123.8 150.6 124.9 148.1 126.5 146.1C123.7 143.9 121 141.1 118.2 137.8C106.3 124 112.9 102.6 135.9 113.4C151.7 120.6 165.5 133.6 172.2 143.8C172.2 143.8 166.7 148.8 155.9 148.2C183.6 154.8 190.2 157.6 202.1 157.3C210.1 153.4 210.1 191.6 210.1 191.6C210.1 206.3 207.9 222.6 199 233.1C211.5 220.9 228.1 200.4 227 172.5C226.2 154.2 211.8 149.5 211.8 149.5C202.7 132.9 168.6 83.6 181.4 43.5C181.4 43.5 171.7 58.4 171.2 65.6C153.8 46.2 124.7 13.3 146.6 1.1C173.2 -13.6 255.4 89.7000000000001 272.8 143.4C307.4000000000001 164.2000000000001 328.2 190.7000000000001 336.7 208.4C358.7 164.9 432 113.9 437.8 149.4z" /> + <glyph glyph-name="gripfire" + unicode="" + horiz-adv-x="384" d=" M171.8 -55.8C171.8 -50.5 176.6 -43.6 176.6 -33.5C176.6 -18.3 163.6 6.4 98.5 53.1C64.2 82.2 32 111.6 32 161.4C32 276.1 179.1 337.9 179.1 430C179.1 433.3 178.9 436.7 178.5 440C183.6 437.6 217.6 396.7 217.6 349.6C217.6 269.1 112.5 220.4 112.5 146.6C112.5 119.7000000000001 129.1 99.4 145.1 77.1C167.6 46.9 189.3 20.2 189.3 -9.4C189.2 -23.9 184.9 -39.1 171.8 -55.8zM317.8 185.6C319.3 177.2000000000001 320 169 320 161C320 109.2 290.6 63.5 252.7 24.2C251.7 23.2 250.5 21.8 249.5 21.8C245.9 21.8 214 63.4 214 75C214 75 255.8 130.7 255.8 171.9C255.8 182.7 253.1 193.6 246.7 205.3C245.2 173 191 117.6 188.6 117.6C185.9 117.6 170.7 139.6 170.7 159.7C170.7 165 171.7 170.4 173.9 175.5C176.3 181 230.5 247.5 230.5 292.2C230.5 298.4 229.5 304.2 227.1 309.3L223.1 316.5C239.8 310 305.7 252.4 317.8 185.6" /> + <glyph glyph-name="grunt" + unicode="" + horiz-adv-x="384" d=" M61.3 258.7C60.2 248.7 66.5 239.6 66.5 239.6C67.2 247.1 68.7 252.4 70.5 256.2C70.9 245.9 73.7 232.7 83.3 222.1C90.2 214.5 118.9 198.8 138.2 216C139.2 213.6 140.3 210.7 141.2 207.5C144.1 197.2 138.5 182.2 138.5 182.2S153.6 199.3 152.4 214.7C163.2 215.2 173.8 223.1 173.5 234.2C173.5 234.2 154.6 223.8 138 243C128.3 254.2 97.1 285 54.9 274.8C59.2 273.8 63.8 272.4 68.4 270.7000000000001H68.3C64.1 268.7000000000001 61.8 263.6 61.3 258.7000000000001zM89.6 260.5C109.1 249.5 127 234.8 134.5 223.5C128.8 220.2 112.8 213.1 96.5 225.2C86.2 232.8 86.7 251.4 89.6 260.5zM168.8 26.8C171 24.5 170.3 21.5 169.7 20C168.6 17.3 164.2 8.4 156.7 0.2C154 -2.7 150.1 -4.4 145.7 -4.4C141.4 -4.4 137 -2.8 133.9 -0.1C131.6 2 123.7 9.4 120.2 18.5C118.9 21.9 119.2 24.6 121.1 26.6C122.4 27.9 125.1 29.5 130.6 29.5H160C164.1 29.5 167 28.6 168.8 26.8zM231.7 214.7C230.5000000000001 199.2 245.6 182.2000000000001 245.6 182.2000000000001S240.0000000000001 197.2000000000001 242.9000000000001 207.5000000000001C243.8000000000001 210.7000000000001 244.9000000000001 213.5000000000001 245.9000000000001 216.0000000000001C265.2000000000001 198.7000000000001 293.9000000000001 214.5000000000001 300.7000000000001 222.1000000000001C310.3000000000001 232.7000000000001 313.0000000000001 245.9000000000001 313.5000000000001 256.2000000000001C315.3000000000001 252.4000000000001 316.9000000000001 247.1000000000001 317.5000000000001 239.6000000000001C317.5000000000001 239.6000000000001 323.9000000000001 248.7000000000001 322.7000000000001 258.7000000000001C322.1 263.7000000000001 319.8000000000001 268.7000000000001 315.7000000000001 270.5000000000001H315.6C320.2000000000001 272.3000000000001 324.8 273.7000000000001 329.1 274.6C286.8 284.8000000000001 255.7 254.0000000000001 246.0000000000001 242.8000000000001C229.3000000000001 223.6000000000001 210.5 234.0000000000001 210.5 234.0000000000001C210.3000000000001 223.1 220.9 215.1 231.7 214.7zM249.5000000000001 223.5C257 234.9000000000001 274.9000000000001 249.5000000000001 294.4000000000001 260.5C297.4000000000001 251.4000000000001 297.8 232.8000000000001 287.4000000000001 225.1C271.1 213 255.2000000000001 220.1 249.5000000000001 223.5C249.4000000000001 223.4 249.5000000000001 223.5 249.5000000000001 223.5zM263 26.6C264.9 24.7 265.2 22 263.9 18.7C260.4 9.8000000000001 252.5 2.6 250.2 0.6C247.1 -2 242.8 -3.6 238.4 -3.6S230.1 -1.9999999999999 227.4 0.9C219.9 8.9 215.4 17.6 214.4 20.2C213.8 21.7 213.1 24.6 215.3 26.9C217 28.7 220 29.6 224.2 29.6H253.6C259 29.5 261.7 27.9 263 26.6zM164.7 278.1C174.6 272.1 183.5 270 192 269.8C200.5 270 209.4 272.1 219.3 278.1C219.3 278.1 204.8 260.4000000000001 192.1 260.3H191.9C179.2000000000001 260.5 164.7000000000001 278.1 164.7000000000001 278.1zM349.2 130.7000000000001C346.8 112.8000000000001 336.2 96.9 324.6 87.0000000000001C321.5 109.7000000000001 320.9 142.5000000000001 320.9 149.4C320.9 164.1 330.4 173.9 333.1 175.5000000000001C335.6 177.0000000000001 338.5 178.5000000000001 341.4 180.1000000000001C359.4 189.7000000000001 381.8 201.7000000000001 381.8 223.8000000000001C381.8 240.0000000000001 372.5 247.0000000000001 366.4 251.6000000000001C365.6 252.2000000000001 364.9 252.7000000000001 364.2 253.3000000000001C362.1 255.0000000000001 360.5 256.3000000000001 359.9 257.7000000000001C355.5 267.5000000000001 356.3 291.9000000000001 358.2 295.3000000000001C358.8 295.9000000000001 374.9 316.2000000000001 370 334.5000000000001C368 341.9000000000001 363.1 347.8000000000001 355.9 351.5000000000001C350.6 354.2000000000001 344 355.7000000000001 336.4 356.0000000000001C336.3 358.0000000000001 335.9 359.9000000000001 335.5 361.9000000000001C334.9 364.5000000000001 334.4 367.2000000000001 334.6 370.0000000000001C335 374.7000000000001 335.4000000000001 379.0000000000001 336.8 381.3000000000001C345.2 394.6000000000001 365.6 398.9000000000001 365.8 398.9000000000001L378.1 401.3000000000001L370 410.8000000000001C369.9 411.0000000000001 352.7 428.3000000000001 323.7 428.3000000000001C315.8 428.3000000000001 307.7 427.0000000000001 299.6 424.4000000000001C275.4 416.6000000000001 256.7 393.9000000000001 250.2 385.1000000000001C247.1 386.1000000000001 243.9 387.0000000000001 240.6 387.8000000000001C236.4 403.6000000000001 249.6 426.3000000000001 249.6 426.3000000000001S236 429.3000000000001 215.9 411.1000000000001C213.3 417.6000000000001 207.8 431.6000000000001 214.1 448.3000000000001C184.6 437.9 177.2 422 175 407.6C167.4 413 168.3 430.7 167.8 435.2C160.3 434.3 138.6 413.3 139.6 386.9C137.6 386.4 135.7 385.8 133.7 385.2C127.2 394 108.6 416.7 84.3 424.5C76.4 426.7 68.3 428 60.4 428C31.4 428 14.3 410.7 14.1 410.5L6 401.1L18.3 398.7C18.5 398.7 38.9 394.4 47.3 381.1C48.7 378.9 49.1 374.5 49.5 369.8C49.7 367 49.1 364.3 48.6 361.7C48.2 359.8 47.8 357.8 47.7 355.8C40 355.5 33.5 354 28.2 351.3C21 347.6 16.1 341.7 14.1 334.3C9.1 316.1 25.3 295.8 25.9 295.1C27.8 291.7 28.6 267.3 24.2 257.5C23.6 256.1 22 254.8 19.9 253.1C19.2 252.6 18.5 252 17.7 251.4C11.6 246.8 2.3 239.7 2.3 223.6C2.3 201.5 24.7 189.5 42.7 179.9C45.7 178.3 48.5 176.8 51 175.3C53.7 173.6999999999999 63.2 163.9 63.2 149.1999999999999C63.2 142.3 62.6 109.4999999999999 59.5 86.8C47.9 96.6999999999999 37.3 112.6999999999999 34.9 130.6C34.9 130.6 5.7 107.9999999999999 14.3 59.8C19.5 30.3 37.5 13.6999999999999 61.3 5.1C70.1 -14.0000000000001 90.7 -40.6 128.6 -44.5000000000001C143 -56.3 163 -64 192.2 -64H192.4C221.5 -64 241.5 -56.3 256 -44.5C293.9 -40.6 314.5 -14 323.3 5.1C347.1 13.8 365 30.3 370.3 59.8C378.5 108.2 349.2 130.7000000000001 349.2 130.7000000000001zM305.7 410.3C311.3 412.1 317.3 413 323.4 413C334.4 413 343.3 410 348.1 408C345 406.6 341.7 404.8 338.4 402.7C336 403.1 332.8 403.5 329.2 403.5C318.7 403.5 308.7 400.4 300.5 394.6C288.2 385.9 282.5 377.7 279.8 372.2C277.6 373.5 275.3 374.7 272.7 375.9C271.1 376.7 269.6 377.4 268 378.1C274.1 387.2 287.9 404.6 305.7 410.3zM326.7 392.1C325.9 391.1 325.1 390 324.4 388.9C321.1 383.7 320.5 377.3 320 371.1C319.5 364.7 318.9 358.6 315.6 354.1C311.4000000000001 353.3 307.5 352.4 304.1 351.4C301.8 354.5 298.5 358.4 293.6 362.6C295 367.4 299.1 378.7 307.1 385.1C312.7000000000001 389.4 319.3 391.8 326.7000000000001 392.1zM45.6 402.7C42.3 404.9 39 406.7 35.9 408C40.7 410 49.6 413 60.6 413C66.7 413 72.6 412.1 78.3 410.3C96.1 404.5 109.9 387.1 116 378.2C114.4 377.5 112.8 376.8 111.2 376C108.7 374.8 106.3 373.5 104.1 372.3C101.5 377.7 95.8 386 83.4 394.7C75.1 400.5 65.2 403.6 54.6 403.6C51.2 403.5 48 403.1 45.6 402.7zM90.3 362.6C85.4 358.4 82 354.6 79.8 351.4C76.4 352.3 72.5 353.3 68.3 354.1C65 358.5 64.5 364.6 64 371C63.5 377.2 62.9 383.6 59.6 388.8C58.9 389.9 58.1 391 57.3 392C64.7 391.7 71.3 389.4 76.8 385C84.8 378.7 88.9 367.4 90.3 362.6zM58.1 188.1C55.4 189.7000000000001 52.5 191.2000000000001 49.7 192.7C34.8 200.7 19.5 209 19.5 223.2C19.5 234.3 23.8 237.8 28.4 241.4L28.9 241.8C29.6 242.4 30.3 243 31.1 243.6C30.2 236.4000000000001 29.2 230.3 28.4 228.7C28.4 228.7 40.5 243.7 44.1 273C45.5 284.5 43 307.3 39 316C39.2 311.1 39 306.2 38.7 301.6C38.3 302.4 37.9 303.2 37.4 303.8C34.2 307.8 25.6 321.3 28 330.4C28.9 333.9 31.1 336.4 34.7 338.2C38.5 340.1 43.5 341.1 49.8 341.1C62.1 341.1 75.7 337.4 82.7 335.1C107.8 327.1 138.1 304.2 146.8 297.4C147 297.2 147.2 297.1 147.2 297.1L152.8 293.2L149.3 299C149.1 299.3 130.2 330.4 96.1 345.5C98.1 348.4 103.5 353.6 117.7 360.6C139.1 371.1 164.2 376.4 192 376.4C219.9 376.4 244.9 371.1 266.3 360.6C280.5 353.7 285.9000000000001 348.4 287.9000000000001 345.5C253.9000000000001 330.4 235.0000000000001 299.3 234.8000000000001 299L231.3000000000001 293.2L236.9000000000001 297.1S237.1 297.2 237.3000000000001 297.4C246.0000000000001 304.2 276.3000000000001 327.2 301.4000000000001 335.1C308.4000000000001 337.3 322.0000000000001 341.1 334.3 341.1C340.6 341.1 345.6 340.1 349.4000000000001 338.2C352.9000000000001 336.4 355.1 333.8 356.1 330.4C358.6 321.3 350 307.8 346.7000000000001 303.8C346.2000000000001 303.2 345.8000000000001 302.5 345.4000000000001 301.6C345.1 306.2 344.9000000000001 311.1 345.1 316C341.1 307.2 338.6 284.5 340 273C343.6 243.7 355.7 228.7 355.7 228.7C354.9 230.3 353.9 236.4 353 243.6C353.7 243 354.5 242.4 355.2 241.8L355.7 241.4C360.3 237.7 364.6 234.3 364.6 223.2C364.6 209 349.2 200.7 334.4 192.7C331.5 191.2 328.7 189.6 326 188.1C317.3 183.1 308 171.4 306.9 153.9C306 139.3 307.8 104 310.3 78C297.9 73.2 283.6 71.6 270.6 71.2C268.6 75.3 266.7 79.7 265.1 84.3C264.4 86.3 245.5 135.4 238.7 146.5C244.2 107.5 256.2 72.8 262.2 56.9C258.7 57.4 254.8999999999999 57.6 250.5 57.6H133.5C129.0999999999999 57.6 125.2 57.3 121.8 56.9C127.8 72.8 139.9 107.5 145.3 146.5C138.5 135.3 119.6 86.2 118.9 84.3C117.3 79.7 115.4 75.3 113.4 71.2C100.4 71.6 86.2 73.2 73.7 78C76.2 104 77.9999999999999 139.2 77.1 153.9C76.2 171.3 66.8 183.1 58.1 188.1zM34.8 43.4C22.7 63.4 26.1 97.5 31.1 102.5C42 68.1 78.3 58.2 105.5 57.1C102.8 52.9 100.3 49.5 98.5 47.1L97.1 45.7C89.9 37.9 88.5 27.2 93 13.9C70.3 14.0000000000001 46.7 23.7 34.8 43.4zM80.5 -0.1C86.5 -1.2 92.7 -2 99.1 -2.5C102.6 -10.5 106.5 -18.4 111.4 -25.6C97 -19.7 87 -9.6 80.5 -0.1zM192 -50.2C131.4 -50.1 113.7 -4.4 107.1 14.5C103.4 25 103.7 32.7 108 37.6C110.9 40.9 117.5 44.8 132.6 44.8H251.4C266.5 44.8 273.2 40.9 276 37.6C280.2 32.8 280.5 25 276.9 14.5C270.3 -4.3 252.6 -50.1 192 -50.2zM272.6 -25.6C277.5 -18.4 281.4000000000001 -10.4999999999999 284.9000000000001 -2.4999999999999C291.3 -1.9999999999999 297.5000000000001 -1.1999999999999 303.5000000000001 -0.1C297.0000000000001 -9.6 287.0000000000001 -19.7 272.6000000000001 -25.6zM349.2000000000001 43.4C337.2000000000001 23.7 313.6 14.1 291.1 13.7C295.6 27.0000000000001 294.2000000000001 37.8000000000001 287 45.5000000000001C286.6 46.0000000000001 286.1 46.5000000000001 285.6 47.0000000000001C283.8 49.4 281.3 52.8000000000001 278.6 57.0000000000001C305.8 58.2000000000001 342.1 68.0000000000001 353 102.4C358 97.4 361.4 63.3 349.2 43.4z" /> + <glyph glyph-name="gulp" + unicode="" + horiz-adv-x="256" d=" M209.8 56.9L195.7 32.3L191.1 -47.9C191.1 -56.8 162.8 -64 128 -64S64.9 -56.8 64.9 -47.9L59.1 31.5L44.2 56.9C85.4 39.6 170.2000000000001 40.2 209.8000000000001 56.9zM13.8 310.2L27.4 184.7C33.3 204.7 48.2 231.7 67.4 239.9C73.7 242.6 80.1 242.6 86.1 239C91.3 236 95.7 229.7 96.2 227.2C97.4 220.7 94.2 218.1 91.7 218.1C88.7 218.1 86.4 222.7 84.9 225.4C80.8 232.7 74.6 233 68 228.2C61.1 223.2 55.1 214.8 50.9 207.5C45.8 198.7 41.5 189 38.9 179.3C37.4 173.7 36 164.7 38.3 159.4C39.3 157.2000000000001 40.8 155.8 43.2 155.8C48.2 155.8 55.5 162.4 59 165.9C63.5 170.4 69.3 177.4 71.5 181.9L76.7 197.4C79.3 204.2000000000001 86.6 203 86.6 197.4C86.6 187.2000000000001 82.9 183.8 76.6 162.7000000000001C70.8 143.2000000000001 69 136.9 69 136.9C68.3 134.1 65.6 129.4 62.7 129.4C61.5 129.4 60.6 129.8 60.1 130.6C59.1 132 59.2 135.9 59.3 136.9C59.5 140.1 65.6 159.1 66.6 162.1C64.6 159.9 62.5 157.7000000000001 60.2 155.5C54.8 150.4 46.1 143.7 38.7 143.7C35.3 143.7 33.1 144.6 31 146.1L38.6 66.5C40.6 61.5 77.8 49.4 126.8 49.4C175.9 49.4 213.1 61.6 215 66.5L225.9000000000001 161.1C220.2000000000001 155.9 213.6 149.5 206.3000000000001 146.3C200.9 144 188.9 142.5 188.9 152C188.9 157.2 198 166.8 203.3000000000001 173.5C204.7000000000001 175.2 208 179.4 208 181.6C208 184.5 202 183.8 196.3000000000001 179.1C193.1000000000001 176.4 190.1000000000001 172.8 187.6000000000001 169.4C183.3000000000001 163.4 181.0000000000001 158.2000000000001 179.1000000000001 153.9C172.9000000000001 139.7000000000001 175.0000000000001 145.3 170.0000000000001 131.9C165.0000000000001 118.6 165.8000000000001 120.1 164.8000000000001 117.9C163.9000000000001 116.0000000000001 162.6000000000001 114.4 160.8000000000001 113.4C158.9000000000001 112.4 156.3000000000001 112.5000000000001 154.7000000000001 113.7000000000001C153.8000000000001 114.3000000000001 153.4000000000001 115.6 153.4000000000001 117.4C153.4000000000001 118.3 153.5000000000001 119.2000000000001 153.7000000000001 120.1C155.2000000000001 126.2000000000001 161.5000000000001 138.2000000000001 168.7000000000001 154.4C170.3000000000001 158.1 169.7000000000001 157.0000000000001 169.5000000000001 156.7000000000001C163.3000000000001 150.7000000000001 158.6000000000001 147.8000000000001 155.1000000000001 146.2000000000001C149.3000000000001 143.6 142.1000000000001 143.6 140.6000000000001 150.3000000000001C140.5000000000001 150.7000000000001 140.5000000000001 151.1000000000001 140.4000000000001 151.5000000000001C128.6000000000001 142.3000000000001 116.1000000000001 139.8000000000001 120.4000000000001 159.6000000000001C115.8000000000001 151.4000000000001 107.8000000000001 144.7000000000001 98.0000000000001 144.7000000000001C93.9000000000001 144.7000000000001 90.9000000000001 146.1000000000001 89.4000000000001 149.8000000000001C87.1000000000001 155.3000000000001 90.7000000000001 164.7000000000001 94.0000000000001 173.6000000000001C95.7000000000001 178.1000000000001 98.0000000000001 183.5000000000001 101.1000000000001 189.8000000000001C102.7000000000001 193.2000000000001 105.3000000000001 195.2000000000001 108.7000000000001 194.3000000000001C109.3000000000001 194.1000000000001 109.8000000000001 193.9000000000001 110.3000000000001 193.6000000000001C112.9000000000001 191.8000000000001 111.9000000000001 189.1000000000001 110.6000000000001 186.4000000000002C106.8000000000001 178.9000000000002 103.5000000000001 173.4000000000002 101.3000000000001 165.6000000000001C100.4000000000001 162.3000000000001 99.3000000000001 156.6000000000001 102.8000000000001 156.6000000000001C105.2000000000001 156.6000000000001 107.5000000000001 157.4000000000002 109.7000000000001 159.0000000000001C114.3000000000001 162.4000000000001 118.0000000000001 167.5000000000001 120.8000000000001 172.5000000000001C122.8000000000001 176.1000000000001 125.2000000000001 180.8000000000001 126.4000000000001 184.8000000000001C126.9000000000001 186.5000000000001 127.5000000000001 188.1000000000001 128.2000000000001 189.6000000000001C129.3000000000001 192.1000000000001 130.8000000000001 194.7000000000001 133.4000000000001 194.7000000000001C134.7000000000001 194.7000000000001 135.8000000000001 194.2000000000001 136.6000000000001 193.2000000000001C138.3000000000001 191.0000000000001 137.9000000000001 188.7000000000002 137.0000000000001 186.3000000000001C135.0000000000001 180.7000000000001 132.3000000000001 175.7000000000001 130.1000000000001 169.6000000000001C128.8000000000001 166.1000000000001 127.4000000000001 161.6000000000001 127.4000000000001 157.9000000000002C127.4000000000001 154.5000000000002 131.1000000000001 155.3000000000001 134.2000000000001 156.7000000000002C136.6000000000001 157.8000000000002 139.0000000000001 159.5000000000002 141.0000000000001 161.2000000000002C142.2000000000001 166.1000000000001 141.9000000000001 165.0000000000002 167.4000000000001 229.4000000000002C168.7000000000001 232.7000000000002 171.1000000000001 234.1000000000002 173.5000000000001 234.1000000000002C174.7000000000001 234.1000000000002 175.7000000000001 233.7000000000002 176.7000000000001 233.0000000000002C178.4 231.7000000000002 178.4 228.9000000000002 177.7000000000001 226.8000000000002C177.0000000000001 224.9000000000002 177.1000000000001 225.5000000000002 173.2000000000001 216.3000000000002C168.0000000000001 204.2000000000002 164.6000000000001 195.5000000000002 160.0000000000001 184.4000000000002C158.1000000000001 179.8000000000001 152.3000000000001 165.5000000000002 151.3000000000001 162.1000000000001C150.7000000000001 159.9000000000002 150.0000000000001 156.3000000000001 152.3000000000001 156.3000000000001C157.7000000000001 156.3000000000001 171.6000000000001 169.4000000000002 175.4000000000001 173.3000000000001C175.6000000000001 173.6000000000001 175.9000000000001 173.7000000000001 176.3000000000001 173.9000000000002C176.9000000000001 175.8000000000001 177.5000000000001 177.6000000000001 178.0000000000001 179.4000000000002C179.4000000000001 183.2000000000002 180.7000000000001 187.6000000000001 183.3000000000001 190.7000000000002C184.1000000000001 191.7000000000002 185.0000000000001 192.3000000000002 186.0000000000001 192.3000000000002C188.8000000000001 192.3000000000002 190.2000000000001 191.1000000000001 190.2000000000001 188.3000000000002C190.2000000000001 187.2000000000002 189.5000000000001 183.2000000000002 189.1000000000001 182.1000000000002C190.5000000000001 183.6000000000002 192.0000000000001 185.1000000000002 193.6000000000001 186.6000000000002C208.6000000000001 200.5000000000002 219.3000000000001 193.4000000000002 219.3000000000001 186.4000000000002C219.3000000000001 179.0000000000002 210.4 168.7000000000002 205.5 163.0000000000002C203.9 161.1000000000003 200.6 157.6000000000003 200.5 156.6000000000003C200.5 155.3000000000003 201.4 154.8000000000003 202.7 154.8000000000003C204.7 154.8000000000003 209.1 158.3000000000003 210.7 159.5000000000002C215.7 163.4000000000002 222.5 169.4000000000002 227.3 173.6000000000003L242.1 310.4000000000003C211.6 293.3000000000003 44.5 293.2000000000003 13.8 310.2000000000003zM243.5 318.7C243.5 297.7 12.3 297.7 12.3 318.7C12.3 327.5 64.1 334.6 127.9 334.6C136.9 334.6 145.7 334.5 154.2 334.2L166.8 382.9L228.1 447.4C229.5 448.8 233.9 447.6 238 443.9S244.6 436 243.3 434.6L243.2 434.5L185.9 374L175.9 333.3C215.8 330.7 243.5 325.2 243.5 318.7zM174.1 314.1C174.1 314.9 173.2 315.6 171.6 316.2L171.4 315.4C171.4 314.1 166.4 313 160.3 313S149.2 314.1 149.2 315.4C149.2 315.5 149.2 315.6 149.3 315.7L149.5 316.4C147.7 315.8 146.5 315 146.5 314.1C146.5 312 152.7 310.4 160.2 310.4C167.9 310.3 174.1 312 174.1 314.1z" /> + <glyph glyph-name="hacker-news-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM21.2 218.8H21C21.1 218.9 21.2 219.1 21.3 219.2C21.3 219.1 21.3 218.9 21.2 218.8zM239.2 164.9V64H207.8V166.7L128 320H165.3C217.8 221.7 214.5 218.8 224.6 194.4C236.9000000000001 221.4 230.4000000000001 218.8 285.2000000000001 320H320L239.2 164.9z" /> + <glyph glyph-name="hacker-news" + unicode="" + horiz-adv-x="448" d=" M0 416V-32H448V416H0zM21.2 218.8H21C21.1 218.9 21.2 219.1 21.3 219.2C21.3 219.1 21.3 218.9 21.2 218.8zM239.2 164.9V64H207.8V166.7L128 320H165.3C217.8 221.7 214.5 218.8 224.6 194.4C236.9000000000001 221.4 230.4000000000001 218.8 285.2000000000001 320H320L239.2 164.9z" /> + <glyph glyph-name="hips" + unicode="" + horiz-adv-x="640" d=" M0 367.8C0 369.6 0.9 370.5 2.7 370.5H43.6C45.5 370.5 46.4 369.6 46.4 367.8V286.6C61.6 294.3 78.1 298.1 96.2 298C120.2 297.9 140.4 291.8 156.5 280C175.2 266.5 184.5 248.1 184.5 224.7V88.6C184.5 86.7000000000001 183.6 85.8 181.8 85.8H154.5C145.4 85.8 138.1 93.1 138.1 102.1V224.7C138.1 225.6 140.8 251.7 92.3 251.7C43.7 251.7 46.5 225.5 46.5 224.7V88.6C46.5 86.7000000000001 45.6 85.8 43.7 85.8H2.7C0.9 85.8 0 86.7 0 88.6V367.8zM497.7 146.3C511.4 136.1 531.8 127.2 556.1 127.2C579.4 127.2 588.9 131.7 592.6 140.8C595.6 148.7 592 156.9 580.4 162L526.8 185.5C505.4 194.9 492.9999999999999 209.5 489.6 229.1C483.9 262.8 511.8 282.4 512.3 282.8C525.5 292.4 544.3 298.2000000000001 570.8 298.2000000000001C589.8 298.2000000000001 608.1999999999999 294.9 625.9 288.3C627.1999999999999 287.8 627.8 287 627.8 285.7000000000001V241C627.8 238.9 625.5 237.6 623.8 238.6C584.0999999999999 259.3 547.1999999999999 250.9 539.8 245.4C533.1999999999999 240.5 533.8 232.9 542.4 229.3L600 204C616.5 196.9 628.1 185.6 634.9 169.9C640.4 157.3 641.5 144.3 638 130.8C628.4 93.9 593.1 85.3 592.4 84.9999999999999C581.9 81.8999999999999 568.8 80.6999999999999 556.1 80.6999999999999C539.5 80.6999999999999 523.5 83.3999999999999 507.9 88.8999999999999C498.2 92.2999999999999 493.3 99.1999999999999 493.3 109.5999999999999V144C493.3 146.1 495.6 147.7 497.7 146.3zM376.2 298.2C344.5 298.2 272 278.1 272 194.7V11.2C272 10.4 272.6 8.5 274.7 8.5H315.6C317.5 8.5 318.4 9.4 318.4 11.2V100C334.9 87.3 354.2 80.9 376.1 80.9C436.6 80.9 484.8 129.4 484.8 189.6C484.9 249.9 436.6 298.2 376.2 298.2zM376.2 127.3C359 127.3 344.3 133.4 332.2 145.5C320 157.6999999999999 314 172.3 314 189.5C314 224 341.6 251.7 376.2 251.7C410.7 251.7 438.4 224.0999999999999 438.4 189.5C438.5 155.1999999999999 411.1 127.3 376.2 127.3zM251.6 88.6C251.6 86.7 250.7 85.8 248.8 85.8H207.9C206.3 85.8 205.2 87.1999999999999 205.2 88.6V290.4C205.2 291.8 206.3 293.2000000000001 207.9 293.2000000000001H248.8C250.7 293.2000000000001 251.6 292.3 251.6 290.4V88.6M228.3 375.5C244.2 375.5 257.2 362.8 257.2 346.6C257.2 330.8 244.5 317.7 228.3 317.7S199.4 331 199.4 346.6C199.5 362.6 212.4 375.5 228.3 375.5" /> + <glyph glyph-name="hire-a-helper" + unicode="" + horiz-adv-x="512" d=" M443.1 448H71.9C67.9 410.7 37.4 380.2 0 376.3V4.8C37.4 -0.1 66 -27.6 71.9 -64H444.1C447.1 -27.6 476.6 1.8 512 5.8V376.3C475.6 382.2 447 411.6 443.1 448zM406.1 43.1C369.8 43.1 387.3 45.1 351 45.1C315.2 45.1 330 43.1 294.9 43.1C289 43.1 290 51.3 294.9 52.9C317.7 60.5000000000001 317.8 63.1 319.5 65.7000000000001C329.9 81.3000000000001 325.4 148.7000000000001 325.4 178.7000000000001C325.4 184.0000000000001 319 191.5000000000001 311.6 191.5000000000001H200.4C193 191.5000000000001 186.6 184.0000000000001 186.6 178.7000000000001C186.6 148.7000000000001 182.1 81.3000000000001 192.5 65.7000000000001C194.2 63.2000000000001 194.3 60.5000000000001 217.1 52.9C222 51.3 223.1 43.1 217.1 43.1C182 43.1 196.8 45.1 161 45.1C124.7 45.1 142.2 43.1 105.9 43.1C98 43.1 100.1 53.9 105.9 53.9C116.1 57.3 119.4 57.4 127.6 67.7000000000001C135.3 80.6 135.5 112.1 135.5 195.5000000000001V296.7C135.5 318.9 123.3 325 106.9 329.1C98.1 331.3 102.9 340.9 107.9 340.9C144.4 340.9 128.5 338.9 165 338.9C197.7 338.9 181.5 340.9 214.2 340.9C217.5 340.9 222.7 332.6 215.2 330.1C210.3 328.5 187.6 326.4 187.6 290.8C187.6 245.2 187.4 235 188.6 222C188.6 220.7 190.9 209.2 201.4 209.2H310.6C321.1 209.2 323.4000000000001 220.7 323.4000000000001 222C324.6 235 324.4000000000001 245.2 324.4000000000001 290.8C324.4000000000001 326.4 301.7000000000001 328.5 296.8 330.1C289.3 332.6 294.5 340.9 297.8 340.9C330.5 340.9 314.3 338.9 347 338.9C383.5 338.9 367.6 340.9 404.1 340.9C409 340.9 414 331.3 405.1 329.1C388.7000000000001 325 376.5 318.8 376.5 296.7000000000001V195.5C376.5 112.1 376.6 80.6 384.4 67.7C392.6 57.5 395.8 57.3 406.1 53.9C411.9 53.9 413.9 43.1 406.1 43.1z" /> + <glyph glyph-name="hooli" + unicode="" + horiz-adv-x="640" d=" M508.4 96H566.3V291.3L508.4 264V96zM582.1 206.5V96H640V206.5H582.1zM331.4000000000001 215.4C313.2000000000001 233.6 281.0000000000001 232.5 281.0000000000001 232.5S248.8000000000001 233.6 230.6000000000001 215.4C228.7000000000001 213.5 226.9000000000001 211.5 225.3000000000001 209.4C187.1 239 152.8000000000001 255.9 123.2000000000001 270.5V291.2L100.7000000000001 280.6C46.3000000000001 302.7 11.7 298.8 3.4 280.5C3.4 280.5 -21.4999999999999 247.7 65.3 169.6V200.6C16.5 255.2 26.3 276.7000000000001 30 279.8C43.5 291.2000000000001 67.5 287.8 94.4000000000001 277.7000000000001L65.2 264V200.7C78.3 186 95.7 169.2 118.7 150.3L123.2 146.7V176.5C123.2 183.4 124.9 194.7 134 194.7S144.6 187.8 144.6 179.7V131C162.6 118.8 181.9 108.9 202.3 101.4V195.3C202.3 214 188.9 232.7 161.7 232.7C145.9 232.8 131.2 224.5 123.2 210.8V265.1C165.1 244.2 207.1 218.6 223.1 206.8C212.9 192.2 213.8 178.6999999999999 213.8 163.1C213.8 144.4 212.4 128.8 230.6 110.6C248.8 92.4 281 93.4999999999999 281 93.4999999999999S313.3 92.3999999999999 331.4 110.6C349.6 128.8 348.1 144.4 348.1 163.1C348.1 181.6 349.6 197.3 331.4 215.4zM291.7000000000001 143.5C291.7000000000001 139.9 289.9000000000001 131 281.0000000000001 131C272.1000000000001 131 270.3000000000001 139.9 270.3000000000001 143.5V183.9C270.3000000000001 192.6 277.6000000000001 194.8 281.0000000000001 194.8C284.4000000000001 194.8 291.7000000000001 192.7 291.7000000000001 183.9V143.5zM477.4 215.4C459.2 233.6 427.0000000000001 232.5 427.0000000000001 232.5S394.7000000000001 233.6 376.6000000000001 215.4C358.4000000000001 197.2 359.8000000000001 181.5 359.8000000000001 162.8C359.8000000000001 144.1 358.4000000000001 128.5 376.6000000000001 110.3C394.8000000000001 92.1 427.0000000000001 93.2 427.0000000000001 93.2S459.3000000000001 92.1 477.4 110.3C495.6 128.5 494.2 144.1 494.2 162.8C494.1 181.6 495.5000000000001 197.3 477.4 215.4zM437.6 143.5C437.6 139.9 435.8 131 426.9000000000001 131C418.0000000000001 131 416.2000000000001 139.9 416.2000000000001 143.5V183.9C416.2000000000001 192.6 423.5000000000001 194.8 426.9000000000001 194.8C430.3 194.8 437.6 192.7 437.6 183.9V143.5zM611.1 216.5C627 216.5 640 229.4 640 245.4S627.1 269.9 611.1 269.9C595.2 269.9 582.2 261.3 582.2 245.4S595.1 216.5 611.1 216.5zM144.5 96L182.8 95.2C169.6 99.8 156.8 105.4 144.5 112V96zM123.1 96V124.6C116.6 128.8 110.1 133.3 103.7 138.2000000000001C88.9 149.4 76.2 159.9 65.2 169.7000000000001V96H123.1zM182.8 95.2C219.3 82.7 252.7 81 277.5 88C257.6 87.8 231.7 90.6 202.2 101.3V96L182.8 95.2z" /> + <glyph glyph-name="hotjar" + unicode="" + horiz-adv-x="448" d=" M414.9 286.5C340.2 419 121.1 448 121.1 448S222.2 337.6 93 250.3C11.3 195.2 -21 123.6 14 45.4C40.8 -14.5 97.5 -38.9 158.6 -48C129.4 7.1 152 74.4 154.5 81.6C211.6 -4.8 319.5 81.6 265.3 175.5C336.3 160.1 346.9 36.9 292.4000000000001 -40C372.9000000000001 -14.7 426.5 48.9 441.2000000000001 105.6C456.7 164.9 444.9000000000001 233.5000000000001 414.9000000000001 286.5z" /> + <glyph glyph-name="houzz" + unicode="" + horiz-adv-x="320" d=" M12.2 192L160 106.9L12.2 21.4V192M160 -64L307.8 21.4V192L160 106.9V-64zM160 448L12.2 362.6V192L160 277.4V448zM160 277.4L307.8 192V362.6L160 277.4z" /> + <glyph glyph-name="html5" + unicode="" + horiz-adv-x="384" d=" M0 416L34.9 20.2L191.5 -32L349.1 20.2L384 416H0zM308.2 288.1H124.4L128.5 238.7H304.1L290.5 90.3L192.6 63.3V62.9999999999999H191.5L92.8 90.3L86.8 166.1H134.5L138 128L191.5 113.5L245.2 128L251.2 190.2H84.3L71.5 335.8H312.6L308.2000000000001 288.1z" /> + <glyph glyph-name="hubspot" + unicode="" + horiz-adv-x="512" d=" M267.4 236.4C242.3 212.7 226.6 179.1 226.6 141.8C226.6 112.5 236.3 85.5 252.6 63.8L203.1 14C198.7 15.6 194 16.5 189.1 16.5C178.3 16.5 168.2 12.3 160.6 4.7C153 -2.9 148.8 -13.1 148.8 -23.9S153 -44.8 160.6 -52.4C168.2 -60.0000000000001 178.4 -64 189.1 -64C199.9 -64 210 -60.1 217.7 -52.4C225.3 -44.8 229.5 -34.6 229.5 -23.9C229.5 -19.7 228.9 -15.7 227.6 -11.8L277.6 38.4C299.6 21.5000000000001 327 11.5000000000001 356.9000000000001 11.5000000000001C428.8000000000001 11.5000000000001 486.9 69.8000000000001 486.9 141.7000000000001C486.9 206.9 439.2000000000001 260.9000000000001 376.7000000000001 270.4000000000001V332C394.2000000000001 339.4 404.9000000000001 355.8 404.9000000000001 374.9C404.9000000000001 401 384.0000000000001 422.8 357.9000000000001 422.8S311.2 401 311.2 374.9C311.2 355.8 321.9 339.4 339.4 332V270.8C324.2 268.7000000000001 309.8 264.1 296.7 257.2000000000001C269.1 278.1 179.2 342.9000000000001 127.8 382C129 386.4000000000001 129.8 391 129.8 395.8C129.8 424.6 106.3 448 77.4 448C48.6 448 25.2 424.6 25.2 395.8C25.2 366.9 48.6 343.5 77.4 343.5C87.2 343.5 96.3 346.4 104.2 351.1L267.4 236.4zM356.9 72.8C318.8 72.8 287.9 103.7 287.9 141.8S318.8 210.8 356.9 210.8S425.9 179.9 425.9 141.8S395 72.8 356.9 72.8z" /> + <glyph glyph-name="imdb" + unicode="" + horiz-adv-x="448" d=" M350.5 159.3C350.5 153.9 352.1 144.9 344.3 144.9C342.7 144.9 341.3 145.7000000000001 340.5 147.3C338.3 152.4 339.4 191.4 339.4 192C339.4 195.8 338.3 204.7 344.3 204.7C351.6 204.7 350.5 197.4 350.5 192V159.3zM265 218.1C265 227.8 266.6 234.1 254.7 234.1V150.4C266.9 150.1 265 159.1 265 168.8V218.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM21.3 219.2C21.2 219.1 21.1 218.9 21 218.8H21.3V219.2zM97 256H64V128.2H97V256zM210.3 256H167.2L159.6 196.1C156.9 216.1 154.2 236.2 150.9 256H108.1V128.2H137.1V212.7L149.3 128.2H169.9L181.5 214.6V128.2H210.2V256zM296.6 210.7C296.6 218.8 296.9000000000001 227.5 295.2000000000001 235.1C290.9000000000001 257.6 263.8000000000001 256 246.2000000000001 256H221.6000000000001V128.2C307.7000000000001 128.1 296.6 122.2 296.6 210.7zM382.5 193.4C382.5 210.7 381.7 223.5 360.3 223.5C351.4000000000001 223.5 345.4000000000001 220.8 339.4000000000001 214.3V256H307.7000000000001V128.2H337.5000000000001L339.4000000000001 136.3C345.1 129.5 351.3 126.5 360.3 126.5C380.1 126.5 382.5 141.7 382.5 157.4V193.4z" /> + <glyph glyph-name="instagram" + unicode="" + horiz-adv-x="448" d=" M224.1 307C160.5 307 109.2 255.7 109.2 192.1S160.5 77.2 224.1 77.2S339 128.5 339 192.1S287.7 307 224.1 307zM224.1 117.4C183 117.4 149.4 150.9 149.4 192.1S182.9 266.8 224.1 266.8S298.8 233.3 298.8 192.1S265.2 117.4 224.1 117.4zM370.5 311.7C370.5 296.8 358.5 284.9 343.7 284.9C328.8 284.9 316.9 296.9 316.9 311.7S328.9 338.5 343.7 338.5S370.5 326.5 370.5 311.7zM446.6 284.5C444.9000000000001 320.4 436.7000000000001 352.2 410.4000000000001 378.4C384.2000000000001 404.6 352.4000000000001 412.8 316.5 414.6C279.5 416.7 168.6 416.7 131.6 414.6C95.8 412.9 64 404.7 37.7 378.5S3.3 320.5 1.5 284.6C-0.6 247.6 -0.6 136.7 1.5 99.7C3.2 63.8 11.4 32 37.7 5.8S95.7 -28.6 131.6 -30.4C168.6 -32.5000000000001 279.5 -32.5000000000001 316.5 -30.4C352.4 -28.7 384.2 -20.5000000000001 410.4 5.8C436.6 31.9999999999999 444.8 63.8 446.6 99.6999999999999C448.7 136.6999999999999 448.7 247.5 446.6 284.5zM398.8 60C391 40.4 375.9000000000001 25.3 356.2 17.4C326.7 5.7 256.7 8.4 224.1 8.4S121.4 5.8 92 17.4C72.4 25.2 57.3 40.3 49.4 60C37.7 89.5 40.4 159.5 40.4 192.1S37.8 294.8 49.4 324.2C57.2 343.8 72.3 358.9 92 366.8C121.5 378.5 191.5 375.8 224.1 375.8S326.8 378.4 356.2 366.8C375.8 359 390.9 343.9 398.8 324.2C410.5 294.7 407.8 224.7 407.8 192.1S410.5 89.4 398.8 60z" /> + <glyph glyph-name="internet-explorer" + unicode="" + horiz-adv-x="512" d=" M483.049 288.294C493.904 312.8690000000001 504.473 348.7320000000001 504.473 376.165C504.473 448.887 424.832 474.536 294.8 414.742C187.168 421.923 83.579 341.072 57.7019999999999 228.2850000000001C88.554 263.1470000000001 135.973 310.5830000000001 179.679 329.4430000000001C125.404 281.15 79.128 219.998 43.992 156.275C23.246 118.349 0 57.06 0 11.253C0 -87.322 92.854 -75.2470000000001 180.251 -30.753C211.674 -46.183 246.81 -46.326 281.9460000000001 -46.326C379.0700000000001 -46.326 466.1950000000001 7.968 498.76 99.696H377.927C325.418 11.103 181.108 46.7 181.108 147.132H509.9C516.307 190.713 508.245 242.847 483.049 288.294zM64.559 101.123C82.27 49.973 118.262 5.252 164.825 -22.181C76.084 -71.1210000000001 -8.442 -51.277 64.559 101.1229999999999zM180.536 209.996C182.536 265.147 230.812 304.867 284.516 304.867C337.9340000000001 304.867 386.497 265.147 388.497 209.996H180.536zM365.072 397.596C386.497 407.883 413.635 419.599 437.63 419.599C469.052 419.599 491.904 397.882 491.904 365.877C491.904 345.874 484.477 316.87 477.335 298.01C451.0549999999999 340.302 411.349 379.594 365.072 397.596z" /> + <glyph glyph-name="ioxhost" + unicode="" + horiz-adv-x="640" d=" M616 288H548.7C511.2 377.3 422.9 440 320 440C183 440 72 329 72 192C72 175.6 73.6 159.5 76.7 144H24C10.7 144 0 133.2 0 120C0 106.7 10.7 96 24 96H91.3C128.8 6.7 217.1 -56 320 -56C457 -56 568 55 568 192C568 208.4 566.4 224.5 563.3 240H616C629.3 240 640 250.8 640 264C640 277.3 629.3 288 616 288zM520 192C520 81.5 430.5 -8 320 -8C244.3 -8 178.4 34 144.5 96H424C437.3 96 448 106.8 448 120C448 133.3 437.3 144 424 144H125.8C122 159.4 120 175.4 120 192C120 302.5 209.5 392 320 392C395.7 392 461.6 350 495.5 288H216C202.7 288 192 277.2 192 264C192 250.7 202.7 240 216 240H514.2C518 224.6 520 208.6 520 192zM216 216H424C437.3 216 448 205.3 448 192C448 178.8 437.3 168 424 168H216C202.7 168 192 178.7 192 192C192 205.2 202.7 216 216 216z" /> + <glyph glyph-name="itunes-note" + unicode="" + horiz-adv-x="384" d=" M381.9 59.8C375.5 32.4 354.7 17 326.8 11.8C302.3 7.3 281.9 6.2 262.3 22C238.4 42.1 238.1 75.4 259.6 96.4C276.6 112.6 300.5 115.9 336.4 122.2C342.4 123.3 347.6 124.7 352 129.6C358.4 136.8 356.4 133.7 356.4 292.8C356.4 304 350.9 307.1 339.4 305.1C331.2 303.7 153.7 270.5 153.7 270.5C143.5 268.3 140.3 265.3 140.3 253.8C140.3 19.1 141.4 29.9 137.8 14.3C133.6 -3.9 122.4 -17.6 107.6 -25.2C90.8 -34.5000000000001 60.4 -38.6 44.2 -35.6C1 -27.5 -14.2 22.4 15.1 51C32.1 67.2 56 70.5 91.9 76.8C97.9 77.9 103.1 79.3 107.5 84.2C117.6 95.7 109.3 340.8 112.7 354.4C113.5 359.6 115.7 364 119.8 367.3C124 370.8 131.6 372.8 133.2 372.8C337.2 411 362.1 415.9 365.6 415.9C377.1 416.7 383.7 409.9 383.7 398.3C383.9 53.8 384.8 72.3 381.9 59.8z" /> + <glyph glyph-name="itunes" + unicode="" + horiz-adv-x="448" d=" M223.6 367.7C129 367.7 52.5 291 52.5 196.5S129 25.2 223.6 25.2S394.8 101.9 394.8 196.4C394.8 291 318.1 367.7 223.6 367.7zM303 127.7C299.8 114.1 289.5 106.5 275.7 103.9C263.6 101.7 253.5 101.1 243.8 108.9C232 118.9 231.8 135.3 242.4 145.7C250.8 153.7 262.7 155.3 280.4 158.5C283.4 159 286 159.7 288.1 162.2C291.3 165.8 290.3 164.2 290.3 243C290.3 248.6 287.6 250.1 281.9 249.1C277.9 248.4 190 232 190 232C185 230.9 183.3 229.4 183.3 223.7C183.3 107.6 183.8 112.9 182.1 105.2C180 96.2 174.5 89.4 167.2 85.6C158.9 80.9999999999999 143.8 78.9999999999999 135.8 80.4C114.4 84.4 106.9 109.1 121.4 123.3C129.8 131.3 141.7 132.9 159.4 136.1C162.4 136.6 165 137.3 167.1 139.8C172.1 145.5 168 266.8 169.7 273.5C170.1 276.0999999999999 171.2 278.3 173.2 279.9C175.3 281.5999999999999 179 282.5999999999999 179.9 282.5999999999999C280.9 301.5999999999999 293.2 304 295 304C300.7 304.4 304 301 304 295.3C303.8999999999999 124.6999999999999 304.3999999999999 133.9 303 127.6999999999999zM345.2 416H102.8C45.9 416 0 370.1 0 313.2V70.8C0 13.9 45.9 -32 102.8 -32H345.2C402.2 -32 448 13.9 448 70.8V313.2C448 370.1 402.1 416 345.2 416zM223.6 4C117.3 4 31.1 90.2 31.1 196.5S117.3 389 223.6 389S416.1 302.8 416.1 196.5S329.9 4 223.6 4z" /> + <glyph glyph-name="jenkins" + unicode="" + horiz-adv-x="512" d=" M487.1 23C485.7 34.2 468.1 46.1 458.9 54.9C453.8 59.9 429.9000000000001 78 428.5000000000001 84.8C427.1000000000001 91.4 438.2000000000001 106.3 441.8000000000001 113.6999999999999C446.9000000000001 124.3999999999999 450.6000000000001 137.3999999999999 453.1000000000001 146.3C471.9000000000001 212.4 473.8000000000001 303.2 446.9000000000001 357.5C436.7000000000001 378.0999999999999 408.3000000000001 406.5 390.5000000000001 420C348.5000000000001 451.6999999999999 270.9000000000001 455.3 220.4000000000001 436.6C206.3000000000001 431.3999999999999 192.6000000000001 426.8 180.3000000000001 419.5C147.2000000000001 400.1 112.0000000000001 387 102.2000000000001 347.9C78.0000000000001 337.1 70.7000000000001 306.1 71.9000000000001 270.1C72.1000000000001 263.1 76.0000000000001 254.3 74.6000000000001 247.7C73.9000000000001 244.4 69.4000000000001 240.1 68.5000000000001 237.9C56.9000000000001 210.2 66.2000000000002 173.9 79.6000000000001 154.1999999999999C87.7000000000001 142.3 101.1000000000001 131.8 118.8000000000002 129C119.5000000000002 118.3999999999999 122.1000000000001 109.3 127.0000000000002 98.6C130.1000000000001 91.8 141.7000000000001 79.6 137.4000000000002 70.9C135.2000000000002 66.5 116.4000000000002 57.1 110.1000000000002 53.3C89 40.8 73.7 33 54.2 19C41.6 10 21.9 8.8 25 -12.1C27.1 -26.2 35.1 -43.7 39.7 -57.9C40.4 -59.9 41.1 -62.0000000000001 41.8 -63.9H463.8C468.7 -48.6 473.5 -33.0000000000001 478.4 -16.7C481.8 -5.3000000000001 488.6 11.1 487.1 22.9999999999999zM205.9 414.3C207.7 414.8 209.3 413.6 210.8 411.9C210.6 406.7 205.4 406.8 201.9 405.1C196.5 398.4 188.5 395.3 181.9 387.9C175.1 380.4 167.5 360.2 158.5 357.9C154 356.8 148.8 358.7 144.9 358.4C134.5 357.7 127.2 352.4 116.6 350.9C130.2 380.8 172.7 404.9 205.9 414.3zM101.1 320.7C114.6 335.6 133.2 344.8 155.9 346.6C167.6 316.9 147.5 281.6 155 249C157.3 239.1 165.2 223.6 152.6 223.3C152.9 251.6 117.8 269.6 91.3 252.9C89.5 274.4 86.4 304.6 101.1 320.7zM137.8 120.5C136.8 124.6 135.1 133.4 135.5 135.6C137.1 144.3 152.6 148.1 146.5 160.3C135.2 160.4 132.7 150.1 122.4 149C95.7 146.4 76.8 184.4 78 207.4C79 226.9 95.6 245.6 118.1 243.2C134.1 241.4 139.5 224 142.6 208.5C151.8 208 165.1 208.9 169.5 216.1C168.9 233.6 160.7 247.7 161.3 263.8C162.3 294.1 178.8 321.4 166.1 351.2000000000001C179.7 382.1 219.6 406.5 249.2 421.2000000000001C285.8 439.5 344.1 424.9000000000001 378.5 405.4000000000001C398.2 394.3 412.9 372.7000000000001 426.8 354.7000000000001C407.3 360.5 390.7 350.5 393.7 334.4000000000001C410 349.3 437.9 334.6 446.2 318C454.1 302.2000000000001 454 278.7000000000001 455.2 255.2000000000001C458.1 198.2000000000001 444.8 139.3000000000001 416.1 98.1C408.4 87.1 402 75.1 391.2 67.5C365.2 49.3 325.8 32.8 292 44.1C247.3 59.1 227 88.9 202.5 122.9C203.2 104.2000000000001 216.3 88.8 229.3 74.5000000000001C240.6 62.0000000000001 254.3 47.9 269 42.1000000000001C256.7 45.0000000000001 237.9 45.9000000000001 232.8 34.9000000000001C204.2 36.8000000000001 177.7 39.7000000000001 164.1 59.1000000000001C153.5 74.5000000000001 142.7 100.5000000000001 137.8 120.5000000000001zM359.8 -3.6C363.9000000000001 -0.6 370.9000000000001 -0.7 377.2 0C371.8 2.7 364.2 3.7 357.9 2.2C357.8 6.4 355.9 9 354.7 12.4C365.3 16.2 390.2 40.9 404.3 32.7C411 28.8 413.8 6.5 414.4000000000001 -4.3C414.8 -13.3 413.6 -22.3 409.9000000000001 -27.1C391.1 -26.5 374.1 -24.3 359.2000000000001 -20.1C360.1 -14 358.2000000000001 -8 359.8000000000001 -3.6zM342.6 16.4C325.8 15.6 316.6 17.6 304.3 27.2C304.5 28 305.7 27.7 305.8 28.6C323.8 20.6 346.6 31.9 364.8 33.4999999999999C356.9000000000001 28.3999999999999 350.2 21.8999999999999 342.6 16.3999999999999zM330.5 -16.8C328.9 -7.4 327 -4.8 327.7 3.4C352.7 20 357.4 -25.2 330.5 -16.8zM226 9.4C214.4 10.1 177.9 23.4 187.5 33.1C196.9 26.6 215 28.2 228.8 25.8C229.6 21.4 226 15.6 226 9.4zM57.7 -49.1C53.4 -36.4 48.5 -24 42.9 -12.2C73.7 11.6 108.2 36.6999999999999 145.1 51.3C147.9 52.4 168.3 25.9 171.3 23.6999999999999C187.8 11.9999999999999 208.3 2.6999999999999 227.5 -6.5000000000001C228.7 -15.3000000000001 231.4 -26.7 236.2 -42.0000000000001C236.9 -44.3000000000001 237.6 -46.7 238.4 -49.2H57.7zM298.3 -54.8H297.5C297.8 -54.6 298 -54.4 298.3 -54.3V-54.8zM305.8 -49.1C307.9000000000001 -47.7 310.1 -46.3 312.2 -44.8C313.3 -46.2 314.4 -47.6 315.4 -49.1H305.8zM320.9000000000001 -24.4C310.1 -31.7 300.3 -42.7 287.6 -49.6C281.6 -52.9 260.6 -61.3 254.2 -59.8C250.6 -59 250.3 -54.5 248.8 -50.3C245.7 -41.3 238.7 -26.9 238 -13.3C237.2 3.9 235.5 32.7 254 29.1C268.9 26.2 286.3 19.4 297.9 12.9999999999999C305 9.1 309 4.3999999999999 319.8 3.4999999999999C319.7 2.1 319.7 0.6999999999999 319.6 -0.8000000000001C313.7 -4.7 304.3 -4.6000000000001 297.8 -7.9000000000001C307.3 -8.3000000000001 314.8 -10.6000000000001 321.3 -13.8000000000001C321.2 -17.2 321 -20.8000000000001 320.9 -24.4000000000001zM374.3 -49.1H360.3C360.2 -45.9 357.5 -43.3 354.2 -43.3S348.3 -45.9 348.1 -49.1H330.7C327.9 -44.7 325 -40.5 321.8 -36.6C323.9000000000001 -34.4 325.8 -31.9 327.8 -29.7C336.8 -33.4 342.6 -24.8000000000001 349.5 -25.5000000000001C357.4 -26.3000000000001 363.7 -37.2 374.9 -36.5000000000001L374.3 -49.1000000000001zM383 -49.1C383.2 -45.1 383.4 -41.3 383.6 -37.6C399.2000000000001 -30.3 412.6 -38.9 419.3 -49.1H383zM466.4 -12.1C464.1 -23.3 460.6 -36.1 456.5 -49.2C456.3 -49.1 456.1 -49.1 455.9 -49.1H428C428.6 -48 429.2 -46.9 429.9 -45.8C427.3 -39.7 420.9 -37.1 419 -30.3C431.1 -7.6 425.5 63.1 394.8 48.2C399.1 54.5 410.4000000000001 59.7 415.6 67.5C428.6 57.1 436.4000000000001 47.2 448.8 36.1C455.6 30.1 468.8 22.8 470.2 13C471 7.5 467.6 -5.9 466.4 -12.1zM222.2 317.5C227.6 332.4 249.4 352.2 267.2 349.5C274.9 348.3 285.2 341.3 279.4 331.8C249.2 338.8 234.2 319.2 225 298.7C216.9 300.7 220.1 311.8 222.2 317.5zM406.3 254.4C414.5 258 428.7 255.1 435.9 259.7000000000001C431.7 271.2000000000001 425.6 281.1 426.6 297.4000000000001C427.1 297.4000000000001 427.6 297.4000000000001 428 297.3000000000001C434.8 283.1 440.7 268.1 449.3999999999999 255.6C443.7 242.1 405.7999999999999 230.2 406.2999999999999 254.4000000000001zM426.7 297.4zM309.5 251.7C302.7 262.6 290.5 284.2 295 297C301.5 285.1 303.6 272.6 312.8 263.7C316.9 259.7 325 254.7 321 243.5C320.1 240.8 313.2 234.9 309.3 233.8C294.9 229.5 261.4 232.9 272.7 250.9C284.5999999999999 250.2 300.5999999999999 243.1 309.5 251.7zM336.8 181.7C340.6 175.1 338.2 163 348.9 161.1C369.1 157.7 392.5 173.4 407 178.9C416 194.1 406.2 199.6 398.1 209.4C381.5 229.4 359.3 254.2 360.1 284.1C366.8 289 367.4000000000001 276.7 368.3 274.4C377 254.1 398.7 228.2 414.6 210.9C418.5 206.6 424.9000000000001 202.5 425.6 199.7C427.7000000000001 191.5 420.2000000000001 181.7 421.1 176.2C399.4000000000001 162.3 375.3 147.1 339.7000000000001 150.6C332.3000000000001 157.3 329.4000000000001 172 336.8000000000001 181.7zM135.5 190.9C128.6999999999999 194.8 127.0999999999999 211.9 119.0999999999999 212.3C107.6999999999999 213 109.7999999999999 190.1 109.7999999999999 176.8C101.9999999999999 183.9 100.5999999999999 205.9 106.2999999999999 217.1C99.7 220.3 96.7999999999999 213.5 93.2 211.2C97.9 245.3 143 227 135.5 190.9zM435.1 162.1C425 142.9 410.7 121.7 381.1 121.1C380.5 127.3 380 136.7 381.1 140.5C403.8 142.6999999999999 417.7 154.1999999999999 435.1 162.1zM293.2 149.7C312.0999999999999 139.8 346.8 138.7 372.5 139.5C373.8999999999999 133.9 373.8 126.9 373.8999999999999 120.1C340.8999999999999 118.3 301.8999999999999 126.5 293.2 149.7000000000001zM385.3999999999999 103C383.7 98.7 380.0999999999999 93.7 375.5999999999999 91.9C363.4999999999999 87 329.9999999999999 83.2 313.2 92.2C302.5 97.9 295.7 110.7 289.8 118.2C287 121.8 272.9 131.1 289.6 131.1C302.7 98.4 347.6 102.1 385.4 102.9999999999999z" /> + <glyph glyph-name="joget" + unicode="" + horiz-adv-x="496" d=" M227.5 -20.7C218.5 -7.1 207.6 12.6 203.8 21.7C198.1 35.4 176.6 67.3 235 88.8C286.7 107.9 411.7 105.3 443.8 106.4C439.8 97.4 435.2 88.5 429.9000000000001 79.8C389.5000000000001 14.3 319.5 -21.7 247.9000000000001 -21.7C241.1 -21.7 234.3000000000001 -21.3000000000001 227.5000000000001 -20.7M66.1 304.1C128 404.6 259.6 435.8 360.1 373.9C434.9000000000001 327.8 471.3 243 459.4 161.2000000000001C434.5000000000001 161.7000000000001 280.1 164.8000000000001 229.1 166.1C173.6 167.5 147.4 186.9 170.6 214.3C193.8 241.7 221.7 255 239.5000000000001 265.5C257.4000000000001 276 266.8 299.2 215.9 295.2C87.3 286.5 48.6 195.9 37.6 155C28.8 204.7 37.5 257.7 66.1 304.1M36.9 322.1C-35 205.5 1.3 52.8 117.9 -19.1C234.5 -91 387.2 -54.7 459.1 61.8C531 178.4 494.7 331.2 378.1 403C337.6 428.1 292.6 440 248.2 440C165 440 83.8 398.1 36.9 322.1M281.3 211.7C249.8 191.2 216 180.4 216 180.4L385.5 182L432 205.4S435.6 214.9 412.9 220.9C390.2 226.9 355.9 209.6 326.2 193.7C296.5 177.9 295.1 185.5 295.1 185.5S335.3 213.6 345.8 220C356.3 226.4 377.7 234 359.2 244.6C356 246.4 352.5 247.3 348.8 247.3C331 247.3 307.3 228.6 281.3 211.7" /> + <glyph glyph-name="joomla" + unicode="" + horiz-adv-x="448" d=" M0.6 355.9C0.6 389.2 27.4 416 60.4 416C90.4 416 114.9 394.1 119.6 365.8C152.2 373.4 186.7 365.2 216.1 335.8L171.8 291.5C151.3 312 129.2 307.8 116.4 295C102.1 280.7 102.1 257.1 116.4 242.8L215.9 143.3L171.9 99C84.2 186.2 122.2 148.7 72.1 198.7C45.3 225.2 37.1 263.5 47.3 297.6C20.4 303.4 0.6 327.3 0.6 355.9zM130.1 239.5L174.4 195.2C184.4 205.2 264.1 284.9 274.1 295C288.4 309.3 311.7 309.3 326 295C338.8 282.2 343 260 322.5 239.6L366.5 195.3C397.7 226.5 405 262.9 395.3999999999999 296.5C424.5999999999999 300.6 447.2999999999999 325.7 447.2999999999999 356C447.2999999999999 389.2 420.4999999999999 416.1 387.4999999999999 416.1C357.1999999999999 416.1 332.0999999999999 393.6 327.9999999999999 364.5C294.1999999999999 374.4 256.2999999999999 366 229.6999999999999 339.4C211.3999999999999 320.3 158.5999999999999 267.9 130.0999999999999 239.5zM396.4 87.3C404.6 120 395.5 155.8 370.1 181.2000000000001C358.3 193.4 375.1 176.5000000000001 270.6 280.9000000000001L226.3 236.6L326 136.9C340.3 122.6 340.3 99.3 326 85.0000000000001C313.2 72.2000000000001 291 68.0000000000001 270.6 88.5000000000001L226.6 44.2C254.2 14.0000000000001 294.6 5.4 329.3 16.2C334.8 -11.1999999999999 359 -31.9 388.2 -31.9C421.2 -31.9 448 -5.1 448 28.2C448 58.4 425.5 83.2000000000001 396.3999999999999 87.3000000000001zM312.1 140.4L268.1 184.7000000000001C181.1 98.3000000000001 217.7 134.3000000000001 168.4 84.9C154.1 70.6 130.8 70.6 116.5 84.9C103.4 98.3 99.6 120.2000000000001 119.7 140.3L75.7 184.6C45.5 154.4 37.7 119.4 46.2 86.3C19.5 80.3 0 56.4 0 28.1C0 -5.2 26.8 -32 59.8 -32C88.4 -32 112.3 -12.2 118.4 14.7C151.1 6.5 186.9 15.3 212.6 40.7C244.7 72.7 224.8 53.1 312.1 140.4z" /> + <glyph glyph-name="js-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM243.8 66.6C243.8 23 218.2 3.1 180.9 3.1C147.2 3.1 127.7 20.5 117.7 41.6L152 62.3C158.6 50.6 164.6 40.7 179.1 40.7C192.9 40.7 201.7 46.1 201.7 67.2V210.3H243.8V66.6zM343.4 3.1C304.3 3.1 279 21.7 266.7 46.1L301 65.9C310 51.2 321.8 40.3 342.5 40.3C359.9 40.3 371.1 49 371.1 61.1C371.1 75.5 359.7000000000001 80.6 340.4000000000001 89.1L329.9000000000001 93.6C299.5000000000001 106.5 279.4000000000001 122.8 279.4000000000001 157.1C279.4000000000001 188.7000000000001 303.5000000000001 212.7 341.0000000000001 212.7C367.8000000000001 212.7 387.0000000000001 203.4 400.8000000000001 179L368 158C360.8 170.9 353 176 340.9 176C328.6 176 320.8 168.2 320.8 158C320.8 145.4 328.6 140.3 346.7 132.4L357.2 127.9C393 112.6 413.0999999999999 96.9 413.0999999999999 61.7C413.0999999999999 23.9 383.2999999999999 3.1 343.3999999999999 3.1z" /> + <glyph glyph-name="js" + unicode="" + horiz-adv-x="448" d=" M0 416V-32H448V416H0zM243.8 66.6C243.8 23 218.2 3.1 180.9 3.1C147.2 3.1 127.7 20.5 117.7 41.6L152 62.3C158.6 50.6 164.6 40.7 179.1 40.7C192.9 40.7 201.7 46.1 201.7 67.2V210.3H243.8V66.6zM343.4 3.1C304.3 3.1 279 21.7 266.7 46.1L301 65.9C310 51.2 321.8 40.3 342.5 40.3C359.9 40.3 371.1 49 371.1 61.1C371.1 75.5 359.7000000000001 80.6 340.4000000000001 89.1L329.9000000000001 93.6C299.5000000000001 106.5 279.4000000000001 122.8 279.4000000000001 157.1C279.4000000000001 188.7000000000001 303.5000000000001 212.7 341.0000000000001 212.7C367.8000000000001 212.7 387.0000000000001 203.4 400.8000000000001 179L368 158C360.8 170.9 353 176 340.9 176C328.6 176 320.8 168.2 320.8 158C320.8 145.4 328.6 140.3 346.7 132.4L357.2 127.9C393 112.6 413.0999999999999 96.9 413.0999999999999 61.7C413.0999999999999 23.9 383.2999999999999 3.1 343.3999999999999 3.1z" /> + <glyph glyph-name="jsfiddle" + unicode="" + horiz-adv-x="576" d=" M510.634 210.538C505.907 213.159 504.97 216.286 504.253 221.314C501.9010000000001 237.802 500.7140000000001 254.933 495.1560000000001 270.409C459.2610000000001 370.366 341.1660000000001 413.795 248.3070000000001 362.055C220.9370000000001 346.805 199.3360000000001 325.6860000000001 182.8140000000001 298.1520000000001C179.6300000000001 299.6600000000001 177.3560000000001 300.862 174.9900000000001 301.838C144.8880000000001 314.259 115.9410000000001 311.9590000000001 89.6590000000001 292.6710000000001C64.1280000000001 273.9340000000001 53.2370000000001 248.123 56.9830000000001 216.263C57.3380000000001 213.238 55.0160000000001 208.642 52.4690000000001 206.7180000000001C12.7570000000001 176.7260000000001 -3.5619999999999 128.653 10.5670000000001 82.1030000000001C24.3980000000001 36.5340000000001 68.0810000000001 2.3070000000001 116.1750000000001 0.6700000000001C146.4660000000001 -0.3609999999999 176.8120000000001 0.1240000000001 207.1340000000001 0.1310000000001C291.1750000000001 0.1520000000001 375.2240000000001 -0.3999999999999 459.2540000000001 0.6110000000001C511.9180000000001 1.2450000000001 555.3620000000001 37.4840000000001 567.4660000000001 87.9040000000001C579.0060000000001 135.9780000000001 556.3220000000001 185.2040000000001 510.6340000000001 210.5380000000001zM531.741 53.658C513.511 31.226 489.398 18.405 460.461 18.008C403.587 17.227 346.694 17.778 289.8090000000001 17.778C289.8090000000001 17.078 126.781 17.619 126.081 17.624C82.22 17.956 49.342 37.39 30.906 77.619C12.004 118.864 26.902 168.4670000000001 65.092 193.725C74.274 199.798 77.597 205.291 75.188 216.861C69.698 243.222 79.641 264.817 101.608 279.842C124.595 295.5650000000001 149.03 295.988 173.642 282.925C183.911 277.475 188.249 271.361 195.84 285.452C210.0620000000001 311.851 230.3970000000001 332.179 256.511 346.746C353.971 401.112 484.881 339.178 486.751 214.049C486.873 205.899 489.163 201.621 496.599 198.155C554.1590000000001 171.326 571.0550000000001 102.033 531.7410000000001 53.658zM443.952 134.1570000000001C438.104 103.0000000000001 409.33 79.061 377.286 79.062C360.3330000000001 79.063 345.228 85.607 333.207 96.767C305.51 122.48 262.066 171.747 237.27 190.154C217.214 205.042 195.28 202.487 176.998 186.372C127.002 142.3010000000001 192.857 64.597 244.061 109.184C248.609 113.144 251.901 118.727 256.805 122.028C264.989 127.537 277.571 122.912 269.973 111.406C252.615 85.122 220.643 73.209 191.11 82.105C162.213 90.809 142.27 118.073 142.484 152.284C143.709 174.769 154.848 195.344 177.898 208.249C200.473 220.887 224.267 221.395 244.889 205.775C295.68 167.3 320.467 124.03 352.185 104.53C376.743 89.431 406.439 97.167 421.008 122.036C449.838 171.245 386.416 227.052 342.14 185.4959999999999C338.151 181.7519999999999 335.223 176.5639999999999 330.73 173.7759999999999C319.755 166.9649999999999 313.397 177.8889999999999 317.921 184.1289999999999C338.6239999999999 212.6829999999999 368.385 224.5689999999999 401.192 212.3429999999999C432.6209999999999 200.6289999999999 450.3 167.9769999999999 443.952 134.1569999999999z" /> + <glyph glyph-name="keycdn" + unicode="" + horiz-adv-x="512" d=" M63.8 38.7L124.3 97.7C156.4 54.9 195.4 31.7 250.9 30.3C281.4 29.6 311.2 37.3 337.3 52.6999999999999C342.4 47.3999999999999 355.8 33.1999999999999 358.2 30.6999999999999C326 9.9999999999999 288.5999999999999 -0.4000000000001 250.1 0.4999999999999C206.8 1.6 165.5 17.1999999999999 132.3999999999999 44.8999999999999C132.6999999999999 45.4999999999999 94.1999999999999 7.3999999999999 93.7999999999999 6.9999999999999C103.2999999999999 -22.8000000000001 80.6999999999999 -55.4 47.4999999999999 -55.4C20.7 -55.3 0 -33.7 0 -6.9C0 27.4 33.1 49.7 63.8 38.7zM418.7 291.1C437.8 259.8 448.3 223.7 447.4 187.1C446.3 142.3 428.4 99.6 398.8 66.1C399.1 65.8 422.6 40.9 422.9 40.6C432.5 41.9 442.1 38.6 448.8 31.5C460.1 19.5 459.6999999999999 0.6 447.7 -10.9C435.7 -22.2 416.8 -21.8 405.3 -9.8C398.6 -2.8 395.9 7.0000000000001 397.7 16.5000000000001C372.8 43.1000000000001 353.3 63.7000000000001 353.3 63.7000000000001C396 97.8000000000001 416.6 143.3000000000001 417.7 187.9C418.3999999999999 216.8000000000001 410.5 245.1 396.5999999999999 270.1L418.7 291.1zM104 394.9C110.7 387.9 113.4 378.1 111.6 368.6L157.5 320.5C152.8 316.7 144.2 310.1 134.7 299.2C109.3 270.7 95.1 234.4 94 196.3C93.3 167.4 100.1 139.1 114 113.9L92 92.4C72.7 124 63.1 160.1 64.2 197.1C65.2 241.7 82.5 284.7 111.7 318.2L86.4 344.6C76.8 343.3 67.2 346.6 60.5 353.7C49.2 365.7 49.6 384.6 61.6 396.1C73.5 407.3 92.2 407 104 394.9zM464.9 440C490.9 440 512 417.6 512 391.7S490.9 344 464.9 344C458.6 343.9 450.9 345.1 449 345.8L386.1 286.1C353.4000000000001 329.7 309.4000000000001 352 259.2000000000001 353.3C228.7000000000001 354 198.9 346.5 173.0000000000001 330.9L151.9000000000001 352.9C184.1 373.7 221.5 384 260 383.1C303.3 382 344.6 366.4 377.7 338.5L418.8 377.1C417.3 381.8 416.6 386.7 416.6 391.6C416.5 418.3 438.9 440 464.9 440zM256.7 334.6C262.2 334.6 267.6 334.2 273.1 333.5C351.2 323.7 406.5 252.4 396.9 174.4C387.1 96.3 315.8 41 237.8 50.6C159.7 60.4 104.4 131.6999999999999 114 209.8C123.3 282.2 184.1 334.4 256.7 334.6zM197.7 215.2C198.3 192.5 209.9 173.4 230.1 163L219.1 111.3H292.8L281.8 163C301.9000000000001 173.9 313.9000000000001 192 314.2 215.2C313.8 248 288.4 272.7 255.9 273.5C223.8 272.7 198.6 248.7 197.7 215.2zM256 288" /> + <glyph glyph-name="kickstarter-k" + unicode="" + horiz-adv-x="384" d=" M147.3 333.6C147.3 389.8 114.8 416 73.9 416C26.2 416 0 379.8 0 334.6V51.6C0 4.3 25.3 -31.8 74.9 -31.8C114.7 -31.8 147.3 -6.1999999999999 147.3 51.6V128.1L259.4 -10.2C282.1 -37.4 331.5 -40.9 362.6 -10.2C389.6 17.4 389.9 57.2000000000001 370 82L279.2 196.8L354.0999999999999 304.2000000000001C371.4999999999999 328.9000000000001 371.5999999999999 367.3 343.7 394C313.3999999999999 423 261.3 425.6 230.1 381.2000000000001L147.3 263V333.6z" /> + <glyph glyph-name="kickstarter" + unicode="" + horiz-adv-x="448" d=" M400 -32H48C21.6 -32 0 -10.4 0 16V368C0 394.4 21.6 416 48 416H400C426.4 416 448 394.4 448 368V16C448 -10.4 426.4 -32 400 -32zM199.6 269.5C199.6 300.2 182 314.6 159.9 314.6C134.1 314.6 119.9 294.8 119.9 270.1V115.3C119.9 89.4999999999999 133.6 69.6999999999999 160.4 69.6999999999999C181.9 69.6999999999999 199.6 83.6999999999999 199.6 115.3V157.1L260.2 81.4C272.5 66.5 299.2 64.6 316 81.4C330.6 96.5 330.8 118.2 320 131.8L270.9 194.6L311.4 253.3C320.8 266.8 320.9 287.8 305.8 302.4C289.4 318.3 261.2 319.7 244.4 295.4L199.6 230.7V269.5z" /> + <glyph glyph-name="korvue" + unicode="" + horiz-adv-x="446" d=" M386.5 414H59.5C26.8 414 0 387.2 0 354.5V27.4C0 -5.2 26.8 -32 59.5 -32H386.6C419.6 -32 446.1 -5.2 446.1 27.5V354.5C446 387.2 419.2 414 386.5 414zM87.1 327.2H183.1V211.2L244.9 327.2H355.8L274.6 195.2H87.1V327.2zM248.9 55.1L183.2 168.6999999999999V55.0999999999999H87.2V185.9H278.7L367.3 55.1H248.9z" /> + <glyph glyph-name="laravel" + unicode="" + horiz-adv-x="640" d=" M637.5 206.4C633.3 211.2 574.7 284.5 564.4 296.9C554.1 309.3 549 307.1 542.6999999999999 306.2000000000001C536.3 305.3 462.1999999999999 292.8 453.5999999999999 291.4C444.9999999999999 289.9 439.5999999999999 286.5 444.8999999999999 279.1C449.5999999999999 272.5 498.2999999999999 203.4 509.0999999999999 188.2L315.3999999999999 141.8L161.2 399.3C155.1 408.4 153.8 411.6 139.8 410.9C125.8 410.3 18.9 401.4 11.3 400.7C3.7 400.1 -4.7 396.7 2.9 378.7S131.9 99.1 135.3 91.5C138.7 83.9 147.5 71.5 168.1 76.5C189.2 81.6 262.4 100.7 302.4 111.2C323.5 72.9 366.6 -4.7 374.6 -15.8C385.2 -30.7 392.6 -28.2 408.9 -23.2C421.7 -19.3 608.5 47.9 616.9 51.3C625.3 54.8 630.5 57.2 624.8 65.7C620.5999999999999 71.9 571.3 137.9 545.5 172.5C563.2 177.2 626.1 193.9 632.8 195.8C640.6999999999999 197.8 641.8 201.6 637.5 206.4zM285.3 134.4C283 133.9 174.5 107.9 168.7 106.6C162.9 105.3 162.9 105.9 162.2 107.9C161.5 109.9 33.2 374.6 31.4 377.9C29.6 381.2 29.7 383.8 31.4 383.8S133.9 392.8 137.4 393C141 393.2 140.6 392.4 141.9 390.2C141.9 390.2 284.1 144.8 286.5 140.5C289.1 136.2 287.6 134.9 285.3 134.4zM591.3 77C593 74.3 594.8 72.5 589.3 70.6C583.9 68.6 405.6 8.5 402.2 7C398.7 5.5 396 5 391.5999999999999 11.5S329.2 118.3 329.2 118.3L518 167.4C522.7 168.9 524.2 169.9 527.2 165.2C530.1 160.4 589.6 79.7 591.3000000000001 77zM603.4 211.1C599.1999999999999 210.2 529.8 193 529.8 193L473.1 270.8C471.4999999999999 273.1 470.2 275.3 474.2 275.8S542.6 288 545.5 288.6C548.4 289.3 550.9 290.1 554.5 285.2000000000001C558.1 280.3 607.1 218.2 609 215.8C610.8 213.5 607.6 212.1 603.4 211.1z" /> + <glyph glyph-name="lastfm-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM307.8 103.1C244.4 103.1 222.4 131.7000000000001 210.7 167.2000000000001C194.4 218.2000000000001 189.2 251.5000000000001 147.7 251.5000000000001C125.3 251.5000000000001 102.6 235.4000000000001 102.6 190.3000000000001C102.6 155.1000000000001 120.6 133.1000000000001 145.9 133.1000000000001C174.5 133.1000000000001 193.5 154.4000000000001 193.5 154.4000000000001L205.2 122.5000000000001S185.4 103.1000000000001 144 103.1000000000001C92.7 103.1000000000001 64.1 133.2000000000002 64.1 188.9000000000002C64.1 246.8000000000002 92.7 280.9000000000002 146.6 280.9000000000002C220.1 280.9000000000002 227.4 239.5000000000002 247.4 179.0000000000001C256.2 152.2000000000001 271.6 132.8000000000001 308.6 132.8000000000001C333.5 132.8000000000001 346.7 138.3000000000001 346.7 151.9000000000002C346.7 171.8000000000001 324.9 173.9000000000002 296.8 180.5000000000002C266.4000000000001 187.8000000000002 254.3 203.6000000000002 254.3 228.5000000000002C254.3 268.5000000000002 286.6 280.9000000000002 319.5 280.9000000000002C356.9 280.9000000000002 379.6 267.3000000000002 382.5 234.3000000000002L345.8 229.9000000000002C344.3 245.7000000000002 334.8 252.3000000000002 317.2 252.3000000000002C301.1 252.3000000000002 291.2 245.0000000000002 291.2 232.5000000000002C291.2 221.5000000000002 296 214.9000000000002 312.1 211.2000000000002C344.8 204.1000000000002 383.9 199.2000000000002 383.9 153.7000000000002C384 117.0000000000002 353.2 103.1000000000001 307.8 103.1000000000001z" /> + <glyph glyph-name="lastfm" + unicode="" + horiz-adv-x="512" d=" M225.8 80.9L207 131.9S176.5 97.9 130.8 97.9C90.3 97.9 61.6 133.1 61.6 189.4C61.6 261.5 98 287.3 133.7 287.3C200.2 287.3 208.5 234 234.6 152.4C253.4 95.5 288.6 49.8 390 49.8C462.7 49.8 512 72.1 512 130.6999999999999C512 203.5999999999999 449.3 211.2999999999999 397 222.7999999999999C371.2 228.7 363.6 239.2 363.6 256.8C363.6 276.7 379.4000000000001 288.4999999999999 405.2000000000001 288.4999999999999C433.4000000000001 288.4999999999999 448.6 277.8999999999999 450.9 252.7L509.5000000000001 259.7C504.8000000000001 312.5 468.4 334.2 408.6 334.2C355.8 334.2 304.2000000000001 314.3 304.2000000000001 250.3C304.2000000000001 210.3999999999999 323.6 185.1999999999999 372.2000000000001 173.5C417.1 162.8999999999999 452.0000000000001 159.6999999999999 452.0000000000001 127.8C452.0000000000001 106.1 430.9000000000001 97.3 391.0000000000001 97.3C331.8000000000001 97.3 307.1 128.4 293.1 171.1999999999999C261.1 268 249.5000000000001 334.2 131.8 334.2C45.7 334.2 0 279.7 0 187C0 97.9 45.7 49.8 127.9 49.8C194.1 49.8 225.8 80.9 225.8 80.9z" /> + <glyph glyph-name="leanpub" + unicode="" + horiz-adv-x="576" d=" M386.539 336.515L401.635 87.56L390.656 87.835C354.424 88.659 319.016 79.052 287.999 59.838C256.983 79.052 221.575 87.835 185.3420000000001 87.835C139.7780000000001 87.835 103.2720000000001 77.13 61.826 60.112L93.117 318.4C121.663 330.203 154.601 336.515 185.343 336.515C226.516 336.515 259.1790000000001 323.3400000000001 288 293.971C315.723 322.242 347.013 335.692 386.539 336.515zM569.07 0C543.5440000000001 0 521.585 5.215 498.528 15.645C464.218 31.29 428.5350000000001 40.623 390.6570000000001 40.623C351.6800000000001 40.623 315.7230000000001 27.722 288.0000000000001 0C260.2770000000001 27.723 224.3200000000001 40.623 185.3430000000001 40.623C147.4650000000001 40.623 111.7820000000001 31.29 77.4720000000001 15.645C55.239 5.764 32.731 0 8.303 0H6.93L49.475 349.141C88.726 371.374 136.486 384 181.775 384C218.83 384 256.984 376.315 288 354.905C319.016 376.315 357.17 384 394.225 384C439.514 384 487.274 371.374 526.5250000000001 349.141L569.07 0zM525.702 44.741L491.666 324.987C460.924 338.986 424.418 346.397 390.657 346.397C352.229 346.397 316.272 334.32 288 307.695C259.728 334.32 223.772 346.397 185.343 346.397C151.582 346.397 115.076 338.986 84.334 324.987L50.298 44.741C97.509 64.228 133.192 78.227 185.343 78.227C222.947 78.227 256.16 68.621 288 48.583C319.84 68.621 353.052 78.227 390.657 78.227C442.808 78.227 478.491 64.228 525.702 44.741z" /> + <glyph glyph-name="less" + unicode="" + horiz-adv-x="640" d=" M612.7 229C612.7 249.5 615.9000000000001 261.6 615.9000000000001 283.6C615.9000000000001 317.8 603.3000000000001 328.8 575.4000000000001 328.8H554.9000000000001V304.6H561.2C575.4000000000001 304.6 578.5 299.9 578.5 282.5C578.5 266.2 576.9 249.9 576.9 231C576.9 206.8 584.8 197.4 600.5 193.7V192.1C584.7 188.4 576.9 179 576.9 154.8C576.9 135.9 578.5 120.6 578.5 103.3C578.5 85.4 574.8 80.7 561.2 80.7V80.2H554.9000000000001V55H575.4000000000001C603.2 55 615.9000000000001 66 615.9000000000001 100.2C615.9000000000001 122.8 612.7 134.4 612.7 154.8C612.7 165.8 619.5 177.4 640 178.4V205.7000000000001C619.5 206.4 612.7 218.0000000000001 612.7 229.0000000000001zM507.1 197C491.3 203.3 476.6 207 476.6 217.5C476.6 225.4 482.9 230.1 494.5 230.1S516.6 225.4 528.1 217L549.1 244.8C536 254.8 518.1 265.3 493.9 265.3C458.2 265.3 434.0000000000001 244.8 434.0000000000001 215.9C434.0000000000001 190.2 456.6000000000001 177 475.5000000000001 169.7C491.8000000000001 163.4 507.6000000000001 158.1 507.6000000000001 147.6C507.6000000000001 139.7 501.3000000000001 134.5 487.1000000000001 134.5C474.0000000000001 134.5 460.8000000000001 139.8 446.6000000000001 150.8L425.6000000000001 120.3C441.4000000000001 107.1999999999999 465.5000000000001 98.1999999999999 485.5000000000001 98.1999999999999C527.5 98.1999999999999 550.1 120.3 550.1 149.1999999999999S527.6 190.1999999999999 507.1 197zM148.2000000000001 137.6C144.5000000000001 137.6 139.8000000000001 140.8 139.8000000000001 150.7000000000001V328.9H65.2C36.8 328.9 24.2 317.9 24.2 283.7C24.2 261.1 27.4 248.5 27.4 229.1C27.4 218.1 20.6 206.5 0.1 205.5V178.2C20.6 177.7 27.4 166.1 27.4 155.1C27.4 135.7 24.2 124.1 24.2 101.4999999999999C24.2 67.3 36.8 56.3 64.7 56.3H85.2V80.4999999999999H78.9C65.8 80.4999999999999 61.6 85.8 61.6 103.1S63.2 135.2 63.2 154.6C63.2 178.8 55.3 188.2 39.6 191.9V193.5C55.4 197.2 63.2 206.6 63.2 230.8C63.2 249.7 61.6 265 61.6 282.3S65.3 304.4 78.9 304.4H93V153.5999999999999C93 121.4999999999999 104 100.4999999999999 136.1 100.4999999999999C146.1 100.4999999999999 154 102.0999999999999 159.7 104.1999999999999L154.4 138.3999999999999C151.3 137.5999999999999 149.8 137.5999999999999 148.2 137.5999999999999zM379.9 197C363.6 203.3 348.9 207 348.9 217.5C348.9 225.4 355.2 230.1 366.8 230.1C378.4 230.1 388.9 225.4 400.4 217L421.4 244.8C408.3 254.8 390.4 265.3 366.2 265.3C330.5 265.3 306.3 244.8 306.3 215.9C306.3 190.2 328.9000000000001 177 347.8 169.7C364.1 163.4 379.9000000000001 158.1 379.9000000000001 147.6C379.9000000000001 139.7 373.6 134.5 359.4000000000001 134.5C346.3 134.5 333.1 139.8 318.9000000000001 150.8L298.4000000000001 120.3C314.2000000000001 107.1999999999999 338.3 98.1999999999999 358.3 98.1999999999999C400.3 98.1999999999999 422.9 120.3 422.9 149.1999999999999C423 178.0999999999999 400.4 190.1999999999999 379.9 197zM224.9 265.8C186.5 265.8 149.8 233.7 150.8 183.3C150.8 131.3 185 100.8 230.1 100.8C249 100.8 270 107.6 286.3 118.7L270.5 146.5C258.8999999999999 139.7 247.9 136.5 236.3 136.5C215.3 136.5 199 146.5 194.8 170.7H290C290.5 174.4 291.6 181.7 291.6 190.1C292.2000000000001 232.7 269 265.8 224.9 265.8zM194.9 199.6C198.1 220.6 210.7 230.6 225.4 230.6C244.3 230.6 251.7 217.5 251.7 199.6H194.9z" /> + <glyph glyph-name="line" + unicode="" + horiz-adv-x="448" d=" M272.1 243.8V172.7000000000001C272.1 170.9 270.7000000000001 169.5000000000001 268.9000000000001 169.5000000000001H257.5000000000001C256.4000000000001 169.5000000000001 255.4000000000001 170.1000000000001 254.9000000000001 170.8000000000001L222.3000000000001 214.8000000000001V172.6000000000001C222.3000000000001 170.8000000000001 220.9000000000001 169.4000000000001 219.1000000000001 169.4000000000001H207.7000000000001C205.9000000000001 169.4000000000001 204.5000000000001 170.8000000000001 204.5000000000001 172.6000000000001V243.7000000000001C204.5000000000001 245.5000000000001 205.9000000000001 246.9000000000001 207.7000000000001 246.9000000000001H219C220 246.9000000000001 221.1 246.4000000000001 221.6 245.5000000000001L254.2 201.5000000000001V243.7000000000001C254.2 245.5000000000001 255.6 246.9000000000001 257.4 246.9000000000001H268.8C270.6 247.0000000000001 272.1 245.5000000000001 272.1 243.8000000000001zM190.1 247H178.7C176.9 247 175.5 245.6 175.5 243.8V172.7000000000001C175.5 170.9 176.9 169.5000000000001 178.7 169.5000000000001H190.1C191.9 169.5000000000001 193.3 170.9 193.3 172.7000000000001V243.8000000000001C193.3 245.5000000000001 191.9 247.0000000000001 190.1 247.0000000000001zM162.6 187.4H131.5V243.8C131.5 245.6 130.1 247 128.3000000000001 247H116.9C115.1 247 113.7 245.6 113.7 243.8V172.7C113.7 171.8 114 171.1 114.6 170.5C115.2 170 115.9 169.6 116.8000000000001 169.6H162.5000000000001C164.3000000000001 169.6 165.7000000000001 171 165.7000000000001 172.8V184.2C165.7000000000001 185.9 164.3000000000001 187.4 162.6000000000001 187.4zM332.1 247H286.4000000000001C284.7000000000001 247 283.2000000000001 245.6 283.2000000000001 243.8V172.7000000000001C283.2000000000001 171.0000000000001 284.6 169.5000000000001 286.4000000000001 169.5000000000001H332.1C333.9000000000001 169.5000000000001 335.3 170.9 335.3 172.7000000000001V184.1C335.3 185.9 333.9000000000001 187.3 332.1 187.3H301V199.3H332.1C333.9000000000001 199.3 335.3 200.7 335.3 202.5V214C335.3 215.8 333.9000000000001 217.2 332.1 217.2H301V229.2H332.1C333.9000000000001 229.2 335.3 230.6 335.3 232.4V243.8C335.2 245.5 333.8 247 332.1 247zM448 334.3V49C447.9 4.2 411.2 -32.1 366.3 -32H81C36.2 -31.9 -0.1 4.9 0 49.7V335C0.1 379.8 36.9 416.1 81.7 416H367C411.8 415.9 448.1 379.2 448 334.3zM386.4 211.7C386.4 284.7 313.2 344.1 223.3 344.1C133.4 344.1 60.2 284.7 60.2 211.7C60.2 146.3 118.2 91.5 196.6 81.1C215.7 77 213.5 70 209.2 44.3C208.5 40.2 205.9 28.2 223.3 35.5C240.7 42.8 317.2 90.8 351.5 130.2C375.1 156.2 386.4 182.5 386.4 211.7z" /> + <glyph glyph-name="linkedin-in" + unicode="" + horiz-adv-x="448" d=" M100.3 -32H7.4V267.1H100.3V-32zM53.8 307.9C24.1 307.9 0 332.5 0 362.2C0 391.9 24.1 416 53.8 416C83.5 416 107.6 391.9 107.6 362.2C107.6 332.5 83.5 307.9 53.8 307.9zM448 -32H355.3V113.6C355.3 148.3 354.6 192.8 307 192.8C258.7 192.8 251.3 155.1 251.3 116.1V-32H158.5V267.1H247.6V226.3H248.9C261.3 249.8 291.6 274.6 336.8 274.6C430.8 274.6 448.1 212.7 448.1 132.3V-32z" /> + <glyph glyph-name="linkedin" + unicode="" + horiz-adv-x="448" d=" M416 416H31.9C14.3 416 0 401.5 0 383.7V0.3C0 -17.5 14.3 -32 31.9 -32H416C433.6 -32 448 -17.5 448 0.3V383.7C448 401.5 433.6 416 416 416zM135.4 32H69V245.8H135.5V32zM102.2 275C80.9 275 63.7 292.3 63.7 313.5S80.9 352 102.2 352C123.4 352 140.7 334.7 140.7 313.5C140.7 292.2 123.5 275 102.2 275zM384.3 32H317.9V136C317.9 160.8 317.4 192.7 283.4 192.7C248.8 192.7 243.5 165.7 243.5 137.8V32H177.1V245.8H240.8V216.6H241.7C250.6 233.4000000000001 272.3 251.1 304.6 251.1C371.8 251.1 384.3 206.8 384.3 149.2000000000001V32z" /> + <glyph glyph-name="linode" + unicode="" + horiz-adv-x="448" d=" M437.4 221.7C437.1 222.6 436.5 223.1 436 223.7L366 262.3C365.1 262.9 364 262.9 362.9 262.3L304 226.3C303.1 225.7 302.6 224.6 302.6 223.7L301.7000000000001 192.3L277.7000000000001 208.3C276.8000000000001 208.9 275.4000000000001 208.9 274.6 208.3L240 187.1L238.6 222.2C238.6 223.1 238 224.2 237.2 224.5L201.2 248.8000000000001L234.9 266.2000000000001C236 266.8000000000001 236.6 267.9000000000001 236.6 269.1L230.9 401.4000000000001C230.9 402.3000000000001 230 403.4000000000001 229.2 404.0000000000001L138.6 447.7C137.7 448 136.9 448 136.3 448L12.6 409.4C11.2 408.8 10.3 407.4 10.6 405.7L38 272.6C38.9 269.2 72 245.2 76.6 241.7L49.7 228.8C48.3 227.9 47.7 226.5 48 225.4L68.6 125.1C69.2 122.2 92.3 101.9999999999999 95.7 98.8L78.3 88.1999999999999C77.4 87.5999999999999 76.6 86.1999999999999 76.9 85.0999999999999C78.3 77.9999999999999 92.3 7.3999999999999 93.8 5.9999999999999L158.9 -63.1000000000001C159.5 -63.7000000000002 160.3 -63.7000000000002 161.2 -64.0000000000001C161.8 -64.0000000000001 162.3 -63.7000000000001 162.9 -63.4000000000001L246.6 3.4999999999999C247.5 4.0999999999999 247.7 4.8999999999999 247.7 5.7999999999999L245.7 51.7999999999999L273.7 28.0999999999999C274.8 27.1999999999999 276.5999999999999 27.1999999999999 277.7 28.0999999999999L344.5999999999999 81.4999999999999C345.4999999999999 82.0999999999999 345.7 82.8999999999999 345.7 83.7999999999999L348 117.1999999999999L368.3 103.1999999999999C369.4 102.2999999999999 370.9 102.2999999999999 372 103.1999999999999L426.6 146.8999999999999C427.2 147.1999999999999 427.7 147.9999999999999 427.7 148.8999999999999C428.6 155.3999999999999 438 219.6999999999999 437.4 221.6999999999999zM232.6 216.9L236.6 124.3L146 63.1L132 159.6999999999999L232.6 216.8999999999999zM224.9 396.9L230.3 270.9L123.7 215.5L104 350.3L224.9 396.9zM44 274.9L18 400L97.7 350.6L117.1 217.7L44 274.9zM74.6 127.1L55.7 218L125.7 159.7L139.4 66.3L74.6 127.1zM98.9 9.4L85.2 76.5L146.9 15.6L156.6 -51.8L98.9 9.4zM163.4 -55.1L152.8 15.8000000000001L238.5 77.2000000000001L241.6 7.2L163.4 -55.1zM245.4 60C245.4 63.4 246.3 82.9 243.4 85.1L219.1 105.1L241.4 120C243.7 121.7 242.5 125.7 242.5 128L271.9 105.4L272.5 37.1L245.4 59.9999999999999zM339.7 85.4L278.8 36.8L278.2 105.4L343.9 152.3L339.7 85.4zM367.4 111.1L348.3 124.5L350.3 158.5C350.6 159.3999999999999 350 160.5 349.2 161.1L308 188.3L308.6 218.3L373.2000000000001 177.7L367.4000000000001 111.1zM422 150.9L373.7 112.6L379.4 177.6999999999999L430.5 214.2999999999999L422 150.8999999999999z" /> + <glyph glyph-name="linux" + unicode="" + horiz-adv-x="448" d=" M196.1 324.4C195.9 325.8 198 326.7 199.3 327.3C201 328 203.2 328.3 204.8 327.4C205.2 327.2 205.6 326.7 205.4 326.3C205 325.1 203 325.3 201.9 324.7000000000001C200.9 324.2000000000001 200.1 323 198.9 323C197.9 322.9000000000001 196.2 323.4000000000001 196.1 324.4000000000001zM220.8 324.7C221.8 324.2 222.6 323 223.8 323C224.9 323 226.6 323.4 226.7 324.5C226.9 325.9 224.8 326.8 223.5 327.4C221.8 328.1 219.6 328.4 218 327.5C217.6 327.3 217.2 326.8 217.4 326.4C217.7 325.1 219.7 325.3 220.8 324.7zM435.5 14.5C435 6.3 429 0.7 421.6 -3.8C406.7000000000001 -12.8 384.3 -19.6 370.7000000000001 -36L368.1 -33.8L370.7000000000001 -36C356.5000000000001 -52.9 339.0000000000001 -62.6 322.4000000000001 -63.9C305.9000000000001 -65.1999999999999 290.4000000000001 -57.6 282.1 -40.9V-40.8C281 -38.6999999999999 280.2000000000001 -36.4 279.6 -34.1C258.1 -35.3 239.4000000000001 -28.8 224.5 -29.9999999999999C202.5 -31.1999999999999 188.7000000000001 -36.4999999999999 176.2000000000001 -36.6C171.4 -47.2 161.9 -54.2 150.3000000000001 -56.7999999999999C134.3000000000001 -60.4999999999999 114.2000000000001 -56.7999999999999 94.4 -46.4L96 -43.4L94.4 -46.4C75.9 -36.6 52.4 -37.5 35.1 -33.9C26.4 -32.1 18.8 -28.9 15 -21.6C11.3 -14.3 12 -4.3 17.2 10.1C18.9 15.2 17.6 22.8 16.4 30.9C15.8 34.8 15.2 38.8 15.2 42.7C15.2 47.0000000000001 15.9 51.2 18 55.1C22.5 63.6 29.8 67.2000000000001 36.5 69.6C43.2 72 49.3 73.6 53.5 77.9C58.7 83.4 63.6 92.3 70.1 98.1C67.5 115.3 70.3 133.5 76.3 151.4C88.9 189.3 115.5000000000001 225.6 134.4 248.1C150.5 271 155.2000000000001 289.4000000000001 156.9 312.8C158 344.6 132.4 448.2 234.8 448C315.7000000000001 447.9 311.1 362.6 310.6 316.7C310.3 286.6 326.9000000000001 266.2 344 244.7C359.2 226.7 379.1 200.4 390.5 170.3C399.8 145.6999999999999 403.4 118.5 394.2 91.1999999999999C395.6 90.6999999999999 397 89.9999999999999 398.3 89.1999999999999C399.7 88.3999999999999 401 87.3999999999999 402.3 86.3C408.9000000000001 80.6999999999999 411 71.9999999999999 412.8 63.9C414.7 55.8 416.4000000000001 48.2 420 44.2C431.1 31.8 435.9 22.7 435.5 14.5zM220.8 338.9C224.4 338 229.7 336.5 233.8 334.5C231.7 346.7 238.3 358 245.6 357.5C254.5000000000001 357.2 259.5 342 254.7 330.2C253.9 328.3 251.9 326.8 250.8 325.6C257.5 323.3 261.8 321.5 263.4000000000001 320.7C271.3 330.2 274.2000000000001 346.9 267.7000000000001 361.1C257.9000000000001 382.5 233.5000000000001 382.9 223.7000000000001 360.7C220.5000000000001 353.5 219.8000000000001 345.8 220.8000000000001 338.9zM174.6 320.1C182.4 325.8 181.5 324.8 180.5 325.6C172.5 332.5 173.9 353 182.3000000000001 353.7000000000001C188.6000000000001 354.2000000000001 193.1000000000001 343 191.9 334.1C195 336.2000000000001 198.6 337.7000000000001 202.1 338.7000000000001C203.8 358 193.1 372.2000000000001 183 372.2000000000001C164.1 372.2000000000001 159 334.7000000000001 174.6 320.1zM165.2 299.2000000000001C166.7 294.3 171.3 288.7000000000001 179.9 283.9C187.7 279.3 191.9 272.4 199.9 268.9C202.5 267.8 205.6 267 209.5 266.8C227.9 265.7000000000001 236.6 278.1 247.7 281.7000000000001C259.4 285.4 267.8 292.7000000000001 270.4 299.8C273.6 308.3 268.3 314.5 259.9 318C248.6 322.9 243.6 323.2 237.3 327.3C227 333.9 218.5 336.2 211.4 336.2C197 336.2 188.2 326.4 183.5 322C183 321.5 175.6 316.1 169.4 311.5C165.2 308.2 163.8 304.1 165.2 299.2zM131.7 46.4L112.1 82C105.3 91.2 98.3 96.8 90.2 98C82.5 99.2 77.6 96.6 72.5 91.1C67.7 86 63.7 78.8 58.2 73.1C50.4 66.6 48.9 66.9 38.6 63.2000000000001C32.3 61.0000000000001 27.3 58.6 23.8 51.9C21.1 46.9 21.7 39.7 22.9 31.9C24.1 24.0000000000001 25.9 15.6 23.5 8.0000000000001V7.8000000000001C18.5 -5.8999999999999 18.5 -13.8999999999999 20.9 -18.5999999999999C28.8 -33.9999999999999 67.5 -24.6999999999999 97.4 -40.4999999999999C128.8 -56.8999999999999 170 -57.5999999999999 172.7 -22.4999999999999C174.8 -1.9999999999999 141.2 26.5000000000001 131.7 46.4000000000001zM285.6 10.6C288.8 21.6 291.9000000000001 31.9 292.4000000000001 39.6C293.2000000000001 54.8 294.0000000000001 68.3 296.8 79.4999999999999C299.9000000000001 92.1 306.1 102.6 318.2 106.8C320.5 127.9 336.9 127.9 356.5 119.3C375.4 110.8 382.5 103.3 379.3 93.1999999999999C380.3 93.1999999999999 381.3 93.3 383.5 93.1999999999999C388.7 110.0999999999999 369.2 121.1999999999999 352.8 128C355.7 140 355.2 152.1 352.4000000000001 163.6999999999999C346.4000000000001 189 329.8 211.5 317.2000000000001 222.6999999999999C314.9000000000001 222.7999999999999 315.1 220.7999999999999 319.8000000000001 216.1999999999999C331.4000000000001 205.5 356.9000000000001 167 343.1000000000001 131.3C339.2000000000001 132.3 335.5000000000001 132.8 332.2000000000001 132.6999999999999C326.9000000000001 161.8 314.7000000000001 185.8999999999999 308.6000000000001 197.2999999999999C297.1000000000001 218.6999999999999 279.1000000000001 262.5999999999999 271.4000000000001 293C266.9000000000001 286.5999999999999 259.0000000000001 281.0999999999999 249.1000000000001 278C244.4000000000001 276.5 239.4000000000001 272.5 233.2000000000001 269C219.3000000000001 261 203.2000000000001 260.2 190.8000000000001 270.2C186.3000000000001 273.8 182.8000000000001 277.8 178.2000000000001 280.5C176.6000000000001 281.4 173.1000000000001 283.8 172.0000000000001 284.5999999999999C170.0000000000001 246.8 144.7000000000001 199.3 132.7000000000001 171.8999999999999C124.4000000000001 152.1999999999999 119.5000000000001 131.0999999999999 118.9000000000001 110.3999999999999C97.1000000000001 139.5 113.0000000000001 176.6999999999999 121.5000000000001 192.7999999999999C131.0000000000001 210.3999999999999 132.5000000000001 215.2999999999999 130.2000000000001 213.5999999999999C121.6000000000001 199.5999999999999 108.2000000000001 177.3 103.0000000000001 154.3999999999999C100.3000000000001 142.5 99.8000000000001 130.3999999999999 103.3000000000001 119.1999999999999C106.8000000000001 107.9999999999999 114.4000000000001 97.6999999999999 127.9000000000001 89.3C127.9000000000001 89.3 152.7000000000001 74.9999999999999 166.2000000000001 56.8C173.6000000000001 46.8 175.9000000000001 38.1 173.6000000000001 31.9C171.1000000000001 25.2 164.0000000000001 23 156.9000000000001 23C161.7000000000001 17 167.2000000000001 10 171.3000000000001 3.4C208.9000000000001 -22.3 253.5000000000001 -12.3 285.6000000000002 10.6zM415 39.5C405 50.8 407.8 72.6 397.9 81.1C391 87.1 384.3 86.5 375.3 86.2000000000001C367.6 77.4 349.5 66.6 336.9 69.9C325.4 72.8 318.9 86.2000000000001 318.1 99.4C317.8 99.2000000000001 317.4 99.1 317.1 98.9C310 95.0000000000001 306 88.1 303.4 77.8C300.9 67.6 300 54.3 299.2 39.1C298.5 27.3 293 12.7 289.3 -1.5C285.8 -14.7 283.5 -26.7 288.2 -37.8C295.4 -52.3 307.7 -58.2 321.9 -57.1C336.1 -56 352.3 -47.3 365.5 -31.6C387.5 -5 427.8 -1.9 428.7 14.9C429 20 425.6 27.9 415 39.5zM173.3 299.3C175.3 297.4 178 294.8 181.3 292.2000000000001C187.9 287 197.1 281.6 208.6 281.6C220.2 281.6 231.1 287.5 240.4000000000001 292.4000000000001C245.3000000000001 295 251.3000000000001 299.4000000000001 255.2000000000001 302.8000000000001C259.1 306.2000000000001 261.1 309.1 258.3000000000001 309.4000000000001C255.5000000000001 309.7000000000001 255.7000000000001 306.8000000000001 252.3000000000001 304.3000000000001C247.9000000000001 301.1 242.6000000000001 296.9000000000001 238.4000000000001 294.5C231.0000000000001 290.3000000000001 218.9000000000001 284.3000000000001 208.5000000000001 284.3000000000001C198.1000000000001 284.3000000000001 189.8000000000001 289.1 183.6000000000001 294C180.5000000000001 296.5 177.9000000000001 299 175.9000000000001 300.9000000000001C174.4000000000001 302.3000000000001 174.0000000000001 305.5 171.6000000000001 305.8000000000001C170.2000000000001 305.9000000000001 169.8000000000001 302.1 173.3000000000001 299.3000000000001z" /> + <glyph glyph-name="lyft" + unicode="" + horiz-adv-x="512" d=" M0 366.9H77.8V158.2000000000001C77.8 125.1 92.8 105.4 105 97.2000000000001C92.3 86.1 53.8 76.3000000000001 24.8 100.0000000000001C7.8 114 0 137.3 0 159V366.9zM485.9 193.4V215.4H509.7V292.2H483.6C473.4999999999999 338.5 432.4 372.9 383.3 372.9C326.7 372.9 280.6 326.9 280.6 270.2V91C296.6 88.7 316 91.3 332.3 105C349.4 119 357.1 142.2 357.1 164V170.7H395.9V247.5H357.1V270.8C357.1 305.4 409.3 305.4 409.3 270.8V193.7C409.3 137.1 455.3 91 511.9999999999999 91V167.5C497.4999999999999 167.5 485.8999999999999 179.2 485.8999999999999 193.4zM191.6 292.4V179.4C191.6 164 167.8 164 167.8 179.4V292.4H91V159.7C91 135.9 99 105.7 136 95.8C173 86 194.2 106.4 194.2 106.4C192.1 93.0000000000001 179.7 83.1 159.3 81.1C143.8 79.5 124.1 84.7000000000001 114.3 88.9V18.6C139.4 11.1 165.8 8.8 191.9 13.9C239 23.0000000000001 268.7 62.3 268.7 114.7000000000001V292.9H191.6V292.4z" /> + <glyph glyph-name="magento" + unicode="" + horiz-adv-x="448" d=" M445.7 320.1V64L382.3 27.5V283.3L223.8 374.9L65.2 283.3L65.6 27.4L2.3 64V319.9L224.2 448L445.7 320.1zM255.6 27.5L224 9.1L192.2 27.3V283.3L128.9 246.7L129 -9.2L223.9 -64.1L319 -9.2V246.8L255.6 283.4V27.4999999999999z" /> + <glyph glyph-name="maxcdn" + unicode="" + horiz-adv-x="512" d=" M461.1 5.3H363.7000000000001L415.6 248C417.9000000000001 258.2 416.5 267.5 411.2000000000001 273.7C406.2000000000001 279.8 397.5000000000001 283.3 387.0000000000001 283.3H337.7000000000001L278.2000000000001 5.3H180.8000000000001L240.3000000000001 283.3H156.9L97.4 5.3H0L59.5 283.3L14.9 378.7H387C426.4 378.7 462.3 362.4 485.3 333.8C508.6 305.2 517.1 266.4 508.9 227.9L461.1 5.3z" /> + <glyph glyph-name="medapps" + unicode="" + horiz-adv-x="320" d=" M118.3 209.6C121.8 222.1 125.2 243.2 131.5 243.2C139.8 241.4 141.1 219.8 150.1 206.6C154.7 230.1 155.4 291.7 164.2 293.3C173.2 294 183.9 226.8 186.2 215.8C196.1 211.7 235.1 209.2 235.1 209.2C237 201.9 211.1 201.6 195.1 201.4C190.5 186.6 189.7 173.7 183.7 173.4C179 173.2 175.5 202.2 166.2 223L156.8 157.5C152.4 144.5 141.3 180 134.9 196.8C131.6 196.9 72.5 198.4 87.3 204.6L118.3 209.6zM228 0C249.2 0 249.2 32 228 32H92C70.8 32 70.8 0 92 0H228zM204 -64C225.2 -64 225.2 -32 204 -32H116C94.8 -32 94.8 -64 116 -64H204zM238.2 77.5C241.4 96.4 243.4 113.9 250.1 126.3C258 141 266.2 154.4 274.1 167.3C298.7000000000001 207.7 320 242.5 320 292.8C320 378.4 248.2 448 160 448S0 378.4 0 292.8C0 242.6 21.3 207.7 45.9 167.3C53.8 154.4 61.9 141 69.9 126.3C76.6 113.8 78.6 96.5 81.8 77.4C85.3 56.4 117.9 61.7000000000001 114.4 82.5000000000001C110.8 104.2000000000001 108.8 123.2000000000001 99.1 141.1000000000001C66.5 201.5 33 236.7 33 292.8C33 360.7 90 416 160 416S287 360.7 287 292.8C287 236.7 253.5 201.5 220.9 141.2000000000001C211.2 123.2000000000001 209.2 103.8000000000001 205.6 82.6C202.2 62 234.6 56.2 238.2 77.5z" /> + <glyph glyph-name="medium-m" + unicode="" + horiz-adv-x="512" d=" M71.5 305.7C72.1 311.6 69.8 317.5 65.4 321.5L20.3 375.9V384H160.5L268.9 146.3L364.2 384H497.9V375.9L459.3 338.9C455.9999999999999 336.4 454.3 332.2 454.9999999999999 328.1V56.1C454.3 52 455.9999999999999 47.8 459.3 45.3L496.9999999999999 8.3V0.2H307.3V8.3L346.4000000000001 46.2C350.2000000000001 50 350.2000000000001 51.2 350.2000000000001 57V276.8L241.5 0.9H226.8L100.4 276.8V91.9C99.3 84.1 101.9 76.3 107.4 70.7L158.2 9.1V0.9999999999999H14.2V8.9999999999999L65 70.7C70.4 76.3 72.9 84.2 71.5 91.9V305.7z" /> + <glyph glyph-name="medium" + unicode="" + horiz-adv-x="448" d=" M0 416V-32H448V416H0zM372.2 309.9L348.2 286.9C346.1 285.3 345.1 282.7000000000001 345.5 280.2000000000001V110.9C345.1 108.3 346.1 105.7 348.2 104.2L371.7 81.2V76.1H253.7V81L278 104.6C280.4 107 280.4 107.7000000000001 280.4 111.3V248.2L212.8 76.6H203.7L125 248.2V133.2C124.3 128.4 126 123.5 129.4 120L161 81.7V76.6H71.2V81.7L102.8 120C106.2 123.5 107.7 128.4 106.9 133.2V266.2C107.3 269.9 105.9 273.5 103.1 276L75 309.9V315H162.3L229.7 167L289 314.9H372.2V309.9z" /> + <glyph glyph-name="medrt" + unicode="" + horiz-adv-x="544" d=" M113.7 192C113.7 70.2 197.6 -30.8 307.2 -49.1C288.5 -53.6 269 -56 249 -56C111.4 -56 0 55 0 192S111.4 440 248.9 440C269 440 288.5 437.6 307.1 433.1C197.5 414.8 113.7 313.8 113.7 192M411.1 91.7C333.4 36.3 231.5 44.2 170.7 106.3C176.2 92.2 183.4 78.6 192.4 65.8C254 -22.4 374.8 -43.5 462.0999999999999 18.8C549.3999999999999 81.1 570.1999999999999 203.1 508.5999999999999 291.4000000000001C499.5999999999999 304.3000000000001 489.2999999999999 315.7000000000001 478.0999999999999 325.6C515.4999999999999 246.8000000000001 488.7999999999999 147.1 411.0999999999999 91.7000000000001M192.2999999999999 335.7000000000001C190.8999999999999 334.7000000000001 189.5999999999999 333.6 188.2999999999999 332.6C252.5999999999999 350.4000000000001 324.2 328.6 367.2 272.1C402.8999999999999 225.1000000000001 410.0999999999999 165.5000000000001 391.5999999999999 114.1C448.2999999999999 170.3 459.1999999999999 256.2000000000001 413.8999999999999 315.9000000000001C363.8999999999999 381.4000000000001 264.8 390.3000000000001 192.2999999999999 335.7000000000001M296 224C291.6 224 288 227.6 288 232V272C288 276.4 284.4 280 280 280H232C227.6 280 224 276.4 224 272V232C224 227.6 220.4 224 216 224H176C171.6 224 168 220.4 168 216V168C168 163.6 171.6 160 176 160H216C220.4 160 224 156.4 224 152V112C224 107.6 227.6 104 232 104H280C284.4 104 288 107.6 288 112V152C288 156.4 291.6 160 296 160H336C340.4 160 344 163.6 344 168V216C344 220.4 340.4 224 336 224H296z" /> + <glyph glyph-name="meetup" + unicode="" + horiz-adv-x="512" d=" M99 33.7C100.1 28 96.7 22.6 91 21.4C85.6 20.3 80.1 23.7 79 29.4C77.9 34.8 81.3 40.5 86.7 41.7C92.1 42.9 97.8 39.4 99 33.7zM242.1 -37.7C235.8 -42.3000000000001 234.1 -51.1 238.4 -57.7C243 -64.3000000000001 251.8 -66 258.4 -61.4C264.7 -56.8 266.4 -48.0000000000001 261.8 -41.4C257.6 -34.9 248.7 -33.1 242.1 -37.7zM156.1 424.6C162.4 426 166.4 432.3 165 438.6C163.9 445.2 157.6 449.2 151.3 447.7C145 446.3 141 440 142.2 433.7C143.6 427.1 149.8 423.1 156.1 424.6zM34.4 221.7C24.4 228.6 10.7 226 3.8 215.7C-3.1 205.7 -0.5 191.7 9.5 184.8C19.5 177.7 33.2 180.2 40.1 190.5C47 200.9 44.4 214.6 34.4 221.7zM306.4 392.6C317 398.9 320.1 412.6 314.1 422.9C307.8 433.5 294.4 436.9 284.1 430.6S270.4 410.6 276.7 400C282.7 389.7 296.1 386.3 306.4 392.6zM115.3 334.6C123 340 124.7 350.6 119.6 358.3S103.9 367.7 96.5 362.6C88.8 357.2 87.1 346.6 92.2 338.9C97.3 331.1 107.8 329.4 115.3 334.6zM487.6 178.6C480.2 176.9 475.3 169.5 477 161.7000000000001C478.4 154.3000000000001 485.9 149.4 493.3 151.1C500.7 152.5 505.6 160 503.9 167.7000000000001C502.4 175.1 495.0000000000001 180.0000000000001 487.6 178.6zM527.3000000000001 235.4000000000001C526.2 241.1 520.7 244.5000000000001 515.3000000000001 243.4000000000001C509.6000000000001 242.3000000000001 506.2 236.5000000000001 507.3000000000001 230.8000000000001C508.4000000000001 225.4000000000001 513.9000000000001 221.7000000000001 519.6 222.8000000000001C525 224.3000000000001 528.7 229.7000000000001 527.3000000000001 235.4000000000001zM447 309.1C438.4 303.1 436.4 291.4 442.1 282.8C447.8 274.2 459.5 272.2 468.1 277.9C476.4 283.9 478.4 295.6 472.7 304.2C467.0000000000001 312.9 455.3000000000001 315.1 447.0000000000001 309.1zM440.7 169.7C467 126.6 455.8 69.7 414.4 40.6C397 28.3 377.3 22.9 357.5 23.5C345.5 -23.6 288.1 -41.1 252.4 -9.1C251.3 -10 249.8 -10.8 248.7 -12C209.6 -39.1 156.4 -29.4 129.3 10.3C119.6 24.6 114.7 40.9 114.2 57.2C48.8 68.1 24.2 151.2 73.1 196.9C44.8 243.8 73.7 304.3 126.5 311.8C151.6 378 234.1 409.4 290.1 366C357.5 388.3 426.4000000000001 336.6 421 264.9C462.1 252.3 473.8 198 440.7 169.7zM370.7 95.4C367.6 116 329.8 100 327.6 122.5C324.5 154.5 371.3 223.6 367.6 250.5C364.2 274.5 348.2 279.6 334.2 279.9C320.8 280.2000000000001 317.3 277.9 312.8 275.3C309.9000000000001 273.6 306.2 270.4 301.1 275.6C294.8 281.6 290 287.3 281.7000000000001 288.5C269.4000000000001 290.5 264.0000000000001 286.5 255.1000000000001 278.8000000000001C251.7000000000001 275.9000000000001 243.1000000000001 265.9000000000001 235.1000000000001 269.7000000000001C231.7000000000001 271.4000000000001 219.7000000000001 277.4000000000001 211.1000000000001 281.1C194.8000000000001 288.2000000000001 171.1000000000001 276.5000000000001 162.5000000000001 261.1C149.6000000000001 238.2000000000001 124.5000000000001 148.0000000000001 120.8000000000001 136.0000000000001C112.2000000000001 109.4 131.7000000000001 87.4 157.7000000000001 88.9C168.8000000000001 89.5000000000001 176.0000000000001 93.5000000000001 183.1000000000001 106.3C187.1000000000001 113.7 224.8000000000001 214 227.7000000000001 218.9C229.7000000000001 222.3 236.6000000000001 226.9 242.3000000000001 224C248.0000000000001 220.9 249.2000000000001 214.6 248.3000000000001 208.9C247.2000000000001 199.2 220.3000000000001 138 219.4 131.2C216 108.3 246.3000000000001 104.6 258.0000000000001 127.2C261.7000000000001 134.3 303.7000000000001 219.8 307.4000000000001 225.5C311.7000000000001 231.8 314.8 233.8 319.1 233.5C322.2000000000001 233.5 327.4000000000001 232.6 326.2000000000001 222.6C324.8000000000001 213.2 291.1 150.3 287.3000000000001 134.9C282.7000000000001 114.3 293.9000000000001 93.5 312.2000000000001 84.3C323.6 78.6 374.7000000000001 68.6 370.7000000000001 95.4zM376.4 3.1C366.1 -4.3 363.5 -18.9 370.7 -29.5000000000001C377.8 -40.1000000000001 392.1 -42.6000000000001 402.7 -35.5000000000001C413.3 -28.1000000000001 415.8 -13.5000000000001 408.7 -2.9C401.3 7.7 387 10.6 376.4 3.1z" /> + <glyph glyph-name="microsoft" + unicode="" + horiz-adv-x="448" d=" M0 416H214.6V201.4H0V416zM233.4 416H448V201.4H233.4V416zM0 182.6H214.6V-32H0V182.6zM233.4 182.6H448V-32H233.4V182.6z" /> + <glyph glyph-name="mix" + unicode="" + horiz-adv-x="448" d=" M0 384V35.1C0 -21.1 88 -23 88 35.1V273.7C95.9 326.6 176 324.1 176 267.2V91.9C176 34 272 33.9 272 91.9V208C277.3 262.7 360 260.5 360 203.7V179.9C360 120 448 123.3 448 179.9V384H0z" /> + <glyph glyph-name="mixcloud" + unicode="" + horiz-adv-x="640" d=" M424.43 228.271C416.124 313.273 344.135 380 256.919 380C184.653 380 120.695 333.4840000000001 97.714 265.926C43.169 257.897 1.084 211.104 1.084 154.344C1.084 92.046 51.752 41.378 114.327 41.378H403.9409999999999C456.2699999999999 41.378 498.9099999999999 83.74 498.9099999999999 136.071C498.9099999999999 181.202 466.7919999999999 219.134 424.4299999999999 228.271zM403.9410000000001 83.741H114.327C75.287 83.741 43.446 115.305 43.446 154.345S75.287 224.949 114.327 224.949C133.154 224.949 150.875 217.474 164.165 204.183C184.128 184.22 214.298 214.41 194.345 234.363C179.67 248.761 161.673 258.728 142.292 263.712C162.227 308.012 207.082 337.638 256.92 337.638C326.416 337.638 382.899 281.155 382.899 211.936C382.899 198.368 380.6840000000001 185.079 376.53 172.342C367.587 144.825 408.663 133.403 416.677 159.052C419.446 167.358 421.661 175.941 423.046 184.524C442.4269999999999 177.048 456.5479999999999 158.221 456.5479999999999 136.0709999999999C456.5479999999999 107.2759999999999 433.0129999999999 83.7409999999999 403.9409999999999 83.7409999999999zM639.01 136.071C639.01 92.047 626.273 49.6849999999999 601.908 13.414C597.755 7.322 591.11 4 584.188 4C567.871 4 557.061 22.826 566.745 36.949C586.126 66.298 596.648 100.631 596.648 136.071S586.1270000000001 205.844 566.745 234.9160000000001C551.09 257.747 586.106 282.1560000000001 601.908 258.4500000000001C626.274 222.457 639.01 180.0940000000001 639.01 136.071zM568.13 136.071C568.13 104.506 558.9929999999999 74.05 541.273 47.746C537.12 41.655 530.475 38.61 523.553 38.61C506.352 38.61 496.531 57.5889999999999 506.11 71.5579999999999C519.123 90.6619999999999 525.768 112.8129999999999 525.768 136.0709999999999C525.768 159.0519999999999 519.123 181.4789999999999 506.11 200.5829999999999C490.349 223.5689999999999 525.118 247.6779999999999 541.273 224.1179999999999C558.9920000000001 198.0919999999999 568.13 167.6349999999999 568.13 136.0709999999999z" /> + <glyph glyph-name="mizuni" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 328.9 0 192C0 55 111 -56 248 -56S496 55 496 192C496 328.9 385 440 248 440zM168 88.1C136.6 77.5 109.2 60.8 88 39.9V312C88 334.1 105.9 352 128 352S168 334.1 168 312V88.1zM288 98C275.1 100 261.8 101.1 248.2 101.1C234.4 101.1 221 100 208 98V312C208 334.1 225.9 352 248 352S288 334.1 288 312V98zM408 40.3C386.8 61.1 359.4 77.7 328 88.3V312C328 334.1 345.9 352 368 352S408 334.1 408 312V40.3z" /> + <glyph glyph-name="modx" + unicode="" + horiz-adv-x="448" d=" M356 206.2L392.7 182.5V-32L259.7 51.8L356 206.2zM440 373H226.3L203.3 335.2L356.8 238.7L440 373zM351 230.2L55.2 416V201.5L101.2 172.5L351 230.2zM97 153.8L8 11H221.7L346.7 211.5L97 153.8z" /> + <glyph glyph-name="monero" + unicode="" + horiz-adv-x="496" d=" M352 64H460.4C417 -7.9 338.1 -56 248 -56S79 -7.9 35.6 64H144V191.8L248 87L352 192V64zM88 112V320L247.4 160.6L408 320V112H482.8C491.3 137.1 496 164 496 192C496 329 385 440 248 440S0 329 0 192C0 164 4.6 137.1 13.2 112H88z" /> + <glyph glyph-name="napster" + unicode="" + horiz-adv-x="496" d=" M298.3 74.4C284.1 60.8 267 50.3 247.9 43.9C228.9 50.3 211.7 60.8 197.6 74.4H298.3zM342.3 274C362.3 290.9 385.9000000000001 303.2 411.9 310.2V149C411.9 -70.4 83.9 -68.6 83.9 148.7V310.3C109.8 303.4 133.5 290.7000000000001 153.4 273.9C210.2 313.9 285.9 313.8 342.3 274zM133.5 332.5C197.9 392.5 297.8 392.6 362.4 332.7C355.3 329.2 348.5 325.4 341.8 321.2C283.1 351.7 212.6 351.6 153.9 321.1C147.5999999999999 325.1 140 329.3 133.5 332.5zM43.8 354.8V285.5C-14.6 249 -14.6 164.4 43.9 127.2C70.3 -117.9 425.6 -113.1 451.5 125.7L451.8 127.4C510.5 163.7 510.7 249.1 452 285.6V354.8C434.7 354.3 418 351.8 401.9 347.4C319.9 438.9 176.4 438.9 94.4 347.3C78.1 351.7 61.3 354.3 43.8 354.8zM259.2 96S295.2 96.3 320.5 97.5C330.7 98 341.6 101.5 346 104C372.3 119.1 371.4 143.2 372.2 151.4C292.7 152 272.3 155.3 259.2 96zM123.7 151.3C124.5 143.1 123.6 119 149.9 103.9C154.3 101.4 165.1 97.9 175.4 97.4C200.7 96.3 236.7 95.9 236.7 95.9C223.5 155.3 203 152.0000000000001 123.7 151.3zM292.8 27.9C289.6 33.2 285.9 35.2 285.9 35.2C261.1 27.9 233.7 28.3 210 35.2C210 35.2 207.1 33.7 203.6 28.6C200.8 24.4999999999999 199.9 18.9999999999999 199.9 18.9999999999999C229 1.3999999999999 267 1.3999999999999 296.1 18.9999999999999C296 19.1 295.8 22.9999999999999 292.8 27.8999999999999z" /> + <glyph glyph-name="nintendo-switch" + unicode="" + horiz-adv-x="448" d=" M95.9 414.5C51.3 406.5 15.4 373.5 4.1 330.1C0 314.4 -0.3 305.2 0.2 183.6C0.4 72 0.5 69.4 2.4 60.7C12.7 14.2 45.7 -18.9 92.7 -29.8C98.8 -31.2 106.6 -31.5 156.8 -31.7C208.7 -32.1 214.1 -32 215.5 -30.6C216.9 -29.2 217 -11.3 217 191.6C217 342.1 216.7 412.9000000000001 216.1 414.2000000000001C215.2 415.9000000000001 213.6 416 159.2 415.9000000000001C115 415.8 101.7 415.5 95.9 414.5zM179.8 191.9V4L142 4.5C107.2 4.9 103.5 5.1 96.5 6.8C66.6 14.5 44.5 37.5 38.2 67.5C36.2 76.9 36.2 307.6 38.1 316.8C43.7 342.9 61.8 364.5 86.1 374.2000000000001C98.3 379.1 104 379.7000000000001 143.7 379.8L179.6 379.9V191.9zM103.9 323.1C98.1 322 89.2 317.5 84.4 313.4C74.7 305 69.8 293 70.6 278.9C71 271.6 71.4 269.6 74.4 263.7C78.8 254.7 85.3 248.1 94.3 243.7C100.5 240.6 102.1 240.3 110.2 240C117.5 239.7 120.1 240 125 241.7C145.1 248.5 157.3 268 153.8 288.1C149.9 311.8 127.2 327.8 103.9 323.1zM262.1 415.4C261.7000000000001 415.1 261.5 314.6 261.5 191.9C261.5 -10.4 261.6 -30.9 263 -31.5C265.5 -32.4 337.5 -32.1 346.4 -31.1C384.1 -26.8 417.4 -3.9 435.4 30.1C437.7 34.4999999999999 440.8 41.8 442.4 46.3C448.2 63.6999999999999 448.1 59.1 448.1 192.4C448.1 298.8 447.9 314.7 446.6 321.4C437.4 369.7 400.5 406.2 352.1 414.5C345.6 415.6 335.6 415.8999999999999 303.3 415.8999999999999C280.9 416 262.4 415.7 262.1 415.3999999999999zM361.2000000000001 213.3C375.7000000000001 209.5 387.5000000000001 198.5 392.4000000000001 184.4C395.5000000000001 175.7 395.4000000000001 162.9 392.3 154.9C386.6 140.2 375.5 129.9 361.2 126.1C338 120.1 313.3 134.1 306.6 157.1C304.6 164.1 304.7 176 307 183.3C313.8999999999999 206 338 219.4 361.2 213.3z" /> + <glyph glyph-name="node-js" + unicode="" + horiz-adv-x="448" d=" M224 -60C217.3 -60 210.5 -58.2 204.6 -54.8L142.9 -18.3C133.7 -13.1 138.2 -11.3 141.2 -10.3C153.5 -6 156 -5.1 169.1 2.4C170.5 3.2 172.3 2.9 173.7 2L221.1 -26.1C222.8 -27.1 225.2 -27.1 226.8 -26.1L411.5 80.5C413.2 81.5 414.3 83.5 414.3 85.5V298.7C414.3 300.8 413.2 302.7 411.4000000000001 303.8L226.8 410.3C225.1 411.3 222.8 411.3 221.1 410.3L36.6 303.7C34.8 302.7 33.7 300.7 33.7 298.6V85.5C33.7 83.5 34.8 81.5 36.6 80.6L87.2 51.4C114.7 37.7 131.5 53.8 131.5 70.1V280.5C131.5 283.5 133.9 285.8 136.9 285.8H160.3C163.2 285.8 165.7 283.5 165.7 280.5V70C165.7 33.4 145.7 12.4 111 12.4C100.3 12.4 91.9 12.4 68.5 24L20.1 51.9C8.1 58.8 0.7 71.7 0.7 85.6V298.7C0.7 312.5 8.1 325.5 20.1 332.4L204.6 439C216.3 445.6 231.8 445.6 243.4 439L428.1 332.3C440.1 325.4 447.5 312.5 447.5 298.6V85.5C447.5 71.7 440.1 58.8 428.1 51.8L243.4 -54.8C237.5 -58.2 230.8 -60 224 -60zM373.1 150.1C373.1 190 346.1 200.6 289.4000000000001 208.1C232.0000000000001 215.7 226.2000000000001 219.6 226.2000000000001 233.0000000000001C226.2000000000001 244.1 231.1000000000001 258.9000000000001 273.6 258.9000000000001C311.5 258.9000000000001 325.5 250.7000000000001 331.3 225.1C331.8 222.7 334 220.9 336.5 220.9H360.5C362 220.9 363.4 221.5 364.4 222.6S365.9 225.2 365.8 226.7C362.1 270.8 332.8 291.3 273.6 291.3C220.9 291.3 189.5 269.1 189.5 231.8C189.5 191.4 220.8 180.2 271.3 175.2C331.8 169.3 336.5 160.4 336.5 148.5C336.5 127.9 319.8999999999999 119.1 281 119.1C232.1 119.1 221.4 131.4 217.8 155.7000000000001C217.4 158.3000000000001 215.2 160.2000000000001 212.5 160.2000000000001H188.5999999999999C185.5999999999999 160.2000000000001 183.2999999999999 157.8000000000001 183.2999999999999 154.9C183.2999999999999 123.8 200.1999999999999 86.7000000000001 281.0999999999999 86.7000000000001C339.4999999999999 86.8000000000001 373.0999999999999 109.9 373.0999999999999 150.1z" /> + <glyph glyph-name="node" + unicode="" + horiz-adv-x="640" d=" M316.3 -4C314.2 -4 312.1 -3.4 310.2 -2.4L291 9C288.1 10.6 289.5 11.2 290.5 11.5C294.3 12.8 295.1 13.1 299.2 15.5C299.6 15.7 300.2 15.6 300.6 15.4L315.4 6.6C315.9 6.3 316.7 6.3 317.2 6.6L375 40C375.5 40.3 375.9 40.9 375.9 41.6V108.3C375.9 109 375.6 109.6 375 109.9L317.2 143.2000000000001C316.7 143.5000000000001 316 143.5000000000001 315.4 143.2000000000001L257.6 109.9C257 109.6 256.7 108.9 256.7 108.3V41.6C256.7 41 257.1 40.4 257.6 40.1L273.4 31C282 26.7 287.3 31.8 287.3 36.8V102.7000000000001C287.3 103.6 288 104.4 289 104.4H296.3C297.2 104.4 298 103.7000000000001 298 102.7000000000001V36.8000000000001C298 25.3000000000001 291.8 18.8000000000001 280.8999999999999 18.8000000000001C277.5999999999999 18.8000000000001 274.8999999999999 18.8000000000001 267.5999999999999 22.4000000000001L252.3999999999999 31.1000000000001C248.7 33.3000000000001 246.3 37.3000000000001 246.3 41.6000000000001V108.3000000000001C246.3 112.6000000000001 248.6 116.7000000000001 252.3999999999999 118.8000000000001L310.2 152.2000000000001C313.8999999999999 154.3000000000001 318.7 154.3000000000001 322.3 152.2000000000001L380.1 118.8000000000001C383.8 116.6000000000001 386.2 112.6000000000001 386.2 108.3000000000001V41.6000000000001C386.2 37.3000000000001 383.9 33.2000000000001 380.1 31.1000000000001L322.3 -2.2999999999999C320.6 -3.3999999999999 318.5 -3.9999999999999 316.3 -3.9999999999999zM363 61.8C363 74.3 354.6 77.6 336.8 80C318.8 82.4 317 83.6 317 87.8C317 91.3 318.5 95.9 331.8 95.9C343.7 95.9 348.1 93.3 349.9000000000001 85.3C350.1 84.5 350.7000000000001 84 351.5000000000001 84H359.0000000000001C359.5000000000001 84 359.9000000000001 84.2 360.2000000000001 84.5C360.5000000000001 84.9 360.7000000000001 85.3 360.6 85.8C359.4000000000001 99.6 350.3 106 331.8 106C315.3 106 305.5 99 305.5 87.4C305.5 74.7 315.3 71.3 331.1 69.7C350 67.8 351.5 65.1 351.5 61.4C351.5 54.9 346.3 52.2 334.1 52.2C318.8 52.2 315.4000000000001 56 314.3 63.6C314.2 64.4 313.5 64.9999999999999 312.6 64.9999999999999H305.1C304.2000000000001 64.9999999999999 303.4000000000001 64.3 303.4000000000001 63.3C303.4000000000001 53.6 308.7000000000001 41.9999999999999 334.0000000000001 41.9999999999999C352.5000000000001 41.9999999999999 363.0000000000001 49.1999999999999 363.0000000000001 61.8zM417.5 111.9C417.5 105.8 412.5 100.8 406.4 100.8S395.3 105.8 395.3 111.9C395.3 118.2000000000001 400.5 123.0000000000001 406.4 123.0000000000001C412.4 123.1000000000001 417.5 118.2000000000001 417.5 111.9zM415.7 111.9C415.7 117.1 411.5 121.2000000000001 406.3 121.2000000000001C401.2 121.2000000000001 397 117.1 397 111.9C397 106.7000000000001 401.2 102.5000000000001 406.3 102.5000000000001C411.5 102.6000000000001 415.7 106.8000000000001 415.7 111.9zM411.2 105.7000000000001H408.6C408.5 106.3000000000001 408.1 109.5000000000001 408.1 109.6C407.9 110.3 407.7 110.7000000000001 406.8 110.7000000000001H404.6V105.7000000000001H402.2V118.2000000000001H406.5C408 118.2000000000001 410.9 118.2000000000001 410.9 114.9C410.9 112.6 409.4 112.1 408.5 111.8C410.2 111.7 410.3 110.6 410.6 109C410.7000000000001 108 410.9000000000001 106.3 411.2000000000001 105.7zM408.4 114.5000000000001C408.4 116.2000000000001 407.2 116.2000000000001 406.6 116.2000000000001H404.6V112.7000000000001H406.5C408.1 112.7000000000001 408.3999999999999 113.8000000000001 408.3999999999999 114.5000000000001zM137.3 257C137.3 259.7 135.9 262.1 133.6 263.4L72.3 298.7C71.3 299.3 70.1 299.6 68.9 299.7H68.3C67.1 299.7 66 299.3 64.9 298.7L3.7 263.4C1.4 262.1 0 259.6 0 257L0.1 162C0.1 160.7 0.8 159.5 1.9 158.8C3 158.1 4.4 158.1 5.6 158.8L42 179.7C44.3 181.1 45.7 183.5 45.7 186.1V230.5C45.7 233.1 47.1 235.6 49.4 236.9L64.9 245.8C66.1 246.5 67.3 246.8 68.6 246.8C69.9 246.8 71.2 246.5 72.3 245.8L87.8 236.9C90.1 235.6 91.5 233.1 91.5 230.5V186.1C91.5 183.5 92.9 181 95.2 179.7L131.6 158.8C132.7 158.1 134.2 158.1 135.3 158.8C136.4 159.4 137.1 160.7 137.1 162L137.3 257zM472.5 360.7V184.3C472.5 181.7 471.1 179.2 468.8 177.9L407.5 142.5000000000001C405.2 141.2000000000001 402.4 141.2000000000001 400.1 142.5000000000001L338.8 177.9C336.5 179.2000000000001 335.1 181.7000000000001 335.1 184.3V255.1C335.1 257.7000000000001 336.5 260.2000000000001 338.8 261.5L400.1 296.9000000000001C402.4000000000001 298.2000000000001 405.2000000000001 298.2000000000001 407.5 296.9000000000001L422.8 288.1C424.5 287.1 426.7 288.4000000000001 426.7 290.3V384.3C426.7 387.1 429.7 388.9000000000001 432.2 387.5L468.7 367.1C471 365.9000000000001 472.5 363.4000000000001 472.5 360.7000000000001zM426.5 231.8C426.5 232.5 426.1 233.1 425.6 233.4L404.6 245.6C404 245.9 403.3 245.9 402.7000000000001 245.6L381.7000000000001 233.4C381.1 233.1 380.8000000000001 232.5 380.8000000000001 231.8V207.5C380.8000000000001 206.8 381.2000000000001 206.2 381.7000000000001 205.9L402.7000000000001 193.8C403.3000000000001 193.5 404.0000000000001 193.5 404.5000000000001 193.8L425.5000000000001 205.9C426.1000000000001 206.2 426.4000000000001 206.8 426.4000000000001 207.5V231.8zM636.3 232.5C638.5999999999999 233.8 640 236.3 640 238.9V256C640 258.6 638.6 261.1 636.3 262.4L575.4 297.8C573.1 299.1 570.3 299.1 568 297.8L506.7 262.4C504.4 261.1 503 258.6 503 256V185.2C503 182.5 504.4 180.1 506.7 178.8L567.6 144.1C569.8000000000001 142.8 572.6 142.8 574.9 144.1L611.6999999999999 164.6C614.1999999999999 166 614.1999999999999 169.6 611.6999999999999 171L550 206.4C548.8 207.1 548.1 208.3 548.1 209.6V231.8C548.1 233.1 548.8000000000001 234.3 550 235L569.2 246.1C570.3000000000001 246.8 571.8000000000001 246.8 572.9000000000001 246.1L592.1000000000001 235C593.2000000000002 234.3 594.0000000000001 233.1 594.0000000000001 231.8V214.4C594.0000000000001 211.6 597.1000000000001 209.8 599.6000000000001 211.2L636.3000000000002 232.5zM559 229C558.6 228.7 558.3 228.3 558.3 227.8V214.2C558.3 213.7 558.5999999999999 213.2 559 213L570.8 206.2C571.1999999999999 205.9 571.8 205.9 572.1999999999999 206.2L584 213C584.4 213.3 584.7 213.7 584.7 214.2V227.8C584.7 228.3 584.4000000000001 228.8 584 229L572.2 235.8C571.8000000000001 236.1 571.2 236.1 570.8000000000001 235.8L559 229zM304.8 185.5V255.9C304.8 258.5 303.2 261 300.9000000000001 262.3L239.8000000000001 297.5C237.7000000000001 298.7 234.8000000000001 298.9 232.4000000000001 297.5L171.3000000000001 262.3C169 261 167.4 258.6 167.4 255.9V185.5C167.4 182.7 169.3000000000001 180.3 171.4 179.1L232.6 143.9C235.0000000000001 142.5000000000001 237.8 142.6 240.0000000000001 143.9L301 179.1C302.8 180.1 304.1 181.8 304.6 183.8C304.7000000000001 184.3 304.8 184.9 304.8 185.5zM230.5 310.4L229.7 309.9H230.8L230.5 310.4zM306.7 180.2000000000001L306.3 180.9V180.0000000000001L306.7 180.2000000000001z" /> + <glyph glyph-name="npm" + unicode="" + horiz-adv-x="576" d=" M288 160H256V224H288V160zM576 288V96H288V64H160V96H0V288H576zM160 256H32V128H96V224H128V128H160V256zM320 256H192V96H256V128H320V256zM544 256H352V128H416V224H448V128H480V224H512V128H544V256z" /> + <glyph glyph-name="ns8" + unicode="" + horiz-adv-x="640" d=" M187.1 288.1L152.9 174.4L98.4 288.1H49L0 128H44.9L76 234.5L126.6 128H183.5L232 288.1H187.1zM639.6 289C636.7 307 615.7 317.1 597.5 320.3C552.9 328.1 495.6 304 509 261.5V261.4C465.2 252.7 434.7 234.6 414.8 213.2C411.8 223 401.2 229.8 380.8 229.8H293.2000000000001C283.9000000000001 229.8 280.3000000000001 232.1 281.7000000000001 237.2C283.3000000000001 242.7 283.6 244 285.4000000000001 249.4C287.5000000000001 255.8 293.2000000000001 256.5 298.7000000000001 256.5H432.2000000000001L441.9000000000001 288C302.2000000000001 288 297.4000000000001 288.5 281.8000000000001 286.8C269.5000000000001 285.5 258.3000000000001 282 251.2000000000001 271.8C244.4000000000001 261.9 236.8000000000001 236.2 233.6000000000001 224.7C228.2000000000001 205.3 233.0000000000001 196.1 266.4000000000001 196.1H353.7000000000001C361.5000000000001 196.1 362.5000000000001 193.4 361.4000000000001 189.5C360.3000000000001 185.1 358.6000000000001 179.5 356.9000000000001 174.9C355.3000000000001 170.7 352.2000000000001 167.5 343.1000000000001 167.5H216.3L204.7 128C344.6 128 350 128.6 365.6 130.3C372.2000000000001 131 378.6 132.4 384.1 135.2C384.3 131.5 384.6 127.9 385.3 124.4C390.7 93.9 412.7 72.1 442.1 64.9C490.7 53 550.8000000000001 81.7 577.2 132.9C595.9000000000001 169.1 591.3000000000001 209.1 573.8000000000001 238.4H573.9000000000001C603.5000000000001 244.3 644.2 260.4 639.6000000000001 289zM530.7 184.3C524.8000000000001 154.8 494.1 136.5 469.1 140.4C438.2000000000001 145.2000000000001 430.6 179.9 455 205.2000000000001C471.2 222.0000000000001 500.2 229.2000000000001 523.5 232.1000000000001C530.2 218.0000000000001 533.8 200.1000000000001 530.7 184.3000000000001zM552.5 267.4C548.3 273.4 542.7 285.9 550 293.7000000000001C556.7 300.9 570.9 303.8 581.8 301.4C597.0999999999999 298 601.5 285.5 586.6999999999999 277C575.9999999999999 270.9 563.0999999999999 268.9 552.4999999999999 267.4z" /> + <glyph glyph-name="nutritionix" + unicode="" + horiz-adv-x="400" d=" M88 439.9S221.4 448.1 209 335.5C209 335.5 228.1 410.4 312 376.1C312 376.1 294.3 302.1 224 320.1C224 320.1 238.6 374.7 290.1 376.7C290.1 376.7 250.2 387 208 327.9C208 327.9 188.2 422.4 114.4 427.6C114.4 427.6 189.6 408.2 192 320.1C192 320 85.6 313.1 88 439.9zM400 124.3C400 75.8 390.3 28.9999999999999 368 -8.0000000000001C325.8 -38.9 263 -56.0000000000001 200 -56.0000000000001C137.1 -56.0000000000001 74.2 -38.9 32 -8.0000000000001C9.7 29 0 75.8 0 124.3C0 172.7 17.7 219 40 256C82.2 286.9 137.1 304.6 200 304.6C263 304.6 317.8 287 360 256C382.3 219 400 172.7 400 124.3zM120 20C120 35.5 107.5 48 92 48S64 35.5 64 20S76.5 -8 92 -8S120 4.5 120 20zM120 86.2C120 101.7 107.5 114.2 92 114.2S64 101.7 64 86.2S76.5 58.2 92 58.2S120 70.7 120 86.2zM120 152.4C120 167.9 107.5 180.4 92 180.4S64 167.9 64 152.4S76.5 124.4 92 124.4S120 136.9 120 152.4zM192 20C192 35.5 179.5 48 164 48S136 35.5 136 20S148.5 -8 164 -8S192 4.5 192 20zM192 86.2C192 101.7 179.5 114.2 164 114.2S136 101.7 136 86.2S148.5 58.2 164 58.2S192 70.7 192 86.2zM192 152.4C192 167.9 179.5 180.4 164 180.4S136 167.9 136 152.4S148.5 124.4 164 124.4S192 136.9 192 152.4zM264 20C264 35.5 251.5 48 236 48S208 35.5 208 20S220.5 -8 236 -8S264 4.5 264 20zM264 86.2C264 101.7 251.5 114.2 236 114.2S208 101.7 208 86.2S220.5 58.2 236 58.2S264 70.7 264 86.2zM264 152.4C264 167.9 251.5 180.4 236 180.4S208 167.9 208 152.4S220.5 124.4 236 124.4S264 136.9 264 152.4zM336 20C336 35.5 323.5 48 308 48S280 35.5 280 20S292.5 -8 308 -8S336 4.5 336 20zM336 86.2C336 101.7 323.5 114.2 308 114.2S280 101.7 280 86.2S292.5 58.2 308 58.2S336 70.7 336 86.2zM336 152.4C336 167.9 323.5 180.4 308 180.4S280 167.9 280 152.4S292.5 124.4 308 124.4S336 136.9 336 152.4zM360 192C355.2 214.3 352.6 228.9 344 248C305.2 267.9 253.5 280 200 280S94.8 267.9 56 248C47.2 228.5 44.8 214.1 40 192C82.2 199.9 138.7 206.8 200 206.8S317.8 199.9 360 192z" /> + <glyph glyph-name="odnoklassniki-square" + unicode="" + horiz-adv-x="448" d=" M184.2 270.9C184.2 293 202.1 310.9 224 310.9S263.8 293 263.8 270.9C263.8 248.9 245.9 231.1 224 231.1S184.2 249.0000000000001 184.2 270.9000000000001zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM142.9 270.9C142.9 226.3 179.3 190 224 190S305.1 226.2 305.1 270.9C305.1 315.7 268.7 352 224 352S142.9 315.8 142.9 270.9zM317.4 180.2C312.8 189.3 300.1 197 283.3 183.8C283.3 183.8 260.6 165.8 224 165.8S164.6999999999999 183.8 164.6999999999999 183.8C147.8999999999999 197 135.1999999999999 189.3 130.5999999999999 180.2C122.6999999999999 164.1 131.6999999999999 156.5 152 143.2C169.3 132.1 193.1999999999999 128 208.5999999999999 126.4L195.6999999999999 113.5C177.5 95.5 160.1999999999999 78 148 65.8C130.4 48.2 158.6999999999999 20 176.4 37.2L224.1 85.1C242.3 66.9 259.8 49.4 271.8 37.2C289.4 20 317.8 47.9 300.4 65.8L252.7 113.5L239.7 126.4C255.2 128 278.8 132.3 295.9 143.2C316.3 156.5 325.2 164.2 317.4 180.2z" /> + <glyph glyph-name="odnoklassniki" + unicode="" + horiz-adv-x="320" d=" M275.1 114C247.7 96.6 210 89.7 185.1 87.1L206 66.5L282.3 -9.8C310.2 -38.4 264.8 -83.1 236.6 -55.5C217.5 -36.1 189.5 -8.1 160.3 21.1L84 -55.4C55.8 -82.9 10.4 -37.8 38.6 -9.7C58 9.7 85.7 37.7 114.9 66.6L135.5 87.2000000000001C110.9 89.8000000000001 72.6 96.3000000000001 44.9 114.1C12.3 135.1 -2 147.4 10.6 173.1C18 187.7000000000001 38.3 200 65.2 178.8C65.2 178.8 101.5 149.9 160.1 149.9S255.0000000000001 178.8 255.0000000000001 178.8C281.9000000000001 199.9 302.1 187.7 309.6 173.1C322 147.4 307.7000000000001 135.1 275.1 114zM30.3 318.3C30.3 390 88.6 448 160 448S289.7 390 289.7 318.3C289.7 246.9 231.4 188.9 160 188.9S30.3 246.9 30.3 318.3zM96.3 318.3C96.3 283.2000000000001 124.9 254.6 160 254.6S223.7 283.2000000000001 223.7 318.3C223.7 353.7000000000001 195.1 382.3 160 382.3S96.3 353.7000000000001 96.3 318.3z" /> + <glyph glyph-name="opencart" + unicode="" + horiz-adv-x="640" d=" M423.3 7.3C423.3 -18 403 -38.3 377.7 -38.3S331.9 -18 331.9 7.3S352.5 53.1 377.7 53.1C403.1 53.1 423.3 32.6 423.3 7.3zM169.4 53.1C144.1 53.1 123.8 32.5 123.8 7.3S144.1 -38.3 169.4 -38.3S215.2 -18 215.2 7.3S194.7 53.1 169.4 53.1zM461.1 323.1C158.9 323.1 81.9 335.9 0 422.3C34.4 370.6 53.3 273.4 373.1 278.1C706.4000000000001 283.1 503.1 192 443.9000000000001 89.2000000000001C630.6 255.9000000000001 763.3 323.1 461.1 323.1z" /> + <glyph glyph-name="openid" + unicode="" + horiz-adv-x="448" d=" M271.5 16L203.5 -16C88.5 -5.7 0 55.5 0 129.8C0 201.3 82.5 260.8 191.7 274.1V231.1C120.2 218.6 67.7 178.1 67.7 129.8C67.7 78.8 126.2 36.5 203.4 26.8V366.8L271.4 400V16zM448 157L316.7 185.5L353.5 206.2C334 217.7 310 226.2 283.5 231V274C329.7 268.5 371.2 254.5 403.8 234.7L438.8 254.5L448 157z" /> + <glyph glyph-name="opera" + unicode="" + horiz-adv-x="496" d=" M313.9 415.3C143.7 415.3 61.3 191.5 166.4 60.2C202.9 14.8 255 -15.4 313.9 -15.4C350.2 -15.4 384.2 -4.3 413.3 15C369.5 -24.2 311.4 -48 248 -48C244.1 -48 240 -48 236.1 -47.7C104.6 -41.6 0 66.9 0 200C0 337 111 448 248 448H248.8C311.9000000000001 447.7 369.5 423.9 413.2000000000001 384.9C384.2000000000001 404.3 350.1 415.3 313.9000000000001 415.3zM415.7 17.6C374.8 -7.1 325 -6 283.7 23.4C339.9 43.9 381.4 115 381.4 200C381.4 284.7000000000001 340.2 355.8000000000001 284 376.6C325.8 405.8 375.2 406.9000000000001 416.9 381.6C522.8 282.9000000000001 522.4 115.9 415.7 17.6z" /> + <glyph glyph-name="optin-monster" + unicode="" + horiz-adv-x="576" d=" M550.671 -2.303C550.671 -13.923 534.998 -21.76 518.513 -17.166C506.353 -13.923 487.167 0.399 482.302 10.128C476.628 21.748 486.356 42.826 501.218 40.934C516.892 39.313 550.671 15.533 550.671 -2.3030000000001zM372.86 372.777C369.077 444.928 272.064 452.495 246.932 396.2870000000001C291.5200000000001 420.608 337.189 411.9600000000001 372.86 372.777zM74.795 40.934C59.122 39.313 25.343 15.533 25.343 -2.303C25.343 -13.923 41.016 -21.76 57.5 -17.166C69.66 -13.923 88.576 0.399 93.44 10.128C99.386 21.748 89.658 42.826 74.795 40.934zM572.56 26.612C573.641 23.099 574.452 19.586 574.452 15.803C575.262 -15.813 530.135 -48.242 500.949 -49.322C483.654 -50.132 466.359 -40.945 458.253 -25.812C344.7560000000001 -29.865 231.2590000000001 -30.676 118.033 -25.812C109.656 -40.945 92.361 -49.862 75.066 -49.322C46.151 -48.241 1.023 -15.813 1.563 15.803C1.833 19.586 2.374 23.099 3.455 26.612C-2.111 36.075 -1.39 41.894 8.86 38.232C12.103 43.366 15.886 47.6900000000001 19.94 52.014C17.37 62.931 21.21 66.108 31.019 61.202C35.613 64.445 41.017 67.687 46.963 70.39C46.963 86.147 58.802 81.521 64.258 76.065C76.725 77.845 84.387 75.356 91.011 70.39V90.116C78.024 90.116 50.37 101.491 45.071 126.328C40.097 147.053 47.678 164.403 70.203 173.888C71.013 179.833 78.31 187.94 85.065 189.832C92.632 191.724 97.496 185.238 99.117 179.563C106.542 179.563 116.874 178.098 120.195 171.456C125.6 171.997 131.274 172.808 136.679 173.348C134.2470000000001 175.24 131.545 176.861 128.572 177.942C123.438 186.859 114.79 189.021 103.981 189.562C103.981 190.372 103.981 191.183 104.251 192.264C84.524 192.805 60.203 197.939 49.394 210.099C28.073 233.737 33.459 293.6760000000001 61.554 313.5970000000001C69.931 319.2720000000001 83.172 314.408 84.253 303.8690000000001C86.678 283.271 84.652 277.0360000000001 110.465 277.927C118.572 285.7630000000001 127.22 292.519 136.948 297.9240000000001C122.086 299.2760000000001 108.034 296.303 93.17 294.1410000000001C105.922 306.6210000000001 117.123 319.5830000000001 149.918 336.5680000000001C173.429 348.4580000000001 199.911 357.3760000000001 226.123 359.807C207.477 367.6440000000001 186.13 371.6980000000001 166.402 376.2910000000001C242.877 392.5050000000001 340.971 398.4500000000001 410.691 338.7290000000001C428.796 323.326 443.118 302.5180000000001 453.3869999999999 278.7370000000001C493.1859999999999 273.884 489.857 284.3180000000001 492.03 303.8690000000001C493.111 314.1380000000001 506.352 319.2720000000001 514.7289999999999 313.3270000000001C529.5909999999999 302.7880000000001 536.8879999999999 282.5210000000001 539.319 265.2260000000001C541.481 247.3910000000001 539.5889999999999 223.8810000000001 526.889 210.0990000000001C516.08 197.9390000000001 492.569 192.5340000000001 473.113 191.994V189.2910000000001C462.033 189.0210000000001 452.845 186.859 447.44 177.6710000000001C444.468 176.59 441.766 174.9680000000001 439.063 173.0770000000001C444.738 172.537 450.413 171.7260000000001 455.818 171.186C457.687 176.8050000000001 468.353 179.5630000000001 476.895 179.5630000000001C478.516 184.968 483.651 191.453 490.947 189.8320000000001S504.999 179.8340000000001 505.81 173.888C516.619 169.564 527.969 161.728 530.941 148.216C532.8330000000001 140.109 532.562 133.083 531.211 126.328C525.485 101.066 497.85 90.116 485.272 90.116C485.272 83.36 485.272 76.8750000000001 485.002 70.39C493.012 76.3960000000001 501.369 77.5480000000001 511.754 76.0650000000001C517.673 81.984 529.3190000000001 85.4750000000001 529.3190000000001 70.39C534.994 67.6870000000001 540.6680000000001 64.4450000000001 545.263 61.2020000000001C555.363 66.253 558.932 61.741 556.072 52.0140000000001C560.125 47.6910000000001 564.179 43.0970000000001 567.151 38.2320000000001C577.2869999999999 41.8520000000001 578.1719999999999 36.1540000000001 572.56 26.6120000000001zM498.7869999999999 280.6280000000001C516.0819999999999 273.872 524.9989999999999 258.4690000000001 529.0519999999999 244.9580000000001C530.1329999999999 255.497 526.3499999999999 284.4110000000001 515.2699999999999 296.0310000000001C507.9739999999999 303.327 501.2179999999998 301.165 501.2179999999998 295.221C501.2189999999998 289.005 499.8679999999998 283.601 498.7869999999999 280.6280000000001zM480.1409999999999 268.198C493.1119999999999 252.525 497.1649999999999 226.583 492.8409999999999 205.235C503.6499999999999 207.397 513.3779999999999 211.45 519.0529999999999 217.395C520.9449999999999 219.557 522.8359999999999 222.259 523.9169999999999 224.961C522.8359999999999 246.3090000000001 513.6479999999999 267.658 494.1919999999999 273.8730000000001C490.9499999999999 270.63 485.0049999999999 269.009 480.1409999999999 268.198zM458.2519999999999 267.387C465.8189999999999 246.85 470.6829999999999 224.691 472.5739999999999 202.802C476.0869999999999 202.802 480.1409999999999 203.072 484.1939999999999 203.613C490.1389999999999 227.9340000000001 483.9239999999999 255.2270000000001 470.1419999999999 267.117C466.3589999999999 267.117 462.0349999999999 267.117 458.2519999999999 267.3870000000001zM77.768 280.628C76.687 283.601 75.336 289.005 75.336 295.221C75.336 301.166 68.31 303.328 61.284 296.031C49.934 284.411 46.421 255.497 47.502 244.958C51.555 258.47 60.473 273.873 77.768 280.628zM83.443 205.234C79.119 226.582 83.173 252.525 96.144 268.197C91.279 269.008 85.335 270.629 82.092 273.872C62.635 267.657 53.717 246.309 52.366 224.96C53.717 222.258 55.338 219.556 57.23 217.394C62.905 211.179 72.633 207.396 83.443 205.234zM124.788 266.307C119.654 265.226 114.79 263.334 109.926 261.442L97.766 256.308V256.578C90.47 242.526 87.767 222.259 92.361 203.613C96.955 203.072 101.008 202.802 105.061 202.802C107.493 224.961 114.249 246.58 124.788 266.307zM212.883 289.546C212.883 247.391 247.202 213.341 289.088 213.341S365.293 247.391 365.293 289.546C365.293 331.432 330.974 365.481 289.088 365.481S212.883 331.432 212.883 289.546zM365.293 192.263C375.262 141.655 368.592 127.571 381.777 134.164C397.721 142.271 404.476 173.347 404.747 191.183C391.776 191.993 378.534 191.993 365.293 192.263zM293.682 192.804V193.074C293.4120000000001 187.94 293.952 154.971 298.0060000000001 151.999C309.0850000000001 146.594 337.4590000000001 147.405 349.079 150.918C354.484 152.5389999999999 351.511 187.94 350.7 192.804C331.784 193.074 312.598 193.074 293.682 192.804zM279.629 192.804V193.074C260.173 192.804 240.987 192.804 221.8 192.263C219.908 183.076 217.206 143.352 223.692 140.649C236.663 134.974 265.308 135.515 278.278 139.028C282.8730000000001 141.46 280.711 184.427 279.629 192.804zM193.967 135.244C199.372 132.812 202.614 132.812 203.695 139.568C205.587 148.215 206.127 176.32 208.56 191.723C196.4 191.453 183.969 190.912 171.808 190.102C166.403 170.375 172.078 144.973 193.967 135.244zM128.301 146.324C172.079 99.304 220.99 60.661 284.2240000000001 39.8539999999999C351.7820000000001 59.0399999999999 399.8830000000001 99.8449999999999 447.4430000000001 146.8649999999999C436.348 151.1799999999999 439.7280000000001 157.2279999999999 440.1470000000001 158.4849999999999C431.2290000000001 159.2949999999999 422.3120000000001 160.3769999999999 413.6640000000001 161.1869999999999C404.206 128.2189999999999 377.7240000000001 108.2219999999999 366.9140000000001 129.5709999999999C364.2120000000001 134.7049999999999 363.4010000000001 141.1909999999999 362.3200000000001 146.3249999999999C358.5370000000001 137.9479999999999 349.0780000000001 138.218 337.7290000000001 137.4069999999999C324.4880000000001 136.3259999999999 306.112 136.0559999999999 293.6810000000001 140.3789999999999C290.7090000000001 127.4079999999999 282.6020000000001 127.4079999999999 266.9290000000001 126.0569999999999C252.8770000000001 124.7049999999999 218.287 122.0029999999999 212.072 136.8659999999999C210.9910000000001 108.2219999999999 176.942 126.868 166.9430000000001 143.892C163.7000000000001 149.567 161.5380000000001 155.242 159.917 161.4569999999999C152.0800000000001 160.6469999999999 144.244 159.836 136.406 158.755C138.8490000000001 155.0919999999999 137.9550000000001 149.7029999999999 128.3010000000001 146.324zM115.6 -5.545C109.926 17.694 96.954 44.177 82.092 48.501C59.663 55.257 13.183 24.991 15.885 -6.085C28.586 -25.542 55.879 -41.755 75.066 -42.566C92.901 -43.376 111.006 -31.486 114.79 -13.652C115.329 -11.22 115.6 -8.518 115.6 -5.5450000000001zM122.896 0.399C156.405 19.856 192.075 36.07 228.827 47.419C190.184 67.956 160.729 95.25 131.544 124.435C129.382 123.083 126.41 122.003 123.708 120.922C122.071 116.012 132.426 115.5920000000001 129.113 108.491C126.951 104.4370000000001 120.465 100.924 113.98 99.3030000000001C111.819 96.6010000000001 108.846 94.4390000000001 106.144 92.818H105.874C105.604 79.307 105.604 65.794 106.144 52.283C115.083 36.319 121.57 18.969 122.896 0.399zM443.6600000000001 -12.301C406.908 9.047 369.6160000000001 29.044 328.0010000000001 40.664C314.2190000000001 34.449 300.168 29.315 285.846 25.261C283.6840000000001 24.45 283.6840000000001 24.45 281.522 25.261C269.632 29.044 258.283 33.3679999999999 246.663 38.502C206.398 26.8819999999999 169.377 9.317 134.247 -12.301H133.977V-12.571C134.247 -12.571 134.247 -12.571 134.247 -12.301C237.474 -16.355 340.702 -15.814 443.66 -12.301zM470.683 51.744L470.4130000000001 51.474C470.9540000000001 65.256 471.224 79.037 471.224 92.8190000000001C468.251 94.4400000000001 465.549 96.8730000000001 463.1170000000001 99.5750000000001C456.6320000000001 100.9260000000001 450.1460000000001 104.7090000000001 447.9840000000001 108.4930000000001C446.0920000000001 112.5460000000001 449.3350000000001 116.059 453.9290000000001 118.7620000000001C453.6590000000001 119.3030000000001 453.3880000000001 120.3830000000001 453.3880000000001 121.1940000000001C450.4160000000001 122.0050000000001 447.9830000000001 123.0860000000001 445.8210000000001 124.4370000000001C414.2050000000001 94.9820000000001 380.4250000000001 67.6880000000001 342.3230000000001 47.6910000000001C381.2370000000001 36.0710000000001 418.2580000000001 19.5870000000001 454.1980000000001 0.1300000000001C455.2480000000001 14.8220000000001 461.4290000000001 35.8790000000001 470.6830000000001 51.7440000000001zM493.9230000000001 48.5C479.33 44.177 466.0890000000001 17.694 460.414 -5.546C460.414 -29.372 481.6920000000001 -43.443 500.948 -42.568C520.134 -41.757 547.428 -25.544 560.129 -6.087C563.102 24.99 516.6220000000001 55.257 493.923 48.5zM290.709 313.867C290.754 313.867 290.798 313.8640000000001 290.843 313.8640000000001C290.889 313.8640000000001 290.933 313.867 290.9790000000001 313.867H290.7090000000001zM290.709 217.124C319.354 217.124 342.593 238.742 342.593 265.495C342.593 301.587 302.086 323.574 270.442 309.813C279.9000000000001 306.841 286.926 298.193 286.926 288.195C286.926 264.938 253.635 256.24 240.446 276.8450000000001C233.149 242.778 259.814 217.124 290.709 217.124zM68.039 -26.083C68.579 -32.569 80.199 -38.784 89.657 -35.5410000000001C96.413 -32.8380000000001 104.25 -25.0020000000001 106.952 -19.3270000000001C109.925 -12.301 105.871 0.67 97.224 -0.9520000000001C88.307 -2.573 67.499 -17.7060000000001 68.039 -26.0830000000001zM478.789 -0.952C470.412 0.669 466.358 -12.301 469.331 -19.327C471.763 -25.002 479.6 -32.838 486.626 -35.541C495.813 -38.784 507.704 -32.569 507.974 -26.083C508.785 -17.706 487.707 -2.573 478.789 -0.952z" /> + <glyph glyph-name="osi" + unicode="" + horiz-adv-x="495.8" d=" M0 188.8C2.3 324.6 97.4 421.2 213.8 436.9C352.6 455.5 469.4 361.1 491.8 235.8C513.1 117 447.8 5.8 340.2000000000001 -38.2C330.9000000000001 -42 325.8000000000001 -39.9 322.2000000000001 -30.5C304.4000000000001 15.8 286.6 62.2 268.8000000000001 108.5C265.7000000000001 116.6 267.8000000000001 121.7 275.8000000000001 125.3C300.0000000000001 136.3 315.1000000000001 154.7 319.1000000000001 181.1C325.5000000000001 223.5 294.6000000000001 259.8 254.6000000000001 263.3C215.6000000000001 266.7000000000001 182.8000000000001 239.6 177.1000000000001 203.6C171.9000000000001 170.6 188.2000000000001 139.9 219.0000000000001 125.9C228.6000000000001 121.5000000000001 230.5000000000001 117.3 226.8000000000001 107.5000000000001C208.9000000000001 60.9 191.0000000000001 14.3000000000001 173.1000000000001 -32.4C170.5000000000001 -39.3 164.8000000000001 -41.7 157.6000000000001 -38.9C105.0000000000001 -18.6 56.2000000000001 22.1 26.8000000000001 80.1C1.9 129.3 1.6 167.8 0 188.8zM20.9 190.7C21.3 184.1 21.5 176.4 22.2 168.6C28.5 96.6999999999999 71.8 25.1 153.2 -14.5C156.4 -16 157.6 -15.3 158.8 -12.2C173.7 26.9 188.7 66 203.8 105.1C205.1 108.4 204.4 109.9 201.4 111.8C169.8 131.7 154.1 160.3 155.8 197.8C156.8 219.4 165.1 238.3 179.6 254.1C209.6 286.8 256.6 293.9000000000001 295.1 271.7000000000001C327 253.3 344.6 217.9 340.3 181.3C336.7 150.7 321 127.4 294.6 111.5C291.9000000000001 109.9 291.1 108.6 292.3 105.5C307.5 66.3 322.5 27.1 337.5 -12.2C338.7 -15.3 339.9 -16 343.1 -14.5C378.6 2.1 408.3 25.8 431.2000000000001 57.5C466.0000000000001 105.7 480.3000000000001 159.4 473.5000000000001 218.5C459.8 336 354.1 433.3 218 416.5C111.9 403.5 22.7 314 20.9 190.7z" /> + <glyph glyph-name="page4" + unicode="" + horiz-adv-x="496" d=" M248 -56C111 -56 0 55 0 192S111 440 248 440C268.9 440 289.3 437.4 308.7 432.5L42.3 56H248V-56zM248 87.6V301.2L98.6 87.6H248zM344 56V-36.7C389.7 -17.5 428.5 15 455.4 56H344zM401.4 194.2L380.2 185.8L401.4 177.5V194.2zM381.1 139.7C374.4 139.7 373.1 133.4 373.1 126.8V119.1H389.3V129.1C389.3 135 387 139.7000000000001 381.1 139.7000000000001zM496 192C496 154.7 487.8 119.3 473 87.6H344V420.7C433.3 383.2 496 294.9 496 192zM360.4 304.4H428.6V352H414.7V319.4H400.8V349H386.9000000000001V319.4H374.2000000000001V352H360.3000000000001V304.4zM428.5 119.1H402V130.1C402 145.5 396.4 155.3 381.1 155.3C365.7000000000001 155.3 360.4000000000001 144.7 360.4000000000001 129.4V104.1H428.6V119.1zM428.5 222.1L360.3 192.4V180L428.5 150.5V167.1L414.1 172.8V199.3L428.5 205.2V222.1zM423.7 290.6H388.1V264H402V276.2H413C421.6 260.4 414.3 240.9 394.4 240.9C371.9 240.9 366.1 266.2 378.9 278.6L367.3 289.2C351.1 271.7 355.1 225.3 394.4 225.3C428.4 225.3 439.1 261.2 423.7 290.6z" /> + <glyph glyph-name="pagelines" + unicode="" + horiz-adv-x="384" d=" M384 135.3C328.9 -1.4 196.9 81.3 196.9 81.3C156.4 -0.5 89.5 -53.1 12.3 -53.4C-3.8 -53.4 -4.3 -29 12.3 -29C76.7 -28.7 132.8 13.7 169.5 81.1C128.4 65.2000000000001 50.9 53.2 7.9 163.3C116.9 208.2 167 152.1 186.2 117.8C196.1 142.2 203.2 168.7 207.8 197.5C207.8 197.5 68.1 175.6 58.3 295.6C177.4 343.5 210.9 218.9 210.9 218.9C212.5 235.6 214.2 271.5 214.2 272.3C214.2 272.3 107.9 346 176.1 437.5C300.7000000000001 394.5 237.5000000000001 275.1 237.5000000000001 275.1C238.0000000000001 273.5 238.0000000000001 251.3 237.5000000000001 241.7C237.5000000000001 241.7 282.7000000000001 330.7 373.9000000000001 299.2C369.7000000000001 165.1999999999999 232.0000000000001 192.8 232.0000000000001 192.8C227.6 165.4 220.8000000000001 139.4 212 115.3C212 115.3 295 207.1 384 135.3z" /> + <glyph glyph-name="palfed" + unicode="" + horiz-adv-x="576" d=" M384.9 254.1C384.9 301.5 329.7 298.3 289.5 283.9C288.2 244.5 287 203.2 286.5 164.1C287.2 161.3 289.1 157.9 301.6 157.9C338.4000000000001 157.9 385 200.7000000000001 384.9000000000001 254.1zM190.4 181.9C190.6 181.9 196.9 184.6 201.6 184.6C228.2 184.6 222.3 140.5 187.2 140.5C165.7 140.5 150.1 158.6 150.1 183.5C150.1 225.5 193 279.0999999999999 250.8 310C251.8 322.4 253.8 332 261.3 338.2C272.5 347.2 287.9 341.7 290.8 327.1C363 349.3 426 326.1 426 255.1C426 177.1999999999999 346.7 102.5 285.9 116.9C285.8 77.5 286.8 42.5 288.6 16.9V16.7C288.8 13.3 289.2 4.2 283.3 -2.4C273.7 -13.0000000000001 249.9 -12.4 246.9 19.9C242.8 64.3 247.1 226 248.3 262.4C226.8 247.4 189.8 212.1 189.8 186.5C190 184 190.2 182.5 190.4 181.9zM8 266.9S7.9 229.5 46.4 229.5H76.4L98.8 12.3S98.8 -32 143.5 -32H432.4S477.1 -31.6 477.1 12.3L499.4999999999999 229.5H529.5S567.9 228.3 567.9 266.9C567.9 266.9 568 304.3 529.5 304.3H499.4C492.1 329.9 469.2 378.6 380 378.6H352V397.7S349.3 416.1 330.9 416.1H245.1S224 416.1 224 397.7V378.6H195.9S90.9 374.4 75.4 304.3H46.4S8 305.5 8 266.9z" /> + <glyph glyph-name="patreon" + unicode="" + horiz-adv-x="512" d=" M512 253.2C512 151.9 429.6 69.4 328.2 69.4C226.5 69.4 143.8 151.8 143.8 253.2C143.8 354.8 226.5 437.5 328.2 437.5C429.6 437.5 512 354.8 512 253.2zM0 -53.5H90V437.5H0V-53.5z" /> + <glyph glyph-name="paypal" + unicode="" + horiz-adv-x="384" d=" M111.4 152.1C107.9 132.9 94 43.4 89.9 18.1C89.6 16.3 88.9 15.6 86.9 15.6H12.3C4.7 15.6 -0.8 22.2 0.2 29.5L58.8 401.4C60.3 411 68.9 418.3 78.8 418.3C231.1 418.3 243.9 422 282.8 406.9C342.9000000000001 383.6 348.4 327.4 326.8 266.6C305.3 204 254.3 177.1 186.7 176.3C143.3 175.6 117.2 183.3 111.4 152.1zM357.1 296C355.3 297.3 354.6 297.8 354.1 294.7C352.1 283.3 349 272.2 345.3 261.1C305.4000000000001 147.3 194.8 157.2 140.8 157.2C134.7 157.2 130.7 153.9 129.9 147.8C107.3 7.4 102.8 -21.9 102.8 -21.9C101.8 -29 106.3 -34.8 113.4 -34.8H176.9C185.5 -34.8 192.6 -28.4999999999999 194.3 -19.9C195 -14.5 193.2 -26 208.7 71.4C213.3 93.4 223 91.1 238.0000000000001 91.1C309 91.1 364.4000000000001 119.9 380.9000000000001 203.4C387.4000000000001 238.2000000000001 385.5000000000001 274.8000000000001 357.1 296z" /> + <glyph glyph-name="periscope" + unicode="" + horiz-adv-x="448" d=" M370 384.4C331.4 425.4 280.5 448 226.6 448C111.9 448 18.5 351.8 18.5 233.6C18.5 158.5 76.3 73.8 101.2 40.9C137.8 -7.5 192.6 -64 226.6 -64C268.2 -64 339.5 30.2 347.5 41C372.1 74.1 429.5 159.3 429.5 233.6C429.5 290.1 408.4 343.7 370 384.4zM226.6 -45.9C184.1 -45.9 36.6 121.4 36.6 233.5C36.6 340.9 120.5 429.8 226.6 429.8C327.4 429.8 411.3 340.8 411.3 233.5C411.4 121.4 263.9 -45.9 226.6 -45.9zM338 241.2C338 182.1 286.9 131.5 227.2 131.5C126.6 131.5 76.5 239.7 134.3 313.3V312.9C134.3 288.4 154.4 268.5 179.1 268.5C203.8 268.5 223.9 288.4 223.9 312.9C223.9 331.1 212.8 346.7 197 353.6C273.6 372.8 338 314.3 338 241.2z" /> + <glyph glyph-name="phabricator" + unicode="" + horiz-adv-x="496" d=" M323 185.9L322.9 198.9S344.6 218.7 344 220.1L334.5 240.1C333.9 241.5 305 240.6 305 240.6L295.6 249.9S295.8 278.4 294.4000000000001 279L274.3 288.2C272.9000000000001 288.8 253.6 267.2 253.6 267.2L240.5000000000001 267.4S220 288.8 218.6 288.2L198.6 279.9C197.2 279.4 198.8 251 198.8 251L189.7 241.9S160.5 242.8 160 241.5L151.9 221.6999999999999C151.3000000000001 220.2999999999999 172.9 200.6999999999999 172.9 200.6999999999999L173 187.8S151.3000000000001 168 151.9 166.6L161.4 146.6C162 145.2 190.9 146.1 190.9 146.1L200.3000000000001 136.8S200.1000000000001 104.9999999999999 201.5 104.4999999999999L221.6 96.1999999999999C223 95.5999999999999 242.3 119.6999999999999 242.3 119.6999999999999L255.4 119.5S275.9 95.6999999999999 277.2 96.1999999999999L297.2 103.6999999999999C298.6 104.3 297 135.8 297 135.8L306.1 144.9S335.3 144 335.8 145.4L343.9000000000001 165.2C344.6 166.3 323.0000000000001 185.9 323.0000000000001 185.9zM278.1 194.6C278.8 177.5 265.3 163 248.0000000000001 162.2C230.7 161.4 215.9 174.7 215.2000000000001 191.8C214.5000000000001 208.9 228.0000000000001 223.4 245.3000000000001 224.1C262.6 224.9 277.4000000000001 211.6 278.1 194.6zM479.3 232.5L382.3 329.5L382.2 329.4C307.1 402.7 186.8 402.2 112.4 327.8C61.5 276.8 84.6 299.9 16.7 232.5C-5.6 210.2 -5.6 173.8 16.7 151.5C86.6 82.1 63.1 105.5 114.1 54.5L114.2 54.6C189.3 -18.7 309.6 -18.3 384 56.2C435 107.1 411.9 84.1 479.3 151.5000000000001C501.6 173.8000000000001 501.6 210.2000000000001 479.3 232.5000000000001zM140.4 84.2C80.8 143.7 80.8 240.2 140.4 299.7C199.9 359.3 296.4 359.2 356 299.7C415.5 240.2 415.6 143.7 356 84.1C296.4 24.6 200 24.7 140.4 84.2000000000001z" /> + <glyph glyph-name="phoenix-framework" + unicode="" + horiz-adv-x="640" d=" M212.9 103.7C216.7 103.8 235.7 105.1 238.5 105.9C236.1 108.5 194.9 106.9 170.5 155.5C166.2 164.1 163 173.1 164.1 183.1C167 208.6 197 213.1 216.1 201.6C252.1 180 279.4 110.3 329.8 104.1C366.8 99.6 414.4 121.1 438 149.5C437.4 149.6 437.2 149.7 437 149.6C436.6 149.5 436.2 149.4 435.9 149.3C402.6 137.2 341.6 139.6 301.2 164.1C263.6 186.9 248.1 222.8 249.4 238.7C251.2 260 272.3 261.9 285.3 258.3C299.7 254.4 309.7 240.7 324.2 230.9C339.8 220.5 357.0999999999999 217.2 375.5 220.6C390.3999999999999 223.3 409.8999999999999 232.9 412 235.1C410.8999999999999 235.2 410.2 235.2 409.5 235.3C403.3 235.9 397.1 236.1 391 237C279.8 253.5 262.1 400.6 138.5 410.1C94.2 413.5 39.1 402 2.2 375.1C1.4 374.5 0.7 373.9 0 373.3C0.1 373.1 0.1 373 0.2 372.8C1 372.8 1.8 372.9 2.6 373C8.9 374 15.1 373.8 21.3 372.7C45.1 368.4 69 349.6 77.2 296.2C82.5 261.9 76.5 245.4 85.2 210.1C104.2 133 176.2 102.5 212.9 103.7zM75.3 383.1C74.4 384.1 74.4 384.3 74 385.1C86.1 387.7 98.2 389.2 110.6 389.9C109.5 375.2 88.4 368.6 75.3 383.1zM272.2 32.6C229.4 31.4 180.2 59.3 148.7 94C144.1 99 131.9 114.2 130.1 117.4L130.5 117.8C137.1 113.6999999999999 156.2 99.1999999999999 185.3 90.8C209.5 83.8 233.4 84.4999999999999 256.9 94.1C279.6 103.4 297.9 94.6 300 91.2C281.5 87.4 279.9 86.8 276 83.3C270.9 78.9 271.4 71.6 283 66.1C309.2 53.7 346 68.9 380.2 40.7C382.6 38.7 388.3 32.9 390.3 30.0000000000001C390.2 29.8000000000001 390 29.7 389.9000000000001 29.5000000000001C385.1 31.0000000000001 373.5000000000001 37.0000000000001 349.7000000000001 38.8000000000001C325.0000000000001 40.8000000000001 303.4000000000001 33.5000000000001 272.2000000000001 32.6000000000001zM447 284.6C463.4 289.8 488.3 298 513.5 287.9000000000001C529.6 281.4000000000001 539.7 269.2000000000001 545.6 253.3000000000001C549.1 243.9000000000001 550.7 233.6000000000001 550.7 224.6000000000001C550.5 224.6000000000001 550.3000000000001 224.6000000000001 550.1 224.5000000000001C549.9 224.9000000000001 549.7 225.4000000000001 549.6 225.8000000000001C544.6 247.8000000000001 519.7 269.6000000000001 482 255.7000000000001C431.8 237.1000000000001 351.6 246.0000000000001 305.1 303.7000000000001C304.4000000000001 304.6000000000001 302.7000000000001 305.4000000000001 303.8 306.9000000000001C303.9000000000001 307.1 305.9000000000001 306.3000000000001 306.8 305.6C324.9000000000001 292.2000000000001 345.1 283.7000000000001 367.1 279.4000000000001C397.6 273.3000000000001 421.7000000000001 276.5000000000001 447 284.6zM549.7 167.1C517.3000000000001 166.9 515.9000000000001 117 446.1 102.7000000000001C427.9000000000001 99.0000000000001 407.4000000000001 98.1 401.2000000000001 98.5000000000001V98.9C404.0000000000001 100.4 415.9000000000001 101.5000000000001 430.9000000000001 115.5000000000001C438.8 122.8000000000001 446.2000000000001 130.6000000000001 453.7 138.4C473.2 158.6 495.1 180.6 535.6 177.4C558.7 175.6 564.9 169.2000000000001 571.7 164.7000000000001C572 164.5000000000001 572.1 164.2000000000001 572.4000000000001 163.8000000000001C571.9000000000001 163.8000000000001 571.7 163.7000000000001 571.5000000000001 163.8000000000001C564.5000000000001 166.5000000000001 557.2000000000002 167.1000000000001 549.7000000000002 167.1000000000001zM537.4000000000001 191.2000000000001C537.3000000000001 191.0000000000001 537.3000000000001 190.8000000000001 537.2 190.6C508.3000000000001 195 489.2 198.5 468.7 186.6C451.7 176.7000000000001 437.3000000000001 166.1 406.7000000000001 162.2000000000001C379.6 158.8000000000001 361.6 159.8000000000001 340.6 170.2000000000001C340.3 170.4 340 170.6 339.6 170.8000000000001C339.6 171.0000000000001 339.7000000000001 171.1000000000001 339.7000000000001 171.3000000000001C364.6 167.5000000000001 376.1 166.2000000000001 395.2000000000001 177.1000000000001C417.5000000000001 190.0000000000001 435.3000000000001 203.7000000000001 466.5000000000001 208.1000000000001C496.1000000000001 212.2000000000001 517.8000000000001 205.6000000000001 537.4000000000001 191.2000000000001zM268.6 350.7C268 351.3 267.5 351.9 266.5 353C274.1 353 296.2 354.2 319.9 344.6C339.6 336.6 352.1 323.6 370.1 311.7C381.2 304.4 393.5 302.4 406.5 303.6C410.8 304 415 304.8 419.3 305.3C419.7 305.4 420.2 305.3 420.8 305C420.2 304.6 419.6 304.1 419 303.8C410.8999999999999 299.8 402.3 297.5 393.3999999999999 296.7C367.2999999999999 294.1 343.0999999999999 300.4 319.9999999999999 312.1C300.6999999999999 322 283.5999999999999 335 268.5999999999999 350.7zM640 112.3C636.5 109.2 617.3 100.7 597.3 107C585 110.9 577.8 121.9 565.6999999999999 131.1C555.6999999999999 138.7000000000001 544.8 139 537.5999999999999 139.5C538.1999999999999 140.3 538.4999999999999 140.7 538.8 140.9C553.5999999999999 150.1 569.3 153.1 586.0999999999999 147.4C598.5999999999999 143.2 605.3 133.9 616.4999999999999 123.2C627.2999999999998 112.8 637.4999999999999 113.3 639.5999999999999 112.7C639.6999999999999 112.8 639.8 112.7 639.9999999999999 112.3zM427.5 -24.7C429.7 -25.9 429.1 -26.2 429 -26.7C410.5 -25.3 395.1 -19.1 382.2 -4.5C360.4 20.2 340.5 23.4 333.6 25.2C334.1 25.4 334.4 25.6 334.7 25.6C347.8 25.4999999999999 360.8 24.9 373.6 21.7C398.9 15.3 408.6 -3.7 415.2 -13.6C418.4 -18.4 422.5 -21.9 427.5 -24.7z" /> + <glyph glyph-name="php" + unicode="" + horiz-adv-x="640" d=" M320 343.5C491.4 343.5 623.2 271.3 623.2 192S491.3 40.5 320 40.5C148.6 40.5 16.8 112.7 16.8 192S148.7 343.5 320 343.5M320 360.3C143.3 360.3 0 285 0 192S143.3 23.7 320 23.7S640 99 640 192S496.7 360.3 320 360.3zM218.2 205.5C210.3 165 182.4 169.2 148.1 169.2L161.8 239.8C199.8 239.8 225.6 243.9 218.2 205.5zM97.4 97.7H134.1L142.8 142.5C183.9 142.5 209.4 139.5 233 161.6C259.1 185.6 265.9 228.3 247.3 249.7C237.6 260.9 222 266.4 200.8 266.4H130.1L97.4 97.7zM283.1 311.3H319.6L310.9000000000001 266.5C342.4000000000001 266.5 371.6 268.8 385.7000000000001 255.8C400.5000000000001 242.2 393.4000000000001 224.8 377.4000000000001 142.7000000000001H340.4000000000001C355.8 222.1000000000001 358.7000000000001 228.7000000000001 353.1 234.7000000000001C347.7000000000001 240.5000000000001 335.4000000000001 239.3000000000001 305.7000000000001 239.3000000000001L286.9000000000001 142.7000000000001H250.4000000000001L283.1 311.3000000000001zM505 205.5C497 164.4 468.3 169.2 434.9 169.2L448.6 239.8C486.8 239.8 512.4 243.9 504.9999999999999 205.5zM384.2 97.7H421L429.7 142.5C472.9 142.5 496.8 140 519.9 161.6C546 185.6 552.8 228.3 534.1999999999999 249.7C524.4999999999999 260.9 508.8999999999999 266.4 487.6999999999999 266.4H417L384.2 97.7000000000001z" /> + <glyph glyph-name="pied-piper-alt" + unicode="" + horiz-adv-x="576" d=" M242 261C248.3 272.8 255.2 278 267.9 282.8C295.2 293.1 308.1 313.3 326.8 333.9C338.7 325.5 338.8 309.3 358.4 310.9V289.1L364.7 288.8C402.1 303.2 439.4 319 471.3 343.4C519.5999999999999 380.2 524.1999999999999 393.4 552.5999999999999 443.4L554.5999999999999 446C553.9999999999999 431.9 548.3 418.7 542.1999999999999 406.1C511.6999999999999 342.3 463.4999999999999 305.8 395.3999999999999 289.4C383 286.5 369 286.2 357.7999999999999 280.5C359.1999999999999 270.7 370.9999999999999 262.4 370.9999999999999 257.5C370.9999999999999 254.1 365.4999999999999 250.3 363.4999999999999 248.9C352.2999999999999 261.8 347.3999999999999 268.2 340.7999999999999 271C333.1999999999999 274.5 276.8999999999999 277.4 241.9999999999999 261zM379.9 4.1C360.9 4.1 315.8 -5.4 300 -15.7L306.9 -60.8C342.6 -66.9 377 -64.4 412.9 -51C408.1 -41 389.4 4.1 379.9 4.1zM244 202C240.8 204 237.7 204.9 233.9 204.9C227.3 204.9 221.3 201.7 214.6 201.2L216.3 196.3L244 202zM231.4 170.2L255.5 109L276.5 122.8L245.2 173.7L231.4 170.2zM555.5 448L554.9 446.9L554.6 446L555.2 446.6L555.5 448zM496.3 65.9C462.4 122.8 421 184.3 346.3 181.4L346 187.4C344.9 200.9 378.8 184.2 381.1 218.4L366.7000000000001 211.2C346.9000000000001 256.9 358.1 265.5 301.2000000000001 265.5C286.5000000000001 265.5 274.5000000000001 263.8 259.8000000000001 260.9C262.7000000000001 242.3 262.0000000000001 224.2 248.9000000000001 210.6L268.4000000000001 205.1C266.7000000000001 201.9 265.5000000000001 198.8 265.5000000000001 195.3C265.5000000000001 174.3 308.3000000000002 192.4 308.3000000000002 161.7C308.3000000000002 143.3 271.5000000000001 101.6 253.4000000000001 101.6C245.4000000000001 101.6 199.7000000000001 151.6 200.0000000000001 161.7L200.3000000000001 166.3L252.6000000000002 177.8C265.6000000000002 180.4 264.9000000000002 200.5 249.7000000000002 200.5C246.0000000000002 200.5 206.6000000000001 191.3 200.3000000000001 189.9C198.3000000000001 195.1 192.8000000000001 204 186.5000000000001 204C183.3000000000001 204 180.2000000000001 200.8 177.0000000000001 200C167.8000000000001 197.4 146.0000000000001 197.1 155.5000000000001 179.9L15.9 149.5C10.4 148.4 7 143.2 7 137.7C7 131.7 12.5 126.8 18.5 126.8C26.5 126.8 149.8 155.2 165.9 159C168.5 155.8 170.5 152.7 173.7 150.4C193.8 136 233.5 64.5 250.1 64.5C274.2000000000001 64.5 308.1 86.9 321.4000000000001 106.4C324.6 110.7 328.3 113.9 333.8 113.3C334.4000000000001 99.4999999999999 302.2 79.1 300.8 69.6C299.4000000000001 59.4 299.8 34.4 300.5 28.4999999999999C327.2 20.3999999999999 352.5 32.1 378.4 31.3999999999999C382.7 52.3999999999999 389 73.2999999999999 388.2 94.8999999999999L387.9 104.3999999999999C386.5 138.5999999999999 377 142.8999999999999 353.1 163C352 164.1 350.5 165.6 349.4 167C351.6 168.3999999999999 350.5 168 354 168.6999999999999C442.5 168.6999999999999 410.3 -14.9000000000001 465.5 -61.2C498.6 -46.2 538 -33.3000000000001 569 -14.0000000000001C540 11.6 516.4 31.6999999999999 496.3 65.9zM300.1 19.9V-7.4L311.9000000000001 -4.0000000000001L309.0000000000001 19.8H300.1000000000001zM376.2000000000001 17C376.2000000000001 18.4 375.6 20.2 375.3000000000001 21.6C348.5000000000001 21.6 338.4000000000001 17.8 315.8000000000001 15.3L317.8000000000001 2.9C326.8000000000001 4.4 376.2000000000001 9.5000000000001 376.2000000000001 17.0000000000001z" /> + <glyph glyph-name="pied-piper-pp" + unicode="" + horiz-adv-x="448" d=" M205.3 273.4C205.3 252.3 191.1 235.3 173.6 235.3C166.5 235.3 160.8 236.5 156.4 239V307C160.8000000000001 309.7 166.5 311.2 173.6 311.2C191.1 311.2 205.3 294.3 205.3 273.4zM257.9000000000001 206.4C250.8000000000001 206.4 245.1 204.9 240.7000000000001 202.2V134.2000000000001C245.1000000000001 131.7000000000001 250.8000000000001 130.5000000000001 257.9000000000001 130.5000000000001C275.3 130.5000000000001 289.6 147.4 289.6 168.3000000000001C289.6 189.4000000000001 275.3 206.4000000000001 257.9000000000001 206.4000000000001zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM185 192.9C226 192.9 259.2 228.5 259.2 272.5C259.2 316.5 226 352.1 185 352.1C173 352.1 160.9 348.9 150.4 343.3H104.7V137L156.5 147.1V197.7C165.1 194.6 174.6 192.9 185 192.9zM343.4 167.6C343.4 211.6 310.2 247.2 269.5 247.2C266.3 247.2 263.1 247.0000000000001 259.9 246.5000000000001C256.2 234.0000000000001 249.8 222.7 240.7 213.1C226.9 198.1 208.5 189.3 188.9 188.3V32L240.7 42.1V92.7000000000001C249.3 89.5000000000001 258.9 88.0000000000001 269.4 88.0000000000001C310.2 88.0000000000001 343.4 123.6000000000001 343.4 167.6z" /> + <glyph glyph-name="pied-piper" + unicode="" + horiz-adv-x="640" d=" M640 423.1C559.2 369.5 550.6 330.6 543.6 318.7C536.9 306.5 531.9 258.4 520.3000000000001 235.1C508.6000000000001 211.5 466.1000000000001 192.9 454.2 185.1C442.5000000000001 177.3 425.9000000000001 147 412.3000000000001 120.9C304.2000000000001 125.3 244.9000000000001 82.1 153.1000000000001 27.3000000000001C182.5000000000001 37.0000000000001 196.4000000000001 44.0000000000001 196.4000000000001 44.0000000000001C290.6000000000001 80.0000000000001 335.7000000000001 112.3000000000001 477.5000000000001 93.2000000000001C478.6000000000001 93.2000000000001 479.4000000000001 92.6 480.3000000000001 92.4C484.2000000000001 90.2000000000001 485.6000000000001 85.5000000000001 483.4000000000001 81.6L429.5000000000002 -14.2C427.0000000000002 -18.9 421.7000000000002 -21.4 416.4000000000002 -20.3C289.6000000000002 3.5 189.5000000000002 -37.6 97.5000000000002 -38.9C24.1 -40 0 -5.4 0 -3.8C0 -2.7 0.6 -2.1 1.7 -2.1C1.7 -2.1 40 -2.1 104.8 13.2C178.4 153.5 244 202.6 315.4 202.6C315.4 202.6 387.1 202.6 406 140.7C428.8 180.4 434.3 189.9 434.3 189.9C439.6 199.3 469.3 267.1 520.7 331.3C572.2 395.3 611.1 411.2 640 423.1z" /> + <glyph glyph-name="pinterest-p" + unicode="" + horiz-adv-x="384" d=" M204 441.5C101.4 441.5 0 373.1 0 262.4C0 192 39.6 152 63.6 152C73.5 152 79.2 179.6 79.2 187.4C79.2 196.7 55.5 216.5 55.5 255.2C55.5 335.6 116.7 392.6 195.9 392.6C264 392.6 314.4 353.9 314.4 282.8C314.4 229.7 293.1 130.1 224.1 130.1C199.2 130.1 177.9 148.1 177.9 173.9C177.9 211.7000000000001 204.3 248.3000000000001 204.3 287.3000000000001C204.3 353.5000000000001 110.4 341.5000000000001 110.4 261.5C110.4 244.7 112.5 226.1 120 210.8C106.2 151.4 78 62.9 78 1.7C78 -17.1999999999999 80.7 -35.8 82.5 -54.6999999999999C85.9 -58.4999999999999 84.2 -58.0999999999999 89.4 -56.1999999999999C139.8 12.8000000000001 138 26.3000000000001 160.8 116.6000000000001C173.1 93.2000000000001 204.9 80.6000000000001 230.1 80.6000000000001C336.3 80.6000000000001 384 184.1000000000001 384 277.4000000000001C384 376.7 298.2 441.5 204 441.5z" /> + <glyph glyph-name="pinterest-square" + unicode="" + horiz-adv-x="448" d=" M448 368V16C448 -10.5 426.5 -32 400 -32H154.4C164.2 -15.6 176.8 8 181.8 27.3C184.8 38.8 197.1 85.7 197.1 85.7C205.1 70.4 228.5000000000001 57.5 253.4000000000001 57.5C327.5 57.5 380.8000000000001 125.6 380.8000000000001 210.2C380.8000000000001 291.3 314.6000000000001 352 229.4000000000001 352C123.4000000000001 352 67.2000000000001 280.9 67.2000000000001 203.4C67.2000000000001 167.4 86.4000000000001 122.6 117.0000000000001 108.3C121.7000000000001 106.1 124.1000000000001 107.1 125.2000000000001 111.6C126.0000000000001 115 130.2000000000001 131.7000000000001 132.0000000000001 139.4C132.6000000000001 141.9 132.3000000000001 144.0000000000001 130.3000000000001 146.4C120.2000000000001 158.7000000000001 112.0000000000001 181.3 112.0000000000001 202.4C112.0000000000001 256.6 153.0000000000001 309 222.9000000000001 309C283.2000000000001 309 325.5000000000001 267.9000000000001 325.5000000000001 209.1C325.5000000000001 142.7000000000001 292.0000000000001 96.7000000000001 248.3000000000002 96.7000000000001C224.2000000000001 96.7000000000001 206.2000000000001 116.6 211.9000000000001 141.1C218.8000000000001 170.3 232.2000000000002 201.8 232.2000000000002 222.9C232.2000000000002 275.9000000000001 156.7000000000001 268.6 156.7000000000001 197.9C156.7000000000001 176.2000000000001 164.0000000000002 161.4 164.0000000000002 161.4C132.6000000000001 28.6 127.9000000000002 26.9 134.4000000000002 -31.1999999999999L136.6000000000001 -31.9999999999999H48C21.5 -31.9999999999999 0 -10.4999999999999 0 16.0000000000001V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368z" /> + <glyph glyph-name="pinterest" + unicode="" + horiz-adv-x="496" d=" M496 192C496 55 385 -56 248 -56C222.4 -56 197.8 -52.1 174.6 -44.9C184.7 -28.4 199.8 -1.4 205.4 20.1C208.4 31.7 220.8 79.1 220.8 79.1C228.9 63.7000000000001 252.5 50.6 277.6 50.6C352.4000000000001 50.6 406.3 119.4 406.3 204.9C406.3 286.8000000000001 339.4 348.1 253.4 348.1C146.4 348.1 89.5 276.3 89.5 198C89.5 161.6 108.9 116.3 139.8 101.9C144.5 99.7000000000001 147 100.7000000000001 148.1 105.2000000000001C148.9 108.6 153.1 125.5000000000001 155 133.3000000000001C155.6 135.8000000000001 155.3000000000001 138.0000000000001 153.3000000000001 140.4000000000001C143.2000000000001 152.9000000000001 135 175.7000000000001 135 197.0000000000001C135 251.7000000000001 176.4 304.6000000000001 247.0000000000001 304.6000000000001C307.9000000000001 304.6000000000001 350.6 263.1000000000001 350.6 203.7000000000001C350.6 136.6000000000001 316.7000000000001 90.1000000000001 272.6 90.1000000000001C248.3 90.1000000000001 230.0000000000001 110.2000000000001 235.9000000000001 134.9000000000001C242.9000000000001 164.4000000000001 256.4000000000001 196.2000000000001 256.4000000000001 217.5000000000001C256.4000000000001 236.5000000000001 246.2000000000001 252.4000000000001 225 252.4000000000001C200.1 252.4000000000001 180.1 226.7000000000001 180.1 192.2000000000001C180.1 170.2000000000001 187.5 155.4000000000001 187.5 155.4000000000001S163 51.6000000000001 158.5 32.2000000000001C153.5 10.8000000000001 155.5 -19.3999999999999 157.6 -38.9999999999999C65.4 -2.9 0 86.9 0 192C0 329 111 440 248 440S496 329 496 192z" /> + <glyph glyph-name="playstation" + unicode="" + horiz-adv-x="576" d=" M570.9 75.7C559.6 61.5 532.1 51.4 532.1 51.4L327 -22.2V32.1L477.9 85.9C495 92.0000000000001 497.7 100.7000000000001 483.7 105.3C469.8 109.9 444.6 108.6 427.5 102.4L327 66.9V123.3C350.2 131.1 374.1 136.9 402.7 140.1C443.6 144.6 493.6 139.5 532.9 124.6C577.1 110.6 582.1 89.9 570.9 75.7zM346.5 168.2V307.2C346.5 323.5 343.5 338.5 328.2 342.8C316.5 346.6 309.2 335.7 309.2 319.4V-28.5L215.4 1.3V416C255.3 408.6 313.4 391.1 344.6 380.6C424.1 353.3 451 319.3 451 242.8C451 168.3 405 140 346.5 168.2000000000001zM43.2 37.8C-2.2 50.6 -9.8 77.3 10.9 92.6C30 106.8 62.6 117.5 62.6 117.5L197.1 165.3V110.8L100.3 76.2C83.2 70.1 80.6 61.4 94.5 56.8C108.4 52.2 133.6 53.5 150.7000000000001 59.7L197.1000000000001 76.6V27.8C145.5000000000001 18.4999999999999 95.7000000000001 20.4999999999999 43.2 37.8z" /> + <glyph glyph-name="product-hunt" + unicode="" + horiz-adv-x="512" d=" M326.3 229.2C326.3 208.7 309.6 192 289.1 192H218.8V266.4H289.1C309.6 266.4 326.3 249.7 326.3 229.2zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM375.9 229.2C375.9 277.1 337 316 289.1 316H169.2V68H218.8V142.4H289.1C337 142.4 375.9 181.3 375.9 229.2z" /> + <glyph glyph-name="pushed" + unicode="" + horiz-adv-x="432" d=" M407 336.1L308.5 345.1L322.5 378.5C332.9 402 311.7 418.9 293.8 415.5L22.5 371.1C7.4 368.4 -3.5 352.8 1.1 334.5L106.2 -13.8C112.7 -35.1 142.9 -38 153.9 -20.8L189.2 60L424.4 291.3C440.8 308.1 428.7 334.2000000000001 407 336.1zM297.6 394.4C302.7000000000001 395.1 305.1 391.9 302.8 387L286 347.1L108.6 363.4L297.6 394.4zM22.7 340.1C19.6 345.2 23.7 350.1 28.8 349.2L277.5 326.5L180.6 95.8L22.7 340.1zM136 -8.4C133.4 -12.4 128.1 -11.5 126.6 -7.2L43.5 268.3L171.2 70.7000000000001C164.2 55.7 136 -8.4 136 -8.4zM408.8 306.1L210.1 110.7L299.8 324.4L406.2000000000001 314.7C410.2000000000001 313.6 411.9000000000001 309.4 408.8000000000001 306.1z" /> + <glyph glyph-name="python" + unicode="" + horiz-adv-x="448" d=" M167.8 411.6C122.6 403.6 114.4 386.9 114.4 356V315.3H221.3V301.7000000000001H74.3C43.2 301.7000000000001 16 283 7.5 247.5C-2.3 206.8 -2.7 181.4 7.5 138.9C15.1 107.3 33.2 84.7 64.3 84.7H101V133.5C101 168.8 131.5 199.9 167.8 199.9H274.6C304.3 199.9 328 224.4 328 254.2V356.1C328 385.1 303.6 406.8 274.6 411.7C238.8 417.6 199.9 417.3 167.8 411.6zM161.1 383.2C172.1 383.2 181.2 374 181.2 362.8S172.2 342.5 161.1 342.5C150 342.5 141 351.6 141 362.8C141.1 374.1 150 383.2000000000001 161.1 383.2000000000001zM346.3 301.8V254.3C346.3 217.5 315.1 186.5 279.5 186.5H172.7C143.5 186.5 119.3 161.5 119.3 132.2V30.4C119.3 1.4 144.5 -15.6 172.7 -23.9C206.5 -33.8 239 -35.6 279.5 -23.9C306.4 -16.1 332.9 -0.4 332.9 30.4V71.1H226.2V84.7H386.4C417.5 84.7 429 106.4 439.8 138.9C450.9999999999999 172.4 450.4999999999999 204.6 439.8 247.5C432.1 278.4 417.5 301.7 386.4 301.7H346.3zM286.2 44C297.3 44 306.3 34.9 306.3 23.7C306.3 12.4 297.3 3.3 286.2 3.3C275.2 3.3 266.1 12.5 266.1 23.7C266.2 35 275.2 44 286.2 44z" /> + <glyph glyph-name="qq" + unicode="" + horiz-adv-x="448" d=" M433.754 27.555C422.228 26.162 388.894 80.296 388.894 80.296C388.894 48.951 372.758 8.049 337.843 -21.49C354.685 -26.682 392.6860000000001 -40.657 383.646 -55.911C376.3300000000001 -68.254 258.136 -63.792 224.014 -59.948C189.892 -63.792 71.698 -68.254 64.382 -55.911C55.337 -40.661 93.3 -26.697 110.165 -21.496C75.245 8.043 59.106 48.949 59.106 80.2960000000001C59.106 80.2960000000001 25.772 26.162 14.247 27.5550000000001C8.877 28.205 1.823 57.1990000000001 23.594 127.2590000000001C33.855 160.2830000000001 45.589 187.7370000000001 63.738 233.0380000000001C60.683 349.937 108.982 447.9940000000001 224 448C337.737 447.9940000000001 387.156 351.867 384.264 233.037C402.382 187.814 414.176 160.187 424.408 127.259C446.1760000000001 57.199 439.124 28.206 433.754 27.555z" /> + <glyph glyph-name="quinscape" + unicode="" + horiz-adv-x="489.1" d=" M301.9 -26.6H300.6C213.3 -26.6 142.5 44.2 142.5 131.5S213.3 289.6 300.6 289.6C395.5 289.6 468.8 206.5 457.6 113C461.6 107.9 465.8 103.4 468.8 97.7C482.1999999999999 128 489.1 160.1 489.1 195.4C489.1 330.5 379.6 440 244.5 440C109.5 440 0 330.5 0 195.4S109.5 -49.2 244.5 -49.2C269.3 -49.2 292.3 -46 314.9 -39.1C309.7 -35.6 305.9 -30.9 301.5 -26.4999999999999L301.9 -26.6zM280.7 43.2C280.7 98 325.1 142.4 379.9 142.4C434.7 142.4 479.1 98 479.1 43.2C479.1 -11.6 434.7 -56 379.9 -56C325.1 -56 280.7 -11.6 280.7 43.2" /> + <glyph glyph-name="quora" + unicode="" + horiz-adv-x="448" d=" M440.5 61.3H411.2C409.7 47.8 400.7 30.5 378.2 30.5C357.7 30.5 342.9 44.7 328.7 66.3C372.9 100.5 403.4 153.8 403.4 219.3C403.5 336.8 306.8 416 205 416C105.3 416 7.3 336.3 7.3 219.3C7.3 85.2000000000001 138.6 -2.3 256.3 30.3C276 -3.3 302 -32 351.5 -32C433.3 -32 442.3 43.3 440.5 61.3zM297 118.8C277.5 148 253.3 171 205.5 171C175 171 151.2 161 136.5 148.2L148.7 123.9C154.9 126.9 161.7 127.9 168.5 127.9C204 127.9 222.2 97.1 237.7 66.6C227.7 63.6 217 62.4 205 62.4C130 62.4 97.5 115.4 97.5 219.1C97.5 323.5 130 377 205 377C281.2 377 313.7 323.5 313.7 219.3C313.8 177.5 308.3 143.7000000000001 297 118.8z" /> + <glyph glyph-name="ravelry" + unicode="" + horiz-adv-x="512" d=" M407.4 386.5C331.6 425.9 257.8 417 182.9 382C171.6 376.8 167.4 371.4 163 363C152.7 343.8 146.8 325.6 143.1 310.3C121.9 284.7000000000001 106.7 254.2 99.8 220.4C89.2 202.4 78.9 179 76.7 149C76.7 149 76 141.4 76.2 141.1C40.9 145.7000000000001 0 168.1 0 168.1C9.1 153.6 61.3 135.8 76.3 130.2000000000001C76.3 130.2000000000001 78 32.2 140.8 -0.9999999999999C129.5 16.2 127.5 19.2 127.5 19.2S94.8 79 100.4 123.3C101.1 123.3 101.9 123.1 102.6 123.1C126.5 35.7 205.8 -28.3 299.5 -28.3C305.7 -28.3 311.6 -28.1 317.5 -27.6C331.5 -29.1 345.1 -28.1 357.6 -23.7C364.5 -21.5 371.4000000000001 -17.3 377.8 -12.9C448 26.2 478.7 69.1 500.9 134.8C506.3 150.8 509 170.3 510.7 187C519.4 269.3 480.1 348.6 407.4 386.5zM138.8 284.8S137.6 272.5 138.1 265.1C134.7 262.6 128 257 119.9 248.4000000000001C125.1 261.2000000000001 131.2 273.5 138.8 284.8000000000001zM107.6 162.9C112 180.1 120.9 202 137.4 218C137.4 218 139.1 170 153.2 127.9L111.8 134.8C109.6 144 108.3 153.3 107.6 162.9zM115.5 120.1C130.3 116.9 149.5 112.4999999999999 158.6 110.9999999999999C185.9 34.1999999999999 266.9000000000001 -13.3000000000001 266.9000000000001 -13.3000000000001C267.9000000000001 -13.8000000000001 268.6 -14.0000000000001 269.6 -14.3000000000001C196.5 -2.7 136.9 50.3999999999999 115.5 120.0999999999999zM386 3.9C371.5 -0.8 349.8 -4.5 321.3 0.2C321.3 0.2 230.2 23.3 193.8 108C232 107.3 246.2 108.2 271.8 111.9C311.2 117.6 350.8 128.1 386.8 144.9C398.6 150.3 397.9000000000001 164.3 396.4000000000001 174.7C394.4000000000001 187.5 385.3 186.8 375.0000000000001 179.4C375.0000000000001 179.4 293.0000000000001 120.8 185.2000000000001 125.7C166.5000000000001 157.7 158.4 236.5 158.4 236.5C199.8000000000001 271.7 241.6 296.1 326.8000000000001 288.9C327.0000000000001 295.3 329.8000000000001 316 306.4000000000001 317C306.4000000000001 317 212.9000000000001 328.1 160.4000000000001 283.5C162.9000000000001 300 166.3000000000001 312.8 171.5000000000001 322.9C205.7000000000001 353.7 250.5000000000001 372.4 299.8000000000001 372.4C406.2000000000001 372.4 492.8000000000001 285.3 492.8000000000001 177.9C492.6000000000001 101.9 449.0000000000001 35.9 386.0000000000001 3.9z" /> + <glyph glyph-name="react" + unicode="" + horiz-adv-x="512" d=" M418.2 270.8C412.8 272.6 407.4 274.3 402 275.9C402.9 279.6 403.7 283.3 404.5 287C416.8 346.6 408.7 394.5 381.4 410.3C355.1 425.4 312.2 409.7 268.8 371.9C264.5 368.2 260.3 364.3 256.3 360.4C253.6 363 250.8 365.6 248 368.1C202.5 408.5 156.9 425.5 129.5999999999999 409.6C103.3999999999999 394.4 95.5999999999999 349.3 106.5999999999999 292.9C107.6999999999999 287.3 108.8999999999999 281.8 110.2999999999999 276.2000000000001C103.8999999999999 274.4 97.5999999999999 272.4 91.6999999999999 270.3C38.3 251.8 0 222.6 0 192.4C0 161.2 40.8 129.9 96.3 110.9C100.8 109.4 105.3 107.9 109.9 106.6C108.4 100.6 107.1 94.7 105.9 88.6C95.4 33.1 103.6 -10.9 129.8 -26C156.8 -41.6 202.2 -25.6 246.4 13.1C249.9 16.2 253.4 19.4 256.9 22.8C261.3 18.5 265.9 14.4 270.5 10.4C313.3 -26.4 355.6 -41.3 381.7 -26.2C408.7 -10.6 417.5 36.7 406.1 94.3C405.2 98.7 404.2 103.2 403.1 107.8C406.3 108.7 409.4 109.7 412.5 110.7C470.1999999999999 129.8 511.9999999999999 160.7 511.9999999999999 192.4C511.9999999999999 222.7 472.6 252.1 418.2 270.8zM282.9 355.7C320.1 388.1 354.8 400.8 370.6 391.7C387.5 382 394 342.8 383.4 291.3C382.7 287.9 382 284.6 381.1 281.3C358.9 286.3 336.4 289.9 313.8 291.9C300.8 310.5 286.6 328.3 271.2 345C275.0999999999999 348.7 278.8999999999999 352.2 282.8999999999999 355.7zM152.9 166.6C157.5 157.8 162.2 149.1 167.2 140.5C172.3 131.8 177.5 123.1 183 114.6C167.4 116.3 151.9 118.8 136.6 122.1C141 136.5 146.5 151.4 152.9 166.6zM152.9 217.2C146.6 232.1 141.3 246.7 136.9 260.8C151.3 264 166.6 266.6 182.5 268.6C177.2 260.3 172 251.8 167.1 243.2C162.2 234.7 157.4 226.0000000000001 152.9 217.2zM164.3 191.9C170.9 205.7000000000001 178.1 219.2000000000001 185.7 232.5000000000001C193.3 245.8000000000001 201.5 258.7000000000001 210.1 271.4000000000001C225.1 272.5 240.4 273.1 256 273.1C271.6 273.1 287 272.5 301.9 271.4000000000001C310.4 258.8000000000001 318.5 245.9000000000001 326.2 232.7000000000001C333.9 219.5000000000001 341.1 206.0000000000001 347.9 192.3000000000001C341.2 178.5000000000001 334 164.9 326.3 151.5000000000001C318.7 138.2000000000001 310.6 125.3000000000001 302.1 112.5000000000001C287.2 111.4 271.7 110.9 256 110.9C240.3 110.9 225.1 111.4 210.4 112.3C201.7 125 193.5 138 185.8 151.3C178.1 164.6 171 178.1 164.3 191.9zM344.9 140.7000000000001C350 149.5000000000001 354.8 158.4 359.5 167.4C365.9 152.9 371.5 138.2000000000001 376.4 123.1C360.9 119.6 345.2 116.9 329.4 115.1C334.8 123.5 339.9 132.1 344.9 140.7000000000001zM359.3 217.2000000000001C354.6 226.0000000000001 349.8 234.8000000000001 344.8 243.4000000000001C339.9 251.9000000000001 334.8 260.3000000000001 329.5 268.6C345.6 266.6 361 263.9000000000001 375.3999999999999 260.6C370.7999999999999 245.8 365.3999999999999 231.4000000000001 359.2999999999999 217.2zM256.2 329.7C266.7 318.3 276.6 306.3 285.8 293.9C266 294.8 246.1 294.8 226.3 293.9C236.1 306.8 246.2 318.8 256.2 329.7zM140.2 391C157 400.8 194.3 386.8 233.6 352C236.1 349.8 238.6 347.4 241.2 345C225.7 328.3 211.4 310.5 198.3 291.9C175.7 289.9 153.3 286.4 131.1 281.5C129.8 286.6 128.7 291.8 127.6 297C118.2 345.4 124.4 381.9 140.2 391zM115.7 127.4C111.5 128.6 107.4 129.9 103.3 131.3C82 138 57.8 148.6 40.3 162.5C30.2 169.5 23.4 180.3 21.5 192.4C21.5 210.7 53.1 234.1 98.7 250C104.4 252 110.2 253.8 116 255.5C122.8 233.8 131 212.5 140.5 191.8999999999999C130.9 171 122.6 149.3999999999999 115.7 127.3999999999999zM232.3 29.4C215.8 14.3 196.7 2.3 175.9 -5.9C164.8 -11.2 152 -11.7 140.6 -7.2C124.7 1.9999999999999 118.1 37.3 127.1 84.8C128.2 90.4 129.4 95.9999999999999 130.8 101.4999999999999C153.2 96.6999999999999 175.8 93.3999999999999 198.7 91.6999999999999C211.9 72.9999999999999 226.4 55.0999999999999 241.9 38.3C238.7 35.1999999999999 235.5 32.1999999999999 232.3 29.4zM256.8 53.7C246.6 64.7 236.4 76.9 226.5 90C236.1 89.6 246 89.4 256 89.4C266.3 89.4 276.3999999999999 89.6 286.3999999999999 90.1C277.2 77.4 267.2999999999999 65.3 256.7999999999999 53.7zM387.5 23.7C386.6 11.5 380.6 0.1 371 -7.6C355.1 -16.8 321.2 -4.8 284.5999999999999 26.6C280.3999999999999 30.2 276.2 34.1 271.8999999999999 38.1C287.2 54.9999999999999 301.2999999999999 72.9 314.0999999999999 91.7C336.9999999999999 93.6 359.7999999999999 97.1 382.2999999999999 102.2C383.2999999999999 98.1 384.1999999999999 94 384.9999999999999 90C389.8999999999999 68.4 390.6999999999999 45.9 387.4999999999999 23.7zM405.7 131.2C402.8999999999999 130.3 400.0999999999999 129.4 397.2 128.6C390.2 150.4 381.5999999999999 171.7 371.7 192.4C381.3 212.8 389.3999999999999 233.8 396.2 255.3C401.3999999999999 253.8 406.3999999999999 252.2 411.2 250.6C457.8 234.6 490.4999999999999 210.8 490.4999999999999 192.6C490.4999999999999 173 455.6 147.7 405.7 131.2zM256 237.8C281.3 237.8 301.8 217.3 301.8 192C301.8 166.7 281.3 146.2 256 146.2C230.7 146.2 210.2 166.7 210.2 192C210.2 217.3 230.7 237.8 256 237.8" /> + <glyph glyph-name="rebel" + unicode="" + horiz-adv-x="512" d=" M256.5 -56C117.2 -56 9 60.2 13.2 198.1C16 277.3 56.4 350.3 129.7 398.5C130 398.5 131.6 399.1 130.8 397.7C125 392.2 19.5 267.9 116.7 171.3C166.5 121.8 206.7 168.8 206.7 168.8C245.2 218.9 206.1 294.7000000000001 206.1 294.7000000000001C196.1 319.6 160.4 334.8 160.4 334.8L189.2 366.6C213.6 356.1 232.4 327.9 232.4 327.9C233.2 357.5 210.5 389.3 210.5 389.3L255.1 440L299.4 389.9C278.9 361.1 277.5 327.3 277.5 327.3C291.3 350.3 321 366.6 321 366.6L349.5 334.8C322.1 325.9 304.1 294.9 304.1 294.9C288.3 266.4 277 205.5 304.7000000000001 167.6C337.1 123 392.4000000000001 170.4 392.4000000000001 170.4C495.1 262.3000000000001 381.9000000000001 395.4000000000001 381.9000000000001 395.4000000000001C375.8 400.9000000000001 382.7000000000001 398.2000000000001 382.7000000000001 398.2000000000001C432.8000000000001 361.7000000000001 497.3000000000001 313.8 498.9 193.4C500.9 47.8 399 -56 256.5 -56z" /> + <glyph glyph-name="red-river" + unicode="" + horiz-adv-x="448" d=" M353.2 416H94.8C42.4 416 0 373.6 0 321.2V62.8C0 10.4 42.4 -32 94.8 -32H353.2C405.6 -32 448 10.4 448 62.8V321.2C448 373.6 405.6 416 353.2 416zM144.9 247.1V190.8C144.9 163.8 123 141.9 96 141.9V296.1C96 309.3 106.7 320 119.9 320H274.1C274.1 293 252.2 271.1 225.2 271.1H168.9C156.6 271.7 144.3000000000001 259.5 144.9 247.1zM321.2000000000001 175.1H264.9000000000001C252.6 175.7000000000001 240.3000000000001 163.5 240.9000000000001 151.1V94.8C240.9000000000001 67.8 219 45.9 192 45.9V200.1C192 213.3 202.7 224 215.9 224H370.1C370.1 197 348.2000000000001 175.1 321.2000000000001 175.1z" /> + <glyph glyph-name="reddit-alien" + unicode="" + horiz-adv-x="512" d=" M440.3 244.5C425.3 244.5 412.1 238.3 402.4000000000001 228.6C366.7000000000001 253.3 318.6 269.2 265.3000000000001 270.9L293 395.7L381.2 375.9C381.2 354.3 398.8 336.7 420.4 336.7C442.4 336.7 460.1 354.8 460.1 376.4S442.5 416.1 420.4 416.1C405 416.1 391.7 406.8 385.1 394.1L287.7 415.7C282.8 417 278 413.5 276.7 408.6L246.3 271C193.4 268.8 145.8 252.9 110 228.2C100.3 238.3 86.6 244.5 71.6 244.5C16 244.5 -2.2 169.9 48.7 144.4C46.9 136.5 46.1 128.1 46.1 119.7C46.1 35.9 140.5 -32 256.4 -32C372.8 -32 467.2 35.9 467.2 119.7C467.2 128.1 466.3 136.9 464.1 144.8C514 170.4 495.6 244.5 440.3 244.5zM129.4 139.1C129.4 161.1 147 178.8 169.1 178.8C190.7 178.8 208.3 161.2 208.3 139.1C208.3 117.5 190.7 99.9 169.1 99.9C147.1 99.8 129.4 117.5000000000001 129.4 139.1zM343.7000000000001 45.6C307.3000000000001 9.2 204.6000000000001 9.2 168.2000000000001 45.6C164.2000000000001 49.1 164.2000000000001 55.3 168.2000000000001 59.3C171.7000000000001 62.8 177.9 62.8 181.4 59.3C209.2000000000001 30.8 301.4000000000001 30.3 330.4000000000001 59.3C333.9000000000001 62.8 340.1 62.8 343.6 59.3C347.7000000000001 55.3 347.7000000000001 49.1 343.7000000000001 45.6zM342.9000000000001 99.8C321.3 99.8 303.7000000000001 117.4 303.7000000000001 139C303.7000000000001 161 321.3000000000001 178.7 342.9000000000001 178.7C364.9000000000001 178.7 382.6 161.1 382.6 139C382.5 117.5 364.9000000000001 99.8 342.9000000000001 99.8z" /> + <glyph glyph-name="reddit-square" + unicode="" + horiz-adv-x="448" d=" M283.2 102.5C285.9 99.8 285.9 95.7 283.2 93.3C258.7 68.8 189.4 68.7 164.8 93.3C162.1 95.7 162.1 99.8 164.8 102.5C167.2 104.9 171.3 104.9 173.7 102.5C192.4 83.3 254.7 82.9 274.2 102.5C276.6 104.8 280.8 104.8 283.2 102.5zM191.9 156.3C191.9 171.2 180 183.1 165.4 183.1C150.5 183.1 138.6 171.2000000000001 138.6 156.3C138.6 141.7 150.5 129.8 165.4 129.8C180 129.8 191.9 141.7 191.9 156.3zM282.6 183.1C268 183.1 256.1 171.2000000000001 256.1 156.3C256.1 141.7 268 129.8 282.6 129.8C297.5 129.8 309.4 141.7 309.4 156.3C309.4 171.2 297.5 183.1 282.6 183.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM348.3 227.4C338.2 227.4 329.3 223.2 322.7 216.7C298.6 233.4 266.2 244.1 230.2 245.3L248.9 329.5L308.4 316.1C308.4 301.5 320.3 289.6 334.9 289.6C349.8 289.6 361.7 301.8 361.7 316.4000000000001C361.7 331 349.8 343.2000000000001 334.9 343.2000000000001C324.5 343.2000000000001 315.6 337 311.1 328.3L245.4 342.9000000000001C242.1 343.8 238.9 341.4000000000001 238 338.1L217.5 245.3C181.8 243.8 149.7 233.1 125.6 216.4C119.1 223.2 109.8 227.4 99.7 227.4C62.2 227.4 49.9 177 84.2 159.9C83 154.5 82.4 148.9 82.4 143.2C82.4 86.7 146.1 40.9 224.3 40.9C302.8 40.9 366.5 86.7 366.5 143.2C366.5 148.9 365.8999999999999 154.8 364.3999999999999 160.2C398 177.4 385.5999999999999 227.4 348.2999999999999 227.4z" /> + <glyph glyph-name="reddit" + unicode="" + horiz-adv-x="512" d=" M201.5 142.5C187.7 142.5 176.6 153.6 176.6 167.1C176.6 180.9 187.7 192 201.5 192C215.1 192 226.1 180.9 226.1 167.1C226.1 153.5 215 142.5 201.5 142.5zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM371.7 233.2C362.3 233.2 354 229.3 347.9 223.2C325.5 238.7 295.3 248.7 261.8 249.8L279.2 328.1L334.5999999999999 315.6C334.5999999999999 302 345.7 291 359.2 291C373 291 384.0999999999999 302.3 384.0999999999999 315.9S372.9999999999999 340.8 359.2 340.8C349.5 340.8 341.2 335 337.0999999999999 327L275.8999999999999 340.6C272.8999999999999 341.4 269.7999999999999 339.2 269 336.2L249.9 249.8C216.6999999999999 248.4 186.8 238.5 164.4 223C158.3 229.4 149.7 233.2 140.3 233.2C105.4 233.2 94 186.3 125.9 170.3999999999999C124.8 165.3999999999999 124.2 160.1999999999999 124.2 154.8999999999999C124.2 102.2999999999999 183.4 59.6999999999999 256.2 59.6999999999999C329.3 59.6999999999999 388.5 102.3 388.5 154.8999999999999C388.5 160.1999999999999 387.8999999999999 165.6999999999999 386.6 170.6999999999999C417.9 186.6999999999999 406.4 233.2 371.7 233.2zM302.8 117C284.6 98.8 226.7 99.1 209.2 117C207 119.2 203.1 119.2 200.9 117C198.4 114.5 198.4 110.6 200.9 108.4C223.7 85.6 288.2 85.6 311.1 108.4C313.6 110.6 313.6 114.5 311.1 117C308.9000000000001 119.2 305 119.2 302.8 117zM310.5 192C296.9 192 285.9 180.9 285.9 167.1C285.9 153.5 297 142.5 310.5 142.5C324.3 142.5 335.4 153.6 335.4 167.1C335.4 180.9 324.4 192 310.5 192z" /> + <glyph glyph-name="rendact" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56C266.6 -56 284.7 -53.9 302.1 -50.1C296.5 -42.7 291.3 -35.7 286.2000000000001 -28.8C273.8000000000001 -30.9 261.0000000000001 -32.1 247.9000000000001 -32.1C124.3 -32 24 68.3 24 192S124.3 416 248 416S472 315.7 472 192C472 121 439 57.8 387.5 16.7C361.6 -2.1 348.4 -4.7 304 60.9C225.3 173.8 256 132 230.3 169.2C303.1 160.3 458.8 241.2 398.9 337.8C314 474.8 15 354.2 59.7 221.6C62.9 211.8 74.1 183 105.3 183C107.3 183 107.9 183.6 107.3 184.7C102.9 193.4 87.2 194.5 87.2 222.1C87.2 262.6 127.7 311.7 187.5 342.1C253.6 374.4 319.4 372.3 345.7 336.7C372.9 298.4 324.8 217.5 225.3 199.8C232.8 209.2 282.3 275 288.1 283.8C310.8 318.4 311.7 332.8 302.1 343C286.6 359.9 272.6 353.3 251.4 354.7C240.6 355.6 137.7 173.5 115 137.8C109.1 128.8 93.8 103.6999999999999 93.8 86.9C93.8 65.6 96.6 35.5 114.4 35.5C125 35.5 122.4 54.2 122.4 62.1C122.4 75 149.8 111.5 197.2 166.7000000000001C217.6 130.6 254.9 52.4 327.4 -42.9999999999999C425.4 -9.8999999999999 495.9 82.8000000000001 495.9 192.0000000000001C496 329 385 440 248 440z" /> + <glyph glyph-name="renren" + unicode="" + horiz-adv-x="512" d=" M214 278.9C214 168.5 153 73.5 66.4 31.5C30 74.8 8 130.3 8 191.4C8 314.1 97.1 415.8 214 435.5V278.9zM255 -56C212.1 -56 171.7 -45 136.5 -25.6C193.7 10.5 239.9 65.1 255 129C270.5 65.1 316.7 10.5 373.8 -25.7C338.7 -45 298.3 -56 255 -56zM445.6 31.5C359 73.5 298 168.4 298 278.9V435.5C414.9 415.8 504 314.1 504 191.4C504 130.3 482 74.8 445.6 31.5z" /> + <glyph glyph-name="replyd" + unicode="" + horiz-adv-x="448" d=" M320 -32H128C57.6 -32 0 25.6 0 96V288C0 358.4 57.6 416 128 416H320C390.4 416 448 358.4 448 288V96C448 25.6 390.4 -32 320 -32zM193.4 174.8C187.3 176.8 181.8 177.9 177 177.9C169.8 177.9 163.5 176.0000000000001 158.1 172.3C152.7 168.6 148.5 163.3 145.3 156.5H144.2L140 174.8H112V35.9H148.1V125.6C149.6 131 152.5 135.4 156.8 138.8C161.1 142.1999999999999 166.6 143.9 173 143.9C177.6 143.9 182.8 142.9 188.6 140.8L193.4 174.8zM308.6 71.4C305.4000000000001 69 300.9000000000001 66.6 294.9000000000001 64.3C288.9000000000001 61.9999999999999 282.1 60.8 274.5000000000001 60.8C262.3000000000001 60.8 253.4000000000001 63.8 248.0000000000001 69.6999999999999C242.5000000000001 75.5999999999999 239.5000000000001 84.3999999999999 239.0000000000001 96.0999999999999H322.3000000000001C323.2000000000001 100.8999999999999 323.9000000000001 105.4999999999999 324.4000000000001 109.9999999999999C324.9000000000001 114.3999999999999 325.1000000000001 118.5999999999999 325.1000000000001 122.4999999999999C325.1000000000001 133.1999999999999 323.5000000000001 142.1999999999999 320.4000000000001 149.3999999999999C317.2000000000001 156.5999999999999 313.1000000000001 162.3999999999999 307.9000000000001 166.5999999999999C302.7000000000001 170.8999999999999 296.8000000000001 173.8999999999999 290.1000000000001 175.7999999999999C283.4000000000001 177.5999999999999 276.6000000000001 178.5999999999999 269.5000000000001 178.5999999999999C248.4000000000001 178.5999999999999 232.0000000000001 172.4999999999998 220.3000000000001 160.2999999999999S202.8000000000001 129.7999999999999 202.8000000000001 105.2999999999998C202.8000000000001 82.4999999999998 208.0000000000001 64.5999999999999 218.4000000000001 51.5999999999999C228.8000000000001 38.4999999999998 245.2000000000001 31.9999999999998 267.6000000000001 31.9999999999998C278.3000000000001 31.9999999999998 288.5000000000001 33.4999999999998 298.0000000000001 36.5999999999999C307.5000000000001 39.6999999999999 315.1000000000001 43.3999999999999 320.6000000000001 47.7999999999998L308.6000000000001 71.3999999999999zM286.8 141.7C290.6 136.3 292.1 128.6 291.4000000000001 118.6H239.7000000000001C240.6000000000001 128 243.4000000000001 135.6 247.9000000000001 141.2C252.4000000000001 146.8 259.4000000000001 149.7 268.9000000000001 149.7C277.1 149.8 283.0000000000001 147.1 286.8 141.7zM366.7000000000001 139.2C370.8000000000001 135.3 376.1 133.4 382.8000000000001 133.4C389.8000000000001 133.4 395.4000000000001 135.3 399.5000000000001 139.2S405.6000000000001 148.3 405.6000000000001 154.8S403.6000000000001 166.4 399.5000000000001 170.2C395.4000000000001 174 389.9000000000001 175.9 382.8000000000001 175.9C376.1000000000001 175.9 370.8000000000001 174 366.7000000000001 170.2C362.6 166.4 360.6 161.3 360.6 154.8S362.6 143.1 366.7000000000001 139.2zM366.7000000000001 38.7C370.8000000000001 34.8 376.1 32.9 382.8000000000001 32.9C389.8000000000001 32.9 395.4000000000001 34.8 399.5000000000001 38.7S405.6000000000001 47.8 405.6000000000001 54.3S403.6000000000001 65.9 399.5000000000001 69.7C395.4000000000001 73.5 389.9000000000001 75.4 382.8000000000001 75.4C376.1000000000001 75.4 370.8000000000001 73.5 366.7000000000001 69.7C362.6 65.9 360.6 60.8 360.6 54.3C360.6 47.7 362.6 42.6 366.7000000000001 38.7z" /> + <glyph glyph-name="resolving" + unicode="" + horiz-adv-x="496" d=" M281.2 169.8C327.2 183.1 330.8 193.3 325.2 213.2L314 252.5C307.9 273.4 295.6 280.6 242.9 265.3L54.7 211.2L83.3 112.6L281.2000000000001 169.8zM248.5 440C131.4 440 33.2 359.3 7.2 250.5L229.1 314.4C263.9 324.6 283.3 326.1 308.4 322.6C344.7 316.5 361.1 297.6 369.8 267.4L380.5 229.6C388.7 201.5 381.5 179 357 156C337.6 138.6 325.8 131.5 295.6 122.8L203 96.2L423.4 69.1L433.1 34.9L385 21.6L98.1999999999999 58.9L121.1999999999999 -21.3C158 -43.3 201.5 -56 247.5 -56C384.5 -56 495.9999999999999 55.4 495.9999999999999 192.3C497 328.6 385.5 440 248.5 440zM38.3 59.4L0 191.2C0 142.7 14.3 97.8 38.3 59.4z" /> + <glyph glyph-name="rocketchat" + unicode="" + horiz-adv-x="448" d=" M448 191.8C448 279 348.4 345.1 228.2 345.1C209.4 345.1 190.9 343.5 172.9 340.3C161.8 350.8 148.7 360.3 134.9 367.7000000000001C61.2 403.8 0 368.6 0 368.6S56.9 321.5 47.6 280.3C-4.7 228 -4.9 156.2000000000001 47.6 103.7000000000001C56.9 62.4 0 15.4 0 15.4S61.2 -19.8 134.9 16.2C148.7 23.7 161.8 33.1 172.9 43.6C190.9 40.4 209.4 38.8 228.2 38.8C348.5 38.9 448 104.6 448 191.8zM228.3 67.8C204.6 67.8 182 70.6 161 75.6C139.7 49.8 92.9 13.9 47.4 25.5C62.2 41.5 84.1 68.6 79.4 113.1C52.1 134.5 35.8 161.8 35.8 191.6C35.8 260 122 315.5 228.3 315.5S420.8 260 420.8 191.6C420.8 123.3 334.6 67.8 228.3 67.8zM253.9 191.7000000000001C253.9 177.5000000000001 242.4 165.9 228.3 165.9C214.2 165.9 202.7 177.4 202.7 191.7000000000001C202.7 205.9 214.2 217.5000000000001 228.3 217.5000000000001C242.4 217.5000000000001 253.9 205.9000000000001 253.9 191.7000000000001zM342.8 191.7000000000001C342.8 177.5000000000001 331.4000000000001 165.9 317.2 165.9C303.1 165.9 291.6 177.4 291.6 191.7000000000001C291.6 205.9 303 217.5000000000001 317.2 217.5000000000001C331.3 217.5000000000001 342.8 205.9000000000001 342.8 191.7000000000001zM164.9 191.7000000000001C164.9 177.5000000000001 153.5 165.9 139.3 165.9C125.2 165.9 113.7 177.4 113.7 191.7000000000001C113.7 205.9 125.1 217.5000000000001 139.3 217.5000000000001C153.5 217.5000000000001 164.9 205.9000000000001 164.9 191.7000000000001z" /> + <glyph glyph-name="rockrms" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM405.4 20.5H315.4L203.4 151.8C185.5 172.2 199.5 207.9 230 207.9H305.3L220.7 307.2L136.4 208.3H46.4L193.5 380.8C207.9 399.2 234.8 398.1 248 380.8L405.7 195.7C424.7 172.9 407.7 138.5 378.1 139.6C377.5 139.6 303.9 139.4 303.9 139.4L405.4 20.5z" /> + <glyph glyph-name="safari" + unicode="" + horiz-adv-x="512" d=" M236.9 191.2C236.9 200.3 243.5 208.9 253.2 208.9C262.1 208.9 270.6 202.5 270.6 192.8C270.6 183.7 264.2000000000001 175.1 254.5000000000001 175.1C245.5000000000001 175.1 236.9000000000001 181.8 236.9000000000001 191.2zM504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM477.4 192C477.4 314.3 378.3 413.4 256 413.4S34.6 314.3 34.6 192S133.7 -29.4 256 -29.4S477.4 69.7 477.4 192zM404.9 95.4C404.9 91.8 417.9 85.2 421.2 83.2C393.8 41.7 351.4 11.8 303.3 -0.1L298.9 18.4C298.6 20.9 297 21.2 294.7 21.2C292.8 21.2 291.7 18.4 291.9 17L296.3 -1.8C283 -4.6 269.5 -6 255.9 -6C219.6 -6 183.9 4.2 152.9 23.1C154.5999999999999 25.9 165.0999999999999 41.1 165.0999999999999 43.3C165.0999999999999 45.2 163.4 46.9 161.5 46.9C157.5999999999999 46.9 149.3 30.3 146.8 27.0000000000001C105 54.7 74.8 97.6 63.2 146.6L82.3 150.8C84.5 151.4 85.1 153 85.1 155C85.1 156.9 82.3 158 80.7 157.8L62 153.5C59.5 166.2 58.1 179 58.1 192C58.1 229.1 68.6 265.6 88.3 296.9C91.1 295.2000000000001 104.4 286.1 106.6 286.1C108.5 286.1 110.2 287.5 110.2 289.4C110.2 293.3 95.5 300.7000000000001 92.2 303C120.4 344.2 163.3 373.9 212 384.9L216.2 366.4C216.8 364.2 218.4 363.6 220.4 363.6S223.4 366.4 223.2 368L219 386.3C231.2 388.5 243.6 389.9 256.1 389.9C293.2000000000001 389.9 329.4000000000001 379.4 361 359.7C359.1 356.9 350.2 343.9 350.2 341.7C350.2 339.8 351.6 338.1 353.5 338.1C357.4 338.1 364.8 352.5 366.8 355.8C407.8 328.1 437.1 285.8 448.5 237.6L433 234.3C430.5 233.7 430.2 232.1 430.2 229.9C430.2 228 433 226.9 434.4 227.1L450.2 230.7C452.7 218 454.1 205 454.1 192C454.1 155.7 444.1 120 425.3 89.3C422.5 90.7 410.9 99 408.7 99C406.5999999999999 99 404.8999999999999 97.3 404.8999999999999 95.4zM371.7 337.6C358.7 325.4 237.5 213.9 234.1 208.1L137.5 47.6C150.2 59.4999999999999 271.7 171.6 274.8 176.9L371.7000000000001 337.6z" /> + <glyph glyph-name="sass" + unicode="" + horiz-adv-x="640.4" d=" M551.1 156.1C528.7 156 509.3 150.6 493.1 142.6C487.2 154.5 481.1 164.9 480.1 172.7000000000001C478.9 181.8000000000001 477.6 187.2000000000001 479 198.0000000000001S486.7 224.1000000000001 486.6 225.2000000000001C486.5 226.3000000000001 485.2 231.8000000000001 472.3 231.9000000000001C459.4 232.0000000000001 448.3 229.4000000000001 447 226.0000000000001C445.7 222.6 443.2 214.9 441.7 206.9C439.4 195.2000000000001 415.9 153.4 402.6 131.6C398.2 140.1 394.5 147.6 393.7 153.6C392.5 162.7000000000001 391.2 168.1 392.6 178.9S400.3 205 400.2 206.1C400.1 207.2 398.8 212.7 385.9 212.8C373 212.9 361.9 210.3 360.6 206.9C359.3 203.5 357.9 195.5 355.3 187.8C352.7 180.1 321.4 110.5 313.2 92.4C309 83.2 305.3999999999999 75.8 302.8 70.8S302.6 70.4999999999999 302.4 69.9C300.2 65.6 298.9 63.2 298.9 63.2V63.1C297.2 59.9 295.3 56.9999999999999 294.4 56.9999999999999C293.8 56.9999999999999 292.5 65.3999999999999 294.7 76.8999999999999C299.4 101.0999999999999 310.5 138.6999999999999 310.4 140C310.3 140.6999999999999 312.5 147.1999999999999 303.1 150.6999999999999C294 154 290.7 148.5 289.9 148.5C289.1 148.5 288.5 146.5 288.5 146.5S298.6 188.8999999999999 269.1 188.8999999999999C250.7 188.8999999999999 225.1 168.6999999999999 212.5 150.3999999999999C204.6 146.0999999999999 187.5 136.7999999999999 169.5 126.8999999999999C162.6 123.0999999999999 155.5 119.1999999999999 148.8000000000001 115.5C148.3000000000001 116 147.9 116.5 147.4 117C111.6 155.1999999999999 45.5 182.1999999999999 48.3 233.5C49.3 252.2 55.8 301.3 175.4 360.9C273.4000000000001 409.7 351.8000000000001 396.3 365.3000000000001 366.5C384.7000000000001 324 323.4000000000001 244.9 221.6000000000001 233.5C182.8000000000001 229.2 162.4000000000001 244.2 157.3000000000001 249.8C152.0000000000001 255.7 151.2000000000001 256 149.2000000000001 254.9C145.9000000000001 253.1 148.0000000000001 247.9 149.2000000000001 244.8C152.2000000000001 236.9 164.7000000000001 222.9 186.0000000000001 215.9C204.7000000000001 209.8 250.2000000000001 206.4 305.2000000000001 227.7C367 251.5 415.1 317.8 401 373.3C386.6 429.7 293.1 448.2 204.6 416.8C151.9 398.1 94.9 368.7 53.9 330.4C5.2 284.8 -2.6 245.1 0.6 228.5C12 169.6 93.2 131.2 125.7 102.8C124.1 101.9 122.6 101.1 121.2 100.3C104.9 92.2 43 59.8 27.5 25.6C10 -13.2 30.4 -41 43.8 -44.8C85.6 -56.4 128.4 -35.4999999999999 151.4 -1.1999999999999S171.6 77.9000000000001 161 98.3000000000001C160.9 98.6000000000001 160.7 98.8000000000001 160.6 99.1000000000001C164.8 101.6000000000001 169.1 104.1000000000001 173.4 106.6000000000001C181.7 111.5000000000001 189.8 116.0000000000001 196.9 119.9000000000001C192.9 109.1000000000001 190 96.1000000000001 188.5 77.3000000000001C186.7 55.3000000000001 195.8 26.8000000000001 207.6 15.6000000000001C212.8 10.7000000000001 219.1 10.6000000000001 223 10.6000000000001C236.8 10.6000000000001 243 22.0000000000001 249.9 35.6000000000001C258.4 52.2000000000001 265.9 71.5000000000001 265.9 71.5000000000001S256.5 19.3000000000001 282.2 19.3000000000001C291.6 19.3000000000001 301 31.4000000000001 305.2 37.6000000000001V37.5000000000001S305.4 37.9 305.9 38.7C306.9 40.2 307.4 41.1 307.4 41.1V41.4C311.2 47.9 319.5 62.8 332 87.4C348.2 119.2000000000001 363.7 158.9 363.7 158.9S365.1 149.2000000000001 369.9 133.1C372.7 123.6 378.6 113.2000000000001 383.3 103.1C379.5 97.9 377.2 94.9 377.2 94.9S377.2 94.8 377.3 94.7000000000001C374.3 90.7000000000001 370.9 86.4 367.4 82.2000000000001C354.6 67.0000000000001 339.4 49.6 337.4 44.6C335 38.7 335.6 34.3 340.2 30.9C343.6 28.3 349.6 27.9 355.9 28.4C367.4 29.2 375.5 32.0000000000001 379.4 33.8C385.6 36 392.8 39.5 399.6 44.4C412.1 53.6 419.7 66.8 419 84.2000000000001C418.6 93.8000000000001 415.5 103.4 411.7 112.4C412.8 114.0000000000001 414 115.7000000000001 415.0999999999999 117.4C434.8999999999999 146.3 450.2 178.0000000000001 450.2 178.0000000000001S451.5999999999999 168.3000000000001 456.3999999999999 152.2000000000001C458.7999999999999 144.1 463.4999999999999 135.2000000000001 467.7999999999999 126.5000000000001C449.1999999999999 111.4 437.6999999999999 93.9 433.6999999999999 82.4C426.2999999999999 61.1 432.0999999999999 51.5000000000001 442.9999999999999 49.3C447.8999999999999 48.3 454.8999999999999 50.6 460.0999999999999 52.8C466.5999999999999 55 474.3999999999999 58.5 481.6999999999999 63.9C494.1999999999999 73.1 506.3 86.0000000000001 505.4999999999999 103.5000000000001C505.1999999999999 111.4 502.9999999999999 119.3000000000001 500.1 126.9C515.8 133.5000000000001 536.1999999999999 137.1 562.1999999999999 134.1C617.9 127.6 628.8 92.8 626.6999999999999 78.3C624.5999999999999 63.7 612.9 55.7 608.9999999999999 53.3C605.0999999999999 50.9 603.8999999999999 50 604.1999999999999 48.2C604.6999999999999 45.6 606.4999999999999 45.7 609.8 46.3C614.4 47.1 639 58.1 640.0999999999999 85C641.6999999999999 119 608.9999999999999 156.4 551.0999999999999 156.1zM121.8 11.4C103.4 -8.7 77.6 -16.3 66.5 -9.9C54.6 -3 59.3 26.6 82 48C95.8 61 113.6 73 125.4 80.4C128.1 82 132 84.4 136.8 87.3C137.6 87.8 138 87.9999999999999 138 87.9999999999999C138.9 88.6 139.9 89.1 140.9 89.6999999999999C149.2 59.3 141.2 32.4999999999999 121.8 11.3999999999999zM256.2 102.8C249.8 87.1 236.3 47.1 228.1 49.1999999999999C221.1 50.9999999999999 216.8 81.4999999999999 226.7 111.4999999999999C231.7 126.6 242.3 144.6 248.6 151.6C258.7 162.9 269.8 166.5 272.4 162C275.9 156.1 260.2 112.6 256.2 102.8zM367.2 49.8C364.5 48.4 362 47.4999999999999 360.8 48.1999999999999C359.9000000000001 48.6999999999999 361.9000000000001 50.5999999999999 361.9000000000001 50.5999999999999S375.8 65.4999999999999 381.3 72.2999999999999C384.5 76.2999999999999 388.2 80.9999999999999 392.2 86.1999999999999C392.2 85.6999999999999 392.3 85.1999999999999 392.3 84.5999999999999C392.2 66.6999999999999 375 54.5999999999999 367.2 49.7999999999998zM452.8 69.3C450.8 70.6999999999999 451.1 75.4 457.8 89.9999999999999C460.4 95.6999999999999 466.4 105.3 476.8 114.5C477.9999999999999 110.6999999999999 478.6999999999999 107.1 478.6999999999999 103.6999999999999C478.5999999999999 81.1999999999999 462.4999999999999 72.8 452.8 69.3z" /> + <glyph glyph-name="schlix" + unicode="" + horiz-adv-x="448" d=" M350.5 290.3L296.3 336.4L369.7000000000001 375.4L448.0000000000001 331.2L350.5000000000001 290.3zM192 325.9L237.7 354.1L272.4 319.5L217 290.5L192 325.9zM126.9 319.3L158.8 341.4L176 313L139.3 290.5L126.9 319.3zM103.6 231.1L94.8 265.9000000000001L124.4 284.2000000000001L137.5 248.9000000000001L103.6 231.1zM82.4 314.8L106.3 332.9L115.2 308.9L88.5 290.6L82.4 314.8zM59 241.5L55.4 269.9L77.7 285.4L83.8 256.7000000000001L59 241.5zM28.4 224.9L49.2 237.7L52.5 204.3L29.6 192.3L28.4 224.9zM1.4 180L20.6 190.2L21 152L0 143.2L1.4 180zM60.5 120.7L32.2 112.4L30.6 159.2L55.7 169.9L60.5 120.7zM99 184.8L67.9 171.8L62.7 212.6L90.1 227L99 184.8zM123.2 71L81.6 65.1L73.5 128.6L108.7 139.4L123.2 71zM151.7 210.9L172.9 153.8L126.7 140.2L113 194.3L151.7 210.9zM237.4 -19.6L166.5 -16.3L142.2 79.5L197.4 88.1L237.4 -19.6zM152.5 260.1L194.7 282.5L222.7 236.6L171.9 215.3L152.5 260.1zM193.5 165.1999999999999L254.8 183.8999999999999L307.6 97.3L227.8 85.9999999999999L193.5 165.1999999999999zM244.9 250.8L312.2 279.5999999999999L377.7 214.1999999999999L289.1 188L244.9000000000001 250.8z" /> + <glyph glyph-name="scribd" + unicode="" + horiz-adv-x="384" d=" M42.3 195.3C26.2 214.3 17.6 241.2 17.5 275.2000000000001C17.5 375.6 92.7 428.3 184.7 428.3C283.3 429.9000000000001 341.5 379.3 369 357.7000000000001L318.5 285.6L281.2 310.2000000000001L308.1 348.8C271.6 372.8 228.7 385.3 185.1 384.6C134.4 385.4 73.4 357.4 73.4 308.4C73.4 289.7000000000001 84.6 287.7000000000001 102 292.8C125.3 298.1 143.9 292.2000000000001 157.8 278.8C184.2 254.5 181 211.2 157.1 186.9C127.9 157.4 71.9 159.6 42.3 195.3zM360 189.4C344.5 208.2000000000001 321.1 218.8000000000001 296.8 218C258.7 220 225.7 190 226.3 150.8C225.6 134 232.3 117.8 244.7 106.5C258.8 92.6 277.7000000000001 86.8 301 92.1C318.4 97.2000000000001 329.6 95.2000000000001 329.6 76.5C329.6 72.2 329.1 68 328.2000000000001 63.8C311.5000000000001 22.9 268.7000000000001 -0.6 206.8000000000001 -0.6C154.9 -0.8 104.4 15.8 62.7000000000001 46.7L96.4000000000001 86.1L60.8000000000001 113.5L0 41.7L15.4 27.9C67.9 -18.9 135.8 -44.6 206.1 -44.3C257.5 -44.3 300.5 -33.8 339.7 -0.2C396.8 51.2 393.9 149 360 189.4z" /> + <glyph glyph-name="searchengin" + unicode="" + horiz-adv-x="460" d=" M220.6 317.7L153.4 289.5V404.8L98.7 214.5L153.4 238.7V108.4L220.6 317.7zM137.4 414.4L136.1 409.7L120.9 356.8C80.6 341.3 52 302.2 52 256.5C52 204.2 86.3 160.6 135.4 151V97.4C57.5 107.9 0 175.6 0 256.4C0 336.9 59.8 403.6 137.4 414.4zM448.8 -32.8C437.6 -44 425.7 -45.1 420.2 -43.3C414.8 -41.5 393.0999999999999 -23.4 359.8 1.1C326.5 25.7 326.2 36.8 316.8 57.8C307.4 78.6999999999999 286.4 100.4 259.3 110.1999999999999L249.6 124.8999999999999C224.9 107.9999999999999 196.6 97.9999999999999 168.3 96.1999999999999L170.4 102.8L186.3 152.3C232.8 164.1999999999999 267.2 206.3 267.2 256.5C267.2 311 228.8 358.5999999999999 171.1999999999999 363.5999999999999V415.7C254.4 410.6 320 341.2 320 256.4C320 222.8 308.8 191.7 291 166L305.6 156.4C315.4000000000001 129.3 337.1 108.4 358 99S390.2 89.3 414.8 56C439.4000000000001 22.8 457.5 1.1 459.3 -4.3S460 -21.6 448.8 -32.8zM438.9 -14.9C438.9 -10.5000000000001 435.3 -6.9 430.9 -6.9S422.9 -10.5000000000001 422.9 -14.9S426.5 -22.9 430.9 -22.9S438.9 -19.3 438.9 -14.9z" /> + <glyph glyph-name="sellcast" + unicode="" + horiz-adv-x="448" d=" M353.4 416H94.7C42.6 416 0 373.4 0 321.4V62.7000000000001C0 10.6 42.6 -32 94.7 -32H353.4C405.5 -32 448.1 10.6 448.1 62.6V321.4C448.1 373.4 405.5 416 353.4 416zM303.4 99.6C275.5 51.4 213.5 34.7 165.2 62.4C142.3 22.6 110.3 53.8 122.9 75.6L138.6 102.8C144.5 113.1 157.8 116.7 168.1 110.7C186.7 99.9 168 110.8 186.6 100C214.2 84.1 250 93.7 266 121.3C281.9 148.9 272.3 184.7 244.7 200.7C226.9 210.9 244.1 201.1 226.1 211.3C201.5 225.5 222.7 263.2000000000001 247.7 248.8C266.3 238 247.6 248.9 266.2 238.1C314.6 210.1 331.3 147.8 303.4 99.6zM325.2 308.4000000000001C308.2 278.9000000000001 308.9 279.6 306.2 276.9000000000001C299.7 270.4000000000001 289.9 268.2000000000001 279.7 273.3000000000001C261.1 284.1 279.8 273.2000000000001 261.2 284C233.6 299.9000000000001 197.8 290.3000000000001 181.8 262.7000000000001S175.5 199.3 203.1 183.3C203.1 183.3 221.6 172.7 221.7 172.7C246.3 158.5 225.1 120.8 200.1 135.2C181.5 146 200.2 135.1 181.6 145.9C133.4 173.7 116.7 236 144.5 284.3C172.4 332.5 234.4 349.2 282.7 321.5L287.5 329.9C301.8 354.8 339.5 333.2 325.2 308.4z" /> + <glyph glyph-name="sellsy" + unicode="" + horiz-adv-x="640" d=" M539.71 210.692C542.774 222.949 544 235.513 544 248.076C544 340.618 468.618 416 376.076 416C298.856 416 231.4420000000001 362.988 213.056 288.219C197.734 301.395 178.122 308.749 157.899 308.749C111.628 308.749 73.937 271.059 73.937 224.788C73.937 217.434 74.857 209.773 77.002 202.419C34.102 182.194 6.217 138.6810000000001 6.217 91.185C6.216 23.157 61.68 -32 129.401 -32H510.599C578.319 -32 633.783 23.157 633.783 91.184C633.784 147.568 594.867 197.209 539.71 210.692zM199.88 46.446C199.88 38.172 192.832 31.125 184.559 31.125H153.61C145.336 31.125 138.289 38.173 138.289 46.446V157.374C138.289 165.6470000000001 145.337 172.6950000000001 153.61 172.6950000000001H184.559C192.833 172.6950000000001 199.88 165.6470000000001 199.88 157.374V46.446zM289.357 46.446C289.357 38.172 282.309 31.125 274.035 31.125H243.086C234.812 31.125 227.765 38.173 227.765 46.446V177.904C227.765 186.178 234.813 193.225 243.086 193.225H274.035C282.309 193.225 289.357 186.177 289.357 177.904V46.446zM378.834 46.446C378.834 38.172 371.7869999999999 31.125 363.5129999999999 31.125H332.5639999999999C324.2899999999999 31.125 317.2419999999999 38.173 317.2419999999999 46.446V209.16C317.2419999999999 217.434 324.2899999999999 224.481 332.5639999999999 224.481H363.5129999999999C371.7869999999999 224.481 378.834 217.433 378.834 209.16V46.446zM465.8609999999999 46.446C465.8609999999999 38.172 458.8129999999999 31.125 450.5389999999999 31.125H422.0419999999999C413.7679999999999 31.125 406.7209999999999 38.173 406.7209999999999 46.446V271.059C406.7209999999999 279.6380000000001 413.7679999999999 286.687 422.0419999999999 286.687H450.5389999999999C458.8129999999999 286.687 465.8609999999999 279.639 465.8609999999999 271.0590000000001V46.446z" /> + <glyph glyph-name="servicestack" + unicode="" + horiz-adv-x="496" d=" M88 232C169.7 221.8 361.7 129.7 392 0H0C99.5 8.1 184.5 137 88 232zM120 384C152.3 348.4 167.7 300.1 166.4 250.4C249.3 216.7 373.7 126.7 400 0H496C455.3 216.1 222.8 368.5 120 384z" /> + <glyph glyph-name="shirtsinbulk" + unicode="" + horiz-adv-x="448" d=" M395.2080000000001 226.417H406V192.875H395.2080000000001V226.417zM395.2080000000001 236.042H406V269.584H395.2080000000001V236.042zM395.2080000000001 149.709H406V183.25H395.2080000000001V149.709zM358.75 312.75H325.208V302.25H358.75V312.75zM395.208 106.542H406V140.0840000000001H395.2080000000001V106.542zM311.5 312.75H277.958V302.25H311.5V312.75zM264.25 312.75H231V302.25H264.25V312.75zM217 312.75H183.75V302.25H217V312.75zM395.208 279.208H406V312.75H372.458V302.25H395.208V279.208zM139.416 20.208L170.041 6.791L174.416 16.708L143.791 30.1249999999999L139.416 20.208zM179.083 3L209.417 -10.708L213.791 -0.792L183.458 12.6249999999999L179.083 2.9999999999999zM395.208 63.375H406V96.917H395.2080000000001V63.375zM60.3749999999999 55.208L91 41.792L95.375 51.416L64.75 65.125L60.375 55.208zM100.0409999999999 37.709L130.666 24.292L135.041 34.209L104.4159999999999 47.625L100.0409999999999 37.709zM232.458 -0.792L236.833 -10.708L267.459 3L263.084 12.625L232.458 -0.792zM350.875 51.4160000000001L355.25 41.792L385.874 55.208L381.5 65.125L350.875 51.416zM311.5 34.209L315.875 24.292L346.5 37.709L342.126 47.625L311.5 34.209zM271.833 16.708L276.208 6.7910000000001L306.833 20.208L302.458 30.125L271.833 16.708zM311.5 401.4170000000001H277.958V390.9170000000001H311.5V401.4170000000001zM405.709 401.4170000000001H372.4580000000001V390.9170000000001H405.709V401.4170000000001zM217 401.4170000000001H183.75V390.9170000000001H217V401.4170000000001zM358.75 401.4170000000001H325.208V390.9170000000001H358.75V401.4170000000001zM264.25 401.4170000000001H231V390.9170000000001H264.25V401.4170000000001zM448 444.292V38.292L221.666 -60.292L0 38.292V444.292H448zM418.834 327.334H29.166V57.25L221.958 -28.5L418.833 57.25V327.334zM418.834 415.125H29.166V356.5H418.833V415.125zM75.542 401.4170000000001H42.291V390.9170000000001H75.542V401.4170000000001zM170.042 401.4170000000001H136.5V390.9170000000001H170.042V401.4170000000001zM122.791 401.4170000000001H89.25V390.9170000000001H122.792V401.4170000000001zM130.375 164.875C130.375 215.042 171.5 256.1670000000001 221.667 256.1670000000001C272.125 256.1670000000001 312.959 215.042 312.959 164.875C312.959 114.417 272.126 73.583 221.667 73.583C171.5 73.584 130.375 114.417 130.375 164.875zM251.125 146.791C251.125 133.666 227.208 132.5 218.459 132.5C206.209 132.5 188.709 135.125 182.584 147.375H181.709L172.666 129C187.542 119.667 201.833 116.75 219.916 116.75C239.458 116.75 270.958 122.583 270.958 147.959C270.958 196.084 192.5 164.292 192.5 185.875C192.5 199 213.208 200.75 222.25 200.75C233.041 200.75 251.416 197.542 257.833 187.626H258.708L267.459 204.542C252.292 210.667 240.042 216.501 223.125 216.501C203 216.501 173.542 210.084 173.542 184.709C173.542 140.375 251.125 172.75 251.125 146.791zM122.791 312.75H89.25V302.25H122.792V312.75zM52.792 302.25H75.542V312.75H42V279.208H52.792V302.25zM52.792 269.584H42V236.042H52.792V269.584zM170.042 312.75H136.5V302.25H170.042V312.75zM52.792 226.417H42V192.875H52.792V226.417zM52.792 140.083H42V106.5409999999999H52.792V140.083zM52.792 183.25H42V149.708H52.792V183.25zM52.792 96.917H42V63.375H52.792V96.917z" /> + <glyph glyph-name="simplybuilt" + unicode="" + horiz-adv-x="512" d=" M481.2 384H375.2C360.7 384 348.6 372.2 348.6 357.7V318.1H163.3V357.7C163.3 372.2 151.3 384 136.7 384H30.7C16.1 384 4.3 372.2 4.3 357.7V26.3C4.3 11.8 16.1 0 30.9 0H481.3C496.1 0 507.9 11.8 507.9 26.3V357.7C507.7 372.2 495.9 384 481.2 384zM149.8 92.2C113.2 92.2 83.4 121.9 83.4 158.6C83.4 195.5 113.1 225.2 149.8 225.2C186.7 225.2 216.4 195.5 216.4 158.6C216.4 121.9 186.7 92.2000000000001 149.8 92.2000000000001zM362.2000000000001 92.2C325.3000000000001 92.2 295.6 121.9 295.6 158.8C295.6 195.4 325.3 225.2 362.2000000000001 225.2C398.8000000000001 225.2 428.6 195.5 428.6 158.8C428.6 121.9 398.8 92.1999999999999 362.2000000000001 92.1999999999999z" /> + <glyph glyph-name="sistrix" + unicode="" + horiz-adv-x="448" d=" M448 -1L301.2 147.8C321.2 175.7 333.1 210 333.1 247C333.1 340.1 258.4 415.9 166.6 415.9C74.7 416 0 340.2 0 247.1S74.7 78.2 166.5 78.2C206.3 78.2 242.8 92.4 271.5 116.1L417.5 -32L448 -1zM166.5 117.2C95.9 117.2 38.4 175.5 38.4 247.1S95.9 377 166.5 377S294.6 318.7 294.6 247.1S237.2 117.2 166.5 117.2z" /> + <glyph glyph-name="skyatlas" + unicode="" + horiz-adv-x="640" d=" M640 118.7C640 52.8 587.5 4.3 522.5 4.3C356.6 4.3 325.9 254 162.8 254C15.9 254 15.7 41.8 168.4 41.8C210.9 41.8 259.3 59.6 293.7 84.3C299.3 88.4 310.6 100.6 316.5 100.6S327.4 95.6 327.4 89.7C327.4 81.9 314.3 70.6 308.7 65.6C267.8 29.9999999999999 208.4 4.4 154 4.4C70.6 4.3 0 63.4 0 149.3S67.5 298.4 152.8 298.4C338.1 298.4 375.3 52.4999999999999 514.7 52.4999999999999C614.6 52.4999999999999 609.5 192.1999999999999 518.1 192.1999999999999C500.6 192.1999999999999 483.1 180.5999999999999 471.2 180.5999999999999C462.8000000000001 180.5999999999999 455.3000000000001 187.7999999999999 455.3000000000001 196.1999999999999C455.3000000000001 207.7999999999999 460.6000000000001 219.8999999999999 460.6000000000001 232.4999999999999C460.6000000000001 299.0999999999999 409.7000000000001 347.1999999999999 343.7000000000001 347.1999999999999C290.6 347.1999999999999 263.7000000000001 310.2999999999999 254.9000000000001 310.2999999999999C248.7000000000001 310.2999999999999 243.7000000000001 315.2999999999999 243.7000000000001 321.4999999999999C243.7000000000001 327.0999999999999 247.8000000000001 331.7999999999999 251.5000000000001 335.8999999999999C276.8000000000001 364.7 316.2000000000001 379.5999999999999 354.3000000000001 379.5999999999999C433.7000000000001 379.5999999999999 493.4000000000001 321.2 493.4000000000001 241.7999999999999C493.4000000000001 234.8999999999999 493.1000000000001 228.0999999999999 492.2000000000001 221.1999999999999C504.1000000000001 224.2999999999999 516.3000000000001 225.8999999999999 528.1000000000001 225.8999999999999C588.8000000000002 225.8999999999999 640.0000000000001 180.5999999999999 640.0000000000001 118.6999999999999z" /> + <glyph glyph-name="skype" + unicode="" + horiz-adv-x="448" d=" M424.7 148.2C427.6 162.2 429.4 177.1 429.4 192C429.4 305.5 337.5 397.3 224.1 397.3C209.2 397.3 194.4 395.6 180.3 392.6C161.3 407.3 137.7 416 112 416C50.2 416 0 365.8 0 304C0 278.3 8.7 254.7 23.3 235.8C20.4 221.8 18.6 206.9 18.6 192C18.6 78.5 110.5 -13.3 223.9 -13.3C238.8 -13.3 253.6 -11.6 267.7 -8.6C286.7 -23.2 310.3 -31.9 335.9 -31.9C397.7 -31.9 447.9 18.3 447.9 80.1C448 105.7 439.3 129.3 424.7 148.1999999999999zM230.1 56.7C164.5 56.7 109.6 85.9 109.6 121.7C109.6 137.7 118.6 152.3 139.1 152.3C170.3 152.3 173.2 107.4 227.2 107.4C252.9 107.4 269.5 118.8 269.5 133.7000000000001C269.5 152.4 253.5 155.3000000000001 227.5 161.7000000000001C165 177.1 109.7 183.7000000000001 109.7 248.9000000000001C109.7 308.1 168.3 330 218.8 330C273.9000000000001 330 329.6 308.1 329.6 274.6C329.6 257.7000000000001 318.2000000000001 242.8 299.3 242.8C271 242.8 270.1 276.3 224.3 276.3C198.6 276.3 182.3 269.3 182.3 253.8C182.3 234 203.1 232 251.4 220.8C292.8 211.5 342.1 194 342.1 143.2000000000001C342.1 84.1 285 56.7000000000001 230.1 56.7000000000001z" /> + <glyph glyph-name="slack-hash" + unicode="" + horiz-adv-x="448" d=" M446.2 177.6C440 196.6 419.3 206.7 400.2 200.5L354.8 185.4L324.5 275.4000000000001L369.9 290.5C389 296.7000000000001 399 317.3000000000001 392.9 336.4000000000001C386.7 355.4000000000001 366 365.5 346.9 359.3000000000001L301.5 344.2000000000001L285.8 391.2000000000001C279.6 410.2000000000001 258.9000000000001 420.3000000000001 239.8 414.1C220.7 407.9000000000001 210.7 387.3000000000001 216.8 368.2000000000001L232.5 321.2000000000001L139.1 290.0000000000001L123.4 337.0000000000001C117.2 356.0000000000001 96.5 366.1 77.4 359.9000000000001C58.3 353.7000000000001 48.3 333.1000000000001 54.4 314.0000000000001L70.1 267.0000000000001L24.8 252.0000000000001C5.7 245.8000000000001 -4.3 225.2000000000001 1.8 206.1000000000001C6.8 191.6 20.9 182.1 35.4 181.5000000000001C42.2 180.5000000000001 47.4 183.1000000000001 93.1 198.3000000000001L123.4 108.3000000000001L78 93.2C59 87 48.9 66.3 55 47.3C60 32.8 74.1 23.3 88.6 22.7C95.4 21.7 100.6 24.3 146.3 39.5L162 -7.5C167.9 -24.4 186.7 -36.5 208 -30.4C227.1 -24.2 237.1 -3.6 231 15.5L215.3 62.5L308.9 93.8L324.6 46.8C330.5 29.9 349.3 17.8 370.6 23.9C389.7 30.1 399.7 50.7 393.6 69.8L377.9 116.8L423.3 131.9C442.3 137.9 452.4 158.6 446.2 177.6zM192.1 130.4L161.8 220.6L255.3 251.9000000000001L285.6 161.7000000000001L192.1 130.4z" /> + <glyph glyph-name="slack" + unicode="" + horiz-adv-x="448" d=" M244.2 230.5L263.5 172.8L203.7 152.8L184.4 210.5L244.2 230.5zM285.6 -13.2C131.6 -59.4 65 -23.6 18.8 130.4S8.4 351 162.4 397.2C316.4 443.4 383 407.6 429.2 253.6C475.4 99.6 439.6 33 285.6 -13.2zM366.2 183C362.3 195.2 349 201.6 336.8 197.7L307.8 188L288.5 245.7L317.5 255.4C329.7 259.3 336.1 272.6 332.2 284.8C328.3 297 315 303.4 302.8 299.5L273.8 289.8L263.8 319.9C259.9000000000001 332.1 246.6 338.5 234.4 334.6C222.2 330.7 215.8 317.4 219.7 305.2L229.7 275.1L169.9 255L159.9 285.1C156 297.3 142.7000000000001 303.7 130.5 299.8C118.3 295.9 111.9 282.6 115.8 270.4L125.8 240.3L96.8 230.6C84.6 226.7 78.2 213.4 82.1 201.2C85.3 191.9 94.3 185.8 103.6 185.4C107.9 184.8 111.3 186.4 140.5 196.1L159.8000000000001 138.4L130.8000000000001 128.7C118.6 124.8 112.2000000000001 111.5 116.1 99.3C119.3000000000001 90 128.3000000000001 83.9 137.6 83.5C141.9 82.9 145.3 84.5 174.5 94.2L184.5 64.1C188.2 53.3 200.3000000000001 45.4999999999999 213.9 49.4C226.1 53.3 232.5000000000001 66.6 228.6 78.8L218.6 108.9L278.4000000000001 129L288.4000000000001 98.9C292.1 88.1 304.2000000000001 80.3 317.8 84.2C330 88.1 336.4000000000001 101.4 332.5 113.6L322.5 143.7L351.5 153.4C363.7 157.6 370.1 170.9 366.2 183z" /> + <glyph glyph-name="slideshare" + unicode="" + horiz-adv-x="512" d=" M249.429 236.564C249.429 204.848 221.714 178.847 187.712 178.847C153.711 178.847 125.996 204.848 125.996 236.564C125.996 268.565 153.711 294.28 187.712 294.28C221.713 294.28 249.429 268.565 249.429 236.564zM503.723 186.562C485.437 163.989 450.579 136.274 397.4340000000001 114.559C453.722 -77.163 260 -107.735 263.143 -9.446C263.143 -11.16 262.857 43.413 262.857 83.986C258.572 84.844 254.286 85.986 249.143 87.129C249.143 46.271 248.857 -11.16 248.857 -9.446C252 -107.735 58.278 -77.163 114.566 114.559C61.421 136.274 26.563 163.989 8.276 186.562C-0.867 200.276 9.134 214.849 24.277 204.277C26.277 202.849 28.562 201.42 30.562 199.992V398.284C30.563 425.713 51.135 448 76.565 448H435.722C461.151 448 481.724 425.713 481.724 398.284V199.991L487.724 204.276C502.867 214.849 512.867 200.276 503.723 186.562zM457.151 375.712C457.151 408.57 446.579 421.428 416.2920000000001 421.428H98.566C66.85 421.428 57.993 410.5700000000001 57.993 375.712V183.419C125.71 147.989 183.713 154.275 215.428 155.418C228.857 155.704 237.429 153.132 242.572 147.703C244.261 146.016 252.595 138.257 262.859 130.5600000000001C264.002 146.275 272.86 156.275 296.575 155.4180000000001C328.862 153.9900000000001 388.293 147.7030000000001 457.152 185.1340000000001V375.712zM331.146 294.28C297.144 294.28 269.43 268.565 269.43 236.564C269.43 204.848 297.145 178.847 331.146 178.847C365.433 178.847 392.862 204.848 392.862 236.564C392.862 268.565 365.4330000000001 294.28 331.146 294.28z" /> + <glyph glyph-name="snapchat-ghost" + unicode="" + horiz-adv-x="512" d=" M510.846 55.327C505.635 43.17 483.607 34.238 443.486 28.009C441.422 25.223 439.711 13.323 436.979 4.053C435.354 -1.513 431.356 -4.816 424.851 -4.816L424.554 -4.811C415.159 -4.811 405.351 -0.4880000000001 385.702 -0.4880000000001C359.181 -0.4880000000001 350.04 -6.5310000000001 329.448 -21.0760000000001C307.616 -36.5140000000001 286.677 -49.8400000000001 255.421 -48.4750000000001C223.775 -50.8090000000001 197.396 -31.5670000000001 182.55 -21.0710000000001C161.836 -6.4280000000001 152.722 -0.4890000000001 126.309 -0.4890000000001C107.445 -0.4890000000001 95.573 -5.2090000000001 87.457 -5.2090000000001C79.384 -5.2090000000001 76.244 -0.2870000000001 75.035 3.8309999999999C72.332 13.0199999999999 70.631 25.0939999999999 68.512 27.9609999999999C47.833 31.1699999999999 1.202 39.3049999999999 0.014 60.1109999999999A10.627 10.627 0 0 0 8.891 71.1799999999999C78.474 82.6349999999999 109.815 154.0809999999999 111.118 157.1139999999999C111.192 157.2899999999999 111.273 157.4579999999999 111.355 157.6289999999999C115.068 165.1659999999999 115.899 171.4779999999999 113.818 176.3819999999999C108.768 188.2779999999999 86.946 192.5459999999999 77.765 196.1779999999999C54.05 205.5439999999999 50.75 216.3059999999999 52.153 223.6819999999999C54.59 236.5179999999999 73.878 244.4169999999999 85.155 239.1349999999999C94.074 234.9539999999999 101.998 232.8379999999999 108.702 232.8379999999999C113.724 232.8379999999999 116.914 234.0419999999999 118.662 235.0089999999999C116.619 270.9449999999999 111.561 322.2989999999999 124.349 350.9779999999999C158.122 426.6960000000001 229.705 432.58 250.826 432.58C251.77 432.58 259.967 432.669 260.936 432.669C313.084 432.669 363.19 405.889 387.659 351.026C400.436 322.376 395.408 271.234 393.354 235.017C394.936 234.145 397.711 233.075 401.953 232.878C408.35 233.164 415.768 235.267 424.022 239.135C430.107 241.981 438.428 241.596 444.502 239.077L444.531 239.067C454.007 235.682 459.97 228.852 460.12 221.197C460.304 211.45 451.598 203.032 434.242 196.179C432.124 195.344 429.548 194.524 426.808 193.654C417.011 190.548 402.208 185.849 398.192 176.383C396.113 171.479 396.9360000000001 165.172 400.652 157.635C400.739 157.467 400.818 157.293 400.891 157.12C402.192 154.09 433.506 82.66 503.121 71.186C509.548 70.128 514.284 63.309 510.846 55.3270000000001z" /> + <glyph glyph-name="snapchat-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM393.5 101.1C390 93 375.4 87.1 348.7 82.9C347.3 81.0000000000001 346.2 73.1 344.4 67.0000000000001C343.3 63.3000000000001 340.7 61.1000000000001 336.3 61.1000000000001H336.1C329.9 61.1000000000001 323.3 64.0000000000001 310.3 64.0000000000001C292.7 64.0000000000001 286.6 60.0000000000001 272.9 50.3000000000001C258.4 40.0000000000001 244.5 31.2 223.7 32.1000000000001C202.7 30.5000000000001 185.1 43.3000000000001 175.2 50.3000000000001C161.4 60.0000000000001 155.4 64.0000000000001 137.8 64.0000000000001C125.3 64.0000000000001 117.4 60.9 112 60.9C106.6 60.9 104.5 64.2000000000001 103.7 66.9C101.9 73.0000000000001 100.8 81.0000000000001 99.4 82.9C85.6 85.0000000000001 54.6 90.4 53.9 104.3C53.7 107.9 56.2 111.1 59.8 111.7C106.1 119.3 126.9 166.8 127.8 168.8C127.8 168.9 127.9 169 128 169.1C130.5 174.1 131 178.3 129.6 181.6C126.2 189.5 111.7 192.3 105.6 194.8C89.8 201 87.6 208.2 88.6 213.1C90.2 221.6 103 226.9000000000001 110.5 223.4C116.4 220.6 121.7 219.2000000000001 126.2 219.2000000000001C129.5 219.2000000000001 131.7 220.0000000000001 132.8 220.6000000000001C131.4 244.5000000000001 128.1 278.6 136.6 297.7000000000001C159.1 348 206.7 352 220.7 352C221.3 352 226.8 352.1 227.4 352.1C262.1 352.1 295.4 334.3 311.7 297.8C320.2 278.7000000000001 316.9 244.7 315.5 220.7C316.6 220.1 318.4 219.4 321.2 219.3C325.5 219.5 330.4 220.9 335.9 223.5C339.9 225.4 345.5 225.1 349.5 223.5C355.8 221.2 359.8 216.7 359.9 211.6C360 205.1 354.2 199.5 342.7 195C341.3 194.4 339.6 193.9 337.8 193.3C331.3 191.2 321.4000000000001 188.1 318.8 181.8C317.4000000000001 178.5 318 174.3 320.4000000000001 169.3C320.5000000000001 169.2 320.5000000000001 169.1 320.6 169C321.5 167 342.3 119.5 388.6 111.9C392.6 110.9 395.7000000000001 106.4 393.5 101.1z" /> + <glyph glyph-name="snapchat" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM417.5 101.1C414 93 399.4 87.1 372.7 82.9C371.3 81.0000000000001 370.2 73.1 368.4 67.0000000000001C367.3 63.3000000000001 364.7 61.1000000000001 360.3 61.1000000000001H360.1C353.9 61.1000000000001 347.3 64.0000000000001 334.3 64.0000000000001C316.7 64.0000000000001 310.6 60.0000000000001 296.9 50.3000000000001C282.4 40.0000000000001 268.5 31.2 247.7 32.1000000000001C226.7 30.5000000000001 209.1 43.3000000000001 199.2 50.3000000000001C185.4 60.0000000000001 179.4 64.0000000000001 161.8 64.0000000000001C149.3 64.0000000000001 141.4 60.9 136 60.9C130.6 60.9 128.5 64.2000000000001 127.7 66.9C125.9 73.0000000000001 124.8 81.0000000000001 123.4 82.9C109.6 85.0000000000001 78.6 90.4 77.9 104.3C77.7 107.9 80.2 111.1 83.8 111.7C130.1 119.3 150.9 166.8 151.8 168.8C151.8 168.9 151.9 169 152 169.1C154.5 174.1 155 178.3 153.6 181.6C150.2 189.5 135.7 192.3 129.6 194.8C113.8 201 111.6 208.2 112.6 213.1C114.2 221.6 127 226.9000000000001 134.5 223.4C140.4 220.6 145.7 219.2000000000001 150.2 219.2000000000001C153.5 219.2000000000001 155.7 220.0000000000001 156.8 220.6000000000001C155.4 244.5000000000001 152.1 278.6 160.6 297.7000000000001C183.1 348 230.7 352 244.7 352C245.3 352 250.8 352.1 251.4 352.1C286.1 352.1 319.4 334.3 335.7 297.8C344.2 278.7000000000001 340.9 244.7 339.5 220.7C340.6 220.1 342.4 219.4 345.2 219.3C349.5 219.5 354.4 220.9 359.9 223.5C363.9 225.4 369.5 225.1 373.5 223.5C379.8 221.2 383.8 216.7 383.9 211.6C384 205.1 378.2 199.5 366.7 195C365.3 194.4 363.6 193.9 361.8 193.3C355.3 191.2 345.4000000000001 188.1 342.8 181.8C341.4000000000001 178.5 342 174.3 344.4000000000001 169.3C344.5000000000001 169.2 344.5000000000001 169.1 344.6 169C345.5 167 366.3 119.5 412.6 111.9C416.6 110.9 419.7000000000001 106.4 417.5 101.1z" /> + <glyph glyph-name="soundcloud" + unicode="" + horiz-adv-x="640" d=" M111.4 191.7L117.2 126.7L111.4 58.4C111.1 55.9 109.2 54 107 54S102.8 55.9 102.8 58.4L97.2 126.7L102.8 191.7C102.8 193.9 104.7 195.9 107 195.9C109.2 195.9 111.1 193.9 111.4 191.7zM132.8 237.3C130 237.3 128.1 235.1 127.8 232.3L122.8 126.7L127.8 58.4C128.1 55.6 130 53.4 132.8 53.4C135.3 53.4 137.5 55.6 137.5 58.4L143.3 126.7L137.5 232.3C137.5 235.1 135.3 237.3 132.8 237.3zM158.3 261.4C155.2 261.4 153 259.2 152.7 256.1L148.3 126.1L152.7 58.3C153 55.1999999999999 155.2 52.9999999999999 158.3 52.9999999999999C161.1 52.9999999999999 163.6 55.1999999999999 163.6 58.3L168.9 126.1L163.6 256.1C163.6 259.2 161.1 261.4 158.3 261.4zM7.2 164.8C5.8 164.8 5 163.7 4.7 162.3L0 126.7L4.7 91.7C5 90.3 5.8 89.2 7.2 89.2S9.4 90.3 9.7 91.7L15.3 126.7L9.7 162.3C9.4 163.7 8.6 164.8 7.2 164.8zM30.8 186.7C29.4 186.7 28.3 185.6 28.3 184.2L21.9 126.7L28.3 70.6C28.3 68.9 29.4 67.8 30.8 67.8S33.3 68.9 33.6 70.3L40.8 126.6999999999999L33.6 184.1999999999999C33.3 185.5999999999999 32.2 186.6999999999999 30.8 186.6999999999999zM56.1 198.1C54.4 198.1 53 196.7 52.8 194.8L47 126.7L52.8 60.9C53.1 59.2 54.5 57.8 56.1 57.8C57.8 57.8 59.2 59.1999999999999 59.2 60.9L66.1 126.7L59.2 194.8C59.2 196.7 57.8 198.1 56.1 198.1zM81.4 200.3C79.5 200.3 77.8 198.9 77.8 196.7L72 126.7L77.8 58.9C77.8 56.7 79.5 55.3 81.4 55.3S85 56.6999999999999 85.3 58.9L91.7 126.7L85.3 196.7C85 198.9 83.3 200.3 81.4 200.3zM322.8 311.2C321.7 312 320 312.6 318.6 312.6C316.4000000000001 312.6 314.4000000000001 311.8 313 310.7C311.1 309 309.9 306.5 309.7 304V303.2L306.4 126.5L308.1 94L309.8 62.3C310.1 57.6 314 53.7 318.7 53.7S327.3 57.6 327.3 62.3L331.2 126.5L327.3 304C326.9 307 325.3 309.8 322.8 311.2zM296.1 295.9C294.7000000000001 296.7 293.3 297.3 291.7000000000001 297.3S288.6 296.7 287.3000000000001 295.9C285.1000000000001 294.5 283.7000000000001 292 283.7000000000001 289.2L283.4000000000001 287.5L280.6 126.7S280.6 126.4 283.7000000000001 61.1V60.8C283.7000000000001 59.1 284.3000000000001 57.5 285.4000000000001 56.1C287.1 54.2 289.3 53 291.8 53C294 53 296 54.1 297.4000000000001 55.5C299.1 56.9 299.9000000000001 58.8 299.9000000000001 61.1L300.2000000000001 67.8L303.3000000000001 126.4L300.0000000000001 289.2000000000001C299.7000000000001 292.0000000000001 298.3000000000001 294.5000000000001 296.1000000000001 295.9000000000001zM184.7 273.4C181.6 273.4 178.9 270.6 178.9 267.3L174.5 126.7L178.9 59.5C179.2 56.2 181.7 53.7 184.7 53.7C188 53.7 190.5 56.2 190.8 59.5L195.8 126.7L190.8 267.3C190.6 270.6 188.1 273.4 184.7 273.4zM561.4 210.6C550.6 210.6 540.3 208.4 530.8 204.5C524.4 275.3 464.9999999999999 330.9 392.5 330.9C374.7 330.9 357.5 327.6 342.2 321.5C336.0999999999999 319.3 334.3999999999999 317.1 334.3999999999999 312.3V62.6C334.3999999999999 57.6 338.2999999999999 54 343 53.4H561.3C604.5999999999999 53.4 639.9 88.4 639.9 131.7000000000001C640 175.3000000000001 604.6999999999999 210.6000000000001 561.4 210.6000000000001zM264.7 270.9C260.5 270.9 257.2 267.6 256.9 263.1L253.6 126.4L256.9 60.8C257.2 56.6 260.5 53.3 264.7 53.3C268.9 53.3 272.2 56.6 272.2 60.8L276.1 126.4L272.2 263.1C271.9 267.6 268.9 270.9 264.7 270.9zM211.1 278.7C207.8 278.7 204.7 275.6 204.7 272L200.8 126.7L204.7 59.8C205 56.1999999999999 207.8 53.4 211.1 53.4C214.7 53.4 217.5 56.2 217.8 59.8L222.2 126.6999999999999L217.8 272C217.5 275.5999999999999 214.7 278.7 211.1 278.7zM237.8 275.3C233.9 275.3 230.9 272.2 230.9 268.4L227 126.7L230.9 60.3C231.2 56.4 234 53.4 237.8 53.4S244.7 56.5 244.7 60.3L248.9 126.6999999999999L244.7 268.3999999999999C244.7 272.3 241.7 275.3 237.8 275.3z" /> + <glyph glyph-name="speakap" + unicode="" + horiz-adv-x="448" d=" M352 416H96C43.2 416 0 372.8 0 320V64C0 11.2 43.2 -32 96 -32H352C404.8 -32 448 11.2 448 64V320C448 372.8 404.8 416 352 416zM221 65.1C181.4 65.1 139.1 82.9 139.1 118.8V146H179V128.2C179 113.1 198.5 103.7 220.9 103.7C245.1 103.7 262.2 114.1 262.2 133.2C262.2 157 235 165.1 207.5 175.8C175.6 188.2 144.4 202 144.4 244.9C144.4 292.9 183 311.3 224.3 311.3C261.9000000000001 311.3 299.8 297.2000000000001 299.8 269.4V238.2H259.9000000000001V254.3C259.9000000000001 266.4 242.1 272.8 224.3000000000001 272.8C204.8000000000001 272.8 188.7000000000001 264.7000000000001 188.7000000000001 246.6C188.7000000000001 224.5 211.2000000000001 217.4 235.7000000000001 207.7C271.6 195.3 306.8000000000001 180.5 306.8000000000001 136.2000000000001C306.9000000000001 87.6 266.0000000000001 65.1 221.0000000000001 65.1z" /> + <glyph glyph-name="spotify" + unicode="" + horiz-adv-x="496" d=" M248 440C111.1 440 0 328.9 0 192S111.1 -56 248 -56S496 55.1 496 192S384.9 440 248 440zM348.7 75.1C344.5 75.1 341.9 76.4 338 78.7000000000001C275.6 116.3000000000001 203 117.9 131.3 103.2000000000001C127.4 102.2000000000001 122.3 100.6 119.4 100.6C109.7 100.6 103.6 108.3 103.6 116.4C103.6 126.7000000000001 109.7 131.6 117.2 133.2000000000001C199.1 151.3000000000001 282.8 149.7000000000001 354.2 107.0000000000001C360.3 103.1000000000001 363.9 99.6000000000001 363.9 90.5000000000001S356.8 75.1000000000001 348.7 75.1000000000001zM375.6 140.7000000000001C370.4 140.7000000000001 366.9 143.0000000000001 363.3 144.9C300.8 181.9 207.6 196.8000000000001 124.7 174.3C119.9 173 117.3 171.7 112.8 171.7C102.1 171.7 93.4 180.4 93.4 191.1S98.6 208.9 108.9 211.8C136.7 219.6 165.1 225.4 206.6999999999999 225.4C271.5999999999999 225.4 334.3 209.3 383.7 179.9C391.8 175.1 395 168.9 395 160.2C394.8999999999999 149.4 386.5 140.7 375.6 140.7zM406.6 216.9C401.4 216.9 398.2 218.2000000000001 393.7 220.8000000000001C322.5 263.3000000000001 195.2 273.5000000000001 112.8 250.5000000000001C109.2 249.5000000000001 104.7 247.9000000000001 99.9 247.9000000000001C86.7 247.9000000000001 76.6 258.2000000000001 76.6 271.5C76.6 285.1 85 292.8000000000001 94 295.4000000000001C129.2 305.7000000000001 168.6 310.6 211.5 310.6C284.5 310.6 361 295.4000000000001 416.9 262.8C424.7 258.3 429.8 252.1 429.8 240.2C429.8 226.6 418.8 216.9 406.6 216.9z" /> + <glyph glyph-name="stack-exchange" + unicode="" + horiz-adv-x="448" d=" M17.7 115.7H430.4V93.7C430.4 56 401.1 25.7 365.1 25.7H346.1L259.3 -64V25.7H83C47 25.7 17.7 56 17.7 93.7V115.7zM17.7 139.3H430.4V224.3H17.7V139.3zM17.7 248.7H430.4V333.7000000000001H17.7V248.7zM365 448H83C47 448 17.7 417.7 17.7 380.3V358H430.4V380.3C430.3 417.7 401 448 365 448z" /> + <glyph glyph-name="stack-overflow" + unicode="" + horiz-adv-x="384" d=" M293.7 148L112.5 232.5L129.2 269L310.5 184.3L293.7 148zM341.7 224L188.2 352.3L162.7 321.5L316.2 193.2L341.7 224zM381.3 255.7L262 416L230 392L349.3 231.7L381.3 255.7zM290.7 137L95 178.3L86.8 139L282.5 98L290.7 137zM322.3 8H42.7V128H2.7V-32H362.2V128H322.2V8zM282.5 88H82.5V48.3H282.5V88z" /> + <glyph glyph-name="staylinked" + unicode="" + horiz-adv-x="440" d=" M201.6 320.6C205.7 323.8 211.9 323.6 215.4 320.1L385.4 152.8L382.7 155.5L427 114.1999999999999C430.7 110.6999999999999 430.3 105.1999999999999 426.3 101.9999999999999L228.3 -61.9000000000001C218.4 -69.5000000000001 211 -62.7000000000001 211 -62.7000000000001L2.3 133.4C-1.2 136.9 -0.7 142.4 3.5 145.6L49.3 180.5C53.5 183.6999999999999 59.7 183.5 63.2 180L215.1 32.4999999999999C218.8 28.9999999999999 225.1 28.8 229.3 32.1L322.5 106.1C326.6 109.3 327 114.8 323.4 118.3L239.4 199.6C235.8 203.1 229.5 203.3 225.4 200.1L225.3 200C221.2 196.8 214.9 197 211.3 200.5L143.2 264.8C139.7 268.3 140.1 273.8 144.3 277L201.6 320.5999999999999M216.4 63.3C220.1 59.8 226.5 59.6 230.7 62.9L280.9 101.7L280.6 102L288.3 108C292.5 111.2 292.9 116.7 289.2 120.2L232.1 174.6C228.5 178.1 222.0999999999999 178.3 217.9 175.1L217.8 175C213.6 171.8 207.3 171.8999999999999 203.6 175.3999999999999L109 267.2C105.4 270.7 105.9 276.1 110.1 279.4L202.3 350.9C206.4 354.1 212.6 353.9 216.2 350.4L376.6 191.4C380.3 187.9 386.6 187.7 390.7000000000001 190.9L436.5000000000001 226.7C440.6000000000001 229.9 440.9000000000001 235.4 437.2000000000001 238.9L226.7 445.5C225.2 446.7 218.7 451 210.4 444.4L3.6 282.3C-0.6 279.1 -1.2 273.6 2.4 270.1L44.7 228.4000000000001" /> + <glyph glyph-name="steam-square" + unicode="" + horiz-adv-x="448" d=" M185.2 91.5C192.9 110 184.2 131.2 165.6 138.9L136.1 151.1C147.5 155.4 160.4 155.6 172.5 150.6C184.7 145.5 194.1 136 199.2 123.9C204.2 111.7 204.2 98.3 199.1 86.2C188.6 61.1 159.7 49.2 134.5 59.7C122.9 64.5 114.1 73.3 109.1 83.9L137.6 72.1C156.2 64.3 177.5 72.9999999999999 185.2 91.4999999999999zM400 416H48C21.5 416 0 394.5 0 368V207.3L116.6 159.2C128.6 167.4 142.8 171.3 157.3 170.5L212.7 250.7V251.8C212.7 300 252 339.3 300.3 339.3S387.9 300 387.9 251.8C387.9 202.6 347 163.1 298.3 164.3L219.3 107.9999999999999C220.9 69.4999999999999 190.2 39.1999999999999 153.6 39.1999999999999C121.8 39.1999999999999 95.1 61.8999999999999 89.1 91.8999999999999L0 128.8V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM300.3 193.5C268.1 193.5 241.9 219.6 241.9 251.8S268.1 310.1 300.3 310.1S358.7 283.9000000000001 358.7 251.8S332.5 193.5 300.3 193.5zM300.4000000000001 208.1C324.6 208.1 344.3 227.7 344.3 251.9C344.3 276.1 324.7 295.7 300.4000000000001 295.7C276.2000000000001 295.7 256.5000000000001 276.1 256.5000000000001 251.9C256.5000000000001 227.7 276.2000000000001 208.1 300.4000000000001 208.1z" /> + <glyph glyph-name="steam-symbol" + unicode="" + horiz-adv-x="448" d=" M395.5 270.5C395.5 236.7 368 209.5 334.5 209.5C300.7 209.5 273.5 236.8 273.5 270.5S300.8 331.5 334.5 331.5C368 331.5 395.5 304.3 395.5 270.5zM448 270.3C448 207.3 397 156.5 334.3 156.5L225 76.7C221 33.7 184.5 -0.1 140.5 -0.1C100 -0.1 65.8 28.7 57.5 66.9L0 90V197.3L97.2 158C112.3 167.2 129.4 171.3 149.2 169.5L220.2 271.2C220.7 333.5 271.7 384 334.2 384C397 384 448 333 448 270.3zM203 85C203 119.7 175.2 147.5 140.5 147.5C136 147.5 131.5 147 127 146L153 135.5C178.5 125.3 191 96.5 180.7 71C170.5 45.5 141.5 33 116 43.5C105.8 47.5 95.5 51.8 85.3 55.7C95.8 36 116.5 22.5 140.5 22.5C175.2 22.5 203 50.3 203 85zM410.5 270.3C410.5 312.3 376.2 346.5 334.3 346.5C292 346.5 257.8 312.3 257.8 270.3C257.8 228.1 292.1 194.1 334.3 194.1C376.2 194 410.5 228.0000000000001 410.5 270.3z" /> + <glyph glyph-name="steam" + unicode="" + horiz-adv-x="496" d=" M496 192C496 55 384.8 -56 247.6 -56C133.8 -56 38 20.3 8.6 124.4L103.8 85.1C110.2 52.9999999999999 138.7 28.7 172.7 28.7C211.9 28.7 244.6 61.1 242.9 102.2L327.4 162.4C379.5 161.1 423.2 203.3 423.2 255.9C423.2 307.5 381.2 349.4 329.5 349.4S235.8 307.4 235.8 255.9V254.7L176.6 169C161.1 169.9 145.9 165.6 133.1 156.9L0 211.9C10.2 339.6 117.1 440 247.6 440C384.8 440 496 329 496 192zM155.7 63.7L125.2 76.3A52.79 52.79 0 0 1 152.4 50.5C179.3 39.3 210.2 52.1 221.4 78.9C226.8 91.9 226.9 106.2 221.5 119.2C216.1 132.2 206 142.4 193 147.8C180.1 153.2 166.3 153 154.1 148.4L185.6 135.4C205.4 127.2000000000001 214.8 104.5000000000001 206.5 84.7000000000001C198.2 64.8000000000001 175.5 55.5000000000001 155.7 63.7000000000001zM329.5 193.6C295.1 193.6 267.1 221.6 267.1 255.9S295.1 318.2 329.5 318.2S391.9 290.2 391.9 255.9S364 193.6 329.5 193.6zM329.6 209.2C355.5 209.2 376.5 230.2 376.5 256C376.5 281.9 355.5 302.8 329.6 302.8S282.7000000000001 281.8 282.7000000000001 256C282.8000000000001 230.2 303.8000000000001 209.2 329.6 209.2z" /> + <glyph glyph-name="sticker-mule" + unicode="" + horiz-adv-x="576" d=" M353.1 -61.8C347.2000000000001 -64.7 321 -65 316.6 -61.3C312.5 -58.3 314.4000000000001 -49.4 315.1 -46.3C317.3 -31.3 312.6 -38.4 305.3 -34.8C302.2 -33.3 301.2 -29.3 300.7 -24.8C300.2 -23.3 299.7 -22.3 299.2 -21.3C297.5 -10.6 306 12.3 307.4 22.1C312.3 45.8 306.7 59.3 308.9 68.9999999999999C312.6 85.1999999999999 313 72.4999999999999 313 98.8999999999999C311.6 124.7999999999999 316.3 135.7999999999999 313.5 137.7999999999999C298.7 137.7999999999999 249.2 127.0999999999999 201.3 135.7999999999999C155.2 144.6999999999999 141.9 164.7999999999999 135.9 166.6999999999999C125.6 171.1999999999999 112.7 166.1999999999999 108.6 159.6999999999999C108.5 159.5999999999999 73.6 89.0999999999999 69 71.8999999999999C62.8 51.3999999999999 68.5 24.4999999999999 73.1 5.0999999999999C73.1 4.9999999999998 77.6 -9.5000000000002 83.4 -14.4000000000001C85.5 -15.9000000000001 88.5 -16.9000000000001 90.6 -18.9000000000001C93.4 -21.6000000000001 100 -34.1000000000001 100.4 -34.9000000000001C103 -39.4000000000001 104 -42.9000000000001 98.9 -45.4000000000001C95.3 -47.4000000000001 89.6 -47.9000000000001 84.5 -47.9000000000001C81.9 -48.4000000000001 83 -51.4000000000001 81.4 -52.9000000000001C78.5 -55.7000000000002 60.7 -59.0000000000002 51.5 -55.4000000000001C48.9 -54.4000000000001 45.8 -52.4000000000001 45.3 -50.4000000000001C43.8 -46.4000000000001 47.4 -41.4000000000001 44.3 -37.9000000000001C39.8 -35.0000000000002 31.2 -35.9000000000001 27.3 -25.9000000000001C25.1 -20.5000000000002 24.7 -18.3000000000001 24.7 23.4999999999998C24.7 33.1999999999998 18.8 62.1999999999998 16.5 70.3999999999998C15 75.8999999999998 15 81.8999999999998 16.5 86.3999999999998C16.8 87.2999999999998 20.6 90.9999999999998 20.6 99.3999999999998C19.6 100.8999999999998 16 99.8999999999998 15.5 100.8999999999998C5.1 181.4999999999998 9.6 179.8999999999998 7.8 199.1999999999998C6.3 215.1999999999998 -3.1 243.0999999999998 1.1 263.4999999999999C1.6 265.8999999999999 4.5 284.4999999999999 25.3 302.3999999999999C56.3 329.0999999999999 73.7 340.6999999999998 184.3 313.8999999999999C185.4 313.4999999999999 250.6 292.7999999999999 295 322.8999999999999C310.5 334.1999999999998 323.8 334.1999999999998 330.5 338.8999999999999C330.6 338.9999999999999 392.2 390.9999999999999 417.5 404.1999999999998C464.7 433.5999999999999 487.4 420.8999999999998 492.6 422.1999999999998C497.3 423.1999999999998 506 447.9999999999999 509.6 447.9999999999999C515.1 447.9999999999999 511.2 427.7999999999999 513.2 422.0999999999999C513.7 420.0999999999999 516.8000000000001 417.0999999999999 519.4000000000001 417.0999999999999C521.7 417.0999999999999 521.1000000000001 417.8999999999999 529.7 422.0999999999999C538.1 427.4999999999999 544.6 439.6999999999998 550.3000000000001 439.0999999999999C562.0000000000001 437.4999999999999 531.3000000000001 397.4999999999999 531.3000000000001 392.1999999999998C531.3000000000001 390.1999999999998 531.5000000000001 391.3999999999999 535.9000000000001 382.6999999999998C538.5000000000001 377.1999999999998 540.5000000000001 369.1999999999998 542.1000000000001 362.6999999999998C550.4000000000001 332.9999999999999 547.8000000000002 348.0999999999999 555.5000000000001 325.7999999999999C575.7000000000002 275.6999999999998 576.1000000000001 280.5999999999999 576.1000000000001 272.8999999999999C576.1000000000001 265.3999999999999 572.0000000000001 261.8999999999999 568.9000000000001 256.3999999999999C567.4000000000001 253.3999999999999 564.3000000000001 248.8999999999999 561.7 248.3999999999999C559 247.6999999999999 568.7 249.8999999999999 548.3000000000001 245.8999999999999C541.1 244.8999999999999 534.9000000000001 250.3999999999999 533.4000000000001 255.3999999999999C531.8000000000001 260.0999999999998 536.2 265.4999999999999 521.6000000000001 278.2999999999999C511.3000000000001 288.2999999999999 500.5000000000001 289.5999999999999 489.7000000000002 295.2999999999999C479.9000000000001 300.9999999999999 477.8000000000002 294.2999999999999 471.7000000000002 287.2999999999999C453.7000000000002 264.3999999999999 437.7000000000002 240.3999999999999 419.7000000000002 217.4999999999998C407.9000000000002 202.4999999999998 395.5000000000002 187.0999999999999 386.2000000000002 170.0999999999999C382.3000000000002 163.2999999999999 376.7000000000002 141.9999999999998 375.9000000000002 140.1999999999999C369.7000000000002 122.4999999999999 370.4000000000002 114.3999999999999 359.4000000000002 71.8999999999999C356.3000000000002 61.8999999999999 353.7000000000002 50.4999999999999 350.7000000000002 39.4999999999999C348.5000000000002 32.6999999999999 343.3000000000002 -9.8000000000001 350.2000000000002 -19.9000000000001C352.3000000000002 -23.4000000000001 358.9000000000002 -24.4000000000001 361.5000000000002 -27.9000000000001C361.6000000000002 -28.0000000000001 371.1000000000002 -46.1000000000001 370.8000000000002 -47.9000000000001C370.8000000000002 -54.0000000000001 361.4000000000002 -53.5000000000001 359.5000000000002 -54.4000000000001C354.7000000000002 -57.3000000000001 355.7000000000002 -60.3000000000001 353.1000000000002 -61.8000000000001" /> + <glyph glyph-name="strava" + unicode="" + horiz-adv-x="369.2" d=" M301.6 156L257.7000000000001 67.8L213.1000000000001 156H145.5000000000001L257.7000000000001 -64L369.2000000000001 156H301.6zM151.4 448L0 156H89.2L151.4 272.1L213.1 156H301.6L151.4 448z" /> + <glyph glyph-name="stripe-s" + unicode="" + horiz-adv-x="362.3" d=" M144.3 293.4C144.3 315.7000000000001 162.9 324.3 192.7 324.3C236.1 324.3 291.2000000000001 311 334.6 287.6V421.9C287.3 440.8 240.1 448 192.8 448C77.1 448 0 387.6 0 286.6C0 128.7 216.8 154.3 216.8 86.2C216.8 59.8 193.9 51.3 162.1 51.3C114.9 51.3 53.9 70.8 6 96.8V-31.7C59 -54.5 112.8 -64.1 162 -64.1C280.6 -64.1 362.3000000000001 -13.1 362.3000000000001 89.5C362.3000000000001 259.7 144.3000000000001 229.2 144.3000000000001 293.4" /> + <glyph glyph-name="stripe" + unicode="" + horiz-adv-x="640" d=" M640 186.4C640 231.9 618 267.8 575.8 267.8S507.9 231.9 507.9 186.7C507.9 133.2 538.1999999999999 108.5 581.4 108.5C602.6 108.5 618.5 113.3 630.6 120V153.4C618.5 147.3 604.6 143.6 587 143.6C569.7 143.6 554.5 149.7 552.5 170.5H639.4C639.6 172.8 640 182.1 640 186.3999999999999M552.1 203.1999999999999C552.1 223.1999999999999 564.4 231.6 575.5 231.6C586.4 231.6 598 223.1999999999999 598 203.1999999999999H552.1zM439.2000000000001 267.8C421.8000000000001 267.8 410.6 259.5999999999999 404.4000000000001 253.8999999999999L402.1 264.8999999999999H363V60.0999999999999L407.4 69.4999999999999L407.5 119.6999999999999C413.9 114.9999999999999 423.4 108.4999999999999 438.9 108.4999999999999C470.7 108.4999999999999 499.7 131.6999999999999 499.7 188.0999999999999C499.8 239.6999999999999 470.4 267.7999999999999 439.2 267.7999999999999M428.6 145.2999999999999C418.2 145.2999999999999 412 149.0999999999999 407.7 153.6999999999999L407.4 219.6999999999999C412 224.7999999999999 418.4 228.4999999999999 428.6 228.4999999999999C444.8 228.4999999999999 455.9999999999999 210.2999999999999 455.9999999999999 187.0999999999999C456.1 163.1999999999999 445.1 145.2999999999999 428.6 145.2999999999999M346.4 324V287.8L301.8 278.3V314.5L346.4 324M301.9 264.8H346.5V111.6H301.9V264.8zM254.1 251.7C264.5 270.8 285.2 266.9 291.2 264.8V224C285.5 225.8 267.8 228.5 257.3 214.7V111.6H213V264.8H251.4L254.1 251.7M165.1 264.8H198.8V227H165.1V163.8C165.1 137.6 193.1 145.8 198.8 148.1V114.3C192.9 111.1 182.2 108.4 167.6 108.4C141.3 108.4 121.5 125.4 121.5 151.7000000000001L121.7 294.1L165 303.3000000000001L165.1 264.8000000000001zM44.9 219.7C44.9 199.7 112.8 209.2 112.8 156.3C112.8 124.3 87.4 108.5 50.5 108.5C35.2 108.5 18.5 111.5 2 118.6V158.6C16.9 150.5 35.9 144.4 50.6 144.4C60.5 144.4 67.6 147.1 67.6 155.3C67.6 176.5 0.1 168.5 0.1 217.7C0.1 249.1 24.1 267.9000000000001 60.1 267.9000000000001C74.8 267.9000000000001 89.5 265.6 104.2 259.8000000000001V218C90.7 225.3 73.5 229.4 60 229.4C50.7 229.3 44.9 226.6 44.9 219.7" /> + <glyph glyph-name="studiovinari" + unicode="" + horiz-adv-x="512" d=" M480.3 260.3L484.5 232.3V204.3L459.4 160.2L419.6 81.8L363.5 14.3L284.4 -23.5000000000001L266.7 -48.0000000000001L259 -60.0000000000001L249.4 -64S266.7 -0.4 268.8 -0.4C270.9000000000001 -0.4 289.1 -1.1 289.1 -1.1L355.8 37.5000000000001L263.3 11.4L207.4 -25.4L184.6 -53.4L178 -54.8L198.8 18.8000000000001L205.7 24.3000000000001L226.4 11.4000000000001L314.7 56.6000000000001L371.5 108.1000000000001L386.3 176.5000000000001L260.9 153.2000000000001L276.1 171.4000000000001L102.7 224.7000000000001L184.6 235.2000000000001L18.6 358.1000000000002L133.5 340L32.2 448L285.1 321.4L253.6 359.4L378 285L234.7 384L253.4 345.6L203.8 363.7L158.3 448L352.9 326L310 381.8L418 285.4L430 294.3L409 310.7L413.2 348.5L451 358.9L480.2 334.2L491.7 330L484.7 323.8L493.2 311.8L480.1 304.4L469.8 284.2000000000001L480.3 260.3z" /> + <glyph glyph-name="stumbleupon-circle" + unicode="" + horiz-adv-x="496" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 262.5C246.2 262.5 238.2 254.5 238.2 244.7V137.8C238.2 96.9 204.3 63.9 163.3 63.9C121.9 63.9 88.4 97.4 88.4 138.8V185.3H145.7V139.5C145.7 129.5 153.7 121.6999999999999 163.5 121.6999999999999S181.3 129.5999999999999 181.3 139.5V247.9C181.3 287.9 215.5 320 256 320C296.7 320 330.7 287.7 330.7 247.4V223.7L296.6 213.6L273.7 224.3V244.9C273.8 254.5 265.8 262.5 256 262.5zM423.6 138.9C423.6 97.5 390.1 64 348.7000000000001 64C307.5000000000001 64 273.8000000000001 97.2 273.8000000000001 138.2V185L296.7000000000001 174.3L330.8000000000001 184.4V137.3C330.8000000000001 127.5 338.8000000000001 119.7 348.6000000000001 119.7S366.4000000000001 127.6 366.4000000000001 137.3V185.3H423.7000000000001C423.6000000000001 139.4 423.6000000000001 138.9 423.6000000000001 138.9z" /> + <glyph glyph-name="stumbleupon" + unicode="" + horiz-adv-x="512" d=" M502.9 182V112.3C502.9 50.2 452.6 -0.1 390.5 -0.1C328.7 -0.1 278.1 49.7 278.1 111.2V181.4L312.4000000000001 165.4L363.5000000000001 180.6V110C363.5000000000001 95.3 375.5000000000001 83.5 390.2000000000001 83.5S417 95.3 417 110V182H502.9zM278.2 240.2L312.5 224.2L363.6 239.4V275C363.6 335.5 312.5 384 251.5000000000001 384C190.7000000000001 384 139.4 335.8 139.4 275.8V113.4C139.4 98.5 127.4 86.7 112.7 86.7S86 98.5 86 113.4V182H0V112.3C0 50.3 50.3 0 112.4 0C174 0 224.8 49.5 224.8 110.8V271.1C224.8 285.8 236.8 297.8 251.5 297.8S278.2 285.8 278.2 271.1V240.2z" /> + <glyph glyph-name="superpowers" + unicode="" + horiz-adv-x="448" d=" M448 416C364.7 405 281.2 394 198 383C106 370.5 34.7 296.3 29 203C25.7 147.5 47 93.5 86.8 54.8L0 -32C83.3 -21 166.5 -10 249.8 1C341.6 13.5 413.1 87.8 418.5 180.8C422 236.3 400.5 290.3 360.8 329L448 416zM368.3 183.7C364.1 104.2 294.3 44.5 215.5 49.2C136 53.9 74.8 120.2 79.2 200.2C83.7 279.4 153.5 339.5 232.2 334.7C311.5 330 372.7 263.7 368.3 183.7z" /> + <glyph glyph-name="supple" + unicode="" + horiz-adv-x="640" d=" M640 185.5C640 121.4 531 69.4 396.5 69.4C371.7 69.4 347.9 71.2 325.4 74.4C333.1 74 340.9 73.8 348.8 73.8C483.3 73.8 592.3 130.6999999999999 592.3 200.9C592.3 230.3 573.1999999999999 257.3 541.0999999999999 278.9C601.0999999999999 257.8 639.9999999999999 223.8 639.9999999999999 185.5zM47.7 220.1C47.6 290.3 156.5 347.4 291 347.7C298.9 347.7 306.6 347.5 314.3 347.2C291.8 350.4 268 352.1 243.3 352.1C108.8 351.7 -0.1 299.5 0 235.4C0.1 197.1 39.1 163.1 99.3 142.1C67 163.6 47.8 190.7000000000001 47.7 220.1zM107.9 180.2S118.4 167 137.2 167C155.1 167 165.6 178.5 165.6 192.1C165.6 220.1 125.4 217.2 125.4 231.8C125.4 237.2 130.7 240.9 137.9 240.9C143.6 240.9 149.2000000000001 238.3 149.2000000000001 234.3V230.4H163.4V238.3C163.4 250.4 148 255.1 138 255.1C121.5 255.1 109.5 244.9000000000001 109.5 231.0000000000001C109.5 204.4 149.7000000000001 205.6 149.7000000000001 191.1C149.7000000000001 184.5 143.9 181 137.4 181C125.5 181 116.7 191.1 116.7 191.1L107.9 180.2000000000001zM228.7 253.8V199.4C228.7 188.1 221.6 181.6 210.9 181.6C200.2 181.6 193.1 188.1 193.1 199.3V253.8H177.3V198.8C177.3 179.9 190.7 166.9 211 166.9C231.1 166.9 244.4 179.9 244.4 198.8V253.8H228.7zM263.1 168.4H278.9V197.9H294.4C310.4 197.9 321.6 209.4 321.6 226S310.4 253.8 294.4 253.8H255.3V240.4H263.1V168.4zM278.9 211.4V240.5H291.8C300.5 240.5 305.5 234.8 305.5 226.1C305.5 217.2 300.3999999999999 211.4 291.5 211.4H278.8999999999999zM335.9 168.4H351.7V197.9H367.2C383.2 197.9 394.4 209.4 394.4 226S383.2 253.8 367.2 253.8H328.1V240.4H335.9V168.4zM351.6 211.4V240.5H364.5C373.2 240.5 378.2 234.8 378.2 226.1C378.2 217.2 373.2 211.4 364.2 211.4H351.5999999999999zM408.7 176.6C408.7 170.8 411.1 168.4 416.9 168.4H454.5C460.3 168.4 462.7 170.8 462.7 176.6V189.6H448.4V184.4C448.4 182.7 447.4 181.8 445.8 181.8H427.2C425.5 181.8 424.5999999999999 182.8 424.5999999999999 184.4V245.6C424.5999999999999 251.3 422.2 253.8 416.3999999999999 253.8H401V240.4H406.2C407.9 240.4 408.8 239.4 408.8 237.8V176.6zM472.1 176.6C472.1 170.8 474.4999999999999 168.4 480.3 168.4H519C524.7 168.4 527.2 170.8 527.2 176.6V189.6H512.9000000000001V184.4C512.9000000000001 182.7 511.9000000000001 181.8 510.3000000000001 181.8H490.6000000000001C488.9000000000001 181.8 488.0000000000001 182.8 488.0000000000001 184.4V204.7H515.7V218.1H488V240.5H507.2C508.9 240.5 509.8 239.5 509.8 237.9V232.7H524V245.7C524 251.4 521.5 253.9 515.8 253.9H464.1999999999999V240.5H471.9999999999999V176.6zM531 252.6V246.7H532.6V252.6H535.3000000000001V253.8H528.3000000000001V252.6H531.0000000000001zM536.7 253.8V246.7H538.2V252.4L540.5 246.7H541.8L544.0999999999999 252.4V246.7H545.5999999999999V253.8H543.3L541.1999999999999 248.7L539.0999999999999 253.8H536.6999999999999z" /> + <glyph glyph-name="telegram-plane" + unicode="" + horiz-adv-x="448" d=" M446.7 349.4L379.1 30.6C374 8.1 360.7000000000001 2.5 341.8 13.1L238.8 89L189.1 41.2C183.6 35.7 179 31.1 168.4 31.1L175.8000000000001 136L366.7000000000001 308.5C375.0000000000001 315.9 364.9000000000001 320 353.8000000000001 312.6L117.8 164L16.2 195.8C-5.9 202.7 -6.3 217.9 20.8 228.5L418.2 381.6C436.6 388.5 452.7 377.5 446.7 349.4z" /> + <glyph glyph-name="telegram" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM369.8 270.1L329.1 78.3C326.1 64.6999999999999 318 61.4 306.7000000000001 67.8L244.7000000000001 113.5L214.8000000000001 84.6999999999999C211.5 81.3999999999999 208.7000000000001 78.5999999999999 202.3000000000001 78.5999999999999L206.7000000000001 141.6999999999999L321.6 245.5C326.6 249.9 320.5 252.4 313.9000000000001 248L171.9 158.5999999999999L110.7 177.6999999999999C97.4 181.8999999999999 97.1 191 113.5 197.3999999999999L352.6 289.5999999999999C363.7000000000001 293.5999999999999 373.4000000000001 286.8999999999999 369.8 270.0999999999999z" /> + <glyph glyph-name="tencent-weibo" + unicode="" + horiz-adv-x="384" d=" M72.3 -47.8C73.7 -67.7 44.7 -70 42.6 -50.7C31 79.2 73.7 188.8 144 262.5C128.4 296.5 153.2 339.6 194.6 339.6C224.9 339.6 249.7 315 249.7 284.5C249.7 240.5 200.2 213.7 162.8 239.4C97.1 168.1 61.4 69.6 72.3 -47.8zM192 447.9C66.1 447.9 -12.3 313.7 43.7 205.6C52.4 188.2 79 201.1 70 219C23.7 311.6 91 418.2 192 418.2C267.4 418.2 328.9 356.8 328.9 281.3C328.9 190.5 242 127.4 161.2 148.2C142.1 152.3 135.6 123.8 154.6 119.1C265.3 95.9 358.6 179.1 358.6 281.4C358.6 373.3 284 447.9 192 447.9z" /> + <glyph glyph-name="themeisle" + unicode="" + horiz-adv-x="512" d=" M208 359.714C208 369.714 214.286 381.428 225.715 381.428C236.857 381.428 243.429 369.714 243.429 359.714C243.429 349.429 236.857 338 225.715 338C214.286 338 208 349.429 208 359.714zM512 199.714C512 163.713 500.571 97.428 475.714 70C452.856 45.142 388.286 8.857 354.857 -0.572L353.714 -0.858V-33.429C353.714 -49.715 341.142 -64 324.5710000000001 -64C314.5710000000001 -64 305.1420000000001 -58.286 299.999 -49.714C294.572 -58.286 285.1430000000001 -64 275.1430000000001 -64C265.1430000000001 -64 255.7140000000001 -58.286 250.2850000000001 -49.714C245.1430000000001 -58.286 235.7140000000001 -64 225.7150000000001 -64C215.429 -64 206.286 -58.286 200.857 -49.714C195.714 -58.286 186.286 -64 176.286 -64C157.429 -64 146.857 -48.286 146.857 -31.143C130.571 -43.4280000000001 111.142 -50.571 90.286 -50.571C68.286 -50.571 46.857 -42.286 30 -27.7140000000001C40.285 -27.4280000000001 50.571 -25.4280000000001 60.285 -22.0000000000001C39.428 -16.2860000000001 20.857 -3.143 8.285 14.2859999999999C29.655 9.641 54.494 12.6129999999999 75.428 25.429C53.428 47.429 18.857 84.286 6.856 112.857C1.143 126.286 0 144.286 0 158.571C0 208.285 20.286 318.5710000000001 86.286 318.5710000000001C96.857 318.5710000000001 105.143 313.713 109.429 303.7140000000001A158.792 158.792 0 0 0 121.429 319.1420000000001C123.429 321.7140000000001 127.143 324.5710000000001 128.572 327.428C136.571 339.999 140.286 348.5700000000001 150.286 361.428C182.571 402.572 232 430.857 285.143 430.857C291.143 430.857 297.143 430.572 302.857 429.714C313.714 441.429 328.8570000000001 448 344.572 448C359.1430000000001 448 374.286 442 384.572 431.714C385.4290000000001 430.856 386 429.428 386 428.286C386 424.572 375.715 414.857 373.1430000000001 412C377.4290000000001 410.5710000000001 388.8570000000001 405.142 388.8570000000001 400C388.8570000000001 397.1430000000001 386 394.857 384.286 392.857C415.715 365.1430000000001 433.7150000000001 325.714 440.572 284.857C444.858 290 450.857 293.429 457.715 293.429C468.2860000000001 293.429 478.572 286.285 486.2860000000001 279.428C507.143 260.857 512 226.286 512 199.714zM188 358.572C188 340.286 200.571 321.429 220.286 321.429C240 321.429 252.571 340.286 252.571 358.572C252.571 376.572 240 395.429 220.286 395.429C200.571 395.429 188 376.5710000000001 188 358.572zM237.714 254C237.714 273.714 241.428 293.1430000000001 246.285 312.286C194.246 232.752 232.754 127.715 315.1430000000001 127.715C336.5710000000001 127.715 357.7140000000001 135.429 375.1430000000001 147.715C377.1430000000001 155.144 378.8570000000001 162.572 378.8570000000001 170.287C378.8570000000001 184.573 372.5710000000001 191.715 358.2850000000001 191.715C353.714 191.715 349.1420000000001 190.858 344.8560000000001 190.001C281.5130000000001 177.333 237.7140000000001 186.3320000000001 237.7140000000001 254.0000000000001zM196.572 -0.858C196.572 10.285 187.714 19.999 176.286 19.999C164.857 19.999 156.286 10.284 156.286 -0.8579999999999V-33.429C156.286 -44.572 164.857 -54.571 176.286 -54.571C187.714 -54.571 196.572 -44.856 196.572 -33.429V-0.8579999999999zM245.715 -0.858C245.715 10.285 237.143 19.999 225.715 19.999C214.286 19.999 205.429 10.284 205.429 -0.8579999999999V-33.429C205.429 -44.572 214.286 -54.571 225.715 -54.571C237.143 -54.571 245.715 -44.571 245.715 -33.429V-0.8579999999999zM295.428 -0.858C295.428 10.285 286.5710000000001 19.999 275.143 19.999C263.714 19.999 254.857 10.284 254.857 -0.8579999999999V-33.429C254.857 -44.572 263.714 -54.571 275.143 -54.571C286.571 -54.571 295.428 -44.856 295.428 -33.429V-0.8579999999999zM345.1430000000001 -0.858C345.1430000000001 10.285 336.2860000000001 19.999 324.8570000000001 19.999C313.4290000000001 19.999 304.5710000000001 10.284 304.5710000000001 -0.8579999999999V-33.429C304.5710000000001 -44.572 313.4290000000001 -54.571 324.8570000000001 -54.571C336.286 -54.571 345.1430000000001 -44.571 345.1430000000001 -33.429V-0.8579999999999zM421.714 162C390.857 102.858 331.429 59.428 263.1430000000001 59.428C166.572 59.428 102.572 144 102.572 236C102.572 252.857 104.572 269.429 108.572 285.714C88.572 251.999 78.858 213.142 78.858 174.285C78.858 113.999 103.715 52.5699999999999 150.287 13.428C155.43 23.142 165.144 29.714 176.287 29.714C186.287 29.714 195.715 24 200.858 15.428C206.287 23.999 215.429 29.714 225.7160000000001 29.714C235.7160000000001 29.714 245.1440000000001 24 250.2870000000001 15.428C255.7160000000001 23.999 265.144 29.714 275.1450000000001 29.714C285.1450000000001 29.714 294.5730000000001 24 300.0020000000001 15.428C305.1450000000001 23.999 314.5730000000001 29.714 324.5740000000001 29.714C335.4310000000001 29.714 345.4310000000001 23.142 350.2880000000001 13.714C393.7150000000001 50 418.8570000000001 105.714 421.7140000000001 162zM432.286 261.714C432.286 315.428 397.7150000000001 367.428 339.714 367.428C309.429 367.428 281.1430000000001 352.285 260.857 330.5710000000001C240.862 264.188 233.41 194 302.286 194C331.091 194 399.6430000000001 222.538 386.572 157.143C415.429 183.143 432.286 222.857 432.286 261.7140000000001z" /> + <glyph glyph-name="trello" + unicode="" + horiz-adv-x="448" d=" M392 416H56C25.1 416 0 390.9 0 360V24C0 -6.9 25.1 -32 56 -32H392C422.9 -32 448 -6.9 448 24V360C448 390.9 422.9 416 392 416zM194.9 76.6C194.9 61.8 182.9 49.7 168 49.7H85.1C70.3 49.7 58.2 61.7000000000001 58.2 76.6V330.9C58.2 345.7 70.2 357.8 85.1 357.8H168C182.8 357.8 194.9 345.8 194.9 330.9V76.6zM389.8 188.6C389.8 173.8 377.8 161.7000000000001 362.9000000000001 161.7000000000001H280C265.2 161.7000000000001 253.1 173.7000000000001 253.1 188.6V330.9C253.1 345.7 265.1 357.8 280 357.8H362.9C377.7 357.8 389.8 345.8 389.8 330.9V188.6z" /> + <glyph glyph-name="tripadvisor" + unicode="" + horiz-adv-x="576" d=" M166.4 167.479C166.4 154.243 155.67 143.513 142.434 143.513S118.468 154.243 118.468 167.479S129.198 191.445 142.434 191.445S166.4 180.716 166.4 167.479zM431.362 191.435C418.132 191.435 407.406 180.71 407.406 167.479C407.406 154.249 418.131 143.523 431.362 143.523C444.592 143.523 455.318 154.248 455.318 167.479C455.317 180.71 444.592 191.435 431.362 191.435zM520.75 51.945C458.083 2.841 367.474 13.836 318.371 76.504L287.392 30.179L256.709 76.1180000000001C208.432 15.7280000000001 121.087 4.227 58.824 50.063C-5.234 97.2210000000001 -18.935 187.379 28.223 251.4370000000001A186.76199999999997 186.76199999999997 0 0 1 0 308.584L90.286 308.634A358.48 358.48 0 0 0 287.351 362.664A350.382 350.382 0 0 0 479.532 309.3150000000001L575.75 309.241A185.71300000000002 185.71300000000002 0 0 1 547.398 251.592C594.191 188.845 582.3620000000001 100.222 520.75 51.9450000000001zM259.366 166.239C259.359 229.796 207.831 281.314 144.274 281.307C80.717 281.3 29.2 229.772 29.206 166.215C29.213 102.658 80.741 51.14 144.298 51.147C207.811 51.222 259.282 102.686 259.366 166.199V166.239zM287.957 176.694C293.39 250.134 353.467 307.578 427.077 309.716A339.146 339.146 0 0 1 287.35 337.528A356.31 356.31 0 0 1 147.186 310.275C221.53 308.693 282.485 250.851 287.957 176.694zM539.663 205.461C517.671 265.095 451.501 295.6089999999999 391.8680000000001 273.618C332.2340000000001 251.626 301.7200000000001 185.4559999999999 323.7110000000001 125.823V125.791C345.7490000000001 66.184 411.9090000000001 35.7 471.5380000000001 57.678C531.153 79.682 561.6510000000001 145.84 539.663 205.461zM213.624 167.4859999999999V167.3709999999999C213.567 128.0429999999999 181.638 96.2079999999999 142.31 96.2649999999999C102.982 96.322 71.147 128.2509999999999 71.204 167.579C71.261 206.907 103.19 238.742 142.518 238.685C181.7770000000001 238.569 213.56 206.745 213.624 167.4859999999999zM189.112 167.4859999999999V167.5699999999999C189.061 193.3539999999999 168.118 214.215 142.334 214.1639999999999C116.5500000000001 214.113 95.689 193.1699999999999 95.74 167.387C95.791 141.603 116.734 120.742 142.5170000000001 120.793C168.2430000000001 120.906 189.0540000000001 141.761 189.1120000000001 167.4859999999999zM502.535 167.4859999999999V167.4379999999999C502.515 128.1099999999999 470.617 96.2439999999999 431.288 96.2649999999999S360.094 128.1829999999999 360.115 167.512C360.135 206.84 392.033 238.706 431.362 238.685C470.652 238.619 502.483 206.776 502.535 167.4859999999999zM478.031 167.4939999999999C478.022 193.2779999999999 457.113 214.1729999999999 431.329 214.1639999999999C405.545 214.155 384.65 193.2459999999999 384.659 167.4619999999999C384.668 141.678 405.577 120.7839999999999 431.361 120.7919999999999C457.126 120.8379999999999 477.997 141.7199999999999 478.031 167.4849999999999V167.4939999999999z" /> + <glyph glyph-name="tumblr-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM317.7 51.8C309.2 42.7 286.5 32 256.8 32C181.3 32 164.9 87.5 164.9 119.9V209.9H135.2C131.8 209.9 129 212.7 129 216.1V258.6C129 263.1 131.8000000000001 267.1 136.1 268.6C174.9 282.3 187 316.1 188.8 341.8C189.3 348.7 192.9 352 198.8 352H243.1C246.5000000000001 352 249.3 349.2 249.3 345.8V273.8H301.2C304.6 273.8 307.4 271 307.4 267.6V216.5C307.4 213.1 304.6 210.3 301.2 210.3H249.1V127C249.1 105.6 263.9 93.5 291.6 104.6C294.6 105.8 297.2000000000001 106.6 299.6 106C301.8 105.5 303.2000000000001 103.9 304.2000000000001 101.1L318.0000000000001 60.9C319.0000000000001 57.7000000000001 320.0000000000001 54.2 317.7000000000001 51.8z" /> + <glyph glyph-name="tumblr" + unicode="" + horiz-adv-x="320" d=" M309.8 -32.3C296.2 -46.8 259.8 -64 212.4 -64C91.6 -64 65.4 24.8 65.4 76.6V220.6H17.9C12.4 220.6 7.9 225.1 7.9 230.6V298.6C7.9 305.8 12.4 312.2000000000001 19.2 314.6C81.2 336.4000000000001 100.7 390.6 103.5 431.7000000000001C104.3 442.7000000000001 110 448 119.6 448H190.5C196 448 200.5 443.5 200.5 438V322.8H283.5C289 322.8 293.5 318.4 293.5 312.9V231.2C293.5 225.7 289 221.2 283.5 221.2H200.1V88C200.1 53.8 223.8 34.4 268.1 52.2C272.9000000000001 54.1 277.1 55.4 280.8 54.4C284.3 53.5 286.6 51 288.2 46.5L310.2 -17.8C312 -22.8 313.5 -28.4 309.8 -32.3z" /> + <glyph glyph-name="twitch" + unicode="" + horiz-adv-x="448" d=" M40.1 416L10 339.1V24.8H117V-32H177.2L234 24.8H321L438 141.8V416H40.1zM397.9000000000001 161.9L331 95H224L167.2 38.2V95H76.9V375.9H397.9V161.9zM331 299V182.1H290.9V299H331zM224 299V182.1H183.9V299H224z" /> + <glyph glyph-name="twitter-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM351.1 257.2C351.3 254.4 351.3 251.5 351.3 248.7C351.3 162 285.3 62.1 164.7 62.1C127.5 62.1 93 72.9 64 91.5C69.3 90.9 74.4 90.7 79.8 90.7C110.5 90.7 138.7 101.1 161.2 118.7C132.4 119.3 108.2 138.2 99.9 164.2C110 162.7 119.1 162.7 129.5 165.4C99.5 171.5 77 197.9 77 229.8V230.6C85.7 225.7 95.9 222.7 106.6 222.3A65.447 65.447 0 0 0 77.4 276.9C77.4 289.1 80.6 300.3 86.3 310C118.6 270.2 167.1 244.2 221.5 241.4C212.2 285.9 245.5 322 285.5 322C304.4 322 321.4 314.1 333.4 301.3C348.2 304.1 362.4 309.6 375 317.1C370.1 301.9 359.8 289.1 346.2 281C359.4 282.4 372.2 286.1 384 291.2C375.1 278.1 363.9 266.5 351.1 257.2z" /> + <glyph glyph-name="twitter" + unicode="" + horiz-adv-x="512" d=" M459.37 296.284C459.695 291.736 459.695 287.187 459.695 282.639C459.695 143.919 354.112 -15.919 161.137 -15.919C101.685 -15.919 46.457 1.3 0 31.187C8.447 30.213 16.568 29.888 25.34 29.888C74.395 29.888 119.553 46.456 155.614 74.72C109.482 75.6950000000001 70.822 105.908 57.502 147.492C64 146.518 70.497 145.868 77.32 145.868C86.741 145.868 96.163 147.168 104.934 149.441C56.853 159.188 20.791 201.421 20.791 252.426V253.725C34.76 245.928 51.005 241.055 68.222 240.406C39.958 259.249 21.441 291.411 21.441 327.7970000000001C21.441 347.289 26.638 365.1570000000001 35.735 380.751C87.39 317.076 165.035 275.493 252.1 270.944C250.4760000000001 278.741 249.5010000000001 286.862 249.5010000000001 294.9840000000001C249.5010000000001 352.812 296.283 399.918 354.4350000000001 399.918C384.6480000000001 399.918 411.9370000000001 387.248 431.1050000000001 366.781C454.8200000000001 371.329 477.5610000000001 380.101 497.7040000000001 392.121C489.9060000000001 367.755 473.3380000000001 347.288 451.5720000000001 334.294C472.6890000000001 336.567 493.1560000000001 342.416 511.998 350.5370000000001C497.7060000000001 329.746 479.837 311.2290000000001 459.3700000000001 296.284z" /> + <glyph glyph-name="typo3" + unicode="" + horiz-adv-x="433.3" d=" M330.8 107C323.8 104.7 319.2 104.7 312.3 104.7C255.1 104.7 171.7 303.2 171.7 369.6C171.7 394.3 177.1 402 185.6 409C116.1 400.5 36.3 375 9.3 342.6C3.9 334.9 0 321.8 0 305.5C0 202 106.8 -32 184.1 -32C220.4 -32 281.4 27.5 330.8 107M294.5 416C366.3 416 433.3 404.4 433.3 363.5C433.3 280.9 380.8 181.2 354.5 181.2C306.6 181.2 252.8 313.3 252.8 379.7C252.8 410.6 264.4000000000001 416 294.5 416" /> + <glyph glyph-name="uber" + unicode="" + horiz-adv-x="448" d=" M414.1 416H33.9C15.2 416 0 400.8 0 382.1V2C0 -16.8 15.2 -32 33.9 -32H414C432.7 -32 447.9 -16.8 447.9 1.9V382.1C448 400.8 432.8 416 414.1 416zM237.6 56.9C163 49.4 96.4 103.8 88.9 178.4H183.3V158C183.3 154.3 186.3 151.2 190.1 151.2H258C261.7 151.2 264.8 154.2 264.8 158V225.9C264.8 229.6 261.8 232.7 258 232.7H190.1C186.4 232.7 183.3 229.7 183.3 225.9V205.5H88.9C95.9 274.9 154.3 327.7 224 327.7C293.7 327.7 352.1 274.9 359.1 205.5C366.6 131 312.2000000000001 64.4 237.6 56.9z" /> + <glyph glyph-name="uikit" + unicode="" + horiz-adv-x="448" d=" M443.9 320V64L218 -64L0 64V278.3L87.6 233.2V116.2000000000001L221.1 40.7L356.9 116.2000000000001V267.2000000000001L255.8 324.8000000000001L343.4 377.9000000000001L443.9 320zM308.6 398.9L223.8 448L135.2 393.2L221.2 345.9L308.6 398.9z" /> + <glyph glyph-name="uniregistry" + unicode="" + horiz-adv-x="384" d=" M281.1 227.9H384V242.7H281.1V227.9zM281.1 265H384V277.4H281.1V265zM281.1 190.8H384V208.1H281.1V190.8zM123.4 104.1H8.5C11.1 95.6 14.3 87.3 18.1 79.3H156.4C143.5 85 132.3 93.5 123.4 104.1M269.1 116.5H378.8C380.6 123.8 381.9000000000001 131.2 382.7 138.8H278.3C276.2 130.9 273.1 123.4 269.1 116.5M227.6 79.4H367C370.7 87.4 372.8 95.6 375.5 104.2H260.5C251.7 93.5 240.4 85 227.6 79.4M384 416H281.1V413.5H384V416zM192 -32C231.5 -32 268.2 -20.2 298.8 0.2H85.3C115.8 -20.2 152.5 -32 192 -32M281.1 302.2H384V312H281.1V302.2zM281.1 339.3H384V346.7H281.1V339.3zM281.1 376.4H384V381.3H281.1V376.4zM102.9 277.4H0V265H102.9V277.4zM38.8 42.3H344.1C350.8 50.8 356.7000000000001 59.9 361.9000000000001 69.5H23C28.2 59.9 32.2 50.8 38.8 42.3M102.9 161.1V173.5H0V161.1C0 158.6 0 156.1 0.1 153.7000000000001H103.2C103 156.1 102.9 158.6 102.9 161.1M281.1 161.1C281.1 158.6 281 156.1 280.7 153.7000000000001H383.8C383.9 156.2000000000001 384 158.6 384 161.1V173.5H281.1V161.1zM78.1 5.1H305.8C317.6 13.8 328.5 23.7 338 34.8H44.9C54.5 23.8 66.3 13.8 78.1 5.1M102.9 381.3H0V376.4H102.9V381.3zM102.9 416H0V413.5H102.9V416zM102.9 242.7H0V227.9H102.9V242.7zM102.9 208.1H0V190.8H102.9V208.1zM102.9 312H0V302.1H102.9V312zM102.9 346.7H0V339.3H102.9V346.7zM105.7 138.8H1.3C2.2 131.2 3.5 123.8 5.2 116.5H114.9C110.9 123.4 107.7 130.9 105.7 138.8" /> + <glyph glyph-name="untappd" + unicode="" + horiz-adv-x="640" d=" M401.3 398.1C321.5 238 316.7000000000001 245.6 313.4 224.9L308.2 192.1C306.3 180.1 301.6 168.6 294.5 158.7000000000001L145.6 -49.1C138 -59.7 125.2 -65.3000000000001 112.2 -63.7C71.9 -58.7 34.4 -31.5000000000001 16.9 4.8C11.2 16.6 12.4 30.6 20 41.1999999999999L168.9 249.1C176 259 185.3 267.0999999999999 196.1 272.8L225.4 288.3C243.9 298.0999999999999 235.1 300.2 361 427.2C362 432 362 434.5 364.6 435.2C367.6 435.8999999999999 371.2000000000001 436.2 370.9000000000001 439.8L370.5000000000001 444.3999999999999C370.3000000000001 446.3 371.8000000000001 448 373.7000000000001 448C378.2000000000001 448.0999999999999 386.9000000000001 446.8 399.3000000000001 438C411.6000000000001 429.0999999999999 415.7000000000001 421.2 417.0000000000001 416.8999999999999C417.6000000000001 415.0999999999999 416.4000000000001 413.2 414.6000000000001 412.7L410.1000000000001 411.5999999999999C406.7000000000001 410.7 407.6000000000001 407.2 407.8000000000001 404.2C407.9000000000001 401.3999999999999 405.5000000000001 400.5999999999999 401.3000000000001 398.0999999999999zM230.1 411.6C233.5 410.7 232.6 407.2 232.4 404.2C232.2 401.5 234.5 400.7 238.8 398.2C246.7 382.3 254.1 367.7 261 354.2C261.7 352.9 263.3 352.7 264.3 353.7C275.5 365.7 288.9000000000001 379.9 304.8 396.3C306.1 397.7 306.2 399.8 304.9000000000001 401.2C296.9000000000001 409.4 288.4000000000001 418.1 279.3 427.3C278.3 432 278.3 434.6 275.7 435.3C272.7 436.1 269.1 436.3 269.4 439.9C269.7 443.2 270.8 448 266.6 448.1C262.1 448.2 253.4 447 241 438.1C228.7 429.2 224.6 421.3 223.3 417C221.9 412.8 226.9 412.4 230.1 411.6zM620 41.3L471.2 249.2C458 267.7 444.6 272.6 414.8 288.3C403.6 294.2 400.6 299.2 384.3 317.2C383.3 318.3 381.4000000000001 318.1 380.7 316.7C334.4 227.9 333.6 233.9 331.7 221.9C330 211.2 330.4 201.9 332 192.1C333.9 180.1 338.6 168.6 345.7 158.7L494.6 -49.2C502.2 -59.8000000000001 514.8000000000001 -65.4000000000001 527.7 -63.9C568 -59.0000000000001 605.7 -31.9 623.4000000000001 4.6999999999999C628.8000000000001 16.5999999999999 627.7 30.5999999999999 620.0000000000001 41.3z" /> + <glyph glyph-name="usb" + unicode="" + horiz-adv-x="640" d=" M641.5 192C641.5 188.9 639.8 185.9 637 184.5L547.9 131C546.5 130.2 545.1 129.6 543.4 129.6C542 129.6 540.3 129.9 538.9 130.7000000000001C536.1 132.4 534.4 135.2000000000001 534.4 138.5000000000001V174.1000000000001H295.7C321 134.5000000000001 336.2 67.2000000000001 365.3 67.2000000000001H392V94C392 99 395.9 102.9 400.9 102.9H490C495 102.9 498.9 99 498.9 94V4.9C498.9 -0.1 495 -4 490 -4H400.9C395.9 -4 392 -0.1 392 4.9V31.6H365.3C289.9 31.6 284.2000000000001 174.1 240.6 174.1H140.3C132.2 143.5 104.4 120.6 71.3 120.6C32 120.7 0 152.7 0 192S32 263.3 71.3 263.3C104.4 263.3 132.3 240.5 140.3 209.8C179.4 209.8 184.2 200.3 214.9 270.2000000000001C255 359.3 273 352.3 323.8 352.3C331.3 373.2 350.8 387.9 374.2 387.9C403.7 387.9 427.7 364 427.7 334.4S403.8 280.9 374.2 280.9C350.8 280.9 331.3 295.7000000000001 323.8 316.5H294C264.9 316.5 249.7 249.1 224.4 209.6H534.5V245.2C534.5 248.5 536.2 251.3 539 253C541.8 254.7 545.4 254.4 547.9 252.7L637 199.2C639.8 198.1 641.5 195.1 641.5 192z" /> + <glyph glyph-name="ussunnah" + unicode="" + horiz-adv-x="512" d=" M156.8 162.9L162.5 148.5H154.3C153 151.7 151.2 156.2 150.5 158C148 164.3 149.4 166.4 150.5 168C152.4 170.7 153.7 172.4 154.1 173.2C154.1 171 154.9 167.5 156.8 162.9zM454.1 144.1C452 130.3 448.4000000000001 117 443.6 104.4L486.6 81L441.8 99.8C436.5 86.6 429.8 74.2 421.9000000000001 62.6L456.1 32.4L419.3 58.8C410.9000000000001 47 401.3 36.2 390.6 26.5L415.5 -8.2L387.4 23.6C376.4 14 364.3 5.6 351.3 -1.5L367 -38.7L347.7 -3.4C334.5999999999999 -10.2 320.7 -15.5 306.0999999999999 -19.3L312.7999999999999 -57.6999999999999L302.2999999999999 -20.3C287.9999999999999 -23.6999999999999 273.0999999999999 -25.6 257.7999999999999 -25.6999999999999L256 -64L254.1 -25.6C238.8 -25.5 223.9 -23.6 209.6 -20.3L199 -57.6L205.7 -19.4C191.1 -15.7 177.1 -10.3 164 -3.6L144.8 -38.7L160.4 -1.7C147.4 5.3 135.2 13.6999999999999 124.2 23.4L96.3 -8.2L121 26.1999999999999C110.3 35.8999999999999 100.6 46.6999999999999 92.2 58.4999999999999L55.7 32.3L89.6 62.1999999999999C81.7 73.8 75 86.3 69.6 99.4999999999999L25.2 80.8L67.8 104C63 116.7 59.4 130.1 57.3 143.9L6.3 134.9L56.6 149.1C55.5 157.6 54.9 166.2 54.9 175C54.9 179.6999999999999 55.1 184.3999999999999 55.4 189.1L0 192L56 194.8C57.3 207.9 59.8 220.6 63.5 232.9L6.4 249L65.3 238.6C69.3 250.6 74.4 262.1 80.5 273L25.4 303L83.7 278.4C90 289 97.2 298.8 105.3 308L55.8 351.6L109.7 312.9C117.8 321.5 126.7 329.4 136.3 336.5L96.3 392.1L141.9 340.5C151.4 347.1 161.6 352.8 172.2 357.7L144.9 422.6L178.7 360.5C189.2 364.9 200.1 368.4 211.4 370.9L199 441.6L218.5 372.4C229.5 374.5 240.8 375.6 252.3 375.8L256 448L259.6 375.8C271.1 375.6 282.4000000000001 374.4 293.4000000000001 372.3L313 441.6L300.6 370.9C311.9000000000001 368.3 322.8 364.8 333.2000000000001 360.4L367.1 422.6L339.7000000000001 357.5C350.3000000000001 352.6 360.4000000000001 346.8 369.9000000000001 340.3L415.7000000000001 392.1L375.6 336.2C385.1 329.1 394 321.2 402.1 312.6L456.3 351.5L406.6 307.6C414.6 298.5 421.8 288.7 428.1 278.2L486.8 302.9L431.3 272.7C437.4000000000001 261.8 442.4000000000001 250.4 446.4000000000001 238.4L505.7 248.8L448.2000000000001 232.6C451.9 220.4 454.4 207.7 455.7 194.7L512 192L456 189.2C456.3 184.6 456.5 179.9 456.5 175.1C456.5 166.4 455.9 157.8 454.9 149.3L505.6 135L454.1 144.1zM432.3 175.1C432.3 272.6 353.3 351.6 255.8 351.6S79.3 272.6 79.3 175.1S158.3 -1.4 255.8 -1.4S432.3 77.6 432.3 175.1zM408.3 175.1C408.3 90.8 340 22.5 255.7 22.5S103.1 90.8 103.1 175.1S171.4 327.7000000000001 255.7 327.7000000000001S408.3 259.4000000000001 408.3 175.1zM195 207C195 204.9 196.3 203.2 198.6 201.9C201.9 200 204.8 197.3 206.8 193.7C209.6 199.4 211.1 203.2 211.1 204.9C211.1 207.1 210 209.3 207.9 211.9C205.8 214.4 204.7 217.1 204.6 219.6C198.1 212.8 195 208.7 195 207zM154.3 226C154.3 223.9 155.6 222.2 157.9 220.9C161.4 219 164.1 216.3 166.1 212.7C168.9 218.4 170.4 222.2 170.4 223.9C170.4 226.1 169.3 228.3 167.2 230.9C165.1 233.4 164 236.1 163.9 238.6C157.4 231.8 154.3 227.7 154.3 226zM135.3 226C135.3 223.9 136.6 222.2 138.9 220.9C142.2 219 145.1 216.3 147.1 212.7C149.9 218.4 151.4 222.2 151.4 223.9C151.4 226.1 150.3 228.3 148.2 230.9C146.1 233.4 145 236.1 144.9 238.6C138.5 231.8 135.3 227.7 135.3 226zM340.2000000000001 138.1C331.8000000000001 141.1 331.5000000000001 144.9 331.5000000000001 153.7000000000001V266C323.3000000000001 253.5 317.3000000000001 247.4 313.5000000000001 247.4C319.8000000000001 233 323.0000000000001 223.5 323.0000000000001 219.1V154.8C323.0000000000001 152.6 320.8000000000001 148.3 318.3000000000001 148.3H300.3000000000001C297.5000000000001 155.8 290.1000000000001 175.2 285.0000000000001 188.6C283.0000000000001 186.1 277.8000000000001 179.4 274.3000000000001 174.9C276.7000000000001 173.3 278.4000000000001 171.3 279.5000000000001 168.6C282.1000000000001 161.9 285.9000000000001 152.1 287.4000000000001 148.4H278.2000000000001C274.3000000000001 158.8 268.6 173.8 266.4000000000001 179.5000000000001C264.4000000000001 177.0000000000001 259.2000000000001 170.3000000000001 255.7000000000001 165.8000000000001C258.1 164.2000000000001 259.8000000000001 162.2000000000001 260.9000000000001 159.5000000000001C261.7000000000001 157.5000000000001 263.7000000000001 152.2000000000001 265.2000000000001 148.6000000000001H256C254.5 152.7000000000001 250.4 163.2000000000001 247.6 170.6000000000001C245.6 168.1000000000001 240.4 161.4000000000001 236.9 156.9000000000001C239.4 155.3000000000001 241.2 153.3000000000001 242.1 150.6000000000001C242.3 150.0000000000001 242.6 149.2000000000001 242.7 148.9000000000001H225C220.4 162.8000000000001 213.6 176.6000000000001 213.6 183.0000000000001C213.6 185.2000000000001 213.9 188.1000000000001 214.7 191.2000000000001C205.9 180.4000000000001 200.7 175.3000000000001 200.7 166.2000000000001C200.7 158.7000000000001 211.1 137.9000000000001 211.1 132.9000000000001C211.1 131.2000000000001 210.6 129.6000000000001 209.7 128.0000000000001C200.1 140.7000000000001 194.2 148.7000000000001 190.9 148.7000000000001H178.9L167.7 176.7000000000001C163.9 186.3000000000001 162 192.7000000000001 162 195.5000000000001C162 199.3000000000001 162.5 203.2000000000001 163.7 207.7000000000001C162.7 206.4000000000001 160 203.0000000000001 158.2 200.6000000000001C157.4 202.7000000000001 155.1 208.3000000000001 153.6 212.1000000000001C151.5 209.6000000000001 146.1 203.0000000000001 142.4 198.5000000000001C143.3 196.2000000000001 145.7 190.4000000000001 147.3 186.3000000000001C144.8 183.0000000000001 138.2 174.5000000000001 133.7 168.6000000000001C129.7 163.3000000000001 127.9 155.3000000000001 131 146.8000000000001C133.5 140.1000000000001 133 138.9000000000002 129.3000000000001 132.7000000000001H191C196.5 132.7000000000001 205.3 118.7000000000001 206.5 110.7000000000001C219.7 126.7000000000001 221.9 130.3000000000001 223.3 132.3000000000001H330.3C334.2 132.3000000000001 337.5 134.2000000000001 340.2 138.1000000000001zM360.3000000000001 164.7000000000001V266.3C351.3000000000001 253.8 344.4000000000001 247.7 339.6000000000001 247.7C346.7000000000001 233.3 350.3000000000001 223.8 350.3000000000001 219.4V153.1C350.3000000000001 135.6 358.9000000000001 132.7000000000001 374.3000000000001 132.7000000000001C382.4000000000001 132.7000000000001 386.8000000000001 133.5000000000001 388.0000000000001 135.4C383.7000000000001 137.0000000000001 380.4000000000001 137.9 378.1000000000001 138.7000000000001C370.0000000000001 141.9 360.3000000000001 146.1 360.3000000000001 164.7000000000001z" /> + <glyph glyph-name="vaadin" + unicode="" + horiz-adv-x="448" d=" M224.5 307.3C226 324.9 229.4 360 274.3 360H372.9C393.6 360 405 367.8 405 381.6V393.9C405 406.1 414.3 416 426.5 416S448 406.1 448 393.9V357.4C448 314.5 426.5 295.4 381.2 295.4H280.7C250.6 295.4 247.7 280.7000000000001 247.7 268.3C247.7 267 247.6 265.8 247.5 264.6C246.8 252.3 236.6 242.4000000000001 224.1 242.4000000000001S201.4 252.2000000000001 200.7 264.6C200.6 265.8 200.5 267 200.5 268.3C200.5 280.6 197.5 295.4 167.5 295.4H66.8C21.5 295.4 0 314.5 0 357.4V393.9C0 406.1 9.4 416 21.6 416S43.1 406.1 43.1 393.9V381.6C43.1 367.8 54.5 360 75.2 360H173.8C218.6 360 222.1 324.9 223.6 307.3H224.5zM224 -8C235.5 -8 245.4 -1 249.7 8.3C250.8 10.1 346.8 177.9 347.9 179.7000000000001C359.8 199.3000000000001 344.7 224.0000000000001 320.7 224.0000000000001C306.8 224.0000000000001 297.4 217.6000000000001 290.9 203.7000000000001L224 86L157.1 203.7C150.7 217.6 141.2 224 127.3 224C103.3 224 88.2 199.4 100.1 179.7C101.2 177.8 197.2 10.1 198.3 8.3C202.6 -1.0000000000001 212.5 -8.0000000000001 224 -8.0000000000001z" /> + <glyph glyph-name="viacoin" + unicode="" + horiz-adv-x="384" d=" M384 416H320L239.3 224H144.8L64 416H0L48 304H0V256H68.5L82.3 224H0V176H102.8L192 -32L281.2 176H384V224H301.7L315.5 256H384V304H336L384 416zM192 112L165 176H219L192 112z" /> + <glyph glyph-name="viadeo-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM280.7 66.8C238.3 20.6 160.7 20.2 118.3 66.8C50.3 140.4 98.5 262.9 199.5 262.9C212.8 262.9 226.1 260.8 238.6 256.2000000000001C234.3 247.8 231.3 238.6 230.2 229.1C220.5 233.2 210 235.1 199.5 235.1C150.7 235.1 114.9 193.4 114.9 146.2000000000001C114.9 103.2000000000001 143.4 67.5000000000001 184.4 60.3000000000001C245.9 84.3000000000001 257.3 177.9000000000001 257.3 235.3000000000001C257.3 242.6000000000001 257.3 250.1000000000001 256.7 257.4000000000001C245.5 290.3000000000001 230.1 322.0000000000001 212.5 351.9000000000001C239.6 333.6000000000001 254.4 289.4000000000001 256.7 257.8000000000001V257.4000000000001C264.4 234.9000000000001 268.5 211.2000000000001 268.5 187.4000000000001C268.5 133.3000000000001 246.6 88.4000000000001 200.2 59.2000000000001L197.8 59.0000000000001C247.8 58.0000000000001 284 97.6000000000001 284 146.2000000000001C284 158.4000000000001 281.9 170.5000000000001 277.1 181.9000000000001C286.6 183.8000000000001 295.6 187.5000000000001 303.5 192.4000000000001C318.8 155.8000000000001 316.1 105.1000000000001 280.7 66.8000000000001zM309 214.3C295.7 214.3 283.9 221.4 274.6 230.4C296.5 242.4 324.2000000000001 261.1 336.9000000000001 283.4C338.4000000000001 286.4 341.0000000000001 292 341.4000000000001 295.4C328.9000000000001 267.5 297.2000000000001 245.6 267.5 238.7C262.8 246 260 254.2 260 263C260 273.3 265.2 287.1 272.9 294.6C294.5 315.1 325.9 303.1 345.3 344.6C377.8 298.4 358.4 214.3 309 214.3z" /> + <glyph glyph-name="viadeo" + unicode="" + horiz-adv-x="448" d=" M276.2 297.5V296.8C258.3 349.4 233.6 400.2 205.4 448C248.7 418.8 272.4 348 276.2 297.5zM308.9 175.8C316.5 157.6 319.9 138.3 319.9 118.8C319.9 41.1 262.1 -22.2 182.1 -20.6L185.9 -20.3C260.1 26.4 295.2 98.3 295.2 184.8C295.2 222.9 288.7 260.7 276.3 296.8C277.3 285.1 277.3 273.1 277.3 261.4C277.3 169.6 259.2 19.8 160.7 -18.6C95 -7.2 49.4 50 49.4 118.8C49.4 194.4 106.8 261.1 184.8 261.1C201.6 261.1 218.5 258 233.9 251.5000000000001C235.6 266.6 240.4 281.4000000000001 247.3 294.8C227.4 302 206.1 305.5 184.8 305.5C23.3 305.5 -53.9 109.6 54.9 -8.2C122.8 -82.7999999999999 246.9 -82.1 314.7000000000001 -8.2C371.3000000000001 53.1 375.6 134.2000000000001 351.1 192.8C338.4000000000001 184.8 324 178.9 308.9000000000001 175.8zM418.1 436.3C387.1 369.8 336.8 389.1 302.3 356.2C289.9000000000001 344.2 281.7 322.2 281.7 305.7C281.7 291.6 286.2 278.6 293.7 266.9C341.1 277.9 392 312.9 411.9 357.6C411.2 352.1 407.1 343.2 404.7 338.4C384.4 302.7 340.1 272.8 305 253.5C319.8 239.1 338.7 227.7 360 227.7C439 227.7 470.1 362.3 418.1 436.3z" /> + <glyph glyph-name="viber" + unicode="" + horiz-adv-x="512" d=" M444 398.1C431.3 409.8 379.9 447.1 265.3 447.6C265.3 447.6 130.2 455.7 64.4 395.3C27.8 358.7 14.9 305 13.5 238.5C12.1 172 10.4 47.4 130.5 13.6H130.6L130.5 -38S129.7 -58.9 143.5 -63.1C160.1 -68.3000000000001 169.9 -52.4 185.8 -35.3C194.5 -25.9 206.5 -12.1 215.6 -1.6C297.8 -8.5 360.9000000000001 7.3 368.1 9.6C384.7000000000001 14.9999999999999 478.6 26.9999999999999 493.8 151.6C509.6 280.2 486.2 361.4 444 398.1zM457.9 161C445 57 368.9 50.4 354.9 45.9C348.9 44 293.4 30.2 223.7 34.7C223.7 34.7 171.7 -28 155.5 -44.3C150.2 -49.6 144.4 -49.1 144.5 -38.6C144.5 -31.7 144.9 47.1 144.9 47.1C144.8 47.1 144.8 47.1 144.9 47.1C43.1 75.3 49.1 181.4 50.2 236.9C51.3 292.4 61.8 337.9 92.8 368.5C148.5 419 263.2000000000001 411.5 263.2000000000001 411.5C360.1 411.1 406.5000000000001 381.9 417.3000000000001 372.1C453.0000000000001 341.5 471.2 268.3 457.9000000000001 161zM318.9 241.8C319.3 233.2 306.4 232.6 306 241.2C304.9 263.2000000000001 294.6 273.9000000000001 273.4 275.1C264.8 275.6 265.6 288.5 274.1 288C302 286.5 317.5 270.5 318.9 241.8zM339.2 230.5C340.2 272.9 313.7 306.1 263.4 309.8C254.9 310.4 255.8 323.3 264.3 322.7000000000001C322.3 318.5 353.2 278.6 352.1 230.2C352 221.6 339 222 339.2 230.5000000000001zM386.2 217.1C386.3 208.5 373.3 208.4 373.3 217C372.7 298.5 318.4000000000001 342.9 252.5 343.4C244 343.5 244 356.3 252.5 356.3C326.2 355.8 385.5 304.9 386.2 217.1zM374.9 119V118.8C364.1 99.8 343.9 78.8 323.1 85.5L322.9 85.8C301.8 91.7 252.1 117.3 220.7 142.3C204.5 155.1 189.7 170.2 178.3 184.7C168 197.6 157.6 212.9 147.5 231.3C126.2 269.8 121.5 287 121.5 287C114.8 307.8 135.7 328 154.8 338.8H155C164.1999999999999 343.6 173 342 178.9 334.9C178.9 334.9 191.3 320.1 196.5999999999999 312.8C201.5999999999999 306 208.2999999999999 295.1 211.7999999999999 289C217.8999999999999 278.1 214.0999999999999 267 208.0999999999999 262.4L196.0999999999999 252.8C190 247.9 190.7999999999999 238.8 190.7999999999999 238.8S208.5999999999999 171.5 275.0999999999999 154.5C275.0999999999999 154.5 284.2 153.7 289.0999999999999 159.8L298.7 171.8C303.3 177.8 314.3999999999999 181.6 325.3 175.5C340 167.2 358.7 154.3 371.1 142.6C378.1 136.9 379.7 128.2000000000001 374.9 119z" /> + <glyph glyph-name="vimeo-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM383.8 266.4C382.4000000000001 235.3 360.6 192.6 318.5 138.5C275 82 238.2 53.7 208.1 53.7C189.4 53.7 173.7 70.9 160.8 105.3C135.6 197.6 124.9 251.7 104.1 251.7C101.7 251.7 93.3 246.7 79 236.6L64 256C100.9 288.4 136.1 324.4 158.1 326.4C183 328.8 198.3 311.8 204.1 275.3C224.6 145.7000000000001 233.7 126.1 270.9 184.8C284.3 206 291.5 222 292.4 233.1C295.8 265.9000000000001 266.8 263.7000000000001 247.2 255.3C262.9 306.8 293 331.8 337.3 330.4C370.2 329.4 385.7 308 383.8 266.4z" /> + <glyph glyph-name="vimeo-v" + unicode="" + horiz-adv-x="448" d=" M447.8 294.4C445.8 250.8 415.4000000000001 191.1 356.4 115.3C295.5 36.1 244 -3.5 201.8 -3.5C175.7 -3.5 153.6 20.6 135.5 68.8C100.3 198 85.3 273.7 56.2 273.7C52.8 273.7 41.1 266.6 21 252.6L0 279.8C51.6 325.1 100.9 375.5 131.8 378.3C166.7 381.7000000000001 188.1 357.8 196.2 306.8C224.9 125.3 237.6 97.9 289.8 180.1C308.5 209.7 318.6 232.2 320 247.7C324.8 293.6 284.2 290.5 256.7 278.7000000000001C278.7 350.8 320.8 385.8 382.9 383.8C428.7 382.6 450.4 352.7000000000001 447.8 294.4z" /> + <glyph glyph-name="vimeo" + unicode="" + horiz-adv-x="448" d=" M403.2 416H44.8C20.1 416 0 395.9 0 371.2V12.8C0 -11.9 20.1 -32 44.8 -32H403.2C427.9 -32 448 -11.9 448 12.8V371.2C448 395.9 427.9 416 403.2 416zM377 267.2C375.6 235.7 353.6 192.5 311 137.8C267 80.6 229.7 51.9999999999999 199.3 51.9999999999999C180.4 51.9999999999999 164.5 69.3999999999999 151.4 104.3C125.9 197.6 115 252.3 94 252.3C91.6 252.3 83.1 247.2 68.6 237.1L53.4 256.7C90.7 289.5 126.3 325.9 148.6 327.9C173.8 330.3 189.3 313.1 195.1 276.2C215.8 145 225 125.1999999999999 262.7 184.6C276.2 206 283.5 222.3 284.5 233.5C288 266.7 258.6 264.4 238.7 255.9C254.6 308 285 333.3 329.9 331.9C363.2 331 378.9 309.4 377 267.2z" /> + <glyph glyph-name="vine" + unicode="" + horiz-adv-x="384" d=" M384 193.3V141.2C365.6 137 347.1 135.1 331.9 135.1C295 57.6999999999999 228.9 -8.7 206.8 -21.1C192.8 -29 179.7 -29.5 164.1 -20.3C137 -4 34.2 80.3 0 345.3H74.5C93.2 186.2 139 104.6 189.3 43.5C217.2 71.4 244.1 108.6 264.9 150.4C215.1 175.7 184.8 231.3 184.8 296C184.8 361.6 222.5 411.1 287 411.1C401.9 411.1 393.2 283.2 368.6 229.6C368.6 229.6 322.2000000000001 220.4 305.1 250.1C308.5 261.4 313.3 280.9 313.3 298.6C313.3 329.9 302 345.2 284.9000000000001 345.2C266.7000000000001 345.2 254.1 328.1 254.1 295.2C254.2 216 313.5 176.5 384 193.3z" /> + <glyph glyph-name="vk" + unicode="" + horiz-adv-x="576" d=" M545 330.3C548.7 342.8 545 352 527.2 352H468.3000000000001C453.3000000000001 352 446.4000000000001 344.1 442.7000000000001 335.3C442.7000000000001 335.3 412.7000000000001 262.2 370.3000000000001 214.8C356.6000000000001 201.1 350.3000000000001 196.7 342.8000000000001 196.7C339.1000000000001 196.7 333.4000000000001 201.1 333.4000000000001 213.6V330.3C333.4000000000001 345.3 329.2000000000001 352 316.8000000000001 352H224.2000000000001C214.8000000000001 352 209.2000000000001 345 209.2000000000001 338.5C209.2000000000001 324.3 230.4000000000001 321 232.6000000000001 281V194.2C232.6000000000001 175.2 229.2000000000001 171.7 221.7000000000001 171.7C201.7000000000001 171.7 153.1000000000001 245.1 124.3000000000001 329.1C118.5000000000001 345.4 112.8000000000001 352 97.7000000000001 352H38.8C22 352 18.6 344.1 18.6 335.3C18.6 319.7 38.6 242.2 111.7 139.8C160.4 69.9 229 32 291.4 32C328.9 32 333.5 40.4 333.5 54.9C333.5 121.7 330.1 128 348.9 128C357.6 128 372.6 123.6 407.6 89.9C447.6 49.9 454.2 32 476.6 32H535.5C552.3 32 560.8 40.4 555.9 57C544.6999999999999 91.9 469 163.7 465.6 168.5C456.9 179.7 459.4 184.7 465.6 194.7C465.7 194.8 537.5999999999999 296 545 330.3z" /> + <glyph glyph-name="vnv" + unicode="" + horiz-adv-x="640" d=" M104.9 96C70.8 96 58.5 126.4 58.5 126.4L2.6 237.9S-7.8 256 13 256H45.8C56.2 256 59 247.3 64.6 237.9L101.3 163.4S106.5 150.3 122.4 150.3S143.5 163.4 143.5 163.4L180.2 237.9C185.8 247.4 188.6 256 199 256H231.8C252.6 256 242.2 237.9 242.2 237.9L186.4 126.4S174.2 96 140 96H104.9zM499.9 96C465.8 96 453.5 126.4 453.5 126.4L397.6 237.9S387.2 256 408 256H440.8C451.2 256 454 247.3 459.6 237.9L496.3 163.4S501.5 150.3 517.4 150.3S538.5 163.4 538.5 163.4L575.3 237.9C580.9 247.4 583.6999999999999 256 594.0999999999999 256H627C647.8 256 637.4 237.9 637.4 237.9L581.5 126.4S569.3 96 535.1 96H499.9zM337.6 256C371.7000000000001 256 384 225.6 384 225.6L439.9 114.1S450.3 96 429.5 96H396.7C386.3 96 383.5 104.7 377.9 114.1L341.2 188.6S336 201.7 320.1 201.7C304.2 201.7 299 188.6 299 188.6L262.3 114.1C256.7 104.7000000000001 253.9 96 243.5 96H210.5999999999999C189.7999999999999 96 200.1999999999999 114.1 200.1999999999999 114.1L256.0999999999999 225.6S268.2999999999999 256 302.4999999999999 256H337.5999999999999z" /> + <glyph glyph-name="vuejs" + unicode="" + horiz-adv-x="448" d=" M356.9 383.7H280L224 295.1L176 383.7000000000001H0L224 0L448 383.7H356.9zM55.7 351.7H109.5L224 153.5L338.4 351.7H392.2L224 63.5L55.7 351.7z" /> + <glyph glyph-name="weibo" + unicode="" + horiz-adv-x="512" d=" M407 270.4C414.6 294.4 393.6 317.2 369.6 312.1C347.6 307.3 340.8 340.2000000000001 362.5 344.9000000000001C412.6 355.8 454.8 307.8 439 260.1C432.2 238.9000000000001 400.2 249.3 407 270.4000000000001zM214.8 1.3C108.5 1.3 0 52.7 0 137.6C0 181.9 28 233.0000000000001 76.3 281.3C176 381 279.5 382.2 249.9 287C245.9 273.9 262.2 281.3 262.2 281C341.7 314.6 402.7 297.8 376.2 229.6C372.5 220.2 377.3 218.7 384.5 216.5C520.2 174.2 419.3 1.3 214.8 1.3zM358.5 147.6C353.1 203.3 280 241.6 195.1 233.3C110.3 224.7 46.3 173 51.7 117.3S130.2 23.3 215.1 31.6C299.9 40.2 363.9 91.9 358.5 147.6zM347.9 412.9C322 407.3 331.1 369.2 356.2 374.6C428.5 389.8 491 321.8 467.9 250.6C460.5 226.4 497 213.6 505.3 238.6C537.1999999999999 338.4 450.2 434.5 347.9 412.9zM269.4 101.9C252.3 63.1 202.6 41.9 160.3 55.6C119.5 68.7 102.3 108.9999999999999 120 145.3C137.7 180.6999999999999 183.1 200.7 223.4 190.4C265.4 179.6 286.5 140.2 269.4 101.9zM183.1 131.9C170.2 137.3 153.1 131.6 145.1 119C136.8 106.1 140.8 91 153.7 85C166.8 79 184.5 84.7 192.8 97.9C200.8 111 196.5 126.2 183.1 131.9zM215.7 145.3C210.6 147 204.3 144.6999999999999 201.4 139.9C198.5 134.8 200 129.3 205.0999999999999 127C210.1999999999999 125 216.7999999999999 127.3 219.6999999999999 132.4C222.5 137.6 220.7999999999999 143.3 215.6999999999999 145.3z" /> + <glyph glyph-name="weixin" + unicode="" + horiz-adv-x="576" d=" M385.2 280.4C391.6 280.4 397.8 280.1 404 279.3C387.4 357.7 303.3 416 207.7 416C100.5 416 13 343.2 13 250.6C13 197.2 42.3 153.1 90.9 119L71.6 60.4L139.6 94.5C164 89.7 183.4 84.8 207.8 84.8C214 84.8 219.9 85.1 226.1 85.6C222.1 98.5 219.9 112.2000000000001 219.9 126.4C219.8000000000001 211.3000000000001 292.8000000000001 280.4000000000001 385.2000000000001 280.4000000000001zM280.7 333.3C295.2 333.3 304.9 323.6 304.9 308.9C304.9 294.4 295.2 284.7000000000001 280.7 284.7000000000001C265.9 284.7000000000001 251.4 294.4 251.4 308.9C251.5 323.6 266 333.3 280.7 333.3zM144.3 284.7000000000001C129.8 284.7000000000001 115 294.4 115 308.9C115 323.7 129.8 333.3 144.3 333.3C159.1 333.3 168.7 323.6 168.7 308.9C168.7 294.3 159.1 284.7000000000001 144.3 284.7000000000001zM563 128.6C563 206.5 485.1 269.9000000000001 397.6 269.9000000000001C304.9000000000001 269.9000000000001 232.2 206.5 232.2 128.6S305 -12.7 397.6 -12.7C416.9000000000001 -12.7 436.5 -7.6 456.2 -2.8L509.6 -32.1L494.8 16.5C534 45.9 563 84.8 563 128.6zM343.9 153.1C334.2 153.1 324.6 162.8 324.6 172.7000000000001C324.6 182.4 334.3 192.0000000000001 343.9 192.0000000000001C358.7 192.0000000000001 368.3 182.3000000000001 368.3 172.7000000000001C368.3 162.7000000000001 358.6 153.1 343.9 153.1zM451 153.1C441.3 153.1 431.7 162.8 431.7 172.7000000000001C431.7 182.4 441.4 192.0000000000001 451 192.0000000000001C465.5 192.0000000000001 475.4 182.3000000000001 475.4 172.7000000000001C475.5 162.7000000000001 465.5 153.1 451 153.1z" /> + <glyph glyph-name="whatsapp-square" + unicode="" + horiz-adv-x="448" d=" M224 325.2C151.3 325.2 92.2 266.1 92.1 193.4C92.1 168.5 99.1 144.2 112.3 123.3L115.4 118.3L102.1 69.6999999999999L152 82.8L156.8 79.9C177 67.9 200.2 61.5 223.9 61.5H224C296.6 61.5 357.3 120.6 357.3 193.3C357.3 228.5 342.1 261.6 317.2 286.5C292.2 311.5 259.2 325.2 224 325.2zM301.5 136.8C298.2 127.5 282.4 119.1 274.8 118C262.2 116.1 252.4 117.1 227.3 127.9C187.6 145.1 161.6 185.1 159.6 187.7C157.6 190.3 143.4 209.2 143.4 228.7S153.6 257.8 157.3000000000001 261.8C160.9 265.8 165.2000000000001 266.8 167.9 266.8C170.5 266.8 173.2000000000001 266.8 175.5 266.7C177.9 266.6 181.2 267.6 184.4 259.9C187.7000000000001 252 195.6 232.5 196.6 230.5S198.3 226.2 196.9 223.6C189.3000000000001 208.4 181.2000000000001 209 185.3000000000001 202C200.6000000000001 175.7 215.9 166.6 239.2000000000001 154.9C243.2000000000001 152.9 245.5000000000001 153.2 247.8000000000001 155.9C250.1000000000001 158.5 257.7000000000001 167.5 260.3000000000001 171.4C262.9000000000001 175.4 265.6000000000001 174.7 269.2000000000001 173.4C272.8000000000001 172.1 292.3000000000001 162.5 296.3000000000001 160.5S302.9000000000001 157.5 303.9000000000001 155.9C304.8000000000001 154 304.8000000000001 146 301.5000000000001 136.8zM400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM223.9 34.8C197.3 34.8 171.2 41.5 148.1 54.1L64 32L86.5 114.2C72.6 138.2 65.3 165.5 65.3 193.5C65.4 280.9 136.5 352 223.9 352C266.3 352 306.1 335.5 336.1 305.5C366 275.5 384 235.7 384 193.3C384 105.9 311.3 34.8 223.9 34.8z" /> + <glyph glyph-name="whatsapp" + unicode="" + horiz-adv-x="448" d=" M380.9 350.9C339 392.9 283.2 416 223.9 416C101.5 416 1.9 316.4 1.9 194C1.9 154.9 12.1 116.7 31.5 83L0 -32L117.7 -1.1C150.1 -18.8 186.6 -28.1 223.8 -28.1H223.9C346.2 -28.1 448 71.5 448 193.9C448 253.2 422.8 308.9 380.9 350.9zM223.9 9.3C190.7 9.3 158.2 18.1999999999999 129.9 34.9999999999999L123.2 38.9999999999999L53.4 20.6999999999999L72 88.8L67.6 95.8C49.1 125.2 39.4 159.1 39.4 194C39.4 295.7 122.2 378.5 224 378.5C273.3 378.5 319.6 359.3 354.4 324.4C389.2 289.5 410.6 243.2 410.5 193.9C410.5 92.1 325.6 9.3 223.9 9.3zM325.1 147.5C319.6 150.3 292.3 163.6999999999999 287.2 165.5C282.1 167.3999999999999 278.4 168.3 274.7 162.6999999999999C271 157.0999999999999 260.4 144.6999999999999 257.1 140.8999999999999C253.9 137.1999999999999 250.6 136.6999999999999 245.1 139.5C212.5 155.8 191.1 168.6 169.6 205.5C163.9 215.3 175.3 214.5999999999999 185.9 235.8C187.7 239.5 186.8 242.7 185.4 245.5C184 248.3 172.9 275.5999999999999 168.3 286.7C163.8 297.5 159.2 296 155.8 296.2C152.6 296.3999999999999 148.9 296.3999999999999 145.2 296.3999999999999C141.5 296.3999999999999 135.5 294.9999999999999 130.4 289.4999999999999C125.3 283.8999999999999 111 270.4999999999999 111 243.2C111 215.8999999999999 130.9 189.5 133.6 185.8C136.4 182.1 172.7 126.1 228.4 101.9999999999999C263.6 86.8 277.4 85.4999999999999 295 88.1C305.7 89.7 327.8 101.4999999999999 332.4 114.5C337 127.5 337 138.6 335.6 140.8999999999999C334.3 143.3999999999999 330.6 144.7999999999999 325.1 147.5z" /> + <glyph glyph-name="whmcs" + unicode="" + horiz-adv-x="448" d=" M448 287V308.3L419.5 317.1L417.3 327.5L437.4000000000001 348.2000000000001L427 367.6L398 360.1L390.8 367.6L398.3 395.8L379.2 407.4L357.9 386.4L347.2 389.6L340.2 416H317.6L311.4 389.6L299.3 386.4L279.6 407.4L260.2 396.4L268.3 368.7L260.2 360.3L231.7 367.8L220.7 348.7L241.4 327.7L238.5 317.3L210 309.5L209.7 287.8L238.5 280.3L240.9 268.2L220.8 248.3L231.2 229.8L260.8 237.3L268 228.7L259.9 201.8L279.8 190.2L299.2 210.6L310.8 207.7L317.5 179.2L340.1 178.9L346.8 207.7L358.4 211.2L379.1 189.6L399.5 201.7L390.7 229.7L398.5 237.8L427.3 229L437.6 249.1L416.7 267.9L418.9 280L448 287zM328.8 241.8C297.5 241.8 272 267.2000000000001 272 298.6S297.4 355.4000000000001 328.8 355.4000000000001S385.6 330 385.6 298.6C385.6 267.1 360.2000000000001 241.8 328.8 241.8zM401.1 225.4L448 210.9V171L392.9 157.6L388.8 134.9L427.7 99.6L408.5 61.7000000000001L354.5 78.4L339.8999999999999 63.2000000000001L356.5999999999999 10.7L318.2999999999999 -11.9999999999999L279.3999999999999 28.5000000000001L257.7 21.9L245.1 -32.1L202.6999999999999 -31.6L190.0999999999999 22.0000000000001L168.4 27.6000000000001L132 -10.7999999999999L94.5999999999999 10.9000000000001L109.7999999999999 61.4000000000001L96.0999999999999 77.5000000000001L40.5999999999999 63.4000000000001L20.8999999999999 98.2000000000001L58.7999999999999 135.6000000000001L53.9999999999999 158.4000000000001L-1e-13 172.5000000000001L0.4999999999999 213.4000000000001L54 228.1L59.7 247.8L20.8 287.2L41.5 323L95.1 308.9L110.3 324.6L95.1 376.6L131.5 397.3L168.3 357.9L191 364L202.6 416H245L256.6 370.1L234 376L227.7 377.7L224.4 372L213.4 352.9L210.1 347.3L214.7 342.7000000000001L231.9 325.3L231.6 324.3L207.7999999999999 317.8L201.5999999999999 316.1L201.5 309.7000000000001L201.3 296.8C153.8 286.4 118 244 118 193.3C118 135 165.3 87.6 223.7 87.6C274.2 87.6 316.4 123 326.9 170.4L340.1 170.2000000000001L347 170.1L348.6 176.8L354.2 200.8L356.1 201.4L373.2 183.6L377.9 178.7000000000001L383.7 182.1L404.1 194.2L409.9 197.7L407.9 204.2L401.1 225.4z" /> + <glyph glyph-name="wikipedia-w" + unicode="" + horiz-adv-x="640" d=" M640 396.8L639.7 384.6C611.6 383.8 594.7 368.8 583.9000000000001 344.3C558.9000000000001 286.5 480.6000000000001 104.3 428.6000000000001 -14.3H415L333.1 178.8C300.6 115.1999999999999 264.8 48.8 233.9000000000001 -14.3000000000001C233.6 -14.6000000000001 218.9 -14.3000000000001 218.9 -14.0000000000001C172 95.7 122.8 204.6 75.8 314.6C64.4 341.3 26.4 384.6 0.2 384.3C0.2 387.4 -0.1 394.3 -0.1 398.5H161.8V384.6C142.6 383.5 109 371.3 118.5 350.4C140.4 300.7 222.1 110.1 244.1 61.8C259.1 91.4999999999999 301.9000000000001 171 319.4000000000001 204.6C305.5000000000001 232.9 260.8 338.5 246.6 364.6C236.9000000000001 382.4 210.5 384 190.8 384.3V398.2L333.3 397.9V384.8C313.9000000000001 384.2 295.2 377 303.9000000000001 358.7C322.8 318.7 334.5000000000001 290.6 352.0000000000001 254C357.6000000000001 264.8 386.7000000000001 323.4 400.1000000000001 354.8C409.0000000000001 375.4 396.2000000000001 383.4 361.5000000000001 384.2C361.8000000000001 387.8 361.5000000000001 394.5 361.8000000000001 397.8C406.2000000000001 398.1 472.9000000000001 398.1 484.9000000000001 398.4V384.8C462.4000000000001 384 439.1000000000001 372 426.8000000000001 353.1L367.6000000000001 230.3C374.0000000000001 214.2 430.9000000000001 87.5 436.8000000000001 73.6L559.2 356.2C550.6 379.3 522.8000000000001 384.3 512 384.5V398.4L639.8 397.3L640 396.8z" /> + <glyph glyph-name="windows" + unicode="" + horiz-adv-x="448" d=" M0 354.3L183.6 379.6V202.2H0V354.3zM0 29.7L183.6 4.4V179.6H0V29.7zM203.8 1.7L448 -32V179.6H203.8V1.7zM203.8 382.3V202.2H448V416L203.8 382.3z" /> + <glyph glyph-name="wordpress-simple" + unicode="" + horiz-adv-x="512" d=" M256 440C119.3 440 8 328.8 8 192C8 55.3 119.3 -56 256 -56S504 55.3 504 192C504 328.8 392.7 440 256 440zM33 192C33 224.3 39.9 255 52.3 282.7L158.7 -8.7C84.3 27.5 33 103.8 33 192zM256 -31C234.1 -31 213 -27.8 193 -21.9L259.9 172.5L328.4 -15.3C328.9 -16.4 329.4 -17.4 330 -18.4C306.9 -26.5000000000001 282 -31.0000000000001 256 -31.0000000000001zM286.7 296.5C300.1 297.2 312.2 298.6 312.2 298.6C324.2 300 322.8 317.7 310.8 317C310.8 317 274.7 314.2 251.4 314.2C229.5 314.2 192.7 317 192.7 317C180.7 317.7 179.3 299.3 191.3 298.6C191.3 298.6 202.7 297.2 214.7 296.5L249.4 201.3L200.6 55L119.4 296.5C132.8 297.2 144.9 298.6 144.9 298.6C156.9 300 155.5 317.7 143.5 317C143.5 317 107.4 314.2 84.1 314.2C79.9 314.2 75 314.3 69.7 314.5C109.6 375 178.1 415 256 415C314 415 366.9 392.8 406.6 356.5C405.6 356.6 404.7000000000001 356.7 403.7000000000001 356.7C381.8000000000001 356.7 366.3000000000001 337.6 366.3000000000001 317.1C366.3000000000001 298.7 376.9000000000001 283.2 388.2000000000001 264.8C396.7000000000001 250 406.6 230.9 406.6 203.3C406.6 184.2 399.3 162.1 389.6 131.2000000000001L367.4000000000001 56.9L286.7000000000001 296.5zM368.1 -0.7L436.2000000000001 196.2C448.9000000000001 228.0000000000001 453.2 253.4000000000001 453.2 276.1C453.2 284.3 452.7 291.9000000000001 451.7 299C469.1 267.2000000000001 479.0000000000001 230.8 479.0000000000001 192C479.0000000000001 109.7000000000001 434.4000000000001 37.9 368.1 -0.6999999999999z" /> + <glyph glyph-name="wordpress" + unicode="" + horiz-adv-x="512" d=" M61.7 278.6L163.2 0.6C92.2 35 43.3 107.8 43.3 192C43.3 222.9 49.9 252.1 61.7 278.6zM399.6 202.7C399.6 229 390.2 247.2 382.1 261.4C371.3 278.9 361.2 293.8 361.2 311.3C361.2 330.9 376 349.1 396.9 349.1C397.8 349.1 398.7 349 399.7 348.9C361.8 383.6 311.4 404.8 256 404.8C181.7 404.8 116.3 366.7 78.2 308.9C83.2 308.7 87.9 308.6 91.9 308.6C114.1 308.6 148.6 311.3 148.6 311.3C160.1 312 161.4 295.1 150 293.8C150 293.8 138.5 292.5 125.7 291.8L203.2 61.4L249.8 201L216.7 291.8C205.2 292.5 194.4 293.8 194.4 293.8C182.9 294.5 184.3 312 195.7 311.3C195.7 311.3 230.8 308.6 251.7 308.6C273.9000000000001 308.6 308.4000000000001 311.3 308.4000000000001 311.3C319.9000000000001 312 321.2000000000001 295.1 309.8 293.8C309.8 293.8 298.3 292.5 285.5 291.8L362.4 63.1L383.6 134C392.6 163.4 399.6 184.5 399.6 202.7zM259.7 173.4L195.8999999999999 -12.1C214.9999999999999 -17.7 235.0999999999999 -20.8 255.9999999999999 -20.8C280.7999999999999 -20.8 304.4999999999999 -16.5 326.5999999999999 -8.7C325.9999999999999 -7.8 325.4999999999999 -6.8 325.0999999999999 -5.8L259.7 173.4zM442.7 294.1C443.5999999999999 287.3 444.0999999999999 280.1 444.0999999999999 272.2C444.0999999999999 250.6 440.0999999999999 226.4 427.8999999999999 196L362.8999999999999 8.0999999999999C426.2 45 468.7 113.5 468.7 192C468.7 229 459.3 263.8 442.7 294.1zM504 192C504 55.2 392.7 -56 256 -56C119.2 -56 8 55.3 8 192C8 328.8 119.2 440 256 440C392.7 440 504 328.8 504 192zM492.6 192C492.6 322.5 386.4000000000001 428.6 256 428.6C125.5 428.6 19.4 322.5 19.4 192S125.6 -44.6 256 -44.6C386.5 -44.6 492.6 61.5 492.6 192z" /> + <glyph glyph-name="wpbeginner" + unicode="" + horiz-adv-x="512" d=" M462.799 125.626C519.01 61.318 466.961 -32 370.944 -32C331.3420000000001 -32 292.12 -14.313 270.802 18.04C263.915 17.684 248.1 17.684 241.212 18.04C219.848 -14.381 180.588 -32 141.069 -32C45.579 -32 -7.279 60.996 49.214 125.626C-29.925 257.477 80.479 416 256.006 416C431.638 416 541.876 257.374 462.799 125.626zM123.152 208.598H164.681V266.673H123.152V208.598zM340.332 122.526V146.365C279.826 125.4499999999999 207.977 137.167 152.743 180.336L152.989 155.439C204.09 109.072 284.735 97.564 340.332 122.526zM189.579 208.598H355.637V266.673H189.579V208.598z" /> + <glyph glyph-name="wpexplorer" + unicode="" + horiz-adv-x="512" d=" M512 192C512 50.8 397.3 -64 256 -64C114.8 -64 0 50.7 0 192S114.7 448 256 448S512 333.3 512 192zM480 192C480 315.2 379.7 416 256 416C132.5 416 32 315.5 32 192S132.5 -32 256 -32S480 68.5 480 192zM160.9 323.4L247.8 286.3L210.7 199.4L123.8 236.5L160.9 323.4zM270.9 154.3L317.5 60.3H302.9L252.9 160.3L204 60.3H190L241.1 167.2000000000001L218.8 176.6L224.8 190.6L293.4 161.5L287.4 147.2L270.9 154.3zM259.1 270.6L327.7 241.2L298.3 172.9L230 202L259.1 270.6zM339.4 227.7L394 204.6L370.6 150.3L316.3 173.4L339.4000000000001 227.7000000000001z" /> + <glyph glyph-name="wpforms" + unicode="" + horiz-adv-x="448" d=" M448 372.8V11.1C448 -13.2 429 -32.1 404.8 -32.1H43.2C19.3 -32 0 -13.4 0 11.2V372.8C0 396.9 18.8 416 43.2 416H404.9C428.9 416 448 397.2 448 372.8zM410.7 11.2V372.8C410.7 375.8 408.1 378.6 404.9 378.6H395.6L285.3 304L224 353.9L162.8 304L52.5 378.7H43.2C40 378.7 37.4 375.9 37.4 372.9V11.2C37.4 8.2 40 5.4 43.2 5.4H404.9C408.1 5.3 410.7 8.1 410.7 11.2zM150.2 262V225H76.7V262H150.2zM150.2 187.6V150.3H76.7V187.6H150.2zM161.3 334.9000000000001L215.3 378.6H96.8L161.3 334.9000000000001zM371.3 262V225H175.3V262H371.3zM371.3 187.6V150.3H175.3V187.6H371.3zM286.7 334.9000000000001L351.2 378.6H232.8L286.7 334.9000000000001zM371.3 113V75.7H271.9V113H371.3z" /> + <glyph glyph-name="xbox" + unicode="" + horiz-adv-x="512" d=" M369.9 129.8C414.2 75.5 434.6 31 424.3 11.1C416.4 -4 367.6 -33.5 331.7 -44.8C302.0999999999999 -54.1 263.3 -58.1 231.3 -54.9999999999999C193.0999999999999 -51.3 154.3999999999999 -37.6 121.1999999999999 -15.9999999999999C93.3 2.2 87 9.7 87 24.6C87 54.5 119.9 106.9 176.2 166.7000000000001C208.2 200.6000000000001 252.7 240.4000000000001 257.6 239.3000000000001C267 237.2000000000001 341.9000000000001 164.2000000000001 369.9000000000001 129.8000000000001zM188.6 304.2C158.9 331.1 130.5 358.1 102.2 367.6C87 372.7 85.9 372.4 73.5 359.5C44.3 329.1 20 279.8 13.2 237.1C7.8 202.9 7.1 193.3 9 176.6C14.6 126.1 26.3 91.2000000000001 49.5 55.7C59 41.1 61.6 38.4 58.8 45.8000000000001C54.6 56.8000000000001 58.5 83.3000000000001 68.3 109.8000000000001C82.6 148.8000000000001 122.2 222.7000000000001 188.6 304.2000000000001zM500.2 240.7C483.3 320.7 432.7 371 425.6 371C418.3 371 401.4000000000001 364.5 389.6 357.1C366.3 342.6 348.6 325.7 325.3 304.3C367.7 251 427.5 164.9 448.2 102C455 81.3 457.9 60.9 455.6 49.7C453.9 41.2 453.9 41.2 456.9999999999999 45.1C463.1 52.8 476.8999999999999 76.4 482.3999999999999 88.6C489.7999999999999 104.8 497.3999999999999 128.8 500.9999999999999 147.3C505.3 169.8 504.8999999999999 218.1 500.1999999999999 240.7zM141.3 405C189 407.5 251 370.5 255.6 369.6C256.3 369.5 266 373.8 277.2 379.3C341.1 410.4 371.2 405.1 384.6 404.5C320.7000000000001 443.8 231.9000000000001 454.5 150.7 416.2C127.3 405.1 126.7 404.3 141.3 405z" /> + <glyph glyph-name="xing-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM140.4 127.8H93.8C88.3 127.8 85.1 133.1 87.8 138.1L137.1 224.8C137.2 224.8 137.2 224.9 137.1 225L105.7 279C102.7 284.6 105.9 289.1 111.7 289.1H158.3C163.5 289.1 167.8 286.2 171.2 280.4L203.1 225.1C201.8 222.8 185.1 193.4 153 136.9C149.5 130.7000000000001 145.3 127.8 140.4 127.8zM360.1 341.9L257.3 161.2V161L322.8 42C325.6 36.9 322.9000000000001 31.9 316.8 31.9H270.2C264.7 31.9 260.5 34.8 257.3 40.6L191.3 160.9C193.6 165 228.1 225.8 294.7000000000001 343.2C298.0000000000001 349 302.1 351.9 307.2000000000001 351.9H354.1C359.8 352 362.9000000000001 347.2 360.1 341.9z" /> + <glyph glyph-name="xing" + unicode="" + horiz-adv-x="384" d=" M162.7 238C160.9 234.7 137.5 193.6 92.6 114.5C87.7 106.2 81.8 102 74.9 102H9.8C2.1 102 -2.3 109.5 1.3 116.4L70.3 237.7C70.5 237.7 70.5 237.8 70.3 238L26.4 313.6C22.1 321.4 26.7 327.7 34.9 327.7H100C107.3 327.7 113.3 323.6 118 315.5L162.7 238zM382.6 401.9L238.6 148.9V148.6L330.2 -18C334.1 -25.1 330.4 -32.1 321.7 -32.1H256.5C248.9 -32.1 242.9 -28.1 238.5 -19.9L146.1 148.6C149.4 154.4 197.6 239.4 290.9 403.8C295.5 411.9 301.3 416 308.4 416H374.1C382.1 416 386.4 409.3 382.6 401.9z" /> + <glyph glyph-name="y-combinator" + unicode="" + horiz-adv-x="448" d=" M448 416V-32H0V416H448zM236 160.5L313.5 306H280.8L235 215C230.3 205.7 226 196.7 222.2 188.2L210 215L164.8 306H129.8L206.5 162.2V67.7H236V160.5z" /> + <glyph glyph-name="yahoo" + unicode="" + horiz-adv-x="448" d=" M252 156L256 -64C243.3 -61.8 232.5 -60.1 223.7 -60.1C215.3 -60.1 204.5 -61.8 191.4 -64L195.4 156C140.4 250.8 85 352.8 21.4 448C33.3 444.9 44.4 444.1 54.6 444.1C63.6 444.1 75 444.9 88.7 448C129.6 375.8 170.8 309.3 223.7 222.5C261 284.1 314.8 366.6 358.6 448C369.7000000000001 445.1 380.6 444.1 391.5 444.1C403 444.1 414.7 445.1 426.5 448C392.1 400.1 294.9 231.1 252 156z" /> + <glyph glyph-name="yandex-international" + unicode="" + horiz-adv-x="320" d=" M129.5 -64V102.1L18.5 400H74.3L156.1 170.3L250.2 448H301.5L180.8 100.2V-64H129.5z" /> + <glyph glyph-name="yandex" + unicode="" + horiz-adv-x="256" d=" M153.1 132.2L65.7 -64H2L98 145.8C52.9 168.7 22.8 210.2 22.8 286.9C22.7 394.3 90.8 448 171.7 448H254V-64H198.9V132.2H153.1zM198.9 401.5H169.5C125.1 401.5 82.1 372.1 82.1 286.9C82.1 204.6 121.5 178.1 169.5 178.1H198.9V401.5z" /> + <glyph glyph-name="yelp" + unicode="" + horiz-adv-x="384" d=" M136.9 120C135.9 119.7 27.7 84.3 21.1 84.3C5.9 85.2 2.6 100.5 1.2 115.5C-0.3 129.7 -0.2 145.3 1.5 162.3C3.4 181.1 7 207.4 25.7 206.3C30.5 206.3 92.8 180.4 138.4 161.9C155.5 155.1 157 126.1 136.9 120.0000000000001zM194.8 233.9C196.6 195.7 169.3 185.4 147.6 219.6L41.3 387.6C39.8 394.2 41.6 400 46.6 405C62.2 421.5 146 444.8 168.1 439.1C175.6 437.2 180.2 433 181.9 426.5C183.2 418.2 193.4 259.1 194.8 233.9zM193.4 69.1C193.4 64.5 193.6 -47.3 191.7 -52.4C189.4 -58.4 184.7 -62.1 177.4 -63.6C167.3 -65.2999999999999 150.3 -61.7 126.4 -52.9C104.4 -44.8 69.7 -31.4 77.1 -10.4C79.9 -3.5 128.5 52.4 154.4 83.2000000000001C166.4 98.4 194.2 88.7000000000001 193.4 69.1zM373.6 186.9C368 183.2000000000001 262.8 158.7000000000001 255.5000000000001 156.3L255.8000000000001 156.9C237.7000000000001 152.2000000000001 220.4 175.4 232.5000000000001 191.5000000000001C236.2 195.2000000000001 298.4000000000001 283.9000000000001 305.3 288.5000000000001C310.5 292.1 316.6 292.3000000000001 323.6 289.1C342 280.3000000000001 378.7000000000001 226.0000000000001 381 204.5000000000001C380.9 201.6000000000001 382.2 192.8000000000001 373.6 186.9zM383.7000000000001 56.2C381.0000000000001 35.6 339.2000000000001 -17.1999999999999 319.9000000000001 -24.8C313.0000000000001 -27.4 307.0000000000001 -26.8 302.2000000000001 -22.8C297.2000000000001 -19.3 240.4000000000001 74.3000000000001 237.3000000000001 79.5000000000001C226.4000000000001 95.7000000000001 244.1000000000001 119.3000000000001 262.9000000000001 112.7000000000001C262.9000000000001 112.7000000000001 373.4000000000001 77.0000000000001 377.6 73.3000000000001C382.8 69.2000000000001 384.8 63.5000000000001 383.7000000000001 56.2z" /> + <glyph glyph-name="yoast" + unicode="" + horiz-adv-x="448" d=" M91.3 372H277.3L270.3 353.1H91.3C51.6 353.1 19.4 321.5 19.4 282.8V77.4C19.4 42 44.3 7.1 103.4 7.1V-12H91.3C41.2 -12 0 28.2 0 77.5V282.8C0 332.1 40.7 372 91.3 372zM320.4 428H386.9C243.1 49.9 241.2 29.1 202.2 -11.3C181.4 -32.9 152.9 -43 123.9 -44V7.1C173.1 14.8 188.5 57 188.5 82.4C188.5 102.5000000000001 189.1 95.0000000000001 106.4 305.6H167.8L218.2 149L320.4 428zM448 286.5V-12H234C240.6 -2.4 244.7 4.3 246.1 7.4H428.6V286.5C428.6 319 411.5 338.4 380.4000000000001 349.4L387.1 367C428.8 353.4 448 323.9 448 286.5z" /> + <glyph glyph-name="youtube-square" + unicode="" + horiz-adv-x="448" d=" M186.8 245.9L282 191.8L186.8 137.7V245.9zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM406 191.7S406 251.3 398.4 279.9C394.2 295.7 381.9 308.1 366.2 312.3C337.9 320 224 320 224 320S110.1 320 81.8 312.3C66.1 308.1 53.8 295.7000000000001 49.6 279.9C42 251.4 42 191.7 42 191.7S42 132.1 49.6 103.5C53.8 87.7 66.1 75.8 81.8 71.6C110.1 64 224 64 224 64S337.9 64 366.2 71.7C381.9 75.9 394.2 87.8 398.4 103.6C406 132.1 406 191.6999999999999 406 191.6999999999999z" /> + <glyph glyph-name="youtube" + unicode="" + horiz-adv-x="576" d=" M549.655 323.9170000000001C543.374 347.567 524.8679999999999 366.193 501.371 372.514C458.781 384 288 384 288 384S117.22 384 74.629 372.514C51.132 366.192 32.626 347.567 26.345 323.9170000000001C14.933 281.05 14.933 191.612 14.933 191.612S14.933 102.174 26.345 59.307C32.626 35.657 51.132 17.807 74.629 11.486C117.22 0 288 0 288 0S458.78 0 501.371 11.486C524.8679999999999 17.807 543.374 35.657 549.655 59.307C561.067 102.174 561.067 191.612 561.067 191.612S561.067 281.05 549.655 323.9170000000001zM232.145 110.409V272.815L374.884 191.61L232.145 110.409z" /> + </font> +</defs> +</svg> diff --git a/.next/static/media/brand-icons.cac87dc00c87a5d74711d0276713808a.woff b/.next/static/media/brand-icons.cac87dc00c87a5d74711d0276713808a.woff new file mode 100644 index 0000000..2e87401 Binary files /dev/null and b/.next/static/media/brand-icons.cac87dc00c87a5d74711d0276713808a.woff differ diff --git a/.next/static/media/brand-icons.d68fa3e67dbb653a13cec44b1bcabcfe.eot b/.next/static/media/brand-icons.d68fa3e67dbb653a13cec44b1bcabcfe.eot new file mode 100644 index 0000000..0a1ef3f Binary files /dev/null and b/.next/static/media/brand-icons.d68fa3e67dbb653a13cec44b1bcabcfe.eot differ diff --git a/.next/static/media/flags.99f63ae7a743f21ab30847ed06a698d9.png b/.next/static/media/flags.99f63ae7a743f21ab30847ed06a698d9.png new file mode 100644 index 0000000..cdd33c3 Binary files /dev/null and b/.next/static/media/flags.99f63ae7a743f21ab30847ed06a698d9.png differ diff --git a/.next/static/media/icons.38c6d8bab26db77d8c806813e1497763.woff2 b/.next/static/media/icons.38c6d8bab26db77d8c806813e1497763.woff2 new file mode 100644 index 0000000..eea9aa2 Binary files /dev/null and b/.next/static/media/icons.38c6d8bab26db77d8c806813e1497763.woff2 differ diff --git a/.next/static/media/icons.425399f81e4ce7cbd967685402ba0260.woff b/.next/static/media/icons.425399f81e4ce7cbd967685402ba0260.woff new file mode 100644 index 0000000..4cf2a4f Binary files /dev/null and b/.next/static/media/icons.425399f81e4ce7cbd967685402ba0260.woff differ diff --git a/.next/static/media/icons.62d9dae4e0040e81c980950003df0e07.svg b/.next/static/media/icons.62d9dae4e0040e81c980950003df0e07.svg new file mode 100644 index 0000000..0ae8e32 --- /dev/null +++ b/.next/static/media/icons.62d9dae4e0040e81c980950003df0e07.svg @@ -0,0 +1,1518 @@ +<?xml version="1.0" standalone="no"?> +<!-- +Font Awesome Free 5.0.8 by @fontawesome - https://fontawesome.com +License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +--> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<defs> + <font id="fontawesome-free" horiz-adv-x="640"> + <font-face font-family="Font Awesome 5 Free" + units-per-em="512" ascent="448" + descent="64" + font-weight="900" + font-style="Solid" /> + <missing-glyph horiz-adv-x="0" /> + <glyph glyph-name="address-book" + unicode="" + horiz-adv-x="448" d=" M436 288C442.627 288 448 293.373 448 300V340C448 346.627 442.627 352 436 352H416V400C416 426.51 394.51 448 368 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H368C394.51 -64 416 -42.51 416 -16V32H436C442.627 32 448 37.373 448 44V84C448 90.627 442.627 96 436 96H416V160H436C442.627 160 448 165.373 448 172V212C448 218.627 442.627 224 436 224H416V288H436zM208 320C252.183 320 288 284.183 288 240S252.183 160 208 160S128 195.817 128 240S163.817 320 208 320zM336 88C336 74.745 325.255 64 312 64H104C90.745 64 80 74.745 80 88V106.523C80 128.549 94.99 147.7480000000001 116.358 153.09L152.015 162.004C181.116 141.072 226.524 135.059 263.985 162.004L299.642 153.09C321.01 147.748 336 128.548 336 106.523V88z" /> + <glyph glyph-name="address-card" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM176 304C214.66 304 246 272.66 246 234S214.66 164 176 164S106 195.34 106 234S137.34 304 176 304zM288 101C288 89.402 278.598 80 267 80H85C73.402 80 64 89.402 64 101V117.207C64 136.479 77.116 153.279 95.813 157.953L127.013 165.753C152.477 147.437 192.208 142.176 224.987 165.753L256.187 157.953C274.884 153.279 288 136.48 288 117.207V101zM448 140C448 133.373 442.627 128 436 128H332C325.373 128 320 133.373 320 140V148C320 154.627 325.373 160 332 160H436C442.627 160 448 154.627 448 148V140zM448 204C448 197.373 442.627 192 436 192H332C325.373 192 320 197.373 320 204V212C320 218.627 325.373 224 332 224H436C442.627 224 448 218.627 448 212V204zM448 268C448 261.373 442.627 256 436 256H332C325.373 256 320 261.373 320 268V276C320 282.627 325.373 288 332 288H436C442.627 288 448 282.627 448 276V268z" /> + <glyph glyph-name="adjust" + unicode="" + horiz-adv-x="512" d=" M8 192C8 55.034 119.033 -56 256 -56S504 55.034 504 192S392.966 440 256 440S8 328.967 8 192zM256 8V376C357.705 376 440 293.689 440 192C440 90.295 357.689 8 256 8z" /> + <glyph glyph-name="align-center" + unicode="" + horiz-adv-x="448" d=" M352 404V364C352 355.163 344.837 348 336 348H112C103.163 348 96 355.163 96 364V404C96 412.837 103.163 420 112 420H336C344.837 420 352 412.837 352 404zM16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276V236C0 227.163 7.163 220 16 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM336 164H112C103.163 164 96 156.837 96 148V108C96 99.163 103.163 92 112 92H336C344.837 92 352 99.163 352 108V148C352 156.837 344.837 164 336 164z" /> + <glyph glyph-name="align-justify" + unicode="" + horiz-adv-x="448" d=" M0 364V404C0 412.837 7.163 420 16 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H16C7.163 348 0 355.163 0 364zM16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276V236C0 227.163 7.163 220 16 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM16 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H16C7.163 164 0 156.837 0 148V108C0 99.163 7.163 92 16 92z" /> + <glyph glyph-name="align-left" + unicode="" + horiz-adv-x="448" d=" M288 404V364C288 355.163 280.837 348 272 348H16C7.163 348 0 355.163 0 364V404C0 412.837 7.163 420 16 420H272C280.837 420 288 412.837 288 404zM0 276V236C0 227.163 7.163 220 16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM272 164H16C7.163 164 0 156.837 0 148V108C0 99.163 7.163 92 16 92H272C280.837 92 288 99.163 288 108V148C288 156.837 280.837 164 272 164z" /> + <glyph glyph-name="align-right" + unicode="" + horiz-adv-x="448" d=" M160 364V404C160 412.837 167.163 420 176 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H176C167.163 348 160 355.163 160 364zM16 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H16C7.163 292 0 284.837 0 276V236C0 227.163 7.163 220 16 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM176 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H176C167.163 164 160 156.837 160 148V108C160 99.163 167.163 92 176 92z" /> + <glyph glyph-name="ambulance" + unicode="" + horiz-adv-x="640" d=" M624 96H608V204.1C608 216.8 602.9 229 593.9 238L494 337.9C485 346.9 472.8 352 460.1 352H416V400C416 426.5 394.5 448 368 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H64C64 -21 107 -64 160 -64S256 -21 256 32H384C384 -21 427 -64 480 -64S576 -21 576 32H624C632.8 32 640 39.2 640 48V80C640 88.8 632.8 96 624 96zM160 -16C133.5 -16 112 5.5 112 32S133.5 80 160 80S208 58.5 208 32S186.5 -16 160 -16zM304 232C304 227.6 300.4 224 296 224H240V168C240 163.6 236.4 160 232 160H184C179.6 160 176 163.6 176 168V224H120C115.6 224 112 227.6 112 232V280C112 284.4 115.6 288 120 288H176V344C176 348.4 179.6 352 184 352H232C236.4 352 240 348.4 240 344V288H296C300.4 288 304 284.4 304 280V232zM480 -16C453.5 -16 432 5.5 432 32S453.5 80 480 80S528 58.5 528 32S506.5 -16 480 -16zM560 192H416V304H460.1L560 204.1V192z" /> + <glyph glyph-name="american-sign-language-interpreting" + unicode="" + horiz-adv-x="640" d=" M290.5470000000001 258.961C270.252 269.11 246.4000000000001 270.1600000000001 225.808 262.851C268.4140000000001 262.851 297.016 242.376 311.386 212.275C319.9620000000001 194.376 306.238 174.204 287.769 174.204C306.198 174.204 319.98 154.068 311.386 136.1330000000001C296.661 105.287 265.2630000000001 85.2790000000001 231.088 85.2790000000001C230.5310000000001 85.2790000000001 136.617 93.8940000000001 136.617 93.8940000000001L70.211 60.5470000000001C60.827 55.8540000000001 50.396 60.1680000000001 46.316 68.3280000000001L1.86 157.253C-2.307 165.868 0.749 176.15 8.806 180.874L66.878 213.943L108 288.139C114.39 345.384 142.731 397.906 187.743 434.865C199.134 444.313 216.084 442.646 225.253 431.252C234.699 419.858 233.033 403.185 221.641 393.736C209.138 383.177 198.023 371.227 189.132 358.166C210.804 372.895 235.811 382.898 263.318 386.233C278.043 388.178 291.381 377.897 293.048 363.168C294.993 348.44 284.712 335.101 269.986 333.434C253.87 331.4890000000001 238.866 325.931 225.808 318.15C251.922 323.863 284.52 321.288 313.887 307.035C327.223 300.366 332.78 284.526 326.111 271.187C319.722 258.127 303.607 252.57 290.547 258.961zM263.3180000000001 189.489C257.206 201.994 244.9800000000001 209.775 231.0870000000001 209.775A35.46 35.46 0 0 1 195.5220000000001 174.2050000000001C195.5220000000001 152.7770000000001 213.3300000000001 138.6350000000001 231.0870000000001 138.6350000000001C244.9800000000001 138.6350000000001 257.206 146.4160000000001 263.3180000000001 158.9210000000001C267.7640000000001 168.3700000000001 276.932 173.927 286.6570000000001 174.2050000000001C276.932 174.482 267.764 180.04 263.3180000000001 189.489zM638.1390000000001 226.7260000000001C642.3070000000001 218.111 639.2500000000001 207.829 631.1930000000001 203.105L573.1220000000001 170.036L532 95.84C525.61 38.595 497.269 -13.927 452.257 -50.886C441.325 -59.998 424.4580000000001 -59.03 414.747 -47.273C405.301 -35.879 406.9670000000001 -19.206 418.36 -9.757C430.863 0.802 441.9770000000001 12.752 450.868 25.813C429.196 11.084 404.189 1.081 376.682 -2.254C366.661 -4.76 349.13 3.389 346.952 20.811C345.007 35.539 355.288 48.878 370.014 50.545C386.13 52.491 401.134 58.048 414.192 65.829C388.0780000000001 60.1159999999999 355.48 62.691 326.113 76.944C312.777 83.6129999999999 307.2200000000001 99.453 313.889 112.792C320.278 125.853 336.394 131.411 349.454 125.019C369.749 114.87 393.601 113.8199999999999 414.193 121.129C371.587 121.129 342.985 141.604 328.615 171.705C320.039 189.604 333.7630000000001 209.776 352.2320000000001 209.776C333.8030000000001 209.776 320.021 229.912 328.615 247.847C342.648 277.243 372.654 298.734 410.581 298.701L503.384 290.086L569.79 323.433C579.198 328.137 589.6179999999999 323.787 593.684 315.652L638.139 226.726zM408.9120000000002 245.344C395.0190000000001 245.344 382.7930000000001 237.563 376.6810000000002 225.058C372.2350000000002 215.609 363.0670000000002 210.052 353.3420000000002 209.774C363.0670000000002 209.4960000000001 372.2350000000002 203.938 376.6810000000002 194.4900000000001C382.7930000000002 181.985 395.0190000000002 174.2040000000001 408.9120000000002 174.2040000000001A35.46 35.46 0 0 1 444.4770000000002 209.7740000000001C444.4770000000002 231.2030000000001 426.6690000000002 245.3440000000001 408.9120000000002 245.3440000000001z" /> + <glyph glyph-name="anchor" + unicode="" + horiz-adv-x="576" d=" M12.971 96H45.365C67.172 -6.735 181.944 -64 288 -64C394.229 -64 508.853 -6.62 530.635 96H563.029C573.72 96 579.074 108.926 571.514 116.485L504.485 183.514C499.799 188.2 492.201 188.2 487.514 183.514L420.485 116.485C412.925 108.925 418.279 96 428.9700000000001 96H464.116C443.826 41.683 379.153 9.412 319.999 1.985V192H371.999C378.6260000000001 192 383.999 197.373 383.999 204V244C383.999 250.627 378.6260000000001 256 371.999 256H319.999V261.4700000000001C357.2800000000001 274.648 383.9940000000001 310.195 383.999 351.988C384.005 404.228 341.605 447.262 289.37 447.99C235.723 448.739 192 405.475 192 352C192 310.202 218.716 274.65 256 261.4700000000001V256H204C197.373 256 192 250.627 192 244V204C192 197.373 197.373 192 204 192H256V1.985C197.064 9.384 132.18 41.664 111.883 96H147.029C157.72 96 163.074 108.926 155.514 116.485L88.485 183.514C83.799 188.2 76.201 188.2 71.514 183.514L4.485 116.485C-3.074 108.926 2.28 96 12.971 96zM288 384C305.645 384 320 369.645 320 352S305.645 320 288 320S256 334.355 256 352S270.355 384 288 384z" /> + <glyph glyph-name="angle-double-down" + unicode="" + horiz-adv-x="320" d=" M143 191.7L7 327.7C-2.4 337.1 -2.4 352.3 7 361.6L29.6 384.2C39 393.6 54.2 393.6 63.5 384.2L159.9 287.8L256.3 384.2C265.7 393.6 280.9000000000001 393.6 290.2 384.2L313 361.7C322.4 352.3 322.4 337.1 313 327.8L177 191.8C167.6 182.3 152.4 182.3 143 191.7zM177 -0.3L313 135.7C322.4 145.1 322.4 160.3 313 169.6L290.4 192.2C281 201.6 265.8 201.6 256.5 192.2L160 95.9L63.6 192.3C54.2 201.7 39 201.7 29.7 192.3L7 169.7C-2.4 160.3 -2.4 145.1 7 135.8L143 -0.2C152.4 -9.7 167.6 -9.7 177 -0.3z" /> + <glyph glyph-name="angle-double-left" + unicode="" + horiz-adv-x="448" d=" M223.7 209L359.7 345C369.1 354.4 384.3 354.4 393.6 345L416.2 322.4C425.6 313 425.6 297.8 416.2 288.5L319.9 192L416.3 95.6C425.7 86.2000000000001 425.7 71 416.3 61.7000000000001L393.7 39C384.3 29.6 369.1 29.6 359.8 39L223.8 175C214.3 184.4 214.3 199.6 223.7 209zM31.7 175L167.7 39C177.1 29.6 192.3 29.6 201.6 39L224.2 61.6C233.6 71 233.6 86.2000000000001 224.2 95.5L127.9 192L224.3 288.4C233.7 297.8 233.7 313 224.3 322.3L201.7 345C192.3 354.4 177.1 354.4 167.8 345L31.8 209C22.3 199.6 22.3 184.4 31.7 175z" /> + <glyph glyph-name="angle-double-right" + unicode="" + horiz-adv-x="448" d=" M224.3 175L88.3 39C78.9 29.6 63.7 29.6 54.4 39L31.8 61.6C22.4 71 22.4 86.2000000000001 31.8 95.5L128.2 191.9L31.8 288.3C22.4 297.7 22.4 312.9 31.8 322.2L54.3 345C63.7 354.4 78.9 354.4 88.2 345L224.2 209C233.7 199.6 233.7 184.4 224.3 175zM416.3 209L280.3 345C270.9000000000001 354.4 255.7 354.4 246.4 345L223.8 322.4C214.4 313 214.4 297.8 223.8 288.5L320.2000000000001 192.1L223.8000000000001 95.7C214.4 86.3 214.4 71.1 223.8000000000001 61.8L246.4000000000001 39.2C255.8000000000001 29.8 271.0000000000001 29.8 280.3 39.2L416.3 175.2C425.7 184.4 425.7 199.6 416.3 209z" /> + <glyph glyph-name="angle-double-up" + unicode="" + horiz-adv-x="320" d=" M177 192.3L313 56.3C322.4 46.9 322.4 31.7 313 22.4L290.4 -0.2C281 -9.6 265.8 -9.6 256.5 -0.2L160 96.1L63.6 -0.3C54.2 -9.6999999999999 39 -9.6999999999999 29.7 -0.3L7 22.3C-2.4 31.7 -2.4 46.9 7 56.2L143 192.2C152.4 201.7 167.6 201.7 177 192.3zM143 384.3L7 248.3C-2.4 238.9 -2.4 223.7 7 214.4L29.6 191.8C39 182.4 54.2 182.4 63.5 191.8L159.9 288.2000000000001L256.3 191.8C265.7 182.4 280.9000000000001 182.4 290.2 191.8L312.8 214.4C322.2 223.8 322.2 239 312.8 248.3L176.8 384.3C167.6 393.7 152.4 393.7 143 384.3z" /> + <glyph glyph-name="angle-down" + unicode="" + horiz-adv-x="320" d=" M143 95.7L7 231.7C-2.4 241.1 -2.4 256.3 7 265.6L29.6 288.2C39 297.6 54.2 297.6 63.5 288.2L159.9 191.8L256.3 288.2C265.7 297.6 280.9000000000001 297.6 290.2 288.2L312.8 265.6C322.2 256.2 322.2 241 312.8 231.7L176.8 95.6999999999999C167.6 86.3 152.4 86.3 143 95.6999999999999z" /> + <glyph glyph-name="angle-left" + unicode="" + horiz-adv-x="256" d=" M31.7 209L167.7 345C177.1 354.4 192.3 354.4 201.6 345L224.2 322.4C233.6 313 233.6 297.8 224.2 288.5L127.9 192L224.3 95.6C233.7 86.2000000000001 233.7 71 224.3 61.7000000000001L201.7 39C192.3 29.6 177.1 29.6 167.8 39L31.8 175C22.3 184.4 22.3 199.6 31.7 209z" /> + <glyph glyph-name="angle-right" + unicode="" + horiz-adv-x="256" d=" M224.3 175L88.3 39C78.9 29.6 63.7 29.6 54.4 39L31.8 61.6C22.4 71 22.4 86.2000000000001 31.8 95.5L128.2 191.9L31.8 288.3C22.4 297.7 22.4 312.9 31.8 322.2L54.3 345C63.7 354.4 78.9 354.4 88.2 345L224.2 209C233.7 199.6 233.7 184.4 224.3 175z" /> + <glyph glyph-name="angle-up" + unicode="" + horiz-adv-x="320" d=" M177 288.3L313 152.3C322.4 142.9 322.4 127.7 313 118.4L290.4 95.8C281 86.4 265.8 86.4 256.5 95.8L160 192.1L63.6 95.7C54.2 86.3 39 86.3 29.7 95.7L7 118.3C-2.4 127.7 -2.4 142.9 7 152.2L143 288.2C152.4 297.7 167.6 297.7 177 288.3z" /> + <glyph glyph-name="archive" + unicode="" + horiz-adv-x="512" d=" M488 320H24C10.745 320 0 330.745 0 344V392C0 405.255 10.745 416 24 416H488C501.255 416 512 405.255 512 392V344C512 330.745 501.255 320 488 320zM480 -8V264C480 277.255 469.255 288 456 288H56C42.745 288 32 277.255 32 264V-8C32 -21.255 42.745 -32 56 -32H456C469.255 -32 480 -21.255 480 -8zM308 192H204C197.373 192 192 197.373 192 204V212C192 218.627 197.373 224 204 224H308C314.627 224 320 218.627 320 212V204C320 197.373 314.627 192 308 192z" /> + <glyph glyph-name="arrow-alt-circle-down" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM212 308V192H141.1C130.4 192 125 179 132.6 171.5L247.5 57.2C252.2 52.5 259.7 52.5 264.4 57.2L379.3 171.5C386.9 179.1 381.5 192 370.8 192H300V308C300 314.6 294.6 320 288 320H224C217.4 320 212 314.6 212 308z" /> + <glyph glyph-name="arrow-alt-circle-left" + unicode="" + horiz-adv-x="512" d=" M256 -56C119 -56 8 55 8 192S119 440 256 440S504 329 504 192S393 -56 256 -56zM372 236H256V306.9C256 317.6 243 323 235.5 315.4L121.2 200.5C116.5 195.8 116.5 188.3 121.2 183.6L235.5 68.7000000000001C243.1 61.1 256 66.5000000000001 256 77.2000000000001V148H372C378.6 148 384 153.4 384 160V224C384 230.6 378.6 236 372 236z" /> + <glyph glyph-name="arrow-alt-circle-right" + unicode="" + horiz-adv-x="512" d=" M256 440C393 440 504 329 504 192S393 -56 256 -56S8 55 8 192S119 440 256 440zM140 148H256V77.1C256 66.4 269 61 276.5 68.6L390.8 183.5C395.5 188.2 395.5 195.7 390.8 200.4L276.5 315.4C268.9 323 256 317.6 256 306.9V236H140C133.4 236 128 230.6 128 224V160C128 153.4 133.4 148 140 148z" /> + <glyph glyph-name="arrow-alt-circle-up" + unicode="" + horiz-adv-x="512" d=" M8 192C8 329 119 440 256 440S504 329 504 192S393 -56 256 -56S8 55 8 192zM300 76V192H370.9C381.6 192 387 205 379.4 212.5L264.5 326.8C259.8 331.5 252.3 331.5 247.6 326.8L132.6 212.5C125 204.9 130.4 192 141.1 192H212V76C212 69.4 217.4 64 224 64H288C294.6 64 300 69.4 300 76z" /> + <glyph glyph-name="arrow-circle-down" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM360.4 220.9L288 145.4V328C288 341.3 277.3 352 264 352H248C234.7 352 224 341.3 224 328V145.4L151.6 220.9C142.3 230.6 126.8 230.8 117.3 221.3L106.4 210.3C97 200.9 97 185.7 106.4 176.4L239 43.7C248.4 34.3 263.6 34.3 272.9 43.7L405.6 176.4C415 185.8 415 201 405.6 210.3L394.7 221.3C385.2 230.8 369.7 230.6 360.4 220.9z" /> + <glyph glyph-name="arrow-circle-left" + unicode="" + horiz-adv-x="512" d=" M256 -56C119 -56 8 55 8 192S119 440 256 440S504 329 504 192S393 -56 256 -56zM284.9 87.6L209.4 160H392C405.3 160 416 170.7 416 184V200C416 213.3 405.3 224 392 224H209.4L284.9 296.4C294.6 305.7000000000001 294.8 321.2 285.3 330.7L274.3 341.6C264.9 351 249.7 351 240.4 341.6L107.7 209C98.3 199.6 98.3 184.4 107.7 175.1L240.4 42.4C249.8 33.0000000000001 265 33.0000000000001 274.3 42.4L285.3 53.3C294.8 62.8 294.6 78.3 284.9 87.6z" /> + <glyph glyph-name="arrow-circle-right" + unicode="" + horiz-adv-x="512" d=" M256 440C393 440 504 329 504 192S393 -56 256 -56S8 55 8 192S119 440 256 440zM227.1 296.4L302.6 224H120C106.7 224 96 213.3 96 200V184C96 170.7 106.7 160 120 160H302.6L227.1 87.6C217.4 78.3 217.2 62.8 226.7 53.3L237.7 42.4C247.1 33.0000000000001 262.3 33.0000000000001 271.6 42.4L404.3 175C413.7 184.4 413.7 199.6 404.3 208.9L271.6 341.7C262.2000000000001 351.1 247.0000000000001 351.1 237.7 341.7L226.7 330.8C217.2 321.2 217.4 305.7 227.1 296.4z" /> + <glyph glyph-name="arrow-circle-up" + unicode="" + horiz-adv-x="512" d=" M8 192C8 329 119 440 256 440S504 329 504 192S393 -56 256 -56S8 55 8 192zM151.6 163.1L224 238.6V56C224 42.7 234.7 32 248 32H264C277.3 32 288 42.7 288 56V238.6L360.4 163.1C369.7 153.4 385.2 153.2000000000001 394.7 162.7000000000001L405.6 173.7000000000001C415 183.1 415 198.3000000000001 405.6 207.6000000000001L273 340.3C263.6 349.7 248.4 349.7 239.1 340.3L106.3 207.6C96.9 198.2 96.9 183 106.3 173.7L117.2 162.7C126.8 153.2 142.3 153.4 151.6 163.1z" /> + <glyph glyph-name="arrow-down" + unicode="" + horiz-adv-x="448" d=" M413.1 225.5L435.3 203.3C444.7 193.9 444.7 178.7 435.3 169.4L241 -25C231.6 -34.4 216.4 -34.4 207.1 -25L12.7 169.4C3.3 178.8 3.3 194 12.7 203.3L34.9 225.5C44.4 235 59.9 234.8 69.2 225.1L184 104.6V392C184 405.3 194.7 416 208 416H240C253.3 416 264 405.3 264 392V104.6L378.8 225.1C388.1 234.9000000000001 403.6 235.1 413.1 225.5000000000001z" /> + <glyph glyph-name="arrow-left" + unicode="" + horiz-adv-x="448" d=" M257.5 2.9L235.3 -19.3C225.9 -28.7 210.7 -28.7 201.4 -19.3L7 175C-2.4 184.4 -2.4 199.6 7 208.9L201.4 403.3C210.8 412.7 226 412.7 235.3 403.3L257.5 381.1C267 371.6 266.8 356.1 257.1 346.8L136.6 232H424C437.3 232 448 221.3 448 208V176C448 162.7 437.3 152 424 152H136.6L257.1 37.2C266.9000000000001 27.9 267.1 12.4 257.5 2.9z" /> + <glyph glyph-name="arrow-right" + unicode="" + horiz-adv-x="448" d=" M190.5 381.1L212.7 403.3C222.1 412.7 237.3 412.7 246.6 403.3L441 209C450.4 199.6 450.4 184.4 441 175.1L246.6 -19.3C237.2 -28.7 222 -28.7 212.7 -19.3L190.5 2.9C181 12.4 181.2 27.9 190.9 37.2L311.4 152H24C10.7 152 0 162.7 0 176V208C0 221.3 10.7 232 24 232H311.4L190.9 346.8C181.1 356.1 180.9 371.6 190.5 381.1z" /> + <glyph glyph-name="arrow-up" + unicode="" + horiz-adv-x="448" d=" M34.9 158.5L12.7 180.7C3.3 190.1 3.3 205.3 12.7 214.6L207 409C216.4 418.4 231.6 418.4 240.9 409L435.2000000000001 214.7C444.6 205.3 444.6 190.1 435.2000000000001 180.8L413 158.6C403.5 149.1 388 149.3 378.7 159L264 279.4V-8C264 -21.3 253.3 -32 240 -32H208C194.7 -32 184 -21.3 184 -8V279.4L69.2 158.9C59.9 149.1 44.4 148.9 34.9 158.5z" /> + <glyph glyph-name="arrows-alt-h" + unicode="" + horiz-adv-x="512" d=" M377.941 278.059V232H134.059V278.059C134.059 299.4410000000001 108.208 310.149 93.088 295.03L7.029 208.971C-2.344 199.598 -2.344 184.403 7.029 175.03L93.088 88.971C108.207 73.852 134.059 84.56 134.059 105.942V152H377.9410000000001V105.941C377.9410000000001 84.559 403.7920000000001 73.851 418.9120000000001 88.97L504.971 175.029C514.344 184.402 514.344 199.597 504.971 208.97L418.9120000000001 295.029C403.793 310.149 377.9410000000001 299.4410000000001 377.9410000000001 278.059z" /> + <glyph glyph-name="arrows-alt-v" + unicode="" + horiz-adv-x="256" d=" M214.059 70.059H168V313.9410000000001H214.059C235.441 313.9410000000001 246.149 339.7920000000001 231.03 354.9120000000001L144.971 440.971C135.598 450.344 120.403 450.344 111.03 440.971L24.971 354.9120000000001C9.852 339.793 20.56 313.9410000000001 41.942 313.9410000000001H88V70.059H41.941C20.559 70.059 9.851 44.208 24.97 29.088L111.029 -56.971C120.402 -66.344 135.597 -66.344 144.97 -56.971L231.029 29.088C246.149 44.207 235.441 70.059 214.059 70.059z" /> + <glyph glyph-name="arrows-alt" + unicode="" + horiz-adv-x="512" d=" M352.201 22.225L273.005 -56.971C263.632 -66.344 248.437 -66.344 239.064 -56.971L159.868 22.225C144.749 37.3440000000001 155.457 63.196 176.839 63.1950000000001H228.001L228 164H127.196V112.838C127.196 91.456 101.345 80.7480000000001 86.225 95.867L7.029 175.063C-2.344 184.436 -2.344 199.632 7.029 209.004L86.225 288.2C101.344 303.319 127.196 292.611 127.196 271.229V220H228V320.804H176.77C155.388 320.804 144.68 346.655 159.799 361.775L238.995 440.971C248.368 450.344 263.563 450.344 272.9360000000001 440.971L352.1320000000001 361.775C367.2510000000001 346.656 356.5430000000001 320.804 335.1610000000001 320.804H283.9990000000001V220H384.8030000000001V271.1620000000001C384.8030000000001 292.544 410.6540000000001 303.252 425.7730000000002 288.1330000000001L504.9690000000002 208.937C514.3420000000002 199.564 514.3420000000002 184.368 504.9690000000002 174.996L425.773 95.8C410.654 80.681 384.802 91.389 384.803 112.771V164H284V63.196H335.23C356.612 63.196 367.3200000000001 37.345 352.201 22.225z" /> + <glyph glyph-name="assistive-listening-systems" + unicode="" + horiz-adv-x="512" d=" M216 188C216 172.536 203.464 160 188 160S160 172.536 160 188C160 232.112 195.888 268 240 268S320 232.112 320 188C320 172.536 307.464 160 292 160S264 172.536 264 188C264 201.234 253.233 212 240 212S216 201.234 216 188zM240 364C142.953 364 64 285.0470000000001 64 188C64 172.536 76.536 160 92 160S120 172.536 120 188C120 254.168 173.832 308 240 308S360 254.168 360 188C360 112.836 288.991 117.689 288.003 44.378L288 44C288 15.327 264.673 -8 236 -8C220.536 -8 208 -20.536 208 -36S220.536 -64 236 -64C295.475 -64 343.876 -15.672 344 43.774C344.5950000000001 78.202 416 92.014 416 188C416 285.0470000000001 337.0470000000001 364 240 364zM160 128C142.327 128 128 113.673 128 96S142.327 64 160 64S192 78.327 192 96S177.673 128 160 128zM32 0C14.327 0 0 -14.327 0 -32S14.327 -64 32 -64S64 -49.673 64 -32S49.673 0 32 0zM512 187.993C512 189.511 511.988 191.018 511.955 192.524C510.076 307.475 436.157 409.53 327.9940000000001 446.489C313.3610000000001 451.487 297.4450000000001 443.68 292.444 429.0470000000001C287.444 414.414 295.254 398.498 309.886 393.497C395.7920000000001 364.1430000000001 454.496 282.984 455.963 191.544L455.966 191.356C455.992 190.238 455.999 189.12 455.999 187.993C455.999 172.529 468.535 159.993 483.999 159.993S512 172.529 512 187.993zM152.971 8.971L72.971 88.971L39.03 55.03L119.03 -24.97L152.971 8.971z" /> + <glyph glyph-name="asterisk" + unicode="" + horiz-adv-x="512" d=" M478.21 113.907L336 192L478.21 270.093C490.0050000000001 276.5700000000001 494.171 291.4770000000001 487.442 303.13L467.962 336.8710000000001C461.234 348.524 446.242 352.37 434.735 345.394L296 261.2820000000001L299.475 423.486C299.763 436.939 288.937 448 275.48 448H236.52C223.064 448 212.237 436.939 212.526 423.486L216 261.2820000000001L77.265 345.3930000000001C65.759 352.3690000000001 50.766 348.523 44.038 336.87L24.558 303.129C17.83 291.476 21.996 276.569 33.791 270.092L176 192L33.79 113.907C21.995 107.43 17.829 92.523 24.558 80.87L44.038 47.129C50.766 35.476 65.759 31.63 77.265 38.606L216 122.718L212.525 -39.486C212.237 -52.939 223.064 -64 236.52 -64H275.481C288.937 -64 299.764 -52.939 299.476 -39.486L296 122.718L434.735 38.607C446.241 31.631 461.234 35.477 467.962 47.1300000000001L487.442 80.871C494.17 92.5240000000001 490.005 107.4300000000001 478.21 113.9070000000001z" /> + <glyph glyph-name="at" + unicode="" + horiz-adv-x="512" d=" M256 440C118.941 440 8 329.081 8 192C8 54.941 118.919 -56 256 -56C304.154 -56 351.342 -41.86 391.408 -15.777C403.413 -7.962 406.033 8.511 396.9600000000001 19.595L386.783 32.028C379.112 41.399 365.6040000000001 43.695 355.4100000000001 37.157C325.92 18.243 291.314 8 256 8C154.542 8 72 90.542 72 192S154.542 376 256 376C356.139 376 440 318.381 440 216C440 177.214 418.907 136.258 381.83 132.307C364.481 132.761 364.92 145.164 368.354 162.331L391.787 283.4410000000001C394.653 298.25 383.308 312 368.225 312H323.2440000000001A13.518 13.518 0 0 1 309.812 300.007L309.802 299.915C295.105 317.8160000000001 269.3540000000001 321.69 249.831 321.69C175.251 321.69 112 259.456 112 170.23C112 104.927 148.785 64.36 208 64.36C234.9840000000001 64.36 265.3690000000001 79.997 282.9910000000001 102.693C292.5130000000001 68.589 323.6040000000001 68.59 353.701 68.59C462.609 68.59 504 140.202 504 216C504 352.347 394.023 440 256 440zM234.32 135.57C212.071 135.57 198.25 151.193 198.25 176.341C198.25 221.334 229.029 249.07 256.88 249.07C279.1720000000001 249.07 292.481 233.829 292.481 208.3C292.481 163.239 258.606 135.57 234.32 135.57z" /> + <glyph glyph-name="audio-description" + unicode="" + horiz-adv-x="512" d=" M162.925 209.291L171.747 178.636H146.141L155.182 209.288C156.459 213.709 157.833 219.282 159.054 224.533C160.274 219.282 161.648 213.71 162.9250000000001 209.291zM329.399 241.39H314.876V142.609H329.399C359.175 142.609 375.574 160.287 375.574 192.385C375.574 224.624 358.084 241.39 329.399 241.39zM512 336V48C512 21.49 490.51 0 464 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H464C490.51 384 512 362.51 512 336zM245.459 111.861L188.362 279.861A12.001000000000001 12.001000000000001 0 0 1 177 288H141.106A12.001000000000001 12.001000000000001 0 0 1 129.744 279.861L72.647 111.861C70.003 104.078 75.789 96 84.009 96H113.142A12 12 0 0 1 124.677 104.693L133.251 134.599H184.618L193.411 104.622A12 12 0 0 1 204.926 96H234.098C242.318 96 248.104 104.078 245.459 111.861zM430.16 192.386C430.16 251.363 392.241 288 331.2 288H273.834C267.207 288 261.834 282.627 261.834 276V108C261.834 101.373 267.207 96 273.834 96H331.2C392.241 96 430.16 132.933 430.16 192.386z" /> + <glyph glyph-name="backward" + unicode="" + horiz-adv-x="512" d=" M11.5 167.4L203.5 7.4C224.1 -9.8 256 4.6 256 32V352C256 379.4 224.1 393.8 203.5 376.6L11.5 216.6C-3.8 203.8 -3.8 180.2 11.5 167.4zM267.5 167.4L459.5 7.4C480.1 -9.8 512 4.6 512 32V352C512 379.4 480.1 393.8 459.5 376.6L267.5 216.6C252.2 203.8 252.2 180.2 267.5 167.4z" /> + <glyph glyph-name="balance-scale" + unicode="" + horiz-adv-x="640" d=" M352 0H520C533.255 0 544 -10.745 544 -24V-40C544 -53.255 533.255 -64 520 -64H120C106.745 -64 96 -53.255 96 -40V-24C96 -10.745 106.745 0 120 0H288V294.676C264.469 304.9600000000001 246.836 326.222 241.603 352H120C106.745 352 96 362.745 96 376V392C96 405.255 106.745 416 120 416H255.999C270.594 435.43 293.828 448 320 448S369.406 435.43 384.001 416H520C533.255 416 544 405.255 544 392V376C544 362.745 533.255 352 520 352H398.397C393.164 326.222 375.531 304.9600000000001 352 294.676V0zM639.981 112C639.982 128.182 641.323 120.726 554.933 293.506C537.286 328.8 486.747 328.8640000000001 469.068 293.506C381.94 119.25 384.019 127.669 384.019 112H384C384 67.817 441.308 32 512 32S640 67.817 640 112H639.981zM512 272L584 128H440L512 272zM255.981 112C255.982 128.182 257.323 120.726 170.933 293.506C153.286 328.8 102.747 328.8640000000001 85.068 293.506C-2.06 119.25 0.019 127.669 0.019 112H0C0 67.817 57.308 32 128 32S256 67.817 256 112H255.981zM128 272L200 128H56L128 272z" /> + <glyph glyph-name="ban" + unicode="" + horiz-adv-x="512" d=" M256 440C119.034 440 8 328.967 8 192S119.034 -56 256 -56S504 55.034 504 192S392.967 440 256 440zM386.108 322.108C451.556 256.6600000000001 456.108 156.627 406.7850000000001 86.471L150.47 342.784C220.674 392.14 320.6960000000001 387.519 386.108 322.108zM125.892 61.892C60.444 127.34 55.892 227.373 105.215 297.529L361.53 41.216C291.327 -8.14 191.304 -3.52 125.892 61.892z" /> + <glyph glyph-name="band-aid" + unicode="" + horiz-adv-x="640" d=" M0 288V96C0 60.7 28.7 32 64 32H160V352H64C28.7 352 0 323.3 0 288zM576 352H480V32H576C611.3 32 640 60.7 640 96V288C640 323.3 611.3 352 576 352zM192 32H448V352H192V32zM368 264C381.3 264 392 253.3 392 240S381.3 216 368 216S344 226.7 344 240S354.7 264 368 264zM368 168C381.3 168 392 157.3 392 144S381.3 120 368 120S344 130.7 344 144S354.7 168 368 168zM272 264C285.3 264 296 253.3 296 240S285.3 216 272 216S248 226.7 248 240S258.7 264 272 264zM272 168C285.3 168 296 157.3 296 144S285.3 120 272 120S248 130.7 248 144S258.7 168 272 168z" /> + <glyph glyph-name="barcode" + unicode="" + horiz-adv-x="512" d=" M0 0V384H18V0H0zM26.857 0.273V384H36V0.273H26.857zM54 0.273V384H62.857V0.273H54zM98.857 0.273V384H107.714V0.273H98.857zM134.857 0.273V384H152.571V0.273H134.857zM179.714 0.273V384H188.571V0.273H179.714zM197.714 0.273V384H206.571V0.273H197.714zM215.714 0.273V384H224.571V0.273H215.714zM251.429 0.273V384H269.429V0.273H251.429zM296.286 0.273V384H314.286V0.273H296.286zM332.2850000000001 0.273V384H350.286V0.273H332.2850000000001zM368.286 0.273V384H386.287V0.273H368.286zM395.1430000000001 0.273V384H413.1430000000001V0.273H395.1430000000001zM440.2860000000001 0.273V384H467.143V0.273H440.2860000000001zM476.0000000000001 0.273V384H485.143V0.273H476zM494.0000000000001 0V384H512V0H494z" /> + <glyph glyph-name="bars" + unicode="" + horiz-adv-x="448" d=" M16 316H432C440.837 316 448 323.163 448 332V372C448 380.837 440.837 388 432 388H16C7.163 388 0 380.837 0 372V332C0 323.163 7.163 316 16 316zM16 156H432C440.837 156 448 163.163 448 172V212C448 220.837 440.837 228 432 228H16C7.163 228 0 220.837 0 212V172C0 163.163 7.163 156 16 156zM16 -4H432C440.837 -4 448 3.163 448 12V52C448 60.837 440.837 68 432 68H16C7.163 68 0 60.837 0 52V12C0 3.163 7.163 -4 16 -4z" /> + <glyph glyph-name="baseball-ball" + unicode="" + horiz-adv-x="496" d=" M368.5 84.1L397.3 98C408.4000000000001 75.1 423.3 54.8 441.4000000000001 37.1C475.4 79.6 495.9 133.4 495.9 192C495.9 250.5000000000001 475.5000000000001 304.2000000000001 441.7000000000001 346.6C423.9000000000001 329.3 409.1 309.5 398.1 287.1L369.4000000000001 301.2000000000001C382.2000000000001 327.2000000000001 399.4000000000001 350.2000000000001 420.2000000000001 370.2000000000001C375.6 413.3 315 440 248 440C181.1 440 120.5 413.4 75.9 370.3C96.6 350.4 113.8 327.4 126.6 301.5L97.9 287.4C86.9 309.7000000000001 72.2 329.5 54.4 346.8C20.4 304.3 0 250.6 0 192C0 133.4 20.4 79.7 54.4 37.3C72.6 55 87.6 75.3 98.7 98.3L127.5 84.4C114.6 57.7000000000001 97.2 34.1 76 13.7C120.5 -29.4 181.1 -55.9999999999999 248 -55.9999999999999C314.8 -55.9999999999999 375.3 -29.4999999999999 419.9 13.5000000000001C398.8 33.9 381.4 57.4 368.5 84.1zM140.2 116.1L109.7 125.9C124.6 172.3 122.4 219.7000000000001 109.1 259.9000000000001L139.5 269.9000000000001C154.5 224.3000000000001 157.5 170 140.2 116.1zM356.5 269.5L386.9 259.5C373.7 219.4 371.4 172 386.3 125.5L355.8 115.7C338.5 169.7 341.5 224 356.5 269.5z" /> + <glyph glyph-name="basketball-ball" + unicode="" + horiz-adv-x="496" d=" M212.3 437.7C168.5 431.4 126.1 413.6 90.1 383.9L167.5 306.5C195.3 342.3 210.8 387.7 212.3 437.7zM248 226L405.9 383.9C363.5 418.9 312.3 437.4 260.4 440C259.2 376.1 238.9 317.7000000000001 201.7 272.3L248 226zM56.1 349.9C26.4 313.9 8.6 271.5 2.3 227.7C52.3 229.2 97.8 244.7 133.5 272.5L56.1 349.9zM328.3 145.7000000000001C373.6 182.8000000000001 432 203.1000000000001 496 204.4C493.4 256.3000000000001 474.9 307.5 439.9 349.9000000000001L282 192L328.3 145.7zM248 158L90.1 0.1C132.5 -34.8 183.7 -53.4 235.6 -56C236.9 8 257.2 66.4 294.3 111.7L248 158zM439.9 34.1C469.6 70.1 487.4 112.5 493.7 156.3C443.6 154.7 398.2 139.2 362.5 111.5L439.9 34.1zM167.7 238.3C122.3 201.1 63.9 180.7 0 179.6C2.6 127.7000000000001 21.1 76.5 56.1 34.1L214 192L167.7 238.3zM283.7 -53.7C327.5 -47.4 369.9 -29.6 405.9 0.1L328.5 77.5C300.8 41.8 285.3 -3.7 283.7 -53.7z" /> + <glyph glyph-name="bath" + unicode="" + horiz-adv-x="512" d=" M488 192H80V336C80 353.645 94.355 368 112 368C123.351 368 133.332 362.055 139.015 353.12C122.523 327.913 124.328 293.544 145.853 270.0850000000001C141.677 265.372 141.832 258.169 146.344 253.657L157.658 242.343C162.344 237.657 169.942 237.657 174.629 242.343L269.659 337.372C274.345 342.058 274.345 349.656 269.659 354.343L258.345 365.6570000000001C253.833 370.169 246.63 370.323 241.917 366.148C223.968 382.617 199.623 387.577 177.739 381.5130000000001C163.281 402.333 139.212 416 112 416C67.888 416 32 380.112 32 336V192H24C10.745 192 0 181.255 0 168V152C0 138.745 10.745 128 24 128H32V96C32 67.57 44.362 42.031 64 24.453V-8C64 -21.255 74.745 -32 88 -32H104C117.255 -32 128 -21.255 128 -8V0H384V-8C384 -21.255 394.745 -32 408 -32H424C437.255 -32 448 -21.255 448 -8V24.453C467.638 42.031 480 67.57 480 96V128H488C501.255 128 512 138.745 512 152V168C512 181.255 501.255 192 488 192z" /> + <glyph glyph-name="battery-empty" + unicode="" + horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352z" /> + <glyph glyph-name="battery-full" + unicode="" + horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM512 256H96V128H512V256z" /> + <glyph glyph-name="battery-half" + unicode="" + horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM320 256H96V128H320V256z" /> + <glyph glyph-name="battery-quarter" + unicode="" + horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM224 256H96V128H224V256z" /> + <glyph glyph-name="battery-three-quarters" + unicode="" + horiz-adv-x="640" d=" M544 288V224H576V160H544V96H64V288H544M560 352H48C21.49 352 0 330.51 0 304V80C0 53.49 21.49 32 48 32H560C586.51 32 608 53.49 608 80V96H616C629.255 96 640 106.745 640 120V264C640 277.255 629.255 288 616 288H608V304C608 330.51 586.51 352 560 352zM416 256H96V128H416V256z" /> + <glyph glyph-name="bed" + unicode="" + horiz-adv-x="576" d=" M552 160C565.255 160 576 149.255 576 136V0H480V64H96V0H0V360C0 373.255 10.745 384 24 384H72C85.255 384 96 373.255 96 360V160H552zM192 352C147.817 352 112 316.183 112 272S147.817 192 192 192S272 227.817 272 272S236.183 352 192 352zM576 224C576 277.019 533.019 320 480 320H312C298.745 320 288 309.255 288 296V192H576V224z" /> + <glyph glyph-name="beer" + unicode="" + horiz-adv-x="448" d=" M368 352H320V392C320 405.255 309.255 416 296 416H24C10.745 416 0 405.255 0 392V-8C0 -21.255 10.745 -32 24 -32H296C309.255 -32 320 -21.255 320 -8V34.11L400.606 70.087C429.396 82.937 448 111.612 448 143.14V272C448 316.112 412.112 352 368 352zM384 143.14A16.018 16.018 0 0 0 374.521 128.529L320 104.195V288H368C376.822 288 384 280.822 384 272V143.14zM208 64C199.164 64 192 71.164 192 80V304C192 312.836 199.164 320 208 320S224 312.836 224 304V80C224 71.164 216.836 64 208 64zM112 64C103.164 64 96 71.164 96 80V304C96 312.836 103.164 320 112 320S128 312.836 128 304V80C128 71.164 120.836 64 112 64z" /> + <glyph glyph-name="bell-slash" + unicode="" + horiz-adv-x="576" d=" M78.107 81.941C47.958 51.792 69.325 0 112.048 0H224C224 -35.346 252.654 -64 288 -64C323.346 -64 352 -35.346 352 0H384.685L127.848 226.621C125.65 129.543 99.409 103.243 78.107 81.941zM264 0C264 -13.234 274.766 -24 288 -24A8 8 0 0 0 288 -40C265.944 -40 248 -22.056 248 0H264zM569.896 -43.733L559.134 -55.819C550.219 -65.831 534.801 -66.7860000000001 524.697 -57.952L8.256 393.607C-1.848 402.442 -2.811 417.7200000000001 6.104 427.733L16.865 439.819C25.781 449.831 41.199 450.786 51.303 441.951L165.113 342.439C189.13 371.217 223.059 391.435 261.663 397.829A31.85 31.85 0 0 0 256 416C256 433.673 270.327 448 288 448S320 433.673 320 416C320 409.25 317.905 402.992 314.337 397.83C390.169 385.269 448 319.394 448 240C448 131.882 475.634 104.191 497.884 81.941C510.033 69.792 513.807 54.165 511.214 39.8200000000001L567.744 -9.607C577.8480000000001 -18.4419999999999 578.811 -33.72 569.8960000000001 -43.7329999999999z" /> + <glyph glyph-name="bell" + unicode="" + horiz-adv-x="448" d=" M433.884 81.941C411.634 104.191 384 131.882 384 240C384 319.394 326.169 385.269 250.337 397.8300000000001A31.845000000000002 31.845000000000002 0 0 1 256 416C256 433.673 241.673 448 224 448S192 433.673 192 416C192 409.25 194.095 402.992 197.663 397.83C121.831 385.269 64 319.394 64 240C64 131.882 36.357 104.191 14.107 81.941C-16.042 51.792 5.325 0 48.048 0H160C160 -35.346 188.654 -64 224 -64S288 -35.346 288 0H399.943C442.581 0 464.094 51.731 433.884 81.941zM224 -24A8 8 0 0 0 224 -40C201.944 -40 184 -22.056 184 0H200C200 -13.234 210.766 -24 224 -24z" /> + <glyph glyph-name="bicycle" + unicode="" + horiz-adv-x="640" d=" M512.509 255.999C496.136 256.063 480.479 253.044 466.073 247.504L388.3930000000001 372.657A24 24 0 0 1 368.001 384H304.001C295.164 384 288.001 376.837 288.001 368V352C288.001 343.163 295.164 336 304.001 336H354.65L369.546 312H256.002V328C256.002 336.837 248.839 344 240.002 344H152.543C139.102 344 127.766 333.001 128.007 319.563C128.239 306.519 138.883 296 152.002 296H200.728L171.311 248.48C157.878 253.31 143.407 255.963 128.319 256C58.094 256.17 0.412 198.988 0.002 128.764C-0.413 57.721 57.055 0 128.002 0C187.644 0 237.76 40.793 251.969 96H304.002A24 24 0 0 1 324.408 107.367L410.37 246.23L425.308 222.163C399.853 198.715 383.923 165.082 384.001 127.726C384.146 58.893 441.9 0.675 510.73 0.007C581.336 -0.678 638.911 55.81 639.9849999999999 126.003C641.0709999999999 196.944 583.459 255.723 512.5089999999999 255.999zM186.75 182.228C196.477 171.699 203.423 158.567 206.392 144H163.086L186.75 182.228zM128.002 48C83.89 48 48.002 83.888 48.002 128S83.89 208 128.002 208C133.871 208 139.588 207.347 145.101 206.141L99.596 132.632C89.715 116.673 101.213 96 120.002 96H201.302C188.932 67.775 160.74 48 128.002 48zM290.632 144H255.008C251.048 175.756 235.452 203.894 212.625 224.026L237.371 264H364.918L290.632 144zM507.689 48.114C466.653 50.2790000000001 433.64 83.806 432.062 124.869C431.25 145.99 438.695 165.3870000000001 451.3969999999999 180.132L495.8299999999999 108.546C500.49 101.038 510.3539999999999 98.73 517.862 103.39L531.456 111.827C538.964 116.487 541.273 126.351 536.612 133.859L492.1439999999999 205.502A79.901 79.901 0 0 0 512.002 207.999C556.1139999999999 207.999 592.002 172.111 592.002 127.999C592.001 82.459 553.75 45.683 507.689 48.114z" /> + <glyph glyph-name="binoculars" + unicode="" + horiz-adv-x="512" d=" M192 344H96V392C96 405.255 106.745 416 120 416H168C181.255 416 192 405.255 192 392V344zM416 392C416 405.255 405.255 416 392 416H344C330.745 416 320 405.255 320 392V344H416V392zM0 -8C0 -21.255 10.745 -32 24 -32H144C157.255 -32 168 -21.255 168 -8V8H0V-8zM88 320C74.745 320 64 309.255 64 296C64 192 0 176 0 32H168V136C168 149.255 178.745 160 192 160V320H88zM344 -8C344 -21.255 354.745 -32 368 -32H488C501.255 -32 512 -21.255 512 -8V8H344V-8zM216 320V160H296V320H216zM344 32H512C512 176 448 192 448 296C448 309.255 437.255 320 424 320H320V160C333.255 160 344 149.255 344 136V32z" /> + <glyph glyph-name="birthday-cake" + unicode="" + horiz-adv-x="448" d=" M448 64C419.98 64 416.74 96 373.5 96C330.07 96 326.675 64 298.75 64C271.055 64 267.296 96 224 96C181.158 96 176.782 64 149.5 64C121.352 64 118.298 96 74.75 96C31.203 96 28.097 64 0 64V144C0 170.5 21.5 192 48 192H64V336H128V192H192V336H256V192H320V336H384V192H400C426.5 192 448 170.5 448 144V64zM448 -64H0V32C43.356 32 46.767 64 74.75 64C102.701 64 106.003 32 149.5 32C192.343 32 196.717 64 224 64C252.148 64 255.201 32 298.75 32C342.107 32 345.517 64 373.5 64C400.988 64 404.752 32 448 32V-64zM96 352C78.25 352 64 366.25 64 384C64 415 96 407 96 448C108 448 128 418.5 128 392S113.75 352 96 352zM224 352C206.25 352 192 366.25 192 384C192 415 224 407 224 448C236 448 256 418.5 256 392S241.75 352 224 352zM352 352C334.25 352 320 366.25 320 384C320 415 352 407 352 448C364 448 384 418.5 384 392S369.75 352 352 352z" /> + <glyph glyph-name="blind" + unicode="" + horiz-adv-x="384" d=" M380.15 -62.837A8 8 0 0 0 369.161 -60.15L243.831 146.2770000000001A31.923 31.923 0 0 1 256.7890000000001 155.7620000000001L382.8370000000001 -51.8459999999999A8 8 0 0 0 380.1500000000001 -62.8369999999999zM142.803 133.662L110.263 44.177L146.383 -44.1080000000001C153.076 -60.4680000000001 171.76 -68.3000000000001 188.116 -61.609C204.473 -54.917 212.309 -36.2330000000001 205.617 -19.8750000000001L142.803 133.6619999999999zM96 360C120.301 360 140 379.699 140 404S120.301 448 96 448S52 428.301 52 404S71.699 360 96 360zM250.837 190.872L130.837 342.872C126.104 348.867 119.087 351.98 112 351.9840000000001V352H80V351.974C72.854 351.971 65.783 348.813 61.056 342.7340000000001L0 264.2340000000001V168.54C0 155.085 11.011 143.749 24.464 144.004C37.505 144.252 48 154.9 48 168V247.766L64 268.337V127.639L9.927 -21.055C3.887 -37.664 12.455 -56.024 29.065 -62.064C45.667 -68.1030000000001 64.033 -59.54 70.074 -42.926L136 138.362V245.559L104.594 285.375A4 4 0 1 0 110.863 290.346L213.163 161.129C222.308 149.545 237.531 149.79 246.871 157.1640000000001C257.281 165.3800000000001 259.0300000000001 180.4980000000001 250.837 190.8720000000001z" /> + <glyph glyph-name="bold" + unicode="" + horiz-adv-x="384" d=" M304.793 204.109C338.432 222.646 358.45 258.269 358.45 299.802C358.45 348.038 332.2 387.428 289.824 403.981C265.138 413.99 240.849 416 209.661 416H24C15.163 416 8 408.837 8 400V366.951C8 358.114 15.163 350.951 24 350.951H57.113V32.4210000000001H24C15.163 32.4210000000001 8 25.258 8 16.4210000000001V-16C8 -24.837 15.163 -32 24 -32H219.69C243.893 -32 264.524 -30.711 286.556 -24.416C337.52 -9.193 376 37.353 376 97.986C376 150.154 349.427 189.67 304.793 204.109zM142.217 347.1910000000001H209.661C225.955 347.1910000000001 237.197 345.1720000000001 247.186 340.474C263.014 331.995 272.092 313.972 272.092 291.028C272.092 255.999 251.772 234.2380000000001 219.063 234.2380000000001H142.217V347.1910000000001zM254.859 41.716C244.719 37.66 232.182 36.809 223.45 36.809H142.217V166.057H226.584C266.229 166.057 289.641 140.677 289.641 103C289.642 74.575 275.981 50.517 254.8590000000001 41.716z" /> + <glyph glyph-name="bolt" + unicode="" + horiz-adv-x="320" d=" M295.973 288H180.572L215.19 417.816C219.25 433.044 207.756 448 192 448H56C43.971 448 33.8 439.0950000000001 32.211 427.1720000000001L0.215 187.172C-1.704 172.783 9.504 160 24.004 160H142.705L96.646 -34.466C93.05 -49.649 104.659 -64 119.992 -64C128.342 -64 136.368 -59.626 140.77 -52.022L316.7430000000001 251.975C325.9870000000001 267.942 314.4550000000001 288 295.9730000000001 288z" /> + <glyph glyph-name="bomb" + unicode="" + horiz-adv-x="512" d=" M440.5 359.5L388.5 307.5L415 281C424.4 271.6 424.4 256.4 415 247.1L397.6 229.7C409.4000000000001 203.6 416 174.6 416 144.1C416 29.2 322.9 -63.9 208 -63.9S0 29.1 0 144S93.1 352 208 352C238.5 352 267.5 345.4 293.6 333.6L311 351C320.4 360.4 335.6 360.4 344.9 351L371.4 324.5L423.4 376.5L440.5 359.5zM500 388H476C469.4 388 464 382.6 464 376S469.4 364 476 364H500C506.6 364 512 369.4 512 376S506.6 388 500 388zM440 448C433.4 448 428 442.6 428 436V412C428 405.4 433.4 400 440 400S452 405.4 452 412V436C452 442.6 446.6 448 440 448zM473.9 393L490.9 410C495.6 414.7 495.6 422.3 490.9 427C486.2 431.7 478.6 431.7 473.9 427L456.9 410C452.2 405.3 452.2 397.7 456.9 393C461.7 388.3 469.3 388.3 473.9 393zM406.1 393C410.8 388.3 418.4 388.3 423.1 393C427.8 397.7 427.8 405.3 423.1 410L406.1 427C401.4 431.7 393.8 431.7 389.1 427C384.4 422.3 384.4 414.7 389.1 410L406.1 393zM473.9 359C469.2 363.7 461.6 363.7 456.9 359C452.2 354.3 452.2 346.7 456.9 342L473.9 325C478.6 320.3 486.2 320.3 490.9 325C495.6 329.7 495.6 337.3 490.9 342L473.9 359zM112 176C112 211.3 140.7 240 176 240C184.8 240 192 247.2 192 256S184.8 272 176 272C123.1 272 80 228.9 80 176C80 167.2 87.2 160 96 160S112 167.2 112 176z" /> + <glyph glyph-name="book" + unicode="" + horiz-adv-x="448" d=" M448 88V424C448 437.3 437.3 448 424 448H96C43 448 0 405 0 352V32C0 -21 43 -64 96 -64H424C437.3 -64 448 -53.3 448 -40V-24C448 -16.5 444.5 -9.7 439.1 -5.3C434.9000000000001 10.1 434.9000000000001 54 439.1 69.4C444.5 73.7 448 80.5 448 88zM128 314C128 317.3 130.7 320 134 320H346C349.3 320 352 317.3 352 314V294C352 290.7 349.3 288 346 288H134C130.7 288 128 290.7 128 294V314zM128 250C128 253.3 130.7 256 134 256H346C349.3 256 352 253.3 352 250V230C352 226.7 349.3 224 346 224H134C130.7 224 128 226.7 128 230V250zM381.4 0H96C78.3 0 64 14.3 64 32C64 49.6 78.4 64 96 64H381.4C379.5 46.9 379.5 17.1 381.4 0z" /> + <glyph glyph-name="bookmark" + unicode="" + horiz-adv-x="384" d=" M0 -64V400C0 426.51 21.49 448 48 448H336C362.51 448 384 426.51 384 400V-64L192 48L0 -64z" /> + <glyph glyph-name="bowling-ball" + unicode="" + horiz-adv-x="496" d=" M248 440C111 440 0 329 0 192S111 -56 248 -56S496 55 496 192S385 440 248 440zM120 256C102.3 256 88 270.3 88 288S102.3 320 120 320S152 305.7 152 288S137.7 256 120 256zM184 352C184 369.7 198.3 384 216 384S248 369.7 248 352S233.7 320 216 320S184 334.3 184 352zM232 208C214.3 208 200 222.3 200 240S214.3 272 232 272S264 257.7 264 240S249.7 208 232 208z" /> + <glyph glyph-name="box" + unicode="" + horiz-adv-x="512" d=" M509.5 263.4L458.9 415.2C452.4 434.8 434.1 448 413.4 448H272V256H510.7C510.3 258.5 510.3 261 509.5 263.4zM240 448H98.6C77.9 448 59.6 434.8 53.1 415.2L2.5 263.4C1.7 261 1.7 258.5 1.3 256H240V448zM0 224V-16C0 -42.5 21.5 -64 48 -64H464C490.5 -64 512 -42.5 512 -16V224H0z" /> + <glyph glyph-name="boxes" + unicode="" + horiz-adv-x="576" d=" M560 160H480V64L448 85.3L416 64V160H336C327.2 160 320 152.8 320 144V-48C320 -56.8 327.2 -64 336 -64H560C568.8 -64 576 -56.8 576 -48V144C576 152.8 568.8 160 560 160zM176 224H400C408.8 224 416 231.2 416 240V432C416 440.8 408.8 448 400 448H320V352L288 373.3L256 352V448H176C167.2 448 160 440.8 160 432V240C160 231.2 167.2 224 176 224zM240 160H160V64L128 85.3L96 64V160H16C7.2 160 0 152.8 0 144V-48C0 -56.8 7.2 -64 16 -64H240C248.8 -64 256 -56.8 256 -48V144C256 152.8 248.8 160 240 160z" /> + <glyph glyph-name="braille" + unicode="" + horiz-adv-x="640" d=" M128 192C128 156.654 99.346 128 64 128S0 156.654 0 192S28.654 256 64 256S128 227.346 128 192zM64 64C46.327 64 32 49.673 32 32S46.327 0 64 0S96 14.327 96 32S81.673 64 64 64zM64 416C28.654 416 0 387.346 0 352S28.654 288 64 288S128 316.654 128 352S99.346 416 64 416zM224 224C206.327 224 192 209.673 192 192S206.327 160 224 160S256 174.327 256 192S241.673 224 224 224zM224 64C206.327 64 192 49.673 192 32S206.327 0 224 0S256 14.327 256 32S241.673 64 224 64zM224 416C188.654 416 160 387.346 160 352S188.654 288 224 288S288 316.654 288 352S259.346 416 224 416zM448 224C430.327 224 416 209.673 416 192S430.327 160 448 160S480 174.327 480 192S465.673 224 448 224zM448 64C430.327 64 416 49.673 416 32S430.327 0 448 0S480 14.327 480 32S465.673 64 448 64zM448 416C412.654 416 384 387.346 384 352S412.654 288 448 288S512 316.654 512 352S483.346 416 448 416zM608 224C590.327 224 576 209.673 576 192S590.327 160 608 160S640 174.327 640 192S625.673 224 608 224zM608 64C590.327 64 576 49.673 576 32S590.327 0 608 0S640 14.327 640 32S625.673 64 608 64zM608 384C590.327 384 576 369.673 576 352S590.327 320 608 320S640 334.327 640 352S625.673 384 608 384z" /> + <glyph glyph-name="briefcase" + unicode="" + horiz-adv-x="512" d=" M320 160H512V16C512 -10.51 490.51 -32 464 -32H48C21.49 -32 0 -10.51 0 16V160H192V140C192 133.373 197.373 128 204 128H308C314.627 128 320 133.373 320 140V160zM512 272V192H0V272C0 298.51 21.49 320 48 320H128V368C128 394.51 149.49 416 176 416H336C362.51 416 384 394.51 384 368V320H464C490.51 320 512 298.51 512 272zM320 352H192V320H320V352z" /> + <glyph glyph-name="bug" + unicode="" + horiz-adv-x="512" d=" M511.988 159.1C511.51 141.67 496.771 128 479.335 128H424V112C424 90.136 419.118 69.416 410.4 50.855L470.628 -9.373C483.124 -21.87 483.124 -42.131 470.628 -54.628C458.13 -67.125 437.869 -67.124 425.372 -54.628L370.636 0.108C345.886 -19.965 314.351 -32 280 -32V212C280 218.627 274.627 224 268 224H244C237.373 224 232 218.627 232 212V-32C197.649 -32 166.114 -19.965 141.364 0.108L86.628 -54.628C74.13 -67.125 53.869 -67.124 41.372 -54.628C28.876 -42.131 28.876 -21.87 41.372 -9.373L101.6 50.855C92.882 69.416 88 90.136 88 112V128H32.666C15.23 128 0.491 141.67 0.013 159.1C-0.484 177.184 14.028 192 32 192H88V250.745L41.372 297.373C28.876 309.87 28.876 330.131 41.372 342.628C53.87 355.125 74.13 355.125 86.628 342.628L141.255 288H370.7440000000001L425.3710000000001 342.627C437.8690000000001 355.124 458.129 355.124 470.6270000000001 342.627C483.123 330.13 483.123 309.8690000000001 470.6270000000001 297.372L424 250.745V192H480C497.972 192 512.484 177.184 511.988 159.1zM257 448C195.144 448 145 397.856 145 336H369C369 397.856 318.856 448 257 448z" /> + <glyph glyph-name="building" + unicode="" + horiz-adv-x="448" d=" M436 -32H416V424C416 437.255 405.255 448 392 448H56C42.745 448 32 437.255 32 424V-32H12C5.373 -32 0 -37.373 0 -44V-64H448V-44C448 -37.373 442.627 -32 436 -32zM128 372C128 378.627 133.373 384 140 384H180C186.627 384 192 378.627 192 372V332C192 325.373 186.627 320 180 320H140C133.373 320 128 325.373 128 332V372zM128 276C128 282.627 133.373 288 140 288H180C186.627 288 192 282.627 192 276V236C192 229.373 186.627 224 180 224H140C133.373 224 128 229.373 128 236V276zM180 128H140C133.373 128 128 133.373 128 140V180C128 186.627 133.373 192 140 192H180C186.627 192 192 186.627 192 180V140C192 133.373 186.627 128 180 128zM256 -32H192V52C192 58.627 197.373 64 204 64H244C250.627 64 256 58.627 256 52V-32zM320 140C320 133.373 314.627 128 308 128H268C261.373 128 256 133.373 256 140V180C256 186.627 261.373 192 268 192H308C314.627 192 320 186.627 320 180V140zM320 236C320 229.373 314.627 224 308 224H268C261.373 224 256 229.373 256 236V276C256 282.627 261.373 288 268 288H308C314.627 288 320 282.627 320 276V236zM320 332C320 325.373 314.627 320 308 320H268C261.373 320 256 325.373 256 332V372C256 378.627 261.373 384 268 384H308C314.627 384 320 378.627 320 372V332z" /> + <glyph glyph-name="bullhorn" + unicode="" + horiz-adv-x="576" d=" M576 224C576 244.896 562.64 262.666 544 269.2580000000001V384C544 419.346 515.346 448 480 448C415.015 392 337.969 320 208 320H48C21.49 320 0 298.51 0 272V176C0 149.49 21.49 128 48 128H91.263C72.521 63.35 93.742 11.621 110.077 -39.44C111.779 -44.76 115.28 -49.333 119.999 -52.32C140.779 -65.475 188.354 -67.977 213.772 -57.471C229.818 -50.838 233.732 -30.048 221.294 -17.934C202.786 0.092 191.158 18.976 201.499 42.924A12.278 12.278 0 0 1 200.454 54.597C184.145 79.276 196.873 116.704 228.971 127.349C346.403 120.113 418.591 52.919 480 0C515.346 0 544 28.654 544 64V178.742C562.64 185.334 576 203.104 576 224zM480 84.145C425.391 129.124 354.967 177.085 256 189.127V258.874C354.967 270.916 425.391 318.876 480 363.856V84.145z" /> + <glyph glyph-name="bullseye" + unicode="" + horiz-adv-x="512" d=" M256 376C357.689 376 440 293.705 440 192C440 90.311 357.705 8 256 8C154.311 8 72 90.295 72 192C72 293.689 154.295 376 256 376M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 256C291.29 256 320 227.29 320 192S291.29 128 256 128S192 156.71 192 192S220.71 256 256 256M256 320C185.308 320 128 262.692 128 192S185.308 64 256 64S384 121.308 384 192S326.692 320 256 320z" /> + <glyph glyph-name="bus" + unicode="" + horiz-adv-x="512" d=" M512 296V216C512 202.745 501.255 192 488 192H480V24C480 10.745 469.255 0 456 0H448V-40C448 -53.255 437.255 -64 424 -64H376C362.745 -64 352 -53.255 352 -40V0H160V-40C160 -53.255 149.255 -64 136 -64H88C74.745 -64 64 -53.255 64 -40V0H56C42.745 0 32 10.745 32 24V192H24C10.745 192 0 202.745 0 216V296C0 309.255 10.745 320 24 320H32V368C32 412.183 132.288 448 256 448S480 412.183 480 368V320H488C501.255 320 512 309.255 512 296zM112 128C89.909 128 72 110.091 72 88S89.909 48 112 48S152 65.909 152 88S134.091 128 112 128zM400 128C377.909 128 360 110.091 360 88S377.909 48 400 48S440 65.909 440 88S422.091 128 400 128zM432 184V328C432 341.255 421.255 352 408 352H104C90.745 352 80 341.255 80 328V184C80 170.745 90.745 160 104 160H408C421.255 160 432 170.745 432 184z" /> + <glyph glyph-name="calculator" + unicode="" + horiz-adv-x="448" d=" M0 -16V400C0 426.51 21.49 448 48 448H400C426.51 448 448 426.51 448 400V-16C448 -42.51 426.51 -64 400 -64H48C21.49 -64 0 -42.51 0 -16zM384 268V372C384 378.627 378.627 384 372 384H76C69.373 384 64 378.627 64 372V268C64 261.373 69.373 256 76 256H372C378.627 256 384 261.373 384 268zM128 140V180C128 186.627 122.627 192 116 192H76C69.373 192 64 186.627 64 180V140C64 133.373 69.373 128 76 128H116C122.627 128 128 133.373 128 140zM384 12V180C384 186.627 378.627 192 372 192H332C325.373 192 320 186.627 320 180V12C320 5.373 325.373 0 332 0H372C378.627 0 384 5.373 384 12zM128 12V52C128 58.627 122.627 64 116 64H76C69.373 64 64 58.627 64 52V12C64 5.373 69.373 0 76 0H116C122.627 0 128 5.373 128 12zM256 140V180C256 186.627 250.627 192 244 192H204C197.373 192 192 186.627 192 180V140C192 133.373 197.373 128 204 128H244C250.627 128 256 133.373 256 140zM256 12V52C256 58.627 250.627 64 244 64H204C197.373 64 192 58.627 192 52V12C192 5.373 197.373 0 204 0H244C250.627 0 256 5.373 256 12z" /> + <glyph glyph-name="calendar-alt" + unicode="" + horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM128 52C128 58.6 122.6 64 116 64H76C69.4 64 64 58.6 64 52V12C64 5.4 69.4 0 76 0H116C122.6 0 128 5.4 128 12V52zM128 180C128 186.6 122.6 192 116 192H76C69.4 192 64 186.6 64 180V140C64 133.4 69.4 128 76 128H116C122.6 128 128 133.4 128 140V180zM256 52C256 58.6 250.6 64 244 64H204C197.4 64 192 58.6 192 52V12C192 5.4 197.4 0 204 0H244C250.6 0 256 5.4 256 12V52zM256 180C256 186.6 250.6 192 244 192H204C197.4 192 192 186.6 192 180V140C192 133.4 197.4 128 204 128H244C250.6 128 256 133.4 256 140V180zM384 52C384 58.6 378.6 64 372 64H332C325.4 64 320 58.6 320 52V12C320 5.4 325.4 0 332 0H372C378.6 0 384 5.4 384 12V52zM384 180C384 186.6 378.6 192 372 192H332C325.4 192 320 186.6 320 180V140C320 133.4 325.4 128 332 128H372C378.6 128 384 133.4 384 140V180z" /> + <glyph glyph-name="calendar-check" + unicode="" + horiz-adv-x="448" d=" M436 288H12C5.373 288 0 293.373 0 300V336C0 362.51 21.49 384 48 384H96V436C96 442.627 101.373 448 108 448H148C154.627 448 160 442.627 160 436V384H288V436C288 442.627 293.373 448 300 448H340C346.627 448 352 442.627 352 436V384H400C426.51 384 448 362.51 448 336V300C448 293.373 442.627 288 436 288zM12 256H436C442.627 256 448 250.627 448 244V-16C448 -42.51 426.51 -64 400 -64H48C21.49 -64 0 -42.51 0 -16V244C0 250.627 5.373 256 12 256zM345.296 160.053L317.127 188.451C312.4600000000001 193.156 304.862 193.187 300.1570000000001 188.519L194.12 83.335L148.14 129.687C143.473 134.392 135.874 134.423 131.169 129.755L102.772 101.5849999999999C98.067 96.918 98.036 89.3199999999999 102.704 84.6149999999999L185.305 1.3459999999999C189.972 -3.3590000000001 197.57 -3.3900000000001 202.275 1.2779999999999L345.228 143.0829999999999C349.933 147.7499999999999 349.964 155.3479999999999 345.296 160.0529999999999z" /> + <glyph glyph-name="calendar-minus" + unicode="" + horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM316 64C322.6 64 328 69.4 328 76V116C328 122.6 322.6 128 316 128H132C125.4 128 120 122.6 120 116V76C120 69.4 125.4 64 132 64H316z" /> + <glyph glyph-name="calendar-plus" + unicode="" + horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM328 116C328 122.6 322.6 128 316 128H256V188C256 194.6 250.6 200 244 200H204C197.4 200 192 194.6 192 188V128H132C125.4 128 120 122.6 120 116V76C120 69.4 125.4 64 132 64H192V4C192 -2.6 197.4 -8 204 -8H244C250.6 -8 256 -2.6 256 4V64H316C322.6 64 328 69.4 328 76V116z" /> + <glyph glyph-name="calendar-times" + unicode="" + horiz-adv-x="448" d=" M436 288H12C5.4 288 0 293.4 0 300V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336V300C448 293.4 442.6 288 436 288zM12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM269.3 96L317.4000000000001 144.1C322.1 148.8 322.1 156.4 317.4000000000001 161.1L289.1 189.4C284.4000000000001 194.1 276.8 194.1 272.1 189.4L224 141.3L175.9 189.4C171.2 194.1 163.6 194.1 158.9 189.4L130.6 161.1C125.9 156.4 125.9 148.8 130.6 144.1L178.7 96L130.6 47.9C125.9 43.2 125.9 35.6 130.6 30.9L158.9 2.6C163.6 -2.1 171.2 -2.1 175.9 2.6L224 50.7L272.1 2.6C276.8 -2.1 284.4000000000001 -2.1 289.1 2.6L317.4000000000001 30.9C322.1 35.6 322.1 43.2 317.4000000000001 47.9L269.3 96z" /> + <glyph glyph-name="calendar" + unicode="" + horiz-adv-x="448" d=" M12 256H436C442.6 256 448 250.6 448 244V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V244C0 250.6 5.4 256 12 256zM448 300V336C448 362.5 426.5 384 400 384H352V436C352 442.6 346.6 448 340 448H300C293.4 448 288 442.6 288 436V384H160V436C160 442.6 154.6 448 148 448H108C101.4 448 96 442.6 96 436V384H48C21.5 384 0 362.5 0 336V300C0 293.4 5.4 288 12 288H436C442.6 288 448 293.4 448 300z" /> + <glyph glyph-name="camera-retro" + unicode="" + horiz-adv-x="512" d=" M48 416C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416H48zM48 384H154C157.3 384 160 381.3 160 378V358C160 354.7 157.3 352 154 352H38C34.7 352 32 354.7 32 358V368C32 376.8 39.2 384 48 384zM474 288H38C34.7 288 32 290.7 32 294V330C32 333.3 34.7 336 38 336H176L206.2 381.3C207.3 383 209.2 384 211.2 384H464C472.8 384 480 376.8 480 368V294C480 290.7 477.3 288 474 288zM256 24C189.8 24 136 77.8 136 144S189.8 264 256 264S376 210.2 376 144S322.2 24 256 24zM256 232C207.5 232 168 192.5 168 144S207.5 56 256 56S344 95.5 344 144S304.5 232 256 232zM208 128C199.2 128 192 135.2 192 144C192 179.3 220.7 208 256 208C264.8 208 272 200.8 272 192S264.8 176 256 176C238.4 176 224 161.6 224 144C224 135.2 216.8 128 208 128z" /> + <glyph glyph-name="camera" + unicode="" + horiz-adv-x="512" d=" M512 304V16C512 -10.5 490.5 -32 464 -32H48C21.5 -32 0 -10.5 0 16V304C0 330.5 21.5 352 48 352H136L148.3 384.9C155.3 403.6 173.2 416 193.2 416H318.7000000000001C338.7000000000001 416 356.6 403.6 363.6 384.9L376 352H464C490.5 352 512 330.5 512 304zM376 160C376 226.2 322.2 280 256 280S136 226.2 136 160S189.8 40 256 40S376 93.8 376 160zM344 160C344 111.5 304.5 72 256 72S168 111.5 168 160S207.5 248 256 248S344 208.5 344 160z" /> + <glyph glyph-name="car" + unicode="" + horiz-adv-x="512" d=" M499.991 280H445.176L437.322 300.944C428.13 325.457 411.897 346.295 390.38 361.207S343.651 384 317.472 384H194.528C168.348 384 143.137 376.118 121.62 361.207C100.102 346.295 83.87 325.457 74.678 300.944L66.824 280H12.009C3.818 280 -1.965 271.976 0.625 264.2050000000001L8.625 240.205A12 12 0 0 1 20.009 232H48.824L48.772 231.86C29.222 220.907 16 200.003 16 176V128C16 111.775 22.049 96.971 32 85.691V24C32 10.745 42.745 0 56 0H104C117.255 0 128 10.745 128 24V64H384V24C384 10.745 394.745 0 408 0H456C469.255 0 480 10.745 480 24V85.691C489.951 96.972 496 111.776 496 128V176C496 200.003 482.778 220.907 463.228 231.86L463.176 232H491.991A12 12 0 0 1 503.375 240.205L511.375 264.2050000000001C513.965 271.976 508.182 280 499.991 280zM134.603 278.472C143.918 303.3110000000001 168 320 194.528 320H317.472C344 320 368.082 303.3110000000001 377.397 278.472L391.824 240H120.176L134.603 278.472zM88 120C70.327 120 56 134.327 56 152C56 169.673 70.327 184 88 184S136 153.673 136 136S105.673 120 88 120zM424 120C406.327 120 376 118.327 376 136C376 153.673 406.327 184 424 184S456 169.673 456 152C456 134.327 441.673 120 424 120z" /> + <glyph glyph-name="caret-down" + unicode="" + horiz-adv-x="320" d=" M31.3 256H288.6C306.4000000000001 256 315.3 234.5 302.7000000000001 221.9L174.1 93.2C166.3 85.4 153.6 85.4 145.8 93.2L17.2 221.9C4.6 234.5 13.5 256 31.3 256z" /> + <glyph glyph-name="caret-left" + unicode="" + horiz-adv-x="192" d=" M192 320.6620000000001V63.338C192 45.52 170.457 36.597 157.858 49.196L29.196 177.858C21.386 185.668 21.386 198.332 29.196 206.142L157.858 334.804C170.457 347.404 192 338.48 192 320.6620000000001z" /> + <glyph glyph-name="caret-right" + unicode="" + horiz-adv-x="192" d=" M0 63.338V320.6620000000001C0 338.48 21.543 347.403 34.142 334.804L162.804 206.142C170.614 198.332 170.614 185.668 162.804 177.858L34.142 49.196C21.543 36.596 0 45.52 0 63.338z" /> + <glyph glyph-name="caret-square-down" + unicode="" + horiz-adv-x="448" d=" M448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM92.5 227.5L215.5 104.5C220.2 99.8 227.8 99.8 232.5 104.5L355.5 227.5C363.1 235.1 357.7 248 347 248H101C90.3 248 84.9 235.1 92.5 227.5z" /> + <glyph glyph-name="caret-square-left" + unicode="" + horiz-adv-x="448" d=" M400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32zM259.515 323.515L136.485 200.485C131.799 195.799 131.799 188.201 136.485 183.514L259.514 60.485C267.074 52.925 279.999 58.279 279.999 68.97V315.029C280 325.7200000000001 267.074 331.074 259.5150000000001 323.515z" /> + <glyph glyph-name="caret-square-right" + unicode="" + horiz-adv-x="448" d=" M48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416zM188.485 60.485L311.514 183.514C316.2 188.2 316.2 195.798 311.514 200.485L188.485 323.515C180.925 331.0750000000001 168 325.721 168 315.0300000000001V68.971C168 58.28 180.926 52.926 188.485 60.485z" /> + <glyph glyph-name="caret-square-up" + unicode="" + horiz-adv-x="448" d=" M0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16zM355.515 156.485L232.485 279.515C227.799 284.201 220.201 284.201 215.514 279.515L92.485 156.485C84.925 148.925 90.279 136 100.97 136H347.029C357.72 136 363.074 148.926 355.515 156.485z" /> + <glyph glyph-name="caret-up" + unicode="" + horiz-adv-x="320" d=" M288.662 96H31.338C13.52 96 4.597 117.543 17.196 130.142L145.858 258.804C153.668 266.6140000000001 166.332 266.6140000000001 174.142 258.804L302.804 130.142C315.404 117.543 306.48 96 288.662 96z" /> + <glyph glyph-name="cart-arrow-down" + unicode="" + horiz-adv-x="576" d=" M504.717 128H211.572L218.117 96H486.535C501.936 96 513.351 81.699 509.938 66.681L504.421 42.405C523.112 33.332 536 14.172 536 -8C536 -39.202 510.481 -64.444 479.176 -63.994C449.353 -63.565 424.826 -39.3630000000001 424.021 -9.547C423.581 6.74 430.106 21.502 440.824 32.001H231.176C241.553 21.835 248 7.674 248 -8C248 -39.813 221.472 -65.431 189.33 -63.938C160.79 -62.613 137.579 -39.553 136.079 -11.021C134.921 11.013 146.515 30.434 164.13 40.5650000000001L93.883 384H24C10.745 384 0 394.745 0 408V424C0 437.255 10.745 448 24 448H126.529C137.93 448 147.757 439.979 150.042 428.81L159.208 384H551.99C567.391 384 578.806 369.699 575.393 354.681L528.12 146.681C525.637 135.754 515.923 128 504.717 128zM403.029 256H360V316C360 322.627 354.627 328 348 328H324C317.373 328 312 322.627 312 316V256H268.971C258.2800000000001 256 252.926 243.074 260.486 235.515L327.515 168.486C332.201 163.8 339.799 163.8 344.486 168.486L411.515 235.515C419.074 243.074 413.72 256 403.029 256z" /> + <glyph glyph-name="cart-plus" + unicode="" + horiz-adv-x="576" d=" M504.717 128H211.572L218.117 96H486.535C501.936 96 513.351 81.699 509.938 66.681L504.421 42.405C523.112 33.332 536 14.172 536 -8C536 -39.202 510.481 -64.444 479.176 -63.994C449.353 -63.565 424.826 -39.3630000000001 424.021 -9.547C423.581 6.74 430.106 21.502 440.824 32.001H231.176C241.553 21.835 248 7.674 248 -8C248 -39.813 221.472 -65.431 189.33 -63.938C160.79 -62.613 137.579 -39.553 136.079 -11.021C134.921 11.013 146.515 30.434 164.13 40.5650000000001L93.883 384H24C10.745 384 0 394.745 0 408V424C0 437.255 10.745 448 24 448H126.529C137.93 448 147.757 439.979 150.042 428.81L159.208 384H551.99C567.391 384 578.806 369.699 575.393 354.681L528.12 146.681C525.637 135.754 515.923 128 504.717 128zM408 280H360V320C360 328.837 352.837 336 344 336H328C319.163 336 312 328.837 312 320V280H264C255.163 280 248 272.837 248 264V248C248 239.163 255.163 232 264 232H312V192C312 183.163 319.163 176 328 176H344C352.837 176 360 183.163 360 192V232H408C416.837 232 424 239.163 424 248V264C424 272.837 416.837 280 408 280z" /> + <glyph glyph-name="certificate" + unicode="" + horiz-adv-x="512" d=" M458.622 192.08L504.607 237.085C518.315 250.062 511.923 273.124 493.943 277.424L431.2930000000001 293.414L448.9540000000001 355.4290000000001C453.9450000000001 373.2670000000001 437.1250000000001 390.092 419.2930000000001 385.1L357.2990000000001 367.433L341.3150000000001 430.1040000000001C337.085 447.803 313.765 454.276 300.99 440.772L256 394.43L211.011 440.771C198.381 454.122 174.964 448.005 170.686 430.103L154.702 367.432L92.707 385.099C74.87 390.093 58.056 373.262 63.046 355.428L80.707 293.413L18.057 277.423C0.069 273.122 -6.31 250.056 7.392 237.085L53.377 192.08L7.392 147.076C-6.316 134.0990000000001 0.076 111.037 18.056 106.737L80.706 90.747L63.045 28.732C58.054 10.894 74.874 -5.931 92.706 -0.939L154.7 16.7280000000001L170.684 -45.9429999999999C175.123 -64.5179999999999 198.38 -69.9609999999999 211.009 -56.6109999999999L256 -10.61L300.989 -56.611C313.489 -70.0989999999999 336.976 -64.097 341.314 -45.943L357.298 16.728L419.2919999999999 -0.939C437.128 -5.933 453.9429999999999 10.898 448.9529999999999 28.732L431.2919999999999 90.747L493.9419999999999 106.737C511.9289999999999 111.0390000000001 518.3079999999999 134.1040000000001 504.6059999999999 147.076L458.6219999999999 192.08z" /> + <glyph glyph-name="chart-area" + unicode="" + horiz-adv-x="512" d=" M500 64C506.6 64 512 58.6 512 52V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V64H500zM372.7 288.5L288 232L202.7 345.7C197.6 352.5 187.2 352 182.8 344.7L96 200V96H480L390.1 283.8C386.9000000000001 290.3 378.7000000000001 292.5 372.7000000000001 288.5z" /> + <glyph glyph-name="chart-bar" + unicode="" + horiz-adv-x="512" d=" M500 64C506.6 64 512 58.6 512 52V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V64H500zM192 108V180C192 186.6 186.6 192 180 192H140C133.4 192 128 186.6 128 180V108C128 101.4 133.4 96 140 96H180C186.6 96 192 101.4 192 108zM384 108V244C384 250.6 378.6 256 372 256H332C325.4 256 320 250.6 320 244V108C320 101.4 325.4 96 332 96H372C378.6 96 384 101.4 384 108zM288 108V308C288 314.6 282.6 320 276 320H236C229.4 320 224 314.6 224 308V108C224 101.4 229.4 96 236 96H276C282.6 96 288 101.4 288 108zM480 108V340C480 346.6 474.6 352 468 352H428C421.4 352 416 346.6 416 340V108C416 101.4 421.4 96 428 96H468C474.6 96 480 101.4 480 108z" /> + <glyph glyph-name="chart-line" + unicode="" + horiz-adv-x="512" d=" M500 64C506.6 64 512 58.6 512 52V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V64H500zM456 352H344C322.6 352 311.9 326.1 327 311L359.9 278.1L287.9 205.2L232.3 260.8C227.6 265.5 220.1 265.5 215.4 260.8L96.4 143C91.7 138.4 91.6 130.8 96.2 126.1L124.7 96.7000000000001C129.4 91.9 137.1 91.8000000000001 141.8 96.6L223.9 178.7000000000001L279.4 123.2000000000001C284.1 118.5000000000001 291.7 118.5000000000001 296.4 123.2000000000001L405.6 232.4000000000001L439 199C454.1 183.9 480 194.6 480 216V328C480 341.3 469.3 352 456 352z" /> + <glyph glyph-name="chart-pie" + unicode="" + horiz-adv-x="576" d=" M288 435.7V208H515.7C522.6 208 528 213.8 527.7 220.7C521.3000000000001 343.1 423.2000000000001 441.3 300.7000000000001 447.7C293.8000000000001 448 288.0000000000001 442.6 288.0000000000001 435.7zM552.7 160C559.6 160 565 154.2 564.7 147.3C561.9000000000001 94.1 541.5 41.7 503.5000000000001 -0.5C498.9 -5.6 490.9 -5.9 486.0000000000001 -1L325 160H552.7zM401 15C405.8 10.2 405.7 2.2 400.6 -2.3C358 -40.7 301.6 -64 239.8 -64C107.6 -63.9 -0.2 44.2 0 176.5C0.2 304.6 100.8 409.1 227.3 415.7C234.2 416.1 240 410.6 240 403.7V176L401 15z" /> + <glyph glyph-name="check-circle" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM227.314 60.686L411.314 244.686C417.562 250.934 417.562 261.065 411.314 267.313L388.687 289.94C382.439 296.189 372.308 296.189 366.059 289.94L216 139.882L145.941 209.941C139.693 216.189 129.562 216.189 123.313 209.941L100.686 187.314C94.438 181.066 94.438 170.935 100.686 164.687L204.686 60.687C210.935 54.438 221.065 54.438 227.314 60.686z" /> + <glyph glyph-name="check-square" + unicode="" + horiz-adv-x="448" d=" M400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368V16C448 -10.51 426.51 -32 400 -32zM195.314 66.059L379.314 250.059C385.562 256.307 385.562 266.438 379.314 272.686L356.687 295.313C350.439 301.561 340.308 301.562 334.059 295.313L184 145.255L113.941 215.314C107.693 221.562 97.562 221.562 91.313 215.314L68.686 192.687C62.438 186.439 62.438 176.308 68.686 170.06L172.686 66.06C178.935 59.81 189.065 59.81 195.314 66.059z" /> + <glyph glyph-name="check" + unicode="" + horiz-adv-x="512" d=" M173.898 8.596L7.498 174.996C-2.499 184.993 -2.499 201.202 7.498 211.2L43.701 247.404C53.698 257.402 69.908 257.402 79.905 247.404L192 135.31L432.0950000000001 375.404C442.0920000000001 385.401 458.302 385.401 468.299 375.404L504.5020000000001 339.2C514.499 329.203 514.499 312.9940000000001 504.5020000000001 302.996L210.1020000000001 8.595C200.1040000000001 -1.402 183.8950000000001 -1.402 173.8980000000001 8.5959999999999z" /> + <glyph glyph-name="chess-bishop" + unicode="" + horiz-adv-x="320" d=" M123.158 370.1190000000001C107.369 375.4700000000001 96 390.403 96 408C96 430.091 113.909 448 136 448H183.796C205.887 448 223.796 430.091 223.796 408C223.796 390.459 212.501 375.5660000000001 196.791 370.171C220.784 353.514 245.368 323.332 265.4940000000001 288.121L144.929 167.557A6 6 0 0 1 144.929 159.072L159.071 144.93A6 6 0 0 1 167.556 144.93L280.9 258.274C298.658 219.977 310.271 178.831 310.271 144.001C310.271 90.215 287.374 68.213 251.825 57.968V0H68.174V57.97C32.631 68.216 9.739 90.219 9.739 144C9.739 222.029 68.02 331.766 123.158 370.1190000000001zM320 -52V-28C320 -21.373 314.627 -16 308 -16H12C5.373 -16 0 -21.373 0 -28V-52C0 -58.627 5.373 -64 12 -64H308C314.627 -64 320 -58.627 320 -52z" /> + <glyph glyph-name="chess-board" + unicode="" + horiz-adv-x="512" d=" M256 192V128H192V192H256zM256 448H192V384H256V448zM256 192H320V256H256V192zM384 448H320V384H384V448zM384 -64H448V0H384V-64zM512 0V64H448V0H512zM128 -64H192V0H128V-64zM128 448H64V384H128V448zM512 256V320H448V256H512zM512 128V192H448V128H512zM0 -64H64V0H0V-64zM0 384V320H64V384H0zM0 256V192H64V256H0zM0 128V64H64V128H0zM256 -64H320V0H256V-64zM192 64V0H256V64H192zM256 256V320H192V256H256zM64 64V0H128V64H64zM128 192H64V128H128V192zM384 64H448V128H384V64zM512 448H448V384H512V448zM384 192H448V256H384V192zM384 384V320H448V384H384zM320 64V0H384V64H320zM128 128V64H192V128H128zM256 128V64H320V128H256zM192 256H128V192H192V256zM128 320H64V256H128V320zM320 128H384V192H320V128zM192 320V384H128V320H192zM320 320V384H256V320H320zM320 256H384V320H320V256z" /> + <glyph glyph-name="chess-king" + unicode="" + horiz-adv-x="448" d=" M416 -28V-52C416 -58.627 410.627 -64 404 -64H44C37.373 -64 32 -58.627 32 -52V-28C32 -21.373 37.373 -16 44 -16H404C410.627 -16 416 -21.373 416 -28zM407.967 296H248V344H298A6 6 0 0 1 304 350V386A6 6 0 0 1 298 392H248V442A6 6 0 0 1 242 448H206A6 6 0 0 1 200 442V392H150A6 6 0 0 1 144 386V350A6 6 0 0 1 150 344H200V296H40.033C12.459 296 -6.846 268.756 2.295 242.741L87.582 0H360.418L445.7050000000001 242.741C454.846 268.756 435.541 296 407.967 296z" /> + <glyph glyph-name="chess-knight" + unicode="" + horiz-adv-x="384" d=" M352 224V0H32V46.557C32 76.859 49.12 104.56 76.223 118.111L133.466 146.733A48 48 0 0 1 160 189.666V240L137.873 228.937A23.996 23.996 0 0 1 125.323 213.292L113.488 165.954A12 12 0 0 0 106.303 157.723L76.702 145.8830000000001A11.998 11.998 0 0 0 67.372 146.059L7.126 172.833A12 12 0 0 0 0 183.799V342.059C0 348.424 2.529 354.529 7.03 359.03L16 368L1.789 396.4220000000001A16.937 16.937 0 0 0 0 404C0 410.627 5.373 416 12 416H160C266.039 416 352 330.039 352 224zM372 -16H12C5.373 -16 0 -21.373 0 -28V-52C0 -58.627 5.373 -64 12 -64H372C378.627 -64 384 -58.627 384 -52V-28C384 -21.373 378.627 -16 372 -16zM52 320C40.954 320 32 311.046 32 300S40.954 280 52 280S72 288.954 72 300S63.046 320 52 320z" /> + <glyph glyph-name="chess-pawn" + unicode="" + horiz-adv-x="320" d=" M264 0H56S116 42.743 116 176H84C77.373 176 72 181.373 72 188V212C72 218.627 77.373 224 84 224H124.209C95.721 237.44 76 266.4120000000001 76 300C76 346.392 113.608 384 160 384S244 346.392 244 300C244 266.4120000000001 224.279 237.44 195.791 224H236C242.627 224 248 218.627 248 212V188C248 181.373 242.627 176 236 176H204C204 42.743 264 0 264 0zM292 -16H28C21.373 -16 16 -21.373 16 -28V-52C16 -58.627 21.373 -64 28 -64H292C298.627 -64 304 -58.627 304 -52V-28C304 -21.373 298.627 -16 292 -16z" /> + <glyph glyph-name="chess-queen" + unicode="" + horiz-adv-x="512" d=" M436 -64H76C69.373 -64 64 -58.627 64 -52V-28C64 -21.373 69.373 -16 76 -16H436C442.627 -16 448 -21.373 448 -28V-52C448 -58.627 442.627 -64 436 -64zM255.579 448C224.651 448 199.579 422.928 199.579 392S224.651 336 255.579 336S311.579 361.072 311.579 392S286.507 448 255.579 448zM460.147 293.366C454.3790000000001 296.411 447.2310000000001 294.298 444.0650000000001 288.596C435.4490000000001 273.0800000000001 421.3180000000001 250.795 400.0000000000001 250.795C371.2860000000001 250.795 369.3750000000001 270.5990000000001 368.3140000000001 308.337C368.1310000000001 314.829 362.8130000000001 320.0010000000001 356.3190000000001 320.0010000000001H315.3130000000001C310.1380000000001 320.0010000000001 305.5590000000001 316.673 303.9250000000002 311.7630000000001C295.0350000000002 285.0540000000001 277.8520000000002 270.7710000000001 256.0000000000001 270.7710000000001S216.9660000000001 285.0540000000001 208.0750000000001 311.7630000000001C206.4410000000001 316.673 201.8620000000001 320.0010000000001 196.6870000000001 320.0010000000001H155.6820000000001C149.1870000000001 320.0010000000001 143.8690000000001 314.827 143.6870000000001 308.3340000000001C142.6350000000001 270.692 140.7530000000001 250.795 111.9990000000001 250.795C91.3080000000001 250.795 78.1820000000001 271.019 67.5740000000001 288.8200000000001C64.3080000000001 294.3 57.3160000000001 296.2510000000001 51.6750000000001 293.273L12.4960000000001 272.5940000000001A12 12 0 0 1 6.9860000000001 257.449L112 0H400L505.014 257.448A12 12 0 0 1 499.504 272.593L460.147 293.366z" /> + <glyph glyph-name="chess-rook" + unicode="" + horiz-adv-x="384" d=" M81.241 232.973C80.957 189.08 77.411 99.924 48 0H335.9820000000001C306.5820000000001 99.604 303.0460000000001 188.912 302.761 232.975L348.1790000000001 275.287A11.998 11.998 0 0 1 351.999 284.067V404C351.999 410.627 346.6260000000001 416 339.999 416H299.999C293.372 416 287.999 410.627 287.999 404V360H239.999V404C239.999 410.627 234.6260000000001 416 227.999 416H155.999C149.372 416 143.999 410.627 143.999 404V360H96V404C96 410.627 90.627 416 84 416H44C37.373 416 32 410.627 32 404V284.068C32 280.738 33.384 277.558 35.82 275.288L81.241 232.973zM160 192C160 209.673 174.327 224 192 224C209.673 224 224 209.673 224 192V127.996H160V192zM384 -28V-52C384 -58.627 378.627 -64 372 -64H12C5.373 -64 0 -58.627 0 -52V-28C0 -21.373 5.373 -16 12 -16H372C378.627 -16 384 -21.373 384 -28z" /> + <glyph glyph-name="chess" + unicode="" + horiz-adv-x="512" d=" M199.821 230.367A6 6 0 0 0 205.821 224.367L205.82 203.601A6 6 0 0 0 199.82 197.601H174.015C174.015 165.886 171.862 101.4 191.413 44.372H64.597C84.54 102.548 82.02 168.755 82.02 197.601H56.183A6 6 0 0 0 50.183 203.601L50.185 224.367A6 6 0 0 0 56.185 230.367H199.821zM41.554 332.9120000000001L76.134 237.841H179.868L214.44 332.913C217.286 340.7390000000001 211.49 349.014 203.162 349.014H152V379.2340000000001H173.57A6 6 0 0 1 179.57 385.2340000000001V407.617A6 6 0 0 1 173.57 413.617H145.203V442A6 6 0 0 1 139.203 448H116.82A6 6 0 0 1 110.82 442V413.617H82.421A6 6 0 0 1 76.421 407.617V385.2340000000001A6 6 0 0 1 82.421 379.2340000000001H104V349.015H52.831C44.503 349.014 38.707 340.7390000000001 41.554 332.9120000000001zM222.678 2.83V30.897A6 6 0 0 1 216.678 36.897H39.322A6 6 0 0 1 33.322 30.897V2.83L11.174 -11.334A6 6 0 0 1 8.407 -16.389V-58A6 6 0 0 1 14.407 -64H241.594A6 6 0 0 1 247.594 -58V-16.388A6 6 0 0 1 244.8270000000001 -11.333L222.678 2.83zM313.256 147.055L338.136 130.0919999999999C338.226 111.9679999999999 337.969 66.1879999999999 326.231 15.5699999999999H473.757C462.044 66.045 461.788 111.894 461.875 130.107L486.734 147.056A3.856 3.856 0 0 1 488.418 150.243V220.144A3.8569999999999998 3.8569999999999998 0 0 1 484.561 224.001H456.9059999999999A3.8569999999999998 3.8569999999999998 0 0 1 453.0489999999999 220.144V188.63H430.3119999999999V220.144A3.8569999999999998 3.8569999999999998 0 0 1 426.4539999999999 224.001H373.5359999999999A3.8569999999999998 3.8569999999999998 0 0 1 369.6789999999999 220.144V188.63H346.9419999999999V220.144A3.8569999999999998 3.8569999999999998 0 0 1 343.0849999999998 224.001H315.43A3.8569999999999998 3.8569999999999998 0 0 1 311.573 220.144V150.243A3.8549999999999995 3.8549999999999995 0 0 1 313.256 147.055zM384.841 95.149C384.841 103.521 391.628 110.307 400 110.307S415.158 103.52 415.158 95.149V64.831H384.841V95.149zM504.62 -22.059L490.956 -11.42V4.132A3.8569999999999998 3.8569999999999998 0 0 1 487.099 7.989H312.915A3.8569999999999998 3.8569999999999998 0 0 1 309.058 4.132V-11.42L295.381 -22.059A3.8569999999999998 3.8569999999999998 0 0 1 293.893 -25.103V-60.142A3.8569999999999998 3.8569999999999998 0 0 1 297.75 -63.999H502.25A3.8569999999999998 3.8569999999999998 0 0 1 506.107 -60.142V-25.102A3.859 3.859 0 0 1 504.62 -22.059z" /> + <glyph glyph-name="chevron-circle-down" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55 393 -56 256 -56S8 55 8 192S119 440 256 440S504 329 504 192zM273 78.1L408.5 213.6C417.9 223 417.9 238.2 408.5 247.5000000000001L391.5 264.5C382.1 273.9000000000001 366.9 273.9000000000001 357.6 264.5L256 162.9L154.4 264.5C145 273.9 129.8 273.9 120.5 264.5L103.5 247.5C94.1 238.1 94.1 222.9 103.5 213.6L239 78.1C248.4 68.7000000000001 263.6 68.7000000000001 273 78.1z" /> + <glyph glyph-name="chevron-circle-left" + unicode="" + horiz-adv-x="512" d=" M256 -56C119 -56 8 55 8 192S119 440 256 440S504 329 504 192S393 -56 256 -56zM142.1 175L277.6 39.5C287 30.1 302.2000000000001 30.1 311.5 39.5L328.5 56.5C337.9 65.9 337.9 81.1 328.5 90.4L226.9 192L328.5 293.6C337.9 303 337.9 318.2 328.5 327.5L311.5 344.5C302.1 353.9 286.9 353.9 277.6 344.5L142.1 209C132.7 199.6 132.7 184.4 142.1 175z" /> + <glyph glyph-name="chevron-circle-right" + unicode="" + horiz-adv-x="512" d=" M256 440C393 440 504 329 504 192S393 -56 256 -56S8 55 8 192S119 440 256 440zM369.9 209L234.4 344.5C225 353.9 209.8 353.9 200.5 344.5L183.5 327.5C174.1 318.1 174.1 302.9 183.5 293.6L285.1 192L183.5 90.4C174.1 81 174.1 65.8 183.5 56.5L200.5 39.5C209.9 30.1 225.1 30.1 234.4 39.5L369.9 175C379.3 184.4 379.3 199.6 369.9 209z" /> + <glyph glyph-name="chevron-circle-up" + unicode="" + horiz-adv-x="512" d=" M8 192C8 329 119 440 256 440S504 329 504 192S393 -56 256 -56S8 55 8 192zM239 305.9L103.5 170.4C94.1 161 94.1 145.8 103.5 136.5L120.5 119.5C129.9 110.1 145.1 110.1 154.4 119.5L256 221.1L357.6 119.5C367 110.1 382.2000000000001 110.1 391.5 119.5L408.5 136.5C417.9 145.9 417.9 161.1 408.5 170.4L273 305.9C263.6 315.3 248.4 315.3 239 305.9z" /> + <glyph glyph-name="chevron-down" + unicode="" + horiz-adv-x="448" d=" M207.029 66.524L12.686 260.868C3.313 270.241 3.313 285.437 12.686 294.809L35.353 317.476C44.71 326.833 59.875 326.851 69.254 317.516L224 163.495L378.745 317.516C388.124 326.851 403.289 326.833 412.646 317.476L435.313 294.809C444.686 285.4360000000001 444.686 270.24 435.313 260.868L240.971 66.524C231.598 57.152 216.402 57.152 207.029 66.524z" /> + <glyph glyph-name="chevron-left" + unicode="" + horiz-adv-x="320" d=" M34.52 208.97L228.87 403.31C238.24 412.68 253.44 412.68 262.81 403.31L285.48 380.64C294.8400000000001 371.28 294.85 356.12 285.5200000000001 346.74L131.49 192L285.51 37.25C294.85 27.87 294.83 12.71 285.47 3.35L262.8 -19.32C253.43 -28.69 238.23 -28.69 228.86 -19.32L34.52 175.03C25.15 184.4 25.15 199.6 34.52 208.97z" /> + <glyph glyph-name="chevron-right" + unicode="" + horiz-adv-x="320" d=" M285.476 175.029L91.132 -19.314C81.759 -28.687 66.563 -28.687 57.191 -19.314L34.524 3.353C25.167 12.7099999999999 25.149 27.8749999999999 34.484 37.254L188.505 192L34.484 346.745C25.149 356.124 25.167 371.289 34.524 380.646L57.191 403.313C66.564 412.6860000000001 81.76 412.6860000000001 91.132 403.313L285.475 208.97C294.848 199.598 294.848 184.402 285.476 175.029z" /> + <glyph glyph-name="chevron-up" + unicode="" + horiz-adv-x="448" d=" M240.971 317.476L435.314 123.1330000000001C444.687 113.7600000000001 444.687 98.564 435.314 89.192L412.647 66.525C403.29 57.168 388.125 57.15 378.7459999999999 66.485L224 220.505L69.255 66.484C59.876 57.149 44.711 57.167 35.354 66.524L12.687 89.191C3.314 98.564 3.314 113.7600000000001 12.687 123.1320000000001L207.03 317.475C216.402 326.848 231.598 326.848 240.971 317.476z" /> + <glyph glyph-name="child" + unicode="" + horiz-adv-x="384" d=" M120 376C120 415.765 152.235 448 192 448S264 415.765 264 376C264 336.236 231.765 304 192 304S120 336.236 120 376zM374.627 374.627C362.1310000000001 387.124 341.8690000000001 387.124 329.373 374.627L242.745 288H141.254L54.627 374.627C42.131 387.124 21.869 387.124 9.373 374.627C-3.124 362.13 -3.124 341.8690000000001 9.373 329.372L104 234.746V-32C104 -49.673 118.327 -64 136 -64H152C169.673 -64 184 -49.673 184 -32V80H200V-32C200 -49.673 214.327 -64 232 -64H248C265.673 -64 280 -49.673 280 -32V234.746L374.627 329.373C387.124 341.87 387.124 362.13 374.627 374.627z" /> + <glyph glyph-name="circle-notch" + unicode="" + horiz-adv-x="512" d=" M288 408.944V392.2850000000001C288 381.481 295.281 372.126 305.686 369.219C383.204 347.5660000000001 440 276.482 440 192C440 90.311 357.705 8 256 8C154.311 8 72 90.295 72 192C72 276.4700000000001 128.786 347.564 206.312 369.219C216.719 372.126 224 381.483 224 392.288V408.936C224 424.645 209.166 436.089 193.954 432.17C86.603 404.5180000000001 7.394 306.794 8.003 190.668C8.723 53.616 119.48 -56.288 256.534 -55.999C393.255 -55.711 504 55.212 504 192C504 307.633 424.86 404.779 317.789 432.236C302.678 436.111 288 424.544 288 408.944z" /> + <glyph glyph-name="circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440z" /> + <glyph glyph-name="clipboard-check" + unicode="" + horiz-adv-x="384" d=" M336 384H256C256 419.3 227.3 448 192 448S128 419.3 128 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V336C384 362.5 362.5 384 336 384zM192 408C205.3 408 216 397.3 216 384S205.3 360 192 360S168 370.7 168 384S178.7 408 192 408zM313.2 176.2L170.2 34.4C165.5 29.7 157.9 29.8 153.2 34.5L70.6 117.8C65.9 122.5 66 130.1 70.7 134.8L99.1 163C103.8 167.7 111.4 167.6 116.1 162.9L162.1 116.5L268.1 221.7C272.8 226.4 280.4000000000001 226.3 285.1 221.6L313.3 193.2C318 188.4 317.9000000000001 180.9 313.2 176.2z" /> + <glyph glyph-name="clipboard-list" + unicode="" + horiz-adv-x="384" d=" M336 384H256C256 419.3 227.3 448 192 448S128 419.3 128 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V336C384 362.5 362.5 384 336 384zM96 24C82.7 24 72 34.7 72 48S82.7 72 96 72S120 61.3 120 48S109.3 24 96 24zM96 120C82.7 120 72 130.7 72 144S82.7 168 96 168S120 157.3 120 144S109.3 120 96 120zM96 216C82.7 216 72 226.7 72 240S82.7 264 96 264S120 253.3 120 240S109.3 216 96 216zM192 408C205.3 408 216 397.3 216 384S205.3 360 192 360S168 370.7 168 384S178.7 408 192 408zM320 40C320 35.6 316.4 32 312 32H168C163.6 32 160 35.6 160 40V56C160 60.4 163.6 64 168 64H312C316.4 64 320 60.4 320 56V40zM320 136C320 131.6 316.4 128 312 128H168C163.6 128 160 131.6 160 136V152C160 156.4 163.6 160 168 160H312C316.4 160 320 156.4 320 152V136zM320 232C320 227.6 316.4 224 312 224H168C163.6 224 160 227.6 160 232V248C160 252.4 163.6 256 168 256H312C316.4 256 320 252.4 320 248V232z" /> + <glyph glyph-name="clipboard" + unicode="" + horiz-adv-x="384" d=" M384 336V-16C384 -42.51 362.51 -64 336 -64H48C21.49 -64 0 -42.51 0 -16V336C0 362.51 21.49 384 48 384H128C128 419.29 156.71 448 192 448S256 419.29 256 384H336C362.51 384 384 362.51 384 336zM192 408C178.745 408 168 397.255 168 384S178.745 360 192 360S216 370.745 216 384S205.255 408 192 408M288 294V314A6 6 0 0 1 282 320H102A6 6 0 0 1 96 314V294A6 6 0 0 1 102 288H282A6 6 0 0 1 288 294z" /> + <glyph glyph-name="clock" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM313.1 89.9L224.9 154C221.8 156.3 220 159.9 220 163.7V332C220 338.6 225.4 344 232 344H280C286.6 344 292 338.6 292 332V194.3L355.5 148.1C360.9 144.2000000000001 362 136.7000000000001 358.1 131.3L329.9000000000001 92.5C326.0000000000001 87.2 318.5000000000001 86 313.1 89.9z" /> + <glyph glyph-name="clone" + unicode="" + horiz-adv-x="512" d=" M464 448C490.51 448 512 426.51 512 400V112C512 85.49 490.51 64 464 64H176C149.49 64 128 85.49 128 112V400C128 426.51 149.49 448 176 448H464M176 32C131.888 32 96 67.888 96 112V320H48C21.49 320 0 298.51 0 272V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V32H176z" /> + <glyph glyph-name="closed-captioning" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.5 384 0 362.5 0 336V48C0 21.5 21.5 0 48 0H464C490.5 0 512 21.5 512 48V336C512 362.5 490.5 384 464 384zM218.1 160.3C220.9 162.8 225.2 162.4 227.3 159.4L246.8 131.7000000000001C248.5 129.3000000000001 248.3 126.1 246.3 124.0000000000001C192.7 67.2000000000001 73.5 91.9 73.5 191.9000000000001C73.5 289.2000000000001 195.2 311.4000000000001 246 262.0000000000001C248.1 260.0000000000001 248.5 258.8000000000001 247 256.3000000000001L229.5 225.8000000000001C227.6 222.7000000000001 223.3 221.8000000000001 220.4 224.1000000000001C179.6 256.1000000000002 125.8 239.0000000000001 125.8 192.9000000000001C125.9 144.9000000000001 176.9 122.4000000000001 218.1 160.3000000000001zM408.5 160.3C411.3 162.8 415.6 162.4 417.7 159.4L437.2 131.7000000000001C438.9 129.3000000000001 438.7 126.1 436.7 124.0000000000001C383.2 67.1000000000001 264 91.9 264 191.9000000000001C264 289.2000000000001 385.7 311.4000000000001 436.5 262.0000000000001C438.6 260.0000000000001 439 258.8000000000001 437.5 256.3000000000001L420 225.8C418.1 222.7 413.8 221.8 410.9 224.1C370.1 256.1 316.3 239.0000000000001 316.3 192.9C316.3 144.9 367.3 122.4 408.5 160.3z" /> + <glyph glyph-name="cloud-download-alt" + unicode="" + horiz-adv-x="640" d=" M640 96C640 25.308 582.692 -32 512 -32H144C64.471 -32 0 32.471 0 112C0 174.773 40.171 228.155 96.204 247.867A163.68 163.68 0 0 0 96 256C96 344.366 167.634 416 256 416C315.288 416 367.0420000000001 383.752 394.684 335.841C409.935 346.046 428.271 352 448 352C501.019 352 544 309.019 544 256C544 243.816 541.725 232.164 537.585 221.44C596.017 209.586 640 157.93 640 96zM393.373 160H328V272C328 280.837 320.836 288 312 288H264C255.164 288 248 280.837 248 272V160H182.627C168.373 160 161.234 142.766 171.313 132.686L276.6860000000001 27.313C282.9340000000001 21.065 293.0650000000001 21.065 299.3130000000001 27.313L404.6860000000001 132.686C414.766 142.766 407.627 160 393.3730000000001 160z" /> + <glyph glyph-name="cloud-upload-alt" + unicode="" + horiz-adv-x="640" d=" M640 96C640 25.308 582.692 -32 512 -32H144C64.471 -32 0 32.471 0 112C0 174.773 40.171 228.155 96.204 247.867A163.68 163.68 0 0 0 96 256C96 344.366 167.634 416 256 416C315.288 416 367.0420000000001 383.752 394.684 335.841C409.935 346.046 428.271 352 448 352C501.019 352 544 309.019 544 256C544 243.816 541.725 232.164 537.585 221.44C596.017 209.586 640 157.93 640 96zM404.6860000000001 187.314L299.314 292.6860000000001C293.0660000000001 298.934 282.935 298.934 276.687 292.6860000000001L171.314 187.314C161.234 177.234 168.373 160 182.627 160H248V48C248 39.163 255.164 32 264 32H312C320.836 32 328 39.163 328 48V160H393.373C407.627 160 414.766 177.234 404.686 187.314z" /> + <glyph glyph-name="cloud" + unicode="" + horiz-adv-x="640" d=" M537.585 221.44C541.725 232.164 544 243.816 544 256C544 309.019 501.019 352 448 352C428.271 352 409.935 346.046 394.684 335.841C367.042 383.752 315.288 416 256 416C167.634 416 96 344.366 96 256C96 253.272 96.07 250.561 96.204 247.867C40.171 228.155 0 174.773 0 112C0 32.471 64.471 -32 144 -32H512C582.692 -32 640 25.308 640 96C640 157.93 596.017 209.586 537.585 221.44z" /> + <glyph glyph-name="code-branch" + unicode="" + horiz-adv-x="384" d=" M384 304C384 348.2 348.2 384 304 384S224 348.2 224 304C224 267.6 248.3 236.9 281.5 227.2C280.9 211.1 277.3 198.7 270.5 190.3C255.1 171.1 221.2 167.9 185.3 164.6C157.1 162 127.9 159.2000000000001 104 147.7000000000001V291.7000000000001C136.5 301.9000000000001 160 332.2000000000001 160 368.0000000000001C160 412.2000000000001 124.2 448.0000000000001 80 448.0000000000001S0 412.2 0 368C0 332.2 23.5 301.9 56 291.7V92.4C23.5 82.1 0 51.8 0 16C0 -28.2 35.8 -64 80 -64S160 -28.2 160 16C160 50 138.8 79.1 108.8 90.6C111.9 95.8 116.6 100.4 123.7 104C139.9 112.2 164.1 114.4 189.8 116.8C232 120.7 279.8 125.2 308 160.2C322 177.6 329.1 200 329.6 228.1C361.2000000000001 238.9 384 268.8 384 304zM80 384C88.8 384 96 376.8 96 368S88.8 352 80 352S64 359.2 64 368S71.2 384 80 384zM80 0C71.2 0 64 7.2 64 16S71.2 32 80 32S96 24.8 96 16S88.8 0 80 0zM304 320C312.8 320 320 312.8 320 304S312.8 288 304 288S288 295.2 288 304S295.2 320 304 320z" /> + <glyph glyph-name="code" + unicode="" + horiz-adv-x="640" d=" M278.9 -63.5L217.9 -45.8C211.5 -44 207.9 -37.3 209.7 -30.9L346.2 439.3C348 445.7 354.7 449.3 361.1 447.5L422.1 429.8C428.5 428 432.1 421.3 430.3 414.9L293.8 -55.3C291.9000000000001 -61.7 285.3 -65.4 278.9000000000001 -63.5zM164.9 48.7L208.4 95.1C213 99.9999999999999 212.7 107.8 207.6 112.3L117 192L207.6 271.7C212.7 276.2 213.1 284 208.4 288.9L164.9 335.3C160.4 340.1 152.8 340.4 147.9 335.8L3.8 200.8C-1.3 196.1 -1.3 188 3.8 183.3L147.9 48.2C152.8 43.6 160.4 43.8000000000001 164.9 48.7zM492.1 48.1L636.1999999999999 183.1999999999999C641.3 187.8999999999999 641.3 196 636.1999999999999 200.6999999999999L492.1 335.9C487.3 340.4 479.7 340.2 475.1 335.4L431.6 289C427 284.1 427.3 276.3 432.4000000000001 271.8L523 192L432.4 112.3C427.3 107.8 426.9 100 431.6 95.1L475.1 48.7C479.6 43.8000000000001 487.2 43.6 492.1 48.1z" /> + <glyph glyph-name="coffee" + unicode="" + horiz-adv-x="640" d=" M192 64H384C437 64 480 107 480 160H512C582.6 160 640 217.4 640 288S582.6 416 512 416H120C106.7 416 96 405.3 96 392V160C96 107 139 64 192 64zM512 352C547.3 352 576 323.3 576 288S547.3 224 512 224H480V352H512zM559.7 -32H48.3C0.7 -32 -12.7 32 12.3 32H595.5999999999999C620.5999999999999 32 607.3999999999999 -32 559.6999999999999 -32z" /> + <glyph glyph-name="cog" + unicode="" + horiz-adv-x="512" d=" M444.788 156.9L487.404 132.301C492.271 129.492 494.53 123.683 492.863 118.316C481.793 82.674 462.893 50.474 438.174 23.73A12.015999999999998 12.015999999999998 0 0 0 423.342 21.4759999999999L380.758 46.0709999999999A191.577 191.577 0 0 0 319.999 10.9409999999999V-38.2410000000001A12.01 12.01 0 0 0 310.622 -49.9590000000001C275.666 -57.8090000000001 238.123 -58.2150000000001 201.403 -49.9660000000001C195.913 -48.7330000000001 192 -43.8700000000001 192 -38.2430000000001V10.9409999999999A191.555 191.555 0 0 0 131.241 46.0709999999999L88.657 21.4759999999999A12.015999999999998 12.015999999999998 0 0 0 73.825 23.7299999999999C49.107 50.4739999999999 30.206 82.6739999999999 19.136 118.3159999999999C17.469 123.6819999999999 19.728 129.4909999999999 24.595 132.3009999999999L67.212 156.9A193.48000000000002 193.48000000000002 0 0 0 67.212 227.099L24.596 251.698C19.729 254.507 17.47 260.316 19.137 265.683C30.207 301.325 49.107 333.525 73.826 360.269A12.015999999999998 12.015999999999998 0 0 0 88.658 362.523L131.242 337.928A191.577 191.577 0 0 0 192.001 373.058V422.241A12.01 12.01 0 0 0 201.3780000000001 433.959C236.3340000000001 441.8090000000001 273.8770000000001 442.215 310.5970000000001 433.966C316.0870000000001 432.733 320.0000000000001 427.87 320.0000000000001 422.243V373.059A191.555 191.555 0 0 0 380.7590000000001 337.929L423.3430000000001 362.524A12.015999999999998 12.015999999999998 0 0 0 438.1750000000001 360.27C462.8930000000001 333.526 481.7940000000001 301.326 492.8640000000001 265.684C494.5310000000001 260.318 492.2720000000001 254.509 487.4050000000001 251.699L444.788 227.1A193.485 193.485 0 0 0 444.788 156.9zM336 192C336 236.112 300.112 272 256 272S176 236.112 176 192S211.888 112 256 112S336 147.888 336 192z" /> + <glyph glyph-name="cogs" + unicode="" + horiz-adv-x="640" d=" M512.1 257L503.9 242.7C500.9 237.4 494.5000000000001 235.2 488.8 237.3C477 241.7 466.2 248 456.7 255.9C452.1 259.7 450.9 266.4 453.9 271.6L462.1 285.9C455.2 293.9 449.8 303.2 446.2 313.3H429.7C423.7 313.3 418.5 317.6 417.5 323.6C415.5 335.6 415.4 348.2 417.5 360.7C418.5 366.7 423.7 371.1 429.7 371.1H446.2C449.8 381.2 455.2 390.5 462.1 398.5L453.9 412.8C450.9 418 452 424.7 456.7 428.5C466.2 436.4 477.1 442.7 488.8 447.1C494.5 449.2 500.9 447 503.9 441.7L512.1 427.4C522.6 429.3 533.3000000000001 429.3 543.8000000000001 427.4L552 441.7C555 447 561.4 449.2 567.1 447.1C578.9 442.7 589.7 436.4 599.2 428.5C603.8000000000001 424.7 605 418 602 412.8L593.8 398.5C600.6999999999999 390.5 606.0999999999999 381.2 609.6999999999999 371.1H626.1999999999999C632.1999999999999 371.1 637.4 366.8 638.4 360.8C640.4 348.8 640.5 336.2 638.4 323.7C637.4 317.7 632.1999999999999 313.3 626.1999999999999 313.3H609.6999999999999C606.0999999999999 303.2 600.6999999999999 293.9 593.8 285.9L602 271.6C605 266.4 603.9 259.7 599.2 255.9C589.7 248 578.8000000000001 241.7 567.1 237.3C561.4 235.2 555 237.4 552 242.7L543.8 257C533.4 255.1 522.5999999999999 255.1 512.0999999999999 257zM501.6 315.8C540.1 286.2000000000001 584 330.1 554.4 368.6C515.9 398.3 472 354.3 501.6 315.8zM386.3 161.9L420 145.1C430.1 139.3 434.5 127 430.5 116C421.6 91.8 404.1 69.6 387.9 50.1999999999999C380.5 41.3 367.7 39.0999999999999 357.6 44.8999999999999L328.5 61.6999999999999C312.5 47.9999999999999 293.8999999999999 37.0999999999999 273.6 29.9999999999999V-3.6000000000001C273.6 -15.2000000000001 265.3 -25.2000000000001 253.9 -27.2000000000001C229.3 -31.4000000000001 203.5 -31.6000000000001 178 -27.2000000000001C166.5 -25.2000000000001 158 -15.3000000000001 158 -3.6000000000001V30C137.7 37.2 119.1 48 103.1 61.7L74 45C64 39.2 51.1 41.4 43.7 50.3C27.5 69.7 10.4 91.9 1.5 116C-2.5 126.9 1.9 139.2 12 145.1L45.3 161.9C41.4 182.8 41.4 204.3000000000001 45.3 225.3000000000001L12 242.2C1.9 248 -2.6 260.3 1.5 271.2C10.4 295.4 27.5 317.6 43.7 337C51.1 345.9 63.9 348.1 74 342.3L103.1 325.5C119.1 339.2 137.7 350.1 158 357.2V390.9C158 402.4 166.2 412.4 177.6 414.4C202.2 418.6 228.1 418.8 253.6 414.5C265.1 412.5 273.6 402.6 273.6 390.9V357.3C293.9000000000001 350.1 312.5 339.3 328.5 325.6L357.6 342.4C367.6 348.2 380.5 346 387.9000000000001 337.1C404.1 317.7 421.1 295.5 430.0000000000001 271.3C434.0000000000001 260.4 430.1000000000001 248.1 420.0000000000001 242.2L386.3000000000001 225.4C390.2000000000001 204.4 390.2000000000001 182.9 386.3000000000001 161.9zM268.7000000000001 140.8C327.9000000000001 217.8 240.0000000000001 305.7 163.0000000000001 246.5C103.8000000000001 169.5 191.7000000000001 81.5999999999999 268.7000000000001 140.8zM512.1 -41.9L503.9 -56.2C500.9 -61.5000000000001 494.5000000000001 -63.7 488.8 -61.6C477 -57.2 466.2 -50.9 456.7 -43C452.1 -39.2 450.9 -32.5 453.9 -27.3L462.1 -13C455.2 -5 449.8 4.3 446.2 14.4H429.7C423.7 14.4 418.5 18.7 417.5 24.7C415.5 36.7 415.4 49.3 417.5 61.8C418.5 67.8 423.7 72.2 429.7 72.2H446.2C449.8 82.3 455.2 91.6 462.1 99.6L453.9 113.9C450.9 119.1 452 125.8 456.7 129.6C466.2 137.5 477.1 143.8 488.8 148.2C494.5 150.3 500.9 148.1 503.9 142.8L512.1 128.5C522.6 130.4 533.3000000000001 130.4 543.8000000000001 128.5L552.0000000000001 142.8C555.0000000000001 148.1 561.4000000000001 150.3 567.1000000000001 148.2C578.9000000000001 143.8 589.7000000000002 137.5 599.2000000000002 129.6C603.8000000000002 125.8 605.0000000000001 119.1 602.0000000000001 113.9L593.8000000000001 99.6C600.7 91.6 606.1 82.3 609.7 72.2H626.2C632.2 72.2 637.4000000000001 67.9 638.4000000000001 61.9C640.4000000000001 49.9 640.5000000000001 37.3 638.4000000000001 24.8C637.4000000000001 18.8 632.2 14.4 626.2 14.4H609.7C606.1 4.3 600.7 -5 593.8000000000001 -13L602.0000000000001 -27.3C605.0000000000001 -32.5 603.9000000000001 -39.2 599.2000000000002 -43C589.7000000000002 -50.9 578.8000000000002 -57.2 567.1000000000001 -61.6C561.4000000000001 -63.7 555.0000000000001 -61.5 552.0000000000001 -56.2L543.8000000000001 -41.9C533.4000000000001 -43.8 522.6 -43.8 512.1 -41.9zM501.6 17C540.1 -12.6 584 31.3 554.4 69.8C515.9 99.4 472 55.5 501.6 17z" /> + <glyph glyph-name="columns" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H464C490.51 -32 512 -10.51 512 16V368C512 394.51 490.51 416 464 416zM224 32H64V288H224V32zM448 32H288V288H448V32z" /> + <glyph glyph-name="comment-alt" + unicode="" + horiz-adv-x="576" d=" M576 208C576 93 447 0 288 0C239.7 0 194.1 8.6 154.1 23.8C113.8 -7.4 64.3 -26.5 11.7 -31.9C6.5 -32.5 1.5 -29.1 0.2 -24.2C-1.1 -19.2 2.9 -16.1 6.8 -12.4C26.1 6 49.5 20.4 58.7 82.2000000000001C21.9 117.1 0 160.7 0 208C0 322.9 129 416 288 416S576 322.9 576 208zM160 256C133.5 256 112 234.5 112 208S133.5 160 160 160S208 181.5 208 208S186.5 256 160 256zM288 256C261.5 256 240 234.5 240 208S261.5 160 288 160S336 181.5 336 208S314.5 256 288 256zM416 256C389.5 256 368 234.5 368 208S389.5 160 416 160S464 181.5 464 208S442.5 256 416 256z" /> + <glyph glyph-name="comment" + unicode="" + horiz-adv-x="576" d=" M576 208C576 93 447 0 288 0C239.7 0 194.1 8.6 154.1 23.8C113.8 -7.4 64.3 -26.5 11.7 -31.9C6.5 -32.5 1.5 -29.1 0.2 -24.2C-1.1 -19.2 2.9 -16.1 6.8 -12.4C26.1 6 49.5 20.4 58.7 82.2000000000001C21.9 117.1 0 160.7 0 208C0 322.9 129 416 288 416S576 322.9 576 208z" /> + <glyph glyph-name="comments" + unicode="" + horiz-adv-x="576" d=" M224 89.143C186.401 89.143 150.973 95.906 119.857 107.843C88.482 83.294 49.988 68.335 9.093 64.047A8.632 8.632 0 0 0 8.203 63.9999999999999C4.467 63.9999999999999 1.092 66.4979999999999 0.186 70.0609999999999C-0.794 74.0219999999999 2.274 76.4599999999999 5.312 79.3659999999999C20.329 93.805 38.534 105.156 45.654 153.6629999999999C17.015 181.114 0 215.378 0 252.571C0 342.8400000000001 100.297 416 224 416S448 342.841 448 252.571C447.999 162.239 347.703 89.143 224 89.143zM571.067 -18.0310000000001C557.123 -4.9040000000001 540.218 5.415 533.607 49.5119999999999C602.415 114.0799999999999 585.778 206.447 495.933 256.577C495.964 255.243 495.999 253.91 495.999 252.571C495.999 130.078 366.416 36.1769999999999 211.747 41.3489999999999C249.868 10.3879999999999 305.736 -9.1430000000001 367.999 -9.1430000000001C402.913 -9.1430000000001 435.81 -2.9950000000001 464.703 7.8569999999999C493.837 -14.4600000000001 529.581 -28.0590000000001 567.5559999999999 -31.9570000000001C571.3419999999999 -32.3520000000001 574.919 -29.9840000000001 575.8259999999999 -26.4900000000001C576.7369999999999 -22.8890000000001 573.8879999999999 -20.6730000000001 571.0669999999999 -18.0310000000001z" /> + <glyph glyph-name="compass" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM307.4460000000001 327.156L204.804 229.377A23.997 23.997 0 0 1 198.0320000000001 217.648L164.673 79.869C158.993 56.41 187.4500000000001 40.551 204.553 56.845L307.1930000000001 154.624A23.99 23.99 0 0 1 313.9650000000001 166.353L347.324 304.132C352.942 327.3300000000001 324.733 343.625 307.4460000000001 327.156zM256 224C238.327 224 224 209.673 224 192S238.327 160 256 160S288 174.327 288 192S273.673 224 256 224z" /> + <glyph glyph-name="compress" + unicode="" + horiz-adv-x="448" d=" M436 256H312C298.7 256 288 266.7 288 280V404C288 410.6 293.4 416 300 416H340C346.6 416 352 410.6 352 404V320H436C442.6 320 448 314.6 448 308V268C448 261.4 442.6 256 436 256zM160 280V404C160 410.6 154.6 416 148 416H108C101.4 416 96 410.6 96 404V320H12C5.4 320 0 314.6 0 308V268C0 261.4 5.4 256 12 256H136C149.3 256 160 266.7 160 280zM160 -20V104C160 117.3 149.3 128 136 128H12C5.4 128 0 122.6 0 116V76C0 69.4 5.4 64 12 64H96V-20C96 -26.6 101.4 -32 108 -32H148C154.6 -32 160 -26.6 160 -20zM352 -20V64H436C442.6 64 448 69.4 448 76V116C448 122.6 442.6 128 436 128H312C298.7 128 288 117.3 288 104V-20C288 -26.6 293.4 -32 300 -32H340C346.6 -32 352 -26.6 352 -20z" /> + <glyph glyph-name="copy" + unicode="" + horiz-adv-x="448" d=" M320 0V-40C320 -53.255 309.255 -64 296 -64H24C10.745 -64 0 -53.255 0 -40V328C0 341.255 10.745 352 24 352H96V56C96 25.121 121.121 0 152 0H320zM320 344V448H152C138.745 448 128 437.255 128 424V56C128 42.745 138.745 32 152 32H424C437.255 32 448 42.745 448 56V320H344C330.8 320 320 330.8 320 344zM440.971 375.029L375.029 440.971A24 24 0 0 1 358.0590000000001 448H352V352H448V358.059A24 24 0 0 1 440.971 375.029z" /> + <glyph glyph-name="copyright" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM373.134 93.247C371.5420000000001 91.38 333.358 47.516 263.283 47.516C178.591 47.516 118.799 110.776 118.799 193.083C118.799 274.386 180.803 336.4840000000001 262.5610000000001 336.4840000000001C329.5180000000001 336.4840000000001 364.5260000000001 299.1690000000001 365.9830000000001 297.5800000000001A12 12 0 0 0 367.2210000000001 282.9570000000001L344.8410000000001 248.3020000000001C340.7920000000001 242.0350000000001 332.0670000000001 240.9510000000001 326.6070000000001 246.0070000000001C326.3740000000001 246.2210000000001 300.0780000000001 269.8870000000001 264.7270000000001 269.8870000000001C218.6110000000001 269.8870000000001 190.8110000000001 236.3120000000001 190.8110000000001 193.8050000000001C190.8110000000001 154.2030000000001 216.3250000000001 114.1130000000001 265.0880000000001 114.1130000000001C303.7850000000001 114.1130000000001 330.3680000000001 142.4510000000001 330.6320000000001 142.7380000000001C335.7640000000001 148.3030000000001 344.6910000000001 147.7710000000001 349.1400000000001 141.6850000000001L373.6870000000001 108.1130000000001A12.001000000000001 12.001000000000001 0 0 0 373.1340000000001 93.2470000000001z" /> + <glyph glyph-name="credit-card" + unicode="" + horiz-adv-x="576" d=" M0 16C0 -10.5 21.5 -32 48 -32H528C554.5 -32 576 -10.5 576 16V192H0V16zM192 84C192 90.6 197.4 96 204 96H340C346.6 96 352 90.6 352 84V44C352 37.4 346.6 32 340 32H204C197.4 32 192 37.4 192 44V84zM64 84C64 90.6 69.4 96 76 96H148C154.6 96 160 90.6 160 84V44C160 37.4 154.6 32 148 32H76C69.4 32 64 37.4 64 44V84zM576 368V320H0V368C0 394.5 21.5 416 48 416H528C554.5 416 576 394.5 576 368z" /> + <glyph glyph-name="crop" + unicode="" + horiz-adv-x="512" d=" M488 96H448V338.7L505 395.7C514.4 405.1 514.4 420.3 505 429.6L493.7 441C484.3 450.4 469.1 450.4 459.8 441L402.8 384H160V424C160 437.3 149.3 448 136 448H88C74.7 448 64 437.3 64 424V384H24C10.7 384 0 373.3 0 360V312C0 298.7 10.7 288 24 288H64V24C64 10.7 74.7 0 88 0H352V-40C352 -53.3 362.7 -64 376 -64H424C437.3 -64 448 -53.3 448 -40V0H488C501.3 0 512 10.7 512 24V72C512 85.3 501.3 96 488 96zM306.7 288L160 141.3V288H306.7zM205.3 96L352 242.7V96H205.3z" /> + <glyph glyph-name="crosshairs" + unicode="" + horiz-adv-x="512" d=" M500 224H469.636C455.724 317.675 381.675 391.724 288 405.636V436C288 442.627 282.627 448 276 448H236C229.373 448 224 442.627 224 436V405.636C130.325 391.724 56.276 317.675 42.364 224H12C5.373 224 0 218.627 0 212V172C0 165.373 5.373 160 12 160H42.364C56.276 66.325 130.325 -7.724 224 -21.636V-52C224 -58.627 229.373 -64 236 -64H276C282.627 -64 288 -58.627 288 -52V-21.636C381.675 -7.724 455.724 66.325 469.636 160H500C506.627 160 512 165.373 512 172V212C512 218.627 506.627 224 500 224zM288 43.366V84C288 90.627 282.627 96 276 96H236C229.373 96 224 90.627 224 84V43.366C165.826 55.768 119.783 101.757 107.366 160H148C154.627 160 160 165.373 160 172V212C160 218.627 154.627 224 148 224H107.366C119.768 282.174 165.757 328.217 224 340.634V300C224 293.373 229.373 288 236 288H276C282.627 288 288 293.373 288 300V340.634C346.174 328.232 392.217 282.243 404.634 224H364C357.373 224 352 218.627 352 212V172C352 165.373 357.373 160 364 160H404.634C392.2320000000001 101.826 346.243 55.783 288 43.366zM288 192C288 174.327 273.673 160 256 160S224 174.327 224 192C224 209.673 238.327 224 256 224S288 209.673 288 192z" /> + <glyph glyph-name="cube" + unicode="" + horiz-adv-x="512" d=" M239.1 441.7L31.1 363.7C12.4 356.7 0 338.7 0 318.7V93.6C0 75.4 10.3 58.8 26.5 50.7L234.5 -53.3C248 -60.1 263.9 -60.1 277.4 -53.3L485.4 50.7C501.7 58.8000000000001 511.9 75.5000000000001 511.9 93.6V318.7C511.9 338.7 499.5 356.6 480.8 363.6L272.8 441.6C262 445.8 250 445.8 239.1 441.7zM256 379.6L448 307.6V306.5L256 228.5L64 306.5V307.6L256 379.6zM288 23.6V172.5L448 237.5V103.6L288 23.6z" /> + <glyph glyph-name="cubes" + unicode="" + horiz-adv-x="512" d=" M488.6 197.8L392 234V342.5C392 357.5 382.7 370.9 368.6 376.2L268.6 413.7C260.5 416.8 251.5000000000001 416.8 243.3 413.7L143.3 376.2C129.2 370.9 119.9 357.5 119.9 342.5V234L23.3 197.8C9.3 192.5 0 179.1 0 164.1V54C0 40.4 7.7 27.9 19.9 21.8L119.9 -28.2C130 -33.3 142 -33.3 152.1 -28.2L256 23.8L359.9 -28.2C370 -33.3 382 -33.3 392.1 -28.2L492.1 21.8C504.3 27.9 511.9999999999999 40.4 511.9999999999999 54V164.1C511.9999999999999 179.1 502.6999999999999 192.5 488.6 197.8zM358 233.2L273 201.3V269.5L358 306.5V233.2zM154 343.9L256 382.1L358 343.9V343.3L256 301.9L154 343.3V343.9zM238 52.8L153 10.3V89.4L238 128.2V52.8zM238 164.8L136 123.4L34 164.8V165.4L136 203.6L238 165.4V164.8zM478 52.8L393 10.3V89.4L478 128.2V52.8zM478 164.8L376 123.4L274 164.8V165.4L376 203.6L478 165.4V164.8z" /> + <glyph glyph-name="cut" + unicode="" + horiz-adv-x="448" d=" M444.485 25.574C449.1740000000001 20.885 449.1690000000001 13.287 444.485 8.603C411.6810000000001 -24.201 358.4940000000001 -24.201 325.69 8.603L210.176 124.117L185.317 99.258C189.63 88.343 192 76.448 192 64C192 10.981 149.019 -32 96 -32S0 10.981 0 64S42.981 160 96 160C100.536 160 104.995 159.678 109.363 159.07L142.293 192L109.363 224.93C104.995 224.322 100.536 224 96 224C42.981 224 0 266.981 0 320S42.981 416 96 416S192 373.019 192 320C192 307.552 189.63 295.6570000000001 185.318 284.742L210.177 259.883L325.69 375.397C358.4940000000001 408.201 411.681 408.201 444.485 375.397C449.1690000000001 370.713 449.1740000000001 363.115 444.485 358.426L278.0590000000001 192L444.485 25.574zM96 352C78.355 352 64 337.645 64 320S78.355 288 96 288S128 302.355 128 320S113.645 352 96 352M96 96C78.355 96 64 81.645 64 64S78.355 32 96 32S128 46.355 128 64S113.645 96 96 96M208 204C201.373 204 196 198.627 196 192S201.373 180 208 180S220 185.373 220 192S214.627 204 208 204z" /> + <glyph glyph-name="database" + unicode="" + horiz-adv-x="448" d=" M448 374.857V329.1430000000001C448 288.857 347.667 256 224 256S0 288.857 0 329.1430000000001V374.857C0 415.1430000000001 100.333 448 224 448S448 415.1430000000001 448 374.857zM448 272V169.143C448 128.857 347.667 96 224 96S0 128.857 0 169.143V272C48.125 238.857 136.208 223.428 224 223.428S399.874 238.857 448 272zM448 112V9.143C448 -31.143 347.667 -64 224 -64S0 -31.143 0 9.143V112C48.125 78.857 136.208 63.428 224 63.428S399.874 78.857 448 112z" /> + <glyph glyph-name="deaf" + unicode="" + horiz-adv-x="512" d=" M216 188C216 172.536 203.464 160 188 160S160 172.536 160 188C160 232.112 195.888 268 240 268S320 232.112 320 188C320 172.536 307.464 160 292 160S264 172.536 264 188C264 201.234 253.233 212 240 212S216 201.234 216 188zM240 364C142.953 364 64 285.0470000000001 64 188C64 172.536 76.536 160 92 160S120 172.536 120 188C120 254.168 173.832 308 240 308S360 254.168 360 188C360 112.836 288.991 117.689 288.003 44.378L288 44C288 15.327 264.673 -8 236 -8C220.536 -8 208 -20.536 208 -36S220.536 -64 236 -64C295.475 -64 343.876 -15.672 344 43.774C344.5950000000001 78.202 416 92.014 416 188C416 285.0470000000001 337.0470000000001 364 240 364zM508.485 416.201L480.2 444.485C475.513 449.171 467.916 449.171 463.229 444.485L376.2 357.456C371.514 352.77 371.514 345.1720000000001 376.2 340.485L404.485 312.2C409.171 307.514 416.769 307.514 421.4550000000001 312.2L508.485 399.229C513.172 403.917 513.172 411.515 508.485 416.201zM168.97 133.255C164.284 137.941 156.686 137.941 152 133.255L3.515 -15.23C-1.171 -19.916 -1.171 -27.514 3.515 -32.201L31.8 -60.485C36.487 -65.171 44.084 -65.171 48.771 -60.485L197.256 88C201.942 92.686 201.942 100.284 197.256 104.971L168.97 133.255z" /> + <glyph glyph-name="desktop" + unicode="" + horiz-adv-x="576" d=" M528 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H240L224 -16H152C138.7 -16 128 -26.7 128 -40S138.7 -64 152 -64H424C437.3 -64 448 -53.3 448 -40S437.3 -16 424 -16H352L336 32H528C554.5 32 576 53.5 576 80V400C576 426.5 554.5 448 528 448zM512 96H64V384H512V96z" /> + <glyph glyph-name="dna" + unicode="" + horiz-adv-x="448" d=" M447.9 430.1C449 439.6 441.6 447.9 432 447.9L399.6 448C391.5 448 384.7000000000001 442.1 383.6 434.1C382.9000000000001 429.2 381.8 423 380.2000000000001 416H67.9C66.3 422.9 65 429.2 64.4 434.1C63.3 442.1 56.5 448.1 48.4 448L16.1 447.9C6.5 447.9 -1 439.6 0.1 430.1C4.7 392.2 25.7 301.1 119 222.4C136.6 234.8 156.1 246.6 177.5 257.8C171.3 262.4 166.1 267.2000000000001 160.5 272H288.1C266.8 253.9 241.1 236.4 209.4 220.6C37.5 135.1 5.9 1.8 0.1 -46.1C-1 -55.6 6.4 -63.9 16 -63.9L48.3 -64C56.4 -64 63.2 -58.1 64.3 -50.1C65 -45.2 66.1 -39 67.7 -32H380.1C381.7 -39 382.8 -45.1 383.5 -50.1C384.6 -58.1 391.3999999999999 -64.1 399.5 -64L431.8 -63.9C441.4 -63.9 448.9 -55.6 447.7 -46.1C442.7 -3.2 416.5999999999999 107.8000000000001 288 192C416.5 276.2 442.7 387.2 447.9 430.1zM224 155.6C249.1 141.9 270.4 127.2000000000001 288.3 112H159.7C177.6 127.2 198.9 142 224 155.6zM92.9 32C98.7 42.4 105.7 53.1 113.9 64H333.9C342.2 53.1 349.2 42.4 354.9 32H92.9zM355.1 352C349.3 341.6 342.3 330.9 334.1 320H114.6C106.3 330.9 99.2 341.6 93.4 352H355.1z" /> + <glyph glyph-name="dollar-sign" + unicode="" + horiz-adv-x="320" d=" M113.411 278.625C113.411 301.962 134.947 317.0420000000001 168.276 317.0420000000001C195.002 317.0420000000001 222.392 304.779 244.737 288.709C250.617 284.48 258.867 286.355 262.312 292.726L285.8640000000001 336.275C288.5130000000001 341.173 287.4600000000001 347.266 283.2890000000001 350.9550000000001C259.0080000000001 372.432 224.1540000000001 385.045 192.0000000000001 388.761V436C192.0000000000001 442.627 186.6270000000001 448 180.0000000000001 448H140.0000000000001C133.3730000000001 448 128.0000000000001 442.627 128.0000000000001 436V386.168C69.3730000000001 372.878 30.7010000000001 330.251 30.7010000000001 277.529C30.7010000000001 153.996 215.466 166.719 215.466 108.115C215.466 88.292 199.155 66.957 163.3420000000001 66.957C132.591 66.957 100.41 82.837 75.494 102.844C70.184 107.108 62.412 106.159 58.335 100.704L27.946 60.037C24.319 55.1830000000001 24.871 48.3800000000001 29.248 44.1900000000001C53.297 21.1700000000001 88.497 2.9350000000001 127.9990000000001 -3.783V-52C127.9990000000001 -58.627 133.3720000000001 -64 139.9990000000001 -64H179.9990000000001C186.6260000000001 -64 191.9990000000001 -58.627 191.9990000000001 -52V-4.562C257.7190000000001 5.653 298.1750000000001 54.624 298.1750000000001 111.954C298.1760000000001 231.642 113.4110000000001 215.661 113.4110000000001 278.625z" /> + <glyph glyph-name="dolly-flatbed" + unicode="" + horiz-adv-x="640" d=" M208 128H592C600.8 128 608 135.2 608 144V400C608 408.8 600.8 416 592 416H448V288L400 320L352 288V416H208C199.2 416 192 408.8 192 400V144C192 135.2 199.2 128 208 128zM624 64H128V432C128 440.8 120.8 448 112 448H16C7.2 448 0 440.8 0 432V400C0 391.2 7.2 384 16 384H64V16C64 7.2 71.2 0 80 0H162.9C161.1 -5 160 -10.4 160 -16C160 -42.5 181.5 -64 208 -64S256 -42.5 256 -16C256 -10.4 254.8 -5 253.1 0H451C449.2 -5 448.1 -10.4 448.1 -16C448.1 -42.5 469.6 -64 496.1 -64S544.1 -42.5 544.1 -16C544.1 -10.4 542.9 -5 541.2 0H624C632.8 0 640 7.2 640 16V48C640 56.8 632.8 64 624 64z" /> + <glyph glyph-name="dolly" + unicode="" + horiz-adv-x="576" d=" M294.2 170.3C312.2 165.3 328.9 156.9 343.7 145.6L505.2 199.4C513.6 202.2000000000001 518.1 211.3000000000001 515.3 219.6L454.9 400.8C452.1 409.2 443 413.7 434.7 410.9L373.6 390.5L406.7 291.1L346 271L312.9 370.4L251.3 349.9C242.9 347.1 238.4 338 241.2 329.7L294.2 170.3zM575.2 121.6L565 152C562.2 160.4 553.1 164.9 544.8 162.1L331.3 90.9C314.1 112.9 287.7 127.3 257.8 127.9L158.4 426.1C154 439.2 141.8 448 128 448H16C7.2 448 0 440.8 0 432V400C0 391.2 7.2 384 16 384H104.9L197.1 107.3C171 86.9 155.4 53.7 161.1 16.8C167.2 -22.6 199 -55.5 238.4000000000001 -62.4C298.6 -73.1 350.7000000000001 -27.6 351.8000000000001 30.2L565.1000000000001 101.4C573.4000000000001 104.2000000000001 578.0000000000001 113.2000000000001 575.2000000000002 121.6zM256 -16C229.5 -16 208 5.5 208 32S229.5 80 256 80S304 58.5 304 32S282.5 -16 256 -16z" /> + <glyph glyph-name="dot-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM336 192C336 147.888 300.112 112 256 112S176 147.888 176 192S211.888 272 256 272S336 236.112 336 192z" /> + <glyph glyph-name="download" + unicode="" + horiz-adv-x="512" d=" M216 448H296C309.3 448 320 437.3 320 424V256H407.7C425.5 256 434.4 234.5 421.8 221.9L269.7 69.7C262.2 62.2 249.9 62.2 242.4 69.7L90.1 221.9C77.5 234.5 86.4 256 104.2 256H192V424C192 437.3 202.7 448 216 448zM512 72V-40C512 -53.3 501.3 -64 488 -64H24C10.7 -64 0 -53.3 0 -40V72C0 85.3 10.7 96 24 96H170.7L219.7 47C239.8 26.9 272.2 26.9 292.3 47L341.3 96H488C501.3 96 512 85.3 512 72zM388 -16C388 -5 379 4 368 4S348 -5 348 -16S357 -36 368 -36S388 -27 388 -16zM452 -16C452 -5 443 4 432 4S412 -5 412 -16S421 -36 432 -36S452 -27 452 -16z" /> + <glyph glyph-name="edit" + unicode="" + horiz-adv-x="576" d=" M402.6 364.8L492.8 274.6C496.6 270.8 496.6 264.6 492.8 260.8L274.4 42.4L181.6 32.1C169.2 30.7 158.7 41.2 160.1 53.6L170.4 146.4L388.8 364.8C392.6 368.6 398.8 368.6 402.6 364.8zM564.6 387.7L515.8000000000001 436.5C500.6000000000001 451.7 475.9000000000001 451.7 460.6000000000001 436.5L425.2000000000001 401.1C421.4000000000001 397.3 421.4000000000001 391.1 425.2000000000001 387.3L515.4000000000001 297.1C519.2 293.3 525.4000000000001 293.3 529.2 297.1L564.6 332.5C579.8000000000001 347.8 579.8000000000001 372.5 564.6 387.7zM384 101.8V0H64V320H293.8C297 320 300 321.3 302.3 323.5L342.3 363.5C349.9000000000001 371.1 344.5 384 333.8 384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V141.8C448 152.5 435.1 157.8 427.5 150.3L387.5 110.3C385.3 108 384 105 384 101.8z" /> + <glyph glyph-name="eject" + unicode="" + horiz-adv-x="448" d=" M448 64V0C448 -17.673 433.673 -32 416 -32H32C14.327 -32 0 -17.673 0 0V64C0 81.673 14.327 96 32 96H416C433.673 96 448 81.673 448 64zM48.053 128H399.939C441.5900000000001 128 463.52 177.674 435.322 208.435L259.383 400.442C240.369 421.185 207.632 421.186 188.616 400.442L12.67 208.435C-15.475 177.732 6.324 128 48.053 128z" /> + <glyph glyph-name="ellipsis-h" + unicode="" + horiz-adv-x="512" d=" M328 192C328 152.2 295.8 120 256 120S184 152.2 184 192S216.2 264 256 264S328 231.8 328 192zM432 264C392.2 264 360 231.8 360 192S392.2 120 432 120S504 152.2 504 192S471.8 264 432 264zM80 264C40.2 264 8 231.8 8 192S40.2 120 80 120S152 152.2 152 192S119.8 264 80 264z" /> + <glyph glyph-name="ellipsis-v" + unicode="" + horiz-adv-x="192" d=" M96 264C135.8 264 168 231.8 168 192S135.8 120 96 120S24 152.2 24 192S56.2 264 96 264zM24 368C24 328.2 56.2 296 96 296S168 328.2 168 368S135.8 440 96 440S24 407.8 24 368zM24 16C24 -23.8 56.2 -56 96 -56S168 -23.8 168 16S135.8 88 96 88S24 55.8 24 16z" /> + <glyph glyph-name="envelope-open" + unicode="" + horiz-adv-x="512" d=" M512 -16C512 -42.51 490.51 -64 464 -64H48C21.49 -64 0 -42.51 0 -16V247.276A48 48 0 0 0 18.387 285.052C43.3 304.581 63.888 320.4170000000001 182.587 406.563C199.412 418.83 232.797 448.347 256 447.997C279.198 448.351 312.596 418.825 329.413 406.564C448.1 320.427 468.716 304.569 493.613 285.052A48 48 0 0 0 512 247.276V-16zM446.334 180.605C443.771 184.333 438.634 185.2000000000001 434.995 182.512C412.15 165.639 379.533 141.807 329.413 105.433C312.588 93.167 279.2030000000001 63.652 256 64.003C232.789 63.659 199.441 93.146 182.587 105.433C132.473 141.803 99.853 165.637 77.005 182.512C73.366 185.2 68.229 184.333 65.666 180.605L56.594 167.409A7.997999999999999 7.997999999999999 0 0 1 58.433 156.442C81.32 139.543 113.887 115.752 163.736 79.574C184.01 64.793 220.26 31.761 256 32.001C291.724 31.759 327.961 64.7720000000001 348.2630000000001 79.574C398.1130000000001 115.7530000000001 430.6810000000001 139.544 453.566 156.442A7.997999999999999 7.997999999999999 0 0 1 455.405 167.409L446.334 180.605z" /> + <glyph glyph-name="envelope-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM178.117 185.896C87.429 251.713 88.353 251.879 64 270.833V296C64 309.255 74.745 320 88 320H360C373.255 320 384 309.255 384 296V270.833C359.629 251.864 360.566 251.709 269.883 185.895C259.383 178.24 238.491 159.775 224 160.001C209.497 159.783 188.633 178.228 178.117 185.896zM384 230.225V88C384 74.745 373.255 64 360 64H88C74.745 64 64 74.745 64 88V230.225C77.958 219.431 97.329 204.989 159.303 160.011C173.465 149.67 197.278 127.866 223.997 128.001C250.884 127.867 275.034 150.042 288.717 160.026C350.675 204.991 370.042 219.432 384 230.225z" /> + <glyph glyph-name="envelope" + unicode="" + horiz-adv-x="512" d=" M502.3 257.2C506.2 260.3 512 257.4 512 252.5V48C512 21.5 490.5 0 464 0H48C21.5 0 0 21.5 0 48V252.4C0 257.4 5.7 260.2000000000001 9.7 257.1C32.1 239.7 61.8 217.6 163.8 143.5C184.9 128.1 220.5 95.7 256 95.9C291.7 95.6 328 128.7 348.3 143.5C450.3 217.6 479.9 239.8 502.3 257.2zM256 128C279.2 127.6 312.6 157.2 329.4 169.4C462.1 265.7 472.2 274.1 502.8 298.1C508.6 302.6 511.9999999999999 309.6 511.9999999999999 317V336C511.9999999999999 362.5 490.4999999999999 384 463.9999999999999 384H48C21.5 384 0 362.5 0 336V317C0 309.6 3.4 302.7 9.2 298.1C39.8 274.2 49.9 265.7 182.6 169.4C199.4 157.2 232.8 127.6 256 128z" /> + <glyph glyph-name="eraser" + unicode="" + horiz-adv-x="512" d=" M497.941 174.059C516.6859999999999 192.804 516.6859999999999 223.196 497.941 241.9410000000001L337.941 401.9410000000001C319.196 420.6860000000001 288.805 420.687 270.058 401.9410000000001L14.058 145.941C-4.687 127.196 -4.687 96.804 14.058 78.059L110.058 -17.941A48.004000000000005 48.004000000000005 0 0 1 144 -32H500C506.627 -32 512 -26.627 512 -20V20C512 26.627 506.627 32 500 32H355.883L497.941 174.059zM195.314 236.6860000000001L332.687 99.3130000000001L265.373 32H150.628L70.628 112L195.314 236.686z" /> + <glyph glyph-name="euro-sign" + unicode="" + horiz-adv-x="320" d=" M310.706 34.235C309.392 40.865 302.8710000000001 45.107 296.2820000000001 43.604C285.5900000000001 41.165 268.86 38.191 250.8560000000001 38.191C194.0930000000001 38.191 148.9270000000001 72.9810000000001 129.3950000000001 123.6400000000001H243.0840000000001A12 12 0 0 1 254.7920000000001 133.009L261.165 161.369C262.851 168.8710000000001 257.146 176 249.457 176H115.22C114.01 190.328 113.806 204.287 115.357 218.245H261.95A12 12 0 0 1 273.673 227.679L280.185 257.434C281.823 264.918 276.124 272 268.462 272H130.184C150.817 316.991 192.874 347.03 247.803 347.03C262.289 347.03 276.367 344.78 285.654 342.885C291.87 341.617 298.001 345.3830000000001 299.656 351.5080000000001L311.647 395.8760000000001C313.469 402.617 309.182 409.492 302.321 410.793C290.217 413.088 270.71 416 249.635 416C152.451 416 74.03 355.748 45.075 272H12C5.373 272 0 266.627 0 260V230.245C0 223.618 5.373 218.245 12 218.245H33.569C32.56 204.638 32.388 188.958 33.388 176H12C5.373 176 0 170.627 0 164V135.64C0 129.013 5.373 123.64 12 123.64H42.114C67.139 33.308 145.264 -32 249.635 -32C275.936 -32 298.197 -27.456 310.736 -24.212C316.903 -22.617 320.763 -16.504 319.524 -10.255L310.706 34.235z" /> + <glyph glyph-name="exchange-alt" + unicode="" + horiz-adv-x="512" d=" M0 280V296C0 309.255 10.745 320 24 320H384V368C384 389.367 409.899 400.0420000000001 424.971 384.971L504.971 304.971C514.343 295.598 514.343 280.4020000000001 504.971 271.03L424.971 191.03C409.956 176.018 384 186.544 384 208V256H24C10.745 256 0 266.745 0 280zM488 128H128V176C128 197.314 102.138 208.08 87.029 192.971L7.029 112.971C-2.343 103.598 -2.343 88.402 7.029 79.03L87.029 -0.97C102.057 -15.997 128 -5.437 128 16V64H488C501.255 64 512 74.745 512 88V104C512 117.255 501.255 128 488 128z" /> + <glyph glyph-name="exclamation-circle" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.003 392.957 -56 256 -56S8 55.003 8 192C8 328.9170000000001 119.043 440 256 440S504 328.9170000000001 504 192zM256 142C230.595 142 210 121.405 210 96S230.595 50 256 50S302 70.595 302 96S281.405 142 256 142zM212.327 307.346L219.745 171.346C220.092 164.982 225.354 160 231.727 160H280.273C286.646 160 291.908 164.982 292.255 171.346L299.673 307.346C300.048 314.2200000000001 294.575 320 287.6910000000001 320H224.308C217.424 320 211.952 314.2200000000001 212.327 307.346z" /> + <glyph glyph-name="exclamation-triangle" + unicode="" + horiz-adv-x="576" d=" M569.517 7.987C587.975 -24.007 564.806 -64 527.94 -64H48.054C11.117 -64 -11.945 -23.945 6.477 7.987L246.423 424.015C264.89 456.024 311.1430000000001 455.966 329.577 424.015L569.517 7.987zM288 94C262.5950000000001 94 242 73.405 242 48S262.5950000000001 2 288 2S334 22.595 334 48S313.405 94 288 94zM244.327 259.346L251.745 123.346C252.092 116.982 257.354 112 263.727 112H312.273C318.646 112 323.908 116.982 324.255 123.346L331.673 259.346C332.048 266.2200000000001 326.575 272 319.6910000000001 272H256.3080000000001C249.4240000000001 272 243.9520000000001 266.2200000000001 244.3270000000001 259.346z" /> + <glyph glyph-name="exclamation" + unicode="" + horiz-adv-x="192" d=" M176 16C176 -28.112 140.112 -64 96 -64S16 -28.112 16 16S51.888 96 96 96S176 60.112 176 16zM25.26 422.801L38.86 150.801C39.499 138.028 50.041 128 62.83 128H129.17C141.959 128 152.501 138.028 153.14 150.801L166.74 422.801C167.425 436.51 156.496 448 142.77 448H49.23C35.504 448 24.575 436.51 25.26 422.801z" /> + <glyph glyph-name="expand-arrows-alt" + unicode="" + horiz-adv-x="448.1" d=" M448.1 104V-8C448.1 -21.3 437.4000000000001 -32 424.1 -32H312.1C290.7000000000001 -32 280 -6.1 295.1 9L331.3 45.2L224 152.4L116.8 45.1L153 9C168.1 -6.1 157.4 -32 136 -32H24C10.7 -32 0 -21.3 0 -8V104C0 125.4 25.9 136.1 41 121L77.2 84.8L184.5 192L77.2 299.3L41 263C25.9 247.9 0 258.6 0 280V392C0 405.3 10.7 416 24 416H136C157.4 416 168.1 390.1 153 375L116.8 338.8L224 231.6L331.3 338.9L295.1 375C280 390.1 290.7000000000001 416 312.1 416H424.1C437.4000000000001 416 448.1 405.3 448.1 392V280C448.1 258.6 422.2000000000001 247.9 407.1 263L370.9000000000001 299.2L263.6 192L370.9000000000001 84.7L407.1 120.9C422.2000000000001 136.1 448.1 125.4 448.1 104z" /> + <glyph glyph-name="expand" + unicode="" + horiz-adv-x="448" d=" M0 268V392C0 405.3 10.7 416 24 416H148C154.6 416 160 410.6 160 404V364C160 357.4 154.6 352 148 352H64V268C64 261.4 58.6 256 52 256H12C5.4 256 0 261.4 0 268zM288 404V364C288 357.4 293.4 352 300 352H384V268C384 261.4 389.4 256 396 256H436C442.6 256 448 261.4 448 268V392C448 405.3 437.3 416 424 416H300C293.4 416 288 410.6 288 404zM436 128H396C389.4 128 384 122.6 384 116V32H300C293.4 32 288 26.6 288 20V-20C288 -26.6 293.4 -32 300 -32H424C437.3 -32 448 -21.3 448 -8V116C448 122.6 442.6 128 436 128zM160 -20V20C160 26.6 154.6 32 148 32H64V116C64 122.6 58.6 128 52 128H12C5.4 128 0 122.6 0 116V-8C0 -21.3 10.7 -32 24 -32H148C154.6 -32 160 -26.6 160 -20z" /> + <glyph glyph-name="external-link-alt" + unicode="" + horiz-adv-x="576" d=" M576 424V296.016C576 274.555 550.04 264.0360000000001 535.029 279.045L499.322 314.754L255.799 71.231C246.426 61.858 231.231 61.858 221.858 71.231L199.231 93.858C189.858 103.231 189.858 118.427 199.231 127.799L442.756 371.324L407.053 407.029C391.9820000000001 422.1 402.656 448 424.024 448H552C565.255 448 576 437.255 576 424zM407.029 177.206L391.029 161.206A23.999000000000002 23.999000000000002 0 0 1 384 144.235V0H64V320H328A24.003 24.003 0 0 1 344.9700000000001 327.029L360.9700000000001 343.029C376.089 358.149 365.381 384 344 384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V160.236C448 181.618 422.148 192.326 407.029 177.206z" /> + <glyph glyph-name="external-link-square-alt" + unicode="" + horiz-adv-x="448" d=" M448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368zM360 352H248.029C226.716 352 215.949 326.139 231.058 311.029L263.042 279.0420000000001L67.515 83.515C62.829 78.829 62.829 71.231 67.515 66.544L98.544 35.515C103.231 30.829 110.829 30.829 115.515 35.515L311.041 231.041L343.029 199.05C358.058 184.023 384 194.575 384 216.021V328C384 341.255 373.255 352 360 352z" /> + <glyph glyph-name="eye-dropper" + unicode="" + horiz-adv-x="512" d=" M177.38 241.36L39.03 103.03A24.01 24.01 0 0 1 32 86.06V24L0 -32L32 -64L88 -32H150.06C156.42 -32 162.53 -29.47 167.03 -24.97L305.38 113.36L177.38 241.36zM402.932 210.89L419.884 193.94C429.254 184.5700000000001 429.254 169.37 419.884 160L378.911 119.03C369.6190000000001 109.718 354.405 109.596 344.971 119.03L183.028 280.9700000000001C173.658 290.3400000000001 173.658 305.54 183.028 314.91L224 355.88C233.289 365.189 248.502 365.318 257.94 355.88L274.932 338.89L357.538 421.491C392.728 456.681 450.038 456.991 485.538 421.491C526.028 373.411 515.198 323.151 485.538 293.491L402.932 210.89z" /> + <glyph glyph-name="eye-slash" + unicode="" + horiz-adv-x="576" d=" M286.693 56.016L319.272 9.474A333.958 333.958 0 0 0 288 8C168.19 8 63.031 71.949 6.646 167.631A47.999 47.999 0 0 0 6.646 216.37C30.669 257.136 63.559 292.145 102.67 318.907L159.747 237.368C154.736 223.18 152 207.913 152 192C152 117.264 212.135 56.718 286.693 56.016zM569.354 167.631C537.687 113.894 490.607 70.1710000000001 434.1790000000001 42.1560000000001L434.1900000000001 42.1410000000001L475.6600000000001 -17.0589999999999C483.2600000000001 -27.9189999999999 480.6200000000001 -42.8789999999999 469.7600000000001 -50.4789999999999L456.6500000000001 -59.6589999999999C445.7900000000001 -67.2589999999999 430.8300000000001 -64.6189999999999 423.2300000000001 -53.759L100.34 401.06C92.74 411.92 95.38 426.88 106.24 434.48L119.35 443.6600000000001C130.21 451.26 145.17 448.62 152.77 437.76L203.808 365.1430000000001C230.68 372.224 258.905 376 288 376C407.81 376 512.969 312.051 569.354 216.369A48.00200000000001 48.00200000000001 0 0 0 569.354 167.631zM424 192C424 267.174 363.162 328 288 328C270.061 328 252.944 324.527 237.271 318.228L256.57 291.17C282.439 299.341 311.614 297.3330000000001 336.9700000000001 283.76H336.9400000000001C313.2900000000001 283.76 294.1200000000001 264.5900000000001 294.1200000000001 240.9400000000001C294.1200000000001 217.314 313.2670000000001 198.12 336.9400000000001 198.12C360.5900000000001 198.12 379.7600000000001 217.29 379.7600000000001 240.9400000000001V240.9700000000001C398.2220000000001 206.48 396.0720000000001 163.0560000000001 371.5100000000001 130.0200000000001V130.0100000000001L390.8240000000001 102.9490000000001C411.496 126.8 424 157.926 424 192zM262.014 91.273L184.484 202.03C179.47 149.643 213.798 103.6760000000001 262.014 91.273z" /> + <glyph glyph-name="eye" + unicode="" + horiz-adv-x="576" d=" M569.354 216.369C512.969 312.051 407.81 376 288 376C168.14 376 63.004 312.006 6.646 216.369A47.999 47.999 0 0 1 6.646 167.63C63.031 71.949 168.19 8 288 8C407.86 8 512.996 71.994 569.354 167.631A47.997 47.997 0 0 1 569.354 216.369zM288 56C212.838 56 152 116.827 152 192C152 267.1620000000001 212.826 328 288 328C363.1620000000001 328 424 267.174 424 192C424 116.838 363.174 56 288 56zM392 192C392 134.562 345.438 88 288 88S184 134.562 184 192C184 209.708 188.431 226.379 196.236 240.973L196.235 240.941C196.235 217.29 215.408 198.118 239.059 198.118S281.883 217.291 281.883 240.941C281.883 264.592 262.71 283.765 239.059 283.765L239.027 283.764C253.621 291.569 270.292 296 288 296C345.438 296 392 249.438 392 192z" /> + <glyph glyph-name="fast-backward" + unicode="" + horiz-adv-x="512" d=" M0 12V372C0 378.6 5.4 384 12 384H52C58.6 384 64 378.6 64 372V220.1L235.5 376.6C256.1 393.7 288 379.4 288 352V220.1L459.5 376.6C480.1 393.7 512 379.4 512 352V32C512 4.6 480.1 -9.7 459.5 7.4L288 162.7V32C288 4.6 256.1 -9.7 235.5 7.4L64 162.7V12C64 5.4 58.6 0 52 0H12C5.4 0 0 5.4 0 12z" /> + <glyph glyph-name="fast-forward" + unicode="" + horiz-adv-x="512" d=" M512 372V12C512 5.4 506.6 0 500 0H460C453.4 0 448 5.4 448 12V163.9L276.5 7.4C255.9 -9.8 224 4.6 224 32V163.9L52.5 7.4C31.9 -9.8 0 4.6 0 32V352C0 379.4 31.9 393.7 52.5 376.6L224 221.2V352C224 379.4 255.9 393.7 276.5 376.6L448 221.2V372C448 378.6 453.4 384 460 384H500C506.6 384 512 378.6 512 372z" /> + <glyph glyph-name="fax" + unicode="" + horiz-adv-x="512" d=" M128 304V-16C128 -42.51 106.51 -64 80 -64H48C21.49 -64 0 -42.51 0 -16V304C0 330.51 21.49 352 48 352H80C106.51 352 128 330.51 128 304zM512 240V-16C512 -42.51 490.51 -64 464 -64H192C165.49 -64 144 -42.51 144 -16V408C144 430.091 161.909 448 184 448H391.432A39.996 39.996 0 0 0 419.716 436.284L468.285 387.715A39.999 39.999 0 0 0 480 359.432V285.258C498.641 278.667 512 260.898 512 240zM192 256H432V352H408C394.7970000000001 352 384 362.7970000000001 384 376V400H192V256zM288 52C288 58.627 282.627 64 276 64H236C229.373 64 224 58.627 224 52V12C224 5.373 229.373 0 236 0H276C282.627 0 288 5.373 288 12V52zM288 180C288 186.627 282.627 192 276 192H236C229.373 192 224 186.627 224 180V140C224 133.373 229.373 128 236 128H276C282.627 128 288 133.373 288 140V180zM416 52C416 58.627 410.627 64 404 64H364C357.373 64 352 58.627 352 52V12C352 5.373 357.373 0 364 0H404C410.627 0 416 5.373 416 12V52zM416 180C416 186.627 410.627 192 404 192H364C357.373 192 352 186.627 352 180V140C352 133.373 357.373 128 364 128H404C410.627 128 416 133.373 416 140V180z" /> + <glyph glyph-name="female" + unicode="" + horiz-adv-x="256" d=" M128 448C163.346 448 192 419.346 192 384S163.346 320 128 320C92.654 320 64 348.654 64 384S92.654 448 128 448M247.283 93.821L199.283 285.8210000000001A24 24 0 0 1 176 304H164.64C141.929 293.557 115.05 293.106 91.36 304H80A24 24 0 0 1 56.717 285.8210000000001L8.717 93.821C4.935 78.695 16.383 64 32 64H88V-40C88 -53.255 98.745 -64 112 -64H144C157.255 -64 168 -53.255 168 -40V64H224C239.591 64 251.071 78.671 247.283 93.821z" /> + <glyph glyph-name="fighter-jet" + unicode="" + horiz-adv-x="640" d=" M544 224L416 240L368 256H344L227.158 404H266.667C278.3330000000001 404 288 406.625 288 410S278.3330000000001 416 266.6670000000001 416H152V404H168V240H120L53.333 320H18.667L8 309.333V240H16V224H64V221.334L0 213.334V170.667L64 162.667V160H16V144H8V74.667L18.667 64H53.334L120 144H168V-20H152V-32H266.6670000000001C278.334 -32 288 -29.375 288 -26S278.3330000000001 -20 266.6670000000001 -20H227.158L344 128H368L416 144L544 160C640 181.333 640 186.583 640 192C640 197.417 640 202.667 544 224z" /> + <glyph glyph-name="file-alt" + unicode="" + horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM288 76C288 69.4 282.6 64 276 64H108C101.4 64 96 69.4 96 76V84C96 90.6 101.4 96 108 96H276C282.6 96 288 90.6 288 84V76zM288 140C288 133.4 282.6 128 276 128H108C101.4 128 96 133.4 96 140V148C96 154.6 101.4 160 108 160H276C282.6 160 288 154.6 288 148V140zM288 212V204C288 197.4 282.6 192 276 192H108C101.4 192 96 197.4 96 204V212C96 218.6 101.4 224 108 224H276C282.6 224 288 218.6 288 212zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" /> + <glyph glyph-name="file-archive" + unicode="" + horiz-adv-x="384" d=" M224 312V448H160.4V416H128.4V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM95.9 416H127.9V384H95.9V416zM128.2 32C95 32 70.2 62.4 76.8 94.9L96.4 192V224H128.4V256H96.4V288H128.4V320H96.4V352H128.4V384H160.4V352H128.4V320H160.4V288H128.4V256H160.4V224H128.4V192H150.5C156.2 192 161.2 187.9 162.3 182.3L179.6 94.6C186 62.2000000000001 161.2 32 128.2 32zM160.9 85C160.9 70.1 146.4 58 128.5 58S96 70 96 85C96 99.9 110.5 112 128.4 112S160.9 99.9 160.9 85zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" /> + <glyph glyph-name="file-audio" + unicode="" + horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM160 44C160 33.3 147.1 28 139.5 35.5L104 72H76C69.4 72 64 77.4 64 84V140C64 146.6 69.4 152 76 152H104L139.5 188.5C147.1 196.1 160 190.7 160 180V44zM193.2 91.6C202.3 100.9 202.3 115.7000000000001 193.2 125C171.1 147.8 205.4 181.2 227.6 158.5C254.8 130.6 254.8 86.1 227.6 58.1C205.8 35.8 170.7 68.5 193.2 91.6zM279.2 208.7C333.6 152.8 333.6 63.9 279.2 7.9C257.4 -14.5 222.2 18.2 244.8 41.4C281 78.6 281.1 137.9 244.8 175.2C222.7 198 257.1 231.5 279.2 208.7zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" /> + <glyph glyph-name="file-code" + unicode="" + horiz-adv-x="384" d=" M384 326.059V320H256V448H262.0590000000001C268.4240000000001 448 274.5290000000001 445.471 279.0300000000001 440.971L376.971 343.03A24.005 24.005 0 0 0 384 326.059zM248 288C234.8 288 224 298.8 224 312V448H24C10.745 448 0 437.255 0 424V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V288H248zM123.206 47.495A5.4 5.4 0 0 0 115.573 47.249L50.707 108.061A5.4 5.4 0 0 0 50.707 115.9400000000001L115.573 176.7520000000001A5.4 5.4 0 0 0 123.206 176.5060000000001L142.785 155.6210000000001A5.4 5.4 0 0 0 142.413 147.8740000000001L101.65 112L142.413 76.126A5.4 5.4 0 0 0 142.785 68.379L123.206 47.495zM174.501 -2.984L147.048 4.986A5.401999999999999 5.401999999999999 0 0 0 143.367 11.6780000000001L204.807 223.3040000000001A5.401999999999999 5.401999999999999 0 0 0 211.499 226.9850000000001L238.951 219.0150000000001A5.4 5.4 0 0 0 242.631 212.3230000000001L181.191 0.6970000000001A5.396999999999999 5.396999999999999 0 0 0 174.501 -2.9839999999999zM335.293 108.061L270.427 47.249A5.4 5.4 0 0 0 262.7940000000001 47.495L243.2140000000001 68.38A5.4 5.4 0 0 0 243.5860000000001 76.127L284.35 112L243.587 147.874A5.4 5.4 0 0 0 243.215 155.6210000000001L262.795 176.506A5.4 5.4 0 0 0 270.428 176.752L335.294 115.94A5.4 5.4 0 0 0 335.293 108.061z" /> + <glyph glyph-name="file-excel" + unicode="" + horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM284.1 205.5L224 112L284.1 18.5C289.2000000000001 10.5 283.5 0 274 0H239.1C234.7 0 230.6 2.4 228.5 6.3C208.9 42.5 192 75 192 75C185.6 60.2 182 55 155.4 6.2C153.3 2.3 149.3 -0.1 144.9 -0.1H110C100.5 -0.1 94.8 10.4 99.9 18.4L160.2 111.9L99.9 205.4C94.7 213.4 100.5 223.9 110 223.9H144.8C149.2 223.9 153.3 221.5 155.4 217.6C181.5 168.8 175.4 184 192 149.1C192 149.1 198.1 160.8 228.6 217.6C230.7 221.5 234.8 223.9 239.2 223.9H274C283.5 224 289.2 213.5 284.1 205.5zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" /> + <glyph glyph-name="file-image" + unicode="" + horiz-adv-x="384" d=" M384 326.059V320H256V448H262.0590000000001A24 24 0 0 0 279.029 440.971L376.9700000000001 343.03A24.002000000000002 24.002000000000002 0 0 0 384 326.059zM248 288C234.8 288 224 298.8 224 312V448H24C10.745 448 0 437.255 0 424V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V288H248zM112.545 272C139.055 272 160.545 250.51 160.545 224S139.055 176 112.545 176S64.545 197.49 64.545 224S86.036 272 112.545 272zM320.545 32H64.545L65.03 80.485L104.545 120C109.231 124.686 116.344 124.201 121.03 119.515L160.545 80L264.06 183.515C268.746 188.201 276.344 188.201 281.031 183.515L320.545 144V32z" /> + <glyph glyph-name="file-pdf" + unicode="" + horiz-adv-x="384" d=" M181.9 191.9C176.9 207.9 177 238.8 179.9 238.8C188.3 238.8 187.5 201.9 181.9 191.9zM180.2 144.7C172.5 124.5 162.9 101.4 151.8 82C170.1 89 190.8 99.2 214.7 103.9C202 113.5 189.8 127.3 180.2 144.7zM86.1 19.9C86.1 19.1 99.3 25.3 121 60.1C114.3 53.8 91.9 35.6 86.1 19.9zM248 288H384V-40C384 -53.3 373.3 -64 360 -64H24C10.7 -64 0 -53.3 0 -40V424C0 437.3 10.7 448 24 448H224V312C224 298.8 234.8 288 248 288zM240 116.2C220 128.4 206.7 145.2 197.3 170C201.8 188.5 208.9 216.6 203.5 234.2C198.8 263.6 161.1 260.7 155.7 241C150.7 222.7 155.3 196.9 163.8 164C152.2 136.4 135.1 99.4 123 78.2C122.9 78.2 122.9 78.1 122.8 78.1C95.7 64.2 49.2 33.6 68.3 10.1C73.9 3.2 84.3 0.1 89.8 0.1C107.7 0.1 125.5 18.1 150.9 61.9C176.7 70.4 205 81 229.9 85.1C251.6 73.3 277 65.6 293.9 65.6C323.1 65.6 325.1 97.6 313.6 108.9999999999999C299.7 122.6 259.3 118.6999999999999 240 116.1999999999999zM377 343L279 441C274.5 445.5 268.4 448 262 448H256V320H384V326.1C384 332.4 381.5 338.5 377 343zM302.9 87.7C307 90.4 300.4 99.6 260.1 96.7C297.2 80.9 302.9 87.7 302.9 87.7z" /> + <glyph glyph-name="file-powerpoint" + unicode="" + horiz-adv-x="384" d=" M193.7 176.8C202.5 176.8 209.2 174.1 214 168.7C223.6 157.8 223.8 136 213.8 124.6C208.9 119 201.9 116.1 192.7 116.1H165.8V176.8H193.7zM377 343L279 441C274.5 445.5 268.4 448 262 448H256V320H384V326.1C384 332.4 381.5 338.5 377 343zM224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM277 146.8C277 56.5 188.2 69.2000000000001 165.9 69.2000000000001V12C165.9 5.4 160.5 0 153.9 0H123.1C116.5 0 111.1 5.4 111.1 12V211.8C111.1 218.4 116.5 223.8 123.1 223.8H204.1C248.6 223.8 277 191 277 146.8z" /> + <glyph glyph-name="file-video" + unicode="" + horiz-adv-x="384" d=" M384 326.059V320H256V448H262.0590000000001C268.4240000000001 448 274.5290000000001 445.471 279.0300000000001 440.971L376.971 343.03A24.005 24.005 0 0 0 384 326.059zM224 312V448H24C10.745 448 0 437.255 0 424V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V288H248C234.8 288 224 298.8 224 312zM320 167.984V56.0210000000001C320 34.5760000000001 294.057 24.0230000000001 279.029 39.0500000000001L224 94.059V56C224 42.745 213.255 32 200 32H88C74.745 32 64 42.745 64 56V168C64 181.255 74.745 192 88 192H200C213.255 192 224 181.255 224 168V129.941L279.029 184.954C294.04 199.964 320 189.445 320 167.984z" /> + <glyph glyph-name="file-word" + unicode="" + horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM281.1 192H305C312.7 192 318.4 184.9 316.7 177.3L278.7 9.3C277.5 3.8 272.6 0 267 0H229C223.5 0 218.7 3.8 217.4 9.1C191.6 112.6 196.6 90.3 191.8 119.6H191.3C190.2 105.3 188.9 102.2000000000001 165.7 9.1C164.4 3.8 159.6 0 154.1 0H117C111.4 0 106.5 3.9 105.3 9.4L67.5 177.4C65.8 184.9 71.5 192 79.2 192H103.7C109.4 192 114.4 188 115.5 182.3C131.1 104.3 135.6 72.8 136.5 60.1C138.1 70.3 143.8 92.8 165.9 182.8C167.2 188.2 172 191.9 177.6 191.9H206.7C212.3 191.9 217.1 188.1 218.4 182.7000000000001C242.4 82.3000000000001 247.2 58.7000000000001 248 53.3000000000001C247.8 64.5000000000001 245.4 71.1000000000001 269.6 182.5000000000001C270.6 188.1000000000001 275.5 192.0000000000001 281.1 192.0000000000001zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" /> + <glyph glyph-name="file" + unicode="" + horiz-adv-x="384" d=" M224 312V448H24C10.7 448 0 437.3 0 424V-40C0 -53.3 10.7 -64 24 -64H360C373.3 -64 384 -53.3 384 -40V288H248C234.8 288 224 298.8 224 312zM384 326.1V320H256V448H262.1C268.5 448 274.6 445.5 279.1 441L377 343C381.5 338.5 384 332.4 384 326.1z" /> + <glyph glyph-name="film" + unicode="" + horiz-adv-x="512" d=" M488 384H480V364C480 357.4 474.6 352 468 352H428C421.4 352 416 357.4 416 364V384H96V364C96 357.4 90.6 352 84 352H44C37.4 352 32 357.4 32 364V384H24C10.7 384 0 373.3 0 360V24C0 10.7 10.7 0 24 0H32V20C32 26.6 37.4 32 44 32H84C90.6 32 96 26.6 96 20V0H416V20C416 26.6 421.4 32 428 32H468C474.6 32 480 26.6 480 20V0H488C501.3 0 512 10.7 512 24V360C512 373.3 501.3 384 488 384zM96 76C96 69.4 90.6 64 84 64H44C37.4 64 32 69.4 32 76V116C32 122.6 37.4 128 44 128H84C90.6 128 96 122.6 96 116V76zM96 172C96 165.4 90.6 160 84 160H44C37.4 160 32 165.4 32 172V212C32 218.6 37.4 224 44 224H84C90.6 224 96 218.6 96 212V172zM96 268C96 261.4 90.6 256 84 256H44C37.4 256 32 261.4 32 268V308C32 314.6 37.4 320 44 320H84C90.6 320 96 314.6 96 308V268zM368 60C368 53.4 362.6 48 356 48H156C149.4 48 144 53.4 144 60V156C144 162.6 149.4 168 156 168H356C362.6 168 368 162.6 368 156V60zM368 228C368 221.4 362.6 216 356 216H156C149.4 216 144 221.4 144 228V324C144 330.6 149.4 336 156 336H356C362.6 336 368 330.6 368 324V228zM480 76C480 69.4 474.6 64 468 64H428C421.4 64 416 69.4 416 76V116C416 122.6 421.4 128 428 128H468C474.6 128 480 122.6 480 116V76zM480 172C480 165.4 474.6 160 468 160H428C421.4 160 416 165.4 416 172V212C416 218.6 421.4 224 428 224H468C474.6 224 480 218.6 480 212V172zM480 268C480 261.4 474.6 256 468 256H428C421.4 256 416 261.4 416 268V308C416 314.6 421.4 320 428 320H468C474.6 320 480 314.6 480 308V268z" /> + <glyph glyph-name="filter" + unicode="" + horiz-adv-x="512" d=" M487.976 448H24.028C2.71 448 -8.047 422.134 7.058 407.029L192 222.059V16C192 8.169 195.821 0.83 202.237 -3.662L282.237 -59.642C298.02 -70.69 320 -59.493 320 -39.98V222.059L504.947 407.029C520.021 422.104 509.338 448 487.976 448z" /> + <glyph glyph-name="fire-extinguisher" + unicode="" + horiz-adv-x="448" d=" M434.027 421.671L266.027 393.671C254.693 391.782 256 380.2 256 376H197.668C208.353 411.892 181.446 448 144 448C104.565 448 77.632 408.324 91.772 371.7970000000001C39.733 358.746 16.391 317.584 1.723 280.913C-3.2 268.606 2.786 254.639 15.093 249.716C27.41 244.79 41.372 250.791 46.289 263.086C75.058 335.01 106.964 328 168 328V300.924C126.457 290.062 96 251.689 96 206.795V-40C96 -53.255 106.745 -64 120 -64H264C277.255 -64 288 -53.255 288 -40V208C288 252.731 257.404 290.312 216 300.9700000000001V328H256C256 325.026 254.297 312.284 266.027 310.329L434.027 282.329C441.342 281.11 448 286.75 448 294.166V409.834C448 417.25 441.342 422.89 434.027 421.671zM144 376C135.178 376 128 383.178 128 392S135.178 408 144 408S160 400.822 160 392S152.822 376 144 376z" /> + <glyph glyph-name="fire" + unicode="" + horiz-adv-x="384" d=" M216 424.142C216 447.944 185.347 456.907 171.851 437.18C48 256.149 224 248 224 160C224 124.371 194.886 95.542 159.15 96.006C123.98 96.462 96 125.78 96 160.954V246.464C96 268.1670000000001 69.529 278.689 54.568 262.968C27.801 234.842 0 186.668 0 128C0 22.131 86.131 -64 192 -64S384 22.131 384 128C384 298.29 216 321.003 216 424.142z" /> + <glyph glyph-name="first-aid" + unicode="" + horiz-adv-x="576" d=" M0 368V16C0 -10.5 21.5 -32 48 -32H96V416H48C21.5 416 0 394.5 0 368zM128 -32H448V416H128V-32zM192 216C192 220.4 195.6 224 200 224H256V280C256 284.4 259.6 288 264 288H312C316.4 288 320 284.4 320 280V224H376C380.4 224 384 220.4 384 216V168C384 163.6 380.4 160 376 160H320V104C320 99.6 316.4 96 312 96H264C259.6 96 256 99.6 256 104V160H200C195.6 160 192 163.6 192 168V216zM528 416H480V-32H528C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 528 416z" /> + <glyph glyph-name="flag-checkered" + unicode="" + horiz-adv-x="512" d=" M466.515 381.072C487.731 390.926 512 375.449 512 352.056V108.956C512 98.43 506.839 88.549 498.157 82.598C462.32 58.034 423.822 41.74 375.652 41.74C308.279 41.74 264.022 76.523 210.435 76.523C159.582 76.523 124.311 66.465 96 54.401V-40C96 -53.255 85.255 -64 72 -64H56C42.745 -64 32 -53.255 32 -40V346.055C17.497 356.175 8 372.974 8 392C8 423.704 34.345 449.254 66.338 447.952C94.806 446.794 118.117 423.984 119.889 395.548C120.409 387.206 119.079 379.238 116.303 371.986C137.039 379.616 159.393 384 184.348 384C251.721 384 295.978 349.217 349.5650000000001 349.217C390.0610000000001 349.217 432.177 365.123 466.515 381.072zM96 313.37V242.88C125 253.55 147.18 260.71 169.6 263.79V335.36C146.1 333.19 129.16 325.57 96 313.37zM316.8 304.18C290.3830000000001 308.852 266.914 318.159 243.2 325.52V258.1C267.375 251.3940000000001 290.766 241.6560000000001 316.8 235.79V304.18zM169.6 263.79V193.75C202.396 196.728 223.51 194.385 243.2 189.95V258.1C217.953 265.135 196.619 267.523 169.6 263.79zM243.2 121.5600000000001C269.538 116.9080000000001 292.932 107.633 316.8 100.2200000000001V167.6300000000001C292.523 174.3760000000001 269.26 184.0800000000001 243.2 189.9500000000001V121.5600000000001zM96 105.9C119.62 114.29 143.79 119.74 169.6 122.46V193.75C143.49 191.4 122.24 185.71 96 176.39V105.9zM464 327.5C442.7 318.65 417.41 309.86 390.4 305.03V233.12C417.71 237.48 440.43 247.22 464 257.01V327.5zM464 117.54V188.03C441.81 173.83 415.2200000000001 165.42 390.4 162.01V90.43C415.47 92.81 438.89 101.47 464 117.54zM316.8 235.79V167.63C342.464 160.496 363.416 158.288 390.4 162.01V233.12C364.401 228.933 340.457 230.444 316.8 235.79z" /> + <glyph glyph-name="flag" + unicode="" + horiz-adv-x="512" d=" M349.565 349.217C295.978 349.217 251.721 384 184.348 384C159.393 384 137.039 379.616 116.303 371.987A55.947 55.947 0 0 1 119.889 395.549C118.117 423.985 94.806 446.794 66.338 447.952C34.345 449.254 8 423.704 8 392C8 372.974 17.497 356.175 32 346.055V-40C32 -53.255 42.745 -64 56 -64H72C85.255 -64 96 -53.255 96 -40V54.4C124.311 66.464 159.582 76.522 210.435 76.522C264.023 76.522 308.279 41.739 375.6520000000001 41.739C423.8210000000001 41.739 462.3190000000001 58.033 498.157 82.597C506.84 88.548 512 98.429 512 108.955V352.055C512 375.448 487.731 390.925 466.515 381.071C432.177 365.123 390.061 349.217 349.565 349.217z" /> + <glyph glyph-name="flask" + unicode="" + horiz-adv-x="448" d=" M437.2 44.5L320 233V384H328C341.3 384 352 394.7 352 408V424C352 437.3 341.3 448 328 448H120C106.7 448 96 437.3 96 424V408C96 394.7 106.7 384 120 384H128V233L10.8 44.5C-18.5 -2.6 15.3 -64 70.9 -64H377.1C432.8 -64 466.5 -2.5 437.2000000000001 44.5zM137.9 128L186.1 205.6C189.8 210.8 191.9 217.2 191.9 224V384H255.9000000000001V224C255.9000000000001 217.1 258.1 210.8 261.7000000000001 205.6L309.9000000000001 128H137.9z" /> + <glyph glyph-name="folder-open" + unicode="" + horiz-adv-x="576" d=" M572.694 155.907L500.27 31.752A63.99699999999999 63.99699999999999 0 0 0 444.989 0H45.025C26.502 0 14.961 20.093 24.294 36.093L96.718 160.2480000000001A64 64 0 0 0 152 192H551.9639999999999C570.487 192 582.0279999999999 171.907 572.694 155.907zM152 224H480V272C480 298.51 458.51 320 432 320H272L208 384H48C21.49 384 0 362.51 0 336V57.954L69.077 176.372C86.214 205.75 117.989 224 152 224z" /> + <glyph glyph-name="folder" + unicode="" + horiz-adv-x="512" d=" M464 320H272L208 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V272C512 298.51 490.51 320 464 320z" /> + <glyph glyph-name="font" + unicode="" + horiz-adv-x="448" d=" M152 32H127.987L154.573 112.782H292.8L319.386 32H296C287.163 32 280 24.837 280 16V-16C280 -24.837 287.163 -32 296 -32H432C440.837 -32 448 -24.837 448 -16V16C448 24.837 440.837 32 432 32H405.261L275.495 405.254A16 16 0 0 1 260.382 416H187.616A16 16 0 0 1 172.503 405.254L42.739 32H16C7.163 32 0 24.837 0 16V-16C0 -24.837 7.163 -32 16 -32H152C160.837 -32 168 -24.837 168 -16V16C168 24.837 160.837 32 152 32zM216.353 303.778C220.701 318.9940000000001 222.963 331.9340000000001 223.939 338.4220000000001C224.778 331.901 226.878 318.9460000000001 231.6660000000001 303.716L273.0010000000001 179.71H174.382L216.353 303.778z" /> + <glyph glyph-name="football-ball" + unicode="" + horiz-adv-x="496" d=" M481.5 387.7C476.7 405.9 462.4 420.2 444.2 425.1C420.3 431.5 383 439.1 339.4 440L496 283.2C495.2 326.7 487.8 363.8 481.5 387.7zM14.5 -3.7C19.3 -21.9 33.6 -36.2 51.8 -41.1C75.7 -47.4999999999999 113 -55.1 156.6 -55.9999999999999L0 100.8C0.8 57.3 8.2 20.2 14.5 -3.7zM4.2 164.6L220.4 -52C352.9 -32.6 469.2 66.7 491.9 219.4L275.6 436C143.1 416.6 26.8 317.3 4.2 164.6zM321.5 288.2000000000001C324.6 291.3 329.7 291.3 332.8 288.2000000000001L344.1 276.9C347.2000000000001 273.8 347.2000000000001 268.7000000000001 344.1 265.6L315.8 237.3L344.1 209C347.2000000000001 205.9 347.2000000000001 200.8 344.1 197.7L332.8 186.4C329.7 183.3 324.6 183.3 321.5 186.4L293.2 214.7L270.6 192L298.9 163.7C302 160.6 302 155.5 298.9 152.4L287.6 141.1C284.5 138 279.4 138 276.3 141.1L248 169.4L225.4 146.8L253.7 118.5C256.8 115.3999999999999 256.8 110.3 253.7 107.1999999999999L242.4 95.8999999999999C239.3 92.7999999999999 234.2 92.7999999999999 231.1 95.8999999999999L202.8 124.1999999999999L174.5 95.8999999999999C171.4 92.7999999999999 166.3 92.7999999999999 163.2 95.8999999999999L151.9 107.1999999999999C148.8 110.3 148.8 115.3999999999999 151.9 118.5L180.2 146.8L151.9 175C148.8 178.1 148.8 183.1999999999999 151.9 186.3L163.2 197.6C166.3 200.7 171.4 200.7 174.5 197.6L202.8 169.3L225.4 191.9L197.1 220.2C194 223.3 194 228.4 197.1 231.5L208.4 242.8C211.5 245.9 216.6 245.9 219.7 242.8L248 214.5L270.6 237.1L242.3 265.4C239.2 268.5 239.2 273.6 242.3 276.7000000000001L253.6 288C256.7000000000001 291.1 261.8 291.1 264.9000000000001 288L293.2000000000001 259.7000000000001L321.5000000000001 288.2000000000001z" /> + <glyph glyph-name="forward" + unicode="" + horiz-adv-x="512" d=" M500.5 216.6L308.5 376.6C287.9 393.7 256 379.4 256 352V32C256 4.6 287.9 -9.8 308.5 7.4L500.5 167.4C515.8 180.2 515.8 203.8 500.5 216.6zM244.5 216.6L52.5 376.6C31.9 393.7 0 379.4 0 352V32C0 4.6 31.9 -9.8 52.5 7.4L244.5 167.4C259.8 180.2 259.8 203.8 244.5 216.6z" /> + <glyph glyph-name="frown" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM108 256C108 218.503 138.503 188 176 188S244 218.503 244 256S213.497 324 176 324S108 293.497 108 256zM268.5 256C268.5 218.779 298.779 188.5 336 188.5S403.5 218.779 403.5 256S373.221 323.5 336 323.5S268.5 293.221 268.5 256zM336 304A47.789 47.789 0 0 1 313.397 298.353H313.412C324.328 298.353 333.177 289.504 333.177 278.588S324.328 258.8230000000001 313.412 258.8230000000001S293.647 267.6720000000001 293.647 278.588V278.603A47.789 47.789 0 0 1 288 256C288 229.49 309.49 208 336 208S384 229.49 384 256S362.51 304 336 304zM176 304A47.789 47.789 0 0 1 153.397 298.353H153.412C164.328 298.353 173.177 289.504 173.177 278.588S164.328 258.8230000000001 153.412 258.8230000000001S133.647 267.6720000000001 133.647 278.588V278.603A47.789 47.789 0 0 1 128 256C128 229.49 149.49 208 176 208S224 229.49 224 256S202.51 304 176 304zM368.551 91.34C309.423 182.795 202.705 182.934 143.487 91.34C131.985 73.55 158.87 56.192 170.36 73.966C216.986 146.084 295.222 145.821 341.678 73.966C353.006 56.442 380.226 73.282 368.551 91.34z" /> + <glyph glyph-name="futbol" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM456 192L455.997 192.282L429.933 169.541L367.254 228.041L383.7080000000001 312.396L418.011 309.324C393.122 343.54 358.007 369.413 317.302 382.4650000000001L330.9530000000001 350.526L256 309L181.047 350.525L194.698 382.464C154.067 369.436 118.918 343.594 93.989 309.323L128.554 312.396L144.746 228.041L82.068 169.541L56.004 192.282L56.001 192C56.001 148.985 69.498 108.048 94.473 74.009L102.177 107.906L187.315 97.459L223.616 19.633L193.714 1.847C233.916 -11.275 278.004 -11.301 318.286 1.847L288.384 19.633L324.685 97.4590000000001L409.823 107.9060000000001L417.527 74.0090000000001C442.503 108.048 456 148.985 456 192zM207.898 122.429L178.004 213.741L256 270.2680000000001L333.996 213.741L304.374 122.429H207.898z" /> + <glyph glyph-name="gamepad" + unicode="" + horiz-adv-x="640" d=" M480 352H160C71.6 352 0 280.4 0 192S71.6 32 160 32C204.8 32 245.2 50.4 274.2 80H365.7C394.7 50.4 435.2 32 479.9 32C568.3 32 639.9 103.6 639.9 192S568.4 352 480 352zM256 172C256 165.4 250.6 160 244 160H192V108C192 101.4 186.6 96 180 96H140C133.4 96 128 101.4 128 108V160H76C69.4 160 64 165.4 64 172V212C64 218.6 69.4 224 76 224H128V276C128 282.6 133.4 288 140 288H180C186.6 288 192 282.6 192 276V224H244C250.6 224 256 218.6 256 212V172zM440 104C413.5 104 392 125.5 392 152S413.5 200 440 200S488 178.5 488 152S466.5 104 440 104zM520 184C493.5 184 472 205.5 472 232S493.5 280 520 280S568 258.5 568 232S546.5 184 520 184z" /> + <glyph glyph-name="gavel" + unicode="" + horiz-adv-x="512" d=" M504.971 248.638L482.344 271.265C472.971 280.6380000000001 457.775 280.6380000000001 448.403 271.265L442.7460000000001 265.608L329.608 378.745L335.265 384.402C344.638 393.775 344.638 408.971 335.265 418.343L312.638 440.971C303.265 450.344 288.069 450.344 278.697 440.971L154.246 316.52C144.873 307.1470000000001 144.873 291.951 154.246 282.579L176.873 259.952C186.246 250.579 201.442 250.579 210.814 259.952L216.471 265.6090000000001L256.069 226.011L175.029 144.971L169.372 150.628C156.875 163.125 136.614 163.125 124.117 150.628L9.373 35.882C-3.124 23.385 -3.124 3.124 9.373 -9.373L54.628 -54.628C67.125 -67.125 87.386 -67.125 99.883 -54.628L214.628 60.117C227.125 72.614 227.125 92.875 214.628 105.372L208.971 111.029L290.011 192.069L329.6090000000001 152.471L323.9520000000001 146.814C314.5790000000001 137.441 314.5790000000001 122.245 323.9520000000001 112.8730000000001L346.5790000000001 90.246C355.9520000000001 80.8730000000001 371.1480000000001 80.8730000000001 380.5200000000001 90.246L504.9710000000001 214.697C514.3430000000001 224.069 514.3430000000001 239.2650000000001 504.9710000000001 248.6380000000001z" /> + <glyph glyph-name="gem" + unicode="" + horiz-adv-x="576" d=" M485.5 448L576 288H474.9L405.7 448H485.5zM357.5 448L426.7 288H149.3L218.5 448H357.5zM90.5 448H170.3L101.1 288H0L90.5 448zM0 256H100.7L223.7 4.3C225.2 1.2 221 -1.6 218.7 1L0 256zM148.2 256H427.8L290.8 -62.2C289.8 -64.6 286.3 -64.6 285.3 -62.2L148.2 256zM352.3 4.3L475.3 256H576L357.3 1.1C355 -1.6 350.8 1.2 352.3 4.3z" /> + <glyph glyph-name="genderless" + unicode="" + horiz-adv-x="288" d=" M144 272C188.1 272 224 236.1 224 192S188.1 112 144 112S64 147.9 64 192S99.9 272 144 272M144 336C64.5 336 0 271.5 0 192S64.5 48 144 48S288 112.5 288 192S223.5 336 144 336z" /> + <glyph glyph-name="gift" + unicode="" + horiz-adv-x="512" d=" M488 256H423.488C438.7200000000001 272.997 448 295.434 448 320C448 372.935 404.935 416 352 416C310.003 416 283.258 395.307 256.008 361.85C226.671 397.808 199.613 416 160 416C107.065 416 64 372.935 64 320C64 295.434 73.28 272.997 88.512 256H24C10.745 256 0 245.255 0 232V152C0 138.745 10.745 128 24 128H32V16C32 -10.51 53.49 -32 80 -32H432C458.51 -32 480 -10.51 480 16V128H488C501.255 128 512 138.745 512 152V232C512 245.255 501.255 256 488 256zM280 288C304 344 335.324 352 352 352C369.645 352 384 337.645 384 320S369.645 288 352 288H280zM160 352C176.676 352 208 344 232 288H160C142.355 288 128 302.355 128 320S142.355 352 160 352zM208 224H304V40C304 26.745 293.255 16 280 16H232C218.745 16 208 26.745 208 40V224z" /> + <glyph glyph-name="glass-martini" + unicode="" + horiz-adv-x="512" d=" M507.3 420.7C517.3 430.7 510.2 448 496 448H16C1.8 448 -5.4 430.8 4.7 420.7L216 209.4V-24H124C108.5 -24 96 -36.5 96 -52C96 -58.6 101.4 -64 108 -64H404C410.6 -64 416 -58.6 416 -52C416 -36.5 403.5 -24 388 -24H296V209.4L507.3 420.7z" /> + <glyph glyph-name="globe" + unicode="" + horiz-adv-x="512" d=" M364.215 256H495.645C501.084 235.581 503.999 214.132 503.999 192S501.0839999999999 148.419 495.645 128H364.215C369.369 171.049 369.154 214.746 364.215 256zM185.214 96C195.892 42.32 218.387 -16.514 255.339 -55.992C255.56 -55.9929999999999 255.779 -55.9999999999999 256 -55.9999999999999S256.44 -55.992 256.661 -55.992C293.673 -16.449 316.128 42.422 326.786 96H185.214zM359.344 288H484.729C452.802 363.976 384.128 420.695 300.95 435.925C331.188 392.805 349.771 339.593 359.344 288zM331.994 256H180.006C174.667 214.086 174.661 169.963 180.006 128H331.995C337.334 169.915 337.3400000000001 214.037 331.9940000000001 256zM152.656 96H27.271C59.197 20.024 127.871 -36.695 211.049 -51.925C180.803 -8.789 162.226 44.425 152.656 96zM359.344 96C349.769 44.395 331.181 -8.814 300.95 -51.925C384.128 -36.695 452.802 20.024 484.728 96H359.344zM326.786 288C316.108 341.68 293.612 400.514 256.661 439.992C256.44 439.992 256.221 440 256 440S255.56 439.992 255.339 439.992C218.327 400.449 195.872 341.578 185.214 288H326.786zM16.355 256C10.915 235.581 8 214.132 8 192S10.915 148.419 16.355 128H147.785C142.846 169.254 142.631 212.951 147.785 256H16.355zM152.656 288C162.231 339.602 180.817 392.81 211.05 435.925C127.872 420.695 59.198 363.976 27.271 288H152.656z" /> + <glyph glyph-name="golf-ball" + unicode="" + horiz-adv-x="416" d=" M96 32H320C320 14.3 305.7 0 288 0H272C254.3 0 240 -14.3 240 -32V-52C240 -58.6 234.6 -64 228 -64H188C181.4 -64 176 -58.6 176 -52V-32C176 -14.3 161.7 0 144 0H128C110.3 0 96 14.3 96 32zM416 240C416 165.8 377 100.8 318.5 64H97.5C39 100.8 0 165.8 0 240C0 354.9 93.1 448 208 448S416 354.9 416 240zM235.9 196.1C254.2 196.1 269 210.9 269 229.2C269 243.6 259.7 255.5 246.9 260.1C256.5 233.3 231.3 208.8 205 218.2C209.6 205.4 221.5 196.1 235.9 196.1zM285 149.2C285 163.6 275.7 175.5 262.9 180.1C272.5 153.3 247.3 128.8 221 138.2C225.6 125.4 237.5 116.1 251.9 116.1C270.2 116.1 285 131 285 149.2zM349 213.2C349 227.6 339.7 239.5 326.9 244.1C336.5 217.3 311.3 192.8 285 202.2C289.6 189.4 301.5 180.1 315.9 180.1C334.2 180.1 349 195 349 213.2z" /> + <glyph glyph-name="graduation-cap" + unicode="" + horiz-adv-x="640" d=" M622.884 248.995L347.067 163.895A96 96 0 0 0 292.933 163.895L92.398 225.768C83.834 214.33 81.38 202.718 80.48 187.433C89.778 181.835 96 171.645 96 160C96 148.048 89.443 137.634 79.735 132.139L95.932 9.043C96.562 4.257 92.832 0 88 0H40C35.172 0 31.438 4.253 32.068 9.044L48.265 132.14C38.557 137.634 32 148.048 32 160C32 172.034 38.646 182.511 48.465 187.976C49.412 205.927 52.439 221.207 60.617 235.573L17.115 248.995C-5.761 255.796 -5.651 288.236 17.115 295.005L292.932 380.105A96 96 0 0 0 347.0660000000001 380.105L622.883 295.005C645.76 288.204 645.6500000000001 255.764 622.884 248.995zM356.503 133.318L356.296 133.254L356.089 133.193A127.99799999999999 127.99799999999999 0 0 0 283.912 133.193L283.705 133.254L283.498 133.318L132.584 179.888L120 96C120 60.654 209.543 32 320 32S520 60.654 520 96L507.417 179.888L356.503 133.3180000000001z" /> + <glyph glyph-name="h-square" + unicode="" + horiz-adv-x="448" d=" M448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368zM336 320H304C295.163 320 288 312.837 288 304V224H160V304C160 312.837 152.837 320 144 320H112C103.163 320 96 312.837 96 304V80C96 71.163 103.163 64 112 64H144C152.837 64 160 71.163 160 80V160H288V80C288 71.163 295.163 64 304 64H336C344.837 64 352 71.163 352 80V304C352 312.837 344.837 320 336 320z" /> + <glyph glyph-name="hand-lizard" + unicode="" + horiz-adv-x="576" d=" M384 -32H576V84.222A95.998 95.998 0 0 1 561.167 135.485L398.127 393.632A48 48 0 0 1 357.544 416H24C10.745 416 0 405.255 0 392V376C0 345.072 25.072 320 56 320H285.981C298.825 320 307.537 306.933 302.596 295.077L281.186 243.692A32 32 0 0 0 251.648 224H128C92.654 224 64 195.346 64 160V152C64 138.745 74.745 128 88 128H235.406A47.995 47.995 0 0 0 261.098 120.545L372.846 49.734A24.001000000000005 24.001000000000005 0 0 0 384 29.461V-32z" /> + <glyph glyph-name="hand-paper" + unicode="" + horiz-adv-x="448" d=" M408.781 319.993C386.356 320.4220000000001 368 301.64 368 279.2100000000001V192H360V368.21C360 390.64 341.644 409.4220000000001 319.219 408.993C297.488 408.577 280 390.831 280 369V192H272V407.21C272 429.64 253.644 448.4220000000001 231.219 447.993C209.488 447.577 192 429.831 192 408V192H184V367.21C184 389.64 165.644 408.4220000000001 143.219 407.993C121.488 407.577 104 389.831 104 368V132.0080000000001L72.352 175.5270000000001C59.359 193.393 34.343 197.3440000000001 16.475 184.35C-1.39 171.356 -5.34 146.34 7.653 128.473L133.254 -44.232A48 48 0 0 1 172.073 -64H369.663C391.937 -64 411.2850000000001 -48.676 416.387 -26.994L442.895 85.6659999999999A192.011 192.011 0 0 1 447.999 129.641V280C448 301.831 430.512 319.577 408.781 319.993z" /> + <glyph glyph-name="hand-peace" + unicode="" + horiz-adv-x="448" d=" M408 232C385.908 232 368 214.091 368 192H360V224C360 246.091 342.092 264 320 264S280 246.091 280 224V192H272V400C272 426.51 250.51 448 224 448S176 426.51 176 400V192H162.428L92.688 369.551C82.994 394.226 55.134 406.37 30.461 396.676C5.787 386.983 -6.356 359.123 3.337 334.449L78.102 144.107L47.012 119.235C31.631 106.929 27.497 85.257 37.271 68.1539999999999L101.271 -43.8460000000001A39.998 39.998 0 0 1 136 -64H376C394.562 -64 410.686 -51.23 414.937 -33.162L446.937 102.838A39.97 39.97 0 0 1 448 112V192C448 214.091 430.092 232 408 232z" /> + <glyph glyph-name="hand-point-down" + unicode="" + horiz-adv-x="384" d=" M91.826 -19.2V130.034C83.578 124.193 75.268 119.464 66.908 115.881C35.098 102.248 -0.014 125.778 0 160C0.008 178.616 10.897 192.203 29.092 200C57.378 212.122 93.421 278.648 106.415 307.534C114.371 325.391 131.894 335.987 150.26 335.998L150.261 336H321.7870000000001C333.5990000000001 336 343.6840000000001 327.404 345.49 315.731C352.74 268.894 383.973 253.971 383.805 192C383.798 189.276 384 178.746 384 176C384 125.346 361.878 94.426 312.737 103.4C303.44 84.803 273.251 72.662 250.422 86.95C229.245 62.305 196.526 64.311 179.478 80.651V-19.2C179.478 -43.35 159.277 -64 135.652 -64C112.369 -64 91.826 -42.65 91.826 -19.2zM112 376V424C112 437.255 122.745 448 136 448H328C341.255 448 352 437.255 352 424V376C352 362.745 341.255 352 328 352H136C122.745 352 112 362.745 112 376zM324 400C324 411.046 315.046 420 304 420S284 411.046 284 400S292.954 380 304 380S324 388.954 324 400z" /> + <glyph glyph-name="hand-point-left" + unicode="" + horiz-adv-x="512" d=" M44.8 292.174H194.034C188.193 300.4220000000001 183.464 308.732 179.881 317.092C166.248 348.902 189.778 384.014 224 384C242.616 383.992 256.203 373.103 264 354.908C276.122 326.622 342.648 290.579 371.534 277.5850000000001C389.391 269.629 399.987 252.106 399.998 233.74L400 233.739V62.213C400 50.401 391.404 40.316 379.731 38.51C332.894 31.26 317.971 0.027 256 0.195C253.276 0.202 242.746 0 240 0C189.346 0 158.426 22.122 167.4 71.263C148.803 80.5600000000001 136.662 110.749 150.95 133.578C126.305 154.7550000000001 128.311 187.4740000000001 144.651 204.5220000000001H44.8C20.65 204.5220000000001 0 224.7230000000001 0 248.3480000000001C0 271.6310000000001 21.35 292.1740000000001 44.8 292.1740000000001zM440 272H488C501.255 272 512 261.255 512 248V56C512 42.745 501.255 32 488 32H440C426.745 32 416 42.745 416 56V248C416 261.255 426.745 272 440 272zM464 60C475.046 60 484 68.954 484 80S475.046 100 464 100S444 91.046 444 80S452.954 60 464 60z" /> + <glyph glyph-name="hand-point-right" + unicode="" + horiz-adv-x="512" d=" M512 248.348C512 224.723 491.35 204.522 467.2 204.522H367.349C383.689 187.4740000000001 385.695 154.756 361.05 133.578C375.338 110.749 363.197 80.561 344.6 71.263C353.574 22.122 322.654 0 272 0C269.254 0 258.724 0.203 256 0.195C194.029 0.027 179.106 31.26 132.269 38.51C120.596 40.317 112 50.401 112 62.214V233.739L112.002 233.74C112.013 252.106 122.609 269.629 140.466 277.5850000000001C169.352 290.579 235.879 326.623 248 354.908C255.797 373.102 269.384 383.992 288 384C322.222 384.014 345.752 348.902 332.1190000000001 317.092C328.536 308.733 323.807 300.422 317.966 292.174H467.2C490.65 292.174 512 271.631 512 248.348zM96 248V56C96 42.745 85.255 32 72 32H24C10.745 32 0 42.745 0 56V248C0 261.255 10.745 272 24 272H72C85.255 272 96 261.255 96 248zM68 80C68 91.046 59.046 100 48 100S28 91.046 28 80S36.954 60 48 60S68 68.954 68 80z" /> + <glyph glyph-name="hand-point-up" + unicode="" + horiz-adv-x="384" d=" M135.652 448C159.277 448 179.478 427.35 179.478 403.2V303.349C196.526 319.689 229.244 321.695 250.422 297.05C273.251 311.338 303.439 299.197 312.737 280.6C361.878 289.574 384 258.654 384 208C384 205.254 383.7970000000001 194.724 383.805 192C383.973 130.029 352.74 115.106 345.49 68.269C343.683 56.596 333.599 48 321.786 48H150.261L150.26 48.002C131.894 48.013 114.371 58.609 106.415 76.466C93.421 105.352 57.377 171.878 29.092 184C10.897 191.797 0.008 205.384 0 224C-0.014 258.222 35.098 281.752 66.908 268.1190000000001C75.267 264.536 83.578 259.807 91.826 253.966V403.2C91.826 426.65 112.369 448 135.652 448zM136 32H328C341.255 32 352 21.255 352 8V-40C352 -53.255 341.255 -64 328 -64H136C122.745 -64 112 -53.255 112 -40V8C112 21.255 122.745 32 136 32zM304 4C292.954 4 284 -4.954 284 -16S292.954 -36 304 -36S324 -27.046 324 -16S315.046 4 304 4z" /> + <glyph glyph-name="hand-pointer" + unicode="" + horiz-adv-x="448" d=" M448 208V112C448 108.916 447.644 105.841 446.937 102.838L414.937 -33.162C410.686 -51.23 394.562 -64 376 -64H168A40.004 40.004 0 0 0 135.65 -47.527L7.653 128.473C-5.34 146.339 -1.39 171.356 16.475 184.349C34.342 197.343 59.359 193.392 72.352 175.526L104 132.008V408C104 430.091 121.908 448 144 448S184 430.091 184 408V208H192V248C192 270.091 209.908 288 232 288S272 270.091 272 248V208H280V232C280 254.091 297.908 272 320 272S360 254.091 360 232V208H368C368 230.091 385.908 248 408 248S448 230.091 448 208zM192 128H184V32H192V128zM280 128H272V32H280V128zM368 128H360V32H368V128z" /> + <glyph glyph-name="hand-rock" + unicode="" + horiz-adv-x="512" d=" M512 319.2100000000001C512 345.5320000000001 491.139 367.554 464.82 367.993C437.935 368.442 416 346.783 416 320H408V351.21C408 377.532 387.139 399.554 360.82 399.993C333.935 400.442 312 378.783 312 352V320H304V367.21C304 393.532 283.139 415.554 256.82 415.993C229.935 416.442 208 394.783 208 368V320H200V351.21C200 377.532 179.139 399.554 152.82 399.993C125.935 400.442 104 378.783 104 352V216L96 223.111V271.2100000000001C96 297.5320000000001 75.139 319.554 48.82 319.993C21.935 320.442 0 298.783 0 272V205.555A95.998 95.998 0 0 1 32.221 133.804L143.889 34.543A47.999 47.999 0 0 0 160 -1.333V-8C160 -21.255 170.745 -32 184 -32H424C437.255 -32 448 -21.255 448 -8V-5.079A96.01 96.01 0 0 0 455.523 32.175L504.477 148.44A96.002 96.002 0 0 1 512 185.694V319.2100000000001z" /> + <glyph glyph-name="hand-scissors" + unicode="" + horiz-adv-x="512" d=" M216 8C216 30.092 233.909 48 256 48V56H224C201.909 56 184 73.908 184 96S201.909 136 224 136H256V144H48C21.49 144 0 165.49 0 192S21.49 240 48 240H256V253.572L78.449 323.312C53.775 333.006 41.631 360.867 51.324 385.54C61.017 410.214 88.878 422.357 113.552 412.664L303.894 337.899L328.766 368.9890000000001C341.072 384.37 362.7440000000001 388.504 379.8470000000001 378.73L491.847 314.73A40.002 40.002 0 0 0 512 280V40C512 21.438 499.23 5.314 481.162 1.063L345.162 -30.937A39.982 39.982 0 0 0 336 -32H256C233.909 -32 216 -14.092 216 8z" /> + <glyph glyph-name="hand-spock" + unicode="" + horiz-adv-x="512" d=" M10.872 131.415C26.011 147.501 51.326 148.269 67.415 133.1280000000001L128 76.107V155.5120000000001L88.995 327.135C84.099 348.677 97.593 370.1090000000001 119.135 375.005C140.684 379.899 162.11 366.406 167.005 344.8640000000001L201.747 192H211.58L164.016 399.034C159.07 420.565 172.514 442.028 194.044 446.974C215.576 451.924 237.038 438.476 241.984 416.9460000000001L293.664 192H308.769L357.194 385.702C362.5510000000001 407.134 384.269 420.164 405.701 414.806C427.1330000000001 409.448 440.1640000000001 387.731 434.805 366.299L391.231 192H402.311L433.079 321.265C438.196 342.756 459.764 356.033 481.256 350.912C502.747 345.795 516.021 324.226 510.903 302.735L474.611 150.268A96.02400000000002 96.02400000000002 0 0 1 472 128.033V85.931A96.002 96.002 0 0 0 468.04 58.6440000000001L441.8660000000001 -29.6429999999999C435.825 -50.022 417.101 -64 395.846 -64H179.172A48.00200000000001 48.00200000000001 0 0 0 146.274 -50.954L12.585 74.872C-3.502 90.013 -4.268 115.328 10.872 131.415z" /> + <glyph glyph-name="handshake" + unicode="" + horiz-adv-x="640" d=" M72 336H24C10.745 336 0 325.255 0 312V104C0 90.745 10.745 80 24 80H72C85.255 80 96 90.745 96 104V312C96 325.255 85.255 336 72 336zM48 108C36.954 108 28 116.954 28 128S36.954 148 48 148S68 139.046 68 128S59.046 108 48 108zM616 336H568C554.745 336 544 325.255 544 312V104C544 90.745 554.745 80 568 80H616C629.255 80 640 90.745 640 104V312C640 325.255 629.255 336 616 336zM592 108C580.954 108 572 116.954 572 128S580.954 148 592 148S612 139.046 612 128S603.046 108 592 108zM485.94 355.33L528 307.26V128H508.83C509.39 142.96 504.45 156.98 494.83 167.71L413.91 266.62C416.84 269.82 416.67 274.78 413.53 277.78C410.71 280.48 406.45 280.7 403.39 278.54C402.97 278.24 343.04 215.61 343.04 215.61L342.84 215.4C318.936 188.495 276.713 189.196 253.69 216.8199999999999C238.21 235.3999999999999 238.4 262.2099999999999 254.14 280.58L320.7099999999999 358.25C334.304 374.12 354.534 384 376.7 384H422.75A83.98 83.98 0 0 0 485.94 355.33zM482.57 157.41C498.03 140.63 495.16 113.5800000000001 480.2 99.66C462.489 83.198 437.767 86.656 434.27 90.46C435.923 74.802 412.881 43.211 377.85 45.78C371.525 24.595 345.552 6.871 318.67 16.17C308.45 5.96 292.85 1.2 278.86 1.2C250.17 1.2 223.94 13.19 206.28 32L112 128V312.48L173.36 363.05A71.52 71.52 0 0 0 223.93 384H261.35C278.0800000000001 384 294.0300000000001 377.16 305.56 365.15L241.99 290.99C221.15 266.68 220.9 231.18 241.4 206.57C270.775 171.323 324.4070000000001 170.717 354.7100000000001 204.65L402.82 255L482.57 157.41z" /> + <glyph glyph-name="hashtag" + unicode="" + horiz-adv-x="448" d=" M440.667 265.891L447.81 305.891C449.123 313.246 443.468 320 435.997 320H361.187L375.81 401.891C377.123 409.246 371.468 416 363.997 416H323.365A12 12 0 0 1 311.552 406.109L296.175 320H197.54L212.163 401.891C213.477 409.246 207.822 416 200.35 416H159.718A12 12 0 0 1 147.905 406.109L132.528 320H53.432A12 12 0 0 1 41.619 310.1090000000001L34.476 270.1090000000001C33.163 262.754 38.818 256 46.289 256H121.099L98.242 128H19.146A12 12 0 0 1 7.333 118.109L0.19 78.109C-1.123 70.754 4.532 64 12.003 64H86.813L72.19 -17.891C70.877 -25.246 76.532 -32 84.003 -32H124.635A12 12 0 0 1 136.448 -22.109L151.826 64H250.46L235.837 -17.891C234.523 -25.246 240.178 -32 247.65 -32H288.282A12 12 0 0 1 300.095 -22.109L315.472 64H394.568A12 12 0 0 1 406.381 73.891L413.524 113.891C414.837 121.2460000000001 409.182 128 401.711 128H326.901L349.7579999999999 256H428.854A12 12 0 0 1 440.6669999999999 265.891zM261.889 128H163.255L186.112 256H284.746L261.889 128z" /> + <glyph glyph-name="hdd" + unicode="" + horiz-adv-x="576" d=" M576 144V48C576 21.49 554.51 0 528 0H48C21.49 0 0 21.49 0 48V144C0 170.51 21.49 192 48 192H528C554.51 192 576 170.51 576 144zM528 224A79.557 79.557 0 0 0 558.777 217.835L462.25 362.626A48.003 48.003 0 0 1 422.311 384H153.689A48 48 0 0 1 113.751 362.626L17.223 217.835A79.557 79.557 0 0 0 48 224H528zM480 128C462.327 128 448 113.673 448 96S462.327 64 480 64S512 78.327 512 96S497.673 128 480 128zM384 128C366.327 128 352 113.673 352 96S366.327 64 384 64S416 78.327 416 96S401.673 128 384 128z" /> + <glyph glyph-name="heading" + unicode="" + horiz-adv-x="512" d=" M496 368V400C496 408.837 488.837 416 480 416H320C311.163 416 304 408.837 304 400V368C304 359.163 311.163 352 320 352H357.621V224H154.379V352H192C200.837 352 208 359.163 208 368V400C208 408.837 200.837 416 192 416H32C23.163 416 16 408.837 16 400V368C16 359.163 23.163 352 32 352H69.275V32H32C23.163 32 16 24.837 16 16V-16C16 -24.837 23.163 -32 32 -32H192C200.837 -32 208 -24.837 208 -16V16C208 24.837 200.837 32 192 32H154.379V160H357.62V32H320C311.163 32 304 24.837 304 16V-16C304 -24.837 311.163 -32 320 -32H480C488.837 -32 496 -24.837 496 -16V16C496 24.837 488.837 32 480 32H442.725V352H480C488.837 352 496 359.163 496 368z" /> + <glyph glyph-name="headphones" + unicode="" + horiz-adv-x="512" d=" M256 416C114.52 416 0 301.504 0 160V112A32 32 0 0 1 17.689 83.378L32.072 76.187C34.083 16.097 83.421 -32 144 -32H168C181.255 -32 192 -21.255 192 -8V168C192 181.255 181.255 192 168 192H144C112.658 192 84.329 179.121 64 158.373V160C64 265.8690000000001 150.131 352 256 352S448 265.8690000000001 448 160V158.373C427.671 179.121 399.342 192 368 192H344C330.745 192 320 181.255 320 168V-8C320 -21.255 330.745 -32 344 -32H368C428.579 -32 477.917 16.098 479.928 76.187L494.31 83.378A32 32 0 0 1 512 112V160C512 301.4790000000001 397.504 416 256 416z" /> + <glyph glyph-name="heart" + unicode="" + horiz-adv-x="576" d=" M414.9 424C361.8 424 312 382.3 288 358.7C264 382.3 214.2 424 161.1 424C70.3 424 16 371.1 16 282.5C16 209.9 82.8 149.2 85.2 147.1L272.2 -33.7C281 -42.2 295 -42.2 303.8 -33.7L490.5 146.5C493.2 149.2 560 210 560 282.5C560 371.1 505.7 424 414.9 424z" /> + <glyph glyph-name="heartbeat" + unicode="" + horiz-adv-x="512" d=" M320.2 204.2L270.5 104.8C264.5 92.6999999999999 247.1 93.1 241.6 105.4L184.7 231.7L154.7 160H60.6L243.1 -26.5C250.2 -33.8 261.7 -33.8 268.8 -26.5L451.4 160H342.3L320.2 204.2zM473.7 374.1L471.3 376.6C419.8 429.2 335.5 429.2 283.9 376.6L256 348L228.1 376.5C176.6 429.2 92.2 429.2 40.7 376.5L38.3 374.1C-10.4 324.3 -12.5 245 31 192H133.4L169.3 278.2C174.7 291.1 192.9 291.4 198.7 278.6L256.9000000000001 149.3L305.9000000000001 247.2C311.8 259 328.6 259 334.5000000000001 247.2L362.1000000000001 192H481C524.5 245 522.4 324.3 473.7 374.0999999999999z" /> + <glyph glyph-name="history" + unicode="" + horiz-adv-x="512" d=" M504 192.469C504.253 55.829 392.82 -55.903 256.18 -55.999C197.165 -56.041 142.957 -35.469 100.358 -1.088C89.281 7.852 88.453 24.453 98.519 34.519L109.786 45.786C118.395 54.395 132.139 55.337 141.677 47.77C173.062 22.865 212.781 8 256 8C357.705 8 440 90.311 440 192C440 293.705 357.689 376 256 376C207.186 376 162.851 357.031 129.932 326.068L180.686 275.314C190.766 265.234 183.627 248 169.373 248H24C15.163 248 8 255.163 8 264V409.373C8 423.627 25.234 430.766 35.314 420.687L84.686 371.315C129.209 413.864 189.552 440 256 440C392.81 440 503.747 329.2200000000001 504 192.469zM323.088 113.685L332.911 126.315C341.0489999999999 136.778 339.164 151.857 328.701 159.994L288 191.651V296C288 309.255 277.255 320 264 320H248C234.745 320 224 309.255 224 296V160.349L289.409 109.475C299.872 101.338 314.95 103.222 323.088 113.685z" /> + <glyph glyph-name="hockey-puck" + unicode="" + horiz-adv-x="512" d=" M0 288C0 341 114.6 384 256 384S512 341 512 288S397.4 192 256 192S0 235 0 288zM0 205.8V96C0 43 114.6 0 256 0S512 43 512 96V205.8C398.6 123.5 113.5 123.4 0 205.8z" /> + <glyph glyph-name="home" + unicode="" + horiz-adv-x="576" d=" M488 135.3V-8C488 -21.3 477.3 -32 464 -32H348C341.4 -32 336 -26.6 336 -20V92C336 98.6 330.6 104 324 104H252C245.4 104 240 98.6 240 92V-20C240 -26.6 234.6 -32 228 -32H112C98.7 -32 88 -21.3 88 -8V135.3C88 138.9 89.6 142.3 92.4 144.6L280.4 299.4000000000001C284.8 303 291.2 303 295.7 299.4000000000001L483.7 144.6C486.4 142.3 488 138.9 488 135.3zM571.6 196.2L488 265.1V403.6C488 410.2 482.6 415.6 476 415.6H420C413.4 415.6 408 410.2 408 403.6V331L318.5 404.7C300.8 419.3 275.2 419.3 257.5 404.7L4.4 196.2C-0.7 192 -1.4 184.4 2.8 179.3L28.3 148.3C32.5 143.2 40.1 142.5 45.2 146.7L280.4 340.4C284.8 344 291.2 344 295.7 340.4L530.9 146.7C536 142.5 543.6 143.2 547.8 148.3L573.3 179.3C577.5 184.5 576.6999999999999 192 571.5999999999999 196.2z" /> + <glyph glyph-name="hospital-symbol" + unicode="" + horiz-adv-x="512" d=" M256 448C114.6 448 0 333.4 0 192S114.6 -64 256 -64S512 50.6 512 192S397.4 448 256 448zM368 72C368 67.6 364.4 64 360 64H312C307.6 64 304 67.6 304 72V160H208V72C208 67.6 204.4 64 200 64H152C147.6 64 144 67.6 144 72V312C144 316.4 147.6 320 152 320H200C204.4 320 208 316.4 208 312V224H304V312C304 316.4 307.6 320 312 320H360C364.4 320 368 316.4 368 312V72z" /> + <glyph glyph-name="hospital" + unicode="" + horiz-adv-x="448" d=" M448 -44V-64H0V-44C0 -37.373 5.373 -32 12 -32H32V328C32 341.255 42.745 352 56 352H144V424C144 437.255 154.745 448 168 448H280C293.255 448 304 437.255 304 424V352H392C405.255 352 416 341.255 416 328V-32H436C442.627 -32 448 -37.373 448 -44zM308 256H268C261.373 256 256 250.627 256 244V204C256 197.373 261.373 192 268 192H308C314.627 192 320 197.373 320 204V244C320 250.627 314.627 256 308 256zM140 192H180C186.627 192 192 197.373 192 204V244C192 250.627 186.627 256 180 256H140C133.373 256 128 250.627 128 244V204C128 197.373 133.373 192 140 192zM244 64H204C197.373 64 192 58.627 192 52V-32H256V52C256 58.627 250.627 64 244 64zM308 160H268C261.373 160 256 154.627 256 148V108C256 101.373 261.373 96 268 96H308C314.627 96 320 101.373 320 108V148C320 154.627 314.627 160 308 160zM192 148C192 154.627 186.627 160 180 160H140C133.373 160 128 154.627 128 148V108C128 101.373 133.373 96 140 96H180C186.627 96 192 101.373 192 108V148zM182 352H208V326A6 6 0 0 1 214 320H234A6 6 0 0 1 240 326V352H266A6 6 0 0 1 272 358V378A6 6 0 0 1 266 384H240V410A6 6 0 0 1 234 416H214A6 6 0 0 1 208 410V384H182A6 6 0 0 1 176 378V358A6 6 0 0 1 182 352z" /> + <glyph glyph-name="hourglass-end" + unicode="" + horiz-adv-x="384" d=" M360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384zM192 240C134.213 240 88 306.5180000000001 88 384H296C296 306.055 249.49 240 192 240z" /> + <glyph glyph-name="hourglass-half" + unicode="" + horiz-adv-x="384" d=" M360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448zM284.9220000000001 64H99.08C116.139 110.797 151.176 144 192 144C232.821 144 267.862 110.804 284.9220000000001 64zM284.9410000000001 320H99.078C91.988 339.452 88 361.252 88 384H296C296 361.195 292.013 339.413 284.941 320z" /> + <glyph glyph-name="hourglass-start" + unicode="" + horiz-adv-x="384" d=" M360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448zM296 0H88C88 77.458 134.204 144 192 144C249.786 144 296 77.483 296 0z" /> + <glyph glyph-name="hourglass" + unicode="" + horiz-adv-x="384" d=" M360 384C373.255 384 384 394.745 384 408V424C384 437.255 373.255 448 360 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384C24 293.035 75.016 216.266 144.842 192C75.016 167.734 24 90.965 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64H360C373.255 -64 384 -53.255 384 -40V-24C384 -10.745 373.255 0 360 0C360 90.965 308.984 167.734 239.158 192C308.984 216.266 360 293.035 360 384z" /> + <glyph glyph-name="i-cursor" + unicode="" + horiz-adv-x="256" d=" M256 395.952V435.935C256 442.504 250.726 447.852 244.158 447.9340000000001C211.621 448.344 166.469 447.989 128 410.041C90.266 447.264 46.979 448.114 11.913 447.886C5.318 447.843 0 442.481 0 435.886V396.241C0 389.554 5.458 384.163 12.145 384.243C38.111 384.553 96 380.757 96 335.818V224H60C53.373 224 48 218.627 48 212V172C48 165.373 53.373 160 60 160H96V48C96 3.068 39.925 -0.031 12.05 0.041C5.404 0.058 0 -5.306 0 -11.952V-51.935C0 -58.504 5.274 -63.852 11.842 -63.934C44.379 -64.3430000000001 89.531 -63.988 128 -26.04C165.734 -63.263 209.021 -64.1130000000001 244.087 -63.885C250.682 -63.842 256 -58.48 256 -51.885V-12.24C256 -5.553 250.542 -0.162 243.855 -0.242C217.889 -0.553 160 3.061 160 48V160H196C202.627 160 208 165.373 208 172V212C208 218.627 202.627 224 196 224H160V335.818C160 380.75 216.075 384.031 243.95 383.9600000000001C250.596 383.942 256 389.3060000000001 256 395.952z" /> + <glyph glyph-name="id-badge" + unicode="" + horiz-adv-x="384" d=" M336 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V400C384 426.51 362.51 448 336 448zM128 404C128 410.627 133.373 416 140 416H244C250.627 416 256 410.627 256 404V396C256 389.373 250.627 384 244 384H140C133.373 384 128 389.373 128 396V404zM192 288C236.183 288 272 252.183 272 208S236.183 128 192 128S112 163.817 112 208S147.817 288 192 288zM320 56C320 42.745 309.255 32 296 32H88C74.745 32 64 42.745 64 56V74.523C64 96.549 78.99 115.7480000000001 100.358 121.09L136.014 130.004C165.115 109.072 210.523 103.059 247.984 130.004L283.64 121.09C305.01 115.7480000000001 320 96.548 320 74.523V56z" /> + <glyph glyph-name="id-card" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM256 98C256 88.059 247.941 80 238 80H82C72.059 80 64 88.059 64 98V111.892C64 128.411 75.243 142.811 91.269 146.817L118.011 153.503C139.837 137.804 173.893 133.294 201.989 153.503L228.732 146.817C244.757 142.811 256 128.411 256 111.892V98zM100 212C100 245.137 126.863 272 160 272S220 245.137 220 212S193.137 152 160 152S100 178.863 100 212zM448 108C448 101.373 442.627 96 436 96H300C293.373 96 288 101.373 288 108V116C288 122.627 293.373 128 300 128H436C442.627 128 448 122.627 448 116V108zM448 172C448 165.373 442.627 160 436 160H300C293.373 160 288 165.373 288 172V180C288 186.627 293.373 192 300 192H436C442.627 192 448 186.627 448 180V172zM448 236C448 229.373 442.627 224 436 224H300C293.373 224 288 229.373 288 236V244C288 250.627 293.373 256 300 256H436C442.627 256 448 250.627 448 244V236zM480 332C480 325.373 474.627 320 468 320H44C37.373 320 32 325.373 32 332V340C32 346.627 37.373 352 44 352H468C474.627 352 480 346.627 480 340V332z" /> + <glyph glyph-name="image" + unicode="" + horiz-adv-x="512" d=" M464 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H464C490.51 384 512 362.51 512 336V48C512 21.49 490.51 0 464 0zM112 328C81.072 328 56 302.928 56 272S81.072 216 112 216S168 241.072 168 272S142.928 328 112 328zM64 64H448V176L360.485 263.515C355.7990000000001 268.201 348.201 268.201 343.514 263.515L208 128L152.485 183.515C147.799 188.201 140.201 188.201 135.514 183.515L64 112V64z" /> + <glyph glyph-name="images" + unicode="" + horiz-adv-x="576" d=" M480 32V16C480 -10.51 458.51 -32 432 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V112C64 67.888 99.888 32 144 32H480zM576 112V368C576 394.51 554.51 416 528 416H144C117.49 416 96 394.51 96 368V112C96 85.49 117.49 64 144 64H528C554.51 64 576 85.49 576 112zM256 320C256 293.49 234.51 272 208 272S160 293.49 160 320S181.49 368 208 368S256 346.51 256 320zM160 176L215.515 231.515C220.201 236.201 227.799 236.201 232.486 231.515L272 192L407.515 327.515C412.201 332.201 419.799 332.201 424.486 327.515L512 240V128H160V176z" /> + <glyph glyph-name="inbox" + unicode="" + horiz-adv-x="576" d=" M567.938 204.092L462.25 362.626A48.003 48.003 0 0 1 422.311 384H153.689A48 48 0 0 1 113.751 362.626L8.062 204.092A47.994 47.994 0 0 1 0 177.467V48C0 21.49 21.49 0 48 0H528C554.51 0 576 21.49 576 48V177.467A47.994 47.994 0 0 1 567.938 204.092zM162.252 320H413.749L499.082 192H376L344 128H232L200 192H76.918L162.252 320z" /> + <glyph glyph-name="indent" + unicode="" + horiz-adv-x="448" d=" M0 364V404C0 412.837 7.163 420 16 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H16C7.163 348 0 355.163 0 364zM176 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H176C167.163 292 160 284.837 160 276V236C160 227.163 167.163 220 176 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM176 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H176C167.163 164 160 156.837 160 148V108C160 99.163 167.163 92 176 92zM123.313 203.313L27.313 299.297C17.266 309.348 0 302.224 0 287.9840000000001V96.009C0 81.68 17.325 74.705 27.313 84.696L123.313 180.6880000000001C129.562 186.9350000000001 129.562 197.0650000000001 123.313 203.3130000000001z" /> + <glyph glyph-name="industry" + unicode="" + horiz-adv-x="512" d=" M475.115 284.219L336 195.691V263.971C336 282.887 315.069 294.37 299.115 284.219L160 195.691V392C160 405.255 149.255 416 136 416H24C10.745 416 0 405.255 0 392V-8C0 -21.255 10.745 -32 24 -32H488C501.255 -32 512 -21.255 512 -8V263.971C512 282.8880000000001 491.069 294.37 475.115 284.219z" /> + <glyph glyph-name="info-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119.043 440 8 328.9170000000001 8 192C8 55.003 119.043 -56 256 -56S504 55.003 504 192C504 328.9170000000001 392.957 440 256 440zM256 330C279.1960000000001 330 298 311.1960000000001 298 288S279.1960000000001 246 256 246S214 264.804 214 288S232.804 330 256 330zM312 76C312 69.373 306.627 64 300 64H212C205.373 64 200 69.373 200 76V100C200 106.627 205.373 112 212 112H224V176H212C205.373 176 200 181.373 200 188V212C200 218.627 205.373 224 212 224H276C282.627 224 288 218.627 288 212V112H300C306.627 112 312 106.627 312 100V76z" /> + <glyph glyph-name="info" + unicode="" + horiz-adv-x="192" d=" M20 23.771H40V168.229H20C8.954 168.229 0 177.183 0 188.229V236C0 247.046 8.954 256 20 256H132C143.046 256 152 247.046 152 236V23.771H172C183.046 23.771 192 14.817 192 3.771V-44C192 -55.046 183.046 -64 172 -64H20C8.954 -64 0 -55.046 0 -44V3.771C0 14.817 8.954 23.771 20 23.771zM96 448C56.235 448 24 415.765 24 376S56.235 304 96 304S168 336.235 168 376S135.764 448 96 448z" /> + <glyph glyph-name="italic" + unicode="" + horiz-adv-x="320" d=" M204.758 32H170.909L233.0010000000001 352H273.7260000000001A16 16 0 0 1 289.4300000000001 364.937L295.6720000000001 396.937C297.599 406.8160000000001 290.034 416 279.968 416H120.235A16 16 0 0 1 104.531 403.063L98.289 371.063C96.362 361.184 103.927 352 113.993 352H147.839L85.749 32H46.278A16 16 0 0 1 30.574 19.065L24.329 -12.935C22.402 -22.815 29.967 -32 40.034 -32H198.513A16 16 0 0 1 214.217 -19.065L220.462 12.935C222.389 22.815 214.824 32 204.758 32z" /> + <glyph glyph-name="key" + unicode="" + horiz-adv-x="512" d=" M512 271.999C512 174.797 433.202 96 336 96C324.78 96 313.81 97.062 303.173 99.069L279.161 72.055A23.999000000000002 23.999000000000002 0 0 0 261.223 64H224V24C224 10.745 213.255 0 200 0H160V-40C160 -53.255 149.255 -64 136 -64H24C10.745 -64 0 -53.255 0 -40V38.059C0 44.424 2.529 50.529 7.029 55.03L168.831 216.832C163.108 234.186 160 252.729 160 272C160 369.202 238.797 447.999 335.999 448C433.488 448.001 512 369.4890000000001 512 271.999zM336 320C336 293.49 357.49 272 384 272S432 293.49 432 320S410.51 368 384 368S336 346.51 336 320z" /> + <glyph glyph-name="keyboard" + unicode="" + horiz-adv-x="576" d=" M528 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H528C554.51 384 576 362.51 576 336V48C576 21.49 554.51 0 528 0zM128 268V308C128 314.627 122.627 320 116 320H76C69.373 320 64 314.627 64 308V268C64 261.373 69.373 256 76 256H116C122.627 256 128 261.373 128 268zM224 268V308C224 314.627 218.627 320 212 320H172C165.373 320 160 314.627 160 308V268C160 261.373 165.373 256 172 256H212C218.627 256 224 261.373 224 268zM320 268V308C320 314.627 314.627 320 308 320H268C261.373 320 256 314.627 256 308V268C256 261.373 261.373 256 268 256H308C314.627 256 320 261.373 320 268zM416 268V308C416 314.627 410.627 320 404 320H364C357.373 320 352 314.627 352 308V268C352 261.373 357.373 256 364 256H404C410.627 256 416 261.373 416 268zM512 268V308C512 314.627 506.627 320 500 320H460C453.373 320 448 314.627 448 308V268C448 261.373 453.373 256 460 256H500C506.627 256 512 261.373 512 268zM176 172V212C176 218.627 170.627 224 164 224H124C117.373 224 112 218.627 112 212V172C112 165.373 117.373 160 124 160H164C170.627 160 176 165.373 176 172zM272 172V212C272 218.627 266.627 224 260 224H220C213.373 224 208 218.627 208 212V172C208 165.373 213.373 160 220 160H260C266.627 160 272 165.373 272 172zM368 172V212C368 218.627 362.627 224 356 224H316C309.373 224 304 218.627 304 212V172C304 165.373 309.373 160 316 160H356C362.627 160 368 165.373 368 172zM464 172V212C464 218.627 458.627 224 452 224H412C405.373 224 400 218.627 400 212V172C400 165.373 405.373 160 412 160H452C458.627 160 464 165.373 464 172zM128 76V116C128 122.627 122.627 128 116 128H76C69.373 128 64 122.627 64 116V76C64 69.373 69.373 64 76 64H116C122.627 64 128 69.373 128 76zM416 76V116C416 122.627 410.627 128 404 128H172C165.373 128 160 122.627 160 116V76C160 69.373 165.373 64 172 64H404C410.627 64 416 69.373 416 76zM512 76V116C512 122.627 506.627 128 500 128H460C453.373 128 448 122.627 448 116V76C448 69.373 453.373 64 460 64H500C506.627 64 512 69.373 512 76z" /> + <glyph glyph-name="language" + unicode="" + horiz-adv-x="640" d=" M304 32H24C10.745 32 0 42.745 0 56V328C0 341.255 10.745 352 24 352H304V32zM183.324 104.622A12 12 0 0 1 194.839 96H217.702C225.922 96 231.709 104.078 229.064 111.861L171.61 280.915A12 12 0 0 1 160.248 289.054H127.759A12.001000000000001 12.001000000000001 0 0 1 116.397 280.915L58.942 111.861C56.297 104.078 62.084 96 70.304 96H93.109A12 12 0 0 1 104.644 104.693L113.762 136.5H173.973L183.324 104.622zM144.273 245.042S148.593 223.981 152.103 211.832L162.9030000000001 174.301H124.8330000000001L135.9030000000001 211.832C139.4130000000001 223.982 143.7330000000001 245.042 143.7330000000001 245.042H144.2730000000001zM616 32H336V352H616C629.255 352 640 341.255 640 328V56C640 42.745 629.255 32 616 32zM580 260H516V276C516 282.627 510.627 288 504 288H488C481.373 288 476 282.627 476 276V260H412C405.373 260 400 254.627 400 248V232C400 225.373 405.373 220 412 220H526.106C519.843 205.701 509.588 191.028 496.083 176.794C489.523 183.692 483.686 190.704 478.718 197.727C475.079 202.871 468.133 204.402 462.723 201.173L455.443 196.827L448.945 192.948C442.989 189.392 441.252 181.527 445.21 175.831C451.275 167.102 458.308 158.495 466.194 150.105C458.0719999999999 143.879 449.353 137.861 440.091 132.141C434.57 128.731 432.7099999999999 121.585 435.929 115.951L443.87 102.055C447.232 96.172 454.8049999999999 94.2289999999999 460.576 97.7789999999999C473.308 105.61 485.147 113.954 496.0189999999999 122.67C506.9359999999999 113.9089999999999 518.785 105.568 531.415 97.789C537.189 94.233 544.7679999999999 96.171 548.132 102.059L556.0759999999999 115.962C559.2889999999999 121.585 557.4459999999999 128.722 551.9409999999999 132.133A312.737 312.737 0 0 0 525.881 150.152C546.905 172.577 561.649 196.441 568.5939999999999 220.002H580C586.627 220.002 592 225.375 592 232.002V248.002C592 254.627 586.627 260 580 260z" /> + <glyph glyph-name="laptop" + unicode="" + horiz-adv-x="640" d=" M512 384V128H128V384H512M528 448H112C85.5 448 64 426.5 64 400V112C64 85.5 85.5 64 112 64H528C554.5 64 576 85.5 576 112V400C576 426.5 554.5 448 528 448zM628 32H389.5C386.5 32 384 29.9 383.6 26.9C381.2 11.7 368 0 352 0H288C272 0 258.8 11.7 256.4 26.9C255.9 29.8 253.4 32 250.5 32H12C5.4 32 0 26.6 0 20V-16C0 -42.5 21.5 -64 48 -64H592C618.5 -64 640 -42.5 640 -16V20C640 26.6 634.6 32 628 32z" /> + <glyph glyph-name="leaf" + unicode="" + horiz-adv-x="576" d=" M395.4 27.2C352 5.6 303.5 -7.2 254.6 -7.2C172.4 -7.2 103.5 32.9 103.5 32.9C87.4 32.9 68.1 -32 40.2 -32C13.2 -32 0 -8 0 6.5C0 39.6 63.6 65.4 63.6 83.8C63.6 83.8 51.1 105 51.1 143C51.1 244.2 132.4 316.4 223.7 346.3C289.6 367.9 429.7 342.8 474.4 384.8C492.1 401 500.8 416 527.8 416C564.0999999999999 416 576 322.8 576 295.7C576 184.8 521.5 89.2 395.4 27.2zM141.1 102.8C204.6 192.7 285.6 231.6 398.8 222.8C407.6 222.1 415.3 228.7 416 237.5C416.7 246.3 410.1 254 401.3 254.7C277.3 264.3 185.4 220.7999999999999 115 121.1999999999999C109.9 114 111.5999999999999 103.9999999999999 118.8 98.8999999999999C126 93.7999999999999 136 95.4999999999999 141.0999999999999 102.7999999999999z" /> + <glyph glyph-name="lemon" + unicode="" + horiz-adv-x="512" d=" M489.038 425.037C465.944 448.13 434.648 453.93 413.947 441.871C355.041 407.5590000000001 232.697 494.948 92.874 355.125S40.441 92.959 6.129 34.055C-5.93 13.353 -0.131 -17.944 22.962 -41.038C46.057 -64.133 77.354 -69.929 98.057 -57.87C156.958 -23.56 279.303 -110.9489999999999 419.125 28.873S471.56 291.04 505.871 349.944C517.93 370.646 512.132 401.943 489.038 425.0370000000001zM243.881 352.478C185.692 337.931 110.073 262.323 95.523 204.12C93.706 196.85 87.181 191.996 80.012 191.996C78.728 191.996 77.422 192.152 76.119 192.477C67.547 194.621 62.335 203.307 64.477 211.88C81.901 281.573 166.316 366.07 236.119 383.522C244.694 385.665 253.38 380.453 255.522 371.88S252.453 354.621 243.881 352.478z" /> + <glyph glyph-name="level-down-alt" + unicode="" + horiz-adv-x="320" d=" M313.553 55.669L209.587 -56.334C200.102 -66.548 183.911 -66.563 174.413 -56.334L70.438 55.669C56.232 70.969 67.062 96 88.025 96H152V368H68.024A11.996 11.996 0 0 0 59.539 371.515L3.539 427.515C-4.021 435.074 1.333 448 12.024 448H208C221.255 448 232 437.255 232 424V96H295.966C316.844 96 327.817 71.031 313.553 55.669z" /> + <glyph glyph-name="level-up-alt" + unicode="" + horiz-adv-x="320" d=" M313.553 328.331L209.587 440.334C200.102 450.548 183.911 450.563 174.413 440.334L70.438 328.331C56.232 313.031 67.062 288 88.025 288H152V16H68.024A11.996 11.996 0 0 1 59.539 12.485L3.539 -43.515C-4.021 -51.074 1.333 -64 12.024 -64H208C221.255 -64 232 -53.255 232 -40V288H295.966C316.844 288 327.817 312.969 313.553 328.331z" /> + <glyph glyph-name="life-ring" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM429.6960000000001 320.4410000000001L366.2970000000001 257.0420000000001C355.31 275.601 339.627 291.294 321.0420000000001 302.2970000000001L384.4410000000001 365.6960000000001A218.396 218.396 0 0 0 429.6960000000001 320.4410000000001zM256 96C202.981 96 160 138.981 160 192S202.981 288 256 288S352 245.019 352 192S309.019 96 256 96zM127.559 365.6960000000001L190.958 302.2970000000001C172.399 291.31 156.706 275.627 145.703 257.0420000000001L82.304 320.4410000000001A218.372 218.372 0 0 0 127.559 365.6960000000001zM82.304 63.559L145.703 126.958C156.69 108.399 172.373 92.706 190.958 81.703L127.559 18.304A218.396 218.396 0 0 0 82.304 63.559zM384.4410000000001 18.304L321.0420000000001 81.703C339.6010000000001 92.6900000000001 355.2940000000001 108.3730000000001 366.2970000000001 126.958L429.6960000000001 63.559A218.40299999999996 218.40299999999996 0 0 0 384.4410000000001 18.304z" /> + <glyph glyph-name="lightbulb" + unicode="" + horiz-adv-x="384" d=" M272 20V-8C272 -18.449 265.32 -27.334 256 -30.629V-40C256 -53.255 245.255 -64 232 -64H152C138.745 -64 128 -53.255 128 -40V-30.629C118.68 -27.334 112 -18.449 112 -8V20C112 26.627 117.373 32 124 32H260C266.627 32 272 26.627 272 20zM128.893 64C118.986 64 110.067 70.078 106.517 79.327C67.697 180.459 16 170.269 16 272C16 369.197 94.805 448 192 448S368 369.197 368 272C368 170.269 316.303 180.459 277.484 79.327C273.934 70.078 265.014 64 255.108 64H128.893zM112 272C112 316.112 147.888 352 192 352C200.837 352 208 359.164 208 368S200.837 384 192 384C130.243 384 80 333.757 80 272C80 263.164 87.164 256 96 256S112 263.164 112 272z" /> + <glyph glyph-name="link" + unicode="" + horiz-adv-x="512" d=" M326.612 262.6090000000001C386.3590000000001 202.8 385.5390000000001 106.911 326.9720000000001 48.019C326.862 47.899 326.7320000000001 47.769 326.612 47.649L259.4120000000001 -19.551C200.142 -78.821 103.713 -78.813 44.452 -19.551C-14.818 39.709 -14.818 136.149 44.452 195.409L81.558 232.515C91.398 242.355 108.344 235.8150000000001 108.852 221.909C109.5 204.187 112.678 186.382 118.542 169.1880000000001C120.528 163.3660000000001 119.109 156.9260000000001 114.759 152.576L101.672 139.489C73.646 111.463 72.767 65.8290000000001 100.517 37.5290000000001C128.541 8.95 174.603 8.78 202.842 37.0190000000001L270.0420000000001 104.2090000000001C298.233 132.4 298.115 177.9660000000001 270.0420000000001 206.0390000000001C266.341 209.733 262.6130000000001 212.603 259.701 214.608A16.037 16.037 0 0 0 252.754 227.2140000000001C252.3580000000001 237.7810000000001 256.1020000000001 248.67 264.452 257.0200000000001L285.506 278.0750000000001C291.027 283.596 299.688 284.2740000000001 306.09 279.8060000000001A152.482 152.482 0 0 0 326.612 262.6090000000001zM467.547 403.551C408.286 462.813 311.8570000000001 462.821 252.587 403.551L185.387 336.351C185.267 336.231 185.137 336.101 185.027 335.981C126.461 277.089 125.64 181.2 185.387 121.391A152.454 152.454 0 0 1 205.908 104.1949999999999C212.31 99.7269999999999 220.972 100.406 226.492 105.9259999999999L247.546 126.981C255.896 135.331 259.6400000000001 146.2199999999999 259.2440000000001 156.7869999999999A16.037 16.037 0 0 1 252.2970000000001 169.3929999999999C249.385 171.3979999999999 245.6570000000001 174.2679999999999 241.956 177.9619999999999C213.883 206.035 213.765 251.601 241.956 279.7919999999999L309.156 346.9819999999999C337.395 375.2209999999999 383.456 375.051 411.481 346.4719999999999C439.231 318.1719999999999 438.353 272.5379999999999 410.326 244.5119999999999L397.2390000000001 231.425C392.889 227.075 391.4700000000001 220.6349999999999 393.456 214.8129999999999C399.32 197.619 402.498 179.8139999999999 403.146 162.0919999999999C403.6550000000001 148.1859999999999 420.6 141.6459999999999 430.44 151.4859999999999L467.546 188.5919999999999C526.817 247.851 526.817 344.291 467.547 403.551z" /> + <glyph glyph-name="lira-sign" + unicode="" + horiz-adv-x="384" d=" M371.9940000000001 192H323.975C317.64 192 312 187.088 312 180.754C312 80 230.179 32 144 32V191.219L278.603 221.131A12 12 0 0 1 288 232.845V273.8210000000001C288 281.498 280.891 287.201 273.397 285.535L144 256.781V287.2200000000001L278.603 317.132A12 12 0 0 1 288 328.846V369.8210000000001C288 377.498 280.891 383.201 273.397 381.535L144 352.781V404C144 410.627 138.627 416 132 416H76C69.373 416 64 410.627 64 404V335.003L9.397 322.8690000000001A12 12 0 0 1 0 311.155V270.179C0 262.502 7.109 256.799 14.603 258.4650000000001L64 269.442V239.003L9.397 226.869A12 12 0 0 1 0 215.155V174.179C0 166.502 7.109 160.799 14.603 162.465L64 173.442V-20C64 -26.627 69.373 -32 76 -32H155.583C289.674 -32 378.838 45.834 383.991 179.592C384.252 186.374 378.78 192 371.994 192z" /> + <glyph glyph-name="list-alt" + unicode="" + horiz-adv-x="512" d=" M464 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H464C490.51 416 512 394.51 512 368V16C512 -10.51 490.51 -32 464 -32zM128 328C105.909 328 88 310.091 88 288S105.909 248 128 248S168 265.909 168 288S150.091 328 128 328zM128 232C105.909 232 88 214.091 88 192S105.909 152 128 152S168 169.909 168 192S150.091 232 128 232zM128 136C105.909 136 88 118.091 88 96S105.909 56 128 56S168 73.909 168 96S150.091 136 128 136zM416 272V304C416 310.627 410.627 316 404 316H204C197.373 316 192 310.627 192 304V272C192 265.373 197.373 260 204 260H404C410.627 260 416 265.373 416 272zM416 176V208C416 214.627 410.627 220 404 220H204C197.373 220 192 214.627 192 208V176C192 169.373 197.373 164 204 164H404C410.627 164 416 169.373 416 176zM416 80V112C416 118.627 410.627 124 404 124H204C197.373 124 192 118.627 192 112V80C192 73.373 197.373 68 204 68H404C410.627 68 416 73.373 416 80z" /> + <glyph glyph-name="list-ol" + unicode="" + horiz-adv-x="512" d=" M3.263 308.473C3.263 315.9500000000001 7.18 320.045 14.836 320.045H29.967V359.9220000000001C29.967 365.085 30.501 370.425 30.501 370.425H30.145S28.366 367.755 27.297 366.687C22.846 362.414 16.793 362.236 11.631 367.755L6.113 373.986C0.771 379.327 1.129 385.202 6.647 390.365L28.367 410.303C32.815 414.398 36.732 416 42.785 416H54.89C62.546 416 66.639 412.084 66.639 404.428V320.044H82.127C89.782 320.044 93.699 315.95 93.699 308.472V299.5710000000001C93.699 292.094 89.782 287.999 82.127 287.999H14.836C7.18 287.999 3.263 292.094 3.263 299.5710000000001V308.473zM2.211 143.409C2.211 190.687 53.166 199.792 53.166 212.574C53.166 219.754 47.212 221.329 43.886 221.329C40.733 221.329 37.407 220.278 34.431 217.477C29.352 212.574 23.924 210.473 18.32 215.026L9.741 221.855C3.962 226.408 2.561 231.6600000000001 6.938 237.264C13.592 246.019 26.025 256 47.387 256C66.824 256 91.863 245.494 91.863 216.427C91.863 178.08 45.11 170.025 43.184 159.518H82.233C89.762 159.518 93.79 155.491 93.79 148.136V139.381C93.79 132.027 89.762 127.999 82.233 127.999H14.293C7.288 127.999 2.21 132.027 2.21 139.381V143.409zM5.654 -6.61L11.257 2.67C15.11 9.324 20.362 9.674 26.841 5.8219999999999C31.744 3.7209999999999 36.471 2.67 41.2 2.67C51.355 2.67 55.558 6.172 55.558 10.9C55.558 17.554 49.954 20.006 39.624 20.006H34.896C28.942 20.006 25.616 22.107 22.638 27.886L21.588 29.812C19.137 34.54 20.362 39.6179999999999 24.389 44.696L29.993 51.7C36.822 60.105 42.25 65.183 42.25 65.183V65.533S38.047 64.482 29.642 64.482H16.685C9.155 64.482 5.302 68.5100000000001 5.302 75.864V84.619C5.302 92.149 9.155 96.001 16.685 96.001H75.169C82.698 96.001 86.551 91.9740000000001 86.551 84.619V81.292C86.551 75.514 85.15 71.4860000000001 81.472 67.109L63.963 46.972C83.574 41.8940000000001 92.679 26.485 92.679 12.1270000000001C92.679 -9.2359999999999 78.321 -31.9989999999999 44.176 -31.9989999999999C27.54 -31.9989999999999 15.984 -27.2709999999999 8.28 -22.5439999999999C2.501 -18.3419999999999 1.976 -12.7389999999999 5.654 -6.6099999999999zM144 316H496C504.837 316 512 323.163 512 332V372C512 380.837 504.837 388 496 388H144C135.163 388 128 380.837 128 372V332C128 323.163 135.163 316 144 316zM144 156H496C504.837 156 512 163.163 512 172V212C512 220.837 504.837 228 496 228H144C135.163 228 128 220.837 128 212V172C128 163.163 135.163 156 144 156zM144 -4H496C504.837 -4 512 3.163 512 12V52C512 60.837 504.837 68 496 68H144C135.163 68 128 60.837 128 52V12C128 3.163 135.163 -4 144 -4z" /> + <glyph glyph-name="list-ul" + unicode="" + horiz-adv-x="512" d=" M96 352C96 325.49 74.51 304 48 304S0 325.49 0 352S21.49 400 48 400S96 378.51 96 352zM48 240C21.49 240 0 218.51 0 192S21.49 144 48 144S96 165.49 96 192S74.51 240 48 240zM48 80C21.49 80 0 58.51 0 32S21.49 -16 48 -16S96 5.49 96 32S74.51 80 48 80zM144 316H496C504.837 316 512 323.163 512 332V372C512 380.837 504.837 388 496 388H144C135.163 388 128 380.837 128 372V332C128 323.163 135.163 316 144 316zM144 156H496C504.837 156 512 163.163 512 172V212C512 220.837 504.837 228 496 228H144C135.163 228 128 220.837 128 212V172C128 163.163 135.163 156 144 156zM144 -4H496C504.837 -4 512 3.163 512 12V52C512 60.837 504.837 68 496 68H144C135.163 68 128 60.837 128 52V12C128 3.163 135.163 -4 144 -4z" /> + <glyph glyph-name="list" + unicode="" + horiz-adv-x="512" d=" M128 332V372C128 380.837 135.163 388 144 388H496C504.837 388 512 380.837 512 372V332C512 323.163 504.837 316 496 316H144C135.163 316 128 323.163 128 332zM144 156H496C504.837 156 512 163.163 512 172V212C512 220.837 504.837 228 496 228H144C135.163 228 128 220.837 128 212V172C128 163.163 135.163 156 144 156zM144 -4H496C504.837 -4 512 3.163 512 12V52C512 60.837 504.837 68 496 68H144C135.163 68 128 60.837 128 52V12C128 3.163 135.163 -4 144 -4zM16 304H80C88.837 304 96 311.163 96 320V384C96 392.837 88.837 400 80 400H16C7.163 400 0 392.837 0 384V320C0 311.163 7.163 304 16 304zM16 144H80C88.837 144 96 151.163 96 160V224C96 232.837 88.837 240 80 240H16C7.163 240 0 232.837 0 224V160C0 151.163 7.163 144 16 144zM16 -16H80C88.837 -16 96 -8.837 96 0V64C96 72.837 88.837 80 80 80H16C7.163 80 0 72.837 0 64V0C0 -8.837 7.163 -16 16 -16z" /> + <glyph glyph-name="location-arrow" + unicode="" + horiz-adv-x="512" d=" M443.683 443.471L27.818 251.582C-18.702 230.111 -3.39 160 47.933 160H224V-15.993C224 -67.72 294.161 -82.519 315.582 -36.108L507.38 379.775C526.285 420.736 483.628 461.908 443.683 443.471z" /> + <glyph glyph-name="lock-open" + unicode="" + horiz-adv-x="576" d=" M423.5 448C339.5 447.7 272 378.5 272 294.5V224H48C21.5 224 0 202.5 0 176V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V176C448 202.5 426.5 224 400 224H352V295.1C352 334.7 383.7 367.6 423.3 368C463.3 368.4 496 335.9 496 296V216C496 202.7 506.7 192 520 192H552C565.3 192 576 202.7 576 216V296C576 380 507.5 448.3 423.5 448z" /> + <glyph glyph-name="lock" + unicode="" + horiz-adv-x="448" d=" M400 224H376V296C376 379.8 307.8 448 224 448S72 379.8 72 296V224H48C21.5 224 0 202.5 0 176V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V176C448 202.5 426.5 224 400 224zM296 224H152V296C152 335.7 184.3 368 224 368S296 335.7 296 296V224z" /> + <glyph glyph-name="long-arrow-alt-down" + unicode="" + horiz-adv-x="256" d=" M168 102.059V404C168 410.627 162.627 416 156 416H100C93.373 416 88 410.627 88 404V102.059H41.941C20.559 102.059 9.851 76.208 24.97 61.088L111.029 -24.971C120.402 -34.344 135.598 -34.344 144.97 -24.971L231.029 61.088C246.148 76.207 235.44 102.059 214.058 102.059H168z" /> + <glyph glyph-name="long-arrow-alt-left" + unicode="" + horiz-adv-x="448" d=" M134.059 152H436C442.627 152 448 157.373 448 164V220C448 226.627 442.627 232 436 232H134.059V278.059C134.059 299.4410000000001 108.208 310.149 93.088 295.03L7.029 208.971C-2.344 199.598 -2.344 184.402 7.029 175.03L93.088 88.971C108.207 73.852 134.059 84.56 134.059 105.942V152z" /> + <glyph glyph-name="long-arrow-alt-right" + unicode="" + horiz-adv-x="448" d=" M313.941 232H12C5.373 232 0 226.627 0 220V164C0 157.373 5.373 152 12 152H313.941V105.941C313.941 84.559 339.792 73.851 354.912 88.97L440.971 175.029C450.344 184.402 450.344 199.598 440.971 208.97L354.9120000000001 295.029C339.793 310.148 313.9410000000001 299.44 313.9410000000001 278.058V232z" /> + <glyph glyph-name="long-arrow-alt-up" + unicode="" + horiz-adv-x="256" d=" M88 281.9410000000001V-20C88 -26.627 93.373 -32 100 -32H156C162.627 -32 168 -26.627 168 -20V281.9410000000001H214.059C235.441 281.9410000000001 246.149 307.7920000000001 231.03 322.9120000000001L144.971 408.971C135.598 418.344 120.402 418.344 111.03 408.971L24.971 322.9120000000001C9.852 307.793 20.56 281.9410000000001 41.942 281.9410000000001H88z" /> + <glyph glyph-name="low-vision" + unicode="" + horiz-adv-x="576" d=" M569.344 216.369C512.96 312.051 407.81 376 288 376C259.532 376 231.898 372.381 205.549 365.591L152.778 437.76C145.177 448.618 130.214 451.26 119.355 443.6600000000001L106.241 434.482C95.381 426.881 92.739 411.916 100.341 401.056L143.472 342.661C89.449 316.27 40.228 273.317 6.682 216.419C6.672 216.402 6.659 216.386 6.648 216.369C-2.117 201.494 -2.316 182.841 6.648 167.63C45.148 102.298 106.39 51.768 179.507 26.281L55.316 203.698A272.194 272.194 0 0 0 83.61 239.61L203.01 69.03H203.02L243.65 10.99A330.055 330.055 0 0 1 322.59 9.8199999999999L132.61 281.2199999999999A277.628 277.628 0 0 0 171.387 302.7829999999999L423.223 -53.7610000000001C430.824 -64.619 445.7870000000001 -67.2600000000001 456.646 -59.6610000000001L469.76 -50.4830000000001C480.62 -42.8820000000001 483.262 -27.9160000000001 475.66 -17.0570000000001L432.54 41.3199999999999L432.533 41.329C489.694 69.307 537.3679999999999 113.369 569.343 167.63A47.937999999999995 47.937999999999995 0 0 1 569.3439999999999 216.369zM390.026 102.06L370.9600000000001 129.29C395.6420000000001 161.857 398.6710000000001 205.643 379.7600000000001 240.9700000000001V240.9400000000001C379.7600000000001 217.29 360.5900000000001 198.12 336.9400000000001 198.12C313.1120000000001 198.12 294.1200000000001 217.469 294.1200000000001 240.9400000000001C294.1200000000001 264.5900000000001 313.2900000000001 283.76 336.9400000000001 283.76H336.9700000000001C312.2200000000001 297.009 283.4480000000001 299.403 257.4600000000001 291.4400000000001L238.392 318.677C253.758 324.694 270.488 328 288 328C363.1620000000001 328 424 267.174 424 192C424 157.496 411.167 126.025 390.026 102.06z" /> + <glyph glyph-name="magic" + unicode="" + horiz-adv-x="512" d=" M101.1 -57L7 37.1C-2.4 46.5 -2.4 61.7000000000001 7 71L377 441C386.4 450.4 401.6 450.4 410.9 441L505 346.9C514.4 337.5 514.4 322.3 505 313L135 -57C125.7 -66.2999999999999 110.5 -66.2999999999999 101.1 -57zM304 288.8L352.8 240L442.7000000000001 329.9L393.9000000000001 378.7L304 288.8zM138.9 408.7L127.2 384.9L101 381.1C96.3 380.4 94.4 374.6 97.8 371.3L116.8 352.8L112.3 326.7000000000001C111.5 322 116.4 318.4 120.6 320.6L144 333L167.4 320.7C171.6 318.5 176.5 322.1 175.7 326.8L171.2 352.9L190.2 371.4C193.6 374.7 191.7 380.5 187 381.2L160.8 385L149.1 408.8C147.1 412.9 141 412.9 138.9 408.7zM236.6 429.4L228.8 413.6L211.3 411C208.2 410.5 206.9 406.7 209.2 404.5L221.8 392.2L218.8 374.8C218.3 371.7000000000001 221.6 369.3 224.4 370.8L240 379L255.6 370.8C258.4 369.3 261.7 371.7 261.2 374.8L258.2 392.2L270.8 404.5C273.1 406.7 271.8 410.6 268.7 411L251.2 413.5L243.4 429.3C242 432.3 238 432.3 236.6 429.4zM44.6 429.4L36.8 413.6L19.3 411C16.2 410.5 14.9 406.7 17.2 404.5L29.8 392.2L26.8 374.8C26.3 371.7000000000001 29.6 369.3 32.4 370.8L48 379L63.6 370.8C66.4 369.3 69.7 371.7 69.2 374.8L66.2 392.2L78.8 404.5C81.1 406.7 79.8 410.6 76.7 411L59.2 413.5L51.4 429.3C50 432.3 46 432.3 44.6 429.4zM460.6 205.9L452.8 190.1L435.3 187.6C432.2 187.1 430.9000000000001 183.3 433.2 181.1L445.8 168.8L442.8 151.4C442.3 148.3 445.6 145.9 448.4000000000001 147.4L464.0000000000001 155.6L479.6000000000001 147.4C482.4000000000001 145.9 485.7000000000001 148.3 485.2000000000001 151.4L482.2000000000001 168.8L494.8000000000001 181.1C497.1000000000001 183.3 495.8000000000001 187.2000000000001 492.7000000000001 187.6L475.2000000000001 190.1L467.4000000000001 205.9C466.0000000000001 208.7000000000001 462.0000000000001 208.7000000000001 460.6000000000001 205.9z" /> + <glyph glyph-name="magnet" + unicode="" + horiz-adv-x="512.1" d=" M164.1 288H12C5.4 288 0 293.4 0 300V380C0 399.9 16.1 416 36 416H140C159.9 416 176 399.9 176 380V300C176.1 293.4 170.7 288 164.1 288zM512.1 300V380.1C512.1 400 496 416.1 476.1 416.1H372.1C352.2000000000001 416.1 336.1 400 336.1 380.1V300.1C336.1 293.5 341.5 288.1 348.1 288.1H500.1C506.7 288 512.1 293.4 512.1 300zM348.1 256C341.5 256 336.1 250.6 336.1 244V192C336.1 63.9 176.1 64.1 176.1 192V244C176.1 250.6 170.7 256 164.1 256H12.1C5.4 256 0.1 250.6 0.1 243.9C0.2 222.5 0.7 203.6 0.1 190.6C0.1 40 136.3 -56 256.9 -56C377.5 -56 512 40 512 190.7C511.4 203.5 511.8 223.7 512 243.9C512 250.6 506.7 256 500 256H348.1z" /> + <glyph glyph-name="male" + unicode="" + horiz-adv-x="192" d=" M96 448C131.346 448 160 419.346 160 384S131.346 320 96 320S32 348.654 32 384S60.654 448 96 448M144 304H132.64C109.929 293.557 83.05 293.106 59.36 304H48C21.49 304 0 282.51 0 256V120C0 106.745 10.745 96 24 96H40V-40C40 -53.255 50.745 -64 64 -64H128C141.255 -64 152 -53.255 152 -40V96H168C181.255 96 192 106.745 192 120V256C192 282.51 170.51 304 144 304z" /> + <glyph glyph-name="map-marker-alt" + unicode="" + horiz-adv-x="384" d=" M172.268 -53.67C26.97 156.969 0 178.587 0 256C0 362.039 85.961 448 192 448S384 362.039 384 256C384 178.587 357.03 156.969 211.732 -53.67C202.197 -67.444 181.802 -67.443 172.268 -53.67zM192 176C236.183 176 272 211.817 272 256S236.183 336 192 336S112 300.183 112 256S147.817 176 192 176z" /> + <glyph glyph-name="map-marker" + unicode="" + horiz-adv-x="384" d=" M172.268 -53.67C26.97 156.969 0 178.587 0 256C0 362.039 85.961 448 192 448S384 362.039 384 256C384 178.587 357.03 156.969 211.732 -53.67C202.197 -67.444 181.802 -67.443 172.268 -53.67z" /> + <glyph glyph-name="map-pin" + unicode="" + horiz-adv-x="320" d=" M192 147.187V-25.633L169.985 -58.656C165.235 -65.7809999999999 154.766 -65.7809999999999 150.016 -58.656L128 -25.633V147.187A162.221 162.221 0 0 1 192 147.187zM160 448C239.529 448 304 383.529 304 304S239.529 160 160 160S16 224.471 16 304S80.471 448 160 448M80 312C80 351.701 112.299 384 152 384A8 8 0 0 1 152 400C103.477 400 64 360.523 64 312A8 8 0 0 1 80 312z" /> + <glyph glyph-name="map-signs" + unicode="" + horiz-adv-x="512" d=" M487.515 343.515L439.03 295.03A23.998000000000005 23.998000000000005 0 0 0 422.06 288.001H56C42.745 288.001 32 298.746 32 312.001V392C32 405.255 42.745 416 56 416H216V424C216 437.255 226.745 448 240 448H272C285.255 448 296 437.255 296 424V416H422.059A24 24 0 0 0 439.029 408.971L487.514 360.486C492.201 355.799 492.201 348.201 487.515 343.515zM216 80V-40C216 -53.255 226.745 -64 240 -64H272C285.255 -64 296 -53.255 296 -40V80H216zM456 224H296V272H216V224H89.941A24 24 0 0 1 72.971 216.971L24.486 168.486C19.8 163.8 19.8 156.202 24.486 151.515L72.971 103.03A23.998000000000005 23.998000000000005 0 0 1 89.941 96.001H456C469.255 96.001 480 106.746 480 120.001V200.001C480 213.255 469.255 224 456 224z" /> + <glyph glyph-name="map" + unicode="" + horiz-adv-x="576" d=" M576 391.985V56.015A23.998000000000005 23.998000000000005 0 0 0 562.733 34.549L434.733 -29.451C418.948 -37.344 400 -25.992 400 -7.985V327.985A23.998000000000005 23.998000000000005 0 0 0 413.267 349.451L541.267 413.451C557.052 421.344 576 409.992 576 391.985zM369.747 349.915L225.747 413.915C209.996 420.915 192 409.454 192 391.983V56.016A24 24 0 0 1 206.253 34.085L350.253 -29.915C366.004 -36.915 384 -25.4539999999999 384 -7.984V327.983A24 24 0 0 1 369.747 349.915zM141.267 413.451L13.267 349.466A23.998000000000005 23.998000000000005 0 0 1 0 328V-7.985C0 -25.992 18.948 -37.344 34.733 -29.451L162.733 34.534A23.998000000000005 23.998000000000005 0 0 1 176 56V391.985C176 409.992 157.052 421.344 141.267 413.451z" /> + <glyph glyph-name="mars-double" + unicode="" + horiz-adv-x="512" d=" M340 448H261C250.3 448 245 435.1 252.5 427.5L269.4 410.6L220.7 361.9C198.5 375.9 172.2 384 144 384C64.5 384 0 319.5 0 240S64.5 96 144 96S288 160.5 288 240C288 268.2 279.9 294.5 265.9 316.7L314.6 365.4L331.5 348.5C333.8999999999999 346.1 337 345 339.8999999999999 345C346.0999999999999 345 352 349.8 352 357V436C352 442.6 346.6 448 340 448zM144 160C99.9 160 64 195.9 64 240S99.9 320 144 320S224 284.1 224 240S188.1 160 144 160zM500 288.1H421C410.3 288.1 405 275.2 412.5 267.6L429.4 250.7L380.7 202C362.5 213.4 341.7 220.9 319.2 223.3C317.1 201.5 311 180 300.8 160C301.9000000000001 160 303 160.1 304 160.1C348.1 160.1 384 124.2000000000001 384 80.1S348.1 0.1 304 0.1S224 36 224 80.1C224 81.2000000000001 224 82.3 224.1 83.3C204.1 73.1 182.6 66.9 160.8 64.9C168.4 -7.6 229.6 -64 304 -64C383.5 -64 448 0.5 448 80C448 108.2 439.9 134.5 425.9 156.7L474.6 205.4L491.4999999999999 188.5C493.8999999999999 186.1 496.8999999999999 185 499.8999999999999 185C506.0999999999999 185 511.9999999999999 189.8 511.9999999999999 197V276C511.9999999999999 282.7 506.6 288.1 499.9999999999999 288.1z" /> + <glyph glyph-name="mars-stroke-h" + unicode="" + horiz-adv-x="480" d=" M476.2 200.5L420.3 256.4C412.7 264 399.8 258.6 399.8 247.9V224H376V244C376 250.6 370.6 256 364 256H324C317.4 256 312 250.6 312 244V224H284.4C278.6 249.6 265.7 273.9 245.8 293.8C189.6 350 98.4 350 42.2 293.8C-14 237.6 -14 146.4 42.2 90.2000000000001C98.4 34.0000000000001 189.6 34.0000000000001 245.8 90.2000000000001C265.7 110.1 278.6 134.4 284.4000000000001 160.0000000000001H312V140.0000000000001C312 133.4 317.4 128.0000000000001 324 128.0000000000001H364C370.6 128.0000000000001 376 133.4 376 140.0000000000001V160.0000000000001H399.9V136.1000000000001C399.9 125.4000000000001 412.8 120.1000000000001 420.4 127.6000000000001L476.3 183.5000000000001C480.9 188.2000000000001 480.9 195.8000000000001 476.1999999999999 200.5000000000001zM200.6 135.4C169.4 104.2 118.7 104.2 87.5 135.4C56.3 166.6 56.3 217.3 87.5 248.5C118.7 279.7 169.4 279.7 200.6 248.5C231.8 217.4 231.8 166.6 200.6 135.4z" /> + <glyph glyph-name="mars-stroke-v" + unicode="" + horiz-adv-x="288" d=" M245.8 213.8C225.9 233.7 201.6 246.6 176 252.4V277.8H196C202.6 277.8 208 283.2000000000001 208 289.8V329.8C208 336.4 202.6 341.8 196 341.8H176V366.6H199.9C210.6 366.6 215.9 379.5 208.4 387.1L152.5 442.9C147.8 447.6 140.2 447.6 135.5 442.9L79.6 387C72 379.4 77.4 366.5 88.1 366.5H112V341.8H92C85.4 341.8 80 336.4 80 329.8V289.8C80 283.2000000000001 85.4 277.8 92 277.8H112V252.4C86.4 246.6 62.1 233.7 42.2 213.8C-14 157.6 -14 66.4 42.2 10.2C98.4 -45.9999999999999 189.6 -45.9999999999999 245.8 10.2C302.1 66.4 302.1 157.6 245.8 213.8000000000001zM200.6 55.4C169.4 24.2 118.7 24.2 87.5 55.4C56.3 86.6 56.3 137.3 87.5 168.5C118.7 199.7 169.4 199.7 200.6 168.5C231.8 137.4 231.8 86.6 200.6 55.4z" /> + <glyph glyph-name="mars-stroke" + unicode="" + horiz-adv-x="384" d=" M372 384H293C282.3 384 277 371.1 284.5 363.5L301.4 346.6L283.9 329.1L269.8 343.2C265.1 347.9 257.5 347.9 252.8 343.2L224.5 315C219.8 310.3 219.8 302.7 224.5 298L238.6 283.9L220.6 265.9C198.4 279.9 172.1 288 143.9 288C64.5 288 0 223.5 0 144S64.5 0 144 0S288 64.5 288 144C288 172.2 279.9 198.5 265.9 220.7L283.9 238.7L298 224.6C302.7 219.9 310.3 219.9 315 224.6L343.3 252.9C348 257.6 348 265.2000000000001 343.3 269.9L329.2 284L346.7 301.5L363.6 284.6C371.2 277 384.1 282.4 384.1 293.1V372C384 378.6 378.6 384 372 384zM144 64C99.9 64 64 99.9 64 144S99.9 224 144 224S224 188.1 224 144S188.1 64 144 64z" /> + <glyph glyph-name="mars" + unicode="" + horiz-adv-x="384" d=" M372 384H293C282.3 384 277 371.1 284.5 363.5L301.4 346.6L220.7 265.9C198.5 279.9 172.2 288 144 288C64.5 288 0 223.5 0 144S64.5 0 144 0S288 64.5 288 144C288 172.2 279.9 198.5 265.9 220.7L346.6 301.4L363.5 284.5C371.1 276.9 384 282.3 384 293V372C384 378.6 378.6 384 372 384zM144 64C99.9 64 64 99.9 64 144S99.9 224 144 224S224 188.1 224 144S188.1 64 144 64z" /> + <glyph glyph-name="medkit" + unicode="" + horiz-adv-x="512" d=" M96 -32H416V320H384V368C384 394.51 362.51 416 336 416H176C149.49 416 128 394.51 128 368V320H96V-32zM192 352H320V320H192V352zM512 272V16C512 -10.51 490.51 -32 464 -32H448V320H464C490.51 320 512 298.51 512 272zM64 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V-32zM352 176V144C352 135.163 344.837 128 336 128H288V80C288 71.163 280.837 64 272 64H240C231.163 64 224 71.163 224 80V128H176C167.163 128 160 135.163 160 144V176C160 184.837 167.163 192 176 192H224V240C224 248.837 231.163 256 240 256H272C280.837 256 288 248.837 288 240V192H336C344.837 192 352 184.837 352 176z" /> + <glyph glyph-name="meh" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM108 256C108 218.503 138.503 188 176 188S244 218.503 244 256S213.497 324 176 324S108 293.497 108 256zM268.5 256C268.5 218.779 298.779 188.5 336 188.5S403.5 218.779 403.5 256S373.221 323.5 336 323.5S268.5 293.221 268.5 256zM336 304A47.789 47.789 0 0 1 313.397 298.353H313.412C324.328 298.353 333.177 289.504 333.177 278.588S324.328 258.8230000000001 313.412 258.8230000000001S293.647 267.6720000000001 293.647 278.588V278.603A47.789 47.789 0 0 1 288 256C288 229.49 309.49 208 336 208S384 229.49 384 256S362.51 304 336 304zM176 304A47.789 47.789 0 0 1 153.397 298.353H153.412C164.328 298.353 173.177 289.504 173.177 278.588S164.328 258.8230000000001 153.412 258.8230000000001S133.647 267.6720000000001 133.647 278.588V278.603A47.789 47.789 0 0 1 128 256C128 229.49 149.49 208 176 208S224 229.49 224 256S202.51 304 176 304zM336 96H176C154.822 96 154.831 64 176 64H336C357.178 64 357.169 96 336 96z" /> + <glyph glyph-name="mercury" + unicode="" + horiz-adv-x="288" d=" M288 240C288 284.2 268.1 323.7 236.8 350.1C239.3 351.9 241.7 353.9 244 355.9C268.7 377.1 283.8 404.7 287.2 434.7C288.1 441.8 282.5 448 275.3 448H234.8C229 448 224.1 443.9 223 438.2C220.6 425.7 213.4 413.9 202.3 404.4C187 391.2 166.3 384 144 384S101 391.2 85.6 404.4C74.5 413.9 67.4 425.7 64.9 438.2C63.8 443.9 58.9 448 53.2 448H12.7C5.5 448 -0.1 441.8 0.8 434.7C4.2 404.6 19.2 377 44 355.8C46.3 353.8 48.7 351.9 51.2 350C19.9 323.7 0 284.2 0 240C0 171.5 47.9 114.1 112 99.6V48H76C69.4 48 64 42.6 64 36V-4C64 -10.6 69.4 -16 76 -16H112V-52C112 -58.6 117.4 -64 124 -64H164C170.6 -64 176 -58.6 176 -52V-16H212C218.6 -16 224 -10.6 224 -4V36C224 42.6 218.6 48 212 48H176V99.6C240.1 114.1 288 171.5 288 240.0000000000001zM64 240C64 284.1 99.9 320 144 320S224 284.1 224 240S188.1 160 144 160S64 195.9 64 240z" /> + <glyph glyph-name="microchip" + unicode="" + horiz-adv-x="512" d=" M416 400V-16C416 -42.51 394.51 -64 368 -64H144C117.49 -64 96 -42.51 96 -16V400C96 426.51 117.49 448 144 448H368C394.51 448 416 426.51 416 400zM512 342V330A6 6 0 0 0 506 324H488V318A6 6 0 0 0 482 312H440V360H482A6 6 0 0 0 488 354V348H506A6 6 0 0 0 512 342zM512 246V234A6 6 0 0 0 506 228H488V222A6 6 0 0 0 482 216H440V264H482A6 6 0 0 0 488 258V252H506A6 6 0 0 0 512 246zM512 150V138A6 6 0 0 0 506 132H488V126A6 6 0 0 0 482 120H440V168H482A6 6 0 0 0 488 162V156H506A6 6 0 0 0 512 150zM512 54V42A6 6 0 0 0 506 36H488V30A6 6 0 0 0 482 24H440V72H482A6 6 0 0 0 488 66V60H506A6 6 0 0 0 512 54zM30 72H72V24H30A6 6 0 0 0 24 30V36H6A6 6 0 0 0 0 42V54A6 6 0 0 0 6 60H24V66A6 6 0 0 0 30 72zM30 168H72V120H30A6 6 0 0 0 24 126V132H6A6 6 0 0 0 0 138V150A6 6 0 0 0 6 156H24V162A6 6 0 0 0 30 168zM30 264H72V216H30A6 6 0 0 0 24 222V228H6A6 6 0 0 0 0 234V246A6 6 0 0 0 6 252H24V258A6 6 0 0 0 30 264zM30 360H72V312H30A6 6 0 0 0 24 318V324H6A6 6 0 0 0 0 330V342A6 6 0 0 0 6 348H24V354A6 6 0 0 0 30 360z" /> + <glyph glyph-name="microphone-slash" + unicode="" + horiz-adv-x="512" d=" M421.45 162.805L376 208.254V236C376 242.627 381.373 248 388 248H412C418.627 248 424 242.627 424 236V192C424 182.043 423.1190000000001 172.29 421.45 162.805zM352 352C352 405.019 309.019 448 256 448C223.426 448 194.646 431.773 177.29 406.9650000000001L352 232.254V352zM504.971 -11.716L52.284 440.971C42.911 450.344 27.715 450.344 18.343 440.971L7.029 429.657C-2.343 420.284 -2.343 405.089 7.029 395.716L160 242.746V193.169C160 140.0800000000001 203.436 95.717 256.524 96.002C271.15 96.08 284.995 99.442 297.378 105.368L315.124 87.622C297.595 77.651 277.33 71.956 255.752 72C189.355 72.136 136 126.947 136 193.344V236C136 242.627 130.627 248 124 248H100C93.373 248 88 242.627 88 236V192C88 107.512 150.693 37.403 232 25.722V-20H164C157.373 -20 152 -25.373 152 -32V-52C152 -58.627 157.373 -64 164 -64H348C354.627 -64 360 -58.627 360 -52V-32C360 -25.373 354.627 -20 348 -20H280V25.722C305.625 29.404 329.396 38.894 349.942 52.805L459.717 -56.97C469.09 -66.3430000000001 484.286 -66.3430000000001 493.658 -56.97L504.971 -45.657C514.343 -36.284 514.343 -21.0890000000001 504.971 -11.716z" /> + <glyph glyph-name="microphone" + unicode="" + horiz-adv-x="384" d=" M96 192V352C96 405.019 138.981 448 192 448S288 405.019 288 352V192C288 138.981 245.019 96 192 96S96 138.981 96 192zM348 248H324C317.373 248 312 242.627 312 236V193.32C312 127.103 258.918 72.382 192.702 72.002C126.213 71.62 72 125.598 72 192V236C72 242.627 66.627 248 60 248H36C29.373 248 24 242.627 24 236V192C24 107.512 86.693 37.403 168 25.722V-20H100C93.373 -20 88 -25.373 88 -32V-52C88 -58.627 93.373 -64 100 -64H284C290.627 -64 296 -58.627 296 -52V-32C296 -25.373 290.627 -20 284 -20H216V25.722C297.307 37.403 360 107.512 360 192V236C360 242.627 354.627 248 348 248z" /> + <glyph glyph-name="minus-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM124 152C117.4 152 112 157.4 112 164V220C112 226.6 117.4 232 124 232H388C394.6 232 400 226.6 400 220V164C400 157.4 394.6 152 388 152H124z" /> + <glyph glyph-name="minus-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM92 152C85.4 152 80 157.4 80 164V220C80 226.6 85.4 232 92 232H356C362.6 232 368 226.6 368 220V164C368 157.4 362.6 152 356 152H92z" /> + <glyph glyph-name="minus" + unicode="" + horiz-adv-x="448" d=" M424 129.8C437.3 129.8 448 140.5 448 153.8V230.2C448 243.5000000000001 437.3 254.2 424 254.2H24C10.7 254.2 0 243.5000000000001 0 230.2V153.8C0 140.5 10.7 129.8 24 129.8H424z" /> + <glyph glyph-name="mobile-alt" + unicode="" + horiz-adv-x="320" d=" M272 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H272C298.5 -64 320 -42.5 320 -16V400C320 426.5 298.5 448 272 448zM160 -32C142.3 -32 128 -17.7 128 0S142.3 32 160 32S192 17.7 192 0S177.7 -32 160 -32zM272 76C272 69.4 266.6 64 260 64H60C53.4 64 48 69.4 48 76V388C48 394.6 53.4 400 60 400H260C266.6 400 272 394.6 272 388V76z" /> + <glyph glyph-name="mobile" + unicode="" + horiz-adv-x="320" d=" M272 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H272C298.5 -64 320 -42.5 320 -16V400C320 426.5 298.5 448 272 448zM160 -32C142.3 -32 128 -17.7 128 0S142.3 32 160 32S192 17.7 192 0S177.7 -32 160 -32z" /> + <glyph glyph-name="money-bill-alt" + unicode="" + horiz-adv-x="640" d=" M640 328V56C640 42.745 629.255 32 616 32H24C10.745 32 0 42.745 0 56V328C0 341.255 10.745 352 24 352H616C629.255 352 640 341.255 640 328zM96 64C96 99.346 67.346 128 32 128V64H96zM96 320H32V256C67.346 256 96 284.654 96 320zM400 192C400 245.021 364.184 288 320 288S240 245.021 240 192C240 138.988 275.814 96 320 96C364.1670000000001 96 400 138.969 400 192zM608 128C572.654 128 544 99.346 544 64H608V128zM608 320H544C544 284.654 572.654 256 608 256V320zM277.563 148.473C277.563 155.95 281.48 160.045 289.136 160.045H304.267V199.923C304.267 205.086 304.801 210.426 304.801 210.426H304.445S302.666 207.756 301.5969999999999 206.688C297.1459999999999 202.415 291.0929999999999 202.237 285.931 207.756L280.413 213.987C275.071 219.328 275.429 225.203 280.947 230.366L302.6669999999999 250.305C307.116 254.4 311.0329999999999 256.002 317.087 256.002H329.192C336.848 256.002 340.941 252.086 340.941 244.43V160.046H356.429C364.084 160.046 368.001 155.952 368.001 148.474V139.573C368.001 132.096 364.084 128.001 356.429 128.001H289.136C281.48 128.001 277.563 132.096 277.563 139.573V148.473z" /> + <glyph glyph-name="moon" + unicode="" + horiz-adv-x="512" d=" M283.211 -64C362.173 -64 434.29 -28.075 482.068 30.792C489.136 39.5000000000001 481.429 52.222 470.506 50.1420000000001C346.303 26.4880000000001 232.244 121.7180000000001 232.244 247.0960000000001C232.244 319.3180000000001 270.906 385.7310000000001 333.742 421.4900000000001C343.428 427.0020000000001 340.992 441.6870000000001 329.986 443.7200000000001A258.156 258.156 0 0 1 283.211 448C141.902 448 27.211 333.4890000000001 27.211 192C27.211 50.691 141.722 -64 283.211 -64z" /> + <glyph glyph-name="motorcycle" + unicode="" + horiz-adv-x="640" d=" M512.949 255.997C498.0869999999999 256.105 483.809 253.675 470.515 249.123L437.589 304H520C533.255 304 544 314.745 544 328V360C544 373.255 533.255 384 520 384H474.689A24 24 0 0 1 456.85 376.055L419.3540000000001 334.392L396.5800000000001 372.348A24 24 0 0 1 376 384H296C287.163 384 280 376.837 280 368V352C280 343.163 287.163 336 296 336H362.411L381.611 304H227.904C210.177 327.073 182.98 344 128 344H72.54C59.085 344 47.749 332.9890000000001 48.004 319.536C48.252 306.495 58.9 296 72 296H128C152.504 296 166.686 285.081 175.787 271.231L164.496 250.702C151.49 254.567 137.625 256.438 123.245 255.912C55.857 253.451 1.565 198.395 0.034 130.979C-1.603 58.924 56.317 0 128 0C187.642 0 237.744 40.794 251.953 96H336.189C349.862 96 360.778 107.421 360.165 121.077C358.0470000000001 168.197 377.687 214.742 416.35 246.103L428.8350000000001 225.295C401.189 201.641 383.7380000000001 166.415 384.004 127.116C384.4740000000001 57.56 441.207 0.664 510.762 0.006C582.391 -0.672 640.601 57.493 639.996 129.105C639.408 198.696 582.5409999999999 255.491 512.949 255.997zM128 48C83.888 48 48 83.888 48 128S83.888 208 128 208C132.242 208 136.405 207.659 140.469 207.018L98.97 131.566C90.187 115.593 101.762 96 120 96H201.297C188.927 67.775 160.737 48 128 48zM516.351 48.116C470.272 45.663 432 82.446 432 128C432 149.363 440.4340000000001 168.781 454.125 183.144L503.537 100.792C508.083 93.215 517.912 90.758 525.489 95.304L539.2090000000001 103.5360000000001C546.7860000000001 108.0820000000001 549.243 117.9110000000001 544.6970000000001 125.4880000000001L496.1410000000001 206.4150000000001A80.005 80.005 0 0 0 512 208C557.554 208 594.338 169.727 591.884 123.648C589.724 83.09 556.91 50.276 516.351 48.116z" /> + <glyph glyph-name="mouse-pointer" + unicode="" + horiz-adv-x="320" d=" M302.189 118.874H196.105L251.936 -17.119C255.825 -26.547 251.381 -37.118 242.492 -41.118L193.327 -62.545C184.162 -66.5450000000001 173.884 -61.974 169.995 -52.831L116.942 76.305L30.278 -12.8330000000001C18.729 -24.71 0 -15.554 0 0.023V429.701C0 446.101 19.921 454.096 30.277 442.557L314.689 150.0150000000001C326.161 138.8360000000001 317.696 118.874 302.189 118.874z" /> + <glyph glyph-name="music" + unicode="" + horiz-adv-x="512" d=" M470.4 446.5L166.4 350.5C153.1 346.3 144 334 144 320V55.4C129.9 60.8 113.5 64 96 64C43 64 0 35.3 0 0S43 -64 96 -64S192 -35.3 192 0V227.5L464 313.4V119.4C449.9 124.8 433.5 128 416 128C363 128 320 99.3 320 64S363 0 416 0S512 28.7 512 64V416C512 437.7 490.9 453 470.4 446.5z" /> + <glyph glyph-name="neuter" + unicode="" + horiz-adv-x="288" d=" M288 272C288 351.5 223.5 416 144 416S0 351.5 0 272C0 203.5 47.9 146.1 112 131.6V-20C112 -26.6 117.4 -32 124 -32H164C170.6 -32 176 -26.6 176 -20V131.6C240.1 146.1 288 203.5 288 272zM144 192C99.9 192 64 227.9 64 272S99.9 352 144 352S224 316.1 224 272S188.1 192 144 192z" /> + <glyph glyph-name="newspaper" + unicode="" + horiz-adv-x="576" d=" M552 384H88C74.745 384 64 373.255 64 360V352H24C10.745 352 0 341.255 0 328V56C0 25.072 25.072 0 56 0H528C554.51 0 576 21.49 576 48V360C576 373.255 565.255 384 552 384zM56 48A8 8 0 0 0 48 56V304H64V56A8 8 0 0 0 56 48zM292 64H140C133.373 64 128 69.373 128 76V84C128 90.627 133.373 96 140 96H292C298.627 96 304 90.627 304 84V76C304 69.373 298.627 64 292 64zM500 64H348C341.373 64 336 69.373 336 76V84C336 90.627 341.373 96 348 96H500C506.627 96 512 90.627 512 84V76C512 69.373 506.627 64 500 64zM292 160H140C133.373 160 128 165.373 128 172V180C128 186.627 133.373 192 140 192H292C298.627 192 304 186.627 304 180V172C304 165.373 298.627 160 292 160zM500 160H348C341.373 160 336 165.373 336 172V180C336 186.627 341.373 192 348 192H500C506.627 192 512 186.627 512 180V172C512 165.373 506.627 160 500 160zM500 256H140C133.373 256 128 261.373 128 268V308C128 314.627 133.373 320 140 320H500C506.627 320 512 314.627 512 308V268C512 261.373 506.627 256 500 256z" /> + <glyph glyph-name="object-group" + unicode="" + horiz-adv-x="512" d=" M480 320V352H500C506.627 352 512 357.373 512 364V404C512 410.627 506.627 416 500 416H460C453.373 416 448 410.627 448 404V384H64V404C64 410.627 58.627 416 52 416H12C5.373 416 0 410.627 0 404V364C0 357.373 5.373 352 12 352H32V32H12C5.373 32 0 26.627 0 20V-20C0 -26.627 5.373 -32 12 -32H52C58.627 -32 64 -26.627 64 -20V0H448V-20C448 -26.627 453.373 -32 460 -32H500C506.627 -32 512 -26.627 512 -20V20C512 26.627 506.627 32 500 32H480V320zM96 172V308C96 314.627 101.373 320 108 320H276C282.627 320 288 314.627 288 308V172C288 165.373 282.627 160 276 160H108C101.373 160 96 165.373 96 172zM416 76C416 69.373 410.627 64 404 64H236C229.373 64 224 69.373 224 76V128H296C309.255 128 320 138.745 320 152V224H404C410.627 224 416 218.627 416 212V76z" /> + <glyph glyph-name="object-ungroup" + unicode="" + horiz-adv-x="576" d=" M64 128V102A6 6 0 0 0 58 96H6A6 6 0 0 0 0 102V154A6 6 0 0 0 6 160H32V352H6A6 6 0 0 0 0 358V410A6 6 0 0 0 6 416H58A6 6 0 0 0 64 410V384H352V410A6 6 0 0 0 358 416H410A6 6 0 0 0 416 410V358A6 6 0 0 0 410 352H384V160H410A6 6 0 0 0 416 154V102A6 6 0 0 0 410 96H358A6 6 0 0 0 352 102V128H64zM544 192V224H570A6 6 0 0 1 576 230V282A6 6 0 0 1 570 288H518A6 6 0 0 1 512 282V256H408V184H416C429.255 184 440 173.255 440 160V96C440 82.745 429.255 72 416 72H352C338.745 72 328 82.745 328 96V104H192V32H166A6 6 0 0 1 160 26V-26A6 6 0 0 1 166 -32H218A6 6 0 0 1 224 -26V0H512V-26A6 6 0 0 1 518 -32H570A6 6 0 0 1 576 -26V26A6 6 0 0 1 570 32H544V192z" /> + <glyph glyph-name="outdent" + unicode="" + horiz-adv-x="448" d=" M0 364V404C0 412.837 7.163 420 16 420H432C440.837 420 448 412.837 448 404V364C448 355.163 440.837 348 432 348H16C7.163 348 0 355.163 0 364zM208 220H432C440.837 220 448 227.163 448 236V276C448 284.837 440.837 292 432 292H208C199.163 292 192 284.837 192 276V236C192 227.163 199.163 220 208 220zM16 -36H432C440.837 -36 448 -28.837 448 -20V20C448 28.837 440.837 36 432 36H16C7.163 36 0 28.837 0 20V-20C0 -28.837 7.163 -36 16 -36zM208 92H432C440.837 92 448 99.163 448 108V148C448 156.837 440.837 164 432 164H208C199.163 164 192 156.837 192 148V108C192 99.163 199.163 92 208 92zM4.687 180.687L100.687 84.703C110.734 74.652 128 81.776 128 96.016V287.992C128 302.3210000000001 110.675 309.296 100.687 299.305L4.687 203.313C-1.562 197.065 -1.562 186.935 4.687 180.687z" /> + <glyph glyph-name="paint-brush" + unicode="" + horiz-adv-x="512" d=" M269.9 83.4C271.3 77 272 70.4 272 63.7C272 -17.5 217.8 -64 137.2 -64C41.5 -64 0 12.9 0 100.4C10.4 93.3 46.9 63.9 58.7 63.9C65.7 63.9 71.7 67.9 74.2 74.5C97.8 136.7 140.7 151 187.1 151.9C202.7 118.1 233.2 92.3 269.9000000000001 83.4zM460.6 448C446.2000000000001 448 432.7000000000001 441.6 422.4000000000001 432.3C228.2 258 208 253.9 208 202.6C208 153.8 248.5 112 298.2 112C357.2 112 391.4 155.4 498.8 356.8C505.8 370.5 511.9999999999999 385.3 511.9999999999999 400.7C512 428.3 487.3 448 460.6 448z" /> + <glyph glyph-name="pallet" + unicode="" + horiz-adv-x="640" d=" M144 192H496C504.8 192 512 199.2 512 208V432C512 440.8 504.8 448 496 448H384V320L320 352L256 320V448H144C135.2 448 128 440.8 128 432V208C128 199.2 135.2 192 144 192zM624 64C632.8 64 640 71.2 640 80V112C640 120.8 632.8 128 624 128H16C7.2 128 0 120.8 0 112V80C0 71.2 7.2 64 16 64H64V0H16C7.2 0 0 -7.2 0 -16V-48C0 -56.8 7.2 -64 16 -64H624C632.8 -64 640 -56.8 640 -48V-16C640 -7.2 632.8 0 624 0H576V64H624zM288 0H128V64H288V0zM512 0H352V64H512V0z" /> + <glyph glyph-name="paper-plane" + unicode="" + horiz-adv-x="512" d=" M476 444.8L12.5 177.4C-5.6 167 -3.3 141.8 14.7 134.2L121 89.6L408.3 342.8C413.8 347.7000000000001 421.6 340.2000000000001 416.9000000000001 334.5L176 41V-39.5C176 -63.1 204.5 -72.4 218.5 -55.3L282 22L406.6 -30.2C420.8 -36.2 437 -27.3 439.6 -12L511.6 420C515 440.2 493.3 454.8 476 444.8z" /> + <glyph glyph-name="paperclip" + unicode="" + horiz-adv-x="448" d=" M43.246 -18.142C-15.184 42.147 -14.095 139.369 44.632 199.439L254.392 414C298.708 459.332 370.743 459.336 415.063 414C458.953 369.106 459.006 296.671 415.063 251.724L232.214 64.872C202.359 34.335 153.581 34.761 124.232 65.87C95.957 95.84 96.864 143.343 125.684 172.823L269.427 319.658C275.6090000000001 325.972 285.7390000000001 326.08 292.053 319.899L314.914 297.52C321.229 291.338 321.336 281.208 315.155 274.894L171.427 128.073C166.495 123.028 166.191 114.645 170.779 109.781C175.151 105.1469999999999 182.024 105.0699999999999 186.467 109.6159999999999L369.316 296.467C388.929 316.529 388.929 349.1919999999999 369.305 369.265C350.116 388.892 319.348 388.902 300.151 369.265L90.39 154.705C55.627 119.145 55.091 61.585 89.199 26.392C123.209 -8.701 178.184 -8.745 212.257 26.106L384.317 202.105C390.4940000000001 208.424 400.624 208.538 406.943 202.361L429.82 179.997C436.139 173.82 436.254 163.69 430.076 157.3710000000001L258.016 -18.627C198.44 -79.5649999999999 102.073 -78.843 43.246 -18.1419999999999z" /> + <glyph glyph-name="paragraph" + unicode="" + horiz-adv-x="448" d=" M408 416H177.531C88.948 416 16.045 344.665 16 256.082C15.956 167.679 87.607 96 176 96V-8C176 -21.255 186.745 -32 200 -32H232C245.255 -32 256 -21.255 256 -8V336H288V-8C288 -21.255 298.745 -32 312 -32H344C357.255 -32 368 -21.255 368 -8V336H408C421.255 336 432 346.745 432 360V392C432 405.255 421.255 416 408 416z" /> + <glyph glyph-name="paste" + unicode="" + horiz-adv-x="448" d=" M128 264C128 294.879 153.122 320 184 320H320V392C320 405.255 309.255 416 296 416H215.39C204.306 435.11 183.637 448 160 448S115.694 435.11 104.61 416H24C10.745 416 0 405.255 0 392V56C0 42.745 10.745 32 24 32H128V264zM160 408C173.255 408 184 397.255 184 384S173.255 360 160 360S136 370.745 136 384S146.745 408 160 408zM344 160H448V-40C448 -53.255 437.255 -64 424 -64H184C170.745 -64 160 -53.255 160 -40V264C160 277.255 170.745 288 184 288H320V184C320 170.8 330.8 160 344 160zM448 198.059V192H352V288H358.0590000000001A24 24 0 0 0 375.029 280.971L440.9700000000001 215.03A24.002000000000002 24.002000000000002 0 0 0 448 198.059z" /> + <glyph glyph-name="pause-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM240 112C240 103.2 232.8 96 224 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H224C232.8 288 240 280.8 240 272V112zM352 112C352 103.2 344.8 96 336 96H288C279.2 96 272 103.2 272 112V272C272 280.8 279.2 288 288 288H336C344.8 288 352 280.8 352 272V112z" /> + <glyph glyph-name="pause" + unicode="" + horiz-adv-x="448" d=" M144 -31H48C21.5 -31 0 -9.5 0 17V369C0 395.5 21.5 417 48 417H144C170.5 417 192 395.5 192 369V17C192 -9.5 170.5 -31 144 -31zM448 17V369C448 395.5 426.5 417 400 417H304C277.5 417 256 395.5 256 369V17C256 -9.5 277.5 -31 304 -31H400C426.5 -31 448 -9.5 448 17z" /> + <glyph glyph-name="paw" + unicode="" + horiz-adv-x="512" d=" M85.231 117.042C36 117.042 0 174.208 0 216.5C0 244.792 16 274.5420000000001 49.538 274.5420000000001C98.769 274.5420000000001 134.769 217.084 134.769 174.792C134.769 146.5 119.077 117.042 85.231 117.042zM433.231 10.875C433.231 -26.167 401.231 -32 369.846 -32C328.615 -32 295.384 -5.75 256 -5.75C214.769 -5.75 179.692 -31.708 135.077 -31.708C105.23 -31.708 78.769 -22.083 78.769 10.875C78.769 80 180.616 182.667 256 182.667S433.231 79.708 433.231 10.875zM182.462 244.208C132.615 244.208 102.462 303.708 102.462 344.541C102.462 377.208 120.308 416 160 416C210.154 416 240 356.5 240 315.6670000000001C240 283 222.154 244.208 182.462 244.208zM272 315.6670000000001C272 356.5 301.846 416 352 416C391.692 416 409.539 377.208 409.539 344.5420000000001C409.539 303.709 379.385 244.209 329.538 244.209C289.846 244.208 272 283 272 315.6670000000001zM512 216.5C512 174.208 476 117.042 426.769 117.042C392.9220000000001 117.042 377.231 146.5 377.231 174.792C377.231 217.083 413.23 274.5420000000001 462.462 274.5420000000001C496 274.5420000000001 512 244.792 512 216.5z" /> + <glyph glyph-name="pen-square" + unicode="" + horiz-adv-x="448" d=" M400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368V16C448 -10.5 426.5 -32 400 -32zM238.1 270.1L102.4 134.4L96.1 77.3C95.3 69.6999999999999 101.7 63.1999999999999 109.4 63.9999999999999L166.5 70.3L302.2 206C304.5 208.3 304.5 212.1 302.2 214.5L246.7 270C244.2 272.4 240.4 272.4 238.1 270.1zM345 282.9L314.9 313C305.5 322.4 290.3 322.4 281 313L257.9 289.9C255.6 287.6 255.6 283.8 257.9 281.4L313.4 225.9C315.7 223.6 319.5 223.6 321.9 225.9L345 249C354.3 258.3 354.3 273.5 345 282.9z" /> + <glyph glyph-name="pencil-alt" + unicode="" + horiz-adv-x="512" d=" M497.9 305.9L451.8 259.8C447.1 255.1 439.5 255.1 434.8 259.8L323.8 370.8C319.1 375.5 319.1 383.1 323.8 387.8L369.9 433.9000000000001C388.6 452.6 419 452.6 437.8 433.9000000000001L497.9 373.8C516.6999999999999 355.1 516.6999999999999 324.7000000000001 497.9 305.9zM284.2 348.2L21.6 85.6L0.4 -35.9C-2.5 -52.3 11.8 -66.5 28.2 -63.7L149.7 -42.4L412.3 220.2000000000001C417 224.9 417 232.5000000000001 412.3 237.2000000000001L301.3 348.2000000000001C296.5 352.9000000000001 288.9000000000001 352.9000000000001 284.2 348.2000000000001zM124.1 108.1C118.6 113.6 118.6 122.4 124.1 127.9L278.1 281.9000000000001C283.6 287.4000000000001 292.4000000000001 287.4000000000001 297.9000000000001 281.9000000000001S303.4000000000001 267.6 297.9000000000001 262.1L143.9 108.1C138.4 102.6 129.6 102.6 124.1 108.1zM88 24H136V-12.3L71.5 -23.6L40.4 7.5L51.7 72H88V24z" /> + <glyph glyph-name="percent" + unicode="" + horiz-adv-x="448" d=" M112 224C173.9 224 224 274.1 224 336S173.9 448 112 448S0 397.9 0 336S50.1 224 112 224zM112 384C138.5 384 160 362.5 160 336S138.5 288 112 288S64 309.5 64 336S85.5 384 112 384zM336 160C274.1 160 224 109.9 224 48S274.1 -64 336 -64S448 -13.9 448 48S397.9 160 336 160zM336 0C309.5 0 288 21.5 288 48S309.5 96 336 96S384 74.5 384 48S362.5 0 336 0zM392.3 447.8L423.9000000000001 447.9C443.3 448 454.8 426.1 443.6 410.1L77.4 -53.6A23.95 23.95 0 0 0 57.8 -63.8L24.4 -63.9C4.9 -63.9 -6.5 -42.0000000000001 4.7 -26.1L372.7 437.6C377.2 444 384.5 447.8 392.3 447.8z" /> + <glyph glyph-name="phone-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM94 32C86.967 32 80.943 36.873 79.384 43.627L64.386 108.627A15 15 0 0 0 73.093 125.787L143.091 155.7860000000001A15 15 0 0 0 160.609 151.4970000000001L191.606 113.6120000000001C240.55 136.5750000000001 279.903 176.4700000000001 302.387 224.3920000000001L264.501 255.3890000000001A15.000999999999998 15.000999999999998 0 0 0 260.212 272.9070000000001L290.212 342.9050000000001A15 15 0 0 0 307.372 351.6120000000001L372.372 336.6140000000001A14.997000000000002 14.997000000000002 0 0 0 384 322C384 161.708 254.055 32 94 32z" /> + <glyph glyph-name="phone-volume" + unicode="" + horiz-adv-x="384" d=" M97.333 -58.966C-32.541 70.908 -32.348 281.286 97.333 410.967C103.031 416.665 111.86 417.599 118.596 413.389L183.413 372.876A17.187 17.187 0 0 0 190.262 351.918L157.854 270.897A17.188 17.188 0 0 0 140.185 260.178L84.375 265.7580000000001C63.324 207.497 63.763 143.287 84.375 86.2430000000001L140.186 91.8240000000001A17.188 17.188 0 0 0 157.855 81.1050000000001L190.263 0.0830000000001A17.188 17.188 0 0 0 183.414 -20.8749999999999L118.597 -61.3879999999999A17.19 17.19 0 0 0 97.333 -58.9659999999998zM247.126 352.527C258.9580000000001 332.48 258.9580000000001 307.519 247.126 287.472C243.176 280.779 234.018 279.513 228.408 284.891L222.433 290.617C218.522 294.365 217.64 300.239 220.172 305.027A32.063 32.063 0 0 1 220.172 334.972C217.6390000000001 339.76 218.522 345.634 222.433 349.382L228.408 355.108C234.0180000000001 360.486 243.176 359.22 247.126 352.527zM338.913 443.714C399.053 372.11 399.005 267.832 338.913 196.286C334.439 190.959 326.3830000000001 190.54 321.361 195.353L315.563 200.91C311.003 205.281 310.586 212.439 314.633 217.289C364.32 276.827 364.279 363.222 314.633 422.711C310.586 427.561 311.002 434.719 315.563 439.09L321.361 444.647C326.383 449.46 334.439 449.041 338.913 443.714zM292.9410000000001 398.773C328.9910000000001 352.451 329.0490000000001 287.624 292.9410000000001 241.227C288.5510000000001 235.586 280.2440000000001 234.976 275.0850000000001 239.923L269.2670000000001 245.502C264.8670000000001 249.721 264.2690000000001 256.597 267.9820000000001 261.433C294.5180000000001 295.997 294.516 344.005 267.9820000000001 378.567C264.269 383.403 264.867 390.278 269.2670000000001 394.4980000000001L275.0850000000001 400.077C280.2440000000001 405.024 288.5510000000001 404.414 292.9410000000001 398.773z" /> + <glyph glyph-name="phone" + unicode="" + horiz-adv-x="512" d=" M493.397 423.385L389.397 447.382C378.083 449.993 366.518 444.13 361.941 433.451L313.941 321.454A24 24 0 0 1 320.803 293.425L381.42 243.829C345.447 167.154 282.4820000000001 103.321 204.171 66.581L154.575 127.197A24 24 0 0 1 126.546 134.059L14.549 86.059C3.873 81.484 -1.994 69.92 0.618 58.603L24.615 -45.397C27.109 -56.204 36.748 -64 48 -64C304.087 -64 512 143.5320000000001 512 400C512 411.176 504.286 420.873 493.397 423.385z" /> + <glyph glyph-name="pills" + unicode="" + horiz-adv-x="576" d=" M112 416C50.1 416 0 365.9 0 304V80C0 18.1 50.1 -32 112 -32S224 18.1 224 80V304C224 365.9 173.9 416 112 416zM160 192H64V304C64 330.5 85.5 352 112 352S160 330.5 160 304V192zM299.7 221.7C296.2 225.2 290.3 224.8 287.4 220.9C242.1 158.4 247 70.8 303.3 14.5C359.6 -41.8 447.2 -46.7 509.6999999999999 -1.4C513.6999999999999 1.5 513.9999999999999 7.4 510.4999999999999 10.9L299.7 221.7zM529.5 240.7C473.2 297 385.6 301.9 323.1 256.6C319.1 253.7 318.8 247.8 322.3 244.3L533.1 33.5C536.6 30 542.5 30.4 545.4 34.3C590.6999999999999 96.9 585.9 184.4 529.5 240.7z" /> + <glyph glyph-name="plane" + unicode="" + horiz-adv-x="576" d=" M472 248H360.211L256.013 442.289A12 12 0 0 1 245.793 448H188.006C180.156 448 174.42 440.587 176.39 432.989L209.624 248H99.766L64.862 306.174A12 12 0 0 1 54.572 312H12.004C4.432 312 -1.248 305.072 0.237 297.647L21.366 191.999L0.237 86.354C-1.248 78.928 4.432 72 12.005 72.001L54.573 72.003C58.788 72.003 62.694 74.215 64.862 77.829L99.766 136H209.624L176.39 -48.989C174.42 -56.588 180.156 -64 188.006 -64H245.793A12 12 0 0 1 256.013 -58.289L360.212 136H472C529.438 136 576 161.072 576 192S529.438 248 472 248z" /> + <glyph glyph-name="play-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM371.7 168L195.7 67C179.9 58.2 160 69.5 160 88V296C160 314.4 179.8 325.8 195.7 317L371.7 210C388.1 200.8 388.1 177.1 371.7 168z" /> + <glyph glyph-name="play" + unicode="" + horiz-adv-x="448" d=" M424.4 233.3L72.4 441.4C43.8 458.3 0 441.9 0 400.1V-16C0 -53.5 40.7 -76.1 72.4 -57.3L424.4 150.7C455.8 169.2 455.9 214.8 424.4 233.3z" /> + <glyph glyph-name="plug" + unicode="" + horiz-adv-x="384" d=" M256 304V416C256 433.673 270.327 448 288 448S320 433.673 320 416V304H256zM368 288H16C7.163 288 0 280.837 0 272V240C0 231.163 7.163 224 16 224H32V192C32 114.594 86.969 50.029 160 35.204V-64H224V35.204C297.031 50.029 352 114.594 352 192V224H368C376.837 224 384 231.163 384 240V272C384 280.837 376.837 288 368 288zM128 304V416C128 433.673 113.673 448 96 448S64 433.673 64 416V304H128z" /> + <glyph glyph-name="plus-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM400 164C400 157.4 394.6 152 388 152H296V60C296 53.4 290.6 48 284 48H228C221.4 48 216 53.4 216 60V152H124C117.4 152 112 157.4 112 164V220C112 226.6 117.4 232 124 232H216V324C216 330.6 221.4 336 228 336H284C290.6 336 296 330.6 296 324V232H388C394.6 232 400 226.6 400 220V164z" /> + <glyph glyph-name="plus-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM368 164C368 157.4 362.6 152 356 152H264V60C264 53.4 258.6 48 252 48H196C189.4 48 184 53.4 184 60V152H92C85.4 152 80 157.4 80 164V220C80 226.6 85.4 232 92 232H184V324C184 330.6 189.4 336 196 336H252C258.6 336 264 330.6 264 324V232H356C362.6 232 368 226.6 368 220V164z" /> + <glyph glyph-name="plus" + unicode="" + horiz-adv-x="448" d=" M448 153.8V230.2C448 243.5000000000001 437.3 254.2 424 254.2H286.2V392C286.2 405.3 275.5 416 262.2 416H185.8C172.5 416 161.8 405.3 161.8 392V254.2H24C10.7 254.2 0 243.5 0 230.2V153.8C0 140.5 10.7 129.8 24 129.8H161.8V-8C161.8 -21.3 172.5 -32 185.8 -32H262.2000000000001C275.5000000000001 -32 286.2000000000001 -21.3 286.2000000000001 -8V129.8H424C437.3 129.8 448 140.5 448 153.8z" /> + <glyph glyph-name="podcast" + unicode="" + horiz-adv-x="448" d=" M267.429 -40.563C262.286 -59.573 242.858 -64 224 -64C205.143 -64 185.714 -59.573 180.572 -40.563C172.927 -12.134 160 59.102 160 92.25C160 127.406 191.142 136 224 136S288 127.406 288 92.25C288 59.301 275.129 -11.929 267.429 -40.563zM156.867 159.446C138.174 177.754 126.909 203.619 128.083 232.045C130.137 281.769 170.478 322.0010000000001 220.207 323.9260000000001C274.862 326.0420000000001 320 282.193 320 228C320 201.173 308.936 176.884 291.134 159.448C288.459 156.828 288.733 152.462 291.762 150.261C301.074 143.496 308.222 134.918 312.996 124.898C314.737 121.244 319.493 120.238 322.445 123.007C351.271 150.05 368.998 188.79 367.956 231.572C366.101 307.778 304.361 369.78 228.163 371.9409999999999C146.869 374.247 80 308.785 80 228C80 186.639 97.532 149.3 125.55 123.011C128.503 120.24 133.261 121.241 135.003 124.898C139.777 134.919 146.926 143.496 156.238 150.261C159.267 152.461 159.542 156.827 156.867 159.446zM224 448C100.204 448 0 347.815 0 224C0 134.008 52.602 58.353 125.739 22.592C130.072 20.474 135.006 24.136 134.274 28.902C131.892 44.414 129.932 59.848 128.868 73.241C128.722 75.077 127.719 76.727 126.19 77.753C78.79 109.559 47.626 163.769 48.003 225.1C48.595 321.337 127.293 399.748 223.532 399.999C320.793 400.253 400 321.203 400 224C400 162.068 367.842 107.51 319.35 76.133C318.351 62.0960000000001 316.281 45.545 313.726 28.903C312.994 24.136 317.929 20.474 322.261 22.593C395.227 58.273 448 133.813 448 224C448 347.795 347.815 448 224 448zM224 288C188.654 288 160 259.346 160 224S188.654 160 224 160S288 188.654 288 224S259.346 288 224 288z" /> + <glyph glyph-name="pound-sign" + unicode="" + horiz-adv-x="320" d=" M308 96H262.505C255.878 96 250.505 90.627 250.505 84V33.152H128V160H212C218.627 160 224 165.373 224 172V212C224 218.627 218.627 224 212 224H128V287.556C128 319.822 152.562 344.642 189.792 344.642C213.45 344.642 235.67 333.137 247.444 325.793C252.5950000000001 322.58 259.332 323.742 263.132 328.478L291.625 363.991C295.858 369.267 294.904 376.996 289.506 381.072C273.124 393.44 236.576 416 187.931 416C106.026 416 48 363.258 48 290.039V224H20C13.373 224 8 218.627 8 212V172C8 165.373 13.373 160 20 160H48V32H12C5.373 32 0 26.627 0 20V-20C0 -26.627 5.373 -32 12 -32H308C314.627 -32 320 -26.627 320 -20V84C320 90.627 314.627 96 308 96z" /> + <glyph glyph-name="power-off" + unicode="" + horiz-adv-x="512" d=" M400 393.9C463 348.9 504 275.3 504 192C504 55.2 393.2 -55.7 256.5 -56C120 -56.3 8.2 55 8 191.6C7.9 274.9 48.9 348.7 111.8 393.8C123.5 402.1 139.8 398.6 146.8 386.1L162.6 358C168.5 347.5 165.7 334.2 156 327C114.5 296.2 88 247.4 88 192.1C87.9 99.8 162.5 24 256 24C347.6 24 424.6 98.2 424 193.1C423.7 244.9 399.3 294.9 355.9 327.1C346.2 334.3 343.5 347.6 349.4 358L365.2 386.1C372.2 398.5 388.4 402.2 400 393.9zM296 184V424C296 437.3 285.3 448 272 448H240C226.7 448 216 437.3 216 424V184C216 170.7 226.7 160 240 160H272C285.3 160 296 170.7 296 184z" /> + <glyph glyph-name="print" + unicode="" + horiz-adv-x="512" d=" M464 256H448V366.059A24 24 0 0 1 440.971 383.029L383.029 440.971A24 24 0 0 1 366.0590000000001 448H88C74.745 448 64 437.255 64 424V256H48C21.49 256 0 234.51 0 208V76C0 69.373 5.373 64 12 64H64V-40C64 -53.255 74.745 -64 88 -64H424C437.255 -64 448 -53.255 448 -40V64H500C506.627 64 512 69.373 512 76V208C512 234.51 490.51 256 464 256zM384 0H128V96H384V0zM128 224V384H320V344C320 330.8 330.8 320 344 320H384V224H128zM432 152C418.746 152 408 162.746 408 176S418.746 200 432 200S456 189.254 456 176S445.254 152 432 152z" /> + <glyph glyph-name="puzzle-piece" + unicode="" + horiz-adv-x="576" d=" M519.442 159.349C477.923 159.349 459.942 127.756 437.384 127.756C377.409 127.756 432 304 432 304S235.712 224 235.712 307.2970000000001C235.712 343.124 272 353.5470000000001 272 393.282C272 428.784 243.885 448 210.539 448C175.885 448 144.173 429.109 144.173 391.654C144.173 350.29 175.884 332.377 175.884 309.904C175.885 240.281 0 281.242 0 281.242V-51.995S178.635 -93.042 178.635 -23.333C178.635 -0.86 138.635 16.774 138.635 58.138C138.635 95.594 167.885 114.484 202.212 114.484C235.885 114.484 264 95.268 264 59.767C264 20.032 227.712 9.609 227.712 -26.218C227.712 -87.021 357.387 -51.948 408.942 -51.948C408.942 -51.948 374.217 68.153 434.769 68.153C470.731 68.153 481.192 32.001 521.077 32.001C556.712 32 576 60.01 576 93.557C576 127.756 557.038 159.3490000000001 519.442 159.3490000000001z" /> + <glyph glyph-name="qrcode" + unicode="" + horiz-adv-x="448" d=" M0 224H192V416H0V224zM64 352H128V288H64V352zM256 416V224H448V416H256zM384 288H320V352H384V288zM0 -32H192V160H0V-32zM64 96H128V32H64V96zM416 160H448V32H352V64H320V-32H256V160H352V128H416V160zM416 0H448V-32H416V0zM352 0H384V-32H352V0z" /> + <glyph glyph-name="question-circle" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.003 392.957 -56 256 -56S8 55.003 8 192C8 328.9170000000001 119.043 440 256 440S504 328.9170000000001 504 192zM262.655 358C208.158 358 173.4 335.043 146.106 294.242C142.57 288.956 143.753 281.827 148.821 277.984L183.52 251.674C188.725 247.727 196.141 248.666 200.185 253.796C218.049 276.454 230.298 289.593 257.488 289.593C277.9169999999999 289.593 303.1859999999999 276.445 303.1859999999999 256.635C303.1859999999999 241.659 290.8229999999999 233.968 270.652 222.659C247.128 209.472 216 193.059 216 152V148C216 141.373 221.373 136 228 136H284C290.627 136 296 141.373 296 148V149.333C296 177.795 379.1860000000001 178.98 379.1860000000001 256C379.1860000000001 314.0020000000001 319.021 358 262.6550000000001 358zM256 110C230.635 110 210 89.365 210 64C210 38.636 230.635 18 256 18S302 38.636 302 64C302 89.365 281.365 110 256 110z" /> + <glyph glyph-name="question" + unicode="" + horiz-adv-x="384" d=" M202.021 448C122.202 448 70.503 415.2970000000001 29.914 356.974C22.551 346.394 24.821 331.8880000000001 35.092 324.1L78.23 291.391C88.603 283.526 103.362 285.365 111.483 295.539C136.532 326.92 155.113 344.988 194.24 344.988C225.004 344.988 263.0560000000001 325.189 263.0560000000001 295.357C263.0560000000001 272.805 244.4390000000001 261.223 214.0630000000001 244.193C178.6400000000001 224.333 131.7640000000001 199.617 131.7640000000001 137.788V128C131.7640000000001 114.745 142.5090000000001 104 155.7640000000001 104H228.2350000000001C241.4900000000001 104 252.2350000000001 114.745 252.2350000000001 128V133.773C252.2350000000001 176.6330000000001 377.5030000000001 178.418 377.5030000000001 294.4000000000001C377.504 381.7440000000001 286.902 448 202.021 448zM192 74.541C153.804 74.541 122.729 43.466 122.729 5.27C122.729 -32.925 153.804 -64 192 -64S261.271 -32.925 261.271 5.271S230.1960000000001 74.541 192 74.541z" /> + <glyph glyph-name="quidditch" + unicode="" + horiz-adv-x="640" d=" M256.5 231.2L343.2 122S326.6 19.6 266.6 -28.1C206.7 -75.7999999999999 0 -62.2 0 -62.2S3.8 -39.1 11 -6.8L105.6 105.4C109.6 110.1 104.7 117 99 114.9L38.6 92.8C53 134.5 71.3 172.8 93.2 190.3C153.1 238.1 256.5 231.2 256.5 231.2zM494.5 96.2C450.5 96.2 414.7 60.4 414.7 16.3C414.7 -27.8000000000001 450.4 -63.6 494.5 -63.6C538.6 -63.6 574.3 -27.8 574.3 16.3C574.3 60.4999999999999 538.5 96.1999999999999 494.4999999999999 96.1999999999999zM636.5 417L616.7 442C611.2 448.9 601.2 450 594.3000000000001 444.6L361.8 266.7L327.7 309.7C322.6 316.1 312.6 314.9 309.1 307.5L283.8 252.9L370.5 143.7L429.3 156.1C437.3 157.8 440.7 167.3 435.6 173.7L401.5 216.6L634 394.5C640.9 400 642 410.1 636.5 417z" /> + <glyph glyph-name="quote-left" + unicode="" + horiz-adv-x="512" d=" M0 16V144C0 281.0180000000001 63.772 380.324 193.827 415.1720000000001C209.052 419.252 224 407.735 224 391.973V358.078C224 348.021 217.772 338.945 208.313 335.528C142.316 311.688 104 266.054 104 192H176C202.51 192 224 170.51 224 144V16C224 -10.51 202.51 -32 176 -32H48C21.49 -32 0 -10.51 0 16zM336 -32H464C490.51 -32 512 -10.51 512 16V144C512 170.51 490.51 192 464 192H392C392 266.054 430.3160000000001 311.688 496.313 335.528C505.772 338.945 512 348.021 512 358.078V391.973C512 407.735 497.052 419.252 481.827 415.1720000000001C351.772 380.324 288 281.0180000000001 288 144V16C288 -10.51 309.49 -32 336 -32z" /> + <glyph glyph-name="quote-right" + unicode="" + horiz-adv-x="512" d=" M512 368V240C512 102.982 448.228 3.676 318.173 -31.172C302.948 -35.252 288 -23.735 288 -7.973V25.922C288 35.979 294.228 45.055 303.687 48.472C369.6840000000001 72.312 408 117.946 408 192H336C309.49 192 288 213.49 288 240V368C288 394.51 309.49 416 336 416H464C490.51 416 512 394.51 512 368zM176 416H48C21.49 416 0 394.51 0 368V240C0 213.49 21.49 192 48 192H120C120 117.946 81.684 72.312 15.687 48.472C6.228 45.055 0 35.979 0 25.922V-7.973C0 -23.735 14.948 -35.2519999999999 30.173 -31.172C160.228 3.676 224 102.982 224 240V368C224 394.51 202.51 416 176 416z" /> + <glyph glyph-name="random" + unicode="" + horiz-adv-x="512" d=" M504.971 88.971C514.344 79.598 514.344 64.402 504.971 55.03L424.971 -24.954C409.961 -39.964 384 -29.444 384 -7.983V32H325.2150000000001A12.004 12.004 0 0 0 316.442 35.812L245.886 111.408L299.2190000000001 168.5510000000001L352 112H384V151.981C384 173.419 409.943 183.979 424.971 168.952L504.971 88.971zM12 272H96L148.781 215.449L202.114 272.592L131.558 348.188A11.999000000000002 11.999000000000002 0 0 1 122.785 352H12C5.373 352 0 346.627 0 340V284C0 277.373 5.373 272 12 272zM384 272V232.016C384 210.556 409.961 200.036 424.971 215.045L504.971 295.029C514.344 304.402 514.344 319.598 504.971 328.9700000000001L424.971 408.951C409.943 423.979 384 413.418 384 391.981V352H325.2150000000001A12.004 12.004 0 0 1 316.442 348.188L96 112H12C5.373 112 0 106.627 0 100V44C0 37.373 5.373 32 12 32H122.785C126.111 32 129.288 33.381 131.558 35.812L352 272H384z" /> + <glyph glyph-name="recycle" + unicode="" + horiz-adv-x="512" d=" M184.561 186.097C187.793 172.1 172.438 161.462 160.493 168.929L119.757 194.384L68.89 112.982C55.606 91.727 70.96 64 96.012 64H148C154.627 64 160 58.627 160 52V12C160 5.373 154.627 0 148 0H96.115C20.781 0 -25.187 83.048 14.707 146.88L65.529 228.268L24.804 253.716C12.723 261.2630000000001 15.838 279.677 29.683 282.874L139.92 308.324C148.531 310.312 157.121 304.943 159.109 296.334L184.561 186.097zM283.122 369.012L324.411 302.936L283.671 277.479C271.62 269.951 274.671 251.526 288.55 248.321L398.7870000000001 222.871C407.4590000000001 220.872 416.002 226.309 417.9760000000001 234.861L443.4260000000001 345.098C446.6230000000001 358.942 431.4360000000001 369.817 419.3580000000001 362.266L378.6710000000001 336.842L337.4080000000001 402.924C299.8870000000001 462.957 212.1990000000001 463.095 174.5920000000001 402.924L156.6290000000001 374.158C153.1190000000001 368.538 154.8290000000001 361.137 160.4490000000001 357.625L194.3680000000001 336.43C199.9880000000001 332.918 207.3920000000001 334.627 210.9040000000001 340.247L228.8650000000001 368.99C241.5770000000001 389.331 270.8380000000001 388.666 283.1220000000001 369.012zM497.288 146.88L469.773 190.945C466.262 196.568 458.857 198.279 453.235 194.766L419.374 173.607C413.754 170.095 412.0440000000001 162.692 415.5560000000001 157.071L443.1200000000001 112.959C456.3770000000001 91.7479999999999 441.0630000000001 63.999 415.9840000000001 63.999H320V111.98C320 126.1930000000001 302.758 133.363 292.687 123.293L212.687 43.312C206.438 37.064 206.438 26.933 212.687 20.685L292.687 -59.304C302.689 -69.308 320 -62.3 320 -47.989V0H415.88C491.154 0 537.215 82.997 497.288 146.88z" /> + <glyph glyph-name="redo-alt" + unicode="" + horiz-adv-x="512" d=" M256.455 440C322.724 439.881 382.892 413.767 427.314 371.315L463.029 407.03C478.149 422.149 504 411.4410000000001 504 390.059V256C504 242.745 493.255 232 480 232H345.941C324.559 232 313.851 257.851 328.97 272.971L370.72 314.721C339.856 343.62 299.919 359.628 257.49 359.9940000000001C165.092 360.7920000000001 87.207 286.017 88.0059999999999 190.552C88.764 99.991 162.184 24 256 24C297.127 24 335.997 38.678 366.629 65.556C371.372 69.717 378.5350000000001 69.464 382.997 65.003L422.659 25.341C427.531 20.469 427.29 12.526 422.177 7.908C378.202 -31.813 319.926 -56 256 -56C119.034 -56 8.001 55.033 8 191.998C7.999 328.807 119.646 440.245 256.455 440z" /> + <glyph glyph-name="redo" + unicode="" + horiz-adv-x="512.333" d=" M500.333 448H452.922C446.069 448 440.608 442.271 440.9360000000001 435.426L444.9020000000001 352.6670000000001C399.416 406.101 331.6720000000001 440 256.001 440C119.34 440 7.899 328.474 8 191.813C8.101 54.932 119.096 -56 256 -56C319.926 -56 378.202 -31.813 422.178 7.908C427.291 12.526 427.532 20.469 422.6600000000001 25.341L388.689 59.312C384.223 63.778 377.0490000000001 64.029 372.3090000000001 59.855C341.308 32.552 300.606 16 256 16C158.733 16 80 94.716 80 192C80 289.267 158.716 368 256 368C316.892 368 370.506 337.142 402.099 290.2L300.574 295.065C293.729 295.3930000000001 288 289.932 288 283.079V235.668C288 229.041 293.373 223.668 300 223.668H500.333C506.96 223.668 512.333 229.041 512.333 235.668V436C512.333 442.627 506.96 448 500.333 448z" /> + <glyph glyph-name="registered" + unicode="" + horiz-adv-x="512" d=" M285.363 240.525C285.363 221.925 275.532 212.094 256.932 212.094H227.056V268.234H250.4340000000001C279.1020000000001 268.234 285.3630000000001 259.461 285.3630000000001 240.525zM504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM363.411 87.586C316.682 172.411 320.112 166.222 318.709 168.566C342.141 183.7380000000001 356.654 211.545 356.654 243.052C356.654 297.2960000000001 325.154 332.3040000000001 251.156 332.3040000000001H180.489C167.234 332.3040000000001 156.489 321.5590000000001 156.489 308.3040000000001V76C156.489 62.745 167.234 52 180.489 52H203.056C216.311 52 227.056 62.745 227.056 76V147.663H252.612L296.7410000000001 64.726A24.001000000000005 24.001000000000005 0 0 1 317.9290000000001 51.999H342.3930000000001C360.6540000000001 52 372.2220000000001 71.59 363.4110000000001 87.586z" /> + <glyph glyph-name="reply-all" + unicode="" + horiz-adv-x="576" d=" M136.309 258.164L312.313 410.149C327.7200000000001 423.454 352 412.652 352 391.985V309.222C481.182 298.991 576 257.01 576 125.674C576 64.233 536.418 3.365 492.667 -28.458C479.014 -38.389 459.556 -25.925 464.59 -9.827C503.102 113.335 460.668 159.655 352 172.188V88.013C352 67.312 327.7 56.56 312.313 69.849L136.309 221.836C125.238 231.397 125.223 248.589 136.309 258.164zM8.309 221.836L184.313 69.85C199.7 56.561 224 67.313 224 88.014V103.832L115.394 197.617A55.96 55.96 0 0 0 96 240.002A55.95300000000001 55.95300000000001 0 0 0 115.393 282.382L224 376.168V391.985C224 412.652 199.72 423.454 184.313 410.149L8.309 258.164C-2.777 248.589 -2.762 231.397 8.309 221.836z" /> + <glyph glyph-name="reply" + unicode="" + horiz-adv-x="512" d=" M8.309 258.164L184.313 410.149C199.719 423.454 224 412.653 224 391.985V311.932C384.629 310.093 512 277.9000000000001 512 125.674C512 64.233 472.419 3.365 428.6670000000001 -28.458C415.014 -38.389 395.5560000000001 -25.925 400.5900000000001 -9.827C445.9340000000001 135.185 379.0830000000001 173.683 224 175.915V88C224 67.3 199.7 56.547 184.3130000000001 69.836L8.3090000000001 221.836C-2.7619999999999 231.398 -2.7769999999999 248.589 8.3090000000001 258.164z" /> + <glyph glyph-name="retweet" + unicode="" + horiz-adv-x="640" d=" M629.657 104.402L528.971 3.716C519.598 -5.656 504.403 -5.656 495.03 3.716L394.343 104.402C384.9700000000001 113.775 384.9700000000001 128.971 394.343 138.343L405.166 149.166C414.728 158.728 430.299 158.5059999999999 439.585 148.6739999999999L480 105.882V288H292.451A24.005 24.005 0 0 0 275.48 295.029L259.48 311.029C244.361 326.149 255.069 352 276.451 352H520C533.255 352 544 341.255 544 328V105.882L584.4159999999999 148.674C593.7009999999999 158.505 609.2719999999999 158.728 618.8349999999999 149.166L629.6579999999999 138.343C639.0299999999999 128.971 639.0299999999999 113.774 629.6569999999999 104.402zM364.5190000000001 88.971A23.999000000000002 23.999000000000002 0 0 1 347.548 96H160V278.1190000000001L200.416 235.327C209.702 225.496 225.272 225.273 234.835 234.836L245.657 245.658C255.03 255.031 255.03 270.227 245.657 279.599L144.971 380.284C135.598 389.657 120.402 389.657 111.03 380.284L10.343 279.598C0.97 270.225 0.97 255.029 10.343 245.657L21.165 234.835C30.727 225.273 46.298 225.495 55.584 235.326L96 278.1190000000001V56C96 42.745 106.745 32 120 32H363.549C384.931 32 395.639 57.851 380.52 72.971L364.519 88.971z" /> + <glyph glyph-name="road" + unicode="" + horiz-adv-x="576" d=" M567.3 64.4L429.9 369.8C426 378.5 417.4 384 408 384H311.9L313.8 365.2C314.5 358.1 309 352 301.9 352H274C266.9 352 261.3 358.2 262.1 365.2L264 384H168C158.6 384 150 378.5 146.1 369.8L8.7 64.4C3.2 52.2 0 38.4 0 24C0 10.7 10.7 0 24 0H237.6C230.5 0 224.9 6.2 225.7 13.2L236.5 117.2C237.1 123.3 242.3 128 248.4 128H327.6C333.7000000000001 128 338.9000000000001 123.4 339.5 117.2L350.3 13.2C351 6.1 345.5 0 338.4000000000001 0H552C565.2 0 576 10.7 576 24C576 37.9 573 51.7 567.3 64.4zM254.7 293.2L258 325.2C258.6 331.3 263.8 336 269.9 336H306.1C312.2 336 317.4 331.4 318 325.2L321.3 293.2C322 286.1 316.5 280 309.4 280H266.6C259.5 280 253.9 286.2 254.7 293.2zM321.8 160H254.2C247.1 160 241.5000000000001 166.2 242.3 173.2L249.7 245.2C250.3 251.3 255.5000000000001 256 261.6 256H314.3C320.4000000000001 256 325.6 251.4 326.2 245.2L333.6 173.2C334.5 166.2 328.9 160 321.8 160z" /> + <glyph glyph-name="rocket" + unicode="" + horiz-adv-x="512" d=" M505.1 428.9C503.8 435 499 439.8 492.9 441.1C460.7 448 435.5 448 410.4 448C307.2 448 245.3 392.8 199.1 320H94.9C76.7 320 60.1 309.7 52 293.5L2.6 194.7C-5.4 178.7 6.2 160 24.1 160H119.2C113.3 147.2 107.3 134.5 101.2 122.3C98.1 116.1 99.3 108.7 104.2 103.8L167.8 40.2C172.7 35.3 180.1 34.1 186.3 37.2C198.5 43.3 211.2 49.2 224 55.1V-40C224 -57.8 242.8 -69.4 258.7 -61.5L357.4 -12.1C373.7 -4 383.9 12.7 383.9 30.8V135.2C456.5 181.5 511.9 243.6 511.9 346.3C512 371.5 512 396.7 505.1 428.9zM400 288C373.5 288 352 309.5 352 336S373.5 384 400 384S448 362.5 448 336S426.5 288 400 288z" /> + <glyph glyph-name="rss-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM112 32C85.49 32 64 53.49 64 80S85.49 128 112 128S160 106.51 160 80S138.51 32 112 32zM269.533 32H235.198C229.187 32 224.147 36.636 223.756 42.634C218.542 122.684 154.513 186.554 74.633 191.757C68.636 192.147 64 197.188 64 203.198V237.533C64 244.068 69.468 249.31 75.994 248.9580000000001C186.54 242.9840000000001 274.9910000000001 154.422 280.9580000000001 43.994C281.31 37.468 276.0680000000001 32 269.533 32zM372.56 32H338.226C332.065 32 327.051 36.882 326.799 43.038C321.201 179.573 211.595 289.199 75.039 294.798C68.882 295.051 64 300.065 64 306.226V340.56C64 347.014 69.338 352.224 75.787 351.992C243.617 345.967 377.997 210.801 383.992 43.787C384.224 37.338 379.014 32.0000000000001 372.56 32.0000000000001z" /> + <glyph glyph-name="rss" + unicode="" + horiz-adv-x="448" d=" M128.081 32.041C128.081 -3.328 99.409 -32 64.04 -32S0 -3.328 0 32.041S28.672 96.082 64.041 96.082S128.081 67.409 128.081 32.041zM303.741 -15.209C295.387 139.391 171.556 263.378 16.791 271.741C7.656 272.235 0 264.895 0 255.747V207.678C0 199.263 6.49 192.206 14.887 191.66C126.719 184.376 216.36 94.958 223.659 -17.112C224.206 -25.509 231.263 -31.999 239.677 -31.999H287.746C296.895 -32 304.235 -24.344 303.741 -15.209zM447.99 -15.497C439.596 218.323 251.465 407.555 16.503 415.99C7.473 416.314 0 409.019 0 399.984V351.916C0 343.291 6.835 336.271 15.453 335.9170000000001C206.632 328.078 360.08 174.601 367.918 -16.548C368.271 -25.166 375.291 -32.001 383.917 -32.001H431.985C441.019 -32 448.314 -24.527 447.99 -15.497z" /> + <glyph glyph-name="ruble-sign" + unicode="" + horiz-adv-x="384" d=" M239.36 128C324.48 128 384 187.458 384 272.929S324.48 416 239.36 416H76C69.373 416 64 410.627 64 404V197.368H12C5.373 197.368 0 191.995 0 185.368V140C0 133.373 5.373 128 12 128H64V96H12C5.373 96 0 90.627 0 84V44C0 37.373 5.373 32 12 32H64V-20C64 -26.627 69.373 -32 76 -32H134.56C141.187 -32 146.56 -26.627 146.56 -20V32H308C314.627 32 320 37.373 320 44V84C320 90.627 314.627 96 308 96H146.56V128H239.36zM146.56 347.252H225.28C272 347.252 300.16 318.142 300.16 272.9290000000001C300.16 227.0970000000001 272 197.368 224 197.368H146.56V347.252z" /> + <glyph glyph-name="rupee-sign" + unicode="" + horiz-adv-x="320" d=" M308 352C314.627 352 320 357.373 320 364V404C320 410.627 314.627 416 308 416H12C5.373 416 0 410.627 0 404V359.252C0 352.625 5.373 347.252 12 347.252H97.28C124.588 347.252 145.541 337.294 158.25 320H12C5.373 320 0 314.627 0 308V268C0 261.373 5.373 256 12 256H170.757C164.54 219.914 137.796 197.368 96 197.368H12C5.373 197.368 0 191.995 0 185.368V132.356C0 129.007 1.4 125.81 3.861 123.538L168.913 -28.818A12.001000000000001 12.001000000000001 0 0 1 177.052 -32H259.614C270.538 -32 275.78 -18.592 267.753 -11.182L116.871 128.094C193.37 130.434 248.015 181.489 255.189 256H308C314.627 256 320 261.373 320 268V308C320 314.627 314.627 320 308 320H249.31C245.824 331.541 241.03 342.246 235.058 352H308z" /> + <glyph glyph-name="save" + unicode="" + horiz-adv-x="448" d=" M433.941 318.059L350.059 401.9410000000001A48 48 0 0 1 316.118 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V284.118A48 48 0 0 1 433.941 318.059zM224 32C188.654 32 160 60.654 160 96C160 131.346 188.654 160 224 160S288 131.346 288 96C288 60.654 259.346 32 224 32zM320 336.52V236C320 229.373 314.627 224 308 224H76C69.373 224 64 229.373 64 236V340C64 346.627 69.373 352 76 352H304.52C307.703 352 310.755 350.736 313.005 348.485L316.485 345.005A11.996 11.996 0 0 0 320 336.52z" /> + <glyph glyph-name="search-minus" + unicode="" + horiz-adv-x="512" d=" M304 256V224C304 217.4 298.6 212 292 212H124C117.4 212 112 217.4 112 224V256C112 262.6 117.4 268 124 268H292C298.6 268 304 262.6 304 256zM505 -28.7L476.7 -57C467.3 -66.4 452.1 -66.4 442.8 -57L343 42.7C338.5 47.2 336 53.3 336 59.7V76C300.7 48.4 256.3 32 208 32C93.1 32 0 125.1 0 240S93.1 448 208 448S416 354.9 416 240C416 191.7 399.6 147.3 372 112H388.3C394.7 112 400.8 109.5 405.3 105L505 5.3C514.3 -4.1 514.3 -19.3 505 -28.7zM344 240C344 315.2 283.2 376 208 376S72 315.2 72 240S132.8 104 208 104S344 164.8 344 240z" /> + <glyph glyph-name="search-plus" + unicode="" + horiz-adv-x="512" d=" M304 256V224C304 217.4 298.6 212 292 212H236V156C236 149.4 230.6 144 224 144H192C185.4 144 180 149.4 180 156V212H124C117.4 212 112 217.4 112 224V256C112 262.6 117.4 268 124 268H180V324C180 330.6 185.4 336 192 336H224C230.6 336 236 330.6 236 324V268H292C298.6 268 304 262.6 304 256zM505 -28.7L476.7 -57C467.3 -66.4 452.1 -66.4 442.8 -57L343 42.7C338.5 47.2 336 53.3 336 59.7V76C300.7 48.4 256.3 32 208 32C93.1 32 0 125.1 0 240S93.1 448 208 448S416 354.9 416 240C416 191.7 399.6 147.3 372 112H388.3C394.7 112 400.8 109.5 405.3 105L505 5.3C514.3 -4.1 514.3 -19.3 505 -28.7zM344 240C344 315.2 283.2 376 208 376S72 315.2 72 240S132.8 104 208 104S344 164.8 344 240z" /> + <glyph glyph-name="search" + unicode="" + horiz-adv-x="512" d=" M505 5.3L405.3 105C400.8 109.5 394.7 112 388.3 112H372C399.6 147.3 416 191.7 416 240C416 354.9 322.9 448 208 448S0 354.9 0 240S93.1 32 208 32C256.3 32 300.7 48.4 336 76V59.7C336 53.3 338.5 47.2 343 42.7L442.7 -57C452.1 -66.4 467.3 -66.4 476.6 -57L504.9 -28.7C514.3 -19.3 514.3 -4.1 505 5.3zM208 112C137.3 112 80 169.2 80 240C80 310.7 137.2 368 208 368C278.7 368 336 310.8 336 240C336 169.3 278.8 112 208 112z" /> + <glyph glyph-name="server" + unicode="" + horiz-adv-x="512" d=" M480 288H32C14.327 288 0 302.327 0 320V384C0 401.673 14.327 416 32 416H480C497.673 416 512 401.673 512 384V320C512 302.327 497.673 288 480 288zM432 376C418.745 376 408 365.255 408 352S418.745 328 432 328S456 338.745 456 352S445.255 376 432 376zM368 376C354.745 376 344 365.255 344 352S354.745 328 368 328S392 338.745 392 352S381.255 376 368 376zM480 128H32C14.327 128 0 142.327 0 160V224C0 241.673 14.327 256 32 256H480C497.673 256 512 241.673 512 224V160C512 142.327 497.673 128 480 128zM432 216C418.745 216 408 205.255 408 192S418.745 168 432 168S456 178.745 456 192S445.255 216 432 216zM368 216C354.745 216 344 205.255 344 192S354.745 168 368 168S392 178.745 392 192S381.255 216 368 216zM480 -32H32C14.327 -32 0 -17.673 0 0V64C0 81.673 14.327 96 32 96H480C497.673 96 512 81.673 512 64V0C512 -17.673 497.673 -32 480 -32zM432 56C418.745 56 408 45.255 408 32S418.745 8 432 8S456 18.745 456 32S445.255 56 432 56zM368 56C354.745 56 344 45.255 344 32S354.745 8 368 8S392 18.745 392 32S381.255 56 368 56z" /> + <glyph glyph-name="share-alt-square" + unicode="" + horiz-adv-x="448" d=" M448 368V16C448 -10.51 426.51 -32 400 -32H48C21.49 -32 0 -10.51 0 16V368C0 394.51 21.49 416 48 416H400C426.51 416 448 394.51 448 368zM304 152C289.438 152 276.177 146.439 266.217 137.329L198.259 178.104A56.33899999999999 56.33899999999999 0 0 1 198.259 205.897L266.217 246.672C276.177 237.561 289.438 232 304 232C334.928 232 360 257.072 360 288S334.928 344 304 344S248 318.928 248 288C248 283.203 248.605 278.5470000000001 249.74 274.103L181.782 233.328C171.823 242.439 158.562 248 144 248C113.072 248 88 222.928 88 192S113.072 136 144 136C158.562 136 171.823 141.561 181.783 150.671L249.741 109.896A56.08800000000001 56.08800000000001 0 0 1 248.001 95.999C248.001 65.071 273.073 39.999 304.001 39.999S360.001 65.071 360.001 95.999C360 126.928 334.928 152 304 152z" /> + <glyph glyph-name="share-alt" + unicode="" + horiz-adv-x="448" d=" M352 128C329.392 128 308.613 120.181 292.21 107.105L189.724 171.159A96.551 96.551 0 0 1 189.724 212.842L292.21 276.896C308.613 263.819 329.392 256 352 256C405.019 256 448 298.981 448 352S405.019 448 352 448S256 405.019 256 352C256 344.842 256.79 337.87 258.276 331.159L155.79 267.105C139.387 280.1810000000001 118.608 288 96 288C42.981 288 0 245.019 0 192S42.981 96 96 96C118.608 96 139.387 103.819 155.79 116.895L258.276 52.841A96.301 96.301 0 0 1 256 32C256 -21.019 298.981 -64 352 -64S448 -21.019 448 32S405.019 128 352 128z" /> + <glyph glyph-name="share-square" + unicode="" + horiz-adv-x="576" d=" M568.482 270.552L424.479 134.567C409.3 120.232 384 130.86 384 152.015V223.978C239.425 223.008 178.434 188.865 219.225 52.625C223.708 37.652 206.379 26.058 194.219 35.295C155.252 64.895 120 121.512 120 178.661C120 322.598 237.599 351.161 384 351.973V423.988C384 445.162 409.317 455.756 424.479 441.436L568.482 305.448C578.502 295.985 578.51 280.023 568.482 270.552zM384 68.872V0H64V320H114.916A11.989999999999998 11.989999999999998 0 0 1 123.564 323.693C138.517 339.261 155.801 351.583 174.578 361.3690000000001C185.708 367.17 181.584 384 169.033 384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V72.806C448 81.094 439.803 86.872 431.989 84.108A71.83 71.83 0 0 0 397.8 80.731C390.53 81.777 384 76.217 384 68.872z" /> + <glyph glyph-name="share" + unicode="" + horiz-adv-x="512" d=" M503.691 258.164L327.687 410.149C312.281 423.454 288 412.653 288 391.985V311.932C127.371 310.093 0 277.9 0 125.674C0 64.233 39.581 3.365 83.333 -28.458C96.986 -38.389 116.444 -25.925 111.41 -9.827C66.066 135.186 132.917 173.684 288 175.915V88C288 67.3 312.3 56.547 327.687 69.836L503.691 221.836C514.7620000000001 231.398 514.777 248.589 503.691 258.164z" /> + <glyph glyph-name="shekel-sign" + unicode="" + horiz-adv-x="448" d=" M170.12 352H80V-20C80 -26.627 74.627 -32 68 -32H12C5.373 -32 0 -26.627 0 -20V404C0 410.627 5.373 416 12 416H180.36C265.48 416 325 358.4 325 272.929V89C325 82.373 319.627 77 313 77H269C255.745 77 245 87.745 245 101V277.677C245 322.89 216.839 352 170.12 352zM436 416H380C373.373 416 368 410.627 368 404V32H277.88C231.16 32 203 61.11 203 106.323V283C203 296.255 192.255 307 179 307H135C128.373 307 123 301.627 123 295V111.071C123 25.6 182.52 -32 267.64 -32H436C442.627 -32 448 -26.627 448 -20V404C448 410.627 442.627 416 436 416z" /> + <glyph glyph-name="shield-alt" + unicode="" + horiz-adv-x="512" d=" M496 320C496 98.718 360.0660000000001 -24.645 274.461 -60.308A48 48 0 0 0 237.538 -60.308C130.495 -15.713 16 121.513 16 320A48 48 0 0 0 45.539 364.308L237.539 444.308A48 48 0 0 0 274.462 444.308L466.462 364.308A48 48 0 0 0 496 320zM256 1.687L256.066 1.653C349.801 48.342 428.563 157.961 431.883 309.382L256 382.6670000000001V1.687z" /> + <glyph glyph-name="ship" + unicode="" + horiz-adv-x="640" d=" M496.616 75.361L566.6279999999999 145.373C583.5269999999999 162.273 576.5699999999999 191.144 553.7919999999999 198.465L512 211.898V352C512 369.673 497.673 384 480 384H416V424C416 437.255 405.255 448 392 448H248C234.745 448 224 437.255 224 424V384H160C142.327 384 128 369.673 128 352V211.898L86.208 198.465C63.455 191.152 56.454 162.292 73.372 145.373L143.384 75.361C125.828 31.713 85.587 0 24 0C10.745 0 0 -10.745 0 -24V-40C0 -53.255 10.745 -64 24 -64C85.023 -64 131.499 -43.39 167.258 -4.604C181.677 -39.432 216.021 -64 256 -64H384C423.979 -64 458.323 -39.432 472.742 -4.604C508.495 -43.384 554.968 -64 616 -64C629.255 -64 640 -53.255 640 -40V-24C640 -10.745 629.255 0 616 0C555.183 0 514.458 31.001 496.616 75.361zM192 320H448V232.469L329.7920000000001 270.464A31.995 31.995 0 0 1 310.2080000000001 270.464L192 232.469V320z" /> + <glyph glyph-name="shipping-fast" + unicode="" + horiz-adv-x="640" d=" M624 96H608V204.1C608 216.8 602.9 229 593.9 238L494 337.9C485 346.9 472.8 352 460.1 352H416V400C416 426.5 394.5 448 368 448H112C85.5 448 64 426.5 64 400V352H8C3.6 352 0 348.4 0 344V328C0 323.6 3.6 320 8 320H280C284.4 320 288 316.4 288 312V296C288 291.6 284.4 288 280 288H40C35.6 288 32 284.4 32 280V264C32 259.6 35.6 256 40 256H248C252.4 256 256 252.4 256 248V232C256 227.6 252.4 224 248 224H8C3.6 224 0 220.4 0 216V200C0 195.6 3.6 192 8 192H216C220.4 192 224 188.4 224 184V168C224 163.6 220.4 160 216 160H64V32C64 -21 107 -64 160 -64S256 -21 256 32H384C384 -21 427 -64 480 -64S576 -21 576 32H624C632.8 32 640 39.2 640 48V80C640 88.8 632.8 96 624 96zM160 -16C133.5 -16 112 5.5 112 32S133.5 80 160 80S208 58.5 208 32S186.5 -16 160 -16zM480 -16C453.5 -16 432 5.5 432 32S453.5 80 480 80S528 58.5 528 32S506.5 -16 480 -16zM560 192H416V304H460.1L560 204.1V192z" /> + <glyph glyph-name="shopping-bag" + unicode="" + horiz-adv-x="448" d=" M352 288V320C352 390.58 294.579 448 224 448C153.42 448 96 390.58 96 320V288H0V16C0 -28.183 35.817 -64 80 -64H368C412.183 -64 448 -28.183 448 16V288H352zM160 320C160 355.29 188.71 384 224 384S288 355.29 288 320V288H160V320zM320 200C306.745 200 296 210.745 296 224S306.745 248 320 248S344 237.255 344 224S333.255 200 320 200zM128 200C114.745 200 104 210.745 104 224S114.745 248 128 248S152 237.255 152 224S141.255 200 128 200z" /> + <glyph glyph-name="shopping-basket" + unicode="" + horiz-adv-x="576" d=" M576 232V216C576 202.745 565.255 192 552 192H544L517.887 9.212C514.509 -14.435 494.257 -32 470.37 -32H105.63C81.743 -32 61.491 -14.435 58.112 9.212L32 192H24C10.745 192 0 202.745 0 216V232C0 245.255 10.745 256 24 256H91.341L198.121 402.8210000000001C208.516 417.113 228.528 420.274 242.822 409.879C257.115 399.484 260.275 379.471 249.88 365.178L170.477 256H405.523L326.12 365.179C315.725 379.471 318.886 399.485 333.1790000000001 409.88C347.4700000000001 420.275 367.485 417.115 377.8800000000001 402.822L484.659 256H552C565.255 256 576 245.255 576 232zM312 56V168C312 181.255 301.255 192 288 192S264 181.255 264 168V56C264 42.745 274.745 32 288 32S312 42.745 312 56zM424 56V168C424 181.255 413.255 192 400 192S376 181.255 376 168V56C376 42.745 386.745 32 400 32S424 42.745 424 56zM200 56V168C200 181.255 189.255 192 176 192S152 181.255 152 168V56C152 42.745 162.745 32 176 32S200 42.745 200 56z" /> + <glyph glyph-name="shopping-cart" + unicode="" + horiz-adv-x="576" d=" M528.12 146.681L575.393 354.681C578.806 369.699 567.391 384 551.99 384H159.208L150.042 428.81C147.758 439.979 137.93 448 126.529 448H24C10.745 448 0 437.255 0 424V408C0 394.745 10.745 384 24 384H93.883L164.131 40.565C147.325 30.9 136 12.778 136 -8C136 -38.928 161.072 -64 192 -64S248 -38.928 248 -8C248 7.674 241.553 21.835 231.176 32H440.823C430.447 21.835 424 7.674 424 -8C424 -38.928 449.072 -64 480 -64S536 -38.928 536 -8C536 14.172 523.112 33.332 504.421 42.405L509.938 66.681C513.351 81.699 501.936 96 486.535 96H218.117L211.572 128H504.717C515.923 128 525.637 135.754 528.12 146.681z" /> + <glyph glyph-name="shower" + unicode="" + horiz-adv-x="512" d=" M389.6600000000001 312.4L231.6 154.34C222.23 144.97 207.03 144.97 197.66 154.34L186.34 165.66C176.97 175.03 176.97 190.23 186.34 199.6L186.45 199.71C152.42 239.92 151.29 298.65 183.06 340.09C171.09 347.64 156.92 352 141.7600000000001 352C98.88 352 64 317.12 64 274.24V-32H0V274.24C0 352.41 63.59 416 141.76 416C178.69 416 212.37 401.8 237.62 378.58C273.52 390.09 314.12 383.08 344.29 357.55L344.4000000000001 357.66C353.7700000000001 367.03 368.9700000000001 367.03 378.3400000000001 357.66L389.6600000000001 346.3400000000001C399.0300000000001 336.9700000000001 399.0300000000001 321.77 389.6600000000001 312.4zM384 240C384 231.163 376.837 224 368 224S352 231.163 352 240S359.163 256 368 256S384 248.837 384 240zM416 240C416 248.837 423.163 256 432 256S448 248.837 448 240S440.837 224 432 224S416 231.163 416 240zM512 240C512 231.163 504.837 224 496 224S480 231.163 480 240S487.163 256 496 256S512 248.837 512 240zM352 208C352 199.163 344.837 192 336 192S320 199.163 320 208S327.163 224 336 224S352 216.837 352 208zM400 224C408.837 224 416 216.837 416 208S408.837 192 400 192S384 199.163 384 208S391.163 224 400 224zM480 208C480 199.163 472.837 192 464 192S448 199.163 448 208S455.163 224 464 224S480 216.837 480 208zM320 176C320 167.163 312.837 160 304 160S288 167.163 288 176S295.163 192 304 192S320 184.837 320 176zM352 176C352 184.837 359.163 192 368 192S384 184.837 384 176S376.837 160 368 160S352 167.163 352 176zM448 176C448 167.163 440.837 160 432 160S416 167.163 416 176S423.163 192 432 192S448 184.837 448 176zM320 144C320 152.837 327.163 160 336 160S352 152.837 352 144S344.837 128 336 128S320 135.163 320 144zM416 144C416 135.163 408.837 128 400 128S384 135.163 384 144S391.163 160 400 160S416 152.837 416 144zM320 112C320 103.163 312.837 96 304 96S288 103.163 288 112S295.163 128 304 128S320 120.837 320 112zM384 112C384 103.163 376.837 96 368 96S352 103.163 352 112S359.163 128 368 128S384 120.837 384 112zM352 80C352 71.163 344.837 64 336 64S320 71.163 320 80S327.163 96 336 96S352 88.837 352 80zM320 48C320 39.163 312.837 32 304 32S288 39.163 288 48S295.163 64 304 64S320 56.837 320 48z" /> + <glyph glyph-name="sign-in-alt" + unicode="" + horiz-adv-x="512" d=" M416 0H332C325.4 0 320 5.4 320 12V52C320 58.6 325.4 64 332 64H416C433.7 64 448 78.3 448 96V288C448 305.7 433.7 320 416 320H332C325.4 320 320 325.4 320 332V372C320 378.6 325.4 384 332 384H416C469 384 512 341 512 288V96C512 43 469 0 416 0zM369 201L201 369C186 384 160 373.5 160 352V256H24C10.7 256 0 245.3 0 232V136C0 122.7 10.7 112 24 112H160V16C160 -5.5 186 -16 201 -1L369 167C378.3 176.4 378.3 191.6 369 201z" /> + <glyph glyph-name="sign-language" + unicode="" + horiz-adv-x="448" d=" M91.434 -35.987C91.127 -19.969 104.543 -6.858 120.564 -6.858H182.857V-1.144H56.993C40.972 -1.144 27.556 11.967 27.863 27.985C28.16 43.509 40.835 56 56.428 56H182.857V61.714H29.136C13.115 61.714 -0.301 74.825 0.006 90.843C0.303 106.365 12.979 118.856 28.572 118.856H182.858V124.57H57.707C41.686 124.57 28.27 137.681 28.577 153.699C28.874 169.221 41.55 181.712 57.143 181.712H225.709L194.624 204.318C181.862 213.599 179.041 231.467 188.322 244.23C197.603 256.991 215.472 259.812 228.234 250.532L351.5950000000001 160.817A34.287 34.287 0 0 0 365.7150000000001 133.089V-8.047C365.7150000000001 -23.957 354.769 -37.777 339.2820000000001 -41.421L258.8110000000001 -60.3550000000001A137.16 137.16 0 0 0 227.4000000000001 -64.0010000000001H120C104.407 -64.0000000000001 91.731 -51.5090000000001 91.434 -35.9870000000001zM164.683 189.714H201.106L189.919 197.8499999999999C171.34 211.3609999999999 169.606 238.737 186.749 254.386L173.745 271.0859999999999C163.902 283.7269999999999 145.315 286.257 132.865 276.1739999999999C120.8 266.4029999999999 118.732 248.7269999999999 128.312 236.4239999999999L164.683 189.714zM447.981 191.817L442.978 344.269C442.4600000000001 360.04 429.2560000000001 372.405 413.485 371.8879999999999C397.712 371.37 385.348 358.166 385.866 342.395L387.128 303.98L283.565 436.981C273.985 449.284 256.342 451.611 243.912 442.3090000000001C231.085 432.71 228.983 414.069 238.826 401.428L315.715 302.683L311.206 299.1720000000001L216.416 420.906C206.8359999999999 433.209 189.1929999999999 435.536 176.763 426.234C163.936 416.635 161.834 397.994 171.6769999999999 385.353L266.12 264.065L261.611 260.554L183.9359999999999 360.308C174.3559999999999 372.611 156.7129999999999 374.938 144.2829999999999 365.636C131.4559999999999 356.0370000000001 129.3539999999999 337.396 139.1969999999999 324.755L191.2499999999999 257.906C203.7469999999999 266.163 220.3049999999999 266.1910000000001 232.9399999999999 257.002L356.2999999999999 167.288C367.2039999999999 159.358 373.7149999999999 146.573 373.7149999999999 133.09V116.091L434.779 163.64A34.285 34.285 0 0 1 447.981 191.817z" /> + <glyph glyph-name="sign-out-alt" + unicode="" + horiz-adv-x="512" d=" M497 175L329 7C314 -8 288 2.5 288 24V120H152C138.7 120 128 130.7 128 144V240C128 253.3 138.7 264 152 264H288V360C288 381.4 313.9 392 329 377L497 209C506.3 199.6 506.3 184.4 497 175zM192 12V52C192 58.6 186.6 64 180 64H96C78.3 64 64 78.3 64 96V288C64 305.7 78.3 320 96 320H180C186.6 320 192 325.4 192 332V372C192 378.6 186.6 384 180 384H96C43 384 0 341 0 288V96C0 43 43 0 96 0H180C186.6 0 192 5.4 192 12z" /> + <glyph glyph-name="signal" + unicode="" + horiz-adv-x="640" d=" M36 64H92C98.6 64 104 58.6 104 52V-52C104 -58.6 98.6 -64 92 -64H36C29.4 -64 24 -58.6 24 -52V52C24 58.6 29.4 64 36 64zM152 100V-52C152 -58.6 157.4 -64 164 -64H220C226.6 -64 232 -58.6 232 -52V100C232 106.6 226.6 112 220 112H164C157.4 112 152 106.6 152 100zM280 180V-52C280 -58.6 285.4 -64 292 -64H348C354.6 -64 360 -58.6 360 -52V180C360 186.6 354.6 192 348 192H292C285.4 192 280 186.6 280 180zM408 292V-52C408 -58.6 413.4 -64 420 -64H476C482.6 -64 488 -58.6 488 -52V292C488 298.6 482.6 304 476 304H420C413.4 304 408 298.6 408 292zM536 436V-52C536 -58.6 541.4 -64 548 -64H604C610.6 -64 616 -58.6 616 -52V436C616 442.6 610.6 448 604 448H548C541.4 448 536 442.6 536 436z" /> + <glyph glyph-name="sitemap" + unicode="" + horiz-adv-x="640" d=" M616 128H568V176C568 198.056 550.056 216 528 216H344V256H392C405.255 256 416 266.745 416 280V424C416 437.255 405.255 448 392 448H248C234.745 448 224 437.255 224 424V280C224 266.745 234.745 256 248 256H296V216H112C89.944 216 72 198.056 72 176V128H24C10.745 128 0 117.255 0 104V-40C0 -53.255 10.745 -64 24 -64H168C181.255 -64 192 -53.255 192 -40V104C192 117.255 181.255 128 168 128H120V168H296V128H248C234.745 128 224 117.255 224 104V-40C224 -53.255 234.745 -64 248 -64H392C405.255 -64 416 -53.255 416 -40V104C416 117.255 405.255 128 392 128H344V168H520V128H472C458.745 128 448 117.255 448 104V-40C448 -53.255 458.745 -64 472 -64H616C629.255 -64 640 -53.255 640 -40V104C640 117.255 629.255 128 616 128z" /> + <glyph glyph-name="sliders-h" + unicode="" + horiz-adv-x="576" d=" M576 368V328C576 321.4 570.6 316 564 316H160V308C160 294.7 149.3 284 136 284H120C106.7 284 96 294.7 96 308V316H12C5.4 316 0 321.4 0 328V368C0 374.6 5.4 380 12 380H96V388C96 401.3 106.7 412 120 412H136C149.3 412 160 401.3 160 388V380H564C570.6 380 576 374.6 576 368zM564 220H480V228C480 241.3 469.3 252 456 252H440C426.7 252 416 241.3 416 228V220H12C5.4 220 0 214.6 0 208V168C0 161.4 5.4 156 12 156H416V148C416 134.7 426.7 124 440 124H456C469.3 124 480 134.7 480 148V156H564C570.6 156 576 161.4 576 168V208C576 214.6 570.6 220 564 220zM564 60H288V68C288 81.3 277.3 92 264 92H248C234.7 92 224 81.3 224 68V60H12C5.4 60 0 54.6 0 48V8C0 1.4 5.4 -4 12 -4H224V-12C224 -25.3 234.7 -36 248 -36H264C277.3 -36 288 -25.3 288 -12V-4H564C570.6 -4 576 1.4 576 8V48C576 54.6 570.6 60 564 60z" /> + <glyph glyph-name="smile" + unicode="" + horiz-adv-x="512" d=" M504 192C504 55.033 392.967 -56 256 -56S8 55.033 8 192S119.033 440 256 440S504 328.967 504 192zM381.474 116.66C392.953 134.415 366.125 151.854 354.601 134.034C301.183 51.407 210.891 51.353 157.437 134.034C145.935 151.824 119.073 134.435 130.564 116.66C196.578 14.553 315.3590000000001 14.395 381.4740000000001 116.66zM108 256C108 218.503 138.503 188 176 188S244 218.503 244 256S213.497 324 176 324S108 293.497 108 256zM268.5 256C268.5 218.779 298.779 188.5 336 188.5S403.5 218.779 403.5 256S373.221 323.5 336 323.5S268.5 293.221 268.5 256zM336 304A47.789 47.789 0 0 1 313.397 298.353H313.412C324.328 298.353 333.177 289.504 333.177 278.588S324.328 258.8230000000001 313.412 258.8230000000001S293.647 267.6720000000001 293.647 278.588V278.603A47.789 47.789 0 0 1 288 256C288 229.49 309.49 208 336 208S384 229.49 384 256S362.51 304 336 304zM176 304A47.789 47.789 0 0 1 153.397 298.353H153.412C164.328 298.353 173.177 289.504 173.177 278.588S164.328 258.8230000000001 153.412 258.8230000000001S133.647 267.6720000000001 133.647 278.588V278.603A47.789 47.789 0 0 1 128 256C128 229.49 149.49 208 176 208S224 229.49 224 256S202.51 304 176 304z" /> + <glyph glyph-name="snowflake" + unicode="" + horiz-adv-x="448" d=" M444.816 146.361A24.12 24.12 0 0 1 447.477 163.339C444.752 176.305 432.138 184.584 419.303 181.831L331.896 156.785L264 192L331.896 227.215L419.303 202.169C432.138 199.416 444.752 207.695 447.477 220.661C450.202 233.627 442.006 246.369 429.172 249.122L381.695 256.259L434.772 287.2150000000001C446.135 293.842 450.029 308.521 443.468 320C436.9070000000001 331.479 422.377 335.4120000000001 411.014 328.785L357.937 297.829L375.558 342.933C379.615 355.539 372.79 369.079 360.311 373.178C347.833 377.2770000000001 334.428 370.3810000000001 330.371 357.776L308.139 268.786L247.759 233.571V304L312.9340000000001 367.945C321.7120000000001 377.7970000000001 320.9210000000001 392.972 311.168 401.839C301.415 410.706 286.3930000000001 409.907 277.616 400.055L247.759 362.088V424C247.759 437.255 237.122 448 224.001 448S200.243 437.255 200.243 424V362.088L170.386 400.055C161.607 409.907 146.587 410.707 136.834 401.839C127.081 392.972 126.291 377.7970000000001 135.068 367.945L200.242 304V233.569L139.862 268.784L117.63 357.774C113.573 370.379 100.168 377.2750000000001 87.69 373.1760000000001C75.212 369.077 68.386 355.536 72.443 342.9310000000001L90.063 297.827L36.986 328.783C25.623 335.41 11.093 331.477 4.532 319.998S1.865 293.841 13.228 287.213L66.305 256.257L18.828 249.12C5.993 246.366 -2.203 233.625 0.523 220.659C3.248 207.694 15.862 199.414 28.697 202.167L116.104 227.213L184 192L116.104 156.785L28.698 181.83C15.863 184.583 3.249 176.304 0.524 163.338C-2.201 150.371 5.994 137.63 18.829 134.877L66.306 127.74L13.229 96.7839999999999C1.866 90.157 -2.027 75.479 4.533 64S25.624 48.588 36.987 55.215L90.064 86.171L72.444 41.067A24.157 24.157 0 0 1 74.466 21.639C77.297 16.686 81.882 12.73 87.69 10.823C100.168 6.724 113.573 13.6200000000001 117.63 26.225L139.862 115.215L200.242 150.4300000000001V80L135.067 16.055C126.289 6.203 127.08 -8.972 136.833 -17.839C146.587 -26.707 161.607 -25.907 170.385 -16.055L200.242 21.912V-40C200.242 -53.255 210.879 -64 224 -64S247.758 -53.255 247.758 -40V21.912L277.615 -16.055A23.59 23.59 0 0 1 295.282 -24A23.534 23.534 0 0 1 311.167 -17.839C320.92 -8.972 321.711 6.203 312.933 16.055L247.758 80V150.431L308.1380000000001 115.216L330.37 26.226C334.427 13.621 347.832 6.725 360.31 10.824C372.789 14.923 379.614 28.464 375.557 41.069L357.9360000000001 86.173L411.0130000000001 55.217C422.3760000000001 48.59 436.9060000000001 52.523 443.4670000000001 64.002S446.134 90.159 434.771 96.787L381.694 127.7430000000001L429.171 134.8800000000001C436.031 136.3490000000001 441.565 140.6730000000001 444.816 146.3610000000001z" /> + <glyph glyph-name="sort-alpha-down" + unicode="" + horiz-adv-x="448" d=" M187.298 52.686L107.314 -27.316C101.066 -33.563 90.931 -33.561 84.687 -27.316L4.705 52.686C-5.365 62.756 1.807 80 16.019 80H64V400C64 408.837 71.163 416 80 416H112C120.837 416 128 408.837 128 400V80H175.984C190.225 80 197.347 62.736 187.298 52.686zM306.373 232.693A12 12 0 0 0 294.838 224H259.1210000000001C250.9010000000001 224 245.1140000000001 232.078 247.7590000000001 239.861L304.855 407.861A12 12 0 0 0 316.217 416H355.783C360.9220000000001 416 365.4910000000001 412.727 367.1450000000001 407.861L424.2410000000001 239.861C426.886 232.078 421.1 224 412.879 224H377.144A12 12 0 0 0 365.629 232.622L357.3280000000001 260.9210000000001H314.4650000000001L306.3730000000001 232.693zM329.23 311.39H342.5970000000001L335.997 334.327L329.23 311.39zM341.805 24.067L409.256 119.765A12 12 0 0 1 411.448 126.678V148C411.448 154.627 406.075 160 399.448 160H274.522C267.895 160 262.522 154.627 262.522 148V119.07C262.522 112.443 267.895 107.07 274.522 107.07H330.991C330.252 106.079 329.494 105.034 328.721 103.937L261.5180000000001 8.732A12.001000000000001 12.001000000000001 0 0 1 259.322 1.812V-20C259.322 -26.627 264.695 -32 271.322 -32H400.677C407.3040000000001 -32 412.677 -26.627 412.677 -20V8.93C412.677 15.557 407.3040000000001 20.93 400.677 20.93H339.531C340.271 21.923 341.031 22.969 341.805 24.067z" /> + <glyph glyph-name="sort-alpha-up" + unicode="" + horiz-adv-x="448" d=" M4.702 331.314L84.686 411.316C90.934 417.563 101.069 417.561 107.313 411.316L187.294 331.314C197.364 321.2440000000001 190.193 304 175.98 304H128V-16C128 -24.837 120.837 -32 112 -32H80C71.163 -32 64 -24.837 64 -16V304H16.016C1.775 304 -5.347 321.264 4.702 331.314zM306.373 232.693A12 12 0 0 0 294.838 224H259.1210000000001C250.9010000000001 224 245.1140000000001 232.078 247.7590000000001 239.861L304.855 407.861A12 12 0 0 0 316.217 416H355.783C360.9220000000001 416 365.4910000000001 412.727 367.1450000000001 407.861L424.2410000000001 239.861C426.886 232.078 421.1 224 412.879 224H377.144A12 12 0 0 0 365.629 232.622L357.3280000000001 260.9210000000001H314.4650000000001L306.3730000000001 232.693zM329.23 311.39H342.5970000000001L335.997 334.327L329.23 311.39zM341.805 24.067L409.256 119.765A12 12 0 0 1 411.448 126.678V148C411.448 154.627 406.075 160 399.448 160H274.522C267.895 160 262.522 154.627 262.522 148V119.07C262.522 112.443 267.895 107.07 274.522 107.07H330.991C330.252 106.079 329.494 105.034 328.721 103.937L261.5180000000001 8.732A12.001000000000001 12.001000000000001 0 0 1 259.322 1.812V-20C259.322 -26.627 264.695 -32 271.322 -32H400.677C407.3040000000001 -32 412.677 -26.627 412.677 -20V8.93C412.677 15.557 407.3040000000001 20.93 400.677 20.93H339.531C340.271 21.923 341.031 22.969 341.805 24.067z" /> + <glyph glyph-name="sort-amount-down" + unicode="" + horiz-adv-x="512" d=" M187.298 52.686L107.314 -27.316C101.066 -33.563 90.931 -33.561 84.687 -27.316L4.705 52.686C-5.365 62.756 1.807 80 16.019 80H64V400C64 408.837 71.163 416 80 416H112C120.837 416 128 408.837 128 400V80H175.984C190.225 80 197.347 62.736 187.298 52.686zM240 352H496C504.837 352 512 359.163 512 368V400C512 408.837 504.837 416 496 416H240C231.163 416 224 408.837 224 400V368C224 359.163 231.163 352 240 352zM224 240V272C224 280.837 231.163 288 240 288H432C440.837 288 448 280.837 448 272V240C448 231.163 440.837 224 432 224H240C231.163 224 224 231.163 224 240zM224 -16V16C224 24.837 231.163 32 240 32H304C312.837 32 320 24.837 320 16V-16C320 -24.837 312.837 -32 304 -32H240C231.163 -32 224 -24.837 224 -16zM224 112V144C224 152.837 231.163 160 240 160H368C376.837 160 384 152.837 384 144V112C384 103.163 376.837 96 368 96H240C231.163 96 224 103.163 224 112z" /> + <glyph glyph-name="sort-amount-up" + unicode="" + horiz-adv-x="512" d=" M4.702 331.314L84.686 411.316C90.934 417.563 101.069 417.561 107.313 411.316L187.294 331.314C197.364 321.2440000000001 190.193 304 175.98 304H128V-16C128 -24.837 120.837 -32 112 -32H80C71.163 -32 64 -24.837 64 -16V304H16.016C1.775 304 -5.347 321.264 4.702 331.314zM240 352H496C504.837 352 512 359.163 512 368V400C512 408.837 504.837 416 496 416H240C231.163 416 224 408.837 224 400V368C224 359.163 231.163 352 240 352zM224 240V272C224 280.837 231.163 288 240 288H432C440.837 288 448 280.837 448 272V240C448 231.163 440.837 224 432 224H240C231.163 224 224 231.163 224 240zM224 -16V16C224 24.837 231.163 32 240 32H304C312.837 32 320 24.837 320 16V-16C320 -24.837 312.837 -32 304 -32H240C231.163 -32 224 -24.837 224 -16zM224 112V144C224 152.837 231.163 160 240 160H368C376.837 160 384 152.837 384 144V112C384 103.163 376.837 96 368 96H240C231.163 96 224 103.163 224 112z" /> + <glyph glyph-name="sort-down" + unicode="" + horiz-adv-x="320" d=" M41 160H279C300.4 160 311.1 134.1 296 119L177 0C167.6 -9.4 152.4 -9.4 143.1 0L24 119C8.9 134.1 19.6 160 41 160z" /> + <glyph glyph-name="sort-numeric-down" + unicode="" + horiz-adv-x="448" d=" M308.811 334.213L289.363 355.008C284.841 359.844 285.089 367.429 289.919 371.958L333.362 412.699A11.999000000000002 11.999000000000002 0 0 0 341.571 415.9460000000001H373.162C379.789 415.9460000000001 385.162 410.573 385.162 403.9460000000001V276.876H410.822C417.449 276.876 422.822 271.5030000000001 422.822 264.876V235.946C422.822 229.319 417.449 223.946 410.822 223.946H301.649C295.022 223.946 289.649 229.319 289.649 235.946V264.876C289.649 271.5030000000001 295.022 276.876 301.649 276.876H327.063V334.814C319.809 328.2340000000001 312.852 329.8930000000001 308.811 334.213zM278.241 95.644C278.241 128.297 302.106 163 346.335 163C384.588 163 425.759 134.139 425.759 70.772C425.759 19.496 393.522 -35 333.776 -35C315.94 -35 303.23 -31.443 295.228 -28.219C289.438 -25.886 286.439 -19.473 288.306 -13.516L297.543 15.964C299.5780000000001 22.46 306.592 25.947 313.01 23.68C326.039 19.078 340.888 18.405 351.113 27.818C312.371 22.746 278.241 53.178 278.241 95.644zM370.514 76.306C370.514 98.591 355.212 112.811 344.6790000000001 112.811C336.0370000000001 112.811 331.5150000000001 104.846 331.5150000000001 96.979C331.5150000000001 91.31 333.3300000000001 72.811 356.6830000000001 72.811C366.6560000000001 72.811 370.0600000000001 74.965 370.427 75.542C370.4480000000001 75.588 370.514 75.833 370.514 76.306zM175.984 80H128V400C128 408.837 120.837 416 112 416H80C71.163 416 64 408.837 64 400V80H16.019C1.807 80 -5.365 62.756 4.705 52.686L84.686 -27.316C90.931 -33.561 101.066 -33.563 107.313 -27.316L187.297 52.686C197.347 62.736 190.225 80 175.984 80z" /> + <glyph glyph-name="sort-numeric-up" + unicode="" + horiz-adv-x="448" d=" M308.811 334.213L289.363 355.008C284.841 359.844 285.089 367.429 289.919 371.958L333.362 412.699A11.999000000000002 11.999000000000002 0 0 0 341.571 415.9460000000001H373.162C379.789 415.9460000000001 385.162 410.573 385.162 403.9460000000001V276.876H410.822C417.449 276.876 422.822 271.5030000000001 422.822 264.876V235.946C422.822 229.319 417.449 223.946 410.822 223.946H301.649C295.022 223.946 289.649 229.319 289.649 235.946V264.876C289.649 271.5030000000001 295.022 276.876 301.649 276.876H327.063V334.814C319.809 328.2340000000001 312.852 329.8930000000001 308.811 334.213zM278.241 95.644C278.241 128.297 302.106 163 346.335 163C384.588 163 425.759 134.139 425.759 70.772C425.759 19.496 393.522 -35 333.776 -35C315.94 -35 303.23 -31.443 295.228 -28.219C289.438 -25.886 286.439 -19.473 288.306 -13.516L297.543 15.964C299.5780000000001 22.46 306.592 25.947 313.01 23.68C326.039 19.078 340.888 18.405 351.113 27.818C312.371 22.746 278.241 53.178 278.241 95.644zM370.514 76.306C370.514 98.591 355.212 112.811 344.6790000000001 112.811C336.0370000000001 112.811 331.5150000000001 104.846 331.5150000000001 96.979C331.5150000000001 91.31 333.3300000000001 72.811 356.6830000000001 72.811C366.6560000000001 72.811 370.0600000000001 74.965 370.427 75.542C370.4480000000001 75.588 370.514 75.833 370.514 76.306zM16.016 304H64V-16C64 -24.837 71.163 -32 80 -32H112C120.837 -32 128 -24.837 128 -16V304H175.981C190.193 304 197.365 321.2440000000001 187.295 331.314L107.314 411.316C101.069 417.561 90.934 417.563 84.687 411.316L4.702 331.314C-5.347 321.264 1.775 304 16.016 304z" /> + <glyph glyph-name="sort-up" + unicode="" + horiz-adv-x="320" d=" M279 224H41C19.6 224 8.9 249.9 24 265L143 384C152.4 393.4 167.6 393.4 176.9 384L295.9 265C311.1 249.9 300.4 224 279 224z" /> + <glyph glyph-name="sort" + unicode="" + horiz-adv-x="320" d=" M41 160H279C300.4 160 311.1 134.1 296 119L177 0C167.6 -9.4 152.4 -9.4 143.1 0L24 119C8.9 134.1 19.6 160 41 160zM296 265L177 384C167.6 393.4 152.4 393.4 143.1 384L24 265C8.9 249.9 19.6 224 41 224H279C300.4 224 311.1 249.9 296 265z" /> + <glyph glyph-name="space-shuttle" + unicode="" + horiz-adv-x="640" d=" M592.604 239.756C559.735 255.164 515.777 264 472 264H186.327C181.375 270.555 175.742 275.978 169.607 280H376C229.157 310.253 219.403 416 96.003 416H96V288H80V416C53.49 416 32 387.346 32 352V288C8.803 288 0 277.968 0 264V224C0 210.017 8.819 200 32 200V184C8.803 184 0 173.968 0 160V120C0 106.017 8.819 96 32 96V32C32 -3.346 53.49 -32 80 -32V96H96V-32H96.003C219.403 -32 229.157 73.747 376 104H169.606C175.741 108.022 181.374 113.445 186.326 120H472C515.777 120 559.735 128.836 592.604 144.244C622.282 158.155 640 176.008 640 192S622.282 225.845 592.604 239.756zM488 152A8 8 0 0 0 480 160V224A8 8 0 0 0 488 232C519.909 232 519.942 152 488 152z" /> + <glyph glyph-name="spinner" + unicode="" + horiz-adv-x="512" d=" M304 400C304 373.49 282.51 352 256 352S208 373.49 208 400S229.49 448 256 448S304 426.51 304 400zM256 32C229.49 32 208 10.51 208 -16S229.49 -64 256 -64S304 -42.51 304 -16S282.51 32 256 32zM464 240C437.49 240 416 218.51 416 192S437.49 144 464 144S512 165.49 512 192S490.51 240 464 240zM96 192C96 218.51 74.51 240 48 240S0 218.51 0 192S21.49 144 48 144S96 165.49 96 192zM108.922 92.922C82.412 92.922 60.922 71.432 60.922 44.922S82.412 -3.078 108.922 -3.078S156.922 18.412 156.922 44.922C156.922 71.431 135.431 92.922 108.922 92.922zM403.078 92.922C376.568 92.922 355.078 71.432 355.078 44.922S376.568 -3.078 403.078 -3.078S451.078 18.412 451.078 44.922C451.078 71.431 429.588 92.922 403.078 92.922zM108.922 387.078C82.412 387.078 60.922 365.588 60.922 339.078S82.412 291.078 108.922 291.078S156.922 312.568 156.922 339.078S135.431 387.078 108.922 387.078z" /> + <glyph glyph-name="square-full" + unicode="" + horiz-adv-x="512" d=" M512 -64H0V448H512V-64z" /> + <glyph glyph-name="square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416z" /> + <glyph glyph-name="star-half" + unicode="" + horiz-adv-x="576" d=" M288 448C276.6 448 265.2 442.1 259.3 430.2L194 297.8L47.9 276.6C21.7 272.8 11.2 240.5 30.2 222L135.9 119L110.9 -26.5C106.4 -52.6 133.9 -72.5 157.3 -60.2L288 8.4V448z" /> + <glyph glyph-name="star" + unicode="" + horiz-adv-x="576" d=" M259.3 430.2L194 297.8L47.9 276.5C21.7 272.7 11.2 240.4 30.2 221.9L135.9 118.9L110.9 -26.6C106.4 -52.9 134.1 -72.6 157.3 -60.3L288 8.4L418.7 -60.3C441.9 -72.5 469.6 -52.9 465.1 -26.6L440.1 118.9L545.8 221.9C564.8 240.4 554.3 272.7 528.0999999999999 276.5L382 297.8L316.7 430.2C305 453.8 271.1 454.1 259.3 430.2z" /> + <glyph glyph-name="step-backward" + unicode="" + horiz-adv-x="448" d=" M64 -20V404C64 410.6 69.4 416 76 416H124C130.6 416 136 410.6 136 404V227.6L331.5 408.6C352.1 425.7 384 411.4 384 384V0C384 -27.4 352.1 -41.7 331.5 -24.6L136 155.3V-20C136 -26.6 130.6 -32 124 -32H76C69.4 -32 64 -26.6 64 -20z" /> + <glyph glyph-name="step-forward" + unicode="" + horiz-adv-x="448" d=" M384 404V-20C384 -26.6 378.6 -32 372 -32H324C317.4 -32 312 -26.6 312 -20V156.4L116.5 -24.6C95.9 -41.7 64 -27.4 64 0V384C64 411.4 95.9 425.7 116.5 408.6L312 228.7V404C312 410.6 317.4 416 324 416H372C378.6 416 384 410.6 384 404z" /> + <glyph glyph-name="stethoscope" + unicode="" + horiz-adv-x="512" d=" M447.1 336C412.9000000000001 335.5 384.8 307.6 384.1 273.4C383.6 249.1 396.6 227.8 416.1 216.6V104C416.1 46.7 365.9000000000001 0 304.1 0C244.1 0 194.9 44.1 192.2 99.2C265 114.2 320 178.8 320 256V411.4C320 422.8 311.9 432.7 300.7 434.9L237.8 447.5C224.8 450.1 212.2 441.7 209.6 428.7L206.4 413C203.8 400 212.2 387.4 225.2 384.8L255.9 378.7V257.3C255.9 204.4 213.7 160.6 160.8 160.1C107.4 159.6 63.9 202.8 63.9 256.1V378.6L94.6 384.7C107.6 387.3 116 399.9 113.4 412.9L110.3 428.6C107.7 441.6 95.1 450 82.1 447.4L19.3 435C8.1 432.7 0 422.9 0 411.4V256C0 178.7 55.1 114 128.1 99.2C130.7 8.8 208.6 -64 304 -64C401 -64 480 11.4 480 104V216.6C499.1 227.7 512 248.3 512 272C512 307.7 482.8 336.5 447.1 336zM448 256C439.2 256 432 263.2 432 272S439.2 288 448 288S464 280.8 464 272S456.8 256 448 256z" /> + <glyph glyph-name="sticky-note" + unicode="" + horiz-adv-x="448" d=" M312 128H448V392C448 405.3 437.3 416 424 416H24C10.7 416 0 405.3 0 392V-8C0 -21.3 10.7 -32 24 -32H288V104C288 117.2 298.8 128 312 128zM441 73L343 -25C338.5 -29.5 332.4 -32 326 -32H320V96H448V89.9C448 83.6 445.5 77.5 441 73z" /> + <glyph glyph-name="stop-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM352 112C352 103.2 344.8 96 336 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H336C344.8 288 352 280.8 352 272V112z" /> + <glyph glyph-name="stop" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416z" /> + <glyph glyph-name="stopwatch" + unicode="" + horiz-adv-x="448" d=" M432 144C432 29.1 338.9 -64 224 -64S16 29.1 16 144C16 248 92.3 334.2 192 349.5V384H164C157.4 384 152 389.4 152 396V436C152 442.6 157.4 448 164 448H284C290.6 448 296 442.6 296 436V396C296 389.4 290.6 384 284 384H256V349.5C293.5 343.7 327.7 327.9 355.7 304.9L383.2 332.4C387.9 337.1 395.5 337.1 400.2 332.4L428.5 304.1C433.2 299.4 433.2 291.8 428.5 287.1L399.1 257.7L398.5 257.1C419.7 224.7 432 185.8 432 144zM256 108V259.5C256 266.1 250.6 271.5 244 271.5H204C197.4 271.5 192 266.1 192 259.5V108C192 101.4 197.4 96 204 96H244C250.6 96 256 101.4 256 108z" /> + <glyph glyph-name="street-view" + unicode="" + horiz-adv-x="512" d=" M192 384C192 419.346 220.654 448 256 448S320 419.346 320 384C320 348.654 291.346 320 256 320S192 348.654 192 384zM304 304H292.64C269.929 293.557 243.05 293.106 219.36 304H208C181.49 304 160 282.51 160 256V152C160 138.745 170.745 128 184 128H200V24C200 10.745 210.745 0 224 0H288C301.255 0 312 10.745 312 24V128H328C341.255 128 352 138.745 352 152V256C352 282.51 330.51 304 304 304zM389.642 114.848A72.50299999999999 72.50299999999999 0 0 0 360.632 87.839C391.133 82.749 480 62.146 480 32C480 -14.304 312.344 -32 256 -32C185.697 -32 32 -11.141 32 32C32 62.123 120.361 82.665 151.367 87.839A72.516 72.516 0 0 0 122.357 114.848C74.959 104.605 0 80.401 0 32C0 -45.111 178.658 -64 256 -64C333.249 -64 512 -45.135 512 32C512 80.403 437.033 104.606 389.642 114.848z" /> + <glyph glyph-name="strikethrough" + unicode="" + horiz-adv-x="512" d=" M496 160H16C7.163 160 0 167.163 0 176V208C0 216.837 7.163 224 16 224H496C504.837 224 512 216.837 512 208V176C512 167.163 504.837 160 496 160zM281.334 144C308.592 131.063 327.858 115.317 327.858 87.757C327.858 54.649 298.8810000000001 34.081 252.237 34.081C219.912 34.081 175.363 46.161 175.363 78.352V80C175.363 88.837 168.1990000000001 96 159.363 96H113.75C104.914 96 97.75 88.837 97.75 80V60.796C97.75 -6.049 175.467 -41.024 252.237 -41.024C340.815 -41.024 414.25 4.414 414.25 93.4C414.25 113.215 410.632 129.817 404.107 144H281.334zM250.382 240C217.96 253.505 193.546 268.9460000000001 193.546 299.683C193.546 333.603 224.447 347.089 258.508 347.089C301.155 347.089 323.47 330.496 323.47 314.104V312C323.47 303.163 330.634 296 339.47 296H385.083C393.919 296 401.083 303.163 401.083 312V342.318C401.083 394.756 329.358 422.193 258.508 422.193C173.305 422.193 107.782 381.221 107.782 296.5470000000001C107.782 273.837 112.447 255.371 120.559 240H250.382z" /> + <glyph glyph-name="subscript" + unicode="" + horiz-adv-x="512" d=" M395.198 32C398.659 42.526 413.994 53.28 431.463 64.425C448.088 75.03 466.9299999999999 87.051 481.804 103.287C499.2619999999999 122.341 507.748 143.4620000000001 507.748 167.8540000000001C507.748 228.4160000000001 457.046 256.0000000000001 409.938 256.0000000000001C367.447 256.0000000000001 333.56 233.9840000000001 315.506 205.5530000000001C310.852 198.2240000000001 312.914 188.5170000000001 320.129 183.6880000000001L350.457 163.3920000000001C357.4889999999999 158.686 366.9169999999999 160.3080000000001 372.087 167.006C380.1089999999999 177.4 390.9049999999999 185.2310000000001 403.7539999999999 185.2310000000001C423.1409999999999 185.2310000000001 430.0199999999999 172.3300000000001 430.0199999999999 161.2830000000001C430.0199999999999 125.1240000000001 310.5829999999999 104.2600000000001 310.5829999999999 1.2590000000001C310.5829999999999 -5.3949999999999 311.1439999999999 -11.7549999999999 311.998 -18.0719999999999C313.074 -26.0359999999999 319.832 -31.9999999999999 327.868 -31.9999999999999H496C504.837 -31.9999999999999 512 -24.8369999999999 512 -15.9999999999999V16.0000000000001C512 24.837 504.837 32.0000000000001 496 32.0000000000001H395.198zM272 192C280.837 192 288 184.837 288 176V144C288 135.163 280.837 128 272 128H209.601A16 16 0 0 0 196.06 135.478L150.359 208.093C148.062 211.445 145.937 215.062 144.164 218.302C142.514 215.058 140.517 211.365 138.29 207.72L93.578 135.573A15.999 15.999 0 0 0 79.978 128.001H16C7.163 128.001 0 135.1640000000001 0 144.001V176.001C0 184.838 7.163 192.001 16 192.001H42.325L98.877 274.7100000000001L46.111 352H16C7.163 352 0 359.163 0 368V400C0 408.837 7.163 416 16 416H84.806A16 16 0 0 0 98.451 408.356L138.333 343.23C140.405 339.707 142.386 336.059 144.06 332.86C145.837 336.104 147.98 339.814 150.297 343.397L190.629 408.432A15.999 15.999 0 0 0 204.226 416H272C280.837 416 288 408.837 288 400V368C288 359.163 280.837 352 272 352H244.021L191.331 276.329L249.974 192H272z" /> + <glyph glyph-name="subway" + unicode="" + horiz-adv-x="448" d=" M448 352V96C448 44.185 386.376 0 317.978 0L380.9580000000001 -49.721C386.905 -54.417 383.562 -64 376 -64H72C64.422 -64 61.108 -54.406 67.043 -49.721L130.022 0C61.82 0 0 44.046 0 96V352C0 405.019 64 448 128 448H320C385 448 448 405.019 448 352zM200 216V328C200 341.255 189.255 352 176 352H72C58.745 352 48 341.255 48 328V216C48 202.745 58.745 192 72 192H176C189.255 192 200 202.745 200 216zM400 216V328C400 341.255 389.255 352 376 352H272C258.745 352 248 341.255 248 328V216C248 202.745 258.745 192 272 192H376C389.255 192 400 202.745 400 216zM352 160C325.49 160 304 138.51 304 112S325.49 64 352 64S400 85.49 400 112S378.51 160 352 160zM96 160C69.49 160 48 138.51 48 112S69.49 64 96 64S144 85.49 144 112S122.51 160 96 160z" /> + <glyph glyph-name="suitcase" + unicode="" + horiz-adv-x="512" d=" M96 -32H416V320H384V368C384 394.51 362.51 416 336 416H176C149.49 416 128 394.51 128 368V320H96V-32zM192 352H320V320H192V352zM512 272V16C512 -10.51 490.51 -32 464 -32H448V320H464C490.51 320 512 298.51 512 272zM64 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V-32z" /> + <glyph glyph-name="sun" + unicode="" + horiz-adv-x="512" d=" M274.835 435.354L300.351 372.961C304.564 362.66 317.022 358.612 326.485 364.469L383.8010000000001 399.948C399.2910000000001 409.536 418.6090000000001 395.501 414.2760000000001 377.806L398.2460000000001 312.331C395.5990000000001 301.521 403.2990000000001 290.923 414.3980000000001 290.1L481.6220000000001 285.1130000000001C499.7890000000001 283.765 507.1680000000001 261.0560000000001 493.2630000000001 249.2870000000001L441.81 205.74C433.315 198.55 433.315 185.451 441.81 178.261L493.264 134.713C507.17 122.944 499.791 100.235 481.623 98.887L414.399 93.9C403.3 93.077 395.6 82.479 398.247 71.669L414.2770000000001 6.194C418.6090000000001 -11.501 399.2910000000001 -25.5360000000001 383.802 -15.948L326.486 19.531C317.023 25.389 304.564 21.341 300.352 11.0389999999999L274.836 -51.354C267.94 -68.216 244.062 -68.216 237.166 -51.354L211.65 11.039C207.437 21.34 194.979 25.388 185.516 19.531L128.199 -15.948C112.709 -25.536 93.391 -11.501 97.724 6.194L113.754 71.669C116.401 82.479 108.701 93.077 97.602 93.9L30.378 98.887C12.211 100.235 4.832 122.944 18.737 134.713L70.19 178.26C78.685 185.45 78.685 198.549 70.19 205.739L18.736 249.287C4.83 261.056 12.209 283.765 30.377 285.113L97.601 290.1C108.7 290.923 116.4 301.521 113.753 312.331L97.723 377.806C93.391 395.501 112.709 409.536 128.198 399.948L185.515 364.469C194.978 358.611 207.436 362.659 211.649 372.961L237.165 435.354C244.061 452.215 267.939 452.215 274.835 435.354zM392 192C392 266.991 330.99 328 256 328C181.009 328 120 266.991 120 192S181.009 56 256 56C330.99 56 392 117.009 392 192zM360 192C360 134.654 313.346 88 256 88S152 134.654 152 192S198.654 296 256 296S360 249.346 360 192z" /> + <glyph glyph-name="superscript" + unicode="" + horiz-adv-x="512" d=" M395.198 192C398.659 202.526 413.994 213.28 431.463 224.425C448.088 235.03 466.9299999999999 247.051 481.804 263.2870000000001C499.2619999999999 282.341 507.748 303.462 507.748 327.854C507.748 388.416 457.046 416 409.938 416C367.447 416 333.56 393.984 315.506 365.553C310.852 358.224 312.914 348.517 320.129 343.688L350.457 323.392C357.4889999999999 318.6860000000001 366.9169999999999 320.308 372.087 327.006C380.1089999999999 337.4 390.9049999999999 345.231 403.7539999999999 345.231C423.1409999999999 345.231 430.0199999999999 332.33 430.0199999999999 321.283C430.0199999999999 285.124 310.5829999999999 264.26 310.5829999999999 161.259C310.5829999999999 154.605 311.1439999999999 148.245 311.998 141.928C313.074 133.964 319.832 128 327.868 128H496C504.837 128 512 135.163 512 144V176C512 184.837 504.837 192 496 192H395.198zM272 32C280.837 32 288 24.837 288 16V-16C288 -24.837 280.837 -32 272 -32H209.601A16 16 0 0 0 196.06 -24.522L150.359 48.093C148.062 51.445 145.937 55.062 144.164 58.302C142.514 55.058 140.517 51.365 138.29 47.72L93.578 -24.427A15.999 15.999 0 0 0 79.978 -31.999H16C7.163 -31.999 0 -24.836 0 -15.999V16.001C0 24.838 7.163 32.001 16 32.001H42.325L98.877 114.71L46.111 192H16C7.163 192 0 199.163 0 208V240C0 248.837 7.163 256 16 256H84.806A16 16 0 0 0 98.451 248.356L138.333 183.23C140.405 179.707 142.386 176.059 144.06 172.86C145.837 176.1040000000001 147.98 179.814 150.297 183.397L190.629 248.432A16 16 0 0 0 204.227 255.999H272C280.837 255.999 288 248.836 288 239.999V207.999C288 199.162 280.837 191.999 272 191.999H244.021L191.331 116.328L249.974 32H272z" /> + <glyph glyph-name="sync-alt" + unicode="" + horiz-adv-x="512" d=" M370.7200000000001 314.7200000000001C339.4580000000001 343.992 298.888 360.038 255.848 360C178.39 359.932 111.52 306.822 93.057 233.15C91.713 227.787 86.935 224 81.406 224H24.103C16.605 224 10.909 230.807 12.296 238.176C33.933 353.076 134.813 440 256 440C322.448 440 382.791 413.8640000000001 427.315 371.315L463.03 407.03C478.149 422.149 504 411.4410000000001 504 390.059V256C504 242.745 493.255 232 480 232H345.941C324.559 232 313.851 257.851 328.97 272.971L370.72 314.7200000000001zM32 152H166.059C187.441 152 198.149 126.149 183.03 111.029L141.28 69.279C172.542 40.006 213.115 23.96 256.156 23.999C333.574 24.069 400.471 77.143 418.943 150.848C420.287 156.211 425.065 159.998 430.594 159.998H487.898C495.396 159.998 501.092 153.191 499.705 145.822C478.067 30.924 377.187 -56 256 -56C189.552 -56 129.209 -29.864 84.685 12.685L48.97 -23.03C33.851 -38.149 8 -27.441 8 -6.059V128C8 141.255 18.745 152 32 152z" /> + <glyph glyph-name="sync" + unicode="" + horiz-adv-x="512.333" d=" M440.935 435.426L444.901 352.66C399.416 406.096 331.674 440 256 440C134.813 440 33.933 353.076 12.296 238.176C10.908 230.807 16.604 224 24.103 224H73.187C78.757 224 83.564 227.842 84.863 233.259C103.407 310.592 172.931 368 256 368C316.8930000000001 368 370.512 337.144 402.1040000000001 290.199L300.5740000000001 295.064C293.7290000000001 295.3920000000001 288.0000000000001 289.9310000000001 288.0000000000001 283.0780000000001V235.6670000000001C288.0000000000001 229.04 293.3730000000001 223.667 300.0000000000001 223.667H500.3330000000001C506.9600000000001 223.667 512.3330000000001 229.04 512.3330000000001 235.6670000000001V436C512.3330000000001 442.627 506.9600000000001 448 500.3330000000001 448H452.9220000000001C446.0690000000001 448 440.6070000000001 442.271 440.9350000000001 435.426zM256 16C195.105 16 141.483 46.858 109.891 93.805L211.759 88.934C218.604 88.607 224.332 94.068 224.332 100.92V148.332C224.332 154.959 218.959 160.332 212.332 160.332H12C5.373 160.332 0 154.959 0 148.332V-52C0 -58.627 5.373 -64 12 -64H59.385C66.248 -64 71.713 -58.255 71.37 -51.401L67.241 31.174C112.725 -22.166 180.405 -56 256 -56C377.187 -56 478.067 30.924 499.704 145.824C501.092 153.193 495.396 160 487.897 160H438.813C433.243 160 428.436 156.158 427.137 150.741C408.593 73.408 339.069 16 256 16z" /> + <glyph glyph-name="syringe" + unicode="" + horiz-adv-x="512" d=" M201.5 273.2L257.2 217.4C260.3 214.3 260.3 209.2 257.2 206.1L245.9 194.8C242.8 191.6999999999999 237.7 191.6999999999999 234.6 194.8L178.9 250.6L133.6 205.3L189.4 149.5C192.5 146.3999999999999 192.5 141.3 189.4 138.1999999999999L178.1 126.8999999999999C175 123.7999999999999 169.9 123.7999999999999 166.8 126.8999999999999L111 182.8L84.6 156.4C67.3 139.1 59 115.3 61.6 91L68.7 27.4L2.3 -39C-0.8 -42.1 -0.8 -47.2 2.3 -50.3L13.6 -61.6C16.7 -64.7 21.8 -64.7 24.9 -61.6L91.2 4.7L154.8 -2.4C178.7 -5.0000000000001 202.7 2.9999999999999 220.2 20.6L402.1 202.5L266.4000000000001 338.2L201.5 273.2zM509.7 366.5L430.5 445.7C427.4 448.8 422.3 448.8 419.2 445.7L407.9 434.4C404.8 431.3 404.8 426.2 407.9 423.1L436.2 394.8L390.9 349.5L334.3 406.1L317.3 423.1C314.2 426.2 309.1 426.2 306 423.1L272.1 389.2C269 386.1 269 381 272.1 377.9L289.1 360.9L424.8 225L441.8 208C444.9000000000001 204.9 450 204.9 453.1 208L487 242C490.1 245.1 490.1 250.2 487 253.3L413.5 326.8L458.8 372.1L487.1 343.8C490.2 340.7000000000001 495.3 340.7000000000001 498.4 343.8L509.7 355.1C512.8000000000001 358.3 512.8000000000001 363.3 509.7 366.5z" /> + <glyph glyph-name="table-tennis" + unicode="" + horiz-adv-x="512" d=" M496.2 151.5C527.7 229.3 512 321.8 449 384.9C365.1 469 229 469 145.1 384.9L89.1 328.8L300.6 117.3C346.7000000000001 179.4 432.1 194.7 496.2 151.5zM278.3 71.8L57.9 292.1C30.6 246.8 36.2 187.1 75.2 148L109.7 113.4L6.7 24C-1.9 16.5 -2.4 3.3 5.7 -4.8L59.1 -58.3C67.1 -66.4 80.3 -65.9 87.8 -57.3L177.1 46L212.8 10.3C232.5 -9.4 257.4000000000001 -20.2 283.1 -23C276 -6 272.1 12.6 272.1 32.1C272 45.9 274.6 59.1 278.3 71.8zM416 128C363 128 320 85 320 32S363 -64 416 -64S512 -21 512 32S469 128 416 128z" /> + <glyph glyph-name="table" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H464C490.51 -32 512 -10.51 512 16V368C512 394.51 490.51 416 464 416zM224 32H64V128H224V32zM224 192H64V288H224V192zM448 32H288V128H448V32zM448 192H288V288H448V192z" /> + <glyph glyph-name="tablet-alt" + unicode="" + horiz-adv-x="448" d=" M400 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V400C448 426.5 426.5 448 400 448zM224 -32C206.3 -32 192 -17.7 192 0S206.3 32 224 32S256 17.7 256 0S241.7 -32 224 -32zM400 76C400 69.4 394.6 64 388 64H60C53.4 64 48 69.4 48 76V388C48 394.6 53.4 400 60 400H388C394.6 400 400 394.6 400 388V76z" /> + <glyph glyph-name="tablet" + unicode="" + horiz-adv-x="448" d=" M400 448H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V400C448 426.5 426.5 448 400 448zM224 -32C206.3 -32 192 -17.7 192 0S206.3 32 224 32S256 17.7 256 0S241.7 -32 224 -32z" /> + <glyph glyph-name="tachometer-alt" + unicode="" + horiz-adv-x="576" d=" M75.694 -32A48.02 48.02 0 0 0 33.246 -6.429C12.023 33.7 0 79.444 0 128C0 287.058 128.942 416 288 416S576 287.058 576 128C576 79.444 563.977 33.7 542.754 -6.429A48.01800000000001 48.01800000000001 0 0 0 500.306 -32H75.694zM512 160C494.327 160 480 145.673 480 128C480 110.327 494.327 96 512 96S544 110.327 544 128C544 145.673 529.673 160 512 160zM288 320C305.673 320 320 334.327 320 352C320 369.673 305.673 384 288 384S256 369.673 256 352C256 334.327 270.327 320 288 320zM64 160C46.327 160 32 145.673 32 128C32 110.327 46.327 96 64 96S96 110.327 96 128C96 145.673 81.673 160 64 160zM129.608 318.392C111.935 318.392 97.608 304.065 97.608 286.392C97.608 268.719 111.935 254.392 129.608 254.392S161.608 268.719 161.608 286.392C161.608 304.065 147.281 318.392 129.608 318.392zM446.392 318.392C428.719 318.392 414.392 304.065 414.392 286.392C414.392 268.719 428.719 254.392 446.392 254.392S478.392 268.719 478.392 286.392C478.392 304.065 464.065 318.392 446.392 318.392zM359.314 286.858C346.687 290.898 333.181 283.938 329.141 271.314L283.218 127.803C250.108 125.355 224 97.736 224 64C224 28.654 252.654 0 288 0C323.346 0 352 28.654 352 64C352 83.773 343.029 101.447 328.939 113.187L374.858 256.685C378.897 269.31 371.938 282.818 359.314 286.858z" /> + <glyph glyph-name="tag" + unicode="" + horiz-adv-x="512" d=" M0 195.882V400C0 426.51 21.49 448 48 448H252.118A48 48 0 0 0 286.059 433.941L497.941 222.059C516.6859999999999 203.314 516.6859999999999 172.922 497.941 154.177L293.823 -49.941C275.078 -68.6859999999999 244.686 -68.6859999999999 225.941 -49.941L14.059 161.941A48 48 0 0 0 0 195.882zM112 384C85.49 384 64 362.51 64 336S85.49 288 112 288S160 309.49 160 336S138.51 384 112 384z" /> + <glyph glyph-name="tags" + unicode="" + horiz-adv-x="640" d=" M497.941 222.059L286.0590000000001 433.941A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V195.882A48 48 0 0 1 14.059 161.941L225.941 -49.941C244.685 -68.6859999999999 275.077 -68.687 293.823 -49.941L497.941 154.177C516.6859999999999 172.922 516.6859999999999 203.314 497.941 222.059zM112 288C85.49 288 64 309.49 64 336S85.49 384 112 384S160 362.51 160 336S138.51 288 112 288zM625.941 154.177L421.823 -49.941C403.078 -68.6859999999999 372.686 -68.6859999999999 353.941 -49.941L353.581 -49.581L527.64 124.478C544.639 141.477 554 164.078 554 188.118S544.638 234.759 527.64 251.758L331.397 448H380.118A48 48 0 0 0 414.059 433.941L625.941 222.059C644.686 203.314 644.686 172.922 625.941 154.177z" /> + <glyph glyph-name="tasks" + unicode="" + horiz-adv-x="512" d=" M208 316H496C504.8 316 512 323.2 512 332V372C512 380.8 504.8 388 496 388H208C199.2 388 192 380.8 192 372V332C192 323.2 199.2 316 208 316zM208 156H496C504.8 156 512 163.2 512 172V212C512 220.8 504.8 228 496 228H208C199.2 228 192 220.8 192 212V172C192 163.2 199.2 156 208 156zM208 -4H496C504.8 -4 512 3.2 512 12V52C512 60.8 504.8 68 496 68H208C199.2 68 192 60.8 192 52V12C192 3.2 199.2 -4 208 -4zM64 80C37.5 80 15.4 58.5 15.4 32S37.5 -16 64 -16S112 5.5 112 32S90.5 80 64 80zM156.5 379L84.3 306.8L68.7 291.2000000000001C64 286.5 55.8 286.5 51.1 291.2000000000001L3.5 338.6C-1.2 343.3 -1.2 350.9 3.5 355.6L19.2 371.3C23.9 376 31.5 376 36.2 371.3L58.9 349.2L122.6 412.5C127.3 417.2 134.9 417.2 139.6 412.5L156.6 396C161.2 391.3 161.2 383.7 156.5 379zM156.5 219.4L84.3 147.2L68.6 131.5C63.9 126.8 55.7 126.8 51 131.5L3.5 179C-1.2 183.7 -1.2 191.3 3.5 196L19.2 211.7C23.9 216.4 31.5 216.4 36.2 211.7L58.9 189.6L122.6 253.3C127.3 258 134.9 258 139.6 253.3L156.6 236.3C161.2 231.7 161.2 224.1 156.5 219.4z" /> + <glyph glyph-name="taxi" + unicode="" + horiz-adv-x="512" d=" M461.951 204.135L440.1350000000001 291.403A79.885 79.885 0 0 1 362.522 352H352V392C352 405.255 341.255 416 328 416H184C170.745 416 160 405.255 160 392V352H149.478A79.885 79.885 0 0 1 71.866 291.403L50.05 204.135C25.515 195.177 8 171.634 8 144V96C8 75.793 17.374 57.786 32 46.057V-8C32 -21.255 42.745 -32 56 -32H104C117.255 -32 128 -21.255 128 -8V32H384V-8C384 -21.255 394.745 -32 408 -32H456C469.255 -32 480 -21.255 480 -8V46.057C494.626 57.786 504 75.794 504 96V144C504 171.634 486.485 195.177 461.951 204.135zM149.478 288H362.523A15.975 15.975 0 0 0 378.045 275.88L395.015 208H116.985L133.955 275.881A15.975999999999999 15.975999999999999 0 0 0 149.478 288zM132 112C132 92.118 115.882 76 96 76S60 92.118 60 112S76.118 148 96 148S132 131.882 132 112zM452 112C452 92.118 435.882 76 416 76S380 92.118 380 112S396.118 148 416 148S452 131.882 452 112z" /> + <glyph glyph-name="terminal" + unicode="" + horiz-adv-x="640" d=" M257.981 175.029L63.638 -19.314C54.265 -28.687 39.069 -28.687 29.697 -19.314L7.029 3.353C-2.328 12.71 -2.346 27.875 6.989 37.254L161.011 192L6.99 346.745C-2.345 356.124 -2.327 371.289 7.03 380.646L29.697 403.313C39.07 412.6860000000001 54.266 412.6860000000001 63.638 403.313L257.981 208.97C267.354 199.598 267.354 184.402 257.981 175.029zM640 -8V24C640 37.255 629.255 48 616 48H312C298.745 48 288 37.255 288 24V-8C288 -21.255 298.745 -32 312 -32H616C629.255 -32 640 -21.255 640 -8z" /> + <glyph glyph-name="text-height" + unicode="" + horiz-adv-x="576" d=" M16 416H304C312.837 416 320 408.837 320 400V304C320 295.163 312.837 288 304 288H268.504C259.6670000000001 288 252.504 295.163 252.504 304V352H197.743V32H232C240.837 32 248 24.837 248 16V-16C248 -24.837 240.837 -32 232 -32H88C79.163 -32 72 -24.837 72 -16V16C72 24.837 79.163 32 88 32H122.257V352H67.496V304C67.496 295.163 60.333 288 51.496 288H16C7.163 288 0 295.163 0 304V400C0 408.837 7.163 416 16 416zM491.308 411.315L571.303 331.314C581.309 321.307 574.297 304 559.99 304H512V80H560C575.639 80 580.635 62.009 571.313 52.686L491.318 -27.3150000000001C485.071 -33.5620000000001 474.937 -33.5600000000001 468.692 -27.3150000000001L388.697 52.6859999999999C378.691 62.693 385.703 80 400.01 80H448V304H400C384.361 304 379.365 321.991 388.687 331.314L468.682 411.315C474.929 417.563 485.063 417.56 491.308 411.315z" /> + <glyph glyph-name="text-width" + unicode="" + horiz-adv-x="448" d=" M16 416H432C440.837 416 448 408.837 448 400V304C448 295.163 440.837 288 432 288H396.504C387.6670000000001 288 380.504 295.163 380.504 304V352H261.743V224H296C304.837 224 312 216.837 312 208V176C312 167.163 304.837 160 296 160H152C143.163 160 136 167.163 136 176V208C136 216.837 143.163 224 152 224H186.257V352H67.496V304C67.496 295.163 60.333 288 51.496 288H16C7.163 288 0 295.163 0 304V400C0 408.837 7.163 416 16 416zM443.315 75.318L363.314 155.313C353.991 164.635 336 159.638 336 144V96H112V143.99C112 158.297 94.693 165.309 84.686 155.303L4.685 75.308C-1.56 69.063 -1.562 58.929 4.685 52.682L84.686 -27.313C94.009 -36.635 112 -31.638 112 -16V32H336V-15.99C336 -30.297 353.307 -37.309 363.314 -27.303L443.3150000000001 52.692C449.5600000000001 58.937 449.5630000000001 69.071 443.3150000000001 75.318z" /> + <glyph glyph-name="th-large" + unicode="" + horiz-adv-x="512" d=" M296 416H488C501.255 416 512 405.255 512 392V232C512 218.745 501.255 208 488 208H296C282.745 208 272 218.745 272 232V392C272 405.255 282.745 416 296 416zM216 416H24C10.745 416 0 405.255 0 392V232C0 218.745 10.745 208 24 208H216C229.255 208 240 218.745 240 232V392C240 405.255 229.255 416 216 416zM0 152V-8C0 -21.255 10.745 -32 24 -32H216C229.255 -32 240 -21.255 240 -8V152C240 165.255 229.255 176 216 176H24C10.745 176 0 165.255 0 152zM296 -32H488C501.255 -32 512 -21.255 512 -8V152C512 165.255 501.255 176 488 176H296C282.745 176 272 165.255 272 152V-8C272 -21.255 282.745 -32 296 -32z" /> + <glyph glyph-name="th-list" + unicode="" + horiz-adv-x="512" d=" M149.333 232V152C149.333 138.745 138.588 128 125.333 128H24C10.745 128 0 138.745 0 152V232C0 245.255 10.745 256 24 256H125.333C138.588 256 149.333 245.255 149.333 232zM0 72V-8C0 -21.255 10.745 -32 24 -32H125.333C138.588 -32 149.333 -21.255 149.333 -8V72C149.333 85.255 138.588 96 125.333 96H24C10.745 96 0 85.255 0 72zM125.333 416H24C10.745 416 0 405.255 0 392V312C0 298.745 10.745 288 24 288H125.333C138.588 288 149.333 298.745 149.333 312V392C149.333 405.255 138.588 416 125.333 416zM205.333 -32H488C501.255 -32 512 -21.255 512 -8V72C512 85.255 501.255 96 488 96H205.333C192.078 96 181.333 85.255 181.333 72V-8C181.333 -21.255 192.078 -32 205.333 -32zM181.333 392V312C181.333 298.745 192.078 288 205.333 288H488C501.255 288 512 298.745 512 312V392C512 405.255 501.255 416 488 416H205.333C192.078 416 181.333 405.255 181.333 392zM205.333 128H488C501.255 128 512 138.745 512 152V232C512 245.255 501.255 256 488 256H205.333C192.078 256 181.333 245.255 181.333 232V152C181.333 138.745 192.078 128 205.333 128z" /> + <glyph glyph-name="th" + unicode="" + horiz-adv-x="512" d=" M149.333 392V312C149.333 298.745 138.588 288 125.333 288H24C10.745 288 0 298.745 0 312V392C0 405.255 10.745 416 24 416H125.333C138.588 416 149.333 405.255 149.333 392zM330.6670000000001 152V232C330.6670000000001 245.255 319.9220000000001 256 306.6670000000001 256H205.333C192.078 256 181.333 245.255 181.333 232V152C181.333 138.745 192.078 128 205.333 128H306.666C319.9220000000001 128 330.667 138.745 330.667 152zM362.6670000000001 392V312C362.6670000000001 298.745 373.4120000000001 288 386.6670000000001 288H488C501.255 288 512 298.745 512 312V392C512 405.255 501.255 416 488 416H386.667C373.412 416 362.667 405.255 362.667 392zM330.6670000000001 312V392C330.6670000000001 405.255 319.9220000000001 416 306.6670000000001 416H205.333C192.078 416 181.333 405.255 181.333 392V312C181.333 298.745 192.078 288 205.333 288H306.666C319.9220000000001 288 330.667 298.745 330.667 312zM125.333 256H24C10.745 256 0 245.255 0 232V152C0 138.745 10.745 128 24 128H125.333C138.588 128 149.333 138.745 149.333 152V232C149.333 245.255 138.588 256 125.333 256zM0 72V-8C0 -21.255 10.745 -32 24 -32H125.333C138.588 -32 149.333 -21.255 149.333 -8V72C149.333 85.255 138.588 96 125.333 96H24C10.745 96 0 85.255 0 72zM386.667 128H488C501.255 128 512 138.745 512 152V232C512 245.255 501.255 256 488 256H386.667C373.412 256 362.667 245.255 362.667 232V152C362.667 138.745 373.412 128 386.667 128zM386.667 -32H488C501.255 -32 512 -21.255 512 -8V72C512 85.255 501.255 96 488 96H386.667C373.412 96 362.667 85.255 362.667 72V-8C362.667 -21.255 373.412 -32 386.667 -32zM181.333 72V-8C181.333 -21.255 192.078 -32 205.333 -32H306.666C319.921 -32 330.666 -21.255 330.666 -8V72C330.666 85.255 319.921 96 306.666 96H205.333C192.078 96 181.333 85.255 181.333 72z" /> + <glyph glyph-name="thermometer-empty" + unicode="" + horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 99.346 92.654 128 128 128S192 99.346 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" /> + <glyph glyph-name="thermometer-full" + unicode="" + horiz-adv-x="256" d=" M224 352C224 405.019 181.019 448 128 448S32 405.019 32 352V148.653C12.225 126.244 0.166 96.864 0.002 64.667C-0.357 -5.636 56.789 -63.509 127.091 -63.997C127.39 -63.999 127.701 -64 128 -64C198.698 -64 256 -6.696 256 64C256 96.459 243.912 126.09 224 148.653V352zM128 -16L127.424 -15.998C83.564 -15.694 47.777 20.546 48.001 64.422C48.174 98.402 67.267 116.074 80 130.502V352C80 378.467 101.533 400 128 400S176 378.467 176 352V130.502C188.63 116.19 208 98.338 208 64C208 19.888 172.112 -16 128 -16zM192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V352C96 369.673 110.327 384 128 384S160 369.673 160 352V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64z" /> + <glyph glyph-name="thermometer-half" + unicode="" + horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V224C96 241.673 110.327 256 128 256S160 241.673 160 224V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" /> + <glyph glyph-name="thermometer-quarter" + unicode="" + horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0S64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V160C96 177.673 110.327 192 128 192S160 177.673 160 160V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" /> + <glyph glyph-name="thermometer-three-quarters" + unicode="" + horiz-adv-x="256" d=" M192 64C192 28.654 163.346 0 128 0C92.654 0 64 28.654 64 64C64 87.685 76.876 108.349 96 119.417V288C96 305.673 110.327 320 128 320S160 305.673 160 288V119.417C179.124 108.3490000000001 192 87.6850000000001 192 64zM224 148.653C243.912 126.09 256 96.459 256 64C256 -6.696 198.697 -64 128 -64C127.701 -64 127.391 -63.999 127.091 -63.997C56.789 -63.509 -0.357 -5.636 0.002 64.667C0.166 96.865 12.225 126.245 32 148.653V352C32 405.019 74.981 448 128 448S224 405.019 224 352V148.653zM208 64C208 98.339 188.63 116.19 176 130.502V352C176 378.467 154.467 400 128 400S80 378.467 80 352V130.502C67.268 116.074 48.175 98.402 48.001 64.422C47.777 20.5460000000001 83.564 -15.694 127.424 -15.998L128 -16C172.112 -16 208 19.888 208 64z" /> + <glyph glyph-name="thermometer" + unicode="" + horiz-adv-x="512" d=" M476.8 427.6C439.3 458.3 381.3 453.9 344.9 417.4L299.2 371.4L349.7 320.9C352.8 317.8 352.8 312.7000000000001 349.7 309.6L338.4 298.3C335.3 295.2 330.2 295.2 327.1 298.3L276.7 348.8L231.6 303.4L281.9 253C285 249.9 285 244.8 281.9 241.7L270.6 230.4C267.5 227.3 262.4 227.3 259.3 230.4L209 280.6L163.9 235.2L214 185C217.1 181.9 217.1 176.8 214 173.7L202.7 162.4C199.6 159.3 194.5 159.3 191.4 162.4L141.3 212.6L96 166.9V66L7 -23C-2.4 -32.4 -2.4 -47.6 7 -56.9C16.4 -66.2999999999999 31.6 -66.2999999999999 40.9 -56.9L129.9 32.1H229.8L484 285.4C518.9 320.3 526.2 386.9 476.8 427.6z" /> + <glyph glyph-name="thumbs-down" + unicode="" + horiz-adv-x="512" d=" M0 392V152C0 138.745 10.745 128 24 128H104C117.255 128 128 138.745 128 152V392C128 405.255 117.255 416 104 416H24C10.745 416 0 405.255 0 392zM40 192C40 205.255 50.745 216 64 216S88 205.255 88 192S77.255 168 64 168S40 178.745 40 192zM312 -64C291.817 -64 282.515 -24.707 278.069 -6.205C272.863 15.461 267.48 37.865 252.676 52.697C220.207 85.221 203.173 126.664 163.559 165.808A11.98 11.98 0 0 0 160.001 174.329V388.099C160.001 394.64 165.244 399.977 171.784 400.097C187.615 400.387 208.478 409.176 224.435 416.275C256.189 430.402 295.709 447.983 343.995 448H346.839C389.616 448 440.202 447.587 460.613 418.263C469.005 406.206 471.059 391.229 466.761 373.631C483.073 356.578 491.824 324.7680000000001 483.143 298.874C500.687 275.442 502.2860000000001 242.742 492.451 219.405L492.561 219.295C504.4540000000001 207.346 512.0840000000001 188.036 512 170.098C511.844 139.746 485.843 111.9999999999999 452.447 111.9999999999999H350.723C358.03 83.66 384 59.868 384 17.452C384 -56 336 -64 312 -64z" /> + <glyph glyph-name="thumbs-up" + unicode="" + horiz-adv-x="512" d=" M104 224H24C10.745 224 0 213.255 0 200V-40C0 -53.255 10.745 -64 24 -64H104C117.255 -64 128 -53.255 128 -40V200C128 213.255 117.255 224 104 224zM64 -24C50.745 -24 40 -13.255 40 0S50.745 24 64 24S88 13.255 88 0S77.255 -24 64 -24zM384 366.548C384 324.132 358.03 300.3400000000001 350.723 272H452.446C485.843 272 511.843 244.254 511.999 213.902C512.083 195.964 504.453 176.653 492.56 164.705L492.45 164.595C502.286 141.258 500.687 108.558 483.142 85.126C491.823 59.231 483.073 27.422 466.76 10.369C471.058 -7.229 469.004 -22.206 460.612 -34.263C440.202 -63.587 389.616 -64 346.839 -64L343.994 -63.999C295.707 -63.982 256.188 -46.401 224.434 -32.274C208.477 -25.175 187.613 -16.387 171.783 -16.096C165.243 -15.976 160 -10.639 160 -4.098V209.672C160 212.872 161.282 215.943 163.558 218.193C203.172 257.337 220.206 298.78 252.675 331.304C267.479 346.136 272.863 368.54 278.068 390.206C282.515 408.707 291.817 448 312 448C336 448 384 440 384 366.548z" /> + <glyph glyph-name="thumbtack" + unicode="" + horiz-adv-x="384" d=" M298.028 233.733L285.793 352H328C341.255 352 352 362.745 352 376V424C352 437.255 341.255 448 328 448H56C42.745 448 32 437.255 32 424V376C32 362.745 42.745 352 56 352H98.207L85.972 233.733C37.465 211.18 0 170.739 0 120C0 106.745 10.745 96 24 96H160V-8.007C160 -9.249 160.289 -10.474 160.845 -11.585L184.845 -59.585C187.786 -65.467 196.209 -65.4779999999999 199.156 -59.585L223.156 -11.585A8.008 8.008 0 0 1 224.001 -8.007V96H360.001C373.256 96 384.001 106.745 384.001 120C384 171.183 346.018 211.42 298.028 233.733z" /> + <glyph glyph-name="ticket-alt" + unicode="" + horiz-adv-x="576" d=" M128 288H448V96H128V288zM528 192C528 165.49 549.49 144 576 144V48C576 21.49 554.51 0 528 0H48C21.49 0 0 21.49 0 48V144C26.51 144 48 165.49 48 192S26.51 240 0 240V336C0 362.51 21.49 384 48 384H528C554.51 384 576 362.51 576 336V240C549.49 240 528 218.51 528 192zM480 296C480 309.255 469.255 320 456 320H120C106.745 320 96 309.255 96 296V88C96 74.745 106.745 64 120 64H456C469.255 64 480 74.745 480 88V296z" /> + <glyph glyph-name="times-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM377.6 126.9C382.3 122.2 382.3 114.6 377.6 109.9L338 70.4C333.3 65.7 325.7 65.7 321 70.4L256 136L190.9 70.4C186.2 65.7 178.6 65.7 173.9 70.4L134.4 110C129.7 114.7 129.7 122.3 134.4 127L200 192L134.4 257.1C129.7 261.8 129.7 269.4 134.4 274.1L174 313.7C178.7 318.4 186.3 318.4 191 313.7L256 248L321.1 313.6C325.8 318.3 333.4000000000001 318.3 338.1 313.6L377.7000000000001 274C382.4000000000001 269.3 382.4000000000001 261.7 377.7000000000001 257L312 192L377.6 126.9z" /> + <glyph glyph-name="times" + unicode="" + horiz-adv-x="384" d=" M323.1 7L377 60.9C386.4 70.3 386.4 85.4 377 94.8L279.8 192L377 289.2C386.4 298.6 386.4 313.7 377 323.1L323.1 377C313.7000000000001 386.4 298.6 386.4 289.2000000000001 377L192 279.8L94.8 377C85.4 386.4 70.3 386.4 60.9 377L7 323.1C-2.4 313.7 -2.4 298.6 7 289.2L104.2 192L7 94.8C-2.4 85.4 -2.4 70.3 7 60.9L60.9 7C70.3 -2.4 85.4 -2.4 94.8 7L192 104.2L289.2 7C298.5 -2.3 313.7 -2.3 323.1 7z" /> + <glyph glyph-name="tint" + unicode="" + horiz-adv-x="384" d=" M192 -64C93.565 -64 13.913 15.652 13.913 114.087C13.913 225.283 115.107 268.152 162.435 425.912C171.539 456.028 213.534 454.69 221.565 425.912C269.111 267.426 370.087 225.843 370.087 114.087C370.087 15.652 290.435 -64 192 -64zM149.478 107.826C147.969 113.359 140.031 113.358 138.522 107.826C129.299 78.401 110.609 70.181 110.609 49.391C110.609 30.87 125.478 16 144 16S177.391 30.87 177.391 49.391C177.391 70.23 158.718 78.347 149.478 107.826z" /> + <glyph glyph-name="toggle-off" + unicode="" + horiz-adv-x="576" d=" M384 384H192C85.961 384 0 298.039 0 192S85.961 0 192 0H384C490.039 0 576 85.961 576 192S490.039 384 384 384zM64 192C64 262.741 121.249 320 192 320C262.741 320 320 262.751 320 192C320 121.259 262.751 64 192 64C121.259 64 64 121.249 64 192zM384 64H335.0950000000001C400.312 136.858 400.331 247.12 335.0950000000001 320H384C454.741 320 512 262.751 512 192C512 121.26 454.751 64 384 64z" /> + <glyph glyph-name="toggle-on" + unicode="" + horiz-adv-x="576" d=" M576 192C576 85.961 490.039 0 384 0H192C85.961 0 0 85.961 0 192S85.961 384 192 384H384C490.039 384 576 298.039 576 192zM384 320C313.259 320 256 262.751 256 192C256 121.259 313.249 64 384 64C454.741 64 512 121.249 512 192C512 262.741 454.751 320 384 320" /> + <glyph glyph-name="trademark" + unicode="" + horiz-adv-x="640" d=" M97.119 284.867H12C5.373 284.867 0 290.24 0 296.867V340C0 346.627 5.373 352 12 352H260.559C267.186 352 272.559 346.627 272.559 340V296.867C272.559 290.24 267.186 284.867 260.559 284.867H175.44V44C175.44 37.373 170.067 32 163.44 32H109.118C102.491 32 97.118 37.373 97.118 44V284.867zM329.825 352H395.25A12 12 0 0 0 406.596 343.907L450.355 216.839C457.516 196.251 466.466 164.027 466.466 164.027H467.362S476.312 196.251 483.473 216.839L527.231 343.907A12 12 0 0 0 538.577 352H603.987A12 12 0 0 0 615.948 340.9700000000001L639.96 44.97C640.527 37.983 635.009 32 627.999 32H573.898A12 12 0 0 0 561.926 43.182L552.844 176.112C551.0540000000001 200.28 552.844 229.8180000000001 552.844 229.8180000000001H551.9480000000001S541.2070000000001 196.2520000000001 534.046 176.112L503.3460000000001 91.381A12 12 0 0 0 492.0640000000001 83.4690000000001H441.7620000000001A12 12 0 0 0 430.4800000000001 91.381L399.7800000000001 176.112C392.6190000000001 196.252 381.8770000000001 229.8180000000001 381.8770000000001 229.8180000000001H380.9820000000001S382.7720000000001 200.28 380.9820000000001 176.112L371.9000000000001 43.182C371.4720000000001 36.887 366.2400000000001 32 359.9300000000001 32H305.4C298.383 32 292.864 37.994 293.441 44.987L317.866 340.987A11.999000000000002 11.999000000000002 0 0 0 329.825 352z" /> + <glyph glyph-name="train" + unicode="" + horiz-adv-x="448" d=" M448 352V96C448 44.185 386.376 0 317.978 0L380.9580000000001 -49.721C386.905 -54.417 383.562 -64 376 -64H72C64.422 -64 61.108 -54.406 67.043 -49.721L130.022 0C61.82 0 0 44.046 0 96V352C0 405.019 64 448 128 448H320C385 448 448 405.019 448 352zM400 216V328C400 341.255 389.255 352 376 352H72C58.745 352 48 341.255 48 328V216C48 202.745 58.745 192 72 192H376C389.255 192 400 202.745 400 216zM224 152C193.072 152 168 126.928 168 96S193.072 40 224 40S280 65.072 280 96S254.928 152 224 152z" /> + <glyph glyph-name="transgender-alt" + unicode="" + horiz-adv-x="480" d=" M468 448H389C378.3 448 373 435.1 380.5 427.5L397.4 410.6L316.7 329.9C294.5 343.9 268.2 352 240 352C211.8 352 185.5 343.9 163.3 329.9L146.8 346.4L166.6 366.2C171.3 370.9 171.3 378.5 166.6 383.2L138.3 411.5C133.6 416.2 126 416.2 121.3 411.5L101.5 391.7L82.5 410.7L99.4 427.6C107.1 435.1 101.7 448 91 448H12C5.4 448 0 442.6 0 436V357C0 346.3 12.9 341 20.5 348.5L37.4 365.4L56.4 346.4L36.6 326.6C31.9 321.9 31.9 314.3 36.6 309.6L64.9 281.3C69.6 276.6 77.2 276.6 81.9 281.3L101.7 301.1L118.2 284.6C104.1 262.5 96 236.2 96 208C96 139.5 143.9 82.1 208 67.6V40H172C165.4 40 160 34.6 160 28V-12C160 -18.6 165.4 -24 172 -24H208V-52C208 -58.6 213.4 -64 220 -64H260C266.6 -64 272 -58.6 272 -52V-24H308C314.6 -24 320 -18.6 320 -12V28C320 34.6 314.6 40 308 40H272V67.6C336.1 82.2000000000001 384 139.5 384 208C384 236.2 375.9 262.5 361.9 284.7000000000001L442.6 365.4000000000001L459.4999999999999 348.5000000000001C467.1 340.9000000000001 479.9999999999999 346.3000000000001 479.9999999999999 357.0000000000001V436C479.9999999999999 442.6 474.6 448 467.9999999999999 448zM240 128C195.9 128 160 163.9 160 208S195.9 288 240 288S320 252.1 320 208S284.1 128 240 128z" /> + <glyph glyph-name="transgender" + unicode="" + horiz-adv-x="384" d=" M372 448H293C282.3 448 277 435.1 284.5 427.5L301.4 410.6L220.7 329.9C198.5 343.9 172.2 352 144 352C64.5 352 0 287.5 0 208C0 139.5 47.9 82.1 112 67.6V40H76C69.4 40 64 34.6 64 28V-12C64 -18.6 69.4 -24 76 -24H112V-52C112 -58.6 117.4 -64 124 -64H164C170.6 -64 176 -58.6 176 -52V-24H212C218.6 -24 224 -18.6 224 -12V28C224 34.6 218.6 40 212 40H176V67.6C240.1 82.2000000000001 288 139.5 288 208C288 236.2 279.9 262.5 265.9 284.7000000000001L346.6 365.4000000000001L363.5 348.5000000000001C371.1 340.9000000000001 384 346.3000000000001 384 357.0000000000001V436C384 442.6 378.6 448 372 448zM144 128C99.9 128 64 163.9 64 208S99.9 288 144 288S224 252.1 224 208S188.1 128 144 128z" /> + <glyph glyph-name="trash-alt" + unicode="" + horiz-adv-x="448" d=" M0 364V392C0 405.3 10.7 416 24 416H136L145.4 434.7C149.4 442.9 157.7 448 166.8 448H281.1C290.2000000000001 448 298.5 442.9 302.6 434.7L312 416H424C437.3 416 448 405.3 448 392V364C448 357.4 442.6 352 436 352H12C5.4 352 0 357.4 0 364zM416 308V-16C416 -42.5 394.5 -64 368 -64H80C53.5 -64 32 -42.5 32 -16V308C32 314.6 37.4 320 44 320H404C410.6 320 416 314.6 416 308zM144 240C144 248.8 136.8 256 128 256S112 248.8 112 240V16C112 7.2 119.2 0 128 0S144 7.2 144 16V240zM240 240C240 248.8 232.8 256 224 256S208 248.8 208 240V16C208 7.2 215.2 0 224 0S240 7.2 240 16V240zM336 240C336 248.8 328.8 256 320 256S304 248.8 304 240V16C304 7.2 311.2 0 320 0S336 7.2 336 16V240z" /> + <glyph glyph-name="trash" + unicode="" + horiz-adv-x="448" d=" M0 364V392C0 405.3 10.7 416 24 416H136L145.4 434.7C149.4 442.9 157.7 448 166.8 448H281.1C290.2000000000001 448 298.5 442.9 302.6 434.7L312 416H424C437.3 416 448 405.3 448 392V364C448 357.4 442.6 352 436 352H12C5.4 352 0 357.4 0 364zM415.2 307.3L394.8 -19C393.2 -44.3 372.2 -64 346.9000000000001 -64H101.1C75.8 -64 54.8 -44.3 53.2 -19L32.8 307.3C32.4 314.2000000000001 37.9 320 44.8 320H403.3C410.1 320 415.6 314.2000000000001 415.2 307.3z" /> + <glyph glyph-name="tree" + unicode="" + horiz-adv-x="384" d=" M377.33 72.571L293.906 160H328C349.017 160 359.872 185.207 345.448 200.479L262.79 288H296C316.878 288 327.851 312.969 313.587 328.331L209.587 440.334C200.102 450.548 183.911 450.563 174.413 440.334L70.413 328.331C56.206 313.031 67.037 288 88 288H121.21L38.551 200.479C24.121 185.199 34.993 160 56 160H90.094L6.665 72.571C-7.869 57.345 2.925 32 24.025 32H144C144 -0.781 132.812 -17.26 110.005 -35.506C98.225 -44.93 104.914 -64 120 -64H264C279.086 -64 285.776 -44.931 273.995 -35.506C254.227 -19.6919999999999 240.003 -3.841 240 31.99V32H359.9700000000001C381.0200000000001 32 391.899 57.309 377.3300000000001 72.571z" /> + <glyph glyph-name="trophy" + unicode="" + horiz-adv-x="576" d=" M552 384H448V424C448 437.3 437.3 448 424 448H152C138.7 448 128 437.3 128 424V384H24C10.7 384 0 373.3 0 360V304C0 268.3 22.5 231.6 61.9 203.3C93.4 180.6 131.7 166.2 171.9 161.6C203.3 109.5 240 88 240 88V16H192C156.7 16 128 -4.7 128 -40V-52C128 -58.6 133.4 -64 140 -64H436C442.6 -64 448 -58.6 448 -52V-40C448 -4.7 419.3 16 384 16H336V88S372.7 109.5 404.1 161.6C444.4000000000001 166.2000000000001 482.7 180.6 514.1 203.3C553.4 231.6 576 268.3 576 304V360C576 373.3 565.3 384 552 384zM99.3 255.2C74.9 272.8 64 292.4 64 304V320H128.2C129.2 287.4 134 258.8 141 233.8C125.9 239 111.8 246.2 99.3 255.2zM512 304C512 287.9 494.3 267.9 476.7 255.2C464.2 246.2 450 239 434.9 233.8C441.9 258.8 446.7 287.4 447.7 320H512V304z" /> + <glyph glyph-name="truck" + unicode="" + horiz-adv-x="640" d=" M624 96H608V204.1C608 216.8 602.9 229 593.9 238L494 337.9C485 346.9 472.8 352 460.1 352H416V400C416 426.5 394.5 448 368 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H64C64 -21 107 -64 160 -64S256 -21 256 32H384C384 -21 427 -64 480 -64S576 -21 576 32H624C632.8 32 640 39.2 640 48V80C640 88.8 632.8 96 624 96zM160 -16C133.5 -16 112 5.5 112 32S133.5 80 160 80S208 58.5 208 32S186.5 -16 160 -16zM480 -16C453.5 -16 432 5.5 432 32S453.5 80 480 80S528 58.5 528 32S506.5 -16 480 -16zM560 192H416V304H460.1L560 204.1V192z" /> + <glyph glyph-name="tty" + unicode="" + horiz-adv-x="512" d=" M5.37 344.178C143.902 482.71 368.306 482.504 506.632 344.178C512.71 338.1 513.706 328.682 509.215 321.497L466.001 252.359A18.332 18.332 0 0 0 443.6450000000001 245.054L357.2230000000001 279.623A18.335 18.335 0 0 0 345.7890000000001 298.469L351.741 358C289.596 380.454 221.105 379.986 160.258 358L166.211 298.468A18.331 18.331 0 0 0 154.777 279.622L68.354 245.0540000000001A18.334 18.334 0 0 0 45.998 252.3590000000001L2.787 321.498A18.333 18.333 0 0 0 5.37 344.178zM96 140V180C96 186.627 90.627 192 84 192H44C37.373 192 32 186.627 32 180V140C32 133.373 37.373 128 44 128H84C90.627 128 96 133.373 96 140zM192 140V180C192 186.627 186.627 192 180 192H140C133.373 192 128 186.627 128 180V140C128 133.373 133.373 128 140 128H180C186.627 128 192 133.373 192 140zM288 140V180C288 186.627 282.627 192 276 192H236C229.373 192 224 186.627 224 180V140C224 133.373 229.373 128 236 128H276C282.627 128 288 133.373 288 140zM384 140V180C384 186.627 378.627 192 372 192H332C325.373 192 320 186.627 320 180V140C320 133.373 325.373 128 332 128H372C378.627 128 384 133.373 384 140zM480 140V180C480 186.627 474.627 192 468 192H428C421.373 192 416 186.627 416 180V140C416 133.373 421.373 128 428 128H468C474.627 128 480 133.373 480 140zM144 44V84C144 90.627 138.627 96 132 96H92C85.373 96 80 90.627 80 84V44C80 37.373 85.373 32 92 32H132C138.627 32 144 37.373 144 44zM240 44V84C240 90.627 234.627 96 228 96H188C181.373 96 176 90.627 176 84V44C176 37.373 181.373 32 188 32H228C234.627 32 240 37.373 240 44zM336 44V84C336 90.627 330.627 96 324 96H284C277.373 96 272 90.627 272 84V44C272 37.373 277.373 32 284 32H324C330.627 32 336 37.373 336 44zM432 44V84C432 90.627 426.627 96 420 96H380C373.373 96 368 90.627 368 84V44C368 37.373 373.373 32 380 32H420C426.627 32 432 37.373 432 44zM96 -52V-12C96 -5.373 90.627 0 84 0H44C37.373 0 32 -5.373 32 -12V-52C32 -58.627 37.373 -64 44 -64H84C90.627 -64 96 -58.627 96 -52zM384 -52V-12C384 -5.373 378.627 0 372 0H140C133.373 0 128 -5.373 128 -12V-52C128 -58.627 133.373 -64 140 -64H372C378.627 -64 384 -58.627 384 -52zM480 -52V-12C480 -5.373 474.627 0 468 0H428C421.373 0 416 -5.373 416 -12V-52C416 -58.627 421.373 -64 428 -64H468C474.627 -64 480 -58.627 480 -52z" /> + <glyph glyph-name="tv" + unicode="" + horiz-adv-x="640" d=" M592 448H48C21.5 448 0 426.5 0 400V80C0 53.5 21.5 32 48 32H293.1V0H133.1C115.4 0 101.1 -14.3 101.1 -32S115.4 -64 133.1 -64H517.1C534.8000000000001 -64 549.1 -49.7 549.1 -32S534.8000000000001 0 517.1 0H357.1V32H592C618.5 32 640 53.5 640 80V400C640 426.5 618.5 448 592 448zM576 96H64V384H576V96z" /> + <glyph glyph-name="umbrella" + unicode="" + horiz-adv-x="576" d=" M557.011 180.369C505.579 225.586 449.439 224.067 398.444 149.638C393.146 141.7770000000001 383.538 142.473 378.708 149.638C376.225 153.2620000000001 346.49 210.446 288 210.446C242.234 210.446 217.458 179.0680000000001 197.291 149.638C192.462 142.473 182.855 141.7770000000001 177.557 149.638C126.653 223.923 70.944 226.0440000000001 18.99 180.369C8.78 172.105 -1.922 181.478 0.294 189.85C32.146 313.427 158.516 383.3880000000001 288.001 383.3880000000001C416.794 383.3880000000001 544.547 313.427 575.707 189.85C577.913 181.528 567.281 172.057 557.011 180.369zM256 186.999V32C256 14.355 241.645 0 224 0S192 14.355 192 32C192 49.673 177.673 64 160 64S128 49.673 128 32C128 -20.935 171.065 -64 224 -64S320 -20.935 320 32V186.712C298.164 197.518 274.575 196.449 256 186.999zM320 398.0060000000001V416C320 433.673 305.673 448 288 448S256 433.673 256 416V398.0130000000001A372.105 372.105 0 0 0 320 398.0060000000001z" /> + <glyph glyph-name="underline" + unicode="" + horiz-adv-x="448" d=" M224.264 59.76C132.595 59.76 67.661 110.925 67.661 211.152V384H39.37C30.533 384 23.37 391.163 23.37 400V432C23.37 440.837 30.533 448 39.37 448H176.76C185.597 448 192.76 440.837 192.76 432V400C192.76 391.163 185.597 384 176.76 384H147.947V211.152C147.947 157.453 176.261 131.708 224.264 131.708C271.23 131.708 300.06 157.142 300.06 211.673V384H271.769C262.932 384 255.769 391.163 255.769 400V432C255.769 440.837 262.932 448 271.769 448H408.637C417.474 448 424.637 440.837 424.637 432V400C424.637 391.163 417.474 384 408.637 384H380.346V211.152C380.346 111.747 315.4650000000001 59.76 224.264 59.76zM16 0H432C440.837 0 448 -7.163 448 -16V-48C448 -56.837 440.837 -64 432 -64H16C7.163 -64 0 -56.837 0 -48V-16C0 -7.163 7.163 0 16 0z" /> + <glyph glyph-name="undo-alt" + unicode="" + horiz-adv-x="512" d=" M255.545 440C189.276 439.881 129.107 413.767 84.685 371.315L48.971 407.029C33.851 422.149 8 411.4410000000001 8 390.059V256C8 242.745 18.745 232 32 232H166.059C187.441 232 198.149 257.851 183.03 272.971L141.28 314.721C172.144 343.62 212.081 359.628 254.51 359.9940000000001C346.908 360.7920000000001 424.793 286.017 423.9940000000001 190.552C423.236 99.991 349.816 24 256 24C214.873 24 176.003 38.678 145.37 65.556C140.627 69.717 133.464 69.464 129.002 65.003L89.34 25.341C84.468 20.469 84.709 12.526 89.822 7.908C133.798 -31.813 192.074 -56 256 -56C392.966 -56 503.999 55.033 504 191.998C504.001 328.807 392.354 440.245 255.545 440z" /> + <glyph glyph-name="undo" + unicode="" + horiz-adv-x="512" d=" M212.333 223.667H12C5.373 223.667 0 229.04 0 235.667V436C0 442.627 5.373 448 12 448H60C66.627 448 72 442.627 72 436V357.8880000000001C117.773 408.721 184.26 440.53 258.175 439.993C395.081 438.999 504.623 328.37 504.332 191.461C504.041 54.742 393.12 -56 256.3330000000001 -56C192.244 -56 133.8370000000001 -31.687 89.823 8.215C84.724 12.837 84.489 20.769 89.356 25.635L123.323 59.602C127.7970000000001 64.076 134.9850000000001 64.319 139.7240000000001 60.127C170.76 32.664 211.58 16 256.3330000000001 16C353.601 16 432.3330000000001 94.716 432.3330000000001 192C432.3330000000001 289.267 353.617 368 256.3330000000001 368C197.837 368 146.053 339.524 114.059 295.6670000000001H212.333C218.96 295.6670000000001 224.333 290.294 224.333 283.6670000000001V235.667C224.333 229.04 218.96 223.667 212.333 223.667z" /> + <glyph glyph-name="universal-access" + unicode="" + horiz-adv-x="512" d=" M256 400C370.953 400 464 306.971 464 192C464 77.047 370.971 -16 256 -16C141.047 -16 48 77.029 48 192C48 306.953 141.029 400 256 400M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 384C149.961 384 64 298.039 64 192S149.961 0 256 0S448 85.961 448 192S362.039 384 256 384zM256 340C275.882 340 292 323.882 292 304S275.882 268 256 268S220 284.118 220 304S236.118 340 256 340zM373.741 241.977C345.029 235.198 318.23 229.229 291.601 226.17C292.452 125.1470000000001 303.907 103.118 316.638 70.549C320.255 61.289 315.681 50.851 306.421 47.234C297.16 43.617 286.722 48.191 283.105 57.451C274.4000000000001 79.759 266.019 98.087 260.844 136H251.158C245.991 98.149 237.624 79.792 228.896 57.451C225.281 48.196 214.846 43.615 205.581 47.234C196.321 50.8510000000001 191.747 61.29 195.364 70.549C208.077 103.09 219.549 125.09 220.401 226.1700000000001C193.772 229.2280000000001 166.973 235.1970000000001 138.26 241.9770000000001C129.66 244.0080000000001 124.334 252.6250000000001 126.365 261.226S137.012 275.1520000000001 145.614 273.1210000000001C242.3 250.2920000000001 269.897 250.338 366.389 273.1210000000001C374.988 275.1510000000001 383.6070000000001 269.827 385.6380000000001 261.226C387.6670000000001 252.6250000000001 382.341 244.0070000000001 373.7410000000001 241.9770000000001z" /> + <glyph glyph-name="university" + unicode="" + horiz-adv-x="512" d=" M496 320V304A8 8 0 0 0 488 296H464V284C464 277.373 458.627 272 452 272H60C53.373 272 48 277.373 48 284V296H24A8 8 0 0 0 16 304V320A8 8 0 0 0 20.941 327.392L252.941 415.392A7.996000000000001 7.996000000000001 0 0 0 259.0590000000001 415.392L491.059 327.392A8 8 0 0 0 496 320zM472 16H40C26.745 16 16 5.255 16 -8V-24A8 8 0 0 1 24 -32H488A8 8 0 0 1 496 -24V-8C496 5.255 485.255 16 472 16zM96 256V64H60C53.373 64 48 58.627 48 52V32H464V52C464 58.627 458.627 64 452 64H416V256H352V64H288V256H224V64H160V256H96z" /> + <glyph glyph-name="unlink" + unicode="" + horiz-adv-x="512" d=" M304.0830000000001 42.093C308.769 37.407 308.769 29.809 304.0830000000001 25.122L259.4090000000001 -19.552C200.1460000000001 -78.814 103.716 -78.818 44.448 -19.552C-14.816 39.713 -14.816 136.144 44.448 195.4080000000001L89.123 240.0830000000001C93.809 244.7690000000001 101.407 244.7690000000001 106.094 240.0830000000001L145.692 200.485C150.3780000000001 195.799 150.3780000000001 188.201 145.692 183.514L101.017 138.84C72.945 110.7670000000001 72.945 65.09 101.017 37.0170000000001C129.089 8.9450000000001 174.7670000000001 8.9440000000001 202.841 37.0170000000001L247.5150000000001 81.691C252.2010000000001 86.377 259.7990000000001 86.377 264.4860000000001 81.691L304.0830000000001 42.093zM247.5150000000001 302.3090000000001C252.2010000000001 297.6230000000001 259.7990000000001 297.6230000000001 264.4860000000001 302.3090000000001L309.1600000000001 346.9830000000001C337.2320000000001 375.0580000000001 382.9100000000001 375.0560000000001 410.9840000000001 346.9830000000001C439.0560000000001 318.9100000000001 439.0560000000001 273.2330000000001 410.9840000000001 245.1600000000001L366.3090000000001 200.486C361.6230000000001 195.8 361.6230000000001 188.202 366.3090000000001 183.5150000000001L405.9070000000001 143.917C410.593 139.2310000000001 418.1910000000001 139.2310000000001 422.8780000000001 143.917L467.5530000000001 188.5920000000001C526.8180000000001 247.8570000000001 526.8180000000001 344.2870000000001 467.5530000000001 403.552C408.2870000000001 462.816 311.8580000000001 462.816 252.5920000000001 403.552L207.918 358.8780000000001C203.232 354.192 203.232 346.5940000000001 207.918 341.9070000000001L247.5150000000001 302.3090000000001zM482.3430000000001 -56.9709999999999L504.9700000000001 -34.3439999999999C514.3430000000001 -24.9709999999999 514.3430000000001 -9.7749999999999 504.9700000000001 -0.4029999999999L63.598 440.971C54.225 450.344 39.029 450.344 29.657 440.971L7.029 418.343C-2.344 408.9700000000001 -2.344 393.774 7.029 384.402L448.402 -56.971C457.775 -66.343 472.971 -66.343 482.343 -56.971z" /> + <glyph glyph-name="unlock-alt" + unicode="" + horiz-adv-x="448" d=" M400 192H152V295.1C152 334.7 183.7 367.6 223.3 368C263.3 368.4 296 335.9 296 296V280C296 266.7 306.7 256 320 256H352C365.3 256 376 266.7 376 280V296C376 380 307.5 448.3 223.5 448C139.5 447.7 72 378.5 72 294.5V192H48C21.5 192 0 170.5 0 144V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V144C448 170.5 426.5 192 400 192zM264 40C264 17.9 246.1 0 224 0S184 17.9 184 40V88C184 110.1 201.9 128 224 128S264 110.1 264 88V40z" /> + <glyph glyph-name="unlock" + unicode="" + horiz-adv-x="448" d=" M400 192H152V295.1C152 334.7 183.7 367.6 223.3 368C263.3 368.4 296 335.9 296 296V280C296 266.7 306.7 256 320 256H352C365.3 256 376 266.7 376 280V296C376 380 307.5 448.3 223.5 448C139.5 447.7 72 378.5 72 294.5V192H48C21.5 192 0 170.5 0 144V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V144C448 170.5 426.5 192 400 192z" /> + <glyph glyph-name="upload" + unicode="" + horiz-adv-x="512" d=" M296 64H216C202.7 64 192 74.7 192 88V256H104.3C86.5 256 77.6 277.5 90.2 290.1L242.3 442.3C249.8 449.8 262.1 449.8 269.6 442.3L421.8 290.1C434.4000000000001 277.5 425.5 256 407.7 256H320V88C320 74.7 309.3 64 296 64zM512 72V-40C512 -53.3 501.3 -64 488 -64H24C10.7 -64 0 -53.3 0 -40V72C0 85.3 10.7 96 24 96H160V88C160 57.1 185.1 32 216 32H296C326.9 32 352 57.1 352 88V96H488C501.3 96 512 85.3 512 72zM388 -16C388 -5 379 4 368 4S348 -5 348 -16S357 -36 368 -36S388 -27 388 -16zM452 -16C452 -5 443 4 432 4S412 -5 412 -16S421 -36 432 -36S452 -27 452 -16z" /> + <glyph glyph-name="user-circle" + unicode="" + horiz-adv-x="512" d=" M8 192C8 328.967 119.033 440 256 440S504 328.967 504 192S392.967 -56 256 -56S8 55.033 8 192zM80.455 66.132C119.657 11.554 183.673 -24 256 -24S392.343 11.554 431.545 66.132C428.404 93.122 408.878 115.78 382.007 122.498L349.6329999999999 130.591C323.565 108.21 290.722 96 256 96S188.435 108.21 162.366 130.591L129.992 122.498C103.122 115.78 83.596 93.122 80.455 66.132zM144 240C144 178.144 194.144 128 256 128S368 178.144 368 240S317.856 352 256 352S144 301.856 144 240z" /> + <glyph glyph-name="user-md" + unicode="" + horiz-adv-x="448" d=" M224 192C294.7 192 352 249.3 352 320S294.7 448 224 448S96 390.7 96 320S153.3 192 224 192zM104 24C104 10.7 114.7 0 128 0S152 10.7 152 24S141.3 48 128 48S104 37.3 104 24zM354.4 175.6L320 181.3V126.3C356.5 118.9 384 86.5 384 47.9V-8.1C384 -15.7 378.6 -22.3 371.1 -23.8L338.9000000000001 -30.2C334.6 -31.1 330.4000000000001 -28.3 329.5000000000001 -23.9L326.4000000000001 -8.2C325.5000000000001 -3.9 328.3 0.4 332.7000000000001 1.2L352.0000000000001 5.1V48C352.0000000000001 77.6 325.1000000000001 101 294.4000000000001 95.1C271.6 90.7000000000001 256.0000000000001 69.3 256.0000000000001 46.1V5.1L275.3000000000001 1.2C279.6000000000001 0.3000000000001 282.4000000000001 -3.9 281.6000000000001 -8.1999999999999L278.5000000000001 -23.8999999999999C277.6000000000001 -28.1999999999999 273.4000000000001 -30.9999999999999 269.1000000000001 -30.1999999999999L237.9000000000001 -25.9999999999999C230.0000000000001 -24.8999999999999 224.1000000000001 -18.1999999999999 224.1000000000001 -10.1V47.9C224.1000000000001 86.5000000000001 251.6000000000001 118.8000000000001 288.1000000000001 126.3000000000001V173.5000000000001C268.5000000000001 164.9 246.9000000000001 159.9 224.1000000000001 159.9C194.8000000000001 159.9 167.7000000000001 168.4 144.1000000000001 182.2000000000001V77.3000000000001C167.2000000000001 70.4000000000001 184.1000000000001 49.2 184.1000000000001 23.9000000000001C184.1000000000001 -6.9999999999999 159.0000000000001 -32.0999999999999 128.1000000000001 -32.0999999999999S72.1000000000001 -6.9999999999999 72.1000000000001 23.9000000000001C72.1000000000001 49.2000000000001 89.0000000000001 70.4000000000001 112.1000000000001 77.3000000000001V178.7L93.7000000000001 175.6C39.7000000000001 166.6 0.1000000000001 119.9 0.1000000000001 65.1V-32C0.1000000000001 -49.7 14.4000000000001 -64 32.1000000000001 -64H416.1000000000001C433.8000000000001 -64 448.1000000000001 -49.7 448.1000000000001 -32V65.1C448.0000000000001 119.9 408.4000000000001 166.6 354.4000000000001 175.6z" /> + <glyph glyph-name="user-plus" + unicode="" + horiz-adv-x="640" d=" M224 416C301.32 416 364 353.32 364 276S301.32 136 224 136S84 198.68 84 276S146.68 416 224 416zM384.373 123.907L321.974 139.507C256.417 92.353 176.953 102.876 126.026 139.507L63.627 123.907C26.233 114.558 0 80.96 0 42.415V10C0 -13.196 18.804 -32 42 -32H406C429.1960000000001 -32 448 -13.196 448 10V42.415C448 80.96 421.767 114.558 384.373 123.9070000000001zM628 223.111H559.111V292C559.111 298.627 553.7379999999999 304 547.111 304H508.889C502.262 304 496.889 298.627 496.889 292L496.887 223.113L428 223.111C421.373 223.111 416 217.738 416 211.111V172.889C416 166.262 421.373 160.889 428 160.889L496.887 160.887L496.889 92C496.889 85.373 502.262 80 508.889 80H547.111C553.7379999999999 80 559.111 85.373 559.111 92L559.1129999999999 160.887L628 160.889C634.627 160.889 640 166.262 640 172.889V211.111C640 217.738 634.627 223.111 628 223.111z" /> + <glyph glyph-name="user-secret" + unicode="" + horiz-adv-x="448" d=" M388.829 152.676L409.801 207.728C412.793 215.582 406.992 224 398.587 224H340.39C347.84 240.236 352 258.297 352 277.333C352 280.964 351.84 284.557 351.544 288.111C391.0830000000001 295.926 416 307.3160000000001 416 320C416 333.2630000000001 388.769 345.112 346.053 352.937C336.868 385.742 318.875 418.734 305.339 435.787C295.887 447.695 279.466 451.421 265.868 444.621L238.311 430.842A31.997 31.997 0 0 0 209.689 430.842L182.132 444.622C168.5330000000001 451.421 152.112 447.696 142.661 435.788C129.125 418.735 111.132 385.743 101.947 352.938C59.231 345.112 32 333.2630000000001 32 320C32 307.3160000000001 56.917 295.926 96.456 288.111A129.362 129.362 0 0 1 96 277.333C96 258.296 100.159 240.235 107.608 224H50.198C41.583 224 35.775 215.192 39.169 207.273L62.075 153.826C25.799 140.118 0 105.075 0 64V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V64C448 103.97 423.57 138.231 388.829 152.676zM184 -40L136 152L184 128L208 88L184 -40zM264 -40L240 88L264 128L312 152L264 -40zM318.778 263.746C318.7700000000001 263.703 314.4790000000001 260.515 313.653 257.975C309.7920000000001 246.111 306.627 233.403 297.139 224.616C287.068 215.289 249.182 202.211 233.143 249.645C230.306 258.04 217.696 258.043 214.858 249.645C197.895 199.477 158.839 217.228 150.862 224.616C141.374 233.402 138.209 246.111 134.348 257.975C133.522 260.515 129.23 263.703 129.223 263.746C128.669 266.671 128.242 269.63 128.003 272.596C127.694 276.444 138.081 276.254 139.081 276.343C165.384 278.669 191.384 276.922 217.104 270.846C219.667 270.24 228.657 270.317 230.897 270.846C256.617 276.9219999999999 282.617 278.67 308.92 276.343C309.922 276.254 320.307 276.445 319.998 272.596C319.759 269.63 319.332 266.671 318.7779999999999 263.746z" /> + <glyph glyph-name="user-times" + unicode="" + horiz-adv-x="640" d=" M224 416C301.32 416 364 353.32 364 276S301.32 136 224 136S84 198.68 84 276S146.68 416 224 416zM384.373 123.907L321.974 139.507C256.417 92.353 176.953 102.876 126.026 139.507L63.627 123.907C26.233 114.558 0 80.96 0 42.415V10C0 -13.196 18.804 -32 42 -32H406C429.1960000000001 -32 448 -13.196 448 10V42.415C448 80.96 421.767 114.558 384.373 123.9070000000001zM587.897 192L636.493 240.598C641.168 245.273 641.168 252.854 636.493 257.529L609.529 284.4930000000001C604.854 289.168 597.273 289.168 592.598 284.4930000000001L544 235.895L495.402 284.493C490.727 289.168 483.146 289.168 478.471 284.493L451.507 257.529C446.832 252.854 446.832 245.273 451.507 240.598L500.103 192L451.507 143.402C446.832 138.727 446.832 131.146 451.507 126.471L478.471 99.507C483.146 94.832 490.727 94.832 495.402 99.507L544 148.103L592.598 99.507C597.2729999999999 94.832 604.8539999999999 94.832 609.529 99.507L636.4929999999999 126.471C641.1679999999999 131.146 641.1679999999999 138.727 636.4929999999999 143.402L587.897 192z" /> + <glyph glyph-name="user" + unicode="" + horiz-adv-x="512" d=" M256 448C344.366 448 416 376.366 416 288S344.366 128 256 128S96 199.634 96 288S167.634 448 256 448zM439.283 114.179L367.9700000000001 132.007C293.0470000000001 78.117 202.232 90.143 144.03 132.007L72.717 114.179C29.981 103.495 0 65.097 0 21.045V-16C0 -42.51 21.49 -64 48 -64H464C490.51 -64 512 -42.51 512 -16V21.045C512 65.097 482.019 103.495 439.283 114.179z" /> + <glyph glyph-name="users" + unicode="" + horiz-adv-x="640" d=" M320 384C377.99 384 425 336.99 425 279S377.99 174 320 174S215 221.01 215 279S262.01 384 320 384zM433.463 166.634L393.481 176.63C344.313 141.265 284.715 149.157 246.52 176.63L206.538 166.634C174.485 158.621 152 129.823 152 96.784V36C152 16.118 168.118 0 188 0H452C471.882 0 488 16.118 488 36V96.784C488 129.823 465.515 158.621 433.463 166.634zM528 148C566.66 148 598 179.34 598 218S566.66 288 528 288S458 256.66 458 218S489.34 148 528 148zM112 148C150.66 148 182 179.34 182 218S150.66 288 112 288S42 256.66 42 218S73.34 148 112 148zM136 36V96.784C136 113.335 140.593 128.988 148.703 142.383C118.715 127.663 85.367 133.675 63.013 149.753L36.358 143.089C14.99 137.748 0 118.548 0 96.523V56C0 42.745 10.745 32 24 32H136.169A52.417 52.417 0 0 0 136 36zM603.642 143.09L576.9870000000001 149.754C549.0620000000001 129.668 516.0970000000001 130.521 491.2010000000001 142.536C499.369 129.107 504 113.399 504 96.784V36C504 34.653 503.932 33.322 503.831 32H616C629.255 32 640 42.745 640 56V96.523C640 118.548 625.01 137.7480000000001 603.642 143.09z" /> + <glyph glyph-name="utensil-spoon" + unicode="" + horiz-adv-x="512" d=" M480.1 416.1C425.1 471.2 315.2000000000001 450.6 252.3 387.6C203 338.3 197.2 277.6 223.5 227.2L9 34.8C-2.6 24.3 -3.1 6.3 8 -4.7L59.3 -56C70.3 -67 88.4 -66.5 98.8 -54.9L291.2 159.5C341.6 133.2 402.3 139 451.6 188.3C514.6 251.2 535.2 361.1 480.1 416.1z" /> + <glyph glyph-name="utensils" + unicode="" + horiz-adv-x="416" d=" M207.9 432.8C208.7 428.1 224 338.3 224 304C224 251.7 196.2 214.4 155.1 199.4L168 -38.7C168.7 -52.4 157.8 -64 144 -64H80C66.3 -64 55.3 -52.5 56 -38.7L68.9 199.4C27.7 214.4 0 251.8 0 304C0 338.4 15.3 428.1 16.1 432.8C19.3 453.1 61.4 453.4 64 431.7V290.5C65.3 287.1 79.1 287.3 80 290.5C81.4 315.8 87.9 429.7 88 432.3C91.3 453.1 132.7 453.1 135.9 432.3C136.1 429.6 142.5 315.8 143.9 290.5C144.8 287.3 158.7 287.1 159.9 290.5V431.7C162.5 453.3 204.7 453.1 207.9 432.8zM327.1 147.1L312.1 -38C310.9000000000001 -52 322 -64 336 -64H392C405.3 -64 416 -53.3 416 -40V424C416 437.2 405.3 448 392 448C309.5 448 170.6 269.5 327.1 147.1z" /> + <glyph glyph-name="venus-double" + unicode="" + horiz-adv-x="512" d=" M288 272C288 351.5 223.5 416 144 416S0 351.5 0 272C0 203.5 47.9 146.1 112 131.6V80H76C69.4 80 64 74.6 64 68V28C64 21.4 69.4 16 76 16H112V-20C112 -26.6 117.4 -32 124 -32H164C170.6 -32 176 -26.6 176 -20V16H212C218.6 16 224 21.4 224 28V68C224 74.6 218.6 80 212 80H176V131.6C240.1 146.1 288 203.5 288 272zM64 272C64 316.1 99.9 352 144 352S224 316.1 224 272S188.1 192 144 192S64 227.9 64 272zM400 131.6V80H436C442.6 80 448 74.6 448 68V28C448 21.4 442.6 16 436 16H400V-20C400 -26.6 394.6 -32 388 -32H348C341.4 -32 336 -26.6 336 -20V16H300C293.4 16 288 21.4 288 28V68C288 74.6 293.4 80 300 80H336V131.6C314.8 136.4 295.4 145.9 278.8 158.9C292.8 175.6 303.8 194.9 310.9000000000001 216C325.4000000000001 201.2 345.6 192 368.0000000000001 192C412.1000000000001 192 448.0000000000001 227.9000000000001 448.0000000000001 272S412.1000000000001 352 368.0000000000001 352C345.7000000000001 352 325.4000000000001 342.8 310.9000000000001 328C303.8 349.1 292.9000000000001 368.4000000000001 278.8 385.1C303.4 404.4 334.3 416 368 416C447.5 416 512 351.5 512 272C512 203.5 464.1 146.1 400 131.6z" /> + <glyph glyph-name="venus-mars" + unicode="" + horiz-adv-x="576" d=" M564 448H485C474.3 448 469 435.1 476.5 427.5L493.4 410.6L444.7 361.9C422.5 375.9 396.2 384 368 384C334.3 384 303.4 372.4 278.8 353.1C292.8 336.4 303.8 317.1 310.9000000000001 296C325.4000000000001 310.8 345.6 320 368.0000000000001 320C412.1000000000001 320 448.0000000000001 284.1 448.0000000000001 240S412.1000000000001 160 368.0000000000001 160C345.7000000000001 160 325.4000000000001 169.2 310.9000000000001 184C303.8 162.9 292.9000000000001 143.6 278.8 126.9C303.3 107.5 334.3 96 368 96C447.5 96 512 160.5 512 240C512 268.2 503.9 294.5 489.9 316.7L538.6 365.4L555.5 348.5C557.9 346.1 560.9 345 563.9 345C570.1 345 576 349.8 576 357V436C576 442.6 570.6 448 564 448zM144 384C64.5 384 0 319.5 0 240C0 171.5 47.9 114.1 112 99.6V48H76C69.4 48 64 42.6 64 36V-4C64 -10.6 69.4 -16 76 -16H112V-52C112 -58.6 117.4 -64 124 -64H164C170.6 -64 176 -58.6 176 -52V-16H212C218.6 -16 224 -10.6 224 -4V36C224 42.6 218.6 48 212 48H176V99.6C240.1 114.2000000000001 288 171.5 288 240.0000000000001C288 319.5 223.5 384 144 384zM144 160C99.9 160 64 195.9 64 240S99.9 320 144 320S224 284.1 224 240S188.1 160 144 160z" /> + <glyph glyph-name="venus" + unicode="" + horiz-adv-x="288" d=" M288 272C288 351.5 223.5 416 144 416S0 351.5 0 272C0 203.5 47.9 146.1 112 131.6V80H76C69.4 80 64 74.6 64 68V28C64 21.4 69.4 16 76 16H112V-20C112 -26.6 117.4 -32 124 -32H164C170.6 -32 176 -26.6 176 -20V16H212C218.6 16 224 21.4 224 28V68C224 74.6 218.6 80 212 80H176V131.6C240.1 146.1 288 203.5 288 272zM64 272C64 316.1 99.9 352 144 352S224 316.1 224 272S188.1 192 144 192S64 227.9 64 272z" /> + <glyph glyph-name="video" + unicode="" + horiz-adv-x="576" d=" M528 384H515.882A48 48 0 0 1 481.9409999999999 369.9410000000001L384 272V336C384 362.51 362.51 384 336 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H336C362.51 0 384 21.49 384 48V112L481.941 14.059A48 48 0 0 1 515.882 0H528C554.51 0 576 21.49 576 48V336C576 362.51 554.51 384 528 384z" /> + <glyph glyph-name="volleyball-ball" + unicode="" + horiz-adv-x="495.9" d=" M223.3 204.6C222.4 241.6 214.7 277.4 200.6 310.3C109.8 267.9 43.1 187.9 20.3 93.5C33.7 62.7 53.2 35.2 77.2 12.4C99.9 91.6 151.4 160.2 223.3 204.6zM186.4 339C171.4 365.4 151.9 389.1 129 409.7C38 359.9 -15.8 256.8 4 147.5C37.4 230.6 102.4 299.5 186.4 339zM374 173.9C382.6 273.7 346.7 371.4 276.5 438.3C261.8 440 224.9 443.8 177.6 429.8C234.9 370.5 268.6 291.6 271.1 207.1C303.6 189.4 338.4000000000001 178.1 374 173.9zM249.3 164.4C217.7 145.1 190.6 120.5 169.1 91.8C251.1 34.4999999999999 353.6 16.6999999999999 446.6 43.9999999999999C466.3 70.3999999999999 480.8 100.8 488.8 133.9C462.2 127.3 435.1 123.5 407.9 123.5C353.3 123.6 299 137.6 249.3 164.4zM151 64.7C135.8 38.7 125.3 10.3 118.9 -19.5C156.5 -42.5 200.6 -56 248 -56C309 -56 364.7 -33.9 407.9 2.6C295 -13.5 204.6 27.4 151 64.7zM331.3 425.3C386.6 354.9 413.8 264.1 405.9 171.7C436.2 171.5 466.4 176.5 495.6 185.9C495.6 187.9 495.9 189.9 495.9 191.9C495.9 299.7 427.2 391 331.3 425.3z" /> + <glyph glyph-name="volume-down" + unicode="" + horiz-adv-x="384" d=" M256 359.983V24.019C256 2.581 230.057 -7.979 215.029 7.048L126.059 96H24C10.745 96 0 106.745 0 120V264C0 277.255 10.745 288 24 288H126.059L215.03 376.954C230.04 391.964 256 381.444 256 359.983zM384 192C384 225.717 366.814 256.35 338.028 273.944C322.949 283.158 303.2530000000001 278.4070000000001 294.036 263.3280000000001S289.572 228.5530000000001 304.651 219.3360000000001C314.263 213.462 320 203.243 320 192A32.056 32.056 0 0 0 306.198 165.668C291.674 155.599 288.062 135.662 298.131 121.138C308.201 106.6130000000001 328.139 103.002 342.661 113.071C368.546 131.017 384 160.522 384 192z" /> + <glyph glyph-name="volume-off" + unicode="" + horiz-adv-x="256" d=" M256 359.983V24.019C256 2.581 230.057 -7.979 215.029 7.048L126.059 96H24C10.745 96 0 106.745 0 120V264C0 277.255 10.745 288 24 288H126.059L215.03 376.954C230.04 391.964 256 381.444 256 359.983z" /> + <glyph glyph-name="volume-up" + unicode="" + horiz-adv-x="576" d=" M256 359.983V24.019C256 2.581 230.057 -7.979 215.029 7.048L126.059 96H24C10.745 96 0 106.745 0 120V264C0 277.255 10.745 288 24 288H126.059L215.03 376.954C230.04 391.964 256 381.444 256 359.983zM438.0560000000001 437.8590000000001C422.9820000000001 447.08 403.283 442.332 394.061 427.255C384.84 412.178 389.588 392.481 404.665 383.26C468.967 343.937 512 273.017 512 192C512 118.569 475.923 49.708 415.493 7.794C400.971 -2.278 397.364 -22.216 407.436 -36.738C417.512 -51.266 437.452 -54.864 451.967 -44.795C529.633 9.073 576 97.594 576 192C576 295.2440000000001 521.421 386.877 438.0560000000001 437.8590000000001zM480 192C480 260.5470000000001 443.85 321.777 388.043 355.901C372.967 365.121 353.269 360.372 344.049 345.294C334.829 330.216 339.578 310.52 354.656 301.3C393.067 277.812 416 236.952 416 192C416 150.036 395.38 110.681 360.842 86.724C346.321 76.651 342.714 56.714 352.786 42.192C359.002 33.232 368.971 28.427 379.108 28.427A31.861999999999995 31.861999999999995 0 0 1 397.318 34.136C449.091 70.047 480 129.062 480 192zM384 192C384 225.717 366.814 256.35 338.028 273.944C322.949 283.158 303.2530000000001 278.4070000000001 294.036 263.3280000000001S289.572 228.5530000000001 304.651 219.3360000000001C314.263 213.462 320 203.243 320 192A32.056 32.056 0 0 0 306.198 165.668C291.674 155.599 288.062 135.662 298.131 121.138C308.201 106.6130000000001 328.139 103.002 342.661 113.071C368.546 131.017 384 160.522 384 192z" /> + <glyph glyph-name="warehouse" + unicode="" + horiz-adv-x="640" d=" M504 96H136.4C132 96 128.4 92.4 128.4 88L128.3 40C128.3 35.6 131.9 32 136.3 32H504C508.4 32 512 35.6 512 40V88C512 92.4 508.4 96 504 96zM504 0H136.1C131.7 0 128.1 -3.6 128.1 -8L128 -56C128 -60.4 131.6 -64 136 -64H504C508.4 -64 512 -60.4 512 -56V-8C512 -3.6 508.4 0 504 0zM504 192H136.6C132.2 192 128.6 188.4 128.6 184L128.5 136C128.5 131.6 132.1 128 136.5 128H504C508.4 128 512 131.6 512 136V184C512 188.4 508.4 192 504 192zM610.5 331L338.4 444.3A48.15 48.15 0 0 1 301.5 444.3L29.5 331C11.7 323.5 0 306.1 0 286.7V-56C0 -60.4 3.6 -64 8 -64H88C92.4 -64 96 -60.4 96 -56V192C96 209.6 110.6 224 128.6 224H511.4C529.4 224 544 209.6 544 192V-56C544 -60.4 547.6 -64 552 -64H632C636.4 -64 640 -60.4 640 -56V286.7C640 306.1 628.3 323.5 610.5 331z" /> + <glyph glyph-name="weight" + unicode="" + horiz-adv-x="512" d=" M448 384H422C438.4 355.7 448 323 448 288C448 182.1 361.9 96 256 96S64 182.1 64 288C64 323 73.6 355.7 90 384H64C28.7 384 0 355.3 0 320V0C0 -35.3 28.7 -64 64 -64H448C483.3 -64 512 -35.3 512 0V320C512 355.3 483.3 384 448 384zM256 128C344.4 128 416 199.6 416 288S344.4 448 256 448S96 376.4 96 288S167.6 128 256 128zM255.7 279.9L289.3 358.3C292.8 366.5 302.2 370.2000000000001 310.3 366.7000000000001S322.2 353.8 318.7 345.7000000000001L285 267.1C291.7 260 295.9 250.5 295.9 240C295.9 217.9 278 200 255.9 200S215.9 217.9 215.9 240C216 262 233.8 279.8 255.7 279.9z" /> + <glyph glyph-name="wheelchair" + unicode="" + horiz-adv-x="512" d=" M496.101 62.331L510.328 33.668C514.257 25.753 511.025 16.152 503.11 12.223L437.645 -20.663C421.596 -28.63 402.089 -21.857 394.456 -5.608L331.679 128H192C176.075 128 162.574 139.71 160.321 155.475C126.433 392.692 128.38 377.956 128 384C128 420.358 158.318 449.635 195.052 447.929C228.3230000000001 446.384 255.1 419.024 255.9770000000001 385.728C256.8450000000001 352.795 232.8250000000001 325.305 201.369 320.689L206.039 287.999H336C344.837 287.999 352 280.836 352 271.999V239.999C352 231.162 344.837 223.999 336 223.999H215.182L219.754 191.999H352A32 32 0 0 0 380.962 173.607L438.477 51.2L474.655 69.549C482.57 73.478 492.172 70.246 496.101 62.331zM311.358 96H286.852C279.064 41.796 232.324 0 176 0C114.243 0 64 50.243 64 112C64 153.505 86.694 189.809 120.324 209.156C116.612 235.121 113.48 257.016 110.836 275.4890000000001C45.956 249.536 0 186.037 0 112C0 14.953 78.953 -64 176 -64C247.87 -64 309.8060000000001 -20.692 337.11 41.192L311.358 96z" /> + <glyph glyph-name="wifi" + unicode="" + horiz-adv-x="640" d=" M384 32C384 -3.346 355.346 -32 320 -32S256 -3.346 256 32C256 67.346 284.654 96 320 96S384 67.346 384 32zM520.659 156.443C527.124 162.908 526.904 173.508 520.095 179.61C406.302 281.5950000000001 233.569 281.4790000000001 119.905 179.61C113.096 173.5080000000001 112.876 162.908 119.341 156.443L153.347 122.437C159.274 116.51 168.811 116.117 175.1160000000001 121.641C257.9960000000001 194.25 382.1900000000001 194.088 464.884 121.641C471.189 116.117 480.726 116.509 486.653 122.437L520.659 156.443zM632.769 270.161C639.154 276.546 639.023 286.977 632.419 293.134C456.651 456.994 183.285 456.934 7.582 293.134C0.978 286.977 0.847 276.545 7.232 270.161L41.198 236.195C47.293 230.1 57.089 229.964 63.422 235.812C208.185 369.48 431.778 369.514 576.578 235.812C582.911 229.964 592.707 230.1 598.802 236.195L632.769 270.161z" /> + <glyph glyph-name="window-close" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM380.4 125.5C385.2 120.7 385.2 112.9 380.4 108.1L339.9 67.6C335.1 62.8 327.3 62.8 322.5 67.6L256 134.7L189.5 67.6C184.7 62.8 176.9 62.8 172.1 67.6L131.6 108.1C126.8 112.9 126.8 120.7000000000001 131.6 125.5L198.7 192L131.6 258.5C126.8 263.3 126.8 271.1 131.6 275.9L172.1 316.4C176.9 321.2 184.7 321.2 189.5 316.4L256 249.3L322.5 316.4C327.3 321.2 335.1 321.2 339.9 316.4L380.4 275.9C385.2 271.1 385.2 263.3 380.4 258.5L313.3 192L380.4 125.5z" /> + <glyph glyph-name="window-maximize" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM448 256H64V340C64 346.6 69.4 352 76 352H436C442.6 352 448 346.6 448 340V256z" /> + <glyph glyph-name="window-minimize" + unicode="" + horiz-adv-x="512" d=" M464 96H48C21.5 96 0 74.5 0 48V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V48C512 74.5 490.5 96 464 96z" /> + <glyph glyph-name="window-restore" + unicode="" + horiz-adv-x="512" d=" M512 400V112C512 85.5 490.5 64 464 64H416V272C416 316.1 380.1 352 336 352H128V400C128 426.5 149.5 448 176 448H464C490.5 448 512 426.5 512 400zM384 272V-16C384 -42.5 362.5 -64 336 -64H48C21.5 -64 0 -42.5 0 -16V272C0 298.5 21.5 320 48 320H336C362.5 320 384 298.5 384 272zM316 244C316 250.6 310.6 256 304 256H76C69.4 256 64 250.6 64 244V192H316V244z" /> + <glyph glyph-name="won-sign" + unicode="" + horiz-adv-x="576" d=" M564 256C570.627 256 576 261.373 576 268V308C576 314.627 570.627 320 564 320H515.972L534.544 400.61C536.276 408.128 530.566 415.304 522.851 415.304H476.744A11.998 11.998 0 0 1 465.008 405.804L450.73 320H340.839L321.114 405.987A12 12 0 0 1 309.418 415.304H265.43A12 12 0 0 1 253.743 406.027L233.696 320H124.975L107.5 405.701A12 12 0 0 1 95.742 415.303H53.628C45.942 415.303 40.238 408.179 41.919 400.679L60 320H12C5.373 320 0 314.627 0 308V268C0 261.373 5.373 256 12 256H74.342L81.513 224H12C5.373 224 0 218.627 0 212V172C0 165.373 5.373 160 12 160H95.856L136.783 -22.624A12 12 0 0 1 148.492 -32H205.259C210.842 -32 215.687 -28.15 216.948 -22.712L259.335 160H314.421L356.807 -22.712A12 12 0 0 1 368.496 -32H425.322A12 12 0 0 1 437.016 -22.694L479.108 160H564C570.627 160 576 165.373 576 172V212C576 218.627 570.627 224 564 224H493.854L501.227 256H564zM138.024 256H218.781L211.324 224H144.548L138.024 256zM183.82 105.971C177.626 80.14 177.062 58.721 176.499 58.721H175.373S173.684 80.771 168.615 105.971L157.599 160H196.411L183.82 105.971zM274.182 224L276.178 232.602C278.034 240.564 279.635 248.57 280.981 256H292.775C294.122 248.57 295.722 240.564 297.578 232.602L299.574 224H274.182zM405.141 105.971C400.0730000000001 80.771 398.3830000000001 58.721 398.3830000000001 58.721H397.2570000000001C396.6940000000001 58.721 396.1310000000001 80.141 389.9360000000001 105.971L377.542 160H416.649L405.141 105.971zM430.281 224H362.861L355.521 256H437.098L430.281 224z" /> + <glyph glyph-name="wrench" + unicode="" + horiz-adv-x="512" d=" M481.156 248C490.456 248 496.276 237.845 491.481 229.876C466.295 188.008 420.419 160 368 160C288.778 160 224.499 223.974 224.003 303.079C223.505 382.531 288.548 448.001 368.002 448C420.3640000000001 447.999 466.198 420.051 491.402 378.257C496.24 370.234 490.523 360 481.154 360H376L336 304L376 248H481.156zM309.507 154.997L109.255 -45.255C84.261 -70.248 43.74 -70.249 18.745 -45.255C-6.248 -20.261 -6.248 20.261 18.745 45.255L218.991 245.5C235.151 204.303 268.294 171.165 309.507 154.997zM104 16C104 29.255 93.255 40 80 40S56 29.255 56 16S66.745 -8 80 -8S104 2.745 104 16z" /> + <glyph glyph-name="yen-sign" + unicode="" + horiz-adv-x="384" d=" M351.2080000000001 416H285.9310000000001A12 12 0 0 1 275.153 409.276L219.763 296.113C205.25 261.409 192.63 224.181 192.63 224.181H191.368S178.748 261.409 164.235 296.113L108.845 409.276A11.997 11.997 0 0 1 98.068 416H32.792C23.735 416 17.942 406.35 22.202 398.357L102.322 248H44C37.373 248 32 242.627 32 236V204C32 197.373 37.373 192 44 192H132.162L152 154.772V128H44C37.373 128 32 122.627 32 116V84C32 77.373 37.373 72 44 72H152V-20C152 -26.627 157.373 -32 164 -32H220C226.627 -32 232 -26.627 232 -20V72H340C346.627 72 352 77.373 352 84V116C352 122.627 346.627 128 340 128H232V154.772L251.838 192H340C346.627 192 352 197.373 352 204V236C352 242.627 346.627 248 340 248H281.678L361.798 398.357C366.058 406.35 360.266 416 351.2080000000001 416z" /> + </font> +</defs> +</svg> diff --git a/.next/static/media/icons.a01e3f2d6c83dc3aee175e2482b3f777.eot b/.next/static/media/icons.a01e3f2d6c83dc3aee175e2482b3f777.eot new file mode 100644 index 0000000..ef75106 Binary files /dev/null and b/.next/static/media/icons.a01e3f2d6c83dc3aee175e2482b3f777.eot differ diff --git a/.next/static/media/icons.c656b8caa454ed19b9a2ef7f4f5b8fea.ttf b/.next/static/media/icons.c656b8caa454ed19b9a2ef7f4f5b8fea.ttf new file mode 100644 index 0000000..17bb674 Binary files /dev/null and b/.next/static/media/icons.c656b8caa454ed19b9a2ef7f4f5b8fea.ttf differ diff --git a/.next/static/media/outline-icons.5367103510b27b78482794590e1ce3b0.ttf b/.next/static/media/outline-icons.5367103510b27b78482794590e1ce3b0.ttf new file mode 100644 index 0000000..ee13f84 Binary files /dev/null and b/.next/static/media/outline-icons.5367103510b27b78482794590e1ce3b0.ttf differ diff --git a/.next/static/media/outline-icons.687a4990ea22bb1a49d469a5d9319790.woff2 b/.next/static/media/outline-icons.687a4990ea22bb1a49d469a5d9319790.woff2 new file mode 100644 index 0000000..35cc7b3 Binary files /dev/null and b/.next/static/media/outline-icons.687a4990ea22bb1a49d469a5d9319790.woff2 differ diff --git a/.next/static/media/outline-icons.752905fa5edf21fc52a10a0c1ca9c7a4.eot b/.next/static/media/outline-icons.752905fa5edf21fc52a10a0c1ca9c7a4.eot new file mode 100644 index 0000000..cda0a84 Binary files /dev/null and b/.next/static/media/outline-icons.752905fa5edf21fc52a10a0c1ca9c7a4.eot differ diff --git a/.next/static/media/outline-icons.9c4845b4b41ef40a22faee76144fa816.svg b/.next/static/media/outline-icons.9c4845b4b41ef40a22faee76144fa816.svg new file mode 100644 index 0000000..2875252 --- /dev/null +++ b/.next/static/media/outline-icons.9c4845b4b41ef40a22faee76144fa816.svg @@ -0,0 +1,366 @@ +<?xml version="1.0" standalone="no"?> +<!-- +Font Awesome Free 5.0.8 by @fontawesome - https://fontawesome.com +License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) +--> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<defs> + <font id="fontawesome-free" horiz-adv-x="640"> + <font-face font-family="Font Awesome 5 Free" + units-per-em="512" ascent="448" + descent="64" + font-weight="400" + font-style="Regular" /> + <missing-glyph horiz-adv-x="0" /> + <glyph glyph-name="address-book" + unicode="" + horiz-adv-x="448" d=" M436 288C442.627 288 448 293.373 448 300V340C448 346.627 442.627 352 436 352H416V400C416 426.51 394.51 448 368 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H368C394.51 -64 416 -42.51 416 -16V32H436C442.627 32 448 37.373 448 44V84C448 90.627 442.627 96 436 96H416V160H436C442.627 160 448 165.373 448 172V212C448 218.627 442.627 224 436 224H416V288H436zM362 -16H54A6 6 0 0 0 48 -10V394A6 6 0 0 0 54 400H362A6 6 0 0 0 368 394V-10A6 6 0 0 0 362 -16zM128 240C128 284.183 163.817 320 208 320S288 284.183 288 240S252.183 160 208 160S128 195.817 128 240zM336 106.523V88C336 74.745 325.255 64 312 64H104C90.745 64 80 74.745 80 88V106.523C80 128.549 94.99 147.7480000000001 116.358 153.09L152.015 162.004C181.116 141.072 226.524 135.059 263.985 162.004L299.642 153.09C321.01 147.748 336 128.548 336 106.523z" /> + <glyph glyph-name="address-card" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM458 48H54A6 6 0 0 0 48 54V330A6 6 0 0 0 54 336H458A6 6 0 0 0 464 330V54A6 6 0 0 0 458 48zM404 224H300C293.373 224 288 229.373 288 236V252C288 258.627 293.373 264 300 264H404C410.627 264 416 258.627 416 252V236C416 229.373 410.627 224 404 224zM404 152H300C293.373 152 288 157.373 288 164V180C288 186.627 293.373 192 300 192H404C410.627 192 416 186.627 416 180V164C416 157.373 410.627 152 404 152zM176 288C209.137 288 236 261.137 236 228S209.137 168 176 168S116 194.863 116 228S142.863 288 176 288zM244.731 162.817L217.989 169.503C189.893 149.294 155.837 153.804 134.011 169.503L107.269 162.817C91.243 158.811 80 144.411 80 127.892V114C80 104.059 88.059 96 98 96H254C263.941 96 272 104.059 272 114V127.892C272 144.411 260.757 158.811 244.731 162.817z" /> + <glyph glyph-name="arrow-alt-circle-down" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM224 308V192H157C146.3 192 141 179.1 148.5 171.5L247.5 72.5C252.2 67.8 259.8 67.8 264.5 72.5L363.5 171.5C371.1 179.1 365.7 192 355 192H288V308C288 314.6 282.6 320 276 320H236C229.4 320 224 314.6 224 308z" /> + <glyph glyph-name="arrow-alt-circle-left" + unicode="" + horiz-adv-x="512" d=" M8 192C8 55 119 -56 256 -56S504 55 504 192S393 440 256 440S8 329 8 192zM456 192C456 81.5 366.5 -8 256 -8S56 81.5 56 192S145.5 392 256 392S456 302.5 456 192zM384 212V172C384 165.4 378.6 160 372 160H256V93C256 82.3 243.1 77 235.5 84.5L136.5 183.5C131.8 188.2 131.8 195.8 136.5 200.5L235.5 299.5C243.1 307.1 256 301.7 256 291V224H372C378.6 224 384 218.6 384 212z" /> + <glyph glyph-name="arrow-alt-circle-right" + unicode="" + horiz-adv-x="512" d=" M504 192C504 329 393 440 256 440S8 329 8 192S119 -56 256 -56S504 55 504 192zM56 192C56 302.5 145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192zM128 172V212C128 218.6 133.4 224 140 224H256V291C256 301.7 268.9 307 276.5 299.5L375.5 200.5C380.2 195.8 380.2 188.2 375.5 183.5L276.5 84.5C268.9 76.9 256 82.3 256 93V160H140C133.4 160 128 165.4 128 172z" /> + <glyph glyph-name="arrow-alt-circle-up" + unicode="" + horiz-adv-x="512" d=" M256 -56C393 -56 504 55 504 192S393 440 256 440S8 329 8 192S119 -56 256 -56zM256 392C366.5 392 456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192S145.5 392 256 392zM276 64H236C229.4 64 224 69.4 224 76V192H157C146.3 192 141 204.9 148.5 212.5L247.5 311.5C252.2 316.2 259.8 316.2 264.5 311.5L363.5 212.5C371.1 204.9 365.7 192 355 192H288V76C288 69.4 282.6 64 276 64z" /> + <glyph glyph-name="bell-slash" + unicode="" + horiz-adv-x="576" d=" M130.9 48C114.138 48 105.765 68.39 117.566 80.191C142.792 105.417 163.66 129.5290000000001 168.215 201.6710000000001L121.438 242.9450000000001A168.48 168.48 0 0 1 121.142 233.1430000000001C121.142 151.21 103.591 133.8510000000001 86.599 117.0650000000001C38.504 69.559 73.726 0 130.919 0H224C224 -35.346 252.654 -64 288 -64S352 -35.346 352 0H396.777L342.377 48H130.9zM288 -24C274.766 -24 264 -13.234 264 0H312C312 -13.234 301.234 -24 288 -24zM571.867 -24.553L503.936 35.018C517.04 59.136 515.4599999999999 91.336 489.404 117.0600000000001C472.415 133.8450000000001 454.858 151.2030000000001 454.858 233.1430000000001C454.858 316.1690000000001 393.9 385.2170000000001 314.391 397.9050000000001A31.848 31.848 0 0 1 320 416C320 433.673 305.673 448 288 448S256 433.673 256 416A31.848 31.848 0 0 1 261.609 397.905C220.138 391.287 183.718 369.334 158.36 338.064L36.459 444.963C31.401 449.399 23.682 448.919 19.219 443.892L3.056 425.687C-1.407 420.6600000000001 -0.925 412.988 4.134 408.553L539.542 -60.963C544.6 -65.399 552.3190000000001 -64.919 556.782 -59.892L572.945 -41.687C577.407 -36.66 576.9250000000001 -28.988 571.8670000000001 -24.553zM288 352C353.538 352 406.857 298.681 406.857 233.143C406.857 135.493 430.078 108.569 458.425 80.191C461.333 77.283 462.9979999999999 73.8630000000001 463.634 70.359L194.482 306.3880000000001C216.258 334.133 250.075 352 288 352z" /> + <glyph glyph-name="bell" + unicode="" + horiz-adv-x="448" d=" M425.403 117.061C408.4140000000001 133.846 390.8570000000001 151.204 390.8570000000001 233.144C390.8570000000001 316.17 329.899 385.218 250.39 397.906A31.842999999999996 31.842999999999996 0 0 1 256 416C256 433.673 241.673 448 224 448S192 433.673 192 416A31.848 31.848 0 0 1 197.609 397.905C118.101 385.217 57.143 316.169 57.143 233.143C57.143 151.21 39.592 133.851 22.6 117.065C-25.496 69.559 9.726 0 66.919 0H160C160 -35.346 188.654 -64 224 -64C259.346 -64 288 -35.346 288 0H381.08C438.27 0 473.495 69.583 425.403 117.061zM224 -24C210.766 -24 200 -13.234 200 0H248C248 -13.234 237.234 -24 224 -24zM381.092 48H66.9C50.138 48 41.765 68.39 53.566 80.191C82.151 108.776 105.143 135.915 105.143 233.1430000000001C105.143 298.6810000000001 158.462 352 224 352S342.857 298.681 342.857 233.143C342.857 135.493 366.078 108.569 394.425 80.191C406.278 68.339 397.783 48 381.092 48z" /> + <glyph glyph-name="bookmark" + unicode="" + horiz-adv-x="384" d=" M336 448H48C21.49 448 0 426.51 0 400V-64L192 48L384 -64V400C384 426.51 362.51 448 336 448zM336 19.57L192 103.57L48 19.57V394A6 6 0 0 0 54 400H330C333.314 400 336 397.317 336 394.004V19.57z" /> + <glyph glyph-name="building" + unicode="" + horiz-adv-x="448" d=" M128 300V340C128 346.6 133.4 352 140 352H180C186.6 352 192 346.6 192 340V300C192 293.4 186.6 288 180 288H140C133.4 288 128 293.4 128 300zM268 288H308C314.6 288 320 293.4 320 300V340C320 346.6 314.6 352 308 352H268C261.4 352 256 346.6 256 340V300C256 293.4 261.4 288 268 288zM140 192H180C186.6 192 192 197.4 192 204V244C192 250.6 186.6 256 180 256H140C133.4 256 128 250.6 128 244V204C128 197.4 133.4 192 140 192zM268 192H308C314.6 192 320 197.4 320 204V244C320 250.6 314.6 256 308 256H268C261.4 256 256 250.6 256 244V204C256 197.4 261.4 192 268 192zM192 108V148C192 154.6 186.6 160 180 160H140C133.4 160 128 154.6 128 148V108C128 101.4 133.4 96 140 96H180C186.6 96 192 101.4 192 108zM268 96H308C314.6 96 320 101.4 320 108V148C320 154.6 314.6 160 308 160H268C261.4 160 256 154.6 256 148V108C256 101.4 261.4 96 268 96zM448 -28V-64H0V-28C0 -21.4 5.4 -16 12 -16H31.5V424C31.5 437.3 42.2 448 55.5 448H392.5C405.8 448 416.5 437.3 416.5 424V-16H436C442.6 -16 448 -21.4 448 -28zM79.5 -15H192V52C192 58.6 197.4 64 204 64H244C250.6 64 256 58.6 256 52V-15H368.5V399L80 400L79.5 -15z" /> + <glyph glyph-name="calendar-alt" + unicode="" + horiz-adv-x="448" d=" M148 160H108C101.4 160 96 165.4 96 172V212C96 218.6 101.4 224 108 224H148C154.6 224 160 218.6 160 212V172C160 165.4 154.6 160 148 160zM256 172V212C256 218.6 250.6 224 244 224H204C197.4 224 192 218.6 192 212V172C192 165.4 197.4 160 204 160H244C250.6 160 256 165.4 256 172zM352 172V212C352 218.6 346.6 224 340 224H300C293.4 224 288 218.6 288 212V172C288 165.4 293.4 160 300 160H340C346.6 160 352 165.4 352 172zM256 76V116C256 122.6 250.6 128 244 128H204C197.4 128 192 122.6 192 116V76C192 69.4 197.4 64 204 64H244C250.6 64 256 69.4 256 76zM160 76V116C160 122.6 154.6 128 148 128H108C101.4 128 96 122.6 96 116V76C96 69.4 101.4 64 108 64H148C154.6 64 160 69.4 160 76zM352 76V116C352 122.6 346.6 128 340 128H300C293.4 128 288 122.6 288 116V76C288 69.4 293.4 64 300 64H340C346.6 64 352 69.4 352 76zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" /> + <glyph glyph-name="calendar-check" + unicode="" + horiz-adv-x="448" d=" M400 384H352V436C352 442.627 346.627 448 340 448H300C293.373 448 288 442.627 288 436V384H160V436C160 442.627 154.627 448 148 448H108C101.373 448 96 442.627 96 436V384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H400C426.51 -64 448 -42.51 448 -16V336C448 362.51 426.51 384 400 384zM394 -16H54A6 6 0 0 0 48 -10V288H400V-10A6 6 0 0 0 394 -16zM341.151 184.65L198.842 43.481C194.137 38.814 186.539 38.844 181.871 43.549L106.78 119.248C102.113 123.953 102.143 131.551 106.848 136.219L129.567 158.755C134.272 163.422 141.87 163.392 146.537 158.686L190.641 114.225L301.713 224.406C306.418 229.073 314.016 229.043 318.6840000000001 224.3379999999999L341.2200000000001 201.62C345.887 196.9149999999999 345.8560000000001 189.317 341.151 184.65z" /> + <glyph glyph-name="calendar-minus" + unicode="" + horiz-adv-x="448" d=" M124 120C117.4 120 112 125.4 112 132V156C112 162.6 117.4 168 124 168H324C330.6 168 336 162.6 336 156V132C336 125.4 330.6 120 324 120H124zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" /> + <glyph glyph-name="calendar-plus" + unicode="" + horiz-adv-x="448" d=" M336 156V132C336 125.4 330.6 120 324 120H248V44C248 37.4 242.6 32 236 32H212C205.4 32 200 37.4 200 44V120H124C117.4 120 112 125.4 112 132V156C112 162.6 117.4 168 124 168H200V244C200 250.6 205.4 256 212 256H236C242.6 256 248 250.6 248 244V168H324C330.6 168 336 162.6 336 156zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" /> + <glyph glyph-name="calendar-times" + unicode="" + horiz-adv-x="448" d=" M311.7 73.3L294.7 56.3C290 51.6 282.4 51.6 277.7 56.3L224 110.1L170.3 56.4C165.6 51.7 158 51.7 153.3 56.4L136.3 73.4C131.6 78.1 131.6 85.7000000000001 136.3 90.4L190 144.1L136.3 197.8C131.6 202.5 131.6 210.1 136.3 214.8L153.3 231.8C158 236.5 165.6 236.5 170.3 231.8L224 178.1L277.7 231.8C282.4 236.5 290 236.5 294.7 231.8L311.7 214.8C316.4 210.1 316.4 202.5 311.7 197.8L257.9 144L311.6 90.3C316.4 85.6 316.4 78 311.7 73.3zM448 336V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H96V436C96 442.6 101.4 448 108 448H148C154.6 448 160 442.6 160 436V384H288V436C288 442.6 293.4 448 300 448H340C346.6 448 352 442.6 352 436V384H400C426.5 384 448 362.5 448 336zM400 -10V288H48V-10C48 -13.3 50.7 -16 54 -16H394C397.3 -16 400 -13.3 400 -10z" /> + <glyph glyph-name="calendar" + unicode="" + horiz-adv-x="448" d=" M400 384H352V436C352 442.6 346.6 448 340 448H300C293.4 448 288 442.6 288 436V384H160V436C160 442.6 154.6 448 148 448H108C101.4 448 96 442.6 96 436V384H48C21.5 384 0 362.5 0 336V-16C0 -42.5 21.5 -64 48 -64H400C426.5 -64 448 -42.5 448 -16V336C448 362.5 426.5 384 400 384zM394 -16H54C50.7 -16 48 -13.3 48 -10V288H400V-10C400 -13.3 397.3 -16 394 -16z" /> + <glyph glyph-name="caret-square-down" + unicode="" + horiz-adv-x="448" d=" M125.1 240H322.9C333.6 240 339 227 331.4 219.5L232.5 121.2C227.8 116.5 220.3 116.5 215.6 121.2L116.7 219.5C109 227 114.4 240 125.1 240zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" /> + <glyph glyph-name="caret-square-left" + unicode="" + horiz-adv-x="448" d=" M272 290.9V93.1C272 82.4 259 77 251.5 84.6L153.2 183.5C148.5 188.2 148.5 195.7 153.2 200.4L251.5 299.3C259 307 272 301.6 272 290.9zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" /> + <glyph glyph-name="caret-square-right" + unicode="" + horiz-adv-x="448" d=" M176 93.1V290.9C176 301.6 189 307 196.5 299.4L294.8 200.5C299.5 195.8 299.5 188.3 294.8 183.6L196.5 84.7000000000001C189 77.0000000000001 176 82.4 176 93.1zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" /> + <glyph glyph-name="caret-square-up" + unicode="" + horiz-adv-x="448" d=" M322.9 144H125.1C114.4 144 109 157 116.6 164.5L215.5 262.8C220.2 267.5 227.7 267.5 232.4 262.8L331.3 164.5C339 157 333.6 144 322.9000000000001 144zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" /> + <glyph glyph-name="chart-bar" + unicode="" + horiz-adv-x="512" d=" M500 48C506.6 48 512 42.6 512 36V12C512 5.4 506.6 0 500 0H12C5.4 0 0 5.4 0 12V372C0 378.6 5.4 384 12 384H36C42.6 384 48 378.6 48 372V48H500zM144 108V180C144 186.6 138.6 192 132 192H108C101.4 192 96 186.6 96 180V108C96 101.4 101.4 96 108 96H132C138.6 96 144 101.4 144 108zM240 108V308C240 314.6 234.6 320 228 320H204C197.4 320 192 314.6 192 308V108C192 101.4 197.4 96 204 96H228C234.6 96 240 101.4 240 108zM336 108V244C336 250.6 330.6 256 324 256H300C293.4 256 288 250.6 288 244V108C288 101.4 293.4 96 300 96H324C330.6 96 336 101.4 336 108zM432 108V340C432 346.6 426.6 352 420 352H396C389.4 352 384 346.6 384 340V108C384 101.4 389.4 96 396 96H420C426.6 96 432 101.4 432 108z" /> + <glyph glyph-name="check-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M396.204 261.733L373.668 284.451C369.0010000000001 289.156 361.403 289.187 356.698 284.519L215.346 144.303L155.554 204.58C150.887 209.285 143.289 209.316 138.584 204.649L115.865 182.113C111.16 177.446 111.129 169.848 115.797 165.142L206.578 73.6259999999999C211.245 68.9209999999999 218.843 68.8899999999999 223.548 73.5579999999999L396.1370000000001 244.762C400.8410000000001 249.43 400.8710000000001 257.0279999999999 396.2040000000001 261.733z" /> + <glyph glyph-name="check-square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V368C448 394.51 426.51 416 400 416zM400 16H48V368H400V16zM364.136 257.724L191.547 86.52C186.842 81.853 179.244 81.883 174.577 86.588L83.796 178.104C79.129 182.809 79.159 190.407 83.865 195.075L106.584 217.611C111.289 222.278 118.887 222.248 123.554 217.542L183.346 157.265L324.698 297.481C329.403 302.148 337.001 302.118 341.668 297.413L364.204 274.695C368.871 269.9890000000001 368.841 262.391 364.136 257.724z" /> + <glyph glyph-name="circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8z" /> + <glyph glyph-name="clipboard" + unicode="" + horiz-adv-x="384" d=" M336 384H256C256 419.29 227.29 448 192 448S128 419.29 128 384H48C21.49 384 0 362.51 0 336V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V336C384 362.51 362.51 384 336 384zM330 -16H54A6 6 0 0 0 48 -10V330A6 6 0 0 0 54 336H96V300C96 293.373 101.373 288 108 288H276C282.627 288 288 293.373 288 300V336H330A6 6 0 0 0 336 330V-10A6 6 0 0 0 330 -16zM192 408C205.255 408 216 397.255 216 384S205.255 360 192 360S168 370.745 168 384S178.745 408 192 408" /> + <glyph glyph-name="clock" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM317.8 96.4L232.9 158.1C229.8 160.4 228 164 228 167.8V332C228 338.6 233.4 344 240 344H272C278.6 344 284 338.6 284 332V190.3L350.8 141.7C356.2 137.8 357.3 130.3 353.4000000000001 124.9L334.6 99C330.7000000000001 93.7 323.2000000000001 92.5 317.8 96.4z" /> + <glyph glyph-name="clone" + unicode="" + horiz-adv-x="512" d=" M464 448H144C117.49 448 96 426.51 96 400V352H48C21.49 352 0 330.51 0 304V-16C0 -42.51 21.49 -64 48 -64H368C394.51 -64 416 -42.51 416 -16V32H464C490.51 32 512 53.49 512 80V400C512 426.51 490.51 448 464 448zM362 -16H54A6 6 0 0 0 48 -10V298A6 6 0 0 0 54 304H96V80C96 53.49 117.49 32 144 32H368V-10A6 6 0 0 0 362 -16zM458 80H150A6 6 0 0 0 144 86V394A6 6 0 0 0 150 400H458A6 6 0 0 0 464 394V86A6 6 0 0 0 458 80z" /> + <glyph glyph-name="closed-captioning" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.5 384 0 362.5 0 336V48C0 21.5 21.5 0 48 0H464C490.5 0 512 21.5 512 48V336C512 362.5 490.5 384 464 384zM458 48H54C50.7 48 48 50.7 48 54V330C48 333.3 50.7 336 54 336H458C461.3 336 464 333.3 464 330V54C464 50.7 461.3 48 458 48zM246.9 133.7C248.6 131.3 248.4 128.1 246.4 126C192.8 69.2 73.6 93.9 73.6 193.9C73.6 291.2 195.3 313.4 246.1 264C248.2 262 248.6 260.8 247.1 258.3L229.6 227.8C227.7 224.7 223.4 223.8 220.5 226.1C179.7 258.1 125.9 241.0000000000001 125.9 194.9C125.9 146.9 176.9 124.4 218.1 162.3C220.9 164.8 225.2 164.4 227.3 161.4L246.9 133.7000000000001zM437.3 133.7C439 131.3 438.8 128.1 436.8 126C383.2 69.1 264 93.9 264 193.9C264 291.2 385.7 313.4 436.5 264C438.6 262 439 260.8 437.5 258.3L420 227.8C418.1 224.7 413.8 223.8 410.9 226.1C370.1 258.1 316.3 241.0000000000001 316.3 194.9C316.3 146.9 367.3 124.4 408.5 162.3C411.3 164.8 415.6 164.4 417.7 161.4L437.3 133.7000000000001z" /> + <glyph glyph-name="comment-alt" + unicode="" + horiz-adv-x="576" d=" M288 416C129 416 0 322.9 0 208C0 158.7 23.7 113.5 63.3 77.8C54.6 54.5 41.2 45.1 26.2 34.7C15.1 27 -6 15 1.6 -8.5C6.7 -23.9 22.5 -33.2 39.7 -31.8C97.4 -27.2 150.9 -12.6 196.7 10.7C225.4 3.8 256.1 0 287.9 0C447 0 575.9 93 575.9 208C576 322.9 447.1 416 288 416zM288 48C255.5 48 222.6 52.4 190.7 62C158.4 43 112 16 56 8C88 32 112.8 69.6 117.2 96.4C79.1 122.4 48 161.3 48 208C48 278.9 134.3 368 288 368S528 278.9 528 208C528 137 441.7 48 288 48zM224 208C224 181.5 202.5 160 176 160S128 181.5 128 208S149.5 256 176 256S224 234.5 224 208zM336 208C336 181.5 314.5 160 288 160S240 181.5 240 208S261.5 256 288 256S336 234.5 336 208zM448 208C448 181.5 426.5 160 400 160S352 181.5 352 208S373.5 256 400 256S448 234.5 448 208z" /> + <glyph glyph-name="comment" + unicode="" + horiz-adv-x="576" d=" M288 416C129 416 0 322.9 0 208C0 158.7 23.7 113.5 63.3 77.8C54.6 54.5 41.2 45.1 26.2 34.7C15.1 27 -6 15 1.6 -8.5C6.7 -23.9 22.5 -33.2 39.7 -31.8C97.4 -27.2 150.9 -12.6 196.7 10.7C225.4 3.8 256.1 0 287.9 0C447 0 575.9 93 575.9 208C576 322.9 447.1 416 288 416zM288 48C255.5 48 222.6 52.4 190.7 62C158.4 43 112 16 56 8C88 32 112.8 69.6 117.2 96.4C79.1 122.4 48 161.3 48 208C48 278.9 134.3 368 288 368S528 278.9 528 208C528 137 441.7 48 288 48z" /> + <glyph glyph-name="comments" + unicode="" + horiz-adv-x="576" d=" M574.507 4.14C569.0859999999999 -17.121 549.9369999999999 -32 527.996 -32C495.75 -32 461.485 -22.01 425.896 -2.266C375.256 -13.892 316.745 -10.143 267.9359999999999 11.171C309.08 14.09 348.2969999999999 23.51 384.267 39.876C400.589 41.096 416.9409999999999 44.196 432.8979999999999 49.469C454.404 35.635 490.663 16 527.996 16C495.996 33.455 484.777 54.958 481.837 74.502C507.28 93.35 527.996 121.685 527.996 155.637C527.996 166.132 525.6129999999999 177.173 520.9549999999999 188.104C528.3599999999999 214.034 529.6109999999999 238.298 526.1399999999999 262.042C558.3039999999999 231.581 575.9959999999999 192.914 575.9959999999999 155.637C575.9959999999999 121.7439999999999 563.0829999999999 90.5899999999999 541.0199999999999 64.5179999999999C543.6729999999999 62.4799999999999 546.9439999999998 60.3419999999999 550.9819999999999 58.1399999999999C570.2429999999998 47.632 579.9289999999999 25.401 574.5069999999998 4.1399999999999zM240.002 368C117.068 368 48.004 295.123 48.004 237.091C48.004 198.895 72.863 167.019 103.395 145.815C99.868 123.827 86.404 99.636 48.004 80C92.804 80 136.314 102.089 162.123 117.653C187.643 109.747 214.006 106.182 240.002 106.182C362.998 106.182 432 179.024 432 237.091C432 295.118 362.943 368 240.002 368M240.002 416C390.193 416 480 321.974 480 237.091C480 214.346 473.494 190.697 461.184 168.7C449.3060000000001 147.474 432.6450000000001 128.406 411.661 112.026C390.068 95.169 364.863 81.981 336.748 72.829C306.893 63.11 274.343 58.183 240.002 58.183C215.553 58.183 191.662 60.87 168.71 66.187C126.311 43.488 85.785 32 48.004 32C25.824 32 6.532 47.197 1.339 68.761C-3.855 90.324 6.403 112.639 26.15 122.737C33.813 126.655 39.474 130.4740000000001 43.669 134.031C36.276 141.86 29.717 150.155 24.035 158.875C8.09 183.345 0.005 209.661 0.005 237.091C0.005 321.741 89.508 416 240.002 416z" /> + <glyph glyph-name="compass" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 -8C145.468 -8 56 81.451 56 192C56 302.531 145.451 392 256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8zM347.326 304.131L313.9670000000001 166.352A24.005 24.005 0 0 0 307.1950000000001 154.623L204.5550000000001 56.844C187.4510000000001 40.551 158.9950000000001 56.41 164.6750000000001 79.868L198.0340000000001 217.647A23.997 23.997 0 0 0 204.8060000000001 229.376L307.4480000000001 327.155C324.7330000000001 343.625 352.9420000000001 327.33 347.3260000000001 304.131zM256 224C238.327 224 224 209.673 224 192S238.327 160 256 160S288 174.327 288 192S273.673 224 256 224z" /> + <glyph glyph-name="copy" + unicode="" + horiz-adv-x="448" d=" M433.941 382.059L382.059 433.941A48 48 0 0 1 348.118 448H176C149.49 448 128 426.51 128 400V352H48C21.49 352 0 330.51 0 304V-16C0 -42.51 21.49 -64 48 -64H272C298.51 -64 320 -42.51 320 -16V32H400C426.51 32 448 53.49 448 80V348.118A48 48 0 0 1 433.941 382.059zM266 -16H54A6 6 0 0 0 48 -10V298A6 6 0 0 0 54 304H128V80C128 53.49 149.49 32 176 32H272V-10A6 6 0 0 0 266 -16zM394 80H182A6 6 0 0 0 176 86V394A6 6 0 0 0 182 400H288V312C288 298.745 298.745 288 312 288H400V86A6 6 0 0 0 394 80zM400 336H336V400H345.632C347.223 400 348.749 399.368 349.875 398.243L398.243 349.875A6 6 0 0 0 400 345.632V336z" /> + <glyph glyph-name="copyright" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 -8C145.468 -8 56 81.451 56 192C56 302.531 145.451 392 256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8zM363.351 93.064C353.737 83.352 317.8210000000001 51.668 259.286 51.668C176.856 51.668 118.802 113.093 118.802 193.235C118.802 272.387 179.077 332.636 258.564 332.636C314.095 332.636 347.302 306.016 356.157 297.857A11.965 11.965 0 0 0 358.093 282.535L339.938 254.422C336.097 248.472 327.972 247.14 322.439 251.501C313.844 258.277 290.625 274.039 260.731 274.039C212.428 274.039 182.815 238.709 182.815 193.957C182.815 152.368 209.703 110.265 261.092 110.265C293.749 110.265 317.935 129.304 326.818 137.49C332.088 142.347 340.414 141.529 344.638 135.752L364.503 108.582A11.947000000000001 11.947000000000001 0 0 0 363.351 93.064z" /> + <glyph glyph-name="credit-card" + unicode="" + horiz-adv-x="576" d=" M527.9 416H48.1C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48.1 -32H527.9C554.5 -32 576 -10.5 576 16V368C576 394.5 554.5 416 527.9 416zM54.1 368H521.9C525.1999999999999 368 527.9 365.3 527.9 362V320H48.1V362C48.1 365.3 50.8 368 54.1 368zM521.9 16H54.1C50.8 16 48.1 18.7 48.1 22V192H527.9V22C527.9 18.7 525.1999999999999 16 521.9 16zM192 116V76C192 69.4 186.6 64 180 64H108C101.4 64 96 69.4 96 76V116C96 122.6 101.4 128 108 128H180C186.6 128 192 122.6 192 116zM384 116V76C384 69.4 378.6 64 372 64H236C229.4 64 224 69.4 224 76V116C224 122.6 229.4 128 236 128H372C378.6 128 384 122.6 384 116z" /> + <glyph glyph-name="dot-circle" + unicode="" + horiz-adv-x="512" d=" M256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 272C211.817 272 176 236.183 176 192S211.817 112 256 112S336 147.817 336 192S300.183 272 256 272z" /> + <glyph glyph-name="edit" + unicode="" + horiz-adv-x="576" d=" M402.3 103.1L434.3 135.1C439.3 140.1 448 136.6 448 129.4V-16C448 -42.5 426.5 -64 400 -64H48C21.5 -64 0 -42.5 0 -16V336C0 362.5 21.5 384 48 384H321.5C328.6 384 332.2 375.4 327.2 370.3L295.2 338.3C293.7 336.8 291.7 336 289.5 336H48V-16H400V97.5C400 99.6 400.8 101.6 402.3 103.1zM558.9 304.9000000000001L296.3 42.3L205.9 32.3C179.7 29.4 157.4 51.5 160.3 77.9L170.3 168.3000000000001L432.9 430.9C455.8 453.8 492.8 453.8 515.6 430.9L558.8000000000001 387.7C581.7 364.8 581.7 327.7 558.9000000000001 304.9zM460.1 274L402 332.1L216.2 146.2L208.9 80.9L274.2 88.2L460.1 274zM524.9 353.7L481.7 396.9C477.6 401 470.9 401 466.9 396.9L436 366L494.1 307.9L525 338.8C529 343 529 349.6 524.9 353.7000000000001z" /> + <glyph glyph-name="envelope-open" + unicode="" + horiz-adv-x="512" d=" M494.586 283.4840000000001C489.889 287.367 382.863 373.4340000000001 359.3350000000001 392.141C337.231 409.809 299.437 448 256 448C212.795 448 175.364 410.283 152.665 392.141C128.202 372.6910000000001 21.595 286.9460000000001 17.515 283.592A48.004000000000005 48.004000000000005 0 0 1 0 246.515V-16C0 -42.51 21.49 -64 48 -64H464C490.51 -64 512 -42.51 512 -16V246.491A48 48 0 0 1 494.586 283.4840000000001zM464 -10A6 6 0 0 0 458 -16H54A6 6 0 0 0 48 -10V243.653C48 245.466 48.816 247.179 50.226 248.318C66.096 261.132 159.019 335.872 182.59 354.611C200.755 369.12 232.398 400 256 400C279.693 400 311.857 368.631 329.41 354.611C352.983 335.87 445.913 261.118 461.776 248.295A5.99 5.99 0 0 0 463.9999999999999 243.632V-10zM432.009 177.704C436.2580000000001 172.545 435.474 164.909 430.264 160.723C401.289 137.44 370.99 113.126 359.3350000000001 103.86C336.636 85.717 299.205 48 256 48C212.548 48 174.713 86.237 152.665 103.86C141.386 112.827 110.921 137.273 81.738 160.725C76.528 164.912 75.745 172.547 79.993 177.706L95.251 196.234C99.429 201.307 106.908 202.077 112.03 197.96C140.648 174.959 170.596 150.925 182.59 141.389C200.143 127.369 232.307 96 256 96C279.602 96 311.246 126.88 329.41 141.389C341.404 150.924 371.354 174.959 399.973 197.957C405.095 202.073 412.574 201.303 416.751 196.23L432.009 177.704z" /> + <glyph glyph-name="envelope" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM464 336V295.195C441.578 276.936 405.832 248.544 329.413 188.705C312.572 175.458 279.212 143.633 256 144.004C232.792 143.629 199.421 175.463 182.587 188.705C106.18 248.535 70.425 276.933 48 295.195V336H464zM48 48V233.602C70.914 215.351 103.409 189.74 152.938 150.956C174.795 133.751 213.072 95.77 256 96.001C298.717 95.77 336.509 133.2000000000001 359.053 150.948C408.581 189.7310000000001 441.085 215.3490000000001 464 233.6010000000001V48H48z" /> + <glyph glyph-name="eye-slash" + unicode="" + horiz-adv-x="576" d=" M272.702 88.861C192.219 97.872 136.49 175.747 155.772 255.903L272.702 88.861zM288 56C185.444 56 95.908 110.701 48 192C69.755 228.917 100.1 260.342 136.344 283.658L108.803 323.0010000000001C67.001 295.766 31.921 259.259 6.646 216.369A47.999 47.999 0 0 1 6.646 167.63C63.004 71.994 168.14 8 288 8A332.89 332.89 0 0 1 327.648 10.367L295.627 56.111A284.16 284.16 0 0 0 288 56zM569.354 167.631C536.1220000000001 111.237 485.933 65.889 425.8000000000001 38.139L473.9160000000001 -30.601C477.717 -36.03 476.3960000000001 -43.513 470.967 -47.313L450.23 -61.83C444.8010000000001 -65.631 437.3180000000001 -64.3099999999999 433.5180000000001 -58.881L102.084 414.601C98.283 420.03 99.604 427.513 105.033 431.313L125.77 445.83C131.199 449.631 138.682 448.31 142.482 442.881L198.008 363.556C226.612 371.657 256.808 376 288 376C407.86 376 512.996 312.006 569.354 216.369A48.00200000000001 48.00200000000001 0 0 0 569.354 167.631zM528 192C483.843 266.933 404.323 319.27 311.838 327.007C302.042 316.9220000000001 296 303.17 296 288C296 257.072 321.072 232 352 232S408 257.072 408 288L407.999 288.0420000000001C438.6310000000001 230.765 424.738 157.7820000000001 371.0710000000001 116.323L397.766 78.188C452.626 101.449 498.308 141.614 528 192z" /> + <glyph glyph-name="file-alt" + unicode="" + horiz-adv-x="384" d=" M288 200V172C288 165.4 282.6 160 276 160H108C101.4 160 96 165.4 96 172V200C96 206.6 101.4 212 108 212H276C282.6 212 288 206.6 288 200zM276 128H108C101.4 128 96 122.6 96 116V88C96 81.4 101.4 76 108 76H276C282.6 76 288 81.4 288 88V116C288 122.6 282.6 128 276 128zM384 316.1V-16C384 -42.5 362.5 -64 336 -64H48C21.5 -64 0 -42.5 0 -16V400C0 426.5 21.5 448 48 448H252.1C264.8 448 277 442.9 286 433.9L369.9 350C378.9 341.1 384 328.8 384 316.1zM256 396.1V320H332.1L256 396.1zM336 -16V272H232C218.7 272 208 282.7 208 296V400H48V-16H336z" /> + <glyph glyph-name="file-archive" + unicode="" + horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM256 396.118L332.118 320H256V396.118zM336 -16H48V400H127.714V384H159.714V400H208V296C208 282.745 218.745 272 232 272H336V-16zM192.27 352H160.27V384H192.27V352zM160.27 352V320H128.27V352H160.27zM160.27 288V256H128.27V288H160.27zM192.27 288H160.27V320H192.27V288zM194.179 182.322A12 12 0 0 1 182.406 192H160.27V224H128.27V192L108.58 94.894C101.989 62.389 126.834 32 160 32C193.052 32 217.871 62.192 211.476 94.62L194.179 182.322zM160.27 57.927C142.352 57.927 127.826 70.032 127.826 84.963C127.826 99.895 142.351 111.999 160.27 111.999S192.714 99.894 192.714 84.963C192.714 70.032 178.188 57.927 160.27 57.927zM192.27 224H160.27V256H192.27V224z" /> + <glyph glyph-name="file-audio" + unicode="" + horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM332.118 320H256V396.118L332.118 320zM48 -16V400H208V296C208 282.745 218.745 272 232 272H336V-16H48zM192 60.024C192 49.333 179.074 43.979 171.515 51.539L136 87.514H108C101.373 87.514 96 92.887 96 99.514V155.514C96 162.141 101.373 167.514 108 167.514H136L171.515 204.461C179.075 212.021 192 206.667 192 195.976V60.024zM233.201 107.154C242.252 116.451 242.261 131.287 233.202 140.593C211.053 163.345 245.437 196.839 267.597 174.074C294.795 146.134 294.809 101.63 267.598 73.673C245.805 51.287 210.651 83.988 233.201 107.154z" /> + <glyph glyph-name="file-code" + unicode="" + horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM332.118 320H256V396.118L332.118 320zM48 -16V400H208V296C208 282.745 218.745 272 232 272H336V-16H48zM149.677 99.115L116.854 128L149.676 156.885A8.793 8.793 0 0 1 150.281 169.509L132.878 188.073C129.494 191.686 123.914 191.735 120.44 188.4740000000001L62.78 134.42C59.077 130.946 59.076 125.053 62.781 121.5800000000001L120.44 67.525A8.738 8.738 0 0 1 126.452 65.1440000000001A8.746 8.746 0 0 1 132.879 67.9260000000001L150.282 86.489A8.795 8.795 0 0 1 149.677 99.115zM233.961 226.965L209.56 234.049A8.796 8.796 0 0 1 198.655 228.051L144.04 39.939C142.687 35.279 145.378 30.387 150.038 29.0340000000001L174.441 21.95C179.121 20.595 183.998 23.304 185.346 27.948L239.958 216.06C241.312 220.72 238.621 225.612 233.961 226.9650000000001zM321.219 134.42L263.561 188.475C260.035 191.7820000000001 254.462 191.6400000000001 251.122 188.074L233.719 169.511A8.795 8.795 0 0 1 234.324 156.886L267.146 128L234.324 99.115A8.793 8.793 0 0 1 233.719 86.491L251.122 67.927A8.797 8.797 0 0 1 263.5610000000001 67.526H263.5600000000001L321.2200000000001 121.581C324.923 125.054 324.923 130.947 321.2190000000001 134.42z" /> + <glyph glyph-name="file-excel" + unicode="" + horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM260 224H231.2C226.8 224 222.8 221.6 220.7 217.7C202.7 184.6 198.5 175.3 192.1 160C178.2 189.1 185.2 177.3 163.5 217.7C161.4 221.6 157.3 224 152.9 224H124C114.7 224 109 214 113.6 206L159.9 128L113.6 50C108.9 42 114.7 32 124 32H152.9C157.3 32 161.3 34.4 163.4 38.3C185.1 78.3 186.4 83.3 192 96C206.9 65.8 197.9 80.1 220.6 38.3C222.7 34.4 226.8 32 231.2 32H260C269.3 32 275 42 270.4 50L224 128C224.7 129.1 254.3 178.5 270.3 206C275 214 269.2 224 260 224z" /> + <glyph glyph-name="file-image" + unicode="" + horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM80 32H304V160L280.5 183.5C275.8 188.2 268.2 188.2 263.5 183.5L176 96L136.5 135.5C131.8 140.2 124.2 140.2 119.5 135.5L80 96V32zM128 272C101.5 272 80 250.5 80 224S101.5 176 128 176S176 197.5 176 224S154.5 272 128 272z" /> + <glyph glyph-name="file-pdf" + unicode="" + horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM298.2 127.7C286 139.7 251.2 136.4 233.8 134.2C216.6 144.7 205.1 159.2 197 180.5C200.9 196.6 207.1 221.1 202.4 236.5C198.2 262.7 164.6 260.1 159.8 242.4C155.4 226.3 159.4 203.9 166.8 175.3C156.8 151.4 141.9 119.3 131.4 100.9C111.4 90.6 84.4 74.7 80.4 54.7C77.1 38.9 106.4 -0.5 156.5 85.9C178.9 93.3 203.3 102.4 224.9 106C243.8 95.8 265.9 89 280.7 89C306.2 89 308.7 117.2 298.2 127.7zM100.1 49.9C105.2 63.6 124.6 79.4 130.5 84.9C111.5 54.6 100.1 49.2 100.1 49.9zM181.7 240.5C189.1 240.5 188.4 208.4 183.5 199.7C179.1 213.6 179.2 240.5 181.7 240.5zM157.3 103.9C167 120.8 175.3 140.9 182 158.6C190.3 143.5 200.9 131.4 212.1 123.1C191.3 118.8 173.2 109.9999999999999 157.3 103.9zM288.9 108.9S283.9 102.9 251.6 116.7C286.7 119.3 292.5 111.3 288.9 108.9z" /> + <glyph glyph-name="file-powerpoint" + unicode="" + horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM120 44V212C120 218.6 125.4 224 132 224H201.2C237.9 224 264 197 264 157.7C264 83.4 195.3 91.2 168.5 91.2V44C168.5 37.4 163.1 32 156.5 32H132C125.4 32 120 37.4 120 44zM168.5 131.4H191.5C199.4 131.4 205.4 133.8 209.6 138.6C218.1 148.4 218 167.1 209.7 176.4C205.6 181 199.8 183.4 192.3 183.4H168.4V131.4z" /> + <glyph glyph-name="file-video" + unicode="" + horiz-adv-x="384" d=" M369.941 350.059L286.059 433.9410000000001A48 48 0 0 1 252.118 448H48C21.49 448 0 426.51 0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V316.118A48 48 0 0 1 369.941 350.059zM332.118 320H256V396.118L332.118 320zM48 -16V400H208V296C208 282.745 218.745 272 232 272H336V-16H48zM276.687 195.303L224 142.626V180C224 191.046 215.046 200 204 200H100C88.954 200 80 191.046 80 180V76C80 64.954 88.954 56 100 56H204C215.046 56 224 64.954 224 76V113.374L276.687 60.7000000000001C286.704 50.682 304 57.72 304 72.014V183.989C304 198.3 286.691 205.308 276.687 195.303z" /> + <glyph glyph-name="file-word" + unicode="" + horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48zM268.1 192C262.4000000000001 192 257.5 188 256.4000000000001 182.5C235.8000000000001 84.8 236.0000000000001 87.1 235.4000000000001 79C235.2000000000001 80.2 235.0000000000001 81.6 234.7000000000001 83.3C233.9000000000001 88.4 235.0000000000001 83.1 211.1000000000001 182.8C209.8000000000001 188.2 205.0000000000001 192 199.4000000000001 192H186.1000000000001C180.6000000000001 192 175.8000000000001 188.2 174.4000000000001 182.9C150.0000000000001 83.9 150.4000000000001 86.7 149.6000000000001 79.2C149.5000000000001 80.3 149.4000000000001 81.7 149.1000000000001 83.4C148.4000000000001 88.6 135.0000000000001 156.7 130.0000000000001 182.4C128.9000000000001 188 124.0000000000001 192.1 118.2000000000001 192.1H101.4000000000001C93.6000000000001 192.1 87.9000000000001 184.8 89.7000000000001 177.3C97.7000000000001 144.6999999999999 116.4000000000001 67.8 122.9000000000001 41.3C124.2000000000001 35.9 129.0000000000001 32.1999999999999 134.6000000000001 32.1999999999999H159.8000000000001C165.3000000000001 32.1999999999999 170.1000000000001 35.8999999999999 171.4 41.3L189.3000000000001 112.6999999999999C190.8000000000001 118.8999999999999 191.8000000000001 124.6999999999999 192.3000000000001 130L195.2000000000001 112.6999999999999C195.3000000000001 112.3 207.8000000000001 62.1999999999999 213.1000000000001 41.3C214.4000000000001 35.9999999999999 219.2000000000001 32.1999999999999 224.7000000000001 32.1999999999999H249.4000000000001C254.9000000000001 32.1999999999999 259.7000000000001 35.8999999999999 261.0000000000001 41.3C281.8000000000001 123.1999999999999 291.2000000000001 160.3 295.5000000000001 177.3C297.4000000000001 184.9 291.7000000000001 192.2 283.9000000000001 192.2H268.1z" /> + <glyph glyph-name="file" + unicode="" + horiz-adv-x="384" d=" M369.9 350.1L286 434C277 443 264.8 448.1 252.1 448.1H48C21.5 448 0 426.5 0 400V-16C0 -42.5 21.5 -64 48 -64H336C362.5 -64 384 -42.5 384 -16V316.1C384 328.8 378.9 341.1 369.9 350.1zM332.1 320H256V396.1L332.1 320zM48 -16V400H208V296C208 282.7 218.7 272 232 272H336V-16H48z" /> + <glyph glyph-name="flag" + unicode="" + horiz-adv-x="512" d=" M336.174 368C287.042 368 242.869 400 174.261 400C142.96 400 115.958 393.5180000000001 93.54 384.832A48.04 48.04 0 0 1 95.682 405.559C93.067 428.425 74.167 446.406 51.201 447.896C23.242 449.71 0 427.569 0 400C0 382.236 9.657 366.738 24 358.438V-48C24 -56.837 31.163 -64 40 -64H56C64.837 -64 72 -56.837 72 -48V35.443C109.869 52.72 143.259 64 199.826 64C248.958 64 293.131 32 361.7390000000001 32C420.218 32 463.711 54.617 490.287 71.981C503.846 80.839 512 95.949 512 112.145V352.063C512 386.522 476.736 409.831 445.096 396.18C409.193 380.6910000000001 371.641 368 336.174 368zM464 112C442.217 96.588 403.176 80 361.7390000000001 80C301.7940000000001 80 259.737 112 199.826 112C156.465 112 103.447 102.597 72 88V320C93.784 335.4120000000001 132.824 352 174.261 352C234.206 352 276.2630000000001 320 336.1740000000001 320C379.4450000000001 320 432.4940000000001 337.366 464 352V112z" /> + <glyph glyph-name="folder-open" + unicode="" + horiz-adv-x="576" d=" M527.943 224H480V272C480 298.51 458.51 320 432 320H272L208 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H448A48.001 48.001 0 0 1 488.704 22.56L568.646 150.56C588.5939999999999 182.477 565.608 224 527.943 224zM54 336H188.118L252.118 272H426A6 6 0 0 0 432 266V224H152A48 48 0 0 1 110.902 200.798L48 96.551V330.007A5.993 5.993 0 0 0 54 336zM448 48H72L149.234 176H528L448 48z" /> + <glyph glyph-name="folder" + unicode="" + horiz-adv-x="512" d=" M464 320H272L208 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V272C512 298.51 490.51 320 464 320zM458 48H54C50.686 48 48 50.678 48 53.992V330.008A5.993 5.993 0 0 0 54 336H188.118L252.118 272H458A6 6 0 0 0 464 266V54A6 6 0 0 0 458 48z" /> + <glyph glyph-name="frown" + unicode="" + horiz-adv-x="512" d=" M256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM320 304C310.465 304 301.488 301.6140000000001 293.63 297.411H293.647C306.382 297.411 316.706 287.087 316.706 274.352C316.706 261.617 306.382 251.293 293.647 251.293S270.588 261.617 270.588 274.352V274.3690000000001C266.386 266.512 264 257.535 264 248C264 217.072 289.072 192 320 192S376 217.072 376 248S350.928 304 320 304zM192 304C182.465 304 173.488 301.6140000000001 165.63 297.411H165.647C178.382 297.411 188.706 287.087 188.706 274.352C188.706 261.617 178.382 251.293 165.647 251.293C152.912 251.293 142.588 261.617 142.588 274.352V274.3690000000001C138.386 266.512 136 257.535 136 248C136 217.072 161.072 192 192 192S248 217.072 248 248S222.928 304 192 304zM363.5470000000001 102.218C306.952 179.182 205.164 179.283 148.4900000000001 102.2189999999999C129.6700000000001 76.6259999999999 168.3480000000001 48.2009999999999 187.16 73.781C224.671 124.791 287.5250000000001 124.577 324.8770000000001 73.7819999999999C343.3860000000001 48.6099999999999 382.6980000000001 76.1769999999999 363.5470000000001 102.2179999999999z" /> + <glyph glyph-name="futbol" + unicode="" + horiz-adv-x="496" d=" M483.8 268.6C449.8 373.4 352.6 440 248.1 440C222.7 440 196.9 436.1 171.4 427.8C41.2 385.5 -30.1 245.6 12.2 115.4C46.2 10.6 143.4 -56 247.9 -56C273.3 -56 299.1 -52.1 324.6 -43.8C454.8 -1.5 526.1 138.4 483.8 268.6zM409.3 74.9L357.1 68.5L313.4000000000001 129.4L337.8 204.6L408.9 226.7L447.8 190.3C447.6 159.6 440.4 129.1999999999999 426.1 101.1C421.4 91.8 415.4 83.3 409.3 74.9zM409.3 310.3L398.9000000000001 257.2L328.2000000000001 235.2L264.0000000000001 281.7V355.5L311.4000000000001 381.7C350.6 368.7 384.8000000000001 343.7 409.3000000000001 310.3zM184.9 381.6L232 355.5V281.7L167.8 235.2L97.2 257.2L87.1 309.7C111.4 343.1 145 368.3 184.9 381.6zM139 68.5L85.9 75C71.5 95.1 48.6 134.6 48.1 190.3L87.1 226.7L158.2 204.5L182.5 130.2000000000001L139 68.5000000000001zM187.2 1.5L164.8 49.6L208.4 111.3H287L331.3 49.6L308.9000000000001 1.5C302.7000000000001 -0.3 251.3000000000001 -18.9 187.2000000000001 1.5z" /> + <glyph glyph-name="gem" + unicode="" + horiz-adv-x="576" d=" M464 448H112C108 448 104.2 446 102 442.6L2 295.4C-0.9 291 -0.6 285.2000000000001 2.7 281.2000000000001L278.7 -59.6C283.5 -65.5 292.5 -65.5 297.3 -59.6L573.3 281.2C576.5999999999999 285.3 576.9 291 574 295.4L474.1 442.6C471.8 446 468.1 448 464 448zM444.7 400L508 304H439.6L387.9000000000001 400H444.7000000000001zM242.6 400H333.3L385 304H191L242.6 400zM131.3 400H188.1L136.4 304H68L131.3 400zM88.3 256H139.7L208 96L88.3 256zM191.2 256H384.8L288 12.7L191.2 256zM368 96L436.2 256H487.6L368 96z" /> + <glyph glyph-name="hand-lizard" + unicode="" + horiz-adv-x="576" d=" M556.686 157.458L410.328 383.171C397.001 403.728 374.417 416 349.917 416H56C25.121 416 0 390.878 0 360V352C0 307.8880000000001 35.888 272 80 272H276.0420000000001L257.7090000000001 224H144C95.477 224 56 184.523 56 136C56 105.121 81.121 80 112 80H243.552C246.539 80 249.466 79.451 252.249 78.369L352 39.582V-32H576V92.171C576 115.396 569.321 137.972 556.686 157.458zM528 16H400V39.582C400 59.53 387.986 77.09 369.396 84.318L269.645 123.106A71.733 71.733 0 0 1 243.552 128H112C107.589 128 104 131.589 104 136C104 158.056 121.944 176 144 176H257.709C277.476 176 295.495 188.407 302.549 206.873L327.101 271.154C336.097 294.707 318.673 320 293.471 320H80C62.355 320 48 334.355 48 352V360C48 364.411 51.589 368 56 368H349.917C358.083 368 365.61 363.91 370.054 357.058L516.412 131.343A71.84 71.84 0 0 0 528 92.171V16z" /> + <glyph glyph-name="hand-paper" + unicode="" + horiz-adv-x="448" d=" M372.57 335.359V346.184C372.57 389.796 332.05 422.875 289.531 411.73C263.902 461.23 195.441 459.18 171.549 410.983C130.269 421.544 89.144 390.055 89.144 346V219.87C69.191 227.297 45.836 224.938 27.061 210.999C-2.294 189.203 -8.733 147.666 12.511 117.846L132.48 -50.569A32 32 0 0 1 158.542 -64.001H381.439C396.343 -64.001 409.274 -53.712 412.621 -39.188L442.805 91.77A203.637 203.637 0 0 1 448 137.436V269C448 309.62 412.477 340.992 372.57 335.359zM399.997 137.437C399.997 125.706 398.663 113.968 396.0320000000001 102.551L368.707 -16H166.787L51.591 145.697C37.152 165.967 66.614 188.473 80.985 168.302L108.113 130.223C117.108 117.597 137.144 123.936 137.144 139.506V346C137.144 371.645 173.715 370.81 173.715 345.309V192C173.715 183.163 180.878 176 189.715 176H196.571C205.408 176 212.571 183.163 212.571 192V381C212.571 406.663 249.142 405.81 249.142 380.309V192C249.142 183.163 256.305 176 265.142 176H271.998C280.835 176 287.998 183.163 287.998 192V346.875C287.998 372.5470000000001 324.568 371.685 324.568 346.184V192C324.568 183.163 331.731 176 340.568 176H347.425C356.262 176 363.425 183.163 363.425 192V268.309C363.425 294.551 399.995 293.949 399.995 269V137.437z" /> + <glyph glyph-name="hand-peace" + unicode="" + horiz-adv-x="448" d=" M362.146 256.024C348.4360000000001 277.673 323.385 290.04 297.14 286.365V374C297.14 414.804 264.329 448 223.999 448C183.669 448 150.859 414.804 150.859 374L160 280L141.321 358.85C126.578 397.157 83.85 415.89 46.209 400.7920000000001C8.735 385.762 -9.571 343.0370000000001 5.008 305.15L60.765 160.223C30.208 135.267 16.771 102.414 36.032 68.005L90.885 -29.994C102.625 -50.97 124.73 -64 148.575 -64H354.277C385.021 -64 411.835 -42.56 418.832 -12.203L446.259 106.7960000000001A67.801 67.801 0 0 1 447.988 121.999L448 192C448 236.956 404.737 269.343 362.146 256.024zM399.987 122C399.987 120.512 399.8180000000001 119.023 399.485 117.577L372.058 -1.424C370.08 -10.006 362.768 -16 354.276 -16H148.575C142.089 -16 136.033 -12.379 132.77 -6.551L77.916 91.449C73.359 99.59 75.297 110.117 82.424 115.937L109.071 137.701A16 16 0 0 1 113.883 155.84L49.793 322.389C37.226 355.044 84.37 373.163 96.51 341.611L156.294 186.254A16 16 0 0 1 171.227 176H182.859C191.696 176 198.859 183.163 198.859 192V374C198.859 408.375 249.14 408.43 249.14 374V192C249.14 183.163 256.303 176 265.14 176H271.996C280.833 176 287.996 183.163 287.996 192V220C287.996 245.122 324.563 245.159 324.563 220V192C324.563 183.163 331.726 176 340.563 176H347.419C356.256 176 363.419 183.163 363.419 192C363.419 217.12 399.986 217.16 399.986 192V122z" /> + <glyph glyph-name="hand-point-down" + unicode="" + horiz-adv-x="448" d=" M188.8 -64C234.416 -64 272 -26.235 272 19.2V54.847A93.148 93.148 0 0 1 294.064 62.776C316.0700000000001 60.269 339.0420000000001 66.2789999999999 356.855 78.761C409.342 79.9 448 116.159 448 178.701V200C448 260.063 408 298.512 408 327.2V329.879C412.952 335.626 416 343.415 416 351.999V416C416 433.673 403.106 448 387.2 448H156.8C140.894 448 128 433.673 128 416V352C128 343.416 131.048 335.627 136 329.88V327.201C136 320.237 129.807 312.339 112.332 297.0180000000001L112.184 296.889L112.038 296.7580000000001C102.101 287.9020000000001 91.197 278.642 78.785 270.9070000000001C48.537 252.202 0 240.514 0 195.2C0 138.272 35.286 103.2 83.2 103.2C91.226 103.2 98.689 104.014 105.6 105.376V19.2C105.6 -25.899 143.701 -64 188.8 -64zM188.8 -16C170.1 -16 153.6 0.775 153.6 19.2V177.6C136.275 177.6 118.4 151.2000000000001 83.2 151.2000000000001C56.8 151.2000000000001 48 171.8250000000001 48 195.2000000000001C48 203.9940000000001 80.712 215.6450000000001 104.1 230.1260000000001C118.675 239.2000000000001 131.325 249.6500000000001 143.975 260.9250000000001C162.349 277.0340000000001 180.608 294.761 183.571 320.0000000000001H360.3230000000001C364.087 277.2100000000001 400 245.491 400 200V178.701C400 138.177 377.803 121.577 338.675 128.1C330.6740000000001 113.488 304.6960000000001 103.949 285.05 115.175C266.825 95.81 238.669 97.388 224 110.225V19.2C224 0.225 207.775 -16 188.8 -16zM328 384C328 397.255 338.745 408 352 408S376 397.255 376 384S365.255 360 352 360S328 370.745 328 384z" /> + <glyph glyph-name="hand-point-left" + unicode="" + horiz-adv-x="512" d=" M0 227.2C0 181.584 37.765 144 83.2 144H118.847A93.148 93.148 0 0 1 126.776 121.936C124.269 99.93 130.279 76.958 142.761 59.145C143.9 6.658 180.159 -32 242.701 -32H264C324.063 -32 362.512 8 391.2 8H393.879C399.626 3.048 407.415 0 415.999 0H479.999C497.672 0 511.999 12.894 511.999 28.8V259.2C511.999 275.106 497.672 288 479.999 288H415.999C407.415 288 399.626 284.952 393.879 280H391.2C384.236 280 376.338 286.193 361.017 303.668L360.888 303.8160000000001L360.757 303.962C351.901 313.899 342.641 324.803 334.906 337.215C316.202 367.463 304.514 416 259.2 416C202.272 416 167.2 380.714 167.2 332.8C167.2 324.774 168.014 317.3110000000001 169.376 310.4H83.2C38.101 310.4 0 272.299 0 227.2zM48 227.2C48 245.9 64.775 262.4 83.2 262.4H241.6C241.6 279.725 215.2 297.6 215.2 332.8C215.2 359.2 235.825 368 259.2000000000001 368C267.9940000000001 368 279.6450000000001 335.288 294.1260000000001 311.9C303.2000000000001 297.325 313.6500000000001 284.675 324.925 272.025C341.034 253.651 358.761 235.392 384 232.429V55.677C341.21 51.913 309.491 16 264 16H242.701C202.177 16 185.577 38.197 192.1 77.325C177.488 85.326 167.949 111.304 179.175 130.95C159.81 149.175 161.388 177.331 174.225 192H83.2C64.225 192 48 208.225 48 227.2zM448 88C461.255 88 472 77.255 472 64S461.255 40 448 40S424 50.745 424 64S434.745 88 448 88z" /> + <glyph glyph-name="hand-point-right" + unicode="" + horiz-adv-x="512" d=" M428.8 310.4H342.623A115.52 115.52 0 0 1 344.799 332.8C344.799 380.714 309.727 416 252.799 416C207.485 416 195.797 367.463 177.092 337.216C169.357 324.803 160.098 313.899 151.241 303.963L151.11 303.817L150.981 303.6690000000001C135.662 286.193 127.764 280 120.8 280H118.121C112.374 284.952 104.585 288 96.001 288H32C14.327 288 0 275.106 0 259.2V28.8C0 12.894 14.327 0 32 0H96C104.584 0 112.373 3.048 118.12 8H120.799C149.487 8 187.936 -32 247.999 -32H269.298C331.8400000000001 -32 368.098 6.658 369.238 59.145C381.7200000000001 76.958 387.729 99.93 385.223 121.936A93.148 93.148 0 0 1 393.152 144H428.8C474.235 144 512 181.584 512 227.2C512 272.299 473.899 310.4 428.8 310.4zM428.8 192H337.774C350.611 177.331 352.189 149.175 332.824 130.95C344.051 111.304 334.511 85.326 319.899 77.325C326.423 38.197 309.823 16 269.299 16H248C202.509 16 170.79 51.913 128 55.676V232.429C153.239 235.393 170.966 253.651 187.075 272.025C198.35 284.675 208.8 297.3250000000001 217.874 311.9C232.355 335.288 244.006 368 252.8 368C276.175 368 296.8 359.2 296.8 332.8C296.8 297.6 270.4000000000001 279.725 270.4000000000001 262.4H428.8000000000001C447.2250000000001 262.4 464.0000000000001 245.9 464.0000000000001 227.2C464.0000000000001 208.225 447.7750000000001 192 428.8000000000001 192zM88 64C88 50.745 77.255 40 64 40S40 50.745 40 64S50.745 88 64 88S88 77.255 88 64z" /> + <glyph glyph-name="hand-point-up" + unicode="" + horiz-adv-x="448" d=" M105.6 364.8V278.623A115.52 115.52 0 0 1 83.2 280.799C35.286 280.799 0 245.727 0 188.799C0 143.485 48.537 131.797 78.784 113.092C91.197 105.357 102.101 96.098 112.037 87.241L112.183 87.11L112.331 86.981C129.807 71.662 136 63.764 136 56.8V54.121C131.048 48.374 128 40.585 128 32.001V-31.999C128 -49.672 140.894 -63.999 156.8 -63.999H387.2000000000001C403.1060000000001 -63.999 416.0000000000001 -49.672 416.0000000000001 -31.999V32.001C416.0000000000001 40.585 412.9520000000001 48.374 408.0000000000001 54.121V56.8C408.0000000000001 85.488 448.0000000000001 123.937 448.0000000000001 184V205.299C448.0000000000001 267.841 409.3420000000001 304.099 356.8550000000001 305.2390000000001C339.0420000000001 317.721 316.0700000000001 323.73 294.0640000000001 321.224A93.148 93.148 0 0 1 272 329.153V364.8C272 410.235 234.416 448 188.8 448C143.701 448 105.6 409.899 105.6 364.8zM224 364.8V273.774C238.669 286.611 266.825 288.189 285.05 268.824C304.6960000000001 280.0510000000001 330.6740000000001 270.511 338.675 255.899C377.803 262.423 400 245.823 400 205.299V184C400 138.509 364.087 106.79 360.324 64H183.571C180.607 89.239 162.349 106.966 143.975 123.075C131.325 134.35 118.675 144.8 104.1 153.874C80.712 168.355 48 180.006 48 188.8C48 212.175 56.8 232.8 83.2 232.8C118.4 232.8 136.275 206.4 153.6 206.4V364.8C153.6 383.225 170.1 400 188.8 400C207.775 400 224 383.775 224 364.8zM352 24C365.255 24 376 13.255 376 0S365.255 -24 352 -24S328 -13.255 328 0S338.745 24 352 24z" /> + <glyph glyph-name="hand-pointer" + unicode="" + horiz-adv-x="448" d=" M358.182 268.639C338.689 293.4070000000001 305.5030000000001 300.584 278.31 287.737C263.183 303.4240000000001 242.128 310.2240000000001 221.715 307.366V381C221.715 417.944 191.979 448 155.429 448S89.143 417.944 89.143 381V219.871C69.234 227.281 45.871 224.965 27.06 210.999C-2.295 189.204 -8.733 147.6660000000001 12.51 117.847L122.209 -36.154C134.632 -53.59 154.741 -64 176 -64H354.286C385.088 -64 411.86 -42.5 418.843 -12.203L446.272 106.7960000000001A67.873 67.873 0 0 1 448 122V206C448 252.844 401.375 285.273 358.182 268.639zM80.985 168.303L108.111 130.224C117.106 117.598 137.142 123.937 137.142 139.507V381C137.142 406.12 173.713 406.16 173.713 381V206C173.713 197.164 180.876 190 189.713 190H196.57C205.407 190 212.57 197.164 212.57 206V241C212.57 266.12 249.141 266.16 249.141 241V206C249.141 197.164 256.304 190 265.141 190H272C280.837 190 288 197.164 288 206V227C288 252.12 324.5710000000001 252.16 324.5710000000001 227V206C324.5710000000001 197.164 331.7340000000001 190 340.5710000000001 190H347.4280000000001C356.2650000000001 190 363.4280000000001 197.164 363.4280000000001 206C363.4280000000001 231.121 399.999 231.16 399.999 206V122C399.999 120.512 399.8300000000001 119.023 399.497 117.577L372.067 -1.424C370.089 -10.006 362.777 -16 354.2850000000001 -16H176C170.231 -16 164.737 -13.122 161.303 -8.303L51.591 145.697C37.185 165.92 66.585 188.515 80.985 168.303zM176.143 48V144C176.143 152.837 182.411 160 190.143 160H196.143C203.875 160 210.143 152.837 210.143 144V48C210.143 39.163 203.875 32 196.143 32H190.143C182.41 32 176.143 39.163 176.143 48zM251.571 48V144C251.571 152.837 257.839 160 265.5710000000001 160H271.5710000000001C279.3030000000001 160 285.5710000000001 152.837 285.5710000000001 144V48C285.5710000000001 39.163 279.3030000000001 32 271.5710000000001 32H265.5710000000001C257.839 32 251.5710000000001 39.163 251.5710000000001 48zM327 48V144C327 152.837 333.268 160 341 160H347C354.7320000000001 160 361 152.837 361 144V48C361 39.163 354.7320000000001 32 347 32H341C333.268 32 327 39.163 327 48z" /> + <glyph glyph-name="hand-rock" + unicode="" + horiz-adv-x="512" d=" M408.864 368.948C386.463 402.846 342.756 411.221 310.051 392.536C280.577 424.005 230.906 423.629 201.717 392.558C154.557 419.578 93.007 387.503 91.046 331.752C44.846 342.593 0 307.999 0 260.5710000000001V203.618C0 170.877 14.28 139.664 39.18 117.984L136.89 32.903C141.142 29.201 140 27.33 140 -1e-13C140 -17.6730000000001 154.327 -32.0000000000001 172 -32.0000000000001H424C441.673 -32.0000000000001 456 -17.6730000000001 456 -1e-13C456 23.5129999999999 454.985 30.745 459.982 42.37L502.817 142.026C508.911 156.203 512 171.198 512 186.5939999999999V301.0370000000001C512 353.876 457.686 389.699 408.8640000000001 368.948zM464 186.594A64.505 64.505 0 0 0 458.718 160.981L415.8830000000001 61.326C410.653 49.155 408.0000000000001 36.286 408.0000000000001 23.076V16H188V26.286C188 42.656 180.86 58.263 168.41 69.103L70.7 154.183C56.274 166.745 48 184.764 48 203.619V260.572C48 293.78 100 294.1090000000001 100 259.895V218.667A16 16 0 0 1 105.493 206.6L112.493 200.505A16 16 0 0 1 139 212.571V329.1430000000001C139 362.24 191 362.868 191 328.466V301.7150000000001C191 292.879 198.164 285.7150000000001 207 285.7150000000001H214C222.836 285.7150000000001 230 292.879 230 301.7150000000001V342.858C230 375.992 282 376.533 282 342.181V301.7150000000001C282 292.879 289.163 285.7150000000001 298 285.7150000000001H305C313.837 285.7150000000001 321 292.879 321 301.7150000000001V329.144C321 362.174 373 362.924 373 328.467V301.716C373 292.88 380.163 285.716 389 285.716H396C404.837 285.716 412 292.88 412 301.716C412 334.862 464 335.329 464 301.039V186.5940000000001z" /> + <glyph glyph-name="hand-scissors" + unicode="" + horiz-adv-x="512" d=" M256 -32L326 -31.987C331.114 -31.987 336.231 -31.404 341.203 -30.258L460.202 -2.831C490.56 4.165 512 30.98 512 61.723V267.425C512 291.27 498.97 313.376 477.995 325.115L379.996 379.968C345.587 399.2290000000001 312.733 385.7920000000001 287.778 355.235L142.85 410.992C104.963 425.5710000000001 62.238 407.265 47.208 369.791C32.11 332.149 50.843 289.421 89.15 274.679L168 256L74 265.141C33.196 265.141 0 232.33 0 192.001C0 151.671 33.196 118.86 74 118.86H161.635C157.96 92.615 170.327 67.563 191.976 53.8539999999999C178.657 11.263 211.044 -32 256 -32zM256 16.013C230.84 16.013 230.88 52.58 256 52.58C264.837 52.58 272 59.743 272 68.58V75.436C272 84.273 264.837 91.436 256 91.436H228C202.841 91.436 202.878 128.003 228 128.003H256C264.837 128.003 272 135.166 272 144.003V150.859C272 159.696 264.837 166.859 256 166.859H74C39.57 166.859 39.625 217.14 74 217.14H256C264.837 217.14 272 224.303 272 233.14V244.772A16 16 0 0 1 261.746 259.705L106.389 319.49C74.837 331.63 92.957 378.773 125.611 366.207L292.16 302.116A16.001 16.001 0 0 1 310.299 306.928L332.063 333.5750000000001C337.883 340.702 348.411 342.639 356.551 338.0830000000001L454.551 283.2290000000001C460.379 279.966 464 273.911 464 267.424V61.723C464 53.232 458.006 45.919 449.424 43.941L330.423 16.514A19.743 19.743 0 0 0 326 16.012H256z" /> + <glyph glyph-name="hand-spock" + unicode="" + horiz-adv-x="512" d=" M21.096 66.21L150.188 -55.303A32 32 0 0 1 172.12 -64.001H409.7200000000001C423.8900000000001 -64.001 436.3730000000001 -54.682 440.4000000000001 -41.097L472.215 66.216A115.955 115.955 0 0 1 477 99.189V136.028C477 140.079 477.476 144.132 478.414 148.073L510.144 281.4830000000001C520.243 323.8950000000001 487.828 364.221 444.6 364.0080000000001C440.456 388.8640000000001 422.057 411.1730000000001 394.75 418.0000000000001C358.947 426.9520000000001 322.523 405.3450000000001 313.5 369.25L296.599 264L274.924 395.99C266.638 432.06 230.621 454.562 194.62 446.286C165.004 439.4820000000001 144.482 413.897 142.738 384.991C100.101 384.16 69.283 344.428 78.667 303.147L109.707 166.639C82.513 189.154 42.423 186.631 18.225 160.917C-7.151 133.956 -5.873 91.592 21.096 66.21zM53.164 128.021L53.166 128.0219999999999C60.385 135.694 72.407 136.002 80.022 128.8349999999999L133.034 78.9409999999999C143.225 69.351 160 76.6 160 90.594V160.073C160 161.266 159.866 162.456 159.603 163.619L125.473 313.791C119.877 338.408 156.975 346.651 162.527 322.212L192.926 188.4549999999999A16 16 0 0 1 208.529 176.0009999999999H217.1330000000001C227.4090000000001 176.0009999999999 235.0270000000001 185.5679999999999 232.7270000000001 195.5839999999999L191.107 376.7369999999999C185.484 401.2059999999999 222.497 409.813 228.142 385.2449999999999L273.362 188.4169999999999A16 16 0 0 1 288.956 176H302.173A16 16 0 0 1 317.695 188.119L360.067 357.6090000000001C366.171 382.0310000000001 403.029 372.7680000000001 396.932 348.3920000000001L358.805 195.88C356.284 185.792 363.92 176 374.327 176H384.021A16 16 0 0 1 399.586 188.295L426.509 301.4C432.3300000000001 325.848 469.306 317.087 463.475 292.598L431.7200000000001 159.19A100.094 100.094 0 0 1 429 136.028V99.189C429 92.641 428.057 86.138 426.195 79.8610000000001L397.775 -16H178.465L53.978 101.164C46.349 108.344 45.984 120.393 53.164 128.021z" /> + <glyph glyph-name="handshake" + unicode="" + horiz-adv-x="640" d=" M616 352H568C560.893 352 554.51 348.909 550.116 344H526.59L495.46 380.3L495.3 380.48A103.974 103.974 0 0 1 417.03 416H370.48C352.73 416 335.58 411.06 320.79 401.99C304.33 411.07 285.67 416 266.62 416H234.51C205.607 416 176.911 404.781 155.31 383.2L116.12 344H89.884C85.49 348.909 79.107 352 72 352H24C10.745 352 0 341.255 0 328V88C0 74.745 10.745 64 24 64H72C82.449 64 91.334 70.68 94.629 80H113.43L188.78 12.43C214.322 -14.02 248.705 -32 285.36 -32C301.75 -32 317.64 -28.15 331.4600000000001 -21.07C356.396 -21.566 382.5610000000001 -10.702 400.5300000000001 10.34C420.2140000000001 15.919 438.033 27.766 451.25 44.9400000000001C472.239 49.3410000000001 491.978 61.4320000000001 504.67 80.0000000000001H545.371C548.6659999999999 70.6800000000001 557.5509999999999 64.0000000000001 568 64.0000000000001H616C629.255 64.0000000000001 640 74.7450000000001 640 88.0000000000001V328C640 341.255 629.255 352 616 352zM48 96C39.163 96 32 103.163 32 112S39.163 128 48 128S64 120.837 64 112S56.837 96 48 96zM460.52 101.76C445.17 87.465 423.636 90.432 420.57 93.76C421.984 80.378 402.313 52.717 371.49 54.88C365.949 36.357 343.272 21.054 320 29.13C311.11 20.24 297.54 16 285.36 16C260.4100000000001 16 237.59 30.54 222.22 46.91L140.92 119.8200000000001A31.975999999999996 31.975999999999996 0 0 1 119.56 128.0000000000001H96V296H122.75C131.23 296 139.37 299.37 145.37 305.37L189.25 349.25A64.004 64.004 0 0 0 234.51 368H266.62C272.42 368 278.13 367.21 283.62 365.7L240.35 315.2100000000001C216.79 287.73 216.51 247.59 239.69 219.77C272.078 180.904 331.068 180.542 364.17 217.79L390.1500000000001 247.87L462.59 152C476.03 137.4 473.54 113.87 460.52 101.76zM544 128H519.542C519.6460000000001 148.261 512.743 167.33 499.78 182.4L421.7 285.7200000000001C426.21 295.23 424.04 306.95 415.69 314.17C405.615 322.861 390.46 321.669 381.83 311.69L328.2 249.57C314.372 234.16 289.977 234.425 276.56 250.5A25.856999999999996 25.856999999999996 0 0 0 276.79 283.9700000000001L334.7100000000001 351.55A47.09 47.09 0 0 0 370.48 368H417.0300000000001C433.1400000000001 368 448.4700000000001 361.06 459.1 348.9600000000001L504.52 296H544V128zM592 96C583.163 96 576 103.163 576 112S583.163 128 592 128S608 120.837 608 112S600.837 96 592 96z" /> + <glyph glyph-name="hdd" + unicode="" + horiz-adv-x="576" d=" M567.403 212.358L462.323 363.411A48 48 0 0 1 422.919 384H153.081A48 48 0 0 1 113.677 363.411L8.597 212.358A48.001 48.001 0 0 1 0 184.946V48C0 21.49 21.49 0 48 0H528C554.51 0 576 21.49 576 48V184.946C576 194.747 573 204.312 567.403 212.358zM153.081 336H422.919L500.832 224H75.168L153.081 336zM528 48H48V176H528V48zM496 112C496 94.327 481.673 80 464 80S432 94.327 432 112S446.327 144 464 144S496 129.673 496 112zM400 112C400 94.327 385.673 80 368 80S336 94.327 336 112S350.327 144 368 144S400 129.673 400 112z" /> + <glyph glyph-name="heart" + unicode="" + horiz-adv-x="576" d=" M257.3 -27.4L92.5 134.4C85.4 141 24 199.9 24 273.2C24 363.9 80.8 424 176 424C217.4 424 256.6 401.2 288 374.2C319.3 401.2 358.6 424 400 424C491.7 424 552 367.5 552 273.2C552 221.2 520.2 169.7 483.9 134.5L483.5 134.1L318.7 -27.4A43.7 43.7 0 0 0 257.3 -27.4zM125.9 168.9L288 9.7L449.8 168.4C477.1 195.4 504 234.7 504 273.2C504 340.1 465.8 376 400 376C352.8 376 307.2 326.7 288 307.6C271 324.6 224 376 176 376C110.1 376 72 340.1 72 273.2C72 235.9 98.7 194.3 125.9 168.9z" /> + <glyph glyph-name="hospital" + unicode="" + horiz-adv-x="448" d=" M128 204V244C128 250.627 133.373 256 140 256H180C186.627 256 192 250.627 192 244V204C192 197.373 186.627 192 180 192H140C133.373 192 128 197.373 128 204zM268 192H308C314.627 192 320 197.373 320 204V244C320 250.627 314.627 256 308 256H268C261.373 256 256 250.627 256 244V204C256 197.373 261.373 192 268 192zM192 108V148C192 154.627 186.627 160 180 160H140C133.373 160 128 154.627 128 148V108C128 101.373 133.373 96 140 96H180C186.627 96 192 101.373 192 108zM268 96H308C314.627 96 320 101.373 320 108V148C320 154.627 314.627 160 308 160H268C261.373 160 256 154.627 256 148V108C256 101.373 261.373 96 268 96zM448 -28V-64H0V-28C0 -21.373 5.373 -16 12 -16H31.5V362.9650000000001C31.5 374.582 42.245 384 55.5 384H144V424C144 437.255 154.745 448 168 448H280C293.255 448 304 437.255 304 424V384H392.5C405.755 384 416.5 374.582 416.5 362.9650000000001V-16H436C442.627 -16 448 -21.373 448 -28zM79.5 -15H192V52C192 58.627 197.373 64 204 64H244C250.627 64 256 58.627 256 52V-15H368.5V336H304V312C304 298.745 293.255 288 280 288H168C154.745 288 144 298.745 144 312V336H79.5V-15zM266 384H240V410A6 6 0 0 1 234 416H214A6 6 0 0 1 208 410V384H182A6 6 0 0 1 176 378V358A6 6 0 0 1 182 352H208V326A6 6 0 0 1 214 320H234A6 6 0 0 1 240 326V352H266A6 6 0 0 1 272 358V378A6 6 0 0 1 266 384z" /> + <glyph glyph-name="hourglass" + unicode="" + horiz-adv-x="384" d=" M368 400H372C378.627 400 384 405.373 384 412V436C384 442.627 378.627 448 372 448H12C5.373 448 0 442.627 0 436V412C0 405.373 5.373 400 12 400H16C16 319.4360000000001 48.188 234.193 113.18 192C47.899 149.619 16 64.1 16 -16H12C5.373 -16 0 -21.373 0 -28V-52C0 -58.627 5.373 -64 12 -64H372C378.627 -64 384 -58.627 384 -52V-28C384 -21.373 378.627 -16 372 -16H368C368 64.564 335.812 149.807 270.82 192C336.102 234.381 368 319.9 368 400zM64 400H320C320 298.38 262.693 216 192 216S64 298.379 64 400zM320 -16H64C64 85.62 121.308 168 192 168S320 85.62 320 -16z" /> + <glyph glyph-name="id-badge" + unicode="" + horiz-adv-x="384" d=" M0 400V-16C0 -42.51 21.49 -64 48 -64H336C362.51 -64 384 -42.51 384 -16V400C384 426.51 362.51 448 336 448H48C21.49 448 0 426.51 0 400zM336 368V-10A6 6 0 0 0 330 -16H54A6 6 0 0 0 48 -10V368H336zM192 288C230.66 288 262 256.66 262 218S230.66 148 192 148S122 179.34 122 218S153.34 288 192 288zM272.187 141.953L240.987 149.753C208.208 126.176 168.477 131.437 143.013 149.753L111.813 141.953C93.116 137.279 80 120.48 80 101.207V85C80 73.402 89.402 64 101 64H283C294.598 64 304 73.402 304 85V101.207C304 120.48 290.884 137.279 272.187 141.953z" /> + <glyph glyph-name="id-card" + unicode="" + horiz-adv-x="512" d=" M404 192H300C293.373 192 288 197.373 288 204V220C288 226.627 293.373 232 300 232H404C410.627 232 416 226.627 416 220V204C416 197.373 410.627 192 404 192zM416 132V148C416 154.627 410.627 160 404 160H300C293.373 160 288 154.627 288 148V132C288 125.373 293.373 120 300 120H404C410.627 120 416 125.373 416 132zM512 336V48C512 21.49 490.51 0 464 0H48C21.49 0 0 21.49 0 48V336C0 362.51 21.49 384 48 384H464C490.51 384 512 362.51 512 336zM464 54V304H48V54A6 6 0 0 1 54 48H458A6 6 0 0 1 464 54zM176 256C203.614 256 226 233.614 226 206S203.614 156 176 156S126 178.386 126 206S148.386 256 176 256zM233.276 151.681L210.991 157.252C187.578 140.411 159.198 144.169 141.01 157.252L118.725 151.681C105.369 148.342 96 136.343 96 122.577V111C96 102.716 102.716 96 111 96H241C249.284 96 256 102.716 256 111V122.577C256 136.343 246.631 148.342 233.276 151.681z" /> + <glyph glyph-name="image" + unicode="" + horiz-adv-x="512" d=" M464 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H464C490.51 0 512 21.49 512 48V336C512 362.51 490.51 384 464 384zM458 48H54A6 6 0 0 0 48 54V330A6 6 0 0 0 54 336H458A6 6 0 0 0 464 330V54A6 6 0 0 0 458 48zM128 296C105.909 296 88 278.091 88 256S105.909 216 128 216S168 233.909 168 256S150.091 296 128 296zM96 96H416V176L328.485 263.515C323.7990000000001 268.201 316.201 268.201 311.514 263.515L192 144L152.485 183.515C147.799 188.201 140.201 188.201 135.514 183.515L96 144V96z" /> + <glyph glyph-name="images" + unicode="" + horiz-adv-x="576" d=" M480 32V16C480 -10.51 458.51 -32 432 -32H48C21.49 -32 0 -10.51 0 16V272C0 298.51 21.49 320 48 320H64V272H54A6 6 0 0 1 48 266V22A6 6 0 0 1 54 16H426A6 6 0 0 1 432 22V32H480zM522 368H150A6 6 0 0 1 144 362V118A6 6 0 0 1 150 112H522A6 6 0 0 1 528 118V362A6 6 0 0 1 522 368zM528 416C554.51 416 576 394.51 576 368V112C576 85.49 554.51 64 528 64H144C117.49 64 96 85.49 96 112V368C96 394.51 117.49 416 144 416H528zM264 304C264 281.909 246.091 264 224 264S184 281.909 184 304S201.909 344 224 344S264 326.091 264 304zM192 208L231.515 247.515C236.201 252.201 243.799 252.201 248.486 247.515L288 208L391.515 311.515C396.201 316.201 403.799 316.201 408.486 311.515L480 240V160H192V208z" /> + <glyph glyph-name="keyboard" + unicode="" + horiz-adv-x="576" d=" M528 384H48C21.49 384 0 362.51 0 336V48C0 21.49 21.49 0 48 0H528C554.51 0 576 21.49 576 48V336C576 362.51 554.51 384 528 384zM536 48C536 43.589 532.411 40 528 40H48C43.589 40 40 43.589 40 48V336C40 340.411 43.589 344 48 344H528C532.411 344 536 340.411 536 336V48zM170 178V206C170 212.627 164.627 218 158 218H130C123.373 218 118 212.627 118 206V178C118 171.373 123.373 166 130 166H158C164.627 166 170 171.373 170 178zM266 178V206C266 212.627 260.627 218 254 218H226C219.373 218 214 212.627 214 206V178C214 171.373 219.373 166 226 166H254C260.627 166 266 171.373 266 178zM362 178V206C362 212.627 356.627 218 350 218H322C315.373 218 310 212.627 310 206V178C310 171.373 315.373 166 322 166H350C356.627 166 362 171.373 362 178zM458 178V206C458 212.627 452.627 218 446 218H418C411.373 218 406 212.627 406 206V178C406 171.373 411.373 166 418 166H446C452.627 166 458 171.373 458 178zM122 96V124C122 130.627 116.627 136 110 136H82C75.373 136 70 130.627 70 124V96C70 89.373 75.373 84 82 84H110C116.627 84 122 89.373 122 96zM506 96V124C506 130.627 500.627 136 494 136H466C459.373 136 454 130.627 454 124V96C454 89.373 459.373 84 466 84H494C500.627 84 506 89.373 506 96zM122 260V288C122 294.627 116.627 300 110 300H82C75.373 300 70 294.627 70 288V260C70 253.373 75.373 248 82 248H110C116.627 248 122 253.373 122 260zM218 260V288C218 294.627 212.627 300 206 300H178C171.373 300 166 294.627 166 288V260C166 253.373 171.373 248 178 248H206C212.627 248 218 253.373 218 260zM314 260V288C314 294.627 308.627 300 302 300H274C267.373 300 262 294.627 262 288V260C262 253.373 267.373 248 274 248H302C308.627 248 314 253.373 314 260zM410 260V288C410 294.627 404.627 300 398 300H370C363.373 300 358 294.627 358 288V260C358 253.373 363.373 248 370 248H398C404.627 248 410 253.373 410 260zM506 260V288C506 294.627 500.627 300 494 300H466C459.373 300 454 294.627 454 288V260C454 253.373 459.373 248 466 248H494C500.627 248 506 253.373 506 260zM408 102V118C408 124.627 402.627 130 396 130H180C173.373 130 168 124.627 168 118V102C168 95.373 173.373 90 180 90H396C402.627 90 408 95.373 408 102z" /> + <glyph glyph-name="lemon" + unicode="" + horiz-adv-x="512" d=" M484.112 420.111C455.989 448.233 416.108 456.057 387.0590000000001 439.135C347.604 416.152 223.504 489.111 91.196 356.803C-41.277 224.328 31.923 100.528 8.866 60.942C-8.056 31.891 -0.234 -7.99 27.888 -36.112C56.023 -64.247 95.899 -72.0499999999999 124.945 -55.133C164.368 -32.163 288.502 -105.102 420.803 27.196C553.277 159.673 480.076 283.473 503.134 323.057C520.056 352.1070000000001 512.234 391.988 484.112 420.111zM461.707 347.217C422.907 280.608 507.307 181.582 386.862 61.137C266.422 -59.306 167.387 25.089 100.786 -13.706C78.1069999999999 -26.913 36.751 13.535 50.2929999999999 36.782C89.0929999999999 103.391 4.6929999999999 202.417 125.138 322.862C245.573 443.298 344.616 358.914 411.219 397.708C433.949 410.948 475.224 370.42 461.707 347.217zM291.846 338.481C293.216 327.521 285.442 317.524 274.481 316.154C219.635 309.299 138.702 228.367 131.846 173.519C130.473 162.53 120.447 154.785 109.52 156.154C98.559 157.524 90.785 167.52 92.155 178.48C101.317 251.766 196.322 346.6950000000001 269.5200000000001 355.8450000000001C280.473 357.213 290.4760000000001 349.442 291.8460000000001 338.481z" /> + <glyph glyph-name="life-ring" + unicode="" + horiz-adv-x="512" d=" M256 -56C392.967 -56 504 55.033 504 192S392.967 440 256 440S8 328.967 8 192S119.033 -56 256 -56zM152.602 20.72L206.013 74.131C237.819 60.625 274.141 60.609 305.987 74.131L359.398 20.72C296.1810000000001 -17.599 215.819 -17.599 152.602 20.72zM336 192C336 147.888 300.112 112 256 112S176 147.888 176 192S211.888 272 256 272S336 236.112 336 192zM427.28 88.602L373.869 142.013C387.374 173.819 387.391 210.141 373.869 241.987L427.28 295.398C465.599 232.181 465.599 151.819 427.28 88.602zM359.397 363.28L305.986 309.8690000000001C274.18 323.374 237.858 323.391 206.013 309.8690000000001L152.602 363.28C215.819 401.599 296.1810000000001 401.599 359.397 363.28zM84.72 295.398L138.131 241.987C124.625 210.181 124.609 173.859 138.131 142.013L84.72 88.602C46.401 151.819 46.401 232.181 84.72 295.398z" /> + <glyph glyph-name="lightbulb" + unicode="" + horiz-adv-x="384" d=" M272 20V-8C272 -18.449 265.32 -27.334 256 -30.629V-40C256 -53.255 245.255 -64 232 -64H152C138.745 -64 128 -53.255 128 -40V-30.629C118.68 -27.334 112 -18.449 112 -8V20C112 26.627 117.373 32 124 32H260C266.627 32 272 26.627 272 20zM128 272C128 307.29 156.71 336 192 336C200.837 336 208 343.164 208 352S200.837 368 192 368C139.065 368 96 324.935 96 272C96 263.164 103.164 256 112 256S128 263.164 128 272zM192 400C262.734 400 320 342.746 320 272C320 194.398 282.617 211.523 239.02 112H144.98C101.318 211.67 64 194.131 64 272C64 342.735 121.254 400 192 400M192 448C94.805 448 16 369.197 16 272C16 170.269 67.697 180.459 106.516 79.326C110.066 70.077 118.986 64 128.892 64H255.107C265.013 64 273.933 70.078 277.483 79.326C316.303 180.459 368 170.269 368 272C368 369.197 289.195 448 192 448z" /> + <glyph glyph-name="list-alt" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H464C490.51 -32 512 -10.51 512 16V368C512 394.51 490.51 416 464 416zM458 16H54A6 6 0 0 0 48 22V362A6 6 0 0 0 54 368H458A6 6 0 0 0 464 362V22A6 6 0 0 0 458 16zM416 108V84C416 77.373 410.627 72 404 72H204C197.373 72 192 77.373 192 84V108C192 114.627 197.373 120 204 120H404C410.627 120 416 114.627 416 108zM416 204V180C416 173.373 410.627 168 404 168H204C197.373 168 192 173.373 192 180V204C192 210.627 197.373 216 204 216H404C410.627 216 416 210.627 416 204zM416 300V276C416 269.373 410.627 264 404 264H204C197.373 264 192 269.373 192 276V300C192 306.627 197.373 312 204 312H404C410.627 312 416 306.627 416 300zM164 288C164 268.118 147.882 252 128 252S92 268.118 92 288S108.118 324 128 324S164 307.882 164 288zM164 192C164 172.118 147.882 156 128 156S92 172.118 92 192S108.118 228 128 228S164 211.882 164 192zM164 96C164 76.118 147.882 60 128 60S92 76.118 92 96S108.118 132 128 132S164 115.882 164 96z" /> + <glyph glyph-name="map" + unicode="" + horiz-adv-x="576" d=" M508.505 411.83L381.517 355.424L207.179 413.537A47.992 47.992 0 0 1 172.505 411.863L28.505 347.863A48 48 0 0 1 0 304V16.033C0 -18.905 35.991 -41.831 67.495 -27.83L194.483 28.576L368.822 -29.537A47.992 47.992 0 0 1 403.496 -27.863L547.496 36.137A48 48 0 0 1 576 80V367.967C576 402.905 540.009 425.831 508.505 411.83zM360 24L216 72V360L360 312V24zM48 16V304L168 357.333V69.333L48 16zM528 80L408 26.667V314.6670000000001L528 368V80z" /> + <glyph glyph-name="meh" + unicode="" + horiz-adv-x="512" d=" M256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM320 304C310.465 304 301.488 301.6140000000001 293.63 297.411H293.647C306.382 297.411 316.706 287.087 316.706 274.352C316.706 261.617 306.382 251.293 293.647 251.293S270.588 261.617 270.588 274.352V274.3690000000001C266.386 266.512 264 257.535 264 248C264 217.072 289.072 192 320 192S376 217.072 376 248S350.928 304 320 304zM192 304C182.465 304 173.488 301.6140000000001 165.63 297.411H165.647C178.382 297.411 188.706 287.087 188.706 274.352C188.706 261.617 178.382 251.293 165.647 251.293C152.912 251.293 142.588 261.617 142.588 274.352V274.3690000000001C138.386 266.512 136 257.535 136 248C136 217.072 161.072 192 192 192S248 217.072 248 248S222.928 304 192 304zM328 120H184C152.224 120 152.251 72 184 72H328C359.776 72 359.749 120 328 120z" /> + <glyph glyph-name="minus-square" + unicode="" + horiz-adv-x="448" d=" M108 164C101.4 164 96 169.4 96 176V208C96 214.6 101.4 220 108 220H340C346.6 220 352 214.6 352 208V176C352 169.4 346.6 164 340 164H108zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" /> + <glyph glyph-name="money-bill-alt" + unicode="" + horiz-adv-x="640" d=" M320 304C266.979 304 224 253.857 224 192C224 130.153 266.977 80 320 80C373 80 416 130.13 416 192C416 253.857 373.021 304 320 304zM368 139.572C368 132.095 364.0830000000001 128 356.428 128H289.135C281.479 128 277.562 132.095 277.562 139.572V148.473C277.562 155.95 281.479 160.045 289.135 160.045H304.266V199.923C304.266 205.086 304.8 210.426 304.8 210.426H304.444S302.665 207.756 301.596 206.688C297.1449999999999 202.415 291.092 202.237 285.93 207.756L280.412 213.987C275.07 219.328 275.428 225.203 280.946 230.366L302.666 250.305C307.115 254.4 311.032 256.002 317.086 256.002H329.191C336.847 256.002 340.941 252.086 340.941 244.43V160.046H356.429C364.084 160.046 368.001 155.952 368.001 148.474V139.572zM616 384H24C10.745 384 0 373.255 0 360V25C0 11.745 10.745 1 24 1H616C629.255 1 640 11.745 640 25V360C640 373.255 629.255 384 616 384zM512 48H128C128 92.183 92.183 128 48 128V256C92.183 256 128 291.817 128 336H512C512 291.817 547.817 256 592 256V128C547.817 128 512 92.183 512 48z" /> + <glyph glyph-name="moon" + unicode="" + horiz-adv-x="512" d=" M279.135 -64C357.891 -64 430.117 -28.196 477.979 30.775C506.249 65.606 475.421 116.497 431.73 108.176C349.382 92.493 273.458 155.444 273.458 238.968C273.458 287.392 299.518 331.26 340.892 354.804C379.637 376.854 369.891 435.592 325.87 443.723A257.936 257.936 0 0 1 279.135 448C137.775 448 23.135 333.425 23.135 192C23.135 50.64 137.711 -64 279.135 -64zM279.135 400C292.12 400 304.824 398.799 317.151 396.522C262.391 365.359 225.4580000000001 306.48 225.4580000000001 238.968C225.4580000000001 125.12 329.0990000000001 39.768 440.7100000000001 61.024C402.574 14.036 344.366 -16 279.135 -16C164.26 -16 71.135 77.125 71.135 192S164.26 400 279.135 400z" /> + <glyph glyph-name="newspaper" + unicode="" + horiz-adv-x="576" d=" M552 384H112C91.142 384 73.357 370.623 66.752 352H24C10.745 352 0 341.255 0 328V56C0 25.072 25.072 0 56 0H552C565.255 0 576 10.745 576 24V360C576 373.255 565.255 384 552 384zM48 56V304H64V56C64 51.589 60.411 48 56 48S48 51.589 48 56zM528 48H111.422C111.796 50.614 112 53.283 112 56V336H528V48zM172 168H308C314.627 168 320 173.373 320 180V276C320 282.627 314.627 288 308 288H172C165.373 288 160 282.627 160 276V180C160 173.373 165.373 168 172 168zM200 248H280V208H200V248zM160 108V132C160 138.627 165.373 144 172 144H308C314.627 144 320 138.627 320 132V108C320 101.373 314.627 96 308 96H172C165.373 96 160 101.373 160 108zM352 108V132C352 138.627 357.373 144 364 144H468C474.627 144 480 138.627 480 132V108C480 101.373 474.627 96 468 96H364C357.373 96 352 101.373 352 108zM352 252V276C352 282.627 357.373 288 364 288H468C474.627 288 480 282.627 480 276V252C480 245.373 474.627 240 468 240H364C357.373 240 352 245.373 352 252zM352 180V204C352 210.627 357.373 216 364 216H468C474.627 216 480 210.627 480 204V180C480 173.373 474.627 168 468 168H364C357.373 168 352 173.373 352 180z" /> + <glyph glyph-name="object-group" + unicode="" + horiz-adv-x="512" d=" M500 320C506.627 320 512 325.373 512 332V404C512 410.627 506.627 416 500 416H428C421.373 416 416 410.627 416 404V392H96V404C96 410.627 90.627 416 84 416H12C5.373 416 0 410.627 0 404V332C0 325.373 5.373 320 12 320H24V64H12C5.373 64 0 58.627 0 52V-20C0 -26.627 5.373 -32 12 -32H84C90.627 -32 96 -26.627 96 -20V-8H416V-20C416 -26.627 421.373 -32 428 -32H500C506.627 -32 512 -26.627 512 -20V52C512 58.627 506.627 64 500 64H488V320H500zM448 384H480V352H448V384zM32 384H64V352H32V384zM64 0H32V32H64V0zM480 0H448V32H480V0zM440 64H428C421.373 64 416 58.627 416 52V40H96V52C96 58.627 90.627 64 84 64H72V320H84C90.627 320 96 325.373 96 332V344H416V332C416 325.373 421.373 320 428 320H440V64zM404 256H320V308C320 314.628 314.627 320 308 320H108C101.373 320 96 314.628 96 308V140C96 133.372 101.373 128 108 128H192V76C192 69.372 197.373 64 204 64H404C410.627 64 416 69.372 416 76V244C416 250.628 410.627 256 404 256zM136 280H280V168H136V280zM376 104H232V128H308C314.627 128 320 133.372 320 140V216H376V104z" /> + <glyph glyph-name="object-ungroup" + unicode="" + horiz-adv-x="576" d=" M564 224C570.627 224 576 229.373 576 236V308C576 314.627 570.627 320 564 320H492C485.373 320 480 314.627 480 308V296H392V320H404C410.627 320 416 325.373 416 332V404C416 410.627 410.627 416 404 416H332C325.373 416 320 410.627 320 404V392H96V404C96 410.627 90.627 416 84 416H12C5.373 416 0 410.627 0 404V332C0 325.373 5.373 320 12 320H24V160H12C5.373 160 0 154.627 0 148V76C0 69.373 5.373 64 12 64H84C90.627 64 96 69.373 96 76V88H184V64H172C165.373 64 160 58.627 160 52V-20C160 -26.627 165.373 -32 172 -32H244C250.627 -32 256 -26.627 256 -20V-8H480V-20C480 -26.627 485.373 -32 492 -32H564C570.627 -32 576 -26.627 576 -20V52C576 58.627 570.627 64 564 64H552V224H564zM352 384H384V352H352V384zM352 128H384V96H352V128zM64 96H32V128H64V96zM64 352H32V384H64V352zM96 136V148C96 154.627 90.627 160 84 160H72V320H84C90.627 320 96 325.373 96 332V344H320V332C320 325.373 325.373 320 332 320H344V160H332C325.373 160 320 154.627 320 148V136H96zM224 0H192V32H224V0zM504 64H492C485.373 64 480 58.627 480 52V40H256V52C256 58.627 250.627 64 244 64H232V88H320V76C320 69.373 325.373 64 332 64H404C410.627 64 416 69.373 416 76V148C416 154.627 410.627 160 404 160H392V248H480V236C480 229.373 485.373 224 492 224H504V64zM544 0H512V32H544V0zM544 256H512V288H544V256z" /> + <glyph glyph-name="paper-plane" + unicode="" + horiz-adv-x="512" d=" M440 441.5L24 201.6C-10.4 181.7 -7.1 130.8 29.7 115.7L144 68.4V-16C144 -62.4 203.2 -81.5 230.6 -44.6L274.4 14.5L386.3 -31.7C392.2 -34.1 398.4 -35.3 404.6 -35.3C412.8 -35.3 420.9 -33.2 428.2 -29.1C441 -21.9 449.8 -9.1 452.1 5.4L511.4999999999999 392.6C517.5999999999999 432.7 474.6 461.4 440 441.5zM192 -16V48.6L228.6 33.5L192 -16zM404.6 12.7L250.8 76.2L391 278.5C401.7 294 381.5 312 367.3 299.7L155.8 115.4L48 160L464 400L404.6 12.7z" /> + <glyph glyph-name="pause-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM352 272V112C352 103.2 344.8 96 336 96H288C279.2 96 272 103.2 272 112V272C272 280.8 279.2 288 288 288H336C344.8 288 352 280.8 352 272zM240 272V112C240 103.2 232.8 96 224 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H224C232.8 288 240 280.8 240 272z" /> + <glyph glyph-name="play-circle" + unicode="" + horiz-adv-x="512" d=" M371.7 210L195.7 317C179.9 325.8 160 314.5 160 296V88C160 69.6 179.8 58.2 195.7 67L371.7 168C388.1 177.1 388.1 200.8 371.7 210zM504 192C504 329 393 440 256 440S8 329 8 192S119 -56 256 -56S504 55 504 192zM56 192C56 302.5 145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192z" /> + <glyph glyph-name="plus-square" + unicode="" + horiz-adv-x="448" d=" M352 208V176C352 169.4 346.6 164 340 164H252V76C252 69.4 246.6 64 240 64H208C201.4 64 196 69.4 196 76V164H108C101.4 164 96 169.4 96 176V208C96 214.6 101.4 220 108 220H196V308C196 314.6 201.4 320 208 320H240C246.6 320 252 314.6 252 308V220H340C346.6 220 352 214.6 352 208zM448 368V16C448 -10.5 426.5 -32 400 -32H48C21.5 -32 0 -10.5 0 16V368C0 394.5 21.5 416 48 416H400C426.5 416 448 394.5 448 368zM400 22V362C400 365.3 397.3 368 394 368H54C50.7 368 48 365.3 48 362V22C48 18.7 50.7 16 54 16H394C397.3 16 400 18.7 400 22z" /> + <glyph glyph-name="question-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119.043 440 8 328.9170000000001 8 192C8 55.003 119.043 -56 256 -56S504 55.003 504 192C504 328.9170000000001 392.957 440 256 440zM256 -8C145.468 -8 56 81.431 56 192C56 302.495 145.472 392 256 392C366.491 392 456 302.529 456 192C456 81.47 366.569 -8 256 -8zM363.2440000000001 247.2C363.2440000000001 180.148 290.8230000000001 179.116 290.8230000000001 154.337V148C290.8230000000001 141.373 285.4500000000001 136 278.8230000000001 136H233.1760000000001C226.5490000000001 136 221.1760000000001 141.373 221.1760000000001 148V156.659C221.1760000000001 192.404 248.2760000000001 206.693 268.7550000000001 218.175C286.3160000000001 228.02 297.0790000000001 234.716 297.0790000000001 247.754C297.0790000000001 265 275.0800000000001 276.447 257.2950000000001 276.447C234.1060000000001 276.447 223.4010000000001 265.4700000000001 208.3530000000001 246.478C204.2960000000001 241.358 196.8930000000001 240.407 191.6870000000001 244.354L163.8630000000001 265.452C158.7560000000001 269.324 157.6120000000001 276.5180000000001 161.2190000000001 281.815C184.846 316.509 214.94 336 261.794 336C310.865 336 363.244 297.6960000000001 363.244 247.2zM298 80C298 56.841 279.159 38 256 38S214 56.841 214 80S232.841 122 256 122S298 103.159 298 80z" /> + <glyph glyph-name="registered" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 -8C145.468 -8 56 81.451 56 192C56 302.531 145.451 392 256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8zM366.442 73.791C313.396 170.075 316.192 165.259 313.171 169.876C337.438 183.755 352.653 211.439 352.653 243.052C352.653 295.555 322.406 328.304 251.1550000000001 328.304H172.488C165.8710000000001 328.304 160.488 322.921 160.488 316.304V68C160.488 61.383 165.8710000000001 56 172.488 56H211.0560000000001C217.673 56 223.0560000000001 61.383 223.0560000000001 68V151.663H255.0140000000001L302.5290000000001 62.36A11.98 11.98 0 0 1 313.1220000000001 56H355.9320000000001C365.0720000000001 56 370.8460000000001 65.799 366.4420000000001 73.791zM256.933 208.094H223.058V272.234H250.435C282.852 272.234 289.3640000000001 260.101 289.3640000000001 240.525C289.3630000000001 219.612 277.846 208.094 256.9330000000001 208.094z" /> + <glyph glyph-name="save" + unicode="" + horiz-adv-x="448" d=" M433.941 318.059L350.059 401.9410000000001A48 48 0 0 1 316.118 416H48C21.49 416 0 394.51 0 368V16C0 -10.51 21.49 -32 48 -32H400C426.51 -32 448 -10.51 448 16V284.118A48 48 0 0 1 433.941 318.059zM272 368V288H144V368H272zM394 16H54A6 6 0 0 0 48 22V362A6 6 0 0 0 54 368H96V264C96 250.745 106.745 240 120 240H296C309.255 240 320 250.745 320 264V364.118L398.243 285.875A6 6 0 0 0 400 281.632V22A6 6 0 0 0 394 16zM224 216C175.477 216 136 176.523 136 128S175.477 40 224 40S312 79.477 312 128S272.523 216 224 216zM224 88C201.944 88 184 105.944 184 128S201.944 168 224 168S264 150.056 264 128S246.056 88 224 88z" /> + <glyph glyph-name="share-square" + unicode="" + horiz-adv-x="576" d=" M561.938 289.94L417.94 433.908C387.926 463.922 336 442.903 336 399.968V342.77C293.55 340.89 251.97 336.2200000000001 215.24 324.7800000000001C180.07 313.8300000000001 152.17 297.2000000000001 132.33 275.36C108.22 248.8 96 215.4 96 176.06C96 114.363 129.178 63.605 180.87 31.3C218.416 7.792 266.118 43.951 251.89 87.04C236.375 134.159 234.734 157.963 336 165.8V112C336 69.007 387.968 48.087 417.94 78.06L561.938 222.06C580.688 240.8 580.688 271.2 561.938 289.94zM384 112V215.84C255.309 213.918 166.492 192.65 206.31 72C176.79 90.45 144 123.92 144 176.06C144 285.394 273.14 295.007 384 295.91V400L528 256L384 112zM408.74 27.507A82.658 82.658 0 0 1 429.714 36.81C437.69 41.762 448 35.984 448 26.596V-16C448 -42.51 426.51 -64 400 -64H48C21.49 -64 0 -42.51 0 -16V336C0 362.51 21.49 384 48 384H180C186.627 384 192 378.627 192 372V367.514C192 362.597 189.013 358.145 184.431 356.362C170.729 351.031 158.035 344.825 146.381 337.777A12.138 12.138 0 0 0 140.101 336H54A6 6 0 0 1 48 330V-10A6 6 0 0 1 54 -16H394A6 6 0 0 1 400 -10V15.966C400 21.336 403.579 26.025 408.74 27.507z" /> + <glyph glyph-name="smile" + unicode="" + horiz-adv-x="512" d=" M256 392C366.532 392 456 302.549 456 192C456 81.468 366.549 -8 256 -8C145.468 -8 56 81.451 56 192C56 302.532 145.451 392 256 392M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM320 304C310.465 304 301.488 301.6140000000001 293.63 297.411H293.647C306.382 297.411 316.706 287.087 316.706 274.352C316.706 261.617 306.382 251.293 293.647 251.293S270.588 261.617 270.588 274.352V274.3690000000001C266.386 266.512 264 257.535 264 248C264 217.072 289.072 192 320 192S376 217.072 376 248S350.928 304 320 304zM192 304C182.465 304 173.488 301.6140000000001 165.63 297.411H165.647C178.382 297.411 188.706 287.087 188.706 274.352C188.706 261.617 178.382 251.293 165.647 251.293C152.912 251.293 142.588 261.617 142.588 274.352V274.3690000000001C138.386 266.512 136 257.535 136 248C136 217.072 161.072 192 192 192S248 217.072 248 248S222.928 304 192 304zM387.372 121.781C406.1910000000001 147.373 367.516 175.798 348.702 150.219C298.567 82.042 213.473 82.039 163.335 150.219C144.507 175.82 105.857 147.358 124.665 121.781C193.963 27.55 317.988 27.43 387.372 121.781z" /> + <glyph glyph-name="snowflake" + unicode="" + horiz-adv-x="448" d=" M438.237 92.073L371.663 130.613L431.111 140.94C436.957 142.315 441.72 146.123 444.569 151.07C447.0490000000001 155.377 448.075 160.548 447.093 165.721C444.983 176.836 434.4070000000001 183.76 423.4720000000001 181.188L338.0490000000001 150.073L255.914 192L338.05 233.926L423.473 202.811C434.409 200.239 444.985 207.163 447.094 218.278C449.205 229.393 442.048 240.487 431.113 243.059L371.665 253.386L438.238 291.926C447.778 297.449 450.853 310.018 445.105 320C439.357 329.982 426.965 333.596 417.425 328.074L350.851 289.534L371.656 346.3210000000001C374.902 357.103 368.898 368.863 358.243 372.589C347.589 376.314 336.3209999999999 370.592 333.075 359.81L317.2369999999999 270.075L244.8139999999999 228.149V312L314.3989999999999 370.621C322.0879999999999 378.831 321.3959999999999 391.4770000000001 312.8509999999999 398.866C304.3059999999999 406.257 291.1459999999999 405.589 283.4569999999999 397.38L244.8129999999999 350.92V428C244.8129999999999 439.046 235.4949999999999 448 223.9999999999999 448S203.1869999999999 439.046 203.1869999999999 428V350.92L164.5429999999999 397.38C156.8539999999999 405.5900000000001 143.6939999999999 406.256 135.1489999999999 398.866C126.6049999999999 391.477 125.9129999999999 378.831 133.6019999999999 370.621L203.187 312V228.147L130.764 270.073L114.926 359.809C111.679 370.591 100.411 376.313 89.757 372.588C79.101 368.863 73.098 357.102 76.344 346.32L97.149 289.533L30.576 328.073C21.036 333.596 8.643 329.981 2.896 319.999S0.223 297.448 9.763 291.925L76.337 253.385L16.888 243.057C5.953 240.485 -1.202 229.391 0.907 218.276C3.017 207.162 13.593 200.238 24.529 202.81L109.951 233.925L192.086 192L109.95 150.074L24.527 181.189C13.591 183.761 3.016 176.8370000000001 0.905 165.723C-1.204 154.61 5.951 143.514 16.886 140.942L76.335 130.614L9.761 92.074C0.223 86.551 -2.852 73.982 2.896 64S21.036 50.403 30.576 55.926L97.15 94.466L76.345 37.68C74.61 31.916 75.517 25.875 78.365 20.929C80.845 16.622 84.798 13.145 89.757 11.412C100.412 7.687 111.68 13.409 114.926 24.191L130.764 113.927L203.187 155.853V72L133.602 13.379C125.912 5.169 126.605 -7.476 135.149 -14.866C143.693 -22.254 156.854 -21.589 164.543 -13.379L203.187 33.081V-44C203.187 -55.046 212.505 -64 224 -64S244.813 -55.046 244.813 -44V33.081L283.457 -13.379C287.568 -17.768 293.2389999999999 -19.9999999999999 298.935 -19.9999999999999C303.8949999999999 -19.9999999999999 308.874 -18.3059999999999 312.851 -14.8659999999999C321.396 -7.4759999999999 322.088 5.1690000000001 314.399 13.3790000000001L244.813 72V155.853L317.236 113.927L333.074 24.191C336.32 13.409 347.588 7.687 358.242 11.412C368.8950000000001 15.138 374.901 26.8990000000001 371.654 37.6800000000001L350.849 94.467L417.423 55.927C426.963 50.404 439.356 54.019 445.103 64.001C450.852 73.982 447.778 86.5510000000001 438.237 92.073z" /> + <glyph glyph-name="square" + unicode="" + horiz-adv-x="448" d=" M400 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H400C426.5 -32 448 -10.5 448 16V368C448 394.5 426.5 416 400 416zM394 16H54C50.7 16 48 18.7 48 22V362C48 365.3 50.7 368 54 368H394C397.3 368 400 365.3 400 362V22C400 18.7 397.3 16 394 16z" /> + <glyph glyph-name="star-half" + unicode="" + horiz-adv-x="576" d=" M288 62.7L163.7 -2.7L187.4 135.6999999999999L86.8 233.7L225.8 253.8999999999999L288 379.8999999999999V448C276.6 448 265.2 442.1 259.3 430.2L194 297.8L47.9 276.6C21.7 272.8 11.2 240.5 30.2 222L135.9 119L110.9 -26.5C106.4 -52.6 133.9 -72.5 157.3 -60.2L288 8.4V62.7z" /> + <glyph glyph-name="star" + unicode="" + horiz-adv-x="576" d=" M528.1 276.5L382 297.8L316.7 430.2C305 453.8 271.1 454.1 259.3 430.2L194 297.8L47.9 276.5C21.7 272.7 11.2 240.4 30.2 221.9L135.9 118.9L110.9 -26.6C106.4 -52.9 134.1 -72.6 157.3 -60.3L288 8.4L418.7 -60.3C441.9 -72.5 469.6 -52.9 465.1 -26.6L440.1 118.9L545.8 221.9C564.8 240.4 554.3 272.7 528.0999999999999 276.5zM388.6 135.7L412.3 -2.7L288 62.6L163.7 -2.7L187.4 135.7000000000001L86.8 233.7000000000001L225.8 253.9000000000001L288 379.9000000000001L350.2 253.9000000000001L489.2 233.7000000000001L388.6 135.7000000000001z" /> + <glyph glyph-name="sticky-note" + unicode="" + horiz-adv-x="448" d=" M448 99.894V368C448 394.51 426.51 416 400 416H48C21.49 416 0 394.51 0 368V16.012C0 -10.498 21.49 -31.988 48 -31.988H316.118A48 48 0 0 1 350.059 -17.929L433.941 65.953A48 48 0 0 1 448 99.894zM320 19.894V96.012H396.118L320 19.894zM400 368V144.012H296C282.745 144.012 272 133.267 272 120.012V16.012H48V368H400z" /> + <glyph glyph-name="stop-circle" + unicode="" + horiz-adv-x="512" d=" M504 192C504 329 393 440 256 440S8 329 8 192S119 -56 256 -56S504 55 504 192zM56 192C56 302.5 145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8S56 81.5 56 192zM352 272V112C352 103.2 344.8 96 336 96H176C167.2 96 160 103.2 160 112V272C160 280.8 167.2 288 176 288H336C344.8 288 352 280.8 352 272z" /> + <glyph glyph-name="sun" + unicode="" + horiz-adv-x="512" d=" M220.116 -39.936L199.903 9.489A3.9920000000000004 3.9920000000000004 0 0 1 194.095 11.3750000000001L148.691 -16.7289999999999C119.225 -34.9689999999999 82.396 -8.2099999999999 90.637 25.45L103.336 77.3150000000001A3.9930000000000003 3.9930000000000003 0 0 1 99.746 82.256L46.495 86.2070000000001C11.941 88.7690000000001 -2.137 132.0620000000001 24.321 154.4540000000001L65.08 188.95A3.9920000000000004 3.9920000000000004 0 0 1 65.08 195.056L24.32 229.553C-2.13 251.937 11.93 295.235 46.494 297.799L99.745 301.75A3.9930000000000003 3.9930000000000003 0 0 1 103.335 306.691L90.637 358.557C82.398 392.213 119.218 418.977 148.691 400.736L194.094 372.632A3.9930000000000003 3.9930000000000003 0 0 1 199.902 374.519L220.115 423.944C233.231 456.015 278.753 456.025 291.873 423.944L312.085 374.52A3.9939999999999998 3.9939999999999998 0 0 1 317.894 372.6330000000001L363.2970000000001 400.737C392.761 418.973 429.5940000000001 392.224 421.351 358.558L408.652 306.693A3.9950000000000006 3.9950000000000006 0 0 1 412.242 301.752L465.4929999999999 297.8010000000001C500.0459999999999 295.2380000000001 514.126 251.947 487.6679999999999 229.555L446.908 195.058A3.9930000000000003 3.9930000000000003 0 0 1 446.908 188.951L487.6679999999999 154.455C514.179 132.014 499.99 88.766 465.4929999999999 86.208L412.242 82.257A3.9930000000000003 3.9930000000000003 0 0 1 408.653 77.3149999999999L421.351 25.451C429.592 -8.207 392.7679999999999 -34.97 363.2969999999999 -16.729L317.8939999999999 11.3749999999999A3.9939999999999998 3.9939999999999998 0 0 1 312.0849999999999 9.4879999999999L291.8729999999999 -39.936C278.7139999999999 -72.114 233.1979999999999 -71.9290000000001 220.1159999999999 -39.936zM236.93 24.632L255.994 -21.984L275.058 24.631C285.366 49.831 315.836 59.697 338.95 45.39L381.772 18.883L369.796 67.802C363.321 94.246 382.176 120.141 409.283 122.151L459.509 125.877L421.065 158.413C400.283 176.004 400.318 208.034 421.066 225.593L459.508 258.129L409.283 261.856C382.132 263.871 363.333 289.8040000000001 369.795 316.2050000000001L381.773 365.124L338.95 338.617C315.799 324.29 285.347 334.217 275.058 359.377L255.994 405.992L236.93 359.375C226.625 334.177 196.152 324.3090000000001 173.039 338.615L130.216 365.123L142.193 316.2050000000001C148.667 289.759 129.812 263.867 102.705 261.855L52.481 258.129L90.924 225.592C111.706 208.004 111.671 175.973 90.924 158.414L52.48 125.877L102.706 122.151C129.857 120.137 148.656 94.204 142.193 67.802L130.216 18.883L173.039 45.39C196.227 59.7450000000001 226.661 49.742 236.93 24.6320000000001zM256 64C185.42 64 128 121.421 128 192C128 262.58 185.42 320 256 320C326.579 320 384 262.58 384 192C384 121.421 326.579 64 256 64zM256 272C211.888 272 176 236.112 176 192S211.888 112 256 112S336 147.888 336 192S300.112 272 256 272z" /> + <glyph glyph-name="thumbs-down" + unicode="" + horiz-adv-x="512" d=" M466.27 222.69C470.944 245.337 467.134 267.228 457.28 285.68C460.238 309.548 453.259 334.245 439.94 352.67C438.986 408.577 404.117 448 327 448C320 448 312 447.99 304.78 447.99C201.195 447.99 168.997 408 128 408H117.155C111.515 412.975 104.113 416 96 416H32C14.327 416 0 401.673 0 384V144C0 126.327 14.327 112 32 112H96C107.842 112 118.175 118.438 123.708 128H130.76C149.906 111.047 176.773 67.347 199.52 44.6C213.187 30.9330000000001 209.673 -64 271.28 -64C328.86 -64 366.55 -32.064 366.55 40.73C366.55 59.14 362.62 74.46 357.7 87.27H394.18C442.782 87.27 479.9999999999999 128.835 479.9999999999999 172.85C479.9999999999999 192 475.04 207.84 466.2699999999999 222.69zM64 152C50.745 152 40 162.745 40 176S50.745 200 64 200S88 189.255 88 176S77.255 152 64 152zM394.18 135.27H290.19C290.19 97.45 318.55 79.9 318.55 40.73C318.55 16.98 318.55 -16.0000000000001 271.2800000000001 -16.0000000000001C252.3700000000001 2.91 261.8200000000001 50.18 233.4600000000001 78.54C206.9 105.11 167.28 176 138.92 176H128V362.17C181.611 362.17 228.001 399.99 299.64 399.99H337.46C372.972 399.99 398.28 382.87 390.58 334.0900000000001C405.78 325.93 417.08 297.65 404.52 276.52C426.101 256.136 423.219 225.455 409.73 210.9C419.18 210.9 432.09 191.99 432 173.09C431.91 154.18 415.29 135.2700000000001 394.18 135.2700000000001z" /> + <glyph glyph-name="thumbs-up" + unicode="" + horiz-adv-x="512" d=" M466.27 161.31C475.04 176.16 480 192 480 211.15C480 255.165 442.782 296.73 394.18 296.73H357.7C362.62 309.54 366.55 324.86 366.55 343.27C366.55 416.064 328.86 448 271.28 448C209.673 448 213.187 353.067 199.52 339.4C176.773 316.653 149.905 272.953 130.76 256H32C14.327 256 0 241.673 0 224V-16C0 -33.673 14.327 -48 32 -48H96C110.893 -48 123.408 -37.826 126.978 -24.05C171.487 -25.051 202.038 -63.99 304.78 -63.99C312 -63.99 320 -64 327 -64C404.117 -64 438.986 -24.577 439.94 31.33C453.259 49.755 460.239 74.452 457.28 98.32C467.134 116.772 470.944 138.663 466.27 161.31zM404.52 107.48C417.08 86.35 405.78 58.0700000000001 390.58 49.91C398.28 1.13 372.972 -15.99 337.46 -15.99H299.64C228.001 -15.99 181.611 21.83 128 21.83V208H138.92C167.28 208 206.9 278.89 233.46 305.46C261.82 333.82 252.37 381.09 271.28 400C318.55 400 318.55 367.02 318.55 343.27C318.55 304.1 290.19 286.55 290.19 248.73H394.18C415.29 248.73 431.91 229.82 432 210.91C432.0899999999999 192.01 419.18 173.1 409.73 173.1C423.219 158.545 426.101 127.864 404.52 107.48zM88 16C88 2.745 77.255 -8 64 -8S40 2.745 40 16S50.745 40 64 40S88 29.255 88 16z" /> + <glyph glyph-name="times-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119 440 8 329 8 192S119 -56 256 -56S504 55 504 192S393 440 256 440zM256 -8C145.5 -8 56 81.5 56 192S145.5 392 256 392S456 302.5 456 192S366.5 -8 256 -8zM357.8 254.2L295.6 192L357.8 129.8C362.5 125.1 362.5 117.5 357.8 112.8L335.2 90.2C330.5 85.5 322.9 85.5 318.2 90.2L256 152.4L193.8 90.2C189.1 85.5 181.5 85.5 176.8 90.2L154.2 112.8C149.5 117.5 149.5 125.1 154.2 129.8L216.4 192L154.2000000000001 254.2C149.5000000000001 258.9 149.5000000000001 266.5 154.2000000000001 271.2L176.8000000000001 293.8C181.5 298.5 189.1000000000001 298.5 193.8000000000001 293.8L256.0000000000001 231.6L318.2000000000001 293.8C322.9000000000001 298.5 330.5000000000001 298.5 335.2000000000001 293.8L357.8000000000001 271.2C362.5000000000001 266.5 362.5000000000001 258.9 357.8000000000001 254.2z" /> + <glyph glyph-name="trash-alt" + unicode="" + horiz-adv-x="448" d=" M192 260V44C192 37.373 186.627 32 180 32H156C149.373 32 144 37.373 144 44V260C144 266.627 149.373 272 156 272H180C186.627 272 192 266.627 192 260zM292 272H268C261.373 272 256 266.627 256 260V44C256 37.373 261.373 32 268 32H292C298.627 32 304 37.373 304 44V260C304 266.627 298.627 272 292 272zM424 368C437.255 368 448 357.255 448 344V332C448 325.373 442.627 320 436 320H416V-16C416 -42.51 394.51 -64 368 -64H80C53.49 -64 32 -42.51 32 -16V320H12C5.373 320 0 325.373 0 332V344C0 357.255 10.745 368 24 368H98.411L132.429 424.6960000000001A48 48 0 0 0 173.589 448H274.412A48 48 0 0 0 315.572 424.6960000000001L349.589 368H424zM154.389 368H293.612L276.1600000000001 397.087A6 6 0 0 1 271.015 400H176.987A6 6 0 0 1 171.842 397.087L154.389 368zM368 320H80V-10A6 6 0 0 1 86 -16H362A6 6 0 0 1 368 -10V320z" /> + <glyph glyph-name="user-circle" + unicode="" + horiz-adv-x="512" d=" M256 440C119.033 440 8 328.967 8 192S119.033 -56 256 -56S504 55.033 504 192S392.967 440 256 440zM256 392C366.457 392 456 302.457 456 192C456 155.018 445.951 120.389 428.452 90.672C421.38 116.1160000000001 402.789 144.88 364.522 156.0460000000001C377.207 176.218 384 199.586 384 224C384 294.689 326.811 352 256 352C185.311 352 128 294.81 128 224C128 199.586 134.793 176.217 147.478 156.046C109.179 144.871 90.602 116.133 83.54 90.684C66.046 120.399 56 155.024 56 192C56 302.457 145.543 392 256 392zM336 224C336 179.817 300.183 144 256 144S176 179.817 176 224S211.817 304 256 304S336 268.183 336 224zM128 38.331V66.089C128 86.499 141.53 104.437 161.156 110.044L185.632 117.037C206.342 103.352 230.605 96 256 96S305.658 103.352 326.3690000000001 117.038L350.8450000000001 110.045C370.4700000000001 104.437 384 86.5 384 66.089V38.331C349.315 9.408 304.693 -8 256 -8S162.685 9.408 128 38.331z" /> + <glyph glyph-name="user" + unicode="" + horiz-adv-x="512" d=" M423.3090000000001 156.975L402.221 163C431.798 204.11 436 245.706 436 268C436 367.351 355.484 448 256 448C156.649 448 76 367.484 76 268C76 245.701 80.198 204.116 109.779 163L88.691 156.975C21.28 137.715 0 76.41 0 39.395V13.714C0 -29.138 34.862 -64 77.714 -64H434.2850000000001C477.138 -64 512 -29.138 512 13.714V39.395C512 75.642 491.275 137.556 423.309 156.975zM256 400C328.902 400 388 340.901 388 268S328.902 136 256 136S124 195.099 124 268S183.098 400 256 400zM464 13.714C464 -2.696 450.696 -16 434.286 -16H77.714C61.304 -16 48 -2.696 48 13.714V39.395C48 72.562 69.987 101.711 101.878 110.822L147.981 123.994C162.683 112.942 200.427 88 256 88S349.317 112.942 364.019 123.994L410.122 110.822C442.013 101.71 464 72.562 464 39.395V13.714z" /> + <glyph glyph-name="window-close" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM464 22C464 18.7 461.3 16 458 16H54C50.7 16 48 18.7 48 22V362C48 365.3 50.7 368 54 368H458C461.3 368 464 365.3 464 362V22zM356.5 253.4L295.1 192L356.5 130.6C361.1 126 361.1 118.5 356.5 113.8L334.2 91.5C329.6 86.9 322.1 86.9 317.4 91.5L256 152.9L194.6 91.5C190 86.9 182.5 86.9 177.8 91.5L155.5 113.8C150.9 118.4 150.9 125.9 155.5 130.6L216.9 192L155.5 253.4000000000001C150.9 258 150.9 265.5 155.5 270.2000000000001L177.8 292.5000000000001C182.4 297.1 189.9 297.1 194.6 292.5000000000001L256 231.1000000000001L317.4 292.5000000000001C322 297.1 329.5 297.1 334.2 292.5000000000001L356.5 270.2000000000001C361.2 265.6 361.2 258.1 356.5 253.4000000000001z" /> + <glyph glyph-name="window-maximize" + unicode="" + horiz-adv-x="512" d=" M464 416H48C21.5 416 0 394.5 0 368V16C0 -10.5 21.5 -32 48 -32H464C490.5 -32 512 -10.5 512 16V368C512 394.5 490.5 416 464 416zM464 22C464 18.7 461.3 16 458 16H54C50.7 16 48 18.7 48 22V256H464V22z" /> + <glyph glyph-name="window-minimize" + unicode="" + horiz-adv-x="512" d=" M480 -32H32C14.3 -32 0 -17.7 0 0S14.3 32 32 32H480C497.7 32 512 17.7 512 0S497.7 -32 480 -32z" /> + <glyph glyph-name="window-restore" + unicode="" + horiz-adv-x="512" d=" M464 448H144C117.5 448 96 426.5 96 400V352H48C21.5 352 0 330.5 0 304V-16C0 -42.5 21.5 -64 48 -64H368C394.5 -64 416 -42.5 416 -16V32H464C490.5 32 512 53.5 512 80V400C512 426.5 490.5 448 464 448zM368 -16H48V192H368V-16zM464 80H416V304C416 330.5 394.5 352 368 352H144V400H464V80z" /> + </font> +</defs> +</svg> diff --git a/.next/static/media/outline-icons.ddae9b1ba9b0b42f58809904b0b21349.woff b/.next/static/media/outline-icons.ddae9b1ba9b0b42f58809904b0b21349.woff new file mode 100644 index 0000000..bcd8343 Binary files /dev/null and b/.next/static/media/outline-icons.ddae9b1ba9b0b42f58809904b0b21349.woff differ diff --git a/.next/static/webpack/152323df90fe7912a92f.hot-update.json b/.next/static/webpack/152323df90fe7912a92f.hot-update.json new file mode 100644 index 0000000..ee3982d --- /dev/null +++ b/.next/static/webpack/152323df90fe7912a92f.hot-update.json @@ -0,0 +1 @@ +{"h":"9c0748785ca82c3ec273","c":{"pages/index":true}} \ No newline at end of file diff --git a/.next/static/webpack/38fabf2f06cd27e6292b.hot-update.json b/.next/static/webpack/38fabf2f06cd27e6292b.hot-update.json new file mode 100644 index 0000000..ab7decd --- /dev/null +++ b/.next/static/webpack/38fabf2f06cd27e6292b.hot-update.json @@ -0,0 +1 @@ +{"h":"d861a2a25ad74136204d","c":{}} \ No newline at end of file diff --git a/.next/static/webpack/3d8eaa1187182ab82d23.hot-update.json b/.next/static/webpack/3d8eaa1187182ab82d23.hot-update.json new file mode 100644 index 0000000..44e0fff --- /dev/null +++ b/.next/static/webpack/3d8eaa1187182ab82d23.hot-update.json @@ -0,0 +1 @@ +{"h":"9040d10b0317f0cf8a58","c":{"pages/index":true}} \ No newline at end of file diff --git a/.next/static/webpack/88835ee91bbc0921ba37.hot-update.json b/.next/static/webpack/88835ee91bbc0921ba37.hot-update.json new file mode 100644 index 0000000..6543152 --- /dev/null +++ b/.next/static/webpack/88835ee91bbc0921ba37.hot-update.json @@ -0,0 +1 @@ +{"h":"3d8eaa1187182ab82d23","c":{"pages/index":true}} \ No newline at end of file diff --git a/.next/static/webpack/9c0748785ca82c3ec273.hot-update.json b/.next/static/webpack/9c0748785ca82c3ec273.hot-update.json new file mode 100644 index 0000000..97ce67f --- /dev/null +++ b/.next/static/webpack/9c0748785ca82c3ec273.hot-update.json @@ -0,0 +1 @@ +{"h":"88835ee91bbc0921ba37","c":{"pages/index":true}} \ No newline at end of file diff --git a/.next/static/webpack/d861a2a25ad74136204d.hot-update.json b/.next/static/webpack/d861a2a25ad74136204d.hot-update.json new file mode 100644 index 0000000..813e043 --- /dev/null +++ b/.next/static/webpack/d861a2a25ad74136204d.hot-update.json @@ -0,0 +1 @@ +{"h":"152323df90fe7912a92f","c":{"pages/index":true}} \ No newline at end of file diff --git a/.next/static/webpack/pages/index.152323df90fe7912a92f.hot-update.js b/.next/static/webpack/pages/index.152323df90fe7912a92f.hot-update.js new file mode 100644 index 0000000..9212810 --- /dev/null +++ b/.next/static/webpack/pages/index.152323df90fe7912a92f.hot-update.js @@ -0,0 +1,293 @@ +webpackHotUpdate_N_E("pages/index",{ + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: __N_SSG, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__N_SSG", function() { return __N_SSG; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-react */ "./node_modules/semantic-ui-react/dist/es/index.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ethers */ "./node_modules/ethers/lib.esm/index.js"); + + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx", + _s = $RefreshSig$(); + + + + + + + +function Home(_ref) { + _s(); + + var contractAddress = _ref.contractAddress; + + var _useState = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(''), + value = _useState[0], + setValue = _useState[1]; + + var _useState2 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + touched = _useState2[0], + setTouched = _useState2[1]; + + var _useState3 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + isValid = _useState3[0], + setIsValid = _useState3[1]; + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_5__["verifyEthAddress"])(value)); + }, [value]); + + var onSubmit = /*#__PURE__*/function () { + var _ref2 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(e) { + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + _context.next = 3; + return requestFunds(); + + case 3: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function onSubmit(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + var getContractBalance = /*#__PURE__*/function () { + var _ref3 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() { + var provider, contractBalance; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context2.next = 6; + break; + } + + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + _context2.next = 4; + return provider.getBalance(contractAddress); + + case 4: + contractBalance = _context2.sent; + console.log('Balance:', contractBalance.toString()); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function getContractBalance() { + return _ref3.apply(this, arguments); + }; + }(); + + var requestFunds = /*#__PURE__*/function () { + var _ref4 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() { + var provider, contract; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context3.next = 14; + break; + } + + _context3.next = 3; + return window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + case 3: + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + contract = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__.abi, provider); + _context3.prev = 5; + _context3.next = 8; + return contract.withdraw(value); + + case 8: + console.log('Successfully withdrawed funds'); + _context3.next = 14; + break; + + case 11: + _context3.prev = 11; + _context3.t0 = _context3["catch"](5); + console.log('Error: ', _context3.t0); + + case 14: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[5, 11]]); + })); + + return function requestFunds() { + return _ref4.apply(this, arguments); + }; + }(); + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (window.ethereum !== undefined) { + getContractBalance(); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Container"], { + children: /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 70, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Input"], { + type: "text", + value: value, + onChange: function onChange(e) { + return setValue(e.target.value); + } + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 71, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 77, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 66, + columnNumber: 5 + }, this); +} + +_s(Home, "BWdEuhKgG5J3Fe5cFcG5+vMRDlA="); + +_c = Home; +var __N_SSG = true; +/* harmony default export */ __webpack_exports__["default"] = (Home); + +var _c; + +$RefreshReg$(_c, "Home"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }) + +}) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL3BhZ2VzL2luZGV4LnRzeCJdLCJuYW1lcyI6WyJIb21lIiwiY29udHJhY3RBZGRyZXNzIiwidXNlU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidG91Y2hlZCIsInNldFRvdWNoZWQiLCJpc1ZhbGlkIiwic2V0SXNWYWxpZCIsInVzZUVmZmVjdCIsInZlcmlmeUV0aEFkZHJlc3MiLCJvblN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlcXVlc3RGdW5kcyIsImdldENvbnRyYWN0QmFsYW5jZSIsIndpbmRvdyIsImV0aGVyZXVtIiwicHJvdmlkZXIiLCJldGhlcnMiLCJwcm92aWRlcnMiLCJXZWIzUHJvdmlkZXIiLCJnZXRCYWxhbmNlIiwiY29udHJhY3RCYWxhbmNlIiwiY29uc29sZSIsImxvZyIsInRvU3RyaW5nIiwicmVxdWVzdCIsIm1ldGhvZCIsImNvbnRyYWN0IiwiQ29udHJhY3QiLCJGYXVjZXQiLCJhYmkiLCJ3aXRoZHJhdyIsInVuZGVmaW5lZCIsInRhcmdldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUUEsU0FBU0EsSUFBVCxPQUEyRDtBQUFBOztBQUFBLE1BQTNDQyxlQUEyQyxRQUEzQ0EsZUFBMkM7O0FBQUEsa0JBQy9CQyxzREFBUSxDQUFDLEVBQUQsQ0FEdUI7QUFBQSxNQUNsREMsS0FEa0Q7QUFBQSxNQUMzQ0MsUUFEMkM7O0FBQUEsbUJBRTNCRixzREFBUSxDQUFDLEtBQUQsQ0FGbUI7QUFBQSxNQUVsREcsT0FGa0Q7QUFBQSxNQUV6Q0MsVUFGeUM7O0FBQUEsbUJBRzNCSixzREFBUSxDQUFVLEtBQVYsQ0FIbUI7QUFBQSxNQUdsREssT0FIa0Q7QUFBQSxNQUd6Q0MsVUFIeUM7O0FBS3pEQyx5REFBUyxDQUFDLFlBQU07QUFDZCxRQUFJTixLQUFKLEVBQVc7QUFDVEcsZ0JBQVUsQ0FBQyxJQUFELENB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QWY7QUFBQTtBQUhaO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBRkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBRkYsZUFVRSxxRUFBQyx3REFBRDtBQUFRLGVBQU8sTUFBZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQVZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURGO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFERjtBQWdCRDs7R0FwRVFILEk7O0tBQUFBLEk7O0FBOEVNQSxtRUFBZiIsImZpbGUiOiJzdGF0aWMvd2VicGFjay9wYWdlcy9pbmRleC4xNTIzMjNkZjkwZmU3OTEyYTkyZi5ob3QtdXBkYXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUV2ZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBCdXR0b24sIENvbnRhaW5lciwgRm9ybSwgSW5wdXQgfSBmcm9tICdzZW1hbnRpYy11aS1yZWFjdCc7XHJcbmltcG9ydCB7IHZlcmlmeUV0aEFkZHJlc3MgfSBmcm9tICcuLi91dGlsJztcclxuaW1wb3J0IEZhdWNldCBmcm9tICcuLi9hcnRpZmFjdHMvY29udHJhY3RzL0ZhdWNldC5zb2wvRmF1Y2V0Lmpzb24nO1xyXG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xyXG5cclxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcclxuXHJcbnR5cGUgUHJvcHMgPSB7XHJcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBIb21lKHsgY29udHJhY3RBZGRyZXNzIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcclxuICBjb25zdCBbdG91Y2hlZCwgc2V0VG91Y2hlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzVmFsaWQsIHNldElzVmFsaWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHNldFRvdWNoZWQodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SXNWYWxpZCh2ZXJpZnlFdGhBZGRyZXNzKHZhbHVlKSk7XHJcbiAgfSwgW3ZhbHVlXSk7XHJcblxyXG4gIGNvbnN0IG9uU3VibWl0ID0gYXN5bmMgKGU6IEZvcm1FdmVudDxIVE1MRm9ybUVsZW1lbnQ+KSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBhd2FpdCByZXF1ZXN0RnVuZHMoKTtcclxuICB9O1xyXG5cclxuICBjb25zdCBnZXRDb250cmFjdEJhbGFuY2UgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5ldGhlcmV1bSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZXRoZXJzLnByb3ZpZGVycy5XZWIzUHJvdmlkZXIod2luZG93LmV0aGVyZXVtKTtcclxuICAgICAgY29uc3QgY29udHJhY3RCYWxhbmNlID0gYXdhaXQgcHJvdmlkZXIuZ2V0QmFsYW5jZShjb250cmFjdEFkZHJlc3MpO1xyXG4gICAgICBjb25zb2xlLmxvZygnQmFsYW5jZTonLCBjb250cmFjdEJhbGFuY2UudG9TdHJpbmcoKSk7XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgcmVxdWVzdEZ1bmRzID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZXRoZXJldW0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGF3YWl0IHdpbmRvdy5ldGhlcmV1bS5yZXF1ZXN0KHtcclxuICAgICAgICBtZXRob2Q6ICdldGhfcmVxdWVzdEFjY291bnRzJyxcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGV0aGVycy5wcm92aWRlcnMuV2ViM1Byb3ZpZGVyKHdpbmRvdy5ldGhlcmV1bSk7XHJcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV3IGV0aGVycy5Db250cmFjdChcclxuICAgICAgICBjb250cmFjdEFkZHJlc3MsXHJcbiAgICAgICAgRmF1Y2V0LmFiaSxcclxuICAgICAgICBwcm92aWRlclxyXG4gICAgICApO1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IGNvbnRyYWN0LndpdGhkcmF3KHZhbHVlKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnU3VjY2Vzc2Z1bGx5IHdpdGhkcmF3ZWQgZnVuZHMnKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yOiAnLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh3aW5kb3cuZXRoZXJldW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBnZXRDb250cmFjdEJhbGFuY2UoKTtcclxuICAgIH1cclxuICB9LCBbXSk7XHJcblxyXG4gIHJldHVybiAoXHJcbiAgICA8Q29udGFpbmVyPlxyXG4gICAgICA8Rm9ybSBvblN1Ym1pdD17b25TdWJtaXR9PlxyXG4gICAgICAgIDxoMT5Sb3BzdGVuIEZhdWNldDwvaDE+XHJcbiAgICAgICAgPEZvcm0uRmllbGQgZXJyb3I9e3RvdWNoZWQgJiYgIWlzVmFsaWR9PlxyXG4gICAgICAgICAgPGxhYmVsPllvdXIgUm9wc3RlbiB3YWxsZXQgYWRkcmVzczwvbGFiZWw+XHJcbiAgICAgICAgICA8SW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICB2YWx1ZT17dmFsdWV9XHJcbiAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0VmFsdWUoZS50YXJnZXQudmFsdWUpfVxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L0Zvcm0uRmllbGQ+XHJcbiAgICAgICAgPEJ1dHRvbiBwcmltYXJ5PlJlcXVlc3QgRXRoZXI8L0J1dHRvbj5cclxuICAgICAgPC9Gb3JtPlxyXG4gICAgPC9Db250YWluZXI+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YXRpY1Byb3BzKCkge1xyXG4gIHJldHVybiB7XHJcbiAgICBwcm9wczoge1xyXG4gICAgICBjb250cmFjdEFkZHJlc3M6IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0NPTlRSQUNUX0FERFJFU1MsXHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhvbWU7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/static/webpack/pages/index.3d8eaa1187182ab82d23.hot-update.js b/.next/static/webpack/pages/index.3d8eaa1187182ab82d23.hot-update.js new file mode 100644 index 0000000..cd81e62 --- /dev/null +++ b/.next/static/webpack/pages/index.3d8eaa1187182ab82d23.hot-update.js @@ -0,0 +1,307 @@ +webpackHotUpdate_N_E("pages/index",{ + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: __N_SSG, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__N_SSG", function() { return __N_SSG; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-react */ "./node_modules/semantic-ui-react/dist/es/index.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ethers */ "./node_modules/ethers/lib.esm/index.js"); + + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx", + _s = $RefreshSig$(); + + + + + + + +function Home(_ref) { + _s(); + + var contractAddress = _ref.contractAddress; + + var _useState = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(''), + value = _useState[0], + setValue = _useState[1]; + + var _useState2 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + touched = _useState2[0], + setTouched = _useState2[1]; + + var _useState3 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + isValid = _useState3[0], + setIsValid = _useState3[1]; + + var _useState4 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(), + contractBalance = _useState4[0], + setContractBalance = _useState4[1]; + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_5__["verifyEthAddress"])(value)); + }, [value]); + + var onSubmit = /*#__PURE__*/function () { + var _ref2 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(e) { + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + _context.next = 3; + return requestFunds(); + + case 3: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function onSubmit(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + var getContractBalance = /*#__PURE__*/function () { + var _ref3 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() { + var provider, _contractBalance; + + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context2.next = 6; + break; + } + + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + _context2.next = 4; + return provider.getBalance(contractAddress); + + case 4: + _contractBalance = _context2.sent; + return _context2.abrupt("return", _contractBalance.toString()); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function getContractBalance() { + return _ref3.apply(this, arguments); + }; + }(); + + var requestFunds = /*#__PURE__*/function () { + var _ref4 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() { + var provider, signer, contract; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context3.next = 15; + break; + } + + _context3.next = 3; + return window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + case 3: + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + signer = provider.getSigner(); + contract = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__.abi, signer); + _context3.prev = 6; + _context3.next = 9; + return contract.withdraw(value); + + case 9: + console.log('Successfully withdrawed funds'); + _context3.next = 15; + break; + + case 12: + _context3.prev = 12; + _context3.t0 = _context3["catch"](6); + console.log('Error: ', _context3.t0); + + case 15: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[6, 12]]); + })); + + return function requestFunds() { + return _ref4.apply(this, arguments); + }; + }(); + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (window.ethereum !== undefined) { + getContractBalance().then(function (bal) { + return setContractBalance(bal); + }); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Container"], { + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 66, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Input"], { + type: "text", + value: value, + onChange: function onChange(e) { + return setValue(e.target.value); + } + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 75, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 65, + columnNumber: 7 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("span", { + children: ["Contract balance - ", parseInt(contractBalance || '') / Math.pow(10, 18), ' ', "ether"] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 77, + columnNumber: 7 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 64, + columnNumber: 5 + }, this); +} + +_s(Home, "53Cp6xGjVjyEKBL1leGmK5rryVw="); + +_c = Home; +var __N_SSG = true; +/* harmony default export */ __webpack_exports__["default"] = (Home); + +var _c; + +$RefreshReg$(_c, "Home"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }) + +}) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL3BhZ2VzL2luZGV4LnRzeCJdLCJuYW1lcyI6WyJIb21lIiwiY29udHJhY3RBZGRyZXNzIiwidXNlU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidG91Y2hlZCIsInNldFRvdWNoZWQiLCJpc1ZhbGlkIiwic2V0SXNWYWxpZCIsImNvbnRyYWN0QmFsYW5jZSIsInNldENvbnRyYWN0QmFsYW5jZSIsInVzZUVmZmVjdCIsInZlcmlmeUV0aEFkZHJlc3MiLCJvblN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlcXVlc3RGdW5kcyIsImdldENvbnRyYWN0QmFsYW5jZSIsIndpbmRvdyIsImV0aGVyZXVtIiwicHJvdmlkZXIiLCJldGhlcnMiLCJwcm92aWRlcnMiLCJXZWIzUHJvdmlkZXIiLCJnZXRCYWxhbmNlIiwidG9TdHJpbmciLCJyZXF1ZXN0IiwibWV0aG9kIiwic2lnbmVyIiwiZ2V0U2lnbmVyIiwiY29udHJhY3QiLCJDb250cmFjdCIsIkZhdWNldCIsImFiaSIsIndpdGhkcmF3IiwiY29uc29sZSIsImxvZyIsInVuZGVmaW5lZCIsInRoZW4iLCJiYWwiLCJ0YXJnZXQiLCJwYXJzZUludCIsIk1hdGgiLCJwb3ciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVFBLFNBQVNBLElBQVQsT0FBMkQ7QUFBQTs7QUFBQSxNQUEzQ0MsZUFBMkMsUUFBM0NBLGVBQTJDOztBQUFBLGtCQUMvQkMsc0RBQVEsQ0FBQyxFQUFELENBRHVCO0FBQUEsTUFDbERDLEtBRGtEO0FBQUEsTUFDM0NDLFFBRDJDOztBQUFBLG1CQUUzQkYsc0RBQVEsQ0FBQyxLQUFELENBRm1CO0FBQUEsTUFFbERHLE9BRmtEO0FBQUEsTUFFekNDLFVBRnlDOztBQUFBLG1CQUczQkosc0RBQVEsQ0FBVSxLQUFWLENBSG1CO0FBQUEsTUFHbERLLE9BSGtEO0FBQUEsTUFH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RCxDQUFNLEtBQU47QUFBWSxhQUFLLEVBQUVSLE9BQU8sSUFBSSxDQUFDRSxPQUEvQjtBQUFBLGdDQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQURGLGVBRUUscUVBQUMsdURBQUQ7QUFDRSxjQUFJLEVBQUMsTUFEUDtBQUVFLGVBQUssRUFBRUosS0FGVDtBQUdFLGtCQUFRLEVBQUUsa0JBQUNXLENBQUQ7QUFBQSxtQkFBT1YsUUFBUSxDQUFDVSxDQUFDLENBQUMwQixNQUFGLENBQVNyQyxLQUFWLENBQWY7QUFBQTtBQUhaO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBRkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBRkYsZUFVRSxxRUFBQyx3REFBRDtBQUFRLGVBQU8sTUFBZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQVZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQURGLGVBYUU7QUFBQSx3Q0FDc0JzQyxRQUFRLENBQUNoQyxlQUFlLElBQUksRUFBcEIsQ0FBUixHQUFrQ2lDLElBQUksQ0FBQ0MsR0FBTCxDQUFTLEVBQVQsRUFBYSxFQUFiLENBRHhELEVBQzBFLEdBRDFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQWJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQURGO0FBb0JEOztHQXRFUTNDLEk7O0tBQUFBLEk7O0FBZ0ZNQSxtRUFBZiIsImZpbGUiOiJzdGF0aWMvd2VicGFjay9wYWdlcy9pbmRleC4zZDhlYWExMTg3MTgyYWI4MmQyMy5ob3QtdXBkYXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUV2ZW50LCB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgeyBCdXR0b24sIENvbnRhaW5lciwgRm9ybSwgSW5wdXQgfSBmcm9tICdzZW1hbnRpYy11aS1yZWFjdCc7XHJcbmltcG9ydCB7IHZlcmlmeUV0aEFkZHJlc3MgfSBmcm9tICcuLi91dGlsJztcclxuaW1wb3J0IEZhdWNldCBmcm9tICcuLi9hcnRpZmFjdHMvY29udHJhY3RzL0ZhdWNldC5zb2wvRmF1Y2V0Lmpzb24nO1xyXG5pbXBvcnQgeyBldGhlcnMgfSBmcm9tICdldGhlcnMnO1xyXG5cclxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IGFueTtcclxuXHJcbnR5cGUgUHJvcHMgPSB7XHJcbiAgY29udHJhY3RBZGRyZXNzOiBzdHJpbmc7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBIb21lKHsgY29udHJhY3RBZGRyZXNzIH06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcclxuICBjb25zdCBbdmFsdWUsIHNldFZhbHVlXSA9IHVzZVN0YXRlKCcnKTtcclxuICBjb25zdCBbdG91Y2hlZCwgc2V0VG91Y2hlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XHJcbiAgY29uc3QgW2lzVmFsaWQsIHNldElzVmFsaWRdID0gdXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIGNvbnN0IFtjb250cmFjdEJhbGFuY2UsIHNldENvbnRyYWN0QmFsYW5jZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KCk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgc2V0VG91Y2hlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJc1ZhbGlkKHZlcmlmeUV0aEFkZHJlc3ModmFsdWUpKTtcclxuICB9LCBbdmFsdWVdKTtcclxuXHJcbiAgY29uc3Qgb25TdWJtaXQgPSBhc3luYyAoZTogRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGF3YWl0IHJlcXVlc3RGdW5kcygpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGdldENvbnRyYWN0QmFsYW5jZSA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmV0aGVyZXVtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBldGhlcnMucHJvdmlkZXJzLldlYjNQcm92aWRlcih3aW5kb3cuZXRoZXJldW0pO1xyXG4gICAgICBjb25zdCBjb250cmFjdEJhbGFuY2UgPSBhd2FpdCBwcm92aWRlci5nZXRCYWxhbmNlKGNvbnRyYWN0QWRkcmVzcyk7XHJcbiAgICAgIHJldHVybiBjb250cmFjdEJhbGFuY2UudG9TdHJpbmcoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCByZXF1ZXN0RnVuZHMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5ldGhlcmV1bSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgYXdhaXQgd2luZG93LmV0aGVyZXVtLnJlcXVlc3Qoe1xyXG4gICAgICAgIG1ldGhvZDogJ2V0aF9yZXF1ZXN0QWNjb3VudHMnLFxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZXRoZXJzLnByb3ZpZGVycy5XZWIzUHJvdmlkZXIod2luZG93LmV0aGVyZXVtKTtcclxuICAgICAgY29uc3Qgc2lnbmVyID0gcHJvdmlkZXIuZ2V0U2lnbmVyKCk7XHJcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV3IGV0aGVycy5Db250cmFjdChjb250cmFjdEFkZHJlc3MsIEZhdWNldC5hYmksIHNpZ25lcik7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgY29udHJhY3Qud2l0aGRyYXcodmFsdWUpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgd2l0aGRyYXdlZCBmdW5kcycpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnRXJyb3I6ICcsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHdpbmRvdy5ldGhlcmV1bSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGdldENvbnRyYWN0QmFsYW5jZSgpLnRoZW4oKGJhbCkgPT4gc2V0Q29udHJhY3RCYWxhbmNlKGJhbCkpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxDb250YWluZXI+XHJcbiAgICAgIDxGb3JtIG9uU3VibWl0PXtvblN1Ym1pdH0+XHJcbiAgICAgICAgPGgxPlJvcHN0ZW4gRmF1Y2V0PC9oMT5cclxuICAgICAgICA8Rm9ybS5GaWVsZCBlcnJvcj17dG91Y2hlZCAmJiAhaXNWYWxpZH0+XHJcbiAgICAgICAgICA8bGFiZWw+WW91ciBSb3BzdGVuIHdhbGxldCBhZGRyZXNzPC9sYWJlbD5cclxuICAgICAgICAgIDxJbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cclxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvRm9ybS5GaWVsZD5cclxuICAgICAgICA8QnV0dG9uIHByaW1hcnk+UmVxdWVzdCBFdGhlcjwvQnV0dG9uPlxyXG4gICAgICA8L0Zvcm0+XHJcbiAgICAgIDxzcGFuPlxyXG4gICAgICAgIENvbnRyYWN0IGJhbGFuY2UgLSB7cGFyc2VJbnQoY29udHJhY3RCYWxhbmNlIHx8ICcnKSAvIE1hdGgucG93KDEwLCAxOCl9eycgJ31cclxuICAgICAgICBldGhlclxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L0NvbnRhaW5lcj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3RhdGljUHJvcHMoKSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGNvbnRyYWN0QWRkcmVzczogcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQ09OVFJBQ1RfQUREUkVTUyxcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSG9tZTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.next/static/webpack/pages/index.88835ee91bbc0921ba37.hot-update.js b/.next/static/webpack/pages/index.88835ee91bbc0921ba37.hot-update.js new file mode 100644 index 0000000..813a2be --- /dev/null +++ b/.next/static/webpack/pages/index.88835ee91bbc0921ba37.hot-update.js @@ -0,0 +1,307 @@ +webpackHotUpdate_N_E("pages/index",{ + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: __N_SSG, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__N_SSG", function() { return __N_SSG; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-react */ "./node_modules/semantic-ui-react/dist/es/index.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ethers */ "./node_modules/ethers/lib.esm/index.js"); + + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx", + _s = $RefreshSig$(); + + + + + + + +function Home(_ref) { + _s(); + + var contractAddress = _ref.contractAddress; + + var _useState = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(''), + value = _useState[0], + setValue = _useState[1]; + + var _useState2 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + touched = _useState2[0], + setTouched = _useState2[1]; + + var _useState3 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + isValid = _useState3[0], + setIsValid = _useState3[1]; + + var _useState4 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(), + contractBalance = _useState4[0], + setContractBalance = _useState4[1]; + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_5__["verifyEthAddress"])(value)); + }, [value]); + + var onSubmit = /*#__PURE__*/function () { + var _ref2 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(e) { + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + _context.next = 3; + return requestFunds(); + + case 3: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function onSubmit(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + var getContractBalance = /*#__PURE__*/function () { + var _ref3 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() { + var provider, _contractBalance; + + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context2.next = 6; + break; + } + + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + _context2.next = 4; + return provider.getBalance(contractAddress); + + case 4: + _contractBalance = _context2.sent; + return _context2.abrupt("return", _contractBalance.toString()); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function getContractBalance() { + return _ref3.apply(this, arguments); + }; + }(); + + var requestFunds = /*#__PURE__*/function () { + var _ref4 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() { + var provider, signer, contract; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context3.next = 15; + break; + } + + _context3.next = 3; + return window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + case 3: + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + signer = provider.getSigner(); + contract = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__.abi, signer); + _context3.prev = 6; + _context3.next = 9; + return contract.withdraw(value); + + case 9: + console.log('Successfully withdrawed funds'); + _context3.next = 15; + break; + + case 12: + _context3.prev = 12; + _context3.t0 = _context3["catch"](6); + console.log('Error: ', _context3.t0); + + case 15: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[6, 12]]); + })); + + return function requestFunds() { + return _ref4.apply(this, arguments); + }; + }(); + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (window.ethereum !== undefined) { + getContractBalance().then(function (bal) { + return setContractBalance(bal); + }); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Container"], { + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 66, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Input"], { + type: "text", + value: value, + onChange: function onChange(e) { + return setValue(e.target.value); + } + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 75, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 65, + columnNumber: 7 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("span", { + children: ["Contract balance - ", contractBalance, " ether"] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 77, + columnNumber: 7 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 64, + columnNumber: 5 + }, this); +} + +_s(Home, "53Cp6xGjVjyEKBL1leGmK5rryVw="); + +_c = Home; +var __N_SSG = true; +/* harmony default export */ __webpack_exports__["default"] = (Home); + +var _c; + +$RefreshReg$(_c, "Home"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }) + +}) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL3BhZ2VzL2luZGV4LnRzeCJdLCJuYW1lcyI6WyJIb21lIiwiY29udHJhY3RBZGRyZXNzIiwidXNlU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidG91Y2hlZCIsInNldFRvdWNoZWQiLCJpc1ZhbGlkIiwic2V0SXNWYWxpZCIsImNvbnRyYWN0QmFsYW5jZSIsInNldENvbnRyYWN0QmFsYW5jZSIsInVzZUVmZmVjdCIsInZlcmlmeUV0aEFkZHJlc3MiLCJvblN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlcXVlc3RGdW5kcyIsImdldENvbnRyYWN0QmFsYW5jZSIsIndpbmRvdyIsImV0aGVyZXVtIiwicHJvdmlkZXIiLCJldGhlcnMiLCJwcm92aWRlcnMiLCJXZWIzUHJvdmlkZXIiLCJnZXRCYWxhbmNlIiwidG9TdHJpbmciLCJyZXF1ZXN0IiwibWV0aG9kIiwic2lnbmVyIiwiZ2V0U2lnbmVyIiwiY29udHJhY3QiLCJDb250cmFjdCIsIkZhdWNldCIsImFiaSIsIndpdGhkcmF3IiwiY29uc29sZSIsImxvZyIsInVuZGVmaW5lZCIsInRoZW4iLCJiYWwiLCJ0YXJnZXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQVFBLFNBQVNBLElBQVQsT0FBMkQ7QUFBQTs7QUFBQSxNQUEzQ0MsZUFBMkMsUUFBM0NBLGVBQTJDOztBQUFBLGtCQUMvQkMsc0RBQVEsQ0FBQyxFQUFELENBRHVCO0FBQUEsTUFDbERDLEtBRGtEO0FBQUEsTUFDM0NDLFFBRDJDOztBQUFBLG1CQUUzQkYsc0RBQVEsQ0FBQyxLQUFELENBRm1CO0FBQUEsTUFFbERHLE9BRmtEO0FBQUEsTUFFekNDLFVBRnlDOztBQUFBLG1CQUczQkosc0RBQVEsQ0FBVSxLQUFWLENBSG1CO0FBQUEsTUFHbERLLE9BSGtEO0FBQUEsTUFHekNDLFVBSHlDOztBQUFBLG1CQUlYTixzREFBUSxFQUpHO0FBQUEsTUFJbERPLGVBSmtEO0FBQUEsTUFJakNDLGtCQUppQzs7QUFNekRDLHlEQUFTLENBQUMsWUFBTTtBQUNkLFFBQUlSLEtBQUosRUFBVztBQUNURyxnQkFBVSxDQUFDLElBQUQsQ0FBVjtBQUNEOztBQUVERSxjQUFVLENBQUNJLDhEQUFnQixDQUFDVCxLQUFELENBQWpCLENBQVY7QUFDRCxHQU5RLEVBTU4sQ0FBQ0EsS0FBRCxDQU5NLENBQVQ7O0FBUUEsTUFBTVUsUUFBUTtBQUFBLHFTQUFHLGlCQUFPQyxDQUFQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDZkEsZUFBQyxDQUFDQyxjQUFGO0FBRGU7QUFBQSxxQkFFVEMsWUFBWSxFQUZIOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQUg7O0FBQUEsb0JBQVJILFFBQVE7QUFBQTtBQUFBO0FBQUEsS0FBZDs7QUFLQSxNQUFNSSxrQkFBa0I7QUFBQSxxU0FBRztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBQ3JCLE9BQU9DLE1BQU0sQ0FBQ0MsUUFBZCxLQUEyQixXQUROO0FBQUE7QUFBQTtBQUFBOztBQUVqQkMsc0JBRmlCLEdBRU4sSUFBSUMsNkNBQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsWUFBckIsQ0FBa0NMLE1BQU0sQ0FBQ0MsUUFBekMsQ0FGTTtBQUFBO0FBQUEscUJBR09DLFFBQVEsQ0FBQ0ksVUFBVCxDQUFvQnZCLGVBQXBCLENBSFA7O0FBQUE7QUFHakJRLDhCQUhpQjtBQUFBLGdEQUloQkEsZ0JBQWUsQ0FBQ2dCLFFBQWhCLEVBSmdCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQUg7O0FBQUEsb0JBQWxCUixrQkFBa0I7QUFBQTtBQUFBO0FBQUEsS0FBeEI7O0FBUUEsTUFBTUQsWUFBWTtBQUFBLHFTQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQUNmLE9BQU9FLE1BQU0sQ0FBQ0MsUUFBZCxLQUEyQixXQURaO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEscUJBRVhELE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQk8sT0FBaEIsQ0FBd0I7QUFDNUJDLHNCQUFNLEVBQUU7QUFEb0IsZUFBeEIsQ0FGVzs7QUFBQTtBQUtYUCxzQkFMVyxHQUtBLElBQUlDLDZDQUFNLENBQUNDLFNBQVAsQ0FBaUJDLFlBQXJCLENBQWtDTCxNQUFNLENBQUNDLFFBQXpDLENBTEE7QUFNWFMsb0JBTlcsR0FNRlIsUUFBUSxDQUFDUyxTQUFULEVBTkU7QUFPWEMsc0JBUFcsR0FPQSxJQUFJVCw2Q0FBTSxDQUFDVSxRQUFYLENBQW9COUIsZUFBcEIsRUFBcUMrQix3RUFBTSxDQUFDQyxHQUE1QyxFQUFpREwsTUFBakQsQ0FQQTtBQUFBO0FBQUE7QUFBQSxxQkFTVEUsUUFBUSxDQUFDSSxRQUFULENBQWtCL0IsS0FBbEIsQ0FUUzs7QUFBQTtBQVVmZ0MscUJBQU8sQ0FBQ0MsR0FBUixDQUFZLCtCQUFaO0FBVmU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZZkQscUJBQU8sQ0FBQ0MsR0FBUixDQUFZLFNBQVo7O0FBWmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBSDs7QUFBQSxvQkFBWnBCLFlBQVk7QUFBQTtBQUFBO0FBQUEsS0FBbEI7O0FBaUJBTCx5REFBUyxDQUFDLFlBQU07QUFDZCxRQUFJTyxNQUFNLENBQUNDLFFBQVAsS0FBb0JrQixTQUF4QixFQUFtQztBQUNqQ3BCLHdCQUFrQixHQUFHcUIsSUFBckIsQ0FBMEIsVUFBQ0MsR0FBRDtBQUFBLGVBQVM3QixrQkFBa0IsQ0FBQzZCLEdBQUQsQ0FBM0I7QUFBQSxPQUExQjtBQUNEO0FBQ0YsR0FKUSxFQUlOLEVBSk0sQ0FBVDtBQU1BLHNCQUNFLHFFQUFDLDJEQUFEO0FBQUEsNEJBQ0UscUVBQUMsc0RBQUQ7QUFBTSxjQUFRLEVBQUUxQixRQUFoQjtBQUFBLDhCQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBREYsZUFFRSxxRUFBQyxzREFBRCxDQUFNLEtBQU47QUFBWSxhQUFLLEVBQUVSLE9BQU8sSUFBSSxDQUFDRSxPQUEvQjtBQUFBLGdDQUNFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQURGLGVBRUUscUVBQUMsdURBQUQ7QUFDRSxjQUFJLEVBQUMsTUFEUDtBQUVFLGVBQUssRUFBRUosS0FGVDtBQUdFLGtCQUFRLEVBQUUsa0JBQUNXLENBQUQ7QUFBQSxtQkFBT1YsUUFBUSxDQUFDVSxDQUFDLENBQUMwQixNQUFGLENBQVNyQyxLQUFWLENBQWY7QUFBQTtBQUhaO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBRkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBRkYsZUFVRSxxRUFBQyx3REFBRDtBQUFRLGVBQU8sTUFBZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQVZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQURGLGVBYUU7QUFBQSx3Q0FBMEJNLGVBQTFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQWJGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQURGO0FBaUJEOztHQW5FUVQsSTs7S0FBQUEsSTs7QUE2RU1BLG1FQUFmIiwiZmlsZSI6InN0YXRpYy93ZWJwYWNrL3BhZ2VzL2luZGV4Ljg4ODM1ZWU5MWJiYzA5MjFiYTM3LmhvdC11cGRhdGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtRXZlbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEJ1dHRvbiwgQ29udGFpbmVyLCBGb3JtLCBJbnB1dCB9IGZyb20gJ3NlbWFudGljLXVpLXJlYWN0JztcclxuaW1wb3J0IHsgdmVyaWZ5RXRoQWRkcmVzcyB9IGZyb20gJy4uL3V0aWwnO1xyXG5pbXBvcnQgRmF1Y2V0IGZyb20gJy4uL2FydGlmYWN0cy9jb250cmFjdHMvRmF1Y2V0LnNvbC9GYXVjZXQuanNvbic7XHJcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xyXG5cclxudHlwZSBQcm9wcyA9IHtcclxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcclxufTtcclxuXHJcbmZ1bmN0aW9uIEhvbWUoeyBjb250cmFjdEFkZHJlc3MgfTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xyXG4gIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xyXG4gIGNvbnN0IFt0b3VjaGVkLCBzZXRUb3VjaGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNWYWxpZCwgc2V0SXNWYWxpZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XHJcbiAgY29uc3QgW2NvbnRyYWN0QmFsYW5jZSwgc2V0Q29udHJhY3RCYWxhbmNlXSA9IHVzZVN0YXRlPHN0cmluZz4oKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBzZXRUb3VjaGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzVmFsaWQodmVyaWZ5RXRoQWRkcmVzcyh2YWx1ZSkpO1xyXG4gIH0sIFt2YWx1ZV0pO1xyXG5cclxuICBjb25zdCBvblN1Ym1pdCA9IGFzeW5jIChlOiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgYXdhaXQgcmVxdWVzdEZ1bmRzKCk7XHJcbiAgfTtcclxuXHJcbiAgY29uc3QgZ2V0Q29udHJhY3RCYWxhbmNlID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuZXRoZXJldW0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gbmV3IGV0aGVycy5wcm92aWRlcnMuV2ViM1Byb3ZpZGVyKHdpbmRvdy5ldGhlcmV1bSk7XHJcbiAgICAgIGNvbnN0IGNvbnRyYWN0QmFsYW5jZSA9IGF3YWl0IHByb3ZpZGVyLmdldEJhbGFuY2UoY29udHJhY3RBZGRyZXNzKTtcclxuICAgICAgcmV0dXJuIGNvbnRyYWN0QmFsYW5jZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIGNvbnN0IHJlcXVlc3RGdW5kcyA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmV0aGVyZXVtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBhd2FpdCB3aW5kb3cuZXRoZXJldW0ucmVxdWVzdCh7XHJcbiAgICAgICAgbWV0aG9kOiAnZXRoX3JlcXVlc3RBY2NvdW50cycsXHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBldGhlcnMucHJvdmlkZXJzLldlYjNQcm92aWRlcih3aW5kb3cuZXRoZXJldW0pO1xyXG4gICAgICBjb25zdCBzaWduZXIgPSBwcm92aWRlci5nZXRTaWduZXIoKTtcclxuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXcgZXRoZXJzLkNvbnRyYWN0KGNvbnRyYWN0QWRkcmVzcywgRmF1Y2V0LmFiaSwgc2lnbmVyKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBjb250cmFjdC53aXRoZHJhdyh2YWx1ZSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3NmdWxseSB3aXRoZHJhd2VkIGZ1bmRzJyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvcjogJywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAod2luZG93LmV0aGVyZXVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZ2V0Q29udHJhY3RCYWxhbmNlKCkudGhlbigoYmFsKSA9PiBzZXRDb250cmFjdEJhbGFuY2UoYmFsKSk7XHJcbiAgICB9XHJcbiAgfSwgW10pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPENvbnRhaW5lcj5cclxuICAgICAgPEZvcm0gb25TdWJtaXQ9e29uU3VibWl0fT5cclxuICAgICAgICA8aDE+Um9wc3RlbiBGYXVjZXQ8L2gxPlxyXG4gICAgICAgIDxGb3JtLkZpZWxkIGVycm9yPXt0b3VjaGVkICYmICFpc1ZhbGlkfT5cclxuICAgICAgICAgIDxsYWJlbD5Zb3VyIFJvcHN0ZW4gd2FsbGV0IGFkZHJlc3M8L2xhYmVsPlxyXG4gICAgICAgICAgPElucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFZhbHVlKGUudGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9Gb3JtLkZpZWxkPlxyXG4gICAgICAgIDxCdXR0b24gcHJpbWFyeT5SZXF1ZXN0IEV0aGVyPC9CdXR0b24+XHJcbiAgICAgIDwvRm9ybT5cclxuICAgICAgPHNwYW4+Q29udHJhY3QgYmFsYW5jZSAtIHtjb250cmFjdEJhbGFuY2V9IGV0aGVyPC9zcGFuPlxyXG4gICAgPC9Db250YWluZXI+XHJcbiAgKTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN0YXRpY1Byb3BzKCkge1xyXG4gIHJldHVybiB7XHJcbiAgICBwcm9wczoge1xyXG4gICAgICBjb250cmFjdEFkZHJlc3M6IHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0NPTlRSQUNUX0FERFJFU1MsXHJcbiAgICB9LFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEhvbWU7XHJcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/.next/static/webpack/pages/index.9c0748785ca82c3ec273.hot-update.js b/.next/static/webpack/pages/index.9c0748785ca82c3ec273.hot-update.js new file mode 100644 index 0000000..183d32e --- /dev/null +++ b/.next/static/webpack/pages/index.9c0748785ca82c3ec273.hot-update.js @@ -0,0 +1,294 @@ +webpackHotUpdate_N_E("pages/index",{ + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: __N_SSG, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__N_SSG", function() { return __N_SSG; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-react */ "./node_modules/semantic-ui-react/dist/es/index.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ethers */ "./node_modules/ethers/lib.esm/index.js"); + + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx", + _s = $RefreshSig$(); + + + + + + + +function Home(_ref) { + _s(); + + var contractAddress = _ref.contractAddress; + + var _useState = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(''), + value = _useState[0], + setValue = _useState[1]; + + var _useState2 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + touched = _useState2[0], + setTouched = _useState2[1]; + + var _useState3 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + isValid = _useState3[0], + setIsValid = _useState3[1]; + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_5__["verifyEthAddress"])(value)); + }, [value]); + + var onSubmit = /*#__PURE__*/function () { + var _ref2 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(e) { + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + _context.next = 3; + return requestFunds(); + + case 3: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function onSubmit(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + var getContractBalance = /*#__PURE__*/function () { + var _ref3 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() { + var provider, contractBalance; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context2.next = 6; + break; + } + + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + _context2.next = 4; + return provider.getBalance(contractAddress); + + case 4: + contractBalance = _context2.sent; + console.log('Balance:', contractBalance.toString()); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function getContractBalance() { + return _ref3.apply(this, arguments); + }; + }(); + + var requestFunds = /*#__PURE__*/function () { + var _ref4 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() { + var provider, signer, contract; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context3.next = 15; + break; + } + + _context3.next = 3; + return window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + case 3: + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + signer = provider.getSigner(); + contract = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__.abi, signer); + _context3.prev = 6; + _context3.next = 9; + return contract.withdraw(value); + + case 9: + console.log('Successfully withdrawed funds'); + _context3.next = 15; + break; + + case 12: + _context3.prev = 12; + _context3.t0 = _context3["catch"](6); + console.log('Error: ', _context3.t0); + + case 15: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[6, 12]]); + })); + + return function requestFunds() { + return _ref4.apply(this, arguments); + }; + }(); + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (window.ethereum !== undefined) { + getContractBalance(); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Container"], { + children: /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 71, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Input"], { + type: "text", + value: value, + onChange: function onChange(e) { + return setValue(e.target.value); + } + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 72, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 70, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 78, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 5 + }, this); +} + +_s(Home, "BWdEuhKgG5J3Fe5cFcG5+vMRDlA="); + +_c = Home; +var __N_SSG = true; +/* harmony default export */ __webpack_exports__["default"] = (Home); + +var _c; + +$RefreshReg$(_c, "Home"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }) + +}) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL3BhZ2VzL2luZGV4LnRzeCJdLCJuYW1lcyI6WyJIb21lIiwiY29udHJhY3RBZGRyZXNzIiwidXNlU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidG91Y2hlZCIsInNldFRvdWNoZWQiLCJpc1ZhbGlkIiwic2V0SXNWYWxpZCIsInVzZUVmZmVjdCIsInZlcmlmeUV0aEFkZHJlc3MiLCJvblN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInJlcXVlc3RGdW5kcyIsImdldENvbnRyYWN0QmFsYW5jZSIsIndpbmRvdyIsImV0aGVyZXVtIiwicHJvdmlkZXIiLCJldGhlcnMiLCJwcm92aWRlcnMiLCJXZWIzUHJvdmlkZXIiLCJnZXRCYWxhbmNlIiwiY29udHJhY3RCYWxhbmNlIiwiY29uc29sZSIsImxvZyIsInRvU3RyaW5nIiwicmVxdWVzdCIsIm1ldGhvZCIsInNpZ25lciIsImdldFNpZ25lciIsImNvbnRyYWN0IiwiQ29udHJhY3QiLCJGYXVjZXQiLCJhYmkiLCJ3aXRoZHJhdyIsInVuZGVmaW5lZCIsInRhcmdldCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBUUEsU0FBU0EsSUFBVCxPQUEyRDtBQUFBOztBQUFBLE1BQTNDQyxlQUEyQyxRQUEzQ0EsZUFBMkM7O0FBQUEsa0JBQy9CQyxzREFBUSxDQUFDLEVBQUQsQ0FEdUI7QUFBQSxNQUNsREMsS0FEa0Q7QUFBQSxNQUMzQ0MsUUFEMkM7O0FBQUEsbUJBRTNCRixzREFBUSxDQUFDLEtBQUQsQ0FGbUI7QUFBQSxNQUVsREcsT0FGa0Q7QUFBQSxNQUV6Q0MsVUFGeUM7O0FBQUEsbUJBRzNCSixzREFBUSxDQUFVLEtBQVYsQ0FIbUI7QUFBQSxNQUdsREssT0FIa0Q7QUFBQSxNQUd6Q0MsVUFIeUM7O0FBS3pEQyx5REFBUyxDQUFDLFlBQU07QUFDZCxRQUFJTixLQUFKLEVBQVc7QUFDVEcsZ0JBQVUsQ0FBQyxJQUFELENBQVY7QUFDRDs7QUFFREUsY0FBVSxDQUFDRSw4REFBZ0IsQ0FBQ1AsS0FBRCxDQUFqQixDQUFWO0FBQ0QsR0FOUSxFQU1OLENBQUNBLEtBQUQsQ0FOTSxDQUFUOztBQVFBLE1BQU1RLFFBQVE7QUFBQSxxU0FBRyxpQkFBT0MsQ0FBUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2ZBLGVBQUMsQ0FBQ0MsY0FBRjtBQURlO0FBQUEscUJBRVRDLFlBQVksRUFGSDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUFIOztBQUFBLG9CQUFSSCxRQUFRO0FBQUE7QUFBQTtBQUFBLEtBQWQ7O0FBS0EsTUFBTUksa0JBQWtCO0FBQUEscVNBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBQ3JCLE9BQU9DLE1BQU0sQ0FBQ0MsUUFBZCxLQUEyQixXQUROO0FBQUE7QUFBQTtBQUFBOztBQUVqQkMsc0JBRmlCLEdBRU4sSUFBSUMsNkNBQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsWUFBckIsQ0FBa0NMLE1BQU0sQ0FBQ0MsUUFBekMsQ0FGTTtBQUFBO0FBQUEscUJBR09DLFFBQVEsQ0FBQ0ksVUFBVCxDQUFvQnJCLGVBQXBCLENBSFA7O0FBQUE7QUFHakJzQiw2QkFIaUI7QUFJdkJDLHFCQUFPLENBQUNDLEdBQVIsQ0FBWSxVQUFaLEVBQXdCRixlQUFlLENBQUNHLFFBQWhCLEVBQXhCOztBQUp1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUFIOztBQUFBLG9CQUFsQlgsa0JBQWtCO0FBQUE7QUFBQTtBQUFBLEtBQXhCOztBQVFBLE1BQU1ELFlBQVk7QUFBQSxxU0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFDZixPQUFPRSxNQUFNLENBQUNDLFFBQWQsS0FBMkIsV0FEWjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHFCQUVYRCxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JVLE9BQWhCLENBQXdCO0FBQzVCQyxzQkFBTSxFQUFFO0FBRG9CLGVBQXhCLENBRlc7O0FBQUE7QUFLWFYsc0JBTFcsR0FLQSxJQUFJQyw2Q0FBTSxDQUFDQyxTQUFQLENBQWlCQyxZQUFyQixDQUFrQ0wsTUFBTSxDQUFDQyxRQUF6QyxDQUxBO0FBTVhZLG9CQU5XLEdBTUZYLFFBQVEsQ0FBQ1ksU0FBVCxFQU5FO0FBT1hDLHNCQVBXLEdBT0EsSUFBSVosNkNBQU0sQ0FBQ2EsUUFBWCxDQUNmL0IsZUFEZSxFQUVmZ0Msd0VBQU0sQ0FBQ0MsR0FGUSxFQUdmTCxNQUhlLENBUEE7QUFBQTtBQUFBO0FBQUEscUJBYVRFLFFBQVEsQ0FBQ0ksUUFBVCxDQUFrQmhDLEtBQWxCLENBYlM7O0FBQUE7QUFjZnFCLHFCQUFPLENBQUNDLEdBQVIsQ0FBWSwrQkFBWjtBQWRlO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBZ0JmRCxxQkFBTyxDQUFDQyxHQUFSLENBQVksU0FBWjs7QUFoQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBSDs7QUFBQSxvQkFBWlgsWUFBWTtBQUFBO0FBQUE7QUFBQSxLQUFsQjs7QUFxQkFMLHlEQUFTLENBQUMsWUFBTTtBQUNkLFFBQUlPLE1BQU0sQ0FBQ0MsUUFBUCxLQUFvQm1CLFNBQXhCLEVBQW1DO0FBQ2pDckIsd0JBQWtCO0FBQ25CO0FBQ0YsR0FKUSxFQUlOLEVBSk0sQ0FBVDtBQU1BLHNCQUNFLHFFQUFDLDJEQUFEO0FBQUEsMkJBQ0UscUVBQUMsc0RBQUQ7QUFBTSxjQUFRLEVBQUVKLFFBQWhCO0FBQUEsOEJBQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FERixlQUVFLHFFQUFDLHNEQUFELENBQU0sS0FBTjtBQUFZLGFBQUssRUFBRU4sT0FBTyxJQUFJLENBQUNFLE9BQS9CO0FBQUEsZ0NBQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBREYsZUFFRSxxRUFBQyx1REFBRDtBQUNFLGNBQUksRUFBQyxNQURQO0FBRUUsZUFBSyxFQUFFSixLQUZUO0FBR0Usa0JBQVEsRUFBRSxrQkFBQ1MsQ0FBRDtBQUFBLG1CQUFPUixRQUFRLENBQUNRLENBQUMsQ0FBQ3lCLE1BQUYsQ0FBU2xDLEtBQVYsQ0FBZjtBQUFBO0FBSFo7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFGRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FGRixlQVVFLHFFQUFDLHdEQUFEO0FBQVEsZUFBTyxNQUFmO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBVkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREY7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQURGO0FBZ0JEOztHQXJFUUgsSTs7S0FBQUEsSTs7QUErRU1BLG1FQUFmIiwiZmlsZSI6InN0YXRpYy93ZWJwYWNrL3BhZ2VzL2luZGV4LjljMDc0ODc4NWNhODJjM2VjMjczLmhvdC11cGRhdGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb3JtRXZlbnQsIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCB7IEJ1dHRvbiwgQ29udGFpbmVyLCBGb3JtLCBJbnB1dCB9IGZyb20gJ3NlbWFudGljLXVpLXJlYWN0JztcclxuaW1wb3J0IHsgdmVyaWZ5RXRoQWRkcmVzcyB9IGZyb20gJy4uL3V0aWwnO1xyXG5pbXBvcnQgRmF1Y2V0IGZyb20gJy4uL2FydGlmYWN0cy9jb250cmFjdHMvRmF1Y2V0LnNvbC9GYXVjZXQuanNvbic7XHJcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XHJcblxyXG5kZWNsYXJlIGNvbnN0IHdpbmRvdzogYW55O1xyXG5cclxudHlwZSBQcm9wcyA9IHtcclxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZztcclxufTtcclxuXHJcbmZ1bmN0aW9uIEhvbWUoeyBjb250cmFjdEFkZHJlc3MgfTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xyXG4gIGNvbnN0IFt2YWx1ZSwgc2V0VmFsdWVdID0gdXNlU3RhdGUoJycpO1xyXG4gIGNvbnN0IFt0b3VjaGVkLCBzZXRUb3VjaGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcclxuICBjb25zdCBbaXNWYWxpZCwgc2V0SXNWYWxpZF0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgc2V0VG91Y2hlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJc1ZhbGlkKHZlcmlmeUV0aEFkZHJlc3ModmFsdWUpKTtcclxuICB9LCBbdmFsdWVdKTtcclxuXHJcbiAgY29uc3Qgb25TdWJtaXQgPSBhc3luYyAoZTogRm9ybUV2ZW50PEhUTUxGb3JtRWxlbWVudD4pID0+IHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIGF3YWl0IHJlcXVlc3RGdW5kcygpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGdldENvbnRyYWN0QmFsYW5jZSA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmV0aGVyZXVtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBldGhlcnMucHJvdmlkZXJzLldlYjNQcm92aWRlcih3aW5kb3cuZXRoZXJldW0pO1xyXG4gICAgICBjb25zdCBjb250cmFjdEJhbGFuY2UgPSBhd2FpdCBwcm92aWRlci5nZXRCYWxhbmNlKGNvbnRyYWN0QWRkcmVzcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdCYWxhbmNlOicsIGNvbnRyYWN0QmFsYW5jZS50b1N0cmluZygpKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCByZXF1ZXN0RnVuZHMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5ldGhlcmV1bSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgYXdhaXQgd2luZG93LmV0aGVyZXVtLnJlcXVlc3Qoe1xyXG4gICAgICAgIG1ldGhvZDogJ2V0aF9yZXF1ZXN0QWNjb3VudHMnLFxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZXRoZXJzLnByb3ZpZGVycy5XZWIzUHJvdmlkZXIod2luZG93LmV0aGVyZXVtKTtcclxuICAgICAgY29uc3Qgc2lnbmVyID0gcHJvdmlkZXIuZ2V0U2lnbmVyKCk7XHJcbiAgICAgIGNvbnN0IGNvbnRyYWN0ID0gbmV3IGV0aGVycy5Db250cmFjdChcclxuICAgICAgICBjb250cmFjdEFkZHJlc3MsXHJcbiAgICAgICAgRmF1Y2V0LmFiaSxcclxuICAgICAgICBzaWduZXJcclxuICAgICAgKTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCBjb250cmFjdC53aXRoZHJhdyh2YWx1ZSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3NmdWxseSB3aXRoZHJhd2VkIGZ1bmRzJyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvcjogJywgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIHVzZUVmZmVjdCgoKSA9PiB7XHJcbiAgICBpZiAod2luZG93LmV0aGVyZXVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZ2V0Q29udHJhY3RCYWxhbmNlKCk7XHJcbiAgICB9XHJcbiAgfSwgW10pO1xyXG5cclxuICByZXR1cm4gKFxyXG4gICAgPENvbnRhaW5lcj5cclxuICAgICAgPEZvcm0gb25TdWJtaXQ9e29uU3VibWl0fT5cclxuICAgICAgICA8aDE+Um9wc3RlbiBGYXVjZXQ8L2gxPlxyXG4gICAgICAgIDxGb3JtLkZpZWxkIGVycm9yPXt0b3VjaGVkICYmICFpc1ZhbGlkfT5cclxuICAgICAgICAgIDxsYWJlbD5Zb3VyIFJvcHN0ZW4gd2FsbGV0IGFkZHJlc3M8L2xhYmVsPlxyXG4gICAgICAgICAgPElucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfVxyXG4gICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFZhbHVlKGUudGFyZ2V0LnZhbHVlKX1cclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9Gb3JtLkZpZWxkPlxyXG4gICAgICAgIDxCdXR0b24gcHJpbWFyeT5SZXF1ZXN0IEV0aGVyPC9CdXR0b24+XHJcbiAgICAgIDwvRm9ybT5cclxuICAgIDwvQ29udGFpbmVyPlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTdGF0aWNQcm9wcygpIHtcclxuICByZXR1cm4ge1xyXG4gICAgcHJvcHM6IHtcclxuICAgICAgY29udHJhY3RBZGRyZXNzOiBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19DT05UUkFDVF9BRERSRVNTLFxyXG4gICAgfSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIb21lO1xyXG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/.next/static/webpack/pages/index.d861a2a25ad74136204d.hot-update.js b/.next/static/webpack/pages/index.d861a2a25ad74136204d.hot-update.js new file mode 100644 index 0000000..913585b --- /dev/null +++ b/.next/static/webpack/pages/index.d861a2a25ad74136204d.hot-update.js @@ -0,0 +1,292 @@ +webpackHotUpdate_N_E("pages/index",{ + +/***/ "./src/pages/index.tsx": +/*!*****************************!*\ + !*** ./src/pages/index.tsx ***! + \*****************************/ +/*! exports provided: __N_SSG, default */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* WEBPACK VAR INJECTION */(function(module) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "__N_SSG", function() { return __N_SSG; }); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ "./node_modules/react/jsx-dev-runtime.js"); +/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/regenerator */ "./node_modules/@babel/runtime/regenerator/index.js"); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ "./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react */ "./node_modules/react/index.js"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! semantic-ui-react */ "./node_modules/semantic-ui-react/dist/es/index.js"); +/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util */ "./src/util/index.ts"); +/* harmony import */ var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json"); +var _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../artifacts/contracts/Faucet.sol/Faucet.json */ "./src/artifacts/contracts/Faucet.sol/Faucet.json", 1); +/* harmony import */ var ethers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ethers */ "./node_modules/ethers/lib.esm/index.js"); + + + + +var _jsxFileName = "G:\\typescript-solidity-dev-starter-kit\\src\\pages\\index.tsx", + _s = $RefreshSig$(); + + + + + + + +function Home(_ref) { + _s(); + + var contractAddress = _ref.contractAddress; + + var _useState = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(''), + value = _useState[0], + setValue = _useState[1]; + + var _useState2 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + touched = _useState2[0], + setTouched = _useState2[1]; + + var _useState3 = Object(react__WEBPACK_IMPORTED_MODULE_3__["useState"])(false), + isValid = _useState3[0], + setIsValid = _useState3[1]; + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (value) { + setTouched(true); + } + + setIsValid(Object(_util__WEBPACK_IMPORTED_MODULE_5__["verifyEthAddress"])(value)); + }, [value]); + + var onSubmit = /*#__PURE__*/function () { + var _ref2 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee(e) { + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + e.preventDefault(); + alert(value); + + case 2: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + + return function onSubmit(_x) { + return _ref2.apply(this, arguments); + }; + }(); + + var getContractBalance = /*#__PURE__*/function () { + var _ref3 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee2() { + var provider, contractBalance; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context2.next = 6; + break; + } + + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + _context2.next = 4; + return provider.getBalance(contractAddress); + + case 4: + contractBalance = _context2.sent; + console.log('Balance:', contractBalance.toString()); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + + return function getContractBalance() { + return _ref3.apply(this, arguments); + }; + }(); + + var requestFunds = /*#__PURE__*/function () { + var _ref4 = Object(G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__["default"])( /*#__PURE__*/G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.mark(function _callee3() { + var provider, contract; + return G_typescript_solidity_dev_starter_kit_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(typeof window.ethereum !== 'undefined')) { + _context3.next = 14; + break; + } + + _context3.next = 3; + return window.ethereum.request({ + method: 'eth_requestAccounts' + }); + + case 3: + provider = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].providers.Web3Provider(window.ethereum); + contract = new ethers__WEBPACK_IMPORTED_MODULE_7__["ethers"].Contract(contractAddress, _artifacts_contracts_Faucet_sol_Faucet_json__WEBPACK_IMPORTED_MODULE_6__.abi, provider); + _context3.prev = 5; + _context3.next = 8; + return contract.withdraw(value); + + case 8: + console.log('Successfully withdrawed funds'); + _context3.next = 14; + break; + + case 11: + _context3.prev = 11; + _context3.t0 = _context3["catch"](5); + console.log('Error: ', _context3.t0); + + case 14: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[5, 11]]); + })); + + return function requestFunds() { + return _ref4.apply(this, arguments); + }; + }(); + + Object(react__WEBPACK_IMPORTED_MODULE_3__["useEffect"])(function () { + if (window.ethereum !== undefined) { + getContractBalance(); + } + }, []); + return /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Container"], { + children: /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"], { + onSubmit: onSubmit, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("h1", { + children: "Ropsten Faucet" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 68, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Form"].Field, { + error: touched && !isValid, + children: [/*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])("label", { + children: "Your Ropsten wallet address" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 70, + columnNumber: 11 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Input"], { + type: "text", + value: value, + onChange: function onChange(e) { + return setValue(e.target.value); + } + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 71, + columnNumber: 11 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 69, + columnNumber: 9 + }, this), /*#__PURE__*/Object(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__["jsxDEV"])(semantic_ui_react__WEBPACK_IMPORTED_MODULE_4__["Button"], { + primary: true, + children: "Request Ether" + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 77, + columnNumber: 9 + }, this)] + }, void 0, true, { + fileName: _jsxFileName, + lineNumber: 67, + columnNumber: 7 + }, this) + }, void 0, false, { + fileName: _jsxFileName, + lineNumber: 66, + columnNumber: 5 + }, this); +} + +_s(Home, "BWdEuhKgG5J3Fe5cFcG5+vMRDlA="); + +_c = Home; +var __N_SSG = true; +/* harmony default export */ __webpack_exports__["default"] = (Home); + +var _c; + +$RefreshReg$(_c, "Home"); + +; + var _a, _b; + // Legacy CSS implementations will `eval` browser code in a Node.js context + // to extract CSS. For backwards compatibility, we need to check we're in a + // browser context before continuing. + if (typeof self !== 'undefined' && + // AMP / No-JS mode does not inject these helpers: + '$RefreshHelpers$' in self) { + var currentExports = module.__proto__.exports; + var prevExports = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevExports) !== null && _b !== void 0 ? _b : null; + // This cannot happen in MainTemplate because the exports mismatch between + // templating and execution. + self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.i); + // A module can be accepted automatically based on its exports, e.g. when + // it is a Refresh Boundary. + if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) { + // Save the previous exports on update so we can compare the boundary + // signatures. + module.hot.dispose(function (data) { + data.prevExports = currentExports; + }); + // Unconditionally accept an update to this module, we'll check if it's + // still a Refresh Boundary later. + module.hot.accept(); + // This field is set when the previous version of this module was a + // Refresh Boundary, letting us know we need to check for invalidation or + // enqueue an update. + if (prevExports !== null) { + // A boundary can become ineligible if its exports are incompatible + // with the previous exports. + // + // For example, if you add/remove/change exports, we'll want to + // re-execute the importing modules, and force those components to + // re-render. Similarly, if you convert a class component to a + // function, we want to invalidate the boundary. + if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevExports, currentExports)) { + module.hot.invalidate(); + } + else { + self.$RefreshHelpers$.scheduleUpdate(); + } + } + } + else { + // Since we just executed the code for the module, it's possible that the + // new exports made it ineligible for being a boundary. + // We only care about the case when we were _previously_ a boundary, + // because we already accepted this update (accidental side effect). + var isNoLongerABoundary = prevExports !== null; + if (isNoLongerABoundary) { + module.hot.invalidate(); + } + } + } + +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../node_modules/next/dist/compiled/webpack/harmony-module.js */ "./node_modules/next/dist/compiled/webpack/harmony-module.js")(module))) + +/***/ }) + +}) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vc3JjL3BhZ2VzL2luZGV4LnRzeCJdLCJuYW1lcyI6WyJIb21lIiwiY29udHJhY3RBZGRyZXNzIiwidXNlU3RhdGUiLCJ2YWx1ZSIsInNldFZhbHVlIiwidG91Y2hlZCIsInNldFRvdWNoZWQiLCJpc1ZhbGlkIiwic2V0SXNWYWxpZCIsInVzZUVmZmVjdCIsInZlcmlmeUV0aEFkZHJlc3MiLCJvblN1Ym1pdCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsImFsZXJ0IiwiZ2V0Q29udHJhY3RCYWxhbmNlIiwid2luZG93IiwiZXRoZXJldW0iLCJwcm92aWRlciIsImV0aGVycyIsInByb3ZpZGVycyIsIldlYjNQcm92aWRlciIsImdldEJhbGFuY2UiLCJjb250cmFjdEJhbGFuY2UiLCJjb25zb2xlIiwibG9nIiwidG9TdHJpbmciLCJyZXF1ZXN0RnVuZHMiLCJyZXF1ZXN0IiwibWV0aG9kIiwiY29udHJhY3QiLCJDb250cmFjdCIsIkZhdWNldCIsImFiaSIsIndpdGhkcmF3IiwidW5kZWZpbmVkIiwidGFyZ2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFRQSxTQUFTQSxJQUFULE9BQTJEO0FBQUE7O0FBQUEsTUFBM0NDLGVBQTJDLFFBQTNDQSxlQUEyQzs7QUFBQSxrQkFDL0JDLHNEQUFRLENBQUMsRUFBRCxDQUR1QjtBQUFBLE1BQ2xEQyxLQURrRDtBQUFBLE1BQzNDQyxRQUQyQzs7QUFBQSxtQkFFM0JGLHNEQUFRLENBQUMsS0FBRCxDQUZtQjtBQUFBLE1BRWxERyxPQUZrRDtBQUFBLE1BRXpDQyxVQUZ5Qzs7QUFBQSxtQkFHM0JKLHNEQUFRLENBQVUsS0FBVixDQUhtQjtBQUFBLE1BR2xESyxPQUhrRDtBQUFBLE1BR3pDQyxVQUh5Qzs7QUFLekRDLHlEQUFTLENBQUMsWUFBTTtBQUNkLFFBQUlOLEtBQUosRUFBVztBQUNURyxnQkFBVSxDQUFD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akMsS0FBVixDQUFmO0FBQUE7QUFIWjtBQUFBO0FBQUE7QUFBQTtBQUFBLGdCQUZGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUZGLGVBVUUscUVBQUMsd0RBQUQ7QUFBUSxlQUFPLE1BQWY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FWRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFERjtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBREY7QUFnQkQ7O0dBcEVRSCxJOztLQUFBQSxJOztBQThFTUEsbUVBQWYiLCJmaWxlIjoic3RhdGljL3dlYnBhY2svcGFnZXMvaW5kZXguZDg2MWEyYTI1YWQ3NDEzNjIwNGQuaG90LXVwZGF0ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1FdmVudCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgQnV0dG9uLCBDb250YWluZXIsIEZvcm0sIElucHV0IH0gZnJvbSAnc2VtYW50aWMtdWktcmVhY3QnO1xyXG5pbXBvcnQgeyB2ZXJpZnlFdGhBZGRyZXNzIH0gZnJvbSAnLi4vdXRpbCc7XHJcbmltcG9ydCBGYXVjZXQgZnJvbSAnLi4vYXJ0aWZhY3RzL2NvbnRyYWN0cy9GYXVjZXQuc29sL0ZhdWNldC5qc29uJztcclxuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcclxuXHJcbmRlY2xhcmUgY29uc3Qgd2luZG93OiBhbnk7XHJcblxyXG50eXBlIFByb3BzID0ge1xyXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gSG9tZSh7IGNvbnRyYWN0QWRkcmVzcyB9OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XHJcbiAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XHJcbiAgY29uc3QgW3RvdWNoZWQsIHNldFRvdWNoZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xyXG4gIGNvbnN0IFtpc1ZhbGlkLCBzZXRJc1ZhbGlkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcclxuXHJcbiAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBzZXRUb3VjaGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldElzVmFsaWQodmVyaWZ5RXRoQWRkcmVzcyh2YWx1ZSkpO1xyXG4gIH0sIFt2YWx1ZV0pO1xyXG5cclxuICBjb25zdCBvblN1Ym1pdCA9IGFzeW5jIChlOiBGb3JtRXZlbnQ8SFRNTEZvcm1FbGVtZW50PikgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgYWxlcnQodmFsdWUpO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0IGdldENvbnRyYWN0QmFsYW5jZSA9IGFzeW5jICgpID0+IHtcclxuICAgIGlmICh0eXBlb2Ygd2luZG93LmV0aGVyZXVtICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICBjb25zdCBwcm92aWRlciA9IG5ldyBldGhlcnMucHJvdmlkZXJzLldlYjNQcm92aWRlcih3aW5kb3cuZXRoZXJldW0pO1xyXG4gICAgICBjb25zdCBjb250cmFjdEJhbGFuY2UgPSBhd2FpdCBwcm92aWRlci5nZXRCYWxhbmNlKGNvbnRyYWN0QWRkcmVzcyk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdCYWxhbmNlOicsIGNvbnRyYWN0QmFsYW5jZS50b1N0cmluZygpKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICBjb25zdCByZXF1ZXN0RnVuZHMgPSBhc3luYyAoKSA9PiB7XHJcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5ldGhlcmV1bSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgYXdhaXQgd2luZG93LmV0aGVyZXVtLnJlcXVlc3Qoe1xyXG4gICAgICAgIG1ldGhvZDogJ2V0aF9yZXF1ZXN0QWNjb3VudHMnLFxyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgZXRoZXJzLnByb3ZpZGVycy5XZWIzUHJvdmlkZXIod2luZG93LmV0aGVyZXVtKTtcclxuICAgICAgY29uc3QgY29udHJhY3QgPSBuZXcgZXRoZXJzLkNvbnRyYWN0KFxyXG4gICAgICAgIGNvbnRyYWN0QWRkcmVzcyxcclxuICAgICAgICBGYXVjZXQuYWJpLFxyXG4gICAgICAgIHByb3ZpZGVyXHJcbiAgICAgICk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgY29udHJhY3Qud2l0aGRyYXcodmFsdWUpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdTdWNjZXNzZnVsbHkgd2l0aGRyYXdlZCBmdW5kcycpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnRXJyb3I6ICcsIGVycik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICB1c2VFZmZlY3QoKCkgPT4ge1xyXG4gICAgaWYgKHdpbmRvdy5ldGhlcmV1bSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGdldENvbnRyYWN0QmFsYW5jZSgpO1xyXG4gICAgfVxyXG4gIH0sIFtdKTtcclxuXHJcbiAgcmV0dXJuIChcclxuICAgIDxDb250YWluZXI+XHJcbiAgICAgIDxGb3JtIG9uU3VibWl0PXtvblN1Ym1pdH0+XHJcbiAgICAgICAgPGgxPlJvcHN0ZW4gRmF1Y2V0PC9oMT5cclxuICAgICAgICA8Rm9ybS5GaWVsZCBlcnJvcj17dG91Y2hlZCAmJiAhaXNWYWxpZH0+XHJcbiAgICAgICAgICA8bGFiZWw+WW91ciBSb3BzdGVuIHdhbGxldCBhZGRyZXNzPC9sYWJlbD5cclxuICAgICAgICAgIDxJbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIHZhbHVlPXt2YWx1ZX1cclxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRWYWx1ZShlLnRhcmdldC52YWx1ZSl9XHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvRm9ybS5GaWVsZD5cclxuICAgICAgICA8QnV0dG9uIHByaW1hcnk+UmVxdWVzdCBFdGhlcjwvQnV0dG9uPlxyXG4gICAgICA8L0Zvcm0+XHJcbiAgICA8L0NvbnRhaW5lcj5cclxuICApO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3RhdGljUHJvcHMoKSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHByb3BzOiB7XHJcbiAgICAgIGNvbnRyYWN0QWRkcmVzczogcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQ09OVFJBQ1RfQUREUkVTUyxcclxuICAgIH0sXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSG9tZTtcclxuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b25f7e4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "solidity.compileUsingRemoteVersion": "v0.7.6+commit.7338295f" +} \ No newline at end of file diff --git a/ADDRESS b/ADDRESS new file mode 100644 index 0000000..d83de82 --- /dev/null +++ b/ADDRESS @@ -0,0 +1 @@ +0xEccA7BF722455A94b9e759247aB86E2e1559c871 \ No newline at end of file diff --git a/contracts/Counter.sol b/contracts/Counter.sol deleted file mode 100644 index 68a0a89..0000000 --- a/contracts/Counter.sol +++ /dev/null @@ -1,35 +0,0 @@ -pragma solidity ^0.7.6; - -import "hardhat/console.sol"; - -contract Counter { - uint256 count = 0; - - event CountedTo(uint256 number); - - function getCount() public view returns (uint256) { - return count; - } - - function countUp() public returns (uint256) { - console.log("countUp: count =", count); - uint256 newCount = count + 1; - require(newCount > count, "Uint256 overflow"); - - count = newCount; - - emit CountedTo(count); - return count; - } - - function countDown() public returns (uint256) { - console.log("countDown: count =", count); - uint256 newCount = count - 1; - require(newCount < count, "Uint256 underflow"); - - count = newCount; - - emit CountedTo(count); - return count; - } -} diff --git a/contracts/Faucet.sol b/contracts/Faucet.sol new file mode 100644 index 0000000..ff0e39e --- /dev/null +++ b/contracts/Faucet.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: MIT + +pragma solidity ^0.7.6; + +import "hardhat/console.sol"; + +contract Faucet { + receive() external payable {} + + function withdraw (address payable recepient) public { + recepient.transfer(100000000000000000); + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index 6967adf..ef008b8 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,41 +1,44 @@ -import { config as dotEnvConfig } from "dotenv"; +import { config as dotEnvConfig } from 'dotenv'; dotEnvConfig(); -import { HardhatUserConfig } from "hardhat/types"; +import { HardhatUserConfig } from 'hardhat/types'; -import "@nomiclabs/hardhat-waffle"; -import "@typechain/hardhat"; -import "@nomiclabs/hardhat-etherscan"; +import '@nomiclabs/hardhat-waffle'; +import '@typechain/hardhat'; +import '@nomiclabs/hardhat-etherscan'; // TODO: reenable solidity-coverage when it works // import "solidity-coverage"; -const INFURA_API_KEY = process.env.INFURA_API_KEY || ""; -const RINKEBY_PRIVATE_KEY = - process.env.RINKEBY_PRIVATE_KEY! || - "0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3"; // well known private key -const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY; +const INFURA_API_KEY = process.env.INFURA_API_KEY || ''; +const ROPSTEN_PRIVATE_KEY = + process.env.ROPSTEN_PRIVATE_KEY! || + '0xc87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3'; // well known private key +// const ETHERSCAN_API_KEY = process.env.ETHERSCAN_API_KEY; const config: HardhatUserConfig = { - defaultNetwork: "hardhat", + defaultNetwork: 'hardhat', solidity: { - compilers: [{ version: "0.7.6", settings: {} }], + compilers: [{ version: '0.7.6', settings: {} }], + }, + paths: { + artifacts: './src/artifacts', }, networks: { hardhat: {}, localhost: {}, - rinkeby: { - url: `https://rinkeby.infura.io/v3/${INFURA_API_KEY}`, - accounts: [RINKEBY_PRIVATE_KEY], + ropsten: { + url: `https://ropsten.infura.io/v3/${INFURA_API_KEY}`, + accounts: [ROPSTEN_PRIVATE_KEY], }, coverage: { - url: "http://127.0.0.1:8555", // Coverage launches its own ganache-cli client + url: 'http://127.0.0.1:8555', // Coverage launches its own ganache-cli client }, }, - etherscan: { - // Your API key for Etherscan - // Obtain one at https://etherscan.io/ - apiKey: ETHERSCAN_API_KEY, - }, + // etherscan: { + // // Your API key for Etherscan + // // Obtain one at https://etherscan.io/ + // apiKey: ETHERSCAN_API_KEY, + // }, }; export default config; diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,2 @@ +/// <reference types="next" /> +/// <reference types="next/types/global" /> diff --git a/package-lock.json b/package-lock.json index 5b0de60..a47797f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,47 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/types": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", + "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, "@ensdomains/ens": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", @@ -603,6 +644,136 @@ "@ethersproject/strings": "^5.0.8" } }, + "@fluentui/react-component-event-listener": { + "version": "0.51.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-event-listener/-/react-component-event-listener-0.51.7.tgz", + "integrity": "sha512-NjVm+crN0T9A7vITL8alZeHnuV8zi2gos0nezU/2YOxaUAB9E4zKiPxt/6k5U50rJs/gj8Nu45iXxnjO41HbZg==", + "requires": { + "@babel/runtime": "^7.10.4" + } + }, + "@fluentui/react-component-ref": { + "version": "0.51.7", + "resolved": "https://registry.npmjs.org/@fluentui/react-component-ref/-/react-component-ref-0.51.7.tgz", + "integrity": "sha512-CX27jVJYaFoBCWpuWAizQZ2se137ku1dmDyn8sw+ySNJa+kkQf7LnMydiPW5K7cRdUSqUJW3eS4EjKRvVAx8xA==", + "requires": { + "@babel/runtime": "^7.10.4", + "react-is": "^16.6.3" + } + }, + "@hapi/accept": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.1.tgz", + "integrity": "sha512-fMr4d7zLzsAXo28PRRQPXR1o2Wmu+6z+VY1UzDp0iFo13Twj8WePakwXBiqn3E1aAlTpSNzCXdnnQXFhst8h8Q==", + "requires": { + "@hapi/boom": "9.x.x", + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/boom": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.2.tgz", + "integrity": "sha512-uJEJtiNHzKw80JpngDGBCGAmWjBtzxDCz17A9NO2zCi8LLBlb5Frpq4pXwyN+2JQMod4pKz5BALwyneCgDg89Q==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz", + "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==" + }, + "@next/env": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-10.1.3.tgz", + "integrity": "sha512-q7z7NvmRs66lCQmVJtKjDxVtMTjSwP6ExVzaH46pbTH60MHgzEJ9H4jXrFLTihPmCIvpAv6Ai04jbS8dcg1ZMQ==" + }, + "@next/polyfill-module": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-10.1.3.tgz", + "integrity": "sha512-1DtUVcuoBJAn5IrxIZQjUG1KTPkiXMYloykPSkRxawimgvG9dRj2kscU+4KGNSFxHoxW9c68VRCb+7MDz5aGGw==" + }, + "@next/react-dev-overlay": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-10.1.3.tgz", + "integrity": "sha512-vIgUah3bR9+MKzwU1Ni5ONfYM0VdI42i7jZ+Ei1c0wjwkG9anVnDqhSQ3mVg62GP2nt7ExaaFyf9THbsw5KYXg==", + "requires": { + "@babel/code-frame": "7.12.11", + "anser": "1.4.9", + "chalk": "4.0.0", + "classnames": "2.2.6", + "css.escape": "1.5.1", + "data-uri-to-buffer": "3.0.1", + "platform": "1.3.6", + "shell-quote": "1.7.2", + "source-map": "0.8.0-beta.0", + "stacktrace-parser": "0.1.10", + "strip-ansi": "6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "@next/react-refresh-utils": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-10.1.3.tgz", + "integrity": "sha512-P4GJZuLKfD/o42JvGZ/xP4Hxg68vd3NeZxOLqIuQKFjjaYgC2IrO+lE5PTwGmRkytjfprJC+9j7Jss/xQAS6QA==" + }, "@nomiclabs/ethereumjs-vm": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@nomiclabs/ethereumjs-vm/-/ethereumjs-vm-4.2.2.tgz", @@ -657,6 +828,24 @@ "@types/web3": "1.0.19" } }, + "@opentelemetry/api": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.14.0.tgz", + "integrity": "sha512-L7RMuZr5LzMmZiQSQDy9O1jo0q+DaLy6XpYJfIGfYSfoJA5qzYwUP3sP1uMIQ549DvxAgM3ng85EaPTM/hUHwQ==", + "requires": { + "@opentelemetry/context-base": "^0.14.0" + } + }, + "@opentelemetry/context-base": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.14.0.tgz", + "integrity": "sha512-sDOAZcYwynHFTbLo6n8kIbLiVF3a3BLkrmehJUyEbT9F+Smbi47kLGS2gG2g0fjBLR/Lr1InPD7kXL7FaTqEkw==" + }, + "@popperjs/core": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.2.tgz", + "integrity": "sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q==" + }, "@resolver-engine/core": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", @@ -746,6 +935,15 @@ } } }, + "@semantic-ui-react/event-stack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@semantic-ui-react/event-stack/-/event-stack-3.1.2.tgz", + "integrity": "sha512-Yd0Qf7lPCIjzJ9bZYfurlNu2RDXT6KKSyubHfYK3WjRauhxCsq6Fk2LMRI9DEvShoEU+AsLSv3NGkqXAcVp0zg==", + "requires": { + "exenv": "^1.2.2", + "prop-types": "^15.6.2" + } + }, "@sentry/core": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", @@ -857,12 +1055,14 @@ "@types/chai": { "version": "4.2.15", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.15.tgz", - "integrity": "sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ==" + "integrity": "sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ==", + "dev": true }, "@types/chai-as-promised": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz", "integrity": "sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg==", + "dev": true, "requires": { "@types/chai": "*" } @@ -891,8 +1091,7 @@ "@types/node": { "version": "14.14.32", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.32.tgz", - "integrity": "sha512-/Ctrftx/zp4m8JOujM5ZhwzlWLx22nbQJiVqz8/zE15gOeEW+uly3FSX4fGFpcfEvFzXcMCJwq9lGVWgyARXhg==", - "dev": true + "integrity": "sha512-/Ctrftx/zp4m8JOujM5ZhwzlWLx22nbQJiVqz8/zE15gOeEW+uly3FSX4fGFpcfEvFzXcMCJwq9lGVWgyARXhg==" }, "@types/node-fetch": { "version": "2.5.8", @@ -932,6 +1131,23 @@ "integrity": "sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ==", "dev": true }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/react": { + "version": "17.0.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.3.tgz", + "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, "@types/resolve": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", @@ -941,6 +1157,12 @@ "@types/node": "*" } }, + "@types/scheduler": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz", + "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==", + "dev": true + }, "@types/secp256k1": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.1.tgz", @@ -1048,6 +1270,11 @@ "uri-js": "^4.2.2" } }, + "anser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.9.tgz", + "integrity": "sha512-AI+BjTeGt2+WFk4eWcqbQ7snZpDBt8SaLlj0RT2h5xfdWaiy51OjYvqwMrNzJLGy8iOAL6nKDITWO+rd4MkYEA==" + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1073,7 +1300,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -1082,7 +1308,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -1112,6 +1337,11 @@ "typical": "^2.6.1" } }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=" + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1121,6 +1351,28 @@ "safer-buffer": "~2.1.0" } }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -1133,6 +1385,11 @@ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "ast-types": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", + "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + }, "async": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", @@ -1157,6 +1414,14 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "requires": { + "array-filter": "^1.0.0" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1169,6 +1434,11 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1187,8 +1457,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -1205,6 +1474,11 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, "bignumber.js": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", @@ -1214,8 +1488,7 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "blakejs": { "version": "1.1.0", @@ -1232,8 +1505,7 @@ "bn.js": { "version": "4.11.9", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" }, "brace-expansion": { "version": "1.1.11", @@ -1249,7 +1521,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -1257,8 +1528,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-stdout": { "version": "1.3.1", @@ -1270,7 +1540,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -1280,6 +1549,86 @@ "safe-buffer": "^5.0.1" } }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, "bs58": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", @@ -1325,20 +1674,22 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -1350,6 +1701,11 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "caniuse-lite": { + "version": "1.0.30001209", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001209.tgz", + "integrity": "sha512-2Ktt4OeRM7EM/JaOZjuLzPYAIqmbwQMNnYbgooT+icoRGrKOyAxA1xhlnotBD1KArRSPsuJp3TdYcZYrL7qNxA==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1393,7 +1749,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1419,7 +1774,6 @@ "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -1441,12 +1795,16 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -1458,6 +1816,11 @@ "wrap-ansi": "^2.0.0" } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -1468,7 +1831,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -1476,8 +1838,12 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" }, "combined-stream": { "version": "1.0.8", @@ -1511,12 +1877,42 @@ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, "cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", @@ -1532,14 +1928,21 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -1552,7 +1955,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -1589,6 +1991,103 @@ } } }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" + }, + "cssnano-preset-simple": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-simple/-/cssnano-preset-simple-1.2.2.tgz", + "integrity": "sha512-gtvrcRSGtP3hA/wS8mFVinFnQdEsEpm3v4I/s/KmNjpdWaThV/4E5EojAzFXxyT5OCSRPLlHR9iQexAqKHlhGQ==", + "requires": { + "caniuse-lite": "^1.0.30001179", + "postcss": "^7.0.32" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-simple": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssnano-simple/-/cssnano-simple-1.2.2.tgz", + "integrity": "sha512-4slyYc1w4JhSbhVX5xi9G0aQ42JnRyPg+7l7cqoNyoIDzfWx40Rq3JQZnoAWDu60A4AvKVp9ln/YSUOdhDX68g==", + "requires": { + "cssnano-preset-simple": "1.2.2", + "postcss": "^7.0.32" + }, + "dependencies": { + "postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "csstype": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.7.tgz", + "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -1598,6 +2097,11 @@ "assert-plus": "^1.0.0" } }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -1650,7 +2154,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" }, @@ -1658,8 +2161,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" } } }, @@ -1672,8 +2174,16 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } }, "diff": { "version": "3.5.0", @@ -1681,17 +2191,47 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "dom-walk": { + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dom-walk": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", "dev": true }, + "domain-browser": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.19.0.tgz", + "integrity": "sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ==" + }, "dotenv": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", - "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", - "dev": true + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotenv-defaults": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-2.0.1.tgz", + "integrity": "sha512-ugFCyBF7ILuwpmznduHPQZBMucHHJ8T4OBManTEVjemxCm2+nqifSuW2lD2SNKdiKSH1E324kZSdJ8M04b4I/A==", + "requires": { + "dotenv": "^8.2.0" + } + }, + "dotenv-webpack": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-7.0.2.tgz", + "integrity": "sha512-RY+/5uM/XY4bGtih9f9ic8hlrUDxVcZZBPWlnX/aHhaKxcVVX9SH/5VH7CSmvVo9GL6PKvQOA0X1bc552rnatQ==", + "requires": { + "dotenv-defaults": "^2.0.1" + } }, "ecc-jsbn": { "version": "0.1.2", @@ -1703,11 +2243,15 @@ "safer-buffer": "^2.1.0" } }, + "electron-to-chromium": { + "version": "1.3.717", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz", + "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==" + }, "elliptic": { "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -1724,6 +2268,29 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "encoding-down": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-5.0.4.tgz", @@ -1803,7 +2370,6 @@ "version": "1.18.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", @@ -1826,8 +2392,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" } } }, @@ -1835,18 +2400,26 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "esprima": { "version": "4.0.1", @@ -1854,6 +2427,16 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, "eth-ens-namehash": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", @@ -2257,16 +2840,25 @@ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2304,11 +2896,20 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, "find-replace": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", @@ -2379,6 +2980,11 @@ "is-callable": "^1.1.3" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2423,14 +3029,12 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -11328,13 +11932,20 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" } }, + "get-orientation": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-orientation/-/get-orientation-1.1.2.tgz", + "integrity": "sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ==", + "requires": { + "stream-parser": "^0.3.1" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -11362,11 +11973,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -11380,8 +11995,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growl": { "version": "1.10.5", @@ -11559,7 +12173,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -11567,26 +12180,22 @@ "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -11597,7 +12206,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -11606,14 +12214,12 @@ "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -11630,7 +12236,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -11650,6 +12255,11 @@ "sshpk": "^1.7.0" } }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -11664,7 +12274,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -11681,8 +12290,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "immediate": { "version": "3.3.0", @@ -11709,8 +12317,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "invert-kv": { "version": "1.0.0", @@ -11727,6 +12334,14 @@ "fp-ts": "^1.0.0" } }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -11736,14 +12351,12 @@ "is-bigint": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", - "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", - "dev": true + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -11752,7 +12365,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", - "dev": true, "requires": { "call-bind": "^1.0.0" } @@ -11766,8 +12378,7 @@ "is-callable": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", - "dev": true + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-ci": { "version": "2.0.0", @@ -11790,8 +12401,7 @@ "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-docker": { "version": "2.1.1", @@ -11802,8 +12412,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -11820,11 +12429,15 @@ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", "dev": true }, + "is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==" + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -11835,29 +12448,34 @@ "integrity": "sha1-fY035q135dEnFIkTxXPggtd39VQ=", "dev": true }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", - "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", - "dev": true + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" }, "is-regex": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-symbols": "^1.0.1" @@ -11866,18 +12484,28 @@ "is-string": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, "requires": { "has-symbols": "^1.0.1" } }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -11917,18 +12545,68 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "jest-worker": { + "version": "27.0.0-next.5", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.0.0-next.5.tgz", + "integrity": "sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, "js-sha3": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", "integrity": "sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc=", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", @@ -11963,6 +12641,14 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -11994,6 +12680,11 @@ "node-gyp-build": "^4.2.0" } }, + "keyboard-key": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keyboard-key/-/keyboard-key-1.1.0.tgz", + "integrity": "sha512-qkBzPTi3rlAKvX7k0/ub44sqOfXeLc/jcnGGmj5c7BJpU8eDrEVPyhCvNYAaoubbsLm9uGWwQJO1ytQK1a9/dQ==" + }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", @@ -12276,6 +12967,22 @@ } } }, + "line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=", + "requires": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -12289,6 +12996,16 @@ "strip-bom": "^2.0.0" } }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -12310,8 +13027,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "lodash.assign": { "version": "4.2.0", @@ -12319,6 +13040,11 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, "log-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", @@ -12328,6 +13054,14 @@ "chalk": "^2.4.2" } }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12349,6 +13083,14 @@ "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", "dev": true }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -12359,7 +13101,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -12403,6 +13144,11 @@ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "merkle-patricia-tree": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-3.0.0.tgz", @@ -12506,7 +13252,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -12545,14 +13290,12 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", @@ -12566,8 +13309,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "mkdirp": { "version": "0.5.5", @@ -12882,6 +13624,95 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "nanoid": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz", + "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==" + }, + "native-url": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/native-url/-/native-url-0.3.4.tgz", + "integrity": "sha512-6iM8R99ze45ivyH8vybJ7X0yekIcPf5GgLV5K0ENCbmRcaRIDoj37BC8iLEmaaBfqqb8enuZ5p0uhY+lVAbAcA==", + "requires": { + "querystring": "^0.2.0" + } + }, + "next": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/next/-/next-10.1.3.tgz", + "integrity": "sha512-8Jf38F+s0YcXXkJGF5iUxOqSmbHrey0fX5Epc43L0uwDKmN2jK9vhc2ihCwXC1pmu8d2m/8wfTiXRJKGti55yw==", + "requires": { + "@babel/runtime": "7.12.5", + "@hapi/accept": "5.0.1", + "@next/env": "10.1.3", + "@next/polyfill-module": "10.1.3", + "@next/react-dev-overlay": "10.1.3", + "@next/react-refresh-utils": "10.1.3", + "@opentelemetry/api": "0.14.0", + "assert": "2.0.0", + "ast-types": "0.13.2", + "browserify-zlib": "0.2.0", + "browserslist": "4.16.1", + "buffer": "5.6.0", + "caniuse-lite": "^1.0.30001179", + "chalk": "2.4.2", + "chokidar": "3.5.1", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "cssnano-simple": "1.2.2", + "domain-browser": "4.19.0", + "encoding": "0.1.13", + "etag": "1.8.1", + "find-cache-dir": "3.3.1", + "get-orientation": "1.1.2", + "https-browserify": "1.0.0", + "jest-worker": "27.0.0-next.5", + "native-url": "0.3.4", + "node-fetch": "2.6.1", + "node-html-parser": "1.4.9", + "node-libs-browser": "^2.2.1", + "os-browserify": "0.3.0", + "p-limit": "3.1.0", + "path-browserify": "1.0.1", + "pnp-webpack-plugin": "1.6.4", + "postcss": "8.1.7", + "process": "0.11.10", + "prop-types": "15.7.2", + "querystring-es3": "0.2.1", + "raw-body": "2.4.1", + "react-is": "16.13.1", + "react-refresh": "0.8.3", + "stream-browserify": "3.0.0", + "stream-http": "3.1.1", + "string_decoder": "1.3.0", + "styled-jsx": "3.3.2", + "timers-browserify": "2.0.12", + "tty-browserify": "0.0.1", + "use-subscription": "1.5.1", + "util": "0.12.3", + "vm-browserify": "1.1.2", + "watchpack": "2.1.1" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + } + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -12915,8 +13746,7 @@ "node-fetch": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-gyp-build": { "version": "4.2.3", @@ -12924,6 +13754,180 @@ "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==", "dev": true }, + "node-html-parser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-1.4.9.tgz", + "integrity": "sha512-UVcirFD1Bn0O+TSmloHeHqZZCxHjvtIeGdVdGMhyZ8/PWlEiZaZ5iJzR189yKZr8p0FXN58BUeC7RHRkf/KYGw==", + "requires": { + "he": "1.2.0" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + } + } + }, + "node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + }, "nofilter": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", @@ -12953,8 +13957,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "number-is-nan": { "version": "1.0.1", @@ -12989,14 +13992,21 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-inspect": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } }, "object-keys": { "version": "0.4.0", @@ -13008,7 +14018,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -13019,8 +14028,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" } } }, @@ -13060,6 +14068,11 @@ "is-wsl": "^2.1.1" } }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -13099,6 +14112,23 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, "parse-headers": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", @@ -13146,8 +14176,7 @@ "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "path-exists": { "version": "2.1.0", @@ -13197,7 +14226,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13215,8 +14243,7 @@ "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "pify": { "version": "2.3.0", @@ -13239,6 +14266,90 @@ "pinkie": "^2.0.0" } }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + } + } + }, + "platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "postcss": { + "version": "8.1.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.1.7.tgz", + "integrity": "sha512-llCQW1Pz4MOPwbZLmOddGM9eIJ8Bh7SZ2Oj5sxZva77uVaotYDsYTch1WBTNu7fUY0fpWp0fdt7uW40D4sRiiQ==", + "requires": { + "colorette": "^1.2.1", + "line-column": "^1.0.2", + "nanoid": "^3.1.16", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "postinstall-postinstall": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", @@ -13254,14 +14365,22 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } }, "prr": { "version": "1.0.1", @@ -13275,11 +14394,23 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, "punycode": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" }, "qs": { "version": "6.5.2", @@ -13301,23 +14432,34 @@ "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, "raw-body": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, "requires": { "bytes": "3.1.0", "http-errors": "1.7.3", @@ -13325,6 +14467,49 @@ "unpipe": "1.0.0" } }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-popper": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", + "integrity": "sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw==", + "requires": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + } + }, + "react-refresh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.8.3.tgz", + "integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg==" + }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", @@ -13350,7 +14535,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13361,11 +14545,15 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, "requires": { "picomatch": "^2.2.1" } }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -13435,7 +14623,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -13459,14 +14646,21 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } }, "scrypt-js": { "version": "3.0.1", @@ -13485,6 +14679,34 @@ "node-gyp-build": "^4.2.0" } }, + "semantic-ui-css": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz", + "integrity": "sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg==", + "requires": { + "jquery": "x.*" + } + }, + "semantic-ui-react": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-2.0.3.tgz", + "integrity": "sha512-a0hGN6XXw64sRSKwWqMCKSI/AGLohxNeWuErS39eswvBbUnLjBij8ZoEdiqDiz/PuWpwYIRjgmQVrut+7h3b2g==", + "requires": { + "@babel/runtime": "^7.10.5", + "@fluentui/react-component-event-listener": "~0.51.6", + "@fluentui/react-component-ref": "~0.51.6", + "@popperjs/core": "^2.6.0", + "@semantic-ui-react/event-stack": "^3.1.2", + "clsx": "^1.1.1", + "keyboard-key": "^1.1.0", + "lodash": "^4.17.19", + "lodash-es": "^4.17.15", + "prop-types": "^15.7.2", + "react-is": "^16.8.6 || ^17.0.0", + "react-popper": "^2.2.4", + "shallowequal": "^1.1.0" + } + }, "semaphore": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", @@ -13494,8 +14716,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "set-blocking": { "version": "2.0.0", @@ -13506,25 +14727,27 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -13540,6 +14763,11 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -13606,6 +14834,14 @@ } } }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "requires": { + "whatwg-url": "^7.0.0" + } + }, "source-map-support": { "version": "0.5.19", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", @@ -13683,7 +14919,6 @@ "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, "requires": { "type-fest": "^0.7.1" }, @@ -13691,16 +14926,57 @@ "type-fest": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" } } }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "stream-http": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", + "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "stream-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", + "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", + "requires": { + "debug": "2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } }, "strict-uri-encode": { "version": "1.1.0", @@ -13708,6 +14984,11 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -13723,7 +15004,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -13733,7 +15013,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -13743,7 +15022,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -13781,11 +15059,42 @@ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, + "styled-jsx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-3.3.2.tgz", + "integrity": "sha512-daAkGd5mqhbBhLd6jYAjYBa9LpxYCzsgo/f6qzPdFxVB8yoGbhxvzQgkC0pfmCVvW3JuAEBn0UzFLBfkHVZG1g==", + "requires": { + "@babel/types": "7.8.3", + "babel-plugin-syntax-jsx": "6.18.0", + "convert-source-map": "1.7.0", + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "string-hash": "1.1.3", + "stylis": "3.5.4", + "stylis-rule-sheet": "0.0.10" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "stylis": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", + "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" + }, + "stylis-rule-sheet": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", + "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -13823,6 +15132,14 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13832,11 +15149,20 @@ "os-tmpdir": "~1.0.2" } }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -13844,8 +15170,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "tough-cookie": { "version": "2.5.0", @@ -13865,6 +15190,14 @@ } } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, "true-case-path": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz", @@ -13916,6 +15249,11 @@ } } }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -13928,6 +15266,11 @@ "integrity": "sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y=", "dev": true }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -14006,7 +15349,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz", "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has-bigints": "^1.0.0", @@ -14029,8 +15371,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "uri-js": { "version": "4.4.1", @@ -14045,7 +15386,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -14054,8 +15394,7 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, @@ -14065,17 +15404,37 @@ "integrity": "sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk=", "dev": true }, + "use-subscription": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.5.1.tgz", + "integrity": "sha512-Xv2a1P/yReAjAbhylMfFplFKj9GssgTwN7RlcTxBujFQcloStWNDQdc4g4NRWH9xS4i/FDk04vQBptAXoF3VcA==", + "requires": { + "object-assign": "^4.1.1" + } + }, "utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", "dev": true }, + "util": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.1.1", @@ -14117,6 +15476,28 @@ "extsprintf": "^1.2.0" } }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "web3-utils": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.3.4.tgz", @@ -14133,6 +15514,21 @@ "utf8": "3.0.0" } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -14146,7 +15542,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -14161,6 +15556,20 @@ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -14237,8 +15646,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "3.2.2", @@ -14463,6 +15871,11 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index 1dd826d..7d25354 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,13 @@ "description": "", "main": "index.js", "scripts": { - "build": "npm run clean && npm run compile", "clean": "npx hardhat clean", "compile": "npx hardhat compile", "test": "npx hardhat test", - "coverage": "npm run build && npx hardhat coverage --temp artifacts --network coverage" + "coverage": "npm run build && npx hardhat coverage --temp artifacts --network coverage", + "dev": "next dev", + "build": "next build", + "start": "next start" }, "repository": { "type": "git", @@ -27,11 +29,12 @@ "@typechain/ethers-v5": "^6.0.2", "@typechain/hardhat": "^1.0.0", "@types/chai": "^4.2.15", + "@types/chai-as-promised": "^7.1.3", "@types/mocha": "^8.2.1", "@types/node": "^14.14.32", + "@types/react": "^17.0.3", "chai": "^4.3.3", "chai-as-promised": "^7.1.1", - "@types/chai-as-promised": "^7.1.3", "dotenv": "^8.2.0", "ethereum-waffle": "^3.3.0", "ethers": "^5.0.31", @@ -41,5 +44,12 @@ "ts-node": "^9.1.1", "typechain": "^4.0.3", "typescript": "^4.2.3" + }, + "dependencies": { + "next": "^10.1.3", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "semantic-ui-css": "^2.4.1", + "semantic-ui-react": "^2.0.3" } } diff --git a/scripts/deploy.ts b/scripts/deploy.ts index 9fba825..6376824 100644 --- a/scripts/deploy.ts +++ b/scripts/deploy.ts @@ -1,7 +1,7 @@ import { ethers } from "hardhat"; async function main() { - const factory = await ethers.getContractFactory("Counter"); + const factory = await ethers.getContractFactory("Faucet"); // If we had constructor arguments, they would be passed into deploy() let contract = await factory.deploy(); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx new file mode 100644 index 0000000..050cdce --- /dev/null +++ b/src/pages/_app.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import type { AppProps } from 'next/app'; +import Head from 'next/head'; +import 'semantic-ui-css/semantic.min.css' + +function MyApp({ Component, pageProps }: AppProps): React.ReactNode { + return ( + <> + <Head> + <title>Ropsten Faucet + + + + ); +} + +export default MyApp; diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..effda51 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,93 @@ +import { FormEvent, useEffect, useState } from 'react'; +import { Button, Container, Form, Input } from 'semantic-ui-react'; +import { verifyEthAddress } from '../util'; +import Faucet from '../artifacts/contracts/Faucet.sol/Faucet.json'; +import { ethers } from 'ethers'; + +declare const window: any; + +type Props = { + contractAddress: string; +}; + +function Home({ contractAddress }: Props): React.ReactNode { + const [value, setValue] = useState(''); + const [touched, setTouched] = useState(false); + const [isValid, setIsValid] = useState(false); + const [contractBalance, setContractBalance] = useState(); + + useEffect(() => { + if (value) { + setTouched(true); + } + + setIsValid(verifyEthAddress(value)); + }, [value]); + + const onSubmit = async (e: FormEvent) => { + e.preventDefault(); + await requestFunds(); + }; + + const getContractBalance = async () => { + if (typeof window.ethereum !== 'undefined') { + const provider = new ethers.providers.Web3Provider(window.ethereum); + const contractBalance = await provider.getBalance(contractAddress); + return contractBalance.toString(); + } + }; + + const requestFunds = async () => { + if (typeof window.ethereum !== 'undefined') { + await window.ethereum.request({ + method: 'eth_requestAccounts', + }); + const provider = new ethers.providers.Web3Provider(window.ethereum); + const signer = provider.getSigner(); + const contract = new ethers.Contract(contractAddress, Faucet.abi, signer); + try { + await contract.withdraw(value); + console.log('Successfully withdrawed funds'); + } catch (err) { + console.log('Error: ', err); + } + } + }; + + useEffect(() => { + if (window.ethereum !== undefined) { + getContractBalance().then((bal) => setContractBalance(bal)); + } + }, []); + + return ( + +
+

Ropsten Faucet

+ + + setValue(e.target.value)} + /> + + +
+ + Contract balance - {parseInt(contractBalance || '') / Math.pow(10, 18)}{' '} + ether + +
+ ); +} + +export async function getStaticProps() { + return { + props: { + contractAddress: process.env.NEXT_PUBLIC_CONTRACT_ADDRESS, + }, + }; +} + +export default Home; diff --git a/src/util/index.ts b/src/util/index.ts new file mode 100644 index 0000000..b592375 --- /dev/null +++ b/src/util/index.ts @@ -0,0 +1,4 @@ +export const verifyEthAddress = (address: string): boolean => { + const regex = /^0x[a-fA-F0-9]{40}$/; + return regex.test(address); +}; diff --git a/tsconfig.json b/tsconfig.json index 86b78bf..fb7f547 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,8 +5,17 @@ "strict": true, "esModuleInterop": true, "outDir": "dist", - "resolveJsonModule": true + "resolveJsonModule": true, + "jsx": "preserve", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "moduleResolution": "node", + "isolatedModules": true }, - "include": ["./scripts", "./test"], - "files": ["./hardhat.config.ts"] + "include": ["./scripts", "./test", "./src"], + "files": ["./hardhat.config.ts"], + "exclude": ["node_modules"] }